[Pkg-virtualbox-commits] [virtualbox] 01/01: Imported Upstream version 4.3.14-dfsg

Gianfranco Costamagna locutusofborg-guest at moszumanska.debian.org
Fri Jul 18 16:03:41 UTC 2014


This is an automated email from the git hooks/post-receive script.

locutusofborg-guest pushed a commit to annotated tag upstream/4.3.14-dfsg
in repository virtualbox.

commit 3eb8d91ea4b084bee126b91d0e3ac792a8bc8a8a
Author: Gianfranco Costamagna <costamagnagianfranco at yahoo.it>
Date:   Fri Jul 18 10:04:59 2014 +0200

    Imported Upstream version 4.3.14-dfsg
---
 Config.kmk                                         |   544 +-
 Makefile.kmk                                       |    55 +-
 configure                                          |     4 +-
 doc/manual/Makefile.kmk                            |     8 +-
 doc/manual/en_US/SDKRef.xml                        |    10 +
 doc/manual/en_US/user_Frontends.xml                |     7 +-
 doc/manual/en_US/user_Installation.xml             |     2 +-
 doc/manual/en_US/user_VBoxManage.xml               |    15 +
 doc/manual/user_ChangeLogImpl.xml                  |   187 +-
 include/Makefile.kmk                               |     1 +
 include/VBox/HGSMI/HGSMI.h                         |     5 +
 include/VBox/HostServices/VBoxCrOpenGLSvc.h        |     7 +-
 include/VBox/VBoxGuest.h                           |    22 +
 include/VBox/VBoxVideo.h                           |   199 +-
 include/VBox/VBoxVideoHost3D.h                     |    48 +-
 include/VBox/err.h                                 |   202 +-
 include/VBox/err.mac                               |    84 +-
 include/VBox/log.h                                 |    12 +-
 include/VBox/sup.h                                 |    81 +
 .../VBox/{vd-cache-plugin.h => vd-cache-backend.h} |    19 +-
 include/VBox/vd-cache-plugin.h                     |   337 -
 include/VBox/vd-filter-backend.h                   |   107 +
 include/VBox/vd-ifs-internal.h                     |    59 +
 include/VBox/vd-ifs.h                              |   154 +-
 include/VBox/{vd-plugin.h => vd-image-backend.h}   |    46 +-
 include/VBox/vd-plugin.h                           |   588 +-
 include/VBox/vd.h                                  |    44 +
 include/VBox/vmm/pdmifs.h                          |    64 +-
 include/VBox/vmm/pdmusb.h                          |     7 +
 include/VBox/vmm/vm.h                              |     6 +-
 include/VBox/vrdpusb.h                             |     1 +
 include/VBox/vusb.h                                |    12 +-
 include/iprt/asm-math.h                            |    81 +-
 include/iprt/asm.h                                 |   119 +
 .../iprt/asn1-generator-asn1-decoder.h             |    32 +-
 .../iprt/asn1-generator-core.h                     |    40 +-
 .../iprt/asn1-generator-init.h                     |    37 +-
 .../iprt/asn1-generator-internal-header.h          |    31 +-
 include/iprt/asn1-generator-pass.h                 |  1383 +
 .../iprt/asn1-generator-sanity.h                   |    31 +-
 include/iprt/asn1.h                                |  2044 +
 include/iprt/base64.h                              |    50 +-
 include/iprt/bignum.h                              |   155 +
 include/iprt/cdefs.h                               |    19 +-
 include/iprt/critsect.h                            |    16 +-
 .../ldr => include/iprt/crypto}/Makefile.kup       |     0
 include/iprt/crypto/digest.h                       |   189 +
 include/iprt/crypto/pem.h                          |   133 +
 include/iprt/crypto/pkcs7.h                        |   349 +
 include/iprt/crypto/pkix.h                         |   391 +
 include/iprt/crypto/rsa.h                          |   148 +
 include/iprt/crypto/spc.h                          |   490 +
 include/iprt/crypto/store.h                        |   132 +
 include/iprt/crypto/taf.h                          |   189 +
 include/iprt/crypto/x509.h                         |  1056 +
 include/iprt/dbg.h                                 |    12 +-
 include/iprt/err.h                                 |   537 +-
 include/iprt/err.mac                               |   209 +
 include/iprt/formats/asn1.h                        |    94 +
 include/iprt/http.h                                |    24 +-
 include/iprt/ldr.h                                 |   247 +-
 include/iprt/log.h                                 |    10 +
 include/iprt/mangling.h                            |   944 +
 include/iprt/manifest.h                            |    22 -
 include/iprt/{md5.h => md2.h}                      |    88 +-
 include/iprt/md5.h                                 |    19 +-
 include/iprt/mem.h                                 |    85 +
 include/iprt/memsafer.h                            |   226 +
 .../common/ldr => include/iprt/nt}/Makefile.kup    |     0
 .../iprt/nt/nt-and-windows.h                       |    37 +-
 include/iprt/nt/nt.h                               |   906 +
 include/iprt/process.h                             |     9 +
 include/iprt/sha.h                                 |   160 +-
 include/iprt/stream.h                              |     9 +
 include/iprt/string.h                              |   217 +-
 include/iprt/time.h                                |    17 +
 include/iprt/types.h                               |   380 +-
 include/iprt/uni.h                                 |    53 +
 .../testcase/SUPInstall.cpp => include/iprt/zero.h |    56 +-
 include/iprt/zip.h                                 |    58 +
 .../common/VBoxService/VBoxServiceAutoMount.cpp    |     3 +-
 src/VBox/Additions/common/crOpenGL/context.c       |    14 +-
 src/VBox/Additions/common/crOpenGL/icd_drv.c       |     6 +-
 src/VBox/Additions/common/crOpenGL/load.c          |   117 +-
 src/VBox/Additions/common/crOpenGL/pack/packspu.h  |    44 +-
 .../common/crOpenGL/pack/packspu_client.c          |   320 +-
 .../common/crOpenGL/pack/packspu_context.c         |    65 +-
 .../Additions/common/crOpenGL/pack/packspu_get.py  |    34 +
 .../Additions/common/crOpenGL/pack/packspu_init.c  |     4 -
 .../Additions/common/crOpenGL/pack/packspu_misc.c  |    74 +-
 .../Additions/common/crOpenGL/pack/packspu_net.c   |     5 +
 .../Additions/common/crOpenGL/pack/packspu_special |     1 +
 src/VBox/Additions/common/crOpenGL/stub.h          |     1 +
 src/VBox/Additions/common/crOpenGL/wgl.c           |    47 +-
 src/VBox/Additions/linux/drm/vboxvideo_drm.c       |    15 +-
 src/VBox/Additions/linux/sharedfolders/regops.c    |     5 +
 .../Additions/solaris/SharedFolders/vboxfs_prov.c  |   111 +-
 .../Additions/solaris/SharedFolders/vboxfs_prov.h  |    16 +-
 .../Additions/solaris/SharedFolders/vboxfs_vfs.c   |    55 +-
 .../Additions/solaris/SharedFolders/vboxfs_vfs.h   |     6 -
 .../Additions/solaris/SharedFolders/vboxfs_vnode.c |    45 +-
 src/VBox/Additions/x11/vboxvideo/undefined         |     3 +
 src/VBox/Additions/x11/vboxvideo/vboxvideo.c       |    51 +-
 src/VBox/Additions/x11/vboxvideo/vboxvideo.h       |     4 +-
 src/VBox/Additions/x11/vboxvideo/vboxvideo_dri2.c  |    50 +-
 src/VBox/Debugger/DBGPlugInDarwin.cpp              |   560 +
 src/VBox/Debugger/DBGPlugInDiggers.cpp             |     1 +
 src/VBox/Debugger/DBGPlugIns.h                     |     5 +-
 src/VBox/Debugger/Makefile.kmk                     |     1 +
 src/VBox/Devices/Audio/DevIchHda.cpp               |     2 +-
 .../BiosCommonCode/MakeAlternativeSource.cpp       |    12 +-
 src/VBox/Devices/Bus/DevPciIch9.cpp                |    49 +-
 .../BaseTools/Source/Python/UPT/Dll/sqlite3.dll    |   Bin 260096 -> 0 bytes
 src/VBox/Devices/EFI/Firmware/Config.kmk           |    14 +-
 .../Firmware/FatBinPkg/EnhancedFatDxe/Ebc/Fat.efi  |   Bin 58432 -> 0 bytes
 .../Firmware/FatBinPkg/EnhancedFatDxe/Ia32/Fat.efi |   Bin 16512 -> 0 bytes
 .../Firmware/FatBinPkg/EnhancedFatDxe/Ipf/Fat.efi  |   Bin 68192 -> 0 bytes
 .../Firmware/FatBinPkg/EnhancedFatDxe/X64/Fat.efi  |   Bin 24448 -> 0 bytes
 .../EFI/Firmware/StdLib/LibC/Main/Ia32/ftol2.obj   |   Bin 2320 -> 0 bytes
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd      |   Bin 1048576 -> 1048576 bytes
 src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd      |   Bin 1048576 -> 1048576 bytes
 src/VBox/Devices/Graphics/BIOS/Makefile.kmk        |     2 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative.asm       |     6 +-
 .../Graphics/BIOS/VBoxVgaBiosAlternative.md5sum    |     2 +-
 src/VBox/Devices/Graphics/DevVGA.cpp               |   224 +-
 src/VBox/Devices/Graphics/DevVGA.h                 |    20 +-
 src/VBox/Devices/Graphics/DevVGASavedState.h       |    14 +-
 src/VBox/Devices/Graphics/DevVGA_VBVA.cpp          |   265 +-
 src/VBox/Devices/Graphics/DevVGA_VDMA.cpp          |  1853 +-
 src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp      |    26 +-
 src/VBox/Devices/Input/DrvKeyboardQueue.cpp        |    13 +-
 src/VBox/Devices/Input/UsbKbd.cpp                  |    13 +
 src/VBox/Devices/Input/UsbMouse.cpp                |    13 +
 src/VBox/Devices/Makefile.kmk                      |    15 +-
 src/VBox/Devices/Network/slirp/slirp.c             |    13 +
 src/VBox/Devices/Network/slirp/tcp_input.c         |     2 +-
 src/VBox/Devices/Network/slirp/tcp_output.c        |    10 +-
 src/VBox/Devices/Network/testcase/tstIntNet-1.cpp  |    18 +-
 src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm   |  3253 +-
 .../Devices/PC/BIOS/VBoxBiosAlternative.md5sum     |     2 +-
 src/VBox/Devices/PC/BIOS/ahci.c                    |     8 +
 src/VBox/Devices/PC/BIOS/keyboard.c                |     6 +-
 src/VBox/Devices/PC/ipxe/Makefile.kmk              |     2 +-
 src/VBox/Devices/Storage/ATAPIPassthrough.cpp      |     6 +
 src/VBox/Devices/Storage/DevAHCI.cpp               |   265 +-
 src/VBox/Devices/Storage/DevATA.cpp                |    10 +-
 src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp       |     1 -
 src/VBox/Devices/Storage/DrvHostBase.cpp           |    16 +-
 src/VBox/Devices/Storage/DrvSCSI.cpp               |     3 +-
 src/VBox/Devices/Storage/DrvVD.cpp                 |   256 +
 src/VBox/Devices/Storage/UsbMsd.cpp                |    14 +
 src/VBox/Devices/USB/DevOHCI.cpp                   |   324 +-
 src/VBox/Devices/USB/DrvVUSBRootHub.cpp            |    34 +-
 src/VBox/Devices/USB/USBProxyDevice-stub.cpp       |     1 +
 src/VBox/Devices/USB/USBProxyDevice.cpp            |    54 +-
 src/VBox/Devices/USB/USBProxyDevice.h              |   142 +-
 src/VBox/Devices/USB/VUSBDevice.cpp                |   114 +
 src/VBox/Devices/USB/VUSBInternal.h                |    25 +-
 src/VBox/Devices/USB/VUSBUrb.cpp                   |    57 +-
 .../Devices/USB/darwin/USBProxyDevice-darwin.cpp   |   253 +-
 .../Devices/USB/freebsd/USBProxyDevice-freebsd.cpp |   149 +-
 .../Devices/USB/linux/USBProxyDevice-linux.cpp     |   255 +-
 .../Devices/USB/solaris/USBProxyDevice-solaris.cpp |   195 +-
 src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp  |    94 +-
 src/VBox/Devices/USB/win/USBProxyDevice-win.cpp    |   428 +-
 src/VBox/Devices/VMMDev/VMMDev.cpp                 |     2 +
 src/VBox/Devices/testcase/tstDeviceStructSize.cpp  |     1 +
 .../Devices/testcase/tstDeviceStructSizeRC.cpp     |    16 +
 src/VBox/Disassembler/Makefile.kmk                 |     2 +-
 src/VBox/Frontends/VBoxHeadless/Makefile.kmk       |    12 +-
 src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp   |   102 +-
 src/VBox/Frontends/VBoxHeadless/VBoxHeadless.h     |    20 +-
 src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp   |     1 +
 src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp   |     5 +-
 src/VBox/Frontends/VBoxSDL/Makefile.kmk            |     1 +
 src/VBox/Frontends/VirtualBox/Makefile.kmk         |     7 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts |   640 +-
 .../Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts   |   649 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts |   670 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts |    14 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts |    16 +
 .../Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts   |   652 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts |    20 +-
 .../Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts   |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts |  1384 +-
 .../Frontends/VirtualBox/nls/VirtualBox_km_KH.ts   |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts |    16 +
 .../Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts   |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts |    16 +
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts |    20 +-
 src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts |    16 +
 .../Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts   |    16 +
 .../Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts   |    16 +
 .../Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts   |    16 +
 src/VBox/Frontends/VirtualBox/nls/qt_ca.ts         |     2 +-
 src/VBox/Frontends/VirtualBox/nls/qt_ca_VA.ts      |     2 +-
 src/VBox/Frontends/VirtualBox/nls/qt_fa_IR.ts      |     6 +-
 .../VirtualBox/src/globals/QIWithRetranslateUI.h   |    12 +-
 .../VirtualBox/src/globals/UIActionPool.cpp        |     7 +-
 .../VirtualBox/src/globals/UIActionPool.h          |    16 +-
 .../VirtualBox/src/globals/UIShortcutPool.cpp      |    31 +-
 .../VirtualBox/src/globals/UIShortcutPool.h        |    11 +-
 src/VBox/Frontends/VirtualBox/src/main.cpp         |    11 +-
 .../VirtualBox/src/net/UINetworkReply.cpp          |   154 +-
 .../VirtualBox/src/platform/win/VirtualBox.rc      |    16 +-
 .../win/{VirtualBox.rc => VirtualBoxHardened.rc}   |    10 +-
 .../VirtualBox/src/runtime/UIActionPoolRuntime.cpp |    11 +
 .../VirtualBox/src/runtime/UIActionPoolRuntime.h   |     3 +
 .../VirtualBox/src/runtime/UIFrameBuffer.cpp       |    67 +-
 .../VirtualBox/src/runtime/UIFrameBufferQImage.cpp |    43 +-
 .../VirtualBox/src/runtime/UIKeyboardHandler.cpp   |    98 +-
 .../src/runtime/normal/UIMachineWindowNormal.cpp   |    66 +-
 .../src/selector/UIActionPoolSelector.cpp          |    11 +
 .../VirtualBox/src/selector/UIActionPoolSelector.h |     3 +
 .../src/settings/global/UIGlobalSettingsInput.cpp  |    68 +-
 .../VirtualBox/src/widgets/UIHostComboEditor.cpp   |    14 +-
 .../VirtualBox/src/widgets/UIHostComboEditor.h     |    15 +
 .../VirtualBox/src/widgets/UIHotKeyEditor.cpp      |     6 +
 .../VirtualBox/src/widgets/UIHotKeyEditor.h        |     5 +
 .../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp  |     4 +-
 src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt |    14 +
 src/VBox/GuestHost/OpenGL/include/chromium.h       |     8 +
 src/VBox/GuestHost/OpenGL/include/cr_blitter.h     |    27 +-
 src/VBox/GuestHost/OpenGL/include/cr_glstate.h     |     4 +-
 src/VBox/GuestHost/OpenGL/include/cr_pack.h        |   134 +-
 src/VBox/GuestHost/OpenGL/include/cr_protocol.h    |    11 +
 src/VBox/GuestHost/OpenGL/include/cr_server.h      |    13 +-
 src/VBox/GuestHost/OpenGL/include/cr_string.h      |     2 +
 src/VBox/GuestHost/OpenGL/include/cr_unpack.h      |    10 +
 src/VBox/GuestHost/OpenGL/include/cr_version.h     |     6 +-
 src/VBox/GuestHost/OpenGL/include/cr_vreg.h        |     3 +
 .../GuestHost/OpenGL/include/state/cr_current.h    |     4 +
 src/VBox/GuestHost/OpenGL/packer/opcodes.py        |     9 +-
 src/VBox/GuestHost/OpenGL/packer/pack_beginend.c   |    29 +-
 src/VBox/GuestHost/OpenGL/packer/pack_client.c     |    36 +-
 .../GuestHost/OpenGL/packer/pack_currentheader.py  |     2 +-
 .../GuestHost/OpenGL/packer/pack_currenttypes.py   |    10 +
 src/VBox/GuestHost/OpenGL/packer/pack_init.c       |     8 +-
 src/VBox/GuestHost/OpenGL/packer/pack_lists.c      |     6 +-
 src/VBox/GuestHost/OpenGL/packer/pack_misc.c       |    27 +
 src/VBox/GuestHost/OpenGL/packer/pack_program.c    |    22 +-
 src/VBox/GuestHost/OpenGL/packer/pack_swap_lists.c |     4 +-
 src/VBox/GuestHost/OpenGL/packer/packer.py         |     3 +-
 src/VBox/GuestHost/OpenGL/packer/packer_special    |     2 +
 .../GuestHost/OpenGL/state_tracker/state_client.c  |    50 +-
 .../GuestHost/OpenGL/state_tracker/state_current.c |    16 +-
 .../OpenGL/state_tracker/state_current.py          |   192 +
 .../GuestHost/OpenGL/state_tracker/state_init.c    |    54 +-
 src/VBox/GuestHost/OpenGL/util/blitter.cpp         |   233 +-
 src/VBox/GuestHost/OpenGL/util/string.c            |    56 +
 src/VBox/GuestHost/OpenGL/util/vboxhgcm.c          |    10 +-
 src/VBox/HostDrivers/Support/Makefile.kmk          |   298 +-
 src/VBox/HostDrivers/Support/SUPDrv.c              |   478 +-
 src/VBox/HostDrivers/Support/SUPDrvIOC.h           |     6 +-
 src/VBox/HostDrivers/Support/SUPDrvInternal.h      |    92 +-
 src/VBox/HostDrivers/Support/SUPLib.cpp            |    26 +-
 src/VBox/HostDrivers/Support/SUPLibInternal.h      |    79 +-
 src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp |   719 +-
 .../Support/SUPR3HardenedMainTemplate.cpp          |    25 +
 .../HostDrivers/Support/SUPR3HardenedNoCrt.cpp     |   205 +
 .../HostDrivers/Support/SUPR3HardenedVerify.cpp    |   309 +-
 .../HostDrivers/Support/darwin/SUPDrv-darwin.cpp   |    19 +
 .../HostDrivers/Support/freebsd/SUPDrv-freebsd.c   |    19 +
 src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c  |    21 +-
 src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp    |    19 +
 .../HostDrivers/Support/solaris/SUPDrv-solaris.c   |    19 +
 src/VBox/HostDrivers/Support/testcase/Makefile.kmk |     4 +-
 .../HostDrivers/Support/testcase/SUPInstall.cpp    |     9 +-
 .../Support/testcase/tstNtQueryStuff.cpp           |    80 +-
 .../Support/win/Certificates}/Makefile.kup         |     0
 ...cationRoot-729404101f3e0ca347837fca175a8438.taf |   Bin 0 -> 708 bytes
 ...oot-MicrosoftAuthenticodeTmRootAuthority-01.taf |   Bin 0 -> 400 bytes
 ...hority2005-6eff330eb6e7569740680870104baaba.taf |   Bin 0 -> 629 bytes
 ...ootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf |   Bin 0 -> 432 bytes
 ...eAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf |   Bin 0 -> 675 bytes
 ...hority2010-28cc3a25bfba44ac449a9b586b4339aa.taf |   Bin 0 -> 718 bytes
 ...hority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf |   Bin 0 -> 718 bytes
 .../Timestamp-CopyrightC1997MicrosoftCorp-01.taf   |   Bin 0 -> 332 bytes
 ...VirtualBox-51ca009816fdbd80f120e015ee75823e.cer |   Bin 0 -> 1419 bytes
 ...VirtualBox-51ca009816fdbd80f120e015ee75823e.taf |   Bin 0 -> 508 bytes
 ...NtCreateSection-template-amd64-syscall-type-1.h |    78 +
 .../NtCreateSection-template-x86-syscall-type-1.h  |   286 +
 src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp    |  2904 +-
 src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm   |    79 +-
 .../Support/win/SUPHardenedVerify-win.h            |   152 +
 .../Support/win/SUPHardenedVerifyImage-win.cpp     |  1982 +
 .../Support/win/SUPHardenedVerifyProcess-win.cpp   |  1343 +
 src/VBox/HostDrivers/Support/win/SUPLib-win.cpp    |   432 +-
 .../Support/win/SUPR3HardenedMain-win.cpp          |  1775 +
 ...{SUPDrvA-win.asm => SUPR3HardenedMainA-win.asm} |    56 +-
 .../Support/win/SUPR3HardenedNoCrt-win.cpp         |   191 +
 .../HostDrivers/Support/win/VBoxSupLib-win.cpp     |    96 +
 .../HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp  |   289 +-
 .../HostDrivers/VBoxNetFlt/win/drv/VBoxNetAdp.inf  |     3 +-
 .../VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp   |     2 +-
 src/VBox/HostServices/SharedFolders/service.cpp    |     7 +-
 src/VBox/HostServices/SharedOpenGL/Makefile.kmk    |     1 +
 .../SharedOpenGL/crserver/crservice.cpp            |    93 +-
 .../HostServices/SharedOpenGL/crserverlib/server.h |    32 +-
 .../SharedOpenGL/crserverlib/server_config.c       |    68 +-
 .../SharedOpenGL/crserverlib/server_lists.c        |     1 -
 .../SharedOpenGL/crserverlib/server_main.c         |   796 +-
 .../SharedOpenGL/crserverlib/server_misc.c         |    62 +-
 .../SharedOpenGL/crserverlib/server_muralfbo.cpp   |    57 +-
 .../SharedOpenGL/crserverlib/server_presenter.cpp  |  2713 +-
 .../SharedOpenGL/crserverlib/server_stream.c       |   227 +-
 .../SharedOpenGL/crserverlib/server_window.c       |     2 +-
 .../HostServices/SharedOpenGL/render/renderspu.c   |    97 +-
 .../HostServices/SharedOpenGL/render/renderspu.h   |    16 +-
 .../SharedOpenGL/render/renderspu_agl.c            |     7 +-
 .../SharedOpenGL/render/renderspu_cocoa.c          |    13 +-
 .../SharedOpenGL/render/renderspu_cocoa_helper.h   |     1 +
 .../SharedOpenGL/render/renderspu_cocoa_helper.m   |    74 +-
 .../SharedOpenGL/render/renderspu_glx.c            |    23 +-
 .../SharedOpenGL/render/renderspu_init.c           |   153 +-
 .../SharedOpenGL/render/renderspu_wgl.c            |     9 +-
 .../HostServices/SharedOpenGL/unpacker/unpack.py   |    40 +-
 .../SharedOpenGL/unpacker/unpack_shaders.c         |     3 +-
 src/VBox/Installer/linux/rpm/LocalConfig.kmk       |     1 +
 .../win/InstallHelper/VBoxInstallHelper.cpp        |     3 -
 src/VBox/Installer/win/Makefile.kmk                |     7 +-
 src/VBox/Installer/win/StubBld/Makefile.kmk        |     2 +-
 src/VBox/Installer/win/VBoxMergeApp.wxi            |    27 +
 src/VBox/Installer/win/VBoxMergeNetAdpSeq.wxi      |    16 +-
 src/VBox/Installer/win/VirtualBox.wxs              |     3 +-
 src/VBox/Main/idl/VirtualBox.xidl                  |    24 +-
 src/VBox/Main/idl/apiwrap-server.xsl               |    18 +-
 src/VBox/Main/include/ConsoleImpl.h                |    24 +
 src/VBox/Main/include/DisplayImpl.h                |    31 +-
 src/VBox/Main/src-all/ExtPackManagerImpl.cpp       |     7 +
 src/VBox/Main/src-all/Global.cpp                   |     4 +-
 src/VBox/Main/src-client/ConsoleImpl.cpp           |   311 +
 src/VBox/Main/src-client/ConsoleImpl2.cpp          |    20 +
 src/VBox/Main/src-client/DisplayImpl.cpp           |   467 +-
 src/VBox/Main/src-client/GuestImpl.cpp             |    41 +-
 src/VBox/Main/src-client/RemoteUSBBackend.cpp      |    14 +-
 .../Main/src-helper-apps/VBoxExtPackHelperApp.cpp  |    14 +-
 src/VBox/Main/src-server/MachineImpl.cpp           |    13 +
 src/VBox/Main/src-server/MediumImpl.cpp            |     6 +-
 src/VBox/Main/src-server/darwin/iokit.cpp          |    16 +-
 src/VBox/Main/testcase/tstCollector.cpp            |     4 +-
 src/VBox/Main/webservice/Makefile.kmk              |     2 +-
 src/VBox/Main/webservice/jaxlibs/FastInfoset.jar   |   Bin 291779 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/activation.jar    |   Bin 62983 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/http.jar          |   Bin 81798 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxb-api.jar      |   Bin 89967 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxb-impl.jar     |   Bin 854901 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxb-xjc.jar      |   Bin 3126580 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxws-api.jar     |   Bin 36070 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxws-rt.jar      |   Bin 1284131 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jaxws-tools.jar   |   Bin 510892 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jsr173_api.jar    |   Bin 23346 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jsr181-api.jar    |   Bin 7989 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/jsr250-api.jar    |   Bin 6165 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/mimepull.jar      |   Bin 38679 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/resolver.jar      |   Bin 68177 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/saaj-api.jar      |   Bin 18770 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/saaj-impl.jar     |   Bin 277757 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/sjsxp.jar         |   Bin 334496 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/stax-ex.jar       |   Bin 11001 -> 0 bytes
 src/VBox/Main/webservice/jaxlibs/streambuffer.jar  |   Bin 57960 -> 0 bytes
 src/VBox/Makefile.kmk                              |     1 +
 src/VBox/NetworkServices/DHCP/Makefile.kmk         |    11 +
 src/VBox/NetworkServices/NAT/Makefile.kmk          |    41 +-
 src/VBox/NetworkServices/NAT/fwtcp.c               |    29 +-
 src/VBox/NetworkServices/NAT/fwudp.c               |     5 +-
 src/VBox/NetworkServices/NAT/lwipopts.h            |     2 +-
 src/VBox/NetworkServices/NAT/portfwd.c             |     2 +
 src/VBox/NetworkServices/NAT/proxy.c               |   187 +-
 src/VBox/NetworkServices/NAT/proxy.h               |    19 +-
 src/VBox/NetworkServices/NAT/proxy_dhcp6ds.c       |     2 +
 src/VBox/NetworkServices/NAT/proxy_pollmgr.c       |    21 +-
 src/VBox/NetworkServices/NAT/proxy_rtadvd.c        |     8 +-
 src/VBox/NetworkServices/NAT/proxy_tftpd.c         |     4 +-
 src/VBox/NetworkServices/NAT/pxdns.c               |    12 +-
 src/VBox/NetworkServices/NAT/pxping.c              |   214 +-
 src/VBox/NetworkServices/NAT/pxping_win.c          |     5 +-
 src/VBox/NetworkServices/NAT/pxremap.c             |     2 +
 src/VBox/NetworkServices/NAT/pxtcp.c               |   399 +-
 src/VBox/NetworkServices/NAT/pxudp.c               |     9 +-
 src/VBox/NetworkServices/NAT/rtmon_bsd.c           |     2 +
 src/VBox/NetworkServices/NAT/rtmon_linux.c         |     2 +
 src/VBox/NetworkServices/NAT/winutils.h            |   152 +-
 src/VBox/RDP/client/Makefile.in                    |     2 +-
 src/VBox/RDP/client/Makefile.kmk                   |    17 +-
 src/VBox/RDP/client/vrdp/rdpusb.c                  |    35 +-
 src/VBox/Runtime/Makefile.kmk                      |   345 +-
 src/VBox/Runtime/VBox/VBoxRTImp.def                |     3 +
 src/VBox/Runtime/VBox/log-vbox.cpp                 |     1 -
 src/VBox/Runtime/common/asm/asm-fake.cpp           |     6 +
 src/VBox/Runtime/common/{ldr => asn1}/Makefile.kup |     0
 src/VBox/Runtime/common/asn1/asn1-basics.cpp       |   592 +
 src/VBox/Runtime/common/asn1/asn1-cursor.cpp       |   505 +
 .../Runtime/common/asn1/asn1-default-allocator.cpp |   105 +
 src/VBox/Runtime/common/asn1/asn1-dump.cpp         |   826 +
 src/VBox/Runtime/common/asn1/asn1-encode.cpp       |   426 +
 .../common/asn1/asn1-ut-bitstring-decode.cpp       |   130 +
 .../common/asn1/asn1-ut-bitstring-template.h}      |    43 +-
 src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp |   516 +
 .../Runtime/common/asn1/asn1-ut-boolean-decode.cpp |    81 +
 .../common/asn1/asn1-ut-boolean-template.h}        |    43 +-
 src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp   |   203 +
 .../common/asn1/asn1-ut-core-decode.cpp}           |    40 +-
 .../common/asn1/asn1-ut-core-template.h}           |    43 +-
 src/VBox/Runtime/common/asn1/asn1-ut-core.cpp      |   278 +
 .../Runtime/common/asn1/asn1-ut-dyntype-decode.cpp |   228 +
 src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp   |   169 +
 .../Runtime/common/asn1/asn1-ut-integer-decode.cpp |    79 +
 .../common/asn1/asn1-ut-integer-template.h}        |    43 +-
 src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp   |   451 +
 .../asn1-ut-null-decode.cpp}                       |    47 +-
 src/VBox/Runtime/common/asn1/asn1-ut-null.cpp      |   127 +
 .../Runtime/common/asn1/asn1-ut-objid-decode.cpp   |   362 +
 .../common/asn1/asn1-ut-objid-template.h}          |    43 +-
 src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp     |   537 +
 .../common/asn1/asn1-ut-octetstring-decode.cpp     |    78 +
 .../common/asn1/asn1-ut-octetstring-template.h}    |    43 +-
 .../Runtime/common/asn1/asn1-ut-octetstring.cpp    |   426 +
 .../Runtime/common/asn1/asn1-ut-string-decode.cpp  |   187 +
 .../common/asn1/asn1-ut-string-template.h}         |    43 +-
 .../Runtime/common/asn1/asn1-ut-string-template2.h |    39 +
 src/VBox/Runtime/common/asn1/asn1-ut-string.cpp    |  1824 +
 .../Runtime/common/asn1/asn1-ut-time-decode.cpp    |   389 +
 .../common/asn1/asn1-ut-time-template.h}           |    42 +-
 .../common/asn1/asn1-ut-time-template2.h}          |    32 +-
 src/VBox/Runtime/common/asn1/asn1-ut-time.cpp      |   270 +
 src/VBox/Runtime/common/checksum/RTSha1Digest.cpp  |    56 +-
 .../Runtime/common/checksum/RTSha256Digest.cpp     |    56 +-
 src/VBox/Runtime/common/checksum/alt-md2.cpp       |   272 +
 .../common/checksum/{md5.cpp => alt-md5.cpp}       |    70 +-
 src/VBox/Runtime/common/checksum/alt-sha1.cpp      |   501 +
 src/VBox/Runtime/common/checksum/alt-sha256.cpp    |   653 +
 src/VBox/Runtime/common/checksum/alt-sha512.cpp    |   735 +
 .../common/checksum/md2str.cpp}                    |    37 +-
 .../common/checksum/{sha1.cpp => openssl-md2.cpp}  |    56 +-
 .../common/checksum/{sha1.cpp => openssl-md5.cpp}  |    44 +-
 .../common/checksum/{sha1.cpp => openssl-sha1.cpp} |     2 +-
 .../checksum/{sha256.cpp => openssl-sha256.cpp}    |    38 +-
 .../checksum/{sha512.cpp => openssl-sha512.cpp}    |    40 +-
 .../common/checksum/sha224str.cpp}                 |    37 +-
 .../common/checksum/sha384str.cpp}                 |    37 +-
 .../common/checksum/sha512t224str.cpp}             |    37 +-
 .../common/checksum/sha512t256str.cpp}             |    37 +-
 .../Runtime/common/{ldr => crypto}/Makefile.kup    |     0
 .../common/crypto/RTCrStoreCertAddFromFile.cpp     |   114 +
 src/VBox/Runtime/common/crypto/digest-builtin.cpp  |   729 +
 src/VBox/Runtime/common/crypto/digest-core.cpp     |   338 +
 src/VBox/Runtime/common/crypto/iprt-openssl.cpp    |    88 +
 src/VBox/Runtime/common/crypto/pemfile.cpp         |   418 +
 .../Runtime/common/crypto/pkcs7-asn1-decoder.cpp   |    89 +
 .../common/crypto/pkcs7-core.cpp}                  |    42 +-
 .../common/crypto/pkcs7-init.cpp}                  |    41 +-
 .../common/crypto/pkcs7-internal.h}                |    33 +-
 src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp    |   209 +
 src/VBox/Runtime/common/crypto/pkcs7-template.h    |   160 +
 src/VBox/Runtime/common/crypto/pkcs7-verify.cpp    |   552 +
 .../common/crypto/pkix-signature-builtin.cpp       |   139 +
 .../common/crypto/pkix-signature-builtin.h}        |    32 +-
 .../Runtime/common/crypto/pkix-signature-core.cpp  |   274 +
 .../Runtime/common/crypto/pkix-signature-rsa.cpp   |   407 +
 src/VBox/Runtime/common/crypto/pkix-util.cpp       |    92 +
 src/VBox/Runtime/common/crypto/pkix-verify.cpp     |   180 +
 .../common/crypto/rsa-asn1-decoder.cpp}            |    33 +-
 .../common/crypto/rsa-core.cpp}                    |    34 +-
 .../common/crypto/rsa-init.cpp}                    |    33 +-
 .../common/crypto/rsa-internal.h}                  |    41 +-
 .../common/crypto/rsa-sanity.cpp}                  |    33 +-
 src/VBox/Runtime/common/crypto/rsa-template.h      |   109 +
 .../Runtime/common/crypto/spc-asn1-decoder.cpp     |    75 +
 src/VBox/Runtime/common/crypto/spc-core.cpp        |    84 +
 .../common/crypto/spc-init.cpp}                    |    42 +-
 .../common/crypto/spc-internal.h}                  |    33 +-
 src/VBox/Runtime/common/crypto/spc-sanity.cpp      |   168 +
 src/VBox/Runtime/common/crypto/spc-template.h      |   186 +
 src/VBox/Runtime/common/crypto/store-inmem.cpp     |   360 +
 src/VBox/Runtime/common/crypto/store-internal.h    |   161 +
 src/VBox/Runtime/common/crypto/store.cpp           |   440 +
 .../common/crypto/taf-asn1-decoder.cpp}            |    34 +-
 .../common/crypto/taf-core.cpp}                    |    31 +-
 .../common/crypto/taf-init.cpp}                    |    34 +-
 .../common/crypto/taf-internal.h}                  |    33 +-
 .../common/crypto/taf-sanity.cpp}                  |    32 +-
 src/VBox/Runtime/common/crypto/taf-template.h      |    94 +
 .../Runtime/common/crypto/x509-asn1-decoder.cpp    |   217 +
 src/VBox/Runtime/common/crypto/x509-certpaths.cpp  |  2798 ++
 src/VBox/Runtime/common/crypto/x509-core.cpp       |  1533 +
 src/VBox/Runtime/common/crypto/x509-file.cpp       |   105 +
 .../x509-init.cpp}                                 |    58 +-
 .../common/crypto/x509-internal.h}                 |    33 +-
 src/VBox/Runtime/common/crypto/x509-sanity.cpp     |   149 +
 src/VBox/Runtime/common/crypto/x509-template.h     |   441 +
 src/VBox/Runtime/common/crypto/x509-verify.cpp     |    85 +
 src/VBox/Runtime/common/dbg/dbgcfg.cpp             |     4 -
 src/VBox/Runtime/common/dbg/dbgmod.cpp             |   302 +-
 src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp     |    18 +-
 src/VBox/Runtime/common/dbg/dbgmodldr.cpp          |    11 +-
 .../common/err/{errinfo.cpp => errinfo-alloc.cpp}  |    46 +-
 src/VBox/Runtime/common/err/errinfo.cpp            |    89 +-
 src/VBox/Runtime/common/err/errmsg.cpp             |    10 +-
 src/VBox/Runtime/common/ldr/Makefile.kup           |     1 +
 src/VBox/Runtime/common/ldr/ldr.cpp                |    21 +-
 src/VBox/Runtime/common/ldr/ldrELF.cpp             |     3 +-
 .../Runtime/common/ldr/ldrELFRelocatable.cpp.h     |     3 +
 src/VBox/Runtime/common/ldr/ldrEx.cpp              |   171 +-
 src/VBox/Runtime/common/ldr/ldrFile.cpp            |    29 +-
 src/VBox/Runtime/common/ldr/ldrMemory.cpp          |     4 +-
 src/VBox/Runtime/common/ldr/ldrNative.cpp          |    20 +
 src/VBox/Runtime/common/ldr/ldrPE.cpp              |  1228 +-
 src/VBox/Runtime/common/ldr/ldrkStuff.cpp          |    42 +-
 src/VBox/Runtime/common/log/log.cpp                |    16 +
 src/VBox/Runtime/common/math/bignum.cpp            |  1895 +
 src/VBox/Runtime/common/misc/http.cpp              |    85 +-
 src/VBox/Runtime/common/misc/once.cpp              |    96 +-
 src/VBox/Runtime/common/misc/sg.cpp                |     2 +
 .../common/misc/zero.asm}                          |    27 +-
 src/VBox/Runtime/common/rand/rand.cpp              |    41 +-
 .../Runtime/common/string/RTStrPrintHexBytes.cpp   |    13 +-
 .../common/string/RTUtf16Cat.cpp}                  |    30 +-
 .../common/string/RTUtf16CatAscii.cpp}             |    30 +-
 .../common/string/RTUtf16CmpAscii.cpp}             |    34 +-
 .../common/string/RTUtf16Copy.cpp}                 |    34 +-
 ...RTStrPrintHexBytes.cpp => RTUtf16CopyAscii.cpp} |    56 +-
 .../common/string/RTUtf16End.cpp}                  |    30 +-
 .../common/string/RTUtf16ICmpAscii.cpp}            |    40 +-
 .../common/string/RTUtf16NLen.cpp}                 |    31 +-
 .../common/string/RTUtf16NLenEx.cpp}               |    32 +-
 ...rPrintHexBytes.cpp => RTUtf16PrintHexBytes.cpp} |    25 +-
 src/VBox/Runtime/common/string/base64.cpp          |    95 +-
 src/VBox/Runtime/common/string/strncmp.asm         |   121 +
 src/VBox/Runtime/common/string/unidata-flags.cpp   | 47008 +++++++++++++++++++
 src/VBox/Runtime/common/string/unidata-lower.cpp   |  3902 ++
 src/VBox/Runtime/common/string/unidata-upper.cpp   |  4069 ++
 src/VBox/Runtime/common/string/unidata.cpp         | 29592 ------------
 src/VBox/Runtime/common/string/uniread.cpp         |   128 +-
 src/VBox/Runtime/common/string/utf-16-case.cpp     |   178 +
 src/VBox/Runtime/common/string/utf-16-latin-1.cpp  |   479 +
 src/VBox/Runtime/common/string/utf-16.cpp          |   578 -
 src/VBox/Runtime/common/string/utf-8-case.cpp      |    97 +-
 src/VBox/Runtime/common/string/utf-8-case2.cpp     |   118 +
 src/VBox/Runtime/common/vfs/vfschain.cpp           |     5 +-
 src/VBox/Runtime/common/zip/pkzip.cpp              |   240 +
 src/VBox/Runtime/common/zip/pkzipvfs.cpp           |  1277 +
 src/VBox/Runtime/common/zip/tarcmd.cpp             |     4 +-
 src/VBox/Runtime/common/zip/unzipcmd.cpp           |   481 +
 src/VBox/Runtime/common/zip/zip.cpp                |    29 +-
 src/VBox/Runtime/generic/critsect-generic.cpp      |    50 +-
 src/VBox/Runtime/generic/memsafer-generic.cpp      |   215 +
 src/VBox/Runtime/include/internal/dbgmod.h         |    47 +-
 .../include/internal/iprt-openssl.h}               |    44 +-
 src/VBox/Runtime/include/internal/ldr.h            |   118 +-
 src/VBox/Runtime/include/internal/ldrPE.h          |   180 +-
 src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp   |     2 +
 src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c  |    19 +-
 .../r0drv/nt/toxic-chkstk-r0drv-nt.asm}            |    24 +-
 .../r0drv/solaris/semeventmulti-r0drv-solaris.c    |     6 +-
 src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp |    93 +
 src/VBox/Runtime/r3/posix/process-posix.cpp        |    11 +
 src/VBox/Runtime/r3/posix/rtmemlocked-posix.cpp    |   160 +
 src/VBox/Runtime/r3/stream.cpp                     |    13 +
 src/VBox/Runtime/r3/win/VBoxRT-openssl-ose.def     |     3 +
 src/VBox/Runtime/r3/win/VBoxRT-openssl.def         |  1242 +-
 src/VBox/Runtime/r3/win/ntdll-mini-implib.c        |   173 -
 src/VBox/Runtime/r3/win/ntdll-mini-implib.def      |    57 +-
 src/VBox/Runtime/r3/win/rtmemlocked-win.cpp        |   110 +
 src/VBox/Runtime/testcase/72kb-random.bin          |   Bin 0 -> 73728 bytes
 src/VBox/Runtime/testcase/72kb-random.h            |  4644 ++
 src/VBox/Runtime/testcase/Makefile.kmk             |    87 +-
 src/VBox/Runtime/testcase/tstIprtMiniString.cpp    |    54 +-
 .../testcase/tstR0ThreadPreemptionDriver.cpp       |    16 +-
 src/VBox/Runtime/testcase/tstRTBigNum.cpp          |   852 +
 src/VBox/Runtime/testcase/tstRTDigest-2.cpp        |  1278 +
 src/VBox/Runtime/testcase/tstRTDigest.cpp          |   323 +-
 src/VBox/Runtime/testcase/tstRTHttp.cpp            |   367 +-
 .../Runtime/testcase/tstRTLdrVerifyPeImage.cpp     |   105 +
 .../Runtime/testcase/tstRTR0DbgKrnlInfoDriver.cpp  |    16 +-
 .../testcase/tstRTR0MemUserKernelDriver.cpp        |    16 +-
 .../Runtime/testcase/tstRTR0SemMutexDriver.cpp     |    16 +-
 src/VBox/Runtime/testcase/tstRTR0TimerDriver.cpp   |    16 +-
 src/VBox/Runtime/tools/Makefile.kmk                |    43 +-
 src/VBox/Runtime/tools/RTDbgSymCache.cpp           |  1204 +
 src/VBox/Runtime/tools/RTSignTool.cpp              |   934 +
 .../SUPInstall.cpp => Runtime/tools/RTUnzip.cpp}   |    26 +-
 src/VBox/Runtime/win/RTErrConvertFromWin32.cpp     |     1 +
 src/VBox/Runtime/win/errmsgwin.cpp                 |    14 +-
 src/VBox/Storage/DMG.cpp                           |     7 +-
 src/VBox/Storage/ISCSI.cpp                         |    15 +-
 src/VBox/Storage/Makefile.kmk                      |    37 +-
 src/VBox/Storage/Parallels.cpp                     |     8 +-
 src/VBox/Storage/QCOW.cpp                          |    14 +-
 src/VBox/Storage/QED.cpp                           |    39 +-
 src/VBox/Storage/RAW.cpp                           |     8 +-
 src/VBox/Storage/VCICache.cpp                      |     8 +-
 src/VBox/Storage/VD.cpp                            |  1013 +-
 src/VBox/Storage/VDBackends.h                      |    44 +
 src/VBox/Storage/VDI.cpp                           |    10 +-
 src/VBox/Storage/VHD.cpp                           |    10 +-
 src/VBox/Storage/VHDX.cpp                          |     8 +-
 src/VBox/Storage/VMDK.cpp                          |     8 +-
 src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp                |     2 +
 src/VBox/VMM/VMMAll/TMAllCpu.cpp                   |    76 +
 src/VBox/VMM/VMMR0/GMMR0.cpp                       |    48 +
 src/VBox/VMM/VMMR0/HMSVMR0.cpp                     |     9 +-
 src/VBox/VMM/VMMR0/HMVMXR0.cpp                     |   483 +-
 src/VBox/VMM/VMMR3/EM.cpp                          |    11 +-
 src/VBox/VMM/VMMR3/HM.cpp                          |    14 +-
 src/VBox/VMM/VMMR3/PDM.cpp                         |    21 +
 src/VBox/VMM/VMMR3/PDMDevHlp.cpp                   |     2 +-
 src/VBox/VMM/VMMR3/PDMDevice.cpp                   |     2 +-
 src/VBox/VMM/VMMR3/TM.cpp                          |    26 +-
 src/VBox/VMM/VMMR3/TRPM.cpp                        |    19 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h       |    10 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h     |     8 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3820QM.h     |    20 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h      |    10 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h  |     4 +-
 src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h |    10 +-
 .../VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h    |     4 +-
 src/VBox/VMM/include/HMInternal.h                  |    26 +-
 src/VBox/VMM/include/TMInternal.h                  |    15 +-
 src/VBox/VMM/testcase/Makefile.kmk                 |   198 +-
 src/VBox/VMM/testcase/tstAnimate.cpp               |    16 +-
 src/VBox/VMM/testcase/tstCFGM.cpp                  |    17 +-
 src/VBox/VMM/testcase/tstGlobalConfig.cpp          |    17 +-
 src/VBox/VMM/testcase/tstMMHyperHeap.cpp           |    17 +-
 src/VBox/VMM/testcase/tstMicro.cpp                 |    17 +-
 src/VBox/VMM/testcase/tstPDMAsyncCompletion.cpp    |    16 +-
 .../VMM/testcase/tstPDMAsyncCompletionStress.cpp   |    16 +-
 src/VBox/VMM/testcase/tstSSM.cpp                   |    16 +-
 src/VBox/VMM/testcase/tstVMM.cpp                   |    19 +-
 src/VBox/VMM/testcase/tstVMREQ.cpp                 |    17 +-
 src/VBox/VMM/tools/VBoxCpuReport.cpp               |    41 +-
 src/bldprogs/Makefile.kmk                          |    12 +-
 src/bldprogs/bin2c.c                               |    15 +-
 src/libs/Makefile.kmk                              |     4 +-
 src/libs/kStuff/Makefile.kmk                       |     2 +-
 src/libs/kStuff/kStuff/include/k/kErrors.h         |     6 +-
 src/libs/kStuff/kStuff/include/k/kLdr.h            |     5 +-
 src/libs/kStuff/kStuff/include/k/kLdrFmts/mach-o.h |     3 +-
 src/libs/kStuff/kStuff/kLdr/kLdrMod.c              |    25 +-
 src/libs/kStuff/kStuff/kLdr/kLdrModLX.c            |     3 +-
 src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c         |    41 +-
 src/libs/kStuff/kStuff/kLdr/kLdrModNative.c        |     3 +-
 src/libs/kStuff/kStuff/kLdr/kLdrModPE.c            |     3 +-
 .../kStuff/kLdr/testcase/bin/tst-3.dll.win.x86     |   Bin 3072 -> 0 bytes
 .../kStuff/kLdr/testcase/bin/tst-3.rel.darwin.x86  |   Bin 2800 -> 0 bytes
 src/libs/xpcom18a4/Config.kmk                      |    16 +-
 src/libs/xpcom18a4/nsprpub/pr/src/io/prprf.c       |    22 +-
 src/recompiler/Makefile.kmk                        |     9 +-
 663 files changed, 138528 insertions(+), 43245 deletions(-)

diff --git a/Config.kmk b/Config.kmk
index 5cae164..ea9f634 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -107,6 +107,7 @@ ifeq ($(KBUILD_TARGET),darwin)
  INST_ADDITIONS_LIB   = $(INST_LIB)additions/
  VBOX_INST_DTRACE_LIB = $(INST_BIN)dtrace/lib/
  VBOX_INST_DTRACE_TST = $(INST_BIN)dtrace/testcase/
+ VBOX_INST_TOOLS      = $(INST_BIN)tools/
 
 else
 
@@ -132,6 +133,7 @@ else
  VBOX_INST_DTRACE_TST = $(INST_BIN)dtrace/testcase/
 
  INST_VBOXDBG_SYMS    = $(INST_BIN)VBoxDbgSyms/
+ VBOX_INST_TOOLS      = $(INST_BIN)tools/
 endif
 
 
@@ -206,7 +208,7 @@ VBOX_VERSION_MINOR = 3
 # This is the current build number. It should be increased every time we publish a
 # new build. The define is available in every source file. Only even build numbers
 # will be published, odd numbers are set during development.
-VBOX_VERSION_BUILD = 12
+VBOX_VERSION_BUILD = 14
 # The raw version string. This *must not* contain any other information/fields than
 # major, minor and build revision (as it is now) -- also will be used for host/guest version
 # comparison.
@@ -222,6 +224,9 @@ VBOX_VERSION_STRING = $(VBOX_VERSION_STRING_RAW)$(VBOX_BUILD_PUBLISHER)
 
 # Force the additions.sh script to get an exact additions build when we're doing the release.
 ifeq ($(int-mod $(VBOX_VERSION_BUILD),2),0)
+  VBOX_RELEASE_EXACT_MATCH=1
+endif
+ifneq ($(VBOX_RELEASE_EXACT_MATCH),)
  export VBOX_ADDITIONS_SH_MODE     = release
  export VBOX_DOCUMENTATION_SH_MODE = release
  export VBOX_EFI_SH_MODE           = release
@@ -337,8 +342,17 @@ VBOX_WITH_DOCS_PACKING = 1
 ifn1of ($(KBUILD_TARGET), linux)
  VBOX_WITH_DOCS_CHM = 1
 endif
-# Include translations
-VBOX_WITH_DOCS_TRANSLATIONS = 1
+# By default only include translations in documentation-only builds
+ifdef VBOX_ONLY_DOCS
+ ifndef VBOX_NO_DOCS_TRANSLATIONS
+  VBOX_WITH_DOCS_TRANSLATIONS = 1
+ endif
+endif
+# Default languages
+VBOX_MANUAL_LANGUAGES = en_US
+ifdef VBOX_WITH_DOCS_TRANSLATIONS
+ VBOX_MANUAL_ADD_LANGUAGES = fr_FR
+endif
 # Don't bother with documentation, overrides VBOX_WITH_DOCS.
 # This is not used by makefiles, only Config.kmk, see below.
 #VBOX_WITHOUT_DOCS = 1
@@ -504,6 +518,8 @@ if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
 endif
 # Emulated USB smart card reader
 VBOX_WITH_USB_CARDREADER = 1
+# Disk crypt plugin
+VBOX_WITH_PLUGIN_CRYPT = 1
 ## @}
 
 
@@ -718,9 +734,7 @@ endif
 ## @{
 # Enables hardening.
 # Most developers will want to disable this in their LocalConfig.kmk.
-ifn1of ($(KBUILD_TARGET), win)
- VBOX_WITH_HARDENING = 1
-endif
+VBOX_WITH_HARDENING = 1
 # Where the application files are (going to be) installed.
 #VBOX_PATH_APP_PRIVATE       = /usr/lib/virtualbox
 ifdef VBOX_WITH_HARDENING
@@ -781,13 +795,11 @@ ifndef VBOX_WITH_HARDENING
  endif
 endif
 # Enable the system wide support service/daemon.
-# Work in progress, but required for hardening on Windows.
+# Very sketchy work in progress.
 #VBOX_WITH_SUPSVC = 1
-ifdef VBOX_WITH_HARDENING
- if1of ($(KBUILD_TARGET), win)
-  VBOX_WITH_SUPSVC = 1
- endif
-endif
+
+# Continue to support Vista w/o any service pack, at least for now.
+VBOX_WITH_VISTA_NO_SP = 1
 ## @}
 
 
@@ -1037,6 +1049,7 @@ ifdef VBOX_OSE
  VBOX_WITH_OS2_ADDITIONS_BIN=
  VBOX_WITH_SECURELABEL=
  VBOX_WITH_KCHMVIEWER=
+ VBOX_WITH_PLUGIN_CRYPT=
  ifn1of ($(KBUILD_TARGET), linux)
   VBOX_WITH_DOCS=
   VBOX_WITH_DOCS_PACKING=
@@ -1045,7 +1058,9 @@ ifdef VBOX_OSE
   VBOX_WITH_32_ON_64_MAIN_API=
  endif
  # Enable any translations in OSE, even partial ones.
- VBOX_WITH_DOCS_TRANSLATIONS=1
+ ifndef ($(VBOX_NO_DOCS_TRANSLATIONS))
+  VBOX_WITH_DOCS_TRANSLATIONS = 1
+ endif
  VBOX_WITH_TESTSUITE=
  VBOX_WITH_INTEL_PXE=
  # Disable for OSE, requires snv_159+.
@@ -1811,6 +1826,9 @@ VBOX_BIN2C      ?= $(PATH_OBJ)/bin2c/bin2c$(HOSTSUFF_EXE)
 # RTManifest (extension pack manifest utility)
 VBOX_RTMANIFEST ?= $(PATH_OBJ)/bldRTManifest/bldRTManifest$(HOSTSUFF_EXE)
 
+# RTSignTool (certificate extraction tool)
+VBOX_RTSIGNTOOL ?= $(PATH_OBJ)/bldRTSignTool/bldRTSignTool$(HOSTSUFF_EXE)
+
 # VBoxCmp (simple /bin/cmp with more sensible output)
 VBOX_VBOXCMP    ?= $(PATH_OBJ)/VBoxCmp/VBoxCmp$(HOSTSUFF_EXE)
 
@@ -1823,6 +1841,9 @@ VBOX_VBOXTPG    ?= $(PATH_OBJ)/VBoxTpG/VBoxTpG$(HOSTSUFF_EXE)
 # VBoxPeSetVersion (changes the minimum OS version of an image)
 VBOX_PE_SET_VERSION ?= $(PATH_OBJ)/VBoxPeSetVersion/VBoxPeSetVersion$(HOSTSUFF_EXE)
 
+# Visual C++ EditBin.exe.
+VBOX_VCC_EDITBIN = $(if $(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN),$(PATH_TOOL_$(VBOX_VCC_TOOL)_BIN)/,)editbin.exe /NoLogo
+
 # filesplitter (splits java files)
 VBOX_FILESPLIT  ?= $(PATH_OBJ)/filesplitter/filesplitter$(HOSTSUFF_EXE)
 
@@ -2585,17 +2606,24 @@ ifdef VBOX_SIGNING_MODE
   VBOX_CERTIFICATE_STORE_ARGS ?= /s "$(VBOX_CERTIFICATE_STORE)"
 
   ## Commands for signing a driver image after link.
-  VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
-  ## Sign a file.
+  VBOX_SIGN_DRIVER_CMDS ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out)))
+  ## Sign a file (generic).
   # @param 1  The file to sign.
   # @param 2  File description. Optional.
+  # @param 3  Additional parameters. Optional.
   VBOX_SIGN_FILE_FN     ?= $(VBOX_SIGNTOOL) sign \
 	$(VBOX_CROSS_CERTIFICATE_FILE_ARGS) \
 	$(VBOX_CERTIFICATE_STORE_ARGS) \
 	$(VBOX_CERTIFICATE_SUBJECT_NAME_ARGS) \
 	$(VBOX_TSA_URL_ARGS) \
 	$(if $(strip $(2)),/d "$(strip $(2))",) \
+       $(3) \
 	$(1)
+  ## Sign an executable image.
+  # @param 1  The file to sign.
+  # @param 2  File description. Optional.
+  VBOX_SIGN_IMAGE_FN     ?= $(call VBOX_SIGN_FILE_FN,$(1),$(2),/ph)
+
   ## Create a security catalog file.
   # @param 1  The directory containing the stuff to sign.
   # @param 2  The expected .cat name. (Inf2Cat lowercases it)
@@ -2614,9 +2642,9 @@ ifdef VBOX_SIGNING_MODE
   endif
 
   # Go nuts, sign everything.
-  ifeq ($(strip $(VBOX_SIGNING_MODE)),release)
+  if "$(strip $(VBOX_SIGNING_MODE))" == "release" || defined(VBOX_WITH_HARDENING)
    ## Commands for signing an executable or a dll image after link.
-   VBOX_SIGN_IMAGE_CMDS  ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_FILE_FN,$(out)))
+   VBOX_SIGN_IMAGE_CMDS  ?= $(if $(eq $(tool_do),LINK_LIBRARY),,$(call VBOX_SIGN_IMAGE_FN,$(out)))
   endif
   ## Enable signing of the additions.
   VBOX_SIGN_ADDITIONS   ?= 1
@@ -2704,6 +2732,48 @@ VBOX_EDIT_INF64_FN = $(SED) \
 	--output $(2) \
 	$(1)
 
+##
+# Helper macro for re-signing DLL images from tools that we ship so they won't
+# cause trouble for the hardened build requirements.
+#
+# Invoke via $(call VBOX_RE_SIGN_DLL_FN) inside the SOURCES list.  Necessary
+# _CLEAN entry will be added to the target.  If hardening is not enabled or
+# we're not on windows, the source will be returned.
+#
+# @returns  Name of the output file name.  May have leading space, but no trailing.
+# @param    1   Target name.
+# @param    2   The source name.
+#
+if defined(VBOX_SIGNING_MODE) && "$(KBUILD_TARGET)" == "win"
+ VBOX_RE_SIGN_DLL_FN = $(if-expr !defined($(1)_VBOX_RE_SIGNED_$(notdir $(2))),\
+	$(evalcall VBOX_RE_SIGN_DLL_INTERNAL_FN,$1,$2)\
+	,)$($(1)_0_OUTDIR)/$(notdir $2)
+
+define VBOX_RE_SIGN_DLL_INTERNAL_FN
+local n = $(notdir $2)
+ifndef $(1)_VBOX_RE_SIGNED_$(n)
+ $(1)_VBOX_RE_SIGNED_$(n) := 1
+ $(eval $(1)_CLEAN += $$($(1)_0_OUTDIR)/$(n))
+
+ $$($(1)_0_OUTDIR)/$(n): $(2) $(VBOX_VERSION_STAMP) | $$(dir $$@)
+	$(call MSG_TOOL,SIGNTOOL,,$<,$@)
+	$(RM) -f -- "$@"
+	$(CP) -- "$<" "$@"
+	$(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \
+		/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
+		"$@"
+	$(call VBOX_SIGN_IMAGE_FN,$@)
+endif
+endef # VBOX_RESIGN_DLL_FN
+else
+ VBOX_RE_SIGN_DLL_FN = $(2)
+endif
+
+
+##
+# @param
+VBOX_RESIGN_DLL_FN =
+
 #
 # Adjust kBuild defaults.
 #
@@ -2826,13 +2896,6 @@ SDK_VBoxOpenSslExtPack_LIBS    = \
 	$(PATH_STAGE_LIB)/VBoxExtPack-libssl$(VBOX_SUFF_LIB) \
 	$(PATH_STAGE_LIB)/VBoxExtPack-libcrypto$(VBOX_SUFF_LIB)
 
-SDK_VBOX_BLD_OPENSSL      = .
-SDK_VBOX_BLD_OPENSSL_EXTENDS = VBOX_OPENSSL
-SDK_VBOX_BLD_OPENSSL_LIBS ?= \
-	$(PATH_STAGE_LIB)/VBoxBldProg-libcrypto$(VBOX_SUFF_LIB)
-SDK_VBOX_BLD_OPENSSL_LIBS.linux ?= \
-	crypt
-
 ifdef VBOX_WITH_S3
 VBOX_WITH_LIBCURL = 1
 SDK_VBOX_LIBCURL       = .
@@ -3034,7 +3097,10 @@ ifdef VBOX_WITH_RAW_MODE
    TEMPLATE_VBoxRc_CXXFLAGS          = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- -Gs8192 $(VBOX_VCC_GC_OPT) $(VBOX_VCC_GC_FP) -W3 -wd4244 -wd4996 $(VBOX_VCC_WERR)
   endif
   TEMPLATE_VBoxRc_CFLAGS             = $(TEMPLATE_VBoxRc_CXXFLAGS)
-  TEMPLATE_VBoxRc_LDFLAGS            = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Debug
+  TEMPLATE_VBoxRc_LDFLAGS            = -Driver -Subsystem:NATIVE -Incremental:NO -Align:64 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug
+  ifdef VBOX_SIGNING_MODE
+   TEMPLATE_VBoxRc_LDFLAGS          += -IntegrityCheck
+  endif
   TEMPLATE_VBoxRc_LIBS               = \
   	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/int64.lib
   TEMPLATE_VBoxRc_LIBS              += \
@@ -3157,10 +3223,13 @@ TEMPLATE_VBoxR0_CXXFLAGS            = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- $
 TEMPLATE_VBoxR0_CXXFLAGS            = -Zi -Zl -GR- -EHs- -GF -GS- -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP) -W3 -wd4244 -wd4996 $(VBOX_VCC_WERR)
  endif
 TEMPLATE_VBoxR0_CFLAGS              = $(TEMPLATE_VBoxR0_CXXFLAGS)
-TEMPLATE_VBoxR0_LDFLAGS             = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Debug
+TEMPLATE_VBoxR0_LDFLAGS             = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD $(VBOX_VCC_LD_WERR) -Release -Debug
  ifdef VBOX_WITH_DTRACE_R0
 TEMPLATE_VBoxR0_LDFLAGS            += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
  endif
+ ifdef VBOX_SIGNING_MODE
+  TEMPLATE_VBoxR0_LDFLAGS          += -IntegrityCheck
+ endif
 TEMPLATE_VBoxR0_LIBS                = \
 	$(PATH_STAGE_LIB)/RuntimeR0Stub$(VBOX_SUFF_LIB)
  include $(KBUILD_PATH)/sdks/$(VBOX_WINDDK).kmk ## TODO: Add a kBuild feature for loading SDKs.
@@ -3259,12 +3328,15 @@ ifeq ($(KBUILD_TARGET),win)
  TEMPLATE_VBOXR0DRV_DEFS.x86          += NO_INTERLOCKED_INTRINSICS # Avoids intrisic VC/WDK trouble
  TEMPLATE_VBOXR0DRV_DEFS.x86          += WIN9X_COMPAT_SPINLOCK     # Avoid multiply defined _KeInitializeSpinLock at 4
  TEMPLATE_VBOXR0DRV_DEFS.amd64         = _AMD64_
- TEMPLATE_VBOXR0DRV_CXXFLAGS           = -Zi -Zl -GR- -EHs- -GF -Gz -W3 -GS- -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
+ TEMPLATE_VBOXR0DRV_CXXFLAGS           = -Zi -Zl -GR- -EHs- -GF -Gz -W3 -GS- -wd4996 -Zc:wchar_t- -Gs4096 $(VBOX_VCC_OPT) $(VBOX_VCC_FP)
  TEMPLATE_VBOXR0DRV_CFLAGS             = $(TEMPLATE_VBOXR0DRV_CXXFLAGS)
- TEMPLATE_VBOXR0DRV_LDFLAGS            = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Debug
+ TEMPLATE_VBOXR0DRV_LDFLAGS            = -Driver -Subsystem:NATIVE -Incremental:NO -Align:4096 -MapInfo:Exports -NoD -Release -Debug
  ifdef VBOX_WITH_DTRACE_R0DRV
   TEMPLATE_VBOXR0DRV_LDFLAGS          += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
  endif
+ ifdef VBOX_SIGNING_MODE
+  TEMPLATE_VBOXR0DRV_LDFLAGS          += -IntegrityCheck
+ endif
  TEMPLATE_VBOXR0DRV_POST_CMDS          = $(VBOX_SIGN_DRIVER_CMDS)
 endif
 
@@ -3556,7 +3628,8 @@ ifeq ($(KBUILD_TARGET),win)
  TEMPLATE_VBOXR3EXE_CFLAGS.dbgopt      = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.dbgopt)
  TEMPLATE_VBOXR3EXE_CFLAGS.kprofile    = $(TEMPLATE_VBOXR3EXE_CXXFLAGS.kprofile)
  TEMPLATE_VBOXR3EXE_LDFLAGS            = \
-	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
+	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+	/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
 	/DISALLOWLIB:libc.lib \
 	/DISALLOWLIB:libcd.lib \
 	/DISALLOWLIB:libcmt.lib \
@@ -3566,6 +3639,9 @@ ifeq ($(KBUILD_TARGET),win)
  ifdef VBOX_WITH_DTRACE_R3
   TEMPLATE_VBOXR3EXE_LDFLAGS          += -Merge:VTGPrLc.Data=VTGPrLc.Begin -Merge:VTGPrLc.End=VTGPrLc.Begin -Merge:VTGPrLc.Begin=VTGObj
  endif
+ if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+   TEMPLATE_VBOXR3EXE_LDFLAGS         += -IntegrityCheck
+ endif
 
  TEMPLATE_VBOXR3EXE_LIBS.x86           = \
  	$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.x86)_LIB)/msvcrt$(VBOX_VCC_CRT_TYPE).lib \
@@ -3877,13 +3953,34 @@ endif
 #
 TEMPLATE_VBOXR3HARDENEDEXE = Hardened VBox Ring-3 EXE
 TEMPLATE_VBOXR3HARDENEDEXE_EXTENDS = VBOXR3EXE
-TEMPLATE_VBOXR3HARDENEDEXE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBOXR3EXE_LIBS)
+TEMPLATE_VBOXR3HARDENEDEXE_DEBUG_INST.win = $(INST_DEBUG)hardened-exes/
+ifdef VBOX_WITH_HARDENING
+ TEMPLATE_VBOXR3HARDENEDEXE_LIBS = $(VBOX_LIB_SUPHARDENED) $(TEMPLATE_VBOXR3EXE_LIBS)
+else
+ TEMPLATE_VBOXR3HARDENEDEXE_LIBS = $(TEMPLATE_VBOXR3EXE_LIBS)
+endif
 TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.darwin = $(TEMPLATE_VBOXR3EXE_LDFLAGS.darwin) -framework IOKit
 ifeq ($(KBUILD_TARGET),linux)
 # not necessary except USE_LIB_PCAP is defined in SUPR3HardenedMain.cpp
 # TEMPLATE_VBOXR3HARDENEDEXE_LIBS += cap
 endif
-ifn1of ($(KBUILD_TARGET), win os2)
+ifeq ($(KBUILD_TARGET),win) # No CRT!
+ TEMPLATE_VBOXR3HARDENEDEXE_SDKS          = VBOX_NTDLL $(TEMPLATE_VBOXR3EXE_SDKS)
+ TEMPLATE_VBOXR3HARDENEDEXE_LIBS.x86      = \
+	$(PATH_SDK_$(VBOX_WINDDK)_LIB.x86)/int64.lib \
+ 	$(PATH_TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.x86)_LIB)/chkstk.obj
+ TEMPLATE_VBOXR3HARDENEDEXE_CXXFLAGS      = $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CXXFLAGS)) -GS-
+ TEMPLATE_VBOXR3HARDENEDEXE_CXXFLAGS.debug= $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CXXFLAGS.debug)) -GS- -O2 -Oy-
+ TEMPLATE_VBOXR3HARDENEDEXE_CFLAGS        = $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CFLAGS)) -GS-
+ TEMPLATE_VBOXR3HARDENEDEXE_CFLAGS.debug  = $(filter-out -RTC% -GZ -GS,$(TEMPLATE_VBOXR3EXE_CFLAGS.debug)) -GS- -O2 -Oy-
+ TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS       = $(TEMPLATE_VBOXR3EXE_LDFLAGS) \
+	/DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE).lib \
+	/DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE).lib
+ TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.win.x86   = $(TEMPLATE_VBOXR3EXE_LDFLAGS.win.x86)   /entry:suplibHardenedWindowsMain
+ TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.win.amd64 = $(TEMPLATE_VBOXR3EXE_LDFLAGS.win.amd64) /entry:suplibHardenedWindowsMain
+ TEMPLATE_VBOXR3HARDENEDEXE_LIBS.x86       = $(NOT_SUCH_VARIABLE)
+ TEMPLATE_VBOXR3HARDENEDEXE_LIBS.amd64     = $(NOT_SUCH_VARIABLE)
+else ifn1of ($(KBUILD_TARGET), os2)
  TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS       = $(filter-out '$(VBOX_GCC_RPATH_OPT)%,$(TEMPLATE_VBOXR3EXE_LDFLAGS))
  TEMPLATE_VBOXR3HARDENEDEXE_LDFLAGS.linux = $(filter-out $(VBOX_GCC_ORIGIN_OPT),$(TEMPLATE_VBOXR3EXE_LDFLAGS.linux))
 endif
@@ -3897,11 +3994,23 @@ TEMPLATE_VBOXR3HARDENEDLIB_LIBS = $(NO_SUCH_VARIABLE)
 
 
 #
+# Template for building hardened Ring-3 executables.
+# These shall have no extra runpaths, esp. not origin ones.
+#
+TEMPLATE_VBoxR3HardenedTstExe = VBox Ring-3 Hardened Testcase Exe (currently windows only!)
+TEMPLATE_VBoxR3HardenedTstExe_EXTENDS = VBOXR3HARDENEDEXE
+TEMPLATE_VBoxR3HardenedTstExe_INST = $(INST_TESTCASE)
+
+#
 # Template for building set-uid-to-root helper programs.
 # In hardened builds, these may only contain absolute runpaths!
 #
 TEMPLATE_VBoxR3SetUidToRoot = Set-uid-to-root helper program.
-TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBOXR3HARDENEDEXE
+if1of ($(KBUILD_TARGET),win)
+ TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBOXR3EXE
+else
+ TEMPLATE_VBoxR3SetUidToRoot_EXTENDS = VBOXR3HARDENEDEXE
+endif
 TEMPLATE_VBoxR3SetUidToRoot_LIBS = $(NO_SUCH_VARIABLE)
 ifdef VBOX_WITH_RUNPATH
  TEMPLATE_VBoxR3SetUidToRoot_LDFLAGS += '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)'
@@ -3915,6 +4024,26 @@ ifndef VBOX_WITH_HARDENING
  endif
 endif
 
+#
+# Template for building R3 tools.
+#
+TEMPLATE_VBoxR3Tool            = VBox Ring 3 Tools
+TEMPLATE_VBoxR3Tool_EXTENDS    = VBOXR3EXE
+TEMPLATE_VBoxR3Tool_INST       = $(VBOX_INST_TOOLS)
+ifeq ($(KBUILD_TARGET),win)
+ TEMPLATE_VBoxR3Tool_CFLAGS    = $(TEMPLATE_VBOXR3EXE_CFLAGS) $(VBOX_VCC_WERR)
+ TEMPLATE_VBoxR3Tool_CXXFLAGS  = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) $(VBOX_VCC_WERR)
+ TEMPLATE_VBoxR3Tool_LDFLAGS   = $(TEMPLATE_VBOXR3EXE_LDFLAGS) $(VBOX_VCC_LD_WERR)
+else
+ TEMPLATE_VBoxR3Tool_CFLAGS    = $(TEMPLATE_VBOXR3EXE_CFLAGS) $(VBOX_GCC_WERR)
+ TEMPLATE_VBoxR3Tool_CXXFLAGS  = $(TEMPLATE_VBOXR3EXE_CXXFLAGS) $(VBOX_GCC_WERR)
+ ifdef VBOX_WITH_RUNPATH
+  TEMPLATE_VBoxR3Tool_LDFLAGS  = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RUNPATH)' $(TEMPLATE_VBOXR3EXE_LDFLAGS)
+ else ifdef VBOX_WITH_RELATIVE_RUNPATH
+  TEMPLATE_VBoxR3Tool_LDFLAGS  = '$(VBOX_GCC_RPATH_OPT)$(VBOX_WITH_RELATIVE_RUNPATH)/..' $(TEMPLATE_VBOXR3EXE_LDFLAGS)
+ endif
+endif
+TEMPLATE_VBoxR3Tool_LIBS       = $(LIB_RUNTIME) $(TEMPLATE_VBOXR3EXE_LIBS)
 
 #
 # Template for building R3 shared objects / DLLs with the 10.5 Mac OS X SDK.
@@ -3947,6 +4076,7 @@ endif
 TEMPLATE_VBOXR3AUTOTST_INST    = $(INST_TESTCASE)
 if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
  TEMPLATE_VBOXR3AUTOTST_POST_CMDS = $(NO_SUCH_VARIABLE)
+ TEMPLATE_VBOXR3AUTOTST_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBoxR3Static_LDFLAGS))
 endif
 
 #
@@ -3964,6 +4094,7 @@ else ifdef VBOX_WITH_RELATIVE_RUNPATH
 endif
 if "$(KBUILD_TARGET)" == "win" && defined(VBOX_SIGNING_MODE)
  TEMPLATE_VBOXR3TSTEXE_POST_CMDS =
+ TEMPLATE_VBOXR3TSTEXE_LDFLAGS = $(filter-out -IntegrityCheck, $(TEMPLATE_VBOXR3EXE_LDFLAGS))
 endif
 
 #
@@ -3979,6 +4110,19 @@ endif
 
 
 #
+# Ring-3 testcase DLL.
+#
+TEMPLATE_VBoxR3TstDll = VBox Ring-3 Testcase Dll
+TEMPLATE_VBoxR3TstDll_EXTENDS = VBOXR3TSTEXE
+ifn1of ($(KBUILD_TARGET), darwin win os2)
+ TEMPLATE_VBoxR3TstDll_DEFS     = $(TEMPLATE_VBOXR3TSTEXE_DEFS) PIC
+ TEMPLATE_VBoxR3TstDll_CFLAGS   = $(TEMPLATE_VBOXR3TSTEXE_CFLAGS) -fPIC
+ TEMPLATE_VBoxR3TstDll_CXXFLAGS = $(TEMPLATE_VBOXR3TSTEXE_CXXFLAGS) -fPIC
+ TEMPLATE_VBoxR3TstDll_LDFLAGS  = $(TEMPLATE_VBOXR3TSTEXE_LDFLAGS) -fPIC
+endif
+
+
+#
 # Template for the CppUnit kind of testcases.
 #
 TEMPLATE_VBOXCPPUNITEXE  = VBox CppUnit Testcase Exe
@@ -4044,75 +4188,75 @@ TEMPLATE_VBoxR3DllNonPedantic-x86_DEFS      = $(filter-out HC_ARCH_BITS%,$(TEMPL
 # Template for building libraries, shared libraries / modules
 # which only depends on IPRT for crt.
 #
-TEMPLATE_VBOXNOCRTGCC = VBox no-crt GCC libraries and modules, yasm/nasm.
-TEMPLATE_VBOXNOCRTGCC_DEFS              = IN_RING3 IPRT_NO_CRT $(ARCH_BITS_DEFS)
-TEMPLATE_VBOXNOCRTGCC_ASDEFS            = ASM_CALL64_GCC
-TEMPLATE_VBOXNOCRTGCC_CFLAGS            = -nostdinc -fno-strict-aliasing -fno-math-errno $(VBOX_GCC_WARN) -Werror-implicit-function-declaration
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.x86        = -m32
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.amd64      = -m64 -mcmodel=medium -fno-common
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.sparc32    = -m32
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.sparc64    = -m64
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.release    = -O2 -fno-strict-aliasing
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.profile    = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.release)
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.kprofile   = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.release)
-TEMPLATE_VBOXNOCRTGCC_CFLAGS.darwin     = -static
-TEMPLATE_VBOXNOCRTGCC_CXXFLAGS          = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS)
-TEMPLATE_VBOXNOCRTGCC_CXXFLAGS.$(KBUILD_TARGET) = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.$(KBUILD_TARGET))
-TEMPLATE_VBOXNOCRTGCC_CXXFLAGS.$(KBUILD_TARGET_ARCH) = $(TEMPLATE_VBOXNOCRTGCC_CFLAGS.$(KBUILD_TARGET_ARCH))
-TEMPLATE_VBOXNOCRTGCC_INCS              = $(PATH_ROOT)/include/iprt/nocrt
+TEMPLATE_VBoxNoCrtGccLib = VBox no-crt GCC libraries and modules, yasm/nasm.
+TEMPLATE_VBoxNoCrtGccLib_DEFS              = IN_RING3 IPRT_NO_CRT $(ARCH_BITS_DEFS)
+TEMPLATE_VBoxNoCrtGccLib_ASDEFS            = ASM_CALL64_GCC
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS            = -nostdinc -fno-strict-aliasing -fno-math-errno $(VBOX_GCC_WARN) -Werror-implicit-function-declaration
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.x86        = -m32
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.amd64      = -m64 -mcmodel=medium -fno-common
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.sparc32    = -m32
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.sparc64    = -m64
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.release    = -O2 -fno-strict-aliasing
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.profile    = $(TEMPLATE_VBoxNoCrtGccLib_CFLAGS.release)
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.kprofile   = $(TEMPLATE_VBoxNoCrtGccLib_CFLAGS.release)
+TEMPLATE_VBoxNoCrtGccLib_CFLAGS.darwin     = -static
+TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS          = $(TEMPLATE_VBoxNoCrtGccLib_CFLAGS)
+TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS.$(KBUILD_TARGET) = $(TEMPLATE_VBoxNoCrtGccLib_CFLAGS.$(KBUILD_TARGET))
+TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS.$(KBUILD_TARGET_ARCH) = $(TEMPLATE_VBoxNoCrtGccLib_CFLAGS.$(KBUILD_TARGET_ARCH))
+TEMPLATE_VBoxNoCrtGccLib_INCS              = $(PATH_ROOT)/include/iprt/nocrt
 
 ifeq (disabled-by-mingw-w64 $(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.amd64)
  # cross compile to 64-bit ELF (linux).
- TEMPLATE_VBOXNOCRTGCC_TOOL             = XGCCAMD64LINUX
- TEMPLATE_VBOXNOCRTGCC_ASTOOL           = YASM
- TEMPLATE_VBOXNOCRTGCC_ASFLAGS          = -f elf64 -DASM_FORMAT_ELF -D__YASM__ -w+orphan-labels -g dwarf2
- TEMPLATE_VBOXNOCRTGCC_LIBS             = $(PATH_DEVTOOLS)/win.x86/x86_64-unknown-linux-gnu/20060701-r2/lib/gcc/x86_64-unknown-linux-gnu/3.4.6/libgcc.a
- TEMPLATE_VBOXNOCRTGCC_LDFLAGS          = -nostdlib
+ TEMPLATE_VBoxNoCrtGccLib_TOOL             = XGCCAMD64LINUX
+ TEMPLATE_VBoxNoCrtGccLib_ASTOOL           = YASM
+ TEMPLATE_VBoxNoCrtGccLib_ASFLAGS          = -f elf64 -DASM_FORMAT_ELF -D__YASM__ -w+orphan-labels -g dwarf2
+ TEMPLATE_VBoxNoCrtGccLib_LIBS             = $(PATH_DEVTOOLS)/win.x86/x86_64-unknown-linux-gnu/20060701-r2/lib/gcc/x86_64-unknown-linux-gnu/3.4.6/libgcc.a
+ TEMPLATE_VBoxNoCrtGccLib_LDFLAGS          = -nostdlib
 
 else if1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), win.x86 win.amd64)
  # Use the default GCC (MinGW) with the Microsoft linker.
  # (Drop all '-g' options as we're unable to strip the debug info.)
- TEMPLATE_VBOXNOCRTGCC_TOOL             = $(VBOX_GCC_TOOL)
- TEMPLATE_VBOXNOCRTGCC_ASTOOL           = $(VBOX_ASTOOL)
- TEMPLATE_VBOXNOCRTGCC_ASFLAGS          = $(VBOX_ASFLAGS)
- TEMPLATE_VBOXNOCRTGCC_LDTOOL           = $(VBOX_VCC_TOOL)
- TEMPLATE_VBOXNOCRTGCC_LDFLAGS          = -Incremental:NO -MapInfo:Exports -NoD
- TEMPLATE_VBOXNOCRTGCC_LIBS             = $(VBOX_GCC_LIBGCC)
- TEMPLATE_VBOXNOCRTGCC_CFLAGS          := $(filter-out -g,$(TEMPLATE_VBOXNOCRTGCC_CFLAGS)) -s
- TEMPLATE_VBOXNOCRTGCC_CXXFLAGS        := $(filter-out -g,$(TEMPLATE_VBOXNOCRTGCC_CXXFLAGS)) -s
+ TEMPLATE_VBoxNoCrtGccLib_TOOL             = $(VBOX_GCC_TOOL)
+ TEMPLATE_VBoxNoCrtGccLib_ASTOOL           = $(VBOX_ASTOOL)
+ TEMPLATE_VBoxNoCrtGccLib_ASFLAGS          = $(VBOX_ASFLAGS)
+ TEMPLATE_VBoxNoCrtGccLib_LDTOOL           = $(VBOX_VCC_TOOL)
+ TEMPLATE_VBoxNoCrtGccLib_LDFLAGS          = -Incremental:NO -MapInfo:Exports -NoD
+ TEMPLATE_VBoxNoCrtGccLib_LIBS             = $(VBOX_GCC_LIBGCC)
+ TEMPLATE_VBoxNoCrtGccLib_CFLAGS          := $(filter-out -g,$(TEMPLATE_VBoxNoCrtGccLib_CFLAGS)) -s
+ TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS        := $(filter-out -g,$(TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS)) -s
 
 else
  # Use the default GCC.
  # The use of --exclude-libs ALL is to avoid confusing the linux ld.so.
- TEMPLATE_VBOXNOCRTGCC_TOOL             = $(VBOX_GCC_TOOL)
- TEMPLATE_VBOXNOCRTGCC_ASTOOL           = $(VBOX_ASTOOL)
- TEMPLATE_VBOXNOCRTGCC_ASFLAGS          = $(VBOX_ASFLAGS)
- TEMPLATE_VBOXNOCRTGCC_CFLAGS          += $(VBOX_GCC_fno-stack-protector)
- TEMPLATE_VBOXNOCRTGCC_CXXFLAGS        += $(VBOX_GCC_fno-stack-protector)
+ TEMPLATE_VBoxNoCrtGccLib_TOOL             = $(VBOX_GCC_TOOL)
+ TEMPLATE_VBoxNoCrtGccLib_ASTOOL           = $(VBOX_ASTOOL)
+ TEMPLATE_VBoxNoCrtGccLib_ASFLAGS          = $(VBOX_ASFLAGS)
+ TEMPLATE_VBoxNoCrtGccLib_CFLAGS          += $(VBOX_GCC_fno-stack-protector)
+ TEMPLATE_VBoxNoCrtGccLib_CXXFLAGS        += $(VBOX_GCC_fno-stack-protector)
  ifeq ($(KBUILD_TARGET_ARCH),amd64)
   # in 64-bit mode we'll build a sys-module (VBoxREM2).
   if1of ($(KBUILD_TARGET), darwin solaris)
-   TEMPLATE_VBOXNOCRTGCC_LDFLAGS.solaris= -64 -r
+   TEMPLATE_VBoxNoCrtGccLib_LDFLAGS.solaris= -64 -r
   else
-   TEMPLATE_VBOXNOCRTGCC_LDFLAGS        = -nostdlib
+   TEMPLATE_VBoxNoCrtGccLib_LDFLAGS        = -nostdlib
   endif
  else # x86:
-  TEMPLATE_VBOXNOCRTGCC_LDFLAGS         = -nostdlib
+  TEMPLATE_VBoxNoCrtGccLib_LDFLAGS         = -nostdlib
   ifn1of ($(KBUILD_TARGET), os2 darwin solaris)
-   TEMPLATE_VBOXNOCRTGCC_LDFLAGS       += -Wl,--no-undefined
+   TEMPLATE_VBoxNoCrtGccLib_LDFLAGS       += -Wl,--no-undefined
   endif
  endif # x86
- TEMPLATE_VBOXNOCRTGCC_LDFLAGS.darwin   = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
- TEMPLATE_VBOXNOCRTGCC_LIBS             = # FIXME - has unwind mess.
+ TEMPLATE_VBoxNoCrtGccLib_LDFLAGS.darwin   = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
+ TEMPLATE_VBoxNoCrtGccLib_LIBS             = # FIXME - has unwind mess.
 endif
 
 
 #
-# Same as VBOXNOCRTGCC only it uses GAS as the assembler instead of yasm/nasm.
+# Same as VBoxNoCrtGccLib only it uses GAS as the assembler instead of yasm/nasm.
 #
 TEMPLATE_VBOXNOCRTGAS = VBox no-crt GCC libraries and modules, gas.
-TEMPLATE_VBOXNOCRTGAS_EXTENDS = VBOXNOCRTGCC
-TEMPLATE_VBOXNOCRTGAS_ASTOOL = $(TEMPLATE_VBOXNOCRTGCC_TOOL)
+TEMPLATE_VBOXNOCRTGAS_EXTENDS = VBoxNoCrtGccLib
+TEMPLATE_VBOXNOCRTGAS_ASTOOL = $(TEMPLATE_VBoxNoCrtGccLib_TOOL)
 ifeq ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH),win.x86)
  TEMPLATE_VBOXNOCRTGAS_ASFLAGS = -s
 else
@@ -4151,13 +4295,17 @@ ifeq ($(KBUILD_TARGET),win)
  TEMPLATE_VBOXMAINEXE_CFLAGS.dbgopt      = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.dbgopt)
  TEMPLATE_VBOXMAINEXE_CFLAGS.kprofile    = $(TEMPLATE_VBOXMAINEXE_CXXFLAGS.kprofile)
  TEMPLATE_VBOXMAINEXE_LDFLAGS            = \
-	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG\
+	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+	/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
 	/DISALLOWLIB:libc.lib \
 	/DISALLOWLIB:libcd.lib \
 	/DISALLOWLIB:libcmt.lib \
 	/DISALLOWLIB:libcmtd.lib \
 	/DISALLOWLIB:msvcrt$(VBOX_VCC_CRT_TYPE_N).lib \
 	/DISALLOWLIB:msvcprt$(VBOX_VCC_CRT_TYPE_N).lib
+ if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+  TEMPLATE_VBOXMAINEXE_LDFLAGS          += -IntegrityCheck
+ endif
  TEMPLATE_VBOXMAINEXE_LIBS               = \
 	$(LIB_RUNTIME)
  TEMPLATE_VBOXMAINEXE_LIBS.x86           = \
@@ -4430,8 +4578,8 @@ ifdef VBOX_WITH_EXTPACK
   TEMPLATE_VBoxR3ExtPack_EXTENDS = VBOXR3DLLNOXCPT
   TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBOXR3DLLNOXCPT_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3
  else
-  TEMPLATE_VBoxR3ExtPack_EXTENDS = VBOXNOCRTGCC
-  TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBOXNOCRTGCC_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3 IPRT_NO_CRT IN_RING3
+  TEMPLATE_VBoxR3ExtPack_EXTENDS = VBoxNoCrtGccLib
+  TEMPLATE_VBoxR3ExtPack_DEFS = $(TEMPLATE_VBoxNoCrtGccLib_DEFS) VBOX_IN_EXTPACK VBOX_IN_EXTPACK_R3 IPRT_NO_CRT IN_RING3
   TEMPLATE_VBoxR3ExtPack_INCS = $(PATH_ROOT)/include/iprt/nocrt $(TEMPLATE_VBOXR3DLLNOXCPT_INCS)
  endif
  ifneq ($(KBUILD_TARGET),win)
@@ -4604,7 +4752,11 @@ ifdef VBOX_WITH_QTGUI
   TEMPLATE_VBOXQT4GUIEXE_INCS += \
 	$(PATH_TOOL_$(VBOX_VCC_TOOL)_ATLMFC_INC)
   TEMPLATE_VBOXQT4GUIEXE_LDFLAGS = \
-	/NOD /NOLOGO /INCREMENTAL:NO /MAPINFO:EXPORTS /DEBUG
+	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+	/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD)
+  if defined(VBOX_SIGNING_MODE) && defined(VBOX_WITH_HARDENING)
+   TEMPLATE_VBOXQT4GUIEXE_LDFLAGS += -IntegrityCheck
+  endif
   TEMPLATE_VBOXQT4GUIEXE_SDKS += $(VBOX_WINPSDK)
   TEMPLATE_VBOXQT4GUIEXE_LIBS = \
 	$(VBOX_LIBS_QT4) \
@@ -4621,7 +4773,6 @@ ifdef VBOX_WITH_QTGUI
 	$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/msvcprt$(VBOX_VCC_CRT_TYPE).lib
   endif
   TEMPLATE_VBOXQT4GUIEXE_POST_CMDS = $(VBOX_SIGN_IMAGE_CMDS)
-  TEMPLATE_VBOXQT4GUIEXE_LDFLAGS.win.x86 += /LARGEADDRESSAWARE
 
  else # the gcc guys:
   TEMPLATE_VBOXQT4GUIEXE_TOOL = $(VBOX_GCC_TOOL)
@@ -4764,133 +4915,134 @@ TEMPLATE_VBoxDbgSyms_INST = $(INST_VBOXDBG_SYMS)
 #
 # HACK ALERT! The BLD_TRG_* is a hack to allow building libraries as well.
 #
-TEMPLATE_VBOXBLDPROG  = VBox Build Program
-TEMPLATE_VBOXBLDPROG_BLD_TRG            := $(KBUILD_HOST)
-TEMPLATE_VBOXBLDPROG_BLD_TRG_ARCH       := $(KBUILD_HOST_ARCH)
-TEMPLATE_VBOXBLDPROG_BLD_TRG_CPU        := $(KBUILD_HOST_CPU)
-TEMPLATE_VBOXBLDPROG_DEFS               := IN_RING3 LOG_DISABLED
-TEMPLATE_VBOXBLDPROG_DEFS.win           := _CRT_SECURE_NO_DEPRECATE
-TEMPLATE_VBOXBLDPROG_ASTOOL             := $(VBOX_ASTOOL)
-TEMPLATE_VBOXBLDPROG_ASFLAGS.x86        := $(VBOX_ASFLAGS32)
-TEMPLATE_VBOXBLDPROG_ASFLAGS.amd64      := $(VBOX_ASFLAGS64)
+TEMPLATE_VBoxBldProg  = VBox Build Program
+TEMPLATE_VBoxBldProg_BLD_TRG            := $(KBUILD_HOST)
+TEMPLATE_VBoxBldProg_BLD_TRG_ARCH       := $(KBUILD_HOST_ARCH)
+TEMPLATE_VBoxBldProg_BLD_TRG_CPU        := $(KBUILD_HOST_CPU)
+TEMPLATE_VBoxBldProg_DEFS               := IN_RING3 LOG_DISABLED
+TEMPLATE_VBoxBldProg_DEFS.win           := _CRT_SECURE_NO_DEPRECATE
+TEMPLATE_VBoxBldProg_ASTOOL             := $(VBOX_ASTOOL)
+TEMPLATE_VBoxBldProg_ASFLAGS.x86        := $(VBOX_ASFLAGS32)
+TEMPLATE_VBoxBldProg_ASFLAGS.amd64      := $(VBOX_ASFLAGS64)
 ifeq ($(KBUILD_HOST),win)
- TEMPLATE_VBOXBLDPROG_TOOL              := $(VBOX_VCC_TOOL_STEM)$(toupper $(KBUILD_HOST_ARCH))
- TEMPLATE_VBOXBLDPROG_SDKS              := ReorderCompilerIncs $(VBOX_WINPSDK)
- TEMPLATE_VBOXBLDPROG_CXXFLAGS          := -Zi -Zl -GR- -EHsc -GF -W3 -wd4065 -wd4244 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP) -MT$(VBOX_VCC_CRT_TYPE)
- TEMPLATE_VBOXBLDPROG_CXXFLAGS.debug    := -RTCsu
- TEMPLATE_VBOXBLDPROG_CXXFLAGS.dbgopt    = $(NO_SUCH_VARIABLE)
- TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile   = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
- TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile  = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
- TEMPLATE_VBOXBLDPROG_CFLAGS             = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS)
- TEMPLATE_VBOXBLDPROG_CFLAGS.debug       = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.debug)
- TEMPLATE_VBOXBLDPROG_CFLAGS.dbgopt      = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.dbgopt)
- TEMPLATE_VBOXBLDPROG_CFLAGS.release     = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
- TEMPLATE_VBOXBLDPROG_CFLAGS.profile     = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile)
- TEMPLATE_VBOXBLDPROG_CFLAGS.kprofile    = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile)
- TEMPLATE_VBOXBLDPROG_LDFLAGS            = \
-	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LARGEADDRESSAWARE /DEBUG \
+ TEMPLATE_VBoxBldProg_TOOL              := $(VBOX_VCC_TOOL_STEM)$(toupper $(KBUILD_HOST_ARCH))
+ TEMPLATE_VBoxBldProg_SDKS              := ReorderCompilerIncs $(VBOX_WINPSDK)
+ TEMPLATE_VBoxBldProg_CXXFLAGS          := -Zi -Zl -GR- -EHsc -GF -W3 -wd4065 -wd4244 -wd4996 -Zc:wchar_t- $(VBOX_VCC_OPT) $(VBOX_VCC_FP) -MT$(VBOX_VCC_CRT_TYPE)
+ TEMPLATE_VBoxBldProg_CXXFLAGS.debug    := -RTCsu
+ TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt    = $(NO_SUCH_VARIABLE)
+ TEMPLATE_VBoxBldProg_CXXFLAGS.profile   = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+ TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile  = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+ TEMPLATE_VBoxBldProg_CFLAGS             = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
+ TEMPLATE_VBoxBldProg_CFLAGS.debug       = $(TEMPLATE_VBoxBldProg_CXXFLAGS.debug)
+ TEMPLATE_VBoxBldProg_CFLAGS.dbgopt      = $(TEMPLATE_VBoxBldProg_CXXFLAGS.dbgopt)
+ TEMPLATE_VBoxBldProg_CFLAGS.release     = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+ TEMPLATE_VBoxBldProg_CFLAGS.profile     = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
+ TEMPLATE_VBoxBldProg_CFLAGS.kprofile    = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
+ TEMPLATE_VBoxBldProg_LDFLAGS            = \
+	/NOD /INCREMENTAL:NO /MAPINFO:EXPORTS /LargeAddressAware /DynamicBase /NxCompat /Release /Debug \
+	/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) \
 	/DISALLOWLIB:libc$(VBOX_VCC_CRT_TYPE_N).lib \
 	/DISALLOWLIB:libcmt$(VBOX_VCC_CRT_TYPE_N).lib \
 	/DISALLOWLIB:msvcrt.lib \
 	/DISALLOWLIB:msvcrtd.lib \
 	/DISALLOWLIB:msvcprt.lib \
 	/DISALLOWLIB:msvcprtd.lib
- TEMPLATE_VBOXBLDPROG_LIBS               = \
-	$(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/oldnames.lib \
-	$(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
-	$(PATH_TOOL_$(TEMPLATE_VBOXBLDPROG_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
+ TEMPLATE_VBoxBldProg_LIBS               = \
+	$(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/oldnames.lib \
+	$(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcmt$(VBOX_VCC_CRT_TYPE).lib \
+	$(PATH_TOOL_$(TEMPLATE_VBoxBldProg_TOOL)_LIB)/libcpmt$(VBOX_VCC_CRT_TYPE).lib
 
 else
 # (gcc of some kind )
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX3
-TEMPLATE_VBOXBLDPROG_CFLAGS              = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros)
-TEMPLATE_VBOXBLDPROG_CFLAGS.x86          = -m32
-TEMPLATE_VBOXBLDPROG_CFLAGS.sparc32      = -m32
-TEMPLATE_VBOXBLDPROG_CFLAGS.amd64        = -m64
-TEMPLATE_VBOXBLDPROG_CFLAGS.sparc64      = -m64
-TEMPLATE_VBOXBLDPROG_CFLAGS.release      = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
-TEMPLATE_VBOXBLDPROG_CFLAGS.profile      = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile)
-TEMPLATE_VBOXBLDPROG_CFLAGS.kprofile     = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile)
-TEMPLATE_VBOXBLDPROG_CXXFLAGS            = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros)
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.x86        = -m32
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.sparc32    = -m32
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.amd64      = -m64
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.sparc64    = -m64
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.release    = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile    = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile   = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS           = $(TEMPLATE_VBOXBLDPROG_CFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.x86       = $(TEMPLATE_VBOXBLDPROG_CFLAGS.x86)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.amd64     = $(TEMPLATE_VBOXBLDPROG_CFLAGS.amd64)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.release   = $(TEMPLATE_VBOXBLDPROG_CFLAGS.release)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.profile   = $(TEMPLATE_VBOXBLDPROG_CFLAGS.profile)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.kprofile  = $(TEMPLATE_VBOXBLDPROG_CFLAGS.kprofile)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS         = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.x86     = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.x86)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.amd64   = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.amd64)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.release = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.release)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.profile = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.profile)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.kprofile= $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.kprofile)
-TEMPLATE_VBOXBLDPROG_LDFLAGS.x86         = -m32
-TEMPLATE_VBOXBLDPROG_LDFLAGS.sparc32     = -m32
-TEMPLATE_VBOXBLDPROG_LDFLAGS.amd64       = -m64
-TEMPLATE_VBOXBLDPROG_LDFLAGS.sparc64     = -m64
+TEMPLATE_VBoxBldProg_TOOL                = GXX3
+TEMPLATE_VBoxBldProg_CFLAGS              = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_C) $(VBOX_GCC_Wno-variadic-macros)
+TEMPLATE_VBoxBldProg_CFLAGS.x86          = -m32
+TEMPLATE_VBoxBldProg_CFLAGS.sparc32      = -m32
+TEMPLATE_VBoxBldProg_CFLAGS.amd64        = -m64
+TEMPLATE_VBoxBldProg_CFLAGS.sparc64      = -m64
+TEMPLATE_VBoxBldProg_CFLAGS.release      = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
+TEMPLATE_VBoxBldProg_CFLAGS.profile      = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
+TEMPLATE_VBoxBldProg_CFLAGS.kprofile     = $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
+TEMPLATE_VBoxBldProg_CXXFLAGS            = -g $(VBOX_GCC_pipe) $(VBOX_GCC_PEDANTIC_CXX) $(VBOX_GCC_Wno-variadic-macros)
+TEMPLATE_VBoxBldProg_CXXFLAGS.x86        = -m32
+TEMPLATE_VBoxBldProg_CXXFLAGS.sparc32    = -m32
+TEMPLATE_VBoxBldProg_CXXFLAGS.amd64      = -m64
+TEMPLATE_VBoxBldProg_CXXFLAGS.sparc64    = -m64
+TEMPLATE_VBoxBldProg_CXXFLAGS.release    = -O2 -fno-omit-frame-pointer -fno-strict-aliasing
+TEMPLATE_VBoxBldProg_CXXFLAGS.profile    = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile   = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+TEMPLATE_VBoxBldProg_OBJCFLAGS           = $(TEMPLATE_VBoxBldProg_CFLAGS)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.x86       = $(TEMPLATE_VBoxBldProg_CFLAGS.x86)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.amd64     = $(TEMPLATE_VBoxBldProg_CFLAGS.amd64)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.release   = $(TEMPLATE_VBoxBldProg_CFLAGS.release)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.profile   = $(TEMPLATE_VBoxBldProg_CFLAGS.profile)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.kprofile  = $(TEMPLATE_VBoxBldProg_CFLAGS.kprofile)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS         = $(TEMPLATE_VBoxBldProg_CXXFLAGS)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.x86     = $(TEMPLATE_VBoxBldProg_CXXFLAGS.x86)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.amd64   = $(TEMPLATE_VBoxBldProg_CXXFLAGS.amd64)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.release = $(TEMPLATE_VBoxBldProg_CXXFLAGS.release)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.profile = $(TEMPLATE_VBoxBldProg_CXXFLAGS.profile)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.kprofile= $(TEMPLATE_VBoxBldProg_CXXFLAGS.kprofile)
+TEMPLATE_VBoxBldProg_LDFLAGS.x86         = -m32
+TEMPLATE_VBoxBldProg_LDFLAGS.sparc32     = -m32
+TEMPLATE_VBoxBldProg_LDFLAGS.amd64       = -m64
+TEMPLATE_VBoxBldProg_LDFLAGS.sparc64     = -m64
  ifeq ($(KBUILD_HOST),linux)
-TEMPLATE_VBOXBLDPROG_LIBS                = pthread m rt dl
+TEMPLATE_VBoxBldProg_LIBS                = pthread m rt dl
  else ifeq ($(KBUILD_HOST),os2)
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX3OMF
-TEMPLATE_VBOXBLDPROG_LIBS                = socket iconv
+TEMPLATE_VBoxBldProg_TOOL                = GXX3OMF
+TEMPLATE_VBoxBldProg_LIBS                = socket iconv
  else ifeq ($(KBUILD_HOST),darwin)
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX4MACHO
+TEMPLATE_VBoxBldProg_TOOL                = GXX4MACHO
   if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.7" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "7"
-TEMPLATE_VBOXBLDPROG_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_7_DEFS)
-TEMPLATE_VBOXBLDPROG_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_7_CFLAGS) -fno-common
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
-TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS)
+TEMPLATE_VBoxBldProg_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_7_DEFS)
+TEMPLATE_VBoxBldProg_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_7_CFLAGS) -fno-common
+TEMPLATE_VBoxBldProg_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_7_CXXFLAGS)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_7_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
+TEMPLATE_VBoxBldProg_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_7_LDFLAGS)
   else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.6" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "6"
-TEMPLATE_VBOXBLDPROG_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_6_DEFS)
-TEMPLATE_VBOXBLDPROG_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_6_CFLAGS) -fno-common
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
-TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS)
+TEMPLATE_VBoxBldProg_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_6_DEFS)
+TEMPLATE_VBoxBldProg_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_6_CFLAGS) -fno-common
+TEMPLATE_VBoxBldProg_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_6_CXXFLAGS)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_6_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
+TEMPLATE_VBoxBldProg_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_6_LDFLAGS)
   else if "$(VBOX_DEF_MACOSX_VERSION_MIN)" == "10.5" || "$(VBOX_DARWIN_HOST_VERSION_MAJOR)" == "5" || defined(VBOX_MACOS_10_5_WORKAROUND)
-TEMPLATE_VBOXBLDPROG_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_5_DEFS)
-TEMPLATE_VBOXBLDPROG_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_5_CFLAGS) -fno-common
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
-TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS)
+TEMPLATE_VBoxBldProg_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_10_5_DEFS)
+TEMPLATE_VBoxBldProg_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_10_5_CFLAGS) -fno-common
+TEMPLATE_VBoxBldProg_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_10_5_CXXFLAGS)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_10_5_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
+TEMPLATE_VBoxBldProg_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_10_5_LDFLAGS)
   else
-TEMPLATE_VBOXBLDPROG_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_DEFS)
-TEMPLATE_VBOXBLDPROG_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
-TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
-TEMPLATE_VBOXBLDPROG_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
-TEMPLATE_VBOXBLDPROG_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
-TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
+TEMPLATE_VBoxBldProg_DEFS.darwin         = $(VBOX_DARWIN_DEF_SDK_DEFS)
+TEMPLATE_VBoxBldProg_CFLAGS.darwin       = $(VBOX_DARWIN_DEF_SDK_CFLAGS) -fno-common
+TEMPLATE_VBoxBldProg_CXXFLAGS.darwin     = $(VBOX_DARWIN_DEF_SDK_CXXFLAGS)
+TEMPLATE_VBoxBldProg_OBJCFLAGS.darwin    = $(VBOX_DARWIN_DEF_SDK_OBJCFLAGS) $(VBOX_GCC_PEDANTIC_C)
+TEMPLATE_VBoxBldProg_OBJCXXFLAGS.darwin  = $(VBOX_DARWIN_DEF_SDK_OBJCXXFLAGS) $(VBOX_GCC_PEDANTIC_CXX)
+TEMPLATE_VBoxBldProg_LDFLAGS.darwin      = $(VBOX_DARWIN_DEF_SDK_LDFLAGS)
   endif
-TEMPLATE_VBOXBLDPROG_LIBS                =
+TEMPLATE_VBoxBldProg_LIBS                =
  else ifeq ($(KBUILD_HOST),haiku)
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX3
-TEMPLATE_VBOXBLDPROG_LIBS                = network iconv
-TEMPLATE_VBOXBLDPROG_LIBPATH            += \
+TEMPLATE_VBoxBldProg_TOOL                = GXX3
+TEMPLATE_VBoxBldProg_LIBS                = network iconv
+TEMPLATE_VBoxBldProg_LIBPATH            += \
 	/boot/common/lib
  else if1of ($(KBUILD_HOST), freebsd netbsd openbsd)
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX3
-TEMPLATE_VBOXBLDPROG_LIBS                = pthread
-TEMPLATE_VBOXBLDPROG_INCS               += \
+TEMPLATE_VBoxBldProg_TOOL                = GXX3
+TEMPLATE_VBoxBldProg_LIBS                = pthread
+TEMPLATE_VBoxBldProg_INCS               += \
 	/usr/include \
 	/usr/X11R6/include \
 	/usr/local/include
-TEMPLATE_VBOXBLDPROG_LIBPATH            += \
+TEMPLATE_VBoxBldProg_LIBPATH            += \
 	/usr/lib \
 	/usr/X11R6/lib \
 	/usr/local/lib
  else ifeq ($(KBUILD_HOST),solaris)
-TEMPLATE_VBOXBLDPROG_TOOL                = GXX3PLAIN
-TEMPLATE_VBOXBLDPROG_LIBS                = rt
+TEMPLATE_VBoxBldProg_TOOL                = GXX3PLAIN
+TEMPLATE_VBoxBldProg_LIBS                = rt
  else
 $(warning Warning: VBOX Build: Target $(KBUILD_HOST) is not officially supported!)
  endif
@@ -4899,16 +5051,16 @@ endif # !win
 
 
 #
-# Advanced build programs using IPRT, openssl and worse stuff.
+# Advanced build programs using IPRT and stuff.
 #
 TEMPLATE_VBoxAdvBldProg = Advanced VBox Build Program
-TEMPLATE_VBoxAdvBldProg_EXTENDS = VBOXBLDPROG
-TEMPLATE_VBoxAdvBldProg_SDKS    = $(TEMPLATE_VBOXBLDPROG_SDKS) VBOX_BLD_OPENSSL
-TEMPLATE_VBoxAdvBldProg_SDKS.win= $(TEMPLATE_VBOXBLDPROG_SDKS.win) VBOX_NTDLL
-TEMPLATE_VBoxAdvBldProg_DEFS    = $(TEMPLATE_VBOXBLDPROG_DEFS) IN_RT_R3
+TEMPLATE_VBoxAdvBldProg_EXTENDS = VBoxBldProg
+TEMPLATE_VBoxAdvBldProg_SDKS    = $(TEMPLATE_VBoxBldProg_SDKS)
+TEMPLATE_VBoxAdvBldProg_SDKS.win= $(TEMPLATE_VBoxBldProg_SDKS.win) VBOX_NTDLL
+TEMPLATE_VBoxAdvBldProg_DEFS    = $(TEMPLATE_VBoxBldProg_DEFS) IN_RT_R3
 ifeq ($(KBUILD_HOST),win)
- TEMPLATE_VBoxAdvBldProg_CFLAGS = $(TEMPLATE_VBOXBLDPROG_CFLAGS) $(VBOX_VCC_WERR)
- TEMPLATE_VBoxAdvBldProg_CXXFLAGS = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS) $(VBOX_VCC_WERR)
+ TEMPLATE_VBoxAdvBldProg_CFLAGS = $(TEMPLATE_VBoxBldProg_CFLAGS) $(VBOX_VCC_WERR)
+ TEMPLATE_VBoxAdvBldProg_CXXFLAGS = $(TEMPLATE_VBoxBldProg_CXXFLAGS) $(VBOX_VCC_WERR)
 endif
 TEMPLATE_VBoxAdvBldProg_LIBS    = \
 	$(PATH_STAGE_LIB)/RuntimeBldProg$(VBOX_SUFF_LIB) \
@@ -4916,28 +5068,28 @@ TEMPLATE_VBoxAdvBldProg_LIBS    = \
 		$(PATH_STAGE_LIB)/VBox-kStuffStaticBldProg$(VBOX_SUFF_LIB) \
 		$(PATH_STAGE_LIB)/RuntimeBldProg$(VBOX_SUFF_LIB) \
 	,) \
-	$(TEMPLATE_VBOXBLDPROG_LIBS)
+	$(TEMPLATE_VBoxBldProg_LIBS)
 TEMPLATE_VBoxAdvBldProg_LIBS.darwin = \
-	$(TEMPLATE_VBOXBLDPROG_LIBS) \
+	$(TEMPLATE_VBoxAdvBldProg_LIBS) \
 	iconv \
-	$(TEMPLATE_VBOXBLDPROG_LIBS.darwin)
+	$(TEMPLATE_VBoxBldProg_LIBS.darwin)
 TEMPLATE_VBoxAdvBldProg_LIBS.freebsd = \
-	$(TEMPLATE_VBOXBLDPROG_LIBS) \
+	$(TEMPLATE_VBoxAdvBldProg_LIBS) \
 	iconv \
 	rt \
-	$(TEMPLATE_VBOXBLDPROG_LIBS.freebsd)
+	$(TEMPLATE_VBoxBldProg_LIBS.freebsd)
 TEMPLATE_VBoxAdvBldProg_LIBS.linux = \
-	$(TEMPLATE_VBOXBLDPROG_LIBS) \
+	$(TEMPLATE_VBoxAdvBldProg_LIBS) \
 	crypt \
-	$(TEMPLATE_VBOXBLDPROG_LIBS.linux)
+	$(TEMPLATE_VBoxBldProg_LIBS.linux)
 TEMPLATE_VBoxAdvBldProg_LIBS.solaris = \
-	$(TEMPLATE_VBOXBLDPROG_LIBS) \
+	$(TEMPLATE_VBoxAdvBldProg_LIBS) \
 	contract \
 	kstat \
 	rt \
 	socket \
 	nsl \
-	$(TEMPLATE_VBOXBLDPROG_LIBS.solaris)
+	$(TEMPLATE_VBoxBldProg_LIBS.solaris)
 
 
 #
@@ -5529,7 +5681,7 @@ endif
 SVN                    ?= svn$(HOSTSUFF_EXE)
 VBOX_SVN_REV_KMK        = $(PATH_OUT)/revision.kmk
 ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 93733 $  )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,,  $Rev: 95030 $  )
  VBOX_SVN_DEP          := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries))
  ifeq ($(which $(SVN)),)
   VBOX_SVN_DEP         :=
diff --git a/Makefile.kmk b/Makefile.kmk
index f0457c6..4f326b4 100644
--- a/Makefile.kmk
+++ b/Makefile.kmk
@@ -21,10 +21,12 @@ include $(KBUILD_PATH)/subheader.kmk
 #
 # Sub-makefiles / Sub-directories.
 #
-if defined(VBOX_WITH_DOCS) && (!defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_DOCS) || defined(VBOX_ONLY_SDK))
- include $(PATH_SUB_CURRENT)/doc/manual/Makefile.kmk
+ifndef VBOX_ONLY_ROOT_MAKEFILE
+ if defined(VBOX_WITH_DOCS) && (!defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_DOCS) || defined(VBOX_ONLY_SDK))
+  include $(PATH_SUB_CURRENT)/doc/manual/Makefile.kmk
+ endif
+ include $(PATH_SUB_CURRENT)/src/Makefile.kmk
 endif
-include $(PATH_SUB_CURRENT)/src/Makefile.kmk
 
 #
 # Below we might need TOOL_ZIP_UNPACK (for the additions/docs/efifw packages
@@ -90,10 +92,10 @@ if1of ($(KBUILD_TARGET), win os2)
  ifdef VBOX_WITH_VBOXSDL
   include $(KBUILD_PATH)/sdks/LIBSDL.kmk
   InstallExternalLibs_SOURCES += \
-	$(DLL_SDK_LIBSDL_SDL)
+	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(DLL_SDK_LIBSDL_SDL))
   ifdef VBOX_WITH_SECURELABEL
    InstallExternalLibs_SOURCES += \
-	$(DLL_SDK_LIBSDL_SDLTTF)
+	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(DLL_SDK_LIBSDL_SDLTTF))
   endif
   ifeq ($(KBUILD_TARGET),os2)
    InstallExternalLibs_SOURCES += \
@@ -105,31 +107,34 @@ endif
 
 # The compiler runtime DLLs.
 ifeq ($(KBUILD_TARGET).$(VBOX_WITHOUT_COMPILER_REDIST),win.)
-  VBOX_PATH_VCC_REDIST         = $(PATH_TOOL_$(VBOX_VCC_TOOL))/redist/
-  VBOX_PATH_VCC_REDIST_CRT     = $(VBOX_PATH_VCC_REDIST)/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.CRT
-  VBOX_PATH_VCC_REDIST_CRT_DBG = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.DebugCRT
-  InstallExternalLibs_SOURCES += \
-  	$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+ include $(KBUILD_PATH)/tools/$(VBOX_VCC_TOOL).kmk
+ include $(KBUILD_PATH)/tools/$(VBOX_VCC_TOOL_STEM)X86.kmk
+ VBOX_PATH_VCC_REDIST             = $(PATH_TOOL_$(VBOX_VCC_TOOL))/redist/
+ VBOX_PATH_VCC_REDIST_CRT         = $(VBOX_PATH_VCC_REDIST)/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.CRT
+ VBOX_PATH_VCC_REDIST_CRT_DBG     = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/$(subst amd64,x64,$(KBUILD_TARGET_ARCH))/Microsoft.VC100.DebugCRT
+ VBOX_PATH_VCC_REDIST_CRT_X86     = $(VBOX_PATH_VCC_REDIST)/x86/Microsoft.VC100.CRT
+ VBOX_PATH_VCC_REDIST_CRT_DBG_X86 = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
+
+ InstallExternalLibs_SOURCES += \
+ 	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ 	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+ 	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+ 	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
  ifdef VBOX_WITH_32_ON_64_MAIN_API
-  VBOX_PATH_VCC_REDIST_CRT_X86 = $(VBOX_PATH_VCC_REDIST)/x86/Microsoft.VC100.CRT
-  VBOX_PATH_VCC_REDIST_CRT_DBG_X86 = $(VBOX_PATH_VCC_REDIST)/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
   InstallExternalLibs_SOURCES += \
-  	$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
  endif
  ifeq ($(VBOX_VCC_CRT_TYPE),d)
   InstallExternalLibs_SOURCES += \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll) \
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>testcase/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
   ifdef VBOX_WITH_32_ON_64_MAIN_API
   InstallExternalLibs_SOURCES += \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
-  	$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcr$(substr $(VBOX_VCC_TOOL_STEM),4).dll \
+  	$(call VBOX_RE_SIGN_DLL_FN,InstallExternalLibs,$(VBOX_PATH_VCC_REDIST_CRT_DBG_X86)/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll)=>x86/msvcp$(substr $(VBOX_VCC_TOOL_STEM),4).dll
   endif
  endif
 endif
@@ -167,8 +172,8 @@ else
    qt4-bin_MODE = 755
    qt4-bin_INST = $(INST_BIN)
    qt4-bin_SOURCES = \
-	$(foreach qtmod,$(VBOX_QT4_MOD_NAMES),$(VBOX_PATH_QT4_LIB)/$(qtmod)4$(SUFF_DLL)) \
- 	$(VBOX_PATH_QT4)/plugins/accessible/qtaccessiblewidgets4$(SUFF_DLL)=>accessible/qtaccessiblewidgets4$(SUFF_DLL)
+   	$(foreach qtmod,$(VBOX_QT4_MOD_NAMES),$(call VBOX_RE_SIGN_DLL_FN,qt4-bin,$(VBOX_PATH_QT4_LIB)/$(qtmod)4$(SUFF_DLL))) \
+   	$(call VBOX_RE_SIGN_DLL_FN,qt4-bin,$(VBOX_PATH_QT4)/plugins/accessible/qtaccessiblewidgets4$(SUFF_DLL))=>accessible/qtaccessiblewidgets4$(SUFF_DLL)
   else
    INSTALLS += qt4-bin
    qt4-bin_MODE = 755
diff --git a/configure b/configure
index 126e782..83fa74c 100755
--- a/configure
+++ b/configure
@@ -420,9 +420,9 @@ check_gcc()
       elif [ $cc_maj -lt 3 \
              -o \( $cc_maj -eq 3 -a $cc_min -lt 2 \) \
              -o \( $cc_maj -eq 4 -a $cc_min -lt 1 -a "$OS" != "darwin" \) \
-             -o \( $cc_maj -eq 4 -a $cc_min -gt 8 \) \
+             -o \( $cc_maj -eq 4 -a $cc_min -gt 9 \) \
              -o $cc_maj -gt 4 ]; then
-        log_failure "gcc version $cc_ver found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<8"
+        log_failure "gcc version $cc_ver found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<10"
         fail really
       else
         log_success "found version $cc_ver"
diff --git a/doc/manual/Makefile.kmk b/doc/manual/Makefile.kmk
index 4411d06..29bd67b 100644
--- a/doc/manual/Makefile.kmk
+++ b/doc/manual/Makefile.kmk
@@ -64,14 +64,8 @@ BLDDIRS += $(VBOX_PATH_MANUAL_OUTBASE)
 #  Main targets
 #
 ##########################################################################################
-ifdef VBOX_WITH_DOCS
- # Default language
- VBOX_MANUAL_LANGUAGES = en_US
-
- ifdef VBOX_WITH_DOCS_TRANSLATIONS
-  VBOX_MANUAL_ADD_LANGUAGES = fr_FR
- endif
 
+ifdef VBOX_WITH_DOCS
  if defined(VBOX_ONLY_SDK) || defined(VBOX_WITH_DOCS_SDKREF)
   ## @todo make this an install target, drop the BLDDIRS.
   OTHERS += \
diff --git a/doc/manual/en_US/SDKRef.xml b/doc/manual/en_US/SDKRef.xml
index e8c63cc..8f773c5 100644
--- a/doc/manual/en_US/SDKRef.xml
+++ b/doc/manual/en_US/SDKRef.xml
@@ -4519,6 +4519,16 @@ AuthResult AUTHCALL AuthEntry(
               </listitem>
 
               <listitem>
+                <para><computeroutput>IMachine::deleteSettings</computeroutput>
+                has been replaced by IMachine::delete, which allows specifying
+                which disk images are to be deleted as part of the deletion,
+                and because it can take a while it also returns a
+                <computeroutput>IProgress</computeroutput> object reference,
+                so that the completion of the asynchronous activities can be
+                monitored.</para>
+              </listitem>
+
+              <listitem>
                 <para><computeroutput>IConsole::forgetSavedState</computeroutput>
                 has been renamed to <xref
                 linkend="IConsole__discardSavedState"
diff --git a/doc/manual/en_US/user_Frontends.xml b/doc/manual/en_US/user_Frontends.xml
index d98fa5b..d4519b9 100644
--- a/doc/manual/en_US/user_Frontends.xml
+++ b/doc/manual/en_US/user_Frontends.xml
@@ -361,11 +361,10 @@
 
       <para>To make a remote USB device available to a VM,
       <computeroutput>rdesktop-vrdp</computeroutput> should be started as
-      follows:<screen>rdesktop-vrdp -r usb -a 16 -N my.host.address</screen>Note
-      that <computeroutput>rdesktop-vrdp</computeroutput> can access USB
-      devices only through <computeroutput>/proc/bus/usb</computeroutput>.
+      follows:<screen>rdesktop-vrdp -r usb -a 16 -N my.host.address</screen>
       Please refer to <xref linkend="ts_usb-linux" /> for further details on how
-      to properly set up the permissions. Furthermore it is advisable to
+      to properly set up the permissions for USB devices. Furthermore it is
+      advisable to
       disable automatic loading of any host driver on the remote host which
       might work on USB devices to ensure that the devices are accessible by
       the RDP client. If the setup was properly done on the remote host,
diff --git a/doc/manual/en_US/user_Installation.xml b/doc/manual/en_US/user_Installation.xml
index aa1ffd9..3d10e76 100644
--- a/doc/manual/en_US/user_Installation.xml
+++ b/doc/manual/en_US/user_Installation.xml
@@ -708,7 +708,7 @@ virtualbox virtualbox/delete-old-modules boolean true</screen>The first line
       <title>Performing the installation</title>
 
       <para>VirtualBox is available as a standard Solaris package. Download
-      the VirtualBox SunOS package which includes both the 32-bit and 64-bit
+      the VirtualBox SunOS package which includes the 64-bit
       versions of VirtualBox. <emphasis>The installation must be performed as
       root and from the global zone</emphasis> as the VirtualBox installer
       loads kernel drivers which cannot be done from non-global zones. To
diff --git a/doc/manual/en_US/user_VBoxManage.xml b/doc/manual/en_US/user_VBoxManage.xml
index 95d6c25..131b689 100644
--- a/doc/manual/en_US/user_VBoxManage.xml
+++ b/doc/manual/en_US/user_VBoxManage.xml
@@ -469,6 +469,21 @@ Statistics update:  disabled</screen></para>
           </listitem>
 
           <listitem>
+            <para><computeroutput>--groups <group>, ...</computeroutput>:
+            This changes the group membership of a VM. Groups always start with
+            a <computeroutput>/</computeroutput> and can be nested. By default
+            VMs are in group <computeroutput>/</computeroutput>.</para>
+          </listitem>
+
+          <listitem>
+            <para><computeroutput>--description <desc></computeroutput>:
+            This changes the VM's description, which is a way to record details
+            about the VM in a way which is meaningful for the user. The GUI
+            interprets HTML formatting, the command line allows arbitrary
+            strings potentially containing multiple lines.</para>
+          </listitem>
+
+          <listitem>
             <para><computeroutput>--ostype <ostype></computeroutput>:
             This specifies what guest operating system is supposed to run in
             the VM. To learn about the various identifiers that can be used
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index 9695cf5..9bf9140 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -1,6 +1,191 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
   <sect1>
+    <title>Version 4.3.14 (2014-07-15)</title>
+
+    <para>This is a maintenance release. The following items were fixed and/or
+      added:</para>
+
+    <itemizedlist>
+
+      <listitem>
+        <para>VMM: more fixes for MSR emulation on certain hardware (bugs
+          #12784, #12949, #13034)</para>
+      </listitem>
+
+      <listitem>
+        <para>VMM: improve MSI handling under rare circumstances (only
+          relevant for the ICH9 chipset)</para>
+      </listitem>
+
+      <listitem>
+        <para>VMM: fixed #UD exception for 64-bit guests with the EFER.SCE bit
+          and the <emphasis>SYSCALL</emphasis> instruction (VT-x only;
+          4.3 regression; bug #13008)</para>
+      </listitem>
+
+      <listitem>
+        <para>VMM: fixed timekeeping after resuming SMP guests</para>
+      </listitem>
+
+      <listitem>
+        <para>VMM: properly wake up a halted VCPU on NMI/SMI</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed a potential crash</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed stuck AltGr key on Windows hosts (bug #2537)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed a potential error during the version check</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: shortcut change should not require Enter/Return (or other
+          trigger) to confirm (bugs #12828, #12847, #12937, #13087)</para>
+      </listitem>
+
+      <listitem>
+        <para>GUI: fixed update check which was broken due to changing the
+          location of the root certificates (bug #13096)</para>
+      </listitem>
+
+      <listitem>
+        <para>VBoxManage: fixed typo in <emphasis>showvminfo --machinereadable</emphasis>
+          (bug #13176)</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT: fixed inbound half-close (bug #13116)</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT: fixed slow upload speed under certain conditions
+          (bug #10034)</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed potential loss of inbound TCP data</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed potential infinite stalls of TCP
+          connections over IPv6</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed resets of TCP connections on Windows
+          hosts</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed inbound half-close on Mac OS X hosts</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed socket leak on Solaris hosts</para>
+      </listitem>
+
+      <listitem>
+        <para>NAT Network: fixed ping of mapped host loopback on Mac OS X
+          and Solaris hosts, fixed proxying of IMCP errors on Mac OS X</para>
+      </listitem>
+
+      <listitem>
+        <para>Host-Only Network: fixed SNMP <emphasis>ifConnectorPresent</emphasis>
+          value on Windows (bug #13143)</para>
+      </listitem>
+
+      <listitem>
+        <para>Storage: fixed a possible crash with CD/DVD passthrough under
+          certain circumstances</para>
+      </listitem>
+
+      <listitem>
+        <para>Storage: fixed a crash when trying to open an inaccessible QED
+          or QCOW image (bug #12613)</para>
+      </listitem>
+
+      <listitem>
+        <para>Storage: fixed data corruption or read errors under rare
+          circumstances</para>
+      </listitem>
+
+      <listitem>
+        <para>AHCI: fixed a crash under rare circumstances</para>
+      </listitem>
+
+      <listitem>
+        <para>USB: performance fixes</para>
+      </listitem>
+
+      <listitem>
+        <para>ICH9: properly reset MSI capability on reset</para>
+      </listitem>
+
+      <listitem>
+        <para>Keyboard: active modifier keys during suspend were stuck after
+          resuming the host</para>
+      </listitem>
+
+      <listitem>
+        <para>3D: fixed misbehavior with huge guests (i.e. guest more than
+          4GB guest memory</para>
+      </listitem>
+
+      <listitem>
+        <para>3D: several fixes</para>
+      </listitem>
+
+      <listitem>
+        <para>API: properly detect the Windows 8.1 guest OS type (bug #13090)</para>
+      </listitem>
+
+      <listitem>
+        <para>ExtPack: cleanup of dangling uninstallation directories</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux hosts / guests: compile fix for EL7 (bug #12638)</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux Additions: made 3D pass-through work with recent versions
+          of Mesa in the guest (bug #12941)</para>
+      </listitem>
+
+      <listitem>
+        <para>Linux Additions: Linux 3.16 fixes (bug #13123)</para>
+      </listitem>
+
+      <listitem>
+        <para>Mac OS X hosts: when scanning for host CD/DVD devices also consider
+          BlueRay devices</para>
+      </listitem>
+
+      <listitem>
+        <para>OS/2 Additions: fixed gengradd.dll library name (bug #12785)</para>
+      </listitem>
+
+      <listitem>
+        <para>Solaris Additions: fixed permissions of files and directories
+        located on shared folders</para>
+      </listitem>
+
+      <listitem>
+        <para>Windows host installer: fixed the need for rebooting Windows after
+          installation or upgrade, extended logging for NetFlt/NetAdp (un)installation</para>
+      </listitem>
+
+    </itemizedlist>
+
+  </sect1>
+
+  <sect1>
     <title>Version 4.3.12 (2014-05-16)</title>
 
     <para>This is a maintenance release. The following items were fixed and/or
@@ -24,7 +209,7 @@
       </listitem>
 
       <listitem>
-        <para>VMM: more fixes for MSR emulation on certain hardware (tickets #12240,
+        <para>VMM: more fixes for MSR emulation on certain hardware (bugs #12240,
           #12875)</para>
       </listitem>
 
diff --git a/include/Makefile.kmk b/include/Makefile.kmk
index 82f278d..17cf0aa 100644
--- a/include/Makefile.kmk
+++ b/include/Makefile.kmk
@@ -94,6 +94,7 @@ hdrs.rc   := $(filter-out \
 	VBox/vmm/gvm.h \
 	iprt/thread.h \
 	iprt/mem.h \
+	iprt/memsafer.h \
 	iprt/alloc.h \
 	$(r3_cpp_hdrs) \
 	$(r3_only_hdrs) \
diff --git a/include/VBox/HGSMI/HGSMI.h b/include/VBox/HGSMI/HGSMI.h
index c34f190..a52747f 100644
--- a/include/VBox/HGSMI/HGSMI.h
+++ b/include/VBox/HGSMI/HGSMI.h
@@ -144,6 +144,11 @@ typedef struct _HGSMIBUFFERTAIL
 AssertCompile(sizeof (HGSMIBUFFERHEADER) == 16);
 AssertCompile(sizeof (HGSMIBUFFERTAIL) == 8);
 
+/* Heap types. */
+#define HGSMI_HEAP_TYPE_NULL    0 /* Heap not initialized. */
+#define HGSMI_HEAP_TYPE_POINTER 1 /* Deprecated. RTHEAPSIMPLE. */
+#define HGSMI_HEAP_TYPE_OFFSET  2 /* Deprecated. RTHEAPOFFSET. */
+#define HGSMI_HEAP_TYPE_MA      3 /* Memory allocator. */
 
 #pragma pack(1)
 typedef struct _HGSMIHEAP
diff --git a/include/VBox/HostServices/VBoxCrOpenGLSvc.h b/include/VBox/HostServices/VBoxCrOpenGLSvc.h
index e09f9a2..a16635c 100644
--- a/include/VBox/HostServices/VBoxCrOpenGLSvc.h
+++ b/include/VBox/HostServices/VBoxCrOpenGLSvc.h
@@ -59,7 +59,8 @@
 #define SHCRGL_GUEST_FN_SET_PID     (12)
 #define SHCRGL_GUEST_FN_WRITE_BUFFER        (13)
 #define SHCRGL_GUEST_FN_WRITE_READ_BUFFERED (14)
-#define SHCRGL_GUEST_FN_GET_CAPS            (15)
+#define SHCRGL_GUEST_FN_GET_CAPS_LEGACY     (15)
+#define SHCRGL_GUEST_FN_GET_CAPS_NEW     (16)
 
 /* Parameters count */
 #define SHCRGL_CPARMS_SET_CONSOLE (1)
@@ -79,12 +80,14 @@
 #define SHCRGL_CPARMS_CRCMD_NOTIFY_CMDS (0)
 #define SHCRGL_CPARMS_VIEWPORT_CHANGED (5)
 #define SHCRGL_CPARMS_VIEWPORT_CHANGED2 (1)
-#define SHCRGL_CPARMS_GET_CAPS (1)
+#define SHCRGL_CPARMS_GET_CAPS_LEGACY (1)
+#define SHCRGL_CPARMS_GET_CAPS_NEW (1)
 
 /* @todo Move to H3DOR.h begin */
 
 /* Names of supported output redirect formats. */
 #define H3DOR_FMT_RGBA_TOPDOWN "H3DOR_FMT_RGBA_TOPDOWN"
+#define H3DOR_FMT_RGBA "H3DOR_FMT_RGBA"
 
 /* Comma separated list of output formats supported by the output redirect target. */
 #define H3DOR_PROP_FORMATS 0
diff --git a/include/VBox/VBoxGuest.h b/include/VBox/VBoxGuest.h
index 62dfe1f..9c025eb 100644
--- a/include/VBox/VBoxGuest.h
+++ b/include/VBox/VBoxGuest.h
@@ -508,6 +508,28 @@ typedef VBOXGUESTOS2IDCCONNECT *PVBOXGUESTOS2IDCCONNECT;
 
 #endif /* RT_OS_OS2 */
 
+#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS) || defined(RT_OS_FREEBSD)
+
+/* Private IOCtls between user space and the kernel video driver.  DRM private
+ * IOCtls always have the type 'd' and a number between 0x40 and 0x99 (0x9F?) */
+
+# define VBOX_DRM_IOCTL(a) (0x40 + DRM_VBOX_ ## a)
+
+/** Stop using HGSMI in the kernel driver until it is re-enabled, so that a
+ *  user-space driver can use it.  It must be re-enabled before the kernel
+ *  driver can be used again in a sensible way. */
+/** @note These are only implemented on Linux currently and should fail
+ *        silently on other platforms. */
+# define DRM_VBOX_DISABLE_HGSMI    0
+# define DRM_IOCTL_VBOX_DISABLE_HGSMI    VBOX_DRM_IOCTL(DISABLE_HGSMI)
+# define VBOXVIDEO_IOCTL_DISABLE_HGSMI   _IO('d', DRM_IOCTL_VBOX_DISABLE_HGSMI)
+/** Enable HGSMI in the kernel driver after it was previously disabled. */
+# define DRM_VBOX_ENABLE_HGSMI     1
+# define DRM_IOCTL_VBOX_ENABLE_HGSMI     VBOX_DRM_IOCTL(ENABLE_HGSMI)
+# define VBOXVIDEO_IOCTL_ENABLE_HGSMI    _IO('d', DRM_IOCTL_VBOX_ENABLE_HGSMI)
+
+#endif /* RT_OS_LINUX || RT_OS_SOLARIS || RT_OS_FREEBSD */
+
 /** @} */
 #endif /* !defined(IN_RC) && !defined(IN_RING0_AGNOSTIC) && !defined(IPRT_NO_CRT) */
 
diff --git a/include/VBox/VBoxVideo.h b/include/VBox/VBoxVideo.h
index 9d499e5..cc148c4 100644
--- a/include/VBox/VBoxVideo.h
+++ b/include/VBox/VBoxVideo.h
@@ -1452,13 +1452,19 @@ typedef struct PDMIDISPLAYVBVACALLBACKS *HCRHGSMICMDCOMPLETION;
 typedef DECLCALLBACK(int) FNCRHGSMICMDCOMPLETION(HCRHGSMICMDCOMPLETION hCompletion, PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc);
 typedef FNCRHGSMICMDCOMPLETION *PFNCRHGSMICMDCOMPLETION;
 
+/* tells whether 3D backend has some 3D overlay data displayed */
 typedef DECLCALLBACK(bool) FNCROGLHASDATA(void);
 typedef FNCROGLHASDATA *PFNCROGLHASDATA;
 
+/* same as PFNCROGLHASDATA, but for specific screen */
+typedef DECLCALLBACK(bool) FNCROGLHASDATAFORSCREEN(uint32_t i32ScreenID);
+typedef FNCROGLHASDATAFORSCREEN *PFNCROGLHASDATAFORSCREEN;
+
 /* callbacks chrogl gives to main */
 typedef struct CR_MAIN_INTERFACE
 {
     PFNCROGLHASDATA pfnHasData;
+    PFNCROGLHASDATAFORSCREEN pfnHasDataForScreen;
 } CR_MAIN_INTERFACE;
 
 typedef struct VBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP_MAINCB
@@ -1569,7 +1575,7 @@ typedef struct VBOXVDMACMD_CHROMIUM_CTL_CRCONNECT
 #define VBOXCMDVBVA_OPTYPE_CRCMD                        1
 /* blit command that does blitting of allocations identified by VRAM offset or host id
  * for VRAM-offset ones the size and format are same as primary */
-#define VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID       2
+#define VBOXCMDVBVA_OPTYPE_BLT                          2
 /* flip */
 #define VBOXCMDVBVA_OPTYPE_FLIP                         3
 /* ColorFill */
@@ -1580,25 +1586,41 @@ typedef struct VBOXVDMACMD_CHROMIUM_CTL_CRCONNECT
 #define VBOXCMDVBVA_OPTYPE_PAGING_FILL                  6
 /* same as VBOXCMDVBVA_OPTYPE_NOP, but contains VBOXCMDVBVA_HDR data */
 #define VBOXCMDVBVA_OPTYPE_NOPCMD                       7
+/* actual command is stored in guest system memory */
+#define VBOXCMDVBVA_OPTYPE_SYSMEMCMD                    8
+/* complex command - i.e. can contain multiple commands
+ * i.e. the VBOXCMDVBVA_OPTYPE_COMPLEXCMD VBOXCMDVBVA_HDR is followed
+ * by one or more VBOXCMDVBVA_HDR commands.
+ * Each command's size is specified in it's VBOXCMDVBVA_HDR's u32FenceID field */
+#define VBOXCMDVBVA_OPTYPE_COMPLEXCMD                   9
 
 /* nop - is a one-bit command. The buffer size to skip is determined by VBVA buffer size */
 #define VBOXCMDVBVA_OPTYPE_NOP                          0x80
 
 /* u8Flags flags */
-/* source allocation is specified with the host id. if not set - source allocation is specified with VRAM offset */
-#define VBOXCMDVBVA_OPF_ALLOC_SRCID                     0x80
-/* destination allocation is specified with the host id. if not set - destination allocation is specified with VRAM offset */
-#define VBOXCMDVBVA_OPF_ALLOC_DSTID                     0x40
-
 /* transfer from RAM to Allocation */
-#define VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN              0x20
+#define VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN                  0x80
+
+#define VBOXCMDVBVA_OPF_BLT_TYPE_SAMEDIM_A8R8G8B8           0
+#define VBOXCMDVBVA_OPF_BLT_TYPE_GENERIC_A8R8G8B8           1
+#define VBOXCMDVBVA_OPF_BLT_TYPE_OFFPRIMSZFMT_OR_ID         2
+
+#define VBOXCMDVBVA_OPF_BLT_TYPE_MASK                       3
+
 
-/* VBOXCMDVBVA_OPTYPE_BLT_PRIMARY specific flags*/
-/* if set - src is a primary id */
-#define VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY               0x20
-/* if set - dst is a primary id */
-#define VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY               0x10
+#define VBOXCMDVBVA_OPF_CLRFILL_TYPE_GENERIC_A8R8G8B8       0
 
+#define VBOXCMDVBVA_OPF_CLRFILL_TYPE_MASK                   1
+
+
+/* blit direction is from first operand to second */
+#define VBOXCMDVBVA_OPF_BLT_DIR_IN_2                        0x10
+/* operand 1 contains host id */
+#define VBOXCMDVBVA_OPF_OPERAND1_ISID                       0x20
+/* operand 2 contains host id */
+#define VBOXCMDVBVA_OPF_OPERAND2_ISID                       0x40
+/* primary hint id is src */
+#define VBOXCMDVBVA_OPF_PRIMARY_HINT_SRC                    0x80
 
 /* trying to make the header as small as possible,
  * we'd have pretty few op codes actually, so 8bit is quite enough,
@@ -1609,8 +1631,7 @@ typedef struct VBOXCMDVBVA_HDR
     uint8_t u8OpCode;
     /* command-specific
      * VBOXCMDVBVA_OPTYPE_CRCMD                     - must be null
-     * VBOXCMDVBVA_OPTYPE_BLT_PRIMARY             - OR-ed VBOXCMDVBVA_OPF_ALLOC_XXX flags
-     * VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID    - OR-ed VBOXCMDVBVA_OPF_ALLOC_XXX flags
+     * VBOXCMDVBVA_OPTYPE_BLT                       - OR-ed VBOXCMDVBVA_OPF_ALLOC_XXX flags
      * VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER           - must be null
      * VBOXCMDVBVA_OPTYPE_PAGING_FILL               - must be null
      * VBOXCMDVBVA_OPTYPE_NOPCMD                    - must be null
@@ -1624,12 +1645,24 @@ typedef struct VBOXCMDVBVA_HDR
         int8_t i8Result;
         uint8_t u8PrimaryID;
     } u;
-    /* DXGK DDI fence ID */
-    volatile uint32_t u32FenceID;
+    union
+    {
+        /* complex command (VBOXCMDVBVA_OPTYPE_COMPLEXCMD) element data */
+        struct
+        {
+            /* command length */
+            uint16_t u16CbCmdHost;
+            /* guest-specific data, host expects it to be NULL */
+            uint16_t u16CbCmdGuest;
+        } complexCmdEl;
+        /* DXGK DDI fence ID */
+        uint32_t u32FenceID;
+    } u2;
 } VBOXCMDVBVA_HDR;
 
 typedef uint32_t VBOXCMDVBVAOFFSET;
 typedef uint64_t VBOXCMDVBVAPHADDR;
+typedef uint32_t VBOXCMDVBVAPAGEIDX;
 
 typedef struct VBOXCMDVBVA_CRCMD_BUFFER
 {
@@ -1658,6 +1691,13 @@ typedef struct VBOXCMDVBVA_ALLOCINFO
     } u;
 } VBOXCMDVBVA_ALLOCINFO;
 
+typedef struct VBOXCMDVBVA_ALLOCDESC
+{
+    VBOXCMDVBVA_ALLOCINFO Info;
+    uint16_t u16Width;
+    uint16_t u16Height;
+} VBOXCMDVBVA_ALLOCDESC;
+
 typedef struct VBOXCMDVBVA_RECT
 {
    /** Coordinates of affected rectangle. */
@@ -1673,38 +1713,85 @@ typedef struct VBOXCMDVBVA_POINT
    int16_t y;
 } VBOXCMDVBVA_POINT;
 
-typedef struct VBOXCMDVBVA_BLT_PRIMARY
+typedef struct VBOXCMDVBVA_BLT_HDR
 {
     VBOXCMDVBVA_HDR Hdr;
-    VBOXCMDVBVA_ALLOCINFO alloc;
     VBOXCMDVBVA_POINT Pos;
+} VBOXCMDVBVA_BLT_HDR;
+
+typedef struct VBOXCMDVBVA_BLT_PRIMARY
+{
+    VBOXCMDVBVA_BLT_HDR Hdr;
+    VBOXCMDVBVA_ALLOCINFO alloc;
     /* the rects count is determined from the command size */
     VBOXCMDVBVA_RECT aRects[1];
 } VBOXCMDVBVA_BLT_PRIMARY;
 
+typedef struct VBOXCMDVBVA_BLT_PRIMARY_GENERIC_A8R8G8B8
+{
+    VBOXCMDVBVA_BLT_HDR Hdr;
+    VBOXCMDVBVA_ALLOCDESC alloc;
+    /* the rects count is determined from the command size */
+    VBOXCMDVBVA_RECT aRects[1];
+} VBOXCMDVBVA_BLT_PRIMARY_GENERIC_A8R8G8B8;
+
 typedef struct VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID
 {
-    VBOXCMDVBVA_HDR Hdr;
-    VBOXCMDVBVA_ALLOCINFO src;
-    VBOXCMDVBVA_ALLOCINFO dst;
-    VBOXCMDVBVA_POINT Pos;
+    VBOXCMDVBVA_BLT_HDR Hdr;
+    VBOXCMDVBVA_ALLOCINFO alloc;
+    uint32_t id;
     /* the rects count is determined from the command size */
     VBOXCMDVBVA_RECT aRects[1];
 } VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID;
 
+typedef struct VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8
+{
+    VBOXCMDVBVA_BLT_HDR Hdr;
+    VBOXCMDVBVA_ALLOCDESC alloc1;
+    VBOXCMDVBVA_ALLOCINFO info2;
+    /* the rects count is determined from the command size */
+    VBOXCMDVBVA_RECT aRects[1];
+} VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8;
+
+typedef struct VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8
+{
+    VBOXCMDVBVA_BLT_HDR Hdr;
+    VBOXCMDVBVA_ALLOCDESC alloc1;
+    VBOXCMDVBVA_ALLOCDESC alloc2;
+    /* the rects count is determined from the command size */
+    VBOXCMDVBVA_RECT aRects[1];
+} VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8;
+
+#define VBOXCMDVBVA_SIZEOF_BLTSTRUCT_MAX (sizeof (VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8))
+
 typedef struct VBOXCMDVBVA_FLIP
 {
     VBOXCMDVBVA_HDR Hdr;
     VBOXCMDVBVA_ALLOCINFO src;
 } VBOXCMDVBVA_FLIP;
 
-typedef struct VBOXCMDVBVA_CLRFILL
+typedef struct VBOXCMDVBVA_CLRFILL_HDR
 {
     VBOXCMDVBVA_HDR Hdr;
-    VBOXCMDVBVA_ALLOCINFO dst;
+    uint32_t u32Color;
+} VBOXCMDVBVA_CLRFILL_HDR;
+
+typedef struct VBOXCMDVBVA_CLRFILL_PRIMARY
+{
+    VBOXCMDVBVA_CLRFILL_HDR Hdr;
     VBOXCMDVBVA_RECT aRects[1];
-} VBOXCMDVBVA_CLRFILL;
+} VBOXCMDVBVA_CLRFILL_PRIMARY;
 
+typedef struct VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8
+{
+    VBOXCMDVBVA_CLRFILL_HDR Hdr;
+    VBOXCMDVBVA_ALLOCDESC dst;
+    VBOXCMDVBVA_RECT aRects[1];
+} VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8;
+
+#define VBOXCMDVBVA_SIZEOF_CLRFILLSTRUCT_MAX (sizeof (VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8))
+
+#if 0
 #define VBOXCMDVBVA_SYSMEMEL_CPAGES_MAX  0x1000
 
 typedef struct VBOXCMDVBVA_SYSMEMEL
@@ -1713,28 +1800,40 @@ typedef struct VBOXCMDVBVA_SYSMEMEL
     uint32_t iPage1            : 20;
     uint32_t iPage2;
 } VBOXCMDVBVA_SYSMEMEL;
+#endif
 
-typedef struct VBOXCMDVBVA_PAGING_TRANSFER
+typedef struct VBOXCMDVBVA_PAGING_TRANSFER_DATA
 {
-    VBOXCMDVBVA_HDR Hdr;
     /* for now can only contain offVRAM.
      * paging transfer can NOT be initiated for allocations having host 3D object (hostID) associated */
     VBOXCMDVBVA_ALLOCINFO Alloc;
-    uint32_t cSysMem;
-    VBOXCMDVBVA_SYSMEMEL aSysMem[1];
+    VBOXCMDVBVAPAGEIDX aPageNumbers[1];
+} VBOXCMDVBVA_PAGING_TRANSFER_DATA;
+
+typedef struct VBOXCMDVBVA_PAGING_TRANSFER
+{
+    VBOXCMDVBVA_HDR Hdr;
+    VBOXCMDVBVA_PAGING_TRANSFER_DATA Data;
 } VBOXCMDVBVA_PAGING_TRANSFER;
 
 typedef struct VBOXCMDVBVA_PAGING_FILL
 {
     VBOXCMDVBVA_HDR Hdr;
-    uint32_t cbFill;
-    uint32_t Pattern;
+    uint32_t u32CbFill;
+    uint32_t u32Pattern;
     /* paging transfer can NOT be initiated for allocations having host 3D object (hostID) associated */
     VBOXCMDVBVAOFFSET offVRAM;
 } VBOXCMDVBVA_PAGING_FILL;
 
+typedef struct VBOXCMDVBVA_SYSMEMCMD
+{
+    VBOXCMDVBVA_HDR Hdr;
+    VBOXCMDVBVAPHADDR phCmd;
+} VBOXCMDVBVA_SYSMEMCMD;
+
 #define VBOXCMDVBVACTL_TYPE_ENABLE     1
 #define VBOXCMDVBVACTL_TYPE_3DCTL      2
+#define VBOXCMDVBVACTL_TYPE_RESIZE     3
 
 typedef struct VBOXCMDVBVA_CTL
 {
@@ -1748,6 +1847,26 @@ typedef struct VBOXCMDVBVA_CTL_ENABLE
     VBVAENABLE Enable;
 } VBOXCMDVBVA_CTL_ENABLE;
 
+#define VBOXCMDVBVA_SCREENMAP_SIZE(_elType) ((VBOX_VIDEO_MAX_SCREENS + sizeof (_elType) - 1) / sizeof (_elType))
+#define VBOXCMDVBVA_SCREENMAP_DECL(_elType, _name) _elType _name[VBOXCMDVBVA_SCREENMAP_SIZE(_elType)]
+
+typedef struct VBOXCMDVBVA_RESIZE_ENTRY
+{
+    VBVAINFOSCREEN Screen;
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
+} VBOXCMDVBVA_RESIZE_ENTRY;
+
+typedef struct VBOXCMDVBVA_RESIZE
+{
+    VBOXCMDVBVA_RESIZE_ENTRY aEntries[1];
+} VBOXCMDVBVA_RESIZE;
+
+typedef struct VBOXCMDVBVA_CTL_RESIZE
+{
+    VBOXCMDVBVA_CTL Hdr;
+    VBOXCMDVBVA_RESIZE Resize;
+} VBOXCMDVBVA_CTL_RESIZE;
+
 #define VBOXCMDVBVA3DCTL_TYPE_CONNECT     1
 #define VBOXCMDVBVA3DCTL_TYPE_DISCONNECT  2
 #define VBOXCMDVBVA3DCTL_TYPE_CMD         3
@@ -1772,6 +1891,24 @@ typedef struct VBOXCMDVBVA_3DCTL_CMD
     VBOXCMDVBVA_HDR Cmd;
 } VBOXCMDVBVA_3DCTL_CMD;
 
+typedef struct VBOXCMDVBVA_CTL_3DCTL_CMD
+{
+    VBOXCMDVBVA_CTL Hdr;
+    VBOXCMDVBVA_3DCTL_CMD Cmd;
+} VBOXCMDVBVA_CTL_3DCTL_CMD;
+
+typedef struct VBOXCMDVBVA_CTL_3DCTL_CONNECT
+{
+    VBOXCMDVBVA_CTL Hdr;
+    VBOXCMDVBVA_3DCTL_CONNECT Connect;
+} VBOXCMDVBVA_CTL_3DCTL_CONNECT;
+
+typedef struct VBOXCMDVBVA_CTL_3DCTL
+{
+    VBOXCMDVBVA_CTL Hdr;
+    VBOXCMDVBVA_3DCTL Ctl;
+} VBOXCMDVBVA_CTL_3DCTL;
+
 #pragma pack()
 
 
diff --git a/include/VBox/VBoxVideoHost3D.h b/include/VBox/VBoxVideoHost3D.h
index 21c7da9..809a5a2 100644
--- a/include/VBox/VBoxVideoHost3D.h
+++ b/include/VBox/VBoxVideoHost3D.h
@@ -27,6 +27,8 @@
 #define ___VBox_VBoxVideoHost3D_h
 #include <iprt/cdefs.h>
 #include <VBox/VBoxVideo.h>
+#include <VBox/hgcmsvc.h>
+#include <VBox/vmm/pdmifs.h>
 
 /* screen update instance */
 typedef struct PDMIDISPLAYCONNECTOR *HVBOXCRCMDCLTSCR;
@@ -57,11 +59,13 @@ typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_ENABLE)(HVBOXCRCMDSVR hSvr, VBOXCR
 /* Opposite to Enable (see above) */
 typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_DISABLE)(HVBOXCRCMDSVR hSvr);
 /* process command */
-typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_CMD)(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd);
+typedef DECLCALLBACKPTR(int8_t, PFNVBOXCRCMD_SVR_CMD)(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd);
 /* process host control */
 typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_HOSTCTL)(HVBOXCRCMDSVR hSvr, uint8_t* pCtl, uint32_t cbCmd);
 /* process guest control */
 typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_GUESTCTL)(HVBOXCRCMDSVR hSvr, uint8_t* pCtl, uint32_t cbCmd);
+/* screen resize */
+typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_RESIZE)(HVBOXCRCMDSVR hSvr, const struct VBVAINFOSCREEN *pScreen, const uint32_t *pTargetMap);
 /* process SaveState */
 typedef DECLCALLBACKPTR(int, PFNVBOXCRCMD_SVR_SAVESTATE)(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM);
 /* process LoadState */
@@ -76,6 +80,7 @@ typedef struct VBOXCRCMD_SVRINFO
     PFNVBOXCRCMD_SVR_CMD pfnCmd;
     PFNVBOXCRCMD_SVR_HOSTCTL pfnHostCtl;
     PFNVBOXCRCMD_SVR_GUESTCTL pfnGuestCtl;
+    PFNVBOXCRCMD_SVR_RESIZE pfnResize;
     PFNVBOXCRCMD_SVR_SAVESTATE pfnSaveState;
     PFNVBOXCRCMD_SVR_LOADSTATE pfnLoadState;
 } VBOXCRCMD_SVRINFO;
@@ -90,6 +95,7 @@ typedef struct VBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP
         uint64_t uAlignment;
     };
     uint64_t cbVRam;
+    PPDMLED pLed;
     /* out */
     struct VBOXCRCMD_SVRINFO CrCmdServerInfo;
 } VBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP, *PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP;
@@ -102,6 +108,7 @@ typedef enum
     VBOXCRCMDCTL_TYPE_32bit = 0x7fffffff
 } VBOXCRCMDCTL_TYPE;
 
+#pragma pack(1)
 typedef struct VBOXCRCMDCTL
 {
     VBOXCRCMDCTL_TYPE enmType;
@@ -111,18 +118,51 @@ typedef struct VBOXCRCMDCTL
     {
         void(*pfnInternal)();
         void* pvInternal;
-    };
+    } u;
 } VBOXCRCMDCTL;
 
+typedef struct VBOXCRCMDCTL_HGCM
+{
+    VBOXCRCMDCTL Hdr;
+    VBOXHGCMSVCPARM aParms[1];
+} VBOXCRCMDCTL_HGCM;
+#pragma pack()
+
 typedef struct VBOXVDMAHOST * HVBOXCRCMDCTL_REMAINING_HOST_COMMAND;
 
 typedef DECLCALLBACKPTR(uint8_t*, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND)(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hClient, uint32_t *pcbCtl, int prevCmdRc);
 
-typedef struct VBOXCRCMDCTL_ENABLE
+typedef struct VBOXCRCMDCTL_HGCMENABLE_DATA
 {
-    VBOXCRCMDCTL Hdr;
     HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd;
     PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd;
+} VBOXCRCMDCTL_HGCMENABLE_DATA;
+
+typedef struct VBOXVDMAHOST * HVBOXCRCMDCTL_NOTIFY_TERMINATING;
+
+typedef DECLCALLBACKPTR(int, PFNVBOXCRCMDCTL_NOTIFY_TERMINATING)(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient, VBOXCRCMDCTL_HGCMENABLE_DATA *pHgcmEnableData);
+
+typedef DECLCALLBACKPTR(void, PFNVBOXCRCMDCTL_NOTIFY_TERMINATING_DONE)(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient);
+
+typedef struct VBOXCRCMDCTL_HGCMDISABLE_DATA
+{
+    HVBOXCRCMDCTL_NOTIFY_TERMINATING hNotifyTerm;
+    PFNVBOXCRCMDCTL_NOTIFY_TERMINATING pfnNotifyTerm;
+    PFNVBOXCRCMDCTL_NOTIFY_TERMINATING_DONE pfnNotifyTermDone;
+} VBOXCRCMDCTL_HGCMDISABLE_DATA;
+
+#pragma pack(1)
+typedef struct VBOXCRCMDCTL_ENABLE
+{
+    VBOXCRCMDCTL Hdr;
+    VBOXCRCMDCTL_HGCMENABLE_DATA Data;
 } VBOXCRCMDCTL_ENABLE;
 
+typedef struct VBOXCRCMDCTL_DISABLE
+{
+    VBOXCRCMDCTL Hdr;
+    VBOXCRCMDCTL_HGCMDISABLE_DATA Data;
+} VBOXCRCMDCTL_DISABLE;
+#pragma pack()
+
 #endif /*#ifndef ___VBox_VBoxVideoHost3D_h*/
diff --git a/include/VBox/err.h b/include/VBox/err.h
index ef99940..4a8d02a 100644
--- a/include/VBox/err.h
+++ b/include/VBox/err.h
@@ -1522,6 +1522,12 @@
 #define VERR_VD_ASYNC_IO_IN_PROGRESS                (-3210)
 /** The image is too small or too large for this format. */
 #define VERR_VD_INVALID_SIZE                        (-3211)
+/** Configuration value is unknown. This indicates misconfiguration. */
+#define VERR_VD_UNKNOWN_CFG_VALUES                  (-3212)
+/** Interface is unknown. This indicates misconfiguration. */
+#define VERR_VD_UNKNOWN_INTERFACE                   (-3213)
+/** The DEK for disk encryption is missing. */
+#define VERR_VD_DEK_MISSING                         (-3214)
 /** Generic: Invalid image file header. Use this for plugins. */
 #define VERR_VD_GEN_INVALID_HEADER                  (-3220)
 /** VDI: Invalid image file header. */
@@ -1546,16 +1552,12 @@
 #define VERR_VD_VMDK_INVALID_WRITE                  (-3245)
 /** iSCSI: Invalid header, i.e. dummy for validity check. */
 #define VERR_VD_ISCSI_INVALID_HEADER                (-3250)
-/** iSCSI: Configuration value is unknown. This indicates misconfiguration. */
-#define VERR_VD_ISCSI_UNKNOWN_CFG_VALUES            (-3251)
-/** iSCSI: Interface is unknown. This indicates misconfiguration. */
-#define VERR_VD_ISCSI_UNKNOWN_INTERFACE             (-3252)
 /** iSCSI: Operation can't be done in current image state. */
-#define VERR_VD_ISCSI_INVALID_STATE                 (-3253)
+#define VERR_VD_ISCSI_INVALID_STATE                 (-3251)
 /** iSCSI: Invalid device type (not a disk). */
-#define VERR_VD_ISCSI_INVALID_TYPE                  (-3254)
+#define VERR_VD_ISCSI_INVALID_TYPE                  (-3252)
 /** iSCSI: Initiator secret not decrypted */
-#define VERR_VD_ISCSI_SECRET_ENCRYPTED              (-3255)
+#define VERR_VD_ISCSI_SECRET_ENCRYPTED              (-3253)
 /** VHD: Invalid image file header. */
 #define VERR_VD_VHD_INVALID_HEADER                  (-3260)
 /** Parallels HDD: Invalid image file header. */
@@ -1750,6 +1752,16 @@
 #define VERR_SUPDRV_TRACER_UMOD_STRTAB_TOO_BIG      (-3736)
 /** The user mode tracepoint provider string table offset is bad. */
 #define VERR_SUPDRV_TRACER_UMOD_STRTAB_OFF_BAD      (-3737)
+/** The VM process was denied access to vboxdrv because someone have managed to
+ * open the process or its main thread with too broad access rights. */
+#define VERR_SUPDRV_HARDENING_EVIL_HANDLE           (-3738)
+/** Error opening the ApiPort LPC object. */
+#define VERR_SUPDRV_APIPORT_OPEN_ERROR              (-3739)
+/** Error enumerating all processes in the session. */
+#define VERR_SUPDRV_SESSION_PROCESS_ENUM_ERROR      (-3740)
+/** The CSRSS instance associated with the client process could not be
+ * located. */
+#define VERR_SUPDRV_CSRSS_NOT_FOUND                 (-3741)
 /** @} */
 
 
@@ -1797,6 +1809,18 @@
 #define VERR_SUPLIB_INVALID_ARGV0_INTERNAL          (-3768)
 /** The internal application does not reside in the correct place (hardening). */
 #define VERR_SUPLIB_INVALID_INTERNAL_APP_DIR        (-3769)
+/** Unable to establish trusted of VM process (0). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0          (-3770)
+/** Unable to establish trusted of VM process (1). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1          (-3771)
+/** Unable to establish trusted of VM process (2). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2          (-3772)
+/** Unable to establish trusted of VM process (3). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_3          (-3773)
+/** Unable to establish trusted of VM process (4). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_4          (-3774)
+/** Unable to establish trusted of VM process (5). */
+#define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_5          (-3775)
 /** @} */
 
 
@@ -2295,6 +2319,170 @@
 
 /** @} */
 
+/** @name Support driver/library shared verfication status codes.
+ * @{  */
+/** Process Verficiation Failure: The memory content does not match the image
+ *  file. */
+#define VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH          (-5600)
+/** Process Verficiation Failure: The memory protection of a image file section
+ *  does not match what the section header prescribes. */
+#define VERR_SUP_VP_SECTION_PROTECTION_MISMATCH      (-5601)
+/** Process Verficiation Failure: One of the section in the image file is not
+ *  mapped into memory. */
+#define VERR_SUP_VP_SECTION_NOT_MAPPED               (-5602)
+/** Process Verficiation Failure: One of the section in the image file is not
+ *  fully mapped into memory. */
+#define VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED         (-5603)
+/** Process Verficiation Failure: Bad file alignment value in image header. */
+#define VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE         (-5604)
+/** Process Verficiation Failure: Bad image base in header. */
+#define VERR_SUP_VP_BAD_IMAGE_BASE                   (-5605)
+/** Process Verficiation Failure: Bad image signature. */
+#define VERR_SUP_VP_BAD_IMAGE_SIGNATURE              (-5606)
+/** Process Verficiation Failure: Bad image size. */
+#define VERR_SUP_VP_BAD_IMAGE_SIZE                   (-5607)
+/** Process Verficiation Failure: Bad new-header offset in the MZ header. */
+#define VERR_SUP_VP_BAD_MZ_OFFSET                    (-5608)
+/** Process Verficiation Failure: Bad optional header field. */
+#define VERR_SUP_VP_BAD_OPTIONAL_HEADER              (-5609)
+/** Process Verficiation Failure: Bad section alignment value in image
+ *  header. */
+#define VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE      (-5610)
+/** Process Verficiation Failure: Bad section raw data size. */
+#define VERR_SUP_VP_BAD_SECTION_FILE_SIZE            (-5611)
+/** Process Verficiation Failure: Bad virtual section address. */
+#define VERR_SUP_VP_BAD_SECTION_RVA                  (-5612)
+/** Process Verficiation Failure: Bad virtual section size. */
+#define VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE         (-5613)
+/** Process Verficiation Failure: Bad size of image header. */
+#define VERR_SUP_VP_BAD_SIZE_OF_HEADERS              (-5614)
+/** Process Verficiation Failure: The process is being debugged. */
+#define VERR_SUP_VP_DEBUGGED                         (-5615)
+/** Process Verficiation Failure: A DLL was found more than once. */
+#define VERR_SUP_VP_DUPLICATE_DLL_MAPPING            (-5616)
+/** Process Verficiation Failure: Image section region is too large. */
+#define VERR_SUP_VP_EMPTY_REGION_TOO_LARGE           (-5617)
+/** Process Verficiation Failure: Exectuable file name and process image name
+ *  does not match up. */
+#define VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH        (-5618)
+/** Process Verficiation Failure: Found executable memory allocated in the
+ *  process.  There is only supposed be executable memory associated with
+ *  image file mappings (DLLs & EXE). */
+#define VERR_SUP_VP_FOUND_EXEC_MEMORY                (-5619)
+/** Process Verficiation Failure: There is more than one known executable mapped
+ *  into the process. */
+#define VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING  (-5620)
+/** Process Verficiation Failure: Error closing image file handle. */
+#define VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR           (-5621)
+/** Process Verficiation Failure: Error opening image file. */
+#define VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR            (-5622)
+/** Process Verficiation Failure: Error reading image file header. */
+#define VERR_SUP_VP_IMAGE_HDR_READ_ERROR             (-5623)
+/** Process Verficiation Failure: Image mapping is bogus as the first region
+ *  has different AllocationBase and BaseAddress values, indicating that a
+ *  section was unmapped or otherwise tampered with. */
+#define VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR         (-5624)
+/** Process Verficiation Failure: Error reading process memory for comparing
+ *  with disk data. */
+#define VERR_SUP_VP_MEMORY_READ_ERROR                (-5625)
+/** Process Verficiation Failure: Found no executable mapped into the process
+ *  address space. */
+#define VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING          (-5626)
+/** Process Verficiation Failure: An image mapping failed to report a name. */
+#define VERR_SUP_VP_NO_IMAGE_MAPPING_NAME            (-5627)
+/** Process Verficiation Failure: No KERNE32.DLL mapping found.  This is
+ *  impossible. */
+#define VERR_SUP_VP_NO_KERNEL32_MAPPING              (-5628)
+/** Process Verficiation Failure: Error allocating memory. */
+#define VERR_SUP_VP_NO_MEMORY                        (-5629)
+/** Process Verficiation Failure: Erorr allocating state memory or querying
+ *  the system32 path. */
+#define VERR_SUP_VP_NO_MEMORY_STATE                  (-5630)
+/** Process Verficiation Failure: No NTDLL.DLL mapping found.  This is
+ *  impossible. */
+#define VERR_SUP_VP_NO_NTDLL_MAPPING                 (-5631)
+/** Process Verficiation Failure: A DLL residing outside System32 was found
+ *  in the process. */
+#define VERR_SUP_VP_NON_SYSTEM32_DLL                 (-5632)
+/** Process Verficiation Failure: An unknown and unwanted DLL was found loaded
+ *  into the process. */
+#define VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE             (-5633)
+/** Process Verficiation Failure: The name of an image file changes between
+ *  mapping regions. */
+#define VERR_SUP_VP_NT_MAPPING_NAME_CHANGED          (-5634)
+/** Process Verficiation Failure: Error querying process name. */
+#define VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR           (-5635)
+/** Process Verficiation Failure: Error querying thread information. */
+#define VERR_SUP_VP_NT_QI_THREAD_ERROR               (-5636)
+/** Process Verficiation Failure: Error query virtual memory information. */
+#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR       (-5637)
+/** Process Verficiation Failure: Error query virtual memory mapping name. */
+#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR    (-5638)
+/** Process Verficiation Failure: Error determining the full path of
+ *  System32. */
+#define VERR_SUP_VP_SYSTEM32_PATH                    (-5639)
+/** Process Verficiation Failure: The process has more than one thread. */
+#define VERR_SUP_VP_THREAD_NOT_ALONE                 (-5640)
+/** Process Verficiation Failure: The image mapping is too large (>= 2GB). */
+#define VERR_SUP_VP_TOO_HIGH_REGION_RVA              (-5641)
+/** Process Verficiation Failure: The memory region is too large (>= 2GB). */
+#define VERR_SUP_VP_TOO_LARGE_REGION                 (-5642)
+/** Process Verficiation Failure: There are too many DLLs loaded. */
+#define VERR_SUP_VP_TOO_MANY_DLLS_LOADED             (-5643)
+/** Process Verficiation Failure: An image has too many regions. */
+#define VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS           (-5644)
+/** Process Verficiation Failure: The process has too many virtual memory
+ *  regions. */
+#define VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS          (-5645)
+/** Process Verficiation Failure: An image has too many sections. */
+#define VERR_SUP_VP_TOO_MANY_SECTIONS                (-5646)
+/** Process Verficiation Failure: An image is targetting an unexpected
+ *  machine/CPU. */
+#define VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE         (-5647)
+/** Process Verficiation Failure: Unexpected section protection flag
+ *  combination. */
+#define VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS         (-5648)
+/** Process Verficiation Failure: Expected the process and exe to have forced
+ * integrity checking enabled (verifying signatures). */
+#define VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY     (-5649)
+/** Process Verficiation Failure: Expected the process and exe to have dynamic
+ * base enabled. */
+#define VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE        (-5650)
+/** Process Verficiation Failure: Expected the process and exe to advertise
+ * NX compatibility. */
+#define VERR_SUP_VP_EXE_MISSING_NX_COMPAT           (-5651)
+/** Process Verficiation Failure: The DllCharacteristics of the process
+ * does not match the value in the optional header in the exe file. */
+#define VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH    (-5652)
+/** Process Verficiation Failure: The ImageCharacteristics of the process
+ * does not match the value in the file header in the exe file. */
+#define VERR_SUP_VP_IMAGE_CHARECTERISTICS_MISMATCH  (-5653)
+/** Process Verficiation Failure: Error querying image information. */
+#define VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR    (-5654)
+/** Process Verficiation Failure: Error querying debug port. */
+#define VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR    (-5655)
+/** WinVerifyTrust failed with an unexpected status code when using the
+ * catalog-file approach. */
+#define VERR_SUP_VP_WINTRUST_CAT_FAILURE            (-5656)
+/** The image is required to be signed with the same certificate as the rest
+ * of VirtualBox. */
+#define VERR_SUP_VP_NOT_SIGNED_WITH_BUILD_CERT      (-5657)
+/** Internal processing error: Not build certificate. */
+#define VERR_SUP_VP_NOT_BUILD_CERT_IPE              (-5658)
+/** The image requires to be signed using the kernel-code signing process. */
+#define VERR_SUP_VP_NOT_VALID_KERNEL_CODE_SIGNATURE (-5659)
+/** Unexpected number of valid paths. */
+#define VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT     (-5660)
+/** The image is required to force integrity checks. */
+#define VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED   (-5661)
+/** Process Verficiation Failure: Symantec Endpoint Protection must be
+ * disabled for the VirtualBox VM processes.
+ * http://www.symantec.com/connect/articles/creating-application-control-exclusions-symantec-endpoint-protection-121 */
+#define VERR_SUP_VP_SYSFER_DLL                      (-5662)
+
+
+/** @} */
+
 /** @name VBox Extension Pack Status Codes
  * @{
  */
diff --git a/include/VBox/err.mac b/include/VBox/err.mac
index ac39b10..ee13678 100644
--- a/include/VBox/err.mac
+++ b/include/VBox/err.mac
@@ -547,6 +547,9 @@
 %define VINF_VD_ASYNC_IO_FINISHED    3209
 %define VERR_VD_ASYNC_IO_IN_PROGRESS    (-3210)
 %define VERR_VD_INVALID_SIZE    (-3211)
+%define VERR_VD_UNKNOWN_CFG_VALUES    (-3212)
+%define VERR_VD_UNKNOWN_INTERFACE    (-3213)
+%define VERR_VD_DEK_MISSING    (-3214)
 %define VERR_VD_GEN_INVALID_HEADER    (-3220)
 %define VERR_VD_VDI_INVALID_HEADER    (-3230)
 %define VERR_VD_VDI_INVALID_SIGNATURE    (-3231)
@@ -559,11 +562,9 @@
 %define VERR_VD_VMDK_INVALID_FORMAT    (-3244)
 %define VERR_VD_VMDK_INVALID_WRITE    (-3245)
 %define VERR_VD_ISCSI_INVALID_HEADER    (-3250)
-%define VERR_VD_ISCSI_UNKNOWN_CFG_VALUES    (-3251)
-%define VERR_VD_ISCSI_UNKNOWN_INTERFACE    (-3252)
-%define VERR_VD_ISCSI_INVALID_STATE    (-3253)
-%define VERR_VD_ISCSI_INVALID_TYPE    (-3254)
-%define VERR_VD_ISCSI_SECRET_ENCRYPTED    (-3255)
+%define VERR_VD_ISCSI_INVALID_STATE    (-3251)
+%define VERR_VD_ISCSI_INVALID_TYPE    (-3252)
+%define VERR_VD_ISCSI_SECRET_ENCRYPTED    (-3253)
 %define VERR_VD_VHD_INVALID_HEADER    (-3260)
 %define VERR_VD_PARALLELS_INVALID_HEADER    (-3265)
 %define VERR_VD_DMG_INVALID_HEADER    (-3267)
@@ -641,6 +642,10 @@
 %define VERR_SUPDRV_TRACER_UMOD_TOO_MANY_PROBES    (-3735)
 %define VERR_SUPDRV_TRACER_UMOD_STRTAB_TOO_BIG    (-3736)
 %define VERR_SUPDRV_TRACER_UMOD_STRTAB_OFF_BAD    (-3737)
+%define VERR_SUPDRV_HARDENING_EVIL_HANDLE    (-3738)
+%define VERR_SUPDRV_APIPORT_OPEN_ERROR    (-3739)
+%define VERR_SUPDRV_SESSION_PROCESS_ENUM_ERROR    (-3740)
+%define VERR_SUPDRV_CSRSS_NOT_FOUND    (-3741)
 %define VERR_SUPLIB_PATH_NOT_ABSOLUTE    (-3750)
 %define VERR_SUPLIB_PATH_NOT_CLEAN    (-3751)
 %define VERR_SUPLIB_PATH_TOO_LONG    (-3752)
@@ -661,6 +666,12 @@
 %define VERR_SUPLIB_WORLD_WRITABLE    (-3767)
 %define VERR_SUPLIB_INVALID_ARGV0_INTERNAL    (-3768)
 %define VERR_SUPLIB_INVALID_INTERNAL_APP_DIR    (-3769)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0    (-3770)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1    (-3771)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2    (-3772)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_3    (-3773)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_4    (-3774)
+%define VERR_SUPLIB_NT_PROCESS_UNTRUSTED_5    (-3775)
 %define VERR_GMM_SEED_ME    (-3800)
 %define VERR_GMM_OUT_OF_MEMORY    (-3801)
 %define VERR_GMM_HIT_GLOBAL_LIMIT    (-3802)
@@ -847,6 +858,69 @@
 %define VERR_DBGC_PARSE_INVALD_COMMAND_NAME    (VERR_DBGC_PARSE_LOWEST + 23)
 %define VERR_DBGC_PARSE_COMMAND_NOT_FOUND    (VERR_DBGC_PARSE_LOWEST + 24)
 %define VERR_DBGC_PARSE_BUG    (VERR_DBGC_PARSE_LOWEST + 25)
+%define VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH    (-5600)
+%define VERR_SUP_VP_SECTION_PROTECTION_MISMATCH    (-5601)
+%define VERR_SUP_VP_SECTION_NOT_MAPPED    (-5602)
+%define VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED    (-5603)
+%define VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE    (-5604)
+%define VERR_SUP_VP_BAD_IMAGE_BASE    (-5605)
+%define VERR_SUP_VP_BAD_IMAGE_SIGNATURE    (-5606)
+%define VERR_SUP_VP_BAD_IMAGE_SIZE    (-5607)
+%define VERR_SUP_VP_BAD_MZ_OFFSET    (-5608)
+%define VERR_SUP_VP_BAD_OPTIONAL_HEADER    (-5609)
+%define VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE    (-5610)
+%define VERR_SUP_VP_BAD_SECTION_FILE_SIZE    (-5611)
+%define VERR_SUP_VP_BAD_SECTION_RVA    (-5612)
+%define VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE    (-5613)
+%define VERR_SUP_VP_BAD_SIZE_OF_HEADERS    (-5614)
+%define VERR_SUP_VP_DEBUGGED    (-5615)
+%define VERR_SUP_VP_DUPLICATE_DLL_MAPPING    (-5616)
+%define VERR_SUP_VP_EMPTY_REGION_TOO_LARGE    (-5617)
+%define VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH    (-5618)
+%define VERR_SUP_VP_FOUND_EXEC_MEMORY    (-5619)
+%define VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING    (-5620)
+%define VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR    (-5621)
+%define VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR    (-5622)
+%define VERR_SUP_VP_IMAGE_HDR_READ_ERROR    (-5623)
+%define VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR    (-5624)
+%define VERR_SUP_VP_MEMORY_READ_ERROR    (-5625)
+%define VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING    (-5626)
+%define VERR_SUP_VP_NO_IMAGE_MAPPING_NAME    (-5627)
+%define VERR_SUP_VP_NO_KERNEL32_MAPPING    (-5628)
+%define VERR_SUP_VP_NO_MEMORY    (-5629)
+%define VERR_SUP_VP_NO_MEMORY_STATE    (-5630)
+%define VERR_SUP_VP_NO_NTDLL_MAPPING    (-5631)
+%define VERR_SUP_VP_NON_SYSTEM32_DLL    (-5632)
+%define VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE    (-5633)
+%define VERR_SUP_VP_NT_MAPPING_NAME_CHANGED    (-5634)
+%define VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR    (-5635)
+%define VERR_SUP_VP_NT_QI_THREAD_ERROR    (-5636)
+%define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR    (-5637)
+%define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR    (-5638)
+%define VERR_SUP_VP_SYSTEM32_PATH    (-5639)
+%define VERR_SUP_VP_THREAD_NOT_ALONE    (-5640)
+%define VERR_SUP_VP_TOO_HIGH_REGION_RVA    (-5641)
+%define VERR_SUP_VP_TOO_LARGE_REGION    (-5642)
+%define VERR_SUP_VP_TOO_MANY_DLLS_LOADED    (-5643)
+%define VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS    (-5644)
+%define VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS    (-5645)
+%define VERR_SUP_VP_TOO_MANY_SECTIONS    (-5646)
+%define VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE    (-5647)
+%define VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS    (-5648)
+%define VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY    (-5649)
+%define VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE    (-5650)
+%define VERR_SUP_VP_EXE_MISSING_NX_COMPAT    (-5651)
+%define VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH    (-5652)
+%define VERR_SUP_VP_IMAGE_CHARECTERISTICS_MISMATCH    (-5653)
+%define VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR    (-5654)
+%define VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR    (-5655)
+%define VERR_SUP_VP_WINTRUST_CAT_FAILURE    (-5656)
+%define VERR_SUP_VP_NOT_SIGNED_WITH_BUILD_CERT    (-5657)
+%define VERR_SUP_VP_NOT_BUILD_CERT_IPE    (-5658)
+%define VERR_SUP_VP_NOT_VALID_KERNEL_CODE_SIGNATURE    (-5659)
+%define VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT    (-5660)
+%define VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED    (-5661)
+%define VERR_SUP_VP_SYSFER_DLL    (-5662)
 %define VERR_EXTPACK_UNSUPPORTED_HOST_UNINSTALL    (-6000)
 %define VERR_EXTPACK_VBOX_VERSION_MISMATCH    (-6001)
 %define VERR_GSTCTL_GUEST_ERROR    (-6200)
diff --git a/include/VBox/log.h b/include/VBox/log.h
index 276caa5..2ac9ad6 100644
--- a/include/VBox/log.h
+++ b/include/VBox/log.h
@@ -93,6 +93,8 @@ typedef enum LOGGROUP
     LOG_GROUP_DEV_E1000,
     /** Extensible Firmware Interface Device group. */
     LOG_GROUP_DEV_EFI,
+    /** USB EHCI Device group. */
+    LOG_GROUP_DEV_EHCI,
     /** Floppy Controller Device group. */
     LOG_GROUP_DEV_FDC,
     /** High Precision Event Timer Device group. */
@@ -109,6 +111,8 @@ typedef enum LOGGROUP
     LOG_GROUP_DEV_LSILOGICSCSI,
     /** NE2000 Device group. */
     LOG_GROUP_DEV_NE2000,
+    /** USB OHCI Device group. */
+    LOG_GROUP_DEV_OHCI,
     /** Parallel Device group */
     LOG_GROUP_DEV_PARALLEL,
     /** PC Device group. */
@@ -133,8 +137,6 @@ typedef enum LOGGROUP
     LOG_GROUP_DEV_SERIAL,
     /** System Management Controller Device group. */
     LOG_GROUP_DEV_SMC,
-    /** USB Device group. */
-    LOG_GROUP_DEV_USB,
     /** VGA Device group. */
     LOG_GROUP_DEV_VGA,
     /** Virtio PCI Device group. */
@@ -689,6 +691,8 @@ typedef enum LOGGROUP
     LOG_GROUP_USB_MOUSE,
     /** MSD USB device group. */
     LOG_GROUP_USB_MSD,
+    /** USB remote support. */
+    LOG_GROUP_USB_REMOTE,
     /** USB webcam. */
     LOG_GROUP_USB_WEBCAM,
     /** VBox Guest Additions Driver (VBoxGuest). */
@@ -765,6 +769,7 @@ typedef enum LOGGROUP
     "DEV_DMA",      \
     "DEV_E1000",    \
     "DEV_EFI",      \
+    "DEV_EHCI",     \
     "DEV_FDC",      \
     "DEV_HPET",     \
     "DEV_IDE",      \
@@ -773,6 +778,7 @@ typedef enum LOGGROUP
     "DEV_LPC",      \
     "DEV_LSILOGICSCSI", \
     "DEV_NE2000",   \
+    "DEV_OHCI",     \
     "DEV_PARALLEL", \
     "DEV_PC",       \
     "DEV_PC_ARCH",  \
@@ -785,7 +791,6 @@ typedef enum LOGGROUP
     "DEV_RTC",      \
     "DEV_SERIAL",   \
     "DEV_SMC",      \
-    "DEV_USB",      \
     "DEV_VGA",      \
     "DEV_VIRTIO",   \
     "DEV_VIRTIO_NET", \
@@ -1063,6 +1068,7 @@ typedef enum LOGGROUP
     "USB_KBD",      \
     "USB_MOUSE",    \
     "USB_MSD",      \
+    "USB_REMOTE",   \
     "USB_WEBCAM",   \
     "VBGD",         \
     "VBGL",         \
diff --git a/include/VBox/sup.h b/include/VBox/sup.h
index 7f94cca..e9fe8d9 100644
--- a/include/VBox/sup.h
+++ b/include/VBox/sup.h
@@ -695,6 +695,8 @@ typedef enum SUPINITOP
     kSupInitOp_Driver,
     /** IPRT init related. */
     kSupInitOp_IPRT,
+    /** Miscellaneous. */
+    kSupInitOp_Misc,
     /** Place holder. */
     kSupInitOp_End
 } SUPINITOP;
@@ -1103,6 +1105,28 @@ SUPR3DECL(int) SUPR3UnloadVMM(void);
 SUPR3DECL(int) SUPR3GipGetPhys(PRTHCPHYS pHCPhys);
 
 /**
+ * Initializes only the bits relevant for the SUPR3HardenedVerify* APIs.
+ *
+ * This is for users that don't necessarily need to initialize the whole of
+ * SUPLib.  There is no harm in calling this one more time.
+ *
+ * @returns VBox status code.
+ * @remarks Currently not counted, so only call once.
+ */
+SUPR3DECL(int) SUPR3HardenedVerifyInit(void);
+
+/**
+ * Reverses the effect of SUPR3HardenedVerifyInit if SUPR3InitEx hasn't been
+ * called.
+ *
+ * Ignored if the support library was initialized using SUPR3Init or
+ * SUPR3InitEx.
+ *
+ * @returns VBox status code.
+ */
+SUPR3DECL(int) SUPR3HardenedVerifyTerm(void);
+
+/**
  * Verifies the integrity of a file, and optionally opens it.
  *
  * The integrity check is for whether the file is suitable for loading into
@@ -1760,6 +1784,63 @@ DECLEXPORT(void) ModuleTerm(void *hMod);
 #endif
 
 
+/** @name Trust Anchors and Certificates
+ * @{ */
+
+/**
+ * Trust anchor table entry (in generated Certificates.cpp).
+ */
+typedef struct SUPTAENTRY
+{
+    /** Pointer to the raw bytes. */
+    const unsigned char    *pch;
+    /** Number of bytes. */
+    unsigned                cb;
+} SUPTAENTRY;
+/** Pointer to a trust anchor table entry. */
+typedef SUPTAENTRY const *PCSUPTAENTRY;
+
+/** Macro for simplifying generating the trust anchor tables. */
+#define SUPTAENTRY_GEN(a_abTA)      { &a_abTA[0], sizeof(a_abTA) }
+
+/** All certificates we know. */
+extern SUPTAENTRY const             g_aSUPAllTAs[];
+/** Number of entries in g_aSUPAllTAs. */
+extern unsigned const               g_cSUPAllTAs;
+
+/** Software publisher certificate roots (Authenticode). */
+extern SUPTAENTRY const             g_aSUPSpcRootTAs[];
+/** Number of entries in g_aSUPSpcRootTAs. */
+extern unsigned const               g_cSUPSpcRootTAs;
+
+/** Kernel root certificates used by Windows. */
+extern SUPTAENTRY const             g_aSUPNtKernelRootTAs[];
+/** Number of entries in g_aSUPNtKernelRootTAs. */
+extern unsigned const               g_cSUPNtKernelRootTAs;
+
+/** Timestamp root certificates trusted by Windows. */
+extern SUPTAENTRY const             g_aSUPTimestampTAs[];
+/** Number of entries in g_aSUPTimestampTAs. */
+extern unsigned const               g_cSUPTimestampTAs;
+
+/** TAs we trust (the build certificate, Oracle VirtualBox). */
+extern SUPTAENTRY const             g_aSUPTrustedTAs[];
+/** Number of entries in g_aSUPTrustedTAs. */
+extern unsigned const               g_cSUPTrustedTAs;
+
+/** Supplemental certificates, like cross signing certificates. */
+extern SUPTAENTRY const             g_aSUPSupplementalTAs[];
+/** Number of entries in g_aSUPTrustedTAs. */
+extern unsigned const               g_cSUPSupplementalTAs;
+
+/** The build certificate. */
+extern const unsigned char          g_abSUPBuildCert[];
+/** The size of the build certificate. */
+extern const unsigned               g_cbSUPBuildCert;
+
+/** @} */
+
+
 /** @} */
 
 RT_C_DECLS_END
diff --git a/include/VBox/vd-cache-plugin.h b/include/VBox/vd-cache-backend.h
similarity index 95%
copy from include/VBox/vd-cache-plugin.h
copy to include/VBox/vd-cache-backend.h
index c8a3753..9fba716 100644
--- a/include/VBox/vd-cache-plugin.h
+++ b/include/VBox/vd-cache-backend.h
@@ -65,11 +65,6 @@ typedef struct VDCACHEBACKEND
     PCVDCONFIGINFO paConfigInfo;
 
     /**
-     * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.
-     */
-    RTLDRMOD hPlugin;
-
-    /**
      * Probes the given image.
      *
      * @returns VBox status code.
@@ -317,21 +312,9 @@ typedef struct VDCACHEBACKEND
     DECLR3CALLBACKMEMBER(int, pfnComposeName, (PVDINTERFACE pConfig, char **pszName));
 
 } VDCACHEBACKEND;
-
-/** Pointer to VD backend. */
+/** Pointer to VD cache backend. */
 typedef VDCACHEBACKEND *PVDCACHEBACKEND;
-
 /** Constant pointer to VD backend. */
 typedef const VDCACHEBACKEND *PCVDCACHEBACKEND;
 
-/** Initialization entry point. */
-typedef DECLCALLBACK(int) FNVDCACHEFORMATLOAD(PVDCACHEBACKEND *ppBackendTable);
-typedef FNVDCACHEFORMATLOAD *PFNVDCACHEFORMATLOAD;
-#define VD_CACHEFORMAT_LOAD_NAME "VDCacheFormatLoad"
-
-/** The prefix to identify Storage Plugins. */
-#define VD_CACHEFORMAT_PLUGIN_PREFIX "VDCache"
-/** The size of the prefix excluding the '\\0' terminator. */
-#define VD_CACHEFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VD_CACHEFORMAT_PLUGIN_PREFIX)-1)
-
 #endif
diff --git a/include/VBox/vd-cache-plugin.h b/include/VBox/vd-cache-plugin.h
index c8a3753..e69de29 100644
--- a/include/VBox/vd-cache-plugin.h
+++ b/include/VBox/vd-cache-plugin.h
@@ -1,337 +0,0 @@
-/** @file
- * Internal hard disk format support API for VBoxHDD cache images.
- */
-
-/*
- * Copyright (C) 2006-2013 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-#ifndef __VBoxHDD_CachePlugin_h__
-#define __VBoxHDD_CachePlugin_h__
-
-#include <VBox/vd.h>
-#include <VBox/vd-ifs-internal.h>
-
-/**
- * Cache format backend interface used by VBox HDD Container implementation.
- */
-typedef struct VDCACHEBACKEND
-{
-    /**
-     * The name of the backend (constant string).
-     */
-    const char *pszBackendName;
-
-    /**
-     * The size of the structure.
-     */
-    uint32_t cbSize;
-
-    /**
-     * The capabilities of the backend.
-     */
-    uint64_t uBackendCaps;
-
-    /**
-     * Pointer to a NULL-terminated array of strings, containing the supported
-     * file extensions. Note that some backends do not work on files, so this
-     * pointer may just contain NULL.
-     */
-    const char * const *papszFileExtensions;
-
-    /**
-     * Pointer to an array of structs describing each supported config key.
-     * Terminated by a NULL config key. Note that some backends do not support
-     * the configuration interface, so this pointer may just contain NULL.
-     * Mandatory if the backend sets VD_CAP_CONFIG.
-     */
-    PCVDCONFIGINFO paConfigInfo;
-
-    /**
-     * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.
-     */
-    RTLDRMOD hPlugin;
-
-    /**
-     * Probes the given image.
-     *
-     * @returns VBox status code.
-     * @param   pszFilename     Name of the image file.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnProbe, (const char *pszFilename, PVDINTERFACE pVDIfsDisk, PVDINTERFACE pVDIfsImage));
-
-    /**
-     * Open a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pszFilename     Name of the image file to open. Guaranteed to be available and
-     *                          unchanged during the lifetime of this image.
-     * @param   uOpenFlags      Image file open mode, see VD_OPEN_FLAGS_* constants.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   ppBackendData   Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnOpen, (const char *pszFilename, unsigned uOpenFlags,
-                                        PVDINTERFACE pVDIfsDisk, PVDINTERFACE pVDIfsImage,
-                                        void **ppBackendData));
-
-    /**
-     * Create a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pszFilename     Name of the image file to create. Guaranteed to be available and
-     *                          unchanged during the lifetime of this image.
-     * @param   cbSize          Image size in bytes.
-     * @param   uImageFlags     Flags specifying special image features.
-     * @param   pszComment      Pointer to image comment. NULL is ok.
-     * @param   pUuid           New UUID of the image. Not NULL.
-     * @param   uOpenFlags      Image file open mode, see VD_OPEN_FLAGS_* constants.
-     * @param   uPercentStart   Starting value for progress percentage.
-     * @param   uPercentSpan    Span for varying progress percentage.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   pVDIfsOperation Pointer to the per-operation VD interface list.
-     * @param   ppBackendData   Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnCreate, (const char *pszFilename, uint64_t cbSize,
-                                          unsigned uImageFlags, const char *pszComment,
-                                          PCRTUUID pUuid, unsigned uOpenFlags,
-                                          unsigned uPercentStart, unsigned uPercentSpan,
-                                          PVDINTERFACE pVDIfsDisk,
-                                          PVDINTERFACE pVDIfsImage,
-                                          PVDINTERFACE pVDIfsOperation,
-                                          void **ppBackendData));
-
-    /**
-     * Close a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   fDelete         If true, delete the image from the host disk.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnClose, (void *pBackendData, bool fDelete));
-
-    /**
-     * Start a read request.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOffset         The offset of the virtual disk to read from.
-     * @param   cbRead          How many bytes to read.
-     * @param   pIoCtx          I/O context associated with this request.
-     * @param   pcbActuallyRead Pointer to returned number of bytes read.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnRead, (void *pBackendData, uint64_t uOffset, size_t cbRead,
-                                        PVDIOCTX pIoCtx, size_t *pcbActuallyRead));
-
-    /**
-     * Start a write request.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOffset         The offset of the virtual disk to write to.
-     * @param   cbWrite         How many bytes to write.
-     * @param   pIoCtx          I/O context associated with this request.
-     * @param   pcbWriteProcess Pointer to returned number of bytes that could
-     *                          be processed. In case the function returned
-     *                          VERR_VD_BLOCK_FREE this is the number of bytes
-     *                          that could be written in a full block write,
-     *                          when prefixed/postfixed by the appropriate
-     *                          amount of (previously read) padding data.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnWrite, (void *pBackendData, uint64_t uOffset, size_t cbWrite,
-                                         PVDIOCTX pIoCtx, size_t *pcbWriteProcess));
-
-    /**
-     * Flush data to disk.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pIoCtx          I/O context associated with this request.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnFlush, (void *pBackendData, PVDIOCTX pIoCtx));
-
-    /**
-     * Discards the given amount of bytes from the cache.
-     *
-     * @returns VBox status code.
-     * @retval  VERR_VD_DISCARD_ALIGNMENT_NOT_MET if the range doesn't meet the required alignment
-     *          for the discard.
-     * @param   pBackendData         Opaque state data for this image.
-     * @param   pIoCtx               I/O context associated with this request.
-     * @param   uOffset              The offset of the first byte to discard.
-     * @param   cbDiscard            How many bytes to discard.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnDiscard, (void *pBackendData, PVDIOCTX pIoCtx,
-                                           uint64_t uOffset, size_t cbDiscard,
-                                           size_t *pcbPreAllocated,
-                                           size_t *pcbPostAllocated,
-                                           size_t *pcbActuallyDiscarded,
-                                           void   **ppbmAllocationBitmap,
-                                           unsigned fDiscard));
-
-    /**
-     * Get the version of a cache image.
-     *
-     * @returns version of cache image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetVersion, (void *pBackendData));
-
-    /**
-     * Get the capacity of a cache image.
-     *
-     * @returns size of cache image in bytes.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(uint64_t, pfnGetSize, (void *pBackendData));
-
-    /**
-     * Get the file size of a cache image.
-     *
-     * @returns size of cache image in bytes.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(uint64_t, pfnGetFileSize, (void *pBackendData));
-
-    /**
-     * Get the image flags of a cache image.
-     *
-     * @returns image flags of cache image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetImageFlags, (void *pBackendData));
-
-    /**
-     * Get the open flags of a cache image.
-     *
-     * @returns open flags of cache image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetOpenFlags, (void *pBackendData));
-
-    /**
-     * Set the open flags of a cache image. May cause the image to be locked
-     * in a different mode or be reopened (which can fail).
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOpenFlags      New open flags for this image.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetOpenFlags, (void *pBackendData, unsigned uOpenFlags));
-
-    /**
-     * Get comment of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pszComment      Where to store the comment.
-     * @param   cbComment       Size of the comment buffer.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetComment, (void *pBackendData, char *pszComment, size_t cbComment));
-
-    /**
-     * Set comment of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pszComment      Where to get the comment from. NULL resets comment.
-     *                          The comment is silently truncated if the image format
-     *                          limit is exceeded.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetComment, (void *pBackendData, const char *pszComment));
-
-    /**
-     * Get UUID of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the image UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set UUID of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the image UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Get last modification UUID of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the image modification UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetModificationUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set last modification UUID of a cache image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the image modification UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetModificationUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Dump information about a cache image.
-     *
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(void, pfnDump, (void *pBackendData));
-
-    /** Returns a human readable hard disk location string given a
-     *  set of hard disk configuration keys. The returned string is an
-     *  equivalent of the full file path for image-based hard disks.
-     *  Mandatory for backends with no VD_CAP_FILE and NULL otherwise. */
-    DECLR3CALLBACKMEMBER(int, pfnComposeLocation, (PVDINTERFACE pConfig, char **pszLocation));
-
-    /** Returns a human readable hard disk name string given a
-     *  set of hard disk configuration keys. The returned string is an
-     *  equivalent of the file name part in the full file path for
-     *  image-based hard disks. Mandatory for backends with no
-     *  VD_CAP_FILE and NULL otherwise. */
-    DECLR3CALLBACKMEMBER(int, pfnComposeName, (PVDINTERFACE pConfig, char **pszName));
-
-} VDCACHEBACKEND;
-
-/** Pointer to VD backend. */
-typedef VDCACHEBACKEND *PVDCACHEBACKEND;
-
-/** Constant pointer to VD backend. */
-typedef const VDCACHEBACKEND *PCVDCACHEBACKEND;
-
-/** Initialization entry point. */
-typedef DECLCALLBACK(int) FNVDCACHEFORMATLOAD(PVDCACHEBACKEND *ppBackendTable);
-typedef FNVDCACHEFORMATLOAD *PFNVDCACHEFORMATLOAD;
-#define VD_CACHEFORMAT_LOAD_NAME "VDCacheFormatLoad"
-
-/** The prefix to identify Storage Plugins. */
-#define VD_CACHEFORMAT_PLUGIN_PREFIX "VDCache"
-/** The size of the prefix excluding the '\\0' terminator. */
-#define VD_CACHEFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VD_CACHEFORMAT_PLUGIN_PREFIX)-1)
-
-#endif
diff --git a/include/VBox/vd-filter-backend.h b/include/VBox/vd-filter-backend.h
new file mode 100644
index 0000000..fae79fe
--- /dev/null
+++ b/include/VBox/vd-filter-backend.h
@@ -0,0 +1,107 @@
+/** @file
+ * Internal VD filter backend interface.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef __vd_filter_backend_h__
+#define __vd_filter_backend_h__
+
+#include <VBox/vd.h>
+#include <VBox/vd-ifs-internal.h>
+
+/**
+ * VD filter backend interface.
+ */
+typedef struct VDFILTERBACKEND
+{
+    /**
+     * The name of the backend (constant string).
+     */
+    const char *pszBackendName;
+
+    /**
+     * The size of the structure.
+     */
+    uint32_t cbSize;
+
+    /**
+     * Pointer to an array of structs describing each supported config key.
+     * Terminated by a NULL config key. Note that some backends do not support
+     * the configuration interface, so this pointer may just contain NULL.
+     * Mandatory if the backend sets VD_CAP_CONFIG.
+     */
+    PCVDCONFIGINFO paConfigInfo;
+
+    /**
+     * Creates a new filter instance.
+     *
+     * @returns VBox status code.
+     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
+     * @param   pVDIfsFilter    Pointer to the per-filter VD interface list.
+     * @param   ppvBackendData  Opaque state data for this filter instance.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnCreate, (PVDINTERFACE pVDIfsDisk,
+                                          PVDINTERFACE pVDIfsFilter,
+                                          void **ppvBackendData));
+
+    /**
+     * Destroys a filter instance.
+     *
+     * @returns VBox status code.
+     * @param   pvBackendData   Opaque state data for the filter instance to destroy.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnDestroy, (void *pvBackendData));
+
+    /**
+     * Filters the data of a read from the image chain. The filter is applied
+     * after everything was read.
+     *
+     * @returns VBox status code.
+     * @param   pvBackendData   Opaque state data for the filter instance.
+     * @param   uOffset         Start offset of the read.
+     * @param   cbRead          Number of bytes read.
+     * @param   pIoCtx          The I/O context holding the read data.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnFilterRead, (void *pvBackendData, uint64_t uOffset, size_t cbRead,
+                                              PVDIOCTX pIoCtx));
+
+    /**
+     * Filters the data of a write to the image chain. The filter is applied
+     * before everything is written.
+     *
+     * @returns VBox status code.
+     * @param   pvBackendData   Opaque state data for the filter instance.
+     * @param   uOffset         Start offset of the write.
+     * @param   cbWrite         Number of bytes to be written.
+     * @param   pIoCtx          The I/O context holding the data to write.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnFilterWrite, (void *pvBackendData, uint64_t uOffset, size_t cbWrite,
+                                               PVDIOCTX pIoCtx));
+
+} VDFILTERBACKEND;
+/** Pointer to VD filter backend. */
+typedef VDFILTERBACKEND *PVDFILTERBACKEND;
+/** Constant pointer to a VD filter backend. */
+typedef const VDFILTERBACKEND *PCVDFILTERBACKEND;
+
+#endif
diff --git a/include/VBox/vd-ifs-internal.h b/include/VBox/vd-ifs-internal.h
index 41c551f..63b5b9c 100644
--- a/include/VBox/vd-ifs-internal.h
+++ b/include/VBox/vd-ifs-internal.h
@@ -406,6 +406,16 @@ typedef struct VDINTERFACEIOINT
     DECLR3CALLBACKMEMBER(bool, pfnIoCtxIsZero, (void *pvUser, PVDIOCTX pIoCtx,
                                                 size_t cbCheck, bool fAdvance));
 
+    /**
+     * Returns the data unit size, i.e. the smallest size for a transfer.
+     * (similar to the sector size of disks).
+     *
+     * @returns The data unit size.
+     * @param   pvUser         The opaque user data passed on container creation.
+     * @param   pIoCtx         The I/O context.
+     */
+    DECLR3CALLBACKMEMBER(size_t, pfnIoCtxGetDataUnitSize, (void *pvUser, PVDIOCTX pIoCtx));
+
 } VDINTERFACEIOINT, *PVDINTERFACEIOINT;
 
 /**
@@ -584,6 +594,55 @@ DECLINLINE(bool) vdIfIoIntIoCtxIsZero(PVDINTERFACEIOINT pIfIoInt, PVDIOCTX pIoCt
     return pIfIoInt->pfnIoCtxIsZero(pIfIoInt->Core.pvUser, pIoCtx, cbCheck, fAdvance);
 }
 
+DECLINLINE(size_t) vdIfIoIntIoCtxGetDataUnitSize(PVDINTERFACEIOINT pIfIoInt, PVDIOCTX pIoCtx)
+{
+    return pIfIoInt->pfnIoCtxGetDataUnitSize(pIfIoInt->Core.pvUser, pIoCtx);
+}
+
+/**
+ * Interface for the metadata traverse callback.
+ *
+ * Per-operation interface. Present only for the metadata traverse callback.
+ */
+typedef struct VDINTERFACETRAVERSEMETADATA
+{
+    /**
+     * Common interface header.
+     */
+    VDINTERFACE    Core;
+
+    /**
+     * Traverse callback.
+     *
+     * @returns VBox status code.
+     * @param   pvUser          The opaque data passed for the operation.
+     * @param   pvMetadataChunk Pointer to a chunk of the image metadata.
+     * @param   cbMetadataChunk Size of the metadata chunk
+     */
+    DECLR3CALLBACKMEMBER(int, pfnMetadataCallback, (void *pvUser, const void *pvMetadataChunk,
+                                                    size_t cbMetadataChunk));
+
+} VDINTERFACETRAVERSEMETADATA, *PVDINTERFACETRAVERSEMETADATA;
+
+
+/**
+ * Get parent state interface from interface list.
+ *
+ * @return Pointer to the first parent state interface in the list.
+ * @param  pVDIfs    Pointer to the interface list.
+ */
+DECLINLINE(PVDINTERFACETRAVERSEMETADATA) VDIfTraverseMetadataGet(PVDINTERFACE pVDIfs)
+{
+    PVDINTERFACE pIf = VDInterfaceGet(pVDIfs, VDINTERFACETYPE_TRAVERSEMETADATA);
+
+    /* Check that the interface descriptor the correct interface. */
+    AssertMsgReturn(   !pIf
+                    || (   (pIf->enmInterface == VDINTERFACETYPE_TRAVERSEMETADATA)
+                        && (pIf->cbSize == sizeof(VDINTERFACETRAVERSEMETADATA))),
+                    ("Not a traverse metadata interface"), NULL);
+
+    return (PVDINTERFACETRAVERSEMETADATA)pIf;
+}
 
 RT_C_DECLS_END
 
diff --git a/include/VBox/vd-ifs.h b/include/VBox/vd-ifs.h
index 9d2d4e4..24ada08 100644
--- a/include/VBox/vd-ifs.h
+++ b/include/VBox/vd-ifs.h
@@ -67,6 +67,8 @@ typedef enum VDINTERFACETYPE
     VDINTERFACETYPE_IOINT,
     /** Interface to query the use of block ranges on the disk. Per-operation. */
     VDINTERFACETYPE_QUERYRANGEUSE,
+    /** Interface for the metadata traverse callback. Per-operation. */
+    VDINTERFACETYPE_TRAVERSEMETADATA,
     /** invalid interface. */
     VDINTERFACETYPE_INVALID
 } VDINTERFACETYPE;
@@ -741,6 +743,19 @@ typedef struct VDINTERFACECONFIG
      */
     DECLR3CALLBACKMEMBER(int, pfnQuery, (void *pvUser, const char *pszName, char *pszValue, size_t cchValue));
 
+    /**
+     * Query the bytes value associated with a key.
+     *
+     * @return  VBox status code.
+     *          VERR_CFGM_VALUE_NOT_FOUND means that the key is not known.
+     *          VERR_CFGM_NOT_ENOUGH_SPACE means that the buffer is not big enough.
+     * @param   pvUser          The opaque user data associated with this interface.
+     * @param   pszName         Name of the key to query.
+     * @param   ppvData         Pointer to buffer where to store the data.
+     * @param   cbData          Length of data buffer.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnQueryBytes, (void *pvUser, const char *pszName, void *ppvData, size_t cbData));
+
 } VDINTERFACECONFIG, *PVDINTERFACECONFIG;
 
 /**
@@ -948,11 +963,15 @@ DECLINLINE(int) VDCFGQueryBytesAlloc(PVDINTERFACECONFIG pCfgIf,
         pbData = (char *)RTMemAlloc(cb);
         if (pbData)
         {
-            rc = pCfgIf->pfnQuery(pCfgIf->Core.pvUser, pszName, pbData, cb);
+            if(pCfgIf->pfnQueryBytes)
+                rc = pCfgIf->pfnQueryBytes(pCfgIf->Core.pvUser, pszName, pbData, cb);
+            else
+                rc = pCfgIf->pfnQuery(pCfgIf->Core.pvUser, pszName, pbData, cb);
+
             if (RT_SUCCESS(rc))
             {
                 *ppvData = pbData;
-                *pcbData = cb - 1; /* Exclude terminator of the queried string. */
+                *pcbData = cb;
             }
             else
                 RTMemFree(pbData);
@@ -963,6 +982,137 @@ DECLINLINE(int) VDCFGQueryBytesAlloc(PVDINTERFACECONFIG pCfgIf,
     return rc;
 }
 
+/**
+ * Query configuration, dynamically allocated (RTMemAlloc) zero terminated
+ * character value - the memory is locked to prevent paging to disk,
+ * useful for memory which holds keys, passwords, etc.
+ *
+ * @return  VBox status code.
+ * @param   pCfgIf      Pointer to configuration callback table.
+ * @param   pszName     Name of an zero terminated character value
+ * @param   ppszString  Where to store the string pointer. Not set on failure.
+ *                      Free this using RTMemFree().
+ */
+DECLINLINE(int) VDCFGQueryStringAllocLocked(PVDINTERFACECONFIG pCfgIf,
+                                            const char *pszName, char **ppszString)
+{
+    size_t cb;
+    int rc = pCfgIf->pfnQuerySize(pCfgIf->Core.pvUser, pszName, &cb);
+    if (RT_SUCCESS(rc))
+    {
+        char *pszString = (char *)RTMemLockedAlloc(cb);
+        if (pszString)
+        {
+            rc = pCfgIf->pfnQuery(pCfgIf->Core.pvUser, pszName, pszString, cb);
+            if (RT_SUCCESS(rc))
+                *ppszString = pszString;
+            else
+                RTMemFree(pszString);
+        }
+        else
+            rc = VERR_NO_MEMORY;
+    }
+    return rc;
+}
+
+/**
+ * Query configuration, dynamically allocated (RTMemAlloc) zero terminated
+ * character value with default - the memory is locked to prevent paging to disk,
+ * useful for memory which holds keys, passwords, etc.
+ *
+ * @return  VBox status code.
+ * @param   pCfgIf      Pointer to configuration callback table.
+ * @param   pszName     Name of an zero terminated character value
+ * @param   ppszString  Where to store the string pointer. Not set on failure.
+ *                      Free this using RTMemFree().
+ * @param   pszDef      The default value.
+ */
+DECLINLINE(int) VDCFGQueryStringAllocLockedDef(PVDINTERFACECONFIG pCfgIf,
+                                               const char *pszName,
+                                               char **ppszString,
+                                               const char *pszDef)
+{
+    size_t cb;
+    int rc = pCfgIf->pfnQuerySize(pCfgIf->Core.pvUser, pszName, &cb);
+    if (rc == VERR_CFGM_VALUE_NOT_FOUND || rc == VERR_CFGM_NO_PARENT)
+    {
+        cb = strlen(pszDef) + 1;
+        rc = VINF_SUCCESS;
+    }
+    if (RT_SUCCESS(rc))
+    {
+        char *pszString = (char *)RTMemLockedAlloc(cb);
+        if (pszString)
+        {
+            rc = pCfgIf->pfnQuery(pCfgIf->Core.pvUser, pszName, pszString, cb);
+            if (rc == VERR_CFGM_VALUE_NOT_FOUND || rc == VERR_CFGM_NO_PARENT)
+            {
+                memcpy(pszString, pszDef, cb);
+                rc = VINF_SUCCESS;
+            }
+            if (RT_SUCCESS(rc))
+                *ppszString = pszString;
+            else
+                RTMemFree(pszString);
+        }
+        else
+            rc = VERR_NO_MEMORY;
+    }
+    return rc;
+}
+
+/**
+ * Query configuration, dynamically allocated (RTMemAlloc) byte string value -
+ * the memory is locked to prevent paging to disk, useful for memory which holds
+ * keys, passwords, etc..
+ *
+ * @return  VBox status code.
+ * @param   pCfgIf      Pointer to configuration callback table.
+ * @param   pszName     Name of an zero terminated character value
+ * @param   ppvData     Where to store the byte string pointer. Not set on failure.
+ *                      Free this using RTMemFree().
+ * @param   pcbData     Where to store the byte string length.
+ */
+DECLINLINE(int) VDCFGQueryBytesAllocLocked(PVDINTERFACECONFIG pCfgIf,
+                                           const char *pszName, void **ppvData, size_t *pcbData)
+{
+    size_t cb;
+    int rc = pCfgIf->pfnQuerySize(pCfgIf->Core.pvUser, pszName, &cb);
+    if (RT_SUCCESS(rc))
+    {
+        char *pbData;
+        Assert(cb);
+
+        pbData = (char *)RTMemLockedAlloc(cb);
+        if (pbData)
+        {
+            if(pCfgIf->pfnQueryBytes)
+                rc = pCfgIf->pfnQueryBytes(pCfgIf->Core.pvUser, pszName, pbData, cb);
+            else
+                rc = pCfgIf->pfnQuery(pCfgIf->Core.pvUser, pszName, pbData, cb);
+
+            if (RT_SUCCESS(rc))
+            {
+                *ppvData = pbData;
+                *pcbData = cb;
+            }
+            else
+                RTMemFree(pbData);
+        }
+        else
+            rc = VERR_NO_MEMORY;
+    }
+    return rc;
+}
+
+/**
+ * Frees memory allocated using one of the VDCFGQuery*AllocLocked methods.
+ */
+DECLINLINE(void) VDCFGMemLockedFree(void *pvData)
+{
+    RTMemLockedFree(pvData);
+}
+
 /** Forward declaration of a VD socket. */
 typedef struct VDSOCKETINT *VDSOCKET;
 /** Pointer to a VD socket. */
diff --git a/include/VBox/vd-plugin.h b/include/VBox/vd-image-backend.h
similarity index 95%
copy from include/VBox/vd-plugin.h
copy to include/VBox/vd-image-backend.h
index 1a0ca12..c8926db 100644
--- a/include/VBox/vd-plugin.h
+++ b/include/VBox/vd-image-backend.h
@@ -1,9 +1,9 @@
 /** @file
- * Internal hard disk format support API for VBoxHDD.
+ * VD: Image backend interface.
  */
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -23,8 +23,8 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-#ifndef __VBoxHDD_Plugin_h__
-#define __VBoxHDD_Plugin_h__
+#ifndef __vd_image_backend_h__
+#define __vd_image_backend_h__
 
 #include <VBox/vd.h>
 #include <VBox/vd-ifs-internal.h>
@@ -49,6 +49,13 @@
 #define VD_DISCARD_MARK_UNUSED RT_BIT(0)
 /** @}*/
 
+/** @name VBox HDD backend metadata traverse flags
+ * @{
+ */
+/** Include per block metadata while traversing the metadata.
+ * This might take much longer instead of traversing just global metadata. */
+#define VD_TRAVERSE_METADATA_INCLUDE_PER_BLOCK_METADATA RT_BIT(0)
+/** @}*/
 
 /**
  * Image format backend interface used by VBox HDD Container implementation.
@@ -86,11 +93,6 @@ typedef struct VBOXHDDBACKEND
     PCVDCONFIGINFO paConfigInfo;
 
     /**
-     * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.
-     */
-    RTLDRMOD hPlugin;
-
-    /**
      * Check if a file is valid for the backend.
      *
      * @returns VBox status code.
@@ -565,11 +567,25 @@ typedef struct VBOXHDDBACKEND
     DECLR3CALLBACKMEMBER(int, pfnRepair, (const char *pszFilename, PVDINTERFACE pVDIfsDisk,
                                           PVDINTERFACE pVDIfsImage, uint32_t fFlags));
 
+    /**
+     * Traverse all metadata of the opened image.
+     *
+     * @returns VBox status code.
+     * @param   pBackendData    Opaque state data for this image.
+     * @param   fFlags          Traverse flags, combination of VD_TRAVERSE_METDATA_* defines.
+     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
+     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
+     * @param   pVDIfsOperation Pointer to the per-operation VD interface list.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnTraverseMetadata, (void *pBackendData, uint32_t fFlags,
+                                                    PVDINTERFACE pVDIfsDisk,
+                                                    PVDINTERFACE pVDIfsImage,
+                                                    PVDINTERFACE pVDIfsOperation));
+
 } VBOXHDDBACKEND;
 
 /** Pointer to VD backend. */
 typedef VBOXHDDBACKEND *PVBOXHDDBACKEND;
-
 /** Constant pointer to VD backend. */
 typedef const VBOXHDDBACKEND *PCVBOXHDDBACKEND;
 
@@ -586,14 +602,4 @@ DECLINLINE(int) genericFileComposeName(PVDINTERFACE pConfig, char **pszName)
     return VINF_SUCCESS;
 }
 
-/** Initialization entry point. */
-typedef DECLCALLBACK(int) VBOXHDDFORMATLOAD(PVBOXHDDBACKEND *ppBackendTable);
-typedef VBOXHDDFORMATLOAD *PFNVBOXHDDFORMATLOAD;
-#define VBOX_HDDFORMAT_LOAD_NAME "VBoxHDDFormatLoad"
-
-/** The prefix to identify Storage Plugins. */
-#define VBOX_HDDFORMAT_PLUGIN_PREFIX "VBoxHDD"
-/** The size of the prefix excluding the '\\0' terminator. */
-#define VBOX_HDDFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VBOX_HDDFORMAT_PLUGIN_PREFIX)-1)
-
 #endif
diff --git a/include/VBox/vd-plugin.h b/include/VBox/vd-plugin.h
index 1a0ca12..fdd29d3 100644
--- a/include/VBox/vd-plugin.h
+++ b/include/VBox/vd-plugin.h
@@ -1,9 +1,9 @@
 /** @file
- * Internal hard disk format support API for VBoxHDD.
+ * VD: Plugin support API.
  */
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -23,577 +23,63 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-#ifndef __VBoxHDD_Plugin_h__
-#define __VBoxHDD_Plugin_h__
+#ifndef __vd_plugin_h__
+#define __vd_plugin_h__
 
 #include <VBox/vd.h>
-#include <VBox/vd-ifs-internal.h>
-
-
-/** @name VBox HDD backend write flags
- * @{
- */
-/** Do not allocate a new block on this write. This is just an advisory
- * flag. The backend may still decide in some circumstances that it wants
- * to ignore this flag (which may cause extra dynamic image expansion). */
-#define VD_WRITE_NO_ALLOC   RT_BIT(1)
-/** @}*/
-
-/** @name VBox HDD backend discard flags
- * @{
- */
-/** Don't discard block but mark the given range as unused
- * (usually by writing 0's to it).
- * This doesn't require the range to be aligned on a block boundary but
- * the image size might not be decreased. */
-#define VD_DISCARD_MARK_UNUSED RT_BIT(0)
-/** @}*/
-
+#include <VBox/vd-image-backend.h>
+#include <VBox/vd-cache-backend.h>
+#include <VBox/vd-filter-backend.h>
 
 /**
- * Image format backend interface used by VBox HDD Container implementation.
+ * Backend register callbacks structure.
  */
-typedef struct VBOXHDDBACKEND
+typedef struct VDBACKENDREGISTER
 {
     /**
-     * The name of the backend (constant string).
-     */
-    const char *pszBackendName;
-
-    /**
-     * The size of the structure.
-     */
-    uint32_t cbSize;
-
-    /**
-     * The capabilities of the backend.
-     */
-    uint64_t uBackendCaps;
-
-    /**
-     * Pointer to a NULL-terminated array, containing the supported
-     * file extensions. Note that some backends do not work on files, so this
-     * pointer may just contain NULL.
-     */
-    PCVDFILEEXTENSION paFileExtensions;
-
-    /**
-     * Pointer to an array of structs describing each supported config key.
-     * Terminated by a NULL config key. Note that some backends do not support
-     * the configuration interface, so this pointer may just contain NULL.
-     * Mandatory if the backend sets VD_CAP_CONFIG.
-     */
-    PCVDCONFIGINFO paConfigInfo;
-
-    /**
-     * Handle of loaded plugin library, NIL_RTLDRMOD for static backends.
-     */
-    RTLDRMOD hPlugin;
-
-    /**
-     * Check if a file is valid for the backend.
+     * Registers a new image backend.
      *
      * @returns VBox status code.
-     * @param   pszFilename     Name of the image file.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   penmType        Returns the supported device type on success.
+     * @param   pvUser    Opaque user data given in the plugin load callback.
+     * @param   pBackend  The image backend to register.
      */
-    DECLR3CALLBACKMEMBER(int, pfnCheckIfValid, (const char *pszFilename, PVDINTERFACE pVDIfsDisk,
-                                                PVDINTERFACE pVDIfsImage, VDTYPE *penmType));
+    DECLR3CALLBACKMEMBER(int, pfnRegisterImage, (void *pvUser, PCVBOXHDDBACKEND pBackend));
 
     /**
-     * Open a disk image.
+     * Registers a new cache backend.
      *
      * @returns VBox status code.
-     * @param   pszFilename     Name of the image file to open. Guaranteed to be available and
-     *                          unchanged during the lifetime of this image.
-     * @param   uOpenFlags      Image file open mode, see VD_OPEN_FLAGS_* constants.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   enmType         Requested type of the image.
-     * @param   ppBackendData   Opaque state data for this image.
+     * @param   pvUser    Opaque user data given in the plugin load callback.
+     * @param   pBackend  The cache backend to register.
      */
-    DECLR3CALLBACKMEMBER(int, pfnOpen, (const char *pszFilename, unsigned uOpenFlags,
-                                        PVDINTERFACE pVDIfsDisk, PVDINTERFACE pVDIfsImage,
-                                        VDTYPE enmType, void **ppBackendData));
+    DECLR3CALLBACKMEMBER(int, pfnRegisterCache, (void *pvUser, PCVDCACHEBACKEND pBackend));
 
     /**
-     * Create a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pszFilename     Name of the image file to create. Guaranteed to be available and
-     *                          unchanged during the lifetime of this image.
-     * @param   cbSize          Image size in bytes.
-     * @param   uImageFlags     Flags specifying special image features.
-     * @param   pszComment      Pointer to image comment. NULL is ok.
-     * @param   pPCHSGeometry   Physical drive geometry CHS <= (16383,16,255).
-     * @param   pLCHSGeometry   Logical drive geometry CHS <= (1024,255,63).
-     * @param   pUuid           New UUID of the image. Not NULL.
-     * @param   uOpenFlags      Image file open mode, see VD_OPEN_FLAGS_* constants.
-     * @param   uPercentStart   Starting value for progress percentage.
-     * @param   uPercentSpan    Span for varying progress percentage.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   pVDIfsOperation Pointer to the per-operation VD interface list.
-     * @param   ppBackendData   Opaque state data for this image.
+     * Registers a new filter plugin.
+     * @param   pvUser    Opaque user data given in the plugin load callback.
+     * @param   pBackend  The filter backend to register.
      */
-    DECLR3CALLBACKMEMBER(int, pfnCreate, (const char *pszFilename, uint64_t cbSize,
-                                          unsigned uImageFlags, const char *pszComment,
-                                          PCVDGEOMETRY pPCHSGeometry,
-                                          PCVDGEOMETRY pLCHSGeometry,
-                                          PCRTUUID pUuid, unsigned uOpenFlags,
-                                          unsigned uPercentStart, unsigned uPercentSpan,
-                                          PVDINTERFACE pVDIfsDisk,
-                                          PVDINTERFACE pVDIfsImage,
-                                          PVDINTERFACE pVDIfsOperation,
-                                          void **ppBackendData));
+    DECLR3CALLBACKMEMBER(int, pfnRegisterFilter, (void *pvUser, PCVDFILTERBACKEND pBackend));
 
-    /**
-     * Rename a disk image. Only needs to work as long as the operating
-     * system's rename file functionality is usable. If an attempt is made to
-     * rename an image to a location on another disk/filesystem, this function
-     * may just fail with an appropriate error code (not changing the opened
-     * image data at all). Also works only on images which actually refer to
-     * regular files. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pszFilename     New name of the image file. Guaranteed to be available and
-     *                          unchanged during the lifetime of this image.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnRename, (void *pBackendData, const char *pszFilename));
-
-    /**
-     * Close a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   fDelete         If true, delete the image from the host disk.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnClose, (void *pBackendData, bool fDelete));
-
-    /**
-     * Start a read request.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOffset         The offset of the virtual disk to read from.
-     * @param   cbRead          How many bytes to read.
-     * @param   pIoCtx          I/O context associated with this request.
-     * @param   pcbActuallyRead Pointer to returned number of bytes read.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnRead, (void *pBackendData, uint64_t uOffset, size_t cbRead,
-                                        PVDIOCTX pIoCtx, size_t *pcbActuallyRead));
+} VDBACKENDREGISTER;
+/** Pointer to a backend register callbacks structure. */
+typedef VDBACKENDREGISTER *PVDBACKENDREGISTER;
 
-    /**
-     * Start a write request.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOffset         The offset of the virtual disk to write to.
-     * @param   cbWrite         How many bytes to write.
-     * @param   pIoCtx          I/O context associated with this request.
-     * @param   pcbWriteProcess Pointer to returned number of bytes that could
-     *                          be processed. In case the function returned
-     *                          VERR_VD_BLOCK_FREE this is the number of bytes
-     *                          that could be written in a full block write,
-     *                          when prefixed/postfixed by the appropriate
-     *                          amount of (previously read) padding data.
-     * @param   pcbPreRead      Pointer to the returned amount of data that must
-     *                          be prefixed to perform a full block write.
-     * @param   pcbPostRead     Pointer to the returned amount of data that must
-     *                          be postfixed to perform a full block write.
-     * @param   fWrite          Flags which affect write behavior. Combination
-     *                          of the VD_WRITE_* flags.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnWrite, (void *pBackendData, uint64_t uOffset, size_t cbWrite,
-                                         PVDIOCTX pIoCtx,
-                                         size_t *pcbWriteProcess, size_t *pcbPreRead,
-                                         size_t *pcbPostRead, unsigned fWrite));
-
-    /**
-     * Flush data to disk.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pIoCtx          I/O context associated with this request.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnFlush, (void *pBackendData, PVDIOCTX pIoCtx));
-
-    /**
-     * Discards the given amount of bytes decreasing the size of the image if possible
-     *
-     * @returns VBox status code.
-     * @retval  VERR_VD_DISCARD_ALIGNMENT_NOT_MET if the range doesn't meet the required alignment
-     *          for the discard.
-     * @param   pBackendData         Opaque state data for this image.
-     * @param   pIoCtx               I/O context associated with this request.
-     * @param   uOffset              The offset of the first byte to discard.
-     * @param   cbDiscard            How many bytes to discard.
-     * @param   pcbPreAllocated      Pointer to the returned amount of bytes that must
-     *                               be discarded before the range to perform a full
-     *                               block discard.
-     * @param   pcbPostAllocated     Pointer to the returned amount of bytes that must
-     *                               be discarded after the range to perform a full
-     *                               block discard.
-     * @param   pcbActuallyDiscarded Pointer to the returned amount of bytes which
-     *                               could be actually discarded.
-     * @param   ppbmAllocationBitmap Where to store the pointer to the allocation bitmap
-     *                               if VERR_VD_DISCARD_ALIGNMENT_NOT_MET is returned or NULL
-     *                               if the allocation bitmap should be returned.
-     * @param   fDiscard             Flags which affect discard behavior. Combination
-     *                               of the VD_DISCARD_* flags.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnDiscard, (void *pBackendData, PVDIOCTX pIoCtx,
-                                           uint64_t uOffset, size_t cbDiscard,
-                                           size_t *pcbPreAllocated,
-                                           size_t *pcbPostAllocated,
-                                           size_t *pcbActuallyDiscarded,
-                                           void   **ppbmAllocationBitmap,
-                                           unsigned fDiscard));
-
-    /**
-     * Get the version of a disk image.
-     *
-     * @returns version of disk image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetVersion, (void *pBackendData));
-
-    /**
-     * Get the sector size of a disk image.
-     *
-     * @returns size of disk image in bytes.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(uint32_t, pfnGetSectorSize, (void *pBackendData));
-
-    /**
-     * Get the capacity of a disk image.
-     *
-     * @returns size of disk image in bytes.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(uint64_t, pfnGetSize, (void *pBackendData));
-
-    /**
-     * Get the file size of a disk image.
-     *
-     * @returns size of disk image in bytes.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(uint64_t, pfnGetFileSize, (void *pBackendData));
-
-    /**
-     * Get virtual disk PCHS geometry stored in a disk image.
-     *
-     * @returns VBox status code.
-     * @returns VERR_VD_GEOMETRY_NOT_SET if no geometry present in the image.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pPCHSGeometry   Where to store the geometry. Not NULL.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetPCHSGeometry, (void *pBackendData, PVDGEOMETRY pPCHSGeometry));
-
-    /**
-     * Set virtual disk PCHS geometry stored in a disk image.
-     * Only called if geometry is different than before.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pPCHSGeometry   Where to load the geometry from. Not NULL.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetPCHSGeometry, (void *pBackendData, PCVDGEOMETRY pPCHSGeometry));
-
-    /**
-     * Get virtual disk LCHS geometry stored in a disk image.
-     *
-     * @returns VBox status code.
-     * @returns VERR_VD_GEOMETRY_NOT_SET if no geometry present in the image.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pLCHSGeometry   Where to store the geometry. Not NULL.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetLCHSGeometry, (void *pBackendData,  PVDGEOMETRY pLCHSGeometry));
-
-    /**
-     * Set virtual disk LCHS geometry stored in a disk image.
-     * Only called if geometry is different than before.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pLCHSGeometry   Where to load the geometry from. Not NULL.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetLCHSGeometry, (void *pBackendData,  PCVDGEOMETRY pLCHSGeometry));
-
-    /**
-     * Get the image flags of a disk image.
-     *
-     * @returns image flags of disk image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetImageFlags, (void *pBackendData));
-
-    /**
-     * Get the open flags of a disk image.
-     *
-     * @returns open flags of disk image.
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(unsigned, pfnGetOpenFlags, (void *pBackendData));
-
-    /**
-     * Set the open flags of a disk image. May cause the image to be locked
-     * in a different mode or be reopened (which can fail).
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uOpenFlags      New open flags for this image.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetOpenFlags, (void *pBackendData, unsigned uOpenFlags));
-
-    /**
-     * Get comment of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pszComment      Where to store the comment.
-     * @param   cbComment       Size of the comment buffer.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetComment, (void *pBackendData, char *pszComment, size_t cbComment));
-
-    /**
-     * Set comment of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pszComment      Where to get the comment from. NULL resets comment.
-     *                          The comment is silently truncated if the image format
-     *                          limit is exceeded.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetComment, (void *pBackendData, const char *pszComment));
-
-    /**
-     * Get UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the image UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the image UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Get last modification UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the image modification UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetModificationUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set last modification UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the image modification UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetModificationUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Get parent UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the parent image UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetParentUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set parent UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the parent image UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetParentUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Get parent modification UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to store the parent image modification UUID.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetParentModificationUuid, (void *pBackendData, PRTUUID pUuid));
-
-    /**
-     * Set parent modification UUID of a disk image.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pUuid           Where to get the parent image modification UUID from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetParentModificationUuid, (void *pBackendData, PCRTUUID pUuid));
-
-    /**
-     * Dump information about a disk image.
-     *
-     * @param   pBackendData    Opaque state data for this image.
-     */
-    DECLR3CALLBACKMEMBER(void, pfnDump, (void *pBackendData));
-
-    /**
-     * Get a time stamp of a disk image. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pTimeStamp      Where to store the time stamp.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetTimeStamp, (void *pBackendData, PRTTIMESPEC pTimeStamp));
-
-    /**
-     * Get the parent time stamp of a disk image. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pTimeStamp      Where to store the time stamp.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetParentTimeStamp, (void *pBackendData, PRTTIMESPEC pTimeStamp));
-
-    /**
-     * Set the parent time stamp of a disk image. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   pTimeStamp      Where to get the time stamp from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetParentTimeStamp, (void *pBackendData, PCRTTIMESPEC pTimeStamp));
-
-    /**
-     * Get the relative path to parent image. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData      Opaque state data for this image.
-     * @param   pszParentFilename Where to store the path.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnGetParentFilename, (void *pBackendData, char **ppszParentFilename));
-
-    /**
-     * Set the relative path to parent image. May be NULL.
-     *
-     * @returns VBox status code.
-     * @param   pBackendData      Opaque state data for this image.
-     * @param   pszParentFilename Where to get the path from.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnSetParentFilename, (void *pBackendData, const char *pszParentFilename));
-
-    /** Returns a human readable hard disk location string given a
-     *  set of hard disk configuration keys. The returned string is an
-     *  equivalent of the full file path for image-based hard disks.
-     *  Mandatory for backends with no VD_CAP_FILE and NULL otherwise. */
-    DECLR3CALLBACKMEMBER(int, pfnComposeLocation, (PVDINTERFACE pConfig, char **pszLocation));
-
-    /** Returns a human readable hard disk name string given a
-     *  set of hard disk configuration keys. The returned string is an
-     *  equivalent of the file name part in the full file path for
-     *  image-based hard disks. Mandatory for backends with no
-     *  VD_CAP_FILE and NULL otherwise. */
-    DECLR3CALLBACKMEMBER(int, pfnComposeName, (PVDINTERFACE pConfig, char **pszName));
-
-    /**
-     * Compact the image. The pointer may be NULL, indicating that this
-     * isn't supported yet (for file-based images) or not necessary.
-     *
-     * @returns VBox status code.
-     * @returns VERR_NOT_SUPPORTED if this image cannot be compacted yet.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   uPercentStart   Starting value for progress percentage.
-     * @param   uPercentSpan    Span for varying progress percentage.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   pVDIfsOperation Pointer to the per-operation VD interface list.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnCompact, (void *pBackendData,
-                                           unsigned uPercentStart, unsigned uPercentSpan,
-                                           PVDINTERFACE pVDIfsDisk,
-                                           PVDINTERFACE pVDIfsImage,
-                                           PVDINTERFACE pVDIfsOperation));
-
-    /**
-     * Resize the image. The pointer may be NULL, indicating that this
-     * isn't supported yet (for file-based images) or not necessary.
-     *
-     * @returns VBox status code.
-     * @returns VERR_NOT_SUPPORTED if this image cannot be resized yet.
-     * @param   pBackendData    Opaque state data for this image.
-     * @param   cbSize          New size of the image.
-     * @param   pPCHSGeometry   Pointer to the new physical disk geometry <= (16383,16,63). Not NULL.
-     * @param   pLCHSGeometry   Pointer to the new logical disk geometry <= (x,255,63). Not NULL.
-     * @param   uPercentStart   Starting value for progress percentage.
-     * @param   uPercentSpan    Span for varying progress percentage.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   pVDIfsOperation Pointer to the per-operation VD interface list.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnResize, (void *pBackendData,
-                                          uint64_t cbSize,
-                                          PCVDGEOMETRY pPCHSGeometry,
-                                          PCVDGEOMETRY pLCHSGeometry,
-                                          unsigned uPercentStart, unsigned uPercentSpan,
-                                          PVDINTERFACE pVDIfsDisk,
-                                          PVDINTERFACE pVDIfsImage,
-                                          PVDINTERFACE pVDIfsOperation));
-
-    /**
-     * Try to repair the given image.
-     *
-     * @returns VBox status code.
-     * @param   pszFilename     Name of the image file.
-     * @param   pVDIfsDisk      Pointer to the per-disk VD interface list.
-     * @param   pVDIfsImage     Pointer to the per-image VD interface list.
-     * @param   fFlags          Combination of the VD_REPAIR_* flags.
-     */
-    DECLR3CALLBACKMEMBER(int, pfnRepair, (const char *pszFilename, PVDINTERFACE pVDIfsDisk,
-                                          PVDINTERFACE pVDIfsImage, uint32_t fFlags));
-
-} VBOXHDDBACKEND;
-
-/** Pointer to VD backend. */
-typedef VBOXHDDBACKEND *PVBOXHDDBACKEND;
-
-/** Constant pointer to VD backend. */
-typedef const VBOXHDDBACKEND *PCVBOXHDDBACKEND;
-
-/** @copydoc VBOXHDDBACKEND::pfnComposeLocation */
-DECLINLINE(int) genericFileComposeLocation(PVDINTERFACE pConfig, char **pszLocation)
-{
-    *pszLocation = NULL;
-    return VINF_SUCCESS;
-}
-/** @copydoc VBOXHDDBACKEND::pfnComposeName */
-DECLINLINE(int) genericFileComposeName(PVDINTERFACE pConfig, char **pszName)
-{
-    *pszName = NULL;
-    return VINF_SUCCESS;
-}
-
-/** Initialization entry point. */
-typedef DECLCALLBACK(int) VBOXHDDFORMATLOAD(PVBOXHDDBACKEND *ppBackendTable);
-typedef VBOXHDDFORMATLOAD *PFNVBOXHDDFORMATLOAD;
-#define VBOX_HDDFORMAT_LOAD_NAME "VBoxHDDFormatLoad"
+/**
+ * Initialization entry point called by the generic VD layer when
+ * a plugin is loaded.
+ *
+ * @returns VBox status code.
+ * @param   pvUser             Opaque user data passed in the register callbacks.
+ * @param   pRegisterCallbacks Pointer to the register callbacks structure.
+ */
+typedef DECLCALLBACK(int) FNVDPLUGINLOAD(void *pvUser, PVDBACKENDREGISTER pRegisterCallbacks);
+typedef FNVDPLUGINLOAD *PFNVDPLUGINLOAD;
+#define VD_PLUGIN_LOAD_NAME "VDPluginLoad"
 
 /** The prefix to identify Storage Plugins. */
-#define VBOX_HDDFORMAT_PLUGIN_PREFIX "VBoxHDD"
+#define VD_PLUGIN_PREFIX "VDPlugin"
 /** The size of the prefix excluding the '\\0' terminator. */
-#define VBOX_HDDFORMAT_PLUGIN_PREFIX_LENGTH (sizeof(VBOX_HDDFORMAT_PLUGIN_PREFIX)-1)
+#define VD_PLUGIN_PREFIX_LENGTH (sizeof(VD_PLUGIN_PREFIX)-1)
 
 #endif
diff --git a/include/VBox/vd.h b/include/VBox/vd.h
index ba0768e..64c0b26 100644
--- a/include/VBox/vd.h
+++ b/include/VBox/vd.h
@@ -472,6 +472,22 @@ VBOXDDU_DECL(int) VDInit(void);
 VBOXDDU_DECL(int) VDShutdown(void);
 
 /**
+ * Loads a single plugin given by filename.
+ *
+ * @returns VBox status code.
+ * @param   pszFilename     The plugin filename to load.
+ */
+VBOXDDU_DECL(int) VDPluginLoadFromFilename(const char *pszFilename);
+
+/**
+ * Load all plugins from a given path.
+ *
+ * @returns VBox statuse code.
+ * @param   pszPath         The path to load plugins from.
+ */
+VBOXDDU_DECL(int) VDPluginLoadFromPath(const char *pszPath);
+
+/**
  * Lists all HDD backends and their capabilities in a caller-provided buffer.
  *
  * @return  VBox status code.
@@ -568,6 +584,17 @@ VBOXDDU_DECL(int) VDCacheOpen(PVBOXHDD pDisk, const char *pszBackend,
                               PVDINTERFACE pVDIfsCache);
 
 /**
+ * Adds a filter to the disk.
+ *
+ * @returns VBox status code.
+ * @param   pDisk           Pointer to the HDD container which should use the filter.
+ * @param   pszFilter       Name of the filter backend to use (case insensitive).
+ * @param   pVDIfsFilter    Pointer to the per-filter VD interface list.
+ */
+VBOXDDU_DECL(int) VDFilterAdd(PVBOXHDD pDisk, const char *pszFilter,
+                              PVDINTERFACE pVDIfsFilter);
+
+/**
  * Creates and opens a new base image file.
  *
  * @return  VBox status code.
@@ -828,6 +855,15 @@ VBOXDDU_DECL(int) VDResize(PVBOXHDD pDisk, uint64_t cbSize,
 VBOXDDU_DECL(int) VDClose(PVBOXHDD pDisk, bool fDelete);
 
 /**
+ * Removes the last added filter in the HDD container.
+ *
+ * @return  VBox status code.
+ * @retval  VERR_VD_NOT_OPENED if no filter is present for the disk.
+ * @param   pDisk           Pointer to HDD container.
+ */
+VBOXDDU_DECL(int) VDFilterRemove(PVBOXHDD pDisk);
+
+/**
  * Closes the currently opened cache image file in HDD container.
  *
  * @return  VBox status code.
@@ -846,6 +882,14 @@ VBOXDDU_DECL(int) VDCacheClose(PVBOXHDD pDisk, bool fDelete);
 VBOXDDU_DECL(int) VDCloseAll(PVBOXHDD pDisk);
 
 /**
+ * Removes all filters of the given HDD container.
+ *
+ * @return  VBox status code.
+ * @param   pDisk           Pointer to HDD container.
+ */
+VBOXDDU_DECL(int) VDFilterRemoveAll(PVBOXHDD pDisk);
+
+/**
  * Read data from virtual HDD.
  *
  * @return  VBox status code.
diff --git a/include/VBox/vmm/pdmifs.h b/include/VBox/vmm/pdmifs.h
index 913c0dc..f4fb5b3 100644
--- a/include/VBox/vmm/pdmifs.h
+++ b/include/VBox/vmm/pdmifs.h
@@ -626,9 +626,8 @@ typedef struct VBVACMDHDR *PVBVACMDHDR;
 typedef struct VBVAINFOSCREEN *PVBVAINFOSCREEN;
 typedef struct VBVAINFOVIEW *PVBVAINFOVIEW;
 typedef struct VBVAHOSTFLAGS *PVBVAHOSTFLAGS;
-typedef struct VBOXVDMACMD_CHROMIUM_CMD *PVBOXVDMACMD_CHROMIUM_CMD; /* <- chromium [hgsmi] command */
-typedef struct VBOXVDMACMD_CHROMIUM_CTL *PVBOXVDMACMD_CHROMIUM_CTL; /* <- chromium [hgsmi] command */
-
+struct VBOXVDMACMD_CHROMIUM_CMD; /* <- chromium [hgsmi] command */
+struct VBOXVDMACMD_CHROMIUM_CTL; /* <- chromium [hgsmi] command */
 
 /** Pointer to a display connector interface. */
 typedef struct PDMIDISPLAYCONNECTOR *PPDMIDISPLAYCONNECTOR;
@@ -751,7 +750,7 @@ typedef struct PDMIDISPLAYCONNECTOR
      * @param   pCmd                Video HW Acceleration Command to be processed.
      * @thread  The emulation thread.
      */
-    DECLR3CALLBACKMEMBER(void, pfnCrHgsmiCommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd));
+    DECLR3CALLBACKMEMBER(void, pfnCrHgsmiCommandProcess, (PPDMIDISPLAYCONNECTOR pInterface, struct VBOXVDMACMD_CHROMIUM_CMD* pCmd, uint32_t cbCmd));
 
     /**
      * Process the guest chromium control command.
@@ -760,7 +759,7 @@ typedef struct PDMIDISPLAYCONNECTOR
      * @param   pCmd                Video HW Acceleration Command to be processed.
      * @thread  The emulation thread.
      */
-    DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess, (PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl));
+    DECLR3CALLBACKMEMBER(void, pfnCrHgsmiControlProcess, (PPDMIDISPLAYCONNECTOR pInterface, struct VBOXVDMACMD_CHROMIUM_CTL* pCtl, uint32_t cbCtl));
 
     /**
      * Process the guest chromium control command.
@@ -779,16 +778,24 @@ typedef struct PDMIDISPLAYCONNECTOR
      *
      * @param   pInterface          Pointer to this interface.
      * @param   uScreenId           The screen updates are for.
-     * @thread  The emulation thread.
+     * @param   fRenderThreadMode   if true - the graphics device has a separate thread that does all rendering.
+     *                              This means that:
+     *                              1. all pfnVBVAXxx callbacks (including the current pfnVBVAEnable call), except displayVBVAMousePointerShape
+     *                                 will be called in the context of the render thread rather than the emulation thread
+     *                              2. PDMIDISPLAYCONNECTOR implementor (i.e. DisplayImpl) must NOT notify crogl backend
+     *                                 about vbva-originated events (e.g. resize), because crogl is working in CrCmd mode,
+     *                                 in the context of the render thread as part of the Graphics device, and gets notified about those events directly
+     * @thread  if fRenderThreadMode is TRUE - the render thread, otherwise - the emulation thread.
      */
-    DECLR3CALLBACKMEMBER(int, pfnVBVAEnable,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags));
+    DECLR3CALLBACKMEMBER(int, pfnVBVAEnable,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags, bool fRenderThreadMode));
 
     /**
      * The specified screen leaves VBVA mode.
      *
      * @param   pInterface          Pointer to this interface.
      * @param   uScreenId           The screen updates are for.
-     * @thread  The emulation thread.
+     * @thread  if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
+     *          otherwise - the emulation thread.
      */
     DECLR3CALLBACKMEMBER(void, pfnVBVADisable,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId));
 
@@ -797,7 +804,8 @@ typedef struct PDMIDISPLAYCONNECTOR
      *
      * @param   pInterface          Pointer to this interface.
      * @param   uScreenId           The screen updates are for.
-     * @thread  The emulation thread.
+     * @thread  if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
+     *          otherwise - the emulation thread.
      */
     DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateBegin,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId));
 
@@ -806,7 +814,8 @@ typedef struct PDMIDISPLAYCONNECTOR
      *
      * @param   pInterface          Pointer to this interface.
      * @param   pCmd                Video HW Acceleration Command to be processed.
-     * @thread  The emulation thread.
+     * @thread  if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
+     *          otherwise - the emulation thread.
      */
     DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateProcess,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, const PVBVACMDHDR pCmd, size_t cbCmd));
 
@@ -819,7 +828,8 @@ typedef struct PDMIDISPLAYCONNECTOR
      * @param   y                   The upper left corner y coordinate of the rectangle.
      * @param   cx                  The width of the rectangle.
      * @param   cy                  The height of the rectangle.
-     * @thread  The emulation thread.
+     * @thread  if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
+     *          otherwise - the emulation thread.
      */
     DECLR3CALLBACKMEMBER(void, pfnVBVAUpdateEnd,(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, int32_t x, int32_t y, uint32_t cx, uint32_t cy));
 
@@ -838,7 +848,8 @@ typedef struct PDMIDISPLAYCONNECTOR
      * @param   pView               The description of VRAM block for this screen.
      * @param   pScreen             The data of screen being resized.
      * @param   pvVRAM              Address of the guest VRAM.
-     * @thread  The emulation thread.
+     * @thread  if render thread mode is on (fRenderThreadMode that was passed to pfnVBVAEnable is TRUE) - the render thread pfnVBVAEnable was called in,
+     *          otherwise - the emulation thread.
      */
     DECLR3CALLBACKMEMBER(int, pfnVBVAResize,(PPDMIDISPLAYCONNECTOR pInterface, const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM));
 
@@ -883,7 +894,7 @@ typedef struct PDMIDISPLAYCONNECTOR
     /** @} */
 } PDMIDISPLAYCONNECTOR;
 /** PDMIDISPLAYCONNECTOR interface ID. */
-#define PDMIDISPLAYCONNECTOR_IID                "05ba9649-302e-43dd-b9ff-60b6fb311d97"
+#define PDMIDISPLAYCONNECTOR_IID                "906d0c25-091f-497e-908c-1d70cb7e6114"
 
 
 /** Pointer to a block port interface. */
@@ -1301,6 +1312,19 @@ typedef struct PDMIMEDIA
     DECLR3CALLBACKMEMBER(int, pfnMerge,(PPDMIMEDIA pInterface, PFNSIMPLEPROGRESS pfnProgress, void *pvUser));
 
     /**
+     * Merge medium contents during a live snapshot deletion. All details
+     * must have been configured through CFGM or this will fail.
+     * This method is optional (i.e. the function pointer may be NULL).
+     *
+     * @returns VBox status code.
+     * @param   pInterface      Pointer to the interface structure containing the called function pointer.
+     * @param   pbKey           Pointer to the key.
+     * @param   cbKey           Size of the key in bytes.
+     * @thread  Any thread.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnSetKey,(PPDMIMEDIA pInterface, const uint8_t *pbKey, size_t cbKey));
+
+    /**
      * Get the media size in bytes.
      *
      * @returns Media size in bytes.
@@ -3056,26 +3080,26 @@ typedef struct PDMIDISPLAYVBVACALLBACKS
      * @param   pInterface          Pointer to this interface.
      * @param   pCmd                The Video HW Acceleration Command that was
      *                              completed.
-     * @todo r=bird: if async means asynchronous; then
-     *                   s/pfnVHWACommandCompleteAsynch/pfnVHWACommandCompleteAsync/;
-     *               fi
      */
-    DECLR3CALLBACKMEMBER(int, pfnVHWACommandCompleteAsynch, (PPDMIDISPLAYVBVACALLBACKS pInterface,
+    DECLR3CALLBACKMEMBER(int, pfnVHWACommandCompleteAsync, (PPDMIDISPLAYVBVACALLBACKS pInterface,
                                                              PVBOXVHWACMD pCmd));
 
     DECLR3CALLBACKMEMBER(int, pfnCrHgsmiCommandCompleteAsync, (PPDMIDISPLAYVBVACALLBACKS pInterface,
-                                                               PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc));
+                                                               struct VBOXVDMACMD_CHROMIUM_CMD* pCmd, int rc));
 
     DECLR3CALLBACKMEMBER(int, pfnCrHgsmiControlCompleteAsync, (PPDMIDISPLAYVBVACALLBACKS pInterface,
-                                                               PVBOXVDMACMD_CHROMIUM_CTL pCmd, int rc));
+                                                               struct VBOXVDMACMD_CHROMIUM_CTL* pCmd, int rc));
 
     DECLR3CALLBACKMEMBER(int, pfnCrCtlSubmit, (PPDMIDISPLAYVBVACALLBACKS pInterface,
                                                                    struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
                                                                    PFNCRCTLCOMPLETION pfnCompletion,
                                                                    void *pvCompletion));
+
+    DECLR3CALLBACKMEMBER(int, pfnCrCtlSubmitSync, (PPDMIDISPLAYVBVACALLBACKS pInterface,
+                                                                   struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd));
 } PDMIDISPLAYVBVACALLBACKS;
 /** PDMIDISPLAYVBVACALLBACKS  */
-#define PDMIDISPLAYVBVACALLBACKS_IID            "b78b81d2-c821-4e66-96ff-dbafa76343a5"
+#define PDMIDISPLAYVBVACALLBACKS_IID            "ddac0bd0-332d-4671-8853-732921a80216"
 
 /** Pointer to a PCI raw connector interface. */
 typedef struct PDMIPCIRAWCONNECTOR *PPDMIPCIRAWCONNECTOR;
diff --git a/include/VBox/vmm/pdmusb.h b/include/VBox/vmm/pdmusb.h
index 6abe2a1..ca104b2 100644
--- a/include/VBox/vmm/pdmusb.h
+++ b/include/VBox/vmm/pdmusb.h
@@ -407,6 +407,13 @@ typedef struct PDMUSBREG
      */
     DECLR3CALLBACKMEMBER(PVUSBURB, pfnUrbReap,(PPDMUSBINS pUsbIns, RTMSINTERVAL cMillies));
 
+    /**
+     * Wakes a thread waiting in pfnUrbReap.
+     *
+     * @returns VBox status code.
+     * @param   pUsbIns             The USB device instance.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnWakeup,(PPDMUSBINS pUsbIns));
 
     /** Just some init precaution. Must be set to PDM_USBREG_VERSION. */
     uint32_t            u32TheEnd;
diff --git a/include/VBox/vmm/vm.h b/include/VBox/vmm/vm.h
index bebb983..aff74f7 100644
--- a/include/VBox/vmm/vm.h
+++ b/include/VBox/vmm/vm.h
@@ -414,7 +414,7 @@ typedef struct VMCPU
                                                  | VM_FF_PDM_QUEUES | VM_FF_PDM_DMA | VM_FF_EMT_RENDEZVOUS)
 /** Externally forced VMCPU actions. Used to quit the idle/wait loop. */
 #define VMCPU_FF_EXTERNAL_HALTED_MASK           (  VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC | VMCPU_FF_REQUEST \
-                                                 | VMCPU_FF_TIMER)
+                                                 | VMCPU_FF_INTERRUPT_NMI  | VMCPU_FF_INTERRUPT_SMI | VMCPU_FF_TIMER)
 
 /** High priority VM pre-execution actions. */
 #define VM_FF_HIGH_PRIORITY_PRE_MASK            (  VM_FF_CHECK_VM_STATE | VM_FF_DBGF | VM_FF_TM_VIRTUAL_SYNC \
@@ -1069,7 +1069,7 @@ typedef struct VM
 #ifdef ___TMInternal_h
         struct TM   s;
 #endif
-        uint8_t     padding[2432];      /* multiple of 64 */
+        uint8_t     padding[2496];      /* multiple of 64 */
     } tm;
 
     /** DBGF part. */
@@ -1130,7 +1130,7 @@ typedef struct VM
 
 
     /** Padding for aligning the cpu array on a page boundary. */
-    uint8_t         abAlignment2[414];
+    uint8_t         abAlignment2[350];
 
     /* ---- end small stuff ---- */
 
diff --git a/include/VBox/vrdpusb.h b/include/VBox/vrdpusb.h
index 69bdeb6..34ff468 100644
--- a/include/VBox/vrdpusb.h
+++ b/include/VBox/vrdpusb.h
@@ -69,6 +69,7 @@ typedef struct _REMOTEUSBCALLBACK
     DECLCALLBACKMEMBER(int, pfnReapURB)          (PREMOTEUSBDEVICE pDevice, uint32_t u32Millies, void **ppvURB, uint32_t *pu32Len, uint32_t *pu32Err);
     DECLCALLBACKMEMBER(int, pfnClearHaltedEP)    (PREMOTEUSBDEVICE pDevice, uint8_t u8Ep);
     DECLCALLBACKMEMBER(void, pfnCancelURB)       (PREMOTEUSBDEVICE pDevice, PREMOTEUSBQURB pRemoteURB);
+    DECLCALLBACKMEMBER(int, pfnWakeup)           (PREMOTEUSBDEVICE pDevice);
 } REMOTEUSBCALLBACK;
 
 #endif
diff --git a/include/VBox/vusb.h b/include/VBox/vusb.h
index c1aba4f..5d69ec8 100644
--- a/include/VBox/vusb.h
+++ b/include/VBox/vusb.h
@@ -29,6 +29,8 @@
 #include <VBox/cdefs.h>
 #include <VBox/types.h>
 
+#include <iprt/queueatomic.h>
+
 struct PDMLED;
 
 RT_C_DECLS_BEGIN
@@ -1036,15 +1038,18 @@ typedef struct VUSBURB
         uint32_t        u32FrameNo;
         /** Flag indicating that the TDs have been unlinked. */
         bool            fUnlinked;
+        RTQUEUEATOMICITEM QueueItem;
     } Hci;
 
     /** The device data. */
     struct VUSBURBDEV
     {
         /** Pointer to private device specific data.  */
-        void           *pvPrivate;
+        void             *pvPrivate;
         /** Used by the device when linking the URB in some list of its own.   */
-        PVUSBURB        pNext;
+        PVUSBURB          pNext;
+        /** Work queue item. */
+        RTQUEUEATOMICITEM QueueItem;
     } Dev;
 
 #ifndef RDESKTOP
@@ -1086,7 +1091,8 @@ typedef struct VUSBURB
     uint32_t        cbData;
     /** The message data.
      * IN: On host to device transfers, the data to send.
-     * OUT: On device to host transfers, the data to received. */
+     * OUT: On device to host transfers, the data to received.
+     * This array has actually a size of VUsb.cbDataAllocated, not 8KB! */
     uint8_t         abData[8*_1K];
 } VUSBURB;
 
diff --git a/include/iprt/asm-math.h b/include/iprt/asm-math.h
index a3acdf1..f7f816c 100644
--- a/include/iprt/asm-math.h
+++ b/include/iprt/asm-math.h
@@ -28,6 +28,17 @@
 
 #include <iprt/types.h>
 
+#if defined(_MSC_VER) && RT_INLINE_ASM_USES_INTRIN
+# include <intrin.h>
+  /* Emit the intrinsics at all optimization levels. */
+# pragma intrinsic(__emul)
+# pragma intrinsic(__emulu)
+# ifdef RT_ARCH_AMD64
+#  pragma intrinsic(_mul128)
+#  pragma intrinsic(_umul128)
+# endif
+#endif
+
 
 /** @defgroup grp_rt_asm_math   Interger Math Optimizations
  * @ingroup grp_rt_asm
@@ -38,7 +49,8 @@
  *
  * @returns u32F1 * u32F2.
  */
-#if RT_INLINE_ASM_EXTERNAL && defined(RT_ARCH_X86)
+
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN && defined(RT_ARCH_X86)
 DECLASM(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2);
 #else
 DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
@@ -49,6 +61,8 @@ DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
     __asm__ __volatile__("mull %%edx"
                          : "=A" (u64)
                          : "a" (u32F2), "d" (u32F1));
+#  elif RT_INLINE_ASM_USES_INTRIN
+    u64 = __emulu(u32F1, u32F2);
 #  else
     __asm
     {
@@ -72,7 +86,7 @@ DECLINLINE(uint64_t) ASMMult2xU32RetU64(uint32_t u32F1, uint32_t u32F2)
  *
  * @returns u32F1 * u32F2.
  */
-#if RT_INLINE_ASM_EXTERNAL && defined(RT_ARCH_X86)
+#if RT_INLINE_ASM_EXTERNAL && !RT_INLINE_ASM_USES_INTRIN && defined(RT_ARCH_X86)
 DECLASM(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2);
 #else
 DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
@@ -83,6 +97,8 @@ DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
     __asm__ __volatile__("imull %%edx"
                          : "=A" (i64)
                          : "a" (i32F2), "d" (i32F1));
+#  elif RT_INLINE_ASM_USES_INTRIN
+    i64 = __emul(i32F1, i32F2);
 #  else
     __asm
     {
@@ -101,6 +117,67 @@ DECLINLINE(int64_t) ASMMult2xS32RetS64(int32_t i32F1, int32_t i32F2)
 #endif
 
 
+#if ARCH_BITS == 64
+DECLINLINE(uint64_t) ASMMult2xU64Ret2xU64(uint64_t u64F1, uint64_t u64F2, uint64_t *pu64ProdHi)
+{
+# if defined(RT_ARCH_AMD64) && (RT_INLINE_ASM_GNU_STYLE || RT_INLINE_ASM_USES_INTRIN)
+#  if RT_INLINE_ASM_GNU_STYLE
+    uint64_t u64Low, u64High;
+    __asm__ __volatile__("mull %%rdx"
+                         : "=a" (u64Low), "=d" (u64High)
+                         : "0" (u64F1), "1" (u64F2));
+    *pu64ProdHi = u64High;
+    return u64Low;
+#  elif RT_INLINE_ASM_USES_INTRIN
+    return _umul128(u64F1, u64F2, pu64ProdHi);
+#  else
+#   error "hmm"
+#  endif
+# else  /* generic: */
+    /*
+     *   F1 * F2 = Prod
+     *   --   --
+     *   ab * cd =  b*d + a*d*10  +  b*c*10 + a*c*100
+     *
+     * Where a, b, c and d are 'digits', and 10 is max digit + 1.
+     *
+     * Our digits are 32-bit wide, so instead of 10 we multiply by 4G.
+     *  Prod = F1.s.Lo*F2.s.Lo    + F1.s.Hi*F2.s.Lo*4G
+     *       + F1.s.Lo*F2.s.Hi*4G + F1.s.Hi*F2.s.Hi*4G*4G
+     */
+    RTUINT128U Prod;
+    RTUINT64U  Tmp1;
+    uint64_t   u64Tmp;
+    RTUINT64U  F1, F2;
+    F1.u = u64F1;
+    F2.u = u64F2;
+
+    Prod.s.Lo = ASMMult2xU32RetU64(F1.s.Lo, F2.s.Lo);
+
+    Tmp1.u = ASMMult2xU32RetU64(F1.s.Hi, F2.s.Lo);
+    u64Tmp = (uint64_t)Prod.DWords.dw1 + Tmp1.s.Lo;
+    Prod.DWords.dw1 = (uint32_t)u64Tmp;
+    Prod.s.Hi = Tmp1.s.Hi;
+    Prod.s.Hi += u64Tmp >> 32; /* carry */
+
+    Tmp1.u = ASMMult2xU32RetU64(F1.s.Lo, F2.s.Hi);
+    u64Tmp = (uint64_t)Prod.DWords.dw1 + Tmp1.s.Lo;
+    Prod.DWords.dw1 = (uint32_t)u64Tmp;
+    u64Tmp >>= 32;      /* carry */
+    u64Tmp += Prod.DWords.dw2;
+    u64Tmp += Tmp1.s.Hi;
+    Prod.DWords.dw2 = (uint32_t)u64Tmp;
+    Prod.DWords.dw3 += u64Tmp >> 32; /* carry */
+
+    Prod.s.Hi += ASMMult2xU32RetU64(F1.s.Hi, F2.s.Hi);
+    *pu64ProdHi  = Prod.s.Hi;
+    return Prod.s.Lo;
+# endif
+}
+#endif
+
+
+
 /**
  * Divides a 64-bit unsigned by a 32-bit unsigned returning an unsigned 32-bit result.
  *
diff --git a/include/iprt/asm.h b/include/iprt/asm.h
index 92db948..f4eb1ba 100644
--- a/include/iprt/asm.h
+++ b/include/iprt/asm.h
@@ -65,6 +65,10 @@
 # pragma intrinsic(_InterlockedExchangeAdd)
 # pragma intrinsic(_InterlockedCompareExchange)
 # pragma intrinsic(_InterlockedCompareExchange64)
+# pragma intrinsic(_rotl)
+# pragma intrinsic(_rotr)
+# pragma intrinsic(_rotl64)
+# pragma intrinsic(_rotr64)
 # ifdef RT_ARCH_AMD64
 #  pragma intrinsic(__stosq)
 #  pragma intrinsic(_byteswap_uint64)
@@ -4810,6 +4814,121 @@ DECLINLINE(uint64_t) ASMByteSwapU64(uint64_t u64)
 }
 
 
+/**
+ * Rotate 32-bit unsigned value to the left by @a cShift.
+ *
+ * @returns Rotated value.
+ * @param   u32                 The value to rotate.
+ * @param   cShift              How many bits to rotate by.
+ */
+DECLINLINE(uint32_t) ASMRotateLeftU32(uint32_t u32, uint32_t cShift)
+{
+#if RT_INLINE_ASM_USES_INTRIN
+    return _rotl(u32, cShift);
+#elif RT_INLINE_ASM_GNU_STYLE && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
+    __asm__ __volatile__("roll %b1, %0" : "=g" (u32) : "Ic" (cShift), "0" (u32));
+    return u32;
+#else
+    cShift &= 31;
+    return (u32 << cShift) | (u32 >> (32 - cShift));
+#endif
+}
+
+
+/**
+ * Rotate 32-bit unsigned value to the right by @a cShift.
+ *
+ * @returns Rotated value.
+ * @param   u32                 The value to rotate.
+ * @param   cShift              How many bits to rotate by.
+ */
+DECLINLINE(uint32_t) ASMRotateRightU32(uint32_t u32, uint32_t cShift)
+{
+#if RT_INLINE_ASM_USES_INTRIN
+    return _rotr(u32, cShift);
+#elif RT_INLINE_ASM_GNU_STYLE && (defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86))
+    __asm__ __volatile__("rorl %b1, %0" : "=g" (u32) : "Ic" (cShift), "0" (u32));
+    return u32;
+#else
+    cShift &= 31;
+    return (u32 >> cShift) | (u32 << (32 - cShift));
+#endif
+}
+
+
+/**
+ * Rotate 64-bit unsigned value to the left by @a cShift.
+ *
+ * @returns Rotated value.
+ * @param   u64                 The value to rotate.
+ * @param   cShift              How many bits to rotate by.
+ */
+DECLINLINE(uint64_t) ASMRotateLeftU64(uint64_t u64, uint32_t cShift)
+{
+#if RT_INLINE_ASM_USES_INTRIN
+    return _rotl64(u64, cShift);
+#elif RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_AMD64)
+    __asm__ __volatile__("rolq %b1, %0" : "=g" (u64) : "Jc" (cShift), "0" (u64));
+    return u64;
+#elif RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_X86)
+    uint32_t uSpill;
+    __asm__ __volatile__("testb $0x20, %%cl\n\t"        /* if (cShift >= 0x20) { swap(u64.hi, u64lo); cShift -= 0x20; } */
+                         "jz    1f\n\t"
+                         "xchgl %%eax, %%edx\n\t"
+                         "1:\n\t"
+                         "andb  $0x1f, %%cl\n\t"        /* if (cShift & 0x1f) { */
+                         "jz    2f\n\t"
+                         "movl  %%edx, %2\n\t"          /*   save the hi value in %3. */
+                         "shldl %%cl,%%eax,%%edx\n\t"   /*   shift the hi value left, feeding MSBits from the low value. */
+                         "shldl %%cl,%2,%%eax\n\t"      /*   shift the lo value left, feeding MSBits from the saved hi value. */
+                         "2:\n\t"                       /* } */
+                         : "=A" (u64), "=c" (cShift), "=r" (uSpill)
+                         : "0" (u64),
+                           "1" (cShift));
+    return u64;
+#else
+    cShift &= 63;
+    return (u64 << cShift) | (u64 >> (64 - cShift));
+#endif
+}
+
+
+/**
+ * Rotate 64-bit unsigned value to the right by @a cShift.
+ *
+ * @returns Rotated value.
+ * @param   u64                 The value to rotate.
+ * @param   cShift              How many bits to rotate by.
+ */
+DECLINLINE(uint64_t) ASMRotateRightU64(uint64_t u64, uint32_t cShift)
+{
+#if RT_INLINE_ASM_USES_INTRIN
+    return _rotr64(u64, cShift);
+#elif RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_AMD64)
+    __asm__ __volatile__("rorq %b1, %0" : "=g" (u64) : "Jc" (cShift), "0" (u64));
+    return u64;
+#elif RT_INLINE_ASM_GNU_STYLE && defined(RT_ARCH_X86)
+    uint32_t uSpill;
+    __asm__ __volatile__("testb $0x20, %%cl\n\t"        /* if (cShift >= 0x20) { swap(u64.hi, u64lo); cShift -= 0x20; } */
+                         "jz    1f\n\t"
+                         "xchgl %%eax, %%edx\n\t"
+                         "1:\n\t"
+                         "andb  $0x1f, %%cl\n\t"        /* if (cShift & 0x1f) { */
+                         "jz    2f\n\t"
+                         "movl  %%edx, %2\n\t"          /*   save the hi value in %3. */
+                         "shrdl %%cl,%%eax,%%edx\n\t"   /*   shift the hi value right, feeding LSBits from the low value. */
+                         "shrdl %%cl,%2,%%eax\n\t"      /*   shift the lo value right, feeding LSBits from the saved hi value. */
+                         "2:\n\t"                       /* } */
+                         : "=A" (u64), "=c" (cShift), "=r" (uSpill)
+                         : "0" (u64),
+                           "1" (cShift));
+    return u64;
+#else
+    cShift &= 63;
+    return (u64 >> cShift) | (u64 << (64 - cShift));
+#endif
+}
+
 /** @} */
 
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/asn1-generator-asn1-decoder.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/asn1-generator-asn1-decoder.h
index 35b6d89..ebc7521 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/asn1-generator-asn1-decoder.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1 Code Generator, the ASN1 Decoder Passes.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +23,6 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_DECODE
+#include <iprt/asn1-generator-pass.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/asn1-generator-core.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/asn1-generator-core.h
index 35b6d89..62fe20a 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/asn1-generator-core.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1 Code Generator, the ASN.1 Core Code (VTable, Compare, ..).
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +23,16 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_VTABLE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_DELETE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_ENUM
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_COMPARE
+#include <iprt/asn1-generator-pass.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/asn1-generator-init.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/asn1-generator-init.h
index 35b6d89..d6d0e17 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/asn1-generator-init.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1 Code Generator, the ASN1 Init, Clone and Modifier Passes.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +24,12 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_INIT
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_CLONE
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_SETTERS_1
+#include <iprt/asn1-generator-pass.h>
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_SETTERS_2
+#include <iprt/asn1-generator-pass.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/asn1-generator-internal-header.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/asn1-generator-internal-header.h
index 35b6d89..0d47dfe 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/asn1-generator-internal-header.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1 Code Generator, the Internal Header File.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +24,6 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_PASS                 RTASN1TMPL_PASS_INTERNAL_HEADER
+#include <iprt/asn1-generator-pass.h>
 
diff --git a/include/iprt/asn1-generator-pass.h b/include/iprt/asn1-generator-pass.h
new file mode 100644
index 0000000..5e14cc0
--- /dev/null
+++ b/include/iprt/asn1-generator-pass.h
@@ -0,0 +1,1383 @@
+/** @file
+ * IPRT - ASN.1 Code Generator, One Pass.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___iprt_asn1_generator_pass_h
+#define ___iprt_asn1_generator_pass_h
+
+#include <iprt/formats/asn1.h>
+
+
+/** @def RTASN1TMPL_MEMBER_OPT_ANY
+ * Used for optional entries without any specific type at the end of a
+ * structure.
+ *
+ * For example PolicyQualifierInfo's qualifier member which is defined as:
+ *      ANY DEFINED BY policyQualifierId
+ *
+ * Defaults to RTASN1TMPL_MEMBER_EX.
+ */
+
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_EX
+ * Optional member with implict tag, extended version.
+ *
+ * This is what all the other RTASN1TMPL_MEMBER_OPT_ITAG* macros defere to.
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_CP
+ * Optional member of a typical primitive type with an implicit context tag.
+ *
+ * Examples of this can be found in AuthorityKeyIdentifier where the first and
+ * last member are primitive types (normally anyways).:
+ *      keyIdentifier [1] OCTET STRING OPTIONAL,
+ *      authorityCertSerialNumber [3] INTEGER OPTIONAL
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_UC
+ * Optional member of a constructed type from the universal tag class.
+ */
+/** @def RTASN1TMPL_MEMBER_OPT_ITAG_UP
+ * Optional member of a primitive type from the universal tag class.
+ */
+
+
+/** @name Expansion Passes (RTASN1TMPL_PASS values)
+ * @{  */
+#define RTASN1TMPL_PASS_INTERNAL_HEADER 1
+
+#define RTASN1TMPL_PASS_VTABLE          2
+#define RTASN1TMPL_PASS_ENUM            3
+#define RTASN1TMPL_PASS_DELETE          4
+#define RTASN1TMPL_PASS_COMPARE         5
+
+#define RTASN1TMPL_PASS_CHECK_SANITY    8
+
+#define RTASN1TMPL_PASS_INIT           16
+#define RTASN1TMPL_PASS_CLONE          17
+#define RTASN1TMPL_PASS_SETTERS_1      18
+#define RTASN1TMPL_PASS_SETTERS_2      19
+
+#define RTASN1TMPL_PASS_DECODE         24
+/** @} */
+
+/** @name ITAG clues
+ * @{  */
+#define RTASN1TMPL_ITAG_F_CC            1 /**< context, constructed. */
+#define RTASN1TMPL_ITAG_F_CP            2 /**< context, probably primary. (w/ numeric value) */
+#define RTASN1TMPL_ITAG_F_UP            3 /**< universal, probably primary. (w/ ASN1_TAG_XXX value) */
+#define RTASN1TMPL_ITAG_F_UC            4 /**< universal, constructed. (w/ ASN1_TAG_XXX value) */
+/** @} */
+/** Expands the ITAG clues into tag flag and tag class. */
+#define RTASN1TMPL_ITAG_F_EXPAND(a_fClue) \
+        (  a_fClue == RTASN1TMPL_ITAG_F_CC ? (ASN1_TAGCLASS_CONTEXT   | ASN1_TAGFLAG_CONSTRUCTED ) \
+         : a_fClue == RTASN1TMPL_ITAG_F_CP ? (ASN1_TAGCLASS_CONTEXT   | ASN1_TAGFLAG_PRIMITIVE) \
+         : a_fClue == RTASN1TMPL_ITAG_F_UP ? (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE) \
+         : a_fClue == RTASN1TMPL_ITAG_F_UC ? (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED) \
+         : 0 )
+
+#define RTASN1TMPL_SEMICOLON_DUMMY() typedef unsigned RTASN1TMPLSEMICOLONDUMMY
+
+#endif /* !___iprt_asn1_generator_pass_h */
+
+
+#if RTASN1TMPL_PASS == RTASN1TMPL_PASS_INTERNAL_HEADER
+/*
+ *
+ * Internal header file.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() extern DECLHIDDEN(RTASN1COREVTABLE const) RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+
+# define RTASN1TMPL_BEGIN_SEQCORE()                 RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE()                 RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints)                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation)                          RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)                            RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE()                   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE()                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE()                 RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+                                                                                                    RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+                                                                                                    RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE()                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_BEGIN_COMMON()
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_VTABLE
+/*
+ *
+ * Internal header file.
+ *
+ */
+# ifndef RTASN1TMPL_VTABLE_FN_ENCODE_PREP
+#  define RTASN1TMPL_VTABLE_FN_ENCODE_PREP  NULL
+# endif
+# ifndef RTASN1TMPL_VTABLE_FN_ENCODE_WRITE
+#  define RTASN1TMPL_VTABLE_FN_ENCODE_WRITE NULL
+# endif
+# define RTASN1TMPL_BEGIN_COMMON(a_uDefaultTag, a_fDefaultClass) \
+    DECL_HIDDEN_CONST(RTASN1COREVTABLE const) RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable) = \
+    { \
+        /* When the Asn1Core is at the start of the structure, we can reuse the _Delete and _Enum APIs here. */ \
+        /* .pszName = */        RT_XSTR(RTASN1TMPL_EXT_NAME), \
+        /* .cb = */             sizeof(RTASN1TMPL_TYPE), \
+        /* .uDefaultTag = */    a_uDefaultTag, \
+        /* .fDefaultClass = */  a_fDefaultClass, \
+        /* .uReserved = */      0, \
+        (PFNRTASN1COREVTDTOR)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete), \
+        (PFNRTASN1COREVTENUM)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Enum), \
+        (PFNRTASN1COREVTCLONE)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Clone), \
+        (PFNRTASN1COREVTCOMPARE)RT_CONCAT(RTASN1TMPL_EXT_NAME,_Compare), \
+        (PFNRTASN1COREVTCHECKSANITY)RT_CONCAT(RTASN1TMPL_EXT_NAME,_CheckSanity), \
+        RTASN1TMPL_VTABLE_FN_ENCODE_PREP, \
+        RTASN1TMPL_VTABLE_FN_ENCODE_WRITE \
+    }
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+    AssertCompileMemberOffset(RTASN1TMPL_TYPE, SeqCore, 0); \
+    RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+    AssertCompileMemberOffset(RTASN1TMPL_TYPE, SetCore, 0); \
+    RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints)                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation)                          RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)                            RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE()                                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE()                                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    AssertCompileMemberOffset(RTASN1TMPL_TYPE, Dummy, 0); \
+    RTASN1TMPL_BEGIN_COMMON(UINT8_MAX, UINT8_MAX)
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+                                                                                                    RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+                                                                                                    RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE()                                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) \
+    AssertCompileMemberOffset(RTASN1TMPL_TYPE, SeqCore, 0); \
+    RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) \
+    AssertCompileMemberOffset(RTASN1TMPL_TYPE, SetCore, 0); \
+    RTASN1TMPL_BEGIN_COMMON(ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_INIT
+/*
+ *
+ * Initialization to standard / default values.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Init)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+    RT_ZERO(*pThis)
+# define RTASN1TMPL_END_COMMON() \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    int rc = RTAsn1SequenceCore_Init(&pThis->SeqCore, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable))
+# define RTASN1TMPL_BEGIN_SETCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    int rc = RTAsn1SetCore_Init(&pThis->SetCore, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable))
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+        rc = RT_CONCAT(a_Api,_Init)(&pThis->a_Name, pAllocator)
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+    pThis->a_enmMembNm = RT_CONCAT(a_enmType,_NOT_PRESENT)
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+                                                                                                    do { } while (0)
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)                            do { } while (0)
+
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        rc = RT_CONCAT(a_Api,_InitDefault)(&pThis->a_Name, a_DefVal, pAllocator); \
+        if (RT_SUCCESS(rc)) \
+            rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), \
+                                           a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+    }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) do { } while (0) /* All optional members are left as not-present. */
+# define RTASN1TMPL_END_SEQCORE() \
+    if (RT_FAILURE(rc)) \
+        RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+/* No choice, just an empty, non-present structure. */
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_BEGIN_COMMON(); int rc = VINF_SUCCESS
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+                                                                                                    do { } while (0)
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+                                                                                                    do { } while (0)
+# define RTASN1TMPL_END_PCHOICE()   RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+    int rc = RT_CONCAT(a_OfApi,_Init)(&pThis->a_OfMember, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)); \
+    if (RT_FAILURE(rc)) \
+        RT_ZERO(*pThis); \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_DECODE
+/*
+ *
+ * Decode ASN.1.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+                                                                RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, const char *pszErrorTag) \
+{ \
+    RT_ZERO(*pThis);
+
+# define RTASN1TMPL_END_COMMON() \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTASN1CURSOR ThisCursor; \
+    int rc = RTAsn1CursorGetSequenceCursor(pCursor, fFlags, &pThis->SeqCore, &ThisCursor, pszErrorTag); \
+    if (RT_FAILURE(rc)) \
+        return rc; \
+    pCursor = &ThisCursor; \
+    pThis->SeqCore.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTASN1CURSOR ThisCursor; \
+    int rc = RTAsn1CursorGetSetCursor(pCursor, fFlags, &pThis->SetCore, &ThisCursor, pszErrorTag); \
+    if (RT_FAILURE(rc)) \
+        return rc; \
+    pCursor = &ThisCursor; \
+    pThis->SetCore.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable)
+
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+         rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        int rc2; /* not initialized! */ \
+        RTAsn1CursorInitAllocation(pCursor, &pThis->a_Allocation); \
+        pThis->a_enmMembNm = RT_CONCAT(a_enmType, _INVALID); \
+        if (false) do { /*nothing*/ } while (0)
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+        else a_IfStmt \
+        do { \
+            rc2 = RTAsn1MemAllocZ(&pThis->a_Allocation, (void **)&pThis->a_UnionNm.a_PtrName, \
+                                  sizeof(*pThis->a_UnionNm.a_PtrName)); \
+            if (RT_SUCCESS(rc2)) \
+            { \
+                pThis->a_enmMembNm = a_enmValue; \
+                rc2 = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, pThis->a_UnionNm.a_PtrName, #a_UnionNm "." #a_PtrName); \
+            } \
+        } while (0)
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+        rc = rc2; /* Should trigger warning if a _DEFAULT is missing. */  \
+    }
+
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    Error_Missing_Specific_Macro_In_Decode_Pass()
+
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        if (RTAsn1CursorIsNextEx(pCursor, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue))) \
+            rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, 0, &pThis->a_Name, #a_Name); \
+        else \
+            rc = RT_CONCAT(a_Api,_InitDefault)(&pThis->a_Name, a_DefVal, pCursor->pPrimary->pAllocator); \
+        if (RT_SUCCESS(rc)) \
+            rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), \
+                                           a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+    } do {} while (0)
+
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+    if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_UTF8_STRING, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE)) \
+        rc = RTAsn1CursorGetUtf8String(pCursor, 0, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints) \
+    if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)) /** @todo || CER */) \
+        rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(a_Name, a_cMaxBits, a_uTag) \
+    if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+        rc = RTAsn1CursorGetBitStringEx(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, a_cMaxBits, &pThis->a_Name, #a_Name)
+
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    if (RT_SUCCESS(rc) && RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+    { \
+        RTASN1CURSOR CtxCursor; \
+        rc = RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(pCursor, 0, &pThis->a_TnNm.a_CtxTagN, &CtxCursor, #a_TnNm); \
+        if (RT_SUCCESS(rc)) \
+        { \
+            rc = RT_CONCAT(a_Api,_DecodeAsn1)(&CtxCursor, 0, &pThis->a_TnNm.a_Name, #a_Name); \
+            if (RT_SUCCESS(rc)) \
+                rc = RTAsn1CursorCheckEnd(&CtxCursor); \
+        } \
+    } do { } while (0)
+
+# define RTASN1TMPL_MEMBER_OPT_ANY(a_Name, a_Type, a_Api) \
+    if (RT_SUCCESS(rc) && pCursor->cbLeft > 0) \
+        RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+
+# define RTASN1TMPL_END_SEQCORE() \
+   if (RT_SUCCESS(rc)) \
+       rc = RTAsn1CursorCheckEnd(&ThisCursor); \
+   if (RT_SUCCESS(rc)) \
+       return VINF_SUCCESS; \
+   RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+   RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTAsn1Dummy_InitEx(&pThis->Dummy); \
+    pThis->Dummy.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \
+    RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation); \
+    RTASN1CORE Asn1Peek; \
+    int rc = RTAsn1CursorPeek(pCursor, &Asn1Peek); \
+    if (RT_SUCCESS(rc)) \
+    { \
+        if (false) do {} while (0)
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        else if (   Asn1Peek.uTag == (a_uTag) \
+                 && (Asn1Peek.fClass == RTASN1TMPL_ITAG_F_EXPAND(a_fClue) /** @todo || CER */ ) ) \
+        do { \
+            pThis->enmChoice = a_enmChoice; \
+            rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+            if (RT_SUCCESS(rc)) \
+                rc = RT_CONCAT(a_Api,_DecodeAsn1)(pCursor, RTASN1CURSOR_GET_F_IMPLICIT, pThis->a_PtrName, #a_PtrName); \
+        } while (0)
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        else if (Asn1Peek.uTag == (a_uTag) && Asn1Peek.fClass == (ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED)) \
+        do { \
+            pThis->enmChoice = a_enmChoice; \
+            rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+            if (RT_SUCCESS(rc)) \
+            { \
+                RTASN1CURSOR CtxCursor; \
+                rc = RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(pCursor, 0, &pThis->a_PtrTnNm->a_CtxTagN, \
+                                                                         &CtxCursor, "T" #a_uTag); \
+                if (RT_SUCCESS(rc)) \
+                    rc = RT_CONCAT(a_Api,_DecodeAsn1)(&CtxCursor, RTASN1CURSOR_GET_F_IMPLICIT, \
+                                                      &pThis->a_PtrTnNm->a_Name, #a_Name); \
+                if (RT_SUCCESS(rc)) \
+                    rc = RTAsn1CursorCheckEnd(&CtxCursor); \
+            } \
+        } while (0)
+#define RTASN1TMPL_END_PCHOICE() \
+        else \
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_GENERAL_FAILURE, "%s: Unknown choice: tag=%#x fClass=%#x", \
+                                     pszErrorTag, Asn1Peek.uTag, Asn1Peek.fClass); \
+        if (RT_SUCCESS(rc)) \
+            return VINF_SUCCESS; \
+    } \
+    RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+    RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember, a_fnGetCursor) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTASN1CURSOR ThisCursor; \
+    int rc = a_fnGetCursor(pCursor, fFlags, &pThis->a_OfMember, &ThisCursor, pszErrorTag); \
+    if (RT_SUCCESS(rc)) \
+    { \
+        pCursor = &ThisCursor; \
+        pThis->a_OfMember.Asn1Core.pOps = &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable); \
+        RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation); \
+        \
+        uint32_t i = 0; \
+        while (   pCursor->cbLeft > 0 \
+               && RT_SUCCESS(rc)) \
+        { \
+            rc = RTAsn1MemGrowArray(&pThis->Allocation, \
+                                    (void **)&pThis->paItems, \
+                                    sizeof(pThis->paItems[0]), \
+                                    i, \
+                                    i + 1); \
+            if (RT_SUCCESS(rc)) \
+            { \
+                rc = RT_CONCAT(a_ItemApi,_DecodeAsn1)(pCursor, 0, &pThis->paItems[i], "paItems[#]"); \
+                if (RT_SUCCESS(rc)) \
+                { \
+                    i++; \
+                    pThis->cItems = i; \
+                    continue; \
+                } \
+            } \
+            break; \
+        } \
+        if (RT_SUCCESS(rc)) \
+        { \
+            rc = RTAsn1CursorCheckEnd(pCursor); \
+            if (RT_SUCCESS(rc)) \
+                return VINF_SUCCESS; \
+        } \
+        RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+    } \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore, RTAsn1CursorGetSequenceCursor)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore, RTAsn1CursorGetSetCursor)
+
+
+# define RTASN1TMPL_EXEC_DECODE(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_ENUM
+/*
+ *
+ * Enumeration.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Enum)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \
+                                                          PFNRTASN1ENUMCALLBACK pfnCallback, \
+                                                          uint32_t uDepth, void *pvUser) \
+{ \
+    if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis)) \
+        return VINF_SUCCESS; \
+    uDepth++; \
+    int rc = VINF_SUCCESS
+
+# define RTASN1TMPL_END_COMMON() \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+        if (rc == VINF_SUCCESS) \
+            rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), #a_Name, uDepth, pvUser)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+        if (rc == VINF_SUCCESS) \
+            switch (pThis->a_enmMembNm) \
+            { \
+                default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+                case a_enmValue: \
+                    rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_UnionNm.a_PtrName), #a_UnionNm "." #a_PtrName, \
+                                     uDepth, pvUser); \
+                    break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+                case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+            }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+        if (rc == VINF_SUCCESS && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+            rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name), #a_Name, uDepth, pvUser)
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+        if (rc == VINF_SUCCESS && RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core)) \
+        { \
+            rc = pfnCallback(&pThis->a_TnNm.a_CtxTagN.Asn1Core, #a_Name, uDepth, pvUser); \
+            if (rc == VINF_SUCCESS) \
+                rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_TnNm.a_Name), #a_TnNm "." #a_Name, uDepth, pvUser); \
+        } do {} while (0)
+# define RTASN1TMPL_END_SEQCORE()   RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE()   RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    switch (pThis->enmChoice) \
+    { \
+        default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        case a_enmChoice: rc = pfnCallback(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName), #a_PtrName, uDepth, pvUser); break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        case a_enmChoice: \
+            rc = pfnCallback(&pThis->a_PtrTnNm->a_CtxTagN.Asn1Core, "T" #a_uTag "." #a_CtxTagN, uDepth, pvUser); \
+            if (rc == VINF_SUCCESS) \
+                rc = pfnCallback(RT_CONCAT(a_Api, _GetAsn1Core)(&pThis->a_PtrTnNm->a_Name), \
+                                 "T" #a_uTag "." #a_Name, uDepth + 1, pvUser); \
+            break
+#define RTASN1TMPL_END_PCHOICE() \
+    } \
+    RTASN1TMPL_END_COMMON()
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    for (uint32_t i = 0; i < pThis->cItems && rc == VINF_SUCCESS; i++) \
+        rc = pfnCallback(RT_CONCAT(a_ItemApi,_GetAsn1Core)(&pThis->paItems[i]), "paItems[#]", uDepth, pvUser); \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_CLONE
+/*
+ *
+ * Clone another instance of the type.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Clone)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, \
+                                                           RT_CONCAT(PC,RTASN1TMPL_TYPE) pSrc, \
+                                                           PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+    RT_ZERO(*pThis); \
+    if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pSrc)) \
+        return VINF_SUCCESS; \
+
+# define RTASN1TMPL_END_COMMON() \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    int rc = RTAsn1SequenceCore_Clone(&pThis->SeqCore, &RT_CONCAT3(g_, RTASN1TMPL_INT_NAME, _Vtable), &pSrc->SeqCore)
+# define RTASN1TMPL_BEGIN_SETCORE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    int rc = RTAsn1SetCore_Clone(&pThis->SetCore, &RT_CONCAT3(g_, RTASN1TMPL_INT_NAME, _Vtable), &pSrc->SetCore)
+
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+        rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, &pSrc->a_Name, pAllocator); \
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+        pThis->a_enmMembNm = pSrc->a_enmMembNm; \
+        switch (pSrc->a_enmMembNm) \
+        { \
+            default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+            case a_enmValue: \
+                rc = RTAsn1MemAllocZ(&pThis->a_Allocation, (void **)&pThis->a_UnionNm.a_PtrName, \
+                                      sizeof(*pThis->a_UnionNm.a_PtrName)); \
+                if (RT_SUCCESS(rc)) \
+                    rc = RT_CONCAT(a_Api,_Clone)(pThis->a_UnionNm.a_PtrName, pSrc->a_UnionNm.a_PtrName, pAllocator); \
+                break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+            case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+        } \
+     }
+
+/* Optional members and members with defaults are the same as a normal member when cloning. */
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1Utf8String, a_Constraints RT_NOTHING)
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    if (RTASN1CORE_IS_PRESENT(&pSrc->a_TnNm.a_CtxTagN.Asn1Core) && RT_SUCCESS(rc)) \
+    { \
+        rc = RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(&pThis->a_TnNm.a_CtxTagN, &pSrc->a_TnNm.a_CtxTagN); \
+        if (RT_SUCCESS(rc)) \
+            rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_TnNm.a_Name, &pSrc->a_TnNm.a_Name, pAllocator); \
+    } do { } while (0)
+
+# define RTASN1TMPL_END_SEQCORE() \
+    if (RT_FAILURE(rc)) \
+        RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE() RTASN1TMPL_END_SEQCORE()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    RTAsn1Dummy_InitEx(&pThis->Dummy); \
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+    int rc; \
+    pThis->enmChoice = pSrc->enmChoice; \
+    switch (pSrc->enmChoice) \
+    { \
+        default: rc = VERR_INTERNAL_ERROR_3; break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        case a_enmChoice: \
+            rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+            if (RT_SUCCESS(rc)) \
+                rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pSrc->a_PtrName, pAllocator); break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        case a_enmChoice: /* A bit of presence paranoia here, but better safe than sorry... */ \
+            rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+            if (RT_SUCCESS(rc) && RTASN1CORE_IS_PRESENT(&pSrc->a_PtrTnNm->a_CtxTagN.Asn1Core)) \
+            { \
+                RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(&pThis->a_PtrTnNm->a_CtxTagN, &pSrc->a_PtrTnNm->a_CtxTagN); \
+                rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, &pSrc->a_PtrTnNm->a_Name, pAllocator); \
+            } \
+            break
+#define RTASN1TMPL_END_PCHOICE() \
+    } \
+    if (RT_FAILURE(rc)) \
+        RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+    RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, a_OfApi, a_OfMember) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    int rc = RT_CONCAT(a_OfApi,_Clone)(&pThis->a_OfMember, &RT_CONCAT3(g_,RTASN1TMPL_INT_NAME,_Vtable), &pSrc->a_OfMember); \
+    if (RT_SUCCESS(rc)) \
+    { \
+        RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+        uint32_t const cItems = pSrc->cItems; \
+        if (cItems > 0) \
+        { \
+            rc = RTAsn1MemGrowArray(&pThis->Allocation, (void **)&pThis->paItems, sizeof(pThis->paItems[0]), 0, cItems); \
+            if (RT_SUCCESS(rc)) \
+            { \
+                uint32_t i = 0; \
+                while (i < cItems) \
+                { \
+                    rc = RT_CONCAT(a_ItemApi,_Clone)(&pThis->paItems[i], &pSrc->paItems[i], pAllocator); \
+                    if (RT_SUCCESS(rc)) \
+                        pThis->cItems = ++i; \
+                    else \
+                    { \
+                        pThis->cItems = i; \
+                        RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); \
+                        return rc; \
+                    } \
+                } \
+            } \
+            else \
+                RT_ZERO(*pThis); \
+        } \
+    } \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SeqOfCore, SeqCore)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi, RTAsn1SetOfCore, SetCore)
+
+# define RTASN1TMPL_EXEC_CLONE(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_SETTERS_1
+/*
+ *
+ * Member setter helpers.
+ *
+ */
+# define RTASN1TMPL_BEGIN_SEQCORE()                                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_BEGIN_SETCORE()                                                 RTASN1TMPL_SEMICOLON_DUMMY()
+#if 1 /** @todo later */
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints)                     RTASN1TMPL_SEMICOLON_DUMMY()
+#else
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    RTDECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RTASN1TMPL_TYPE *pThis, a_Type const *pValue, \
+                                                            PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { \
+        if (RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+            RT_CONCAT(a_Api,_Delete)(&pThis->a_Name); \
+        return RT_CONCAT(a_Api,_Clone)(&pThis->a_Name, pValue, pAllocator, true /* fResetImplicit */); \
+    } RTASN1TMPL_SEMICOLON_DUMMY()
+#endif
+
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation)              RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)                RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE()                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE()                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE()                                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints)   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_PCHOICE()                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_SETTERS_2
+/*
+ *
+ * Member setters.
+ *
+ */
+# define RTASN1TMPL_BEGIN_SEQCORE()                                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_BEGIN_SETCORE()                                                 RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints)                     RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation)              RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)                RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SEQCORE()                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_END_SETCORE()                                                   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\
+                                                                 PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+    AssertPtr(pSrc); AssertPtr(pThis); \
+    RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \
+    RTAsn1Dummy_InitEx(&pThis->Dummy); \
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+    pThis->enmChoice = a_enmChoice; \
+    int rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrName, sizeof(*pThis->a_PtrName)); \
+    if (RT_SUCCESS(rc)) \
+    { \
+        rc = RT_CONCAT(a_Api,_Clone)(pThis->a_PtrName, pSrc, pAllocator); \
+        if (RT_SUCCESS(rc)) \
+        { \
+            RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName)); \
+            rc = RTAsn1Core_SetTagAndFlags(RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName), \
+                                           a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue)); \
+        } \
+    } \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+RTASN1TMPL_DECL(int) RT_CONCAT3(RTASN1TMPL_EXT_NAME,_Set,a_Name)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis, RT_CONCAT(PC,a_Type) pSrc,\
+                                                                 PCRTASN1ALLOCATORVTABLE pAllocator) \
+{ \
+    AssertPtr(pThis); AssertPtr(pSrc); Assert(RT_CONCAT(a_Api,_IsPresent)(pSrc)); \
+    RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(pThis); /* See _Init. */ \
+    RTAsn1Dummy_InitEx(&pThis->Dummy); \
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator); \
+    pThis->enmChoice = a_enmChoice; \
+    int rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->a_PtrTnNm, sizeof(*pThis->a_PtrTnNm)); \
+    if (RT_SUCCESS(rc)) \
+    { \
+        rc = RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Init)(&pThis->a_PtrTnNm->a_CtxTagN, pAllocator); \
+        if (RT_SUCCESS(rc)) \
+        { \
+            rc = RT_CONCAT(a_Api,_Clone)(&pThis->a_PtrTnNm->a_Name, pSrc, pAllocator); \
+            if (RT_SUCCESS(rc)) \
+                RTAsn1Core_ResetImplict(RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_PtrTnNm->a_Name)); \
+        } \
+    } \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+#define RTASN1TMPL_END_PCHOICE() RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_SEMICOLON_DUMMY()
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi)   RTASN1TMPL_SEMICOLON_DUMMY()
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_COMPARE
+/*
+ *
+ * Compare two instances of the type.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Compare)(RT_CONCAT(PC,RTASN1TMPL_TYPE) pLeft, \
+                                                             RT_CONCAT(PC,RTASN1TMPL_TYPE) pRight) \
+{ \
+    if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pLeft)) \
+        return 0 - (int)RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pRight); \
+    if (!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pRight)) \
+        return -1; \
+    int iDiff = 0
+
+# define RTASN1TMPL_END_COMMON() \
+    return iDiff; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (!iDiff) \
+        iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_Name, &pRight->a_Name)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    if (!iDiff && pLeft->a_enmMembNm != pRight->a_enmMembNm) \
+        iDiff = pLeft->a_enmMembNm < pRight->a_enmMembNm ? -1 : 1; \
+    else if (!iDiff) \
+        switch (pLeft->a_enmMembNm) \
+        { \
+            default: break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+            case a_enmValue: iDiff = RT_CONCAT(a_Api,_Compare)(pLeft->a_UnionNm.a_PtrName, pRight->a_UnionNm.a_PtrName); break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+            case RT_CONCAT(a_enmType,_NOT_PRESENT): break; \
+        }
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    if (!iDiff) \
+    { \
+        if (RTASN1CORE_IS_PRESENT(&pLeft->a_TnNm.a_CtxTagN.Asn1Core)) \
+        { \
+            if (RTASN1CORE_IS_PRESENT(&pRight->a_TnNm.a_CtxTagN.Asn1Core)) \
+                iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_TnNm.a_Name, &pRight->a_TnNm.a_Name); \
+            else \
+                iDiff = -1; \
+        } \
+        else \
+            iDiff = 0 - (int)RTASN1CORE_IS_PRESENT(&pRight->a_TnNm.a_CtxTagN.Asn1Core); \
+    } do { } while (0)
+# define RTASN1TMPL_END_SEQCORE()   RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE()   RTASN1TMPL_END_COMMON()
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    if (pLeft->enmChoice != pRight->enmChoice) \
+        return pLeft->enmChoice < pRight->enmChoice ? -1 : 1; \
+    switch (pLeft->enmChoice) \
+    { \
+        default: break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        case a_enmChoice: iDiff = RT_CONCAT(a_Api,_Compare)(pLeft->a_PtrName, pRight->a_PtrName); break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        case a_enmChoice: iDiff = RT_CONCAT(a_Api,_Compare)(&pLeft->a_PtrTnNm->a_Name, &pRight->a_PtrTnNm->a_Name); break
+#define RTASN1TMPL_END_PCHOICE() \
+    } \
+    RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    uint32_t cItems = pLeft->cItems; \
+    if (cItems == pRight->cItems) \
+        for (uint32_t i = 0; iDiff == 0 && i < cItems; i++) \
+            iDiff = RT_CONCAT(a_ItemApi,_Compare)(&pLeft->paItems[i], &pRight->paItems[i]); \
+    else \
+        iDiff = cItems < pRight->cItems ? -1 : 1; \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_CHECK_SANITY
+/*
+ *
+ * Checks the sanity of the type.
+ *
+ */
+# ifndef RTASN1TMPL_SANITY_CHECK_EXPR
+#  define RTASN1TMPL_SANITY_CHECK_EXPR() VINF_SUCCESS
+# endif
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(int) RT_CONCAT(RTASN1TMPL_EXT_NAME,_CheckSanity)(RT_CONCAT(PC,RTASN1TMPL_TYPE) pThis, uint32_t fFlags,  \
+                                                                 PRTERRINFO pErrInfo, const char *pszErrorTag) \
+{ \
+    if (RT_UNLIKELY(!RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis))) \
+        return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s: Missing (%s).", pszErrorTag, RT_XSTR(RTASN1TMPL_TYPE)); \
+    int rc = VINF_SUCCESS
+
+# define RTASN1TMPL_END_COMMON() \
+    if (RT_SUCCESS(rc)) \
+        rc = (RTASN1TMPL_SANITY_CHECK_EXPR()); \
+    return rc; \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE() RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        if (RT_LIKELY(RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name))) \
+        { \
+            rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                               pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+            { a_Constraints } \
+        } \
+        else \
+            rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s: Missing member %s (%s).", \
+                               pszErrorTag, #a_Name, RT_XSTR(RTASN1TMPL_TYPE)); \
+    } do {} while (0)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    if (RT_SUCCESS(rc)) \
+        switch (pThis->a_enmMembNm) \
+        { \
+            default: \
+                rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                                   "%s: Invalid " #a_enmMembNm " value: %d", pszErrorTag, pThis->a_enmMembNm); \
+                break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+            case a_enmValue: \
+                rc = RT_CONCAT(a_Api,_CheckSanity)(pThis->a_UnionNm.a_PtrName, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                                   pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_UnionNm "." #a_PtrName); \
+                break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+            case RT_CONCAT(a_enmType,_NOT_PRESENT): \
+                rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                                   "%s: Invalid " #a_enmMembNm " value: " #a_enmType "_NOT_PRESENT", \
+                                   pszErrorTag, pThis->a_enmMembNm); \
+                break; \
+        }
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    if (RT_SUCCESS(rc) && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name)) \
+    { \
+        rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                           pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+        { a_Constraints } \
+    }
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    if (RT_SUCCESS(rc)) \
+    { \
+        bool const fOuterPresent = RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core); \
+        bool const fInnerPresent = RT_CONCAT(a_Api,_IsPresent)(&pThis->a_TnNm.a_Name); \
+        if (fOuterPresent && fInnerPresent) \
+        { \
+            rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_TnNm.a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                               pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+            { a_Constraints } \
+        } \
+        else if (RT_UNLIKELY(RTASN1CORE_IS_PRESENT(&pThis->a_TnNm.a_CtxTagN.Asn1Core) != fInnerPresent)) \
+            rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                               "%s::" #a_TnNm "." #a_Name ": Explict tag precense mixup; " #a_CtxTagN "=%d " #a_Name "=%d.", \
+                               pszErrorTag, fOuterPresent, fInnerPresent); \
+    } do { } while (0)
+# define RTASN1TMPL_END_SEQCORE()   RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE()   RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    switch (pThis->enmChoice) \
+    { \
+        default: \
+            rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                               "%s: Invalid enmChoice value: %d", pszErrorTag, pThis->enmChoice); \
+            break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        case a_enmChoice: \
+            if (pThis->a_PtrName && RT_CONCAT(a_Api,_IsPresent)(pThis->a_PtrName)) \
+            { \
+                PCRTASN1CORE pCore = RT_CONCAT(a_Api,_GetAsn1Core)(pThis->a_PtrName); \
+                if (pCore->uTag == a_uTag && pCore->fClass == RTASN1TMPL_ITAG_F_EXPAND(a_fClue)) \
+                { \
+                    rc = RT_CONCAT(a_Api,_CheckSanity)(pThis->a_PtrName, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                                       pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+                    { a_Constraints } \
+                } \
+                else \
+                    rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                                       "%s::" #a_Name ": Tag/class mismatch: expected %#x/%#x, actual %#x/%x.", \
+                                       pszErrorTag, a_uTag, RTASN1TMPL_ITAG_F_EXPAND(a_fClue), pCore->uTag, pCore->fClass); \
+            } \
+            else \
+                rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Not present.", pszErrorTag); \
+            break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        case a_enmChoice: \
+            if (   pThis->a_PtrTnNm \
+                && RTASN1CORE_IS_PRESENT(&(pThis->a_PtrTnNm->a_CtxTagN.Asn1Core)) \
+                && RT_CONCAT(a_Api,_IsPresent)(&pThis->a_PtrTnNm->a_Name) ) \
+            { \
+                rc = RT_CONCAT(a_Api,_CheckSanity)(&pThis->a_PtrTnNm->a_Name, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                                   pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::" #a_Name); \
+                { a_Constraints } \
+            } \
+            else \
+                rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Not present.", pszErrorTag); \
+            break
+#define RTASN1TMPL_END_PCHOICE() \
+    } \
+    RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    for (uint32_t i = 0; RT_SUCCESS(rc) && i < pThis->cItems; i++) \
+        rc = RT_CONCAT(a_ItemApi,_CheckSanity)(&pThis->paItems[i], fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK, \
+                                               pErrInfo, RT_XSTR(RTASN1TMPL_TYPE) "::paItems[#]"); \
+    if (RT_SUCCESS(rc)) { RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY(); } \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+/* The constraints. */
+# define RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(a_Name, a_Type, a_Api, cbMin, cbMax, a_MoreConstraints) \
+    if (RT_SUCCESS(rc) && ((cbMin) != 0 || (cbMax) != UINT32_MAX)) \
+    { \
+        PCRTASN1CORE pCore = RT_CONCAT(a_Api,_GetAsn1Core)(&pThis->a_Name); \
+        if (RT_UNLIKELY(pCore->cb < (cbMin) || pCore->cb > (cbMax))) \
+            rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                               "%s::" #a_Name ": Content size is out of range: %#x not in {%#x..%#x}", \
+                               pszErrorTag, pCore->cb, cbMin, cbMax); \
+    } \
+    { a_MoreConstraints }
+
+# define RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, cMinBits, cMaxBits, a_MoreConstraints) \
+    if (RT_SUCCESS(rc) && ((cMinBits) != 0 || (cMaxBits) != UINT32_MAX)) \
+    { \
+        if (RT_UNLIKELY(   ((cMinBits) == 0          ? false : pThis->a_Name.cBits + 1U < (cMinBits) + 1U /* warning avoiding */) \
+                        || ((cMaxBits) == UINT32_MAX ? false : pThis->a_Name.cBits + 1U > (cMaxBits) + 1U /* ditto */) ) ) \
+            rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, \
+                               "%s::" #a_Name ": Bit size is out of range: %#x not in {%#x..%#x}", \
+                               pszErrorTag, pThis->a_Name.cBits, cMinBits, cMaxBits); \
+    } \
+    { a_MoreConstraints }
+
+# define RTASN1TMPL_MEMBER_CONSTR_PRESENT(a_Name, a_Api, a_MoreConstraints) \
+    if (RT_SUCCESS(rc) && RT_UNLIKELY(!RT_CONCAT(a_Api,_IsPresent)(&pThis->a_Name))) \
+        rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "%s::" #a_Name ": Missing.", pszErrorTag); \
+    { a_MoreConstraints }
+
+
+
+# define RTASN1TMPL_EXEC_CHECK_SANITY(a_Expr) if (RT_SUCCESS(rc)) { a_Expr; }
+
+
+#elif RTASN1TMPL_PASS == RTASN1TMPL_PASS_DELETE
+/*
+ *
+ * Delete wrappers.
+ *
+ */
+# define RTASN1TMPL_BEGIN_COMMON() \
+RTASN1TMPL_DECL(void) RT_CONCAT(RTASN1TMPL_EXT_NAME,_Delete)(RT_CONCAT(P,RTASN1TMPL_TYPE) pThis) \
+{ \
+    if (RT_CONCAT(RTASN1TMPL_EXT_NAME,_IsPresent)(pThis)) \
+    {   do { } while (0)
+
+# define RTASN1TMPL_END_COMMON() \
+    } \
+    RT_ZERO(*pThis); \
+} RTASN1TMPL_SEMICOLON_DUMMY()
+
+# define RTASN1TMPL_BEGIN_SEQCORE()                                 RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_BEGIN_SETCORE()                                 RTASN1TMPL_BEGIN_COMMON()
+# define RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints)     RT_CONCAT(a_Api,_Delete)(&pThis->a_Name)
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation) \
+    switch (pThis->a_enmMembNm) \
+    { \
+        default: break
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+        case a_enmValue: \
+            RT_CONCAT(a_Api,_Delete)(pThis->a_UnionNm.a_PtrName); \
+            RTAsn1MemFree(&pThis->Allocation, pThis->a_UnionNm.a_PtrName); \
+            pThis->a_UnionNm.a_PtrName = NULL; \
+            break
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation) \
+    }
+# define RTASN1TMPL_END_SEQCORE()                                   RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_END_SETCORE()                                   RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_BEGIN_PCHOICE() \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    switch (pThis->enmChoice) \
+    { \
+        default: break
+# define RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, a_fClue, a_Constraints) \
+        case a_enmChoice: \
+            RT_CONCAT(a_Api,_Delete)(pThis->a_PtrName); \
+            RTAsn1MemFree(&pThis->Allocation, pThis->a_PtrName); \
+            pThis->a_PtrName = NULL; \
+            break
+# define RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_Constraints) \
+        case a_enmChoice: \
+            RT_CONCAT(a_Api,_Delete)(&pThis->a_PtrTnNm->a_Name); \
+            RTAsn1MemFree(&pThis->Allocation, pThis->a_PtrTnNm); \
+            pThis->a_PtrTnNm = NULL; \
+            break
+# define RTASN1TMPL_END_PCHOICE() \
+    } \
+    RTASN1TMPL_END_COMMON()
+
+
+# define RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi) \
+    RTASN1TMPL_BEGIN_COMMON(); \
+    uint32_t i = pThis->cItems; \
+    while (i-- > 0) \
+        RT_CONCAT(a_ItemApi,_Delete)(&pThis->paItems[i]); \
+    RTAsn1MemFree(&pThis->Allocation, pThis->paItems); \
+    pThis->paItems = NULL; \
+    RTASN1TMPL_END_COMMON()
+# define RTASN1TMPL_SEQ_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+# define RTASN1TMPL_SET_OF(a_ItemType, a_ItemApi) RTASN1TMPL_SET_SEQ_OF_COMMON(a_ItemType, a_ItemApi)
+
+
+#else
+# error "Invalid/missing RTASN1TMPL_PASS value."
+#endif
+
+
+
+/*
+ * Default aliases for simplified versions of macros if no specialization
+ * was required above.
+ */
+/* Non-optional members. */
+#ifndef RTASN1TMPL_MEMBER
+# define RTASN1TMPL_MEMBER(a_Name, a_Type, a_Api) \
+    RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX(a_Name) \
+    RTASN1TMPL_MEMBER(a_Name, RTASN1STRING, RTAsn1String)
+#endif
+#ifndef RTASN1TMPL_MEMBER_UTF8_STRING
+# define RTASN1TMPL_MEMBER_UTF8_STRING(a_Name) \
+    RTASN1TMPL_MEMBER_UTF8_STRING_MIN_MAX(a_Name, 0, UINT32_MAX)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_STRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_STRING_MIN_MAX(a_Name, a_cbMin, a_cbMax) \
+    RTASN1TMPL_MEMBER(a_Name, RTASN1STRING, RTAsn1String)
+#endif
+#ifndef RTASN1TMPL_MEMBER_STRING
+# define RTASN1TMPL_MEMBER_STRING(a_Name) \
+    RTASN1TMPL_MEMBER_STRING_MIN_MAX(a_Name, 0, UINT32_MAX)
+#endif
+#ifndef RTASN1TMPL_MEMBER_XTAG_EX
+# define RTASN1TMPL_MEMBER_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    RTASN1TMPL_MEMBER_EX(a_TnNm.a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+
+/* Any/dynamic members.  */
+#ifndef RTASN1TMPL_MEMBER_DYN_BEGIN
+# define RTASN1TMPL_MEMBER_DYN_BEGIN(a_enmType, a_enmMembNm, a_Allocation)   do { } while (0)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_END
+# define RTASN1TMPL_MEMBER_DYN_END(a_enmType, a_enmMembNm, a_Allocation)     do { } while (0)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_COMMON
+# define RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_IfStmt) \
+    RTASN1TMPL_MEMBER(a_UnionNm.a_PtrName, a_Type, a_Api)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN
+# define RTASN1TMPL_MEMBER_DYN(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, a_WhenExpr) \
+    RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, if (a_WhenExpr))
+#endif
+#ifndef RTASN1TMPL_MEMBER_DYN_DEFAULT
+# define RTASN1TMPL_MEMBER_DYN_DEFAULT(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue) \
+    RTASN1TMPL_MEMBER_DYN_COMMON(a_UnionNm, a_PtrName, a_Type, a_Api, a_Allocation, a_enmMembNm, a_enmValue, RT_NOTHING)
+#endif
+
+/* Optional members. */
+#ifndef RTASN1TMPL_MEMBER_OPT_EX
+# define RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints) \
+    RTASN1TMPL_MEMBER_EX(a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT
+# define RTASN1TMPL_MEMBER_OPT(a_Name, a_Type, a_Api) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_XTAG_EX
+# define RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_TnNm.a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_XTAG
+# define RTASN1TMPL_MEMBER_OPT_XTAG(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_XTAG_EX(a_TnNm, a_CtxTagN, a_Name, a_Type, a_Api, a_uTag, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_EX
+# define RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_UP
+# define RTASN1TMPL_MEMBER_OPT_ITAG_UP(a_Name, a_Type, a_Api, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_UC
+# define RTASN1TMPL_MEMBER_OPT_ITAG_UC(a_Name, a_Type, a_Api, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UC, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_CP
+# define RTASN1TMPL_MEMBER_OPT_ITAG_CP(a_Name, a_Type, a_Api, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_CP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG
+# define RTASN1TMPL_MEMBER_OPT_ITAG(a_Name, a_Type, a_Api, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_CC, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_ANY
+# define RTASN1TMPL_MEMBER_OPT_ANY(a_Name, a_Type, a_Api) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_DEF_ITAG_EX
+# define RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_DefVal, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, a_fClue, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_DEF_ITAG_UP
+# define RTASN1TMPL_MEMBER_DEF_ITAG_UP(a_Name, a_Type, a_Api, a_uTag, a_DefVal) \
+    RTASN1TMPL_MEMBER_DEF_ITAG_EX(a_Name, a_Type, a_Api, a_uTag, RTASN1TMPL_ITAG_F_UP, a_DefVal, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING
+# define RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(a_Name, a_cMaxBits, a_uTag) \
+    RTASN1TMPL_MEMBER_OPT_ITAG_EX(a_Name, RTASN1BITSTRING, RTAsn1BitString, a_uTag, RTASN1TMPL_ITAG_F_CP, \
+                                  RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, 0, a_cMaxBits, RT_NOTHING))
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1String, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_UTF8_STRING
+# define RTASN1TMPL_MEMBER_OPT_UTF8_STRING(a_Name) \
+    RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(a_Name, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_MEMBER_OPT_STRING_EX
+# define RTASN1TMPL_MEMBER_OPT_STRING_EX(a_Name, a_Constraints) \
+    RTASN1TMPL_MEMBER_OPT_EX(a_Name, RTASN1STRING, RTAsn1String, a_Constraints RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_MEMBER_OPT_STRING
+# define RTASN1TMPL_MEMBER_OPT_STRING(a_Name) \
+    RTASN1TMPL_MEMBER_OPT_STRING_EX(a_Name, RT_NOTHING)
+#endif
+
+/* Pointer choices. */
+#ifndef RTASN1TMPL_PCHOICE_ITAG_UP
+# define RTASN1TMPL_PCHOICE_ITAG_UP(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+    RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_UP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_PCHOICE_ITAG_CP
+# define RTASN1TMPL_PCHOICE_ITAG_CP(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+    RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_CP, RT_NOTHING)
+#endif
+#ifndef RTASN1TMPL_PCHOICE_ITAG
+# define RTASN1TMPL_PCHOICE_ITAG(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api) \
+    RTASN1TMPL_PCHOICE_ITAG_EX(a_uTag, a_enmChoice, a_PtrName, a_Name, a_Type, a_Api, RTASN1TMPL_ITAG_F_CC, RT_NOTHING)
+#endif
+
+#ifndef RTASN1TMPL_PCHOICE_XTAG
+# define RTASN1TMPL_PCHOICE_XTAG(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api) \
+    RTASN1TMPL_PCHOICE_XTAG_EX(a_uTag, a_enmChoice, a_PtrTnNm, a_CtxTagN, a_Name, a_Type, a_Api, RT_NOTHING)
+#endif
+
+
+/*
+ * Constraints are only used in the sanity check pass, so provide subs for the
+ * others passes.
+ */
+#ifndef RTASN1TMPL_MEMBER_CONSTR_MIN_MAX
+# define RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(a_Name, a_Type, a_Api, cbMin, cbMax, a_MoreConstraints)
+#endif
+#ifndef RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX
+# define RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(a_Name, cMinBits, cMaxBits, a_MoreConstraints)
+#endif
+#ifndef RTASN1TMPL_MEMBER_CONSTR_PRESENT
+# define RTASN1TMPL_MEMBER_CONSTR_PRESENT(a_Name, a_Api, a_MoreConstraints)
+#endif
+
+
+/*
+ * Stub exec hacks.
+ */
+#ifndef RTASN1TMPL_EXEC_DECODE
+# define RTASN1TMPL_EXEC_DECODE(a_Expr) /* no semi colon allowed after this */
+#endif
+#ifndef RTASN1TMPL_EXEC_CLONE
+# define RTASN1TMPL_EXEC_CLONE(a_Expr)  /* no semi colon allowed after this */
+#endif
+#ifndef RTASN1TMPL_EXEC_CHECK_SANITY
+# define RTASN1TMPL_EXEC_CHECK_SANITY(a_Expr)  /* no semi colon allowed after this */
+#endif
+
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() do { } while (0)
+
+
+/*
+ * Generate the requested code.
+ */
+#ifndef RTASN1TMPL_TEMPLATE_FILE
+# error "No template file (RTASN1TMPL_TEMPLATE_FILE) is specified."
+#endif
+#include RTASN1TMPL_TEMPLATE_FILE
+
+
+
+/*
+ * Undo all the macros.
+ */
+#undef RTASN1TMPL_DECL
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+#undef RTASN1TMPL_PASS
+
+#undef RTASN1TMPL_BEGIN_COMMON
+#undef RTASN1TMPL_END_COMMON
+#undef RTASN1TMPL_BEGIN_SEQCORE
+#undef RTASN1TMPL_BEGIN_SETCORE
+#undef RTASN1TMPL_MEMBER
+#undef RTASN1TMPL_MEMBER_EX
+#undef RTASN1TMPL_MEMBER_DYN_BEGIN
+#undef RTASN1TMPL_MEMBER_DYN
+#undef RTASN1TMPL_MEMBER_DYN_DEFAULT
+#undef RTASN1TMPL_MEMBER_DYN_COMMON
+#undef RTASN1TMPL_MEMBER_DYN_END
+#undef RTASN1TMPL_MEMBER_OPT
+#undef RTASN1TMPL_MEMBER_OPT_EX
+#undef RTASN1TMPL_MEMBER_OPT_ITAG
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_EX
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_CP
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_UC
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_UP
+#undef RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING
+#undef RTASN1TMPL_MEMBER_OPT_UTF8_STRING
+#undef RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX
+#undef RTASN1TMPL_MEMBER_OPT_XTAG
+#undef RTASN1TMPL_MEMBER_OPT_XTAG_EX
+#undef RTASN1TMPL_MEMBER_OPT_ANY
+#undef RTASN1TMPL_MEMBER_DEF_ITAG_UP
+#undef RTASN1TMPL_MEMBER_DEF_ITAG_EX
+#undef RTASN1TMPL_END_SEQCORE
+#undef RTASN1TMPL_END_SETCORE
+
+#undef RTASN1TMPL_BEGIN_PCHOICE
+#undef RTASN1TMPL_PCHOICE_ITAG
+#undef RTASN1TMPL_PCHOICE_ITAG_UP
+#undef RTASN1TMPL_PCHOICE_ITAG_CP
+#undef RTASN1TMPL_PCHOICE_ITAG_EX
+#undef RTASN1TMPL_PCHOICE_XTAG
+#undef RTASN1TMPL_PCHOICE_XTAG_EX
+#undef RTASN1TMPL_END_PCHOICE
+
+#undef RTASN1TMPL_SET_SEQ_OF_COMMON
+#undef RTASN1TMPL_SEQ_OF
+#undef RTASN1TMPL_SET_OF
+
+#undef RTASN1TMPL_VTABLE_FN_ENCODE_PREP
+#undef RTASN1TMPL_VTABLE_FN_ENCODE_WRITE
+
+#undef RTASN1TMPL_MEMBER_CONSTR_MIN_MAX
+#undef RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX
+#undef RTASN1TMPL_MEMBER_CONSTR_PRESENT
+
+#undef RTASN1TMPL_SANITY_CHECK_EXPR
+
+#undef RTASN1TMPL_EXEC_DECODE
+#undef RTASN1TMPL_EXEC_CLONE
+#undef RTASN1TMPL_EXEC_CHECK_SANITY
+
+#undef RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/asn1-generator-sanity.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/asn1-generator-sanity.h
index 35b6d89..d44c21b 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/asn1-generator-sanity.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1 Code Generator, the Sanity Checking.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +23,7 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_PASS RTASN1TMPL_PASS_CHECK_SANITY
+#include <iprt/asn1-generator-pass.h>
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
 
diff --git a/include/iprt/asn1.h b/include/iprt/asn1.h
new file mode 100644
index 0000000..68ea66f
--- /dev/null
+++ b/include/iprt/asn1.h
@@ -0,0 +1,2044 @@
+/** @file
+ * IPRT - Abstract Syntax Notation One (ASN.1).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_asn1_h
+#define ___iprt_asn1_h
+
+#include <iprt/time.h>
+#include <iprt/stdarg.h>
+#include <iprt/err.h>
+#include <iprt/formats/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_asn1   RTAsn1 - Abstract Syntax Notation One
+ * @ingroup grp_rt
+ * @{
+ */
+
+
+/** Pointer to ASN.1 allocation information. */
+typedef struct RTASN1ALLOCATION *PRTASN1ALLOCATION;
+/** Pointer to a ASN.1 byte decoder cursor. */
+typedef struct RTASN1CURSOR *PRTASN1CURSOR;
+
+
+/**
+ * Sketch of a custom ASN.1 allocator virtual method table.
+ *
+ * Any information required by the allocator should be associated with this
+ * structure, i.e. use this as a kind of parent class.  This saves storage in
+ * RTASN1ALLOCATORINFO and possibly reduces the number of parameters by one.
+ */
+typedef struct RTASN1ALLOCATORVTABLE
+{
+    /**
+     * Free a chunk of memory allocated by this allocator.
+     *
+     * @returns IPRT status code.
+     * @param   pThis           Pointer to the vtable structure.
+     * @param   pAllocation     Pointer to the allocation info structure.
+     * @param   pv              Pointer to the memory that shall be freed. Not NULL.
+     */
+    DECLCALLBACKMEMBER(void, pfnFree)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+                                      void *pv);
+    /**
+     * Allocates a chunk of memory, all initialized to zero.
+     *
+     * @returns IPRT status code.
+     * @param   pThis           Pointer to the vtable structure.
+     * @param   pAllocation     Pointer to the allocation info structure.
+     * @param   ppv             Where to store the pointer on success.
+     * @param   cb              The minimum number of bytes to allocate.  The actual
+     *                          number of bytes allocated shall be stored in
+     *                          pInfo->cbAllocated on success.
+     */
+    DECLCALLBACKMEMBER(int, pfnAlloc)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+                                      void **ppv, size_t cb);
+    /**
+     * Reallocates a memory allocation.
+     *
+     * New memory does not need to be initialized, the caller takes care of that.
+     *
+     * This will not need to deal with free (@a cbNew == 0) or the initial
+     * allocation (@a pvOld == NULL), those calls will be directed to pfnFree and
+     * pfnAlloc respectively.
+     *
+     * @returns IPRT status code.
+     * @param   pThis           Pointer to the vtable structure.
+     * @param   pAllocation     Pointer to the allocation info structure.
+     * @param   pvOld           Pointer to the current allocation.  Shall remain
+     *                          valid on failure, but may be invalid on success.
+     * @param   ppvNew          Where to store the pointer on success.  Shall not be
+     *                          touched, except on successful returns.
+     * @param   cbNew           The new minimum allocation size.  The actual number
+     *                          of bytes allocated shall be stored in
+     *                          pInfo->cbAllocated on success.
+     */
+    DECLCALLBACKMEMBER(int, pfnRealloc)(struct RTASN1ALLOCATORVTABLE const *pThis, PRTASN1ALLOCATION pAllocation,
+                                        void *pvOld, void **ppvNew, size_t cbNew);
+} RTASN1ALLOCATORVTABLE;
+/** Pointer to an ASN.1 allocator vtable. */
+typedef RTASN1ALLOCATORVTABLE *PRTASN1ALLOCATORVTABLE;
+/** Pointer to a const ASN.1 allocator vtable. */
+typedef RTASN1ALLOCATORVTABLE const *PCRTASN1ALLOCATORVTABLE;
+
+/** The default ASN.1 allocator. */
+extern RTDATADECL(RTASN1ALLOCATORVTABLE const) g_RTAsn1DefaultAllocator;
+
+
+/**
+ * Allocation information.
+ */
+typedef struct RTASN1ALLOCATION
+{
+    /** The number of bytes currently allocated. */
+    uint32_t                    cbAllocated;
+    /** Number of realloc calls. */
+    uint16_t                    cReallocs;
+    /** Reserved / padding. */
+    uint16_t                    uReserved0;
+    /** Allocator vtable, NULL for the default allocator. */
+    PCRTASN1ALLOCATORVTABLE     pAllocator;
+} RTASN1ALLOCATION;
+
+
+/**
+ * Grow an array by zero initialized memory.
+ *
+ * @returns IPRT status code.
+ * @param   pAllocation The allocation record (initialized by
+ *                      RTAsn1CursorInitAllocation or similar).
+ * @param   ppvArray    Pointer to the variable pointing to the array.  This is
+ *                      both input and output. Remains valid on failure.
+ * @param   cbEntry     The size of an array entry.
+ * @param   cCurrent    The current entry count.  (Relevant for zero
+ *                      initialization of the new entries.)
+ * @param   cNew        The new entry count.
+ */
+RTDECL(int) RTAsn1MemGrowArray(PRTASN1ALLOCATION pAllocation, void **ppvArray, size_t cbEntry,
+                               uint32_t cCurrent, uint32_t cNew);
+
+/**
+ * Allocate a block of zero initialized memory.
+ *
+ * @returns IPRT status code.
+ * @param   pAllocation The allocation record (initialized by
+ *                      RTAsn1CursorInitAllocation or similar).
+ * @param   ppvMem      Where to return the pointer to the block.
+ * @param   cbMem       The minimum number of bytes to allocate.
+ */
+RTDECL(int) RTAsn1MemAllocZ(PRTASN1ALLOCATION pAllocation, void **ppvMem, size_t cbMem);
+
+/**
+ * Allocates a block of memory initialized to the content of @a pvSrc.
+ *
+ * @returns IPRT status code.
+ * @param   pAllocation The allocation record (initialized by
+ *                      RTAsn1CursorInitAllocation or similar).
+ * @param   ppvMem      Where to return the pointer to the block.
+ * @param   pvSrc       The source memory.
+ * @param   cbMem       The minimum number of bytes to allocate.
+ */
+RTDECL(int) RTAsn1MemDup(PRTASN1ALLOCATION pAllocation, void **ppvMem, void const *pvSrc, size_t cbMem);
+
+/**
+ * Free a memory block.
+ *
+ * @param   pAllocation The allocation record (initialized by
+ *                      RTAsn1CursorInitAllocation or similar).
+ * @param   pv          The memory block to free.  NULL will be ignored.
+ */
+RTDECL(void) RTAsn1MemFree(PRTASN1ALLOCATION pAllocation, void *pv);
+
+/**
+ * Initalize an allocation.
+ *
+ * @param   pAllocation The allocation record (initialized by
+ *                      RTAsn1CursorInitAllocation or similar).
+ * @param   pAllocator  The allocator
+ */
+RTDECL(PRTASN1ALLOCATION) RTAsn1MemInitAllocation(PRTASN1ALLOCATION pAllocation, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTDECL(int)  RTAsn1ContentAllocZ(struct RTASN1CORE *pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int)  RTAsn1ContentDup(struct RTASN1CORE *pAsn1Core, void const *pvSrc, size_t cbSrc, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int)  RTAsn1ContentReallocZ(struct RTASN1CORE *pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(void) RTAsn1ContentFree(struct RTASN1CORE *pAsn1Core);
+
+
+
+/** Pointer to a core ASN.1 encoding info structure. */
+typedef struct RTASN1CORE *PRTASN1CORE;
+/** Pointer to a const core ASN.1 encoding info structure. */
+typedef struct RTASN1CORE const *PCRTASN1CORE;
+
+
+/**
+ * ASN.1 object enumeration callback.
+ *
+ * @returns IPRT status code. VINF_SUCCESS continues the enumberation, all
+ *          others quit it and is returned to the caller's caller.
+ * @param   pAsn1Core           The ASN.1 object we're called back about.
+ * @param   pszName             The member name. Array member names ends with
+ *                              '[#]'.
+ * @param   uDepth              The current depth.
+ * @param   pvUser              Callback user parameter.
+ */
+typedef DECLCALLBACK(int) FNRTASN1ENUMCALLBACK(struct RTASN1CORE *pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser);
+/** Pointer to an ASN.1 object enumeration callback. */
+typedef FNRTASN1ENUMCALLBACK *PFNRTASN1ENUMCALLBACK;
+
+/**
+ * ASN.1 object encoding writer callback.
+ *
+ * @returns IPRT status code.
+ * @param   pbBuf               Pointer to the bytes to output.
+ * @param   cbToWrite           The number of bytes to write.
+ * @param   pvUser              Callback user parameter.
+ * @param   pErrInfo            Where to store extended error info. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1ENCODEWRITER(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to an ASN.1 encoding writer callback. */
+typedef FNRTASN1ENCODEWRITER *PFNRTASN1ENCODEWRITER;
+
+/** @name ASN.1 Vtable Method Types
+ * @{ */
+
+/**
+ * Destructor.
+ *
+ * RTAsn1Destroy will first destroy all children by recursive calls to pfnEnum,
+ * afterwards it will call this method to release any memory or other resources
+ * associated with this object.  The memory backing the object structure shall
+ * not be freed by this method.
+ *
+ * @param   pThisCore       Pointer to the ASN.1 core to destroy.
+ */
+typedef DECLCALLBACK(void) FNRTASN1COREVTDTOR(PRTASN1CORE pThisCore);
+/** Pointer to a FNRTASN1COREVTDTOR method. */
+typedef FNRTASN1COREVTDTOR *PFNRTASN1COREVTDTOR;
+
+/**
+ * Enumerate members (not necessary for primitive objects).
+ *
+ * @returns IPRT status code, any non VINF_SUCCESS value stems from pfnCallback.
+ * @param   pThisCore       Pointer to the ASN.1 core to enumerate members of.
+ * @param   pfnCallback     The callback.
+ * @param   uDepth          The depth of this object. Children are at +1.
+ * @param   pvUser          Callback user argument.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENUM(PRTASN1CORE pThisCore, PFNRTASN1ENUMCALLBACK pfnCallback,
+                                             uint32_t uDepth, void *pvUser);
+/** Pointer to a FNRTASN1COREVTENUM method. */
+typedef FNRTASN1COREVTENUM *PFNRTASN1COREVTENUM;
+
+/**
+ * Clone method.
+ *
+ * @param   pThisCore       Pointer to the ASN.1 core to initialize as a clone
+ *                          of pSrcClone.  (The caller is responsible for making
+ *                          sure there is sufficent space and such.)
+ * @param   pSrcCore        The object to clone.
+ * @param   pAllocator      The allocator to use.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCLONE(PRTASN1CORE pThisCore, PCRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator);
+/** Pointer to a FNRTASN1COREVTCLONE method. */
+typedef FNRTASN1COREVTCLONE *PFNRTASN1COREVTCLONE;
+
+/**
+ * Compare method.
+ *
+ * The caller makes sure both cores are present and have the same Vtable.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pLeftCore       Pointer to the ASN.1 core of the left side object.
+ * @param   pRightCore      Pointer to the ASN.1 core of the right side object.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCOMPARE(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore);
+/** Pointer to a FNRTASN1COREVTCOMPARE method. */
+typedef FNRTASN1COREVTCOMPARE *PFNRTASN1COREVTCOMPARE;
+
+/**
+ * Check sanity method.
+ *
+ * @returns IPRT status code.
+ * @param   pThisCore       Pointer to the ASN.1 core of the object to check out.
+ * @param   fFlags          See RTASN1_CHECK_SANITY_F_XXX.
+ * @param   pszErrInfo      Where to return additional error details. Optional.
+ * @param   pszErrorTag     Tag for the additional error details.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTCHECKSANITY(PCRTASN1CORE pThisCore, uint32_t fFlags,
+                                                    PRTERRINFO pErrInfo, const char *pszErrorTag);
+/** Pointer to a FNRTASN1COREVTCHECKSANITY method. */
+typedef FNRTASN1COREVTCHECKSANITY *PFNRTASN1COREVTCHECKSANITY;
+
+/**
+ * Optional encoding preparations.
+ *
+ * On successful return, the pThisCore->cb value shall be valid and up to date.
+ * Will be called for any present object, including ones with default values and
+ * similar.
+ *
+ * @returns IPRT status code
+ * @param   pThisCore       Pointer to the ASN.1 core to enumerate members of.
+ * @param   fFlags          Encoding flags, RTASN1ENCODE_F_XXX.
+ * @param   pErrInfo        Where to return extra error information. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENCODEPREP(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo);
+/** Pointer to a FNRTASN1COREVTENCODEWRITE method. */
+typedef FNRTASN1COREVTENCODEPREP *PFNRTASN1COREVTENCODEPREP;
+
+/**
+ * Optional encoder writer.
+ *
+ * This writes the header as well as all the content.  Will be called for any
+ * present object, including ones with default values and similar.
+ *
+ * @returns IPRT status code.
+ * @param   pThisCore       Pointer to the ASN.1 core to enumerate members of.
+ * @param   fFlags          Encoding flags, RTASN1ENCODE_F_XXX.
+ * @param   pfnWriter       The output writer function.
+ * @param   pvUser          The user context for the writer function.
+ * @param   pErrInfo        Where to return extra error information. Optional.
+ */
+typedef DECLCALLBACK(int) FNRTASN1COREVTENCODEWRITE(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+                                                    void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to a FNRTASN1COREVTENCODEWRITE method. */
+typedef FNRTASN1COREVTENCODEWRITE *PFNRTASN1COREVTENCODEWRITE;
+/** @} */
+
+/** Mask of common flags. These will be propagated during sanity checking.
+ * Bits not in this mask are type specfic. */
+#define RTASN1_CHECK_SANITY_F_COMMON_MASK       UINT32_C(0xffff0000)
+
+/**
+ * ASN.1 core vtable.
+ */
+typedef struct RTASN1COREVTABLE
+{
+    /** The name. */
+    const char                 *pszName;
+    /** Size of the structure. */
+    uint32_t                    cbStruct;
+    /** The default tag, UINT8_MAX if not applicable. */
+    uint8_t                     uDefaultTag;
+    /** The default class and flags.  */
+    uint8_t                     fDefaultClass;
+    /** Reserved for later / alignment. */
+    uint16_t                    uReserved;
+    /** @copydoc FNRTASN1COREVTDTOR */
+    PFNRTASN1COREVTDTOR         pfnDtor;
+    /** @copydoc FNRTASN1COREVTENUM */
+    PFNRTASN1COREVTENUM         pfnEnum;
+    /** @copydoc FNRTASN1COREVTCLONE */
+    PFNRTASN1COREVTCLONE        pfnClone;
+    /** @copydoc FNRTASN1COREVTCOMPARE */
+    PFNRTASN1COREVTCOMPARE      pfnCompare;
+    /** @copydoc FNRTASN1COREVTCHECKSANITY */
+    PFNRTASN1COREVTCHECKSANITY  pfnCheckSanity;
+    /** @copydoc FNRTASN1COREVTENCODEPREP */
+    PFNRTASN1COREVTENCODEPREP   pfnEncodePrep;
+    /** @copydoc FNRTASN1COREVTENUM */
+    PFNRTASN1COREVTENCODEWRITE  pfnEncodeWrite;
+} RTASN1COREVTABLE;
+/** Pointer to an ASN.1 allocator vtable. */
+typedef struct RTASN1COREVTABLE *PRTASN1COREVTABLE;
+/** Pointer to a const ASN.1 allocator vtable. */
+typedef RTASN1COREVTABLE const *PCRTASN1COREVTABLE;
+
+
+/** @name Helper macros for prototyping standard functions for an ASN.1 type.
+ * @{ */
+#define RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm) \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_Init)(RT_CONCAT(P,a_TypeNm) pThis, PCRTASN1ALLOCATORVTABLE pAllocator); \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_Clone)(RT_CONCAT(P,a_TypeNm) pThis, RT_CONCAT(PC,a_TypeNm) pSrc, \
+                                                    PCRTASN1ALLOCATORVTABLE pAllocator); \
+    a_DeclMacro(void) RT_CONCAT(a_ImplExtNm,_Delete)(RT_CONCAT(P,a_TypeNm) pThis); \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_Enum)(RT_CONCAT(P,a_TypeNm) pThis, PFNRTASN1ENUMCALLBACK pfnCallback, \
+                                                   uint32_t uDepth, void *pvUser); \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_Compare)(RT_CONCAT(PC,a_TypeNm) pLeft, RT_CONCAT(PC,a_TypeNm) pRight); \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, RT_CONCAT(P,a_TypeNm) pThis,\
+                                                         const char *pszErrorTag); \
+    a_DeclMacro(int)  RT_CONCAT(a_ImplExtNm,_CheckSanity)(RT_CONCAT(PC,a_TypeNm) pThis, uint32_t fFlags, \
+                                                         PRTERRINFO pErrInfo, const char *pszErrorTag)
+
+
+/** @name Helper macros for prototyping standard functions for an ASN.1 type.
+ * @{ */
+#define RTASN1TYPE_STANDARD_PROTOTYPES(a_TypeNm, a_DeclMacro, a_ImplExtNm, a_Asn1CoreNm) \
+    DECL_FORCE_INLINE(PRTASN1CORE) RT_CONCAT(a_ImplExtNm,_GetAsn1Core)(RT_CONCAT(PC,a_TypeNm) pThis) \
+    { return (PRTASN1CORE)&pThis->a_Asn1CoreNm; } \
+    DECLINLINE(bool) RT_CONCAT(a_ImplExtNm,_IsPresent)(RT_CONCAT(PC,a_TypeNm) pThis) \
+    { return pThis && RTASN1CORE_IS_PRESENT(&pThis->a_Asn1CoreNm); } \
+    RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(a_TypeNm, a_DeclMacro, a_ImplExtNm)
+
+
+/** Aliases two ASN.1 types. */
+#define RTASN1TYPE_ALIAS(a_TypeNm, a_AliasType, a_ImplExtNm, a_AliasExtNm) \
+    typedef a_AliasType a_TypeNm; \
+    typedef a_TypeNm *RT_CONCAT(P,a_TypeNm); \
+    \
+    DECLINLINE(PRTASN1CORE) RT_CONCAT(a_ImplExtNm,_GetAsn1Core)(a_TypeNm const *pThis) \
+    { return RT_CONCAT(a_AliasExtNm,_GetAsn1Core)(pThis); } \
+    DECLINLINE(bool) RT_CONCAT(a_ImplExtNm,_IsPresent)(a_TypeNm const *pThis) \
+    { return RT_CONCAT(a_AliasExtNm,_IsPresent)(pThis); } \
+    \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_Init)(RT_CONCAT(P,a_TypeNm) pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { return RT_CONCAT(a_AliasExtNm,_Init)(pThis, pAllocator); } \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_Clone)(RT_CONCAT(P,a_TypeNm) pThis, a_TypeNm const *pSrc, \
+                                                   PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { return RT_CONCAT(a_AliasExtNm,_Clone)(pThis, pSrc, pAllocator); } \
+    DECLINLINE(void) RT_CONCAT(a_ImplExtNm,_Delete)(RT_CONCAT(P,a_TypeNm) pThis) \
+    { RT_CONCAT(a_AliasExtNm,_Delete)(pThis); } \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_Enum)(a_TypeNm *pThis, PFNRTASN1ENUMCALLBACK pfnCallback, \
+                                                  uint32_t uDepth, void *pvUser) \
+    { return RT_CONCAT(a_AliasExtNm,_Enum)(pThis, pfnCallback, uDepth, pvUser); } \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_Compare)(a_TypeNm const *pLeft, a_TypeNm const *pRight) \
+    { return RT_CONCAT(a_AliasExtNm,_Compare)(pLeft, pRight); } \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, RT_CONCAT(P,a_TypeNm) pThis,\
+                                                        const char *pszErrorTag) \
+    { return RT_CONCAT(a_AliasExtNm,_DecodeAsn1)(pCursor, fFlags, pThis, pszErrorTag); } \
+    DECLINLINE(int)  RT_CONCAT(a_ImplExtNm,_CheckSanity)(a_TypeNm const *pThis, uint32_t fFlags, \
+                                                         PRTERRINFO pErrInfo, const char *pszErrorTag) \
+    { return RT_CONCAT(a_AliasExtNm,_CheckSanity)(pThis, fFlags, pErrInfo, pszErrorTag); } \
+    \
+    typedef a_TypeNm const *RT_CONCAT(PC,a_TypeNm)
+
+/** @} */
+
+
+/**
+ * Core ASN.1 structure for storing encoding details and data location.
+ *
+ * This is used as a 'parent' for all other decoded ASN.1 based structures.
+ */
+typedef struct RTASN1CORE
+{
+    /** The tag.
+     * @remarks 32-bit should be enough for everyone... We don't currently
+     *          implement decoding tags larger than 30 anyway. :-) */
+    uint32_t                uTag;
+    /** Tag class and flags (ASN1_TAGCLASS_XXX and ASN1_TAGFLAG_XXX). */
+    uint8_t                 fClass;
+    /** The real tag value for IMPLICT tag overrides. */
+    uint8_t                 uRealTag;
+    /** The real class value for IMPLICT tag overrides. */
+    uint8_t                 fRealClass;
+    /** The size of the tag and length ASN.1 header. */
+    uint8_t                 cbHdr;
+    /** Length.  */
+    uint32_t                cb;
+    /** IPRT flags (RTASN1CORE_F_XXX). */
+    uint32_t                fFlags;
+    /** Pointer to the data.
+     * After decoding this generally points to the encoded data content.  When
+     * preparting something for encoding or otherwise constructing things in memory,
+     * this generally points heap memory or read-only constants.
+     * @sa RTAsn1ContentAllocZ,  RTAsn1ContentReallocZ, RTAsn1ContentDup,
+     *     RTAsn1ContentFree. */
+    RTCPTRUNION             uData;
+    /** Pointer to the virtual method table for this object. Optional. */
+    PCRTASN1COREVTABLE      pOps;
+} RTASN1CORE;
+/** The Vtable for a RTASN1CORE structure when not in some way use used as a
+ *  parent type/class. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Core_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(RTASN1CORE, RTDECL, RTAsn1Core);
+
+/** @name RTASN1CORE_F_XXX - Flags for RTASN1CORE::fFlags
+ * @{ */
+/** Present/valid. */
+#define RTASN1CORE_F_PRESENT            RT_BIT_32(0)
+/** Not present in stream, using default value. */
+#define RTASN1CORE_F_DEFAULT            RT_BIT_32(1)
+/** The tag was overriden by an implict context tag or some such thing,
+ * RTASN1CORE::uImplicitTag hold the universal tag value if one exists. */
+#define RTASN1CORE_F_TAG_IMPLICIT       RT_BIT_32(2)
+/** Primitive tag with the corresponding RTASN1XXX struct. */
+#define RTASN1CORE_F_PRIMITE_TAG_STRUCT RT_BIT_32(3)
+/** Dummy node typically used with choices, has children, not encoded, must be
+ * ignored. */
+#define RTASN1CORE_F_DUMMY              RT_BIT_32(4)
+/** Allocated content (pointed to by uData).
+ * The content should is still be considered 104% read-only by anyone other
+ * than then type methods (pOps and associates). */
+#define RTASN1CORE_F_ALLOCATED_CONTENT  RT_BIT_32(5)
+/** Decoded content (pointed to by uData).
+ * Mutually exclusive with RTASN1CORE_F_ALLOCATED_CONTENT.  If neither is
+ * set, uData might be NULL or point to some shared static memory for
+ * frequently used values. */
+#define RTASN1CORE_F_DECODED_CONTENT    RT_BIT_32(6)
+/** @} */
+
+
+/** Check s whether an ASN.1 core object present in some way (default data,
+ *  decoded data, ...). */
+#define RTASN1CORE_IS_PRESENT(a_pAsn1Core)          ( RT_BOOL((a_pAsn1Core)->fFlags) )
+
+/** Check s whether an ASN.1 core object is a dummy object (and is present). */
+#define RTASN1CORE_IS_DUMMY(a_pAsn1Core)            ( RT_BOOL((a_pAsn1Core)->fFlags & RTASN1CORE_F_DUMMY) )
+
+/**
+ * Calculates pointer to the raw ASN.1 record.
+ *
+ * ASSUMES that it's decoded content and that cbHdr and uData are both valid.
+ *
+ * @returns Byte pointer to the first tag byte.
+ * @param   a_pAsn1Core     The ASN.1 core.
+ */
+#define RTASN1CORE_GET_RAW_ASN1_PTR(a_pAsn1Core)    ( (a_pAsn1Core)->uData.pu8 - (a_pAsn1Core)->cbHdr )
+
+/**
+ * Calculates the length of the raw ASN.1 record to go with the
+ * RTASN1CORE_GET_RAW_ASN1_PTR() result.
+ *
+ * ASSUMES that it's decoded content and that cbHdr and uData are both valid.
+ *
+ * @returns Size in bytes (uint32_t).
+ * @param   a_pAsn1Core     The ASN.1 core.
+ */
+#define RTASN1CORE_GET_RAW_ASN1_SIZE(a_pAsn1Core)    ( (a_pAsn1Core)->cbHdr + (a_pAsn1Core)->cb )
+
+/**
+ * Retrievs the tag or implicit tag depending on the RTASN1CORE_F_TAG_IMPLICIT
+ * flag.
+ *
+ * @returns The ASN.1 tag of the object.
+ * @param   a_pAsn1Core     The ASN.1 core.
+ */
+#define RTASN1CORE_GET_TAG(a_pAsn1Core)     ( !((a_pAsn1Core)->fFlags & RTASN1CORE_F_TAG_IMPLICIT) ? (a_pAsn1Core)->uTag : (a_pAsn1Core)->uRealTag )
+
+
+DECL_FORCE_INLINE(PRTASN1CORE) RTAsn1Core_GetAsn1Core(PCRTASN1CORE pThis)
+{
+    return (PRTASN1CORE)pThis;
+}
+
+
+DECL_FORCE_INLINE(bool) RTAsn1Core_IsPresent(PCRTASN1CORE pThis)
+{
+    return pThis && RTASN1CORE_IS_PRESENT(pThis);
+}
+
+
+RTDECL(int) RTAsn1Core_InitEx(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass, PCRTASN1COREVTABLE pOps, uint32_t fFlags);
+/**
+ * Initialize the ASN.1 core object representation to a default value.
+ *
+ * @returns VINF_SUCCESS
+ * @param   pAsn1Core       The ASN.1 core.
+ * @param   uTag            The tag number.
+ * @param   fClass          The tag class and flags.
+ */
+RTDECL(int) RTAsn1Core_InitDefault(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass);
+RTDECL(int) RTAsn1Core_CloneContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1Core_CloneNoContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc);
+RTDECL(int) RTAsn1Core_SetTagAndFlags(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass);
+RTDECL(int) RTAsn1Core_ChangeTag(PRTASN1CORE pAsn1Core, uint32_t uTag);
+RTDECL(void) RTAsn1Core_ResetImplict(PRTASN1CORE pThis);
+RTDECL(int) RTAsn1Core_CompareEx(PCRTASN1CORE pLeft, PCRTASN1CORE pRight, bool fIgnoreTagAndClass);
+
+
+/**
+ * Dummy ASN.1 object for use in choices and similar non-sequence structures.
+ *
+ * This allows hooking up destructors, enumerators and such, as well as not
+ * needing custom code for sequence-of / set-of collections.
+ */
+typedef struct RTASN1DUMMY
+{
+    /** Core ASN.1. */
+    RTASN1CORE      Asn1Core;
+} RTASN1DUMMY;
+/** Pointer to a dummy record. */
+typedef RTASN1DUMMY *PRTASN1DUMMY;
+
+
+/**
+ * Initalizes a dummy ASN.1 object.
+ *
+ * @returns VINF_SUCCESS.
+ * @param   pThis               The dummy object.
+ */
+RTDECL(int) RTAsn1Dummy_InitEx(PRTASN1DUMMY pThis);
+
+/**
+ * Standard compliant initalizer.
+ *
+ * @returns VINF_SUCCESS.
+ * @param   pThis               The dummy object.
+ * @param   pAllocator          Ignored.
+ */
+DECLINLINE(int) RTAsn1Dummy_Init(PRTASN1DUMMY pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    return RTAsn1Dummy_InitEx(pThis);
+}
+
+
+/**
+ * ASN.1 sequence core (IPRT representation).
+ */
+typedef struct RTASN1SEQUENCECORE
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+} RTASN1SEQUENCECORE;
+/** Pointer to an ASN.1 sequence core (IPRT representation). */
+typedef RTASN1SEQUENCECORE *PRTASN1SEQUENCECORE;
+/** Pointer to a const ASN.1 sequence core (IPRT representation). */
+typedef RTASN1SEQUENCECORE const *PCRTASN1SEQUENCECORE;
+
+RTDECL(int) RTAsn1SequenceCore_Init(PRTASN1SEQUENCECORE pSeqCore, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SequenceCore_Clone(PRTASN1SEQUENCECORE pSeqCore, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQUENCECORE pSrc);
+
+/**
+ * ASN.1 sequence-of core (IPRT representation).
+ */
+#if 0
+typedef struct RTASN1SEQOFCORE
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+} RTASN1SEQUENCECORE;
+/** Pointer to an ASN.1 sequence-of core (IPRT representation). */
+typedef RTASN1SEQUENCECORE *PRTASN1SEQUENCECORE;
+/** Pointer to a const ASN.1 sequence-of core (IPRT representation). */
+typedef RTASN1SEQUENCECORE const *PCRTASN1SEQUENCECORE;
+#else
+# define RTASN1SEQOFCORE        RTASN1SEQUENCECORE
+# define PRTASN1SEQOFCORE       PRTASN1SEQUENCECORE
+# define PCRTASN1SEQOFCORE      PCRTASN1SEQUENCECORE
+#endif
+RTDECL(int) RTAsn1SeqOfCore_Init(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SeqOfCore_Clone(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQOFCORE pSrc);
+
+
+/** Defines the typedefs and prototypes for a generic sequence-of type. */
+#define RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(a_SeqOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) \
+    typedef struct a_SeqOfType \
+    { \
+        /** Sequence core. */ \
+        RTASN1SEQUENCECORE          SeqCore; \
+        /** The array allocation tracker. */ \
+        RTASN1ALLOCATION            Allocation; \
+        /** Items in the array. */ \
+        uint32_t                    cItems; \
+        /** Array.  */ \
+        RT_CONCAT(P,a_ItemType)     paItems; \
+    } a_SeqOfType; \
+    typedef a_SeqOfType *RT_CONCAT(P,a_SeqOfType); \
+    typedef a_SeqOfType const *RT_CONCAT(PC,a_SeqOfType); \
+    RTASN1TYPE_STANDARD_PROTOTYPES(a_SeqOfType, a_DeclMacro, a_ImplExtNm, SeqCore.Asn1Core)
+
+
+/**
+ * ASN.1 set core (IPRT representation).
+ */
+typedef struct RTASN1SETCORE
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+} RTASN1SETCORE;
+/** Pointer to an ASN.1 set core (IPRT representation). */
+typedef RTASN1SETCORE *PRTASN1SETCORE;
+/** Pointer to a const ASN.1 set core (IPRT representation). */
+typedef RTASN1SETCORE const *PCRTASN1SETCORE;
+
+RTDECL(int) RTAsn1SetCore_Init(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SetCore_Clone(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETCORE pSrc);
+
+/**
+ * ASN.1 set-of core (IPRT representation).
+ */
+#if 0
+typedef struct RTASN1SETOFCORE
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+} RTASN1SETUENCECORE;
+/** Pointer to an ASN.1 set-of core (IPRT representation). */
+typedef RTASN1SETUENCECORE *PRTASN1SETUENCECORE;
+/** Pointer to a const ASN.1 set-of core (IPRT representation). */
+typedef RTASN1SETUENCECORE const *PCRTASN1SETUENCECORE;
+#else
+# define RTASN1SETOFCORE        RTASN1SETCORE
+# define PRTASN1SETOFCORE       PRTASN1SETCORE
+# define PCRTASN1SETOFCORE      PCRTASN1SETCORE
+#endif
+RTDECL(int) RTAsn1SetOfCore_Init(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable);
+RTDECL(int) RTAsn1SetOfCore_Clone(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETOFCORE pSrc);
+
+
+/** Defines the typedefs and prototypes for a generic set-of type. */
+#define RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(a_SetOfType, a_ItemType, a_DeclMacro, a_ImplExtNm) \
+    typedef struct a_SetOfType \
+    { \
+        /** Set core. */ \
+        RTASN1SETCORE               SetCore; \
+        /** The array allocation tracker. */ \
+        RTASN1ALLOCATION            Allocation; \
+        /** Items in the array. */ \
+        uint32_t                    cItems; \
+        /** Array.  */ \
+        RT_CONCAT(P,a_ItemType)     paItems; \
+    } a_SetOfType; \
+    typedef a_SetOfType *RT_CONCAT(P,a_SetOfType); \
+    typedef a_SetOfType const *RT_CONCAT(PC,a_SetOfType); \
+    RTASN1TYPE_STANDARD_PROTOTYPES(a_SetOfType, a_DeclMacro, a_ImplExtNm, SetCore.Asn1Core)
+
+
+/*
+ * Declare sets and sequences of the core structure.
+ */
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFCORES, RTASN1CORE, RTDECL, RTAsn1SeqOfCores);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFCORES, RTASN1CORE, RTDECL, RTAsn1SetOfCores);
+
+
+/**
+ * ASN.1 null (IPRT representation).
+ */
+typedef struct RTASN1NULL
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+} RTASN1NULL;
+/** Pointer to an ASN.1 null (IPRT representation). */
+typedef RTASN1NULL *PRTASN1NULL;
+/** Pointer to a const ASN.1 null (IPRT representation). */
+typedef RTASN1NULL const *PCRTASN1NULL;
+/** The Vtable for a RTASN1NULL structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Null_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1NULL, RTDECL, RTAsn1Null, Asn1Core);
+
+
+/**
+ * ASN.1 integer (IPRT representation).
+ */
+typedef struct RTASN1INTEGER
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE      Asn1Core;
+    /** The unsigned C representation of the 64 least significant bits.
+     * @note A ASN.1 integer doesn't define signed/unsigned and can have any
+     *       length you like.  Thus, the user needs to check the size and
+     *       preferably use the access APIs for signed numbers. */
+    RTUINT64U       uValue;
+} RTASN1INTEGER;
+/** Pointer to an ASN.1 integer (IPRT representation). */
+typedef RTASN1INTEGER *PRTASN1INTEGER;
+/** Pointer to a const ASN.1 integer (IPRT representation). */
+typedef RTASN1INTEGER const *PCRTASN1INTEGER;
+/** The Vtable for a RTASN1INTEGER structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Integer_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1INTEGER, RTDECL, RTAsn1Integer, Asn1Core);
+
+/**
+ * Initializes an interger object to a default value.
+ * @returns VINF_SUCCESS.
+ * @param   pBoolean            The integer object representation.
+ * @param   uValue              The default value (unsigned 64-bit).
+ * @param   pAllocator          The allocator (pro forma).
+ */
+RTDECL(int) RTAsn1Integer_InitDefault(PRTASN1INTEGER pInteger, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTDECL(int) RTAsn1Integer_InitU64(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Get the most significat bit that's set (1).
+ *
+ * @returns 0-base bit number, -1 if all clear.
+ * @param   pInteger            The integer to check.
+ */
+RTDECL(int32_t) RTAsn1Integer_UnsignedLastBit(PCRTASN1INTEGER pInteger);
+
+/**
+ * Compares two ASN.1 unsigned integers.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pLeft               The first ASN.1 integer.
+ * @param   pRight              The second ASN.1 integer.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight);
+
+/**
+ * Compares an ASN.1 unsigned integer with a uint64_t.
+ *
+ * @returns 0 if equal, -1 if @a pInteger is smaller, 1 if @a pInteger is
+ *          larger.
+ * @param   pInteger            The ASN.1 integer to treat as unsigned.
+ * @param   u64Const            The uint64_t constant to compare with.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU64(PCRTASN1INTEGER pInteger, uint64_t u64Const);
+
+/**
+ * Compares an ASN.1 unsigned integer with a uint32_t.
+ *
+ * @returns 0 if equal, -1 if @a pInteger is smaller, 1 if @a pInteger is
+ *          larger.
+ * @param   pInteger            The ASN.1 integer to treat as unsigned.
+ * @param   u32Const            The uint32_t constant to compare with.
+ * @remarks We don't bother with U16 and U8 variants, just use this instead.
+ */
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU32(PCRTASN1INTEGER pInteger, uint32_t u32Const);
+
+
+/**
+ * Initializes a big integer number from an ASN.1 integer.
+ *
+ * @returns IPRT status code.
+ * @param   pInteger            The ASN.1 integer.
+ * @param   pBigNum             The big integer number structure to initialize.
+ * @param   fBigNumInit         Subset of RTBIGNUMINIT_F_XXX that concerns
+ *                              senitivity, signedness and endianness.
+ */
+RTDECL(int) RTAsn1Integer_ToBigNum(PCRTASN1INTEGER pInteger, PRTBIGNUM pBigNum, uint32_t fBigNumInit);
+RTDECL(int) RTAsn1Integer_FromBigNum(PRTASN1INTEGER pThis, PCRTBIGNUM pBigNum, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SeqOfIntegers);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFINTEGERS, RTASN1INTEGER, RTDECL, RTAsn1SetOfIntegers);
+
+
+
+/**
+ * ASN.1 boolean (IPRT representation).
+ */
+typedef struct RTASN1BOOLEAN
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE                          Asn1Core;
+    /** The boolean value. */
+    bool                                fValue;
+} RTASN1BOOLEAN;
+/** Pointer to the IPRT representation of an ASN.1 boolean. */
+typedef RTASN1BOOLEAN *PRTASN1BOOLEAN;
+/** Pointer to the const IPRT representation of an ASN.1 boolean. */
+typedef RTASN1BOOLEAN const *PCRTASN1BOOLEAN;
+/** The Vtable for a RTASN1BOOLEAN structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Boolean_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1BOOLEAN, RTDECL, RTAsn1Boolean, Asn1Core);
+
+/**
+ * Initializes a boolean object to a default value.
+ * @returns VINF_SUCCESS
+ * @param   pBoolean            The boolean object representation.
+ * @param   fValue              The default value.
+ * @param   pAllocator          The allocator (pro forma).
+ */
+RTDECL(int) RTAsn1Boolean_InitDefault(PRTASN1BOOLEAN pBoolean, bool fValue, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1Boolean_Set(PRTASN1BOOLEAN pThis, bool fValue);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFBOOLEANS, RTASN1BOOLEAN, RTDECL, RTAsn1SeqOfBooleans);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFBOOLEANS, RTASN1BOOLEAN, RTDECL, RTAsn1SetOfBooleans);
+
+
+
+/**
+ * ASN.1 UTC and Generalized Time (IPRT representation).
+ *
+ * The two time types only differs in the precision the render (UTC time being
+ * the one for which you go "WTF were they thinking?!!" for in 2014).
+ */
+typedef struct RTASN1TIME
+{
+    /** The core structure, either ASN1_TAG_UTC_TIME or
+     *  ASN1_TAG_GENERALIZED_TIME. */
+    RTASN1CORE                          Asn1Core;
+    /** The exploded time. */
+    RTTIME                              Time;
+} RTASN1TIME;
+/** Pointer to an IPRT representation of ASN.1 UTC/Generalized time. */
+typedef RTASN1TIME *PRTASN1TIME;
+/** Pointer to a const IPRT representation of ASN.1 UTC/Generalized time. */
+typedef RTASN1TIME const *PCRTASN1TIME;
+/** The Vtable for a RTASN1TIME structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1Time_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1Time, Asn1Core);
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1UtcTime, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1TIME, RTDECL, RTAsn1GeneralizedTime, Asn1Core);
+
+/**
+ * Compares two ASN.1 time values.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pLeft               The first ASN.1 time object.
+ * @param   pTsRight            The second time to compare.
+ */
+RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight);
+
+/** @name Predicate macros for determing the exact type of RTASN1TIME.
+ * @{ */
+/** True if UTC time. */
+#define RTASN1TIME_IS_UTC_TIME(a_pAsn1Time)         ((a_pAsn1Time)->Asn1Core.uTag == ASN1_TAG_UTC_TIME)
+/** True if generalized time. */
+#define RTASN1TIME_IS_GENERALIZED_TIME(a_pAsn1Time) ((a_pAsn1Time)->Asn1Core.uTag == ASN1_TAG_GENERALIZED_TIME)
+/** @}  */
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFTIMES, RTASN1TIME, RTDECL, RTAsn1SeqOfTimes);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFTIMES, RTASN1TIME, RTDECL, RTAsn1SetOfTimes);
+
+
+
+/**
+ * ASN.1 object identifier (IPRT representation).
+ */
+typedef struct RTASN1OBJID
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE          Asn1Core;
+    /** Coverning the paComponents memory allocation if there isn't enough room in
+     * szObjId for both the dottet string and the component values. */
+    RTASN1ALLOCATION    Allocation;
+    /** Pointer to an array with the component values.
+     * This may point within szObjId if there is enough space for both there. */
+    uint32_t const     *pauComponents;
+    /** The number of components in the object identifier.
+     * This ASSUMES that nobody will be ever needing more than 255 components.  */
+    uint8_t             cComponents;
+    /** The dotted string representation of the object identifier.
+     * If there is sufficient space after the string, we will place the array that
+     * paComponents points to here and/or the raw content bytes (Asn1Core.uData).
+     *
+     * An analysis of dumpasn1.cfg, hl7.org and our own _OID defines indicates
+     * that we need space for at least 10 components and 30-something chars.  We've
+     * allocated 87 bytes, which we ASSUME should be enough for everyone. */
+    char                szObjId[87];
+} RTASN1OBJID;
+/** Pointer to an ASN.1 object identifier representation. */
+typedef RTASN1OBJID *PRTASN1OBJID;
+/** Pointer to a const ASN.1 object identifier representation. */
+typedef RTASN1OBJID const *PCRTASN1OBJID;
+/** The Vtable for a RTASN1OBJID structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1ObjId_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OBJID, RTDECL, RTAsn1ObjId, Asn1Core);
+
+RTDECL(int) RTAsn1ObjId_InitFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares an ASN.1 object identifier with a dotted object identifier string.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pThis               The ASN.1 object identifier.
+ * @param   pszRight            The dotted object identifier string.
+ */
+RTDECL(int) RTAsn1ObjId_CompareWithString(PCRTASN1OBJID pThis, const char *pszRight);
+
+/**
+ * Checks if an ASN.1 object identifier starts with the given dotted object
+ * identifier string.
+ *
+ * The matching is only successful if the given string matches matches the last
+ * component completely.
+ *
+ * @returns true / false.
+ * @param   pThis               The ASN.1 object identifier.
+ * @param   pszStartsWith       The dotted object identifier string.
+ */
+RTDECL(bool) RTAsn1ObjId_StartsWith(PCRTASN1OBJID pThis, const char *pszStartsWith);
+
+RTDECL(uint8_t) RTAsn1ObjIdCountComponents(PCRTASN1OBJID pThis);
+RTDECL(uint32_t) RTAsn1ObjIdGetComponentsAsUInt32(PCRTASN1OBJID pThis, uint8_t iComponent);
+RTDECL(uint32_t) RTAsn1ObjIdGetLastComponentsAsUInt32(PCRTASN1OBJID pThis);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFOBJIDS, RTASN1OBJID, RTDECL, RTAsn1SeqOfObjIds);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFOBJIDS, RTASN1OBJID, RTDECL, RTAsn1SetOfObjIds);
+
+
+/**
+ * ASN.1 bit string (IPRT representation).
+ */
+typedef struct RTASN1BITSTRING
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE          Asn1Core;
+    /** The number of bits. */
+    uint32_t            cBits;
+    /** The max number of bits (given at decoding / construction). */
+    uint32_t            cMaxBits;
+    /** Pointer to the bits. */
+    RTCPTRUNION         uBits;
+    /** Pointer to user structure encapsulated in this string, if dynamically
+     * allocated the EncapsulatedAllocation member can be used to track it and
+     * trigger automatic cleanup on object destruction.  If EncapsulatedAllocation
+     * is zero, any object pointed to will only be deleted. */
+    PRTASN1CORE         pEncapsulated;
+    /** Allocation tracking structure for pEncapsulated. */
+    RTASN1ALLOCATION    EncapsulatedAllocation;
+} RTASN1BITSTRING;
+/** Pointer to the IPRT representation of an ASN.1 bit string. */
+typedef RTASN1BITSTRING *PRTASN1BITSTRING;
+/** Pointer to the const IPRT representation of an ASN.1 bit string. */
+typedef RTASN1BITSTRING const *PCRTASN1BITSTRING;
+/** The Vtable for a RTASN1BITSTRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1BitString_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1BITSTRING, RTDECL, RTAsn1BitString, Asn1Core);
+
+/**
+ * Calculates pointer to the first bit.
+ *
+ * @returns Byte pointer to the first bit.
+ * @param   a_pBitString    The ASN.1 bit string.
+ */
+#define RTASN1BITSTRING_GET_BIT0_PTR(a_pBitString)  ( &(a_pBitString)->Asn1Core.uData.pu8[1] )
+
+/**
+ * Calculates the size in bytes.
+ *
+ * @returns Rounded up size in bytes.
+ * @param   a_pBitString    The ASN.1 bit string.
+ */
+#define RTASN1BITSTRING_GET_BYTE_SIZE(a_pBitString)  ( ((a_pBitString)->cBits + 7U) >> 3 )
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1Ex(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pThis,
+                                         const char *pszErrorTag);
+RTDECL(uint64_t) RTAsn1BitString_GetAsUInt64(PCRTASN1BITSTRING pThis);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFBITSTRINGS, RTASN1BITSTRING, RTDECL, RTAsn1SeqOfBitStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFBITSTRINGS, RTASN1BITSTRING, RTDECL, RTAsn1SetOfBitStrings);
+
+
+/**
+ * ASN.1 octet string (IPRT representation).
+ */
+typedef struct RTASN1OCTETSTRING
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE          Asn1Core;
+    /** Pointer to user structure encapsulated in this string, if dynamically
+     * allocated the EncapsulatedAllocation member can be used to track it and
+     * trigger automatic cleanup on object destruction.  If EncapsulatedAllocation
+     * is zero, any object pointed to will only be deleted. */
+    PRTASN1CORE         pEncapsulated;
+    /** Allocation tracking structure for pEncapsulated. */
+    RTASN1ALLOCATION    EncapsulatedAllocation;
+} RTASN1OCTETSTRING;
+/** Pointer to the IPRT representation of an ASN.1 octet string. */
+typedef RTASN1OCTETSTRING *PRTASN1OCTETSTRING;
+/** Pointer to the const IPRT representation of an ASN.1 octet string. */
+typedef RTASN1OCTETSTRING const *PCRTASN1OCTETSTRING;
+/** The Vtable for a RTASN1OCTETSTRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1OctetString_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1OCTETSTRING, RTDECL, RTAsn1OctetString, Asn1Core);
+
+RTDECL(int) RTAsn1OctetStringCompare(PCRTASN1OCTETSTRING pLeft, PCRTASN1OCTETSTRING pRight);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFOCTETSTRINGS, RTASN1OCTETSTRING, RTDECL, RTAsn1SeqOfOctetStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFOCTETSTRINGS, RTASN1OCTETSTRING, RTDECL, RTAsn1SetOfOctetStrings);
+
+
+/**
+ * ASN.1 string (IPRT representation).
+ * All char string types except 'character string (29)'.
+ */
+typedef struct RTASN1STRING
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE          Asn1Core;
+    /** Allocation tracking for pszUtf8. */
+    RTASN1ALLOCATION    Allocation;
+    /** If conversion to UTF-8 was requested, we cache that here.  */
+    char const         *pszUtf8;
+    /** The length (chars, not code points) of the above UTF-8 string if
+     * present. */
+    uint32_t            cchUtf8;
+} RTASN1STRING;
+/** Pointer to the IPRT representation of an ASN.1 string. */
+typedef RTASN1STRING *PRTASN1STRING;
+/** Pointer to the const IPRT representation of an ASN.1 string. */
+typedef RTASN1STRING const *PCRTASN1STRING;
+/** The Vtable for a RTASN1STRING structure. */
+extern RTDATADECL(RTASN1COREVTABLE const) g_RTAsn1String_Vtable;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1String, Asn1Core);
+
+/** @name String type predicate macros.
+ * @{ */
+#define RTASN1STRING_IS_NUMERIC(a_pAsn1String)    ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_NUMERIC_STRING )
+#define RTASN1STRING_IS_PRINTABLE(a_pAsn1String)  ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_PRINTABLE_STRING )
+#define RTASN1STRING_IS_T61(a_pAsn1String)        ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_T61_STRING )
+#define RTASN1STRING_IS_VIDEOTEX(a_pAsn1String)   ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_VIDEOTEX_STRING )
+#define RTASN1STRING_IS_VISIBLE(a_pAsn1String)    ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_VISIBLE_STRING )
+#define RTASN1STRING_IS_IA5(a_pAsn1String)        ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_IA5_STRING )
+#define RTASN1STRING_IS_GRAPHIC(a_pAsn1String)    ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_GRAPHIC_STRING )
+#define RTASN1STRING_IS_GENERAL(a_pAsn1String)    ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_GENERAL_STRING )
+/** UTF-8. */
+#define RTASN1STRING_IS_UTF8(a_pAsn1String)       ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_UTF8_STRING )
+/** UCS-2. */
+#define RTASN1STRING_IS_BMP(a_pAsn1String)        ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_BMP_STRING )
+/** UCS-4. */
+#define RTASN1STRING_IS_UNIVERSAL(a_pAsn1String)  ( RTASN1CORE_GET_TAG(&(a_pAsn1String)->Asn1Core) == ASN1_TAG_UNIVERSAL_STRING )
+/** @}  */
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1NumericString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1PrintableString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1T61String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1VideoTexString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1VisibleString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1Ia5String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1GraphicString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1GeneralString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1Utf8String, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1BmpString, Asn1Core);
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1STRING, RTDECL, RTAsn1UniversalString, Asn1Core);
+
+RTDECL(int) RTAsn1String_InitWithValue(PRTASN1STRING pThis, const char *pszUtf8Value, PCRTASN1ALLOCATORVTABLE pAllocator);
+RTDECL(int) RTAsn1String_InitEx(PRTASN1STRING pThis, uint32_t uTag, void const *pvValue, size_t cbValue,
+                                PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares two strings values, extended version.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pLeft               The first string.
+ * @param   pRight              The second string.
+ * @param   fTypeToo            Set if the string types must match, false if
+ *                              not.
+ */
+RTDECL(int) RTAsn1String_CompareEx(PCRTASN1STRING pLeft, PCRTASN1STRING pRight, bool fTypeToo);
+
+/**
+ * Compares a ASN.1 string object with an UTF-8 string.
+ *
+ * @returns 0 if equal, -1 if @a pThis is smaller, 1 if @a pThis is larger.
+ * @param   pThis               The ASN.1 string object.
+ * @param   pszString           The UTF-8 string.
+ * @param   cchString           The length of @a pszString, or RTSTR_MAX.
+ */
+RTDECL(int) RTAsn1String_CompareWithString(PCRTASN1STRING pThis, const char *pszString, size_t cchString);
+
+/**
+ * Queries the UTF-8 length of an ASN.1 string object.
+ *
+ * This differs from RTAsn1String_QueryUtf8 in that it won't need to allocate
+ * memory for the converted string, but just calculates the length.
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The ASN.1 string object.
+ * @param   pcch                Where to return the string length.
+ */
+RTDECL(int) RTAsn1String_QueryUtf8Len(PCRTASN1STRING pThis, size_t *pcch);
+
+/**
+ * Queries the UTF-8 string for an ASN.1 string object.
+ *
+ * This may fail as it may require memory to be allocated for storing the
+ * string.
+ *
+ * @returns IPRT status code.
+ * @param   pString             The ASN.1 string object.  This is a const
+ *                              parameter for making life easier on the caller,
+ *                              however be aware that the object may be modified
+ *                              by this call!
+ * @param   ppsz                Where to return the pointer to the UTF-8 string.
+ *                              Optional.
+ * @param   pcch                Where to return the length (in 8-bit chars) to
+ *                              of the UTF-8 string. Optional.
+ */
+RTDECL(int) RTAsn1String_QueryUtf8(PCRTASN1STRING pString, const char **ppsz, size_t *pcch);
+RTDECL(int) RTAsn1String_RecodeAsUtf8(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTASN1SEQOFSTRINGS, RTASN1STRING, RTDECL, RTAsn1SeqOfStrings);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTASN1SETOFSTRINGS, RTASN1STRING, RTDECL, RTAsn1SetOfStrings);
+
+
+
+/**
+ * ASN.1 generic context specific tag (IPRT representation).
+ *
+ * Normally used to tag something that's optional, version specific or such.
+ *
+ * For the purpose of documenting the format with typedefs as well as possibly
+ * making it a little more type safe, there's a set of typedefs for the most
+ * commonly used tag values defined.  These typedefs have are identical to
+ * RTASN1CONTEXTTAG, except from the C++ type system of view.
+ * tag values.  These
+ */
+typedef struct RTASN1CONTEXTTAG
+{
+    /** Core ASN.1 encoding details. */
+    RTASN1CORE                          Asn1Core;
+} RTASN1CONTEXTTAG;
+/** Pointer to an ASN.1 context tag (IPRT thing). */
+typedef RTASN1CONTEXTTAG *PRTASN1CONTEXTTAG;
+/** Pointer to a const ASN.1 context tag (IPRT thing). */
+typedef RTASN1CONTEXTTAG const *PCRTASN1CONTEXTTAG;
+
+RTDECL(int) RTAsn1ContextTagN_Init(PRTASN1CONTEXTTAG pThis, uint32_t uTag);
+RTDECL(int) RTAsn1ContextTagN_Clone(PRTASN1CONTEXTTAG pThis, PCRTASN1CONTEXTTAG pSrc, uint32_t uTag);
+
+
+/** @internal  */
+#define RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(a_uTag) \
+    typedef struct RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) { RTASN1CORE Asn1Core; } RT_CONCAT(RTASN1CONTEXTTAG,a_uTag); \
+    typedef RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) *RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag); \
+    DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Init)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pThis, \
+                                                              PCRTASN1ALLOCATORVTABLE pAllocator) \
+    {   return RTAsn1ContextTagN_Init((PRTASN1CONTEXTTAG)pThis, a_uTag); } \
+    DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,_Clone)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pThis, \
+                                                               RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) const *pSrc) \
+    {   return RTAsn1ContextTagN_Clone((PRTASN1CONTEXTTAG)pThis, (PCRTASN1CONTEXTTAG)pSrc, a_uTag); } \
+    typedef RT_CONCAT(RTASN1CONTEXTTAG,a_uTag) const *RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag)
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(0);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(1);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(2);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(3);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(4);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(5);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(6);
+RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE(7);
+#undef RTASN1CONTEXTTAG_DO_TYPEDEF_AND_INLINE
+
+/** Helper for comparing optional context tags.
+ * This will return if both are not present or if their precense differs.
+ * @internal */
+#define RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, a_uTag) \
+    do { \
+        /* type checks */ \
+        RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag) const pMyLeftInternal  = (a_pLeft); \
+        RT_CONCAT(PCRTASN1CONTEXTTAG,a_uTag) const pMyRightInternal = (a_pRight); \
+        (a_iDiff) = (int)RTASN1CORE_IS_PRESENT(&pMyLeftInternal->Asn1Core) \
+                  - (int)RTASN1CORE_IS_PRESENT(&pMyRightInternal->Asn1Core); \
+        if ((a_iDiff) || !RTASN1CORE_IS_PRESENT(&pMyLeftInternal->Asn1Core)) return iDiff; \
+    } while (0)
+
+/** Helpers for comparing optional context tags.
+ * This will return if both are not present or if their precense differs.
+ * @{ */
+#define RTASN1CONTEXTTAG0_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 0)
+#define RTASN1CONTEXTTAG1_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 1)
+#define RTASN1CONTEXTTAG2_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 2)
+#define RTASN1CONTEXTTAG3_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 3)
+#define RTASN1CONTEXTTAG4_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 4)
+#define RTASN1CONTEXTTAG5_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 5)
+#define RTASN1CONTEXTTAG6_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 6)
+#define RTASN1CONTEXTTAG7_COMPARE_PRESENT_RETURN(a_iDiff, a_pLeft, a_pRight) RTASN1CONTEXTTAG_COMPARE_PRESENT_RETURN_INTERNAL(a_iDiff, a_pLeft, a_pRight, 7)
+/** @} */
+
+
+/**
+ * Type information for dynamically bits (see RTASN1DYNTYPE).
+ */
+typedef enum RTASN1TYPE
+{
+    /** Invalid zero value. */
+    RTASN1TYPE_INVALID = 0,
+    /** Not present. */
+    RTASN1TYPE_NOT_PRESENT,
+    /** Generic ASN.1 for unknown tag/class. */
+    RTASN1TYPE_CORE,
+    /** ASN.1 NULL. */
+    RTASN1TYPE_NULL,
+    /** ASN.1 integer. */
+    RTASN1TYPE_INTEGER,
+    /** ASN.1 boolean. */
+    RTASN1TYPE_BOOLEAN,
+    /** ASN.1 character string. */
+    RTASN1TYPE_STRING,
+    /** ASN.1 octet string. */
+    RTASN1TYPE_OCTET_STRING,
+    /** ASN.1 bite string. */
+    RTASN1TYPE_BIT_STRING,
+    /** ASN.1 UTC or Generalize time. */
+    RTASN1TYPE_TIME,
+#if 0
+    /** ASN.1 sequence core. */
+    RTASN1TYPE_SEQUENCE_CORE,
+    /** ASN.1 set core. */
+    RTASN1TYPE_SET_CORE,
+#endif
+    /** ASN.1 object identifier. */
+    RTASN1TYPE_OBJID,
+    /** End of valid types. */
+    RTASN1TYPE_END,
+    /** Type size hack. */
+    RTASN1TYPE_32BIT_HACK = 0x7fffffff
+} RTASN1TYPE;
+
+
+/**
+ * ASN.1 dynamic type record.
+ */
+typedef struct RTASN1DYNTYPE
+{
+    /** Alternative interpretation provided by a user.
+     * Before destroying this object, the user must explicitly free this and set
+     * it to NULL, otherwise there will be memory leaks. */
+    PRTASN1CORE                         pUser;
+    /** The type of data we've got here. */
+    RTASN1TYPE                          enmType;
+    /** Union with data of the type dictated by enmType. */
+    union
+    {
+        /** RTASN1TYPE_CORE. */
+        RTASN1CORE                      Core;
+        /** RTASN1TYPE_NULL. */
+        RTASN1NULL                      Asn1Null;
+        /** RTASN1TYPE_INTEGER. */
+        RTASN1INTEGER                   Integer;
+        /** RTASN1TYPE_BOOLEAN. */
+        RTASN1BOOLEAN                   Boolean;
+        /** RTASN1TYPE_STRING. */
+        RTASN1STRING                    String;
+        /** RTASN1TYPE_OCTET_STRING. */
+        RTASN1OCTETSTRING               OctetString;
+        /** RTASN1TYPE_BIT_STRING. */
+        RTASN1BITSTRING                 BitString;
+        /** RTASN1TYPE_TIME. */
+        RTASN1TIME                      Time;
+#if 0
+        /** RTASN1TYPE_SEQUENCE_CORE. */
+        RTASN1SEQUENCECORE              SeqCore;
+        /** RTASN1TYPE_SET_CORE. */
+        RTASN1SETCORE                   SetCore;
+#endif
+        /** RTASN1TYPE_OBJID. */
+        RTASN1OBJID                     ObjId;
+    } u;
+} RTASN1DYNTYPE;
+/** Pointer to an ASN.1 dynamic type record. */
+typedef RTASN1DYNTYPE *PRTASN1DYNTYPE;
+/** Pointer to a const ASN.1 dynamic type record. */
+typedef RTASN1DYNTYPE const *PCRTASN1DYNTYPE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTASN1DYNTYPE, RTDECL, RTAsn1DynType, u.Core);
+
+
+/** @name Virtual Method Table Based API
+ * @{ */
+/**
+ * Calls the destructor of the ASN.1 object.
+ *
+ * @param   pAsn1Core           The IPRT representation of an ASN.1 object.
+ */
+RTDECL(void) RTAsn1VtDelete(PRTASN1CORE pThisCore);
+
+/**
+ * Deep enumeration of all descendants.
+ *
+ * @returns IPRT status code, any non VINF_SUCCESS value stems from pfnCallback.
+ * @param   pThisCore       Pointer to the ASN.1 core to enumerate members of.
+ * @param   pfnCallback     The callback.
+ * @param   uDepth          The depth of this object. Children are at +1.
+ * @param   pvUser          Callback user argument.
+ * @param   fDepthFirst     When set, recurse into child objects before calling
+ *                          pfnCallback on then.  When clear, the child object
+ *                          is first
+ */
+RTDECL(int) RTAsn1VtDeepEnum(PRTASN1CORE pThisCore, bool fDepthFirst, uint32_t uDepth,
+                             PFNRTASN1ENUMCALLBACK pfnCallback, void *pvUser);
+
+/**
+ * Clones @a pSrcCore onto @a pThisCore.
+ *
+ * The caller must be sure that @a pSrcCore and @a pThisCore are of the same
+ * types.
+ *
+ * @returns IPRT status code.
+ * @param   pThisCore       Pointer to the ASN.1 core to clone onto.  This shall
+ *                          be uninitialized.
+ * @param   pSrcCore        Pointer to the ASN.1 core to clone.
+ * @param   pAllocator      The allocator to use.
+ */
+RTDECL(int) RTAsn1VtClone(PRTASN1CORE pThisCore, PRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Compares two objects.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @param   pLeftCore       Pointer to the ASN.1 core of the left side object.
+ * @param   pRightCore      Pointer to the ASN.1 core of the right side object.
+ */
+RTDECL(int) RTAsn1VtCompare(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore);
+
+/**
+ * Check sanity.
+ *
+ * A primary criteria is that the object is present and initialized.
+ *
+ * @returns IPRT status code.
+ * @param   pThisCore       Pointer to the ASN.1 core of the object to check out.
+ * @param   fFlags          See RTASN1_CHECK_SANITY_F_XXX.
+ * @param   pszErrInfo      Where to return additional error details. Optional.
+ * @param   pszErrorTag     Tag for the additional error details.
+ */
+RTDECL(int) RTAsn1VtCheckSanity(PCRTASN1CORE pThisCore, uint32_t fFlags,
+                                PRTERRINFO pErrInfo, const char *pszErrorTag);
+/** @}  */
+
+
+/** @defgroup rp_asn1_encode RTAsn1Encode - ASN.1 Encoding
+ * @{ */
+
+/** @name RTASN1ENCODE_F_XXX
+ *  @{ */
+/** Use distinguished encoding rules (DER) to encode the object. */
+#define RTASN1ENCODE_F_DER          UINT32_C(0x00000001)
+/** Use base encoding rules (BER) to encode the object.
+ * This is currently the same as DER for practical reasons. */
+#define RTASN1ENCODE_F_BER          RTASN1ENCODE_F_DER
+/** Mask of valid encoding rules.  */
+#define RTASN1ENCODE_F_RULE_MASK    UINT32_C(0x00000007)
+/** @} */
+
+
+/**
+ * Recalculates cbHdr of and ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @retval  VINF_ASN1_NOT_ENCODED if the header size is zero (default value,
+ *          whatever).
+ * @param   pAsn1Core           The object in question.
+ * @param   fFlags              Valid combination of the RTASN1ENCODE_F_XXX
+ *                              flags.  Must include the encoding type.
+ * @param   pErrInfo            Extended error info. Optional.
+ */
+RTDECL(int) RTAsn1EncodeRecalcHdrSize(PRTASN1CORE pAsn1Core, uint32_t fFlags, PRTERRINFO pErrInfo);
+
+/**
+ * Prepares the ASN.1 structure for encoding.
+ *
+ * The preparations is mainly calculating accurate object size, but may also
+ * involve operations like recoding internal UTF-8 strings to the actual ASN.1
+ * format and other things that may require memory to allocated/reallocated.
+ *
+ * @returns IPRT status code
+ * @param   pRoot               The root of the ASN.1 object tree to encode.
+ * @param   fFlags              Valid combination of the RTASN1ENCODE_F_XXX
+ *                              flags.  Must include the encoding type.
+ * @param   pcbEncoded          Where to return the encoded size. Optional.
+ * @param   pErrInfo            Where to store extended error information.
+ *                              Optional.
+ */
+RTDECL(int) RTAsn1EncodePrepare(PRTASN1CORE pRoot, uint32_t fFlags, uint32_t *pcbEncoded, PRTERRINFO pErrInfo);
+
+/**
+ * Encodes and writes the header of an ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @retval  VINF_ASN1_NOT_ENCODED if nothing was written (default value,
+ *          whatever).
+ * @param   pAsn1Core           The object in question.
+ * @param   fFlags              Valid combination of the RTASN1ENCODE_F_XXX
+ *                              flags.  Must include the encoding type.
+ * @param   pfnWriter           The output writer callback.
+ * @param   pvUser              The user argument to pass to @a pfnWriter.
+ * @param   pErrInfo            Where to store extended error information.
+ *                              Optional.
+ */
+RTDECL(int) RTAsnEncodeWriteHeader(PCRTASN1CORE pAsn1Core, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+                                   PRTERRINFO pErrInfo);
+
+/**
+ * Prepares the ASN.1 structure for encoding.
+ *
+ * The preparations is mainly calculating accurate object size, but may also
+ * involve operations like recoding internal UTF-8 strings to the actual ASN.1
+ * format and other things that may require memory to allocated/reallocated.
+ *
+ * @returns IPRT status code
+ * @param   pRoot               The root of the ASN.1 object tree to encode.
+ * @param   fFlags              Valid combination of the RTASN1ENCODE_F_XXX
+ *                              flags.  Must include the encoding type.
+ * @param   pfnWriter           The output writer callback.
+ * @param   pvUser              The user argument to pass to @a pfnWriter.
+ * @param   pErrInfo            Where to store extended error information.
+ *                              Optional.
+ */
+RTDECL(int) RTAsn1EncodeWrite(PCRTASN1CORE pRoot, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+                              PRTERRINFO pErrInfo);
+
+/** @} */
+
+
+
+/** @defgroup rp_asn1_cursor RTAsn1Cursor - BER, DER, and CER cursor
+ * @{ */
+
+/**
+ * ASN.1 decoder byte cursor.
+ */
+typedef struct RTASN1CURSOR
+{
+    /** Pointer to the current (next) byte.  */
+    uint8_t const              *pbCur;
+    /** Number of bytes left to decode. */
+    uint32_t                    cbLeft;
+    /** RTASN1CURSOR_FLAGS_XXX.  */
+    uint32_t                    fFlags;
+    /** Pointer to the primary cursor. */
+    struct RTASN1CURSORPRIMARY *pPrimary;
+    /** Pointer to the parent cursor. */
+    struct RTASN1CURSOR        *pUp;
+    /** The error tag for this cursor level. */
+    const char                 *pszErrorTag;
+} RTASN1CURSOR;
+
+/** @name RTASN1CURSOR_FLAGS_XXX - Cursor flags.
+ * @{ */
+/** Enforce DER rules. */
+#define RTASN1CURSOR_FLAGS_DER      RT_BIT(1)
+/** Enforce CER rules. */
+#define RTASN1CURSOR_FLAGS_CER      RT_BIT(2)
+/** @} */
+
+
+typedef struct RTASN1CURSORPRIMARY
+{
+    /** The normal cursor bits. */
+    RTASN1CURSOR                Cursor;
+    /** For error reporting. */
+    PRTERRINFO                  pErrInfo;
+    /** The allocator virtual method table. */
+    PCRTASN1ALLOCATORVTABLE     pAllocator;
+} RTASN1CURSORPRIMARY;
+typedef RTASN1CURSORPRIMARY *PRTASN1CURSORPRIMARY;
+
+
+/**
+ * Initializes a primary cursor.
+ *
+ * The primary cursor is special in that it stores information shared with the
+ * sub-cursors created by methods like RTAsn1CursorGetContextTagNCursor and
+ * RTAsn1CursorGetSequenceCursor.  Even if just sharing a few items at present,
+ * it still important to save every possible byte since stack space is scarce in
+ * some of the execution environments.
+ *
+ * @returns Pointer to pCursor->Cursor.
+ * @param   pPrimaryCursor      The primary cursor structure to initialize.
+ * @param   pvFirst             The first byte to decode.
+ * @param   cb                  The number of bytes to decode.
+ * @param   pErrInfo            Where to store error information.
+ * @param   pAllocator          The allocator to use.
+ * @param   fFlags              RTASN1CURSOR_FLAGS_XXX.
+ * @param   pszErrorTag         The primary error tag.
+ */
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitPrimary(PRTASN1CURSORPRIMARY pPrimaryCursor, void const *pvFirst, uint32_t cb,
+                                              PRTERRINFO pErrInfo, PCRTASN1ALLOCATORVTABLE pAllocator, uint32_t fFlags,
+                                              const char *pszErrorTag);
+
+
+/**
+ * Initialize a sub-cursor for traversing the content of an ASN.1 object.
+ *
+ * @returns @a pChild
+ * @param   pParent             The parent cursor.
+ * @param   pAsn1Core           The ASN.1 object which content we should
+ *                              traverse with the sub-cursor.
+ * @param   pChild              The sub-cursor to initialize.
+ * @param   pszErrorTag         The error tag of the sub-cursor.
+ */
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSubFromCore(PRTASN1CURSOR pParent, PRTASN1CORE pAsn1Core,
+                                                  PRTASN1CURSOR pChild, const char *pszErrorTag);
+
+/**
+ * Initalizes the an allocation structure prior to making an allocation.
+ *
+ * To try unify and optimize memory managment for decoding and in-memory
+ * construction of ASN.1 objects, each allocation has an allocation structure
+ * associated with it.  This stores the allocator and keep statistics for
+ * optimizing array allocations.
+ *
+ * @returns Pointer to the allocator info (for call in alloc parameter).
+ * @param   pCursor             The cursor.
+ * @param   pAllocator          The allocation structure to initialize.
+ */
+RTDECL(PRTASN1ALLOCATION) RTAsn1CursorInitAllocation(PRTASN1CURSOR pCursor, PRTASN1ALLOCATION pAllocation);
+
+
+/**
+ * Wrapper around RTErrInfoSetV.
+ *
+ * @returns @a rc
+ * @param   pCursor             The cursor.
+ * @param   rc                  The return code to return.
+ * @param   pszMsg              Message format string.
+ * @param   ...                 Format arguments.
+ */
+RTDECL(int) RTAsn1CursorSetInfo(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, ...);
+
+/**
+ * Wrapper around RTErrInfoSetV.
+ *
+ * @returns @a rc
+ * @param   pCursor             The cursor.
+ * @param   rc                  The return code to return.
+ * @param   pszMsg              Message format string.
+ * @param   va                  Format arguments.
+ */
+RTDECL(int) RTAsn1CursorSetInfoV(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, va_list va);
+
+/**
+ * Checks that we've reached the end of the data for the cursor.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ */
+RTDECL(int) RTAsn1CursorCheckEnd(PRTASN1CURSOR pCursor);
+
+
+/**
+ * Skips a given number of bytes.
+ *
+ * @returns @a pCursor
+ * @param   pCursor             The cursor.
+ * @param   cb                  The number of bytes to skip.
+ * @internal
+ */
+DECLINLINE(PRTASN1CURSOR) RTAsn1CursorSkip(PRTASN1CURSOR pCursor, uint32_t cb)
+{
+    if (cb <= pCursor->cbLeft)
+    {
+        pCursor->cbLeft -= cb;
+        pCursor->pbCur  += cb;
+    }
+    else
+    {
+        pCursor->pbCur  += pCursor->cbLeft;
+        pCursor->cbLeft  = 0;
+    }
+
+    return pCursor;
+}
+
+/**
+ * Low-level function for reading an ASN.1 header.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   pAsn1Core           The output object core.
+ * @param   pszErrorTag         Error tag.
+ * @internal
+ */
+RTDECL(int) RTAsn1CursorReadHdr(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, const char *pszErrorTag);
+
+/**
+ * Common helper for simple tag matching.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor (for error reporting).
+ * @param   pAsn1Core           The ASN.1 core structure.
+ * @param   uTag                The expected tag.
+ * @param   fClass              The expected class.
+ * @param   fString             Set if it's a string type that shall follow
+ *                              special CER and DER rules wrt to constructed and
+ *                              primitive encoding.
+ * @param   fFlags              The RTASN1CURSOR_GET_F_XXX flags.
+ * @param   pszErrorTag         The error tag.
+ * @param   pszWhat             The type/whatever name.
+ */
+RTDECL(int) RTAsn1CursorMatchTagClassFlagsEx(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+                                             bool fString, uint32_t fFlags, const char *pszErrorTag, const char *pszWhat);
+
+/**
+ * Common helper for simple tag matching.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor (for error reporting).
+ * @param   pAsn1Core           The ASN.1 core structure.
+ * @param   uTag                The expected tag.
+ * @param   fClass              The expected class.
+ * @param   fFlags              The RTASN1CURSOR_GET_F_XXX flags.
+ * @param   pszErrorTag         The error tag.
+ * @param   pszWhat             The type/whatever name.
+ * @internal
+ */
+DECLINLINE(int) RTAsn1CursorMatchTagClassFlags(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+                                               uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+    if (pAsn1Core->uTag == uTag && pAsn1Core->fClass == fClass)
+        return VINF_SUCCESS;
+    return RTAsn1CursorMatchTagClassFlagsEx(pCursor, pAsn1Core, uTag, fClass, false /*fString*/, fFlags, pszErrorTag, pszWhat);
+}
+
+
+/**
+ * Common helper for simple tag matching for strings.
+ *
+ * Check string encoding considerations.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor (for error reporting).
+ * @param   pAsn1Core           The ASN.1 core structure.
+ * @param   uTag                The expected tag.
+ * @param   fClass              The expected class.
+ * @param   fFlags              The RTASN1CURSOR_GET_F_XXX flags.
+ * @param   pszErrorTag         The error tag.
+ * @param   pszWhat             The type/whatever name.
+ * @internal
+ */
+DECLINLINE(int) RTAsn1CursorMatchTagClassFlagsString(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+                                                     uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+    if (pAsn1Core->uTag == uTag && pAsn1Core->fClass == fClass)
+        return VINF_SUCCESS;
+    return RTAsn1CursorMatchTagClassFlagsEx(pCursor, pAsn1Core, uTag, fClass, true /*fString*/, fFlags, pszErrorTag, pszWhat);
+}
+
+
+
+/** @name RTASN1CURSOR_GET_F_XXX - Common flags for all the getters.
+ * @{ */
+/** Used for decoding objects with implicit tags assigned to them.  This only
+ * works when calling getters with a unambigious types. */
+#define RTASN1CURSOR_GET_F_IMPLICIT         RT_BIT_32(0)
+/** @} */
+
+/**
+ * Read ANY object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pAsn1Core           The output object core.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetCore(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pAsn1Core, const char *pszErrorTag);
+
+/**
+ * Read a NULL object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pNull               The output NULL object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetNull(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pNull, const char *pszErrorTag);
+
+/**
+ * Read an INTEGER object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pInteger            The output integer object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetInteger(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pInteger, const char *pszErrorTag);
+
+/**
+ * Read an BOOLEAN object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pBoolean            The output boolean object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBoolean(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pBoolean, const char *pszErrorTag);
+
+/**
+ * Retrives an object identifier (aka ObjId or OID) item from the ASN.1 stream.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pObjId              The output ODI object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId, const char *pszErrorTag);
+
+/**
+ * Retrives and verifies an object identifier.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pObjId              Where to return the parsed object ID, optional.
+ * @param   pszExpectedObjId    The expected object identifier (dotted).
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetAndCheckObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId,
+                                         const char *pszExpectedObjId, const char *pszErrorTag);
+
+/**
+ * Read an UTC TIME or GENERALIZED TIME object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pTime               The output time object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetTime(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pTime, const char *pszErrorTag);
+
+/**
+ * Read an BIT STRING object (skips past the content).
+ *
+ * @returns IPRT status ocde.
+ * @param   pCursor             The cursor.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pBitString          The output bit string object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBitString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pBitString,
+                                     const char *pszErrorTag);
+
+/**
+ * Read an BIT STRING object (skips past the content), extended version with
+ * cMaxBits.
+ *
+ * @returns IPRT status ocde.
+ * @param   pCursor             The cursor.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   cMaxBits            The max length of the bit string in bits.  Pass
+ *                              UINT32_MAX if variable size.
+ * @param   pBitString          The output bit string object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBitStringEx(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pBitString,
+                                       const char *pszErrorTag);
+
+/**
+ * Read an OCTET STRING object (skips past the content).
+ *
+ * @returns IPRT status ocde.
+ * @param   pCursor             The cursor.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pOctetString        The output octet string object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetOctetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pOctetString,
+                                       const char *pszErrorTag);
+
+/**
+ * Read any kind of string object, except 'character string (29)'.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pString             The output boolean object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a IA5 STRING object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pString             The output boolean object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetIa5String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a UTF8 STRING object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pString             The output boolean object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetUtf8String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a BMP STRING (UCS-2) object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pString             The output boolean object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetBmpString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag);
+
+/**
+ * Read a SEQUENCE object and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pSeqCore            The output sequence core object.
+ * @param   pSeqCursor          The output cursor for the sequence content.
+ * @param   pszErrorTag         Error tag, this will be associated with the
+ *                              returned cursor.
+ */
+RTDECL(int) RTAsn1CursorGetSequenceCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                          PRTASN1SEQUENCECORE pSeqCore, PRTASN1CURSOR pSeqCursor, const char *pszErrorTag);
+
+/**
+ * Read a SET object and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pSetCore            The output set core object.
+ * @param   pSetCursor          The output cursor for the set content.
+ * @param   pszErrorTag         Error tag, this will be associated with the
+ *                              returned cursor.
+ */
+RTDECL(int) RTAsn1CursorGetSetCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                     PRTASN1SETCORE pSetCore, PRTASN1CURSOR pSetCursor, const char *pszErrorTag);
+
+/**
+ * Read a given constructed context tag and create a cursor for its content.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pCtxTagCore         The output context tag object.
+ * @param   pCtxTagCursor       The output cursor for the context tag content.
+ * @param   pszErrorTag         Error tag, this will be associated with the
+ *                              returned cursor.
+ *
+ * @remarks There are specialized version of this function for each of the
+ *          numbered context tag structures, like for RTASN1CONTEXTTAG0 there is
+ *          RTAsn1CursorGetContextTag0Cursor.
+ */
+RTDECL(int) RTAsn1CursorGetContextTagNCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uExpectedTag,
+                                             PRTASN1CONTEXTTAG pCtxTag, PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag);
+
+/**
+ * Read a dynamic ASN.1 type.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor we're decoding from.
+ * @param   fFlags              RTASN1CURSOR_GET_F_XXX.
+ * @param   pDynType            The output context tag object.
+ * @param   pszErrorTag         Error tag.
+ */
+RTDECL(int) RTAsn1CursorGetDynType(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag);
+
+/**
+ * Peeks at the next ASN.1 object.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor         The cursore we're decoding from.
+ * @param   pAsn1Core       Where to store the output of the peek.
+ */
+RTDECL(int) RTAsn1CursorPeek(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core);
+
+/**
+ * Checks if the next ASN.1 object matches the given tag and class/flags.
+ *
+ * @returns @c true on match, @c false on mismatch.
+ * @param   pCursor         The cursore we're decoding from.
+ * @param   uTag            The tag number to match against.
+ * @param   fClass          The tag class and flags to match against.
+ */
+RTDECL(bool) RTAsn1CursorIsNextEx(PRTASN1CURSOR pCursor, uint32_t uTag, uint8_t fClass);
+
+
+
+/** @internal  */
+#define RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(a_uTag) \
+    DECLINLINE(int) RT_CONCAT3(RTAsn1CursorGetContextTag,a_uTag,Cursor)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+                                                                        RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pCtxTag, \
+                                                                        PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag) \
+    { /* Constructed is automatically implied if you need a cursor to it. */ \
+        return RTAsn1CursorGetContextTagNCursor(pCursor, fFlags, a_uTag, (PRTASN1CONTEXTTAG)pCtxTag, pCtxTagCursor, pszErrorTag); \
+    } \
+    DECLINLINE(int) RT_CONCAT3(RTAsn1ContextTag,a_uTag,InitDefault)(RT_CONCAT(PRTASN1CONTEXTTAG,a_uTag) pCtxTag) \
+    { /* Constructed is automatically implied if you need to init it with a default value. */ \
+        return RTAsn1Core_InitDefault(&pCtxTag->Asn1Core, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED); \
+    } \
+    DECLINLINE(int)  RT_CONCAT3(RTAsn1CursorIsConstructedContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+    { \
+        return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED); \
+    } \
+    DECLINLINE(int)  RT_CONCAT3(RTAsn1CursorIsPrimitiveContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+    { \
+        return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE); \
+    } \
+    DECLINLINE(int)  RT_CONCAT3(RTAsn1CursorIsAnyContextTag,a_uTag,Next)(PRTASN1CURSOR pCursor) \
+    { \
+        return RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED) \
+            || RTAsn1CursorIsNextEx(pCursor, a_uTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE);\
+    } \
+
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(0)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(1)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(2)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(3)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(4)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(5)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(6)
+RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES(7)
+#undef RTASN1CONTEXTTAG_IMPL_CURSOR_INLINES
+
+
+/**
+ * Checks if the next object is a boolean.
+ *
+ * @returns true / false
+ * @param   pCursor         The cursore we're decoding from.
+ * @remarks May produce error info output on mismatch.
+ */
+DECLINLINE(bool) RTAsn1CursorIsBooleanNext(PRTASN1CURSOR pCursor)
+{
+    return RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_BOOLEAN, ASN1_TAGFLAG_PRIMITIVE | ASN1_TAGCLASS_UNIVERSAL);
+}
+
+
+/**
+ * Checks if the next object is a set.
+ *
+ * @returns true / false
+ * @param   pCursor         The cursore we're decoding from.
+ * @remarks May produce error info output on mismatch.
+ */
+DECLINLINE(bool) RTAsn1CursorIsSetNext(PRTASN1CURSOR pCursor)
+{
+    return RTAsn1CursorIsNextEx(pCursor, ASN1_TAG_SET, ASN1_TAGFLAG_CONSTRUCTED | ASN1_TAGCLASS_UNIVERSAL);
+}
+
+
+/** @} */
+
+
+/** @name ASN.1 Utility APIs
+ * @{ */
+
+/**
+ * Dumps an IPRT representation of a ASN.1 object tree.
+ *
+ * @returns IPRT status code.
+ * @param   pAsn1Core           The ASN.1 object which members should be dumped.
+ * @param   fFlags              RTASN1DUMP_F_XXX.
+ * @param   uLevel              The indentation level to start at.
+ * @param   pfnPrintfV          The output function.
+ * @param   pvUser              Argument to the output function.
+ */
+RTDECL(int) RTAsn1Dump(PCRTASN1CORE pAsn1Core, uint32_t fFlags, uint32_t uLevel, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+
+/** @} */
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/base64.h b/include/iprt/base64.h
index dfbbc13..00cd035 100644
--- a/include/iprt/base64.h
+++ b/include/iprt/base64.h
@@ -48,14 +48,29 @@ RT_C_DECLS_BEGIN
  *
  * @returns The length in bytes. -1 if the encoding is bad.
  *
- * @param   pszString           The Base64 encoded string.
- * @param   ppszEnd             If not NULL, this will point to the first char
- *                              following the Base64 encoded text block. If
- *                              NULL the entire string is assumed to be Base64.
+ * @param   pszString       The Base64 encoded string.
+ * @param   ppszEnd         If not NULL, this will point to the first char
+ *                          following the Base64 encoded text block. If
+ *                          NULL the entire string is assumed to be Base64.
  */
 RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd);
 
 /**
+ * Calculates the decoded data size for a Base64 encoded string.
+ *
+ * @returns The length in bytes. -1 if the encoding is bad.
+ *
+ * @param   pszString       The Base64 encoded string.
+ * @param   cchStringMax    The max length to decode, use RTSTR_MAX if the
+ *                          length of @a pszString is not known and it is
+ *                          really zero terminated.
+ * @param   ppszEnd         If not NULL, this will point to the first char
+ *                          following the Base64 encoded text block. If
+ *                          NULL the entire string is assumed to be Base64.
+ */
+RTDECL(ssize_t) RTBase64DecodedSizeEx(const char *pszString, size_t cchStringMax, char **ppszEnd);
+
+/**
  * Decodes a Base64 encoded string into the buffer supplied by the caller.
  *
  * @returns IPRT status code.
@@ -79,6 +94,33 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd);
 RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd);
 
 /**
+ * Decodes a Base64 encoded string into the buffer supplied by the caller.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_BUFFER_OVERFLOW if the buffer is too small. pcbActual will not
+ *          be set, nor will ppszEnd.
+ * @retval  VERR_INVALID_BASE64_ENCODING if the encoding is wrong.
+ *
+ * @param   pszString       The Base64 string. Whether the entire string or
+ *                          just the start of the string is in Base64 depends
+ *                          on whether ppszEnd is specified or not.
+ * @param   cchStringMax    The max length to decode, use RTSTR_MAX if the
+ *                          length of @a pszString is not known and it is
+ *                          really zero terminated.
+ * @param   pvData          Where to store the decoded data.
+ * @param   cbData          The size of the output buffer that pvData points to.
+ * @param   pcbActual       Where to store the actual number of bytes returned.
+ *                          Optional.
+ * @param   ppszEnd         Indicates that the string may contain other stuff
+ *                          after the Base64 encoded data when not NULL. Will
+ *                          be set to point to the first char that's not part of
+ *                          the encoding. If NULL the entire string must be part
+ *                          of the Base64 encoded data.
+ */
+RTDECL(int) RTBase64DecodeEx(const char *pszString, size_t cchStringMax, void *pvData, size_t cbData,
+                             size_t *pcbActual, char **ppszEnd);
+
+/**
  * Calculates the length of the Base64 encoding of a given number of bytes of
  * data.
  *
diff --git a/include/iprt/bignum.h b/include/iprt/bignum.h
new file mode 100644
index 0000000..784b435
--- /dev/null
+++ b/include/iprt/bignum.h
@@ -0,0 +1,155 @@
+/** @file
+ * IPRT - Big Integer Numbers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___iprt_bignum_h
+#define ___iprt_bignum_h
+
+#include <iprt/types.h>
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rtbignum      RTBigNum - Big Integer Numbers
+ * @ingroup grp_rt
+ * @{
+ */
+
+/** The big integer number element type. */
+typedef uint32_t RTBIGNUMELEMENT;
+/** The size (in bytes) of one array element. */
+#define RTBIGNUM_ELEMENT_SIZE           4
+/** The number of bits in one array element. */
+#define RTBIGNUM_ELEMENT_BITS           (RTBIGNUM_ELEMENT_SIZE * 8)
+/** Returns the bitmask corrsponding to given bit number. */
+#define RTBIGNUM_ELEMENT_BIT(iBit)      RT_BIT_32(iBit)
+
+/**
+ * IPRT big integer number.
+ */
+typedef struct RTBIGNUM
+{
+    /** Elements array where the magnitue of the value is stored.  */
+    RTBIGNUMELEMENT    *pauElements;
+    /** The current number of elements we're using in the pauElements array. */
+    uint32_t            cUsed;
+    /** The current allocation size of pauElements. */
+    uint32_t            cAllocated;
+    /** Reserved for future use. */
+    uint32_t            uReserved;
+
+    /** Set if it's a negative number, clear if positive or zero. */
+    uint32_t            fNegative : 1;
+
+    /** Whether to use a the data is sensitive (RTBIGNUMINIT_F_SENSITIVE). */
+    uint32_t            fSensitive : 1;
+    /** The number is currently scrambled */
+    uint32_t            fCurScrambled : 1;
+
+    /** Bits reserved for future use. */
+    uint32_t            fReserved : 30;
+} RTBIGNUM;
+
+
+RTDECL(int) RTBigNumInit(PRTBIGNUM pBigNum, uint32_t fFlags, void const *pvRaw, size_t cbRaw);
+RTDECL(int) RTBigNumInitZero(PRTBIGNUM pBigNum, uint32_t fFlags);
+
+/** @name RTBIGNUMINIT_F_XXX - RTBigNumInit flags.
+ * @{ */
+/** The number is sensitive so use a safer allocator, scramble it when not
+ * in use, and apply RTMemWipeThoroughly before freeing.  The RTMemSafer API
+ * takes care of these things.
+ * @note When using this flag, concurrent access is not possible! */
+#define RTBIGNUMINIT_F_SENSITIVE        RT_BIT(0)
+/** Big endian number. */
+#define RTBIGNUMINIT_F_ENDIAN_BIG       RT_BIT(1)
+/** Little endian number. */
+#define RTBIGNUMINIT_F_ENDIAN_LITTLE    RT_BIT(2)
+/** The raw number is unsigned. */
+#define RTBIGNUMINIT_F_UNSIGNED         RT_BIT(3)
+/** The raw number is signed. */
+#define RTBIGNUMINIT_F_SIGNED           RT_BIT(4)
+/** @} */
+
+RTDECL(int) RTBigNumClone(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc);
+
+RTDECL(int) RTBigNumDestroy(PRTBIGNUM pBigNum);
+
+
+/**
+ * The minimum number of bits require store the two's complement representation
+ * of the number.
+ *
+ * @returns Width in number of bits.
+ * @param   pBigNum         The big number.
+ */
+RTDECL(uint32_t) RTBigNumBitWidth(PCRTBIGNUM pBigNum);
+RTDECL(uint32_t) RTBigNumByteWidth(PCRTBIGNUM pBigNum);
+
+
+/**
+ * Converts the big number to a sign-extended big endian byte sequence.
+ *
+ * @returns IPRT status code
+ * @retval  VERR_BUFFER_OVERFLOW if the specified buffer is too small.
+ * @param   pBigNum         The big number.
+ * @param   pvBuf           The output buffer (size is at least cbWanted).
+ * @param   cbWanted        The number of bytes wanted.
+ */
+RTDECL(int) RTBigNumToBytesBigEndian(PCRTBIGNUM pBigNum, void *pvBuf, size_t cbWanted);
+
+/**
+ * Compares two numbers.
+ *
+ * @retval  -1 if pLeft < pRight.
+ * @retval  0 if pLeft == pRight.
+ * @retval  1 if pLeft > pRight.
+ *
+ * @param   pLeft           The left side number.
+ * @param   pRight          The right side number.
+ */
+RTDECL(int) RTBigNumCompare(PRTBIGNUM pLeft, PRTBIGNUM pRight);
+RTDECL(int) RTBigNumCompareWithU64(PRTBIGNUM pLeft, uint64_t uRight);
+RTDECL(int) RTBigNumCompareWithS64(PRTBIGNUM pLeft, int64_t iRight);
+
+RTDECL(int) RTBigNumAssign(PRTBIGNUM pDst, PCRTBIGNUM pSrc);
+RTDECL(int) RTBigNumNegate(PRTBIGNUM pResult, PCRTBIGNUM pBigNum);
+RTDECL(int) RTBigNumNegateThis(PRTBIGNUM pThis);
+
+RTDECL(int) RTBigNumAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend);
+RTDECL(int) RTBigNumSubtract(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend);
+RTDECL(int) RTBigNumMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier);
+RTDECL(int) RTBigNumDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor);
+RTDECL(int) RTBigNumModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor);
+RTDECL(int) RTBigNumExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent);
+
+RTDECL(int) RTBigNumModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus);
+
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/cdefs.h b/include/iprt/cdefs.h
index 744fd48..7675afc 100644
--- a/include/iprt/cdefs.h
+++ b/include/iprt/cdefs.h
@@ -1245,16 +1245,27 @@
 /** @def RTDATADECL(type)
  * Runtime Library export or import declaration.
  * Data declared using this macro exists in all contexts.
- * @param   type    The return type of the function declaration.
+ * @param   type    The data type.
+ */
+/** @def RT_DECL_DATA_CONST(type)
+ * Definition of a const variable. See DECL_HIDDEN_CONST.
+ * @param   type    The const data type.
  */
 #if defined(IN_RT_R3) || defined(IN_RT_RC) || defined(IN_RT_R0)
 # ifdef IN_RT_STATIC
-#  define RTDATADECL(type)  DECLHIDDEN(type)
+#  define RTDATADECL(type)          DECLHIDDEN(type)
+#  define RT_DECL_DATA_CONST(type)  DECL_HIDDEN_CONST(type)
 # else
-#  define RTDATADECL(type)  DECLEXPORT(type)
+#  define RTDATADECL(type)          DECLEXPORT(type)
+#  if defined(__cplusplus) && defined(__GNUC__)
+#   define RT_DECL_DATA_CONST(type) type
+#  else
+#   define RT_DECL_DATA_CONST(type) DECLEXPORT(type)
+#  endif
 # endif
 #else
-# define RTDATADECL(type)   DECLIMPORT(type)
+# define RTDATADECL(type)           DECLIMPORT(type)
+# define RT_DECL_DATA_CONST(type)   DECLIMPORT(type)
 #endif
 
 /** @def RT_DECL_CLASS
diff --git a/include/iprt/critsect.h b/include/iprt/critsect.h
index 9dee861..5d93959 100644
--- a/include/iprt/critsect.h
+++ b/include/iprt/critsect.h
@@ -29,7 +29,7 @@
 #include <iprt/cdefs.h>
 #include <iprt/types.h>
 #include <iprt/assert.h>
-#ifdef IN_RING3
+#if defined(IN_RING3) || defined(IN_RING0)
 # include <iprt/thread.h>
 #endif
 #ifdef RT_LOCK_STRICT_ORDER
@@ -107,10 +107,12 @@ AssertCompileSize(RTCRITSECT, HC_ARCH_BITS == 32 ? 32 : 48);
  * The intended use is avoiding lots of conditional code where some component
  * might or might not require entering a critical section before access. */
 #define RTCRITSECT_FLAGS_NOP            UINT32_C(0x00000008)
+/** Indicates that this is a ring-0 critical section. */
+#define RTCRITSECT_FLAGS_RING0          UINT32_C(0x00000010)
 /** @} */
 
 
-#ifdef IN_RING3
+#if defined(IN_RING3) || defined(IN_RING0)
 
 /**
  * Initialize a critical section.
@@ -208,6 +210,8 @@ RTDECL(int) RTCritSectTryEnter(PRTCRITSECT pCritSect);
  */
 RTDECL(int) RTCritSectTryEnterDebug(PRTCRITSECT pCritSect, RTHCUINTPTR uId, RT_SRC_POS_DECL);
 
+#ifdef IN_RING3 /* Crazy APIs: ring-3 only. */
+
 /**
  * Enter multiple critical sections.
  *
@@ -247,6 +251,8 @@ RTDECL(int) RTCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects
  */
 RTDECL(int) RTCritSectEnterMultipleDebug(size_t cCritSects, PRTCRITSECT *papCritSects, RTUINTPTR uId, RT_SRC_POS_DECL);
 
+#endif /* IN_RING3 */
+
 /**
  * Leave a critical section.
  *
@@ -284,7 +290,7 @@ DECLINLINE(bool) RTCritSectIsOwner(PCRTCRITSECT pCritSect)
     return pCritSect->NativeThreadOwner == RTThreadNativeSelf();
 }
 
-#endif /* IN_RING3 */
+#endif /* IN_RING3 || IN_RING0 */
 
 /**
  * Checks the section is owned by anyone.
@@ -454,7 +460,7 @@ AssertCompileSize(RTCRITSECTRW, HC_ARCH_BITS == 32 ? 48 : 64);
 /* #define RTCSRW_WAIT_CNT_WR_MASK    (RTCSRW_CNT_MASK << RTCSRW_WAIT_CNT_WR_SHIFT) */
 /** @} */
 
-#ifdef IN_RING3
+#if defined(IN_RING3) || defined(IN_RING0)
 
 /**
  * Initialize a critical section.
@@ -700,7 +706,7 @@ RTDECL(uint32_t) RTCritSectRwGetWriterReadRecursion(PRTCRITSECTRW pThis);
  */
 RTDECL(uint32_t) RTCritSectRwGetReadCount(PRTCRITSECTRW pThis);
 
-#endif /* IN_RING3 */
+#endif /* IN_RING3 || IN_RING0 */
 
 /**
  * Checks if a critical section is initialized or not.
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/include/iprt/crypto/Makefile.kup
similarity index 100%
copy from src/VBox/Runtime/common/ldr/Makefile.kup
copy to include/iprt/crypto/Makefile.kup
diff --git a/include/iprt/crypto/digest.h b/include/iprt/crypto/digest.h
new file mode 100644
index 0000000..374196b
--- /dev/null
+++ b/include/iprt/crypto/digest.h
@@ -0,0 +1,189 @@
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_digest_h
+#define ___iprt_crypto_digest_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crdigest RTCrDigest - Crypographic Hash / Message Digest API.
+ * @ingroup grp_rt
+ * @{
+ */
+
+/**
+ * Cryptographic hash / message digest provider descriptor.
+ *
+ * This gives the basic details and identifiers of the algorithm as well as
+ * function pointers to the implementation.
+ */
+typedef struct RTCRDIGESTDESC
+{
+    /** The message digest provider name. */
+    const char         *pszName;
+    /** The object ID string. */
+    const char         *pszObjId;
+    /** Pointer to a NULL terminated table of alias object IDs (optional). */
+    const char * const *papszObjIdAliases;
+    /** The IPRT digest type. */
+    RTDIGESTTYPE        enmType;
+    /** The max size of the final hash (binary). */
+    uint32_t            cbHash;
+    /** The size of the state. */
+    uint32_t            cbState;
+    /** Reserved. */
+    uint32_t            uReserved;
+
+    /**
+     * Updates the digest with more data.
+     *
+     * @param   pvState     The opaque message digest state.
+     * @param   pvData      The data to add to the digest.
+     * @param   cbData      The amount of data to add to the digest.
+     */
+    DECLCALLBACKMEMBER(void, pfnUpdate)(void *pvState, const void *pvData, size_t cbData);
+
+    /**
+     * Finalizes the digest calculation.
+     *
+     * @param   pvState     The opaque message digest state.
+     * @param   pbHash      Where to store the output digest.  This buffer is at
+     *                      least RTCRDIGESTDESC::cbHash bytes large.
+     */
+    DECLCALLBACKMEMBER(void, pfnFinal)(void *pvState, uint8_t *pbHash);
+
+    /**
+     * (Re-)Initializes the digest. Optional.
+     *
+     * Optional, RT_BZERO will be used if NULL.
+     *
+     * @returns IPRT status code.
+     * @param   pvState     The opaque message digest state.
+     * @param   pvOpaque    Opaque algortihm specific parameter.
+     * @param   fReInit     Set if this is a re-init call.
+     */
+    DECLCALLBACKMEMBER(int, pfnInit)(void *pvState, void *pvOpaque, bool fReInit);
+
+    /**
+     * Deletes the message digest state.
+     *
+     * Optional, memset will be used if NULL.
+     *
+     * @param   pvState     The opaque message digest state.
+     */
+    DECLCALLBACKMEMBER(void, pfnDelete)(void *pvState);
+
+    /**
+     * Clones the message digest state.
+     *
+     * Optional, memcpy will be used if NULL.
+     *
+     * @returns IPRT status code.
+     * @param   pvState     The opaque message digest state (destination).
+     * @param   pvSrcState  The opaque message digest state to clone (source).
+     */
+    DECLCALLBACKMEMBER(int, pfnClone)(void *pvState, void const *pvSrcState);
+
+    /**
+     * Gets the hash size.
+     *
+     * Optional, if not provided RTCRDIGESTDESC::cbHash will be returned.  If
+     * provided though, RTCRDIGESTDESC::cbHash must be set to the largest possible
+     * hash size.
+     *
+     * @returns The hash size.
+     * @param   pvState     The opaque message digest state.
+     */
+    DECLCALLBACKMEMBER(uint32_t, pfnGetHashSize)(void *pvState);
+
+    /**
+     * Gets the digest type (when enmType is RTDIGESTTYPE_UNKNOWN).
+     *
+     * @returns The hash size.
+     * @param   pvState     The opaque message digest state.
+     */
+    DECLCALLBACKMEMBER(RTDIGESTTYPE, pfnGetDigestType)(void *pvState);
+} RTCRDIGESTDESC;
+/** Pointer to const message digest details and vtable. */
+typedef RTCRDIGESTDESC const *PCRTCRDIGESTDESC;
+
+/**
+ * Finds a cryptographic hash / message digest descriptor by object identifier
+ * string.
+ *
+ * @returns Pointer to the message digest details & vtable if found.  NULL if
+ *          not found.
+ * @param   pszObjId        The dotted object identifier string of the message
+ *                          digest algorithm.
+ * @param   ppvOpaque       Where to return an opaque implementation specfici
+ *                          sub-type indicator that can be passed to
+ *                          RTCrDigestCreate.  This is optional, fewer
+ *                          algortihms are available if not specified.
+ */
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+
+/**
+ * Finds a cryptographic hash / message digest descriptor by object identifier
+ * ASN.1 object.
+ *
+ * @returns Pointer to the message digest details & vtable if found.  NULL if
+ *          not found.
+ * @param   pszObjId        The ASN.1 object ID of the message digest algorithm.
+ * @param   ppvOpaque       Where to return an opaque implementation specfici
+ *                          sub-type indicator that can be passed to
+ *                          RTCrDigestCreate.  This is optional, fewer
+ *                          algortihms are available if not specified.
+ */
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByType(RTDIGESTTYPE enmDigestType);
+RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId);
+RTDECL(int) RTCrDigestCreateByObjId(PRTCRDIGEST phDigest, PCRTASN1OBJID pObjId);
+RTDECL(int) RTCrDigestCreateByType(PRTCRDIGEST phDigest, RTDIGESTTYPE enmDigestType);
+
+
+RTDECL(int) RTCrDigestCreate(PRTCRDIGEST phDigest, PCRTCRDIGESTDESC pDesc, void *pvOpaque);
+RTDECL(int) RTCrDigestClone(PRTCRDIGEST phDigest, RTCRDIGEST hSrc);
+RTDECL(int) RTCrDigestReset(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestRetain(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestRelease(RTCRDIGEST hDigest);
+RTDECL(int) RTCrDigestUpdate(RTCRDIGEST hDigest, void const *pvData, size_t cbData);
+RTDECL(int) RTCrDigestFinal(RTCRDIGEST hDigest, void *pvHash, size_t cbHash);
+RTDECL(bool) RTCrDigestMatch(RTCRDIGEST hDigest, void const *pvHash, size_t cbHash);
+RTDECL(uint8_t const *) RTCrDigestGetHash(RTCRDIGEST hDigest);
+RTDECL(uint32_t) RTCrDigestGetHashSize(RTCRDIGEST hDigest);
+RTDECL(uint64_t) RTCrDigestGetConsumedSize(RTCRDIGEST hDigest);
+RTDECL(bool) RTCrDigestIsFinalized(RTCRDIGEST hDigest);
+RTDECL(RTDIGESTTYPE) RTCrDigestGetType(RTCRDIGEST hDigest);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pem.h b/include/iprt/crypto/pem.h
new file mode 100644
index 0000000..616ffad
--- /dev/null
+++ b/include/iprt/crypto/pem.h
@@ -0,0 +1,133 @@
+/** @file
+ * IPRT - Crypto - PEM-file Reader & Writer.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc  RTCrPem - PEM-file Reader & Writer
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * One PEM marker word (use RT_STR_TUPLE to initialize).
+ */
+typedef struct RTCRPEMMARKERWORD
+{
+    /** The word string. */
+    const char         *pszWord;
+    /** The length. */
+    uint32_t            cchWord;
+} RTCRPEMMARKERWORD;
+/** Pointer to a const marker word. */
+typedef RTCRPEMMARKERWORD const *PCRTCRPEMMARKERWORD;
+
+
+/**
+ * A PEM marker.
+ *
+ * This is an array of words with lengths, optimized for avoid unnecessary
+ * strlen() while searching the file content.  It is ASSUMED that all PEM
+ * section markers starts with either 'BEGIN' or 'END', followed by the words
+ * in the this structure.
+ */
+typedef struct RTCRPEMMARKER
+{
+    /** Pointer to an array of marker words. */
+    PCRTCRPEMMARKERWORD paWords;
+    /** Number of works in the array papszWords points to. */
+    uint32_t            cWords;
+} RTCRPEMMARKER;
+/** Pointer to a const PEM marker. */
+typedef RTCRPEMMARKER const *PCRTCRPEMMARKER;
+
+
+/**
+ * A PEM section.
+ *
+ * The API works on linked lists of these.
+ */
+typedef struct RTCRPEMSECTION
+{
+    /** Pointer to the next file section. */
+    struct RTCRPEMSECTION const *pNext;
+    /** The marker for this section.  NULL if binary file. */
+    PCRTCRPEMMARKER     pMarker;
+    /** Pointer to the binary data. */
+    uint8_t            *pbData;
+    /** The size of the binary data. */
+    size_t              cbData;
+    /** Additional text preceeding the binary data.  NULL if none. */
+    char               *pszPreamble;
+    /** The length of the preamble. */
+    size_t              cchPreamble;
+} RTCRPEMSECTION;
+/** Pointer to a PEM section. */
+typedef RTCRPEMSECTION *PRTCRPEMSECTION;
+/** Pointer to a const PEM section. */
+typedef RTCRPEMSECTION const *PCRTCRPEMSECTION;
+
+
+/**
+ * Frees sections returned by RTCrPemReadFile.
+ * @returns IPRT status code.
+ * @param   pSectionHead        The first section.
+ */
+RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead);
+
+/**
+ * Reads the content of the given file and returns a list of binary sections
+ * found in the file.
+ *
+ * If the file isn't an ASCII file or if no markers were found, the entire file
+ * content is returned as one single section (with pMarker = NULL).
+ *
+ * @returns IPRT status code.
+ * @param   pszFilename     The path to the file to read.
+ * @param   fFlags          Flags reserved for future hacks.
+ * @param   paMarkers       Array of one or more section markers to look for.
+ * @param   cMarkers        Number of markers in the array.
+ * @param   ppSectionHead   Where to return the head of the section list.
+ * @param   pErrInfo        Where to return extend error info. Optional.
+ */
+RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+                            PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pkcs7.h b/include/iprt/crypto/pkcs7.h
new file mode 100644
index 0000000..f7c0681
--- /dev/null
+++ b/include/iprt/crypto/pkcs7.h
@@ -0,0 +1,349 @@
+/** @file
+ * IPRT - PKCS \#7, Cryptographic Message Syntax Standard (aka CMS).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_pkcs7_h
+#define ___iprt_crypto_pkcs7_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crpkcs7 RTCrPkcs7 - PKCS \#7, Cryptographic Message Syntax Standard (aka CMS).
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * PKCS \#7 IssuerAndSerialNumber (IPRT representation).
+ */
+typedef struct RTCRPKCS7ISSUERANDSERIALNUMBER
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The certificate name. */
+    RTCRX509NAME                        Name;
+    /** The certificate serial number. */
+    RTASN1INTEGER                       SerialNumber;
+} RTCRPKCS7ISSUERANDSERIALNUMBER;
+/** Pointer to the IPRT representation of a PKCS \#7 IssuerAndSerialNumber. */
+typedef RTCRPKCS7ISSUERANDSERIALNUMBER *PRTCRPKCS7ISSUERANDSERIALNUMBER;
+/** Pointer to the const IPRT representation of a PKCS \#7
+ * IssuerAndSerialNumber. */
+typedef RTCRPKCS7ISSUERANDSERIALNUMBER const *PCRTCRPKCS7ISSUERANDSERIALNUMBER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7ISSUERANDSERIALNUMBER, RTDECL, RTCrPkcs7IssuerAndSerialNumber, SeqCore.Asn1Core);
+
+
+/**
+ * Attribute value type (for the union).
+ */
+typedef enum RTCRPKCS7ATTRIBUTETYPE
+{
+    /** Zero is invalid. */
+    RTCRPKCS7ATTRIBUTETYPE_INVALID = 0,
+    /** Not present, union is NULL. */
+    RTCRPKCS7ATTRIBUTETYPE_NOT_PRESENT,
+    /** Unknown values, Asn1Core. */
+    RTCRPKCS7ATTRIBUTETYPE_UNKNOWN,
+    /** Object IDs, use ObjId. */
+    RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS,
+    /** Octet strings. */
+    RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS,
+    /** Blow the type up to 32-bits. */
+    RTCRPKCS7ATTRIBUTETYPE_32BIT_HACK = 0x7fffffff
+} RTCRPKCS7ATTRIBUTETYPE;
+
+/**
+ * PKCS \#7 Attribute (IPRT representation).
+ */
+typedef struct RTCRPKCS7ATTRIBUTE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The attribute type (object ID). */
+    RTASN1OBJID                         Type;
+    /** The type of data found in the values union. */
+    RTCRPKCS7ATTRIBUTETYPE              enmType;
+    /** Value allocation. */
+    RTASN1ALLOCATION                    Allocation;
+    /** Values.  */
+    union
+    {
+        /** ASN.1 cores (RTCRPKCS7ATTRIBUTETYPE_UNKNOWN). */
+        PRTASN1SETOFCORES               pCores;
+        /** ASN.1 object identifiers (RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS). */
+        PRTASN1SETOFOBJIDS              pObjIds;
+        /** ASN.1 octet strings (RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS). */
+        PRTASN1SETOFOCTETSTRINGS        pOctetStrings;
+    } uValues;
+} RTCRPKCS7ATTRIBUTE;
+/** Pointer to the IPRT representation of a PKCS \#7 Attribute. */
+typedef RTCRPKCS7ATTRIBUTE *PRTCRPKCS7ATTRIBUTE;
+/** Pointer to the const IPRT representation of a PKCS \#7 Attribute. */
+typedef RTCRPKCS7ATTRIBUTE const *PCRTCRPKCS7ATTRIBUTE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attribute, SeqCore.Asn1Core);
+
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7ATTRIBUTES, RTCRPKCS7ATTRIBUTE, RTDECL, RTCrPkcs7Attributes);
+
+
+/**
+ * One PKCS \#7 SignerInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7SIGNERINFO
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The structure version (RTCRPKCS7SIGNERINFO_V1). */
+    RTASN1INTEGER                       Version;
+    /** The issuer and serial number of the certificate used to produce the
+     * encrypted digest below. */
+    RTCRPKCS7ISSUERANDSERIALNUMBER      IssuerAndSerialNumber;
+    /** The digest algorithm use to digest the signed content. */
+    RTCRX509ALGORITHMIDENTIFIER         DigestAlgorithm;
+    /** Authenticated attributes, optional [0].
+     * @todo Check how other producers formats this. The microsoft one does not
+     *       have explicit tags, but combines it with the SET OF. */
+    RTCRPKCS7ATTRIBUTES                 AuthenticatedAttributes;
+    /** The digest encryption algorithm use to encrypt the digest of the signed
+     * content. */
+    RTCRX509ALGORITHMIDENTIFIER         DigestEncryptionAlgorithm;
+    /** The encrypted digest. */
+    RTASN1OCTETSTRING                   EncryptedDigest;
+    /** Unauthenticated attributes, optional [1].
+     * @todo Check how other producers formats this. The microsoft one does not
+     *       have explicit tags, but combines it with the SET OF. */
+    RTCRPKCS7ATTRIBUTES                 UnauthenticatedAttributes;
+} RTCRPKCS7SIGNERINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 SignerInfo. */
+typedef RTCRPKCS7SIGNERINFO *PRTCRPKCS7SIGNERINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 SignerInfo. */
+typedef RTCRPKCS7SIGNERINFO const *PCRTCRPKCS7SIGNERINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNERINFO, RTDECL, RTCrPkcs7SignerInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRPKCS7SIGNERINFOS, RTCRPKCS7SIGNERINFO, RTDECL, RTCrPkcs7SignerInfos);
+
+/** RTCRPKCS7SIGNERINFO::Version value.  */
+#define RTCRPKCS7SIGNERINFO_V1    1
+
+/** @name PKCS \#9 Attribute IDs
+ * @{ */
+/** Content type (RFC-2630 11.1).
+ * Value: Object Identifier */
+#define RTCR_PKCS9_ID_CONTENT_TYPE_OID      "1.2.840.113549.1.9.3"
+/** Message digest (RFC-2630 11.2).
+ * Value: Octet string. */
+#define RTCR_PKCS9_ID_MESSAGE_DIGEST_OID    "1.2.840.113549.1.9.4"
+/** Signing time (RFC-2630 11.3).
+ * Value: Octet string. */
+#define RTCR_PKCS9_ID_SIGNING_TIME_OID      "1.2.840.113549.1.9.5"
+/** Counter signature (RFC-2630 11.4).
+ * Value: SignerInfo. */
+#define RTCR_PKCS9_ID_COUNTER_SIGNATURE_OID "1.2.840.113549.1.9.6"
+/** @} */
+
+
+/**
+ * PKCS \#7 ContentInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7CONTENTINFO
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Object ID identifying the content below. */
+    RTASN1OBJID                         ContentType;
+    /** Content, optional, explicit tag 0.
+     *
+     * Hack alert! This should've been an explict context tag 0 structure with a
+     * type selected according to ContentType.  However, it's simpler to replace the
+     * explicit context with an OCTET STRING with implict tag 0.  Then we can tag
+     * along on the encapsulation logic RTASN1OCTETSTRING provides for the dynamic
+     * inner type.  The default decoder code will detect known structures as
+     * outlined in the union below, and decode the octet string content as an
+     * anonymous RTASN1CORE if not known.
+     *
+     * If the user want to decode the octet string content differently, it can do so
+     * by destroying and freeing the current encapsulated pointer, replacing it with
+     * it's own.  (Of course following the RTASN1OCTETSTRING rules.)  Just remember
+     * to also update the value in the union.
+     *
+     * @remarks What's signed and verified is Content.pEncapsulated->uData.pv.
+     */
+    RTASN1OCTETSTRING                   Content;
+    /** Same as Content.pEncapsulated, except a choice of known types. */
+    union
+    {
+        /** ContentType is RTCRPKCS7SIGNEDDATA_OID. */
+        struct RTCRPKCS7SIGNEDDATA         *pSignedData;
+        /** ContentType is RTCRSPCINDIRECTDATACONTENT_OID. */
+        struct RTCRSPCINDIRECTDATACONTENT  *pIndirectDataContent;
+        /** Generic / Unknown / User. */
+        PRTASN1CORE                         pCore;
+    } u;
+} RTCRPKCS7CONTENTINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 ContentInfo. */
+typedef RTCRPKCS7CONTENTINFO *PRTCRPKCS7CONTENTINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 ContentInfo. */
+typedef RTCRPKCS7CONTENTINFO const *PCRTCRPKCS7CONTENTINFO;
+
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7CONTENTINFO, RTDECL, RTCrPkcs7ContentInfo, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis);
+
+
+/**
+ * PKCS \#7 SignedData (IPRT representation).
+ */
+typedef struct RTCRPKCS7SIGNEDDATA
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The structure version value (1). */
+    RTASN1INTEGER                       Version;
+    /** The digest algorithms that are used to signed the content (ContentInfo). */
+    RTCRX509ALGORITHMIDENTIFIERS        DigestAlgorithms;
+    /** The content that's being signed. */
+    RTCRPKCS7CONTENTINFO                ContentInfo;
+    /** Certificates, optional, implicit tag 0. (Required by Authenticode.) */
+    RTCRX509CERTIFICATES                Certificates;
+    /** Certificate revocation lists, optional, implicit tag 1.
+     * Not used by Authenticode, so currently stubbed. */
+    RTASN1CORE                          Crls;
+    /** Signer infos. */
+    RTCRPKCS7SIGNERINFOS                SignerInfos;
+} RTCRPKCS7SIGNEDDATA;
+/** Pointer to the IPRT representation of a PKCS \#7 SignedData. */
+typedef RTCRPKCS7SIGNEDDATA *PRTCRPKCS7SIGNEDDATA;
+/** Pointer to the const IPRT representation of a PKCS \#7 SignedData. */
+typedef RTCRPKCS7SIGNEDDATA const *PCRTCRPKCS7SIGNEDDATA;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7SIGNEDDATA, RTDECL, RTCrPkcs7SignedData, SeqCore.Asn1Core);
+
+/** PKCS \#7 SignedData object ID.  */
+#define RTCRPKCS7SIGNEDDATA_OID "1.2.840.113549.1.7.2"
+
+/** PKCS \#7 SignedData version number 1.  */
+#define RTCRPKCS7SIGNEDDATA_V1    1
+
+
+/** @name RTCRPKCS7SIGNEDDATA_SANITY_F_XXX - Flags for RTPkcs7SignedDataCheckSantiy.
+ * @{ */
+/** Check for authenticode restrictions. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE         RT_BIT_32(0)
+/** Check that all the hash algorithms are known to IPRT. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH      RT_BIT_32(1)
+/** Require signing certificate to be present. */
+#define RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT RT_BIT_32(2)
+/** @} */
+
+
+/**
+ * PKCS \#7 DigestInfo (IPRT representation).
+ */
+typedef struct RTCRPKCS7DIGESTINFO
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The digest algorithm use to digest the signed content. */
+    RTCRX509ALGORITHMIDENTIFIER         DigestAlgorithm;
+    /** The digest. */
+    RTASN1OCTETSTRING                   Digest;
+} RTCRPKCS7DIGESTINFO;
+/** Pointer to the IPRT representation of a PKCS \#7 DigestInfo object. */
+typedef RTCRPKCS7DIGESTINFO *PRTCRPKCS7DIGESTINFO;
+/** Pointer to the const IPRT representation of a PKCS \#7 DigestInfo object. */
+typedef RTCRPKCS7DIGESTINFO const *PCRTCRPKCS7DIGESTINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRPKCS7DIGESTINFO, RTDECL, RTCrPkcs7DigestInfo, SeqCore.Asn1Core);
+
+
+/**
+ * Callback function for use with RTCrPkcs7VerifySignedData.
+ *
+ * @returns IPRT status code.
+ * @param   pCert               The certificate to verify.
+ * @param   hCertPaths          Unless the certificate is trusted directly, this
+ *                              is a reference to the certificate path builder
+ *                              and verifier instance that we used to establish
+ *                              at least valid trusted path to @a pCert.  The
+ *                              callback can use this to enforce additional
+ *                              certificate lineage requirements, effective
+ *                              policy checks and whatnot.
+ *                              This is NIL_RTCRX509CERTPATHS if the certificate
+ *                              is directly trusted.
+ * @param   pvUser              The user argument.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+typedef DECLCALLBACK(int) RTCRPKCS7VERIFYCERTCALLBACK(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                                      void *pvUser, PRTERRINFO pErrInfo);
+/** Pointer to a RTCRPKCS7VERIFYCERTCALLBACK callback. */
+typedef RTCRPKCS7VERIFYCERTCALLBACK *PRTCRPKCS7VERIFYCERTCALLBACK;
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ *  Default implementation that checks for the DigitalSignature KeyUsage bit.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackDefault(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                               void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing.  Use this for Microsoft SPC.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackCodeSigning(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                                   void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * Verifies PKCS \#7 SignedData.
+ *
+ * For compatability with alternative crypto providers, the user must work on
+ * the top level PKCS \#7 structure instead directly on the SignedData.
+ *
+ * @returns IPRT status code.
+ * @param   pContentInfo        PKCS \#7 content info structure.
+ * @param   fFlags              RTCRPKCS7VERIFY_SD_F_XXX.
+ * @param   hAdditionalCerts    Store containing additional certificates to
+ *                              supplement those mentioned in the signed data.
+ * @param   hTrustedCerts       Store containing trusted certificates.
+ * @param   pValidationTime     The time we're supposed to validate the
+ *                              certificates chains at.
+ * @param   pfnVerifyCert       Callback for checking that a certificate used
+ *                              for signing the data is suitable.
+ * @param   pvUser              User argument for the callback.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+RTDECL(int) RTCrPkcs7VerifySignedData(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+                                      RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+                                      PCRTTIMESPEC pValidationTime, PRTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+                                      PRTERRINFO pErrInfo);
+
+/** @name RTCRPKCS7VERIFY_SD_F_XXX - Flags for RTCrPkcs7VerifySignedData
+ * @{ */
+/** @} */
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/pkix.h b/include/iprt/crypto/pkix.h
new file mode 100644
index 0000000..d2714e2
--- /dev/null
+++ b/include/iprt/crypto/pkix.h
@@ -0,0 +1,391 @@
+/** @file
+ * IPRT - Public Key Infrastructure APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_pkix_h
+#define ___iprt_crypto_pkix_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crpkix RTCrPkix - Public Key Infrastructure APIs
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * Verifies the signature (@a pSignatureValue) of the give data (@a pvData)
+ * using the specfied public key (@a pPublicKey) and algorithm.
+ *
+ * @returns IPRT status code.
+ * @param   pAlgorithm      The signature algorithm (digest w/ cipher).
+ * @param   pParameters     Parameter to the public key algorithm. Optional.
+ * @param   pPublicKey      The public key.
+ * @param   pSignatureValue The signature value.
+ * @param   pvData          The signed data.
+ * @param   cbData          The amount of signed data.
+ * @param   pErrInfo        Where to return extended error info. Optional.
+ */
+RTDECL(int) RTCrPkixPubKeyVerifySignature(PCRTASN1OBJID pAlgorithm, PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+                                          PCRTASN1BITSTRING pSignatureValue, const void *pvData, size_t cbData,
+                                          PRTERRINFO pErrInfo);
+
+
+/**
+ * Gets the cipher OID matching the given signature algorithm.
+ *
+ * @returns Cipher OID string on success, NULL on failure.
+ * @param   pAlgorithm      The signature algorithm (digest w/ cipher).
+ */
+RTDECL(const char *) RTCrPkixGetCiperOidFromSignatureAlgorithm(PCRTASN1OBJID pAlgorithm);
+
+
+/** @name PKCS-1 Object Identifiers (OIDs)
+ * @{ */
+#define RTCR_PKCS1_OID                              "1.2.840.113549.1.1"
+#define RTCR_PKCS1_RSA_OID                          "1.2.840.113549.1.1.1"
+#define RTCR_PKCS1_MD2_WITH_RSA_OID                 "1.2.840.113549.1.1.2"
+#define RTCR_PKCS1_MD4_WITH_RSA_OID                 "1.2.840.113549.1.1.3"
+#define RTCR_PKCS1_MD5_WITH_RSA_OID                 "1.2.840.113549.1.1.4"
+#define RTCR_PKCS1_SHA1_WITH_RSA_OID                "1.2.840.113549.1.1.5"
+#define RTCR_PKCS1_RSA_OAEP_ENCRYPTION_SET_OID      "1.2.840.113549.1.1.6"
+#define RTCR_PKCS1_RSA_AES_OAEP_OID                 "1.2.840.113549.1.1.7"
+#define RTCR_PKCS1_MSGF1_OID                        "1.2.840.113549.1.1.8"
+#define RTCR_PKCS1_P_SPECIFIED_OID                  "1.2.840.113549.1.1.9"
+#define RTCR_PKCS1_RSASSA_PSS_OID                   "1.2.840.113549.1.1.10"
+#define RTCR_PKCS1_SHA256_WITH_RSA_OID              "1.2.840.113549.1.1.11"
+#define RTCR_PKCS1_SHA384_WITH_RSA_OID              "1.2.840.113549.1.1.12"
+#define RTCR_PKCS1_SHA512_WITH_RSA_OID              "1.2.840.113549.1.1.13"
+#define RTCR_PKCS1_SHA224_WITH_RSA_OID              "1.2.840.113549.1.1.14"
+/** @}  */
+
+
+/**
+ * Public key signature scheme provider descriptor.
+ */
+typedef struct RTCRPKIXSIGNATUREDESC
+{
+    /** The signature scheme provider name. */
+    const char         *pszName;
+    /** The object ID string. */
+    const char         *pszObjId;
+    /** Pointer to a NULL terminated table of alias object IDs (optional). */
+    const char * const *papszObjIdAliases;
+    /** The size of the state. */
+    uint32_t            cbState;
+    /** Reserved for future / explicit padding. */
+    uint32_t            uReserved;
+    /** Provider specific field.  This generally indicates the kind of padding
+     *  scheme to employ with the given OID. */
+    uintptr_t           uProviderSpecific;
+
+    /**
+     * Initializes the state of the signature scheme provider.
+     *
+     * Optional, RT_BZERO will be used if NULL.
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (for uProviderSpecific).
+     * @param   pvState         The opaque provider state.
+     * @param   pvOpaque        Opaque provider specific parameter.
+     * @param   fSigning        Set if a signing operation is going to be performed,
+     *                          clear if it is a verification.  This is a fixed
+     *                          setting for the lifetime of the instance due to the
+     *                          algorithm requiring different keys.
+     * @param   pKey            The key to use (whether private or public depends on
+     *                          the operation).
+     * @param   pParams         Algorithm/key parameters, optional.  Will be NULL if
+     *                          none.
+     */
+    DECLCALLBACKMEMBER(int, pfnInit)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, void *pvOpaque, bool fSigning,
+                                     PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+    /**
+     * Resets the state before performing another signing or verification.
+     *
+     * Optional.  It is assumed that the provider does not have any state needing to
+     * be re-initialized if this method is not implemented.
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (for uProviderSpecific).
+     * @param   pvState         The opaque provider state.
+     * @param   fSigning        Exactly the same value as the init call.
+     */
+    DECLCALLBACKMEMBER(int, pfnReset)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, bool fSigning);
+
+    /**
+     * Deletes the provider state. Optional.
+     *
+     * The state will be securely wiped clean after the call, regardless of whether
+     * the method is implemented or not.
+     *
+     * @param   pDesc           Pointer to this structure (for uProviderSpecific).
+     * @param   pvState         The opaque provider state.
+     * @param   fSigning        Exactly the same value as the init call.
+     */
+    DECLCALLBACKMEMBER(void, pfnDelete)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState, bool fSigning);
+
+    /**
+     * Verifies a signed message digest (fSigning = false).
+     *
+     * @returns IPRT status code.
+     * @retval  VINF_SUCCESS if the signature checked out correctly.
+     * @retval  VERR_PKIX_KEY wrong key or some other key issue.
+     *
+     * @param   pDesc           Pointer to this structure (for uProviderSpecific).
+     * @param   pvState         The opaque provider state.
+     * @param   hDigest         The handle to the digest.  Call RTCrDigestFinal to
+     *                          complete and retreive the final hash value.
+     * @param   pvSignature     The signature to validate.
+     * @param   cbSignature     The size of the signature (in bytes).
+     */
+    DECLCALLBACKMEMBER(int, pfnVerify)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState,
+                                       RTCRDIGEST hDigest, void const *pvSignature, size_t cbSignature);
+
+    /**
+     * Sign a message digest (fSigning = true).
+     *
+     * @returns IPRT status code.
+     * @retval  VINF_SUCCESS on success.
+     * @retval  VERR_PKIX_KEY wrong key or some other key issue.
+     * @retval  VERR_BUFFER_OVERFLOW if the signature buffer is too small, the
+     *          require buffer size will be available in @a *pcbSignature.
+     *
+     * @param   pDesc           Pointer to this structure (for uProviderSpecific).
+     * @param   pvState         The opaque provider state.
+     * @param   hDigest         The handle to the digest.  Call RTCrDigestFinal to
+     *                          complete and retreive the final hash value.
+     * @param   pvSignature     The output signature buffer.
+     * @param   pcbSignature    On input the variable pointed to holds the size of
+     *                          the buffer @a pvSignature points to.
+     *                          On return the variable pointed to is set to the size
+     *                          of the returned signature, or the required size in
+     *                          case of VERR_BUFFER_OVERFLOW.
+     */
+    DECLCALLBACKMEMBER(int, pfnSign)(struct RTCRPKIXSIGNATUREDESC const *pDesc, void *pvState,
+                                     RTCRDIGEST hDigest, void *pvSignature, size_t *pcbSignature);
+
+} RTCRPKIXSIGNATUREDESC;
+/** Pointer to a public key signature scheme provider descriptor. */
+typedef RTCRPKIXSIGNATUREDESC const *PCRTCRPKIXSIGNATUREDESC;
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+RTDECL(int) RTCrPkixSignatureCreateByObjIdString(PRTCRPKIXSIGNATURE phSignature, const char *pszObjId, bool fSigning,
+                                                 PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixSignatureCreateByObjId(PRTCRPKIXSIGNATURE phSignature, PCRTASN1OBJID pObjId, bool fSigning,
+                                           PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+
+RTDECL(int) RTCrPkixSignatureCreate(PRTCRPKIXSIGNATURE phSignature, PCRTCRPKIXSIGNATUREDESC pDesc, void *pvOpaque,
+                                    bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+RTDECL(uint32_t) RTCrPkixSignatureRetain(RTCRPKIXSIGNATURE hSignature);
+RTDECL(uint32_t) RTCrPkixSignatureRelease(RTCRPKIXSIGNATURE hSignature);
+RTDECL(int) RTCrPkixSignatureVerify(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+                                    void const *pvSignature, size_t cbSignature);
+RTDECL(int) RTCrPkixSignatureVerifyBitString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1BITSTRING pSignature);
+RTDECL(int) RTCrPkixSignatureVerifyOctetString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1OCTETSTRING pSignature);
+RTDECL(int) RTCrPkixSignatureSign(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+                                  void *pvSignature, size_t *pcbSignature);
+
+
+/**
+ * Public key encryption scheme provider descriptor.
+ *
+ * @todo This is just a sketch left over from when the signature code was
+ *       chiseled out.
+ */
+typedef struct RTCRPKIXENCRYPTIONDESC
+{
+    /** The encryption scheme provider name. */
+    const char         *pszName;
+    /** The object ID string. */
+    const char         *pszObjId;
+    /** Pointer to a NULL terminated table of alias object IDs (optional). */
+    const char * const *papszObjIdAliases;
+    /** The size of the state. */
+    uint32_t            cbState;
+    /** Reserved for future use / padding.  */
+    uint32_t            uReserved;
+    /** Provider specific field. */
+    uintptr_t           uProviderSpecific;
+
+    /**
+     * Initializes the state for this encryption scheme.
+     *
+     * Optional, RT_BZERO will be used if NULL.
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   pvOpaque        Opaque provider specific parameter.
+     * @param   fEncrypt        Set if the instance will be encrypting, clear if it
+     *                          will be decrypting.  This aspect of the instance is
+     *                          immutable due to the algorithm requiring different
+     *                          keys for each of the operations.
+     * @param   pKey            The key to use (whether private or public depends on
+     *                          the operation type).
+     * @param   pParams         Algorithm/key parameters, optional.  Will be NULL if
+     *                          none.
+     */
+    DECLCALLBACKMEMBER(int, pfnInit)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, void *pvOpaque, bool fEncrypt,
+                                     PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+    /**
+     * Re-initializes the provider state.
+     *
+     * Optional.  It is assumed that the provider does not have any state needing
+     * to be re-initialized if this method is not implemented.  (Do not assume that
+     * a final encrypt/decrypt call has been made prior to this call.)
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   enmOperation    Same as for the earlier pfnInit call.
+     */
+    DECLCALLBACKMEMBER(int, pfnReset)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, bool fEncrypt);
+
+    /**
+     * Deletes the provider state. Optional.
+     *
+     * The state will be securely wiped clean after the call, regardless of whether
+     * the method is implemented or not.
+     *
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   enmOperation    Same as for the earlier pfnInit call.
+     */
+    DECLCALLBACKMEMBER(void, pfnDelete)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState, bool fEncrypt);
+
+    /**
+     * Encrypt using the public key (fEncrypt = true).
+     *
+     * @returns IPRT status code.
+     * @retval  VINF_SUCCESS on success.
+     * @retval  VERR_PKIX_KEY wrong key or some other key issue.
+     * @retval  VERR_BUFFER_OVERFLOW if the output buffer is too small, the require
+     *          buffer size will be available in @a *pcbCiphertext.  The caller can
+     *          should retry the call with a larger buffer.
+     *
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   pvPlaintext     The plaintext to encrypt.
+     * @param   cbPlaintext     The number of bytes of plaintext.
+     * @param   pvCiphertext    Where to return the ciphertext (if any).
+     * @param   cbMaxCiphertext The size of the buffer @a pvCiphertext points to.
+     * @param   pcbCiphertext   Where to return the actual number of bytes of
+     *                          ciphertext returned.
+     * @param   fFinal          Whether this is the final call.
+     */
+    DECLCALLBACKMEMBER(int, pfnEncrypt)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+                                        void const *pvPlaintext, size_t cbPlaintext,
+                                        void *pvCiphertext, size_t cbMaxCiphertext, size_t *pcbCiphertext, bool fFinal);
+
+    /**
+     * Calculate the output buffer size for the next pfnEncrypt call.
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   cbPlaintext     The number of bytes of plaintext.
+     * @param   pcbCiphertext   Where to return the minimum buffer size.  This may
+     *                          be larger than the actual number of bytes return.
+     * @param   fFinal          Whether this is the final call.
+     */
+    DECLCALLBACKMEMBER(int, pfnEncryptLength)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+                                              size_t cbPlaintext, size_t *pcbCiphertext, bool fFinal);
+
+    /**
+     * Decrypt using the private key (fEncrypt = false).
+     *
+     * @returns IPRT status code.
+     * @retval  VINF_SUCCESS on success.
+     * @retval  VERR_PKIX_KEY wrong key or some other key issue.
+     * @retval  VERR_BUFFER_OVERFLOW if the output buffer is too small, the require
+     *          buffer size will be available in @a *pcbCiphertext.  The caller can
+     *          should retry the call with a larger buffer.
+     *
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   pvCiphertext    The ciphertext to decrypt.
+     * @param   cbCiphertext    The number of bytes of ciphertext.
+     * @param   pvPlaintext     Where to return the plaintext (if any).
+     * @param   cbMaxPlaintext  The size of the buffer @a pvPlaintext points to.
+     * @param   pcbPlaintext    Where to return the actual number of bytes of
+     *                          plaintext returned.
+     * @param   fFinal          Whether this is the final call.
+     */
+    DECLCALLBACKMEMBER(int, pfnDecrypt)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+                                        void const *pvCiphertext, size_t cbCiphertext,
+                                        void *pvPlaintext, size_t cbMaxPlaintext, size_t *pcbPlaintext, bool fFinal);
+
+    /**
+     * Calculate the output buffer size for the next pfnDecrypt call.
+     *
+     * @returns IPRT status code.
+     * @param   pDesc           Pointer to this structure (so uProviderSpecific can
+     *                          be read).
+     * @param   pvState         The opaque provider state.
+     * @param   cbCiphertext    The number of bytes of ciphertext.
+     * @param   pcbPlaintext    Where to return the minimum buffer size.  This may
+     *                          be larger than the actual number of bytes return.
+     * @param   fFinal          Whether this is the final call.
+     */
+    DECLCALLBACKMEMBER(int, pfnDecryptLength)(struct RTCRPKIXENCRYPTIONDESC const *pDesc, void *pvState,
+                                              size_t cbCiphertext, size_t *pcbPlaintext, bool fFinal);
+} RTCRPKIXENCRYPTIONDESC;
+/** Pointer to a public key encryption schema provider descriptor. */
+typedef RTCRPKIXENCRYPTIONDESC const *PCRTCRPKIXENCRYPTIONDESC;
+
+
+PCRTCRPKIXENCRYPTIONDESC RTCrPkixEncryptionFindByObjIdString(const char *pszObjId, void *ppvOpaque);
+PCRTCRPKIXENCRYPTIONDESC RTCrPkixEncryptionFindByObjId(PCRTASN1OBJID pObjId, void *ppvOpaque);
+RTDECL(int) RTCrPkixEncryptionCreateByObjIdString(PRTCRPKIXENCRYPTION phEncryption, const char *pszObjId,
+                                                  bool fEncrypt, PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixEncryptionCreateByObjId(PRTCRPKIXENCRYPTION phEncryption, PCRTASN1OBJID pObjId, bool fEncrypt,
+                                           PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+
+
+RTDECL(int) RTCrPkixEncryptionCreate(PRTCRPKIXENCRYPTION phEncryption, PCRTCRPKIXENCRYPTIONDESC pDesc, void *pvOpaque,
+                                    bool fEncrypt, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams);
+RTDECL(int) RTCrPkixEncryptionReset(RTCRPKIXENCRYPTION hEncryption);
+RTDECL(uint32_t) RTCrPkixEncryptionRetain(RTCRPKIXENCRYPTION hEncryption);
+RTDECL(uint32_t) RTCrPkixEncryptionRelease(RTCRPKIXENCRYPTION hEncryption);
+
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/rsa.h b/include/iprt/crypto/rsa.h
new file mode 100644
index 0000000..71cb042
--- /dev/null
+++ b/include/iprt/crypto/rsa.h
@@ -0,0 +1,148 @@
+/** @file
+ * IPRT - Crypto - RSA Public Key Cryptosystem .
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc  RTCrRsa - RSA Public Key Cryptosystem
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * RSA public key - ASN.1 IPRT representation.
+ */
+typedef struct RTCRRSAPUBLICKEY
+{
+    /** Sequence core for the structure. */
+    RTASN1SEQUENCECORE          SeqCore;
+    /** The modulus (n). */
+    RTASN1INTEGER               Modulus;
+    /** The public exponent (e). */
+    RTASN1INTEGER               PublicExponent;
+} RTCRRSAPUBLICKEY;
+/** Pointer to the ASN.1 IPRT representation of an RSA public key. */
+typedef RTCRRSAPUBLICKEY *PRTCRRSAPUBLICKEY;
+/** Pointer to the const ASN.1 IPRT representation of an RSA public key. */
+typedef RTCRRSAPUBLICKEY const *PCRTCRRSAPUBLICKEY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAPUBLICKEY, RTDECL, RTCrRsaPublicKey, SeqCore.Asn1Core);
+
+
+/**
+ * RSA other prime info (ASN.1 IPRT representation).
+ */
+typedef struct RTCRRSAOTHERPRIMEINFO
+{
+    /** Sequence core for the structure. */
+    RTASN1SEQUENCECORE          SeqCore;
+    /** The prime (ri). */
+    RTASN1INTEGER               Prime;
+    /** The exponent (di). */
+    RTASN1INTEGER               Exponent;
+    /** The coefficient (ti). */
+    RTASN1INTEGER               Coefficient;
+} RTCRRSAOTHERPRIMEINFO;
+/** Pointer to the ASN.1 IPRT representation of RSA other prime info.  */
+typedef RTCRRSAOTHERPRIMEINFO *PRTCRRSAOTHERPRIMEINFO;
+/** Pointer to the const ASN.1 IPRT representation of RSA other prime info. */
+typedef RTCRRSAOTHERPRIMEINFO const *PCRTCRRSAOTHERPRIMEINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAOTHERPRIMEINFO, RTDECL, RTCrRsaOtherPrimeInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRRSAOTHERPRIMEINFOS, RTCRRSAOTHERPRIMEINFO, RTDECL, RTCrRsaOtherPrimeInfos);
+
+/**
+ * RSA private key - ASN.1 IPRT representation.
+ */
+typedef struct RTCRRSAPRIVATEKEY
+{
+    /** Sequence core for the structure. */
+    RTASN1SEQUENCECORE          SeqCore;
+    /** Key version number. */
+    RTASN1INTEGER               Version;
+    /** The modulus (n). */
+    RTASN1INTEGER               Modulus;
+    /** The public exponent (e). */
+    RTASN1INTEGER               PublicExponent;
+    /** The private exponent (d). */
+    RTASN1INTEGER               PrivateExponent;
+    /** The first prime factor (p) of the modulus (n). */
+    RTASN1INTEGER               Prime1;
+    /** The second prime factor (q) of the modulus (n). */
+    RTASN1INTEGER               Prime2;
+    /** The first exponent (d mod (p-1)). */
+    RTASN1INTEGER               Exponent1;
+    /** The second exponent (d mod (q-1)). */
+    RTASN1INTEGER               Exponent2;
+    /** The coefficient ((inverse of q) mod p). */
+    RTASN1INTEGER               Coefficient;
+    /** Optional other prime information (version must be 'multi' if present). */
+    RTCRRSAOTHERPRIMEINFOS      OtherPrimeInfos;
+} RTCRRSAPRIVATEKEY;
+/** Pointer to the ASN.1 IPRT representation of an RSA private key. */
+typedef RTCRRSAPRIVATEKEY *PRTCRRSAPRIVATEKEY;
+/** Pointer to the const ASN.1 IPRT representation of an RSA private key. */
+typedef RTCRRSAPRIVATEKEY const *PCRTCRRSAPRIVATEKEY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSAPRIVATEKEY, RTDECL, RTCrRsaPrivateKey, SeqCore.Asn1Core);
+
+/** @name RSA Private Key Versions
+ * @{ */
+#define RTCRRSAPRIVATEKEY_VERSION_TWO_PRIME     0
+#define RTCRRSAPRIVATEKEY_VERSION_MULTI         1
+/** @}  */
+
+
+/**
+ * RSA DigestInfo used by the EMSA-PKCS1-v1_5 encoding method.
+ */
+typedef struct RTCRRSADIGESTINFO
+{
+    /** Sequence core for the structure. */
+    RTASN1SEQUENCECORE          SeqCore;
+    /** The digest algorithm. */
+    RTCRX509ALGORITHMIDENTIFIER DigestAlgorithm;
+    /** The digest. */
+    RTASN1OCTETSTRING           Digest;
+} RTCRRSADIGESTINFO;
+/** Pointer to the ASN.1 IPRT representation of RSA digest info. */
+typedef RTCRRSADIGESTINFO *PRTCRRSADIGESTINFO;
+/** Pointer to the const ASN.1 IPRT representation of RSA digest info. */
+typedef RTCRRSADIGESTINFO const *PCRTCRRSADIGESTINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRRSADIGESTINFO, RTDECL, RTCrRsaDigestInfo, SeqCore.Asn1Core);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
+
diff --git a/include/iprt/crypto/spc.h b/include/iprt/crypto/spc.h
new file mode 100644
index 0000000..d521145
--- /dev/null
+++ b/include/iprt/crypto/spc.h
@@ -0,0 +1,490 @@
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_spc_h
+#define ___iprt_crypto_spc_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_spc  RTCrSpc - Microsoft Authenticode
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+/**
+ * PE Image page hash table, generic union.
+ *
+ * @remarks This table isn't used by ldrPE.cpp, it walks the table in a generic
+ *          fashion using the hash size. So, we can ditch it if we feel like it.
+ */
+typedef union RTCRSPCPEIMAGEPAGEHASHES
+{
+    /** MD5 page hashes. */
+    struct
+    {
+        /** The file offset.  */
+        uint32_t        offFile;
+        /** The hash. */
+        uint8_t         abHash[RTSHA1_HASH_SIZE];
+    } aMd5[1];
+
+    /** SHA-1 page hashes. */
+    struct
+    {
+        /** The file offset.  */
+        uint32_t        offFile;
+        /** The hash. */
+        uint8_t         abHash[RTSHA1_HASH_SIZE];
+    } aSha1[1];
+
+    /** SHA-256 page hashes. */
+    struct
+    {
+        /** The file offset.  */
+        uint32_t        offFile;
+        /** The hash. */
+        uint8_t         abHash[RTSHA256_HASH_SIZE];
+    } aSha256[1];
+
+    /** SHA-512 page hashes. */
+    struct
+    {
+        /** The file offset.  */
+        uint32_t        offFile;
+        /** The hash. */
+        uint8_t         abHash[RTSHA512_HASH_SIZE];
+    } aSha512[1];
+} RTCRSPCPEIMAGEPAGEHASHES;
+/** Pointer to a PE image page hash table union. */
+typedef RTCRSPCPEIMAGEPAGEHASHES *PRTCRSPCPEIMAGEPAGEHASHES;
+/** Pointer to a const PE image page hash table union. */
+typedef RTCRSPCPEIMAGEPAGEHASHES const *PCRTCRSPCPEIMAGEPAGEHASHES;
+
+
+/**
+ * Serialization wrapper for raw RTCRSPCPEIMAGEPAGEHASHES data.
+ */
+typedef struct RTCRSPCSERIALIZEDPAGEHASHES
+{
+    /** The page hashes are within a set. Dunno if there could be multiple
+     * entries in this set, never seen it yet, so I doubt it. */
+    RTASN1SETCORE                   SetCore;
+    /** Octet string containing the raw data. */
+    RTASN1OCTETSTRING               RawData;
+
+    /** Pointer to the hash data within that string.
+     * The hash algorithm is given by the object attribute type in
+     * RTCRSPCSERIALIZEDOBJECTATTRIBUTE.  It is generally the same as for the
+     * whole image hash. */
+    PCRTCRSPCPEIMAGEPAGEHASHES      pData;
+    /** Field the user can use to store the number of pages in pData. */
+    uint32_t                        cPages;
+} RTCRSPCSERIALIZEDPAGEHASHES;
+/** Pointer to a serialized wrapper for page hashes.  */
+typedef RTCRSPCSERIALIZEDPAGEHASHES *PRTCRSPCSERIALIZEDPAGEHASHES;
+/** Pointer to a const serialized wrapper for page hashes.  */
+typedef RTCRSPCSERIALIZEDPAGEHASHES const *PCRTCRSPCSERIALIZEDPAGEHASHES;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDPAGEHASHES, RTDECL, RTCrSpcSerializedPageHashes, SetCore.Asn1Core);
+
+RTDECL(int) RTCrSpcSerializedPageHashes_UpdateDerivedData(PRTCRSPCSERIALIZEDPAGEHASHES pThis);
+
+
+/**
+ * Data type selection for RTCRSPCSERIALIZEDOBJECTATTRIBUTE.
+ */
+typedef enum RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE
+{
+    /** Invalid zero entry. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_INVALID = 0,
+    /** Not present pro forma. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_NOT_PRESENT,
+    /** Unknown object. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN,
+    /** SHA-1 page hashes (pPageHashes). */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1,
+    /** SHA-256 page hashes (pPageHashes). */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2,
+    /** End of valid values. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_END,
+    /** Blow up the type to at least 32-bits. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_32BIT_HACK
+} RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE;
+
+/**
+ * One serialized object attribute (PE image data).
+ */
+typedef struct RTCRSPCSERIALIZEDOBJECTATTRIBUTE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The attribute type. */
+    RTASN1OBJID                         Type;
+    /** The allocation of the data type. */
+    RTASN1ALLOCATION                    Allocation;
+    /** Indicates the valid value in the union. */
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE enmType;
+    /** Union with data format depending on the Type. */
+    union
+    {
+        /** The unknown value (RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN). */
+        PRTASN1CORE                         pCore;
+        /** Page hashes (RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1 or
+         *  RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2). */
+        PRTCRSPCSERIALIZEDPAGEHASHES        pPageHashes;
+    } u;
+} RTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+/** Pointer to a serialized object attribute.  */
+typedef RTCRSPCSERIALIZEDOBJECTATTRIBUTE *PRTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+/** Pointer to a const serialized object attribute.  */
+typedef RTCRSPCSERIALIZEDOBJECTATTRIBUTE const *PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTDECL, RTCrSpcSerializedObjectAttribute, SeqCore.Asn1Core);
+
+/** @name RTCRSPCSERIALIZEDOBJECTATTRIBUTE::Type values
+ * @{ */
+/** Serialized object attribute type for page hashes version 1. */
+#define RTCRSPC_PE_IMAGE_HASHES_V1_OID  "1.3.6.1.4.1.311.2.3.1"
+/** Serialized object attribute type for page hashes version 2. */
+#define RTCRSPC_PE_IMAGE_HASHES_V2_OID  "1.3.6.1.4.1.311.2.3.2"
+/** @} */
+
+
+/*
+ * Set of serialized object attributes (PE image data).
+ */
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRSPCSERIALIZEDOBJECTATTRIBUTES, RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTDECL,
+                                           RTCrSpcSerializedObjectAttributes);
+
+/** The UUID found in RTCRSPCSERIALIZEDOBJECT::Uuid for
+ *  RTCRSPCSERIALIZEDOBJECTATTRIBUTES. */
+#define RTCRSPCSERIALIZEDOBJECT_UUID_STR "d586b5a6-a1b4-6624-ae05-a217da8e60d6"
+
+
+/**
+ * Decoded encapsulated data type selection in RTCRSPCSERIALIZEDOBJECT.
+ */
+typedef enum RTCRSPCSERIALIZEDOBJECTTYPE
+{
+    /** Invalid zero value. */
+    RTCRSPCSERIALIZEDOBJECTTYPE_INVALID = 0,
+    /** Serialized object attributes (RTCRSPCSERIALIZEDOBJECT_UUID_STR / pAttribs). */
+    RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES,
+    /** End of valid values. */
+    RTCRSPCSERIALIZEDOBJECTTYPE_END,
+    /** MAke sure the type is at least 32-bit wide. */
+    RTCRSPCSERIALIZEDOBJECTTYPE_32BIT_HACK = 0x7fffffff
+} RTCRSPCSERIALIZEDOBJECTTYPE;
+
+/**
+ * A serialized object (PE image data).
+ */
+typedef struct RTCRSPCSERIALIZEDOBJECT
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The UUID of the data object. */
+    RTASN1OCTETSTRING                   Uuid;
+    /** Serialized data object. */
+    RTASN1OCTETSTRING                   SerializedData;
+
+    /** Indicates the valid pointer in the union. */
+    RTCRSPCSERIALIZEDOBJECTTYPE         enmType;
+    /** Union of pointers shadowing SerializedData.pEncapsulated.  */
+    union
+    {
+        /** Generic core pointer. */
+        PRTASN1CORE                         pCore;
+        /** Pointer to decoded data if Uuid is RTCRSPCSERIALIZEDOBJECT_UUID_STR. */
+        PRTCRSPCSERIALIZEDOBJECTATTRIBUTES  pData;
+    } u;
+} RTCRSPCSERIALIZEDOBJECT;
+/** Pointer to a serialized object (PE image data). */
+typedef RTCRSPCSERIALIZEDOBJECT *PRTCRSPCSERIALIZEDOBJECT;
+/** Pointer to a const serialized object (PE image data). */
+typedef RTCRSPCSERIALIZEDOBJECT const *PCRTCRSPCSERIALIZEDOBJECT;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSERIALIZEDOBJECT, RTDECL, RTCrSpcSerializedObject, SeqCore.Asn1Core);
+
+
+/**
+ * RTCRSPCSTRING choices.
+ */
+typedef enum RTCRSPCSTRINGCHOICE
+{
+    /** Invalid zero value.  */
+    RTCRSPCSTRINGCHOICE_INVALID = 0,
+    /** Not present. */
+    RTCRSPCSTRINGCHOICE_NOT_PRESENT,
+    /** UCS-2 string (pUcs2). */
+    RTCRSPCSTRINGCHOICE_UCS2,
+    /** ASCII string (pAscii). */
+    RTCRSPCSTRINGCHOICE_ASCII,
+    /** End of valid values. */
+    RTCRSPCSTRINGCHOICE_END,
+    /** Blow the type up to 32-bit. */
+    RTCRSPCSTRINGCHOICE_32BIT_HACK = 0x7fffffff
+} RTCRSPCSTRINGCHOICE;
+
+/**
+ * Stupid microsoft choosy string type.
+ */
+typedef struct RTCRSPCSTRING
+{
+    /** Dummy core. */
+    RTASN1DUMMY                         Dummy;
+    /** Allocation of what the pointer below points to. */
+    RTASN1ALLOCATION                    Allocation;
+    /** Pointer choice.*/
+    RTCRSPCSTRINGCHOICE                 enmChoice;
+    /** Pointer union. */
+    union
+    {
+        /** Tag 0, implicit: UCS-2 (BMP) string.  */
+        PRTASN1STRING                   pUcs2;
+        /** Tag 1, implicit: ASCII (IA5) string.  */
+        PRTASN1STRING                   pAscii;
+    } u;
+} RTCRSPCSTRING;
+/** Pointer to a stupid microsoft string choice.  */
+typedef RTCRSPCSTRING *PRTCRSPCSTRING;
+/** Pointer to a const stupid microsoft string choice.  */
+typedef RTCRSPCSTRING const *PCRTCRSPCSTRING;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCSTRING, RTDECL, RTCrSpcString, Dummy.Asn1Core);
+
+
+/**
+ * RTCRSPCSTRING choices.
+ */
+typedef enum RTCRSPCLINKCHOICE
+{
+    /** Invalid zero value.  */
+    RTCRSPCLINKCHOICE_INVALID = 0,
+    /** Not present. */
+    RTCRSPCLINKCHOICE_NOT_PRESENT,
+    /** URL (ASCII) string (pUrl). */
+    RTCRSPCLINKCHOICE_URL,
+    /** Serialized object (pMoniker). */
+    RTCRSPCLINKCHOICE_MONIKER,
+    /** Filename (pT2). */
+    RTCRSPCLINKCHOICE_FILE,
+    /** End of valid values. */
+    RTCRSPCLINKCHOICE_END,
+    /** Blow the type up to 32-bit. */
+    RTCRSPCLINKCHOICE_32BIT_HACK = 0x7fffffff
+} RTCRSPCLINKCHOICE;
+
+/**
+ * PE image data link.
+ */
+typedef struct RTCRSPCLINK
+{
+    /** Dummy core. */
+    RTASN1DUMMY                         Dummy;
+    /** Allocation of what the pointer below points to. */
+    RTASN1ALLOCATION                    Allocation;
+    /** Pointer choice.*/
+    RTCRSPCLINKCHOICE                   enmChoice;
+    /** Pointer union. */
+    union
+    {
+        /** Tag 0, implicit: An URL encoded as an IA5 STRING.  */
+        PRTASN1STRING                   pUrl;
+        /** Tag 1, implicit: A serialized object.  */
+        PRTCRSPCSERIALIZEDOBJECT        pMoniker;
+        /** Tag 2, explicit: The default, a file name.
+         * Documented to be set to "<<<Obsolete>>>" when used. */
+        struct
+        {
+            /** Context tag 2. */
+            RTASN1CONTEXTTAG2           CtxTag2;
+            /** The file name string. */
+            RTCRSPCSTRING               File;
+        } *pT2;
+    } u;
+} RTCRSPCLINK;
+/** Poitner to a PE image data link. */
+typedef RTCRSPCLINK *PRTCRSPCLINK;
+/** Poitner to a const PE image data link. */
+typedef RTCRSPCLINK const *PCRTCRSPCLINK;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCLINK, RTDECL, RTCrSpcLink, Dummy.Asn1Core);
+
+
+#if 0 /** @todo Might not be the correct bit order. */
+/**
+ * Flag values for RTCRSPCPEIMAGEDATA::Flags and RTCRSPCPEIMAGEDATA::fFlags.
+ */
+typedef enum RTCRSPCPEIMAGEFLAGS
+{
+    RTCRSPCPEIMAGEFLAGS_INCLUDE_RESOURCES = 0,
+    RTCRSPCPEIMAGEFLAGS_INCLUDE_DEBUG_INFO = 1,
+    RTCRSPCPEIMAGEFLAGS_IMPORT_ADDRESS_TABLE = 2
+} RTCRSPCPEIMAGEFLAGS;
+#endif
+
+
+/**
+ * Authenticode PE Image data.
+ */
+typedef struct RTCRSPCPEIMAGEDATA
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** One of the RTCRSPCPEIMAGEFLAGS value, default is
+     * RTCRSPCPEIMAGEFLAGS_INCLUDE_RESOURCES.  Obsolete with v2 page hashes? */
+    RTASN1BITSTRING                     Flags;
+    /** Tag 0, explicit: Link to the data. */
+    struct
+    {
+        /** Context tag 0. */
+        RTASN1CONTEXTTAG0               CtxTag0;
+        /** Link to the data. */
+        RTCRSPCLINK                     File;
+    } T0;
+} RTCRSPCPEIMAGEDATA;
+/** Pointer to a authenticode PE image data representation. */
+typedef RTCRSPCPEIMAGEDATA *PRTCRSPCPEIMAGEDATA;
+/** Pointer to a const authenticode PE image data representation. */
+typedef RTCRSPCPEIMAGEDATA const *PCRTCRSPCPEIMAGEDATA;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCPEIMAGEDATA, RTDECL, RTCrSpcPeImageData, SeqCore.Asn1Core);
+
+/** The object ID for SpcPeImageData. */
+#define RTCRSPCPEIMAGEDATA_OID            "1.3.6.1.4.1.311.2.1.15"
+
+
+/**
+ * Data type selection for RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE.
+ */
+typedef enum RTCRSPCAAOVTYPE
+{
+    /** Invalid zero entry. */
+    RTCRSPCAAOVTYPE_INVALID = 0,
+    /** Not present (pro forma). */
+    RTCRSPCAAOVTYPE_NOT_PRESENT,
+    /** Unknown object. */
+    RTCRSPCAAOVTYPE_UNKNOWN,
+    /** PE image data (pPeImage). */
+    RTCRSPCAAOVTYPE_PE_IMAGE_DATA,
+    /** End of valid values. */
+    RTCRSPCAAOVTYPE_END,
+    /** Blow up the type to at least 32-bits. */
+    RTCRSPCAAOVTYPE_32BIT_HACK
+} RTCRSPCAAOVTYPE;
+
+/**
+ * Authenticode attribute type and optional value.
+ *
+ * Note! Spec says the value should be explicitly tagged, but in real life
+ *       it isn't.  So, not very optional?
+ */
+typedef struct RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** An object ID indicating the type of the value. */
+    RTASN1OBJID                         Type;
+    /** Allocation of the optional data value. */
+    RTASN1ALLOCATION                    Allocation;
+    /** The valid pointer. */
+    RTCRSPCAAOVTYPE                     enmType;
+    /** The value part depends on the Type. */
+    union
+    {
+        /** RTCRSPCAAOVTYPE_UNKNOWN / Generic.  */
+        PRTASN1CORE                     pCore;
+        /** RTCRSPCAAOVTYPE_PE_IMAGE_DATA / RTCRSPCPEIMAGEDATA_OID. */
+        PRTCRSPCPEIMAGEDATA             pPeImage;
+    } uValue;
+} RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+/** Pointer to a authentication attribute type and optional value
+ *  representation. */
+typedef RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE *PRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+/** Pointer to a const authentication attribute type and optional value
+ *  representation. */
+typedef RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE const *PCRTCRSPCATTRIBUTETYPEANDOPTIONALVALUE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE, RTDECL, RTCrSpcAttributeTypeAndOptionalValue, SeqCore.Asn1Core);
+
+
+/**
+ * Authenticode indirect data content.
+ */
+typedef struct RTCRSPCINDIRECTDATACONTENT
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Additional data. */
+    RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE Data;
+    /** The whole image digest. */
+    RTCRPKCS7DIGESTINFO                 DigestInfo;
+} RTCRSPCINDIRECTDATACONTENT;
+/** Pointer to a authenticode indirect data content representation. */
+typedef RTCRSPCINDIRECTDATACONTENT *PRTCRSPCINDIRECTDATACONTENT;
+/** Pointer to a const authenticode indirect data content representation. */
+typedef RTCRSPCINDIRECTDATACONTENT const *PCRTCRSPCINDIRECTDATACONTENT;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRSPCINDIRECTDATACONTENT, RTDECL, RTCrSpcIndirectDataContent, SeqCore.Asn1Core);
+
+/** The object ID for SpcIndirectDataContent. */
+#define RTCRSPCINDIRECTDATACONTENT_OID    "1.3.6.1.4.1.311.2.1.4"
+
+/**
+ * Check the sanity of an Authenticode SPCIndirectDataContent object.
+ *
+ * @returns IPRT status code
+ * @param   pIndData            The Authenticode SPCIndirectDataContent to
+ *                              check.
+ * @param   pSignedData         The related signed data object.
+ * @param   fFlags              RTCRSPCINDIRECTDATACONTENT_SANITY_F_XXX.
+ * @param   pErrInfo            Optional error info.
+ */
+RTDECL(int) RTCrSpcIndirectDataContent_CheckSanityEx(PCRTCRSPCINDIRECTDATACONTENT pIndData, PCRTCRPKCS7SIGNEDDATA pSignedData,
+                                                     uint32_t fFlags, PRTERRINFO pErrInfo);
+/** @name RTCRSPCINDIRECTDATACONTENT_SANITY_F_XXX for RTCrSpcIndirectDataContent_CheckSanityEx.
+ * @{  */
+/** The digest hash algorithm must be known to IPRT. */
+#define RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH   RT_BIT_32(0)
+/** PE image signing, check expectations of the spec.  */
+#define RTCRSPCINDIRECTDATACONTENT_SANITY_F_PE_IMAGE          RT_BIT_32(1)
+/** @} */
+
+/**
+ * Gets the first SPC serialized object attribute in a SPC PE image.
+ *
+ * @returns Pointer to the attribute with the given type, NULL if not found.
+ * @param   pThis               The Authenticode SpcIndirectDataContent.
+ */
+RTDECL(PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE)
+RTCrSpcIndirectDataContent_GetPeImageObjAttrib(PCRTCRSPCINDIRECTDATACONTENT pThis,
+                                               RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE enmType);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/store.h b/include/iprt/crypto/store.h
new file mode 100644
index 0000000..7c10a16
--- /dev/null
+++ b/include/iprt/crypto/store.h
@@ -0,0 +1,132 @@
+/** @file
+ * IPRT - Cryptographic (Certificate) Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_store_h
+#define ___iprt_crypto_store_h
+
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/taf.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crstore    RTCrStore - Crypotgraphic (Certificate) Store.
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * A certificate store search.
+ *
+ * Used by the store provider to keep track of the current location of a
+ * certificate search.
+ */
+typedef struct RTCRSTORECERTSEARCH
+{
+    /** Opaque provider specific storage.
+     *
+     * Provider restriction: The provider is only allowed to use the two first
+     * entries for the find-all searches, because the front-end API may want the
+     * last two for implementing specific searches on top of it. */
+    uintptr_t   auOpaque[4];
+} RTCRSTORECERTSEARCH;
+/** Pointer to a certificate store search. */
+typedef RTCRSTORECERTSEARCH *PRTCRSTORECERTSEARCH;
+
+
+RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint);
+
+RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore);
+RTDECL(uint32_t) RTCrStoreRelease(RTCRSTORE hStore);
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertByIssuerAndSerialNo(RTCRSTORE hStore, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo);
+RTDECL(int) RTCrStoreCertAddEncoded(RTCRSTORE hStore, uint32_t fFlags, void const *pvSrc, size_t cbSrc, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrStoreCertAddFromFile(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename, PRTERRINFO pErrInfo);
+
+RTDECL(int) RTCrStoreCertFindAll(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+RTDECL(int) RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(RTCRSTORE hStore, PCRTCRX509NAME pSubject,
+                                                            PRTCRSTORECERTSEARCH pSearch);
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertSearchNext(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+RTDECL(int) RTCrStoreCertSearchDestroy(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch);
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore);
+RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack);
+
+
+/** @} */
+
+
+/** @defgroup grp_rt_crcertctx  RTCrCertCtx - (Store) Certificate Context.
+ * @{  */
+
+
+/**
+ * Certificate context.
+ *
+ * This is returned by the certificate store APIs and is part of a larger
+ * reference counted structure.  All the data is read only.
+ */
+typedef struct RTCRCERTCTX
+{
+    /** Flags, RTCRCERTCTX_F_XXX.  */
+    uint32_t                    fFlags;
+    /** The size of the (DER) encoded certificate. */
+    uint32_t                    cbEncoded;
+    /** Pointer to the (DER) encoded certificate. */
+    uint8_t const              *pabEncoded;
+    /** Pointer to the decoded X.509 representation of the certificate.
+     * This can be NULL when pTaInfo is present.  */
+    PCRTCRX509CERTIFICATE       pCert;
+    /** Pointer to the decoded TrustAnchorInfo for the certificate.  This can be
+     * NULL, even for trust anchors, as long as pCert isn't. */
+    PCRTCRTAFTRUSTANCHORINFO    pTaInfo;
+    /** Reserved for future use. */
+    void                       *paReserved[2];
+} RTCRCERTCTX;
+
+/** @name RTCRCERTCTX_F_XXX.
+ * @{ */
+/** Encoding mask. */
+#define RTCRCERTCTX_F_ENC_MASK         UINT32_C(0x000000ff)
+/** X.509 certificate, DER encoded. */
+#define RTCRCERTCTX_F_ENC_X509_DER     UINT32_C(0x00000000)
+/** RTF-5914 trust anchor info, DER encoded. */
+#define RTCRCERTCTX_F_ENC_TAF_DER      UINT32_C(0x00000001)
+#if 0
+/** Extended certificate, DER encoded. */
+#define RTCRCERTCTX_F_ENC_PKCS6_DER    UINT32_C(0x00000002)
+#endif
+/** @} */
+
+
+RTDECL(uint32_t) RTCrCertCtxRetain(PCRTCRCERTCTX pCertCtx);
+RTDECL(uint32_t) RTCrCertCtxRelease(PCRTCRCERTCTX pCertCtx);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/taf.h b/include/iprt/crypto/taf.h
new file mode 100644
index 0000000..99c27e1
--- /dev/null
+++ b/include/iprt/crypto/taf.h
@@ -0,0 +1,189 @@
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914).
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_taf_h
+#define ___iprt_crypto_taf_h
+
+#include <iprt/asn1.h>
+#include <iprt/crypto/x509.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_crtaf RTCrTaf - Trust Anchor Format (RFC-5914)
+ * @ingroup grp_rt_crypto
+ * @{
+ */
+
+
+/**
+ * RFC-5914 CertPathControls (IPRT representation).
+ */
+typedef struct RTCRTAFCERTPATHCONTROLS
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The trust anchor subject.  For use in path construction. */
+    RTCRX509NAME                        TaName;
+    /** Certificate, optional, implicit tag 0. */
+    RTCRX509CERTIFICATE                 Certificate;
+    /** Certificate policies, optional, implicit tag 1.
+     * @remarks This is an ASN.1 SEQUENCE, not an ASN.1 SET as the name
+     *          mistakenly might be taken to indicate. */
+    RTCRX509CERTIFICATEPOLICIES         PolicySet;
+    /** Policy flags, optional, implicit tag 2. */
+    RTASN1BITSTRING                     PolicyFlags;
+    /** Name constraints, optional, implicit tag 3. */
+    RTCRX509NAMECONSTRAINTS             NameConstr;
+    /** Path length constraints, optional, implicit tag 4. */
+    RTASN1INTEGER                       PathLenConstraint;
+} RTCRTAFCERTPATHCONTROLS;
+/** Pointer to the IPRT representation of a RFC-5914 CertPathControls. */
+typedef RTCRTAFCERTPATHCONTROLS *PRTCRTAFCERTPATHCONTROLS;
+/** Pointer to the const IPRT representation of a RFC-5914 CertPathControls. */
+typedef RTCRTAFCERTPATHCONTROLS const *PCRTCRTAFCERTPATHCONTROLS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFCERTPATHCONTROLS, RTDECL, RTCrTafCertPathControls, SeqCore.Asn1Core);
+
+/** @name Bit definitions for RTCRTAFCERTPATHCONTROL::PolicyFlags
+ * @{ */
+#define RTCRTAFCERTPOLICYFLAGS_INHIBIT_POLICY_MAPPING   0
+#define RTCRTAFCERTPOLICYFLAGS_REQUIRE_EXPLICIT_POLICY  1
+#define RTCRTAFCERTPOLICYFLAGS_INHIBIT_ANY_POLICY       2
+/** @} */
+
+
+/**
+ * RFC-5914 TrustAnchorInfo (IPRT representation).
+ */
+typedef struct RTCRTAFTRUSTANCHORINFO
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The version number (defaults to v1). */
+    RTASN1INTEGER                       Version;
+    /** The public key of the trust anchor. */
+    RTCRX509SUBJECTPUBLICKEYINFO        PubKey;
+    /** Key identifier. */
+    RTASN1OCTETSTRING                   KeyIdentifier;
+    /** Trust anchor title, optional, size 1 to 64. */
+    RTASN1STRING                        TaTitle;
+    /** Certificate path controls, optional. */
+    RTCRTAFCERTPATHCONTROLS             CertPath;
+    /** Extensions, explicit optional, context tag 1.  */
+    struct
+    {
+        /** Context tag 1. */
+        RTASN1CONTEXTTAG1               CtxTag1;
+        /** The extensions. */
+        RTCRX509EXTENSIONS              Exts;
+    } T1;
+    /** Title language tag, implicit optional, context tag 2.
+     * Defaults to "en". */
+    RTASN1STRING                        TaTitleLangTag;
+} RTCRTAFTRUSTANCHORINFO;
+/** Pointer to the IPRT representation of a RFC-5914 TrustAnchorInfo. */
+typedef RTCRTAFTRUSTANCHORINFO *PRTCRTAFTRUSTANCHORINFO;
+/** Pointer to the const IPRT representation of a RFC-5914 TrustAnchorInfo. */
+typedef RTCRTAFTRUSTANCHORINFO const *PCRTCRTAFTRUSTANCHORINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFTRUSTANCHORINFO, RTDECL, RTCrTafTrustAnchorInfo, SeqCore.Asn1Core);
+
+/** TrustAnchorInfo version 1.  */
+#define RTCRTAFTRUSTANCHORINFO_V1       1
+
+
+/** Indicates what kind of value a TrustAnchorChoice structure contains. */
+typedef enum RTCRTAFTRUSTANCHORCHOICEVAL
+{
+    /** Invalid zero value. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_INVALID = 0,
+    /** RTCRTAFTRUSTANCHORCHOICE::u.pCertificate. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_CERTIFICATE,
+    /** RTCRTAFTRUSTANCHORCHOICE::u.pT1. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_TBS_CERTIFICATE,
+    /** RTCRTAFTRUSTANCHORCHOICE::u.pT2. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_TRUST_ANCHOR_INFO,
+    /** End of valid choices. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_END,
+    /** Make sure it's (at least) 32-bit wide. */
+    RTCRTAFTRUSTANCHORCHOICEVAL_32BIT_HACK = 0x7fffffff
+} RTCRTAFTRUSTANCHORCHOICEVAL;
+
+
+/**
+ * RFC-5914 TrustAnchorChoice (IPRT representation).
+ */
+typedef struct RTCRTAFTRUSTANCHORCHOICE
+{
+    /** Dummy object for simplifying everything.   */
+    RTASN1DUMMY                         Dummy;
+    /** Allocation for the valid member (to optimize space usage). */
+    RTASN1ALLOCATION                    Allocation;
+    /** Indicates which of the pointers are valid. */
+    RTCRTAFTRUSTANCHORCHOICEVAL         enmChoice;
+    /** Choice union. */
+    union
+    {
+        /** Generic ASN.1 core pointer for the choice.  */
+        PRTASN1CORE                     pAsn1Core;
+        /** Choice 0: X509 certificate.  */
+        PRTCRX509CERTIFICATE            pCertificate;
+        /** Choice 1: To-be-signed certificate part.  This may differ from the
+         * TBSCertificate member of the original certificate. */
+        struct
+        {
+            /** Explicit context tag. */
+            RTASN1CONTEXTTAG1           CtxTag1;
+            /** Pointer to the TBS certificate structure. */
+            RTCRX509TBSCERTIFICATE      TbsCert;
+        } *pT1;
+
+        /** Choice 2: To-be-signed certificate part.  This may differ from the
+         * TBSCertificate member of the original certificate. */
+        struct
+        {
+            /** Explicit context tag. */
+            RTASN1CONTEXTTAG2           CtxTag2;
+            /** Pointer to the trust anchor infomration structure. */
+            RTCRTAFTRUSTANCHORINFO      TaInfo;
+        } *pT2;
+    } u;
+} RTCRTAFTRUSTANCHORCHOICE;
+/** Pointer to the IPRT representation of a RFC-5914 TrustAnchorChoice. */
+typedef RTCRTAFTRUSTANCHORCHOICE *PRTCRTAFTRUSTANCHORCHOICE;
+/** Pointer to the const IPRT representation of a RFC-5914 TrustAnchorChoice. */
+typedef RTCRTAFTRUSTANCHORCHOICE const *PCRTCRTAFTRUSTANCHORCHOICE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRTAFTRUSTANCHORCHOICE, RTDECL, RTCrTafTrustAnchorChoice, Dummy.Asn1Core);
+
+/*
+ * RFC-5914 TrustAnchorList (IPRT representation).
+ */
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRTAFTRUSTANCHORLIST, RTCRTAFTRUSTANCHORCHOICE, RTDECL, RTCrTafTrustAnchorList);
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/include/iprt/crypto/x509.h b/include/iprt/crypto/x509.h
new file mode 100644
index 0000000..bc7f061
--- /dev/null
+++ b/include/iprt/crypto/x509.h
@@ -0,0 +1,1056 @@
+/** @file
+ * IPRT - Crypto - X.509, Public Key and Privilege Management Infrastructure.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_crypto_x509_h
+#define ___iprt_crypto_x509_h
+
+#include <iprt/asn1.h>
+
+
+RT_C_DECLS_BEGIN
+
+
+/** @defgroup grp_rt_crypto Crypto
+ * @ingroup grp_rt
+ * @{
+ */
+
+/** @defgroup grp_rt_crx509 RTCrX509 - Public Key and Privilege Management Infrastructure.
+ * @{
+ */
+
+/**
+ * X.509 algorithm identifier (IPRT representation).
+ */
+typedef struct RTCRX509ALGORITHMIDENTIFIER
+{
+    /** The sequence making up this algorithm identifier. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The algorithm object ID. */
+    RTASN1OBJID                         Algorithm;
+    /** Optional parameters specified by the algorithm. */
+    RTASN1DYNTYPE                       Parameters;
+} RTCRX509ALGORITHMIDENTIFIER;
+/** Poitner to the IPRT representation of a X.509 algorithm identifier. */
+typedef RTCRX509ALGORITHMIDENTIFIER *PRTCRX509ALGORITHMIDENTIFIER;
+/** Poitner to the const IPRT representation of a X.509 algorithm identifier. */
+typedef RTCRX509ALGORITHMIDENTIFIER const *PCRTCRX509ALGORITHMIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509ALGORITHMIDENTIFIER, RTDECL, RTCrX509AlgorithmIdentifier, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509ALGORITHMIDENTIFIERS, RTCRX509ALGORITHMIDENTIFIER, RTDECL, RTCrX509AlgorithmIdentifiers);
+
+/**
+ * Tries to convert an X.509 digest algorithm ID into a RTDIGESTTYPE value.
+ *
+ * @returns Valid RTDIGESTTYPE on success, RTDIGESTTYPE_INVALID on failure.
+ * @param   pThis           The IPRT representation of a X.509 algorithm
+ *                          identifier object.
+ */
+RTDECL(RTDIGESTTYPE) RTCrX509AlgorithmIdentifier_QueryDigestType(PCRTCRX509ALGORITHMIDENTIFIER pThis);
+
+/**
+ * Tries to figure the digest size of an X.509 digest algorithm ID.
+ *
+ * @returns The digest size in bytes, UINT32_MAX if unknown digest.
+ * @param   pThis           The IPRT representation of a X.509 algorithm
+ *                          identifier object.
+ */
+RTDECL(uint32_t) RTCrX509AlgorithmIdentifier_QueryDigestSize(PCRTCRX509ALGORITHMIDENTIFIER pThis);
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareWithString(PCRTCRX509ALGORITHMIDENTIFIER pThis, const char *pszObjId);
+
+/**
+ * Compares a digest with an encrypted digest algorithm, checking if they
+ * specify the same digest.
+ *
+ * @returns 0 if same digest, -1 if the digest is unknown, 1 if the encrypted
+ *          digest does not match.
+ * @param   pDigest             The digest algorithm.
+ * @param   pEncryptedDigest    The encrypted digest algorithm.
+ */
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest(PCRTCRX509ALGORITHMIDENTIFIER pDigest,
+                                                                        PCRTCRX509ALGORITHMIDENTIFIER pEncryptedDigest);
+
+/** @name Typical Digest Algorithm OIDs.
+ * @{ */
+#define RTCRX509ALGORITHMIDENTIFIERID_MD2               "1.2.840.113549.2.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD4               "1.2.840.113549.2.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD5               "1.2.840.113549.2.5"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA1              "1.3.14.3.2.26"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA256            "2.16.840.1.101.3.4.2.1"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA384            "2.16.840.1.101.3.4.2.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512            "2.16.840.1.101.3.4.2.3"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA224            "2.16.840.1.101.3.4.2.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512T224        "2.16.840.1.101.3.4.2.5"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512T256        "2.16.840.1.101.3.4.2.6"
+#define RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL         "1.0.10118.3.0.55"
+/** @} */
+
+/** @name Encrypted Digest Algorithm OIDs.
+ * @remarks The PKCS variants are the default ones, alternative OID are marked
+ *          as such.
+ * @{ */
+#define RTCRX509ALGORITHMIDENTIFIERID_RSA               "1.2.840.113549.1.1.1"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA      "1.2.840.113549.1.1.2"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA      "1.2.840.113549.1.1.3"
+#define RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA      "1.2.840.113549.1.1.4"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA     "1.2.840.113549.1.1.5"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA   "1.2.840.113549.1.1.11"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA   "1.2.840.113549.1.1.12"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA   "1.2.840.113549.1.1.13"
+#define RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA   "1.2.840.113549.1.1.14"
+/** @} */
+
+
+
+
+/**
+ * One X.509 AttributeTypeAndValue (IPRT representation).
+ */
+typedef struct RTCRX509ATTRIBUTETYPEANDVALUE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The attribute type (object ID). */
+    RTASN1OBJID                         Type;
+    /** The attribute value (what it is is defined by Type). */
+    RTASN1DYNTYPE                       Value;
+} RTCRX509ATTRIBUTETYPEANDVALUE;
+/** Pointer to a X.509 AttributeTypeAndValue (IPRT representation). */
+typedef RTCRX509ATTRIBUTETYPEANDVALUE *PRTCRX509ATTRIBUTETYPEANDVALUE;
+/** Pointer to a const X.509 AttributeTypeAndValue (IPRT representation). */
+typedef RTCRX509ATTRIBUTETYPEANDVALUE const *PCRTCRX509ATTRIBUTETYPEANDVALUE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509ATTRIBUTETYPEANDVALUE, RTDECL, RTCrX509AttributeTypeAndValue, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509ATTRIBUTETYPEANDVALUES, RTCRX509ATTRIBUTETYPEANDVALUE, RTDECL, RTCrX509AttributeTypeAndValues);
+
+RTASN1TYPE_ALIAS(RTCRX509RELATIVEDISTINGUISHEDNAME, RTCRX509ATTRIBUTETYPEANDVALUES, RTCrX509RelativeDistinguishedName, RTCrX509AttributeTypeAndValues);
+
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509NAME, RTCRX509RELATIVEDISTINGUISHEDNAME, RTDECL, RTCrX509Name);
+RTDECL(int) RTCrX509Name_CheckSanity(PCRTCRX509NAME pName, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag);
+RTDECL(bool) RTCrX509Name_MatchByRfc5280(PCRTCRX509NAME pLeft, PCRTCRX509NAME pRight);
+
+/**
+ * Name constraint matching (RFC-5280).
+ *
+ * @returns true on match, false on mismatch.
+ * @param   pConstraint     The constraint name.
+ * @param   pName           The name to match against the constraint.
+ * @sa      RTCrX509GeneralName_ConstraintMatch,
+ *          RTCrX509RelativeDistinguishedName_ConstraintMatch
+ */
+RTDECL(bool) RTCrX509Name_ConstraintMatch(PCRTCRX509NAME pConstraint, PCRTCRX509NAME pName);
+RTDECL(int) RTCrX509Name_RecodeAsUtf8(PRTCRX509NAME pThis, PCRTASN1ALLOCATORVTABLE pAllocator);
+
+/**
+ * Matches the directory name against a comma separated list of the comonent
+ * strings (case sensitive).
+ *
+ * @returns true if match, false if mismatch.
+ * @param   pThis           The name object.
+ * @param   pszString       The string to match against. For example:
+ *                          "C=US, ST=California, L=Redwood Shores, O=Oracle Corporation"
+ *
+ * @remarks This is doing a straight compare, no extra effort is expended in
+ *          dealing with different component order.  If the component order
+ *          differs, there won't be any match.
+ */
+RTDECL(bool) RTCrX509Name_MatchWithString(PCRTCRX509NAME pThis, const char *pszString);
+
+/**
+ * Formats the name as a command separated list of components with type
+ * prefixes.
+ *
+ * The output of this function is suitable for use with
+ * RTCrX509Name_MatchWithString.
+ *
+ * @returns IPRT status code.
+ * @param   pThis           The name object.
+ * @param   pszBuf          The output buffer.
+ * @param   cbBuf           The size of the output buffer.
+ * @param   pcbActual       Where to return the number of bytes required for the
+ *                          output, including the null terminator character.
+ *                          Optional.
+ */
+RTDECL(int) RTCrX509Name_FormatAsString(PCRTCRX509NAME pThis, char *pszBuf, size_t cbBuf, size_t *pcbActual);
+
+
+
+typedef enum RTCRX509GENERALNAMECHOICE
+{
+    RTCRX509GENERALNAMECHOICE_INVALID = 0,
+    RTCRX509GENERALNAMECHOICE_OTHER_NAME,
+    RTCRX509GENERALNAMECHOICE_RFC822_NAME,
+    RTCRX509GENERALNAMECHOICE_DNS_NAME,
+    RTCRX509GENERALNAMECHOICE_X400_ADDRESS,
+    RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME,
+    RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME,
+    RTCRX509GENERALNAMECHOICE_URI,
+    RTCRX509GENERALNAMECHOICE_IP_ADDRESS,
+    RTCRX509GENERALNAMECHOICE_REGISTERED_ID,
+    RTCRX509GENERALNAMECHOICE_END,
+    RTCRX509GENERALNAMECHOICE_32BIT_HACK = 0x7fffffff
+} RTCRX509GENERALNAMECHOICE;
+
+/**
+ * One X.509 GeneralName (IPRT representation).
+ *
+ * This is represented as a union.  Use the RTCRX509GENERALNAME_IS_XXX predicate
+ * macros to figure out which member is valid (Asn1Core is always valid).
+ */
+typedef struct RTCRX509GENERALNAME
+{
+    /** Dummy ASN.1 record, not encoded. */
+    RTASN1DUMMY                         Dummy;
+    /** The value allocation. */
+    RTASN1ALLOCATION                    Allocation;
+    /** The choice of value.   */
+    RTCRX509GENERALNAMECHOICE           enmChoice;
+    /** The value union. */
+    union
+    {
+        /** Tag 0: Other.  */
+        struct
+        {
+            /** Context tag 0. */
+            RTASN1CONTEXTTAG0           CtxTag0;
+            /** User defined. */
+            RTASN1DYNTYPE               Other;
+        } *pT0;
+        /** Tag 1: RFC-822 Name.  */
+        PRTASN1STRING                   pT1_Rfc822;
+        /** Tag 2: DNS name.  */
+        PRTASN1STRING                   pT2_DnsName;
+        /** Tag 3: X.400 Address.  */
+        struct
+        {
+            /** Context tag 3. */
+            RTASN1CONTEXTTAG3           CtxTag3;
+            /** Later. */
+            RTASN1DYNTYPE               X400Address;
+        } *pT3;
+        /** Tag 4: Directory Name.  */
+        struct
+        {
+            /** Context tag 4. */
+            RTASN1CONTEXTTAG4           CtxTag4;
+            /** Directory name. */
+            RTCRX509NAME                DirectoryName;
+        } *pT4;
+        /** Tag 5: EDI Party Name.  */
+        struct
+        {
+            /** Context tag 5. */
+            RTASN1CONTEXTTAG5           CtxTag5;
+            /** Later. */
+            RTASN1DYNTYPE               EdiPartyName;
+        } *pT5;
+        /** Tag 6: URI.  */
+        PRTASN1STRING                   pT6_Uri;
+        /** Tag 7: IP address. Either 4/8 (IPv4) or 16/32 (IPv16) octets long. */
+        PRTASN1OCTETSTRING              pT7_IpAddress;
+        /** Tag 8: Registered ID. */
+        PRTASN1OBJID                    pT8_RegisteredId;
+    } u;
+} RTCRX509GENERALNAME;
+/** Pointer to the IPRT representation of an X.509 general name. */
+typedef RTCRX509GENERALNAME *PRTCRX509GENERALNAME;
+/** Pointer to the const IPRT representation of an X.509 general name. */
+typedef RTCRX509GENERALNAME const *PCRTCRX509GENERALNAME;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509GENERALNAME, RTDECL, RTCrX509GeneralName, Dummy.Asn1Core);
+
+/** @name RTCRX509GENERALNAME tag predicates.
+ * @{ */
+#define RTCRX509GENERALNAME_IS_OTHER_NAME(a_GenName)        ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_OTHER_NAME)
+#define RTCRX509GENERALNAME_IS_RFC822_NAME(a_GenName)       ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_RFC822_NAME)
+#define RTCRX509GENERALNAME_IS_DNS_NAME(a_GenName)          ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_DNS_NAME)
+#define RTCRX509GENERALNAME_IS_X400_ADDRESS(a_GenName)      ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_X400_ADDRESS)
+#define RTCRX509GENERALNAME_IS_DIRECTORY_NAME(a_GenName)    ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME)
+#define RTCRX509GENERALNAME_IS_EDI_PARTY_NAME(a_GenName)    ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME)
+#define RTCRX509GENERALNAME_IS_URI(a_GenName)               ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_URI)
+#define RTCRX509GENERALNAME_IS_IP_ADDRESS(a_GenName)        ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_IP_ADDRESS)
+#define RTCRX509GENERALNAME_IS_REGISTERED_ID(a_GenName)     ((a_GenName)->enmChoice == RTCRX509GENERALNAMECHOICE_REGISTERED_ID)
+/** @} */
+
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509GENERALNAMES, RTCRX509GENERALNAME, RTDECL, RTCrX509GeneralNames);
+RTDECL(bool) RTCrX509GeneralName_ConstraintMatch(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName);
+
+
+/**
+ * X.509 Validity (IPRT representation).
+ */
+typedef struct RTCRX509VALIDITY
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Effective starting. */
+    RTASN1TIME                          NotBefore;
+    /** Expires after. */
+    RTASN1TIME                          NotAfter;
+} RTCRX509VALIDITY;
+/** Pointer to the IPRT representation of an X.509 validity sequence. */
+typedef RTCRX509VALIDITY *PRTCRX509VALIDITY;
+/** Pointer ot the const IPRT representation of an X.509 validity sequence. */
+typedef RTCRX509VALIDITY const *PCRTCRX509VALIDITY;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509VALIDITY, RTDECL, RTCrX509Validity, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrX509Validity_IsValidAtTimeSpec(PCRTCRX509VALIDITY pThis, PCRTTIMESPEC pTimeSpec);
+
+
+#if 0
+/**
+ * X.509 UniqueIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509UNIQUEIDENTIFIER
+{
+    /** Representation is a bit string. */
+    RTASN1BITSTRING                     BitString;
+} RTCRX509UNIQUEIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 unique identifier. */
+typedef RTCRX509UNIQUEIDENTIFIER *PRTCRX509UNIQUEIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 unique identifier. */
+typedef RTCRX509UNIQUEIDENTIFIER const *PCRTCRX509UNIQUEIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES_NO_GET_CORE(RTCRX509UNIQUEIDENTIFIER, RTDECL, RTCrX509UniqueIdentifier);
+#endif
+RTASN1TYPE_ALIAS(RTCRX509UNIQUEIDENTIFIER, RTASN1BITSTRING, RTCrX509UniqueIdentifier, RTAsn1BitString);
+
+
+/**
+ * X.509 SubjectPublicKeyInfo (IPRT representation).
+ */
+typedef struct RTCRX509SUBJECTPUBLICKEYINFO
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The algorithm used with the public key. */
+    RTCRX509ALGORITHMIDENTIFIER         Algorithm;
+    /** A bit string containing the public key.
+     *
+     * For algorithms like rsaEncryption this is generally a sequence of two
+     * integers, where the first one has lots of bits, and the second one being a
+     * modulous value.  These are details specific to the algorithm and not relevant
+     * when validating the certificate chain. */
+    RTASN1BITSTRING                     SubjectPublicKey;
+} RTCRX509SUBJECTPUBLICKEYINFO;
+/** Pointer to the IPRT representation of an X.509 subject public key info
+ *  sequence. */
+typedef RTCRX509SUBJECTPUBLICKEYINFO *PRTCRX509SUBJECTPUBLICKEYINFO;
+/** Pointer to the const IPRT representation of an X.509 subject public key info
+ *  sequence. */
+typedef RTCRX509SUBJECTPUBLICKEYINFO const *PCRTCRX509SUBJECTPUBLICKEYINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509SUBJECTPUBLICKEYINFO, RTDECL, RTCrX509SubjectPublicKeyInfo, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509AUTHORITYKEYIDENTIFIER
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE              SeqCore;
+    /** Tag 0, optional, implicit: Key identifier. */
+    RTASN1OCTETSTRING               KeyIdentifier;
+    /** Tag 1, optional, implicit: Issuer name. */
+    RTCRX509GENERALNAMES            AuthorityCertIssuer;
+    /** Tag 2, optional, implicit: Serial number of issuer. */
+    RTASN1INTEGER                   AuthorityCertSerialNumber;
+}  RTCRX509AUTHORITYKEYIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509AUTHORITYKEYIDENTIFIER *PRTCRX509AUTHORITYKEYIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509AUTHORITYKEYIDENTIFIER const *PCRTCRX509AUTHORITYKEYIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509AUTHORITYKEYIDENTIFIER, RTDECL, RTCrX509AuthorityKeyIdentifier, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 OldAuthorityKeyIdentifier (IPRT representation).
+ */
+typedef struct RTCRX509OLDAUTHORITYKEYIDENTIFIER
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE              SeqCore;
+    /** Tag 0, optional, implicit: Key identifier. */
+    RTASN1OCTETSTRING               KeyIdentifier;
+    struct
+    {
+        RTASN1CONTEXTTAG1           CtxTag1;
+        /** Tag 1, optional, implicit: Issuer name. */
+        RTCRX509NAME                AuthorityCertIssuer;
+    } T1;
+    /** Tag 2, optional, implicit: Serial number of issuer. */
+    RTASN1INTEGER                   AuthorityCertSerialNumber;
+}  RTCRX509OLDAUTHORITYKEYIDENTIFIER;
+/** Pointer to the IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509OLDAUTHORITYKEYIDENTIFIER *PRTCRX509OLDAUTHORITYKEYIDENTIFIER;
+/** Pointer to the const IPRT representation of an X.509 AuthorityKeyIdentifier
+ * sequence. */
+typedef RTCRX509OLDAUTHORITYKEYIDENTIFIER const *PCRTCRX509OLDAUTHORITYKEYIDENTIFIER;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509OLDAUTHORITYKEYIDENTIFIER, RTDECL, RTCrX509OldAuthorityKeyIdentifier, SeqCore.Asn1Core);
+
+
+/**
+ * One X.509 PolicyQualifierInfo (IPRT representation).
+ */
+typedef struct RTCRX509POLICYQUALIFIERINFO
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The policy object ID. */
+    RTASN1OBJID                         PolicyQualifierId;
+    /** Anything defined by the policy qualifier id. */
+    RTASN1DYNTYPE                       Qualifier;
+} RTCRX509POLICYQUALIFIERINFO;
+/** Pointer to the IPRT representation of an X.509 PolicyQualifierInfo
+ * sequence. */
+typedef RTCRX509POLICYQUALIFIERINFO *PRTCRX509POLICYQUALIFIERINFO;
+/** Pointer to the const IPRT representation of an X.509 PolicyQualifierInfo
+ * sequence. */
+typedef RTCRX509POLICYQUALIFIERINFO const *PCRTCRX509POLICYQUALIFIERINFO;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYQUALIFIERINFO, RTDECL, RTCrX509PolicyQualifierInfo, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509POLICYQUALIFIERINFOS, RTCRX509POLICYQUALIFIERINFO, RTDECL, RTCrX509PolicyQualifierInfos);
+
+
+/**
+ * One X.509 PolicyInformation (IPRT representation).
+ */
+typedef struct RTCRX509POLICYINFORMATION
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The policy object ID. */
+    RTASN1OBJID                         PolicyIdentifier;
+    /** Optional sequence of policy qualifiers. */
+    RTCRX509POLICYQUALIFIERINFOS        PolicyQualifiers;
+} RTCRX509POLICYINFORMATION;
+/** Pointer to the IPRT representation of an X.509 PolicyInformation
+ * sequence. */
+typedef RTCRX509POLICYINFORMATION *PRTCRX509POLICYINFORMATION;
+/** Pointer to the const IPRT representation of an X.509 PolicyInformation
+ * sequence. */
+typedef RTCRX509POLICYINFORMATION const *PCRTCRX509POLICYINFORMATION;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYINFORMATION, RTDECL, RTCrX509PolicyInformation, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509CERTIFICATEPOLICIES, RTCRX509POLICYINFORMATION, RTDECL, RTCrX509CertificatePolicies);
+
+/** Sepcial policy object ID that matches any policy. */
+#define RTCRX509_ID_CE_CP_ANY_POLICY_OID    "2.5.29.32.0"
+
+
+/**
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+typedef struct RTCRX509POLICYMAPPING
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Issuer policy ID. */
+    RTASN1OBJID                         IssuerDomainPolicy;
+    /** Subject policy ID. */
+    RTASN1OBJID                         SubjectDomainPolicy;
+} RTCRX509POLICYMAPPING;
+/** Pointer to the IPRT representation of a sequence of X.509 PolicyMapping. */
+typedef RTCRX509POLICYMAPPING *PRTCRX509POLICYMAPPING;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * PolicyMapping. */
+typedef RTCRX509POLICYMAPPING const *PCRTCRX509POLICYMAPPING;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYMAPPING, RTDECL, RTCrX509PolicyMapping, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509POLICYMAPPINGS, RTCRX509POLICYMAPPING, RTDECL, RTCrX509PolicyMappings);
+
+
+/**
+ * X.509 BasicConstraints (IPRT representation).
+ */
+typedef struct RTCRX509BASICCONSTRAINTS
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Is this ia certficiate authority? Default to false. */
+    RTASN1BOOLEAN                       CA;
+    /** Path length constraint. */
+    RTASN1INTEGER                       PathLenConstraint;
+} RTCRX509BASICCONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ *  BasicConstraints. */
+typedef RTCRX509BASICCONSTRAINTS *PRTCRX509BASICCONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * BasicConstraints. */
+typedef RTCRX509BASICCONSTRAINTS const *PCRTCRX509BASICCONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509BASICCONSTRAINTS, RTDECL, RTCrX509BasicConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+typedef struct RTCRX509GENERALSUBTREE
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Base name. */
+    RTCRX509GENERALNAME                 Base;
+    /** Tag 0, optional: Minimum, default 0.  Fixed at 0 by RFC-5280. */
+    RTASN1INTEGER                       Minimum;
+    /** Tag 1, optional: Maximum. Fixed as not-present by RFC-5280. */
+    RTASN1INTEGER                       Maximum;
+} RTCRX509GENERALSUBTREE;
+/** Pointer to the IPRT representation of a sequence of X.509 GeneralSubtree. */
+typedef RTCRX509GENERALSUBTREE *PRTCRX509GENERALSUBTREE;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * GeneralSubtree. */
+typedef RTCRX509GENERALSUBTREE const *PCRTCRX509GENERALSUBTREE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509GENERALSUBTREE, RTDECL, RTCrX509GeneralSubtree, SeqCore.Asn1Core);
+
+RTDECL(bool) RTCrX509GeneralSubtree_ConstraintMatch(PCRTCRX509GENERALSUBTREE pConstraint, PCRTCRX509GENERALSUBTREE pName);
+
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509GENERALSUBTREES, RTCRX509GENERALSUBTREE, RTDECL, RTCrX509GeneralSubtrees);
+
+
+/**
+ * X.509 NameConstraints (IPRT representation).
+ */
+typedef struct RTCRX509NAMECONSTRAINTS
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Tag 0, optional: Permitted subtrees. */
+    struct
+    {
+        /** Context tag. */
+        RTASN1CONTEXTTAG0               CtxTag0;
+        /** The permitted subtrees. */
+        RTCRX509GENERALSUBTREES         PermittedSubtrees;
+    } T0;
+    /** Tag 1, optional: Excluded subtrees. */
+    struct
+    {
+        /** Context tag. */
+        RTASN1CONTEXTTAG1               CtxTag1;
+        /** The excluded subtrees. */
+        RTCRX509GENERALSUBTREES         ExcludedSubtrees;
+    } T1;
+} RTCRX509NAMECONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ *  NameConstraints. */
+typedef RTCRX509NAMECONSTRAINTS *PRTCRX509NAMECONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * NameConstraints. */
+typedef RTCRX509NAMECONSTRAINTS const *PCRTCRX509NAMECONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509NAMECONSTRAINTS, RTDECL, RTCrX509NameConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+typedef struct RTCRX509POLICYCONSTRAINTS
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Tag 0, optional: Certificates before an explicit policy is required. */
+    RTASN1INTEGER                       RequireExplicitPolicy;
+    /** Tag 1, optional: Certificates before policy mapping is inhibited. */
+    RTASN1INTEGER                       InhibitPolicyMapping;
+} RTCRX509POLICYCONSTRAINTS;
+/** Pointer to the IPRT representation of a sequence of X.509
+ *  PolicyConstraints. */
+typedef RTCRX509POLICYCONSTRAINTS *PRTCRX509POLICYCONSTRAINTS;
+/** Pointer to the const IPRT representation of a sequence of X.509
+ * PolicyConstraints. */
+typedef RTCRX509POLICYCONSTRAINTS const *PCRTCRX509POLICYCONSTRAINTS;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509POLICYCONSTRAINTS, RTDECL, RTCrX509PolicyConstraints, SeqCore.Asn1Core);
+
+
+/**
+ * Indicates what an X.509 extension value encapsulates.
+ */
+typedef enum RTCRX509EXTENSIONVALUE
+{
+    RTCRX509EXTENSIONVALUE_INVALID = 0,
+    /** Unknown, no decoding available just the octet string. */
+    RTCRX509EXTENSIONVALUE_UNKNOWN,
+    /** Unencapsulated (i.e. octet string). */
+    RTCRX509EXTENSIONVALUE_NOT_ENCAPSULATED,
+
+    /** Bit string (RTASN1BITSTRING). */
+    RTCRX509EXTENSIONVALUE_BIT_STRING,
+    /** Octet string (RTASN1OCTETSTRING). */
+    RTCRX509EXTENSIONVALUE_OCTET_STRING,
+    /** Integer string (RTASN1INTEGER). */
+    RTCRX509EXTENSIONVALUE_INTEGER,
+    /** Sequence of object identifiers (RTASN1SEQOFOBJIDS). */
+    RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS,
+
+    /** Authority key identifier (RTCRX509AUTHORITYKEYIDENTIFIER). */
+    RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER,
+    /** Old Authority key identifier (RTCRX509OLDAUTHORITYKEYIDENTIFIER). */
+    RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER,
+    /** Certificate policies (RTCRX509CERTIFICATEPOLICIES). */
+    RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES,
+    /** Sequence of policy mappings (RTCRX509POLICYMAPPINGS). */
+    RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS,
+    /** Basic constraints (RTCRX509BASICCONSTRAINTS). */
+    RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS,
+    /** Name constraints (RTCRX509NAMECONSTRAINTS). */
+    RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS,
+    /** Policy constraints (RTCRX509POLICYCONSTRAINTS). */
+    RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS,
+    /** Sequence of general names (RTCRX509GENERALNAMES). */
+    RTCRX509EXTENSIONVALUE_GENERAL_NAMES,
+
+    /** Blow the type up to 32-bits. */
+    RTCRX509EXTENSIONVALUE_32BIT_HACK = 0x7fffffff
+} RTCRX509EXTENSIONVALUE;
+
+/**
+ * One X.509 Extension (IPRT representation).
+ */
+typedef struct RTCRX509EXTENSION
+{
+    /** Core sequence bits. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Extension ID. */
+    RTASN1OBJID                         ExtnId;
+    /** Whether this is critical (default @c false). */
+    RTASN1BOOLEAN                       Critical;
+    /** Indicates what ExtnValue.pEncapsulated points at. */
+    RTCRX509EXTENSIONVALUE              enmValue;
+    /** The value.
+     * Contains extension specific data that we don't yet parse. */
+    RTASN1OCTETSTRING                   ExtnValue;
+} RTCRX509EXTENSION;
+/** Pointer to the IPRT representation of one X.509 extensions. */
+typedef RTCRX509EXTENSION *PRTCRX509EXTENSION;
+/** Pointer to the const IPRT representation of one X.509 extension. */
+typedef RTCRX509EXTENSION const *PCRTCRX509EXTENSION;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509EXTENSION, RTDECL, RTCrX509Extension, SeqCore.Asn1Core);
+RTASN1_IMPL_GEN_SEQ_OF_TYPEDEFS_AND_PROTOS(RTCRX509EXTENSIONS, RTCRX509EXTENSION, RTDECL, RTCrX509Extensions);
+
+RTDECL(int) RTCrX509Extension_ExtnValue_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                                   PRTCRX509EXTENSION pThis, const char *pszErrorTag);
+
+
+/**
+ * X.509 To-be-signed certificate information (IPRT representation).
+ */
+typedef struct RTCRX509TBSCERTIFICATE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** Structure version. */
+    struct
+    {
+        /** Context tag with value 0. */
+        RTASN1CONTEXTTAG0               CtxTag0;
+        /** The actual value (RTCRX509TBSCERTIFICATE_V1, ...). */
+        RTASN1INTEGER                   Version;
+    } T0;
+    /** The serial number of the certificate. */
+    RTASN1INTEGER                       SerialNumber;
+    /** The signature algorithm. */
+    RTCRX509ALGORITHMIDENTIFIER         Signature;
+    /** The issuer name. */
+    RTCRX509NAME                        Issuer;
+    /** The certificate validity period. */
+    RTCRX509VALIDITY                    Validity;
+    /** The subject name. */
+    RTCRX509NAME                        Subject;
+    /** The public key for this certificate.  */
+    RTCRX509SUBJECTPUBLICKEYINFO        SubjectPublicKeyInfo;
+    /** Issuer unique identifier (optional, version >= v2).  */
+    struct
+    {
+        /** Context tag with value 1. */
+        RTASN1CONTEXTTAG1               CtxTag1;
+        /** The unique identifier value. */
+        RTCRX509UNIQUEIDENTIFIER        IssuerUniqueId;
+    } T1;
+    /** Subject unique identifier (optional, version >= v2).  */
+    struct
+    {
+        /** Context tag with value 2. */
+        RTASN1CONTEXTTAG2               CtxTag2;
+        /** The unique identifier value. */
+        RTCRX509UNIQUEIDENTIFIER        SubjectUniqueId;
+    } T2;
+    /** Extensions (optional, version >= v3).  */
+    struct
+    {
+        /** Context tag with value 3. */
+        RTASN1CONTEXTTAG3               CtxTag3;
+        /** The unique identifier value. */
+        RTCRX509EXTENSIONS              Extensions;
+        /** Extensions summary flags. */
+        uint32_t                        fFlags;
+        /** Key usage flags. */
+        uint32_t                        fKeyUsage;
+        /** Extended key usage flags. */
+        uint32_t                        fExtKeyUsage;
+
+        /** Pointer to the authority key ID extension if present. */
+        PCRTCRX509AUTHORITYKEYIDENTIFIER pAuthorityKeyIdentifier;
+        /** Pointer to the OLD authority key ID extension if present. */
+        PCRTCRX509OLDAUTHORITYKEYIDENTIFIER pOldAuthorityKeyIdentifier;
+        /** Pointer to the subject key ID extension if present. */
+        PCRTASN1OCTETSTRING             pSubjectKeyIdentifier;
+        /** Pointer to the alternative subject name extension if present. */
+        PCRTCRX509GENERALNAMES          pAltSubjectName;
+        /** Pointer to the alternative issuer name extension if present. */
+        PCRTCRX509GENERALNAMES          pAltIssuerName;
+        /** Pointer to the certificate policies extension if present. */
+        PCRTCRX509CERTIFICATEPOLICIES   pCertificatePolicies;
+        /** Pointer to the policy mappings extension if present. */
+        PCRTCRX509POLICYMAPPINGS        pPolicyMappings;
+        /** Pointer to the basic constraints extension if present. */
+        PCRTCRX509BASICCONSTRAINTS      pBasicConstraints;
+        /** Pointer to the name constraints extension if present. */
+        PCRTCRX509NAMECONSTRAINTS       pNameConstraints;
+        /** Pointer to the policy constraints extension if present. */
+        PCRTCRX509POLICYCONSTRAINTS     pPolicyConstraints;
+        /** Pointer to the inhibit anyPolicy extension if present. */
+        PCRTASN1INTEGER                 pInhibitAnyPolicy;
+    } T3;
+} RTCRX509TBSCERTIFICATE;
+/** Pointer to the IPRT representation of a X.509 TBSCertificate. */
+typedef RTCRX509TBSCERTIFICATE *PRTCRX509TBSCERTIFICATE;
+/** Pointer to the const IPRT representation of a X.509 TBSCertificate. */
+typedef RTCRX509TBSCERTIFICATE const *PCRTCRX509TBSCERTIFICATE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509TBSCERTIFICATE, RTDECL, RTCrX509TbsCertificate, SeqCore.Asn1Core);
+
+/** @name RTCRX509TBSCERTIFICATE::T0.Version values.
+ * @{ */
+#define RTCRX509TBSCERTIFICATE_V1   0
+#define RTCRX509TBSCERTIFICATE_V2   1
+#define RTCRX509TBSCERTIFICATE_V3   2
+/** @} */
+
+/** @name RTCRX509TBSCERTIFICATE::T3.fFlags values.
+ * @{ */
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE                      RT_BIT_32(0)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE                  RT_BIT_32(1)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER         RT_BIT_32(2)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_ALT_NAME               RT_BIT_32(3)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_ISSUER_ALT_NAME                RT_BIT_32(4)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_CERTIFICATE_POLICIES           RT_BIT_32(5)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_MAPPINGS                RT_BIT_32(6)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_BASIC_CONSTRAINTS              RT_BIT_32(7)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_NAME_CONSTRAINTS               RT_BIT_32(8)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_CONSTRAINTS             RT_BIT_32(9)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER       RT_BIT_32(10)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER   RT_BIT_32(11)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_ACCEPTABLE_CERT_POLICIES       RT_BIT_32(12)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_INHIBIT_ANY_POLICY             RT_BIT_32(13)
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_OTHER                          RT_BIT_32(22) /**< Other unknown extension present. */
+#define RTCRX509TBSCERTIFICATE_F_PRESENT_NONE                           RT_BIT_32(23) /**< No extensions present. */
+/** @} */
+
+/** @name X.509 Key Usage flags. (RFC-5280 section 4.2.1.3.)
+ * @{ */
+#define RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE_BIT      0
+#define RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE          RT_BIT_32(0)
+#define RTCRX509CERT_KEY_USAGE_F_CONTENT_COMMITTMENT_BIT    1
+#define RTCRX509CERT_KEY_USAGE_F_CONTENT_COMMITTMENT        RT_BIT_32(1)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_ENCIPHERMENT_BIT       2
+#define RTCRX509CERT_KEY_USAGE_F_KEY_ENCIPHERMENT           RT_BIT_32(2)
+#define RTCRX509CERT_KEY_USAGE_F_DATA_ENCIPHERMENT_BIT      3
+#define RTCRX509CERT_KEY_USAGE_F_DATA_ENCIPHERMENT          RT_BIT_32(3)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_AGREEMENT_BIT          4
+#define RTCRX509CERT_KEY_USAGE_F_KEY_AGREEMENT              RT_BIT_32(4)
+#define RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN_BIT          5
+#define RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN              RT_BIT_32(5)
+#define RTCRX509CERT_KEY_USAGE_F_CRL_SIGN_BIT               6
+#define RTCRX509CERT_KEY_USAGE_F_CRL_SIGN                   RT_BIT_32(6)
+#define RTCRX509CERT_KEY_USAGE_F_ENCIPHERMENT_ONLY_BIT      7
+#define RTCRX509CERT_KEY_USAGE_F_ENCIPHERMENT_ONLY          RT_BIT_32(7)
+#define RTCRX509CERT_KEY_USAGE_F_DECIPHERMENT_ONLY_BIT      8
+#define RTCRX509CERT_KEY_USAGE_F_DECIPHERMENT_ONLY          RT_BIT_32(8)
+/** @} */
+
+/** @name X.509 Extended Key Usage flags. (RFC-5280 section 4.2.1.12, ++.)
+ * @remarks Needless to say, these flags doesn't cover all possible extended key
+ *          usages, because there is a potential unlimited number of them.  Only
+ *          ones relevant to IPRT and it's users are covered.
+ * @{ */
+#define RTCRX509CERT_EKU_F_ANY                              RT_BIT_64(0)
+#define RTCRX509CERT_EKU_F_SERVER_AUTH                      RT_BIT_64(1)
+#define RTCRX509CERT_EKU_F_CLIENT_AUTH                      RT_BIT_64(2)
+#define RTCRX509CERT_EKU_F_CODE_SIGNING                     RT_BIT_64(3)
+#define RTCRX509CERT_EKU_F_EMAIL_PROTECTION                 RT_BIT_64(4)
+#define RTCRX509CERT_EKU_F_IPSEC_END_SYSTEM                 RT_BIT_64(5)
+#define RTCRX509CERT_EKU_F_IPSEC_TUNNEL                     RT_BIT_64(6)
+#define RTCRX509CERT_EKU_F_IPSEC_USER                       RT_BIT_64(7)
+#define RTCRX509CERT_EKU_F_TIME_STAMPING                    RT_BIT_64(8)
+#define RTCRX509CERT_EKU_F_OCSP_SIGNING                     RT_BIT_64(9)
+#define RTCRX509CERT_EKU_F_DVCS                             RT_BIT_64(10)
+#define RTCRX509CERT_EKU_F_SBGP_CERT_AA_SERVICE_AUTH        RT_BIT_64(11)
+#define RTCRX509CERT_EKU_F_EAP_OVER_PPP                     RT_BIT_64(12)
+#define RTCRX509CERT_EKU_F_EAP_OVER_LAN                     RT_BIT_64(13)
+#define RTCRX509CERT_EKU_F_OTHER                            RT_BIT_64(16) /**< Other unknown extended key usage present. */
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING               RT_BIT_64(24)
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_DEVELOPMENT   RT_BIT_64(25)
+#define RTCRX509CERT_EKU_F_APPLE_SOFTWARE_UPDATE_SIGNING    RT_BIT_64(26)
+#define RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_THIRD_PARTY   RT_BIT_64(27)
+#define RTCRX509CERT_EKU_F_APPLE_RESOURCE_SIGNING           RT_BIT_64(28)
+#define RTCRX509CERT_EKU_F_APPLE_SYSTEM_IDENTITY            RT_BIT_64(29)
+#define RTCRX509CERT_EKU_F_MS_TIMESTAMP_SIGNING             RT_BIT_64(32)
+#define RTCRX509CERT_EKU_F_MS_NT5_CRYPTO                    RT_BIT_64(33)
+#define RTCRX509CERT_EKU_F_MS_OEM_WHQL_CRYPTO               RT_BIT_64(34)
+#define RTCRX509CERT_EKU_F_MS_EMBEDDED_NT_CRYPTO            RT_BIT_64(35)
+#define RTCRX509CERT_EKU_F_MS_KERNEL_MODE_CODE_SIGNING      RT_BIT_64(36)
+#define RTCRX509CERT_EKU_F_MS_LIFETIME_SIGNING              RT_BIT_64(37)
+#define RTCRX509CERT_EKU_F_MS_DRM                           RT_BIT_64(38)
+#define RTCRX509CERT_EKU_F_MS_DRM_INDIVIDUALIZATION         RT_BIT_64(39)
+/** @} */
+
+/** @name Key purpose OIDs (extKeyUsage)
+ * @{ */
+#define RTCRX509_ANY_EXTENDED_KEY_USAGE_OID                 "2.5.29.37.0"
+#define RTCRX509_ID_KP_OID                                  "1.3.6.1.5.5.7.3"
+#define RTCRX509_ID_KP_SERVER_AUTH_OID                      "1.3.6.1.5.5.7.3.1"
+#define RTCRX509_ID_KP_CLIENT_AUTH_OID                      "1.3.6.1.5.5.7.3.2"
+#define RTCRX509_ID_KP_CODE_SIGNING_OID                     "1.3.6.1.5.5.7.3.3"
+#define RTCRX509_ID_KP_EMAIL_PROTECTION_OID                 "1.3.6.1.5.5.7.3.4"
+#define RTCRX509_ID_KP_IPSEC_END_SYSTEM_OID                 "1.3.6.1.5.5.7.3.5"
+#define RTCRX509_ID_KP_IPSEC_TUNNEL_OID                     "1.3.6.1.5.5.7.3.6"
+#define RTCRX509_ID_KP_IPSEC_USER_OID                       "1.3.6.1.5.5.7.3.7"
+#define RTCRX509_ID_KP_TIME_STAMPING_OID                    "1.3.6.1.5.5.7.3.8"
+#define RTCRX509_ID_KP_OCSP_SIGNING_OID                     "1.3.6.1.5.5.7.3.9"
+#define RTCRX509_ID_KP_DVCS_OID                             "1.3.6.1.5.5.7.3.10"
+#define RTCRX509_ID_KP_SBGP_CERT_AA_SERVICE_AUTH_OID        "1.3.6.1.5.5.7.3.11"
+#define RTCRX509_ID_KP_EAP_OVER_PPP_OID                     "1.3.6.1.5.5.7.3.13"
+#define RTCRX509_ID_KP_EAP_OVER_LAN_OID                     "1.3.6.1.5.5.7.3.14"
+/** @} */
+
+/** @name Microsoft extended key usage OIDs
+ * @{ */
+#define RTCRX509_MS_EKU_CERT_TRUST_LIST_SIGNING_OID         "1.3.6.1.4.1.311.10.3.1"
+#define RTCRX509_MS_EKU_TIMESTAMP_SIGNING_OID               "1.3.6.1.4.1.311.10.3.2"
+#define RTCRX509_MS_EKU_SERVER_GATED_CRYPTO_OID             "1.3.6.1.4.1.311.10.3.3"
+#define RTCRX509_MS_EKU_SGC_SERIALIZED_OID                  "1.3.6.1.4.1.311.10.3.3.1"
+#define RTCRX509_MS_EKU_ENCRYPTED_FILE_SYSTEM_OID           "1.3.6.1.4.1.311.10.3.4"
+#define RTCRX509_MS_EKU_WHQL_CRYPTO_OID                     "1.3.6.1.4.1.311.10.3.5"
+#define RTCRX509_MS_EKU_NT5_CRYPTO_OID                      "1.3.6.1.4.1.311.10.3.6"
+#define RTCRX509_MS_EKU_OEM_WHQL_CRYPTO_OID                 "1.3.6.1.4.1.311.10.3.7"
+#define RTCRX509_MS_EKU_EMBEDDED_NT_CRYPTO_OID              "1.3.6.1.4.1.311.10.3.8"
+#define RTCRX509_MS_EKU_ROOT_LIST_SIGNER_OID                "1.3.6.1.4.1.311.10.3.9"
+#define RTCRX509_MS_EKU_QUALIFIED_SUBORDINATE_OID           "1.3.6.1.4.1.311.10.3.10"
+#define RTCRX509_MS_EKU_KEY_RECOVERY_3_OID                  "1.3.6.1.4.1.311.10.3.11"
+#define RTCRX509_MS_EKU_DOCUMENT_SIGNING_OID                "1.3.6.1.4.1.311.10.3.12"
+#define RTCRX509_MS_EKU_LIFETIME_SIGNING_OID                "1.3.6.1.4.1.311.10.3.13"
+#define RTCRX509_MS_EKU_MOBILE_DEVICE_SOFTWARE_OID          "1.3.6.1.4.1.311.10.3.14"
+#define RTCRX509_MS_EKU_SMART_DISPLAY_OID                   "1.3.6.1.4.1.311.10.3.15"
+#define RTCRX509_MS_EKU_CSP_SIGNATURE_OID                   "1.3.6.1.4.1.311.10.3.16"
+#define RTCRX509_MS_EKU_EFS_RECOVERY_OID                    "1.3.6.1.4.1.311.10.3.4.1"
+#define RTCRX509_MS_EKU_DRM_OID                             "1.3.6.1.4.1.311.10.5.1"
+#define RTCRX509_MS_EKU_DRM_INDIVIDUALIZATION_OID           "1.3.6.1.4.1.311.10.5.2"
+#define RTCRX509_MS_EKU_LICENSES_OID                        "1.3.6.1.4.1.311.10.5.3"
+#define RTCRX509_MS_EKU_LICENSE_SERVER_OID                  "1.3.6.1.4.1.311.10.5.4"
+#define RTCRX509_MS_EKU_ENROLLMENT_AGENT_OID                "1.3.6.1.4.1.311.20.2.1"
+#define RTCRX509_MS_EKU_SMARTCARD_LOGON_OID                 "1.3.6.1.4.1.311.20.2.2"
+#define RTCRX509_MS_EKU_CA_EXCHANGE_OID                     "1.3.6.1.4.1.311.21.5"
+#define RTCRX509_MS_EKU_KEY_RECOVERY_21_OID                 "1.3.6.1.4.1.311.21.6"
+#define RTCRX509_MS_EKU_SYSTEM_HEALTH_OID                   "1.3.6.1.4.1.311.47.1.1"
+#define RTCRX509_MS_EKU_SYSTEM_HEALTH_LOOPHOLE_OID          "1.3.6.1.4.1.311.47.1.3"
+#define RTCRX509_MS_EKU_KERNEL_MODE_CODE_SIGNING_OID        "1.3.6.1.4.1.311.61.1.1"
+/** @} */
+
+/** @name Microsoft extended key usage OIDs
+ * @{ */
+#define RTCRX509_APPLE_EKU_APPLE_EXTENDED_KEY_USAGE_OID     "1.2.840.113635.100.4"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_OID                 "1.2.840.113635.100.4.1"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_DEVELOPMENT_OID     "1.2.840.113635.100.4.1.1"
+#define RTCRX509_APPLE_EKU_SOFTWARE_UPDATE_SIGNING_OID      "1.2.840.113635.100.4.1.2"
+#define RTCRX509_APPLE_EKU_CODE_SIGNING_THRID_PARTY_OID     "1.2.840.113635.100.4.1.3"
+#define RTCRX509_APPLE_EKU_RESOURCE_SIGNING_OID             "1.2.840.113635.100.4.1.4"
+#define RTCRX509_APPLE_EKU_ICHAT_SIGNING_OID                "1.2.840.113635.100.4.2"
+#define RTCRX509_APPLE_EKU_ICHAT_ENCRYPTION_OID             "1.2.840.113635.100.4.3"
+#define RTCRX509_APPLE_EKU_SYSTEM_IDENTITY_OID              "1.2.840.113635.100.4.4"
+#define RTCRX509_APPLE_EKU_CRYPTO_ENV_OID                   "1.2.840.113635.100.4.5"
+#define RTCRX509_APPLE_EKU_CRYPTO_PRODUCTION_ENV_OID        "1.2.840.113635.100.4.5.1"
+#define RTCRX509_APPLE_EKU_CRYPTO_MAINTENANCE_ENV_OID       "1.2.840.113635.100.4.5.2"
+#define RTCRX509_APPLE_EKU_CRYPTO_TEST_ENV_OID              "1.2.840.113635.100.4.5.3"
+#define RTCRX509_APPLE_EKU_CRYPTO_DEVELOPMENT_ENV_OID       "1.2.840.113635.100.4.5.4"
+#define RTCRX509_APPLE_EKU_CRYPTO_QOS_OID                   "1.2.840.113635.100.4.6"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER0_QOS_OID             "1.2.840.113635.100.4.6.1"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER1_QOS_OID             "1.2.840.113635.100.4.6.2"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER2_QOS_OID             "1.2.840.113635.100.4.6.3"
+#define RTCRX509_APPLE_EKU_CRYPTO_TIER3_QOS_OID             "1.2.840.113635.100.4.6.4"
+/** @} */
+
+/**
+ * Use this to update derived values after changing the certificate
+ * extensions.
+ *
+ * @returns IPRT status code
+ * @param   pThis       The certificate.
+ * @param   pErrInfo    Where to return additional error information. Optional.
+ */
+RTDECL(int) RTCrX509TbsCertificate_ReprocessExtensions(PRTCRX509TBSCERTIFICATE pThis, PRTERRINFO pErrInfo);
+
+
+/**
+ * One X.509 Certificate (IPRT representation).
+ */
+typedef struct RTCRX509CERTIFICATE
+{
+    /** Sequence core. */
+    RTASN1SEQUENCECORE                  SeqCore;
+    /** The to-be-signed certificate information. */
+    RTCRX509TBSCERTIFICATE              TbsCertificate;
+    /** The signature algorithm (must match TbsCertificate.Signature). */
+    RTCRX509ALGORITHMIDENTIFIER         SignatureAlgorithm;
+    /** The signature value. */
+    RTASN1BITSTRING                     SignatureValue;
+} RTCRX509CERTIFICATE;
+/** Pointer to the IPRT representation of one X.509 certificate. */
+typedef RTCRX509CERTIFICATE *PRTCRX509CERTIFICATE;
+/** Pointer to the const IPRT representation of one X.509 certificate. */
+typedef RTCRX509CERTIFICATE const *PCRTCRX509CERTIFICATE;
+RTASN1TYPE_STANDARD_PROTOTYPES(RTCRX509CERTIFICATE, RTDECL, RTCrX509Certificate, SeqCore.Asn1Core);
+
+/**
+ * Checks if a certificate matches a given issuer name and serial number.
+ *
+ * @returns True / false.
+ * @param   pCertificates   The X.509 certificat.
+ * @param   pIssuer         The issuer name to match against.
+ * @param   pSerialNumber   The serial number to match against.
+ */
+RTDECL(bool) RTCrX509Certificate_MatchIssuerAndSerialNumber(PCRTCRX509CERTIFICATE pCertificate,
+                                                            PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber);
+
+RTDECL(bool) RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(PCRTCRX509CERTIFICATE pThis, PCRTCRX509NAME pName);
+RTDECL(bool) RTCrX509Certificate_IsSelfSigned(PCRTCRX509CERTIFICATE pCertificate);
+
+RTDECL(int) RTCrX509Certificate_VerifySignature(PCRTCRX509CERTIFICATE pThis, PCRTASN1OBJID pAlgorithm,
+                                                PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+                                                PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509Certificate_ReadFromFile(PRTCRX509CERTIFICATE pCertificate, const char *pszFilename, uint32_t fFlags,
+                                             PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo);
+
+
+/** @name X.509 Certificate Extensions
+ * @{ */
+/** Old AuthorityKeyIdentifier OID. */
+#define RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID         "2.5.29.1"
+/** Old CertificatePolicies extension OID. */
+#define RTCRX509_ID_CE_OLD_CERTIFICATE_POLICIES_OID             "2.5.29.3"
+/** Old SubjectAltName extension OID. */
+#define RTCRX509_ID_CE_OLD_SUBJECT_ALT_NAME_OID                 "2.5.29.7"
+/** Old IssuerAltName extension OID. */
+#define RTCRX509_ID_CE_OLD_ISSUER_ALT_NAME_OID                  "2.5.29.8"
+/** Old BasicContraints extension OID. */
+#define RTCRX509_ID_CE_OLD_BASIC_CONSTRAINTS_OID                "2.5.29.10"
+/** SubjectKeyIdentifier OID. */
+#define RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID               "2.5.29.14"
+/** KeyUsage OID. */
+#define RTCRX509_ID_CE_KEY_USAGE_OID                            "2.5.29.15"
+/** PrivateKeyUsagePeriod OID. */
+#define RTCRX509_ID_CE_PRIVATE_KEY_USAGE_PERIOD_OID             "2.5.29.16"
+/** SubjectAltName extension OID. */
+#define RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID                     "2.5.29.17"
+/** IssuerAltName extension OID. */
+#define RTCRX509_ID_CE_ISSUER_ALT_NAME_OID                      "2.5.29.18"
+/** BasicContraints extension OID. */
+#define RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID                    "2.5.29.19"
+/** NameContraints extension OID. */
+#define RTCRX509_ID_CE_NAME_CONSTRAINTS_OID                     "2.5.29.30"
+/** CertificatePolicies extension OID. */
+#define RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID                 "2.5.29.32"
+/** PolicyMappings extension OID. */
+#define RTCRX509_ID_CE_POLICY_MAPPINGS_OID                      "2.5.29.33"
+/** AuthorityKeyIdentifier OID. */
+#define RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID             "2.5.29.35"
+/** PolicyContraints extension OID. */
+#define RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID                   "2.5.29.36"
+/** ExtKeyUsage (extended key usage) extension OID. */
+#define RTCRX509_ID_CE_EXT_KEY_USAGE_OID                        "2.5.29.37"
+/** ExtKeyUsage: OID for permitting any unspecified key usage. */
+#define RTCRX509_ID_CE_ANY_EXTENDED_KEY_USAGE_OID               "2.5.29.37.0"
+/** AuthorityAttributeIdentifier OID. */
+#define RTCRX509_ID_CE_AUTHORITY_ATTRIBUTE_IDENTIFIER_OID       "2.5.29.38"
+/** AcceptableCertPolicies OID. */
+#define RTCRX509_ID_CE_ACCEPTABLE_CERT_POLICIES_OID             "2.5.29.52"
+/** InhibitAnyPolicy OID. */
+#define RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID                   "2.5.29.54"
+/** @} */
+
+
+/*
+ * Sequence of X.509 Certifcates (IPRT representation).
+ */
+RTASN1_IMPL_GEN_SET_OF_TYPEDEFS_AND_PROTOS(RTCRX509CERTIFICATES, RTCRX509CERTIFICATE, RTDECL, RTCrX509Certificates);
+
+/**
+ * Looks up a certificate by issuer name and serial number.
+ *
+ * @returns Pointer to the given certificate if found, NULL if not.
+ * @param   pCertificates   The X.509 certificate set to search.
+ * @param   pIssuer         The issuer name of the wanted certificate.
+ * @param   pSerialNumber   The serial number of the wanted certificate.
+ */
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509Certificates_FindByIssuerAndSerialNumber(PCRTCRX509CERTIFICATES pCertificates,
+                                                                               PCRTCRX509NAME pIssuer,
+                                                                               PCRTASN1INTEGER pSerialNumber);
+
+
+
+RTDECL(int) RTCrX509CertPathsCreate(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget);
+RTDECL(uint32_t) RTCrX509CertPathsRetain(RTCRX509CERTPATHS hCertPaths);
+RTDECL(uint32_t) RTCrX509CertPathsRelease(RTCRX509CERTPATHS hCertPaths);
+RTDECL(int) RTCrX509CertPathsSetTrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hTrustedStore);
+RTDECL(int) RTCrX509CertPathsSetUntrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hUntrustedStore);
+RTDECL(int) RTCrX509CertPathsSetUntrustedArray(RTCRX509CERTPATHS hCertPaths, PCRTCRX509CERTIFICATE paCerts, uint32_t cCerts);
+RTDECL(int) RTCrX509CertPathsSetValidTime(RTCRX509CERTPATHS hCertPaths, PCRTTIME pTime);
+RTDECL(int) RTCrX509CertPathsSetValidTimeSpec(RTCRX509CERTPATHS hCertPaths, PCRTTIMESPEC pTimeSpec);
+RTDECL(int) RTCrX509CertPathsCreateEx(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget, RTCRSTORE hTrustedStore,
+                                      RTCRSTORE hUntrustedStore, PCRTCRX509CERTIFICATE paUntrustedCerts, uint32_t cUntrustedCerts,
+                                      PCRTTIMESPEC pValidTime);
+RTDECL(int) RTCrX509CertPathsBuild(RTCRX509CERTPATHS hCertPaths, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509CertPathsDumpOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t uVerbosity,
+                                     PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+RTDECL(int) RTCrX509CertPathsDumpAll(RTCRX509CERTPATHS hCertPaths, uint32_t uVerbosity,
+                                     PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser);
+
+RTDECL(int) RTCrX509CertPathsValidateOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, PRTERRINFO pErrInfo);
+RTDECL(int) RTCrX509CertPathsValidateAll(RTCRX509CERTPATHS hCertPaths, uint32_t *pcValidPaths, PRTERRINFO pErrInfo);
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathCount(RTCRX509CERTPATHS hCertPaths);
+RTDECL(int) RTCrX509CertPathsQueryPathInfo(RTCRX509CERTPATHS hCertPaths, uint32_t iPath,
+                                           bool *pfTrusted, uint32_t *pcNodes, PCRTCRX509NAME *ppSubject,
+                                           PCRTCRX509SUBJECTPUBLICKEYINFO *ppPublicKeyInfo,
+                                           PCRTCRX509CERTIFICATE *ppCert, PCRTCRCERTCTX *ppCertCtx, int *prcVerify);
+RTDECL(uint32_t) RTCrX509CertPathsGetPathLength(RTCRX509CERTPATHS hCertPaths, uint32_t iPath);
+RTDECL(int) RTCrX509CertPathsGetPathVerifyResult(RTCRX509CERTPATHS hCertPaths, uint32_t iPath);
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509CertPathsGetPathNodeCert(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t iNode);
+
+
+RT_C_DECLS_END
+
+/** @} */
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/dbg.h b/include/iprt/dbg.h
index 4a384a0..2dde29e 100644
--- a/include/iprt/dbg.h
+++ b/include/iprt/dbg.h
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2008-2012 Oracle Corporation
+ * Copyright (C) 2008-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -940,6 +940,16 @@ RTDECL(int)         RTDbgModCreateFromPdb(PRTDBGMOD phDbgMod, const char *pszFil
                                           PCRTUUID pUuid, uint32_t Age, RTDBGCFG hDbgCfg);
 RTDECL(int)         RTDbgModCreateFromDwo(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName, uint32_t cbImage,
                                           uint32_t uCrc32, RTDBGCFG hDbgCfg);
+RTDECL(int)         RTDbgModCreateFromMachOImage(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName,
+                                                 RTLDRARCH enmArch, uint32_t cbImage, uint32_t cSegs, PCRTDBGSEGMENT paSegs,
+                                                 PCRTUUID pUuid, RTDBGCFG hDbgCfg, uint32_t fFlags);
+
+/** @name Flags for RTDbgModCreate and friends.
+ * @{ */
+/** Overrides the hDbgCfg settings and forces an image and/or symbol file
+ *  search.  RTDbgModCreate will quietly ignore this flag. */
+#define RTDBGMOD_F_NOT_DEFERRED     RT_BIT_32(0)
+/** @} */
 
 
 /**
diff --git a/include/iprt/err.h b/include/iprt/err.h
index 5a613d8..70b3b03 100644
--- a/include/iprt/err.h
+++ b/include/iprt/err.h
@@ -437,12 +437,14 @@ DECLINLINE(PRTERRINFO) RTErrInfoInit(PRTERRINFO pErrInfo, char *pszMsg, size_t c
 /**
  * Initialize a static error info structure.
  *
+ * @returns Pointer to the core error info structure.
  * @param   pStaticErrInfo      The static error info structure to init.
  */
-DECLINLINE(void) RTErrInfoInitStatic(PRTERRINFOSTATIC pStaticErrInfo)
+DECLINLINE(PRTERRINFO) RTErrInfoInitStatic(PRTERRINFOSTATIC pStaticErrInfo)
 {
     RTErrInfoInit(&pStaticErrInfo->Core, pStaticErrInfo->szMsg, sizeof(pStaticErrInfo->szMsg));
     pStaticErrInfo->Core.fFlags = RTERRINFO_FLAGS_T_STATIC | RTERRINFO_FLAGS_MAGIC;
+    return &pStaticErrInfo->Core;
 }
 
 /**
@@ -512,6 +514,41 @@ RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFo
 RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);
 
 /**
+ * Adds more error info details.
+ *
+ * @returns @a rc.
+ *
+ * @param   pErrInfo            The error info structure to fill in.
+ * @param   rc                  The status code to return.
+ * @param   pszMsg              The error message string to add.
+ */
+RTDECL(int)         RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg);
+
+/**
+ * Adds more error info details, with a sprintf style message.
+ *
+ * @returns @a rc.
+ *
+ * @param   pErrInfo            The error info structure to fill in.
+ * @param   rc                  The status code to return.
+ * @param   pszFormat           The format string to add.
+ * @param   ...                 The format arguments.
+ */
+RTDECL(int)         RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...);
+
+/**
+ * Adds more error info details, with a vsprintf style message.
+ *
+ * @returns @a rc.
+ *
+ * @param   pErrInfo            The error info structure to fill in.
+ * @param   rc                  The status code to return.
+ * @param   pszFormat           The format string to add.
+ * @param   va                  The format arguments.
+ */
+RTDECL(int)         RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va);
+
+/**
  * Checks if the error info is set.
  *
  * @returns true if set, false if not.
@@ -1623,6 +1660,8 @@ RT_C_DECLS_END
 #define VERR_HTTP_CACERT_CANNOT_AUTHENTICATE    (-892)
 /** The current HTTP request was forcefully aborted */
 #define VERR_HTTP_ABORTED                       (-893)
+/** Request was redirected. */
+#define VERR_HTTP_REDIRECTED                    (-894)
 /** @} */
 
 /** @name RTManifest status codes
@@ -1711,6 +1750,22 @@ RT_C_DECLS_END
 #define VERR_POLL_SET_IS_FULL                   (-953)
 /** @} */
 
+/** @name Pkzip status codes
+ * @{ */
+/** No end of central directory record found. */
+#define VERR_PKZIP_NO_EOCB                      (-960)
+/** Too long name string. */
+#define VERR_PKZIP_NAME_TOO_LONG                (-961)
+/** Local file header corrupt. */
+#define VERR_PKZIP_BAD_LF_HEADER                (-962)
+/** Central directory file header corrupt. */
+#define VERR_PKZIP_BAD_CDF_HEADER               (-963)
+/** Encountered an unknown type flag. */
+#define VERR_PKZIP_UNKNOWN_TYPE_FLAG            (-964)
+/** Found a ZIP64 Extra Information Field in a ZIP32 file. */
+#define VERR_PKZIP_ZIP64EX_IN_ZIP32             (-965)
+
+
 /** @name RTZip status codes
  * @{ */
 /** Generic zip error. */
@@ -1879,6 +1934,486 @@ RT_C_DECLS_END
 /** @} */
 
 
+/** @name RTAsn1 status codes
+ * @{ */
+/** Temporary place holder.  */
+#define VERR_ASN1_ERROR                             (-22800)
+/** Encountered an ASN.1 string type that is not supported. */
+#define VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED       (-22801)
+/** Invalid ASN.1 UTF-8 STRING encoding. */
+#define VERR_ASN1_INVALID_UTF8_STRING_ENCODING      (-22802)
+/** Invalid ASN.1 NUMERIC STRING encoding. */
+#define VERR_ASN1_INVALID_NUMERIC_STRING_ENCODING   (-22803)
+/** Invalid ASN.1 PRINTABLE STRING encoding. */
+#define VERR_ASN1_INVALID_PRINTABLE_STRING_ENCODING (-22804)
+/** Invalid ASN.1 T61/TELETEX STRING encoding. */
+#define VERR_ASN1_INVALID_T61_STRING_ENCODING       (-22805)
+/** Invalid ASN.1 VIDEOTEX STRING encoding. */
+#define VERR_ASN1_INVALID_VIDEOTEX_STRING_ENCODING  (-22806)
+/** Invalid ASN.1 IA5 STRING encoding. */
+#define VERR_ASN1_INVALID_IA5_STRING_ENCODING       (-22807)
+/** Invalid ASN.1 GRAPHIC STRING encoding. */
+#define VERR_ASN1_INVALID_GRAPHIC_STRING_ENCODING   (-22808)
+/** Invalid ASN.1 ISO-646/VISIBLE STRING encoding. */
+#define VERR_ASN1_INVALID_VISIBLE_STRING_ENCODING   (-22809)
+/** Invalid ASN.1 GENERAL STRING encoding. */
+#define VERR_ASN1_INVALID_GENERAL_STRING_ENCODING   (-22810)
+/** Invalid ASN.1 UNIVERSAL STRING encoding. */
+#define VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING (-22811)
+/** Invalid ASN.1 BMP STRING encoding. */
+#define VERR_ASN1_INVALID_BMP_STRING_ENCODING       (-22812)
+/** Invalid ASN.1 OBJECT IDENTIFIER encoding. */
+#define VERR_ASN1_INVALID_OBJID_ENCODING            (-22813)
+/** A component value of an ASN.1 OBJECT IDENTIFIER is too big for our
+ * internal representation (32-bits). */
+#define VERR_ASN1_OBJID_COMPONENT_TOO_BIG           (-22814)
+/** Too many components in an ASN.1 OBJECT IDENTIFIER for our internal
+ * representation. */
+#define VERR_ASN1_OBJID_TOO_MANY_COMPONENTS         (-22815)
+/** The dotted-string representation of an ASN.1 OBJECT IDENTIFIER would be too
+ * long for our internal representation. */
+#define VERR_ASN1_OBJID_TOO_LONG_STRING_FORM        (-22816)
+/** Invalid dotted string. */
+#define VERR_ASN1_OBJID_INVALID_DOTTED_STRING       (-22817)
+/** Constructed string type not implemented. */
+#define VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL       (-22818)
+/** Expected a different string tag. */
+#define VERR_ASN1_STRING_TAG_MISMATCH               (-22819)
+/** Expected a different time tag. */
+#define VERR_ASN1_TIME_TAG_MISMATCH                 (-22820)
+/** More unconsumed data available. */
+#define VINF_ASN1_MORE_DATA                         (22821)
+/** RTAsnEncodeWriteHeader return code indicating that nothing was written
+ *  and the content should be skipped as well. */
+#define VINF_ASN1_NOT_ENCODED                       (22822)
+/** Unknown escape sequence encountered in TeletexString. */
+#define VERR_ASN1_TELETEX_UNKNOWN_ESC_SEQ           (-22823)
+/** Unsupported escape sequence encountered in TeletexString. */
+#define VERR_ASN1_TELETEX_UNSUPPORTED_ESC_SEQ       (-22824)
+/** Unsupported character set. */
+#define VERR_ASN1_TELETEX_UNSUPPORTED_CHARSET       (-22825)
+/** ASN.1 object has no virtual method table. */
+#define VERR_ASN1_NO_VTABLE                         (-22826)
+/** ASN.1 object has no pfnCheckSanity method.  */
+#define VERR_ASN1_NO_CHECK_SANITY_METHOD            (-22827)
+/** ASN.1 object is not present */
+#define VERR_ASN1_NOT_PRESENT                       (-22828)
+/** There are unconsumed bytes after decoding an ASN.1 object. */
+#define VERR_ASN1_CURSOR_NOT_AT_END                 (-22829)
+/** Long ASN.1 tag form is not implemented. */
+#define VERR_ASN1_CURSOR_LONG_TAG                   (-22830)
+/** Bad ASN.1 object length encoding. */
+#define VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING        (-22831)
+/** Indefinite length form is against the rules. */
+#define VERR_ASN1_CURSOR_ILLEGAL_IDEFINITE_LENGTH   (-22832)
+/** Indefinite length form is not implemented. */
+#define VERR_ASN1_CURSOR_IDEFINITE_LENGTH_NOT_SUP   (-22833)
+/** ASN.1 object length goes beyond the end of the byte stream being decoded. */
+#define VERR_ASN1_CURSOR_BAD_LENGTH                 (-22834)
+/** Not more data in ASN.1 byte stream. */
+#define VERR_ASN1_CURSOR_NO_MORE_DATA               (-22835)
+/** Too little data in ASN.1 byte stream. */
+#define VERR_ASN1_CURSOR_TOO_LITTLE_DATA_LEFT       (-22836)
+/** Constructed string is not according to the encoding rules. */
+#define VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING (-22837)
+/** Unexpected ASN.1 tag encountered while decoding. */
+#define VERR_ASN1_CURSOR_TAG_MISMATCH               (-22838)
+/** Unexpected ASN.1 tag class/flag encountered while decoding. */
+#define VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH    (-22839)
+/** ASN.1 bit string object is out of bounds. */
+#define VERR_ASN1_BITSTRING_OUT_OF_BOUNDS           (-22840)
+/** Bad ASN.1 time object. */
+#define VERR_ASN1_TIME_BAD_NORMALIZE_INPUT          (-22841)
+/** Failed to normalize ASN.1 time object. */
+#define VERR_ASN1_TIME_NORMALIZE_ERROR              (-22842)
+/** Normalization of ASN.1 time object didn't work out. */
+#define VERR_ASN1_TIME_NORMALIZE_MISMATCH           (-22843)
+/** Invalid ASN.1 UTC TIME encoding. */
+#define VERR_ASN1_INVALID_UTC_TIME_ENCODING         (-22844)
+/** Invalid ASN.1 GENERALIZED TIME encoding. */
+#define VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING (-22845)
+/** Invalid ASN.1 BOOLEAN encoding. */
+#define VERR_ASN1_INVALID_BOOLEAN_ENCODING          (-22846)
+/** Invalid ASN.1 NULL encoding. */
+#define VERR_ASN1_INVALID_NULL_ENCODING             (-22847)
+/** Invalid ASN.1 BIT STRING encoding. */
+#define VERR_ASN1_INVALID_BITSTRING_ENCODING        (-22848)
+/** Unimplemented ASN.1 tag reached the RTAsn1DynType code. */
+#define VERR_ASN1_DYNTYPE_TAG_NOT_IMPL              (-22849)
+/** ASN.1 tag and flags/class mismatch in RTAsn1DynType code. */
+#define VERR_ASN1_DYNTYPE_BAD_TAG                   (-22850)
+/** Unexpected ASN.1 fake/dummy object. */
+#define VERR_ASN1_DUMMY_OBJECT                      (-22851)
+/** ASN.1 object is too long. */
+#define VERR_ASN1_TOO_LONG                          (-22852)
+/** Expected primitive ASN.1 object. */
+#define VERR_ASN1_EXPECTED_PRIMITIVE                (-22853)
+/** Expected valid data pointer for ASN.1 object. */
+#define VERR_ASN1_INVALID_DATA_POINTER              (-22854)
+
+/** ANS.1 internal error 1. */
+#define VERR_ASN1_INTERNAL_ERROR_1                  (-22895)
+/** ANS.1 internal error 2. */
+#define VERR_ASN1_INTERNAL_ERROR_2                  (-22896)
+/** ANS.1 internal error 3. */
+#define VERR_ASN1_INTERNAL_ERROR_3                  (-22897)
+/** ANS.1 internal error 4. */
+#define VERR_ASN1_INTERNAL_ERROR_4                  (-22898)
+/** ANS.1 internal error 5. */
+#define VERR_ASN1_INTERNAL_ERROR_5                  (-22899)
+/** @} */
+
+/** @name More RTLdr status codes.
+ * @{ */
+/** Image Verficiation Failure: No Authenticode Signature. */
+#define VERR_LDRVI_NOT_SIGNED                       (-22900)
+/** Image Verficiation Warning: No Authenticode Signature, but on whitelist. */
+#define VINF_LDRVI_NOT_SIGNED                       (22900)
+/** Image Verficiation Failure: Error reading image headers.  */
+#define VERR_LDRVI_READ_ERROR_HDR                   (-22901)
+/** Image Verficiation Failure: Error reading section headers. */
+#define VERR_LDRVI_READ_ERROR_SHDRS                 (-22902)
+/** Image Verficiation Failure: Error reading authenticode signature data. */
+#define VERR_LDRVI_READ_ERROR_SIGNATURE             (-22903)
+/** Image Verficiation Failure: Error reading file for hashing. */
+#define VERR_LDRVI_READ_ERROR_HASH                  (-22904)
+/** Image Verficiation Failure: Error determining the file length. */
+#define VERR_LDRVI_FILE_LENGTH_ERROR                (-22905)
+/** Image Verficiation Failure: Error allocating memory for state data. */
+#define VERR_LDRVI_NO_MEMORY_STATE                  (-22906)
+/** Image Verficiation Failure: Error allocating memory for authenticode
+ *  signature data. */
+#define VERR_LDRVI_NO_MEMORY_SIGNATURE              (-22907)
+/** Image Verficiation Failure: Error allocating memory for section headers. */
+#define VERR_LDRVI_NO_MEMORY_SHDRS                  (-22908)
+/** Image Verficiation Failure: Authenticode parsing output. */
+#define VERR_LDRVI_NO_MEMORY_PARSE_OUTPUT           (-22909)
+/** Image Verficiation Failure: Invalid security directory entry. */
+#define VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY       (-22910)
+/** Image Verficiation Failure:  */
+#define VERR_LDRVI_BAD_CERT_HDR_LENGTH              (-22911)
+/** Image Verficiation Failure:  */
+#define VERR_LDRVI_BAD_CERT_HDR_REVISION            (-22912)
+/** Image Verficiation Failure:  */
+#define VERR_LDRVI_BAD_CERT_HDR_TYPE                (-22913)
+/** Image Verficiation Failure: More than one certificate table entry.  */
+#define VERR_LDRVI_BAD_CERT_MULTIPLE                (-22914)
+
+/** Image Verficiation Failure:  */
+#define VERR_LDRVI_BAD_MZ_OFFSET                    (-22915)
+/** Image Verficiation Failure: Invalid section count. */
+#define VERR_LDRVI_INVALID_SECTION_COUNT            (-22916)
+/** Image Verficiation Failure: Raw data offsets and sizes are out of range. */
+#define VERR_LDRVI_SECTION_RAW_DATA_VALUES          (-22917)
+/** Optional header magic and target machine does not match. */
+#define VERR_LDRVI_MACHINE_OPT_HDR_MAGIC_MISMATCH   (-22918)
+/** Unsupported image target architecture. */
+#define VERR_LDRVI_UNSUPPORTED_ARCH                 (-22919)
+
+/** Image Verification Failure: Internal error in signature parser. */
+#define VERR_LDRVI_PARSE_IPE                        (-22921)
+/** Generic BER parse error. Will be refined later. */
+#define VERR_LDRVI_PARSE_BER_ERROR                  (-22922)
+
+/** Expected the signed data content to be the object ID of
+ * SpcIndirectDataContent, found something else instead. */
+#define VERR_LDRVI_EXPECTED_INDIRECT_DATA_CONTENT_OID (-22923)
+/** Page hash table size overflow. */
+#define VERR_LDRVI_PAGE_HASH_TAB_SIZE_OVERFLOW      (-22924)
+/** Page hash table is too long (covers signature data, i.e. itself). */
+#define VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG           (-22925)
+/** The page hash table is not strictly ordered by offset. */
+#define VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED (-22926)
+/** The page hash table hashes data outside the defined and implict sections. */
+#define VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA  (-22927)
+/** Page hash mismatch. */
+#define VERR_LDRVI_PAGE_HASH_MISMATCH               (-22928)
+/** Image hash mismatch. */
+#define VERR_LDRVI_IMAGE_HASH_MISMATCH              (-22929)
+/** @} */
+
+/** @name RTCrX509 status codes.
+ * @{ */
+/** Generic X.509 error. */
+#define VERR_CR_X509_GENERIC_ERROR                  (-23000)
+/** Internal error in the X.509 code. */
+#define VERR_CR_X509_INTERNAL_ERROR                 (-23001)
+/** Internal error in the X.509 certificate path building and verification
+ * code. */
+#define VERR_CR_X509_CERTPATHS_INTERNAL_ERROR       (-23002)
+/** Path not verified yet. */
+#define VERR_CR_X509_NOT_VERIFIED                   (-23003)
+/** The certificate path has no trust anchor. */
+#define VERR_CR_X509_NO_TRUST_ANCHOR                (-23004)
+/** Unknown X.509 certificate signature algorithm. */
+#define VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO         (-23005)
+/** Certificate signature algorithm mismatch. */
+#define VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH        (-23006)
+/** The signature algorithm in the to-be-signed certifcate part does not match
+ * the one assoicated with the signature. */
+#define VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH    (-23007)
+/** Certificate extensions requires certificate version 3 or later.  */
+#define VERR_CR_X509_TBSCERT_EXTS_REQ_V3            (-23008)
+/** Unique issuer and subject IDs require version certificate 2. */
+#define VERR_CR_X509_TBSCERT_UNIQUE_IDS_REQ_V2      (-23009)
+/** Certificate serial number length is out of bounds. */
+#define VERR_CR_X509_TBSCERT_SERIAL_NUMBER_OUT_OF_BOUNDS (-23010)
+/** Unsupported X.509 certificate version. */
+#define VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION    (-23011)
+/** Public key is too small. */
+#define VERR_CR_X509_PUBLIC_KEY_TOO_SMALL           (-23012)
+/** Invalid strnig tag for a X.509 name object. */
+#define VERR_CR_X509_INVALID_NAME_STRING_TAG        (-23013)
+/** Empty string in X.509 name object. */
+#define VERR_CR_X509_NAME_EMPTY_STRING              (-23014)
+/** Non-string object inside X.509 name object. */
+#define VERR_CR_X509_NAME_NOT_STRING                (-23015)
+/** Empty set inside X.509 name. */
+#define VERR_CR_X509_NAME_EMPTY_SET                 (-23016)
+/** Empty sub-string set inside X.509 name. */
+#define VERR_CR_X509_NAME_EMPTY_SUB_SET             (-23017)
+/** The NotBefore and NotAfter values of an X.509 Validity object seems to
+ * have been swapped around. */
+#define VERR_CR_X509_VALIDITY_SWAPPED               (-23018)
+/** Duplicate certificate extension. */
+#define VERR_CR_X509_TBSCERT_DUPLICATE_EXTENSION    (-23019)
+/** Missing relative distinguished name map entry. */
+#define VERR_CR_X509_NAME_MISSING_RDN_MAP_ENTRY     (-23020)
+/** Certificate path validator: No trusted certificate paths. */
+#define VERR_CR_X509_CPV_NO_TRUSTED_PATHS           (-23021)
+/** Certificate path validator: No valid certificate policy. */
+#define VERR_CR_X509_CPV_NO_VALID_POLICY            (-23022)
+/** Certificate path validator: Unknown critical certificate extension. */
+#define VERR_CR_X509_CPV_UNKNOWN_CRITICAL_EXTENSION (-23023)
+/** Certificate path validator: Intermediate certificate is missing the
+ *  KeyCertSign usage flag. */
+#define VERR_CR_X509_CPV_MISSING_KEY_CERT_SIGN      (-23024)
+/** Certificate path validator: Hit the max certificate path length before
+ *  reaching trust anchor. */
+#define VERR_CR_X509_CPV_MAX_PATH_LENGTH            (-23025)
+/** Certificate path validator: Intermediate certificate is not marked as a
+ *  certificate authority (CA). */
+#define VERR_CR_X509_CPV_NOT_CA_CERT                (-23026)
+/** Certificate path validator: Intermeidate certificate is not a version 3
+ *  certificate. */
+#define VERR_CR_X509_CPV_NOT_V3_CERT                (-23027)
+/** Certificate path validator: Invalid policy mapping (to/from anyPolicy). */
+#define VERR_CR_X509_CPV_INVALID_POLICY_MAPPING     (-23028)
+/** Certificate path validator: Name constraints permits no names. */
+#define VERR_CR_X509_CPV_NO_PERMITTED_NAMES         (-23029)
+/** Certificate path validator: Name constraints does not permits the
+ *  certificate name. */
+#define VERR_CR_X509_CPV_NAME_NOT_PERMITTED         (-23030)
+/** Certificate path validator: Name constraints does not permits the
+ *  alternative certificate name. */
+#define VERR_CR_X509_CPV_ALT_NAME_NOT_PERMITTED     (-23031)
+/** Certificate path validator: Intermediate certificate subject does not
+ *  match child issuer property. */
+#define VERR_CR_X509_CPV_ISSUER_MISMATCH            (-23032)
+/** Certificate path validator: The certificate is not valid at the
+ *  specificed time. */
+#define VERR_CR_X509_CPV_NOT_VALID_AT_TIME          (-23033)
+/** Certificate path validator: Unexpected choice found in general subtree
+ *  object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_CHOICE (-23034)
+/** Certificate path validator: Unexpected minimum value found in general
+ *  subtree object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MIN  (-23035)
+/** Certificate path validator: Unexpected maximum value found in
+ *  general subtree object (name constraints). */
+#define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MAX  (-23036)
+/** Certificate path builder: Encountered bad certificate context. */
+#define VERR_CR_X509_CPB_BAD_CERT_CTX               (-23037)
+/** OpenSSL d2i_X509 failed. */
+#define VERR_CR_X509_OSSL_D2I_FAILED                (-23090)
+/** @} */
+
+/** @name RTCrPkcs7 status codes.
+ * @{ */
+/** Generic PKCS \#7 error. */
+#define VERR_CR_PKCS7_GENERIC_ERROR                             (-23300)
+/** Signed data verfication failed because there are zero signer infos. */
+#define VERR_CR_PKCS7_NO_SIGNER_INFOS                           (-23301)
+/** Signed data certificate not found. */
+#define VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND                (-23302)
+/** Signed data verification failed due to key usage issues. */
+#define VERR_CR_PKCS7_KEY_USAGE_MISMATCH                        (-23303)
+/** Signed data verification failed because of missing (or duplicate)
+ * authenticated content-type attribute. */
+#define VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB               (-23304)
+/** Signed data verification failed because of the authenticated content-type
+ *  attribute did not match. */
+#define VERR_CR_PKCS7_CONTENT_TYPE_ATTRIB_MISMATCH              (-23305)
+/** Signed data verification failed because of a malformed authenticated
+ *  content-type attribute. */
+#define VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB                   (-23306)
+/** Signed data verification failed because of missing (or duplicate)
+ * authenticated message-digest attribute. */
+#define VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB             (-23307)
+/** Signed data verification failed because the authenticated message-digest
+ *  attribute did not match. */
+#define VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH            (-23308)
+/** Signed data verification failed because of a malformed authenticated
+ *  message-digest attribute. */
+#define VERR_CR_PKCS7_BAD_MESSAGE_DIGEST_ATTRIB                 (-23309)
+/** Signature verification failed. */
+#define VERR_CR_PKCS7_SIGNATURE_VERIFICATION_FAILED             (-23310)
+/** Internal PKCS \#7 error. */
+#define VERR_CR_PKCS7_INTERNAL_ERROR                            (-22311)
+/** OpenSSL d2i_PKCS7 failed. */
+#define VERR_CR_PKCS7_OSSL_D2I_FAILED                           (-22312)
+/** OpenSSL PKCS \#7 verification failed. */
+#define VERR_CR_PKCS7_OSSL_VERIFY_FAILED                        (-22313)
+/** Digest algorithm parameters are not supported by the PKCS \#7 code. */
+#define VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL                    (-22314)
+/** The digest algorithm of a signer info entry was not found in the list of
+ *  digest algorithms in the signed data. */
+#define VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST             (-22315)
+/** The PKCS \#7 content is not signed data. */
+#define VERR_CR_PKCS7_NOT_SIGNED_DATA                           (-22316)
+/** No digest algorithms listed in PKCS \#7 signed data. */
+#define VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS                      (-22317)
+/** Too many digest algorithms used by PKCS \#7 signed data.  This is an
+ * internal limitation of the code that aims at saving kernel stack space. */
+#define VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS                (-22318)
+/** Error creating digest algorithm calculator. */
+#define VERR_CR_PKCS7_DIGEST_CREATE_ERROR                       (-22319)
+/** Error while calculating a digest for a PKCS \#7 verficiation operation. */
+#define VERR_CR_PKCS7_DIGEST_CALC_ERROR                         (-22320)
+/** Unsupported PKCS \#7 signed data version. */
+#define VERR_CR_PKCS7_SIGNED_DATA_VERSION                       (-22350)
+/** PKCS \#7 signed data has no digest algorithms listed. */
+#define VERR_CR_PKCS7_SIGNED_DATA_NO_DIGEST_ALGOS               (-22351)
+/** Unknown digest algorithm used by PKCS \#7 object. */
+#define VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM                  (-22352)
+/** Expected PKCS \#7 object to ship at least one certificate. */
+#define VERR_CR_PKCS7_NO_CERTIFICATES                           (-22353)
+/** Expected PKCS \#7 object to not contain any CRLs. */
+#define VERR_CR_PKCS7_EXPECTED_NO_CRLS                          (-22354)
+/** Expected PKCS \#7 object to contain exactly on signer info entry. */
+#define VERR_CR_PKCS7_EXPECTED_ONE_SIGNER_INFO                  (-22355)
+/** Unsupported PKCS \#7 signer info version. */
+#define VERR_CR_PKCS7_SIGNER_INFO_VERSION                       (-22356)
+/** PKCS \#7 singer info contains no issuer serial number. */
+#define VERR_CR_PKCS7_SIGNER_INFO_NO_ISSUER_SERIAL_NO           (-22357)
+/** Expected PKCS \#7 object to ship the signer certificate(s). */
+#define VERR_CR_PKCS7_SIGNER_CERT_NOT_SHIPPED                   (-22358)
+/** The encrypted digest algorithm does not match the one in the certificate. */
+#define VERR_CR_PKCS7_SIGNER_INFO_DIGEST_ENCRYPT_MISMATCH       (-22359)
+/** @} */
+
+/** @name RTCrSpc status codes.
+ * @{ */
+/** Generic SPC error. */
+#define VERR_CR_SPC_GENERIC_ERROR                               (-23400)
+/** SPC requires there to be exactly one SignerInfo entry. */
+#define VERR_CR_SPC_NOT_EXACTLY_ONE_SIGNER_INFOS                (-23401)
+/** There shall be exactly one digest algorithm to go with the single
+ *  SingerInfo entry required by SPC. */
+#define VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO                 (-23402)
+/** The digest algorithm in the SignerInfo does not match the one in the
+ *  indirect data. */
+#define VERR_CR_SPC_SIGNED_IND_DATA_DIGEST_ALGO_MISMATCH        (-23403)
+/** The digest algorithm in the indirect data was not found in the list of
+ * digest algorithms in the signed data structure. */
+#define VERR_CR_SPC_IND_DATA_DIGEST_ALGO_NOT_IN_DIGEST_ALGOS    (-23404)
+/** The digest algorithm is not known to us. */
+#define VERR_CR_SPC_UNKNOWN_DIGEST_ALGO                         (-23405)
+/** The indirect data digest size does not match the digest algorithm. */
+#define VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH               (-23406)
+/** Exptected PE image data inside indirect data object. */
+#define VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA                      (-23407)
+/** Internal SPC error: The PE image data is missing.  */
+#define VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT                    (-23408)
+/** Bad SPC object moniker UUID field. */
+#define VERR_CR_SPC_BAD_MONIKER_UUID                            (-23409)
+/** Unknown SPC object moniker UUID. */
+#define VERR_CR_SPC_UNKNOWN_MONIKER_UUID                        (-23410)
+/** Internal SPC error: Bad object monker choice value. */
+#define VERR_CR_SPC_BAD_MONIKER_CHOICE                          (-23411)
+/** Internal SPC error: Bad object moniker data pointer. */
+#define VERR_CR_SPC_MONIKER_BAD_DATA                            (-23412)
+/** Multiple PE image page hash tables. */
+#define VERR_CR_SPC_PEIMAGE_MULTIPLE_HASH_TABS                  (-23413)
+/** Unknown SPC PE image attribute. */
+#define VERR_CR_SPC_PEIMAGE_UNKNOWN_ATTRIBUTE                   (-23414)
+/** URL not expected in SPC PE image data. */
+#define VERR_CR_SPC_PEIMAGE_URL_UNEXPECTED                      (-23415)
+/** PE image data without any valid content was not expected. */
+#define VERR_CR_SPC_PEIMAGE_NO_CONTENT                          (-23416)
+/** @} */
+
+/** @name RTCrPkix status codes.
+ * @{ */
+/** Generic PKCS \#7 error. */
+#define VERR_CR_PKIX_GENERIC_ERROR                  (-23500)
+/** Parameters was presented to a signature schema that does not take any. */
+#define VERR_CR_PKIX_SIGNATURE_TAKES_NO_PARAMETERS  (-23501)
+/** Unknown hash digest type. */
+#define VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE            (-23502)
+/** Internal error. */
+#define VERR_CR_PKIX_INTERNAL_ERROR                 (-23503)
+/** The hash is too long for the key used when signing/verifying. */
+#define VERR_CR_PKIX_HASH_TOO_LONG_FOR_KEY          (-23504)
+/** The signature is too long for the scratch buffer. */
+#define VERR_CR_PKIX_SIGNATURE_TOO_LONG             (-23505)
+/** The signature is greater than or equal to the key. */
+#define VERR_CR_PKIX_SIGNATURE_GE_KEY               (-23506)
+/** The signature is negative. */
+#define VERR_CR_PKIX_SIGNATURE_NEGATIVE             (-23507)
+/** Invalid signature length. */
+#define VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH       (-23508)
+/** PKIX signature no does not match up to the current data. */
+#define VERR_CR_PKIX_SIGNATURE_MISMATCH             (-23509)
+/** PKIX cipher algorithm parameters are not implemented. */
+#define VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL    (-23510)
+/** ipher algorithm is not known to us. */
+#define VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN          (-23511)
+/** PKIX cipher algorithm is not known to OpenSSL. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN     (-23512)
+/** PKIX cipher algorithm is not known to OpenSSL EVP API. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN_EVP (-23513)
+/** OpenSSL failed to init PKIX cipher algorithm context. */
+#define VERR_CR_PKIX_OSSL_CIPHER_ALOG_INIT_FAILED   (-23514)
+/** Final OpenSSL PKIX verification failed. */
+#define VERR_CR_PKIX_OSSL_VERIFY_FINAL_FAILED       (-23515)
+/** OpenSSL failed to decode the public key. */
+#define VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED     (-23516)
+/** The EVP_PKEY_type API in OpenSSL failed.  */
+#define VERR_CR_PKIX_OSSL_EVP_PKEY_TYPE_ERROR       (-23517)
+/** @} */
+
+/** @name RTCrStore status codes.
+ * @{ */
+/** Generic store error. */
+#define VERR_CR_STORE_GENERIC_ERROR                 (-23700)
+/** @} */
+
+/** @name RTCrRsa status codes.
+ * @{ */
+/** Generic RSA error. */
+#define VERR_CR_RSA_GENERIC_ERROR                   (-23900)
+/** @} */
+
+/** @name RTBigNum status codes.
+ * @{ */
+/** Sensitive input requires the result(s) to be initialized as sensitive. */
+#define VERR_BIGNUM_SENSITIVE_INPUT                 (-24000)
+/** Attempt to divide by zero. */
+#define VERR_BIGNUM_DIV_BY_ZERO                     (-24001)
+/** Negative exponent makes no sense to integer math. */
+#define VERR_BIGNUM_NEGATIVE_EXPONENT               (-24002)
+
+/** @} */
+
+/** @name RTCrDigest status codes.
+ * @{ */
+/** OpenSSL failed to initialize the digest algorithm contextn. */
+#define VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR       (-24200)
+/** OpenSSL failed to clone the digest algorithm contextn. */
+#define VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR   (-24201)
+/** @} */
+
 /* SED-END */
 
 /** @} */
diff --git a/include/iprt/err.mac b/include/iprt/err.mac
index 39ac4e9..7303dd1 100644
--- a/include/iprt/err.mac
+++ b/include/iprt/err.mac
@@ -424,6 +424,7 @@
 %define VERR_HTTP_CACERT_WRONG_FORMAT    (-891)
 %define VERR_HTTP_CACERT_CANNOT_AUTHENTICATE    (-892)
 %define VERR_HTTP_ABORTED    (-893)
+%define VERR_HTTP_REDIRECTED    (-894)
 %define VERR_MANIFEST_UNSUPPORTED_DIGEST_TYPE    (-900)
 %define VERR_MANIFEST_WRONG_FILE_FORMAT    (-901)
 %define VERR_MANIFEST_DIGEST_MISMATCH    (-902)
@@ -459,6 +460,12 @@
 %define VERR_POLL_HANDLE_ID_EXISTS    (-951)
 %define VERR_POLL_HANDLE_ID_NOT_FOUND    (-952)
 %define VERR_POLL_SET_IS_FULL    (-953)
+%define VERR_PKZIP_NO_EOCB    (-960)
+%define VERR_PKZIP_NAME_TOO_LONG    (-961)
+%define VERR_PKZIP_BAD_LF_HEADER    (-962)
+%define VERR_PKZIP_BAD_CDF_HEADER    (-963)
+%define VERR_PKZIP_UNKNOWN_TYPE_FLAG    (-964)
+%define VERR_PKZIP_ZIP64EX_IN_ZIP32    (-965)
 %define VERR_ZIP_ERROR    (-22000)
 %define VERR_ZIP_CORRUPTED    (-22001)
 %define VERR_ZIP_NO_MEMORY    (-22002)
@@ -524,3 +531,205 @@
 %define VERR_XAR_ARCHIVED_HASH_MISMATCH    (-22737)
 %define VERR_XAR_UNUSED_ARCHIVED_DATA    (-22738)
 %define VERR_XAR_ARCHIVED_AND_EXTRACTED_SIZES_MISMATCH    (-22739)
+%define VERR_ASN1_ERROR    (-22800)
+%define VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED    (-22801)
+%define VERR_ASN1_INVALID_UTF8_STRING_ENCODING    (-22802)
+%define VERR_ASN1_INVALID_NUMERIC_STRING_ENCODING    (-22803)
+%define VERR_ASN1_INVALID_PRINTABLE_STRING_ENCODING    (-22804)
+%define VERR_ASN1_INVALID_T61_STRING_ENCODING    (-22805)
+%define VERR_ASN1_INVALID_VIDEOTEX_STRING_ENCODING    (-22806)
+%define VERR_ASN1_INVALID_IA5_STRING_ENCODING    (-22807)
+%define VERR_ASN1_INVALID_GRAPHIC_STRING_ENCODING    (-22808)
+%define VERR_ASN1_INVALID_VISIBLE_STRING_ENCODING    (-22809)
+%define VERR_ASN1_INVALID_GENERAL_STRING_ENCODING    (-22810)
+%define VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING    (-22811)
+%define VERR_ASN1_INVALID_BMP_STRING_ENCODING    (-22812)
+%define VERR_ASN1_INVALID_OBJID_ENCODING    (-22813)
+%define VERR_ASN1_OBJID_COMPONENT_TOO_BIG    (-22814)
+%define VERR_ASN1_OBJID_TOO_MANY_COMPONENTS    (-22815)
+%define VERR_ASN1_OBJID_TOO_LONG_STRING_FORM    (-22816)
+%define VERR_ASN1_OBJID_INVALID_DOTTED_STRING    (-22817)
+%define VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL    (-22818)
+%define VERR_ASN1_STRING_TAG_MISMATCH    (-22819)
+%define VERR_ASN1_TIME_TAG_MISMATCH    (-22820)
+%define VINF_ASN1_MORE_DATA    (22821)
+%define VINF_ASN1_NOT_ENCODED    (22822)
+%define VERR_ASN1_TELETEX_UNKNOWN_ESC_SEQ    (-22823)
+%define VERR_ASN1_TELETEX_UNSUPPORTED_ESC_SEQ    (-22824)
+%define VERR_ASN1_TELETEX_UNSUPPORTED_CHARSET    (-22825)
+%define VERR_ASN1_NO_VTABLE    (-22826)
+%define VERR_ASN1_NO_CHECK_SANITY_METHOD    (-22827)
+%define VERR_ASN1_NOT_PRESENT    (-22828)
+%define VERR_ASN1_CURSOR_NOT_AT_END    (-22829)
+%define VERR_ASN1_CURSOR_LONG_TAG    (-22830)
+%define VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING    (-22831)
+%define VERR_ASN1_CURSOR_ILLEGAL_IDEFINITE_LENGTH    (-22832)
+%define VERR_ASN1_CURSOR_IDEFINITE_LENGTH_NOT_SUP    (-22833)
+%define VERR_ASN1_CURSOR_BAD_LENGTH    (-22834)
+%define VERR_ASN1_CURSOR_NO_MORE_DATA    (-22835)
+%define VERR_ASN1_CURSOR_TOO_LITTLE_DATA_LEFT    (-22836)
+%define VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING    (-22837)
+%define VERR_ASN1_CURSOR_TAG_MISMATCH    (-22838)
+%define VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH    (-22839)
+%define VERR_ASN1_BITSTRING_OUT_OF_BOUNDS    (-22840)
+%define VERR_ASN1_TIME_BAD_NORMALIZE_INPUT    (-22841)
+%define VERR_ASN1_TIME_NORMALIZE_ERROR    (-22842)
+%define VERR_ASN1_TIME_NORMALIZE_MISMATCH    (-22843)
+%define VERR_ASN1_INVALID_UTC_TIME_ENCODING    (-22844)
+%define VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING    (-22845)
+%define VERR_ASN1_INVALID_BOOLEAN_ENCODING    (-22846)
+%define VERR_ASN1_INVALID_NULL_ENCODING    (-22847)
+%define VERR_ASN1_INVALID_BITSTRING_ENCODING    (-22848)
+%define VERR_ASN1_DYNTYPE_TAG_NOT_IMPL    (-22849)
+%define VERR_ASN1_DYNTYPE_BAD_TAG    (-22850)
+%define VERR_ASN1_DUMMY_OBJECT    (-22851)
+%define VERR_ASN1_TOO_LONG    (-22852)
+%define VERR_ASN1_EXPECTED_PRIMITIVE    (-22853)
+%define VERR_ASN1_INVALID_DATA_POINTER    (-22854)
+%define VERR_ASN1_INTERNAL_ERROR_1    (-22895)
+%define VERR_ASN1_INTERNAL_ERROR_2    (-22896)
+%define VERR_ASN1_INTERNAL_ERROR_3    (-22897)
+%define VERR_ASN1_INTERNAL_ERROR_4    (-22898)
+%define VERR_ASN1_INTERNAL_ERROR_5    (-22899)
+%define VERR_LDRVI_NOT_SIGNED    (-22900)
+%define VINF_LDRVI_NOT_SIGNED    (22900)
+%define VERR_LDRVI_READ_ERROR_HDR    (-22901)
+%define VERR_LDRVI_READ_ERROR_SHDRS    (-22902)
+%define VERR_LDRVI_READ_ERROR_SIGNATURE    (-22903)
+%define VERR_LDRVI_READ_ERROR_HASH    (-22904)
+%define VERR_LDRVI_FILE_LENGTH_ERROR    (-22905)
+%define VERR_LDRVI_NO_MEMORY_STATE    (-22906)
+%define VERR_LDRVI_NO_MEMORY_SIGNATURE    (-22907)
+%define VERR_LDRVI_NO_MEMORY_SHDRS    (-22908)
+%define VERR_LDRVI_NO_MEMORY_PARSE_OUTPUT    (-22909)
+%define VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY    (-22910)
+%define VERR_LDRVI_BAD_CERT_HDR_LENGTH    (-22911)
+%define VERR_LDRVI_BAD_CERT_HDR_REVISION    (-22912)
+%define VERR_LDRVI_BAD_CERT_HDR_TYPE    (-22913)
+%define VERR_LDRVI_BAD_CERT_MULTIPLE    (-22914)
+%define VERR_LDRVI_BAD_MZ_OFFSET    (-22915)
+%define VERR_LDRVI_INVALID_SECTION_COUNT    (-22916)
+%define VERR_LDRVI_SECTION_RAW_DATA_VALUES    (-22917)
+%define VERR_LDRVI_MACHINE_OPT_HDR_MAGIC_MISMATCH    (-22918)
+%define VERR_LDRVI_UNSUPPORTED_ARCH    (-22919)
+%define VERR_LDRVI_PARSE_IPE    (-22921)
+%define VERR_LDRVI_PARSE_BER_ERROR    (-22922)
+%define VERR_LDRVI_EXPECTED_INDIRECT_DATA_CONTENT_OID    (-22923)
+%define VERR_LDRVI_PAGE_HASH_TAB_SIZE_OVERFLOW    (-22924)
+%define VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG    (-22925)
+%define VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED    (-22926)
+%define VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA    (-22927)
+%define VERR_LDRVI_PAGE_HASH_MISMATCH    (-22928)
+%define VERR_LDRVI_IMAGE_HASH_MISMATCH    (-22929)
+%define VERR_CR_X509_GENERIC_ERROR    (-23000)
+%define VERR_CR_X509_INTERNAL_ERROR    (-23001)
+%define VERR_CR_X509_CERTPATHS_INTERNAL_ERROR    (-23002)
+%define VERR_CR_X509_NOT_VERIFIED    (-23003)
+%define VERR_CR_X509_NO_TRUST_ANCHOR    (-23004)
+%define VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO    (-23005)
+%define VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH    (-23006)
+%define VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH    (-23007)
+%define VERR_CR_X509_TBSCERT_EXTS_REQ_V3    (-23008)
+%define VERR_CR_X509_TBSCERT_UNIQUE_IDS_REQ_V2    (-23009)
+%define VERR_CR_X509_TBSCERT_SERIAL_NUMBER_OUT_OF_BOUNDS    (-23010)
+%define VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION    (-23011)
+%define VERR_CR_X509_PUBLIC_KEY_TOO_SMALL    (-23012)
+%define VERR_CR_X509_INVALID_NAME_STRING_TAG    (-23013)
+%define VERR_CR_X509_NAME_EMPTY_STRING    (-23014)
+%define VERR_CR_X509_NAME_NOT_STRING    (-23015)
+%define VERR_CR_X509_NAME_EMPTY_SET    (-23016)
+%define VERR_CR_X509_NAME_EMPTY_SUB_SET    (-23017)
+%define VERR_CR_X509_VALIDITY_SWAPPED    (-23018)
+%define VERR_CR_X509_TBSCERT_DUPLICATE_EXTENSION    (-23019)
+%define VERR_CR_X509_NAME_MISSING_RDN_MAP_ENTRY    (-23020)
+%define VERR_CR_X509_CPV_NO_TRUSTED_PATHS    (-23021)
+%define VERR_CR_X509_CPV_NO_VALID_POLICY    (-23022)
+%define VERR_CR_X509_CPV_UNKNOWN_CRITICAL_EXTENSION    (-23023)
+%define VERR_CR_X509_CPV_MISSING_KEY_CERT_SIGN    (-23024)
+%define VERR_CR_X509_CPV_MAX_PATH_LENGTH    (-23025)
+%define VERR_CR_X509_CPV_NOT_CA_CERT    (-23026)
+%define VERR_CR_X509_CPV_NOT_V3_CERT    (-23027)
+%define VERR_CR_X509_CPV_INVALID_POLICY_MAPPING    (-23028)
+%define VERR_CR_X509_CPV_NO_PERMITTED_NAMES    (-23029)
+%define VERR_CR_X509_CPV_NAME_NOT_PERMITTED    (-23030)
+%define VERR_CR_X509_CPV_ALT_NAME_NOT_PERMITTED    (-23031)
+%define VERR_CR_X509_CPV_ISSUER_MISMATCH    (-23032)
+%define VERR_CR_X509_CPV_NOT_VALID_AT_TIME    (-23033)
+%define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_CHOICE    (-23034)
+%define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MIN    (-23035)
+%define VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MAX    (-23036)
+%define VERR_CR_X509_CPB_BAD_CERT_CTX    (-23037)
+%define VERR_CR_X509_OSSL_D2I_FAILED    (-23090)
+%define VERR_CR_PKCS7_GENERIC_ERROR    (-23300)
+%define VERR_CR_PKCS7_NO_SIGNER_INFOS    (-23301)
+%define VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND    (-23302)
+%define VERR_CR_PKCS7_KEY_USAGE_MISMATCH    (-23303)
+%define VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB    (-23304)
+%define VERR_CR_PKCS7_CONTENT_TYPE_ATTRIB_MISMATCH    (-23305)
+%define VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB    (-23306)
+%define VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB    (-23307)
+%define VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH    (-23308)
+%define VERR_CR_PKCS7_BAD_MESSAGE_DIGEST_ATTRIB    (-23309)
+%define VERR_CR_PKCS7_SIGNATURE_VERIFICATION_FAILED    (-23310)
+%define VERR_CR_PKCS7_INTERNAL_ERROR    (-22311)
+%define VERR_CR_PKCS7_OSSL_D2I_FAILED    (-22312)
+%define VERR_CR_PKCS7_OSSL_VERIFY_FAILED    (-22313)
+%define VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL    (-22314)
+%define VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST    (-22315)
+%define VERR_CR_PKCS7_NOT_SIGNED_DATA    (-22316)
+%define VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS    (-22317)
+%define VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS    (-22318)
+%define VERR_CR_PKCS7_DIGEST_CREATE_ERROR    (-22319)
+%define VERR_CR_PKCS7_DIGEST_CALC_ERROR    (-22320)
+%define VERR_CR_PKCS7_SIGNED_DATA_VERSION    (-22350)
+%define VERR_CR_PKCS7_SIGNED_DATA_NO_DIGEST_ALGOS    (-22351)
+%define VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM    (-22352)
+%define VERR_CR_PKCS7_NO_CERTIFICATES    (-22353)
+%define VERR_CR_PKCS7_EXPECTED_NO_CRLS    (-22354)
+%define VERR_CR_PKCS7_EXPECTED_ONE_SIGNER_INFO    (-22355)
+%define VERR_CR_PKCS7_SIGNER_INFO_VERSION    (-22356)
+%define VERR_CR_PKCS7_SIGNER_INFO_NO_ISSUER_SERIAL_NO    (-22357)
+%define VERR_CR_PKCS7_SIGNER_CERT_NOT_SHIPPED    (-22358)
+%define VERR_CR_PKCS7_SIGNER_INFO_DIGEST_ENCRYPT_MISMATCH    (-22359)
+%define VERR_CR_SPC_GENERIC_ERROR    (-23400)
+%define VERR_CR_SPC_NOT_EXACTLY_ONE_SIGNER_INFOS    (-23401)
+%define VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO    (-23402)
+%define VERR_CR_SPC_SIGNED_IND_DATA_DIGEST_ALGO_MISMATCH    (-23403)
+%define VERR_CR_SPC_IND_DATA_DIGEST_ALGO_NOT_IN_DIGEST_ALGOS    (-23404)
+%define VERR_CR_SPC_UNKNOWN_DIGEST_ALGO    (-23405)
+%define VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH    (-23406)
+%define VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA    (-23407)
+%define VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT    (-23408)
+%define VERR_CR_SPC_BAD_MONIKER_UUID    (-23409)
+%define VERR_CR_SPC_UNKNOWN_MONIKER_UUID    (-23410)
+%define VERR_CR_SPC_BAD_MONIKER_CHOICE    (-23411)
+%define VERR_CR_SPC_MONIKER_BAD_DATA    (-23412)
+%define VERR_CR_SPC_PEIMAGE_MULTIPLE_HASH_TABS    (-23413)
+%define VERR_CR_SPC_PEIMAGE_UNKNOWN_ATTRIBUTE    (-23414)
+%define VERR_CR_SPC_PEIMAGE_URL_UNEXPECTED    (-23415)
+%define VERR_CR_SPC_PEIMAGE_NO_CONTENT    (-23416)
+%define VERR_CR_PKIX_GENERIC_ERROR    (-23500)
+%define VERR_CR_PKIX_SIGNATURE_TAKES_NO_PARAMETERS    (-23501)
+%define VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE    (-23502)
+%define VERR_CR_PKIX_INTERNAL_ERROR    (-23503)
+%define VERR_CR_PKIX_HASH_TOO_LONG_FOR_KEY    (-23504)
+%define VERR_CR_PKIX_SIGNATURE_TOO_LONG    (-23505)
+%define VERR_CR_PKIX_SIGNATURE_GE_KEY    (-23506)
+%define VERR_CR_PKIX_SIGNATURE_NEGATIVE    (-23507)
+%define VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH    (-23508)
+%define VERR_CR_PKIX_SIGNATURE_MISMATCH    (-23509)
+%define VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL    (-23510)
+%define VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN    (-23511)
+%define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN    (-23512)
+%define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN_EVP    (-23513)
+%define VERR_CR_PKIX_OSSL_CIPHER_ALOG_INIT_FAILED    (-23514)
+%define VERR_CR_PKIX_OSSL_VERIFY_FINAL_FAILED    (-23515)
+%define VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED    (-23516)
+%define VERR_CR_PKIX_OSSL_EVP_PKEY_TYPE_ERROR    (-23517)
+%define VERR_CR_STORE_GENERIC_ERROR    (-23700)
+%define VERR_CR_RSA_GENERIC_ERROR    (-23900)
+%define VERR_BIGNUM_SENSITIVE_INPUT    (-24000)
+%define VERR_BIGNUM_DIV_BY_ZERO    (-24001)
+%define VERR_BIGNUM_NEGATIVE_EXPONENT    (-24002)
+%define VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR    (-24200)
+%define VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR    (-24201)
diff --git a/include/iprt/formats/asn1.h b/include/iprt/formats/asn1.h
new file mode 100644
index 0000000..2e0ef4b
--- /dev/null
+++ b/include/iprt/formats/asn1.h
@@ -0,0 +1,94 @@
+/** @file
+ * IPRT - Abstract Syntax Notation One (ASN.1) Definitions.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_formats_asn1_h
+#define ___iprt_formats_asn1_h
+
+#include <iprt/cdefs.h>
+
+
+/** @defgroup grp_rt_formats_asn1   ASN.1 definitions
+ * @ingroup grp_rt_formats
+ *
+ * @{ */
+
+/** @name Tag classes.
+ *  @{ */
+#define ASN1_TAGCLASS_UNIVERSAL     UINT8_C(0x00)
+#define ASN1_TAGCLASS_APPLICATION   UINT8_C(0x40)
+#define ASN1_TAGCLASS_CONTEXT       UINT8_C(0x80)
+#define ASN1_TAGCLASS_PRIVATE       UINT8_C(0xc0)
+#define ASN1_TAGCLASS_MASK          UINT8_C(0xc0)
+/** @} */
+
+/** Primitive encoding. */
+#define ASN1_TAGFLAG_PRIMITIVE      UINT8_C(0x00)
+/** Constructed encoding, as opposed to primitive. */
+#define ASN1_TAGFLAG_CONSTRUCTED    UINT8_C(0x20)
+
+/** The tag value mask. */
+#define ASN1_TAG_MASK               UINT8_C(0x1f)
+
+/** @name ASN.1 universal tags.
+ * @{ */
+#define ASN1_TAG_EOC                UINT8_C(0x00)
+#define ASN1_TAG_BOOLEAN            UINT8_C(0x01)
+#define ASN1_TAG_INTEGER            UINT8_C(0x02)
+#define ASN1_TAG_BIT_STRING         UINT8_C(0x03)
+#define ASN1_TAG_OCTET_STRING       UINT8_C(0x04)
+#define ASN1_TAG_NULL               UINT8_C(0x05)
+#define ASN1_TAG_OID                UINT8_C(0x06)
+#define ASN1_TAG_OBJECT_DESCRIPTOR  UINT8_C(0x07)
+#define ASN1_TAG_EXTERNAL           UINT8_C(0x08)
+#define ASN1_TAG_REAL               UINT8_C(0x09)
+#define ASN1_TAG_ENUMERATED         UINT8_C(0x0a)
+#define ASN1_TAG_EMBEDDED_PDV       UINT8_C(0x0b)
+#define ASN1_TAG_UTF8_STRING        UINT8_C(0x0c)
+#define ASN1_TAG_RELATIVE_OID       UINT8_C(0x0d)
+#define ASN1_TAG_RESERVED_14        UINT8_C(0x0e)
+#define ASN1_TAG_RESERVED_15        UINT8_C(0x0f)
+#define ASN1_TAG_SEQUENCE           UINT8_C(0x10)
+#define ASN1_TAG_SET                UINT8_C(0x11)
+#define ASN1_TAG_NUMERIC_STRING     UINT8_C(0x12)
+#define ASN1_TAG_PRINTABLE_STRING   UINT8_C(0x13)
+#define ASN1_TAG_T61_STRING         UINT8_C(0x14)
+#define ASN1_TAG_VIDEOTEX_STRING    UINT8_C(0x15)
+#define ASN1_TAG_IA5_STRING         UINT8_C(0x16)
+#define ASN1_TAG_UTC_TIME           UINT8_C(0x17) /**< Century seems to be 1900 if YY < 50, otherwise 2000. Baka ASN.1! */
+#define ASN1_TAG_GENERALIZED_TIME   UINT8_C(0x18)
+#define ASN1_TAG_GRAPHIC_STRING     UINT8_C(0x19)
+#define ASN1_TAG_VISIBLE_STRING     UINT8_C(0x1a)
+#define ASN1_TAG_GENERAL_STRING     UINT8_C(0x1b)
+#define ASN1_TAG_UNIVERSAL_STRING   UINT8_C(0x1c)
+#define ASN1_TAG_CHARACTER_STRING   UINT8_C(0x1d)
+#define ASN1_TAG_BMP_STRING         UINT8_C(0x1e)
+#define ASN1_TAG_USE_LONG_FORM      UINT8_C(0x1f)
+/** @} */
+
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/http.h b/include/iprt/http.h
index dc4a8cc..4dcb10a 100644
--- a/include/iprt/http.h
+++ b/include/iprt/http.h
@@ -61,6 +61,16 @@ RTR3DECL(int) RTHttpCreate(PRTHTTP phHttp);
  */
 RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp);
 
+
+/**
+ * Retrieve the redir location for 301 responses.
+ *
+ * @param   hHttp       Handle to the HTTP interface.
+ * @para    ppszRedirLocation   Where to store the string. To be freed with
+ *                              RTStrFree().
+ */
+RTR3DECL(int) RTHttpGetRedirLocation(RTHTTP hHttp, char **ppszRedirLocation);
+
 /**
  * Perform a simple blocking HTTP request.
  *
@@ -71,7 +81,19 @@ RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp);
  * @param    ppszResponse  HTTP response. It is guaranteed that this string is
  *                         '\0'-terminated.
  */
-RTR3DECL(int) RTHttpGet(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse);
+RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse);
+
+/**
+ * Perform a simple blocking HTTP request.
+ *
+ * @returns iprt status code.
+ *
+ * @param    hHttp         HTTP interface handle.
+ * @param    pcszUrl       URL.
+ * @param    ppvResponse   HTTP response.
+ * @param    pcb           Size of the returned buffer.
+ */
+RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pcszUrl, void **ppvResponse, size_t *pcb);
 
 /**
  * Perform a simple blocking HTTP request, writing the output to a file.
diff --git a/include/iprt/ldr.h b/include/iprt/ldr.h
index 80c432d..bc05a11 100644
--- a/include/iprt/ldr.h
+++ b/include/iprt/ldr.h
@@ -3,7 +3,7 @@
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -131,6 +131,94 @@ typedef enum RTLDRENDIAN
 } RTLDRENDIAN;
 
 
+/** Pointer to a loader reader instance. */
+typedef struct RTLDRREADER *PRTLDRREADER;
+/**
+ * Loader image reader instance.
+ *
+ * @remarks The reader will typically have a larger structure wrapping this one
+ *          for storing necessary instance variables.
+ *
+ *          The loader ASSUMES the caller serializes all access to the
+ *          individual loader module handlers, thus no serialization is required
+ *          when implementing this interface.
+ */
+typedef struct RTLDRREADER
+{
+    /** Magic value (RTLDRREADER_MAGIC). */
+    uintptr_t           uMagic;
+
+    /**
+     * Reads bytes at a give place in the raw image.
+     *
+     * @returns iprt status code.
+     * @param   pReader     Pointer to the reader instance.
+     * @param   pvBuf       Where to store the bits.
+     * @param   cb          Number of bytes to read.
+     * @param   off         Where to start reading relative to the start of the raw image.
+     */
+    DECLCALLBACKMEMBER(int, pfnRead)(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off);
+
+    /**
+     * Tells end position of last read.
+     *
+     * @returns position relative to start of the raw image.
+     * @param   pReader     Pointer to the reader instance.
+     */
+    DECLCALLBACKMEMBER(RTFOFF, pfnTell)(PRTLDRREADER pReader);
+
+    /**
+     * Gets the size of the raw image bits.
+     *
+     * @returns size of raw image bits in bytes.
+     * @param   pReader     Pointer to the reader instance.
+     */
+    DECLCALLBACKMEMBER(RTFOFF, pfnSize)(PRTLDRREADER pReader);
+
+    /**
+     * Map the bits into memory.
+     *
+     * The mapping will be freed upon calling pfnDestroy() if not pfnUnmap()
+     * is called before that. The mapping is read only.
+     *
+     * @returns iprt status code.
+     * @param   pReader     Pointer to the reader instance.
+     * @param   ppvBits     Where to store the address of the memory mapping on success.
+     *                      The size of the mapping can be obtained by calling pfnSize().
+     */
+    DECLCALLBACKMEMBER(int, pfnMap)(PRTLDRREADER pReader, const void **ppvBits);
+
+    /**
+     * Unmap bits.
+     *
+     * @returns iprt status code.
+     * @param   pReader     Pointer to the reader instance.
+     * @param   pvBits      Memory pointer returned by pfnMap().
+     */
+    DECLCALLBACKMEMBER(int, pfnUnmap)(PRTLDRREADER pReader, const void *pvBits);
+
+    /**
+     * Gets the most appropriate log name.
+     *
+     * @returns Pointer to readonly log name.
+     * @param   pReader     Pointer to the reader instance.
+     */
+    DECLCALLBACKMEMBER(const char *, pfnLogName)(PRTLDRREADER pReader);
+
+    /**
+     * Releases all resources associated with the reader instance.
+     * The instance is invalid after this call returns.
+     *
+     * @returns iprt status code.
+     * @param   pReader     Pointer to the reader instance.
+     */
+    DECLCALLBACKMEMBER(int, pfnDestroy)(PRTLDRREADER pReader);
+} RTLDRREADER;
+
+/** Magic value for RTLDRREADER (Gordon Matthew Thomas Sumner / Sting). */
+#define RTLDRREADER_MAGIC   UINT32_C(0x19511002)
+
+
 /**
  * Gets the default file suffix for DLL/SO/DYLIB/whatever.
  *
@@ -272,8 +360,10 @@ typedef RTLDRARCH *PRTLDRARCH;
 /** Open for debugging or introspection reasons.
  * This will skip a few of the stricter validations when loading images. */
 #define RTLDR_O_FOR_DEBUG       RT_BIT_32(0)
+/** Open for signature validation. */
+#define RTLDR_O_FOR_VALIDATION  RT_BIT_32(1)
 /** Mask of valid flags. */
-#define RTLDR_O_VALID_MASK      UINT32_C(0x00000001)
+#define RTLDR_O_VALID_MASK      UINT32_C(0x00000003)
 /** @} */
 
 /**
@@ -299,6 +389,20 @@ RTDECL(int) RTLdrOpen(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArc
  */
 RTDECL(int) RTLdrOpenkLdr(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
 
+/**
+ * Open part with reader.
+ *
+ * @returns iprt status code.
+ * @param   pReader     The loader reader instance which will provide the raw
+ *                      image bits.  The reader instance will be consumed on
+ *                      success.  On failure, the caller has to do the cleaning
+ *                      up.
+ * @param   fFlags      Valid RTLDR_O_XXX combination.
+ * @param   enmArch     Architecture specifier.
+ * @param   phMod       Where to store the handle.
+ * @param   pErrInfo    Where to return extended error information. Optional.
+ */
+RTDECL(int) RTLdrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod, PRTERRINFO pErrInfo);
 
 /**
  * Called to read @a cb bytes at @a off into @a pvBuf.
@@ -827,6 +931,145 @@ RTDECL(RTLDRENDIAN) RTLdrGetEndian(RTLDRMOD hLdrMod);
  */
 RTDECL(RTLDRARCH) RTLdrGetArch(RTLDRMOD hLdrMod);
 
+/**
+ * Loader properties that can be queried thru RTLdrQueryProp.
+ */
+typedef enum RTLDRPROP
+{
+    RTLDRPROP_INVALID = 0,
+    /** The image UUID (Mach-O).
+     * Returns a RTUUID in the buffer. */
+    RTLDRPROP_UUID,
+    /** The image timestamp in seconds, genrally since unix epoc.
+     * Returns a 32-bit or 64-bit signed integer value in the buffer. */
+    RTLDRPROP_TIMESTAMP_SECONDS,
+    /** Checks if the image is signed.
+     * Returns a bool.  */
+    RTLDRPROP_IS_SIGNED,
+    /** Retrives the PKCS \#7 SignedData blob that signs the image.
+     * Returns variable sized buffer containing the ASN.1 BER encoding.
+     *
+     * @remarks This generally starts with a PKCS \#7 Content structure, the
+     *          SignedData bit is found a few levels down into this as per RFC. */
+    RTLDRPROP_PKCS7_SIGNED_DATA,
+    /** Query whether code signature checks are enabled.  */
+    RTLDRPROP_SIGNATURE_CHECKS_ENFORCED,
+
+    /** End of valid properties.  */
+    RTLDRPROP_END,
+    /** Blow the type up to 32 bits. */
+    RTLDRPROP_32BIT_HACK = 0x7fffffff
+} RTLDRPROP;
+
+/**
+ * Generic method for querying image properties.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_NOT_SUPPORTED if the property query isn't supported (either all
+ *          or that specific property).  The caller must handle this result.
+ * @retval  VERR_NOT_FOUND the property was not found in the module.  The caller
+ *          must also normally deal with this.
+ * @retval  VERR_INVALID_FUNCTION if the function value is wrong.
+ * @retval  VERR_INVALID_PARAMETER if the buffer size is wrong.
+ * @retval  VERR_BUFFER_OVERFLOW if the function doesn't have a fixed size
+ *          buffer and the buffer isn't big enough.  Use RTLdrQueryPropEx.
+ * @retval  VERR_INVALID_HANDLE if the handle is invalid.
+ *
+ * @param   hLdrMod         The module handle.
+ * @param   enmLdrProp      The property to query.
+ * @param   pvBuf           Pointer to the return buffer.
+ * @param   cbBuf           The size of the return buffer.
+ */
+RTDECL(int) RTLdrQueryProp(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf);
+
+/**
+ * Generic method for querying image properties, extended version.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_NOT_SUPPORTED if the property query isn't supported (either all
+ *          or that specific property).  The caller must handle this result.
+ * @retval  VERR_NOT_FOUND the property was not found in the module.  The caller
+ *          must also normally deal with this.
+ * @retval  VERR_INVALID_FUNCTION if the function value is wrong.
+ * @retval  VERR_INVALID_PARAMETER if the fixed buffer size is wrong. Correct
+ *          size in @a *pcbRet.
+ * @retval  VERR_BUFFER_OVERFLOW if the function doesn't have a fixed size
+ *          buffer and the buffer isn't big enough. Correct size in @a *pcbRet.
+ * @retval  VERR_INVALID_HANDLE if the handle is invalid.
+ *
+ * @param   hLdrMod         The module handle.
+ * @param   enmLdrProp      The property to query.
+ * @param   pvBuf           Pointer to the return buffer.
+ * @param   cbBuf           The size of the return buffer.
+ * @param   pcbRet          Where to return the amount of data returned.  On
+ *                          buffer size errors, this is set to the correct size.
+ *                          Optional.
+ */
+RTDECL(int) RTLdrQueryPropEx(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbBuf);
+
+
+/**
+ * Signature type, see FNRTLDRVALIDATESIGNEDDATA.
+ */
+typedef enum RTLDRSIGNATURETYPE
+{
+    /** Invalid value. */
+    RTLDRSIGNATURETYPE_INVALID = 0,
+    /** A RTPKCS7CONTENTINFO structure w/ RTPKCS7SIGNEDDATA inside.
+     * It's parsed, so the whole binary ASN.1 representation can be found by
+     * using RTASN1CORE_GET_RAW_ASN1_PTR() and RTASN1CORE_GET_RAW_ASN1_SIZE(). */
+    RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
+    /** End of valid values. */
+    RTLDRSIGNATURETYPE_END,
+    /** Make sure the size is 32-bit. */
+    RTLDRSIGNATURETYPE_32BIT_HACK = 0x7fffffff
+} RTLDRSIGNATURETYPE;
+
+/**
+ * Callback used by RTLdrVerifySignature to verify the signature and associated
+ * certificates.
+ *
+ * @returns IPRT status code.
+ * @param   hLdrMod         The module handle.
+ * @param   enmSignature    The signature format.
+ * @param   pvSignature     The signature data. Format given by @a enmSignature.
+ * @param   cbSignature     The size of the buffer @a pvSignature points to.
+ * @param   pErrInfo        Pointer to an error info buffer, optional.
+ * @param   pvUser          User argument.
+ *
+ */
+typedef DECLCALLBACK(int) FNRTLDRVALIDATESIGNEDDATA(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature, void const *pvSignature, size_t cbSignature,
+                                                    PRTERRINFO pErrInfo, void *pvUser);
+/** Pointer to a signature verification callback. */
+typedef FNRTLDRVALIDATESIGNEDDATA *PFNRTLDRVALIDATESIGNEDDATA;
+
+/**
+ * Verify the image signature.
+ *
+ * This may permform additional integrity checks on the image structures that
+ * was not done when opening the image.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_LDRVI_NOT_SIGNED if not signed.
+ *
+ * @param   hLdrMod         The module handle.
+ * @param   pfnCallback     Callback that does the signature and certificate
+ *                          verficiation.
+ * @param   pvUser          User argument for the callback.
+ * @param   pErrInfo        Pointer to an error info buffer. Optional.
+ */
+RTDECL(int) RTLdrVerifySignature(RTLDRMOD hLdrMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo);
+
+/**
+ * Calculate the image hash according the image signing rules.
+ *
+ * @returns IPRT status code.
+ * @param   hLdrMod         The module handle.
+ * @param   enmDigest       Which kind of digest.
+ * @param   pszDigest       Where to store the image digest.
+ * @param   cbDigest        Size of the buffer @a pszDigest points at.
+ */
+RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest);
 
 RT_C_DECLS_END
 
diff --git a/include/iprt/log.h b/include/iprt/log.h
index 427eebc..f0ce1c1 100644
--- a/include/iprt/log.h
+++ b/include/iprt/log.h
@@ -1816,6 +1816,16 @@ RTDECL(void) RTLogPrintf(const char *pszFormat, ...);
  */
 RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args);
 
+/**
+ * Dumper vprintf-like function outputting to a logger.
+ *
+ * @param   pvUser          Pointer to the logger instance to use, NULL for
+ *                          default instance.
+ * @param   pszFormat       Format string.
+ * @param   va              Format arguments.
+ */
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);
+
 
 #ifndef DECLARED_FNRTSTROUTPUT          /* duplicated in iprt/string.h */
 #define DECLARED_FNRTSTROUTPUT
diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h
index 8296373..ce76915 100644
--- a/include/iprt/mangling.h
+++ b/include/iprt/mangling.h
@@ -273,7 +273,9 @@
 # define RTAvlULRemove                                  RT_MANGLER(RTAvlULRemove)
 # define RTAvlULRemoveBestFit                           RT_MANGLER(RTAvlULRemoveBestFit)
 # define RTBase64Decode                                 RT_MANGLER(RTBase64Decode)
+# define RTBase64DecodeEx                               RT_MANGLER(RTBase64DecodeEx)
 # define RTBase64DecodedSize                            RT_MANGLER(RTBase64DecodedSize)
+# define RTBase64DecodedSizeEx                          RT_MANGLER(RTBase64DecodedSizeEx)
 # define RTBase64Encode                                 RT_MANGLER(RTBase64Encode)
 # define RTBase64EncodedLength                          RT_MANGLER(RTBase64EncodedLength)
 # define RTBldCfgCompiler                               RT_MANGLER(RTBldCfgCompiler)
@@ -408,6 +410,7 @@
 # define RTDbgModCreateFromMap                          RT_MANGLER(RTDbgModCreateFromMap)
 # define RTDbgModCreateFromPdb                          RT_MANGLER(RTDbgModCreateFromPdb)
 # define RTDbgModCreateFromPeImage                      RT_MANGLER(RTDbgModCreateFromPeImage)
+# define RTDbgModCreateFromMachOImage                   RT_MANGLER(RTDbgModCreateFromMachOImage)
 # define RTDbgModGetTag                                 RT_MANGLER(RTDbgModGetTag)
 # define RTDbgModImageSize                              RT_MANGLER(RTDbgModImageSize)
 # define RTDbgModIsDeferred                             RT_MANGLER(RTDbgModIsDeferred)
@@ -546,6 +549,10 @@
 # define RTFileAioReqPrepareWrite                       RT_MANGLER(RTFileAioReqPrepareWrite)
 # define RTFileChangeLock                               RT_MANGLER(RTFileChangeLock)
 # define RTFileClose                                    RT_MANGLER(RTFileClose)
+# define RTFileCompare                                  RT_MANGLER(RTFileCompare)
+# define RTFileCompareByHandles                         RT_MANGLER(RTFileCompareByHandles)
+# define RTFileCompareByHandlesEx                       RT_MANGLER(RTFileCompareByHandlesEx)
+# define RTFileCompareEx                                RT_MANGLER(RTFileCompareEx)
 # define RTFileCopy                                     RT_MANGLER(RTFileCopy)
 # define RTFileCopyByHandles                            RT_MANGLER(RTFileCopyByHandles)
 # define RTFileCopyByHandlesEx                          RT_MANGLER(RTFileCopyByHandlesEx)
@@ -787,6 +794,7 @@
 # define RTLogLoggerV                                   RT_MANGLER(RTLogLoggerV)
 # define RTLogPrintf                                    RT_MANGLER(RTLogPrintf)
 # define RTLogPrintfV                                   RT_MANGLER(RTLogPrintfV)
+# define RTLogDumpPrintfV                               RT_MANGLER(RTLogDumpPrintfV)
 # define RTLogRelDefaultInstance                        RT_MANGLER(RTLogRelDefaultInstance)
 # define RTLogRelLogger                                 RT_MANGLER(RTLogRelLogger)
 # define RTLogRelLoggerV                                RT_MANGLER(RTLogRelLoggerV)
@@ -882,6 +890,11 @@
 # define RTMemExecFree                                  RT_MANGLER(RTMemExecFree)
 # define RTMemFree                                      RT_MANGLER(RTMemFree)
 # define RTMemFreeEx                                    RT_MANGLER(RTMemFreeEx)
+# define RTMemLockedAllocExTag                          RT_MANGLER(RTMemLockedAllocExTag)
+# define RTMemLockedAllocZExTag                         RT_MANGLER(RTMemLockedAllocZExTag)
+# define RTMemLockedAllocTag                            RT_MANGLER(RTMemLockedAllocTag)
+# define RTMemLockedAllocZTag                           RT_MANGLER(RTMemLockedAllocZTag)
+# define RTMemLockedFree                                RT_MANGLER(RTMemLockedFree)
 # define RTMemPageAllocTag                              RT_MANGLER(RTMemPageAllocTag)
 # define RTMemPageAllocZTag                             RT_MANGLER(RTMemPageAllocZTag)
 # define RTMemPageFree                                  RT_MANGLER(RTMemPageFree)
@@ -1074,6 +1087,7 @@
 # define RTProcGetExecutablePath                        RT_MANGLER(RTProcGetExecutablePath)
 # define RTProcGetPriority                              RT_MANGLER(RTProcGetPriority)
 # define RTProcIsRunningByName                          RT_MANGLER(RTProcIsRunningByName)
+# define RTProcQueryParent                              RT_MANGLER(RTProcQueryParent)
 # define RTProcQueryUsername                            RT_MANGLER(RTProcQueryUsername)
 # define RTProcQueryUsernameA                           RT_MANGLER(RTProcQueryUsernameA)
 # define RTProcSelf                                     RT_MANGLER(RTProcSelf)
@@ -1293,6 +1307,14 @@
 # define RTSha1Init                                     RT_MANGLER(RTSha1Init)
 # define RTSha1ToString                                 RT_MANGLER(RTSha1ToString)
 # define RTSha1Update                                   RT_MANGLER(RTSha1Update)
+# define RTSha224                                       RT_MANGLER(RTSha224)
+# define RTSha224Final                                  RT_MANGLER(RTSha224Final)
+# define RTSha224FromString                             RT_MANGLER(RTSha224FromString)
+# define RTSha224Init                                   RT_MANGLER(RTSha224Init)
+# define RTSha224ToString                               RT_MANGLER(RTSha224ToString)
+# define RTSha224Update                                 RT_MANGLER(RTSha224Update)
+# define RTSha224Digest                                 RT_MANGLER(RTSha224Digest)
+# define RTSha224DigestFromFile                         RT_MANGLER(RTSha224DigestFromFile)
 # define RTSha256                                       RT_MANGLER(RTSha256)
 # define RTSha256Final                                  RT_MANGLER(RTSha256Final)
 # define RTSha256FromString                             RT_MANGLER(RTSha256FromString)
@@ -1301,12 +1323,30 @@
 # define RTSha256Update                                 RT_MANGLER(RTSha256Update)
 # define RTSha256Digest                                 RT_MANGLER(RTSha256Digest)
 # define RTSha256DigestFromFile                         RT_MANGLER(RTSha256DigestFromFile)
+# define RTSha384                                       RT_MANGLER(RTSha384)
+# define RTSha384Final                                  RT_MANGLER(RTSha384Final)
+# define RTSha384FromString                             RT_MANGLER(RTSha384FromString)
+# define RTSha384Init                                   RT_MANGLER(RTSha384Init)
+# define RTSha384ToString                               RT_MANGLER(RTSha384ToString)
+# define RTSha384Update                                 RT_MANGLER(RTSha384Update)
 # define RTSha512                                       RT_MANGLER(RTSha512)
 # define RTSha512Final                                  RT_MANGLER(RTSha512Final)
 # define RTSha512FromString                             RT_MANGLER(RTSha512FromString)
 # define RTSha512Init                                   RT_MANGLER(RTSha512Init)
 # define RTSha512ToString                               RT_MANGLER(RTSha512ToString)
 # define RTSha512Update                                 RT_MANGLER(RTSha512Update)
+# define RTSha512t224                                   RT_MANGLER(RTSha512t224)
+# define RTSha512t224Final                              RT_MANGLER(RTSha512t224Final)
+# define RTSha512t224FromString                         RT_MANGLER(RTSha512t224FromString)
+# define RTSha512t224Init                               RT_MANGLER(RTSha512t224Init)
+# define RTSha512t224ToString                           RT_MANGLER(RTSha512t224ToString)
+# define RTSha512t224Update                             RT_MANGLER(RTSha512t224Update)
+# define RTSha512t256                                   RT_MANGLER(RTSha512t256)
+# define RTSha512t256Final                              RT_MANGLER(RTSha512t256Final)
+# define RTSha512t256FromString                         RT_MANGLER(RTSha512t256FromString)
+# define RTSha512t256Init                               RT_MANGLER(RTSha512t256Init)
+# define RTSha512t256ToString                           RT_MANGLER(RTSha512t256ToString)
+# define RTSha512t256Update                             RT_MANGLER(RTSha512t256Update)
 # define RTSocketClose                                  RT_MANGLER(RTSocketClose)
 # define RTSocketFromNative                             RT_MANGLER(RTSocketFromNative)
 # define RTSocketQueryAddressStr                        RT_MANGLER(RTSocketQueryAddressStr)
@@ -1416,6 +1456,7 @@
 # define RTStrmOpenFV                                   RT_MANGLER(RTStrmOpenFV)
 # define RTStrmPrintf                                   RT_MANGLER(RTStrmPrintf)
 # define RTStrmPrintfV                                  RT_MANGLER(RTStrmPrintfV)
+# define RTStrmDumpPrintfV                              RT_MANGLER(RTStrmDumpPrintfV)
 # define RTStrmPutCh                                    RT_MANGLER(RTStrmPutCh)
 # define RTStrmPutStr                                   RT_MANGLER(RTStrmPutStr)
 # define RTStrmReadEx                                   RT_MANGLER(RTStrmReadEx)
@@ -1761,6 +1802,7 @@
 # define RTUtf16CalcUtf8Len                             RT_MANGLER(RTUtf16CalcUtf8Len)
 # define RTUtf16CalcUtf8LenEx                           RT_MANGLER(RTUtf16CalcUtf8LenEx)
 # define RTUtf16Cmp                                     RT_MANGLER(RTUtf16Cmp)
+# define RTUtf16CmpAscii                                RT_MANGLER(RTUtf16CmpAscii)
 # define RTUtf16DupExTag                                RT_MANGLER(RTUtf16DupExTag)
 # define RTUtf16DupTag                                  RT_MANGLER(RTUtf16DupTag)
 # define RTUtf16Free                                    RT_MANGLER(RTUtf16Free)
@@ -1896,8 +1938,891 @@
 # define RTZipGzipCompressIoStream                      RT_MANGLER(RTZipGzipCompressIoStream)
 # define RTZipGzipDecompressIoStream                    RT_MANGLER(RTZipGzipDecompressIoStream)
 # define RTZipTarCmd                                    RT_MANGLER(RTZipTarCmd)
+# define RTZipUnzipCmd                                  RT_MANGLER(RTZipUnzipCmd)
 # define RTZipTarFsStreamFromIoStream                   RT_MANGLER(RTZipTarFsStreamFromIoStream)
 # define RTZipXarFsStreamFromIoStream                   RT_MANGLER(RTZipXarFsStreamFromIoStream)
+# define RTZipPkzipFsStreamFromIoStream                 RT_MANGLER(RTZipPkzipFsStreamFromIoStream)
+# define RTZipPkzipMemDecompress                        RT_MANGLER(RTZipPkzipMemDecompress)
+
+/* sort/merge into the above later: */
+# define RTAsn1ContentAllocZ                            RT_MANGLER(RTAsn1ContentAllocZ)
+# define RTAsn1ContentDup                               RT_MANGLER(RTAsn1ContentDup)
+# define RTAsn1ContentFree                              RT_MANGLER(RTAsn1ContentFree)
+# define RTAsn1ContentReallocZ                          RT_MANGLER(RTAsn1ContentReallocZ)
+# define RTAsn1ContextTagN_Clone                        RT_MANGLER(RTAsn1ContextTagN_Clone)
+# define RTAsn1ContextTagN_Init                         RT_MANGLER(RTAsn1ContextTagN_Init)
+# define RTAsn1Dummy_InitEx                             RT_MANGLER(RTAsn1Dummy_InitEx)
+# define RTAsn1MemAllocZ                                RT_MANGLER(RTAsn1MemAllocZ)
+# define RTAsn1MemDup                                   RT_MANGLER(RTAsn1MemDup)
+# define RTAsn1MemFree                                  RT_MANGLER(RTAsn1MemFree)
+# define RTAsn1MemGrowArray                             RT_MANGLER(RTAsn1MemGrowArray)
+# define RTAsn1MemInitAllocation                        RT_MANGLER(RTAsn1MemInitAllocation)
+# define RTAsn1SeqOfCore_Clone                          RT_MANGLER(RTAsn1SeqOfCore_Clone)
+# define RTAsn1SeqOfCore_Init                           RT_MANGLER(RTAsn1SeqOfCore_Init)
+# define RTAsn1SequenceCore_Clone                       RT_MANGLER(RTAsn1SequenceCore_Clone)
+# define RTAsn1SequenceCore_Init                        RT_MANGLER(RTAsn1SequenceCore_Init)
+# define RTAsn1SetCore_Clone                            RT_MANGLER(RTAsn1SetCore_Clone)
+# define RTAsn1SetCore_Init                             RT_MANGLER(RTAsn1SetCore_Init)
+# define RTAsn1SetOfCore_Clone                          RT_MANGLER(RTAsn1SetOfCore_Clone)
+# define RTAsn1SetOfCore_Init                           RT_MANGLER(RTAsn1SetOfCore_Init)
+# define RTAsn1VtCheckSanity                            RT_MANGLER(RTAsn1VtCheckSanity)
+# define RTAsn1VtClone                                  RT_MANGLER(RTAsn1VtClone)
+# define RTAsn1VtCompare                                RT_MANGLER(RTAsn1VtCompare)
+# define RTAsn1VtDeepEnum                               RT_MANGLER(RTAsn1VtDeepEnum)
+# define RTAsn1VtDelete                                 RT_MANGLER(RTAsn1VtDelete)
+# define RTAsn1CursorCheckEnd                           RT_MANGLER(RTAsn1CursorCheckEnd)
+# define RTAsn1CursorGetBitString                       RT_MANGLER(RTAsn1CursorGetBitString)
+# define RTAsn1CursorGetBitStringEx                     RT_MANGLER(RTAsn1CursorGetBitStringEx)
+# define RTAsn1CursorGetBmpString                       RT_MANGLER(RTAsn1CursorGetBmpString)
+# define RTAsn1CursorGetBoolean                         RT_MANGLER(RTAsn1CursorGetBoolean)
+# define RTAsn1CursorGetContextTagNCursor               RT_MANGLER(RTAsn1CursorGetContextTagNCursor)
+# define RTAsn1CursorGetCore                            RT_MANGLER(RTAsn1CursorGetCore)
+# define RTAsn1CursorGetDynType                         RT_MANGLER(RTAsn1CursorGetDynType)
+# define RTAsn1CursorGetIa5String                       RT_MANGLER(RTAsn1CursorGetIa5String)
+# define RTAsn1CursorGetInteger                         RT_MANGLER(RTAsn1CursorGetInteger)
+# define RTAsn1CursorGetNull                            RT_MANGLER(RTAsn1CursorGetNull)
+# define RTAsn1CursorGetObjId                           RT_MANGLER(RTAsn1CursorGetObjId)
+# define RTAsn1CursorGetOctetString                     RT_MANGLER(RTAsn1CursorGetOctetString)
+# define RTAsn1CursorGetSequenceCursor                  RT_MANGLER(RTAsn1CursorGetSequenceCursor)
+# define RTAsn1CursorGetSetCursor                       RT_MANGLER(RTAsn1CursorGetSetCursor)
+# define RTAsn1CursorGetString                          RT_MANGLER(RTAsn1CursorGetString)
+# define RTAsn1CursorGetTime                            RT_MANGLER(RTAsn1CursorGetTime)
+# define RTAsn1CursorGetUtf8String                      RT_MANGLER(RTAsn1CursorGetUtf8String)
+# define RTAsn1CursorInitAllocation                     RT_MANGLER(RTAsn1CursorInitAllocation)
+# define RTAsn1CursorInitPrimary                        RT_MANGLER(RTAsn1CursorInitPrimary)
+# define RTAsn1CursorInitSubFromCore                    RT_MANGLER(RTAsn1CursorInitSubFromCore)
+# define RTAsn1CursorIsNextEx                           RT_MANGLER(RTAsn1CursorIsNextEx)
+# define RTAsn1CursorMatchTagClassFlagsEx               RT_MANGLER(RTAsn1CursorMatchTagClassFlagsEx)
+# define RTAsn1CursorPeek                               RT_MANGLER(RTAsn1CursorPeek)
+# define RTAsn1CursorReadHdr                            RT_MANGLER(RTAsn1CursorReadHdr)
+# define RTAsn1CursorSetInfo                            RT_MANGLER(RTAsn1CursorSetInfo)
+# define RTAsn1CursorSetInfoV                           RT_MANGLER(RTAsn1CursorSetInfoV)
+# define RTAsn1Dump                                     RT_MANGLER(RTAsn1Dump)
+# define RTAsn1EncodePrepare                            RT_MANGLER(RTAsn1EncodePrepare)
+# define RTAsn1EncodeRecalcHdrSize                      RT_MANGLER(RTAsn1EncodeRecalcHdrSize)
+# define RTAsn1EncodeWrite                              RT_MANGLER(RTAsn1EncodeWrite)
+# define RTAsnEncodeWriteHeader                         RT_MANGLER(RTAsnEncodeWriteHeader)
+# define RTAsn1BitString_CheckSanity                    RT_MANGLER(RTAsn1BitString_CheckSanity)
+# define RTAsn1BitString_Clone                          RT_MANGLER(RTAsn1BitString_Clone)
+# define RTAsn1BitString_Compare                        RT_MANGLER(RTAsn1BitString_Compare)
+# define RTAsn1BitString_Delete                         RT_MANGLER(RTAsn1BitString_Delete)
+# define RTAsn1BitString_Enum                           RT_MANGLER(RTAsn1BitString_Enum)
+# define RTAsn1BitString_GetAsUInt64                    RT_MANGLER(RTAsn1BitString_GetAsUInt64)
+# define RTAsn1BitString_Init                           RT_MANGLER(RTAsn1BitString_Init)
+# define RTAsn1SeqOfBitStrings_CheckSanity              RT_MANGLER(RTAsn1SeqOfBitStrings_CheckSanity)
+# define RTAsn1SeqOfBitStrings_Clone                    RT_MANGLER(RTAsn1SeqOfBitStrings_Clone)
+# define RTAsn1SeqOfBitStrings_Compare                  RT_MANGLER(RTAsn1SeqOfBitStrings_Compare)
+# define RTAsn1SeqOfBitStrings_Delete                   RT_MANGLER(RTAsn1SeqOfBitStrings_Delete)
+# define RTAsn1SeqOfBitStrings_Enum                     RT_MANGLER(RTAsn1SeqOfBitStrings_Enum)
+# define RTAsn1SeqOfBitStrings_Init                     RT_MANGLER(RTAsn1SeqOfBitStrings_Init)
+# define RTAsn1SetOfBitStrings_CheckSanity              RT_MANGLER(RTAsn1SetOfBitStrings_CheckSanity)
+# define RTAsn1SetOfBitStrings_Clone                    RT_MANGLER(RTAsn1SetOfBitStrings_Clone)
+# define RTAsn1SetOfBitStrings_Compare                  RT_MANGLER(RTAsn1SetOfBitStrings_Compare)
+# define RTAsn1SetOfBitStrings_Delete                   RT_MANGLER(RTAsn1SetOfBitStrings_Delete)
+# define RTAsn1SetOfBitStrings_Enum                     RT_MANGLER(RTAsn1SetOfBitStrings_Enum)
+# define RTAsn1SetOfBitStrings_Init                     RT_MANGLER(RTAsn1SetOfBitStrings_Init)
+# define RTAsn1BitString_DecodeAsn1                     RT_MANGLER(RTAsn1BitString_DecodeAsn1)
+# define RTAsn1BitString_DecodeAsn1Ex                   RT_MANGLER(RTAsn1BitString_DecodeAsn1Ex)
+# define RTAsn1SeqOfBitStrings_DecodeAsn1               RT_MANGLER(RTAsn1SeqOfBitStrings_DecodeAsn1)
+# define RTAsn1SetOfBitStrings_DecodeAsn1               RT_MANGLER(RTAsn1SetOfBitStrings_DecodeAsn1)
+# define RTAsn1Boolean_CheckSanity                      RT_MANGLER(RTAsn1Boolean_CheckSanity)
+# define RTAsn1Boolean_Clone                            RT_MANGLER(RTAsn1Boolean_Clone)
+# define RTAsn1Boolean_Compare                          RT_MANGLER(RTAsn1Boolean_Compare)
+# define RTAsn1Boolean_Delete                           RT_MANGLER(RTAsn1Boolean_Delete)
+# define RTAsn1Boolean_Enum                             RT_MANGLER(RTAsn1Boolean_Enum)
+# define RTAsn1Boolean_Init                             RT_MANGLER(RTAsn1Boolean_Init)
+# define RTAsn1Boolean_InitDefault                      RT_MANGLER(RTAsn1Boolean_InitDefault)
+# define RTAsn1Boolean_Set                              RT_MANGLER(RTAsn1Boolean_Set)
+# define RTAsn1SeqOfBooleans_CheckSanity                RT_MANGLER(RTAsn1SeqOfBooleans_CheckSanity)
+# define RTAsn1SeqOfBooleans_Clone                      RT_MANGLER(RTAsn1SeqOfBooleans_Clone)
+# define RTAsn1SeqOfBooleans_Compare                    RT_MANGLER(RTAsn1SeqOfBooleans_Compare)
+# define RTAsn1SeqOfBooleans_Delete                     RT_MANGLER(RTAsn1SeqOfBooleans_Delete)
+# define RTAsn1SeqOfBooleans_Enum                       RT_MANGLER(RTAsn1SeqOfBooleans_Enum)
+# define RTAsn1SeqOfBooleans_Init                       RT_MANGLER(RTAsn1SeqOfBooleans_Init)
+# define RTAsn1SetOfBooleans_CheckSanity                RT_MANGLER(RTAsn1SetOfBooleans_CheckSanity)
+# define RTAsn1SetOfBooleans_Clone                      RT_MANGLER(RTAsn1SetOfBooleans_Clone)
+# define RTAsn1SetOfBooleans_Compare                    RT_MANGLER(RTAsn1SetOfBooleans_Compare)
+# define RTAsn1SetOfBooleans_Delete                     RT_MANGLER(RTAsn1SetOfBooleans_Delete)
+# define RTAsn1SetOfBooleans_Enum                       RT_MANGLER(RTAsn1SetOfBooleans_Enum)
+# define RTAsn1SetOfBooleans_Init                       RT_MANGLER(RTAsn1SetOfBooleans_Init)
+# define RTAsn1Boolean_DecodeAsn1                       RT_MANGLER(RTAsn1Boolean_DecodeAsn1)
+# define RTAsn1SeqOfBooleans_DecodeAsn1                 RT_MANGLER(RTAsn1SeqOfBooleans_DecodeAsn1)
+# define RTAsn1SetOfBooleans_DecodeAsn1                 RT_MANGLER(RTAsn1SetOfBooleans_DecodeAsn1)
+# define RTAsn1Core_ChangeTag                           RT_MANGLER(RTAsn1Core_ChangeTag)
+# define RTAsn1Core_CheckSanity                         RT_MANGLER(RTAsn1Core_CheckSanity)
+# define RTAsn1Core_Clone                               RT_MANGLER(RTAsn1Core_Clone)
+# define RTAsn1Core_CloneContent                        RT_MANGLER(RTAsn1Core_CloneContent)
+# define RTAsn1Core_CloneNoContent                      RT_MANGLER(RTAsn1Core_CloneNoContent)
+# define RTAsn1Core_Compare                             RT_MANGLER(RTAsn1Core_Compare)
+# define RTAsn1Core_CompareEx                           RT_MANGLER(RTAsn1Core_CompareEx)
+# define RTAsn1Core_Delete                              RT_MANGLER(RTAsn1Core_Delete)
+# define RTAsn1Core_Enum                                RT_MANGLER(RTAsn1Core_Enum)
+# define RTAsn1Core_Init                                RT_MANGLER(RTAsn1Core_Init)
+# define RTAsn1Core_InitDefault                         RT_MANGLER(RTAsn1Core_InitDefault)
+# define RTAsn1Core_InitEx                              RT_MANGLER(RTAsn1Core_InitEx)
+# define RTAsn1Core_ResetImplict                        RT_MANGLER(RTAsn1Core_ResetImplict)
+# define RTAsn1Core_SetTagAndFlags                      RT_MANGLER(RTAsn1Core_SetTagAndFlags)
+# define RTAsn1SeqOfCores_CheckSanity                   RT_MANGLER(RTAsn1SeqOfCores_CheckSanity)
+# define RTAsn1SeqOfCores_Clone                         RT_MANGLER(RTAsn1SeqOfCores_Clone)
+# define RTAsn1SeqOfCores_Compare                       RT_MANGLER(RTAsn1SeqOfCores_Compare)
+# define RTAsn1SeqOfCores_Delete                        RT_MANGLER(RTAsn1SeqOfCores_Delete)
+# define RTAsn1SeqOfCores_Enum                          RT_MANGLER(RTAsn1SeqOfCores_Enum)
+# define RTAsn1SeqOfCores_Init                          RT_MANGLER(RTAsn1SeqOfCores_Init)
+# define RTAsn1SetOfCores_CheckSanity                   RT_MANGLER(RTAsn1SetOfCores_CheckSanity)
+# define RTAsn1SetOfCores_Clone                         RT_MANGLER(RTAsn1SetOfCores_Clone)
+# define RTAsn1SetOfCores_Compare                       RT_MANGLER(RTAsn1SetOfCores_Compare)
+# define RTAsn1SetOfCores_Delete                        RT_MANGLER(RTAsn1SetOfCores_Delete)
+# define RTAsn1SetOfCores_Enum                          RT_MANGLER(RTAsn1SetOfCores_Enum)
+# define RTAsn1SetOfCores_Init                          RT_MANGLER(RTAsn1SetOfCores_Init)
+# define RTAsn1Core_DecodeAsn1                          RT_MANGLER(RTAsn1Core_DecodeAsn1)
+# define RTAsn1SeqOfCores_DecodeAsn1                    RT_MANGLER(RTAsn1SeqOfCores_DecodeAsn1)
+# define RTAsn1SetOfCores_DecodeAsn1                    RT_MANGLER(RTAsn1SetOfCores_DecodeAsn1)
+# define RTAsn1DynType_CheckSanity                      RT_MANGLER(RTAsn1DynType_CheckSanity)
+# define RTAsn1DynType_Clone                            RT_MANGLER(RTAsn1DynType_Clone)
+# define RTAsn1DynType_Compare                          RT_MANGLER(RTAsn1DynType_Compare)
+# define RTAsn1DynType_Delete                           RT_MANGLER(RTAsn1DynType_Delete)
+# define RTAsn1DynType_Enum                             RT_MANGLER(RTAsn1DynType_Enum)
+# define RTAsn1DynType_Init                             RT_MANGLER(RTAsn1DynType_Init)
+# define RTAsn1DynType_DecodeAsn1                       RT_MANGLER(RTAsn1DynType_DecodeAsn1)
+# define RTAsn1Integer_CheckSanity                      RT_MANGLER(RTAsn1Integer_CheckSanity)
+# define RTAsn1Integer_Clone                            RT_MANGLER(RTAsn1Integer_Clone)
+# define RTAsn1Integer_Compare                          RT_MANGLER(RTAsn1Integer_Compare)
+# define RTAsn1Integer_Delete                           RT_MANGLER(RTAsn1Integer_Delete)
+# define RTAsn1Integer_Enum                             RT_MANGLER(RTAsn1Integer_Enum)
+# define RTAsn1Integer_FromBigNum                       RT_MANGLER(RTAsn1Integer_FromBigNum)
+# define RTAsn1Integer_Init                             RT_MANGLER(RTAsn1Integer_Init)
+# define RTAsn1Integer_InitDefault                      RT_MANGLER(RTAsn1Integer_InitDefault)
+# define RTAsn1Integer_InitU64                          RT_MANGLER(RTAsn1Integer_InitU64)
+# define RTAsn1Integer_ToBigNum                         RT_MANGLER(RTAsn1Integer_ToBigNum)
+# define RTAsn1Integer_UnsignedCompare                  RT_MANGLER(RTAsn1Integer_UnsignedCompare)
+# define RTAsn1Integer_UnsignedCompareWithU32           RT_MANGLER(RTAsn1Integer_UnsignedCompareWithU32)
+# define RTAsn1Integer_UnsignedCompareWithU64           RT_MANGLER(RTAsn1Integer_UnsignedCompareWithU64)
+# define RTAsn1Integer_UnsignedLastBit                  RT_MANGLER(RTAsn1Integer_UnsignedLastBit)
+# define RTAsn1SeqOfIntegers_CheckSanity                RT_MANGLER(RTAsn1SeqOfIntegers_CheckSanity)
+# define RTAsn1SeqOfIntegers_Clone                      RT_MANGLER(RTAsn1SeqOfIntegers_Clone)
+# define RTAsn1SeqOfIntegers_Compare                    RT_MANGLER(RTAsn1SeqOfIntegers_Compare)
+# define RTAsn1SeqOfIntegers_Delete                     RT_MANGLER(RTAsn1SeqOfIntegers_Delete)
+# define RTAsn1SeqOfIntegers_Enum                       RT_MANGLER(RTAsn1SeqOfIntegers_Enum)
+# define RTAsn1SeqOfIntegers_Init                       RT_MANGLER(RTAsn1SeqOfIntegers_Init)
+# define RTAsn1SetOfIntegers_CheckSanity                RT_MANGLER(RTAsn1SetOfIntegers_CheckSanity)
+# define RTAsn1SetOfIntegers_Clone                      RT_MANGLER(RTAsn1SetOfIntegers_Clone)
+# define RTAsn1SetOfIntegers_Compare                    RT_MANGLER(RTAsn1SetOfIntegers_Compare)
+# define RTAsn1SetOfIntegers_Delete                     RT_MANGLER(RTAsn1SetOfIntegers_Delete)
+# define RTAsn1SetOfIntegers_Enum                       RT_MANGLER(RTAsn1SetOfIntegers_Enum)
+# define RTAsn1SetOfIntegers_Init                       RT_MANGLER(RTAsn1SetOfIntegers_Init)
+# define RTAsn1Integer_DecodeAsn1                       RT_MANGLER(RTAsn1Integer_DecodeAsn1)
+# define RTAsn1SeqOfIntegers_DecodeAsn1                 RT_MANGLER(RTAsn1SeqOfIntegers_DecodeAsn1)
+# define RTAsn1SetOfIntegers_DecodeAsn1                 RT_MANGLER(RTAsn1SetOfIntegers_DecodeAsn1)
+# define RTAsn1Null_CheckSanity                         RT_MANGLER(RTAsn1Null_CheckSanity)
+# define RTAsn1Null_Clone                               RT_MANGLER(RTAsn1Null_Clone)
+# define RTAsn1Null_Compare                             RT_MANGLER(RTAsn1Null_Compare)
+# define RTAsn1Null_Delete                              RT_MANGLER(RTAsn1Null_Delete)
+# define RTAsn1Null_Enum                                RT_MANGLER(RTAsn1Null_Enum)
+# define RTAsn1Null_Init                                RT_MANGLER(RTAsn1Null_Init)
+# define RTAsn1Null_DecodeAsn1                          RT_MANGLER(RTAsn1Null_DecodeAsn1)
+# define RTAsn1ObjIdCountComponents                     RT_MANGLER(RTAsn1ObjIdCountComponents)
+# define RTAsn1ObjIdGetComponentsAsUInt32               RT_MANGLER(RTAsn1ObjIdGetComponentsAsUInt32)
+# define RTAsn1ObjIdGetLastComponentsAsUInt32           RT_MANGLER(RTAsn1ObjIdGetLastComponentsAsUInt32)
+# define RTAsn1ObjId_CheckSanity                        RT_MANGLER(RTAsn1ObjId_CheckSanity)
+# define RTAsn1ObjId_Clone                              RT_MANGLER(RTAsn1ObjId_Clone)
+# define RTAsn1ObjId_Compare                            RT_MANGLER(RTAsn1ObjId_Compare)
+# define RTAsn1ObjId_CompareWithString                  RT_MANGLER(RTAsn1ObjId_CompareWithString)
+# define RTAsn1ObjId_Delete                             RT_MANGLER(RTAsn1ObjId_Delete)
+# define RTAsn1ObjId_Enum                               RT_MANGLER(RTAsn1ObjId_Enum)
+# define RTAsn1ObjId_Init                               RT_MANGLER(RTAsn1ObjId_Init)
+# define RTAsn1ObjId_InitFromString                     RT_MANGLER(RTAsn1ObjId_InitFromString)
+# define RTAsn1ObjId_StartsWith                         RT_MANGLER(RTAsn1ObjId_StartsWith)
+# define RTAsn1SeqOfObjIds_CheckSanity                  RT_MANGLER(RTAsn1SeqOfObjIds_CheckSanity)
+# define RTAsn1SeqOfObjIds_Clone                        RT_MANGLER(RTAsn1SeqOfObjIds_Clone)
+# define RTAsn1SeqOfObjIds_Compare                      RT_MANGLER(RTAsn1SeqOfObjIds_Compare)
+# define RTAsn1SeqOfObjIds_Delete                       RT_MANGLER(RTAsn1SeqOfObjIds_Delete)
+# define RTAsn1SeqOfObjIds_Enum                         RT_MANGLER(RTAsn1SeqOfObjIds_Enum)
+# define RTAsn1SeqOfObjIds_Init                         RT_MANGLER(RTAsn1SeqOfObjIds_Init)
+# define RTAsn1SetOfObjIds_CheckSanity                  RT_MANGLER(RTAsn1SetOfObjIds_CheckSanity)
+# define RTAsn1SetOfObjIds_Clone                        RT_MANGLER(RTAsn1SetOfObjIds_Clone)
+# define RTAsn1SetOfObjIds_Compare                      RT_MANGLER(RTAsn1SetOfObjIds_Compare)
+# define RTAsn1SetOfObjIds_Delete                       RT_MANGLER(RTAsn1SetOfObjIds_Delete)
+# define RTAsn1SetOfObjIds_Enum                         RT_MANGLER(RTAsn1SetOfObjIds_Enum)
+# define RTAsn1SetOfObjIds_Init                         RT_MANGLER(RTAsn1SetOfObjIds_Init)
+# define RTAsn1ObjId_DecodeAsn1                         RT_MANGLER(RTAsn1ObjId_DecodeAsn1)
+# define RTAsn1SeqOfObjIds_DecodeAsn1                   RT_MANGLER(RTAsn1SeqOfObjIds_DecodeAsn1)
+# define RTAsn1SetOfObjIds_DecodeAsn1                   RT_MANGLER(RTAsn1SetOfObjIds_DecodeAsn1)
+# define RTAsn1OctetString_CheckSanity                  RT_MANGLER(RTAsn1OctetString_CheckSanity)
+# define RTAsn1OctetString_Clone                        RT_MANGLER(RTAsn1OctetString_Clone)
+# define RTAsn1OctetString_Compare                      RT_MANGLER(RTAsn1OctetString_Compare)
+# define RTAsn1OctetString_Delete                       RT_MANGLER(RTAsn1OctetString_Delete)
+# define RTAsn1OctetString_Enum                         RT_MANGLER(RTAsn1OctetString_Enum)
+# define RTAsn1OctetString_Init                         RT_MANGLER(RTAsn1OctetString_Init)
+# define RTAsn1SeqOfOctetStrings_CheckSanity            RT_MANGLER(RTAsn1SeqOfOctetStrings_CheckSanity)
+# define RTAsn1SeqOfOctetStrings_Clone                  RT_MANGLER(RTAsn1SeqOfOctetStrings_Clone)
+# define RTAsn1SeqOfOctetStrings_Compare                RT_MANGLER(RTAsn1SeqOfOctetStrings_Compare)
+# define RTAsn1SeqOfOctetStrings_Delete                 RT_MANGLER(RTAsn1SeqOfOctetStrings_Delete)
+# define RTAsn1SeqOfOctetStrings_Enum                   RT_MANGLER(RTAsn1SeqOfOctetStrings_Enum)
+# define RTAsn1SeqOfOctetStrings_Init                   RT_MANGLER(RTAsn1SeqOfOctetStrings_Init)
+# define RTAsn1SetOfOctetStrings_CheckSanity            RT_MANGLER(RTAsn1SetOfOctetStrings_CheckSanity)
+# define RTAsn1SetOfOctetStrings_Clone                  RT_MANGLER(RTAsn1SetOfOctetStrings_Clone)
+# define RTAsn1SetOfOctetStrings_Compare                RT_MANGLER(RTAsn1SetOfOctetStrings_Compare)
+# define RTAsn1SetOfOctetStrings_Delete                 RT_MANGLER(RTAsn1SetOfOctetStrings_Delete)
+# define RTAsn1SetOfOctetStrings_Enum                   RT_MANGLER(RTAsn1SetOfOctetStrings_Enum)
+# define RTAsn1SetOfOctetStrings_Init                   RT_MANGLER(RTAsn1SetOfOctetStrings_Init)
+# define RTAsn1OctetString_DecodeAsn1                   RT_MANGLER(RTAsn1OctetString_DecodeAsn1)
+# define RTAsn1SeqOfOctetStrings_DecodeAsn1             RT_MANGLER(RTAsn1SeqOfOctetStrings_DecodeAsn1)
+# define RTAsn1SetOfOctetStrings_DecodeAsn1             RT_MANGLER(RTAsn1SetOfOctetStrings_DecodeAsn1)
+# define RTAsn1BmpString_CheckSanity                    RT_MANGLER(RTAsn1BmpString_CheckSanity)
+# define RTAsn1BmpString_Clone                          RT_MANGLER(RTAsn1BmpString_Clone)
+# define RTAsn1BmpString_Compare                        RT_MANGLER(RTAsn1BmpString_Compare)
+# define RTAsn1BmpString_Delete                         RT_MANGLER(RTAsn1BmpString_Delete)
+# define RTAsn1BmpString_Enum                           RT_MANGLER(RTAsn1BmpString_Enum)
+# define RTAsn1BmpString_Init                           RT_MANGLER(RTAsn1BmpString_Init)
+# define RTAsn1GeneralString_CheckSanity                RT_MANGLER(RTAsn1GeneralString_CheckSanity)
+# define RTAsn1GeneralString_Clone                      RT_MANGLER(RTAsn1GeneralString_Clone)
+# define RTAsn1GeneralString_Compare                    RT_MANGLER(RTAsn1GeneralString_Compare)
+# define RTAsn1GeneralString_Delete                     RT_MANGLER(RTAsn1GeneralString_Delete)
+# define RTAsn1GeneralString_Enum                       RT_MANGLER(RTAsn1GeneralString_Enum)
+# define RTAsn1GeneralString_Init                       RT_MANGLER(RTAsn1GeneralString_Init)
+# define RTAsn1GraphicString_CheckSanity                RT_MANGLER(RTAsn1GraphicString_CheckSanity)
+# define RTAsn1GraphicString_Clone                      RT_MANGLER(RTAsn1GraphicString_Clone)
+# define RTAsn1GraphicString_Compare                    RT_MANGLER(RTAsn1GraphicString_Compare)
+# define RTAsn1GraphicString_Delete                     RT_MANGLER(RTAsn1GraphicString_Delete)
+# define RTAsn1GraphicString_Enum                       RT_MANGLER(RTAsn1GraphicString_Enum)
+# define RTAsn1GraphicString_Init                       RT_MANGLER(RTAsn1GraphicString_Init)
+# define RTAsn1Ia5String_CheckSanity                    RT_MANGLER(RTAsn1Ia5String_CheckSanity)
+# define RTAsn1Ia5String_Clone                          RT_MANGLER(RTAsn1Ia5String_Clone)
+# define RTAsn1Ia5String_Compare                        RT_MANGLER(RTAsn1Ia5String_Compare)
+# define RTAsn1Ia5String_Delete                         RT_MANGLER(RTAsn1Ia5String_Delete)
+# define RTAsn1Ia5String_Enum                           RT_MANGLER(RTAsn1Ia5String_Enum)
+# define RTAsn1Ia5String_Init                           RT_MANGLER(RTAsn1Ia5String_Init)
+# define RTAsn1NumericString_CheckSanity                RT_MANGLER(RTAsn1NumericString_CheckSanity)
+# define RTAsn1NumericString_Clone                      RT_MANGLER(RTAsn1NumericString_Clone)
+# define RTAsn1NumericString_Compare                    RT_MANGLER(RTAsn1NumericString_Compare)
+# define RTAsn1NumericString_Delete                     RT_MANGLER(RTAsn1NumericString_Delete)
+# define RTAsn1NumericString_Enum                       RT_MANGLER(RTAsn1NumericString_Enum)
+# define RTAsn1NumericString_Init                       RT_MANGLER(RTAsn1NumericString_Init)
+# define RTAsn1PrintableString_CheckSanity              RT_MANGLER(RTAsn1PrintableString_CheckSanity)
+# define RTAsn1PrintableString_Clone                    RT_MANGLER(RTAsn1PrintableString_Clone)
+# define RTAsn1PrintableString_Compare                  RT_MANGLER(RTAsn1PrintableString_Compare)
+# define RTAsn1PrintableString_Delete                   RT_MANGLER(RTAsn1PrintableString_Delete)
+# define RTAsn1PrintableString_Enum                     RT_MANGLER(RTAsn1PrintableString_Enum)
+# define RTAsn1PrintableString_Init                     RT_MANGLER(RTAsn1PrintableString_Init)
+# define RTAsn1SeqOfStrings_CheckSanity                 RT_MANGLER(RTAsn1SeqOfStrings_CheckSanity)
+# define RTAsn1SeqOfStrings_Clone                       RT_MANGLER(RTAsn1SeqOfStrings_Clone)
+# define RTAsn1SeqOfStrings_Compare                     RT_MANGLER(RTAsn1SeqOfStrings_Compare)
+# define RTAsn1SeqOfStrings_Delete                      RT_MANGLER(RTAsn1SeqOfStrings_Delete)
+# define RTAsn1SeqOfStrings_Enum                        RT_MANGLER(RTAsn1SeqOfStrings_Enum)
+# define RTAsn1SeqOfStrings_Init                        RT_MANGLER(RTAsn1SeqOfStrings_Init)
+# define RTAsn1SetOfStrings_CheckSanity                 RT_MANGLER(RTAsn1SetOfStrings_CheckSanity)
+# define RTAsn1SetOfStrings_Clone                       RT_MANGLER(RTAsn1SetOfStrings_Clone)
+# define RTAsn1SetOfStrings_Compare                     RT_MANGLER(RTAsn1SetOfStrings_Compare)
+# define RTAsn1SetOfStrings_Delete                      RT_MANGLER(RTAsn1SetOfStrings_Delete)
+# define RTAsn1SetOfStrings_Enum                        RT_MANGLER(RTAsn1SetOfStrings_Enum)
+# define RTAsn1SetOfStrings_Init                        RT_MANGLER(RTAsn1SetOfStrings_Init)
+# define RTAsn1String_CheckSanity                       RT_MANGLER(RTAsn1String_CheckSanity)
+# define RTAsn1String_Clone                             RT_MANGLER(RTAsn1String_Clone)
+# define RTAsn1String_Compare                           RT_MANGLER(RTAsn1String_Compare)
+# define RTAsn1String_CompareEx                         RT_MANGLER(RTAsn1String_CompareEx)
+# define RTAsn1String_CompareWithString                 RT_MANGLER(RTAsn1String_CompareWithString)
+# define RTAsn1String_Delete                            RT_MANGLER(RTAsn1String_Delete)
+# define RTAsn1String_Enum                              RT_MANGLER(RTAsn1String_Enum)
+# define RTAsn1String_Init                              RT_MANGLER(RTAsn1String_Init)
+# define RTAsn1String_InitEx                            RT_MANGLER(RTAsn1String_InitEx)
+# define RTAsn1String_InitWithValue                     RT_MANGLER(RTAsn1String_InitWithValue)
+# define RTAsn1String_QueryUtf8                         RT_MANGLER(RTAsn1String_QueryUtf8)
+# define RTAsn1String_QueryUtf8Len                      RT_MANGLER(RTAsn1String_QueryUtf8Len)
+# define RTAsn1String_RecodeAsUtf8                      RT_MANGLER(RTAsn1String_RecodeAsUtf8)
+# define RTAsn1T61String_CheckSanity                    RT_MANGLER(RTAsn1T61String_CheckSanity)
+# define RTAsn1T61String_Clone                          RT_MANGLER(RTAsn1T61String_Clone)
+# define RTAsn1T61String_Compare                        RT_MANGLER(RTAsn1T61String_Compare)
+# define RTAsn1T61String_Delete                         RT_MANGLER(RTAsn1T61String_Delete)
+# define RTAsn1T61String_Enum                           RT_MANGLER(RTAsn1T61String_Enum)
+# define RTAsn1T61String_Init                           RT_MANGLER(RTAsn1T61String_Init)
+# define RTAsn1UniversalString_CheckSanity              RT_MANGLER(RTAsn1UniversalString_CheckSanity)
+# define RTAsn1UniversalString_Clone                    RT_MANGLER(RTAsn1UniversalString_Clone)
+# define RTAsn1UniversalString_Compare                  RT_MANGLER(RTAsn1UniversalString_Compare)
+# define RTAsn1UniversalString_Delete                   RT_MANGLER(RTAsn1UniversalString_Delete)
+# define RTAsn1UniversalString_Enum                     RT_MANGLER(RTAsn1UniversalString_Enum)
+# define RTAsn1UniversalString_Init                     RT_MANGLER(RTAsn1UniversalString_Init)
+# define RTAsn1Utf8String_CheckSanity                   RT_MANGLER(RTAsn1Utf8String_CheckSanity)
+# define RTAsn1Utf8String_Clone                         RT_MANGLER(RTAsn1Utf8String_Clone)
+# define RTAsn1Utf8String_Compare                       RT_MANGLER(RTAsn1Utf8String_Compare)
+# define RTAsn1Utf8String_Delete                        RT_MANGLER(RTAsn1Utf8String_Delete)
+# define RTAsn1Utf8String_Enum                          RT_MANGLER(RTAsn1Utf8String_Enum)
+# define RTAsn1Utf8String_Init                          RT_MANGLER(RTAsn1Utf8String_Init)
+# define RTAsn1VisibleString_CheckSanity                RT_MANGLER(RTAsn1VisibleString_CheckSanity)
+# define RTAsn1VisibleString_Clone                      RT_MANGLER(RTAsn1VisibleString_Clone)
+# define RTAsn1VisibleString_Compare                    RT_MANGLER(RTAsn1VisibleString_Compare)
+# define RTAsn1VisibleString_Delete                     RT_MANGLER(RTAsn1VisibleString_Delete)
+# define RTAsn1VisibleString_Enum                       RT_MANGLER(RTAsn1VisibleString_Enum)
+# define RTAsn1VisibleString_Init                       RT_MANGLER(RTAsn1VisibleString_Init)
+# define RTAsn1BmpString_DecodeAsn1                     RT_MANGLER(RTAsn1BmpString_DecodeAsn1)
+# define RTAsn1GeneralString_DecodeAsn1                 RT_MANGLER(RTAsn1GeneralString_DecodeAsn1)
+# define RTAsn1GraphicString_DecodeAsn1                 RT_MANGLER(RTAsn1GraphicString_DecodeAsn1)
+# define RTAsn1Ia5String_DecodeAsn1                     RT_MANGLER(RTAsn1Ia5String_DecodeAsn1)
+# define RTAsn1NumericString_DecodeAsn1                 RT_MANGLER(RTAsn1NumericString_DecodeAsn1)
+# define RTAsn1PrintableString_DecodeAsn1               RT_MANGLER(RTAsn1PrintableString_DecodeAsn1)
+# define RTAsn1SeqOfStrings_DecodeAsn1                  RT_MANGLER(RTAsn1SeqOfStrings_DecodeAsn1)
+# define RTAsn1SetOfStrings_DecodeAsn1                  RT_MANGLER(RTAsn1SetOfStrings_DecodeAsn1)
+# define RTAsn1String_DecodeAsn1                        RT_MANGLER(RTAsn1String_DecodeAsn1)
+# define RTAsn1T61String_DecodeAsn1                     RT_MANGLER(RTAsn1T61String_DecodeAsn1)
+# define RTAsn1UniversalString_DecodeAsn1               RT_MANGLER(RTAsn1UniversalString_DecodeAsn1)
+# define RTAsn1Utf8String_DecodeAsn1                    RT_MANGLER(RTAsn1Utf8String_DecodeAsn1)
+# define RTAsn1VisibleString_DecodeAsn1                 RT_MANGLER(RTAsn1VisibleString_DecodeAsn1)
+# define RTAsn1GeneralizedTime_CheckSanity              RT_MANGLER(RTAsn1GeneralizedTime_CheckSanity)
+# define RTAsn1GeneralizedTime_Clone                    RT_MANGLER(RTAsn1GeneralizedTime_Clone)
+# define RTAsn1GeneralizedTime_Compare                  RT_MANGLER(RTAsn1GeneralizedTime_Compare)
+# define RTAsn1GeneralizedTime_Delete                   RT_MANGLER(RTAsn1GeneralizedTime_Delete)
+# define RTAsn1GeneralizedTime_Enum                     RT_MANGLER(RTAsn1GeneralizedTime_Enum)
+# define RTAsn1GeneralizedTime_Init                     RT_MANGLER(RTAsn1GeneralizedTime_Init)
+# define RTAsn1SeqOfTimes_CheckSanity                   RT_MANGLER(RTAsn1SeqOfTimes_CheckSanity)
+# define RTAsn1SeqOfTimes_Clone                         RT_MANGLER(RTAsn1SeqOfTimes_Clone)
+# define RTAsn1SeqOfTimes_Compare                       RT_MANGLER(RTAsn1SeqOfTimes_Compare)
+# define RTAsn1SeqOfTimes_Delete                        RT_MANGLER(RTAsn1SeqOfTimes_Delete)
+# define RTAsn1SeqOfTimes_Enum                          RT_MANGLER(RTAsn1SeqOfTimes_Enum)
+# define RTAsn1SeqOfTimes_Init                          RT_MANGLER(RTAsn1SeqOfTimes_Init)
+# define RTAsn1SetOfTimes_CheckSanity                   RT_MANGLER(RTAsn1SetOfTimes_CheckSanity)
+# define RTAsn1SetOfTimes_Clone                         RT_MANGLER(RTAsn1SetOfTimes_Clone)
+# define RTAsn1SetOfTimes_Compare                       RT_MANGLER(RTAsn1SetOfTimes_Compare)
+# define RTAsn1SetOfTimes_Delete                        RT_MANGLER(RTAsn1SetOfTimes_Delete)
+# define RTAsn1SetOfTimes_Enum                          RT_MANGLER(RTAsn1SetOfTimes_Enum)
+# define RTAsn1SetOfTimes_Init                          RT_MANGLER(RTAsn1SetOfTimes_Init)
+# define RTAsn1Time_CheckSanity                         RT_MANGLER(RTAsn1Time_CheckSanity)
+# define RTAsn1Time_Clone                               RT_MANGLER(RTAsn1Time_Clone)
+# define RTAsn1Time_Compare                             RT_MANGLER(RTAsn1Time_Compare)
+# define RTAsn1Time_CompareWithTimeSpec                 RT_MANGLER(RTAsn1Time_CompareWithTimeSpec)
+# define RTAsn1Time_Delete                              RT_MANGLER(RTAsn1Time_Delete)
+# define RTAsn1Time_Enum                                RT_MANGLER(RTAsn1Time_Enum)
+# define RTAsn1Time_Init                                RT_MANGLER(RTAsn1Time_Init)
+# define RTAsn1UtcTime_CheckSanity                      RT_MANGLER(RTAsn1UtcTime_CheckSanity)
+# define RTAsn1UtcTime_Clone                            RT_MANGLER(RTAsn1UtcTime_Clone)
+# define RTAsn1UtcTime_Compare                          RT_MANGLER(RTAsn1UtcTime_Compare)
+# define RTAsn1UtcTime_Delete                           RT_MANGLER(RTAsn1UtcTime_Delete)
+# define RTAsn1UtcTime_Enum                             RT_MANGLER(RTAsn1UtcTime_Enum)
+# define RTAsn1UtcTime_Init                             RT_MANGLER(RTAsn1UtcTime_Init)
+# define RTAsn1GeneralizedTime_DecodeAsn1               RT_MANGLER(RTAsn1GeneralizedTime_DecodeAsn1)
+# define RTAsn1SeqOfTimes_DecodeAsn1                    RT_MANGLER(RTAsn1SeqOfTimes_DecodeAsn1)
+# define RTAsn1SetOfTimes_DecodeAsn1                    RT_MANGLER(RTAsn1SetOfTimes_DecodeAsn1)
+# define RTAsn1Time_DecodeAsn1                          RT_MANGLER(RTAsn1Time_DecodeAsn1)
+# define RTAsn1UtcTime_DecodeAsn1                       RT_MANGLER(RTAsn1UtcTime_DecodeAsn1)
+# define RTMd2                                          RT_MANGLER(RTMd2)
+# define RTMd2Final                                     RT_MANGLER(RTMd2Final)
+# define RTMd2Init                                      RT_MANGLER(RTMd2Init)
+# define RTMd2Update                                    RT_MANGLER(RTMd2Update)
+# define RTMd2FromString                                RT_MANGLER(RTMd2FromString)
+# define RTMd2ToString                                  RT_MANGLER(RTMd2ToString)
+# define RTCrDigestClone                                RT_MANGLER(RTCrDigestClone)
+# define RTCrDigestCreate                               RT_MANGLER(RTCrDigestCreate)
+# define RTCrDigestFinal                                RT_MANGLER(RTCrDigestFinal)
+# define RTCrDigestGetConsumedSize                      RT_MANGLER(RTCrDigestGetConsumedSize)
+# define RTCrDigestGetHash                              RT_MANGLER(RTCrDigestGetHash)
+# define RTCrDigestGetHashSize                          RT_MANGLER(RTCrDigestGetHashSize)
+# define RTCrDigestGetType                              RT_MANGLER(RTCrDigestGetType)
+# define RTCrDigestIsFinalized                          RT_MANGLER(RTCrDigestIsFinalized)
+# define RTCrDigestMatch                                RT_MANGLER(RTCrDigestMatch)
+# define RTCrDigestRelease                              RT_MANGLER(RTCrDigestRelease)
+# define RTCrDigestReset                                RT_MANGLER(RTCrDigestReset)
+# define RTCrDigestRetain                               RT_MANGLER(RTCrDigestRetain)
+# define RTCrDigestUpdate                               RT_MANGLER(RTCrDigestUpdate)
+# define RTCrDigestCreateByObjId                        RT_MANGLER(RTCrDigestCreateByObjId)
+# define RTCrDigestCreateByObjIdString                  RT_MANGLER(RTCrDigestCreateByObjIdString)
+# define RTCrDigestCreateByType                         RT_MANGLER(RTCrDigestCreateByType)
+# define RTCrDigestFindByObjId                          RT_MANGLER(RTCrDigestFindByObjId)
+# define RTCrDigestFindByObjIdString                    RT_MANGLER(RTCrDigestFindByObjIdString)
+# define RTCrDigestFindByType                           RT_MANGLER(RTCrDigestFindByType)
+# define RTCrRsaDigestInfo_DecodeAsn1                   RT_MANGLER(RTCrRsaDigestInfo_DecodeAsn1)
+# define RTCrRsaOtherPrimeInfo_DecodeAsn1               RT_MANGLER(RTCrRsaOtherPrimeInfo_DecodeAsn1)
+# define RTCrRsaOtherPrimeInfos_DecodeAsn1              RT_MANGLER(RTCrRsaOtherPrimeInfos_DecodeAsn1)
+# define RTCrRsaPrivateKey_DecodeAsn1                   RT_MANGLER(RTCrRsaPrivateKey_DecodeAsn1)
+# define RTCrRsaPublicKey_DecodeAsn1                    RT_MANGLER(RTCrRsaPublicKey_DecodeAsn1)
+# define RTCrRsaDigestInfo_Compare                      RT_MANGLER(RTCrRsaDigestInfo_Compare)
+# define RTCrRsaDigestInfo_Delete                       RT_MANGLER(RTCrRsaDigestInfo_Delete)
+# define RTCrRsaDigestInfo_Enum                         RT_MANGLER(RTCrRsaDigestInfo_Enum)
+# define RTCrRsaOtherPrimeInfo_Compare                  RT_MANGLER(RTCrRsaOtherPrimeInfo_Compare)
+# define RTCrRsaOtherPrimeInfo_Delete                   RT_MANGLER(RTCrRsaOtherPrimeInfo_Delete)
+# define RTCrRsaOtherPrimeInfo_Enum                     RT_MANGLER(RTCrRsaOtherPrimeInfo_Enum)
+# define RTCrRsaOtherPrimeInfos_Compare                 RT_MANGLER(RTCrRsaOtherPrimeInfos_Compare)
+# define RTCrRsaOtherPrimeInfos_Delete                  RT_MANGLER(RTCrRsaOtherPrimeInfos_Delete)
+# define RTCrRsaOtherPrimeInfos_Enum                    RT_MANGLER(RTCrRsaOtherPrimeInfos_Enum)
+# define RTCrRsaPrivateKey_Compare                      RT_MANGLER(RTCrRsaPrivateKey_Compare)
+# define RTCrRsaPrivateKey_Delete                       RT_MANGLER(RTCrRsaPrivateKey_Delete)
+# define RTCrRsaPrivateKey_Enum                         RT_MANGLER(RTCrRsaPrivateKey_Enum)
+# define RTCrRsaPublicKey_Compare                       RT_MANGLER(RTCrRsaPublicKey_Compare)
+# define RTCrRsaPublicKey_Delete                        RT_MANGLER(RTCrRsaPublicKey_Delete)
+# define RTCrRsaPublicKey_Enum                          RT_MANGLER(RTCrRsaPublicKey_Enum)
+# define RTCrRsaDigestInfo_Clone                        RT_MANGLER(RTCrRsaDigestInfo_Clone)
+# define RTCrRsaDigestInfo_Init                         RT_MANGLER(RTCrRsaDigestInfo_Init)
+# define RTCrRsaOtherPrimeInfo_Clone                    RT_MANGLER(RTCrRsaOtherPrimeInfo_Clone)
+# define RTCrRsaOtherPrimeInfo_Init                     RT_MANGLER(RTCrRsaOtherPrimeInfo_Init)
+# define RTCrRsaOtherPrimeInfos_Clone                   RT_MANGLER(RTCrRsaOtherPrimeInfos_Clone)
+# define RTCrRsaOtherPrimeInfos_Init                    RT_MANGLER(RTCrRsaOtherPrimeInfos_Init)
+# define RTCrRsaPrivateKey_Clone                        RT_MANGLER(RTCrRsaPrivateKey_Clone)
+# define RTCrRsaPrivateKey_Init                         RT_MANGLER(RTCrRsaPrivateKey_Init)
+# define RTCrRsaPublicKey_Clone                         RT_MANGLER(RTCrRsaPublicKey_Clone)
+# define RTCrRsaPublicKey_Init                          RT_MANGLER(RTCrRsaPublicKey_Init)
+# define RTCrRsaDigestInfo_CheckSanity                  RT_MANGLER(RTCrRsaDigestInfo_CheckSanity)
+# define RTCrRsaOtherPrimeInfo_CheckSanity              RT_MANGLER(RTCrRsaOtherPrimeInfo_CheckSanity)
+# define RTCrRsaOtherPrimeInfos_CheckSanity             RT_MANGLER(RTCrRsaOtherPrimeInfos_CheckSanity)
+# define RTCrRsaPrivateKey_CheckSanity                  RT_MANGLER(RTCrRsaPrivateKey_CheckSanity)
+# define RTCrRsaPublicKey_CheckSanity                   RT_MANGLER(RTCrRsaPublicKey_CheckSanity)
+# define RTCrPemFreeSections                            RT_MANGLER(RTCrPemFreeSections)
+# define RTCrPemReadFile                                RT_MANGLER(RTCrPemReadFile)
+# define RTCrPkcs7Attribute_DecodeAsn1                  RT_MANGLER(RTCrPkcs7Attribute_DecodeAsn1)
+# define RTCrPkcs7Attributes_DecodeAsn1                 RT_MANGLER(RTCrPkcs7Attributes_DecodeAsn1)
+# define RTCrPkcs7ContentInfo_DecodeAsn1                RT_MANGLER(RTCrPkcs7ContentInfo_DecodeAsn1)
+# define RTCrPkcs7DigestInfo_DecodeAsn1                 RT_MANGLER(RTCrPkcs7DigestInfo_DecodeAsn1)
+# define RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1      RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_DecodeAsn1)
+# define RTCrPkcs7SignedData_DecodeAsn1                 RT_MANGLER(RTCrPkcs7SignedData_DecodeAsn1)
+# define RTCrPkcs7SignerInfo_DecodeAsn1                 RT_MANGLER(RTCrPkcs7SignerInfo_DecodeAsn1)
+# define RTCrPkcs7SignerInfos_DecodeAsn1                RT_MANGLER(RTCrPkcs7SignerInfos_DecodeAsn1)
+# define RTCrPkcs7Attribute_Compare                     RT_MANGLER(RTCrPkcs7Attribute_Compare)
+# define RTCrPkcs7Attribute_Delete                      RT_MANGLER(RTCrPkcs7Attribute_Delete)
+# define RTCrPkcs7Attribute_Enum                        RT_MANGLER(RTCrPkcs7Attribute_Enum)
+# define RTCrPkcs7Attributes_Compare                    RT_MANGLER(RTCrPkcs7Attributes_Compare)
+# define RTCrPkcs7Attributes_Delete                     RT_MANGLER(RTCrPkcs7Attributes_Delete)
+# define RTCrPkcs7Attributes_Enum                       RT_MANGLER(RTCrPkcs7Attributes_Enum)
+# define RTCrPkcs7ContentInfo_Compare                   RT_MANGLER(RTCrPkcs7ContentInfo_Compare)
+# define RTCrPkcs7ContentInfo_Delete                    RT_MANGLER(RTCrPkcs7ContentInfo_Delete)
+# define RTCrPkcs7ContentInfo_Enum                      RT_MANGLER(RTCrPkcs7ContentInfo_Enum)
+# define RTCrPkcs7ContentInfo_IsSignedData              RT_MANGLER(RTCrPkcs7ContentInfo_IsSignedData)
+# define RTCrPkcs7DigestInfo_Compare                    RT_MANGLER(RTCrPkcs7DigestInfo_Compare)
+# define RTCrPkcs7DigestInfo_Delete                     RT_MANGLER(RTCrPkcs7DigestInfo_Delete)
+# define RTCrPkcs7DigestInfo_Enum                       RT_MANGLER(RTCrPkcs7DigestInfo_Enum)
+# define RTCrPkcs7IssuerAndSerialNumber_Compare         RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Compare)
+# define RTCrPkcs7IssuerAndSerialNumber_Delete          RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Delete)
+# define RTCrPkcs7IssuerAndSerialNumber_Enum            RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Enum)
+# define RTCrPkcs7SignedData_Compare                    RT_MANGLER(RTCrPkcs7SignedData_Compare)
+# define RTCrPkcs7SignedData_Delete                     RT_MANGLER(RTCrPkcs7SignedData_Delete)
+# define RTCrPkcs7SignedData_Enum                       RT_MANGLER(RTCrPkcs7SignedData_Enum)
+# define RTCrPkcs7SignerInfo_Compare                    RT_MANGLER(RTCrPkcs7SignerInfo_Compare)
+# define RTCrPkcs7SignerInfo_Delete                     RT_MANGLER(RTCrPkcs7SignerInfo_Delete)
+# define RTCrPkcs7SignerInfo_Enum                       RT_MANGLER(RTCrPkcs7SignerInfo_Enum)
+# define RTCrPkcs7SignerInfos_Compare                   RT_MANGLER(RTCrPkcs7SignerInfos_Compare)
+# define RTCrPkcs7SignerInfos_Delete                    RT_MANGLER(RTCrPkcs7SignerInfos_Delete)
+# define RTCrPkcs7SignerInfos_Enum                      RT_MANGLER(RTCrPkcs7SignerInfos_Enum)
+# define RTCrPkcs7Attribute_Clone                       RT_MANGLER(RTCrPkcs7Attribute_Clone)
+# define RTCrPkcs7Attribute_Init                        RT_MANGLER(RTCrPkcs7Attribute_Init)
+# define RTCrPkcs7Attributes_Clone                      RT_MANGLER(RTCrPkcs7Attributes_Clone)
+# define RTCrPkcs7Attributes_Init                       RT_MANGLER(RTCrPkcs7Attributes_Init)
+# define RTCrPkcs7ContentInfo_Clone                     RT_MANGLER(RTCrPkcs7ContentInfo_Clone)
+# define RTCrPkcs7ContentInfo_Init                      RT_MANGLER(RTCrPkcs7ContentInfo_Init)
+# define RTCrPkcs7DigestInfo_Clone                      RT_MANGLER(RTCrPkcs7DigestInfo_Clone)
+# define RTCrPkcs7DigestInfo_Init                       RT_MANGLER(RTCrPkcs7DigestInfo_Init)
+# define RTCrPkcs7IssuerAndSerialNumber_Clone           RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Clone)
+# define RTCrPkcs7IssuerAndSerialNumber_Init            RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_Init)
+# define RTCrPkcs7SignedData_Clone                      RT_MANGLER(RTCrPkcs7SignedData_Clone)
+# define RTCrPkcs7SignedData_Init                       RT_MANGLER(RTCrPkcs7SignedData_Init)
+# define RTCrPkcs7SignerInfo_Clone                      RT_MANGLER(RTCrPkcs7SignerInfo_Clone)
+# define RTCrPkcs7SignerInfo_Init                       RT_MANGLER(RTCrPkcs7SignerInfo_Init)
+# define RTCrPkcs7SignerInfos_Clone                     RT_MANGLER(RTCrPkcs7SignerInfos_Clone)
+# define RTCrPkcs7SignerInfos_Init                      RT_MANGLER(RTCrPkcs7SignerInfos_Init)
+# define RTCrPkcs7Attribute_CheckSanity                 RT_MANGLER(RTCrPkcs7Attribute_CheckSanity)
+# define RTCrPkcs7Attributes_CheckSanity                RT_MANGLER(RTCrPkcs7Attributes_CheckSanity)
+# define RTCrPkcs7ContentInfo_CheckSanity               RT_MANGLER(RTCrPkcs7ContentInfo_CheckSanity)
+# define RTCrPkcs7DigestInfo_CheckSanity                RT_MANGLER(RTCrPkcs7DigestInfo_CheckSanity)
+# define RTCrPkcs7IssuerAndSerialNumber_CheckSanity     RT_MANGLER(RTCrPkcs7IssuerAndSerialNumber_CheckSanity)
+# define RTCrPkcs7SignedData_CheckSanity                RT_MANGLER(RTCrPkcs7SignedData_CheckSanity)
+# define RTCrPkcs7SignerInfo_CheckSanity                RT_MANGLER(RTCrPkcs7SignerInfo_CheckSanity)
+# define RTCrPkcs7SignerInfos_CheckSanity               RT_MANGLER(RTCrPkcs7SignerInfos_CheckSanity)
+# define RTCrPkcs7VerifyCertCallbackCodeSigning         RT_MANGLER(RTCrPkcs7VerifyCertCallbackCodeSigning)
+# define RTCrPkcs7VerifyCertCallbackDefault             RT_MANGLER(RTCrPkcs7VerifyCertCallbackDefault)
+# define RTCrPkcs7VerifySignedData                      RT_MANGLER(RTCrPkcs7VerifySignedData)
+# define RTCrPkixSignatureCreateByObjId                 RT_MANGLER(RTCrPkixSignatureCreateByObjId)
+# define RTCrPkixSignatureCreateByObjIdString           RT_MANGLER(RTCrPkixSignatureCreateByObjIdString)
+# define RTCrPkixSignatureCreate                        RT_MANGLER(RTCrPkixSignatureCreate)
+# define RTCrPkixSignatureRelease                       RT_MANGLER(RTCrPkixSignatureRelease)
+# define RTCrPkixSignatureRetain                        RT_MANGLER(RTCrPkixSignatureRetain)
+# define RTCrPkixSignatureSign                          RT_MANGLER(RTCrPkixSignatureSign)
+# define RTCrPkixSignatureVerify                        RT_MANGLER(RTCrPkixSignatureVerify)
+# define RTCrPkixSignatureVerifyBitString               RT_MANGLER(RTCrPkixSignatureVerifyBitString)
+# define RTCrPkixSignatureVerifyOctetString             RT_MANGLER(RTCrPkixSignatureVerifyOctetString)
+# define RTCrPkixGetCiperOidFromSignatureAlgorithm      RT_MANGLER(RTCrPkixGetCiperOidFromSignatureAlgorithm)
+# define RTCrPkixPubKeyVerifySignature                  RT_MANGLER(RTCrPkixPubKeyVerifySignature)
+# define RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1 RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_DecodeAsn1)
+# define RTCrSpcIndirectDataContent_DecodeAsn1          RT_MANGLER(RTCrSpcIndirectDataContent_DecodeAsn1)
+# define RTCrSpcLink_DecodeAsn1                         RT_MANGLER(RTCrSpcLink_DecodeAsn1)
+# define RTCrSpcPeImageData_DecodeAsn1                  RT_MANGLER(RTCrSpcPeImageData_DecodeAsn1)
+# define RTCrSpcSerializedObjectAttribute_DecodeAsn1    RT_MANGLER(RTCrSpcSerializedObjectAttribute_DecodeAsn1)
+# define RTCrSpcSerializedObjectAttributes_DecodeAsn1   RT_MANGLER(RTCrSpcSerializedObjectAttributes_DecodeAsn1)
+# define RTCrSpcSerializedObject_DecodeAsn1             RT_MANGLER(RTCrSpcSerializedObject_DecodeAsn1)
+# define RTCrSpcSerializedPageHashes_DecodeAsn1         RT_MANGLER(RTCrSpcSerializedPageHashes_DecodeAsn1)
+# define RTCrSpcString_DecodeAsn1                       RT_MANGLER(RTCrSpcString_DecodeAsn1)
+# define RTCrSpcAttributeTypeAndOptionalValue_Compare   RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Compare)
+# define RTCrSpcAttributeTypeAndOptionalValue_Delete    RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Delete)
+# define RTCrSpcAttributeTypeAndOptionalValue_Enum      RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Enum)
+# define RTCrSpcIndirectDataContent_Compare             RT_MANGLER(RTCrSpcIndirectDataContent_Compare)
+# define RTCrSpcIndirectDataContent_Delete              RT_MANGLER(RTCrSpcIndirectDataContent_Delete)
+# define RTCrSpcIndirectDataContent_Enum                RT_MANGLER(RTCrSpcIndirectDataContent_Enum)
+# define RTCrSpcIndirectDataContent_GetPeImageObjAttrib RT_MANGLER(RTCrSpcIndirectDataContent_GetPeImageObjAttrib)
+# define RTCrSpcLink_Compare                            RT_MANGLER(RTCrSpcLink_Compare)
+# define RTCrSpcLink_Delete                             RT_MANGLER(RTCrSpcLink_Delete)
+# define RTCrSpcLink_Enum                               RT_MANGLER(RTCrSpcLink_Enum)
+# define RTCrSpcPeImageData_Compare                     RT_MANGLER(RTCrSpcPeImageData_Compare)
+# define RTCrSpcPeImageData_Delete                      RT_MANGLER(RTCrSpcPeImageData_Delete)
+# define RTCrSpcPeImageData_Enum                        RT_MANGLER(RTCrSpcPeImageData_Enum)
+# define RTCrSpcSerializedObjectAttribute_Compare       RT_MANGLER(RTCrSpcSerializedObjectAttribute_Compare)
+# define RTCrSpcSerializedObjectAttribute_Delete        RT_MANGLER(RTCrSpcSerializedObjectAttribute_Delete)
+# define RTCrSpcSerializedObjectAttribute_Enum          RT_MANGLER(RTCrSpcSerializedObjectAttribute_Enum)
+# define RTCrSpcSerializedObjectAttributes_Compare      RT_MANGLER(RTCrSpcSerializedObjectAttributes_Compare)
+# define RTCrSpcSerializedObjectAttributes_Delete       RT_MANGLER(RTCrSpcSerializedObjectAttributes_Delete)
+# define RTCrSpcSerializedObjectAttributes_Enum         RT_MANGLER(RTCrSpcSerializedObjectAttributes_Enum)
+# define RTCrSpcSerializedObject_Compare                RT_MANGLER(RTCrSpcSerializedObject_Compare)
+# define RTCrSpcSerializedObject_Delete                 RT_MANGLER(RTCrSpcSerializedObject_Delete)
+# define RTCrSpcSerializedObject_Enum                   RT_MANGLER(RTCrSpcSerializedObject_Enum)
+# define RTCrSpcSerializedPageHashes_Compare            RT_MANGLER(RTCrSpcSerializedPageHashes_Compare)
+# define RTCrSpcSerializedPageHashes_Delete             RT_MANGLER(RTCrSpcSerializedPageHashes_Delete)
+# define RTCrSpcSerializedPageHashes_Enum               RT_MANGLER(RTCrSpcSerializedPageHashes_Enum)
+# define RTCrSpcSerializedPageHashes_UpdateDerivedData  RT_MANGLER(RTCrSpcSerializedPageHashes_UpdateDerivedData)
+# define RTCrSpcString_Compare                          RT_MANGLER(RTCrSpcString_Compare)
+# define RTCrSpcString_Delete                           RT_MANGLER(RTCrSpcString_Delete)
+# define RTCrSpcString_Enum                             RT_MANGLER(RTCrSpcString_Enum)
+# define RTCrSpcAttributeTypeAndOptionalValue_Clone     RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Clone)
+# define RTCrSpcAttributeTypeAndOptionalValue_Init      RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_Init)
+# define RTCrSpcIndirectDataContent_Clone               RT_MANGLER(RTCrSpcIndirectDataContent_Clone)
+# define RTCrSpcIndirectDataContent_Init                RT_MANGLER(RTCrSpcIndirectDataContent_Init)
+# define RTCrSpcLink_Clone                              RT_MANGLER(RTCrSpcLink_Clone)
+# define RTCrSpcLink_Init                               RT_MANGLER(RTCrSpcLink_Init)
+# define RTCrSpcPeImageData_Clone                       RT_MANGLER(RTCrSpcPeImageData_Clone)
+# define RTCrSpcPeImageData_Init                        RT_MANGLER(RTCrSpcPeImageData_Init)
+# define RTCrSpcSerializedObjectAttribute_Clone         RT_MANGLER(RTCrSpcSerializedObjectAttribute_Clone)
+# define RTCrSpcSerializedObjectAttribute_Init          RT_MANGLER(RTCrSpcSerializedObjectAttribute_Init)
+# define RTCrSpcSerializedObjectAttributes_Clone        RT_MANGLER(RTCrSpcSerializedObjectAttributes_Clone)
+# define RTCrSpcSerializedObjectAttributes_Init         RT_MANGLER(RTCrSpcSerializedObjectAttributes_Init)
+# define RTCrSpcSerializedObject_Clone                  RT_MANGLER(RTCrSpcSerializedObject_Clone)
+# define RTCrSpcSerializedObject_Init                   RT_MANGLER(RTCrSpcSerializedObject_Init)
+# define RTCrSpcSerializedPageHashes_Clone              RT_MANGLER(RTCrSpcSerializedPageHashes_Clone)
+# define RTCrSpcSerializedPageHashes_Init               RT_MANGLER(RTCrSpcSerializedPageHashes_Init)
+# define RTCrSpcString_Clone                            RT_MANGLER(RTCrSpcString_Clone)
+# define RTCrSpcString_Init                             RT_MANGLER(RTCrSpcString_Init)
+# define RTCrSpcAttributeTypeAndOptionalValue_CheckSanity RT_MANGLER(RTCrSpcAttributeTypeAndOptionalValue_CheckSanity)
+# define RTCrSpcIndirectDataContent_CheckSanity         RT_MANGLER(RTCrSpcIndirectDataContent_CheckSanity)
+# define RTCrSpcIndirectDataContent_CheckSanityEx       RT_MANGLER(RTCrSpcIndirectDataContent_CheckSanityEx)
+# define RTCrSpcLink_CheckSanity                        RT_MANGLER(RTCrSpcLink_CheckSanity)
+# define RTCrSpcPeImageData_CheckSanity                 RT_MANGLER(RTCrSpcPeImageData_CheckSanity)
+# define RTCrSpcSerializedObjectAttribute_CheckSanity   RT_MANGLER(RTCrSpcSerializedObjectAttribute_CheckSanity)
+# define RTCrSpcSerializedObjectAttributes_CheckSanity  RT_MANGLER(RTCrSpcSerializedObjectAttributes_CheckSanity)
+# define RTCrSpcSerializedObject_CheckSanity            RT_MANGLER(RTCrSpcSerializedObject_CheckSanity)
+# define RTCrSpcSerializedPageHashes_CheckSanity        RT_MANGLER(RTCrSpcSerializedPageHashes_CheckSanity)
+# define RTCrSpcString_CheckSanity                      RT_MANGLER(RTCrSpcString_CheckSanity)
+# define RTCrX509AlgorithmIdentifier_DecodeAsn1         RT_MANGLER(RTCrX509AlgorithmIdentifier_DecodeAsn1)
+# define RTCrX509AlgorithmIdentifiers_DecodeAsn1        RT_MANGLER(RTCrX509AlgorithmIdentifiers_DecodeAsn1)
+# define RTCrX509AttributeTypeAndValue_DecodeAsn1       RT_MANGLER(RTCrX509AttributeTypeAndValue_DecodeAsn1)
+# define RTCrX509AttributeTypeAndValues_DecodeAsn1      RT_MANGLER(RTCrX509AttributeTypeAndValues_DecodeAsn1)
+# define RTCrX509AuthorityKeyIdentifier_DecodeAsn1      RT_MANGLER(RTCrX509AuthorityKeyIdentifier_DecodeAsn1)
+# define RTCrX509BasicConstraints_DecodeAsn1            RT_MANGLER(RTCrX509BasicConstraints_DecodeAsn1)
+# define RTCrX509CertificatePolicies_DecodeAsn1         RT_MANGLER(RTCrX509CertificatePolicies_DecodeAsn1)
+# define RTCrX509Certificate_DecodeAsn1                 RT_MANGLER(RTCrX509Certificate_DecodeAsn1)
+# define RTCrX509Certificates_DecodeAsn1                RT_MANGLER(RTCrX509Certificates_DecodeAsn1)
+# define RTCrX509Extension_DecodeAsn1                   RT_MANGLER(RTCrX509Extension_DecodeAsn1)
+# define RTCrX509Extension_ExtnValue_DecodeAsn1         RT_MANGLER(RTCrX509Extension_ExtnValue_DecodeAsn1)
+# define RTCrX509Extensions_DecodeAsn1                  RT_MANGLER(RTCrX509Extensions_DecodeAsn1)
+# define RTCrX509GeneralName_DecodeAsn1                 RT_MANGLER(RTCrX509GeneralName_DecodeAsn1)
+# define RTCrX509GeneralNames_DecodeAsn1                RT_MANGLER(RTCrX509GeneralNames_DecodeAsn1)
+# define RTCrX509GeneralSubtree_DecodeAsn1              RT_MANGLER(RTCrX509GeneralSubtree_DecodeAsn1)
+# define RTCrX509GeneralSubtrees_DecodeAsn1             RT_MANGLER(RTCrX509GeneralSubtrees_DecodeAsn1)
+# define RTCrX509NameConstraints_DecodeAsn1             RT_MANGLER(RTCrX509NameConstraints_DecodeAsn1)
+# define RTCrX509Name_DecodeAsn1                        RT_MANGLER(RTCrX509Name_DecodeAsn1)
+# define RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1   RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1)
+# define RTCrX509PolicyConstraints_DecodeAsn1           RT_MANGLER(RTCrX509PolicyConstraints_DecodeAsn1)
+# define RTCrX509PolicyInformation_DecodeAsn1           RT_MANGLER(RTCrX509PolicyInformation_DecodeAsn1)
+# define RTCrX509PolicyMapping_DecodeAsn1               RT_MANGLER(RTCrX509PolicyMapping_DecodeAsn1)
+# define RTCrX509PolicyMappings_DecodeAsn1              RT_MANGLER(RTCrX509PolicyMappings_DecodeAsn1)
+# define RTCrX509PolicyQualifierInfo_DecodeAsn1         RT_MANGLER(RTCrX509PolicyQualifierInfo_DecodeAsn1)
+# define RTCrX509PolicyQualifierInfos_DecodeAsn1        RT_MANGLER(RTCrX509PolicyQualifierInfos_DecodeAsn1)
+# define RTCrX509SubjectPublicKeyInfo_DecodeAsn1        RT_MANGLER(RTCrX509SubjectPublicKeyInfo_DecodeAsn1)
+# define RTCrX509TbsCertificate_DecodeAsn1              RT_MANGLER(RTCrX509TbsCertificate_DecodeAsn1)
+# define RTCrX509Validity_DecodeAsn1                    RT_MANGLER(RTCrX509Validity_DecodeAsn1)
+# define RTCrX509CertPathsBuild                         RT_MANGLER(RTCrX509CertPathsBuild)
+# define RTCrX509CertPathsCreate                        RT_MANGLER(RTCrX509CertPathsCreate)
+# define RTCrX509CertPathsCreateEx                      RT_MANGLER(RTCrX509CertPathsCreateEx)
+# define RTCrX509CertPathsDumpAll                       RT_MANGLER(RTCrX509CertPathsDumpAll)
+# define RTCrX509CertPathsDumpOne                       RT_MANGLER(RTCrX509CertPathsDumpOne)
+# define RTCrX509CertPathsGetPathCount                  RT_MANGLER(RTCrX509CertPathsGetPathCount)
+# define RTCrX509CertPathsGetPathLength                 RT_MANGLER(RTCrX509CertPathsGetPathLength)
+# define RTCrX509CertPathsGetPathNodeCert               RT_MANGLER(RTCrX509CertPathsGetPathNodeCert)
+# define RTCrX509CertPathsGetPathVerifyResult           RT_MANGLER(RTCrX509CertPathsGetPathVerifyResult)
+# define RTCrX509CertPathsQueryPathInfo                 RT_MANGLER(RTCrX509CertPathsQueryPathInfo)
+# define RTCrX509CertPathsRelease                       RT_MANGLER(RTCrX509CertPathsRelease)
+# define RTCrX509CertPathsRetain                        RT_MANGLER(RTCrX509CertPathsRetain)
+# define RTCrX509CertPathsSetTrustedStore               RT_MANGLER(RTCrX509CertPathsSetTrustedStore)
+# define RTCrX509CertPathsSetUntrustedArray             RT_MANGLER(RTCrX509CertPathsSetUntrustedArray)
+# define RTCrX509CertPathsSetUntrustedStore             RT_MANGLER(RTCrX509CertPathsSetUntrustedStore)
+# define RTCrX509CertPathsSetValidTime                  RT_MANGLER(RTCrX509CertPathsSetValidTime)
+# define RTCrX509CertPathsSetValidTimeSpec              RT_MANGLER(RTCrX509CertPathsSetValidTimeSpec)
+# define RTCrX509CertPathsValidateAll                   RT_MANGLER(RTCrX509CertPathsValidateAll)
+# define RTCrX509CertPathsValidateOne                   RT_MANGLER(RTCrX509CertPathsValidateOne)
+# define RTCrX509AlgorithmIdentifier_Compare            RT_MANGLER(RTCrX509AlgorithmIdentifier_Compare)
+# define RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest RT_MANGLER(RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest)
+# define RTCrX509AlgorithmIdentifier_CompareWithString  RT_MANGLER(RTCrX509AlgorithmIdentifier_CompareWithString)
+# define RTCrX509AlgorithmIdentifier_Delete             RT_MANGLER(RTCrX509AlgorithmIdentifier_Delete)
+# define RTCrX509AlgorithmIdentifier_Enum               RT_MANGLER(RTCrX509AlgorithmIdentifier_Enum)
+# define RTCrX509AlgorithmIdentifier_QueryDigestSize    RT_MANGLER(RTCrX509AlgorithmIdentifier_QueryDigestSize)
+# define RTCrX509AlgorithmIdentifier_QueryDigestType    RT_MANGLER(RTCrX509AlgorithmIdentifier_QueryDigestType)
+# define RTCrX509AlgorithmIdentifiers_Compare           RT_MANGLER(RTCrX509AlgorithmIdentifiers_Compare)
+# define RTCrX509AlgorithmIdentifiers_Delete            RT_MANGLER(RTCrX509AlgorithmIdentifiers_Delete)
+# define RTCrX509AlgorithmIdentifiers_Enum              RT_MANGLER(RTCrX509AlgorithmIdentifiers_Enum)
+# define RTCrX509AttributeTypeAndValue_Compare          RT_MANGLER(RTCrX509AttributeTypeAndValue_Compare)
+# define RTCrX509AttributeTypeAndValue_Delete           RT_MANGLER(RTCrX509AttributeTypeAndValue_Delete)
+# define RTCrX509AttributeTypeAndValue_Enum             RT_MANGLER(RTCrX509AttributeTypeAndValue_Enum)
+# define RTCrX509AttributeTypeAndValues_Compare         RT_MANGLER(RTCrX509AttributeTypeAndValues_Compare)
+# define RTCrX509AttributeTypeAndValues_Delete          RT_MANGLER(RTCrX509AttributeTypeAndValues_Delete)
+# define RTCrX509AttributeTypeAndValues_Enum            RT_MANGLER(RTCrX509AttributeTypeAndValues_Enum)
+# define RTCrX509AuthorityKeyIdentifier_Compare         RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Compare)
+# define RTCrX509AuthorityKeyIdentifier_Delete          RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Delete)
+# define RTCrX509AuthorityKeyIdentifier_Enum            RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Enum)
+# define RTCrX509BasicConstraints_Compare               RT_MANGLER(RTCrX509BasicConstraints_Compare)
+# define RTCrX509BasicConstraints_Delete                RT_MANGLER(RTCrX509BasicConstraints_Delete)
+# define RTCrX509BasicConstraints_Enum                  RT_MANGLER(RTCrX509BasicConstraints_Enum)
+# define RTCrX509CertificatePolicies_Compare            RT_MANGLER(RTCrX509CertificatePolicies_Compare)
+# define RTCrX509CertificatePolicies_Delete             RT_MANGLER(RTCrX509CertificatePolicies_Delete)
+# define RTCrX509CertificatePolicies_Enum               RT_MANGLER(RTCrX509CertificatePolicies_Enum)
+# define RTCrX509Certificate_Compare                    RT_MANGLER(RTCrX509Certificate_Compare)
+# define RTCrX509Certificate_Delete                     RT_MANGLER(RTCrX509Certificate_Delete)
+# define RTCrX509Certificate_Enum                       RT_MANGLER(RTCrX509Certificate_Enum)
+# define RTCrX509Certificate_IsSelfSigned               RT_MANGLER(RTCrX509Certificate_IsSelfSigned)
+# define RTCrX509Certificate_MatchIssuerAndSerialNumber RT_MANGLER(RTCrX509Certificate_MatchIssuerAndSerialNumber)
+# define RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280 RT_MANGLER(RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280)
+# define RTCrX509Certificates_Compare                   RT_MANGLER(RTCrX509Certificates_Compare)
+# define RTCrX509Certificates_Delete                    RT_MANGLER(RTCrX509Certificates_Delete)
+# define RTCrX509Certificates_Enum                      RT_MANGLER(RTCrX509Certificates_Enum)
+# define RTCrX509Certificates_FindByIssuerAndSerialNumber RT_MANGLER(RTCrX509Certificates_FindByIssuerAndSerialNumber)
+# define RTCrX509Extension_Compare                      RT_MANGLER(RTCrX509Extension_Compare)
+# define RTCrX509Extension_Delete                       RT_MANGLER(RTCrX509Extension_Delete)
+# define RTCrX509Extension_Enum                         RT_MANGLER(RTCrX509Extension_Enum)
+# define RTCrX509Extensions_Compare                     RT_MANGLER(RTCrX509Extensions_Compare)
+# define RTCrX509Extensions_Delete                      RT_MANGLER(RTCrX509Extensions_Delete)
+# define RTCrX509Extensions_Enum                        RT_MANGLER(RTCrX509Extensions_Enum)
+# define RTCrX509GeneralName_Compare                    RT_MANGLER(RTCrX509GeneralName_Compare)
+# define RTCrX509GeneralName_ConstraintMatch            RT_MANGLER(RTCrX509GeneralName_ConstraintMatch)
+# define RTCrX509GeneralName_Delete                     RT_MANGLER(RTCrX509GeneralName_Delete)
+# define RTCrX509GeneralName_Enum                       RT_MANGLER(RTCrX509GeneralName_Enum)
+# define RTCrX509GeneralNames_Compare                   RT_MANGLER(RTCrX509GeneralNames_Compare)
+# define RTCrX509GeneralNames_Delete                    RT_MANGLER(RTCrX509GeneralNames_Delete)
+# define RTCrX509GeneralNames_Enum                      RT_MANGLER(RTCrX509GeneralNames_Enum)
+# define RTCrX509GeneralSubtree_Compare                 RT_MANGLER(RTCrX509GeneralSubtree_Compare)
+# define RTCrX509GeneralSubtree_ConstraintMatch         RT_MANGLER(RTCrX509GeneralSubtree_ConstraintMatch)
+# define RTCrX509GeneralSubtree_Delete                  RT_MANGLER(RTCrX509GeneralSubtree_Delete)
+# define RTCrX509GeneralSubtree_Enum                    RT_MANGLER(RTCrX509GeneralSubtree_Enum)
+# define RTCrX509GeneralSubtrees_Compare                RT_MANGLER(RTCrX509GeneralSubtrees_Compare)
+# define RTCrX509GeneralSubtrees_Delete                 RT_MANGLER(RTCrX509GeneralSubtrees_Delete)
+# define RTCrX509GeneralSubtrees_Enum                   RT_MANGLER(RTCrX509GeneralSubtrees_Enum)
+# define RTCrX509NameConstraints_Compare                RT_MANGLER(RTCrX509NameConstraints_Compare)
+# define RTCrX509NameConstraints_Delete                 RT_MANGLER(RTCrX509NameConstraints_Delete)
+# define RTCrX509NameConstraints_Enum                   RT_MANGLER(RTCrX509NameConstraints_Enum)
+# define RTCrX509Name_Compare                           RT_MANGLER(RTCrX509Name_Compare)
+# define RTCrX509Name_ConstraintMatch                   RT_MANGLER(RTCrX509Name_ConstraintMatch)
+# define RTCrX509Name_Delete                            RT_MANGLER(RTCrX509Name_Delete)
+# define RTCrX509Name_Enum                              RT_MANGLER(RTCrX509Name_Enum)
+# define RTCrX509Name_FormatAsString                    RT_MANGLER(RTCrX509Name_FormatAsString)
+# define RTCrX509Name_MatchByRfc5280                    RT_MANGLER(RTCrX509Name_MatchByRfc5280)
+# define RTCrX509Name_MatchWithString                   RT_MANGLER(RTCrX509Name_MatchWithString)
+# define RTCrX509OldAuthorityKeyIdentifier_Compare      RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Compare)
+# define RTCrX509OldAuthorityKeyIdentifier_Delete       RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Delete)
+# define RTCrX509OldAuthorityKeyIdentifier_Enum         RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Enum)
+# define RTCrX509PolicyConstraints_Compare              RT_MANGLER(RTCrX509PolicyConstraints_Compare)
+# define RTCrX509PolicyConstraints_Delete               RT_MANGLER(RTCrX509PolicyConstraints_Delete)
+# define RTCrX509PolicyConstraints_Enum                 RT_MANGLER(RTCrX509PolicyConstraints_Enum)
+# define RTCrX509PolicyInformation_Compare              RT_MANGLER(RTCrX509PolicyInformation_Compare)
+# define RTCrX509PolicyInformation_Delete               RT_MANGLER(RTCrX509PolicyInformation_Delete)
+# define RTCrX509PolicyInformation_Enum                 RT_MANGLER(RTCrX509PolicyInformation_Enum)
+# define RTCrX509PolicyMapping_Compare                  RT_MANGLER(RTCrX509PolicyMapping_Compare)
+# define RTCrX509PolicyMapping_Delete                   RT_MANGLER(RTCrX509PolicyMapping_Delete)
+# define RTCrX509PolicyMapping_Enum                     RT_MANGLER(RTCrX509PolicyMapping_Enum)
+# define RTCrX509PolicyMappings_Compare                 RT_MANGLER(RTCrX509PolicyMappings_Compare)
+# define RTCrX509PolicyMappings_Delete                  RT_MANGLER(RTCrX509PolicyMappings_Delete)
+# define RTCrX509PolicyMappings_Enum                    RT_MANGLER(RTCrX509PolicyMappings_Enum)
+# define RTCrX509PolicyQualifierInfo_Compare            RT_MANGLER(RTCrX509PolicyQualifierInfo_Compare)
+# define RTCrX509PolicyQualifierInfo_Delete             RT_MANGLER(RTCrX509PolicyQualifierInfo_Delete)
+# define RTCrX509PolicyQualifierInfo_Enum               RT_MANGLER(RTCrX509PolicyQualifierInfo_Enum)
+# define RTCrX509PolicyQualifierInfos_Compare           RT_MANGLER(RTCrX509PolicyQualifierInfos_Compare)
+# define RTCrX509PolicyQualifierInfos_Delete            RT_MANGLER(RTCrX509PolicyQualifierInfos_Delete)
+# define RTCrX509PolicyQualifierInfos_Enum              RT_MANGLER(RTCrX509PolicyQualifierInfos_Enum)
+# define RTCrX509SubjectPublicKeyInfo_Compare           RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Compare)
+# define RTCrX509SubjectPublicKeyInfo_Delete            RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Delete)
+# define RTCrX509SubjectPublicKeyInfo_Enum              RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Enum)
+# define RTCrX509TbsCertificate_Compare                 RT_MANGLER(RTCrX509TbsCertificate_Compare)
+# define RTCrX509TbsCertificate_Delete                  RT_MANGLER(RTCrX509TbsCertificate_Delete)
+# define RTCrX509TbsCertificate_Enum                    RT_MANGLER(RTCrX509TbsCertificate_Enum)
+# define RTCrX509TbsCertificate_ReprocessExtensions     RT_MANGLER(RTCrX509TbsCertificate_ReprocessExtensions)
+# define RTCrX509Validity_Compare                       RT_MANGLER(RTCrX509Validity_Compare)
+# define RTCrX509Validity_Delete                        RT_MANGLER(RTCrX509Validity_Delete)
+# define RTCrX509Validity_Enum                          RT_MANGLER(RTCrX509Validity_Enum)
+# define RTCrX509Validity_IsValidAtTimeSpec             RT_MANGLER(RTCrX509Validity_IsValidAtTimeSpec)
+# define RTCrX509Certificate_ReadFromFile               RT_MANGLER(RTCrX509Certificate_ReadFromFile)
+# define RTCrX509AlgorithmIdentifier_Clone              RT_MANGLER(RTCrX509AlgorithmIdentifier_Clone)
+# define RTCrX509AlgorithmIdentifier_Init               RT_MANGLER(RTCrX509AlgorithmIdentifier_Init)
+# define RTCrX509AlgorithmIdentifiers_Clone             RT_MANGLER(RTCrX509AlgorithmIdentifiers_Clone)
+# define RTCrX509AlgorithmIdentifiers_Init              RT_MANGLER(RTCrX509AlgorithmIdentifiers_Init)
+# define RTCrX509AttributeTypeAndValue_Clone            RT_MANGLER(RTCrX509AttributeTypeAndValue_Clone)
+# define RTCrX509AttributeTypeAndValue_Init             RT_MANGLER(RTCrX509AttributeTypeAndValue_Init)
+# define RTCrX509AttributeTypeAndValues_Clone           RT_MANGLER(RTCrX509AttributeTypeAndValues_Clone)
+# define RTCrX509AttributeTypeAndValues_Init            RT_MANGLER(RTCrX509AttributeTypeAndValues_Init)
+# define RTCrX509AuthorityKeyIdentifier_Clone           RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Clone)
+# define RTCrX509AuthorityKeyIdentifier_Init            RT_MANGLER(RTCrX509AuthorityKeyIdentifier_Init)
+# define RTCrX509BasicConstraints_Clone                 RT_MANGLER(RTCrX509BasicConstraints_Clone)
+# define RTCrX509BasicConstraints_Init                  RT_MANGLER(RTCrX509BasicConstraints_Init)
+# define RTCrX509CertificatePolicies_Clone              RT_MANGLER(RTCrX509CertificatePolicies_Clone)
+# define RTCrX509CertificatePolicies_Init               RT_MANGLER(RTCrX509CertificatePolicies_Init)
+# define RTCrX509Certificate_Clone                      RT_MANGLER(RTCrX509Certificate_Clone)
+# define RTCrX509Certificate_Init                       RT_MANGLER(RTCrX509Certificate_Init)
+# define RTCrX509Certificates_Clone                     RT_MANGLER(RTCrX509Certificates_Clone)
+# define RTCrX509Certificates_Init                      RT_MANGLER(RTCrX509Certificates_Init)
+# define RTCrX509Extension_Clone                        RT_MANGLER(RTCrX509Extension_Clone)
+# define RTCrX509Extension_Init                         RT_MANGLER(RTCrX509Extension_Init)
+# define RTCrX509Extensions_Clone                       RT_MANGLER(RTCrX509Extensions_Clone)
+# define RTCrX509Extensions_Init                        RT_MANGLER(RTCrX509Extensions_Init)
+# define RTCrX509GeneralName_Clone                      RT_MANGLER(RTCrX509GeneralName_Clone)
+# define RTCrX509GeneralName_Init                       RT_MANGLER(RTCrX509GeneralName_Init)
+# define RTCrX509GeneralNames_Clone                     RT_MANGLER(RTCrX509GeneralNames_Clone)
+# define RTCrX509GeneralNames_Init                      RT_MANGLER(RTCrX509GeneralNames_Init)
+# define RTCrX509GeneralSubtree_Clone                   RT_MANGLER(RTCrX509GeneralSubtree_Clone)
+# define RTCrX509GeneralSubtree_Init                    RT_MANGLER(RTCrX509GeneralSubtree_Init)
+# define RTCrX509GeneralSubtrees_Clone                  RT_MANGLER(RTCrX509GeneralSubtrees_Clone)
+# define RTCrX509GeneralSubtrees_Init                   RT_MANGLER(RTCrX509GeneralSubtrees_Init)
+# define RTCrX509NameConstraints_Clone                  RT_MANGLER(RTCrX509NameConstraints_Clone)
+# define RTCrX509NameConstraints_Init                   RT_MANGLER(RTCrX509NameConstraints_Init)
+# define RTCrX509Name_Clone                             RT_MANGLER(RTCrX509Name_Clone)
+# define RTCrX509Name_Init                              RT_MANGLER(RTCrX509Name_Init)
+# define RTCrX509Name_RecodeAsUtf8                      RT_MANGLER(RTCrX509Name_RecodeAsUtf8)
+# define RTCrX509OldAuthorityKeyIdentifier_Clone        RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Clone)
+# define RTCrX509OldAuthorityKeyIdentifier_Init         RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_Init)
+# define RTCrX509PolicyConstraints_Clone                RT_MANGLER(RTCrX509PolicyConstraints_Clone)
+# define RTCrX509PolicyConstraints_Init                 RT_MANGLER(RTCrX509PolicyConstraints_Init)
+# define RTCrX509PolicyInformation_Clone                RT_MANGLER(RTCrX509PolicyInformation_Clone)
+# define RTCrX509PolicyInformation_Init                 RT_MANGLER(RTCrX509PolicyInformation_Init)
+# define RTCrX509PolicyMapping_Clone                    RT_MANGLER(RTCrX509PolicyMapping_Clone)
+# define RTCrX509PolicyMapping_Init                     RT_MANGLER(RTCrX509PolicyMapping_Init)
+# define RTCrX509PolicyMappings_Clone                   RT_MANGLER(RTCrX509PolicyMappings_Clone)
+# define RTCrX509PolicyMappings_Init                    RT_MANGLER(RTCrX509PolicyMappings_Init)
+# define RTCrX509PolicyQualifierInfo_Clone              RT_MANGLER(RTCrX509PolicyQualifierInfo_Clone)
+# define RTCrX509PolicyQualifierInfo_Init               RT_MANGLER(RTCrX509PolicyQualifierInfo_Init)
+# define RTCrX509PolicyQualifierInfos_Clone             RT_MANGLER(RTCrX509PolicyQualifierInfos_Clone)
+# define RTCrX509PolicyQualifierInfos_Init              RT_MANGLER(RTCrX509PolicyQualifierInfos_Init)
+# define RTCrX509SubjectPublicKeyInfo_Clone             RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Clone)
+# define RTCrX509SubjectPublicKeyInfo_Init              RT_MANGLER(RTCrX509SubjectPublicKeyInfo_Init)
+# define RTCrX509TbsCertificate_Clone                   RT_MANGLER(RTCrX509TbsCertificate_Clone)
+# define RTCrX509TbsCertificate_Init                    RT_MANGLER(RTCrX509TbsCertificate_Init)
+# define RTCrX509Validity_Clone                         RT_MANGLER(RTCrX509Validity_Clone)
+# define RTCrX509Validity_Init                          RT_MANGLER(RTCrX509Validity_Init)
+# define RTCrX509AlgorithmIdentifier_CheckSanity        RT_MANGLER(RTCrX509AlgorithmIdentifier_CheckSanity)
+# define RTCrX509AlgorithmIdentifiers_CheckSanity       RT_MANGLER(RTCrX509AlgorithmIdentifiers_CheckSanity)
+# define RTCrX509AttributeTypeAndValue_CheckSanity      RT_MANGLER(RTCrX509AttributeTypeAndValue_CheckSanity)
+# define RTCrX509AttributeTypeAndValues_CheckSanity     RT_MANGLER(RTCrX509AttributeTypeAndValues_CheckSanity)
+# define RTCrX509AuthorityKeyIdentifier_CheckSanity     RT_MANGLER(RTCrX509AuthorityKeyIdentifier_CheckSanity)
+# define RTCrX509BasicConstraints_CheckSanity           RT_MANGLER(RTCrX509BasicConstraints_CheckSanity)
+# define RTCrX509CertificatePolicies_CheckSanity        RT_MANGLER(RTCrX509CertificatePolicies_CheckSanity)
+# define RTCrX509Certificate_CheckSanity                RT_MANGLER(RTCrX509Certificate_CheckSanity)
+# define RTCrX509Certificates_CheckSanity               RT_MANGLER(RTCrX509Certificates_CheckSanity)
+# define RTCrX509Extension_CheckSanity                  RT_MANGLER(RTCrX509Extension_CheckSanity)
+# define RTCrX509Extensions_CheckSanity                 RT_MANGLER(RTCrX509Extensions_CheckSanity)
+# define RTCrX509GeneralName_CheckSanity                RT_MANGLER(RTCrX509GeneralName_CheckSanity)
+# define RTCrX509GeneralNames_CheckSanity               RT_MANGLER(RTCrX509GeneralNames_CheckSanity)
+# define RTCrX509GeneralSubtree_CheckSanity             RT_MANGLER(RTCrX509GeneralSubtree_CheckSanity)
+# define RTCrX509GeneralSubtrees_CheckSanity            RT_MANGLER(RTCrX509GeneralSubtrees_CheckSanity)
+# define RTCrX509NameConstraints_CheckSanity            RT_MANGLER(RTCrX509NameConstraints_CheckSanity)
+# define RTCrX509Name_CheckSanity                       RT_MANGLER(RTCrX509Name_CheckSanity)
+# define RTCrX509OldAuthorityKeyIdentifier_CheckSanity  RT_MANGLER(RTCrX509OldAuthorityKeyIdentifier_CheckSanity)
+# define RTCrX509PolicyConstraints_CheckSanity          RT_MANGLER(RTCrX509PolicyConstraints_CheckSanity)
+# define RTCrX509PolicyInformation_CheckSanity          RT_MANGLER(RTCrX509PolicyInformation_CheckSanity)
+# define RTCrX509PolicyMapping_CheckSanity              RT_MANGLER(RTCrX509PolicyMapping_CheckSanity)
+# define RTCrX509PolicyMappings_CheckSanity             RT_MANGLER(RTCrX509PolicyMappings_CheckSanity)
+# define RTCrX509PolicyQualifierInfo_CheckSanity        RT_MANGLER(RTCrX509PolicyQualifierInfo_CheckSanity)
+# define RTCrX509PolicyQualifierInfos_CheckSanity       RT_MANGLER(RTCrX509PolicyQualifierInfos_CheckSanity)
+# define RTCrX509SubjectPublicKeyInfo_CheckSanity       RT_MANGLER(RTCrX509SubjectPublicKeyInfo_CheckSanity)
+# define RTCrX509TbsCertificate_CheckSanity             RT_MANGLER(RTCrX509TbsCertificate_CheckSanity)
+# define RTCrX509Validity_CheckSanity                   RT_MANGLER(RTCrX509Validity_CheckSanity)
+# define RTCrX509Certificate_VerifySignature            RT_MANGLER(RTCrX509Certificate_VerifySignature)
+# define RTCrTafCertPathControls_DecodeAsn1             RT_MANGLER(RTCrTafCertPathControls_DecodeAsn1)
+# define RTCrTafTrustAnchorChoice_DecodeAsn1            RT_MANGLER(RTCrTafTrustAnchorChoice_DecodeAsn1)
+# define RTCrTafTrustAnchorInfo_DecodeAsn1              RT_MANGLER(RTCrTafTrustAnchorInfo_DecodeAsn1)
+# define RTCrTafTrustAnchorList_DecodeAsn1              RT_MANGLER(RTCrTafTrustAnchorList_DecodeAsn1)
+# define RTCrTafCertPathControls_Compare                RT_MANGLER(RTCrTafCertPathControls_Compare)
+# define RTCrTafCertPathControls_Delete                 RT_MANGLER(RTCrTafCertPathControls_Delete)
+# define RTCrTafCertPathControls_Enum                   RT_MANGLER(RTCrTafCertPathControls_Enum)
+# define RTCrTafTrustAnchorChoice_Compare               RT_MANGLER(RTCrTafTrustAnchorChoice_Compare)
+# define RTCrTafTrustAnchorChoice_Delete                RT_MANGLER(RTCrTafTrustAnchorChoice_Delete)
+# define RTCrTafTrustAnchorChoice_Enum                  RT_MANGLER(RTCrTafTrustAnchorChoice_Enum)
+# define RTCrTafTrustAnchorInfo_Compare                 RT_MANGLER(RTCrTafTrustAnchorInfo_Compare)
+# define RTCrTafTrustAnchorInfo_Delete                  RT_MANGLER(RTCrTafTrustAnchorInfo_Delete)
+# define RTCrTafTrustAnchorInfo_Enum                    RT_MANGLER(RTCrTafTrustAnchorInfo_Enum)
+# define RTCrTafTrustAnchorList_Compare                 RT_MANGLER(RTCrTafTrustAnchorList_Compare)
+# define RTCrTafTrustAnchorList_Delete                  RT_MANGLER(RTCrTafTrustAnchorList_Delete)
+# define RTCrTafTrustAnchorList_Enum                    RT_MANGLER(RTCrTafTrustAnchorList_Enum)
+# define RTCrTafCertPathControls_Clone                  RT_MANGLER(RTCrTafCertPathControls_Clone)
+# define RTCrTafCertPathControls_Init                   RT_MANGLER(RTCrTafCertPathControls_Init)
+# define RTCrTafTrustAnchorChoice_Clone                 RT_MANGLER(RTCrTafTrustAnchorChoice_Clone)
+# define RTCrTafTrustAnchorChoice_Init                  RT_MANGLER(RTCrTafTrustAnchorChoice_Init)
+# define RTCrTafTrustAnchorInfo_Clone                   RT_MANGLER(RTCrTafTrustAnchorInfo_Clone)
+# define RTCrTafTrustAnchorInfo_Init                    RT_MANGLER(RTCrTafTrustAnchorInfo_Init)
+# define RTCrTafTrustAnchorList_Clone                   RT_MANGLER(RTCrTafTrustAnchorList_Clone)
+# define RTCrTafTrustAnchorList_Init                    RT_MANGLER(RTCrTafTrustAnchorList_Init)
+# define RTCrTafCertPathControls_CheckSanity            RT_MANGLER(RTCrTafCertPathControls_CheckSanity)
+# define RTCrTafTrustAnchorChoice_CheckSanity           RT_MANGLER(RTCrTafTrustAnchorChoice_CheckSanity)
+# define RTCrTafTrustAnchorInfo_CheckSanity             RT_MANGLER(RTCrTafTrustAnchorInfo_CheckSanity)
+# define RTCrTafTrustAnchorList_CheckSanity             RT_MANGLER(RTCrTafTrustAnchorList_CheckSanity)
+# define RTCrCertCtxRelease                             RT_MANGLER(RTCrCertCtxRelease)
+# define RTCrCertCtxRetain                              RT_MANGLER(RTCrCertCtxRetain)
+# define RTCrStoreCertAddEncoded                        RT_MANGLER(RTCrStoreCertAddEncoded)
+# define RTCrStoreCertByIssuerAndSerialNo               RT_MANGLER(RTCrStoreCertByIssuerAndSerialNo)
+# define RTCrStoreCertFindAll                           RT_MANGLER(RTCrStoreCertFindAll)
+# define RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280 RT_MANGLER(RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280)
+# define RTCrStoreCertSearchDestroy                     RT_MANGLER(RTCrStoreCertSearchDestroy)
+# define RTCrStoreCertSearchNext                        RT_MANGLER(RTCrStoreCertSearchNext)
+# define RTCrStoreConvertToOpenSslCertStack             RT_MANGLER(RTCrStoreConvertToOpenSslCertStack)
+# define RTCrStoreConvertToOpenSslCertStore             RT_MANGLER(RTCrStoreConvertToOpenSslCertStore)
+# define RTCrStoreRelease                               RT_MANGLER(RTCrStoreRelease)
+# define RTCrStoreRetain                                RT_MANGLER(RTCrStoreRetain)
+# define RTCrStoreCreateInMem                           RT_MANGLER(RTCrStoreCreateInMem)
+# define RTCrStoreCertAddFromFile                       RT_MANGLER(RTCrStoreCertAddFromFile)
+# define RTErrInfoAdd                                   RT_MANGLER(RTErrInfoAdd)
+# define RTErrInfoAddF                                  RT_MANGLER(RTErrInfoAddF)
+# define RTErrInfoAddV                                  RT_MANGLER(RTErrInfoAddV)
+# define RTLdrHashImage                                 RT_MANGLER(RTLdrHashImage)
+# define RTLdrOpenWithReader                            RT_MANGLER(RTLdrOpenWithReader)
+# define RTLdrQueryProp                                 RT_MANGLER(RTLdrQueryProp)
+# define RTLdrQueryPropEx                               RT_MANGLER(RTLdrQueryPropEx)
+# define RTLdrVerifySignature                           RT_MANGLER(RTLdrVerifySignature)
+# define RTBigNumAdd                                    RT_MANGLER(RTBigNumAdd)
+# define RTBigNumAssign                                 RT_MANGLER(RTBigNumAssign)
+# define RTBigNumBitWidth                               RT_MANGLER(RTBigNumBitWidth)
+# define RTBigNumByteWidth                              RT_MANGLER(RTBigNumByteWidth)
+# define RTBigNumClone                                  RT_MANGLER(RTBigNumClone)
+# define RTBigNumCompare                                RT_MANGLER(RTBigNumCompare)
+# define RTBigNumCompareWithS64                         RT_MANGLER(RTBigNumCompareWithS64)
+# define RTBigNumCompareWithU64                         RT_MANGLER(RTBigNumCompareWithU64)
+# define RTBigNumDestroy                                RT_MANGLER(RTBigNumDestroy)
+# define RTBigNumDivide                                 RT_MANGLER(RTBigNumDivide)
+# define RTBigNumExponentiate                           RT_MANGLER(RTBigNumExponentiate)
+# define RTBigNumInit                                   RT_MANGLER(RTBigNumInit)
+# define RTBigNumInitZero                               RT_MANGLER(RTBigNumInitZero)
+# define RTBigNumModExp                                 RT_MANGLER(RTBigNumModExp)
+# define RTBigNumModulo                                 RT_MANGLER(RTBigNumModulo)
+# define RTBigNumMultiply                               RT_MANGLER(RTBigNumMultiply)
+# define RTBigNumNegate                                 RT_MANGLER(RTBigNumNegate)
+# define RTBigNumNegateThis                             RT_MANGLER(RTBigNumNegateThis)
+# define RTBigNumSubtract                               RT_MANGLER(RTBigNumSubtract)
+# define RTBigNumToBytesBigEndian                       RT_MANGLER(RTBigNumToBytesBigEndian)
+# define RTUtf16Copy                                    RT_MANGLER(RTUtf16Copy)
+# define RTUtf16CopyAscii                               RT_MANGLER(RTUtf16CopyAscii)
+# define RTUtf16Cat                                     RT_MANGLER(RTUtf16Cat)
+# define RTUtf16CatAscii                                RT_MANGLER(RTUtf16CatAscii)
+# define RTUtf16End                                     RT_MANGLER(RTUtf16End)
+# define RTUtf16ICmpAscii                               RT_MANGLER(RTUtf16ICmpAscii)
+# define RTUtf16NLen                                    RT_MANGLER(RTUtf16NLen)
+# define RTUtf16NLenEx                                  RT_MANGLER(RTUtf16NLenEx)
+# define RTUtf16PrintHexBytes                           RT_MANGLER(RTUtf16PrintHexBytes)
+# define RTMemSaferAllocZExTag                          RT_MANGLER(RTMemSaferAllocZExTag)
+# define RTMemSaferAllocZTag                            RT_MANGLER(RTMemSaferAllocZTag)
+# define RTMemSaferFree                                 RT_MANGLER(RTMemSaferFree)
+# define RTMemSaferReallocZExTag                        RT_MANGLER(RTMemSaferReallocZExTag)
+# define RTMemSaferReallocZTag                          RT_MANGLER(RTMemSaferReallocZTag)
+# define RTMemSaferScramble                             RT_MANGLER(RTMemSaferScramble)
+# define RTMemSaferUnscramble                           RT_MANGLER(RTMemSaferUnscramble)
+# define RTErrConvertFromDarwin                         RT_MANGLER(RTErrConvertFromDarwin)
+# define RTErrConvertFromDarwinCOM                      RT_MANGLER(RTErrConvertFromDarwinCOM)
+# define RTErrConvertFromDarwinIO                       RT_MANGLER(RTErrConvertFromDarwinIO)
+# define RTErrConvertFromDarwinKern                     RT_MANGLER(RTErrConvertFromDarwinKern)
+# define RTErrConvertFromDarwin                         RT_MANGLER(RTErrConvertFromDarwin)
+# define RTErrConvertFromDarwinIO                       RT_MANGLER(RTErrConvertFromDarwinIO)
+# define RTErrConvertFromDarwinKern                     RT_MANGLER(RTErrConvertFromDarwinKern)
+
 /*
  * Stable variables (alphabetical order):
  */
@@ -1917,6 +2842,25 @@
 # define g_szRTAssertMsg2                               RT_MANGLER(g_szRTAssertMsg2)
 # define g_u32RTAssertLine                              RT_MANGLER(g_u32RTAssertLine)
 
+/* sort/merge into the above later: */
+# define g_RTAsn1Time_Vtable                            RT_MANGLER(g_RTAsn1Time_Vtable)
+# define g_RTAsn1String_Vtable                          RT_MANGLER(g_RTAsn1String_Vtable)
+# define g_RTAsn1OctetString_Vtable                     RT_MANGLER(g_RTAsn1OctetString_Vtable)
+# define g_RTAsn1ObjId_Vtable                           RT_MANGLER(g_RTAsn1ObjId_Vtable)
+# define g_RTAsn1Null_Vtable                            RT_MANGLER(g_RTAsn1Null_Vtable)
+# define g_RTAsn1Integer_Vtable                         RT_MANGLER(g_RTAsn1Integer_Vtable)
+# define g_RTAsn1Core_Vtable                            RT_MANGLER(g_RTAsn1Core_Vtable)
+# define g_RTAsn1Boolean_Vtable                         RT_MANGLER(g_RTAsn1Boolean_Vtable)
+# define g_RTAsn1BitString_Vtable                       RT_MANGLER(g_RTAsn1BitString_Vtable)
+# define g_RTAsn1DefaultAllocator                       RT_MANGLER(g_RTAsn1DefaultAllocator)
+#if 0 /* Disabled for now as I'm not sure the assmbler supports mangling yet. */
+# define g_abRTZeroPage                                 RT_MANGLER(g_abRTZeroPage)
+# define g_abRTZero4K                                   RT_MANGLER(g_abRTZero4K)
+# define g_abRTZero8K                                   RT_MANGLER(g_abRTZero8K)
+# define g_abRTZero16K                                  RT_MANGLER(g_abRTZero16K)
+# define g_abRTZero32K                                  RT_MANGLER(g_abRTZero32K)
+# define g_abRTZero64K                                  RT_MANGLER(g_abRTZero64K)
+#endif
 
 
 /*
diff --git a/include/iprt/manifest.h b/include/iprt/manifest.h
index d40f601..f7a1517 100644
--- a/include/iprt/manifest.h
+++ b/include/iprt/manifest.h
@@ -57,28 +57,6 @@ RT_C_DECLS_BEGIN
 #define RTMANIFEST_ATTR_ANY         UINT32_C(0xffffffff)
 /** @} */
 
-/** @name Digest types. */
-typedef enum RTDIGESTTYPE
-{
-    /** Invalid digest value.  */
-    RTDIGESTTYPE_INVALID = 0,
-    /** CRC32 checksum. */
-    RTDIGESTTYPE_CRC32,
-    /** CRC64 checksum. */
-    RTDIGESTTYPE_CRC64,
-    /** MD5 checksum (unsafe!). */
-    RTDIGESTTYPE_MD5,
-    /** SHA1 checksum (unsafe!). */
-    RTDIGESTTYPE_SHA1,
-    /** SHA256 checksum. */
-    RTDIGESTTYPE_SHA256,
-    /** SHA512 checksum. */
-    RTDIGESTTYPE_SHA512,
-    /** Usual 32-bit type blowup. */
-    RTDIGESTTYPE_32BIT_HACK = 0x7fffffff
-} RTDIGESTTYPE;
-/** @} */
-
 
 /**
  * Creates an empty manifest.
diff --git a/include/iprt/md5.h b/include/iprt/md2.h
similarity index 51%
copy from include/iprt/md5.h
copy to include/iprt/md2.h
index f9f4832..6ba2c22 100644
--- a/include/iprt/md5.h
+++ b/include/iprt/md2.h
@@ -1,9 +1,9 @@
 /** @file
- * IPRT - Message-Digest algorithm 5.
+ * IPRT - Message-Digest Algorithm 2.
  */
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -23,90 +23,91 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-#ifndef ___iprt_md5_h
-#define ___iprt_md5_h
+#ifndef ___iprt_md2_h
+#define ___iprt_md2_h
 
 #include <iprt/types.h>
 
-/** @defgroup grp_rt_md5    RTMd5 - Message-Digest algorithm 5
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_md2    RTMd2 - Message-Digest algorithm 2
  * @ingroup grp_rt
  * @{
  */
 
-/** Size of a MD5 hash. */
-#define RTMD5_HASH_SIZE     16
-/** @deprecated Use RTMD5_HASH_SIZE. */
-#define RTMD5HASHSIZE       RTMD5_HASH_SIZE
-/** The length of a MD5 digest string. The terminator is not included. */
-#define RTMD5_DIGEST_LEN    32
-/** Size of a MD5 hash.
- * @deprecated Use RTMD5_DIGEST_LEN  */
-#define RTMD5_STRING_LEN    RTMD5_DIGEST_LEN
+/** Size of a MD2 hash. */
+#define RTMD2_HASH_SIZE     16
+/** The length of a MD2 digest string. The terminator is not included. */
+#define RTMD2_DIGEST_LEN    32
 
 /**
- * MD5 hash algorithm context.
+ * MD2 hash algorithm context.
  */
-typedef struct RTMD5CONTEXT
+typedef union RTMD2CONTEXT
 {
-    uint32_t in[16];
-    uint32_t buf[4];
-    uint32_t bits[2];
-} RTMD5CONTEXT;
+    uint64_t            u64BetterAlignment;
+    uint8_t             abPadding[4 + 16 + 16*4 + 16*4];
+#ifdef RT_MD2_PRIVATE_CONTEXT
+    MD2_CTX             Private;
+#endif
+#ifdef RT_MD2_PRIVATE_ALT_CONTEXT
+    RTMD2ALTPRIVATECTX  AltPrivate;
+#endif
+} RTMD2CONTEXT;
 
-/** Pointer to MD5 hash algorithm context. */
-typedef RTMD5CONTEXT *PRTMD5CONTEXT;
+/** Pointer to MD2 hash algorithm context. */
+typedef RTMD2CONTEXT *PRTMD2CONTEXT;
 
-RT_C_DECLS_BEGIN
 
 /**
- * Compute the MD5 hash of the data.
+ * Compute the MD2 hash of the data.
  *
  * @param   pvBuf       Pointer to data.
  * @param   cbBuf       Length of data (in bytes).
  * @param   pabDigest   Where to store the hash.
  *                      (What's passed is a pointer to the caller's buffer.)
  */
-RTDECL(void) RTMd5(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD5HASHSIZE]);
+RTDECL(void) RTMd2(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD2_HASH_SIZE]);
 
 /**
- * Initialize MD5 context.
+ * Initialize MD2 context.
  *
- * @param   pCtx        Pointer to the MD5 context to initialize.
+ * @param   pCtx        Pointer to the MD2 context to initialize.
  */
-RTDECL(void) RTMd5Init(PRTMD5CONTEXT pCtx);
+RTDECL(void) RTMd2Init(PRTMD2CONTEXT pCtx);
 
 /**
- * Feed data into the MD5 computation.
+ * Feed data into the MD2 computation.
  *
- * @param   pCtx        Pointer to the MD5 context.
+ * @param   pCtx        Pointer to the MD2 context.
  * @param   pvBuf       Pointer to data.
  * @param   cbBuf       Length of data (in bytes).
  */
-RTDECL(void) RTMd5Update(PRTMD5CONTEXT pCtx, const void *pvBuf, size_t cbBuf);
+RTDECL(void) RTMd2Update(PRTMD2CONTEXT pCtx, const void *pvBuf, size_t cbBuf);
 
 /**
- * Compute the MD5 hash of the data.
+ * Compute the MD2 hash of the data.
  *
- * @param   pabDigest   Where to store the hash.
- *                      (What's passed is a pointer to the caller's buffer.)
- * @param   pCtx        Pointer to the MD5 context.
+ * @param   pCtx        Pointer to the MD2 context.
+ * @param   pabDigest   Where to store the hash. (What's passed is a pointer to
+ *                      the caller's buffer.)
  */
-RTDECL(void) RTMd5Final(uint8_t pabDigest[RTMD5HASHSIZE], PRTMD5CONTEXT pCtx);
+RTDECL(void) RTMd2Final(PRTMD2CONTEXT pCtx, uint8_t pabDigest[RTMD2_HASH_SIZE]);
 
 /**
- * Converts a MD5 hash to a digest string.
+ * Converts a MD2 hash to a digest string.
  *
  * @returns IPRT status code.
  *
- * @param   pabDigest   The binary digest returned by RTMd5Final or RTMd5.
+ * @param   pabDigest   The binary digest returned by RTMd2Final or RTMd2.
  * @param   pszDigest   Where to return the stringified digest.
  * @param   cchDigest   The size of the output buffer. Should be at least
- *                      RTMD5_STRING_LEN + 1 bytes.
+ *                      RTMD2_STRING_LEN + 1 bytes.
  */
-RTDECL(int) RTMd5ToString(uint8_t const pabDigest[RTMD5_HASH_SIZE], char *pszDigest, size_t cchDigest);
+RTDECL(int) RTMd2ToString(uint8_t const pabDigest[RTMD2_HASH_SIZE], char *pszDigest, size_t cchDigest);
 
 /**
- * Converts a MD5 hash to a digest string.
+ * Converts a MD2 hash to a digest string.
  *
  * @returns IPRT status code.
  *
@@ -115,12 +116,11 @@ RTDECL(int) RTMd5ToString(uint8_t const pabDigest[RTMD5_HASH_SIZE], char *pszDig
  * @param   pabDigest   Where to store the hash. (What is passed is a pointer to
  *                      the caller's buffer.)
  */
-RTDECL(int) RTMd5FromString(char const *pszDigest, uint8_t pabDigest[RTMD5_HASH_SIZE]);
+RTDECL(int) RTMd2FromString(char const *pszDigest, uint8_t pabDigest[RTMD2_HASH_SIZE]);
 
+/** @} */
 
 RT_C_DECLS_END
 
-/** @} */
-
 #endif
 
diff --git a/include/iprt/md5.h b/include/iprt/md5.h
index f9f4832..3bfd91d 100644
--- a/include/iprt/md5.h
+++ b/include/iprt/md5.h
@@ -46,13 +46,22 @@
 /**
  * MD5 hash algorithm context.
  */
-typedef struct RTMD5CONTEXT
+typedef union RTMD5CONTEXT
 {
-    uint32_t in[16];
-    uint32_t buf[4];
-    uint32_t bits[2];
+    uint64_t            u64BetterAlignment;
+    uint8_t             abPadding[(4 + 6 + 16 + 1) * sizeof(uint32_t)];
+    /** Context used by md5-alt.cpp. */
+    struct
+    {
+        uint32_t        in[16];
+        uint32_t        buf[4];
+        uint32_t        bits[2];
+    } AltPrivate;
+#ifdef RT_MD5_OPENSSL_PRIVATE_CONTEXT
+    /** Context used by md5-openssl.cpp. */
+    MD5_CTX         OsslPrivate;
+#endif
 } RTMD5CONTEXT;
-
 /** Pointer to MD5 hash algorithm context. */
 typedef RTMD5CONTEXT *PRTMD5CONTEXT;
 
diff --git a/include/iprt/mem.h b/include/iprt/mem.h
index 9b86806..2b56d19 100644
--- a/include/iprt/mem.h
+++ b/include/iprt/mem.h
@@ -505,6 +505,91 @@ RTDECL(int) RTMemProtect(void *pv, size_t cb, unsigned fProtect) RT_NO_THROW;
  */
 RTDECL(void) RTMemWipeThoroughly(void *pv, size_t cb, size_t cMinPasses) RT_NO_THROW;
 
+/**
+ * Allocate locked memory with default tag - extended version.
+ *
+ * @returns IPRT status code.
+ * @param   cb      The amount of memory to allocate.
+ * @param   ppv     Where to store the pointer to the allocated memory on success.
+ */
+#define RTMemLockedAllocEx(cb, ppv) RTMemLockedAllocExTag((cb), RTMEM_TAG, (ppv))
+
+/**
+ * Allocate locked memory - extended version.
+ *
+ * @returns IPRT status code.
+ * @param   cb      The amount of memory to allocate.
+ * @param   pszTag  Allocation tag used for statistics and such.
+ * @param   ppv     Where to store the pointer to the allocated memory on success.
+ */
+RTDECL(int) RTMemLockedAllocExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW;
+
+/**
+ * Allocate zeroed locked memory with default tag - extended version.
+ *
+ * @returns IPRT status code.
+ * @param   cb      The amount of memory to allocate.
+ * @param   ppv     Where to store the pointer to the allocated memory on success.
+ */
+#define RTMemLockedAllocZEx(cb, ppv) RTMemLockedAllocZExTag((cb), RTMEM_TAG, (ppv))
+
+/**
+ * Allocate zeroed locked memory - extended version.
+ *
+ * @returns IPRT status code.
+ * @param   cb      The amount of memory to allocate.
+ * @param   pszTag  Allocation tag used for statistics and such.
+ * @param   ppv     Where to store the pointer to the allocated memory on success.
+ */
+RTDECL(int) RTMemLockedAllocZExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW;
+
+/**
+ * Allocate locked memory with the default tag - shortcut for RTMemLockedAllocExTag().
+ *
+ * @returns Pointer to allocated memory on success.
+ * @returns NULL on failure (use RTMemLockedAllocExTag() if the specific reason is required)
+ * @param   cb      The amount of memory to allocate.
+ */
+#define RTMemLockedAlloc(cb) RTMemLockedAllocTag((cb), RTMEM_TAG)
+
+/**
+ * Allocate locked memory - shortcut for RTMemLockedAllocExTag().
+ *
+ * @returns Pointer to allocated memory on success.
+ * @returns NULL on failure (use RTMemLockedAllocExTag() if the specific reason is required)
+ * @param   cb      The amount of memory to allocate.
+ * @param   pszTag  Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemLockedAllocTag(size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Allocate locked zeroed memory with the default tag - shortcut for RTMemLockedAllocZExTag().
+ *
+ * @returns Pointer to allocated memory on success.
+ * @returns NULL on failure (use RTMemLockedAllocZExTag() if the specific reason is required)
+ * @param   cb      The amount of memory to allocate.
+ */
+#define RTMemLockedAllocZ(cb) RTMemLockedAllocZTag((cb), RTMEM_TAG)
+
+/**
+ * Allocate locked zeroed memory - shortcut for RTMemLockedAllocZExTag().
+ *
+ * @returns Pointer to allocated memory on success.
+ * @returns NULL on failure (use RTMemLockedAllocZExTag() if the specific reason is required)
+ * @param   cb      The amount of memory to allocate.
+ * @param   pszTag  Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemLockedAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Frees memory allocated with any of the RTMemLockedAlloc* API.
+ *
+ * @returns nothing.
+ * @param   pv    Pointer to the memory block to free.
+ */
+RTDECL(void) RTMemLockedFree(void *pv) RT_NO_THROW;
+
+
 #ifdef IN_RING0
 
 /**
diff --git a/include/iprt/memsafer.h b/include/iprt/memsafer.h
new file mode 100644
index 0000000..7156e7b
--- /dev/null
+++ b/include/iprt/memsafer.h
@@ -0,0 +1,226 @@
+/** @file
+ * IPRT - Memory Allocate for Sensitive Data.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_memsafer_h
+#define ___iprt_memsafer_h
+
+#include <iprt/mem.h> /* RTMEM_TAG */
+
+RT_C_DECLS_BEGIN
+
+
+/** @defgroup grp_rt_memsafer   RTMemSafer - Memory Allocator for Sensitive Data
+ * @ingroup grp_rt
+ *
+ * This API doesn't provide 100% secure storage, it only provider more secure
+ * and safer storage.  Thus the API isn't called RTMemSafe because you cannot
+ * assume the data is safe against all kinds of extraction methods.
+ *
+ * The API guarantee that the memory won't be returned to the system containing
+ * any of the information you put there.  It will be repeatedly wiped after use.
+ *
+ * The API tries to isolate your data from other information stored in the
+ * process/system.  How well this is done depends on the implementation.  The
+ * more complicated implementations will provide protection against heartbleed
+ * like bugs where pieces of the heap is copied onto the wire.
+ *
+ * The more hardened implementations of the API will also do their best to
+ * prevent the memory from ending up in process dumps or being readable by
+ * debuggers.
+ *
+ * Finally, two functions are provided for scrambling the sensitive memory while
+ * it's not in use.
+ *
+ * @{
+ */
+
+
+/**
+ * Scrambles memory allocated by RTMemSaferAllocZEx and associates after use.
+ *
+ * Call this when the sensitive data isn't actively being used.  It will at a
+ * minimum make sure the data is slightly scrambled, how hard it is to unbutton
+ * is dependent on which implementation is used and available host support.
+ *
+ * The user must synchronize calls to RTMemSaferScramble and
+ * RTMemSaferUnscramble, this memory allocator provides no help and keeps no
+ * state information around.
+ *
+ * @returns IPRT status code.
+ * @param   pv          The pointer returned by the allocation function.
+ * @param   cb          The exact size given to the allocation function.
+ */
+RTDECL(int) RTMemSaferScramble(void *pv, size_t cb);
+
+/**
+ * Unscrambles memory allocated by RTMemSaferAllocZEx and associates before use.
+ *
+ * This undoes the effect of RTMemSaferScramble.
+ *
+ * @returns IPRT status code.
+ * @param   pv          The pointer returned by the allocation function.
+ * @param   cb          The exact size given to the allocation function.
+ */
+RTDECL(int) RTMemSaferUnscramble(void *pv, size_t cb);
+
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns IPRT status code.
+ * @param   ppvNew      Where to return the pointer to the memory.
+ * @param   cb          Number of bytes to allocate.
+ * @param   pszTag      Allocation tag used for statistics and such.
+ */
+RTDECL(int) RTMemSaferAllocZExTag(void **ppvNew, size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns IPRT status code.
+ * @param   a_ppvNew    Where to return the pointer to the memory.
+ * @param   a_cb        Number of bytes to allocate.
+ */
+#define RTMemSaferAllocZEx(a_ppvNew, a_cb) RTMemSaferAllocZExTag(a_ppvNew, a_cb, RTMEM_TAG)
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param   cb          Number of bytes to allocate.
+ * @param   pszTag      Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemSaferAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Allocates memory for sensitive data.
+ *
+ * Some effort will be taken to isolate the data from other memory allocation.
+ * Memory is always zeroed.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param   a_cb        Number of bytes to allocate.
+ */
+#define RTMemSaferAllocZ(a_cb) RTMemSaferAllocZTag(a_cb, RTMEM_TAG)
+
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZEx, RTMemSaferAllocZ,
+ * RTMemSaferAllocZExTag, or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed.  When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns IPRT status code.
+ * @param   cbOld       The current allocation size.
+ * @param   pvOld       The current allocation.
+ * @param   cbNew       The size of the new allocation.
+ * @param   ppvNew      Where to return the pointer to the new memory.
+ * @param   pszTag      Allocation tag used for statistics and such.
+ */
+RTDECL(int) RTMemSaferReallocZExTag(size_t cbOld, void *pvOld, size_t cbNew, void **ppvNew, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZEx, RTMemSaferAllocZ,
+ * RTMemSaferAllocZExTag, or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed.  When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns IPRT status code.
+ * @param   a_cbOld     The current allocation size.
+ * @param   a_pvOld     The current allocation.
+ * @param   a_cbNew     The size of the new allocation.
+ * @param   a_ppvNew    Where to return the pointer to the new memory.
+ */
+#define RTMemSaferReallocZEx(a_cbOld, a_pvOld, a_cbNew, a_ppvNew) \
+    RTMemSaferReallocZExTag(a_cbOld, a_pvOld, a_cbNew, a_ppvNew, RTMEM_TAG)
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZ or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed.  When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param   cbOld       The current allocation size.
+ * @param   pvOld       The current allocation.
+ * @param   cbNew       The size of the new allocation.
+ * @param   pszTag      Allocation tag used for statistics and such.
+ */
+RTDECL(void *) RTMemSaferReallocZTag(size_t cbOld, void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW;
+
+/**
+ * Reallocates memory allocated by RTMemSaferAllocZ or RTMemSaferAllocZTag.
+ *
+ * When extending the allocation, the new memory will be zeroed.  When shrinking
+ * the allocation the left over memory will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * The function follows the standard realloc behavior.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param   a_cbOld     The current allocation size.
+ * @param   a_pvOld     The current allocation.
+ * @param   a_cbNew     The size of the new allocation.
+ */
+#define RTMemSaferReallocZ(a_cbOld, a_pvOld, a_cbNew) RTMemSaferReallocZTag(a_cbOld, a_pvOld, a_cbNew, RTMEM_TAG)
+
+
+/**
+ * Frees memory allocated by RTMemSaferAllocZ* or RTMemSaferReallocZ*.
+ *
+ * Before freeing the allocated memory, it will be wiped clean using
+ * RTMemWipeThorougly.
+ *
+ * @returns Pointer to the allocated memory.
+ * @param   pv          The allocation.
+ * @param   cb          The allocation size.
+ */
+RTDECL(void) RTMemSaferFree(void *pv, size_t cb) RT_NO_THROW;
+
+/** @}  */
+RT_C_DECLS_END
+
+#endif
+
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/include/iprt/nt/Makefile.kup
similarity index 100%
copy from src/VBox/Runtime/common/ldr/Makefile.kup
copy to include/iprt/nt/Makefile.kup
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/nt/nt-and-windows.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/nt/nt-and-windows.h
index 35b6d89..394f696 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/nt/nt-and-windows.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: nt-and-windows.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Header for code using both NT native and Windows APIs.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,14 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#ifndef ___iprt_nt_nt_and_windows_h
+#define ___iprt_nt_nt_and_windows_h
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define IPRT_NT_USE_WINTERNL
+#define WIN32_NO_STATUS
+#include <Windows.h>
+#undef WIN32_NO_STATUS
+#include <iprt/nt/nt.h>
 
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/include/iprt/nt/nt.h b/include/iprt/nt/nt.h
new file mode 100644
index 0000000..15dc9ea
--- /dev/null
+++ b/include/iprt/nt/nt.h
@@ -0,0 +1,906 @@
+/* $Id: nt.h $ */
+/** @file
+ * IPRT - Header for code using the Native NT API.
+ */
+
+/*
+ * Copyright (C) 2010-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_nt_nt_h___
+#define ___iprt_nt_nt_h___
+
+/** @def IPRT_NT_MAP_TO_ZW
+ * Map Nt calls to Zw calls.  In ring-0 the Zw calls let you pass kernel memory
+ * to the APIs (takes care of the previous context checks).
+ */
+#ifdef DOXYGEN_RUNNING
+# define IPRT_NT_MAP_TO_ZW
+#endif
+
+#ifdef IPRT_NT_MAP_TO_ZW
+# define NtQueryInformationFile         ZwQueryInformationFile
+# define NtQueryInformationProcess      ZwQueryInformationProcess
+# define NtQueryInformationThread       ZwQueryInformationThread
+# define NtQuerySystemInformation       ZwQuerySystemInformation
+# define NtClose                        ZwClose
+# define NtCreateFile                   ZwCreateFile
+# define NtReadFile                     ZwReadFile
+# define NtWriteFile                    ZwWriteFile
+/** @todo this is very incomplete! */
+#endif
+
+#include <ntstatus.h>
+
+/*
+ * Hacks common to both base header sets.
+ */
+#define NtQueryObject              Incomplete_NtQueryObject
+#define ZwQueryObject              Incomplete_ZwQueryObject
+#define NtSetInformationObject     Incomplete_NtSetInformationObject
+#define _OBJECT_INFORMATION_CLASS  Incomplete_OBJECT_INFORMATION_CLASS
+#define OBJECT_INFORMATION_CLASS   Incomplete_OBJECT_INFORMATION_CLASS
+#define ObjectBasicInformation     Incomplete_ObjectBasicInformation
+#define ObjectTypeInformation      Incomplete_ObjectTypeInformation
+
+
+#ifdef IPRT_NT_USE_WINTERNL
+/*
+ * Use Winternl.h.
+ */
+# define _FILE_INFORMATION_CLASS                IncompleteWinternl_FILE_INFORMATION_CLASS
+# define FILE_INFORMATION_CLASS                 IncompleteWinternl_FILE_INFORMATION_CLASS
+# define FileDirectoryInformation               IncompleteWinternl_FileDirectoryInformation
+
+# define NtQueryInformationProcess              IncompleteWinternl_NtQueryInformationProcess
+# define NtSetInformationProcess                IncompleteWinternl_NtSetInformationProcess
+# define PROCESSINFOCLASS                       IncompleteWinternl_PROCESSINFOCLASS
+# define _PROCESSINFOCLASS                      IncompleteWinternl_PROCESSINFOCLASS
+# define PROCESS_BASIC_INFORMATION              IncompleteWinternl_PROCESS_BASIC_INFORMATION
+# define PPROCESS_BASIC_INFORMATION             IncompleteWinternl_PPROCESS_BASIC_INFORMATION
+# define _PROCESS_BASIC_INFORMATION             IncompleteWinternl_PROCESS_BASIC_INFORMATION
+# define ProcessBasicInformation                IncompleteWinternl_ProcessBasicInformation
+# define ProcessDebugPort                       IncompleteWinternl_ProcessDebugPort
+# define ProcessWow64Information                IncompleteWinternl_ProcessWow64Information
+# define ProcessImageFileName                   IncompleteWinternl_ProcessImageFileName
+# define ProcessBreakOnTermination              IncompleteWinternl_ProcessBreakOnTermination
+
+# define NtQueryInformationThread               IncompleteWinternl_NtQueryInformationThread
+# define NtSetInformationThread                 IncompleteWinternl_NtSetInformationThread
+# define THREADINFOCLASS                        IncompleteWinternl_THREADINFOCLASS
+# define _THREADINFOCLASS                       IncompleteWinternl_THREADINFOCLASS
+# define ThreadIsIoPending                      IncompleteWinternl_ThreadIsIoPending
+
+# define NtQuerySystemInformation               IncompleteWinternl_NtQuerySystemInformation
+# define NtSetSystemInformation                 IncompleteWinternl_NtSetSystemInformation
+# define SYSTEM_INFORMATION_CLASS               IncompleteWinternl_SYSTEM_INFORMATION_CLASS
+# define _SYSTEM_INFORMATION_CLASS              IncompleteWinternl_SYSTEM_INFORMATION_CLASS
+# define SystemBasicInformation                 IncompleteWinternl_SystemBasicInformation
+# define SystemPerformanceInformation           IncompleteWinternl_SystemPerformanceInformation
+# define SystemTimeOfDayInformation             IncompleteWinternl_SystemTimeOfDayInformation
+# define SystemProcessInformation               IncompleteWinternl_SystemProcessInformation
+# define SystemProcessorPerformanceInformation  IncompleteWinternl_SystemProcessorPerformanceInformation
+# define SystemInterruptInformation             IncompleteWinternl_SystemInterruptInformation
+# define SystemExceptionInformation             IncompleteWinternl_SystemExceptionInformation
+# define SystemRegistryQuotaInformation         IncompleteWinternl_SystemRegistryQuotaInformation
+# define SystemLookasideInformation             IncompleteWinternl_SystemLookasideInformation
+# define SystemPolicyInformation                IncompleteWinternl_SystemPolicyInformation
+
+
+# define WIN32_NO_STATUS
+# include <windef.h>
+# include <winnt.h>
+# include <winternl.h>
+# undef WIN32_NO_STATUS
+# include <ntstatus.h>
+
+
+# undef _FILE_INFORMATION_CLASS
+# undef FILE_INFORMATION_CLASS
+# undef FileDirectoryInformation
+
+# undef NtQueryInformationProcess
+# undef NtSetInformationProcess
+# undef PROCESSINFOCLASS
+# undef _PROCESSINFOCLASS
+# undef PROCESS_BASIC_INFORMATION
+# undef PPROCESS_BASIC_INFORMATION
+# undef _PROCESS_BASIC_INFORMATION
+# undef ProcessBasicInformation
+# undef ProcessDebugPort
+# undef ProcessWow64Information
+# undef ProcessImageFileName
+# undef ProcessBreakOnTermination
+
+# undef NtQueryInformationThread
+# undef NtSetInformationThread
+# undef THREADINFOCLASS
+# undef _THREADINFOCLASS
+# undef ThreadIsIoPending
+
+# undef NtQuerySystemInformation
+# undef NtSetSystemInformation
+# undef SYSTEM_INFORMATION_CLASS
+# undef _SYSTEM_INFORMATION_CLASS
+# undef SystemBasicInformation
+# undef SystemPerformanceInformation
+# undef SystemTimeOfDayInformation
+# undef SystemProcessInformation
+# undef SystemProcessorPerformanceInformation
+# undef SystemInterruptInformation
+# undef SystemExceptionInformation
+# undef SystemRegistryQuotaInformation
+# undef SystemLookasideInformation
+# undef SystemPolicyInformation
+
+#else
+/*
+ * Use ntifs.h and wdm.h.
+ */
+# ifdef RT_ARCH_X86
+#  define _InterlockedAddLargeStatistic  _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
+#  pragma warning(disable : 4163)
+# endif
+
+# include <ntifs.h>
+# include <wdm.h>
+
+# ifdef RT_ARCH_X86
+#  pragma warning(default : 4163)
+#  undef _InterlockedAddLargeStatistic
+# endif
+
+# define IPRT_NT_NEED_API_GROUP_NTIFS
+#endif
+
+#undef NtQueryObject
+#undef ZwQueryObject
+#undef NtSetInformationObject
+#undef _OBJECT_INFORMATION_CLASS
+#undef OBJECT_INFORMATION_CLASS
+#undef ObjectBasicInformation
+#undef ObjectTypeInformation
+
+#include <iprt/types.h>
+
+
+/** @name Useful macros
+ * @{ */
+/** Indicates that we're targetting native NT in the current source. */
+#define RTNT_USE_NATIVE_NT              1
+/** Initializes a IO_STATUS_BLOCK. */
+#define RTNT_IO_STATUS_BLOCK_INITIALIZER  { STATUS_FAILED_DRIVER_ENTRY, ~(uintptr_t)42 }
+/** Similar to INVALID_HANDLE_VALUE in the Windows environment. */
+#define RTNT_INVALID_HANDLE_VALUE         ( (HANDLE)~(uintptr_t)0 )
+/** @}  */
+
+
+/** @name IPRT helper functions for NT
+ * @{ */
+RT_C_DECLS_BEGIN
+
+RTDECL(int) RTNtPathOpen(const char *pszPath, ACCESS_MASK fDesiredAccess, ULONG fFileAttribs, ULONG fShareAccess,
+                          ULONG fCreateDisposition, ULONG fCreateOptions, ULONG fObjAttribs,
+                          PHANDLE phHandle, PULONG_PTR puDisposition);
+RTDECL(int) RTNtPathOpenDir(const char *pszPath, ACCESS_MASK fDesiredAccess, ULONG fShareAccess, ULONG fCreateOptions,
+                            ULONG fObjAttribs, PHANDLE phHandle, bool *pfObjDir);
+RTDECL(int) RTNtPathClose(HANDLE hHandle);
+
+RT_C_DECLS_END
+/** @} */
+
+
+/** @name NT API delcarations.
+ * @{ */
+RT_C_DECLS_BEGIN
+
+/** @name Process access rights missing in ntddk headers
+ * @{ */
+#ifndef  PROCESS_TERMINATE
+# define PROCESS_TERMINATE                  UINT32_C(0x00000001)
+#endif
+#ifndef  PROCESS_CREATE_THREAD
+# define PROCESS_CREATE_THREAD              UINT32_C(0x00000002)
+#endif
+#ifndef  PROCESS_SET_SESSIONID
+# define PROCESS_SET_SESSIONID              UINT32_C(0x00000004)
+#endif
+#ifndef  PROCESS_VM_OPERATION
+# define PROCESS_VM_OPERATION               UINT32_C(0x00000008)
+#endif
+#ifndef  PROCESS_VM_READ
+# define PROCESS_VM_READ                    UINT32_C(0x00000010)
+#endif
+#ifndef  PROCESS_VM_WRITE
+# define PROCESS_VM_WRITE                   UINT32_C(0x00000020)
+#endif
+#ifndef  PROCESS_DUP_HANDLE
+# define PROCESS_DUP_HANDLE                 UINT32_C(0x00000040)
+#endif
+#ifndef  PROCESS_CREATE_PROCESS
+# define PROCESS_CREATE_PROCESS             UINT32_C(0x00000080)
+#endif
+#ifndef  PROCESS_SET_QUOTA
+# define PROCESS_SET_QUOTA                  UINT32_C(0x00000100)
+#endif
+#ifndef  PROCESS_SET_INFORMATION
+# define PROCESS_SET_INFORMATION            UINT32_C(0x00000200)
+#endif
+#ifndef  PROCESS_QUERY_INFORMATION
+# define PROCESS_QUERY_INFORMATION          UINT32_C(0x00000400)
+#endif
+#ifndef  PROCESS_SUSPEND_RESUME
+# define PROCESS_SUSPEND_RESUME             UINT32_C(0x00000800)
+#endif
+#ifndef  PROCESS_QUERY_LIMITED_INFORMATION
+# define PROCESS_QUERY_LIMITED_INFORMATION  UINT32_C(0x00001000)
+#endif
+#ifndef  PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION    UINT32_C(0x00002000)
+#endif
+#define PROCESS_UNKNOWN_4000                UINT32_C(0x00004000)
+#define PROCESS_UNKNOWN_6000                UINT32_C(0x00008000)
+#ifndef PROCESS_ALL_ACCESS
+# define PROCESS_ALL_ACCESS                 ( STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | UINT32_C(0x0000ffff) )
+#endif
+/** @} */
+
+/** @name Thread access rights missing in ntddk headers
+ * @{ */
+#ifndef THREAD_QUERY_INFORMATION
+# define THREAD_QUERY_INFORMATION           UINT32_C(0x00000040)
+#endif
+#ifndef THREAD_SET_THREAD_TOKEN
+# define THREAD_SET_THREAD_TOKEN            UINT32_C(0x00000080)
+#endif
+#ifndef THREAD_IMPERSONATE
+# define THREAD_IMPERSONATE                 UINT32_C(0x00000100)
+#endif
+#ifndef THREAD_DIRECT_IMPERSONATION
+# define THREAD_DIRECT_IMPERSONATION        UINT32_C(0x00000200)
+#endif
+#ifndef THREAD_RESUME
+# define THREAD_RESUME                      UINT32_C(0x00001000)
+#endif
+#define THREAD_UNKNOWN_2000                 UINT32_C(0x00002000)
+#define THREAD_UNKNOWN_4000                 UINT32_C(0x00004000)
+#define THREAD_UNKNOWN_8000                 UINT32_C(0x00008000)
+/** @} */
+
+/** @name Special handle values.
+ * @{ */
+#ifndef NtCurrentProcess
+# define NtCurrentProcess()                 ( (HANDLE)-(intptr_t)1 )
+#endif
+#ifndef NtCurrentThread
+# define NtCurrentThread()                  ( (HANDLE)-(intptr_t)2 )
+#endif
+#ifndef ZwCurrentProcess
+# define ZwCurrentProcess()                 NtCurrentProcess()
+#endif
+#ifndef ZwCurrentThread
+# define ZwCurrentThread()                  NtCurrentThread()
+#endif
+/** @} */
+
+
+/** @name Directory object access rights.
+ * @{ */
+#ifndef DIRECTORY_QUERY
+# define DIRECTORY_QUERY                    UINT32_C(0x00000001)
+#endif
+#ifndef DIRECTORY_TRAVERSE
+# define DIRECTORY_TRAVERSE                 UINT32_C(0x00000002)
+#endif
+#ifndef DIRECTORY_CREATE_OBJECT
+# define DIRECTORY_CREATE_OBJECT            UINT32_C(0x00000004)
+#endif
+#ifndef DIRECTORY_CREATE_SUBDIRECTORY
+# define DIRECTORY_CREATE_SUBDIRECTORY      UINT32_C(0x00000008)
+#endif
+#ifndef DIRECTORY_ALL_ACCESS
+# define DIRECTORY_ALL_ACCESS               ( STANDARD_RIGHTS_REQUIRED | UINT32_C(0x0000000f) )
+#endif
+/** @} */
+
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _CLIENT_ID
+{
+    HANDLE UniqueProcess;
+    HANDLE UniqueThread;
+} CLIENT_ID;
+typedef CLIENT_ID *PCLIENT_ID;
+
+NTSYSAPI NTSTATUS NTAPI NtCreateSection(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PLARGE_INTEGER, ULONG, ULONG, HANDLE);
+
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
+{
+    ULONG   FileSystemAttributes;
+    LONG    MaximumComponentNameLength;
+    ULONG   FileSystemNameLength;
+    WCHAR   FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION;
+typedef FILE_FS_ATTRIBUTE_INFORMATION *PFILE_FS_ATTRIBUTE_INFORMATION;
+
+NTSYSAPI NTSTATUS NTAPI NtOpenProcessToken(HANDLE, ACCESS_MASK, PHANDLE);
+NTSYSAPI NTSTATUS NTAPI NtOpenThreadToken(HANDLE, ACCESS_MASK, BOOLEAN, PHANDLE);
+
+typedef enum _FSINFOCLASS
+{
+    FileFsVolumeInformation = 1,
+    FileFsLabelInformation,
+    FileFsSizeInformation,
+    FileFsDeviceInformation,
+    FileFsAttributeInformation,
+    FileFsControlInformation,
+    FileFsFullSizeInformation,
+    FileFsObjectIdInformation,
+    FileFsDriverPathInformation,
+    FileFsVolumeFlagsInformation,
+    FileFsSectorSizeInformation,
+    FileFsDataCopyInformation,
+    FileFsMaximumInformation
+} FS_INFORMATION_CLASS;
+typedef FS_INFORMATION_CLASS *PFS_INFORMATION_CLASS;
+NTSYSAPI NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FS_INFORMATION_CLASS);
+
+typedef struct _FILE_STANDARD_INFORMATION
+{
+    LARGE_INTEGER   AllocationSize;
+    LARGE_INTEGER   EndOfFile;
+    ULONG           NumberOfLinks;
+    BOOLEAN         DeletePending;
+    BOOLEAN         Directory;
+} FILE_STANDARD_INFORMATION;
+typedef FILE_STANDARD_INFORMATION *PFILE_STANDARD_INFORMATION;
+typedef enum _FILE_INFORMATION_CLASS
+{
+    FileDirectoryInformation = 1,
+    FileFullDirectoryInformation,
+    FileBothDirectoryInformation,
+    FileBasicInformation,
+    FileStandardInformation,
+    FileInternalInformation,
+    FileEaInformation,
+    FileAccessInformation,
+    FileNameInformation,
+    FileRenameInformation,
+    FileLinkInformation,
+    FileNamesInformation,
+    FileDispositionInformation,
+    FilePositionInformation,
+    FileFullEaInformation,
+    FileModeInformation,
+    FileAlignmentInformation,
+    FileAllInformation,
+    FileAllocationInformation,
+    FileEndOfFileInformation,
+    FileAlternateNameInformation,
+    FileStreamInformation,
+    FilePipeInformation,
+    FilePipeLocalInformation,
+    FilePipeRemoteInformation,
+    FileMailslotQueryInformation,
+    FileMailslotSetInformation,
+    FileCompressionInformation,
+    FileObjectIdInformation,
+    FileCompletionInformation,
+    FileMoveClusterInformation,
+    FileQuotaInformation,
+    FileReparsePointInformation,
+    FileNetworkOpenInformation,
+    FileAttributeTagInformation,
+    FileTrackingInformation,
+    FileIdBothDirectoryInformation,
+    FileIdFullDirectoryInformation,
+    FileValidDataLengthInformation,
+    FileShortNameInformation,
+    FileIoCompletionNotificationInformation,
+    FileIoStatusBlockRangeInformation,
+    FileIoPriorityHintInformation,
+    FileSfioReserveInformation,
+    FileSfioVolumeInformation,
+    FileHardLinkInformation,
+    FileProcessIdsUsingFileInformation,
+    FileNormalizedNameInformation,
+    FileNetworkPhysicalNameInformation,
+    FileIdGlobalTxDirectoryInformation,
+    FileIsRemoteDeviceInformation,
+    FileUnusedInformation,
+    FileNumaNodeInformation,
+    FileStandardLinkInformation,
+    FileRemoteProtocolInformation,
+    FileRenameInformationBypassAccessCheck,
+    FileLinkInformationBypassAccessCheck,
+    FileVolumeNameInformation,
+    FileIdInformation,
+    FileIdExtdDirectoryInformation,
+    FileReplaceCompletionInformation,
+    FileHardLinkFullIdInformation,
+    FileMaximumInformation
+} FILE_INFORMATION_CLASS;
+typedef FILE_INFORMATION_CLASS *PFILE_INFORMATION_CLASS;
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationFile(HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG, FILE_INFORMATION_CLASS);
+
+typedef struct _MEMORY_SECTION_NAME
+{
+    UNICODE_STRING  SectionFileName;
+    WCHAR           NameBuffer[1];
+} MEMORY_SECTION_NAME;
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _PROCESS_BASIC_INFORMATION
+{
+    NTSTATUS ExitStatus;
+    PPEB PebBaseAddress;
+    ULONG_PTR AffinityMask;
+    int32_t BasePriority;
+    ULONG_PTR UniqueProcessId;
+    ULONG_PTR InheritedFromUniqueProcessId;
+} PROCESS_BASIC_INFORMATION;
+typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
+#endif
+
+typedef enum _PROCESSINFOCLASS
+{
+    ProcessBasicInformation = 0,
+    ProcessQuotaLimits,
+    ProcessIoCounters,
+    ProcessVmCounters,
+    ProcessTimes,
+    ProcessBasePriority,
+    ProcessRaisePriority,
+    ProcessDebugPort,
+    ProcessExceptionPort,
+    ProcessAccessToken,
+    ProcessLdtInformation,
+    ProcessLdtSize,
+    ProcessDefaultHardErrorMode,
+    ProcessIoPortHandlers,
+    ProcessPooledUsageAndLimits,
+    ProcessWorkingSetWatch,
+    ProcessUserModeIOPL,
+    ProcessEnableAlignmentFaultFixup,
+    ProcessPriorityClass,
+    ProcessWx86Information,
+    ProcessHandleCount,
+    ProcessAffinityMask,
+    ProcessPriorityBoost,
+    ProcessDeviceMap,
+    ProcessSessionInformation,
+    ProcessForegroundInformation,
+    ProcessWow64Information,
+    ProcessImageFileName,
+    ProcessLUIDDeviceMapsEnabled,
+    ProcessBreakOnTermination,
+    ProcessDebugObjectHandle,
+    ProcessDebugFlags,
+    ProcessHandleTracing,
+    ProcessIoPriority,
+    ProcessExecuteFlags,
+    ProcessTlsInformation,
+    ProcessCookie,
+    ProcessImageInformation,
+    ProcessCycleTime,
+    ProcessPagePriority,
+    ProcessInstrumentationCallbak,
+    ProcessThreadStackAllocation,
+    ProcessWorkingSetWatchEx,
+    ProcessImageFileNameWin32,
+    ProcessImageFileMapping,
+    ProcessAffinityUpdateMode,
+    ProcessMemoryAllocationMode,
+    ProcessGroupInformation,
+    ProcessTokenVirtualizationEnabled,
+    ProcessConsoleHostProcess,
+    ProcessWindowsInformation,
+    MaxProcessInfoClass
+} PROCESSINFOCLASS;
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
+
+typedef enum _THREADINFOCLASS
+{
+    ThreadBasicInformation = 0,
+    ThreadTimes,
+    ThreadPriority,
+    ThreadBasePriority,
+    ThreadAffinityMask,
+    ThreadImpersonationToken,
+    ThreadDescriptorTableEntry,
+    ThreadEnableAlignmentFaultFixup,
+    ThreadEventPair_Reusable,
+    ThreadQuerySetWin32StartAddress,
+    ThreadZeroTlsCell,
+    ThreadPerformanceCount,
+    ThreadAmILastThread,
+    ThreadIdealProcessor,
+    ThreadPriorityBoost,
+    ThreadSetTlsArrayAddress,
+    ThreadIsIoPending,
+    ThreadHideFromDebugger,
+    ThreadBreakOnTermination,
+    ThreadSwitchLegacyState,
+    ThreadIsTerminated,
+    ThreadLastSystemCall,
+    ThreadIoPriority,
+    ThreadCycleTime,
+    ThreadPagePriority,
+    ThreadActualBasePriority,
+    ThreadTebInformation,
+    ThreadCSwitchMon,
+    ThreadCSwitchPmu,
+    ThreadWow64Context,
+    ThreadGroupInformation,
+    ThreadUmsInformation,
+    ThreadCounterProfiling,
+    ThreadIdealProcessorEx,
+    ThreadCpuAccountingInformation,
+    MaxThreadInfoClass
+} THREADINFOCLASS;
+NTSYSAPI NTSTATUS NTAPI NtSetInformationThread(HANDLE, THREADINFOCLASS, LPCVOID, ULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationToken(HANDLE, TOKEN_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtReadFile(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER, PULONG);
+NTSYSAPI NTSTATUS NTAPI NtWriteFile(HANDLE, HANDLE, PIO_APC_ROUTINE, void const *, PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtReadVirtualMemory(HANDLE, PVOID, PVOID, SIZE_T, PSIZE_T);
+NTSYSAPI NTSTATUS NTAPI NtWriteVirtualMemory(HANDLE, PVOID, void const *, SIZE_T, PSIZE_T);
+
+NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAce(PACL, ULONG, ULONG, PSID);
+NTSYSAPI NTSTATUS NTAPI RtlCopySid(ULONG, PSID, PSID);
+NTSYSAPI NTSTATUS NTAPI RtlCreateAcl(PACL, ULONG, ULONG);
+NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR, ULONG);
+NTSYSAPI NTSTATUS NTAPI RtlGetVersion(PRTL_OSVERSIONINFOW);
+NTSYSAPI NTSTATUS NTAPI RtlInitializeSid(PSID, PSID_IDENTIFIER_AUTHORITY, UCHAR);
+NTSYSAPI NTSTATUS NTAPI RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR, BOOLEAN, PACL, BOOLEAN);
+NTSYSAPI PULONG   NTAPI RtlSubAuthoritySid(PSID, ULONG);
+
+#endif /* IPRT_NT_USE_WINTERNL */
+
+typedef enum _OBJECT_INFORMATION_CLASS
+{
+    ObjectBasicInformation = 0,
+    ObjectNameInformation,
+    ObjectTypeInformation,
+    ObjectAllInformation,
+    ObjectDataInformation
+} OBJECT_INFORMATION_CLASS;
+typedef OBJECT_INFORMATION_CLASS *POBJECT_INFORMATION_CLASS;
+#ifdef IN_RING0
+# define NtQueryObject ZwQueryObject
+#endif
+NTSYSAPI NTSTATUS NTAPI NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+NTSYSAPI NTSTATUS NTAPI NtSetInformationObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG);
+NTSYSAPI NTSTATUS NTAPI NtDuplicateObject(HANDLE, HANDLE, HANDLE, PHANDLE, ACCESS_MASK, ULONG, ULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtOpenDirectoryObject(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
+
+typedef struct _OBJECT_DIRECTORY_INFORMATION
+{
+    UNICODE_STRING Name;
+    UNICODE_STRING TypeName;
+} OBJECT_DIRECTORY_INFORMATION;
+typedef OBJECT_DIRECTORY_INFORMATION *POBJECT_DIRECTORY_INFORMATION;
+NTSYSAPI NTSTATUS NTAPI NtQueryDirectoryObject(HANDLE, PVOID, ULONG, BOOLEAN, BOOLEAN, PULONG, PULONG);
+
+/** Retured by ProcessImageInformation as well as NtQuerySection. */
+typedef struct _SECTION_IMAGE_INFORMATION
+{
+    PVOID TransferAddress;
+    ULONG ZeroBits;
+    SIZE_T MaximumStackSize;
+    SIZE_T CommittedStackSize;
+    ULONG SubSystemType;
+    union
+    {
+        struct
+        {
+            USHORT SubSystemMinorVersion;
+            USHORT SubSystemMajorVersion;
+        };
+        ULONG SubSystemVersion;
+    };
+    ULONG GpValue;
+    USHORT ImageCharacteristics;
+    USHORT DllCharacteristics;
+    USHORT Machine;
+    BOOLEAN ImageContainsCode;
+    union /**< Since Vista, used to be a spare BOOLEAN. */
+    {
+        struct
+        {
+            UCHAR ComPlusNativeRead : 1;
+            UCHAR ComPlusILOnly : 1;
+            UCHAR ImageDynamicallyRelocated : 1;
+            UCHAR ImageMAppedFlat : 1;
+            UCHAR Reserved : 4;
+        };
+        UCHAR ImageFlags;
+    };
+    ULONG LoaderFlags;
+    ULONG ImageFileSize; /**< Since XP? */
+    ULONG CheckSum; /**< Since Vista, Used to be a reserved/spare ULONG. */
+} SECTION_IMAGE_INFORMATION;
+typedef SECTION_IMAGE_INFORMATION *PSECTION_IMAGE_INFORMATION;
+
+typedef enum _SECTION_INFORMATION_CLASS
+{
+    SectionBasicInformation = 0,
+    SectionImageInformation,
+    MaxSectionInfoClass
+} SECTION_INFORMATION_CLASS;
+NTSYSAPI NTSTATUS NTAPI NtQuerySection(HANDLE, SECTION_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+
+NTSYSAPI NTSTATUS NTAPI NtQueryInformationThread(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
+
+#ifndef SEC_FILE
+# define SEC_FILE               UINT32_C(0x00800000)
+#endif
+#ifndef SEC_IMAGE
+# define SEC_IMAGE              UINT32_C(0x01000000)
+#endif
+#ifndef SEC_PROTECTED_IMAGE
+# define SEC_PROTECTED_IMAGE    UINT32_C(0x02000000)
+#endif
+#ifndef SEC_NOCACHE
+# define SEC_NOCACHE            UINT32_C(0x10000000)
+#endif
+#ifndef MEM_ROTATE
+# define MEM_ROTATE             UINT32_C(0x00800000)
+#endif
+typedef enum _MEMORY_INFORMATION_CLASS
+{
+    MemoryBasicInformation = 0,
+    MemoryWorkingSetList,
+    MemorySectionName,
+    MemoryBasicVlmInformation
+} MEMORY_INFORMATION_CLASS;
+#ifdef IN_RING0
+typedef struct _MEMORY_BASIC_INFORMATION
+{
+    PVOID BaseAddress;
+    PVOID AllocationBase;
+    ULONG AllocationProtect;
+    SIZE_T RegionSize;
+    ULONG State;
+    ULONG Protect;
+    ULONG Type;
+} MEMORY_BASIC_INFORMATION;
+typedef MEMORY_BASIC_INFORMATION *PMEMORY_BASIC_INFORMATION;
+# define NtQueryVirtualMemory ZwQueryVirtualMemory
+#endif
+NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(HANDLE, void const *, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+
+typedef enum _SYSTEM_INFORMATION_CLASS
+{
+    SystemBasicInformation = 0,
+    SystemCpuInformation,
+    SystemPerformanceInformation,
+    SystemTimeOfDayInformation,
+    SystemInformation_Unknown_4,
+    SystemProcessInformation,
+    SystemInformation_Unknown_6,
+    SystemInformation_Unknown_7,
+    SystemProcessorPerformanceInformation,
+    SystemInformation_Unknown_9,
+    SystemInformation_Unknown_10,
+    SystemModuleInformation,
+    SystemInformation_Unknown_12,
+    SystemInformation_Unknown_13,
+    SystemInformation_Unknown_14,
+    SystemInformation_Unknown_15,
+    SystemHandleInformation,
+    SystemInformation_Unknown_17,
+    SystemPageFileInformation,
+    SystemInformation_Unknown_19,
+    SystemInformation_Unknown_20,
+    SystemCacheInformation,
+    SystemInformation_Unknown_22,
+    SystemInterruptInformation,
+    SystemDpcBehaviourInformation,
+    SystemFullMemoryInformation,
+    SystemLoadGdiDriverInformation, /* 26 */
+    SystemUnloadGdiDriverInformation, /* 27 */
+    SystemTimeAdjustmentInformation,
+    SystemSummaryMemoryInformation,
+    SystemInformation_Unknown_30,
+    SystemInformation_Unknown_31,
+    SystemInformation_Unknown_32,
+    SystemExceptionInformation,
+    SystemCrashDumpStateInformation,
+    SystemKernelDebuggerInformation,
+    SystemContextSwitchInformation,
+    SystemRegistryQuotaInformation,
+    SystemInformation_Unknown_38,
+    SystemInformation_Unknown_39,
+    SystemInformation_Unknown_40,
+    SystemInformation_Unknown_41,
+    SystemInformation_Unknown_42,
+    SystemInformation_Unknown_43,
+    SystemCurrentTimeZoneInformation,
+    SystemLookasideInformation,
+    SystemSetTimeSlipEvent,
+    SystemCreateSession,
+    SystemDeleteSession,
+    SystemInformation_Unknown_49,
+    SystemRangeStartInformation,
+    SystemVerifierInformation,
+    SystemInformation_Unknown_52,
+    SystemSessionProcessInformation,
+    SystemLoadGdiDriverInSystemSpaceInformation, /* 54 */
+    SystemInformation_Unknown_55,
+    SystemInformation_Unknown_56,
+    SystemExtendedProcessInformation,
+    SystemInformation_Unknown_58,
+    SystemInformation_Unknown_59,
+    SystemInformation_Unknown_60,
+    SystemInformation_Unknown_61,
+    SystemInformation_Unknown_62,
+    SystemInformation_Unknown_63,
+    SystemExtendedHandleInformation, /* 64 */
+
+    /** @todo fill gap. they've added a whole bunch of things  */
+    SystemPolicyInformation = 134,
+    SystemInformationClassMax
+} SYSTEM_INFORMATION_CLASS;
+
+#ifdef IPRT_NT_USE_WINTERNL
+typedef struct _VM_COUNTERS
+{
+    SIZE_T PeakVirtualSize;
+    SIZE_T VirtualSize;
+    ULONG PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+} VM_COUNTERS;
+typedef VM_COUNTERS *PVM_COUNTERS;
+#endif
+
+#if 0
+typedef struct _IO_COUNTERS
+{
+    ULONGLONG ReadOperationCount;
+    ULONGLONG WriteOperationCount;
+    ULONGLONG OtherOperationCount;
+    ULONGLONG ReadTransferCount;
+    ULONGLONG WriteTransferCount;
+    ULONGLONG OtherTransferCount;
+} IO_COUNTERS;
+typedef IO_COUNTERS *PIO_COUNTERS;
+#endif
+
+typedef struct _RTNT_SYSTEM_PROCESS_INFORMATION
+{
+    ULONG NextEntryOffset;          /**< 0x00 / 0x00 */
+    ULONG NumberOfThreads;          /**< 0x04 / 0x04 */
+    LARGE_INTEGER Reserved1[3];     /**< 0x08 / 0x08 */
+    LARGE_INTEGER CreationTime;     /**< 0x20 / 0x20 */
+    LARGE_INTEGER UserTime;         /**< 0x28 / 0x28 */
+    LARGE_INTEGER KernelTime;       /**< 0x30 / 0x30 */
+    UNICODE_STRING ProcessName;     /**< 0x38 / 0x38 Clean unicode encoding? */
+    int32_t BasePriority;           /**< 0x40 / 0x48 */
+    HANDLE UniqueProcessId;         /**< 0x44 / 0x50 */
+    HANDLE ParentProcessId;         /**< 0x48 / 0x58 */
+    ULONG HandleCount;              /**< 0x4c / 0x60 */
+    ULONG Reserved2;                /**< 0x50 / 0x64 Session ID? */
+    ULONG_PTR Reserved3;            /**< 0x54 / 0x68 */
+    VM_COUNTERS VmCounters;         /**< 0x58 / 0x70 */
+    IO_COUNTERS IoCounters;         /**< 0x88 / 0xd0 Might not be present in earlier windows versions. */
+    /* After this follows the threads, then the ProcessName.Buffer. */
+} RTNT_SYSTEM_PROCESS_INFORMATION;
+typedef RTNT_SYSTEM_PROCESS_INFORMATION *PRTNT_SYSTEM_PROCESS_INFORMATION;
+#ifndef IPRT_NT_USE_WINTERNL
+typedef RTNT_SYSTEM_PROCESS_INFORMATION SYSTEM_PROCESS_INFORMATION ;
+typedef SYSTEM_PROCESS_INFORMATION *PSYSTEM_PROCESS_INFORMATION;
+#endif
+
+typedef struct _SYSTEM_HANDLE_ENTRY_INFO
+{
+    USHORT UniqueProcessId;
+    USHORT CreatorBackTraceIndex;
+    UCHAR ObjectTypeIndex;
+    UCHAR HandleAttributes;
+    USHORT HandleValue;
+    PVOID Object;
+    ULONG GrantedAccess;
+} SYSTEM_HANDLE_ENTRY_INFO;
+typedef SYSTEM_HANDLE_ENTRY_INFO *PSYSTEM_HANDLE_ENTRY_INFO;
+
+/** Returned by SystemHandleInformation  */
+typedef struct _SYSTEM_HANDLE_INFORMATION
+{
+    ULONG NumberOfHandles;
+    SYSTEM_HANDLE_ENTRY_INFO Handles[1];
+} SYSTEM_HANDLE_INFORMATION;
+typedef SYSTEM_HANDLE_INFORMATION *PSYSTEM_HANDLE_INFORMATION;
+
+/** Extended handle information entry.
+ * @remarks 3 x PVOID + 4 x ULONG = 28 bytes on 32-bit / 40 bytes on 64-bit  */
+typedef struct _SYSTEM_HANDLE_ENTRY_INFO_EX
+{
+    PVOID Object;
+    HANDLE UniqueProcessId;
+    HANDLE HandleValue;
+    ACCESS_MASK GrantedAccess;
+    USHORT CreatorBackTraceIndex;
+    USHORT ObjectTypeIndex;
+    ULONG HandleAttributes;
+    ULONG Reserved;
+} SYSTEM_HANDLE_ENTRY_INFO_EX;
+typedef SYSTEM_HANDLE_ENTRY_INFO_EX *PSYSTEM_HANDLE_ENTRY_INFO_EX;
+
+/** Returned by SystemExtendedHandleInformation.  */
+typedef struct _SYSTEM_HANDLE_INFORMATION_EX
+{
+    ULONG_PTR NumberOfHandles;
+    ULONG_PTR Reserved;
+    SYSTEM_HANDLE_ENTRY_INFO_EX Handles[1];
+} SYSTEM_HANDLE_INFORMATION_EX;
+typedef SYSTEM_HANDLE_INFORMATION_EX *PSYSTEM_HANDLE_INFORMATION_EX;
+
+/** Input to SystemSessionProcessInformation. */
+typedef struct _SYSTEM_SESSION_PROCESS_INFORMATION
+{
+    ULONG SessionId;
+    ULONG BufferLength;
+    /** Return buffer, SYSTEM_PROCESS_INFORMATION entries. */
+    PVOID Buffer;
+} SYSTEM_SESSION_PROCESS_INFORMATION;
+typedef SYSTEM_SESSION_PROCESS_INFORMATION *PSYSTEM_SESSION_PROCESS_INFORMATION;
+
+NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+
+NTSYSAPI NTSTATUS NTAPI NtDelayExecution(BOOLEAN, PLARGE_INTEGER);
+NTSYSAPI NTSTATUS NTAPI NtYieldExecution(void);
+
+NTSYSAPI NTSTATUS NTAPI RtlAddAccessDeniedAce(PACL, ULONG, ULONG, PSID);
+
+RT_C_DECLS_END
+/** @} */
+
+
+#if defined(IN_RING0) || defined(DOXYGEN_RUNNING)
+/** @name NT Kernel APIs
+ * @{ */
+NTSYSAPI BOOLEAN  NTAPI ObFindHandleForObject(PEPROCESS pProcess, PVOID pvObject, POBJECT_TYPE pObjectType,
+                                              PVOID pvOptionalConditions, PHANDLE phFound);
+NTSYSAPI NTSTATUS NTAPI ObReferenceObjectByName(PUNICODE_STRING pObjectPath, ULONG fAttributes, PACCESS_STATE pAccessState,
+                                                ACCESS_MASK fDesiredAccess, POBJECT_TYPE pObjectType,
+                                                KPROCESSOR_MODE enmAccessMode, PVOID pvParseContext, PVOID *ppvObject);
+NTSYSAPI HANDLE   NTAPI PsGetProcessInheritedFromUniqueProcessId(PEPROCESS);
+NTSYSAPI UCHAR *  NTAPI PsGetProcessImageFileName(PEPROCESS);
+NTSYSAPI BOOLEAN  NTAPI PsIsProcessBeingDebugged(PEPROCESS);
+NTSYSAPI ULONG    NTAPI PsGetProcessSessionId(PEPROCESS);
+extern DECLIMPORT(POBJECT_TYPE *) LpcPortObjectType;            /**< In vista+ this is the ALPC port object type. */
+extern DECLIMPORT(POBJECT_TYPE *) LpcWaitablePortObjectType;    /**< In vista+ this is the ALPC port object type. */
+
+/** @ */
+#endif /* IN_RING0 */
+
+#endif
+
diff --git a/include/iprt/process.h b/include/iprt/process.h
index 790470f..2760306 100644
--- a/include/iprt/process.h
+++ b/include/iprt/process.h
@@ -364,6 +364,15 @@ RTR3DECL(int)   RTProcDaemonizeUsingFork(bool fNoChDir, bool fNoClose, const cha
 RTR3DECL(bool)  RTProcIsRunningByName(const char *pszName);
 
 /**
+ * Queries the parent process ID.
+ *
+ * @returns IPRT status code
+ * @param   hProcess     The process to query the parent of.
+ * @param   phParent     Where to return the parent process ID.
+ */
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent);
+
+/**
  * Query the username of the given process.
  *
  * @returns IPRT status code.
diff --git a/include/iprt/sha.h b/include/iprt/sha.h
index ea89759..a6c7391 100644
--- a/include/iprt/sha.h
+++ b/include/iprt/sha.h
@@ -45,9 +45,13 @@ RT_C_DECLS_BEGIN
  */
 typedef union RTSHA1CONTEXT
 {
-    uint8_t abPadding[ARCH_BITS == 32 ? 96 : 128];
+    uint64_t                u64BetterAlignment;
+    uint8_t                 abPadding[8 + (5 + 80) * 4 + 4];
 #ifdef RT_SHA1_PRIVATE_CONTEXT
-    SHA_CTX Private;
+    SHA_CTX                 Private;
+#endif
+#ifdef RT_SHA1_PRIVATE_ALT_CONTEXT
+    RTSHA1ALTPRIVATECTX     AltPrivate;
 #endif
 } RTSHA1CONTEXT;
 /** Pointer to an SHA-1 context. */
@@ -138,6 +142,7 @@ RTR3DECL(int) RTSha1Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPR
 RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser);
 
 
+
 /** The size of a SHA-256 hash. */
 #define RTSHA256_HASH_SIZE      32
 /** The length of a SHA-256 digest string. The terminator is not included. */
@@ -148,9 +153,13 @@ RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRT
  */
 typedef union RTSHA256CONTEXT
 {
-    uint8_t abPadding[ARCH_BITS == 32 ? 112 : 160];
+    uint64_t                u64BetterAlignment;
+    uint8_t                 abPadding[8 + (8 + 80) * 4];
 #ifdef RT_SHA256_PRIVATE_CONTEXT
-    SHA256_CTX Private;
+    SHA256_CTX              Private;
+#endif
+#ifdef RT_SHA256_PRIVATE_ALT_CONTEXT
+    RTSHA256ALTPRIVATECTX   AltPrivate;
 #endif
 } RTSHA256CONTEXT;
 /** Pointer to an SHA-256 context. */
@@ -242,6 +251,104 @@ RTR3DECL(int) RTSha256Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRT
  */
 RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser);
 
+
+
+/** The size of a SHA-224 hash. */
+#define RTSHA224_HASH_SIZE      28
+/** The length of a SHA-224 digest string. The terminator is not included. */
+#define RTSHA224_DIGEST_LEN     56
+
+/** SHA-224 context (same as for SHA-256). */
+typedef RTSHA256CONTEXT RTSHA224CONTEXT;
+/** Pointer to an SHA-224 context. */
+typedef RTSHA256CONTEXT *PRTSHA224CONTEXT;
+
+/**
+ * Compute the SHA-224 hash of the data.
+ *
+ * @param   pvBuf       Pointer to the data.
+ * @param   cbBuf       The amount of data (in bytes).
+ * @param   pabDigest   Where to store the hash. (What is passed is a pointer to
+ *                      the caller's buffer.)
+ */
+RTDECL(void) RTSha224(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA224_HASH_SIZE]);
+
+/**
+ * Initializes the SHA-224 context.
+ *
+ * @param   pCtx        Pointer to the SHA-224 context.
+ */
+RTDECL(void) RTSha224Init(PRTSHA224CONTEXT pCtx);
+
+/**
+ * Feed data into the SHA-224 computation.
+ *
+ * @param   pCtx        Pointer to the SHA-224 context.
+ * @param   pvBuf       Pointer to the data.
+ * @param   cbBuf       The length of the data (in bytes).
+ */
+RTDECL(void) RTSha224Update(PRTSHA224CONTEXT pCtx, const void *pvBuf, size_t cbBuf);
+
+/**
+ * Compute the SHA-224 hash of the data.
+ *
+ * @param   pCtx        Pointer to the SHA-224 context.
+ * @param   pabDigest   Where to store the hash. (What is passed is a pointer to
+ *                      the caller's buffer.)
+ */
+RTDECL(void) RTSha224Final(PRTSHA224CONTEXT pCtx, uint8_t pabDigest[RTSHA224_HASH_SIZE]);
+
+/**
+ * Converts a SHA-224 hash to a digest string.
+ *
+ * @returns IPRT status code.
+ *
+ * @param   pabDigest   The binary digest returned by RTSha224Final or RTSha224.
+ * @param   pszDigest   Where to return the stringified digest.
+ * @param   cchDigest   The size of the output buffer. Should be at least
+ *                      RTSHA224_DIGEST_LEN + 1 bytes.
+ */
+RTDECL(int) RTSha224ToString(uint8_t const pabDigest[RTSHA224_HASH_SIZE], char *pszDigest, size_t cchDigest);
+
+/**
+ * Converts a SHA-224 hash to a digest string.
+ *
+ * @returns IPRT status code.
+ *
+ * @param   pszDigest   The stringified digest. Leading and trailing spaces are
+ *                      ignored.
+ * @param   pabDigest   Where to store the hash. (What is passed is a pointer to
+ *                      the caller's buffer.)
+ */
+RTDECL(int) RTSha224FromString(char const *pszDigest, uint8_t pabDigest[RTSHA224_HASH_SIZE]);
+
+/**
+ * Creates a SHA224 digest for the given memory buffer.
+ *
+ * @returns iprt status code.
+ *
+ * @param   pvBuf                 Memory buffer to create a SHA224 digest for.
+ * @param   cbBuf                 The amount of data (in bytes).
+ * @param   ppszDigest            On success the SHA224 digest.
+ * @param   pfnProgressCallback   optional callback for the progress indication
+ * @param   pvUser                user defined pointer for the callback
+ */
+RTR3DECL(int) RTSha224Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser);
+
+/**
+ * Creates a SHA224 digest for the given file.
+ *
+ * @returns iprt status code.
+ *
+ * @param   pszFile               Filename to create a SHA224 digest for.
+ * @param   ppszDigest            On success the SHA224 digest.
+ * @param   pfnProgressCallback   optional callback for the progress indication
+ * @param   pvUser                user defined pointer for the callback
+ */
+RTR3DECL(int) RTSha224DigestFromFile(const char *pszFile, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser);
+
+
+
 /** The size of a SHA-512 hash. */
 #define RTSHA512_HASH_SIZE      64
 /** The length of a SHA-512 digest string. The terminator is not included. */
@@ -252,9 +359,13 @@ RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFN
  */
 typedef union RTSHA512CONTEXT
 {
-    uint8_t abPadding[ARCH_BITS == 32 ? 216 : 256];
+    uint64_t                u64BetterAlignment;
+    uint8_t                 abPadding[16 + (80 + 8) * 8];
 #ifdef RT_SHA512_PRIVATE_CONTEXT
-    SHA512_CTX Private;
+    SHA512_CTX              Private;
+#endif
+#ifdef RT_SHA512_PRIVATE_ALT_CONTEXT
+    RTSHA512ALTPRIVATECTX   AltPrivate;
 #endif
 } RTSHA512CONTEXT;
 /** Pointer to an SHA-512 context. */
@@ -319,9 +430,44 @@ RTDECL(int) RTSha512ToString(uint8_t const pabDigest[RTSHA512_HASH_SIZE], char *
  */
 RTDECL(int) RTSha512FromString(char const *pszDigest, uint8_t pabDigest[RTSHA512_HASH_SIZE]);
 
+
+/** Macro for declaring the interface for a SHA-512 variation.
+ * @internal */
+#define RTSHA512_DECLARE_VARIANT(a_Name, a_UName) \
+    typedef RTSHA512CONTEXT RT_CONCAT3(RTSHA,a_UName,CONTEXT); \
+    typedef RTSHA512CONTEXT *RT_CONCAT3(PRTSHA,a_UName,CONTEXT); \
+    RTDECL(void) RT_CONCAT(RTSha,a_Name)(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RT_CONCAT3(RTSHA,a_UName,_HASH_SIZE)]); \
+    RTDECL(void) RT_CONCAT3(RTSha,a_Name,Init)(RT_CONCAT3(PRTSHA,a_UName,CONTEXT) pCtx); \
+    RTDECL(void) RT_CONCAT3(RTSha,a_Name,Update)(RT_CONCAT3(PRTSHA,a_UName,CONTEXT) pCtx, const void *pvBuf, size_t cbBuf); \
+    RTDECL(void) RT_CONCAT3(RTSha,a_Name,Final)(RT_CONCAT3(PRTSHA,a_UName,CONTEXT) pCtx, uint8_t pabDigest[RT_CONCAT3(RTSHA,a_UName,_HASH_SIZE)]); \
+    RTDECL(int)  RT_CONCAT3(RTSha,a_Name,ToString)(uint8_t const pabDigest[RT_CONCAT3(RTSHA,a_UName,_HASH_SIZE)], char *pszDigest, size_t cchDigest); \
+    RTDECL(int)  RT_CONCAT3(RTSha,a_Name,FromString)(char const *pszDigest, uint8_t pabDigest[RT_CONCAT3(RTSHA,a_UName,_HASH_SIZE)])
+
+
+/** The size of a SHA-384 hash. */
+#define RTSHA384_HASH_SIZE      48
+/** The length of a SHA-384 digest string. The terminator is not included. */
+#define RTSHA384_DIGEST_LEN     96
+RTSHA512_DECLARE_VARIANT(384,384);
+
+/** The size of a SHA-512/224 hash. */
+#define RTSHA512T224_HASH_SIZE  28
+/** The length of a SHA-512/224 digest string. The terminator is not
+ *  included. */
+#define RTSHA512T224_DIGEST_LEN 56
+RTSHA512_DECLARE_VARIANT(512t224,512T224);
+
+/** The size of a SHA-512/256 hash. */
+#define RTSHA512T256_HASH_SIZE  32
+/** The length of a SHA-512/256 digest string. The terminator is not
+ *  included. */
+#define RTSHA512T256_DIGEST_LEN 64
+RTSHA512_DECLARE_VARIANT(512t256,512T256);
+
+
 /** @} */
 
 RT_C_DECLS_END
 
-#endif /* ___iprt_sha1_h */
+#endif
 
diff --git a/include/iprt/stream.h b/include/iprt/stream.h
index 720d6d8..cba8a86 100644
--- a/include/iprt/stream.h
+++ b/include/iprt/stream.h
@@ -267,6 +267,15 @@ RTR3DECL(int) RTStrmPrintf(PRTSTREAM pStream, const char *pszFormat, ...);
 RTR3DECL(int) RTStrmPrintfV(PRTSTREAM pStream, const char *pszFormat, va_list args);
 
 /**
+ * Dumper vprintf-like function outputting to a stream.
+ *
+ * @param   pvUser          The stream to print to.  NULL means standard output.
+ * @param   pszFormat       Runtime format string.
+ * @param   va              Arguments specified by pszFormat.
+ */
+RTR3DECL(void) RTStrmDumpPrintfV(void *pvUser, const char *pszFormat, va_list va);
+
+/**
  * Prints a formatted string to the standard output stream (g_pStdOut).
  *
  * @returns Number of bytes printed.
diff --git a/include/iprt/string.h b/include/iprt/string.h
index 44d83f5..22a4097 100644
--- a/include/iprt/string.h
+++ b/include/iprt/string.h
@@ -3009,9 +3009,15 @@ RTDECL(int8_t) RTStrToInt8(const char *pszValue);
  * @param   cchBuf      The size of the output buffer.
  * @param   pv          Pointer to the bytes to stringify.
  * @param   cb          The number of bytes to stringify.
- * @param   fFlags      Must be zero, reserved for future use.
+ * @param   fFlags      Combination of RTSTRPRINTHEXBYTES_F_XXX values.
+ * @sa      RTUtf16PrintHexBytes.
  */
 RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags);
+/** @name RTSTRPRINTHEXBYTES_F_XXX - flags for RTStrPrintHexBytes and RTUtf16PritnHexBytes.
+ * @{ */
+/** Upper case hex digits, the default is lower case. */
+#define RTSTRPRINTHEXBYTES_F_UPPER      RT_BIT(0)
+/** @} */
 
 /**
  * Converts a string of hex bytes back into binary data.
@@ -3282,6 +3288,161 @@ RTDECL(int) RTUtf16DupExTag(PRTUTF16 *ppwszString, PCRTUTF16 pwszString, size_t
 RTDECL(size_t) RTUtf16Len(PCRTUTF16 pwszString);
 
 /**
+ * Find the length of a zero-terminated byte string, given a max string length.
+ *
+ * @returns The string length or cbMax. The returned length does not include
+ *          the zero terminator if it was found.
+ *
+ * @param   pwszString  The string.
+ * @param   cwcMax      The max string length in RTUTF16s.
+ * @sa      RTUtf16NLenEx, RTStrNLen.
+ */
+RTDECL(size_t) RTUtf16NLen(PCRTUTF16 pwszString, size_t cwcMax);
+
+/**
+ * Find the length of a zero-terminated byte string, given
+ * a max string length.
+ *
+ * @returns IPRT status code.
+ * @retval  VINF_SUCCESS if the string has a length less than cchMax.
+ * @retval  VERR_BUFFER_OVERFLOW if the end of the string wasn't found
+ *          before cwcMax was reached.
+ *
+ * @param   pwszString  The string.
+ * @param   cwcMax      The max string length in RTUTF16s.
+ * @param   pcwc        Where to store the string length excluding the
+ *                      terminator.  This is set to cwcMax if the terminator
+ *                      isn't found.
+ * @sa      RTUtf16NLen, RTStrNLenEx.
+ */
+RTDECL(int) RTUtf16NLenEx(PCRTUTF16 pwszString, size_t cwcMax, size_t *pcwc);
+
+/**
+ * Find the zero terminator in a string with a limited length.
+ *
+ * @returns Pointer to the zero terminator.
+ * @returns NULL if the zero terminator was not found.
+ *
+ * @param   pwszString  The string.
+ * @param   cwcMax      The max string length.  RTSTR_MAX is fine.
+ */
+RTDECL(PCRTUTF16) RTUtf16End(PCRTUTF16 pwszString, size_t cwcMax);
+
+/**
+ * Strips blankspaces from both ends of the string.
+ *
+ * @returns Pointer to first non-blank char in the string.
+ * @param   pwsz    The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16Strip(PRTUTF16 pwsz);
+
+/**
+ * Strips blankspaces from the start of the string.
+ *
+ * @returns Pointer to first non-blank char in the string.
+ * @param   pwsz    The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16StripL(PCRTUTF16 pwsz);
+
+/**
+ * Strips blankspaces from the end of the string.
+ *
+ * @returns pwsz.
+ * @param   pwsz    The string to strip.
+ */
+RTDECL(PRTUTF16) RTUtf16StripR(PRTUTF16 pwsz);
+
+/**
+ * String copy with overflow handling.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pwszDst             The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pwszSrc             The source string.  NULL is not OK.
+ */
+RTDECL(int) RTUtf16Copy(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc);
+
+/**
+ * String copy with overflow handling, ASCII source.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pwszDst             The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pszSrc              The source string, pure ASCII.  NULL is not OK.
+ */
+RTDECL(int) RTUtf16CopyAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc);
+
+/**
+ * String copy with overflow handling.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pwszDst             The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pwszSrc             The source string.  NULL is not OK.
+ * @param   cwcSrcMax           The maximum number of chars (not code points) to
+ *                              copy from the source string, not counting the
+ *                              terminator as usual.
+ */
+RTDECL(int) RTUtf16CopyEx(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc, size_t cwcSrcMax);
+
+/**
+ * String concatenation with overflow handling.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pszDst              The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pwszSrc             The source string.  NULL is not OK.
+ */
+RTDECL(int) RTUtf16Cat(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc);
+
+/**
+ * String concatenation with overflow handling, ASCII source.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pszDst              The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pszSrc              The source string, pure ASCII.  NULL is not OK.
+ */
+RTDECL(int) RTUtf16CatAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pwszSrc);
+
+/**
+ * String concatenation with overflow handling.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_BUFFER_OVERFLOW if the destination buffer is too small.  The
+ *          buffer will contain as much of the string as it can hold, fully
+ *          terminated.
+ *
+ * @param   pwszDst             The destination buffer.
+ * @param   cwcDst              The size of the destination buffer in RTUTF16s.
+ * @param   pwszSrc             The source string.  NULL is not OK.
+ * @param   cwcSrcMax           The maximum number of UTF-16 chars (not code
+ *                              points) to copy from the source string, not
+ *                              counting the terminator as usual.
+ */
+RTDECL(int) RTUtf16CatEx(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc, size_t cwcSrcMax);
+
+/**
  * Performs a case sensitive string compare between two UTF-16 strings.
  *
  * @returns < 0 if the first string less than the second string.s
@@ -3291,7 +3452,20 @@ RTDECL(size_t) RTUtf16Len(PCRTUTF16 pwszString);
  * @param   pwsz2       Second UTF-16 string. Null is allowed.
  * @remark  This function will not make any attempt to validate the encoding.
  */
-RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2);
+RTDECL(int) RTUtf16Cmp(PCRTUTF16 pwsz1, PCRTUTF16 pwsz2);
+
+/**
+ * Performs a case sensitive string compare between an UTF-16 string and a pure
+ * ASCII string.
+ *
+ * @returns < 0 if the first string less than the second string.s
+ * @returns 0 if the first string identical to the second string.
+ * @returns > 0 if the first string greater than the second string.
+ * @param   pwsz1       First UTF-16 string. Null is allowed.
+ * @param   psz2        Second string, pure ASCII. Null is allowed.
+ * @remark  This function will not make any attempt to validate the encoding.
+ */
+RTDECL(int) RTUtf16CmpAscii(PCRTUTF16 pwsz1, const char *psz2);
 
 /**
  * Performs a case insensitive string compare between two UTF-16 strings.
@@ -3309,6 +3483,21 @@ RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2);
 RTDECL(int) RTUtf16ICmp(PCRTUTF16 pwsz1, PCRTUTF16 pwsz2);
 
 /**
+ * Performs a case insensitive string compare between an UTF-16 string and an
+ * pure ASCII string.
+ *
+ * Since this compare only takes cares about the first 128 codepoints in
+ * unicode, no tables are needed and there aren't any real complications.
+ *
+ * @returns < 0 if the first string less than the second string.
+ * @returns 0 if the first string identical to the second string.
+ * @returns > 0 if the first string greater than the second string.
+ * @param   pwsz1       First UTF-16 string. Null is allowed.
+ * @param   psz2        Second string, pure ASCII. Null is allowed.
+ */
+RTDECL(int) RTUtf16ICmpAscii(PCRTUTF16 pwsz1, const char *psz2);
+
+/**
  * Performs a case insensitive string compare between two UTF-16 strings
  * using the current locale of the process (if applicable).
  *
@@ -3803,6 +3992,24 @@ DECLINLINE(bool) RTUtf16IsSurrogatePair(RTUTF16 wcHigh, RTUTF16 wcLow)
         && RTUtf16IsLowSurrogate(wcLow);
 }
 
+/**
+ * Formats a buffer stream as hex bytes.
+ *
+ * The default is no separating spaces or line breaks or anything.
+ *
+ * @returns IPRT status code.
+ * @retval  VERR_INVALID_POINTER if any of the pointers are wrong.
+ * @retval  VERR_BUFFER_OVERFLOW if the buffer is insufficent to hold the bytes.
+ *
+ * @param   pwszBuf     Output string buffer.
+ * @param   cwcBuf      The size of the output buffer in RTUTF16 units.
+ * @param   pv          Pointer to the bytes to stringify.
+ * @param   cb          The number of bytes to stringify.
+ * @param   fFlags      Combination of RTSTRPRINTHEXBYTES_F_XXX values.
+ * @sa      RTStrPrintHexBytes.
+ */
+RTDECL(int) RTUtf16PrintHexBytes(PRTUTF16 pwszBuf, size_t cwcBuf, void const *pv, size_t cb, uint32_t fFlags);
+
 /** @} */
 
 
@@ -3917,6 +4124,12 @@ RTDECL(int) RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
 
 /** @} */
 
+#ifndef ___iprt_nocrt_string_h
+# if defined(RT_OS_WINDOWS)
+RTDECL(void *) mempcpy(void *pvDst, const void *pvSrc, size_t cb);
+# endif
+#endif
+
 
 RT_C_DECLS_END
 
diff --git a/include/iprt/time.h b/include/iprt/time.h
index 2981d9d..a0021ba 100644
--- a/include/iprt/time.h
+++ b/include/iprt/time.h
@@ -513,6 +513,23 @@ DECLINLINE(bool) RTTimeSpecIsEqual(PCRTTIMESPEC pTime1, PCRTTIMESPEC pTime2)
     return pTime1->i64NanosecondsRelativeToUnixEpoch == pTime2->i64NanosecondsRelativeToUnixEpoch;
 }
 
+
+/**
+ * Compare two time specs.
+ *
+ * @returns 0 if equal, -1 if @a pLeft is smaller, 1 if @a pLeft is larger.
+ * @returns false they are not equal.
+ * @param   pLeft       The 1st time spec.
+ * @param   pRight      The 2nd time spec.
+ */
+DECLINLINE(int) RTTimeSpecCompare(PCRTTIMESPEC pLeft, PCRTTIMESPEC pRight)
+{
+    if (pLeft->i64NanosecondsRelativeToUnixEpoch == pRight->i64NanosecondsRelativeToUnixEpoch)
+        return 0;
+    return pLeft->i64NanosecondsRelativeToUnixEpoch < pRight->i64NanosecondsRelativeToUnixEpoch ? -1 : 1;
+}
+
+
 /**
  * Converts a time spec to a ISO date string.
  *
diff --git a/include/iprt/types.h b/include/iprt/types.h
index 3c88ec2..4ff8947 100644
--- a/include/iprt/types.h
+++ b/include/iprt/types.h
@@ -28,6 +28,7 @@
 
 #include <iprt/cdefs.h>
 #include <iprt/stdint.h>
+#include <iprt/stdarg.h>
 
 /*
  * Include standard C types.
@@ -735,129 +736,6 @@ typedef struct RTTIMESPEC  *PRTTIMESPEC;
 /** Pointer to a const time spec structure. */
 typedef const struct RTTIMESPEC *PCRTTIMESPEC;
 
-/**
- * Generic pointer union.
- */
-typedef union RTPTRUNION
-{
-    /** Pointer into the void... */
-    void                   *pv;
-    /** Pointer to char value. */
-    char                   *pch;
-    /** Pointer to char value. */
-    unsigned char          *puch;
-    /** Pointer to a int value. */
-    int                    *pi;
-    /** Pointer to a unsigned int value. */
-    unsigned int           *pu;
-    /** Pointer to a long value. */
-    long                   *pl;
-    /** Pointer to a long value. */
-    unsigned long          *pul;
-    /** Pointer to a 8-bit unsigned value. */
-    uint8_t                *pu8;
-    /** Pointer to a 16-bit unsigned value. */
-    uint16_t               *pu16;
-    /** Pointer to a 32-bit unsigned value. */
-    uint32_t               *pu32;
-    /** Pointer to a 64-bit unsigned value. */
-    uint64_t               *pu64;
-} RTPTRUNION;
-/** Pointer to a pointer union. */
-typedef RTPTRUNION *PRTPTRUNION;
-
-/**
- * Generic const pointer union.
- */
-typedef union RTCPTRUNION
-{
-    /** Pointer into the void... */
-    void const             *pv;
-    /** Pointer to char value. */
-    char const             *pch;
-    /** Pointer to char value. */
-    unsigned char const    *puch;
-    /** Pointer to a int value. */
-    int const              *pi;
-    /** Pointer to a unsigned int value. */
-    unsigned int const     *pu;
-    /** Pointer to a long value. */
-    long const             *pl;
-    /** Pointer to a long value. */
-    unsigned long const    *pul;
-    /** Pointer to a 8-bit unsigned value. */
-    uint8_t const          *pu8;
-    /** Pointer to a 16-bit unsigned value. */
-    uint16_t const         *pu16;
-    /** Pointer to a 32-bit unsigned value. */
-    uint32_t const         *pu32;
-    /** Pointer to a 64-bit unsigned value. */
-    uint64_t const         *pu64;
-} RTCPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTCPTRUNION *PRTCPTRUNION;
-
-/**
- * Generic volatile pointer union.
- */
-typedef union RTVPTRUNION
-{
-    /** Pointer into the void... */
-    void volatile          *pv;
-    /** Pointer to char value. */
-    char volatile          *pch;
-    /** Pointer to char value. */
-    unsigned char volatile *puch;
-    /** Pointer to a int value. */
-    int volatile           *pi;
-    /** Pointer to a unsigned int value. */
-    unsigned int volatile  *pu;
-    /** Pointer to a long value. */
-    long volatile          *pl;
-    /** Pointer to a long value. */
-    unsigned long volatile *pul;
-    /** Pointer to a 8-bit unsigned value. */
-    uint8_t volatile       *pu8;
-    /** Pointer to a 16-bit unsigned value. */
-    uint16_t volatile      *pu16;
-    /** Pointer to a 32-bit unsigned value. */
-    uint32_t volatile      *pu32;
-    /** Pointer to a 64-bit unsigned value. */
-    uint64_t volatile      *pu64;
-} RTVPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTVPTRUNION *PRTVPTRUNION;
-
-/**
- * Generic const volatile pointer union.
- */
-typedef union RTCVPTRUNION
-{
-    /** Pointer into the void... */
-    void const volatile            *pv;
-    /** Pointer to char value. */
-    char const volatile            *pch;
-    /** Pointer to char value. */
-    unsigned char const volatile   *puch;
-    /** Pointer to a int value. */
-    int const volatile             *pi;
-    /** Pointer to a unsigned int value. */
-    unsigned int const volatile    *pu;
-    /** Pointer to a long value. */
-    long const volatile            *pl;
-    /** Pointer to a long value. */
-    unsigned long const volatile   *pul;
-    /** Pointer to a 8-bit unsigned value. */
-    uint8_t const volatile         *pu8;
-    /** Pointer to a 16-bit unsigned value. */
-    uint16_t const volatile        *pu16;
-    /** Pointer to a 32-bit unsigned value. */
-    uint32_t const volatile        *pu32;
-    /** Pointer to a 64-bit unsigned value. */
-    uint64_t const volatile        *pu64;
-} RTCVPTRUNION;
-/** Pointer to a const pointer union. */
-typedef RTCVPTRUNION *PRTCVPTRUNION;
 
 
 /** @defgroup grp_rt_types_both  Common Guest and Host Context Basic Types
@@ -1636,6 +1514,13 @@ typedef RTCCINTREG const       *PCRTCCINTREG;
 /** @} */
 
 
+
+/** Pointer to a big integer number. */
+typedef struct RTBIGNUM                            *PRTBIGNUM;
+/** Pointer to a const big integer number. */
+typedef struct RTBIGNUM const                      *PCRTBIGNUM;
+
+
 /** Pointer to a critical section. */
 typedef struct RTCRITSECT                          *PRTCRITSECT;
 /** Pointer to a const critical section. */
@@ -1654,6 +1539,44 @@ typedef RTCONDVAR                                  *PRTCONDVAR;
 /** Nil condition variable handle. */
 #define NIL_RTCONDVAR                               0
 
+/** Cryptographic (certificate) store handle. */
+typedef R3R0PTRTYPE(struct RTCRSTOREINT *)          RTCRSTORE;
+/** Pointer to a Cryptographic (certificate) store handle. */
+typedef RTCRSTORE                                  *PRTCRSTORE;
+/** Nil Cryptographic (certificate) store handle. */
+#define NIL_RTCRSTORE                               0
+
+/** Pointer to a const (store) certificate context. */
+typedef struct RTCRCERTCTX const                   *PCRTCRCERTCTX;
+
+/** Cryptographic message digest handle. */
+typedef R3R0PTRTYPE(struct RTCRDIGESTINT *)         RTCRDIGEST;
+/** Pointer to a cryptographic message digest handle. */
+typedef RTCRDIGEST                                 *PRTCRDIGEST;
+/** NIL cryptographic message digest handle. */
+#define NIL_RTCRDIGEST                              (0)
+
+/** Public key encryption schema handle. */
+typedef R3R0PTRTYPE(struct RTCRPKIXENCRYPTIONINT *) RTCRPKIXENCRYPTION;
+/** Pointer to a public key encryption schema handle. */
+typedef RTCRPKIXENCRYPTION                         *PRTCRPKIXENCRYPTION;
+/** NIL publick key encryption schema handle */
+#define NIL_RTCRPKIXENCRYPTION                      (0)
+
+/** Public key signature schema handle. */
+typedef R3R0PTRTYPE(struct RTCRPKIXSIGNATUREINT *)  RTCRPKIXSIGNATURE;
+/** Pointer to a public key signature schema handle. */
+typedef RTCRPKIXSIGNATURE                          *PRTCRPKIXSIGNATURE;
+/** NIL publick key signature schema handle */
+#define NIL_RTCRPKIXSIGNATURE                       (0)
+
+/** X.509 certificate paths builder & validator handle. */
+typedef R3R0PTRTYPE(struct RTCRX509CERTPATHSINT *)  RTCRX509CERTPATHS;
+/** Pointer to a certificate paths builder & validator handle. */
+typedef RTCRX509CERTPATHS                          *PRTCRX509CERTPATHS;
+/** Nil certificate paths builder & validator handle. */
+#define NIL_RTCRX509CERTPATHS                       0
+
 /** File handle. */
 typedef R3R0PTRTYPE(struct RTFILEINT *)             RTFILE;
 /** Pointer to file handle. */
@@ -1676,7 +1599,7 @@ typedef RTFILEAIOCTX                               *PRTFILEAIOCTX;
 #define NIL_RTFILEAIOCTX                            0
 
 /** Loader module handle. */
-typedef R3PTRTYPE(struct RTLDRMODINTERNAL *)        RTLDRMOD;
+typedef R3R0PTRTYPE(struct RTLDRMODINTERNAL *)      RTLDRMOD;
 /** Pointer to a loader module handle. */
 typedef RTLDRMOD                                   *PRTLDRMOD;
 /** Nil loader module handle. */
@@ -2253,6 +2176,17 @@ typedef DECLCALLBACK(int) FNRTPROGRESS(unsigned uPrecentage, void *pvUser);
 /** Pointer to a generic progress callback function, FNRTPROCESS(). */
 typedef FNRTPROGRESS *PFNRTPROGRESS;
 
+/**
+ * Generic vprintf-like callback function for dumpers.
+ *
+ * @param   pvUser          User argument.
+ * @param   pszFormat       The format string.
+ * @param   va              Arguments for the format string.
+ */
+typedef DECLCALLBACK(void) FNRTDUMPPRINTFV(void *pvUser, const char *pszFormat, va_list va);
+/** Pointer to a generic printf-like function for dumping. */
+typedef FNRTDUMPPRINTFV *PFNRTDUMPPRINTFV;
+
 
 /**
  * A point in a two dimentional coordinate system.
@@ -2385,6 +2319,45 @@ typedef struct RTLOCKVALSRCPOS const   *PCRTLOCKVALSRCPOS;
 
 
 /**
+ * Digest types.
+ */
+typedef enum RTDIGESTTYPE
+{
+    /** Invalid digest value.  */
+    RTDIGESTTYPE_INVALID = 0,
+    /** Unknown digest type. */
+    RTDIGESTTYPE_UNKNOWN,
+    /** CRC32 checksum. */
+    RTDIGESTTYPE_CRC32,
+    /** CRC64 checksum. */
+    RTDIGESTTYPE_CRC64,
+    /** MD2 checksum (unsafe!). */
+    RTDIGESTTYPE_MD2,
+    /** MD4 checksum (unsafe!!). */
+    RTDIGESTTYPE_MD4,
+    /** MD5 checksum (unsafe!). */
+    RTDIGESTTYPE_MD5,
+    /** SHA-1 checksum (unsafe!). */
+    RTDIGESTTYPE_SHA1,
+    /** SHA-224 checksum. */
+    RTDIGESTTYPE_SHA224,
+    /** SHA-256 checksum. */
+    RTDIGESTTYPE_SHA256,
+    /** SHA-384 checksum. */
+    RTDIGESTTYPE_SHA384,
+    /** SHA-512 checksum. */
+    RTDIGESTTYPE_SHA512,
+    /** SHA-512/224 checksum. */
+    RTDIGESTTYPE_SHA512T224,
+    /** SHA-512/256 checksum. */
+    RTDIGESTTYPE_SHA512T256,
+    /** End of valid types. */
+    RTDIGESTTYPE_END,
+    /** Usual 32-bit type blowup. */
+    RTDIGESTTYPE_32BIT_HACK = 0x7fffffff
+} RTDIGESTTYPE;
+
+/**
  * Process exit codes.
  */
 typedef enum RTEXITCODE
@@ -2421,6 +2394,165 @@ typedef RTRANGE *PRTRANGE;
 /** Pointer to a readonly range descriptor. */
 typedef const RTRANGE *PCRTRANGE;
 
+
+/**
+ * Generic pointer union.
+ */
+typedef union RTPTRUNION
+{
+    /** Pointer into the void... */
+    void                   *pv;
+    /** As a signed integer. */
+    intptr_t                i;
+    /** As an unsigned integer. */
+    intptr_t                u;
+    /** Pointer to char value. */
+    char                   *pch;
+    /** Pointer to char value. */
+    unsigned char          *puch;
+    /** Pointer to a int value. */
+    int                    *pi;
+    /** Pointer to a unsigned int value. */
+    unsigned int           *pu;
+    /** Pointer to a long value. */
+    long                   *pl;
+    /** Pointer to a long value. */
+    unsigned long          *pul;
+    /** Pointer to a 8-bit unsigned value. */
+    uint8_t                *pu8;
+    /** Pointer to a 16-bit unsigned value. */
+    uint16_t               *pu16;
+    /** Pointer to a 32-bit unsigned value. */
+    uint32_t               *pu32;
+    /** Pointer to a 64-bit unsigned value. */
+    uint64_t               *pu64;
+    /** Pointer to a UTF-16 character. */
+    PRTUTF16                pwc;
+    /** Pointer to a UUID character. */
+    PRTUUID                 pUuid;
+} RTPTRUNION;
+/** Pointer to a pointer union. */
+typedef RTPTRUNION *PRTPTRUNION;
+
+/**
+ * Generic const pointer union.
+ */
+typedef union RTCPTRUNION
+{
+    /** Pointer into the void... */
+    void const             *pv;
+    /** As a signed integer. */
+    intptr_t                i;
+    /** As an unsigned integer. */
+    intptr_t                u;
+    /** Pointer to char value. */
+    char const             *pch;
+    /** Pointer to char value. */
+    unsigned char const    *puch;
+    /** Pointer to a int value. */
+    int const              *pi;
+    /** Pointer to a unsigned int value. */
+    unsigned int const     *pu;
+    /** Pointer to a long value. */
+    long const             *pl;
+    /** Pointer to a long value. */
+    unsigned long const    *pul;
+    /** Pointer to a 8-bit unsigned value. */
+    uint8_t const          *pu8;
+    /** Pointer to a 16-bit unsigned value. */
+    uint16_t const         *pu16;
+    /** Pointer to a 32-bit unsigned value. */
+    uint32_t const         *pu32;
+    /** Pointer to a 64-bit unsigned value. */
+    uint64_t const         *pu64;
+    /** Pointer to a UTF-16 character. */
+    PCRTUTF16               pwc;
+    /** Pointer to a UUID character. */
+    PCRTUUID                pUuid;
+} RTCPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTCPTRUNION *PRTCPTRUNION;
+
+/**
+ * Generic volatile pointer union.
+ */
+typedef union RTVPTRUNION
+{
+    /** Pointer into the void... */
+    void volatile          *pv;
+    /** As a signed integer. */
+    intptr_t                i;
+    /** As an unsigned integer. */
+    intptr_t                u;
+    /** Pointer to char value. */
+    char volatile          *pch;
+    /** Pointer to char value. */
+    unsigned char volatile *puch;
+    /** Pointer to a int value. */
+    int volatile           *pi;
+    /** Pointer to a unsigned int value. */
+    unsigned int volatile  *pu;
+    /** Pointer to a long value. */
+    long volatile          *pl;
+    /** Pointer to a long value. */
+    unsigned long volatile *pul;
+    /** Pointer to a 8-bit unsigned value. */
+    uint8_t volatile       *pu8;
+    /** Pointer to a 16-bit unsigned value. */
+    uint16_t volatile      *pu16;
+    /** Pointer to a 32-bit unsigned value. */
+    uint32_t volatile      *pu32;
+    /** Pointer to a 64-bit unsigned value. */
+    uint64_t volatile      *pu64;
+    /** Pointer to a UTF-16 character. */
+    RTUTF16 volatile       *pwc;
+    /** Pointer to a UUID character. */
+    RTUUID volatile        *pUuid;
+} RTVPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTVPTRUNION *PRTVPTRUNION;
+
+/**
+ * Generic const volatile pointer union.
+ */
+typedef union RTCVPTRUNION
+{
+    /** Pointer into the void... */
+    void const volatile            *pv;
+    /** As a signed integer. */
+    intptr_t                        i;
+    /** As an unsigned integer. */
+    intptr_t                        u;
+    /** Pointer to char value. */
+    char const volatile            *pch;
+    /** Pointer to char value. */
+    unsigned char const volatile   *puch;
+    /** Pointer to a int value. */
+    int const volatile             *pi;
+    /** Pointer to a unsigned int value. */
+    unsigned int const volatile    *pu;
+    /** Pointer to a long value. */
+    long const volatile            *pl;
+    /** Pointer to a long value. */
+    unsigned long const volatile   *pul;
+    /** Pointer to a 8-bit unsigned value. */
+    uint8_t const volatile         *pu8;
+    /** Pointer to a 16-bit unsigned value. */
+    uint16_t const volatile        *pu16;
+    /** Pointer to a 32-bit unsigned value. */
+    uint32_t const volatile        *pu32;
+    /** Pointer to a 64-bit unsigned value. */
+    uint64_t const volatile        *pu64;
+    /** Pointer to a UTF-16 character. */
+    RTUTF16 const volatile         *pwc;
+    /** Pointer to a UUID character. */
+    RTUUID const volatile          *pUuid;
+} RTCVPTRUNION;
+/** Pointer to a const pointer union. */
+typedef RTCVPTRUNION *PRTCVPTRUNION;
+
+
+
 #ifdef __cplusplus
 /**
  * Strict type validation helper class.
diff --git a/include/iprt/uni.h b/include/iprt/uni.h
index a1161db..0ffdc63 100644
--- a/include/iprt/uni.h
+++ b/include/iprt/uni.h
@@ -417,6 +417,59 @@ DECLINLINE(RTUNICP) RTUniCpToLower(RTUNICP CodePoint)
 RTDECL(void) RTUniFree(PRTUNICP pusz);
 
 
+/**
+ * Checks if a code point valid.
+ *
+ * Any code point (defined or not) within the 17 unicode planes (0 thru 16),
+ * except surrogates will be considered valid code points by this function.
+ *
+ * @returns true if in range, false if not.
+ * @param   CodePoint       The unicode code point to validate.
+ */
+DECLINLINE(bool) RTUniCpIsValid(RTUNICP CodePoint)
+{
+    return CodePoint <= 0x00d7ff
+        || (   CodePoint <= 0x10ffff
+            && CodePoint >= 0x00e000);
+}
+
+
+/**
+ * Checks if the given code point is in the BMP range.
+ *
+ * Surrogates are not considered in the BMP range by this function.
+ *
+ * @returns true if in BMP, false if not.
+ * @param   CodePoint       The unicode code point to consider.
+ */
+DECLINLINE(bool) RTUniCpIsBMP(RTUNICP CodePoint)
+{
+    return CodePoint <= 0xd7ff
+        || (   CodePoint <= 0xffff
+            && CodePoint >= 0xe000);
+}
+
+
+/**
+ * Folds a unicode code point to lower case.
+ *
+ * @returns Folded code point.
+ * @param   CodePoint       The unicode code point to fold.
+ */
+DECLINLINE(size_t) RTUniCpCalcUtf8Len(RTUNICP CodePoint)
+{
+    if (CodePoint < 0x80)
+        return 1;
+    return 2
+        + (CodePoint >= 0x00000800)
+        + (CodePoint >= 0x00010000)
+        + (CodePoint >= 0x00200000)
+        + (CodePoint >= 0x04000000)
+        + (CodePoint >= 0x80000000) /* illegal */;
+}
+
+
+
 RT_C_DECLS_END
 /** @} */
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/include/iprt/zero.h
similarity index 53%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to include/iprt/zero.h
index 35b6d89..e743b39 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/include/iprt/zero.h
@@ -1,10 +1,9 @@
-/* $Id: SUPInstall.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Zero Memory.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +23,32 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#ifndef ___iprt_zero_h
+#define ___iprt_zero_h
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+
+#include <iprt/cdefs.h>
+#include <iprt/types.h>
+#include <iprt/param.h>
+
+
+RT_C_DECLS_BEGIN
+
+/** @defgroup grp_rt_zero    RTZero - Zeroed Memory Objects
+ * @ingroup grp_rt
+ * @{
+ */
+
+extern RTDATADECL(uint8_t const)   g_abRTZeroPage[PAGE_SIZE];
+extern RTDATADECL(uint8_t const)   g_abRTZero4K[_4K];
+extern RTDATADECL(uint8_t const)   g_abRTZero8K[_8K];
+extern RTDATADECL(uint8_t const)   g_abRTZero16K[_16K];
+extern RTDATADECL(uint8_t const)   g_abRTZero32K[_32K];
+extern RTDATADECL(uint8_t const)   g_abRTZero64K[_64K];
+
+/** @} */
+
+RT_C_DECLS_END
+
+#endif
 
diff --git a/include/iprt/zip.h b/include/iprt/zip.h
index 83ab92f..4e30293 100644
--- a/include/iprt/zip.h
+++ b/include/iprt/zip.h
@@ -85,6 +85,8 @@ typedef enum RTZIPTYPE
     RTZIPTYPE_LZJB,
     /** Lempel-Ziv-Oberhumer compression. */
     RTZIPTYPE_LZO,
+    /* Zlib compression the data without zlib header. */
+    RTZIPTYPE_ZLIB_NO_HEADER,
     /** End of valid the valid compression types.  */
     RTZIPTYPE_END
 } RTZIPTYPE;
@@ -216,6 +218,21 @@ RTDECL(int)     RTZipBlockDecompress(RTZIPTYPE enmType, uint32_t fFlags,
 
 
 /**
+ * Opens a zip decompression I/O stream.
+ *
+ * @returns IPRT status code.
+ *
+ * @param   hVfsIosIn           The compressed input stream (must be readable).
+ *                              The reference is not consumed, instead another
+ *                              one is retained.
+ * @param   fFlags              Flags, MBZ.
+ * @param   phVfsIosUnzip       Where to return the handle to the gunzipped I/O
+ *                              stream (read).
+ */
+RTDECL(int) RTZipDecompressIoStream(RTVFSIOSTREAM hVfsIosIn, uint32_t fFlags, PRTVFSIOSTREAM phVfsIosUnzip);
+
+
+/**
  * Opens a gzip decompression I/O stream.
  *
  * @returns IPRT status code.
@@ -278,6 +295,47 @@ RTDECL(int) RTZipTarFsStreamFromIoStream(RTVFSIOSTREAM hVfsIosIn, uint32_t fFlag
 RTDECL(RTEXITCODE) RTZipTarCmd(unsigned cArgs, char **papszArgs);
 
 /**
+ * Opens a ZIP filesystem stream.
+ *
+ * This is used to extract, list or check a ZIP archive.
+ *
+ * @returns IPRT status code.
+ *
+ * @param   hVfsIosIn           The compressed input stream.  The reference is
+ *                              not consumed, instead another one is retained.
+ * @param   fFlags              Flags, MBZ.
+ * @param   phVfsFss            Where to return the handle to the TAR
+ *                              filesystem stream.
+ */
+RTDECL(int) RTZipPkzipFsStreamFromIoStream(RTVFSIOSTREAM hVfsIosIn, uint32_t fFlags, PRTVFSFSSTREAM phVfsFss);
+
+/**
+ * A mini UNZIP program.
+ *
+ * @returns Program exit code.
+ * @
+ * @param   cArgs               The number of arguments.
+ * @param   papszArgs           The argument vector.  (Note that this may be
+ *                              reordered, so the memory must be writable.)
+ */
+RTDECL(RTEXITCODE) RTZipUnzipCmd(unsigned cArgs, char **papszArgs);
+
+/**
+ * Helper for decompressing files of a ZIP file located in memory.
+ *
+ * @returns IPRT status code.
+ *
+ * @param   ppvDst              Where to store the pointer to the allocated
+ *                              buffer. To be freed with RTMemFree().
+ * @param   pcbDst              Where to store the pointer to the size of the
+ *                              allocated buffer.
+ * @param   pvSrc               Pointer to the buffer containing the .zip file.
+ * @param   cbSrc               Size of the buffer containing the .zip file.
+ * @param   pszObject           Name of the object to extract.
+ */
+RTDECL(int) RTZipPkzipMemDecompress(void **ppvDst, size_t *pcbDst, const void *pvSrc, size_t cbSrc, const char *pszObject);
+
+/**
  * Opens a XAR filesystem stream.
  *
  * This is used to extract, list or check a XAR archive.
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp
index 190418b..d757072 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceAutoMount.cpp
@@ -275,7 +275,8 @@ static int VBoxServiceAutoMountSharedFolder(const char *pszShareName, const char
         int flags = 0;
         if (pOpts->ronly)
             flags |= MS_RDONLY;
-        RTStrPrintf(achOptBuf, sizeof(achOptBuf), "uid=%d,gid=%d", pOpts->uid, pOpts->gid);
+        RTStrPrintf(achOptBuf, sizeof(achOptBuf), "uid=%d,gid=%d,dmode=%0o,fmode=%0o,dmask=%0o,fmask=%0o",
+                    pOpts->uid, pOpts->gid, pOpts->dmode, pOpts->fmode, pOpts->dmask, pOpts->fmask);
         int r = mount(pszShareName,
                       pszMountPoint,
                       flags | MS_OPTIONSTR,
diff --git a/src/VBox/Additions/common/crOpenGL/context.c b/src/VBox/Additions/common/crOpenGL/context.c
index 6c6e4b9..3b0af50 100644
--- a/src/VBox/Additions/common/crOpenGL/context.c
+++ b/src/VBox/Additions/common/crOpenGL/context.c
@@ -109,10 +109,18 @@ void stubForcedFlush(GLint con)
 
 void stubConChromiumParameteriCR(GLint con, GLenum param, GLint value)
 {
-    if (con)
+//    if (con)
         stub.spu->dispatch_table.VBoxConChromiumParameteriCR(con, param, value);
-    else
-        crError("VBoxConChromiumParameteriCR called with null connection");
+//    else
+//        crError("VBoxConChromiumParameteriCR called with null connection");
+}
+
+void stubConChromiumParametervCR(GLint con, GLenum target, GLenum type, GLsizei count, const GLvoid *values)
+{
+//    if (con)
+        stub.spu->dispatch_table.VBoxConChromiumParametervCR(con, target, type, count, values);
+//    else
+//        crError("VBoxConChromiumParameteriCR called with null connection");
 }
 
 void stubConFlush(GLint con)
diff --git a/src/VBox/Additions/common/crOpenGL/icd_drv.c b/src/VBox/Additions/common/crOpenGL/icd_drv.c
index cff7f9a..d1a23f9 100644
--- a/src/VBox/Additions/common/crOpenGL/icd_drv.c
+++ b/src/VBox/Additions/common/crOpenGL/icd_drv.c
@@ -307,11 +307,11 @@ BOOL APIENTRY DrvCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask)
     return 0;
 }
 
+DECLEXPORT(BOOL) WINAPI wglShareLists_prox( HGLRC hglrc1, HGLRC hglrc2 );
+
 BOOL APIENTRY DrvShareLists(HGLRC hglrc1, HGLRC hglrc2)
 {
-    CR_DDI_PROLOGUE();
-    crWarning( "DrvShareLists: unsupported" );
-    return 1;
+    return wglShareLists_prox(hglrc1, hglrc2);
 }
 
 int APIENTRY DrvSetLayerPaletteEntries(HDC hdc, int iLayerPlane,
diff --git a/src/VBox/Additions/common/crOpenGL/load.c b/src/VBox/Additions/common/crOpenGL/load.c
index 16ffd13..ce4cdc1 100644
--- a/src/VBox/Additions/common/crOpenGL/load.c
+++ b/src/VBox/Additions/common/crOpenGL/load.c
@@ -1133,6 +1133,7 @@ stubInit(void)
 
 #ifdef VDBG_VEHANDLER
 # include <dbghelp.h>
+# include <cr_string.h>
 static PVOID g_VBoxVehHandler = NULL;
 static DWORD g_VBoxVehEnable = 0;
 
@@ -1143,13 +1144,7 @@ static DWORD g_VBoxVehEnable = 0;
 /* exit on exception */
 #define VBOXVEH_F_EXIT  0x00000004
 
-static DWORD g_VBoxVehFlags = 0
-#ifdef DEBUG_misha
-                            | VBOXVEH_F_BREAK
-#else
-                            | VBOXVEH_F_DUMP
-#endif
-        ;
+static DWORD g_VBoxVehFlags = 0;
 
 typedef BOOL WINAPI FNVBOXDBG_MINIDUMPWRITEDUMP(HANDLE hProcess,
             DWORD ProcessId,
@@ -1162,7 +1157,7 @@ typedef FNVBOXDBG_MINIDUMPWRITEDUMP *PFNVBOXDBG_MINIDUMPWRITEDUMP;
 
 static HMODULE g_hVBoxMdDbgHelp = NULL;
 static PFNVBOXDBG_MINIDUMPWRITEDUMP g_pfnVBoxMdMiniDumpWriteDump = NULL;
-static uint32_t g_cVBoxMdFilePrefixLen = 0;
+static size_t g_cVBoxMdFilePrefixLen = 0;
 static WCHAR g_aszwVBoxMdFilePrefix[MAX_PATH];
 static WCHAR g_aszwVBoxMdDumpCount = 0;
 static MINIDUMP_TYPE g_enmVBoxMdDumpType = MiniDumpNormal
@@ -1190,7 +1185,8 @@ static MINIDUMP_TYPE g_enmVBoxMdDumpType = MiniDumpNormal
 
 
 
-#define VBOXMD_DUMP_DIR_PREFIX_DEFAULT L"C:\\dumps\\vboxdmp"
+#define VBOXMD_DUMP_DIR_DEFAULT "C:\\dumps"
+#define VBOXMD_DUMP_NAME_PREFIX_W L"VBoxDmp_"
 
 static HMODULE loadSystemDll(const char *pszName)
 {
@@ -1230,19 +1226,6 @@ static DWORD vboxMdMinidumpCreate(struct _EXCEPTION_POINTERS *pExceptionInfo)
             return GetLastError();
     }
 
-    /* @todo: this is a tmp stuff until we get that info from the settings properly */
-    if (!g_cVBoxMdFilePrefixLen)
-    {
-        g_cVBoxMdFilePrefixLen = sizeof (VBOXMD_DUMP_DIR_PREFIX_DEFAULT)/sizeof (g_aszwVBoxMdFilePrefix[0]) - 1 /* <- don't include nul terminator */;
-        memcpy(g_aszwVBoxMdFilePrefix, VBOXMD_DUMP_DIR_PREFIX_DEFAULT, sizeof (VBOXMD_DUMP_DIR_PREFIX_DEFAULT));
-    }
-
-
-    if (RT_ELEMENTS(aszwMdFileName) <= g_cVBoxMdFilePrefixLen)
-    {
-        return ERROR_INVALID_STATE;
-    }
-
     ++g_aszwVBoxMdDumpCount;
 
     memcpy(aszwMdFileName, g_aszwVBoxMdFilePrefix, g_cVBoxMdFilePrefixLen * sizeof (g_aszwVBoxMdFilePrefix[0]));
@@ -1340,6 +1323,7 @@ BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
     case DLL_PROCESS_ATTACH:
     {
         CRNetServer ns;
+        const char * env;
 
 #ifdef CHROMIUM_THREADSAFE
         crInitTSD(&g_stubCurrentContextTSD);
@@ -1348,12 +1332,97 @@ BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
         crInitMutex(&stub_init_mutex);
 
 #ifdef VDBG_VEHANDLER
-        g_VBoxVehEnable = !!crGetenv("CR_DBG_VEH_ENABLE");
+        env = crGetenv("CR_DBG_VEH_ENABLE");
+        g_VBoxVehEnable = crStrParseI32(env,
 # ifdef DEBUG_misha
-        g_VBoxVehEnable = 1;
+                1
+# else
+                0
 # endif
+                );
+
         if (g_VBoxVehEnable)
+        {
+            char procName[1024];
+            size_t cProcName;
+            size_t cChars;
+
+            env = crGetenv("CR_DBG_VEH_FLAGS");
+            g_VBoxVehFlags = crStrParseI32(env,
+                    0
+# ifdef DEBUG_misha
+                    | VBOXVEH_F_BREAK
+# else
+                    | VBOXVEH_F_DUMP
+# endif
+                    );
+
+            env = crGetenv("CR_DBG_VEH_DUMP_DIR");
+            if (!env)
+                env = VBOXMD_DUMP_DIR_DEFAULT;
+
+            g_cVBoxMdFilePrefixLen = strlen(env);
+
+            if (RT_ELEMENTS(g_aszwVBoxMdFilePrefix) <= g_cVBoxMdFilePrefixLen + 26 + (sizeof (VBOXMD_DUMP_NAME_PREFIX_W) - sizeof (WCHAR)) / sizeof (WCHAR))
+            {
+                g_cVBoxMdFilePrefixLen = 0;
+                env = "";
+            }
+
+            mbstowcs_s(&cChars, g_aszwVBoxMdFilePrefix, g_cVBoxMdFilePrefixLen + 1, env, _TRUNCATE);
+
+            Assert(cChars == g_cVBoxMdFilePrefixLen + 1);
+
+            g_cVBoxMdFilePrefixLen = cChars - 1;
+
+            if (g_cVBoxMdFilePrefixLen && g_aszwVBoxMdFilePrefix[g_cVBoxMdFilePrefixLen - 1] != L'\\')
+                g_aszwVBoxMdFilePrefix[g_cVBoxMdFilePrefixLen++] = L'\\';
+
+            memcpy(g_aszwVBoxMdFilePrefix + g_cVBoxMdFilePrefixLen, VBOXMD_DUMP_NAME_PREFIX_W, sizeof (VBOXMD_DUMP_NAME_PREFIX_W) - sizeof (WCHAR));
+            g_cVBoxMdFilePrefixLen += (sizeof (VBOXMD_DUMP_NAME_PREFIX_W) - sizeof (WCHAR)) / sizeof (WCHAR);
+
+            crGetProcName(procName, RT_ELEMENTS(procName));
+            cProcName = strlen(procName);
+
+            if (RT_ELEMENTS(g_aszwVBoxMdFilePrefix) > g_cVBoxMdFilePrefixLen + cProcName + 1 + 26)
+            {
+                mbstowcs_s(&cChars, g_aszwVBoxMdFilePrefix + g_cVBoxMdFilePrefixLen, cProcName + 1, procName, _TRUNCATE);
+                Assert(cChars == cProcName + 1);
+                g_cVBoxMdFilePrefixLen += cChars - 1;
+                g_aszwVBoxMdFilePrefix[g_cVBoxMdFilePrefixLen++] = L'_';
+            }
+
+            /* sanity */
+            g_aszwVBoxMdFilePrefix[g_cVBoxMdFilePrefixLen] = L'\0';
+
+            env = crGetenv("CR_DBG_VEH_DUMP_TYPE");
+
+            g_enmVBoxMdDumpType = crStrParseI32(env,
+                    MiniDumpNormal
+                    | MiniDumpWithDataSegs
+                    | MiniDumpWithFullMemory
+                    | MiniDumpWithHandleData
+            ////        | MiniDumpFilterMemory
+            ////        | MiniDumpScanMemory
+            //        | MiniDumpWithUnloadedModules
+            ////        | MiniDumpWithIndirectlyReferencedMemory
+            ////        | MiniDumpFilterModulePaths
+            //        | MiniDumpWithProcessThreadData
+            //        | MiniDumpWithPrivateReadWriteMemory
+            ////        | MiniDumpWithoutOptionalData
+            //        | MiniDumpWithFullMemoryInfo
+            //        | MiniDumpWithThreadInfo
+            //        | MiniDumpWithCodeSegs
+            //        | MiniDumpWithFullAuxiliaryState
+            //        | MiniDumpWithPrivateWriteCopyMemory
+            //        | MiniDumpIgnoreInaccessibleMemory
+            //        | MiniDumpWithTokenInformation
+            ////        | MiniDumpWithModuleHeaders
+            ////        | MiniDumpFilterTriage
+                    );
+
             vboxVDbgVEHandlerRegister();
+        }
 #endif
 
         crNetInit(NULL, NULL);
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu.h b/src/VBox/Additions/common/crOpenGL/pack/packspu.h
index 3c0457d..1515b07 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu.h
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu.h
@@ -27,6 +27,26 @@ extern uint32_t g_u32VBoxHostCaps;
 
 typedef struct thread_info_t ThreadInfo;
 typedef struct context_info_t ContextInfo;
+typedef struct zvabuffer_info_t ZvaBufferInfo;
+
+struct zvabuffer_info_t
+{
+    /* GL_ARRAY_BUFFER_ARB buffer */
+    GLuint idBuffer;
+    /* buffer length */
+    GLuint cbBuffer;
+    /* number of values stored in the buffer currently */
+    GLuint cValues;
+    /* current buffer value */
+    union
+    {
+        GLfloat f[4];
+        GLuint ui[4];
+        GLubyte ub[4];
+        GLshort s[4];
+        GLushort us[4];
+    } Value;
+};
 
 struct thread_info_t {
     unsigned long id;
@@ -47,7 +67,9 @@ struct context_info_t {
     CRContext *clientState;  /* used to store client-side GL state */
     GLint serverCtx;         /* context ID returned by server */
     GLboolean  fAutoFlush;
+    GLboolean  fCheckZerroVertAttr;
     ThreadInfo *currentThread;
+    ZvaBufferInfo zvaBufferInfo;
     GLubyte glVersion[100];     /* GL_VERSION string */
     GLubyte pszRealVendor[100];
     GLubyte pszRealVersion[100];
@@ -75,9 +97,9 @@ typedef struct {
     bool bRunningUnderWDDM;
 #endif
 
-#ifdef VBOX_WITH_CRPACKSPU_DUMPER
     SPUDispatchTable self;
 
+#ifdef VBOX_WITH_CRPACKSPU_DUMPER
     CR_RECORDER Recorder;
     CR_DBGPRINT_DUMPER Dumper;
 #endif
@@ -108,7 +130,21 @@ extern CRtsd _PackTSD;
   GET_THREAD(thread);                       \
   ContextInfo *C = thread->currentContext
 
-#define CRPACKSPU_WRITEBACK_WAIT(_thread, _writeback)  CR_WRITEBACK_WAIT((_thread)->netServer.conn, _writeback)
+#ifdef DEBUG_misha
+# define CRPACKSPU_WRITEBACK_ASSERT_ZERO(_writeback) Assert(!(_writeback))
+#else
+# define CRPACKSPU_WRITEBACK_ASSERT_ZERO(_writeback) do {} while (0)
+#endif
+
+#define CRPACKSPU_WRITEBACK_WAIT(_thread, _writeback) do {\
+        if (g_u32VBoxHostCaps & CR_VBOX_CAP_CMDVBVA) { \
+            CRPACKSPU_WRITEBACK_ASSERT_ZERO(_writeback); \
+            (_writeback) = 0; \
+            break; \
+        } \
+        CR_WRITEBACK_WAIT((_thread)->netServer.conn, _writeback); \
+    } while (0)
+
 #if defined(WINDOWS) && defined(VBOX_WITH_WDDM) && defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
 # define CRPACKSPU_IS_WDDM_CRHGSMI() (pack_spu.bRunningUnderWDDM)
 #else
@@ -135,4 +171,8 @@ extern ThreadInfo *packspuNewThread(
 
 extern ThreadInfo *packspuNewCtxThread( struct VBOXUHGSMI *pHgsmi );
 
+
+
+#define MAGIC_OFFSET 3000
+
 #endif /* CR_PACKSPU_H */
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c
index be65363..0fa13b3 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c
@@ -8,6 +8,7 @@
 #include "cr_packfunctions.h"
 #include "cr_glstate.h"
 #include "packspu_proto.h"
+#include "cr_mem.h"
 
 void PACKSPU_APIENTRY packspu_FogCoordPointerEXT( GLenum type, GLsizei stride, const GLvoid *pointer )
 {
@@ -172,6 +173,168 @@ void PACKSPU_APIENTRY packspu_InterleavedArrays( GLenum format, GLsizei stride,
     crStateInterleavedArrays( format, stride, pointer );
 }
 
+#ifdef DEBUG_misha
+/* debugging */
+//# define CR_FORCE_ZVA_SERVER_ARRAY
+#endif
+# define CR_FORCE_ZVA_EXPAND
+
+
+GLboolean packspuZvaCreate(ContextInfo *pCtx, const GLfloat *pValue, GLuint cValues)
+{
+    ZvaBufferInfo *pInfo = &pCtx->zvaBufferInfo;
+    GLuint cbValue = 4 * sizeof (*pValue);
+    GLuint cbValues = cValues * cbValue;
+    GLfloat *pBuffer;
+    uint8_t *pu8Buf;
+    GLuint i;
+
+    /* quickly sort out if we can use the current value */
+    if (pInfo->idBuffer
+            && pInfo->cValues >= cValues
+            && !crMemcmp(pValue, &pInfo->Value, cbValue))
+        return GL_FALSE;
+
+    pBuffer = (GLfloat*)crAlloc(cbValues);
+    if (!pBuffer)
+    {
+        WARN(("crAlloc for pBuffer failed"));
+        return GL_FALSE;
+    }
+
+    pu8Buf = (uint8_t *)pBuffer;
+    for (i = 0; i < cValues; ++i)
+    {
+        crMemcpy(pu8Buf, pValue, cbValue);
+        pu8Buf += cbValue;
+    }
+
+    /* */
+    if (!pInfo->idBuffer)
+    {
+        pack_spu.self.GenBuffersARB(1, &pInfo->idBuffer);
+        Assert(pInfo->idBuffer);
+    }
+
+    pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, pInfo->idBuffer);
+
+    if (pInfo->cbBuffer < cbValues)
+    {
+        pack_spu.self.BufferDataARB(GL_ARRAY_BUFFER_ARB, cbValues, pBuffer, GL_DYNAMIC_DRAW_ARB);
+        pInfo->cbBuffer = cbValues;
+    }
+    else
+    {
+        pack_spu.self.BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, cbValues, pBuffer);
+    }
+
+    pInfo->cValues = cValues;
+    crMemcpy(&pInfo->Value, pValue, cbValue);
+
+    crFree(pBuffer);
+
+    return GL_TRUE;
+}
+
+typedef struct
+{
+    ContextInfo *pCtx;
+    GLuint idBuffer;
+    CRClientPointer cp;
+} CR_ZVA_RESTORE_CTX;
+
+void packspuZvaEnable(ContextInfo *pCtx, const GLfloat *pValue, GLuint cValues, CR_ZVA_RESTORE_CTX *pRestoreCtx)
+{
+    CRContext *g = pCtx->clientState;
+
+    Assert(0);
+
+#ifdef DEBUG
+    {
+        CRContext *pCurState = crStateGetCurrent();
+
+        Assert(g == pCurState);
+    }
+#endif
+
+    pRestoreCtx->pCtx = pCtx;
+    pRestoreCtx->idBuffer = g->bufferobject.arrayBuffer ? g->bufferobject.arrayBuffer->id : 0;
+    pRestoreCtx->cp = g->client.array.a[0];
+
+    Assert(!pRestoreCtx->cp.enabled);
+
+    /* buffer ref count mechanism does not work actually atm,
+     * still ensure the buffer does not get destroyed if we fix it in the future */
+    if (pRestoreCtx->cp.buffer)
+        pRestoreCtx->cp.buffer->refCount++;
+
+    packspuZvaCreate(pCtx, pValue, cValues);
+
+    pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, pCtx->zvaBufferInfo.idBuffer);
+
+    pack_spu.self.VertexAttribPointerARB(0, 4, GL_FLOAT,
+            GL_FALSE, /*normalized*/
+            0, /*stride*/
+            NULL /*addr*/);
+
+    pack_spu.self.EnableVertexAttribArrayARB(0);
+}
+
+void packspuZvaDisable(CR_ZVA_RESTORE_CTX *pRestoreCtx)
+{
+    if (pRestoreCtx->cp.buffer)
+        pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, pRestoreCtx->cp.buffer->id);
+    else
+        pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+
+    pack_spu.self.VertexAttribPointerARB(0, pRestoreCtx->cp.size, pRestoreCtx->cp.type,
+            pRestoreCtx->cp.normalized, /*normalized*/
+            pRestoreCtx->cp.stride, /*stride*/
+            pRestoreCtx->cp.p);
+
+    if (pRestoreCtx->cp.enabled)
+        pack_spu.self.EnableVertexAttribArrayARB(0);
+    else
+        pack_spu.self.DisableVertexAttribArrayARB(0);
+
+    if (pRestoreCtx->cp.buffer)
+    {
+        if (pRestoreCtx->cp.buffer->id != pRestoreCtx->idBuffer)
+            pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, pRestoreCtx->idBuffer);
+
+        /* we have increased the refcount above, decrease it back */
+        pRestoreCtx->cp.buffer->refCount--;
+    }
+    else
+    {
+        if (pRestoreCtx->idBuffer)
+            pack_spu.self.BindBufferARB(GL_ARRAY_BUFFER_ARB, pRestoreCtx->idBuffer);
+    }
+
+#ifdef DEBUG
+    {
+        CRContext *g = pRestoreCtx->pCtx->clientState;
+        CRContext *pCurState = crStateGetCurrent();
+
+        Assert(g == pCurState);
+
+        Assert(pRestoreCtx->cp.p == g->client.array.a[0].p);
+        Assert(pRestoreCtx->cp.size == g->client.array.a[0].size);
+        Assert(pRestoreCtx->cp.type == g->client.array.a[0].type);
+        Assert(pRestoreCtx->cp.stride == g->client.array.a[0].stride);
+        Assert(pRestoreCtx->cp.enabled == g->client.array.a[0].enabled);
+        Assert(pRestoreCtx->cp.normalized == g->client.array.a[0].normalized);
+        Assert(pRestoreCtx->cp.bytesPerIndex == g->client.array.a[0].bytesPerIndex);
+# ifdef CR_ARB_vertex_buffer_object
+        Assert(pRestoreCtx->cp.buffer == g->client.array.a[0].buffer);
+# endif
+# ifdef CR_EXT_compiled_vertex_array
+        Assert(pRestoreCtx->cp.locked == g->client.array.a[0].locked);
+# endif
+        Assert(pRestoreCtx->idBuffer == (g->bufferobject.arrayBuffer ? g->bufferobject.arrayBuffer->id : 0));
+    }
+#endif
+}
 
 void PACKSPU_APIENTRY
 packspu_ArrayElement( GLint index )
@@ -179,52 +342,89 @@ packspu_ArrayElement( GLint index )
 /*@todo cash guest/host pointers calculation and use appropriate path here without crStateUseServerArrays call*/
 #if 1
     GLboolean serverArrays = GL_FALSE;
+    GLuint cZvaValues = 0;
+    GLfloat aAttrib[4];
 
 #if CR_ARB_vertex_buffer_object
     GET_CONTEXT(ctx);
     /*crDebug("packspu_ArrayElement index:%i", index);*/
     if (ctx->clientState->extensions.ARB_vertex_buffer_object)
+    {
         serverArrays = crStateUseServerArrays();
+        if (ctx->fCheckZerroVertAttr)
+            cZvaValues = crStateNeedDummyZeroVertexArray(thread->currentContext->clientState, &thread->packer->current, aAttrib);
+    }
 #endif
 
-    if (serverArrays) {
+    if (serverArrays
+#ifdef CR_FORCE_ZVA_EXPAND
+            && !cZvaValues
+#endif
+            ) {
+        CR_ZVA_RESTORE_CTX RestoreCtx;
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
 
+        Assert(cZvaValues < UINT32_MAX/2);
+
         /* LockArraysEXT can not be executed between glBegin/glEnd pair, it also
          * leads to vertexpointers being adjusted on the host side between glBegin/glEnd calls which
          * produces unpredictable results. Locking is done before the glBegin call instead.
          */
         CRASSERT(!clientState->array.locked || clientState->array.synced);
 
+        if (cZvaValues)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+
         /* Send the DrawArrays command over the wire */
         if (pack_spu.swap)
             crPackArrayElementSWAP( index );
         else
             crPackArrayElement( index );
+
+        if (cZvaValues)
+            packspuZvaDisable(&RestoreCtx);
     }
     else {
         /* evaluate locally */
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        CR_ZVA_RESTORE_CTX RestoreCtx;
+
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+#endif
+
         if (pack_spu.swap)
-            crPackExpandArrayElementSWAP( index, clientState );
+            crPackExpandArrayElementSWAP( index, clientState, cZvaValues ? aAttrib : NULL );
         else
-            crPackExpandArrayElement( index, clientState );
+            crPackExpandArrayElement( index, clientState, cZvaValues ? aAttrib : NULL );
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaDisable(&RestoreCtx);
+#endif
     }
 #else
     GET_CONTEXT(ctx);
     CRClientState *clientState = &(ctx->clientState->client);
-    crPackExpandArrayElement(index, clientState);
+    crPackExpandArrayElement(index, clientState, NULL);
 #endif
 }
 
 /*#define CR_USE_LOCKARRAYS*/
+#ifdef CR_USE_LOCKARRAYS
+# error "check Zero Vertex Attrib hack is supported properly!"
+#endif
 
 void PACKSPU_APIENTRY
 packspu_DrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
 {
     GLboolean serverArrays = GL_FALSE;
+    GLuint cZvaValues = 0;
+    GLfloat aAttrib[4];
 
 #if CR_ARB_vertex_buffer_object
     GET_CONTEXT(ctx);
@@ -232,7 +432,11 @@ packspu_DrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *ind
     CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
     /*crDebug("DrawElements count=%d, indices=%p", count, indices);*/
     if (ctx->clientState->extensions.ARB_vertex_buffer_object)
+    {
         serverArrays = crStateUseServerArrays();
+        if (ctx->fCheckZerroVertAttr)
+            cZvaValues = crStateNeedDummyZeroVertexArray(thread->currentContext->clientState, &thread->packer->current, aAttrib);
+    }
 
 # ifdef CR_USE_LOCKARRAYS
     if (!serverArrays && !ctx->clientState->client.array.locked && (count>3)
@@ -297,34 +501,61 @@ packspu_DrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *ind
 # endif
 #endif
 
-    if (serverArrays) {
+    if (serverArrays
+#ifdef CR_FORCE_ZVA_EXPAND
+            && !cZvaValues
+#endif
+            ) {
+        CR_ZVA_RESTORE_CTX RestoreCtx;
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
 
+        Assert(cZvaValues < UINT32_MAX/2);
+
+        if (cZvaValues)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+
         /*Note the comment in packspu_LockArraysEXT*/
         if (clientState->array.locked && !clientState->array.synced)
         {
             crPackLockArraysEXT(clientState->array.lockFirst, clientState->array.lockCount);
             clientState->array.synced = GL_TRUE;
         }
+
         /* Send the DrawArrays command over the wire */
         if (pack_spu.swap)
             crPackDrawElementsSWAP( mode, count, type, indices );
         else
             crPackDrawElements( mode, count, type, indices );
+
+        if (cZvaValues)
+            packspuZvaDisable(&RestoreCtx);
     }
     else {
         /* evaluate locally */
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        CR_ZVA_RESTORE_CTX RestoreCtx;
+
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+#endif
+
         if (pack_spu.swap)
-            crPackExpandDrawElementsSWAP( mode, count, type, indices, clientState );
+            crPackExpandDrawElementsSWAP( mode, count, type, indices, clientState, cZvaValues ? aAttrib : NULL );
         else
         {
             //packspu_Begin(mode);
-            crPackExpandDrawElements( mode, count, type, indices, clientState );
+            crPackExpandDrawElements( mode, count, type, indices, clientState, cZvaValues ? aAttrib : NULL );
             //packspu_End();
         }
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaDisable(&RestoreCtx);
+#endif
     }
 
 #if CR_ARB_vertex_buffer_object
@@ -340,18 +571,34 @@ void PACKSPU_APIENTRY
 packspu_DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices )
 {
     GLboolean serverArrays = GL_FALSE;
+    GLuint cZvaValues = 0;
+    GLfloat aAttrib[4];
 
 #if CR_ARB_vertex_buffer_object
     GET_CONTEXT(ctx);
     /*crDebug("DrawRangeElements count=%d", count);*/
     if (ctx->clientState->extensions.ARB_vertex_buffer_object)
+    {
          serverArrays = crStateUseServerArrays();
+         if (ctx->fCheckZerroVertAttr)
+             cZvaValues = crStateNeedDummyZeroVertexArray(thread->currentContext->clientState, &thread->packer->current, aAttrib);
+    }
 #endif
 
-    if (serverArrays) {
+    if (serverArrays
+#ifdef CR_FORCE_ZVA_EXPAND
+            && !cZvaValues
+#endif
+            ) {
+        CR_ZVA_RESTORE_CTX RestoreCtx;
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
 
+        Assert(cZvaValues < UINT32_MAX/2);
+
+        if (cZvaValues)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+
         /*Note the comment in packspu_LockArraysEXT*/
         if (clientState->array.locked && !clientState->array.synced)
         {
@@ -364,17 +611,32 @@ packspu_DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count,
             crPackDrawRangeElementsSWAP( mode, start, end, count, type, indices );
         else
             crPackDrawRangeElements( mode, start, end, count, type, indices );
+
+        if (cZvaValues)
+            packspuZvaDisable(&RestoreCtx);
     }
     else {
         /* evaluate locally */
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        CR_ZVA_RESTORE_CTX RestoreCtx;
+
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+#endif
+
         if (pack_spu.swap)
-            crPackExpandDrawRangeElementsSWAP( mode, start, end, count, type, indices, clientState );
+            crPackExpandDrawRangeElementsSWAP( mode, start, end, count, type, indices, clientState, cZvaValues ? aAttrib : NULL );
         else
         {
-            crPackExpandDrawRangeElements( mode, start, end, count, type, indices, clientState );
+            crPackExpandDrawRangeElements( mode, start, end, count, type, indices, clientState, cZvaValues ? aAttrib : NULL );
         }
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaDisable(&RestoreCtx);
+#endif
     }
 }
 
@@ -383,13 +645,19 @@ void PACKSPU_APIENTRY
 packspu_DrawArrays( GLenum mode, GLint first, GLsizei count )
 {
     GLboolean serverArrays = GL_FALSE;
+    GLuint cZvaValues = 0;
+    GLfloat aAttrib[4];
 
 #if CR_ARB_vertex_buffer_object
     GET_CONTEXT(ctx);
     GLboolean lockedArrays = GL_FALSE;
     /*crDebug("DrawArrays count=%d", count);*/
     if (ctx->clientState->extensions.ARB_vertex_buffer_object)
+    {
          serverArrays = crStateUseServerArrays();
+         if (ctx->fCheckZerroVertAttr)
+             cZvaValues = crStateNeedDummyZeroVertexArray(thread->currentContext->clientState, &thread->packer->current, aAttrib);
+    }
 
 # ifdef CR_USE_LOCKARRAYS
     if (!serverArrays && !ctx->clientState->client.array.locked && (count>3))
@@ -408,11 +676,21 @@ packspu_DrawArrays( GLenum mode, GLint first, GLsizei count )
 # endif
 #endif
 
-    if (serverArrays)
+    if (serverArrays
+#ifdef CR_FORCE_ZVA_EXPAND
+            && !cZvaValues
+#endif
+            )
     {
+        CR_ZVA_RESTORE_CTX RestoreCtx;
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
 
+        Assert(cZvaValues < UINT32_MAX/2);
+
+        if (cZvaValues)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+
         /*Note the comment in packspu_LockArraysEXT*/
         if (clientState->array.locked && !clientState->array.synced)
         {
@@ -425,16 +703,32 @@ packspu_DrawArrays( GLenum mode, GLint first, GLsizei count )
             crPackDrawArraysSWAP( mode, first, count );
         else
             crPackDrawArrays( mode, first, count );
+
+        if (cZvaValues)
+            packspuZvaDisable(&RestoreCtx);
     }
     else
     {
         /* evaluate locally */
         GET_CONTEXT(ctx);
         CRClientState *clientState = &(ctx->clientState->client);
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        CR_ZVA_RESTORE_CTX RestoreCtx;
+
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaEnable(ctx, aAttrib, cZvaValues, &RestoreCtx);
+#endif
+
         if (pack_spu.swap)
-            crPackExpandDrawArraysSWAP( mode, first, count, clientState );
+            crPackExpandDrawArraysSWAP( mode, first, count, clientState, cZvaValues ? aAttrib : NULL );
         else
-            crPackExpandDrawArrays( mode, first, count, clientState );
+            crPackExpandDrawArrays( mode, first, count, clientState, cZvaValues ? aAttrib : NULL );
+
+#ifdef CR_FORCE_ZVA_SERVER_ARRAY
+        if (cZvaValues && cZvaValues < UINT32_MAX/2)
+            packspuZvaDisable(&RestoreCtx);
+#endif
+
     }
 
 #if CR_ARB_vertex_buffer_object
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
index 08e4130..450a0d4 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
@@ -10,8 +10,6 @@
 #include "cr_string.h"
 #include "packspu_proto.h"
 
-#define MAGIC_OFFSET 3000
-
 /*
  * Allocate a new ThreadInfo structure, setup a connection to the
  * server, allocate/init a packer context, bind this ThreadInfo to
@@ -242,6 +240,64 @@ packspu_VBoxConChromiumParameteriCR(GLint con, GLenum param, GLint value)
     }
 }
 
+GLvoid PACKSPU_APIENTRY
+packspu_VBoxConChromiumParametervCR(GLint con, GLenum target, GLenum type, GLsizei count, const GLvoid *values)
+{
+    GET_THREAD(thread);
+    CRPackContext * curPacker = crPackGetContext();
+    ThreadInfo *curThread = thread;
+    int writeback = 1;
+    GLint serverCtx = (GLint) -1;
+
+    CRASSERT(!curThread == !curPacker);
+    CRASSERT(!curThread || !curPacker || curThread->packer == curPacker);
+#ifdef CHROMIUM_THREADSAFE
+    crLockMutex(&_PackMutex);
+#endif
+
+#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
+    CRASSERT(!con == !CRPACKSPU_IS_WDDM_CRHGSMI());
+#endif
+
+    if (CRPACKSPU_IS_WDDM_CRHGSMI())
+    {
+        if (!con)
+        {
+            crError("connection should be specified!");
+            return;
+        }
+        thread = GET_THREAD_VAL_ID(con);
+    }
+    else
+    {
+        CRASSERT(!con);
+        if (!thread)
+        {
+            thread = packspuNewThread(
+#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
+                NULL
+#endif
+                );
+        }
+    }
+    CRASSERT(thread);
+    CRASSERT(thread->packer);
+
+    crPackSetContext( thread->packer );
+
+    packspu_ChromiumParametervCR(target, type, count, values);
+
+#ifdef CHROMIUM_THREADSAFE
+    crUnlockMutex(&_PackMutex);
+#endif
+
+    if (CRPACKSPU_IS_WDDM_CRHGSMI())
+    {
+        /* restore the packer context to the tls */
+        crPackSetContext(curPacker);
+    }
+}
+
 GLint PACKSPU_APIENTRY
 packspu_VBoxCreateContext( GLint con, const char *dpyName, GLint visual, GLint shareCtx )
 {
@@ -419,6 +475,8 @@ void PACKSPU_APIENTRY packspu_DestroyContext( GLint ctx )
     context->serverCtx = 0;
     context->currentThread = NULL;
 
+    crMemset (&context->zvaBufferInfo, 0, sizeof (context->zvaBufferInfo));
+
     if (curContext == context)
     {
         if (!CRPACKSPU_IS_WDDM_CRHGSMI())
@@ -499,6 +557,9 @@ void PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLi
                 newCtx->currentThread = thread;
             }
 
+            if (thread->currentContext && newCtx != thread->currentContext && thread->currentContext->fCheckZerroVertAttr)
+                crStateCurrentRecoverNew(thread->currentContext->clientState, &thread->packer->current);
+
             thread->currentContext = newCtx;
             crPackSetContext( thread->packer );
         }
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
index 17929e0..81abccc 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
@@ -58,6 +58,8 @@ easy_swaps = {
 simple_funcs = [ 'GetIntegerv', 'GetFloatv', 'GetDoublev', 'GetBooleanv' ]
 simple_swaps = [ 'SWAP32', 'SWAPFLOAT', 'SWAPDOUBLE', '(GLboolean) SWAP32' ]
 
+vertattr_get_funcs = [ 'GetVertexAttribdv' 'GetVertexAttribfv' 'GetVertexAttribiv' ]
+
 hard_funcs = {
     'GetLightfv': 'SWAPFLOAT',
     'GetLightiv': 'SWAP32',
@@ -121,6 +123,10 @@ for func_name in keys:
         || pname == GL_READ_FRAMEBUFFER_BINDING_EXT
         || pname == GL_DRAW_FRAMEBUFFER_BINDING_EXT 
 #endif
+        || pname == GL_ARRAY_BUFFER_BINDING
+        || pname == GL_ELEMENT_ARRAY_BUFFER_BINDING
+        || pname == GL_PIXEL_PACK_BUFFER_BINDING
+        || pname == GL_PIXEL_UNPACK_BUFFER_BINDING
         )
         {
 #ifdef DEBUG
@@ -156,6 +162,34 @@ for func_name in keys:
             
         }
             """ % (params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name, func_name)
+            
+        if func_name in vertattr_get_funcs:
+            print """
+    if (pname != GL_CURRENT_VERTEX_ATTRIB_ARB)
+    {
+#ifdef DEBUG
+        %s localparams;
+        localparams = (%s) crAlloc(__numValues(pname) * sizeof(*localparams));
+        crState%s(index, pname, localparams);
+        crPack%s(index, %s, &writeback);
+        packspuFlush( (void *) thread );
+        CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
+        for (i=0; i<crStateHlpComponentsCount(pname); ++i)
+        {
+            if (localparams[i] != params[i])
+            {
+                crWarning("Incorrect local state in %s for %%x param %%i", pname, i);
+                crWarning("Expected %%i but got %%i", (int)localparams[i], (int)params[i]);
+            }
+        }
+        crFree(localparams);
+#else
+        crState%s(pname, params);
+#endif
+        return;
+    } 
+            """ % (params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name, func_name)
+
         params.append( ("&writeback", "foo", 0) )
         print '\tif (pack_spu.swap)'
         print '\t{'
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
index 2781fa6..51c0f91 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
@@ -79,12 +79,8 @@ packSPUInit( int id, SPU *child, SPU *self,
 static void
 packSPUSelfDispatch(SPUDispatchTable *self)
 {
-#ifdef VBOX_WITH_CRPACKSPU_DUMPER
     crSPUInitDispatchTable( &(pack_spu.self) );
     crSPUCopyDispatchTable( &(pack_spu.self), self );
-#else
-    (void)self;
-#endif
 }
 
 static int
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c
index 3048bbc..5bbee85 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c
@@ -14,7 +14,8 @@ void PACKSPU_APIENTRY packspu_ChromiumParametervCR(GLenum target, GLenum type, G
 
     CRMessage msg;
     int len;
-    
+    GLint ai32ServerValues[2];
+    GLboolean fFlush = GL_FALSE;
     GET_THREAD(thread);
 
     
@@ -29,16 +30,67 @@ void PACKSPU_APIENTRY packspu_ChromiumParametervCR(GLenum target, GLenum type, G
             msg.gather.offset = 69;
             len = sizeof(CRMessageGather);
             crNetSend(thread->netServer.conn, NULL, &msg, len);
+            return;
+
+        case GL_SHARE_LISTS_CR:
+        {
+            ContextInfo *pCtx[2];
+            GLint *ai32Values;
+            int i;
+            if (count != 2)
+            {
+                WARN(("GL_SHARE_LISTS_CR invalid cound %d", count));
+                return;
+            }
+
+            if (type != GL_UNSIGNED_INT && type != GL_INT)
+            {
+                WARN(("GL_SHARE_LISTS_CR invalid type %d", type));
+                return;
+            }
+
+            ai32Values = (GLint*)values;
+
+            for (i = 0; i < 2; ++i)
+            {
+                const int slot = ai32Values[i] - MAGIC_OFFSET;
+
+                if (slot < 0 || slot >= pack_spu.numContexts)
+                {
+                    WARN(("GL_SHARE_LISTS_CR invalid value[%d] %d", i, ai32Values[i]));
+                    return;
+                }
+
+                pCtx[i] = &pack_spu.context[slot];
+                if (!pCtx[i]->clientState)
+                {
+                    WARN(("GL_SHARE_LISTS_CR invalid pCtx1 for value[%d] %d", i, ai32Values[i]));
+                    return;
+                }
+
+                ai32ServerValues[i] = pCtx[i]->serverCtx;
+            }
+
+            crStateShareLists(pCtx[0]->clientState, pCtx[1]->clientState);
+
+            values = ai32ServerValues;
+
+            fFlush = GL_TRUE;
+
             break;
-            
+        }
+
         default:
-            if (pack_spu.swap)
-                crPackChromiumParametervCRSWAP(target, type, count, values);
-            else
-                crPackChromiumParametervCR(target, type, count, values);
+            break;
     }
 
+    if (pack_spu.swap)
+        crPackChromiumParametervCRSWAP(target, type, count, values);
+    else
+        crPackChromiumParametervCR(target, type, count, values);
 
+    if (fFlush)
+        packspuFlush( (void *) thread );
 }
 
 GLboolean packspuSyncOnFlushes()
@@ -434,6 +486,13 @@ static void packspuFluchOnThreadSwitch(GLboolean fEnable)
     thread->currentContext->currentThread = fEnable ? thread : NULL;
 }
 
+static void packspuCheckZerroVertAttr(GLboolean fEnable)
+{
+    GET_THREAD(thread);
+
+    thread->currentContext->fCheckZerroVertAttr = fEnable;
+}
+
 void PACKSPU_APIENTRY packspu_ChromiumParameteriCR(GLenum target, GLint value)
 {
     switch (target)
@@ -442,6 +501,9 @@ void PACKSPU_APIENTRY packspu_ChromiumParameteriCR(GLenum target, GLint value)
             /* this is a pure packspu state, don't propagate it any further */
             packspuFluchOnThreadSwitch(value);
             return;
+        case GL_CHECK_ZERO_VERT_ARRT:
+            packspuCheckZerroVertAttr(value);
+            return;
         case GL_SHARE_CONTEXT_RESOURCES_CR:
             crStateShareContext(value);
             break;
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_net.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_net.c
index 9526825..ee11914 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_net.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_net.c
@@ -130,6 +130,9 @@ void packspuFlush(void *arg )
     buf = &(thread->buffer);
     CRASSERT(buf);
 
+    if (ctx && ctx->fCheckZerroVertAttr)
+        crStateCurrentRecoverNew(ctx->clientState, &thread->packer->current);
+
     /* We're done packing into the current buffer, unbind it */
     crPackReleaseBuffer( thread->packer );
 
@@ -246,6 +249,8 @@ static void packspuFirstConnectToServer( CRNetServer *server
     if (server->conn)
     {
         g_u32VBoxHostCaps = crNetHostCapsGet();
+        if (g_u32VBoxHostCaps & CR_VBOX_CAP_CMDBLOCKS)
+            crPackCmdBlocksEnable();
     }
 }
 
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_special b/src/VBox/Additions/common/crOpenGL/pack/packspu_special
index 03426e0..cf2ca53 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_special
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_special
@@ -110,6 +110,7 @@ VBoxAttachThread
 VBoxDetachThread
 VBoxCreateContext
 VBoxConChromiumParameteriCR
+VBoxConChromiumParametervCR
 VBoxWindowCreate
 VBoxWindowDestroy
 VBoxConCreate
diff --git a/src/VBox/Additions/common/crOpenGL/stub.h b/src/VBox/Additions/common/crOpenGL/stub.h
index f398e13..56c0b35 100644
--- a/src/VBox/Additions/common/crOpenGL/stub.h
+++ b/src/VBox/Additions/common/crOpenGL/stub.h
@@ -342,6 +342,7 @@ extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextT
 #endif
         );
 extern void stubConChromiumParameteriCR(GLint con, GLenum param, GLint value);
+extern void stubConChromiumParametervCR(GLint con, GLenum target, GLenum type, GLsizei count, const GLvoid *values);
 extern GLboolean stubCtxCreate(ContextInfo *context);
 extern GLboolean stubCtxCheckCreate(ContextInfo *context);
 extern void stubDestroyContext( unsigned long contextId );
diff --git a/src/VBox/Additions/common/crOpenGL/wgl.c b/src/VBox/Additions/common/crOpenGL/wgl.c
index a2ccf75..83fcf5b 100644
--- a/src/VBox/Additions/common/crOpenGL/wgl.c
+++ b/src/VBox/Additions/common/crOpenGL/wgl.c
@@ -288,13 +288,6 @@ DECLEXPORT(int) WINAPI wglDescribePixelFormat_prox( HDC hdc, int pixelFormat, UI
     return 1;
 }
 
-DECLEXPORT(BOOL) WINAPI wglShareLists_prox( HGLRC hglrc1, HGLRC hglrc2 )
-{
-    CR_DDI_PROLOGUE();
-    crWarning( "wglShareLists: unsupported" );
-    return 0;
-}
-
 DECLEXPORT(void) WINAPI VBoxCtxChromiumParameteriCR(HGLRC hglrc, GLenum param, GLint value)
 {
     ContextInfo *context;
@@ -318,6 +311,46 @@ DECLEXPORT(void) WINAPI VBoxCtxChromiumParameteriCR(HGLRC hglrc, GLenum param, G
 //    crHashtableUnlock(stub.windowTable);
 }
 
+DECLEXPORT(BOOL) WINAPI wglShareLists_prox( HGLRC hglrc1, HGLRC hglrc2 )
+{
+    ContextInfo *context1, *context2;
+    GLint aSpuContexts[2];
+
+    CR_DDI_PROLOGUE();
+
+//    crHashtableLock(stub.windowTable);
+    crHashtableLock(stub.contextTable);
+
+    context1 = (ContextInfo *) crHashtableSearch(stub.contextTable, (unsigned long) hglrc1);
+
+    if (!context1)
+    {
+        WARN(("invalid hglrc1"));
+        return FALSE;
+    }
+
+    stubCtxCheckCreate(context1);
+
+    context2 = (ContextInfo *) crHashtableSearch(stub.contextTable, (unsigned long) hglrc2);
+
+    if (!context2)
+    {
+        WARN(("invalid hglrc2"));
+        return FALSE;
+    }
+
+    stubCtxCheckCreate(context2);
+
+    aSpuContexts[0] = context1->spuContext;
+    aSpuContexts[1] = context2->spuContext;
+
+    stubConChromiumParametervCR(CR_CTX_CON(context2), GL_SHARE_LISTS_CR, GL_INT, 2, aSpuContexts);
+
+    crHashtableUnlock(stub.contextTable);
+
+    return TRUE;
+}
+
 DECLEXPORT(HGLRC) WINAPI VBoxCreateContext( HDC hdc, struct VBOXUHGSMI *pHgsmi )
 {
     char dpyName[MAX_DPY_NAME];
diff --git a/src/VBox/Additions/linux/drm/vboxvideo_drm.c b/src/VBox/Additions/linux/drm/vboxvideo_drm.c
index 37b9df7..2b6788d 100644
--- a/src/VBox/Additions/linux/drm/vboxvideo_drm.c
+++ b/src/VBox/Additions/linux/drm/vboxvideo_drm.c
@@ -97,6 +97,13 @@
 # endif
 #endif
 
+/* The first of these was introduced when drm was generalised to work with
+ * non-PCI buses, but was removed between 3.15 and 3.16.  The second is a
+ * random definition introduced in the mean-time. */
+#if defined(DRIVER_BUS_PCI) || defined(DRIVER_PRIME)
+# define DRM_NEW_BUS_INIT 1
+#endif
+
 static struct pci_device_id pciidlist[] = {
         vboxvideo_PCI_IDS
 };
@@ -155,7 +162,7 @@ static struct drm_driver driver =
 #else /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0) || defined(DRM_FOPS_AS_POINTER) */
     .fops = &driver_fops,
 #endif
-#ifndef DRIVER_BUS_PCI
+#ifndef DRM_NEW_BUS_INIT
     .pci_driver =
     {
         .name = DRIVER_NAME,
@@ -170,7 +177,7 @@ static struct drm_driver driver =
     .patchlevel = DRIVER_PATCHLEVEL,
 };
 
-#ifdef DRIVER_BUS_PCI
+#ifdef DRM_NEW_BUS_INIT
 static struct pci_driver pci_driver =
 {
     .name = DRIVER_NAME,
@@ -180,7 +187,7 @@ static struct pci_driver pci_driver =
 
 static int __init vboxvideo_init(void)
 {
-#ifndef DRIVER_BUS_PCI
+#ifndef DRM_NEW_BUS_INIT
     return drm_init(&driver);
 #else
     return drm_pci_init(&driver, &pci_driver);
@@ -189,7 +196,7 @@ static int __init vboxvideo_init(void)
 
 static void __exit vboxvideo_exit(void)
 {
-#ifndef DRIVER_BUS_PCI
+#ifndef DRM_NEW_BUS_INIT
     drm_exit(&driver);
 #else
     drm_pci_exit(&driver, &pci_driver);
diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c b/src/VBox/Additions/linux/sharedfolders/regops.c
index a3bbd69..d5ba778 100644
--- a/src/VBox/Additions/linux/sharedfolders/regops.c
+++ b/src/VBox/Additions/linux/sharedfolders/regops.c
@@ -574,8 +574,13 @@ struct file_operations sf_reg_fops =
 # else
     .sendfile    = generic_file_sendfile,
 # endif
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)
+    .read_iter   = generic_file_read_iter,
+    .write_iter  = generic_file_write_iter,
+# else
     .aio_read    = generic_file_aio_read,
     .aio_write   = generic_file_aio_write,
+# endif
 # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
     .fsync       = noop_fsync,
 # else
diff --git a/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c b/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c
index c19f264..de546a8 100644
--- a/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c
+++ b/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.c
@@ -124,13 +124,6 @@ sfprov_disconnect(sfp_connection_t *conn)
 }
 
 
-/*
- * representation of an active mount point
- */
-struct sfp_mount {
-	VBSFMAP	map;
-};
-
 int
 sfprov_mount(sfp_connection_t *conn, char *path, sfp_mount_t **mnt)
 {
@@ -143,7 +136,7 @@ sfprov_mount(sfp_connection_t *conn, char *path, sfp_mount_t **mnt)
 	str = sfprov_string(path, &size);
 	rc = vboxCallMapFolder(&vbox_client, str, &m->map);
 	if (RT_FAILURE(rc)) {
-		cmn_err(CE_WARN, "sfprov_mount: vboxCallMapFolder() failed rc=%d\n", rc);
+		cmn_err(CE_WARN, "sfprov_mount: vboxCallMapFolder() failed. path=%s rc=%d\n", path, rc);
 		kmem_free(m, sizeof (*m));
 		*mnt = NULL;
 		rc = EINVAL;
@@ -202,19 +195,23 @@ sfprov_fmode_from_mode(RTFMODE *fMode, mode_t mode)
 {
 	RTFMODE m = 0;
 
-#define mode_set(r) ((mode & (S_##r)) ? RTFS_UNIX_##r : 0)
+#define mode_set(r) ((mode) & (S_##r)) ? RTFS_UNIX_##r : 0
 	m  = mode_set (ISUID);
 	m |= mode_set (ISGID);
 	m |= (mode & S_ISVTX) ? RTFS_UNIX_ISTXT : 0;
+
 	m |= mode_set (IRUSR);
 	m |= mode_set (IWUSR);
 	m |= mode_set (IXUSR);
+
 	m |= mode_set (IRGRP);
 	m |= mode_set (IWGRP);
 	m |= mode_set (IXGRP);
+
 	m |= mode_set (IROTH);
 	m |= mode_set (IWOTH);
 	m |= mode_set (IXOTH);
+#undef mode_set
 
 	if (S_ISDIR(mode))
 		m |= RTFS_TYPE_DIRECTORY;
@@ -237,49 +234,53 @@ sfprov_fmode_from_mode(RTFMODE *fMode, mode_t mode)
 }
 
 static void
-sfprov_mode_from_fmode(mode_t *mode, RTFMODE fMode)
+sfprov_mode_from_fmode(sfp_mount_t *mnt, mode_t *mode, RTFMODE fMode)
 {
 	mode_t m = 0;
 
+#define mode_set_from_rt(r) ((fMode) & (RTFS_UNIX_##r)) ? (S_##r) : 0;
+	m  = mode_set_from_rt(ISUID);
+	m |= mode_set_from_rt(ISGID);
+	m |= (fMode & RTFS_UNIX_ISTXT) ? S_ISVTX : 0;
+
+	m |= mode_set_from_rt(IRUSR);
+	m |= mode_set_from_rt(IWUSR);
+	m |= mode_set_from_rt(IXUSR);
+
+	m |= mode_set_from_rt(IRGRP);
+	m |= mode_set_from_rt(IWGRP);
+	m |= mode_set_from_rt(IXGRP);
+
+	m |= mode_set_from_rt(IROTH);
+	m |= mode_set_from_rt(IWOTH);
+	m |= mode_set_from_rt(IXOTH);
+#undef mode_set_from_rt
+
 	if (RTFS_IS_DIRECTORY(fMode))
+	{
+		m = mnt->sf_dmode != ~0U ? (mnt->sf_dmode & PERMMASK) : m;
+		m &= ~mnt->sf_dmask;
 		m |= S_IFDIR;
-	else if (RTFS_IS_FILE(fMode))
-		m |= S_IFREG;
-	else if (RTFS_IS_FIFO(fMode))
-		m |= S_IFIFO;
-	else if (RTFS_IS_DEV_CHAR(fMode))
-		m |= S_IFCHR;
-	else if (RTFS_IS_DEV_BLOCK(fMode))
-		m |= S_IFBLK;
-	else if (RTFS_IS_SYMLINK(fMode))
-		m |= S_IFLNK;
-	else if (RTFS_IS_SOCKET(fMode))
-		m |= S_IFSOCK;
-
-	if (fMode & RTFS_UNIX_IRUSR)
-		m |= S_IRUSR;
-	if (fMode & RTFS_UNIX_IWUSR)
-		m |= S_IWUSR;
-	if (fMode & RTFS_UNIX_IXUSR)
-		m |= S_IXUSR;
-	if (fMode & RTFS_UNIX_IRGRP)
-		m |= S_IRGRP;
-	if (fMode & RTFS_UNIX_IWGRP)
-		m |= S_IWGRP;
-	if (fMode & RTFS_UNIX_IXGRP)
-		m |= S_IXGRP;
-	if (fMode & RTFS_UNIX_IROTH)
-		m |= S_IROTH;
-	if (fMode & RTFS_UNIX_IWOTH)
-		m |= S_IWOTH;
-	if (fMode & RTFS_UNIX_IXOTH)
-		m |= S_IXOTH;
-	if (fMode & RTFS_UNIX_ISUID)
-		m |= S_ISUID;
-	if (fMode & RTFS_UNIX_ISGID)
-		m |= S_ISGID;
-	if (fMode & RTFS_UNIX_ISTXT)
-		m |= S_ISVTX;
+	}
+	else
+	{
+		m = mnt->sf_fmode != ~0U ? (mnt->sf_fmode & PERMMASK) : m;
+		m &= ~mnt->sf_fmask;
+
+		if (RTFS_IS_FILE(fMode))
+			m |= S_IFREG;
+		else if (RTFS_IS_SYMLINK(fMode))
+			m |= S_IFLNK;
+		else if (RTFS_IS_FIFO(fMode))
+			m |= S_IFIFO;
+		else if (RTFS_IS_DEV_CHAR(fMode))
+			m |= S_IFCHR;
+		else if (RTFS_IS_DEV_BLOCK(fMode))
+			m |= S_IFBLK;
+		else if (RTFS_IS_SOCKET(fMode))
+			m |= S_IFSOCK;
+	}
+
 	*mode = m;
 }
 
@@ -292,9 +293,9 @@ sfprov_ftime_from_timespec(timestruc_t *time, RTTIMESPEC *ts)
 }
 
 static void
-sfprov_stat_from_info(sffs_stat_t *stat, SHFLFSOBJINFO *info)
+sfprov_stat_from_info(sfp_mount_t *mnt, sffs_stat_t *stat, SHFLFSOBJINFO *info)
 {
-	sfprov_mode_from_fmode(&stat->sf_mode, info->Attr.fMode);
+	sfprov_mode_from_fmode(mnt, &stat->sf_mode, info->Attr.fMode);
 	stat->sf_size  = info->cbObject;
 	stat->sf_alloc = info->cbAllocated;
 	sfprov_ftime_from_timespec(&stat->sf_atime, &info->AccessTime);
@@ -352,7 +353,7 @@ sfprov_create(
 	newfp->handle = parms.Handle;
 	newfp->map = mnt->map;
 	*fp = newfp;
-	sfprov_stat_from_info(stat, &parms.Info);
+	sfprov_stat_from_info(mnt, stat, &parms.Info);
 	return (0);
 }
 
@@ -541,7 +542,7 @@ sfprov_get_mode(sfp_mount_t *mnt, char *path, mode_t *mode)
 	rc = sfprov_getinfo(mnt, path, &info);
 	if (rc)
 		return (rc);
-	sfprov_mode_from_fmode(mode, info.Attr.fMode);
+	sfprov_mode_from_fmode(mnt, mode, info.Attr.fMode);
 	return (0);
 }
 
@@ -607,7 +608,7 @@ sfprov_get_attr(sfp_mount_t *mnt, char *path, sffs_stat_t *attr)
 	rc = sfprov_getinfo(mnt, path, &info);
 	if (rc)
 		return (rc);
-	sfprov_stat_from_info(attr, &info);
+	sfprov_stat_from_info(mnt, attr, &info);
 	return (0);
 }
 
@@ -783,7 +784,7 @@ sfprov_mkdir(
 	newfp->handle = parms.Handle;
 	newfp->map = mnt->map;
 	*fp = newfp;
-	sfprov_stat_from_info(stat, &parms.Info);
+	sfprov_stat_from_info(mnt, stat, &parms.Info);
 	return (0);
 }
 
@@ -859,7 +860,7 @@ sfprov_symlink(
 	}
 
 	if (stat != NULL)
-		sfprov_stat_from_info(stat, &info);
+		sfprov_stat_from_info(mnt, stat, &info);
 
 done:
 	kmem_free(lnk, lnk_size);
@@ -1028,7 +1029,7 @@ sfprov_readdir(
 			dirent->sf_entry.d_off = offset;
 
 			/* save the stats */
-			sfprov_stat_from_info(&dirent->sf_stat, &info->Info);
+			sfprov_stat_from_info(mnt, &dirent->sf_stat, &info->Info);
 
 			/* next info */
 			cur_buf->sf_len += entlen;
diff --git a/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.h b/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.h
index f7e97fb..0c9478d 100644
--- a/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.h
+++ b/src/VBox/Additions/solaris/SharedFolders/vboxfs_prov.h
@@ -32,6 +32,9 @@
 extern "C" {
 #endif
 
+#include "../../common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h"
+
+
 /*
  * These are the provider interfaces used by sffs to access the underlying
  * shared file system.
@@ -62,8 +65,18 @@ extern void sfprov_disconnect(sfp_connection_t *);
  *
  * sfprov_unmount() unmounts the mounted file system. It returns 0 on
  * success and any relevant errno on failure.
+ * 
+ * spf_mount_t is the representation of an active mount point.
  */
-typedef struct sfp_mount sfp_mount_t;
+typedef struct spf_mount_t {
+	VBSFMAP		map;		/* guest<->host mapping */
+	uid_t		sf_uid;		/* owner of the mount point */
+	gid_t		sf_gid;		/* group of the mount point */
+	mode_t		sf_dmode;   /* mode of all directories if != ~0U */
+	mode_t		sf_fmode;   /* mode of all files if != ~0U */
+	mode_t		sf_dmask;   /* mask of all directories */
+	mode_t		sf_fmask;   /* mask of all files */
+} sfp_mount_t;
 
 extern int sfprov_mount(sfp_connection_t *, char *, sfp_mount_t **);
 extern int sfprov_unmount(sfp_mount_t *);
@@ -171,3 +184,4 @@ extern int sfprov_readdir(sfp_mount_t *mnt, char *path,
 #endif
 
 #endif	/* !___VBoxFS_prov_Solaris_h */
+
diff --git a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.c b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.c
index 09ed0da..adab7b1 100644
--- a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.c
+++ b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.c
@@ -41,6 +41,7 @@
 #include <sys/vfs_opreg.h>
 #endif
 #include <sys/pathname.h>
+#include <sys/cmn_err.h>
 #include "vboxfs_prov.h"
 #include "vboxfs_vnode.h"
 #include "vboxfs_vfs.h"
@@ -238,6 +239,23 @@ sf_pn_get(char *rawpath, struct mounta *uap, char **outpath)
 	return (0);
 }
 
+static void 
+sffs_print(sffs_data_t *sffs)
+{
+	cmn_err(CE_NOTE, "sffs_data_t at 0x%p\n", sffs);
+	cmn_err(CE_NOTE, "    vfs_t *sf_vfsp = 0x%p\n", sffs->sf_vfsp);
+	cmn_err(CE_NOTE, "    vnode_t *sf_rootnode = 0x%p\n", sffs->sf_rootnode);
+	cmn_err(CE_NOTE, "    uid_t sf_uid = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_uid);
+	cmn_err(CE_NOTE, "    gid_t sf_gid = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_gid);
+	cmn_err(CE_NOTE, "    mode_t sf_dmode = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_dmode);
+	cmn_err(CE_NOTE, "    mode_t sf_fmode = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_fmode);
+	cmn_err(CE_NOTE, "    mode_t sf_dmask = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_dmask);
+	cmn_err(CE_NOTE, "    mode_t sf_fmask = 0x%lu\n", (ulong_t)sffs->sf_handle->sf_fmask);
+	cmn_err(CE_NOTE, "    char *sf_share_name = %s\n", sffs->sf_share_name);
+	cmn_err(CE_NOTE, "    char *sf_mntpath = %s\n", sffs->sf_mntpath);
+	cmn_err(CE_NOTE, "    sfp_mount_t *sf_handle = 0x%p\n", sffs->sf_handle);
+}
+
 static int
 sffs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
 {
@@ -248,8 +266,8 @@ sffs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
 	dev_t dev;
 	uid_t uid = 0;
 	gid_t gid = 0;
-	mode_t dmode = ~0;
-	mode_t fmode = ~0;
+	mode_t dmode = ~0U;
+	mode_t fmode = ~0U;
 	mode_t dmask = 0;
 	mode_t fmask = 0;
 	int stat_ttl = DEF_STAT_TTL_MS;
@@ -422,17 +440,17 @@ sffs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
 	 */
 	sffs = kmem_alloc(sizeof (*sffs), KM_SLEEP);
 	sffs->sf_vfsp = vfsp;
-	sffs->sf_uid = uid;
-	sffs->sf_gid = gid;
-	sffs->sf_dmode = dmode;
-	sffs->sf_fmode = fmode;
-	sffs->sf_dmask = dmask;
-	sffs->sf_fmask = fmask;
+	sffs->sf_handle = handle;
+	sffs->sf_handle->sf_uid = uid;
+	sffs->sf_handle->sf_gid = gid;
+	sffs->sf_handle->sf_dmode = dmode;
+	sffs->sf_handle->sf_fmode = fmode;
+	sffs->sf_handle->sf_dmask = dmask;
+	sffs->sf_handle->sf_fmask = fmask;
 	sffs->sf_stat_ttl = stat_ttl;
 	sffs->sf_fsync = fsync;
 	sffs->sf_share_name = share_name;
 	sffs->sf_mntpath = mount_point;
-	sffs->sf_handle = handle;
 	sffs->sf_ino = 3;	/* root mount point is always '3' */
 
 	/*
@@ -460,6 +478,9 @@ sffs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
 	mutex_exit(&sffs_lock);
 
 	LogFlowFunc(("sffs_mount() success sffs=0x%p\n", sffs));
+#ifdef DEBUG_ramshankar
+	sffs_print(sffs);
+#endif
 	return (error);
 }
 
@@ -557,19 +578,3 @@ sffs_statvfs(vfs_t *vfsp, statvfs64_t *sbp)
 	return (0);
 }
 
-static void sffs_print(sffs_data_t *sffs)
-{
-	Log(("sffs_data_t at 0x%p\n", sffs));
-	Log(("    vfs_t *sf_vfsp = 0x%p\n", sffs->sf_vfsp));
-	Log(("    vnode_t *sf_rootnode = 0x%p\n", sffs->sf_rootnode));
-	Log(("    uid_t sf_uid = 0x%l\n", (ulong_t)sffs->sf_uid));
-	Log(("    gid_t sf_gid = 0x%l\n", (ulong_t)sffs->sf_gid));
-	Log(("    mode_t sf_dmode = 0x%l\n", (ulong_t)sffs->sf_dmode));
-	Log(("    mode_t sf_fmode = 0x%l\n", (ulong_t)sffs->sf_fmode));
-	Log(("    mode_t sf_dmask = 0x%l\n", (ulong_t)sffs->sf_dmask));
-	Log(("    mode_t sf_fmask = 0x%l\n", (ulong_t)sffs->sf_fmask));
-	Log(("    char *sf_share_name = %s\n", sffs->sf_share_name));
-	Log(("    char *sf_mntpath = %s\n", sffs->sf_mntpath));
-	Log(("    sfp_mount_t *sf_handle = 0x%p\n", sffs->sf_handle));
-}
-
diff --git a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.h b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.h
index 8b6e6b0..b7ebe68 100644
--- a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.h
+++ b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vfs.h
@@ -37,12 +37,6 @@ extern "C" {
 typedef struct sffs_data {
 	vfs_t		*sf_vfsp;	/* filesystem's vfs struct */
 	vnode_t		*sf_rootnode;	/* of vnode of the root directory */
-	uid_t		sf_uid;		/* owner of all shared folders */
-	gid_t		sf_gid;		/* group of all shared folders */
-	mode_t		sf_dmode;   /* mode of all directories */
-	mode_t		sf_fmode;   /* mode of all files */
-	mode_t		sf_dmask;   /* mask of all directories */
-	mode_t		sf_fmask;   /* mask of all files */
 	int  		sf_stat_ttl;	/* ttl for stat caches (in ms) */
 	int  		sf_fsync;	/* whether to honor fsync or not */
 	char		*sf_share_name;
diff --git a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c
index c30dfb7..0170f7d 100644
--- a/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c
+++ b/src/VBox/Additions/solaris/SharedFolders/vboxfs_vnode.c
@@ -91,6 +91,7 @@
 #include <sys/dirent.h>
 #include <sys/fs_subr.h>
 #include <sys/time.h>
+#include <sys/cmn_err.h>
 #include "vboxfs_prov.h"
 #include "vboxfs_vnode.h"
 #include "vboxfs_vfs.h"
@@ -670,14 +671,14 @@ sfnode_access(sfnode_t *node, mode_t mode, cred_t *cr)
 		error = 0;
 	else
 		error = sfnode_update_stat_cache(node);
-	m = (error == 0) ? node->sf_stat.sf_mode : 0;
+	m = (error == 0) ? (node->sf_stat.sf_mode & MODEMASK) : 0;
 
 	/*
 	 * mask off the permissions based on uid/gid
 	 */
-	if (crgetuid(cr) != sffs->sf_uid) {
+	if (crgetuid(cr) != sffs->sf_handle->sf_uid) {
 		shift += 3;
-		if (groupmember(sffs->sf_gid, cr) == 0)
+		if (groupmember(sffs->sf_handle->sf_gid, cr) == 0)
 			shift += 3;
 	}
 	mode &= ~(m << shift);
@@ -685,8 +686,11 @@ sfnode_access(sfnode_t *node, mode_t mode, cred_t *cr)
 	if (mode == 0) {
 		error = 0;
 	} else {
+		/** @todo r=ramshankar: This can probably be optimized by holding static vnode
+		 *  	  templates for dir/file, as it only checks the type rather than
+		 *  	  fetching/allocating the real vnode. */
 		vp = sfnode_get_vnode(node);
-		error = secpolicy_vnode_access(cr, vp, sffs->sf_uid, mode);
+		error = secpolicy_vnode_access(cr, vp, sffs->sf_handle->sf_uid, mode);
 		VN_RELE(vp);
 	}
 	return (error);
@@ -872,8 +876,8 @@ sffs_getattr(
 
 	mutex_enter(&sffs_lock);
 	vap->va_type = vp->v_type;
-	vap->va_uid = sffs->sf_uid;
-	vap->va_gid = sffs->sf_gid;
+	vap->va_uid = sffs->sf_handle->sf_uid;
+	vap->va_gid = sffs->sf_handle->sf_gid;
 	vap->va_fsid = sffs->sf_vfsp->vfs_dev;
 	vap->va_nodeid = node->sf_ino;
 	vap->va_nlink = 1;
@@ -892,35 +896,6 @@ sffs_getattr(
 
 	mode = node->sf_stat.sf_mode;
 	vap->va_mode = mode & MODEMASK;
-	if (S_ISDIR(mode))
-	{
-		vap->va_type = VDIR;
-		vap->va_mode = sffs->sf_dmode != ~0 ? (sffs->sf_dmode & 0777) : vap->va_mode;
-		vap->va_mode &= ~sffs->sf_dmask;
-		vap->va_mode |= S_IFDIR;
-	}
-	else if (S_ISREG(mode))
-	{
-		vap->va_type = VREG;
-		vap->va_mode = sffs->sf_fmode != ~0 ? (sffs->sf_fmode & 0777) : vap->va_mode;
-		vap->va_mode &= ~sffs->sf_fmask;
-		vap->va_mode |= S_IFREG;
-	}
-	else if (S_ISFIFO(mode))
-		vap->va_type = VFIFO;
-	else if (S_ISCHR(mode))
-		vap->va_type = VCHR;
-	else if (S_ISBLK(mode))
-		vap->va_type = VBLK;
-	else if (S_ISLNK(mode))
-	{
-		vap->va_type = VLNK;
-		vap->va_mode = sffs->sf_fmode != ~0 ? (sffs->sf_fmode & 0777) : vap->va_mode;
-		vap->va_mode &= ~sffs->sf_fmask;
-		vap->va_mode |= S_IFLNK;
-	}
-	else if (S_ISSOCK(mode))
-		vap->va_type = VSOCK;
 
 	vap->va_size = node->sf_stat.sf_size;
 	vap->va_blksize = 512;
diff --git a/src/VBox/Additions/x11/vboxvideo/undefined b/src/VBox/Additions/x11/vboxvideo/undefined
index d2ef2bd..8287147 100644
--- a/src/VBox/Additions/x11/vboxvideo/undefined
+++ b/src/VBox/Additions/x11/vboxvideo/undefined
@@ -28,8 +28,11 @@ chmod
 chown
 close
 drmClose
+drmDropMaster
 drmFreeVersion
 drmGetVersion
+drmIoctl
+drmSetMaster
 fbPictureInit
 fbScreenInit
 fchmod
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo.c b/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
index d3affd9..45a53ec 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
@@ -75,6 +75,7 @@
 #include "fb.h"
 
 #include "vboxvideo.h"
+#include <VBox/VBoxGuest.h>
 #include "version-generated.h"
 #include "product-generated.h"
 #include <xf86.h>
@@ -102,6 +103,10 @@
 # include <X11/Xatom.h>
 #endif
 
+#ifdef VBOX_DRI
+# include "xf86drm.h"
+#endif
+
 /* Mandatory functions */
 
 static const OptionInfoRec * VBOXAvailableOptions(int chipid, int busid);
@@ -1013,6 +1018,11 @@ static Bool VBOXScreenInit(ScreenPtr pScreen, int argc, char **argv)
 
 #ifdef VBOX_DRI
     pVBox->useDRI = VBOXDRIScreenInit(pScrn, pScreen, pVBox);
+# ifndef VBOX_DRI_OLD  /* DRI2 */
+    if (pVBox->drmFD >= 0)
+        /* Tell the kernel driver, if present, that we are taking over. */
+        drmIoctl(pVBox->drmFD, VBOXVIDEO_IOCTL_DISABLE_HGSMI, NULL);
+# endif
 #endif
 
     if (!fbScreenInit(pScreen, pVBox->base,
@@ -1178,12 +1188,19 @@ static Bool VBOXEnterVT(ScrnInfoPtr pScrn)
 
     TRACE_ENTRY();
     vboxClearVRAM(pScrn, 0, 0);
-    if (pVBox->fHaveHGSMI)
-        vboxEnableVbva(pScrn);
 #ifdef VBOX_DRI_OLD
     if (pVBox->useDRI)
         DRIUnlock(xf86ScrnToScreen(pScrn));
+#elif defined(VBOX_DRI)  /* DRI2 */
+    if (pVBox->drmFD >= 0)
+    {
+        /* Tell the kernel driver, if present, that we are taking over. */
+        drmIoctl(pVBox->drmFD, VBOXVIDEO_IOCTL_DISABLE_HGSMI, NULL);
+        drmSetMaster(pVBox->drmFD);
+    }
 #endif
+    if (pVBox->fHaveHGSMI)
+        vboxEnableVbva(pScrn);
     /* Re-assert this in case we had a change request while switched out. */
     if (pVBox->FBSize.cx && pVBox->FBSize.cy)
         VBOXAdjustScreenPixmap(pScrn, pVBox->FBSize.cx, pVBox->FBSize.cy);
@@ -1207,12 +1224,20 @@ static void VBOXLeaveVT(ScrnInfoPtr pScrn)
     if (pVBox->fHaveHGSMI)
         vboxDisableVbva(pScrn);
     vboxClearVRAM(pScrn, 0, 0);
-    VBOXRestoreMode(pScrn);
     vboxDisableGraphicsCap(pVBox);
 #ifdef VBOX_DRI_OLD
     if (pVBox->useDRI)
         DRILock(xf86ScrnToScreen(pScrn), 0);
+#elif defined(VBOX_DRI)  /* DRI2 */
+    if (pVBox->drmFD >= 0)
+        drmDropMaster(pVBox->drmFD);
+    /* Tell the kernel driver, if present, that it can use the framebuffer
+     * driver again.  If not, or if that fails, restore the old mode ourselves.
+     */
+    if (   pVBox->drmFD < 0
+        || drmIoctl(pVBox->drmFD, VBOXVIDEO_IOCTL_ENABLE_HGSMI, NULL) < 0)
 #endif
+        VBOXRestoreMode(pScrn);
     TRACE_EXIT();
 }
 
@@ -1220,7 +1245,9 @@ static Bool VBOXCloseScreen(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
     VBOXPtr pVBox = VBOXGetRec(pScrn);
-
+#if defined(VBOX_DRI) && !defined(VBOX_DRI_OLD)  /* DRI2 */
+    BOOL fRestore = TRUE;
+#endif
     if (pScrn->vtSema)
     {
         if (pVBox->fHaveHGSMI)
@@ -1230,15 +1257,23 @@ static Bool VBOXCloseScreen(ScreenPtr pScreen)
         vboxClearVRAM(pScrn, 0, 0);
     }
 #ifdef VBOX_DRI
+# ifndef VBOX_DRI_OLD  /* DRI2 */
+    if (   pVBox->drmFD >= 0
+        /* Tell the kernel driver, if present, that we are going away. */
+        && drmIoctl(pVBox->drmFD, VBOXVIDEO_IOCTL_ENABLE_HGSMI, NULL) >= 0)
+        fRestore = false;
+# endif
     if (pVBox->useDRI)
         VBOXDRICloseScreen(pScreen, pVBox);
     pVBox->useDRI = false;
 #endif
-
-    if (pScrn->vtSema) {
-        VBOXRestoreMode(pScrn);
+#if defined(VBOX_DRI) && !defined(VBOX_DRI_OLD)  /* DRI2 */
+    if (fRestore)
+#endif
+        if (pScrn->vtSema)
+            VBOXRestoreMode(pScrn);
+    if (pScrn->vtSema)
         VBOXUnmapVidMem(pScrn);
-    }
     pScrn->vtSema = FALSE;
 
     /* Do additional bits which are separate for historical reasons */
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo.h b/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
index 6564e6f..6fb15c5 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
@@ -57,6 +57,8 @@
 
 #ifdef DEBUG
 
+#include <xf86.h>
+
 #define TRACE_ENTRY() \
 do { \
     xf86Msg(X_INFO, __PRETTY_FUNCTION__); \
@@ -195,8 +197,8 @@ typedef struct VBOXRec
     int cVisualConfigs;
     __GLXvisualConfig *pVisualConfigs;
     DRIInfoRec *pDRIInfo;
-    int drmFD;
 # endif
+    int drmFD;
 #endif
 } VBOXRec, *VBOXPtr;
 
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri2.c b/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri2.c
index 493f205..f665df5 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri2.c
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri2.c
@@ -16,8 +16,11 @@
  */
 
 #include "vboxvideo.h"
+#include <xf86drm.h>
 #include <drm.h>
 #include <dri2.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 static void VBOXDRICopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
                               DRI2BufferPtr pDest, DRI2BufferPtr pSrc)
@@ -36,18 +39,56 @@ static void VBOXDRIDestroyBuffer(DrawablePtr pDraw, DRI2Buffer2Ptr pBuffer)
     free(pBuffer);
 }
 
+/* We need to pass a constant path string to the screen initialisation function.
+ * The format is hard-coded in "drmOpen" in libdrm, and libdrm contains a
+ * comment to say that open should be done manually in future and not using
+ * "drmOpen", so we will do it manually but also hard-coding the format.  The
+ * maximum minor number (15) is also hard-coded. */
+#define PATH(minor) "/dev/dri/card" #minor
+const char *devicePaths[] =
+{
+    PATH(0), PATH(1), PATH(2), PATH(3), PATH(4), PATH(5), PATH(6), PATH(7),
+    PATH(8), PATH(9), PATH(10), PATH(11), PATH(12), PATH(13), PATH(14), PATH(15)
+};
+#undef PATH
+
 /** As long as we are using our fake DRI driver inside of Mesa, we only want
  *  to implement the minimum here to make Mesa load it.  Notably we just set
  *  "DRI2Info.fd" to -1 as we do not need authentication to work. */
 Bool VBOXDRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, VBOXPtr pVBox)
 {
     DRI2InfoRec DRI2Info;
+    unsigned i;
 
     memset(&DRI2Info, 0, sizeof(DRI2Info));
+    pVBox->drmFD = -1;
+    for (i = 0; i < RT_ELEMENTS(devicePaths); ++i)
+    {
+        int fd = open(devicePaths[i], O_RDWR);
+        if (fd >= 0)
+        {
+            drmVersionPtr pVersion = drmGetVersion(fd);
+            if (   pVersion
+                && pVersion->name_len
+                && !strcmp(pVersion->name, VBOX_DRM_DRIVER_NAME)
+                && drmSetMaster(fd) == 0)
+            {
+                TRACE_LOG("Opened drm device %s\n", devicePaths[i]);
+                DRI2Info.deviceName = devicePaths[i];
+                /* Keep the driver open and hope that the path won't change. */
+                pVBox->drmFD = fd;
+                drmFreeVersion(pVersion);
+                break;
+            }
+            close(fd);
+            drmFreeVersion(pVersion);
+        }
+    }
+    if (!DRI2Info.deviceName)
+        return FALSE;
     DRI2Info.version = 3;
-    DRI2Info.fd = -1;
+    DRI2Info.fd = pVBox->drmFD;
     DRI2Info.driverName = VBOX_DRI_DRIVER_NAME;
-    DRI2Info.deviceName = "/dev/dri/card0";  /** @todo: do this right. */
     DRI2Info.CopyRegion = VBOXDRICopyRegion;
     DRI2Info.Wait = NULL;
     DRI2Info.CreateBuffer = VBOXDRICreateBuffer;
@@ -55,8 +96,9 @@ Bool VBOXDRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, VBOXPtr pVBox)
     return DRI2ScreenInit(pScreen, &DRI2Info);
 }
 
-void
-VBOXDRICloseScreen(ScreenPtr pScreen, VBOXPtr pVBox)
+void VBOXDRICloseScreen(ScreenPtr pScreen, VBOXPtr pVBox)
 {
     DRI2CloseScreen(pScreen);
+    if (pVBox->drmFD >= 0)
+        close(pVBox->drmFD);
 }
diff --git a/src/VBox/Debugger/DBGPlugInDarwin.cpp b/src/VBox/Debugger/DBGPlugInDarwin.cpp
new file mode 100644
index 0000000..0898b5c
--- /dev/null
+++ b/src/VBox/Debugger/DBGPlugInDarwin.cpp
@@ -0,0 +1,560 @@
+/* $Id: DBGPlugInDarwin.cpp $ */
+/** @file
+ * DBGPlugInDarwin - Debugger and Guest OS Digger Plugin For Darwin / OS X.
+ */
+
+/*
+ * Copyright (C) 2008-2013 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#define LOG_GROUP LOG_GROUP_DBGF ///@todo add new log group.
+#include "DBGPlugIns.h"
+#include <VBox/vmm/dbgf.h>
+#include <iprt/string.h>
+#include <iprt/mem.h>
+#include <iprt/stream.h>
+#include <iprt/uuid.h>
+#include <iprt/ctype.h>
+#include <iprt/formats/mach-o.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+
+/** @name Internal Darwin structures
+ * @{ */
+
+
+/** @} */
+
+
+/**
+ * Linux guest OS digger instance data.
+ */
+typedef struct DBGDIGGERDARWIN
+{
+    /** Whether the information is valid or not.
+     * (For fending off illegal interface method calls.) */
+    bool fValid;
+
+    /** The address of an kernel version string (there are several).
+     * This is set during probing. */
+    DBGFADDRESS AddrKernelVersion;
+    /** Kernel base address.
+     * This is set during probing. */
+    DBGFADDRESS AddrKernel;
+} DBGDIGGERDARWIN;
+/** Pointer to the linux guest OS digger instance data. */
+typedef DBGDIGGERDARWIN *PDBGDIGGERDARWIN;
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** Validates a 32-bit linux kernel address */
+#define DARWIN32_VALID_ADDRESS(Addr)    ((Addr) > UINT32_C(0x80000000) && (Addr) < UINT32_C(0xfffff000))
+
+/** The max kernel size. */
+#define DARWIN_MAX_KERNEL_SIZE          0x0f000000
+
+/** AppleOsX on little endian ASCII systems. */
+#define DIG_DARWIN_MOD_TAG              UINT64_C(0x58734f656c707041)
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+static DECLCALLBACK(int)  dbgDiggerDarwinInit(PUVM pUVM, void *pvData);
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** Table of common linux kernel addresses. */
+static uint64_t g_au64LnxKernelAddresses[] =
+{
+    UINT64_C(0xc0100000),
+    UINT64_C(0x90100000),
+    UINT64_C(0xffffffff80200000)
+};
+
+
+/**
+ * @copydoc DBGFOSREG::pfnQueryInterface
+ */
+static DECLCALLBACK(void *) dbgDiggerDarwinQueryInterface(PUVM pUVM, void *pvData, DBGFOSINTERFACE enmIf)
+{
+    return NULL;
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnQueryVersion
+ */
+static DECLCALLBACK(int)  dbgDiggerDarwinQueryVersion(PUVM pUVM, void *pvData, char *pszVersion, size_t cchVersion)
+{
+    PDBGDIGGERDARWIN pThis = (PDBGDIGGERDARWIN)pvData;
+    Assert(pThis->fValid);
+
+    /*
+     * It's all in the linux banner.
+     */
+    int rc = DBGFR3MemReadString(pUVM, 0, &pThis->AddrKernelVersion, pszVersion, cchVersion);
+    if (RT_SUCCESS(rc))
+    {
+        char *pszEnd = RTStrEnd(pszVersion, cchVersion);
+        AssertReturn(pszEnd, VERR_BUFFER_OVERFLOW);
+        while (     pszEnd > pszVersion
+               &&   RT_C_IS_SPACE(pszEnd[-1]))
+            pszEnd--;
+        *pszEnd = '\0';
+    }
+    else
+        RTStrPrintf(pszVersion, cchVersion, "DBGFR3MemRead -> %Rrc", rc);
+
+    return rc;
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnTerm
+ */
+static DECLCALLBACK(void)  dbgDiggerDarwinTerm(PUVM pUVM, void *pvData)
+{
+    PDBGDIGGERDARWIN pThis = (PDBGDIGGERDARWIN)pvData;
+
+    pThis->fValid = false;
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnRefresh
+ */
+static DECLCALLBACK(int)  dbgDiggerDarwinRefresh(PUVM pUVM, void *pvData)
+{
+    PDBGDIGGERDARWIN pThis = (PDBGDIGGERDARWIN)pvData;
+    NOREF(pThis);
+    Assert(pThis->fValid);
+
+    /*
+     * For now we'll flush and reload everything.
+     */
+    dbgDiggerDarwinTerm(pUVM, pvData);
+    return dbgDiggerDarwinInit(pUVM, pvData);
+}
+
+
+/**
+ * Helper function that validates a segment (or section) name.
+ *
+ * @returns true if valid, false if not.
+ * @param   pszName             The name string.
+ * @param   cbName              The size of the string, including terminator.
+ */
+static bool dbgDiggerDarwinIsValidSegOrSectName(const char *pszName, size_t cbName)
+{
+    /* ascii chars */
+    char ch;
+    size_t off = 0;
+    while (off < cbName && (ch = pszName[off]))
+    {
+        if (RT_C_IS_CNTRL(ch) || ch > 127)
+            return false;
+        off++;
+    }
+
+    /* Not empty nor 100% full. */
+    if (off == 0 || off == cbName)
+        return false;
+
+    /* remainder should be zeros. */
+    while (off < cbName)
+    {
+        if (pszName[off])
+            return false;
+        off++;
+    }
+
+    return true;
+}
+
+
+static int dbgDiggerDarwinAddModule(PDBGDIGGERDARWIN pThis, PUVM pUVM, uint64_t uModAddr, const char *pszName)
+{
+    union
+    {
+        uint8_t             ab[2 * X86_PAGE_4K_SIZE];
+        mach_header_64_t    Hdr64;
+        mach_header_32_t    Hdr32;
+    } uBuf;
+
+    /* Read the first page of the image. */
+    DBGFADDRESS ModAddr;
+    int rc = DBGFR3MemRead(pUVM, 0 /*idCpu*/, DBGFR3AddrFromFlat(pUVM, &ModAddr, uModAddr), uBuf.ab, X86_PAGE_4K_SIZE);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /* Validate the header. */
+    AssertCompileMembersSameSizeAndOffset(mach_header_64_t, magic,   mach_header_32_t, magic);
+    if (   uBuf.Hdr64.magic != IMAGE_MACHO64_SIGNATURE
+        && uBuf.Hdr32.magic != IMAGE_MACHO32_SIGNATURE)
+        return VERR_INVALID_EXE_SIGNATURE;
+    AssertCompileMembersSameSizeAndOffset(mach_header_64_t, cputype, mach_header_32_t, cputype);
+    bool f64Bit = uBuf.Hdr64.magic == IMAGE_MACHO64_SIGNATURE;
+    if (uBuf.Hdr32.cputype != (f64Bit ? CPU_TYPE_X86_64 : CPU_TYPE_I386))
+        return VERR_LDR_ARCH_MISMATCH;
+    AssertCompileMembersSameSizeAndOffset(mach_header_64_t, filetype, mach_header_32_t, filetype);
+    if (   uBuf.Hdr32.filetype != MH_EXECUTE
+        && uBuf.Hdr32.filetype != (f64Bit ? MH_KEXT_BUNDLE : MH_OBJECT))
+        return VERR_BAD_EXE_FORMAT;
+    AssertCompileMembersSameSizeAndOffset(mach_header_64_t, ncmds, mach_header_32_t, ncmds);
+    if (uBuf.Hdr32.ncmds > 256)
+        return VERR_BAD_EXE_FORMAT;
+    AssertCompileMembersSameSizeAndOffset(mach_header_64_t, sizeofcmds, mach_header_32_t, sizeofcmds);
+    if (uBuf.Hdr32.sizeofcmds > X86_PAGE_4K_SIZE * 2 - sizeof(mach_header_64_t))
+        return VERR_BAD_EXE_FORMAT;
+
+    /* Do we need to read a 2nd page to get all the load commands? If so, do it. */
+    if (uBuf.Hdr32.sizeofcmds + (f64Bit ? sizeof(mach_header_64_t) : sizeof(mach_header_32_t)) > X86_PAGE_4K_SIZE)
+    {
+        rc = DBGFR3MemRead(pUVM, 0 /*idCpu*/, DBGFR3AddrFromFlat(pUVM, &ModAddr, uModAddr + X86_PAGE_4K_SIZE),
+                           &uBuf.ab[X86_PAGE_4K_SIZE], X86_PAGE_4K_SIZE);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    /*
+     * Process the load commands.
+     */
+    RTDBGSEGMENT    aSegs[12];
+    uint32_t        cSegs  = 0;
+    RTUUID          Uuid   = RTUUID_INITIALIZE_NULL;
+    uint32_t        cLeft  = uBuf.Hdr32.ncmds;
+    uint32_t        cbLeft = uBuf.Hdr32.sizeofcmds;
+    union
+    {
+        uint8_t const              *pb;
+        load_command_t const       *pGenric;
+        segment_command_32_t const *pSeg32;
+        segment_command_64_t const *pSeg64;
+        section_32_t const         *pSect32;
+        section_64_t const         *pSect64;
+        symtab_command_t const     *pSymTab;
+        uuid_command_t const       *pUuid;
+    } uLCmd;
+    uLCmd.pb = &uBuf.ab[f64Bit ? sizeof(mach_header_64_t) : sizeof(mach_header_32_t)];
+
+    while (cLeft-- > 0)
+    {
+        uint32_t const cbCmd = uLCmd.pGenric->cmdsize;
+        if (cbCmd > cbLeft || cbCmd < sizeof(load_command_t))
+            return VERR_BAD_EXE_FORMAT;
+
+        switch (uLCmd.pGenric->cmd)
+        {
+            case LC_SEGMENT_32:
+                if (cbCmd != sizeof(segment_command_32_t) + uLCmd.pSeg32->nsects * sizeof(section_32_t))
+                    return VERR_BAD_EXE_FORMAT;
+                if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg32->segname, sizeof(uLCmd.pSeg32->segname)))
+                    return VERR_INVALID_NAME;
+                if (!strcmp(uLCmd.pSeg32->segname, "__LINKEDIT"))
+                    continue; /* This usually is discarded or not loaded at all. */
+                if (cSegs >= RT_ELEMENTS(aSegs))
+                    return VERR_BUFFER_OVERFLOW;
+                aSegs[cSegs].Address = uLCmd.pSeg32->vmaddr;
+                aSegs[cSegs].uRva    = uLCmd.pSeg32->vmaddr - uModAddr;
+                aSegs[cSegs].cb      = uLCmd.pSeg32->vmsize;
+                aSegs[cSegs].fFlags  = uLCmd.pSeg32->flags; /* Abusing the flags field here... */
+                aSegs[cSegs].iSeg    = cSegs;
+                AssertCompile(RTDBG_SEGMENT_NAME_LENGTH > sizeof(uLCmd.pSeg32->segname));
+                strcpy(aSegs[cSegs].szName, uLCmd.pSeg32->segname);
+                cSegs++;
+                break;
+
+            case LC_SEGMENT_64:
+                if (cbCmd != sizeof(segment_command_64_t) + uLCmd.pSeg64->nsects * sizeof(section_64_t))
+                    return VERR_BAD_EXE_FORMAT;
+                if (!dbgDiggerDarwinIsValidSegOrSectName(uLCmd.pSeg64->segname, sizeof(uLCmd.pSeg64->segname)))
+                    return VERR_INVALID_NAME;
+                if (!strcmp(uLCmd.pSeg64->segname, "__LINKEDIT"))
+                    continue; /* This usually is discarded or not loaded at all. */
+                if (cSegs >= RT_ELEMENTS(aSegs))
+                    return VERR_BUFFER_OVERFLOW;
+                aSegs[cSegs].Address = uLCmd.pSeg64->vmaddr;
+                aSegs[cSegs].uRva    = uLCmd.pSeg64->vmaddr - uModAddr;
+                aSegs[cSegs].cb      = uLCmd.pSeg64->vmsize;
+                aSegs[cSegs].fFlags  = uLCmd.pSeg64->flags; /* Abusing the flags field here... */
+                aSegs[cSegs].iSeg    = cSegs;
+                AssertCompile(RTDBG_SEGMENT_NAME_LENGTH > sizeof(uLCmd.pSeg64->segname));
+                strcpy(aSegs[cSegs].szName, uLCmd.pSeg64->segname);
+                cSegs++;
+                break;
+
+            case LC_UUID:
+                if (cbCmd != sizeof(uuid_command_t))
+                    return VERR_BAD_EXE_FORMAT;
+                if (RTUuidIsNull((PCRTUUID)&uLCmd.pUuid->uuid[0]))
+                    return VERR_BAD_EXE_FORMAT;
+                memcpy(&Uuid, &uLCmd.pUuid->uuid[0], sizeof(uLCmd.pUuid->uuid));
+                break;
+
+            default:
+                /* Current known max plus a lot of slack. */
+                if (uLCmd.pGenric->cmd > LC_DYLIB_CODE_SIGN_DRS + 32)
+                    return VERR_BAD_EXE_FORMAT;
+                break;
+        }
+
+        /* next */
+        cbLeft   -= cbCmd;
+        uLCmd.pb += cbCmd;
+    }
+
+    if (cbLeft != 0)
+        return VERR_BAD_EXE_FORMAT;
+
+    /*
+     * Some post processing checks.
+     */
+    uint32_t iSeg;
+    for (iSeg = 0; iSeg < cSegs; iSeg++)
+        if (aSegs[iSeg].Address == uModAddr)
+            break;
+    if (iSeg >= cSegs)
+        return VERR_ADDRESS_CONFLICT;
+
+    /*
+     * Create a debug module.
+     */
+    RTDBGMOD hMod;
+    rc = RTDbgModCreateFromMachOImage(&hMod, pszName, NULL, f64Bit ? RTLDRARCH_AMD64 : RTLDRARCH_X86_32, 0 /*cbImage*/,
+                                      cSegs, aSegs, &Uuid, DBGFR3AsGetConfig(pUVM), RTDBGMOD_F_NOT_DEFERRED);
+
+    if (RT_FAILURE(rc))
+    {
+        /*
+         * Final fallback is a container module.
+         */
+        rc = RTDbgModCreate(&hMod, pszName, 0, 0);
+        if (RT_FAILURE(rc))
+            return rc;
+
+        uint64_t uRvaNext = 0;
+        for (iSeg = 0; iSeg < cSegs && RT_SUCCESS(rc); iSeg++)
+        {
+            if (   aSegs[iSeg].uRva > uRvaNext
+                && aSegs[iSeg].uRva - uRvaNext < _1M)
+                uRvaNext = aSegs[iSeg].uRva;
+            rc = RTDbgModSegmentAdd(hMod, aSegs[iSeg].uRva, aSegs[iSeg].cb, aSegs[iSeg].szName, 0, NULL);
+            if (aSegs[iSeg].cb > 0 && RT_SUCCESS(rc))
+            {
+                char szTmp[RTDBG_SEGMENT_NAME_LENGTH + sizeof("_start")];
+                strcat(strcpy(szTmp, aSegs[iSeg].szName), "_start");
+                rc = RTDbgModSymbolAdd(hMod, szTmp, iSeg, 0 /*uRva*/, 0 /*cb*/, 0 /*fFlags*/, NULL);
+            }
+            uRvaNext += aSegs[iSeg].cb;
+        }
+
+        if (RT_FAILURE(rc))
+        {
+            RTDbgModRelease(hMod);
+            return rc;
+        }
+    }
+
+    /* Tag the module. */
+    rc = RTDbgModSetTag(hMod, DIG_DARWIN_MOD_TAG);
+    AssertRC(rc);
+
+    /*
+     * Link the module.
+     */
+    RTDBGAS hAs = DBGFR3AsResolveAndRetain(pUVM, DBGF_AS_KERNEL);
+    if (hAs != NIL_RTDBGAS)
+    {
+        uint64_t uRvaNext = 0;
+        uint32_t cLinked  = 0;
+        for (iSeg = 0; iSeg < cSegs; iSeg++)
+            if (aSegs[iSeg].cb)
+            {
+                int rc2 = RTDbgAsModuleLinkSeg(hAs, hMod, iSeg, aSegs[iSeg].Address, RTDBGASLINK_FLAGS_REPLACE /*fFlags*/);
+                if (RT_SUCCESS(rc2))
+                    cLinked++;
+                else if (RT_SUCCESS(rc))
+                    rc = rc2;
+            }
+        if (RT_FAILURE(rc) && cLinked != 0)
+            rc = -rc;
+    }
+    else
+        rc = VERR_INTERNAL_ERROR;
+    RTDbgModRelease(hMod);
+    RTDbgAsRelease(hAs);
+
+    return rc;
+}
+
+/**
+ * @copydoc DBGFOSREG::pfnInit
+ */
+static DECLCALLBACK(int)  dbgDiggerDarwinInit(PUVM pUVM, void *pvData)
+{
+    PDBGDIGGERDARWIN pThis = (PDBGDIGGERDARWIN)pvData;
+    Assert(!pThis->fValid);
+
+    /*
+     * Add the kernel module (and later the other kernel modules we can find).
+     */
+    int rc = dbgDiggerDarwinAddModule(pThis, pUVM, pThis->AddrKernel.FlatPtr, "mach_kernel");
+    if (RT_SUCCESS(rc))
+    {
+        /** @todo  */
+        pThis->fValid = true;
+        return VINF_SUCCESS;
+    }
+
+    return rc;
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnProbe
+ */
+static DECLCALLBACK(bool)  dbgDiggerDarwinProbe(PUVM pUVM, void *pvData)
+{
+    PDBGDIGGERDARWIN pThis = (PDBGDIGGERDARWIN)pvData;
+
+    /*
+     * Look for a section + segment combo that normally only occures in
+     * mach_kernel.  Follow it up with probing of the rest of the executable
+     * header.  We must search a largish area because the more recent versions
+     * of darwin have random load address for security raisins.
+     */
+    static struct { uint64_t uStart, uEnd; } const s_aRanges[] =
+    {
+        /* 64-bit: */
+        { UINT64_C(0xffffff8000000000), UINT64_C(0xffffff81ffffffff), },
+
+        /* 32-bit - always search for this because of the hybrid 32-bit kernel
+           with cpu in long mode that darwin used for a number of versions. */
+        { UINT64_C(0x00001000), UINT64_C(0x0ffff000), }
+    };
+    for (unsigned iRange = DBGFR3CpuGetMode(pUVM, 0 /*idCpu*/) != CPUMMODE_LONG;
+          iRange < RT_ELEMENTS(s_aRanges);
+          iRange++)
+    {
+        DBGFADDRESS     KernelAddr;
+        for (DBGFR3AddrFromFlat(pUVM, &KernelAddr, s_aRanges[iRange].uStart);
+             KernelAddr.FlatPtr < s_aRanges[iRange].uEnd;
+             KernelAddr.FlatPtr += X86_PAGE_4K_SIZE)
+        {
+            static const uint8_t s_abNeedle[16 + 16] =
+            {
+                '_','_','t','e','x','t',  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, /* section_32_t::sectname */
+                '_','_','K','L','D',  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, /* section_32_t::segname. */
+            };
+
+            int rc = DBGFR3MemScan(pUVM, 0 /*idCpu*/, &KernelAddr, s_aRanges[iRange].uEnd - KernelAddr.FlatPtr,
+                                   1, s_abNeedle, sizeof(s_abNeedle), &KernelAddr);
+            if (RT_FAILURE(rc))
+                break;
+            DBGFR3AddrSub(&KernelAddr, KernelAddr.FlatPtr & X86_PAGE_4K_OFFSET_MASK);
+
+            /*
+             * Read the first page of the image and check the headers.
+             */
+            union
+            {
+                uint8_t             ab[X86_PAGE_4K_SIZE];
+                mach_header_64_t    Hdr64;
+                mach_header_32_t    Hdr32;
+            } uBuf;
+            rc = DBGFR3MemRead(pUVM, 0 /*idCpu*/, &KernelAddr, uBuf.ab, X86_PAGE_4K_SIZE);
+            if (RT_FAILURE(rc))
+                continue;
+            AssertCompileMembersSameSizeAndOffset(mach_header_64_t, magic,   mach_header_32_t, magic);
+            if (   uBuf.Hdr64.magic != IMAGE_MACHO64_SIGNATURE
+                && uBuf.Hdr32.magic != IMAGE_MACHO32_SIGNATURE)
+                continue;
+            AssertCompileMembersSameSizeAndOffset(mach_header_64_t, cputype, mach_header_32_t, cputype);
+            bool f64Bit = uBuf.Hdr64.magic == IMAGE_MACHO64_SIGNATURE;
+            if (uBuf.Hdr32.cputype != (f64Bit ? CPU_TYPE_X86_64 : CPU_TYPE_I386))
+                continue;
+            AssertCompileMembersSameSizeAndOffset(mach_header_64_t, filetype, mach_header_32_t, filetype);
+            if (uBuf.Hdr32.filetype != MH_EXECUTE)
+                continue;
+            AssertCompileMembersSameSizeAndOffset(mach_header_64_t, ncmds, mach_header_32_t, ncmds);
+            if (uBuf.Hdr32.ncmds > 256)
+                continue;
+            AssertCompileMembersSameSizeAndOffset(mach_header_64_t, sizeofcmds, mach_header_32_t, sizeofcmds);
+            if (uBuf.Hdr32.sizeofcmds > X86_PAGE_4K_SIZE - sizeof(mach_header_64_t))
+                continue;
+
+            /* Seems good enough for now.
+
+               If the above causes false positives, check the segments and make
+               sure there is a kernel version string in the right one. */
+            pThis->AddrKernel = KernelAddr;
+
+            /*
+             * Finally, find the kernel version string.
+             */
+            rc = DBGFR3MemScan(pUVM, 0 /*idCpu*/, &KernelAddr, 32*_1M, 1, RT_STR_TUPLE("Darwin Kernel Version"),
+                               &pThis->AddrKernelVersion);
+            if (RT_FAILURE(rc))
+                DBGFR3AddrFromFlat(pUVM, &pThis->AddrKernelVersion, 0);
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnDestruct
+ */
+static DECLCALLBACK(void)  dbgDiggerDarwinDestruct(PUVM pUVM, void *pvData)
+{
+
+}
+
+
+/**
+ * @copydoc DBGFOSREG::pfnConstruct
+ */
+static DECLCALLBACK(int)  dbgDiggerDarwinConstruct(PUVM pUVM, void *pvData)
+{
+    return VINF_SUCCESS;
+}
+
+
+const DBGFOSREG g_DBGDiggerDarwin =
+{
+    /* .u32Magic = */           DBGFOSREG_MAGIC,
+    /* .fFlags = */             0,
+    /* .cbData = */             sizeof(DBGDIGGERDARWIN),
+    /* .szName = */             "Darwin",
+    /* .pfnConstruct = */       dbgDiggerDarwinConstruct,
+    /* .pfnDestruct = */        dbgDiggerDarwinDestruct,
+    /* .pfnProbe = */           dbgDiggerDarwinProbe,
+    /* .pfnInit = */            dbgDiggerDarwinInit,
+    /* .pfnRefresh = */         dbgDiggerDarwinRefresh,
+    /* .pfnTerm = */            dbgDiggerDarwinTerm,
+    /* .pfnQueryVersion = */    dbgDiggerDarwinQueryVersion,
+    /* .pfnQueryInterface = */  dbgDiggerDarwinQueryInterface,
+    /* .u32EndMagic = */        DBGFOSREG_MAGIC
+};
+
diff --git a/src/VBox/Debugger/DBGPlugInDiggers.cpp b/src/VBox/Debugger/DBGPlugInDiggers.cpp
index 0622431..f01626d 100644
--- a/src/VBox/Debugger/DBGPlugInDiggers.cpp
+++ b/src/VBox/Debugger/DBGPlugInDiggers.cpp
@@ -31,6 +31,7 @@ DECLEXPORT(int) DBGCPlugInEntry(DBGCPLUGINOP enmOperation, PUVM pUVM, uintptr_t
 {
     static PCDBGFOSREG s_aPlugIns[] =
     {
+        &g_DBGDiggerDarwin,
         //&g_DBGDiggerFreeBSD,
         &g_DBGDiggerLinux,
         &g_DBGDiggerOS2,
diff --git a/src/VBox/Debugger/DBGPlugIns.h b/src/VBox/Debugger/DBGPlugIns.h
index bbb4a9d..f467d28 100644
--- a/src/VBox/Debugger/DBGPlugIns.h
+++ b/src/VBox/Debugger/DBGPlugIns.h
@@ -7,7 +7,7 @@
  */
 
 /*
- * Copyright (C) 2008-2010 Oracle Corporation
+ * Copyright (C) 2008-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,7 +25,8 @@
 
 RT_C_DECLS_BEGIN
 
-extern const DBGFOSREG g_DBGDiggerFreeBSD;
+//extern const DBGFOSREG g_DBGDiggerFreeBSD;
+extern const DBGFOSREG g_DBGDiggerDarwin;
 extern const DBGFOSREG g_DBGDiggerLinux;
 extern const DBGFOSREG g_DBGDiggerOS2;
 extern const DBGFOSREG g_DBGDiggerSolaris;
diff --git a/src/VBox/Debugger/Makefile.kmk b/src/VBox/Debugger/Makefile.kmk
index 6492b2e..7a4df62 100644
--- a/src/VBox/Debugger/Makefile.kmk
+++ b/src/VBox/Debugger/Makefile.kmk
@@ -60,6 +60,7 @@ DLLS += DBGCPlugInDiggers
 DBGCPlugInDiggers_TEMPLATE = VBOXR3
 DBGCPlugInDiggers_SOURCES = \
 	DBGPlugInDiggers.cpp \
+	DBGPlugInDarwin.cpp \
 	DBGPlugInLinux.cpp \
 	DBGPlugInSolaris.cpp \
 	DBGPlugInWinNt.cpp \
diff --git a/src/VBox/Devices/Audio/DevIchHda.cpp b/src/VBox/Devices/Audio/DevIchHda.cpp
index dd8c84a..0ea477a 100644
--- a/src/VBox/Devices/Audio/DevIchHda.cpp
+++ b/src/VBox/Devices/Audio/DevIchHda.cpp
@@ -2996,7 +2996,7 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
     rc = PDMDevHlpPCIRegisterMsi(pDevIns, &MsiReg);
     if (RT_FAILURE(rc))
     {
-        LogRel(("Chipset cannot do MSI: %Rrc\n", rc));
+        /* That's OK, we can work without MSI */
         PCIDevSetCapabilityList(&pThis->PciDev, 0x50);
     }
 #endif
diff --git a/src/VBox/Devices/BiosCommonCode/MakeAlternativeSource.cpp b/src/VBox/Devices/BiosCommonCode/MakeAlternativeSource.cpp
index 8b86e87..497009f 100644
--- a/src/VBox/Devices/BiosCommonCode/MakeAlternativeSource.cpp
+++ b/src/VBox/Devices/BiosCommonCode/MakeAlternativeSource.cpp
@@ -999,12 +999,12 @@ static bool disCode(uint32_t uFlatAddr, uint32_t cb, bool fIs16Bit)
                      && pb[4] == 0x6e
                      && pb[5] == 0x65
                     )
-                 || (   pb[0] == 0xc9   /* _pci16_function switch */
-                     && pb[1] == 0x8d
-                     && pb[2] == 0xe3
-                     && pb[3] == 0x8d
-                     && pb[4] == 0xf6
-                     && pb[5] == 0x8d
+                 || (   pb[0] == 0xff   /* _pci16_function switch */
+                     && pb[1] == 0x91
+                     && pb[2] == 0x19
+                     && pb[3] == 0x92
+                     && pb[4] == 0x2c
+                     && pb[5] == 0x92
                      )
                  || (   pb[0] == 0xa3   /* _int1a_function switch */
                      && pb[1] == 0x67
diff --git a/src/VBox/Devices/Bus/DevPciIch9.cpp b/src/VBox/Devices/Bus/DevPciIch9.cpp
index 8fe2200..cb0e947 100644
--- a/src/VBox/Devices/Bus/DevPciIch9.cpp
+++ b/src/VBox/Devices/Bus/DevPciIch9.cpp
@@ -196,6 +196,7 @@ DECLINLINE(void) ich9pciStateToPciAddr(PICH9PCIGLOBALS pGlobals, RTGCPHYS addr,
 
 PDMBOTHCBDECL(void) ich9pciSetIrq(PPDMDEVINS pDevIns, PPCIDEVICE pPciDev, int iIrq, int iLevel, uint32_t uTagSrc)
 {
+    LogFlowFunc(("invoked by %p/%d: iIrq=%d iLevel=%d uTagSrc=%#x\n", pDevIns, pDevIns->iInstance, iIrq, iLevel, uTagSrc));
     ich9pciSetIrqInternal(PDMINS_2_DATA(pDevIns, PICH9PCIGLOBALS), pPciDev->devfn, pPciDev, iIrq, iLevel, uTagSrc);
 }
 
@@ -557,12 +558,14 @@ static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCI
     {
         if (MsiIsEnabled(pPciDev))
         {
+            LogFlowFunc(("PCI Dev %p : MSI\n", pPciDev));
             PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns);
             MsiNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc);
         }
 
         if (MsixIsEnabled(pPciDev))
         {
+            LogFlowFunc(("PCI Dev %p : MSI-X\n", pPciDev));
             PPDMDEVINS pDevIns = pGlobals->aPciBus.CTX_SUFF(pDevIns);
             MsixNotify(pDevIns, pGlobals->aPciBus.CTX_SUFF(pPciHlp), pPciDev, iIrq, iLevel, uTagSrc);
         }
@@ -572,6 +575,7 @@ static void ich9pciSetIrqInternal(PICH9PCIGLOBALS pGlobals, uint8_t uDevFn, PPCI
     PICH9PCIBUS     pBus      =     &pGlobals->aPciBus;
     const bool  fIsAcpiDevice = PCIDevGetDeviceId(pPciDev) == 0x7113;
 
+    LogFlowFunc(("PCI Dev %p : IRQ\n", pPciDev));
     /* Check if the state changed. */
     if (pPciDev->Int.s.uIrqPinState != iLevel)
     {
@@ -2241,19 +2245,29 @@ static void ich9pciBusInfo(PICH9PCIBUS pBus, PCDBGFINFOHLP pHlp, int iIndent, bo
              * For passthrough devices MSI/MSI-X mostly reflects the way interrupts delivered to the guest,
              * as host driver handles real devices interrupts.
              */
-            pHlp->pfnPrintf(pHlp, "%02x:%02x:%02x %s%s: %04x-%04x%s%s",
+            pHlp->pfnPrintf(pHlp, "%02x:%02x:%02x %s%s: %04x-%04x",
                             pBus->iBus, (iDev >> 3) & 0xff, iDev & 0x7,
                             pPciDev->name,
                             pciDevIsPassthrough(pPciDev) ? " (PASSTHROUGH)" : "",
-                            ich9pciGetWord(pPciDev, VBOX_PCI_VENDOR_ID), ich9pciGetWord(pPciDev, VBOX_PCI_DEVICE_ID),
-                            pciDevIsMsiCapable(pPciDev)  ? " MSI" : "",
-                            pciDevIsMsixCapable(pPciDev) ? " MSI-X" : ""
+                            ich9pciGetWord(pPciDev, VBOX_PCI_VENDOR_ID), ich9pciGetWord(pPciDev, VBOX_PCI_DEVICE_ID)
                             );
             if (ich9pciGetByte(pPciDev, VBOX_PCI_INTERRUPT_PIN) != 0)
                 pHlp->pfnPrintf(pHlp, " IRQ%d", ich9pciGetByte(pPciDev, VBOX_PCI_INTERRUPT_LINE));
-
             pHlp->pfnPrintf(pHlp, "\n");
 
+            if (pciDevIsMsiCapable(pPciDev) || pciDevIsMsixCapable(pPciDev))
+            {
+                printIndent(pHlp, iIndent + 2);
+
+                if (pciDevIsMsiCapable(pPciDev))
+                    pHlp->pfnPrintf(pHlp, "MSI:%s ", MsiIsEnabled(pPciDev) ? "on" : "off");
+
+                if (pciDevIsMsixCapable(pPciDev))
+                    pHlp->pfnPrintf(pHlp, "MSI-X:%s ", MsixIsEnabled(pPciDev) ? "on" : "off");
+
+                pHlp->pfnPrintf(pHlp, "\n");
+            }
+
             uint16_t iCmd = ich9pciGetWord(pPciDev, VBOX_PCI_COMMAND);
             if ((iCmd & (VBOX_PCI_COMMAND_IO | VBOX_PCI_COMMAND_MEMORY)) != 0)
             {
@@ -2294,8 +2308,8 @@ static void ich9pciBusInfo(PICH9PCIBUS pBus, PCDBGFINFOHLP pHlp, int iIndent, bo
 
             printIndent(pHlp, iIndent + 2);
             uint16_t iStatus = ich9pciGetWord(pPciDev, VBOX_PCI_STATUS);
-            pHlp->pfnPrintf(pHlp, "Command: %.*Rhxs, Status: %.*Rhxs\n",
-                            sizeof(uint16_t), &iCmd, sizeof(uint16_t), &iStatus);
+            pHlp->pfnPrintf(pHlp, "Command: %04X, Status: %04X\n",
+                            iCmd, iStatus);
             printIndent(pHlp, iIndent + 2);
             pHlp->pfnPrintf(pHlp, "Bus master: %s\n",
                             iCmd & VBOX_PCI_COMMAND_MASTER ? "Yes" : "No");
@@ -2567,9 +2581,10 @@ static void ich9pciResetDevice(PPCIDEVICE pDev)
         PCIDevSetCommand(pDev,
                          PCIDevGetCommand(pDev)
                          &
-                         ~(VBOX_PCI_COMMAND_IO |
-                           VBOX_PCI_COMMAND_MEMORY |
-                           VBOX_PCI_COMMAND_MASTER));
+                         ~(VBOX_PCI_COMMAND_IO | VBOX_PCI_COMMAND_MEMORY |
+                           VBOX_PCI_COMMAND_MASTER | VBOX_PCI_COMMAND_SPECIAL |
+                           VBOX_PCI_COMMAND_PARITY | VBOX_PCI_COMMAND_SERR |
+                           VBOX_PCI_COMMAND_FAST_BACK | VBOX_PCI_COMMAND_INTX_DISABLE));
 
         /* Bridge device reset handlers processed later */
         if (!pciDevIsPci2PciBridge(pDev))
@@ -2577,6 +2592,20 @@ static void ich9pciResetDevice(PPCIDEVICE pDev)
             PCIDevSetByte(pDev, VBOX_PCI_CACHE_LINE_SIZE, 0x0);
             PCIDevSetInterruptLine(pDev, 0x0);
         }
+
+        /* Reset MSI message control. */
+        if (pciDevIsMsiCapable(pDev))
+        {
+            /* Extracted from MsiPciConfigWrite(). */
+            pDev->config[pDev->Int.s.u8MsiCapOffset + VBOX_MSI_CAP_MESSAGE_CONTROL] &= 0x8e;
+        }
+
+        /* Reset MSI-X message control. */
+        if (pciDevIsMsixCapable(pDev))
+        {
+            /* Extracted from MsixPciConfigWrite(); no side effects. */
+            pDev->config[pDev->Int.s.u8MsixCapOffset + VBOX_MSIX_CAP_MESSAGE_CONTROL + 1] &= 0x3f;
+        }
     }
 }
 
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Dll/sqlite3.dll b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Dll/sqlite3.dll
deleted file mode 100644
index c99ef99..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Dll/sqlite3.dll and /dev/null differ
diff --git a/src/VBox/Devices/EFI/Firmware/Config.kmk b/src/VBox/Devices/EFI/Firmware/Config.kmk
index 015d348..d5cfcbe 100644
--- a/src/VBox/Devices/EFI/Firmware/Config.kmk
+++ b/src/VBox/Devices/EFI/Firmware/Config.kmk
@@ -70,29 +70,29 @@ endif
 # Make a build program template of our own.
 #
 TEMPLATE_VBoxEfiBldProg = EFI build program.
-TEMPLATE_VBoxEfiBldProg_EXTENDS = VBOXBLDPROG
+TEMPLATE_VBoxEfiBldProg_EXTENDS = VBoxBldProg
 TEMPLATE_VBoxEfiBldProg_INST = EfiBldProgs/
 TEMPLATE_VBoxEfiBldProg_INSTTYPE = stage
-TEMPLATE_VBoxEfiBldProg_INCS = $(TEMPLATE_VBOXBLDPROG_INCS) \
+TEMPLATE_VBoxEfiBldProg_INCS = $(TEMPLATE_VBoxBldProg_INCS) \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C/Include/IndustryStandard \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C/Common \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C/Include \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C
 
-TEMPLATE_VBoxEfiBldProg_INCS.x86 = $(TEMPLATE_VBOXBLDPROG_INCS.x86) \
+TEMPLATE_VBoxEfiBldProg_INCS.x86 = $(TEMPLATE_VBoxBldProg_INCS.x86) \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C/Include/IA32
 
-TEMPLATE_VBoxEfiBldProg_INCS.amd64 = $(TEMPLATE_VBOXBLDPROG_INCS.amd64) \
+TEMPLATE_VBoxEfiBldProg_INCS.amd64 = $(TEMPLATE_VBoxBldProg_INCS.amd64) \
 	$(VBOX_PATH_EFI_FIRMWARE)/BaseTools/Source/C/Include/X64
 
 TEMPLATE_VBoxEfiBldProg_LIBS = \
 	$(VBOX_PATH_STAGE_EFI_BLDPROGS)/EfiBldCommonLib$(VBOX_SUFF_LIB) \
-	$(TEMPLATE_VBOXBLDPROG_LIBS)
+	$(TEMPLATE_VBoxBldProg_LIBS)
 ifn1of ($(KBUILD_HOST),win) # This stuff isn't up to our standard at all! :/
- TEMPLATE_VBoxEfiBldProg_CFLAGS = $(filter-out -pedantic,$(TEMPLATE_VBOXBLDPROG_CFLAGS)) \
+ TEMPLATE_VBoxEfiBldProg_CFLAGS = $(filter-out -pedantic,$(TEMPLATE_VBoxBldProg_CFLAGS)) \
  	-Wno-sign-compare -Wno-missing-prototypes -Wno-strict-prototypes \
 	-Wno-implicit-function-declaration -Wno-missing-declarations -Wno-shadow -Wno-format -Wno-empty-body
- TEMPLATE_VBoxEfiBldProg_CXXFLAGS = $(filter-out -pedantic,$(TEMPLATE_VBOXBLDPROG_CXXFLAGS)) \
+ TEMPLATE_VBoxEfiBldProg_CXXFLAGS = $(filter-out -pedantic,$(TEMPLATE_VBoxBldProg_CXXFLAGS)) \
  	-Wno-all -Wno-shadow -Wno-empty-body
 endif
 
diff --git a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ebc/Fat.efi b/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ebc/Fat.efi
deleted file mode 100644
index 55d6ce5..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ebc/Fat.efi and /dev/null differ
diff --git a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ia32/Fat.efi b/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ia32/Fat.efi
deleted file mode 100644
index d789861..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ia32/Fat.efi and /dev/null differ
diff --git a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ipf/Fat.efi b/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ipf/Fat.efi
deleted file mode 100644
index a4847de..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/Ipf/Fat.efi and /dev/null differ
diff --git a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/X64/Fat.efi b/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/X64/Fat.efi
deleted file mode 100644
index 158e14a..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/FatBinPkg/EnhancedFatDxe/X64/Fat.efi and /dev/null differ
diff --git a/src/VBox/Devices/EFI/Firmware/StdLib/LibC/Main/Ia32/ftol2.obj b/src/VBox/Devices/EFI/Firmware/StdLib/LibC/Main/Ia32/ftol2.obj
deleted file mode 100644
index b96f830..0000000
Binary files a/src/VBox/Devices/EFI/Firmware/StdLib/LibC/Main/Ia32/ftol2.obj and /dev/null differ
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd
index b9660b8..11f72b7 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd differ
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd
index 5629e63..fbf9034 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd differ
diff --git a/src/VBox/Devices/Graphics/BIOS/Makefile.kmk b/src/VBox/Devices/Graphics/BIOS/Makefile.kmk
index 8d8e78e..35f4255 100644
--- a/src/VBox/Devices/Graphics/BIOS/Makefile.kmk
+++ b/src/VBox/Devices/Graphics/BIOS/Makefile.kmk
@@ -115,7 +115,7 @@ $$(VgaBiosBin_0_OUTDIR)/vbetables.h: $(MAKEFILE_CURRENT) $$(vbetables-gen_1_TARG
 # The VBE tables.
 #
 BLDPROGS += vbetables-gen
-vbetables-gen_TEMPLATE = VBOXBLDPROG
+vbetables-gen_TEMPLATE = VBoxBldProg
 vbetables-gen_SOURCES  = vbetables-gen.c
 vbetables-gen_CLEAN    = $(vbetables-gen)
 
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
index fc58a4e..d6b1a58 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
@@ -6781,7 +6781,7 @@ vesa_pm_end:                                 ; 0xc4714 LB 0x1
 
 section _DATA progbits vstart=0x4800 align=1 ; size=0x36e1 class=DATA group=DGROUP
 _msg_vga_init:                               ; 0xc4800 LB 0x2f
-    db  'Oracle VM VirtualBox Version 4.3.12 VGA BIOS', 00dh, 00ah, 000h
+    db  'Oracle VM VirtualBox Version 4.3.14 VGA BIOS', 00dh, 00ah, 000h
 _vga_modes:                                  ; 0xc482f LB 0x80
     db  000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
     db  002h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 003h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
@@ -7669,7 +7669,7 @@ _vbebios_vendor_name:                        ; 0xc7e35 LB 0x13
 _vbebios_product_name:                       ; 0xc7e48 LB 0x21
     db  'Oracle VM VirtualBox VBE Adapter', 000h
 _vbebios_product_revision:                   ; 0xc7e69 LB 0x24
-    db  'Oracle VM VirtualBox Version 4.3.12', 000h
+    db  'Oracle VM VirtualBox Version 4.3.14', 000h
 _vbebios_info_string:                        ; 0xc7e8d LB 0x2b
     db  'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
 _no_vbebios_info_string:                     ; 0xc7eb8 LB 0x29
@@ -7700,4 +7700,4 @@ section CONST2 progbits vstart=0x7ee2 align=1 ; size=0x0 class=DATA group=DGROUP
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
-    db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 064h
+    db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 060h
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
index 37003d9..eabeb72 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
@@ -1 +1 @@
-b29ad6fb20d5895b561c5efdfffa50d9 *VBoxVgaBios.rom
+af44a913be32b08c4e1c43c4c0e58dd3 *VBoxVgaBios.rom
diff --git a/src/VBox/Devices/Graphics/DevVGA.cpp b/src/VBox/Devices/Graphics/DevVGA.cpp
index d42bd62..a21fe7e 100644
--- a/src/VBox/Devices/Graphics/DevVGA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA.cpp
@@ -1696,7 +1696,8 @@ static const uint8_t cursor_glyph[32 * 4] = {
  * - underline
  * - flashing
  */
-static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
+static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
+        PDMIDISPLAYCONNECTOR *pDrv)
 {
     int cx, cy, cheight, cw, ch, cattr, height, width, ch_attr;
     int cx_min, cx_max, linesize, x_incr;
@@ -1749,7 +1750,7 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
         cw = 9;
     if (pThis->sr[1] & 0x08)
         cw = 16; /* NOTE: no 18 pixel wide */
-    x_incr = cw * ((pThis->pDrv->cBits + 7) >> 3);
+    x_incr = cw * ((pDrv->cBits + 7) >> 3);
     width = (pThis->cr[0x01] + 1);
     if (pThis->cr[0x06] == 100) {
         /* ugly hack for CGA 160x100x16 - explain me the logic */
@@ -1775,7 +1776,7 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
         pThis->last_scr_width = width * cw;
         pThis->last_scr_height = height * cheight;
         /* For text modes the direct use of guest VRAM is not implemented, so bpp and cbLine are 0 here. */
-        int rc = pThis->pDrv->pfnResize(pThis->pDrv, 0, NULL, 0, pThis->last_scr_width, pThis->last_scr_height);
+        int rc = pDrv->pfnResize(pDrv, 0, NULL, 0, pThis->last_scr_width, pThis->last_scr_height);
         pThis->last_width = width;
         pThis->last_height = height;
         pThis->last_ch = cheight;
@@ -1800,15 +1801,15 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
         pThis->cursor_end = pThis->cr[0xb];
     }
     cursor_ptr = pThis->CTX_SUFF(vram_ptr) + (pThis->start_addr + cursor_offset) * 8;
-    depth_index = get_depth_index(pThis->pDrv->cBits);
+    depth_index = get_depth_index(pDrv->cBits);
     if (cw == 16)
         vga_draw_glyph8 = vga_draw_glyph16_table[depth_index];
     else
         vga_draw_glyph8 = vga_draw_glyph8_table[depth_index];
     vga_draw_glyph9 = vga_draw_glyph9_table[depth_index];
 
-    dest = pThis->pDrv->pu8Data;
-    linesize = pThis->pDrv->cbScanline;
+    dest = pDrv->pu8Data;
+    linesize = pDrv->cbScanline;
     ch_attr_ptr = pThis->last_ch_attr;
     cy_start = -1;
     cx_max_upd = -1;
@@ -1889,7 +1890,7 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
                 cx_max_upd = cx_max;
         } else if (cy_start >= 0) {
             /* Flush updates to display. */
-            pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight,
+            pDrv->pfnUpdateRect(pDrv, cx_min_upd * cw, cy_start * cheight,
                                        (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);
             cy_start = -1;
             cx_max_upd = -1;
@@ -1900,7 +1901,7 @@ static int vga_draw_text(PVGASTATE pThis, bool full_update, bool fFailOnResize,
     }
     if (cy_start >= 0)
         /* Flush any remaining changes to display. */
-        pThis->pDrv->pfnUpdateRect(pThis->pDrv, cx_min_upd * cw, cy_start * cheight,
+        pDrv->pfnUpdateRect(pDrv, cx_min_upd * cw, cy_start * cheight,
                                    (cx_max_upd - cx_min_upd + 1) * cw, (cy - cy_start) * cheight);
         return VINF_SUCCESS;
 }
@@ -2018,7 +2019,8 @@ static void vga_get_resolution(PVGASTATE pThis, int *pwidth, int *pheight)
  * @param   cx      The width.
  * @param   cy      The height.
  */
-static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy)
+static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy,
+                PDMIDISPLAYCONNECTOR *pDrv)
 {
     const unsigned cBits = pThis->get_bpp(pThis);
 
@@ -2045,7 +2047,7 @@ static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy)
         /* Skip the resize if the values are not valid. */
         if (pThis->start_addr * 4 + pThis->line_offset * cy < pThis->vram_size)
             /* Take into account the programmed start address (in DWORDs) of the visible screen. */
-            rc = pThis->pDrv->pfnResize(pThis->pDrv, cBits, pThis->CTX_SUFF(vram_ptr) + pThis->start_addr * 4, pThis->line_offset, cx, cy);
+            rc = pDrv->pfnResize(pDrv, cBits, pThis->CTX_SUFF(vram_ptr) + pThis->start_addr * 4, pThis->line_offset, cx, cy);
         else
         {
             /* Change nothing in the VGA state. Lets hope the guest will eventually programm correct values. */
@@ -2065,7 +2067,7 @@ static int vga_resize_graphic(PVGASTATE pThis, int cx, int cy)
     AssertRC(rc);
 
     /* update palette */
-    switch (pThis->pDrv->cBits)
+    switch (pDrv->cBits)
     {
         case 32:    pThis->rgb_to_pixel = rgb_to_pixel32_dup; break;
         case 16:
@@ -2149,7 +2151,8 @@ int vgaR3UpdateDisplay(VGAState *s, unsigned xStart, unsigned yStart, unsigned w
 /*
  * graphic modes
  */
-static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
+static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
+                PDMIDISPLAYCONNECTOR *pDrv)
 {
     int y, page_min, page_max, linesize, y_start;
     int width, height, page0, page1, bwidth, bits;
@@ -2194,7 +2197,7 @@ static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnRe
         bits = 32;
         break;
     }
-    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)];
+    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pDrv->cBits)];
 
     if (pThis->cursor_invalidate)
         pThis->cursor_invalidate(pThis);
@@ -2204,8 +2207,8 @@ static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnRe
     y_start = -1;
     page_min = 0x7fffffff;
     page_max = -1;
-    d = pThis->pDrv->pu8Data;
-    linesize = pThis->pDrv->cbScanline;
+    d = pDrv->pu8Data;
+    linesize = pDrv->cbScanline;
 
     for(y = 0; y < height; y++) 
     {
@@ -2237,7 +2240,7 @@ static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnRe
             {
                 /* flush to display */
                 Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
-                pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
+                pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
                 y_start = -1;
             }
         }
@@ -2247,7 +2250,7 @@ static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnRe
     {
         /* flush to display */
         Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
-        pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
+        pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
     }
     /* reset modified pages */
     if (page_max != -1 && reset_dirty)
@@ -2260,7 +2263,8 @@ static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnRe
 /*
  * graphic modes
  */
-static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
+static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty,
+                PDMIDISPLAYCONNECTOR *pDrv)
 {
     int y1, y2, y, page_min, page_max, linesize, y_start, double_scan;
     int width, height, shift_control, line_offset, page0, page1, bwidth, bits;
@@ -2345,12 +2349,12 @@ static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResiz
             /* The caller does not want to call the pfnResize. */
             return VERR_TRY_AGAIN;
         }
-        int rc = vga_resize_graphic(pThis, disp_width, height);
+        int rc = vga_resize_graphic(pThis, disp_width, height, pDrv);
         if (rc != VINF_SUCCESS)  /* Return any rc, particularly VINF_VGA_RESIZE_IN_PROGRESS, to the caller. */
             return rc;
         full_update = true;
     }
-    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)];
+    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pDrv->cBits)];
 
     if (pThis->cursor_invalidate)
         pThis->cursor_invalidate(pThis);
@@ -2365,8 +2369,8 @@ static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResiz
     y_start = -1;
     page_min = 0x7fffffff;
     page_max = -1;
-    d = pThis->pDrv->pu8Data;
-    linesize = pThis->pDrv->cbScanline;
+    d = pDrv->pu8Data;
+    linesize = pDrv->cbScanline;
 
     y1 = 0;
     y2 = pThis->cr[0x09] & 0x1F;    /* starting row scan count */
@@ -2404,7 +2408,7 @@ static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResiz
         } else {
             if (y_start >= 0) {
                 /* flush to display */
-                pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
+                pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
                 y_start = -1;
             }
         }
@@ -2428,7 +2432,7 @@ static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResiz
     }
     if (y_start >= 0) {
         /* flush to display */
-        pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
+        pDrv->pfnUpdateRect(pDrv, 0, y_start, disp_width, y - y_start);
     }
     /* reset modified pages */
     if (page_max != -1 && reset_dirty) {
@@ -2438,24 +2442,24 @@ static int vga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResiz
     return VINF_SUCCESS;
 }
 
-static void vga_draw_blank(PVGASTATE pThis, int full_update)
+static void vga_draw_blank(PVGASTATE pThis, int full_update, PDMIDISPLAYCONNECTOR *pDrv)
 {
     int i, w, val;
     uint8_t *d;
-    uint32_t cbScanline = pThis->pDrv->cbScanline;
+    uint32_t cbScanline = pDrv->cbScanline;
 
-    if (pThis->pDrv->pu8Data == pThis->vram_ptrR3) /* Do not clear the VRAM itself. */
+    if (pDrv->pu8Data == pThis->vram_ptrR3) /* Do not clear the VRAM itself. */
         return;
     if (!full_update)
         return;
     if (pThis->last_scr_width <= 0 || pThis->last_scr_height <= 0)
         return;
-    if (pThis->pDrv->cBits == 8)
+    if (pDrv->cBits == 8)
         val = pThis->rgb_to_pixel(0, 0, 0);
     else
         val = 0;
-    w = pThis->last_scr_width * ((pThis->pDrv->cBits + 7) >> 3);
-    d = pThis->pDrv->pu8Data;
+    w = pThis->last_scr_width * ((pDrv->cBits + 7) >> 3);
+    d = pDrv->pu8Data;
     if (pThis->fRenderVRAM)
     {
         for(i = 0; i < (int)pThis->last_scr_height; i++) {
@@ -2463,7 +2467,7 @@ static void vga_draw_blank(PVGASTATE pThis, int full_update)
             d += cbScanline;
         }
     }
-    pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height);
+    pDrv->pfnUpdateRect(pDrv, 0, 0, pThis->last_scr_width, pThis->last_scr_height);
 }
 
 static DECLCALLBACK(void) voidUpdateRect(PPDMIDISPLAYCONNECTOR pInterface, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy)
@@ -2479,15 +2483,16 @@ static DECLCALLBACK(void) voidUpdateRect(PPDMIDISPLAYCONNECTOR pInterface, uint3
 #define GMODE_SVGA      3
 #endif
 
-static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty)
+static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty,
+        PDMIDISPLAYCONNECTOR *pDrv, int32_t *pcur_graphic_mode)
 {
     int rc = VINF_SUCCESS;
     int graphic_mode;
 
-    if (pThis->pDrv->cBits == 0) {
+    if (pDrv->cBits == 0) {
         /* nothing to do */
     } else {
-        switch(pThis->pDrv->cBits) {
+        switch(pDrv->cBits) {
         case 8:
             pThis->rgb_to_pixel = rgb_to_pixel8_dup;
             break;
@@ -2524,33 +2529,33 @@ static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResi
 
             if (fBlank) {
                 /* Provide a void pfnUpdateRect callback. */
-                if (pThis->pDrv) {
-                    pfnUpdateRect = pThis->pDrv->pfnUpdateRect;
-                    pThis->pDrv->pfnUpdateRect = voidUpdateRect;
+                if (pDrv) {
+                    pfnUpdateRect = pDrv->pfnUpdateRect;
+                    pDrv->pfnUpdateRect = voidUpdateRect;
                 }
             }
 
             /* Do a complete redraw, which will pick up a new screen resolution. */
 #ifdef VBOX_WITH_VMSVGA
             if (pThis->svga.fEnabled) {
-                pThis->graphic_mode = GMODE_SVGA;
-                rc = vmsvga_draw_graphic(pThis, 1, false, reset_dirty);
+                *pcur_graphic_mode = GMODE_SVGA;
+                rc = vmsvga_draw_graphic(pThis, 1, false, reset_dirty, pDrv);
             }
             else
 #endif
             if (pThis->gr[6] & 1) {
-                pThis->graphic_mode = GMODE_GRAPH;
-                rc = vga_draw_graphic(pThis, 1, false, reset_dirty);
+                *pcur_graphic_mode = GMODE_GRAPH;
+                rc = vga_draw_graphic(pThis, 1, false, reset_dirty, pDrv);
             } else {
-                pThis->graphic_mode = GMODE_TEXT;
-                rc = vga_draw_text(pThis, 1, false, reset_dirty);
+                *pcur_graphic_mode = GMODE_TEXT;
+                rc = vga_draw_text(pThis, 1, false, reset_dirty, pDrv);
             }
 
             if (fBlank) {
                 /* Set the current mode and restore the callback. */
-                pThis->graphic_mode = GMODE_BLANK;
-                if (pThis->pDrv) {
-                    pThis->pDrv->pfnUpdateRect = pfnUpdateRect;
+                *pcur_graphic_mode = GMODE_BLANK;
+                if (pDrv) {
+                    pDrv->pfnUpdateRect = pfnUpdateRect;
                 }
             }
             return rc;
@@ -2567,25 +2572,25 @@ static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResi
         } else {
             graphic_mode = pThis->gr[6] & 1;
         }
-        bool full_update = graphic_mode != pThis->graphic_mode;
+        bool full_update = graphic_mode != *pcur_graphic_mode;
         if (full_update) {
-            pThis->graphic_mode = graphic_mode;
+            *pcur_graphic_mode = graphic_mode;
         }
         switch(graphic_mode) {
         case GMODE_TEXT:
-            rc = vga_draw_text(pThis, full_update, fFailOnResize, reset_dirty);
+            rc = vga_draw_text(pThis, full_update, fFailOnResize, reset_dirty, pDrv);
             break;
         case GMODE_GRAPH:
-            rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
+            rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty, pDrv);
             break;
 #ifdef VBOX_WITH_VMSVGA
         case GMODE_SVGA:
-            rc = vmsvga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
+            rc = vmsvga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty, pDrv);
             break;
 #endif
         case GMODE_BLANK:
         default:
-            vga_draw_blank(pThis, full_update);
+            vga_draw_blank(pThis, full_update, pDrv);
             break;
         }
     }
@@ -4552,7 +4557,8 @@ static DECLCALLBACK(int) vgaPortUpdateDisplay(PPDMIDISPLAYPORT pInterface)
         pThis->fRemappedVGA = false;
     }
 
-    rc = vga_update_display(pThis, false, false, true);
+    rc = vga_update_display(pThis, false, false, true,
+            pThis->pDrv, &pThis->graphic_mode);
     PDMCritSectLeave(&pThis->CritSect);
     return rc;
 }
@@ -4584,10 +4590,26 @@ static int updateDisplayAll(PVGASTATE pThis)
 
     pThis->graphic_mode = -1; /* force full update */
 
-    return vga_update_display(pThis, true, false, true);
+    return vga_update_display(pThis, true, false, true,
+            pThis->pDrv, &pThis->graphic_mode);
 }
 
 
+int vgaUpdateDisplayAll(PVGASTATE pThis)
+{
+#ifdef DEBUG_sunlover
+    LogFlow(("vgaPortUpdateDisplayAll\n"));
+#endif /* DEBUG_sunlover */
+
+    int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
+    AssertRC(rc);
+
+    rc = updateDisplayAll(pThis);
+
+    PDMCritSectLeave(&pThis->CritSect);
+    return rc;
+}
+
 /**
  * Update the entire display.
  *
@@ -4601,17 +4623,7 @@ static DECLCALLBACK(int) vgaPortUpdateDisplayAll(PPDMIDISPLAYPORT pInterface)
 
     /* This is called both in VBVA mode and normal modes. */
 
-#ifdef DEBUG_sunlover
-    LogFlow(("vgaPortUpdateDisplayAll\n"));
-#endif /* DEBUG_sunlover */
-
-    int rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
-    AssertRC(rc);
-
-    rc = updateDisplayAll(pThis);
-
-    PDMCritSectLeave(&pThis->CritSect);
-    return rc;
+    return vgaUpdateDisplayAll(pThis);
 }
 
 
@@ -4705,14 +4717,10 @@ static DECLCALLBACK(int) vgaPortTakeScreenshot(PPDMIDISPLAYPORT pInterface, uint
             Connector.pfnResize     = vgaDummyResize;
             Connector.pfnUpdateRect = vgaDummyUpdateRect;
 
-            /* Save & replace state data. */
-            PPDMIDISPLAYCONNECTOR pConnectorSaved = pThis->pDrv;
-            int32_t graphic_mode_saved = pThis->graphic_mode;
-            bool fRenderVRAMSaved = pThis->fRenderVRAM;
+            int32_t cur_graphic_mode = -1;
 
-            pThis->pDrv = &Connector;
-            pThis->graphic_mode = -1;           /* force a full refresh. */
-            pThis->fRenderVRAM = 1;             /* force the guest VRAM rendering to the given buffer. */
+            bool fSavedRenderVRAM = pThis->fRenderVRAM;
+            pThis->fRenderVRAM = true;
 
             /*
              * Make the screenshot.
@@ -4722,12 +4730,10 @@ static DECLCALLBACK(int) vgaPortTakeScreenshot(PPDMIDISPLAYPORT pInterface, uint
              * screen in the external buffer.
              * If there is a pending resize, the function will fail.
              */
-            rc = vga_update_display(pThis, false, true, false);
+            rc = vga_update_display(pThis, false, true, false,
+                    &Connector, &cur_graphic_mode);
 
-            /* Restore. */
-            pThis->pDrv = pConnectorSaved;
-            pThis->graphic_mode = graphic_mode_saved;
-            pThis->fRenderVRAM = fRenderVRAMSaved;
+            pThis->fRenderVRAM = fSavedRenderVRAM;
 
             if (rc == VINF_SUCCESS)
             {
@@ -5367,26 +5373,42 @@ static DECLCALLBACK(int) vgaR3SaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
 static DECLCALLBACK(int) vgaR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
 {
     PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
+
 #ifdef VBOX_WITH_VDMA
     vboxVDMASaveStateExecPrep(pThis->pVdma, pSSM);
 #endif
+
     vgaR3SaveConfig(pThis, pSSM);
     vga_save(pSSM, PDMINS_2_DATA(pDevIns, PVGASTATE));
+
 #ifdef VBOX_WITH_HGSMI
     SSMR3PutBool(pSSM, true);
     int rc = vboxVBVASaveStateExec(pDevIns, pSSM);
-# ifdef VBOX_WITH_VDMA
-    vboxVDMASaveStateExecDone(pThis->pVdma, pSSM);
-# endif
-    return rc;
 #else
-    SSMR3PutBool(pSSM, false);
+    int rc = SSMR3PutBool(pSSM, false);
 #endif
+
+    AssertRCReturn(rc, rc);
+
+#ifdef VBOX_WITH_VDMA
+    rc = SSMR3PutU32(pSSM, 1);
+    AssertRCReturn(rc, rc);
+    rc = vboxVDMASaveStateExecPerform(pThis->pVdma, pSSM);
+#else
+    rc = SSMR3PutU32(pSSM, 0);
+#endif
+    AssertRCReturn(rc, rc);
+
+#ifdef VBOX_WITH_VDMA
+    vboxVDMASaveStateExecDone(pThis->pVdma, pSSM);
+#endif
+
 #ifdef VBOX_WITH_VMSVGA
     if (    rc == VINF_SUCCESS
         &&  pThis->fVMSVGAEnabled)
         rc = vmsvgaSaveExec(pDevIns, pSSM);
 #endif
+
     return rc;
 }
 
@@ -5438,6 +5460,28 @@ static DECLCALLBACK(int) vgaR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint
             return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("HGSMI is not compiled in, but it is present in the saved state"));
 #endif
         }
+
+        if (uVersion >= VGA_SAVEDSTATE_VERSION_3D)
+        {
+            uint32_t u32;
+            rc = SSMR3GetU32(pSSM, &u32);
+            if (u32)
+            {
+#ifdef VBOX_WITH_VDMA
+                if (u32 == 1)
+                {
+                    rc = vboxVDMASaveLoadExecPerform(pThis->pVdma, pSSM, uVersion);
+                    AssertRCReturn(rc, rc);
+                }
+                else
+#endif
+                {
+                    LogRel(("invalid CmdVbva version info\n"));
+                    return VERR_VERSION_MISMATCH;
+                }
+            }
+        }
+
 #ifdef VBOX_WITH_VMSVGA
         if (    uVersion >= VGA_SAVEDSTATE_VERSION_VMSVGA_2D
             &&  pThis->fVMSVGAEnabled)
@@ -5459,7 +5503,13 @@ static DECLCALLBACK(int) vgaR3LoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
 #ifdef VBOX_WITH_HGSMI
     PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
     VBVAPause(pThis, (pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_ENABLED) == 0);
-    return vboxVBVALoadStateDone(pDevIns, pSSM);
+    int rc = vboxVBVALoadStateDone(pDevIns, pSSM);
+    AssertRCReturn(rc, rc);
+# ifdef VBOX_WITH_VDMA
+    rc = vboxVDMASaveLoadDone(pThis->pVdma);
+    AssertRCReturn(rc, rc);
+# endif
+    return VINF_SUCCESS;
 #else
     return VINF_SUCCESS;
 #endif
@@ -5924,16 +5974,22 @@ static DECLCALLBACK(int)   vgaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
 
 #if defined(VBOX_WITH_HGSMI)
 # if defined(VBOX_WITH_VIDEOHWACCEL)
-    pThis->IVBVACallbacks.pfnVHWACommandCompleteAsynch = vbvaVHWACommandCompleteAsynch;
+    pThis->IVBVACallbacks.pfnVHWACommandCompleteAsync = vbvaVHWACommandCompleteAsync;
 # endif
 #if defined(VBOX_WITH_CRHGSMI)
     pThis->IVBVACallbacks.pfnCrHgsmiCommandCompleteAsync = vboxVDMACrHgsmiCommandCompleteAsync;
     pThis->IVBVACallbacks.pfnCrHgsmiControlCompleteAsync = vboxVDMACrHgsmiControlCompleteAsync;
 
     pThis->IVBVACallbacks.pfnCrCtlSubmit = vboxCmdVBVACmdHostCtl;
+    pThis->IVBVACallbacks.pfnCrCtlSubmitSync = vboxCmdVBVACmdHostCtlSync;
 # endif
 #endif
 
+//    pThis->ILeds.pfnQueryStatusLed = vgaPortQueryStatusLed;
+
+    RT_ZERO(pThis->Led3D);
+    pThis->Led3D.u32Magic = PDMLED_MAGIC;
+
     /*
      * We use our own critical section to avoid unncessary pointer indirections
      * in interface methods (as we all as for historical reasons).
diff --git a/src/VBox/Devices/Graphics/DevVGA.h b/src/VBox/Devices/Graphics/DevVGA.h
index 2701cc2..d3e68da 100644
--- a/src/VBox/Devices/Graphics/DevVGA.h
+++ b/src/VBox/Devices/Graphics/DevVGA.h
@@ -293,9 +293,6 @@ typedef struct VGAState {
     /** LUN\#0: VBVA callbacks interface */
     PDMIDISPLAYVBVACALLBACKS    IVBVACallbacks;
 # endif
-# if HC_ARCH_BITS == 32
-    uint32_t                    Padding0;
-# endif
     /** Pointer to base interface of the driver. */
     R3PTRTYPE(PPDMIBASE)        pDrvBase;
     /** Pointer to display connector interface of the driver. */
@@ -518,6 +515,8 @@ typedef struct VGAState {
 #  endif
 # endif /* VBOX_WITH_HGSMI */
 
+    PDMLED Led3D;
+
     struct {
         volatile uint32_t cPending;
         uint32_t Padding1;
@@ -594,20 +593,23 @@ void     VBVADestroy    (PVGASTATE pVGAState);
 int      VBVAUpdateDisplay (PVGASTATE pVGAState);
 void     VBVAReset (PVGASTATE pVGAState);
 void     VBVAPause (PVGASTATE pVGAState, bool fPause);
-int      VBVAGetScreenInfo(PVGASTATE pVGAState, unsigned uScreenId, struct VBVAINFOSCREEN *pScreen, void **ppvVram);
 
 bool VBVAIsEnabled(PVGASTATE pVGAState);
 
 void VBVARaiseIrq (PVGASTATE pVGAState, uint32_t fFlags);
 void VBVARaiseIrqNoWait(PVGASTATE pVGAState, uint32_t fFlags);
 
+int VBVAInfoView(PVGASTATE pVGAState, VBVAINFOVIEW *pView);
+int VBVAInfoScreen(PVGASTATE pVGAState, VBVAINFOSCREEN *pScreen);
+int VBVAGetInfoViewAndScreen(PVGASTATE pVGAState, uint32_t u32ViewIndex, VBVAINFOVIEW *pView, VBVAINFOSCREEN *pScreen);
+
 /* @return host-guest flags that were set on reset
  * this allows the caller to make further cleaning when needed,
  * e.g. reset the IRQ */
 uint32_t HGSMIReset (PHGSMIINSTANCE pIns);
 
 # ifdef VBOX_WITH_VIDEOHWACCEL
-int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd);
+int vbvaVHWACommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd);
 int vbvaVHWAConstruct (PVGASTATE pVGAState);
 int vbvaVHWAReset (PVGASTATE pVGAState);
 
@@ -628,12 +630,16 @@ int vboxCmdVBVACmdHostCtl(PPDMIDISPLAYVBVACALLBACKS pInterface,
                                                                struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
                                                                PFNCRCTLCOMPLETION pfnCompletion,
                                                                void *pvCompletion);
+int vboxCmdVBVACmdHostCtlSync(PPDMIDISPLAYVBVACALLBACKS pInterface,
+                                                               struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd);
 # endif
 
 int vboxVBVASaveStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
 int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Version);
 int vboxVBVALoadStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
 
+int vgaUpdateDisplayAll(PVGASTATE pThis);
+
 # ifdef VBOX_WITH_VDMA
 typedef struct VBOXVDMAHOST *PVBOXVDMAHOST;
 int vboxVDMAConstruct(PVGASTATE pVGAState, uint32_t cPipeElements);
@@ -643,6 +649,9 @@ void vboxVDMAControl(PVBOXVDMAHOST pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd);
 void vboxVDMACommand(PVBOXVDMAHOST pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t cbCmd);
 int vboxVDMASaveStateExecPrep(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM);
 int vboxVDMASaveStateExecDone(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM);
+int vboxVDMASaveStateExecPerform(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM);
+int vboxVDMASaveLoadExecPerform(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM, uint32_t u32Version);
+int vboxVDMASaveLoadDone(struct VBOXVDMAHOST *pVdma);
 # endif /* VBOX_WITH_VDMA */
 
 # ifdef VBOX_WITH_CRHGSMI
@@ -650,6 +659,7 @@ int vboxCmdVBVACmdSubmit(PVGASTATE pVGAState);
 int vboxCmdVBVACmdFlush(PVGASTATE pVGAState);
 void vboxCmdVBVACmdTimer(PVGASTATE pVGAState);
 int vboxCmdVBVACmdCtl(PVGASTATE pVGAState, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl);
+bool vboxCmdVBVAIsEnabled(PVGASTATE pVGAState);
 # endif /* VBOX_WITH_CRHGSMI */
 #endif /* VBOX_WITH_HGSMI */
 
diff --git a/src/VBox/Devices/Graphics/DevVGASavedState.h b/src/VBox/Devices/Graphics/DevVGASavedState.h
index 1ee861a..9ecc7a0 100644
--- a/src/VBox/Devices/Graphics/DevVGASavedState.h
+++ b/src/VBox/Devices/Graphics/DevVGASavedState.h
@@ -7,7 +7,7 @@
  */
 
 /*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -22,13 +22,12 @@
 #ifndef Graphics_DevVGASavedState_h
 #define Graphics_DevVGASavedState_h
 
-#ifdef VBOX_WITH_VMSVGA
-#define VGA_SAVEDSTATE_VERSION_VMSVGA_2D    10 /* <- internal build with 2d state only */
+#define VGA_SAVEDSTATE_VERSION              14
+#define VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA 14
+#define VGA_SAVEDSTATE_VERSION_3D           13
+#define VGA_SAVEDSTATE_VERSION_HGSMIMA      12 /* HGSMI memory allocator. */
 #define VGA_SAVEDSTATE_VERSION_VMSVGA       11
-#define VGA_SAVEDSTATE_VERSION              11
-#else
-#define VGA_SAVEDSTATE_VERSION              10
-#endif
+#define VGA_SAVEDSTATE_VERSION_VMSVGA_2D    10 /* <- internal build with 2d state only */
 #define VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA 10
 #define VGA_SAVEDSTATE_VERSION_INV_GCMDFIFO 8 /* <- states upto and including this version may contain invalid completed Guest Commands fifo entries */
 #define VGA_SAVEDSTATE_VERSION_INV_VHEIGHT  8 /* <- states upto and including this version may contain invalid vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] value */
@@ -41,4 +40,3 @@
 #define VGA_SAVEDSTATE_VERSION_ANCIENT      1
 
 #endif
-
diff --git a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
index 1150560..28ab4a8 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
@@ -495,7 +495,7 @@ static int vbvaEnable (unsigned uScreenId, PVGASTATE pVGAState, VBVACONTEXT *pCt
         pVBVA->hostFlags.u32HostEvents = 0;
         pVBVA->hostFlags.u32SupportedOrders = 0;
 
-        rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, uScreenId, &pVBVA->hostFlags);
+        rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, uScreenId, &pVBVA->hostFlags, false);
     }
     else
     {
@@ -801,7 +801,7 @@ static void vbvaVHWACommandComplete(PVGASTATE pVGAState, PVBOXVHWACMD pCommand,
     if (fAsyncCommand)
     {
         Assert(pCommand->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH);
-        vbvaVHWACommandCompleteAsynch(&pVGAState->IVBVACallbacks, pCommand);
+        vbvaVHWACommandCompleteAsync(&pVGAState->IVBVACallbacks, pCommand);
     }
     else
     {
@@ -1240,7 +1240,7 @@ int vboxVBVASaveStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     return vbvaVHWAEnable(PDMINS_2_DATA(pDevIns, PVGASTATE), true);
 }
 
-int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd)
+int vbvaVHWACommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd)
 {
     int rc;
     Log(("VGA Command <<< Async rc %d %#p, %d\n", pCmd->rc, pCmd, pCmd->enmCmd));
@@ -1477,8 +1477,10 @@ static DECLCALLBACK(bool) vboxVBVALoadStatePerformPreCb(PVGASTATE pVGAState, VBO
     switch (u32)
     {
         case VBOXVBVASAVEDSTATE_VHWAAVAILABLE_MAGIC:
+            pData->ab2DOn[iDisplay] = true;
             return true;
         case VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC:
+            pData->ab2DOn[iDisplay] = false;
             return false;
         default:
             pData->rc = VERR_INVALID_STATE;
@@ -1654,6 +1656,9 @@ int vboxVBVASaveStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
             AssertRCReturn(rc, rc);
         }
     }
+
+    /* no pending commands */
+    SSMR3PutU32(pSSM, 0);
 #endif
     return rc;
 }
@@ -1815,6 +1820,19 @@ int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Vers
 
             if (u32Version > VGA_SAVEDSTATE_VERSION_WDDM)
             {
+#define VBOX_VHWA_SOLARIS_ARCH "solaris."
+
+                bool fLoadCommands;
+
+                if (u32Version < VGA_SAVEDSTATE_VERSION_FIXED_PENDVHWA)
+                {
+                    const char *pcszOsArch = SSMR3HandleHostOSAndArch(pSSM);
+                    Assert(pcszOsArch);
+                    fLoadCommands = !pcszOsArch || RTStrNCmp(pcszOsArch, VBOX_VHWA_SOLARIS_ARCH, sizeof (VBOX_VHWA_SOLARIS_ARCH) - 1);
+                }
+                else
+                    fLoadCommands = true;
+
 #ifdef VBOX_WITH_VIDEOHWACCEL
                 uint32_t cbCmd = sizeof (VBOXVHWACMD_HH_SAVESTATE_LOADPERFORM); /* maximum cmd size */
                 VBOXVHWACMD *pCmd = vbvaVHWAHHCommandCreate(pVGAState, VBOXVHWACMD_TYPE_HH_SAVESTATE_LOADPERFORM, 0, cbCmd);
@@ -1830,16 +1848,42 @@ int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Vers
                     vbvaVHWAHHCommandRelease(pCmd);
                     AssertRCReturn(rc, rc);
 
-                    rc = vbvaVHWACommandLoadPending(pVGAState, pSSM, u32Version);
-                    AssertRCReturn(rc, rc);
+                    if (fLoadCommands)
+                    {
+                        rc = vbvaVHWACommandLoadPending(pVGAState, pSSM, u32Version);
+                        AssertRCReturn(rc, rc);
+                    }
                 }
                 else
                 {
                     rc = VERR_OUT_OF_RESOURCES;
                 }
 #else
-                rc = SSMR3SkipToEndOfUnit(pSSM);
-                AssertRCReturn(rc, rc);
+                uint32_t u32;
+
+                for (uint32_t i = 0; i < pVGAState->cMonitors; ++i)
+                {
+                    rc = SSMR3GetU32(pSSM, &u32);
+                    AssertRCReturn(rc, rc);
+
+                    if (u32 != VBOXVBVASAVEDSTATE_VHWAUNAVAILABLE_MAGIC)
+                    {
+                        LogRel(("2D data while 2D is not supported\n"));
+                        return VERR_NOT_SUPPORTED;
+                    }
+                }
+
+                if (fLoadCommands)
+                {
+                    rc = SSMR3GetU32(pSSM, &u32);
+                    AssertRCReturn(rc, rc);
+
+                    if (u32)
+                    {
+                        LogRel(("2D pending command while 2D is not supported\n"));
+                        return VERR_NOT_SUPPORTED;
+                    }
+                }
 #endif
             }
 
@@ -1866,6 +1910,9 @@ int vboxVBVALoadStateDone (PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
 
             if (pView->pVBVA)
             {
+#ifdef VBOX_WITH_CRHGSMI
+                Assert(!vboxCmdVBVAIsEnabled(pVGAState));
+#endif
                 vbvaEnable (iView, pVGAState, pCtx, pView->pVBVA, pView->u32VBVAOffset, true /* fRestored */);
                 vbvaResize (pVGAState, pView, &pView->screen);
             }
@@ -1891,17 +1938,96 @@ void VBVARaiseIrq (PVGASTATE pVGAState, uint32_t fFlags)
     PDMCritSectLeave(&pVGAState->CritSect);
 }
 
+static DECLCALLBACK(int) vbvaRaiseIrqEMT(PVGASTATE pVGAState, uint32_t fFlags)
+{
+    VBVARaiseIrq(pVGAState, fFlags);
+    return VINF_SUCCESS;
+}
+
 void VBVARaiseIrqNoWait(PVGASTATE pVGAState, uint32_t fFlags)
 {
-    PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
-    PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
+    /* we can not use PDMDevHlpPCISetIrqNoWait here, because we need to set IRG host flag and raise IRQ atomically,
+     * otherwise there might be a situation, when:
+     * 1. Flag is set
+     * 2. guest issues an IRQ clean request, that cleans up the flag and the interrupt
+     * 3. IRQ is set */
+    VMR3ReqCallNoWait(PDMDevHlpGetVM(pVGAState->pDevInsR3), VMCPUID_ANY, (PFNRT)vbvaRaiseIrqEMT, 2, pVGAState, fFlags);
+}
 
-    HGSMISetHostGuestFlags(pVGAState->pHGSMI, HGSMIHOSTFLAGS_IRQ | fFlags);
-    PDMDevHlpPCISetIrqNoWait(pDevIns, 0, PDM_IRQ_LEVEL_HIGH);
+int VBVAInfoView(PVGASTATE pVGAState, VBVAINFOVIEW *pView)
+{
+    LogFlowFunc(("VBVA_INFO_VIEW: index %d, offset 0x%x, size 0x%x, max screen size 0x%x\n",
+                     pView->u32ViewIndex, pView->u32ViewOffset, pView->u32ViewSize, pView->u32MaxScreenSize));
 
-    PDMCritSectLeave(&pVGAState->CritSect);
+    PHGSMIINSTANCE pIns = pVGAState->pHGSMI;
+    VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns);
+
+    /* @todo verify view data. */
+    if (pView->u32ViewIndex >= pCtx->cViews)
+    {
+        Log(("View index too large %d!!!\n",
+             pView->u32ViewIndex));
+        return VERR_INVALID_PARAMETER;
+    }
+
+    pCtx->aViews[pView->u32ViewIndex].view = *pView;
+
+    return VINF_SUCCESS;
+}
+
+int VBVAInfoScreen(PVGASTATE pVGAState, VBVAINFOSCREEN *pScreen)
+{
+    PHGSMIINSTANCE pIns = pVGAState->pHGSMI;
+    VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns);
+    VBVAINFOVIEW *pView = &pCtx->aViews[pScreen->u32ViewIndex].view;
+    /* Calculate the offset of the  end of the screen so we can make
+     * sure it is inside the view.  I assume that screen rollover is not
+     * implemented. */
+    int64_t offEnd =   (int64_t)pScreen->u32Height * pScreen->u32LineSize
+                     + pScreen->u32Width + pScreen->u32StartOffset;
+    LogRel(("VBVA_INFO_SCREEN: [%d] @%d,%d %dx%d, line 0x%x, BPP %d, flags 0x%x\n",
+                    pScreen->u32ViewIndex, pScreen->i32OriginX, pScreen->i32OriginY,
+                    pScreen->u32Width, pScreen->u32Height,
+                    pScreen->u32LineSize,  pScreen->u16BitsPerPixel, pScreen->u16Flags));
+
+    if (   pScreen->u32ViewIndex < RT_ELEMENTS (pCtx->aViews)
+        && pScreen->u16BitsPerPixel <= 32
+        && pScreen->u32Width <= UINT16_MAX
+        && pScreen->u32Height <= UINT16_MAX
+        && pScreen->u32LineSize <= UINT16_MAX * 4
+        && offEnd < pView->u32MaxScreenSize)
+    {
+        vbvaResize (pVGAState, &pCtx->aViews[pScreen->u32ViewIndex], pScreen);
+        return VINF_SUCCESS;
+    }
+
+    LogRelFlow(("VBVA_INFO_SCREEN [%lu]: bad data: %lux%lu, line 0x%lx, BPP %u, start offset %lu, max screen size %lu\n",
+                    (unsigned long)pScreen->u32ViewIndex,
+                    (unsigned long)pScreen->u32Width,
+                    (unsigned long)pScreen->u32Height,
+                    (unsigned long)pScreen->u32LineSize,
+                    (unsigned long)pScreen->u16BitsPerPixel,
+                    (unsigned long)pScreen->u32StartOffset,
+                    (unsigned long)pView->u32MaxScreenSize));
+    return VERR_INVALID_PARAMETER;
 }
 
+int VBVAGetInfoViewAndScreen(PVGASTATE pVGAState, uint32_t u32ViewIndex, VBVAINFOVIEW *pView, VBVAINFOSCREEN *pScreen)
+{
+    if (u32ViewIndex >= pVGAState->cMonitors)
+        return VERR_INVALID_PARAMETER;
+
+    PHGSMIINSTANCE pIns = pVGAState->pHGSMI;
+    VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns);
+
+    if (pView)
+        *pView = pCtx->aViews[u32ViewIndex].view;
+
+    if (pScreen)
+        *pScreen = pCtx->aViews[u32ViewIndex].screen;
+
+    return VINF_SUCCESS;
+}
 
 /*
  *
@@ -2055,6 +2181,15 @@ static DECLCALLBACK(int) vbvaChannelHandler (void *pvHandler, uint16_t u16Channe
 
         case VBVA_INFO_VIEW:
         {
+#ifdef VBOX_WITH_CRHGSMI
+            if (vboxCmdVBVAIsEnabled(pVGAState))
+            {
+                AssertMsgFailed(("VBVA_INFO_VIEW is not acceptible for CmdVbva\n"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+#endif
+
             if (cbBuffer < sizeof (VBVAINFOVIEW))
             {
                 rc = VERR_INVALID_PARAMETER;
@@ -2062,27 +2197,16 @@ static DECLCALLBACK(int) vbvaChannelHandler (void *pvHandler, uint16_t u16Channe
             }
 
             /* Guest submits an array of VBVAINFOVIEW structures. */
-            VBVAINFOVIEW *pVw = (VBVAINFOVIEW *)pvBuffer;
+            VBVAINFOVIEW *pView = (VBVAINFOVIEW *)pvBuffer;
 
             for (;
                  cbBuffer >= sizeof (VBVAINFOVIEW);
-                 pVw++, cbBuffer -= sizeof (VBVAINFOVIEW))
+                 pView++, cbBuffer -= sizeof (VBVAINFOVIEW))
             {
-                VBVAINFOVIEW View = *pVw;
-
-                LogFlowFunc(("VBVA_INFO_VIEW: index %d, offset 0x%x, size 0x%x, max screen size 0x%x\n",
-                             View.u32ViewIndex, View.u32ViewOffset, View.u32ViewSize, View.u32MaxScreenSize));
-
-                /* @todo verify view data. */
-                if (View.u32ViewIndex >= pCtx->cViews)
-                {
-                    Log(("View index too large %d!!!\n",
-                         View.u32ViewIndex));
-                    rc = VERR_INVALID_PARAMETER;
+                VBVAINFOVIEW View = *pView;
+                rc = VBVAInfoView(pVGAState, &View);
+                if (RT_FAILURE(rc))
                     break;
-                }
-
-                pCtx->aViews[View.u32ViewIndex].view = View;
             }
         } break;
 
@@ -2124,44 +2248,31 @@ static DECLCALLBACK(int) vbvaChannelHandler (void *pvHandler, uint16_t u16Channe
                 break;
             }
 
-            VBVAINFOSCREEN *pScr = (VBVAINFOSCREEN *)pvBuffer;
-            VBVAINFOSCREEN Screen = *pScr;
-            VBVAINFOVIEW *pView = &pCtx->aViews[Screen.u32ViewIndex].view;
-            /* Calculate the offset of the  end of the screen so we can make
-             * sure it is inside the view.  I assume that screen rollover is not
-             * implemented. */
-            int64_t offEnd =   (int64_t)Screen.u32Height * Screen.u32LineSize
-                             + Screen.u32Width + Screen.u32StartOffset;
-            LogRel(("VBVA_INFO_SCREEN: [%d] @%d,%d %dx%d, line 0x%x, BPP %d, flags 0x%x\n",
-                            Screen.u32ViewIndex, Screen.i32OriginX, Screen.i32OriginY,
-                            Screen.u32Width, Screen.u32Height,
-                            Screen.u32LineSize,  Screen.u16BitsPerPixel, Screen.u16Flags));
-
-            if (   Screen.u32ViewIndex < RT_ELEMENTS (pCtx->aViews)
-                && Screen.u16BitsPerPixel <= 32
-                && Screen.u32Width <= UINT16_MAX
-                && Screen.u32Height <= UINT16_MAX
-                && Screen.u32LineSize <= UINT16_MAX * 4
-                && offEnd < pView->u32MaxScreenSize)
-            {
-                vbvaResize (pVGAState, &pCtx->aViews[Screen.u32ViewIndex], &Screen);
-            }
-            else
+#ifdef VBOX_WITH_CRHGSMI
+            if (vboxCmdVBVAIsEnabled(pVGAState))
             {
-                LogRelFlow(("VBVA_INFO_SCREEN [%lu]: bad data: %lux%lu, line 0x%lx, BPP %u, start offset %lu, max screen size %lu\n",
-                            (unsigned long)Screen.u32ViewIndex,
-                            (unsigned long)Screen.u32Width,
-                            (unsigned long)Screen.u32Height,
-                            (unsigned long)Screen.u32LineSize,
-                            (unsigned long)Screen.u16BitsPerPixel,
-                            (unsigned long)Screen.u32StartOffset,
-                            (unsigned long)pView->u32MaxScreenSize));
+                AssertMsgFailed(("VBVA_INFO_SCREEN is not acceptible for CmdVbva\n"));
                 rc = VERR_INVALID_PARAMETER;
+                break;
             }
+#endif
+
+            VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)pvBuffer;
+            VBVAINFOSCREEN Screen = *pScreen;
+            rc = VBVAInfoScreen(pVGAState, &Screen);
         } break;
 
         case VBVA_ENABLE:
         {
+#ifdef VBOX_WITH_CRHGSMI
+            if (vboxCmdVBVAIsEnabled(pVGAState))
+            {
+                AssertMsgFailed(("VBVA_ENABLE is not acceptible for CmdVbva\n"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+#endif
+
             if (cbBuffer < sizeof (VBVAENABLE))
             {
                 rc = VERR_INVALID_PARAMETER;
@@ -2444,39 +2555,3 @@ void VBVADestroy (PVGASTATE pVGAState)
     HGSMIDestroy (pVGAState->pHGSMI);
     pVGAState->pHGSMI = NULL;
 }
-
-int VBVAGetScreenInfo(PVGASTATE pVGAState, unsigned uScreenId, struct VBVAINFOSCREEN *pScreen, void **ppvVram)
-{
-    PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
-    PHGSMIINSTANCE pIns = pVGAState->pHGSMI;
-    VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pIns);
-    int rc = PDMCritSectEnter(&pVGAState->CritSect, VERR_SEM_BUSY);
-    if (RT_SUCCESS(rc))
-    {
-        if (uScreenId < pCtx->cViews)
-        {
-            VBVAVIEW *pView = &pCtx->aViews[uScreenId];
-            if (pView->pVBVA)
-            {
-                uint8_t *pu8VRAM = pVGAState->vram_ptrR3 + pView->view.u32ViewOffset;
-                *pScreen = pView->screen;
-                *ppvVram = (void*)pu8VRAM;
-                rc = VINF_SUCCESS;
-            }
-            else
-            {
-                /* pretend disabled */
-                memset(pScreen, 0, sizeof (*pScreen));
-                pScreen->u16Flags = VBVA_SCREEN_F_DISABLED;
-                pScreen->u32ViewIndex = uScreenId;
-                *ppvVram = NULL;
-                rc = VINF_SUCCESS;
-            }
-        }
-        else
-            rc = VERR_INVALID_PARAMETER;
-
-        PDMCritSectLeave(&pVGAState->CritSect);
-    }
-    return rc;
-}
diff --git a/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp b/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
index 0800795..8a1ab10 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
@@ -13,7 +13,7 @@
  * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
  */
-//#include <VBox/VMMDev.h>
+#include <VBox/VMMDev.h>
 #include <VBox/vmm/pdmdev.h>
 #include <VBox/VBoxVideo.h>
 #include <iprt/semaphore.h>
@@ -21,10 +21,10 @@
 #include <iprt/mem.h>
 #include <iprt/asm.h>
 #include <iprt/list.h>
+#include <iprt/param.h>
 
 #include "DevVGA.h"
 #include "HGSMI/SHGSMIHost.h"
-#include "HGSMI/HGSMIHostHlp.h"
 
 #include <VBox/VBoxVideo3D.h>
 #include <VBox/VBoxVideoHost3D.h>
@@ -47,16 +47,22 @@
         WARN_BP(); \
     } while (0)
 
-#define VBOXVDMATHREAD_STATE_TERMINATED     0
-#define VBOXVDMATHREAD_STATE_CREATED        1
-#define VBOXVDMATHREAD_STATE_TERMINATING    2
+#define VBOXVDMATHREAD_STATE_TERMINATED             0
+#define VBOXVDMATHREAD_STATE_CREATING               1
+#define VBOXVDMATHREAD_STATE_CREATED                3
+#define VBOXVDMATHREAD_STATE_TERMINATING            4
+
+struct VBOXVDMATHREAD;
+
+typedef DECLCALLBACKPTR(void, PFNVBOXVDMATHREAD_CHANGED)(struct VBOXVDMATHREAD *pThread, int rc, void *pvThreadContext, void *pvChangeContext);
 
 typedef struct VBOXVDMATHREAD
 {
     RTTHREAD hWorkerThread;
     RTSEMEVENT hEvent;
-    RTSEMEVENT hClientEvent;
     volatile uint32_t u32State;
+    PFNVBOXVDMATHREAD_CHANGED pfnChanged;
+    void *pvChanged;
 } VBOXVDMATHREAD, *PVBOXVDMATHREAD;
 
 
@@ -94,14 +100,16 @@ typedef enum
     VBVAEXHOSTCTL_TYPE_UNDEFINED = 0,
     VBVAEXHOSTCTL_TYPE_HH_INTERNAL_PAUSE,
     VBVAEXHOSTCTL_TYPE_HH_INTERNAL_RESUME,
-    VBVAEXHOSTCTL_TYPE_HH_ENABLE,
-    VBVAEXHOSTCTL_TYPE_HH_TERM,
-    VBVAEXHOSTCTL_TYPE_HH_RESET,
     VBVAEXHOSTCTL_TYPE_HH_SAVESTATE,
     VBVAEXHOSTCTL_TYPE_HH_LOADSTATE,
+    VBVAEXHOSTCTL_TYPE_HH_LOADSTATE_DONE,
     VBVAEXHOSTCTL_TYPE_HH_BE_OPAQUE,
+    VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_UNLOAD,
     VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE,
-    VBVAEXHOSTCTL_TYPE_GH_ENABLE_DISABLE
+    VBVAEXHOSTCTL_TYPE_GHH_ENABLE,
+    VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED,
+    VBVAEXHOSTCTL_TYPE_GHH_DISABLE,
+    VBVAEXHOSTCTL_TYPE_GHH_RESIZE
 } VBVAEXHOSTCTL_TYPE;
 
 struct VBVAEXHOSTCTL;
@@ -141,6 +149,10 @@ typedef enum
     VBVAEXHOST_DATA_TYPE_HOSTCTL,
     VBVAEXHOST_DATA_TYPE_GUESTCTL
 } VBVAEXHOST_DATA_TYPE;
+
+static DECLCALLBACK(int) vdmaVBVANotifyDisable(PVGASTATE pVGAState);
+
+
 static VBVAEXHOST_DATA_TYPE VBoxVBVAExHPDataGet(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t **ppCmd, uint32_t *pcbCmd);
 
 static void VBoxVBVAExHPDataCompleteCmd(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint32_t cbCmd);
@@ -212,7 +224,7 @@ static VBVAEXHOSTCTL* vboxVBVAExHPCheckCtl(struct VBVAEXHOSTCONTEXT *pCmdVbva, b
             *pfHostCtl = true;
         else if (!fHostOnlyMode)
         {
-            if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) > VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+            if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
             {
                 pCtl = RTListGetFirst(&pCmdVbva->GuestCtlList, VBVAEXHOSTCTL, Node);
                 /* pCtl can not be null here since pCmdVbva->u32cCtls is not null,
@@ -240,8 +252,34 @@ static VBVAEXHOSTCTL* vboxVBVAExHPCheckCtl(struct VBVAEXHOSTCONTEXT *pCmdVbva, b
 
 static VBVAEXHOSTCTL* VBoxVBVAExHPCheckHostCtlOnDisable(struct VBVAEXHOSTCONTEXT *pCmdVbva)
 {
-    bool fHostCtl;
-    return vboxVBVAExHPCheckCtl(pCmdVbva, &fHostCtl, true);
+    bool fHostCtl = false;
+    VBVAEXHOSTCTL* pCtl = vboxVBVAExHPCheckCtl(pCmdVbva, &fHostCtl, true);
+    Assert(!pCtl || fHostCtl);
+    return pCtl;
+}
+
+static int VBoxVBVAExHPPause(struct VBVAEXHOSTCONTEXT *pCmdVbva)
+{
+    if (pCmdVbva->i32EnableState < VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+    {
+        WARN(("Invalid state\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    ASMAtomicWriteS32(&pCmdVbva->i32EnableState, VBVAEXHOSTCONTEXT_ESTATE_PAUSED);
+    return VINF_SUCCESS;
+}
+
+static int VBoxVBVAExHPResume(struct VBVAEXHOSTCONTEXT *pCmdVbva)
+{
+    if (pCmdVbva->i32EnableState != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+    {
+        WARN(("Invalid state\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    ASMAtomicWriteS32(&pCmdVbva->i32EnableState, VBVAEXHOSTCONTEXT_ESTATE_ENABLED);
+    return VINF_SUCCESS;
 }
 
 
@@ -250,13 +288,17 @@ static bool vboxVBVAExHPCheckProcessCtlInternal(struct VBVAEXHOSTCONTEXT *pCmdVb
     switch (pCtl->enmType)
     {
         case VBVAEXHOSTCTL_TYPE_HH_INTERNAL_PAUSE:
-            if (pCmdVbva->i32EnableState > VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
-                ASMAtomicWriteS32(&pCmdVbva->i32EnableState, VBVAEXHOSTCONTEXT_ESTATE_PAUSED);
+        {
+            int rc = VBoxVBVAExHPPause(pCmdVbva);
+            VBoxVBVAExHPDataCompleteCtl(pCmdVbva, pCtl, VINF_SUCCESS);
             return true;
+        }
         case VBVAEXHOSTCTL_TYPE_HH_INTERNAL_RESUME:
-            if (pCmdVbva->i32EnableState == VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
-                ASMAtomicWriteS32(&pCmdVbva->i32EnableState, VBVAEXHOSTCONTEXT_ESTATE_ENABLED);
+        {
+            int rc = VBoxVBVAExHPResume(pCmdVbva);
+            VBoxVBVAExHPDataCompleteCtl(pCmdVbva, pCtl, VINF_SUCCESS);
             return true;
+        }
         default:
             return false;
     }
@@ -376,6 +418,7 @@ static VBVAEXHOST_DATA_TYPE vboxVBVAExHPDataGet(struct VBVAEXHOSTCONTEXT *pCmdVb
                     *pcbCmd = sizeof (*pCtl);
                     return VBVAEXHOST_DATA_TYPE_HOSTCTL;
                 }
+                continue;
             }
             else
             {
@@ -524,10 +567,18 @@ DECLINLINE(bool) VBoxVBVAExHSIsEnabled(struct VBVAEXHOSTCONTEXT *pCmdVbva)
     return (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) >= VBVAEXHOSTCONTEXT_ESTATE_PAUSED);
 }
 
+DECLINLINE(bool) VBoxVBVAExHSIsDisabled(struct VBVAEXHOSTCONTEXT *pCmdVbva)
+{
+    return (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) == VBVAEXHOSTCONTEXT_ESTATE_DISABLED);
+}
+
 static int VBoxVBVAExHSEnable(struct VBVAEXHOSTCONTEXT *pCmdVbva, VBVABUFFER *pVBVA)
 {
     if (VBoxVBVAExHSIsEnabled(pCmdVbva))
-        return VINF_ALREADY_INITIALIZED;
+    {
+        WARN(("VBVAEx is enabled already\n"));
+        return VERR_INVALID_STATE;
+    }
 
     pCmdVbva->pVBVA = pVBVA;
     pCmdVbva->pVBVA->hostFlags.u32HostEvents = 0;
@@ -537,7 +588,7 @@ static int VBoxVBVAExHSEnable(struct VBVAEXHOSTCONTEXT *pCmdVbva, VBVABUFFER *pV
 
 static int VBoxVBVAExHSDisable(struct VBVAEXHOSTCONTEXT *pCmdVbva)
 {
-    if (!VBoxVBVAExHSIsEnabled(pCmdVbva))
+    if (VBoxVBVAExHSIsDisabled(pCmdVbva))
         return VINF_SUCCESS;
 
     ASMAtomicWriteS32(&pCmdVbva->i32EnableState, VBVAEXHOSTCONTEXT_ESTATE_DISABLED);
@@ -565,46 +616,143 @@ static void VBoxVBVAExHSTerm(struct VBVAEXHOSTCONTEXT *pCmdVbva)
     memset(pCmdVbva, 0, sizeof (*pCmdVbva));
 }
 
+static int vboxVBVAExHSSaveGuestCtl(struct VBVAEXHOSTCONTEXT *pCmdVbva, VBVAEXHOSTCTL* pCtl, uint8_t* pu8VramBase, PSSMHANDLE pSSM)
+{
+    int rc = SSMR3PutU32(pSSM, pCtl->enmType);
+    AssertRCReturn(rc, rc);
+    rc = SSMR3PutU32(pSSM, pCtl->u.cmd.cbCmd);
+    AssertRCReturn(rc, rc);
+    rc = SSMR3PutU32(pSSM, (uint32_t)(pCtl->u.cmd.pu8Cmd - pu8VramBase));
+    AssertRCReturn(rc, rc);
+
+    return VINF_SUCCESS;
+}
+
+static int vboxVBVAExHSSaveStateLocked(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM)
+{
+    if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+    {
+        WARN(("vbva not paused\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    VBVAEXHOSTCTL* pCtl;
+    int rc;
+    RTListForEach(&pCmdVbva->GuestCtlList, pCtl, VBVAEXHOSTCTL, Node)
+    {
+        rc = vboxVBVAExHSSaveGuestCtl(pCmdVbva, pCtl, pu8VramBase, pSSM);
+        AssertRCReturn(rc, rc);
+    }
+
+    rc = SSMR3PutU32(pSSM, 0);
+    AssertRCReturn(rc, rc);
+
+    return VINF_SUCCESS;
+}
 /* Saves state
  * @returns - same as VBoxVBVAExHSCheckCommands, or failure on load state fail
  */
 static int VBoxVBVAExHSSaveState(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM)
 {
-    int rc;
-
-    int32_t i32EnableState = ASMAtomicUoReadS32(&pCmdVbva->i32EnableState);
-    if (i32EnableState >= VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+    int rc = RTCritSectEnter(&pCmdVbva->CltCritSect);
+    if (RT_FAILURE(rc))
     {
-        if (i32EnableState != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
-        {
-            WARN(("vbva not paused\n"));
-            return VERR_INVALID_STATE;
-        }
+        WARN(("RTCritSectEnter failed %d\n", rc));
+        return rc;
+    }
 
-        rc = SSMR3PutU32(pSSM, (uint32_t)(((uint8_t*)pCmdVbva->pVBVA) - pu8VramBase));
-        AssertRCReturn(rc, rc);
-        return VINF_SUCCESS;
+    rc = vboxVBVAExHSSaveStateLocked(pCmdVbva, pu8VramBase, pSSM);
+    if (RT_FAILURE(rc))
+        WARN(("vboxVBVAExHSSaveStateLocked failed %d\n", rc));
+
+    RTCritSectLeave(&pCmdVbva->CltCritSect);
+
+    return rc;
+}
+
+static int vboxVBVAExHSLoadGuestCtl(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    uint32_t u32;
+    int rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+
+    if (!u32)
+        return VINF_EOF;
+
+    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(pCmdVbva, (VBVAEXHOSTCTL_TYPE)u32);
+    if (!pHCtl)
+    {
+        WARN(("VBoxVBVAExHCtlCreate failed\n"));
+        return VERR_NO_MEMORY;
     }
 
-    rc = SSMR3PutU32(pSSM, 0xffffffff);
+    rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+    pHCtl->u.cmd.cbCmd = u32;
+
+    rc = SSMR3GetU32(pSSM, &u32);
     AssertRCReturn(rc, rc);
+    pHCtl->u.cmd.pu8Cmd = pu8VramBase + u32;
+
+    RTListAppend(&pCmdVbva->GuestCtlList, &pHCtl->Node);
+    ++pCmdVbva->u32cCtls;
+
+    return VINF_SUCCESS;
+}
+
+
+static int vboxVBVAExHSLoadStateLocked(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
+    {
+        WARN(("vbva not stopped\n"));
+        return VERR_INVALID_STATE;
+    }
+
+    int rc;
+
+    do {
+        rc = vboxVBVAExHSLoadGuestCtl(pCmdVbva, pu8VramBase, pSSM, u32Version);
+        AssertRCReturn(rc, rc);
+    } while (VINF_EOF != rc);
 
     return VINF_SUCCESS;
 }
 
+/* Loads state
+ * @returns - same as VBoxVBVAExHSCheckCommands, or failure on load state fail
+ */
+static int VBoxVBVAExHSLoadState(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    Assert(VGA_SAVEDSTATE_VERSION_3D <= u32Version);
+    int rc = RTCritSectEnter(&pCmdVbva->CltCritSect);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("RTCritSectEnter failed %d\n", rc));
+        return rc;
+    }
+
+    rc = vboxVBVAExHSLoadStateLocked(pCmdVbva, pu8VramBase, pSSM, u32Version);
+    if (RT_FAILURE(rc))
+        WARN(("vboxVBVAExHSSaveStateLocked failed %d\n", rc));
+
+    RTCritSectLeave(&pCmdVbva->CltCritSect);
+
+    return rc;
+}
+
 typedef enum
 {
     VBVAEXHOSTCTL_SOURCE_GUEST = 0,
-    VBVAEXHOSTCTL_SOURCE_HOST_ANY,
-    VBVAEXHOSTCTL_SOURCE_HOST_ENABLED
+    VBVAEXHOSTCTL_SOURCE_HOST
 } VBVAEXHOSTCTL_SOURCE;
 
 
 static int VBoxVBVAExHCtlSubmit(VBVAEXHOSTCONTEXT *pCmdVbva, VBVAEXHOSTCTL* pCtl, VBVAEXHOSTCTL_SOURCE enmSource, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
 {
-    if ((enmSource == VBVAEXHOSTCTL_SOURCE_HOST_ENABLED) && !VBoxVBVAExHSIsEnabled(pCmdVbva))
+    if (!VBoxVBVAExHSIsEnabled(pCmdVbva))
     {
-        WARN(("cmd vbva not enabled\n"));
+        Log(("cmd vbva not enabled\n"));
         return VERR_INVALID_STATE;
     }
 
@@ -614,14 +762,15 @@ static int VBoxVBVAExHCtlSubmit(VBVAEXHOSTCONTEXT *pCmdVbva, VBVAEXHOSTCTL* pCtl
     int rc = RTCritSectEnter(&pCmdVbva->CltCritSect);
     if (RT_SUCCESS(rc))
     {
+        if (!VBoxVBVAExHSIsEnabled(pCmdVbva))
+        {
+            Log(("cmd vbva not enabled\n"));
+            RTCritSectLeave(&pCmdVbva->CltCritSect);
+            return VERR_INVALID_STATE;
+        }
+
         if (enmSource > VBVAEXHOSTCTL_SOURCE_GUEST)
         {
-            if ((enmSource == VBVAEXHOSTCTL_SOURCE_HOST_ENABLED) && !VBoxVBVAExHSIsEnabled(pCmdVbva))
-            {
-                WARN(("cmd vbva not enabled\n"));
-                RTCritSectLeave(&pCmdVbva->CltCritSect);
-                return VERR_INVALID_STATE;
-            }
             RTListAppend(&pCmdVbva->HostCtlList, &pCtl->Node);
         }
         else
@@ -639,26 +788,13 @@ static int VBoxVBVAExHCtlSubmit(VBVAEXHOSTCONTEXT *pCmdVbva, VBVAEXHOSTCTL* pCtl
     return rc;
 }
 
-
-/* Loads state
- * @returns - same as VBoxVBVAExHSCheckCommands, or failure on load state fail
- */
-static int VBoxVBVAExHSLoadState(struct VBVAEXHOSTCONTEXT *pCmdVbva, uint8_t* pu8VramBase, PSSMHANDLE pSSM, uint32_t u32Version)
+#ifdef VBOX_WITH_CRHGSMI
+typedef struct VBOXVDMA_SOURCE
 {
-    AssertMsgFailed(("implement!\n"));
-    uint32_t u32;
-    int rc = SSMR3GetU32(pSSM, &u32);
-    AssertRCReturn(rc, rc);
-    if (u32 != 0xffffffff)
-    {
-        VBVABUFFER *pVBVA = (VBVABUFFER*)pu8VramBase + u32;
-        rc = VBoxVBVAExHSEnable(pCmdVbva, pVBVA);
-        AssertRCReturn(rc, rc);
-        return VBoxVBVAExHSCheckCommands(pCmdVbva);
-    }
-
-    return VINF_SUCCESS;
-}
+    VBVAINFOSCREEN Screen;
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
+} VBOXVDMA_SOURCE;
+#endif
 
 typedef struct VBOXVDMAHOST
 {
@@ -669,6 +805,9 @@ typedef struct VBOXVDMAHOST
     VBOXVDMATHREAD Thread;
     VBOXCRCMD_SVRINFO CrSrvInfo;
     VBVAEXHOSTCTL* pCurRemainingHostCtl;
+    RTSEMEVENTMULTI HostCrCtlCompleteEvent;
+    int32_t volatile i32cHostCrCtlCompleted;
+//    VBOXVDMA_SOURCE aSources[VBOX_VIDEO_MAX_SCREENS];
 #endif
 #ifdef VBOX_VDMA_WITH_WATCHDOG
     PTMTIMERR3 WatchDogTimer;
@@ -677,23 +816,32 @@ typedef struct VBOXVDMAHOST
 
 #ifdef VBOX_WITH_CRHGSMI
 
-int VBoxVDMAThreadNotifyConstructSucceeded(PVBOXVDMATHREAD pThread)
+void VBoxVDMAThreadNotifyConstructSucceeded(PVBOXVDMATHREAD pThread, void *pvThreadContext)
 {
-    Assert(pThread->u32State == VBOXVDMATHREAD_STATE_TERMINATED);
-    pThread->u32State = VBOXVDMATHREAD_STATE_CREATED;
-    int rc = RTSemEventSignal(pThread->hClientEvent);
-    AssertRC(rc);
-    return VINF_SUCCESS;
+    Assert(pThread->u32State == VBOXVDMATHREAD_STATE_CREATING);
+    PFNVBOXVDMATHREAD_CHANGED pfnChanged = pThread->pfnChanged;
+    void *pvChanged = pThread->pvChanged;
+
+    pThread->pfnChanged = NULL;
+    pThread->pvChanged = NULL;
+
+    ASMAtomicWriteU32(&pThread->u32State, VBOXVDMATHREAD_STATE_CREATED);
+
+    if (pfnChanged)
+        pfnChanged(pThread, VINF_SUCCESS, pvThreadContext, pvChanged);
 }
 
-int VBoxVDMAThreadNotifyConstructFailed(PVBOXVDMATHREAD pThread)
+void VBoxVDMAThreadNotifyTerminatingSucceeded(PVBOXVDMATHREAD pThread, void *pvThreadContext)
 {
-    Assert(pThread->u32State == VBOXVDMATHREAD_STATE_TERMINATED);
-    int rc = RTSemEventSignal(pThread->hClientEvent);
-    AssertRC(rc);
-    if (RT_SUCCESS(rc))
-        return VINF_SUCCESS;
-    return rc;
+    Assert(pThread->u32State == VBOXVDMATHREAD_STATE_TERMINATING);
+    PFNVBOXVDMATHREAD_CHANGED pfnChanged = pThread->pfnChanged;
+    void *pvChanged = pThread->pvChanged;
+
+    pThread->pfnChanged = NULL;
+    pThread->pvChanged = NULL;
+
+    if (pfnChanged)
+        pfnChanged(pThread, VINF_SUCCESS, pvThreadContext, pvChanged);
 }
 
 DECLINLINE(bool) VBoxVDMAThreadIsTerminating(PVBOXVDMATHREAD pThread)
@@ -701,44 +849,67 @@ DECLINLINE(bool) VBoxVDMAThreadIsTerminating(PVBOXVDMATHREAD pThread)
     return ASMAtomicUoReadU32(&pThread->u32State) == VBOXVDMATHREAD_STATE_TERMINATING;
 }
 
-int VBoxVDMAThreadCreate(PVBOXVDMATHREAD pThread, PFNRTTHREAD pfnThread, void *pvThread)
+void VBoxVDMAThreadInit(PVBOXVDMATHREAD pThread)
 {
-    int rc = RTSemEventCreate(&pThread->hEvent);
-    if (RT_SUCCESS(rc))
+    memset(pThread, 0, sizeof (*pThread));
+    pThread->u32State = VBOXVDMATHREAD_STATE_TERMINATED;
+}
+
+int VBoxVDMAThreadCleanup(PVBOXVDMATHREAD pThread)
+{
+    uint32_t u32State = ASMAtomicUoReadU32(&pThread->u32State);
+    switch (u32State)
     {
-        rc = RTSemEventCreate(&pThread->hClientEvent);
-        if (RT_SUCCESS(rc))
+        case VBOXVDMATHREAD_STATE_TERMINATED:
+            return VINF_SUCCESS;
+        case VBOXVDMATHREAD_STATE_TERMINATING:
         {
-            pThread->u32State = VBOXVDMATHREAD_STATE_TERMINATED;
-            rc = RTThreadCreate(&pThread->hWorkerThread, pfnThread, pvThread, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "VDMA");
-            if (RT_SUCCESS(rc))
+            int rc = RTThreadWait(pThread->hWorkerThread, RT_INDEFINITE_WAIT, NULL);
+            if (!RT_SUCCESS(rc))
             {
-                rc = RTSemEventWait(pThread->hClientEvent, RT_INDEFINITE_WAIT);
-                if (RT_SUCCESS(rc))
-                {
-                    if (pThread->u32State == VBOXVDMATHREAD_STATE_CREATED)
-                        return VINF_SUCCESS;
-                    WARN(("thread routine failed the initialization\n"));
-                    rc = VERR_INVALID_STATE;
-                }
-                else
-                    WARN(("RTSemEventWait failed %d\n", rc));
-
-                RTThreadWait(pThread->hWorkerThread, RT_INDEFINITE_WAIT, NULL);
+                WARN(("RTThreadWait failed %d\n", rc));
+                return rc;
             }
-            else
-                WARN(("RTThreadCreate failed %d\n", rc));
 
-            RTSemEventDestroy(pThread->hClientEvent);
+            RTSemEventDestroy(pThread->hEvent);
+
+            ASMAtomicWriteU32(&pThread->u32State, VBOXVDMATHREAD_STATE_TERMINATED);
+            return VINF_SUCCESS;
         }
+        default:
+            WARN(("invalid state"));
+            return VERR_INVALID_STATE;
+    }
+}
+
+int VBoxVDMAThreadCreate(PVBOXVDMATHREAD pThread, PFNRTTHREAD pfnThread, void *pvThread, PFNVBOXVDMATHREAD_CHANGED pfnCreated, void*pvCreated)
+{
+    int rc = VBoxVDMAThreadCleanup(pThread);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("VBoxVDMAThreadCleanup failed %d\n", rc));
+        return rc;
+    }
+
+    rc = RTSemEventCreate(&pThread->hEvent);
+    if (RT_SUCCESS(rc))
+    {
+        pThread->u32State = VBOXVDMATHREAD_STATE_CREATING;
+        pThread->pfnChanged = pfnCreated;
+        pThread->pvChanged = pvCreated;
+        rc = RTThreadCreate(&pThread->hWorkerThread, pfnThread, pvThread, 0, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "VDMA");
+        if (RT_SUCCESS(rc))
+            return VINF_SUCCESS;
         else
-            WARN(("RTSemEventCreate failed %d\n", rc));
+            WARN(("RTThreadCreate failed %d\n", rc));
 
         RTSemEventDestroy(pThread->hEvent);
     }
     else
         WARN(("RTSemEventCreate failed %d\n", rc));
 
+    pThread->u32State = VBOXVDMATHREAD_STATE_TERMINATED;
+
     return rc;
 }
 
@@ -756,25 +927,45 @@ DECLINLINE(int) VBoxVDMAThreadEventWait(PVBOXVDMATHREAD pThread, RTMSINTERVAL cM
     return rc;
 }
 
-void VBoxVDMAThreadMarkTerminating(PVBOXVDMATHREAD pThread)
-{
-    Assert(pThread->u32State == VBOXVDMATHREAD_STATE_CREATED);
-    ASMAtomicWriteU32(&pThread->u32State, VBOXVDMATHREAD_STATE_TERMINATING);
-}
-
-void VBoxVDMAThreadTerm(PVBOXVDMATHREAD pThread)
+int VBoxVDMAThreadTerm(PVBOXVDMATHREAD pThread, PFNVBOXVDMATHREAD_CHANGED pfnTerminated, void*pvTerminated, bool fNotify)
 {
     int rc;
-    if (ASMAtomicReadU32(&pThread->u32State) != VBOXVDMATHREAD_STATE_TERMINATING)
+    do
     {
-        VBoxVDMAThreadMarkTerminating(pThread);
-        rc = VBoxVDMAThreadEventNotify(pThread);
-        AssertRC(rc);
-    }
-    rc = RTThreadWait(pThread->hWorkerThread, RT_INDEFINITE_WAIT, NULL);
-    AssertRC(rc);
-    RTSemEventDestroy(pThread->hClientEvent);
-    RTSemEventDestroy(pThread->hEvent);
+        uint32_t u32State = ASMAtomicUoReadU32(&pThread->u32State);
+        switch (u32State)
+        {
+            case VBOXVDMATHREAD_STATE_CREATED:
+                pThread->pfnChanged = pfnTerminated;
+                pThread->pvChanged = pvTerminated;
+                ASMAtomicWriteU32(&pThread->u32State, VBOXVDMATHREAD_STATE_TERMINATING);
+                if (fNotify)
+                {
+                    rc = VBoxVDMAThreadEventNotify(pThread);
+                    AssertRC(rc);
+                }
+                return VINF_SUCCESS;
+            case VBOXVDMATHREAD_STATE_TERMINATING:
+            case VBOXVDMATHREAD_STATE_TERMINATED:
+            {
+                WARN(("thread is marked to termination or terminated\nn"));
+                return VERR_INVALID_STATE;
+            }
+            case VBOXVDMATHREAD_STATE_CREATING:
+            {
+                /* wait till the thread creation is completed */
+                WARN(("concurrent thread create/destron\n"));
+                RTThreadYield();
+                continue;
+            }
+            default:
+                WARN(("invalid state"));
+                return VERR_INVALID_STATE;
+        }
+    } while (1);
+
+    WARN(("should never be here\n"));
+    return VERR_INTERNAL_ERROR;
 }
 
 static int vdmaVBVACtlSubmitSync(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL* pCtl, VBVAEXHOSTCTL_SOURCE enmSource);
@@ -940,6 +1131,22 @@ static int vboxVDMACrHgcmSubmitSync(struct VBOXVDMAHOST *pVdma, VBOXCRCMDCTL* pC
     return rc;
 }
 
+static int vdmaVBVACtlDisableSync(PVBOXVDMAHOST pVdma)
+{
+    VBVAEXHOSTCTL HCtl;
+    HCtl.enmType = VBVAEXHOSTCTL_TYPE_GHH_DISABLE;
+    int rc = vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
+    if (RT_FAILURE(rc))
+    {
+        Log(("vdmaVBVACtlSubmitSync failed %d\n", rc));
+        return rc;
+    }
+
+    vgaUpdateDisplayAll(pVdma->pVGAState);
+
+    return VINF_SUCCESS;
+}
+
 static DECLCALLBACK(uint8_t*) vboxVDMACrHgcmHandleEnableRemainingHostCommand(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hClient, uint32_t *pcbCtl, int prevCmdRc)
 {
     struct VBOXVDMAHOST *pVdma = hClient;
@@ -964,12 +1171,40 @@ static DECLCALLBACK(uint8_t*) vboxVDMACrHgcmHandleEnableRemainingHostCommand(HVB
     return NULL;
 }
 
+static DECLCALLBACK(void) vboxVDMACrHgcmNotifyTerminatingDoneCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient)
+{
+    struct VBOXVDMAHOST *pVdma = hClient;
+    Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_STATE_PROCESSING);
+    Assert(pVdma->Thread.u32State == VBOXVDMATHREAD_STATE_TERMINATING);
+}
+
+static DECLCALLBACK(int) vboxVDMACrHgcmNotifyTerminatingCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient, VBOXCRCMDCTL_HGCMENABLE_DATA *pHgcmEnableData)
+{
+    struct VBOXVDMAHOST *pVdma = hClient;
+    VBVAEXHOSTCTL HCtl;
+    HCtl.enmType = VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_UNLOAD;
+    int rc = vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
+
+    pHgcmEnableData->hRHCmd = pVdma;
+    pHgcmEnableData->pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
+
+    if (RT_FAILURE(rc))
+    {
+        if (rc == VERR_INVALID_STATE)
+            rc = VINF_SUCCESS;
+        else
+            WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc));
+    }
+
+    return rc;
+}
+
 static int vboxVDMACrHgcmHandleEnable(struct VBOXVDMAHOST *pVdma)
 {
     VBOXCRCMDCTL_ENABLE Enable;
     Enable.Hdr.enmType = VBOXCRCMDCTL_TYPE_ENABLE;
-    Enable.hRHCmd = pVdma;
-    Enable.pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
+    Enable.Data.hRHCmd = pVdma;
+    Enable.Data.pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
 
     int rc = vboxVDMACrHgcmSubmitSync(pVdma, &Enable.Hdr, sizeof (Enable));
     Assert(!pVdma->pCurRemainingHostCtl);
@@ -1011,9 +1246,12 @@ static int vdmaVBVAEnableProcess(struct VBOXVDMAHOST *pVdma, uint32_t u32Offset)
     int rc = VBoxVBVAExHSEnable(&pVdma->CmdVbva, pVBVA);
     if (RT_SUCCESS(rc))
     {
-        VBOXCRCMDCTL Ctl;
-        Ctl.enmType = VBOXCRCMDCTL_TYPE_DISABLE;
-        rc = vboxVDMACrHgcmSubmitSync(pVdma, &Ctl, sizeof (Ctl));
+        VBOXCRCMDCTL_DISABLE Disable;
+        Disable.Hdr.enmType = VBOXCRCMDCTL_TYPE_DISABLE;
+        Disable.Data.hNotifyTerm = pVdma;
+        Disable.Data.pfnNotifyTerm = vboxVDMACrHgcmNotifyTerminatingCb;
+        Disable.Data.pfnNotifyTermDone = vboxVDMACrHgcmNotifyTerminatingDoneCb;
+        rc = vboxVDMACrHgcmSubmitSync(pVdma, &Disable.Hdr, sizeof (Disable));
         if (RT_SUCCESS(rc))
         {
             PVGASTATE pVGAState = pVdma->pVGAState;
@@ -1041,7 +1279,7 @@ static int vdmaVBVAEnableProcess(struct VBOXVDMAHOST *pVdma, uint32_t u32Offset)
     return rc;
 }
 
-static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma)
+static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma, bool fDoHgcmEnable)
 {
     if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
     {
@@ -1052,72 +1290,136 @@ static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma)
     int rc = pVdma->CrSrvInfo.pfnDisable(pVdma->CrSrvInfo.hSvr);
     if (RT_SUCCESS(rc))
     {
-        /* disable is a bit tricky
-         * we need to ensure the host ctl commands do not come out of order
-         * and do not come over HGCM channel until after it is enabled */
-        rc = vboxVDMACrHgcmHandleEnable(pVdma);
-        if (RT_SUCCESS(rc))
-            return rc;
-
-        PVGASTATE pVGAState = pVdma->pVGAState;
-        VBOXCRCMD_SVRENABLE_INFO Info;
-        Info.hCltScr = pVGAState->pDrv;
-        Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin;
-        Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess;
-        Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd;
-        pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info);
-    }
-    else
-        WARN(("pfnDisable failed %d\n", rc));
+        if (fDoHgcmEnable)
+        {
+            PVGASTATE pVGAState = pVdma->pVGAState;
 
-    return rc;
-}
+            /* disable is a bit tricky
+             * we need to ensure the host ctl commands do not come out of order
+             * and do not come over HGCM channel until after it is enabled */
+            rc = vboxVDMACrHgcmHandleEnable(pVdma);
+            if (RT_SUCCESS(rc))
+            {
+                vdmaVBVANotifyDisable(pVGAState);
+                return VINF_SUCCESS;
+            }
 
-static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd)
+            VBOXCRCMD_SVRENABLE_INFO Info;
+            Info.hCltScr = pVGAState->pDrv;
+            Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin;
+            Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess;
+            Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd;
+            pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info);
+        }
+    }
+    else
+        WARN(("pfnDisable failed %d\n", rc));
+
+    return rc;
+}
+
+static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd, bool *pfContinue)
 {
+    *pfContinue = true;
+
     switch (pCmd->enmType)
     {
-        case VBVAEXHOSTCTL_TYPE_HH_SAVESTATE:
-            if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
-            {
-                WARN(("VBVAEXHOSTCTL_TYPE_HH_SAVESTATE for disabled vdma VBVA\n"));
-                return VERR_INVALID_STATE;
-            }
-            return pVdma->CrSrvInfo.pfnSaveState(pVdma->CrSrvInfo.hSvr, pCmd->u.state.pSSM);
-        case VBVAEXHOSTCTL_TYPE_HH_LOADSTATE:
-            if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
-            {
-                WARN(("VBVAEXHOSTCTL_TYPE_HH_LOADSTATE for disabled vdma VBVA\n"));
-                return VERR_INVALID_STATE;
-            }
-            return pVdma->CrSrvInfo.pfnLoadState(pVdma->CrSrvInfo.hSvr, pCmd->u.state.pSSM, pCmd->u.state.u32Version);
         case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE:
+        {
             if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
             {
                 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
                 return VERR_INVALID_STATE;
             }
             return pVdma->CrSrvInfo.pfnHostCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd);
-        case VBVAEXHOSTCTL_TYPE_HH_TERM:
+        }
+        case VBVAEXHOSTCTL_TYPE_GHH_DISABLE:
         {
-            int rc = vdmaVBVADisableProcess(pVdma);
-            if (!RT_SUCCESS(rc))
+            int rc = vdmaVBVADisableProcess(pVdma, true);
+            if (RT_FAILURE(rc))
             {
                 WARN(("vdmaVBVADisableProcess failed %d\n", rc));
                 return rc;
             }
 
-            VBoxVDMAThreadMarkTerminating(&pVdma->Thread);
-            return VINF_SUCCESS;
+            return VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, false);
         }
-        case VBVAEXHOSTCTL_TYPE_HH_RESET:
+        case VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_UNLOAD:
         {
-            int rc = vdmaVBVADisableProcess(pVdma);
-            if (!RT_SUCCESS(rc))
+            int rc = vdmaVBVADisableProcess(pVdma, false);
+            if (RT_FAILURE(rc))
             {
                 WARN(("vdmaVBVADisableProcess failed %d\n", rc));
                 return rc;
             }
+
+            rc = VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, true);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("VBoxVDMAThreadTerm failed %d\n", rc));
+                return rc;
+            }
+
+            *pfContinue = false;
+            return VINF_SUCCESS;
+        }
+        case VBVAEXHOSTCTL_TYPE_HH_SAVESTATE:
+        {
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
+            int rc = VBoxVBVAExHSSaveState(&pVdma->CmdVbva, pu8VramBase, pCmd->u.state.pSSM);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("VBoxVBVAExHSSaveState failed %d\n", rc));
+                return rc;
+            }
+            return pVdma->CrSrvInfo.pfnSaveState(pVdma->CrSrvInfo.hSvr, pCmd->u.state.pSSM);
+        }
+        case VBVAEXHOSTCTL_TYPE_HH_LOADSTATE:
+        {
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
+
+            int rc = VBoxVBVAExHSLoadState(&pVdma->CmdVbva, pu8VramBase, pCmd->u.state.pSSM, pCmd->u.state.u32Version);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("VBoxVBVAExHSSaveState failed %d\n", rc));
+                return rc;
+            }
+
+            rc = pVdma->CrSrvInfo.pfnLoadState(pVdma->CrSrvInfo.hSvr, pCmd->u.state.pSSM, pCmd->u.state.u32Version);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("pfnLoadState failed %d\n", rc));
+                return rc;
+            }
+
+            return VINF_SUCCESS;
+        }
+        case VBVAEXHOSTCTL_TYPE_HH_LOADSTATE_DONE:
+        {
+            PVGASTATE pVGAState = pVdma->pVGAState;
+
+            for (uint32_t i = 0; i < pVGAState->cMonitors; ++i)
+            {
+                VBVAINFOSCREEN CurScreen;
+                VBVAINFOVIEW CurView;
+
+                int rc = VBVAGetInfoViewAndScreen(pVGAState, i, &CurView, &CurScreen);
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("VBVAGetInfoViewAndScreen failed %d\n", rc));
+                    return rc;
+                }
+
+                rc = VBVAInfoScreen(pVGAState, &CurScreen);
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("VBVAInfoScreen failed %d\n", rc));
+                    return rc;
+                }
+            }
+
             return VINF_SUCCESS;
         }
         default:
@@ -1126,28 +1428,186 @@ static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *p
     }
 }
 
+static int vboxVDMACrGuestCtlResizeEntryProcess(struct VBOXVDMAHOST *pVdma, VBOXCMDVBVA_RESIZE_ENTRY *pEntry)
+{
+    PVGASTATE pVGAState = pVdma->pVGAState;
+    VBVAINFOSCREEN Screen = pEntry->Screen;
+    VBVAINFOVIEW View;
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
+    uint32_t u32ViewIndex = Screen.u32ViewIndex;
+    uint16_t u16Flags = Screen.u16Flags;
+    bool fDisable = false;
+
+    memcpy(aTargetMap, pEntry->aTargetMap, sizeof (aTargetMap));
+
+    ASMBitClearRange(aTargetMap, pVGAState->cMonitors, VBOX_VIDEO_MAX_SCREENS);
+
+    if (u16Flags & VBVA_SCREEN_F_DISABLED)
+    {
+        fDisable = true;
+        memset(&Screen, 0, sizeof (Screen));
+        Screen.u32ViewIndex = u32ViewIndex;
+        Screen.u16Flags = VBVA_SCREEN_F_ACTIVE | VBVA_SCREEN_F_DISABLED;
+    }
+
+    if (u32ViewIndex > pVGAState->cMonitors)
+    {
+        if (u32ViewIndex != 0xffffffff)
+        {
+            WARN(("invalid view index\n"));
+            return VERR_INVALID_PARAMETER;
+        }
+        else if (!fDisable)
+        {
+            WARN(("0xffffffff view index only valid for disable requests\n"));
+            return VERR_INVALID_PARAMETER;
+        }
+    }
+
+    View.u32ViewOffset = 0;
+    View.u32ViewSize = Screen.u32LineSize * Screen.u32Height + Screen.u32StartOffset;
+    View.u32MaxScreenSize = View.u32ViewSize + Screen.u32Width + 1; /* <- make VBVAInfoScreen logic (offEnd < pView->u32MaxScreenSize) happy */
+
+    int rc = VINF_SUCCESS;
+
+    for (int i = ASMBitFirstSet(aTargetMap, pVGAState->cMonitors);
+            i >= 0;
+            i = ASMBitNextSet(aTargetMap, pVGAState->cMonitors, i))
+    {
+        Screen.u32ViewIndex = i;
+
+        VBVAINFOSCREEN CurScreen;
+        VBVAINFOVIEW CurView;
+
+        rc = VBVAGetInfoViewAndScreen(pVGAState, i, &CurView, &CurScreen);
+        AssertRC(rc);
+
+        if (!memcmp(&Screen, &CurScreen, sizeof (CurScreen)))
+            continue;
+
+        if (!fDisable || !CurView.u32ViewSize)
+        {
+            View.u32ViewIndex = Screen.u32ViewIndex;
+
+            rc = VBVAInfoView(pVGAState, &View);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("VBVAInfoView failed %d\n", rc));
+                break;
+            }
+        }
+
+        rc = VBVAInfoScreen(pVGAState, &Screen);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("VBVAInfoScreen failed %d\n", rc));
+            break;
+        }
+    }
+
+    if (RT_FAILURE(rc))
+        return rc;
+
+    Screen.u32ViewIndex = u32ViewIndex;
+
+    rc = pVdma->CrSrvInfo.pfnResize(pVdma->CrSrvInfo.hSvr, &Screen, aTargetMap);
+    if (RT_FAILURE(rc))
+        WARN(("pfnResize failed %d\n", rc));
+
+    return rc;
+}
+
 static int vboxVDMACrGuestCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd)
 {
-    switch (pCmd->enmType)
+    VBVAEXHOSTCTL_TYPE enmType = pCmd->enmType;
+    switch (enmType)
     {
-       case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE:
-           if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
-           {
-               WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
-               return VERR_INVALID_STATE;
-           }
-           return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd);
-        case VBVAEXHOSTCTL_TYPE_GH_ENABLE_DISABLE:
+        case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE:
+        {
+            if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
+            {
+                WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
+                return VERR_INVALID_STATE;
+            }
+            return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd);
+        }
+        case VBVAEXHOSTCTL_TYPE_GHH_RESIZE:
+        {
+            if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
+            {
+                WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
+                return VERR_INVALID_STATE;
+            }
+
+            uint32_t cbCmd = pCmd->u.cmd.cbCmd;
+
+            if (cbCmd % sizeof (VBOXCMDVBVA_RESIZE_ENTRY))
+            {
+                WARN(("invalid buffer size\n"));
+                return VERR_INVALID_PARAMETER;
+            }
+
+            uint32_t cElements = cbCmd / sizeof (VBOXCMDVBVA_RESIZE_ENTRY);
+            if (!cElements)
+            {
+                WARN(("invalid buffer size\n"));
+                return VERR_INVALID_PARAMETER;
+            }
+
+            VBOXCMDVBVA_RESIZE *pResize = (VBOXCMDVBVA_RESIZE*)pCmd->u.cmd.pu8Cmd;
+
+            int rc = VINF_SUCCESS;
+
+            for (uint32_t i = 0; i < cElements; ++i)
+            {
+                VBOXCMDVBVA_RESIZE_ENTRY *pEntry = &pResize->aEntries[i];
+                rc = vboxVDMACrGuestCtlResizeEntryProcess(pVdma, pEntry);
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("vboxVDMACrGuestCtlResizeEntryProcess failed %d\n", rc));
+                    break;
+                }
+            }
+            return rc;
+        }
+        case VBVAEXHOSTCTL_TYPE_GHH_ENABLE:
+        case VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED:
         {
             VBVAENABLE *pEnable = (VBVAENABLE *)pCmd->u.cmd.pu8Cmd;
             Assert(pCmd->u.cmd.cbCmd == sizeof (VBVAENABLE));
-            if ((pEnable->u32Flags & (VBVA_F_ENABLE | VBVA_F_DISABLE)) == VBVA_F_ENABLE)
+            uint32_t u32Offset = pEnable->u32Offset;
+            int rc = vdmaVBVAEnableProcess(pVdma, u32Offset);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("vdmaVBVAEnableProcess failed %d\n", rc));
+                return rc;
+            }
+
+            if (enmType == VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED)
+            {
+                rc = VBoxVBVAExHPPause(&pVdma->CmdVbva);
+                if (!RT_SUCCESS(rc))
+                {
+                    WARN(("VBoxVBVAExHPPause failed %d\n", rc));
+                    return rc;
+                }
+            }
+
+            return VINF_SUCCESS;
+        }
+        case VBVAEXHOSTCTL_TYPE_GHH_DISABLE:
+        {
+            int rc = vdmaVBVADisableProcess(pVdma, true);
+            if (RT_FAILURE(rc))
             {
-                uint32_t u32Offset = pEnable->u32Offset;
-                return vdmaVBVAEnableProcess(pVdma, u32Offset);
+                WARN(("vdmaVBVADisableProcess failed %d\n", rc));
+                return rc;
             }
 
-            return vdmaVBVADisableProcess(pVdma);
+            /* do vgaUpdateDisplayAll right away */
+            vgaUpdateDisplayAll(pVdma->pVGAState);
+
+            return VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, false);
         }
         default:
             WARN(("unexpected ctl type %d\n", pCmd->enmType));
@@ -1155,66 +1615,435 @@ static int vboxVDMACrGuestCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *
     }
 }
 
-
-/*
- * @returns
- *
+/**
+ * @param fIn - whether this is a page in or out op.
+ * the direction is VRA#M - related, so fIn == true - transfer to VRAM); false - transfer from VRAM
  */
-static int vboxVDMACrCmdProcess(struct VBOXVDMAHOST *pVdma, uint8_t* pu8Cmd, uint32_t cbCmd)
+static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, VBOXCMDVBVAPAGEIDX iPage, uint8_t *pu8Vram, bool fIn)
 {
-    if (*pu8Cmd == VBOXCMDVBVA_OPTYPE_NOP)
-        return VINF_EOF;
-
-    PVBOXCMDVBVA_HDR pCmd = (PVBOXCMDVBVA_HDR)pu8Cmd;
+    RTGCPHYS phPage = (RTGCPHYS)iPage << PAGE_SHIFT;
+    PGMPAGEMAPLOCK Lock;
+    int rc;
 
-    /* check if the command is cancelled */
-    if (!ASMAtomicCmpXchgU8(&pCmd->u8State, VBOXCMDVBVA_STATE_IN_PROGRESS, VBOXCMDVBVA_STATE_SUBMITTED))
+    if (fIn)
     {
-        Assert(pCmd->u8State == VBOXCMDVBVA_STATE_CANCELLED);
-        return VINF_EOF;
-    }
+        const void * pvPage;
+        rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvPage, &Lock);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d", rc));
+            return rc;
+        }
 
-    /* come commands can be handled right away? */
-    switch (pCmd->u8OpCode)
+        memcpy(pu8Vram, pvPage, PAGE_SIZE);
+
+        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
+    }
+    else
     {
-        case VBOXCMDVBVA_OPTYPE_NOPCMD:
-            pCmd->u.i8Result = 0;
-            return VINF_EOF;
-        default:
-            return VINF_SUCCESS;
+        void * pvPage;
+        rc = PDMDevHlpPhysGCPhys2CCPtr(pDevIns, phPage, 0, &pvPage, &Lock);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("PDMDevHlpPhysGCPhys2CCPtr failed %d", rc));
+            return rc;
+        }
+
+        memcpy(pvPage, pu8Vram, PAGE_SIZE);
+
+        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
     }
+
+    return VINF_SUCCESS;
 }
 
-static DECLCALLBACK(int) vboxVDMACrCmdEnable(HVBOXCRCMDSVR hSvr, VBOXCRCMD_SVRENABLE_INFO *pInfo)
+static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVAPAGEIDX *piPages, uint32_t cPages, uint8_t *pu8Vram, bool fIn)
 {
+    for (uint32_t i = 0; i < cPages; ++i, pu8Vram += PAGE_SIZE)
+    {
+        int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, piPages[i], pu8Vram, fIn);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("vboxVDMACrCmdVbvaProcessPagingEl failed %d", rc));
+            return rc;
+        }
+    }
+
     return VINF_SUCCESS;
 }
 
-static DECLCALLBACK(void) vboxVDMACrCmdDisable(HVBOXCRCMDSVR hSvr)
+static int8_t vboxVDMACrCmdVbvaPagingDataInit(PVGASTATE pVGAState, const VBOXCMDVBVA_HDR *pHdr, const VBOXCMDVBVA_PAGING_TRANSFER_DATA *pData, uint32_t cbCmd,
+                            const VBOXCMDVBVAPAGEIDX **ppPages, VBOXCMDVBVAPAGEIDX *pcPages,
+                            uint8_t **ppu8Vram, bool *pfIn)
 {
+    if (cbCmd < sizeof (VBOXCMDVBVA_PAGING_TRANSFER))
+    {
+        WARN(("cmd too small"));
+        return -1;
+    }
+
+    VBOXCMDVBVAPAGEIDX cPages = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, Data.aPageNumbers);
+    if (cPages % sizeof (VBOXCMDVBVAPAGEIDX))
+    {
+        WARN(("invalid cmd size"));
+        return -1;
+    }
+    cPages /= sizeof (VBOXCMDVBVAPAGEIDX);
+
+    VBOXCMDVBVAOFFSET offVRAM = pData->Alloc.u.offVRAM;
+    if (offVRAM & PAGE_OFFSET_MASK)
+    {
+        WARN(("offVRAM address is not on page boundary\n"));
+        return -1;
+    }
+    const VBOXCMDVBVAPAGEIDX *pPages = pData->aPageNumbers;
+
+    uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
+    uint8_t *pu8VramMax = pu8VramBase + pVGAState->vram_size;
+    if (offVRAM >= pVGAState->vram_size)
+    {
+        WARN(("invalid vram offset"));
+        return -1;
+    }
+
+    if (~(~(VBOXCMDVBVAPAGEIDX)0 >> PAGE_SHIFT) & cPages)
+    {
+        WARN(("invalid cPages %d", cPages));
+        return -1;
+    }
+
+    if (offVRAM + ((VBOXCMDVBVAOFFSET)cPages << PAGE_SHIFT) >= pVGAState->vram_size)
+    {
+        WARN(("invalid cPages %d, exceeding vram size", cPages));
+        return -1;
+    }
+
+    uint8_t *pu8Vram = pu8VramBase + offVRAM;
+    bool fIn = !!(pHdr->u8Flags & VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN);
+
+    *ppPages = pPages;
+    *pcPages = cPages;
+    *ppu8Vram = pu8Vram;
+    *pfIn = fIn;
+    return 0;
 }
 
-static DECLCALLBACK(int) vboxVDMACrCmdCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd)
+static int8_t vboxVDMACrCmdVbvaPagingFill(PVGASTATE pVGAState, VBOXCMDVBVA_PAGING_FILL *pFill)
 {
-    return VERR_NOT_SUPPORTED;
+    VBOXCMDVBVAOFFSET offVRAM = pFill->offVRAM;
+    if (offVRAM & PAGE_OFFSET_MASK)
+    {
+        WARN(("offVRAM address is not on page boundary\n"));
+        return -1;
+    }
+
+    uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
+    uint8_t *pu8VramMax = pu8VramBase + pVGAState->vram_size;
+    if (offVRAM >= pVGAState->vram_size)
+    {
+        WARN(("invalid vram offset"));
+        return -1;
+    }
+
+    uint32_t cbFill = pFill->u32CbFill;
+
+    if (offVRAM + cbFill >= pVGAState->vram_size)
+    {
+        WARN(("invalid cPages"));
+        return -1;
+    }
+
+    uint32_t *pu32Vram = (uint32_t*)(pu8VramBase + offVRAM);
+    uint32_t u32Color = pFill->u32Pattern;
+
+    Assert(!(cbFill % 4));
+    for (uint32_t i = 0; i < cbFill / 4; ++i)
+    {
+        pu32Vram[i] = u32Color;
+    }
+
+    return 0;
 }
 
-static DECLCALLBACK(int) vboxVDMACrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
+static int8_t vboxVDMACrCmdVbvaProcessCmdData(struct VBOXVDMAHOST *pVdma, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd)
 {
     switch (pCmd->u8OpCode)
     {
-#if 0
-        case VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID:
+        case VBOXCMDVBVA_OPTYPE_NOPCMD:
+            return 0;
+        case VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER:
         {
-            crVBoxServerCrCmdBltProcess(pCmd, cbCmd);
-            break;
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            const VBOXCMDVBVAPAGEIDX *pPages;
+            uint32_t cPages;
+            uint8_t *pu8Vram;
+            bool fIn;
+            int8_t i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, &((VBOXCMDVBVA_PAGING_TRANSFER*)pCmd)->Data, cbCmd,
+                                                                &pPages, &cPages,
+                                                                &pu8Vram, &fIn);
+            if (i8Result < 0)
+            {
+                WARN(("vboxVDMACrCmdVbvaPagingDataInit failed %d", i8Result));
+                return i8Result;
+            }
+
+            PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
+            int rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cPages, pu8Vram, fIn);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("vboxVDMACrCmdVbvaProcessPagingEls failed %d", rc));
+                return -1;
+            }
+
+            return 0;
+        }
+        case VBOXCMDVBVA_OPTYPE_PAGING_FILL:
+        {
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            if (cbCmd != sizeof (VBOXCMDVBVA_PAGING_FILL))
+            {
+                WARN(("cmd too small"));
+                return -1;
+            }
+
+            return vboxVDMACrCmdVbvaPagingFill(pVGAState, (VBOXCMDVBVA_PAGING_FILL*)pCmd);
         }
+        default:
+            return pVdma->CrSrvInfo.pfnCmd(pVdma->CrSrvInfo.hSvr, pCmd, cbCmd);
+    }
+}
+
+#if 0
+typedef struct VBOXCMDVBVA_PAGING_TRANSFER
+{
+    VBOXCMDVBVA_HDR Hdr;
+    /* for now can only contain offVRAM.
+     * paging transfer can NOT be initiated for allocations having host 3D object (hostID) associated */
+    VBOXCMDVBVA_ALLOCINFO Alloc;
+    uint32_t u32Reserved;
+    VBOXCMDVBVA_SYSMEMEL aSysMem[1];
+} VBOXCMDVBVA_PAGING_TRANSFER;
 #endif
+
+AssertCompile(sizeof (VBOXCMDVBVA_HDR) == 8);
+AssertCompile(sizeof (VBOXCMDVBVA_ALLOCINFO) == 4);
+AssertCompile(sizeof (VBOXCMDVBVAPAGEIDX) == 4);
+AssertCompile(!(PAGE_SIZE % sizeof (VBOXCMDVBVAPAGEIDX)));
+
+#define VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE (PAGE_SIZE / sizeof (VBOXCMDVBVA_SYSMEMEL))
+
+static int8_t vboxVDMACrCmdVbvaProcess(struct VBOXVDMAHOST *pVdma, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd)
+{
+    switch (pCmd->u8OpCode)
+    {
+        case VBOXCMDVBVA_OPTYPE_SYSMEMCMD:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_SYSMEMCMD))
+            {
+                WARN(("invalid command size"));
+                return -1;
+            }
+            VBOXCMDVBVA_SYSMEMCMD *pSysmemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pCmd;
+            const VBOXCMDVBVA_HDR *pRealCmdHdr;
+            uint32_t cbRealCmd = pCmd->u8Flags;
+            cbRealCmd |= (uint32_t)pCmd->u.u8PrimaryID << 8;
+            if (cbRealCmd < sizeof (VBOXCMDVBVA_HDR))
+            {
+                WARN(("invalid sysmem cmd size"));
+                return -1;
+            }
+
+            RTGCPHYS phCmd = (RTGCPHYS)pSysmemCmd->phCmd;
+
+            PGMPAGEMAPLOCK Lock;
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
+            const void * pvCmd;
+            int rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d\n", rc));
+                return -1;
+            }
+
+            Assert((phCmd & PAGE_OFFSET_MASK) == (((uintptr_t)pvCmd) & PAGE_OFFSET_MASK));
+
+            uint32_t cbCmdPart = PAGE_SIZE - (((uintptr_t)pvCmd) & PAGE_OFFSET_MASK);
+
+            if (cbRealCmd <= cbCmdPart)
+            {
+                pRealCmdHdr = (const VBOXCMDVBVA_HDR *)pvCmd;
+                uint8_t i8Result = vboxVDMACrCmdVbvaProcessCmdData(pVdma, pRealCmdHdr, cbRealCmd);
+                PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
+                return i8Result;
+            }
+
+            VBOXCMDVBVA_HDR Hdr;
+            const void *pvCurCmdTail;
+            uint32_t cbCurCmdTail;
+            if (cbCmdPart >= sizeof (*pRealCmdHdr))
+            {
+                pRealCmdHdr = (const VBOXCMDVBVA_HDR *)pvCmd;
+                pvCurCmdTail = (const void*)(pRealCmdHdr + 1);
+                cbCurCmdTail = cbCmdPart - sizeof (*pRealCmdHdr);
+            }
+            else
+            {
+                memcpy(&Hdr, pvCmd, cbCmdPart);
+                PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
+                phCmd += cbCmdPart;
+                Assert(!(phCmd & PAGE_OFFSET_MASK));
+                rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
+                if (!RT_SUCCESS(rc))
+                {
+                    WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d\n", rc));
+                    return -1;
+                }
+
+                cbCmdPart = sizeof (*pRealCmdHdr) - cbCmdPart;
+                memcpy(((uint8_t*)(&Hdr)) + cbCmdPart, pvCmd, cbCmdPart);
+                pRealCmdHdr = &Hdr;
+                pvCurCmdTail = (const void*)(((uint8_t*)pvCmd) + cbCmdPart);
+                cbCurCmdTail = PAGE_SIZE - cbCmdPart;
+            }
+
+            if (cbCurCmdTail > cbRealCmd - sizeof (*pRealCmdHdr))
+                cbCurCmdTail = cbRealCmd - sizeof (*pRealCmdHdr);
+
+            int8_t i8Result = 0;
+
+            switch (pRealCmdHdr->u8OpCode)
+            {
+                case VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER:
+                {
+                    const uint32_t *pPages;
+                    uint32_t cPages;
+                    uint8_t *pu8Vram;
+                    bool fIn;
+                    i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pRealCmdHdr, (const VBOXCMDVBVA_PAGING_TRANSFER_DATA*)pvCurCmdTail, cbRealCmd,
+                                                                        &pPages, &cPages,
+                                                                        &pu8Vram, &fIn);
+                    if (i8Result < 0)
+                    {
+                        WARN(("vboxVDMACrCmdVbvaPagingDataInit failed %d", i8Result));
+                        /* we need to break, not return, to ensure currently locked page is released */
+                        break;
+                    }
+
+                    if (cbCurCmdTail & 3)
+                    {
+                        WARN(("command is not alligned properly %d", cbCurCmdTail));
+                        i8Result = -1;
+                        /* we need to break, not return, to ensure currently locked page is released */
+                        break;
+                    }
+
+                    uint32_t cCurPages = cbCurCmdTail / sizeof (VBOXCMDVBVAPAGEIDX);
+                    Assert(cCurPages < cPages);
+
+                    do
+                    {
+                        rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cCurPages, pu8Vram, fIn);
+                        if (!RT_SUCCESS(rc))
+                        {
+                            WARN(("vboxVDMACrCmdVbvaProcessPagingEls failed %d", rc));
+                            i8Result = -1;
+                            /* we need to break, not return, to ensure currently locked page is released */
+                            break;
+                        }
+
+                        Assert(cPages >= cCurPages);
+                        cPages -= cCurPages;
+
+                        if (!cPages)
+                            break;
+
+                        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
+
+                        Assert(!(phCmd & PAGE_OFFSET_MASK));
+
+                        phCmd += PAGE_SIZE;
+                        pu8Vram += (VBOXCMDVBVAOFFSET)cCurPages << PAGE_SHIFT;
+
+                        rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
+                        if (!RT_SUCCESS(rc))
+                        {
+                            WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d\n", rc));
+                            /* the page is not locked, return */
+                            return -1;
+                        }
+
+                        cCurPages = PAGE_SIZE / sizeof (VBOXCMDVBVAPAGEIDX);
+                        if (cCurPages > cPages)
+                            cCurPages = cPages;
+                    } while (1);
+                    break;
+                }
+                default:
+                    WARN(("command can not be splitted"));
+                    i8Result = -1;
+                    break;
+            }
+
+            PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
+            return i8Result;
+        }
+        case VBOXCMDVBVA_OPTYPE_COMPLEXCMD:
+        {
+            Assert(cbCmd >= sizeof (VBOXCMDVBVA_HDR));
+            ++pCmd;
+            cbCmd -= sizeof (*pCmd);
+            uint32_t cbCurCmd = 0;
+            for ( ; cbCmd; cbCmd -= cbCurCmd, pCmd = (VBOXCMDVBVA_HDR*)(((uint8_t*)pCmd) + cbCurCmd))
+            {
+                if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
+                {
+                    WARN(("invalid command size"));
+                    return -1;
+                }
+
+                cbCurCmd = pCmd->u2.complexCmdEl.u16CbCmdHost;
+                if (cbCmd < cbCurCmd)
+                {
+                    WARN(("invalid command size"));
+                    return -1;
+                }
+
+                int8_t i8Result = vboxVDMACrCmdVbvaProcess(pVdma, pCmd, cbCurCmd);
+                if (i8Result < 0)
+                {
+                    WARN(("vboxVDMACrCmdVbvaProcess failed"));
+                    return i8Result;
+                }
+            }
+            return 0;
+        }
         default:
-            WARN(("unsupported command\n"));
-            pCmd->u.i8Result = -1;
+            return vboxVDMACrCmdVbvaProcessCmdData(pVdma, pCmd, cbCmd);
     }
-    return VINF_SUCCESS;
+}
+
+static void vboxVDMACrCmdProcess(struct VBOXVDMAHOST *pVdma, uint8_t* pu8Cmd, uint32_t cbCmd)
+{
+    if (*pu8Cmd == VBOXCMDVBVA_OPTYPE_NOP)
+        return;
+
+    if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
+    {
+        WARN(("invalid command size"));
+        return;
+    }
+
+    PVBOXCMDVBVA_HDR pCmd = (PVBOXCMDVBVA_HDR)pu8Cmd;
+
+    /* check if the command is cancelled */
+    if (!ASMAtomicCmpXchgU8(&pCmd->u8State, VBOXCMDVBVA_STATE_IN_PROGRESS, VBOXCMDVBVA_STATE_SUBMITTED))
+    {
+        Assert(pCmd->u8State == VBOXCMDVBVA_STATE_CANCELLED);
+        return;
+    }
+
+    pCmd->u.i8Result = vboxVDMACrCmdVbvaProcess(pVdma, pCmd, cbCmd);
 }
 
 static int vboxVDMACrCtlHgsmiSetup(struct VBOXVDMAHOST *pVdma)
@@ -1227,6 +2056,7 @@ static int vboxVDMACrCtlHgsmiSetup(struct VBOXVDMAHOST *pVdma)
         PVGASTATE pVGAState = pVdma->pVGAState;
         pCmd->pvVRamBase = pVGAState->vram_ptrR3;
         pCmd->cbVRam = pVGAState->vram_size;
+        pCmd->pLed = &pVGAState->Led3D;
         rc = vboxVDMACrCtlPost(pVGAState, &pCmd->Hdr, sizeof (*pCmd));
         if (RT_SUCCESS(rc))
         {
@@ -1713,13 +2543,9 @@ static DECLCALLBACK(int) vboxVDMAWorkerThread(RTTHREAD ThreadSelf, void *pvUser)
     PHGSMIINSTANCE pHgsmi = pVdma->pHgsmi;
     uint8_t *pCmd;
     uint32_t cbCmd;
+    int rc;
 
-    int rc = VBoxVDMAThreadNotifyConstructSucceeded(&pVdma->Thread);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("VBoxVDMAThreadNotifyConstructSucceeded failed %d\n", rc));
-        return rc;
-    }
+    VBoxVDMAThreadNotifyConstructSucceeded(&pVdma->Thread, pvUser);
 
     while (!VBoxVDMAThreadIsTerminating(&pVdma->Thread))
     {
@@ -1731,14 +2557,18 @@ static DECLCALLBACK(int) vboxVDMAWorkerThread(RTTHREAD ThreadSelf, void *pvUser)
                 VBoxVBVAExHPDataCompleteCmd(pCmdVbva, cbCmd);
                 VBVARaiseIrqNoWait(pVGAState, 0);
                 break;
-            case VBVAEXHOST_DATA_TYPE_HOSTCTL:
-                rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd);
-                VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
-                break;
             case VBVAEXHOST_DATA_TYPE_GUESTCTL:
                 rc = vboxVDMACrGuestCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd);
                 VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
                 break;
+            case VBVAEXHOST_DATA_TYPE_HOSTCTL:
+            {
+                bool fContinue = true;
+                rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd, &fContinue);
+                VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
+                if (fContinue)
+                    break;
+            }
             case VBVAEXHOST_DATA_TYPE_NO_DATA:
                 rc = VBoxVDMAThreadEventWait(&pVdma->Thread, RT_INDEFINITE_WAIT);
                 AssertRC(rc);
@@ -1749,6 +2579,8 @@ static DECLCALLBACK(int) vboxVDMAWorkerThread(RTTHREAD ThreadSelf, void *pvUser)
         }
     }
 
+    VBoxVDMAThreadNotifyTerminatingSucceeded(&pVdma->Thread, pvUser);
+
     return VINF_SUCCESS;
 }
 
@@ -1852,28 +2684,34 @@ int vboxVDMAConstruct(PVGASTATE pVGAState, uint32_t cPipeElements)
 
 #ifdef VBOX_VDMA_WITH_WATCHDOG
         rc = PDMDevHlpTMTimerCreate(pVGAState->pDevInsR3, TMCLOCK_REAL, vboxVDMAWatchDogTimer,
-                                    pVdma, TMTIMER_FLAGS_NO_CRIT_SECT,
-                                    "VDMA WatchDog Timer", &pVdma->WatchDogTimer);
+                                        pVdma, TMTIMER_FLAGS_NO_CRIT_SECT,
+                                        "VDMA WatchDog Timer", &pVdma->WatchDogTimer);
         AssertRC(rc);
 #endif
+
 #ifdef VBOX_WITH_CRHGSMI
-        rc = VBoxVBVAExHSInit(&pVdma->CmdVbva);
+        VBoxVDMAThreadInit(&pVdma->Thread);
+
+        rc = RTSemEventMultiCreate(&pVdma->HostCrCtlCompleteEvent);
         if (RT_SUCCESS(rc))
         {
-            rc = VBoxVDMAThreadCreate(&pVdma->Thread, vboxVDMAWorkerThread, pVdma);
+            rc = VBoxVBVAExHSInit(&pVdma->CmdVbva);
             if (RT_SUCCESS(rc))
             {
                 pVGAState->pVdma = pVdma;
                 int rcIgnored = vboxVDMACrCtlHgsmiSetup(pVdma); NOREF(rcIgnored); /** @todo is this ignoring intentional? */
                 return VINF_SUCCESS;
+
+                VBoxVBVAExHSTerm(&pVdma->CmdVbva);
             }
             else
-                WARN(("VBoxVDMAThreadCreate faile %d\n", rc));
+                WARN(("VBoxVBVAExHSInit failed %d\n", rc));
 
-            VBoxVBVAExHSTerm(&pVdma->CmdVbva);
+            RTSemEventMultiDestroy(pVdma->HostCrCtlCompleteEvent);
         }
         else
-            WARN(("VBoxVBVAExHSInit faile %d\n", rc));
+            WARN(("RTSemEventMultiCreate failed %d\n", rc));
+
 
         RTMemFree(pVdma);
 #else
@@ -1890,14 +2728,7 @@ int vboxVDMAConstruct(PVGASTATE pVGAState, uint32_t cPipeElements)
 int vboxVDMAReset(struct VBOXVDMAHOST *pVdma)
 {
 #ifdef VBOX_WITH_CRHGSMI
-    VBVAEXHOSTCTL Ctl;
-    Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_RESET;
-    int rc = vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc));
-        return rc;
-    }
+    vdmaVBVACtlDisableSync(pVdma);
 #endif
     return VINF_SUCCESS;
 }
@@ -1905,69 +2736,15 @@ int vboxVDMAReset(struct VBOXVDMAHOST *pVdma)
 int vboxVDMADestruct(struct VBOXVDMAHOST *pVdma)
 {
 #ifdef VBOX_WITH_CRHGSMI
-    VBVAEXHOSTCTL Ctl;
-    Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_TERM;
-    int rc = vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc));
-        return rc;
-    }
-    VBoxVDMAThreadTerm(&pVdma->Thread);
+    vdmaVBVACtlDisableSync(pVdma);
+    VBoxVDMAThreadCleanup(&pVdma->Thread);
     VBoxVBVAExHSTerm(&pVdma->CmdVbva);
+    RTSemEventMultiDestroy(pVdma->HostCrCtlCompleteEvent);
 #endif
     RTMemFree(pVdma);
     return VINF_SUCCESS;
 }
 
-int vboxVDMASaveStateExecPrep(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM)
-{
-#ifdef VBOX_WITH_CRHGSMI
-    PVGASTATE pVGAState = pVdma->pVGAState;
-    PVBOXVDMACMD_CHROMIUM_CTL pCmd = (PVBOXVDMACMD_CHROMIUM_CTL)vboxVDMACrCtlCreate(
-            VBOXVDMACMD_CHROMIUM_CTL_TYPE_SAVESTATE_BEGIN, sizeof (*pCmd));
-    Assert(pCmd);
-    if (pCmd)
-    {
-        int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
-        AssertRC(rc);
-        if (RT_SUCCESS(rc))
-        {
-            rc = vboxVDMACrCtlGetRc(pCmd);
-        }
-        vboxVDMACrCtlRelease(pCmd);
-        return rc;
-    }
-    return VERR_NO_MEMORY;
-#else
-    return VINF_SUCCESS;
-#endif
-}
-
-int vboxVDMASaveStateExecDone(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM)
-{
-#ifdef VBOX_WITH_CRHGSMI
-    PVGASTATE pVGAState = pVdma->pVGAState;
-    PVBOXVDMACMD_CHROMIUM_CTL pCmd = (PVBOXVDMACMD_CHROMIUM_CTL)vboxVDMACrCtlCreate(
-            VBOXVDMACMD_CHROMIUM_CTL_TYPE_SAVESTATE_END, sizeof (*pCmd));
-    Assert(pCmd);
-    if (pCmd)
-    {
-        int rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
-        AssertRC(rc);
-        if (RT_SUCCESS(rc))
-        {
-            rc = vboxVDMACrCtlGetRc(pCmd);
-        }
-        vboxVDMACrCtlRelease(pCmd);
-        return rc;
-    }
-    return VERR_NO_MEMORY;
-#else
-    return VINF_SUCCESS;
-#endif
-}
-
 void vboxVDMAControl(struct VBOXVDMAHOST *pVdma, PVBOXVDMA_CTL pCmd, uint32_t cbCmd)
 {
     PHGSMIINSTANCE pIns = pVdma->pHgsmi;
@@ -2026,6 +2803,9 @@ void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd, uint32_t
 
 /**/
 #ifdef VBOX_WITH_CRHGSMI
+
+static DECLCALLBACK(void) vdmaVBVACtlSubmitSyncCompletion(VBVAEXHOSTCONTEXT *pVbva, struct VBVAEXHOSTCTL *pCtl, int rc, void *pvContext);
+
 static int vdmaVBVACtlSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL* pCtl, VBVAEXHOSTCTL_SOURCE enmSource, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
 {
     int rc = VBoxVBVAExHCtlSubmit(&pVdma->CmdVbva, pCtl, enmSource, pfnComplete, pvComplete);
@@ -2037,7 +2817,7 @@ static int vdmaVBVACtlSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL* pCtl, VBVAEXHOS
             Assert(rc == VINF_ALREADY_INITIALIZED);
     }
     else
-        WARN(("VBoxVBVAExHCtlSubmit failed %d\n", rc));
+        Log(("VBoxVBVAExHCtlSubmit failed %d\n", rc));
 
     return rc;
 }
@@ -2056,77 +2836,208 @@ static DECLCALLBACK(void) vboxCmdVBVACmdCtlGuestCompletion(VBVAEXHOSTCONTEXT *pV
     VBoxVBVAExHCtlFree(pVbva, pCtl);
 }
 
-static int vdmaVBVACtlOpaqueSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_SOURCE enmSource, uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
+static int vdmaVBVACtlGenericSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_SOURCE enmSource, VBVAEXHOSTCTL_TYPE enmType, uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
+{
+    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, enmType);
+    if (!pHCtl)
+    {
+        WARN(("VBoxVBVAExHCtlCreate failed\n"));
+        return VERR_NO_MEMORY;
+    }
+
+    pHCtl->u.cmd.pu8Cmd = pu8Cmd;
+    pHCtl->u.cmd.cbCmd = cbCmd;
+    int rc = vdmaVBVACtlSubmit(pVdma, pHCtl, enmSource, pfnComplete, pvComplete);
+    if (RT_FAILURE(rc))
+    {
+        VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl);
+        Log(("vdmaVBVACtlSubmit failed rc %d\n", rc));
+        return rc;;
+    }
+    return VINF_SUCCESS;
+}
+
+static int vdmaVBVACtlGenericGuestSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_TYPE enmType, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)
+{
+    Assert(cbCtl >= sizeof (VBOXCMDVBVA_CTL));
+    VBoxSHGSMICommandMarkAsynchCompletion(pCtl);
+    int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t*)(pCtl+1), cbCtl - sizeof (VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma);
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+
+    WARN(("vdmaVBVACtlGenericSubmit failed %d\n", rc));
+    pCtl->i32Result = rc;
+    rc = VBoxSHGSMICommandComplete(pVdma->pHgsmi, pCtl);
+    AssertRC(rc);
+    return VINF_SUCCESS;
+}
+
+static DECLCALLBACK(void) vboxCmdVBVACmdCtlHostCompletion(VBVAEXHOSTCONTEXT *pVbva, struct VBVAEXHOSTCTL *pCtl, int rc, void *pvCompletion)
+{
+    VBOXCRCMDCTL* pVboxCtl = (VBOXCRCMDCTL*)pCtl->u.cmd.pu8Cmd;
+    if (pVboxCtl->u.pfnInternal)
+        ((PFNCRCTLCOMPLETION)pVboxCtl->u.pfnInternal)(pVboxCtl, pCtl->u.cmd.cbCmd, rc, pvCompletion);
+    VBoxVBVAExHCtlFree(pVbva, pCtl);
+}
+
+static int vdmaVBVACtlOpaqueHostSubmit(PVBOXVDMAHOST pVdma, struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
+        PFNCRCTLCOMPLETION pfnCompletion,
+        void *pvCompletion)
+{
+    pCmd->u.pfnInternal = (void(*)())pfnCompletion;
+    int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_HOST, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, (uint8_t*)pCmd, cbCmd, vboxCmdVBVACmdCtlHostCompletion, pvCompletion);
+    if (RT_FAILURE(rc))
+    {
+        if (rc == VERR_INVALID_STATE)
+        {
+            pCmd->u.pfnInternal = NULL;
+            PVGASTATE pVGAState = pVdma->pVGAState;
+            rc = pVGAState->pDrv->pfnCrHgcmCtlSubmit(pVGAState->pDrv, pCmd, cbCmd, pfnCompletion, pvCompletion);
+            if (!RT_SUCCESS(rc))
+                WARN(("pfnCrHgsmiControlProcess failed %d\n", rc));
+
+            return rc;
+        }
+        WARN(("vdmaVBVACtlGenericSubmit failed %d\n", rc));
+        return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+static DECLCALLBACK(int) vdmaVBVANotifyEnable(PVGASTATE pVGAState)
+{
+    for (uint32_t i = 0; i < pVGAState->cMonitors; i++)
+    {
+        int rc = pVGAState->pDrv->pfnVBVAEnable (pVGAState->pDrv, i, NULL, true);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("pfnVBVAEnable failed %d\n", rc));
+            for (uint32_t j = 0; j < i; j++)
+            {
+                pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, j);
+            }
+
+            return rc;
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+static DECLCALLBACK(int) vdmaVBVANotifyDisable(PVGASTATE pVGAState)
 {
-    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE);
-    if (!pHCtl)
-    {
-        WARN(("VBoxVBVAExHCtlCreate failed\n"));
-        return VERR_NO_MEMORY;
-    }
-
-    pHCtl->u.cmd.pu8Cmd = pu8Cmd;
-    pHCtl->u.cmd.cbCmd = cbCmd;
-    int rc = vdmaVBVACtlSubmit(pVdma, pHCtl, enmSource, pfnComplete, pvComplete);
-    if (!RT_SUCCESS(rc))
+    for (uint32_t i = 0; i < pVGAState->cMonitors; i++)
     {
-        WARN(("vdmaVBVACtlSubmit failed rc %d\n", rc));
-        return rc;;
+        pVGAState->pDrv->pfnVBVADisable (pVGAState->pDrv, i);
     }
     return VINF_SUCCESS;
 }
 
-static int vdmaVBVACtlOpaqueGuestSubmit(PVBOXVDMAHOST pVdma, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)
+static DECLCALLBACK(void) vdmaVBVACtlThreadCreatedEnable(struct VBOXVDMATHREAD *pThread, int rc, void *pvThreadContext, void *pvContext)
 {
-    Assert(cbCtl >= sizeof (VBOXCMDVBVA_CTL));
-    VBoxSHGSMICommandMarkAsynchCompletion(pCtl);
-    int rc = vdmaVBVACtlOpaqueSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, (uint8_t*)(pCtl+1), cbCtl - sizeof (VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma);
+    PVBOXVDMAHOST pVdma = (PVBOXVDMAHOST)pvThreadContext;
+    VBVAEXHOSTCTL* pHCtl = (VBVAEXHOSTCTL*)pvContext;
+
     if (RT_SUCCESS(rc))
-        return VINF_SUCCESS;
+    {
+        rc = vboxVDMACrGuestCtlProcess(pVdma, pHCtl);
+        /* rc == VINF_SUCCESS would mean the actual state change has occcured */
+        if (rc == VINF_SUCCESS)
+        {
+            /* we need to inform Main about VBVA enable/disable
+             * main expects notifications to be done from the main thread
+             * submit it there */
+            PVGASTATE pVGAState = pVdma->pVGAState;
 
-    WARN(("vdmaVBVACtlOpaqueSubmit failed %d\n", rc));
-    pCtl->i32Result = rc;
-    rc = VBoxSHGSMICommandComplete(pVdma->pHgsmi, pCtl);
-    AssertRC(rc);
-    return VINF_SUCCESS;
+            if (VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
+                vdmaVBVANotifyEnable(pVGAState);
+            else
+                vdmaVBVANotifyDisable(pVGAState);
+        }
+        else if (RT_FAILURE(rc))
+            WARN(("vboxVDMACrGuestCtlProcess failed %d\n", rc));
+    }
+    else
+        WARN(("vdmaVBVACtlThreadCreatedEnable is passed %d\n", rc));
+
+    VBoxVBVAExHPDataCompleteCtl(&pVdma->CmdVbva, pHCtl, rc);
 }
 
-static DECLCALLBACK(void) vboxCmdVBVACmdCtlHostCompletion(VBVAEXHOSTCONTEXT *pVbva, struct VBVAEXHOSTCTL *pCtl, int rc, void *pvCompletion)
+static int vdmaVBVACtlEnableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABLE *pEnable, bool fPaused, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
 {
-    VBOXCRCMDCTL* pVboxCtl = (VBOXCRCMDCTL*)pCtl->u.cmd.pu8Cmd;
-    if (pVboxCtl->pfnInternal)
-        ((PFNCRCTLCOMPLETION)pVboxCtl->pfnInternal)(pVboxCtl, pCtl->u.cmd.cbCmd, rc, pvCompletion);
-    VBoxVBVAExHCtlFree(pVbva, pCtl);
+    int rc;
+    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, fPaused ? VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED : VBVAEXHOSTCTL_TYPE_GHH_ENABLE);
+    if (pHCtl)
+    {
+        pHCtl->u.cmd.pu8Cmd = (uint8_t*)pEnable;
+        pHCtl->u.cmd.cbCmd = sizeof (*pEnable);
+        pHCtl->pfnComplete = pfnComplete;
+        pHCtl->pvComplete = pvComplete;
+
+        rc = VBoxVDMAThreadCreate(&pVdma->Thread, vboxVDMAWorkerThread, pVdma, vdmaVBVACtlThreadCreatedEnable, pHCtl);
+        if (RT_SUCCESS(rc))
+            return VINF_SUCCESS;
+        else
+            WARN(("VBoxVDMAThreadCreate failed %d\n", rc));
+
+        VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl);
+    }
+    else
+    {
+        WARN(("VBoxVBVAExHCtlCreate failed\n"));
+        rc = VERR_NO_MEMORY;
+    }
+
+    return rc;
 }
 
-static int vdmaVBVACtlOpaqueHostSubmit(PVBOXVDMAHOST pVdma, struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
-        PFNCRCTLCOMPLETION pfnCompletion,
-        void *pvCompletion)
+static int vdmaVBVACtlEnableSubmitSync(PVBOXVDMAHOST pVdma, uint32_t offVram, bool fPaused)
 {
-    pCmd->pfnInternal = (void(*)())pfnCompletion;
-    int rc = vdmaVBVACtlOpaqueSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_HOST_ENABLED, (uint8_t*)pCmd, cbCmd, vboxCmdVBVACmdCtlHostCompletion, pvCompletion);
+    VBVAENABLE Enable = {0};
+    Enable.u32Flags = VBVA_F_ENABLE;
+    Enable.u32Offset = offVram;
+
+    VDMA_VBVA_CTL_CYNC_COMPLETION Data;
+    Data.rc = VERR_NOT_IMPLEMENTED;
+    int rc = RTSemEventCreate(&Data.hEvent);
     if (!RT_SUCCESS(rc))
     {
-        if (rc == VERR_INVALID_STATE)
+        WARN(("RTSemEventCreate failed %d\n", rc));
+        return rc;
+    }
+
+    rc = vdmaVBVACtlEnableSubmitInternal(pVdma, &Enable, fPaused, vdmaVBVACtlSubmitSyncCompletion, &Data);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTSemEventWait(Data.hEvent, RT_INDEFINITE_WAIT);
+        if (RT_SUCCESS(rc))
         {
-            pCmd->pfnInternal = NULL;
-            PVGASTATE pVGAState = pVdma->pVGAState;
-            rc = pVGAState->pDrv->pfnCrHgcmCtlSubmit(pVGAState->pDrv, pCmd, cbCmd, pfnCompletion, pvCompletion);
+            rc = Data.rc;
             if (!RT_SUCCESS(rc))
-                WARN(("pfnCrHgsmiControlProcess failed %d\n", rc));
-
-            return rc;
+                WARN(("vdmaVBVACtlSubmitSyncCompletion returned %d\n", rc));
         }
-        WARN(("vdmaVBVACtlOpaqueSubmit failed %d\n", rc));
-        return rc;
+        else
+            WARN(("RTSemEventWait failed %d\n", rc));
     }
+    else
+        WARN(("vdmaVBVACtlSubmit failed %d\n", rc));
 
-    return VINF_SUCCESS;
+    RTSemEventDestroy(Data.hEvent);
+
+    return rc;
 }
 
-static int vdmaVBVACtlEnableDisableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABLE *pEnable, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
+static int vdmaVBVACtlDisableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABLE *pEnable, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
 {
-    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, VBVAEXHOSTCTL_TYPE_GH_ENABLE_DISABLE);
+    int rc;
+    VBVAEXHOSTCTL* pHCtl;
+    if (VBoxVBVAExHSIsDisabled(&pVdma->CmdVbva))
+    {
+        WARN(("VBoxVBVAExHSIsDisabled: disabled"));
+        return VINF_SUCCESS;
+    }
+
+    pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, VBVAEXHOSTCTL_TYPE_GHH_DISABLE);
     if (!pHCtl)
     {
         WARN(("VBoxVBVAExHCtlCreate failed\n"));
@@ -2135,13 +3046,21 @@ static int vdmaVBVACtlEnableDisableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABL
 
     pHCtl->u.cmd.pu8Cmd = (uint8_t*)pEnable;
     pHCtl->u.cmd.cbCmd = sizeof (*pEnable);
-    int rc = vdmaVBVACtlSubmit(pVdma, pHCtl, VBVAEXHOSTCTL_SOURCE_GUEST, pfnComplete, pvComplete);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("vdmaVBVACtlSubmit failed rc %d\n", rc));
-        return rc;;
-    }
-    return VINF_SUCCESS;
+    rc = vdmaVBVACtlSubmit(pVdma, pHCtl, VBVAEXHOSTCTL_SOURCE_GUEST, pfnComplete, pvComplete);
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+
+    WARN(("vdmaVBVACtlSubmit failed rc %d\n", rc));
+    VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl);
+    return rc;
+}
+
+static int vdmaVBVACtlEnableDisableSubmitInternal(PVBOXVDMAHOST pVdma, VBVAENABLE *pEnable, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
+{
+    bool fEnable = ((pEnable->u32Flags & (VBVA_F_ENABLE | VBVA_F_DISABLE)) == VBVA_F_ENABLE);
+    if (fEnable)
+        return vdmaVBVACtlEnableSubmitInternal(pVdma, pEnable, false, pfnComplete, pvComplete);
+    return vdmaVBVACtlDisableSubmitInternal(pVdma, pEnable, pfnComplete, pvComplete);
 }
 
 static int vdmaVBVACtlEnableDisableSubmit(PVBOXVDMAHOST pVdma, VBOXCMDVBVA_CTL_ENABLE *pEnable)
@@ -2192,7 +3111,7 @@ static int vdmaVBVACtlSubmitSync(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL* pCtl, VBVAE
             WARN(("RTSemEventWait failed %d\n", rc));
     }
     else
-        WARN(("vdmaVBVACtlSubmit failed %d\n", rc));
+        Log(("vdmaVBVACtlSubmit failed %d\n", rc));
 
     RTSemEventDestroy(Data.hEvent);
 
@@ -2203,14 +3122,14 @@ static int vdmaVBVAPause(PVBOXVDMAHOST pVdma)
 {
     VBVAEXHOSTCTL Ctl;
     Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_INTERNAL_PAUSE;
-    return vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY);
+    return vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST);
 }
 
 static int vdmaVBVAResume(PVBOXVDMAHOST pVdma)
 {
     VBVAEXHOSTCTL Ctl;
     Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_INTERNAL_RESUME;
-    return vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY);
+    return vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST);
 }
 
 static int vboxVDMACmdSubmitPerform(struct VBOXVDMAHOST *pVdma)
@@ -2241,6 +3160,69 @@ int vboxCmdVBVACmdHostCtl(PPDMIDISPLAYVBVACALLBACKS pInterface,
     return vdmaVBVACtlOpaqueHostSubmit(pVdma, pCmd, cbCmd, pfnCompletion, pvCompletion);
 }
 
+typedef struct VBOXCMDVBVA_CMDHOSTCTL_SYNC
+{
+    struct VBOXVDMAHOST *pVdma;
+    uint32_t fProcessing;
+    int rc;
+} VBOXCMDVBVA_CMDHOSTCTL_SYNC;
+
+static DECLCALLBACK(void) vboxCmdVBVACmdHostCtlSyncCb(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, int rc, void *pvCompletion)
+{
+    VBOXCMDVBVA_CMDHOSTCTL_SYNC *pData = (VBOXCMDVBVA_CMDHOSTCTL_SYNC*)pvCompletion;
+
+    pData->rc = rc;
+    pData->fProcessing = 0;
+
+    struct VBOXVDMAHOST *pVdma = pData->pVdma;
+
+    ASMAtomicIncS32(&pVdma->i32cHostCrCtlCompleted);
+
+    RTSemEventMultiSignal(pVdma->HostCrCtlCompleteEvent);
+}
+
+int vboxCmdVBVACmdHostCtlSync(PPDMIDISPLAYVBVACALLBACKS pInterface,
+                                                               struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd)
+{
+    PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface);
+    struct VBOXVDMAHOST *pVdma = pVGAState->pVdma;
+    VBOXCMDVBVA_CMDHOSTCTL_SYNC Data;
+    Data.pVdma = pVdma;
+    Data.fProcessing = 1;
+    Data.rc = VERR_INTERNAL_ERROR;
+    int rc = vdmaVBVACtlOpaqueHostSubmit(pVdma, pCmd, cbCmd, vboxCmdVBVACmdHostCtlSyncCb, &Data);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("vdmaVBVACtlOpaqueHostSubmit failed %d", rc));
+        return rc;
+    }
+
+    while (Data.fProcessing)
+    {
+        /* Poll infrequently to make sure no completed message has been missed. */
+        RTSemEventMultiWait(pVdma->HostCrCtlCompleteEvent, 500);
+
+        if (Data.fProcessing)
+            RTThreadYield();
+    }
+
+    /* 'Our' message has been processed, so should reset the semaphore.
+     * There is still possible that another message has been processed
+     * and the semaphore has been signalled again.
+     * Reset only if there are no other messages completed.
+     */
+    int32_t c = ASMAtomicDecS32(&pVdma->i32cHostCrCtlCompleted);
+    Assert(c >= 0);
+    if (!c)
+        RTSemEventMultiReset(pVdma->HostCrCtlCompleteEvent);
+
+    rc = Data.rc;
+    if (!RT_SUCCESS(rc))
+        WARN(("host call failed %d", rc));
+
+    return rc;
+}
+
 int vboxCmdVBVACmdCtl(PVGASTATE pVGAState, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)
 {
     struct VBOXVDMAHOST *pVdma = pVGAState->pVdma;
@@ -2248,7 +3230,9 @@ int vboxCmdVBVACmdCtl(PVGASTATE pVGAState, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl
     switch (pCtl->u32Type)
     {
         case VBOXCMDVBVACTL_TYPE_3DCTL:
-            return vdmaVBVACtlOpaqueGuestSubmit(pVdma, pCtl, cbCtl);
+            return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, pCtl, cbCtl);
+        case VBOXCMDVBVACTL_TYPE_RESIZE:
+            return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_RESIZE, pCtl, cbCtl);
         case VBOXCMDVBVACTL_TYPE_ENABLE:
             if (cbCtl != sizeof (VBOXCMDVBVA_CTL_ENABLE))
             {
@@ -2298,4 +3282,177 @@ void vboxCmdVBVACmdTimer(PVGASTATE pVGAState)
     vboxVDMACmdSubmitPerform(pVGAState->pVdma);
 }
 
+bool vboxCmdVBVAIsEnabled(PVGASTATE pVGAState)
+{
+    return VBoxVBVAExHSIsEnabled(&pVGAState->pVdma->CmdVbva);
+}
+#endif
+
+int vboxVDMASaveStateExecPrep(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM)
+{
+#ifdef VBOX_WITH_CRHGSMI
+    int rc = vdmaVBVAPause(pVdma);
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+
+    if (rc != VERR_INVALID_STATE)
+    {
+        WARN(("vdmaVBVAPause failed %d\n", rc));
+        return rc;
+    }
+
+#ifdef DEBUG_misha
+    WARN(("debug prep"));
+#endif
+
+    PVGASTATE pVGAState = pVdma->pVGAState;
+    PVBOXVDMACMD_CHROMIUM_CTL pCmd = (PVBOXVDMACMD_CHROMIUM_CTL)vboxVDMACrCtlCreate(
+            VBOXVDMACMD_CHROMIUM_CTL_TYPE_SAVESTATE_BEGIN, sizeof (*pCmd));
+    Assert(pCmd);
+    if (pCmd)
+    {
+        rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
+        AssertRC(rc);
+        if (RT_SUCCESS(rc))
+        {
+            rc = vboxVDMACrCtlGetRc(pCmd);
+        }
+        vboxVDMACrCtlRelease(pCmd);
+        return rc;
+    }
+    return VERR_NO_MEMORY;
+#else
+    return VINF_SUCCESS;
+#endif
+}
+
+int vboxVDMASaveStateExecDone(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM)
+{
+#ifdef VBOX_WITH_CRHGSMI
+    int rc = vdmaVBVAResume(pVdma);
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+
+    if (rc != VERR_INVALID_STATE)
+    {
+        WARN(("vdmaVBVAResume failed %d\n", rc));
+        return rc;
+    }
+
+#ifdef DEBUG_misha
+    WARN(("debug done"));
+#endif
+
+    PVGASTATE pVGAState = pVdma->pVGAState;
+    PVBOXVDMACMD_CHROMIUM_CTL pCmd = (PVBOXVDMACMD_CHROMIUM_CTL)vboxVDMACrCtlCreate(
+            VBOXVDMACMD_CHROMIUM_CTL_TYPE_SAVESTATE_END, sizeof (*pCmd));
+    Assert(pCmd);
+    if (pCmd)
+    {
+        rc = vboxVDMACrCtlPost(pVGAState, pCmd, sizeof (*pCmd));
+        AssertRC(rc);
+        if (RT_SUCCESS(rc))
+        {
+            rc = vboxVDMACrCtlGetRc(pCmd);
+        }
+        vboxVDMACrCtlRelease(pCmd);
+        return rc;
+    }
+    return VERR_NO_MEMORY;
+#else
+    return VINF_SUCCESS;
+#endif
+}
+
+int vboxVDMASaveStateExecPerform(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM)
+{
+    int rc;
+
+#ifdef VBOX_WITH_CRHGSMI
+    if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
+#endif
+    {
+        rc = SSMR3PutU32(pSSM, 0xffffffff);
+        AssertRCReturn(rc, rc);
+        return VINF_SUCCESS;
+    }
+
+#ifdef VBOX_WITH_CRHGSMI
+    PVGASTATE pVGAState = pVdma->pVGAState;
+    uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
+
+    rc = SSMR3PutU32(pSSM, (uint32_t)(((uint8_t*)pVdma->CmdVbva.pVBVA) - pu8VramBase));
+    AssertRCReturn(rc, rc);
+
+    VBVAEXHOSTCTL HCtl;
+    HCtl.enmType = VBVAEXHOSTCTL_TYPE_HH_SAVESTATE;
+    HCtl.u.state.pSSM = pSSM;
+    HCtl.u.state.u32Version = 0;
+    return vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
+#endif
+}
+
+int vboxVDMASaveLoadExecPerform(struct VBOXVDMAHOST *pVdma, PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    uint32_t u32;
+    int rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+
+    if (u32 != 0xffffffff)
+    {
+#ifdef VBOX_WITH_CRHGSMI
+        rc = vdmaVBVACtlEnableSubmitSync(pVdma, u32, true);
+        AssertRCReturn(rc, rc);
+
+        Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_ESTATE_PAUSED);
+
+        VBVAEXHOSTCTL HCtl;
+        HCtl.enmType = VBVAEXHOSTCTL_TYPE_HH_LOADSTATE;
+        HCtl.u.state.pSSM = pSSM;
+        HCtl.u.state.u32Version = u32Version;
+        rc = vdmaVBVACtlSubmitSync(pVdma, &HCtl, VBVAEXHOSTCTL_SOURCE_HOST);
+        AssertRCReturn(rc, rc);
+
+        rc = vdmaVBVAResume(pVdma);
+        AssertRCReturn(rc, rc);
+
+        return VINF_SUCCESS;
+#else
+        WARN(("Unsupported VBVACtl info!\n"));
+        return VERR_VERSION_MISMATCH;
+#endif
+    }
+
+    return VINF_SUCCESS;
+}
+
+int vboxVDMASaveLoadDone(struct VBOXVDMAHOST *pVdma)
+{
+#ifdef VBOX_WITH_CRHGSMI
+    if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
+        return VINF_SUCCESS;
+
+/** @todo r=bird: BTW. would be great if you put in a couple of comments here and there explaining what
+       * the purpose of this code is. */
+    VBVAEXHOSTCTL* pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, VBVAEXHOSTCTL_TYPE_HH_LOADSTATE_DONE);
+    if (!pHCtl)
+    {
+        WARN(("VBoxVBVAExHCtlCreate failed\n"));
+        return VERR_NO_MEMORY;
+    }
+
+    /* sanity */
+    pHCtl->u.cmd.pu8Cmd = NULL;
+    pHCtl->u.cmd.cbCmd = 0;
+
+    /* NULL completion will just free the ctl up */
+    int rc = vdmaVBVACtlSubmit(pVdma, pHCtl, VBVAEXHOSTCTL_SOURCE_HOST, NULL, NULL);
+    if (RT_FAILURE(rc))
+    {
+        Log(("vdmaVBVACtlSubmit failed rc %d\n", rc));
+        VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl);
+        return rc;
+    }
 #endif
+    return VINF_SUCCESS;
+}
diff --git a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
index c0d2c0b..1ec2b36 100644
--- a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
+++ b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
@@ -1312,6 +1312,8 @@ int HGSMIHostSaveStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM)
 
     int rc;
 
+    SSMR3PutU32(pSSM, pIns->hostHeap.fOffsetBased ? HGSMI_HEAP_TYPE_OFFSET : HGSMI_HEAP_TYPE_POINTER);
+
     HGSMIOFFSET off = pIns->pHGFlags ? HGSMIPointerToOffset(&pIns->area, (const HGSMIBUFFERHEADER *)pIns->pHGFlags) : HGSMIOFFSET_VOID;
     SSMR3PutU32 (pSSM, off);
 
@@ -1351,6 +1353,14 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
 
     int rc;
     HGSMIOFFSET off;
+    uint32_t u32HeapType = HGSMI_HEAP_TYPE_NULL;
+
+    if (u32Version >= VGA_SAVEDSTATE_VERSION_HGSMIMA)
+    {
+        rc = SSMR3GetU32(pSSM, &u32HeapType);
+        AssertRCReturn(rc, rc);
+    }
+
     rc = SSMR3GetU32(pSSM, &off);
     AssertRCReturn(rc, rc);
     pIns->pHGFlags = (off != HGSMIOFFSET_VOID) ? (HGSMIHOSTFLAGS*)HGSMIOffsetToPointer (&pIns->area, off) : NULL;
@@ -1360,6 +1370,20 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
     AssertRCReturn(rc, rc);
     if(off != HGSMIOFFSET_VOID)
     {
+        /* There is a saved heap. */
+        if (u32HeapType == HGSMI_HEAP_TYPE_NULL)
+        {
+            u32HeapType = u32Version > VGA_SAVEDSTATE_VERSION_HOST_HEAP?
+                              HGSMI_HEAP_TYPE_OFFSET:
+                              HGSMI_HEAP_TYPE_POINTER;
+        }
+
+        if (u32HeapType == HGSMI_HEAP_TYPE_MA)
+        {
+            AssertMsgFailed(("MA heap not supported"));
+            return VERR_VERSION_MISMATCH;
+        }
+
         HGSMIOFFSET offHeap;
         SSMR3GetU32(pSSM, &offHeap);
         uint32_t cbHeap;
@@ -1380,7 +1404,7 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
                                    uintptr_t(pIns->area.pu8Base) - uintptr_t(oldMem),
                                    cbHeap,
                                    offHeap,
-                                   u32Version > VGA_SAVEDSTATE_VERSION_HOST_HEAP);
+                                   u32HeapType == HGSMI_HEAP_TYPE_OFFSET);
 
             hgsmiHostHeapUnlock (pIns);
         }
diff --git a/src/VBox/Devices/Input/DrvKeyboardQueue.cpp b/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
index 379a339..c14e4ee 100644
--- a/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
+++ b/src/VBox/Devices/Input/DrvKeyboardQueue.cpp
@@ -51,9 +51,10 @@ typedef struct DRVKBDQUEUE
     PDMIKEYBOARDPORT            IPort;
     /** The queue handle. */
     PPDMQUEUE                   pQueue;
-    /** Discard input when this flag is set.
-     * We only accept input when the VM is running. */
+    /** Discard input when this flag is set. */
     bool                        fInactive;
+    /** When VM is suspended, queue full errors are not fatal. */
+    bool                        fSuspended;
 } DRVKBDQUEUE, *PDRVKBDQUEUE;
 
 
@@ -105,6 +106,7 @@ static DECLCALLBACK(void *)  drvKbdQueueQueryInterface(PPDMIBASE pInterface, con
 static DECLCALLBACK(int) drvKbdQueuePutEvent(PPDMIKEYBOARDPORT pInterface, uint8_t u8KeyCode)
 {
     PDRVKBDQUEUE pDrv = IKEYBOARDPORT_2_DRVKBDQUEUE(pInterface);
+    /* Ignore any attempt to send events if queue is inactive. */
     if (pDrv->fInactive)
         return VINF_SUCCESS;
 
@@ -115,7 +117,8 @@ static DECLCALLBACK(int) drvKbdQueuePutEvent(PPDMIKEYBOARDPORT pInterface, uint8
         PDMQueueInsert(pDrv->pQueue, &pItem->Core);
         return VINF_SUCCESS;
     }
-    AssertMsgFailed(("drvKbdQueuePutEvent: Queue is full!!!!\n"));
+    if (!pDrv->fSuspended)
+        AssertMsgFailed(("drvKbdQueuePutEvent: Queue is full!!!!\n"));
     return VERR_PDM_NO_QUEUE_ITEMS;
 }
 
@@ -208,7 +211,7 @@ static DECLCALLBACK(void)  drvKbdQueueReset(PPDMDRVINS pDrvIns)
 static DECLCALLBACK(void)  drvKbdQueueSuspend(PPDMDRVINS pDrvIns)
 {
     PDRVKBDQUEUE        pThis = PDMINS_2_DATA(pDrvIns, PDRVKBDQUEUE);
-    pThis->fInactive = true;
+    pThis->fSuspended = true;
 }
 
 
@@ -222,6 +225,7 @@ static DECLCALLBACK(void)  drvKbdQueueResume(PPDMDRVINS pDrvIns)
 {
     PDRVKBDQUEUE        pThis = PDMINS_2_DATA(pDrvIns, PDRVKBDQUEUE);
     pThis->fInactive = false;
+    pThis->fSuspended = false;
 }
 
 
@@ -258,6 +262,7 @@ static DECLCALLBACK(int) drvKbdQueueConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg
      * Init basic data members and interfaces.
      */
     pDrv->fInactive                         = true;
+    pDrv->fSuspended                        = false;
     /* IBase. */
     pDrvIns->IBase.pfnQueryInterface        = drvKbdQueueQueryInterface;
     /* IKeyboardConnector. */
diff --git a/src/VBox/Devices/Input/UsbKbd.cpp b/src/VBox/Devices/Input/UsbKbd.cpp
index 37ff810..5b40036 100644
--- a/src/VBox/Devices/Input/UsbKbd.cpp
+++ b/src/VBox/Devices/Input/UsbKbd.cpp
@@ -1036,6 +1036,17 @@ static DECLCALLBACK(PVUSBURB) usbHidUrbReap(PPDMUSBINS pUsbIns, RTMSINTERVAL cMi
 
 
 /**
+ * @copydoc PDMUSBREG::pfnWakeup
+ */
+static DECLCALLBACK(int) usbHidWakeup(PPDMUSBINS pUsbIns)
+{
+    PUSBHID pThis = PDMINS_2_DATA(pUsbIns, PUSBHID);
+
+    return RTSemEventSignal(pThis->hEvtDoneQueue);
+}
+
+
+/**
  * @copydoc PDMUSBREG::pfnUrbCancel
  */
 static DECLCALLBACK(int) usbHidUrbCancel(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
@@ -1574,6 +1585,8 @@ const PDMUSBREG g_UsbHidKbd =
     usbHidUrbCancel,
     /* pfnUrbReap */
     usbHidUrbReap,
+    /* pfnWakeup */
+    usbHidWakeup,
     /* u32TheEnd */
     PDM_USBREG_VERSION
 };
diff --git a/src/VBox/Devices/Input/UsbMouse.cpp b/src/VBox/Devices/Input/UsbMouse.cpp
index 9a65783..be3e4e7 100644
--- a/src/VBox/Devices/Input/UsbMouse.cpp
+++ b/src/VBox/Devices/Input/UsbMouse.cpp
@@ -1668,6 +1668,8 @@ static DECLCALLBACK(PVUSBURB) usbHidUrbReap(PPDMUSBINS pUsbIns, RTMSINTERVAL cMi
 {
     PUSBHID pThis = PDMINS_2_DATA(pUsbIns, PUSBHID);
 
+    LogFlowFunc(("pUsbIns=%p cMillies=%u\n", pUsbIns, cMillies));
+
     RTCritSectEnter(&pThis->CritSect);
 
     PVUSBURB pUrb = usbHidQueueRemoveHead(&pThis->DoneQueue);
@@ -1693,6 +1695,15 @@ static DECLCALLBACK(PVUSBURB) usbHidUrbReap(PPDMUSBINS pUsbIns, RTMSINTERVAL cMi
     return pUrb;
 }
 
+/**
+ * @copydoc PDMUSBREG::pfnWakeup
+ */
+static DECLCALLBACK(int) usbHidWakeup(PPDMUSBINS pUsbIns)
+{
+    PUSBHID pThis = PDMINS_2_DATA(pUsbIns, PUSBHID);
+
+    return RTSemEventSignal(pThis->hEvtDoneQueue);
+}
 
 /**
  * @copydoc PDMUSBREG::pfnUrbCancel
@@ -2422,6 +2433,8 @@ const PDMUSBREG g_UsbHidMou =
     usbHidUrbCancel,
     /* pfnUrbReap */
     usbHidUrbReap,
+    /* pfnWakeup */
+    usbHidWakeup,
     /* u32TheEnd */
     PDM_USBREG_VERSION
 };
diff --git a/src/VBox/Devices/Makefile.kmk b/src/VBox/Devices/Makefile.kmk
index 179a998..2c22465 100644
--- a/src/VBox/Devices/Makefile.kmk
+++ b/src/VBox/Devices/Makefile.kmk
@@ -1143,8 +1143,19 @@ if !defined(VBOX_ONLY_EXTPACKS)         # Goes on almost to the end of the file.
  # Internal Networking - Ring-3 Testcase for the Ring-0 code (a bit hackish).
  #
  ifdef VBOX_WITH_TESTCASES
-  PROGRAMS += tstIntNet-1
-  tstIntNet-1_TEMPLATE    = VBOXR3TSTEXE
+  if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+   PROGRAMS += tstIntNetHardened-1
+   tstIntNetHardened-1_TEMPLATE = VBoxR3HardenedTstExe
+   tstIntNetHardened-1_NAME     = tstIntNet-1
+   tstIntNetHardened-1_DEFS     = PROGRAM_NAME_STR=\"tstIntNet-1\"
+   tstIntNetHardened-1_SOURCES  = ../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+
+   DLLS += tstIntNet-1
+   tstIntNet-1_TEMPLATE   = VBoxR3TstDll
+  else
+   PROGRAMS += tstIntNet-1
+   tstIntNet-1_TEMPLATE   = VBOXR3TSTEXE
+  endif
   tstIntNet-1_SOURCES     = \
  	Network/testcase/tstIntNet-1.cpp \
  	Network/Pcap.cpp
diff --git a/src/VBox/Devices/Network/slirp/slirp.c b/src/VBox/Devices/Network/slirp/slirp.c
index cf8cd12..54f5038 100644
--- a/src/VBox/Devices/Network/slirp/slirp.c
+++ b/src/VBox/Devices/Network/slirp/slirp.c
@@ -841,7 +841,20 @@ static bool slirpConnectOrWrite(PNATState pData, struct socket *so, bool fConnec
         /* continue; */
     }
     else if (!fConnectOnly)
+    {
         SOWRITE(ret, pData, so);
+        if (RT_LIKELY(ret > 0))
+        {
+            /*
+             * Make sure we will send window update to peer.  This is
+             * a moral equivalent of calling tcp_output() for PRU_RCVD
+             * in tcp_usrreq() of the real stack.
+             */
+            struct tcpcb *tp = sototcpcb(so);
+            if (RT_LIKELY(tp != NULL))
+                tp->t_flags |= TF_DELACK;
+        }
+    }
     /*
      * XXX If we wrote something (a lot), there could be the need
      * for a window update. In the worst case, the remote will send
diff --git a/src/VBox/Devices/Network/slirp/tcp_input.c b/src/VBox/Devices/Network/slirp/tcp_input.c
index 0c4eb21..dd67b06 100644
--- a/src/VBox/Devices/Network/slirp/tcp_input.c
+++ b/src/VBox/Devices/Network/slirp/tcp_input.c
@@ -1596,7 +1596,7 @@ dodata:
         else
         {
             tiflags = tcp_reass(pData, tp, &ti->ti_t, &tlen, m);
-            tiflags |= TF_ACKNOW;
+            tp->t_flags |= TF_ACKNOW;
         }
         /*
          * Note the amount of data that peer has sent into
diff --git a/src/VBox/Devices/Network/slirp/tcp_output.c b/src/VBox/Devices/Network/slirp/tcp_output.c
index 07a1d91..99927e5 100644
--- a/src/VBox/Devices/Network/slirp/tcp_output.c
+++ b/src/VBox/Devices/Network/slirp/tcp_output.c
@@ -233,9 +233,9 @@ again:
          * taking into account that we are limited by
          * TCP_MAXWIN << tp->rcv_scale.
          */
-        long adv = min(win,
-                       (long)TCP_MAXWIN << tp->rcv_scale) -
-                       (tp->rcv_adv - tp->rcv_nxt);
+        long adv = min(win, (long)TCP_MAXWIN << tp->rcv_scale);
+        if (SEQ_GT(tp->rcv_adv, tp->rcv_nxt))
+            adv -= tp->rcv_adv - tp->rcv_nxt;
 
         if (adv >= (long) (2 * tp->t_maxseg))
             goto send;
@@ -554,8 +554,8 @@ send:
         win = 0;
     if (win > (long)TCP_MAXWIN << tp->rcv_scale)
         win = (long)TCP_MAXWIN << tp->rcv_scale;
-    if (win < (long)(tp->rcv_adv - tp->rcv_nxt))
-        win = (long)(tp->rcv_adv - tp->rcv_nxt);
+    if (win < (long)(int32_t)(tp->rcv_adv - tp->rcv_nxt))
+        win = (long)(int32_t)(tp->rcv_adv - tp->rcv_nxt);
     ti->ti_win = RT_H2N_U16((u_int16_t) (win>>tp->rcv_scale));
 
 #if 0
diff --git a/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp b/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp
index a2e51e9..baae294 100644
--- a/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp
+++ b/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp
@@ -644,7 +644,10 @@ static int getDefaultIfaceName(char *pszName)
 #endif /* RT_OS_LINUX */
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     /*
      * Init the runtime and parse the arguments.
@@ -803,7 +806,7 @@ int main(int argc, char **argv)
                 return 1;
 
             case 'V':
-                RTPrintf("$Revision: 88563 $\n");
+                RTPrintf("$Revision: 94787 $\n");
                 return 0;
 
             default:
@@ -1002,3 +1005,14 @@ int main(int argc, char **argv)
     return !!g_cErrors;
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
index f2d0778..7ec186f 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
@@ -838,12 +838,12 @@ _fd_parm:                                    ; 0xf0000 LB 0x5b
 _fd_map:                                     ; 0xf005b LB 0xf
     db  001h, 000h, 002h, 002h, 003h, 003h, 004h, 004h, 005h, 005h, 00eh, 006h, 00fh, 006h, 000h
 _pktacc:                                     ; 0xf006a LB 0xc
-    db  000h, 000h, 000h, 000h, 000h, 000h, 03fh, 028h, 0e2h, 078h, 0aah, 086h
+    db  000h, 000h, 000h, 000h, 000h, 000h, 03fh, 028h, 0d0h, 078h, 098h, 086h
 _softrst:                                    ; 0xf0076 LB 0xc
     db  000h, 000h, 000h, 000h, 000h, 000h, 027h, 02bh, 037h, 036h, 037h, 036h
 _dskacc:                                     ; 0xf0082 LB 0x2e
     db  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 088h, 027h, 002h, 028h, 000h, 000h, 000h, 000h
-    db  076h, 077h, 02ch, 078h, 0a6h, 085h, 03ah, 086h, 000h, 000h, 000h, 000h, 000h, 000h, 05fh, 033h
+    db  064h, 077h, 01ah, 078h, 094h, 085h, 028h, 086h, 000h, 000h, 000h, 000h, 000h, 000h, 05fh, 033h
     db  032h, 05fh, 000h, 0dah, 00fh, 000h, 000h, 001h, 0f3h, 000h, 000h, 000h, 000h, 000h
 
 section CONST progbits vstart=0xb0 align=1 ; size=0xcf8 class=DATA group=DGROUP
@@ -965,7 +965,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xcf8 class=DATA group=DGROUP
 
 section CONST2 progbits vstart=0xda8 align=1 ; size=0x3fa class=DATA group=DGROUP
 _bios_cvs_version_string:                    ; 0xf0da8 LB 0x12
-    db  'VirtualBox 4.3.12', 000h
+    db  'VirtualBox 4.3.14', 000h
 _bios_prefix_string:                         ; 0xf0dba LB 0x8
     db  'BIOS: ', 000h, 000h
 _isotag:                                     ; 0xf0dc2 LB 0x6
@@ -1039,7 +1039,7 @@ _panic_msg_keyb_buffer_full:                 ; 0xf1182 LB 0x20
   ; Padding 0x45e bytes at 0xf11a2
   times 1118 db 0
 
-section _TEXT progbits vstart=0x1600 align=1 ; size=0x7f15 class=CODE group=AUTO
+section _TEXT progbits vstart=0x1600 align=1 ; size=0x7f55 class=CODE group=AUTO
 read_byte_:                                  ; 0xf1600 LB 0xe
     push bx                                   ; 53
     push bp                                   ; 55
@@ -1249,7 +1249,7 @@ _print_bios_banner:                          ; 0xf1747 LB 0x2e
     mov AH, strict byte 000h                  ; b4 00
     int 010h                                  ; cd 10
     jmp short 01771h                          ; eb 03
-    call 07385h                               ; e8 14 5c
+    call 07373h                               ; e8 02 5c
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
@@ -1395,7 +1395,7 @@ put_luint_:                                  ; 0xf186f LB 0x72
     mov dx, cx                                ; 89 ca
     mov bx, strict word 0000ah                ; bb 0a 00
     xor cx, cx                                ; 31 c9
-    call 09420h                               ; e8 97 7b
+    call 09460h                               ; e8 d7 7b
     mov word [bp-008h], ax                    ; 89 46 f8
     mov cx, dx                                ; 89 d1
     mov dx, ax                                ; 89 c2
@@ -2358,7 +2358,7 @@ _ata_detect:                                 ; 0xf1f57 LB 0x617
     mov cx, si                                ; 89 f1
     mov dx, ss                                ; 8c d2
     lea ax, [bp-036h]                         ; 8d 46 ca
-    call 05341h                               ; e8 74 31
+    call 0532fh                               ; e8 62 31
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
@@ -4756,7 +4756,7 @@ cdrom_boot_:                                 ; 0xf3840 LB 0x416
     xor bx, bx                                ; 31 db
     mov dx, ss                                ; 8c d2
     lea ax, [bp-026h]                         ; 8d 46 da
-    call 0948ah                               ; e8 f1 5b
+    call 094cah                               ; e8 31 5c
     mov word [bp-026h], strict word 00028h    ; c7 46 da 28 00
     mov ax, strict word 00011h                ; b8 11 00
     xor dx, dx                                ; 31 d2
@@ -5215,13 +5215,13 @@ _int13_cdemu:                                ; 0xf3c56 LB 0x434
     mov word [bp-01ch], dx                    ; 89 56 e4
     xor dl, dl                                ; 30 d2
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 5f 56
+    call 09499h                               ; e8 9f 56
     xor bx, bx                                ; 31 db
     add ax, si                                ; 01 f0
     adc dx, bx                                ; 11 da
     mov bx, di                                ; 89 fb
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 52 56
+    call 09499h                               ; e8 92 56
     mov bx, ax                                ; 89 c3
     mov ax, word [bp-010h]                    ; 8b 46 f0
     dec ax                                    ; 48
@@ -5256,7 +5256,7 @@ _int13_cdemu:                                ; 0xf3c56 LB 0x434
     mov cx, strict word 0000ch                ; b9 0c 00
     mov dx, ss                                ; 8c d2
     lea ax, [bp-02eh]                         ; 8d 46 d2
-    call 0948ah                               ; e8 2c 56
+    call 094cah                               ; e8 6c 56
     mov word [bp-02eh], strict word 00028h    ; c7 46 d2 28 00
     mov ax, word [bp-014h]                    ; 8b 46 ec
     add ax, si                                ; 01 f0
@@ -5563,7 +5563,7 @@ _int13_cdrom:                                ; 0xf408a LB 0x562
     xor bx, bx                                ; 31 db
     mov dx, ss                                ; 8c d2
     lea ax, [bp-02ch]                         ; 8d 46 d4
-    call 0948ah                               ; e8 91 52
+    call 094cah                               ; e8 d1 52
     mov word [bp-02ch], strict word 00028h    ; c7 46 d4 28 00
     mov ax, word [bp-018h]                    ; 8b 46 e8
     mov dx, di                                ; 89 fa
@@ -6067,7 +6067,7 @@ _int19_function:                             ; 0xf46f1 LB 0x256
     and AL, strict byte 0f0h                  ; 24 f0
     xor ah, ah                                ; 30 e4
     sar ax, 004h                              ; c1 f8 04
-    call 075a9h                               ; e8 4a 2e
+    call 07597h                               ; e8 38 2e
     cmp byte [bp+004h], 002h                  ; 80 7e 04 02
     jne short 04768h                          ; 75 03
     shr si, 004h                              ; c1 ee 04
@@ -6253,7 +6253,7 @@ keyboard_panic_:                             ; 0xf4947 LB 0x13
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
-_keyboard_init:                              ; 0xf495a LB 0x27c
+_keyboard_init:                              ; 0xf495a LB 0x26a
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     mov AL, strict byte 0aah                  ; b0 aa
@@ -6397,37 +6397,29 @@ _keyboard_init:                              ; 0xf495a LB 0x27c
     je short 04a78h                           ; 74 06
     mov ax, 003e1h                            ; b8 e1 03
     call 04947h                               ; e8 cf fe
-    mov bx, strict word 0ffffh                ; bb ff ff
     mov dx, strict word 00064h                ; ba 64 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 04a92h                          ; 75 0d
-    dec bx                                    ; 4b
-    test bx, bx                               ; 85 db
-    jbe short 04a92h                          ; 76 08
+    jne short 04a8ah                          ; 75 08
     mov AL, strict byte 031h                  ; b0 31
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04a7bh                          ; eb e9
-    test bx, bx                               ; 85 db
-    jne short 04a9ch                          ; 75 06
-    mov ax, strict word 0001fh                ; b8 1f 00
-    call 04947h                               ; e8 ab fe
+    jmp short 04a78h                          ; eb ee
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000aah                            ; 3d aa 00
-    je short 04ab5h                           ; 74 0e
+    je short 04aa3h                           ; 74 0e
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000aah                            ; 3d aa 00
-    je short 04ab5h                           ; 74 06
+    je short 04aa3h                           ; 74 06
     mov ax, 003e2h                            ; b8 e2 03
-    call 04947h                               ; e8 92 fe
+    call 04947h                               ; e8 a4 fe
     mov AL, strict byte 0f5h                  ; b0 f5
     mov dx, strict word 00060h                ; ba 60 00
     out DX, AL                                ; ee
@@ -6437,44 +6429,44 @@ _keyboard_init:                              ; 0xf495a LB 0x27c
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 04ad5h                           ; 74 0d
+    je short 04ac3h                           ; 74 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04ad5h                          ; 76 08
+    jbe short 04ac3h                          ; 76 08
     mov AL, strict byte 040h                  ; b0 40
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04abeh                          ; eb e9
+    jmp short 04aach                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04adfh                          ; 75 06
+    jne short 04acdh                          ; 75 06
     mov ax, strict word 00028h                ; b8 28 00
-    call 04947h                               ; e8 68 fe
+    call 04947h                               ; e8 7a fe
     mov bx, strict word 0ffffh                ; bb ff ff
     mov dx, strict word 00064h                ; ba 64 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 04af9h                          ; 75 0d
+    jne short 04ae7h                          ; 75 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04af9h                          ; 76 08
+    jbe short 04ae7h                          ; 76 08
     mov AL, strict byte 041h                  ; b0 41
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04ae2h                          ; eb e9
+    jmp short 04ad0h                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04b03h                          ; 75 06
+    jne short 04af1h                          ; 75 06
     mov ax, strict word 00029h                ; b8 29 00
-    call 04947h                               ; e8 44 fe
+    call 04947h                               ; e8 56 fe
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000fah                            ; 3d fa 00
-    je short 04b14h                           ; 74 06
+    je short 04b02h                           ; 74 06
     mov ax, 003e3h                            ; b8 e3 03
-    call 04947h                               ; e8 33 fe
+    call 04947h                               ; e8 45 fe
     mov AL, strict byte 060h                  ; b0 60
     mov dx, strict word 00064h                ; ba 64 00
     out DX, AL                                ; ee
@@ -6484,18 +6476,18 @@ _keyboard_init:                              ; 0xf495a LB 0x27c
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 04b34h                           ; 74 0d
+    je short 04b22h                           ; 74 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04b34h                          ; 76 08
+    jbe short 04b22h                          ; 76 08
     mov AL, strict byte 050h                  ; b0 50
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04b1dh                          ; eb e9
+    jmp short 04b0bh                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04b3eh                          ; 75 06
+    jne short 04b2ch                          ; 75 06
     mov ax, strict word 00032h                ; b8 32 00
-    call 04947h                               ; e8 09 fe
+    call 04947h                               ; e8 1b fe
     mov AL, strict byte 065h                  ; b0 65
     mov dx, strict word 00060h                ; ba 60 00
     out DX, AL                                ; ee
@@ -6505,18 +6497,18 @@ _keyboard_init:                              ; 0xf495a LB 0x27c
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 04b5eh                           ; 74 0d
+    je short 04b4ch                           ; 74 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04b5eh                          ; 76 08
+    jbe short 04b4ch                          ; 76 08
     mov AL, strict byte 060h                  ; b0 60
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04b47h                          ; eb e9
+    jmp short 04b35h                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04b68h                          ; 75 06
+    jne short 04b56h                          ; 75 06
     mov ax, strict word 0003ch                ; b8 3c 00
-    call 04947h                               ; e8 df fd
+    call 04947h                               ; e8 f1 fd
     mov AL, strict byte 0f4h                  ; b0 f4
     mov dx, strict word 00060h                ; ba 60 00
     out DX, AL                                ; ee
@@ -6526,53 +6518,53 @@ _keyboard_init:                              ; 0xf495a LB 0x27c
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 04b88h                           ; 74 0d
+    je short 04b76h                           ; 74 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04b88h                          ; 76 08
+    jbe short 04b76h                          ; 76 08
     mov AL, strict byte 070h                  ; b0 70
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04b71h                          ; eb e9
+    jmp short 04b5fh                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04b92h                          ; 75 06
+    jne short 04b80h                          ; 75 06
     mov ax, strict word 00046h                ; b8 46 00
-    call 04947h                               ; e8 b5 fd
+    call 04947h                               ; e8 c7 fd
     mov bx, strict word 0ffffh                ; bb ff ff
     mov dx, strict word 00064h                ; ba 64 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 04bach                          ; 75 0d
+    jne short 04b9ah                          ; 75 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 04bach                          ; 76 08
+    jbe short 04b9ah                          ; 76 08
     mov AL, strict byte 071h                  ; b0 71
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 04b95h                          ; eb e9
+    jmp short 04b83h                          ; eb e9
     test bx, bx                               ; 85 db
-    jne short 04bb6h                          ; 75 06
+    jne short 04ba4h                          ; 75 06
     mov ax, strict word 00046h                ; b8 46 00
-    call 04947h                               ; e8 91 fd
+    call 04947h                               ; e8 a3 fd
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000fah                            ; 3d fa 00
-    je short 04bc7h                           ; 74 06
+    je short 04bb5h                           ; 74 06
     mov ax, 003e4h                            ; b8 e4 03
-    call 04947h                               ; e8 80 fd
+    call 04947h                               ; e8 92 fd
     mov AL, strict byte 0a8h                  ; b0 a8
     mov dx, strict word 00064h                ; ba 64 00
     out DX, AL                                ; ee
     xor ax, ax                                ; 31 c0
-    call 05e41h                               ; e8 6f 12
+    call 05e2fh                               ; e8 6f 12
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
-enqueue_key_:                                ; 0xf4bd6 LB 0x93
+enqueue_key_:                                ; 0xf4bc4 LB 0x93
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -6584,32 +6576,32 @@ enqueue_key_:                                ; 0xf4bd6 LB 0x93
     mov bl, dl                                ; 88 d3
     mov dx, strict word 0001ah                ; ba 1a 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 30 ca
+    call 0161ch                               ; e8 42 ca
     mov di, ax                                ; 89 c7
     mov dx, strict word 0001ch                ; ba 1c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 25 ca
+    call 0161ch                               ; e8 37 ca
     mov si, ax                                ; 89 c6
     lea cx, [si+002h]                         ; 8d 4c 02
     cmp cx, strict byte 0003eh                ; 83 f9 3e
-    jc short 04c04h                           ; 72 03
+    jc short 04bf2h                           ; 72 03
     mov cx, strict word 0001eh                ; b9 1e 00
     cmp cx, di                                ; 39 f9
-    jne short 04c0ch                          ; 75 04
+    jne short 04bfah                          ; 75 04
     xor ax, ax                                ; 31 c0
-    jmp short 04c31h                          ; eb 25
+    jmp short 04c1fh                          ; eb 25
     xor bh, bh                                ; 30 ff
     mov dx, si                                ; 89 f2
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 f8 c9
+    call 0160eh                               ; e8 0a ca
     movzx bx, byte [bp-00ah]                  ; 0f b6 5e f6
     lea dx, [si+001h]                         ; 8d 54 01
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 eb c9
+    call 0160eh                               ; e8 fd c9
     mov bx, cx                                ; 89 cb
     mov dx, strict word 0001ch                ; ba 1c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 fc c9
+    call 0162ah                               ; e8 0e ca
     mov ax, strict word 00001h                ; b8 01 00
     lea sp, [bp-008h]                         ; 8d 66 f8
     pop di                                    ; 5f
@@ -6627,27 +6619,32 @@ enqueue_key_:                                ; 0xf4bd6 LB 0x93
     inc bp                                    ; 45
     cmp bh, byte [bx+si]                      ; 3a 38
     sub bl, byte [ss:di]                      ; 36 2a 1d
-    mov word [0304eh], ax                     ; a3 4e 30
+    xchg cx, ax                               ; 91
+    dec si                                    ; 4e
+    push DS                                   ; 1e
     dec bp                                    ; 4d
-    dec word [si-001h]                        ; ff 4c ff
+    in ax, DX                                 ; ed
     dec sp                                    ; 4c
-    mov DL, strict byte 04dh                  ; b2 4d
-    fmul dword [si+024h]                      ; d8 4c 24
-    dec si                                    ; 4e
-    jnc short 04ca7h                          ; 73 4e
-    xchg si, ax                               ; 96
-    dec si                                    ; 4e
-    jno short 04caah                          ; 71 4d
-    dec word [si-001h]                        ; ff 4c ff
+    in ax, DX                                 ; ed
     dec sp                                    ; 4c
-    jmp short 04cb0h                          ; eb 4d
-    db  0f1h
+    mov AL, byte [0c64dh]                     ; a0 4d c6
     dec sp                                    ; 4c
-    push sp                                   ; 54
+    adc cl, byte [bp+061h]                    ; 12 4e 61
     dec si                                    ; 4e
-    db  08fh
+    test byte [bp+05fh], cl                   ; 84 4e 5f
+    dec bp                                    ; 4d
+    in ax, DX                                 ; ed
+    dec sp                                    ; 4c
+    in ax, DX                                 ; ed
+    dec sp                                    ; 4c
+    db  0d9h
+    dec bp                                    ; 4d
+    db  0dfh
+    dec sp                                    ; 4c
+    inc dx                                    ; 42
     dec si                                    ; 4e
-_int09_function:                             ; 0xf4c69 LB 0x35d
+    jnl short 04ca5h                          ; 7d 4e
+_int09_function:                             ; 0xf4c57 LB 0x35d
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -6656,56 +6653,56 @@ _int09_function:                             ; 0xf4c69 LB 0x35d
     mov al, byte [bp+014h]                    ; 8a 46 14
     mov byte [bp-00ah], al                    ; 88 46 f6
     test al, al                               ; 84 c0
-    jne short 04c94h                          ; 75 19
+    jne short 04c82h                          ; 75 19
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 5b cc
+    call 018e1h                               ; e8 6d cc
     push 00567h                               ; 68 67 05
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 94 cc
+    call 01922h                               ; e8 a6 cc
     add sp, strict byte 00004h                ; 83 c4 04
-    jmp near 04fbfh                           ; e9 2b 03
+    jmp near 04fadh                           ; e9 2b 03
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 63 c9
+    call 01600h                               ; e8 75 c9
     mov byte [bp-00eh], al                    ; 88 46 f2
     mov bl, al                                ; 88 c3
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 55 c9
+    call 01600h                               ; e8 67 c9
     mov byte [bp-010h], al                    ; 88 46 f0
     mov byte [bp-00ch], al                    ; 88 46 f4
     mov dx, 00096h                            ; ba 96 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 46 c9
+    call 01600h                               ; e8 58 c9
     mov byte [bp-008h], al                    ; 88 46 f8
     mov byte [bp-006h], al                    ; 88 46 fa
     mov al, byte [bp-00ah]                    ; 8a 46 f6
     push CS                                   ; 0e
     pop ES                                    ; 07
     mov cx, strict word 00010h                ; b9 10 00
-    mov di, 04c3ah                            ; bf 3a 4c
+    mov di, 04c28h                            ; bf 28 4c
     repne scasb                               ; f2 ae
     sal cx, 1                                 ; d1 e1
     mov di, cx                                ; 89 cf
-    mov ax, word [cs:di+04c49h]               ; 2e 8b 85 49 4c
+    mov ax, word [cs:di+04c37h]               ; 2e 8b 85 37 4c
     jmp ax                                    ; ff e0
     xor bl, 040h                              ; 80 f3 40
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 28 c9
+    call 0160eh                               ; e8 3a c9
     or byte [bp-00ch], 040h                   ; 80 4e f4 40
     movzx bx, byte [bp-00ch]                  ; 0f b6 5e f4
-    jmp near 04e67h                           ; e9 76 01
+    jmp near 04e55h                           ; e9 76 01
     mov al, byte [bp-010h]                    ; 8a 46 f0
     and AL, strict byte 0bfh                  ; 24 bf
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
-    jmp near 04e67h                           ; e9 68 01
+    jmp near 04e55h                           ; e9 68 01
     test byte [bp-006h], 002h                 ; f6 46 fa 02
-    jne near 04fa1h                           ; 0f 85 9a 02
+    jne near 04f8fh                           ; 0f 85 9a 02
     mov al, byte [bp-00ah]                    ; 8a 46 f6
     and AL, strict byte 07fh                  ; 24 7f
     cmp AL, strict byte 02ah                  ; 3c 2a
@@ -6714,250 +6711,250 @@ _int09_function:                             ; 0xf4c69 LB 0x35d
     xor ah, ah                                ; 30 e4
     inc ax                                    ; 40
     test byte [bp-00ah], 080h                 ; f6 46 f6 80
-    je short 04d20h                           ; 74 06
+    je short 04d0eh                           ; 74 06
     not al                                    ; f6 d0
     and bl, al                                ; 20 c3
-    jmp short 04d22h                          ; eb 02
+    jmp short 04d10h                          ; eb 02
     or bl, al                                 ; 08 c3
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 e1 c8
-    jmp near 04fa1h                           ; e9 71 02
+    call 0160eh                               ; e8 f3 c8
+    jmp near 04f8fh                           ; e9 71 02
     test byte [bp-008h], 001h                 ; f6 46 f8 01
-    jne near 04fa1h                           ; 0f 85 69 02
+    jne near 04f8fh                           ; 0f 85 69 02
     or bl, 004h                               ; 80 cb 04
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 c8 c8
+    call 0160eh                               ; e8 da c8
     mov al, byte [bp-008h]                    ; 8a 46 f8
     test AL, strict byte 002h                 ; a8 02
-    je short 04d5ah                           ; 74 0d
+    je short 04d48h                           ; 74 0d
     or AL, strict byte 004h                   ; 0c 04
     mov byte [bp-006h], al                    ; 88 46 fa
     movzx bx, al                              ; 0f b6 d8
     mov dx, 00096h                            ; ba 96 00
-    jmp short 04d68h                          ; eb 0e
+    jmp short 04d56h                          ; eb 0e
     mov al, byte [bp-010h]                    ; 8a 46 f0
     or AL, strict byte 001h                   ; 0c 01
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 a0 c8
-    jmp near 04fa1h                           ; e9 30 02
+    call 0160eh                               ; e8 b2 c8
+    jmp near 04f8fh                           ; e9 30 02
     test byte [bp-008h], 001h                 ; f6 46 f8 01
-    jne near 04fa1h                           ; 0f 85 28 02
+    jne near 04f8fh                           ; 0f 85 28 02
     and bl, 0fbh                              ; 80 e3 fb
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 87 c8
+    call 0160eh                               ; e8 99 c8
     mov al, byte [bp-008h]                    ; 8a 46 f8
     test AL, strict byte 002h                 ; a8 02
-    je short 04d9bh                           ; 74 0d
+    je short 04d89h                           ; 74 0d
     and AL, strict byte 0fbh                  ; 24 fb
     mov byte [bp-006h], al                    ; 88 46 fa
     movzx bx, al                              ; 0f b6 d8
     mov dx, 00096h                            ; ba 96 00
-    jmp short 04da9h                          ; eb 0e
+    jmp short 04d97h                          ; eb 0e
     mov al, byte [bp-010h]                    ; 8a 46 f0
     and AL, strict byte 0feh                  ; 24 fe
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 5f c8
-    jmp near 04fa1h                           ; e9 ef 01
+    call 0160eh                               ; e8 71 c8
+    jmp near 04f8fh                           ; e9 ef 01
     or bl, 008h                               ; 80 cb 08
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 4e c8
+    call 0160eh                               ; e8 60 c8
     mov al, byte [bp-008h]                    ; 8a 46 f8
     test AL, strict byte 002h                 ; a8 02
-    je short 04dd4h                           ; 74 0d
+    je short 04dc2h                           ; 74 0d
     or AL, strict byte 008h                   ; 0c 08
     mov byte [bp-006h], al                    ; 88 46 fa
     movzx bx, al                              ; 0f b6 d8
     mov dx, 00096h                            ; ba 96 00
-    jmp short 04de2h                          ; eb 0e
+    jmp short 04dd0h                          ; eb 0e
     mov al, byte [bp-010h]                    ; 8a 46 f0
     or AL, strict byte 002h                   ; 0c 02
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 26 c8
-    jmp near 04fa1h                           ; e9 b6 01
+    call 0160eh                               ; e8 38 c8
+    jmp near 04f8fh                           ; e9 b6 01
     and bl, 0f7h                              ; 80 e3 f7
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 15 c8
+    call 0160eh                               ; e8 27 c8
     mov al, byte [bp-008h]                    ; 8a 46 f8
     test AL, strict byte 002h                 ; a8 02
-    je short 04e0dh                           ; 74 0d
+    je short 04dfbh                           ; 74 0d
     and AL, strict byte 0f7h                  ; 24 f7
     mov byte [bp-006h], al                    ; 88 46 fa
     movzx bx, al                              ; 0f b6 d8
     mov dx, 00096h                            ; ba 96 00
-    jmp short 04e1bh                          ; eb 0e
+    jmp short 04e09h                          ; eb 0e
     mov al, byte [bp-010h]                    ; 8a 46 f0
     and AL, strict byte 0fdh                  ; 24 fd
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 ed c7
-    jmp near 04fa1h                           ; e9 7d 01
+    call 0160eh                               ; e8 ff c7
+    jmp near 04f8fh                           ; e9 7d 01
     test byte [bp-008h], 003h                 ; f6 46 f8 03
-    jne near 04fa1h                           ; 0f 85 75 01
+    jne near 04f8fh                           ; 0f 85 75 01
     mov al, byte [bp-010h]                    ; 8a 46 f0
     or AL, strict byte 020h                   ; 0c 20
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 ce c7
+    call 0160eh                               ; e8 e0 c7
     mov bl, byte [bp-00eh]                    ; 8a 5e f2
     xor bl, 020h                              ; 80 f3 20
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 bd c7
-    jmp near 04fa1h                           ; e9 4d 01
+    call 0160eh                               ; e8 cf c7
+    jmp near 04f8fh                           ; e9 4d 01
     test byte [bp-008h], 003h                 ; f6 46 f8 03
-    jne near 04fa1h                           ; 0f 85 45 01
+    jne near 04f8fh                           ; 0f 85 45 01
     mov al, byte [bp-010h]                    ; 8a 46 f0
     and AL, strict byte 0dfh                  ; 24 df
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 9e c7
-    jmp near 04fa1h                           ; e9 2e 01
+    call 0160eh                               ; e8 b0 c7
+    jmp near 04f8fh                           ; e9 2e 01
     mov al, byte [bp-010h]                    ; 8a 46 f0
     or AL, strict byte 010h                   ; 0c 10
     mov byte [bp-00ch], al                    ; 88 46 f4
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 87 c7
+    call 0160eh                               ; e8 99 c7
     mov bl, byte [bp-00eh]                    ; 8a 5e f2
     xor bl, 010h                              ; 80 f3 10
-    jmp short 04e46h                          ; eb b7
+    jmp short 04e34h                          ; eb b7
     mov al, byte [bp-010h]                    ; 8a 46 f0
     and AL, strict byte 0efh                  ; 24 ef
-    jmp short 04e61h                          ; eb cb
+    jmp short 04e4fh                          ; eb cb
     mov al, bl                                ; 88 d8
     and AL, strict byte 00ch                  ; 24 0c
     cmp AL, strict byte 00ch                  ; 3c 0c
-    jne short 04ea3h                          ; 75 05
+    jne short 04e91h                          ; 75 05
     jmp far 0f000h:0e05bh                     ; ea 5b e0 00 f0
     test byte [bp-00ah], 080h                 ; f6 46 f6 80
-    jne near 04fa1h                           ; 0f 85 f6 00
+    jne near 04f8fh                           ; 0f 85 f6 00
     cmp byte [bp-00ah], 058h                  ; 80 7e f6 58
-    jbe short 04ecfh                          ; 76 1e
+    jbe short 04ebdh                          ; 76 1e
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 25 ca
+    call 018e1h                               ; e8 37 ca
     movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
     push ax                                   ; 50
     push 00581h                               ; 68 81 05
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 59 ca
+    call 01922h                               ; e8 6b ca
     add sp, strict byte 00006h                ; 83 c4 06
-    jmp near 04fbfh                           ; e9 f0 00
+    jmp near 04fadh                           ; e9 f0 00
     test bl, 008h                             ; f6 c3 08
-    je short 04ee6h                           ; 74 12
+    je short 04ed4h                           ; 74 12
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     imul si, si, strict byte 0000ah           ; 6b f6 0a
     mov dl, byte [si+00e0eh]                  ; 8a 94 0e 0e
     mov ax, word [si+00e0eh]                  ; 8b 84 0e 0e
-    jmp near 04f72h                           ; e9 8c 00
+    jmp near 04f60h                           ; e9 8c 00
     test bl, 004h                             ; f6 c3 04
-    je short 04efdh                           ; 74 12
+    je short 04eebh                           ; 74 12
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     imul si, si, strict byte 0000ah           ; 6b f6 0a
     mov dl, byte [si+00e0ch]                  ; 8a 94 0c 0e
     mov ax, word [si+00e0ch]                  ; 8b 84 0c 0e
-    jmp near 04f72h                           ; e9 75 00
+    jmp near 04f60h                           ; e9 75 00
     mov al, byte [bp-006h]                    ; 8a 46 fa
     and AL, strict byte 002h                  ; 24 02
     test al, al                               ; 84 c0
-    jbe short 04f1bh                          ; 76 15
+    jbe short 04f09h                          ; 76 15
     mov al, byte [bp-00ah]                    ; 8a 46 f6
     cmp AL, strict byte 047h                  ; 3c 47
-    jc short 04f1bh                           ; 72 0e
+    jc short 04f09h                           ; 72 0e
     cmp AL, strict byte 053h                  ; 3c 53
-    jnbe short 04f1bh                         ; 77 0a
+    jnbe short 04f09h                         ; 77 0a
     mov DL, strict byte 0e0h                  ; b2 e0
     movzx si, al                              ; 0f b6 f0
     imul si, si, strict byte 0000ah           ; 6b f6 0a
-    jmp short 04f6eh                          ; eb 53
+    jmp short 04f5ch                          ; eb 53
     test bl, 003h                             ; f6 c3 03
-    je short 04f4dh                           ; 74 2d
+    je short 04f3bh                           ; 74 2d
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     imul si, si, strict byte 0000ah           ; 6b f6 0a
     movzx ax, byte [si+00e10h]                ; 0f b6 84 10 0e
     movzx dx, bl                              ; 0f b6 d3
     test dx, ax                               ; 85 c2
-    je short 04f3dh                           ; 74 0a
+    je short 04f2bh                           ; 74 0a
     mov dl, byte [si+00e08h]                  ; 8a 94 08 0e
     mov ax, word [si+00e08h]                  ; 8b 84 08 0e
-    jmp short 04f45h                          ; eb 08
+    jmp short 04f33h                          ; eb 08
     mov dl, byte [si+00e0ah]                  ; 8a 94 0a 0e
     mov ax, word [si+00e0ah]                  ; 8b 84 0a 0e
     shr ax, 008h                              ; c1 e8 08
     mov byte [bp-00ah], al                    ; 88 46 f6
-    jmp short 04f78h                          ; eb 2b
+    jmp short 04f66h                          ; eb 2b
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     imul si, si, strict byte 0000ah           ; 6b f6 0a
     movzx ax, byte [si+00e10h]                ; 0f b6 84 10 0e
     movzx dx, bl                              ; 0f b6 d3
     test dx, ax                               ; 85 c2
-    je short 04f6ah                           ; 74 0a
+    je short 04f58h                           ; 74 0a
     mov dl, byte [si+00e0ah]                  ; 8a 94 0a 0e
     mov ax, word [si+00e0ah]                  ; 8b 84 0a 0e
-    jmp short 04f72h                          ; eb 08
+    jmp short 04f60h                          ; eb 08
     mov dl, byte [si+00e08h]                  ; 8a 94 08 0e
     mov ax, word [si+00e08h]                  ; 8b 84 08 0e
     shr ax, 008h                              ; c1 e8 08
     mov byte [bp-00ah], al                    ; 88 46 f6
     cmp byte [bp-00ah], 000h                  ; 80 7e f6 00
-    jne short 04f98h                          ; 75 1a
+    jne short 04f86h                          ; 75 1a
     test dl, dl                               ; 84 d2
-    jne short 04f98h                          ; 75 16
+    jne short 04f86h                          ; 75 16
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 54 c9
+    call 018e1h                               ; e8 66 c9
     push 005b8h                               ; 68 b8 05
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 8d c9
+    call 01922h                               ; e8 9f c9
     add sp, strict byte 00004h                ; 83 c4 04
     xor dh, dh                                ; 30 f6
     movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
-    call 04bd6h                               ; e8 35 fc
+    call 04bc4h                               ; e8 35 fc
     mov al, byte [bp-00ah]                    ; 8a 46 f6
     and AL, strict byte 07fh                  ; 24 7f
     cmp AL, strict byte 01dh                  ; 3c 1d
-    je short 04faeh                           ; 74 04
+    je short 04f9ch                           ; 74 04
     and byte [bp-006h], 0feh                  ; 80 66 fa fe
     and byte [bp-006h], 0fdh                  ; 80 66 fa fd
     movzx bx, byte [bp-006h]                  ; 0f b6 5e fa
     mov dx, 00096h                            ; ba 96 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 4f c6
+    call 0160eh                               ; e8 61 c6
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-dequeue_key_:                                ; 0xf4fc6 LB 0x94
+dequeue_key_:                                ; 0xf4fb4 LB 0x94
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -6970,36 +6967,36 @@ dequeue_key_:                                ; 0xf4fc6 LB 0x94
     mov word [bp-008h], cx                    ; 89 4e f8
     mov dx, strict word 0001ah                ; ba 1a 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 3c c6
+    call 0161ch                               ; e8 4e c6
     mov bx, ax                                ; 89 c3
     mov dx, strict word 0001ch                ; ba 1c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 31 c6
+    call 0161ch                               ; e8 43 c6
     cmp bx, ax                                ; 39 c3
-    je short 0502ch                           ; 74 3d
+    je short 0501ah                           ; 74 3d
     mov dx, bx                                ; 89 da
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 09 c6
+    call 01600h                               ; e8 1b c6
     mov cl, al                                ; 88 c1
     lea dx, [bx+001h]                         ; 8d 57 01
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 fe c5
+    call 01600h                               ; e8 10 c6
     mov es, [bp-008h]                         ; 8e 46 f8
     mov byte [es:si], cl                      ; 26 88 0c
     mov es, [bp-006h]                         ; 8e 46 fa
     mov byte [es:di], al                      ; 26 88 05
     cmp word [bp+004h], strict byte 00000h    ; 83 7e 04 00
-    je short 05027h                           ; 74 13
+    je short 05015h                           ; 74 13
     inc bx                                    ; 43
     inc bx                                    ; 43
     cmp bx, strict byte 0003eh                ; 83 fb 3e
-    jc short 0501eh                           ; 72 03
+    jc short 0500ch                           ; 72 03
     mov bx, strict word 0001eh                ; bb 1e 00
     mov dx, strict word 0001ah                ; ba 1a 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 03 c6
+    call 0162ah                               ; e8 15 c6
     mov ax, strict word 00001h                ; b8 01 00
-    jmp short 0502eh                          ; eb 02
+    jmp short 0501ch                          ; eb 02
     xor ax, ax                                ; 31 c0
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
@@ -7010,37 +7007,37 @@ dequeue_key_:                                ; 0xf4fc6 LB 0x94
     adc word [bx+si], dx                      ; 11 10
     or cl, byte [bx+di]                       ; 0a 09
     add ax, 00102h                            ; 05 02 01
-    add al, bh                                ; 00 f8
+    add dh, ah                                ; 00 e6
     push dx                                   ; 52
-    push CS                                   ; 0e
-    push cx                                   ; 51
-    push bp                                   ; 55
+    cld                                       ; fc
+    push ax                                   ; 50
+    inc bx                                    ; 43
     push cx                                   ; 51
-    mov ax, word [0b151h]                     ; a1 51 b1
+    db  08fh, 051h, 09fh
+    ; pop word [bx+di-061h]                     ; 8f 51 9f
     push cx                                   ; 51
-    fist dword [bx+di-01ch]                   ; db 51 e4
+    leave                                     ; c9
     push cx                                   ; 51
-    push bp                                   ; 55
+    rcl byte [bx+di+043h], CL                 ; d2 51 43
     push dx                                   ; 52
-    xchg byte [bp+si-04dh], dl                ; 86 52 b3
-    push dx                                   ; 52
-    in ax, DX                                 ; ed
+    je short 05094h                           ; 74 52
+    mov ax, word [0db52h]                     ; a1 52 db
     push dx                                   ; 52
-    db  03bh
+    db  029h
     push bx                                   ; 53
-_int16_function:                             ; 0xf505a LB 0x2e7
+_int16_function:                             ; 0xf5048 LB 0x2e7
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push di                                   ; 57
     sub sp, strict byte 00006h                ; 83 ec 06
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 96 c5
+    call 01600h                               ; e8 a8 c5
     mov cl, al                                ; 88 c1
     mov bh, al                                ; 88 c7
     mov dx, 00097h                            ; ba 97 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 89 c5
+    call 01600h                               ; e8 9b c5
     mov bl, al                                ; 88 c3
     movzx dx, cl                              ; 0f b6 d1
     sar dx, 004h                              ; c1 fa 04
@@ -7049,7 +7046,7 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     xor ah, ah                                ; 30 e4
     xor al, dl                                ; 30 d0
     test ax, ax                               ; 85 c0
-    je short 050ech                           ; 74 60
+    je short 050dah                           ; 74 60
     cli                                       ; fa
     mov AL, strict byte 0edh                  ; b0 ed
     mov dx, strict word 00060h                ; ba 60 00
@@ -7059,17 +7056,17 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 050a5h                          ; 75 08
+    jne short 05093h                          ; 75 08
     mov AL, strict byte 021h                  ; b0 21
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 05093h                          ; eb ee
+    jmp short 05081h                          ; eb ee
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000fah                            ; 3d fa 00
-    jne short 050ebh                          ; 75 3b
+    jne short 050d9h                          ; 75 3b
     and bl, 0f8h                              ; 80 e3 f8
     movzx ax, bh                              ; 0f b6 c7
     sar ax, 004h                              ; c1 f8 04
@@ -7085,11 +7082,11 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 050dah                          ; 75 08
+    jne short 050c8h                          ; 75 08
     mov AL, strict byte 021h                  ; b0 21
     mov dx, 00080h                            ; ba 80 00
     out DX, AL                                ; ee
-    jmp short 050c8h                          ; eb ee
+    jmp short 050b6h                          ; eb ee
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -7097,63 +7094,63 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     xor bh, bh                                ; 30 ff
     mov dx, 00097h                            ; ba 97 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 23 c5
+    call 0160eh                               ; e8 35 c5
     sti                                       ; fb
     mov ax, word [bp+012h]                    ; 8b 46 12
     shr ax, 008h                              ; c1 e8 08
     cmp ax, 000a2h                            ; 3d a2 00
-    jnbe near 052f8h                          ; 0f 87 ff 01
+    jnbe near 052e6h                          ; 0f 87 ff 01
     push CS                                   ; 0e
     pop ES                                    ; 07
     mov cx, strict word 0000ch                ; b9 0c 00
-    mov di, 05037h                            ; bf 37 50
+    mov di, 05025h                            ; bf 25 50
     repne scasb                               ; f2 ae
     sal cx, 1                                 ; d1 e1
     mov di, cx                                ; 89 cf
-    mov ax, word [cs:di+05042h]               ; 2e 8b 85 42 50
+    mov ax, word [cs:di+05030h]               ; 2e 8b 85 30 50
     jmp ax                                    ; ff e0
     push strict byte 00001h                   ; 6a 01
     mov cx, ss                                ; 8c d1
     lea bx, [bp-008h]                         ; 8d 5e f8
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 04fc6h                               ; e8 a9 fe
+    call 04fb4h                               ; e8 a9 fe
     test ax, ax                               ; 85 c0
-    jne short 0512ch                          ; 75 0b
+    jne short 0511ah                          ; 75 0b
     push 005efh                               ; 68 ef 05
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 f9 c7
+    call 01922h                               ; e8 0b c8
     add sp, strict byte 00004h                ; 83 c4 04
     cmp byte [bp-006h], 000h                  ; 80 7e fa 00
-    je short 05138h                           ; 74 06
+    je short 05126h                           ; 74 06
     cmp byte [bp-008h], 0f0h                  ; 80 7e f8 f0
-    je short 0513eh                           ; 74 06
+    je short 0512ch                           ; 74 06
     cmp byte [bp-008h], 0e0h                  ; 80 7e f8 e0
-    jne short 05142h                          ; 75 04
+    jne short 05130h                          ; 75 04
     mov byte [bp-008h], 000h                  ; c6 46 f8 00
     movzx dx, byte [bp-006h]                  ; 0f b6 56 fa
     sal dx, 008h                              ; c1 e2 08
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     or dx, ax                                 ; 09 c2
     mov word [bp+012h], dx                    ; 89 56 12
-    jmp near 0533bh                           ; e9 e6 01
+    jmp near 05329h                           ; e9 e6 01
     or word [bp+01ch], 00200h                 ; 81 4e 1c 00 02
     push strict byte 00000h                   ; 6a 00
     mov cx, ss                                ; 8c d1
     lea bx, [bp-008h]                         ; 8d 5e f8
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 04fc6h                               ; e8 5d fe
+    call 04fb4h                               ; e8 5d fe
     test ax, ax                               ; 85 c0
-    jne short 05174h                          ; 75 07
+    jne short 05162h                          ; 75 07
     or word [bp+01ch], strict byte 00040h     ; 83 4e 1c 40
-    jmp near 0533bh                           ; e9 c7 01
+    jmp near 05329h                           ; e9 c7 01
     cmp byte [bp-006h], 000h                  ; 80 7e fa 00
-    je short 05180h                           ; 74 06
+    je short 0516eh                           ; 74 06
     cmp byte [bp-008h], 0f0h                  ; 80 7e f8 f0
-    je short 05186h                           ; 74 06
+    je short 05174h                           ; 74 06
     cmp byte [bp-008h], 0e0h                  ; 80 7e f8 e0
-    jne short 0518ah                          ; 75 04
+    jne short 05178h                          ; 75 04
     mov byte [bp-008h], 000h                  ; c6 46 f8 00
     movzx dx, byte [bp-006h]                  ; 0f b6 56 fa
     sal dx, 008h                              ; c1 e2 08
@@ -7161,32 +7158,32 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     or dx, ax                                 ; 09 c2
     mov word [bp+012h], dx                    ; 89 56 12
     and word [bp+01ch], strict byte 0ffbfh    ; 83 66 1c bf
-    jmp near 0533bh                           ; e9 9a 01
+    jmp near 05329h                           ; e9 9a 01
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 56 c4
+    call 01600h                               ; e8 68 c4
     mov dx, word [bp+012h]                    ; 8b 56 12
     mov dl, al                                ; 88 c2
-    jmp short 0514fh                          ; eb 9e
+    jmp short 0513dh                          ; eb 9e
     mov al, byte [bp+010h]                    ; 8a 46 10
     movzx dx, al                              ; 0f b6 d0
     mov ax, word [bp+010h]                    ; 8b 46 10
     shr ax, 008h                              ; c1 e8 08
     xor ah, ah                                ; 30 e4
-    call 04bd6h                               ; e8 14 fa
+    call 04bc4h                               ; e8 14 fa
     test ax, ax                               ; 85 c0
-    jne short 051d3h                          ; 75 0d
+    jne short 051c1h                          ; 75 0d
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor al, al                                ; 30 c0
     or AL, strict byte 001h                   ; 0c 01
     mov word [bp+012h], ax                    ; 89 46 12
-    jmp near 0533bh                           ; e9 68 01
+    jmp near 05329h                           ; e9 68 01
     and word [bp+012h], 0ff00h                ; 81 66 12 00 ff
-    jmp near 0533bh                           ; e9 60 01
+    jmp near 05329h                           ; e9 60 01
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor al, al                                ; 30 c0
     or AL, strict byte 030h                   ; 0c 30
-    jmp short 051cdh                          ; eb e9
+    jmp short 051bbh                          ; eb e9
     mov byte [bp-004h], 002h                  ; c6 46 fc 02
     xor cx, cx                                ; 31 c9
     cli                                       ; fa
@@ -7199,40 +7196,40 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 0520bh                          ; 75 0d
+    jne short 051f9h                          ; 75 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 0520bh                          ; 76 08
+    jbe short 051f9h                          ; 76 08
     mov dx, 00080h                            ; ba 80 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
-    jmp short 051f4h                          ; eb e9
+    jmp short 051e2h                          ; eb e9
     test bx, bx                               ; 85 db
-    jbe short 0524fh                          ; 76 40
+    jbe short 0523dh                          ; 76 40
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp ax, 000fah                            ; 3d fa 00
-    jne short 0524fh                          ; 75 35
+    jne short 0523dh                          ; 75 35
     mov bx, strict word 0ffffh                ; bb ff ff
     mov dx, strict word 00064h                ; ba 64 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 05234h                          ; 75 0d
+    jne short 05222h                          ; 75 0d
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 05234h                          ; 76 08
+    jbe short 05222h                          ; 76 08
     mov dx, 00080h                            ; ba 80 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
-    jmp short 0521dh                          ; eb e9
+    jmp short 0520bh                          ; eb e9
     test bx, bx                               ; 85 db
-    jbe short 05246h                          ; 76 0e
+    jbe short 05234h                          ; 76 0e
     shr cx, 008h                              ; c1 e9 08
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
@@ -7242,80 +7239,80 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     or cx, ax                                 ; 09 c1
     dec byte [bp-004h]                        ; fe 4e fc
     cmp byte [bp-004h], 000h                  ; 80 7e fc 00
-    jnbe short 0521ah                         ; 77 cb
+    jnbe short 05208h                         ; 77 cb
     mov word [bp+00ch], cx                    ; 89 4e 0c
-    jmp near 0533bh                           ; e9 e6 00
+    jmp near 05329h                           ; e9 e6 00
     push strict byte 00001h                   ; 6a 01
     mov cx, ss                                ; 8c d1
     lea bx, [bp-008h]                         ; 8d 5e f8
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 04fc6h                               ; e8 62 fd
+    call 04fb4h                               ; e8 62 fd
     test ax, ax                               ; 85 c0
-    jne short 05273h                          ; 75 0b
+    jne short 05261h                          ; 75 0b
     push 005efh                               ; 68 ef 05
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 b2 c6
+    call 01922h                               ; e8 c4 c6
     add sp, strict byte 00004h                ; 83 c4 04
     cmp byte [bp-006h], 000h                  ; 80 7e fa 00
-    je near 05142h                            ; 0f 84 c7 fe
+    je near 05130h                            ; 0f 84 c7 fe
     cmp byte [bp-008h], 0f0h                  ; 80 7e f8 f0
-    je near 0513eh                            ; 0f 84 bb fe
-    jmp near 05142h                           ; e9 bc fe
+    je near 0512ch                            ; 0f 84 bb fe
+    jmp near 05130h                           ; e9 bc fe
     or word [bp+01ch], 00200h                 ; 81 4e 1c 00 02
     push strict byte 00000h                   ; 6a 00
     mov cx, ss                                ; 8c d1
     lea bx, [bp-008h]                         ; 8d 5e f8
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 04fc6h                               ; e8 2c fd
+    call 04fb4h                               ; e8 2c fd
     test ax, ax                               ; 85 c0
-    je near 0516dh                            ; 0f 84 cd fe
+    je near 0515bh                            ; 0f 84 cd fe
     cmp byte [bp-006h], 000h                  ; 80 7e fa 00
-    je near 0518ah                            ; 0f 84 e2 fe
+    je near 05178h                            ; 0f 84 e2 fe
     cmp byte [bp-008h], 0f0h                  ; 80 7e f8 f0
-    je near 05186h                            ; 0f 84 d6 fe
-    jmp near 0518ah                           ; e9 d7 fe
+    je near 05174h                            ; 0f 84 d6 fe
+    jmp near 05178h                           ; e9 d7 fe
     mov dx, strict word 00017h                ; ba 17 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 44 c3
+    call 01600h                               ; e8 56 c3
     mov dx, word [bp+012h]                    ; 8b 56 12
     mov dl, al                                ; 88 c2
     mov word [bp+012h], dx                    ; 89 56 12
     mov dx, strict word 00018h                ; ba 18 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 33 c3
+    call 01600h                               ; e8 45 c3
     mov bh, al                                ; 88 c7
     and bh, 073h                              ; 80 e7 73
     mov dx, 00096h                            ; ba 96 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 25 c3
+    call 01600h                               ; e8 37 c3
     and AL, strict byte 00ch                  ; 24 0c
     or bh, al                                 ; 08 c7
     mov dx, word [bp+012h]                    ; 8b 56 12
     xor dh, dh                                ; 30 f6
     movzx ax, bh                              ; 0f b6 c7
     sal ax, 008h                              ; c1 e0 08
-    jmp near 0514dh                           ; e9 60 fe
+    jmp near 0513bh                           ; e9 60 fe
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     or ah, 080h                               ; 80 cc 80
-    jmp near 051cdh                           ; e9 d5 fe
+    jmp near 051bbh                           ; e9 d5 fe
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 de c5
+    call 018e1h                               ; e8 f0 c5
     mov ax, word [bp+012h]                    ; 8b 46 12
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 00613h                               ; 68 13 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 10 c6
+    call 01922h                               ; e8 22 c6
     add sp, strict byte 00006h                ; 83 c4 06
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 c1 c5
+    call 018e1h                               ; e8 d3 c5
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     push ax                                   ; 50
     mov ax, word [bp+010h]                    ; 8b 46 10
@@ -7326,13 +7323,13 @@ _int16_function:                             ; 0xf505a LB 0x2e7
     push ax                                   ; 50
     push 0063bh                               ; 68 3b 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 ea c5
+    call 01922h                               ; e8 fc c5
     add sp, strict byte 0000ch                ; 83 c4 0c
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop di                                    ; 5f
     pop bp                                    ; 5d
     retn                                      ; c3
-set_geom_lba_:                               ; 0xf5341 LB 0x9e
+set_geom_lba_:                               ; 0xf532f LB 0x9e
     push si                                   ; 56
     push di                                   ; 57
     enter 00004h, 000h                        ; c8 04 00 00
@@ -7344,33 +7341,33 @@ set_geom_lba_:                               ; 0xf5341 LB 0x9e
     mov dx, strict word 0007eh                ; ba 7e 00
     mov di, 000ffh                            ; bf ff 00
     xor bx, bx                                ; 31 db
-    jmp short 05362h                          ; eb 05
+    jmp short 05350h                          ; eb 05
     cmp bx, strict byte 00004h                ; 83 fb 04
-    jnl short 05378h                          ; 7d 16
+    jnl short 05366h                          ; 7d 16
     cmp dx, word [bp-002h]                    ; 3b 56 fe
-    jnbe short 0536eh                         ; 77 07
-    jne short 05371h                          ; 75 08
+    jnbe short 0535ch                         ; 77 07
+    jne short 0535fh                          ; 75 08
     cmp ax, word [bp-004h]                    ; 3b 46 fc
-    jc short 05371h                           ; 72 03
+    jc short 0535fh                           ; 72 03
     inc di                                    ; 47
     shr di, 1                                 ; d1 ef
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
     inc bx                                    ; 43
-    jmp short 0535dh                          ; eb e5
+    jmp short 0534bh                          ; eb e5
     mov ax, di                                ; 89 f8
     xor dx, dx                                ; 31 d2
     mov bx, strict word 0003fh                ; bb 3f 00
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 d5 40
+    call 09499h                               ; e8 27 41
     mov bx, ax                                ; 89 c3
     mov cx, dx                                ; 89 d1
     mov ax, word [bp-004h]                    ; 8b 46 fc
     mov dx, word [bp-002h]                    ; 8b 56 fe
-    call 09420h                               ; e8 8f 40
+    call 09460h                               ; e8 e1 40
     mov word [es:si+002h], ax                 ; 26 89 44 02
     cmp ax, 00400h                            ; 3d 00 04
-    jbe short 053a0h                          ; 76 06
+    jbe short 0538eh                          ; 76 06
     mov word [es:si+002h], 00400h             ; 26 c7 44 02 00 04
     mov word [es:si], di                      ; 26 89 3c
     mov word [es:si+004h], strict word 0003fh ; 26 c7 44 04 3f 00
@@ -7378,57 +7375,55 @@ set_geom_lba_:                               ; 0xf5341 LB 0x9e
     pop di                                    ; 5f
     pop si                                    ; 5e
     retn                                      ; c3
-    imul dx, word [si-071h], 0bc54h           ; 69 54 8f 54 bc
+    push di                                   ; 57
     push sp                                   ; 54
-    mov sp, 0bc54h                            ; bc 54 bc
+    jnl short 053f3h                          ; 7d 54
+    stosb                                     ; aa
     push sp                                   ; 54
-    xchg sp, ax                               ; 94
-    push si                                   ; 56
-    retn 0c257h                               ; c2 57 c2
-    push di                                   ; 57
-    lodsw                                     ; ad
+    stosb                                     ; aa
+    push sp                                   ; 54
+    stosb                                     ; aa
+    push sp                                   ; 54
+    db  082h, 056h, 0b0h, 057h
+    ; adc byte [bp-050h], 057h                  ; 82 56 b0 57
+    mov AL, strict byte 057h                  ; b0 57
+    wait                                      ; 9b
     push si                                   ; 56
-    lahf                                      ; 9f
-    push di                                   ; 57
-    retn 0c257h                               ; c2 57 c2
-    push di                                   ; 57
-    lahf                                      ; 9f
-    push di                                   ; 57
-    lahf                                      ; 9f
-    push di                                   ; 57
-    retn 0c257h                               ; c2 57 c2
+    lea dx, [bx-050h]                         ; 8d 57 b0
     push di                                   ; 57
-    and dx, word [bx-061h]                    ; 23 57 9f
-    push di                                   ; 57
-    retn 0c257h                               ; c2 57 c2
-    push di                                   ; 57
-    lahf                                      ; 9f
-    push di                                   ; 57
-    push bx                                   ; 53
+    mov AL, strict byte 057h                  ; b0 57
+    lea dx, [bx-073h]                         ; 8d 57 8d
     push di                                   ; 57
-    retn 0c257h                               ; c2 57 c2
+    mov AL, strict byte 057h                  ; b0 57
+    mov AL, strict byte 057h                  ; b0 57
+    adc word [bx-073h], dx                    ; 11 57 8d
     push di                                   ; 57
-    db  0c2h
+    mov AL, strict byte 057h                  ; b0 57
+    mov AL, strict byte 057h                  ; b0 57
+    lea dx, [bx+041h]                         ; 8d 57 41
     push di                                   ; 57
-_int13_harddisk:                             ; 0xf53df LB 0x441
+    mov AL, strict byte 057h                  ; b0 57
+    mov AL, strict byte 057h                  ; b0 57
+    mov AL, strict byte 057h                  ; b0 57
+_int13_harddisk:                             ; 0xf53cd LB 0x441
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     sub sp, strict byte 00010h                ; 83 ec 10
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 2e c2
+    call 0161ch                               ; e8 40 c2
     mov si, 00122h                            ; be 22 01
     mov word [bp-004h], ax                    ; 89 46 fc
     xor bx, bx                                ; 31 db
     mov dx, 0008eh                            ; ba 8e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 0f c2
+    call 0160eh                               ; e8 21 c2
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     cmp ax, 00080h                            ; 3d 80 00
-    jc short 0540eh                           ; 72 05
+    jc short 053fch                           ; 72 05
     cmp ax, 00090h                            ; 3d 90 00
-    jc short 0542ch                           ; 72 1e
+    jc short 0541ah                           ; 72 1e
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     push ax                                   ; 50
@@ -7438,9 +7433,9 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     push 0065eh                               ; 68 5e 06
     push 0066dh                               ; 68 6d 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 fc c4
+    call 01922h                               ; e8 0e c5
     add sp, strict byte 0000ah                ; 83 c4 0a
-    jmp near 057ddh                           ; e9 b1 03
+    jmp near 057cbh                           ; e9 b1 03
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     mov es, [bp-004h]                         ; 8e 46 fc
@@ -7449,36 +7444,36 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     mov dl, byte [es:bx+0011fh]               ; 26 8a 97 1f 01
     mov byte [bp-002h], dl                    ; 88 56 fe
     cmp dl, 010h                              ; 80 fa 10
-    jc short 05455h                           ; 72 10
+    jc short 05443h                           ; 72 10
     push ax                                   ; 50
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 0065eh                               ; 68 5e 06
     push 00698h                               ; 68 98 06
-    jmp short 05421h                          ; eb cc
+    jmp short 0540fh                          ; eb cc
     mov bx, word [bp+016h]                    ; 8b 5e 16
     shr bx, 008h                              ; c1 eb 08
     cmp bx, strict byte 00018h                ; 83 fb 18
-    jnbe near 057c2h                          ; 0f 87 60 03
+    jnbe near 057b0h                          ; 0f 87 60 03
     add bx, bx                                ; 01 db
-    jmp word [cs:bx+053adh]                   ; 2e ff a7 ad 53
+    jmp word [cs:bx+0539bh]                   ; 2e ff a7 9b 53
     cmp byte [bp-002h], 008h                  ; 80 7e fe 08
-    jnc near 05478h                           ; 0f 83 07 00
+    jnc near 05466h                           ; 0f 83 07 00
     movzx ax, byte [bp-002h]                  ; 0f b6 46 fe
-    call 01c21h                               ; e8 a9 c7
+    call 01c21h                               ; e8 bb c7
     mov byte [bp+017h], 000h                  ; c6 46 17 00
     xor bx, bx                                ; 31 db
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 87 c1
+    call 0160eh                               ; e8 99 c1
     and byte [bp+01ch], 0feh                  ; 80 66 1c fe
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 68 c1
+    call 01600h                               ; e8 7a c1
     mov cl, al                                ; 88 c1
     mov dx, word [bp+016h]                    ; 8b 56 16
     xor dh, dh                                ; 30 f6
@@ -7489,10 +7484,10 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     xor bx, bx                                ; 31 db
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 59 c1
+    call 0160eh                               ; e8 6b c1
     test cl, cl                               ; 84 c9
-    je short 0547ch                           ; 74 c3
-    jmp near 057f9h                           ; e9 3d 03
+    je short 0546ah                           ; 74 c3
+    jmp near 057e7h                           ; e9 3d 03
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     mov word [bp-00ch], ax                    ; 89 46 f4
@@ -7512,22 +7507,22 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     mov word [bp-008h], ax                    ; 89 46 f8
     mov ax, word [bp-00ch]                    ; 8b 46 f4
     cmp ax, 00080h                            ; 3d 80 00
-    jnbe short 054f7h                         ; 77 04
+    jnbe short 054e5h                         ; 77 04
     test ax, ax                               ; 85 c0
-    jne short 0551ah                          ; 75 23
+    jne short 05508h                          ; 75 23
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 df c3
+    call 018e1h                               ; e8 f1 c3
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 0065eh                               ; 68 5e 06
     push 006cah                               ; 68 ca 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 0e c4
+    call 01922h                               ; e8 20 c4
     add sp, strict byte 00008h                ; 83 c4 08
-    jmp near 057ddh                           ; e9 c3 02
+    jmp near 057cbh                           ; e9 c3 02
     movzx ax, byte [bp-002h]                  ; 0f b6 46 fe
     imul ax, ax, strict byte 00018h           ; 6b c0 18
     mov es, [bp-004h]                         ; 8e 46 fc
@@ -7538,16 +7533,16 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     mov dx, word [es:bx+02ah]                 ; 26 8b 57 2a
     mov word [bp-00ah], dx                    ; 89 56 f6
     cmp di, ax                                ; 39 c7
-    jnc short 05547h                          ; 73 0c
+    jnc short 05535h                          ; 73 0c
     cmp cx, word [bp-008h]                    ; 3b 4e f8
-    jbe short 05547h                          ; 76 07
+    jbe short 05535h                          ; 76 07
     mov ax, word [bp-006h]                    ; 8b 46 fa
     cmp ax, dx                                ; 39 d0
-    jbe short 05575h                          ; 76 2e
+    jbe short 05563h                          ; 76 2e
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 8f c3
+    call 018e1h                               ; e8 a1 c3
     push dword [bp-008h]                      ; 66 ff 76 f8
     push di                                   ; 57
     mov ax, word [bp+012h]                    ; 8b 46 12
@@ -7559,36 +7554,36 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     push 0065eh                               ; 68 5e 06
     push 006f2h                               ; 68 f2 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 b3 c3
+    call 01922h                               ; e8 c5 c3
     add sp, strict byte 00010h                ; 83 c4 10
-    jmp near 057ddh                           ; e9 68 02
+    jmp near 057cbh                           ; e9 68 02
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     cmp ax, strict word 00004h                ; 3d 04 00
-    jne short 05583h                          ; 75 03
-    jmp near 05478h                           ; e9 f5 fe
+    jne short 05571h                          ; 75 03
+    jmp near 05466h                           ; e9 f5 fe
     movzx bx, byte [bp-002h]                  ; 0f b6 5e fe
     imul bx, bx, strict byte 00018h           ; 6b db 18
     mov es, [bp-004h]                         ; 8e 46 fc
     add bx, si                                ; 01 f3
     cmp cx, word [es:bx+02ch]                 ; 26 3b 4f 2c
-    jne short 055a4h                          ; 75 0f
+    jne short 05592h                          ; 75 0f
     mov ax, word [es:bx+030h]                 ; 26 8b 47 30
     cmp ax, word [bp-00ah]                    ; 3b 46 f6
-    jne short 055a4h                          ; 75 06
+    jne short 05592h                          ; 75 06
     cmp byte [bp-002h], 008h                  ; 80 7e fe 08
-    jc short 055d4h                           ; 72 30
+    jc short 055c2h                           ; 72 30
     mov ax, di                                ; 89 f8
     xor dx, dx                                ; 31 d2
     mov bx, cx                                ; 89 cb
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 aa 3e
+    call 09499h                               ; e8 fc 3e
     xor bx, bx                                ; 31 db
     add ax, word [bp-008h]                    ; 03 46 f8
     adc dx, bx                                ; 11 da
     mov bx, word [bp-00ah]                    ; 8b 5e f6
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 9b 3e
+    call 09499h                               ; e8 ed 3e
     xor bx, bx                                ; 31 db
     add ax, word [bp-006h]                    ; 03 46 fa
     adc dx, bx                                ; 11 da
@@ -7641,11 +7636,11 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     or bx, ax                                 ; 09 c3
     mov word [bp+016h], bx                    ; 89 5e 16
     test dl, dl                               ; 84 d2
-    je near 05478h                            ; 0f 84 13 fe
+    je near 05466h                            ; 0f 84 13 fe
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 71 c2
+    call 018e1h                               ; e8 83 c2
     movzx ax, dl                              ; 0f b6 c2
     push ax                                   ; 50
     mov ax, word [bp+016h]                    ; 8b 46 16
@@ -7654,21 +7649,21 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     push 0065eh                               ; 68 5e 06
     push 00739h                               ; 68 39 07
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 9c c2
+    call 01922h                               ; e8 ae c2
     add sp, strict byte 0000ah                ; 83 c4 0a
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 00ch                               ; 80 cc 0c
-    jmp near 057e5h                           ; e9 51 01
+    jmp near 057d3h                           ; e9 51 01
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 42 c2
+    call 018e1h                               ; e8 54 c2
     push 0075ah                               ; 68 5a 07
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 7b c2
+    call 01922h                               ; e8 8d c2
     add sp, strict byte 00004h                ; 83 c4 04
-    jmp near 05478h                           ; e9 cb fd
+    jmp near 05466h                           ; e9 cb fd
     movzx ax, byte [bp-002h]                  ; 0f b6 46 fe
     imul ax, ax, strict byte 00018h           ; 6b c0 18
     mov es, [bp-004h]                         ; 8e 46 fc
@@ -7711,7 +7706,7 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     mov dx, word [bp-00ch]                    ; 8b 56 f4
     or dx, ax                                 ; 09 c2
     mov word [bp+012h], dx                    ; 89 56 12
-    jmp near 05478h                           ; e9 55 fd
+    jmp near 05466h                           ; e9 55 fd
     movzx ax, byte [bp-002h]                  ; 0f b6 46 fe
     cwd                                       ; 99
     db  02bh, 0c2h
@@ -7727,12 +7722,12 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     ; sub ah, ah                                ; 2a e4
     and AL, strict byte 0c0h                  ; 24 c0
     cmp AL, strict byte 040h                  ; 3c 40
-    jne short 05748h                          ; 75 03
-    jmp near 05478h                           ; e9 30 fd
+    jne short 05736h                          ; 75 03
+    jmp near 05466h                           ; e9 30 fd
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 0aah                               ; 80 cc aa
-    jmp near 057e5h                           ; e9 92 00
+    jmp near 057d3h                           ; e9 92 00
     movzx ax, byte [bp-002h]                  ; 0f b6 46 fe
     imul ax, ax, strict byte 00018h           ; 6b c0 18
     mov es, [bp-004h]                         ; 8e 46 fc
@@ -7746,10 +7741,10 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     xor dx, dx                                ; 31 d2
     mov bx, word [bp-008h]                    ; 8b 5e f8
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 dc 3c
+    call 09499h                               ; e8 2e 3d
     mov bx, word [bp-006h]                    ; 8b 5e fa
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 d4 3c
+    call 09499h                               ; e8 26 3d
     mov word [bp-010h], ax                    ; 89 46 f0
     mov word [bp-00eh], dx                    ; 89 56 f2
     mov word [bp+014h], dx                    ; 89 56 14
@@ -7758,30 +7753,30 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     xor ah, ah                                ; 30 e4
     or ah, 003h                               ; 80 cc 03
     mov word [bp+016h], ax                    ; 89 46 16
-    jmp near 0547ch                           ; e9 dd fc
+    jmp near 0546ah                           ; e9 dd fc
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 37 c1
+    call 018e1h                               ; e8 49 c1
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 0065eh                               ; 68 5e 06
     push 00774h                               ; 68 74 07
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 66 c1
+    call 01922h                               ; e8 78 c1
     add sp, strict byte 00008h                ; 83 c4 08
-    jmp near 05478h                           ; e9 b6 fc
+    jmp near 05466h                           ; e9 b6 fc
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 14 c1
+    call 018e1h                               ; e8 26 c1
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 0065eh                               ; 68 5e 06
     push 007a7h                               ; 68 a7 07
-    jmp near 0550fh                           ; e9 32 fd
+    jmp near 054fdh                           ; e9 32 fd
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 001h                               ; 80 cc 01
@@ -7791,48 +7786,47 @@ _int13_harddisk:                             ; 0xf53df LB 0x441
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 15 be
+    call 0160eh                               ; e8 27 be
     or byte [bp+01ch], 001h                   ; 80 4e 1c 01
-    jmp near 0548bh                           ; e9 8b fc
-    mov bx, 0d358h                            ; bb 58 d3
+    jmp near 05479h                           ; e9 8b fc
+    test ax, 0c158h                           ; a9 58 c1
     pop ax                                    ; 58
-    rcr word [bx+si-02dh], CL                 ; d3 58 d3
-    pop ax                                    ; 58
-    db  082h, 05ch, 016h, 05ah
-    ; sbb byte [si+016h], 05ah                  ; 82 5c 16 5a
-    rcr word [bx+si+01ch], CL                 ; d3 58 1c
-    pop dx                                    ; 5a
-    db  082h, 05ch, 0d1h, 05ch
-    ; sbb byte [si-02fh], 05ch                  ; 82 5c d1 5c
-    rcr word [si-02fh], 1                     ; d1 5c d1
+    rcr word [bx+si-03fh], 058h               ; c1 58 c1 58
+    jo short 05854h                           ; 70 5c
+    add AL, strict byte 05ah                  ; 04 5a
+    rcr word [bx+si+00ah], 05ah               ; c1 58 0a 5a
+    jo short 0585ch                           ; 70 5c
+    mov di, 0bf5ch                            ; bf 5c bf
+    pop sp                                    ; 5c
+    mov di, 0bf5ch                            ; bf 5c bf
     pop sp                                    ; 5c
-    rcr word [si-067h], 1                     ; d1 5c 99
+    xchg word [si-041h], bx                   ; 87 5c bf
     pop sp                                    ; 5c
-    rcr word [si-02fh], 1                     ; d1 5c d1
+    db  0bfh
     pop sp                                    ; 5c
-_int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
+_int13_harddisk_ext:                         ; 0xf580e LB 0x4cc
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     sub sp, strict byte 00028h                ; 83 ec 28
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 ed bd
+    call 0161ch                               ; e8 ff bd
     mov word [bp-014h], ax                    ; 89 46 ec
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 e1 bd
+    call 0161ch                               ; e8 f3 bd
     mov si, 00122h                            ; be 22 01
     mov word [bp-026h], ax                    ; 89 46 da
     xor bx, bx                                ; 31 db
     mov dx, 0008eh                            ; ba 8e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 c2 bd
+    call 0160eh                               ; e8 d4 bd
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     cmp ax, 00080h                            ; 3d 80 00
-    jc short 0585bh                           ; 72 05
+    jc short 05849h                           ; 72 05
     cmp ax, 00090h                            ; 3d 90 00
-    jc short 05879h                           ; 72 1e
+    jc short 05867h                           ; 72 1e
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     push ax                                   ; 50
@@ -7842,9 +7836,9 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     push 007d5h                               ; 68 d5 07
     push 0066dh                               ; 68 6d 06
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 af c0
+    call 01922h                               ; e8 c1 c0
     add sp, strict byte 0000ah                ; 83 c4 0a
-    jmp near 05cafh                           ; e9 36 04
+    jmp near 05c9dh                           ; e9 36 04
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     xor ah, ah                                ; 30 e4
     mov es, [bp-026h]                         ; 8e 46 da
@@ -7852,30 +7846,30 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     add bx, ax                                ; 01 c3
     mov cl, byte [es:bx+0011fh]               ; 26 8a 8f 1f 01
     cmp cl, 010h                              ; 80 f9 10
-    jc short 0589fh                           ; 72 10
+    jc short 0588dh                           ; 72 10
     push ax                                   ; 50
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 007d5h                               ; 68 d5 07
     push 00698h                               ; 68 98 06
-    jmp short 0586eh                          ; eb cf
+    jmp short 0585ch                          ; eb cf
     mov bx, word [bp+016h]                    ; 8b 5e 16
     shr bx, 008h                              ; c1 eb 08
     sub bx, strict byte 00041h                ; 83 eb 41
     cmp bx, strict byte 0000fh                ; 83 fb 0f
-    jnbe near 05cd1h                          ; 0f 87 22 04
+    jnbe near 05cbfh                          ; 0f 87 22 04
     add bx, bx                                ; 01 db
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
-    jmp word [cs:bx+05800h]                   ; 2e ff a7 00 58
+    jmp word [cs:bx+057eeh]                   ; 2e ff a7 ee 57
     mov word [bp+010h], 0aa55h                ; c7 46 10 55 aa
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 030h                               ; 80 cc 30
     mov word [bp+016h], ax                    ; 89 46 16
     mov word [bp+014h], strict word 00007h    ; c7 46 14 07 00
-    jmp near 05c86h                           ; e9 b3 03
+    jmp near 05c74h                           ; e9 b3 03
     mov bx, word [bp+00ah]                    ; 8b 5e 0a
     mov es, [bp+004h]                         ; 8e 46 04
     mov di, bx                                ; 89 df
@@ -7890,14 +7884,14 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov word [bp-00ah], ax                    ; 89 46 f6
     mov ax, word [es:bx+00eh]                 ; 26 8b 47 0e
     or ax, word [bp-00ah]                     ; 0b 46 f6
-    je short 05914h                           ; 74 11
+    je short 05902h                           ; 74 11
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 007d5h                               ; 68 d5 07
     push 007e8h                               ; 68 e8 07
     push strict byte 00007h                   ; 6a 07
-    jmp short 0595eh                          ; eb 4a
+    jmp short 0594ch                          ; eb 4a
     mov es, [bp-010h]                         ; 8e 46 f0
     mov ax, word [es:di+008h]                 ; 26 8b 45 08
     mov word [bp-00ah], ax                    ; 89 46 f6
@@ -7909,31 +7903,31 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     add bx, dx                                ; 01 d3
     mov ch, byte [es:bx+01eh]                 ; 26 8a 6f 1e
     cmp ax, word [es:bx+034h]                 ; 26 3b 47 34
-    jnbe short 05944h                         ; 77 0b
-    jne short 05967h                          ; 75 2c
+    jnbe short 05932h                         ; 77 0b
+    jne short 05955h                          ; 75 2c
     mov dx, word [bp-00ah]                    ; 8b 56 f6
     cmp dx, word [es:bx+032h]                 ; 26 3b 57 32
-    jc short 05967h                           ; 72 23
+    jc short 05955h                           ; 72 23
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 92 bf
+    call 018e1h                               ; e8 a4 bf
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 007d5h                               ; 68 d5 07
     push 00811h                               ; 68 11 08
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 c1 bf
+    call 01922h                               ; e8 d3 bf
     add sp, strict byte 00008h                ; 83 c4 08
-    jmp near 05cafh                           ; e9 48 03
+    jmp near 05c9dh                           ; e9 48 03
     mov dx, word [bp+016h]                    ; 8b 56 16
     shr dx, 008h                              ; c1 ea 08
     mov word [bp-00ch], dx                    ; 89 56 f4
     cmp dx, strict byte 00044h                ; 83 fa 44
-    je near 05c82h                            ; 0f 84 0b 03
+    je near 05c70h                            ; 0f 84 0b 03
     cmp dx, strict byte 00047h                ; 83 fa 47
-    je near 05c82h                            ; 0f 84 04 03
+    je near 05c70h                            ; 0f 84 04 03
     mov es, [bp-026h]                         ; 8e 46 da
     db  066h, 026h, 0c7h, 044h, 014h, 000h, 000h, 000h, 000h
     ; mov dword [es:si+014h], strict dword 000000000h ; 66 26 c7 44 14 00 00 00 00
@@ -7965,25 +7959,25 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov es, [bp-010h]                         ; 8e 46 f0
     mov word [es:di+002h], ax                 ; 26 89 45 02
     test dl, dl                               ; 84 d2
-    je near 05c82h                            ; 0f 84 97 02
+    je near 05c70h                            ; 0f 84 97 02
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 eb be
+    call 018e1h                               ; e8 fd be
     movzx ax, dl                              ; 0f b6 c2
     push ax                                   ; 50
     push word [bp-00ch]                       ; ff 76 f4
     push 007d5h                               ; 68 d5 07
     push 00739h                               ; 68 39 07
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 1a bf
+    call 01922h                               ; e8 2c bf
     add sp, strict byte 0000ah                ; 83 c4 0a
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 00ch                               ; 80 cc 0c
-    jmp near 05cb7h                           ; e9 a1 02
+    jmp near 05ca5h                           ; e9 a1 02
     or ah, 0b2h                               ; 80 cc b2
-    jmp near 05cb7h                           ; e9 9b 02
+    jmp near 05ca5h                           ; e9 9b 02
     mov bx, word [bp+00ah]                    ; 8b 5e 0a
     mov ax, word [bp+004h]                    ; 8b 46 04
     mov word [bp-006h], ax                    ; 89 46 fa
@@ -7993,8 +7987,8 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov ax, word [es:di]                      ; 26 8b 05
     mov word [bp-00eh], ax                    ; 89 46 f2
     cmp ax, strict word 0001ah                ; 3d 1a 00
-    jc near 05cafh                            ; 0f 82 76 02
-    jc near 05ac0h                            ; 0f 82 83 00
+    jc near 05c9dh                            ; 0f 82 76 02
+    jc near 05aaeh                            ; 0f 82 83 00
     movzx ax, cl                              ; 0f b6 c1
     imul ax, ax, strict byte 00018h           ; 6b c0 18
     mov es, [bp-026h]                         ; 8e 46 da
@@ -8032,7 +8026,7 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     db  066h, 026h, 0c7h, 045h, 014h, 000h, 000h, 000h, 000h
     ; mov dword [es:di+014h], strict dword 000000000h ; 66 26 c7 45 14 00 00 00 00
     cmp word [bp-00eh], strict byte 0001eh    ; 83 7e f2 1e
-    jc near 05bcch                            ; 0f 82 04 01
+    jc near 05bbah                            ; 0f 82 04 01
     mov es, [bp-004h]                         ; 8e 46 fc
     mov word [es:bx], strict word 0001eh      ; 26 c7 07 1e 00
     mov ax, word [bp-014h]                    ; 8b 46 ec
@@ -8058,9 +8052,9 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov ah, byte [es:di+022h]                 ; 26 8a 65 22
     mov al, byte [es:di+023h]                 ; 26 8a 45 23
     test al, al                               ; 84 c0
-    jne short 05b1eh                          ; 75 04
+    jne short 05b0ch                          ; 75 04
     xor dx, dx                                ; 31 d2
-    jmp short 05b21h                          ; eb 03
+    jmp short 05b0fh                          ; eb 03
     mov dx, strict word 00008h                ; ba 08 00
     or dl, 010h                               ; 80 ca 10
     mov word [bp-008h], dx                    ; 89 56 f8
@@ -8075,9 +8069,9 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     movzx dx, ah                              ; 0f b6 d4
     or word [bp-008h], dx                     ; 09 56 f8
     cmp AL, strict byte 003h                  ; 3c 03
-    jne short 05b47h                          ; 75 05
+    jne short 05b35h                          ; 75 05
     mov ax, strict word 00003h                ; b8 03 00
-    jmp short 05b49h                          ; eb 02
+    jmp short 05b37h                          ; eb 02
     xor ax, ax                                ; 31 c0
     or word [bp-008h], ax                     ; 09 46 f8
     mov ax, word [bp-01ah]                    ; 8b 46 e6
@@ -8102,21 +8096,21 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov byte [es:si+001feh], 011h             ; 26 c6 84 fe 01 11
     xor ch, ch                                ; 30 ed
     mov byte [bp-002h], ch                    ; 88 6e fe
-    jmp short 05badh                          ; eb 06
+    jmp short 05b9bh                          ; eb 06
     cmp byte [bp-002h], 00fh                  ; 80 7e fe 0f
-    jnc short 05bc2h                          ; 73 15
+    jnc short 05bb0h                          ; 73 15
     movzx dx, byte [bp-002h]                  ; 0f b6 56 fe
     add dx, 00312h                            ; 81 c2 12 03
     mov ax, word [bp-014h]                    ; 8b 46 ec
-    call 01600h                               ; e8 45 ba
+    call 01600h                               ; e8 57 ba
     add ch, al                                ; 00 c5
     inc byte [bp-002h]                        ; fe 46 fe
-    jmp short 05ba7h                          ; eb e5
+    jmp short 05b95h                          ; eb e5
     neg ch                                    ; f6 dd
     mov es, [bp-026h]                         ; 8e 46 da
     mov byte [es:si+001ffh], ch               ; 26 88 ac ff 01
     cmp word [bp-00eh], strict byte 00042h    ; 83 7e f2 42
-    jc near 05c82h                            ; 0f 82 ae 00
+    jc near 05c70h                            ; 0f 82 ae 00
     movzx ax, cl                              ; 0f b6 c1
     cwd                                       ; 99
     db  02bh, 0c2h
@@ -8134,7 +8128,7 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     ; mov dword [es:bx+01eh], strict dword 00024beddh ; 66 26 c7 47 1e dd be 24 00
     mov word [es:bx+022h], strict word 00000h ; 26 c7 47 22 00 00
     test al, al                               ; 84 c0
-    jne short 05c14h                          ; 75 09
+    jne short 05c02h                          ; 75 09
     db  066h, 026h, 0c7h, 047h, 024h, 049h, 053h, 041h, 020h
     ; mov dword [es:bx+024h], strict dword 020415349h ; 66 26 c7 47 24 49 53 41 20
     mov es, [bp-004h]                         ; 8e 46 fc
@@ -8143,7 +8137,7 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     db  066h, 026h, 0c7h, 047h, 02ch, 020h, 020h, 020h, 020h
     ; mov dword [es:bx+02ch], strict dword 020202020h ; 66 26 c7 47 2c 20 20 20 20
     test al, al                               ; 84 c0
-    jne short 05c40h                          ; 75 13
+    jne short 05c2eh                          ; 75 13
     mov word [es:bx+030h], dx                 ; 26 89 57 30
     db  066h, 026h, 0c7h, 047h, 032h, 000h, 000h, 000h, 000h
     ; mov dword [es:bx+032h], strict dword 000000000h ; 66 26 c7 47 32 00 00 00 00
@@ -8158,17 +8152,17 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     mov word [es:bx+03eh], strict word 00000h ; 26 c7 47 3e 00 00
     xor cl, cl                                ; 30 c9
     mov CH, strict byte 01eh                  ; b5 1e
-    jmp short 05c67h                          ; eb 05
+    jmp short 05c55h                          ; eb 05
     cmp ch, 040h                              ; 80 fd 40
-    jnc short 05c79h                          ; 73 12
+    jnc short 05c67h                          ; 73 12
     movzx dx, ch                              ; 0f b6 d5
     add dx, word [bp+00ah]                    ; 03 56 0a
     mov ax, word [bp+004h]                    ; 8b 46 04
-    call 01600h                               ; e8 8d b9
+    call 01600h                               ; e8 9f b9
     add cl, al                                ; 00 c1
     db  0feh, 0c5h
     ; inc ch                                    ; fe c5
-    jmp short 05c62h                          ; eb e9
+    jmp short 05c50h                          ; eb e9
     neg cl                                    ; f6 d9
     mov es, [bp-004h]                         ; 8e 46 fc
     mov byte [es:bx+041h], cl                 ; 26 88 4f 41
@@ -8176,20 +8170,20 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     xor bx, bx                                ; 31 db
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 7d b9
+    call 0160eh                               ; e8 8f b9
     and byte [bp+01ch], 0feh                  ; 80 66 1c fe
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
     cmp ax, strict word 00006h                ; 3d 06 00
-    je short 05c82h                           ; 74 e4
+    je short 05c70h                           ; 74 e4
     cmp ax, strict word 00001h                ; 3d 01 00
-    jc short 05cafh                           ; 72 0c
-    jbe short 05c82h                          ; 76 dd
+    jc short 05c9dh                           ; 72 0c
+    jbe short 05c70h                          ; 76 dd
     cmp ax, strict word 00003h                ; 3d 03 00
-    jc short 05cafh                           ; 72 05
+    jc short 05c9dh                           ; 72 05
     cmp ax, strict word 00004h                ; 3d 04 00
-    jbe short 05c82h                          ; 76 d3
+    jbe short 05c70h                          ; 76 d3
     mov ax, word [bp+016h]                    ; 8b 46 16
     xor ah, ah                                ; 30 e4
     or ah, 001h                               ; 80 cc 01
@@ -8199,20 +8193,20 @@ _int13_harddisk_ext:                         ; 0xf5820 LB 0x4cc
     xor bh, bh                                ; 30 ff
     mov dx, strict word 00074h                ; ba 74 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 43 b9
+    call 0160eh                               ; e8 55 b9
     or byte [bp+01ch], 001h                   ; 80 4e 1c 01
-    jmp short 05c95h                          ; eb c4
+    jmp short 05c83h                          ; eb c4
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 05 bc
+    call 018e1h                               ; e8 17 bc
     mov ax, word [bp+016h]                    ; 8b 46 16
     shr ax, 008h                              ; c1 e8 08
     push ax                                   ; 50
     push 007d5h                               ; 68 d5 07
     push 007a7h                               ; 68 a7 07
-    jmp near 0595ch                           ; e9 70 fc
-_int14_function:                             ; 0xf5cec LB 0x155
+    jmp near 0594ah                           ; e9 70 fc
+_int14_function:                             ; 0xf5cda LB 0x155
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -8220,29 +8214,29 @@ _int14_function:                             ; 0xf5cec LB 0x155
     mov dx, word [bp+00eh]                    ; 8b 56 0e
     add dx, dx                                ; 01 d2
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 20 b9
+    call 0161ch                               ; e8 32 b9
     mov si, ax                                ; 89 c6
     mov bx, ax                                ; 89 c3
     mov dx, word [bp+00eh]                    ; 8b 56 0e
     add dx, strict byte 0007ch                ; 83 c2 7c
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 f4 b8
+    call 01600h                               ; e8 06 b9
     mov cl, al                                ; 88 c1
     cmp word [bp+00eh], strict byte 00004h    ; 83 7e 0e 04
-    jnc near 05e37h                           ; 0f 83 21 01
+    jnc near 05e25h                           ; 0f 83 21 01
     test si, si                               ; 85 f6
-    jbe near 05e37h                           ; 0f 86 1b 01
+    jbe near 05e25h                           ; 0f 86 1b 01
     mov al, byte [bp+013h]                    ; 8a 46 13
     cmp AL, strict byte 001h                  ; 3c 01
-    jc short 05d34h                           ; 72 11
-    jbe short 05d88h                          ; 76 63
+    jc short 05d22h                           ; 72 11
+    jbe short 05d76h                          ; 76 63
     cmp AL, strict byte 003h                  ; 3c 03
-    je near 05e20h                            ; 0f 84 f5 00
+    je near 05e0eh                            ; 0f 84 f5 00
     cmp AL, strict byte 002h                  ; 3c 02
-    je near 05dd6h                            ; 0f 84 a5 00
-    jmp near 05e31h                           ; e9 fd 00
+    je near 05dc4h                            ; 0f 84 a5 00
+    jmp near 05e1fh                           ; e9 fd 00
     test al, al                               ; 84 c0
-    jne near 05e31h                           ; 0f 85 f7 00
+    jne near 05e1fh                           ; 0f 85 f7 00
     lea dx, [bx+003h]                         ; 8d 57 03
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -8274,17 +8268,17 @@ _int14_function:                             ; 0xf5cec LB 0x155
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     mov byte [bp+012h], al                    ; 88 46 12
-    jmp near 05e12h                           ; e9 97 00
+    jmp near 05e00h                           ; e9 97 00
     mov AL, strict byte 017h                  ; b0 17
     mov dx, bx                                ; 89 da
     out DX, AL                                ; ee
     lea dx, [bx+001h]                         ; 8d 57 01
     mov AL, strict byte 004h                  ; b0 04
     out DX, AL                                ; ee
-    jmp short 05d5dh                          ; eb d5
+    jmp short 05d4bh                          ; eb d5
     mov dx, strict word 0006ch                ; ba 6c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 8b b8
+    call 0161ch                               ; e8 9d b8
     mov si, ax                                ; 89 c6
     lea dx, [bx+005h]                         ; 8d 57 05
     in AL, DX                                 ; ec
@@ -8292,20 +8286,20 @@ _int14_function:                             ; 0xf5cec LB 0x155
     ; sub ah, ah                                ; 2a e4
     and ax, strict word 00060h                ; 25 60 00
     cmp ax, strict word 00060h                ; 3d 60 00
-    je short 05db8h                           ; 74 17
+    je short 05da6h                           ; 74 17
     test cl, cl                               ; 84 c9
-    je short 05db8h                           ; 74 13
+    je short 05da6h                           ; 74 13
     mov dx, strict word 0006ch                ; ba 6c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 6e b8
+    call 0161ch                               ; e8 80 b8
     cmp ax, si                                ; 39 f0
-    je short 05d93h                           ; 74 e1
+    je short 05d81h                           ; 74 e1
     mov si, ax                                ; 89 c6
     db  0feh, 0c9h
     ; dec cl                                    ; fe c9
-    jmp short 05d93h                          ; eb db
+    jmp short 05d81h                          ; eb db
     test cl, cl                               ; 84 c9
-    je short 05dc2h                           ; 74 06
+    je short 05db0h                           ; 74 06
     mov al, byte [bp+012h]                    ; 8a 46 12
     mov dx, bx                                ; 89 da
     out DX, AL                                ; ee
@@ -8315,33 +8309,33 @@ _int14_function:                             ; 0xf5cec LB 0x155
     ; sub ah, ah                                ; 2a e4
     mov byte [bp+013h], al                    ; 88 46 13
     test cl, cl                               ; 84 c9
-    jne short 05e12h                          ; 75 43
+    jne short 05e00h                          ; 75 43
     or AL, strict byte 080h                   ; 0c 80
     mov byte [bp+013h], al                    ; 88 46 13
-    jmp short 05e12h                          ; eb 3c
+    jmp short 05e00h                          ; eb 3c
     mov dx, strict word 0006ch                ; ba 6c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 3d b8
+    call 0161ch                               ; e8 4f b8
     mov si, ax                                ; 89 c6
     lea dx, [bx+005h]                         ; 8d 57 05
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 05e02h                          ; 75 17
+    jne short 05df0h                          ; 75 17
     test cl, cl                               ; 84 c9
-    je short 05e02h                           ; 74 13
+    je short 05df0h                           ; 74 13
     mov dx, strict word 0006ch                ; ba 6c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 24 b8
+    call 0161ch                               ; e8 36 b8
     cmp ax, si                                ; 39 f0
-    je short 05de1h                           ; 74 e5
+    je short 05dcfh                           ; 74 e5
     mov si, ax                                ; 89 c6
     db  0feh, 0c9h
     ; dec cl                                    ; fe c9
-    jmp short 05de1h                          ; eb df
+    jmp short 05dcfh                          ; eb df
     test cl, cl                               ; 84 c9
-    je short 05e18h                           ; 74 12
+    je short 05e06h                           ; 74 12
     mov byte [bp+013h], 000h                  ; c6 46 13 00
     mov dx, bx                                ; 89 da
     in AL, DX                                 ; ec
@@ -8349,12 +8343,12 @@ _int14_function:                             ; 0xf5cec LB 0x155
     ; sub ah, ah                                ; 2a e4
     mov byte [bp+012h], al                    ; 88 46 12
     and byte [bp+01ch], 0feh                  ; 80 66 1c fe
-    jmp short 05e3bh                          ; eb 23
+    jmp short 05e29h                          ; eb 23
     lea dx, [bx+005h]                         ; 8d 57 05
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
-    jmp short 05dd1h                          ; eb b1
+    jmp short 05dbfh                          ; eb b1
     lea dx, [si+005h]                         ; 8d 54 05
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -8364,15 +8358,15 @@ _int14_function:                             ; 0xf5cec LB 0x155
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
-    jmp short 05e0fh                          ; eb de
+    jmp short 05dfdh                          ; eb de
     or byte [bp+01ch], 001h                   ; 80 4e 1c 01
-    jmp short 05e3bh                          ; eb 04
+    jmp short 05e29h                          ; eb 04
     or byte [bp+01ch], 001h                   ; 80 4e 1c 01
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-set_enable_a20_:                             ; 0xf5e41 LB 0x2c
+set_enable_a20_:                             ; 0xf5e2f LB 0x2c
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -8385,10 +8379,10 @@ set_enable_a20_:                             ; 0xf5e41 LB 0x2c
     ; sub ah, ah                                ; 2a e4
     mov cl, al                                ; 88 c1
     test bx, bx                               ; 85 db
-    je short 05e5ah                           ; 74 05
+    je short 05e48h                           ; 74 05
     or AL, strict byte 002h                   ; 0c 02
     out DX, AL                                ; ee
-    jmp short 05e5dh                          ; eb 03
+    jmp short 05e4bh                          ; eb 03
     and AL, strict byte 0fdh                  ; 24 fd
     out DX, AL                                ; ee
     test cl, 002h                             ; f6 c1 02
@@ -8401,7 +8395,7 @@ set_enable_a20_:                             ; 0xf5e41 LB 0x2c
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-set_e820_range_:                             ; 0xf5e6d LB 0x8c
+set_e820_range_:                             ; 0xf5e5b LB 0x8c
     push si                                   ; 56
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
@@ -8430,10 +8424,10 @@ set_e820_range_:                             ; 0xf5e6d LB 0x8c
     pop si                                    ; 5e
     retn 0000ah                               ; c2 0a 00
     db  0ech, 0e9h, 0d8h, 0c1h, 0c0h, 0bfh, 091h, 090h, 089h, 088h, 087h, 083h, 052h, 04fh, 041h, 024h
-    db  000h, 098h, 063h, 038h, 05fh, 04bh, 05fh, 0e0h, 05fh, 0e6h, 05fh, 0ebh, 05fh, 0f0h, 05fh, 092h
-    db  060h, 02fh, 062h, 055h, 062h, 0d9h, 05fh, 0d9h, 05fh, 022h, 063h, 04ah, 063h, 05dh, 063h, 06ch
-    db  063h, 0e0h, 05fh, 073h, 063h
-_int15_function:                             ; 0xf5ef9 LB 0x4cd
+    db  000h, 086h, 063h, 026h, 05fh, 039h, 05fh, 0ceh, 05fh, 0d4h, 05fh, 0d9h, 05fh, 0deh, 05fh, 080h
+    db  060h, 01dh, 062h, 043h, 062h, 0c7h, 05fh, 0c7h, 05fh, 010h, 063h, 038h, 063h, 04bh, 063h, 05ah
+    db  063h, 0ceh, 05fh, 061h, 063h
+_int15_function:                             ; 0xf5ee7 LB 0x4cd
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -8443,15 +8437,15 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     mov ax, word [bp+012h]                    ; 8b 46 12
     shr ax, 008h                              ; c1 e8 08
     cmp ax, 000ech                            ; 3d ec 00
-    jnbe near 06398h                          ; 0f 87 8b 04
+    jnbe near 06386h                          ; 0f 87 8b 04
     push CS                                   ; 0e
     pop ES                                    ; 07
     mov cx, strict word 00012h                ; b9 12 00
-    mov di, 05ec4h                            ; bf c4 5e
+    mov di, 05eb2h                            ; bf b2 5e
     repne scasb                               ; f2 ae
     sal cx, 1                                 ; d1 e1
     mov di, cx                                ; 89 cf
-    mov si, word [cs:di+05ed5h]               ; 2e 8b b5 d5 5e
+    mov si, word [cs:di+05ec3h]               ; 2e 8b b5 c3 5e
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     mov cx, word [bp+018h]                    ; 8b 4e 18
@@ -8464,30 +8458,30 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     cmp ax, 000c0h                            ; 3d c0 00
-    jne near 06398h                           ; 0f 85 54 04
+    jne near 06386h                           ; 0f 85 54 04
     or byte [bp+018h], 001h                   ; 80 4e 18 01
-    jmp near 06341h                           ; e9 f6 03
+    jmp near 0632fh                           ; e9 f6 03
     mov dx, ax                                ; 89 c2
     cmp ax, strict word 00001h                ; 3d 01 00
-    jc short 05f60h                           ; 72 0e
-    jbe short 05f74h                          ; 76 20
+    jc short 05f4eh                           ; 72 0e
+    jbe short 05f62h                          ; 76 20
     cmp ax, strict word 00003h                ; 3d 03 00
-    je short 05fa1h                           ; 74 48
+    je short 05f8fh                           ; 74 48
     cmp ax, strict word 00002h                ; 3d 02 00
-    je short 05f84h                           ; 74 26
-    jmp short 05faeh                          ; eb 4e
+    je short 05f72h                           ; 74 26
+    jmp short 05f9ch                          ; eb 4e
     test ax, ax                               ; 85 c0
-    jne short 05faeh                          ; 75 4a
+    jne short 05f9ch                          ; 75 4a
     xor ax, ax                                ; 31 c0
-    call 05e41h                               ; e8 d8 fe
+    call 05e2fh                               ; e8 d8 fe
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov byte [bp+013h], 000h                  ; c6 46 13 00
-    jmp near 05fd9h                           ; e9 65 00
+    jmp near 05fc7h                           ; e9 65 00
     mov ax, strict word 00001h                ; b8 01 00
-    call 05e41h                               ; e8 c7 fe
+    call 05e2fh                               ; e8 c7 fe
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov byte [bp+013h], dh                    ; 88 76 13
-    jmp near 05fd9h                           ; e9 55 00
+    jmp near 05fc7h                           ; e9 55 00
     mov dx, 00092h                            ; ba 92 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -8499,21 +8493,21 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     mov word [bp+012h], dx                    ; 89 56 12
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov byte [bp+013h], ah                    ; 88 66 13
-    jmp near 05fd9h                           ; e9 38 00
+    jmp near 05fc7h                           ; e9 38 00
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov byte [bp+013h], ah                    ; 88 66 13
     mov word [bp+00ch], ax                    ; 89 46 0c
-    jmp near 05fd9h                           ; e9 2b 00
+    jmp near 05fc7h                           ; e9 2b 00
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 28 b9
+    call 018e1h                               ; e8 3a b9
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     push ax                                   ; 50
     push 00836h                               ; 68 36 08
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 5b b9
+    call 01922h                               ; e8 6d b9
     add sp, strict byte 00006h                ; 83 c4 06
     or byte [bp+018h], 001h                   ; 80 4e 18 01
     mov ax, word [bp+012h]                    ; 8b 46 12
@@ -8526,38 +8520,38 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     pop bp                                    ; 5d
     retn                                      ; c3
     mov word [bp+018h], bx                    ; 89 5e 18
-    jmp near 0608ch                           ; e9 a6 00
+    jmp near 0607ah                           ; e9 a6 00
     mov word [bp+018h], bx                    ; 89 5e 18
-    jmp short 05fd9h                          ; eb ee
+    jmp short 05fc7h                          ; eb ee
     mov word [bp+018h], cx                    ; 89 4e 18
-    jmp short 05fd6h                          ; eb e6
+    jmp short 05fc4h                          ; eb e6
     test byte [bp+012h], 0ffh                 ; f6 46 12 ff
-    je short 06062h                           ; 74 6c
+    je short 06050h                           ; 74 6c
     mov dx, 000a0h                            ; ba a0 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 01 b6
+    call 01600h                               ; e8 13 b6
     test AL, strict byte 001h                 ; a8 01
-    jne near 06338h                           ; 0f 85 33 03
+    jne near 06326h                           ; 0f 85 33 03
     mov bx, strict word 00001h                ; bb 01 00
     mov dx, 000a0h                            ; ba a0 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 fd b5
+    call 0160eh                               ; e8 0f b6
     mov bx, word [bp+014h]                    ; 8b 5e 14
     mov dx, 00098h                            ; ba 98 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 0d b6
+    call 0162ah                               ; e8 1f b6
     mov bx, word [bp+00ch]                    ; 8b 5e 0c
     mov dx, 0009ah                            ; ba 9a 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 01 b6
+    call 0162ah                               ; e8 13 b6
     mov bx, word [bp+00eh]                    ; 8b 5e 0e
     mov dx, 0009ch                            ; ba 9c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 f5 b5
+    call 0162ah                               ; e8 07 b6
     mov bx, word [bp+010h]                    ; 8b 5e 10
     mov dx, 0009eh                            ; ba 9e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0162ah                               ; e8 e9 b5
+    call 0162ah                               ; e8 fb b5
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov dx, 000a1h                            ; ba a1 00
     in AL, DX                                 ; ec
@@ -8566,23 +8560,23 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     and AL, strict byte 0feh                  ; 24 fe
     out DX, AL                                ; ee
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 08 b6
+    call 0165ch                               ; e8 1a b6
     or AL, strict byte 040h                   ; 0c 40
     movzx dx, al                              ; 0f b6 d0
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 01679h                               ; e8 1a b6
-    jmp near 05fd9h                           ; e9 77 ff
+    call 01679h                               ; e8 2c b6
+    jmp near 05fc7h                           ; e9 77 ff
     cmp ax, strict word 00001h                ; 3d 01 00
-    jne short 06080h                          ; 75 19
+    jne short 0606eh                          ; 75 19
     xor bx, bx                                ; 31 db
     mov dx, 000a0h                            ; ba a0 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 9c b5
+    call 0160eh                               ; e8 ae b5
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 e0 b5
+    call 0165ch                               ; e8 f2 b5
     and AL, strict byte 0bfh                  ; 24 bf
-    jmp short 06056h                          ; eb d6
+    jmp short 06044h                          ; eb d6
     mov word [bp+018h], bx                    ; 89 5e 18
     mov ax, dx                                ; 89 d0
     xor ah, dh                                ; 30 f4
@@ -8590,10 +8584,10 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     dec ax                                    ; 48
     or dx, ax                                 ; 09 c2
     mov word [bp+012h], dx                    ; 89 56 12
-    jmp near 05fd9h                           ; e9 47 ff
+    jmp near 05fc7h                           ; e9 47 ff
     cli                                       ; fa
     mov ax, strict word 00001h                ; b8 01 00
-    call 05e41h                               ; e8 a8 fd
+    call 05e2fh                               ; e8 a8 fd
     mov di, ax                                ; 89 c7
     mov ax, word [bp+014h]                    ; 8b 46 14
     sal ax, 004h                              ; c1 e0 04
@@ -8603,7 +8597,7 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     shr dx, 00ch                              ; c1 ea 0c
     mov byte [bp-006h], dl                    ; 88 56 fa
     cmp cx, ax                                ; 39 c1
-    jnc short 060b8h                          ; 73 05
+    jnc short 060a6h                          ; 73 05
     db  0feh, 0c2h
     ; inc dl                                    ; fe c2
     mov byte [bp-006h], dl                    ; 88 56 fa
@@ -8611,52 +8605,52 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     add dx, strict byte 00008h                ; 83 c2 08
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0002fh                ; bb 2f 00
-    call 0162ah                               ; e8 63 b5
+    call 0162ah                               ; e8 75 b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0000ah                ; 83 c2 0a
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, cx                                ; 89 cb
-    call 0162ah                               ; e8 55 b5
+    call 0162ah                               ; e8 67 b5
     movzx bx, byte [bp-006h]                  ; 0f b6 5e fa
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0000ch                ; 83 c2 0c
     mov ax, word [bp+014h]                    ; 8b 46 14
-    call 0160eh                               ; e8 29 b5
+    call 0160eh                               ; e8 3b b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0000dh                ; 83 c2 0d
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, 00093h                            ; bb 93 00
-    call 0160eh                               ; e8 1a b5
+    call 0160eh                               ; e8 2c b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0000eh                ; 83 c2 0e
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 28 b5
+    call 0162ah                               ; e8 3a b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00020h                ; 83 c2 20
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0ffffh                ; bb ff ff
-    call 0162ah                               ; e8 19 b5
+    call 0162ah                               ; e8 2b b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00022h                ; 83 c2 22
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 0b b5
+    call 0162ah                               ; e8 1d b5
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00024h                ; 83 c2 24
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0000fh                ; bb 0f 00
-    call 0160eh                               ; e8 e0 b4
+    call 0160eh                               ; e8 f2 b4
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00025h                ; 83 c2 25
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, 0009bh                            ; bb 9b 00
-    call 0160eh                               ; e8 d1 b4
+    call 0160eh                               ; e8 e3 b4
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00026h                ; 83 c2 26
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 df b4
+    call 0162ah                               ; e8 f1 b4
     mov ax, ss                                ; 8c d0
     mov cx, ax                                ; 89 c1
     sal cx, 004h                              ; c1 e1 04
@@ -8666,27 +8660,27 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     add dx, strict byte 00028h                ; 83 c2 28
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0ffffh                ; bb ff ff
-    call 0162ah                               ; e8 c3 b4
+    call 0162ah                               ; e8 d5 b4
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0002ah                ; 83 c2 2a
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, cx                                ; 89 cb
-    call 0162ah                               ; e8 b5 b4
+    call 0162ah                               ; e8 c7 b4
     movzx bx, byte [bp-008h]                  ; 0f b6 5e f8
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0002ch                ; 83 c2 2c
     mov ax, word [bp+014h]                    ; 8b 46 14
-    call 0160eh                               ; e8 89 b4
+    call 0160eh                               ; e8 9b b4
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0002dh                ; 83 c2 2d
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, 00093h                            ; bb 93 00
-    call 0160eh                               ; e8 7a b4
+    call 0160eh                               ; e8 8c b4
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0002eh                ; 83 c2 2e
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 88 b4
+    call 0162ah                               ; e8 9a b4
     mov si, word [bp+006h]                    ; 8b 76 06
     mov es, [bp+014h]                         ; 8e 46 14
     mov cx, word [bp+010h]                    ; 8b 4e 10
@@ -8697,7 +8691,7 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     mov ds, ax                                ; 8e d8
     mov word [00467h], sp                     ; 89 26 67 04
     mov [00469h], ss                          ; 8c 16 69 04
-    call 061beh                               ; e8 00 00
+    call 061ach                               ; e8 00 00
     pop di                                    ; 5f
     add di, strict byte 0001bh                ; 83 c7 1b
     push strict byte 00020h                   ; 6a 20
@@ -8720,7 +8714,7 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     ; xor di, di                                ; 33 ff
     cld                                       ; fc
     rep movsw                                 ; f3 a5
-    call 061f2h                               ; e8 00 00
+    call 061e0h                               ; e8 00 00
     pop ax                                    ; 58
     push 0f000h                               ; 68 00 f0
     add ax, strict byte 00018h                ; 83 c0 18
@@ -8741,53 +8735,53 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     pop eax                                   ; 66 58
     pop DS                                    ; 1f
     mov ax, di                                ; 89 f8
-    call 05e41h                               ; e8 1e fc
+    call 05e2fh                               ; e8 1e fc
     sti                                       ; fb
     mov byte [bp+013h], 000h                  ; c6 46 13 00
     and byte [bp+018h], 0feh                  ; 80 66 18 fe
-    jmp near 05fd9h                           ; e9 aa fd
+    jmp near 05fc7h                           ; e9 aa fd
     mov ax, strict word 00031h                ; b8 31 00
-    call 0165ch                               ; e8 27 b4
+    call 0165ch                               ; e8 39 b4
     xor ah, ah                                ; 30 e4
     mov dx, ax                                ; 89 c2
     sal dx, 008h                              ; c1 e2 08
     mov ax, strict word 00030h                ; b8 30 00
-    call 0165ch                               ; e8 1a b4
+    call 0165ch                               ; e8 2c b4
     xor ah, ah                                ; 30 e4
     or dx, ax                                 ; 09 c2
     mov word [bp+012h], dx                    ; 89 56 12
     cmp dx, strict byte 0ffc0h                ; 83 fa c0
-    jbe short 06228h                          ; 76 da
+    jbe short 06216h                          ; 76 da
     mov word [bp+012h], strict word 0ffc0h    ; c7 46 12 c0 ff
-    jmp short 06228h                          ; eb d3
+    jmp short 06216h                          ; eb d3
     cli                                       ; fa
     mov ax, strict word 00001h                ; b8 01 00
-    call 05e41h                               ; e8 e5 fb
+    call 05e2fh                               ; e8 e5 fb
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 00038h                ; 83 c2 38
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0ffffh                ; bb ff ff
-    call 0162ah                               ; e8 bf b3
+    call 0162ah                               ; e8 d1 b3
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0003ah                ; 83 c2 3a
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 b1 b3
+    call 0162ah                               ; e8 c3 b3
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0003ch                ; 83 c2 3c
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, strict word 0000fh                ; bb 0f 00
-    call 0160eh                               ; e8 86 b3
+    call 0160eh                               ; e8 98 b3
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0003dh                ; 83 c2 3d
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov bx, 0009bh                            ; bb 9b 00
-    call 0160eh                               ; e8 77 b3
+    call 0160eh                               ; e8 89 b3
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, strict byte 0003eh                ; 83 c2 3e
     mov ax, word [bp+014h]                    ; 8b 46 14
     xor bx, bx                                ; 31 db
-    call 0162ah                               ; e8 85 b3
+    call 0162ah                               ; e8 97 b3
     mov AL, strict byte 011h                  ; b0 11
     mov dx, strict word 00020h                ; ba 20 00
     out DX, AL                                ; ee
@@ -8817,7 +8811,7 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     mov dx, 000a1h                            ; ba a1 00
     out DX, AL                                ; ee
     mov si, word [bp+006h]                    ; 8b 76 06
-    call 062e6h                               ; e8 00 00
+    call 062d4h                               ; e8 00 00
     pop di                                    ; 5f
     add di, strict byte 00018h                ; 83 c7 18
     push strict byte 00038h                   ; 6a 38
@@ -8845,70 +8839,68 @@ _int15_function:                             ; 0xf5ef9 LB 0x4cd
     push ax                                   ; 50
     push cx                                   ; 51
     retf                                      ; cb
-    jmp near 05fd9h                           ; e9 b7 fc
+    jmp near 05fc7h                           ; e9 b7 fc
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 b4 b5
+    call 018e1h                               ; e8 c6 b5
     push 00876h                               ; 68 76 08
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 ed b5
+    call 01922h                               ; e8 ff b5
     add sp, strict byte 00004h                ; 83 c4 04
     or byte [bp+018h], 001h                   ; 80 4e 18 01
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     or ah, 086h                               ; 80 cc 86
     mov word [bp+012h], ax                    ; 89 46 12
-    jmp near 05fd9h                           ; e9 8f fc
+    jmp near 05fc7h                           ; e9 8f fc
     mov word [bp+018h], cx                    ; 89 4e 18
     mov word [bp+012h], ax                    ; 89 46 12
     mov word [bp+00ch], 0e6f5h                ; c7 46 0c f5 e6
     mov word [bp+014h], 0f000h                ; c7 46 14 00 f0
-    jmp near 05fd9h                           ; e9 7c fc
+    jmp near 05fc7h                           ; e9 7c fc
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 b6 b2
+    call 0161ch                               ; e8 c8 b2
     mov word [bp+014h], ax                    ; 89 46 14
-    jmp near 06228h                           ; e9 bc fe
+    jmp near 06216h                           ; e9 bc fe
     push 008a5h                               ; 68 a5 08
     push strict byte 00008h                   ; 6a 08
-    jmp short 06332h                          ; eb bf
+    jmp short 06320h                          ; eb bf
     test byte [bp+012h], 0ffh                 ; f6 46 12 ff
-    jne short 06398h                          ; 75 1f
+    jne short 06386h                          ; 75 1f
     mov word [bp+012h], ax                    ; 89 46 12
     mov ax, word [bp+00ch]                    ; 8b 46 0c
     xor ah, ah                                ; 30 e4
     cmp ax, strict word 00001h                ; 3d 01 00
-    jc short 06391h                           ; 72 0b
+    jc short 0637fh                           ; 72 0b
     cmp ax, strict word 00003h                ; 3d 03 00
-    jnbe short 06391h                         ; 77 06
+    jnbe short 0637fh                         ; 77 06
     mov word [bp+018h], cx                    ; 89 4e 18
-    jmp near 05fd9h                           ; e9 48 fc
+    jmp near 05fc7h                           ; e9 48 fc
     or byte [bp+018h], 001h                   ; 80 4e 18 01
-    jmp near 05fd9h                           ; e9 41 fc
+    jmp near 05fc7h                           ; e9 41 fc
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 3e b5
+    call 018e1h                               ; e8 50 b5
     push word [bp+00ch]                       ; ff 76 0c
     push word [bp+012h]                       ; ff 76 12
     push 008bch                               ; 68 bc 08
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 71 b5
+    call 01922h                               ; e8 83 b5
     add sp, strict byte 00008h                ; 83 c4 08
-    jmp short 06338h                          ; eb 82
-    outsw                                     ; 6f
-    db  065h, 091h
-    ; gs xchg cx, ax                            ; 65 91
-    db  065h, 0b4h, 065h
-    ; gs mov AH, strict byte 065h               ; 65 b4 65
-    db  0d6h
-    mul byte [gs:di+017h]                     ; 65 f6 65 17
-    push esi                                  ; 66 56
-    db  066h
-    db  082h
-    db  066h
-_int15_function32:                           ; 0xf63c6 LB 0x37e
+    jmp short 06326h                          ; eb 82
+    pop bp                                    ; 5d
+    db  065h, 07fh, 065h
+    ; gs jnle short 0640dh                      ; 65 7f 65
+    mov byte [0c465h], AL                     ; a2 65 c4
+    db  065h, 0e4h, 065h
+    ; gs in AL, strict byte 065h                ; 65 e4 65
+    add ax, 04466h                            ; 05 66 44
+    db  066h, 070h, 066h
+    ; jo short 0641ah                           ; 66 70 66
+_int15_function32:                           ; 0xf63b4 LB 0x37e
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -8920,11 +8912,11 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
     cmp dx, 000e8h                            ; 81 fa e8 00
-    je near 06493h                            ; 0f 84 ad 00
+    je near 06481h                            ; 0f 84 ad 00
     cmp dx, 000d0h                            ; 81 fa d0 00
-    je short 0642eh                           ; 74 42
+    je short 0641ch                           ; 74 42
     cmp dx, 00086h                            ; 81 fa 86 00
-    jne near 06714h                           ; 0f 85 20 03
+    jne near 06702h                           ; 0f 85 20 03
     sti                                       ; fb
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov dx, word [bp+018h]                    ; 8b 56 18
@@ -8943,33 +8935,33 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     ; mov ah, al                                ; 8a e0
     db  066h, 00bh, 0c9h
     ; or ecx, ecx                               ; 66 0b c9
-    je near 0642bh                            ; 0f 84 0e 00
+    je near 06419h                            ; 0f 84 0e 00
     in AL, strict byte 061h                   ; e4 61
     and AL, strict byte 010h                  ; 24 10
     db  03ah, 0c4h
     ; cmp al, ah                                ; 3a c4
-    je short 0641dh                           ; 74 f8
+    je short 0640bh                           ; 74 f8
     db  08ah, 0e0h
     ; mov ah, al                                ; 8a e0
     dec ecx                                   ; 66 49
-    jne short 0641dh                          ; 75 f2
-    jmp near 0673eh                           ; e9 10 03
+    jne short 0640bh                          ; 75 f2
+    jmp near 0672ch                           ; e9 10 03
     cmp ax, strict word 0004fh                ; 3d 4f 00
-    jne near 06714h                           ; 0f 85 df 02
+    jne near 06702h                           ; 0f 85 df 02
     cmp word [bp+016h], 05052h                ; 81 7e 16 52 50
-    jne near 06714h                           ; 0f 85 d6 02
+    jne near 06702h                           ; 0f 85 d6 02
     cmp word [bp+014h], 04f43h                ; 81 7e 14 43 4f
-    jne near 06714h                           ; 0f 85 cd 02
+    jne near 06702h                           ; 0f 85 cd 02
     cmp word [bp+01eh], 04d4fh                ; 81 7e 1e 4f 4d
-    jne near 06714h                           ; 0f 85 c4 02
+    jne near 06702h                           ; 0f 85 c4 02
     cmp word [bp+01ch], 04445h                ; 81 7e 1c 45 44
-    jne near 06714h                           ; 0f 85 bb 02
+    jne near 06702h                           ; 0f 85 bb 02
     mov ax, word [bp+00ah]                    ; 8b 46 0a
     or ax, word [bp+008h]                     ; 0b 46 08
-    jne near 06714h                           ; 0f 85 b1 02
+    jne near 06702h                           ; 0f 85 b1 02
     mov ax, word [bp+006h]                    ; 8b 46 06
     or ax, word [bp+004h]                     ; 0b 46 04
-    jne near 06714h                           ; 0f 85 a7 02
+    jne near 06702h                           ; 0f 85 a7 02
     mov word [bp+028h], bx                    ; 89 5e 28
     mov ax, word [bp+014h]                    ; 8b 46 14
     mov word [bp+008h], ax                    ; 89 46 08
@@ -8980,26 +8972,26 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+01eh]                    ; 8b 46 1e
     mov word [bp+006h], ax                    ; 89 46 06
     mov dword [bp+020h], strict dword 049413332h ; 66 c7 46 20 32 33 41 49
-    jmp near 0673eh                           ; e9 ab 02
+    jmp near 0672ch                           ; e9 ab 02
     cmp ax, strict word 00020h                ; 3d 20 00
-    je short 064a2h                           ; 74 0a
+    je short 06490h                           ; 74 0a
     cmp ax, strict word 00001h                ; 3d 01 00
-    je near 066c9h                            ; 0f 84 2a 02
-    jmp near 06714h                           ; e9 72 02
+    je near 066b7h                            ; 0f 84 2a 02
+    jmp near 06702h                           ; e9 72 02
     cmp word [bp+01ah], 0534dh                ; 81 7e 1a 4d 53
-    jne near 06714h                           ; 0f 85 69 02
+    jne near 06702h                           ; 0f 85 69 02
     cmp word [bp+018h], 04150h                ; 81 7e 18 50 41
-    jne near 06714h                           ; 0f 85 60 02
+    jne near 06702h                           ; 0f 85 60 02
     mov ax, strict word 00035h                ; b8 35 00
-    call 0165ch                               ; e8 a2 b1
+    call 0165ch                               ; e8 b4 b1
     movzx bx, al                              ; 0f b6 d8
     xor dx, dx                                ; 31 d2
     mov cx, strict word 00008h                ; b9 08 00
     sal bx, 1                                 ; d1 e3
     rcl dx, 1                                 ; d1 d2
-    loop 064c2h                               ; e2 fa
+    loop 064b0h                               ; e2 fa
     mov ax, strict word 00034h                ; b8 34 00
-    call 0165ch                               ; e8 8e b1
+    call 0165ch                               ; e8 a0 b1
     xor ah, ah                                ; 30 e4
     mov dx, bx                                ; 89 da
     or dx, ax                                 ; 09 c2
@@ -9007,30 +8999,30 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     add bx, bx                                ; 01 db
     adc dx, 00100h                            ; 81 d2 00 01
     cmp dx, 00100h                            ; 81 fa 00 01
-    jc short 064e8h                           ; 72 06
-    jne short 06515h                          ; 75 31
+    jc short 064d6h                           ; 72 06
+    jne short 06503h                          ; 75 31
     test bx, bx                               ; 85 db
-    jnbe short 06515h                         ; 77 2d
+    jnbe short 06503h                         ; 77 2d
     mov ax, strict word 00031h                ; b8 31 00
-    call 0165ch                               ; e8 6e b1
+    call 0165ch                               ; e8 80 b1
     movzx bx, al                              ; 0f b6 d8
     xor dx, dx                                ; 31 d2
     mov cx, strict word 00008h                ; b9 08 00
     sal bx, 1                                 ; d1 e3
     rcl dx, 1                                 ; d1 d2
-    loop 064f6h                               ; e2 fa
+    loop 064e4h                               ; e2 fa
     mov ax, strict word 00030h                ; b8 30 00
-    call 0165ch                               ; e8 5a b1
+    call 0165ch                               ; e8 6c b1
     xor ah, ah                                ; 30 e4
     or bx, ax                                 ; 09 c3
     mov cx, strict word 0000ah                ; b9 0a 00
     sal bx, 1                                 ; d1 e3
     rcl dx, 1                                 ; d1 d2
-    loop 06509h                               ; e2 fa
+    loop 064f7h                               ; e2 fa
     add bx, strict byte 00000h                ; 83 c3 00
     adc dx, strict byte 00010h                ; 83 d2 10
     mov ax, strict word 00062h                ; b8 62 00
-    call 0165ch                               ; e8 41 b1
+    call 0165ch                               ; e8 53 b1
     xor ah, ah                                ; 30 e4
     mov word [bp-00ah], ax                    ; 89 46 f6
     xor al, al                                ; 30 c0
@@ -9038,28 +9030,28 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov cx, strict word 00008h                ; b9 08 00
     sal word [bp-00ah], 1                     ; d1 66 f6
     rcl word [bp-008h], 1                     ; d1 56 f8
-    loop 06528h                               ; e2 f8
+    loop 06516h                               ; e2 f8
     mov ax, strict word 00061h                ; b8 61 00
-    call 0165ch                               ; e8 26 b1
+    call 0165ch                               ; e8 38 b1
     xor ah, ah                                ; 30 e4
     or word [bp-00ah], ax                     ; 09 46 f6
     mov ax, word [bp-00ah]                    ; 8b 46 f6
     mov word [bp-008h], ax                    ; 89 46 f8
     mov word [bp-00ah], strict word 00000h    ; c7 46 f6 00 00
     mov ax, strict word 00063h                ; b8 63 00
-    call 0165ch                               ; e8 10 b1
+    call 0165ch                               ; e8 22 b1
     mov byte [bp-004h], al                    ; 88 46 fc
     mov byte [bp-006h], al                    ; 88 46 fa
     mov ax, word [bp+014h]                    ; 8b 46 14
     cmp ax, strict word 00007h                ; 3d 07 00
-    jnbe near 06714h                          ; 0f 87 b8 01
+    jnbe near 06702h                          ; 0f 87 b8 01
     mov si, ax                                ; 89 c6
     add si, ax                                ; 01 c6
     mov cx, bx                                ; 89 d9
     add cx, strict byte 00000h                ; 83 c1 00
     mov ax, dx                                ; 89 d0
     adc ax, strict word 0ffffh                ; 15 ff ff
-    jmp word [cs:si+063b6h]                   ; 2e ff a4 b6 63
+    jmp word [cs:si+063a4h]                   ; 2e ff a4 a4 63
     push strict byte 00001h                   ; 6a 01
     push dword 000000000h                     ; 66 6a 00
     push strict byte 00009h                   ; 6a 09
@@ -9068,9 +9060,9 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     xor cx, cx                                ; 31 c9
-    call 05e6dh                               ; e8 e7 f8
+    call 05e5bh                               ; e8 e7 f8
     mov dword [bp+014h], strict dword 000000001h ; 66 c7 46 14 01 00 00 00
-    jmp near 066b3h                           ; e9 22 01
+    jmp near 066a1h                           ; e9 22 01
     push strict byte 00002h                   ; 6a 02
     push dword 000000000h                     ; 66 6a 00
     push strict byte 0000ah                   ; 6a 0a
@@ -9079,9 +9071,9 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     mov bx, 0fc00h                            ; bb 00 fc
     mov cx, strict word 00009h                ; b9 09 00
-    call 05e6dh                               ; e8 c4 f8
+    call 05e5bh                               ; e8 c4 f8
     mov dword [bp+014h], strict dword 000000002h ; 66 c7 46 14 02 00 00 00
-    jmp near 066b3h                           ; e9 ff 00
+    jmp near 066a1h                           ; e9 ff 00
     push strict byte 00002h                   ; 6a 02
     push dword 000000000h                     ; 66 6a 00
     push strict byte 00010h                   ; 6a 10
@@ -9090,9 +9082,9 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     mov cx, strict word 0000fh                ; b9 0f 00
-    call 05e6dh                               ; e8 a2 f8
+    call 05e5bh                               ; e8 a2 f8
     mov dword [bp+014h], strict dword 000000003h ; 66 c7 46 14 03 00 00 00
-    jmp near 066b3h                           ; e9 dd 00
+    jmp near 066a1h                           ; e9 dd 00
     push strict byte 00001h                   ; 6a 01
     push dword 000000000h                     ; 66 6a 00
     push ax                                   ; 50
@@ -9101,9 +9093,9 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     mov cx, strict word 00010h                ; b9 10 00
-    call 05e6dh                               ; e8 82 f8
+    call 05e5bh                               ; e8 82 f8
     mov dword [bp+014h], strict dword 000000004h ; 66 c7 46 14 04 00 00 00
-    jmp near 066b3h                           ; e9 bd 00
+    jmp near 066a1h                           ; e9 bd 00
     push strict byte 00003h                   ; 6a 03
     push dword 000000000h                     ; 66 6a 00
     push dx                                   ; 52
@@ -9113,9 +9105,9 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov bx, cx                                ; 89 cb
     mov cx, ax                                ; 89 c1
     mov ax, si                                ; 89 f0
-    call 05e6dh                               ; e8 61 f8
+    call 05e5bh                               ; e8 61 f8
     mov dword [bp+014h], strict dword 000000005h ; 66 c7 46 14 05 00 00 00
-    jmp near 066b3h                           ; e9 9c 00
+    jmp near 066a1h                           ; e9 9c 00
     push strict byte 00002h                   ; 6a 02
     push dword 000000000h                     ; 66 6a 00
     push dword 000000000h                     ; 66 6a 00
@@ -9123,19 +9115,19 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     mov cx, strict word 0fffch                ; b9 fc ff
-    call 05e6dh                               ; e8 40 f8
+    call 05e5bh                               ; e8 40 f8
     cmp byte [bp-004h], 000h                  ; 80 7e fc 00
-    jne short 0663ah                          ; 75 07
+    jne short 06628h                          ; 75 07
     mov ax, word [bp-008h]                    ; 8b 46 f8
     test ax, ax                               ; 85 c0
-    je short 0664eh                           ; 74 14
+    je short 0663ch                           ; 74 14
     mov dword [bp+014h], strict dword 000000007h ; 66 c7 46 14 07 00 00 00
-    jmp short 066b3h                          ; eb 6f
+    jmp short 066a1h                          ; eb 6f
     mov dword [bp+014h], strict dword 000000006h ; 66 c7 46 14 06 00 00 00
-    jmp short 066b3h                          ; eb 65
+    jmp short 066a1h                          ; eb 65
     mov word [bp+014h], ax                    ; 89 46 14
     mov word [bp+016h], ax                    ; 89 46 16
-    jmp short 066b3h                          ; eb 5d
+    jmp short 066a1h                          ; eb 5d
     push strict byte 00002h                   ; 6a 02
     push dword 000000000h                     ; 66 6a 00
     push dword 000000000h                     ; 66 6a 00
@@ -9143,20 +9135,20 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     xor cx, cx                                ; 31 c9
-    call 05e6dh                               ; e8 02 f8
+    call 05e5bh                               ; e8 02 f8
     cmp byte [bp-004h], 000h                  ; 80 7e fc 00
-    jne short 06678h                          ; 75 07
+    jne short 06666h                          ; 75 07
     mov ax, word [bp-008h]                    ; 8b 46 f8
     test ax, ax                               ; 85 c0
-    je short 0667ah                           ; 74 02
-    jmp short 0663ah                          ; eb c0
+    je short 06668h                           ; 74 02
+    jmp short 06628h                          ; eb c0
     mov word [bp+014h], ax                    ; 89 46 14
     mov word [bp+016h], ax                    ; 89 46 16
-    jmp short 066b3h                          ; eb 31
+    jmp short 066a1h                          ; eb 31
     cmp byte [bp-004h], 000h                  ; 80 7e fc 00
-    jne short 0668eh                          ; 75 06
+    jne short 0667ch                          ; 75 06
     cmp word [bp-008h], strict byte 00000h    ; 83 7e f8 00
-    je short 066b3h                           ; 74 25
+    je short 066a1h                           ; 74 25
     push strict byte 00001h                   ; 6a 01
     mov al, byte [bp-006h]                    ; 8a 46 fa
     db  0feh, 0c0h
@@ -9169,49 +9161,49 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     mov ax, word [bp+024h]                    ; 8b 46 24
     xor bx, bx                                ; 31 db
     xor cx, cx                                ; 31 c9
-    call 05e6dh                               ; e8 c2 f7
+    call 05e5bh                               ; e8 c2 f7
     xor ax, ax                                ; 31 c0
     mov word [bp+014h], ax                    ; 89 46 14
     mov word [bp+016h], ax                    ; 89 46 16
     mov dword [bp+020h], strict dword 0534d4150h ; 66 c7 46 20 50 41 4d 53
     mov dword [bp+01ch], strict dword 000000014h ; 66 c7 46 1c 14 00 00 00
     and byte [bp+028h], 0feh                  ; 80 66 28 fe
-    jmp short 0673eh                          ; eb 75
+    jmp short 0672ch                          ; eb 75
     mov word [bp+028h], bx                    ; 89 5e 28
     mov ax, strict word 00031h                ; b8 31 00
-    call 0165ch                               ; e8 8a af
+    call 0165ch                               ; e8 9c af
     movzx dx, al                              ; 0f b6 d0
     sal dx, 008h                              ; c1 e2 08
     mov ax, strict word 00030h                ; b8 30 00
-    call 0165ch                               ; e8 7e af
+    call 0165ch                               ; e8 90 af
     xor ah, ah                                ; 30 e4
     or dx, ax                                 ; 09 c2
     mov word [bp+01ch], dx                    ; 89 56 1c
     cmp dx, 03c00h                            ; 81 fa 00 3c
-    jbe short 066f0h                          ; 76 05
+    jbe short 066deh                          ; 76 05
     mov word [bp+01ch], 03c00h                ; c7 46 1c 00 3c
     mov ax, strict word 00035h                ; b8 35 00
-    call 0165ch                               ; e8 66 af
+    call 0165ch                               ; e8 78 af
     movzx dx, al                              ; 0f b6 d0
     sal dx, 008h                              ; c1 e2 08
     mov ax, strict word 00034h                ; b8 34 00
-    call 0165ch                               ; e8 5a af
+    call 0165ch                               ; e8 6c af
     xor ah, ah                                ; 30 e4
     or dx, ax                                 ; 09 c2
     mov word [bp+018h], dx                    ; 89 56 18
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov word [bp+020h], ax                    ; 89 46 20
     mov word [bp+014h], dx                    ; 89 56 14
-    jmp short 0673eh                          ; eb 2a
+    jmp short 0672ch                          ; eb 2a
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 c2 b1
+    call 018e1h                               ; e8 d4 b1
     push word [bp+014h]                       ; ff 76 14
     push word [bp+020h]                       ; ff 76 20
     push 008bch                               ; 68 bc 08
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 f5 b1
+    call 01922h                               ; e8 07 b2
     add sp, strict byte 00008h                ; 83 c4 08
     or byte [bp+028h], 001h                   ; 80 4e 28 01
     mov ax, word [bp+020h]                    ; 8b 46 20
@@ -9222,7 +9214,7 @@ _int15_function32:                           ; 0xf63c6 LB 0x37e
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-_inv_op_handler:                             ; 0xf6744 LB 0x195
+_inv_op_handler:                             ; 0xf6732 LB 0x195
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -9231,11 +9223,11 @@ _inv_op_handler:                             ; 0xf6744 LB 0x195
     push ax                                   ; 50
     les bx, [bp+018h]                         ; c4 5e 18
     cmp byte [es:bx], 0f0h                    ; 26 80 3f f0
-    jne short 0675ah                          ; 75 06
+    jne short 06748h                          ; 75 06
     inc word [bp+018h]                        ; ff 46 18
-    jmp near 068d2h                           ; e9 78 01
+    jmp near 068c0h                           ; e9 78 01
     cmp word [es:bx], 0050fh                  ; 26 81 3f 0f 05
-    jne near 068ceh                           ; 0f 85 6b 01
+    jne near 068bch                           ; 0f 85 6b 01
     mov si, 00800h                            ; be 00 08
     xor ax, ax                                ; 31 c0
     mov word [bp-006h], ax                    ; 89 46 fa
@@ -9263,11 +9255,11 @@ _inv_op_handler:                             ; 0xf6744 LB 0x195
     mov cx, strict word 00004h                ; b9 04 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 067b3h                               ; e2 fa
+    loop 067a1h                               ; e2 fa
     cmp bx, dx                                ; 39 d3
-    jne short 067c1h                          ; 75 04
+    jne short 067afh                          ; 75 04
     cmp di, ax                                ; 39 c7
-    je short 067c6h                           ; 74 05
+    je short 067b4h                           ; 74 05
     mov word [bp-008h], strict word 00001h    ; c7 46 f8 01 00
     mov es, [bp-006h]                         ; 8e 46 fa
     movzx di, byte [es:si+04ah]               ; 26 0f b6 7c 4a
@@ -9277,11 +9269,11 @@ _inv_op_handler:                             ; 0xf6744 LB 0x195
     mov cx, strict word 00004h                ; b9 04 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 067dbh                               ; e2 fa
+    loop 067c9h                               ; e2 fa
     cmp di, dx                                ; 39 d7
-    jne short 067e9h                          ; 75 04
+    jne short 067d7h                          ; 75 04
     cmp bx, ax                                ; 39 c3
-    je short 067edh                           ; 74 04
+    je short 067dbh                           ; 74 04
     or byte [bp-008h], 002h                   ; 80 4e f8 02
     push strict byte 00000h                   ; 6a 00
     push 00800h                               ; 68 00 08
@@ -9331,10 +9323,10 @@ _inv_op_handler:                             ; 0xf6744 LB 0x195
     lmsw ax                                   ; 0f 01 f0
     mov ax, strict word 00008h                ; b8 08 00
     test cx, strict word 00001h               ; f7 c1 01 00
-    je near 0688bh                            ; 0f 84 02 00
+    je near 06879h                            ; 0f 84 02 00
     mov es, ax                                ; 8e c0
     test cx, strict word 00002h               ; f7 c1 02 00
-    je near 068b3h                            ; 0f 84 20 00
+    je near 068a1h                            ; 0f 84 20 00
     mov bx, word [word ss:00000h]             ; 36 8b 1e 00 00
     mov word [word ss:00008h], bx             ; 36 89 1e 08 00
     mov bx, word [word ss:00002h]             ; 36 8b 1e 02 00
@@ -9351,141 +9343,142 @@ _inv_op_handler:                             ; 0xf6744 LB 0x195
     sub sp, strict byte 00006h                ; 83 ec 06
     mov ss, [word ss:00020h]                  ; 36 8e 16 20 00
     iret                                      ; cf
-    jmp short 068d2h                          ; eb 04
+    jmp short 068c0h                          ; eb 04
     sti                                       ; fb
     hlt                                       ; f4
-    jmp short 068cfh                          ; eb fd
+    jmp short 068bdh                          ; eb fd
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-init_rtc_:                                   ; 0xf68d9 LB 0x28
+init_rtc_:                                   ; 0xf68c7 LB 0x28
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push dx                                   ; 52
     mov dx, strict word 00026h                ; ba 26 00
     mov ax, strict word 0000ah                ; b8 0a 00
-    call 01679h                               ; e8 93 ad
+    call 01679h                               ; e8 a5 ad
     mov dx, strict word 00002h                ; ba 02 00
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 01679h                               ; e8 8a ad
+    call 01679h                               ; e8 9c ad
     mov ax, strict word 0000ch                ; b8 0c 00
-    call 0165ch                               ; e8 67 ad
+    call 0165ch                               ; e8 79 ad
     mov ax, strict word 0000dh                ; b8 0d 00
-    call 0165ch                               ; e8 61 ad
+    call 0165ch                               ; e8 73 ad
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop dx                                    ; 5a
     pop bp                                    ; 5d
     retn                                      ; c3
-rtc_updating_:                               ; 0xf6901 LB 0x21
+rtc_updating_:                               ; 0xf68ef LB 0x21
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push dx                                   ; 52
     mov dx, 061a8h                            ; ba a8 61
     dec dx                                    ; 4a
-    je short 06919h                           ; 74 0e
+    je short 06907h                           ; 74 0e
     mov ax, strict word 0000ah                ; b8 0a 00
-    call 0165ch                               ; e8 4b ad
+    call 0165ch                               ; e8 5d ad
     test AL, strict byte 080h                 ; a8 80
-    jne short 06908h                          ; 75 f3
+    jne short 068f6h                          ; 75 f3
     xor ax, ax                                ; 31 c0
-    jmp short 0691ch                          ; eb 03
+    jmp short 0690ah                          ; eb 03
     mov ax, strict word 00001h                ; b8 01 00
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop dx                                    ; 5a
     pop bp                                    ; 5d
     retn                                      ; c3
-_int70_function:                             ; 0xf6922 LB 0xbe
+_int70_function:                             ; 0xf6910 LB 0xbe
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
     push ax                                   ; 50
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 2f ad
+    call 0165ch                               ; e8 41 ad
     mov dl, al                                ; 88 c2
     mov byte [bp-004h], al                    ; 88 46 fc
     mov ax, strict word 0000ch                ; b8 0c 00
-    call 0165ch                               ; e8 24 ad
+    call 0165ch                               ; e8 36 ad
     mov dh, al                                ; 88 c6
     test dl, 060h                             ; f6 c2 60
-    je near 069c7h                            ; 0f 84 86 00
+    je near 069b5h                            ; 0f 84 86 00
     test AL, strict byte 020h                 ; a8 20
-    je short 06949h                           ; 74 04
+    je short 06937h                           ; 74 04
     sti                                       ; fb
     int 04ah                                  ; cd 4a
     cli                                       ; fa
     test dh, 040h                             ; f6 c6 40
-    je near 069c7h                            ; 0f 84 77 00
+    je near 069b5h                            ; 0f 84 77 00
     mov dx, 000a0h                            ; ba a0 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 a7 ac
+    call 01600h                               ; e8 b9 ac
     test al, al                               ; 84 c0
-    je short 069c7h                           ; 74 6a
+    je short 069b5h                           ; 74 6a
     mov dx, 0009ch                            ; ba 9c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01638h                               ; e8 d2 ac
+    call 01638h                               ; e8 e4 ac
     test dx, dx                               ; 85 d2
-    jne short 069b3h                          ; 75 49
+    jne short 069a1h                          ; 75 49
     cmp ax, 003d1h                            ; 3d d1 03
-    jnc short 069b3h                          ; 73 44
+    jnc short 069a1h                          ; 73 44
     mov dx, 00098h                            ; ba 98 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 a4 ac
+    call 0161ch                               ; e8 b6 ac
     mov si, ax                                ; 89 c6
     mov dx, 0009ah                            ; ba 9a 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 99 ac
+    call 0161ch                               ; e8 ab ac
     mov cx, ax                                ; 89 c1
     xor bx, bx                                ; 31 db
     mov dx, 000a0h                            ; ba a0 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 7e ac
+    call 0160eh                               ; e8 90 ac
     mov al, byte [bp-004h]                    ; 8a 46 fc
     and AL, strict byte 037h                  ; 24 37
     movzx dx, al                              ; 0f b6 d0
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 01679h                               ; e8 db ac
+    call 01679h                               ; e8 ed ac
     mov dx, cx                                ; 89 ca
     mov ax, si                                ; 89 f0
-    call 01600h                               ; e8 5b ac
+    call 01600h                               ; e8 6d ac
     or AL, strict byte 080h                   ; 0c 80
     movzx bx, al                              ; 0f b6 d8
     mov dx, cx                                ; 89 ca
     mov ax, si                                ; 89 f0
-    call 0160eh                               ; e8 5d ac
-    jmp short 069c7h                          ; eb 14
+    call 0160eh                               ; e8 6f ac
+    jmp short 069b5h                          ; eb 14
     mov bx, ax                                ; 89 c3
     add bx, 0fc2fh                            ; 81 c3 2f fc
     mov cx, dx                                ; 89 d1
     adc cx, strict byte 0ffffh                ; 83 d1 ff
     mov dx, 0009ch                            ; ba 9c 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0164ah                               ; e8 83 ac
-    call 0e03bh                               ; e8 71 76
+    call 0164ah                               ; e8 95 ac
+    call 0e03bh                               ; e8 83 76
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-    imul word [bx+di+020h]                    ; f7 69 20
-    push strict byte 00045h                   ; 6a 45
-    push strict byte 00077h                   ; 6a 77
-    push strict byte 0ffc6h                   ; 6a c6
-    push strict byte 0fffeh                   ; 6a fe
-    push strict byte 00041h                   ; 6a 41
+    in ax, 069h                               ; e5 69
+    push CS                                   ; 0e
+    push strict byte 00033h                   ; 6a 33
+    push strict byte 00065h                   ; 6a 65
+    push strict byte 0ffb4h                   ; 6a b4
+    push strict byte 0ffech                   ; 6a ec
+    push strict byte 0002fh                   ; 6a 2f
     db  06bh
-    cbw                                       ; 98
+    db  086h
     db  06bh
-_int1a_function:                             ; 0xf69e0 LB 0x1c8
+_int1a_function:                             ; 0xf69ce LB 0x1c8
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     sti                                       ; fb
     mov al, byte [bp+013h]                    ; 8a 46 13
     cmp AL, strict byte 007h                  ; 3c 07
-    jnbe near 06a1ch                          ; 0f 87 2f 00
+    jnbe near 06a0ah                          ; 0f 87 2f 00
     movzx bx, al                              ; 0f b6 d8
     add bx, bx                                ; 01 db
-    jmp word [cs:bx+069d0h]                   ; 2e ff a7 d0 69
+    jmp word [cs:bx+069beh]                   ; 2e ff a7 be 69
     cli                                       ; fa
     mov bx, 0046eh                            ; bb 6e 04
     xor ax, ax                                ; 31 c0
@@ -9516,41 +9509,41 @@ _int1a_function:                             ; 0xf69e0 LB 0x1c8
     mov byte [es:bx], 000h                    ; 26 c6 07 00
     sti                                       ; fb
     mov byte [bp+013h], 000h                  ; c6 46 13 00
-    jmp short 06a1ch                          ; eb d7
-    call 06901h                               ; e8 b9 fe
+    jmp short 06a0ah                          ; eb d7
+    call 068efh                               ; e8 b9 fe
     test ax, ax                               ; 85 c0
-    je short 06a4eh                           ; 74 02
-    jmp short 06a1ch                          ; eb ce
+    je short 06a3ch                           ; 74 02
+    jmp short 06a0ah                          ; eb ce
     xor ax, ax                                ; 31 c0
-    call 0165ch                               ; e8 09 ac
+    call 0165ch                               ; e8 1b ac
     mov byte [bp+00fh], al                    ; 88 46 0f
     mov ax, strict word 00002h                ; b8 02 00
-    call 0165ch                               ; e8 00 ac
+    call 0165ch                               ; e8 12 ac
     mov byte [bp+010h], al                    ; 88 46 10
     mov ax, strict word 00004h                ; b8 04 00
-    call 0165ch                               ; e8 f7 ab
+    call 0165ch                               ; e8 09 ac
     mov bl, al                                ; 88 c3
     mov byte [bp+011h], al                    ; 88 46 11
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 ec ab
+    call 0165ch                               ; e8 fe ab
     and AL, strict byte 001h                  ; 24 01
     mov byte [bp+00eh], al                    ; 88 46 0e
-    jmp short 06abch                          ; eb 45
-    call 06901h                               ; e8 87 fe
+    jmp short 06aaah                          ; eb 45
+    call 068efh                               ; e8 87 fe
     test ax, ax                               ; 85 c0
-    je short 06a81h                           ; 74 03
-    call 068d9h                               ; e8 58 fe
+    je short 06a6fh                           ; 74 03
+    call 068c7h                               ; e8 58 fe
     movzx dx, byte [bp+00fh]                  ; 0f b6 56 0f
     xor ax, ax                                ; 31 c0
-    call 01679h                               ; e8 ef ab
+    call 01679h                               ; e8 01 ac
     movzx dx, byte [bp+010h]                  ; 0f b6 56 10
     mov ax, strict word 00002h                ; b8 02 00
-    call 01679h                               ; e8 e5 ab
+    call 01679h                               ; e8 f7 ab
     movzx dx, byte [bp+011h]                  ; 0f b6 56 11
     mov ax, strict word 00004h                ; b8 04 00
-    call 01679h                               ; e8 db ab
+    call 01679h                               ; e8 ed ab
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 b8 ab
+    call 0165ch                               ; e8 ca ab
     mov bl, al                                ; 88 c3
     and bl, 060h                              ; 80 e3 60
     or bl, 002h                               ; 80 cb 02
@@ -9559,71 +9552,71 @@ _int1a_function:                             ; 0xf69e0 LB 0x1c8
     or bl, al                                 ; 08 c3
     movzx dx, bl                              ; 0f b6 d3
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 01679h                               ; e8 bd ab
+    call 01679h                               ; e8 cf ab
     mov byte [bp+013h], 000h                  ; c6 46 13 00
     mov byte [bp+012h], bl                    ; 88 5e 12
-    jmp near 06a1ch                           ; e9 56 ff
+    jmp near 06a0ah                           ; e9 56 ff
     mov byte [bp+013h], 000h                  ; c6 46 13 00
-    call 06901h                               ; e8 34 fe
+    call 068efh                               ; e8 34 fe
     test ax, ax                               ; 85 c0
-    je short 06ad4h                           ; 74 03
-    jmp near 06a1ch                           ; e9 48 ff
+    je short 06ac2h                           ; 74 03
+    jmp near 06a0ah                           ; e9 48 ff
     mov ax, strict word 00009h                ; b8 09 00
-    call 0165ch                               ; e8 82 ab
+    call 0165ch                               ; e8 94 ab
     mov byte [bp+010h], al                    ; 88 46 10
     mov ax, strict word 00008h                ; b8 08 00
-    call 0165ch                               ; e8 79 ab
+    call 0165ch                               ; e8 8b ab
     mov byte [bp+00fh], al                    ; 88 46 0f
     mov ax, strict word 00007h                ; b8 07 00
-    call 0165ch                               ; e8 70 ab
+    call 0165ch                               ; e8 82 ab
     mov byte [bp+00eh], al                    ; 88 46 0e
     mov ax, strict word 00032h                ; b8 32 00
-    call 0165ch                               ; e8 67 ab
+    call 0165ch                               ; e8 79 ab
     mov byte [bp+011h], al                    ; 88 46 11
     mov byte [bp+012h], al                    ; 88 46 12
-    jmp near 06a1ch                           ; e9 1e ff
-    call 06901h                               ; e8 00 fe
+    jmp near 06a0ah                           ; e9 1e ff
+    call 068efh                               ; e8 00 fe
     test ax, ax                               ; 85 c0
-    je short 06b0bh                           ; 74 06
-    call 068d9h                               ; e8 d1 fd
-    jmp near 06a1ch                           ; e9 11 ff
+    je short 06af9h                           ; 74 06
+    call 068c7h                               ; e8 d1 fd
+    jmp near 06a0ah                           ; e9 11 ff
     movzx dx, byte [bp+010h]                  ; 0f b6 56 10
     mov ax, strict word 00009h                ; b8 09 00
-    call 01679h                               ; e8 64 ab
+    call 01679h                               ; e8 76 ab
     movzx dx, byte [bp+00fh]                  ; 0f b6 56 0f
     mov ax, strict word 00008h                ; b8 08 00
-    call 01679h                               ; e8 5a ab
+    call 01679h                               ; e8 6c ab
     movzx dx, byte [bp+00eh]                  ; 0f b6 56 0e
     mov ax, strict word 00007h                ; b8 07 00
-    call 01679h                               ; e8 50 ab
+    call 01679h                               ; e8 62 ab
     movzx dx, byte [bp+011h]                  ; 0f b6 56 11
     mov ax, strict word 00032h                ; b8 32 00
-    call 01679h                               ; e8 46 ab
+    call 01679h                               ; e8 58 ab
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 23 ab
+    call 0165ch                               ; e8 35 ab
     mov bl, al                                ; 88 c3
     and bl, 07fh                              ; 80 e3 7f
-    jmp near 06ab3h                           ; e9 72 ff
+    jmp near 06aa1h                           ; e9 72 ff
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 15 ab
+    call 0165ch                               ; e8 27 ab
     mov bl, al                                ; 88 c3
     mov word [bp+012h], strict word 00000h    ; c7 46 12 00 00
     test AL, strict byte 020h                 ; a8 20
-    je short 06b55h                           ; 74 03
-    jmp near 06a1ch                           ; e9 c7 fe
-    call 06901h                               ; e8 a9 fd
+    je short 06b43h                           ; 74 03
+    jmp near 06a0ah                           ; e9 c7 fe
+    call 068efh                               ; e8 a9 fd
     test ax, ax                               ; 85 c0
-    je short 06b5fh                           ; 74 03
-    call 068d9h                               ; e8 7a fd
+    je short 06b4dh                           ; 74 03
+    call 068c7h                               ; e8 7a fd
     movzx dx, byte [bp+00fh]                  ; 0f b6 56 0f
     mov ax, strict word 00001h                ; b8 01 00
-    call 01679h                               ; e8 10 ab
+    call 01679h                               ; e8 22 ab
     movzx dx, byte [bp+010h]                  ; 0f b6 56 10
     mov ax, strict word 00003h                ; b8 03 00
-    call 01679h                               ; e8 06 ab
+    call 01679h                               ; e8 18 ab
     movzx dx, byte [bp+011h]                  ; 0f b6 56 11
     mov ax, strict word 00005h                ; b8 05 00
-    call 01679h                               ; e8 fc aa
+    call 01679h                               ; e8 0e ab
     mov dx, 000a1h                            ; ba a1 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -9635,15 +9628,15 @@ _int1a_function:                             ; 0xf69e0 LB 0x1c8
     or AL, strict byte 020h                   ; 0c 20
     movzx dx, al                              ; 0f b6 d0
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 01679h                               ; e8 e4 aa
-    jmp near 06a1ch                           ; e9 84 fe
+    call 01679h                               ; e8 f6 aa
+    jmp near 06a0ah                           ; e9 84 fe
     mov ax, strict word 0000bh                ; b8 0b 00
-    call 0165ch                               ; e8 be aa
+    call 0165ch                               ; e8 d0 aa
     mov bl, al                                ; 88 c3
     and AL, strict byte 057h                  ; 24 57
     movzx dx, al                              ; 0f b6 d0
-    jmp near 06ab6h                           ; e9 0e ff
-send_to_mouse_ctrl_:                         ; 0xf6ba8 LB 0x34
+    jmp near 06aa4h                           ; e9 0e ff
+send_to_mouse_ctrl_:                         ; 0xf6b96 LB 0x34
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -9654,11 +9647,11 @@ send_to_mouse_ctrl_:                         ; 0xf6ba8 LB 0x34
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 06bc7h                           ; 74 0e
+    je short 06bb5h                           ; 74 0e
     push 008f6h                               ; 68 f6 08
     push 01182h                               ; 68 82 11
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 5e ad
+    call 01922h                               ; e8 70 ad
     add sp, strict byte 00006h                ; 83 c4 06
     mov AL, strict byte 0d4h                  ; b0 d4
     mov dx, strict word 00064h                ; ba 64 00
@@ -9672,7 +9665,7 @@ send_to_mouse_ctrl_:                         ; 0xf6ba8 LB 0x34
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-get_mouse_data_:                             ; 0xf6bdc LB 0x3b
+get_mouse_data_:                             ; 0xf6bca LB 0x3b
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -9686,15 +9679,15 @@ get_mouse_data_:                             ; 0xf6bdc LB 0x3b
     ; sub ah, ah                                ; 2a e4
     and ax, strict word 00021h                ; 25 21 00
     cmp ax, strict word 00021h                ; 3d 21 00
-    je short 06bfdh                           ; 74 07
+    je short 06bebh                           ; 74 07
     test cx, cx                               ; 85 c9
-    je short 06bfdh                           ; 74 03
+    je short 06bebh                           ; 74 03
     dec cx                                    ; 49
-    jmp short 06be8h                          ; eb eb
+    jmp short 06bd6h                          ; eb eb
     test cx, cx                               ; 85 c9
-    jne short 06c05h                          ; 75 04
+    jne short 06bf3h                          ; 75 04
     mov AL, strict byte 001h                  ; b0 01
-    jmp short 06c10h                          ; eb 0b
+    jmp short 06bfeh                          ; eb 0b
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -9706,7 +9699,7 @@ get_mouse_data_:                             ; 0xf6bdc LB 0x3b
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-set_kbd_command_byte_:                       ; 0xf6c17 LB 0x32
+set_kbd_command_byte_:                       ; 0xf6c05 LB 0x32
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -9717,11 +9710,11 @@ set_kbd_command_byte_:                       ; 0xf6c17 LB 0x32
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 002h                 ; a8 02
-    je short 06c36h                           ; 74 0e
+    je short 06c24h                           ; 74 0e
     push 00900h                               ; 68 00 09
     push 01182h                               ; 68 82 11
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 ef ac
+    call 01922h                               ; e8 01 ad
     add sp, strict byte 00006h                ; 83 c4 06
     mov AL, strict byte 060h                  ; b0 60
     mov dx, strict word 00064h                ; ba 64 00
@@ -9734,13 +9727,13 @@ set_kbd_command_byte_:                       ; 0xf6c17 LB 0x32
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-_int74_function:                             ; 0xf6c49 LB 0xca
+_int74_function:                             ; 0xf6c37 LB 0xca
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     sub sp, strict byte 00008h                ; 83 ec 08
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 c4 a9
+    call 0161ch                               ; e8 d6 a9
     mov cx, ax                                ; 89 c1
     mov word [bp+004h], strict word 00000h    ; c7 46 04 00 00
     mov dx, strict word 00064h                ; ba 64 00
@@ -9749,7 +9742,7 @@ _int74_function:                             ; 0xf6c49 LB 0xca
     ; sub ah, ah                                ; 2a e4
     and AL, strict byte 021h                  ; 24 21
     cmp AL, strict byte 021h                  ; 3c 21
-    jne near 06cffh                           ; 0f 85 92 00
+    jne near 06cedh                           ; 0f 85 92 00
     mov dx, strict word 00060h                ; ba 60 00
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -9757,14 +9750,14 @@ _int74_function:                             ; 0xf6c49 LB 0xca
     mov bl, al                                ; 88 c3
     mov dx, strict word 00026h                ; ba 26 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 83 a9
+    call 01600h                               ; e8 95 a9
     mov byte [bp-006h], al                    ; 88 46 fa
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 78 a9
+    call 01600h                               ; e8 8a a9
     mov byte [bp-008h], al                    ; 88 46 f8
     test AL, strict byte 080h                 ; a8 80
-    je short 06cffh                           ; 74 70
+    je short 06cedh                           ; 74 70
     mov al, byte [bp-008h]                    ; 8a 46 f8
     and AL, strict byte 007h                  ; 24 07
     mov byte [bp-002h], al                    ; 88 46 fe
@@ -9775,110 +9768,111 @@ _int74_function:                             ; 0xf6c49 LB 0xca
     movzx dx, al                              ; 0f b6 d0
     add dx, strict byte 00028h                ; 83 c2 28
     mov ax, cx                                ; 89 c8
-    call 0160eh                               ; e8 62 a9
+    call 0160eh                               ; e8 74 a9
     mov al, byte [bp-004h]                    ; 8a 46 fc
     cmp al, byte [bp-002h]                    ; 3a 46 fe
-    jc short 06cf0h                           ; 72 3c
+    jc short 06cdeh                           ; 72 3c
     mov dx, strict word 00028h                ; ba 28 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 44 a9
+    call 01600h                               ; e8 56 a9
     xor ah, ah                                ; 30 e4
     mov word [bp+00ch], ax                    ; 89 46 0c
     mov dx, strict word 00029h                ; ba 29 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 37 a9
+    call 01600h                               ; e8 49 a9
     xor ah, ah                                ; 30 e4
     mov word [bp+00ah], ax                    ; 89 46 0a
     mov dx, strict word 0002ah                ; ba 2a 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 2a a9
+    call 01600h                               ; e8 3c a9
     xor ah, ah                                ; 30 e4
     mov word [bp+008h], ax                    ; 89 46 08
     xor al, al                                ; 30 c0
     mov word [bp+006h], ax                    ; 89 46 06
     mov byte [bp-006h], ah                    ; 88 66 fa
     test byte [bp-008h], 080h                 ; f6 46 f8 80
-    je short 06cf3h                           ; 74 0a
+    je short 06ce1h                           ; 74 0a
     mov word [bp+004h], strict word 00001h    ; c7 46 04 01 00
-    jmp short 06cf3h                          ; eb 03
+    jmp short 06ce1h                          ; eb 03
     inc byte [bp-006h]                        ; fe 46 fa
     movzx bx, byte [bp-006h]                  ; 0f b6 5e fa
     mov dx, strict word 00026h                ; ba 26 00
     mov ax, cx                                ; 89 c8
-    call 0160eh                               ; e8 0f a9
+    call 0160eh                               ; e8 21 a9
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
-    push di                                   ; 57
+    inc bp                                    ; 45
     insw                                      ; 6d
-    int 06dh                                  ; cd 6d
-    push ax                                   ; 50
+    mov bx, 03e6dh                            ; bb 6d 3e
     outsb                                     ; 6e
-    loope 06d79h                              ; e1 6e
-    dec di                                    ; 4f
-    outsw                                     ; 6f
-    mov word [0776dh], ax                     ; a3 6d 77
-    outsw                                     ; 6f
-    cmp AL, strict byte 070h                  ; 3c 70
-_int15_function_mouse:                       ; 0xf6d13 LB 0x38b
+    iret                                      ; cf
+    outsb                                     ; 6e
+    cmp ax, 0916fh                            ; 3d 6f 91
+    insw                                      ; 6d
+    db  065h, 06fh
+    ; gs outsw                                  ; 65 6f
+    db  02ah
+    db  070h
+_int15_function_mouse:                       ; 0xf6d01 LB 0x38b
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
     sub sp, strict byte 00006h                ; 83 ec 06
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 f9 a8
+    call 0161ch                               ; e8 0b a9
     mov cx, ax                                ; 89 c1
     cmp byte [bp+012h], 007h                  ; 80 7e 12 07
-    jbe short 06d36h                          ; 76 0b
+    jbe short 06d24h                          ; 76 0b
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 001h                  ; c6 46 13 01
-    jmp near 07098h                           ; e9 62 03
+    jmp near 07086h                           ; e9 62 03
     mov ax, strict word 00065h                ; b8 65 00
-    call 06c17h                               ; e8 db fe
+    call 06c05h                               ; e8 db fe
     and word [bp+018h], strict byte 0fffeh    ; 83 66 18 fe
     mov byte [bp+013h], 000h                  ; c6 46 13 00
     mov al, byte [bp+012h]                    ; 8a 46 12
     cmp AL, strict byte 007h                  ; 3c 07
-    jnbe near 0707fh                          ; 0f 87 32 03
+    jnbe near 0706dh                          ; 0f 87 32 03
     movzx si, al                              ; 0f b6 f0
     add si, si                                ; 01 f6
-    jmp word [cs:si+06d03h]                   ; 2e ff a4 03 6d
+    jmp word [cs:si+06cf1h]                   ; 2e ff a4 f1 6c
     cmp byte [bp+00dh], 001h                  ; 80 7e 0d 01
-    jnbe near 0708ah                          ; 0f 87 2b 03
+    jnbe near 07078h                          ; 0f 87 2b 03
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 99 a8
+    call 01600h                               ; e8 ab a8
     test AL, strict byte 080h                 ; a8 80
-    jne short 06d76h                          ; 75 0b
+    jne short 06d64h                          ; 75 0b
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 005h                  ; c6 46 13 05
-    jmp near 07092h                           ; e9 1c 03
+    jmp near 07080h                           ; e9 1c 03
     cmp byte [bp+00dh], 000h                  ; 80 7e 0d 00
     db  00fh, 094h, 0c0h
     ; sete al                                   ; 0f 94 c0
     add AL, strict byte 0f4h                  ; 04 f4
     xor ah, ah                                ; 30 e4
-    call 06ba8h                               ; e8 24 fe
+    call 06b96h                               ; e8 24 fe
     test al, al                               ; 84 c0
-    jne near 07018h                           ; 0f 85 8e 02
+    jne near 07006h                           ; 0f 85 8e 02
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 4a fe
+    call 06bcah                               ; e8 4a fe
     test al, al                               ; 84 c0
-    je near 07092h                            ; 0f 84 fa 02
+    je near 07080h                            ; 0f 84 fa 02
     cmp byte [bp-008h], 0fah                  ; 80 7e f8 fa
-    jne near 07018h                           ; 0f 85 78 02
-    jmp near 07092h                           ; e9 ef 02
+    jne near 07006h                           ; 0f 85 78 02
+    jmp near 07080h                           ; e9 ef 02
     mov al, byte [bp+00dh]                    ; 8a 46 0d
     cmp AL, strict byte 001h                  ; 3c 01
-    jc short 06daeh                           ; 72 04
+    jc short 06d9ch                           ; 72 04
     cmp AL, strict byte 008h                  ; 3c 08
-    jbe short 06db1h                          ; 76 03
-    jmp near 06f44h                           ; e9 93 01
+    jbe short 06d9fh                          ; 76 03
+    jmp near 06f32h                           ; e9 93 01
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 47 a8
+    call 01600h                               ; e8 59 a8
     mov ah, byte [bp+00dh]                    ; 8a 66 0d
     db  0feh, 0cch
     ; dec ah                                    ; fe cc
@@ -9887,272 +9881,272 @@ _int15_function_mouse:                       ; 0xf6d13 LB 0x38b
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 0160eh                               ; e8 41 a8
+    call 0160eh                               ; e8 53 a8
     mov dx, strict word 00026h                ; ba 26 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 2b a8
+    call 01600h                               ; e8 3d a8
     and AL, strict byte 0f8h                  ; 24 f8
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00026h                ; ba 26 00
     mov ax, cx                                ; 89 c8
-    call 0160eh                               ; e8 2c a8
+    call 0160eh                               ; e8 3e a8
     mov ax, 000ffh                            ; b8 ff 00
-    call 06ba8h                               ; e8 c0 fd
+    call 06b96h                               ; e8 c0 fd
     test al, al                               ; 84 c0
-    jne near 07018h                           ; 0f 85 2a 02
+    jne near 07006h                           ; 0f 85 2a 02
     mov dx, ss                                ; 8c d2
     lea ax, [bp-004h]                         ; 8d 46 fc
-    call 06bdch                               ; e8 e6 fd
+    call 06bcah                               ; e8 e6 fd
     mov cl, al                                ; 88 c1
     cmp byte [bp-004h], 0feh                  ; 80 7e fc fe
-    jne short 06e09h                          ; 75 0b
+    jne short 06df7h                          ; 75 0b
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 004h                  ; c6 46 13 04
-    jmp near 07092h                           ; e9 89 02
+    jmp near 07080h                           ; e9 89 02
     cmp byte [bp-004h], 0fah                  ; 80 7e fc fa
-    je short 06e1fh                           ; 74 10
+    je short 06e0dh                           ; 74 10
     movzx ax, byte [bp-004h]                  ; 0f b6 46 fc
     push ax                                   ; 50
     push 0090bh                               ; 68 0b 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 06 ab
+    call 01922h                               ; e8 18 ab
     add sp, strict byte 00006h                ; 83 c4 06
     test cl, cl                               ; 84 c9
-    jne near 07018h                           ; 0f 85 f3 01
+    jne near 07006h                           ; 0f 85 f3 01
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 af fd
+    call 06bcah                               ; e8 af fd
     test al, al                               ; 84 c0
-    jne near 07018h                           ; 0f 85 e5 01
+    jne near 07006h                           ; 0f 85 e5 01
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 06bdch                               ; e8 a1 fd
+    call 06bcah                               ; e8 a1 fd
     test al, al                               ; 84 c0
-    jne near 07018h                           ; 0f 85 d7 01
+    jne near 07006h                           ; 0f 85 d7 01
     mov al, byte [bp-008h]                    ; 8a 46 f8
     mov byte [bp+00ch], al                    ; 88 46 0c
     mov al, byte [bp-006h]                    ; 8a 46 fa
     mov byte [bp+00dh], al                    ; 88 46 0d
-    jmp near 07092h                           ; e9 42 02
+    jmp near 07080h                           ; e9 42 02
     mov al, byte [bp+00dh]                    ; 8a 46 0d
     cmp AL, strict byte 003h                  ; 3c 03
-    jc short 06e67h                           ; 72 10
-    jbe short 06e85h                          ; 76 2c
+    jc short 06e55h                           ; 72 10
+    jbe short 06e73h                          ; 76 2c
     cmp AL, strict byte 006h                  ; 3c 06
-    je short 06e97h                           ; 74 3a
+    je short 06e85h                           ; 74 3a
     cmp AL, strict byte 005h                  ; 3c 05
-    je short 06e91h                           ; 74 30
+    je short 06e7fh                           ; 74 30
     cmp AL, strict byte 004h                  ; 3c 04
-    je short 06e8bh                           ; 74 26
-    jmp short 06e9dh                          ; eb 36
+    je short 06e79h                           ; 74 26
+    jmp short 06e8bh                          ; eb 36
     cmp AL, strict byte 002h                  ; 3c 02
-    je short 06e7fh                           ; 74 14
+    je short 06e6dh                           ; 74 14
     cmp AL, strict byte 001h                  ; 3c 01
-    je short 06e79h                           ; 74 0a
+    je short 06e67h                           ; 74 0a
     test al, al                               ; 84 c0
-    jne short 06e9dh                          ; 75 2a
+    jne short 06e8bh                          ; 75 2a
     mov byte [bp-008h], 00ah                  ; c6 46 f8 0a
-    jmp short 06ea1h                          ; eb 28
+    jmp short 06e8fh                          ; eb 28
     mov byte [bp-008h], 014h                  ; c6 46 f8 14
-    jmp short 06ea1h                          ; eb 22
+    jmp short 06e8fh                          ; eb 22
     mov byte [bp-008h], 028h                  ; c6 46 f8 28
-    jmp short 06ea1h                          ; eb 1c
+    jmp short 06e8fh                          ; eb 1c
     mov byte [bp-008h], 03ch                  ; c6 46 f8 3c
-    jmp short 06ea1h                          ; eb 16
+    jmp short 06e8fh                          ; eb 16
     mov byte [bp-008h], 050h                  ; c6 46 f8 50
-    jmp short 06ea1h                          ; eb 10
+    jmp short 06e8fh                          ; eb 10
     mov byte [bp-008h], 064h                  ; c6 46 f8 64
-    jmp short 06ea1h                          ; eb 0a
+    jmp short 06e8fh                          ; eb 0a
     mov byte [bp-008h], 0c8h                  ; c6 46 f8 c8
-    jmp short 06ea1h                          ; eb 04
+    jmp short 06e8fh                          ; eb 04
     mov byte [bp-008h], 000h                  ; c6 46 f8 00
     cmp byte [bp-008h], 000h                  ; 80 7e f8 00
-    jbe short 06ed6h                          ; 76 2f
+    jbe short 06ec4h                          ; 76 2f
     mov ax, 000f3h                            ; b8 f3 00
-    call 06ba8h                               ; e8 fb fc
+    call 06b96h                               ; e8 fb fc
     test al, al                               ; 84 c0
-    jne short 06ecbh                          ; 75 1a
+    jne short 06eb9h                          ; 75 1a
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 06bdch                               ; e8 23 fd
+    call 06bcah                               ; e8 23 fd
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
-    call 06ba8h                               ; e8 e8 fc
+    call 06b96h                               ; e8 e8 fc
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 06bdch                               ; e8 14 fd
-    jmp near 07092h                           ; e9 c7 01
+    call 06bcah                               ; e8 14 fd
+    jmp near 07080h                           ; e9 c7 01
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 003h                  ; c6 46 13 03
-    jmp near 07092h                           ; e9 bc 01
+    jmp near 07080h                           ; e9 bc 01
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 002h                  ; c6 46 13 02
-    jmp near 07092h                           ; e9 b1 01
+    jmp near 07080h                           ; e9 b1 01
     cmp byte [bp+00dh], 004h                  ; 80 7e 0d 04
-    jnc short 06f44h                          ; 73 5d
+    jnc short 06f32h                          ; 73 5d
     mov ax, 000e8h                            ; b8 e8 00
-    call 06ba8h                               ; e8 bb fc
+    call 06b96h                               ; e8 bb fc
     test al, al                               ; 84 c0
-    jne short 06f39h                          ; 75 48
+    jne short 06f27h                          ; 75 48
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 e3 fc
+    call 06bcah                               ; e8 e3 fc
     cmp byte [bp-008h], 0fah                  ; 80 7e f8 fa
-    je short 06f0fh                           ; 74 10
+    je short 06efdh                           ; 74 10
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     push ax                                   ; 50
     push 00936h                               ; 68 36 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 16 aa
+    call 01922h                               ; e8 28 aa
     add sp, strict byte 00006h                ; 83 c4 06
     movzx ax, byte [bp+00dh]                  ; 0f b6 46 0d
-    call 06ba8h                               ; e8 92 fc
+    call 06b96h                               ; e8 92 fc
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 be fc
+    call 06bcah                               ; e8 be fc
     cmp byte [bp-008h], 0fah                  ; 80 7e f8 fa
-    je near 07092h                            ; 0f 84 6c 01
+    je near 07080h                            ; 0f 84 6c 01
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     push ax                                   ; 50
     push 00936h                               ; 68 36 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 ef a9
+    call 01922h                               ; e8 01 aa
     add sp, strict byte 00006h                ; 83 c4 06
-    jmp near 07092h                           ; e9 59 01
+    jmp near 07080h                           ; e9 59 01
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 003h                  ; c6 46 13 03
-    jmp near 07092h                           ; e9 4e 01
+    jmp near 07080h                           ; e9 4e 01
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 002h                  ; c6 46 13 02
-    jmp near 07092h                           ; e9 43 01
+    jmp near 07080h                           ; e9 43 01
     mov ax, 000f2h                            ; b8 f2 00
-    call 06ba8h                               ; e8 53 fc
+    call 06b96h                               ; e8 53 fc
     test al, al                               ; 84 c0
-    jne short 06f6ch                          ; 75 13
+    jne short 06f5ah                          ; 75 13
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 7b fc
+    call 06bcah                               ; e8 7b fc
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 06bdch                               ; e8 73 fc
-    jmp near 06e47h                           ; e9 db fe
+    call 06bcah                               ; e8 73 fc
+    jmp near 06e35h                           ; e9 db fe
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 003h                  ; c6 46 13 03
-    jmp near 07092h                           ; e9 1b 01
+    jmp near 07080h                           ; e9 1b 01
     mov al, byte [bp+00dh]                    ; 8a 46 0d
     test al, al                               ; 84 c0
-    jbe short 06f85h                          ; 76 07
+    jbe short 06f73h                          ; 76 07
     cmp AL, strict byte 002h                  ; 3c 02
-    jbe short 06feeh                          ; 76 6c
-    jmp near 07022h                           ; e9 9d 00
+    jbe short 06fdch                          ; 76 6c
+    jmp near 07010h                           ; e9 9d 00
     mov ax, 000e9h                            ; b8 e9 00
-    call 06ba8h                               ; e8 1d fc
+    call 06b96h                               ; e8 1d fc
     test al, al                               ; 84 c0
-    jne near 07018h                           ; 0f 85 87 00
+    jne near 07006h                           ; 0f 85 87 00
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 43 fc
+    call 06bcah                               ; e8 43 fc
     mov cl, al                                ; 88 c1
     cmp byte [bp-008h], 0fah                  ; 80 7e f8 fa
-    je short 06fb1h                           ; 74 10
+    je short 06f9fh                           ; 74 10
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     push ax                                   ; 50
     push 00936h                               ; 68 36 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 74 a9
+    call 01922h                               ; e8 86 a9
     add sp, strict byte 00006h                ; 83 c4 06
     test cl, cl                               ; 84 c9
-    jne short 07018h                          ; 75 63
+    jne short 07006h                          ; 75 63
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 1f fc
+    call 06bcah                               ; e8 1f fc
     test al, al                               ; 84 c0
-    jne short 07018h                          ; 75 57
+    jne short 07006h                          ; 75 57
     mov dx, ss                                ; 8c d2
     lea ax, [bp-006h]                         ; 8d 46 fa
-    call 06bdch                               ; e8 13 fc
+    call 06bcah                               ; e8 13 fc
     test al, al                               ; 84 c0
-    jne short 07018h                          ; 75 4b
+    jne short 07006h                          ; 75 4b
     mov dx, ss                                ; 8c d2
     lea ax, [bp-004h]                         ; 8d 46 fc
-    call 06bdch                               ; e8 07 fc
+    call 06bcah                               ; e8 07 fc
     test al, al                               ; 84 c0
-    jne short 07018h                          ; 75 3f
+    jne short 07006h                          ; 75 3f
     mov al, byte [bp-008h]                    ; 8a 46 f8
     mov byte [bp+00ch], al                    ; 88 46 0c
     mov al, byte [bp-006h]                    ; 8a 46 fa
     mov byte [bp+010h], al                    ; 88 46 10
     mov al, byte [bp-004h]                    ; 8a 46 fc
     mov byte [bp+00eh], al                    ; 88 46 0e
-    jmp near 07092h                           ; e9 a4 00
+    jmp near 07080h                           ; e9 a4 00
     cmp AL, strict byte 001h                  ; 3c 01
-    jne short 06ff7h                          ; 75 05
+    jne short 06fe5h                          ; 75 05
     mov ax, 000e6h                            ; b8 e6 00
-    jmp short 06ffah                          ; eb 03
+    jmp short 06fe8h                          ; eb 03
     mov ax, 000e7h                            ; b8 e7 00
-    call 06ba8h                               ; e8 ab fb
+    call 06b96h                               ; e8 ab fb
     mov cl, al                                ; 88 c1
     test cl, cl                               ; 84 c9
-    jne short 07012h                          ; 75 0f
+    jne short 07000h                          ; 75 0f
     mov dx, ss                                ; 8c d2
     lea ax, [bp-008h]                         ; 8d 46 f8
-    call 06bdch                               ; e8 d1 fb
+    call 06bcah                               ; e8 d1 fb
     cmp byte [bp-008h], 0fah                  ; 80 7e f8 fa
     db  00fh, 095h, 0c1h
     ; setne cl                                  ; 0f 95 c1
     test cl, cl                               ; 84 c9
-    je near 07092h                            ; 0f 84 7a 00
+    je near 07080h                            ; 0f 84 7a 00
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 003h                  ; c6 46 13 03
-    jmp short 07092h                          ; eb 70
+    jmp short 07080h                          ; eb 70
     movzx ax, byte [bp+00dh]                  ; 0f b6 46 0d
     push ax                                   ; 50
     push 00962h                               ; 68 62 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 f3 a8
+    call 01922h                               ; e8 05 a9
     add sp, strict byte 00006h                ; 83 c4 06
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 001h                  ; c6 46 13 01
-    jmp short 07092h                          ; eb 56
+    jmp short 07080h                          ; eb 56
     mov si, word [bp+00ch]                    ; 8b 76 0c
     mov bx, si                                ; 89 f3
     mov dx, strict word 00022h                ; ba 22 00
     mov ax, cx                                ; 89 c8
-    call 0162ah                               ; e8 e1 a5
+    call 0162ah                               ; e8 f3 a5
     mov bx, word [bp+014h]                    ; 8b 5e 14
     mov dx, strict word 00024h                ; ba 24 00
     mov ax, cx                                ; 89 c8
-    call 0162ah                               ; e8 d6 a5
+    call 0162ah                               ; e8 e8 a5
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 01600h                               ; e8 a4 a5
+    call 01600h                               ; e8 b6 a5
     mov ah, al                                ; 88 c4
     test si, si                               ; 85 f6
-    jne short 07070h                          ; 75 0e
+    jne short 0705eh                          ; 75 0e
     cmp word [bp+014h], strict byte 00000h    ; 83 7e 14 00
-    jne short 07070h                          ; 75 08
+    jne short 0705eh                          ; 75 08
     test AL, strict byte 080h                 ; a8 80
-    je short 07072h                           ; 74 06
+    je short 07060h                           ; 74 06
     and AL, strict byte 07fh                  ; 24 7f
-    jmp short 07072h                          ; eb 02
+    jmp short 07060h                          ; eb 02
     or AL, strict byte 080h                   ; 0c 80
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00027h                ; ba 27 00
     mov ax, cx                                ; 89 c8
-    call 0160eh                               ; e8 91 a5
-    jmp short 07092h                          ; eb 13
+    call 0160eh                               ; e8 a3 a5
+    jmp short 07080h                          ; eb 13
     push 0097ch                               ; 68 7c 09
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 9b a8
+    call 01922h                               ; e8 ad a8
     add sp, strict byte 00004h                ; 83 c4 04
     or word [bp+018h], strict byte 00001h     ; 83 4e 18 01
     mov byte [bp+013h], 001h                  ; c6 46 13 01
     mov ax, strict word 00047h                ; b8 47 00
-    call 06c17h                               ; e8 7f fb
+    call 06c05h                               ; e8 7f fb
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-_int17_function:                             ; 0xf709e LB 0xb3
+_int17_function:                             ; 0xf708c LB 0xb3
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -10162,24 +10156,24 @@ _int17_function:                             ; 0xf709e LB 0xb3
     add dx, dx                                ; 01 d2
     add dx, strict byte 00008h                ; 83 c2 08
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 6a a5
+    call 0161ch                               ; e8 7c a5
     mov bx, ax                                ; 89 c3
     mov si, ax                                ; 89 c6
     cmp byte [bp+013h], 003h                  ; 80 7e 13 03
-    jnc near 07147h                           ; 0f 83 89 00
+    jnc near 07135h                           ; 0f 83 89 00
     mov ax, word [bp+00eh]                    ; 8b 46 0e
     cmp ax, strict word 00003h                ; 3d 03 00
-    jnc near 07147h                           ; 0f 83 7f 00
+    jnc near 07135h                           ; 0f 83 7f 00
     test bx, bx                               ; 85 db
-    jbe near 07147h                           ; 0f 86 79 00
+    jbe near 07135h                           ; 0f 86 79 00
     mov dx, ax                                ; 89 c2
     add dx, strict byte 00078h                ; 83 c2 78
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 27 a5
+    call 01600h                               ; e8 39 a5
     movzx cx, al                              ; 0f b6 c8
     sal cx, 008h                              ; c1 e1 08
     cmp byte [bp+013h], 000h                  ; 80 7e 13 00
-    jne short 07112h                          ; 75 2d
+    jne short 07100h                          ; 75 2d
     mov al, byte [bp+012h]                    ; 8a 46 12
     mov dx, bx                                ; 89 da
     out DX, AL                                ; ee
@@ -10199,13 +10193,13 @@ _int17_function:                             ; 0xf709e LB 0xb3
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 040h                 ; a8 40
-    je short 07112h                           ; 74 07
+    je short 07100h                           ; 74 07
     test cx, cx                               ; 85 c9
-    je short 07112h                           ; 74 03
+    je short 07100h                           ; 74 03
     dec cx                                    ; 49
-    jmp short 07101h                          ; eb ef
+    jmp short 070efh                          ; eb ef
     cmp byte [bp+013h], 001h                  ; 80 7e 13 01
-    jne short 0712eh                          ; 75 16
+    jne short 0711ch                          ; 75 16
     lea dx, [si+002h]                         ; 8d 54 02
     in AL, DX                                 ; ec
     db  02ah, 0e4h
@@ -10224,16 +10218,16 @@ _int17_function:                             ; 0xf709e LB 0xb3
     xor AL, strict byte 048h                  ; 34 48
     mov byte [bp+013h], al                    ; 88 46 13
     test cx, cx                               ; 85 c9
-    jne short 07141h                          ; 75 04
+    jne short 0712fh                          ; 75 04
     or byte [bp+013h], 001h                   ; 80 4e 13 01
     and byte [bp+01ch], 0feh                  ; 80 66 1c fe
-    jmp short 0714bh                          ; eb 04
+    jmp short 07139h                          ; eb 04
     or byte [bp+01ch], 001h                   ; 80 4e 1c 01
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-wait_:                                       ; 0xf7151 LB 0xb2
+wait_:                                       ; 0xf713f LB 0xb2
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -10251,28 +10245,28 @@ wait_:                                       ; 0xf7151 LB 0xb2
     xor cx, cx                                ; 31 c9
     mov dx, 0046ch                            ; ba 6c 04
     xor ax, ax                                ; 31 c0
-    call 01638h                               ; e8 c4 a4
+    call 01638h                               ; e8 d6 a4
     mov word [bp-00eh], ax                    ; 89 46 f2
     mov bx, dx                                ; 89 d3
     hlt                                       ; f4
     mov dx, 0046ch                            ; ba 6c 04
     xor ax, ax                                ; 31 c0
-    call 01638h                               ; e8 b6 a4
+    call 01638h                               ; e8 c8 a4
     mov word [bp-012h], ax                    ; 89 46 ee
     mov di, dx                                ; 89 d7
     cmp dx, bx                                ; 39 da
-    jnbe short 07192h                         ; 77 07
-    jne short 07199h                          ; 75 0c
+    jnbe short 07180h                         ; 77 07
+    jne short 07187h                          ; 75 0c
     cmp ax, word [bp-00eh]                    ; 3b 46 f2
-    jbe short 07199h                          ; 76 07
+    jbe short 07187h                          ; 76 07
     sub ax, word [bp-00eh]                    ; 2b 46 f2
     sbb dx, bx                                ; 19 da
-    jmp short 071a4h                          ; eb 0b
+    jmp short 07192h                          ; eb 0b
     cmp dx, bx                                ; 39 da
-    jc short 071a4h                           ; 72 07
-    jne short 071a8h                          ; 75 09
+    jc short 07192h                           ; 72 07
+    jne short 07196h                          ; 75 09
     cmp ax, word [bp-00eh]                    ; 3b 46 f2
-    jnc short 071a8h                          ; 73 04
+    jnc short 07196h                          ; 73 04
     sub si, ax                                ; 29 c6
     sbb cx, dx                                ; 19 d1
     mov ax, word [bp-012h]                    ; 8b 46 ee
@@ -10280,13 +10274,13 @@ wait_:                                       ; 0xf7151 LB 0xb2
     mov bx, di                                ; 89 fb
     mov ax, 00100h                            ; b8 00 01
     int 016h                                  ; cd 16
-    je near 071beh                            ; 0f 84 05 00
+    je near 071ach                            ; 0f 84 05 00
     mov AL, strict byte 001h                  ; b0 01
-    jmp near 071c0h                           ; e9 02 00
+    jmp near 071aeh                           ; e9 02 00
     db  032h, 0c0h
     ; xor al, al                                ; 32 c0
     test al, al                               ; 84 c0
-    je short 071e8h                           ; 74 24
+    je short 071d6h                           ; 74 24
     db  033h, 0c0h
     ; xor ax, ax                                ; 33 c0
     int 016h                                  ; cd 16
@@ -10297,17 +10291,17 @@ wait_:                                       ; 0xf7151 LB 0xb2
     push ax                                   ; 50
     push 0099eh                               ; 68 9e 09
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 47 a7
+    call 01922h                               ; e8 59 a7
     add sp, strict byte 00006h                ; 83 c4 06
     cmp byte [bp-00ch], 000h                  ; 80 7e f4 00
-    je short 071e8h                           ; 74 04
+    je short 071d6h                           ; 74 04
     mov al, dl                                ; 88 d0
-    jmp short 071fah                          ; eb 12
+    jmp short 071e8h                          ; eb 12
     test cx, cx                               ; 85 c9
-    jnle short 07179h                         ; 7f 8d
-    jne short 071f2h                          ; 75 04
+    jnle short 07167h                         ; 7f 8d
+    jne short 071e0h                          ; 75 04
     test si, si                               ; 85 f6
-    jnbe short 07179h                         ; 77 87
+    jnbe short 07167h                         ; 77 87
     mov ax, word [bp-010h]                    ; 8b 46 f0
     push ax                                   ; 50
     popfw                                     ; 9d
@@ -10319,7 +10313,7 @@ wait_:                                       ; 0xf7151 LB 0xb2
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-read_logo_byte_:                             ; 0xf7203 LB 0x16
+read_logo_byte_:                             ; 0xf71f1 LB 0x16
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push dx                                   ; 52
@@ -10334,7 +10328,7 @@ read_logo_byte_:                             ; 0xf7203 LB 0x16
     pop dx                                    ; 5a
     pop bp                                    ; 5d
     retn                                      ; c3
-read_logo_word_:                             ; 0xf7219 LB 0x14
+read_logo_word_:                             ; 0xf7207 LB 0x14
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push dx                                   ; 52
@@ -10347,7 +10341,7 @@ read_logo_word_:                             ; 0xf7219 LB 0x14
     pop dx                                    ; 5a
     pop bp                                    ; 5d
     retn                                      ; c3
-print_detected_harddisks_:                   ; 0xf722d LB 0x130
+print_detected_harddisks_:                   ; 0xf721b LB 0x130
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -10359,29 +10353,29 @@ print_detected_harddisks_:                   ; 0xf722d LB 0x130
     push ax                                   ; 50
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 dc a3
+    call 0161ch                               ; e8 ee a3
     mov si, ax                                ; 89 c6
     mov byte [bp-00ch], 000h                  ; c6 46 f4 00
     xor cl, cl                                ; 30 c9
     xor ch, ch                                ; 30 ed
     mov dx, 002c0h                            ; ba c0 02
-    call 01600h                               ; e8 b0 a3
+    call 01600h                               ; e8 c2 a3
     mov byte [bp-00eh], al                    ; 88 46 f2
     xor bl, bl                                ; 30 db
     cmp bl, byte [bp-00eh]                    ; 3a 5e f2
-    jnc near 0732fh                           ; 0f 83 d3 00
+    jnc near 0731dh                           ; 0f 83 d3 00
     movzx dx, bl                              ; 0f b6 d3
     add dx, 002c1h                            ; 81 c2 c1 02
     mov ax, si                                ; 89 f0
-    call 01600h                               ; e8 98 a3
+    call 01600h                               ; e8 aa a3
     mov bh, al                                ; 88 c7
     cmp AL, strict byte 00ch                  ; 3c 0c
-    jc short 07292h                           ; 72 24
+    jc short 07280h                           ; 72 24
     test cl, cl                               ; 84 c9
-    jne short 0727fh                          ; 75 0d
+    jne short 0726dh                          ; 75 0d
     push 009afh                               ; 68 af 09
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 a8 a6
+    call 01922h                               ; e8 ba a6
     add sp, strict byte 00004h                ; 83 c4 04
     mov CL, strict byte 001h                  ; b1 01
     movzx ax, bl                              ; 0f b6 c3
@@ -10389,36 +10383,36 @@ print_detected_harddisks_:                   ; 0xf722d LB 0x130
     push ax                                   ; 50
     push 009c4h                               ; 68 c4 09
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 96 a6
+    call 01922h                               ; e8 a8 a6
     add sp, strict byte 00006h                ; 83 c4 06
-    jmp near 0732ah                           ; e9 98 00
+    jmp near 07318h                           ; e9 98 00
     cmp AL, strict byte 008h                  ; 3c 08
-    jc short 072a9h                           ; 72 13
+    jc short 07297h                           ; 72 13
     test ch, ch                               ; 84 ed
-    jne short 072a7h                          ; 75 0d
+    jne short 07295h                          ; 75 0d
     push 009d7h                               ; 68 d7 09
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 80 a6
+    call 01922h                               ; e8 92 a6
     add sp, strict byte 00004h                ; 83 c4 04
     mov CH, strict byte 001h                  ; b5 01
-    jmp short 0727fh                          ; eb d6
+    jmp short 0726dh                          ; eb d6
     cmp AL, strict byte 004h                  ; 3c 04
-    jnc short 072c4h                          ; 73 17
+    jnc short 072b2h                          ; 73 17
     cmp byte [bp-00ch], 000h                  ; 80 7e f4 00
-    jne short 072c4h                          ; 75 11
+    jne short 072b2h                          ; 75 11
     push 009ech                               ; 68 ec 09
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 67 a6
+    call 01922h                               ; e8 79 a6
     add sp, strict byte 00004h                ; 83 c4 04
     mov byte [bp-00ch], 001h                  ; c6 46 f4 01
-    jmp short 072dah                          ; eb 16
+    jmp short 072c8h                          ; eb 16
     cmp bh, 004h                              ; 80 ff 04
-    jc short 072dah                           ; 72 11
+    jc short 072c8h                           ; 72 11
     test cl, cl                               ; 84 c9
-    jne short 072dah                          ; 75 0d
+    jne short 072c8h                          ; 75 0d
     push 009feh                               ; 68 fe 09
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 4d a6
+    call 01922h                               ; e8 5f a6
     add sp, strict byte 00004h                ; 83 c4 04
     mov CL, strict byte 001h                  ; b1 01
     movzx ax, bl                              ; 0f b6 c3
@@ -10426,10 +10420,10 @@ print_detected_harddisks_:                   ; 0xf722d LB 0x130
     push ax                                   ; 50
     push 00a12h                               ; 68 12 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 3b a6
+    call 01922h                               ; e8 4d a6
     add sp, strict byte 00006h                ; 83 c4 06
     cmp bh, 004h                              ; 80 ff 04
-    jc short 072f2h                           ; 72 03
+    jc short 072e0h                           ; 72 03
     sub bh, 004h                              ; 80 ef 04
     movzx ax, bh                              ; 0f b6 c7
     cwd                                       ; 99
@@ -10437,41 +10431,41 @@ print_detected_harddisks_:                   ; 0xf722d LB 0x130
     ; sub ax, dx                                ; 2b c2
     sar ax, 1                                 ; d1 f8
     test ax, ax                               ; 85 c0
-    je short 07303h                           ; 74 05
+    je short 072f1h                           ; 74 05
     push 00a1ch                               ; 68 1c 0a
-    jmp short 07306h                          ; eb 03
+    jmp short 072f4h                          ; eb 03
     push 00a27h                               ; 68 27 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 17 a6
+    call 01922h                               ; e8 29 a6
     add sp, strict byte 00004h                ; 83 c4 04
     movzx ax, bh                              ; 0f b6 c7
     mov di, strict word 00002h                ; bf 02 00
     cwd                                       ; 99
     idiv di                                   ; f7 ff
     test dx, dx                               ; 85 d2
-    je short 07320h                           ; 74 05
+    je short 0730eh                           ; 74 05
     push 00a30h                               ; 68 30 0a
-    jmp short 07323h                          ; eb 03
+    jmp short 07311h                          ; eb 03
     push 00a36h                               ; 68 36 0a
     push di                                   ; 57
-    call 01922h                               ; e8 fb a5
+    call 01922h                               ; e8 0d a6
     add sp, strict byte 00004h                ; 83 c4 04
     db  0feh, 0c3h
     ; inc bl                                    ; fe c3
-    jmp near 07255h                           ; e9 26 ff
+    jmp near 07243h                           ; e9 26 ff
     cmp byte [bp-00ch], 000h                  ; 80 7e f4 00
-    jne short 07348h                          ; 75 13
+    jne short 07336h                          ; 75 13
     test cl, cl                               ; 84 c9
-    jne short 07348h                          ; 75 0f
+    jne short 07336h                          ; 75 0f
     test ch, ch                               ; 84 ed
-    jne short 07348h                          ; 75 0b
+    jne short 07336h                          ; 75 0b
     push 00a3dh                               ; 68 3d 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 dd a5
+    call 01922h                               ; e8 ef a5
     add sp, strict byte 00004h                ; 83 c4 04
     push 00a51h                               ; 68 51 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 d2 a5
+    call 01922h                               ; e8 e4 a5
     add sp, strict byte 00004h                ; 83 c4 04
     lea sp, [bp-00ah]                         ; 8d 66 f6
     pop di                                    ; 5f
@@ -10481,7 +10475,7 @@ print_detected_harddisks_:                   ; 0xf722d LB 0x130
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-get_boot_drive_:                             ; 0xf735d LB 0x28
+get_boot_drive_:                             ; 0xf734b LB 0x28
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -10489,12 +10483,12 @@ get_boot_drive_:                             ; 0xf735d LB 0x28
     mov bl, al                                ; 88 c3
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 af a2
+    call 0161ch                               ; e8 c1 a2
     mov dx, 002c0h                            ; ba c0 02
-    call 01600h                               ; e8 8d a2
+    call 01600h                               ; e8 9f a2
     sub bl, 002h                              ; 80 eb 02
     cmp bl, al                                ; 38 c3
-    jc short 0737ch                           ; 72 02
+    jc short 0736ah                           ; 72 02
     mov BL, strict byte 0ffh                  ; b3 ff
     mov al, bl                                ; 88 d8
     lea sp, [bp-004h]                         ; 8d 66 fc
@@ -10502,7 +10496,7 @@ get_boot_drive_:                             ; 0xf735d LB 0x28
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-show_logo_:                                  ; 0xf7385 LB 0x224
+show_logo_:                                  ; 0xf7373 LB 0x224
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -10513,7 +10507,7 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     sub sp, strict byte 0000ch                ; 83 ec 0c
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 83 a2
+    call 0161ch                               ; e8 95 a2
     mov si, ax                                ; 89 c6
     xor cl, cl                                ; 30 c9
     xor dx, dx                                ; 31 d2
@@ -10524,9 +10518,9 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     mov AL, strict byte 048h                  ; b0 48
     out strict byte 040h, AL                  ; e6 40
     movzx ax, dl                              ; 0f b6 c2
-    call 07219h                               ; e8 68 fe
+    call 07207h                               ; e8 68 fe
     cmp ax, 066bbh                            ; 3d bb 66
-    jne near 07489h                           ; 0f 85 d1 00
+    jne near 07477h                           ; 0f 85 d1 00
     push SS                                   ; 16
     pop ES                                    ; 07
     lea di, [bp-016h]                         ; 8d 7e ea
@@ -10534,119 +10528,119 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     int 010h                                  ; cd 10
     mov word [es:di], bx                      ; 26 89 1d
     cmp ax, strict word 0004fh                ; 3d 4f 00
-    jne near 07489h                           ; 0f 85 bd 00
+    jne near 07477h                           ; 0f 85 bd 00
     mov al, dl                                ; 88 d0
     add AL, strict byte 004h                  ; 04 04
     xor ah, ah                                ; 30 e4
-    call 07203h                               ; e8 2e fe
+    call 071f1h                               ; e8 2e fe
     mov ch, al                                ; 88 c5
     mov byte [bp-00ch], al                    ; 88 46 f4
     mov al, dl                                ; 88 d0
     add AL, strict byte 005h                  ; 04 05
     xor ah, ah                                ; 30 e4
-    call 07203h                               ; e8 20 fe
+    call 071f1h                               ; e8 20 fe
     mov dh, al                                ; 88 c6
     mov byte [bp-010h], al                    ; 88 46 f0
     mov al, dl                                ; 88 d0
     add AL, strict byte 002h                  ; 04 02
     xor ah, ah                                ; 30 e4
-    call 07219h                               ; e8 28 fe
+    call 07207h                               ; e8 28 fe
     mov bx, ax                                ; 89 c3
     mov word [bp-014h], ax                    ; 89 46 ec
     mov al, dl                                ; 88 d0
     add AL, strict byte 006h                  ; 04 06
     xor ah, ah                                ; 30 e4
-    call 07203h                               ; e8 04 fe
+    call 071f1h                               ; e8 04 fe
     mov byte [bp-012h], al                    ; 88 46 ee
     test ch, ch                               ; 84 ed
-    jne short 07410h                          ; 75 0a
+    jne short 073feh                          ; 75 0a
     test dh, dh                               ; 84 f6
-    jne short 07410h                          ; 75 06
+    jne short 073feh                          ; 75 06
     test bx, bx                               ; 85 db
-    je near 07489h                            ; 0f 84 79 00
+    je near 07477h                            ; 0f 84 79 00
     mov bx, 00142h                            ; bb 42 01
     mov ax, 04f02h                            ; b8 02 4f
     int 010h                                  ; cd 10
     cmp byte [bp-00ch], 000h                  ; 80 7e f4 00
-    je short 07441h                           ; 74 23
+    je short 0742fh                           ; 74 23
     xor bx, bx                                ; 31 db
-    jmp short 07428h                          ; eb 06
+    jmp short 07416h                          ; eb 06
     inc bx                                    ; 43
     cmp bx, strict byte 00010h                ; 83 fb 10
-    jnbe short 07448h                         ; 77 20
+    jnbe short 07436h                         ; 77 20
     mov ax, bx                                ; 89 d8
     or ah, 002h                               ; 80 cc 02
     mov dx, 003b8h                            ; ba b8 03
     out DX, ax                                ; ef
     xor dx, dx                                ; 31 d2
     mov ax, strict word 00001h                ; b8 01 00
-    call 07151h                               ; e8 18 fd
+    call 0713fh                               ; e8 18 fd
     cmp AL, strict byte 086h                  ; 3c 86
-    jne short 07422h                          ; 75 e5
+    jne short 07410h                          ; 75 e5
     mov CL, strict byte 001h                  ; b1 01
-    jmp short 07448h                          ; eb 07
+    jmp short 07436h                          ; eb 07
     mov ax, 00210h                            ; b8 10 02
     mov dx, 003b8h                            ; ba b8 03
     out DX, ax                                ; ef
     test cl, cl                               ; 84 c9
-    jne short 0745eh                          ; 75 12
+    jne short 0744ch                          ; 75 12
     mov ax, word [bp-014h]                    ; 8b 46 ec
     shr ax, 004h                              ; c1 e8 04
     mov dx, strict word 00001h                ; ba 01 00
-    call 07151h                               ; e8 f9 fc
+    call 0713fh                               ; e8 f9 fc
     cmp AL, strict byte 086h                  ; 3c 86
-    jne short 0745eh                          ; 75 02
+    jne short 0744ch                          ; 75 02
     mov CL, strict byte 001h                  ; b1 01
     cmp byte [bp-010h], 000h                  ; 80 7e f0 00
-    je short 07489h                           ; 74 25
+    je short 07477h                           ; 74 25
     test cl, cl                               ; 84 c9
-    jne short 07489h                          ; 75 21
+    jne short 07477h                          ; 75 21
     mov bx, strict word 00010h                ; bb 10 00
-    jmp short 07472h                          ; eb 05
+    jmp short 07460h                          ; eb 05
     dec bx                                    ; 4b
     test bx, bx                               ; 85 db
-    jbe short 07489h                          ; 76 17
+    jbe short 07477h                          ; 76 17
     mov ax, bx                                ; 89 d8
     or ah, 002h                               ; 80 cc 02
     mov dx, 003b8h                            ; ba b8 03
     out DX, ax                                ; ef
     xor dx, dx                                ; 31 d2
     mov ax, strict word 00001h                ; b8 01 00
-    call 07151h                               ; e8 ce fc
+    call 0713fh                               ; e8 ce fc
     cmp AL, strict byte 086h                  ; 3c 86
-    jne short 0746dh                          ; 75 e6
+    jne short 0745bh                          ; 75 e6
     mov CL, strict byte 001h                  ; b1 01
     xor bx, bx                                ; 31 db
     mov dx, 00339h                            ; ba 39 03
     mov ax, si                                ; 89 f0
-    call 0160eh                               ; e8 7b a1
+    call 0160eh                               ; e8 8d a1
     mov AL, strict byte 003h                  ; b0 03
     mov AH, strict byte 000h                  ; b4 00
     int 010h                                  ; cd 10
     cmp byte [bp-012h], 000h                  ; 80 7e ee 00
-    je near 0758ah                            ; 0f 84 e9 00
+    je near 07578h                            ; 0f 84 e9 00
     cmp byte [bp-00ch], 000h                  ; 80 7e f4 00
-    jne short 074d7h                          ; 75 30
+    jne short 074c5h                          ; 75 30
     cmp byte [bp-010h], 000h                  ; 80 7e f0 00
-    jne short 074d7h                          ; 75 2a
+    jne short 074c5h                          ; 75 2a
     cmp word [bp-014h], strict byte 00000h    ; 83 7e ec 00
-    jne short 074d7h                          ; 75 24
+    jne short 074c5h                          ; 75 24
     cmp byte [bp-012h], 002h                  ; 80 7e ee 02
-    jne short 074c4h                          ; 75 0b
+    jne short 074b2h                          ; 75 0b
     push 00a53h                               ; 68 53 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 61 a4
+    call 01922h                               ; e8 73 a4
     add sp, strict byte 00004h                ; 83 c4 04
     test cl, cl                               ; 84 c9
-    jne short 074d7h                          ; 75 0f
+    jne short 074c5h                          ; 75 0f
     mov dx, strict word 00001h                ; ba 01 00
     mov ax, 000c0h                            ; b8 c0 00
-    call 07151h                               ; e8 80 fc
+    call 0713fh                               ; e8 80 fc
     cmp AL, strict byte 086h                  ; 3c 86
-    jne short 074d7h                          ; 75 02
+    jne short 074c5h                          ; 75 02
     mov CL, strict byte 001h                  ; b1 01
     test cl, cl                               ; 84 c9
-    je near 0758ah                            ; 0f 84 ad 00
+    je near 07578h                            ; 0f 84 ad 00
     mov byte [bp-00eh], 000h                  ; c6 46 f2 00
     mov ax, 00100h                            ; b8 00 01
     mov cx, 01000h                            ; b9 00 10
@@ -10665,54 +10659,54 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     int 010h                                  ; cd 10
     push 00a75h                               ; 68 75 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 1c a4
+    call 01922h                               ; e8 2e a4
     add sp, strict byte 00004h                ; 83 c4 04
-    call 0722dh                               ; e8 21 fd
+    call 0721bh                               ; e8 21 fd
     push 00ab9h                               ; 68 b9 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 0e a4
+    call 01922h                               ; e8 20 a4
     add sp, strict byte 00004h                ; 83 c4 04
     mov dx, strict word 00001h                ; ba 01 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 07151h                               ; e8 31 fc
+    call 0713fh                               ; e8 31 fc
     mov bl, al                                ; 88 c3
     test al, al                               ; 84 c0
-    je short 07517h                           ; 74 f1
+    je short 07505h                           ; 74 f1
     cmp AL, strict byte 030h                  ; 3c 30
-    je short 07578h                           ; 74 4e
+    je short 07566h                           ; 74 4e
     cmp bl, 002h                              ; 80 fb 02
-    jc short 07551h                           ; 72 22
+    jc short 0753fh                           ; 72 22
     cmp bl, 009h                              ; 80 fb 09
-    jnbe short 07551h                         ; 77 1d
+    jnbe short 0753fh                         ; 77 1d
     movzx ax, bl                              ; 0f b6 c3
-    call 0735dh                               ; e8 23 fe
+    call 0734bh                               ; e8 23 fe
     cmp AL, strict byte 0ffh                  ; 3c ff
-    jne short 07540h                          ; 75 02
-    jmp short 07517h                          ; eb d7
+    jne short 0752eh                          ; 75 02
+    jmp short 07505h                          ; eb d7
     movzx bx, al                              ; 0f b6 d8
     mov dx, 00338h                            ; ba 38 03
     mov ax, si                                ; 89 f0
-    call 0160eh                               ; e8 c3 a0
+    call 0160eh                               ; e8 d5 a0
     mov byte [bp-00eh], 002h                  ; c6 46 f2 02
-    jmp short 07578h                          ; eb 27
+    jmp short 07566h                          ; eb 27
     cmp bl, 02eh                              ; 80 fb 2e
-    je short 07566h                           ; 74 10
+    je short 07554h                           ; 74 10
     cmp bl, 026h                              ; 80 fb 26
-    je short 0756ch                           ; 74 11
+    je short 0755ah                           ; 74 11
     cmp bl, 021h                              ; 80 fb 21
-    jne short 07572h                          ; 75 12
+    jne short 07560h                          ; 75 12
     mov byte [bp-00eh], 001h                  ; c6 46 f2 01
-    jmp short 07578h                          ; eb 12
+    jmp short 07566h                          ; eb 12
     mov byte [bp-00eh], 003h                  ; c6 46 f2 03
-    jmp short 07578h                          ; eb 0c
+    jmp short 07566h                          ; eb 0c
     mov byte [bp-00eh], 004h                  ; c6 46 f2 04
-    jmp short 07578h                          ; eb 06
+    jmp short 07566h                          ; eb 06
     cmp byte [bp-00eh], 000h                  ; 80 7e f2 00
-    je short 07517h                           ; 74 9f
+    je short 07505h                           ; 74 9f
     movzx bx, byte [bp-00eh]                  ; 0f b6 5e f2
     mov dx, 00339h                            ; ba 39 03
     mov ax, si                                ; 89 f0
-    call 0160eh                               ; e8 8a a0
+    call 0160eh                               ; e8 9c a0
     mov AL, strict byte 003h                  ; b0 03
     mov AH, strict byte 000h                  ; b4 00
     int 010h                                  ; cd 10
@@ -10725,7 +10719,7 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     pushad                                    ; 66 60
     push DS                                   ; 1e
     mov ds, ax                                ; 8e d8
-    call 0edbfh                               ; e8 23 78
+    call 0edbfh                               ; e8 35 78
     pop DS                                    ; 1f
     popad                                     ; 66 61
     lea sp, [bp-00ah]                         ; 8d 66 f6
@@ -10736,14 +10730,14 @@ show_logo_:                                  ; 0xf7385 LB 0x224
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-delay_boot_:                                 ; 0xf75a9 LB 0x67
+delay_boot_:                                 ; 0xf7597 LB 0x67
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
     push dx                                   ; 52
     mov dx, ax                                ; 89 c2
     test ax, ax                               ; 85 c0
-    je short 07609h                           ; 74 55
+    je short 075f7h                           ; 74 55
     mov AL, strict byte 034h                  ; b0 34
     out strict byte 043h, AL                  ; e6 43
     mov AL, strict byte 0d3h                  ; b0 d3
@@ -10753,24 +10747,24 @@ delay_boot_:                                 ; 0xf75a9 LB 0x67
     push dx                                   ; 52
     push 00b03h                               ; 68 03 0b
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 59 a3
+    call 01922h                               ; e8 6b a3
     add sp, strict byte 00006h                ; 83 c4 06
     mov bx, dx                                ; 89 d3
     test bx, bx                               ; 85 db
-    jbe short 075e9h                          ; 76 17
+    jbe short 075d7h                          ; 76 17
     push bx                                   ; 53
     push 00b21h                               ; 68 21 0b
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 47 a3
+    call 01922h                               ; e8 59 a3
     add sp, strict byte 00006h                ; 83 c4 06
     xor dx, dx                                ; 31 d2
     mov ax, strict word 00040h                ; b8 40 00
-    call 07151h                               ; e8 6b fb
+    call 0713fh                               ; e8 6b fb
     dec bx                                    ; 4b
-    jmp short 075ceh                          ; eb e5
+    jmp short 075bch                          ; eb e5
     push 00a51h                               ; 68 51 0a
     push strict byte 00002h                   ; 6a 02
-    call 01922h                               ; e8 31 a3
+    call 01922h                               ; e8 43 a3
     add sp, strict byte 00004h                ; 83 c4 04
     mov AL, strict byte 034h                  ; b0 34
     out strict byte 043h, AL                  ; e6 43
@@ -10781,7 +10775,7 @@ delay_boot_:                                 ; 0xf75a9 LB 0x67
     pushad                                    ; 66 60
     push DS                                   ; 1e
     mov ds, ax                                ; 8e d8
-    call 0edbfh                               ; e8 b9 77
+    call 0edbfh                               ; e8 cb 77
     pop DS                                    ; 1f
     popad                                     ; 66 61
     lea sp, [bp-004h]                         ; 8d 66 fc
@@ -10789,7 +10783,7 @@ delay_boot_:                                 ; 0xf75a9 LB 0x67
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-scsi_cmd_data_in_:                           ; 0xf7610 LB 0xb2
+scsi_cmd_data_in_:                           ; 0xf75fe LB 0xb2
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -10805,13 +10799,13 @@ scsi_cmd_data_in_:                           ; 0xf7610 LB 0xb2
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 07626h                          ; 75 f7
+    jne short 07614h                          ; 75 f7
     mov ax, bx                                ; 89 d8
     mov dx, word [bp+00ch]                    ; 8b 56 0c
     mov cx, strict word 0000ch                ; b9 0c 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 07637h                               ; e2 fa
+    loop 07625h                               ; e2 fa
     and ax, 000f0h                            ; 25 f0 00
     movzx cx, byte [bp+004h]                  ; 0f b6 4e 04
     or cx, ax                                 ; 09 c1
@@ -10829,31 +10823,31 @@ scsi_cmd_data_in_:                           ; 0xf7610 LB 0xb2
     mov cx, strict word 00008h                ; b9 08 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 0765dh                               ; e2 fa
+    loop 0764bh                               ; e2 fa
     mov dx, si                                ; 89 f2
     out DX, AL                                ; ee
     xor cx, cx                                ; 31 c9
     movzx ax, byte [bp+004h]                  ; 0f b6 46 04
     cmp cx, ax                                ; 39 c1
-    jnc short 0767eh                          ; 73 0e
+    jnc short 0766ch                          ; 73 0e
     les di, [bp-00ah]                         ; c4 7e f6
     add di, cx                                ; 01 cf
     mov al, byte [es:di]                      ; 26 8a 05
     mov dx, si                                ; 89 f2
     out DX, AL                                ; ee
     inc cx                                    ; 41
-    jmp short 07668h                          ; eb ea
+    jmp short 07656h                          ; eb ea
     mov dx, si                                ; 89 f2
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 0767eh                          ; 75 f7
+    jne short 0766ch                          ; 75 f7
     lea dx, [si+001h]                         ; 8d 54 01
     cmp word [bp+00ch], strict byte 00000h    ; 83 7e 0c 00
-    jne short 07696h                          ; 75 06
+    jne short 07684h                          ; 75 06
     cmp bx, 08000h                            ; 81 fb 00 80
-    jbe short 076b0h                          ; 76 1a
+    jbe short 0769eh                          ; 76 1a
     mov cx, 08000h                            ; b9 00 80
     les di, [bp+006h]                         ; c4 7e 06
     rep insb                                  ; f3 6c
@@ -10862,7 +10856,7 @@ scsi_cmd_data_in_:                           ; 0xf7610 LB 0xb2
     mov ax, es                                ; 8c c0
     add ax, 00800h                            ; 05 00 08
     mov word [bp+008h], ax                    ; 89 46 08
-    jmp short 07687h                          ; eb d7
+    jmp short 07675h                          ; eb d7
     mov cx, bx                                ; 89 d9
     les di, [bp+006h]                         ; c4 7e 06
     rep insb                                  ; f3 6c
@@ -10872,7 +10866,7 @@ scsi_cmd_data_in_:                           ; 0xf7610 LB 0xb2
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 0000ah                               ; c2 0a 00
-scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
+scsi_cmd_data_out_:                          ; 0xf76b0 LB 0xb4
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -10888,13 +10882,13 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 076d8h                          ; 75 f7
+    jne short 076c6h                          ; 75 f7
     mov ax, bx                                ; 89 d8
     mov dx, word [bp+00ch]                    ; 8b 56 0c
     mov cx, strict word 0000ch                ; b9 0c 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 076e9h                               ; e2 fa
+    loop 076d7h                               ; e2 fa
     and ax, 000f0h                            ; 25 f0 00
     movzx cx, byte [bp+004h]                  ; 0f b6 4e 04
     or cx, ax                                 ; 09 c1
@@ -10912,25 +10906,25 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov cx, strict word 00008h                ; b9 08 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 0770fh                               ; e2 fa
+    loop 076fdh                               ; e2 fa
     mov dx, di                                ; 89 fa
     out DX, AL                                ; ee
     xor cx, cx                                ; 31 c9
     movzx ax, byte [bp+004h]                  ; 0f b6 46 04
     cmp cx, ax                                ; 39 c1
-    jnc short 07730h                          ; 73 0e
+    jnc short 0771eh                          ; 73 0e
     les si, [bp-00ah]                         ; c4 76 f6
     add si, cx                                ; 01 ce
     mov al, byte [es:si]                      ; 26 8a 04
     mov dx, di                                ; 89 fa
     out DX, AL                                ; ee
     inc cx                                    ; 41
-    jmp short 0771ah                          ; eb ea
+    jmp short 07708h                          ; eb ea
     lea dx, [di+001h]                         ; 8d 55 01
     cmp word [bp+00ch], strict byte 00000h    ; 83 7e 0c 00
-    jne short 0773fh                          ; 75 06
+    jne short 0772dh                          ; 75 06
     cmp bx, 08000h                            ; 81 fb 00 80
-    jbe short 0775ah                          ; 76 1b
+    jbe short 07748h                          ; 76 1b
     mov cx, 08000h                            ; b9 00 80
     les si, [bp+006h]                         ; c4 76 06
     db  0f3h, 026h, 06eh
@@ -10940,7 +10934,7 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov ax, es                                ; 8c c0
     add ax, 00800h                            ; 05 00 08
     mov word [bp+008h], ax                    ; 89 46 08
-    jmp short 07730h                          ; eb d6
+    jmp short 0771eh                          ; eb d6
     mov cx, bx                                ; 89 d9
     les si, [bp+006h]                         ; c4 76 06
     db  0f3h, 026h, 06eh
@@ -10950,14 +10944,14 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 07762h                          ; 75 f7
+    jne short 07750h                          ; 75 f7
     xor ax, ax                                ; 31 c0
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 0000ah                               ; c2 0a 00
- at scsi_read_sectors:                          ; 0xf7776 LB 0xb6
+ at scsi_read_sectors:                          ; 0xf7764 LB 0xb6
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -10968,12 +10962,12 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov bl, byte [es:si+008h]                 ; 26 8a 5c 08
     sub bl, 008h                              ; 80 eb 08
     cmp bl, 004h                              ; 80 fb 04
-    jbe short 0779fh                          ; 76 0f
+    jbe short 0778dh                          ; 76 0f
     movzx ax, bl                              ; 0f b6 c3
     push ax                                   ; 50
     push 00b26h                               ; 68 26 0b
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 86 a1
+    call 01922h                               ; e8 98 a1
     add sp, strict byte 00006h                ; 83 c4 06
     mov es, [bp+006h]                         ; 8e 46 06
     mov di, word [es:si+00ah]                 ; 26 8b 7c 0a
@@ -11000,7 +10994,7 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov cx, strict word 00009h                ; b9 09 00
     sal word [bp-008h], 1                     ; d1 66 f8
     rcl word [bp-006h], 1                     ; d1 56 fa
-    loop 077e8h                               ; e2 f8
+    loop 077d6h                               ; e2 f8
     push dword [bp-008h]                      ; 66 ff 76 f8
     db  066h, 026h, 0ffh, 074h, 004h
     ; push dword [es:si+004h]                   ; 66 26 ff 74 04
@@ -11008,10 +11002,10 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     xor dh, dh                                ; 30 f6
     mov cx, ss                                ; 8c d1
     lea bx, [bp-012h]                         ; 8d 5e ee
-    call 07610h                               ; e8 0b fe
+    call 075feh                               ; e8 0b fe
     mov ah, al                                ; 88 c4
     test al, al                               ; 84 c0
-    jne short 07820h                          ; 75 15
+    jne short 0780eh                          ; 75 15
     mov es, [bp+006h]                         ; 8e 46 06
     mov word [es:si+014h], di                 ; 26 89 7c 14
     mov dx, word [bp-008h]                    ; 8b 56 f8
@@ -11024,7 +11018,7 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 00004h                               ; c2 04 00
- at scsi_write_sectors:                         ; 0xf782c LB 0xb6
+ at scsi_write_sectors:                         ; 0xf781a LB 0xb6
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -11035,12 +11029,12 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov bl, byte [es:si+008h]                 ; 26 8a 5c 08
     sub bl, 008h                              ; 80 eb 08
     cmp bl, 004h                              ; 80 fb 04
-    jbe short 07855h                          ; 76 0f
+    jbe short 07843h                          ; 76 0f
     movzx ax, bl                              ; 0f b6 c3
     push ax                                   ; 50
     push 00b54h                               ; 68 54 0b
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 d0 a0
+    call 01922h                               ; e8 e2 a0
     add sp, strict byte 00006h                ; 83 c4 06
     mov es, [bp+006h]                         ; 8e 46 06
     mov di, word [es:si+00ah]                 ; 26 8b 7c 0a
@@ -11067,7 +11061,7 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     mov cx, strict word 00009h                ; b9 09 00
     sal word [bp-008h], 1                     ; d1 66 f8
     rcl word [bp-006h], 1                     ; d1 56 fa
-    loop 0789eh                               ; e2 f8
+    loop 0788ch                               ; e2 f8
     push dword [bp-008h]                      ; 66 ff 76 f8
     db  066h, 026h, 0ffh, 074h, 004h
     ; push dword [es:si+004h]                   ; 66 26 ff 74 04
@@ -11075,10 +11069,10 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     xor dh, dh                                ; 30 f6
     mov cx, ss                                ; 8c d1
     lea bx, [bp-012h]                         ; 8d 5e ee
-    call 076c2h                               ; e8 07 fe
+    call 076b0h                               ; e8 07 fe
     mov ah, al                                ; 88 c4
     test al, al                               ; 84 c0
-    jne short 078d6h                          ; 75 15
+    jne short 078c4h                          ; 75 15
     mov es, [bp+006h]                         ; 8e 46 06
     mov word [es:si+014h], di                 ; 26 89 7c 14
     mov dx, word [bp-008h]                    ; 8b 56 f8
@@ -11091,7 +11085,7 @@ scsi_cmd_data_out_:                          ; 0xf76c2 LB 0xb4
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 00004h                               ; c2 04 00
-scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
+scsi_cmd_packet_:                            ; 0xf78d0 LB 0x166
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -11103,22 +11097,22 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     mov word [bp-00ah], cx                    ; 89 4e f6
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 1e 9d
+    call 0161ch                               ; e8 30 9d
     mov si, 00122h                            ; be 22 01
     mov word [bp-00eh], ax                    ; 89 46 f2
     cmp byte [bp+00ah], 002h                  ; 80 7e 0a 02
-    jne short 07929h                          ; 75 1f
+    jne short 07917h                          ; 75 1f
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 cc 9f
+    call 018e1h                               ; e8 de 9f
     push 00b83h                               ; 68 83 0b
     push 00b93h                               ; 68 93 0b
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 02 a0
+    call 01922h                               ; e8 14 a0
     add sp, strict byte 00006h                ; 83 c4 06
     mov dx, strict word 00001h                ; ba 01 00
-    jmp near 07a3dh                           ; e9 14 01
+    jmp near 07a2bh                           ; e9 14 01
     sub di, strict byte 00008h                ; 83 ef 08
     sal di, 002h                              ; c1 e7 02
     sub byte [bp-006h], 002h                  ; 80 6e fa 02
@@ -11132,7 +11126,7 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 07945h                          ; 75 f7
+    jne short 07933h                          ; 75 f7
     xor ax, ax                                ; 31 c0
     mov dx, word [bp+006h]                    ; 8b 56 06
     add dx, word [bp+004h]                    ; 03 56 04
@@ -11148,7 +11142,7 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     mov cx, strict word 0000ch                ; b9 0c 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 07970h                               ; e2 fa
+    loop 0795eh                               ; e2 fa
     and ax, 000f0h                            ; 25 f0 00
     movzx cx, byte [bp-006h]                  ; 0f b6 4e fa
     or cx, ax                                 ; 09 c1
@@ -11166,28 +11160,28 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     mov cx, strict word 00008h                ; b9 08 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 07997h                               ; e2 fa
+    loop 07985h                               ; e2 fa
     mov dx, bx                                ; 89 da
     out DX, AL                                ; ee
     xor cx, cx                                ; 31 c9
     movzx ax, byte [bp-006h]                  ; 0f b6 46 fa
     cmp cx, ax                                ; 39 c1
-    jnc short 079b8h                          ; 73 0e
+    jnc short 079a6h                          ; 73 0e
     les di, [bp-00ch]                         ; c4 7e f4
     add di, cx                                ; 01 cf
     mov al, byte [es:di]                      ; 26 8a 05
     mov dx, bx                                ; 89 da
     out DX, AL                                ; ee
     inc cx                                    ; 41
-    jmp short 079a2h                          ; eb ea
+    jmp short 07990h                          ; eb ea
     mov dx, bx                                ; 89 da
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     test AL, strict byte 001h                 ; a8 01
-    jne short 079b8h                          ; 75 f7
+    jne short 079a6h                          ; 75 f7
     test AL, strict byte 002h                 ; a8 02
-    je short 079d3h                           ; 74 0e
+    je short 079c1h                           ; 74 0e
     lea dx, [bx+003h]                         ; 8d 57 03
     xor al, al                                ; 30 c0
     out DX, AL                                ; ee
@@ -11195,14 +11189,14 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     mov dx, strict word 00003h                ; ba 03 00
-    jmp short 07a3dh                          ; eb 6a
+    jmp short 07a2bh                          ; eb 6a
     mov ax, word [bp+004h]                    ; 8b 46 04
     test ax, ax                               ; 85 c0
-    je short 079e2h                           ; 74 08
+    je short 079d0h                           ; 74 08
     lea dx, [bx+001h]                         ; 8d 57 01
     mov cx, ax                                ; 89 c1
     in AL, DX                                 ; ec
-    loop 079dfh                               ; e2 fd
+    loop 079cdh                               ; e2 fd
     mov ax, word [bp+006h]                    ; 8b 46 06
     mov es, [bp-00eh]                         ; 8e 46 f2
     mov word [es:si+016h], ax                 ; 26 89 44 16
@@ -11210,9 +11204,9 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     mov word [es:si+018h], ax                 ; 26 89 44 18
     lea ax, [bx+001h]                         ; 8d 47 01
     cmp word [bp+008h], strict byte 00000h    ; 83 7e 08 00
-    jne short 07a03h                          ; 75 07
+    jne short 079f1h                          ; 75 07
     cmp word [bp+006h], 08000h                ; 81 7e 06 00 80
-    jbe short 07a20h                          ; 76 1d
+    jbe short 07a0eh                          ; 76 1d
     mov dx, ax                                ; 89 c2
     mov cx, 08000h                            ; b9 00 80
     les di, [bp+00ch]                         ; c4 7e 0c
@@ -11222,17 +11216,17 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     mov ax, es                                ; 8c c0
     add ax, 00800h                            ; 05 00 08
     mov word [bp+00eh], ax                    ; 89 46 0e
-    jmp short 079f3h                          ; eb d3
+    jmp short 079e1h                          ; eb d3
     mov dx, ax                                ; 89 c2
     mov cx, word [bp+006h]                    ; 8b 4e 06
     les di, [bp+00ch]                         ; c4 7e 0c
     rep insb                                  ; f3 6c
     mov es, [bp-00eh]                         ; 8e 46 f2
     cmp word [es:si+01ch], strict byte 00000h ; 26 83 7c 1c 00
-    je short 07a3bh                           ; 74 07
+    je short 07a29h                           ; 74 07
     mov cx, word [es:si+01ch]                 ; 26 8b 4c 1c
     in AL, DX                                 ; ec
-    loop 07a38h                               ; e2 fd
+    loop 07a26h                               ; e2 fd
     xor dx, dx                                ; 31 d2
     mov ax, dx                                ; 89 d0
     lea sp, [bp-004h]                         ; 8d 66 fc
@@ -11240,7 +11234,7 @@ scsi_cmd_packet_:                            ; 0xf78e2 LB 0x166
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 0000ch                               ; c2 0c 00
-scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
+scsi_enumerate_attached_devices_:            ; 0xf7a36 LB 0x3e5
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -11252,19 +11246,19 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     push ax                                   ; 50
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 be 9b
+    call 0161ch                               ; e8 d0 9b
     mov si, 00122h                            ; be 22 01
     mov word [bp-01ah], ax                    ; 89 46 e6
     mov word [bp-010h], strict word 00000h    ; c7 46 f0 00 00
-    jmp near 07dbbh                           ; e9 4f 03
+    jmp near 07da9h                           ; e9 4f 03
     mov es, [bp-01ah]                         ; 8e 46 e6
     cmp byte [es:si+001e8h], 004h             ; 26 80 bc e8 01 04
-    jnc near 07e23h                           ; 0f 83 aa 03
+    jnc near 07e11h                           ; 0f 83 aa 03
     mov cx, strict word 0000ah                ; b9 0a 00
     xor bx, bx                                ; 31 db
     mov dx, ss                                ; 8c d2
     lea ax, [bp-026h]                         ; 8d 46 da
-    call 0948ah                               ; e8 04 1a
+    call 094cah                               ; e8 56 1a
     mov byte [bp-026h], 025h                  ; c6 46 da 25
     push dword 000000008h                     ; 66 6a 08
     lea dx, [bp-00226h]                       ; 8d 96 da fd
@@ -11275,13 +11269,13 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov cx, ss                                ; 8c d1
     lea bx, [bp-026h]                         ; 8d 5e da
     mov ax, word [bp-00228h]                  ; 8b 86 d8 fd
-    call 07610h                               ; e8 6b fb
+    call 075feh                               ; e8 6b fb
     test al, al                               ; 84 c0
-    je short 07ab7h                           ; 74 0e
+    je short 07aa5h                           ; 74 0e
     push 00bb3h                               ; 68 b3 0b
     push 00bech                               ; 68 ec 0b
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 6e 9e
+    call 01922h                               ; e8 80 9e
     add sp, strict byte 00006h                ; 83 c4 06
     movzx ax, byte [bp-00225h]                ; 0f b6 86 db fd
     movzx di, byte [bp-00226h]                ; 0f b6 be da fd
@@ -11293,7 +11287,7 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov cx, strict word 00008h                ; b9 08 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 07ad2h                               ; e2 fa
+    loop 07ac0h                               ; e2 fa
     or bx, ax                                 ; 09 c3
     or dx, di                                 ; 09 fa
     movzx ax, byte [bp-00223h]                ; 0f b6 86 dd fd
@@ -11310,65 +11304,65 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov cx, strict word 00008h                ; b9 08 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 07b04h                               ; e2 fa
+    loop 07af2h                               ; e2 fa
     or ax, bx                                 ; 09 d8
     or dx, di                                 ; 09 fa
     movzx bx, byte [bp-0021fh]                ; 0f b6 9e e1 fd
     or ax, bx                                 ; 09 d8
     mov word [bp-016h], ax                    ; 89 46 ea
     test dx, dx                               ; 85 d2
-    jne short 07b21h                          ; 75 05
+    jne short 07b0fh                          ; 75 05
     cmp ax, 00200h                            ; 3d 00 02
-    je short 07b41h                           ; 74 20
+    je short 07b2fh                           ; 74 20
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 b5 9d
+    call 018e1h                               ; e8 c7 9d
     push dx                                   ; 52
     push word [bp-016h]                       ; ff 76 ea
     push word [bp-010h]                       ; ff 76 f0
     push 00c0bh                               ; 68 0b 0c
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 e7 9d
+    call 01922h                               ; e8 f9 9d
     add sp, strict byte 0000ah                ; 83 c4 0a
-    jmp near 07db2h                           ; e9 71 02
+    jmp near 07da0h                           ; e9 71 02
     mov es, [bp-01ah]                         ; 8e 46 e6
     mov al, byte [es:si+001e8h]               ; 26 8a 84 e8 01
     mov byte [bp-00ch], al                    ; 88 46 f4
     cmp AL, strict byte 001h                  ; 3c 01
-    jc short 07b5ch                           ; 72 0c
-    jbe short 07b64h                          ; 76 12
+    jc short 07b4ah                           ; 72 0c
+    jbe short 07b52h                          ; 76 12
     cmp AL, strict byte 003h                  ; 3c 03
-    je short 07b6ch                           ; 74 16
+    je short 07b5ah                           ; 74 16
     cmp AL, strict byte 002h                  ; 3c 02
-    je short 07b68h                           ; 74 0e
-    jmp short 07bb8h                          ; eb 5c
+    je short 07b56h                           ; 74 0e
+    jmp short 07ba6h                          ; eb 5c
     test al, al                               ; 84 c0
-    jne short 07bb8h                          ; 75 58
+    jne short 07ba6h                          ; 75 58
     mov BL, strict byte 090h                  ; b3 90
-    jmp short 07b6eh                          ; eb 0a
+    jmp short 07b5ch                          ; eb 0a
     mov BL, strict byte 098h                  ; b3 98
-    jmp short 07b6eh                          ; eb 06
+    jmp short 07b5ch                          ; eb 06
     mov BL, strict byte 0a0h                  ; b3 a0
-    jmp short 07b6eh                          ; eb 02
+    jmp short 07b5ch                          ; eb 02
     mov BL, strict byte 0a8h                  ; b3 a8
     mov al, bl                                ; 88 d8
     add AL, strict byte 007h                  ; 04 07
     movzx cx, al                              ; 0f b6 c8
     mov ax, cx                                ; 89 c8
-    call 0165ch                               ; e8 e2 9a
+    call 0165ch                               ; e8 f4 9a
     test al, al                               ; 84 c0
-    je short 07bb8h                           ; 74 3a
+    je short 07ba6h                           ; 74 3a
     mov al, bl                                ; 88 d8
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     xor ah, ah                                ; 30 e4
-    call 0165ch                               ; e8 d5 9a
+    call 0165ch                               ; e8 e7 9a
     xor ah, ah                                ; 30 e4
     mov dx, ax                                ; 89 c2
     sal dx, 008h                              ; c1 e2 08
     movzx ax, bl                              ; 0f b6 c3
-    call 0165ch                               ; e8 c8 9a
+    call 0165ch                               ; e8 da 9a
     xor ah, ah                                ; 30 e4
     add ax, dx                                ; 01 d0
     cwd                                       ; 99
@@ -11377,26 +11371,26 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov al, bl                                ; 88 d8
     add AL, strict byte 002h                  ; 04 02
     xor ah, ah                                ; 30 e4
-    call 0165ch                               ; e8 b5 9a
+    call 0165ch                               ; e8 c7 9a
     xor ah, ah                                ; 30 e4
     mov word [bp-014h], ax                    ; 89 46 ec
     mov ax, cx                                ; 89 c8
-    call 0165ch                               ; e8 ab 9a
+    call 0165ch                               ; e8 bd 9a
     xor ah, ah                                ; 30 e4
     mov word [bp-01ch], ax                    ; 89 46 e4
-    jmp short 07bfdh                          ; eb 45
+    jmp short 07bebh                          ; eb 45
     mov ax, word [bp-018h]                    ; 8b 46 e8
     cmp ax, strict word 00040h                ; 3d 40 00
-    jnbe short 07bc2h                         ; 77 02
-    jne short 07bceh                          ; 75 0c
+    jnbe short 07bb0h                         ; 77 02
+    jne short 07bbch                          ; 75 0c
     mov word [bp-014h], 000ffh                ; c7 46 ec ff 00
     mov word [bp-01ch], strict word 0003fh    ; c7 46 e4 3f 00
-    jmp short 07be6h                          ; eb 18
+    jmp short 07bd4h                          ; eb 18
     cmp ax, strict word 00020h                ; 3d 20 00
-    jnbe short 07bd5h                         ; 77 02
-    jne short 07bdch                          ; 75 07
+    jnbe short 07bc3h                         ; 77 02
+    jne short 07bcah                          ; 75 07
     mov word [bp-014h], 00080h                ; c7 46 ec 80 00
-    jmp short 07be1h                          ; eb 05
+    jmp short 07bcfh                          ; eb 05
     mov word [bp-014h], strict word 00040h    ; c7 46 ec 40 00
     mov word [bp-01ch], strict word 00020h    ; c7 46 e4 20 00
     mov bx, word [bp-014h]                    ; 8b 5e ec
@@ -11404,7 +11398,7 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     mov dx, word [bp-018h]                    ; 8b 56 e8
     xor cx, cx                                ; 31 c9
-    call 09420h                               ; e8 28 18
+    call 09460h                               ; e8 7a 18
     mov di, ax                                ; 89 c7
     mov word [bp-012h], dx                    ; 89 56 ee
     mov dl, byte [bp-00ch]                    ; 8a 56 f4
@@ -11431,16 +11425,16 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov ax, word [bp-01ch]                    ; 8b 46 e4
     mov word [es:bx+02ah], ax                 ; 26 89 47 2a
     cmp word [bp-012h], strict byte 00000h    ; 83 7e ee 00
-    jne short 07c59h                          ; 75 06
+    jne short 07c47h                          ; 75 06
     cmp di, 00400h                            ; 81 ff 00 04
-    jbe short 07c61h                          ; 76 08
+    jbe short 07c4fh                          ; 76 08
     mov word [es:bx+028h], 00400h             ; 26 c7 47 28 00 04
-    jmp short 07c65h                          ; eb 04
+    jmp short 07c53h                          ; eb 04
     mov word [es:bx+028h], di                 ; 26 89 7f 28
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 71 9c
+    call 018e1h                               ; e8 83 9c
     push word [bp-018h]                       ; ff 76 e8
     push word [bp-00eh]                       ; ff 76 f2
     push word [bp-01ch]                       ; ff 76 e4
@@ -11451,7 +11445,7 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     push ax                                   ; 50
     push 00c39h                               ; 68 39 0c
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 95 9c
+    call 01922h                               ; e8 a7 9c
     add sp, strict byte 00012h                ; 83 c4 12
     movzx ax, dl                              ; 0f b6 c2
     imul ax, ax, strict byte 00018h           ; 6b c0 18
@@ -11463,11 +11457,11 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov ax, word [bp-01ch]                    ; 8b 46 e4
     mov word [es:bx+030h], ax                 ; 26 89 47 30
     cmp word [bp-012h], strict byte 00000h    ; 83 7e ee 00
-    jne short 07cb7h                          ; 75 06
+    jne short 07ca5h                          ; 75 06
     cmp di, 00400h                            ; 81 ff 00 04
-    jbe short 07cbfh                          ; 76 08
+    jbe short 07cadh                          ; 76 08
     mov word [es:bx+02eh], 00400h             ; 26 c7 47 2e 00 04
-    jmp short 07cc3h                          ; eb 04
+    jmp short 07cb1h                          ; eb 04
     mov word [es:bx+02eh], di                 ; 26 89 7f 2e
     movzx ax, dl                              ; 0f b6 c2
     imul ax, ax, strict byte 00018h           ; 6b c0 18
@@ -11489,28 +11483,28 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov byte [es:si+0019eh], al               ; 26 88 84 9e 01
     mov dx, strict word 00075h                ; ba 75 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 fd 98
+    call 01600h                               ; e8 0f 99
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00075h                ; ba 75 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 fd 98
+    call 0160eh                               ; e8 0f 99
     inc byte [bp-00ch]                        ; fe 46 f4
     mov al, byte [bp-00ch]                    ; 8a 46 f4
     mov es, [bp-01ah]                         ; 8e 46 e6
     mov byte [es:si+001e8h], al               ; 26 88 84 e8 01
-    jmp near 07db2h                           ; e9 90 00
+    jmp near 07da0h                           ; e9 90 00
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 b4 9b
+    call 018e1h                               ; e8 c6 9b
     push word [bp-010h]                       ; ff 76 f0
     movzx ax, byte [bp-00ch]                  ; 0f b6 46 f4
     push ax                                   ; 50
     push 00c63h                               ; 68 63 0c
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 e5 9b
+    call 01922h                               ; e8 f7 9b
     add sp, strict byte 00008h                ; 83 c4 08
     mov dl, byte [bp-00ch]                    ; 8a 56 f4
     add dl, 008h                              ; 80 c2 08
@@ -11549,7 +11543,7 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov byte [es:si+001e8h], al               ; 26 88 84 e8 01
     inc word [bp-010h]                        ; ff 46 f0
     cmp word [bp-010h], strict byte 00010h    ; 83 7e f0 10
-    jnl short 07e23h                          ; 7d 68
+    jnl short 07e11h                          ; 7d 68
     mov byte [bp-026h], 012h                  ; c6 46 da 12
     xor al, al                                ; 30 c0
     mov byte [bp-025h], al                    ; 88 46 db
@@ -11566,25 +11560,25 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     mov cx, ss                                ; 8c d1
     lea bx, [bp-026h]                         ; 8d 5e da
     mov ax, word [bp-00228h]                  ; 8b 86 d8 fd
-    call 07610h                               ; e8 24 f8
+    call 075feh                               ; e8 24 f8
     test al, al                               ; 84 c0
-    je short 07dfeh                           ; 74 0e
+    je short 07dech                           ; 74 0e
     push 00bb3h                               ; 68 b3 0b
     push 00bd3h                               ; 68 d3 0b
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 27 9b
+    call 01922h                               ; e8 39 9b
     add sp, strict byte 00006h                ; 83 c4 06
     test byte [bp-00226h], 0e0h               ; f6 86 da fd e0
-    jne short 07e0eh                          ; 75 09
+    jne short 07dfch                          ; 75 09
     test byte [bp-00226h], 01fh               ; f6 86 da fd 1f
-    je near 07a6ch                            ; 0f 84 5e fc
+    je near 07a5ah                            ; 0f 84 5e fc
     test byte [bp-00226h], 0e0h               ; f6 86 da fd e0
-    jne short 07db2h                          ; 75 9d
+    jne short 07da0h                          ; 75 9d
     mov al, byte [bp-00226h]                  ; 8a 86 da fd
     and AL, strict byte 01fh                  ; 24 1f
     cmp AL, strict byte 005h                  ; 3c 05
-    je near 07d22h                            ; 0f 84 01 ff
-    jmp short 07db2h                          ; eb 8f
+    je near 07d10h                            ; 0f 84 01 ff
+    jmp short 07da0h                          ; eb 8f
     lea sp, [bp-00ah]                         ; 8d 66 f6
     pop di                                    ; 5f
     pop si                                    ; 5e
@@ -11593,12 +11587,12 @@ scsi_enumerate_attached_devices_:            ; 0xf7a48 LB 0x3e5
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-_scsi_init:                                  ; 0xf7e2d LB 0x66
+_scsi_init:                                  ; 0xf7e1b LB 0x66
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 e3 97
+    call 0161ch                               ; e8 f5 97
     mov bx, 00122h                            ; bb 22 01
     mov es, ax                                ; 8e c0
     mov byte [es:bx+001e8h], 000h             ; 26 c6 87 e8 01 00
@@ -11609,12 +11603,12 @@ _scsi_init:                                  ; 0xf7e2d LB 0x66
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp AL, strict byte 055h                  ; 3c 55
-    jne short 07e5dh                          ; 75 0c
+    jne short 07e4bh                          ; 75 0c
     xor al, al                                ; 30 c0
     mov dx, 00433h                            ; ba 33 04
     out DX, AL                                ; ee
     mov ax, 00430h                            ; b8 30 04
-    call 07a48h                               ; e8 eb fb
+    call 07a36h                               ; e8 eb fb
     mov AL, strict byte 055h                  ; b0 55
     mov dx, 00436h                            ; ba 36 04
     out DX, AL                                ; ee
@@ -11622,12 +11616,12 @@ _scsi_init:                                  ; 0xf7e2d LB 0x66
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp AL, strict byte 055h                  ; 3c 55
-    jne short 07e76h                          ; 75 0c
+    jne short 07e64h                          ; 75 0c
     xor al, al                                ; 30 c0
     mov dx, 00437h                            ; ba 37 04
     out DX, AL                                ; ee
     mov ax, 00434h                            ; b8 34 04
-    call 07a48h                               ; e8 d2 fb
+    call 07a36h                               ; e8 d2 fb
     mov AL, strict byte 055h                  ; b0 55
     mov dx, 0043ah                            ; ba 3a 04
     out DX, AL                                ; ee
@@ -11635,16 +11629,16 @@ _scsi_init:                                  ; 0xf7e2d LB 0x66
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp AL, strict byte 055h                  ; 3c 55
-    jne short 07e8fh                          ; 75 0c
+    jne short 07e7dh                          ; 75 0c
     xor al, al                                ; 30 c0
     mov dx, 0043bh                            ; ba 3b 04
     out DX, AL                                ; ee
     mov ax, 00438h                            ; b8 38 04
-    call 07a48h                               ; e8 b9 fb
+    call 07a36h                               ; e8 b9 fb
     mov sp, bp                                ; 89 ec
     pop bp                                    ; 5d
     retn                                      ; c3
-high_bits_save_:                             ; 0xf7e93 LB 0x17
+high_bits_save_:                             ; 0xf7e81 LB 0x17
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -11656,7 +11650,7 @@ high_bits_save_:                             ; 0xf7e93 LB 0x17
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-high_bits_restore_:                          ; 0xf7eaa LB 0x17
+high_bits_restore_:                          ; 0xf7e98 LB 0x17
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -11668,7 +11662,7 @@ high_bits_restore_:                          ; 0xf7eaa LB 0x17
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_ctrl_set_bits_:                         ; 0xf7ec1 LB 0x43
+ahci_ctrl_set_bits_:                         ; 0xf7eaf LB 0x43
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -11706,7 +11700,7 @@ ahci_ctrl_set_bits_:                         ; 0xf7ec1 LB 0x43
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_ctrl_clear_bits_:                       ; 0xf7f04 LB 0x47
+ahci_ctrl_clear_bits_:                       ; 0xf7ef2 LB 0x47
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -11746,7 +11740,7 @@ ahci_ctrl_clear_bits_:                       ; 0xf7f04 LB 0x47
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_ctrl_is_bit_set_:                       ; 0xf7f4b LB 0x39
+ahci_ctrl_is_bit_set_:                       ; 0xf7f39 LB 0x39
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -11768,18 +11762,18 @@ ahci_ctrl_is_bit_set_:                       ; 0xf7f4b LB 0x39
     shr eax, 010h                             ; 66 c1 e8 10
     xchg dx, ax                               ; 92
     test dx, di                               ; 85 fa
-    jne short 07f77h                          ; 75 04
+    jne short 07f65h                          ; 75 04
     test ax, bx                               ; 85 d8
-    je short 07f7bh                           ; 74 04
+    je short 07f69h                           ; 74 04
     mov AL, strict byte 001h                  ; b0 01
-    jmp short 07f7dh                          ; eb 02
+    jmp short 07f6bh                          ; eb 02
     xor al, al                                ; 30 c0
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_ctrl_extract_bits_:                     ; 0xf7f84 LB 0x1b
+ahci_ctrl_extract_bits_:                     ; 0xf7f72 LB 0x1b
     push si                                   ; 56
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
@@ -11787,14 +11781,14 @@ ahci_ctrl_extract_bits_:                     ; 0xf7f84 LB 0x1b
     and ax, bx                                ; 21 d8
     and dx, cx                                ; 21 ca
     movzx cx, byte [bp+006h]                  ; 0f b6 4e 06
-    jcxz 07f9ah                               ; e3 06
+    jcxz 07f88h                               ; e3 06
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 07f94h                               ; e2 fa
+    loop 07f82h                               ; e2 fa
     pop bp                                    ; 5d
     pop si                                    ; 5e
     retn 00002h                               ; c2 02 00
-ahci_addr_to_phys_:                          ; 0xf7f9f LB 0x1e
+ahci_addr_to_phys_:                          ; 0xf7f8d LB 0x1e
     push bx                                   ; 53
     push cx                                   ; 51
     push bp                                   ; 55
@@ -11805,7 +11799,7 @@ ahci_addr_to_phys_:                          ; 0xf7f9f LB 0x1e
     mov cx, strict word 00004h                ; b9 04 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 07fadh                               ; e2 fa
+    loop 07f9bh                               ; e2 fa
     xor cx, cx                                ; 31 c9
     add ax, bx                                ; 01 d8
     adc dx, cx                                ; 11 ca
@@ -11813,7 +11807,7 @@ ahci_addr_to_phys_:                          ; 0xf7f9f LB 0x1e
     pop cx                                    ; 59
     pop bx                                    ; 5b
     retn                                      ; c3
-ahci_port_cmd_sync_:                         ; 0xf7fbd LB 0xd5
+ahci_port_cmd_sync_:                         ; 0xf7fab LB 0xd5
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -11827,7 +11821,7 @@ ahci_port_cmd_sync_:                         ; 0xf7fbd LB 0xd5
     mov byte [bp-008h], al                    ; 88 46 f8
     mov di, word [es:si+00260h]               ; 26 8b bc 60 02
     cmp AL, strict byte 0ffh                  ; 3c ff
-    je near 0808ah                            ; 0f 84 aa 00
+    je near 08078h                            ; 0f 84 aa 00
     movzx cx, byte [es:si+00263h]             ; 26 0f b6 8c 63 02
     xor dx, dx                                ; 31 d2
     or dl, 080h                               ; 80 ca 80
@@ -11839,7 +11833,7 @@ ahci_port_cmd_sync_:                         ; 0xf7fbd LB 0xd5
     ; mov dword [es:si+004h], strict dword 000000000h ; 66 26 c7 44 04 00 00 00 00
     lea ax, [si+00080h]                       ; 8d 84 80 00
     mov dx, es                                ; 8c c2
-    call 07f9fh                               ; e8 96 ff
+    call 07f8dh                               ; e8 96 ff
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov word [es:si+008h], ax                 ; 26 89 44 08
     mov word [es:si+00ah], dx                 ; 26 89 54 0a
@@ -11849,7 +11843,7 @@ ahci_port_cmd_sync_:                         ; 0xf7fbd LB 0xd5
     mov bx, strict word 00011h                ; bb 11 00
     xor cx, cx                                ; 31 c9
     mov ax, di                                ; 89 f8
-    call 07ec1h                               ; e8 98 fe
+    call 07eafh                               ; e8 98 fe
     lea ax, [si+00138h]                       ; 8d 84 38 01
     cwd                                       ; 99
     mov cx, dx                                ; 89 d1
@@ -11876,27 +11870,27 @@ ahci_port_cmd_sync_:                         ; 0xf7fbd LB 0xd5
     mov cx, 04000h                            ; b9 00 40
     mov dx, si                                ; 89 f2
     mov ax, di                                ; 89 f8
-    call 07f4bh                               ; e8 e2 fe
+    call 07f39h                               ; e8 e2 fe
     test al, al                               ; 84 c0
-    je short 0804ch                           ; 74 df
+    je short 0803ah                           ; 74 df
     mov bx, strict word 00001h                ; bb 01 00
     xor cx, cx                                ; 31 c9
     mov dx, si                                ; 89 f2
     mov ax, di                                ; 89 f8
-    call 07ec1h                               ; e8 48 fe
+    call 07eafh                               ; e8 48 fe
     mov dx, word [bp-00ch]                    ; 8b 56 f4
     add dx, 00118h                            ; 81 c2 18 01
     mov bx, strict word 00001h                ; bb 01 00
     xor cx, cx                                ; 31 c9
     mov ax, di                                ; 89 f8
-    call 07f04h                               ; e8 7a fe
+    call 07ef2h                               ; e8 7a fe
     lea sp, [bp-006h]                         ; 8d 66 fa
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
+ahci_cmd_data_:                              ; 0xf8080 LB 0x1ca
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -11920,7 +11914,7 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     xor bx, bx                                ; 31 db
     mov ax, 00080h                            ; b8 80 00
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 0948ah                               ; e8 b9 13
+    call 094cah                               ; e8 0b 14
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov word [es:si+00080h], 08027h           ; 26 c7 84 80 00 27 80
     mov al, byte [bp-008h]                    ; 8a 46 f8
@@ -11936,7 +11930,7 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     mov cx, strict word 00008h                ; b9 08 00
     shr bx, 1                                 ; d1 eb
     rcr ax, 1                                 ; d1 d8
-    loop 08104h                               ; e2 fa
+    loop 080f2h                               ; e2 fa
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov byte [es:si+00085h], al               ; 26 88 84 85 00
     mov es, [bp-012h]                         ; 8e 46 ee
@@ -11961,7 +11955,7 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     xor dx, dx                                ; 31 d2
     mov bx, word [bp-016h]                    ; 8b 5e ea
     xor cx, cx                                ; 31 c9
-    call 09459h                               ; e8 ec 12
+    call 09499h                               ; e8 3e 13
     push dx                                   ; 52
     push ax                                   ; 50
     mov es, [bp-012h]                         ; 8e 46 ee
@@ -11969,7 +11963,7 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     mov cx, word [es:di+006h]                 ; 26 8b 4d 06
     mov ax, 0026ah                            ; b8 6a 02
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 09377h                               ; e8 f4 11
+    call 093b5h                               ; e8 44 12
     mov es, [bp-00ah]                         ; 8e 46 f6
     movzx ax, byte [es:si+00263h]             ; 26 0f b6 84 63 02
     mov dx, word [es:si+0027eh]               ; 26 8b 94 7e 02
@@ -11989,7 +11983,7 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     inc ax                                    ; 40
     mov es, [bp-012h]                         ; 8e 46 ee
     cmp word [es:di+01ch], strict byte 00000h ; 26 83 7d 1c 00
-    je short 081fch                           ; 74 2c
+    je short 081eah                           ; 74 2c
     mov dx, word [es:di+01ch]                 ; 26 8b 55 1c
     dec dx                                    ; 4a
     mov di, ax                                ; 89 c7
@@ -12008,36 +12002,36 @@ ahci_cmd_data_:                              ; 0xf8092 LB 0x1ca
     les bx, [bp-00eh]                         ; c4 5e f2
     movzx dx, byte [es:bx+00263h]             ; 26 0f b6 97 63 02
     cmp ax, dx                                ; 39 d0
-    jnc short 08216h                          ; 73 03
+    jnc short 08204h                          ; 73 03
     inc ax                                    ; 40
-    jmp short 08206h                          ; eb f0
+    jmp short 081f4h                          ; eb f0
     mov al, byte [bp-008h]                    ; 8a 46 f8
     cmp AL, strict byte 035h                  ; 3c 35
-    jne short 08223h                          ; 75 06
+    jne short 08211h                          ; 75 06
     mov byte [bp-008h], 040h                  ; c6 46 f8 40
-    jmp short 08237h                          ; eb 14
+    jmp short 08225h                          ; eb 14
     cmp AL, strict byte 0a0h                  ; 3c a0
-    jne short 08233h                          ; 75 0c
+    jne short 08221h                          ; 75 0c
     or byte [bp-008h], 020h                   ; 80 4e f8 20
     or byte [es:bx+00083h], 001h              ; 26 80 8f 83 00 01
-    jmp short 08237h                          ; eb 04
+    jmp short 08225h                          ; eb 04
     mov byte [bp-008h], 000h                  ; c6 46 f8 00
     or byte [bp-008h], 005h                   ; 80 4e f8 05
     movzx bx, byte [bp-008h]                  ; 0f b6 5e f8
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 07fbdh                               ; e8 75 fd
+    call 07fabh                               ; e8 75 fd
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     add ax, 0026ah                            ; 05 6a 02
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 093f0h                               ; e8 9c 11
+    call 0942eh                               ; e8 ec 11
     lea sp, [bp-006h]                         ; 8d 66 fa
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_port_deinit_current_:                   ; 0xf825c LB 0x144
+ahci_port_deinit_current_:                   ; 0xf824a LB 0x144
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -12052,14 +12046,14 @@ ahci_port_deinit_current_:                   ; 0xf825c LB 0x144
     mov al, byte [es:di+00262h]               ; 26 8a 85 62 02
     mov byte [bp-00ah], al                    ; 88 46 f6
     cmp AL, strict byte 0ffh                  ; 3c ff
-    je near 08397h                            ; 0f 84 17 01
+    je near 08385h                            ; 0f 84 17 01
     movzx dx, al                              ; 0f b6 d0
     sal dx, 007h                              ; c1 e2 07
     add dx, 00118h                            ; 81 c2 18 01
     mov bx, strict word 00011h                ; bb 11 00
     xor cx, cx                                ; 31 c9
     mov ax, si                                ; 89 f0
-    call 07f04h                               ; e8 70 fc
+    call 07ef2h                               ; e8 70 fc
     movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
     sal ax, 007h                              ; c1 e0 07
     mov word [bp-00eh], ax                    ; 89 46 f2
@@ -12068,24 +12062,24 @@ ahci_port_deinit_current_:                   ; 0xf825c LB 0x144
     mov bx, 0c011h                            ; bb 11 c0
     xor cx, cx                                ; 31 c9
     mov ax, si                                ; 89 f0
-    call 07f4bh                               ; e8 9d fc
+    call 07f39h                               ; e8 9d fc
     cmp AL, strict byte 001h                  ; 3c 01
-    je short 08294h                           ; 74 e2
+    je short 08282h                           ; 74 e2
     mov cx, strict word 00020h                ; b9 20 00
     xor bx, bx                                ; 31 db
     mov ax, di                                ; 89 f8
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 0948ah                               ; e8 cb 11
+    call 094cah                               ; e8 1d 12
     lea ax, [di+00080h]                       ; 8d 85 80 00
     mov cx, strict word 00040h                ; b9 40 00
     xor bx, bx                                ; 31 db
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 0948ah                               ; e8 bc 11
+    call 094cah                               ; e8 0e 12
     lea ax, [di+00200h]                       ; 8d 85 00 02
     mov cx, strict word 00060h                ; b9 60 00
     xor bx, bx                                ; 31 db
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 0948ah                               ; e8 ad 11
+    call 094cah                               ; e8 ff 11
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     add ax, 00108h                            ; 05 08 01
     cwd                                       ; 99
@@ -12187,7 +12181,7 @@ ahci_port_deinit_current_:                   ; 0xf825c LB 0x144
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_port_init_:                             ; 0xf83a0 LB 0x206
+ahci_port_init_:                             ; 0xf838e LB 0x206
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -12197,7 +12191,7 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     mov si, ax                                ; 89 c6
     mov word [bp-00ah], dx                    ; 89 56 f6
     mov byte [bp-008h], bl                    ; 88 5e f8
-    call 0825ch                               ; e8 a8 fe
+    call 0824ah                               ; e8 a8 fe
     movzx dx, bl                              ; 0f b6 d3
     sal dx, 007h                              ; c1 e2 07
     add dx, 00118h                            ; 81 c2 18 01
@@ -12205,7 +12199,7 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     mov ax, word [es:si+00260h]               ; 26 8b 84 60 02
     mov bx, strict word 00011h                ; bb 11 00
     xor cx, cx                                ; 31 c9
-    call 07f04h                               ; e8 36 fb
+    call 07ef2h                               ; e8 36 fb
     movzx di, byte [bp-008h]                  ; 0f b6 7e f8
     sal di, 007h                              ; c1 e7 07
     lea dx, [di+00118h]                       ; 8d 95 18 01
@@ -12213,26 +12207,26 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     mov ax, word [es:si+00260h]               ; 26 8b 84 60 02
     mov bx, 0c011h                            ; bb 11 c0
     xor cx, cx                                ; 31 c9
-    call 07f4bh                               ; e8 62 fb
+    call 07f39h                               ; e8 62 fb
     cmp AL, strict byte 001h                  ; 3c 01
-    je short 083ceh                           ; 74 e1
+    je short 083bch                           ; 74 e1
     mov cx, strict word 00020h                ; b9 20 00
     xor bx, bx                                ; 31 db
     mov ax, si                                ; 89 f0
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 0948ah                               ; e8 90 10
+    call 094cah                               ; e8 e2 10
     lea ax, [si+00080h]                       ; 8d 84 80 00
     mov cx, strict word 00040h                ; b9 40 00
     xor bx, bx                                ; 31 db
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 0948ah                               ; e8 81 10
+    call 094cah                               ; e8 d3 10
     mov ax, si                                ; 89 f0
     add ah, 002h                              ; 80 c4 02
     mov word [bp-00ch], ax                    ; 89 46 f4
     mov cx, strict word 00060h                ; b9 60 00
     xor bx, bx                                ; 31 db
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 0948ah                               ; e8 6e 10
+    call 094cah                               ; e8 c0 10
     lea ax, [di+00108h]                       ; 8d 85 08 01
     cwd                                       ; 99
     mov es, [bp-00ah]                         ; 8e 46 f6
@@ -12246,7 +12240,7 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     out DX, eax                               ; 66 ef
     mov ax, word [bp-00ch]                    ; 8b 46 f4
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 07f9fh                               ; e8 60 fb
+    call 07f8dh                               ; e8 60 fb
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
     add bx, strict byte 00004h                ; 83 c3 04
@@ -12291,7 +12285,7 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     out DX, eax                               ; 66 ef
     mov ax, si                                ; 89 f0
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 07f9fh                               ; e8 f4 fa
+    call 07f8dh                               ; e8 f4 fa
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
     add bx, strict byte 00004h                ; 83 c3 04
@@ -12396,7 +12390,7 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
- at ahci_read_sectors:                          ; 0xf85a6 LB 0x94
+ at ahci_read_sectors:                          ; 0xf8594 LB 0x94
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -12405,28 +12399,28 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     movzx di, byte [es:di+008h]               ; 26 0f b6 7d 08
     sub di, strict byte 0000ch                ; 83 ef 0c
     cmp di, strict byte 00004h                ; 83 ff 04
-    jbe short 085cah                          ; 76 0f
+    jbe short 085b8h                          ; 76 0f
     push di                                   ; 57
     push 00c7eh                               ; 68 7e 0c
     push 00c90h                               ; 68 90 0c
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 5b 93
+    call 01922h                               ; e8 6d 93
     add sp, strict byte 00008h                ; 83 c4 08
     les bx, [bp+004h]                         ; c4 5e 04
     mov dx, word [es:bx+001eeh]               ; 26 8b 97 ee 01
     xor ax, ax                                ; 31 c0
-    call 07e93h                               ; e8 bc f8
+    call 07e81h                               ; e8 bc f8
     mov es, [bp+006h]                         ; 8e 46 06
     add di, bx                                ; 01 df
     movzx bx, byte [es:di+001e9h]             ; 26 0f b6 9d e9 01
     mov di, word [bp+004h]                    ; 8b 7e 04
     mov dx, word [es:di+001eeh]               ; 26 8b 95 ee 01
     xor ax, ax                                ; 31 c0
-    call 083a0h                               ; e8 b1 fd
+    call 0838eh                               ; e8 b1 fd
     mov bx, strict word 00025h                ; bb 25 00
     mov ax, di                                ; 89 f8
     mov dx, word [bp+006h]                    ; 8b 56 06
-    call 08092h                               ; e8 98 fa
+    call 08080h                               ; e8 98 fa
     mov es, [bp+006h]                         ; 8e 46 06
     mov bx, di                                ; 89 fb
     mov ax, word [es:bx+00ah]                 ; 26 8b 47 0a
@@ -12446,14 +12440,14 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     mov es, [bp+006h]                         ; 8e 46 06
     mov dx, word [es:bx+001eeh]               ; 26 8b 97 ee 01
     xor ax, ax                                ; 31 c0
-    call 07eaah                               ; e8 7b f8
+    call 07e98h                               ; e8 7b f8
     xor ax, ax                                ; 31 c0
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 00004h                               ; c2 04 00
- at ahci_write_sectors:                         ; 0xf863a LB 0x70
+ at ahci_write_sectors:                         ; 0xf8628 LB 0x70
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -12463,39 +12457,39 @@ ahci_port_init_:                             ; 0xf83a0 LB 0x206
     movzx bx, byte [es:si+008h]               ; 26 0f b6 5c 08
     sub bx, strict byte 0000ch                ; 83 eb 0c
     cmp bx, strict byte 00004h                ; 83 fb 04
-    jbe short 08662h                          ; 76 0f
+    jbe short 08650h                          ; 76 0f
     push bx                                   ; 53
     push 00cafh                               ; 68 af 0c
     push 00c90h                               ; 68 90 0c
     push strict byte 00007h                   ; 6a 07
-    call 01922h                               ; e8 c3 92
+    call 01922h                               ; e8 d5 92
     add sp, strict byte 00008h                ; 83 c4 08
     mov es, cx                                ; 8e c1
     mov dx, word [es:si+001eeh]               ; 26 8b 94 ee 01
     xor ax, ax                                ; 31 c0
-    call 07e93h                               ; e8 25 f8
+    call 07e81h                               ; e8 25 f8
     mov es, cx                                ; 8e c1
     add bx, si                                ; 01 f3
     movzx bx, byte [es:bx+001e9h]             ; 26 0f b6 9f e9 01
     mov dx, word [es:si+001eeh]               ; 26 8b 94 ee 01
     xor ax, ax                                ; 31 c0
-    call 083a0h                               ; e8 1e fd
+    call 0838eh                               ; e8 1e fd
     mov bx, strict word 00035h                ; bb 35 00
     mov ax, si                                ; 89 f0
     mov dx, cx                                ; 89 ca
-    call 08092h                               ; e8 06 fa
+    call 08080h                               ; e8 06 fa
     mov es, cx                                ; 8e c1
     mov dx, word [es:si+00ah]                 ; 26 8b 54 0a
     mov word [es:si+014h], dx                 ; 26 89 54 14
     mov dx, word [es:si+001eeh]               ; 26 8b 94 ee 01
     xor ax, ax                                ; 31 c0
-    call 07eaah                               ; e8 0a f8
+    call 07e98h                               ; e8 0a f8
     xor ax, ax                                ; 31 c0
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 00004h                               ; c2 04 00
-ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
+ahci_cmd_packet_:                            ; 0xf8698 LB 0x173
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -12507,30 +12501,30 @@ ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
     mov word [bp-010h], cx                    ; 89 4e f0
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 57 8f
+    call 0161ch                               ; e8 69 8f
     mov si, 00122h                            ; be 22 01
     mov word [bp-008h], ax                    ; 89 46 f8
     cmp byte [bp+00ah], 002h                  ; 80 7e 0a 02
-    jne short 086f0h                          ; 75 1f
+    jne short 086deh                          ; 75 1f
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 05 92
+    call 018e1h                               ; e8 17 92
     push 00cc2h                               ; 68 c2 0c
     push 00cd2h                               ; 68 d2 0c
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 3b 92
+    call 01922h                               ; e8 4d 92
     add sp, strict byte 00006h                ; 83 c4 06
     mov ax, strict word 00001h                ; b8 01 00
-    jmp near 08814h                           ; e9 24 01
+    jmp near 08802h                           ; e9 24 01
     test byte [bp+004h], 001h                 ; f6 46 04 01
-    jne short 086eah                          ; 75 f4
+    jne short 086d8h                          ; 75 f4
     mov ax, word [bp+006h]                    ; 8b 46 06
     mov dx, word [bp+008h]                    ; 8b 56 08
     mov cx, strict word 00008h                ; b9 08 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 086ffh                               ; e2 fa
+    loop 086edh                               ; e2 fa
     mov es, [bp-008h]                         ; 8e 46 f8
     mov word [es:si], ax                      ; 26 89 04
     mov word [es:si+002h], dx                 ; 26 89 54 02
@@ -12542,7 +12536,7 @@ ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
     mov ax, word [bp+006h]                    ; 8b 46 06
     mov dx, word [bp+008h]                    ; 8b 56 08
     xor cx, cx                                ; 31 c9
-    call 09420h                               ; e8 f4 0c
+    call 09460h                               ; e8 46 0d
     mov word [es:si+00ah], ax                 ; 26 89 44 0a
     xor di, di                                ; 31 ff
     mov ax, word [es:si+001eeh]               ; 26 8b 84 ee 01
@@ -12552,28 +12546,28 @@ ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
     sub word [bp-014h], strict byte 0000ch    ; 83 6e ec 0c
     xor ax, ax                                ; 31 c0
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 07e93h                               ; e8 47 f7
+    call 07e81h                               ; e8 47 f7
     mov es, [bp-008h]                         ; 8e 46 f8
     mov bx, word [bp-014h]                    ; 8b 5e ec
     add bx, si                                ; 01 f3
     movzx bx, byte [es:bx+001e9h]             ; 26 0f b6 9f e9 01
     mov dx, word [es:si+001eeh]               ; 26 8b 94 ee 01
     xor ax, ax                                ; 31 c0
-    call 083a0h                               ; e8 3c fc
+    call 0838eh                               ; e8 3c fc
     movzx ax, byte [bp-006h]                  ; 0f b6 46 fa
     push ax                                   ; 50
     mov bx, word [bp-012h]                    ; 8b 5e ee
     mov cx, word [bp-010h]                    ; 8b 4e f0
     mov ax, 000c0h                            ; b8 c0 00
     mov dx, word [bp-00ah]                    ; 8b 56 f6
-    call 09497h                               ; e8 1f 0d
+    call 094d7h                               ; e8 71 0d
     mov es, [bp-008h]                         ; 8e 46 f8
     mov word [es:si+014h], di                 ; 26 89 7c 14
     mov word [es:si+016h], di                 ; 26 89 7c 16
     mov word [es:si+018h], di                 ; 26 89 7c 18
     mov ax, word [es:si+01ah]                 ; 26 8b 44 1a
     test ax, ax                               ; 85 c0
-    je short 087b6h                           ; 74 27
+    je short 087a4h                           ; 74 27
     dec ax                                    ; 48
     mov es, [bp-00ah]                         ; 8e 46 f6
     mov word [es:di+0010ch], ax               ; 26 89 85 0c 01
@@ -12586,7 +12580,7 @@ ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
     mov bx, 000a0h                            ; bb a0 00
     mov ax, si                                ; 89 f0
     mov dx, word [bp-008h]                    ; 8b 56 f8
-    call 08092h                               ; e8 d1 f8
+    call 08080h                               ; e8 d1 f8
     les bx, [bp-00eh]                         ; c4 5e f2
     mov ax, word [es:bx+004h]                 ; 26 8b 47 04
     mov dx, word [es:bx+006h]                 ; 26 8b 57 06
@@ -12609,57 +12603,53 @@ ahci_cmd_packet_:                            ; 0xf86aa LB 0x173
     pop DS                                    ; 1f
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     mov dx, word [bp-00ch]                    ; 8b 56 f4
-    call 07eaah                               ; e8 aa f6
+    call 07e98h                               ; e8 aa f6
     les bx, [bp-00eh]                         ; c4 5e f2
     mov ax, word [es:bx+006h]                 ; 26 8b 47 06
     or ax, word [es:bx+004h]                  ; 26 0b 47 04
-    jne short 08812h                          ; 75 05
+    jne short 08800h                          ; 75 05
     mov ax, strict word 00004h                ; b8 04 00
-    jmp short 08814h                          ; eb 02
+    jmp short 08802h                          ; eb 02
     xor ax, ax                                ; 31 c0
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 0000ch                               ; c2 0c 00
-ahci_port_detect_device_:                    ; 0xf881d LB 0x401
+ahci_port_detect_device_:                    ; 0xf880b LB 0x451
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
     push si                                   ; 56
     push di                                   ; 57
-    sub sp, 00222h                            ; 81 ec 22 02
-    mov di, ax                                ; 89 c7
-    mov word [bp-010h], dx                    ; 89 56 f0
-    mov byte [bp-00ch], bl                    ; 88 5e f4
-    movzx cx, bl                              ; 0f b6 cb
-    mov bx, cx                                ; 89 cb
-    call 083a0h                               ; e8 69 fb
+    sub sp, 00220h                            ; 81 ec 20 02
+    mov si, ax                                ; 89 c6
+    mov word [bp-012h], dx                    ; 89 56 ee
+    mov byte [bp-008h], bl                    ; 88 5e f8
+    movzx di, bl                              ; 0f b6 fb
+    mov bx, di                                ; 89 fb
+    call 0838eh                               ; e8 69 fb
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 dc 8d
-    mov word [bp-020h], ax                    ; 89 46 e0
-    mov si, 00122h                            ; be 22 01
+    call 0161ch                               ; e8 ee 8d
+    mov word [bp-010h], 00122h                ; c7 46 f0 22 01
     mov word [bp-00eh], ax                    ; 89 46 f2
-    mov word [bp-012h], si                    ; 89 76 ee
-    mov word [bp-01eh], ax                    ; 89 46 e2
-    sal cx, 007h                              ; c1 e1 07
-    mov word [bp-016h], cx                    ; 89 4e ea
-    mov ax, cx                                ; 89 c8
-    add ax, 0012ch                            ; 05 2c 01
+    sal di, 007h                              ; c1 e7 07
+    mov word [bp-020h], di                    ; 89 7e e0
+    lea ax, [di+0012ch]                       ; 8d 85 2c 01
     cwd                                       ; 99
-    mov word [bp-022h], ax                    ; 89 46 de
+    mov di, ax                                ; 89 c7
     mov bx, dx                                ; 89 d3
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     mov cx, bx                                ; 89 d9
     xchg cx, ax                               ; 91
     sal eax, 010h                             ; 66 c1 e0 10
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     add dx, strict byte 00004h                ; 83 c2 04
     mov ax, strict word 00001h                ; b8 01 00
     xor cx, cx                                ; 31 c9
@@ -12668,17 +12658,17 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
-    mov ax, word [bp-022h]                    ; 8b 46 de
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
+    mov ax, di                                ; 89 f8
     mov cx, bx                                ; 89 d9
     xchg cx, ax                               ; 91
     sal eax, 010h                             ; 66 c1 e0 10
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     add dx, strict byte 00004h                ; 83 c2 04
     xor ax, ax                                ; 31 c0
     xor cx, cx                                ; 31 c9
@@ -12687,11 +12677,11 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov ax, word [bp-016h]                    ; 8b 46 ea
+    mov ax, word [bp-020h]                    ; 8b 46 e0
     add ax, 00128h                            ; 05 28 01
     cwd                                       ; 99
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov bx, word [es:di+00260h]               ; 26 8b 9d 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
     mov cx, dx                                ; 89 d1
     mov dx, bx                                ; 89 da
     xchg cx, ax                               ; 91
@@ -12699,8 +12689,8 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     add dx, strict byte 00004h                ; 83 c2 04
     in eax, DX                                ; 66 ed
     db  08bh, 0d0h
@@ -12710,14 +12700,52 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     push strict byte 00000h                   ; 6a 00
     mov bx, strict word 0000fh                ; bb 0f 00
     xor cx, cx                                ; 31 c9
-    call 07f84h                               ; e8 90 f6
+    call 07f72h                               ; e8 9a f6
+    test ax, ax                               ; 85 c0
+    je near 08c54h                            ; 0f 84 76 03
+    movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
+    sal ax, 007h                              ; c1 e0 07
+    mov word [bp-016h], ax                    ; 89 46 ea
+    add ax, 00128h                            ; 05 28 01
+    cwd                                       ; 99
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
+    mov cx, dx                                ; 89 d1
+    mov dx, bx                                ; 89 da
+    xchg cx, ax                               ; 91
+    sal eax, 010h                             ; 66 c1 e0 10
+    db  08bh, 0c1h
+    ; mov ax, cx                                ; 8b c1
+    out DX, eax                               ; 66 ef
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
+    add dx, strict byte 00004h                ; 83 c2 04
+    in eax, DX                                ; 66 ed
+    db  08bh, 0d0h
+    ; mov dx, ax                                ; 8b d0
+    shr eax, 010h                             ; 66 c1 e8 10
+    xchg dx, ax                               ; 92
+    mov di, ax                                ; 89 c7
+    mov word [bp-01ah], dx                    ; 89 56 e6
+    push strict byte 00000h                   ; 6a 00
+    mov bx, strict word 0000fh                ; bb 0f 00
+    xor cx, cx                                ; 31 c9
+    call 07f72h                               ; e8 4e f6
+    cmp ax, strict word 00001h                ; 3d 01 00
+    je short 088deh                           ; 74 b5
+    push strict byte 00000h                   ; 6a 00
+    mov bx, strict word 0000fh                ; bb 0f 00
+    xor cx, cx                                ; 31 c9
+    mov ax, di                                ; 89 f8
+    mov dx, word [bp-01ah]                    ; 8b 56 e6
+    call 07f72h                               ; e8 3a f6
     cmp ax, strict word 00003h                ; 3d 03 00
-    jne near 08c16h                           ; 0f 85 1b 03
+    jne near 08c54h                           ; 0f 85 15 03
     mov ax, word [bp-016h]                    ; 8b 46 ea
     add ax, 00130h                            ; 05 30 01
     cwd                                       ; 99
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov bx, word [es:di+00260h]               ; 26 8b 9d 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
     mov cx, dx                                ; 89 d1
     mov dx, bx                                ; 89 da
     xchg cx, ax                               ; 91
@@ -12725,8 +12753,8 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     add dx, strict byte 00004h                ; 83 c2 04
     mov ax, strict word 0ffffh                ; b8 ff ff
     mov cx, ax                                ; 89 c1
@@ -12735,23 +12763,23 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-00eh]                         ; 8e 46 f2
-    mov al, byte [es:si+001edh]               ; 26 8a 84 ed 01
-    mov byte [bp-008h], al                    ; 88 46 f8
+    les bx, [bp-010h]                         ; c4 5e f0
+    mov al, byte [es:bx+001edh]               ; 26 8a 87 ed 01
+    mov byte [bp-00ch], al                    ; 88 46 f4
     cmp AL, strict byte 004h                  ; 3c 04
-    jnc near 08c16h                           ; 0f 83 d5 02
+    jnc near 08c54h                           ; 0f 83 cf 02
     mov dx, word [bp-016h]                    ; 8b 56 ea
     add dx, 00118h                            ; 81 c2 18 01
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov ax, word [es:di+00260h]               ; 26 8b 85 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov ax, word [es:si+00260h]               ; 26 8b 84 60 02
     mov bx, strict word 00010h                ; bb 10 00
     xor cx, cx                                ; 31 c9
-    call 07ec1h                               ; e8 69 f5
+    call 07eafh                               ; e8 13 f5
     mov ax, word [bp-016h]                    ; 8b 46 ea
     add ax, 00124h                            ; 05 24 01
     cwd                                       ; 99
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov bx, word [es:di+00260h]               ; 26 8b 9d 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov bx, word [es:si+00260h]               ; 26 8b 9c 60 02
     mov cx, dx                                ; 89 d1
     mov dx, bx                                ; 89 da
     xchg cx, ax                               ; 91
@@ -12759,235 +12787,235 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    mov es, [bp-010h]                         ; 8e 46 f0
-    mov dx, word [es:di+00260h]               ; 26 8b 95 60 02
+    mov es, [bp-012h]                         ; 8e 46 ee
+    mov dx, word [es:si+00260h]               ; 26 8b 94 60 02
     add dx, strict byte 00004h                ; 83 c2 04
     in eax, DX                                ; 66 ed
     db  08bh, 0d0h
     ; mov dx, ax                                ; 8b d0
     shr eax, 010h                             ; 66 c1 e8 10
     xchg dx, ax                               ; 92
-    mov cl, byte [bp-008h]                    ; 8a 4e f8
+    mov cl, byte [bp-00ch]                    ; 8a 4e f4
     add cl, 00ch                              ; 80 c1 0c
     test dx, dx                               ; 85 d2
-    jne near 08b68h                           ; 0f 85 d4 01
+    jne near 08bb0h                           ; 0f 85 d8 01
     cmp ax, 00101h                            ; 3d 01 01
-    jne near 08b68h                           ; 0f 85 cd 01
-    mov es, [bp-00eh]                         ; 8e 46 f2
-    db  066h, 026h, 0c7h, 004h, 000h, 000h, 000h, 000h
-    ; mov dword [es:si], strict dword 000000000h ; 66 26 c7 04 00 00 00 00
-    lea dx, [bp-00228h]                       ; 8d 96 d8 fd
-    mov word [es:si+004h], dx                 ; 26 89 54 04
-    mov [es:si+006h], ss                      ; 26 8c 54 06
-    db  066h, 026h, 0c7h, 044h, 00ah, 001h, 000h, 000h, 002h
-    ; mov dword [es:si+00ah], strict dword 002000001h ; 66 26 c7 44 0a 01 00 00 02
+    jne near 08bb0h                           ; 0f 85 d1 01
+    les bx, [bp-010h]                         ; c4 5e f0
+    db  066h, 026h, 0c7h, 007h, 000h, 000h, 000h, 000h
+    ; mov dword [es:bx], strict dword 000000000h ; 66 26 c7 07 00 00 00 00
+    lea dx, [bp-00226h]                       ; 8d 96 da fd
+    mov word [es:bx+004h], dx                 ; 26 89 57 04
+    mov [es:bx+006h], ss                      ; 26 8c 57 06
+    db  066h, 026h, 0c7h, 047h, 00ah, 001h, 000h, 000h, 002h
+    ; mov dword [es:bx+00ah], strict dword 002000001h ; 66 26 c7 47 0a 01 00 00 02
     mov bx, 000ech                            ; bb ec 00
-    mov ax, si                                ; 89 f0
-    mov dx, word [bp-020h]                    ; 8b 56 e0
-    call 08092h                               ; e8 cc f6
+    mov ax, word [bp-010h]                    ; 8b 46 f0
+    mov dx, es                                ; 8c c2
+    call 08080h                               ; e8 76 f6
     mov byte [bp-00ah], cl                    ; 88 4e f6
-    test byte [bp-00228h], 080h               ; f6 86 d8 fd 80
+    test byte [bp-00226h], 080h               ; f6 86 da fd 80
     db  00fh, 095h, 0c0h
     ; setne al                                  ; 0f 95 c0
     xor ah, ah                                ; 30 e4
-    mov dx, word [bp-00226h]                  ; 8b 96 da fd
-    mov word [bp-018h], dx                    ; 89 56 e8
-    mov dx, word [bp-00222h]                  ; 8b 96 de fd
-    mov word [bp-01ch], dx                    ; 89 56 e4
-    mov dx, word [bp-0021ch]                  ; 8b 96 e4 fd
-    mov word [bp-01ah], dx                    ; 89 56 e6
-    mov di, word [bp-001b0h]                  ; 8b be 50 fe
-    mov dx, word [bp-001aeh]                  ; 8b 96 52 fe
-    mov word [bp-014h], dx                    ; 89 56 ec
-    cmp dx, 00fffh                            ; 81 fa ff 0f
-    jne short 08a09h                          ; 75 10
-    cmp di, strict byte 0ffffh                ; 83 ff ff
-    jne short 08a09h                          ; 75 0b
-    mov di, word [bp-00160h]                  ; 8b be a0 fe
-    mov dx, word [bp-0015eh]                  ; 8b 96 a2 fe
-    mov word [bp-014h], dx                    ; 89 56 ec
-    movzx bx, byte [bp-008h]                  ; 0f b6 5e f8
-    mov es, [bp-01eh]                         ; 8e 46 e2
-    add bx, word [bp-012h]                    ; 03 5e ee
-    mov ah, byte [bp-00ch]                    ; 8a 66 f4
-    mov byte [es:bx+001e9h], ah               ; 26 88 a7 e9 01
-    movzx dx, byte [bp-00ah]                  ; 0f b6 56 f6
-    imul dx, dx, strict byte 00018h           ; 6b d2 18
-    mov si, word [bp-012h]                    ; 8b 76 ee
-    add si, dx                                ; 01 d6
+    mov dl, al                                ; 88 c2
+    mov ax, word [bp-00224h]                  ; 8b 86 dc fd
+    mov word [bp-018h], ax                    ; 89 46 e8
+    mov ax, word [bp-00220h]                  ; 8b 86 e0 fd
+    mov word [bp-01eh], ax                    ; 89 46 e2
+    mov ax, word [bp-0021ah]                  ; 8b 86 e6 fd
+    mov word [bp-01ch], ax                    ; 89 46 e4
+    mov ax, word [bp-001aeh]                  ; 8b 86 52 fe
+    mov word [bp-014h], ax                    ; 89 46 ec
+    mov di, word [bp-001ach]                  ; 8b be 54 fe
+    cmp di, 00fffh                            ; 81 ff ff 0f
+    jne short 08a4fh                          ; 75 10
+    cmp ax, strict word 0ffffh                ; 3d ff ff
+    jne short 08a4fh                          ; 75 0b
+    mov ax, word [bp-0015eh]                  ; 8b 86 a2 fe
+    mov word [bp-014h], ax                    ; 89 46 ec
+    mov di, word [bp-0015ch]                  ; 8b be a4 fe
+    movzx bx, byte [bp-00ch]                  ; 0f b6 5e f4
+    mov es, [bp-00eh]                         ; 8e 46 f2
+    add bx, word [bp-010h]                    ; 03 5e f0
+    mov al, byte [bp-008h]                    ; 8a 46 f8
+    mov byte [es:bx+001e9h], al               ; 26 88 87 e9 01
+    movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
+    imul ax, ax, strict byte 00018h           ; 6b c0 18
+    mov si, word [bp-010h]                    ; 8b 76 f0
+    add si, ax                                ; 01 c6
     mov word [es:si+01eh], 0ff05h             ; 26 c7 44 1e 05 ff
-    mov byte [es:si+020h], al                 ; 26 88 44 20
+    mov byte [es:si+020h], dl                 ; 26 88 54 20
     mov byte [es:si+021h], 000h               ; 26 c6 44 21 00
     mov word [es:si+024h], 00200h             ; 26 c7 44 24 00 02
     mov byte [es:si+023h], 001h               ; 26 c6 44 23 01
-    mov word [es:si+032h], di                 ; 26 89 7c 32
     mov ax, word [bp-014h]                    ; 8b 46 ec
-    mov word [es:si+034h], ax                 ; 26 89 44 34
-    mov ax, word [bp-01ch]                    ; 8b 46 e4
+    mov word [es:si+032h], ax                 ; 26 89 44 32
+    mov word [es:si+034h], di                 ; 26 89 7c 34
+    mov ax, word [bp-01eh]                    ; 8b 46 e2
     mov word [es:si+02ch], ax                 ; 26 89 44 2c
     mov ax, word [bp-018h]                    ; 8b 46 e8
     mov word [es:si+02eh], ax                 ; 26 89 44 2e
-    mov ax, word [bp-01ah]                    ; 8b 46 e6
+    mov ax, word [bp-01ch]                    ; 8b 46 e4
     mov word [es:si+030h], ax                 ; 26 89 44 30
-    mov al, byte [bp-008h]                    ; 8a 46 f8
+    mov al, byte [bp-00ch]                    ; 8a 46 f4
     cmp AL, strict byte 001h                  ; 3c 01
-    jc short 08a74h                           ; 72 0c
-    jbe short 08a7ch                          ; 76 12
+    jc short 08abah                           ; 72 0c
+    jbe short 08ac2h                          ; 76 12
     cmp AL, strict byte 003h                  ; 3c 03
-    je short 08a84h                           ; 74 16
+    je short 08acah                           ; 74 16
     cmp AL, strict byte 002h                  ; 3c 02
-    je short 08a80h                           ; 74 0e
-    jmp short 08acdh                          ; eb 59
+    je short 08ac6h                           ; 74 0e
+    jmp short 08b13h                          ; eb 59
     test al, al                               ; 84 c0
-    jne short 08acdh                          ; 75 55
+    jne short 08b13h                          ; 75 55
     mov DL, strict byte 040h                  ; b2 40
-    jmp short 08a86h                          ; eb 0a
+    jmp short 08acch                          ; eb 0a
     mov DL, strict byte 048h                  ; b2 48
-    jmp short 08a86h                          ; eb 06
+    jmp short 08acch                          ; eb 06
     mov DL, strict byte 050h                  ; b2 50
-    jmp short 08a86h                          ; eb 02
+    jmp short 08acch                          ; eb 02
     mov DL, strict byte 058h                  ; b2 58
     mov al, dl                                ; 88 d0
     add AL, strict byte 007h                  ; 04 07
     movzx bx, al                              ; 0f b6 d8
     mov ax, bx                                ; 89 d8
-    call 0165ch                               ; e8 ca 8b
+    call 0165ch                               ; e8 84 8b
     test al, al                               ; 84 c0
-    je short 08acdh                           ; 74 37
+    je short 08b13h                           ; 74 37
     mov al, dl                                ; 88 d0
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     xor ah, ah                                ; 30 e4
-    call 0165ch                               ; e8 bd 8b
+    call 0165ch                               ; e8 77 8b
     xor ah, ah                                ; 30 e4
-    mov cx, ax                                ; 89 c1
-    sal cx, 008h                              ; c1 e1 08
+    mov si, ax                                ; 89 c6
+    sal si, 008h                              ; c1 e6 08
     movzx ax, dl                              ; 0f b6 c2
-    call 0165ch                               ; e8 b0 8b
+    call 0165ch                               ; e8 6a 8b
     xor ah, ah                                ; 30 e4
-    add ax, cx                                ; 01 c8
-    mov word [bp-026h], ax                    ; 89 46 da
+    add ax, si                                ; 01 f0
+    mov word [bp-024h], ax                    ; 89 46 dc
     mov al, dl                                ; 88 d0
     add AL, strict byte 002h                  ; 04 02
     xor ah, ah                                ; 30 e4
-    call 0165ch                               ; e8 a0 8b
+    call 0165ch                               ; e8 5a 8b
     xor ah, ah                                ; 30 e4
-    mov word [bp-028h], ax                    ; 89 46 d8
+    mov word [bp-026h], ax                    ; 89 46 da
     mov ax, bx                                ; 89 d8
-    call 0165ch                               ; e8 96 8b
+    call 0165ch                               ; e8 50 8b
     xor ah, ah                                ; 30 e4
-    mov word [bp-024h], ax                    ; 89 46 dc
-    jmp short 08adah                          ; eb 0d
-    mov bx, di                                ; 89 fb
-    mov cx, word [bp-014h]                    ; 8b 4e ec
+    mov word [bp-022h], ax                    ; 89 46 de
+    jmp short 08b20h                          ; eb 0d
+    mov bx, word [bp-014h]                    ; 8b 5e ec
+    mov cx, di                                ; 89 f9
     mov dx, ss                                ; 8c d2
-    lea ax, [bp-028h]                         ; 8d 46 d8
-    call 05341h                               ; e8 67 c8
+    lea ax, [bp-026h]                         ; 8d 46 da
+    call 0532fh                               ; e8 0f c8
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 fc 8d
-    push word [bp-014h]                       ; ff 76 ec
+    call 018e1h                               ; e8 b6 8d
     push di                                   ; 57
-    mov ax, word [bp-024h]                    ; 8b 46 dc
-    push ax                                   ; 50
-    mov ax, word [bp-028h]                    ; 8b 46 d8
+    push word [bp-014h]                       ; ff 76 ec
+    mov ax, word [bp-022h]                    ; 8b 46 de
     push ax                                   ; 50
     mov ax, word [bp-026h]                    ; 8b 46 da
     push ax                                   ; 50
-    push dword [bp-01ch]                      ; 66 ff 76 e4
-    push word [bp-018h]                       ; ff 76 e8
-    movzx ax, byte [bp-00ch]                  ; 0f b6 46 f4
+    mov ax, word [bp-024h]                    ; 8b 46 dc
     push ax                                   ; 50
+    push dword [bp-01eh]                      ; 66 ff 76 e2
+    push word [bp-018h]                       ; ff 76 e8
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     push ax                                   ; 50
+    movzx ax, byte [bp-00ch]                  ; 0f b6 46 f4
+    push ax                                   ; 50
     push 00cf2h                               ; 68 f2 0c
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 14 8e
+    call 01922h                               ; e8 ce 8d
     add sp, strict byte 00018h                ; 83 c4 18
-    movzx di, byte [bp-00ah]                  ; 0f b6 7e f6
-    imul di, di, strict byte 00018h           ; 6b ff 18
-    add di, word [bp-012h]                    ; 03 7e ee
-    mov es, [bp-01eh]                         ; 8e 46 e2
+    movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
+    imul ax, ax, strict byte 00018h           ; 6b c0 18
+    mov di, word [bp-010h]                    ; 8b 7e f0
+    add di, ax                                ; 01 c7
+    mov es, [bp-00eh]                         ; 8e 46 f2
     lea di, [di+026h]                         ; 8d 7d 26
     push DS                                   ; 1e
     push SS                                   ; 16
     pop DS                                    ; 1f
-    lea si, [bp-028h]                         ; 8d 76 d8
+    lea si, [bp-026h]                         ; 8d 76 da
     movsw                                     ; a5
     movsw                                     ; a5
     movsw                                     ; a5
     pop DS                                    ; 1f
-    mov bx, word [bp-012h]                    ; 8b 5e ee
+    mov bx, word [bp-010h]                    ; 8b 5e f0
     mov al, byte [es:bx+0019eh]               ; 26 8a 87 9e 01
-    mov ah, byte [bp-008h]                    ; 8a 66 f8
+    mov ah, byte [bp-00ch]                    ; 8a 66 f4
     add ah, 00ch                              ; 80 c4 0c
     movzx bx, al                              ; 0f b6 d8
-    add bx, word [bp-012h]                    ; 03 5e ee
+    add bx, word [bp-010h]                    ; 03 5e f0
     mov byte [es:bx+0019fh], ah               ; 26 88 a7 9f 01
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
-    mov bx, word [bp-012h]                    ; 8b 5e ee
+    mov bx, word [bp-010h]                    ; 8b 5e f0
     mov byte [es:bx+0019eh], al               ; 26 88 87 9e 01
     mov dx, strict word 00075h                ; ba 75 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 01600h                               ; e8 a9 8a
+    call 01600h                               ; e8 61 8a
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     movzx bx, al                              ; 0f b6 d8
     mov dx, strict word 00075h                ; ba 75 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0160eh                               ; e8 a9 8a
-    jmp near 08c05h                           ; e9 9d 00
+    call 0160eh                               ; e8 61 8a
+    jmp near 08c46h                           ; e9 96 00
     cmp dx, 0eb14h                            ; 81 fa 14 eb
-    jne near 08c05h                           ; 0f 85 95 00
+    jne near 08c46h                           ; 0f 85 8e 00
     cmp ax, 00101h                            ; 3d 01 01
-    jne near 08c05h                           ; 0f 85 8e 00
-    mov es, [bp-00eh]                         ; 8e 46 f2
-    db  066h, 026h, 0c7h, 004h, 000h, 000h, 000h, 000h
-    ; mov dword [es:si], strict dword 000000000h ; 66 26 c7 04 00 00 00 00
-    lea dx, [bp-00228h]                       ; 8d 96 d8 fd
-    mov word [es:si+004h], dx                 ; 26 89 54 04
-    mov [es:si+006h], ss                      ; 26 8c 54 06
-    db  066h, 026h, 0c7h, 044h, 00ah, 001h, 000h, 000h, 002h
-    ; mov dword [es:si+00ah], strict dword 002000001h ; 66 26 c7 44 0a 01 00 00 02
+    jne near 08c46h                           ; 0f 85 87 00
+    les bx, [bp-010h]                         ; c4 5e f0
+    db  066h, 026h, 0c7h, 007h, 000h, 000h, 000h, 000h
+    ; mov dword [es:bx], strict dword 000000000h ; 66 26 c7 07 00 00 00 00
+    lea dx, [bp-00226h]                       ; 8d 96 da fd
+    mov word [es:bx+004h], dx                 ; 26 89 57 04
+    mov [es:bx+006h], ss                      ; 26 8c 57 06
+    db  066h, 026h, 0c7h, 047h, 00ah, 001h, 000h, 000h, 002h
+    ; mov dword [es:bx+00ah], strict dword 002000001h ; 66 26 c7 47 0a 01 00 00 02
     mov bx, 000a1h                            ; bb a1 00
-    mov ax, si                                ; 89 f0
-    mov dx, word [bp-020h]                    ; 8b 56 e0
-    call 08092h                               ; e8 f0 f4
-    test byte [bp-00228h], 080h               ; f6 86 d8 fd 80
+    mov ax, word [bp-010h]                    ; 8b 46 f0
+    mov dx, es                                ; 8c c2
+    call 08080h                               ; e8 96 f4
+    test byte [bp-00226h], 080h               ; f6 86 da fd 80
     db  00fh, 095h, 0c0h
     ; setne al                                  ; 0f 95 c0
-    movzx dx, al                              ; 0f b6 d0
-    movzx bx, byte [bp-008h]                  ; 0f b6 5e f8
-    mov es, [bp-020h]                         ; 8e 46 e0
-    add bx, si                                ; 01 f3
-    mov al, byte [bp-00ch]                    ; 8a 46 f4
+    xor ah, ah                                ; 30 e4
+    mov dx, ax                                ; 89 c2
+    movzx bx, byte [bp-00ch]                  ; 0f b6 5e f4
+    mov es, [bp-00eh]                         ; 8e 46 f2
+    add bx, word [bp-010h]                    ; 03 5e f0
+    mov al, byte [bp-008h]                    ; 8a 46 f8
     mov byte [es:bx+001e9h], al               ; 26 88 87 e9 01
-    movzx si, cl                              ; 0f b6 f1
-    imul si, si, strict byte 00018h           ; 6b f6 18
-    add si, 00122h                            ; 81 c6 22 01
+    movzx ax, cl                              ; 0f b6 c1
+    imul ax, ax, strict byte 00018h           ; 6b c0 18
+    mov si, word [bp-010h]                    ; 8b 76 f0
+    add si, ax                                ; 01 c6
     mov word [es:si+01eh], 00505h             ; 26 c7 44 1e 05 05
     mov byte [es:si+020h], dl                 ; 26 88 54 20
     mov word [es:si+024h], 00800h             ; 26 c7 44 24 00 08
-    mov es, [bp-01eh]                         ; 8e 46 e2
-    mov bx, word [bp-012h]                    ; 8b 5e ee
+    mov bx, word [bp-010h]                    ; 8b 5e f0
     mov al, byte [es:bx+001afh]               ; 26 8a 87 af 01
-    mov ah, byte [bp-008h]                    ; 8a 66 f8
+    mov ah, byte [bp-00ch]                    ; 8a 66 f4
     add ah, 00ch                              ; 80 c4 0c
     movzx bx, al                              ; 0f b6 d8
-    mov es, [bp-020h]                         ; 8e 46 e0
-    add bx, 00122h                            ; 81 c3 22 01
+    add bx, word [bp-010h]                    ; 03 5e f0
     mov byte [es:bx+001b0h], ah               ; 26 88 a7 b0 01
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
-    mov es, [bp-01eh]                         ; 8e 46 e2
-    mov bx, word [bp-012h]                    ; 8b 5e ee
+    mov bx, word [bp-010h]                    ; 8b 5e f0
     mov byte [es:bx+001afh], al               ; 26 88 87 af 01
-    inc byte [bp-008h]                        ; fe 46 f8
-    mov al, byte [bp-008h]                    ; 8a 46 f8
-    mov es, [bp-01eh]                         ; 8e 46 e2
-    mov bx, word [bp-012h]                    ; 8b 5e ee
+    inc byte [bp-00ch]                        ; fe 46 f4
+    mov al, byte [bp-00ch]                    ; 8a 46 f4
+    les bx, [bp-010h]                         ; c4 5e f0
     mov byte [es:bx+001edh], al               ; 26 88 87 ed 01
     lea sp, [bp-006h]                         ; 8d 66 fa
     pop di                                    ; 5f
@@ -12995,7 +13023,7 @@ ahci_port_detect_device_:                    ; 0xf881d LB 0x401
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_mem_alloc_:                             ; 0xf8c1e LB 0x43
+ahci_mem_alloc_:                             ; 0xf8c5c LB 0x43
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -13005,25 +13033,25 @@ ahci_mem_alloc_:                             ; 0xf8c1e LB 0x43
     push di                                   ; 57
     mov dx, 00413h                            ; ba 13 04
     xor ax, ax                                ; 31 c0
-    call 0161ch                               ; e8 ee 89
+    call 0161ch                               ; e8 b0 89
     test ax, ax                               ; 85 c0
-    je short 08c57h                           ; 74 25
+    je short 08c95h                           ; 74 25
     dec ax                                    ; 48
     mov bx, ax                                ; 89 c3
     xor dx, dx                                ; 31 d2
     mov cx, strict word 0000ah                ; b9 0a 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 08c3ah                               ; e2 fa
+    loop 08c78h                               ; e2 fa
     mov si, ax                                ; 89 c6
     mov di, dx                                ; 89 d7
     mov cx, strict word 00004h                ; b9 04 00
     shr di, 1                                 ; d1 ef
     rcr si, 1                                 ; d1 de
-    loop 08c47h                               ; e2 fa
+    loop 08c85h                               ; e2 fa
     mov dx, 00413h                            ; ba 13 04
     xor ax, ax                                ; 31 c0
-    call 0162ah                               ; e8 d5 89
+    call 0162ah                               ; e8 97 89
     mov ax, si                                ; 89 f0
     lea sp, [bp-00ah]                         ; 8d 66 f6
     pop di                                    ; 5f
@@ -13033,7 +13061,7 @@ ahci_mem_alloc_:                             ; 0xf8c1e LB 0x43
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-ahci_hba_init_:                              ; 0xf8c61 LB 0x125
+ahci_hba_init_:                              ; 0xf8c9f LB 0x125
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -13045,7 +13073,7 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     mov si, ax                                ; 89 c6
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, strict word 00040h                ; b8 40 00
-    call 0161ch                               ; e8 a5 89
+    call 0161ch                               ; e8 67 89
     mov bx, 00122h                            ; bb 22 01
     mov word [bp-010h], ax                    ; 89 46 f0
     mov ax, strict word 00010h                ; b8 10 00
@@ -13062,10 +13090,10 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     ; mov dx, ax                                ; 8b d0
     shr eax, 010h                             ; 66 c1 e8 10
     xchg dx, ax                               ; 92
-    call 08c1eh                               ; e8 82 ff
+    call 08c5ch                               ; e8 82 ff
     mov di, ax                                ; 89 c7
     test ax, ax                               ; 85 c0
-    je near 08d65h                            ; 0f 84 c1 00
+    je near 08da3h                            ; 0f 84 c1 00
     mov es, [bp-010h]                         ; 8e 46 f0
     mov word [es:bx+001eeh], di               ; 26 89 bf ee 01
     mov byte [es:bx+001edh], 000h             ; 26 c6 87 ed 01 00
@@ -13079,7 +13107,7 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     xor cx, cx                                ; 31 c9
     mov dx, strict word 00004h                ; ba 04 00
     mov ax, si                                ; 89 f0
-    call 07ec1h                               ; e8 e9 f1
+    call 07eafh                               ; e8 99 f1
     mov ax, strict word 00004h                ; b8 04 00
     xor cx, cx                                ; 31 c9
     mov dx, si                                ; 89 f2
@@ -13096,7 +13124,7 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     shr eax, 010h                             ; 66 c1 e8 10
     xchg dx, ax                               ; 92
     test AL, strict byte 001h                 ; a8 01
-    jne short 08cd8h                          ; 75 de
+    jne short 08d16h                          ; 75 de
     xor ax, ax                                ; 31 c0
     xor cx, cx                                ; 31 c9
     mov dx, si                                ; 89 f2
@@ -13114,35 +13142,35 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     push strict byte 00000h                   ; 6a 00
     mov bx, strict word 0001fh                ; bb 1f 00
     xor cx, cx                                ; 31 c9
-    call 07f84h                               ; e8 66 f2
+    call 07f72h                               ; e8 16 f2
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     mov byte [bp-00eh], al                    ; 88 46 f2
     mov byte [bp-00ch], 000h                  ; c6 46 f4 00
-    jmp short 08d32h                          ; eb 09
+    jmp short 08d70h                          ; eb 09
     inc byte [bp-00ch]                        ; fe 46 f4
     cmp byte [bp-00ch], 020h                  ; 80 7e f4 20
-    jnc short 08d63h                          ; 73 31
+    jnc short 08da1h                          ; 73 31
     movzx cx, byte [bp-00ch]                  ; 0f b6 4e f4
     mov ax, strict word 00001h                ; b8 01 00
     xor dx, dx                                ; 31 d2
-    jcxz 08d43h                               ; e3 06
+    jcxz 08d81h                               ; e3 06
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 08d3dh                               ; e2 fa
+    loop 08d7bh                               ; e2 fa
     mov bx, ax                                ; 89 c3
     mov cx, dx                                ; 89 d1
     mov dx, strict word 0000ch                ; ba 0c 00
     mov ax, si                                ; 89 f0
-    call 07f4bh                               ; e8 fc f1
+    call 07f39h                               ; e8 ac f1
     test al, al                               ; 84 c0
-    je short 08d29h                           ; 74 d6
+    je short 08d67h                           ; 74 d6
     movzx bx, byte [bp-00ch]                  ; 0f b6 5e f4
     xor ax, ax                                ; 31 c0
     mov dx, di                                ; 89 fa
-    call 0881dh                               ; e8 bf fa
+    call 0880bh                               ; e8 6f fa
     dec byte [bp-00eh]                        ; fe 4e f2
-    jne short 08d29h                          ; 75 c6
+    jne short 08d67h                          ; 75 c6
     xor ax, ax                                ; 31 c0
     lea sp, [bp-00ah]                         ; 8d 66 f6
     pop di                                    ; 5f
@@ -13152,9 +13180,9 @@ ahci_hba_init_:                              ; 0xf8c61 LB 0x125
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-    db  00bh, 005h, 004h, 003h, 002h, 001h, 000h, 055h, 08eh, 033h, 08eh, 039h, 08eh, 03fh, 08eh, 045h
-    db  08eh, 04bh, 08eh, 051h, 08eh, 055h, 08eh
-_ahci_init:                                  ; 0xf8d86 LB 0xfe
+    db  00bh, 005h, 004h, 003h, 002h, 001h, 000h, 093h, 08eh, 071h, 08eh, 077h, 08eh, 07dh, 08eh, 083h
+    db  08eh, 089h, 08eh, 08fh, 08eh, 093h, 08eh
+_ahci_init:                                  ; 0xf8dc4 LB 0xfe
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -13162,10 +13190,10 @@ _ahci_init:                                  ; 0xf8d86 LB 0xfe
     sub sp, strict byte 00006h                ; 83 ec 06
     mov ax, 00601h                            ; b8 01 06
     mov dx, strict word 00001h                ; ba 01 00
-    call 092a4h                               ; e8 0d 05
+    call 092e2h                               ; e8 0d 05
     mov dx, ax                                ; 89 c2
     cmp ax, strict word 0ffffh                ; 3d ff ff
-    je near 08e7dh                            ; 0f 84 dd 00
+    je near 08ebbh                            ; 0f 84 dd 00
     xor al, al                                ; 30 c0
     shr ax, 008h                              ; c1 e8 08
     mov byte [bp-00ah], al                    ; 88 46 f6
@@ -13173,121 +13201,124 @@ _ahci_init:                                  ; 0xf8d86 LB 0xfe
     xor dh, dh                                ; 30 f6
     xor ah, ah                                ; 30 e4
     mov bx, strict word 00034h                ; bb 34 00
-    call 092cfh                               ; e8 1a 05
+    call 0930dh                               ; e8 1a 05
     mov cl, al                                ; 88 c1
     test cl, cl                               ; 84 c9
-    je short 08ddeh                           ; 74 23
+    je short 08e1ch                           ; 74 23
     movzx bx, cl                              ; 0f b6 d9
     movzx di, byte [bp-008h]                  ; 0f b6 7e f8
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     mov dx, di                                ; 89 fa
     mov ax, si                                ; 89 f0
-    call 092cfh                               ; e8 02 05
+    call 0930dh                               ; e8 02 05
     cmp AL, strict byte 012h                  ; 3c 12
-    je short 08ddeh                           ; 74 0d
+    je short 08e1ch                           ; 74 0d
     mov al, cl                                ; 88 c8
     db  0feh, 0c0h
     ; inc al                                    ; fe c0
     movzx bx, al                              ; 0f b6 d8
     mov dx, di                                ; 89 fa
     mov ax, si                                ; 89 f0
-    jmp short 08db2h                          ; eb d4
+    jmp short 08df0h                          ; eb d4
     test cl, cl                               ; 84 c9
-    je near 08e7dh                            ; 0f 84 99 00
+    je near 08ebbh                            ; 0f 84 99 00
     add cl, 002h                              ; 80 c1 02
     movzx bx, cl                              ; 0f b6 d9
     movzx di, byte [bp-008h]                  ; 0f b6 7e f8
     movzx si, byte [bp-00ah]                  ; 0f b6 76 f6
     mov dx, di                                ; 89 fa
     mov ax, si                                ; 89 f0
-    call 092cfh                               ; e8 d6 04
+    call 0930dh                               ; e8 d6 04
     cmp AL, strict byte 010h                  ; 3c 10
-    jne near 08e7dh                           ; 0f 85 7e 00
+    jne near 08ebbh                           ; 0f 85 7e 00
     mov byte [bp-006h], 000h                  ; c6 46 fa 00
     mov al, cl                                ; 88 c8
     add AL, strict byte 002h                  ; 04 02
     movzx bx, al                              ; 0f b6 d8
     mov dx, di                                ; 89 fa
     mov ax, si                                ; 89 f0
-    call 092f3h                               ; e8 e2 04
+    call 09331h                               ; e8 e2 04
     mov dx, ax                                ; 89 c2
     and ax, strict word 0000fh                ; 25 0f 00
     sub ax, strict word 00004h                ; 2d 04 00
     cmp ax, strict word 0000bh                ; 3d 0b 00
-    jnbe short 08e55h                         ; 77 37
+    jnbe short 08e93h                         ; 77 37
     push CS                                   ; 0e
     pop ES                                    ; 07
     mov cx, strict word 00008h                ; b9 08 00
-    mov di, 08d6fh                            ; bf 6f 8d
+    mov di, 08dadh                            ; bf ad 8d
     repne scasb                               ; f2 ae
     sal cx, 1                                 ; d1 e1
     mov di, cx                                ; 89 cf
-    mov ax, word [cs:di-0728ah]               ; 2e 8b 85 76 8d
+    mov ax, word [cs:di-0724ch]               ; 2e 8b 85 b4 8d
     jmp ax                                    ; ff e0
     mov byte [bp-006h], 010h                  ; c6 46 fa 10
-    jmp short 08e55h                          ; eb 1c
+    jmp short 08e93h                          ; eb 1c
     mov byte [bp-006h], 014h                  ; c6 46 fa 14
-    jmp short 08e55h                          ; eb 16
+    jmp short 08e93h                          ; eb 16
     mov byte [bp-006h], 018h                  ; c6 46 fa 18
-    jmp short 08e55h                          ; eb 10
+    jmp short 08e93h                          ; eb 10
     mov byte [bp-006h], 01ch                  ; c6 46 fa 1c
-    jmp short 08e55h                          ; eb 0a
+    jmp short 08e93h                          ; eb 0a
     mov byte [bp-006h], 020h                  ; c6 46 fa 20
-    jmp short 08e55h                          ; eb 04
+    jmp short 08e93h                          ; eb 04
     mov byte [bp-006h], 024h                  ; c6 46 fa 24
     mov si, dx                                ; 89 d6
     shr si, 004h                              ; c1 ee 04
     sal si, 002h                              ; c1 e6 02
     mov al, byte [bp-006h]                    ; 8a 46 fa
     test al, al                               ; 84 c0
-    je short 08e7dh                           ; 74 19
+    je short 08ebbh                           ; 74 19
     movzx bx, al                              ; 0f b6 d8
     movzx dx, byte [bp-008h]                  ; 0f b6 56 f8
     movzx ax, byte [bp-00ah]                  ; 0f b6 46 f6
-    call 09315h                               ; e8 a3 04
+    call 09353h                               ; e8 a3 04
     test AL, strict byte 001h                 ; a8 01
-    je short 08e7dh                           ; 74 07
+    je short 08ebbh                           ; 74 07
     and AL, strict byte 0f0h                  ; 24 f0
     add ax, si                                ; 01 f0
-    call 08c61h                               ; e8 e4 fd
+    call 08c9fh                               ; e8 e4 fd
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-apm_out_str_:                                ; 0xf8e84 LB 0x39
+apm_out_str_:                                ; 0xf8ec2 LB 0x39
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
     mov bx, ax                                ; 89 c3
     cmp byte [bx], 000h                       ; 80 3f 00
-    je short 08e99h                           ; 74 0a
+    je short 08ed7h                           ; 74 0a
     mov al, byte [bx]                         ; 8a 07
     out DX, AL                                ; ee
     inc bx                                    ; 43
     mov al, byte [bx]                         ; 8a 07
     db  00ah, 0c0h
     ; or al, al                                 ; 0a c0
-    jne short 08e91h                          ; 75 f8
+    jne short 08ecfh                          ; 75 f8
     lea sp, [bp-002h]                         ; 8d 66 fe
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-    loopne 08e2fh                             ; e0 8e
-    lodsb                                     ; ac
-    db  08fh, 0f2h
-    ; pop dx                                    ; 8f f2
-    mov cs, [di]                              ; 8e 0d
-    db  08fh, 0ach, 08fh, 038h
-    ; pop word [si+0388fh]                      ; 8f ac 8f 38
-    db  08fh, 0ach, 08fh, 03dh
-    ; pop word [si+03d8fh]                      ; 8f ac 8f 3d
-    pop word [bx+di-07e71h]                   ; 8f 81 8f 81
-    pop word [bx+di+07c8fh]                   ; 8f 81 8f 7c
-    pop word [bx+di-07e71h]                   ; 8f 81 8f 81
-    db  08fh, 075h, 08fh
-    ; pop word [di-071h]                        ; 8f 75 8f
-_apm_function:                               ; 0xf8ebd LB 0xf5
+    push DS                                   ; 1e
+    db  08fh, 0eah
+    ; pop dx                                    ; 8f ea
+    db  08fh, 030h
+    ; pop word [bx+si]                          ; 8f 30
+    db  08fh, 04bh, 08fh
+    ; pop word [bp+di-071h]                     ; 8f 4b 8f
+    jmp far 0ea8fh:0768fh                     ; ea 8f 76 8f ea
+    db  08fh, 07bh, 08fh
+    ; pop word [bp+di-071h]                     ; 8f 7b 8f
+    mov di, 0bf8fh                            ; bf 8f bf
+    db  08fh, 0bfh, 08fh, 0bah
+    ; pop word [bx-04571h]                      ; 8f bf 8f ba
+    db  08fh, 0bfh, 08fh, 0bfh
+    ; pop word [bx-04071h]                      ; 8f bf 8f bf
+    db  08fh
+    mov BL, strict byte 08fh                  ; b3 8f
+_apm_function:                               ; 0xf8efb LB 0xf5
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -13295,23 +13326,23 @@ _apm_function:                               ; 0xf8ebd LB 0xf5
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
     cmp ax, strict word 0000eh                ; 3d 0e 00
-    jnbe near 08f81h                          ; 0f 87 b0 00
+    jnbe near 08fbfh                          ; 0f 87 b0 00
     mov bx, ax                                ; 89 c3
     add bx, ax                                ; 01 c3
     mov dx, word [bp+018h]                    ; 8b 56 18
     or dl, 001h                               ; 80 ca 01
-    jmp word [cs:bx-07161h]                   ; 2e ff a7 9f 8e
+    jmp word [cs:bx-07123h]                   ; 2e ff a7 dd 8e
     mov word [bp+012h], 00102h                ; c7 46 12 02 01
     mov word [bp+00ch], 0504dh                ; c7 46 0c 4d 50
     mov word [bp+010h], strict word 00003h    ; c7 46 10 03 00
-    jmp near 08fach                           ; e9 ba 00
+    jmp near 08feah                           ; e9 ba 00
     mov word [bp+012h], 0f000h                ; c7 46 12 00 f0
-    mov word [bp+00ch], 09504h                ; c7 46 0c 04 95
+    mov word [bp+00ch], 09544h                ; c7 46 0c 44 95
     mov word [bp+010h], 0f000h                ; c7 46 10 00 f0
     mov ax, strict word 0fff0h                ; b8 f0 ff
     mov word [bp+006h], ax                    ; 89 46 06
     mov word [bp+004h], ax                    ; 89 46 04
-    jmp near 08fach                           ; e9 9f 00
+    jmp near 08feah                           ; e9 9f 00
     mov word [bp+012h], 0f000h                ; c7 46 12 00 f0
     mov word [bp+00ch], 0da40h                ; c7 46 0c 40 da
     mov ax, 0f000h                            ; b8 00 f0
@@ -13324,43 +13355,43 @@ _apm_function:                               ; 0xf8ebd LB 0xf5
     sal ebx, 010h                             ; 66 c1 e3 10
     mov si, ax                                ; 89 c6
     sal esi, 010h                             ; 66 c1 e6 10
-    jmp near 08fach                           ; e9 74 00
+    jmp near 08feah                           ; e9 74 00
     sti                                       ; fb
     hlt                                       ; f4
-    jmp near 08fach                           ; e9 6f 00
+    jmp near 08feah                           ; e9 6f 00
     cmp word [bp+010h], strict byte 00003h    ; 83 7e 10 03
-    je short 08f62h                           ; 74 1f
+    je short 08fa0h                           ; 74 1f
     cmp word [bp+010h], strict byte 00002h    ; 83 7e 10 02
-    je short 08f5ah                           ; 74 11
+    je short 08f98h                           ; 74 11
     cmp word [bp+010h], strict byte 00001h    ; 83 7e 10 01
-    jne short 08f6ah                          ; 75 1b
+    jne short 08fa8h                          ; 75 1b
     mov dx, 08900h                            ; ba 00 89
     mov ax, 00d2ah                            ; b8 2a 0d
-    call 08e84h                               ; e8 2c ff
-    jmp short 08fach                          ; eb 52
+    call 08ec2h                               ; e8 2c ff
+    jmp short 08feah                          ; eb 52
     mov dx, 08900h                            ; ba 00 89
     mov ax, 00d32h                            ; b8 32 0d
-    jmp short 08f55h                          ; eb f3
+    jmp short 08f93h                          ; eb f3
     mov dx, 08900h                            ; ba 00 89
     mov ax, 00d3ah                            ; b8 3a 0d
-    jmp short 08f55h                          ; eb eb
+    jmp short 08f93h                          ; eb eb
     or ah, 00ah                               ; 80 cc 0a
     mov word [bp+012h], ax                    ; 89 46 12
     mov word [bp+018h], dx                    ; 89 56 18
-    jmp short 08fach                          ; eb 37
+    jmp short 08feah                          ; eb 37
     mov word [bp+012h], 00102h                ; c7 46 12 02 01
-    jmp short 08fach                          ; eb 30
+    jmp short 08feah                          ; eb 30
     or ah, 080h                               ; 80 cc 80
-    jmp short 08f6dh                          ; eb ec
+    jmp short 08fabh                          ; eb ec
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 55 89
+    call 018e1h                               ; e8 17 89
     push word [bp+00ch]                       ; ff 76 0c
     push word [bp+012h]                       ; ff 76 12
     push 00d43h                               ; 68 43 0d
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 88 89
+    call 01922h                               ; e8 4a 89
     add sp, strict byte 00008h                ; 83 c4 08
     mov ax, word [bp+012h]                    ; 8b 46 12
     xor ah, ah                                ; 30 e4
@@ -13371,7 +13402,7 @@ _apm_function:                               ; 0xf8ebd LB 0xf5
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-pci16_select_reg_:                           ; 0xf8fb2 LB 0x24
+pci16_select_reg_:                           ; 0xf8ff0 LB 0x24
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -13388,7 +13419,7 @@ pci16_select_reg_:                           ; 0xf8fb2 LB 0x24
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-pci16_find_device_:                          ; 0xf8fd6 LB 0xf7
+pci16_find_device_:                          ; 0xf9014 LB 0xf7
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -13402,49 +13433,49 @@ pci16_find_device_:                          ; 0xf8fd6 LB 0xf7
     xor bx, bx                                ; 31 db
     mov byte [bp-008h], 000h                  ; c6 46 f8 00
     test bl, 007h                             ; f6 c3 07
-    jne short 0901eh                          ; 75 2d
+    jne short 0905ch                          ; 75 2d
     mov dx, strict word 0000eh                ; ba 0e 00
     mov ax, bx                                ; 89 d8
-    call 08fb2h                               ; e8 b9 ff
+    call 08ff0h                               ; e8 b9 ff
     mov dx, 00cfeh                            ; ba fe 0c
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     mov byte [bp-006h], al                    ; 88 46 fa
     cmp AL, strict byte 0ffh                  ; 3c ff
-    jne short 0900ch                          ; 75 06
+    jne short 0904ah                          ; 75 06
     add bx, strict byte 00008h                ; 83 c3 08
-    jmp near 0909fh                           ; e9 93 00
+    jmp near 090ddh                           ; e9 93 00
     test byte [bp-006h], 080h                 ; f6 46 fa 80
-    je short 09019h                           ; 74 07
+    je short 09057h                           ; 74 07
     mov word [bp-00ah], strict word 00001h    ; c7 46 f6 01 00
-    jmp short 0901eh                          ; eb 05
+    jmp short 0905ch                          ; eb 05
     mov word [bp-00ah], strict word 00008h    ; c7 46 f6 08 00
     mov al, byte [bp-006h]                    ; 8a 46 fa
     and AL, strict byte 007h                  ; 24 07
     cmp AL, strict byte 001h                  ; 3c 01
-    jne short 09046h                          ; 75 1f
+    jne short 09084h                          ; 75 1f
     mov ax, bx                                ; 89 d8
     shr ax, 008h                              ; c1 e8 08
     test ax, ax                               ; 85 c0
-    jne short 09046h                          ; 75 16
+    jne short 09084h                          ; 75 16
     mov dx, strict word 0001ah                ; ba 1a 00
     mov ax, bx                                ; 89 d8
-    call 08fb2h                               ; e8 7a ff
+    call 08ff0h                               ; e8 7a ff
     mov dx, 00cfeh                            ; ba fe 0c
     in AL, DX                                 ; ec
     db  02ah, 0e4h
     ; sub ah, ah                                ; 2a e4
     cmp al, byte [bp-008h]                    ; 3a 46 f8
-    jbe short 09046h                          ; 76 03
+    jbe short 09084h                          ; 76 03
     mov byte [bp-008h], al                    ; 88 46 f8
     test di, di                               ; 85 ff
-    je short 0904fh                           ; 74 05
+    je short 0908dh                           ; 74 05
     mov dx, strict word 00008h                ; ba 08 00
-    jmp short 09051h                          ; eb 02
+    jmp short 0908fh                          ; eb 02
     xor dx, dx                                ; 31 d2
     mov ax, bx                                ; 89 d8
-    call 08fb2h                               ; e8 5c ff
+    call 08ff0h                               ; e8 5c ff
     mov dx, 00cfch                            ; ba fc 0c
     in eax, DX                                ; 66 ed
     db  08bh, 0d0h
@@ -13455,49 +13486,50 @@ pci16_find_device_:                          ; 0xf8fd6 LB 0xf7
     mov word [bp-00ch], dx                    ; 89 56 f4
     mov word [bp-010h], strict word 00000h    ; c7 46 f0 00 00
     test di, di                               ; 85 ff
-    je short 09080h                           ; 74 0f
+    je short 090beh                           ; 74 0f
     mov cx, strict word 00008h                ; b9 08 00
     shr dx, 1                                 ; d1 ea
     rcr ax, 1                                 ; d1 d8
-    loop 09074h                               ; e2 fa
+    loop 090b2h                               ; e2 fa
     mov word [bp-00eh], ax                    ; 89 46 f2
     mov word [bp-00ch], dx                    ; 89 56 f4
     mov ax, word [bp-00ch]                    ; 8b 46 f4
     cmp ax, word [bp-014h]                    ; 3b 46 ec
-    jne short 09090h                          ; 75 08
+    jne short 090ceh                          ; 75 08
     mov ax, word [bp-00eh]                    ; 8b 46 f2
     cmp ax, word [bp-012h]                    ; 3b 46 ee
-    je short 09096h                           ; 74 06
+    je short 090d4h                           ; 74 06
     cmp word [bp-010h], strict byte 00000h    ; 83 7e f0 00
-    je short 0909ch                           ; 74 06
+    je short 090dah                           ; 74 06
     dec si                                    ; 4e
     cmp si, strict byte 0ffffh                ; 83 fe ff
-    je short 090aeh                           ; 74 12
+    je short 090ech                           ; 74 12
     add bx, word [bp-00ah]                    ; 03 5e f6
     mov dx, bx                                ; 89 da
     shr dx, 008h                              ; c1 ea 08
     movzx ax, byte [bp-008h]                  ; 0f b6 46 f8
     cmp dx, ax                                ; 39 c2
-    jbe near 08fech                           ; 0f 86 3e ff
+    jbe near 0902ah                           ; 0f 86 3e ff
     cmp si, strict byte 0ffffh                ; 83 fe ff
-    jne short 090b7h                          ; 75 04
+    jne short 090f5h                          ; 75 04
     mov ax, bx                                ; 89 d8
-    jmp short 090bah                          ; eb 03
+    jmp short 090f8h                          ; eb 03
     mov ax, strict word 0ffffh                ; b8 ff ff
     lea sp, [bp-004h]                         ; 8d 66 fc
     pop di                                    ; 5f
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-    scasw                                     ; af
-    xchg cx, ax                               ; 91
-    leave                                     ; c9
+    in ax, DX                                 ; ed
     xchg cx, ax                               ; 91
-    fcom qword [bx+di-06e0fh]                 ; dc 91 f1 91
-    add AL, strict byte 092h                  ; 04 92
-    pop SS                                    ; 17
+    pop ES                                    ; 07
+    xchg dx, ax                               ; 92
+    sbb dl, byte [bp+si-06dd1h]               ; 1a 92 2f 92
+    inc dx                                    ; 42
+    xchg dx, ax                               ; 92
+    push bp                                   ; 55
     xchg dx, ax                               ; 92
-_pci16_function:                             ; 0xf90cd LB 0x1d7
+_pci16_function:                             ; 0xf910b LB 0x1d7
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -13511,69 +13543,69 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
     cmp bx, strict byte 00003h                ; 83 fb 03
-    jc short 09106h                           ; 72 1a
-    jbe short 0915eh                          ; 76 70
+    jc short 09144h                           ; 72 1a
+    jbe short 0919ch                          ; 76 70
     cmp bx, strict byte 0000eh                ; 83 fb 0e
-    je near 0922bh                            ; 0f 84 36 01
+    je near 09269h                            ; 0f 84 36 01
     cmp bx, strict byte 00008h                ; 83 fb 08
-    jc near 09270h                            ; 0f 82 74 01
+    jc near 092aeh                            ; 0f 82 74 01
     cmp bx, strict byte 0000dh                ; 83 fb 0d
-    jbe near 09183h                           ; 0f 86 80 00
-    jmp near 09270h                           ; e9 6a 01
+    jbe near 091c1h                           ; 0f 86 80 00
+    jmp near 092aeh                           ; e9 6a 01
     cmp bx, strict byte 00002h                ; 83 fb 02
-    je short 0912eh                           ; 74 23
+    je short 0916ch                           ; 74 23
     cmp bx, strict byte 00001h                ; 83 fb 01
-    jne near 09270h                           ; 0f 85 5e 01
+    jne near 092aeh                           ; 0f 85 5e 01
     mov word [bp+020h], strict word 00001h    ; c7 46 20 01 00
     mov word [bp+014h], 00210h                ; c7 46 14 10 02
     mov word [bp+01ch], strict word 00000h    ; c7 46 1c 00 00
     mov word [bp+018h], 04350h                ; c7 46 18 50 43
     mov word [bp+01ah], 02049h                ; c7 46 1a 49 20
-    jmp near 0929dh                           ; e9 6f 01
+    jmp near 092dbh                           ; e9 6f 01
     cmp word [bp+018h], strict byte 0ffffh    ; 83 7e 18 ff
-    jne short 0913ah                          ; 75 06
+    jne short 09178h                          ; 75 06
     or ah, 083h                               ; 80 cc 83
-    jmp near 09296h                           ; e9 5c 01
+    jmp near 092d4h                           ; e9 5c 01
     mov bx, word [bp+008h]                    ; 8b 5e 08
     mov dx, word [bp+01ch]                    ; 8b 56 1c
     mov ax, word [bp+018h]                    ; 8b 46 18
     xor cx, cx                                ; 31 c9
-    call 08fd6h                               ; e8 8e fe
+    call 09014h                               ; e8 8e fe
     cmp ax, strict word 0ffffh                ; 3d ff ff
-    jne short 09158h                          ; 75 0b
+    jne short 09196h                          ; 75 0b
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
     or ah, 086h                               ; 80 cc 86
-    jmp near 09296h                           ; e9 3e 01
+    jmp near 092d4h                           ; e9 3e 01
     mov word [bp+014h], ax                    ; 89 46 14
-    jmp near 0929dh                           ; e9 3f 01
+    jmp near 092dbh                           ; e9 3f 01
     mov bx, word [bp+008h]                    ; 8b 5e 08
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov dx, word [bp+01eh]                    ; 8b 56 1e
     mov cx, strict word 00001h                ; b9 01 00
-    call 08fd6h                               ; e8 69 fe
+    call 09014h                               ; e8 69 fe
     cmp ax, strict word 0ffffh                ; 3d ff ff
-    jne short 0917dh                          ; 75 0b
+    jne short 091bbh                          ; 75 0b
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
     or ah, 086h                               ; 80 cc 86
-    jmp near 09296h                           ; e9 19 01
+    jmp near 092d4h                           ; e9 19 01
     mov word [bp+014h], ax                    ; 89 46 14
-    jmp near 0929dh                           ; e9 1a 01
+    jmp near 092dbh                           ; e9 1a 01
     cmp word [bp+004h], 00100h                ; 81 7e 04 00 01
-    jc short 09190h                           ; 72 06
+    jc short 091ceh                           ; 72 06
     or ah, 087h                               ; 80 cc 87
-    jmp near 09296h                           ; e9 06 01
+    jmp near 092d4h                           ; e9 06 01
     mov dx, word [bp+004h]                    ; 8b 56 04
     mov ax, word [bp+014h]                    ; 8b 46 14
-    call 08fb2h                               ; e8 19 fe
+    call 08ff0h                               ; e8 19 fe
     mov bx, word [bp+020h]                    ; 8b 5e 20
     xor bh, bh                                ; 30 ff
     sub bx, strict byte 00008h                ; 83 eb 08
     cmp bx, strict byte 00005h                ; 83 fb 05
-    jnbe near 0929dh                          ; 0f 87 f5 00
+    jnbe near 092dbh                          ; 0f 87 f5 00
     add bx, bx                                ; 01 db
-    jmp word [cs:bx-06f3fh]                   ; 2e ff a7 c1 90
+    jmp word [cs:bx-06f01h]                   ; 2e ff a7 ff 90
     mov bx, word [bp+01ch]                    ; 8b 5e 1c
     xor bl, bl                                ; 30 db
     mov dx, word [bp+004h]                    ; 8b 56 04
@@ -13584,14 +13616,14 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     ; sub ah, ah                                ; 2a e4
     or bx, ax                                 ; 09 c3
     mov word [bp+01ch], bx                    ; 89 5e 1c
-    jmp near 0929dh                           ; e9 d4 00
+    jmp near 092dbh                           ; e9 d4 00
     mov dx, word [bp+004h]                    ; 8b 56 04
     xor dh, dh                                ; 30 f6
     and dl, 002h                              ; 80 e2 02
     add dx, 00cfch                            ; 81 c2 fc 0c
     in ax, DX                                 ; ed
     mov word [bp+01ch], ax                    ; 89 46 1c
-    jmp near 0929dh                           ; e9 c1 00
+    jmp near 092dbh                           ; e9 c1 00
     mov dx, 00cfch                            ; ba fc 0c
     in eax, DX                                ; 66 ed
     db  08bh, 0d0h
@@ -13600,21 +13632,21 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     xchg dx, ax                               ; 92
     mov word [bp+01ch], ax                    ; 89 46 1c
     mov word [bp+01eh], dx                    ; 89 56 1e
-    jmp near 0929dh                           ; e9 ac 00
+    jmp near 092dbh                           ; e9 ac 00
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov dx, word [bp+004h]                    ; 8b 56 04
     xor dh, dh                                ; 30 f6
     and dl, 003h                              ; 80 e2 03
     add dx, 00cfch                            ; 81 c2 fc 0c
     out DX, AL                                ; ee
-    jmp near 0929dh                           ; e9 99 00
+    jmp near 092dbh                           ; e9 99 00
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov dx, word [bp+004h]                    ; 8b 56 04
     xor dh, dh                                ; 30 f6
     and dl, 002h                              ; 80 e2 02
     add dx, 00cfch                            ; 81 c2 fc 0c
     out DX, ax                                ; ef
-    jmp near 0929dh                           ; e9 86 00
+    jmp near 092dbh                           ; e9 86 00
     mov ax, word [bp+01ch]                    ; 8b 46 1c
     mov cx, word [bp+01eh]                    ; 8b 4e 1e
     mov dx, 00cfch                            ; ba fc 0c
@@ -13623,20 +13655,20 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     db  08bh, 0c1h
     ; mov ax, cx                                ; 8b c1
     out DX, eax                               ; 66 ef
-    jmp short 0929dh                          ; eb 72
+    jmp short 092dbh                          ; eb 72
     mov bx, word [bp+004h]                    ; 8b 5e 04
     mov es, [bp+026h]                         ; 8e 46 26
     mov word [bp-008h], bx                    ; 89 5e f8
     mov [bp-006h], es                         ; 8c 46 fa
     mov cx, word [0f4a0h]                     ; 8b 0e a0 f4
     cmp cx, word [es:bx]                      ; 26 3b 0f
-    jbe short 09251h                          ; 76 11
+    jbe short 0928fh                          ; 76 11
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
     or ah, 089h                               ; 80 cc 89
     mov word [bp+020h], ax                    ; 89 46 20
     or word [bp+02ch], strict byte 00001h     ; 83 4e 2c 01
-    jmp short 09265h                          ; eb 14
+    jmp short 092a3h                          ; eb 14
     les di, [es:bx+002h]                      ; 26 c4 7f 02
     mov si, 0f2c0h                            ; be c0 f2
     mov dx, ds                                ; 8c da
@@ -13648,18 +13680,18 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     mov ax, word [0f4a0h]                     ; a1 a0 f4
     les bx, [bp-008h]                         ; c4 5e f8
     mov word [es:bx], ax                      ; 26 89 07
-    jmp short 0929dh                          ; eb 2d
+    jmp short 092dbh                          ; eb 2d
     mov bx, 00dbah                            ; bb ba 0d
     mov cx, ds                                ; 8c d9
     mov ax, strict word 00004h                ; b8 04 00
-    call 018e1h                               ; e8 66 86
+    call 018e1h                               ; e8 28 86
     mov ax, word [bp+014h]                    ; 8b 46 14
     push ax                                   ; 50
     mov ax, word [bp+020h]                    ; 8b 46 20
     push ax                                   ; 50
     push 00d76h                               ; 68 76 0d
     push strict byte 00004h                   ; 6a 04
-    call 01922h                               ; e8 97 86
+    call 01922h                               ; e8 59 86
     add sp, strict byte 00008h                ; 83 c4 08
     mov ax, word [bp+020h]                    ; 8b 46 20
     xor ah, ah                                ; 30 e4
@@ -13671,7 +13703,7 @@ _pci16_function:                             ; 0xf90cd LB 0x1d7
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn                                      ; c3
-pci_find_classcode_:                         ; 0xf92a4 LB 0x2b
+pci_find_classcode_:                         ; 0xf92e2 LB 0x2b
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
@@ -13686,7 +13718,7 @@ pci_find_classcode_:                         ; 0xf92a4 LB 0x2b
     ; mov cx, dx                                ; 8b ca
     int 01ah                                  ; cd 1a
     cmp ah, 000h                              ; 80 fc 00
-    je near 092c5h                            ; 0f 84 03 00
+    je near 09303h                            ; 0f 84 03 00
     mov bx, strict word 0ffffh                ; bb ff ff
     mov ax, bx                                ; 89 d8
     lea sp, [bp-006h]                         ; 8d 66 fa
@@ -13695,7 +13727,7 @@ pci_find_classcode_:                         ; 0xf92a4 LB 0x2b
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-pci_read_config_byte_:                       ; 0xf92cf LB 0x24
+pci_read_config_byte_:                       ; 0xf930d LB 0x24
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -13714,7 +13746,7 @@ pci_read_config_byte_:                       ; 0xf92cf LB 0x24
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-pci_read_config_word_:                       ; 0xf92f3 LB 0x22
+pci_read_config_word_:                       ; 0xf9331 LB 0x22
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -13733,7 +13765,7 @@ pci_read_config_word_:                       ; 0xf92f3 LB 0x22
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-pci_read_config_dword_:                      ; 0xf9315 LB 0x27
+pci_read_config_dword_:                      ; 0xf9353 LB 0x27
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push cx                                   ; 51
@@ -13754,7 +13786,7 @@ pci_read_config_dword_:                      ; 0xf9315 LB 0x27
     pop cx                                    ; 59
     pop bp                                    ; 5d
     retn                                      ; c3
-vds_is_present_:                             ; 0xf933c LB 0x1d
+vds_is_present_:                             ; 0xf937a LB 0x1d
     push bx                                   ; 53
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
@@ -13762,7 +13794,7 @@ vds_is_present_:                             ; 0xf933c LB 0x1d
     mov ax, strict word 00040h                ; b8 40 00
     mov es, ax                                ; 8e c0
     test byte [es:bx], 020h                   ; 26 f6 07 20
-    je short 09354h                           ; 74 06
+    je short 09392h                           ; 74 06
     mov ax, strict word 00001h                ; b8 01 00
     pop bp                                    ; 5d
     pop bx                                    ; 5b
@@ -13771,7 +13803,7 @@ vds_is_present_:                             ; 0xf933c LB 0x1d
     pop bp                                    ; 5d
     pop bx                                    ; 5b
     retn                                      ; c3
-vds_real_to_lin_:                            ; 0xf9359 LB 0x1e
+vds_real_to_lin_:                            ; 0xf9397 LB 0x1e
     push bx                                   ; 53
     push cx                                   ; 51
     push bp                                   ; 55
@@ -13782,7 +13814,7 @@ vds_real_to_lin_:                            ; 0xf9359 LB 0x1e
     mov cx, strict word 00004h                ; b9 04 00
     sal ax, 1                                 ; d1 e0
     rcl dx, 1                                 ; d1 d2
-    loop 09367h                               ; e2 fa
+    loop 093a5h                               ; e2 fa
     xor cx, cx                                ; 31 c9
     add ax, bx                                ; 01 d8
     adc dx, cx                                ; 11 ca
@@ -13790,7 +13822,7 @@ vds_real_to_lin_:                            ; 0xf9359 LB 0x1e
     pop cx                                    ; 59
     pop bx                                    ; 5b
     retn                                      ; c3
-vds_build_sg_list_:                          ; 0xf9377 LB 0x79
+vds_build_sg_list_:                          ; 0xf93b5 LB 0x79
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push si                                   ; 56
@@ -13804,23 +13836,23 @@ vds_build_sg_list_:                          ; 0xf9377 LB 0x79
     mov word [es:di], bx                      ; 26 89 1d
     mov bx, word [bp+006h]                    ; 8b 5e 06
     mov word [es:di+002h], bx                 ; 26 89 5d 02
-    call 09359h                               ; e8 c3 ff
+    call 09397h                               ; e8 c3 ff
     mov es, si                                ; 8e c6
     mov word [es:di+004h], ax                 ; 26 89 45 04
     mov word [es:di+006h], dx                 ; 26 89 55 06
     mov word [es:di+008h], strict word 00000h ; 26 c7 45 08 00 00
-    call 0933ch                               ; e8 93 ff
+    call 0937ah                               ; e8 93 ff
     test ax, ax                               ; 85 c0
-    je short 093c0h                           ; 74 13
+    je short 093feh                           ; 74 13
     mov es, si                                ; 8e c6
     mov ax, 08105h                            ; b8 05 81
     mov dx, strict word 00000h                ; ba 00 00
     int 04bh                                  ; cd 4b
-    jc near 093bdh                            ; 0f 82 02 00
+    jc near 093fbh                            ; 0f 82 02 00
     db  032h, 0c0h
     ; xor al, al                                ; 32 c0
     cbw                                       ; 98
-    jmp short 093e7h                          ; eb 27
+    jmp short 09425h                          ; eb 27
     mov es, si                                ; 8e c6
     mov word [es:di+00eh], strict word 00001h ; 26 c7 45 0e 01 00
     mov dx, word [es:di+004h]                 ; 26 8b 55 04
@@ -13837,21 +13869,21 @@ vds_build_sg_list_:                          ; 0xf9377 LB 0x79
     pop si                                    ; 5e
     pop bp                                    ; 5d
     retn 00004h                               ; c2 04 00
-vds_free_sg_list_:                           ; 0xf93f0 LB 0x30
+vds_free_sg_list_:                           ; 0xf942e LB 0x32
     push bp                                   ; 55
     mov bp, sp                                ; 89 e5
     push bx                                   ; 53
     push di                                   ; 57
     mov bx, ax                                ; 89 c3
-    call 0933ch                               ; e8 42 ff
+    call 0937ah                               ; e8 42 ff
     test ax, ax                               ; 85 c0
-    je short 09411h                           ; 74 13
+    je short 0944fh                           ; 74 13
     mov di, bx                                ; 89 df
     mov es, dx                                ; 8e c2
     mov ax, 08106h                            ; b8 06 81
     mov dx, strict word 00000h                ; ba 00 00
     int 04bh                                  ; cd 4b
-    jc near 09410h                            ; 0f 82 02 00
+    jc near 0944eh                            ; 0f 82 02 00
     db  032h, 0c0h
     ; xor al, al                                ; 32 c0
     cbw                                       ; 98
@@ -13862,7 +13894,8 @@ vds_free_sg_list_:                           ; 0xf93f0 LB 0x30
     pop bx                                    ; 5b
     pop bp                                    ; 5d
     retn                                      ; c3
-__U4D:                                       ; 0xf9420 LB 0x39
+    times 0x2 db 0
+__U4D:                                       ; 0xf9460 LB 0x39
     pushfw                                    ; 9c
     push eax                                  ; 66 50
     push edx                                  ; 66 52
@@ -13892,7 +13925,7 @@ __U4D:                                       ; 0xf9420 LB 0x39
     rol eax, 010h                             ; 66 c1 c0 10
     popfw                                     ; 9d
     retn                                      ; c3
-__U4M:                                       ; 0xf9459 LB 0x31
+__U4M:                                       ; 0xf9499 LB 0x31
     pushfw                                    ; 9c
     push eax                                  ; 66 50
     push edx                                  ; 66 52
@@ -13917,7 +13950,7 @@ __U4M:                                       ; 0xf9459 LB 0x31
     rol eax, 010h                             ; 66 c1 c0 10
     popfw                                     ; 9d
     retn                                      ; c3
-_fmemset_:                                   ; 0xf948a LB 0xd
+_fmemset_:                                   ; 0xf94ca LB 0xd
     push di                                   ; 57
     mov es, dx                                ; 8e c2
     db  08bh, 0f8h
@@ -13927,7 +13960,7 @@ _fmemset_:                                   ; 0xf948a LB 0xd
     xchg al, bl                               ; 86 d8
     pop di                                    ; 5f
     retn                                      ; c3
-_fmemcpy_:                                   ; 0xf9497 LB 0x33
+_fmemcpy_:                                   ; 0xf94d7 LB 0x33
     push bp                                   ; 55
     db  08bh, 0ech
     ; mov bp, sp                                ; 8b ec
@@ -13947,9 +13980,21 @@ _fmemcpy_:                                   ; 0xf9497 LB 0x33
     pop di                                    ; 5f
     leave                                     ; c9
     retn                                      ; c3
-    db  000h, 0e0h, 094h, 0e2h, 094h, 0e6h, 094h, 0e6h, 094h, 0e6h, 094h, 0e8h, 094h, 0e8h, 094h, 0eah
-    db  094h, 0eeh, 094h, 0eeh, 094h, 0f0h, 094h, 0f5h, 094h, 0f7h, 094h
-apm_worker:                                  ; 0xf94ca LB 0x3a
+    add byte [bx+si], ah                      ; 00 20
+    xchg bp, ax                               ; 95
+    and dl, byte [di-06adah]                  ; 22 95 26 95
+    db  026h, 095h
+    ; es xchg bp, ax                            ; 26 95
+    db  026h, 095h
+    ; es xchg bp, ax                            ; 26 95
+    sub byte [di-06ad8h], dl                  ; 28 95 28 95
+    sub dl, byte [di-06ad2h]                  ; 2a 95 2e 95
+    db  02eh, 095h
+    ; cs xchg bp, ax                            ; 2e 95
+    xor byte [di-06acbh], dl                  ; 30 95 35 95
+    aaa                                       ; 37
+    xchg bp, ax                               ; 95
+apm_worker:                                  ; 0xf950a LB 0x3a
     sti                                       ; fb
     push ax                                   ; 50
     db  032h, 0e4h
@@ -13961,29 +14006,29 @@ apm_worker:                                  ; 0xf94ca LB 0x3a
     cmp AL, strict byte 00dh                  ; 3c 0d
     pop ax                                    ; 58
     mov AH, strict byte 053h                  ; b4 53
-    jnc short 09500h                          ; 73 25
-    jmp word [cs:bp-06b50h]                   ; 2e ff a6 b0 94
-    jmp short 094feh                          ; eb 1c
+    jnc short 09540h                          ; 73 25
+    jmp word [cs:bp-06b10h]                   ; 2e ff a6 f0 94
+    jmp short 0953eh                          ; eb 1c
     sti                                       ; fb
     hlt                                       ; f4
-    jmp short 094feh                          ; eb 18
-    jmp short 094feh                          ; eb 16
-    jmp short 09500h                          ; eb 16
+    jmp short 0953eh                          ; eb 18
+    jmp short 0953eh                          ; eb 16
+    jmp short 09540h                          ; eb 16
     mov AH, strict byte 080h                  ; b4 80
-    jmp short 09502h                          ; eb 14
-    jmp short 09500h                          ; eb 10
+    jmp short 09542h                          ; eb 14
+    jmp short 09540h                          ; eb 10
     mov ax, 00102h                            ; b8 02 01
-    jmp short 094feh                          ; eb 09
-    jmp short 094feh                          ; eb 07
+    jmp short 0953eh                          ; eb 09
+    jmp short 0953eh                          ; eb 07
     mov BL, strict byte 000h                  ; b3 00
     mov cx, strict word 00000h                ; b9 00 00
-    jmp short 094feh                          ; eb 00
+    jmp short 0953eh                          ; eb 00
     clc                                       ; f8
     retn                                      ; c3
     mov AH, strict byte 009h                  ; b4 09
     stc                                       ; f9
     retn                                      ; c3
-apm_pm16_entry:                              ; 0xf9504 LB 0x11
+apm_pm16_entry:                              ; 0xf9544 LB 0x11
     mov AH, strict byte 002h                  ; b4 02
     push DS                                   ; 1e
     push bp                                   ; 55
@@ -13991,13 +14036,13 @@ apm_pm16_entry:                              ; 0xf9504 LB 0x11
     pop bp                                    ; 5d
     add bp, strict byte 00008h                ; 83 c5 08
     mov ds, bp                                ; 8e dd
-    call 094cah                               ; e8 b8 ff
+    call 0950ah                               ; e8 b8 ff
     pop bp                                    ; 5d
     pop DS                                    ; 1f
     retf                                      ; cb
 
-  ; Padding 0x44eb bytes at 0xf9515
-  times 17643 db 0
+  ; Padding 0x44ab bytes at 0xf9555
+  times 17579 db 0
 
 section BIOS32 progbits vstart=0xda00 align=1 ; size=0x3cb class=CODE group=AUTO
 bios32_service:                              ; 0xfda00 LB 0x26
@@ -14044,7 +14089,7 @@ apm_pm32_entry:                              ; 0xfda40 LB 0x21
     pop bp                                    ; 5d
     add bp, strict byte 00008h                ; 83 c5 08
     push ebp                                  ; 66 55
-    mov bp, 09506h                            ; bd 06 95
+    mov bp, 09546h                            ; bd 46 95
     add byte [bx+si], al                      ; 00 00
     push ebp                                  ; 66 55
     mov AH, strict byte 003h                  ; b4 03
@@ -14751,8 +14796,8 @@ hard_drive_post:                             ; 0xfe2d2 LB 0x12c
     cld                                       ; fc
     call 01b5dh                               ; e8 3c 38
     call 01f57h                               ; e8 33 3c
-    call 08d86h                               ; e8 5f aa
-    call 07e2dh                               ; e8 03 9b
+    call 08dc4h                               ; e8 9d aa
+    call 07e1bh                               ; e8 f1 9a
     call 0ed2fh                               ; e8 02 0a
     call 0e2d2h                               ; e8 a2 ff
     push CS                                   ; 0e
@@ -14857,7 +14902,7 @@ int19_handler:                               ; 0xfe6f2 LB 0x61
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 05cech                               ; e8 aa 75
+    call 05cdah                               ; e8 98 75
     popaw                                     ; 61
     pop ES                                    ; 07
     pop DS                                    ; 1f
@@ -14973,7 +15018,7 @@ ebda_post:                                   ; 0xfe7c0 LB 0xa4
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 0505ah                               ; e8 18 68
+    call 05048h                               ; e8 06 68
     popaw                                     ; 61
     pop DS                                    ; 1f
     pop ES                                    ; 07
@@ -14990,7 +15035,7 @@ ebda_post:                                   ; 0xfe7c0 LB 0xa4
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 0505ah                               ; e8 fa 67
+    call 05048h                               ; e8 e8 67
     popaw                                     ; 61
     pop DS                                    ; 1f
     pop ES                                    ; 07
@@ -15089,7 +15134,7 @@ pmode_setup:                                 ; 0xfe8e0 LB 0x37b
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 04c69h                               ; e8 9a 62
+    call 04c57h                               ; e8 88 62
     pop ES                                    ; 07
     popaw                                     ; 61
     pop DS                                    ; 1f
@@ -15105,7 +15150,7 @@ pmode_setup:                                 ; 0xfe8e0 LB 0x37b
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 06744h                               ; e8 5f 7d
+    call 06732h                               ; e8 4d 7d
     pop DS                                    ; 1f
     pop ES                                    ; 07
     popaw                                     ; 61
@@ -15206,9 +15251,9 @@ int13_notfloppy:                             ; 0xfecc8 LB 0x14
 int13_disk:                                  ; 0xfecdc LB 0xd
     cmp ah, 040h                              ; 80 fc 40
     jnbe short 0ece6h                         ; 77 05
-    call 053dfh                               ; e8 fb 66
+    call 053cdh                               ; e8 e9 66
     jmp short 0ece9h                          ; eb 03
-    call 05820h                               ; e8 37 6b
+    call 0580eh                               ; e8 25 6b
 int13_out:                                   ; 0xfece9 LB 0x4
     pop DS                                    ; 1f
     pop ES                                    ; 07
@@ -15421,7 +15466,7 @@ int17_handler:                               ; 0xfefd4 LB 0xd
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 0709eh                               ; e8 c1 80
+    call 0708ch                               ; e8 af 80
     popaw                                     ; 61
     pop ES                                    ; 07
     pop DS                                    ; 1f
@@ -15781,20 +15826,20 @@ int15_handler:                               ; 0xff859 LB 0x2e
     je short 0f882h                           ; 74 0e
     cmp ah, 0c2h                              ; 80 fc c2
     je short 0f887h                           ; 74 0e
-    call 05ef9h                               ; e8 7d 66
+    call 05ee7h                               ; e8 6b 66
     popaw                                     ; 61
     pop ES                                    ; 07
     pop DS                                    ; 1f
     popfw                                     ; 9d
     jmp short 0f895h                          ; eb 13
-    call 08ebdh                               ; e8 38 96
+    call 08efbh                               ; e8 76 96
     jmp short 0f87ch                          ; eb f5
 int15_handler_mouse:                         ; 0xff887 LB 0x5
-    call 06d13h                               ; e8 89 74
+    call 06d01h                               ; e8 77 74
     jmp short 0f87ch                          ; eb f0
 int15_handler32:                             ; 0xff88c LB 0x9
     pushad                                    ; 66 60
-    call 063c6h                               ; e8 35 6b
+    call 063b4h                               ; e8 23 6b
     popad                                     ; 66 61
     jmp short 0f87dh                          ; eb e8
 iret_modify_cf:                              ; 0xff895 LB 0x14
@@ -15824,7 +15869,7 @@ int74_handler:                               ; 0xff8a9 LB 0x2e
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 06c49h                               ; e8 8c 73
+    call 06c37h                               ; e8 7a 73
     pop cx                                    ; 59
     jcxz 0f8cch                               ; e3 0c
     push strict byte 00000h                   ; 6a 00
@@ -15916,8 +15961,8 @@ font8x8:                                     ; 0xffa6e LB 0x421
     db  000h, 000h, 0fch, 098h, 030h, 064h, 0fch, 000h, 01ch, 030h, 030h, 0e0h, 030h, 030h, 01ch, 000h
     db  018h, 018h, 018h, 000h, 018h, 018h, 018h, 000h, 0e0h, 030h, 030h, 01ch, 030h, 030h, 0e0h, 000h
     db  076h, 0dch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06ch, 0c6h, 0c6h, 0feh, 000h
-    db  080h, 0fch, 0b1h, 075h, 00fh, 006h, 01eh, 00eh, 01fh, 0fch, 066h, 060h, 0e8h, 050h, 092h, 066h
-    db  061h, 01fh, 007h, 0cfh, 006h, 01eh, 060h, 00eh, 01fh, 0fch, 0e8h, 055h, 06bh, 061h, 01fh, 007h
+    db  080h, 0fch, 0b1h, 075h, 00fh, 006h, 01eh, 00eh, 01fh, 0fch, 066h, 060h, 0e8h, 08eh, 092h, 066h
+    db  061h, 01fh, 007h, 0cfh, 006h, 01eh, 060h, 00eh, 01fh, 0fch, 0e8h, 043h, 06bh, 061h, 01fh, 007h
     db  0cfh
 int70_handler:                               ; 0xffe8f LB 0x16
     push ES                                   ; 06
@@ -15926,7 +15971,7 @@ int70_handler:                               ; 0xffe8f LB 0x16
     push CS                                   ; 0e
     pop DS                                    ; 1f
     cld                                       ; fc
-    call 06922h                               ; e8 8a 6a
+    call 06910h                               ; e8 78 6a
     popaw                                     ; 61
     pop DS                                    ; 1f
     pop ES                                    ; 07
@@ -16025,4 +16070,4 @@ dummy_iret:                                  ; 0xfff53 LB 0x9d
     db  'XM'
 cpu_reset:                                   ; 0xffff0 LB 0x10
     jmp far 0f000h:0e05bh                     ; ea 5b e0 00 f0
-    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 024h
+    db  030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 018h
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
index 99f1982..b0da6b1 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
@@ -1 +1 @@
-aa8db86fdc9998cff85c064af381499f *VBoxPcBios.rom
+56c55fc067e346dc9903c5cd2ddadb17 *VBoxPcBios.rom
diff --git a/src/VBox/Devices/PC/BIOS/ahci.c b/src/VBox/Devices/PC/BIOS/ahci.c
index 7a571ba..d91a8e9 100644
--- a/src/VBox/Devices/PC/BIOS/ahci.c
+++ b/src/VBox/Devices/PC/BIOS/ahci.c
@@ -626,6 +626,14 @@ void ahci_port_detect_device(ahci_t __far *ahci, uint8_t u8Port)
 
     /* Check if there is a device on the port. */
     VBOXAHCI_PORT_READ_REG(ahci->iobase, u8Port, AHCI_REG_PORT_SSTS, val);
+    if (ahci_ctrl_extract_bits(val, 0xfL, 0) == 0)
+        return; /* No device detected. */
+
+    do
+    {
+        VBOXAHCI_PORT_READ_REG(ahci->iobase, u8Port, AHCI_REG_PORT_SSTS, val);
+    } while (ahci_ctrl_extract_bits(val, 0xfL, 0) == 0x1);
+
     if (ahci_ctrl_extract_bits(val, 0xfL, 0) == 0x3)
     {
         uint8_t     abBuffer[0x0200];
diff --git a/src/VBox/Devices/PC/BIOS/keyboard.c b/src/VBox/Devices/PC/BIOS/keyboard.c
index 9a27d8a..0fc6824 100644
--- a/src/VBox/Devices/PC/BIOS/keyboard.c
+++ b/src/VBox/Devices/PC/BIOS/keyboard.c
@@ -238,10 +238,8 @@ void BIOSCALL keyboard_init(void)
         keyboard_panic(993);
     }
 
-    /* Wait for data */
-    max=0xffff;
-    while ( ((inb(0x64) & 0x01) == 0) && (--max>0) ) outb(0x80, 0x31);
-    if (max==0x0) keyboard_panic(31);
+    /* Wait for reset to complete */
+    while ( (inb(0x64) & 0x01) == 0 ) outb(0x80, 0x31);
 
     if ((inb(0x60) != 0xaa && inb(0x60) != 0xaa)) {
         keyboard_panic(994);
diff --git a/src/VBox/Devices/PC/ipxe/Makefile.kmk b/src/VBox/Devices/PC/ipxe/Makefile.kmk
index 9f878ba..a8b095b 100644
--- a/src/VBox/Devices/PC/ipxe/Makefile.kmk
+++ b/src/VBox/Devices/PC/ipxe/Makefile.kmk
@@ -353,7 +353,7 @@ endif
  # ipxezbin - Compressor?
  #
  BLDPROGS += ipxezbin
- ipxezbin_TEMPLATE = VBOXBLDPROG
+ ipxezbin_TEMPLATE = VBoxBldProg
  ipxezbin_CFLAGS   = -Wno-format
  ipxezbin_SOURCES  = src/util/zbin.c
 
diff --git a/src/VBox/Devices/Storage/ATAPIPassthrough.cpp b/src/VBox/Devices/Storage/ATAPIPassthrough.cpp
index 22cc27f..82d3ce8 100644
--- a/src/VBox/Devices/Storage/ATAPIPassthrough.cpp
+++ b/src/VBox/Devices/Storage/ATAPIPassthrough.cpp
@@ -382,7 +382,11 @@ static int atapiTrackListUpdateFromReadTocPmaAtip(PTRACKLIST pTrackList, const u
         case 0x02:
         case 0x03:
         case 0x04:
+            rc = VERR_NOT_IMPLEMENTED;
+            break;
         case 0x05:
+            rc = VINF_SUCCESS; /* Does not give information about the tracklist. */
+            break;
         default:
             rc = VERR_INVALID_PARAMETER;
     }
@@ -508,6 +512,8 @@ DECLHIDDEN(void) ATAPIPassthroughTrackListDestroy(PTRACKLIST pTrackList)
 
 DECLHIDDEN(void) ATAPIPassthroughTrackListClear(PTRACKLIST pTrackList)
 {
+    AssertPtrReturnVoid(pTrackList);
+
     pTrackList->cTracksCurrent = 0;
 
     /* Mark all tracks as undetected. */
diff --git a/src/VBox/Devices/Storage/DevAHCI.cpp b/src/VBox/Devices/Storage/DevAHCI.cpp
index 1001db5..3db5cb4 100644
--- a/src/VBox/Devices/Storage/DevAHCI.cpp
+++ b/src/VBox/Devices/Storage/DevAHCI.cpp
@@ -80,15 +80,19 @@
 
 #define AHCI_MAX_ALLOC_TOO_MUCH 20
 
-/** The current saved state version. */
-#define AHCI_SAVED_STATE_VERSION                6
+ /** The current saved state version. */
+#define AHCI_SAVED_STATE_VERSION                        8
+/** The saved state version before changing the port reset logic in an incompatible way. */
+#define AHCI_SAVED_STATE_VERSION_PRE_PORT_RESET_CHANGES 7
+/** Saved state version before the per port hotplug port was added. */
+#define AHCI_SAVED_STATE_VERSION_PRE_HOTPLUG_FLAG       6
 /** Saved state version before legacy ATA emulation was dropped. */
-#define AHCI_SAVED_STATE_VERSION_IDE_EMULATION  5
+#define AHCI_SAVED_STATE_VERSION_IDE_EMULATION          5
 /** Saved state version before ATAPI support was added. */
-#define AHCI_SAVED_STATE_VERSION_PRE_ATAPI      3
+#define AHCI_SAVED_STATE_VERSION_PRE_ATAPI              3
 /** The saved state version use in VirtualBox 3.0 and earlier.
  * This was before the config was added and ahciIOTasks was dropped. */
-#define AHCI_SAVED_STATE_VERSION_VBOX_30        2
+#define AHCI_SAVED_STATE_VERSION_VBOX_30                2
 /* for Older ATA state Read handling */
 #define ATA_CTL_SAVED_STATE_VERSION 3
 #define ATA_CTL_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE 1
@@ -691,6 +695,8 @@ typedef struct AHCI
     bool volatile                   fSignalIdle;
     /** Flag whether the controller has BIOS access enabled. */
     bool                            fBootable;
+    /** Flag whether the legacy port reset method should be used to make it work with saved states. */
+    bool                            fLegacyPortResetMethod;
 
     /** Number of usable ports on this controller. */
     uint32_t                        cPortsImpl;
@@ -936,7 +942,7 @@ static size_t ahciCopyToPrdtl(PPDMDEVINS pDevIns, PAHCIREQ pAhciReq,
                               void *pvBuf, size_t cbBuf);
 static size_t ahciCopyFromPrdtl(PPDMDEVINS pDevIns, PAHCIREQ pAhciReq,
                                 void *pvBuf, size_t cbBuf);
-static bool ahciCancelActiveTasks(PAHCIPort pAhciPort);
+static bool ahciCancelActiveTasks(PAHCIPort pAhciPort, PAHCIREQ pAhciReqExcept);
 #endif
 RT_C_DECLS_END
 
@@ -1052,7 +1058,89 @@ DECLCALLBACK(void) ahciCccTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUse
     int rc = ahciHbaSetInterrupt(pAhci, pAhci->uCccPortNr, VERR_IGNORED);
     AssertRC(rc);
 }
+
+/**
+ * Finishes the port reset of the given port.
+ *
+ * @returns nothing.
+ * @param   pAhciPort    The port to finish the reset on.
+ */
+static void ahciPortResetFinish(PAHCIPort pAhciPort)
+{
+    /* Cancel all tasks first. */
+    bool fAllTasksCanceled = ahciCancelActiveTasks(pAhciPort, NULL);
+    Assert(fAllTasksCanceled);
+
+    /* Signature for SATA device. */
+    if (pAhciPort->fATAPI)
+        pAhciPort->regSIG = AHCI_PORT_SIG_ATAPI;
+    else
+        pAhciPort->regSIG = AHCI_PORT_SIG_DISK;
+
+    pAhciPort->regSSTS = (0x01 << 8)  | /* Interface is active. */
+                         (0x03 << 0);   /* Device detected and communication established. */
+
+    /*
+     * Use the maximum allowed speed.
+     * (Not that it changes anything really)
+     */
+    switch (AHCI_PORT_SCTL_SPD_GET(pAhciPort->regSCTL))
+    {
+        case 0x01:
+            pAhciPort->regSSTS |= (0x01 << 4); /* Generation 1 (1.5GBps) speed. */
+            break;
+        case 0x02:
+        case 0x00:
+        default:
+            pAhciPort->regSSTS |= (0x02 << 4); /* Generation 2 (3.0GBps) speed. */
+            break;
+    }
+
+    /* We received a COMINIT from the device. Tell the guest. */
+    ASMAtomicOrU32(&pAhciPort->regIS, AHCI_PORT_IS_PCS);
+    pAhciPort->regSERR |= AHCI_PORT_SERR_X;
+    pAhciPort->regTFD  |= ATA_STAT_BUSY;
+
+    if ((pAhciPort->regCMD & AHCI_PORT_CMD_FRE) && (!pAhciPort->fFirstD2HFisSend))
+    {
+        ahciPostFirstD2HFisIntoMemory(pAhciPort);
+        ASMAtomicOrU32(&pAhciPort->regIS, AHCI_PORT_IS_DHRS);
+
+        if (pAhciPort->regIE & AHCI_PORT_IE_DHRE)
+        {
+            int rc = ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VERR_IGNORED);
+            AssertRC(rc);
+        }
+    }
+
+    ASMAtomicXchgBool(&pAhciPort->fPortReset, false);
+}
+#endif
+
+/**
+ * Kicks the I/O thread from RC or R0.
+ *
+ * @returns nothing.
+ * @param   pAhci     The AHCI controller instance.
+ * @param   pAhciPort The port to kick.
+ */
+static void ahciIoThreadKick(PAHCI pAhci, PAHCIPort pAhciPort)
+{
+#ifdef IN_RC
+    PDEVPORTNOTIFIERQUEUEITEM pItem = (PDEVPORTNOTIFIERQUEUEITEM)PDMQueueAlloc(pAhci->CTX_SUFF(pNotifierQueue));
+    AssertMsg(VALID_PTR(pItem), ("Allocating item for queue failed\n"));
+
+    if (pItem)
+    {
+        pItem->iPort = pAhciPort->iLUN;
+        PDMQueueInsert(pAhci->CTX_SUFF(pNotifierQueue), (PPDMQUEUEITEMCORE)pItem);
+    }
+#else
+    LogFlowFunc(("Signal event semaphore\n"));
+    int rc = SUPSemEventSignal(pAhci->pSupDrvSession, pAhciPort->hEvtProcess);
+    AssertRC(rc);
 #endif
+}
 
 static int PortCmdIssue_w(PAHCI ahci, PAHCIPort pAhciPort, uint32_t iReg, uint32_t u32Value)
 {
@@ -1075,21 +1163,9 @@ static int PortCmdIssue_w(PAHCI ahci, PAHCIPort pAhciPort, uint32_t iReg, uint32
 
         ASMAtomicOrU32(&pAhciPort->u32TasksNew, u32Value);
 
-        /* Send a notification to R3 if u32TasksNew was before our write. */
+        /* Send a notification to R3 if u32TasksNew was 0 before our write. */
         if (ASMAtomicReadBool(&pAhciPort->fWrkThreadSleeping))
-        {
-#ifdef IN_RC
-            PDEVPORTNOTIFIERQUEUEITEM pItem = (PDEVPORTNOTIFIERQUEUEITEM)PDMQueueAlloc(ahci->CTX_SUFF(pNotifierQueue));
-            AssertMsg(VALID_PTR(pItem), ("Allocating item for queue failed\n"));
-
-            pItem->iPort = pAhciPort->iLUN;
-            PDMQueueInsert(ahci->CTX_SUFF(pNotifierQueue), (PPDMQUEUEITEMCORE)pItem);
-#else
-            LogFlowFunc(("Signal event semaphore\n"));
-            int rc = SUPSemEventSignal(ahci->pSupDrvSession, pAhciPort->hEvtProcess);
-            AssertRC(rc);
-#endif
-        }
+            ahciIoThreadKick(ahci, pAhciPort);
     }
 
     pAhciPort->regCI |= u32Value;
@@ -1178,73 +1254,33 @@ static int PortSControl_w(PAHCI ahci, PAHCIPort pAhciPort, uint32_t iReg, uint32
             LogRel(("AHCI#%u: Port %d reset\n", ahci->CTX_SUFF(pDevIns)->iInstance,
                     pAhciPort->iLUN));
 
-        /* Make sure the async I/O thread is not working before we start to cancel active requests. */
-        while (   pAhciPort->u32TasksNew
-               || !pAhciPort->fWrkThreadSleeping)
-            RTThreadYield();
-
-        /* Cancel all tasks first. */
-        bool fAllTasksCanceled = ahciCancelActiveTasks(pAhciPort);
-        Assert(fAllTasksCanceled);
-
         pAhciPort->regSSTS = 0;
         pAhciPort->regSIG  = ~0;
         pAhciPort->regTFD  = 0x7f;
         pAhciPort->fFirstD2HFisSend = false;
+        pAhciPort->regSCTL = u32Value;
     }
     else if (   (u32Value & AHCI_PORT_SCTL_DET) == AHCI_PORT_SCTL_DET_NINIT
              && (pAhciPort->regSCTL & AHCI_PORT_SCTL_DET) == AHCI_PORT_SCTL_DET_INIT
              && pAhciPort->pDrvBase)
     {
-        if (pAhciPort->pDrvBase)
+        /* Do the port reset here, so the guest sees the new status immediately. */
+        if (ahci->fLegacyPortResetMethod)
         {
-            ASMAtomicXchgBool(&pAhciPort->fPortReset, false);
-
-            /* Signature for SATA device. */
-            if (pAhciPort->fATAPI)
-                pAhciPort->regSIG = AHCI_PORT_SIG_ATAPI;
-            else
-                pAhciPort->regSIG = AHCI_PORT_SIG_DISK;
-
-            pAhciPort->regSSTS = (0x01 << 8)  | /* Interface is active. */
-                                 (0x03 << 0);   /* Device detected and communication established. */
-
-            /*
-             * Use the maximum allowed speed.
-             * (Not that it changes anything really)
-             */
-            switch (AHCI_PORT_SCTL_SPD_GET(pAhciPort->regSCTL))
-            {
-                case 0x01:
-                    pAhciPort->regSSTS |= (0x01 << 4); /* Generation 1 (1.5GBps) speed. */
-                    break;
-                case 0x02:
-                case 0x00:
-                default:
-                    pAhciPort->regSSTS |= (0x02 << 4); /* Generation 2 (3.0GBps) speed. */
-                    break;
-            }
-
-            /* We received a COMINIT from the device. Tell the guest. */
-            ASMAtomicOrU32(&pAhciPort->regIS, AHCI_PORT_IS_PCS);
-            pAhciPort->regSERR |= AHCI_PORT_SERR_X;
-            pAhciPort->regTFD  |= ATA_STAT_BUSY;
-
-            if ((pAhciPort->regCMD & AHCI_PORT_CMD_FRE) && (!pAhciPort->fFirstD2HFisSend))
-            {
-                ahciPostFirstD2HFisIntoMemory(pAhciPort);
-                ASMAtomicOrU32(&pAhciPort->regIS, AHCI_PORT_IS_DHRS);
+            ahciPortResetFinish(pAhciPort);
+            pAhciPort->regSCTL = u32Value; /* Update after finishing the reset, so the I/O thread doesn't get a chance to do the reset. */
+        }
+        else
+        {
+            pAhciPort->regSSTS = 0x1; /* Indicate device presence detected but communication not established. */
+            pAhciPort->regSCTL = u32Value;  /* Update before kicking the I/O thread. */
 
-                if (pAhciPort->regIE & AHCI_PORT_IE_DHRE)
-                {
-                    int rc = ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VERR_IGNORED);
-                    AssertRC(rc);
-                }
-            }
+            /* Kick the thread to finish the reset. */
+            ahciIoThreadKick(ahci, pAhciPort);
         }
     }
-
-    pAhciPort->regSCTL = u32Value;
+    else /* Just update the value if there is no device attached. */
+        pAhciPort->regSCTL = u32Value;
 
     return VINF_SUCCESS;
 #endif
@@ -1978,7 +2014,7 @@ static void ahciPortSwReset(PAHCIPort pAhciPort)
     bool fAllTasksCanceled;
 
     /* Cancel all tasks first. */
-    fAllTasksCanceled = ahciCancelActiveTasks(pAhciPort);
+    fAllTasksCanceled = ahciCancelActiveTasks(pAhciPort, NULL);
     Assert(fAllTasksCanceled);
 
     pAhciPort->regIS   = 0;
@@ -4059,7 +4095,8 @@ static int atapiPassthroughSS(PAHCIREQ pAhciReq, PAHCIPort pAhciPort, size_t cbD
             }
             case SCSI_SYNCHRONIZE_CACHE:
             {
-                ATAPIPassthroughTrackListClear(pAhciPort->pTrackList);
+                if (pAhciPort->pTrackList)
+                    ATAPIPassthroughTrackListClear(pAhciPort->pTrackList);
                 break;
             }
         }
@@ -5611,15 +5648,18 @@ static void ahciIoBufFree(PPDMDEVINS pDevIns, PAHCIREQ pAhciReq,
  * Cancels all active tasks on the port.
  *
  * @returns Whether all active tasks were canceled.
- * @param   pAhciPort   The ahci port.
+ * @param   pAhciPort        The ahci port.
+ * @param   pAhciReqExcept   The given request is excepted from the cancelling
+ *                           (used for error page reading).
  */
-static bool ahciCancelActiveTasks(PAHCIPort pAhciPort)
+static bool ahciCancelActiveTasks(PAHCIPort pAhciPort, PAHCIREQ pAhciReqExcept)
 {
     for (unsigned i = 0; i < RT_ELEMENTS(pAhciPort->aCachedTasks); i++)
     {
         PAHCIREQ pAhciReq = pAhciPort->aCachedTasks[i];
 
-        if (VALID_PTR(pAhciReq))
+        if (   VALID_PTR(pAhciReq)
+            && pAhciReq != pAhciReqExcept)
         {
             bool fXchg = false;
             ASMAtomicCmpXchgSize(&pAhciReq->enmTxState, AHCITXSTATE_CANCELED, AHCITXSTATE_ACTIVE, fXchg);
@@ -5645,7 +5685,8 @@ static bool ahciCancelActiveTasks(PAHCIPort pAhciPort)
         }
     }
 
-    AssertRelease(!ASMAtomicReadU32(&pAhciPort->cTasksActive));
+    AssertRelease(   !ASMAtomicReadU32(&pAhciPort->cTasksActive)
+                  || (pAhciReqExcept && ASMAtomicReadU32(&pAhciPort->cTasksActive) == 1));
     return true; /* always true for now because tasks don't use guest memory as the buffer which makes canceling a task impossible. */
 }
 
@@ -5703,6 +5744,13 @@ bool ahciIsRedoSetWarning(PAHCIPort pAhciPort, int rc)
             ahciWarningISCSI(pAhciPort->CTX_SUFF(pDevIns));
         return true;
     }
+    if (rc == VERR_VD_DEK_MISSING)
+    {
+        /* Error message already set. */
+        ASMAtomicCmpXchgBool(&pAhciPort->fRedo, true, false);
+        return true;
+    }
+
     return false;
 }
 
@@ -5900,7 +5948,8 @@ static bool ahciTransferComplete(PAHCIPort pAhciPort, PAHCIREQ pAhciReq, int rcR
 
     ASMAtomicCmpXchgSize(&pAhciReq->enmTxState, AHCITXSTATE_FREE, AHCITXSTATE_ACTIVE, fXchg);
 
-    if (fXchg)
+    if (   fXchg
+        && !ASMAtomicReadBool(&pAhciPort->fPortReset))
     {
         if (pAhciReq->enmTxDir == AHCITXDIR_READ)
         {
@@ -6015,7 +6064,8 @@ static bool ahciTransferComplete(PAHCIPort pAhciPort, PAHCIREQ pAhciReq, int rcR
          * Task was canceled, do the cleanup but DO NOT access the guest memory!
          * The guest might use it for other things now because it doesn't know about that task anymore.
          */
-        AssertMsg(pAhciReq->enmTxState == AHCITXSTATE_CANCELED,
+        AssertMsg(   pAhciReq->enmTxState == AHCITXSTATE_CANCELED
+                  || pAhciPort->fPortReset,
                   ("Task is not active but wasn't canceled!\n"));
 
         fCanceled = true;
@@ -6312,12 +6362,25 @@ static AHCITXDIR ahciProcessCmd(PAHCIPort pAhciPort, PAHCIREQ pAhciReq, uint8_t
 
                             aBuf[511] = (uint8_t)-(int8_t)uChkSum;
 
-                            /*
-                             * Reading this log page results in an abort of all outstanding commands
-                             * and clearing the SActive register and TaskFile register.
-                             */
-                            ahciSendSDBFis(pAhciPort, 0xffffffff, true);
+                            if (pTaskErr->enmTxDir == AHCITXDIR_TRIM)
+                                ahciTrimRangesDestroy(pTaskErr);
+                            else if (pTaskErr->enmTxDir != AHCITXDIR_FLUSH)
+                                ahciIoBufFree(pAhciPort->pDevInsR3, pTaskErr, false /* fCopyToGuest */);
+
+                            /* Finally free the error task state structure because it is completely unused now. */
+                            RTMemFree(pTaskErr);
                         }
+
+                        /*
+                         * Reading this log page results in an abort of all outstanding commands
+                         * and clearing the SActive register and TaskFile register.
+                         *
+                         * See SATA2 1.2 spec chapter 4.2.3.4
+                         */
+                        bool fAbortedAll = ahciCancelActiveTasks(pAhciPort, pAhciReq);
+                        Assert(fAbortedAll);
+                        ahciSendSDBFis(pAhciPort, 0xffffffff, true);
+
                         break;
                     }
                 }
@@ -6731,6 +6794,11 @@ static DECLCALLBACK(int) ahciAsyncIOLoop(PPDMDEVINS pDevIns, PPDMTHREAD pThread)
             idx = ASMBitFirstSetU32(u32Tasks);
         } /* while tasks available */
 
+        /* Check whether a port reset was active. */
+        if (   ASMAtomicReadBool(&pAhciPort->fPortReset)
+            && (pAhciPort->regSCTL & AHCI_PORT_SCTL_DET) == AHCI_PORT_SCTL_DET_NINIT)
+            ahciPortResetFinish(pAhciPort);
+
         /*
          * Check whether a host controller reset is pending and execute the reset
          * if this is the last active thread.
@@ -6896,6 +6964,7 @@ static DECLCALLBACK(int) ahciR3LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uin
     for (uint32_t i = 0; i < AHCI_MAX_NR_PORTS_IMPL; i++)
     {
         SSMR3PutBool(pSSM, pThis->ahciPort[i].pDrvBase != NULL);
+        SSMR3PutBool(pSSM, true); /* For the hotpluggable flag. */
         SSMR3PutStrZ(pSSM, pThis->ahciPort[i].szSerialNumber);
         SSMR3PutStrZ(pSSM, pThis->ahciPort[i].szFirmwareRevision);
         SSMR3PutStrZ(pSSM, pThis->ahciPort[i].szModelNumber);
@@ -6945,6 +7014,7 @@ static DECLCALLBACK(int) ahciR3SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     SSMR3PutBool(pSSM, pThis->f64BitAddr);
     SSMR3PutBool(pSSM, pThis->fR0Enabled);
     SSMR3PutBool(pSSM, pThis->fGCEnabled);
+    SSMR3PutBool(pSSM, pThis->fLegacyPortResetMethod);
 
     /* Now every port. */
     for (i = 0; i < AHCI_MAX_NR_PORTS_IMPL; i++)
@@ -7076,6 +7146,13 @@ static DECLCALLBACK(int) ahciR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uin
         && SSMR3HandleRevision(pSSM) <  79201)
         uVersion++;
 
+    /*
+     * Check whether we have to resort to the legacy port reset method to
+     * prevent older BIOS versions from failing after a reset.
+     */
+    if (uVersion <= AHCI_SAVED_STATE_VERSION_PRE_PORT_RESET_CHANGES)
+        pThis->fLegacyPortResetMethod = true;
+
     /* Verify config. */
     if (uVersion > AHCI_SAVED_STATE_VERSION_VBOX_30)
     {
@@ -7100,6 +7177,17 @@ static DECLCALLBACK(int) ahciR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uin
                                         N_("The %s VM is missing a device on port %u. Please make sure the source and target VMs have compatible storage configurations"),
                                         fInUse ? "target" : "source", i );
 
+            if (uVersion > AHCI_SAVED_STATE_VERSION_PRE_HOTPLUG_FLAG)
+            {
+                bool fHotpluggable;
+                rc = SSMR3GetBool(pSSM, &fHotpluggable);
+                AssertRCReturn(rc, rc);
+                if (!fHotpluggable)
+                    return SSMR3SetCfgError(pSSM, RT_SRC_POS,
+                                            N_("AHCI: Port %u config mismatch: Hotplug flag - saved=%RTbool config=%RTbool\n"),
+                                            i, fHotpluggable, true);
+            }
+
             char szSerialNumber[AHCI_SERIAL_NUMBER_LENGTH+1];
             rc = SSMR3GetStrZ(pSSM, szSerialNumber,     sizeof(szSerialNumber));
             AssertRCReturn(rc, rc);
@@ -7161,6 +7249,8 @@ static DECLCALLBACK(int) ahciR3LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uin
         SSMR3GetBool(pSSM, &pThis->f64BitAddr);
         SSMR3GetBool(pSSM, &pThis->fR0Enabled);
         SSMR3GetBool(pSSM, &pThis->fGCEnabled);
+        if (uVersion > AHCI_SAVED_STATE_VERSION_PRE_PORT_RESET_CHANGES)
+            SSMR3GetBool(pSSM, &pThis->fLegacyPortResetMethod);
 
         /* Now every port. */
         for (uint32_t i = 0; i < AHCI_MAX_NR_PORTS_IMPL; i++)
@@ -8128,7 +8218,6 @@ static DECLCALLBACK(int) ahciR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFG
     rc = PDMDevHlpPCIRegisterMsi(pDevIns, &MsiReg);
     if (RT_FAILURE(rc))
     {
-        LogRel(("Chipset cannot do MSI: %Rrc\n", rc));
         PCIDevSetCapabilityList(&pThis->dev, 0x70);
         /* That's OK, we can work without MSI */
     }
diff --git a/src/VBox/Devices/Storage/DevATA.cpp b/src/VBox/Devices/Storage/DevATA.cpp
index b87bdc2..009f80f 100644
--- a/src/VBox/Devices/Storage/DevATA.cpp
+++ b/src/VBox/Devices/Storage/DevATA.cpp
@@ -1540,6 +1540,13 @@ static bool ataIsRedoSetWarning(ATADevState *s, int rc)
         ataWarningISCSI(ATADEVSTATE_2_DEVINS(s));
         return true;
     }
+    if (rc == VERR_VD_DEK_MISSING)
+    {
+        /* Error message already set. */
+        pCtl->fRedoIdle = true;
+        return true;
+    }
+
     return false;
 }
 
@@ -2163,7 +2170,8 @@ static bool atapiPassthroughSS(ATADevState *s)
             }
             case SCSI_SYNCHRONIZE_CACHE:
             {
-                ATAPIPassthroughTrackListClear(s->pTrackList);
+                if (s->pTrackList)
+                    ATAPIPassthroughTrackListClear(s->pTrackList);
                 break;
             }
         }
diff --git a/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp b/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
index 6511ef7..ab416f0 100644
--- a/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
+++ b/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
@@ -5411,7 +5411,6 @@ static DECLCALLBACK(int) lsilogicR3Construct(PPDMDEVINS pDevIns, int iInstance,
     rc = PDMDevHlpPCIRegisterMsi(pDevIns, &MsiReg);
     if (RT_FAILURE (rc))
     {
-        LogRel(("Chipset cannot do MSI: %Rrc\n", rc));
         /* That's OK, we can work without MSI */
         PCIDevSetCapabilityList(&pThis->PciDev, 0x0);
     }
diff --git a/src/VBox/Devices/Storage/DrvHostBase.cpp b/src/VBox/Devices/Storage/DrvHostBase.cpp
index 5c588f2..2e87fa2 100644
--- a/src/VBox/Devices/Storage/DrvHostBase.cpp
+++ b/src/VBox/Devices/Storage/DrvHostBase.cpp
@@ -793,15 +793,13 @@ static int drvHostBaseOpen(PDRVHOSTBASE pThis, PRTFILE pFileDevice, bool fReadOn
     AssertReturn(krc == KERN_SUCCESS, VERR_GENERAL_FAILURE);
 
     /*
-     * Create a matching dictionary for searching for DVD services in the IOKit.
+     * Create a matching dictionary for searching for CD, DVD and BlueRay services in the IOKit.
      *
-     * [If I understand this correctly, plain CDROMs doesn't show up as
-     * IODVDServices. Too keep things simple, we will only support DVDs
-     * until somebody complains about it and we get hardware to test it on.
-     * (Unless I'm much mistaken, there aren't any (orignal) intel macs with
-     * plain cdroms.)]
+     * The idea is to find all the devices which are of class IOCDBlockStorageDevice.
+     * CD devices are represented by IOCDBlockStorageDevice class itself, while DVD and BlueRay ones
+     * have it as a parent class.
      */
-    CFMutableDictionaryRef RefMatchingDict = IOServiceMatching("IODVDServices");
+    CFMutableDictionaryRef RefMatchingDict = IOServiceMatching("IOCDBlockStorageDevice");
     AssertReturn(RefMatchingDict, NULL);
 
     /*
@@ -813,8 +811,8 @@ static int drvHostBaseOpen(PDRVHOSTBASE pThis, PRTFILE pFileDevice, bool fReadOn
     RefMatchingDict = NULL; /* the reference is consumed by IOServiceGetMatchingServices. */
 
     /*
-     * Enumerate the DVD drives (services).
-     * (This enumeration must be identical to the one performed in DrvHostBase.cpp.)
+     * Enumerate the matching drives (services).
+     * (This enumeration must be identical to the one performed in Main/src-server/darwin/iokit.cpp.)
      */
     int rc = VERR_FILE_NOT_FOUND;
     unsigned i = 0;
diff --git a/src/VBox/Devices/Storage/DrvSCSI.cpp b/src/VBox/Devices/Storage/DrvSCSI.cpp
index 1b0ce17..615edbc 100644
--- a/src/VBox/Devices/Storage/DrvSCSI.cpp
+++ b/src/VBox/Devices/Storage/DrvSCSI.cpp
@@ -122,7 +122,8 @@ static bool drvscsiIsRedoPossible(int rc)
     if (   rc == VERR_DISK_FULL
         || rc == VERR_FILE_TOO_BIG
         || rc == VERR_BROKEN_PIPE
-        || rc == VERR_NET_CONNECTION_REFUSED)
+        || rc == VERR_NET_CONNECTION_REFUSED
+        || rc == VERR_VD_DEK_MISSING)
         return true;
 
     return false;
diff --git a/src/VBox/Devices/Storage/DrvVD.cpp b/src/VBox/Devices/Storage/DrvVD.cpp
index f4ba496..0aaef10 100644
--- a/src/VBox/Devices/Storage/DrvVD.cpp
+++ b/src/VBox/Devices/Storage/DrvVD.cpp
@@ -185,6 +185,20 @@ typedef struct VBOXDISK
 
     /** The block cache handle if configured. */
     PPDMBLKCACHE             pBlkCache;
+
+    /** Cryptographic support
+     * @{ */
+    /** Used algorithm, NULL means no encryption. */
+    char                    *pszEncryptionAlgorithm;
+    /** Config interface for the encryption filter. */
+    VDINTERFACECONFIG        VDIfCfg;
+    /** Flag whether the DEK was provided. */
+    bool                     fDekProvided;
+    /** Pointer to the key material - temporary. */
+    const uint8_t           *pbKey;
+    /** Size of the key material in bytes. */
+    size_t                   cbKey;
+    /** @} */
 } VBOXDISK, *PVBOXDISK;
 
 
@@ -615,6 +629,65 @@ static int drvvdCfgQuery(void *pvUser, const char *pszName, char *pszString, siz
     return CFGMR3QueryString((PCFGMNODE)pvUser, pszName, pszString, cchString);
 }
 
+static int drvvdCfgQueryBytes(void *pvUser, const char *pszName, void *ppvData, size_t cbData)
+{
+    return CFGMR3QueryBytes((PCFGMNODE)pvUser, pszName, ppvData, cbData);
+}
+
+
+/*******************************************************************************
+*   VD Configuration interface implementation for the encryption support       *
+*******************************************************************************/
+
+static bool drvvdCfgEncAreKeysValid(void *pvUser, const char *pszValid)
+{
+    return true;
+}
+
+static int drvvdCfgEncQuerySize(void *pvUser, const char *pszName, size_t *pcb)
+{
+    PVBOXDISK pThis = (PVBOXDISK)pvUser;
+    int rc = VINF_SUCCESS;
+
+    if (!strcmp(pszName, "Algorithm"))
+        *pcb = strlen(pThis->pszEncryptionAlgorithm) + 1;
+    else if (!strcmp(pszName, "Key"))
+        *pcb = pThis->cbKey;
+    else
+        rc = VERR_NOT_SUPPORTED;
+
+    return rc;
+}
+
+static int drvvdCfgEncQuery(void *pvUser, const char *pszName, char *pszString, size_t cchString)
+{
+    PVBOXDISK pThis = (PVBOXDISK)pvUser;
+    int rc = VINF_SUCCESS;
+
+    if (!strcmp(pszName, "Algorithm"))
+        rc = RTStrCopy(pszString, cchString, pThis->pszEncryptionAlgorithm);
+    else
+        rc = VERR_NOT_SUPPORTED;
+
+    return rc;
+}
+
+static int drvvdCfgEncQueryBytes(void *pvUser, const char *pszName, void *pvData, size_t cbData)
+{
+    PVBOXDISK pThis = (PVBOXDISK)pvUser;
+    int rc = VINF_SUCCESS;
+
+    if (!strcmp(pszName, "Key"))
+        if (pThis->cbKey > cbData)
+            rc = VERR_BUFFER_OVERFLOW;
+        else
+            memcpy(pvData, pThis->pbKey, pThis->cbKey);
+    else
+        rc = VERR_NOT_SUPPORTED;
+
+    return rc;
+    
+}
 
 #ifdef VBOX_WITH_INIP
 /*******************************************************************************
@@ -1499,6 +1572,15 @@ static DECLCALLBACK(int) drvvdRead(PPDMIMEDIA pInterface,
     LogFlowFunc(("off=%#llx pvBuf=%p cbRead=%d\n", off, pvBuf, cbRead));
     PVBOXDISK pThis = PDMIMEDIA_2_VBOXDISK(pInterface);
 
+    if (   pThis->pszEncryptionAlgorithm
+        && !pThis->fDekProvided)
+    {
+        rc = PDMDrvHlpVMSetRuntimeError(pThis->pDrvIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DrvVD_DEKMISSING",
+                                        N_("VD: The DEK for this disk is missing"));
+        AssertRC(rc);
+        return VERR_VD_DEK_MISSING;
+    }
+
     if (!pThis->fBootAccelActive)
         rc = VDRead(pThis->pDisk, off, pvBuf, cbRead);
     else
@@ -1550,6 +1632,15 @@ static DECLCALLBACK(int) drvvdWrite(PPDMIMEDIA pInterface,
     Log2(("%s: off=%#llx pvBuf=%p cbWrite=%d\n%.*Rhxd\n", __FUNCTION__,
           off, pvBuf, cbWrite, cbWrite, pvBuf));
 
+    if (   pThis->pszEncryptionAlgorithm
+        && !pThis->fDekProvided)
+    {
+        int rc = PDMDrvHlpVMSetRuntimeError(pThis->pDrvIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DrvVD_DEKMISSING",
+                                            N_("VD: The DEK for this disk is missing"));
+        AssertRC(rc);
+        return VERR_VD_DEK_MISSING;
+    }
+
     /* Invalidate any buffer if boot acceleration is enabled. */
     if (pThis->fBootAccelActive)
     {
@@ -1607,6 +1698,40 @@ static DECLCALLBACK(int) drvvdMerge(PPDMIMEDIA pInterface,
     return rc;
 }
 
+/** @copydoc PDMIMEDIA::pfnSetKey */
+static DECLCALLBACK(int) drvvdSetKey(PPDMIMEDIA pInterface, const uint8_t *pbKey,
+                                     size_t cbKey)
+{
+    LogFlowFunc(("\n"));
+    PVBOXDISK pThis = PDMIMEDIA_2_VBOXDISK(pInterface);
+    int rc = VINF_SUCCESS;
+
+    if (pThis->pszEncryptionAlgorithm)
+    {
+        PVDINTERFACE pVDIfFilter = NULL;
+
+        pThis->pbKey = pbKey;
+        pThis->cbKey = cbKey;
+
+        rc = VDInterfaceAdd(&pThis->VDIfCfg.Core, "DrvVD_Config", VDINTERFACETYPE_CONFIG,
+                            pThis, sizeof(VDINTERFACECONFIG), &pVDIfFilter);
+        AssertRC(rc);
+
+        /* Load the crypt filter plugin. */
+        rc = VDFilterAdd(pThis->pDisk, "CRYPT", pVDIfFilter);
+        if (RT_SUCCESS(rc))
+            pThis->fDekProvided = true;
+
+        pThis->pbKey = NULL;
+        pThis->cbKey = 0;
+    }
+    else
+        rc = VERR_NOT_SUPPORTED;
+
+    LogFlowFunc(("returns %Rrc\n", rc));
+    return rc;
+}
+
 /** @copydoc PDMIMEDIA::pfnGetSize */
 static DECLCALLBACK(uint64_t) drvvdGetSize(PPDMIMEDIA pInterface)
 {
@@ -1768,6 +1893,15 @@ static DECLCALLBACK(int) drvvdStartRead(PPDMIMEDIAASYNC pInterface, uint64_t uOf
     int rc = VINF_SUCCESS;
     PVBOXDISK pThis = PDMIMEDIAASYNC_2_VBOXDISK(pInterface);
 
+    if (   pThis->pszEncryptionAlgorithm
+        && !pThis->fDekProvided)
+    {
+        rc = PDMDrvHlpVMSetRuntimeError(pThis->pDrvIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DrvVD_DEKMISSING",
+                                        N_("VD: The DEK for this disk is missing"));
+        AssertRC(rc);
+        return VERR_VD_DEK_MISSING;
+    }
+
     pThis->fBootAccelActive = false;
 
     RTSGBUF SgBuf;
@@ -1797,6 +1931,15 @@ static DECLCALLBACK(int) drvvdStartWrite(PPDMIMEDIAASYNC pInterface, uint64_t uO
     int rc = VINF_SUCCESS;
     PVBOXDISK pThis = PDMIMEDIAASYNC_2_VBOXDISK(pInterface);
 
+    if (   pThis->pszEncryptionAlgorithm
+        && !pThis->fDekProvided)
+    {
+        rc = PDMDrvHlpVMSetRuntimeError(pThis->pDrvIns, VMSETRTERR_FLAGS_SUSPEND | VMSETRTERR_FLAGS_NO_WAIT, "DrvVD_DEKMISSING",
+                                        N_("VD: The DEK for this disk is missing"));
+        AssertRC(rc);
+        return VERR_VD_DEK_MISSING;
+    }
+
     pThis->fBootAccelActive = false;
 
     RTSGBUF SgBuf;
@@ -1881,6 +2024,8 @@ static int drvvdBlkCacheXferEnqueue(PPDMDRVINS pDrvIns,
     int rc = VINF_SUCCESS;
     PVBOXDISK pThis = PDMINS_2_DATA(pDrvIns, PVBOXDISK);
 
+    Assert (!pThis->pszEncryptionAlgorithm);
+
     switch (enmXferDir)
     {
         case PDMBLKCACHEXFERDIR_READ:
@@ -1925,6 +2070,76 @@ static int drvvdBlkCacheXferEnqueueDiscard(PPDMDRVINS pDrvIns, PCRTRANGE paRange
     return VINF_SUCCESS;
 }
 
+/**
+ * Loads all configured plugins.
+ *
+ * @returns VBox status code.
+ * @param   pThis    The disk instance.
+ * @param   pCfg     CFGM node holding plugin list.
+ */
+static int drvvdLoadPlugins(PVBOXDISK pThis, PCFGMNODE pCfg)
+{
+    int rc = VINF_SUCCESS;
+    PCFGMNODE pCfgPlugins = CFGMR3GetChild(pCfg, "Plugins");
+
+    if (pCfgPlugins)
+    {
+        PCFGMNODE pPluginCur = CFGMR3GetFirstChild(pCfgPlugins);
+        while (   pPluginCur
+               && RT_SUCCESS(rc))
+        {
+            char *pszPluginFilename = NULL;
+            rc = CFGMR3QueryStringAlloc(pPluginCur, "Path", &pszPluginFilename);
+            if (RT_SUCCESS(rc))
+                rc = VDPluginLoadFromFilename(pszPluginFilename);
+
+            pPluginCur = CFGMR3GetNextChild(pPluginCur);
+        }
+    }
+
+    return rc;
+}
+
+
+/**
+ * Sets up the disk filter chain.
+ *
+ * @returns VBox status code.
+ * @param   pThis    The disk instance.
+ * @param   pCfg     CFGM node holding the filter parameters.
+ */
+static int drvvdSetupFilters(PVBOXDISK pThis, PCFGMNODE pCfg)
+{
+    int rc = VINF_SUCCESS;
+    PCFGMNODE pCfgFilter = CFGMR3GetChild(pCfg, "Filters");
+
+    if (pCfgFilter)
+    {
+        PCFGMNODE pCfgFilterConfig = CFGMR3GetChild(pCfgFilter, "VDConfig");
+        char *pszFilterName = NULL;
+        VDINTERFACECONFIG VDIfConfig;
+        PVDINTERFACE pVDIfsFilter = NULL;
+
+        rc = CFGMR3QueryStringAlloc(pCfgFilter, "FilterName", &pszFilterName);
+        if (RT_SUCCESS(rc))
+        {
+            VDIfConfig.pfnAreKeysValid = drvvdCfgAreKeysValid;
+            VDIfConfig.pfnQuerySize    = drvvdCfgQuerySize;
+            VDIfConfig.pfnQuery        = drvvdCfgQuery;
+            VDIfConfig.pfnQueryBytes   = drvvdCfgQueryBytes;
+            rc = VDInterfaceAdd(&VDIfConfig.Core, "DrvVD_Config", VDINTERFACETYPE_CONFIG,
+                                pCfgFilterConfig, sizeof(VDINTERFACECONFIG), &pVDIfsFilter);
+            AssertRC(rc);
+
+            rc = VDFilterAdd(pThis->pDisk, pszFilterName, pVDIfsFilter);
+
+            MMR3HeapFree(pszFilterName);
+        }
+    }
+
+    return rc;
+}
+
 /*******************************************************************************
 *   Base interface methods                                                     *
 *******************************************************************************/
@@ -2128,6 +2343,11 @@ static DECLCALLBACK(void) drvvdDestruct(PPDMDRVINS pDrvIns)
         MMR3HeapFree(pThis->pszBwGroup);
         pThis->pszBwGroup = NULL;
     }
+    if (pThis->pszEncryptionAlgorithm)
+    {
+        MMR3HeapFree(pThis->pszEncryptionAlgorithm);
+        pThis->pszBwGroup = NULL;
+    }
 }
 
 /**
@@ -2163,12 +2383,15 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
     pThis->MergeLock                    = NIL_RTSEMRW;
     pThis->uMergeSource                 = VD_LAST_IMAGE;
     pThis->uMergeTarget                 = VD_LAST_IMAGE;
+    pThis->pszEncryptionAlgorithm       = NULL;
+    pThis->fDekProvided                 = false;
 
     /* IMedia */
     pThis->IMedia.pfnRead               = drvvdRead;
     pThis->IMedia.pfnWrite              = drvvdWrite;
     pThis->IMedia.pfnFlush              = drvvdFlush;
     pThis->IMedia.pfnMerge              = drvvdMerge;
+    pThis->IMedia.pfnSetKey             = drvvdSetKey;
     pThis->IMedia.pfnGetSize            = drvvdGetSize;
     pThis->IMedia.pfnGetSectorSize      = drvvdGetSectorSize;
     pThis->IMedia.pfnIsReadOnly         = drvvdIsReadOnly;
@@ -2205,6 +2428,11 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
     /* Try to attach async media port interface above.*/
     pThis->pDrvMediaAsyncPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAASYNCPORT);
 
+    /* Before we access any VD API load all given plugins. */
+    rc = drvvdLoadPlugins(pThis, pCfg);
+    if (RT_FAILURE(rc))
+        return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Loading VD plugins failed"));
+
     /*
      * Validate configuration and find all parent images.
      * It's sort of up side down from the image dependency tree.
@@ -2563,10 +2791,34 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
         pImage->VDIfConfig.pfnAreKeysValid = drvvdCfgAreKeysValid;
         pImage->VDIfConfig.pfnQuerySize    = drvvdCfgQuerySize;
         pImage->VDIfConfig.pfnQuery        = drvvdCfgQuery;
+        pImage->VDIfConfig.pfnQueryBytes   = NULL;
         rc = VDInterfaceAdd(&pImage->VDIfConfig.Core, "DrvVD_Config", VDINTERFACETYPE_CONFIG,
                             pCfgVDConfig, sizeof(VDINTERFACECONFIG), &pImage->pVDIfsImage);
         AssertRC(rc);
 
+        /* Check VDConfig for encryption config. */
+        if (pCfgVDConfig)
+        {
+            rc = CFGMR3QueryStringAlloc(pCfgVDConfig, "EncryptionAlgorithm", &pThis->pszEncryptionAlgorithm);
+            if (RT_FAILURE(rc) && rc != VERR_CFGM_VALUE_NOT_FOUND)
+            {
+                rc = PDMDRV_SET_ERROR(pDrvIns, rc,
+                                      N_("DrvVD: Configuration error: Querying \"EncryptionAlgorithm\" as string failed"));
+                break;
+            }
+            else
+                rc = VINF_SUCCESS;
+        }
+
+        if (pThis->pszEncryptionAlgorithm)
+        {
+            /* Setup VDConfig interface for disk encryption support. */
+            pThis->VDIfCfg.pfnAreKeysValid = drvvdCfgEncAreKeysValid;
+            pThis->VDIfCfg.pfnQuerySize    = drvvdCfgEncQuerySize;
+            pThis->VDIfCfg.pfnQuery        = drvvdCfgEncQuery;
+            pThis->VDIfCfg.pfnQueryBytes   = drvvdCfgEncQueryBytes;
+        }
+
         /* Unconditionally insert the TCPNET interface, don't bother to check
          * if an image really needs it. Will be ignored. Since the TCPNET
          * interface is per image we could make this more flexible in the
@@ -2804,6 +3056,7 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
     if (   fUseBlockCache
         && !pThis->fShareable
         && !fDiscard
+        && !pThis->pszEncryptionAlgorithm /* Disk encryption disables the block cache for security reasons */
         && RT_SUCCESS(rc))
     {
         /*
@@ -2851,6 +3104,9 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
         }
     }
 
+    if (RT_SUCCESS(rc))
+        rc = drvvdSetupFilters(pThis, pCfg);
+
     /*
      * Register a load-done callback so we can undo TempReadOnly config before
      * we get to drvvdResume.  Autoamtically deregistered upon destruction.
diff --git a/src/VBox/Devices/Storage/UsbMsd.cpp b/src/VBox/Devices/Storage/UsbMsd.cpp
index 52e9de8..132b6e7 100644
--- a/src/VBox/Devices/Storage/UsbMsd.cpp
+++ b/src/VBox/Devices/Storage/UsbMsd.cpp
@@ -963,6 +963,18 @@ static DECLCALLBACK(PVUSBURB) usbMsdUrbReap(PPDMUSBINS pUsbIns, RTMSINTERVAL cMi
 
 
 /**
+ * @copydoc PDMUSBREG::pfnWakeup
+ */
+static DECLCALLBACK(int) usbMsdWakeup(PPDMUSBINS pUsbIns)
+{
+    PUSBMSD pThis = PDMINS_2_DATA(pUsbIns, PUSBMSD);
+    LogFlow(("usbMsdUrbReap/#%u:\n", pUsbIns->iInstance));
+
+    return RTSemEventSignal(pThis->hEvtDoneQueue);
+}
+
+
+/**
  * @copydoc PDMUSBREG::pfnUrbCancel
  */
 static DECLCALLBACK(int) usbMsdUrbCancel(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
@@ -1775,6 +1787,8 @@ const PDMUSBREG g_UsbMsd =
     usbMsdUrbCancel,
     /* pfnUrbReap */
     usbMsdUrbReap,
+    /* pfnWakeup */
+    usbMsdWakeup,
     /* u32TheEnd */
     PDM_USBREG_VERSION
 };
diff --git a/src/VBox/Devices/USB/DevOHCI.cpp b/src/VBox/Devices/USB/DevOHCI.cpp
index cd74f51..0f6607e 100644
--- a/src/VBox/Devices/USB/DevOHCI.cpp
+++ b/src/VBox/Devices/USB/DevOHCI.cpp
@@ -80,7 +80,7 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#define LOG_GROUP LOG_GROUP_DEV_USB
+#define LOG_GROUP LOG_GROUP_DEV_OHCI
 #include <VBox/pci.h>
 #include <VBox/vmm/pdm.h>
 #include <VBox/vmm/mm.h>
@@ -90,6 +90,8 @@
 #include <iprt/string.h>
 #include <iprt/asm.h>
 #include <iprt/asm-math.h>
+#include <iprt/semaphore.h>
+#include <iprt/critsect.h>
 #ifdef IN_RING3
 # include <iprt/alloca.h>
 # include <iprt/mem.h>
@@ -358,6 +360,23 @@ typedef struct OHCI
     bool                fRZEnabled;
 
     uint32_t            Alignment3;     /**< Align size on a 8 byte boundary. */
+
+    /** Critical section synchronising interrupt handling. */
+    PDMCRITSECT         CsIrq;
+
+    /** The framer thread. */
+    R3PTRTYPE(PPDMTHREAD) hThreadFrame;
+    /** Event semaphore to interact with the framer thread. */
+    R3PTRTYPE(RTSEMEVENT) hSemEventFrame;
+    /** Flag whether the framer thread should processing frames. */
+    volatile bool         fBusStarted;
+    /** Alignment. */
+    uint32_t              Alignment5;
+    /** How long to wait until the next frame. */
+    uint64_t              nsWait;
+    /** Critical section to synchronize the framer and URB completion handler. */
+    RTCRITSECT            CritSect;
+
 } OHCI;
 
 /* Standard OHCI bus speed */
@@ -780,7 +799,7 @@ RT_C_DECLS_END
 /**
  * Update PCI IRQ levels
  */
-static void ohciUpdateInterrupt(POHCI ohci, const char *msg)
+static void ohciUpdateInterruptLocked(POHCI ohci, const char *msg)
 {
     int level = 0;
 
@@ -802,19 +821,27 @@ static void ohciUpdateInterrupt(POHCI ohci, const char *msg)
 /**
  * Set an interrupt, use the wrapper ohciSetInterrupt.
  */
-DECLINLINE(void) ohciSetInterruptInt(POHCI ohci, uint32_t intr, const char *msg)
+DECLINLINE(int) ohciSetInterruptInt(POHCI ohci, int rcBusy, uint32_t intr, const char *msg)
 {
-    if ( (ohci->intr_status & intr) == intr )
-        return;
-    ohci->intr_status |= intr;
-    ohciUpdateInterrupt(ohci, msg);
+    int rc = PDMCritSectEnter(&ohci->CsIrq, rcBusy);
+    if (rc != VINF_SUCCESS)
+        return rc;
+
+    if ( (ohci->intr_status & intr) != intr )
+    {
+        ohci->intr_status |= intr;
+        ohciUpdateInterruptLocked(ohci, msg);
+    }
+
+    PDMCritSectLeave(&ohci->CsIrq);
+    return rc;
 }
 
 /**
  * Set an interrupt wrapper macro for logging purposes.
  */
-#define ohciSetInterrupt(ohci, intr) ohciSetInterruptInt(ohci, intr, #intr)
-
+#define ohciSetInterrupt(ohci, a_rcBusy, intr) ohciSetInterruptInt(ohci, a_rcBusy, intr, #intr)
+#define ohciR3SetInterrupt(ohci, intr) ohciSetInterruptInt(ohci, VERR_IGNORED, intr, #intr)
 
 #ifdef IN_RING3
 
@@ -935,7 +962,7 @@ static DECLCALLBACK(int) ohciRhAttach(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVICE
     rhport_power(&pThis->RootHub, uPort, 1 /* power on */);
 
     ohci_remote_wakeup(pThis);
-    ohciSetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
+    ohciR3SetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
 
     PDMCritSectLeave(pThis->pDevInsR3->pCritSectRoR3);
     return VINF_SUCCESS;
@@ -972,7 +999,7 @@ static DECLCALLBACK(void) ohciRhDetach(PVUSBIROOTHUBPORT pInterface, PVUSBIDEVIC
         pThis->RootHub.aPorts[uPort].fReg = OHCI_PORT_R_CONNECT_STATUS_CHANGE;
 
     ohci_remote_wakeup(pThis);
-    ohciSetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
+    ohciR3SetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
 
     PDMCritSectLeave(pThis->pDevInsR3->pCritSectRoR3);
 }
@@ -1081,7 +1108,9 @@ static void ohciDoReset(POHCI pThis, uint32_t fNewMode, bool fResetOnLinux)
      * suspend/reset state. Also, a real HC isn't going to send anything
      * any more when a reset has been signaled.
      */
+    RTCritSectEnter(&pThis->CritSect);
     pThis->RootHub.pIRhConn->pfnCancelAllUrbs(pThis->RootHub.pIRhConn);
+    RTCritSectLeave(&pThis->CritSect);
 
     /*
      * Reset the hardware registers.
@@ -2430,8 +2459,8 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
     POHCI pThis = VUSBIROOTHUBPORT_2_OHCI(pInterface);
     LogFlow(("%s: ohciRhXferCompletion: EdAddr=%#010RX32 cTds=%d TdAddr0=%#010RX32\n",
              pUrb->pszDesc, pUrb->Hci.EdAddr, pUrb->Hci.cTds, pUrb->Hci.paTds[0].TdAddr));
-    Assert(PDMCritSectIsOwner(pThis->pDevInsR3->pCritSectRoR3));
 
+    RTCritSectEnter(&pThis->CritSect);
     pThis->fIdle = false;   /* Mark as active */
 
     /* get the current end point descriptor. */
@@ -2455,6 +2484,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
         Log(("%s: ohciRhXferCompletion: CANCELED {ED=%#010x cTds=%d TD0=%#010x age %d}\n",
              pUrb->pszDesc, pUrb->Hci.EdAddr, pUrb->Hci.cTds, pUrb->Hci.paTds[0].TdAddr, cFmAge));
         STAM_COUNTER_INC(&pThis->StatDroppedUrbs);
+        RTCritSectLeave(&pThis->CritSect);
         return;
     }
     bool fHasBeenCanceled = false;
@@ -2474,6 +2504,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
              fHasBeenCanceled                                       ? " td canceled" : ""));
         NOREF(fHasBeenCanceled);
         STAM_COUNTER_INC(&pThis->StatDroppedUrbs);
+        RTCritSectLeave(&pThis->CritSect);
         return;
     }
 
@@ -2488,6 +2519,7 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
 
     /* finally write back the endpoint descriptor. */
     ohciWriteEd(pThis, pUrb->Hci.EdAddr, &Ed);
+    RTCritSectLeave(&pThis->CritSect);
 }
 
 
@@ -2505,7 +2537,6 @@ static DECLCALLBACK(void) ohciRhXferCompletion(PVUSBIROOTHUBPORT pInterface, PVU
 static DECLCALLBACK(bool) ohciRhXferError(PVUSBIROOTHUBPORT pInterface, PVUSBURB pUrb)
 {
     POHCI pThis = VUSBIROOTHUBPORT_2_OHCI(pInterface);
-    Assert(PDMCritSectIsOwner(pThis->pDevInsR3->pCritSectRoR3));
 
     /*
      * Isochronous URBs can't be retried.
@@ -2522,6 +2553,9 @@ static DECLCALLBACK(bool) ohciRhXferError(PVUSBIROOTHUBPORT pInterface, PVUSBURB
         return true;
     }
 
+    RTCritSectEnter(&pThis->CritSect);
+
+    bool fRetire = false;
     /*
      * Check if the TDs still are valid.
      * This will make sure the TdCopy is up to date.
@@ -2531,26 +2565,31 @@ static DECLCALLBACK(bool) ohciRhXferError(PVUSBIROOTHUBPORT pInterface, PVUSBURB
     if (ohciHasUrbBeenCanceled(pThis, pUrb, NULL))
     {
         Log(("%s: ohciRhXferError: TdAddr0=%#x canceled!\n", pUrb->pszDesc, TdAddr));
-        return true;
+        fRetire = true;
     }
-
-    /*
-     * Get and update the error counter.
-     */
-    POHCITD     pTd = (POHCITD)&pUrb->Hci.paTds[0].TdCopy[0];
-    unsigned    cErrs = (pTd->hwinfo & TD_HWINFO_ERRORS) >> TD_ERRORS_SHIFT;
-    pTd->hwinfo &= ~TD_HWINFO_ERRORS;
-    cErrs++;
-    pTd->hwinfo |= (cErrs % TD_ERRORS_MAX) << TD_ERRORS_SHIFT;
-    ohciWriteTd(pThis, TdAddr, pTd, "ohciRhXferError");
-
-    if (cErrs >= TD_ERRORS_MAX - 1)
+    else
     {
-        Log2(("%s: ohciRhXferError: too many errors, giving up!\n", pUrb->pszDesc));
-        return true;
+        /*
+         * Get and update the error counter.
+         */
+        POHCITD     pTd = (POHCITD)&pUrb->Hci.paTds[0].TdCopy[0];
+        unsigned    cErrs = (pTd->hwinfo & TD_HWINFO_ERRORS) >> TD_ERRORS_SHIFT;
+        pTd->hwinfo &= ~TD_HWINFO_ERRORS;
+        cErrs++;
+        pTd->hwinfo |= (cErrs % TD_ERRORS_MAX) << TD_ERRORS_SHIFT;
+        ohciWriteTd(pThis, TdAddr, pTd, "ohciRhXferError");
+
+        if (cErrs >= TD_ERRORS_MAX - 1)
+        {
+            Log2(("%s: ohciRhXferError: too many errors, giving up!\n", pUrb->pszDesc));
+            fRetire = true;
+        }
+        else
+            Log2(("%s: ohciRhXferError: cErrs=%d: retrying...\n", pUrb->pszDesc, cErrs));
     }
-    Log2(("%s: ohciRhXferError: cErrs=%d: retrying...\n", pUrb->pszDesc, cErrs));
-    return false;
+
+    RTCritSectLeave(&pThis->CritSect);
+    return fRetire;
 }
 
 
@@ -3518,7 +3557,7 @@ static void ohciUpdateHCCA(POHCI pThis)
 
     ohciPhysWrite(pThis, pThis->hcca + OHCI_HCCA_OFS, (uint8_t *)&hcca, sizeof(hcca));
     if (fWriteDoneHeadInterrupt)
-        ohciSetInterrupt(pThis, OHCI_INTR_WRITE_DONE_HEAD);
+        ohciR3SetInterrupt(pThis, OHCI_INTR_WRITE_DONE_HEAD);
 }
 
 
@@ -3529,11 +3568,11 @@ static void ohciCalcTimerIntervals(POHCI pThis, uint32_t u32FrameRate)
 {
     Assert(u32FrameRate <= OHCI_DEFAULT_TIMER_FREQ);
 
-
     pThis->cTicksPerFrame = pThis->u64TimerHz / u32FrameRate;
     if (!pThis->cTicksPerFrame)
         pThis->cTicksPerFrame = 1;
     pThis->cTicksPerUsbTick   = pThis->u64TimerHz >= VUSB_BUS_HZ ? pThis->u64TimerHz / VUSB_BUS_HZ : 1;
+    pThis->nsWait             = RT_NS_1SEC / u32FrameRate;
     pThis->uFrameRate         = u32FrameRate;
 }
 
@@ -3642,19 +3681,10 @@ static void ohciStartOfFrame(POHCI pThis)
 #endif
 
     /*
-     * Update HcFmRemaining.FRT and re-arm the timer.
+     * Update HcFmRemaining.FRT and update start of frame time.
      */
     pThis->frt = pThis->fit;
-#if 1 /* This is required for making the quickcam work on the mac. Should really look
-         into that adaptive polling stuff... */
     pThis->SofTime += pThis->cTicksPerFrame;
-    const uint64_t u64Now = TMTimerGet(pThis->CTX_SUFF(pEndOfFrameTimer));
-    if (pThis->SofTime + pThis->cTicksPerFrame < u64Now)
-        pThis->SofTime = u64Now - pThis->cTicksPerFrame / 2;
-#else
-    pThis->SofTime = TMTimerGet(pThis->CTX_SUFF(pEndOfFrameTimer));
-#endif
-    TMTimerSet(pThis->CTX_SUFF(pEndOfFrameTimer), pThis->SofTime + pThis->cTicksPerFrame);
 
     /*
      * Check that the HCCA address isn't bogus. Linux 2.4.x is known to start
@@ -3663,7 +3693,7 @@ static void ohciStartOfFrame(POHCI pThis)
     bool fValidHCCA = !(    pThis->hcca >= OHCI_HCCA_MASK
                         ||  pThis->hcca < ~OHCI_HCCA_MASK);
 
-#if 0 /* moved down for higher speed. */
+#if 1
     /*
      * Update the HCCA.
      * Should be done after SOF but before HC read first ED in this frame.
@@ -3673,11 +3703,11 @@ static void ohciStartOfFrame(POHCI pThis)
 #endif
 
     /* "After writing to HCCA, HC will set SF in HcInterruptStatus" - guest isn't executing, so ignore the order! */
-    ohciSetInterrupt(pThis, OHCI_INTR_START_OF_FRAME);
+    ohciR3SetInterrupt(pThis, OHCI_INTR_START_OF_FRAME);
 
     if (pThis->fno)
     {
-        ohciSetInterrupt(pThis, OHCI_INTR_FRAMENUMBER_OVERFLOW);
+        ohciR3SetInterrupt(pThis, OHCI_INTR_FRAMENUMBER_OVERFLOW);
         pThis->fno = 0;
     }
 
@@ -3712,7 +3742,7 @@ static void ohciStartOfFrame(POHCI pThis)
         &&    pThis->fBulkNeedsCleaning)
         ohciUndoBulkList(pThis);    /* If list disabled but not empty, abort endpoints. */
 
-#if 1
+#if 0
     /*
      * Update the HCCA after processing the lists and everything. A bit experimental.
      *
@@ -3771,14 +3801,7 @@ static void ohciStartOfFrame(POHCI pThis)
         }
     }
     if (uNewFrameRate != pThis->uFrameRate)
-    {
         ohciCalcTimerIntervals(pThis, uNewFrameRate);
-        if (uNewFrameRate == OHCI_DEFAULT_TIMER_FREQ)
-        {
-            /* If we're switching back to full speed, re-program the timer immediately to minimize latency. */
-            TMTimerSet(pThis->CTX_SUFF(pEndOfFrameTimer), pThis->SofTime + pThis->cTicksPerFrame);
-        }
-    }
 }
 
 /**
@@ -3791,30 +3814,74 @@ static void bump_frame_number(POHCI pThis)
         pThis->fno = 1;
 }
 
-/**
- * Do frame processing on frame boundary
- */
-static void ohciFrameBoundaryTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+static DECLCALLBACK(int) ohciR3ThreadFrame(PPDMDEVINS pDevIns, PPDMTHREAD pThread)
 {
-    POHCI pThis = (POHCI)pvUser;
-    STAM_PROFILE_START(&pThis->StatTimer, a);
+    int rc = VINF_SUCCESS;
+    POHCI pThis = (POHCI)pThread->pvUser;
+    uint64_t tsNanoStart = 0;
+
+    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
+        return VINF_SUCCESS;
 
-    /* Reset idle detection flag */
-    pThis->fIdle = true;
+    while (pThread->enmState == PDMTHREADSTATE_RUNNING)
+    {
+        while (   !ASMAtomicReadBool(&pThis->fBusStarted)
+               && pThread->enmState == PDMTHREADSTATE_RUNNING
+               && RT_SUCCESS(rc))
+            rc = RTSemEventWait(pThis->hSemEventFrame, RT_INDEFINITE_WAIT);
+
+        AssertLogRelMsgReturn(RT_SUCCESS(rc) || rc == VERR_TIMEOUT, ("%Rrc\n", rc), rc);
+        if (RT_UNLIKELY(pThread->enmState != PDMTHREADSTATE_RUNNING))
+            break;
+
+        tsNanoStart = RTTimeNanoTS();
+
+        RTCritSectEnter(&pThis->CritSect);
+
+        /* Reset idle detection flag */
+        pThis->fIdle = true;
+
+        /* Frame boundary, so do EOF stuff here. */
+        bump_frame_number(pThis);
+        if ( (pThis->dqic != 0x7) && (pThis->dqic != 0))
+            pThis->dqic--;
 
-    VUSBIRhReapAsyncUrbs(pThis->RootHub.pIRhConn, 0);
+        /* Clean up any URBs that have been removed. */
+        ohciCancelOrphanedURBs(pThis);
 
-    /* Frame boundary, so do EOF stuff here */
-    bump_frame_number(pThis);
-    if ( (pThis->dqic != 0x7) && (pThis->dqic != 0) )
-        pThis->dqic--;
+        /* Start the next frame. */
+        ohciStartOfFrame(pThis);
 
-    /* Clean up any URBs that have been removed */
-    ohciCancelOrphanedURBs(pThis);
+        RTCritSectLeave(&pThis->CritSect);
 
-    /* Start the next frame */
-    ohciStartOfFrame(pThis);
+        /* Wait for the next round. */
+        RTMSINTERVAL msWait = (RTMSINTERVAL)(((RTTimeNanoTS() + pThis->nsWait) - tsNanoStart) / 1000000);
+        rc = RTSemEventWait(pThis->hSemEventFrame, msWait);
+    }
+
+    return VINF_SUCCESS;
+}
 
+/**
+ * Unblock the framer thread so it can respond to a state change.
+ *
+ * @returns VBox status code.
+ * @param   pDevIns     The device instance.
+ * @param   pThread     The send thread.
+ */
+static DECLCALLBACK(int) ohciR3ThreadFrameWakeup(PPDMDEVINS pDevIns, PPDMTHREAD pThread)
+{
+    POHCI pThis = PDMINS_2_DATA(pDevIns, POHCI);
+    return RTSemEventSignal(pThis->hSemEventFrame);
+}
+
+/**
+ * Do frame processing on frame boundary
+ */
+static void ohciFrameBoundaryTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
+{
+    POHCI pThis = (POHCI)pvUser;
+    STAM_PROFILE_START(&pThis->StatTimer, a);
     STAM_PROFILE_STOP(&pThis->StatTimer, a);
 }
 
@@ -3825,14 +3892,13 @@ static void ohciFrameBoundaryTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pv
 static void ohciBusStart(POHCI pThis)
 {
     VUSBIDevPowerOn(pThis->RootHub.pIDev);
-    bump_frame_number(pThis);
     pThis->dqic = 0x7;
 
     Log(("ohci: %s: Bus started\n", pThis->PciDev.name));
 
-    pThis->SofTime = TMTimerGet(pThis->CTX_SUFF(pEndOfFrameTimer)) - pThis->cTicksPerFrame;
-    pThis->fIdle = false;   /* Assume we won't be idle */
-    ohciStartOfFrame(pThis);
+    pThis->SofTime = PDMDevHlpTMTimeVirtGet(pThis->CTX_SUFF(pDevIns));
+    ASMAtomicXchgBool(&pThis->fBusStarted, true);
+    RTSemEventSignal(pThis->hSemEventFrame);
 }
 
 /**
@@ -3840,8 +3906,8 @@ static void ohciBusStart(POHCI pThis)
  */
 static void ohciBusStop(POHCI pThis)
 {
-    if (pThis->CTX_SUFF(pEndOfFrameTimer))
-        TMTimerStop(pThis->CTX_SUFF(pEndOfFrameTimer));
+    ASMAtomicXchgBool(&pThis->fBusStarted, false);
+    RTSemEventSignal(pThis->hSemEventFrame);
     VUSBIDevPowerOff(pThis->RootHub.pIDev);
 }
 
@@ -3857,7 +3923,7 @@ static void ohciBusResume(POHCI pThis, bool fHardware)
          fHardware, (pThis->ctl & OHCI_CTL_RWE) ? "on" : "off"));
 
     if (fHardware && (pThis->ctl & OHCI_CTL_RWE))
-        ohciSetInterrupt(pThis, OHCI_INTR_RESUME_DETECT);
+        ohciR3SetInterrupt(pThis, OHCI_INTR_RESUME_DETECT);
 
     ohciBusStart(pThis);
 }
@@ -4063,6 +4129,11 @@ static int HcInterruptStatus_w(POHCI pThis, uint32_t iReg, uint32_t val)
 {
     uint32_t res = pThis->intr_status & ~val;
     uint32_t chg = pThis->intr_status ^ res; NOREF(chg);
+
+    int rc = PDMCritSectEnter(&pThis->CsIrq, VINF_IOM_R3_MMIO_WRITE);
+    if (rc != VINF_SUCCESS)
+        return rc;
+
     Log2(("HcInterruptStatus_w(%#010x) => %sSO=%d %sWDH=%d %sSF=%d %sRD=%d %sUE=%d %sFNO=%d %sRHSC=%d %sOC=%d\n",
           val,
           chg & RT_BIT(0) ? "*" : "",  res       & 1,
@@ -4081,7 +4152,8 @@ static int HcInterruptStatus_w(POHCI pThis, uint32_t iReg, uint32_t val)
      * register by writing '1' to bit positions to be cleared"
      */
     pThis->intr_status &= ~val;
-    ohciUpdateInterrupt(pThis, "HcInterruptStatus_w");
+    ohciUpdateInterruptLocked(pThis, "HcInterruptStatus_w");
+    PDMCritSectLeave(&pThis->CsIrq);
     return VINF_SUCCESS;
 }
 
@@ -4105,6 +4177,11 @@ static int HcInterruptEnable_w(POHCI pThis, uint32_t iReg, uint32_t val)
 {
     uint32_t res = pThis->intr | val;
     uint32_t chg = pThis->intr ^ res; NOREF(chg);
+
+    int rc = PDMCritSectEnter(&pThis->CsIrq, VINF_IOM_R3_MMIO_WRITE);
+    if (rc != VINF_SUCCESS)
+        return rc;
+
     Log2(("HcInterruptEnable_w(%#010x) => %sSO=%d %sWDH=%d %sSF=%d %sRD=%d %sUE=%d %sFNO=%d %sRHSC=%d %sOC=%d %sMIE=%d\n",
           val,
           chg & RT_BIT(0)  ? "*" : "",  res        & 1,
@@ -4120,7 +4197,8 @@ static int HcInterruptEnable_w(POHCI pThis, uint32_t iReg, uint32_t val)
         Log2(("Uknown bits %#x are set!!!\n", val & ~0xc000007f));
 
     pThis->intr |= val;
-    ohciUpdateInterrupt(pThis, "HcInterruptEnable_w");
+    ohciUpdateInterruptLocked(pThis, "HcInterruptEnable_w");
+    PDMCritSectLeave(&pThis->CsIrq);
     return VINF_SUCCESS;
 }
 
@@ -4149,6 +4227,11 @@ static int HcInterruptDisable_w(POHCI pThis, uint32_t iReg, uint32_t val)
 {
     uint32_t res = pThis->intr & ~val;
     uint32_t chg = pThis->intr ^ res; NOREF(chg);
+
+    int rc = PDMCritSectEnter(&pThis->CsIrq, VINF_IOM_R3_MMIO_WRITE);
+    if (rc != VINF_SUCCESS)
+        return rc;
+
     Log2(("HcInterruptDisable_w(%#010x) => %sSO=%d %sWDH=%d %sSF=%d %sRD=%d %sUE=%d %sFNO=%d %sRHSC=%d %sOC=%d %sMIE=%d\n",
           val,
           chg & RT_BIT(0)  ? "*" : "",  res        & 1,
@@ -4164,7 +4247,8 @@ static int HcInterruptDisable_w(POHCI pThis, uint32_t iReg, uint32_t val)
      * interrupts you don't know about. */
 
     pThis->intr &= ~val;
-    ohciUpdateInterrupt(pThis, "HcInterruptDisable_w");
+    ohciUpdateInterruptLocked(pThis, "HcInterruptDisable_w");
+    PDMCritSectLeave(&pThis->CsIrq);
     return VINF_SUCCESS;
 }
 
@@ -4367,7 +4451,7 @@ static int HcFmRemaining_r(PCOHCI pThis, uint32_t iReg, uint32_t *pu32Value)
         /*
          * Being in USB operational state guarantees SofTime was set already.
          */
-        uint64_t tks = TMTimerGet(pThis->CTX_SUFF(pEndOfFrameTimer)) - pThis->SofTime;
+        uint64_t tks = PDMDevHlpTMTimeVirtGet(pThis->CTX_SUFF(pDevIns)) - pThis->SofTime;
         if (tks < pThis->cTicksPerFrame)  /* avoid muldiv if possible */
         {
             uint16_t fr;
@@ -4704,7 +4788,7 @@ static DECLCALLBACK(void) uchi_port_reset_done(PVUSBIDEVICE pDev, int rc, void *
     }
 
     /* Raise roothub status change interrupt. */
-    ohciSetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
+    ohciR3SetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
 }
 
 /**
@@ -4728,7 +4812,7 @@ static bool rhport_set_if_connected(POHCIROOTHUB pRh, int iPort, uint32_t fValue
     if (!(pRh->aPorts[iPort].fReg & OHCI_PORT_R_CURRENT_CONNECT_STATUS))
     {
         pRh->aPorts[iPort].fReg |= OHCI_PORT_R_CONNECT_STATUS_CHANGE;
-        ohciSetInterrupt(pRh->pOhci, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
+        ohciR3SetInterrupt(pRh->pOhci, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
         return false;
     }
 
@@ -4823,7 +4907,7 @@ static int HcRhPortStatus_w(POHCI pThis, uint32_t iReg, uint32_t val)
         rhport_power(&pThis->RootHub, i, true /* power up */);
         pThis->RootHub.aPorts[i].fReg &= ~OHCI_PORT_R_SUSPEND_STATUS;
         pThis->RootHub.aPorts[i].fReg |= OHCI_PORT_R_SUSPEND_STATUS_CHANGE;
-        ohciSetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
+        ohciR3SetInterrupt(pThis, OHCI_INTR_ROOT_HUB_STATUS_CHANGE);
     }
 
     if (p->fReg != old_state)
@@ -5017,6 +5101,22 @@ static DECLCALLBACK(int) ohciR3SavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
             pRh->aPorts[i].pDev = pDev;
         }
     }
+
+    /*
+     * If the bus was started set the timer. This is ugly but avoids changing the
+     * saved state version for now so we can backport the changes to other branches.
+     */
+    /** @todo: Do it properly for 4.4 by changing the saved state. */
+    if (pThis->fBusStarted)
+    {
+        /* Calculate a new timer expiration so this saved state works with older releases. */
+        uint64_t u64Expire = PDMDevHlpTMTimeVirtGet(pThis->CTX_SUFF(pDevIns)) + pThis->cTicksPerFrame;
+
+        LogFlowFunc(("Bus is active, setting timer to %llu\n", u64Expire));
+        int rc = TMTimerSet(pThis->pEndOfFrameTimerR3, u64Expire);
+        AssertRC(rc);
+    }
+
     PDMCritSectLeave(pThis->pDevInsR3->pCritSectRoR3);
 
     /*
@@ -5360,6 +5460,30 @@ static DECLCALLBACK(void) ohciR3Reset(PPDMDEVINS pDevIns)
 
 
 /**
+ * Resume notification.
+ *
+ * @returns VBox status.
+ * @param   pDevIns     The device instance data.
+ */
+static DECLCALLBACK(void) ohciR3Resume(PPDMDEVINS pDevIns)
+{
+    POHCI pThis = PDMINS_2_DATA(pDevIns, POHCI);
+    LogFlowFunc(("\n"));
+
+    /* Restart the frame thread if the timer is active. */
+    if (TMTimerIsActive(pThis->pEndOfFrameTimerR3))
+    {
+        int rc = TMTimerStop(pThis->pEndOfFrameTimerR3);
+        AssertRC(rc);
+
+        LogFlowFunc(("Bus was active, restart frame thread\n"));
+        ASMAtomicXchgBool(&pThis->fBusStarted, true);
+        RTSemEventSignal(pThis->hSemEventFrame);
+    }
+}
+
+
+/**
  * Info handler, device version. Dumps OHCI control registers.
  *
  * @param   pDevIns     Device instance which registered the info.
@@ -5441,9 +5565,18 @@ static DECLCALLBACK(void) ohciR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta
  */
 static DECLCALLBACK(int) ohciR3Destruct(PPDMDEVINS pDevIns)
 {
+    POHCI pThis = PDMINS_2_DATA(pDevIns, POHCI);
     PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
 
     /*
+     * Destroy event sempahores.
+     */
+    RTSemEventDestroy(pThis->hSemEventFrame);
+    if (RTCritSectIsInitialized(&pThis->CritSect))
+        RTCritSectDelete(&pThis->CritSect);
+    PDMR3CritSectDelete(&pThis->CsIrq);
+
+    /*
      * Tear down the per endpoint in-flight tracking...
      */
 
@@ -5586,6 +5719,27 @@ static DECLCALLBACK(int) ohciR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFG
     Log(("ohci: cTicksPerFrame=%RU64 cTicksPerUsbTick=%RU64\n",
          pThis->cTicksPerFrame, pThis->cTicksPerUsbTick));
 
+    pThis->fBusStarted = false;
+
+    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CsIrq, RT_SRC_POS, "OHCI#%uIrq", iInstance);
+    if (RT_FAILURE(rc))
+        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
+                                   N_("EHCI: Failed to create critical section"));
+
+    rc = RTSemEventCreate(&pThis->hSemEventFrame);
+    AssertRCReturn(rc, rc);
+
+    rc = RTCritSectInit(&pThis->CritSect);
+    if (RT_FAILURE(rc))
+        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
+                                   N_("OHCI: Failed to create critical section"));
+
+    rc = PDMDevHlpThreadCreate(pDevIns, &pThis->hThreadFrame, pThis, ohciR3ThreadFrame,
+                               ohciR3ThreadFrameWakeup, 0, RTTHREADTYPE_IO, "OhciFramer");
+    if (RT_FAILURE(rc))
+        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
+                                   N_("OHCI: Failed to create worker thread"));
+
     /*
      * Do a hardware reset.
      */
@@ -5651,7 +5805,7 @@ const PDMDEVREG g_DeviceOHCI =
     /* pfnSuspend */
     NULL,
     /* pfnResume */
-    NULL,
+    ohciR3Resume,
     /* pfnAttach */
     NULL,
     /* pfnDetach */
diff --git a/src/VBox/Devices/USB/DrvVUSBRootHub.cpp b/src/VBox/Devices/USB/DrvVUSBRootHub.cpp
index 07a43ef..5d276a7 100644
--- a/src/VBox/Devices/USB/DrvVUSBRootHub.cpp
+++ b/src/VBox/Devices/USB/DrvVUSBRootHub.cpp
@@ -584,6 +584,13 @@ static DECLCALLBACK(int) vusbRhCancelUrbsEp(PVUSBIROOTHUBCONNECTOR pInterface, P
      * Cancel and reap the URB(s) on an endpoint.
      */
     LogFlow(("vusbRhCancelUrbsEp: pRh=%p pUrb=%p\n", pRh));
+
+    /* Tear down reaper thread on the device. */
+    PVUSBDEV pDev = pUrb->VUsb.pDev;
+    int rc = vusbDevUrbIoThreadDestroy(pDev);
+    if (RT_FAILURE(rc))
+        return rc;
+
     vusbUrbCancel(pUrb, CANCELMODE_UNDO);
 
     PVUSBURB pRipe;
@@ -596,7 +603,9 @@ static DECLCALLBACK(int) vusbRhCancelUrbsEp(PVUSBIROOTHUBCONNECTOR pInterface, P
         pRipe->enmStatus = VUSBSTATUS_CRC;
         vusbUrbRipe(pRipe);
     }
-    return VINF_SUCCESS;
+
+    rc = vusbDevUrbIoThreadCreate(pDev);
+    return rc;
 }
 
 /** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelAllUrbs */
@@ -605,6 +614,18 @@ static DECLCALLBACK(void) vusbRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface)
     PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface);
 
     /*
+     * Tear down all reaper threads first to avoid concurrency issues.
+     * pfnUrbReap is not thread safe.
+     */
+    PVUSBDEV pDev = pRh->pDevices;
+    while (pDev)
+    {
+        int rc = vusbDevUrbIoThreadDestroy(pDev);
+        AssertRC(rc); /* Should not fail. */
+        pDev = pDev->pNext;
+    }
+
+    /*
      * Cancel the URBS.
      */
     PVUSBURB pUrb = pRh->pAsyncUrbHead;
@@ -635,6 +656,17 @@ static DECLCALLBACK(void) vusbRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface)
             vusbUrbRipe(pRipe);
         }
     }
+
+    /*
+     * Create the reaper threads again.
+     */
+    pDev = pRh->pDevices;
+    while (pDev)
+    {
+        int rc = vusbDevUrbIoThreadCreate(pDev);
+        AssertRC(rc); /** @todo: What if this fails? */
+        pDev = pDev->pNext;
+    }
 }
 
 
diff --git a/src/VBox/Devices/USB/USBProxyDevice-stub.cpp b/src/VBox/Devices/USB/USBProxyDevice-stub.cpp
index ce7c8b2..a79a64e 100644
--- a/src/VBox/Devices/USB/USBProxyDevice-stub.cpp
+++ b/src/VBox/Devices/USB/USBProxyDevice-stub.cpp
@@ -32,6 +32,7 @@
 extern const USBPROXYBACK g_USBProxyDeviceHost =
 {
     "host",
+    0,          /* cbBackend */
     NULL,       /* Open */
     NULL,       /* Init */
     NULL,       /* Close */
diff --git a/src/VBox/Devices/USB/USBProxyDevice.cpp b/src/VBox/Devices/USB/USBProxyDevice.cpp
index 32a2514..a51bc36 100644
--- a/src/VBox/Devices/USB/USBProxyDevice.cpp
+++ b/src/VBox/Devices/USB/USBProxyDevice.cpp
@@ -52,6 +52,7 @@ static void *GetStdDescSync(PUSBPROXYDEV pProxyDev, uint8_t iDescType, uint8_t i
         /*
          * Setup a MSG URB, queue and reap it.
          */
+        int rc = VINF_SUCCESS;
         VUSBURB Urb;
         AssertCompile(RT_SIZEOFMEMB(VUSBURB, abData) >= _4K);
         Urb.u32Magic = VUSBURB_MAGIC;
@@ -78,7 +79,8 @@ static void *GetStdDescSync(PUSBPROXYDEV pProxyDev, uint8_t iDescType, uint8_t i
         pSetup->wIndex = LangId;
         pSetup->wLength = cbHint;
 
-        if (!pProxyDev->pOps->pfnUrbQueue(&Urb))
+        rc = pProxyDev->pOps->pfnUrbQueue(pProxyDev, &Urb);
+        if (RT_FAILURE(rc))
             break;
 
         /* Don't wait forever, it's just a simple request that should
@@ -88,7 +90,9 @@ static void *GetStdDescSync(PUSBPROXYDEV pProxyDev, uint8_t iDescType, uint8_t i
         PVUSBURB pUrbReaped = pProxyDev->pOps->pfnUrbReap(pProxyDev, 10000 /* ms */);
         if (!pUrbReaped)
         {
-            pProxyDev->pOps->pfnUrbCancel(&Urb);
+            rc = pProxyDev->pOps->pfnUrbCancel(pProxyDev, &Urb);
+            AssertRC(rc);
+            /** @todo: This breaks the comment above... */
             pUrbReaped = pProxyDev->pOps->pfnUrbReap(pProxyDev, RT_INDEFINITE_WAIT);
         }
         if (pUrbReaped != &Urb)
@@ -585,10 +589,11 @@ static DECLCALLBACK(int) usbProxyDevSetConfiguration(PPDMUSBINS pUsbIns, uint8_t
         ||  !pProxyDev->cIgnoreSetConfigs)
     {
         pProxyDev->cIgnoreSetConfigs = 0;
-        if (!pProxyDev->pOps->pfnSetConfig(pProxyDev, bConfigurationValue))
+        int rc = pProxyDev->pOps->pfnSetConfig(pProxyDev, bConfigurationValue);
+        if (RT_FAILURE(rc))
         {
             pProxyDev->iActiveCfg = -1;
-            return VERR_GENERAL_FAILURE;
+            return rc;
         }
         pProxyDev->iActiveCfg = bConfigurationValue;
     }
@@ -628,10 +633,7 @@ static DECLCALLBACK(int) usbProxyDevSetInterface(PPDMUSBINS pUsbIns, uint8_t bIn
     LogFlow(("usbProxyDevSetInterface: pProxyDev=%s bInterfaceNumber=%d bAlternateSetting=%d\n",
              pUsbIns->pszName, bInterfaceNumber, bAlternateSetting));
 
-    /** @todo this is fishy, pfnSetInterface returns true/false from what I can see... */
-    if (pProxyDev->pOps->pfnSetInterface(pProxyDev, bInterfaceNumber, bAlternateSetting) < 0)
-        return VERR_GENERAL_FAILURE;
-    return VINF_SUCCESS;
+    return pProxyDev->pOps->pfnSetInterface(pProxyDev, bInterfaceNumber, bAlternateSetting);
 }
 
 
@@ -646,9 +648,7 @@ static DECLCALLBACK(int) usbProxyDevClearHaltedEndpoint(PPDMUSBINS pUsbIns, unsi
     LogFlow(("usbProxyDevClearHaltedEndpoint: pProxyDev=%s uEndpoint=%u\n",
              pUsbIns->pszName, uEndpoint));
 
-    if (!pProxyDev->pOps->pfnClearHaltedEndpoint(pProxyDev, uEndpoint))
-        return VERR_GENERAL_FAILURE;
-    return VINF_SUCCESS;
+    return pProxyDev->pOps->pfnClearHaltedEndpoint(pProxyDev, uEndpoint);
 }
 
 
@@ -659,12 +659,14 @@ static DECLCALLBACK(int) usbProxyDevClearHaltedEndpoint(PPDMUSBINS pUsbIns, unsi
  */
 static DECLCALLBACK(int) usbProxyDevUrbQueue(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
 {
+    int rc = VINF_SUCCESS;
     PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUsbIns, PUSBPROXYDEV);
-    if (!pProxyDev->pOps->pfnUrbQueue(pUrb))
+    rc = pProxyDev->pOps->pfnUrbQueue(pProxyDev, pUrb);
+    if (RT_FAILURE(rc))
         return pProxyDev->fDetached
              ? VERR_VUSB_DEVICE_NOT_ATTACHED
              : VERR_VUSB_FAILED_TO_QUEUE_URB;
-    return VINF_SUCCESS;
+    return rc;
 }
 
 
@@ -676,8 +678,7 @@ static DECLCALLBACK(int) usbProxyDevUrbQueue(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
 static DECLCALLBACK(int) usbProxyDevUrbCancel(PPDMUSBINS pUsbIns, PVUSBURB pUrb)
 {
     PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUsbIns, PUSBPROXYDEV);
-    pProxyDev->pOps->pfnUrbCancel(pUrb);
-    return VINF_SUCCESS;
+    return pProxyDev->pOps->pfnUrbCancel(pProxyDev, pUrb);
 }
 
 
@@ -698,6 +699,19 @@ static DECLCALLBACK(PVUSBURB) usbProxyDevUrbReap(PPDMUSBINS pUsbIns, RTMSINTERVA
 }
 
 
+/**
+ * @copydoc PDMUSBREG::pfnWakeup
+ *
+ * USB Device Proxy: Call OS specific code.
+ */
+static DECLCALLBACK(int) usbProxyDevWakeup(PPDMUSBINS pUsbIns)
+{
+    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUsbIns, PUSBPROXYDEV);
+
+    return pProxyDev->pOps->pfnWakeup(pProxyDev);
+}
+
+
 /** @copydoc PDMUSBREG::pfnDestruct */
 static DECLCALLBACK(void) usbProxyDestruct(PPDMUSBINS pUsbIns)
 {
@@ -727,6 +741,9 @@ static DECLCALLBACK(void) usbProxyDestruct(PPDMUSBINS pUsbIns)
     if (&g_szDummyName[0] != pUsbIns->pszName)
         RTStrFree(pUsbIns->pszName);
     pUsbIns->pszName = NULL;
+
+    if (pThis->pvInstanceDataR3)
+        RTMemFree(pThis->pvInstanceDataR3);
 }
 
 
@@ -830,6 +847,11 @@ static DECLCALLBACK(int) usbProxyConstruct(PPDMUSBINS pUsbIns, int iInstance, PC
         pThis->pOps = &g_USBProxyDeviceHost;
     else
         pThis->pOps = &g_USBProxyDeviceVRDP;
+
+    pThis->pvInstanceDataR3 = RTMemAllocZ(pThis->pOps->cbBackend);
+    if (!pThis->pvInstanceDataR3)
+        return PDMUSB_SET_ERROR(pUsbIns, VERR_NO_MEMORY, N_("USBProxy: can't allocate memory for host backend"));
+
     rc = pThis->pOps->pfnOpen(pThis, szAddress, pvBackend);
     if (RT_FAILURE(rc))
         return rc;
@@ -1123,6 +1145,8 @@ const PDMUSBREG g_UsbDevProxy =
     usbProxyDevUrbCancel,
     /* pfnUrbReap */
     usbProxyDevUrbReap,
+    /* pfnWakeup */
+    usbProxyDevWakeup,
 
     /* u32TheEnd */
     PDM_USBREG_VERSION
diff --git a/src/VBox/Devices/USB/USBProxyDevice.h b/src/VBox/Devices/USB/USBProxyDevice.h
index 7d0566f..6534a4c 100644
--- a/src/VBox/Devices/USB/USBProxyDevice.h
+++ b/src/VBox/Devices/USB/USBProxyDevice.h
@@ -24,22 +24,6 @@
 RT_C_DECLS_BEGIN
 
 
-/**
- * Arguments passed to the USB proxy device constructor.
- */
-typedef struct USBPROXYDEVARGS
-{
-    /** Whether this is a remote (VRDP) or local (Host) device. */
-    bool        fRemote;
-    /** Host specific USB device address. */
-    const char *pszAddress;
-    /** Pointer to backend specific data. */
-    void       *pvBackend;
-} USBPROXYDEVARGS;
-/** Pointer to proxy device creation structure. */
-typedef USBPROXYDEVARGS *PUSBPROXYDEVARGS;
-
-
 /** Pointer to a USB proxy device. */
 typedef struct USBPROXYDEV *PUSBPROXYDEV;
 
@@ -50,6 +34,8 @@ typedef struct USBPROXYBACK
 {
     /** Name of the backend. */
     const char *pszName;
+    /** Size of the backend specific data. */
+    size_t      cbBackend;
 
     /**
      * Opens the USB device specfied by pszAddress.
@@ -63,22 +49,23 @@ typedef struct USBPROXYBACK
      * @param   pszAddress  Host specific USB device address.
      * @param   pvBackend   Pointer to backend specific data.
      */
-    int  (* pfnOpen)(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend);
+    DECLR3CALLBACKMEMBER(int, pfnOpen, (PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend));
 
     /**
      * Optional callback for initializing the device after the configuration
      * has been established.
      *
      * @returns VBox status code.
-     * @param   pProxyDev   The USB Proxy Device instance.
+     * @param   pProxyDev       The USB Proxy Device instance.
      */
-    int  (* pfnInit)(PUSBPROXYDEV pProxyDev);
+    DECLR3CALLBACKMEMBER(int, pfnInit, (PUSBPROXYDEV pProxyDev));
 
-    /**         Closes handle to the host USB device.
+    /**
+     * Closes handle to the host USB device.
      *
-     * @param   pDev        The USB Proxy Device instance.
+     * @param   pProxyDev       The USB Proxy Device instance.
      */
-    void (* pfnClose)(PUSBPROXYDEV pProxyDev);
+    DECLR3CALLBACKMEMBER(void, pfnClose, (PUSBPROXYDEV pProxyDev));
 
     /**
      * Reset a device.
@@ -86,48 +73,94 @@ typedef struct USBPROXYBACK
      * The backend must update iActualCfg and fIgnoreEqualSetConfig.
      *
      * @returns VBox status code.
-     * @param   pDev            The device to reset.
+     * @param   pProxyDev       The USB Proxy Device instance.
      * @param   fResetOnLinux   It's safe to do reset on linux, we can deal with devices
      *                          being logically reconnected.
      */
-    int  (* pfnReset)(PUSBPROXYDEV pProxyDev, bool fResetOnLinux);
+    DECLR3CALLBACKMEMBER(int, pfnReset, (PUSBPROXYDEV pProxyDev, bool fResetOnLinux));
 
-    /** @todo make it return a VBox status code! */
-    int  (* pfnSetConfig)(PUSBPROXYDEV pProxyDev, int iCfg);
+    /**
+     * Sets the given configuration of the device.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   iCfg            The configuration to set.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnSetConfig, (PUSBPROXYDEV pProxyDev, int iCfg));
 
-    /** @todo make it return a VBox status code! */
-    int  (* pfnClaimInterface)(PUSBPROXYDEV pProxyDev, int iIf);
+    /**
+     * Claim an interface for use by the prox device.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   iIf             Interface number to claim.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnClaimInterface, (PUSBPROXYDEV pProxyDev, int iIf));
 
-    /** @todo make it return a VBox status code! */
-    int  (* pfnReleaseInterface)(PUSBPROXYDEV pProxyDev, int iIf);
+    /**
+     * Releases an interface which was claimed before.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   iIf             Interface number to release.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnReleaseInterface, (PUSBPROXYDEV pProxyDev, int iIf));
 
-    /** @todo make it return a VBox status code! */
-    int  (* pfnSetInterface)(PUSBPROXYDEV pProxyDev, int iIf, int setting);
+    /**
+     * Sets the given alternate interface for the device.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   iIf             Interface to use.
+     * @param   iSetting        The alternate setting to use.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnSetInterface, (PUSBPROXYDEV pProxyDev, int iIf, int iSetting));
 
-    /** @todo make it return a VBox status code! */
-    bool (* pfnClearHaltedEndpoint)(PUSBPROXYDEV  pDev, unsigned int iEp);
+    /**
+     * Clears the given halted endpoint.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   iEp             The endpoint to clear.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnClearHaltedEndpoint, (PUSBPROXYDEV  pDev, unsigned int iEp));
 
-    /** @todo make it return a VBox status code! Add pDev. */
-    int  (* pfnUrbQueue)(PVUSBURB pUrb);
+    /**
+     * Queue a new URB.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   pUrb            The URB to queue.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnUrbQueue, (PUSBPROXYDEV pProxyDev, PVUSBURB pUrb));
 
     /**
      * Cancel an in-flight URB.
      *
-     * @param   pUrb        The URB to cancel.
-     * @todo make it return a VBox status code! Add pDev.
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   pUrb            The URB to cancel.
      */
-    void (* pfnUrbCancel)(PVUSBURB pUrb);
+    DECLR3CALLBACKMEMBER(int, pfnUrbCancel, (PUSBPROXYDEV pProxyDev, PVUSBURB pUrb));
 
     /**
      * Reap URBs in-flight on a device.
      *
      * @returns Pointer to a completed URB.
      * @returns NULL if no URB was completed.
-     * @param   pDev        The device.
-     * @param   cMillies    Number of milliseconds to wait. Use 0 to not
-     *                      wait at all.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     * @param   cMillies        Number of milliseconds to wait. Use 0 to not
+     *                          wait at all.
      */
-    PVUSBURB (* pfnUrbReap)(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies);
+    DECLR3CALLBACKMEMBER(PVUSBURB, pfnUrbReap, (PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies));
+
+    /**
+     * Kicks the thread waiting in pfnUrbReap to make it return.
+     *
+     * @returns VBox status code.
+     * @param   pProxyDev       The USB Proxy Device instance.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnWakeup, (PUSBPROXYDEV pProxyDev));
 
     /** Dummy entry for making sure we've got all members initialized. */
     uint32_t uDummy;
@@ -162,7 +195,7 @@ typedef struct USBPROXYDEV
     /** The previous device in rdesktop-vrdp's linked list */
     PUSBPROXYDEV        pPrev;
     /** The vrdp device ID */
-    uint32_t devid;
+    uint32_t            devid;
     /** Linked list of in-flight URBs */
     PVUSBURB            pUrbs;
 #endif
@@ -200,22 +233,15 @@ typedef struct USBPROXYDEV
     /** Whether the device has been detached.
      * This is hack for making PDMUSBREG::pfnUsbQueue return the right status code. */
     bool                fDetached;
-    /** Backend specific data */
-    union USBPROXYBACKENDDATA
-    {
-        /** Pointer to some backend data.
-         * The Linux and Darwin backends are making use of this. */
-        void *pv;
-        RTFILE hFile;
-        int fd;
-        struct vrdp_priv
-        {
-            void *pCallback;
-            void *pDevice;
-        } vrdp;
-    } Backend;
+    /** Backend specific data, the size is stored in pOps::cbBackend. */
+    void                *pvInstanceDataR3;
 } USBPROXYDEV;
 
+/** @def USBPROXYDEV_2_DATA
+ * Converts a USB proxy Device, pointer to a pointer to the backend specific instance data.
+ */
+#define USBPROXYDEV_2_DATA(a_pProxyDev, a_Type)   ( (a_Type)(a_pProxyDev)->pvInstanceDataR3 )
+
 static inline char *usbProxyGetName(PUSBPROXYDEV pProxyDev)
 {
 #ifndef RDESKTOP
diff --git a/src/VBox/Devices/USB/VUSBDevice.cpp b/src/VBox/Devices/USB/VUSBDevice.cpp
index ff4d79b..d73d782 100644
--- a/src/VBox/Devices/USB/VUSBDevice.cpp
+++ b/src/VBox/Devices/USB/VUSBDevice.cpp
@@ -1115,6 +1115,113 @@ static void vusbDevCancelAllUrbs(PVUSBDEV pDev, bool fDetaching)
 }
 
 
+static DECLCALLBACK(int) vusbDevUrbIoThread(RTTHREAD hThread, void *pvUser)
+{
+    PVUSBDEV pDev = (PVUSBDEV)pvUser;
+
+    /* Notify the starter that we are up and running. */
+    RTThreadUserSignal(hThread);
+
+    LogFlowFunc(("Entering work loop\n"));
+
+    while (!ASMAtomicReadBool(&pDev->fTerminate))
+    {
+        if (pDev->enmState != VUSB_DEVICE_STATE_RESET)
+            vusbUrbDoReapAsyncDev(pDev, RT_INDEFINITE_WAIT);
+
+        /* Woken up or there is an URB to queue. */
+        PRTQUEUEATOMICITEM pHead = RTQueueAtomicRemoveAll(&pDev->QueueUrb);
+        while (pHead)
+        {
+            PVUSBURB pUrb = RT_FROM_MEMBER(pHead, VUSBURB, Dev.QueueItem);
+
+            pHead = pHead->pNext;
+
+            LogFlow(("%s: Queuing URB\n", pUrb->pszDesc));
+            int rc = pUrb->pUsbIns->pReg->pfnUrbQueue(pUrb->pUsbIns, pUrb);
+            if (RT_FAILURE(rc))
+            {
+                LogFlow(("%s: Queuing URB failed with %Rrc\n", pUrb->pszDesc, rc));
+
+                /*
+                 * The device was detached, so we fail everything.
+                 * (We should really detach and destroy the device, but we'll have to wait till Main reacts.)
+                 */
+                if (rc == VERR_VUSB_DEVICE_NOT_ATTACHED)
+                    rc = vusbUrbSubmitHardError(pUrb);
+
+                /*
+                 * We don't increment error count if async URBs are in flight, in
+                 * this case we just assume we need to throttle back, this also
+                 * makes sure we don't halt bulk endpoints at the wrong time.
+                 */
+                else if (   RT_FAILURE(rc)
+                         && !pDev->aPipes[pUrb->EndPt].async
+                         /* && pUrb->enmType == VUSBXFERTYPE_BULK ?? */
+                         && !vusbUrbErrorRh(pUrb))
+                {
+                    /* don't retry it anymore. */
+                    pUrb->enmState = VUSBURBSTATE_REAPED;
+                    pUrb->enmStatus = VUSBSTATUS_CRC;
+                    vusbUrbCompletionRh(pUrb);
+                }
+            }
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+int vusbDevUrbIoThreadWakeup(PVUSBDEV pDev)
+{
+    ASMAtomicXchgBool(&pDev->fWokenUp, true);
+    return pDev->pUsbIns->pReg->pfnWakeup(pDev->pUsbIns);
+}
+
+/**
+ * Create the URB I/O thread.
+ *
+ * @returns VBox status code.
+ * @param   pDev    The VUSB device.
+ */
+int vusbDevUrbIoThreadCreate(PVUSBDEV pDev)
+{
+    int rc = VINF_SUCCESS;
+
+    ASMAtomicXchgBool(&pDev->fTerminate, false);
+    rc = RTThreadCreateF(&pDev->hUrbIoThread, vusbDevUrbIoThread, pDev, 0, RTTHREADTYPE_IO,
+                         RTTHREADFLAGS_WAITABLE, "USBDevIo-%d", pDev->i16Port);
+    if (RT_SUCCESS(rc))
+    {
+        /* Wait for it to become active. */
+        rc = RTThreadUserWait(pDev->hUrbIoThread, RT_INDEFINITE_WAIT);
+    }
+
+    return rc;
+}
+
+/**
+ * Destro the URB I/O thread.
+ *
+ * @returns VBox status code.
+ * @param   pDev    The VUSB device.
+ */
+int vusbDevUrbIoThreadDestroy(PVUSBDEV pDev)
+{
+    int rc = VINF_SUCCESS;
+    int rcThread = VINF_SUCCESS;
+
+    ASMAtomicXchgBool(&pDev->fTerminate, true);
+    vusbDevUrbIoThreadWakeup(pDev);
+
+    rc = RTThreadWait(pDev->hUrbIoThread, RT_INDEFINITE_WAIT, &rcThread);
+    if (RT_SUCCESS(rc))
+        rc = rcThread;
+
+    return rc;
+}
+
+
 /**
  * Detaches a device from the hub it's attached to.
  *
@@ -1182,6 +1289,9 @@ void vusbDevDestroy(PVUSBDEV pDev)
         }
     }
 
+    /* Destroy I/O thread. */
+    vusbDevUrbIoThreadDestroy(pDev);
+
     /*
      * Detach and free resources.
      */
@@ -1558,6 +1668,7 @@ int vusbDevInit(PVUSBDEV pDev, PPDMUSBINS pUsbIns)
     pDev->hResetThread = NIL_RTTHREAD;
     pDev->pvResetArgs = NULL;
     pDev->pResetTimer = NULL;
+    RTQueueAtomicInit(&pDev->QueueUrb);
 
     /*
      * Create the reset timer.
@@ -1601,6 +1712,9 @@ int vusbDevInit(PVUSBDEV pDev, PPDMUSBINS pUsbIns)
     pDev->paIfStates = (PVUSBINTERFACESTATE)RTMemAllocZ(cbIface);
     AssertMsgReturn(pDev->paIfStates, ("RTMemAllocZ(%d) failed\n", cbIface), VERR_NO_MEMORY);
 
+    rc = vusbDevUrbIoThreadCreate(pDev);
+    AssertRCReturn(rc, rc);
+
     return VINF_SUCCESS;
 }
 
diff --git a/src/VBox/Devices/USB/VUSBInternal.h b/src/VBox/Devices/USB/VUSBInternal.h
index 44c68dd..2035bf2 100644
--- a/src/VBox/Devices/USB/VUSBInternal.h
+++ b/src/VBox/Devices/USB/VUSBInternal.h
@@ -28,6 +28,7 @@
 #include <VBox/vusb.h>
 #include <VBox/vmm/stam.h>
 #include <iprt/assert.h>
+#include <iprt/queueatomic.h>
 
 RT_C_DECLS_BEGIN
 
@@ -121,7 +122,7 @@ typedef struct vusb_pipe
     /** Pointer to the extra state data required to run a control pipe. */
     PVUSBCTRLEXTRA      pCtrl;
     /** Count of active async transfers. */
-    uint8_t             async;
+    volatile uint32_t   async;
     /** The periodic read-ahead buffer thread. */
     RTTHREAD            ReadAheadThread;
     /** Pointer to the reset thread arguments. */
@@ -213,6 +214,18 @@ typedef struct VUSBDEV
     void               *pvResetArgs;
     /** The reset timer handle. */
     PTMTIMER            pResetTimer;
+    /** URB submit and reap thread. */
+    RTTHREAD            hUrbIoThread;
+    /** Queue of URBs to submit. */
+    RTQUEUEATOMIC       QueueUrb;
+    /** Flag whether the URB I/O thread should terminate. */
+    bool volatile       fTerminate;
+    /** Flag whether the I/O thread was woken up. */
+    bool volatile       fWokenUp;
+#if HC_ARCH_BITS == 32
+    /** Align the size to a 8 byte boundary. */
+    bool                afAlignment0[3];
+#endif
 } VUSBDEV;
 
 
@@ -428,9 +441,15 @@ typedef enum CANCELMODE
 int  vusbUrbSubmit(PVUSBURB pUrb);
 void vusbUrbTrace(PVUSBURB pUrb, const char *pszMsg, bool fComplete);
 void vusbUrbDoReapAsync(PVUSBURB pHead, RTMSINTERVAL cMillies);
+void vusbUrbDoReapAsyncDev(PVUSBDEV pDev, RTMSINTERVAL cMillies);
 void vusbUrbCancel(PVUSBURB pUrb, CANCELMODE mode);
 void vusbUrbRipe(PVUSBURB pUrb);
 void vusbUrbCompletionRh(PVUSBURB pUrb);
+int vusbUrbSubmitHardError(PVUSBURB pUrb);
+int vusbUrbErrorRh(PVUSBURB pUrb);
+int vusbDevUrbIoThreadWakeup(PVUSBDEV pDev);
+int vusbDevUrbIoThreadCreate(PVUSBDEV pDev);
+int vusbDevUrbIoThreadDestroy(PVUSBDEV pDev);
 
 void vusbUrbCompletionReadAhead(PVUSBURB pUrb);
 void vusbReadAheadStart(PVUSBDEV pDev, PVUSBPIPE pPipe);
@@ -442,11 +461,15 @@ PVUSBURB vusbRhNewUrb(PVUSBROOTHUB pRh, uint8_t DstAddress, uint32_t cbData, uin
 
 DECLINLINE(void) vusbUrbUnlink(PVUSBURB pUrb)
 {
+    PVUSBROOTHUB pRh = vusbDevGetRh(pUrb->VUsb.pDev);
+
+    RTCritSectEnter(&pRh->CritSect);
     *pUrb->VUsb.ppPrev = pUrb->VUsb.pNext;
     if (pUrb->VUsb.pNext)
         pUrb->VUsb.pNext->VUsb.ppPrev = pUrb->VUsb.ppPrev;
     pUrb->VUsb.pNext = NULL;
     pUrb->VUsb.ppPrev = NULL;
+    RTCritSectLeave(&pRh->CritSect);
 }
 
 /** @def vusbUrbAssert
diff --git a/src/VBox/Devices/USB/VUSBUrb.cpp b/src/VBox/Devices/USB/VUSBUrb.cpp
index bda2d1e..b6b3a00 100644
--- a/src/VBox/Devices/USB/VUSBUrb.cpp
+++ b/src/VBox/Devices/USB/VUSBUrb.cpp
@@ -985,7 +985,7 @@ static void vusbMsgCompletion(PVUSBURB pUrb)
  * @returns false if it should be completed with failure.
  * @param   pUrb    The URB in question.
  */
-static int vusbUrbErrorRh(PVUSBURB pUrb)
+int vusbUrbErrorRh(PVUSBURB pUrb)
 {
     PVUSBDEV pDev = pUrb->VUsb.pDev;
     PVUSBROOTHUB pRh = vusbDevGetRh(pDev);
@@ -1204,14 +1204,7 @@ int vusbUrbQueueAsyncRh(PVUSBURB pUrb)
         return VERR_OBJECT_DESTROYED;
     }
 
-    int rc = pUrb->pUsbIns->pReg->pfnUrbQueue(pUrb->pUsbIns, pUrb);
-    if (RT_FAILURE(rc))
-    {
-        LogFlow(("%s: vusbUrbQueueAsyncRh: returns %Rrc (queue_urb)\n", pUrb->pszDesc, rc));
-        return rc;
-    }
-
-    pDev->aPipes[pUrb->EndPt].async++;
+    ASMAtomicIncU32(&pDev->aPipes[pUrb->EndPt].async);
 
     /* Queue the pUrb on the roothub */
     RTCritSectEnter(&pRh->CritSect);
@@ -1222,7 +1215,10 @@ int vusbUrbQueueAsyncRh(PVUSBURB pUrb)
     pUrb->VUsb.ppPrev = &pRh->pAsyncUrbHead;
     RTCritSectLeave(&pRh->CritSect);
 
-    return rc;
+    RTQueueAtomicInsert(&pDev->QueueUrb, &pUrb->Dev.QueueItem);
+    vusbDevUrbIoThreadWakeup(pDev);
+
+    return VINF_SUCCESS;
 }
 
 
@@ -1798,7 +1794,7 @@ static int vusbUrbSubmitIsochronous(PVUSBURB pUrb)
  * @return VINF_SUCCESS (the Urb status indicates the error).
  * @param   pUrb    The URB.
  */
-static int vusbUrbSubmitHardError(PVUSBURB pUrb)
+int vusbUrbSubmitHardError(PVUSBURB pUrb)
 {
     /* FIXME: Find out the correct return code from the spec */
     pUrb->enmState = VUSBURBSTATE_REAPED;
@@ -1926,7 +1922,7 @@ int vusbUrbSubmit(PVUSBURB pUrb)
      * makes sure we don't halt bulk endpoints at the wrong time.
      */
     else if (   RT_FAILURE(rc)
-             && !pDev->aPipes[pUrb->EndPt].async
+             && !ASMAtomicReadU32(&pDev->aPipes[pUrb->EndPt].async)
              /* && pUrb->enmType == VUSBXFERTYPE_BULK ?? */
              && !vusbUrbErrorRh(pUrb))
     {
@@ -1985,6 +1981,41 @@ void vusbUrbDoReapAsync(PVUSBURB pHead, RTMSINTERVAL cMillies)
     }
 }
 
+/**
+ * Reap URBs on a per device level.
+ *
+ * @returns nothing.
+ * @param   pDev        The device instance to reap URBs for.
+ * @param   cMillies    Number of milliseconds to block in each reap operation.
+ *                      Use 0 to not block at all.
+ */
+void vusbUrbDoReapAsyncDev(PVUSBDEV pDev, RTMSINTERVAL cMillies)
+{
+    Assert(pDev->enmState != VUSB_DEVICE_STATE_RESET);
+
+    /*
+     * Reap most URBs pending on a single device.
+     */
+    PVUSBURB pRipe;
+
+    /**
+     * This is workaround for race(should be fixed) detach on one EMT thread and frame boundary timer on other
+     * and leaked URBs (shouldn't be affected by leaked URBs).
+     */
+
+    if (ASMAtomicXchgBool(&pDev->fWokenUp, false))
+        return;
+
+    Assert(pDev->pUsbIns);
+    while (   pDev->pUsbIns
+           && ((pRipe = pDev->pUsbIns->pReg->pfnUrbReap(pDev->pUsbIns, cMillies)) != NULL))
+    {
+        vusbUrbAssert(pRipe);
+        vusbUrbRipe(pRipe);
+        if (ASMAtomicXchgBool(&pDev->fWokenUp, false))
+            break;
+    }
+}
 
 /**
  * Completes the URB.
@@ -1992,7 +2023,7 @@ void vusbUrbDoReapAsync(PVUSBURB pHead, RTMSINTERVAL cMillies)
 static void vusbUrbCompletion(PVUSBURB pUrb)
 {
     Assert(pUrb->VUsb.pDev->aPipes);
-    pUrb->VUsb.pDev->aPipes[pUrb->EndPt].async--;
+    ASMAtomicDecU32(&pUrb->VUsb.pDev->aPipes[pUrb->EndPt].async);
 
     if (pUrb->enmState == VUSBURBSTATE_REAPED)
         vusbUrbUnlink(pUrb);
diff --git a/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp b/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
index e8f1a76..a2dee18 100644
--- a/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
+++ b/src/VBox/Devices/USB/darwin/USBProxyDevice-darwin.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -219,7 +219,7 @@ typedef struct USBPROXYDEVOSX
     CFRunLoopSourceRef      RunLoopSrcRef;
     /** we want to add and remove RunLoopSourceRefs to run loop's of
      * every EMT thread participated in USB processing. */
-    RTLISTANCHOR        HeadOfRunLoopLst;
+    RTLISTANCHOR            HeadOfRunLoopLst;
     /** Pointer to the proxy device instance. */
     PUSBPROXYDEV            pProxyDev;
 
@@ -240,6 +240,14 @@ typedef struct USBPROXYDEVOSX
     PUSBPROXYURBOSX         pTaxingHead;
     /** The tail of the landed Darwin URBs. */
     PUSBPROXYURBOSX         pTaxingTail;
+    /* Runloop source for waking up the reaper thread. */
+    CFRunLoopSourceRef      hRunLoopSrcWakeRef;
+    /** List of threads used for reaping which can be woken up. */
+    RTLISTANCHOR            HeadOfRunLoopWakeLst;
+    /** Runloop reference of the thread reaping. */
+    volatile CFRunLoopRef   hRunLoopReaping;
+    /** Flag whether the reaping thread is about the be waked. */
+    volatile bool           fReapingThreadWake;
 } USBPROXYDEVOSX, *PUSBPROXYDEVOSX;
 
 
@@ -1061,6 +1069,11 @@ static bool usbProxyDarwinDictGetU64(CFMutableDictionaryRef DictRef, CFStringRef
 }
 
 
+static DECLCALLBACK(void) usbProxyDarwinPerformWakeup(void *pInfo)
+{
+    return;
+}
+
 /* -=-=-=-=-=- The exported methods -=-=-=-=-=- */
 
 
@@ -1074,7 +1087,7 @@ static bool usbProxyDarwinDictGetU64(CFMutableDictionaryRef DictRef, CFStringRef
  *                          it's sequences of "[l|s]=<value>" separated by ";".
  * @param   pvBackend       Backend specific pointer, unused for the Darwin backend.
  */
-static int usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
+static DECLCALLBACK(int) usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
 {
     int vrc;
     LogFlow(("usbProxyDarwinOpen: pProxyDev=%p pszAddress=%s\n", pProxyDev, pszAddress));
@@ -1085,6 +1098,8 @@ static int usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, vo
     vrc = RTOnce(&g_usbProxyDarwinOnce, usbProxyDarwinInitOnce, NULL);
     AssertRCReturn(vrc, vrc);
 
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
+
     /*
      * The idea here was to create a matching directory with the sessionID
      * and locationID included, however this doesn't seem to work. So, we'll
@@ -1218,65 +1233,78 @@ static int usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, vo
             if (irc == kIOReturnSuccess)
             {
                 /*
-                 * Create a proxy device instance.
+                 * Init a proxy device instance.
                  */
-                vrc = VERR_NO_MEMORY;
-                PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)RTMemAllocZ(sizeof(*pDevOsX));
-                if (pDevOsX)
+                RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
+                vrc = RTCritSectInit(&pDevOsX->CritSect);
+                if (RT_SUCCESS(vrc))
                 {
-                    RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopLst);
-                    vrc = RTCritSectInit(&pDevOsX->CritSect);
+                    pDevOsX->USBDevice = USBDevice;
+                    pDevOsX->ppDevI = ppDevI;
+                    pDevOsX->pProxyDev = pProxyDev;
+
+                    /*
+                     * Try seize all the interface.
+                     */
+                    char *pszDummyName = pProxyDev->pUsbIns->pszName;
+                    pProxyDev->pUsbIns->pszName = (char *)pszAddress;
+                    vrc = usbProxyDarwinSeizeAllInterfaces(pDevOsX, false /* give up on failure */);
+                    pProxyDev->pUsbIns->pszName = pszDummyName;
                     if (RT_SUCCESS(vrc))
                     {
-                        pDevOsX->USBDevice = USBDevice;
-                        pDevOsX->ppDevI = ppDevI;
-                        pDevOsX->pProxyDev = pProxyDev;
-
                         /*
-                         * Try seize all the interface.
+                         * Create the async event source and add it to the run loop.
                          */
-                        char *pszDummyName = pProxyDev->pUsbIns->pszName;
-                        pProxyDev->pUsbIns->pszName = (char *)pszAddress;
-                        vrc = usbProxyDarwinSeizeAllInterfaces(pDevOsX, false /* give up on failure */);
-                        pProxyDev->pUsbIns->pszName = pszDummyName;
-                        if (RT_SUCCESS(vrc))
+                        irc = (*ppDevI)->CreateDeviceAsyncEventSource(ppDevI, &pDevOsX->RunLoopSrcRef);
+                        if (irc == kIOReturnSuccess)
                         {
                             /*
-                             * Create the async event source and add it to the run loop.
+                             * Determine the active configuration.
+                             * Can cause hangs, so drop it for now.
                              */
-                            irc = (*ppDevI)->CreateDeviceAsyncEventSource(ppDevI, &pDevOsX->RunLoopSrcRef);
-                            if (irc == kIOReturnSuccess)
+                            /** @todo test Palm. */
+                            //uint8_t u8Cfg;
+                            //irc = (*ppDevI)->GetConfiguration(ppDevI, &u8Cfg);
+                            if (irc != kIOReturnNoDevice)
                             {
-                                /*
-                                 * Determine the active configuration.
-                                 * Can cause hangs, so drop it for now.
-                                 */
-                                /** @todo test Palm. */
-                                //uint8_t u8Cfg;
-                                //irc = (*ppDevI)->GetConfiguration(ppDevI, &u8Cfg);
-                                if (irc != kIOReturnNoDevice)
+                                CFRunLoopSourceContext CtxRunLoopSource;
+                                CtxRunLoopSource.version = 0;
+                                CtxRunLoopSource.info = NULL;
+                                CtxRunLoopSource.retain = NULL;
+                                CtxRunLoopSource.release = NULL;
+                                CtxRunLoopSource.copyDescription = NULL;
+                                CtxRunLoopSource.equal = NULL;
+                                CtxRunLoopSource.hash = NULL;
+                                CtxRunLoopSource.schedule = NULL;
+                                CtxRunLoopSource.cancel = NULL;
+                                CtxRunLoopSource.perform = usbProxyDarwinPerformWakeup;
+                                pDevOsX->hRunLoopSrcWakeRef = CFRunLoopSourceCreate(NULL, 0, &CtxRunLoopSource);
+                                if (CFRunLoopSourceIsValid(pDevOsX->hRunLoopSrcWakeRef))
                                 {
                                     //pProxyDev->iActiveCfg = irc == kIOReturnSuccess ? u8Cfg : -1;
+                                    RTListInit(&pDevOsX->HeadOfRunLoopWakeLst);
                                     pProxyDev->iActiveCfg = -1;
                                     pProxyDev->cIgnoreSetConfigs = 1;
 
-                                    pProxyDev->Backend.pv = pDevOsX;
                                     usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopLst, pDevOsX->RunLoopSrcRef);
                                     return VINF_SUCCESS;        /* return */
                                 }
-                                vrc = VERR_VUSB_DEVICE_NOT_ATTACHED;
+                                else
+                                {
+                                    LogRel(("USB: Device '%s' out of memory allocating runloop source\n", pszAddress));
+                                    vrc = VERR_NO_MEMORY;
+                                }
                             }
-                            else
-                                vrc = RTErrConvertFromDarwin(irc);
-
-                            usbProxyDarwinReleaseAllInterfaces(pDevOsX);
+                            vrc = VERR_VUSB_DEVICE_NOT_ATTACHED;
                         }
-                        /* else: already bitched */
+                        else
+                            vrc = RTErrConvertFromDarwin(irc);
 
-                        RTCritSectDelete(&pDevOsX->CritSect);
+                        usbProxyDarwinReleaseAllInterfaces(pDevOsX);
                     }
+                    /* else: already bitched */
 
-                    RTMemFree(pDevOsX);
+                    RTCritSectDelete(&pDevOsX->CritSect);
                 }
 
                 irc = (*ppDevI)->USBDeviceClose(ppDevI);
@@ -1317,13 +1345,11 @@ static int usbProxyDarwinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, vo
 /**
  * Closes the proxy device.
  */
-static void usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
 {
     LogFlow(("usbProxyDarwinClose: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
-    Assert(pDevOsX);
-    if (!pDevOsX)
-        return;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
+    AssertPtrReturnVoid(pDevOsX);
 
     /*
      * Release interfaces we've laid claim to, then reset the device
@@ -1346,6 +1372,17 @@ static void usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
         pDevOsX->RunLoopSrcRef = NULL;
     }
 
+    if (pDevOsX->hRunLoopSrcWakeRef)
+    {
+        int rc = usbProxyDarwinRemoveSourceRefFromAllRunLoops(&pDevOsX->HeadOfRunLoopWakeLst, pDevOsX->hRunLoopSrcWakeRef);
+        AssertRC(rc);
+
+        RTListInit((PRTLISTNODE)&pDevOsX->HeadOfRunLoopWakeLst);
+
+        CFRelease(pDevOsX->hRunLoopSrcWakeRef);
+        pDevOsX->hRunLoopSrcWakeRef = NULL;
+    }
+
     IOReturn irc = (*pDevOsX->ppDevI)->ResetDevice(pDevOsX->ppDevI);
 #ifndef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     if (irc == kIOReturnSuccess)
@@ -1383,9 +1420,6 @@ static void usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
         RTMemFree(pUrbOsX);
     }
 
-    RTMemFree(pDevOsX);
-    pProxyDev->Backend.pv = NULL;
-
 #ifdef VBOX_WITH_NEW_USB_CODE_ON_DARWIN
     USBLibTerm();
 #endif
@@ -1399,9 +1433,9 @@ static void usbProxyDarwinClose(PUSBPROXYDEV pProxyDev)
  * @returns VBox status code.
  * @param   pDev    The device to reset.
  */
-static int usbProxyDarwinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
+static DECLCALLBACK(int) usbProxyDarwinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
 {
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     LogFlow(("usbProxyDarwinReset: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
 
     IOReturn irc = (*pDevOsX->ppDevI)->ResetDevice(pDevOsX->ppDevI);
@@ -1437,9 +1471,9 @@ static int usbProxyDarwinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
  * @param   pProxyDev       The device instance data.
  * @param   iCfg            The configuration to set.
  */
-static int usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
+static DECLCALLBACK(int) usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
 {
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     LogFlow(("usbProxyDarwinSetConfig: pProxyDev=%s cfg=%#x\n",
              pProxyDev->pUsbIns->pszName, iCfg));
 
@@ -1447,12 +1481,12 @@ static int usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     if (irc != kIOReturnSuccess)
     {
         Log(("usbProxyDarwinSetConfig: Set configuration -> %#x\n", irc));
-        return false;
+        return RTErrConvertFromDarwin(irc);
     }
 
     usbProxyDarwinReleaseAllInterfaces(pDevOsX);
     usbProxyDarwinSeizeAllInterfaces(pDevOsX, true /* make the best out of it */);
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1462,11 +1496,11 @@ static int usbProxyDarwinSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
  * This is a stub on Darwin since we release/claim all interfaces at
  * open/reset/setconfig time.
  *
- * @returns success indicator (always true).
+ * @returns success indicator (always VINF_SUCCESS).
  */
-static int usbProxyDarwinClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxyDarwinClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1478,9 +1512,9 @@ static int usbProxyDarwinClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
  *
  * @returns success indicator.
  */
-static int usbProxyDarwinReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxyDarwinReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1489,9 +1523,9 @@ static int usbProxyDarwinReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
  *
  * @returns success indicator.
  */
-static int usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
+static DECLCALLBACK(int) usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
 {
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     IOReturn irc = kIOReturnSuccess;
     PUSBPROXYIFOSX pIf = usbProxyDarwinGetInterface(pDevOsX, iIf);
     LogFlow(("usbProxyDarwinSetInterface: pProxyDev=%s iIf=%#x iAlt=%#x iCurAlt=%#x\n",
@@ -1505,7 +1539,7 @@ static int usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
             if (irc == kIOReturnSuccess)
             {
                 usbProxyDarwinGetPipeProperties(pDevOsX, pIf);
-                return true;
+                return VINF_SUCCESS;
             }
         }
         else
@@ -1523,22 +1557,22 @@ static int usbProxyDarwinSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
             Req.pData = NULL;
             irc = (*pDevOsX->ppDevI)->DeviceRequest(pDevOsX->ppDevI, &Req);
             Log(("usbProxyDarwinSetInterface: SET_INTERFACE(%d,%d) -> irc=%#x\n", iIf, iAlt, irc));
-            return true;
+            return VINF_SUCCESS;
         }
     }
 
     LogFlow(("usbProxyDarwinSetInterface: pProxyDev=%s eiIf=%#x iAlt=%#x - failure - pIf=%p irc=%#x\n",
              pProxyDev->pUsbIns->pszName, iIf, iAlt, pIf, irc));
-    return false;
+    return RTErrConvertFromDarwin(irc);
 }
 
 
 /**
  * Clears the halted endpoint 'EndPt'.
  */
-static bool usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
+static DECLCALLBACK(int) usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
 {
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     LogFlow(("usbProxyDarwinClearHaltedEp: pProxyDev=%s EndPt=%#x\n", pProxyDev->pUsbIns->pszName, EndPt));
 
     /*
@@ -1546,7 +1580,7 @@ static bool usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int End
      * supported by the API. Just ignore it.
      */
     if (EndPt == 0)
-        return true;
+        return VINF_SUCCESS;
 
     /*
      * Find the interface/pipe combination and invoke the ClearPipeStallBothEnds
@@ -1560,23 +1594,22 @@ static bool usbProxyDarwinClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int End
     {
         irc = (*pIf->ppIfI)->ClearPipeStallBothEnds(pIf->ppIfI, u8PipeRef);
         if (irc == kIOReturnSuccess)
-            return true;
+            return VINF_SUCCESS;
         AssertMsg(irc == kIOReturnNoDevice || irc == kIOReturnNotResponding, ("irc=#x (control pipe?)\n", irc));
     }
 
     LogFlow(("usbProxyDarwinClearHaltedEp: pProxyDev=%s EndPt=%#x - failure - pIf=%p irc=%#x\n",
              pProxyDev->pUsbIns->pszName, EndPt, pIf, irc));
-    return false;
+    return RTErrConvertFromDarwin(irc);
 }
 
 
 /**
  * @copydoc USBPROXYBACK::pfnUrbQueue
  */
-static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyDarwinUrbQueue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     LogFlow(("%s: usbProxyDarwinUrbQueue: pProxyDev=%s pUrb=%p EndPt=%d cbData=%d\n",
              pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt, pUrb->cbData));
 
@@ -1594,7 +1627,7 @@ static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
         {
             LogFlow(("%s: usbProxyDarwinUrbQueue: pProxyDev=%s EndPt=%d cbData=%d - can't find interface / pipe!!!\n",
                      pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb->EndPt, pUrb->cbData));
-            return false;
+            return VERR_NOT_FOUND;
         }
 
         if (!CFRunLoopContainsSource(CFRunLoopGetCurrent(), pIf->RunLoopSrcRef, g_pRunLoopMode))
@@ -1611,7 +1644,7 @@ static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
      */
     PUSBPROXYURBOSX pUrbOsX = usbProxyDarwinUrbAlloc(pDevOsX);
     if (!pUrbOsX)
-        return false;
+        return VERR_NO_MEMORY;
 
     pUrbOsX->u64SubmitTS = RTTimeMilliTS();
     pUrbOsX->pVUsbUrb = pUrb;
@@ -1758,7 +1791,10 @@ static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
      * Success?
      */
     if (RT_LIKELY(irc == kIOReturnSuccess))
-        return true;
+    {
+        Log(("%s: usbProxyDarwinUrbQueue: success\n", pUrb->pszDesc));
+        return VINF_SUCCESS;
+    }
     switch (irc)
     {
         case kIOUSBPipeStalled:
@@ -1766,13 +1802,13 @@ static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
             usbProxyDarwinUrbAsyncComplete(pUrbOsX, kIOUSBPipeStalled, 0);
             Log(("%s: usbProxyDarwinUrbQueue: pProxyDev=%s EndPt=%d cbData=%d - failed irc=%#x! (stall)\n",
                  pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb->EndPt, pUrb->cbData, irc));
-            return true;
+            return VINF_SUCCESS;
         }
     }
 
     Log(("%s: usbProxyDarwinUrbQueue: pProxyDev=%s EndPt=%d cbData=%d - failed irc=%#x!\n",
          pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb->EndPt, pUrb->cbData, irc));
-    return false;
+    return RTErrConvertFromDarwin(irc);
 }
 
 
@@ -1784,10 +1820,25 @@ static int usbProxyDarwinUrbQueue(PVUSBURB pUrb)
  * @param   pProxyDev   The device.
  * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
  */
-static PVUSBURB usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
     PVUSBURB pUrb = NULL;
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
+    CFRunLoopRef hRunLoopRef = CFRunLoopGetCurrent();
+
+    Assert(!pDevOsX->hRunLoopReaping);
+
+    if (!CFRunLoopContainsSource(hRunLoopRef, pDevOsX->hRunLoopSrcWakeRef, g_pRunLoopMode))
+        usbProxyDarwinAddRunLoopRef(&pDevOsX->HeadOfRunLoopWakeLst, pDevOsX->hRunLoopSrcWakeRef);
+
+    ASMAtomicXchgPtr((void * volatile *)&pDevOsX->hRunLoopReaping, hRunLoopRef);
+
+    if (ASMAtomicXchgBool(&pDevOsX->fReapingThreadWake, false))
+    {
+        /* Return immediately. */
+        ASMAtomicXchgPtr((void * volatile *)&pDevOsX->hRunLoopReaping, NULL);
+        return NULL;
+    }
 
     /*
      * If we've got any in-flight URBs, excercise the runloop.
@@ -1796,10 +1847,12 @@ static PVUSBURB usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMill
         CFRunLoopRunInMode(g_pRunLoopMode, 0.0, false);
 
     if (    !pDevOsX->pTaxingHead
-        &&  cMillies
-        &&  pDevOsX->pInFlightHead)
+        &&  cMillies)
         CFRunLoopRunInMode(g_pRunLoopMode, cMillies / 1000.0, true);
 
+    ASMAtomicXchgPtr((void * volatile *)&pDevOsX->hRunLoopReaping, NULL);
+    ASMAtomicXchgBool(&pDevOsX->fReapingThreadWake, false);
+
     /*
      * Any URBs pending delivery?
      */
@@ -1824,7 +1877,8 @@ static PVUSBURB usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMill
     if (pUrb)
         LogFlowFunc(("LEAVE: %s: pProxyDev=%s returns %p\n", pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb));
     else
-        LogFlowFunc(("LEAVE: NULL pProxyDev=%s returns NULL", pProxyDev->pUsbIns->pszName));
+        LogFlowFunc(("LEAVE: NULL pProxyDev=%s returns NULL\n", pProxyDev->pUsbIns->pszName));
+
     return pUrb;
 }
 
@@ -1840,11 +1894,9 @@ static PVUSBURB usbProxyDarwinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMill
  *          the card does the URB cancelling before submitting new
  *          requests, we should probably be fine...
  */
-static void usbProxyDarwinUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyDarwinUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVOSX pDevOsX = (PUSBPROXYDEVOSX)pProxyDev->Backend.pv;
-    //PUSBPROXYURBOSX pUrbOsX = (PUSBPROXYURBOSX)pUrb->Dev.pvProxyUrb;
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
     LogFlow(("%s: usbProxyDarwinUrbCancel: pProxyDev=%s EndPt=%d\n",
              pUrb->pszDesc, pProxyDev->pUsbIns->pszName, pUrb->EndPt));
 
@@ -1865,9 +1917,36 @@ static void usbProxyDarwinUrbCancel(PVUSBURB pUrb)
             Log(("usbProxyDarwinUrbCancel: pProxyDev=%s pUrb=%p EndPt=%d - cannot find the interface / pipe!\n",
                  pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt));
     }
+
+    int rc = VINF_SUCCESS;
     if (irc != kIOReturnSuccess)
+    {
         Log(("usbProxyDarwinUrbCancel: pProxyDev=%s pUrb=%p EndPt=%d -> %#x!\n",
              pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt, irc));
+        rc = RTErrConvertFromDarwin(irc);
+    }
+
+    return rc;
+}
+
+
+static DECLCALLBACK(int) usbProxyDarwinWakeup(PUSBPROXYDEV pProxyDev)
+{
+    PUSBPROXYDEVOSX pDevOsX = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVOSX);
+
+    LogFlow(("usbProxyDarwinWakeup: pProxyDev=%p\n", pProxyDev));
+
+    ASMAtomicXchgBool(&pDevOsX->fReapingThreadWake, true);
+
+    CFRunLoopRef hRunLoopWake = (CFRunLoopRef)ASMAtomicReadPtr((void * volatile *)&pDevOsX->hRunLoopReaping);
+    if (hRunLoopWake)
+    {
+        LogFlow(("usbProxyDarwinWakeup: Waking runloop %p\n", hRunLoopWake));
+        CFRunLoopSourceSignal(pDevOsX->hRunLoopSrcWakeRef);
+        CFRunLoopWakeUp(hRunLoopWake);
+    }
+
+    return VINF_SUCCESS;
 }
 
 
@@ -1876,7 +1955,10 @@ static void usbProxyDarwinUrbCancel(PVUSBURB pUrb)
  */
 extern const USBPROXYBACK g_USBProxyDeviceHost =
 {
+    /* pszName */
     "host",
+    /* cbBackend */
+    sizeof(USBPROXYDEVOSX),
     usbProxyDarwinOpen,
     NULL,
     usbProxyDarwinClose,
@@ -1889,6 +1971,7 @@ extern const USBPROXYBACK g_USBProxyDeviceHost =
     usbProxyDarwinUrbQueue,
     usbProxyDarwinUrbCancel,
     usbProxyDarwinUrbReap,
+    usbProxyDarwinWakeup,
     0
 };
 
diff --git a/src/VBox/Devices/USB/freebsd/USBProxyDevice-freebsd.cpp b/src/VBox/Devices/USB/freebsd/USBProxyDevice-freebsd.cpp
index d1f412e..8746885 100644
--- a/src/VBox/Devices/USB/freebsd/USBProxyDevice-freebsd.cpp
+++ b/src/VBox/Devices/USB/freebsd/USBProxyDevice-freebsd.cpp
@@ -6,7 +6,7 @@
 /*
  * Includes contributions from Hans Petter Selasky
  *
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -127,7 +127,7 @@ static int usbProxyFreeBSDDoIoCtl(PUSBPROXYDEV pProxyDev, unsigned long iCmd,
                                   void *pvArg, bool fHandleNoDev)
 {
     int rc = VINF_SUCCESS;
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
 
     LogFlow(("usbProxyFreeBSDDoIoCtl: iCmd=%#x\n", iCmd));
 
@@ -158,7 +158,7 @@ static int usbProxyFreeBSDDoIoCtl(PUSBPROXYDEV pProxyDev, unsigned long iCmd,
 static int usbProxyFreeBSDFsInit(PUSBPROXYDEV pProxyDev)
 {
     struct usb_fs_init UsbFsInit;
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int rc;
 
     LogFlow(("usbProxyFreeBSDFsInit: pProxyDev=%p\n", (void *)pProxyDev));
@@ -189,7 +189,7 @@ static int usbProxyFreeBSDFsInit(PUSBPROXYDEV pProxyDev)
 static int usbProxyFreeBSDFsUnInit(PUSBPROXYDEV pProxyDev)
 {
     struct usb_fs_uninit UsbFsUninit;
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int rc;
 
     LogFlow(("usbProxyFreeBSDFsUnInit: ProxyDev=%p\n", (void *)pProxyDev));
@@ -240,7 +240,7 @@ static void usbProxyFreeBSDSetupReq(struct usb_device_request *pSetupData,
 
 static int usbProxyFreeBSDEndpointOpen(PUSBPROXYDEV pProxyDev, int Endpoint, bool fIsoc, int index)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     PUSBENDPOINTFBSD pEndpointFBSD = NULL; /* shut up gcc */
     struct usb_fs_endpoint *pXferEndpoint;
     struct usb_fs_open UsbFsOpen;
@@ -315,7 +315,7 @@ static int usbProxyFreeBSDEndpointOpen(PUSBPROXYDEV pProxyDev, int Endpoint, boo
  */
 static int usbProxyFreeBSDEndpointClose(PUSBPROXYDEV pProxyDev, int Endpoint)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     PUSBENDPOINTFBSD pEndpointFBSD = &pDevFBSD->aSwEndpoint[Endpoint];
     struct usb_fs_close UsbFsClose;
     int rc = VINF_SUCCESS;
@@ -359,13 +359,16 @@ static int usbProxyFreeBSDEndpointClose(PUSBPROXYDEV pProxyDev, int Endpoint)
  *                          not to contain the substring "//".
  * @param   pvBackend       Backend specific pointer, unused for the linux backend.
  */
-static int usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
-                               void *pvBackend)
+static DECLCALLBACK(int) usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
+                                             void *pvBackend)
 {
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int rc;
 
     LogFlow(("usbProxyFreeBSDOpen: pProxyDev=%p pszAddress=%s\n", pProxyDev, pszAddress));
 
+    NOREF(pvBackend);
+
     /*
      * Try open the device node.
      */
@@ -374,27 +377,17 @@ static int usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
     if (RT_SUCCESS(rc))
     {
         /*
-         * Allocate and initialize the linux backend data.
+         * Initialize the FreeBSD backend data.
          */
-        PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD)RTMemAllocZ(sizeof(USBPROXYDEVFBSD));
-        if (pDevFBSD)
+        pDevFBSD->hFile = hFile;
+        rc = usbProxyFreeBSDFsInit(pProxyDev);
+        if (RT_SUCCESS(rc))
         {
-            pDevFBSD->hFile = hFile;
-            pProxyDev->Backend.pv = pDevFBSD;
-
-            rc = usbProxyFreeBSDFsInit(pProxyDev);
-            if (RT_SUCCESS(rc))
-            {
-                LogFlow(("usbProxyFreeBSDOpen(%p, %s): returns successfully hFile=%RTfile iActiveCfg=%d\n",
-                         pProxyDev, pszAddress, pDevFBSD->hFile, pProxyDev->iActiveCfg));
+            LogFlow(("usbProxyFreeBSDOpen(%p, %s): returns successfully hFile=%RTfile iActiveCfg=%d\n",
+                     pProxyDev, pszAddress, pDevFBSD->hFile, pProxyDev->iActiveCfg));
 
-                return VINF_SUCCESS;
-            }
-
-            RTMemFree(pDevFBSD);
+            return VINF_SUCCESS;
         }
-        else
-            rc = VERR_NO_MEMORY;
 
         RTFileClose(hFile);
     }
@@ -404,9 +397,6 @@ static int usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
     Log(("usbProxyFreeBSDOpen(%p, %s) failed, rc=%d!\n",
          pProxyDev, pszAddress, rc));
 
-    pProxyDev->Backend.pv = NULL;
-
-    NOREF(pvBackend);
     return rc;
 }
 
@@ -418,9 +408,9 @@ static int usbProxyFreeBSDOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress,
  * @returns VINF_SUCCESS.
  * @param   pProxyDev       The proxy device.
  */
-static int usbProxyFreeBSDInit(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(int) usbProxyFreeBSDInit(PUSBPROXYDEV pProxyDev)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int rc;
 
     LogFlow(("usbProxyFreeBSDInit: pProxyDev=%s\n",
@@ -448,9 +438,9 @@ static int usbProxyFreeBSDInit(PUSBPROXYDEV pProxyDev)
 /**
  * Closes the proxy device.
  */
-static void usbProxyFreeBSDClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxyFreeBSDClose(PUSBPROXYDEV pProxyDev)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD)pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
 
     LogFlow(("usbProxyFreeBSDClose: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
 
@@ -474,9 +464,9 @@ static void usbProxyFreeBSDClose(PUSBPROXYDEV pProxyDev)
  * @returns VBox status code.
  * @param   pDev    The device to reset.
  */
-static int usbProxyFreeBSDReset(PUSBPROXYDEV pProxyDev, bool fResetOnFreeBSD)
+static DECLCALLBACK(int) usbProxyFreeBSDReset(PUSBPROXYDEV pProxyDev, bool fResetOnFreeBSD)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int iParm;
     int rc = VINF_SUCCESS;
 
@@ -531,9 +521,9 @@ done:
  * @param   pProxyDev       The device instance data.
  * @param   iCfg            The configuration to set.
  */
-static int usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
+static DECLCALLBACK(int) usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     int iCfgIndex;
     int rc;
 
@@ -546,7 +536,7 @@ static int usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     {
         LogFlow(("usbProxyFreeBSDSetInterface: Freeing kernel resources "
                  "failed failed rc=%d\n", rc));
-        return false;
+        return rc;
     }
 
     if (iCfg == 0)
@@ -567,28 +557,24 @@ static int usbProxyFreeBSDSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
         {
             LogFlow(("usbProxyFreeBSDSetConfig: configuration "
                      "%d not found\n", iCfg));
-            return false;
+            return VERR_NOT_FOUND;
         }
     }
 
     /* Set the config */
     rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_SET_CONFIG, &iCfgIndex, true);
     if (RT_FAILURE(rc))
-        return false;
+        return rc;
 
     /* Allocate kernel ressources again. */
-    rc = usbProxyFreeBSDFsInit(pProxyDev);
-    if (RT_FAILURE(rc))
-        return false;
-
-    return true;
+    return usbProxyFreeBSDFsInit(pProxyDev);
 }
 
 /**
  * Claims an interface.
  * @returns success indicator.
  */
-static int usbProxyFreeBSDClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxyFreeBSDClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
     int rc;
 
@@ -599,32 +585,24 @@ static int usbProxyFreeBSDClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
      * Try to detach kernel driver on this interface, ignore any
      * failures
      */
-    rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_IFACE_DRIVER_DETACH, &iIf, true);
+    usbProxyFreeBSDDoIoCtl(pProxyDev, USB_IFACE_DRIVER_DETACH, &iIf, true);
 
     /* Try to claim interface */
-    rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_CLAIM_INTERFACE, &iIf, true);
-    if (RT_FAILURE(rc))
-        return false;
-
-    return true;
+    return usbProxyFreeBSDDoIoCtl(pProxyDev, USB_CLAIM_INTERFACE, &iIf, true);
 }
 
 /**
  * Releases an interface.
  * @returns success indicator.
  */
-static int usbProxyFreeBSDReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxyFreeBSDReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
     int rc;
 
     LogFlow(("usbProxyFreeBSDReleaseInterface: pProxyDev=%s "
         "ifnum=%x\n", pProxyDev->pUsbIns->pszName, iIf));
 
-    rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_RELEASE_INTERFACE, &iIf, true);
-    if (RT_FAILURE(rc))
-        return false;
-
-    return true;
+    return usbProxyFreeBSDDoIoCtl(pProxyDev, USB_RELEASE_INTERFACE, &iIf, true);
 }
 
 /**
@@ -632,10 +610,9 @@ static int usbProxyFreeBSDReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
  *
  * @returns success indicator.
  */
-static int
-usbProxyFreeBSDSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
+static DECLCALLBACK(int) usbProxyFreeBSDSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
 {
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     struct usb_alt_interface UsbIntAlt;
     int rc;
 
@@ -648,7 +625,7 @@ usbProxyFreeBSDSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     {
         LogFlow(("usbProxyFreeBSDSetInterface: Freeing kernel resources "
                  "failed failed rc=%d\n", rc));
-        return false;
+        return rc;
     }
     memset(&UsbIntAlt, 0, sizeof(UsbIntAlt));
     UsbIntAlt.uai_interface_index = iIf;
@@ -659,24 +636,17 @@ usbProxyFreeBSDSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     {
         LogFlow(("usbProxyFreeBSDSetInterface: Setting interface %d %d "
                  "failed rc=%d\n", iIf, iAlt, rc));
-        return false;
+        return rc;
     }
 
-    rc = usbProxyFreeBSDFsInit(pProxyDev);
-    if (RT_FAILURE(rc))
-        return false;
-
-    return true;
+    return usbProxyFreeBSDFsInit(pProxyDev);
 }
 
 /**
  * Clears the halted endpoint 'ep_num'.
  */
-static bool usbProxyFreeBSDClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep_num)
+static DECLCALLBACK(int) usbProxyFreeBSDClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep_num)
 {
-    struct usb_ctl_request Req;
-    int rc;
-
     LogFlow(("usbProxyFreeBSDClearHaltedEp: pProxyDev=%s ep_num=%u\n",
              pProxyDev->pUsbIns->pszName, ep_num));
 
@@ -685,31 +655,27 @@ static bool usbProxyFreeBSDClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep
      * Just ignore it.
      */
     if ((ep_num & 0xF) == 0)
-        return true;
+        return VINF_SUCCESS;
 
+    struct usb_ctl_request Req;
     memset(&Req, 0, sizeof(Req));
-
     usbProxyFreeBSDSetupReq(&Req.ucr_request,
                             VUSB_DIR_TO_DEV | VUSB_TO_ENDPOINT,
                             VUSB_REQ_CLEAR_FEATURE, 0, ep_num, 0);
 
-    rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_DO_REQUEST, &Req, true);
+    int rc = usbProxyFreeBSDDoIoCtl(pProxyDev, USB_DO_REQUEST, &Req, true);
 
     LogFlow(("usbProxyFreeBSDClearHaltedEp: rc=%Rrc\n", rc));
-
-    if (RT_FAILURE(rc))
-        return false;
-
-    return true;
+    return rc;
 }
 
 /**
  * @copydoc USBPROXYBACK::pfnUrbQueue
  */
-static int usbProxyFreeBSDUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyFreeBSDUrbQueue(PVUSBURB pUrb)
 {
     PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     PUSBENDPOINTFBSD pEndpointFBSD;
     struct usb_fs_endpoint *pXferEndpoint;
     struct usb_fs_start UsbFsStart;
@@ -736,7 +702,7 @@ retry:
                                         index);
 
     if (index < 0)
-        return false;
+        return VERR_INVALID_PARAMETER;
 
     pEndpointFBSD = &pDevFBSD->aSwEndpoint[index];
     pXferEndpoint = &pDevFBSD->aHwEndpoint[index];
@@ -834,12 +800,12 @@ retry:
             index++;
             goto retry;
         }
-        return false;
+        return rc;
     }
     pUrb->Dev.pvPrivate = (void *)(long)(index + 1);
     pEndpointFBSD->pUrb = pUrb;
 
-    return true;
+    return rc;
 }
 
 /**
@@ -850,10 +816,10 @@ retry:
  * @param   pProxyDev   The device.
  * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
  */
-static PVUSBURB usbProxyFreeBSDUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxyFreeBSDUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
     struct usb_fs_endpoint *pXferEndpoint;
-    PUSBPROXYDEVFBSD pDevFBSD = (PUSBPROXYDEVFBSD) pProxyDev->Backend.pv;
+    PUSBPROXYDEVFBSD pDevFBSD = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVFBSD);
     PUSBENDPOINTFBSD pEndpointFBSD;
     PVUSBURB pUrb;
     struct usb_fs_complete UsbFsComplete;
@@ -1006,19 +972,17 @@ repeat:
  * Cancels the URB.
  * The URB requires reaping, so we don't change its state.
  */
-static void usbProxyFreeBSDUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyFreeBSDUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
     int index;
 
     index = (int)(long)pUrb->Dev.pvPrivate - 1;
 
     if (index < 0 || index >= USBFBSD_MAXENDPOINTS)
-        return;
+        return VINF_SUCCESS; /* invalid index, pretend success. */
 
     LogFlow(("usbProxyFreeBSDUrbCancel: epindex=%u\n", (unsigned)index));
-
-    usbProxyFreeBSDEndpointClose(pProxyDev, index);
+    return usbProxyFreeBSDEndpointClose(pProxyDev, index);
 }
 
 /**
@@ -1026,7 +990,10 @@ static void usbProxyFreeBSDUrbCancel(PVUSBURB pUrb)
  */
 extern const USBPROXYBACK g_USBProxyDeviceHost =
 {
+    /* pszName */
     "host",
+    /* cbBackend */
+    sizeof(PUSBPROXYDEVFBSD),
     usbProxyFreeBSDOpen,
     usbProxyFreeBSDInit,
     usbProxyFreeBSDClose,
diff --git a/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp b/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp
index a6d0852..960eead 100644
--- a/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp
+++ b/src/VBox/Devices/USB/linux/USBProxyDevice-linux.cpp
@@ -32,6 +32,7 @@
 
 #include <iprt/stdint.h>
 #include <iprt/err.h>
+#include <iprt/pipe.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -152,9 +153,13 @@ typedef struct USBPROXYDEVLNX
     PUSBPROXYURBLNX     pTaxingTail;
     /** Are we using sysfs to find the active configuration? */
     bool                fUsingSysfs;
+    /** Pipe handle for waiking up - writing end. */
+    RTPIPE              hPipeWakeupW;
+    /** Pipe handle for waiking up - reading end. */
+    RTPIPE              hPipeWakeupR;
     /** The device node/sysfs path of the device.
      * Used to figure out the configuration after a reset. */
-    char                szPath[1];
+    char                *pszPath;
 } USBPROXYDEVLNX, *PUSBPROXYDEVLNX;
 
 
@@ -188,7 +193,7 @@ static int usbProxyLinuxFindActiveConfig(PUSBPROXYDEV pProxyDev, const char *psz
 static int usbProxyLinuxDoIoCtl(PUSBPROXYDEV pProxyDev, unsigned long iCmd, void *pvArg, bool fHandleNoDev, uint32_t cTries)
 {
     int rc;
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     do
     {
         do
@@ -219,7 +224,7 @@ static int usbProxyLinuxDoIoCtl(PUSBPROXYDEV pProxyDev, unsigned long iCmd, void
  */
 static void usbProxLinuxUrbUnplugged(PUSBPROXYDEV pProxyDev)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     /*
      * Shoot down all flying URBs.
@@ -301,7 +306,7 @@ static void usbProxyLinuxSetConnected(PUSBPROXYDEV pProxyDev, int iIf, bool fCon
  */
 static PUSBPROXYURBLNX usbProxyLinuxUrbAlloc(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pSplitHead)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     PUSBPROXYURBLNX pUrbLnx;
 
     RTCritSectEnter(&pDevLnx->CritSect);
@@ -354,7 +359,7 @@ static PUSBPROXYURBLNX usbProxyLinuxUrbAlloc(PUSBPROXYDEV pProxyDev, PUSBPROXYUR
  */
 static void usbProxyLinuxUrbFree(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pUrbLnx)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     RTCritSectEnter(&pDevLnx->CritSect);
 
@@ -392,7 +397,7 @@ static void usbProxyLinuxUrbFree(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pUrbLnx
  */
 static void usbProxyLinuxUrbFreeSplitList(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pUrbLnx)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     RTCritSectEnter(&pDevLnx->CritSect);
 
@@ -579,7 +584,7 @@ static int usbProxyLinuxFindActiveConfigSysfs(PUSBPROXYDEV pProxyDev, const char
  */
 static int usbProxyLinuxFindActiveConfig(PUSBPROXYDEV pProxyDev, const char *pszPath, int *piFirstCfg)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     if (pDevLnx->fUsingSysfs)
         return usbProxyLinuxFindActiveConfigSysfs(pProxyDev, pszPath, piFirstCfg);
     return usbProxyLinuxFindActiveConfigUsbfs(pProxyDev, pszPath, piFirstCfg);
@@ -594,7 +599,7 @@ static int usbProxyLinuxFindActiveConfig(PUSBPROXYDEV pProxyDev, const char *psz
  */
 RTDECL(int) USBProxyDeviceLinuxGetFD(PUSBPROXYDEV pProxyDev)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     AssertReturn(pDevLnx->hFile != NIL_RTFILE, -1);
     return RTFileToNative(pDevLnx->hFile);
 }
@@ -612,7 +617,7 @@ RTDECL(int) USBProxyDeviceLinuxGetFD(PUSBPROXYDEV pProxyDev)
  *                          not to contain the substring "//".
  * @param   pvBackend       Backend specific pointer, unused for the linux backend.
  */
-static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
+static DECLCALLBACK(int) usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
 {
     LogFlow(("usbProxyLinuxOpen: pProxyDev=%p pszAddress=%s\n", pProxyDev, pszAddress));
     const char *pszDevNode;
@@ -631,7 +636,6 @@ static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, voi
         if (!pszDevNode)
         {
             LogRel(("usbProxyLinuxOpen: Invalid device address: '%s'\n", pszAddress));
-            pProxyDev->Backend.pv = NULL;
             return VERR_INVALID_PARAMETER;
         }
 
@@ -657,30 +661,32 @@ static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, voi
     if (RT_SUCCESS(rc))
     {
         /*
-         * Allocate and initialize the linux backend data.
+         * Initialize the linux backend data.
          */
-        PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)RTMemAllocZVar(sizeof(*pDevLnx) + cchPath);
-        if (pDevLnx)
+        PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
+        pDevLnx->pszPath = RTStrDupN(pszPath, cchPath);
+        if (pDevLnx->pszPath)
         {
-            pDevLnx->fUsingSysfs = fUsingSysfs;
-            memcpy(&pDevLnx->szPath[0], pszPath, cchPath);
-            pDevLnx->szPath[cchPath] = '\0';
-            pDevLnx->hFile = hFile;
-            rc = RTCritSectInit(&pDevLnx->CritSect);
+            rc = RTPipeCreate(&pDevLnx->hPipeWakeupR, &pDevLnx->hPipeWakeupW, 0);
             if (RT_SUCCESS(rc))
             {
-                pProxyDev->Backend.pv = pDevLnx;
-
-                LogFlow(("usbProxyLinuxOpen(%p, %s): returns successfully File=%RTfile iActiveCfg=%d\n",
-                         pProxyDev, pszAddress, pDevLnx->hFile, pProxyDev->iActiveCfg));
+                pDevLnx->fUsingSysfs = fUsingSysfs;
+                pDevLnx->hFile = hFile;
+                rc = RTCritSectInit(&pDevLnx->CritSect);
+                if (RT_SUCCESS(rc))
+                {
+                    LogFlow(("usbProxyLinuxOpen(%p, %s): returns successfully File=%RTfile iActiveCfg=%d\n",
+                             pProxyDev, pszAddress, pDevLnx->hFile, pProxyDev->iActiveCfg));
 
-                return VINF_SUCCESS;
+                    return VINF_SUCCESS;
+                }
+                RTPipeClose(pDevLnx->hPipeWakeupR);
+                RTPipeClose(pDevLnx->hPipeWakeupW);
             }
-
-            RTMemFree(pDevLnx);
         }
         else
             rc = VERR_NO_MEMORY;
+
         RTFileClose(hFile);
     }
     else if (rc == VERR_ACCESS_DENIED)
@@ -688,7 +694,6 @@ static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, voi
 
     Log(("usbProxyLinuxOpen(%p, %s) failed, rc=%s!\n", pProxyDev, pszAddress,
          RTErrGetShort(rc)));
-    pProxyDev->Backend.pv = NULL;
 
     NOREF(pvBackend);
     return rc;
@@ -702,9 +707,9 @@ static int usbProxyLinuxOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, voi
  * @returns VINF_SUCCESS.
  * @param   pProxyDev       The proxy device.
  */
-static int usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(int) usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     /*
      * Brute force rulez.
@@ -723,11 +728,11 @@ static int usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
      */
     pProxyDev->cIgnoreSetConfigs = 1;
     int iFirstCfg;
-    pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, &iFirstCfg);
+    pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, &iFirstCfg);
     if (pProxyDev->iActiveCfg == -1)
     {
         usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_SETCONFIGURATION, &iFirstCfg, false, UINT32_MAX);
-        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, NULL);
+        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, NULL);
         Log(("usbProxyLinuxInit: No active config! Tried to set %d: iActiveCfg=%d\n", iFirstCfg, pProxyDev->iActiveCfg));
     }
     else
@@ -739,13 +744,11 @@ static int usbProxyLinuxInit(PUSBPROXYDEV pProxyDev)
 /**
  * Closes the proxy device.
  */
-static void usbProxyLinuxClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxyLinuxClose(PUSBPROXYDEV pProxyDev)
 {
     LogFlow(("usbProxyLinuxClose: pProxyDev=%s\n", usbProxyGetName(pProxyDev)));
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
-    Assert(pDevLnx);
-    if (!pDevLnx)
-        return;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
+    AssertPtrReturnVoid(pDevLnx);
 
     /*
      * Try put the device in a state which linux can cope with before we release it.
@@ -814,8 +817,11 @@ static void usbProxyLinuxClose(PUSBPROXYDEV pProxyDev)
     RTFileClose(pDevLnx->hFile);
     pDevLnx->hFile = NIL_RTFILE;
 
-    RTMemFree(pDevLnx);
-    pProxyDev->Backend.pv = NULL;
+    RTPipeClose(pDevLnx->hPipeWakeupR);
+    RTPipeClose(pDevLnx->hPipeWakeupW);
+
+    RTStrFree(pDevLnx->pszPath);
+
     LogFlow(("usbProxyLinuxClose: returns\n"));
 }
 
@@ -1012,10 +1018,10 @@ static int usb_reset_logical_reconnect(PUSBPROXYDEV pDev)
  * @returns VBox status code.
  * @param   pDev    The device to reset.
  */
-static int usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
+static DECLCALLBACK(int) usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
 {
 #ifdef NO_PORT_RESET
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     /*
      * Specific device resets are NOPs.
@@ -1041,7 +1047,7 @@ static int usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
         }
 
         /* find the active config - damn annoying. */
-        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->szPath, NULL);
+        pProxyDev->iActiveCfg = usbProxyLinuxFindActiveConfig(pProxyDev, pDevLnx->pszPath, NULL);
         LogFlow(("usbProxyLinuxReset: returns successfully iActiveCfg=%d\n", pProxyDev->iActiveCfg));
     }
     pProxyDev->cIgnoreSetConfigs = 2;
@@ -1111,7 +1117,7 @@ static int usbProxyLinuxReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
  * @param   pProxyDev       The device instance data.
  * @param   iCfg            The configuration to set.
  */
-static int usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
+static DECLCALLBACK(int) usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
 {
     LogFlow(("usbProxyLinuxSetConfig: pProxyDev=%s cfg=%#x\n",
              usbProxyGetName(pProxyDev), iCfg));
@@ -1119,9 +1125,9 @@ static int usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
     if (usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_SETCONFIGURATION, &iCfg, true, UINT32_MAX))
     {
         Log(("usb-linux: Set configuration. errno=%d\n", errno));
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1129,7 +1135,7 @@ static int usbProxyLinuxSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
  * Claims an interface.
  * @returns success indicator.
  */
-static int usbProxyLinuxClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxyLinuxClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
     LogFlow(("usbProxyLinuxClaimInterface: pProxyDev=%s ifnum=%#x\n", usbProxyGetName(pProxyDev), iIf));
     usbProxyLinuxSetConnected(pProxyDev, iIf, false, false);
@@ -1137,9 +1143,9 @@ static int usbProxyLinuxClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
     if (usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_CLAIMINTERFACE, &iIf, true, UINT32_MAX))
     {
         Log(("usb-linux: Claim interface. errno=%d pProxyDev=%s\n", errno, usbProxyGetName(pProxyDev)));
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1154,9 +1160,9 @@ static int usbProxyLinuxReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
     if (usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_RELEASEINTERFACE, &iIf, true, UINT32_MAX))
     {
         Log(("usb-linux: Release interface, errno=%d. pProxyDev=%s\n", errno, usbProxyGetName(pProxyDev)));
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1175,16 +1181,16 @@ static int usbProxyLinuxSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
     if (usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_SETINTERFACE, &SetIf, true, UINT32_MAX))
     {
         Log(("usb-linux: Set interface, errno=%d. pProxyDev=%s\n", errno, usbProxyGetName(pProxyDev)));
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 
 /**
  * Clears the halted endpoint 'EndPt'.
  */
-static bool usbProxyLinuxClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
+static int usbProxyLinuxClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
 {
     LogFlow(("usbProxyLinuxClearHaltedEp: pProxyDev=%s EndPt=%u\n", usbProxyGetName(pProxyDev), EndPt));
 
@@ -1199,13 +1205,13 @@ static bool usbProxyLinuxClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndP
         {
             Log(("usb-linux: clear_halted_ep failed errno=%d. pProxyDev=%s ep=%d - IGNORED\n",
                  errno, usbProxyGetName(pProxyDev), EndPt));
-            return true;
+            return VINF_SUCCESS;
         }
         Log(("usb-linux: clear_halted_ep failed errno=%d. pProxyDev=%s ep=%d\n",
              errno, usbProxyGetName(pProxyDev), EndPt));
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -1270,11 +1276,12 @@ static void usbProxyLinuxCleanupFailedSubmit(PUSBPROXYDEV pProxyDev, PUSBPROXYUR
  * Submit one URB through the usbfs IOCTL interface, with
  * retries
  *
- * @returns true / false.
+ * @returns VBox status code.
  */
-static bool usbProxyLinuxSubmitURB(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pCur, PVUSBURB pUrb, bool *pfUnplugged)
+static int usbProxyLinuxSubmitURB(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pCur, PVUSBURB pUrb, bool *pfUnplugged)
 {
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    int rc = VINF_SUCCESS;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     unsigned        cTries = 0;
 
     while (ioctl(RTFileToNative(pDevLnx->hFile), USBDEVFS_SUBMITURB, &pCur->KUrb))
@@ -1285,7 +1292,7 @@ static bool usbProxyLinuxSubmitURB(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pCur,
         {
             Log(("usbProxyLinuxSubmitURB: ENODEV -> unplugged. pProxyDev=%s\n", usbProxyGetName(pProxyDev)));
             *pfUnplugged = true;
-            return false;
+            return RTErrConvertFromErrno(errno);
         }
 
         Log(("usb-linux: Submit URB %p -> %d!!! type=%d ep=%#x buffer_length=%#x cTries=%d\n",
@@ -1295,9 +1302,9 @@ static bool usbProxyLinuxSubmitURB(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pCur,
             pCur->u64SubmitTS = RTTimeMilliTS();
             continue;
         }
-        return false;
+        return RTErrConvertFromErrno(errno);
     }
-    return true;
+    return VINF_SUCCESS;
 }
 
 /** The split size. 16K in known Linux kernel versions. */
@@ -1346,7 +1353,7 @@ static PUSBPROXYURBLNX usbProxyLinuxSplitURBFragment(PUSBPROXYDEV pProxyDev, PUS
  * fragment URBs might be filled. We can only safely set up one
  * URB at a time -> worse performance but correct behaviour.
  *
- * @returns true / false.
+ * @returns VBox status code.
  * @param   pProxyDev   The proxy device.
  * @param   pUrbLnx     The linux URB which was rejected because of being too big.
  * @param   pUrb        The VUSB URB.
@@ -1372,7 +1379,7 @@ static int usbProxyLinuxUrbQueueSplit(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pU
         case VUSBXFERTYPE_ISOC:
             AssertMsgFailed(("We can't split isochronous URBs!\n"));
             usbProxyLinuxUrbFree(pProxyDev, pUrbLnx);
-            return false;
+            return VERR_INVALID_PARAMETER; /** @todo: Better status code. */
     }
     pUrbLnx->KUrb.endpoint          = pUrb->EndPt;
     if (pUrb->enmDir == VUSBDIRECTION_IN)
@@ -1395,17 +1402,16 @@ static int usbProxyLinuxUrbQueueSplit(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pU
     cbLeft -= pUrbLnx->KUrb.buffer_length;
     pUrbLnx->cbSplitRemaining = cbLeft;
 
-    bool fSucceeded = false;
+    int rc = VINF_SUCCESS;
     bool fUnplugged = false;
     if (pUrb->enmDir == VUSBDIRECTION_IN && !pUrb->fShortNotOk)
     {
         /* Subsequent fragments will be queued only after the previous fragment is reaped
          * and only if necessary.
          */
-        fSucceeded = true;
         Log(("usb-linux: Large ShortOK read, only queuing first fragment.\n"));
         Assert(pUrbLnx->cbSplitRemaining > 0 && pUrbLnx->cbSplitRemaining < 256 * _1K);
-        fSucceeded = usbProxyLinuxSubmitURB(pProxyDev, pUrbLnx, pUrb, &fUnplugged);
+        rc = usbProxyLinuxSubmitURB(pProxyDev, pUrbLnx, pUrb, &fUnplugged);
     }
     else
     {
@@ -1415,9 +1421,7 @@ static int usbProxyLinuxUrbQueueSplit(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pU
         {
             pCur = usbProxyLinuxSplitURBFragment(pProxyDev, pUrbLnx, pCur);
             if (!pCur)
-            {
-                return false;
-            }
+                return VERR_NO_MEMORY;
         }
         Assert(pCur->cbSplitRemaining == 0);
 
@@ -1425,36 +1429,32 @@ static int usbProxyLinuxUrbQueueSplit(PUSBPROXYDEV pProxyDev, PUSBPROXYURBLNX pU
         pCur = pUrbLnx;
         for (i = 0; i < cKUrbs; i++, pCur = pCur->pSplitNext)
         {
-            fSucceeded = usbProxyLinuxSubmitURB(pProxyDev, pCur, pUrb, &fUnplugged);
-            if (!fSucceeded)
+            rc = usbProxyLinuxSubmitURB(pProxyDev, pCur, pUrb, &fUnplugged);
+            if (RT_FAILURE(rc))
                 break;
         }
     }
 
-    if (fSucceeded)
+    if (RT_SUCCESS(rc))
     {
         pUrb->Dev.pvPrivate = pUrbLnx;
         LogFlow(("usbProxyLinuxUrbQueueSplit: ok\n"));
-        return true;
+        return VINF_SUCCESS;
     }
 
     usbProxyLinuxCleanupFailedSubmit(pProxyDev, pUrbLnx, pCur, pUrb, &fUnplugged);
-    return false;
+    return rc;
 }
 
 
 /**
  * @copydoc USBPROXYBACK::pfnUrbQueue
  */
-static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyLinuxUrbQueue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
+    int             rc = VINF_SUCCESS;
     unsigned        cTries;
-#ifndef RDESKTOP
-    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-#else
-    PUSBPROXYDEV    pProxyDev = usbProxyFromVusbDev(pUrb->pDev);
-#endif
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
     LogFlow(("usbProxyLinuxUrbQueue: pProxyDev=%s pUrb=%p EndPt=%d cbData=%d\n",
              usbProxyGetName(pProxyDev), pUrb, pUrb->EndPt, pUrb->cbData));
 
@@ -1463,7 +1463,7 @@ static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
      */
     PUSBPROXYURBLNX pUrbLnx = usbProxyLinuxUrbAlloc(pProxyDev, NULL);
     if (!pUrbLnx)
-        return false;
+        return VERR_NO_MEMORY;
 
     pUrbLnx->KUrb.endpoint          = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0);
     pUrbLnx->KUrb.status            = 0;
@@ -1484,7 +1484,7 @@ static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
             if (pUrb->cbData < sizeof(VUSBSETUP))
             {
                 usbProxyLinuxUrbFree(pProxyDev, pUrbLnx);
-                return false;
+                return VERR_BUFFER_UNDERFLOW;
             }
             usbProxyLinuxUrbSwapSetup((PVUSBSETUP)pUrb->abData);
             LogFlow(("usbProxyLinuxUrbQueue: message\n"));
@@ -1508,7 +1508,7 @@ static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
             pUrbLnx->KUrb.type = USBDEVFS_URB_TYPE_INTERRUPT;
             break;
         default:
-            goto l_err;
+            rc = VERR_INVALID_PARAMETER; /** @todo: better status code. */
     }
 
     /*
@@ -1527,7 +1527,7 @@ static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
             usbProxyLinuxUrbFree(pProxyDev, pUrbLnx);
 
             usbProxLinuxUrbUnplugged(pProxyDev);
-            return false;
+            return RTErrConvertFromErrno(errno);
         }
 
         /*
@@ -1546,17 +1546,20 @@ static int usbProxyLinuxUrbQueue(PVUSBURB pUrb)
              pUrb, errno, pUrbLnx->KUrb.type, pUrbLnx->KUrb.endpoint, pUrbLnx->KUrb.buffer_length, cTries));
         if (errno != EBUSY && ++cTries < 3) /* this doesn't work for the floppy :/ */
             continue;
+
+        rc = RTErrConvertFromErrno(errno);
+
 l_err:
         if (pUrb->enmType == VUSBXFERTYPE_MSG)
             usbProxyLinuxUrbSwapSetup((PVUSBSETUP)pUrb->abData);
         usbProxyLinuxUrbFree(pProxyDev, pUrbLnx);
-        return false;
+        return rc;
     }
     pUrbLnx->u64SubmitTS = RTTimeMilliTS();
 
     LogFlow(("usbProxyLinuxUrbQueue: ok\n"));
     pUrb->Dev.pvPrivate = pUrbLnx;
-    return true;
+    return rc;
 }
 
 
@@ -1706,10 +1709,10 @@ static VUSBSTATUS vusbProxyLinuxUrbGetStatus(PUSBPROXYURBLNX pUrbLnx)
  * @param   pProxyDev   The device.
  * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
  */
-static PVUSBURB usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
     PUSBPROXYURBLNX pUrbLnx = NULL;
-    PUSBPROXYDEVLNX pDevLnx = (PUSBPROXYDEVLNX)pProxyDev->Backend.pv;
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
 
     /*
      * Any URBs pending delivery?
@@ -1744,7 +1747,28 @@ static PVUSBURB usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMilli
          * Don't block if nothing is in the air.
          */
         if (!pDevLnx->pInFlightHead)
+        {
+            int cMilliesWait = cMillies == RT_INDEFINITE_WAIT ? -1 : cMillies;
+
+            LogFlow(("Nothing in flight, going to sleep\n"));
+
+            struct pollfd pfd;
+
+            pfd.fd = RTPipeToNative(pDevLnx->hPipeWakeupR);
+            pfd.events = POLLIN | POLLHUP;
+            pfd.revents = 0;
+
+            int rc = poll(&pfd, 1, cMilliesWait);
+            Log(("usbProxyLinuxUrbReap: poll rc = %d\n", rc));
+            if (rc >= 1)
+            {
+                /* Drain pipe. */
+               uint8_t bRead;
+               size_t cbIgnored = 0;
+               RTPipeRead(pDevLnx->hPipeWakeupR, &bRead, 1, &cbIgnored);
+            }
             return NULL;
+        }
 
         /*
          * Block for requested period.
@@ -1755,18 +1779,33 @@ static PVUSBURB usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMilli
          */
         if (cMillies)
         {
+            int cMilliesWait = cMillies == RT_INDEFINITE_WAIT ? -1 : cMillies;
 
             for (;;)
             {
-                struct pollfd pfd;
-                pfd.fd = RTFileToNative(pDevLnx->hFile);
-                pfd.events = POLLOUT | POLLWRNORM /* completed async */
-                           | POLLERR | POLLHUP    /* disconnected */;
-                pfd.revents = 0;
-                int rc = poll(&pfd, 1, cMillies);
+                struct pollfd pfd[2];
+                pfd[0].fd = RTFileToNative(pDevLnx->hFile);
+                pfd[0].events = POLLOUT | POLLWRNORM /* completed async */
+                              | POLLERR | POLLHUP    /* disconnected */;
+                pfd[0].revents = 0;
+
+                pfd[1].fd = RTPipeToNative(pDevLnx->hPipeWakeupR);
+                pfd[1].events = POLLIN | POLLHUP;
+                pfd[1].revents = 0;
+
+                int rc = poll(&pfd[0], 2, cMilliesWait);
                 Log(("usbProxyLinuxUrbReap: poll rc = %d\n", rc));
                 if (rc >= 1)
+                {
+                    /* If the pipe caused the return drain it. */
+                    if (pfd[1].revents & POLLIN)
+                    {
+                        uint8_t bRead;
+                        size_t cbIgnored = 0;
+                        RTPipeRead(pDevLnx->hPipeWakeupR, &bRead, 1, &cbIgnored);
+                    }
                     break;
+                }
                 if (rc >= 0 /*|| errno == ETIMEOUT*/)
                 {
                     vusbProxyLinuxUrbDoTimeouts(pProxyDev, pDevLnx);
@@ -1908,13 +1947,9 @@ static PVUSBURB usbProxyLinuxUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMilli
  * Cancels the URB.
  * The URB requires reaping, so we don't change its state.
  */
-static void usbProxyLinuxUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyLinuxUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-#ifndef RDESKTOP
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-#else
-    PUSBPROXYDEV pProxyDev = usbProxyFromVusbDev(pUrb->pDev);
-#endif
+    int rc = VINF_SUCCESS;
     PUSBPROXYURBLNX pUrbLnx = (PUSBPROXYURBLNX)pUrb->Dev.pvPrivate;
     if (pUrbLnx->pSplitHead)
     {
@@ -1930,6 +1965,7 @@ static void usbProxyLinuxUrbCancel(PVUSBURB pUrb)
                 continue;
             if (errno == ENODEV)
                 break;
+            /** @todo: Think about how to handle errors wrt. to the status code. */
             Log(("usb-linux: Discard URB %p failed, errno=%d. pProxyDev=%s!!! (split)\n",
                  pUrb, errno, usbProxyGetName(pProxyDev)));
         }
@@ -1940,18 +1976,36 @@ static void usbProxyLinuxUrbCancel(PVUSBURB pUrb)
         if (    usbProxyLinuxDoIoCtl(pProxyDev, USBDEVFS_DISCARDURB, &pUrbLnx->KUrb, true, UINT32_MAX)
             &&  errno != ENODEV /* deal with elsewhere. */
             &&  errno != ENOENT)
+        {
             Log(("usb-linux: Discard URB %p failed, errno=%d. pProxyDev=%s!!!\n",
                  pUrb, errno, usbProxyGetName(pProxyDev)));
+            rc = RTErrConvertFromErrno(errno);
+        }
     }
+
+    return rc;
 }
 
 
+static DECLCALLBACK(int) usbProxyLinuxWakeup(PUSBPROXYDEV pProxyDev)
+{
+    PUSBPROXYDEVLNX pDevLnx = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVLNX);
+    size_t cbIgnored;
+
+    LogFlowFunc(("pProxyDev=%p\n", pProxyDev));
+
+    return RTPipeWrite(pDevLnx->hPipeWakeupW, "", 1, &cbIgnored);
+}
+
 /**
  * The Linux USB Proxy Backend.
  */
 const USBPROXYBACK g_USBProxyDeviceHost =
 {
+    /* pszName */
     "host",
+    /* cbBackend */
+    sizeof(USBPROXYDEVLNX),
     usbProxyLinuxOpen,
     usbProxyLinuxInit,
     usbProxyLinuxClose,
@@ -1964,6 +2018,7 @@ const USBPROXYBACK g_USBProxyDeviceHost =
     usbProxyLinuxUrbQueue,
     usbProxyLinuxUrbCancel,
     usbProxyLinuxUrbReap,
+    usbProxyLinuxWakeup,
     0
 };
 
diff --git a/src/VBox/Devices/USB/solaris/USBProxyDevice-solaris.cpp b/src/VBox/Devices/USB/solaris/USBProxyDevice-solaris.cpp
index 8511aa6..48784a7 100644
--- a/src/VBox/Devices/USB/solaris/USBProxyDevice-solaris.cpp
+++ b/src/VBox/Devices/USB/solaris/USBProxyDevice-solaris.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2009-2013 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -37,6 +37,7 @@
 #include <iprt/time.h>
 #include <iprt/file.h>
 #include <iprt/mem.h>
+#include <iprt/pipe.h>
 #include "../USBProxyDevice.h"
 #include <VBox/usblib.h>
 
@@ -90,9 +91,13 @@ typedef struct USBPROXYDEVSOL
     PUSBPROXYURBSOL                pTaxingHead;
     /** The tail of the landed solaris URBs. */
     PUSBPROXYURBSOL                pTaxingTail;
+    /** Pipe handle for waking up - writing end. */
+    RTPIPE                         hPipeWakeupW;
+    /** Pipe handle for waking up - reading end. */
+    RTPIPE                         hPipeWakeupR;
 } USBPROXYDEVSOL, *PUSBPROXYDEVSOL;
 
-PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol);
+static PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol);
 
 
 /**
@@ -282,8 +287,10 @@ static inline int usbProxySolarisGetActiveConfig(PUSBPROXYDEVSOL pDevSol)
  *                          The format of this string is "VendorId:ProducIt:Release:StaticPath".
  * @param   pvBackend       Backend specific pointer, unused for the solaris backend.
  */
-static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
+static DECLCALLBACK(int) usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
 {
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
+
     LogFlowFunc((USBPROXY ":usbProxySolarisOpen pProxyDev=%p pszAddress=%s pvBackend=%p\n", pProxyDev, pszAddress, pvBackend));
 
     /*
@@ -295,19 +302,20 @@ static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, v
         /*
          * Allocate and initialize the solaris backend data.
          */
-        PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)RTMemAllocZ(sizeof(*pDevSol));
-        if (RT_LIKELY(pDevSol))
+        AssertCompile(PATH_MAX >= MAXPATHLEN);
+        char szDeviceIdent[PATH_MAX+48];
+        rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
+        if (RT_SUCCESS(rc))
         {
-            AssertCompile(PATH_MAX >= MAXPATHLEN);
-            char szDeviceIdent[PATH_MAX+48];
-            rc = RTStrPrintf(szDeviceIdent, sizeof(szDeviceIdent), "%s", pszAddress);
+            rc = RTCritSectInit(&pDevSol->CritSect);
             if (RT_SUCCESS(rc))
             {
-                rc = RTCritSectInit(&pDevSol->CritSect);
+                /*
+                 * Create wakeup pipe.
+                 */
+                rc = RTPipeCreate(&pDevSol->hPipeWakeupR, &pDevSol->hPipeWakeupW, 0);
                 if (RT_SUCCESS(rc))
                 {
-                    pProxyDev->Backend.pv = pDevSol;
-
                     int Instance;
                     char *pszDevicePath = NULL;
                     rc = USBLibGetClientInfo(szDeviceIdent, &pszDevicePath, &Instance);
@@ -350,9 +358,7 @@ static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, v
                                 }
                             }
                             else
-                            {
                                 LogRel((USBPROXY ":failed to query driver version. rc=%Rrc\n", rc));
-                            }
 
                             RTFileClose(pDevSol->hFile);
                             pDevSol->hFile = NIL_RTFILE;
@@ -370,26 +376,22 @@ static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, v
                         if (rc == VERR_NOT_FOUND)
                             rc = VERR_OPEN_FAILED;
                     }
-
-                    RTCritSectDelete(&pDevSol->CritSect);
+                    RTPipeClose(pDevSol->hPipeWakeupR);
+                    RTPipeClose(pDevSol->hPipeWakeupW);
                 }
-                else
-                    LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
+
+                RTCritSectDelete(&pDevSol->CritSect);
             }
             else
-                LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
-
-            RTMemFree(pDevSol);
-            pDevSol = NULL;
+                LogRel((USBPROXY ":RTCritSectInit failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
         }
         else
-            rc = VERR_NO_MEMORY;
+            LogRel((USBPROXY ":RTStrAPrintf failed. rc=%Rrc pszAddress=%s\n", rc, pszAddress));
     }
     else
         LogRel((USBPROXY ":USBLibInit failed. rc=%Rrc\n", rc));
 
     USBLibTerm();
-    pProxyDev->Backend.pv = NULL;
     return rc;
 }
 
@@ -399,11 +401,11 @@ static int usbProxySolarisOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, v
  *
  * @param   pProxyDev   The device instance.
  */
-static void usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
 {
     LogFlow((USBPROXY ":usbProxySolarisClose: pProxyDev=%p\n", pProxyDev));
 
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
 
     /* Close the device (do not re-enumerate). */
     VBOXUSBREQ_CLOSE_DEVICE CloseReq;
@@ -431,12 +433,12 @@ static void usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
         RTMemFree(pUrbSol);
     }
 
+    RTPipeClose(pDevSol->hPipeWakeupR);
+    RTPipeClose(pDevSol->hPipeWakeupW);
+
     RTStrFree(pDevSol->pszDevicePath);
     pDevSol->pszDevicePath = NULL;
 
-    RTMemFree(pDevSol);
-    pProxyDev->Backend.pv = NULL;
-
     USBLibTerm();
 }
 
@@ -448,12 +450,12 @@ static void usbProxySolarisClose(PUSBPROXYDEV pProxyDev)
  * @param   pProxyDev           The device to reset.
  * @param   fRootHubReset       Is this a root hub reset or device specific reset request.
  */
-static int usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
+static DECLCALLBACK(int) usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
 {
     LogFlowFunc((USBPROXY ":usbProxySolarisReset pProxyDev=%s fRootHubReset=%d\n", pProxyDev->pUsbIns->pszName, fRootHubReset));
 
     /** Pass all resets to the device. The Trekstor USB (1.1) stick requires this to work. */
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
 
     /* Soft reset the device. */
     VBOXUSBREQ_CLOSE_DEVICE CloseReq;
@@ -481,23 +483,21 @@ static int usbProxySolarisReset(PUSBPROXYDEV pProxyDev, bool fRootHubReset)
  * @param   pProxyDev       The device instance data.
  * @param   iCfg            The configuration value to set.
  */
-static int usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
+static DECLCALLBACK(int) usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
 {
     LogFlowFunc((USBPROXY ":usbProxySolarisSetConfig: pProxyDev=%p iCfg=%#x\n", pProxyDev, iCfg));
 
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
     AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
 
     VBOXUSBREQ_SET_CONFIG SetConfigReq;
     SetConfigReq.bConfigValue = iCfg;
     int rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_SET_CONFIG, &SetConfigReq, sizeof(SetConfigReq));
-    if (RT_SUCCESS(rc))
-        return true;
-
-    if (rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
+    if (   RT_FAILURE(rc)
+        && rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
         LogRel((USBPROXY ":usbProxySolarisSetConfig failed to switch configuration. rc=%Rrc\n", rc));
 
-    return false;
+    return rc;
 }
 
 
@@ -509,9 +509,9 @@ static int usbProxySolarisSetConfig(PUSBPROXYDEV pProxyDev, int iCfg)
  *
  * @returns success indicator (always true).
  */
-static int usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -523,9 +523,9 @@ static int usbProxySolarisClaimInterface(PUSBPROXYDEV pProxyDev, int iIf)
  *
  * @returns success indicator.
  */
-static int usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
+static DECLCALLBACK(int) usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
 {
-    return true;
+    return VINF_SUCCESS;
 }
 
 
@@ -534,57 +534,52 @@ static int usbProxySolarisReleaseInterface(PUSBPROXYDEV pProxyDev, int iIf)
  *
  * @returns success indicator.
  */
-static int usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
+static DECLCALLBACK(int) usbProxySolarisSetInterface(PUSBPROXYDEV pProxyDev, int iIf, int iAlt)
 {
     LogFlowFunc((USBPROXY ":usbProxySolarisSetInterface: pProxyDev=%p iIf=%d iAlt=%d\n", pProxyDev, iIf, iAlt));
 
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
     AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
 
     VBOXUSBREQ_SET_INTERFACE SetInterfaceReq;
     SetInterfaceReq.bInterface = iIf;
     SetInterfaceReq.bAlternate = iAlt;
     int rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_SET_INTERFACE, &SetInterfaceReq, sizeof(SetInterfaceReq));
-    if (RT_SUCCESS(rc))
-        return true;
-
-    if (rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
+    if (   RT_FAILURE(rc)
+        && rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
         LogRel((USBPROXY ":usbProxySolarisSetInterface failed to set interface. rc=%Rrc\n", rc));
 
-    return false;
+    return rc;
 }
 
 
 /**
  * Clears the halted endpoint 'EndPt'.
  */
-static bool usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
+static DECLCALLBACK(int) usbProxySolarisClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int EndPt)
 {
     LogFlowFunc((USBPROXY ":usbProxySolarisClearHaltedEp pProxyDev=%p EndPt=%#x\n", pProxyDev, EndPt));
 
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
     AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
 
     VBOXUSBREQ_CLEAR_EP ClearEpReq;
     ClearEpReq.bEndpoint = EndPt;
     int rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_CLEAR_EP, &ClearEpReq, sizeof(ClearEpReq));
-    if (RT_SUCCESS(rc))
-        return true;
-
-    if (rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
+    if (   RT_FAILURE(rc)
+        && rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
         LogRel((USBPROXY ":usbProxySolarisClearHaltedEp failed! rc=%Rrc\n", rc));
 
-    return false;
+    return rc;
 }
 
 
 /**
  * @copydoc USBPROXYBACK::pfnUrbQueue
  */
-static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxySolarisUrbQueue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
 
     LogFlowFunc((USBPROXY ": usbProxySolarisUrbQueue: pProxyDev=%s pUrb=%p EndPt=%#x enmDir=%d cbData=%d pvData=%p\n",
              pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt, pUrb->enmDir, pUrb->cbData, pUrb->abData));
@@ -593,7 +588,7 @@ static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
     if (RT_UNLIKELY(!pUrbSol))
     {
         LogRel((USBPROXY ":usbProxySolarisUrbQueue: Failed to allocate URB.\n"));
-        return false;
+        return VERR_NO_MEMORY;
     }
 
     pUrbSol->pVUsbUrb = pUrb;
@@ -629,14 +624,14 @@ static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
         if (pUrb->enmType == VUSBXFERTYPE_ISOC)
             LogFlow((USBPROXY ":usbProxySolarisUrbQueue success cbData=%d.\n", pUrb->cbData));
         pUrb->Dev.pvPrivate = pUrbSol;
-        return true;
+        return VINF_SUCCESS;
     }
 
     if (rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
         LogRel((USBPROXY ":usbProxySolarisUrbQueue Failed!! pProxyDev=%s pUrb=%p EndPt=%#x bEndpoint=%#x enmType=%d enmDir=%d cbData=%u rc=%Rrc\n",
              pProxyDev->pUsbIns->pszName, pUrb, pUrb->EndPt, UrbReq.bEndpoint, pUrb->enmType, pUrb->enmDir, pUrb->cbData, rc));
 
-    return false;
+    return rc;
 }
 
 
@@ -647,31 +642,27 @@ static int usbProxySolarisUrbQueue(PVUSBURB pUrb)
  * @remark  There isn't any way to cancel a specific asynchronous request
  *          on Solaris. So we just abort pending URBs on the pipe.
  */
-static void usbProxySolarisUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxySolarisUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
     PUSBPROXYURBSOL pUrbSol = (PUSBPROXYURBSOL)pUrb->Dev.pvPrivate;
-
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
-    AssertPtrReturnVoid(pDevSol);
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
+    AssertPtrReturn(pDevSol, VERR_INVALID_POINTER);
 
     LogFlowFunc((USBPROXY ":usbProxySolarisUrbCancel pUrb=%p pUrbSol=%p pDevSol=%p\n", pUrb, pUrbSol, pUrbSol->pDevSol));
 
     /* Aborting the control pipe isn't supported, pretend success. */
     if (!pUrb->EndPt)
-        return;
+        return VINF_SUCCESS;
 
     VBOXUSBREQ_ABORT_PIPE AbortPipeReq;
     AbortPipeReq.bEndpoint = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? VUSB_DIR_TO_HOST : VUSB_DIR_TO_DEVICE);
     int rc = usbProxySolarisIOCtl(pDevSol, VBOXUSB_IOCTL_ABORT_PIPE, &AbortPipeReq, sizeof(AbortPipeReq));
-    if (RT_FAILURE(rc))
-    {
-        if (rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
-            LogRel((USBPROXY ":usbProxySolarisUrbCancel failed to abort pipe. rc=%Rrc\n", rc));
-        return;
-    }
+    if (   RT_FAILURE(rc)
+        && rc != VERR_VUSB_DEVICE_NOT_ATTACHED)
+        LogRel((USBPROXY ":usbProxySolarisUrbCancel failed to abort pipe. rc=%Rrc\n", rc));
 
-    LogFlow((USBPROXY ":usbProxySolarisUrbCancel success.\n", rc));
+    LogFlow((USBPROXY ":usbProxySolarisUrbCancel: rc=%Rrc.\n", rc));
+    return rc;
 }
 
 
@@ -683,11 +674,11 @@ static void usbProxySolarisUrbCancel(PVUSBURB pUrb)
  * @param   pProxyDev   The device.
  * @param   cMillies    Number of milliseconds to wait. Use 0 to not wait at all.
  */
-static PVUSBURB usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
     //LogFlowFunc((USBPROXY ":usbProxySolarisUrbReap pProxyDev=%p cMillies=%u\n", pProxyDev, cMillies));
 
-    PUSBPROXYDEVSOL pDevSol = (PUSBPROXYDEVSOL)pProxyDev->Backend.pv;
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
 
     /*
      * Don't block if nothing is in the air.
@@ -702,19 +693,43 @@ static PVUSBURB usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMil
     {
         for (;;)
         {
-            struct pollfd pfd;
-            pfd.fd = RTFileToNative(pDevSol->hFile);
-            pfd.events = POLLIN;
-            pfd.revents = 0;
-            int rc = poll(&pfd, 1, cMillies);
+            int cMilliesWait = cMillies == RT_INDEFINITE_WAIT ? -1 : cMillies;
+            struct pollfd pfd[2];
+
+            pfd[0].fd = RTFileToNative(pDevSol->hFile);
+            pfd[0].events = POLLIN;
+            pfd[0].revents = 0;
+
+            pfd[1].fd = RTPipeToNative(pDevSol->hPipeWakeupR);
+            pfd[1].events = POLLIN;
+            pfd[1].revents = 0;
+
+            int rc = poll(&pfd[0], 2, cMilliesWait);
             if (rc > 0)
             {
-                if (pfd.revents & POLLHUP)
+                if (pfd[0].revents & POLLHUP)
                 {
                     LogRel((USBPROXY ":Reaping failed, USB Device '%s' disconnected!\n", pDevSol->pProxyDev->pUsbIns->pszName));
                     pProxyDev->fDetached = true;
                     usbProxySolarisCloseFile(pDevSol);
                 }
+
+                if (pfd[1].revents & POLLIN)
+                {
+                    /* Got woken up, drain pipe. */
+                    uint8_t bRead;
+                    size_t cbIgnored = 0;
+                    RTPipeRead(pDevSol->hPipeWakeupR, &bRead, 1, &cbIgnored);
+
+                    /*
+                     * It is possible that we got woken up and have an URB pending
+                     * for completion. Do it on the way out. Otherwise return
+                     * immediately to the caller.
+                     */
+                    if (!(pfd[0].revents & POLLIN))
+                        return NULL;
+                }
+
                 break;
             }
 
@@ -763,7 +778,7 @@ static PVUSBURB usbProxySolarisUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMil
  *
  * @param   pDevSol         The Solaris device instance.
  */
-PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
+static PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
 {
     LogFlowFunc((USBPROXY ":usbProxySolarisUrbComplete pDevSol=%p\n", pDevSol));
 
@@ -851,13 +866,26 @@ PVUSBURB usbProxySolarisUrbComplete(PUSBPROXYDEVSOL pDevSol)
 }
 
 
+static DECLCALLBACK(int) usbProxySolarisWakeup(PUSBPROXYDEV pProxyDev)
+{
+    PUSBPROXYDEVSOL pDevSol = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVSOL);
+    size_t cbIgnored;
+
+    LogFlowFunc(("pProxyDev=%p\n", pProxyDev));
+
+    return RTPipeWrite(pDevSol->hPipeWakeupW, "", 1, &cbIgnored);
+}
+
 
 /**
  * The Solaris USB Proxy Backend.
  */
 extern const USBPROXYBACK g_USBProxyDeviceHost =
 {
+    /* pszName */
     "host",
+    /* cbBackend */
+    sizeof(USBPROXYDEVSOL),
     usbProxySolarisOpen,
     NULL,
     usbProxySolarisClose,
@@ -870,6 +898,7 @@ extern const USBPROXYBACK g_USBProxyDeviceHost =
     usbProxySolarisUrbQueue,
     usbProxySolarisUrbCancel,
     usbProxySolarisUrbReap,
+    usbProxySolarisWakeup,
     0
 };
 
diff --git a/src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp b/src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp
index 27b6eb1..3a2f70a 100644
--- a/src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp
+++ b/src/VBox/Devices/USB/vrdp/USBProxyDevice-vrdp.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -42,10 +42,11 @@ typedef struct USBPROXYDEVVRDP
  * The USB proxy device functions.
  */
 
-static int usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
+static DECLCALLBACK(int) usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
 {
     LogFlow(("usbProxyVrdpOpen: pProxyDev=%p pszAddress=%s, pvBackend=%p\n", pProxyDev, pszAddress, pvBackend));
 
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
     int rc = VINF_SUCCESS;
 
     if (strncmp (pszAddress, REMOTE_USB_BACKEND_PREFIX_S, REMOTE_USB_BACKEND_PREFIX_LEN) == 0)
@@ -57,19 +58,11 @@ static int usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void
 
         if (RT_SUCCESS (rc))
         {
-            PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)RTMemAlloc (sizeof(*pDevVrdp));
-            if (pDevVrdp)
-            {
-                pDevVrdp->pCallback = pCallback;
-                pDevVrdp->pDevice = pDevice;
-                pProxyDev->Backend.pv = pDevVrdp;
-                pProxyDev->iActiveCfg = 1; /** @todo that may not be always true. */
-                pProxyDev->cIgnoreSetConfigs = 1;
-                return VINF_SUCCESS;
-            }
-
-            pCallback->pfnClose (pDevice);
-            rc = VERR_NO_MEMORY;
+            pDevVrdp->pCallback = pCallback;
+            pDevVrdp->pDevice = pDevice;
+            pProxyDev->iActiveCfg = 1; /** @todo that may not be always true. */
+            pProxyDev->cIgnoreSetConfigs = 1;
+            return VINF_SUCCESS;
         }
     }
     else
@@ -81,20 +74,20 @@ static int usbProxyVrdpOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void
     return rc;
 }
 
-static void usbProxyVrdpClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxyVrdpClose(PUSBPROXYDEV pProxyDev)
 {
     LogFlow(("usbProxyVrdpClose: pProxyDev = %p\n", pProxyDev));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     pDevVrdp->pCallback->pfnClose (pDevVrdp->pDevice);
 }
 
-static int usbProxyVrdpReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
+static DECLCALLBACK(int) usbProxyVrdpReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
 {
     LogFlow(("usbProxyVrdpReset: pProxyDev = %p\n", pProxyDev));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnReset (pDevVrdp->pDevice);
 
@@ -110,11 +103,11 @@ static int usbProxyVrdpReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     return rc;
 }
 
-static int usbProxyVrdpSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
+static DECLCALLBACK(int) usbProxyVrdpSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
 {
     LogFlow(("usbProxyVrdpSetConfig: pProxyDev=%s cfg=%#x\n", pProxyDev->pUsbIns->pszName, cfg));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnSetConfig (pDevVrdp->pDevice, (uint8_t)cfg);
 
@@ -124,14 +117,14 @@ static int usbProxyVrdpSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static int usbProxyVrdpClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
+static DECLCALLBACK(int) usbProxyVrdpClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
 {
     LogFlow(("usbProxyVrdpClaimInterface: pProxyDev=%s ifnum=%#x\n", pProxyDev->pUsbIns->pszName, ifnum));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnClaimInterface (pDevVrdp->pDevice, (uint8_t)ifnum);
 
@@ -141,14 +134,14 @@ static int usbProxyVrdpClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static int usbProxyVrdpReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
+static DECLCALLBACK(int) usbProxyVrdpReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
 {
     LogFlow(("usbProxyVrdpReleaseInterface: pProxyDev=%s ifnum=%#x\n", pProxyDev->pUsbIns->pszName, ifnum));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnReleaseInterface (pDevVrdp->pDevice, (uint8_t)ifnum);
 
@@ -158,14 +151,14 @@ static int usbProxyVrdpReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static int usbProxyVrdpSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
+static DECLCALLBACK(int) usbProxyVrdpSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
 {
     LogFlow(("usbProxyVrdpSetInterface: pProxyDev=%p ifnum=%#x setting=%#x\n", pProxyDev, ifnum, setting));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnInterfaceSetting (pDevVrdp->pDevice, (uint8_t)ifnum, (uint8_t)setting);
 
@@ -175,14 +168,14 @@ static int usbProxyVrdpSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setti
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static bool usbProxyVrdpClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep)
+static DECLCALLBACK(int) usbProxyVrdpClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep)
 {
     LogFlow(("usbProxyVrdpClearHaltedEp: pProxyDev=%s ep=%u\n", pProxyDev->pUsbIns->pszName, ep));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     int rc = pDevVrdp->pCallback->pfnClearHaltedEP (pDevVrdp->pDevice, (uint8_t)ep);
 
@@ -192,10 +185,10 @@ static bool usbProxyVrdpClearHaltedEp(PUSBPROXYDEV pProxyDev, unsigned int ep)
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static int usbProxyVrdpUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyVrdpUrbQueue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
     LogFlow(("usbProxyVrdpUrbQueue: pUrb=%p\n", pUrb));
 
@@ -203,12 +196,10 @@ static int usbProxyVrdpUrbQueue(PVUSBURB pUrb)
     if (pUrb->enmType == VUSBXFERTYPE_ISOC)
     {
         Log(("usbproxy: isochronous transfers aren't implemented yet.\n"));
-        return false;
+        return VERR_NOT_IMPLEMENTED;
     }
 
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
-
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
     int rc = pDevVrdp->pCallback->pfnQueueURB (pDevVrdp->pDevice, pUrb->enmType, pUrb->EndPt, pUrb->enmDir, pUrb->cbData,
                                                pUrb->abData, pUrb, (PREMOTEUSBQURB *)&pUrb->Dev.pvPrivate);
 
@@ -218,14 +209,14 @@ static int usbProxyVrdpUrbQueue(PVUSBURB pUrb)
         pProxyDev->fDetached = true;
     }
 
-    return RT_SUCCESS(rc);
+    return rc;
 }
 
-static PVUSBURB usbProxyVrdpUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxyVrdpUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
     LogFlow(("usbProxyVrdpUrbReap: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
 
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
 
     PVUSBURB pUrb = NULL;
     uint32_t cbData = 0;
@@ -251,14 +242,21 @@ static PVUSBURB usbProxyVrdpUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillie
     return pUrb;
 }
 
-static void usbProxyVrdpUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyVrdpUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
     LogFlow(("usbProxyVrdpUrbCancel: pUrb=%p\n", pUrb));
 
-    PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PUSBPROXYDEVVRDP pDevVrdp = (PUSBPROXYDEVVRDP)pProxyDev->Backend.pv;
-
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
     pDevVrdp->pCallback->pfnCancelURB (pDevVrdp->pDevice, (PREMOTEUSBQURB)pUrb->Dev.pvPrivate);
+    return VINF_SUCCESS; /** @todo: Enhance remote interface to pass a status code. */
+}
+
+static DECLCALLBACK(int) usbProxyVrdpWakeup(PUSBPROXYDEV pProxyDev)
+{
+    LogFlow(("usbProxyVrdpWakeup: pProxyDev=%s\n", pProxyDev->pUsbIns->pszName));
+
+    PUSBPROXYDEVVRDP pDevVrdp = USBPROXYDEV_2_DATA(pProxyDev, PUSBPROXYDEVVRDP);
+    return pDevVrdp->pCallback->pfnWakeup (pDevVrdp->pDevice);
 }
 
 /**
@@ -266,7 +264,10 @@ static void usbProxyVrdpUrbCancel(PVUSBURB pUrb)
  */
 extern const USBPROXYBACK g_USBProxyDeviceVRDP =
 {
+    /* pszName */
     "vrdp",
+    /* cbBackend */
+    sizeof(USBPROXYDEVVRDP),
     usbProxyVrdpOpen,
     NULL,
     usbProxyVrdpClose,
@@ -279,6 +280,7 @@ extern const USBPROXYBACK g_USBProxyDeviceVRDP =
     usbProxyVrdpUrbQueue,
     usbProxyVrdpUrbCancel,
     usbProxyVrdpUrbReap,
+    usbProxyVrdpWakeup,
     0
 };
 
diff --git a/src/VBox/Devices/USB/win/USBProxyDevice-win.cpp b/src/VBox/Devices/USB/win/USBProxyDevice-win.cpp
index 9483691..ec6997e 100644
--- a/src/VBox/Devices/USB/win/USBProxyDevice-win.cpp
+++ b/src/VBox/Devices/USB/win/USBProxyDevice-win.cpp
@@ -8,7 +8,7 @@
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -68,18 +68,12 @@ typedef struct
     PQUEUED_URB    *paQueuedUrbs;
     /** Array of handles, this is parallel to paQueuedUrbs. */
     PHANDLE         paHandles;
-    /** The number of pending URBs. */
+    /* Event sempahore to wakeup the reaper thead. */
+    HANDLE          hEventWakeup;
+    /** Number of queued URBs waiting to get into the handle list. */
     unsigned        cPendingUrbs;
-    /** Array of pointers to the pending URB structures. */
+    /** Array of pending URBs. */
     PQUEUED_URB     aPendingUrbs[64];
-    /* Thread handle for async io handling. */
-    RTTHREAD        hThreadAsyncIo;
-    /* Event semaphore for signalling the arrival of a new URB */
-    HANDLE          hEventAsyncIo;
-    /* Event semaphore for signalling thread termination */
-    HANDLE          hEventAsyncTerm;
-    /* Set when the async io thread is started. */
-    bool            fThreadAsyncIoActive;
 } PRIV_USBW32, *PPRIV_USBW32;
 
 /* All functions are returning 1 on success, 0 on error */
@@ -88,25 +82,37 @@ typedef struct
 *   Internal Functions                                                         *
 *******************************************************************************/
 static int usbProxyWinSetInterface(PUSBPROXYDEV p, int ifnum, int setting);
-static DECLCALLBACK(int) usbProxyWinAsyncIoThread(RTTHREAD ThreadSelf, void *lpParameter);
+
+/**
+ * Converts the given Windows error code to VBox handling unplugged devices.
+ *
+ * @returns VBox status code.
+ * @param   pProxDev    The USB proxy device instance.
+ * @param   dwErr       Windows error code.
+ */
+static int usbProxyWinHandleUnpluggedDevice(PUSBPROXYDEV pProxyDev, DWORD dwErr)
+{
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
+
+    if (   dwErr == ERROR_INVALID_HANDLE_STATE
+        || dwErr == ERROR_BAD_COMMAND)
+    {
+        Log(("usbproxy: device %x unplugged!!\n", pPriv->hDev));
+        pProxyDev->fDetached = true;
+    }
+    else
+        AssertMsgFailed(("lasterr=%d\n", dwErr));
+    return RTErrConvertFromWin32(dwErr);
+}
 
 /**
  * Open a USB device and create a backend instance for it.
  *
  * @returns VBox status code.
  */
-static int usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
+static DECLCALLBACK(int) usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void *pvBackend)
 {
-    /* Here you just need to use pProxyDev->priv to store whatever per-device
-     * data is needed
-     */
-    /*
-     * Allocate private device instance data and use USBPROXYDEV::Backend::pv to point to it.
-     */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)RTMemAllocZ(sizeof(PRIV_USBW32));
-    if (!pPriv)
-        return VERR_NO_MEMORY;
-    pProxyDev->Backend.pv = pPriv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
 
     int rc = VINF_SUCCESS;
     pPriv->cAllocatedUrbs = 32;
@@ -155,12 +161,10 @@ static int usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void
 
                             rc = RTCritSectInit(&pPriv->CritSect);
                             AssertRC(rc);
-                            pPriv->hEventAsyncIo    = CreateEvent(NULL, FALSE, FALSE, NULL);
-                            Assert(pPriv->hEventAsyncIo);
-                            pPriv->hEventAsyncTerm  = CreateEvent(NULL, FALSE, FALSE, NULL);
-                            Assert(pPriv->hEventAsyncTerm);
-                            rc = RTThreadCreate(&pPriv->hThreadAsyncIo, usbProxyWinAsyncIoThread, pPriv, 128 * _1K, RTTHREADTYPE_IO, 0, "USBAsyncIo");
-                            Assert(pPriv->hThreadAsyncIo);
+                            pPriv->hEventWakeup     = CreateEvent(NULL, FALSE, FALSE, NULL);
+                            Assert(pPriv->hEventWakeup);
+
+                            pPriv->paHandles[0] = pPriv->hEventWakeup;
 
                             return VINF_SUCCESS;
                         }
@@ -199,21 +203,19 @@ static int usbProxyWinOpen(PUSBPROXYDEV pProxyDev, const char *pszAddress, void
 
     RTMemFree(pPriv->paQueuedUrbs);
     RTMemFree(pPriv->paHandles);
-    RTMemFree(pPriv);
-    pProxyDev->Backend.pv = NULL;
     return rc;
 }
 
 /**
  * Copy the device and free resources associated with the backend.
  */
-static void usbProxyWinClose(PUSBPROXYDEV pProxyDev)
+static DECLCALLBACK(void) usbProxyWinClose(PUSBPROXYDEV pProxyDev)
 {
     /* Here we just close the device and free up p->priv
      * there is no need to do anything like cancel outstanding requests
      * that will have been done already
      */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     Assert(pPriv);
     if (!pPriv)
         return;
@@ -235,21 +237,17 @@ static void usbProxyWinClose(PUSBPROXYDEV pProxyDev)
         pPriv->hDev = INVALID_HANDLE_VALUE;
     }
 
-    /* Terminate async thread (which will clean up hEventAsyncTerm) */
-    SetEvent(pPriv->hEventAsyncTerm);
-    CloseHandle(pPriv->hEventAsyncIo);
+    CloseHandle(pPriv->hEventWakeup);
     RTCritSectDelete(&pPriv->CritSect);
 
     RTMemFree(pPriv->paQueuedUrbs);
     RTMemFree(pPriv->paHandles);
-    RTMemFree(pPriv);
-    pProxyDev->Backend.pv = NULL;
 }
 
 
-static int usbProxyWinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
+static DECLCALLBACK(int) usbProxyWinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
 {
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     DWORD cbReturned;
     int  rc;
 
@@ -280,7 +278,7 @@ static int usbProxyWinReset(PUSBPROXYDEV pProxyDev, bool fResetOnLinux)
     return RTErrConvertFromWin32(rc);
 }
 
-static int usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
+static DECLCALLBACK(int) usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
 {
     /* Send a SET_CONFIGURATION command to the device. We don't do this
      * as a normal control message, because the OS might not want to
@@ -289,7 +287,7 @@ static int usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
      * It would be OK to send a SET_CONFIGURATION control URB at this
      * point but it has to be synchronous.
     */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     USBSUP_SET_CONFIG in;
     DWORD cbReturned;
 
@@ -301,51 +299,42 @@ static int usbProxyWinSetConfig(PUSBPROXYDEV pProxyDev, int cfg)
     /* Here we just need to assert reset signalling on the USB device */
     cbReturned = 0;
     if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_SET_CONFIG, &in, sizeof(in), NULL, 0, &cbReturned, NULL))
-        return 1;
-
-    if (   GetLastError() == ERROR_INVALID_HANDLE_STATE
-        || GetLastError() == ERROR_BAD_COMMAND)
-    {
-        Log(("usbproxy: device %p unplugged!!\n", pPriv->hDev));
-        pProxyDev->fDetached = true;
-    }
-    else
-        AssertMsgFailed(("lasterr=%u\n", GetLastError()));
+        return VINF_SUCCESS;
 
-    return 0;
+    return usbProxyWinHandleUnpluggedDevice(pProxyDev, GetLastError());
 }
 
-static int usbProxyWinClaimInterface(PUSBPROXYDEV p, int ifnum)
+static DECLCALLBACK(int) usbProxyWinClaimInterface(PUSBPROXYDEV pProxyDev, int ifnum)
 {
     /* Called just before we use an interface. Needed on Linux to claim
      * the interface from the OS, since even when proxying the host OS
      * might want to allow other programs to use the unused interfaces.
      * Not relevant for Windows.
      */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)p->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
 
     pPriv->bInterfaceNumber = ifnum;
 
     Assert(pPriv);
-    return true;
+    return VINF_SUCCESS;
 }
 
-static int usbProxyWinReleaseInterface(PUSBPROXYDEV p, int ifnum)
+static DECLCALLBACK(int) usbProxyWinReleaseInterface(PUSBPROXYDEV pProxyDev, int ifnum)
 {
     /* The opposite of claim_interface. */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)p->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
 
     Assert(pPriv);
-    return true;
+    return VINF_SUCCESS;
 }
 
-static int usbProxyWinSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
+static DECLCALLBACK(int) usbProxyWinSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int setting)
 {
     /* Select an alternate setting for an interface, the same applies
      * here as for set_config, you may convert this in to a control
      * message if you want but it must be synchronous
      */
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     USBSUP_SELECT_INTERFACE in;
     DWORD cbReturned;
 
@@ -358,25 +347,17 @@ static int usbProxyWinSetInterface(PUSBPROXYDEV pProxyDev, int ifnum, int settin
     /* Here we just need to assert reset signalling on the USB device */
     cbReturned = 0;
     if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_SELECT_INTERFACE, &in, sizeof(in), NULL, 0, &cbReturned, NULL))
-        return true;
+        return VINF_SUCCESS;
 
-    if (    GetLastError() == ERROR_INVALID_HANDLE_STATE
-        ||  GetLastError() == ERROR_BAD_COMMAND)
-    {
-        Log(("usbproxy: device %x unplugged!!\n", pPriv->hDev));
-        pProxyDev->fDetached = true;
-    }
-    else
-        AssertMsgFailed(("lasterr=%d\n", GetLastError()));
-    return 0;
+    return usbProxyWinHandleUnpluggedDevice(pProxyDev, GetLastError());
 }
 
 /**
  * Clears the halted endpoint 'ep'.
  */
-static bool usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
+static DECLCALLBACK(int) usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
 {
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     USBSUP_CLEAR_ENDPOINT in;
     DWORD cbReturned;
 
@@ -387,17 +368,9 @@ static bool usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
 
     cbReturned = 0;
     if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_CLEAR_ENDPOINT, &in, sizeof(in), NULL, 0, &cbReturned, NULL))
-        return true;
+        return VINF_SUCCESS;
 
-    if (    GetLastError() == ERROR_INVALID_HANDLE_STATE
-        ||  GetLastError() == ERROR_BAD_COMMAND)
-    {
-        Log(("usbproxy: device %x unplugged!!\n", pPriv->hDev));
-        pProxyDev->fDetached = true;
-    }
-    else
-        AssertMsgFailed(("lasterr=%d\n", GetLastError()));
-    return 0;
+    return usbProxyWinHandleUnpluggedDevice(pProxyDev, GetLastError());
 }
 
 /**
@@ -405,7 +378,7 @@ static bool usbProxyWinClearHaltedEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
  */
 static int usbProxyWinAbortEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
 {
-    PPRIV_USBW32 pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     USBSUP_CLEAR_ENDPOINT in;
     DWORD cbReturned;
     int  rc;
@@ -419,25 +392,15 @@ static int usbProxyWinAbortEndPt(PUSBPROXYDEV pProxyDev, unsigned int ep)
     if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_ABORT_ENDPOINT, &in, sizeof(in), NULL, 0, &cbReturned, NULL))
         return VINF_SUCCESS;
 
-    rc = GetLastError();
-    if (    rc == ERROR_INVALID_HANDLE_STATE
-        ||  rc == ERROR_BAD_COMMAND)
-    {
-        Log(("usbproxy: device %x unplugged!!\n", pPriv->hDev));
-        pProxyDev->fDetached = true;
-    }
-    else
-        AssertMsgFailed(("lasterr=%d\n", rc));
-    return RTErrConvertFromWin32(rc);
+    return usbProxyWinHandleUnpluggedDevice(pProxyDev, GetLastError());
 }
 
 /**
  * @copydoc USBPROXYBACK::pfnUrbQueue
  */
-static int usbProxyWinUrbQueue(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyWinUrbQueue(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV    pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PPRIV_USBW32    pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     Assert(pPriv);
 
     /*
@@ -446,7 +409,7 @@ static int usbProxyWinUrbQueue(PVUSBURB pUrb)
     /** @todo pool these */
     PQUEUED_URB pQUrbWin = (PQUEUED_URB)RTMemAllocZ(sizeof(QUEUED_URB));
     if (!pQUrbWin)
-        return false;
+        return VERR_NO_MEMORY;
 
     switch (pUrb->enmType)
     {
@@ -465,7 +428,7 @@ static int usbProxyWinUrbQueue(PVUSBURB pUrb)
         case VUSBXFERTYPE_MSG:  pQUrbWin->urbwin.type = USBSUP_TRANSFER_TYPE_MSG; break;
         default:
             AssertMsgFailed(("Invalid type %d\n", pUrb->enmType));
-            return false;
+            return VERR_INVALID_PARAMETER;
     }
 
     switch (pUrb->enmDir)
@@ -482,7 +445,7 @@ static int usbProxyWinUrbQueue(PVUSBURB pUrb)
             break;
         default:
             AssertMsgFailed(("Invalid direction %d\n", pUrb->enmDir));
-            return false;
+            return VERR_INVALID_PARAMETER;
     }
 
     Log(("usbproxy: Queue URB %p ep=%d cbData=%d abData=%p cIsocPkts=%d\n", pUrb, pUrb->EndPt, pUrb->cbData, pUrb->abData, pUrb->cIsocPkts));
@@ -496,60 +459,54 @@ static int usbProxyWinUrbQueue(PVUSBURB pUrb)
     if (pUrb->enmDir == VUSBDIRECTION_IN && !pUrb->fShortNotOk)
         pQUrbWin->urbwin.flags = USBSUP_FLAG_SHORT_OK;
 
+    int rc = VINF_SUCCESS;
     pQUrbWin->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-    if (    pQUrbWin->overlapped.hEvent != INVALID_HANDLE_VALUE
-        &&  pPriv->cPendingUrbs < RT_ELEMENTS(pPriv->aPendingUrbs))
+    if (pQUrbWin->overlapped.hEvent != INVALID_HANDLE_VALUE)
     {
-        while (!pPriv->fThreadAsyncIoActive)
-            RTThreadSleep(1);
+        pUrb->Dev.pvPrivate = pQUrbWin;
 
-        RTCritSectEnter(&pPriv->CritSect);
-        do
+        if (   DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_SEND_URB,
+                               &pQUrbWin->urbwin, sizeof(pQUrbWin->urbwin),
+                               &pQUrbWin->urbwin, sizeof(pQUrbWin->urbwin),
+                               &pQUrbWin->cbReturned, &pQUrbWin->overlapped)
+            || GetLastError() == ERROR_IO_PENDING)
         {
-            /* Ensure we've got sufficient space in the arrays.
-             * Do it inside the lock to ensure we do not concur
-             * with the usbProxyWinAsyncIoThread */
-            if (pPriv->cQueuedUrbs + 1 > pPriv->cAllocatedUrbs)
-            {
-                unsigned cNewMax = pPriv->cAllocatedUrbs + 32;
-                void *pv = RTMemRealloc(pPriv->paHandles, sizeof(pPriv->paHandles[0]) * cNewMax);
-                if (!pv)
-                {
-                    AssertMsgFailed(("RTMemRealloc failed for paHandles[%d]", cNewMax));
-                    break;
-                }
-                pPriv->paHandles = (PHANDLE)pv;
-
-                pv = RTMemRealloc(pPriv->paQueuedUrbs, sizeof(pPriv->paQueuedUrbs[0]) * cNewMax);
-                if (!pv)
-                {
-                    AssertMsgFailed(("RTMemRealloc failed for paQueuedUrbs[%d]", cNewMax));
-                    break;
-                }
-                pPriv->paQueuedUrbs = (PQUEUED_URB *)pv;
-                pPriv->cAllocatedUrbs = cNewMax;
-            }
-
-            pUrb->Dev.pvPrivate = pQUrbWin;
-            pPriv->aPendingUrbs[pPriv->cPendingUrbs] = pQUrbWin;
+            /* insert into the queue */
+            RTCritSectEnter(&pPriv->CritSect);
+            unsigned j = pPriv->cPendingUrbs;
+            pPriv->aPendingUrbs[j] = pQUrbWin;
             pPriv->cPendingUrbs++;
             RTCritSectLeave(&pPriv->CritSect);
-            SetEvent(pPriv->hEventAsyncIo);
-            return true;
-        } while (0);
-
-        RTCritSectLeave(&pPriv->CritSect);
+            SetEvent(pPriv->hEventWakeup);
+            return VINF_SUCCESS;
+        }
+        else
+        {
+            DWORD dwErr = GetLastError();
+            if (   dwErr == ERROR_INVALID_HANDLE_STATE
+                || dwErr == ERROR_BAD_COMMAND)
+            {
+                Log(("usbproxy: device %p unplugged!!\n", pPriv->hDev));
+                pProxyDev->fDetached = true;
+            }
+            else
+                AssertMsgFailed(("dwErr=%X urbwin.error=%d (submit urb)\n", dwErr, pQUrbWin->urbwin.error));
+            rc = RTErrConvertFromWin32(dwErr);
+            CloseHandle(pQUrbWin->overlapped.hEvent);
+            pQUrbWin->overlapped.hEvent = INVALID_HANDLE_VALUE;
+        }
     }
 #ifdef DEBUG_misha
     else
     {
-        AssertMsgFailed(("FAILED!!, hEvent(0x%p), cPendingUrbs(%d)\n", pQUrbWin->overlapped.hEvent, pPriv->cPendingUrbs));
+        AssertMsgFailed(("FAILED!!, hEvent(0x%p)\n", pQUrbWin->overlapped.hEvent));
+        rc = VERR_NO_MEMORY;
     }
 #endif
 
     Assert(pQUrbWin->overlapped.hEvent == INVALID_HANDLE_VALUE);
     RTMemFree(pQUrbWin);
-    return false;
+    return rc;
 }
 
 /**
@@ -588,27 +545,69 @@ static VUSBSTATUS usbProxyWinStatusToVUsbStatus(USBSUP_ERROR win_status)
  * @param   cMillies    Number of milliseconds to wait. Use 0 to not
  *                      wait at all.
  */
-static PVUSBURB usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
+static DECLCALLBACK(PVUSBURB) usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies)
 {
-    PPRIV_USBW32      pPriv = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     AssertReturn(pPriv, NULL);
 
     /*
      * There are some unnecessary calls, just return immediately or
      * WaitForMultipleObjects will fail.
      */
-    if (pPriv->cQueuedUrbs <= 0)
+    if (   pPriv->cQueuedUrbs <= 0
+        && pPriv->cPendingUrbs == 0)
     {
-        if (cMillies != 0)
+        if (   cMillies != 0
+            && pPriv->cPendingUrbs == 0)
         {
-            /* Wait for the URBs to be queued if there are some pending */
-            while (pPriv->cPendingUrbs)
-                RTThreadSleep(1);
-            if (pPriv->cQueuedUrbs <= 0)
-                return NULL;
+            /* Wait for the wakeup call. */
+            DWORD cMilliesWait = cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies;
+            DWORD rc = WaitForMultipleObjects(1, &pPriv->hEventWakeup, FALSE, cMilliesWait);
         }
-        else
-            return NULL;
+
+        return NULL;
+    }
+
+again:
+    /* Check for pending URBs. */
+    if (pPriv->cPendingUrbs)
+    {
+        RTCritSectEnter(&pPriv->CritSect);
+
+        /* Ensure we've got sufficient space in the arrays. */
+        if (pPriv->cQueuedUrbs + pPriv->cPendingUrbs + 1 > pPriv->cAllocatedUrbs)
+        {
+            unsigned cNewMax = pPriv->cAllocatedUrbs + pPriv->cPendingUrbs + 1;
+            void *pv = RTMemRealloc(pPriv->paHandles, sizeof(pPriv->paHandles[0]) * (cNewMax + 1)); /* One extra for the wakeup event. */
+            if (!pv)
+            {
+                AssertMsgFailed(("RTMemRealloc failed for paHandles[%d]", cNewMax));
+                //break;
+            }
+            pPriv->paHandles = (PHANDLE)pv;
+
+            pv = RTMemRealloc(pPriv->paQueuedUrbs, sizeof(pPriv->paQueuedUrbs[0]) * cNewMax);
+            if (!pv)
+            {
+                AssertMsgFailed(("RTMemRealloc failed for paQueuedUrbs[%d]", cNewMax));
+                //break;
+            }
+            pPriv->paQueuedUrbs = (PQUEUED_URB *)pv;
+            pPriv->cAllocatedUrbs = cNewMax;
+        }
+
+        /* Copy the pending URBs over. */
+        for (unsigned i = 0; i < pPriv->cPendingUrbs; i++)
+        {
+            pPriv->paHandles[pPriv->cQueuedUrbs + i] = pPriv->aPendingUrbs[i]->overlapped.hEvent;
+            pPriv->paQueuedUrbs[pPriv->cQueuedUrbs + i] = pPriv->aPendingUrbs[i];
+        }
+        pPriv->cQueuedUrbs += pPriv->cPendingUrbs;
+        pPriv->cPendingUrbs = 0;
+        pPriv->paHandles[pPriv->cQueuedUrbs] = pPriv->hEventWakeup;
+        pPriv->paHandles[pPriv->cQueuedUrbs + 1] = INVALID_HANDLE_VALUE;
+
+        RTCritSectLeave(&pPriv->CritSect);
     }
 
     /*
@@ -622,8 +621,18 @@ static PVUSBURB usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies
      *      access/realloc.
      */
     unsigned cQueuedUrbs = ASMAtomicReadU32((volatile uint32_t *)&pPriv->cQueuedUrbs);
+    DWORD cMilliesWait = cMillies == RT_INDEFINITE_WAIT ? INFINITE : cMillies;
     PVUSBURB pUrb = NULL;
-    DWORD rc = WaitForMultipleObjects(cQueuedUrbs, pPriv->paHandles, FALSE, cMillies);
+    DWORD rc = WaitForMultipleObjects(cQueuedUrbs + 1, pPriv->paHandles, FALSE, cMilliesWait);
+
+    /* If the wakeup event fired return immediately. */
+    if (rc == WAIT_OBJECT_0 + cQueuedUrbs)
+    {
+        if (pPriv->cPendingUrbs)
+            goto again;
+        return NULL;
+    }
+
     if (rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + cQueuedUrbs)
     {
         RTCritSectEnter(&pPriv->CritSect);
@@ -644,7 +653,8 @@ static PVUSBURB usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies
                 pPriv->paQueuedUrbs[i] = pPriv->paQueuedUrbs[i+1];
             }
         }
-        pPriv->paHandles[cQueuedUrbs] = INVALID_HANDLE_VALUE;
+        pPriv->paHandles[cQueuedUrbs] = pPriv->hEventWakeup;
+        pPriv->paHandles[cQueuedUrbs + 1] = INVALID_HANDLE_VALUE;
         pPriv->paQueuedUrbs[cQueuedUrbs] = NULL;
         RTCritSectLeave(&pPriv->CritSect);
         Assert(cQueuedUrbs == pPriv->cQueuedUrbs);
@@ -683,86 +693,6 @@ static PVUSBURB usbProxyWinUrbReap(PUSBPROXYDEV pProxyDev, RTMSINTERVAL cMillies
     return pUrb;
 }
 
-/* Thread to handle async URB queueing. */
-static DECLCALLBACK(int) usbProxyWinAsyncIoThread(RTTHREAD ThreadSelf, void *lpParameter)
-{
-    PPRIV_USBW32    pPriv = (PPRIV_USBW32)lpParameter;
-    HANDLE          hEventWait[2];
-
-    hEventWait[0] = pPriv->hEventAsyncIo;
-    hEventWait[1] = pPriv->hEventAsyncTerm;
-
-    Log(("usbProxyWinAsyncIoThread: start\n"));
-    pPriv->fThreadAsyncIoActive = true;
-
-    while (true)
-    {
-        DWORD ret = WaitForMultipleObjects(2, hEventWait, FALSE /* wait for any */, INFINITE);
-
-        if (ret == WAIT_OBJECT_0)
-        {
-            /*
-             * Submit pending URBs.
-             */
-            RTCritSectEnter(&pPriv->CritSect);
-
-            for (unsigned i = 0; i < pPriv->cPendingUrbs; i++)
-            {
-                PQUEUED_URB pQUrbWin = pPriv->aPendingUrbs[i];
-
-                Assert(pQUrbWin);
-                if (pQUrbWin)
-                {
-                    if (   DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_SEND_URB,
-                                           &pQUrbWin->urbwin, sizeof(pQUrbWin->urbwin),
-                                           &pQUrbWin->urbwin, sizeof(pQUrbWin->urbwin),
-                                           &pQUrbWin->cbReturned, &pQUrbWin->overlapped)
-                        || GetLastError() == ERROR_IO_PENDING)
-                    {
-                        /* insert into the queue */
-                        unsigned j = pPriv->cQueuedUrbs;
-                        pPriv->paQueuedUrbs[j] = pQUrbWin;
-                        pPriv->paHandles[j] = pQUrbWin->overlapped.hEvent;
-                        /* do an atomic increment to allow usbProxyWinUrbReap thread get it outside a lock,
-                         * being sure that pPriv->paHandles contains cQueuedUrbs valid handles */
-                        ASMAtomicIncU32((uint32_t volatile *)&pPriv->cQueuedUrbs);
-                    }
-                    else
-                    {
-                        DWORD dwErr = GetLastError();
-                        if (   dwErr == ERROR_INVALID_HANDLE_STATE
-                            || dwErr == ERROR_BAD_COMMAND)
-                        {
-                            PUSBPROXYDEV pProxyDev = PDMINS_2_DATA(pQUrbWin->urb->pUsbIns, PUSBPROXYDEV);
-                            Log(("usbproxy: device %p unplugged!!\n", pPriv->hDev));
-                            pProxyDev->fDetached = true;
-                        }
-                        else
-                            AssertMsgFailed(("dwErr=%X urbwin.error=%d (submit urb)\n", dwErr, pQUrbWin->urbwin.error));
-                        CloseHandle(pQUrbWin->overlapped.hEvent);
-                        pQUrbWin->overlapped.hEvent = INVALID_HANDLE_VALUE;
-                    }
-                }
-                pPriv->aPendingUrbs[i] = 0;
-            }
-            pPriv->cPendingUrbs = 0;
-            RTCritSectLeave(&pPriv->CritSect);
-        }
-        else
-        if (ret == WAIT_OBJECT_0 + 1)
-        {
-            Log(("usbProxyWinAsyncIoThread: terminating\n"));
-            CloseHandle(hEventWait[1]);
-            break;
-        }
-        else
-        {
-            Log(("usbProxyWinAsyncIoThread: unexpected return code %x\n", ret));
-            break;
-        }
-    }
-    return 0;
-}
 
 /**
  * Cancels an in-flight URB.
@@ -774,41 +704,52 @@ static DECLCALLBACK(int) usbProxyWinAsyncIoThread(RTTHREAD ThreadSelf, void *lpP
  *          all URBs pending on an endpoint. Luckily that is usually
  *          exactly what the guest wants to do.
  */
-static void usbProxyWinUrbCancel(PVUSBURB pUrb)
+static DECLCALLBACK(int) usbProxyWinUrbCancel(PUSBPROXYDEV pProxyDev, PVUSBURB pUrb)
 {
-    PUSBPROXYDEV      pProxyDev = PDMINS_2_DATA(pUrb->pUsbIns, PUSBPROXYDEV);
-    PPRIV_USBW32      pPriv     = (PPRIV_USBW32)pProxyDev->Backend.pv;
+    PPRIV_USBW32      pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
     PQUEUED_URB       pQUrbWin  = (PQUEUED_URB)pUrb->Dev.pvPrivate;
-    int                     rc;
     USBSUP_CLEAR_ENDPOINT   in;
     DWORD                   cbReturned;
-    Assert(pQUrbWin);
+
+    AssertPtrReturn(pQUrbWin, VERR_INVALID_PARAMETER);
 
     in.bEndpoint = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0);
     Log(("Cancel urb %p, endpoint %x\n", pUrb, in.bEndpoint));
 
     cbReturned = 0;
     if (DeviceIoControl(pPriv->hDev, SUPUSB_IOCTL_USB_ABORT_ENDPOINT, &in, sizeof(in), NULL, 0, &cbReturned, NULL))
-        return;
+        return VINF_SUCCESS;
 
-    rc = GetLastError();
-    if (    rc == ERROR_INVALID_HANDLE_STATE
-        ||  rc == ERROR_BAD_COMMAND)
+    DWORD dwErr = GetLastError();
+    if (   dwErr == ERROR_INVALID_HANDLE_STATE
+        || dwErr == ERROR_BAD_COMMAND)
     {
         Log(("usbproxy: device %x unplugged!!\n", pPriv->hDev));
         pProxyDev->fDetached = true;
+        return VINF_SUCCESS; /* Fake success and deal with the unplugged device elsewhere. */
     }
-    else
-        AssertMsgFailed(("lasterr=%d\n", rc));
+
+    AssertMsgFailed(("lastErr=%ld\n", dwErr));
+    return RTErrConvertFromWin32(dwErr);
 }
 
+static DECLCALLBACK(int) usbProxyWinWakeup(PUSBPROXYDEV pProxyDev)
+{
+    PPRIV_USBW32 pPriv = USBPROXYDEV_2_DATA(pProxyDev, PPRIV_USBW32);
+
+    SetEvent(pPriv->hEventWakeup);
+    return VINF_SUCCESS;
+}
 
 /**
  * The Win32 USB Proxy Backend.
  */
 extern const USBPROXYBACK g_USBProxyDeviceHost =
 {
+    /* pszName */
     "host",
+    /* cbBackend */
+    sizeof(PRIV_USBW32),
     usbProxyWinOpen,
     NULL,
     usbProxyWinClose,
@@ -821,6 +762,7 @@ extern const USBPROXYBACK g_USBProxyDeviceHost =
     usbProxyWinUrbQueue,
     usbProxyWinUrbCancel,
     usbProxyWinUrbReap,
+    usbProxyWinWakeup,
     0
 };
 
diff --git a/src/VBox/Devices/VMMDev/VMMDev.cpp b/src/VBox/Devices/VMMDev/VMMDev.cpp
index a0c021b..8ce46a8 100644
--- a/src/VBox/Devices/VMMDev/VMMDev.cpp
+++ b/src/VBox/Devices/VMMDev/VMMDev.cpp
@@ -3663,7 +3663,9 @@ static DECLCALLBACK(int) vmmdevDestruct(PPDMDEVINS pDevIns)
         pThis->pCredentials = NULL;
     }
 
+#ifdef VBOX_WITH_HGCM
     vmmdevHGCMDestroy(pThis);
+#endif
 
 #ifndef VBOX_WITHOUT_TESTING_FEATURES
     /*
diff --git a/src/VBox/Devices/testcase/tstDeviceStructSize.cpp b/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
index ad40741..a703393 100644
--- a/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
+++ b/src/VBox/Devices/testcase/tstDeviceStructSize.cpp
@@ -72,6 +72,7 @@
 # undef LOG_GROUP
 # include "../USB/DevOHCI.cpp"
 # ifdef VBOX_WITH_EHCI_IMPL
+#  undef LOG_GROUP
 #  include "../USB/DevEHCI.cpp"
 # endif
 #endif
diff --git a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
index 2ea62c3..4a06c2b 100644
--- a/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
+++ b/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
@@ -67,6 +67,7 @@
 # undef LOG_GROUP
 # include "../USB/DevOHCI.cpp"
 # ifdef VBOX_WITH_EHCI_IMPL
+#  undef LOG_GROUP
 #  include "../USB/DevEHCI.cpp"
 # endif
 #endif
@@ -1015,6 +1016,13 @@ int main()
     GEN_CHECK_OFF(OHCI, StatDroppedUrbs);
     GEN_CHECK_OFF(OHCI, StatTimer);
 # endif
+    GEN_CHECK_OFF(OHCI, hThreadFrame);
+    GEN_CHECK_OFF(OHCI, hSemEventFrame);
+    GEN_CHECK_OFF(OHCI, fBusStarted);
+    GEN_CHECK_OFF(OHCI, CsIrq);
+    GEN_CHECK_OFF(OHCI, nsWait);
+    GEN_CHECK_OFF(OHCI, CritSect);
+
 # ifdef VBOX_WITH_EHCI_IMPL
     /* USB/DevEHCI.cpp */
     GEN_CHECK_SIZE(EHCIHUBPORT);
@@ -1091,6 +1099,13 @@ int main()
     GEN_CHECK_OFF(EHCI, pEOFTimerNoSyncRC);
     GEN_CHECK_OFF(EHCI, pEOFTimerNoSyncR3);
     GEN_CHECK_OFF(EHCI, pEOFTimerNoSyncR0);
+    GEN_CHECK_OFF(EHCI, hThreadFrame);
+    GEN_CHECK_OFF(EHCI, hSemEventFrame);
+    GEN_CHECK_OFF(EHCI, fBusStarted);
+    GEN_CHECK_OFF(EHCI, CsIrq);
+    GEN_CHECK_OFF(EHCI, uFrameRateDefault);
+    GEN_CHECK_OFF(EHCI, nsWait);
+    GEN_CHECK_OFF(EHCI, CritSect);
 # endif /* VBOX_WITH_EHCI_IMPL */
 #endif /* VBOX_WITH_USB */
 
@@ -1291,6 +1306,7 @@ int main()
     GEN_CHECK_OFF(AHCI, fR0Enabled);
     GEN_CHECK_OFF(AHCI, fSignalIdle);
     GEN_CHECK_OFF(AHCI, fBootable);
+    GEN_CHECK_OFF(AHCI, fLegacyPortResetMethod);
     GEN_CHECK_OFF(AHCI, cPortsImpl);
     GEN_CHECK_OFF(AHCI, cCmdSlotsAvail);
     GEN_CHECK_OFF(AHCI, f8ByteMMIO4BytesWrittenSuccessfully);
diff --git a/src/VBox/Disassembler/Makefile.kmk b/src/VBox/Disassembler/Makefile.kmk
index 81ba5cd..a3c730f 100644
--- a/src/VBox/Disassembler/Makefile.kmk
+++ b/src/VBox/Disassembler/Makefile.kmk
@@ -37,7 +37,7 @@ DisasmR3_SOURCES        = \
 	DisasmFormatYasm.cpp
 
 LIBRARIES              += DisasmBldProg
-DisasmBldProg_TEMPLATE  = VBOXBLDPROG
+DisasmBldProg_TEMPLATE  = VBoxBldProg
 DisasmBldProg_EXTENDS   = DisasmR3
 
 LIBRARIES              += DisasmCoreR3
diff --git a/src/VBox/Frontends/VBoxHeadless/Makefile.kmk b/src/VBox/Frontends/VBoxHeadless/Makefile.kmk
index 8cae020..8d4be8f 100644
--- a/src/VBox/Frontends/VBoxHeadless/Makefile.kmk
+++ b/src/VBox/Frontends/VBoxHeadless/Makefile.kmk
@@ -36,6 +36,7 @@ endif
 #
 VBoxHeadlessHardened_TEMPLATE = VBOXR3HARDENEDEXE
 VBoxHeadlessHardened_SOURCES = VBoxHeadlessHardened.cpp
+VBoxHeadlessHardened_SOURCES.win = $(VBoxHeadless_0_OUTDIR)/VBoxHeadless-icon.rc
 VBoxHeadlessHardened_NAME = VBoxHeadless
 
 
@@ -43,8 +44,7 @@ VBoxHeadlessHardened_NAME = VBoxHeadless
 # VBoxHeadless
 #
 VBoxHeadless_TEMPLATE  := $(if $(VBOX_WITH_HARDENING),VBOXMAINCLIENTDLL,VBOXMAINCLIENTEXE)
-VBoxHeadless_DEFS      += \
-                 VBOX_WITH_VIDEO_REC
+VBoxHeadless_DEFS      += $(if $(VBOX_WITH_VPX),VBOX_WITH_VPX,)
 VBoxHeadless_SOURCES    = VBoxHeadless.cpp
 VBoxHeadless_SOURCES  += Framebuffer.cpp
 ifdef VBOX_WITH_GUEST_PROPS
@@ -54,5 +54,13 @@ ifdef VBOX_WITH_HARDENING
  VBoxHeadless_LDFLAGS.darwin += -install_name $(VBOX_DYLD_EXECUTABLE_PATH)/VBoxHeadless.dylib
 endif
 
+
+# Icon include file.
+VBoxHeadless_SOURCES.win += $(VBoxHeadless_0_OUTDIR)/VBoxHeadless-icon.rc
+VBoxHeadless_CLEAN.win   += $(VBoxHeadless_0_OUTDIR)/VBoxHeadless-icon.rc
+$$(VBoxHeadless_0_OUTDIR)/VBoxHeadless-icon.rc: $(VBOX_WINDOWS_ICON_FILE) $$(VBoxHeadless_DEFPATH)/Makefile.kmk | $$(dir $$@)
+	$(RM) -f $@
+	$(APPEND) $@ 'IDI_VIRTUALBOX ICON DISCARDABLE "$(subst /,\\,$(VBOX_WINDOWS_ICON_FILE))"'
+
 include $(FILE_KBUILD_SUB_FOOTER)
 
diff --git a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
index bca3b24..4e18afe 100644
--- a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
+++ b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
@@ -42,14 +42,10 @@ using namespace com;
 #include <VBox/err.h>
 #include <VBox/VBoxVideo.h>
 
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
 #include <cstdlib>
 #include <cerrno>
-#include "VBoxHeadless.h"
-#include <iprt/env.h>
-#include <iprt/param.h>
 #include <iprt/process.h>
-#include <VBox/sup.h>
 #endif
 
 //#define VBOX_WITH_SAVESTATE_ON_SIGNAL
@@ -509,7 +505,7 @@ static void show_usage()
              "                                         will bind to\n"
              "   --settingspw <pw>                     Specify the settings password\n"
              "   --settingspwfile <file>               Specify a file containing the settings password\n"
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
              "   -c, -capture, --capture               Record the VM screen output to a file\n"
              "   -w, --width                           Frame width when recording\n"
              "   -h, --height                          Frame height when recording\n"
@@ -520,7 +516,7 @@ static void show_usage()
              "\n");
 }
 
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
 /**
  * Parse the environment for variables which can influence the VIDEOREC settings.
  * purely for backwards compatibility.
@@ -569,7 +565,7 @@ static void parse_environ(unsigned long *pulFrameWidth, unsigned long *pulFrameH
     if ((pszEnvTemp = RTEnvGet("VBOX_CAPTUREFILE")) != 0)
         *ppszFileName = pszEnvTemp;
 }
-#endif /* VBOX_WITH_VIDEO_REC defined */
+#endif /* VBOX_WITH_VPX defined */
 
 static RTEXITCODE readPasswordFile(const char *pszFilename, com::Utf8Str *pPasswd)
 {
@@ -653,21 +649,21 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
     unsigned fRawR3 = ~0U;
     unsigned fPATM  = ~0U;
     unsigned fCSAM  = ~0U;
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
     bool fVideoRec = 0;
     unsigned long ulFrameWidth = 800;
     unsigned long ulFrameHeight = 600;
     unsigned long ulBitRate = 300000; /** @todo r=bird: The COM type ULONG isn't unsigned long, it's 32-bit unsigned int. */
     char szMpegFile[RTPATH_MAX];
     const char *pszFileNameParam = "VBox-%d.vob";
-#endif /* VBOX_WITH_VIDEO_REC */
+#endif /* VBOX_WITH_VPX */
 
     LogFlow(("VBoxHeadless STARTED.\n"));
     RTPrintf(VBOX_PRODUCT " Headless Interface " VBOX_VERSION_STRING "\n"
              "(C) 2008-" VBOX_C_YEAR " " VBOX_VENDOR "\n"
              "All rights reserved.\n\n");
 
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
     /* Parse the environment */
     parse_environ(&ulFrameWidth, &ulFrameHeight, &ulBitRate, &pszFileNameParam);
 #endif
@@ -719,14 +715,14 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
         { "--nocsam", OPT_NO_CSAM, 0 },
         { "--settingspw", OPT_SETTINGSPW, RTGETOPT_REQ_STRING },
         { "--settingspwfile", OPT_SETTINGSPW_FILE, RTGETOPT_REQ_STRING },
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
         { "-capture", 'c', 0 },
         { "--capture", 'c', 0 },
         { "--width", 'w', RTGETOPT_REQ_UINT32 },
         { "--height", 'h', RTGETOPT_REQ_UINT32 }, /* great choice of short option! */
         { "--bitrate", 'r', RTGETOPT_REQ_UINT32 },
         { "--filename", 'f', RTGETOPT_REQ_STRING },
-#endif /* VBOX_WITH_VIDEO_REC defined */
+#endif /* VBOX_WITH_VPX defined */
         { "-comment", OPT_COMMENT, RTGETOPT_REQ_STRING },
         { "--comment", OPT_COMMENT, RTGETOPT_REQ_STRING }
     };
@@ -794,7 +790,7 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
             case OPT_SETTINGSPW_FILE:
                 pcszSettingsPwFile = ValueUnion.psz;
                 break;
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
             case 'c':
                 fVideoRec = true;
                 break;
@@ -807,9 +803,9 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
             case 'f':
                 pszFileNameParam = ValueUnion.psz;
                 break;
-#endif /* VBOX_WITH_VIDEO_REC defined */
+#endif /* VBOX_WITH_VPX defined */
             case 'h':
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
                 if ((GetState.pDef->fFlags & RTGETOPT_REQ_MASK) != RTGETOPT_REQ_NOTHING)
                 {
                     ulFrameHeight = ValueUnion.u32;
@@ -831,7 +827,7 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
         }
     }
 
-#ifdef VBOX_WITH_VIDEO_REC
+#ifdef VBOX_WITH_VPX
     if (ulFrameWidth < 512 || ulFrameWidth > 2048 || ulFrameWidth % 2)
     {
         LogError("VBoxHeadless: ERROR: please specify an even frame width between 512 and 2048", 0);
@@ -861,7 +857,7 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
         return 1;
     }
     RTStrPrintf(&szMpegFile[0], RTPATH_MAX, pszFileNameParam, RTProcSelf());
-#endif /* defined VBOX_WITH_VIDEO_REC */
+#endif /* defined VBOX_WITH_VPX */
 
     if (!pcszNameOrUUID)
     {
@@ -970,67 +966,22 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
         ComPtr<IDisplay> display;
         CHECK_ERROR_BREAK(console, COMGETTER(Display)(display.asOutParam()));
 
-#ifdef VBOX_WITH_VIDEO_REC
-        IFramebuffer *pFramebuffer = 0;
-        RTLDRMOD hLdrVideoRecFB;
-        PFNREGISTERVIDEORECFB pfnRegisterVideoRecFB;
-
+#ifdef VBOX_WITH_VPX
         if (fVideoRec)
         {
-            HRESULT         rcc = S_OK;
-            int             rrc = VINF_SUCCESS;
-            RTERRINFOSTATIC ErrInfo;
-
-            Log2(("VBoxHeadless: loading VBoxVideoRecFB and libvpx shared library\n"));
-            RTErrInfoInitStatic(&ErrInfo);
-            rrc = SUPR3HardenedLdrLoadAppPriv("VBoxVideoRecFB", &hLdrVideoRecFB, RTLDRLOAD_FLAGS_LOCAL, &ErrInfo.Core);
-
-            if (RT_SUCCESS(rrc))
-            {
-                Log2(("VBoxHeadless: looking up symbol VBoxRegisterVideoRecFB\n"));
-                rrc = RTLdrGetSymbol(hLdrVideoRecFB, "VBoxRegisterVideoRecFB",
-                                     reinterpret_cast<void **>(&pfnRegisterVideoRecFB));
-                if (RT_FAILURE(rrc))
-                    LogError("Failed to load the video capture extension, possibly due to a damaged file\n", rrc);
-            }
-            else
-                LogError("Failed to load the video capture extension\n", rrc); /** @todo stupid function, no formatting options. */
-            if (RT_SUCCESS(rrc))
-            {
-                Log2(("VBoxHeadless: calling pfnRegisterVideoRecFB\n"));
-                rcc = pfnRegisterVideoRecFB(ulFrameWidth, ulFrameHeight, ulBitRate,
-                                         szMpegFile, &pFramebuffer);
-                if (rcc != S_OK)
-                    LogError("Failed to initialise video capturing - make sure that the file format\n"
-                             "you wish to use is supported on your system\n", rcc);
-            }
-            if (RT_SUCCESS(rrc) && rcc == S_OK)
-            {
-                Log2(("VBoxHeadless: Registering framebuffer\n"));
-                pFramebuffer->AddRef();
-                display->SetFramebuffer(VBOX_VIDEO_PRIMARY_SCREEN, pFramebuffer);
-            }
-            if (!RT_SUCCESS(rrc) || rcc != S_OK)
-                rc = E_FAIL;
-        }
-        if (rc != S_OK)
-        {
-            break;
+            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureFile)(Bstr(szMpegFile).raw()));
+            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureWidth)(ulFrameWidth));
+            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureHeight)(ulFrameHeight));
+            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureRate)(ulBitRate));
+            CHECK_ERROR_BREAK(machine, COMSETTER(VideoCaptureEnabled)(TRUE));
         }
-#endif /* defined(VBOX_WITH_VIDEO_REC) */
+#endif /* defined(VBOX_WITH_VPX) */
         ULONG cMonitors = 1;
         machine->COMGETTER(MonitorCount)(&cMonitors);
 
         unsigned uScreenId;
         for (uScreenId = 0; uScreenId < cMonitors; uScreenId++)
         {
-# ifdef VBOX_WITH_VIDEO_REC
-            if (fVideoRec && uScreenId == 0)
-            {
-                /* Already registered. */
-                continue;
-            }
-# endif
             VRDPFramebuffer *pVRDPFramebuffer = new VRDPFramebuffer();
             if (!pVRDPFramebuffer)
             {
@@ -1316,14 +1267,13 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 
         Log(("VBoxHeadless: event loop has terminated...\n"));
 
-#ifdef VBOX_WITH_VIDEO_REC
-        if (pFramebuffer)
+#ifdef VBOX_WITH_VPX
+        if (fVideoRec)
         {
-            pFramebuffer->Release();
-            Log(("Released framebuffer\n"));
-            pFramebuffer = NULL;
+            if (!machine.isNull())
+                machine->COMSETTER(VideoCaptureEnabled)(FALSE);
         }
-#endif /* defined(VBOX_WITH_VIDEO_REC) */
+#endif /* defined(VBOX_WITH_VPX) */
 
         /* we don't have to disable VRDE here because we don't save the settings of the VM */
     }
diff --git a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.h b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.h
index 03a3e57..c9c419f 100644
--- a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.h
+++ b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.h
@@ -1,11 +1,10 @@
 /** @file
  *
  * VBox frontends: VRDE (headless Remote Desktop server):
- * Header file with registration call for VideoRec framebuffer
  */
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -29,21 +28,4 @@
 #include <iprt/initterm.h>
 #include <iprt/critsect.h>
 
-/**
- * Callback function to register an VideoRec framebuffer.
- *
- * @returns COM status code.
- * @param   width        Framebuffer width.
- * @param   height       Framebuffer height.
- * @param   bitrate      Bitrate of mpeg file to be created.
- * @param   pixelFormat  Framebuffer pixel format
- * @param   filename     Name of mpeg file to be created
- * @retval  retVal       The new framebuffer
- */
-typedef DECLCALLBACK(HRESULT) FNREGISTERVIDEORECFB(ULONG width,
-                                     ULONG height, ULONG bitrate,
-                                     com::Bstr filename,
-                                     IFramebuffer **retVal);
-typedef FNREGISTERVIDEORECFB *PFNREGISTERVIDEORECFB;
-
 #endif // __H_VBOXHEADLESS
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
index cc3ab44..b0b5682 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
@@ -164,6 +164,7 @@ void printUsage(USAGECATEGORY fCategory, uint32_t fSubCategory, PRTSTREAM pStrm)
                            "%s modifyvm %s        <uuid|vmname>\n"
                      "                            [--name <name>]\n"
                      "                            [--groups <group>, ...]\n"
+                     "                            [--description <desc>]\n"
                      "                            [--ostype <ostype>]\n"
                      "                            [--iconfile <filename>]\n"
                      "                            [--memory <memorysize in MB>]\n"
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
index 789bc79..4ab4e91 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
@@ -432,7 +432,7 @@ HRESULT showVMInfo(ComPtr<IVirtualBox> virtualBox,
         LONG64 i64; \
         CHECK_ERROR2_RET(a_pObj, COMGETTER(a_Prop)(&i64), hrcCheck); \
         if (details == VMINFO_MACHINEREADABLE) \
-            RTPrintf(a_szHuman "=%lld", i64); \
+            RTPrintf(a_szMachine "=%lld\n", i64); \
         else \
             RTPrintf("%-16s %'lld" a_szUnit "\n", a_szHuman ":", i64); \
     } while (0)
@@ -1015,6 +1015,7 @@ HRESULT showVMInfo(ComPtr<IVirtualBox> virtualBox,
                         ULONG tcpRcv = 0;
                         engine->GetNetworkSettings(&mtu, &sockSnd, &sockRcv, &tcpSnd, &tcpRcv);
 
+/** @todo r=klaus dnsproxy etc needs to be dumped, too */
                         if (details == VMINFO_MACHINEREADABLE)
                         {
                             RTPrintf("natnet%d=\"%ls\"\n", currentNIC + 1, strNetwork.length() ? strNetwork.raw(): Bstr("nat").raw());
@@ -1694,7 +1695,7 @@ HRESULT showVMInfo(ComPtr<IVirtualBox> virtualBox,
                     {
                         currentPort = -1; /* VM not powered up */
                     }
-                    if (FAILED(rc))
+                    else if (FAILED(rc))
                     {
                         com::ErrorInfo info(vrdeServerInfo, COM_IIDOF(IVRDEServerInfo));
                         GluePrintErrorInfo(info);
diff --git a/src/VBox/Frontends/VBoxSDL/Makefile.kmk b/src/VBox/Frontends/VBoxSDL/Makefile.kmk
index 42cc2cd..941b5d6 100644
--- a/src/VBox/Frontends/VBoxSDL/Makefile.kmk
+++ b/src/VBox/Frontends/VBoxSDL/Makefile.kmk
@@ -36,6 +36,7 @@ PROGRAMS += tstSDL
 #
 VBoxSDLHardened_TEMPLATE = VBOXR3HARDENEDEXE
 VBoxSDLHardened_SOURCES = VBoxSDLHardened.cpp
+VBoxSDLHardened_SOURCES.win = $(VBoxSDL_0_OUTDIR)/VBoxSDL-icon.rc
 VBoxSDLHardened_NAME = VBoxSDL
 
 
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index 6273212..b0828d3 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -54,8 +54,12 @@ include $(PATH_SUB_CURRENT)/nls/ApprovedLanguages.kmk
 #
 VirtualBoxHardened_TEMPLATE = VBOXR3HARDENEDEXE
 VirtualBoxHardened_SOURCES = src/hardenedmain.cpp
+VirtualBoxHardened_SOURCES.win = src/platform/win/VirtualBoxHardened.rc
 VirtualBoxHardened_NAME = VirtualBox
 VirtualBoxHardened_INST.darwin = $(INST_BIN)VirtualBox $(INST_BIN)VirtualBoxVM
+VirtualBoxHardened_LDFLAGS.win = /SUBSYSTEM:$(if-expr "$(KBUILD_TYPE)" != "release",console,windows)
+src/platform/win/VirtualBoxHardened.rc_INCS  = $(VirtualBox_0_OUTDIR)
+src/platform/win/VirtualBoxHardened.rc_DEPS  = $(VirtualBox_0_OUTDIR)/VirtualBox-icon.rc
 
 
 #
@@ -101,6 +105,7 @@ VirtualBox_DEFS          += \
 	$(if $(VBOX_WITH_UDPTUNNEL),VBOX_WITH_UDPTUNNEL) \
 	$(if $(VBOX_WITH_EXTPACK),VBOX_WITH_EXTPACK) \
 	$(if $(VBOX_WITH_EHCI),VBOX_WITH_EHCI) \
+	$(if $(VBOX_WITH_HARDENING),VBOXR3_HARDENED_DLL) \
 	$(if $(VBOX_WITH_DRAG_AND_DROP),VBOX_WITH_DRAG_AND_DROP) \
 	$(if $(VBOX_WITH_DRAG_AND_DROP_GH),VBOX_WITH_DRAG_AND_DROP_GH) \
 	$(if $(VBOX_WITH_CRHGSMI),VBOX_WITH_CRHGSMI) \
@@ -139,6 +144,7 @@ VirtualBox_src/main.cpp_DEFS += \
 endif
 
 
+
 VBOX_GUI_INC_DIRS = \
 	./src \
 	./src/converter \
@@ -470,6 +476,7 @@ VirtualBox_QT_MOCSRCS = \
 	src/selector/UIActionPoolSelector.cpp \
 	src/selector/UIVMDesktop.cpp \
 	src/settings/UISettingsDialogSpecific.cpp \
+	src/settings/global/UIGlobalSettingsInput.cpp \
 	src/settings/machine/UIMachineSettingsStorage.cpp \
 	src/settings/machine/UIMachineSettingsUSB.cpp \
 	src/widgets/UIHotKeyEditor.cpp \
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
index e7a3477..555f312 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
@@ -952,6 +952,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Мрежа</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4507,6 +4511,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4788,6 +4800,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
index d661829..eeba0fc 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
@@ -364,7 +364,7 @@
     </message>
     <message>
         <source>Show Session Information Window</source>
-        <translation type="unfinished">Mostra el diàleg informatiu de la sessió</translation>
+        <translation>Mostra el diàleg d'informació de la sessió</translation>
     </message>
     <message>
         <source>&Pause</source>
@@ -456,11 +456,11 @@
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
-        <translation type="unfinished">&Instal·la les Guest Additions...</translation>
+        <translation>&Insereix la imatge de CD de les Guest Additions...</translation>
     </message>
     <message>
         <source>Insert the Guest Additions disk file into the virtual drive</source>
-        <translation type="unfinished">Munta la imatge d'instal·lació de les Guest Additions</translation>
+        <translation>Insereix el fitxer de disc de les Guest Additions al dispositiu virtual</translation>
     </message>
     <message>
         <source>De&bug</source>
@@ -479,7 +479,7 @@
     <message>
         <source>&Logging...</source>
         <comment>debug action</comment>
-        <translation type="unfinished">&S'està connectant...</translation>
+        <translation>&S'està afegint al registre...</translation>
     </message>
     <message>
         <source>&Help</source>
@@ -952,47 +952,47 @@
     </message>
     <message>
         <source>Save the machine state of the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Desa l'estat de la màquina virtual</translation>
     </message>
     <message>
         <source>Power off the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Apaga la màquina virtual</translation>
     </message>
     <message>
         <source>&Network Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>&Paràmetres de xarxa...</translation>
     </message>
     <message>
         <source>&Shared Folders Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetre&s de carpeta compartida...</translation>
     </message>
     <message>
         <source>R&emote Display</source>
-        <translation type="unfinished"></translation>
+        <translation>&Pantalla remota</translation>
     </message>
     <message>
         <source>Toggle remote desktop (RDP) connections to this machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Intercanvia les connexions d'escriptori remotes (RDP) a aquesta màquina</translation>
     </message>
     <message>
         <source>&Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Captura de &vídeo</translation>
     </message>
     <message>
         <source>Toggle video capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Intercanvia la captura de vídeo</translation>
     </message>
     <message>
         <source>&Video Capture Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetres de la captura de &vídeo...</translation>
     </message>
     <message>
         <source>Configure video capture settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Configureu els paràmetres de la captura de vídeo</translation>
     </message>
     <message>
         <source>Popup Menu</source>
-        <translation type="unfinished"></translation>
+        <translation>Menú emergent</translation>
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
@@ -1006,7 +1006,11 @@
     </message>
     <message>
         <source>&Webcams</source>
-        <translation type="unfinished"></translation>
+        <translation>Càmeres &web</translation>
+    </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Xarxa</translation>
     </message>
 </context>
 <context>
@@ -2781,31 +2785,31 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Video Capture File</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Fitxer de captura de vídeo</translation>
     </message>
     <message>
         <source>Video Capture Attributes</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Atributs de captura de vídeo</translation>
     </message>
     <message>
         <source>Video Capture</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Captura de vídeo</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Desactivat</translation>
     </message>
     <message>
         <source>NAT Network, '%1'</source>
         <comment>details (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT, «%1»</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>Mida del marc: %1x%2, Marcs per segon: %3fps, Bits per segon: %4kbps</translation>
     </message>
 </context>
 <context>
@@ -3107,7 +3111,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Extension Packages</source>
-        <translation type="unfinished"></translation>
+        <translation>Paquets d'&extensió</translation>
     </message>
 </context>
 <context>
@@ -3170,27 +3174,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Dock and Menubar:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Acoblador i barra de menú:</translation>
     </message>
     <message>
         <source>Auto-Show in Fullscreen</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra automàticament en pantalla completa</translation>
     </message>
     <message>
         <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estigui actiu, l'acoblador de l'amfitrió i la barra de menú es mostraran quan la màquina virtual es trobi en mode de pantalla completa.</translation>
     </message>
     <message>
         <source>&Host Screensaver:</source>
-        <translation type="unfinished"></translation>
+        <translation>Estalvi de pantalla de l'&amfitrió:</translation>
     </message>
     <message>
         <source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estigui actiu, l'estalvi de pantalla de l'amfitrió es desactivarà quan la màquina virtual s'estigui executant.</translation>
     </message>
     <message>
         <source>Disable When Running Virtual Machines</source>
-        <translation type="unfinished"></translation>
+        <translation>Desactiva quan s'estiguin executant màquines virtuals</translation>
     </message>
 </context>
 <context>
@@ -3229,27 +3233,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Host Key Combination</source>
-        <translation type="unfinished"></translation>
+        <translation>Combinació de tecla d'amfitrió</translation>
     </message>
     <message>
         <source>Some items have the same shortcuts assigned.</source>
-        <translation type="unfinished"></translation>
+        <translation>Alguns elements tenen les mateixes dreceres assignades.</translation>
     </message>
     <message>
         <source>&VirtualBox Manager</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestor del &VirtualBox</translation>
     </message>
     <message>
         <source>Virtual &Machine</source>
-        <translation type="unfinished"></translation>
+        <translation>&Màquina virtual</translation>
     </message>
     <message>
         <source>Lists all the available shortcuts which can be configured.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra totes les dreceres disponibles que poden configurar-se.</translation>
     </message>
     <message>
         <source>Enter a sequence to filter the shortcut list.</source>
-        <translation type="unfinished"></translation>
+        <translation>Introduïu una seqüència per filtrar el llistat de dreceres.</translation>
     </message>
 </context>
 <context>
@@ -3308,7 +3312,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Interface Languages</source>
-        <translation type="unfinished"></translation>
+        <translation>Llengües de la &interfície</translation>
     </message>
 </context>
 <context>
@@ -3465,128 +3469,128 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&NAT Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxes &NAT</translation>
     </message>
     <message>
         <source>Lists all available NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra totes les xarxes NAT disponibles.</translation>
     </message>
     <message>
         <source>&Host-only Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxes de &només amfitrió</translation>
     </message>
     <message>
         <source>No new name specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un nom nou per a la xarxa NAT que abans s'anomenava <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un CIDR per a la xarxa NAT <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un CIDR per a la xarxa NAT que abans s'anomenava <b>%1</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha proveït un CIDR no vàlid (<i>%1</i>) per a la xarxa NAT <b>%2</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha proveït un CIDR no vàlid (<i>%1</i>) per a la xarxa NAT abans anomenada <b>%2</b>.</translation>
     </message>
     <message>
         <source>Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom de la xarxa</translation>
     </message>
     <message>
         <source>[empty]</source>
-        <translation type="unfinished"></translation>
+        <translation>[buit]</translation>
     </message>
     <message>
         <source>%1 (renamed from %2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 (reanomenat des de %2)</translation>
     </message>
     <message>
         <source>Old Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom antic de la xarxa</translation>
     </message>
     <message>
         <source>New Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom nou de la xarxa</translation>
     </message>
     <message>
         <source>Network CIDR</source>
-        <translation type="unfinished"></translation>
+        <translation>CIDR de la xarxa</translation>
     </message>
     <message>
         <source>Supports DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb DHCP</translation>
     </message>
     <message>
         <source>yes</source>
-        <translation type="unfinished"></translation>
+        <translation>sí</translation>
     </message>
     <message>
         <source>no</source>
-        <translation type="unfinished"></translation>
+        <translation>no</translation>
     </message>
     <message>
         <source>Supports IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb IPv6</translation>
     </message>
     <message>
         <source>Default IPv6 route</source>
-        <translation type="unfinished"></translation>
+        <translation>Ruta IPv6 per defecte</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una adreça IPv4 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una màscara de xarxa IPv4 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una adreça IPv6 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment un servidor d'adreça DHCP vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una màscara de xarxa DHCP vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una límit d'adreça inferior vàlida del servidor DHCP.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una límit d'adreça superior vàlida del servidor DHCP.</translation>
     </message>
     <message>
         <source>The name <b>%1</b> is being used for several NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ja s'està utilitzant el nom <b>%1</b> per a algunes xarxes NAT.</translation>
     </message>
     <message>
         <source>Active</source>
         <comment>NAT network</comment>
-        <translation type="unfinished">Actiu</translation>
+        <translation>Activa</translation>
     </message>
     <message>
         <source>&Add NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Afegeix una xarxa NAT</translation>
     </message>
     <message>
         <source>&Remove NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Suprimeix una xarxa NAT</translation>
     </message>
     <message>
         <source>&Edit NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Edita una xarxa NAT</translation>
     </message>
 </context>
 <context>
@@ -3688,177 +3692,177 @@ p, li { white-space: pre-wrap; }
     <name>UIGlobalSettingsNetworkDetailsHost</name>
     <message>
         <source>Host-only Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Detalls de xarxa de només l'amfitrió</translation>
     </message>
     <message>
         <source>&Adapter</source>
-        <translation type="unfinished">&Adaptador</translation>
+        <translation>&Adaptador</translation>
     </message>
     <message>
         <source>Manual &Configuration</source>
-        <translation type="unfinished">&Configuració manual</translation>
+        <translation>&Configuració manual</translation>
     </message>
     <message>
         <source>Use manual configuration for this host-only network adapter.</source>
-        <translation type="unfinished">Fes servir la configuració manual només per a l'adaptador de xarxa de l'amfitrió.</translation>
+        <translation>Fes servir la configuració manual només per a l'adaptador de xarxa de l'amfitrió.</translation>
     </message>
     <message>
         <source>&IPv4 Address:</source>
-        <translation type="unfinished">Adreça &IPv4:</translation>
+        <translation>Adreça &IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 address for this adapter.</source>
-        <translation type="unfinished">Mostra l'adreça IPv4 de l'amfitrió d'aquest adaptador.</translation>
+        <translation>Gestiona l'adreça IPv4 de l'amfitrió d'aquest adaptador.</translation>
     </message>
     <message>
         <source>IPv4 Network &Mask:</source>
-        <translation type="unfinished">&Màscara de xarxa IPv4:</translation>
+        <translation>&Màscara de xarxa IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 network mask for this adapter.</source>
-        <translation type="unfinished">Mostra la màscara de xarxa IPv4 de l'amfitrió d'aquest adaptador.</translation>
+        <translation>Mostra la màscara de xarxa IPv4 de l'amfitrió d'aquest adaptador.</translation>
     </message>
     <message>
         <source>I&Pv6 Address:</source>
-        <translation type="unfinished">Adreça I&Pv6:</translation>
+        <translation>Adreça I&Pv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Mostra l'adreça IPv6 de l'amfitrió d'aquest adaptador si IPv6 està suportat.</translation>
+        <translation>Gestiona l'adreça IPv6 de l'amfitrió d'aquest adaptador si IPv6 està suportat.</translation>
     </message>
     <message>
         <source>IPv6 Network Mask &Length:</source>
-        <translation type="unfinished">&Longitud de la màscara de xarxa IPv6:</translation>
+        <translation>&Longitud de la màscara de xarxa IPv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Mostra la longitud de l'adreça de la màscara de xarxa IPv6 de l'amfitrió per a aquest adaptador si IPv6 està suportat.</translation>
+        <translation>Gestiona la longitud de l'adreça de la màscara de xarxa IPv6 de l'amfitrió per a aquest adaptador si IPv6 està suportat.</translation>
     </message>
     <message>
         <source>&DHCP Server</source>
-        <translation type="unfinished">Servidor &DHCP</translation>
+        <translation>Servidor &DHCP</translation>
     </message>
     <message>
         <source>&Enable Server</source>
-        <translation type="unfinished">&Habilita el servidor</translation>
+        <translation>&Habilita el servidor</translation>
     </message>
     <message>
         <source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
-        <translation type="unfinished">Indica si el servidor DHCP està habilitat en iniciar de la màquina o no.</translation>
+        <translation>Indica si el servidor DHCP està habilitat en iniciar de la màquina o no.</translation>
     </message>
     <message>
         <source>Server Add&ress:</source>
-        <translation type="unfinished">Ad&reça del servidor:</translation>
+        <translation>Ad&reça del servidor:</translation>
     </message>
     <message>
         <source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça del servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça del servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>Server &Mask:</source>
-        <translation type="unfinished">&Màscara del servidor:</translation>
+        <translation>&Màscara del servidor:</translation>
     </message>
     <message>
         <source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra la màscara de xarxa del servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona la màscara de xarxa del servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>&Lower Address Bound:</source>
-        <translation type="unfinished">Adreça límit &inferior:</translation>
+        <translation>Adreça límit &inferior:</translation>
     </message>
     <message>
         <source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça límit inferior oferida pel servidor DHCP de la xarxa associada aquet adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça límit inferior oferida pel servidor DHCP de la xarxa associada aquet adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>&Upper Address Bound:</source>
-        <translation type="unfinished">Adreça límit &superior:</translation>
+        <translation>Adreça límit &superior:</translation>
     </message>
     <message>
         <source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça límit superior oferida pel servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça límit superior oferida pel servidor DHCP de la xarxa associada a aquest adaptador de només l'amfitrió.</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsNetworkDetailsNAT</name>
     <message>
         <source>NAT Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Detalls de la xarxa NAT</translation>
     </message>
     <message>
         <source>&Enable Network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Activa la xarxa</translation>
     </message>
     <message>
         <source>Enable this NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Activa aquesta xarxa NAT.</translation>
     </message>
     <message>
         <source>Network &Name:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Nom de la Xarxa:</translation>
     </message>
     <message>
         <source>Holds the name for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el nom per aquesta xarxa.</translation>
     </message>
     <message>
         <source>Network &CIDR:</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa &CIDR:</translation>
     </message>
     <message>
         <source>Holds the CIDR for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el CIDR per aquesta xarxa.</translation>
     </message>
     <message>
         <source>Network Options:</source>
-        <translation type="unfinished"></translation>
+        <translation>Opcions de xarxa:</translation>
     </message>
     <message>
         <source>Supports &DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb &DHCP</translation>
     </message>
     <message>
         <source>Determines whether this network supports DHCP.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si la xarxa és compatible amb DHCP.</translation>
     </message>
     <message>
         <source>Supports &IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb &IPv6</translation>
     </message>
     <message>
         <source>Determines whether this network supports IPv6.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si la xarxa és compatible amb IPv6.</translation>
     </message>
     <message>
         <source>Advertise Default IPv6 &Route</source>
-        <translation type="unfinished"></translation>
+        <translation>Publicita com a &camí IPv6 per defecte</translation>
     </message>
     <message>
         <source>Determines whether this network should be advertised as the default IPv6 route.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si aquesta xarxa s'hauria de publicitar com a un camí IPv6 per defecte.</translation>
     </message>
     <message>
         <source>Opens a window to manage port forwarding rules.</source>
-        <translation type="unfinished">Obre el diàleg per gestionar les regles de reenviament de ports.</translation>
+        <translation>Obre el diàleg per gestionar les regles de reenviament de ports.</translation>
     </message>
     <message>
         <source>&Port Forwarding</source>
-        <translation type="unfinished">Reenviament de &ports</translation>
+        <translation>Reenviament de &ports</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsPortForwardingDlg</name>
     <message>
         <source>Port Forwarding Rules</source>
-        <translation type="unfinished">Regles de redireccionament de ports</translation>
+        <translation>Regles de redireccionament de ports</translation>
     </message>
     <message>
         <source>IPv4</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv4</translation>
     </message>
     <message>
         <source>IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv6</translation>
     </message>
 </context>
 <context>
@@ -3913,11 +3917,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No proxy host is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap servidor intermediari d'amfitrió.</translation>
     </message>
     <message>
         <source>No proxy port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port de servidor intermediari.</translation>
     </message>
 </context>
 <context>
@@ -3982,71 +3986,71 @@ p, li { white-space: pre-wrap; }
     <name>UIHostComboEditor</name>
     <message>
         <source><key_%1></source>
-        <translation type="unfinished"><key_%1></translation>
+        <translation><key_%1></translation>
     </message>
     <message>
         <source>Left </source>
-        <translation type="unfinished">Esquerra</translation>
+        <translation>Esquerra</translation>
     </message>
     <message>
         <source>Right </source>
-        <translation type="unfinished">Dreta</translation>
+        <translation>Dreta</translation>
     </message>
     <message>
         <source>Left Shift</source>
-        <translation type="unfinished">Tecla de majúscules esquerra</translation>
+        <translation>Tecla de majúscules esquerra</translation>
     </message>
     <message>
         <source>Right Shift</source>
-        <translation type="unfinished">Tecla de majúscules dreta</translation>
+        <translation>Tecla de majúscules dreta</translation>
     </message>
     <message>
         <source>Left Ctrl</source>
-        <translation type="unfinished">Control esquerra</translation>
+        <translation>Control esquerra</translation>
     </message>
     <message>
         <source>Right Ctrl</source>
-        <translation type="unfinished">Control dreta</translation>
+        <translation>Control dreta</translation>
     </message>
     <message>
         <source>Left Alt</source>
-        <translation type="unfinished">Alt esquerra</translation>
+        <translation>Alt esquerra</translation>
     </message>
     <message>
         <source>Right Alt</source>
-        <translation type="unfinished">Alt dreta</translation>
+        <translation>Alt dreta</translation>
     </message>
     <message>
         <source>Left WinKey</source>
-        <translation type="unfinished">Tecla de Windows esquerra</translation>
+        <translation>Tecla de Windows esquerra</translation>
     </message>
     <message>
         <source>Right WinKey</source>
-        <translation type="unfinished">Tecla de Windows dreta</translation>
+        <translation>Tecla de Windows dreta</translation>
     </message>
     <message>
         <source>Menu key</source>
-        <translation type="unfinished">Tecla de menú</translation>
+        <translation>Tecla de menú</translation>
     </message>
     <message>
         <source>Alt Gr</source>
-        <translation type="unfinished">Alt Gr</translation>
+        <translation>Alt Gr</translation>
     </message>
     <message>
         <source>Caps Lock</source>
-        <translation type="unfinished">Bloq Majús</translation>
+        <translation>Bloq Majús</translation>
     </message>
     <message>
         <source>Scroll Lock</source>
-        <translation type="unfinished">Bloq Despl</translation>
+        <translation>Bloq Despl</translation>
     </message>
     <message>
         <source>Host+</source>
-        <translation type="unfinished"></translation>
+        <translation>Tecla amfitrió+</translation>
     </message>
     <message>
         <source>None</source>
-        <translation type="unfinished">Cap</translation>
+        <translation>Cap</translation>
     </message>
 </context>
 <context>
@@ -4233,22 +4237,22 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Reset shortcut to default</source>
-        <translation type="unfinished"></translation>
+        <translation>Reinicia la drecera al valor per defecte</translation>
     </message>
     <message>
         <source>Unset shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Desconfigura la drecera</translation>
     </message>
 </context>
 <context>
     <name>UIHotKeyTableModel</name>
     <message>
         <source>Name</source>
-        <translation type="unfinished">Nom</translation>
+        <translation>Nom</translation>
     </message>
     <message>
         <source>Shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Drecera</translation>
     </message>
 </context>
 <context>
@@ -4487,20 +4491,20 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
-        <translation type="unfinished"></translation>
+        <translation><nobr>Indica l'activitat de captura de vídeo:</nobr><br>%1</translation>
     </message>
     <message>
         <source><nobr><b>Video capture disabled</b></nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>S'ha desactivat la captura de vídeo</b></nobr></translation>
     </message>
     <message>
         <source><nobr><b>Video capture file:</b> %1</nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>Fitxer de captura de vídeo:</b> %1</nobr></translation>
     </message>
     <message>
         <source>Additional feature status:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></source>
         <comment>Virtualization Stuff LED</comment>
-        <translation type="unfinished"></translation>
+        <translation>Estat de característica addicional:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></translation>
     </message>
 </context>
 <context>
@@ -4574,10 +4578,18 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No Webcams Connected</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha connectat cap càmera web</translation>
     </message>
     <message>
         <source>No supported webcams connected to the host PC</source>
+        <translation>No hi ha cap càmera web compatible connecatada a l'ordinador amfitrió</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -4736,129 +4748,133 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Video &Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Captura de &vídeo</translation>
     </message>
     <message>
         <source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estigui marcat, el VirtualBox enregistrarà la sessió a la màquina virtual en un fitxer de vídeo.</translation>
     </message>
     <message>
         <source>&Enable Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>&Activa la captura de vídeo</translation>
     </message>
     <message>
         <source>File &Path:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Camí al fitxer:</translation>
     </message>
     <message>
         <source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina el nom de fitxer que el VirtualBox utilitza per desar el contingut enregistrat.</translation>
     </message>
     <message>
         <source>Frame &Size:</source>
-        <translation type="unfinished"></translation>
+        <translation>Mida del &marc:</translation>
     </message>
     <message>
         <source>This setting determines the resolution (frame size) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina la resolució (mida del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina la resolució <b>horitzontal</b> (amplada del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina la resolució <b>vertical</b> (alçada del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>&Frame Rate:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Marcs per segon:</translation>
     </message>
     <message>
         <source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina el nombre màxim de <b>marcs per segon</b>. Els marcs addicionals s'ignoraran. En reduir aquest valor s'incrementarà el nombre de marcs que s'ignoraran i reduirà la mida del fitxer.</translation>
     </message>
     <message>
         <source>&Quality:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Qualitat:</translation>
     </message>
     <message>
         <source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina la <b>qualitat</b>. En incrementar-lo farà que el vídeo es vegi millor però amb una mida de fitxer més gran.</translation>
     </message>
     <message>
         <source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aquest paràmetre determina la taxa de bits en <b>kilobits per segon</b>. En incrementar-lo farà que el vídeo es vegi millor però amb una mida de fitxer més gran.</translation>
     </message>
     <message>
         <source>&Screens:</source>
-        <translation type="unfinished"></translation>
+        <translation>Pantalle&s:</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració gràfica per maquinari. Tot i així, el sistema amfitrió no proveeix això i no podreu iniciar la màquina.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual té actualment assignada una memòria de vídeo inferior a <b>%1</b>, que és la quantitat mínima requerida per canviar al mode de pantalla completa o mode fluid.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual té actualment assignada una memòria de vídeo inferior a <b>%1</b>, que és la quantitat mínima requerida per poder reproduir eficientment el vídeo d'alta resolució.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració gràfica i el sistema operatiu suggerit és Windows Vista o posterior. Per a un millor rendiment hauríeu d'establir la memòria de vídeo almenys a <b>%1</b>.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració de flux de vídeo. Atès que aquesta característica només funciona amb Windows, el sistema client es desactivarà.</translation>
     </message>
     <message>
         <source>The VRDE server port value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat el valor del port del servidor VRDE.</translation>
     </message>
     <message>
         <source>The VRDE authentication timeout value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat el valor de temps d'espera d'autenticació VRDE.</translation>
     </message>
     <message>
         <source>User Defined</source>
-        <translation type="unfinished"></translation>
+        <translation>Definit per l'usuari</translation>
     </message>
     <message>
         <source>%1 fps</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 fps</translation>
     </message>
     <message>
         <source>fps</source>
-        <translation type="unfinished"></translation>
+        <translation>fps</translation>
     </message>
     <message>
         <source>low</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>baixa</translation>
     </message>
     <message>
         <source>medium</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>mitjana</translation>
     </message>
     <message>
         <source>high</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>alta</translation>
     </message>
     <message>
         <source>kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>kbps</translation>
     </message>
     <message>
         <source>Screen %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Pantalla %1</translation>
     </message>
     <message>
         <source>Enable video recording for screen %1.</source>
+        <translation>Activa l'enregistrament de vídeo per a la pantalla %1.</translation>
+    </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -5118,11 +5134,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No name specified for the virtual machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat cap màquina virtual.</translation>
     </message>
     <message>
         <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La recomanació del sistema operatiu de la màquina virtual és de tipus 64-bit. Els sistemes client de 64-bit requereixen la virtualització per maquinari i per tant això s'activarà automàticament si confirmeu els canvis.</translation>
     </message>
 </context>
 <context>
@@ -5277,7 +5293,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Holds the TAP interface name.</source>
-        <translation type="obsolete">Mostra el nom de la intefície TAP.</translation>
+        <translation type="obsolete">Mostra el nom de la interfície TAP.</translation>
     </message>
     <message>
         <source>&Setup Application:</source>
@@ -5377,35 +5393,35 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No bridged network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap adaptador de xarxa pont.</translation>
     </message>
     <message>
         <source>No internal network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha especificat cap nom de xarxa interna.</translation>
     </message>
     <message>
         <source>No host-only network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap adaptador de xarxa de només amfitrió.</translation>
     </message>
     <message>
         <source>No generic driver is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap controlador genèric.</translation>
     </message>
     <message>
         <source>The MAC address must be 12 hexadecimal digits long.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'adreça MAC ha de tenir 12 dígits hexadecimals.</translation>
     </message>
     <message>
         <source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
-        <translation type="unfinished"></translation>
+        <translation>El segon dígit a l'adreça MAC no pot ser senar ja que només es permeten adreces unicast.</translation>
     </message>
     <message>
         <source>No NAT network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha especificat cap nom de xarxa NAT.</translation>
     </message>
     <message>
         <source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el nom de la xarxa NAT que és on es connectarà la targeta de xarxa. Podeu crear o eliminar xarxes fent servir els paràmetres globals de xarxa a la finestra de gestió de màquines virtuals.</translation>
     </message>
 </context>
 <context>
@@ -5582,23 +5598,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap IRQ.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port d'E/S.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Dos o més ports tenen els mateixos paràmetres.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap camí de port.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'han proveït dos camins de ports duplicats.</translation>
     </message>
 </context>
 <context>
@@ -5771,7 +5787,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Window</source>
-        <translation type="unfinished"></translation>
+        <translation>Finestra</translation>
     </message>
 </context>
 <context>
@@ -5866,23 +5882,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap IRQ.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port d'E/S.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Dos o més ports tenen els mateixos paràmetres.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap camí de port.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'han proveït dos camins de ports duplicats.</translation>
     </message>
 </context>
 <context>
@@ -5985,7 +6001,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No hard disk is selected for <i>%1</i>.</source>
-        <translation type="unfinished">No hi ha cap disc dur seleccionat per a <i>%1</i>.</translation>
+        <translation>No hi ha cap disc dur seleccionat per a <i>%1</i>.</translation>
     </message>
     <message>
         <source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -6319,19 +6335,19 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No name is currently specified for the controller at position <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat cap nom per al controlador de la posició <b>%1</b>.</translation>
     </message>
     <message>
         <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>El controlador de la posició <b>%1</b> fa servir el nom que ja fa servir el controlador de la posició <b>%2</b>.</translation>
     </message>
     <message>
         <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
-        <translation type="unfinished"></translation>
+        <translation><i>%1</i> fa servir el disc dur que es troba connectat a <i>%2</i>.</translation>
     </message>
     <message>
         <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina té assignats més controladors d'emmagatzematge del que els xips %1 són compatibles. Canvieu el tipus de xip a la pàgina de paràmetres del sistema o reduïu el nombre dels controladors següents d'emmagatzematge a la pàgina de paràmetres d'emmagatzematge: %2</translation>
     </message>
 </context>
 <context>
@@ -6555,47 +6571,47 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Pointing Device:</source>
-        <translation type="unfinished"></translation>
+        <translation>Dispositiu del &punter:</translation>
     </message>
     <message>
         <source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si el dispositiu del cursor és un ratolí PS/2 estàndard, una tauleta USB o una tauleta multitàctil USB.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Més de <b>%1%</b> de la memòria (<b>%2</b>) de l'ordinador amfitrió està assignada a la màquina virtual. No s'ha deixat suficient memòria per al sistema operatiu amfitrió. Seleccioneu una quantitat inferior.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Més de <b>%1%</b> de la memòria (<b>%2</b>) de l'ordinador amfitrió està assignada a la màquina virtual. Això podria no deixar suficient memòria per al sistema operatiu amfitrió. Considereu seleccionar una quantitat inferior.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La característica E/S APIC no està habilitada a la secció placa mare de la pàgina Sistema. Això és necessari per la compatibilitat amb un xip del tipus ICH9. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'emulació del controlador USB no s'ha habilitat al a pàgina USB. Això és necessari per la compatibilitat amb un dispositiu d'entrada USB. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Per raons de rendiment, el nombre dels processadors virtuals connectats a la màquina virtual no pot ser més del doble del nombre de processadors físics de l'amfitrió (<b>%1</b>). Reduïu el nombre de processadors virtuals.</translation>
     </message>
     <message>
         <source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hi ha més processadors virtuals connectats a la màquina virtual que el nombre de processadors físics de l'amfitrió (<b>%1</b>). Això pot afectar al rendiment de la màquina virtual. Considereu reduir-ne el nombre de processadors virtuals.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La característica E/S APIC no està habilitada a la secció placa mare de la pàgina Sistema. Això és necessari per la compatibilitat amb un processador virtual. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La virtualització de maquinari no està habilitada a la secció Acceleració de la pàgina Sistema. Això és necessari per la compatibilitat amb més d'un processador virtual. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
-        <translation type="unfinished"></translation>
+        <translation>El cap d'execució del processador està establer a un valor baix. Això pot fer semblar que la màquina va lenta. </translation>
     </message>
 </context>
 <context>
@@ -6731,7 +6747,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'USB 2.0 es troba activat per a aquesta màquina virtual. Tot i així, això requereix la instal·lació de <b>%1</b>. Instal·leu el paquet d'extensions des del lloc web de baixades del VirtualBox o desactiveu la compabilitat USB 2.0 per iniciar la màquina.</translation>
     </message>
 </context>
 <context>
@@ -7365,7 +7381,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Insert</source>
         <comment>additions</comment>
-        <translation type="unfinished">Munta</translation>
+        <translation>Munta</translation>
     </message>
     <message>
         <source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -8146,7 +8162,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
-        <translation type="unfinished"><p>Sembla que les Guest Additions del VirtualBox no estan disponibles en aquesta màquina i les carpetes compartides no es poden fer servir sense elles. Per fer servir carpetes compartides a la màquina virtual, instal·leu les Guest Additions si no es troben instal·lades o torneu a instal·lar-les si no estan funcionant correctament seleccionant <b>Instal·la les Guest Additions</b> al menú <b>Màquina</b>. Si es troben inst [...]
+        <translation><p>Sembla que les Guest Additions del VirtualBox no estan disponibles en aquesta màquina i les carpetes compartides no es poden fer servir sense elles. Per fer servir carpetes compartides a la màquina virtual, instal·leu les Guest Additions si no es troben instal·lades o torneu a instal·lar-les si no estan funcionant correctament seleccionant <b>Instal·la les Guest Additions</b> al menú <b>Màquina</b>. Si es troben instal·lades però la m [...]
     </message>
     <message>
         <source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8449,220 +8465,220 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut iniciar el gestor del VirtualBox degut a restriccions locals.</p><p>Es tancarà l'aplicació.</p></translation>
     </message>
     <message>
         <source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer de llengua per a la llengua <b>%1</b> al directori <b><nobr>%2</nobr></b>.</p><p>La llengua es reiniciarà temporalment a la llengua per defecte del sistema. Aneu a la finestra de <b>Preferències</b> que podeu obrir des del menú <b>Fitxer</b> de la finestra del gestor del VirtualBox i seleccioneu una de les llengües existents a la pàgina <b>Llengü [...]
     </message>
     <message>
         <source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer de llengua per a la llengua <b><nobr>%1</nobr></b>.</p><p>La llengua es reiniciarà temporalment l'anglès (per defecte). Aneu a la finestra de <b>Preferències</b> que podeu obrir des del menú <b>Fitxer</b> de la finestra del gestor del VirtualBox i seleccioneu una de les llengües existents a la pàgina <b>Llengües</b>.</p></translation>
     </message>
     <message>
         <source>There is no virtual machine with the identifier <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No existeix cap màquina virtual amb aquest identificador <b>%1</b>.</translation>
     </message>
     <message>
         <source>Ignore</source>
-        <translation type="unfinished">Ignora</translation>
+        <translation>Ignora</translation>
     </message>
     <message>
         <source>Failed to create NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear la xarxa NAT.</translation>
     </message>
     <message>
         <source>Failed to remove NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut eliminar la xarxa NAT <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to create DHCP server.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear el servidor DHCP.</translation>
     </message>
     <message>
         <source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear el servidor DHCP per a la interfície <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to create the host network interface.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear la interfície de xarxa de l'amfitrió.</translation>
     </message>
     <message>
         <source>Create &new disk</source>
-        <translation type="unfinished">Crea un disc &nou</translation>
+        <translation>Crea un disc &nou</translation>
     </message>
     <message>
         <source>&Choose existing disk</source>
-        <translation type="unfinished">&Tria un disc existent</translation>
+        <translation>&Tria un disc existent</translation>
     </message>
     <message>
         <source>Leave &empty</source>
-        <translation type="unfinished">Deixa-ho &buit</translation>
+        <translation>Deixa-ho &buit</translation>
     </message>
     <message>
         <source>&Choose disk</source>
-        <translation type="unfinished">Tria un dis&c</translation>
+        <translation>Tria un dis&c</translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc dur virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc òptic virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc floppy virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc dur virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos durs coneguts?</p></translation>
     </message>
     <message>
         <source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Atès que no es pot accedir a aquest disc dur, no es pot eliminar el fitxer d'imatge.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc òptic virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos coneguts?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc floppy virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos coneguts?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut inserir el disc òptic virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force insertion of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu provar a forçar la inserció d'aquest disc?</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut expulsar el disc òptic virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force ejection of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu provar a forçar l'expulsió d'aquest disc?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut inserir el disc floppy virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut expulsar el disc floppy virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc dur <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc òptic <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc floppy <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc dur <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc òptic <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc floppy <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message numerus="yes">
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform><p>La màquina virtual %n es troba en un estat desat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de la màquina virtual exportada. Tingueu en compte que la màquina existent no canviarà.</p></numerusform>
+            <numerusform><p>Les %n màquines virtuals es troben en un estat desat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de les màquines virtuals exportades. Tingueu en compte que les màquines existent no canviaran.</p></numerusform>
+            <numerusform><p>Les %n màquines virtuals es troben en un estat desat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de les màquines virtuals exportades. Tingueu en compte que les màquines existent no canviaran.</p></numerusform>
         </translation>
     </message>
     <message>
         <source>Switch</source>
-        <translation type="unfinished">Canvia</translation>
+        <translation>Canvia</translation>
     </message>
     <message>
         <source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut activar el servidor d'escriptori remot per a aquesta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desactivar el servidor d'escriptori remot per a aquesta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut activar la captura de vídeo per a aquesta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desactivar la captura de vídeo per a aquesta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer d'imatge de les VirtualBox Guest Additions.</nobr></p><p>Voleu baixar la imatge de cd des de la xarxa?</p></translation>
     </message>
     <message>
         <source>Download</source>
-        <translation type="unfinished">Baixa</translation>
+        <translation>Baixa</translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu baixar la imatge del VirtualBox Guest Additions des de  <nobr><a href="%1">%1</a></nobr> (mida %2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> però no s'ha pogut desar localment com a <nobr><b>%2</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>S'ha baixat la imatge del VirtualBox Guest Additions des de <nobr><a href="%1">%1</a></nobr> i s'ha desat localment com a <nobr><b>%2</b>.</nobr></p><p>Voleu registrar aquesta imatge de CD i montar-la a la unitat virtual de CD/DVD?</p></translation>
     </message>
     <message>
         <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No es pot inserir la imatge del cd instal·lador de les Guest Additions a la màquina virtual <b>%1</b> si la màquina no té dispositius CD/DVD. Afegiu un dispositiu fent servir la pestanya de discos durs als paràmetres de la màquina.</p></translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el manual d'usuari del VirtualBox <nobr><b>%1</b>.</nobr></p><p>Voleu baixar aquest fitxer des d'Internet?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu baixar el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> (mida %2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%2</a></nobr> però no s'ha pogut desar localment com a <nobr><b>%3</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> però no s'ha pogut desar localment com a <nobr><b>%2</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
-        <translation type="unfinished"><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%2</a></nobr> i s'ha desat localment com a <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> i s'ha desat localment com a <nobr><b>%2</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="unfinished">Tanca</translation>
+        <translation>Tanca</translation>
     </message>
     <message>
         <source>Ok</source>
-        <translation type="unfinished">D'acord</translation>
+        <translation>D'acord</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
-        <translation type="unfinished">No tornis a mostrar aquest missatge</translation>
+        <translation>No tornis a mostrar aquest missatge</translation>
     </message>
     <message>
         <source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu eliminar la xarxa NAT <nobr><b>%1</b>?</nobr></p><p>Si aquesta xarxa està en ús per un o més adaptadors de màquines virtuals, aquests adaptadors ja no es podran utilitzar fins que corregiu els paràmetres triant un nom de xarxa diferent o un tipus d'adaptador diferent.</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -8676,15 +8692,15 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut afegir la càmera web <b>%1</b> a la màquina virtual <b>%2</b>.</translation>
     </message>
     <message>
         <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desconnectar la càmera web <b>%1</b> a la màquina virtual <b>%2</b>.</translation>
     </message>
     <message>
         <source><p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>La pantalla virtual utilitza actualment el mode de color <b>%1&nbsp;bit</b>. Per obtenir un millor rendiment, canvieu això a <b>%2&nbsp;bit</b>. Això es pot fer des de la secció <b>Pantalla</b> del tauler de control del sistema operatiu client o des dels paràmetres del sistema.</p></translation>
     </message>
 </context>
 <context>
@@ -8736,19 +8752,19 @@ p, li { white-space: pre-wrap; }
     <name>UIMiniToolBar</name>
     <message>
         <source>Always show the toolbar</source>
-        <translation type="unfinished">Mostra sempre la barra d'eines</translation>
+        <translation>Mostra sempre la barra d'eines</translation>
     </message>
     <message>
         <source>Minimize Window</source>
-        <translation type="unfinished">Minimitza la finestra</translation>
+        <translation>Minimitza la finestra</translation>
     </message>
     <message>
         <source>Exit Full Screen or Seamless Mode</source>
-        <translation type="unfinished">Surt del mode de pantalla completa o del mode fluid</translation>
+        <translation>Surt del mode de pantalla completa o del mode fluid</translation>
     </message>
     <message>
         <source>Close VM</source>
-        <translation type="unfinished">Tanca la màquina virtual</translation>
+        <translation>Tanca la màquina virtual</translation>
     </message>
 </context>
 <context>
@@ -8825,7 +8841,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>The network operation failed with the following error: %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ha fallat la operació de xarxa i s'ha proveït l'error següent: %1.</translation>
     </message>
 </context>
 <context>
@@ -8852,27 +8868,27 @@ p, li { white-space: pre-wrap; }
     <name>UINetworkReplyPrivate</name>
     <message>
         <source>Host not found</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha trobat l'amfitrió</translation>
     </message>
     <message>
         <source>Content access denied</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha denegat l'accés al contingut</translation>
     </message>
     <message>
         <source>Protocol failure</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha produït un error de protocol</translation>
     </message>
     <message>
         <source>Wrong SSL certificate format</source>
-        <translation type="unfinished"></translation>
+        <translation>El format del certificat SSL és erroni</translation>
     </message>
     <message>
         <source>SSL authentication failed</source>
-        <translation type="unfinished"></translation>
+        <translation>Ha fallat l'autenticació SSL</translation>
     </message>
     <message>
         <source>Unknown reason</source>
-        <translation type="unfinished"></translation>
+        <translation>Es desconeix la raó</translation>
     </message>
 </context>
 <context>
@@ -9771,7 +9787,7 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
     <name>UIPopupCenter</name>
     <message>
         <source>Click for full details</source>
-        <translation type="unfinished"></translation>
+        <translation>Feu clic per mostrar els detalls complets</translation>
     </message>
 </context>
 <context>
@@ -9949,11 +9965,11 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
     </message>
     <message>
         <source><b>%1</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b> pàgina:</translation>
     </message>
     <message>
         <source><b>%1: %2</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1: %2</b> pàgina:</translation>
     </message>
 </context>
 <context>
@@ -10750,39 +10766,39 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
     </message>
     <message>
         <source>Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetres d'emmagatzematge</translation>
     </message>
     <message>
         <source>Please choose a file to export the virtual appliance to</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on exportar l'aplicació virtual</translation>
     </message>
     <message>
         <source>F&ormat:</source>
-        <translation type="unfinished"></translation>
+        <translation>F&ormat:</translation>
     </message>
     <message>
         <source>OVF 0.9</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 0.9</translation>
     </message>
     <message>
         <source>OVF 1.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 1.0</translation>
     </message>
     <message>
         <source>OVF 2.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 2.0</translation>
     </message>
     <message>
         <source>Write in standard OVF 1.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Escriu en format estàndard OVF 1.0.</translation>
     </message>
     <message>
         <source>Write in new experimental OVF 2.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Escriu en format experimental OVF 2.0.</translation>
     </message>
     <message>
         <source>&Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>&Paràmetres d'emmagatzematge</translation>
     </message>
 </context>
 <context>
@@ -10801,14 +10817,14 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
     </message>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on s'ha d'exportar l'aplicació virtual...</translation>
     </message>
 </context>
 <context>
     <name>UIWizardExportAppPageExpert</name>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on exportar l'aplicació virtual...</translation>
     </message>
 </context>
 <context>
@@ -10878,15 +10894,15 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
     </message>
     <message>
         <source>Import Virtual Appliance</source>
-        <translation type="unfinished"></translation>
+        <translation>Importa l'aplicació virtual</translation>
     </message>
     <message>
         <source>Choose a virtual appliance file to import...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu l'aplicació virtual que s'ha d'importar...</translation>
     </message>
     <message>
         <source>Please choose a virtual appliance file to import</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu l'aplicació virtual que s'ha d'importar</translation>
     </message>
 </context>
 <context>
@@ -12165,7 +12181,7 @@ Versió %1</translation>
     </message>
     <message>
         <source>Choose...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu...</translation>
     </message>
 </context>
 <context>
@@ -12176,7 +12192,7 @@ Versió %1</translation>
     </message>
     <message>
         <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
-        <translation type="unfinished">El camí actual per defecte es mostrarà després d'acceptar els canvis i obrir aquest diàleg novament. </translation>
+        <translation>El camí actual per defecte es mostrarà després d'acceptar els canvis i obrir aquest diàleg novament. </translation>
     </message>
     <message>
         <source><not selected></source>
@@ -14093,60 +14109,60 @@ Versió %1</translation>
     <message>
         <source>Enabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Activat</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Desactivat</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
         <comment>details report</comment>
-        <translation type="unfinished"></translation>
+        <translation>Execució no restringida</translation>
     </message>
     <message>
         <source>PS/2 Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí PS/2</translation>
     </message>
     <message>
         <source>USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí USB</translation>
     </message>
     <message>
         <source>PS/2 and USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí PS/2 i USB</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
-        <translation type="unfinished"></translation>
+        <translation>Execució no restringida</translation>
     </message>
     <message>
         <source>USB Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Tablet USB</translation>
     </message>
     <message>
         <source>USB Multi-Touch Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Tablet USB multitàctil</translation>
     </message>
     <message>
         <source>NAT Network</source>
         <comment>NetworkAttachmentType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT</translation>
     </message>
     <message>
         <source>NAT network, '%1'</source>
         <comment>details report (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT, «%1»</translation>
     </message>
     <message>
         <source>You can create or add disk image files in the virtual machine settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Podeu crear o afegir fitxers d'imatge de disc als paràmetres de la màquina virtual.</translation>
     </message>
     <message>
         <source>USB</source>
@@ -16526,11 +16542,11 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation>
     </message>
     <message>
         <source>Configuration &Details</source>
-        <translation type="unfinished"></translation>
+        <translation>&Detalls de configuració</translation>
     </message>
     <message>
         <source>&Runtime Information</source>
-        <translation type="unfinished"></translation>
+        <translation>Informació del &temps d'execució</translation>
     </message>
 </context>
 <context>
@@ -16625,7 +16641,7 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation>
     </message>
     <message>
         <source>Holds the TAP interface name.</source>
-        <translation type="obsolete">Mostra el nom de la intefície TAP.</translation>
+        <translation type="obsolete">Mostra el nom de la interfície TAP.</translation>
     </message>
     <message>
         <source>&Enable Network Adapter</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
index 297a8e1..1faf2d3 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
@@ -15,8 +15,8 @@
     </message>
     <message>
         <source>English</source>
-        <comment>Language name, in English</comment>
-        <translation>Catalan (Valencian)</translation>
+        <comment>Catalan (Valencian)</comment>
+        <translation type="obsolete">Catalan</translation>
     </message>
     <message>
         <source>--</source>
@@ -28,6 +28,11 @@
         <comment>Comma-separated list of translators</comment>
         <translation>Vicent Fornés, Pau Iranzo <pau.iranzo at softcatala.org></translation>
     </message>
+    <message>
+        <source>English</source>
+        <comment>Language name, in English</comment>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AttachmentsModel</name>
@@ -364,7 +369,7 @@
     </message>
     <message>
         <source>Show Session Information Window</source>
-        <translation type="unfinished">Mostra el diàleg informatiu de la sessió</translation>
+        <translation>Mostra el diàleg d'informació de la sessió</translation>
     </message>
     <message>
         <source>&Pause</source>
@@ -456,11 +461,11 @@
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
-        <translation type="unfinished">&Instal·la les Guest Additions...</translation>
+        <translation>&Insereix la imatge de CD de les Guest Additions...</translation>
     </message>
     <message>
         <source>Insert the Guest Additions disk file into the virtual drive</source>
-        <translation type="unfinished">Munta la imatge d'instal·lació de les Guest Additions</translation>
+        <translation>Insereix el fitxer de disc de les Guest Additions al dispositiu virtual</translation>
     </message>
     <message>
         <source>De&bug</source>
@@ -479,7 +484,7 @@
     <message>
         <source>&Logging...</source>
         <comment>debug action</comment>
-        <translation type="unfinished">&S'està connectant...</translation>
+        <translation>&S'està afegint al registre...</translation>
     </message>
     <message>
         <source>&Help</source>
@@ -952,47 +957,47 @@
     </message>
     <message>
         <source>Save the machine state of the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Alça l'estat de la màquina virtual</translation>
     </message>
     <message>
         <source>Power off the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Apaga la màquina virtual</translation>
     </message>
     <message>
         <source>&Network Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>&Paràmetres de xarxa...</translation>
     </message>
     <message>
         <source>&Shared Folders Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetre&s de carpeta compartida...</translation>
     </message>
     <message>
         <source>R&emote Display</source>
-        <translation type="unfinished"></translation>
+        <translation>&Pantalla remota</translation>
     </message>
     <message>
         <source>Toggle remote desktop (RDP) connections to this machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Intercanvia les connexions d'escriptori remotes (RDP) a esta màquina</translation>
     </message>
     <message>
         <source>&Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Captura de &vídeo</translation>
     </message>
     <message>
         <source>Toggle video capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Intercanvia la captura de vídeo</translation>
     </message>
     <message>
         <source>&Video Capture Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetres de la captura de &vídeo...</translation>
     </message>
     <message>
         <source>Configure video capture settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Configureu els paràmetres de la captura de vídeo</translation>
     </message>
     <message>
         <source>Popup Menu</source>
-        <translation type="unfinished"></translation>
+        <translation>Menú emergent</translation>
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
@@ -1006,7 +1011,11 @@
     </message>
     <message>
         <source>&Webcams</source>
-        <translation type="unfinished"></translation>
+        <translation>Càmeres &web</translation>
+    </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Xarxa</translation>
     </message>
 </context>
 <context>
@@ -2781,31 +2790,31 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Video Capture File</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Fitxer de captura de vídeo</translation>
     </message>
     <message>
         <source>Video Capture Attributes</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Atributs de captura de vídeo</translation>
     </message>
     <message>
         <source>Video Capture</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Captura de vídeo</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Desactivat</translation>
     </message>
     <message>
         <source>NAT Network, '%1'</source>
         <comment>details (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT, «%1»</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>Mida del marc: %1x%2, Marcs per segon: %3fps, Bits per segon: %4kbps</translation>
     </message>
 </context>
 <context>
@@ -3107,7 +3116,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Extension Packages</source>
-        <translation type="unfinished"></translation>
+        <translation>Paquets d'&extensió</translation>
     </message>
 </context>
 <context>
@@ -3170,27 +3179,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Dock and Menubar:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Acoblador i barra de menú:</translation>
     </message>
     <message>
         <source>Auto-Show in Fullscreen</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra automàticament en pantalla completa</translation>
     </message>
     <message>
         <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estiga actiu, l'acoblador de l'amfitrió i la barra de menú es mostraran quan la màquina virtual es trobe en mode de pantalla completa.</translation>
     </message>
     <message>
         <source>&Host Screensaver:</source>
-        <translation type="unfinished"></translation>
+        <translation>Estalvi de pantalla de l'&amfitrió:</translation>
     </message>
     <message>
         <source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estiga actiu, l'estalvi de pantalla de l'amfitrió es desactivarà quan la màquina virtual s'estiga executant.</translation>
     </message>
     <message>
         <source>Disable When Running Virtual Machines</source>
-        <translation type="unfinished"></translation>
+        <translation>Desactiva quan s'estiguen executant màquines virtuals</translation>
     </message>
 </context>
 <context>
@@ -3229,27 +3238,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Host Key Combination</source>
-        <translation type="unfinished"></translation>
+        <translation>Combinació de tecla d'amfitrió</translation>
     </message>
     <message>
         <source>Some items have the same shortcuts assigned.</source>
-        <translation type="unfinished"></translation>
+        <translation>Alguns elements tenen les mateixes dreceres assignades.</translation>
     </message>
     <message>
         <source>&VirtualBox Manager</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestor del &VirtualBox</translation>
     </message>
     <message>
         <source>Virtual &Machine</source>
-        <translation type="unfinished"></translation>
+        <translation>&Màquina virtual</translation>
     </message>
     <message>
         <source>Lists all the available shortcuts which can be configured.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra totes les dreceres disponibles que poden configurar-se.</translation>
     </message>
     <message>
         <source>Enter a sequence to filter the shortcut list.</source>
-        <translation type="unfinished"></translation>
+        <translation>Introduïu una seqüència per filtrar el llistat de dreceres.</translation>
     </message>
 </context>
 <context>
@@ -3308,7 +3317,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Interface Languages</source>
-        <translation type="unfinished"></translation>
+        <translation>Llengües de la &interfície</translation>
     </message>
 </context>
 <context>
@@ -3465,128 +3474,128 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&NAT Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxes &NAT</translation>
     </message>
     <message>
         <source>Lists all available NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mostra totes les xarxes NAT disponibles.</translation>
     </message>
     <message>
         <source>&Host-only Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxes de &només amfitrió</translation>
     </message>
     <message>
         <source>No new name specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un nom nou per a la xarxa NAT que abans s'anomenava <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un CIDR per a la xarxa NAT <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït un CIDR per a la xarxa NAT que abans s'anomenava <b>%1</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha proveït un CIDR no vàlid (<i>%1</i>) per a la xarxa NAT <b>%2</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha proveït un CIDR no vàlid (<i>%1</i>) per a la xarxa NAT abans anomenada <b>%2</b>.</translation>
     </message>
     <message>
         <source>Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom de la xarxa</translation>
     </message>
     <message>
         <source>[empty]</source>
-        <translation type="unfinished"></translation>
+        <translation>[buit]</translation>
     </message>
     <message>
         <source>%1 (renamed from %2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 (reanomenat des de %2)</translation>
     </message>
     <message>
         <source>Old Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom antic de la xarxa</translation>
     </message>
     <message>
         <source>New Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nom nou de la xarxa</translation>
     </message>
     <message>
         <source>Network CIDR</source>
-        <translation type="unfinished"></translation>
+        <translation>CIDR de la xarxa</translation>
     </message>
     <message>
         <source>Supports DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb DHCP</translation>
     </message>
     <message>
         <source>yes</source>
-        <translation type="unfinished"></translation>
+        <translation>sí</translation>
     </message>
     <message>
         <source>no</source>
-        <translation type="unfinished"></translation>
+        <translation>no</translation>
     </message>
     <message>
         <source>Supports IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb IPv6</translation>
     </message>
     <message>
         <source>Default IPv6 route</source>
-        <translation type="unfinished"></translation>
+        <translation>Ruta IPv6 per defecte</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una adreça IPv4 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una màscara de xarxa IPv4 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una adreça IPv6 vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment un servidor d'adreça DHCP vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una màscara de xarxa DHCP vàlida.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una límit d'adreça inferior vàlida del servidor DHCP.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>La interfície <b>%1</b> de l'amfitrió no té actualment una límit d'adreça superior vàlida del servidor DHCP.</translation>
     </message>
     <message>
         <source>The name <b>%1</b> is being used for several NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ja s'està utilitzant el nom <b>%1</b> per a algunes xarxes NAT.</translation>
     </message>
     <message>
         <source>Active</source>
         <comment>NAT network</comment>
-        <translation type="unfinished">Actiu</translation>
+        <translation>Activa</translation>
     </message>
     <message>
         <source>&Add NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Afig una xarxa NAT</translation>
     </message>
     <message>
         <source>&Remove NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Suprimeix una xarxa NAT</translation>
     </message>
     <message>
         <source>&Edit NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Edita una xarxa NAT</translation>
     </message>
 </context>
 <context>
@@ -3688,177 +3697,177 @@ p, li { white-space: pre-wrap; }
     <name>UIGlobalSettingsNetworkDetailsHost</name>
     <message>
         <source>Host-only Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Detalls de xarxa de només l'amfitrió</translation>
     </message>
     <message>
         <source>&Adapter</source>
-        <translation type="unfinished">&Adaptador</translation>
+        <translation>&Adaptador</translation>
     </message>
     <message>
         <source>Manual &Configuration</source>
-        <translation type="unfinished">&Configuració manual</translation>
+        <translation>&Configuració manual</translation>
     </message>
     <message>
         <source>Use manual configuration for this host-only network adapter.</source>
-        <translation type="unfinished">Fes servir la configuració manual només per a l'adaptador de xarxa de l'amfitrió.</translation>
+        <translation>Fes servir la configuració manual només per a l'adaptador de xarxa de l'amfitrió.</translation>
     </message>
     <message>
         <source>&IPv4 Address:</source>
-        <translation type="unfinished">Adreça &IPv4:</translation>
+        <translation>Adreça &IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 address for this adapter.</source>
-        <translation type="unfinished">Mostra l'adreça IPv4 de l'amfitrió d'este adaptador.</translation>
+        <translation>Gestiona l'adreça IPv4 de l'amfitrió d'este adaptador.</translation>
     </message>
     <message>
         <source>IPv4 Network &Mask:</source>
-        <translation type="unfinished">&Màscara de xarxa IPv4:</translation>
+        <translation>&Màscara de xarxa IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 network mask for this adapter.</source>
-        <translation type="unfinished">Mostra la màscara de xarxa IPv4 de l'amfitrió d'este adaptador.</translation>
+        <translation>Mostra la màscara de xarxa IPv4 de l'amfitrió d'este adaptador.</translation>
     </message>
     <message>
         <source>I&Pv6 Address:</source>
-        <translation type="unfinished">Adreça I&Pv6:</translation>
+        <translation>Adreça I&Pv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Mostra l'adreça IPv6 de l'amfitrió d'este adaptador si IPv6 està suportat.</translation>
+        <translation>Gestiona l'adreça IPv6 de l'amfitrió d'este adaptador si IPv6 està suportat.</translation>
     </message>
     <message>
         <source>IPv6 Network Mask &Length:</source>
-        <translation type="unfinished">&Longitud de la màscara de xarxa IPv6:</translation>
+        <translation>&Longitud de la màscara de xarxa IPv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Mostra la longitud de l'adreça de la màscara de xarxa IPv6 de l'amfitrió per a este adaptador si IPv6 està suportat.</translation>
+        <translation>Gestiona la longitud de l'adreça de la màscara de xarxa IPv6 de l'amfitrió per a este adaptador si IPv6 està suportat.</translation>
     </message>
     <message>
         <source>&DHCP Server</source>
-        <translation type="unfinished">Servidor &DHCP</translation>
+        <translation>Servidor &DHCP</translation>
     </message>
     <message>
         <source>&Enable Server</source>
-        <translation type="unfinished">&Habilita el servidor</translation>
+        <translation>&Habilita el servidor</translation>
     </message>
     <message>
         <source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
-        <translation type="unfinished">Indica si el servidor DHCP està habilitat en iniciar de la màquina o no.</translation>
+        <translation>Indica si el servidor DHCP està habilitat en iniciar de la màquina o no.</translation>
     </message>
     <message>
         <source>Server Add&ress:</source>
-        <translation type="unfinished">Ad&reça del servidor:</translation>
+        <translation>Ad&reça del servidor:</translation>
     </message>
     <message>
         <source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça del servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça del servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>Server &Mask:</source>
-        <translation type="unfinished">&Màscara del servidor:</translation>
+        <translation>&Màscara del servidor:</translation>
     </message>
     <message>
         <source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra la màscara de xarxa del servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona la màscara de xarxa del servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>&Lower Address Bound:</source>
-        <translation type="unfinished">Adreça límit &inferior:</translation>
+        <translation>Adreça límit &inferior:</translation>
     </message>
     <message>
         <source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça límit inferior oferida pel servidor DHCP de la xarxa associada aquet adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça límit inferior oferida pel servidor DHCP de la xarxa associada aquet adaptador de només l'amfitrió.</translation>
     </message>
     <message>
         <source>&Upper Address Bound:</source>
-        <translation type="unfinished">Adreça límit &superior:</translation>
+        <translation>Adreça límit &superior:</translation>
     </message>
     <message>
         <source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Mostra l'adreça límit superior oferida pel servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
+        <translation>Gestiona l'adreça límit superior oferida pel servidor DHCP de la xarxa associada a este adaptador de només l'amfitrió.</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsNetworkDetailsNAT</name>
     <message>
         <source>NAT Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Detalls de la xarxa NAT</translation>
     </message>
     <message>
         <source>&Enable Network</source>
-        <translation type="unfinished"></translation>
+        <translation>&Activa la xarxa</translation>
     </message>
     <message>
         <source>Enable this NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Activa esta xarxa NAT.</translation>
     </message>
     <message>
         <source>Network &Name:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Nom de la Xarxa:</translation>
     </message>
     <message>
         <source>Holds the name for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el nom per esta xarxa.</translation>
     </message>
     <message>
         <source>Network &CIDR:</source>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa &CIDR:</translation>
     </message>
     <message>
         <source>Holds the CIDR for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el CIDR per esta xarxa.</translation>
     </message>
     <message>
         <source>Network Options:</source>
-        <translation type="unfinished"></translation>
+        <translation>Opcions de xarxa:</translation>
     </message>
     <message>
         <source>Supports &DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb &DHCP</translation>
     </message>
     <message>
         <source>Determines whether this network supports DHCP.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si la xarxa és compatible amb DHCP.</translation>
     </message>
     <message>
         <source>Supports &IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Compatible amb &IPv6</translation>
     </message>
     <message>
         <source>Determines whether this network supports IPv6.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si la xarxa és compatible amb IPv6.</translation>
     </message>
     <message>
         <source>Advertise Default IPv6 &Route</source>
-        <translation type="unfinished"></translation>
+        <translation>Publicita com a &camí IPv6 per defecte</translation>
     </message>
     <message>
         <source>Determines whether this network should be advertised as the default IPv6 route.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si esta xarxa s'hauria de publicitar com a un camí IPv6 per defecte.</translation>
     </message>
     <message>
         <source>Opens a window to manage port forwarding rules.</source>
-        <translation type="unfinished">Obri el diàleg per gestionar les regles de reenviament de ports.</translation>
+        <translation>Obri el diàleg per gestionar les regles de reenviament de ports.</translation>
     </message>
     <message>
         <source>&Port Forwarding</source>
-        <translation type="unfinished">Reenviament de &ports</translation>
+        <translation>Reenviament de &ports</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsPortForwardingDlg</name>
     <message>
         <source>Port Forwarding Rules</source>
-        <translation type="unfinished">Regles de redireccionament de ports</translation>
+        <translation>Regles de redireccionament de ports</translation>
     </message>
     <message>
         <source>IPv4</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv4</translation>
     </message>
     <message>
         <source>IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv6</translation>
     </message>
 </context>
 <context>
@@ -3913,11 +3922,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No proxy host is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap servidor intermediari d'amfitrió.</translation>
     </message>
     <message>
         <source>No proxy port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port de servidor intermediari.</translation>
     </message>
 </context>
 <context>
@@ -3982,71 +3991,71 @@ p, li { white-space: pre-wrap; }
     <name>UIHostComboEditor</name>
     <message>
         <source><key_%1></source>
-        <translation type="unfinished"><key_%1></translation>
+        <translation><key_%1></translation>
     </message>
     <message>
         <source>Left </source>
-        <translation type="unfinished">Esquerra</translation>
+        <translation>Esquerra</translation>
     </message>
     <message>
         <source>Right </source>
-        <translation type="unfinished">Dreta</translation>
+        <translation>Dreta</translation>
     </message>
     <message>
         <source>Left Shift</source>
-        <translation type="unfinished">Tecla de majúscules esquerra</translation>
+        <translation>Tecla de majúscules esquerra</translation>
     </message>
     <message>
         <source>Right Shift</source>
-        <translation type="unfinished">Tecla de majúscules dreta</translation>
+        <translation>Tecla de majúscules dreta</translation>
     </message>
     <message>
         <source>Left Ctrl</source>
-        <translation type="unfinished">Control esquerra</translation>
+        <translation>Control esquerra</translation>
     </message>
     <message>
         <source>Right Ctrl</source>
-        <translation type="unfinished">Control dreta</translation>
+        <translation>Control dreta</translation>
     </message>
     <message>
         <source>Left Alt</source>
-        <translation type="unfinished">Alt esquerra</translation>
+        <translation>Alt esquerra</translation>
     </message>
     <message>
         <source>Right Alt</source>
-        <translation type="unfinished">Alt dreta</translation>
+        <translation>Alt dreta</translation>
     </message>
     <message>
         <source>Left WinKey</source>
-        <translation type="unfinished">Tecla de Windows esquerra</translation>
+        <translation>Tecla de Windows esquerra</translation>
     </message>
     <message>
         <source>Right WinKey</source>
-        <translation type="unfinished">Tecla de Windows dreta</translation>
+        <translation>Tecla de Windows dreta</translation>
     </message>
     <message>
         <source>Menu key</source>
-        <translation type="unfinished">Tecla de menú</translation>
+        <translation>Tecla de menú</translation>
     </message>
     <message>
         <source>Alt Gr</source>
-        <translation type="unfinished">Alt Gr</translation>
+        <translation>Alt Gr</translation>
     </message>
     <message>
         <source>Caps Lock</source>
-        <translation type="unfinished">Bloq Majús</translation>
+        <translation>Bloq Majús</translation>
     </message>
     <message>
         <source>Scroll Lock</source>
-        <translation type="unfinished">Bloq Despl</translation>
+        <translation>Bloq Despl</translation>
     </message>
     <message>
         <source>Host+</source>
-        <translation type="unfinished"></translation>
+        <translation>Tecla amfitrió+</translation>
     </message>
     <message>
         <source>None</source>
-        <translation type="unfinished">Cap</translation>
+        <translation>Cap</translation>
     </message>
 </context>
 <context>
@@ -4233,22 +4242,22 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Reset shortcut to default</source>
-        <translation type="unfinished"></translation>
+        <translation>Reinicia la drecera al valor per defecte</translation>
     </message>
     <message>
         <source>Unset shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Desconfigura la drecera</translation>
     </message>
 </context>
 <context>
     <name>UIHotKeyTableModel</name>
     <message>
         <source>Name</source>
-        <translation type="unfinished">Nom</translation>
+        <translation>Nom</translation>
     </message>
     <message>
         <source>Shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Drecera</translation>
     </message>
 </context>
 <context>
@@ -4487,20 +4496,20 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
-        <translation type="unfinished"></translation>
+        <translation><nobr>Indica l'activitat de captura de vídeo:</nobr><br>%1</translation>
     </message>
     <message>
         <source><nobr><b>Video capture disabled</b></nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>S'ha desactivat la captura de vídeo</b></nobr></translation>
     </message>
     <message>
         <source><nobr><b>Video capture file:</b> %1</nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>Fitxer de captura de vídeo:</b> %1</nobr></translation>
     </message>
     <message>
         <source>Additional feature status:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></source>
         <comment>Virtualization Stuff LED</comment>
-        <translation type="unfinished"></translation>
+        <translation>Estat de característica addicional:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></translation>
     </message>
 </context>
 <context>
@@ -4574,10 +4583,18 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No Webcams Connected</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha connectat cap càmera web</translation>
     </message>
     <message>
         <source>No supported webcams connected to the host PC</source>
+        <translation>No hi ha cap càmera web compatible connecatada a l'ordinador amfitrió</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -4736,129 +4753,133 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Video &Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Captura de &vídeo</translation>
     </message>
     <message>
         <source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
-        <translation type="unfinished"></translation>
+        <translation>Quan estiga marcat, el VirtualBox enregistrarà la sessió a la màquina virtual en un fitxer de vídeo.</translation>
     </message>
     <message>
         <source>&Enable Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>&Activa la captura de vídeo</translation>
     </message>
     <message>
         <source>File &Path:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Camí al fitxer:</translation>
     </message>
     <message>
         <source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina el nom de fitxer que el VirtualBox utilitza per alçar el contingut enregistrat.</translation>
     </message>
     <message>
         <source>Frame &Size:</source>
-        <translation type="unfinished"></translation>
+        <translation>Mida del &marc:</translation>
     </message>
     <message>
         <source>This setting determines the resolution (frame size) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina la resolució (mida del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina la resolució <b>horitzontal</b> (amplada del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina la resolució <b>vertical</b> (alçada del marc) del vídeo enregistrat.</translation>
     </message>
     <message>
         <source>&Frame Rate:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Marcs per segon:</translation>
     </message>
     <message>
         <source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina el nombre màxim de <b>marcs per segon</b>. Els marcs addicionals s'ignoraran. En reduir este valor s'incrementarà el nombre de marcs que s'ignoraran i reduirà la mida del fitxer.</translation>
     </message>
     <message>
         <source>&Quality:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Qualitat:</translation>
     </message>
     <message>
         <source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina la <b>qualitat</b>. En incrementar-lo farà que el vídeo es veja millor però amb una mida de fitxer més gran.</translation>
     </message>
     <message>
         <source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Este paràmetre determina la taxa de bits en <b>kilobits per segon</b>. En incrementar-lo farà que el vídeo es veja millor però amb una mida de fitxer més gran.</translation>
     </message>
     <message>
         <source>&Screens:</source>
-        <translation type="unfinished"></translation>
+        <translation>Pantalle&s:</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració gràfica per maquinari. Tot i així, el sistema amfitrió no proveeix això i no podreu iniciar la màquina.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual té actualment assignada una memòria de vídeo inferior a <b>%1</b>, que és la quantitat mínima requerida per canviar al mode de pantalla completa o mode fluid.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual té actualment assignada una memòria de vídeo inferior a <b>%1</b>, que és la quantitat mínima requerida per poder reproduir eficientment el vídeo d'alta resolució.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració gràfica i el sistema operatiu suggerit és Windows Vista o posterior. Per a un millor rendiment hauríeu d'establir la memòria de vídeo almenys a <b>%1</b>.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina virtual està configurada per utilitzar l'acceleració de flux de vídeo. Atès que esta característica només funciona amb Windows, el sistema client es desactivarà.</translation>
     </message>
     <message>
         <source>The VRDE server port value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat el valor del port del servidor VRDE.</translation>
     </message>
     <message>
         <source>The VRDE authentication timeout value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat el valor de temps d'espera d'autenticació VRDE.</translation>
     </message>
     <message>
         <source>User Defined</source>
-        <translation type="unfinished"></translation>
+        <translation>Definit per l'usuari</translation>
     </message>
     <message>
         <source>%1 fps</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 fps</translation>
     </message>
     <message>
         <source>fps</source>
-        <translation type="unfinished"></translation>
+        <translation>fps</translation>
     </message>
     <message>
         <source>low</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>baixa</translation>
     </message>
     <message>
         <source>medium</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>mitjana</translation>
     </message>
     <message>
         <source>high</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>alta</translation>
     </message>
     <message>
         <source>kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>kbps</translation>
     </message>
     <message>
         <source>Screen %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Pantalla %1</translation>
     </message>
     <message>
         <source>Enable video recording for screen %1.</source>
+        <translation>Activa l'enregistrament de vídeo per a la pantalla %1.</translation>
+    </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -5118,11 +5139,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No name specified for the virtual machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat cap màquina virtual.</translation>
     </message>
     <message>
         <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La recomanació del sistema operatiu de la màquina virtual és de tipus 64-bit. Els sistemes client de 64-bit requereixen la virtualització per maquinari i per tant això s'activarà automàticament si confirmeu els canvis.</translation>
     </message>
 </context>
 <context>
@@ -5277,7 +5298,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Holds the TAP interface name.</source>
-        <translation type="obsolete">Mostra el nom de la intefície TAP.</translation>
+        <translation type="obsolete">Mostra el nom de la interfície TAP.</translation>
     </message>
     <message>
         <source>&Setup Application:</source>
@@ -5377,35 +5398,35 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No bridged network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap adaptador de xarxa pont.</translation>
     </message>
     <message>
         <source>No internal network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha especificat cap nom de xarxa interna.</translation>
     </message>
     <message>
         <source>No host-only network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap adaptador de xarxa de només amfitrió.</translation>
     </message>
     <message>
         <source>No generic driver is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha seleccionat cap controlador genèric.</translation>
     </message>
     <message>
         <source>The MAC address must be 12 hexadecimal digits long.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'adreça MAC ha de tindre 12 dígits hexadecimals.</translation>
     </message>
     <message>
         <source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
-        <translation type="unfinished"></translation>
+        <translation>El segon dígit a l'adreça MAC no pot ser senar ja que només es permeten adreces unicast.</translation>
     </message>
     <message>
         <source>No NAT network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Actualment no s'ha especificat cap nom de xarxa NAT.</translation>
     </message>
     <message>
         <source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
-        <translation type="unfinished"></translation>
+        <translation>Gestiona el nom de la xarxa NAT que és on es connectarà la targeta de xarxa. Podeu crear o eliminar xarxes fent servir els paràmetres globals de xarxa a la finestra de gestió de màquines virtuals.</translation>
     </message>
 </context>
 <context>
@@ -5582,23 +5603,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap IRQ.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port d'E/S.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Dos o més ports tenen els mateixos paràmetres.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap camí de port.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'han proveït dos camins de ports duplicats.</translation>
     </message>
 </context>
 <context>
@@ -5771,7 +5792,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Window</source>
-        <translation type="unfinished"></translation>
+        <translation>Finestra</translation>
     </message>
 </context>
 <context>
@@ -5866,23 +5887,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap IRQ.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap port d'E/S.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Dos o més ports tenen els mateixos paràmetres.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha proveït cap camí de port.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>S'han proveït dos camins de ports duplicats.</translation>
     </message>
 </context>
 <context>
@@ -5985,7 +6006,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No hard disk is selected for <i>%1</i>.</source>
-        <translation type="unfinished">No hi ha cap disc dur seleccionat per a <i>%1</i>.</translation>
+        <translation>No hi ha cap disc dur seleccionat per a <i>%1</i>.</translation>
     </message>
     <message>
         <source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -6319,19 +6340,19 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No name is currently specified for the controller at position <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha especificat cap nom per al controlador de la posició <b>%1</b>.</translation>
     </message>
     <message>
         <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>El controlador de la posició <b>%1</b> fa servir el nom que ja fa servir el controlador de la posició <b>%2</b>.</translation>
     </message>
     <message>
         <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
-        <translation type="unfinished"></translation>
+        <translation><i>%1</i> fa servir el disc dur que es troba connectat a <i>%2</i>.</translation>
     </message>
     <message>
         <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
-        <translation type="unfinished"></translation>
+        <translation>La màquina té assignats més controladors d'emmagatzematge del que els xips %1 són compatibles. Canvieu el tipus de xip a la pàgina de paràmetres del sistema o reduïu el nombre dels controladors següents d'emmagatzematge a la pàgina de paràmetres d'emmagatzematge: %2</translation>
     </message>
 </context>
 <context>
@@ -6555,47 +6576,47 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Pointing Device:</source>
-        <translation type="unfinished"></translation>
+        <translation>Dispositiu del &punter:</translation>
     </message>
     <message>
         <source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
-        <translation type="unfinished"></translation>
+        <translation>Determina si el dispositiu del cursor és un ratolí PS/2 estàndard, una tauleta USB o una tauleta multitàctil USB.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Més de <b>%1%</b> de la memòria (<b>%2</b>) de l'ordinador amfitrió està assignada a la màquina virtual. No s'ha deixat suficient memòria per al sistema operatiu amfitrió. Seleccioneu una quantitat inferior.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Més de <b>%1%</b> de la memòria (<b>%2</b>) de l'ordinador amfitrió està assignada a la màquina virtual. Això podria no deixar suficient memòria per al sistema operatiu amfitrió. Considereu seleccionar una quantitat inferior.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La característica E/S APIC no està habilitada a la secció placa mare de la pàgina Sistema. Això és necessari per la compatibilitat amb un xip del tipus ICH9. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'emulació del controlador USB no s'ha habilitat al a pàgina USB. Això és necessari per la compatibilitat amb un dispositiu d'entrada USB. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Per raons de rendiment, el nombre dels processadors virtuals connectats a la màquina virtual no pot ser més del doble del nombre de processadors físics de l'amfitrió (<b>%1</b>). Reduïu el nombre de processadors virtuals.</translation>
     </message>
     <message>
         <source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hi ha més processadors virtuals connectats a la màquina virtual que el nombre de processadors físics de l'amfitrió (<b>%1</b>). Això pot afectar al rendiment de la màquina virtual. Considereu reduir-ne el nombre de processadors virtuals.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La característica E/S APIC no està habilitada a la secció placa mare de la pàgina Sistema. Això és necessari per la compatibilitat amb un processador virtual. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>La virtualització de maquinari no està habilitada a la secció Acceleració de la pàgina Sistema. Això és necessari per la compatibilitat amb més d'un processador virtual. Es farà automàticament si confirmeu els canvis.</translation>
     </message>
     <message>
         <source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
-        <translation type="unfinished"></translation>
+        <translation>El cap d'execució del processador està establer a un valor baix. Això pot fer paréixer que la màquina va lenta. </translation>
     </message>
 </context>
 <context>
@@ -6731,7 +6752,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>L'USB 2.0 es troba activat per a esta màquina virtual. Tot i així, això requereix la instal·lació de <b>%1</b>. Instal·leu el paquet d'extensions des del lloc web de baixades del VirtualBox o desactiveu la compabilitat USB 2.0 per iniciar la màquina.</translation>
     </message>
 </context>
 <context>
@@ -7365,7 +7386,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Insert</source>
         <comment>additions</comment>
-        <translation type="unfinished">Munta</translation>
+        <translation>Munta</translation>
     </message>
     <message>
         <source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -8146,7 +8167,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
-        <translation type="unfinished"><p>Pareix que les Guest Additions del VirtualBox no estan disponibles en esta màquina i les carpetes compartides no es poden fer servir sense elles. Per fer servir carpetes compartides a la màquina virtual, instal·leu les Guest Additions si no es troben instal·lades o torneu a instal·lar-les si no estan funcionant correctament seleccionant <b>Instal·la les Guest Additions</b> al menú <b>Màquina</b>. Si es troben instal· [...]
+        <translation><p>Pareix que les Guest Additions del VirtualBox no estan disponibles en esta màquina i les carpetes compartides no es poden fer servir sense elles. Per fer servir carpetes compartides a la màquina virtual, instal·leu les Guest Additions si no es troben instal·lades o torneu a instal·lar-les si no estan funcionant correctament seleccionant <b>Instal·la les Guest Additions</b> al menú <b>Màquina</b>. Si es troben instal·lades però la màqu [...]
     </message>
     <message>
         <source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8449,220 +8470,220 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut iniciar el gestor del VirtualBox degut a restriccions locals.</p><p>Es tancarà l'aplicació.</p></translation>
     </message>
     <message>
         <source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer de llengua per a la llengua <b>%1</b> al directori <b><nobr>%2</nobr></b>.</p><p>La llengua es reiniciarà temporalment a la llengua per defecte del sistema. Aneu a la finestra de <b>Preferències</b> que podeu obrir des del menú <b>Fitxer</b> de la finestra del gestor del VirtualBox i seleccioneu una de les llengües existents a la pàgina <b>Llengü [...]
     </message>
     <message>
         <source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer de llengua per a la llengua <b><nobr>%1</nobr></b>.</p><p>La llengua es reiniciarà temporalment l'anglés (per defecte). Aneu a la finestra de <b>Preferències</b> que podeu obrir des del menú <b>Fitxer</b> de la finestra del gestor del VirtualBox i seleccioneu una de les llengües existents a la pàgina <b>Llengües</b>.</p></translation>
     </message>
     <message>
         <source>There is no virtual machine with the identifier <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No existeix cap màquina virtual amb este identificador <b>%1</b>.</translation>
     </message>
     <message>
         <source>Ignore</source>
-        <translation type="unfinished">Ignora</translation>
+        <translation>Ignora</translation>
     </message>
     <message>
         <source>Failed to create NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear la xarxa NAT.</translation>
     </message>
     <message>
         <source>Failed to remove NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut eliminar la xarxa NAT <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to create DHCP server.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear el servidor DHCP.</translation>
     </message>
     <message>
         <source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear el servidor DHCP per a la interfície <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to create the host network interface.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut crear la interfície de xarxa de l'amfitrió.</translation>
     </message>
     <message>
         <source>Create &new disk</source>
-        <translation type="unfinished">Crea un disc &nou</translation>
+        <translation>Crea un disc &nou</translation>
     </message>
     <message>
         <source>&Choose existing disk</source>
-        <translation type="unfinished">&Tria un disc existent</translation>
+        <translation>&Tria un disc existent</translation>
     </message>
     <message>
         <source>Leave &empty</source>
-        <translation type="unfinished">Deixa-ho &buit</translation>
+        <translation>Deixa-ho &buit</translation>
     </message>
     <message>
         <source>&Choose disk</source>
-        <translation type="unfinished">Tria un dis&c</translation>
+        <translation>Tria un dis&c</translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc dur virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc òptic virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Esteu segur que voleu alliberar el disc floppy virtual <nobr><b>%1</b></nobr>?</p><p>Això el separarà de les màquines virtuals següents: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc dur virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos durs coneguts?</p></translation>
     </message>
     <message>
         <source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Atès que no es pot accedir a este disc dur, no es pot eliminar el fitxer d'imatge.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc òptic virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos coneguts?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu eliminar el disc floppy virtual <nobr><b>%1</b></nobr> de la llista d'imatges de discos coneguts?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut inserir el disc òptic virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force insertion of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu provar a forçar la inserció d'este disc?</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut expulsar el disc òptic virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force ejection of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu provar a forçar l'expulsió d'este disc?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut inserir el disc floppy virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut expulsar el disc floppy virtual <nobr><b>%1</b></nobr> a la màquina <b>%2</b>.</p></translation>
     </message>
     <message>
         <source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc dur <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc òptic <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut obrir el fitxer de disc floppy <nobr><b>%1</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc dur <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc òptic <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message>
         <source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut tancar el fitxer de disc floppy <nobr><b>%2</b></nobr>.</translation>
     </message>
     <message numerus="yes">
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform><p>La màquina virtual %n es troba en un estat alçat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de la màquina virtual exportada. Tingueu en compte que la màquina existent no canviarà.</p></numerusform>
+            <numerusform><p>Les %n màquines virtuals es troben en un estat alçat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de les màquines virtuals exportades. Tingueu en compte que les màquines existent no canviaran.</p></numerusform>
+            <numerusform><p>Les %n màquines virtuals es troben en un estat alçat <b>%1</b></p><p>Si continueu, es descartarà l'estat en temps d'execució de les màquines virtuals exportades. Tingueu en compte que les màquines existent no canviaran.</p></numerusform>
         </translation>
     </message>
     <message>
         <source>Switch</source>
-        <translation type="unfinished">Canvia</translation>
+        <translation>Canvia</translation>
     </message>
     <message>
         <source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut activar el servidor d'escriptori remot per a esta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desactivar el servidor d'escriptori remot per a esta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut activar la captura de vídeo per a esta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desactivar la captura de vídeo per a esta màquina virtual <b>%1</b>.</translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el fitxer d'imatge de les VirtualBox Guest Additions.</nobr></p><p>Voleu baixar la imatge de cd des de la xarxa?</p></translation>
     </message>
     <message>
         <source>Download</source>
-        <translation type="unfinished">Baixa</translation>
+        <translation>Baixa</translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu baixar la imatge del VirtualBox Guest Additions des de  <nobr><a href="%1">%1</a></nobr> (mida %2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> però no s'ha pogut alçar localment com a <nobr><b>%2</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>S'ha baixat la imatge del VirtualBox Guest Additions des de <nobr><a href="%1">%1</a></nobr> i s'ha alçat localment com a <nobr><b>%2</b>.</nobr></p><p>Voleu registrar esta imatge de CD i montar-la a la unitat virtual de CD/DVD?</p></translation>
     </message>
     <message>
         <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No es pot inserir la imatge del cd instal·lador de les Guest Additions a la màquina virtual <b>%1</b> si la màquina no té dispositius CD/DVD. Afegiu un dispositiu fent servir la pestanya de discos durs als paràmetres de la màquina.</p></translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>No s'ha pogut trobar el manual d'usuari del VirtualBox <nobr><b>%1</b>.</nobr></p><p>Voleu baixar este fitxer des d'Internet?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Segur que voleu baixar el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> (mida %2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%2</a></nobr> però no s'ha pogut alçar localment com a <nobr><b>%3</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> però no s'ha pogut alçar localment com a <nobr><b>%2</b>.</nobr></p><p>Trieu una altra ubicació per al fitxer.</p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
-        <translation type="unfinished"><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%2</a></nobr> i s'ha alçat localment com a <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>S'ha baixat el manual d'usuari del VirtualBox des de <nobr><a href="%1">%1</a></nobr> i s'ha alçat localment com a <nobr><b>%2</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="unfinished">Tanca</translation>
+        <translation>Tanca</translation>
     </message>
     <message>
         <source>Ok</source>
-        <translation type="unfinished">D'acord</translation>
+        <translation>D'acord</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
-        <translation type="unfinished">No tornes a mostrar este missatge</translation>
+        <translation>No tornes a mostrar este missatge</translation>
     </message>
     <message>
         <source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Voleu eliminar la xarxa NAT <nobr><b>%1</b>?</nobr></p><p>Si esta xarxa està en ús per un o més adaptadors de màquines virtuals, estos adaptadors ja no es podran utilitzar fins que corregiu els paràmetres triant un nom de xarxa diferent o un tipus d'adaptador diferent.</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -8676,15 +8697,15 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut afegir la càmera web <b>%1</b> a la màquina virtual <b>%2</b>.</translation>
     </message>
     <message>
         <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha pogut desconnectar la càmera web <b>%1</b> a la màquina virtual <b>%2</b>.</translation>
     </message>
     <message>
         <source><p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>La pantalla virtual utilitza actualment el mode de color <b>%1&nbsp;bit</b>. Per obtindre un millor rendiment, canvieu això a <b>%2&nbsp;bit</b>. Això es pot fer des de la secció <b>Pantalla</b> del tauler de control del sistema operatiu client o des dels paràmetres del sistema.</p></translation>
     </message>
 </context>
 <context>
@@ -8736,19 +8757,19 @@ p, li { white-space: pre-wrap; }
     <name>UIMiniToolBar</name>
     <message>
         <source>Always show the toolbar</source>
-        <translation type="unfinished">Mostra sempre la barra d'eines</translation>
+        <translation>Mostra sempre la barra d'eines</translation>
     </message>
     <message>
         <source>Minimize Window</source>
-        <translation type="unfinished">Minimitza la finestra</translation>
+        <translation>Minimitza la finestra</translation>
     </message>
     <message>
         <source>Exit Full Screen or Seamless Mode</source>
-        <translation type="unfinished">Ix del mode de pantalla completa o del mode fluid</translation>
+        <translation>Ix del mode de pantalla completa o del mode fluid</translation>
     </message>
     <message>
         <source>Close VM</source>
-        <translation type="unfinished">Tanca la màquina virtual</translation>
+        <translation>Tanca la màquina virtual</translation>
     </message>
 </context>
 <context>
@@ -8825,7 +8846,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>The network operation failed with the following error: %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ha fallat la operació de xarxa i s'ha proveït l'error següent: %1.</translation>
     </message>
 </context>
 <context>
@@ -8852,27 +8873,27 @@ p, li { white-space: pre-wrap; }
     <name>UINetworkReplyPrivate</name>
     <message>
         <source>Host not found</source>
-        <translation type="unfinished"></translation>
+        <translation>No s'ha trobat l'amfitrió</translation>
     </message>
     <message>
         <source>Content access denied</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha denegat l'accés al contingut</translation>
     </message>
     <message>
         <source>Protocol failure</source>
-        <translation type="unfinished"></translation>
+        <translation>S'ha produït un error de protocol</translation>
     </message>
     <message>
         <source>Wrong SSL certificate format</source>
-        <translation type="unfinished"></translation>
+        <translation>El format del certificat SSL és erroni</translation>
     </message>
     <message>
         <source>SSL authentication failed</source>
-        <translation type="unfinished"></translation>
+        <translation>Ha fallat l'autenticació SSL</translation>
     </message>
     <message>
         <source>Unknown reason</source>
-        <translation type="unfinished"></translation>
+        <translation>Es desconeix la raó</translation>
     </message>
 </context>
 <context>
@@ -9771,7 +9792,7 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
     <name>UIPopupCenter</name>
     <message>
         <source>Click for full details</source>
-        <translation type="unfinished"></translation>
+        <translation>Feu clic per mostrar els detalls complets</translation>
     </message>
 </context>
 <context>
@@ -9949,11 +9970,11 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
     </message>
     <message>
         <source><b>%1</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b> pàgina:</translation>
     </message>
     <message>
         <source><b>%1: %2</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1: %2</b> pàgina:</translation>
     </message>
 </context>
 <context>
@@ -10750,39 +10771,39 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
     </message>
     <message>
         <source>Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Paràmetres d'emmagatzematge</translation>
     </message>
     <message>
         <source>Please choose a file to export the virtual appliance to</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on exportar l'aplicació virtual</translation>
     </message>
     <message>
         <source>F&ormat:</source>
-        <translation type="unfinished"></translation>
+        <translation>F&ormat:</translation>
     </message>
     <message>
         <source>OVF 0.9</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 0.9</translation>
     </message>
     <message>
         <source>OVF 1.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 1.0</translation>
     </message>
     <message>
         <source>OVF 2.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 2.0</translation>
     </message>
     <message>
         <source>Write in standard OVF 1.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Escriu en format estàndard OVF 1.0.</translation>
     </message>
     <message>
         <source>Write in new experimental OVF 2.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Escriu en format experimental OVF 2.0.</translation>
     </message>
     <message>
         <source>&Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>&Paràmetres d'emmagatzematge</translation>
     </message>
 </context>
 <context>
@@ -10801,14 +10822,14 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
     </message>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on s'ha d'exportar l'aplicació virtual...</translation>
     </message>
 </context>
 <context>
     <name>UIWizardExportAppPageExpert</name>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu un fitxer on exportar l'aplicació virtual...</translation>
     </message>
 </context>
 <context>
@@ -10878,15 +10899,15 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
     </message>
     <message>
         <source>Import Virtual Appliance</source>
-        <translation type="unfinished"></translation>
+        <translation>Importa l'aplicació virtual</translation>
     </message>
     <message>
         <source>Choose a virtual appliance file to import...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu l'aplicació virtual que s'ha d'importar...</translation>
     </message>
     <message>
         <source>Please choose a virtual appliance file to import</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu l'aplicació virtual que s'ha d'importar</translation>
     </message>
 </context>
 <context>
@@ -12165,7 +12186,7 @@ Versió %1</translation>
     </message>
     <message>
         <source>Choose...</source>
-        <translation type="unfinished"></translation>
+        <translation>Trieu...</translation>
     </message>
 </context>
 <context>
@@ -12176,7 +12197,7 @@ Versió %1</translation>
     </message>
     <message>
         <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
-        <translation type="unfinished">El camí actual per defecte es mostrarà després d'acceptar els canvis i obrir este diàleg novament. </translation>
+        <translation>El camí actual per defecte es mostrarà després d'acceptar els canvis i obrir este diàleg novament. </translation>
     </message>
     <message>
         <source><not selected></source>
@@ -14093,60 +14114,60 @@ Versió %1</translation>
     <message>
         <source>Enabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Activat</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Desactivat</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
         <comment>details report</comment>
-        <translation type="unfinished"></translation>
+        <translation>Execució no restringida</translation>
     </message>
     <message>
         <source>PS/2 Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí PS/2</translation>
     </message>
     <message>
         <source>USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí USB</translation>
     </message>
     <message>
         <source>PS/2 and USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ratolí PS/2 i USB</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
-        <translation type="unfinished"></translation>
+        <translation>Execució no restringida</translation>
     </message>
     <message>
         <source>USB Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Tablet USB</translation>
     </message>
     <message>
         <source>USB Multi-Touch Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Tablet USB multitàctil</translation>
     </message>
     <message>
         <source>NAT Network</source>
         <comment>NetworkAttachmentType</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT</translation>
     </message>
     <message>
         <source>NAT network, '%1'</source>
         <comment>details report (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Xarxa NAT, «%1»</translation>
     </message>
     <message>
         <source>You can create or add disk image files in the virtual machine settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Podeu crear o afegir fitxers d'imatge de disc als paràmetres de la màquina virtual.</translation>
     </message>
     <message>
         <source>USB</source>
@@ -16526,11 +16547,11 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation>
     </message>
     <message>
         <source>Configuration &Details</source>
-        <translation type="unfinished"></translation>
+        <translation>&Detalls de configuració</translation>
     </message>
     <message>
         <source>&Runtime Information</source>
-        <translation type="unfinished"></translation>
+        <translation>Informació del &temps d'execució</translation>
     </message>
 </context>
 <context>
@@ -16625,7 +16646,7 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation>
     </message>
     <message>
         <source>Holds the TAP interface name.</source>
-        <translation type="obsolete">Mostra el nom de la intefície TAP.</translation>
+        <translation type="obsolete">Mostra el nom de la interfície TAP.</translation>
     </message>
     <message>
         <source>&Enable Network Adapter</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
index 4bcf154..13b45c6 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
@@ -1015,6 +1015,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Síť</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4537,6 +4541,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4818,6 +4830,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>Povolí nahrávání videa pro obrazovku %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
index 5bf0c24..03e6e83 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
@@ -319,7 +319,7 @@
     </message>
     <message>
         <source>Show Session Information Window</source>
-        <translation type="unfinished">Vis sessionsinformation</translation>
+        <translation>Vis sessionsinformation</translation>
     </message>
     <message>
         <source>&Pause</source>
@@ -411,11 +411,11 @@
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
-        <translation type="unfinished">&Installér Gæstetilføjelser...</translation>
+        <translation>&Indsæt Gæstetilføjelser CD-aftryk...</translation>
     </message>
     <message>
         <source>Insert the Guest Additions disk file into the virtual drive</source>
-        <translation type="unfinished">Monterer CD'en med Gæstetilføjelser</translation>
+        <translation>Indsæt CD-aftrykket med Gæstetilføjelser i det virtuelle drev</translation>
     </message>
     <message>
         <source>De&bug</source>
@@ -434,7 +434,7 @@
     <message>
         <source>&Logging...</source>
         <comment>debug action</comment>
-        <translation type="unfinished">&Logger...</translation>
+        <translation>&Logger...</translation>
     </message>
     <message>
         <source>&Help</source>
@@ -903,51 +903,51 @@
     </message>
     <message>
         <source>Drag'n'Drop</source>
-        <translation type="unfinished"></translation>
+        <translation>Træk og slip</translation>
     </message>
     <message>
         <source>Save the machine state of the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Gem tilstanden af den virtuelle maskine</translation>
     </message>
     <message>
         <source>Power off the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Sluk den virtuelle maskine</translation>
     </message>
     <message>
         <source>&Network Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>&Netværksindstillinger...</translation>
     </message>
     <message>
         <source>&Shared Folders Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Ind&stillinger for Delte mapper...</translation>
     </message>
     <message>
         <source>R&emote Display</source>
-        <translation type="unfinished"></translation>
+        <translation>Fj&ernskærm</translation>
     </message>
     <message>
         <source>Toggle remote desktop (RDP) connections to this machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Slå fjernskærmsforbindelser (RDP) til denne maskine til/fra</translation>
     </message>
     <message>
         <source>&Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>&Videooptagelse</translation>
     </message>
     <message>
         <source>Toggle video capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Videooptagelse til/fra</translation>
     </message>
     <message>
         <source>&Video Capture Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>Indstillinger for &Videooptagelse...</translation>
     </message>
     <message>
         <source>Configure video capture settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Konfigurer videooptagelse</translation>
     </message>
     <message>
         <source>Popup Menu</source>
-        <translation type="unfinished"></translation>
+        <translation>Pop op menu</translation>
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
@@ -961,6 +961,10 @@
     </message>
     <message>
         <source>&Webcams</source>
+        <translation>&Webcams</translation>
+    </message>
+    <message>
+        <source>Network</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -2385,62 +2389,62 @@ p, li { white-space: pre-wrap; }
     <message>
         <source><b>%1</b></source>
         <comment>Group item tool-tip / Group name</comment>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b></translation>
     </message>
     <message numerus="yes">
         <source>%n group(s)</source>
         <comment>Group item tool-tip / Group info</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>%n gruppe</numerusform>
+            <numerusform>%n grupper</numerusform>
         </translation>
     </message>
     <message>
         <source><nobr>%1</nobr></source>
         <comment>Group item tool-tip / Group info wrapper</comment>
-        <translation type="unfinished"><nobr>%1</nobr></translation>
+        <translation><nobr>%1</nobr></translation>
     </message>
     <message numerus="yes">
         <source>%n machine(s)</source>
         <comment>Group item tool-tip / Machine info</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>%n maskine</numerusform>
+            <numerusform>%n maskiner</numerusform>
         </translation>
     </message>
     <message numerus="yes">
         <source>(%n running)</source>
         <comment>Group item tool-tip / Running machine info</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
-            <numerusform></numerusform>
+        <translation>
+            <numerusform>(%n kører)</numerusform>
+            <numerusform>(%n kører)</numerusform>
         </translation>
     </message>
     <message>
         <source><nobr>%1</nobr></source>
         <comment>Group item tool-tip / Machine info wrapper</comment>
-        <translation type="unfinished"><nobr>%1</nobr></translation>
+        <translation><nobr>%1</nobr></translation>
     </message>
     <message>
         <source><nobr>%1 %2</nobr></source>
         <comment>Group item tool-tip / Machine info wrapper, including running</comment>
-        <translation type="unfinished"><nobr>%1</nobr> {1 %2<?}</translation>
+        <translation><nobr>%1 %2</nobr></translation>
     </message>
     <message>
         <source>Collapse group</source>
-        <translation type="unfinished"></translation>
+        <translation>Sammenfold gruppe</translation>
     </message>
     <message>
         <source>Expand group</source>
-        <translation type="unfinished"></translation>
+        <translation>Udvid gruppe</translation>
     </message>
     <message>
         <source>Enter group</source>
-        <translation type="unfinished"></translation>
+        <translation>Gå til gruppe</translation>
     </message>
     <message>
         <source>Exit group</source>
-        <translation type="unfinished"></translation>
+        <translation>Forlad gruppe</translation>
     </message>
 </context>
 <context>
@@ -2710,31 +2714,31 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Video Capture File</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Videooptagelsesfil</translation>
     </message>
     <message>
         <source>Video Capture Attributes</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Egenskaber for videooptagelse</translation>
     </message>
     <message>
         <source>Video Capture</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Videooptagelse</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Slået fra</translation>
     </message>
     <message>
         <source>NAT Network, '%1'</source>
         <comment>details (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>NAT-netværk, '%1'</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>Opløsning: %1x%2, billeder/sek: %3fps, Bitrate: %4kbps</translation>
     </message>
 </context>
 <context>
@@ -3043,7 +3047,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Extension Packages</source>
-        <translation type="unfinished"></translation>
+        <translation>Udvid&elsespakker</translation>
     </message>
 </context>
 <context>
@@ -3102,27 +3106,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Dock and Menubar:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Dok og Menulinje:</translation>
     </message>
     <message>
         <source>Auto-Show in Fullscreen</source>
-        <translation type="unfinished"></translation>
+        <translation>Vis på fuldskærm</translation>
     </message>
     <message>
         <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hvis markeret, vil værtens Dok og Menulinje blive vist, når den virtuelle maskine er i fuldskærmstilstand.</translation>
     </message>
     <message>
         <source>&Host Screensaver:</source>
-        <translation type="unfinished"></translation>
+        <translation>Værtens pauseskærm:</translation>
     </message>
     <message>
         <source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hvis markeret, vil værtens pauseskærm blive slået fra når mindst én virtual maskine kører.</translation>
     </message>
     <message>
         <source>Disable When Running Virtual Machines</source>
-        <translation type="unfinished"></translation>
+        <translation>Slå fra, når der kører virtuelle maskiner</translation>
     </message>
 </context>
 <context>
@@ -3161,27 +3165,27 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Host Key Combination</source>
-        <translation type="unfinished"></translation>
+        <translation>Værtstast-kombination</translation>
     </message>
     <message>
         <source>Some items have the same shortcuts assigned.</source>
-        <translation type="unfinished"></translation>
+        <translation>Flere elementer tildelt samme genvej.</translation>
     </message>
     <message>
         <source>&VirtualBox Manager</source>
-        <translation type="unfinished"></translation>
+        <translation>&VirtualBox Manager</translation>
     </message>
     <message>
         <source>Virtual &Machine</source>
-        <translation type="unfinished"></translation>
+        <translation>Virtuel &maskine</translation>
     </message>
     <message>
         <source>Lists all the available shortcuts which can be configured.</source>
-        <translation type="unfinished"></translation>
+        <translation>Viser alle tilgængelige genveje, der kan konfigureres.</translation>
     </message>
     <message>
         <source>Enter a sequence to filter the shortcut list.</source>
-        <translation type="unfinished"></translation>
+        <translation>Tast en sekvens for at filtrere genvejslisten.</translation>
     </message>
 </context>
 <context>
@@ -3240,7 +3244,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Interface Languages</source>
-        <translation type="unfinished"></translation>
+        <translation>Brugerflade-sprog</translation>
     </message>
 </context>
 <context>
@@ -3397,128 +3401,128 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&NAT Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>&NAT-netværk</translation>
     </message>
     <message>
         <source>Lists all available NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Viser tilgængelige NAT-netværk.</translation>
     </message>
     <message>
         <source>&Host-only Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>Interne netværk</translation>
     </message>
     <message>
         <source>No new name specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Intet nyt navn angivet for NAT-netværket <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Subnet ikke angivet for NAT-netværket <b>%1</b>.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Subnet ikke angivet for NAT-netværk tidligere navngivet <b>%1</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ugyldigt subnet angivet (<i>%1</i>) for NAT-netværk <b>%2</b>.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ugyldigt subnet (<i>%1</i>) angivet for NAT-netværk tidligere navngivet <b>%2</b>.</translation>
     </message>
     <message>
         <source>Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Netværksnavn</translation>
     </message>
     <message>
         <source>[empty]</source>
-        <translation type="unfinished"></translation>
+        <translation>[tom]</translation>
     </message>
     <message>
         <source>%1 (renamed from %2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 (omdøbt fra %2)</translation>
     </message>
     <message>
         <source>Old Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Gammelt netværksnavn</translation>
     </message>
     <message>
         <source>New Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>Nyt netværksnavn</translation>
     </message>
     <message>
         <source>Network CIDR</source>
-        <translation type="unfinished"></translation>
+        <translation>Subnet-maske</translation>
     </message>
     <message>
         <source>Supports DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Understøtter DHCP</translation>
     </message>
     <message>
         <source>yes</source>
-        <translation type="unfinished"></translation>
+        <translation>ja</translation>
     </message>
     <message>
         <source>no</source>
-        <translation type="unfinished"></translation>
+        <translation>nej</translation>
     </message>
     <message>
         <source>Supports IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Understøtter IPv6</translation>
     </message>
     <message>
         <source>Default IPv6 route</source>
-        <translation type="unfinished"></translation>
+        <translation>Standard IPv6 rute</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig IPv4-adresse.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig IPv4-netværksmaske.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig IPv6-adresse.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig DHCP-serveradresse.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig DHCP-server maske.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig nedre grænse for DHCP-adresser.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værts-netværkskort (<i>%1</i>) har ikke en gyldig øvre grænse for DHCP-adresser.</translation>
     </message>
     <message>
         <source>The name <b>%1</b> is being used for several NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Navnet <b>%1</b> bruges af flere forskellige NAT-netværk.</translation>
     </message>
     <message>
         <source>Active</source>
         <comment>NAT network</comment>
-        <translation type="unfinished">Aktiv</translation>
+        <translation>Aktivt</translation>
     </message>
     <message>
         <source>&Add NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>Tilføj N&AT-netværk</translation>
     </message>
     <message>
         <source>&Remove NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>Fje&rn NAT-netværk</translation>
     </message>
     <message>
         <source>&Edit NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>Tilr&et NAT-netværk</translation>
     </message>
 </context>
 <context>
@@ -3620,177 +3624,177 @@ p, li { white-space: pre-wrap; }
     <name>UIGlobalSettingsNetworkDetailsHost</name>
     <message>
         <source>Host-only Network Details</source>
-        <translation type="unfinished">Detaljer for værtsbegrænset netværk</translation>
+        <translation>Detaljer for værtsbegrænset netværk</translation>
     </message>
     <message>
         <source>&Adapter</source>
-        <translation type="unfinished">Netværkskort</translation>
+        <translation>Netværkskort</translation>
     </message>
     <message>
         <source>Manual &Configuration</source>
-        <translation type="unfinished">Manuel konfiguration</translation>
+        <translation>Manuel konfiguration</translation>
     </message>
     <message>
         <source>Use manual configuration for this host-only network adapter.</source>
-        <translation type="unfinished">Konfigurér værtsbegrænset netværkskort manuelt.</translation>
+        <translation>Brug manuel konfiguration for værtsbegrænset netværkskort.</translation>
     </message>
     <message>
         <source>&IPv4 Address:</source>
-        <translation type="unfinished">&IPv4-adresse:</translation>
+        <translation>&IPv4-adresse:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 address for this adapter.</source>
-        <translation type="unfinished">Viser værtens IPv4-adresse for dette netværkskort.</translation>
+        <translation>Viser værtens IPv4-adresse for dette netværkskort.</translation>
     </message>
     <message>
         <source>IPv4 Network &Mask:</source>
-        <translation type="unfinished">IPv4-netværks&maske:</translation>
+        <translation>IPv4-netværks&maske:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 network mask for this adapter.</source>
-        <translation type="unfinished">Viser værtens IPv4-netværksmaske for dette netværkskort.</translation>
+        <translation>Viser værtens IPv4-netværksmaske for dette netværkskort.</translation>
     </message>
     <message>
         <source>I&Pv6 Address:</source>
-        <translation type="unfinished">I&Pv6-adresse:</translation>
+        <translation>I&Pv6-adresse:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Viser værtens IPv6-adresse for dette netværkskort.</translation>
+        <translation>Viser værtens IPv6-adresse for dette netværkskort, hvis IPv6 er understøttet.</translation>
     </message>
     <message>
         <source>IPv6 Network Mask &Length:</source>
-        <translation type="unfinished">&Længde på IPv6-netværksmaske:</translation>
+        <translation>&Længde på IPv6-netværksmaske:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">Viser præfix-længden af værtens IPv6-netværksmaske for dette netværkskort, hvis IPv6 understøttes.</translation>
+        <translation>Viser præfix-længden af værtens IPv6-netværksmaske for dette netværkskort, hvis IPv6 er understøttet.</translation>
     </message>
     <message>
         <source>&DHCP Server</source>
-        <translation type="unfinished">&DHCP-server</translation>
+        <translation>&DHCP-server</translation>
     </message>
     <message>
         <source>&Enable Server</source>
-        <translation type="unfinished"></translation>
+        <translation>Aktiv&er server</translation>
     </message>
     <message>
         <source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
-        <translation type="unfinished">Viser om DHCP-serveren aktiveres ved opstart.</translation>
+        <translation>Viser om DHCP-serveren aktiveres ved opstart.</translation>
     </message>
     <message>
         <source>Server Add&ress:</source>
-        <translation type="unfinished">Serverad&resse:</translation>
+        <translation>Serverad&resse:</translation>
     </message>
     <message>
         <source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Viser DHCP-serverens adresse på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
+        <translation>Viser adressen på DHCP-serveren, der servicerer netværket for det værtsbegrænsede netværkskort.</translation>
     </message>
     <message>
         <source>Server &Mask:</source>
-        <translation type="unfinished">Server-&maske:</translation>
+        <translation>Server-&maske:</translation>
     </message>
     <message>
         <source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Viser DHCP-serverens netværksmaske på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
+        <translation>Viser DHCP-serverens netværksmaske på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
     </message>
     <message>
         <source>&Lower Address Bound:</source>
-        <translation type="unfinished">Nedre grænse for adresser:</translation>
+        <translation>Nedre grænse for adresser:</translation>
     </message>
     <message>
         <source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Viser DHCP-serverens nedre grænse for adresser på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
+        <translation>Viser DHCP-serverens nedre grænse for adresser på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
     </message>
     <message>
         <source>&Upper Address Bound:</source>
-        <translation type="unfinished">Øvre grænse for adresser:</translation>
+        <translation>Øvre grænse for adresser:</translation>
     </message>
     <message>
         <source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">Viser DHCP-serverens øvre grænse for adresser på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
+        <translation>Viser DHCP-serverens øvre grænse for adresser på netværket tilknyttet det værtsbegrænsede netværkskort.</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsNetworkDetailsNAT</name>
     <message>
         <source>NAT Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Detaljer for NAT-netværk</translation>
     </message>
     <message>
         <source>&Enable Network</source>
-        <translation type="unfinished"></translation>
+        <translation>Aktivér n&etværk</translation>
     </message>
     <message>
         <source>Enable this NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Aktiverer dette NAT-netværk</translation>
     </message>
     <message>
         <source>Network &Name:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Netværksnavn:</translation>
     </message>
     <message>
         <source>Holds the name for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Viser netværkets navn.</translation>
     </message>
     <message>
         <source>Network &CIDR:</source>
-        <translation type="unfinished"></translation>
+        <translation>Subnet-maske:</translation>
     </message>
     <message>
         <source>Holds the CIDR for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Viser subnet-masken for dette netværk</translation>
     </message>
     <message>
         <source>Network Options:</source>
-        <translation type="unfinished"></translation>
+        <translation>Netværksindstillinger:</translation>
     </message>
     <message>
         <source>Supports &DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>Understøtter &DHCP</translation>
     </message>
     <message>
         <source>Determines whether this network supports DHCP.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer om netværket understøtter DHCP.</translation>
     </message>
     <message>
         <source>Supports &IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>Understøtter &IPv6</translation>
     </message>
     <message>
         <source>Determines whether this network supports IPv6.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer om netværket understøtter IPv6.</translation>
     </message>
     <message>
         <source>Advertise Default IPv6 &Route</source>
-        <translation type="unfinished"></translation>
+        <translation>Indstil som standard IPv6-&rute</translation>
     </message>
     <message>
         <source>Determines whether this network should be advertised as the default IPv6 route.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer om dette netværk skal være standard IPv6-rute.</translation>
     </message>
     <message>
         <source>Opens a window to manage port forwarding rules.</source>
-        <translation type="unfinished">Opsæt regler for viderestilling af porte.</translation>
+        <translation>Opsæt regler for viderestilling af porte.</translation>
     </message>
     <message>
         <source>&Port Forwarding</source>
-        <translation type="unfinished">&Port-viderestilling</translation>
+        <translation>&Port-viderestilling</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsPortForwardingDlg</name>
     <message>
         <source>Port Forwarding Rules</source>
-        <translation type="unfinished">Regler for port-viderestilling</translation>
+        <translation>Regler for port-viderestilling</translation>
     </message>
     <message>
         <source>IPv4</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv4</translation>
     </message>
     <message>
         <source>IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv6</translation>
     </message>
 </context>
 <context>
@@ -3801,7 +3805,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Enable Proxy</source>
-        <translation>Brug proxy</translation>
+        <translation>Anv&end proxy</translation>
     </message>
     <message>
         <source>Ho&st:</source>
@@ -3845,11 +3849,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No proxy host is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Proxy-adresse ikke angivet.</translation>
     </message>
     <message>
         <source>No proxy port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Proxy-port ikke angivet.</translation>
     </message>
 </context>
 <context>
@@ -3914,71 +3918,71 @@ p, li { white-space: pre-wrap; }
     <name>UIHostComboEditor</name>
     <message>
         <source><key_%1></source>
-        <translation type="unfinished"><tast_%1></translation>
+        <translation><tast_%1></translation>
     </message>
     <message>
         <source>Left </source>
-        <translation type="unfinished">Venstre</translation>
+        <translation>Venstre </translation>
     </message>
     <message>
         <source>Right </source>
-        <translation type="unfinished">Højre</translation>
+        <translation>Højre </translation>
     </message>
     <message>
         <source>Left Shift</source>
-        <translation type="unfinished">Venstre Shift</translation>
+        <translation>Venstre Shift</translation>
     </message>
     <message>
         <source>Right Shift</source>
-        <translation type="unfinished">Højre Shift</translation>
+        <translation>Højre Shift</translation>
     </message>
     <message>
         <source>Left Ctrl</source>
-        <translation type="unfinished">Venstre Ctrl</translation>
+        <translation>Venstre Ctrl</translation>
     </message>
     <message>
         <source>Right Ctrl</source>
-        <translation type="unfinished">Højre Ctrl</translation>
+        <translation>Højre Ctrl</translation>
     </message>
     <message>
         <source>Left Alt</source>
-        <translation type="unfinished">Venstre Alt</translation>
+        <translation>Venstre Alt</translation>
     </message>
     <message>
         <source>Right Alt</source>
-        <translation type="unfinished">Højre Alt</translation>
+        <translation>Højre Alt</translation>
     </message>
     <message>
         <source>Left WinKey</source>
-        <translation type="unfinished">Venstre Windows-tast</translation>
+        <translation>Venstre Windows-tast</translation>
     </message>
     <message>
         <source>Right WinKey</source>
-        <translation type="unfinished">Højre Windows-tast</translation>
+        <translation>Højre Windows-tast</translation>
     </message>
     <message>
         <source>Menu key</source>
-        <translation type="unfinished">Menu tast</translation>
+        <translation>Menu tast</translation>
     </message>
     <message>
         <source>Alt Gr</source>
-        <translation type="unfinished">Alt Gr</translation>
+        <translation>AltGr</translation>
     </message>
     <message>
         <source>Caps Lock</source>
-        <translation type="unfinished">Caps Lock</translation>
+        <translation>Caps Lock</translation>
     </message>
     <message>
         <source>Scroll Lock</source>
-        <translation type="unfinished">Scroll Lock</translation>
+        <translation>Scroll Lock</translation>
     </message>
     <message>
         <source>Host+</source>
-        <translation type="unfinished"></translation>
+        <translation>Vært+</translation>
     </message>
     <message>
         <source>None</source>
-        <translation type="unfinished">Ingen</translation>
+        <translation>Ingen</translation>
     </message>
 </context>
 <context>
@@ -4167,22 +4171,22 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Reset shortcut to default</source>
-        <translation type="unfinished"></translation>
+        <translation>Nulstil genvej til standard</translation>
     </message>
     <message>
         <source>Unset shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Fjern genvej</translation>
     </message>
 </context>
 <context>
     <name>UIHotKeyTableModel</name>
     <message>
         <source>Name</source>
-        <translation type="unfinished">Navn</translation>
+        <translation>Navn</translation>
     </message>
     <message>
         <source>Shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>Genvej</translation>
     </message>
 </context>
 <context>
@@ -4425,20 +4429,20 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
-        <translation type="unfinished"></translation>
+        <translation><nobr>Indikerer aktiv videooptagelse:</nobr><br>%1</translation>
     </message>
     <message>
         <source><nobr><b>Video capture disabled</b></nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>Videooptagelse deaktiveret</b></nobr></translation>
     </message>
     <message>
         <source><nobr><b>Video capture file:</b> %1</nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>Videooptagelsesfil:</b> %1</nobr></translation>
     </message>
     <message>
         <source>Additional feature status:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></source>
         <comment>Virtualization Stuff LED</comment>
-        <translation type="unfinished"></translation>
+        <translation>Status for udvidelser:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></translation>
     </message>
 </context>
 <context>
@@ -4512,10 +4516,18 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No Webcams Connected</source>
-        <translation type="unfinished"></translation>
+        <translation>Ingen webcams tilsluttede</translation>
     </message>
     <message>
         <source>No supported webcams connected to the host PC</source>
+        <translation>Ingen understøttede webcams forbundet til værtsmaskinen</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -4674,129 +4686,133 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Video &Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Videooptagelse</translation>
     </message>
     <message>
         <source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hvis markeret, vil VirtualBox optage sessionen i den virtuelle maskine i en videofil.</translation>
     </message>
     <message>
         <source>&Enable Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>Slå vid&eooptagelse til</translation>
     </message>
     <message>
         <source>File &Path:</source>
-        <translation type="unfinished"></translation>
+        <translation>Filsti:</translation>
     </message>
     <message>
         <source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer navnet på filen som Virtualbox gemmer det optagede indhold i.</translation>
     </message>
     <message>
         <source>Frame &Size:</source>
-        <translation type="unfinished"></translation>
+        <translation>Oplø&sning:</translation>
     </message>
     <message>
         <source>This setting determines the resolution (frame size) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer opløsningen (billedstørrelsen) for optagelsen.</translation>
     </message>
     <message>
         <source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer den <b>vandrette</b> opløsning (punkter pr.linje) for optagelsen.</translation>
     </message>
     <message>
         <source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer den <b>lodrette</b> opløsning (antal linjer) for optagelsen.</translation>
     </message>
     <message>
         <source>&Frame Rate:</source>
-        <translation type="unfinished"></translation>
+        <translation>Billed&frekvens:</translation>
     </message>
     <message>
         <source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Sætter den øvre grænse for <b>billeder pr.sekund</b>. Yderligere billeder droppes. Jo lavere værdi, jo flere billeder droppes, hvilket reducerer størrelsen på filen, der optages til.</translation>
     </message>
     <message>
         <source>&Quality:</source>
-        <translation type="unfinished"></translation>
+        <translation>Kvalitet:</translation>
     </message>
     <message>
         <source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer <b>kvaliteten</b>. Jo højere værdi, jo bedre vil optagelsen se ud, men filen, der optages til, vil også fylde mere.</translation>
     </message>
     <message>
         <source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer bithastigheden i <b>kilobits pr.sekund</b>. Jo højere værdi, jo bedre vil optagelsen se ud, men filen, der optages til, vil også fylde mere.</translation>
     </message>
     <message>
         <source>&Screens:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Skærme:</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den virtuelle maskine er konfigureret til at bruge hardwareacceleration, men da værtsmaskinen ikke tilbyder dette for øjeblikket, vil du ikke kunne starte maskinen.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du har tildelt mindre end <b>%1</b> til grafikhukommelse, som ellers er den mindste mængde, der tillader den virtuelle maskine at skifte til fuldskærm eller rammefri tilstand.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du har tildelt mindre end <b>%1</b> til grafikhukommelse, som ellers er den mindste mængde, der kræves for effektiv afspilning af HD video.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den virtuelle maskine er konfigureret til at bruge grafikacceleration og operativsystem-typen er sat til Windows Vista eller nyere. For den bedste ydeevne bør du sætte maskinens grafikhukommelse til mindst <b>%1</b>.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den virtuelle maskine er konfigureret til at bruge Video Stream Acceleration. Da dette kræver Windows som gæsteoperativsystem, deaktiveres VSA.</translation>
     </message>
     <message>
         <source>The VRDE server port value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Værdien for VRDE-serverporten er ikke angivet.</translation>
     </message>
     <message>
         <source>The VRDE authentication timeout value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Tidsgrænsen for VRDE-autentifikation er ikke angivet.</translation>
     </message>
     <message>
         <source>User Defined</source>
-        <translation type="unfinished"></translation>
+        <translation>Brugerdefineret</translation>
     </message>
     <message>
         <source>%1 fps</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 fps</translation>
     </message>
     <message>
         <source>fps</source>
-        <translation type="unfinished"></translation>
+        <translation>fps</translation>
     </message>
     <message>
         <source>low</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>Lav</translation>
     </message>
     <message>
         <source>medium</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>Mellem</translation>
     </message>
     <message>
         <source>high</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>Høj</translation>
     </message>
     <message>
         <source>kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>kbps</translation>
     </message>
     <message>
         <source>Screen %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Skærm %1</translation>
     </message>
     <message>
         <source>Enable video recording for screen %1.</source>
+        <translation>Slå videooptagelse til for skærm %1. </translation>
+    </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -4889,11 +4905,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No name specified for the virtual machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>Navn for virtuel maskine ikke angivet.</translation>
     </message>
     <message>
         <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den virtuelle maskines operativsystem-type er sat til 64-bit. 64-bit gæsteoperativsystemer kræver hardware-virtualisering, så dette aktiveres automatiskt hvis du bekræfter ændringerne.</translation>
     </message>
 </context>
 <context>
@@ -5038,35 +5054,35 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No bridged network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du skal vælge en netværksbro.</translation>
     </message>
     <message>
         <source>No internal network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du skal angive et navn til det interne netværk.</translation>
     </message>
     <message>
         <source>No host-only network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du skal vælge et værtsbegrænset netværkskort.</translation>
     </message>
     <message>
         <source>No generic driver is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>Generisk driver ikke valgt.</translation>
     </message>
     <message>
         <source>The MAC address must be 12 hexadecimal digits long.</source>
-        <translation type="unfinished"></translation>
+        <translation>MAC-adressen skal bestå af 12 hexadecimale tegn.</translation>
     </message>
     <message>
         <source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
-        <translation type="unfinished"></translation>
+        <translation>Det andet tegn i MAC-adressen må ikke være ulige, da kun unicast-adresser er tilladt.</translation>
     </message>
     <message>
         <source>No NAT network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du skal angive et navn til NAT-netværket.</translation>
     </message>
     <message>
         <source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
-        <translation type="unfinished"></translation>
+        <translation>Indtast navnet på NAT-netværket som dette netværkskort skal forbindes til. Du kan oprette og fjerne netværk via globale indstillinger for netværk i Virtuel Maskine Håndtering.</translation>
     </message>
 </context>
 <context>
@@ -5168,23 +5184,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>IRQ ikke angivet.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>I/O port ikke angivet.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>To eller flere porte har samme værdier.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Portsti ikke angivet.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den samme portsti er angivet flere gange.</translation>
     </message>
 </context>
 <context>
@@ -5357,7 +5373,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Window</source>
-        <translation type="unfinished"></translation>
+        <translation>Vindue</translation>
     </message>
 </context>
 <context>
@@ -5448,23 +5464,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>IRQ ikke angivet.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>I/O port ikke angivet.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>To eller flere porte har samme værdier.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Portsti ikke angivet.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>Den samme portsti er angivet flere gange.</translation>
     </message>
 </context>
 <context>
@@ -5555,7 +5571,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>No hard disk is selected for <i>%1</i>.</source>
-        <translation type="unfinished">Ingen harddisk er valgt for <i>%1</i>.</translation>
+        <translation>Ingen harddisk er valgt for <i>%1</i>.</translation>
     </message>
     <message>
         <source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5886,23 +5902,23 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Controller: %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Styreenhed: %1</translation>
     </message>
     <message>
         <source>No name is currently specified for the controller at position <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Navn ikke angivet for styreenheden på position <b>%1</b>.</translation>
     </message>
     <message>
         <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styreenheden på position <b>%1</b> har samme navn som styreenheden på position <b>%2</b>.</translation>
     </message>
     <message>
         <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
-        <translation type="unfinished"></translation>
+        <translation><i>%1</i> bruger en disk, der allerede er tilsluttet til <i>%2</i></translation>
     </message>
     <message>
         <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
-        <translation type="unfinished"></translation>
+        <translation>Maskinen har flere lager-styreenheder tildelt end et %1 chipset understøtter. Tilpas chipset-typen under System-indstillinger eller formindsk antallet af de følgende lager-styreenheder under Lager-indstillinger: %2</translation>
     </message>
 </context>
 <context>
@@ -6126,47 +6142,47 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>&Pointing Device:</source>
-        <translation type="unfinished"></translation>
+        <translation>&Pegeredskab:</translation>
     </message>
     <message>
         <source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
-        <translation type="unfinished"></translation>
+        <translation>Styrer om pegeredskabet emulerer en standard PS/2 mus, en USB-tablet eller en USB-tablet med multi-touch.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mere end <b>%1%</b> af værtens hukommelse (<b>%2</b>) er tildelt den virtuelle maskine. Dermed er der ikke hukommelse nok til værtens eget operativsystem. Vælg en lavere værdi.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>Mere end <b>%1%</b> af værtens hukommelse (<b>%2</b>) er tildelt den virtuelle maskine. Der er muligvis ikke hukommelse nok tilbage til værtens eget operativsystem. Overvej en lavere tildeling.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>I/O APIC-funktionen er ikke aktiveret under System->Bundkort. Dette kræves for at understøtte et ICH9-chipsæt. Aktivering sker automatisk, hvis du gemmer dine ændringer.</translation>
     </message>
     <message>
         <source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>Emulering af en USB-styreenhed er ikke aktiveret under System->USB. Dette kræves for at emulere en USB inputenhed. Aktivering sker automatisk, hvis du gemmer dine ændringer.</translation>
     </message>
     <message>
         <source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Af ydelsesmæssige grunde, kan antallet af virtuelle CPU'er tildelt en virtuel maskine ikke overstige 2 gange antallet af fysiske CPU'er i værten (<b>%1</b>). Nedsæt antallet af virtuelle CPU'er.</translation>
     </message>
     <message>
         <source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>Antallet af virtuelle CPU'er tildelt den virtuelle maskine overstiger antallet af fysiske CPU'er i værten (<b>%1</b>). Dette vil sandsynligvis påvirke den virtuelle maskines ydelse negativt. Overvej derfor at nedsætte antallet af virtuelle CPU'er.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>I/O APIC-funktionen er ikke aktiveret under System->Bundkort. Dette kræves for at understøtte flere virtuelle CPU'er. Aktivering sker automatisk, hvis du gemmer dine ændringer.</translation>
     </message>
     <message>
         <source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>Hardware-virtualisering er ikke aktiveret under System->Acceleration. Dette kræves for at understøtte flere virtuelle CPU'er. Aktivering sker automatisk, hvis du gemmer dine ændringer.</translation>
     </message>
     <message>
         <source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du har sat ydelsesbegrænsningen til en lav værdi. Maskinen kan føles langsom.</translation>
     </message>
 </context>
 <context>
@@ -6302,7 +6318,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>USB 2.0 er aktiveret for denne virtuelle maskine, men dette kræver at <b>%1</b> installeres. Installér udvidelsespakken fra VirtualBox' hjemmeside eller deaktivér USB 2.0 for at kunne starte maskinen.</translation>
     </message>
 </context>
 <context>
@@ -6803,7 +6819,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Insert</source>
         <comment>additions</comment>
-        <translation type="unfinished">Montér</translation>
+        <translation>Montér</translation>
     </message>
     <message>
         <source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -7550,7 +7566,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
-        <translation type="unfinished"><p>VirtualBox Gæstetilføjelser er tilsyneladende ikke tilgængelige på denne virtuelle maskine og delte mapper fungerer ikke uden. For at kunne anvende delte mapper i den virtuelle maskine, skal du installere gæstetilføjelserne, hvis de ikke er installeret eller geninstallere, hvis de ikke fungerer korrekt ved at vælge <b>Installér gæstetilføjelser</b> fra menuen <b>Enheder</b>. Delte mapper vil først være tilgængelige,  [...]
+        <translation><p>VirtualBox Gæstetilføjelser er tilsyneladende ikke tilgængelige på denne virtuelle maskine og delte mapper fungerer ikke uden. For at kunne anvende delte mapper i den virtuelle maskine, skal du installere gæstetilføjelserne, hvis de ikke er installeret eller geninstallere, hvis de ikke fungerer korrekt ved at vælge <b>Installér gæstetilføjelser</b> fra menuen <b>Enheder</b>. Delte mapper er først tilgængelige, når maskinen er startet  [...]
     </message>
     <message>
         <source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -7856,219 +7872,219 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kan ikke starte VirtualBox Håndtering grundet lokale begrænsninger.</p><p>Applikationen afsluttes.</p></translation>
     </message>
     <message>
         <source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke finde en fil indeholdende sproget <b>%1</b> i kataloget <b><nobr>%2</nobr></b>.</p><p>Applikationen vil midlertidigt bruge systemets standardsprog. Vælg et installeret sprog i sektionen <b>Sprog</b> tilgængelig via menupunktet <b>Indstillinger</b> i menuen <b>Fil</b> i VirtualBox Håndtering.</p></translation>
     </message>
     <message>
         <source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke åbne sprogfilen <b><nobr>%1</nobr></b>. <p>VirtualBox vil derfor midlertidigt bruge engelsk. Du kan vælge det rigtige sprog i afsnittet <b>Sprog</b> tilgængelig via menupunktet <b>Indstillinger</b> i menuen <b>Fil</b>i VirtualBox Håndtering.</p></translation>
     </message>
     <message>
         <source>There is no virtual machine with the identifier <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Der er ingen virtuel maskine ved navn <b>%1</b>.</translation>
     </message>
     <message>
         <source>Ignore</source>
-        <translation type="unfinished">Ignorer</translation>
+        <translation>Ignorer</translation>
     </message>
     <message>
         <source>Failed to create NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke oprette NAT-netværk.</translation>
     </message>
     <message>
         <source>Failed to remove NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke nedlægge NAT-netværk <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to create DHCP server.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke oprette DHCP-server.</translation>
     </message>
     <message>
         <source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke nedlægge DHCP-server for netværkskort <b>%1</b>. </translation>
     </message>
     <message>
         <source>Failed to create the host network interface.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke oprette værtsbegrænset netværkskort.</translation>
     </message>
     <message>
         <source>Create &new disk</source>
-        <translation type="unfinished">Opret &ny disk</translation>
+        <translation>Opret &ny disk</translation>
     </message>
     <message>
         <source>&Choose existing disk</source>
-        <translation type="unfinished">Vælg eksisterende disk</translation>
+        <translation>Vælg eksisterende disk</translation>
     </message>
     <message>
         <source>Leave &empty</source>
-        <translation type="unfinished">Ing&en disk</translation>
+        <translation>Ing&en disk</translation>
     </message>
     <message>
         <source>&Choose disk</source>
-        <translation type="unfinished">Vælg disk</translation>
+        <translation>Vælg disk</translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil frigive den virtuelle disk <nobr><b>%1</b></nobr>?</p><p>Det vil fjerne den fra disse virtuelle maskiner: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil frigive den virtuelle optiske disk <nobr><b>%1</b></nobr>?</p><p>Det vil fjerne den fra disse virtuelle maskiner: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil frigive den virtuelle diskette <nobr><b>%1</b></nobr>?</p><p>Det vil fjerne den fra disse virtuelle maskiner: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil fjerne den virtuelle disk <nobr><b>%1</b></nobr> fra listen over kendte aftryk?</p></translation>
     </message>
     <message>
         <source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Da denne disk er utilgængelig, kan diskaftrykket ikke slettes.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil fjerne den virtuelle optiske disk <nobr><b>%1</b></nobr> fra listen over kendte aftryk?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil fjerne den virtuelle diskette <nobr><b>%1</b></nobr> fra listen over kendte aftryk?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke indsætte den virtuelle optiske disk <nobr><b>%1</b></nobr> i maskinen <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force insertion of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Vil du forsøge at gennemtvinge tilslutning af dette medie?</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke skubbe den virtuelle optiske disk <nobr><b>%1</b></nobr> ud i maskinen <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force ejection of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Vil du forsøge at gennemtvinge udskubning af dette medie?</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke indsætte den virtuelle diskette <nobr><b>%1</b></nobr> i maskinen <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke skubbe den virtuelle diskette <nobr><b>%1</b></nobr> ud i maskinen <b>%2</b>.</p></translation>
     </message>
     <message>
         <source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke åbne harddisk-aftrykket <nobr><b>%1</b></nobr>. </translation>
     </message>
     <message>
         <source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke åbne optisk-disk-aftrykket <nobr><b>%1</b></nobr>. </translation>
     </message>
     <message>
         <source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke åbne diskette-aftrykket <nobr><b>%1</b></nobr>. </translation>
     </message>
     <message>
         <source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke lukke harddisk-aftrykket <nobr><b>%2</b></nobr>. </translation>
     </message>
     <message>
         <source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke lukke optisk-disk-aftrykket <nobr><b>%2</b></nobr>. </translation>
     </message>
     <message>
         <source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke lukke diskette-aftrykket <nobr><b>%2</b></nobr>. </translation>
     </message>
     <message numerus="yes">
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <translation>
+            <numerusform><p>De virtuelle maskiner <b>%1</b> har gemte tilstande.</p><p>Hvis du fortsætter vil kørselstilstanden af de eksporterede maskiner blive kasseret. De øvrige maskiner ændres ikke.</p></numerusform>
             <numerusform></numerusform>
         </translation>
     </message>
     <message>
         <source>Switch</source>
-        <translation type="unfinished">Skift</translation>
+        <translation>Skift</translation>
     </message>
     <message>
         <source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke starte fjernskrivebord-servicen for den virtuelle maskine <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke stoppe fjernskrivebord-servicen for den virtuelle maskine <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke starte videooptagelse for den virtuelle maskine <b>%1</b>.</translation>
     </message>
     <message>
         <source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke stoppe videooptagelse for den virtuelle maskine <b>%1</b>.</translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke finde  <b>VirtualBox Gæstetilføjelser</b> diskaftrykket </p><p>Vil du hente det fra internettet?</p></translation>
     </message>
     <message>
         <source>Download</source>
-        <translation type="unfinished">Hent</translation>
+        <translation>Hent</translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil hente <b>VirtualBox Gæstetilføjelser</b> diskaftrykket fra <nobr><a href="%1">%1</a></nobr> (%2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p><b>VirtualBox Gæstetilføjelser</b> diskaftrykket er blevet hentet fra <nobr><a href="%1">%1</a></nobr> men kan ikke gemmes lokalt som <nobr><b>%2</b>.</nobr></p><p>Vælg en anden placering til filen.</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p><b>VirtualBox Gæstetilføjelser</b> diskaftrykket er blevet hentet fra <nobr><a href="%1">%1</a></nobr> og gemt lokalt som <nobr><b>%2</b>.</nobr></p><p>Vil du montere dette diskaftryk som et virtuelt CD/DVD-drev?</p></translation>
     </message>
     <message>
         <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke indsætte <b>VirtualBox Gæstetilføjelser</b> diskaftrykket i den virtuelle maskine <b>%1</b>, da maskinen ikke har et CD/DVD-drev. Tilføj et drev på siden Lagringsmedier i indstillingerne for den virtuelle maskine.</p></translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Kunne ikke finde <b>VirtualBox brugermanual</b> <nobr><b>%1</b>.</nobr></p><p>Ønsker du at hente denne fil fra internettet?</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Er du sikker på at du vil hente <b>VirtualBox brugermanual</b> fra <nobr><a href="%1">%1</a></nobr> (%2 bytes)?</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"><p>VirtualBox' brugermanual blev hentet fra <nobr><a href="%1">%2</a></nobr> men kunne ikke gemmes lokalt som <nobr><b>%3</b>.</nobr></p><p>Vælg venligtst en anden placering til filen.</p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>VirtualBox brugermanualen blev hentet fra <nobr><a href="%1">%1</a></nobr> men kunne ikke gemmes lokalt som <nobr><b>%2</b>.</nobr></p><p>Vælg venligst en anden placering til filen.</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
-        <translation type="unfinished"><p>VirtualBox' brugermanual blev hentet fra <nobr><a href="%1">%2</a></nobr> og gemt lokalt som <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>VirtualBox brugermanualen blev hentet fra <nobr><a href="%1">%1</a></nobr> og gemt lokalt som <nobr><b>%2</b>.</nobr></p></translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="unfinished">Luk</translation>
+        <translation>Luk</translation>
     </message>
     <message>
         <source>Ok</source>
-        <translation type="unfinished">OK</translation>
+        <translation>OK</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
-        <translation type="unfinished">Vis ikke denne besked igen</translation>
+        <translation>Vis ikke denne besked igen</translation>
     </message>
     <message>
         <source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Vil du fjerne NAT-netværket <nobr><b>%1</b>?</nobr></p><p>Hvis dette netværk bruges af en eller flere virtuelle maskiners netværkskort, vil disse netværkskort ikke fungere indtil du retter deres indstillinger enten ved at vælge et andet netværksnavn eller en anden forbindelsestype.</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -8082,15 +8098,15 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke tilslutte webkameraet <b>%1</b> til den virtuelle maskine <b>%2</b>.</translation>
     </message>
     <message>
         <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kunne ikke fjerne webkameraet <b>%1</b> fra den virtuelle maskine <b>%2</b>.</translation>
     </message>
     <message>
         <source><p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>Den virtuelle skærm er sat til <b>%1&nbsp;bit</b> farver. Brug i stedet <b>%2&nbsp;bit</b> for bedre ydelse. Dette kan normalt ændres via <b>Skærm</b>-indstillingerne i gæsteoperativsystemets kontrolpanel eller systemindstillinger.</p></translation>
     </message>
 </context>
 <context>
@@ -8153,19 +8169,19 @@ p, li { white-space: pre-wrap; }
     <name>UIMiniToolBar</name>
     <message>
         <source>Always show the toolbar</source>
-        <translation type="unfinished">Vis altid værktøjslinjen</translation>
+        <translation>Vis altid værktøjslinjen</translation>
     </message>
     <message>
         <source>Minimize Window</source>
-        <translation type="unfinished">Minimér vindue</translation>
+        <translation>Minimér vindue</translation>
     </message>
     <message>
         <source>Exit Full Screen or Seamless Mode</source>
-        <translation type="unfinished">Forlad fuldskærm/rammefri tilstand</translation>
+        <translation>Forlad fuldskærm/rammefri tilstand</translation>
     </message>
     <message>
         <source>Close VM</source>
-        <translation type="unfinished">Luk virtuel maskine</translation>
+        <translation>Luk virtuel maskine</translation>
     </message>
 </context>
 <context>
@@ -8242,7 +8258,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>The network operation failed with the following error: %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>Netværkshandlingen fejlede med følgende besked: %1</translation>
     </message>
 </context>
 <context>
@@ -8269,27 +8285,27 @@ p, li { white-space: pre-wrap; }
     <name>UINetworkReplyPrivate</name>
     <message>
         <source>Host not found</source>
-        <translation type="unfinished"></translation>
+        <translation>Vært ikke fundet</translation>
     </message>
     <message>
         <source>Content access denied</source>
-        <translation type="unfinished"></translation>
+        <translation>Adgang til indhold nægtet</translation>
     </message>
     <message>
         <source>Protocol failure</source>
-        <translation type="unfinished"></translation>
+        <translation>Protokolfejl</translation>
     </message>
     <message>
         <source>Wrong SSL certificate format</source>
-        <translation type="unfinished"></translation>
+        <translation>Forkert format af SSL-certifikat</translation>
     </message>
     <message>
         <source>SSL authentication failed</source>
-        <translation type="unfinished"></translation>
+        <translation>SSL-godkendelse fejlede</translation>
     </message>
     <message>
         <source>Unknown reason</source>
-        <translation type="unfinished"></translation>
+        <translation>Ukendt årsag</translation>
     </message>
 </context>
 <context>
@@ -8971,7 +8987,7 @@ p, li { white-space: pre-wrap; }
     <name>UIPopupCenter</name>
     <message>
         <source>Click for full details</source>
-        <translation type="unfinished"></translation>
+        <translation>Klik for alle detaljer</translation>
     </message>
 </context>
 <context>
@@ -9149,11 +9165,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source><b>%1</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b> side:</translation>
     </message>
     <message>
         <source><b>%1: %2</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1: %2</b> side:</translation>
     </message>
 </context>
 <context>
@@ -9937,39 +9953,39 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Lagerindstillinger</translation>
     </message>
     <message>
         <source>Please choose a file to export the virtual appliance to</source>
-        <translation type="unfinished"></translation>
+        <translation>Angiv filnavnet, det prækonfigurerede system skal gemmes under</translation>
     </message>
     <message>
         <source>F&ormat:</source>
-        <translation type="unfinished"></translation>
+        <translation>F&ormat:</translation>
     </message>
     <message>
         <source>OVF 0.9</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 0.9</translation>
     </message>
     <message>
         <source>OVF 1.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 1.0</translation>
     </message>
     <message>
         <source>OVF 2.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 2.0</translation>
     </message>
     <message>
         <source>Write in standard OVF 1.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Skriv i standard OVF 1.0-format.</translation>
     </message>
     <message>
         <source>Write in new experimental OVF 2.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>Skriv i nyt eksperimentelt OVF 2.0-format.</translation>
     </message>
     <message>
         <source>&Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>Lagerind&stillinger</translation>
     </message>
 </context>
 <context>
@@ -9988,14 +10004,14 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Angiv filnavnet, det prækonfigurerede system skal gemmes under...</translation>
     </message>
 </context>
 <context>
     <name>UIWizardExportAppPageExpert</name>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>Angiv filnavnet, det prækonfigurerede system skal gemmes under...</translation>
     </message>
 </context>
 <context>
@@ -10065,15 +10081,15 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Import Virtual Appliance</source>
-        <translation type="unfinished"></translation>
+        <translation>Importer virtuelt Prækonfigureret system</translation>
     </message>
     <message>
         <source>Choose a virtual appliance file to import...</source>
-        <translation type="unfinished"></translation>
+        <translation>Vælg en prækonfigureret system-fil til import...</translation>
     </message>
     <message>
         <source>Please choose a virtual appliance file to import</source>
-        <translation type="unfinished"></translation>
+        <translation>Vælg en prækonfigureret system-fil til import</translation>
     </message>
 </context>
 <context>
@@ -10861,7 +10877,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Choose...</source>
-        <translation type="unfinished"></translation>
+        <translation>Vælg...</translation>
     </message>
 </context>
 <context>
@@ -10872,7 +10888,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
-        <translation type="unfinished">Den korrekte standardsti vil blive vist når du accepterer ændringerne og åbner dette vindue igen.</translation>
+        <translation>Den korrekte standardsti vil blive vist når du accepterer ændringerne og åbner dette vindue igen.</translation>
     </message>
     <message>
         <source><not selected></source>
@@ -12622,60 +12638,60 @@ p, li { white-space: pre-wrap; }
     <message>
         <source>Enabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Aktiveret</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished"></translation>
+        <translation>Deaktiveret</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
         <comment>details report</comment>
-        <translation type="unfinished"></translation>
+        <translation>Ubegrænset afvikling</translation>
     </message>
     <message>
         <source>PS/2 Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>PS/2-mus</translation>
     </message>
     <message>
         <source>USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>USB-mus</translation>
     </message>
     <message>
         <source>PS/2 and USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>PS/2 og USB-mus</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
-        <translation type="unfinished"></translation>
+        <translation>Ubegrænset afvikling</translation>
     </message>
     <message>
         <source>USB Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>USB-tablet</translation>
     </message>
     <message>
         <source>USB Multi-Touch Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>USB-tablet med multitouch</translation>
     </message>
     <message>
         <source>NAT Network</source>
         <comment>NetworkAttachmentType</comment>
-        <translation type="unfinished"></translation>
+        <translation>NAT-netværk</translation>
     </message>
     <message>
         <source>NAT network, '%1'</source>
         <comment>details report (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>NAT-netværk, '%1'</translation>
     </message>
     <message>
         <source>You can create or add disk image files in the virtual machine settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>Du kan oprette og tilføje diskaftryk i Virtuel diskhåndtering.</translation>
     </message>
     <message>
         <source>USB</source>
@@ -13883,11 +13899,11 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <source>Configuration &Details</source>
-        <translation type="unfinished"></translation>
+        <translation>Konfigurations&detaljer</translation>
     </message>
     <message>
         <source>&Runtime Information</source>
-        <translation type="unfinished"></translation>
+        <translation>Kø&retidsinformation</translation>
     </message>
 </context>
 <context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
index f84e6a5..38b4ede 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
@@ -49,7 +49,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1573"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1576"/>
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
         <translation>
@@ -61,7 +61,7 @@
 <context>
     <name>VBoxGlobal</name>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="164"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="169"/>
         <source>%n year(s)</source>
         <translation>
             <numerusform>%n year</numerusform>
@@ -69,7 +69,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="169"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="174"/>
         <source>%n month(s)</source>
         <translation>
             <numerusform>%n month</numerusform>
@@ -77,7 +77,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="174"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="179"/>
         <source>%n day(s)</source>
         <translation>
             <numerusform>%n day</numerusform>
@@ -85,7 +85,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="179"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="184"/>
         <source>%n hour(s)</source>
         <translation>
             <numerusform>%n hour</numerusform>
@@ -93,7 +93,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="189"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="194"/>
         <source>%n second(s)</source>
         <translation>
             <numerusform>%n second</numerusform>
@@ -101,7 +101,7 @@
         </translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/VBoxGlobal.h" line="184"/>
+        <location filename="../src/globals/VBoxGlobal.h" line="189"/>
         <source>%n minute(s)</source>
         <translation>
             <numerusform>%n minute</numerusform>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
index 18c98b0..c9c1176 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
@@ -1055,6 +1055,10 @@
         <source>&Webcams</source>
         <translation>&Cámaras web</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Red</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4702,6 +4706,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation>No hay cámaras web soportadas conectadas al PC anfitrión</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -5011,6 +5023,10 @@ p, li { white-space: pre-wrap; }
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
         <translation>La máquina virtual usará aceleración de transferencia de vídeo. Como esta característica solo funciona con sistemas invitados Windows será deshabilitada.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
index c9f15af..b3eff47 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
@@ -861,6 +861,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Sarea</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3234,6 +3238,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -3487,6 +3499,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
index 8605ace..d2beb6f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
@@ -221,7 +221,7 @@
     </message>
     <message>
         <source>Show Session Information Window</source>
-        <translation type="unfinished">نمایش پنجره اطلاعات جلسه</translation>
+        <translation>نمایش پنجره اطلاعات جلسه</translation>
     </message>
     <message>
         <source>&Pause</source>
@@ -293,11 +293,11 @@
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
-        <translation type="unfinished">نصب افزون&ه مهمان...</translation>
+        <translation>نصب افزون&ه مهمان...</translation>
     </message>
     <message>
         <source>Insert the Guest Additions disk file into the virtual drive</source>
-        <translation type="unfinished">بارگیری ایمیج نصب افزونه مهمان</translation>
+        <translation>بارگیری ایمیج نصب افزونه مهمان</translation>
     </message>
     <message>
         <source>De&bug</source>
@@ -703,52 +703,52 @@
     </message>
     <message>
         <source>Save the machine state of the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>ذخیره وضعیت ماشین ِ،ماشین مجازی</translation>
     </message>
     <message>
         <source>Power off the virtual machine</source>
-        <translation type="unfinished"></translation>
+        <translation>قطع برق ماشین مجازی</translation>
     </message>
     <message>
         <source>&Network Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>&تنظیمات شبکه...</translation>
     </message>
     <message>
         <source>&Shared Folders Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>تنظیمات پوشه های &اشتراکی...</translation>
     </message>
     <message>
         <source>R&emote Display</source>
-        <translation type="unfinished"></translation>
+        <translation>&نمایش ریموت</translation>
     </message>
     <message>
         <source>Toggle remote desktop (RDP) connections to this machine</source>
-        <translation type="unfinished"></translation>
+        <translation>ضامن ارتباطات ریموت دسکتاپ (RDP) به این ماشین</translation>
     </message>
     <message>
         <source>&Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>&ضبط ویدئو</translation>
     </message>
     <message>
         <source>Toggle video capture</source>
-        <translation type="unfinished"></translation>
+        <translation>ضامن ضبط ویدیو</translation>
     </message>
     <message>
         <source>&Video Capture Settings...</source>
-        <translation type="unfinished"></translation>
+        <translation>&تنظیمات ضبط ویدئو...</translation>
     </message>
     <message>
         <source>Configure video capture settings</source>
-        <translation type="unfinished"></translation>
+        <translation>پیکربندی تنظیمات ضبط ویدئو</translation>
     </message>
     <message>
         <source>&Logging...</source>
         <comment>debug action</comment>
-        <translation type="unfinished"></translation>
+        <translation>&وقایع نگاری...</translation>
     </message>
     <message>
         <source>Popup Menu</source>
-        <translation type="unfinished"></translation>
+        <translation>منوی پرشی</translation>
     </message>
     <message>
         <source>&Insert Guest Additions CD image...</source>
@@ -762,7 +762,11 @@
     </message>
     <message>
         <source>&Webcams</source>
-        <translation type="unfinished"></translation>
+        <translation>&وب کم ها</translation>
+    </message>
+    <message>
+        <source>Network</source>
+        <translation>شبکه</translation>
     </message>
 </context>
 <context>
@@ -1560,31 +1564,31 @@
     <message>
         <source>Video Capture File</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>فیل ضبط ویدیو</translation>
     </message>
     <message>
         <source>Video Capture Attributes</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>صفات ضبط ویدیو</translation>
     </message>
     <message>
         <source>Video Capture</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished"></translation>
+        <translation>ضبط ویدیو</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details (display/video capture)</comment>
-        <translation type="unfinished">غیرفعال شده</translation>
+        <translation>غیرفعال شده</translation>
     </message>
     <message>
         <source>NAT Network, '%1'</source>
         <comment>details (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>شبکه NAT، '%1'</translation>
     </message>
     <message>
         <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>اندازه فریم: %1x%2, نرخ فریم: %3فریم بر ثانیه, نرخ بیت: %4کیلوبایت بر ثانیه</translation>
     </message>
 </context>
 <context>
@@ -1712,7 +1716,7 @@
     </message>
     <message>
         <source>&Extension Packages</source>
-        <translation type="unfinished"></translation>
+        <translation>&بسته افزونه</translation>
     </message>
 </context>
 <context>
@@ -1755,27 +1759,27 @@
     </message>
     <message>
         <source>&Dock and Menubar:</source>
-        <translation type="unfinished"></translation>
+        <translation>&داک و نوار منو:</translation>
     </message>
     <message>
         <source>Auto-Show in Fullscreen</source>
-        <translation type="unfinished"></translation>
+        <translation>نمایش خودکار در تمام صفحه</translation>
     </message>
     <message>
         <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>وقتیکه انتخاب شده،داک میزبان و نوار منو وقتیکه ماشین در حالت تمام صفحه است نشان داده خواهد شد.</translation>
     </message>
     <message>
         <source>&Host Screensaver:</source>
-        <translation type="unfinished"></translation>
+        <translation>محافظ صفحه نمایش میزبان&:</translation>
     </message>
     <message>
         <source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
-        <translation type="unfinished"></translation>
+        <translation>وقتیکه انتخاب شده،محافظ صفحه نمایش میزبان هرگاه ماشین مجازی در اجرا هست غیرفعال خواهد شد.</translation>
     </message>
     <message>
         <source>Disable When Running Virtual Machines</source>
-        <translation type="unfinished"></translation>
+        <translation>زمانیکه در حال اجرای ماشین های مجازی هست غیرفعال کن</translation>
     </message>
 </context>
 <context>
@@ -1806,27 +1810,27 @@
     </message>
     <message>
         <source>Host Key Combination</source>
-        <translation type="unfinished"></translation>
+        <translation>کلید ترکیبی میزبان</translation>
     </message>
     <message>
         <source>Some items have the same shortcuts assigned.</source>
-        <translation type="unfinished"></translation>
+        <translation>به برخی از موارد همین کلید های میانبر اختصاص یافته است.</translation>
     </message>
     <message>
         <source>&VirtualBox Manager</source>
-        <translation type="unfinished"></translation>
+        <translation>مدیر &ویرچوال باکس</translation>
     </message>
     <message>
         <source>Virtual &Machine</source>
-        <translation type="unfinished"></translation>
+        <translation>&ماشین مجازی</translation>
     </message>
     <message>
         <source>Lists all the available shortcuts which can be configured.</source>
-        <translation type="unfinished"></translation>
+        <translation>لیست همه میانبرهای موجود که میتواند پیکربندی شود.</translation>
     </message>
     <message>
         <source>Enter a sequence to filter the shortcut list.</source>
-        <translation type="unfinished"></translation>
+        <translation>یک دنباله برای فیلتر لیست میانبر وارد کنید</translation>
     </message>
 </context>
 <context>
@@ -1885,7 +1889,7 @@
     </message>
     <message>
         <source>&Interface Languages</source>
-        <translation type="unfinished"></translation>
+        <translation>&رابط زبان</translation>
     </message>
 </context>
 <context>
@@ -1916,7 +1920,7 @@
     </message>
     <message>
         <source>DHCP upper address bound of <b>%1</b> is wrong</source>
-        <translation type="obsolete">محدوده آدرس بالاتر تر DHCP <b>%1</b> اشتباه است</translation>
+        <translation type="obsolete">محدوده آدرس بالاتر DHCP <b>%1</b> اشتباه است</translation>
     </message>
     <message>
         <source>Adapter</source>
@@ -2028,128 +2032,128 @@
     </message>
     <message>
         <source>&NAT Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>&شبکه های NAT</translation>
     </message>
     <message>
         <source>Lists all available NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>لیست تمام شبکه های NAT .</translation>
     </message>
     <message>
         <source>&Host-only Networks</source>
-        <translation type="unfinished"></translation>
+        <translation>شبکه های& فقط-میزبان</translation>
     </message>
     <message>
         <source>No new name specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ نام جدیدی برای شبکه NAT که قبلا <b>%1</b> نامیده می شد تعیین نشده است.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ CIDR برای شبکه NAT  <b>%1</b> تعیین نشده است.</translation>
     </message>
     <message>
         <source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ CIDR برای شبکه NAT که قبلا <b>%1</b> نامیده میشد تعیین نشده است.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>مقدار CIDR نامعتبر (<i>%1</i>) برای شبکه the <b>%2</b> تعیین شده است.</translation>
     </message>
     <message>
         <source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>مقدار CIDR نامعتبر (<i>%1</i>) برای شبکه NAT که قبلا <b>%2</b> نامیده می شد تعیین شده است.</translation>
     </message>
     <message>
         <source>Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>نام شبکه</translation>
     </message>
     <message>
         <source>[empty]</source>
-        <translation type="unfinished"></translation>
+        <translation>[خالی]</translation>
     </message>
     <message>
         <source>%1 (renamed from %2)</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 (تغییرنام داد به %2)</translation>
     </message>
     <message>
         <source>Old Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>نام قدیمی شبکه</translation>
     </message>
     <message>
         <source>New Network Name</source>
-        <translation type="unfinished"></translation>
+        <translation>نام جدید شبکه</translation>
     </message>
     <message>
         <source>Network CIDR</source>
-        <translation type="unfinished"></translation>
+        <translation>شبکه CIDR</translation>
     </message>
     <message>
         <source>Supports DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>پشتیبانی از DHCP</translation>
     </message>
     <message>
         <source>yes</source>
-        <translation type="unfinished"></translation>
+        <translation>بله</translation>
     </message>
     <message>
         <source>no</source>
-        <translation type="unfinished"></translation>
+        <translation>خیر</translation>
     </message>
     <message>
         <source>Supports IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>پشتیبانی از IPv6</translation>
     </message>
     <message>
         <source>Default IPv6 route</source>
-        <translation type="unfinished"></translation>
+        <translation>مسیر پیش فرض IPv6</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> اکنون آدرس IPv4 معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> اکنون مسک شبکه IPv4 معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> اکنون آدرس IPv6 معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> اکنون آدرس سرور DHCP معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> اکنون سرور ماسک DHCP معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> محدوده آدرس سرور پایین تر DHCP معتبر ندارد.</translation>
     </message>
     <message>
         <source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
-        <translation type="unfinished"></translation>
+        <translation>رابط میزبان <b>%1</b> محدوده آدرس بالاتر سرور DHCP معتبر ندارد.</translation>
     </message>
     <message>
         <source>The name <b>%1</b> is being used for several NAT networks.</source>
-        <translation type="unfinished"></translation>
+        <translation>نام <b>%1</b> درحال استفاده برای چندین شبکه NAT میباشد.</translation>
     </message>
     <message>
         <source>Active</source>
         <comment>NAT network</comment>
-        <translation type="unfinished">فعال</translation>
+        <translation>فعال</translation>
     </message>
     <message>
         <source>&Add NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&افزودن شبکه NAT</translation>
     </message>
     <message>
         <source>&Remove NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&حذف شبکه NAT</translation>
     </message>
     <message>
         <source>&Edit NAT network</source>
-        <translation type="unfinished"></translation>
+        <translation>&ویرایش شبکه NAT</translation>
     </message>
 </context>
 <context>
@@ -2251,177 +2255,177 @@
     <name>UIGlobalSettingsNetworkDetailsHost</name>
     <message>
         <source>Host-only Network Details</source>
-        <translation type="unfinished">جزئیات شبکه فقط-میزبان</translation>
+        <translation>جزئیات شبکه فقط-میزبان</translation>
     </message>
     <message>
         <source>&Adapter</source>
-        <translation type="unfinished">&آداپتور</translation>
+        <translation>&آداپتور</translation>
     </message>
     <message>
         <source>Manual &Configuration</source>
-        <translation type="unfinished">پیکربندی &دستی</translation>
+        <translation>پیکربندی &دستی</translation>
     </message>
     <message>
         <source>Use manual configuration for this host-only network adapter.</source>
-        <translation type="unfinished">استفاده از پیکربندی دستی برای این آداپتور شبکه فقط-میزبان.</translation>
+        <translation>استفاده از پیکربندی دستی برای این آداپتور شبکه فقط-میزبان.</translation>
     </message>
     <message>
         <source>&IPv4 Address:</source>
-        <translation type="unfinished">آد&رس IPv4:</translation>
+        <translation>آد&رس IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 address for this adapter.</source>
-        <translation type="unfinished">آدرس میزبان IPv4 برای این آداپتور نشان میدهد.</translation>
+        <translation>آدرس میزبان IPv4 برای این آداپتور نشان میدهد.</translation>
     </message>
     <message>
         <source>IPv4 Network &Mask:</source>
-        <translation type="unfinished">ماسک ش&بکه IPv4:</translation>
+        <translation>ماسک ش&بکه IPv4:</translation>
     </message>
     <message>
         <source>Holds the host IPv4 network mask for this adapter.</source>
-        <translation type="unfinished">ماسک شبکه میزبان IPv4 برای این آداپتور نشان میدهد.</translation>
+        <translation>ماسک شبکه میزبان IPv4 برای این آداپتور نشان میدهد.</translation>
     </message>
     <message>
         <source>I&Pv6 Address:</source>
-        <translation type="unfinished">آدرس I&Pv6:</translation>
+        <translation>آدرس I&Pv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">آدرس میزبان IPv6 برای این آداپتور اگر IPv6 پشتیبانی شده باشد را نشان میدهد.</translation>
+        <translation>آدرس میزبان IPv6 برای این آداپتور اگر IPv6 پشتیبانی شده باشد را نشان میدهد.</translation>
     </message>
     <message>
         <source>IPv6 Network Mask &Length:</source>
-        <translation type="unfinished">طول ماسک ش&بکه IPv6:</translation>
+        <translation>طول ماسک ش&بکه IPv6:</translation>
     </message>
     <message>
         <source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
-        <translation type="unfinished">طول پیشوند ماسک شبکه میزبان IPv6 برای این آداپتور اگر  IPv6 پشتیبانی شده باشد را نشان میدهد.</translation>
+        <translation>طول پیشوند ماسک شبکه میزبان IPv6 برای این آداپتور اگر  IPv6 پشتیبانی شده باشد را نشان میدهد.</translation>
     </message>
     <message>
         <source>&DHCP Server</source>
-        <translation type="unfinished">سر&ور DHCP</translation>
+        <translation>سر&ور DHCP</translation>
     </message>
     <message>
         <source>&Enable Server</source>
-        <translation type="unfinished">فعالسازی &سرور</translation>
+        <translation>فعالسازی &سرور</translation>
     </message>
     <message>
         <source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
-        <translation type="unfinished">هرگاه سرور دی اِچ سی پی در اِستارت آپ ماشین فعال شده باشد یا نه،را نشان میدهد.</translation>
+        <translation>هرگاه سرور دی اِچ سی پی در اِستارت آپ ماشین فعال شده باشد یا نه،را نشان میدهد.</translation>
     </message>
     <message>
         <source>Server Add&ress:</source>
-        <translation type="unfinished">آدرس سرور&:</translation>
+        <translation>آدرس سرور&:</translation>
     </message>
     <message>
         <source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">آدرس سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با آداپتور فقط-میزبان را نشان میدهد.</translation>
+        <translation>آدرس سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با آداپتور فقط-میزبان را نشان میدهد.</translation>
     </message>
     <message>
         <source>Server &Mask:</source>
-        <translation type="unfinished">ماسک &سرور:</translation>
+        <translation>ماسک &سرور:</translation>
     </message>
     <message>
         <source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">ماسک شبکه سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این اداپتور فقط-میزبان را نشان میدهد.</translation>
+        <translation>ماسک شبکه سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این اداپتور فقط-میزبان را نشان میدهد.</translation>
     </message>
     <message>
         <source>&Lower Address Bound:</source>
-        <translation type="unfinished">محدوده آدر&س پایین تر:</translation>
+        <translation>محدوده آدر&س پایین تر:</translation>
     </message>
     <message>
         <source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">محدوده آدرس پایین تر ارائه شده توسط سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این آداپتور فقط-میزبان را نشان میدهد.</translation>
+        <translation>محدوده آدرس پایین تر ارائه شده توسط سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این آداپتور فقط-میزبان را نشان میدهد.</translation>
     </message>
     <message>
         <source>&Upper Address Bound:</source>
-        <translation type="unfinished">محدوده آ&درس بالاتر:</translation>
+        <translation>محدوده آ&درس بالاتر:</translation>
     </message>
     <message>
         <source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
-        <translation type="unfinished">محدوده آدرس پایین تر ارائه شده توسط سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این اداپتور فقط-میزبان را نشان میدهد.</translation>
+        <translation>محدوده آدرس پایین تر ارائه شده توسط سرور دی اِچ سی پی خدماتی شبکه وابسته سازی شده با این اداپتور فقط-میزبان را نشان میدهد.</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsNetworkDetailsNAT</name>
     <message>
         <source>NAT Network Details</source>
-        <translation type="unfinished"></translation>
+        <translation>جزئیات شبکه NAT</translation>
     </message>
     <message>
         <source>&Enable Network</source>
-        <translation type="unfinished"></translation>
+        <translation>&فعالسازی شبکه</translation>
     </message>
     <message>
         <source>Enable this NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>فعالسازی این شبکه NAT.</translation>
     </message>
     <message>
         <source>Network &Name:</source>
-        <translation type="unfinished"></translation>
+        <translation>نام &شبکه:</translation>
     </message>
     <message>
         <source>Holds the name for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>نام این شبکه را نگه می دارد.</translation>
     </message>
     <message>
         <source>Network &CIDR:</source>
-        <translation type="unfinished"></translation>
+        <translation>شبکه &CIDR:</translation>
     </message>
     <message>
         <source>Holds the CIDR for this network.</source>
-        <translation type="unfinished"></translation>
+        <translation>CIDR  رابرای این شبکه نگه می دارد.</translation>
     </message>
     <message>
         <source>Network Options:</source>
-        <translation type="unfinished"></translation>
+        <translation>گزینه های شبکه:</translation>
     </message>
     <message>
         <source>Supports &DHCP</source>
-        <translation type="unfinished"></translation>
+        <translation>پشتیبانی از &DHCP</translation>
     </message>
     <message>
         <source>Determines whether this network supports DHCP.</source>
-        <translation type="unfinished"></translation>
+        <translation>تعیین اینکه آیا این شبکه از DHCP پشتیبانی میکند.</translation>
     </message>
     <message>
         <source>Supports &IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>پشتیبانی از &IPv6</translation>
     </message>
     <message>
         <source>Determines whether this network supports IPv6.</source>
-        <translation type="unfinished"></translation>
+        <translation>تعیین اینکه آیا این شبکه از IPv6 پشتیبانی میکند.</translation>
     </message>
     <message>
         <source>Advertise Default IPv6 &Route</source>
-        <translation type="unfinished"></translation>
+        <translation>اعلان مسیر پیش فرض IPv6&</translation>
     </message>
     <message>
         <source>Determines whether this network should be advertised as the default IPv6 route.</source>
-        <translation type="unfinished"></translation>
+        <translation>تعیین اینکه آیا شبکه باید مسیر پیش فرض IPv6 را اعلان کند.</translation>
     </message>
     <message>
         <source>Opens a window to manage port forwarding rules.</source>
-        <translation type="unfinished">پنجره را برای مدیریت دستورات اِرسال پورت باز میکند.</translation>
+        <translation>پنجره را برای مدیریت دستورات اِرسال پورت باز میکند.</translation>
     </message>
     <message>
         <source>&Port Forwarding</source>
-        <translation type="unfinished">اِرسا&ل پورت</translation>
+        <translation>اِرسا&ل پورت</translation>
     </message>
 </context>
 <context>
     <name>UIGlobalSettingsPortForwardingDlg</name>
     <message>
         <source>Port Forwarding Rules</source>
-        <translation type="unfinished">دستورات اِرسال پورت</translation>
+        <translation>دستورات اِرسال پورت</translation>
     </message>
     <message>
         <source>IPv4</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv4</translation>
     </message>
     <message>
         <source>IPv6</source>
-        <translation type="unfinished"></translation>
+        <translation>IPv6</translation>
     </message>
 </context>
 <context>
@@ -2476,11 +2480,11 @@
     </message>
     <message>
         <source>No proxy host is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>میزبان پراکسی اکنون تایین نشده است.</translation>
     </message>
     <message>
         <source>No proxy port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>پورت پراکسی اکنون تعیین نشده است.</translation>
     </message>
 </context>
 <context>
@@ -2545,71 +2549,71 @@
     <name>UIHostComboEditor</name>
     <message>
         <source><key_%1></source>
-        <translation type="unfinished"><key_%1></translation>
+        <translation><key_%1></translation>
     </message>
     <message>
         <source>Left </source>
-        <translation type="unfinished">Left </translation>
+        <translation>Left </translation>
     </message>
     <message>
         <source>Right </source>
-        <translation type="unfinished">Right </translation>
+        <translation>Right </translation>
     </message>
     <message>
         <source>Left Shift</source>
-        <translation type="unfinished">Left Shift</translation>
+        <translation>Left Shift</translation>
     </message>
     <message>
         <source>Right Shift</source>
-        <translation type="unfinished">Right Shift</translation>
+        <translation>Right Shift</translation>
     </message>
     <message>
         <source>Left Ctrl</source>
-        <translation type="unfinished">Left Ctrl</translation>
+        <translation>Left Ctrl</translation>
     </message>
     <message>
         <source>Right Ctrl</source>
-        <translation type="unfinished">Right Ctrl</translation>
+        <translation>Right Ctrl</translation>
     </message>
     <message>
         <source>Left Alt</source>
-        <translation type="unfinished">Left Alt</translation>
+        <translation>Left Alt</translation>
     </message>
     <message>
         <source>Right Alt</source>
-        <translation type="unfinished">Right Alt</translation>
+        <translation>Right Alt</translation>
     </message>
     <message>
         <source>Left WinKey</source>
-        <translation type="unfinished">Left WinKey</translation>
+        <translation>Left WinKey</translation>
     </message>
     <message>
         <source>Right WinKey</source>
-        <translation type="unfinished">Right WinKey</translation>
+        <translation>Right WinKey</translation>
     </message>
     <message>
         <source>Menu key</source>
-        <translation type="unfinished">Menu key</translation>
+        <translation>Menu key</translation>
     </message>
     <message>
         <source>Alt Gr</source>
-        <translation type="unfinished">Alt Gr</translation>
+        <translation>Alt Gr</translation>
     </message>
     <message>
         <source>Caps Lock</source>
-        <translation type="unfinished">Caps Lock</translation>
+        <translation>Caps Lock</translation>
     </message>
     <message>
         <source>Scroll Lock</source>
-        <translation type="unfinished">Scroll Lock</translation>
+        <translation>Scroll Lock</translation>
     </message>
     <message>
         <source>Host+</source>
-        <translation type="unfinished"></translation>
+        <translation>Host+</translation>
     </message>
     <message>
         <source>None</source>
-        <translation type="unfinished"></translation>
+        <translation>None</translation>
     </message>
 </context>
 <context>
@@ -2680,22 +2684,22 @@
     </message>
     <message>
         <source>Reset shortcut to default</source>
-        <translation type="unfinished"></translation>
+        <translation>ریست میانبر به پیش فرض</translation>
     </message>
     <message>
         <source>Unset shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>عدمتعیین میانبر</translation>
     </message>
 </context>
 <context>
     <name>UIHotKeyTableModel</name>
     <message>
         <source>Name</source>
-        <translation type="unfinished">نام</translation>
+        <translation>نام</translation>
     </message>
     <message>
         <source>Shortcut</source>
-        <translation type="unfinished"></translation>
+        <translation>میانبر</translation>
     </message>
 </context>
 <context>
@@ -2828,20 +2832,20 @@
     </message>
     <message>
         <source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
-        <translation type="unfinished"></translation>
+        <translation><nobr>فعالیت ضبط ویدیو را نشان میدهد:</nobr><br>%1</translation>
     </message>
     <message>
         <source><nobr><b>Video capture disabled</b></nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>ضبط ویدئو غیرفعال شده است</b></nobr></translation>
     </message>
     <message>
         <source><nobr><b>Video capture file:</b> %1</nobr></source>
-        <translation type="unfinished"></translation>
+        <translation><nobr><b>فایل ضبط ویدیو:</b> %1</nobr></translation>
     </message>
     <message>
         <source>Additional feature status:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></source>
         <comment>Virtualization Stuff LED</comment>
-        <translation type="unfinished"></translation>
+        <translation>وضعیت سایر ویژگی ها:<br><nobr><b>%1:</b>&nbsp;%2</nobr><br><nobr><b>%3:</b>&nbsp;%4</nobr><br><nobr><b>%5:</b>&nbsp;%6</nobr><br><nobr><b>%7:</b>&nbsp;%8%</nobr></translation>
     </message>
 </context>
 <context>
@@ -2891,11 +2895,19 @@
     </message>
     <message>
         <source>No Webcams Connected</source>
-        <translation type="unfinished"></translation>
+        <translation>وب کمی متصل نشده است</translation>
     </message>
     <message>
         <source>No supported webcams connected to the host PC</source>
-        <translation type="unfinished"></translation>
+        <translation>وب کم پشتیبانی شده ای به رایانه میزبان متصل نشده است</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation>اتصال به آداپتور شبکه</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation>اتصال به آداپتور شبکه %1</translation>
     </message>
 </context>
 <context>
@@ -3045,130 +3057,134 @@
     </message>
     <message>
         <source>Video &Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>&ضبط ویدئو</translation>
     </message>
     <message>
         <source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
-        <translation type="unfinished"></translation>
+        <translation>وقتیکه انتخاب شده،ویرچوال باکس،جلسه یا وضعیت ماشین مجازی را در فایل ویدیویی ضبط خواهد کرد.</translation>
     </message>
     <message>
         <source>&Enable Video Capture</source>
-        <translation type="unfinished"></translation>
+        <translation>فعالسازی &ضبط ویدیو</translation>
     </message>
     <message>
         <source>File &Path:</source>
-        <translation type="unfinished"></translation>
+        <translation>&مسیر فایل:</translation>
     </message>
     <message>
         <source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
-        <translation type="unfinished"></translation>
+        <translation>این گزینه نام فایلی را که ویرچوال باکس برای محتوای ضبط شده استفاده میکند را تعیین میکند.</translation>
     </message>
     <message>
         <source>Frame &Size:</source>
-        <translation type="unfinished"></translation>
+        <translation>اندازه &فریم:</translation>
     </message>
     <message>
         <source>This setting determines the resolution (frame size) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم نسبت دید (اندازه فریم) ویدیو ضبط شده را تعیین میکند.</translation>
     </message>
     <message>
         <source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم نسبت دید <b>اُفقی</b> (عرض فریم) ویدیو ضبط شده را تعیین میکند.</translation>
     </message>
     <message>
         <source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم نسبت دید <b>عمودی</b> (ارتفاع فریم) ویدیو ضبط شده را تعیین میکند.</translation>
     </message>
     <message>
         <source>&Frame Rate:</source>
-        <translation type="unfinished"></translation>
+        <translation>&نرخ فریم:</translation>
     </message>
     <message>
         <source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم حداکثر تعداد<b>فریم بر ثانیه</b> تعیین میکند. فریم های اضافی رد خواهد شد. کاهش این مقدار باعث افزایش تعداد فریم های رد شده میشود درنهایت حجم فایل کم میشود.</translation>
     </message>
     <message>
         <source>&Quality:</source>
-        <translation type="unfinished"></translation>
+        <translation>&کیفیت:</translation>
     </message>
     <message>
         <source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم <b>کیفیت</b> را تعیین میکند. افزایش این مقدار کیفیت ویدیو را بیشتر میکند اما حجم فایل نیز بیشتر میشود.</translation>
     </message>
     <message>
         <source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
-        <translation type="unfinished"></translation>
+        <translation>این تنظیم نرخ بیت را در <b>کیلوبیت بر ثانیه</b> تعیین میکند. افزایش این مقدار کیفیت ویدیو را بیشتر میکند اما حجم فایل نیز بیشتر میشود.</translation>
     </message>
     <message>
         <source>&Screens:</source>
-        <translation type="unfinished"></translation>
+        <translation>&نمایشگرها:</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>ماشین مجازی طوری راه اندازی شده که از سخت افزار شتاب دهنده گرافیکی استفاده کند. هرچند سیستم میزبان اکنون این را ارائه نمیکند، بنابراین شما قادر به اجرای ماشین مجازی نیستید.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون ماشین مجازی کمتر از <b>%1</b> حافظه ویدیویی اختصاص داده است.که آن کمترین مقدار موردنیاز برای رفتن به حالت تمام صفحه یا حالت یکپارچه هست.</translation>
     </message>
     <message>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون ماشین مجازی کمتر از <b>%1</b> حافظه ویدیویی اختصاص داده است.که آن کمترین مقدار موردنیاز برای ویدیو کیفیت بالا با پخش موثر است.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>ماشین مجازی طوری راه اندازی شده که از سخت افزار شتاب دهنده گرافیکی استفاده کند و سیستم عامل اشارع دارد که آن به ویندوز ویستا به بعد تنظیم شده است. برای بهترین کارایی باید حافظه ویدیویی ماشین را حداقل به b>%1</b> تنظیم کنید.</translation>
     </message>
     <message>
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
-        <translation type="unfinished"></translation>
+        <translation>ماشین مجازی طوری راه اندازی شده که از جریان ویدیو شتاب دهنده استفاده کند. از آنجا که این ویژگی فقط با ویندوز سیستم مهمان کار میکند،آن غیر فعال خواهد شد.</translation>
     </message>
     <message>
         <source>The VRDE server port value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>مقدار پورت سرور VRDE اکنون تعیین شده است.</translation>
     </message>
     <message>
         <source>The VRDE authentication timeout value is not currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>مقدار مدت زمان تایید اعتبار VRDE اکنون تعیین نشده است.</translation>
     </message>
     <message>
         <source>User Defined</source>
-        <translation type="unfinished"></translation>
+        <translation>تعریف شده توسط کاربر</translation>
     </message>
     <message>
         <source>%1 fps</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 فریم بر ثانیه</translation>
     </message>
     <message>
         <source>fps</source>
-        <translation type="unfinished"></translation>
+        <translation>فریم بر ثانیه</translation>
     </message>
     <message>
         <source>low</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>کم</translation>
     </message>
     <message>
         <source>medium</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>متوسط</translation>
     </message>
     <message>
         <source>high</source>
         <comment>quality</comment>
-        <translation type="unfinished"></translation>
+        <translation>بالا</translation>
     </message>
     <message>
         <source>kbps</source>
-        <translation type="unfinished"></translation>
+        <translation>کیلوبیت بر ثانیه</translation>
     </message>
     <message>
         <source>Screen %1</source>
-        <translation type="unfinished"></translation>
+        <translation>صفحه نمایش %1</translation>
     </message>
     <message>
         <source>Enable video recording for screen %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>ضبط ویدیو برای صفحه نمایش %1 فعال شود.</translation>
+    </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation>نمایش ریموت اکنون برای این ماشین مجازی فعال شده است. هرچند، نیاز دارد که <b>%1</b> نصب شود. لطفا بسته افزونه را از سایت ویرچوال باکس دانلود نمایید،درغیر اینصورت ماشین مجازی با نمایش ریموت غیرفعال شده اِجرا خواهد شد</translation>
     </message>
 </context>
 <context>
@@ -3251,11 +3267,11 @@
     </message>
     <message>
         <source>No name specified for the virtual machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>نامی برای ماشین مجازی مشخص نشده است.</translation>
     </message>
     <message>
         <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>سیستم عامل ماشین مجازی اشاره میکند که به نوع 64 بیت تنظیم شده است.سیستم مهمان 64 بیت نیاز به مجازی سازی سخت افزاری دارد،بنابراین اگر شما تغییرات را تایید کنید،آن خودکار فعال خواهد شد.</translation>
     </message>
 </context>
 <context>
@@ -3387,35 +3403,35 @@
     </message>
     <message>
         <source>No bridged network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ آداپتور شبکه پل شده اکنون انتخاب نشده است.</translation>
     </message>
     <message>
         <source>No internal network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ نام شبکه داخلی اکنون تعیین نشده است.</translation>
     </message>
     <message>
         <source>No host-only network adapter is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ آداپتور شبکه فقط-میزبان انتخاب نشده است.</translation>
     </message>
     <message>
         <source>No generic driver is currently selected.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون هیچ درایور اصلی انتخاب نشده است.</translation>
     </message>
     <message>
         <source>No NAT network name is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ نام شبکه  NAT اکنون تعیین نشده است.</translation>
     </message>
     <message>
         <source>The MAC address must be 12 hexadecimal digits long.</source>
-        <translation type="unfinished"></translation>
+        <translation>آدرس مک باید 12 رقم هگزادسیمال بلند باشد</translation>
     </message>
     <message>
         <source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
-        <translation type="unfinished"></translation>
+        <translation>رقم دوم در آدرس مک نباید فرد باشد دراینصور فقط ادرس یونی کست اجازه داده میشود</translation>
     </message>
     <message>
         <source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
-        <translation type="unfinished"></translation>
+        <translation>نام شبکه NAT که این کارت شبکه به آن متصل شده است را نگه دارید. شما میتوانید توسط تنظیمات سراسری شبکه در پنجره مدیریت ماشین مجازی شبکه راحذف و ایجاد کنید.</translation>
     </message>
 </context>
 <context>
@@ -3482,23 +3498,23 @@
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون IRQ تعیین نشده است.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون پورت I/O تعیین نشده است.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>دو یا چند پورت تنظیمات مشابه دارند.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون مسیر پورتی تعیین نشده است.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون مسیر پورت های تکراری تعیین شده است.</translation>
     </message>
 </context>
 <context>
@@ -3643,7 +3659,7 @@
     </message>
     <message>
         <source>When checked, the guest OS will try to automatically mount the shared folder on startup.</source>
-        <translation>اگر انتخاب شده باشد،سیستم عامل مهمان سعی میکند در اِستارت آپ پوشه اشتراکی را بارگیری کند.</translation>
+        <translation>وقتیکه انتخاب شده باشد،سیستم عامل مهمان سعی میکند در اِستارت آپ پوشه اشتراکی را بارگیری کند.</translation>
     </message>
     <message>
         <source>&Auto-mount</source>
@@ -3655,7 +3671,7 @@
     </message>
     <message>
         <source>Window</source>
-        <translation type="unfinished"></translation>
+        <translation>پنجره</translation>
     </message>
 </context>
 <context>
@@ -3738,23 +3754,23 @@
     </message>
     <message>
         <source>No IRQ is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون IRQ تعیین نشده است.</translation>
     </message>
     <message>
         <source>No I/O port is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون پورت I/O تعیین نشده است.</translation>
     </message>
     <message>
         <source>Two or more ports have the same settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>دو یا چند پورت تنظیمات مشابه دارند.</translation>
     </message>
     <message>
         <source>No port path is currently specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون مسیر پورتی تعیین نشده است.</translation>
     </message>
     <message>
         <source>There are currently duplicate port paths specified.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون مسیر پورت های تکراری تعیین شده است.</translation>
     </message>
 </context>
 <context>
@@ -3989,7 +4005,7 @@
     </message>
     <message>
         <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
-        <translation>مجازی فلاپی دیسک یا درایو جسمی درایو مجازی استفاده کنید انتخاب کنید. ماشین مجازی دیسک وارد شده را در درایوی که با اطلاعات در پرونده یا دیسک موجود در درایو جسمی عنوان محتویاتش دید.ماشین مجازی دیسک قرارداده شده در درایو را با داده در فایل یا در درایو فیزیکی بعنوان محتویات دیسک میبیند.</translation>
+        <translation>یک دیسک فلاپی مجازی یا یک درایو فیزیکی برای استفاده با درایو مجازی انتخاب کنید. ماشین مجازی دیسک قرارداده شده در درایو را با داده در فایل یا در درایو فیزیکی بعنوان محتویات دیسک میبیند.</translation>
     </message>
     <message>
         <source>Set up the virtual floppy drive</source>
@@ -4075,23 +4091,23 @@
     </message>
     <message>
         <source>No name is currently specified for the controller at position <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>هیچ نامی اکنون برای کنترلر در موقعیت <b>%1</b> تعیین نشده است.</translation>
     </message>
     <message>
         <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>کنترلردر موقعیت <b>%1</b> همین نام را بعنوان کنترلر در موقعیت <b>%2</b> دارد.</translation>
     </message>
     <message>
         <source>No hard disk is selected for <i>%1</i>.</source>
-        <translation type="unfinished"></translation>
+        <translation>دیسک سختی برای <i>%1</i> انتخاب نشده است.</translation>
     </message>
     <message>
         <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
-        <translation type="unfinished"></translation>
+        <translation><i>%1</i> از دیسکی استفاده میکند که از قبل ضمیمه شده به <i>%2</i>.</translation>
     </message>
     <message>
         <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
-        <translation type="unfinished"></translation>
+        <translation>ماشین اکنون درحال استفاده کنترلرهای ذخیره ساز بیشتر از %1 تراشه پشتیبانی شده هستید. لطفا نوع تراشه را در صفحه تنظیمات سیستم تغییر دهید یا تعداد کنترلرهای ذخیره ساز زیرین را در صفحه تنظیمات ذخیره ساز کاهش دهید: %2</translation>
     </message>
 </context>
 <context>
@@ -4248,11 +4264,11 @@
     </message>
     <message>
         <source>If checked, an absolute pointing device (a USB tablet) will be supported. Otherwise, only a standard PS/2 mouse will be emulated.</source>
-        <translation type="obsolete">اگر انتخاب شده،یک دستگاه اشاره گر مطلق (یک تبلت یو اِس بی) پشتیبانی خواهد شد. درغیراینصورت، فقط یک ماوس استاندارد PS/2 شبیه سازی خواهد شد.</translation>
+        <translation type="obsolete">اگر انتخاب شده،یک دستگاه اشاره گر حقیقی (یک تبلت یو اِس بی) پشتیبانی خواهد شد. درغیراینصورت، فقط یک ماوس استاندارد PS/2 شبیه سازی خواهد شد.</translation>
     </message>
     <message>
         <source>Enable &absolute pointing device</source>
-        <translation type="obsolete">فعال &سازی دستگاه اشاره گر مطلق</translation>
+        <translation type="obsolete">فعال &سازی دستگاه اشاره گر حقیقی</translation>
     </message>
     <message>
         <source>&Chipset:</source>
@@ -4294,47 +4310,47 @@
     </message>
     <message>
         <source>&Pointing Device:</source>
-        <translation type="unfinished"></translation>
+        <translation>&دستگاه اشاره گر:</translation>
     </message>
     <message>
         <source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
-        <translation type="unfinished"></translation>
+        <translation>هرگاه دستگاه اشاره گر شبیه ساز شده یک ماوس پی اِس/2 استاندارد،یک تبلت یو اِس  بی یا یک تبلت لمسی یو اِس بی را تعیین میکند.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>بیشتر از <b>%1%</b> از حافظه رایانه میزبان را (<b>%2</b>) به ماشین مجازی اختصاص داده اید. حافظه کافی برای سیستم عامل مهمان باقی نمانده است.لطفا مقدار کمتری انتخاب نمایید.</translation>
     </message>
     <message>
         <source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
-        <translation type="unfinished"></translation>
+        <translation>بیشتر از <b>%1%</b> از حافظه رایانه میزبان را (<b>%2</b>) به ماشین مجازی اختصاص داده اید. حافظه کافی برای سیستم عامل مهمان باقی نمانده است.با در نظر گرفتن این مقدار کمتری انتخاب نمایید.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>ویژگی ورودی/خروجی APIC اکنون در بخش مادربرد صفحه سیستم فعال نشده است.این برای پشتیبانی از نوع تراشه ICH9 ضروری هست. اگر تغییرات را تایید و اعمال کنید آن خودکار انجام خواهد شد.</translation>
     </message>
     <message>
         <source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>شبیه ساز کنترلر یو اِس بی اکنون در صفحه یو اِس بی فعال نشده است. بمنظور پشتیبانی از دستگاه ورودی یو اِس بی به آن نیاز است. اگر تغییرات را تایید کنید آن خودکار انجام خواهد شد..</translation>
     </message>
     <message>
         <source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>به دلیل کارایی، تعداد پردازنده مجازی ضمیمه شده به ماشین مجازی نبابید بیشتر از دوبرابر پردازنده فیزیکی در میزبان (<b>%1</b>) باشد. لطفا تعداد پردازنده مجازی را کاهش دهید.</translation>
     </message>
     <message>
         <source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
-        <translation type="unfinished"></translation>
+        <translation>پردازنده مجازی بیشتری نسبت به تعداد پردازنده فیزیکی سیستم میزبان (<b>%1</b>) به ماشین مجازی اختصاص داده اید. این بیشتر باعث تنزل کارایی ماشین مجازی میشود. لطفا به کاهش پردازنده مجازی توجه کنید.</translation>
     </message>
     <message>
         <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>ویژگی ورودی/خروجی APIC اکنون در بخش مادربرد صفحه سیستم فعال نشده است.این برای پشتیبانی از بیشتر از یک پردازنده مجازی نیاز است. اگر تغییرات را تایید و اعمال کنید آن خودکار انجام خواهد شد.</translation>
     </message>
     <message>
         <source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
-        <translation type="unfinished"></translation>
+        <translation>مجازی سازی سخت افزار اکنون در بخش شتاب دهنده صفحه سیستم فعال نشده است. برای پشتیبانی از بیشتر از یک پردازنده مجازی این ضروری است. اگر تغییرات را تایید و اعمال کنید آن خودکار انجام خواهد شد.</translation>
     </message>
     <message>
         <source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
-        <translation type="unfinished"></translation>
+        <translation>درپوش اِجرای پردازنده به مقدار کم تنظیم شده است.این میتواند موجب احساس کندی در عملکرد و پاسخ ماشین داشته باشد.</translation>
     </message>
 </context>
 <context>
@@ -4466,7 +4482,7 @@
     </message>
     <message>
         <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
-        <translation type="unfinished"></translation>
+        <translation>اکنون یو اِس بی 2.0 برای این ماشین فعال شده است. هرچند، این نیاز دارد که <b>%1</b> نصب شده باشد. لطفا بسته افزونه را از سایت ویرچوال باکس دانلود کنید، یا یو اِس بی 2.0 را غیرفعال کنید تا بتوانید آن را اِجرا کنید.</translation>
     </message>
 </context>
 <context>
@@ -4894,7 +4910,7 @@
     <message>
         <source>Insert</source>
         <comment>additions</comment>
-        <translation type="unfinished">بارگیری</translation>
+        <translation>بارگیری</translation>
     </message>
     <message>
         <source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -5377,7 +5393,7 @@
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
-        <translation type="unfinished"><p>افزونه مهمان ویرچوال باکس در ماشین مجازی دردسترس ظاهر نشده است، و پوشه اشتراکی بدون آن قابل استفاده نیست. برای استفاده از پوشه اشتراکی در داخل ماشین مجازی، لطفا افزونه مهمان را نصب کنید اگر آنها نصب نشده است. یا اگر بدرستی کار نمیکند مجددا نصب کنید، گزینه <b>نصب افزونه مهمان</b> را از منوی <b>دستگاه</b> انتخاب کنید. اگر آنها نصب شده اند اما ماشین هنوز بطورکامل شروع نشده است سپس پوشه اشتراکی یک بار در آن دردسترس است.& [...]
+        <translation><p>افزونه مهمان ویرچوال باکس در ماشین مجازی دردسترس ظاهر نشده است، و پوشه اشتراکی بدون آن قابل استفاده نیست. برای استفاده از پوشه اشتراکی در داخل ماشین مجازی، لطفا افزونه مهمان را نصب کنید اگر آنها نصب نشده است. یا اگر بدرستی کار نمیکند مجددا نصب کنید، گزینه <b>نصب افزونه مهمان</b> را از منوی <b>دستگاه</b> انتخاب کنید. اگر آنها نصب شده اند اما ماشین هنوز بطورکامل شروع نشده است سپس پوشه اشتراکی یک بار در آن دردسترس است.</p></translation>
     </message>
     <message>
         <source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -5666,218 +5682,218 @@
     </message>
     <message>
         <source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>به علت محدودیت محلی نمیتوان مدیر ویرچوال باکس را اجرا کرد.</p><p>برنامه حالا بسته خواهد شد.</p></translation>
     </message>
     <message>
         <source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به یافتن فایل زبان برای زبان <b>%1</b> در دایرکتوری زیر نیست: <b><nobr>%2</nobr></b> </p><p>زبان موقتا به زبان پیش فرض سیستم ریست خواهد شد. لطفا به پنجره. <b>اولویت ها</b> بروید که آن را میتوان از منوی <b>فایل</b> در پنجره اصلی برنامه یافت، و یکی از زبان های موجود در صفحه <b>زبان</b> را انتخاب کنید.</p></translation>
     </message>
     <message>
         <source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به بارگیری فایل زبان <b><nobr>%1</nobr></b> نیست. <p>زبان موقتا به زبان توکار برنامه یعنی انگلیسی ریست میشود. لطفا به پنجره <b>اولویت ها</b> بروید که میتوانید آن را از منوی <b>فایل</b> از پنجره اصلی برنامه باز کنید، و یکی از زبانهای موجود را از صفحه <b>زبان</b> انتخاب کنید.</p></translation>
     </message>
     <message>
         <source>There is no virtual machine with the identifier <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>ماشین مجازی با شناسه <b>%1</b> وجود ندارد.</translation>
     </message>
     <message>
         <source>Ignore</source>
-        <translation type="unfinished">چشمپوشی</translation>
+        <translation>چشمپوشی</translation>
     </message>
     <message>
         <source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید شبکه NAT <nobr><b>%1</b> را حذف کنید؟</nobr></p><p> اگر این شبکه بایک یا تعداد بیشتری آداپتور شبکه ماشین مجازی در حال استفاده باشد دیگر قابل استفاده نخواهد بود تا زمانیکه یا نام شبکه متفاوت انتخاب کرده یا نوع ضمیمه آداپتور متفاوت انتخاب کرد.</p></translation>
     </message>
     <message>
         <source>Failed to create NAT network.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به ایجاد شبکه NAT نشد.</translation>
     </message>
     <message>
         <source>Failed to remove NAT network <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به حذف شبکه NAT <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to create DHCP server.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به ایجاد سرور DHCP نشد.</translation>
     </message>
     <message>
         <source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به حذف سرور DHCP برای رابطه شبکه <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to create the host network interface.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به ایجاد رابط شبکه میزبان نشد.</translation>
     </message>
     <message>
         <source>Create &new disk</source>
-        <translation type="unfinished">ایجاد دیسک &جدید</translation>
+        <translation>ایجاد دیسک &جدید</translation>
     </message>
     <message>
         <source>&Choose existing disk</source>
-        <translation type="unfinished">انتخاب دی&سک موجود</translation>
+        <translation>انتخاب دی&سک موجود</translation>
     </message>
     <message>
         <source>Leave &empty</source>
-        <translation type="unfinished">خالی &بگذار</translation>
+        <translation>خالی &بگذار</translation>
     </message>
     <message>
         <source>&Choose disk</source>
-        <translation type="unfinished">انتخاب د&یسک</translation>
+        <translation>انتخاب د&یسک</translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک سخت مجازی <nobr><b>%1</b></nobr> ترخیص شود؟ </p><p>این آن را از ماشین مجازی زیر جدا خواهد کرد: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک نوری مجازی <nobr><b>%1</b></nobr> را ترخیص کنید؟ </p><p>این آن را از ماشین مجازی زیر جدا خواهد کرد: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک فلاپی مجازی <nobr><b>%1</b></nobr> را ترخیص کنید؟</p><p>این آن را از ماشین مجازی زیر جدا خواهد کرد: <b>%2</b>.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک سخت مجازی <nobr><b>%1</b></nobr> را از لیست فایل های دیسک ایمیج شناخته شده حذف کنید؟</p></translation>
     </message>
     <message>
         <source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>از آنجا که این دیسک سخت  قابل دسترسی نیست،فایل ایمیج آن را نمیتوان حذف کرد.</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک نوری مجازی <nobr><b>%1</b></nobr> را از لیست فایل های ایمیج شناخته شده حذف کنید؟</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید دیسک فلاپی مجازی <nobr><b>%1</b></nobr> را از لیست فایل های دیسک ایمیج شناخته شده حذف کنید؟</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به قراردادن دیسک نوری مجازی <nobr><b>%1</b></nobr> در ماشین <b>%2</b> نیست.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force insertion of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید این دیسک را اجباری قرار دهید؟</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به ایجکت دیسک نوری مجازی <nobr><b>%1</b></nobr> از ماشین <b>%2</b> نیست.</p></translation>
     </message>
     <message>
         <source><p>Would you like to try to force ejection of this disk?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید این دیسک را ایجکت اجباری کنید؟</p></translation>
     </message>
     <message>
         <source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به قراردادن دیسک فلاپی مجازی <nobr><b>%1</b></nobr> در ماشین <b>%2</b> نیست.</p></translation>
     </message>
     <message>
         <source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به ایجکت دیسک مجازی فلاپی <nobr><b>%1</b></nobr> از ماشین <b>%2</b> نیست.</p></translation>
     </message>
     <message>
         <source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بازکردن فایل دیسک سخت <nobr><b>%1</b></nobr> نشد.</translation>
     </message>
     <message>
         <source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بازکردن فایل دیسک نوری <nobr><b>%1</b></nobr> نشد.</translation>
     </message>
     <message>
         <source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بازکردن فایل فلاپی دیسک <nobr><b>%1</b></nobr> نشد.</translation>
     </message>
     <message>
         <source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بستن فایل دیسک سخت <nobr><b>%2</b></nobr> نشد.</translation>
     </message>
     <message>
         <source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بستن فایل دیسک نوری <nobr><b>%2</b></nobr> نشد.</translation>
     </message>
     <message>
         <source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به بستن فایل فلاپی دیسک <nobr><b>%2</b></nobr> نشد.</translation>
     </message>
     <message numerus="yes">
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
-        <translation type="unfinished">
+        <translation>
             <numerusform><p>این %n ماشین مجازی زیر اکنون در وضعیت ذخیره شده هستند: <b>%1</b></p><p>اگر ادامه دهید وضعیت زمان اِجرای ماشین خروجیگیری شده لغو خواهد شد. سایر ماشین ها تغییر نخواهد کرد.</p></numerusform>
         </translation>
     </message>
     <message>
         <source>Switch</source>
-        <translation type="unfinished">تعویض</translation>
+        <translation>تعویض</translation>
     </message>
     <message>
         <source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به فعالسازی سرور ریموت دسکتاپ برای ماشین مجازی <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به غیرفعالسازی سرور ریموت دسکتاپ برای ماشین مجازی <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به فعالسازی ضبط ویدیو برای ماشین مجازی <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به ضبط ویدیو برای ماشین مجازی <b>%1</b> نشد.</translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>نمیتوان فایل دیسک ایمیج <b>افزونه مهمان ویرچوال باکس</b> را یافت.</p><p>آیا میخواهید فایل دیسک ایمیج را از اینترنت دانلود کند؟</p></translation>
     </message>
     <message>
         <source>Download</source>
-        <translation type="unfinished">دانلود</translation>
+        <translation>دانلود</translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید فایل ایمیج دیسک <b>افزونه مهمان ویرچوال باکس</b> را از <nobr><a href="%1">%1</a></nobr> (حجم %2 بایت) دانلود کنید؟</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>فایل دیسک ایمیج <b>افزونه مهمان ویرچوال باکس</b> با موفقیت <nobr><a href="%1">%1</a></nobr>دانلود شد اما نمیتوان بطور محلی در اینجا ذخیره کرد: <nobr><b>%2</b> </nobr></p><p>لطفا یک مکان دیگر برای ذخیره آن انتخاب کنید.</p></translation>
     </message>
     <message>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>فایل دیسک ایمیج <b>افزونه مهمان ویرچوال باکس</b> با موفقیت از <nobr><a href="%1">%1</a></nobr> دانلود شد و بطور محلی بعنوان <nobr><b>%2</b> ذخیره شد.</nobr></p><p>آیا میخواهید این فایل دیسک ایمیج را ثبت کرده و در درایو سی دی/دی وی دی بارگیری کنید؟</p></translation>
     </message>
     <message>
         <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>نمیتوان فایل دیسک ایمیج <b>افزونه مهمان ویرچوال باکس</b> را در ماشین مجازی <b>%1</b>قرارداد،زیرا ماشین درایو سی دی یا دی وی دی ندارد. لطفا یک درایو توسط صفحه ذخیره ساز در پنجره تنظیمات ماشین مجازی اضافه کنید.</p></translation>
     </message>
     <message>
         <source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>قادر به یافتن <b>راهنمای کاربر ویرچوال باکس</b> <nobr><b>%1</b> نیست</nobr></p><p>آیا میخواهید آن را از اینترنت دانلود کنید؟</p></translation>
     </message>
     <message>
         <source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>آیا میخواهید فایل <b>راهنمای کاربر ویرچوال باکس</b> را از <nobr><a href="%1">%1</a></nobr> (حجم %2 بایت) دانلود کنید؟</p></translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
-        <translation type="unfinished"><p>راهنمای کاربر ویرچوال باکس با موفقیت از <nobr><a href="%1">%2</a></nobr> دانلود شد اما نمیتواند بطور محلی بعنوان <nobr><b>%3</b> ذخیره شود.</nobr></p><p>لطفا برای آن فایل محل دیگری را انتخاب کنید.</p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>راهنمای کاربر ویرچوال باکس با موفقیت از <nobr><a href="%1">%2</a></nobr> دانلود شد اما نمیتواند بطور محلی بعنوان <nobr><b>%3</b> ذخیره شود.</nobr></p><p>لطفا برای آن فایل محل دیگری را انتخاب کنید.</p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
-        <translation type="unfinished"><p>راهنمای کاربر ویرچوال باکس با موفقیت از <nobr><a href="%1">%2</a></nobr> دانلود شد و بطور محلی بعنوان <nobr><b>%3</b> ذخیره شد.</nobr></p> {1"?} {1<?} {2<?}</translation>
+        <translation><p>راهنمای کاربر ویرچوال باکس با موفقیت از <nobr><a href="%1">%2</a></nobr> دانلود شد و بطور محلی بعنوان <nobr><b>%3</b> ذخیره شد.</nobr></p> {1"?} {1<?} {2<?}</translation>
     </message>
     <message>
         <source>Close</source>
-        <translation type="unfinished">بستن</translation>
+        <translation>بستن</translation>
     </message>
     <message>
         <source>Ok</source>
-        <translation type="unfinished">تأیید</translation>
+        <translation>تأیید</translation>
     </message>
     <message>
         <source>Do not show this message again</source>
-        <translation type="unfinished">این پیام را دیگر نشان نده</translation>
+        <translation>این پیام را دیگر نشان نده</translation>
     </message>
     <message>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
@@ -5891,34 +5907,34 @@
     </message>
     <message>
         <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به ضمیمه کردن وب کم <b>%1</b> به ماشین مجازی <b>%2</b> نشد.</translation>
     </message>
     <message>
         <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
-        <translation type="unfinished"></translation>
+        <translation>موفق به جداسازی وب کم <b>%1</b> از ماشین مجازی <b>%2</b> نشد.</translation>
     </message>
     <message>
         <source><p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
-        <translation type="unfinished"></translation>
+        <translation><p>نمایشگر مجازی اکنون به حالت رنگی <b>%1&nbsp;بیت</b> تنظیم شده است. برای کارایی بهتر لطفا آن را به <b>%2&nbsp;بیت</b> تغییر دهید. این معمولا میتواند از قسمت <b>نمایش</b> کنترل پنل سیستم عامل مهمان یا تنظیمات سیستم انجام شود.</p></translation>
     </message>
 </context>
 <context>
     <name>UIMiniToolBar</name>
     <message>
         <source>Always show the toolbar</source>
-        <translation type="unfinished">همیشه نمایش نوارابزار</translation>
+        <translation>همیشه نمایش نوارابزار</translation>
     </message>
     <message>
         <source>Minimize Window</source>
-        <translation type="unfinished">کمینه پنجره</translation>
+        <translation>کمینه پنجره</translation>
     </message>
     <message>
         <source>Exit Full Screen or Seamless Mode</source>
-        <translation type="unfinished">خروج ازحالت تمام صفحه یا حالت یکپارچه</translation>
+        <translation>خروج ازحالت تمام صفحه یا حالت یکپارچه</translation>
     </message>
     <message>
         <source>Close VM</source>
-        <translation type="unfinished">بستن ماشین مجازی</translation>
+        <translation>بستن ماشین مجازی</translation>
     </message>
 </context>
 <context>
@@ -5995,7 +6011,7 @@
     </message>
     <message>
         <source>The network operation failed with the following error: %1.</source>
-        <translation type="unfinished"></translation>
+        <translation>عملکرد شبکه یا خطای زیر موفق نشد: %1.</translation>
     </message>
 </context>
 <context>
@@ -6022,34 +6038,34 @@
     <name>UINetworkReplyPrivate</name>
     <message>
         <source>Host not found</source>
-        <translation type="unfinished"></translation>
+        <translation>میزبان یافت نشد</translation>
     </message>
     <message>
         <source>Content access denied</source>
-        <translation type="unfinished"></translation>
+        <translation>دسترسی به محتوا رد شد</translation>
     </message>
     <message>
         <source>Protocol failure</source>
-        <translation type="unfinished"></translation>
+        <translation>پروتکل موفق نشد</translation>
     </message>
     <message>
         <source>Wrong SSL certificate format</source>
-        <translation type="unfinished"></translation>
+        <translation>فرمت گواهینامه SSL اشتباه است</translation>
     </message>
     <message>
         <source>SSL authentication failed</source>
-        <translation type="unfinished"></translation>
+        <translation>تایید اعتبار SSL انجام نشد.</translation>
     </message>
     <message>
         <source>Unknown reason</source>
-        <translation type="unfinished"></translation>
+        <translation>دلیل ناشناخته</translation>
     </message>
 </context>
 <context>
     <name>UIPopupCenter</name>
     <message>
         <source>Click for full details</source>
-        <translation type="unfinished"></translation>
+        <translation>برای جزئیات کامل کلیک کنید</translation>
     </message>
 </context>
 <context>
@@ -6167,11 +6183,11 @@
     </message>
     <message>
         <source><b>%1</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b> صفحه:</translation>
     </message>
     <message>
         <source><b>%1: %2</b> page:</source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1: %2</b> صفحه:</translation>
     </message>
 </context>
 <context>
@@ -6353,7 +6369,7 @@
     </message>
     <message>
         <source>You want to:</source>
-        <translation>شما میخواهید که:</translation>
+        <translation>چه کاری انجام خواهید داد:</translation>
     </message>
     <message>
         <source><p>Saves the current execution state of the virtual machine to the physical hard disk of the host PC.</p><p>Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.</p><p>Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to th [...]
@@ -6565,7 +6581,7 @@
     </message>
     <message>
         <source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
-        <translation>لطفا انتخاب کنید چه موقع فایل درایو سخت مجازی جدید باید بزرگ شود بمهان اندازه که استفاده شده است (پویا اختصاص داده شده) یا آن باید در حداکثر حجم ایجاد شود (حجم ثابت شده).</translation>
+        <translation>لطفا انتخاب کنید چه موقع فایل درایو سخت مجازی جدید باید بزرگ شود به همان اندازه که استفاده شده است (پویا اختصاص داده شده) یا آن باید در حداکثر حجم ایجاد شود (حجم ثابت شده).</translation>
     </message>
     <message>
         <source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
@@ -6856,39 +6872,39 @@
     </message>
     <message>
         <source>Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>تنظیمات ذخیره ساز</translation>
     </message>
     <message>
         <source>Please choose a file to export the virtual appliance to</source>
-        <translation type="unfinished"></translation>
+        <translation>لطفا یک فایل برای خروجیگیری وسیله مجازی انتخاب کنید</translation>
     </message>
     <message>
         <source>F&ormat:</source>
-        <translation type="unfinished"></translation>
+        <translation>&فرمت:</translation>
     </message>
     <message>
         <source>OVF 0.9</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 0.9</translation>
     </message>
     <message>
         <source>OVF 1.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 1.0</translation>
     </message>
     <message>
         <source>OVF 2.0</source>
-        <translation type="unfinished"></translation>
+        <translation>OVF 2.0</translation>
     </message>
     <message>
         <source>Write in standard OVF 1.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>نوشتن در فرمت استاندارد OVF 1.0.</translation>
     </message>
     <message>
         <source>Write in new experimental OVF 2.0 format.</source>
-        <translation type="unfinished"></translation>
+        <translation>نوشتن در فرمت آزمایشی OVF 2.0 .</translation>
     </message>
     <message>
         <source>&Storage settings</source>
-        <translation type="unfinished"></translation>
+        <translation>&تنظیمات ذخیره ساز</translation>
     </message>
 </context>
 <context>
@@ -6907,14 +6923,14 @@
     </message>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>یک فایل برای خروجیگیری ماشین مجازی انتخاب کنید</translation>
     </message>
 </context>
 <context>
     <name>UIWizardExportAppPageExpert</name>
     <message>
         <source>Choose a file to export the virtual appliance to...</source>
-        <translation type="unfinished"></translation>
+        <translation>یک فایل برای خروجیگیری ماشین مجازی انتخاب کنید</translation>
     </message>
 </context>
 <context>
@@ -6980,19 +6996,19 @@
     </message>
     <message>
         <source>These are the virtual machines contained in the appliance and the suggested settings of the imported VirtualBox machines. You can change many of the properties shown by double-clicking on the items and disable others using the check boxes below.</source>
-        <translation>اینها ماشین های مجازی شامل در وسیله و تنظیمات پیشنهاد شده ماشین های مجازی واردشده هستند.میتوانید بسیاری از مشخصات نمایش داده شده را بادومرتبه کلیک روی آیتم تغییر دهید و بقیه را توسط جک باکس زیر غیرفعال کنید.</translation>
+        <translation>اینها ماشین های مجازی شامل در وسیله و تنظیمات پیشنهاد شده ماشین های مجازی واردشده هستند.میتوانید بسیاری از مشخصات نمایش داده شده را بادومرتبه کلیک روی آیتم تغییر دهید و بقیه را توسط چک باکس زیر غیرفعال کنید.</translation>
     </message>
     <message>
         <source>Import Virtual Appliance</source>
-        <translation type="unfinished"></translation>
+        <translation>وارد کردن یک وسیله مجازی</translation>
     </message>
     <message>
         <source>Choose a virtual appliance file to import...</source>
-        <translation type="unfinished"></translation>
+        <translation>یک وسیله مجازی برای وارد کردن انتخاب کنید...</translation>
     </message>
     <message>
         <source>Please choose a virtual appliance file to import</source>
-        <translation type="unfinished"></translation>
+        <translation>لطفا یک فایل وسیله مجازی برای وارد کردن انتخاب کنید</translation>
     </message>
 </context>
 <context>
@@ -7019,7 +7035,7 @@
     </message>
     <message>
         <source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
-        <translation>لطفا انتخاب کنید چه موقع فایل درایو سخت مجازی جدید باید بزرگ شود بمهان اندازه که استفاده شده است (پویا اختصاص داده شده) یا آن باید در حداکثر حجم ایجاد شود (حجم ثابت شده).</translation>
+        <translation>لطفا انتخاب کنید چه موقع فایل درایو سخت مجازی جدید باید بزرگ شود به همان اندازه که استفاده شده است (پویا اختصاص داده شده) یا آن باید در حداکثر حجم ایجاد شود (حجم ثابت شده).</translation>
     </message>
     <message>
         <source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
@@ -7176,7 +7192,7 @@
     </message>
     <message>
         <source>Choose...</source>
-        <translation type="unfinished"></translation>
+        <translation>انتخاب کنید...</translation>
     </message>
 </context>
 <context>
@@ -7187,7 +7203,7 @@
     </message>
     <message>
         <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
-        <translation type="unfinished">مقدار مسیر پیش فرض واقعی بعداز پذیرفتن تغییرات و بازکردن دوباره این پنجره نمایش داده میشود.</translation>
+        <translation>مقدار مسیر پیش فرض واقعی بعداز پذیرفتن تغییرات و بازکردن دوباره این پنجره نمایش داده میشود.</translation>
     </message>
     <message>
         <source><not selected></source>
@@ -8521,56 +8537,56 @@
     <message>
         <source>Enabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished">فعال شده</translation>
+        <translation>فعال شده</translation>
     </message>
     <message>
         <source>Disabled</source>
         <comment>details report (Unrestricted Execution)</comment>
-        <translation type="unfinished">غیرفعال شده</translation>
+        <translation>غیرفعال شده</translation>
     </message>
     <message>
         <source>Unrestricted Execution</source>
         <comment>details report</comment>
-        <translation type="unfinished"></translation>
+        <translation>اِجرای بدون محدودیت</translation>
     </message>
     <message>
         <source>PS/2 Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>PS/2 Mouse</translation>
     </message>
     <message>
         <source>USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>موس یو اِس بی</translation>
     </message>
     <message>
         <source>USB Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>تبلت یو اِس بی</translation>
     </message>
     <message>
         <source>PS/2 and USB Mouse</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>ماوس پی اِس/2 و یو اِس بی</translation>
     </message>
     <message>
         <source>USB Multi-Touch Tablet</source>
         <comment>PointingHIDType</comment>
-        <translation type="unfinished"></translation>
+        <translation>تبلت چند لمسی یو اِس بی</translation>
     </message>
     <message>
         <source>NAT Network</source>
         <comment>NetworkAttachmentType</comment>
-        <translation type="unfinished"></translation>
+        <translation>شبکه NAT</translation>
     </message>
     <message>
         <source>NAT network, '%1'</source>
         <comment>details report (network)</comment>
-        <translation type="unfinished"></translation>
+        <translation>شبکه NAT، '%1'</translation>
     </message>
     <message>
         <source>You can create or add disk image files in the virtual machine settings.</source>
-        <translation type="unfinished"></translation>
+        <translation>شما میتوانید فایل های ایمیج دیسک را در تنظیمات ماشین مجازی اضافه یا ایجاد نمائیید.</translation>
     </message>
     <message>
         <source>Enabled</source>
@@ -8584,7 +8600,7 @@
     </message>
     <message>
         <source>Unrestricted Execution</source>
-        <translation type="unfinished"></translation>
+        <translation>اِجرای بدون محدودیت</translation>
     </message>
     <message>
         <source>USB</source>
@@ -9043,11 +9059,11 @@
     </message>
     <message>
         <source>Configuration &Details</source>
-        <translation type="unfinished"></translation>
+        <translation>جزئیات &پیکربندی</translation>
     </message>
     <message>
         <source>&Runtime Information</source>
-        <translation type="unfinished"></translation>
+        <translation>&اطلاعات زمان اِجرا</translation>
     </message>
 </context>
 </TS>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
index 1fd5556..8662c99 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
@@ -892,6 +892,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Verkko</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3789,6 +3793,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4050,6 +4062,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
index 68fdabb..273cc96 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
@@ -932,6 +932,10 @@
         <source>Insert the Guest Additions disk file into the virtual drive</source>
         <translation>Insère le fichier d'image disque des Additions Invité dans le lecteur virtuel</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Réseau</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4135,6 +4139,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>Aucune Webcam supportée connectée</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4413,6 +4425,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>Activer l'enregistrement vidéo pour l'écran %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
@@ -6298,7 +6314,7 @@
     <message>
         <source>Check</source>
         <comment>inaccessible media message box</comment>
-        <translation>Tester</translation>
+        <translation>Vérifier</translation>
     </message>
     <message>
         <source>Switch</source>
@@ -6483,7 +6499,7 @@
     </message>
     <message>
         <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
-        <translation><p>Un ou plusieurs disques durs virtuels, CD, DVD, ou disquettes ne sont pas pas accessibles pour l'instant. Vous ne pourrez démarrer de machines virtuelles qui les utilisent tant qu'ils ne seront pas accessibles.</p><p>Cliquez sur <b>Ouvrir</b> pour ouvrir le Gestionnaire de médias virtuels et voir quels médias sont inaccessibles, ou bien sur <b>Ignorer</b> pour ignorer ce message.</p></translation>
+        <translation><p>Un ou plusieurs disques durs virtuels, CD, DVD, ou disquettes ne sont pas pas accessibles pour l'instant. Vous ne pourrez démarrer de machines virtuelles qui les utilisent tant qu'ils ne seront pas accessibles.</p><p>Cliquez sur <b>Vérifier</b> pour ouvrir le Gestionnaire de médias virtuels et voir quels médias sont inaccessibles, ou bien sur <b>Ignorer</b> pour ignorer ce message.</p></translation>
     </message>
     <message>
         <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
index 97358f3..4db2302 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
@@ -863,6 +863,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Rede</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3968,6 +3972,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4229,6 +4241,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
index 08522bf..1d8d255 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
@@ -1014,6 +1014,10 @@
         <source>&Webcams</source>
         <translation>&Webkamerák</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Hálózat</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4623,6 +4627,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation>Nincs támogatott webkamera a gazda PC-hez csatlakoztatva</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4905,6 +4917,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>Videó rögzítésének engedélyezése a képernyőn: %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
index 620fdcf..59b8200 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
@@ -932,6 +932,10 @@
         <source>&Webcams</source>
         <translation>&Webcam</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Jaringan</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4123,6 +4127,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>Tidak ada webcam yang didukung yang terhubung ke PC host</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4396,6 +4408,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>Fungsikan perekaman video bagi layar %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
index cdf61fb..c9132ef 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
@@ -1126,6 +1126,10 @@
         <source>&Webcams</source>
         <translation>&Webcam</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Rete</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4946,6 +4950,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation>Nessuna webcam supportata è connessa al PC host</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -5227,6 +5239,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>Abilita la registrazione video per lo schermo %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
index 15539f4..1342c13 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
@@ -108,7 +108,7 @@
         <translation>VirtualBox - %1 のエラー</translation>
     </message>
     <message>
-        <location filename="../src/main.cpp" line="659"/>
+        <location filename="../src/main.cpp" line="660"/>
         <source><html><b>%1 (rc=%2)</b><br/><br/></source>
         <translation><html><b>%1 (rc=%2)</b><br/><br/></translation>
     </message>
@@ -244,26 +244,26 @@
     </message>
     <message>
         <location filename="../src/extensions/QIMessageBox.cpp" line="310"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1731"/>
-        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="175"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1733"/>
+        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="176"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
         <location filename="../src/extensions/QIMessageBox.cpp" line="312"/>
-        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="177"/>
+        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="186"/>
         <source>Yes</source>
         <translation>はい</translation>
     </message>
     <message>
         <location filename="../src/extensions/QIMessageBox.cpp" line="313"/>
-        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="178"/>
+        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="187"/>
         <source>No</source>
         <translation>いいえ</translation>
     </message>
     <message>
         <location filename="../src/extensions/QIMessageBox.cpp" line="311"/>
-        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="176"/>
+        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="182"/>
         <source>Cancel</source>
         <translation>キャンセル</translation>
     </message>
@@ -630,52 +630,57 @@
         <translation>ドラッグ&ドロップ</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="831"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="809"/>
+        <source>Network</source>
+        <translation type="unfinished">ネットワーク</translation>
+    </message>
+    <message>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="834"/>
         <source>&Network Settings...</source>
         <translation>ネットワーク設定(&N)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="874"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="877"/>
         <source>&Shared Folders Settings...</source>
         <translation>共有フォルダー設定(&S)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="902"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="905"/>
         <source>R&emote Display</source>
         <translation>リモートディスプレイ(&E)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="903"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="906"/>
         <source>Toggle remote desktop (RDP) connections to this machine</source>
         <translation>この仮想マシンへのリモートデスクトップ(RDP)接続を切り替え</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="947"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="950"/>
         <source>&Video Capture</source>
         <translation>ビデオキャプチャー(&V)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="948"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="951"/>
         <source>Toggle video capture</source>
         <translation>ビデオキャプチャーの切り替え</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="973"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="976"/>
         <source>&Video Capture Settings...</source>
         <translation>ビデオキャプチャーの設定(&V)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="974"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="977"/>
         <source>Configure video capture settings</source>
         <translation>ビデオキャプチャーの設定を変更</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1004"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1007"/>
         <source>&Insert Guest Additions CD image...</source>
         <translation>Guest Additions のCDイメージを挿入(&I)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1005"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1008"/>
         <source>Insert the Guest Additions disk file into the virtual drive</source>
         <translation>Guest Additions ディスクファイルを仮想ドライブに挿入します</translation>
     </message>
@@ -684,7 +689,7 @@
         <translation type="obsolete">ネットワークアダプター(&N)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="832"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="835"/>
         <source>Change the settings of network adapters</source>
         <translation>ネットワークアダプターの設定変更</translation>
     </message>
@@ -693,7 +698,7 @@
         <translation type="obsolete">共有フォルダー(&S)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="875"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="878"/>
         <source>Create or modify shared folders</source>
         <translation>共有フォルダーを作成または変更</translation>
     </message>
@@ -744,115 +749,115 @@
         <translation type="obsolete">Guest Additions インストールイメージをマウントする</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1026"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1029"/>
         <source>De&bug</source>
         <translation>デバッグ(&B)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1051"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1054"/>
         <source>&Statistics...</source>
         <comment>debug action</comment>
         <translation>統計(&S)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1076"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1079"/>
         <source>&Command Line...</source>
         <comment>debug action</comment>
         <translation>コマンドライン(&C)...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1101"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1104"/>
         <source>&Logging...</source>
         <comment>debug action</comment>
         <translation>ログ取得(&L)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="322"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="327"/>
         <source>Show the log files of the selected virtual machine</source>
         <translation>選択した仮想マシンのログファイルを参照する</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="321"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="326"/>
         <source>Show &Log...</source>
         <translation>ログを参照(&L)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="342"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="347"/>
         <source>&Help</source>
         <translation>ヘルプ(&H)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="377"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="382"/>
         <source>&Contents...</source>
         <translation>ヘルプを表示(&C)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="378"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="383"/>
         <source>Show help contents</source>
         <translation>ヘルプを表示</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="403"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="408"/>
         <source>&VirtualBox Web Site...</source>
         <translation>VirtualBox Webサイト(&V)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="429"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="434"/>
         <source>&Reset All Warnings</source>
         <translation>すべての警告をリセット(&R)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="482"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="488"/>
         <source>C&heck for Updates...</source>
         <translation>アップデートを確認(&H)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="404"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="409"/>
         <source>Open the browser and go to the VirtualBox product web site</source>
         <translation>WebブラウザーでVirtualBox製品のWebサイトを開く</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="430"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="435"/>
         <source>Go back to showing all suppressed warnings and messages</source>
         <translation>すべての抑止された警告とメッセージを再度表示させる</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="455"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="461"/>
         <source>&Network Operations Manager...</source>
         <translation>ネットワーク操作マネージャー(&N)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="456"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="462"/>
         <source>Show Network Operations Manager</source>
         <translation>ネットワーク操作マネージャーの表示</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="483"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="489"/>
         <source>Check for a new VirtualBox version</source>
         <translation>VirtualBoxの最新バージョンを確認</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="509"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="516"/>
         <source>&About VirtualBox...</source>
         <translation>VirtualBox について(&A)...</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIActionPool.cpp" line="510"/>
+        <location filename="../src/globals/UIActionPool.cpp" line="517"/>
         <source>Show a window with product information</source>
         <translation>製品情報ウィンドウを表示</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1140"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1143"/>
         <source>Dock Icon</source>
         <translation>ドックアイコン</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1165"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1168"/>
         <source>Show Monitor Preview</source>
         <translation>ディスプレイのプレビューを表示</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1190"/>
+        <location filename="../src/runtime/UIActionPoolRuntime.cpp" line="1193"/>
         <source>Show Application Icon</source>
         <translation>アプリケーションアイコンを表示</translation>
     </message>
@@ -1192,7 +1197,8 @@
         <translation>閉じる(&C)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIShortcutPool.cpp" line="235"/>
+        <location filename="../src/globals/UIShortcutPool.cpp" line="234"/>
+        <location filename="../src/globals/UIShortcutPool.cpp" line="241"/>
         <source>Popup Menu</source>
         <translation>ポップアップメニュー</translation>
     </message>
@@ -1834,7 +1840,7 @@
         <translation type="obsolete">なし</translation>
     </message>
     <message>
-        <location filename="../src/selector/UIVMDesktop.cpp" line="131"/>
+        <location filename="../src/selector/UIVMDesktop.cpp" line="134"/>
         <source>The selected virtual machine is <i>inaccessible</i>. Please inspect the error message shown below and press the <b>Refresh</b> button if you want to repeat the accessibility check:</source>
         <translation>選択した仮想マシンに<i>アクセスできません</i>。アクセス可否を再確認するには以下に示されたエラーメッセージを調査して<b>[最新の情報に更新]</b>ボタンをクリックしてください:</translation>
     </message>
@@ -3189,37 +3195,37 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">更新を無効化</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="264"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="275"/>
         <source>Update disabled</source>
         <translation>更新を無効化</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="265"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="276"/>
         <source>Every 0.5 s</source>
         <translation>0.5秒毎</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="266"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="277"/>
         <source>Every 1 s</source>
         <translation>1秒毎</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="267"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="278"/>
         <source>Every 2 s</source>
         <translation>2秒毎</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="268"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="279"/>
         <source>Every 5 s</source>
         <translation>5秒毎</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="269"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="280"/>
         <source>Every 10 s</source>
         <translation>10秒毎</translation>
     </message>
     <message>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="302"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="121"/>
         <source>No preview</source>
         <translation>プレビューなし</translation>
     </message>
@@ -4379,89 +4385,89 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UIHostComboEditor</name>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="100"/>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="114"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="102"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="116"/>
         <source><key_%1></source>
         <translation><キー_%1></translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="126"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="128"/>
         <source>Left </source>
         <translation>左 </translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="132"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="134"/>
         <source>Right </source>
         <translation>右 </translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="247"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="249"/>
         <source>Left Shift</source>
         <translation>左 Shift</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="248"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="250"/>
         <source>Right Shift</source>
         <translation>右 Shift</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="249"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="251"/>
         <source>Left Ctrl</source>
         <translation>左 Ctrl</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="250"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="252"/>
         <source>Right Ctrl</source>
         <translation>右 Ctrl</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="251"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="253"/>
         <source>Left Alt</source>
         <translation>左 Alt</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="252"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="254"/>
         <source>Right Alt</source>
         <translation>右 Alt</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="253"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="255"/>
         <source>Left WinKey</source>
         <translation>左 Windowsキー</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="254"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="256"/>
         <source>Right WinKey</source>
         <translation>右 Windowsキー</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="255"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="257"/>
         <source>Menu key</source>
         <translation>メニューキー</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="256"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="258"/>
         <source>Alt Gr</source>
         <translation>Alt Gr</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="257"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="259"/>
         <source>Caps Lock</source>
         <translation>Caps Lock</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="258"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="260"/>
         <source>Scroll Lock</source>
         <translation>Scroll Lock</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="275"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="277"/>
         <source>Host+</source>
         <translation>Host+</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="290"/>
-        <location filename="../src/widgets/UIHostComboEditor.cpp" line="700"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="292"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="778"/>
         <source>None</source>
         <translation>なし</translation>
     </message>
@@ -4649,12 +4655,13 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">Back</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHotKeyEditor.cpp" line="168"/>
+        <location filename="../src/widgets/UIHotKeyEditor.cpp" line="172"/>
         <source>Reset shortcut to default</source>
         <translation>ショートカットを既定にリセットする</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIHotKeyEditor.cpp" line="169"/>
+        <location filename="../src/widgets/UIHostComboEditor.cpp" line="366"/>
+        <location filename="../src/widgets/UIHotKeyEditor.cpp" line="173"/>
         <source>Unset shortcut</source>
         <translation>ショートカットを戻す</translation>
     </message>
@@ -4961,26 +4968,36 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">試験的ビルド %1r%2 - %3</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="657"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="750"/>
         <source>Preview Monitor %1</source>
         <translation>プレビュー ディスプレイ %1</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1215"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1293"/>
         <source>Snapshot %1</source>
         <translation>スナップショット %1</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1884"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1962"/>
         <source>No Webcams Connected</source>
         <translation>ウェブカメラが接続されていません</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1885"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1963"/>
         <source>No supported webcams connected to the host PC</source>
         <translation>ホストPCに接続されているウェブカメラはサポートされていません</translation>
     </message>
     <message>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="2188"/>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="2188"/>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source>More CD/DVD Images...</source>
         <translation type="obsolete">CD/DVD イメージの追加...</translation>
     </message>
@@ -4997,7 +5014,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">フロッピーデバイスのマウント解除</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1310"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1388"/>
         <source>Select a filename for the screenshot ...</source>
         <translation>スクリーンショットの名前を選択...</translation>
     </message>
@@ -5018,12 +5035,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">フロッピーデバイス 未割り当て</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1818"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1896"/>
         <source>No USB Devices Connected</source>
         <translation>USB デバイス 未接続</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1819"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1897"/>
         <source>No supported devices connected to the host PC</source>
         <translation>ホストマシンに接続されたデバイスはサポートされていません</translation>
     </message>
@@ -5084,89 +5101,94 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">2D ビデオアクセラレーションが有効化されました。しかし 2D ビデオアクセラレーションはWindowsゲストでのみサポートされるため、本機能は無効化されます。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="320"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="322"/>
         <source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
         <translation>仮想マシンはハードウェアグラフィックスアクセラレーションを使用するように設定されています。しかしホストシステムがこの機能を提供しておらず、マシンを開始することができません。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="333"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="335"/>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
         <translation>仮想マシンはビデオメモリーが <b>%1</b> よりも少なく割り当てられています。フルスクリーンやシームレスモードに切り替えるなら最低でも左記の量を割り当ててください。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="344"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="346"/>
         <source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
         <translation>仮想マシンはビデオメモリーが <b>%1</b> よりも少なく割り当てられています。HDビデオを効果的に再生するなら最低でも左記の量を割り当ててください。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="361"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="363"/>
         <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
         <translation>仮想マシンはハードウェアグラフィックスアクセラレーションを使用するように設定されており、かつOSのヒントがWindows Vistaかそれ以降を指定しています。ベストパフォーマンスを引き出すために、マシンのビデオメモリーを少なくとも<b>%1</b>にしてください。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="375"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="377"/>
         <source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
         <translation>仮想マシンはビデオストリームアクセラレーションを使用するように設定されています。この機能はWindowsゲストでしか動作しないので無効化されます。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="394"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="397"/>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="408"/>
         <source>The VRDE server port value is not currently specified.</source>
         <translation>VRDEサーバーのポート値が指定されていません。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="401"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="415"/>
         <source>The VRDE authentication timeout value is not currently specified.</source>
         <translation>VRDE認証のタイムアウト値が指定されていません。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="455"/>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="456"/>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="882"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="469"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="470"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="896"/>
         <source><qt>%1&nbsp;MB</qt></source>
         <translation><qt>%1&nbsp;MB</qt></translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="457"/>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="458"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="471"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="472"/>
         <source><qt>%1</qt></source>
         <translation><qt>%1</qt></translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="466"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="480"/>
         <source>User Defined</source>
         <translation>ユーザー定義</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="467"/>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="468"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="481"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="482"/>
         <source>%1 fps</source>
         <translation>%1 fps</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="469"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="483"/>
         <source>fps</source>
         <translation>fps</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="470"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="484"/>
         <source>low</source>
         <comment>quality</comment>
         <translation>低</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="471"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="485"/>
         <source>medium</source>
         <comment>quality</comment>
         <translation>中</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="472"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="486"/>
         <source>high</source>
         <comment>quality</comment>
         <translation>高</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="473"/>
+        <location filename="../src/settings/machine/UIMachineSettingsDisplay.cpp" line="487"/>
         <source>kbps</source>
         <translation>kbps</translation>
     </message>
@@ -6641,17 +6663,17 @@ p, li { white-space: pre-wrap; }
         <translation><nobr>フロッピー&nbsp;デバイス&nbsp;の追加</nobr></translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2127"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2125"/>
         <source>No name is currently specified for the controller at position <b>%1</b>.</source>
         <translation>現在 <b>%1</b> に割り当てたコントローラーに名前が与えられていません。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2133"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2131"/>
         <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
         <translation><b>%1</b> に割り当てたコントローラーの名前は、 <b>%2</b> に割り当てたコントローラーですでに使用中です。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2151"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2149"/>
         <source>No hard disk is selected for <i>%1</i>.</source>
         <translation> <i>%1</i>のためのハードディスクが選択されていません。</translation>
     </message>
@@ -6672,13 +6694,13 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><i>%1</i>が使用するメディアはすでに<i>%2</i>に割り当てられています。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2177"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2175"/>
         <source>at most one supported</source>
         <comment>controller</comment>
         <translation>1個だけサポート</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2178"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2176"/>
         <source>up to %1 supported</source>
         <comment>controllers</comment>
         <translation>%1個までサポート</translation>
@@ -6688,92 +6710,92 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">%1チップセットがサポートするより多くのストレージコントローラーを指定しています。 システムページでチップセットのタイプを変更するか、ストレージページで次のストレージコントローラーの数を減らしてください: %2。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2157"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2155"/>
         <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
         <translation>ディスク <i>%1</i>はすでに<i>%2</i>に割り当てられています。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2184"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2182"/>
         <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
         <translation>現在 %1 チップセットがサポートしている以上のストレージコントローラーを割り当てています。 システムページでチップセットのタイプを変更するか、ストレージページで次のストレージコントローラーの数を減らしてください: %2</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2210"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2208"/>
         <source>Add Controller</source>
         <translation>コントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2211"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2209"/>
         <source>Add IDE Controller</source>
         <translation>IDE コントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2212"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2210"/>
         <source>Add SATA Controller</source>
         <translation>SATA コントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2213"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2211"/>
         <source>Add SCSI Controller</source>
         <translation>SCSI コントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2214"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2212"/>
         <source>Add SAS Controller</source>
         <translation>SAS コントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2215"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2213"/>
         <source>Add Floppy Controller</source>
         <translation>フロッピーコントローラーを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2216"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2214"/>
         <source>Remove Controller</source>
         <translation>コントローラーを除去</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2217"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2215"/>
         <source>Add Attachment</source>
         <translation>割り当ての追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2218"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2216"/>
         <source>Add Hard Disk</source>
         <translation>ハードディスクを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2219"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2217"/>
         <source>Add CD/DVD Device</source>
         <translation>CD/DVD デバイスを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2220"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2218"/>
         <source>Add Floppy Device</source>
         <translation>フロッピーデバイスを追加</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2221"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2219"/>
         <source>Remove Attachment</source>
         <translation>割り当てを除去</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2223"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2221"/>
         <source>Adds a new controller to the end of the Storage Tree.</source>
         <translation>新しいコントローラーをストレージツリーの最後に追加します。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2224"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2222"/>
         <source>Removes the controller highlighted in the Storage Tree.</source>
         <translation>ハイライト表示されたストレージツリーのコントローラーを除去します。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2225"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2223"/>
         <source>Adds a new attachment to the Storage Tree using currently selected controller as parent.</source>
         <translation>現在選択されているコントローラーを親として新たな割り当てをストレージツリーに追加します。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2227"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2225"/>
         <source>Removes the attachment highlighted in the Storage Tree.</source>
         <translation>ハイライト表示されたストレージツリーの割り当てを除去します。</translation>
     </message>
@@ -6798,77 +6820,77 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">SAS コントローラー</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2504"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2502"/>
         <source>Hard &Disk:</source>
         <translation>ハードディスク(&D):</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2506"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2504"/>
         <source>Choose or create a virtual hard disk file. The virtual machine will see the data in the file as the contents of the virtual hard disk.</source>
         <translation>仮想ハードディスクファイルを選択または作成します。仮想マシンはファイルのデータを仮想的なハードディスクの内容と見なします。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2508"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2506"/>
         <source>Set up the virtual hard disk</source>
         <translation>仮想ハードディスクの設定</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2511"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2509"/>
         <source>CD/DVD &Drive:</source>
         <translation>CD/DVDドライブ(&D):</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2513"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2511"/>
         <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
         <translation>仮想CD/DVDディスクを選択するか、物理ドライブを仮想ドライブに割り当てます。仮想マシンはファイルのデータまたは物理的なドライブの内容が仮想ドライブに挿入されていると見なします。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2516"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2514"/>
         <source>Set up the virtual CD/DVD drive</source>
         <translation>仮想CD/DVDドライブの設定</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2519"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2517"/>
         <source>Floppy &Drive:</source>
         <translation>フロッピー ドライブ(&D):</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2521"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2519"/>
         <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
         <translation>仮想フロッピーディスクを選択するか、物理ドライブを仮想ドライブに割り当てます。仮想マシンはファイルのデータまたは物理的なドライブの内容が仮想ドライブに挿入されていると見なします。</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2524"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2522"/>
         <source>Set up the virtual floppy drive</source>
         <translation>仮想フロッピードライブの設定</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2652"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2650"/>
         <source>Create a new hard disk...</source>
         <translation>新規仮想ハードディスクの作成...</translation>
     </message>
     <message>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2657"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2655"/>
         <source>Choose a virtual hard disk file...</source>
         <translation>仮想ハードディスクファイルの選択...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1627"/>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2665"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1705"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2663"/>
         <source>Choose a virtual CD/DVD disk file...</source>
         <translation>仮想CD/DVDディスクファイルの選択...</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1628"/>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1634"/>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2672"/>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2689"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1706"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1712"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2670"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2687"/>
         <source>Remove disk from virtual drive</source>
         <translation>仮想ドライブからディスクを除去</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIMachineLogic.cpp" line="1633"/>
-        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2682"/>
+        <location filename="../src/runtime/UIMachineLogic.cpp" line="1711"/>
+        <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2680"/>
         <source>Choose a virtual floppy disk file...</source>
         <translation>仮想フロッピーディスクファイルの選択...</translation>
     </message>
@@ -7052,7 +7074,7 @@ p, li { white-space: pre-wrap; }
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="551"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1336"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1342"/>
         <location filename="../src/selector/graphics/details/UIGDetailsElements.cpp" line="490"/>
         <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="544"/>
         <source>Controller: %1</source>
@@ -7668,7 +7690,7 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UIMachineWindow</name>
     <message>
-        <location filename="../src/runtime/UIMachineWindow.cpp" line="214"/>
+        <location filename="../src/runtime/UIMachineWindow.cpp" line="219"/>
         <source> EXPERIMENTAL build %1r%2 - %3</source>
         <translation>試験的ビルド %1r%2 - %3</translation>
     </message>
@@ -7684,17 +7706,17 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UIMediumManager</name>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1271"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1216"/>
         <source>&Hard drives</source>
         <translation>ハードドライブ(&H)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1280"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1225"/>
         <source>&Optical disks</source>
         <translation>光学ディスク(&O)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1285"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1230"/>
         <source>&Floppy disks</source>
         <translation>フロッピーディスク(&F)</translation>
     </message>
@@ -7703,7 +7725,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">選択(&S)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1302"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1247"/>
         <source>C&lose</source>
         <translation>閉じる(&L)</translation>
     </message>
@@ -7729,143 +7751,143 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UIMessageCenter</name>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="258"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2724"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="260"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2728"/>
         <source>VirtualBox - Information</source>
         <comment>msg box title</comment>
         <translation>VirtualBox - 情報</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="262"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2728"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="264"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2732"/>
         <source>VirtualBox - Question</source>
         <comment>msg box title</comment>
         <translation>VirtualBox - 質問</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="266"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2732"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="268"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2736"/>
         <source>VirtualBox - Warning</source>
         <comment>msg box title</comment>
         <translation>VirtualBox - 警告</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="270"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2736"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="272"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2740"/>
         <source>VirtualBox - Error</source>
         <comment>msg box title</comment>
         <translation>VirtualBox - エラー</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="274"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2740"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="276"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2744"/>
         <source>VirtualBox - Critical Error</source>
         <comment>msg box title</comment>
         <translation>VirtualBox - 重大なエラー</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="890"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="892"/>
         <source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
         <translation><p>NATネットワーク<nobr><b>%1</b></nobr> を除去しますか?</p> <p>このネットワークをひとつ以上の仮想マシンネットワークアダプターで使用中の場合は、別のネットワーク名や別のアダプタータイプを選択しない限りふたたび使えるようにはなりません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1940"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1942"/>
         <source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
         <translation>ウェブカメラ<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当てに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1948"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1950"/>
         <source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
         <translation>ウェブカメラ<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当て解除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1957"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1959"/>
         <source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b> のリモートデスクトップサーバーを有効化できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1958"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1960"/>
         <source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b> のリモートデスクトップサーバーを無効化できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1968"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1970"/>
         <source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b> のビデオキャプチャーを有効化できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1969"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1971"/>
         <source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b> のビデオキャプチャーを無効化できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1976"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1978"/>
         <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
         <translation><p>VirtualBox Guest Additionsがインストールされていないため、共有フォルダーは利用できません。共有フォルダーを使用するには<b>[デバイス]</b>メニューから<b>[Guest Additions のCDイメージを挿入]</b>を選びGuest Additionsをインストールまたは再インストールしてください。インストール後、仮想マシンを再起動すると共有フォルダーが利用できます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2017"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2029"/>
         <source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
         <translation><p><b>VirtualBox Guest Additions</b> ディスクイメージファイルが見つかりません。</p><p>インターネットからディスクイメージをダウンロードしますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2020"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2030"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2079"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2089"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2118"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2128"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2032"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2042"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2082"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2092"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2121"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2131"/>
         <source>Download</source>
         <translation>ダウンロード</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2026"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2038"/>
         <source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
         <translation><p>本当に<b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr> からダウンロードしますか? (サイズ %2バイト)</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2036"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2048"/>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
         <translation><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードしましたが、<nobr><b>%2</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2046"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2058"/>
         <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
         <translation><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b>に保存しました。</nobr></p><p>ディスクイメージファイルを登録し、仮想CD/DVDドライブに挿入しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2052"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2064"/>
         <source>Insert</source>
         <comment>additions</comment>
         <translation>挿入</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2058"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1989"/>
         <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
         <translation><p>仮想マシン<b>"%1"</b>にCD/DVDドライブがないので、<b>VirtualBox Guest Additions</b>のディスクイメージを仮想マシンに挿入できません。 仮想マシン設定ウィンドウのストレージページでドライブを追加してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2075"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2078"/>
         <source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
         <translation><p><b>VirtualBox ユーザーマニュアル</b> <nobr><b>%1</b></nobr>が見つかりません。</p><p>ダウンロードしますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2085"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2088"/>
         <source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
         <translation><p><b>VirtualBox ユーザーマニュアル</b>を<nobr><a href="%1">%1</a></nobr> からダウンロードしますか? (サイズ %2バイト)</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2095"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2098"/>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
         <translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%1</a></nobr>からダウンロードしましたが、<nobr><b>%2</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2105"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2108"/>
         <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
         <translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b></nobr>に保存しました。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2759"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2763"/>
         <source>Do not show this message again</source>
         <comment>msg box flag</comment>
         <translation>次回からこのメッセージを表示しない</translation>
@@ -7875,37 +7897,37 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">クラッシュを防ぐため、Windows/x64では仮想マシンに含まれるすべてのファイルの削除は現在できません。これは次回のリリースで修正されます。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="503"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="505"/>
         <source>Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type.</source>
         <translation><tt>%1</tt>を開けませんでした。デスクトップ環境が適切にURLを扱えることを確認してください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="401"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="403"/>
         <source><p>Failed to initialize COM or to find the VirtualBox COM server. Most likely, the VirtualBox server is not running or failed to start.</p><p>The application will now terminate.</p></source>
         <translation><p>COM の初期化に失敗したか、またはVirtualBox COMサーバーが見つかりませんでした。VirtualBoxサーバーが起動していないか、または起動に失敗しています。</p><p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="390"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="392"/>
         <source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
         <translation><p>VirtualBox のグローバル設定ディレクトリー <b><nobr>%1</nobr></b> にアクセスできないため、 COM の初期化に失敗しました。このディレクトリーならびに親ディレクトリーのパーミッションを確認してください。</p><p>このアプリケーションは終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="410"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="412"/>
         <source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
         <translation><p>VirtualBox COMオブジェクトの作成に失敗しました。</p><p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="980"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="982"/>
         <source>Failed to set global VirtualBox properties.</source>
         <translation>グローバルなVirtualBoxのプロパティの設定に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="994"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="996"/>
         <source>Failed to access the USB subsystem.</source>
         <translation>USBサブシステムのアクセスに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1444"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1446"/>
         <source>Failed to create a new virtual machine.</source>
         <translation>新規仮想マシンの作成に失敗しました。</translation>
     </message>
@@ -7914,17 +7936,17 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">新規仮想マシン<b>"%1"</b>の作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="511"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="513"/>
         <source>Failed to open virtual machine located in %1.</source>
         <translation>仮想マシン<b>"%1"</b>を開けませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1451"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1453"/>
         <source>Failed to register the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b> の登録に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="519"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="521"/>
         <source>Failed to add virtual machine <b>%1</b> located in <i>%2</i> because its already present.</source>
         <translation>仮想マシン<b>"%1"</b>(<i>"%2"</i>)の追加に失敗しました。すでに存在します。</translation>
     </message>
@@ -7933,73 +7955,73 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想マシン<b>"%1"</b>の設定の適用に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1016"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1018"/>
         <source><p>The machine settings were changed while you were editing them. You currently have unsaved setting changes.</p><p>Would you like to reload the changed settings or to keep your own changes?</p></source>
         <translation><p>編集中にマシンの設定が変更されました。現在保存されていない変更が含まれています。</p><p>変更を再読み込みするか、現在の設定を保持しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1020"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1022"/>
         <source>Reload settings</source>
         <translation>設定を再読み込み</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1020"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1022"/>
         <source>Keep changes</source>
         <translation>設定を保持</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1006"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1008"/>
         <source>The virtual machine that you are changing has been started. Only certain settings can be changed while a machine is running. All other changes will be lost if you close this window now.</source>
         <translation>設定を変更した仮想マシンを開始しました。マシンの起動中に変更できる設定は特定のもののみとなります。このウィンドウをすぐに閉じた場合は、他のすべての変更点は失われます。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1786"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1794"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1788"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1796"/>
         <source>Failed to start the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の起動に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="724"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="726"/>
         <source>Failed to pause the execution of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の一時停止に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="732"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="734"/>
         <source>Failed to resume the execution of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の再開に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="748"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="756"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="750"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="758"/>
         <source>Failed to save the state of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の状態の保存に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1459"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1467"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1461"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1469"/>
         <source>Failed to clone the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン <b>%1</b>.のクローンに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="840"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="848"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="842"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="850"/>
         <source>Failed to create a snapshot of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>のスナップショット作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="772"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="780"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="774"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="782"/>
         <source>Failed to stop the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の停止に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="650"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="658"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="652"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="660"/>
         <source>Failed to remove the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の除去に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="740"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="742"/>
         <source>Failed to discard the saved state of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>の保存された状態の破棄に失敗しました。</translation>
     </message>
@@ -8016,7 +8038,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想マシン<b>"%1"</b>の最新のスナップショットと状態の破棄に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="456"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="458"/>
         <source>There is no virtual machine named <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>がありません。</translation>
     </message>
@@ -8075,13 +8097,13 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">%1 <nobr><b>%2</b></nobr>の登録解除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="472"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="474"/>
         <source>Failed to create a new session.</source>
         <translation>新規セッションの作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="479"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="487"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="481"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="489"/>
         <source>Failed to open a session for the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>のセッションを開けませんでした。</translation>
     </message>
@@ -8094,26 +8116,26 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">ホストネットワークインターフェース<b>"%1"</b>の作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="964"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="972"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="966"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="974"/>
         <source>Failed to remove the host network interface <b>%1</b>.</source>
         <translation>ホストネットワークインターフェース<b>"%1"</b>を除去できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1908"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1916"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1910"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1918"/>
         <source>Failed to attach the USB device <b>%1</b> to the virtual machine <b>%2</b>.</source>
         <translation>USB デバイス<b>"%1"</b>の仮想マシン<b>"%2"</b>への割り当てに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1924"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1932"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1926"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1934"/>
         <source>Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>.</source>
         <translation>USB デバイス<b>"%1"</b>の仮想マシン<b>"%2"</b>からの割り当て解除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1114"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1123"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1116"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1125"/>
         <source>Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>.</source>
         <translation>仮想マシン<b>"%3"</b>の共有フォルダー<b>"%1"</b>(参照先 <nobr><b>%2</b></nobr>)の作成に失敗しました。</translation>
     </message>
@@ -8132,17 +8154,17 @@ p, li { white-space: pre-wrap; }
         <translation>OK</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="457"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="458"/>
         <source><p>The Virtual Machine reports that the guest OS does not support <b>mouse pointer integration</b> in the current video mode. You need to capture the mouse (by clicking over the VM display or pressing the host key) in order to use the mouse inside the guest OS.</p></source>
         <translation><p>現在のビデオモードではゲストOSで<b>マウス統合</b>機能がサポートされません。ゲストOSでマウスを使用するためにはマウスをキャプチャー(仮想マシンの画面をクリックするか、またはホストキーを押す)する必要があります。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="467"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="468"/>
         <source><p>The Virtual Machine is currently in the <b>Paused</b> state and not able to see any keyboard or mouse input. If you want to continue to work inside the VM, you need to resume it by selecting the corresponding action from the menu bar.</p></source>
         <translation><p>仮想マシンは現在<b>"一時停止"</b>状態のため、キーボードとマウス操作を受け付けません。仮想マシンでの作業を続けたい場合は、メニューバーから対応する動作を選択して、仮想マシンを再開する必要があります。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="481"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="482"/>
         <source><p>The virtual screen is currently set to a <b>%1&nbsp;bit</b> color mode. For better performance please change this to <b>%2&nbsp;bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
         <translation><p>現在仮想スクリーンは<b>%1&nbsp;ビット</b> カラーモードです。パフォーマンス向上のために <b>%2&nbsp;ビット</b> に変更してください。通常ゲストOSのコントロールパネルあるいはシステム設定にある<b>ディスプレイ</b> で変更できます。</p></translation>
     </message>
@@ -8151,19 +8173,19 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>ローカルの制限のため、 <i>VM Selector</i>モードでVirtualBoxを実行できません。</p><p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2067"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2070"/>
         <source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
         <translation>Guest Additionsの更新に失敗しました。Guest Additionsのインストールイメージは手動インストールのためマウントされます。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2256"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2264"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2260"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2268"/>
         <source>Failed to install the Extension Pack <b>%1</b>.</source>
         <translation>機能拡張パッケージ<b>"%1"</b>のインストールに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2272"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2280"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2276"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2284"/>
         <source>Failed to uninstall the Extension Pack <b>%1</b>.</source>
         <translation>機能拡張パッケージ<b>"%1"</b>のアンインストールに失敗しました。</translation>
     </message>
@@ -8172,195 +8194,195 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">機能拡張パッケージ<b>"%1"</b>を除去します。本当に除去しますか?</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2236"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2240"/>
         <source>&Remove</source>
         <translation>除去(&R)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1100"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1102"/>
         <source>The current port forwarding rules are not valid. None of the host or guest port values may be set to zero.</source>
         <translation>現在のポートフォワーディングルールは無効です。 ホストまたはゲストポートの値にゼロが設定されています。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="369"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="371"/>
         <source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
         <translation><p>ローカルの制限のため、VirtualBox マネージャーを実行できません。</p><p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="418"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="420"/>
         <source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
         <translation><p>言語ファイル<b>"%1"</b>が<b><nobr>%2</nobr></b>ディレクトリで見つかりません。</p><p>言語は一時的にシステムのデフォルト言語に設定されます。VirtualBox マネージャーウィンドウの<b>ファイル</b>メニューから<b>環境設定</b>ウィンドウを開き、<b>言語</b>ページにある言語から選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="428"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="430"/>
         <source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
         <translation><p>言語ファイル<b><nobr>"%1"</nobr></b>が読み込めません。</p> <p>言語は一時的にEnglish(内蔵)に設定されます。VirtualBox マネージャーウィンドウの<b>ファイル</b>メニューから<b>環境設定</b>ウィンドウを開き、<b>言語</b>ページで表示されている言語から選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="464"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="466"/>
         <source>There is no virtual machine with the identifier <b>%1</b>.</source>
         <translation>IDが <b>"%1"</b> の仮想マシンはありません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="674"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1732"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1871"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1892"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="676"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1734"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1873"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1894"/>
         <source>Ignore</source>
         <translation>無視</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="920"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="922"/>
         <source>Failed to create NAT network.</source>
         <translation>NATネットワークの作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="927"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="929"/>
         <source>Failed to remove NAT network <b>%1</b>.</source>
         <translation>NATネットワーク <b>%1</b> の除去に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="935"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="937"/>
         <source>Failed to create DHCP server.</source>
         <translation>DHCPサーバーの作成しに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="942"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="944"/>
         <source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
         <translation>ネットワークインターフェース <b>%1</b> のDHCPサーバーの除去に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="950"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="957"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="952"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="959"/>
         <source>Failed to create the host network interface.</source>
         <translation>ホストネットワークインターフェースの作成しに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1030"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1032"/>
         <source>Create &new disk</source>
         <translation>新規ディスクの作成(&N)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1030"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1032"/>
         <source>&Choose existing disk</source>
         <translation>既存のディスクを選択(&C)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1041"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1052"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1043"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1054"/>
         <source>Leave &empty</source>
         <translation>空のままにする(&E)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1041"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1052"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1043"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1054"/>
         <source>&Choose disk</source>
         <translation>ディスクを選択(&C)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1107"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1109"/>
         <source><p>There are unsaved changes in the port forwarding configuration.</p><p>If you proceed your changes will be discarded.</p></source>
         <translation><p>ポートフォワーディング設定の変更が保存されていません。</p><p>続行すると変更は破棄されます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1175"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1177"/>
         <source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1181"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1183"/>
         <source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
         <translation><p>仮想光学ディスク <nobr><b>%1</b></nobr>を解放しますか?</p><p>次の仮想マシンから取り外します: <b>%2</b></p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1187"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1189"/>
         <source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
         <translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr>を解放しますか?</p><p>次の仮想マシンから取り外します: <b>%2</b></p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1209"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1211"/>
         <source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
         <translation><p>ディスクイメージファイルのリストから仮想ハードディスク <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1221"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1223"/>
         <source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
         <translation><p>注:このハードディスクイメージにアクセスできないため、除去できません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1228"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1230"/>
         <source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
         <translation><p>ディスクイメージファイルのリストから仮想光学ドライブ <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1236"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1238"/>
         <source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
         <translation><p>ディスクイメージファイルのリストから仮想フロッピードライブ <nobr><b>%1</b></nobr>を除去しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1327"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1329"/>
         <source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
         <translation><p>仮想光学ディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> に挿入できません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1329"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1345"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1331"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1347"/>
         <source><p>Would you like to try to force insertion of this disk?</p></source>
         <translation><p>このディスクを強制挿入してみますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1333"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1335"/>
         <source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
         <translation><p>仮想光学ディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> から取り出せません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1335"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1351"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1337"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1353"/>
         <source><p>Would you like to try to force ejection of this disk?</p></source>
         <translation><p>このディスクを強制排出してみますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1343"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1345"/>
         <source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
         <translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> に挿入できません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1349"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1351"/>
         <source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
         <translation><p>仮想フロッピーディスク <nobr><b>%1</b></nobr> をマシン <b>%2</b> から取り出せません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1379"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1381"/>
         <source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
         <translation>ハードディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1384"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1386"/>
         <source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
         <translation>光学ディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1389"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1391"/>
         <source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
         <translation>フロッピーディスクファイル <nobr><b>%1</b></nobr> を開けませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1408"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1410"/>
         <source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
         <translation>ハードディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1413"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1415"/>
         <source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
         <translation>光学ディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1418"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1420"/>
         <source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
         <translation>フロッピディスクファイル <nobr><b>%2</b></nobr> を閉じられませんでした。</translation>
     </message>
     <message numerus="yes">
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1574"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1576"/>
         <source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
         <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
         <translation>
@@ -8368,47 +8390,47 @@ p, li { white-space: pre-wrap; }
         </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1642"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1644"/>
         <source><nobr>Fatal Error</nobr></source>
         <comment>runtime error info</comment>
         <translation><nobr>致命的なエラー</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1648"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1650"/>
         <source><nobr>Non-Fatal Error</nobr></source>
         <comment>runtime error info</comment>
         <translation><nobr>致命的でないエラー</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1654"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1656"/>
         <source><nobr>Warning</nobr></source>
         <comment>runtime error info</comment>
         <translation><nobr>警告</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1670"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1672"/>
         <source><nobr>Error ID: </nobr></source>
         <comment>runtime error info</comment>
         <translation><nobr>エラーID: </nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1671"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1673"/>
         <source>Severity: </source>
         <comment>runtime error info</comment>
         <translation>重要度:</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1679"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1681"/>
         <source><p>A fatal error has occurred during virtual machine execution! The virtual machine will be powered off. Please copy the following error message using the clipboard to help diagnose the problem:</p></source>
         <translation><p>仮想マシンの実行中に致命的なエラーが発生しました!仮想マシンの電源をオフにします。調査のために以下のエラーメッセージをクリップボードにコピーして使用してください:</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1687"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1689"/>
         <source><p>An error has occurred during virtual machine execution! The error details are shown below. You may try to correct the error and resume the virtual machine execution.</p></source>
         <translation><p>仮想マシンの実行中にエラーが発生しました!エラーの詳細を以下に示します。説明されたエラーを修正し、仮想マシンの再実行することができます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1695"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1697"/>
         <source><p>The virtual machine execution may run into an error condition as described below. We suggest that you take an appropriate action to avert the error.</p></source>
         <translation><p>仮想マシンの実行中、以下で説明されるエラーが発生するかもしれません。このメッセージは無視できますが、動作を確実にするために、説明された誤りを対策することが推奨されます。</p></translation>
     </message>
@@ -8417,17 +8439,17 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">申し訳ありません。不明なエラーが発生しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1074"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1076"/>
         <source>Failed to attach the hard disk (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>ハードディスク(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1080"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1082"/>
         <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1086"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1088"/>
         <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
     </message>
@@ -8436,32 +8458,32 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>この仮想マシンでUSB 2.0を有効化するには<b><nobr>%1</nobr></b>のインストールが必要です。VirtualBoxのダウンロードサイトから機能拡張パッケージをダウンロードし、インストールしてください。機能拡張パッケージをインストールすると、USB 2.0を有効化することができます。現在の設定をキャンセルしない場合、USB 2.0は無効化されます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2421"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2642"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2425"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2646"/>
         <source>Result&nbsp;Code: </source>
         <comment>error info</comment>
         <translation>終了コード&nbsp;: </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2648"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2652"/>
         <source>Component: </source>
         <comment>error info</comment>
         <translation>コンポーネント: </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2656"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2660"/>
         <source>Interface: </source>
         <comment>error info</comment>
         <translation>インターフェース: </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2665"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2669"/>
         <source>Callee: </source>
         <comment>error info</comment>
         <translation>呼び出し先: </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2673"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2677"/>
         <source>Callee&nbsp;RC: </source>
         <comment>error info</comment>
         <translation>呼び出し先&nbsp;RC: </translation>
@@ -8491,8 +8513,8 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想マシン<b>%1<b>のスナップショット保存フォルダーのパスを<nobr><b>%2</b></nobr>に変更できませんでした。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1132"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1143"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1134"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1145"/>
         <source><p>Failed to remove the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) from the virtual machine <b>%3</b>.</p><p>Please close all programs in the guest OS that may be using this shared folder and try again.</p></source>
         <translation><p>仮想マシン<b>%3</b>の共有フォルダー<b>%1</b>(参照先:<nobr><b>%2</b></nobr>)の除去に失敗しました。</p><p>この共有フォルダーを使用しているゲストOSのすべてのプログラムを終了し、再実行してください。</p></translation>
     </message>
@@ -8538,12 +8560,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><nobr><b>"%1"</b></nobr>にライセンスファイルが見つかりません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2311"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2315"/>
         <source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
         <translation>ライセンスファイル<nobr><b>"%1"</b></nobr>が開けません。ファイルのパーミッションを確認してください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="764"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="766"/>
         <source>Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>"%1"</b>への電源ボタン オフのACPIイベント送信に失敗しました。</translation>
     </message>
@@ -8564,19 +8586,19 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>グローバルなVirtualBox設定の<b><nobr>"%1"</nobr></b>への保存に失敗しました。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="438"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="440"/>
         <source><p>Failed to load the global GUI configuration from <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
         <translation><p>グローバルなGUI構成の<b><nobr>"%1"</nobr></b>からの読み込みに失敗しました。</p>
 <p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="447"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="449"/>
         <source><p>Failed to save the global GUI configuration to <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
         <translation><p>グローバルなGUI構成の<b><nobr>"%1"</nobr></b>への保存に失敗しました。</p>
 <p>アプリケーションを終了します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1154"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1156"/>
         <source>Failed to save the settings of the virtual machine <b>%1</b> to <b><nobr>%2</nobr></b>.</source>
         <translation>仮想マシン<b>"%1"</b>の設定の<b><nobr>"%2"</nobr></b>への保存に失敗しました。</translation>
     </message>
@@ -8595,7 +8617,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">登録解除</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="686"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="688"/>
         <source>Discard</source>
         <comment>saved state</comment>
         <translation>破棄</translation>
@@ -8650,14 +8672,14 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">マウント</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1811"/>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="432"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1813"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="433"/>
         <source><p>The host key is currently defined as <b>%1</b>.</p></source>
         <comment>additional message box paragraph</comment>
         <translation><p>現在ホストキーは<b>%1</b>に割り当てられています。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1817"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1819"/>
         <source>Capture</source>
         <comment>do input capture</comment>
         <translation>キャプチャー</translation>
@@ -8668,7 +8690,7 @@ p, li { white-space: pre-wrap; }
 <p><b>[確認]</b>ボタンをクリックして仮想ディスクマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="674"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="676"/>
         <source>Check</source>
         <comment>inaccessible media message box</comment>
         <translation>確認</translation>
@@ -8712,19 +8734,19 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>仮想マシンを本当にリセットしますか?</p><p>仮想マシンをリセットすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="697"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="699"/>
         <source>Reset</source>
         <comment>machine</comment>
         <translation>リセット</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1437"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1439"/>
         <source>Continue</source>
         <comment>no hard disk attached</comment>
         <translation>続ける</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1438"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1440"/>
         <source>Go Back</source>
         <comment>no hard disk attached</comment>
         <translation>戻る</translation>
@@ -8749,12 +8771,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">選択</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1877"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1879"/>
         <source><p>Could not enter seamless mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source>
         <translation><p>ゲストOSのビデオメモリー不足のため、シームレスモードに切り替えできません。</p><p>仮想マシンの設定でビデオメモリーを <b>%1</b>以上に設定してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1866"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1868"/>
         <source><p>Could not switch the guest display to fullscreen mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch to fullscreen mode anyway or press <b>Cancel</b> to cancel the operation.</p></source>
         <translation><p>ゲストOSのビデオメモリー不足のため、ゲスト画面をフルスクリーンモードに切り替えできません。</p><p>仮想マシンの設定でビデオメモリーを <b>%1</b>以上に設定してください。</p><p><b>[無視]</b>ボタンをクリックしてフルスクリーンモードに切り換えるか、<b>[キャンセル]</b>ボタンをクリックして操作を取り消してください。</p></translation>
     </message>
@@ -8763,22 +8785,22 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>ネットワークエラーのため、新しいバージョン情報を取得できません:</p><p><b>%1</b></p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2003"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2015"/>
         <source>You are already running the most recent version of VirtualBox.</source>
         <translation>最新バージョンのVirtualBoxがインストールされています。 後でバージョン確認を行ってください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1802"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1804"/>
         <source><p>You have <b>clicked the mouse</b> inside the Virtual Machine display or pressed the <b>host key</b>. This will cause the Virtual Machine to <b>capture</b> the host mouse pointer (only if the mouse pointer integration is not currently supported by the guest OS) and the keyboard, which will make them unavailable to other applications running on your host machine.</p><p>You can press the <b>host key</b> at  [...]
         <translation><p>仮想マシンの画面を<b>マウスでクリック</b>するか、または<b>ホストキー</b>を押すと、仮想マシンはマウスポインター(マウス統合機能がゲストOSでサポートされていないときのみ)とキーボードを<b>キャプチャー</b>します。仮想マシンにキーボードとマウスがキャプチャーされるとホストマシンで動作する他のアプリケーションは利用できません。</p><p></p><p><b>ホストキー</b>を押すと、キーボードとマウス(キャプチャーされているとき)は<b>キャプチャー解除</b>され、通常の操作に戻ることができます。現在割り当てられているホストキーは仮想マシンのウィンドウ下部のステータスバーに&nbsp;<img src=:/hostkey_16px.png/>&nbsp;アイコンで表示されます。このアイコンはマウス [...]
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="419"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="420"/>
         <source><p>You have the <b>Auto capture keyboard</b> option turned on. This will cause the Virtual Machine to automatically <b>capture</b> the keyboard every time the VM window is activated and make it unavailable to other applications running on your host machine: when the keyboard is captured, all keystrokes (including system ones like Alt-Tab) will be directed to the VM.</p><p>You can press the <b>host key</b> at any time t [...]
         <translation><p><b>キーボードの自動キャプチャー</b>機能が有効です。仮想マシンのウィンドウがアクティブのとき、仮想マシンはキーボードを自動的に<b>キャプチャー</b>します。キーボードがキャプチャーされると、すべてのキーストローク(Alt-Tabなどを含む)が仮想マシンに送られるため、ホストマシンで動作する他のアプリケーションは利用できません。</p><p><b>ホストキー</b>を押すと、キーボードとマウス(キャプチャーされているとき)は<b>キャプチャー解除</b>され、通常の操作に戻ることができます。現在割り当てられているホストキーは仮想マシンのウィンドウ下部のステータスバーに&nbsp;<img src=:/hostkey_16px.png/>&nbsp;アイコンで表示されます。このアイコンはマウスアイコンと共に現在のキーボードとマウスのキャプチャー状態を表示します [...]
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="443"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="444"/>
         <source><p>The Virtual Machine reports that the guest OS supports <b>mouse pointer integration</b>. This means that you do not need to <i>capture</i> the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine's display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.</p><p>The mouse icon on the s [...]
         <translation><p>ゲストOSで<b>マウス統合</b>機能がサポートされています。ゲストOSでマウスポインターを<i>キャプチャー</i>することなく使用できます。仮想マシンの画面上にマウスポインターがあるとき、すべてのマウスの動作は直接ゲストOSに送られます。現在マウスがキャプチャーされているときは、自動的にキャプチャー解除されます。ステータスバーのマウスアイコンは、マウス統合機能がゲストOSでサポートされ、現在有効であることを示すため&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;のように表示されます。 </p><p><b>注</b>: マウス統合機能が有効なとき、いくつかのアプリケーションの動作が不正になるかもしれません。メニューバーから対応する動作を選択して現在のセッションのマウス統合機能を無効化(または有効化)することができます。</p> [...]
     </message>
@@ -8839,7 +8861,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">製品情報ダイアログを表示</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1993"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2005"/>
         <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
         <translation><p>VirtualBoxの新しいバージョンがリリースされました! バージョン <b>%1</b>は<a href="http://www.virtualbox.org/">virtualbox.org</a>から入手できます。</p><p>このリンクから最新バージョンをダウンロードできます。: </p><p><a href=%2>%3</a></p></translation>
     </message>
@@ -8856,12 +8878,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>仮想マシン<b>"%1"</b>をリストから除去します。</p><p>仮想マシンを構成するファイルをハードディスクから削除しますか?他の仮想マシンで使用されていない仮想ハードディスクは削除されます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="643"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="645"/>
         <source>Delete all files</source>
         <translation>すべてのファイルを削除</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="644"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="646"/>
         <source>Remove only</source>
         <translation>除去のみ</translation>
     </message>
@@ -8870,15 +8892,15 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">アクセスできない仮想マシン<b>"%1"</b>をリストから除去します。続行しますか?</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="563"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="636"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="898"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="914"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="565"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="638"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="900"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="916"/>
         <source>Remove</source>
         <translation>除去</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1198"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1200"/>
         <source>Release</source>
         <comment>detach medium</comment>
         <translation>解放</translation>
@@ -8900,36 +8922,36 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>注:このメディアのストレージ装置は削除されません。後でリストに再度追加することが可能です。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1249"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1251"/>
         <source>Remove</source>
         <comment>medium</comment>
         <translation>除去</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1475"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1477"/>
         <source><p>The hard disk storage unit at location <b>%1</b> already exists. You cannot create a new virtual hard disk that uses this location because it can be already used by another virtual hard disk.</p><p>Please specify a different location.</p></source>
         <translation><p>ハードディスクストレージ装置の場所 <b>"%1"</b>はすでに存在します。別の仮想ハードディスクが使用しているため、この場所に新規仮想ハードディスクを作成できません。</p><p>別の場所を指定してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1255"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1257"/>
         <source><p>Do you want to delete the storage unit of the hard disk <nobr><b>%1</b></nobr>?</p><p>If you select <b>Delete</b> then the specified storage unit will be permanently deleted. This operation <b>cannot be undone</b>.</p><p>If you select <b>Keep</b> then the hard disk will be only removed from the list of known hard disks, but the storage unit will be left untouched which makes it po [...]
         <translation><p>ハードディスク<nobr><b>"%1"</b></nobr>のストレージ装置を削除しますか?</p><p><b>[削除]</b>を選択すると、指定されたストレージ装置は永久に削除されます。この操作は<b>元に戻せません</b>。</p><p><b>[保持]</b>を選択すると、ハードディスクはリストから取り除かれますが、ストレージ装置は後でリストに再度追加できるように、そのまま置かれます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1266"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1268"/>
         <source>Delete</source>
         <comment>hard disk storage</comment>
         <translation>削除</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1267"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1269"/>
         <source>Keep</source>
         <comment>hard disk storage</comment>
         <translation>保持</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1273"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1281"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1275"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1283"/>
         <source>Failed to delete the storage unit of the hard disk <b>%1</b>.</source>
         <translation>ハードディスクストレージ装置<b>"%1"</b>の削除に失敗しました。</translation>
     </message>
@@ -8938,9 +8960,9 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>新規の割り当てに利用できる未使用のハードディスクがありません。</p><p><b>[作成]</b>ボタンをクリックし、<i>新規仮想ディスク作成ウィザード</i>を起動して新規ハードディスクイメージを作成するか、<b>[選択]</b>ボタンをクリックして、<i>仮想メディアマネージャー</i>を開き、動作を選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1485"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1493"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1501"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1487"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1495"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1503"/>
         <source>Failed to create the hard disk storage <nobr><b>%1</b>.</nobr></source>
         <translation>ハードディスクストレージ<nobr><b>"%1"</b>の作成に失敗しました。</nobr></translation>
     </message>
@@ -8969,7 +8991,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">"%1 <nobr><b>%2</b></nobr>"のクローズに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="495"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="497"/>
         <source>Failed to access the disk image file <nobr><b>%1</b></nobr>.</source>
         <translation>メディア<nobr><b>"%1"</b></nobr>のアクセス可否状態の取得に失敗しました。</translation>
     </message>
@@ -8982,7 +9004,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>新しいバージョンの情報を取得できません。エラー:</p><p><b>%1</b></p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="666"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="668"/>
         <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
         <translation><p>一つ以上の仮想ハードディスク、CD/DVDまたはフロッピーメディアのに現在アクセスできません。アクセス可能になるまでこれらのメディアを使用する仮想マシンを操作できません。</p><p><b>[確認]</b>ボタンをクリックして仮想メディアマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
     </message>
@@ -9014,7 +9036,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">上書き(&V)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1712"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1714"/>
         <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
         <translation><p>仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。</p><p>問題の解決のため、<a href=http://www.virtualbox.org>http://www.virtualbox.org</a>のCommunityセクションを参照するか、サポートに連絡してください。あなたがエラー発生時に行った操作と共に、<nobr><b>%1</b></nobr>ディレクトリに格納されているログファイル(<tt>VBox.log</tt>)とイメージファイル(<tt>VBox.png</tt>)を提供してください。注:VirtualBoxメインウィンドウの<b>[仮想マシン]</b>メニューから[ログを参照]を選択して、上記ファイルにアクセスすることができます。</p><p>仮想マシンを電源オフするには [...]
     </message>
@@ -9038,7 +9060,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">ファイル名<b>"%1"</b>はすでに使われています。ファイルを置き換えますか?<br /><br />ファイルは"%2"に存在します。ファイルの内容は上書きされます。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2331"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2335"/>
         <source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
         <translation>以下のファイルはすでに存在しています:<br /><br />%1<br /><br />ファイルを置き換えますか?ファイルの内容は上書きされます。</translation>
     </message>
@@ -9047,7 +9069,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><b>"%1"</b>の除去に失敗しました。<br /><br />手作業でファイルを取り除き、再実行してください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="376"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="378"/>
         <source>You are running a prerelease version of VirtualBox. This version is not suitable for production use.</source>
         <translation>これはVirtualBoxのプレリリースバージョンです。このバージョンは実務作業には適していません。</translation>
     </message>
@@ -9056,30 +9078,30 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">USBファイルシステム(usbfs)もDBusとhalサービスも利用できないため、ホストシステムでUSBにアクセスできませんでした。 ゲストOSでホストUSB デバイスを使用するには、これを修正してVirtualBoxを再起動してください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIPopupCenter.cpp" line="412"/>
+        <location filename="../src/globals/UIPopupCenter.cpp" line="413"/>
         <source>You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown.</source>
         <translation>電源ボタン オフのACPIイベントでゲストOSをシャットダウンしようとしています。ゲストOSがACPIサブシステムを使用しないためシャットダウンできません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1739"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1741"/>
         <source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source>
         <translation><p>仮想化支援機能(VT-x/AMD-V)を有効化できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。</p><p>ホストマシンのBIOS設定でVT-x/AMD-Vを有効化してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1745"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1752"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1763"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1769"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1780"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1747"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1754"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1765"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1771"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1782"/>
         <source>Close VM</source>
         <translation>仮想マシンを閉じる</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1582"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1745"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1752"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1763"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1769"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1584"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1747"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1754"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1765"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1771"/>
         <source>Continue</source>
         <translation>続ける</translation>
     </message>
@@ -9092,8 +9114,8 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">破棄</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="798"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="807"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="800"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="809"/>
         <location filename="../src/globals/UIPopupCenter.cpp" line="241"/>
         <source>Cancel</source>
         <translation>キャンセル</translation>
@@ -9128,7 +9150,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>スナップショット <b>%1</b> をリストアしようとしています。</p><p>現在の仮想マシンの状態から下にチェックを入れたところまでのスナップショットを作成することができます。もしこれをしないと、現在の状態が永久に失われてしまします。続行しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="793"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="795"/>
         <source>Create a snapshot of the current machine state</source>
         <translation>現在のマシンの状態のスナップショットを作成</translation>
     </message>
@@ -9137,53 +9159,53 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>本当にスナップショット <b>%1</b> をリストアしますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1612"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1614"/>
         <source>Can't find snapshot named <b>%1</b>.</source>
         <translation><b>%1</b> という名前のスナップショットが見つかりません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="540"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="542"/>
         <source>Rename</source>
         <translation>名前を変更</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="559"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="561"/>
         <source><p>You are about to remove following virtual machine items from the machine list:</p><p><b>%1</b></p><p>Do you wish to proceed?</p></source>
         <translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>続行しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="612"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="614"/>
         <source><p>You are about to remove following inaccessible virtual machines from the machine list:</p><p>%1</p><p>Do you wish to proceed?</p></source>
         <translation><p>以下のアクセスできない仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>続行しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="617"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="619"/>
         <source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well? Doing this will also remove the files containing the machine's virtual hard disks if they are not in use by another machine.</p></source>
         <translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>仮想マシンを構成するファイルをハードディスクから削除しますか? 他の仮想マシンで使用されていない仮想ハードディスクも削除します。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="623"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="625"/>
         <source><p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well?</p></source>
         <translation><p>以下の仮想マシンを除去しようとしています:</p><p><b>%1</b></p><p>仮想マシンを構成するファイルをハードディスクから削除しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="680"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="682"/>
         <source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
         <translation><p>以下の仮想マシンの保存状態を破棄しますか?</p><p><b>%1</b></p><p>この操作はゲストOSを適切にシャットダウンせずにリセットまたは電源をオフにすることと同等です。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1162"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1164"/>
         <source><p>Error changing disk image mode from <b>%1</b> to <b>%2</b>.</p></source>
         <translation><p>メディアタイプを<b>%1</b> から <b>%2</b> にする際にエラーが発生しました。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1230"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1238"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1232"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1240"/>
         <source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
         <translation><p>注:このメディアの記憶装置は削除されません。再度利用することができます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1026"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1028"/>
         <source><p>You are about to add a virtual hard disk to controller <b>%1</b>.</p><p>Would you like to create a new, empty file to hold the disk contents or select an existing one?</p></source>
         <translation><p>仮想ハードディスクをコントローラー<b>"%1"</b>に追加します。</p><p>空の仮想ハードディスクを新規作成しますか?既存の仮想ハードディスクを選択しますか?</p></translation>
     </message>
@@ -9198,7 +9220,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">既存のディスクを選択(&C)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1036"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1038"/>
         <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
         <translation><p>CD/DVDドライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想CD/DVDディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
     </message>
@@ -9213,22 +9235,22 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">空のドライブ(&E)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1047"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1049"/>
         <source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
         <translation><p>フロッピードライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想フロッピーディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1294"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1296"/>
         <source>Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>ハードディスク(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1300"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1302"/>
         <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1306"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1308"/>
         <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
         <translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
     </message>
@@ -9241,12 +9263,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想アプライアンスのオープンに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1544"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1546"/>
         <source>Failed to open/interpret appliance <b>%1</b>.</source>
         <translation>仮想アプライアンス<b>"%1"</b>のオープンまたは解析に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1552"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1554"/>
         <source>Failed to import appliance <b>%1</b>.</source>
         <translation>仮想アプライアンス<b>"%1"</b>のインポートに失敗しました。</translation>
     </message>
@@ -9261,8 +9283,8 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想アプライアンスの作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1588"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1596"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1590"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1598"/>
         <source>Failed to prepare the export of the appliance <b>%1</b>.</source>
         <translation>仮想アプライアンス<b>"%1"</b>のエクスポートの前処理に失敗しました。</translation>
     </message>
@@ -9271,42 +9293,42 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想アプライアンスの作成に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1604"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1606"/>
         <source>Failed to export appliance <b>%1</b>.</source>
         <translation>仮想アプライアンス<b>"%1"</b>のエクスポートに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="904"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="906"/>
         <source><p>Deleting this host-only network will remove the host-only interface this network is based on. Do you want to remove the (host-only network) interface <nobr><b>%1</b>?</nobr></p><p><b>Note:</b> this interface may be in use by one or more virtual network adapters belonging to one of your VMs. After it is removed, these adapters will no longer be usable until you correct their settings by either choosing a different in [...]
         <translation><p>このインターフェースを除去すると、このインターフェースが基づいているホストオンリーネットワークインターフェースが削除されます。ホストオンリーネットワークインターフェース<nobr><b>%1</b></nobr>を削除しますか?</p><p><b>注:</b>このインターフェースは他の仮想ネットワークアダプターで使用しているかもしれません。削除した場合、それらのアダプターは、他のインターフェース名を選ぶか、別のアダプタータイプを選んで設定を変更するまで使用できません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2318"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2322"/>
         <source>A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />Replacing it will overwrite its contents.</source>
         <translation>ファイル名<b>"%1"</b>はすでに使われています。ファイルを置き換えますか?<br /><br />ファイルの内容は上書きされます。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1759"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1761"/>
         <source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Certain guests (e.g. OS/2 and QNX) require this feature.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source>
         <translation><p>仮想化支援機能(VT-x/AMD-V)が有効化されましたが使用できません。いくつかのゲストOS(OS/2やQNXなど))は本機能を必要とします。</p><p>ホストマシンのBIOS設定でVT-x/AMD-Vを有効化してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="789"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="791"/>
         <source><p>You are about to restore snapshot <nobr><b>%1</b></nobr>.</p><p>You can create a snapshot of the current state of the virtual machine first by checking the box below; if you do not do this the current state will be permanently lost. Do you wish to proceed?</p></source>
         <translation><p>スナップショット <b>%1</b> をリストアしようとしています。</p><p>現在の仮想マシンの状態から下にチェックを入れたところまでのスナップショットを作成することができます。もしこれをしないと、現在の状態が永久に失われてしまします。続行しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="800"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="802"/>
         <source><p>Are you sure you want to restore snapshot <nobr><b>%1</b></nobr>?</p></source>
         <translation><p>本当にスナップショット <b>%1</b> をリストアしますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1775"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1777"/>
         <source><p>Could not start the machine <b>%1</b> because the following physical network interfaces were not found:</p><p><b>%2</b></p><p>You can either change the machine's network settings or stop the machine.</p></source>
         <translation><p>次の物理ネットワークインターフェースが見つからないので、仮想マシン<b>%1</b>を開始できません:</p><p><b>%2</b></p><p>マシンのネットワーク設定を変更するとか、マシンを停止してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1780"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1782"/>
         <source>Change Network Settings</source>
         <translation>ネットワーク設定の変更</translation>
     </message>
@@ -9315,17 +9337,17 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">仮想マシンを閉じる</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="526"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="528"/>
         <source><p>You are trying to move machine <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have sub-group <nobr><b>%1</b></nobr>.</p><p>Please resolve this name-conflict and try again.</p></source>
         <translation><p>マシン<nobr><b>%1</b></nobr>(すでにサブグループ<nobr><b>%1</b></nobr>に入っている)をグループ<nobr><b>%2</b></nobr>に移動しようとしています。</p><p>名前の衝突を回避し、もう一度実行してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="535"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="537"/>
         <source><p>You are trying to move group <nobr><b>%1</b></nobr> to group <nobr><b>%2</b></nobr> which already have another item with the same name.</p><p>Would you like to automatically rename it?</p></source>
         <translation><p>同じ名前で別のアイテムを持つグループ<nobr><b>%1</b></nobr>を<nobr><b>%2</b></nobr>に移動しようとしています。</p><p>自動的に名前を変更しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="551"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="553"/>
         <source>Failed to set groups of the virtual machine <b>%1</b>.</source>
         <translation>仮想マシン<b>%1</b>のグループの設定に失敗しました。</translation>
     </message>
@@ -9346,52 +9368,52 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>VirtualBoxの登録に失敗しました。</p><p>%1</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1987"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1999"/>
         <source>Do you wish to cancel all current network operations?</source>
         <translation>すべての現在のネットワーク操作をキャンセルしますか?</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="692"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="694"/>
         <source><p>Do you really want to reset the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
         <translation><p>以下の仮想マシンを本当にリセットしますか?</p><p><b>%1</b></p><p>仮想マシンをリセットすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="703"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="705"/>
         <source><p>Do you really want to send an ACPI shutdown signal to the following virtual machines?</p><p><b>%1</b></p></source>
         <translation><p>以下の仮想マシンに本当にACPIシャットダウン信号を送りますか?</p><p><b>%1</b></p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="713"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="715"/>
         <source><p>Do you really want to power off the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source>
         <translation><p>以下の仮想マシンを本当に電源オフしますか?</p><p><b>%1</b></p><p>仮想マシンを電源オフすると、その中で稼動中のすべてのアプリケーションの保存されていないデータは失われます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1560"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1562"/>
         <source>Failed to check files.</source>
         <translation>ファイルの確認に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1567"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1569"/>
         <source>Failed to remove file.</source>
         <translation>ファイルの除去に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="359"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="361"/>
         <source>You seem to have the USBFS filesystem mounted at /sys/bus/usb/drivers. We strongly recommend that you change this, as it is a severe mis-configuration of your system which could cause USB devices to fail in unexpected ways.</source>
         <translation>USBFS ファイルシステムを/sys/bus/usb/driversにマウントしています。これを変更することを強く勧めます。誤ったシステム構成によりUSB デバイスの使用に失敗するかもしれません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="383"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="385"/>
         <source>You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use.</source>
         <translation>これはVirtualBoxの試験的ビルドです。このバージョンは実務作業には適していません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1748"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1750"/>
         <source><p>VT-x/AMD-V hardware acceleration is not available on your system. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</source>
         <translation><p>ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。64ビット ゲストOSは64ビットCPUを検出できず、起動できません。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1766"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1768"/>
         <source><p>VT-x/AMD-V hardware acceleration is not available on your system. Certain guests (e.g. OS/2 and QNX) require this feature and will fail to boot without it.</p></source>
         <translation><p>ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。本機能を必要とするいくつかのゲストOS(OS/2やQNXなど)は起動できません。</p></translation>
     </message>
@@ -9400,53 +9422,53 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>スナップショット<b>"%1"</b>に復元しますか?現在の仮想マシンの状態は失われ、それを回復することはできません。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="798"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="807"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="800"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="809"/>
         <source>Restore</source>
         <translation>復元</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="813"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="815"/>
         <source><p>Deleting the snapshot will cause the state information saved in it to be lost, and disk data spread over several image files that VirtualBox has created together with the snapshot will be merged into one file. This can be a lengthy process, and the information in the snapshot cannot be recovered.</p></p>Are you sure you want to delete the selected snapshot <b>%1</b>?</p></source>
         <translation><p>スナップショットを削除すると、スナップショットに格納されている情報は失われ、VirtualBoxがスナップショットと共に作成した複数のディスクデータはひとつのファイルにマージされます。これには長い時間がかかるかもしれません。そしてスナップショットの情報を回復することはできません。</p><p>スナップショット<b>"%1"</b>を削除しますか?。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="819"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="834"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="821"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="836"/>
         <source>Delete</source>
         <translation>削除</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="828"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="830"/>
         <source><p>Deleting the snapshot %1 will temporarily need more disk space. In the worst case the size of image %2 will grow by %3, however on this filesystem there is only %4 free.</p><p>Running out of disk space during the merge operation can result in corruption of the image and the VM configuration, i.e. loss of the VM and its data.</p><p>You may continue with deleting the snapshot at your own risk.</p></source>
         <translation><p>スナップショット %1の削除には多くのディスク容量を必要とします。ディスクイメージファイル %2のサイズは最大で%3まで増加します。しかし、ディスクの空き容量は%4しかありません。</p><p>マージ作業中にディスク容量が不足すると、仮想マシンのデータを失う可能性があります。</p><p>スナップショットの削除を自己責任で続行できます。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="856"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="865"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="858"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="867"/>
         <source>Failed to restore the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
         <translation>仮想マシン<b>"%2"</b>のスナップショット<b>"%1"</b>への復元に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="874"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="882"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="876"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="884"/>
         <source>Failed to delete the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
         <translation>仮想マシン<b>"%2"</b>のスナップショット<b>"%1"</b>の削除に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1834"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1847"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1860"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1836"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1849"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1862"/>
         <source>Switch</source>
         <translation>切り替え</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1898"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1900"/>
         <source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source>
         <translation><p>ビデオメモリー不足のため、ゲスト スクリーンをこのホスト スクリーンに変更できません。</p><p>仮想マシンの構成で<b>%1</b>以上のビデオメモリーを指定してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1887"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1889"/>
         <source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch the screen anyway or press <b>Cancel</b> to cancel the operation.</p></source>
         <translation><p>ビデオメモリー不足のため、ゲスト スクリーンをこのホスト スクリーンに変更できません。</p><p>仮想マシンの構成で<b>%1</b>以上のビデオメモリーを指定してください。</p><p><b>[無視]</b>ボタンをクリックしするとスクリーンを強制的に切り換えます。<b>[キャンセル]</b>ボタンをクリックすると操作は取り消されます。</p></translation>
     </message>
@@ -9477,12 +9499,12 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>新規の割り当てに利用できる未使用のメディアがありません。</p><p><b>[選択]</b>ボタンをクリックして、<i>仮想メディアマネージャー</i>を開いてください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1058"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1060"/>
         <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
         <translation><p>CD/DVD デバイスを削除しますか?</p><p>デバイスがない場合、CD/DVDメディアやISOイメージファイルのマウントおよびGuest Additions のインストールはできません!</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1062"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1064"/>
         <source>&Remove</source>
         <comment>medium</comment>
         <translation>除去(&R)</translation>
@@ -9512,7 +9534,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">メディアを強制マウント解除しますか?</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1364"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1366"/>
         <source>Force Unmount</source>
         <translation>強制マウント解除</translation>
     </message>
@@ -9549,7 +9571,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%2</a></nobr>からダウンロードしましたが、<nobr><b>%3</b></nobr>に保存できません。</p><p>他の保存場所を選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2114"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2117"/>
         <source><p>You have an old version (%1) of the <b><nobr>%2</nobr></b> installed.</p><p>Do you wish to download latest one from the Internet?</p></source>
         <translation><p> <b><nobr>%2</nobr></b> の古いバージョン(%1)がインストールされています。</p><p>最新版をインターネットからダウンロードしますか?</p></translation>
     </message>
@@ -9559,7 +9581,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">ダウンロード</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2009"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2021"/>
         <source><p>You have version %1 of the <b><nobr>%2</nobr></b> installed.</p><p>You should download and install version %3 of this extension pack from Oracle!</p></source>
         <translation><p> <b><nobr>%2</nobr></b> のバージョン %1 がインストールされています。</p><p>Oracleからバージョン %3 の拡張機能をダウンロードし、インストールしてください!</p></translation>
     </message>
@@ -9569,24 +9591,24 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">OK</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2124"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2127"/>
         <source><p>Are you sure you want to download the <b><nobr>%1</nobr></b> from <nobr><a href="%2">%2</a></nobr> (size %3 bytes)?</p></source>
         <translation><p><nobr><a href="%2">%2</a></nobr> から <b><nobr>%1</nobr></b>をダウンロードをしますか (サイズ %3 bytes) ?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2144"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2147"/>
         <source><p>The <b><nobr>%1</nobr></b> has been successfully downloaded from <nobr><a href="%2">%2</a></nobr> and saved locally as <nobr><b>%3</b>.</nobr></p><p>Do you wish to install this extension pack?</p></source>
         <translation><p><nobr><a href="%2">%2</a></nobr> から<b><nobr>%1</nobr></b>のダウンロードに成功し、<nobr><b>%3</b> として保存しました。</nobr></p><p>拡張機能パックをインストールしますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2150"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2168"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2153"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2172"/>
         <source>Install</source>
         <comment>extension pack</comment>
         <translation>インストール</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2134"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2137"/>
         <source><p>The <b><nobr>%1</nobr></b> has been successfully downloaded from <nobr><a href="%2">%2</a></nobr> but can't be saved locally as <nobr><b>%3</b>.</nobr></p><p>Please choose another location for that file.</p></source>
         <translation><p><nobr><a href="%2">%2</a></nobr>から<b><nobr>%1</nobr></b> のダウンロードに成功しましたが、<nobr><b>%3</b> として保存することができませんでした。</nobr></p><p>ほかの場所を選択してください。</p></translation>
     </message>
@@ -9600,17 +9622,17 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>次のVirtualBox設定ファイルは古い形式から新バージョンのVirtualBoxが必要とする新しい形式に自動的に変更されます。</p><p><b>[OK]</b>ボタンをクリックしてVirtualBoxを起動するか、設定ファイルの変更を行わずにVirtualBoxアプリケーションを終了させたいなら<b>[終了]</b>ボタンをクリックしてください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1827"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1829"/>
         <source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
         <translation><p>仮想マシンのウィンドウを"フルスクリーン"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウモードに戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:フルスクリーンモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1840"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1842"/>
         <source><p>The virtual machine window will be now switched to <b>Seamless</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source>
         <translation><p>仮想マシンのウィンドウを"シームレス"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウ表示に戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:シームレスモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1853"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1855"/>
         <source><p>The virtual machine window will be now switched to <b>Scale</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in scaled mode. You can access it by pressing <b>Host+Home</b>.</p></source>
         <translation><p>仮想マシンのウィンドウを"スケール"モードに切り替えます。<b>%1</b>キーを押すといつでもウィンドウ表示に戻ることができます。</p><p>注:<i>ホスト</i>キーは現在<b>%2</b>に割り当てられています。</p><p>注:スケールモードではメインメニューバーは表示されません。メニューバーにアクセスするには <b>ホスト+Home</b>キーを押してください。</p></translation>
     </message>
@@ -9620,34 +9642,34 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">切り替え</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="707"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="709"/>
         <source>ACPI Shutdown</source>
         <comment>machine</comment>
         <translation>ACPI シャットダウン</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="718"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="720"/>
         <source>Power Off</source>
         <comment>machine</comment>
         <translation>電源オフ</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1509"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1511"/>
         <source><p>Cannot remove the machine folder <nobr><b>%1</b>.</nobr></p><p>Please check that this folder really exists and that you have permissions to remove it.</p></source>
         <translation><p>仮想マシンのフォルダー<nobr><b>%1</b>を除去できません。</nobr></p><p>このフォルダーが本当に存在し、除去する権限があるか確認してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1518"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1520"/>
         <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>This folder already exists and possibly belongs to another machine.</p></source>
         <translation><p>仮想マシンのフォルダー<b>%1</b>を親フォルダー<nobr><b>%2</b>に作成できません。</nobr></p><p>このフォルダーはすでに存在し、ほかマシンに属している可能性があります。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1527"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1529"/>
         <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source>
         <translation><p>仮想マシンフォルダー<b>%1</b>を親フォルダー<nobr><b>%2</b>に作成できません。</nobr></p><p>親フォルダーの存在と、フォルダー作成に必要な権限の有無を確認してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="1432"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="1434"/>
         <source>You are about to create a new virtual machine without a hard drive. You will not be able to install an operating system on the machine until you add one. In the mean time you will only be able to start the machine using a virtual optical disk or from the network.</source>
         <translation>ハードドライブなしで新しい仮想マシンを作成しようとしています。それを追加するまではオペレーティングシステムをインストールすることはできません。仮想光学ディスクか、ネットワークから起動することしかできないことを意味します。</translation>
     </message>
@@ -9659,13 +9681,13 @@ p, li { white-space: pre-wrap; }
         </translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2242"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2249"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2246"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2253"/>
         <source>Failed to open the Extension Pack <b>%1</b>.</source>
         <translation>機能拡張パッケージ<b>"%1"</b>のオープンに失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2157"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2161"/>
         <source><p>You are about to install a VirtualBox extension pack. Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%1< [...]
         <translation><p>VirtualBox 機能拡張パッケージをインストールします。機能拡張パッケージはVirtualBoxに機能を追加しますが、コンピューターに危害を与えるようなシステムレベルのソフトウェアを含んでいる可能性があります。信頼できる発行元から機能拡張パッケージを入手した場合に限り、以下の内容を確認して、処理を続行してください。</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>バージョン:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td>< [...]
     </message>
@@ -9674,47 +9696,47 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">インストール(&I)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2176"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2180"/>
         <source>Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.</source>
         <translation>機能拡張パッケージはVirtualBoxに機能を追加しますが、システムに危害を与えるシステムレベルのソフトウェアを含むこともできます。信頼できる発行元から機能拡張パッケージを入手した場合に限り、以下の内容を確認して、処理を続行してください。</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2190"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2194"/>
         <source><p>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td& [...]
         <translation><p>古いバージョンの機能拡張パッケージがインストールされています。アップグレードしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>バージョン:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>現在のバージョン:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td&g [...]
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2200"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2204"/>
         <source>&Upgrade</source>
         <translation>アップグレード(&U)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2203"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2207"/>
         <source><p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></t [...]
         <translation><p>新しいバージョンの機能拡張パッケージがインストールされています。ダウングレードしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>バージョン:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>現在のバージョン:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td& [...]
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2213"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2217"/>
         <source>&Downgrade</source>
         <translation>ダウングレード(&D)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2216"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2220"/>
         <source><p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td>& [...]
         <translation><p>同じバージョンの機能拡張パッケージがインストールされています。再インストールしますか?<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>名前:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>バージョン:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>説明:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p> [...]
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2225"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2229"/>
         <source>&Reinstall</source>
         <translation>再インストール(&R)</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2232"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2236"/>
         <source><p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p></source>
         <translation><p> VirtualBox 機能拡張パッケージ"<b>%1</b>"を除去します。</p><p>続行しますか?</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2288"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2292"/>
         <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source>
         <translation>機能拡張パッケージ<br><nobr><b>%1</b><nobr><br>のインストールに成功しました。</translation>
     </message>
@@ -9744,8 +9766,8 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">フロッピーイメージ</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2296"/>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2303"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2300"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2307"/>
         <source>Failed to drop data.</source>
         <translation>データのドロップに失敗しました。</translation>
     </message>
@@ -9754,27 +9776,27 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete"><p>この仮想マシンでUSB 2.0を有効にするには<b><nobr>%1</nobr></b>のインストールが必要です。</p><p>VirtualBoxのダウンロードサイトから機能拡張パッケージをダウンロードし、インストールしてください。機能拡張パッケージをインストールすると、USB 2.0を有効にすることができます。現在の設定をキャンセルしない場合、USB 2.0は無効にします。</p></translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2590"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2594"/>
         <source>Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might not be installed on the host computer</source>
         <translation>USBプロキシーサービスが読み込めません (VERR_FILE_NOT_FOUND)。このサービスはホストコンピューターにインストールされている必要があります</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2591"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2595"/>
         <source>VirtualBox is not currently allowed to access USB devices.  You can change this by adding your user to the 'vboxusers' group.  Please see the user manual for a more detailed explanation</source>
         <translation>VirtualBoxは現在USBデバイスへのアクセスが許可されていません。ユーザーを'vboxusers'グループに追加してください。詳細な説明はユーザーマニュアルをお読みください</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2592"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2596"/>
         <source>VirtualBox is not currently allowed to access USB devices.  You can change this by allowing your user to access the 'usbfs' folder and files.  Please see the user manual for a more detailed explanation</source>
         <translation>VirtualBoxは現在USBデバイスへのアクセスが許可されていません。ユーザーを'usbfs'フォルダーとファイルに追加してください。詳細な説明はユーザーマニュアルをお読みください</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2593"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2597"/>
         <source>The USB Proxy Service has not yet been ported to this host</source>
         <translation>USB プロキシーサービスはこのホストにはまだ移植されていません</translation>
     </message>
     <message>
-        <location filename="../src/globals/UIMessageCenter.cpp" line="2594"/>
+        <location filename="../src/globals/UIMessageCenter.cpp" line="2598"/>
         <source>Could not load the Host USB Proxy service</source>
         <translation>ホストのUSB プロキシーサービスを読み込むことができません</translation>
     </message>
@@ -9794,7 +9816,7 @@ p, li { white-space: pre-wrap; }
         <translation type="obsolete">フロッピーデバイス</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIPopupPaneTextPane.cpp" line="228"/>
+        <location filename="../src/widgets/UIPopupPaneButtonPane.cpp" line="181"/>
         <source>Do not show this message again</source>
         <translation>次回からこのメッセージを表示しない</translation>
     </message>
@@ -9847,22 +9869,22 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UIMiniToolBar</name>
     <message>
-        <location filename="../src/widgets/UIMiniToolBar.cpp" line="586"/>
+        <location filename="../src/widgets/UIMiniToolBar.cpp" line="602"/>
         <source>Always show the toolbar</source>
         <translation>常にツールバーを表示する</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIMiniToolBar.cpp" line="612"/>
+        <location filename="../src/widgets/UIMiniToolBar.cpp" line="629"/>
         <source>Minimize Window</source>
         <translation>ウィンドウを最小化</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIMiniToolBar.cpp" line="619"/>
+        <location filename="../src/widgets/UIMiniToolBar.cpp" line="637"/>
         <source>Exit Full Screen or Seamless Mode</source>
         <translation>フルスクリーンモードまたはシームレスモードを終了する</translation>
     </message>
     <message>
-        <location filename="../src/widgets/UIMiniToolBar.cpp" line="626"/>
+        <location filename="../src/widgets/UIMiniToolBar.cpp" line="644"/>
         <source>Close VM</source>
         <translation>仮想マシンを閉じる</translation>
     </message>
@@ -9987,32 +10009,32 @@ p, li { white-space: pre-wrap; }
 <context>
     <name>UINetworkReplyPrivate</name>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="560"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="642"/>
         <source>Host not found</source>
         <translation>ホストが見つかりません</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="562"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="644"/>
         <source>Content access denied</source>
         <translation>内容へのアクセスを拒否されました</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="564"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="646"/>
         <source>Protocol failure</source>
         <translation>プロトコル失敗</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="566"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="648"/>
         <source>Wrong SSL certificate format</source>
         <translation>誤ったSSL証明書のフォーマット</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="568"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="650"/>
         <source>SSL authentication failed</source>
         <translation>SSL認証に失敗</translation>
     </message>
     <message>
-        <location filename="../src/net/UINetworkReply.cpp" line="570"/>
+        <location filename="../src/net/UINetworkReply.cpp" line="652"/>
         <source>Unknown reason</source>
         <translation>原因不明</translation>
     </message>
@@ -10713,8 +10735,8 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UIPopupCenter</name>
     <message>
-        <location filename="../src/widgets/UIPopupPane.cpp" line="287"/>
-        <location filename="../src/widgets/UIPopupPane.cpp" line="288"/>
+        <location filename="../src/widgets/UIPopupPane.cpp" line="274"/>
+        <location filename="../src/widgets/UIPopupPane.cpp" line="275"/>
         <source>Click for full details</source>
         <translation>クリックしてすべての情報を表示</translation>
     </message>
@@ -10846,32 +10868,32 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UISelectorWindow</name>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="223"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="225"/>
         <source>Show Toolbar</source>
         <translation>ツールバーを表示</translation>
     </message>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="227"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="229"/>
         <source>Show Statusbar</source>
         <translation>ステータスバーを表示</translation>
     </message>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="350"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="352"/>
         <source>Select a virtual machine file</source>
         <translation>仮想マシンファイルを選択</translation>
     </message>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="354"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="356"/>
         <source>Virtual machine files (%1)</source>
         <translation>仮想マシンファイル(%1)</translation>
     </message>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="868"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="870"/>
         <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is  a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
         <translation><h3>ようこそVirtualBoxへ!</h3><p>このウィンドウの左側にコンピューター上のすべての仮想マシンがリスト表示されます。しかしまだ仮想マシンが作成されていないため、リストは空です。<img src=:/welcome.png align=right/></p><p>新規仮想マシンを作成するにはウィンドウ上部にあるメインツールバーの<b>[新規]</b>ボタンをクリックしてください。</p><p><b>%1</b>キーでヘルプを表示できます。または最新情報とニュースを取得するため <a href=http://www.virtualbox.org>www.virtualbox.org</a> を訪問ください。</p></translation>
     </message>
     <message>
-        <location filename="../src/selector/UISelectorWindow.cpp" line="948"/>
+        <location filename="../src/selector/UISelectorWindow.cpp" line="950"/>
         <source>Manager</source>
         <comment>Note: main window title which is pretended by the product name.</comment>
         <translation>マネージャー</translation>
@@ -10884,7 +10906,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source
         <translation type="obsolete">インストール</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UISession.cpp" line="545"/>
+        <location filename="../src/runtime/UISession.cpp" line="570"/>
         <source>Updating Guest Additions</source>
         <translation>Guest Additions をアップデートしています</translation>
     </message>
@@ -10928,27 +10950,27 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UISettingsDialogGlobal</name>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="487"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="495"/>
         <source>General</source>
         <translation>一般</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="490"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="498"/>
         <source>Input</source>
         <translation>入力</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="493"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="502"/>
         <source>Update</source>
         <translation>アップデート</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="496"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="506"/>
         <source>Language</source>
         <translation>言語</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="499"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="509"/>
         <source>Display</source>
         <translation>ディスプレイ</translation>
     </message>
@@ -10957,22 +10979,22 @@ step and attach hard disks later using the VM Settings dialog.</p></source
         <translation type="obsolete">USB</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="502"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="512"/>
         <source>Network</source>
         <translation>ネットワーク</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="505"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="515"/>
         <source>Extensions</source>
         <translation>機能拡張</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="508"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="519"/>
         <source>Proxy</source>
         <translation>プロキシー</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="522"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="534"/>
         <source>VirtualBox - %1</source>
         <translation>VirtualBox - %1</translation>
     </message>
@@ -10980,62 +11002,62 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UISettingsDialogMachine</name>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="872"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="884"/>
         <source>General</source>
         <translation>一般</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="875"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="887"/>
         <source>System</source>
         <translation>システム</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="878"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="890"/>
         <source>Display</source>
         <translation>ディスプレイ</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="881"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="893"/>
         <source>Storage</source>
         <translation>ストレージ</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="884"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="896"/>
         <source>Audio</source>
         <translation>オーディオ</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="887"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="899"/>
         <source>Network</source>
         <translation>ネットワーク</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="890"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="902"/>
         <source>Ports</source>
         <translation>ポート</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="893"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="905"/>
         <source>Serial Ports</source>
         <translation>シリアルポート</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="896"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="908"/>
         <source>Parallel Ports</source>
         <translation>パラレルポート</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="899"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="911"/>
         <source>USB</source>
         <translation>USB</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="902"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="914"/>
         <source>Shared Folders</source>
         <translation>共有フォルダー</translation>
     </message>
     <message>
-        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="920"/>
+        <location filename="../src/settings/UISettingsDialogSpecific.cpp" line="932"/>
         <source>%1 - %2</source>
         <translation>%1 - %2</translation>
     </message>
@@ -11215,57 +11237,57 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UIVMCloseDialog</name>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="355"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="354"/>
         <source>Close Virtual Machine</source>
         <translation>仮想マシンを閉じる</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="358"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="357"/>
         <source>You want to:</source>
         <translation>操作を選択:</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="362"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="361"/>
         <source><p>Saves the current execution state of the virtual machine to the physical hard disk of the host PC.</p><p>Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.</p><p>Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to th [...]
         <translation><p>現在実行中の仮想マシンの状態をホストマシンの物理ハードディスクに保存します。</p><p>この仮想マシンの次回の起動時、すぐに作業を再開できるように仮想マシンは保存した状態を復元します。</p><p>注:ゲストOSの種別と仮想マシンに割り当てたメモリー量によっては、仮想マシンの状態の保存に長い時間を必要とします。</p></translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="361"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="360"/>
         <source>&Save the machine state</source>
         <translation>仮想マシンの状態を保存(&S)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="368"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="367"/>
         <source><p>Sends the ACPI Power Button press event to the virtual machine.</p><p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p><p>If the machine doesn't respond to this action then the guest operating system  [...]
         <translation><p>仮想マシンに電源ボタン オフのACPIイベントを送信します。</p><p>通常、仮想マシン内で動作するゲストOSは、このイベントを検出して正しい終了処理を実行します。ゲストOSで動作するすべてのアプリケーションがデータと状態を保存することができるので、仮想マシンの電源を切るお勧めの方法です。</p><p>仮想マシンがこの動作に反応しないならば、ゲストOSの構成に誤りがあるか、電源ボタン オフのACPIイベントに対応していません。この場合、仮想マシンの実行を停止するには<b>[仮想マシンの電源オフ]</b>を選択します。</p></translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="367"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="366"/>
         <source>S&end the shutdown signal</source>
         <translation>シャットダウン シグナル送信(&E)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="376"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="375"/>
         <source><p>Turns off the virtual machine.</p><p>Note that this action will stop machine execution immediately so that the guest operating system running inside it will not be able to perform a clean shutdown procedure which may result in <i>data loss</i> inside the virtual machine. Selecting this action is recommended only if the virtual machine does not respond to the <b>Send the shutdown signal</b> action.</p></source>
         <translation><p>仮想マシンの電源を切ります。</p><p>注:この動作は、ゲストOSを正しく終了することなく、直ちに仮想マシンの実行を停止します。仮想マシン内の<i>データの損失</i>を招くかもしれません。この動作は、仮想マシンが<b>[シャットダウン シグナル送信]</b>に反応しない場合のみ選択してください。</p></translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="375"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="374"/>
         <source>&Power off the machine</source>
         <translation>仮想マシンの電源オフ(&P)</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="382"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="381"/>
         <source>Restore the machine state stored in the current snapshot</source>
         <translation>現在のスナップショットの状態にマシンを復元する</translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="383"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="382"/>
         <source><p>When checked, the machine will be returned to the state stored in the current snapshot after it is turned off. This is useful if you are sure that you want to discard the results of your last sessions and start again at that snapshot.</p></source>
         <translation><p>仮想マシンをオフにした後、現在のスナップショットに保存された状態に復元します。これは直前のセッションの状態を破棄し、差現在のスナップショットの状態に戻りたい場合に役立ちます。</p></translation>
     </message>
     <message>
-        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="381"/>
+        <location filename="../src/runtime/UIVMCloseDialog.cpp" line="380"/>
         <source>&Restore current snapshot '%1'</source>
         <translation>現在のスナップショット  '%1'  に復元(&R)</translation>
     </message>
@@ -11273,12 +11295,12 @@ step and attach hard disks later using the VM Settings dialog.</p></source
 <context>
     <name>UIVMDesktop</name>
     <message>
-        <location filename="../src/selector/UIVMDesktop.cpp" line="330"/>
+        <location filename="../src/selector/UIVMDesktop.cpp" line="345"/>
         <source>&Details</source>
         <translation>詳細(&D)</translation>
     </message>
     <message>
-        <location filename="../src/selector/UIVMDesktop.cpp" line="303"/>
+        <location filename="../src/selector/UIVMDesktop.cpp" line="313"/>
         <source>&Snapshots</source>
         <translation>スナップショット(&S)</translation>
     </message>
@@ -11288,7 +11310,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source
     <message>
         <location filename="../src/selector/UIVMItem.cpp" line="164"/>
         <location filename="../src/selector/UIVMItem.cpp" line="176"/>
-        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="305"/>
+        <location filename="../src/selector/graphics/details/UIGMachinePreview.cpp" line="124"/>
         <source>Inaccessible</source>
         <translation>アクセスできません</translation>
     </message>
@@ -12219,13 +12241,13 @@ step and attach hard disks later using the VM Settings dialog.</p></source
         <translation type="obsolete">SAS コントローラー</translation>
     </message>
     <message>
-        <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="282"/>
+        <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="289"/>
         <location filename="../src/wizards/newvm/UIWizardNewVMPageExpert.cpp" line="222"/>
         <source>Name and operating system</source>
         <translation>名前とオペレーティングシステム</translation>
     </message>
     <message>
-        <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="285"/>
+        <location filename="../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp" line="292"/>
         <source>Please choose a descriptive name for the new virtual machine and select the type of operating system you intend to install on it. The name you choose will be used throughout VirtualBox to identify this machine.</source>
         <translation>新しい仮想マシンの記述名を指定し、インストールするオペレーティングシステムのタイプを選択してください。入力した名前はVirtualBoxでこのマシンを特定するのに使われます。</translation>
     </message>
@@ -13522,43 +13544,43 @@ Version %1</source>
         <translation type="obsolete">差分</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1007"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1013"/>
         <source>Unknown device %1:%2</source>
         <comment>USB device details</comment>
         <translation>不明なデバイス %1:%2</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1032"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1038"/>
         <source><nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr></source>
         <comment>USB device tooltip</comment>
         <translation><nobr>ベンダーID: %1</nobr><br><nobr>プロダクトID: %2</nobr><br><nobr>リビジョン: %3</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1041"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1047"/>
         <source><br><nobr>Serial No. %1</nobr></source>
         <comment>USB device tooltip</comment>
         <translation><br><nobr>シリアルNo. %1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1048"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1054"/>
         <source><br><nobr>State: %1</nobr></source>
         <comment>USB device tooltip</comment>
         <translation><br><nobr>状態: %1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1159"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1165"/>
         <source>Name</source>
         <comment>details report</comment>
         <translation>名前</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1161"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1167"/>
         <source>OS Type</source>
         <comment>details report</comment>
         <translation>OSタイプ</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1231"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1237"/>
         <source>Base Memory</source>
         <comment>details report</comment>
         <translation>メインメモリー</translation>
@@ -13569,13 +13591,13 @@ Version %1</source>
         <translation type="obsolete"><nobr>%3 MB</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1168"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1174"/>
         <source>General</source>
         <comment>details report</comment>
         <translation>一般</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1267"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1273"/>
         <source>Video Memory</source>
         <comment>details report</comment>
         <translation>ビデオメモリー</translation>
@@ -13586,19 +13608,19 @@ Version %1</source>
         <translation type="obsolete"><nobr>%4 MB</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1240"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1246"/>
         <source>Boot Order</source>
         <comment>details report</comment>
         <translation>起動順序</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1242"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1248"/>
         <source>ACPI</source>
         <comment>details report</comment>
         <translation>ACPI</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1243"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1249"/>
         <source>I/O APIC</source>
         <comment>details report</comment>
         <translation>I/O APIC</translation>
@@ -13614,25 +13636,25 @@ Version %1</source>
         <translation type="obsolete">ハードディスク</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1199"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1205"/>
         <source>Enabled</source>
         <comment>details report (ACPI)</comment>
         <translation>有効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1200"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1206"/>
         <source>Disabled</source>
         <comment>details report (ACPI)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1204"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1210"/>
         <source>Enabled</source>
         <comment>details report (I/O APIC)</comment>
         <translation>有効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1205"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1211"/>
         <source>Disabled</source>
         <comment>details report (I/O APIC)</comment>
         <translation>無効</translation>
@@ -13678,50 +13700,50 @@ Version %1</source>
         <translation type="obsolete">CD/DVD</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1409"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1415"/>
         <source>Disabled</source>
         <comment>details report (audio)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1415"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1421"/>
         <source>Audio</source>
         <comment>details report</comment>
         <translation>オーディオ</translation>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="695"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1455"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1461"/>
         <source>Adapter %1</source>
         <comment>details report (network)</comment>
         <translation>アダプター %1</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1464"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1470"/>
         <source>Disabled</source>
         <comment>details report (network)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1472"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1478"/>
         <source>Network</source>
         <comment>details report</comment>
         <translation>ネットワーク</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1581"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1587"/>
         <source>Device Filters</source>
         <comment>details report (USB)</comment>
         <translation>デバイスフィルター</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1582"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1588"/>
         <source>%1 (%2 active)</source>
         <comment>details report (USB)</comment>
         <translation>%1 (%2 アクティブ)</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1587"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1593"/>
         <source>Disabled</source>
         <comment>details report (USB)</comment>
         <translation>無効</translation>
@@ -14084,31 +14106,31 @@ Version %1</source>
         <translation type="obsolete">ファイルを選択</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1500"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1506"/>
         <source>Port %1</source>
         <comment>details report (serial ports)</comment>
         <translation>ポート %1</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1509"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1515"/>
         <source>Disabled</source>
         <comment>details report (serial ports)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1517"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1523"/>
         <source>Serial Ports</source>
         <comment>details report</comment>
         <translation>シリアルポート</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1593"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1599"/>
         <source>USB</source>
         <comment>details report</comment>
         <translation>USB</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1606"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1612"/>
         <source>Shared Folders</source>
         <comment>details report (shared folders)</comment>
         <translation>共有フォルダー</translation>
@@ -14119,13 +14141,13 @@ Version %1</source>
         <translation type="obsolete">%1</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1611"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1617"/>
         <source>None</source>
         <comment>details report (shared folders)</comment>
         <translation>なし</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1617"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1623"/>
         <source>Shared Folders</source>
         <comment>details report</comment>
         <translation>共有フォルダー</translation>
@@ -14181,21 +14203,21 @@ Version %1</source>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="526"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1249"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1255"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="687"/>
         <source>VT-x/AMD-V</source>
         <comment>details report</comment>
         <translation>VT-x/AMD-V</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1244"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1250"/>
         <source>PAE/NX</source>
         <comment>details report</comment>
         <translation>PAE/NX</translation>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="484"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1217"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1223"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="665"/>
         <source>Enabled</source>
         <comment>details report (VT-x/AMD-V)</comment>
@@ -14203,7 +14225,7 @@ Version %1</source>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="485"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1218"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1224"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="666"/>
         <source>Disabled</source>
         <comment>details report (VT-x/AMD-V)</comment>
@@ -14232,74 +14254,74 @@ Version %1</source>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="531"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1305"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1311"/>
         <source>Remote Desktop Server Port</source>
         <comment>details report (VRDE Server)</comment>
         <translation>リモートデスクトップサーバーポート</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1209"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1215"/>
         <source>Enabled</source>
         <comment>details report (PAE/NX)</comment>
         <translation>有効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1210"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1216"/>
         <source>Disabled</source>
         <comment>details report (PAE/NX)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1237"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1243"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="690"/>
         <source>Execution Cap</source>
         <comment>details report</comment>
         <translation>使用率制限</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1238"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1244"/>
         <source><nobr>%1%</nobr></source>
         <comment>details report</comment>
         <translation><nobr>%1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1402"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1408"/>
         <source>Host Driver</source>
         <comment>details report (audio)</comment>
         <translation>ホストドライバー</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1405"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1411"/>
         <source>Controller</source>
         <comment>details report (audio)</comment>
         <translation>コントローラー</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1446"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1452"/>
         <source>Generic, '%1'</source>
         <comment>details report (network)</comment>
         <translation>一般, '%1'</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1449"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1455"/>
         <source>NAT network, '%1'</source>
         <comment>details report (network)</comment>
         <translation>NATネットワーク, '%1'</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1538"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1544"/>
         <source>Port %1</source>
         <comment>details report (parallel ports)</comment>
         <translation>ポート %1</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1547"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1553"/>
         <source>Disabled</source>
         <comment>details report (parallel ports)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1556"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1562"/>
         <source>Parallel Ports</source>
         <comment>details report</comment>
         <translation>パラレルポート</translation>
@@ -14481,49 +14503,49 @@ Version %1</source>
         <translation>Intel PRO/1000 T Server (82543GC)</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1064"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1070"/>
         <source><nobr>Vendor ID: %1</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>ベンダーID: %1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1069"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1075"/>
         <source><nobr>Product ID: %2</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>プロダクトID: %2</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1074"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1080"/>
         <source><nobr>Revision: %3</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>リビジョン: %3</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1079"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1085"/>
         <source><nobr>Product: %4</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>製品: %4</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1084"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1090"/>
         <source><nobr>Manufacturer: %5</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>メーカー: %5</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1089"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1095"/>
         <source><nobr>Serial No.: %1</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>シリアルNo.: %1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1094"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1100"/>
         <source><nobr>Port: %1</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>ポート: %1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1101"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1107"/>
         <source><nobr>State: %1</nobr></source>
         <comment>USB filter tooltip</comment>
         <translation><nobr>状態: %1</nobr></translation>
@@ -14574,13 +14596,13 @@ Version %1</source>
         <translation type="obsolete"><hr><img src=%1/>&nbsp;このハードディスクの割り当ては、新規作成された差分ハードディスクの使用により、間接的に実行されます。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="522"/>
+        <location filename="../src/medium/UIMedium.cpp" line="537"/>
         <source>Checking...</source>
         <comment>medium</comment>
         <translation>確認中...</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="526"/>
+        <location filename="../src/medium/UIMedium.cpp" line="541"/>
         <location filename="../src/selector/graphics/details/UIGDetailsElements.cpp" line="503"/>
         <source>Inaccessible</source>
         <comment>medium</comment>
@@ -14595,19 +14617,19 @@ Version %1</source>
         <translation type="obsolete">%1<hr>このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:<br>%2%3</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1286"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1292"/>
         <source>3D Acceleration</source>
         <comment>details report</comment>
         <translation>3D アクセラレーション</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1282"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1288"/>
         <source>Enabled</source>
         <comment>details report (3D Acceleration)</comment>
         <translation>有効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1283"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1289"/>
         <source>Disabled</source>
         <comment>details report (3D Acceleration)</comment>
         <translation>無効</translation>
@@ -14626,14 +14648,14 @@ Version %1</source>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="527"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1250"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1256"/>
         <source>Nested Paging</source>
         <comment>details report</comment>
         <translation>ネステッドページング</translation>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="487"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1222"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1228"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="670"/>
         <source>Enabled</source>
         <comment>details report (Nested Paging)</comment>
@@ -14641,7 +14663,7 @@ Version %1</source>
     </message>
     <message>
         <location filename="../src/VBoxVMInformationDlg.cpp" line="488"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1223"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1229"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="671"/>
         <source>Disabled</source>
         <comment>details report (Nested Paging)</comment>
@@ -14653,7 +14675,7 @@ Version %1</source>
         <translation type="obsolete">ブリッジネットワーク, '%1'</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1440"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1446"/>
         <source>Internal network, '%1'</source>
         <comment>details report (network)</comment>
         <translation>内部ネットワーク, '%1'</translation>
@@ -14722,13 +14744,13 @@ Version %1</source>
         <translation>BusLogic</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1437"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1443"/>
         <source>Bridged adapter, %1</source>
         <comment>details report (network)</comment>
         <translation>ブリッジアダプター, '%1'</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1443"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1449"/>
         <source>Host-only adapter, '%1'</source>
         <comment>details report (network)</comment>
         <translation>ホストオンリーアダプター, '%1'</translation>
@@ -14752,27 +14774,27 @@ Version %1</source>
         <translation>ホストオンリーアダプター</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1232"/>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1268"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1238"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1274"/>
         <source><nobr>%1 MB</nobr></source>
         <comment>details report</comment>
         <translation><nobr>%1 MB</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1234"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1240"/>
         <location filename="../src/runtime/UIIndicatorsPool.cpp" line="695"/>
         <source>Processor(s)</source>
         <comment>details report</comment>
         <translation>プロセッサー数</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1235"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1241"/>
         <source><nobr>%1</nobr></source>
         <comment>details report</comment>
         <translation><nobr>%1</nobr></translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1256"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1262"/>
         <source>System</source>
         <comment>details report</comment>
         <translation>システム</translation>
@@ -14793,7 +14815,7 @@ Version %1</source>
         <translation type="obsolete">無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1318"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1324"/>
         <source>Display</source>
         <comment>details report</comment>
         <translation>ディスプレイ</translation>
@@ -14806,60 +14828,60 @@ Version %1</source>
         <translation>Rawファイル</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1291"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1297"/>
         <source>Enabled</source>
         <comment>details report (2D Video Acceleration)</comment>
         <translation>有効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="998"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1004"/>
         <source>Unknown device</source>
         <comment>USB device details</comment>
         <translation>不明なデバイス</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1276"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1282"/>
         <source>Screens</source>
         <comment>details report</comment>
         <translation>スクリーン</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1292"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1298"/>
         <source>Disabled</source>
         <comment>details report (2D Video Acceleration)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1295"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1301"/>
         <source>2D Video Acceleration</source>
         <comment>details report</comment>
         <translation>2D ビデオアクセラレーション</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1309"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1315"/>
         <source>Remote Desktop Server</source>
         <comment>details report (VRDE Server)</comment>
         <translation>リモートデスクトップサーバー</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1310"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1316"/>
         <source>Disabled</source>
         <comment>details report (VRDE Server)</comment>
         <translation>無効</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1350"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1356"/>
         <source>(CD/DVD)</source>
         <translation>(CD/DVD)</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1382"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1388"/>
         <source>Not Attached</source>
         <comment>details report (Storage)</comment>
         <translation>未割り当て</translation>
     </message>
     <message>
-        <location filename="../src/globals/VBoxGlobal.cpp" line="1390"/>
+        <location filename="../src/globals/VBoxGlobal.cpp" line="1396"/>
         <source>Storage</source>
         <comment>details report</comment>
         <translation>ストレージ</translation>
@@ -15297,8 +15319,8 @@ Version %1</source>
         <translation type="obsolete">^(?:(?:(\d+)(?:\s?(B|KB|MB|GB|TB|PB))?)|(?:(\d*)%1(\d{1,2})(?:\s?(KB|MB|GB|TB|PB))))$</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="49"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="68"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="61"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="80"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2572"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2604"/>
         <source>B</source>
@@ -15306,8 +15328,8 @@ Version %1</source>
         <translation>B</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="50"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="69"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="62"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="81"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2573"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2606"/>
         <source>KB</source>
@@ -15315,8 +15337,8 @@ Version %1</source>
         <translation>KB</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="51"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="70"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="63"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="82"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2574"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2608"/>
         <location filename="../src/widgets/UIApplianceEditorWidget.cpp" line="241"/>
@@ -15332,8 +15354,8 @@ Version %1</source>
         <translation>MB</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="52"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="71"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="64"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="83"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2575"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2610"/>
         <source>GB</source>
@@ -15341,8 +15363,8 @@ Version %1</source>
         <translation>GB</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="53"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="72"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="65"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="84"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2576"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2612"/>
         <source>TB</source>
@@ -15350,8 +15372,8 @@ Version %1</source>
         <translation>TB</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="54"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="73"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="66"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="85"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2577"/>
         <location filename="../src/globals/VBoxGlobal.cpp" line="2614"/>
         <source>PB</source>
@@ -15359,72 +15381,72 @@ Version %1</source>
         <translation>PB</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="174"/>
+        <location filename="../src/medium/UIMedium.cpp" line="178"/>
         <source>Empty</source>
         <comment>medium</comment>
         <translation>空</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="178"/>
+        <location filename="../src/medium/UIMedium.cpp" line="182"/>
         <source>Host Drive '%1'</source>
         <comment>medium</comment>
         <translation>ホストドライブ '%1'</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="180"/>
+        <location filename="../src/medium/UIMedium.cpp" line="184"/>
         <source>Host Drive %1 (%2)</source>
         <comment>medium</comment>
         <translation>ホストドライブ %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="326"/>
+        <location filename="../src/medium/UIMedium.cpp" line="330"/>
         <source><p style=white-space:pre>Type (Format):  %1 (%2)</p></source>
         <comment>medium</comment>
         <translation><p style=white-space:pre>タイプ (形式):  %1 (%2)</p></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="330"/>
+        <location filename="../src/medium/UIMedium.cpp" line="334"/>
         <source><p>Attached to:  %1</p></source>
         <comment>image</comment>
         <translation><p>割り当て:  %1</p></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="331"/>
+        <location filename="../src/medium/UIMedium.cpp" line="335"/>
         <source><i>Not Attached</i></source>
         <comment>image</comment>
         <translation><i>未割り当て</i></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="337"/>
+        <location filename="../src/medium/UIMedium.cpp" line="341"/>
         <source><i>Checking accessibility...</i></source>
         <comment>medium</comment>
         <translation><i>アクセス可否を確認中...</i></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="350"/>
+        <location filename="../src/medium/UIMedium.cpp" line="354"/>
         <source>Failed to check accessibility of disk image files.</source>
         <comment>medium</comment>
         <translation>メディアのアクセス可否の確認に失敗しました。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="394"/>
+        <location filename="../src/medium/UIMedium.cpp" line="409"/>
         <source><b>No disk image file selected</b></source>
         <comment>medium</comment>
         <translation><b>メディア 未選択</b></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="395"/>
+        <location filename="../src/medium/UIMedium.cpp" line="410"/>
         <source>You can also change this while the machine is running.</source>
         <translation>仮想マシンの動作中、これを変更することができます。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="396"/>
+        <location filename="../src/medium/UIMedium.cpp" line="411"/>
         <source><b>No disk image files available</b></source>
         <comment>medium</comment>
         <translation><b>メディア 利用不可</b></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="397"/>
+        <location filename="../src/medium/UIMedium.cpp" line="412"/>
         <source>You can create or add disk image files in the virtual machine settings.</source>
         <translation>仮想マシン設定でディスクイメージファイルを作成ないし追加できます。</translation>
     </message>
@@ -15433,19 +15455,19 @@ Version %1</source>
         <translation type="obsolete">仮想メディアマネージャーを使ってメディアのイメージを作成できます。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="407"/>
+        <location filename="../src/medium/UIMedium.cpp" line="422"/>
         <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
         <comment>medium</comment>
         <translation>このハードディスクの割り当ては、新規作成された差分ハードディスクの使用により、間接的に実行されます。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="567"/>
+        <location filename="../src/medium/UIMedium.cpp" line="601"/>
         <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
         <comment>medium</comment>
         <translation>ハードディスクチェーン中のいくつかのメディアにアクセスできません。仮想メディアマネージャーの<b>[差分ハードディスクを表示]</b>を使用して、これらのメディアを確認してください。</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMedium.cpp" line="584"/>
+        <location filename="../src/medium/UIMedium.cpp" line="618"/>
         <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
         <comment>medium</comment>
         <translation>このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:</translation>
@@ -15534,141 +15556,141 @@ Version %1</source>
         <translation>アダプター %1</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="102"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="188"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="114"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="200"/>
         <source>IDE Primary Master</source>
         <comment>StorageSlot</comment>
         <translation>IDE プライマリマスター</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="104"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="189"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="116"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="201"/>
         <source>IDE Primary Slave</source>
         <comment>StorageSlot</comment>
         <translation>IDE プライマリスレーブ</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="106"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="190"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="118"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="202"/>
         <source>IDE Secondary Master</source>
         <comment>StorageSlot</comment>
         <translation>IDE セカンダリマスター</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="108"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="191"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="120"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="203"/>
         <source>IDE Secondary Slave</source>
         <comment>StorageSlot</comment>
         <translation>IDE セカンダリスレーブ</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="124"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="192"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="136"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="204"/>
         <source>SATA Port %1</source>
         <comment>StorageSlot</comment>
         <translation>SATA ポート %1</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="140"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="193"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="152"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="205"/>
         <source>SCSI Port %1</source>
         <comment>StorageSlot</comment>
         <translation>SCSI ポート %1</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="156"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="194"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="168"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="206"/>
         <source>SAS Port %1</source>
         <comment>StorageSlot</comment>
         <translation>SAS ポート %1</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="172"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="195"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="184"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="207"/>
         <source>Floppy Device %1</source>
         <comment>StorageSlot</comment>
         <translation>フロッピーデバイス %1</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="393"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="420"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="685"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="712"/>
         <source>General</source>
         <comment>DetailsElementType</comment>
         <translation>一般</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="394"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="421"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="686"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="713"/>
         <source>Preview</source>
         <comment>DetailsElementType</comment>
         <translation>プレビュー</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="395"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="422"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="687"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="714"/>
         <source>System</source>
         <comment>DetailsElementType</comment>
         <translation>システム</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="396"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="423"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="688"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="715"/>
         <source>Display</source>
         <comment>DetailsElementType</comment>
         <translation>ディスプレイ</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="397"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="424"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="689"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="716"/>
         <source>Storage</source>
         <comment>DetailsElementType</comment>
         <translation>ストレージ</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="398"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="425"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="690"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="717"/>
         <source>Audio</source>
         <comment>DetailsElementType</comment>
         <translation>オーディオ</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="399"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="426"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="691"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="718"/>
         <source>Network</source>
         <comment>DetailsElementType</comment>
         <translation>ネットワーク</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="400"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="427"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="692"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="719"/>
         <source>Serial ports</source>
         <comment>DetailsElementType</comment>
         <translation>シリアルポート</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="402"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="429"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="694"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="721"/>
         <source>Parallel ports</source>
         <comment>DetailsElementType</comment>
         <translation>パラレルポート</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="404"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="431"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="696"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="723"/>
         <source>USB</source>
         <comment>DetailsElementType</comment>
         <translation>USB</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="405"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="432"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="697"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="724"/>
         <source>Shared folders</source>
         <comment>DetailsElementType</comment>
         <translation>共有フォルダー</translation>
     </message>
     <message>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="406"/>
-        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="433"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="698"/>
+        <location filename="../src/converter/UIConverterBackendGlobal.cpp" line="725"/>
         <source>Description</source>
         <comment>DetailsElementType</comment>
         <translation>説明</translation>
@@ -16250,7 +16272,7 @@ USB フィルターを追加または除去するにはコンテキストメニ
 <context>
     <name>VBoxMediaManagerDlg</name>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1237"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1182"/>
         <source>&Actions</source>
         <translation>動作(&A)</translation>
     </message>
@@ -16263,27 +16285,27 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">追加(&A)...</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1239"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1184"/>
         <source>&Copy...</source>
         <translation>コピー(&C)...</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1240"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1185"/>
         <source>&Modify...</source>
         <translation>変更(&M)...</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1241"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1186"/>
         <source>R&emove</source>
         <translation>除去(&E)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1242"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1187"/>
         <source>Re&lease</source>
         <translation>解放(&L)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1243"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1188"/>
         <source>Re&fresh</source>
         <translation>最新の情報に更新(&F)</translation>
     </message>
@@ -16300,27 +16322,27 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">既存のメディアを追加</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1251"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1196"/>
         <source>Copy an existing disk image file</source>
         <translation>既存のメディアをコピー</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1252"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1197"/>
         <source>Modify the attributes of the selected disk image file</source>
         <translation>選択したメディアの属性を変更</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1253"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1198"/>
         <source>Remove the selected disk image file</source>
         <translation>選択したメディアを除去</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1254"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1199"/>
         <source>Release the selected disk image file by detaching it from the machines</source>
         <translation>選択したメディアを仮想マシンから割り当て解除して解放する</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1255"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1200"/>
         <source>Refresh the list of disk image files</source>
         <translation>メディアリストを最新の情報に更新</translation>
     </message>
@@ -16345,7 +16367,7 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">割り当て</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1292"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1237"/>
         <source>Checking accessibility</source>
         <translation>アクセス可否を確認</translation>
     </message>
@@ -16390,18 +16412,18 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">すべての%1イメージ(%2)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="715"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="694"/>
         <source><i>Not&nbsp;Attached</i></source>
         <translation><i>未割り当て</i></translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1749"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1715"/>
         <source>--</source>
         <comment>no info</comment>
         <translation>--</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1270"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1215"/>
         <source>Virtual Media Manager</source>
         <translation>仮想メディアマネージャー</translation>
     </message>
@@ -16410,48 +16432,48 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">ハードディスク(&D)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1272"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1281"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1286"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1217"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1226"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1231"/>
         <source>Name</source>
         <translation>名前</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1273"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1218"/>
         <source>Virtual Size</source>
         <translation>仮想的なサイズ</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1274"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1219"/>
         <source>Actual Size</source>
         <translation>実際のサイズ</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1275"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1220"/>
         <source>Type:</source>
         <translation>タイプ:</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1276"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1283"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1288"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1221"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1228"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1233"/>
         <source>Location:</source>
         <translation>場所:</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1277"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1222"/>
         <source>Format:</source>
         <translation>フォーマット:</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1278"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1223"/>
         <source>Storage details:</source>
         <translation>ストレージの詳細:</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1279"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1284"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1289"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1224"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1229"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1234"/>
         <source>Attached to:</source>
         <translation>割り当て:</translation>
     </message>
@@ -16460,8 +16482,8 @@ USB フィルターを追加または除去するにはコンテキストメニ
         <translation type="obsolete">CD/DVDイメージ(&C)</translation>
     </message>
     <message>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1282"/>
-        <location filename="../src/medium/UIMediumManager.cpp" line="1287"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1227"/>
+        <location filename="../src/medium/UIMediumManager.cpp" line="1232"/>
         <source>Size</source>
         <translation>サイズ</translation>
     </message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
index a288e20..f33d1e8 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
@@ -822,6 +822,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">បណ្ដាញ</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3873,6 +3877,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4138,6 +4150,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
index f8fccbe..ef6878e 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
@@ -943,6 +943,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">네트워크</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4536,6 +4540,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4817,6 +4829,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>화면 %1의 동영상 녹화를 사용합니다.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
index d6332eb..8ea0b9a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
@@ -955,6 +955,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Tinklas</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4295,6 +4299,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4572,6 +4584,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
index 4eeba25..8d33608 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
@@ -834,6 +834,10 @@
         <source>&Webcams</source>
         <translation>&Webcams</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation>Netwerk</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -3797,6 +3801,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>Er zijn geen ondersteunde webcams aan de host-PC verbonden</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation>Verbind netwerkadapter</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation>Verbind netwerkadapter %1</translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4070,6 +4082,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>Schakel video-opname in voor scherm %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation>Beeldscherm op Afstand is voor deze virtuele machine momenteel ingeschakeld. Hiervoor moet echter <b>%1</b> geïnstalleerd zijn. Installeer het Extension Pack dat te vinden is op de downloadsite van VirtualBox, anders start deze VM op met Beeldscherm op Afstand uitgeschakeld.</translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
index 01e14b5..6b80e8f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
@@ -980,6 +980,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Sieć</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4187,6 +4191,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4456,6 +4468,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
index 9453edd..04955d0 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
@@ -951,6 +951,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Rede</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3994,6 +3998,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4263,6 +4275,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index 0460e0b..7dea6fc 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -1100,6 +1100,10 @@
         <source>&Webcams</source>
         <translation>&Webcams</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Rede</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4871,6 +4875,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation>Não há webcam suportada conectada ao PC hospedeiro</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -5152,6 +5164,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>Habilitar gravação de vídeo para a tela %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
index c444f05..85c1688 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
@@ -925,6 +925,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Rețea</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3890,6 +3894,14 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4151,6 +4163,10 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
index f4b443a..17b97a9 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
@@ -962,6 +962,10 @@
         <source>Insert the Guest Additions disk file into the virtual drive</source>
         <translation>Подключить установочный образ диска c пакетом Дополнений гостевой ОС</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Сеть</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -4502,6 +4506,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation>Нет поддерживаемых веб-камер, подсоединённых к хосту</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4783,6 +4795,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation>Включить захват видео для дисплея %1.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
index 194b1c7..1728c96 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
@@ -927,6 +927,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Sieť</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4254,6 +4258,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4523,6 +4535,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
index efe4d42..25e4522 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
@@ -894,6 +894,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Мрежа</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4315,6 +4319,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4588,6 +4600,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
index f703ee7..5c85a75 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
@@ -995,6 +995,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Nätverk</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4661,6 +4665,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4942,6 +4954,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
index ec8ac9a..088c0f2 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
@@ -910,6 +910,10 @@
         <source>&Webcams</source>
         <translation>&Web kameraları</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation>Ağ</translation>
+    </message>
 </context>
 <context>
     <name>UIActonPool</name>
@@ -3768,6 +3772,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>Anamakineye bağlanmış desteklenen web kameraları yok</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation>Ağ Bağdaştırıcısı Bağla</translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation>%1 Ağ Bağdaştırıcısını Bağla</translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4045,6 +4057,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>Ekran %1 için görüntü kaydını etkinleştir.</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation>Uzak Görüntü bu sanal makine için şu an etkinleştirildi. Ancak bu, <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sayfasından Genişletme Paketini yükleyin aksi halde VM'iniz etkisizleştirilmiş Uzak Görüntü ile başlatılacaktır.</translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
@@ -5609,7 +5625,7 @@
     </message>
     <message>
         <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
-        <translation>USB 2.0 şu anda bu sanal makine için etkinleştirildi. Ancak, bu <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin ya da makineyi başlatmak için USB 2.0'ı etkisizleştirin.</translation>
+        <translation>USB 2.0 bu sanal makine için şu an etkinleştirildi. Ancak bu, <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sayfasından Genişletme Paketini yükleyin ya da makineyi başlatmak için USB 2.0'ı etkisizleştirin.</translation>
     </message>
 </context>
 <context>
@@ -11922,7 +11938,7 @@ Version %1</source>
     </message>
     <message>
         <source>QED (QEMU enhanced disk)</source>
-        <translation>QED (QEMU geliştirilmiş disk)</translation>
+        <translation>QED (QEMU Geliştirilmiş Disk)</translation>
     </message>
     <message>
         <source>QCOW (QEMU Copy-On-Write)</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
index 1667938..cc50aa1 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
@@ -968,6 +968,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">Мережа</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -4338,6 +4342,14 @@ p, li { white-space: pre-wrap; }
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4619,6 +4631,10 @@ p, li { white-space: pre-wrap; }
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
index e6f8de8..f76551c 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
@@ -708,6 +708,10 @@
         <source>&Webcams</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -2246,6 +2250,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -2499,6 +2511,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
index eade6e6..abaffc5 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
@@ -829,6 +829,10 @@
         <source>&Webcams</source>
         <translation>摄像头(&W)</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">网络</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -3760,6 +3764,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>没有可用摄像头连接到主机</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -4035,6 +4047,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>启用屏幕 %1 录像。</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
index 126bf8e..b2fa0d6 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
@@ -708,6 +708,10 @@
         <source>&Webcams</source>
         <translation>Webcams(&W)</translation>
     </message>
+    <message>
+        <source>Network</source>
+        <translation type="unfinished">網路</translation>
+    </message>
 </context>
 <context>
     <name>UIApplianceEditorWidget</name>
@@ -2246,6 +2250,14 @@
         <source>No supported webcams connected to the host PC</source>
         <translation>未連接支援的 Webcams 在主機電腦</translation>
     </message>
+    <message>
+        <source>Connect Network Adapter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connect Network Adapter %1</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsAudio</name>
@@ -2499,6 +2511,10 @@
         <source>Enable video recording for screen %1.</source>
         <translation>啟用畫面 %1 的視訊錄製。</translation>
     </message>
+    <message>
+        <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>UIMachineSettingsGeneral</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_ca.ts b/src/VBox/Frontends/VirtualBox/nls/qt_ca.ts
index 57b3922..2384290 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_ca.ts
@@ -591,7 +591,7 @@ a
         <translation>Tanca la finestra</translation>
     </message>
     <message>
-        <source>Holds the name of the window and contains controls to manipulate it</source>
+        <source>Displays the name of the window and contains controls to manipulate it</source>
         <translation>Mostra el nom de la finestra i conté controls per a manipular-la</translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/qt_ca_VA.ts
index ea63484..6b617b3 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_ca_VA.ts
@@ -591,7 +591,7 @@ a
         <translation>Tanca la finestra</translation>
     </message>
     <message>
-        <source>Holds the name of the window and contains controls to manipulate it</source>
+        <source>Displays the name of the window and contains controls to manipulate it</source>
         <translation>Mostra el nom de la finestra i conté controls per a manipular-la</translation>
     </message>
 </context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_fa_IR.ts b/src/VBox/Frontends/VirtualBox/nls/qt_fa_IR.ts
index 0c02744..7ed8fc0 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_fa_IR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_fa_IR.ts
@@ -104,7 +104,7 @@ have libgstreamer-plugins-base installed.</source>
     <message numerus="yes">
       <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
       <translation>
-        <numerusform>کدک مورد نیاز یافت نشد. شما باید کدک ذیل را برای اجرای این مضمون نصب کنید : %0</numerusform>
+        <numerusform>کدک موردنیاز وجود ندارد. برای پخش این محتوا باید کدک زیر را نصب کنید: %0</numerusform>
       </translation>
     </message>
     <message>
@@ -4906,13 +4906,13 @@ Please choose a different file name.</source>
     <message numerus="yes">
       <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
       <translation>
-        <numerusform>%1 گرفته بیش از %n نشانوند. %2 از این رو نامعتبر است.</numerusform>
+        <numerusform>%1 حداکثر %n نشانوند می گیرد. %2 از این رو نامعتبر است</numerusform>
       </translation>
     </message>
     <message numerus="yes">
       <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
       <translation>
-        <numerusform>%1 حداقل %n به نشانوند نیاز دارد. %2 از اینرو نامعتبر است.</numerusform>
+        <numerusform>%1 حداقل %n نشانوند نیاز دارد. %2 از این رو نامعتبر است</numerusform>
       </translation>
     </message>
     <message>
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h b/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
index a96ab6a..92cc805 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
@@ -97,16 +97,16 @@ protected:
 
     virtual bool eventFilter(QObject *pObject, QEvent *pEvent)
     {
-        switch (pEvent->type())
+        /* Handle events for qApp only: */
+        if (pObject == qApp)
         {
-            case QEvent::LanguageChange:
+            switch (pEvent->type())
             {
-                retranslateUi();
-                break;
+                case QEvent::LanguageChange: retranslateUi(); break;
+                default: break;
             }
-            default:
-                break;
         }
+        /* Call to base-class: */
         return Base::eventFilter(pObject, pEvent);
     }
 
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
index 7541fce..59b03df 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
@@ -46,7 +46,7 @@ private:
 
 /* UIAction stuff: */
 UIAction::UIAction(UIActionPool *pParent, UIActionType type)
-    : QIWithRetranslateUI3<QAction>(pParent)
+    : QAction(pParent)
     , m_pActionPool(pParent)
     , m_type(type)
     , m_actionPoolType(pParent->type())
@@ -284,6 +284,11 @@ UIActionMenu::UIActionMenu(UIActionPool *pParent,
     setMenu(new UIMenu);
 }
 
+void UIActionMenu::updateText()
+{
+    setText(nameInMenu());
+}
+
 
 class UIActionSimpleLogDialog : public UIActionSimple
 {
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
index 729c887..a548700 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
@@ -68,7 +68,7 @@ enum UIActionIndex
 };
 
 /* Basic abstract QAction reimplemetation, extending interface: */
-class UIAction : public QIWithRetranslateUI3<QAction>
+class UIAction : public QAction
 {
     Q_OBJECT;
 
@@ -97,6 +97,9 @@ public:
     void showShortcut();
     void hideShortcut();
 
+    /** Calls for action translation handler. */
+    virtual void retranslateUi() = 0;
+
 protected:
 
     /* Constructor: */
@@ -105,10 +108,10 @@ protected:
     /* Protected API: Menu stuff: */
     QString nameInMenu() const;
 
-private:
+    /** Updates action text accordingly. */
+    virtual void updateText();
 
-    /* Helper: Text stuff: */
-    void updateText();
+private:
 
     /* Variables: */
     UIActionPool *m_pActionPool;
@@ -231,10 +234,13 @@ protected:
                  const QString &strIcon = QString(), const QString &strIconDis = QString());
     UIActionMenu(UIActionPool *pParent,
                  const QIcon &icon);
+
+    /** Updates action text accordingly. */
+    virtual void updateText();
 };
 
 /* Singleton action pool: */
-class UIActionPool : public QObject
+class UIActionPool : public QIWithRetranslateUI3<QObject>
 {
     Q_OBJECT;
 
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
index 7027886..5591853 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.cpp
@@ -59,7 +59,8 @@ QString UIShortcut::toString() const
 
 UIShortcutPool* UIShortcutPool::m_pInstance = 0;
 
-const QString UIShortcutPool::m_strShortcutKeyTemplate = QString("%1/%2");
+const QString UIShortcutPool::m_sstrShortcutKeyTemplate = QString("%1/%2");
+const QString UIShortcutPool::m_sstrShortcutKeyTemplateRuntime = m_sstrShortcutKeyTemplate.arg(GUI_Input_MachineShortcuts);
 
 UIShortcutPool* UIShortcutPool::instance()
 {
@@ -95,8 +96,8 @@ void UIShortcutPool::destroy()
 UIShortcut& UIShortcutPool::shortcut(UIActionPool *pActionPool, UIAction *pAction)
 {
     /* Compose shortcut key: */
-    const QString strShortcutKey(m_strShortcutKeyTemplate.arg(pActionPool->shortcutsExtraDataID(),
-                                                              pAction->shortcutExtraDataID()));
+    const QString strShortcutKey(m_sstrShortcutKeyTemplate.arg(pActionPool->shortcutsExtraDataID(),
+                                                               pAction->shortcutExtraDataID()));
     /* Return existing if any: */
     if (m_shortcuts.contains(strShortcutKey))
         return shortcut(strShortcutKey);
@@ -111,7 +112,7 @@ UIShortcut& UIShortcutPool::shortcut(UIActionPool *pActionPool, UIAction *pActio
 UIShortcut& UIShortcutPool::shortcut(const QString &strPoolID, const QString &strActionID)
 {
     /* Return if present, autocreate if necessary: */
-    return shortcut(m_strShortcutKeyTemplate.arg(strPoolID, strActionID));
+    return shortcut(m_sstrShortcutKeyTemplate.arg(strPoolID, strActionID));
 }
 
 void UIShortcutPool::setOverrides(const QMap<QString, QString> &overrides)
@@ -140,8 +141,8 @@ void UIShortcutPool::applyShortcuts(UIActionPool *pActionPool)
             continue;
 
         /* Compose shortcut key: */
-        const QString strShortcutKey = m_strShortcutKeyTemplate.arg(pActionPool->shortcutsExtraDataID(),
-                                                                    pAction->shortcutExtraDataID());
+        const QString strShortcutKey = m_sstrShortcutKeyTemplate.arg(pActionPool->shortcutsExtraDataID(),
+                                                                     pAction->shortcutExtraDataID());
         /* If shortcut key is already known: */
         if (m_shortcuts.contains(strShortcutKey))
         {
@@ -226,13 +227,19 @@ void UIShortcutPool::prepareConnections()
     connect(gEDataEvents, SIGNAL(sigMachineShortcutsChanged()), this, SLOT(sltReloadMachineShortcuts()));
 }
 
+void UIShortcutPool::retranslateUi()
+{
+    /* Translate own defaults: */
+    m_shortcuts[m_sstrShortcutKeyTemplateRuntime.arg("PopupMenu")]
+        .setDescription(QApplication::translate("UIActionPool", "Popup Menu"));
+}
+
 void UIShortcutPool::loadDefaults()
 {
-    /* Runtime shortcut key template: */
-    const QString strRuntimeShortcutKeyTemplate(m_strShortcutKeyTemplate.arg(GUI_Input_MachineShortcuts));
     /* Default shortcut for the Runtime Popup Menu invokation: */
-    m_shortcuts.insert(strRuntimeShortcutKeyTemplate.arg("PopupMenu"),
-                       UIShortcut(QApplication::translate("UIActionPool", "Popup Menu"), QString("Home"), QString("Home")));
+    m_shortcuts.insert(m_sstrShortcutKeyTemplateRuntime.arg("PopupMenu"),
+                       UIShortcut(QApplication::translate("UIActionPool", "Popup Menu"),
+                                  QString("Home"), QString("Home")));
 }
 
 void UIShortcutPool::loadOverrides()
@@ -246,7 +253,7 @@ void UIShortcutPool::loadOverrides()
 void UIShortcutPool::loadOverridesFor(const QString &strPoolExtraDataID)
 {
     /* Compose shortcut key template: */
-    const QString strShortcutKeyTemplate(m_strShortcutKeyTemplate.arg(strPoolExtraDataID));
+    const QString strShortcutKeyTemplate(m_sstrShortcutKeyTemplate.arg(strPoolExtraDataID));
     /* Iterate over all the overrides: */
     const QStringList overrides = vboxGlobal().virtualBox().GetExtraDataStringList(strPoolExtraDataID);
     foreach (const QString &strKeyValuePair, overrides)
@@ -294,7 +301,7 @@ void UIShortcutPool::saveOverrides()
 void UIShortcutPool::saveOverridesFor(const QString &strPoolExtraDataID)
 {
     /* Compose shortcut prefix: */
-    const QString strShortcutPrefix(m_strShortcutKeyTemplate.arg(strPoolExtraDataID, QString()));
+    const QString strShortcutPrefix(m_sstrShortcutKeyTemplate.arg(strPoolExtraDataID, QString()));
     /* Populate the list of all the known overrides: */
     QStringList overrides;
     const QList<QString> shortcutKeys = m_shortcuts.keys();
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
index d18439d..5d33756 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
@@ -24,6 +24,7 @@
 
 /* GUI includes: */
 #include "VBoxGlobal.h"
+#include "QIWithRetranslateUI.h"
 
 /* Forward declarations: */
 class UIActionPool;
@@ -72,7 +73,7 @@ private:
 };
 
 /* Singleton shortcut pool: */
-class UIShortcutPool : public QObject
+class UIShortcutPool : public QIWithRetranslateUI3<QObject>
 {
     Q_OBJECT;
 
@@ -117,6 +118,9 @@ private:
     /* Helper: Cleanup stuff: */
     void cleanup() {}
 
+    /** Translation handler. */
+    void retranslateUi();
+
     /* Helpers: Shortcuts stuff: */
     void loadDefaults();
     void loadOverrides();
@@ -129,7 +133,10 @@ private:
 
     /* Variables: */
     static UIShortcutPool *m_pInstance;
-    static const QString m_strShortcutKeyTemplate;
+    /** Shortcut key template. */
+    static const QString m_sstrShortcutKeyTemplate;
+    /** Shortcut key template for Runtime UI. */
+    static const QString m_sstrShortcutKeyTemplateRuntime;
     QMap<QString, UIShortcut> m_shortcuts;
 };
 
diff --git a/src/VBox/Frontends/VirtualBox/src/main.cpp b/src/VBox/Frontends/VirtualBox/src/main.cpp
index e2713dc..59b384b 100644
--- a/src/VBox/Frontends/VirtualBox/src/main.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/main.cpp
@@ -654,9 +654,12 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
 
     /* Prepare the error-message: */
     QString strTitle = QApplication::tr("VirtualBox - Error In %1").arg(pszWhere);
-    char msgBuf[1024];
-    vsprintf(msgBuf, pszMsgFmt, va);
-    QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(msgBuf).arg(rc);
+
+    char szMsgBuf[1024];
+    RTStrPrintfV(szMsgBuf, sizeof(szMsgBuf), pszMsgFmt, va);
+    QString strText = QApplication::tr("<html><b>%1 (rc=%2)</b><br/><br/>").arg(szMsgBuf).arg(rc);
+    strText.replace(QString("\n"), QString("<br>"));
+
     switch (enmWhat)
     {
         case kSupInitOp_Driver:
@@ -668,6 +671,7 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
             break;
 # ifdef RT_OS_LINUX
         case kSupInitOp_IPRT:
+        case kSupInitOp_Misc:
             if (rc == VERR_NO_MEMORY)
                 strText += g_QStrHintLinuxNoMemory;
             else
@@ -689,6 +693,7 @@ extern "C" DECLEXPORT(void) TrustedError(const char *pszWhere, SUPINITOP enmWhat
             /* no hints here */
             break;
     }
+
     strText += "</html>";
 
 # ifdef RT_OS_LINUX
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
index 957f9f4..02734cb 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.cpp
@@ -33,6 +33,7 @@
 #include <iprt/initterm.h>
 #include <iprt/http.h>
 #include <iprt/err.h>
+#include <iprt/zip.h>
 
 /* Our network-reply thread: */
 class UINetworkReplyPrivateThread : public QThread
@@ -72,14 +73,17 @@ private:
     static int applyProxyRules(RTHTTP pHttp, const QString &strHostName, int iPort);
     static int applyCertificates(RTHTTP pHttp, const QString &strFullCertificateFileName);
     static int applyRawHeaders(RTHTTP pHttp, const QList<QByteArray> &headers, const QNetworkRequest &request);
-    static int performGetRequest(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply);
+    static int performGetRequestForText(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply);
+    static int performGetRequestForBinary(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply);
     static int checkCertificates(RTHTTP pHttp, const QString &strFullCertificateFileName);
+    static int decompressCertificate(const QByteArray &package, QByteArray &certificate, const QString &strName);
     static int downloadCertificates(RTHTTP pHttp, const QString &strFullCertificateFileName);
-    static int downloadCertificatePca3G5(RTHTTP pHttp, QFile &file);
-    static int downloadCertificatePca3(RTHTTP pHttp, QFile &file);
+    static int downloadCertificatePca3G5(RTHTTP pHttp, QByteArray &certificate);
+    static int downloadCertificatePca3(RTHTTP pHttp, QByteArray &certificate);
     static int verifyCertificatePca3G5(RTHTTP pHttp, QByteArray &certificate);
     static int verifyCertificatePca3(RTHTTP pHttp, QByteArray &certificate);
     static int verifyCertificate(RTHTTP pHttp, QByteArray &certificate, const QByteArray &sha1, const QByteArray &sha512);
+    static int saveCertificates(const QString &strFullCertificateFileName, const QByteArray &certificatePca3G5, const QByteArray &certificatePca3);
     static int saveCertificate(QFile &file, const QByteArray &certificate);
 
     /* Variables: */
@@ -157,7 +161,7 @@ int UINetworkReplyPrivateThread::applyRawHeaders()
 int UINetworkReplyPrivateThread::performMainRequest()
 {
     /* Perform GET request: */
-    return performGetRequest(m_pHttp, m_request, m_reply);
+    return performGetRequestForText(m_pHttp, m_request, m_reply);
 }
 
 void UINetworkReplyPrivateThread::run()
@@ -260,19 +264,37 @@ int UINetworkReplyPrivateThread::applyRawHeaders(RTHTTP pHttp, const QList<QByte
 }
 
 /* static */
-int UINetworkReplyPrivateThread::performGetRequest(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply)
+int UINetworkReplyPrivateThread::performGetRequestForText(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply)
 {
     /* Make sure HTTP is created: */
     if (!pHttp)
         return VERR_INVALID_POINTER;
 
     /* Perform blocking HTTP GET request: */
-    char *pszBuf = 0;
-    int rc = RTHttpGet(pHttp,
-                       request.url().toString().toAscii().constData(),
-                       &pszBuf);
-    reply = QByteArray(pszBuf);
-    RTMemFree(pszBuf);
+    char *pszBuffer = 0;
+    int rc = RTHttpGetText(pHttp,
+                           request.url().toString().toAscii().constData(),
+                           &pszBuffer);
+    reply = QByteArray(pszBuffer);
+    RTMemFree(pszBuffer);
+    return rc;
+}
+
+/* static */
+int UINetworkReplyPrivateThread::performGetRequestForBinary(RTHTTP pHttp, const QNetworkRequest &request, QByteArray &reply)
+{
+    /* Make sure HTTP is created: */
+    if (!pHttp)
+        return VERR_INVALID_POINTER;
+
+    /* Perform blocking HTTP GET request: */
+    void *pBuffer = 0;
+    size_t size = 0;
+    int rc = RTHttpGetBinary(pHttp,
+                             request.url().toString().toAscii().constData(),
+                             &pBuffer, &size);
+    reply = QByteArray((const char*)pBuffer, (int)size);
+    RTMemFree(pBuffer);
     return rc;
 }
 
@@ -334,64 +356,100 @@ int UINetworkReplyPrivateThread::checkCertificates(RTHTTP pHttp, const QString &
 }
 
 /* static */
+int UINetworkReplyPrivateThread::decompressCertificate(const QByteArray &package, QByteArray &certificate, const QString &strName)
+{
+    /* Decompress certificate: */
+    void *pDecompressedBuffer;
+    size_t cDecompressedSize;
+    int rc = RTZipPkzipMemDecompress(&pDecompressedBuffer, &cDecompressedSize, package, package.size(), strName.toLatin1().constData());
+    if (RT_SUCCESS(rc))
+    {
+        /* Copy certificate: */
+        certificate = QByteArray((const char*)pDecompressedBuffer, (int)cDecompressedSize);
+        /* Free decompressed buffer: */
+        RTMemFree(pDecompressedBuffer);
+    }
+    /* Return result: */
+    return rc;
+}
+
+/* static */
 int UINetworkReplyPrivateThread::downloadCertificates(RTHTTP pHttp, const QString &strFullCertificateFileName)
 {
-    /* Open certificates file: */
-    QFile file(strFullCertificateFileName);
-    bool fFileOpened = file.open(QIODevice::WriteOnly);
-    int rc = fFileOpened ? VINF_SUCCESS : VERR_OPEN_FAILED;
+    /* Prepare certificates: */
+    QByteArray certificatePca3G5;
+    QByteArray certificatePca3;
 
-    /* Download PCA-3G5 certificate: */
+    /* Receive certificate package: */
+    QByteArray package;
+    const QNetworkRequest address(QUrl("http://www.verisign.com/support/roots.zip"));
+    int rc = performGetRequestForBinary(pHttp, address, package);
+    /* UnZIP PCA-3G5 certificate: */
     if (RT_SUCCESS(rc))
-        rc = downloadCertificatePca3G5(pHttp, file);
-    /* Download PCA-3 certificate: */
+    {
+        rc = decompressCertificate(package, certificatePca3G5,
+                                   "VeriSign Root Certificates/Generation 5 (G5) PCA/VeriSign Class 3 Public Primary Certification Authority - G5.pem");
+        /* Verify PCA-3G5 certificate: */
+        if (RT_SUCCESS(rc))
+            rc = verifyCertificatePca3G5(pHttp, certificatePca3G5);
+    }
+    /* UnZIP PCA-3 certificate: */
     if (RT_SUCCESS(rc))
-        rc = downloadCertificatePca3(pHttp, file);
+    {
+        rc = decompressCertificate(package, certificatePca3,
+                                   "VeriSign Root Certificates/Generation 1 (G1) PCAs/Class 3 Public Primary Certification Authority.pem");
+        /* Verify PCA-3 certificate: */
+        if (RT_SUCCESS(rc))
+            rc = verifyCertificatePca3(pHttp, certificatePca3);
+    }
 
-    /* Close certificates file: */
-    if (fFileOpened)
-        file.close();
+    /* Fallback.. download certificates separately: */
+    if (!RT_SUCCESS(rc))
+    {
+        /* Reset result: */
+        rc = VINF_SUCCESS;
+        /* Download PCA-3G5 certificate: */
+        if (RT_SUCCESS(rc))
+            rc = downloadCertificatePca3G5(pHttp, certificatePca3G5);
+        /* Download PCA-3 certificate: */
+        if (RT_SUCCESS(rc))
+            rc = downloadCertificatePca3(pHttp, certificatePca3);
+    }
+
+    /* Save certificates: */
+    if (RT_SUCCESS(rc))
+        saveCertificates(strFullCertificateFileName, certificatePca3G5, certificatePca3);
 
     /* Return result-code: */
     return rc;
 }
 
 /* static */
-int UINetworkReplyPrivateThread::downloadCertificatePca3G5(RTHTTP pHttp, QFile &file)
+int UINetworkReplyPrivateThread::downloadCertificatePca3G5(RTHTTP pHttp, QByteArray &certificate)
 {
     /* Receive certificate: */
-    QByteArray certificate;
     const QNetworkRequest address(QUrl("http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem"));
-    int rc = performGetRequest(pHttp, address, certificate);
+    int rc = performGetRequestForText(pHttp, address, certificate);
 
     /* Verify certificate: */
     if (RT_SUCCESS(rc))
         rc = verifyCertificatePca3G5(pHttp, certificate);
 
-    /* Save certificate: */
-    if (RT_SUCCESS(rc))
-        rc = saveCertificate(file, certificate);
-
     /* Return result-code: */
     return rc;
 }
 
 /* static */
-int UINetworkReplyPrivateThread::downloadCertificatePca3(RTHTTP pHttp, QFile &file)
+int UINetworkReplyPrivateThread::downloadCertificatePca3(RTHTTP pHttp, QByteArray &certificate)
 {
     /* Receive certificate: */
-    QByteArray certificate;
     const QNetworkRequest address(QUrl("http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem"));
-    int rc = performGetRequest(pHttp, address, certificate);
+    int rc = performGetRequestForText(pHttp, address, certificate);
 
     /* Verify certificate: */
     if (RT_SUCCESS(rc))
         rc = verifyCertificatePca3(pHttp, certificate);
 
-    /* Save certificate: */
-    if (RT_SUCCESS(rc))
-        rc = saveCertificate(file, certificate);
-
     /* Return result-code: */
     return rc;
 }
@@ -486,6 +544,30 @@ int UINetworkReplyPrivateThread::verifyCertificate(RTHTTP pHttp, QByteArray &cer
 }
 
 /* static */
+int UINetworkReplyPrivateThread::saveCertificates(const QString &strFullCertificateFileName,
+                                                  const QByteArray &certificatePca3G5,
+                                                  const QByteArray &certificatePca3)
+{
+    /* Open certificates file: */
+    QFile file(strFullCertificateFileName);
+    bool fFileOpened = file.open(QIODevice::WriteOnly);
+    int rc = fFileOpened ? VINF_SUCCESS : VERR_OPEN_FAILED;
+
+    /* Save certificates: */
+    if (RT_SUCCESS(rc))
+        rc = saveCertificate(file, certificatePca3G5);
+    if (RT_SUCCESS(rc))
+        rc = saveCertificate(file, certificatePca3);
+
+    /* Close certificates file: */
+    if (fFileOpened)
+        file.close();
+
+    /* Return result-code: */
+    return rc;
+}
+
+/* static */
 int UINetworkReplyPrivateThread::saveCertificate(QFile &file, const QByteArray &certificate)
 {
     /* Save certificate: */
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc b/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc
index 64ac538..30719f4 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc
+++ b/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -27,8 +27,12 @@ VS_VERSION_INFO    VERSIONINFO
 #else
   FILEFLAGS        0 // final version
 #endif
-  FILEOS           VOS__WINDOWS32
+  FILEOS           VOS_NT_WINDOWS32
+#ifdef VBOXR3_HARDENED_DLL
   FILETYPE         VFT_APP
+#else
+  FILETYPE         VFT_DLL
+#endif
   FILESUBTYPE      0   // not used
 BEGIN
   BLOCK "StringFileInfo"
@@ -38,9 +42,17 @@ BEGIN
     VALUE "CompanyName",     VBOX_RC_COMPANY_NAME
     VALUE "FileDescription", VBOX_PRODUCT " Manager\0"
     VALUE "FileVersion",     VBOX_VERSION_MAJOR "." VBOX_VERSION_MINOR "." VBOX_VERSION_BUILD "." VBOX_SVN_REV "\0"
+#ifdef VBOXR3_HARDENED_DLL
+    VALUE "InternalName",    "VirtualBox\0"
+#else
     VALUE "InternalName",    "VirtualBox.exe\0"
+#endif
     VALUE "LegalCopyright",  VBOX_RC_LEGAL_COPYRIGHT
+#ifdef VBOXR3_HARDENED_DLL
+    VALUE "OriginalFilename","VirtualBox.dll\0"
+#else
     VALUE "OriginalFilename","VirtualBox.exe\0"
+#endif
     VALUE "ProductName",     VBOX_PRODUCT "\0"
     VALUE "ProductVersion",  VBOX_VERSION_MAJOR "." VBOX_VERSION_MINOR "." VBOX_VERSION_BUILD ".r" VBOX_SVN_REV "\0"
     END
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc b/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBoxHardened.rc
similarity index 88%
copy from src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc
copy to src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBoxHardened.rc
index 64ac538..47a6f6a 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBox.rc
+++ b/src/VBox/Frontends/VirtualBox/src/platform/win/VirtualBoxHardened.rc
@@ -1,10 +1,10 @@
-/* $Id: VirtualBox.rc $ */
+/* $Id: VirtualBoxHardened.rc $ */
 /** @file
- * Windows resource file for VirtualBox.exe.
+ * Windows resource file for the Hardened VirtualBox.exe.
  */
 
 /*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -18,6 +18,7 @@
 #include <windows.h>
 #include <VBox/version.h>
 
+#if 0 /* Causes more DLLs to be loaded, don't enable it! */
 VS_VERSION_INFO    VERSIONINFO
   FILEVERSION      VBOX_VERSION_MAJOR_NR,VBOX_VERSION_MINOR_NR,VBOX_VERSION_BUILD_NR,0
   PRODUCTVERSION   VBOX_VERSION_MAJOR_NR,VBOX_VERSION_MINOR_NR,VBOX_VERSION_BUILD_NR,0
@@ -27,7 +28,7 @@ VS_VERSION_INFO    VERSIONINFO
 #else
   FILEFLAGS        0 // final version
 #endif
-  FILEOS           VOS__WINDOWS32
+  FILEOS           VOS_NT_WINDOWS32
   FILETYPE         VFT_APP
   FILESUBTYPE      0   // not used
 BEGIN
@@ -50,6 +51,7 @@ BEGIN
     VALUE "Translation", 0x409, 1252
   END
 END
+#endif
 
 /* Creates the application icon. */
 #include "VirtualBox-icon.rc"
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
index 7808704..48a2374 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.cpp
@@ -1203,6 +1203,17 @@ UIActionPoolRuntime::UIActionPoolRuntime()
     connect(gShortcutPool, SIGNAL(sigMachineShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
 }
 
+void UIActionPoolRuntime::retranslateUi()
+{
+    /* Translate all the actions: */
+    foreach (const int iActionPoolKey, m_pool.keys())
+        m_pool[iActionPoolKey]->retranslateUi();
+    /* Re-apply Runtime UI shortcuts: */
+    sltApplyShortcuts();
+    /* Temporary create Selector UI pool to do the same: */
+    UIActionPool::createTemporary(UIActionPoolType_Selector);
+}
+
 QString UIActionPoolRuntime::shortcutsExtraDataID() const
 {
     return GUI_Input_MachineShortcuts;
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
index b4acaf2..8b7b849 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
@@ -100,6 +100,9 @@ private:
     /* Constructor: */
     UIActionPoolRuntime();
 
+    /** Translation handler. */
+    void retranslateUi();
+
     /* Helper: Shortcuts stuff: */
     QString shortcutsExtraDataID() const;
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
index 02a9322..beb1b8d 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
@@ -223,19 +223,17 @@ STDMETHODIMP UIFrameBuffer::RequestResize(ULONG uScreenId, ULONG uPixelFormat,
                                           ULONG uWidth, ULONG uHeight,
                                           BOOL *pfFinished)
 {
-    LogRelFlow(("UIFrameBuffer::RequestResize: "
+    /* Make sure result pointer is valid: */
+    if (!pfFinished)
+    {
+        LogRel(("UIFrameBuffer::RequestResize: "
                 "Screen=%lu, Format=%lu, "
                 "BitsPerPixel=%lu, BytesPerLine=%lu, "
-                "Size=%lux%lu\n",
+                "Size=%lux%lu, Invalid pfFinished pointer!\n",
                 (unsigned long)uScreenId, (unsigned long)uPixelFormat,
                 (unsigned long)uBitsPerPixel, (unsigned long)uBytesPerLine,
                 (unsigned long)uWidth, (unsigned long)uHeight));
 
-    /* Make sure result pointer is valid: */
-    if (!pfFinished)
-    {
-        LogRelFlow(("UIFrameBuffer::RequestResize: Invalid pfFinished pointer!\n"));
-
         return E_POINTER;
     }
 
@@ -245,7 +243,13 @@ STDMETHODIMP UIFrameBuffer::RequestResize(ULONG uScreenId, ULONG uPixelFormat,
     /* Make sure frame-buffer is used: */
     if (m_fIsMarkedAsUnused)
     {
-        LogRelFlow(("UIFrameBuffer::RequestResize: Ignored!\n"));
+        LogRel(("UIFrameBuffer::RequestResize: "
+                "Screen=%lu, Format=%lu, "
+                "BitsPerPixel=%lu, BytesPerLine=%lu, "
+                "Size=%lux%lu, Ignored!\n",
+                (unsigned long)uScreenId, (unsigned long)uPixelFormat,
+                (unsigned long)uBitsPerPixel, (unsigned long)uBytesPerLine,
+                (unsigned long)uWidth, (unsigned long)uHeight));
 
         /* Mark request as finished.
          * It is required to report to the VM thread that we finished resizing and rely on the
@@ -264,7 +268,13 @@ STDMETHODIMP UIFrameBuffer::RequestResize(ULONG uScreenId, ULONG uPixelFormat,
 
     /* Widget resize is NOT thread-safe and *probably* never will be,
      * We have to notify machine-view with the async-signal to perform resize operation. */
-    LogRelFlow(("UIFrameBuffer::RequestResize: Sending to async-handler...\n"));
+    LogRel(("UIFrameBuffer::RequestResize: "
+            "Screen=%lu, Format=%lu, "
+            "BitsPerPixel=%lu, BytesPerLine=%lu, "
+            "Size=%lux%lu, Sending to async-handler..\n",
+            (unsigned long)uScreenId, (unsigned long)uPixelFormat,
+            (unsigned long)uBitsPerPixel, (unsigned long)uBytesPerLine,
+            (unsigned long)uWidth, (unsigned long)uHeight));
     emit sigRequestResize(uPixelFormat, pVRAM, uBitsPerPixel, uBytesPerLine, uWidth, uHeight);
 
     /* Unlock access to frame-buffer: */
@@ -293,17 +303,15 @@ STDMETHODIMP UIFrameBuffer::NotifyUpdate(ULONG uX, ULONG uY, ULONG uWidth, ULONG
     uWidth = qMin((int)m_width, (int)uWidth + 2);
     uHeight = qMin((int)m_height, (int)uHeight + 2);
 
-    LogRel2(("UIFrameBuffer::NotifyUpdate: Origin=%lux%lu, Size=%lux%lu\n",
-             (unsigned long)uX, (unsigned long)uY,
-             (unsigned long)uWidth, (unsigned long)uHeight));
-
     /* Lock access to frame-buffer: */
     lock();
 
     /* Make sure frame-buffer is used: */
     if (m_fIsMarkedAsUnused)
     {
-        LogRel2(("UIFrameBuffer::NotifyUpdate: Ignored!\n"));
+        LogRel2(("UIFrameBuffer::NotifyUpdate: Origin=%lux%lu, Size=%lux%lu, Ignored!\n",
+                 (unsigned long)uX, (unsigned long)uY,
+                 (unsigned long)uWidth, (unsigned long)uHeight));
 
         /* Unlock access to frame-buffer: */
         unlock();
@@ -314,7 +322,9 @@ STDMETHODIMP UIFrameBuffer::NotifyUpdate(ULONG uX, ULONG uY, ULONG uWidth, ULONG
 
     /* Widget update is NOT thread-safe and *seems* never will be,
      * We have to notify machine-view with the async-signal to perform update operation. */
-    LogRel2(("UIFrameBuffer::NotifyUpdate: Sending to async-handler...\n"));
+    LogRel2(("UIFrameBuffer::NotifyUpdate: Origin=%lux%lu, Size=%lux%lu, Sending to async-handler..\n",
+             (unsigned long)uX, (unsigned long)uY,
+             (unsigned long)uWidth, (unsigned long)uHeight));
     emit sigNotifyUpdate(uX, uY, uWidth, uHeight);
 
     /* Unlock access to frame-buffer: */
@@ -335,13 +345,11 @@ STDMETHODIMP UIFrameBuffer::NotifyUpdate(ULONG uX, ULONG uY, ULONG uWidth, ULONG
  */
 STDMETHODIMP UIFrameBuffer::VideoModeSupported(ULONG uWidth, ULONG uHeight, ULONG uBPP, BOOL *pfSupported)
 {
-    LogRel2(("UIFrameBuffer::IsVideoModeSupported: Mode: BPP=%lu, Size=%lux%lu\n",
-             (unsigned long)uBPP, (unsigned long)uWidth, (unsigned long)uHeight));
-
     /* Make sure result pointer is valid: */
     if (!pfSupported)
     {
-        LogRel2(("UIFrameBuffer::IsVideoModeSupported: Invalid pfSupported pointer!\n"));
+        LogRel2(("UIFrameBuffer::IsVideoModeSupported: Mode: BPP=%lu, Size=%lux%lu, Invalid pfSupported pointer!\n",
+                 (unsigned long)uBPP, (unsigned long)uWidth, (unsigned long)uHeight));
 
         return E_POINTER;
     }
@@ -352,7 +360,8 @@ STDMETHODIMP UIFrameBuffer::VideoModeSupported(ULONG uWidth, ULONG uHeight, ULON
     /* Make sure frame-buffer is used: */
     if (m_fIsMarkedAsUnused)
     {
-        LogRel2(("UIFrameBuffer::IsVideoModeSupported: Ignored!\n"));
+        LogRel2(("UIFrameBuffer::IsVideoModeSupported: Mode: BPP=%lu, Size=%lux%lu, Ignored!\n",
+                 (unsigned long)uBPP, (unsigned long)uWidth, (unsigned long)uHeight));
 
         /* Unlock access to frame-buffer: */
         unlock();
@@ -372,8 +381,8 @@ STDMETHODIMP UIFrameBuffer::VideoModeSupported(ULONG uWidth, ULONG uHeight, ULON
         && (uHeight > (ULONG)screenSize.height())
         && (uHeight > (ULONG)height()))
         *pfSupported = FALSE;
-
-    LogRel2(("UIFrameBuffer::IsVideoModeSupported: %s\n", *pfSupported ? "TRUE" : "FALSE"));
+    LogRel2(("UIFrameBuffer::IsVideoModeSupported: Mode: BPP=%lu, Size=%lux%lu, Supported=%s\n",
+             (unsigned long)uBPP, (unsigned long)uWidth, (unsigned long)uHeight, *pfSupported ? "TRUE" : "FALSE"));
 
     /* Unlock access to frame-buffer: */
     unlock();
@@ -404,13 +413,11 @@ STDMETHODIMP UIFrameBuffer::GetVisibleRegion(BYTE *pRectangles, ULONG uCount, UL
  */
 STDMETHODIMP UIFrameBuffer::SetVisibleRegion(BYTE *pRectangles, ULONG uCount)
 {
-    LogRel2(("UIFrameBuffer::SetVisibleRegion: Rectangle count=%lu\n",
-             (unsigned long)uCount));
-
     /* Make sure rectangles were passed: */
     if (!pRectangles)
     {
-        LogRel2(("UIFrameBuffer::SetVisibleRegion: Invalid pRectangles pointer!\n"));
+        LogRel2(("UIFrameBuffer::SetVisibleRegion: Rectangle count=%lu, Invalid pRectangles pointer!\n",
+                 (unsigned long)uCount));
 
         return E_POINTER;
     }
@@ -421,7 +428,8 @@ STDMETHODIMP UIFrameBuffer::SetVisibleRegion(BYTE *pRectangles, ULONG uCount)
     /* Make sure frame-buffer is used: */
     if (m_fIsMarkedAsUnused)
     {
-        LogRel2(("UIFrameBuffer::SetVisibleRegion: Ignored!\n"));
+        LogRel2(("UIFrameBuffer::SetVisibleRegion: Rectangle count=%lu, Ignored!\n",
+                 (unsigned long)uCount));
 
         /* Unlock access to frame-buffer: */
         unlock();
@@ -450,7 +458,8 @@ STDMETHODIMP UIFrameBuffer::SetVisibleRegion(BYTE *pRectangles, ULONG uCount)
     /* We are directly updating synchronous visible-region: */
     m_syncVisibleRegion = region;
     /* And send async-signal to update asynchronous one: */
-    LogRel2(("UIFrameBuffer::SetVisibleRegion: Sending to async-handler...\n"));
+    LogRel2(("UIFrameBuffer::SetVisibleRegion: Rectangle count=%lu, Sending to async-handler..\n",
+             (unsigned long)uCount));
     emit sigSetVisibleRegion(region);
 
     /* Unlock access to frame-buffer: */
@@ -475,8 +484,6 @@ STDMETHODIMP UIFrameBuffer::ProcessVHWACommand(BYTE *pCommand)
  */
 STDMETHODIMP UIFrameBuffer::Notify3DEvent(ULONG uType, BYTE *pData)
 {
-    LogRel2(("UIFrameBuffer::Notify3DEvent\n"));
-
     /* Lock access to frame-buffer: */
     lock();
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
index 2810530..bfa37c9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQImage.cpp
@@ -53,6 +53,14 @@ UIFrameBufferQImage::UIFrameBufferQImage(UIMachineView *pMachineView)
 
 void UIFrameBufferQImage::resizeEvent(UIResizeEvent *pEvent)
 {
+    LogRel(("UIFrameBufferQImage::resizeEvent: "
+            "Format=%lu, BitsPerPixel=%lu, BytesPerLine=%lu, Size=%lux%lu\n",
+            (unsigned long)pEvent->pixelFormat(),
+            (unsigned long)pEvent->bitsPerPixel(),
+            (unsigned long)pEvent->bytesPerLine(),
+            (unsigned long)pEvent->width(),
+            (unsigned long)pEvent->height()));
+
     /* Invalidate visible-region if necessary: */
     if (m_pMachineView->machineLogic()->visualStateType() == UIVisualStateType_Seamless &&
         (m_width != pEvent->width() || m_height != pEvent->height()))
@@ -116,6 +124,7 @@ void UIFrameBufferQImage::resizeEvent(UIResizeEvent *pEvent)
         if (!bFallback)
         {
             /* Finally compose image using VRAM directly: */
+            LogRel(("UIFrameBufferQImage::resizeEvent: Resizing to directly use VGA device content..\n"));
             m_img = QImage((uchar *)pEvent->VRAM(), m_width, m_height, bitsPerLine / 8, format);
             m_uPixelFormat = FramebufferPixelFormat_FOURCC_RGB;
             m_bUsesGuestVRAM = true;
@@ -127,14 +136,7 @@ void UIFrameBufferQImage::resizeEvent(UIResizeEvent *pEvent)
     /* Fallback if requested: */
     if (bFallback)
     {
-        LogRelFlow(("UIFrameBufferQImage::resizeEvent: "
-                    "Going fallback due to frame-buffer format become invalid: "
-                    "Format=%lu, BitsPerPixel=%lu, BytesPerLine=%lu, Size=%lux%lu\n",
-                    (unsigned long)pEvent->pixelFormat(),
-                    (unsigned long)pEvent->bitsPerPixel(),
-                    (unsigned long)pEvent->bytesPerLine(),
-                    (unsigned long)pEvent->width(),
-                    (unsigned long)pEvent->height()));
+        LogRel(("UIFrameBufferQImage::resizeEvent: Resizing to FALLBACK buffer due to format is invalid..\n"));
         goFallback();
     }
 
@@ -148,6 +150,13 @@ void UIFrameBufferQImage::resizeEvent(UIResizeEvent *pEvent)
 
 void UIFrameBufferQImage::paintEvent(QPaintEvent *pEvent)
 {
+    LogRel2(("UIFrameBufferQImage::paintEvent: "
+             "Origin=%lux%lu, Size=%lux%lu\n",
+             (unsigned long)pEvent->rect().x(),
+             (unsigned long)pEvent->rect().y(),
+             (unsigned long)pEvent->rect().width(),
+             (unsigned long)pEvent->rect().height()));
+
     /* On mode switch the enqueued paint event may still come
      * while the view is already null (before the new view gets set),
      * ignore paint event in that case. */
@@ -176,9 +185,9 @@ void UIFrameBufferQImage::paintEvent(QPaintEvent *pEvent)
         && machineState != KMachineState_Stuck
         )
     {
-        LogRelFlow(("UIFrameBufferQImage::paintEvent: "
-                    "Going fallback due to machine-state become invalid: "
-                    "%d.\n", (int)machineState));
+        LogRel2(("UIFrameBufferQImage::paintEvent: "
+                 "Going fallback due to machine-state become invalid: "
+                 "%d.\n", (int)machineState));
         goFallback();
     }
 
@@ -200,7 +209,7 @@ void UIFrameBufferQImage::paintEvent(QPaintEvent *pEvent)
 void UIFrameBufferQImage::paintDefault(QPaintEvent *pEvent)
 {
     /* Get rectangle to paint: */
-    QRect paintRect = pEvent->rect().intersected(m_img.rect());
+    QRect paintRect = pEvent->rect().intersected(m_img.rect()).intersected(m_pMachineView->viewport()->geometry());
     if (paintRect.isEmpty())
         return;
 
@@ -216,7 +225,7 @@ void UIFrameBufferQImage::paintDefault(QPaintEvent *pEvent)
 void UIFrameBufferQImage::paintSeamless(QPaintEvent *pEvent)
 {
     /* Get rectangle to paint: */
-    QRect paintRect = pEvent->rect().intersected(m_img.rect());
+    QRect paintRect = pEvent->rect().intersected(m_img.rect()).intersected(m_pMachineView->viewport()->geometry());
     if (paintRect.isEmpty())
         return;
 
@@ -280,7 +289,7 @@ void UIFrameBufferQImage::paintScale(QPaintEvent *pEvent)
     QImage &sourceImage = scaledImage.isNull() ? m_img : scaledImage;
 
     /* Get rectangle to paint: */
-    QRect paintRect = pEvent->rect().intersected(sourceImage.rect());
+    QRect paintRect = pEvent->rect().intersected(sourceImage.rect()).intersected(m_pMachineView->viewport()->geometry());
     if (paintRect.isEmpty())
         return;
 
@@ -303,9 +312,13 @@ void UIFrameBufferQImage::drawImageRect(QPainter &painter, const QImage &image,
     size_t offset = (rect.x() + iContentsShiftX) * image.depth() / 8 +
                     (rect.y() + iContentsShiftY) * image.bytesPerLine();
 
+    /* Restrain boundaries: */
+    int iSubImageWidth = qMin(rect.width(), image.width() - rect.x() - iContentsShiftX);
+    int iSubImageHeight = qMin(rect.height(), image.height() - rect.y() - iContentsShiftY);
+
     /* Create sub-image (no copy involved): */
     QImage subImage = QImage(image.bits() + offset,
-                             rect.width(), rect.height(),
+                             iSubImageWidth, iSubImageHeight,
                              image.bytesPerLine(), image.format());
 
 #ifndef QIMAGE_FRAMEBUFFER_WITH_DIRECT_OUTPUT
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
index 670f6e4..6c1f5cf 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
@@ -362,6 +362,75 @@ void UIKeyboardHandler::winSkipKeyboardEvents(bool fSkip)
     m_fSkipKeyboardEvents = fSkip;
 }
 
+/**
+ * @brief isSyntheticLCtrl
+ * @param   pMsg  Windows WM_[SYS]KEY* event message structure
+ * @return  true if this is a synthetic LCtrl event, false otherwise
+ * This function is a heuristic to tell whether a key event is the first in
+ * a synthetic LCtrl+RAlt sequence which Windows uses to signal AltGr.  Our
+ * heuristic is in two parts.  First of all, we check whether there is a pending
+ * RAlt key event matching this LCtrl event (i.e. both key up or both key down)
+ * and if there is, we check whether the current layout has an AltGr key.  We
+ * check this by looking to see if any of the layout-dependent keys has a symbol
+ * associated when AltGr is pressed.
+ */
+static bool isSyntheticLCtrl(MSG *pMsg)
+{
+    MSG peekMsg;
+    /** Keyboard state array with VK_CONTROL and VK_MENU depressed. */
+    const BYTE auKeyStates[256] =
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80 };
+    WORD ach;
+    unsigned i;
+
+    Assert(   pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN
+           || pMsg->message == WM_KEYUP || pMsg->message == WM_SYSKEYUP);
+    if (   ((RT_HIWORD(pMsg->lParam) & 0xFF) != 0x1d /* scan code: Control */)
+        || RT_HIWORD(pMsg->lParam) & KF_EXTENDED)
+        return false;
+    if (!PeekMessage(&peekMsg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE))
+        return false;
+    if (   (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
+        && (peekMsg.message != WM_KEYDOWN && peekMsg.message != WM_SYSKEYDOWN))
+        return false;
+    if (   (pMsg->message == WM_KEYUP || pMsg->message == WM_SYSKEYUP)
+        && (peekMsg.message != WM_KEYUP && peekMsg.message != WM_SYSKEYUP))
+        return false;
+    if (   ((RT_HIWORD(peekMsg.lParam) & 0xFF) != 0x38 /* scan code: Alt */)
+        || !(RT_HIWORD(peekMsg.lParam) & KF_EXTENDED))
+        return false;
+    /* If we got this far then we have a key event which could potentially
+     * be a synthetic left control.  Now we check to see whether the current
+     * keyboard layout actually has an AltGr key by checking whether any of
+     * the keys which might do produce a symbol when AltGr (Control + Alt) is
+     * depressed.  Generally this loop will exit pretty early (it exits on the
+     * first iteration for my German layout).  If there is no AltGr key in the
+     * layout then it will run right through, but that should not happen very
+     * often as we should hardly ever reach the loop in that case.
+     *
+     * In theory we could do this once and cache the result, but that involves
+     * tracking layout switches to invalidate the cache, and I don't think
+     * that the added complexity is worth the price.
+     */
+    for (i = '0'; i <= VK_OEM_102; ++i)
+    {
+        if (ToAscii(i, 0, auKeyStates, &ach, 0))
+            break;
+        /* Skip ranges of virtual keys which are undefined or not relevant. */
+        if (i == '9')
+            i = 'A' - 1;
+        if (i == 'Z')
+            i = VK_OEM_1 - 1;
+        if (i == VK_OEM_3)
+            i = VK_OEM_4 - 1;
+        if (i == VK_OEM_8)
+            i = VK_OEM_102 - 1;
+    }
+    if (i > VK_OEM_102)
+        return false;
+    return true;
+}
+
 bool UIKeyboardHandler::winEventFilter(MSG *pMsg, ulong uScreenId)
 {
     /* Check if some system event should be filtered-out.
@@ -388,6 +457,12 @@ bool UIKeyboardHandler::winEventFilter(MSG *pMsg, ulong uScreenId)
                 break;
             }
 
+            if (isSyntheticLCtrl(pMsg))
+            {
+                fResult = true;
+                break;
+            }
+
             /* Scancodes 0x80 and 0x00 are ignored: */
             unsigned scan = (pMsg->lParam >> 16) & 0x7F;
             if (!scan)
@@ -976,29 +1051,6 @@ bool UIKeyboardHandler::winLowKeyboardEvent(UINT msg, const KBDLLHOOKSTRUCT &eve
                == what_pressed))
         return false;
 
-    /* Sometimes it happens that Win inserts additional events on some key
-     * press/release. For example, it prepends ALT_GR in German layout with
-     * the VK_LCONTROL vkey with curious 0x21D scan code (seems to be necessary
-     * to specially treat ALT_GR to enter additional chars to regular apps).
-     * These events are definitely unwanted in VM, so filter them out. */
-    /* Note (michael): it also sometimes sends the VK_CAPITAL vkey with scan
-     * code 0x23a. If this is not passed through then it is impossible to
-     * cancel CapsLock on a French keyboard.  I didn't find any other examples
-     * of these strange events.  Let's hope we are not missing anything else
-     * of importance! */
-    if (m_views[m_iKeyboardHookViewIndex]->hasFocus() && (event.scanCode & ~0xFF))
-    {
-        if (event.vkCode == VK_CAPITAL)
-            return false;
-        else
-            return true;
-    }
-
-    /** @todo this needs to be after the preceding check so that
-     *        we ignore those spurious key events even when the
-     *        keyboard is not captured.  However, that is probably a
-     *        hint that that filtering should be done somewhere else,
-     *        and not in the keyboard capture handler. */
     if (!m_fIsKeyboardCaptured)
         return false;
 
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
index 2aad2f1..6065458 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp
@@ -415,6 +415,39 @@ void UIMachineWindowNormal::loadSettings()
     /* Get machine: */
     CMachine m = machine();
 
+    /* Load global settings: */
+    {
+        VBoxGlobalSettings settings = vboxGlobal().settings();
+#ifndef Q_WS_MAC
+        menuBar()->setHidden(settings.isFeatureActive("noMenuBar"));
+#endif /* !Q_WS_MAC */
+        statusBar()->setHidden(settings.isFeatureActive("noStatusBar"));
+        if (statusBar()->isHidden())
+            m_pIdleTimer->stop();
+    }
+
+    /* Load availability settings: */
+    {
+        /* USB Stuff: */
+        if (indicatorsPool()->indicator(IndicatorType_USB))
+        {
+            const CUSBDeviceFilters &filters = m.GetUSBDeviceFilters();
+            ULONG cOhciCtls = m.GetUSBControllerCountByType(KUSBControllerType_OHCI);
+            bool fUSBEnabled = !filters.isNull() && cOhciCtls && m.GetUSBProxyAvailable();
+
+            if (!fUSBEnabled)
+            {
+                /* Hide USB menu: */
+                indicatorsPool()->indicator(IndicatorType_USB)->setHidden(true);
+            }
+            else
+            {
+                /* Toggle USB LED: */
+                indicatorsPool()->indicator(IndicatorType_USB)->setState(KDeviceActivity_Idle);
+            }
+        }
+    }
+
     /* Load extra-data settings: */
     {
         /* Load window position settings: */
@@ -480,39 +513,6 @@ void UIMachineWindowNormal::loadSettings()
         normalizeGeometry(true);
 #endif /* !Q_WS_X11 */
     }
-
-    /* Load availability settings: */
-    {
-        /* USB Stuff: */
-        if (indicatorsPool()->indicator(IndicatorType_USB))
-        {
-            const CUSBDeviceFilters &filters = m.GetUSBDeviceFilters();
-            ULONG cOhciCtls = m.GetUSBControllerCountByType(KUSBControllerType_OHCI);
-            bool fUSBEnabled = !filters.isNull() && cOhciCtls && m.GetUSBProxyAvailable();
-
-            if (!fUSBEnabled)
-            {
-                /* Hide USB menu: */
-                indicatorsPool()->indicator(IndicatorType_USB)->setHidden(true);
-            }
-            else
-            {
-                /* Toggle USB LED: */
-                indicatorsPool()->indicator(IndicatorType_USB)->setState(KDeviceActivity_Idle);
-            }
-        }
-    }
-
-    /* Load global settings: */
-    {
-        VBoxGlobalSettings settings = vboxGlobal().settings();
-#ifndef Q_WS_MAC
-        menuBar()->setHidden(settings.isFeatureActive("noMenuBar"));
-#endif /* !Q_WS_MAC */
-        statusBar()->setHidden(settings.isFeatureActive("noStatusBar"));
-        if (statusBar()->isHidden())
-            m_pIdleTimer->stop();
-    }
 }
 
 void UIMachineWindowNormal::saveSettings()
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
index 2e0328e..b57123b 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
@@ -980,6 +980,17 @@ UIActionPoolSelector::UIActionPoolSelector()
     connect(gShortcutPool, SIGNAL(sigSelectorShortcutsReloaded()), this, SLOT(sltApplyShortcuts()));
 }
 
+void UIActionPoolSelector::retranslateUi()
+{
+    /* Translate all the actions: */
+    foreach (const int iActionPoolKey, m_pool.keys())
+        m_pool[iActionPoolKey]->retranslateUi();
+    /* Re-apply Selector UI shortcuts: */
+    sltApplyShortcuts();
+    /* Temporary create Runtime UI pool to do the same: */
+    UIActionPool::createTemporary(UIActionPoolType_Runtime);
+}
+
 QString UIActionPoolSelector::shortcutsExtraDataID() const
 {
     return GUI_Input_SelectorShortcuts;
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
index d12426f..6319d91 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
@@ -82,6 +82,9 @@ private:
     /* Constructor: */
     UIActionPoolSelector();
 
+    /** Translation handler. */
+    void retranslateUi();
+
     /* Helper: Shortcuts stuff: */
     QString shortcutsExtraDataID() const;
 
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp
index b2dd494..9c880b5 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp
@@ -533,6 +533,36 @@ void UIHotKeyTableModel::applyFilter()
 }
 
 
+/** Own QStyledItemDelegate implementation. */
+class UIStyledItemDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT;
+
+public:
+
+    /** Constructor. */
+    UIStyledItemDelegate(QObject *pParent) : QStyledItemDelegate(pParent) {}
+
+private:
+
+    /** Returns the widget used to edit the item specified by @a index for editing.
+      * The @a pParent widget and style @a option are used to control how the editor widget appears.
+      * Besides Qt description copy-pasted above we are installing the hook to redirect editor's sigCommitData signal. */
+    QWidget* createEditor(QWidget *pParent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+QWidget* UIStyledItemDelegate::createEditor(QWidget *pParent, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    /* Call to base-class to get actual editor created: */
+    QWidget *pEditor = QStyledItemDelegate::createEditor(pParent, option, index);
+    /* All the stuff we actually need from UIStyledItemDelegate is to redirect this one signal: */
+    if (qobject_cast<UIHotKeyEditor*>(pEditor) || qobject_cast<UIHostComboEditor*>(pEditor))
+        connect(pEditor, SIGNAL(sigCommitData(QWidget*)), this, SIGNAL(commitData(QWidget*)));
+    /* Return actual editor: */
+    return pEditor;
+}
+
+
 UIHotKeyTable::UIHotKeyTable(QWidget *pParent, UIHotKeyTableModel *pModel)
     : QTableView(pParent)
 {
@@ -554,28 +584,26 @@ UIHotKeyTable::UIHotKeyTable(QWidget *pParent, UIHotKeyTableModel *pModel)
     horizontalHeader()->setResizeMode(UIHotKeyTableSection_Name, QHeaderView::Interactive);
     horizontalHeader()->setResizeMode(UIHotKeyTableSection_Value, QHeaderView::Stretch);
 
-    /* Register delegate editor: */
-    if (QAbstractItemDelegate *pAbstractItemDelegate = itemDelegate())
-    {
-        if (QStyledItemDelegate *pStyledItemDelegate = qobject_cast<QStyledItemDelegate*>(pAbstractItemDelegate))
-        {
-            /* Create new item editor factory: */
-            QItemEditorFactory *pNewItemEditorFactory = new QItemEditorFactory;
+    /* Reinstall delegate: */
+    delete itemDelegate();
+    UIStyledItemDelegate *pStyledItemDelegate = new UIStyledItemDelegate(this);
+    setItemDelegate(pStyledItemDelegate);
 
-            /* Register UIHotKeyEditor as the UIHotKey editor: */
-            int iHotKeyTypeId = qRegisterMetaType<UIHotKey>();
-            QStandardItemEditorCreator<UIHotKeyEditor> *pHotKeyItemEditorCreator = new QStandardItemEditorCreator<UIHotKeyEditor>();
-            pNewItemEditorFactory->registerEditor((QVariant::Type)iHotKeyTypeId, pHotKeyItemEditorCreator);
+    /* Create new item editor factory: */
+    QItemEditorFactory *pNewItemEditorFactory = new QItemEditorFactory;
 
-            /* Register UIHostComboEditor as the UIHostComboWrapper: */
-            int iHostComboTypeId = qRegisterMetaType<UIHostComboWrapper>();
-            QStandardItemEditorCreator<UIHostComboEditor> *pHostComboItemEditorCreator = new QStandardItemEditorCreator<UIHostComboEditor>();
-            pNewItemEditorFactory->registerEditor((QVariant::Type)iHostComboTypeId, pHostComboItemEditorCreator);
+    /* Register UIHotKeyEditor as the UIHotKey editor: */
+    int iHotKeyTypeId = qRegisterMetaType<UIHotKey>();
+    QStandardItemEditorCreator<UIHotKeyEditor> *pHotKeyItemEditorCreator = new QStandardItemEditorCreator<UIHotKeyEditor>();
+    pNewItemEditorFactory->registerEditor((QVariant::Type)iHotKeyTypeId, pHotKeyItemEditorCreator);
 
-            /* Set configured item editor factory for table delegate: */
-            pStyledItemDelegate->setItemEditorFactory(pNewItemEditorFactory);
-        }
-    }
+    /* Register UIHostComboEditor as the UIHostComboWrapper: */
+    int iHostComboTypeId = qRegisterMetaType<UIHostComboWrapper>();
+    QStandardItemEditorCreator<UIHostComboEditor> *pHostComboItemEditorCreator = new QStandardItemEditorCreator<UIHostComboEditor>();
+    pNewItemEditorFactory->registerEditor((QVariant::Type)iHostComboTypeId, pHostComboItemEditorCreator);
+
+    /* Set configured item editor factory for table delegate: */
+    pStyledItemDelegate->setItemEditorFactory(pNewItemEditorFactory);
 }
 
 void UIHotKeyTable::sltHandleShortcutsLoaded()
@@ -588,3 +616,5 @@ void UIHotKeyTable::sltHandleShortcutsLoaded()
     setSortingEnabled(true);
 }
 
+#include "UIGlobalSettingsInput.moc"
+
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
index 7183eee..32e9e81 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.cpp
@@ -321,6 +321,12 @@ UIHostComboEditor::UIHostComboEditor(QWidget *pParent)
     prepare();
 }
 
+void UIHostComboEditor::sltCommitData()
+{
+    /* Commit data to the listener: */
+    emit sigCommitData(this);
+}
+
 void UIHostComboEditor::prepare()
 {
     /* Configure self: */
@@ -336,6 +342,7 @@ void UIHostComboEditor::prepare()
         {
             /* Configure UIHostComboEditorPrivate instance: */
             setFocusProxy(m_pEditor);
+            connect(m_pEditor, SIGNAL(sigDataChanged()), this, SLOT(sltCommitData()));
         }
         /* Create 'clear' tool-button: */
         m_pButtonClear = new QIToolButton;
@@ -444,6 +451,8 @@ void UIHostComboEditorPrivate::sltClear()
     updateText();
     /* Move the focus to text-field: */
     setFocus();
+    /* Notify data changed: */
+    emit sigDataChanged();
 }
 
 #ifdef Q_WS_WIN
@@ -702,6 +711,8 @@ void UIHostComboEditorPrivate::sltReleasePendingKeys()
         m_releasedKeys.clear();
         if (m_pressedKeys.isEmpty())
             m_fStartNewSequence = true;
+        /* Notify data changed: */
+        emit sigDataChanged();
     }
     /* Make sure the user see what happens: */
     updateText();
@@ -730,9 +741,10 @@ bool UIHostComboEditorPrivate::processKeyEvent(int iKeyCode, bool fKeyPress)
             /* Remember pressed symbol: */
             m_pressedKeys << iKeyCode;
             m_shownKeys.insert(iKeyCode, UINativeHotKey::toString(iKeyCode));
-
             /* Remember what we already started a sequence: */
             m_fStartNewSequence = false;
+            /* Notify data changed: */
+            emit sigDataChanged();
         }
     }
     /* Key release: */
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
index cac1fd5..a4a26a3 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
@@ -81,11 +81,21 @@ class UIHostComboEditor : public QIWithRetranslateUI<QWidget>
     Q_OBJECT;
     Q_PROPERTY(UIHostComboWrapper combo READ combo WRITE setCombo USER true);
 
+signals:
+
+    /** Notifies listener about data should be committed. */
+    void sigCommitData(QWidget *pThis);
+
 public:
 
     /** Constructs host-combo editor for passed @a pParent. */
     UIHostComboEditor(QWidget *pParent);
 
+private slots:
+
+    /** Notifies listener about data should be committed. */
+    void sltCommitData();
+
 private:
 
     /** Prepares widget content. */
@@ -110,6 +120,11 @@ class UIHostComboEditorPrivate : public QLineEdit
 {
     Q_OBJECT;
 
+signals:
+
+    /** Notifies parent about data changed. */
+    void sigDataChanged();
+
 public:
 
     UIHostComboEditorPrivate();
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
index 80eeb5d..883d738 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp
@@ -151,6 +151,8 @@ void UIHotKeyEditor::sltReset()
     drawSequence();
     /* Move the focut to text-field: */
     m_pLineEdit->setFocus();
+    /* Commit data to the listener: */
+    emit sigCommitData(this);
 }
 
 void UIHotKeyEditor::sltClear()
@@ -161,6 +163,8 @@ void UIHotKeyEditor::sltClear()
     drawSequence();
     /* Move the focut to text-field: */
     m_pLineEdit->setFocus();
+    /* Commit data to the listener: */
+    emit sigCommitData(this);
 }
 
 void UIHotKeyEditor::retranslateUi()
@@ -435,6 +439,8 @@ void UIHotKeyEditor::reflectSequence()
     }
     /* Save what we've got: */
     m_hotKey.setSequence(strSequence);
+    /* Commit data to the listener: */
+    emit sigCommitData(this);
 }
 
 void UIHotKeyEditor::drawSequence()
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
index 166d010..88a8e45 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
@@ -93,6 +93,11 @@ class UIHotKeyEditor : public QIWithRetranslateUI<QWidget>
     Q_OBJECT;
     Q_PROPERTY(UIHotKey hotKey READ hotKey WRITE setHotKey USER true);
 
+signals:
+
+    /** Notifies listener about data should be committed. */
+    void sigCommitData(QWidget *pThis);
+
 public:
 
     /* Constructor: */
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
index 37f1607..acb0458 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
@@ -131,8 +131,8 @@ static const osTypePattern gs_OSTypePattern[] =
     { QRegExp("Ub.*32",                            Qt::CaseInsensitive), "Ubuntu" },
     { QRegExp("Xa.*64",                            Qt::CaseInsensitive), "Xandros_64" },
     { QRegExp("Xa.*32",                            Qt::CaseInsensitive), "Xandros" },
-    { QRegExp("((Or)|(oel)).*64",                  Qt::CaseInsensitive), "Oracle_64" },
-    { QRegExp("((Or)|(oel)).*32",                  Qt::CaseInsensitive), "Oracle" },
+    { QRegExp("((Or)|(oel)|(ol)).*64",             Qt::CaseInsensitive), "Oracle_64" },
+    { QRegExp("((Or)|(oel)|(ol)).*32",             Qt::CaseInsensitive), "Oracle" },
     { QRegExp("Knoppix",                           Qt::CaseInsensitive), "Linux26" },
     { QRegExp("Dsl",                               Qt::CaseInsensitive), "Linux24" },
     { QRegExp("((Lin)|(lnx)).*2.?2",               Qt::CaseInsensitive), "Linux22" },
diff --git a/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt b/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt
index ac3b20b..90c49bd 100644
--- a/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt
+++ b/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt
@@ -8570,6 +8570,20 @@ param       value       GLint
 category    VBox
 chromium    nopack
 
+name        VBoxConChromiumParametervCR
+return      void
+param       con         GLint
+param       target      GLenum
+paramprop   target      GL_CURSOR_POSITION_CR GL_DEFAULT_BBOX_CR GL_SCREEN_BBOX_CR GL_OBJECT_BBOX_CR GL_PRINT_STRING_CR GL_MURAL_SIZE_CR GL_NUM_SERVERS_CR GL_NUM_TILES_CR GL_TILE_BOUNDS_CR GL_VERTEX_COUNTS_CR GL_RESET_VERTEX_COUNTERS_CR GL_SET_MAX_VIEWPORT_CR GL_HEAD_SPU_NAME_CR GL_PERF_GET_FRAME_DATA_CR GL_PERF_GET_TIMER_DATA_CR GL_PERF_DUMP_COUNTERS_CR GL_PERF_SET_TOKEN_CR GL_PERF_SET_DUMP_ON_SWAP_CR GL_PERF_SET_DUMP_ON_FINISH_CR GL_PERF_SET_DUMP_ON_FLUSH_CR GL_PERF_START_TIMER_CR GL_P [...]
+param       type        GLenum
+paramprop   type        GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_DOUBLE
+param       count       GLsizei
+param       values      const GLvoid *
+category    VBox
+props       nolist
+chromium    nopack
+
+
 name        VBoxWindowCreate
 return      GLint
 param       con         GLint
diff --git a/src/VBox/GuestHost/OpenGL/include/chromium.h b/src/VBox/GuestHost/OpenGL/include/chromium.h
index 4e1ed62..b4782e8 100644
--- a/src/VBox/GuestHost/OpenGL/include/chromium.h
+++ b/src/VBox/GuestHost/OpenGL/include/chromium.h
@@ -727,6 +727,14 @@ extern void APIENTRY glZPixCR(GLsizei width, GLsizei height, GLenum format,
 #define GL_HH_SET_DEFAULT_SHARED_CTX  0x8B2D
 
 #define GL_HH_SET_TMPCTX_MAKE_CURRENT 0x8B2E
+/* inform renderspu about the current render thread */
+#define GL_HH_RENDERTHREAD_INFORM     0x8B2F
+
+/* enable zero vertex attribute generation to work around wine bug */
+#define GL_CHECK_ZERO_VERT_ARRT       0x8B30
+
+/* share lists */
+#define GL_SHARE_LISTS_CR             0x8B31
 
 /**********************************************************************/
 /*****                Chromium-specific API                       *****/
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_blitter.h b/src/VBox/GuestHost/OpenGL/include/cr_blitter.h
index 2a01d3b..b683072 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_blitter.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_blitter.h
@@ -29,6 +29,23 @@
 #endif
 
 RT_C_DECLS_BEGIN
+typedef struct CR_BLITTER_IMG
+{
+    void *pvData;
+    GLuint cbData;
+    GLenum enmFormat;
+    GLuint width, height;
+    GLuint bpp;
+    GLuint pitch;
+} CR_BLITTER_IMG, *PCR_BLITTER_IMG;
+
+VBOXBLITTERDECL(void) CrMClrFillImgRect(CR_BLITTER_IMG *pDst, const RTRECT *pCopyRect, uint32_t u32Color);
+VBOXBLITTERDECL(void) CrMClrFillImg(CR_BLITTER_IMG *pImg, uint32_t cRects, const RTRECT *pRects, uint32_t u32Color);
+VBOXBLITTERDECL(void) CrMBltImgRect(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, CR_BLITTER_IMG *pDst);
+VBOXBLITTERDECL(void) CrMBltImg(const CR_BLITTER_IMG *pSrc, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst);
+VBOXBLITTERDECL(void) CrMBltImgRectScaled(const CR_BLITTER_IMG *pSrc, const RTPOINT *pPos, bool fSrcInvert, const RTRECT *pCopyRect, float strX, float strY, CR_BLITTER_IMG *pDst);
+VBOXBLITTERDECL(void) CrMBltImgScaled(const CR_BLITTER_IMG *pSrc, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst);
+
 /* GLSL Cache */
 typedef struct CR_GLSL_CACHE
 {
@@ -106,16 +123,6 @@ typedef struct CR_BLITTER_WINDOW
     GLuint width, height;
 } CR_BLITTER_WINDOW, *PCR_BLITTER_WINDOW;
 
-typedef struct CR_BLITTER_IMG
-{
-    void *pvData;
-    GLuint cbData;
-    GLenum enmFormat;
-    GLuint width, height;
-    GLuint bpp;
-    GLuint pitch;
-} CR_BLITTER_IMG, *PCR_BLITTER_IMG;
-
 typedef struct CR_BLITTER
 {
     GLuint idFBO;
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_glstate.h b/src/VBox/GuestHost/OpenGL/include/cr_glstate.h
index 95b3477..225d23e 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_glstate.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_glstate.h
@@ -115,7 +115,7 @@ typedef struct _CRSharedState {
     CRHashTable *fbTable;       /* frame buffers */
     CRHashTable *rbTable;       /* render buffers */
 
-    GLint refCount;
+    volatile int32_t refCount;
     GLint id;                   /*unique shared state id, it's not always matching some existing context id!*/
     GLint saveCount;
 
@@ -213,6 +213,7 @@ DECLEXPORT(CRContext *) crStateCreateContext(const CRLimitsState *limits, GLint
 DECLEXPORT(CRContext *) crStateCreateContextEx(const CRLimitsState *limits, GLint visBits, CRContext *share, GLint presetID);
 DECLEXPORT(void) crStateMakeCurrent(CRContext *ctx);
 DECLEXPORT(void) crStateSetCurrent(CRContext *ctx);
+DECLEXPORT(void) crStateCleanupCurrent();
 DECLEXPORT(CRContext *) crStateGetCurrent(void);
 DECLEXPORT(void) crStateDestroyContext(CRContext *ctx);
 DECLEXPORT(GLboolean) crStateEnableDiffOnMakeCurrent(GLboolean fEnable);
@@ -306,6 +307,7 @@ crStateReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
                    GLenum format, GLenum type, GLvoid *pixels );
 
 DECLEXPORT(void) STATE_APIENTRY crStateShareContext(GLboolean value);
+DECLEXPORT(void) STATE_APIENTRY crStateShareLists(CRContext *pContext1, CRContext *pContext2);
 DECLEXPORT(void) STATE_APIENTRY crStateSetSharedContext(CRContext *pCtx);
 DECLEXPORT(GLboolean) STATE_APIENTRY crStateContextIsShared(CRContext *pCtx);
 
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_pack.h b/src/VBox/GuestHost/OpenGL/include/cr_pack.h
index 3f7f930..87f01b4 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_pack.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_pack.h
@@ -50,12 +50,25 @@ typedef void (*CRPackFlushFunc)(void *arg);
 typedef void (*CRPackSendHugeFunc)(CROpcode, void *);
 typedef void (*CRPackErrorHandlerFunc)(int line, const char *file, GLenum error, const char *info);
 
-typedef enum
-{
-    CRPackBeginEndStateNone = 0, /* not in begin end */
-    CRPackBeginEndStateStarted,       /* begin issued */
-    CRPackBeginEndStateFlushDone /* begin issued & buffer flash is done thus part of commands is issued to host */
-} CRPackBeginEndState;
+#define CRPACKBLOCKSTATE_OP_BEGIN           0x01
+#define CRPACKBLOCKSTATE_OP_NEWLIST         0x02
+#define CRPACKBLOCKSTATE_OP_BEGINQUERY      0x04
+#define CRPACKBLOCKSTATE_OP_ALL             0x07
+
+#define CRPACKBLOCKSTATE_IS_OP_STARTED(_state, _op)      (!!((_state) & (_op)))
+
+#define CRPACKBLOCKSTATE_IS_STARTED(_state)      (!!(_state))
+
+#define CRPACKBLOCKSTATE_OP_START(_state, _op)      do { \
+            Assert(!CRPACKBLOCKSTATE_IS_OP_STARTED(_state, _op)); \
+            (_state) |= (_op); \
+        } while (0)
+
+#define CRPACKBLOCKSTATE_OP_STOP(_state, _op)      do { \
+            Assert(CRPACKBLOCKSTATE_IS_OP_STARTED(_state, _op)); \
+            (_state) &= ~(_op); \
+        } while (0)
+
 /**
  * Packer context
  */
@@ -67,7 +80,7 @@ struct CRPackContext_t
     CRPackSendHugeFunc SendHuge;
     CRPackErrorHandlerFunc Error;
     CRCurrentStatePointers current;
-    CRPackBeginEndState enmBeginEndState;
+    uint32_t u32CmdBlockState;
     GLvectorf bounds_min, bounds_max;
     int updateBBOX;
     int swapping;
@@ -95,6 +108,7 @@ extern DLLDATA(CRPackContext) cr_packer_globals;
 #  define CR_LOCK_PACKER_CONTEXT(PC)
 #  define CR_UNLOCK_PACKER_CONTEXT(PC)
 # endif
+extern int cr_packer_cmd_blocks_enabled;
 #else /* if defined IN_RING0 */
 # define CR_PACKER_CONTEXT_ARGSINGLEDECL CRPackContext *_pCtx
 # define CR_PACKER_CONTEXT_ARGDECL CR_PACKER_CONTEXT_ARGSINGLEDECL,
@@ -122,6 +136,7 @@ extern DECLEXPORT(void) crPackInitBuffer( CRPackBuffer *buffer, void *buf, int s
         , unsigned int num_opcodes
 #endif
         );
+
 extern DECLEXPORT(void) crPackFlushFunc( CRPackContext *pc, CRPackFlushFunc ff );
 extern DECLEXPORT(void) crPackFlushArg( CRPackContext *pc, void *flush_arg );
 extern DECLEXPORT(void) crPackSendHugeFunc( CRPackContext *pc, CRPackSendHugeFunc shf );
@@ -154,26 +169,28 @@ extern DECLEXPORT(void) crHugePacket( CR_PACKER_CONTEXT_ARGDECL CROpcode op, voi
 extern DECLEXPORT(void) crPackFree( CR_PACKER_CONTEXT_ARGDECL void *ptr );
 extern DECLEXPORT(void) crNetworkPointerWrite( CRNetworkPointer *, void * );
 
-extern DECLEXPORT(void) crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c);
-extern DECLEXPORT(void) crPackExpandDrawArraysSWAP(GLenum mode, GLint first, GLsizei count, CRClientState *c);
+extern DECLEXPORT(void) crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c, const GLfloat *pZva);
+extern DECLEXPORT(void) crPackExpandDrawArraysSWAP(GLenum mode, GLint first, GLsizei count, CRClientState *c, const GLfloat *pZva);
 
 extern DECLEXPORT(void) crPackUnrollDrawElements(GLsizei count, GLenum type, const GLvoid *indices);
 extern DECLEXPORT(void) crPackUnrollDrawElementsSWAP(GLsizei count, GLenum type, const GLvoid *indices);
 
-extern DECLEXPORT(void) crPackExpandDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c);
-extern DECLEXPORT(void) crPackExpandDrawElementsSWAP(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c);
+extern DECLEXPORT(void) crPackExpandDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c, const GLfloat *pZva);
+extern DECLEXPORT(void) crPackExpandDrawElementsSWAP(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c, const GLfloat *pZva);
 
-extern DECLEXPORT(void) crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c);
-extern DECLEXPORT(void) crPackExpandDrawRangeElementsSWAP(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c);
+extern DECLEXPORT(void) crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c, const GLfloat *pZva);
+extern DECLEXPORT(void) crPackExpandDrawRangeElementsSWAP(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c, const GLfloat *pZva);
 
-extern DECLEXPORT(void) crPackExpandArrayElement(GLint index, CRClientState *c);
-extern DECLEXPORT(void) crPackExpandArrayElementSWAP(GLint index, CRClientState *c);
+extern DECLEXPORT(void) crPackExpandArrayElement(GLint index, CRClientState *c, const GLfloat *pZva);
+extern DECLEXPORT(void) crPackExpandArrayElementSWAP(GLint index, CRClientState *c, const GLfloat *pZva);
 
-extern DECLEXPORT(void) crPackExpandMultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount, CRClientState *c );
-extern DECLEXPORT(void) crPackExpandMultiDrawArraysEXTSWAP( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount, CRClientState *c );
+extern DECLEXPORT(void) crPackExpandMultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount, CRClientState *c, const GLfloat *pZva );
+extern DECLEXPORT(void) crPackExpandMultiDrawArraysEXTSWAP( GLenum mode, GLint *first, GLsizei *count, GLsizei primcount, CRClientState *c, const GLfloat *pZva );
 
-extern DECLEXPORT(void) crPackExpandMultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount, CRClientState *c );
-extern DECLEXPORT(void) crPackExpandMultiDrawElementsEXTSWAP( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount, CRClientState *c );
+extern DECLEXPORT(void) crPackExpandMultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount, CRClientState *c, const GLfloat *pZva );
+extern DECLEXPORT(void) crPackExpandMultiDrawElementsEXTSWAP( GLenum mode, const GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount, CRClientState *c, const GLfloat *pZva );
+
+extern DECLEXPORT(void) crPackCmdBlocksEnable();
 
 
 /**
@@ -186,6 +203,10 @@ crPackNumOpcodes(const CRPackBuffer *buffer)
     return buffer->opcode_start - buffer->opcode_current;
 }
 
+DECLINLINE(bool) crPackBufferIsEmpty(CRPackBuffer *buffer)
+{
+    return crPackNumOpcodes(buffer) == 0;
+}
 
 /**
  * Return amount of data (in bytes) in buffer.
@@ -216,6 +237,74 @@ crPackCanHoldOpcode(const CRPackContext *pc, int num_opcode, int num_data)
 }
 
 
+#define CR_PACK_SPECIAL_OP( _pc, _op)                               \
+  do {                                                              \
+    data_ptr = pc->buffer.data_current;                             \
+    (_pc)->buffer.data_current += 4;                                \
+    WRITE_OPCODE( (_pc), (_op) );                                   \
+    WRITE_DATA( 0, GLuint, 0xdeadbeef );                            \
+    data_ptr = NULL; /* <- sanity*/                                 \
+  } while (0)
+
+#define CR_CMDBLOCK_OP( _pc, _op)                                   \
+  do {                                                              \
+      CR_PACK_SPECIAL_OP( _pc, _op);                                \
+  } while (0)
+
+
+#define CR_CMDBLOCK_BEGIN( pc, op )                                 \
+  do {                                                              \
+    CR_LOCK_PACKER_CONTEXT(pc);                                     \
+    if (!cr_packer_cmd_blocks_enabled) break;                       \
+    if (!CRPACKBLOCKSTATE_IS_STARTED(pc->u32CmdBlockState)) {       \
+      THREADASSERT( pc );                                           \
+      CRASSERT( pc->currentBuffer );                                \
+      if (!crPackBufferIsEmpty(&pc->buffer)) {                      \
+        if ((*pc->buffer.opcode_start) != CR_NOP_OPCODE) {          \
+          pc->Flush( pc->flush_arg );                               \
+          Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                 \
+          CR_CMDBLOCK_OP( pc, CR_CMDBLOCKBEGIN_OPCODE );            \
+        }                                                           \
+        else {                                                      \
+          (*pc->buffer.opcode_start) = CR_CMDBLOCKBEGIN_OPCODE;     \
+        }                                                           \
+      }                                                             \
+      else {                                                        \
+        Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                   \
+        CR_CMDBLOCK_OP( pc, CR_CMDBLOCKBEGIN_OPCODE );              \
+      }                                                             \
+    }                                                               \
+    CRPACKBLOCKSTATE_OP_START(pc->u32CmdBlockState, op);            \
+  } while (0)
+
+#define CR_CMDBLOCK_END( pc, op )                                   \
+  do {                                                              \
+    if (!cr_packer_cmd_blocks_enabled) break;                       \
+    CRPACKBLOCKSTATE_OP_STOP(pc->u32CmdBlockState, op);             \
+    if (!CRPACKBLOCKSTATE_IS_STARTED(pc->u32CmdBlockState)) {       \
+      THREADASSERT( pc );                                           \
+      CRASSERT( pc->currentBuffer );                                \
+      if (!crPackBufferIsEmpty(&pc->buffer)) {                      \
+        if ((*pc->buffer.opcode_start) != CR_CMDBLOCKBEGIN_OPCODE) {\
+          if ( !crPackCanHoldOpcode( pc, 1, 4 ) ) {                 \
+            pc->Flush( pc->flush_arg );                             \
+            Assert(crPackCanHoldOpcode( pc, 1, 4 ) );               \
+          }                                                         \
+          CR_CMDBLOCK_OP( pc, CR_CMDBLOCKEND_OPCODE );              \
+          pc->Flush( pc->flush_arg );                               \
+        }                                                           \
+        else {                                                      \
+          (*pc->buffer.opcode_start) = CR_NOP_OPCODE;               \
+        }                                                           \
+      }                                                             \
+      else {                                                        \
+        Assert(crPackCanHoldOpcode( pc, 1, 4 ) );                   \
+        CR_CMDBLOCK_OP( pc, CR_CMDBLOCKEND_OPCODE );                \
+        pc->Flush( pc->flush_arg );                                 \
+      }                                                             \
+    }                                                               \
+  } while (0)
+
 /**
  * Alloc space for a message of 'len' bytes (plus 1 opcode).
  * Only flush if buffer is full.
@@ -228,15 +317,11 @@ crPackCanHoldOpcode(const CRPackContext *pc, int num_opcode, int num_data)
     if ( !crPackCanHoldOpcode( pc, 1, (len) ) ) {                   \
       pc->Flush( pc->flush_arg );                                   \
       CRASSERT(crPackCanHoldOpcode( pc, 1, (len) ) );               \
-      if (pc->enmBeginEndState == CRPackBeginEndStateStarted) {     \
-        pc->enmBeginEndState = CRPackBeginEndStateFlushDone;        \
-      }                                                             \
     }                                                               \
     data_ptr = pc->buffer.data_current;                             \
     pc->buffer.data_current += (len);                               \
   } while (0)
 
-
 /**
  * As above, flush if the buffer contains vertex data and we're
  * no longer inside glBegin/glEnd.
@@ -278,9 +363,6 @@ crPackCanHoldOpcode(const CRPackContext *pc, int num_opcode, int num_data)
     if ( !crPackCanHoldOpcode( pc, 1, (len) ) ) {       \
       pc->Flush( pc->flush_arg );                       \
       CRASSERT( crPackCanHoldOpcode( pc, 1, (len) ) );  \
-      if (pc->enmBeginEndState == CRPackBeginEndStateStarted) {     \
-        pc->enmBeginEndState = CRPackBeginEndStateFlushDone;        \
-      }                                                             \
     }                                                   \
     data_ptr = pc->buffer.data_current;                 \
     pc->current.vtx_count++;                            \
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_protocol.h b/src/VBox/GuestHost/OpenGL/include/cr_protocol.h
index e2752c9..7ef2dab 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_protocol.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_protocol.h
@@ -17,6 +17,17 @@
 extern "C" {
 #endif
 
+#define CR_CMDVBVA_VERSION              1
+
+#pragma pack(1)
+typedef struct CR_CAPS_INFO
+{
+    uint32_t u32Caps;
+    uint32_t u32CmdVbvaVersion;
+} CR_CAPS_INFO;
+#pragma pack()
+
+
 /*For now guest is allowed to connect host opengl service if protocol version matches exactly*/
 /*Note: that after any change to this file, or glapi_parser\apispec.txt version should be changed*/
 #define CR_PROTOCOL_VERSION_MAJOR 9
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_server.h b/src/VBox/GuestHost/OpenGL/include/cr_server.h
index b215d4c..4d477ab 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_server.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_server.h
@@ -14,6 +14,7 @@
 #include "cr_glstate.h"
 #include "cr_vreg.h"
 #include "cr_blitter.h"
+#include "cr_htable.h"
 #include "spu_dispatch_table.h"
 #include "cr_dump.h"
 
@@ -353,10 +354,13 @@ typedef struct {
     CRScreenViewportInfo screenVieport[CR_MAX_GUEST_MONITORS];
     int          screenCount;
 
+    GLboolean fCrCmdEnabled;
+
     int numClients;
     CRClient *clients[CR_MAX_CLIENTS];  /**< array [numClients] */
     CRClient *curClient;
     CRClientNode *pCleanupClient;  /*list of clients with pending clean up*/
+    CRHTABLE clientTable;
     CRCurrentStatePointers current;
 
     GLboolean firstCallCreateContext;
@@ -409,6 +413,8 @@ typedef struct {
 
     CR_SERVER_RPW RpwWorker;
 
+    VBOXCRCMDCTL_HGCMDISABLE_DATA DisableData;
+
     /** configuration options */
     /*@{*/
     int useL2;
@@ -513,7 +519,8 @@ extern DECLEXPORT(void) crVBoxServerRemoveClient(uint32_t u32ClientID);
 extern DECLEXPORT(int32_t) crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer);
 extern DECLEXPORT(int32_t) crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t *pcbBuffer);
 extern DECLEXPORT(int32_t) crVBoxServerClientSetVersion(uint32_t u32ClientID, uint32_t vMajor, uint32_t vMinor);
-extern DECLEXPORT(int32_t) crVBoxServerClientGetCaps(uint32_t u32ClientID, uint32_t *pu32Caps);
+extern DECLEXPORT(int32_t) crVBoxServerClientGetCapsLegacy(uint32_t u32ClientID, uint32_t *pu32Caps);
+extern DECLEXPORT(int32_t) crVBoxServerClientGetCapsNew(uint32_t u32ClientID, CR_CAPS_INFO *pInfo);
 extern DECLEXPORT(int32_t) crVBoxServerClientSetPID(uint32_t u32ClientID, uint64_t pid);
 
 extern DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM);
@@ -568,8 +575,8 @@ extern DECLEXPORT(int32_t) crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CT
 
 #endif
 
-extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd);
-extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable();
+extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData);
+extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData);
 
 extern int crVBoxServerHostCtl(VBOXCRCMDCTL *pCtl, uint32_t cbCtl);
 
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_string.h b/src/VBox/GuestHost/OpenGL/include/cr_string.h
index 972d08f..824d9f6 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_string.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_string.h
@@ -8,6 +8,7 @@
 #define CR_STRING_H
 
 #include <iprt/cdefs.h>
+#include <iprt/types.h>
 
 RT_C_DECLS_BEGIN
 
@@ -60,6 +61,7 @@ DECLEXPORT(void)    crWordsToString( char *string, int nstring, void *data, int
 #define CR_GLVERSION_GET_BUILD(_val) CR_GLVERSION_GET_EL((_val), BUILD)
 
 DECLEXPORT(int) crStrParseGlVersion(const char * ver);
+DECLEXPORT(int32_t) crStrParseI32(const char *pszStr, const int32_t defaultVal);
 RT_C_DECLS_END
 
 #endif /* CR_STRING_H */
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_unpack.h b/src/VBox/GuestHost/OpenGL/include/cr_unpack.h
index 1d22558..d0d2a86 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_unpack.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_unpack.h
@@ -11,6 +11,7 @@
 #include "cr_spu.h"
 #include "cr_protocol.h"
 #include "cr_mem.h"
+#include "cr_opcodes.h"
 
 #include <iprt/types.h>
 
@@ -28,6 +29,15 @@ DECLEXPORT(void) crUnpack( const void *data, const void *opcodes, unsigned int n
 DECLEXPORT(void) crUnpackPush(void);
 DECLEXPORT(void) crUnpackPop(void);
 
+typedef enum
+{
+    CR_UNPACK_BUFFER_TYPE_GENERIC = 0,
+    CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN,
+    CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END
+} CR_UNPACK_BUFFER_TYPE;
+
+DECLEXPORT(CR_UNPACK_BUFFER_TYPE) crUnpackGetBufferType(const void *opcodes, unsigned int num_opcodes);
+
 extern CRNetworkPointer * return_ptr;
 extern CRNetworkPointer * writeback_ptr;
 
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_version.h b/src/VBox/GuestHost/OpenGL/include/cr_version.h
index 6b6a7c5..f4b85b6 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_version.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_version.h
@@ -40,7 +40,11 @@
 #define SHCROGL_SSM_VERSION_WITH_ALLOCATED_KEYS                     41
 #define SHCROGL_SSM_VERSION_WITH_FB_INFO                            42
 #define SHCROGL_SSM_VERSION_WITH_BUGGY_KEYS                         42
-#define SHCROGL_SSM_VERSION                                         43
+#define SHCROGL_SSM_VERSION_CRCMD                                   44
+#define SHCROGL_SSM_VERSION_WITH_SCREEN_MAP                         45
+#define SHCROGL_SSM_VERSION_WITH_SCREEN_MAP_REORDERED               46
+#define SHCROGL_SSM_VERSION_WITH_PEND_CMD_INFO                      47
+#define SHCROGL_SSM_VERSION                                         47
 
 /* These define the Chromium release number.
  * Alpha Release = 0.1.0, Beta Release = 0.2.0
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_vreg.h b/src/VBox/GuestHost/OpenGL/include/cr_vreg.h
index 0f5786b..9d60caa 100644
--- a/src/VBox/GuestHost/OpenGL/include/cr_vreg.h
+++ b/src/VBox/GuestHost/OpenGL/include/cr_vreg.h
@@ -87,6 +87,9 @@ DECLINLINE(void) VBoxRectIntersect(PRTRECT pRect1, const RTRECT * pRect2)
     pRect1->yTop = RT_MAX(pRect1->yTop, pRect2->yTop);
     pRect1->xRight = RT_MIN(pRect1->xRight, pRect2->xRight);
     pRect1->yBottom = RT_MIN(pRect1->yBottom, pRect2->yBottom);
+    /* ensure the rect is valid */
+    pRect1->xRight = RT_MAX(pRect1->xRight, pRect1->xLeft);
+    pRect1->yBottom = RT_MAX(pRect1->yBottom, pRect1->yTop);
 }
 
 DECLINLINE(void) VBoxRectIntersected(const RTRECT *pRect1, const RTRECT * pRect2, RTRECT *pResult)
diff --git a/src/VBox/GuestHost/OpenGL/include/state/cr_current.h b/src/VBox/GuestHost/OpenGL/include/state/cr_current.h
index b222027..d4a0570 100644
--- a/src/VBox/GuestHost/OpenGL/include/state/cr_current.h
+++ b/src/VBox/GuestHost/OpenGL/include/state/cr_current.h
@@ -89,6 +89,8 @@ DECLEXPORT(void) crStateCurrentInit( CRContext *ctx );
 
 DECLEXPORT(void) crStateCurrentRecover( void );
 
+DECLEXPORT(void) crStateCurrentRecoverNew(CRContext *g, CRCurrentStatePointers  *current);
+
 DECLEXPORT(void) crStateCurrentDiff(CRCurrentBits *bb, CRbitvalue *bitID,
                                     CRContext *fromCtx, CRContext *toCtx);
 DECLEXPORT(void) crStateCurrentSwitch(CRCurrentBits *bb, CRbitvalue *bitID,
@@ -96,6 +98,8 @@ DECLEXPORT(void) crStateCurrentSwitch(CRCurrentBits *bb, CRbitvalue *bitID,
 
 DECLEXPORT(void) crStateRasterPosUpdate(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
 
+DECLEXPORT(GLuint) crStateNeedDummyZeroVertexArray(CRContext *g, CRCurrentStatePointers  *current, GLfloat *pZva);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/VBox/GuestHost/OpenGL/packer/opcodes.py b/src/VBox/GuestHost/OpenGL/packer/opcodes.py
index f359d21..d7c8c92 100644
--- a/src/VBox/GuestHost/OpenGL/packer/opcodes.py
+++ b/src/VBox/GuestHost/OpenGL/packer/opcodes.py
@@ -33,7 +33,13 @@ for func in keys:
 		print "\t%s = %d," % ( apiutil.OpcodeName(func), enum_index )
 		enum_index = enum_index + 1
 
-if enum_index > 255:
+print "\tCR_EXTEND_OPCODE=%d," % enum_index
+enum_index = enum_index + 1
+print "\tCR_CMDBLOCKBEGIN_OPCODE=%d," % enum_index
+enum_index = enum_index + 1
+print "\tCR_CMDBLOCKEND_OPCODE=%d," % enum_index
+print "\tCR_NOP_OPCODE=255"
+if enum_index > 254:
 	# This would have saved Mike some grief if it had been here earlier.
 	print >> sys.stderr, "You have more than 255 opcodes!  You've been adding functions to"
 	print >> sys.stderr, "glapi_parser/APIspec!  Each new function you add"
@@ -45,7 +51,6 @@ if enum_index > 255:
 	print >> sys.stderr, "this even if you're doing a 'make -k.'"
 	print "#error -- more than 255 opcodes!"
 	sys.exit(-1)
-print "\tCR_EXTEND_OPCODE=%d" % enum_index
 print "} CROpcode;\n"
 
 # count up number of extended opcode commands
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_beginend.c b/src/VBox/GuestHost/OpenGL/packer/pack_beginend.c
index 2beec94..5fc0b35 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_beginend.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_beginend.c
@@ -12,6 +12,9 @@ void PACK_APIENTRY crPackBegin( GLenum mode )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     (void) pc;
+
+    CR_CMDBLOCK_BEGIN( pc, CRPACKBLOCKSTATE_OP_BEGIN );
+#ifndef VBOX
     if (pc->buffer.canBarf)
     {
         if (!pc->buffer.holds_BeginEnd)
@@ -19,9 +22,8 @@ void PACK_APIENTRY crPackBegin( GLenum mode )
         pc->buffer.in_BeginEnd = 1;
         pc->buffer.holds_BeginEnd = 1;
     }
-    CR_GET_BUFFERED_POINTER( pc, 4 );
-    CRASSERT(pc->enmBeginEndState == CRPackBeginEndStateNone);
-    pc->enmBeginEndState = CRPackBeginEndStateStarted;
+#endif
+    CR_GET_BUFFERED_POINTER_NO_BEGINEND_FLUSH(pc, 4, GL_FALSE);
     pc->current.begin_data = data_ptr;
     pc->current.begin_op = pc->buffer.opcode_current;
     pc->current.attribsUsedMask = 0;
@@ -35,6 +37,7 @@ void PACK_APIENTRY crPackBeginSWAP( GLenum mode )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     (void) pc;
+#ifndef VBOX
     if (pc->buffer.canBarf)
     {
         if (!pc->buffer.holds_BeginEnd)
@@ -42,9 +45,8 @@ void PACK_APIENTRY crPackBeginSWAP( GLenum mode )
         pc->buffer.in_BeginEnd = 1;
         pc->buffer.holds_BeginEnd = 1;
     }
-    CR_GET_BUFFERED_POINTER( pc, 4 );
-    CRASSERT(pc->enmBeginEndState == CRPackBeginEndStateNone);
-    pc->enmBeginEndState = CRPackBeginEndStateStarted;
+#endif
+    CR_GET_BUFFERED_POINTER_NO_BEGINEND_FLUSH(pc, 4, GL_FALSE);
     pc->current.begin_data = data_ptr;
     pc->current.begin_op = pc->buffer.opcode_current;
     pc->current.attribsUsedMask = 0;
@@ -61,13 +63,7 @@ void PACK_APIENTRY crPackEnd( void )
     CR_GET_BUFFERED_POINTER_NO_ARGS( pc );
     WRITE_OPCODE( pc, CR_END_OPCODE );
     pc->buffer.in_BeginEnd = 0;
-    CRASSERT(pc->enmBeginEndState == CRPackBeginEndStateStarted
-            || pc->enmBeginEndState == CRPackBeginEndStateFlushDone);
-    if (pc->enmBeginEndState == CRPackBeginEndStateFlushDone)
-    {
-        pc->Flush( pc->flush_arg );
-    }
-    pc->enmBeginEndState = CRPackBeginEndStateNone;
+    CR_CMDBLOCK_END( pc, CRPACKBLOCKSTATE_OP_BEGIN );
     CR_UNLOCK_PACKER_CONTEXT(pc);
 }
 
@@ -79,12 +75,7 @@ void PACK_APIENTRY crPackEndSWAP( void )
     CR_GET_BUFFERED_POINTER_NO_ARGS( pc );
     WRITE_OPCODE( pc, CR_END_OPCODE );
     pc->buffer.in_BeginEnd = 0;
-    CRASSERT(pc->enmBeginEndState == CRPackBeginEndStateStarted
-            || pc->enmBeginEndState == CRPackBeginEndStateFlushDone);
-    if (pc->enmBeginEndState == CRPackBeginEndStateFlushDone)
-    {
-        pc->Flush( pc->flush_arg );
-    }
+    CR_CMDBLOCK_END( pc, CRPACKBLOCKSTATE_OP_BEGIN );
     CR_UNLOCK_PACKER_CONTEXT(pc);
 }
 
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_client.c b/src/VBox/GuestHost/OpenGL/packer/pack_client.c
index 01e67f6..b3fbcb2 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_client.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_client.c
@@ -27,9 +27,15 @@ static void crPackVertexAttrib(const CRVertexArrays *array, unsigned int attr, G
 {
     unsigned char *p = array->a[attr].p + index * array->a[attr].stride;
 
+#ifdef DEBUG_misha
+    Assert(index >= 0);
+#endif
+
 #ifdef CR_ARB_vertex_buffer_object
     if (array->a[attr].buffer && array->a[attr].buffer->data)
     {
+        Assert(((GLuint)p) < array->a[attr].buffer->size);
+        Assert(((GLint)p) >= 0);
         p = (unsigned char *)(array->a[attr].buffer->data) + (unsigned long)p;
     }
 #endif
@@ -297,7 +303,7 @@ static void crPackVertexAttrib(const CRVertexArrays *array, unsigned int attr, G
  * Expand glArrayElement into crPackVertex/Color/Normal/etc.
  */
 void
-crPackExpandArrayElement(GLint index, CRClientState *c)
+crPackExpandArrayElement(GLint index, CRClientState *c, const GLfloat *pZva)
 {
     unsigned char *p;
     unsigned int unit, attr;
@@ -560,6 +566,10 @@ crPackExpandArrayElement(GLint index, CRClientState *c)
     {
         crPackVertexAttrib(array, VERT_ATTRIB_POS, index);
     }
+    else if (pZva)
+    {
+        crPackVertexAttrib4fvARB(VERT_ATTRIB_POS, pZva);
+    }
     else if (array->v.enabled)
     {
         p = array->v.p + index * array->v.stride;
@@ -612,7 +622,7 @@ crPackExpandArrayElement(GLint index, CRClientState *c)
 
 
 void
-crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c)
+crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c, const GLfloat *pZva)
 {
     int i;
 
@@ -631,7 +641,7 @@ crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c
     crPackBegin(mode);
     for (i=0; i<count; i++)
     {
-        crPackExpandArrayElement(first + i, c);
+        crPackExpandArrayElement(first + i, c, pZva);
     }
     crPackEnd();
 }
@@ -752,7 +762,7 @@ crPackDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
  */
 void
 crPackExpandDrawElements(GLenum mode, GLsizei count, GLenum type,
-                                                 const GLvoid *indices, CRClientState *c)
+                                                 const GLvoid *indices, CRClientState *c, const GLfloat *pZva)
 {
     int i;
     GLubyte *p = (GLubyte *)indices;
@@ -800,20 +810,20 @@ crPackExpandDrawElements(GLenum mode, GLsizei count, GLenum type,
         case GL_UNSIGNED_BYTE:
             for (i=0; i<count; i++)
             {
-                crPackExpandArrayElement((GLint) *p++, c);
+                crPackExpandArrayElement((GLint) *p++, c, pZva);
             }
             break;
         case GL_UNSIGNED_SHORT:
             for (i=0; i<count; i++)
             {
-                crPackExpandArrayElement((GLint) * (GLushort *) p, c);
+                crPackExpandArrayElement((GLint) * (GLushort *) p, c, pZva);
                 p+=sizeof (GLushort);
             }
             break;
         case GL_UNSIGNED_INT:
             for (i=0; i<count; i++)
             {
-                crPackExpandArrayElement((GLint) * (GLuint *) p, c);
+                crPackExpandArrayElement((GLint) * (GLuint *) p, c, pZva);
                 p+=sizeof (GLuint);
             }
             break;
@@ -871,7 +881,7 @@ crPackUnrollDrawElements(GLsizei count, GLenum type,
  * glDrawRangeElements, expanded into crPackBegin/Vertex/End/etc.
  */
 void
-crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c)
+crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CRClientState *c, const GLfloat *pZva)
 {
     if (start>end)
     {
@@ -879,7 +889,7 @@ crPackExpandDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei cou
         return;
     }
 
-    crPackExpandDrawElements(mode, count, type, indices, c);
+    crPackExpandDrawElements(mode, count, type, indices, c, pZva);
 }
 
 
@@ -905,12 +915,12 @@ crPackMultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count,
  */
 void
 crPackExpandMultiDrawArraysEXT( GLenum mode, GLint *first, GLsizei *count,
-                                                                GLsizei primcount, CRClientState *c )
+                                                                GLsizei primcount, CRClientState *c, const GLfloat *pZva )
 {
    GLint i;
    for (i = 0; i < primcount; i++) {
       if (count[i] > 0) {
-         crPackExpandDrawArrays(mode, first[i], count[i], c);
+         crPackExpandDrawArrays(mode, first[i], count[i], c, pZva);
       }
    }
 }
@@ -938,12 +948,12 @@ crPackMultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
 void
 crPackExpandMultiDrawElementsEXT( GLenum mode, const GLsizei *count,
                                   GLenum type, const GLvoid **indices,
-                                  GLsizei primcount, CRClientState *c )
+                                  GLsizei primcount, CRClientState *c, const GLfloat *pZva )
 {
    GLint i;
    for (i = 0; i < primcount; i++) {
       if (count[i] > 0) {
-         crPackExpandDrawElements(mode, count[i], type, indices[i], c);
+         crPackExpandDrawElements(mode, count[i], type, indices[i], c, pZva);
       }
    }
 }
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py b/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py
index 010e8de..aeaa189 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py
@@ -56,7 +56,7 @@ print """
 	unsigned int vtx_max;
 	unsigned int vtx_count_begin;
 	unsigned int attribsUsedMask;
-
+    unsigned int changedVertexAttrib;
 } CRCurrentStatePointers;
 
 #endif /* CR_CURRENT_H */
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.py b/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.py
index a07dfeb..5e02dc8 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.py
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_currenttypes.py
@@ -58,6 +58,16 @@ current_fns = {
 	},
 }
 
+current_fns_new = {
+    'VertexAttrib': {
+        'types': ['s','f','d','b','i','ub','ui','us','Nub','Nus','Nui','Nb','Ns','Ni'],
+        'sizes': [1,2,3,4],
+        'default': [0,0,0,1],
+        'members': ['x', 'y', 'z', 'w'],
+        'array': 'CR_MAX_VERTEX_ATTRIBS'
+    },
+}
+
 current_vtx = {
 	'Vertex': {
 		'types': ['s','i','f','d'],
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_init.c b/src/VBox/GuestHost/OpenGL/packer/pack_init.c
index df45f42..15c80e3 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_init.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_init.c
@@ -17,6 +17,8 @@ int _PackerTSD;         /* dummy - for the sake of packer.def */  /* drm1 */
 DLLDATA(CRPackContext) cr_packer_globals;
 #endif
 
+int cr_packer_cmd_blocks_enabled = 0;
+
 CRPackContext *crPackNewContext( int swapping )
 {
 #ifdef CHROMIUM_THREADSAFE
@@ -28,7 +30,7 @@ CRPackContext *crPackNewContext( int swapping )
     GET_PACKER_CONTEXT(pc);
         crMemZero( pc, sizeof(CRPackContext));
 #endif
-    pc->enmBeginEndState = CRPackBeginEndStateNone;
+    pc->u32CmdBlockState = 0;
     pc->swapping = swapping;
     pc->Flush = NULL;
     pc->SendHuge = NULL;
@@ -66,3 +68,7 @@ CRPackContext *crPackGetContext( void )
 #endif
 }
 
+void crPackCmdBlocksEnable()
+{
+    cr_packer_cmd_blocks_enabled = 1;
+}
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_lists.c b/src/VBox/GuestHost/OpenGL/packer/pack_lists.c
index 106a60a..2cf9ba5 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_lists.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_lists.c
@@ -58,14 +58,13 @@ void PACK_APIENTRY crPackCallLists(GLint n, GLenum type,
     crPackFree( data_ptr );
 }
 
-
-
 void PACK_APIENTRY crPackNewList( GLuint list, GLenum mode )
 {
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     (void) pc;
-    CR_GET_BUFFERED_POINTER( pc, 16 );
+    CR_CMDBLOCK_BEGIN( pc, CRPACKBLOCKSTATE_OP_NEWLIST );
+    CR_GET_BUFFERED_POINTER_NO_BEGINEND_FLUSH( pc, 16, GL_FALSE );
     WRITE_DATA( 0, GLint, 16 );
     WRITE_DATA( 4, GLenum, CR_NEWLIST_EXTEND_OPCODE );
     WRITE_DATA( 8, GLuint, list );
@@ -85,5 +84,6 @@ void PACK_APIENTRY crPackEndList( void )
     WRITE_DATA( 4, GLenum, CR_ENDLIST_EXTEND_OPCODE );
     WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     pc->buffer.in_List = GL_FALSE;
+    CR_CMDBLOCK_END( pc, CRPACKBLOCKSTATE_OP_NEWLIST );
     CR_UNLOCK_PACKER_CONTEXT(pc);
 }
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_misc.c b/src/VBox/GuestHost/OpenGL/packer/pack_misc.c
index ebc0e5b..17d643c 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_misc.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_misc.c
@@ -187,3 +187,30 @@ void PACK_APIENTRY crPackWindowSize( CR_PACKER_CONTEXT_ARGDECL GLint window, GLi
     WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     CR_UNLOCK_PACKER_CONTEXT(pc);
 }
+
+void PACK_APIENTRY crPackBeginQueryARB( CR_PACKER_CONTEXT_ARGDECL GLenum target, GLuint id )
+{
+    CR_GET_PACKER_CONTEXT(pc);
+    unsigned char *data_ptr;
+    (void) pc;
+    CR_GET_BUFFERED_POINTER( pc, 16 );
+    WRITE_DATA( 0, GLint, 16 );
+    WRITE_DATA( 4, GLenum, CR_BEGINQUERYARB_EXTEND_OPCODE );
+    WRITE_DATA( 8, GLenum, target );
+    WRITE_DATA( 12, GLuint, id );
+    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
+    CR_UNLOCK_PACKER_CONTEXT(pc);
+}
+
+void PACK_APIENTRY crPackEndQueryARB( CR_PACKER_CONTEXT_ARGDECL GLenum target )
+{
+    CR_GET_PACKER_CONTEXT(pc);
+    unsigned char *data_ptr;
+    (void) pc;
+    CR_GET_BUFFERED_POINTER( pc, 12 );
+    WRITE_DATA( 0, GLint, 12 );
+    WRITE_DATA( 4, GLenum, CR_ENDQUERYARB_EXTEND_OPCODE );
+    WRITE_DATA( 8, GLenum, target );
+    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
+    CR_UNLOCK_PACKER_CONTEXT(pc);
+}
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_program.c b/src/VBox/GuestHost/OpenGL/packer/pack_program.c
index 41449f8..8f77873 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_program.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_program.c
@@ -365,7 +365,7 @@ void PACK_APIENTRY crPackVertexAttrib4NbvARB( GLuint index, const GLbyte *v )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 8 );
-    pc->current.c.vertexAttrib.b4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.b4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLbyte, v[0] );
@@ -381,7 +381,7 @@ void PACK_APIENTRY crPackVertexAttrib4NivARB( GLuint index, const GLint *v )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 20 );
-    pc->current.c.vertexAttrib.i4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.i4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLint, v[0] );
@@ -397,7 +397,7 @@ void PACK_APIENTRY crPackVertexAttrib4NsvARB( GLuint index, const GLshort *v )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 12 );
-    pc->current.c.vertexAttrib.s4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.s4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLshort, v[0] );
@@ -413,7 +413,7 @@ void PACK_APIENTRY crPackVertexAttrib4NubvARB(GLuint index, const GLubyte * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 8 );
-    pc->current.c.vertexAttrib.ub4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.ub4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLubyte, v[0] );
@@ -429,7 +429,7 @@ void PACK_APIENTRY crPackVertexAttrib4NuivARB(GLuint index, const GLuint * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 20 );
-    pc->current.c.vertexAttrib.ui4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.ui4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLuint, v[0] );
@@ -445,7 +445,7 @@ void PACK_APIENTRY crPackVertexAttrib4NusvARB(GLuint index, const GLushort * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 12 );
-    pc->current.c.vertexAttrib.s4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.s4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLushort, v[0] );
@@ -461,7 +461,7 @@ void PACK_APIENTRY crPackVertexAttrib4bvARB(GLuint index, const GLbyte * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 8 );
-    pc->current.c.vertexAttrib.b4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.b4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLbyte, v[0] );
@@ -477,7 +477,7 @@ void PACK_APIENTRY crPackVertexAttrib4ivARB(GLuint index, const GLint * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 20 );
-    pc->current.c.vertexAttrib.i4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.i4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLint, v[0] );
@@ -493,7 +493,7 @@ void PACK_APIENTRY crPackVertexAttrib4uivARB(GLuint index, const GLuint * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 20 );
-    pc->current.c.vertexAttrib.ui4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.ui4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLuint, v[0] );
@@ -509,7 +509,7 @@ void PACK_APIENTRY crPackVertexAttrib4usvARB(GLuint index, const GLushort * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 12 );
-    pc->current.c.vertexAttrib.s4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.s4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLushort, v[0] );
@@ -526,7 +526,7 @@ void PACK_APIENTRY crPackVertexAttrib4ubvARB(GLuint index, const GLubyte * v)
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     CR_GET_BUFFERED_POINTER( pc, 8 );
-    pc->current.c.vertexAttrib.ub4[index] = data_ptr + 12;
+    pc->current.c.vertexAttrib.ub4[index] = data_ptr + 4;
     pc->current.attribsUsedMask |= (1 << index);
     WRITE_DATA( 0, GLuint, index );
     WRITE_DATA( 4, GLubyte, v[0] );
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_swap_lists.c b/src/VBox/GuestHost/OpenGL/packer/pack_swap_lists.c
index 6cd5eb2..aa99db5 100644
--- a/src/VBox/GuestHost/OpenGL/packer/pack_swap_lists.c
+++ b/src/VBox/GuestHost/OpenGL/packer/pack_swap_lists.c
@@ -89,7 +89,8 @@ void PACK_APIENTRY crPackNewListSWAP( GLuint list, GLenum mode )
     CR_GET_PACKER_CONTEXT(pc);
     unsigned char *data_ptr;
     (void) pc;
-    CR_GET_BUFFERED_POINTER( pc, 16 );
+    CR_CMDBLOCK_BEGIN( pc, CRPACKBLOCKSTATE_OP_NEWLIST );
+    CR_GET_BUFFERED_POINTER_NO_BEGINEND_FLUSH( pc, 16, GL_FALSE );
     WRITE_DATA( 0, GLint, SWAP32(16) );
     WRITE_DATA( 4, GLenum, SWAP32(CR_NEWLIST_EXTEND_OPCODE) );
     WRITE_DATA( 8, GLuint, SWAP32(list) );
@@ -111,5 +112,6 @@ void PACK_APIENTRY crPackEndListSWAP( void )
     WRITE_DATA( 4, GLenum, SWAP32(CR_ENDLIST_EXTEND_OPCODE) );
     WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     pc->buffer.in_List = GL_FALSE;
+    CR_CMDBLOCK_END( pc, CRPACKBLOCKSTATE_OP_NEWLIST );
     CR_UNLOCK_PACKER_CONTEXT(pc);
 }
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer.py b/src/VBox/GuestHost/OpenGL/packer/packer.py
index 386b6be..8c6f26b 100644
--- a/src/VBox/GuestHost/OpenGL/packer/packer.py
+++ b/src/VBox/GuestHost/OpenGL/packer/packer.py
@@ -103,9 +103,10 @@ def UpdateCurrentPointer( func_name ):
         name = 'vertexAttrib'
         type = m.group(3) + m.group(2)
         # Add 12 to skip the packet length, opcode and index fields
-        print "\tpc->current.c.%s.%s[index] = data_ptr + 12;" % (name,type)
+        print "\tpc->current.c.%s.%s[index] = data_ptr + 4;" % (name,type)
         if m.group(4) == "ARB" or m.group(4) == "NV":
             print "\tpc->current.attribsUsedMask |= (1 << index);"
+            print "\tpc->current.changedVertexAttrib |= (1 << index);"
         return
 
 
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer_special b/src/VBox/GuestHost/OpenGL/packer/packer_special
index a9491f0..42fe665 100644
--- a/src/VBox/GuestHost/OpenGL/packer/packer_special
+++ b/src/VBox/GuestHost/OpenGL/packer/packer_special
@@ -181,3 +181,5 @@ VBoxTexPresent
 WindowPosition
 WindowShow
 WindowSize
+BeginQueryARB
+EndQueryARB
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
index e02f3ab..a9cb734 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
@@ -1562,13 +1562,18 @@ static void crStateDumpClientPointer(CRClientPointer *cp, const char *name, int
   }
 }
 
+#ifdef DEBUG_misha
+/* debugging */
+//# define CR_NO_SERVER_ARRAYS
+#endif
+
 /*
  * Determine if the enabled arrays all live on the server
  * (via GL_ARB_vertex_buffer_object).
  */
 GLboolean crStateUseServerArrays(void)
 {
-#ifdef CR_ARB_vertex_buffer_object
+#if defined(CR_ARB_vertex_buffer_object) && !defined(CR_NO_SERVER_ARRAYS)
     CRContext *g = GetCurrentContext();
     CRClientState *c = &(g->client);
     int i;
@@ -1626,6 +1631,49 @@ GLboolean crStateUseServerArrays(void)
 #endif
 }
 
+GLuint crStateNeedDummyZeroVertexArray(CRContext *g, CRCurrentStatePointers *current, GLfloat *pZva)
+{
+#if defined(CR_ARB_vertex_buffer_object)
+    CRClientState *c = &(g->client);
+    int i;
+    GLuint zvMax = 0;
+
+    if (c->array.a[0].enabled)
+        return 0;
+
+    for (i = 1; (unsigned int)i < g->limits.maxVertexProgramAttribs; i++)
+    {
+        if (c->array.a[i].enabled)
+        {
+            if (c->array.a[i].buffer && c->array.a[i].buffer->id)
+            {
+                GLuint cElements = c->array.a[i].buffer->size / c->array.a[i].stride;
+                if (zvMax < cElements)
+                    zvMax = cElements;
+            }
+            else
+            {
+                zvMax = ~0;
+                break;
+            }
+        }
+    }
+
+    if (zvMax)
+    {
+        Assert(!c->array.v.enabled);
+
+        crStateCurrentRecoverNew(g, current);
+
+        crMemcpy(pZva, &g->current.vertexAttrib[0][0], sizeof (*pZva) * 4);
+    }
+
+    return zvMax;
+#else
+    return GL_FALSE;
+#endif
+}
+
 
 /**
  * Determine if there's a server-side array element buffer.
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.c
index 0da71df..a128ae6 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.c
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.c
@@ -110,17 +110,11 @@ void crStateSetCurrentPointers( CRContext *ctx, CRCurrentStatePointers *current
 
 void crStateResetCurrentPointers( CRCurrentStatePointers *current )
 {
-    crMemset(&(current->c.index), 0, sizeof(GLindex_p));
-    crMemset(&(current->c.vertexAttrib), 0, sizeof(GLvertexattrib_p));
-    crMemset(&(current->c.fogCoord), 0, sizeof(GLfogcoord_p));
-    crMemset(&(current->c.edgeFlag), 0, sizeof(GLedgeflag_p));
-    crMemset(&(current->c.normal), 0, sizeof(GLnormal_p));
-    crMemset(&(current->c.color), 0, sizeof(GLcolor_p));
-    crMemset(&(current->c.secondaryColor), 0, sizeof(GLsecondarycolor_p));
-    crMemset(&(current->c.texCoord), 0, sizeof(GLtexcoord_p));
-    /*
-    current->attribsUsedMask = 0;
-    */
+    uint32_t attribsUsedMask = current->attribsUsedMask;
+
+    crMemset(current, 0, sizeof (*current));
+
+    current->attribsUsedMask = attribsUsedMask;
 }
 
 void STATE_APIENTRY crStateBegin( GLenum mode )
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py
index 6fcf342..d118bcc 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py
@@ -286,3 +286,195 @@ for k in current_fns.keys():
 	if current_fns[k].has_key( 'array' ):
 		print '\t}'
 print '}'
+
+print '''
+
+void crStateCurrentRecoverNew(CRContext *g, CRCurrentStatePointers  *current)
+{
+    const unsigned char *v;
+    convert_func convert=NULL;
+    CRCurrentState *c = &(g->current);
+    CRStateBits *sb = GetCurrentBits();
+    CRCurrentBits *cb = &(sb->current);
+
+    static const GLfloat vertexAttrib_default[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+
+    GLvertexattrib_p *vertexAttrib = &(current->c.vertexAttrib);
+
+    unsigned int i;
+    CRbitvalue nbitID[CR_MAX_BITARRAY];
+
+
+    /* silence warnings */
+    (void) __convert_b1;
+    (void) __convert_b2;
+    (void) __convert_b3;
+    (void) __convert_b4;
+    (void) __convert_ui1;
+    (void) __convert_ui2;
+    (void) __convert_ui3;
+    (void) __convert_ui4;
+    (void) __convert_l1;
+    (void) __convert_l2;
+    (void) __convert_l3;
+    (void) __convert_l4;
+    (void) __convert_us1;
+    (void) __convert_us2;
+    (void) __convert_us3;
+    (void) __convert_us4;
+    (void) __convert_ub1;
+    (void) __convert_ub2;
+    (void) __convert_ub3;
+    (void) __convert_ub4;
+    (void) __convert_rescale_s1;
+    (void) __convert_rescale_s2;
+    (void) __convert_rescale_b1;
+    (void) __convert_rescale_b2;
+    (void) __convert_rescale_ui1;
+    (void) __convert_rescale_ui2;
+    (void) __convert_rescale_i1;
+    (void) __convert_rescale_i2;
+    (void) __convert_rescale_us1;
+    (void) __convert_rescale_us2;
+    (void) __convert_rescale_ub1;
+    (void) __convert_rescale_ub2;
+    (void) __convert_Ni1;
+    (void) __convert_Ni2;
+    (void) __convert_Ni3;
+    (void) __convert_Ni4;
+    (void) __convert_Nb1;
+    (void) __convert_Nb2;
+    (void) __convert_Nb3;
+    (void) __convert_Nb4;
+    (void) __convert_Nus1;
+    (void) __convert_Nus2;
+    (void) __convert_Nus3;
+    (void) __convert_Nus4;
+    (void) __convert_Nui1;
+    (void) __convert_Nui2;
+    (void) __convert_Nui3;
+    (void) __convert_Nui4;
+    (void) __convert_Ns1;
+    (void) __convert_Ns2;
+    (void) __convert_Ns3;
+    (void) __convert_Ns4;
+    (void) __convert_Nub1;
+    (void) __convert_Nub2;
+    (void) __convert_Nub3;
+    (void) __convert_Nub4;
+
+
+'''
+
+for k in current_fns_new.keys():
+    print '\t/* %s */' % k
+    print '\tif (current->changed%s)' % k
+    print '\t{'
+    print '\t\tv=NULL;'
+    name = '%s%s' % (k[:1].lower(),k[1:])
+
+    indent = ""
+    if current_fns_new[k].has_key( 'array' ):
+        print '\t\tfor (i = 0 ; i < %s ; i++)' % current_fns_new[k]['array']
+        print '\t\t{'
+        indent += "\t\t"
+        print '\t\tif (!(current->changed%s & (1 << i))) continue;' % k
+    for type in current_fns_new[k]['types']:
+        if type[0:1] == "N":
+            normalized = 1
+            type2 = type[1:]
+        else:
+            normalized = 0
+            type2 = type
+        for size in current_fns_new[k]['sizes']:
+            ptr = '%s->%s%d' % (name, type, size )
+            if current_fns_new[k].has_key( 'array' ):
+                ptr += "[i]"
+            print '#ifdef DEBUG_misha'
+            print '%s\tif (%s)' % (indent, ptr)
+            print '%s\t{' % (indent)
+            print '%s\t\tuint32_t *pTst = (uint32_t*)(%s);' % (indent, ptr)
+            print '%s\t\t--pTst;' % (indent)
+            print '%s\t\tAssert((*pTst) == i);' % (indent)
+            print '%s\t}' % (indent)
+            print '#endif'
+            print '%s\tif (v < %s)' % (indent, ptr)
+            print '%s\t{' % indent
+            print '%s\t\tv = %s;' % (indent, ptr)
+            if (k == 'Color' or k == 'Normal' or k == 'SecondaryColor' or normalized) and type != 'f' and type != 'd' and type != 'l':
+                print '%s\t\tconvert = (convert_func) __convert_rescale_%s%d;' % (indent,type,size)
+            else:
+                print '%s\t\tconvert = (convert_func) __convert_%s%d;' % (indent,type,size)
+            print '%s\t}' % indent
+    print ''
+    print '%s\tif (v != NULL) {' % indent
+    if current_fns_new[k].has_key( 'array' ):
+        if k == 'TexCoord':
+            print '%s\t\tCOPY_4V(c->vertexAttrib[VERT_ATTRIB_TEX0 + i], %s_default);' % (indent,name)
+        else:
+            print '%s\t\tCOPY_4V(c->%s[i], %s_default);' % (indent,name,name)
+    else:
+        if k == 'Normal':
+            print '%s\t\tCOPY_4V(c->vertexAttrib[VERT_ATTRIB_NORMAL], %s_default);' % (indent,name)
+        elif k == 'FogCoord':
+            print '%s\t\tc->vertexAttrib[VERT_ATTRIB_FOG][0] =  %s_default;' % (indent,name)
+        elif k == 'Color':
+            print '%s\t\tCOPY_4V(c->vertexAttrib[VERT_ATTRIB_COLOR0], %s_default);' % (indent,name)
+        elif k == 'SecondaryColor':
+            print '%s\t\tCOPY_4V(c->vertexAttrib[VERT_ATTRIB_COLOR1],  %s_default);' % (indent,name)
+        elif k == 'TexCoord':
+            print '%s\t\tCOPY_4V(c->vertexAttrib[VERT_ATTRIB_TEX0], %s_default);' % (indent,name)
+        elif k == 'Index':
+            print '%s\t\tc->colorIndex =  %s_default;' % (indent,name)
+        elif k == 'EdgeFlag':
+            print '%s\t\tc->edgeFlag =  %s_default;' % (indent,name)
+        else:
+            print '%s\t\tc->%s = %s_default;' % (indent,name,name)
+    if k == 'EdgeFlag':
+        print '%s\t\t__convert_boolean (&c->edgeFlag, v);' % (indent)
+        dirtyVar = 'cb->edgeFlag'
+    elif k == 'Normal':
+        print '%s\t\tconvert(&(c->vertexAttrib[VERT_ATTRIB_NORMAL][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[VERT_ATTRIB_NORMAL]'
+    elif k == 'TexCoord':
+        print '%s\t\tconvert(&(c->vertexAttrib[VERT_ATTRIB_TEX0 + i][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[VERT_ATTRIB_TEX0 + i]'
+    elif k == 'Color':
+        print '%s\t\tconvert(&(c->vertexAttrib[VERT_ATTRIB_COLOR0][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[VERT_ATTRIB_COLOR0]'
+    elif k == 'Index':
+        print '%s\t\tconvert(&(c->colorIndex), v);' % (indent)
+        dirtyVar = 'cb->colorIndex'
+    elif k == 'SecondaryColor':
+        print '%s\t\tconvert(&(c->vertexAttrib[VERT_ATTRIB_COLOR1][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[VERT_ATTRIB_COLOR1]'
+    elif k == 'FogCoord':
+        print '%s\t\tconvert(&(c->vertexAttrib[VERT_ATTRIB_FOG][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[VERT_ATTRIB_FOG]'
+    elif k == 'VertexAttrib':
+        print '%s\t\tconvert(&(c->vertexAttrib[i][0]), v);' % (indent)
+        dirtyVar = 'cb->vertexAttrib[i]'
+    else:
+        assert 0  # should never get here
+
+    print '%s\t\tDIRTY(%s, nbitID);' % (indent, dirtyVar)
+
+#   if current_fns_new[k].has_key( 'array' ):
+#       print '%s\t\tDIRTY(cb->%s[i], nbitID);' % (indent,name)
+#   else:
+#       print '%s\t\tDIRTY(cb->%s, nbitID);' % (indent,name)
+
+
+
+    print '%s\t\tDIRTY(cb->dirty, nbitID);' % indent
+    print '%s\t}' % indent
+    if current_fns_new[k].has_key( 'array' ):
+        print '%s\t%s->ptr[i] = v;' % (indent, name )
+    else:
+        print '%s\t%s->ptr = v;' % (indent, name )
+    if current_fns_new[k].has_key( 'array' ):
+        print '\t\t}'
+        print '\t\tcurrent->changed%s = 0;' % k
+        print '\t}'
+print '\tcrStateResetCurrentPointers(current);'
+print '}'
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
index 49bcd38..cfd19a1 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
@@ -9,6 +9,8 @@
 #include "cr_error.h"
 #include "cr_spu.h"
 
+#include <iprt/asm.h>
+
 #ifdef CHROMIUM_THREADSAFE
 static bool __isContextTLSInited = false;
 CRtsd __contextTSD;
@@ -109,9 +111,10 @@ static void ReleaseRBOCallback(unsigned long key, void *data1, void *data2)
 DECLEXPORT(void)
 crStateFreeShared(CRContext *pContext, CRSharedState *s)
 {
-    s->refCount--;
-    Assert(s->refCount >= 0);
-    if (s->refCount <= 0) {
+    int32_t refCount = ASMAtomicDecS32(&s->refCount);
+
+    Assert(refCount >= 0);
+    if (refCount <= 0) {
         if (s==gSharedState)
         {
             gSharedState = NULL;
@@ -143,7 +146,7 @@ DECLEXPORT(CRSharedState *) crStateGlobalSharedAcquire()
         crWarning("No Global Shared State!");
         return NULL;
     }
-    gSharedState->refCount++;
+    ASMAtomicIncS32(&gSharedState->refCount);
     return gSharedState;
 }
 
@@ -175,7 +178,7 @@ crStateShareContext(GLboolean value)
         {
             crStateFreeShared(pCtx, pCtx->shared);
             pCtx->shared = gSharedState;
-            gSharedState->refCount++;
+            ASMAtomicIncS32(&gSharedState->refCount);
         }
     }
     else
@@ -200,6 +203,22 @@ crStateShareContext(GLboolean value)
     }
 }
 
+DECLEXPORT(void) STATE_APIENTRY
+crStateShareLists(CRContext *pContext1, CRContext *pContext2)
+{
+    CRASSERT(pContext1->shared);
+    CRASSERT(pContext2->shared);
+
+    if (pContext2->shared == pContext1->shared)
+    {
+        return;
+    }
+
+    crStateFreeShared(pContext1, pContext1->shared);
+    pContext1->shared = pContext2->shared;
+    ASMAtomicIncS32(&pContext2->shared->refCount);
+}
+
 DECLEXPORT(GLboolean) STATE_APIENTRY
 crStateContextIsShared(CRContext *pCtx)
 {
@@ -270,7 +289,7 @@ crStateCreateContextId(int i, const CRLimitsState *limits,
     if (shareCtx) {
         CRASSERT(shareCtx->shared);
         ctx->shared = shareCtx->shared;
-        ctx->shared->refCount ++;
+        ASMAtomicIncS32(&ctx->shared->refCount);
     }
     else {
         ctx->shared = crStateAllocShared();
@@ -677,26 +696,37 @@ void crStateMakeCurrent( CRContext *ctx )
 /*
  * As above, but don't call crStateSwitchContext().
  */
-void crStateSetCurrent( CRContext *ctx )
+static void crStateSetCurrentEx( CRContext *ctx, GLboolean fCleanupDefault )
 {
     CRContext *current = GetCurrentContext();
 
-    if (ctx == NULL)
+    if (ctx == NULL && !fCleanupDefault)
         ctx = defaultContext;
 
     if (current == ctx)
         return; /* no-op */
 
-    CRASSERT(ctx);
-
 #ifdef CHROMIUM_THREADSAFE
     SetCurrentContext(ctx);
 #else
     __currentContext = ctx;
 #endif
 
-    /* ensure matrix state is also current */
-    crStateMatrixMode(ctx->transform.matrixMode);
+    if (ctx)
+    {
+        /* ensure matrix state is also current */
+        crStateMatrixMode(ctx->transform.matrixMode);
+    }
+}
+
+void crStateSetCurrent( CRContext *ctx )
+{
+    crStateSetCurrentEx( ctx, GL_FALSE );
+}
+
+void crStateCleanupCurrent()
+{
+    crStateSetCurrentEx( NULL, GL_TRUE );
 }
 
 
diff --git a/src/VBox/GuestHost/OpenGL/util/blitter.cpp b/src/VBox/GuestHost/OpenGL/util/blitter.cpp
index a14c091..cc41168 100644
--- a/src/VBox/GuestHost/OpenGL/util/blitter.cpp
+++ b/src/VBox/GuestHost/OpenGL/util/blitter.cpp
@@ -22,11 +22,242 @@
 #include "cr_rand.h"
 #include "cr_mem.h"
 #include "cr_string.h"
+#include "cr_bmpscale.h"
 
 #include <iprt/cdefs.h>
 #include <iprt/types.h>
 #include <iprt/mem.h>
 
+static void crMClrFillMem(uint32_t *pu32Dst, int32_t cbDstPitch, uint32_t width, uint32_t height, uint32_t u32Color)
+{
+    for (uint32_t i = 0; i < height; ++i)
+    {
+        for (uint32_t j = 0; j < width; ++j)
+        {
+            pu32Dst[j] = u32Color;
+        }
+
+        pu32Dst = (uint32_t*)(((uint8_t*)pu32Dst) + cbDstPitch);
+    }
+}
+
+void CrMClrFillImgRect(CR_BLITTER_IMG *pDst, const RTRECT *pCopyRect, uint32_t u32Color)
+{
+    int32_t x = pCopyRect->xLeft;
+    int32_t y = pCopyRect->yTop;
+    int32_t width = pCopyRect->xRight - pCopyRect->xLeft;
+    int32_t height = pCopyRect->yBottom - pCopyRect->yTop;
+    Assert(x >= 0);
+    Assert(y >= 0);
+    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * y + x * 4;
+
+    crMClrFillMem((uint32_t*)pu8Dst, pDst->pitch, width, height, u32Color);
+}
+
+void CrMClrFillImg(CR_BLITTER_IMG *pImg, uint32_t cRects, const RTRECT *pRects, uint32_t u32Color)
+{
+    RTRECT Rect;
+    Rect.xLeft = 0;
+    Rect.yTop = 0;
+    Rect.xRight = pImg->width;
+    Rect.yBottom = pImg->height;
+
+
+    RTRECT Intersection;
+    const RTPOINT ZeroPoint = {0, 0};
+
+    for (uint32_t i = 0; i < cRects; ++i)
+    {
+        const RTRECT * pRect = &pRects[i];
+        VBoxRectIntersected(pRect, &Rect, &Intersection);
+
+        if (VBoxRectIsZero(&Intersection))
+            continue;
+
+        CrMClrFillImgRect(pImg, &Intersection, u32Color);
+    }
+}
+
+static void crMBltMem(const uint8_t *pu8Src, int32_t cbSrcPitch, uint8_t *pu8Dst, int32_t cbDstPitch, uint32_t width, uint32_t height)
+{
+    uint32_t cbCopyRow = width * 4;
+
+    for (uint32_t i = 0; i < height; ++i)
+    {
+        memcpy(pu8Dst, pu8Src, cbCopyRow);
+
+        pu8Src += cbSrcPitch;
+        pu8Dst += cbDstPitch;
+    }
+}
+
+void CrMBltImgRect(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, CR_BLITTER_IMG *pDst)
+{
+    int32_t srcX = pCopyRect->xLeft - pSrcDataPoint->x;
+    int32_t srcY = pCopyRect->yTop - pSrcDataPoint->y;
+    Assert(srcX >= 0);
+    Assert(srcY >= 0);
+    Assert(srcX < (int32_t)pSrc->width);
+    Assert(srcY < (int32_t)pSrc->height);
+
+    int32_t dstX = pCopyRect->xLeft;
+    int32_t dstY = pCopyRect->yTop;
+    Assert(dstX >= 0);
+    Assert(dstY >= 0);
+    Assert(dstX < (int32_t)pDst->width);
+    Assert(dstY < (int32_t)pDst->height);
+
+    uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4;
+    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4;
+
+    crMBltMem(pu8Src, fSrcInvert ? -((int32_t)pSrc->pitch) : (int32_t)pSrc->pitch, pu8Dst, pDst->pitch, pCopyRect->xRight - pCopyRect->xLeft, pCopyRect->yBottom - pCopyRect->yTop);
+}
+
+void CrMBltImg(const CR_BLITTER_IMG *pSrc, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst)
+{
+    RTRECT Intersection;
+    RTRECT RestrictSrcRect;
+    RestrictSrcRect.xLeft = 0;
+    RestrictSrcRect.yTop = 0;
+    RestrictSrcRect.xRight = pSrc->width;
+    RestrictSrcRect.yBottom = pSrc->height;
+    RTRECT RestrictDstRect;
+    RestrictDstRect.xLeft = 0;
+    RestrictDstRect.yTop = 0;
+    RestrictDstRect.xRight = pDst->width;
+    RestrictDstRect.yBottom = pDst->height;
+
+    for (uint32_t i = 0; i < cRects; ++i)
+    {
+        const RTRECT * pRect = &pRects[i];
+        VBoxRectIntersected(pRect, &RestrictDstRect, &Intersection);
+
+        RTRECT TranslatedSrc;
+        VBoxRectTranslated(&RestrictSrcRect, pPos->x, pPos->y, &TranslatedSrc);
+
+        VBoxRectIntersect(&Intersection, &TranslatedSrc);
+
+        if (VBoxRectIsZero(&Intersection))
+            continue;
+
+        CrMBltImgRect(pSrc, pPos, false, &Intersection, pDst);
+    }
+}
+
+void CrMBltImgRectScaled(const CR_BLITTER_IMG *pSrc, const RTPOINT *pPos, bool fSrcInvert, const RTRECT *pCopyRect, float strX, float strY, CR_BLITTER_IMG *pDst)
+{
+    RTPOINT UnscaledPos;
+    UnscaledPos.x = CR_FLOAT_RCAST(int32_t, pPos->x / strX);
+    UnscaledPos.y = CR_FLOAT_RCAST(int32_t, pPos->y / strY);
+
+    RTRECT UnscaledCopyRect;
+
+    VBoxRectUnscaled(pCopyRect, strX, strY, &UnscaledCopyRect);
+
+    if (VBoxRectIsZero(&UnscaledCopyRect))
+    {
+        WARN(("ups"));
+        return;
+    }
+
+    int32_t srcX = UnscaledCopyRect.xLeft - UnscaledPos.x;
+    int32_t srcY = UnscaledCopyRect.yTop - UnscaledPos.y;
+    if (srcX < 0)
+    {
+        WARN(("ups"));
+        srcX = 0;
+    }
+    if (srcY < 0)
+    {
+        WARN(("ups"));
+        srcY = 0;
+    }
+
+    if (srcX >= pSrc->width)
+    {
+        WARN(("ups"));
+        return;
+    }
+
+    if (srcY >= pSrc->height)
+    {
+        WARN(("ups"));
+        return;
+    }
+
+    Assert(srcX >= 0);
+    Assert(srcY >= 0);
+    Assert(srcX < (int32_t)pSrc->width);
+    Assert(srcY < (int32_t)pSrc->height);
+
+    int32_t dstX = pCopyRect->xLeft;
+    int32_t dstY = pCopyRect->yTop;
+    Assert(dstX >= 0);
+    Assert(dstY >= 0);
+
+    int32_t UnscaledSrcWidth = UnscaledCopyRect.xRight - UnscaledCopyRect.xLeft;
+    int32_t UnscaledSrcHeight = UnscaledCopyRect.yBottom - UnscaledCopyRect.yTop;
+
+    if (UnscaledSrcWidth + srcX > pSrc->width)
+        UnscaledSrcWidth = pSrc->width - srcX;
+
+    if (UnscaledSrcHeight + srcY > pSrc->height)
+        UnscaledSrcHeight = pSrc->height - srcY;
+
+    uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4;
+    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4;
+
+    CrBmpScale32(pu8Dst, pDst->pitch,
+                        pCopyRect->xRight - pCopyRect->xLeft, pCopyRect->yBottom - pCopyRect->yTop,
+                        pu8Src,
+                        fSrcInvert ? -((int32_t)pSrc->pitch) : (int32_t)pSrc->pitch,
+                        UnscaledSrcWidth, UnscaledSrcHeight);
+}
+
+
+void CrMBltImgScaled(const CR_BLITTER_IMG *pSrc, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst)
+{
+    int32_t srcWidth = pSrcRectSize->cx;
+    int32_t srcHeight = pSrcRectSize->cy;
+    int32_t dstWidth = pDstRect->xRight - pDstRect->xLeft;
+    int32_t dstHeight = pDstRect->yBottom - pDstRect->yTop;
+
+    float strX = ((float)dstWidth) / srcWidth;
+    float strY = ((float)dstHeight) / srcHeight;
+    bool fScale = (dstWidth != srcWidth || dstHeight != srcHeight);
+    Assert(fScale);
+
+    RTRECT Intersection;
+    RTRECT ScaledRestrictSrcRect;
+    ScaledRestrictSrcRect.xLeft = 0;
+    ScaledRestrictSrcRect.yTop = 0;
+    ScaledRestrictSrcRect.xRight = CR_FLOAT_RCAST(int32_t, pSrc->width * strX);
+    ScaledRestrictSrcRect.yBottom = CR_FLOAT_RCAST(int32_t, pSrc->height * strY);
+    RTRECT RestrictDstRect;
+    RestrictDstRect.xLeft = 0;
+    RestrictDstRect.yTop = 0;
+    RestrictDstRect.xRight = pDst->width;
+    RestrictDstRect.yBottom = pDst->height;
+
+    RTPOINT Pos = {pDstRect->xLeft, pDstRect->yTop};
+
+    for (uint32_t i = 0; i < cRects; ++i)
+    {
+        const RTRECT * pRect = &pRects[i];
+        VBoxRectIntersected(pRect, &RestrictDstRect, &Intersection);
+
+        RTRECT TranslatedSrc;
+        VBoxRectTranslated(&ScaledRestrictSrcRect, Pos.x, Pos.y, &TranslatedSrc);
+
+        VBoxRectIntersect(&Intersection, &TranslatedSrc);
+
+        if (VBoxRectIsZero(&Intersection))
+            continue;
+
+        CrMBltImgRectScaled(pSrc, &Pos, false, &Intersection, strX, strY, pDst);
+    }
+}
+
 /* @param pCtxBase      - contains the blitter context info. Its value is treated differently depending on the fCreateNewCtx value
  * @param fCreateNewCtx - if true  - the pCtxBase must NOT be NULL. its visualBits is used as a visual bits info for the new context,
  *                                   its id field is used to specified the shared context id to be used for blitter context.
@@ -786,7 +1017,7 @@ VBOXBLITTERDECL(int) CrBltImgGetMural(PCR_BLITTER pBlitter, bool fBb, CR_BLITTER
         return VERR_INVALID_STATE;
     }
 
-    crWarning("NOT IMPLEMENTED");
+    WARN(("NOT IMPLEMENTED"));
     return VERR_NOT_IMPLEMENTED;
 }
 
diff --git a/src/VBox/GuestHost/OpenGL/util/string.c b/src/VBox/GuestHost/OpenGL/util/string.c
index 0d7fff0..e41aa1b 100644
--- a/src/VBox/GuestHost/OpenGL/util/string.c
+++ b/src/VBox/GuestHost/OpenGL/util/string.c
@@ -531,3 +531,59 @@ done:
 
     return iVer;
 }
+
+int32_t crStrParseI32(const char *pszStr, const int32_t defaultVal)
+{
+    int32_t result = 0;
+    bool neg = false;
+    unsigned char iDigit = 0;
+    if (!pszStr || pszStr[0] == '\0')
+        return defaultVal;
+
+    for (;;)
+    {
+        if (pszStr[0] == '\0')
+            return defaultVal;
+
+        if (pszStr[0] == ' ' || pszStr[0] == '\t' || pszStr[0] == '\n')
+        {
+            ++pszStr;
+            continue;
+        }
+
+        if (pszStr[0] == '-')
+        {
+            if (neg)
+                return defaultVal;
+
+            neg = true;
+            ++pszStr;
+            continue;
+        }
+
+        break;
+    }
+
+    for (;;)
+    {
+        unsigned char digit;
+        if (pszStr[0] == '\0')
+        {
+            if (!iDigit)
+                return defaultVal;
+            break;
+        }
+
+        digit = pszStr[0] - '0';
+        if (digit > 9)
+            return defaultVal;
+
+        result *= 10;
+        result += digit;
+        ++iDigit;
+
+        ++pszStr;
+    }
+
+    return !neg ? result : -result;
+}
diff --git a/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c b/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
index 32bf13e..7290b7b 100644
--- a/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
+++ b/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
@@ -1286,15 +1286,15 @@ static int crVBoxHGCMSetVersion(CRConnection *conn, unsigned int vMajor, unsigne
     return rc;
 }
 
-static int crVBoxHGCMGetHostCaps(CRConnection *conn, uint32_t *pu32HostCaps)
+static int crVBoxHGCMGetHostCapsLegacy(CRConnection *conn, uint32_t *pu32HostCaps)
 {
     CRVBOXHGCMGETCAPS caps;
     int rc;
 
     caps.hdr.result      = VERR_WRONG_ORDER;
     caps.hdr.u32ClientID = conn->u32ClientID;
-    caps.hdr.u32Function = SHCRGL_GUEST_FN_GET_CAPS;
-    caps.hdr.cParms      = SHCRGL_CPARMS_GET_CAPS;
+    caps.hdr.u32Function = SHCRGL_GUEST_FN_GET_CAPS_LEGACY;
+    caps.hdr.cParms      = SHCRGL_CPARMS_GET_CAPS_LEGACY;
 
     caps.Caps.type       = VMMDevHGCMParmType_32bit;
     caps.Caps.u.value32  = 0;
@@ -1321,7 +1321,6 @@ static int crVBoxHGCMGetHostCaps(CRConnection *conn, uint32_t *pu32HostCaps)
     return rc;
 }
 
-
 static int crVBoxHGCMSetPID(CRConnection *conn, unsigned long long pid)
 {
     CRVBOXHGCMSETPID parms;
@@ -1444,7 +1443,7 @@ static int crVBoxHGCMDoConnect( CRConnection *conn )
 
             if (!g_crvboxhgcm.fHostCapsInitialized)
             {
-                rc = crVBoxHGCMGetHostCaps(conn, &g_crvboxhgcm.u32HostCaps);
+                rc = crVBoxHGCMGetHostCapsLegacy(conn, &g_crvboxhgcm.u32HostCaps);
                 if (RT_FAILURE(rc))
                 {
                     WARN(("VBoxCrHgsmiCtlConGetHostCaps failed %d", rc));
@@ -2626,7 +2625,6 @@ int crVBoxHGCMRecv(
 
 #ifdef IN_GUEST
 # if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
-    CRASSERT(!g_crvboxhgcm.bHgsmiOn == !conn);
     if (conn && g_crvboxhgcm.bHgsmiOn)
     {
         _crVBoxHGCMPerformPollHost(conn);
diff --git a/src/VBox/HostDrivers/Support/Makefile.kmk b/src/VBox/HostDrivers/Support/Makefile.kmk
index 5addff0..c7539ed 100644
--- a/src/VBox/HostDrivers/Support/Makefile.kmk
+++ b/src/VBox/HostDrivers/Support/Makefile.kmk
@@ -30,7 +30,11 @@ include $(KBUILD_PATH)/subheader.kmk
 #
 # Targets
 #
-LIBRARIES += SUPR3 SUPR3Static SUPR3HardenedStatic
+LIBRARIES += SUPR3 SUPR3Static
+ifdef VBOX_WITH_HARDENING
+ LIBRARIES += SUPR3HardenedStatic
+endif
+DLLS.win += VBoxSupLib
 ifdef VBOX_WITH_32_ON_64_MAIN_API
  LIBRARIES += SUPR3-x86
 endif
@@ -69,16 +73,76 @@ if  !defined(VBOX_ONLY_DOCS) \
  endif
 endif # !VBOX_ONLY_DOCS && !VBOX_ONLY_EXTPACKS && !VBOX_ONLY_TESTSUITE
 
+#
+# Authenticode related trust anchors and certificates -> .cpp
+#
+VBOX_SUP_WIN_CERTS_FILE = $(SUPR3_0_OUTDIR)/TrustAnchorsAndCerts.cpp
+VBOX_SUP_WIN_CERTS := \
+       SpcRootMicrosoft0=SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf \
+       SpcRootMicrosoft1=SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf \
+       SpcRootMicrosoft2=SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf \
+       SpcRootMicrosoft3=SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf \
+       SpcRootMicrosoft4=SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf \
+       SpcRootMicrosoft5=SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf \
+       NtRootMicrosoft6=NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf \
+       TimeRootMicrosoft0=Timestamp-CopyrightC1997MicrosoftCorp-01.taf \
+       TrustedCertVBox0=Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf
+VBOX_SUP_WIN_CERT_NAMES := $(foreach cert,$(VBOX_SUP_WIN_CERTS),$(firstword $(subst =,$(SPACE) ,$(cert))))
+VBOX_PATH_SUPR3_CERTIFICATES := $(PATH_SUB_CURRENT)/win/Certificates
+
+# 1=name, 2=filter, 3=buildcert?.
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
+ VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \
+       $(if-expr "$(3)" == "",,'    SUPTAENTRY_GEN(g_abSUPBuildCert),') \
+	$(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), '    SUPTAENTRY_GEN(g_abSUP$(certnm)),') \
+	'};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
+else
+ VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \
+	$(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), '    SUPTAENTRY_GEN(g_abSUP$(certnm)),') \
+	'};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
+endif
+
+$$(VBOX_SUP_WIN_CERTS_FILE): $(MAKEFILE_CURRENT) \
+		$(foreach cert,$(VBOX_SUP_WIN_CERTS),$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SPACE) ,$(cert)))) \
+		$(VBOX_BIN2C) \
+		$(if-expr  "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING),$(VBOX_RTSIGNTOOL)) \
+		| $$(dir $$@)
+	$(QUIET)$(RM) -f -- $@ $@.cer
+	$(QUIET)$(APPEND) -n "$@" \
+       	'' \
+       	'#include <VBox/sup.h>' \
+               ''
+	$(foreach cert,$(VBOX_SUP_WIN_CERTS), $(NLTAB)$(VBOX_BIN2C) -ascii --append \
+		"SUP$(firstword $(subst =,$(SP) ,$(cert)))" \
+		"$(VBOX_PATH_SUPR3_CERTIFICATES)/$(lastword $(subst =,$(SP) ,$(cert)))" \
+		"$@")
+# The build certificate.
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
+	$(VBOX_RTSIGNTOOL) extract-exe-signer-cert --exe $(VBOX_RTSIGNTOOL) --output "$@.cer" --der
+	$(VBOX_BIN2C) -ascii --append SUPBuildCert "$@.cer" $@
+	$(QUIET)$(RM) -f -- $@.cer
+endif
+# Generate certificate lists.
+	$(QUIET)$(APPEND) -n "$@" '' \
+               $(call VBOX_SUP_GEN_CERT_MACRO,All,%,build) \
+               $(call VBOX_SUP_GEN_CERT_MACRO,SpcRoot,SpcRoot%) \
+               $(call VBOX_SUP_GEN_CERT_MACRO,NtKernelRoot,NtRoot%) \
+               $(call VBOX_SUP_GEN_CERT_MACRO,Timestamp,TimeRoot%) \
+               $(call VBOX_SUP_GEN_CERT_MACRO,Trusted,TrustedCert%,build)
+
+tst: $(VBOX_SUP_WIN_CERTS_FILE)
+
 
 #
 # The Ring-3 Support Library (this is linked into the IPRT dll, VBoxRT).
 #
-SUPR3_TEMPLATE     = VBOXR3NP
+SUPR3_TEMPLATE      = VBOXR3
 SUPR3_DEFS          = \
 	IN_SUP_R3 IN_RT_R3 \
 	$(if $(VBOX_WITH_SUPSVC),VBOX_WITH_SUPSVC) \
 	$(if $(VBOX_WITH_MAIN),VBOX_WITH_MAIN,) \
-	$(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
+	$(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,) \
+	VBOX_PERMIT_MORE
 SUPR3_INCS         := $(PATH_SUB_CURRENT)
 SUPR3_SOURCES       = \
 	SUPLib.cpp \
@@ -86,32 +150,231 @@ SUPR3_SOURCES       = \
 	SUPLibTracerA.asm \
 	SUPR3HardenedIPRT.cpp \
 	SUPR3HardenedVerify.cpp \
-	$(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp
+	$(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp \
+ 	$(VBOX_SUP_WIN_CERTS_FILE)
+ifdef VBOX_WITH_HARDENING
+ SUPR3_SOURCES.win  = \
+ 	win/SUPHardenedVerifyImage-win.cpp
+endif
 
 SUPR3-x86_TEMPLATE = VBoxR3Dll-x86
 SUPR3-x86_EXTENDS  = SUPR3
 
 
 #
-# Static version of SUPR3.
+# Static version of SUPR3.  This is more of a stub than anything else in a
+# hardened build, at least on windows.
 #
 SUPR3Static_TEMPLATE = VBOXR3STATIC
 SUPR3Static_EXTENDS = SUPR3
+SUPR3Static_DEFS = $(SUPR3_DEFS) IN_SUP_R3_STATIC
+SUPR3Static_SOURCES.win = $(filter-out win/SUPHardenedVerifyImage-win.cpp, $(SUPR3_SOURCES.win))
+
 
 #
 # The static part of the hardened support library (ring-3).
 #
+VBOX_PATH_RUNTIME_SRC ?= $(PATH_ROOT)/src/VBox/Runtime
 SUPR3HardenedStatic_TEMPLATE = VBOXR3HARDENEDLIB
 SUPR3HardenedStatic_DEFS     = IN_SUP_HARDENED_R3
 SUPR3HardenedStatic_DEFS    += \
 	$(if $(VBOX_WITH_SUPSVC),VBOX_WITH_SUPSVC,) \
 	$(if $(VBOX_WITH_MAIN),VBOX_WITH_MAIN,) \
-	$(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
+	$(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,) \
+	$(if $(VBOX_WITHOUT_DEBUGGER_CHECKS),VBOX_WITHOUT_DEBUGGER_CHECKS,) \
+	$(if $(VBOX_PERMIT_VISUAL_STUDIO_PROFILING),VBOX_PERMIT_VISUAL_STUDIO_PROFILING,) \
+	VBOX_PERMIT_MORE
+ifdef VBOX_WITH_VISTA_NO_SP
+ SUPR3HardenedStatic_DEFS.win += VBOX_WITH_VISTA_NO_SP
+endif
 SUPR3HardenedStatic_INCS     = .
 SUPR3HardenedStatic_SOURCES  = \
 	SUPR3HardenedMain.cpp \
 	SUPR3HardenedVerify.cpp \
+	SUPR3HardenedNoCrt.cpp \
 	$(KBUILD_TARGET)/SUPLib-$(KBUILD_TARGET).cpp
+SUPR3HardenedStatic_SOURCES.win = \
+	win/SUPR3HardenedMain-win.cpp \
+	win/SUPR3HardenedMainA-win.asm \
+       win/SUPHardenedVerifyProcess-win.cpp \
+       win/SUPHardenedVerifyImage-win.cpp \
+	$(VBOX_SUP_WIN_CERTS_FILE)
+
+if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING) ## @todo some of this move up.
+ SUPR3HardenedStatic_DEFS += IN_RT IN_RT_R3 IN_RT_STATIC IPRT_NO_CRT RT_WITH_NOCRT_ALIASES LOG_DISABLED IPRT_NO_ERROR_DATA
+ SUPR3HardenedStatic_DEFS.win += LDR_ONLY_PE __STRALIGN_H_
+
+ SUPR3HardenedStatic_INCS += $(PATH_ROOT)/include/iprt/nocrt  $(VBOX_PATH_RUNTIME_SRC)/include
+
+ SUPR3HardenedStatic_SOURCES += \
+	$(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldr.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldrEx.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/ldr/ldrPE.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-basics.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-cursor.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-default-allocator.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-dump.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-encode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-bitstring.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-bitstring-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-boolean.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-boolean-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-core-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-dyntype.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-dyntype-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-integer.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-integer-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-null.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-null-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-objid.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-objid-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-octetstring.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-octetstring-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-string.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-string-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-time.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/asn1/asn1-ut-time-decode.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/digest-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/digest-builtin.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-asn1-decoder.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-init.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-sanity.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkcs7-verify.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-builtin.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-signature-rsa.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-verify.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/pkix-util.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-asn1-decoder.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-init.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/rsa-sanity.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-asn1-decoder.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-init.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/spc-sanity.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-asn1-decoder.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-certpaths.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-init.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-sanity.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/x509-verify.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/store.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/store-inmem.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-asn1-decoder.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-core.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-init.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/crypto/taf-sanity.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-md2.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-md5.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha1.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha256.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/alt-sha512.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/md2str.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/md5str.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha1str.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha256str.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/checksum/sha512str.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/err/errinfo.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/path/RTPathChangeToUnixSlashes.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/path/RTPathExt.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrPrintHexBytes.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTUtf16PrintHexBytes.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTUtf16ICmpAscii.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strstrip.cpp \
+       \
+	$(VBOX_PATH_RUNTIME_SRC)/common/err/errmsg.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/math/bignum.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg1Weak.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg2Weak.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/misc/RTAssertMsg2WeakV.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/misc/zero.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/memchr.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/memcmp.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/memcpy.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/memmove.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/mempcpy.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/memset.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCat.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCmp.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrCopy.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrNCmp.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/RTStrNLen.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strchr.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strcmp.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strcpy.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strformat.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strformatrt.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strformattype.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/stringalloc.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strlen.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strncmp.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strncpy.asm \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strprintf.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/strtonum.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/utf-16.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/utf-8.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/utf-8-case.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/unidata-upper.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/string/unidata-lower.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/common/time/time.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/generic/RTAssertShouldPanic-generic.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/generic/memsafer-generic.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/generic/uuid-generic.cpp \
+
+
+ SUPR3HardenedStatic_SOURCES.win += \
+ 	win/SUPR3HardenedNoCrt-win.cpp \
+ 	$(VBOX_PATH_RUNTIME_SRC)/nt/RTErrConvertFromNtStatus.cpp \
+ 	$(VBOX_PATH_RUNTIME_SRC)/win/RTErrConvertFromWin32.cpp \
+	$(VBOX_PATH_RUNTIME_SRC)/win/errmsgwin.cpp
+
+ # Add necessary compiler specific files from libcmt.lib and the lib dir.
+ ifeq ($(KBUILD_TARGET),win)
+   SUPR3HardenedStatic_VBOX_LIBC_OBJS = chkstk.obj
+   ifeq ($(KBUILD_TARGET_ARCH),x86)
+    SUPR3HardenedStatic_VBOX_LIBC_OBJS += \
+    	alloca16.obj \
+    	ulldiv.obj \
+    	ulldvrm.obj \
+    	ullrem.obj \
+    	ullshr.obj \
+    	lldiv.obj \
+    	lldvrm.obj \
+    	llmul.obj \
+    	llrem.obj \
+    	llshl.obj \
+    	llshr.obj \
+    	rotl.obj \
+    	rotr.obj
+   endif
+  SUPR3HardenedStatic_SOURCES.win += $(addprefix $(SUPR3HardenedStatic_0_OUTDIR)/,$(SUPR3HardenedStatic_VBOX_LIBC_OBJS))
+
+  $(addprefix $$(SUPR3HardenedStatic_0_OUTDIR)/,$(SUPR3HardenedStatic_VBOX_LIBC_OBJS)): \
+		$$(PATH_TOOL_$(TEMPLATE_VBOXR3EXE_TOOL.win.$(KBUILD_TARGET_ARCH))_LIB)/libcmt.lib | $$(dir $$@)
+	$(TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.$(KBUILD_TARGET_ARCH))_AR) "$<" \
+		/EXTRACT:`$(TOOL_$(TEMPLATE_VBOXR3HARDENEDEXE_TOOL.win.$(KBUILD_TARGET_ARCH))_AR) "$<" /LIST \
+		          | $(SED_EXT) -n -e '/[\\/:]$(notdir $@)/p'` \
+		"/OUT:$@"
+ endif
+endif
+
+
+#
+# VBoxSupLib - Windows DLL for catching thread creation and termination.
+#
+VBoxSupLib_TEMPLATE = $(if-expr "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING),VBOXR3HARDENEDLIB,VBOXR3)
+VBoxSupLib_LDFLAGS.win.amd64 = -Entry:DllMainEntrypoint
+VBoxSupLib_LDFLAGS.win.x86   = -Entry:DllMainEntrypoint
+VBoxSupLib_DEFS = \
+	$(if $(VBOX_WITHOUT_DEBUGGER_CHECKS),VBOX_WITHOUT_DEBUGGER_CHECKS,)
+VBoxSupLib_SOURCES = \
+	$(KBUILD_TARGET)/VBoxSupLib-$(KBUILD_TARGET).cpp
+VBoxSupLib_LIBS.win = \
+	$(SUPR3HardenedStatic_1_TARGET)
+
 
 #
 # VBoxSupSvc - The system wide service/daemon.
@@ -266,6 +529,13 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
  ifdef VBOX_WITH_DTRACE_R0DRV
   VBoxDrv_DEFS           += VBOX_WITH_DTRACE VBOX_WITH_DTRACE_R0DRV
  endif
+ ifdef VBOX_WITHOUT_DEBUGGER_CHECKS
+  VBoxDrv_DEFS           += VBOX_WITHOUT_DEBUGGER_CHECKS
+ endif
+ ifdef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+  VBoxDrv_DEFS           += VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+ endif
+ VBoxDrv_DEFS            += VBOX_PERMIT_MORE
  #VBoxDrv_DEFS.debug      += DEBUG_DARWIN_GIP
  VBoxDrv_DEFS.darwin     := VBOX_WITH_HOST_VMX
  VBoxDrv_DEFS.linux      := \
@@ -282,6 +552,12 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
  ifdef VBOX_WITHOUT_NATIVE_R0_LOADER
   VBoxDrv_DEFS.win       += VBOX_WITHOUT_NATIVE_R0_LOADER
  endif
+ ifdef VBOX_WITH_VISTA_NO_SP
+  VBoxDrv_DEFS.win       += VBOX_WITH_VISTA_NO_SP
+ endif
+ ifdef VBOX_WITH_HARDENING
+  VBoxDrv_ASDEFS         += VBOX_WITH_HARDENING
+ endif
 
  VBoxDrv_INCS             = . $(VBoxDrv_0_OUTDIR)
  VBoxDrv_INCS.darwin      = ./darwin
@@ -290,9 +566,9 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
  VBoxDrv_LIBS             = $(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB)
  VBoxDrv_LIBS.linux.debug = $(VBoxDrv_LIBS) $(VBOX_GCC_LIBGCC)
  VBoxDrv_LIBS.win         = \
+ 	$(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB) \
  	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/ntoskrnl.lib \
- 	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/hal.lib \
- 	$(PATH_STAGE_LIB)/RuntimeR0Drv$(VBOX_SUFF_LIB)
+ 	$(PATH_SDK_$(VBOX_WINDDK)_LIB)/hal.lib
 
  #VBoxDrv_LDFLAGS.darwin    = -v -Wl,-whyload -Wl,-v -Wl,-whatsloaded
  VBoxDrv_LDFLAGS.solaris += -N misc/ctf
@@ -312,6 +588,12 @@ if1of ($(KBUILD_TARGET), darwin linux solaris win)
 	win/SUPDrv-win.cpp \
 	win/SUPDrvA-win.asm \
 	win/VBoxDrv.rc
+ ifdef VBOX_WITH_HARDENING
+  VBoxDrv_SOURCES.win    += \
+ 	win/SUPHardenedVerifyImage-win.cpp \
+ 	win/SUPHardenedVerifyProcess-win.cpp \
+ 	$(VBOX_SUP_WIN_CERTS_FILE)
+ endif
  VBoxDrv_SOURCES          = \
  	SUPDrv.d \
  	SUPDrv.c \
diff --git a/src/VBox/HostDrivers/Support/SUPDrv.c b/src/VBox/HostDrivers/Support/SUPDrv.c
index 580e318..cb2a695 100644
--- a/src/VBox/HostDrivers/Support/SUPDrv.c
+++ b/src/VBox/HostDrivers/Support/SUPDrv.c
@@ -462,124 +462,130 @@ int VBOXCALL supdrvInitDevExt(PSUPDRVDEVEXT pDevExt, size_t cbSession)
     /*
      * Initialize it.
      */
-    memset(pDevExt, 0, sizeof(*pDevExt));
+    memset(pDevExt, 0, sizeof(*pDevExt)); /* Does not wipe OS specific tail section of the structure. */
+    pDevExt->Spinlock = NIL_RTSPINLOCK;
+    pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
+    pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
     rc = RTSpinlockCreate(&pDevExt->Spinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvDevExt");
     if (RT_SUCCESS(rc))
-    {
         rc = RTSpinlockCreate(&pDevExt->hGipSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvGip");
+    if (RT_SUCCESS(rc))
+        rc = RTSpinlockCreate(&pDevExt->hSessionHashTabSpinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "SUPDrvSession");
+
+    if (RT_SUCCESS(rc))
+#ifdef SUPDRV_USE_MUTEX_FOR_LDR
+        rc = RTSemMutexCreate(&pDevExt->mtxLdr);
+#else
+        rc = RTSemFastMutexCreate(&pDevExt->mtxLdr);
+#endif
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTSemFastMutexCreate(&pDevExt->mtxComponentFactory);
         if (RT_SUCCESS(rc))
         {
 #ifdef SUPDRV_USE_MUTEX_FOR_LDR
-            rc = RTSemMutexCreate(&pDevExt->mtxLdr);
+            rc = RTSemMutexCreate(&pDevExt->mtxGip);
 #else
-            rc = RTSemFastMutexCreate(&pDevExt->mtxLdr);
+            rc = RTSemFastMutexCreate(&pDevExt->mtxGip);
 #endif
             if (RT_SUCCESS(rc))
             {
-                rc = RTSemFastMutexCreate(&pDevExt->mtxComponentFactory);
+                rc = supdrvGipCreate(pDevExt);
                 if (RT_SUCCESS(rc))
                 {
-#ifdef SUPDRV_USE_MUTEX_FOR_LDR
-                    rc = RTSemMutexCreate(&pDevExt->mtxGip);
-#else
-                    rc = RTSemFastMutexCreate(&pDevExt->mtxGip);
-#endif
+                    rc = supdrvTracerInit(pDevExt);
                     if (RT_SUCCESS(rc))
                     {
-                        rc = supdrvGipCreate(pDevExt);
-                        if (RT_SUCCESS(rc))
-                        {
-                            rc = supdrvTracerInit(pDevExt);
-                            if (RT_SUCCESS(rc))
-                            {
-                                pDevExt->pLdrInitImage  = NULL;
-                                pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
-                                pDevExt->u32Cookie      = BIRD;  /** @todo make this random? */
-                                pDevExt->cbSession      = (uint32_t)cbSession;
-
-                                /*
-                                 * Fixup the absolute symbols.
-                                 *
-                                 * Because of the table indexing assumptions we'll have a little #ifdef orgy
-                                 * here rather than distributing this to OS specific files. At least for now.
-                                 */
+                        pDevExt->pLdrInitImage  = NULL;
+                        pDevExt->hLdrInitThread = NIL_RTNATIVETHREAD;
+                        pDevExt->u32Cookie      = BIRD;  /** @todo make this random? */
+                        pDevExt->cbSession      = (uint32_t)cbSession;
+
+                        /*
+                         * Fixup the absolute symbols.
+                         *
+                         * Because of the table indexing assumptions we'll have a little #ifdef orgy
+                         * here rather than distributing this to OS specific files. At least for now.
+                         */
 #ifdef RT_OS_DARWIN
 # if ARCH_BITS == 32
-                                if (SUPR0GetPagingMode() >= SUPPAGINGMODE_AMD64)
-                                {
-                                    g_aFunctions[0].pfn = (void *)1;                    /* SUPR0AbsIs64bit */
-                                    g_aFunctions[1].pfn = (void *)0x80;                 /* SUPR0Abs64bitKernelCS - KERNEL64_CS, seg.h */
-                                    g_aFunctions[2].pfn = (void *)0x88;                 /* SUPR0Abs64bitKernelSS - KERNEL64_SS, seg.h */
-                                    g_aFunctions[3].pfn = (void *)0x88;                 /* SUPR0Abs64bitKernelDS - KERNEL64_SS, seg.h */
-                                }
-                                else
-                                    g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
-                                g_aFunctions[4].pfn = (void *)0x08;                     /* SUPR0AbsKernelCS - KERNEL_CS, seg.h */
-                                g_aFunctions[5].pfn = (void *)0x10;                     /* SUPR0AbsKernelSS - KERNEL_DS, seg.h */
-                                g_aFunctions[6].pfn = (void *)0x10;                     /* SUPR0AbsKernelDS - KERNEL_DS, seg.h */
-                                g_aFunctions[7].pfn = (void *)0x10;                     /* SUPR0AbsKernelES - KERNEL_DS, seg.h */
-                                g_aFunctions[8].pfn = (void *)0x10;                     /* SUPR0AbsKernelFS - KERNEL_DS, seg.h */
-                                g_aFunctions[9].pfn = (void *)0x48;                     /* SUPR0AbsKernelGS - CPU_DATA_GS, seg.h */
+                        if (SUPR0GetPagingMode() >= SUPPAGINGMODE_AMD64)
+                        {
+                            g_aFunctions[0].pfn = (void *)1;                    /* SUPR0AbsIs64bit */
+                            g_aFunctions[1].pfn = (void *)0x80;                 /* SUPR0Abs64bitKernelCS - KERNEL64_CS, seg.h */
+                            g_aFunctions[2].pfn = (void *)0x88;                 /* SUPR0Abs64bitKernelSS - KERNEL64_SS, seg.h */
+                            g_aFunctions[3].pfn = (void *)0x88;                 /* SUPR0Abs64bitKernelDS - KERNEL64_SS, seg.h */
+                        }
+                        else
+                            g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
+                        g_aFunctions[4].pfn = (void *)0x08;                     /* SUPR0AbsKernelCS - KERNEL_CS, seg.h */
+                        g_aFunctions[5].pfn = (void *)0x10;                     /* SUPR0AbsKernelSS - KERNEL_DS, seg.h */
+                        g_aFunctions[6].pfn = (void *)0x10;                     /* SUPR0AbsKernelDS - KERNEL_DS, seg.h */
+                        g_aFunctions[7].pfn = (void *)0x10;                     /* SUPR0AbsKernelES - KERNEL_DS, seg.h */
+                        g_aFunctions[8].pfn = (void *)0x10;                     /* SUPR0AbsKernelFS - KERNEL_DS, seg.h */
+                        g_aFunctions[9].pfn = (void *)0x48;                     /* SUPR0AbsKernelGS - CPU_DATA_GS, seg.h */
 # else /* 64-bit darwin: */
-                                g_aFunctions[0].pfn = (void *)1;                        /* SUPR0AbsIs64bit */
-                                g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0Abs64bitKernelCS */
-                                g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0Abs64bitKernelSS */
-                                g_aFunctions[3].pfn = (void *)0;                        /* SUPR0Abs64bitKernelDS */
-                                g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0AbsKernelCS */
-                                g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0AbsKernelSS */
-                                g_aFunctions[6].pfn = (void *)0;                        /* SUPR0AbsKernelDS */
-                                g_aFunctions[7].pfn = (void *)0;                        /* SUPR0AbsKernelES */
-                                g_aFunctions[8].pfn = (void *)0;                        /* SUPR0AbsKernelFS */
-                                g_aFunctions[9].pfn = (void *)0;                        /* SUPR0AbsKernelGS */
+                        g_aFunctions[0].pfn = (void *)1;                        /* SUPR0AbsIs64bit */
+                        g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0Abs64bitKernelCS */
+                        g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0Abs64bitKernelSS */
+                        g_aFunctions[3].pfn = (void *)0;                        /* SUPR0Abs64bitKernelDS */
+                        g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0AbsKernelCS */
+                        g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0AbsKernelSS */
+                        g_aFunctions[6].pfn = (void *)0;                        /* SUPR0AbsKernelDS */
+                        g_aFunctions[7].pfn = (void *)0;                        /* SUPR0AbsKernelES */
+                        g_aFunctions[8].pfn = (void *)0;                        /* SUPR0AbsKernelFS */
+                        g_aFunctions[9].pfn = (void *)0;                        /* SUPR0AbsKernelGS */
 
 # endif
 #else  /* !RT_OS_DARWIN */
 # if ARCH_BITS == 64
-                                g_aFunctions[0].pfn = (void *)1;                        /* SUPR0AbsIs64bit */
-                                g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0Abs64bitKernelCS */
-                                g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0Abs64bitKernelSS */
-                                g_aFunctions[3].pfn = (void *)(uintptr_t)ASMGetDS();    /* SUPR0Abs64bitKernelDS */
+                        g_aFunctions[0].pfn = (void *)1;                        /* SUPR0AbsIs64bit */
+                        g_aFunctions[1].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0Abs64bitKernelCS */
+                        g_aFunctions[2].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0Abs64bitKernelSS */
+                        g_aFunctions[3].pfn = (void *)(uintptr_t)ASMGetDS();    /* SUPR0Abs64bitKernelDS */
 # else
-                                g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
+                        g_aFunctions[0].pfn = g_aFunctions[1].pfn = g_aFunctions[2].pfn = g_aFunctions[4].pfn = (void *)0;
 # endif
-                                g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0AbsKernelCS */
-                                g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0AbsKernelSS */
-                                g_aFunctions[6].pfn = (void *)(uintptr_t)ASMGetDS();    /* SUPR0AbsKernelDS */
-                                g_aFunctions[7].pfn = (void *)(uintptr_t)ASMGetES();    /* SUPR0AbsKernelES */
-                                g_aFunctions[8].pfn = (void *)(uintptr_t)ASMGetFS();    /* SUPR0AbsKernelFS */
-                                g_aFunctions[9].pfn = (void *)(uintptr_t)ASMGetGS();    /* SUPR0AbsKernelGS */
+                        g_aFunctions[4].pfn = (void *)(uintptr_t)ASMGetCS();    /* SUPR0AbsKernelCS */
+                        g_aFunctions[5].pfn = (void *)(uintptr_t)ASMGetSS();    /* SUPR0AbsKernelSS */
+                        g_aFunctions[6].pfn = (void *)(uintptr_t)ASMGetDS();    /* SUPR0AbsKernelDS */
+                        g_aFunctions[7].pfn = (void *)(uintptr_t)ASMGetES();    /* SUPR0AbsKernelES */
+                        g_aFunctions[8].pfn = (void *)(uintptr_t)ASMGetFS();    /* SUPR0AbsKernelFS */
+                        g_aFunctions[9].pfn = (void *)(uintptr_t)ASMGetGS();    /* SUPR0AbsKernelGS */
 #endif /* !RT_OS_DARWIN */
-                                return VINF_SUCCESS;
-                            }
+                        return VINF_SUCCESS;
+                    }
 
-                            supdrvGipDestroy(pDevExt);
-                        }
+                    supdrvGipDestroy(pDevExt);
+                }
 
 #ifdef SUPDRV_USE_MUTEX_FOR_GIP
-                        RTSemMutexDestroy(pDevExt->mtxGip);
-                        pDevExt->mtxGip = NIL_RTSEMMUTEX;
+                RTSemMutexDestroy(pDevExt->mtxGip);
+                pDevExt->mtxGip = NIL_RTSEMMUTEX;
 #else
-                        RTSemFastMutexDestroy(pDevExt->mtxGip);
-                        pDevExt->mtxGip = NIL_RTSEMFASTMUTEX;
+                RTSemFastMutexDestroy(pDevExt->mtxGip);
+                pDevExt->mtxGip = NIL_RTSEMFASTMUTEX;
 #endif
-                    }
-                    RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
-                    pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
-                }
+            }
+            RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
+            pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
+        }
 #ifdef SUPDRV_USE_MUTEX_FOR_LDR
-                RTSemMutexDestroy(pDevExt->mtxLdr);
-                pDevExt->mtxLdr = NIL_RTSEMMUTEX;
+        RTSemMutexDestroy(pDevExt->mtxLdr);
+        pDevExt->mtxLdr = NIL_RTSEMMUTEX;
 #else
-                RTSemFastMutexDestroy(pDevExt->mtxLdr);
-                pDevExt->mtxLdr = NIL_RTSEMFASTMUTEX;
+        RTSemFastMutexDestroy(pDevExt->mtxLdr);
+        pDevExt->mtxLdr = NIL_RTSEMFASTMUTEX;
 #endif
-            }
-            RTSpinlockDestroy(pDevExt->hGipSpinlock);
-            pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
-        }
-        RTSpinlockDestroy(pDevExt->Spinlock);
-        pDevExt->Spinlock = NIL_RTSPINLOCK;
     }
+
+    RTSpinlockDestroy(pDevExt->Spinlock);
+    pDevExt->Spinlock = NIL_RTSPINLOCK;
+    RTSpinlockDestroy(pDevExt->hGipSpinlock);
+    pDevExt->hGipSpinlock = NIL_RTSPINLOCK;
+    RTSpinlockDestroy(pDevExt->hSessionHashTabSpinlock);
+    pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
+
 #ifdef SUPDRV_WITH_RELEASE_LOGGER
     RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
     RTLogDestroy(RTLogSetDefaultInstance(NULL));
@@ -620,6 +626,8 @@ void VBOXCALL supdrvDeleteDevExt(PSUPDRVDEVEXT pDevExt)
     pDevExt->Spinlock = NIL_RTSPINLOCK;
     RTSemFastMutexDestroy(pDevExt->mtxComponentFactory);
     pDevExt->mtxComponentFactory = NIL_RTSEMFASTMUTEX;
+    RTSpinlockDestroy(pDevExt->hSessionHashTabSpinlock);
+    pDevExt->hSessionHashTabSpinlock = NIL_RTSPINLOCK;
 
     /*
      * Free lists.
@@ -698,15 +706,10 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
                 pSession->pDevExt           = pDevExt;
                 pSession->u32Cookie         = BIRD_INV;
                 pSession->fUnrestricted     = fUnrestricted;
+                /*pSession->fInHashTable      = false; */
                 pSession->cRefs             = 1;
-                /*pSession->pLdrUsage         = NULL;
-                pSession->pVM               = NULL;
-                pSession->pUsage            = NULL;
-                pSession->pGip              = NULL;
-                pSession->fGipReferenced    = false;
-                pSession->Bundle.cUsed      = 0; */
-                pSession->Uid               = NIL_RTUID;
-                pSession->Gid               = NIL_RTGID;
+                /*pSession->pCommonNextHash   = NULL;
+                pSession->ppOsSessionPtr    = NULL; */
                 if (fUser)
                 {
                     pSession->Process       = RTProcSelf();
@@ -717,6 +720,14 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
                     pSession->Process       = NIL_RTPROCESS;
                     pSession->R0Process     = NIL_RTR0PROCESS;
                 }
+                /*pSession->pLdrUsage         = NULL;
+                pSession->pVM               = NULL;
+                pSession->pUsage            = NULL;
+                pSession->pGip              = NULL;
+                pSession->fGipReferenced    = false;
+                pSession->Bundle.cUsed      = 0; */
+                pSession->Uid               = NIL_RTUID;
+                pSession->Gid               = NIL_RTGID;
                 /*pSession->uTracerData       = 0;*/
                 pSession->hTracerCaller     = NIL_RTNATIVETHREAD;
                 RTListInit(&pSession->TpProviders);
@@ -744,14 +755,16 @@ int VBOXCALL supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrest
 
 
 /**
- * Shared code for cleaning up a session (but not quite freeing it).
+ * Cleans up the session in the context of the process to which it belongs, the
+ * caller will free the session and the session spinlock.
  *
- * This is primarily intended for MAC OS X where we have to clean up the memory
- * stuff before the file handle is closed.
+ * This should normally occur when the session is closed or as the process
+ * exits.  Careful reference counting in the OS specfic code makes sure that
+ * there cannot be any races between process/handle cleanup callbacks and
+ * threads doing I/O control calls.
  *
- * @param   pDevExt     Device extension.
+ * @param   pDevExt     The device extension.
  * @param   pSession    Session data.
- *                      This data will be freed by this routine.
  */
 static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
 {
@@ -759,6 +772,11 @@ static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
     PSUPDRVBUNDLE       pBundle;
     LogFlow(("supdrvCleanupSession: pSession=%p\n", pSession));
 
+    Assert(!pSession->fInHashTable);
+    Assert(!pSession->ppOsSessionPtr);
+    AssertReleaseMsg(pSession->R0Process == RTR0ProcHandleSelf() || pSession->R0Process == NIL_RTR0PROCESS,
+                     ("R0Process=%p cur=%p; Process=%u curpid=%u\n", RTR0ProcHandleSelf(), RTProcSelf()));
+
     /*
      * Remove logger instances related to this session.
      */
@@ -962,13 +980,13 @@ static void supdrvCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
 
 
 /**
- * Shared code for cleaning up a session.
+ * Common code for freeing a session when the reference count reaches zero.
  *
  * @param   pDevExt     Device extension.
  * @param   pSession    Session data.
  *                      This data will be freed by this routine.
  */
-static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+static void supdrvDestroySession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
 {
     VBOXDRV_SESSION_CLOSE(pSession);
 
@@ -976,6 +994,7 @@ static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
      * Cleanup the session first.
      */
     supdrvCleanupSession(pDevExt, pSession);
+    supdrvOSCleanupSession(pDevExt, pSession);
 
     /*
      * Free the rest of the session stuff.
@@ -984,7 +1003,262 @@ static void supdrvCloseSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
     pSession->Spinlock = NIL_RTSPINLOCK;
     pSession->pDevExt = NULL;
     RTMemFree(pSession);
-    LogFlow(("supdrvCloseSession: returns\n"));
+    LogFlow(("supdrvDestroySession: returns\n"));
+}
+
+
+/**
+ * Inserts the session into the global hash table.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_WRONG_ORDER if the session was already inserted (asserted).
+ * @retval  VERR_INVALID_PARAMETER if the session handle is invalid or a ring-0
+ *          session (asserted).
+ * @retval  VERR_DUPLICATE if there is already a session for that pid.
+ *
+ * @param   pDevExt         The device extension.
+ * @param   pSession        The session.
+ * @param   ppOsSessionPtr  Pointer to the OS session pointer, if any is
+ *                          available and used.  This will set to point to the
+ *                          session while under the protection of the session
+ *                          hash table spinlock.  It will also be kept in
+ *                          PSUPDRVSESSION::ppOsSessionPtr for lookup and
+ *                          cleanup use.
+ * @param   pvUser          Argument for supdrvOSSessionHashTabInserted.
+ */
+int VBOXCALL supdrvSessionHashTabInsert(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVSESSION *ppOsSessionPtr,
+                                        void *pvUser)
+{
+    PSUPDRVSESSION  pCur;
+    unsigned        iHash;
+
+    /*
+     * Validate input.
+     */
+    AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER);
+    AssertReturn(pSession->R0Process != NIL_RTR0PROCESS, VERR_INVALID_PARAMETER);
+
+    /*
+     * Calculate the hash table index and acquire the spinlock.
+     */
+    iHash = SUPDRV_SESSION_HASH(pSession->Process);
+
+    RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+    /*
+     * If there are a collisions, we need to carefully check if we got a
+     * duplicate.  There can only be one open session per process.
+     */
+    pCur = pDevExt->apSessionHashTab[iHash];
+    if (pCur)
+    {
+        while (pCur && pCur->Process != pSession->Process)
+            pCur = pCur->pCommonNextHash;
+
+        if (pCur)
+        {
+            RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+            if (pCur == pSession)
+            {
+                Assert(pSession->fInHashTable);
+                AssertFailed();
+                return VERR_WRONG_ORDER;
+            }
+            Assert(!pSession->fInHashTable);
+            if (pCur->R0Process == pSession->R0Process)
+                return VERR_RESOURCE_IN_USE;
+            return VERR_DUPLICATE;
+        }
+    }
+    Assert(!pSession->fInHashTable);
+    Assert(!pSession->ppOsSessionPtr);
+
+    /*
+     * Insert it, doing a callout to the OS specific code in case it has
+     * anything it wishes to do while we're holding the spinlock.
+     */
+    pSession->pCommonNextHash = pDevExt->apSessionHashTab[iHash];
+    pDevExt->apSessionHashTab[iHash] = pSession;
+    pSession->fInHashTable    = true;
+    ASMAtomicIncS32(&pDevExt->cSessions);
+
+    pSession->ppOsSessionPtr = ppOsSessionPtr;
+    if (ppOsSessionPtr)
+        ASMAtomicWritePtr(ppOsSessionPtr, pSession);
+
+    supdrvOSSessionHashTabInserted(pDevExt, pSession, pvUser);
+
+    /*
+     * Retain a reference for the pointer in the session table.
+     */
+    ASMAtomicIncU32(&pSession->cRefs);
+
+    RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Removes the session from the global hash table.
+ *
+ * @retval  VINF_SUCCESS on success.
+ * @retval  VERR_NOT_FOUND if the session was already removed (asserted).
+ * @retval  VERR_INVALID_PARAMETER if the session handle is invalid or a ring-0
+ *          session (asserted).
+ *
+ * @param   pDevExt     The device extension.
+ * @param   pSession    The session. The caller is expected to have a reference
+ *                      to this so it won't croak on us when we release the hash
+ *                      table reference.
+ * @param   pvUser      OS specific context value for the
+ *                      supdrvOSSessionHashTabInserted callback.
+ */
+int VBOXCALL supdrvSessionHashTabRemove(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    PSUPDRVSESSION  pCur;
+    unsigned        iHash;
+    int32_t         cRefs;
+
+    /*
+     * Validate input.
+     */
+    AssertReturn(SUP_IS_SESSION_VALID(pSession), VERR_INVALID_PARAMETER);
+    AssertReturn(pSession->R0Process != NIL_RTR0PROCESS, VERR_INVALID_PARAMETER);
+
+    /*
+     * Calculate the hash table index and acquire the spinlock.
+     */
+    iHash = SUPDRV_SESSION_HASH(pSession->Process);
+
+    RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+    /*
+     * Unlink it.
+     */
+    pCur = pDevExt->apSessionHashTab[iHash];
+    if (pCur == pSession)
+        pDevExt->apSessionHashTab[iHash] = pSession->pCommonNextHash;
+    else
+    {
+        PSUPDRVSESSION pPrev = pCur;
+        while (pCur && pCur != pSession)
+        {
+            pPrev = pCur;
+            pCur  = pCur->pCommonNextHash;
+        }
+        if (pCur)
+            pPrev->pCommonNextHash = pCur->pCommonNextHash;
+        else
+        {
+            Assert(!pSession->fInHashTable);
+            RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+            return VERR_NOT_FOUND;
+        }
+    }
+
+    pSession->pCommonNextHash = NULL;
+    pSession->fInHashTable    = false;
+
+    ASMAtomicDecU32(&pDevExt->cSessions);
+
+    /*
+     * Clear OS specific session pointer if available and do the OS callback.
+     */
+    if (pSession->ppOsSessionPtr)
+    {
+        ASMAtomicCmpXchgPtr(pSession->ppOsSessionPtr, NULL, pSession);
+        pSession->ppOsSessionPtr = NULL;
+    }
+
+    supdrvOSSessionHashTabRemoved(pDevExt, pSession, pvUser);
+
+    RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+
+    /*
+     * Drop the reference the hash table had to the session.  This shouldn't
+     * be the last reference!
+     */
+    cRefs = ASMAtomicDecU32(&pSession->cRefs);
+    Assert(cRefs > 0 && cRefs < _1M);
+    if (cRefs == 0)
+        supdrvDestroySession(pDevExt, pSession);
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Looks up the session for the current process in the global hash table or in
+ * OS specific pointer.
+ *
+ * @returns Pointer to the session with a reference that the caller must
+ *          release.  If no valid session was found, NULL is returned.
+ *
+ * @param   pDevExt         The device extension.
+ * @param   Process         The process ID.
+ * @param   R0Process       The ring-0 process handle.
+ * @param   ppOsSessionPtr  The OS session pointer if available.  If not NULL,
+ *                          this is used instead of the hash table.  For
+ *                          additional safety it must then be equal to the
+ *                          SUPDRVSESSION::ppOsSessionPtr member.
+ *                          This can be NULL even if the OS has a session
+ *                          pointer.
+ */
+PSUPDRVSESSION VBOXCALL supdrvSessionHashTabLookup(PSUPDRVDEVEXT pDevExt, RTPROCESS Process, RTR0PROCESS R0Process,
+                                                   PSUPDRVSESSION *ppOsSessionPtr)
+{
+    PSUPDRVSESSION  pCur;
+    unsigned        iHash;
+
+    /*
+     * Validate input.
+     */
+    AssertReturn(R0Process != NIL_RTR0PROCESS, NULL);
+
+    /*
+     * Calculate the hash table index and acquire the spinlock.
+     */
+    iHash = SUPDRV_SESSION_HASH(Process);
+
+    RTSpinlockAcquire(pDevExt->hSessionHashTabSpinlock);
+
+    /*
+     * If an OS session pointer is provided, always use it.
+     */
+    if (ppOsSessionPtr)
+    {
+        pCur = *ppOsSessionPtr;
+        if (   pCur
+            && (   pCur->ppOsSessionPtr != ppOsSessionPtr
+                || pCur->Process        != Process
+                || pCur->R0Process      != R0Process) )
+            pCur = NULL;
+    }
+    else
+    {
+        /*
+         * Otherwise, do the hash table lookup.
+         */
+        pCur = pDevExt->apSessionHashTab[iHash];
+        while (   pCur
+               && (   pCur->Process   != Process
+                   || pCur->R0Process != R0Process) )
+            pCur = pCur->pCommonNextHash;
+    }
+
+    /*
+     * Retain the session.
+     */
+    if (pCur)
+    {
+        uint32_t cRefs = ASMAtomicIncU32(&pCur->cRefs);
+        NOREF(cRefs);
+        Assert(cRefs > 1 && cRefs < _1M);
+    }
+
+    RTSpinlockRelease(pDevExt->hSessionHashTabSpinlock);
+
+    return pCur;
 }
 
 
@@ -1021,7 +1295,7 @@ uint32_t VBOXCALL supdrvSessionRelease(PSUPDRVSESSION pSession)
     cRefs = ASMAtomicDecU32(&pSession->cRefs);
     AssertMsg(cRefs < _1M, ("%#x %p\n", cRefs, pSession));
     if (cRefs == 0)
-        supdrvCloseSession(pSession->pDevExt, pSession);
+        supdrvDestroySession(pSession->pDevExt, pSession);
     return cRefs;
 }
 
diff --git a/src/VBox/HostDrivers/Support/SUPDrvIOC.h b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
index 6d19ebc..c01da48 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvIOC.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
@@ -1,4 +1,4 @@
-/* $Revision: 91386 $ */
+/* $Revision: 94789 $ */
 /** @file
  * VirtualBox Support Driver - IOCtl definitions.
  */
@@ -57,6 +57,10 @@
 # define SUP_CTL_CODE_FAST(Function)            CTL_CODE(FILE_DEVICE_UNKNOWN, (Function) | SUP_IOCTL_FLAG, METHOD_NEITHER,  FILE_WRITE_ACCESS)
 # define SUP_CTL_CODE_NO_SIZE(uIOCtl)           (uIOCtl)
 
+# define SUP_NT_STATUS_BASE                     UINT32_C(0xe9860000) /**< STATUS_SEVERITY_ERROR + C-bit + facility 0x986. */
+# define SUP_NT_STATUS_IS_VBOX(a_rcNt)          ( ((uint32_t)(a_rcNt) & 0xffff0000) == SUP_NT_STATUS_BASE )
+# define SUP_NT_STATUS_TO_VBOX(a_rcNt)          ( (int)((uint32_t)(a_rcNt) | UINT32_C(0xffff0000)) )
+
 #elif defined(RT_OS_SOLARIS)
   /* No automatic buffering, size limited to 255 bytes. */
 # include <sys/ioccom.h>
diff --git a/src/VBox/HostDrivers/Support/SUPDrvInternal.h b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
index cca6c30..ee87f71 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvInternal.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvInternal.h
@@ -58,7 +58,7 @@
 #       define _interlockedbittestandset64    _interlockedbittestandset64_StupidDDKVsCompilerCrap
 #       define _interlockedbittestandreset64  _interlockedbittestandreset64_StupidDDKVsCompilerCrap
 #       pragma warning(disable : 4163)
-#       include <ntddk.h>
+#       include <iprt/nt/nt.h>
 #       pragma warning(default : 4163)
 #       undef  _InterlockedExchange
 #       undef  _InterlockedExchangeAdd
@@ -69,7 +69,7 @@
 #       undef  _interlockedbittestandset64
 #       undef  _interlockedbittestandreset64
 #   else
-#       include <ntddk.h>
+#       include <iprt/nt/nt.h>
 #   endif
 #   include <memory.h>
 #   define memcmp(a,b,c) mymemcmp(a,b,c)
@@ -177,6 +177,13 @@
  */
 #define OSDBGPRINT(a) SUPR0Printf a
 
+/** Debug printf macro shared with the ring-3 part. */
+#ifdef DEBUG_bird
+# define SUP_DPRINTF(a) SUPR0Printf a
+#else
+# define SUP_DPRINTF(a) do { } while (0)
+#endif
+
 
 /** @name Context values for the per-session handle tables.
  * The context value is used to distinguish between the different kinds of
@@ -418,8 +425,24 @@ typedef struct SUPDRVSESSION
     uint32_t                        u32Cookie;
     /** Set if is an unrestricted session, clear if restricted. */
     bool                            fUnrestricted;
-    /* Reference counter. */
+
+    /** Set if we're in the hash table, clear if not.  Protected by the hash
+     * table spinlock. */
+    bool                            fInHashTable;
+    /** Reference counter. */
     uint32_t volatile               cRefs;
+    /** Pointer to the next session with the same hash (common hash table).
+     *  Protected by the hash table spinlock. */
+    PSUPDRVSESSION                  pCommonNextHash;
+    /** Pointer to the OS specific session pointer, if available and in use.
+     * This is atomically set and cleared as the session is inserted and removed
+     * from the hash table (protected by the session hash table spinlock). */
+    PSUPDRVSESSION                 *ppOsSessionPtr;
+    /** The process (id) of the session. */
+    RTPROCESS                       Process;
+    /** Which process this session is associated with.
+     * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */
+    RTR0PROCESS                     R0Process;
 
     /** The VM associated with the session. */
     PVM                             pVM;
@@ -429,7 +452,9 @@ typedef struct SUPDRVSESSION
     /** Load usage records. (protected by SUPDRVDEVEXT::mtxLdr) */
     PSUPDRVLDRUSAGE volatile        pLdrUsage;
 
-    /** Spinlock protecting the bundles and the GIP members. */
+    /** Spinlock protecting the bundles, the GIP members and the
+     * fProcessCleanupDone flag.  It continues to be valid until the last
+     * reference to the session is released. */
     RTSPINLOCK                      Spinlock;
     /** The ring-3 mapping of the GIP (readonly). */
     RTR0MEMOBJ                      GipMapObjR3;
@@ -444,11 +469,6 @@ typedef struct SUPDRVSESSION
     RTUID                           Uid;
     /** The group id of the session. (Set by the OS part.) */
     RTGID                           Gid;
-    /** The process (id) of the session. */
-    RTPROCESS                       Process;
-    /** Which process this session is associated with.
-     * This is NIL_RTR0PROCESS for kernel sessions and valid for user ones. */
-    RTR0PROCESS                     R0Process;
     /** Per session tracer specfic data. */
     uintptr_t                       uTracerData;
     /** The thread currently actively talking to the tracer. (One at the time!) */
@@ -481,6 +501,10 @@ typedef struct SUPDRVSESSION
     /** Pointer to the next session with the same hash. */
     PSUPDRVSESSION                  pNextHash;
 # endif
+# if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
+    /** Pointer to the process protection structure for this session. */
+    struct SUPDRVNTPROTECT         *pNtProtect;
+# endif
 #endif /* !SUPDRV_AGNOSTIC */
 } SUPDRVSESSION;
 
@@ -596,8 +620,21 @@ typedef struct SUPDRVDEVEXT
     /** Hash table for user tracer modules (SUPDRVVTGCOPY). */
     RTLISTANCHOR                    aTrackerUmodHash[128];
 
+    /** @name Session Handle Table.
+     * @{ */
+    /** Spinlock protecting apSessionHashTab, cSessions,
+     * SUPDRVSESSION::ppOsSessionPtr, SUPDRVSESSION::pCommonNextHash, and possibly
+     * others depending on the OS. */
+    RTSPINLOCK                      hSessionHashTabSpinlock;
+    /** Session hash table hash table.  The size of this table must make sense in
+     * comparison to GVMM_MAX_HANDLES. */
+    PSUPDRVSESSION                  apSessionHashTab[HC_ARCH_BITS == 64 ? 8191 : 127];
+    /** The number of open sessions. */
+    int32_t                         cSessions;
+    /** @} */
+
     /*
-     * Note! The non-agnostic bits must be a the very end of the structure!
+     * Note! The non-agnostic bits must be at the very end of the structure!
      */
 #ifndef SUPDRV_AGNOSTIC
 # ifdef RT_OS_WINDOWS
@@ -609,12 +646,43 @@ typedef struct SUPDRVDEVEXT
 #endif
 } SUPDRVDEVEXT;
 
+/** Calculates the index into g_apSessionHashTab.*/
+#define SUPDRV_SESSION_HASH(a_pid)     ( (a_pid) % RT_ELEMENTS(((SUPDRVDEVEXT *)NULL)->apSessionHashTab) )
+
 
 RT_C_DECLS_BEGIN
 
 /*******************************************************************************
 *   OS Specific Functions                                                      *
 *******************************************************************************/
+/**
+ * Called to clean up the session structure before it's freed.
+ *
+ * @param   pDevExt             The device globals.
+ * @param   pSession            The session that's being cleaned up.
+ */
+void VBOXCALL   supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession);
+
+/**
+ * Called to let the OS specfic code perform additional insertion work while
+ * still under the protection of the hash table spinlock.
+ *
+ * @param   pDevExt             The device globals.
+ * @param   pSession            The session that was inserted.
+ * @param   pvUser              User context specified to the insert call.
+ */
+void VBOXCALL   supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+
+/**
+ * Called to let the OS specfic code perform additional removal work while still
+ * under the protection of the hash table spinlock.
+ *
+ * @param   pDevExt             The device globals.
+ * @param   pSession            The session that was removed.
+ * @param   pvUser              User context specified to the remove call.
+ */
+void VBOXCALL   supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+
 void VBOXCALL   supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession);
 bool VBOXCALL   supdrvOSObjCanAccess(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession, const char *pszObjName, int *prc);
 bool VBOXCALL   supdrvOSGetForcedAsyncTscMode(PSUPDRVDEVEXT pDevExt);
@@ -699,6 +767,10 @@ int  VBOXCALL   supdrvIDC(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSIO
 int  VBOXCALL   supdrvInitDevExt(PSUPDRVDEVEXT pDevExt, size_t cbSession);
 void VBOXCALL   supdrvDeleteDevExt(PSUPDRVDEVEXT pDevExt);
 int  VBOXCALL   supdrvCreateSession(PSUPDRVDEVEXT pDevExt, bool fUser, bool fUnrestricted,  PSUPDRVSESSION *ppSession);
+int  VBOXCALL   supdrvSessionHashTabInsert(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PSUPDRVSESSION *ppOsSessionPtr, void *pvUser);
+int  VBOXCALL   supdrvSessionHashTabRemove(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser);
+PSUPDRVSESSION VBOXCALL supdrvSessionHashTabLookup(PSUPDRVDEVEXT pDevExt, RTPROCESS Process, RTR0PROCESS R0Process,
+                                                   PSUPDRVSESSION *ppOsSessionPtr);
 uint32_t VBOXCALL supdrvSessionRetain(PSUPDRVSESSION pSession);
 uint32_t VBOXCALL supdrvSessionRelease(PSUPDRVSESSION pSession);
 
diff --git a/src/VBox/HostDrivers/Support/SUPLib.cpp b/src/VBox/HostDrivers/Support/SUPLib.cpp
index d408bf2..af5e97b 100644
--- a/src/VBox/HostDrivers/Support/SUPLib.cpp
+++ b/src/VBox/HostDrivers/Support/SUPLib.cpp
@@ -1466,6 +1466,26 @@ SUPR3DECL(int) SUPR3LowFree(void *pv, size_t cPages)
 }
 
 
+SUPR3DECL(int) SUPR3HardenedVerifyInit(void)
+{
+#ifdef RT_OS_WINDOWS
+    if (g_cInits == 0)
+        return suplibOsHardenedVerifyInit();
+#endif
+    return VINF_SUCCESS;
+}
+
+
+SUPR3DECL(int) SUPR3HardenedVerifyTerm(void)
+{
+#ifdef RT_OS_WINDOWS
+    if (g_cInits == 0)
+        return suplibOsHardenedVerifyTerm();
+#endif
+    return VINF_SUCCESS;
+}
+
+
 SUPR3DECL(int) SUPR3HardenedVerifyFile(const char *pszFilename, const char *pszMsg, PRTFILE phFile)
 {
     /*
@@ -1541,7 +1561,7 @@ SUPR3DECL(int) SUPR3HardenedVerifySelf(const char *pszArgv0, bool fInternal, PRT
     /*
      * Verify that the image file and parent directories are sane.
      */
-    rc = supR3HardenedVerifyFile(szExecPath, RTHCUINTPTR_MAX, pErrInfo);
+    rc = supR3HardenedVerifyFile(szExecPath, RTHCUINTPTR_MAX, false /*fMaybe3rdParty*/, pErrInfo);
     if (RT_FAILURE(rc))
         return rc;
 #endif
@@ -1585,7 +1605,7 @@ SUPR3DECL(int) SUPR3HardenedVerifyPlugIn(const char *pszFilename, PRTERRINFO pEr
      * Only do the actual check in hardened builds.
      */
 #ifdef VBOX_WITH_HARDENING
-    int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, pErrInfo);
+    int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, true /*fMaybe3rdParty*/, pErrInfo);
     if (RT_FAILURE(rc) && !RTErrInfoIsSet(pErrInfo))
         LogRel(("supR3HardenedVerifyFile: Verification of \"%s\" failed, rc=%Rrc\n", pszFilename, rc));
     return rc;
@@ -2288,7 +2308,7 @@ SUPR3DECL(int) SUPR3HardenedLdrLoadPlugIn(const char *pszFilename, PRTLDRMOD phL
     /*
      * Verify the image file.
      */
-    int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, pErrInfo);
+    int rc = supR3HardenedVerifyFile(pszFilename, RTHCUINTPTR_MAX, true /*fMaybe3rdParty*/, pErrInfo);
     if (RT_FAILURE(rc))
     {
         if (!RTErrInfoIsSet(pErrInfo))
diff --git a/src/VBox/HostDrivers/Support/SUPLibInternal.h b/src/VBox/HostDrivers/Support/SUPLibInternal.h
index bb186be..1348bf9 100644
--- a/src/VBox/HostDrivers/Support/SUPLibInternal.h
+++ b/src/VBox/HostDrivers/Support/SUPLibInternal.h
@@ -99,6 +99,50 @@
 #endif /* IN_SUP_HARDENED_R3 */
 
 
+/** @name CRT function mappings (not using CRT on Windows).
+ * @{
+ */
+#if defined(IN_SUP_HARDENED_R3) && defined(RT_OS_WINDOWS)
+# define SUP_HARDENED_NEED_CRT_FUNCTIONS
+DECLHIDDEN(int)    suplibHardenedMemComp(void const *pvDst, const void *pvSrc, size_t cbToComp);
+DECLHIDDEN(void *) suplibHardenedMemCopy(void *pvDst, const void *pvSrc, size_t cbToCopy);
+DECLHIDDEN(void *) suplibHardenedMemSet(void *pvDst, int ch, size_t cbToSet);
+DECLHIDDEN(char *) suplibHardenedStrCopy(char *pszDst, const char *pszSrc);
+DECLHIDDEN(size_t) suplibHardenedStrLen(const char *psz);
+DECLHIDDEN(char *) suplibHardenedStrCat(char *pszDst, const char *pszSrc);
+DECLHIDDEN(int)    suplibHardenedStrCmp(const char *psz1, const char *psz2);
+DECLHIDDEN(int)    suplibHardenedStrNCmp(const char *psz1, const char *psz2, size_t cchMax);
+DECLHIDDEN(int)    suplibHardenedStrICmp(const char *psz1, const char *psz2);
+#else
+# undef SUP_HARDENED_NEED_CRT_FUNCTIONS
+# define suplibHardenedMemComp memcmp
+# define suplibHardenedMemCopy memcpy
+# define suplibHardenedMemSet  memset
+# define suplibHardenedStrCopy strcpy
+# define suplibHardenedStrLen  strlen
+# define suplibHardenedStrCat  strcat
+# define suplibHardenedStrCmp  strcmp
+# define suplibHardenedStrNCmp strncmp
+# define suplibHardenedStrICmp stricmp
+#endif
+DECLNORETURN(void)  suplibHardenedExit(RTEXITCODE rcExit);
+DECLHIDDEN(void)    suplibHardenedPrintF(const char *pszFormat, ...);
+DECLHIDDEN(void)    suplibHardenedPrintFV(const char *pszFormat, va_list va);
+
+/** @} */
+
+/** Debug output macro. */
+#ifdef DEBUG_bird
+# ifdef IN_SUP_HARDENED_R3
+#  define SUP_DPRINTF(a)    suplibHardenedPrintF a
+# else
+#  define SUP_DPRINTF(a)    RTLogPrintf a
+# endif
+#else
+# define SUP_DPRINTF(a)     do { } while (0)
+#endif
+
+
 /*******************************************************************************
 *   Structures and Typedefs                                                    *
 *******************************************************************************/
@@ -110,9 +154,12 @@ typedef enum SUPINSTFILETYPE
     kSupIFT_Invalid = 0,
     kSupIFT_Exe,
     kSupIFT_Dll,
+    kSupIFT_Rc,
     kSupIFT_Sys,
     kSupIFT_Script,
     kSupIFT_Data,
+    kSupIFT_TestExe,
+    kSupIFT_TestDll,
     kSupIFT_End
 } SUPINSTFILETYPE;
 
@@ -128,6 +175,7 @@ typedef enum SUPINSTDIR
     kSupID_AppPrivArch,
     kSupID_AppPrivArchComp,
     kSupID_AppPrivNoArch,
+    kSupID_Testcase,
     kSupID_End
 } SUPINSTDIR;
 
@@ -251,6 +299,17 @@ typedef DECLCALLBACK(int) FNSUPR3PREINIT(PSUPPREINITDATA pPreInitData, uint32_t
 /** Pointer to supR3PreInit. */
 typedef FNSUPR3PREINIT *PFNSUPR3PREINIT;
 
+/** The current SUPR3HardenedMain state / location. */
+typedef enum SUPR3HARDENEDMAINSTATE
+{
+    SUPR3HARDENEDMAINSTATE_NOT_YET_CALLED = 0,
+    SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY,
+    SUPR3HARDENEDMAINSTATE_INIT_RUNTIME,
+    SUPR3HARDENEDMAINSTATE_GET_TRUSTED_MAIN,
+    SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN,
+    SUPR3HARDENEDMAINSTATE_END
+} SUPR3HARDENEDMAINSTATE;
+
 
 /*******************************************************************************
 *   Global Variables                                                           *
@@ -258,6 +317,7 @@ typedef FNSUPR3PREINIT *PFNSUPR3PREINIT;
 extern DECLHIDDEN(uint32_t)     g_u32Cookie;
 extern DECLHIDDEN(uint32_t)     g_u32SessionCookie;
 extern DECLHIDDEN(SUPLIBDATA)   g_supLibData;
+extern DECLHIDDEN(SUPR3HARDENEDMAINSTATE) g_enmSupR3HardenedMainState;
 
 
 /*******************************************************************************
@@ -268,6 +328,8 @@ int     suplibOsInstall(void);
 int     suplibOsUninstall(void);
 int     suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted);
 int     suplibOsTerm(PSUPLIBDATA pThis);
+int     suplibOsHardenedVerifyInit(void);
+int     suplibOsHardenedVerifyTerm(void);
 int     suplibOsIOCtl(PSUPLIBDATA pThis, uintptr_t uFunction, void *pvReq, size_t cbReq);
 int     suplibOsIOCtlFast(PSUPLIBDATA pThis, uintptr_t uFunction, uintptr_t idCpu);
 int     suplibOsPageAlloc(PSUPLIBDATA pThis, size_t cPages, void **ppvPages);
@@ -330,14 +392,29 @@ DECLHIDDEN(int)    supR3HardenedErrorV(int rc, bool fFatal, const char *pszForma
  * Display an error which may or may not be fatal.
  */
 DECLHIDDEN(int)     supR3HardenedError(int rc, bool fFatal, const char *pszFormat, ...);
+
 DECLHIDDEN(int)     supR3HardenedVerifyAll(bool fFatal, bool fLeaveFilesOpen, const char *pszProgName);
 DECLHIDDEN(int)     supR3HardenedVerifyFixedDir(SUPINSTDIR enmDir, bool fFatal);
 DECLHIDDEN(int)     supR3HardenedVerifyFixedFile(const char *pszFilename, bool fFatal);
 DECLHIDDEN(int)     supR3HardenedVerifyDir(const char *pszDirPath, bool fRecursive, bool fCheckFiles, PRTERRINFO pErrInfo);
-DECLHIDDEN(int)     supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, PRTERRINFO pErrInfo);
+DECLHIDDEN(int)     supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, bool fMaybe3rdParty,
+                                            PRTERRINFO pErrInfo);
 DECLHIDDEN(void)    supR3HardenedGetPreInitData(PSUPPREINITDATA pPreInitData);
 DECLHIDDEN(int)     supR3HardenedRecvPreInitData(PCSUPPREINITDATA pPreInitData);
 
+#ifdef RT_OS_WINDOWS
+DECLHIDDEN(void)    supR3HardenedWinInit(uint32_t fFlags);
+DECLHIDDEN(void)    supR3HardenedWinInitVersion(void);
+DECLHIDDEN(void)    supR3HardenedWinVerifyProcess(void);
+DECLHIDDEN(void)    supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation(void);
+DECLHIDDEN(bool)    supR3HardenedWinIsReSpawnNeeded(int cArgs, char **papszArgs);
+DECLHIDDEN(int)     supR3HardenedWinReSpawn(void);
+DECLHIDDEN(void *)  supR3HardenedWinLoadLibrary(const char *pszName, bool fSystem32Only);
+extern RTUTF16      g_wszSupLibHardenedExePath[1024];
+# ifdef RTPATH_MAX
+extern char         g_szSupLibHardenedExePath[RTPATH_MAX];
+# endif
+#endif
 
 SUPR3DECL(int)      supR3PageLock(void *pvStart, size_t cPages, PSUPPAGE paPages);
 SUPR3DECL(int)      supR3PageUnlock(void *pvStart);
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
index 16ca464..acd3e68 100644
--- a/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -34,10 +34,10 @@
 # include <stdio.h>
 # include <stdlib.h>
 # include <dlfcn.h>
+# include <unistd.h>
 
 #elif RT_OS_WINDOWS
 # include <Windows.h>
-# include <stdio.h>
 
 #else /* UNIXes */
 # include <iprt/types.h> /* stdint fun on darwin. */
@@ -50,7 +50,6 @@
 # include <unistd.h>
 # include <sys/stat.h>
 # include <sys/time.h>
-# include <stdio.h>
 # include <sys/types.h>
 # if defined(RT_OS_LINUX)
 #  undef USE_LIB_PCAP /* don't depend on libcap as we had to depend on either
@@ -78,6 +77,7 @@
 
 #include <VBox/sup.h>
 #include <VBox/err.h>
+#include <iprt/ctype.h>
 #include <iprt/string.h>
 #include <iprt/initterm.h>
 #include <iprt/param.h>
@@ -120,25 +120,31 @@ typedef FNRTR3INITEX *PFNRTR3INITEX;
 *   Global Variables                                                           *
 *******************************************************************************/
 /** The pre-init data we pass on to SUPR3 (residing in VBoxRT). */
-static SUPPREINITDATA g_SupPreInitData;
+static SUPPREINITDATA   g_SupPreInitData;
 /** The program executable path. */
-static char g_szSupLibHardenedExePath[RTPATH_MAX];
+#ifndef RT_OS_WINDOWS
+static
+#endif
+char                    g_szSupLibHardenedExePath[RTPATH_MAX];
 /** The program directory path. */
-static char g_szSupLibHardenedDirPath[RTPATH_MAX];
+static char             g_szSupLibHardenedDirPath[RTPATH_MAX];
 
 /** The program name. */
-static const char *g_pszSupLibHardenedProgName;
+static const char      *g_pszSupLibHardenedProgName;
 
 #ifdef SUP_HARDENED_SUID
 /** The real UID at startup. */
-static uid_t g_uid;
+static uid_t            g_uid;
 /** The real GID at startup. */
-static gid_t g_gid;
+static gid_t            g_gid;
 # ifdef RT_OS_LINUX
-static uint32_t g_uCaps;
+static uint32_t         g_uCaps;
 # endif
 #endif
 
+/** The current SUPR3HardenedMain state / location. */
+SUPR3HARDENEDMAINSTATE  g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_NOT_YET_CALLED;
+
 
 /*******************************************************************************
 *   Internal Functions                                                         *
@@ -150,6 +156,496 @@ static PFNSUPTRUSTEDERROR supR3HardenedMainGetTrustedError(const char *pszProgNa
 
 
 /**
+ * Safely copy one or more strings into the given buffer.
+ *
+ * @returns VINF_SUCCESS or VERR_BUFFER_OVERFLOW.
+ * @param   pszDst              The destionation buffer.
+ * @param   cbDst               The size of the destination buffer.
+ * @param   ...                 One or more zero terminated strings, ending with
+ *                              a NULL.
+ */
+static int suplibHardenedStrCopyEx(char *pszDst, size_t cbDst, ...)
+{
+    int rc = VINF_SUCCESS;
+
+    if (cbDst == 0)
+        return VERR_BUFFER_OVERFLOW;
+
+    va_list va;
+    va_start(va, cbDst);
+    for (;;)
+    {
+        const char *pszSrc = va_arg(va, const char *);
+        if (!pszSrc)
+            break;
+
+        size_t cchSrc = suplibHardenedStrLen(pszSrc);
+        if (cchSrc < cbDst)
+        {
+            suplibHardenedMemCopy(pszDst, pszSrc, cchSrc);
+            pszDst += cchSrc;
+            cbDst  -= cchSrc;
+        }
+        else
+        {
+            rc = VERR_BUFFER_OVERFLOW;
+            if (cbDst > 1)
+            {
+                suplibHardenedMemCopy(pszDst, pszSrc, cbDst - 1);
+                pszDst += cbDst - 1;
+                cbDst   = 1;
+            }
+        }
+        *pszDst = '\0';
+    }
+    va_end(va);
+
+    return rc;
+}
+
+
+/**
+ * Exit current process in the quickest possible fashion.
+ *
+ * @param   rcExit      The exit code.
+ */
+DECLNORETURN(void) suplibHardenedExit(RTEXITCODE rcExit)
+{
+    for (;;)
+#ifdef RT_OS_WINDOWS
+        ExitProcess(rcExit);
+#else
+        _Exit(rcExit);
+#endif
+}
+
+
+/**
+ * Writes a substring to standard error.
+ *
+ * @param   pch                 The start of the substring.
+ * @param   cch                 The length of the substring.
+ */
+static void suplibHardenedPrintStrN(const char *pch, size_t cch)
+{
+#ifdef RT_OS_WINDOWS
+    DWORD cbWrittenIgn;
+    WriteFile(GetStdHandle(STD_ERROR_HANDLE), pch, (DWORD)cch, &cbWrittenIgn, NULL);
+#else
+    (void)write(2, pch, cch);
+#endif
+}
+
+
+/**
+ * Writes a string to standard error.
+ *
+ * @param   psz                 The string.
+ */
+static void suplibHardenedPrintStr(const char *psz)
+{
+    suplibHardenedPrintStrN(psz, suplibHardenedStrLen(psz));
+}
+
+
+/**
+ * Writes a char to standard error.
+ *
+ * @param   ch                  The character value to write.
+ */
+static void suplibHardenedPrintChr(char ch)
+{
+    suplibHardenedPrintStrN(&ch, 1);
+}
+
+
+/**
+ * Writes a decimal number to stdard error.
+ *
+ * @param   uValue              The value.
+ */
+static void suplibHardenedPrintDecimal(uint64_t uValue)
+{
+    char    szBuf[64];
+    char   *pszEnd = &szBuf[sizeof(szBuf) - 1];
+    char   *psz    = pszEnd;
+
+    *psz-- = '\0';
+
+    do
+    {
+        *psz-- = '0' + (uValue % 10);
+        uValue /= 10;
+    } while (uValue > 0);
+
+    psz++;
+    suplibHardenedPrintStrN(psz, pszEnd - psz);
+}
+
+
+/**
+ * Writes a hexadecimal or octal number to standard error.
+ *
+ * @param   uValue              The value.
+ * @param   uBase               The base (16 or 8).
+ * @param   fFlags              Format flags.
+ */
+static void suplibHardenedPrintHexOctal(uint64_t uValue, unsigned uBase, uint32_t fFlags)
+{
+    static char const   s_achDigitsLower[17] = "0123456789abcdef";
+    static char const   s_achDigitsUpper[17] = "0123456789ABCDEF";
+    const char         *pchDigits   = !(fFlags & RTSTR_F_CAPITAL) ? s_achDigitsLower : s_achDigitsUpper;
+    unsigned            cShift      = uBase == 16 ?   4 : 3;
+    unsigned            fDigitMask  = uBase == 16 ? 0xf : 7;
+    char                szBuf[64];
+    char               *pszEnd = &szBuf[sizeof(szBuf) - 1];
+    char               *psz    = pszEnd;
+
+    *psz-- = '\0';
+
+    do
+    {
+        *psz-- = pchDigits[uValue & fDigitMask];
+        uValue >>= cShift;
+    } while (uValue > 0);
+
+    if ((fFlags & RTSTR_F_SPECIAL) && uBase == 16)
+    {
+        *psz-- = !(fFlags & RTSTR_F_CAPITAL) ? 'x' : 'X';
+        *psz-- = '0';
+    }
+
+    psz++;
+    suplibHardenedPrintStrN(psz, pszEnd - psz);
+}
+
+
+/**
+ * Writes a wide character string to standard error.
+ *
+ * @param   pwsz                The string.
+ */
+static void suplibHardenedPrintWideStr(PCRTUTF16 pwsz)
+{
+    for (;;)
+    {
+        RTUTF16 wc = *pwsz++;
+        if (!wc)
+            return;
+        if (   (wc < 0x7f && wc >= 0x20)
+            || wc == '\n'
+            || wc == '\r')
+            suplibHardenedPrintChr((char)wc);
+        else
+        {
+            suplibHardenedPrintStrN(RT_STR_TUPLE("\\x"));
+            suplibHardenedPrintHexOctal(wc, 16, 0);
+        }
+    }
+}
+
+#ifdef IPRT_NO_CRT
+
+/** Buffer structure used by suplibHardenedOutput. */
+struct SUPLIBHARDENEDOUTPUTBUF
+{
+    size_t off;
+    char   szBuf[2048];
+};
+
+/** Callback for RTStrFormatV, see FNRTSTROUTPUT. */
+static DECLCALLBACK(size_t) suplibHardenedOutput(void *pvArg, const char *pachChars, size_t cbChars)
+{
+    SUPLIBHARDENEDOUTPUTBUF *pBuf = (SUPLIBHARDENEDOUTPUTBUF *)pvArg;
+    size_t cbTodo = cbChars;
+    for (;;)
+    {
+        size_t cbSpace = sizeof(pBuf->szBuf) - pBuf->off - 1;
+
+        /* Flush the buffer? */
+        if (   cbSpace == 0
+            || (cbTodo == 0 && pBuf->off))
+        {
+            suplibHardenedPrintStrN(pBuf->szBuf, pBuf->off);
+# ifdef RT_OS_WINDOWS
+            OutputDebugString(pBuf->szBuf);
+# endif
+            pBuf->off = 0;
+            cbSpace = sizeof(pBuf->szBuf) - 1;
+        }
+
+        /* Copy the string into the buffer. */
+        if (cbTodo == 1)
+        {
+            pBuf->szBuf[pBuf->off++] = *pachChars;
+            break;
+        }
+        if (cbSpace >= cbTodo)
+        {
+            memcpy(&pBuf->szBuf[pBuf->off], pachChars, cbTodo);
+            pBuf->off += cbTodo;
+            break;
+        }
+        memcpy(&pBuf->szBuf[pBuf->off], pachChars, cbSpace);
+        pBuf->off += cbSpace;
+        cbTodo -= cbSpace;
+    }
+    pBuf->szBuf[pBuf->off] = '\0';
+
+    return cbChars;
+}
+
+#endif /* IPRT_NO_CRT */
+
+/**
+ * Simple printf to standard error.
+ *
+ * @param   pszFormat   The format string.
+ * @param   va          Arguments to format.
+ */
+DECLHIDDEN(void) suplibHardenedPrintFV(const char *pszFormat, va_list va)
+{
+#ifdef IPRT_NO_CRT
+    /*
+     * Use buffered output here to avoid character mixing on the windows
+     * console and to enable us to use OutputDebugString.
+     */
+    SUPLIBHARDENEDOUTPUTBUF Buf;
+    Buf.off = 0;
+    Buf.szBuf[0] = '\0';
+    RTStrFormatV(suplibHardenedOutput, &Buf, NULL, NULL, pszFormat, va);
+
+#else /* !IPRT_NO_CRT */
+    /*
+     * Format loop.
+     */
+    char ch;
+    const char *pszLast = pszFormat;
+    for (;;)
+    {
+        ch = *pszFormat;
+        if (!ch)
+            break;
+        pszFormat++;
+
+        if (ch == '%')
+        {
+            /*
+             * Format argument.
+             */
+
+            /* Flush unwritten bits. */
+            if (pszLast != pszFormat - 1)
+                suplibHardenedPrintStrN(pszLast, pszFormat - pszLast - 1);
+            pszLast = pszFormat;
+            ch = *pszFormat++;
+
+            /* flags. */
+            uint32_t fFlags = 0;
+            for (;;)
+            {
+                if (ch == '#')          fFlags |= RTSTR_F_SPECIAL;
+                else if (ch == '-')     fFlags |= RTSTR_F_LEFT;
+                else if (ch == '+')     fFlags |= RTSTR_F_PLUS;
+                else if (ch == ' ')     fFlags |= RTSTR_F_BLANK;
+                else if (ch == '0')     fFlags |= RTSTR_F_ZEROPAD;
+                else if (ch == '\'')    fFlags |= RTSTR_F_THOUSAND_SEP;
+                else                    break;
+                ch = *pszFormat++;
+            }
+
+            /* Width and precision - ignored. */
+            while (RT_C_IS_DIGIT(ch))
+                ch = *pszFormat++;
+            if (ch == '*')
+                va_arg(va, int);
+            if (ch == '.')
+            {
+                do ch = *pszFormat++;
+                while (RT_C_IS_DIGIT(ch));
+                if (ch == '*')
+                    va_arg(va, int);
+            }
+
+            /* Size. */
+            char chArgSize = 0;
+            switch (ch)
+            {
+                case 'z':
+                case 'L':
+                case 'j':
+                case 't':
+                    chArgSize = ch;
+                    ch = *pszFormat++;
+                    break;
+
+                case 'l':
+                    chArgSize = ch;
+                    ch = *pszFormat++;
+                    if (ch == 'l')
+                    {
+                        chArgSize = 'L';
+                        ch = *pszFormat++;
+                    }
+                    break;
+
+                case 'h':
+                    chArgSize = ch;
+                    ch = *pszFormat++;
+                    if (ch == 'h')
+                    {
+                        chArgSize = 'H';
+                        ch = *pszFormat++;
+                    }
+                    break;
+            }
+
+            /*
+             * Do type specific formatting.
+             */
+            switch (ch)
+            {
+                case 'c':
+                    ch = (char)va_arg(va, int);
+                    suplibHardenedPrintChr(ch);
+                    break;
+
+                case 's':
+                    if (chArgSize == 'l')
+                    {
+                        PCRTUTF16 pwszStr = va_arg(va, PCRTUTF16 );
+                        if (RT_VALID_PTR(pwszStr))
+                            suplibHardenedPrintWideStr(pwszStr);
+                        else
+                            suplibHardenedPrintStr("<NULL>");
+                    }
+                    else
+                    {
+                        const char *pszStr = va_arg(va, const char *);
+                        if (!RT_VALID_PTR(pszStr))
+                            pszStr = "<NULL>";
+                        suplibHardenedPrintStr(pszStr);
+                    }
+                    break;
+
+                case 'd':
+                case 'i':
+                {
+                    int64_t iValue;
+                    if (chArgSize == 'L' || chArgSize == 'j')
+                        iValue = va_arg(va, int64_t);
+                    else if (chArgSize == 'l')
+                        iValue = va_arg(va, signed long);
+                    else if (chArgSize == 'z' || chArgSize == 't')
+                        iValue = va_arg(va, intptr_t);
+                    else
+                        iValue = va_arg(va, signed int);
+                    if (iValue < 0)
+                    {
+                        suplibHardenedPrintChr('-');
+                        iValue = -iValue;
+                    }
+                    suplibHardenedPrintDecimal(iValue);
+                    break;
+                }
+
+                case 'p':
+                case 'x':
+                case 'X':
+                case 'u':
+                case 'o':
+                {
+                    unsigned uBase = 10;
+                    uint64_t uValue;
+
+                    switch (ch)
+                    {
+                        case 'p':
+                            fFlags |= RTSTR_F_ZEROPAD; /* Note not standard behaviour (but I like it this way!) */
+                            uBase = 16;
+                            break;
+                        case 'X':
+                            fFlags |= RTSTR_F_CAPITAL;
+                        case 'x':
+                            uBase = 16;
+                            break;
+                        case 'u':
+                            uBase = 10;
+                            break;
+                        case 'o':
+                            uBase = 8;
+                            break;
+                    }
+
+                    if (ch == 'p' || chArgSize == 'z' || chArgSize == 't')
+                        uValue = va_arg(va, uintptr_t);
+                    else if (chArgSize == 'L' || chArgSize == 'j')
+                        uValue = va_arg(va, uint64_t);
+                    else if (chArgSize == 'l')
+                        uValue = va_arg(va, unsigned long);
+                    else
+                        uValue = va_arg(va, unsigned int);
+
+                    if (uBase == 10)
+                        suplibHardenedPrintDecimal(uValue);
+                    else
+                        suplibHardenedPrintHexOctal(uValue, uBase, fFlags);
+                    break;
+                }
+
+                case 'R':
+                    if (pszFormat[0] == 'r' && pszFormat[1] == 'c')
+                    {
+                        int iValue = va_arg(va, int);
+                        if (iValue < 0)
+                        {
+                            suplibHardenedPrintChr('-');
+                            iValue = -iValue;
+                        }
+                        suplibHardenedPrintDecimal(iValue);
+                        pszFormat += 2;
+                        break;
+                    }
+                    /* fall thru */
+
+                /*
+                 * Custom format.
+                 */
+                default:
+                    suplibHardenedPrintStr("[bad format: ");
+                    suplibHardenedPrintStrN(pszLast, pszFormat - pszLast);
+                    suplibHardenedPrintChr(']');
+                    break;
+            }
+
+            /* continue */
+            pszLast = pszFormat;
+        }
+    }
+
+    /* Flush the last bits of the string. */
+    if (pszLast != pszFormat)
+        suplibHardenedPrintStrN(pszLast, pszFormat - pszLast);
+#endif /* !IPRT_NO_CRT */
+}
+
+
+/**
+ * Prints to standard error.
+ *
+ * @param   pszFormat   The format string.
+ * @param   ...         Arguments to format.
+ */
+DECLHIDDEN(void) suplibHardenedPrintF(const char *pszFormat, ...)
+{
+    va_list va;
+    va_start(va, pszFormat);
+    suplibHardenedPrintFV(pszFormat, va);
+    va_end(va);
+}
+
+
+/**
  * @copydoc RTPathStripFilename.
  */
 static void suplibHardenedPathStripFilename(char *pszPath)
@@ -229,11 +725,10 @@ DECLHIDDEN(int) supR3HardenedPathAppPrivateNoArch(char *pszPath, size_t cchPath)
 {
 #if !defined(RT_OS_WINDOWS) && defined(RTPATH_APP_PRIVATE)
     const char *pszSrcPath = RTPATH_APP_PRIVATE;
-    size_t cchPathPrivateNoArch = strlen(pszSrcPath);
+    size_t cchPathPrivateNoArch = suplibHardenedStrLen(pszSrcPath);
     if (cchPathPrivateNoArch >= cchPath)
-        supR3HardenedFatal("supR3HardenedPathAppPrivateNoArch: Buffer overflow, %lu >= %lu\n",
-                            (unsigned long)cchPathPrivateNoArch, (unsigned long)cchPath);
-    memcpy(pszPath, pszSrcPath, cchPathPrivateNoArch + 1);
+        supR3HardenedFatal("supR3HardenedPathAppPrivateNoArch: Buffer overflow, %zu >= %zu\n", cchPathPrivateNoArch, cchPath);
+    suplibHardenedMemCopy(pszPath, pszSrcPath, cchPathPrivateNoArch + 1);
     return VINF_SUCCESS;
 
 #else
@@ -249,11 +744,10 @@ DECLHIDDEN(int) supR3HardenedPathAppPrivateArch(char *pszPath, size_t cchPath)
 {
 #if !defined(RT_OS_WINDOWS) && defined(RTPATH_APP_PRIVATE_ARCH)
     const char *pszSrcPath = RTPATH_APP_PRIVATE_ARCH;
-    size_t cchPathPrivateArch = strlen(pszSrcPath);
+    size_t cchPathPrivateArch = suplibHardenedStrLen(pszSrcPath);
     if (cchPathPrivateArch >= cchPath)
-        supR3HardenedFatal("supR3HardenedPathAppPrivateArch: Buffer overflow, %lu >= %lu\n",
-                            (unsigned long)cchPathPrivateArch, (unsigned long)cchPath);
-    memcpy(pszPath, pszSrcPath, cchPathPrivateArch + 1);
+        supR3HardenedFatal("supR3HardenedPathAppPrivateArch: Buffer overflow, %zu >= %zu\n", cchPathPrivateArch, cchPath);
+    suplibHardenedMemCopy(pszPath, pszSrcPath, cchPathPrivateArch + 1);
     return VINF_SUCCESS;
 
 #else
@@ -269,11 +763,10 @@ DECLHIDDEN(int) supR3HardenedPathSharedLibs(char *pszPath, size_t cchPath)
 {
 #if !defined(RT_OS_WINDOWS) && defined(RTPATH_SHARED_LIBS)
     const char *pszSrcPath = RTPATH_SHARED_LIBS;
-    size_t cchPathSharedLibs = strlen(pszSrcPath);
+    size_t cchPathSharedLibs = suplibHardenedStrLen(pszSrcPath);
     if (cchPathSharedLibs >= cchPath)
-        supR3HardenedFatal("supR3HardenedPathSharedLibs: Buffer overflow, %lu >= %lu\n",
-                            (unsigned long)cchPathSharedLibs, (unsigned long)cchPath);
-    memcpy(pszPath, pszSrcPath, cchPathSharedLibs + 1);
+        supR3HardenedFatal("supR3HardenedPathSharedLibs: Buffer overflow, %zu >= %zu\n", cchPathSharedLibs, cchPath);
+    suplibHardenedMemCopy(pszPath, pszSrcPath, cchPathSharedLibs + 1);
     return VINF_SUCCESS;
 
 #else
@@ -289,11 +782,10 @@ DECLHIDDEN(int) supR3HardenedPathAppDocs(char *pszPath, size_t cchPath)
 {
 #if !defined(RT_OS_WINDOWS) && defined(RTPATH_APP_DOCS)
     const char *pszSrcPath = RTPATH_APP_DOCS;
-    size_t cchPathAppDocs = strlen(pszSrcPath);
+    size_t cchPathAppDocs = suplibHardenedStrLen(pszSrcPath);
     if (cchPathAppDocs >= cchPath)
-        supR3HardenedFatal("supR3HardenedPathAppDocs: Buffer overflow, %lu >= %lu\n",
-                            (unsigned long)cchPathAppDocs, (unsigned long)cchPath);
-    memcpy(pszPath, pszSrcPath, cchPathAppDocs + 1);
+        supR3HardenedFatal("supR3HardenedPathAppDocs: Buffer overflow, %zu >= %zu\n", cchPathAppDocs, cchPath);
+    suplibHardenedMemCopy(pszPath, pszSrcPath, cchPathAppDocs + 1);
     return VINF_SUCCESS;
 
 #else
@@ -340,7 +832,7 @@ static void supR3HardenedGetFullExePath(void)
     if (sysctl(aiName, RT_ELEMENTS(aiName), g_szSupLibHardenedExePath, &cbPath, NULL, 0) < 0)
         supR3HardenedFatal("supR3HardenedExecDir: sysctl failed\n");
     g_szSupLibHardenedExePath[sizeof(g_szSupLibHardenedExePath) - 1] = '\0';
-    int cchLink = strlen(g_szSupLibHardenedExePath); /* paranoid? can't we use cbPath? */
+    int cchLink = suplibHardenedStrLen(g_szSupLibHardenedExePath); /* paranoid? can't we use cbPath? */
 
 # endif
     if (cchLink < 0 || cchLink == sizeof(g_szSupLibHardenedExePath) - 1)
@@ -355,15 +847,18 @@ static void supR3HardenedGetFullExePath(void)
     const char *pszImageName = _dyld_get_image_name(0);
     if (!pszImageName)
         supR3HardenedFatal("supR3HardenedExecDir: _dyld_get_image_name(0) failed\n");
-    size_t cchImageName = strlen(pszImageName);
+    size_t cchImageName = suplibHardenedStrLen(pszImageName);
     if (!cchImageName || cchImageName >= sizeof(g_szSupLibHardenedExePath))
         supR3HardenedFatal("supR3HardenedExecDir: _dyld_get_image_name(0) failed, cchImageName=%d\n", cchImageName);
-    memcpy(g_szSupLibHardenedExePath, pszImageName, cchImageName + 1);
+    suplibHardenedMemCopy(g_szSupLibHardenedExePath, pszImageName, cchImageName + 1);
 
 #elif defined(RT_OS_WINDOWS)
-    HMODULE hExe = GetModuleHandle(NULL);
-    if (!GetModuleFileName(hExe, &g_szSupLibHardenedExePath[0], sizeof(g_szSupLibHardenedExePath)))
-        supR3HardenedFatal("supR3HardenedExecDir: GetModuleFileName failed, rc=%d\n", GetLastError());
+    int cbRet = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/,
+                                    g_wszSupLibHardenedExePath, -1,
+                                    g_szSupLibHardenedExePath, sizeof(g_szSupLibHardenedExePath),
+                                    NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
+    if (!cbRet)
+        supR3HardenedFatal("supR3HardenedExecDir: WideCharToMultiByte failed, rc=%d\n", GetLastError());
 #else
 # error needs porting.
 #endif
@@ -371,7 +866,7 @@ static void supR3HardenedGetFullExePath(void)
     /*
      * Strip off the filename part (RTPathStripFilename()).
      */
-    strcpy(g_szSupLibHardenedDirPath, g_szSupLibHardenedExePath);
+    suplibHardenedStrCopy(g_szSupLibHardenedDirPath, g_szSupLibHardenedExePath);
     suplibHardenedPathStripFilename(g_szSupLibHardenedDirPath);
 }
 
@@ -409,10 +904,10 @@ DECLHIDDEN(int) supR3HardenedPathExecDir(char *pszPath, size_t cchPath)
     /*
      * Calc the length and check if there is space before copying.
      */
-    size_t cch = strlen(g_szSupLibHardenedDirPath) + 1;
+    size_t cch = suplibHardenedStrLen(g_szSupLibHardenedDirPath) + 1;
     if (cch <= cchPath)
     {
-        memcpy(pszPath, g_szSupLibHardenedDirPath, cch + 1);
+        suplibHardenedMemCopy(pszPath, g_szSupLibHardenedDirPath, cch + 1);
         return VINF_SUCCESS;
     }
 
@@ -421,35 +916,46 @@ DECLHIDDEN(int) supR3HardenedPathExecDir(char *pszPath, size_t cchPath)
 }
 
 
+/**
+ * Prints the message prefix.
+ */
+static void suplibHardenedPrintPrefix(void)
+{
+    suplibHardenedPrintStr(g_pszSupLibHardenedProgName);
+    suplibHardenedPrintStr(": ");
+}
+
+
 DECLHIDDEN(void)   supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWhat, int rc, const char *pszMsgFmt, va_list va)
 {
     /*
      * To the console first, like supR3HardenedFatalV.
      */
-    fprintf(stderr, "%s: Error %d in %s!\n", g_pszSupLibHardenedProgName, rc, pszWhere);
-    fprintf(stderr, "%s: ", g_pszSupLibHardenedProgName);
+    suplibHardenedPrintPrefix();
+    suplibHardenedPrintF("Error %d in %s!\n", rc, pszWhere);
+
+    suplibHardenedPrintPrefix();
     va_list vaCopy;
     va_copy(vaCopy, va);
-    vfprintf(stderr, pszMsgFmt, vaCopy);
+    suplibHardenedPrintFV(pszMsgFmt, vaCopy);
     va_end(vaCopy);
-    fprintf(stderr, "\n");
+    suplibHardenedPrintChr('\n');
 
     switch (enmWhat)
     {
         case kSupInitOp_Driver:
-            fprintf(stderr,
-                    "\n"
-                    "%s: Tip! Make sure the kernel module is loaded. It may also help to reinstall VirtualBox.\n",
-                    g_pszSupLibHardenedProgName);
+            suplibHardenedPrintChr('\n');
+            suplibHardenedPrintPrefix();
+            suplibHardenedPrintStr("Tip! Make sure the kernel module is loaded. It may also help to reinstall VirtualBox.\n");
             break;
 
+        case kSupInitOp_Misc:
         case kSupInitOp_IPRT:
         case kSupInitOp_Integrity:
         case kSupInitOp_RootCheck:
-            fprintf(stderr,
-                    "\n"
-                    "%s: Tip! It may help to reinstall VirtualBox.\n",
-                    g_pszSupLibHardenedProgName);
+            suplibHardenedPrintChr('\n');
+            suplibHardenedPrintPrefix();
+            suplibHardenedPrintStr("Tip! It may help to reinstall VirtualBox.\n");
             break;
 
         default:
@@ -476,20 +982,23 @@ DECLHIDDEN(void)   supR3HardenedFatalMsgV(const char *pszWhere, SUPINITOP enmWha
     if (pid <= 0)
 #endif
     {
-        PFNSUPTRUSTEDERROR pfnTrustedError = supR3HardenedMainGetTrustedError(g_pszSupLibHardenedProgName);
-        if (pfnTrustedError)
-            pfnTrustedError(pszWhere, enmWhat, rc, pszMsgFmt, va);
+        static volatile bool s_fRecursive = false; /* Loader hooks may cause recursion. */
+        if (!s_fRecursive)
+        {
+            s_fRecursive = true;
+
+            PFNSUPTRUSTEDERROR pfnTrustedError = supR3HardenedMainGetTrustedError(g_pszSupLibHardenedProgName);
+            if (pfnTrustedError)
+                pfnTrustedError(pszWhere, enmWhat, rc, pszMsgFmt, va);
+
+            s_fRecursive = false;
+        }
     }
 
     /*
      * Quit
      */
-    for (;;)
-#ifdef _MSC_VER
-        exit(1);
-#else
-        _Exit(1);
-#endif
+    suplibHardenedExit(RTEXITCODE_FAILURE);
 }
 
 
@@ -504,14 +1013,9 @@ DECLHIDDEN(void)   supR3HardenedFatalMsg(const char *pszWhere, SUPINITOP enmWhat
 
 DECLHIDDEN(void) supR3HardenedFatalV(const char *pszFormat, va_list va)
 {
-    fprintf(stderr, "%s: ", g_pszSupLibHardenedProgName);
-    vfprintf(stderr, pszFormat, va);
-    for (;;)
-#ifdef _MSC_VER
-        exit(1);
-#else
-        _Exit(1);
-#endif
+    suplibHardenedPrintPrefix();
+    suplibHardenedPrintFV(pszFormat, va);
+    suplibHardenedExit(RTEXITCODE_FAILURE);
 }
 
 
@@ -529,8 +1033,8 @@ DECLHIDDEN(int) supR3HardenedErrorV(int rc, bool fFatal, const char *pszFormat,
     if (fFatal)
         supR3HardenedFatalV(pszFormat, va);
 
-    fprintf(stderr, "%s: ", g_pszSupLibHardenedProgName);
-    vfprintf(stderr, pszFormat, va);
+    suplibHardenedPrintPrefix();
+    suplibHardenedPrintFV(pszFormat, va);
     return rc;
 }
 
@@ -546,31 +1050,6 @@ DECLHIDDEN(int) supR3HardenedError(int rc, bool fFatal, const char *pszFormat, .
 
 
 /**
- * Wrapper around snprintf which will throw a fatal error on buffer overflow.
- *
- * @returns Number of chars in the result string.
- * @param   pszDst          The destination buffer.
- * @param   cchDst          The size of the buffer.
- * @param   pszFormat       The format string.
- * @param   ...             Format arguments.
- */
-static size_t supR3HardenedStrPrintf(char *pszDst, size_t cchDst, const char *pszFormat, ...)
-{
-    va_list va;
-    va_start(va, pszFormat);
-#ifdef _MSC_VER
-    int cch = _vsnprintf(pszDst, cchDst, pszFormat, va);
-#else
-    int cch = vsnprintf(pszDst, cchDst, pszFormat, va);
-#endif
-    va_end(va);
-    if ((unsigned)cch >= cchDst || cch < 0)
-        supR3HardenedFatal("supR3HardenedStrPrintf: buffer overflow, %d >= %lu\n", cch, (long)cchDst);
-    return cch;
-}
-
-
-/**
  * Attempts to open /dev/vboxdrv (or equvivalent).
  *
  * @remarks This function will not return on failure.
@@ -605,6 +1084,14 @@ static void supR3HardenedMainOpenDevice(void)
         case VERR_NO_MEMORY:
             supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc,
                                   "Kernel memory allocation/mapping failed");
+        case VERR_SUPDRV_HARDENING_EVIL_HANDLE:
+            supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPDRV_HARDENING_EVIL_HANDLE");
+        case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0:
+            supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0");
+        case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1:
+            supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1");
+        case VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2:
+            supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc, "VERR_SUPLIB_NT_PROCESS_UNTRUSTED_2");
         default:
             supR3HardenedFatalMsg("suplibOsInit", kSupInitOp_Driver, rc,
                                   "Unknown rc=%d", rc);
@@ -842,17 +1329,16 @@ static void supR3HardenedMainInitRuntime(uint32_t fFlags)
      */
     char szPath[RTPATH_MAX];
     supR3HardenedPathSharedLibs(szPath, sizeof(szPath) - sizeof("/VBoxRT" SUPLIB_DLL_SUFF));
-    strcat(szPath, "/VBoxRT" SUPLIB_DLL_SUFF);
+    suplibHardenedStrCat(szPath, "/VBoxRT" SUPLIB_DLL_SUFF);
 
     /*
      * Open it and resolve the symbols.
      */
 #if defined(RT_OS_WINDOWS)
-    /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
-    HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+    HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
     if (!hMod)
         supR3HardenedFatalMsg("supR3HardenedMainInitRuntime", kSupInitOp_IPRT, VERR_MODULE_NOT_FOUND,
-                              "LoadLibraryEx(\"%s\",,) failed (rc=%d)",
+                              "LoadLibrary \"%s\" failed (rc=%d)",
                               szPath, GetLastError());
     PFNRTR3INITEX pfnRTInitEx = (PFNRTR3INITEX)GetProcAddress(hMod, SUP_HARDENED_SYM("RTR3InitEx"));
     if (!pfnRTInitEx)
@@ -924,15 +1410,14 @@ static PFNSUPTRUSTEDERROR supR3HardenedMainGetTrustedError(const char *pszProgNa
      */
     char szPath[RTPATH_MAX];
     supR3HardenedPathAppPrivateArch(szPath, sizeof(szPath) - 10);
-    size_t cch = strlen(szPath);
-    supR3HardenedStrPrintf(&szPath[cch], sizeof(szPath) - cch, "/%s%s", pszProgName, SUPLIB_DLL_SUFF);
+    size_t cch = suplibHardenedStrLen(szPath);
+    suplibHardenedStrCopyEx(&szPath[cch], sizeof(szPath) - cch, "/", pszProgName, SUPLIB_DLL_SUFF, NULL);
 
     /*
      * Open it and resolve the symbol.
      */
 #if defined(RT_OS_WINDOWS)
-    /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
-    HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+    HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
     if (!hMod)
         return NULL;
     FARPROC pfn = GetProcAddress(hMod, SUP_HARDENED_SYM("TrustedError"));
@@ -968,17 +1453,16 @@ static PFNSUPTRUSTEDMAIN supR3HardenedMainGetTrustedMain(const char *pszProgName
      */
     char szPath[RTPATH_MAX];
     supR3HardenedPathAppPrivateArch(szPath, sizeof(szPath) - 10);
-    size_t cch = strlen(szPath);
-    supR3HardenedStrPrintf(&szPath[cch], sizeof(szPath) - cch, "/%s%s", pszProgName, SUPLIB_DLL_SUFF);
+    size_t cch = suplibHardenedStrLen(szPath);
+    suplibHardenedStrCopyEx(&szPath[cch], sizeof(szPath) - cch, "/", pszProgName, SUPLIB_DLL_SUFF, NULL);
 
     /*
      * Open it and resolve the symbol.
      */
 #if defined(RT_OS_WINDOWS)
-    /** @todo consider using LOAD_WITH_ALTERED_SEARCH_PATH here! */
-    HMODULE hMod = LoadLibraryEx(szPath, NULL /*hFile*/, 0 /* dwFlags */);
+    HMODULE hMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, false /*fSystem32Only*/);
     if (!hMod)
-        supR3HardenedFatal("supR3HardenedMainGetTrustedMain: LoadLibraryEx(\"%s\",,) failed, rc=%d\n",
+        supR3HardenedFatal("supR3HardenedMainGetTrustedMain: LoadLibrary \"%s\" failed, rc=%d\n",
                             szPath, GetLastError());
     FARPROC pfn = GetProcAddress(hMod, SUP_HARDENED_SYM("TrustedMain"));
     if (!pfn)
@@ -1059,15 +1543,37 @@ DECLHIDDEN(int) SUPR3HardenedMain(const char *pszProgName, uint32_t fFlags, int
 #endif
 
     /*
-     * Validate the installation.
+     * Validate the installation.  On Windows we leave the files open so they
+     * cannot be tampered with after they've been verified.  We also check
+     * install loader hooks and check the process integrity.
      */
+#ifndef RT_OS_WINDOWS
     supR3HardenedVerifyAll(true /* fFatal */, false /* fLeaveFilesOpen */, pszProgName);
+#else
+    supR3HardenedWinInit(fFlags);
+    supR3HardenedVerifyAll(true /* fFatal */, true /* fLeaveFilesOpen */, pszProgName);
+    supR3HardenedWinVerifyProcess();
+#endif
+
+#ifdef RT_OS_WINDOWS
+    /*
+     * On Windows we'll respawn the process with a special vboxdrv arrangement
+     * in place to monitor access to the process for its inception.
+     */
+    if (   !(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV)
+        && supR3HardenedWinIsReSpawnNeeded(argc, argv))
+        return supR3HardenedWinReSpawn();
+#endif
 
     /*
      * Open the vboxdrv device.
      */
     if (!(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV))
         supR3HardenedMainOpenDevice();
+#ifdef RT_OS_WINDOWS
+    supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation();
+    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY;
+#endif
 
     /*
      * Open the root service connection.
@@ -1091,13 +1597,16 @@ DECLHIDDEN(int) SUPR3HardenedMain(const char *pszProgName, uint32_t fFlags, int
      * Load the IPRT, hand the SUPLib part the open driver and
      * call RTR3InitEx.
      */
+    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_INIT_RUNTIME;
     supR3HardenedMainInitRuntime(fFlags);
 
     /*
      * Load the DLL/SO/DYLIB containing the actual program
      * and pass control to it.
      */
+    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_GET_TRUSTED_MAIN;
     PFNSUPTRUSTEDMAIN pfnTrustedMain = supR3HardenedMainGetTrustedMain(pszProgName);
+    g_enmSupR3HardenedMainState = SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN;
     return pfnTrustedMain(argc, argv, envp);
 }
 
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedMainTemplate.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
new file mode 100644
index 0000000..c7cb3e1
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
@@ -0,0 +1,25 @@
+/* $Id: SUPR3HardenedMainTemplate.cpp $ */
+/** @file
+ * Hardened main() template.
+ */
+
+/*
+ * Copyright (C) 2008-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#include <VBox/sup.h>
+
+
+int main(int argc, char **argv, char **envp)
+{
+    return SUPR3HardenedMain(PROGRAM_NAME_STR, 0, argc, argv, envp);
+}
+
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp
new file mode 100644
index 0000000..daebaeb
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedNoCrt.cpp
@@ -0,0 +1,205 @@
+/* $Id: SUPR3HardenedNoCrt.cpp $ */
+/** @file
+ * VirtualBox Support Library - Hardened main() no-crt routines.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#if RT_OS_WINDOWS
+# include <Windows.h>
+#endif
+
+#include <VBox/sup.h>
+
+#include "SUPLibInternal.h"
+
+
+#ifdef SUP_HARDENED_NEED_CRT_FUNCTIONS
+
+/** memcmp */
+DECLHIDDEN(int) suplibHardenedMemComp(void const *pvDst, const void *pvSrc, size_t cbToComp)
+{
+    size_t const   *puDst = (size_t const *)pvDst;
+    size_t const   *puSrc = (size_t const *)pvSrc;
+    while (cbToComp >= sizeof(size_t))
+    {
+        if (*puDst != *puSrc)
+            break;
+        puDst++;
+        puSrc++;
+        cbToComp -= sizeof(size_t);
+    }
+
+    uint8_t const  *pbDst = (uint8_t const *)puDst;
+    uint8_t const  *pbSrc = (uint8_t const *)puSrc;
+    while (cbToComp > 0)
+    {
+        if (*pbDst != *pbSrc)
+        {
+            if (*pbDst < *pbSrc)
+                return -1;
+            return 1;
+        }
+
+        pbDst++;
+        pbSrc++;
+        cbToComp--;
+    }
+
+    return 0;
+}
+
+
+/** memcpy */
+DECLHIDDEN(void *) suplibHardenedMemCopy(void *pvDst, const void *pvSrc, size_t cbToCopy)
+{
+    size_t         *puDst = (size_t *)pvDst;
+    size_t const   *puSrc = (size_t const *)pvSrc;
+    while (cbToCopy >= sizeof(size_t))
+    {
+        *puDst++ = *puSrc++;
+        cbToCopy -= sizeof(size_t);
+    }
+
+    uint8_t        *pbDst = (uint8_t *)puDst;
+    uint8_t const  *pbSrc = (uint8_t const *)puSrc;
+    while (cbToCopy > 0)
+    {
+        *pbDst++ = *pbSrc++;
+        cbToCopy--;
+    }
+
+    return pvDst;
+}
+
+
+/** memset */
+DECLHIDDEN(void *) suplibHardenedMemSet(void *pvDst, int ch, size_t cbToSet)
+{
+    uint8_t *pbDst = (uint8_t *)pvDst;
+    while (cbToSet > 0)
+    {
+        *pbDst++ = (uint8_t)ch;
+        cbToSet--;
+    }
+
+    return pvDst;
+}
+
+
+/** strcpy */
+DECLHIDDEN(char *) suplibHardenedStrCopy(char *pszDst, const char *pszSrc)
+{
+    char *pszRet = pszDst;
+    char ch;
+    do
+    {
+        ch = *pszSrc++;
+        *pszDst++ = ch;
+    } while (ch);
+    return pszRet;
+}
+
+
+/** strlen */
+DECLHIDDEN(size_t) suplibHardenedStrLen(const char *psz)
+{
+    const char *pszStart = psz;
+    while (*psz)
+        psz++;
+    return psz - pszStart;
+}
+
+
+/** strcat */
+DECLHIDDEN(char *) suplibHardenedStrCat(char *pszDst, const char *pszSrc)
+{
+    char *pszRet = pszDst;
+    while (*pszDst)
+        pszDst++;
+    suplibHardenedStrCopy(pszDst, pszSrc);
+    return pszRet;
+}
+
+
+# ifdef RT_OS_WINDOWS
+/** stricmp */
+DECLHIDDEN(int) suplibHardenedStrICmp(const char *psz1, const char *psz2)
+{
+    const char *pszOrg1 = psz1;
+    const char *pszOrg2 = psz2;
+
+    for (;;)
+    {
+        char ch1 = *psz1++;
+        char ch2 = *psz2++;
+        if (ch1 != ch2)
+        {
+            int rc = CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, pszOrg1, -1, pszOrg2, -1);
+#  ifdef VBOX_STRICT
+            if (rc == 0)
+                __debugbreak();
+#  endif
+            return rc - 2;
+        }
+        if (ch1 == 0)
+            return 0;
+    }
+}
+# endif
+
+
+/** strcmp */
+DECLHIDDEN(int) suplibHardenedStrCmp(const char *psz1, const char *psz2)
+{
+    for (;;)
+    {
+        char ch1 = *psz1++;
+        char ch2 = *psz2++;
+        if (ch1 != ch2)
+            return ch1 < ch2 ? -1 : 1;
+        if (ch1 == 0)
+            return 0;
+    }
+}
+
+
+/** strncmp */
+DECLHIDDEN(int) suplibHardenedStrNCmp(const char *psz1, const char *psz2, size_t cchMax)
+{
+    while (cchMax-- > 0)
+    {
+        char ch1 = *psz1++;
+        char ch2 = *psz2++;
+        if (ch1 != ch2)
+            return ch1 < ch2 ? -1 : 1;
+        if (ch1 == 0)
+            break;
+    }
+    return 0;
+}
+
+#endif /* SUP_HARDENED_NEED_CRT_FUNCTIONS */
+
diff --git a/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp b/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
index 5229fb1..1c597f4 100644
--- a/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
+++ b/src/VBox/HostDrivers/Support/SUPR3HardenedVerify.cpp
@@ -40,7 +40,9 @@
 
 #elif defined(RT_OS_WINDOWS)
 # include <Windows.h>
-# include <stdio.h>
+# ifndef IN_SUP_HARDENED_R3
+#  include <stdio.h>
+# endif
 
 #else /* UNIXes */
 # include <sys/types.h>
@@ -55,7 +57,6 @@
 # include <sys/stat.h>
 # include <sys/time.h>
 # include <sys/fcntl.h>
-# include <stdio.h>
 # include <pwd.h>
 # ifdef RT_OS_DARWIN
 #  include <mach-o/dyld.h>
@@ -72,6 +73,10 @@
 #include <iprt/string.h>
 
 #include "SUPLibInternal.h"
+#if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_HARDENING)
+# define SUPHNTVI_NO_NT_STUFF
+# include "win/SUPHardenedVerify-win.h"
+#endif
 
 
 /*******************************************************************************
@@ -84,6 +89,13 @@
 # define dirfd(d) ((d)->d_fd)
 #endif
 
+/** Compare table file names with externally supplied names. */
+#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
+# define SUP_COMP_FILENAME  suplibHardenedStrICmp
+#else
+# define SUP_COMP_FILENAME  suplibHardenedStrCmp
+#endif
+
 
 /*******************************************************************************
 *   Global Variables                                                           *
@@ -105,9 +117,9 @@ static SUPINSTFILE const    g_aSupInstallFiles[] =
     {   kSupIFT_Dll,  kSupID_AppPrivArch,       false, "VBoxDD2R0.r0" },
 
 #ifdef VBOX_WITH_RAW_MODE
-    {   kSupIFT_Dll,  kSupID_AppPrivArch,       false, "VMMGC.gc" },
-    {   kSupIFT_Dll,  kSupID_AppPrivArch,       false, "VBoxDDGC.gc" },
-    {   kSupIFT_Dll,  kSupID_AppPrivArch,       false, "VBoxDD2GC.gc" },
+    {   kSupIFT_Rc,   kSupID_AppPrivArch,       false, "VMMGC.gc" },
+    {   kSupIFT_Rc,   kSupID_AppPrivArch,       false, "VBoxDDGC.gc" },
+    {   kSupIFT_Rc,   kSupID_AppPrivArch,       false, "VBoxDD2GC.gc" },
 #endif
 
     {   kSupIFT_Dll,  kSupID_SharedLib,         false, "VBoxRT" SUPLIB_DLL_SUFF },
@@ -152,7 +164,7 @@ static SUPINSTFILE const    g_aSupInstallFiles[] =
 #ifdef VBOX_WITH_MAIN
     {   kSupIFT_Exe,  kSupID_AppBin,            false, "VBoxSVC" SUPLIB_EXE_SUFF },
  #ifdef RT_OS_WINDOWS
-    {   kSupIFT_Dll,  kSupID_AppPrivArchComp,   false, "VBoxC" SUPLIB_DLL_SUFF },
+    {   kSupIFT_Dll,  kSupID_SharedLib,         false, "VBoxC" SUPLIB_DLL_SUFF },
  #else
     {   kSupIFT_Exe,  kSupID_AppPrivArch,       false, "VBoxXPCOMIPCD" SUPLIB_EXE_SUFF },
     {   kSupIFT_Dll,  kSupID_SharedLib,         false, "VBoxXPCOM" SUPLIB_DLL_SUFF },
@@ -203,6 +215,27 @@ static SUPINSTFILE const    g_aSupInstallFiles[] =
     {   kSupIFT_Exe,  kSupID_AppBin,             true, "VBoxNetNAT" SUPLIB_EXE_SUFF },
     {   kSupIFT_Dll,  kSupID_AppPrivArch,        true, "VBoxNetNAT" SUPLIB_DLL_SUFF },
 //#endif
+#if defined(VBOX_WITH_HARDENING) && defined(RT_OS_WINDOWS)
+# define HARDENED_TESTCASE_BIN_ENTRY(a_szName) \
+        {   kSupIFT_TestExe, kSupID_AppBin, true, a_szName SUPLIB_EXE_SUFF }, \
+        {   kSupIFT_TestDll, kSupID_AppBin, true, a_szName SUPLIB_DLL_SUFF }
+    HARDENED_TESTCASE_BIN_ENTRY("tstMicro"),
+    HARDENED_TESTCASE_BIN_ENTRY("tstPDMAsyncCompletion"),
+    HARDENED_TESTCASE_BIN_ENTRY("tstPDMAsyncCompletionStress"),
+    HARDENED_TESTCASE_BIN_ENTRY("tstVMM"),
+    HARDENED_TESTCASE_BIN_ENTRY("tstVMREQ"),
+# define HARDENED_TESTCASE_ENTRY(a_szName) \
+        {   kSupIFT_TestExe, kSupID_Testcase, true, a_szName SUPLIB_EXE_SUFF }, \
+        {   kSupIFT_TestDll, kSupID_Testcase, true, a_szName SUPLIB_DLL_SUFF }
+    HARDENED_TESTCASE_ENTRY("tstCFGM"),
+    HARDENED_TESTCASE_ENTRY("tstIntNet-1"),
+    HARDENED_TESTCASE_ENTRY("tstMMHyperHeap"),
+    HARDENED_TESTCASE_ENTRY("tstR0ThreadPreemptionDriver"),
+    HARDENED_TESTCASE_ENTRY("tstRTR0MemUserKernelDriver"),
+    HARDENED_TESTCASE_ENTRY("tstRTR0SemMutexDriver"),
+    HARDENED_TESTCASE_ENTRY("tstRTR0TimerDriver"),
+    HARDENED_TESTCASE_ENTRY("tstSSM"),
+#endif
 };
 
 
@@ -243,9 +276,9 @@ static int supR3HardenedMakePath(SUPINSTDIR enmDir, char *pszDst, size_t cchDst,
             rc = supR3HardenedPathAppPrivateArch(pszDst, cchDst);
             if (RT_SUCCESS(rc))
             {
-                size_t off = strlen(pszDst);
+                size_t off = suplibHardenedStrLen(pszDst);
                 if (cchDst - off >= sizeof("/components"))
-                    memcpy(&pszDst[off], "/components", sizeof("/components"));
+                    suplibHardenedMemCopy(&pszDst[off], "/components", sizeof("/components"));
                 else
                     rc = VERR_BUFFER_OVERFLOW;
             }
@@ -253,6 +286,17 @@ static int supR3HardenedMakePath(SUPINSTDIR enmDir, char *pszDst, size_t cchDst,
         case kSupID_AppPrivNoArch:
             rc = supR3HardenedPathAppPrivateNoArch(pszDst, cchDst);
             break;
+        case kSupID_Testcase:
+            rc = supR3HardenedPathExecDir(pszDst, cchDst);
+            if (RT_SUCCESS(rc))
+            {
+                size_t off = suplibHardenedStrLen(pszDst);
+                if (cchDst - off >= sizeof("/testcase"))
+                    suplibHardenedMemCopy(&pszDst[off], "/testcase", sizeof("/testcase"));
+                else
+                    rc = VERR_BUFFER_OVERFLOW;
+            }
+            break;
         default:
             return supR3HardenedError(VERR_INTERNAL_ERROR, fFatal,
                                       "supR3HardenedMakePath: enmDir=%d\n", enmDir);
@@ -285,12 +329,12 @@ static int supR3HardenedMakeFilePath(PCSUPINSTFILE pFile, char *pszDst, size_t c
     int rc = supR3HardenedMakePath(pFile->enmDir, pszDst, cchDst, fFatal);
     if (RT_SUCCESS(rc) && fWithFilename)
     {
-        size_t cchFile = strlen(pFile->pszFile);
-        size_t off = strlen(pszDst);
+        size_t cchFile = suplibHardenedStrLen(pFile->pszFile);
+        size_t off = suplibHardenedStrLen(pszDst);
         if (cchDst - off >= cchFile + 2)
         {
             pszDst[off++] = '/';
-            memcpy(&pszDst[off], pFile->pszFile, cchFile + 1);
+            suplibHardenedMemCopy(&pszDst[off], pFile->pszFile, cchFile + 1);
         }
         else
             rc = supR3HardenedError(VERR_BUFFER_OVERFLOW, fFatal,
@@ -341,27 +385,42 @@ DECLHIDDEN(int) supR3HardenedVerifyFixedDir(SUPINSTDIR enmDir, bool fFatal)
     if (RT_SUCCESS(rc))
     {
 #if defined(RT_OS_WINDOWS)
-        HANDLE hDir = CreateFile(szPath,
-                                 GENERIC_READ,
-                                 FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
-                                 NULL,
-                                 OPEN_ALWAYS,
-                                 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
-                                 NULL);
-        if (hDir != INVALID_HANDLE_VALUE)
+        PRTUTF16 pwszPath;
+        rc = RTStrToUtf16(szPath, &pwszPath);
+        if (RT_SUCCESS(rc))
         {
-            /** @todo check the type */
-            /* That's all on windows, for now at least... */
-            g_aSupVerifiedDirs[enmDir].hDir = (intptr_t)hDir;
-            g_aSupVerifiedDirs[enmDir].fValidated = true;
+            HANDLE hDir = CreateFileW(pwszPath,
+                                      GENERIC_READ,
+                                      FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
+                                      NULL,
+                                      OPEN_EXISTING,
+                                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS,
+                                      NULL);
+            if (hDir != INVALID_HANDLE_VALUE)
+            {
+                /** @todo check the type */
+                /* That's all on windows, for now at least... */
+                g_aSupVerifiedDirs[enmDir].hDir = (intptr_t)hDir;
+                g_aSupVerifiedDirs[enmDir].fValidated = true;
+            }
+            else if (enmDir == kSupID_Testcase)
+            {
+                g_aSupVerifiedDirs[enmDir].fValidated = true;
+                rc = VINF_SUCCESS; /* Optional directory, ignore if missing. */
+            }
+            else
+            {
+                int err = GetLastError();
+                rc = supR3HardenedError(VERR_PATH_NOT_FOUND, fFatal,
+                                        "supR3HardenedVerifyDir: Failed to open \"%s\": err=%d\n",
+                                        szPath, err);
+            }
+            RTUtf16Free(pwszPath);
         }
         else
-        {
-            int err = GetLastError();
-            rc = supR3HardenedError(VERR_PATH_NOT_FOUND, fFatal,
-                                    "supR3HardenedVerifyDir: Failed to open \"%s\": err=%d\n",
-                                    szPath, err);
-        }
+            rc = supR3HardenedError(rc, fFatal,
+                                    "supR3HardenedVerifyDir: Failed to convert \"%s\" to UTF-16: err=%d\n", szPath, rc);
+
 #else /* UNIXY */
         int fd = open(szPath, O_RDONLY, 0);
         if (fd >= 0)
@@ -407,6 +466,11 @@ DECLHIDDEN(int) supR3HardenedVerifyFixedDir(SUPINSTDIR enmDir, bool fFatal)
                 close(fd);
             }
         }
+        else if (enmDir == kSupID_Testcase)
+        {
+            g_aSupVerifiedDirs[enmDir].fValidated = true;
+            rc = VINF_SUCCESS; /* Optional directory, ignore if missing. */
+        }
         else
         {
             int err = errno;
@@ -465,33 +529,61 @@ static int supR3HardenedVerifyFileInternal(int iFile, bool fFatal, bool fLeaveFi
         if (RT_SUCCESS(rc))
         {
 #if defined(RT_OS_WINDOWS)
-            HANDLE hFile = CreateFile(szPath,
-                                      GENERIC_READ,
-                                      FILE_SHARE_READ,
-                                      NULL,
-                                      OPEN_ALWAYS,
-                                      FILE_ATTRIBUTE_NORMAL,
-                                      NULL);
-            if (hFile != INVALID_HANDLE_VALUE)
+            PRTUTF16 pwszPath;
+            rc = RTStrToUtf16(szPath, &pwszPath);
+            if (RT_SUCCESS(rc))
             {
-                /** @todo Check the type, and verify the signature (separate function so we can skip it). */
+                HANDLE hFile = CreateFileW(pwszPath,
+                                           GENERIC_READ,
+                                           FILE_SHARE_READ,
+                                           NULL,
+                                           OPEN_EXISTING,
+                                           FILE_ATTRIBUTE_NORMAL,
+                                           NULL);
+                if (hFile != INVALID_HANDLE_VALUE)
                 {
-                    /* it's valid. */
-                    if (fLeaveFileOpen)
-                        pVerified->hFile = (intptr_t)hFile;
-                    else
+# if defined(VBOX_WITH_HARDENING) && !defined(IN_SUP_R3_STATIC) /* Latter: Not in VBoxCpuReport and friends. */
+
+                    char szErr[1024];
+                    RTERRINFO ErrInfo;
+                    RTErrInfoInit(&ErrInfo, szErr, sizeof(szErr));
+
+                    uint32_t fFlags = SUPHNTVI_F_REQUIRE_BUILD_CERT;
+                    if (pFile->enmType == kSupIFT_Rc)
+                        fFlags |= SUPHNTVI_F_RC_IMAGE;
+
+                    rc = supHardenedWinVerifyImageByHandleNoName(hFile, fFlags, &ErrInfo);
+                    if (RT_FAILURE(rc))
+                    {
+                        rc = supR3HardenedError(rc, fFatal, "supR3HardenedVerifyFileInternal: '%s': Image verify error rc=%Rrc: %s\n",
+                                                szPath, rc, szErr);
                         CloseHandle(hFile);
-                    pVerified->fValidated = true;
+                    }
+                    else
+# endif
+                    {
+                        /* it's valid. */
+                        if (fLeaveFileOpen)
+                            pVerified->hFile = (intptr_t)hFile;
+                        else
+                            CloseHandle(hFile);
+                        pVerified->fValidated = true;
+                    }
+                }
+                else
+                {
+                    int err = GetLastError();
+                    if (   !pFile->fOptional
+                        || (    err != ERROR_FILE_NOT_FOUND
+                            &&  (err != ERROR_PATH_NOT_FOUND || pFile->enmDir != kSupID_Testcase) ) )
+                        rc = supR3HardenedError(VERR_PATH_NOT_FOUND, fFatal,
+                                                "supR3HardenedVerifyFileInternal: Failed to open '%s': err=%d\n", szPath, err);
                 }
+                RTUtf16Free(pwszPath);
             }
             else
-            {
-                int err = GetLastError();
-                if (!pFile->fOptional || err != ERROR_FILE_NOT_FOUND)
-                    rc = supR3HardenedError(VERR_PATH_NOT_FOUND, fFatal,
-                                            "supR3HardenedVerifyFileInternal: Failed to open \"%s\": err=%d\n",
-                                            szPath, err);
-            }
+                rc = supR3HardenedError(rc, fFatal, "supR3HardenedVerifyFileInternal: Failed to convert '%s' to UTF-16: %Rrc\n",
+                                        szPath, rc);
 #else /* UNIXY */
             int fd = open(szPath, O_RDONLY, 0);
             if (fd >= 0)
@@ -579,11 +671,7 @@ static int supR3HardenedVerifySameFile(int iFile, const char *pszFilename, bool
     int rc = supR3HardenedMakeFilePath(pFile, szName, sizeof(szName), true /*fWithFilename*/, fFatal);
     if (RT_FAILURE(rc))
         return rc;
-#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
-    if (stricmp(szName, pszFilename))
-#else
-    if (strcmp(szName, pszFilename))
-#endif
+    if (SUP_COMP_FILENAME(szName, pszFilename))
     {
         /*
          * Normalize the two paths and compare again.
@@ -594,14 +682,14 @@ static int supR3HardenedVerifySameFile(int iFile, const char *pszFilename, bool
         char szName2[RTPATH_MAX];
         if (    GetFullPathName(szName, RT_ELEMENTS(szName2), &szName2[0], &pszIgnored)
             &&  GetFullPathName(pszFilename, RT_ELEMENTS(szName), &szName[0], &pszIgnored))
-            if (!stricmp(szName2, szName))
+            if (!SUP_COMP_FILENAME(szName2, szName))
                 rc = VINF_SUCCESS;
 #else
         AssertCompile(RTPATH_MAX >= PATH_MAX);
         char szName2[RTPATH_MAX];
         if (    realpath(szName, szName2) != NULL
             &&  realpath(pszFilename, szName) != NULL)
-            if (!strcmp(szName2, szName))
+            if (!SUP_COMP_FILENAME(szName2, szName))
                 rc = VINF_SUCCESS;
 #endif
 
@@ -643,7 +731,7 @@ DECLHIDDEN(int) supR3HardenedVerifyFixedFile(const char *pszFilename, bool fFata
      */
     const char *pszName = supR3HardenedPathFilename(pszFilename);
     for (unsigned iFile = 0; iFile < RT_ELEMENTS(g_aSupInstallFiles); iFile++)
-        if (!strcmp(pszName, g_aSupInstallFiles[iFile].pszFile))
+        if (!SUP_COMP_FILENAME(pszName, g_aSupInstallFiles[iFile].pszFile))
         {
             int rc = supR3HardenedVerifySameFile(iFile, pszFilename, fFatal);
             if (RT_SUCCESS(rc))
@@ -670,12 +758,13 @@ static int supR3HardenedVerifyProgram(const char *pszProgName, bool fFatal)
     int             rc = VINF_SUCCESS;
     bool            fExe = false;
     bool            fDll = false;
-    size_t const    cchProgName = strlen(pszProgName);
+    size_t const    cchProgName = suplibHardenedStrLen(pszProgName);
     for (unsigned iFile = 0; iFile < RT_ELEMENTS(g_aSupInstallFiles); iFile++)
-        if (!strncmp(pszProgName, g_aSupInstallFiles[iFile].pszFile, cchProgName))
+        if (!suplibHardenedStrNCmp(pszProgName, g_aSupInstallFiles[iFile].pszFile, cchProgName))
         {
-            if (    g_aSupInstallFiles[iFile].enmType == kSupIFT_Dll
-                &&  !strcmp(&g_aSupInstallFiles[iFile].pszFile[cchProgName], SUPLIB_DLL_SUFF))
+            if (    (   g_aSupInstallFiles[iFile].enmType == kSupIFT_Dll
+                     || g_aSupInstallFiles[iFile].enmType == kSupIFT_TestDll)
+                &&  !suplibHardenedStrCmp(&g_aSupInstallFiles[iFile].pszFile[cchProgName], SUPLIB_DLL_SUFF))
             {
                 /* This only has to be found (once). */
                 if (fDll)
@@ -683,8 +772,9 @@ static int supR3HardenedVerifyProgram(const char *pszProgName, bool fFatal)
                                             "supR3HardenedVerifyProgram: duplicate DLL entry for \"%s\"\n", pszProgName);
                 fDll = true;
             }
-            else if (   g_aSupInstallFiles[iFile].enmType == kSupIFT_Exe
-                     && !strcmp(&g_aSupInstallFiles[iFile].pszFile[cchProgName], SUPLIB_EXE_SUFF))
+            else if (   (   g_aSupInstallFiles[iFile].enmType == kSupIFT_Exe
+                         || g_aSupInstallFiles[iFile].enmType == kSupIFT_TestExe)
+                     && !suplibHardenedStrCmp(&g_aSupInstallFiles[iFile].pszFile[cchProgName], SUPLIB_EXE_SUFF))
             {
                 /* Here we'll have to check that the specific program is the same as the entry. */
                 if (fExe)
@@ -696,8 +786,8 @@ static int supR3HardenedVerifyProgram(const char *pszProgName, bool fFatal)
                 int rc2 = supR3HardenedPathExecDir(szFilename, sizeof(szFilename) - cchProgName - sizeof(SUPLIB_EXE_SUFF));
                 if (RT_SUCCESS(rc2))
                 {
-                    strcat(szFilename, "/");
-                    strcat(szFilename, g_aSupInstallFiles[iFile].pszFile);
+                    suplibHardenedStrCat(szFilename, "/");
+                    suplibHardenedStrCat(szFilename, g_aSupInstallFiles[iFile].pszFile);
                     supR3HardenedVerifySameFile(iFile, szFilename, fFatal);
                 }
                 else
@@ -785,10 +875,10 @@ static int supR3HardenedSetErrorN(int rc, PRTERRINFO pErrInfo, unsigned cMsgs, .
         while (cMsgs-- > 0 && cbErr > 0)
         {
             const char *pszMsg = va_arg(va,  const char *);
-            size_t cchMsg = VALID_PTR(pszMsg) ? strlen(pszMsg) : 0;
+            size_t cchMsg = VALID_PTR(pszMsg) ? suplibHardenedStrLen(pszMsg) : 0;
             if (cchMsg >= cbErr)
                 cchMsg = cbErr - 1;
-            memcpy(pszErr, pszMsg, cchMsg);
+            suplibHardenedMemCopy(pszErr, pszMsg, cchMsg);
             pszErr[cchMsg] = '\0';
             pszErr += cchMsg;
             cbErr -= cchMsg;
@@ -902,7 +992,7 @@ static int supR3HardenedVerifyPathSanity(const char *pszPath, PRTERRINFO pErrInf
      * Check that it's an absolute path and copy the volume/root specifier.
      */
 #if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
-    if (   RT_C_IS_ALPHA(pszSrc[0])
+    if (   !RT_C_IS_ALPHA(pszSrc[0])
         || pszSrc[1] != ':'
         || !RTPATH_IS_SLASH(pszSrc[2]))
         return supR3HardenedSetError3(VERR_SUPLIB_PATH_NOT_ABSOLUTE, pErrInfo, "The path is not absolute: '", pszPath, "'");
@@ -1196,7 +1286,7 @@ static int supR3HardenedVerifyFsObject(PCSUPR3HARDENEDFSOBJSTATE pFsObjState, bo
            full access. So, to work around we relax the hardening a bit and
            permit grand parents and beyond to be group writable by admin. */
         /** @todo dynamically resolve the admin group? */
-        bool fBad = !fRelaxed || pFsObjState->Stat.st_gid != 80 /*admin*/ || strcmp(pszPath, "/Applications");
+        bool fBad = !fRelaxed || pFsObjState->Stat.st_gid != 80 /*admin*/ || suplibHardenedStrCmp(pszPath, "/Applications");
 
 #elif defined(RT_OS_FREEBSD)
         /* HACK ALERT: PC-BSD 9 has group-writable /usr/pib directory which is
@@ -1204,7 +1294,7 @@ static int supR3HardenedVerifyFsObject(PCSUPR3HARDENEDFSOBJSTATE pFsObjState, bo
            On FreeBSD root is normally the only member of this group, on
            PC-BSD the default user is a member. */
         /** @todo dynamically resolve the operator group? */
-        bool fBad = !fRelaxed || pFsObjState->Stat.st_gid != 5 /*operator*/ || strcmp(pszPath, "/usr/pbi");
+        bool fBad = !fRelaxed || pFsObjState->Stat.st_gid != 5 /*operator*/ || suplibHardenedStrCmp(pszPath, "/usr/pbi");
         NOREF(fRelaxed);
 #else
         NOREF(fRelaxed);
@@ -1335,14 +1425,14 @@ static int supR3HardenedVerifyDirRecursive(char *pszDirPath, size_t cchDirPath,
          * Check the length and copy it into the path buffer so it can be
          * stat()'ed.
          */
-        size_t cchName = strlen(pEntry->d_name);
+        size_t cchName = suplibHardenedStrLen(pEntry->d_name);
         if (cchName + cchDirPath > SUPR3HARDENED_MAX_PATH)
         {
             rc = supR3HardenedSetErrorN(VERR_SUPLIB_PATH_TOO_LONG, pErrInfo,
                                         4, "Path grew too long during recursion: '", pszDirPath, pEntry->d_name, "'");
             break;
         }
-        memcpy(&pszDirPath[cchName], pEntry->d_name, cchName + 1);
+        suplibHardenedMemCopy(&pszDirPath[cchName], pEntry->d_name, cchName + 1);
 
         /*
          * Query the information about the entry and verify it.
@@ -1362,8 +1452,8 @@ static int supR3HardenedVerifyDirRecursive(char *pszDirPath, size_t cchDirPath,
          */
         if (    fRecursive
             &&  S_ISDIR(pFsObjState->Stat.st_mode)
-            &&  strcmp(pEntry->d_name, ".")
-            &&  strcmp(pEntry->d_name, ".."))
+            &&  suplibHardenedStrCmp(pEntry->d_name, ".")
+            &&  suplibHardenedStrCmp(pEntry->d_name, ".."))
         {
             pszDirPath[cchDirPath + cchName]     = RTPATH_SLASH;
             pszDirPath[cchDirPath + cchName + 1] = '\0';
@@ -1440,10 +1530,14 @@ DECLHIDDEN(int) supR3HardenedVerifyDir(const char *pszDirPath, bool fRecursive,
  * @param   hNativeFile         Handle to the file, verify that it's the same
  *                              as we ended up with when verifying the path.
  *                              RTHCUINTPTR_MAX means NIL here.
+ * @param   fMaybe3rdParty      Set if the file is could be a supplied by a
+ *                              third party.  Different validation rules may
+ *                              apply to 3rd party code on some platforms.
  * @param   pErrInfo            Where to return extended error information.
  *                              Optional.
  */
-DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile, PRTERRINFO pErrInfo)
+DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNativeFile,
+                                        bool fMaybe3rdParty, PRTERRINFO pErrInfo)
 {
     /*
      * Validate the input path and parse it.
@@ -1475,10 +1569,63 @@ DECLHIDDEN(int) supR3HardenedVerifyFile(const char *pszFilename, RTHCUINTPTR hNa
     }
 
     /*
-     * Verify the file.
+     * Verify the file handle against the last component, if specified.
      */
     if (hNativeFile != RTHCUINTPTR_MAX)
-        return supR3HardenedVerifySameFsObject(hNativeFile, &FsObjState, Info.szPath, pErrInfo);
+    {
+        rc = supR3HardenedVerifySameFsObject(hNativeFile, &FsObjState, Info.szPath, pErrInfo);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+#ifdef RT_OS_WINDOWS
+    /*
+     * The files shall be signed on windows, verify that.
+     */
+    rc = VINF_SUCCESS;
+    HANDLE hVerify;
+    if (hNativeFile == RTHCUINTPTR_MAX)
+    {
+        PRTUTF16 pwszPath;
+        rc = RTStrToUtf16(pszFilename, &pwszPath);
+        if (RT_SUCCESS(rc))
+        {
+            hVerify = CreateFileW(pwszPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+            RTUtf16Free(pwszPath);
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, rc, "Error converting '%s' to UTF-16: %Rrc", pszFilename, rc);
+    }
+    else if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)hNativeFile, GetCurrentProcess(), &hVerify,
+                              GENERIC_READ, false /*bInheritHandle*/, 0 /*dwOptions*/))
+        hVerify = INVALID_HANDLE_VALUE;
+    if (hVerify != INVALID_HANDLE_VALUE)
+    {
+# ifdef VBOX_WITH_HARDENING
+        uint32_t fFlags = SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING;
+        if (!fMaybe3rdParty)
+            fFlags = SUPHNTVI_F_REQUIRE_BUILD_CERT;
+        const char *pszSuffix = RTPathExt(pszFilename);
+        if (   pszSuffix
+            &&                   pszSuffix[0]  == '.'
+            && (   RT_C_TO_LOWER(pszSuffix[1]) == 'r'
+                || RT_C_TO_LOWER(pszSuffix[1]) == 'g')
+            &&     RT_C_TO_LOWER(pszSuffix[2]) == 'c'
+            &&                   pszSuffix[3]  == '\0' )
+            fFlags |= SUPHNTVI_F_RC_IMAGE;
+#  ifndef IN_SUP_R3_STATIC /* Not in VBoxCpuReport and friends. */
+        rc = supHardenedWinVerifyImageByHandleNoName(hVerify, fFlags, pErrInfo);
+#  endif
+# endif
+        CloseHandle(hVerify);
+    }
+    else if (RT_SUCCESS(rc))
+        rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+                           "Error %u trying to open (or duplicate handle for) '%s'", GetLastError(), pszFilename);
+    if (RT_FAILURE(rc))
+        return rc;
+#endif
+
     return VINF_SUCCESS;
 }
 
@@ -1527,7 +1674,7 @@ DECLHIDDEN(int) supR3HardenedRecvPreInitData(PCSUPPREINITDATA pPreInitData)
         if (    g_aSupInstallFiles[iFile].enmDir    != paInstallFiles[iFile].enmDir
             ||  g_aSupInstallFiles[iFile].enmType   != paInstallFiles[iFile].enmType
             ||  g_aSupInstallFiles[iFile].fOptional != paInstallFiles[iFile].fOptional
-            ||  strcmp(g_aSupInstallFiles[iFile].pszFile, paInstallFiles[iFile].pszFile))
+            ||  suplibHardenedStrCmp(g_aSupInstallFiles[iFile].pszFile, paInstallFiles[iFile].pszFile))
             return VERR_VERSION_MISMATCH;
 
     /*
@@ -1541,7 +1688,7 @@ DECLHIDDEN(int) supR3HardenedRecvPreInitData(PCSUPPREINITDATA pPreInitData)
     /*
      * Copy the verification data over.
      */
-    memcpy(&g_aSupVerifiedFiles[0], pPreInitData->paVerifiedFiles, sizeof(g_aSupVerifiedFiles));
-    memcpy(&g_aSupVerifiedDirs[0], pPreInitData->paVerifiedDirs, sizeof(g_aSupVerifiedDirs));
+    suplibHardenedMemCopy(&g_aSupVerifiedFiles[0], pPreInitData->paVerifiedFiles, sizeof(g_aSupVerifiedFiles));
+    suplibHardenedMemCopy(&g_aSupVerifiedDirs[0], pPreInitData->paVerifiedDirs, sizeof(g_aSupVerifiedDirs));
     return VINF_SUCCESS;
 }
diff --git a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
index b0666b3..e7455b6 100644
--- a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
+++ b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
@@ -748,6 +748,25 @@ DECLEXPORT(int) VBOXCALL SUPDrvDarwinIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
 }
 
 
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+    NOREF(pDevExt);
+    NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
 /**
  * Initializes any OS specific object creator fields.
  */
diff --git a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
index f0166b9..9c2cd78 100644
--- a/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
+++ b/src/VBox/HostDrivers/Support/freebsd/SUPDrv-freebsd.c
@@ -495,6 +495,25 @@ int VBOXCALL SUPDrvFreeBSDIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
 }
 
 
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+    NOREF(pDevExt);
+    NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
 void VBOXCALL   supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
 {
     NOREF(pObj);
diff --git a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
index 6000e9d..294636b 100644
--- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
@@ -1,4 +1,4 @@
-/* $Rev: 87729 $ */
+/* $Rev: 94753 $ */
 /** @file
  * VBoxDrv - The VirtualBox Support Driver - Linux specifics.
  */
@@ -782,6 +782,25 @@ int VBOXCALL SUPDrvLinuxIDC(uint32_t uReq, PSUPDRVIDCREQHDR pReq)
 EXPORT_SYMBOL(SUPDrvLinuxIDC);
 
 
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+    NOREF(pDevExt);
+    NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
 /**
  * Initializes any OS specific object creator fields.
  */
diff --git a/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp b/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
index 0eecf13..15267cd 100644
--- a/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
+++ b/src/VBox/HostDrivers/Support/os2/SUPDrv-os2.cpp
@@ -363,6 +363,25 @@ DECLASM(int) VBoxDrvIOCtl(uint16_t sfn, uint8_t iCat, uint8_t iFunction, void *p
 }
 
 
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+    NOREF(pDevExt);
+    NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
 void VBOXCALL   supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
 {
     NOREF(pObj);
diff --git a/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c b/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
index 9b0f60b..2c4772c 100644
--- a/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
+++ b/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
@@ -887,6 +887,25 @@ static int VBoxSupDrvErr2SolarisErr(int rc)
 }
 
 
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+    NOREF(pDevExt);
+    NOREF(pSession);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
 /**
  * Initializes any OS specific object creator fields.
  */
diff --git a/src/VBox/HostDrivers/Support/testcase/Makefile.kmk b/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
index 534f426..efa06a6 100644
--- a/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
+++ b/src/VBox/HostDrivers/Support/testcase/Makefile.kmk
@@ -4,7 +4,7 @@
 #
 
 #
-# Copyright (C) 2006-2012 Oracle Corporation
+# Copyright (C) 2006-2014 Oracle Corporation
 #
 # This file is part of VirtualBox Open Source Edition (OSE), as
 # available from http://www.virtualbox.org. This file is free software;
@@ -32,6 +32,7 @@ PROGRAMS += \
 	SUPUninstall \
 	SUPLoggerCtl
 ifdef VBOX_WITH_TESTCASES
+ if !defined(VBOX_WITH_HARDENING) || "$(KBUILD_TARGET)" != "win"
 PROGRAMS += \
 	tstPage \
 	tstContiguous \
@@ -44,6 +45,7 @@ PROGRAMS += \
 	tstSupLoadModule \
 	tstSupSem \
 	tstSupSem-Zombie
+ endif
 PROGRAMS.win += \
 	tstNtQueryStuff
 endif # VBOX_WITH_TESTCASES
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
index 35b6d89..bcde4be 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
@@ -44,7 +44,14 @@ int main(int argc, char **argv)
     int rc = SUPR3Install();
     if (RT_SUCCESS(rc))
     {
-        RTMsgInfo("installed successfully");
+        if (rc == VINF_SUCCESS)
+            RTMsgInfo("Installed successfully!");
+        else if (rc == VINF_ALREADY_INITIALIZED)
+            RTMsgInfo("Already loaded.");
+        else if (rc == VWRN_ALREADY_EXISTS)
+            RTMsgInfo("Service already existed; started successfully.");
+        else
+            RTMsgInfo("Unexpected status: %Rrc", rc);
         return RTEXITCODE_SUCCESS;
     }
     return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
diff --git a/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp b/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
index 02f5bf3..919e3c5 100644
--- a/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
+++ b/src/VBox/HostDrivers/Support/testcase/tstNtQueryStuff.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,43 +28,7 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <ntstatus.h>
-#define WIN32_NO_STATUS
-#include <Windows.h>
-#include <winternl.h>
-
-typedef enum
-{
-    MemoryBasicInformation = 0,
-    MemoryWorkingSetList,
-    MemorySectionName,
-    MemoryBasicVlmInformation
-} MEMORY_INFORMATION_CLASS;
-
-typedef struct
-{
-    UNICODE_STRING  SectionFileName;
-    WCHAR           NameBuffer[ANYSIZE_ARRAY];
-} MEMORY_SECTION_NAME;
-
-extern "C"
-NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE hProcess,
-                                             IN LPCVOID pvWhere,
-                                             IN MEMORY_INFORMATION_CLASS MemoryInfo,
-                                             OUT PVOID pvBuf,
-                                             IN SIZE_T cbBuf,
-                                             OUT PSIZE_T pcbReturned OPTIONAL);
-
-#define ProcessDebugPort            ((PROCESSINFOCLASS)7 )
-#define ProcessHandleCount          ((PROCESSINFOCLASS)20)
-#define ProcessWow64Information     ((PROCESSINFOCLASS)26)
-#define ProcessImageFileName        ((PROCESSINFOCLASS)27)
-#define ProcessDebugObjectHandle    ((PROCESSINFOCLASS)30)
-#define ProcessExecuteFlags         ((PROCESSINFOCLASS)34)
-#define ProcessImageFileNameWin32   ((PROCESSINFOCLASS)43)
-#define ProcessImageFileMapping     ((PROCESSINFOCLASS)44)
-
-
+#include <iprt/nt/nt-and-windows.h>
 #include <iprt/test.h>
 #include <iprt/string.h>
 
@@ -303,22 +267,21 @@ static void tstQueryInformationProcess(void)
     RTTESTI_CHECK_MSG(NT_SUCCESS(rcNt), ("rcNt=%#x\n", rcNt));
     if (NT_SUCCESS(rcNt))
         RTTestIPrintf(RTTESTLVL_ALWAYS, "BasicInfo:\n"
-                                        "    UniqueProcessId = %#x (%6d)\n"
+                                        "    UniqueProcessId              = %#x (%6d)\n"
+                                        "    InheritedFromUniqueProcessId = %#x (%6d)\n"
+                                        "    ExitStatus      = %#x\n"
                                         "    PebBaseAddress  = %p\n"
-                                        "    Reserved1       = %p          ExitStatus?\n"
-                                        "    Reserved2a      = %p          AffinityMask?\n"
-                                        "    Reserved2b      = %p (%6d) BasePriority?\n"
-                                        "    Reserved3       = %p (%6d) InheritedFromUniqueProcessId?\n"
+                                        "    AffinityMask    = %#zx\n"
+                                        "    BasePriority    = %#zx\n"
                       ,
                       BasicInfo.UniqueProcessId, BasicInfo.UniqueProcessId,
+                      BasicInfo.InheritedFromUniqueProcessId, BasicInfo.InheritedFromUniqueProcessId,
+                      BasicInfo.ExitStatus,
                       BasicInfo.PebBaseAddress,
-                      BasicInfo.Reserved1,
-                      BasicInfo.Reserved2[0],
-                      BasicInfo.Reserved2[1], BasicInfo.Reserved2[1],
-                      BasicInfo.Reserved3, BasicInfo.Reserved3
+                      BasicInfo.AffinityMask,
+                      BasicInfo.BasePriority
                       );
 
-
     /* Debugger present? */
     DWORD_PTR uPtr = ~(DWORD_PTR)0;
     cbActual = 0;
@@ -434,7 +397,7 @@ static void tstQueryInformationProcess(void)
 }
 
 
-int main()
+int main(int argc, char **argv)
 {
     RTEXITCODE rcExit = RTTestInitAndCreate("tstNtQueryStuff", &g_hTest);
     if (rcExit != RTEXITCODE_SUCCESS)
@@ -442,10 +405,25 @@ int main()
     RTTestBanner(g_hTest);
 
     g_hProcess = GetCurrentProcess();
+    if (argc >= 2 && argv[1][0] != '-')
+    {
+        const char *pszPid = argv[1];
+        uint32_t idPid = RTStrToInt32(pszPid);
 
-    //tstQueryVirtualMemory();
-    tstQueryInformationProcess();
+        uint32_t fAccess = PROCESS_QUERY_INFORMATION;
+        if (argc >= 3)
+            fAccess = RTStrToInt32(argv[2]);
 
+        g_hProcess = OpenProcess(fAccess, FALSE, idPid);
+        if (g_hProcess == NULL)
+        {
+            RTTestIFailed("Error %u opening process %u (%s)\n", GetLastError(), idPid, pszPid);
+            return RTTestSummaryAndDestroy(g_hTest);
+        }
+    }
+
+    tstQueryVirtualMemory();
+    tstQueryInformationProcess();
 
     return RTTestSummaryAndDestroy(g_hTest);
 }
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup
similarity index 100%
copy from src/VBox/Runtime/common/ldr/Makefile.kup
copy to src/VBox/HostDrivers/Support/win/Certificates/Makefile.kup
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf
new file mode 100644
index 0000000..486b6fd
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/NtRoot-MicrosoftCodeVerificationRoot-729404101f3e0ca347837fca175a8438.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf
new file mode 100644
index 0000000..7b46d69
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftAuthenticodeTmRootAuthority-01.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf
new file mode 100644
index 0000000..e55039a
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftDigitalMediaAuthority2005-6eff330eb6e7569740680870104baaba.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf
new file mode 100644
index 0000000..46c6250
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootAuthority-00c1008b3c3c8811d13ef663ecdf40.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf
new file mode 100644
index 0000000..3131fc2
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority-79ad16a14aa0a5ad4c7358f407132e65.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf
new file mode 100644
index 0000000..945de02
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2010-28cc3a25bfba44ac449a9b586b4339aa.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf
new file mode 100644
index 0000000..610b14f
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/SpcRoot-MicrosoftRootCertificateAuthority2011-3f8bc8b5fc9fb29643b569d66c42e144.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf b/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf
new file mode 100644
index 0000000..b9d8f7b
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/Timestamp-CopyrightC1997MicrosoftCorp-01.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer
new file mode 100644
index 0000000..abb6ee6
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.cer differ
diff --git a/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf
new file mode 100644
index 0000000..1bc36b6
Binary files /dev/null and b/src/VBox/HostDrivers/Support/win/Certificates/Trusted-OracleCorporationVirtualBox-51ca009816fdbd80f120e015ee75823e.taf differ
diff --git a/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h
new file mode 100644
index 0000000..2b8c8c8
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-amd64-syscall-type-1.h
@@ -0,0 +1,78 @@
+SYSCALL(0x30);
+SYSCALL(0x31);
+SYSCALL(0x32);
+SYSCALL(0x33);
+SYSCALL(0x34);
+SYSCALL(0x35);
+SYSCALL(0x36);
+SYSCALL(0x37);
+SYSCALL(0x38);
+SYSCALL(0x39);
+SYSCALL(0x3A);
+SYSCALL(0x3B);
+SYSCALL(0x3C);
+SYSCALL(0x3D);
+SYSCALL(0x3E);
+SYSCALL(0x3F);
+SYSCALL(0x40);
+SYSCALL(0x41);
+SYSCALL(0x42);
+SYSCALL(0x43);
+SYSCALL(0x44);
+SYSCALL(0x45);
+SYSCALL(0x46);
+SYSCALL(0x47); /* XP64/W2K3-64, Vista, Windows 7 */
+SYSCALL(0x48); /* Windows 8.0 */
+SYSCALL(0x49); /* windows 8.1 */
+SYSCALL(0x4A);
+SYSCALL(0x4B);
+SYSCALL(0x4C);
+SYSCALL(0x4D);
+SYSCALL(0x4E);
+SYSCALL(0x4F);
+SYSCALL(0x51);
+SYSCALL(0x52);
+SYSCALL(0x53);
+SYSCALL(0x54);
+SYSCALL(0x55);
+SYSCALL(0x56);
+SYSCALL(0x57);
+SYSCALL(0x59);
+SYSCALL(0x5A);
+SYSCALL(0x5B);
+SYSCALL(0x5C);
+SYSCALL(0x5D);
+SYSCALL(0x5E);
+SYSCALL(0x5F);
+SYSCALL(0x60);
+SYSCALL(0x61);
+SYSCALL(0x62);
+SYSCALL(0x63);
+SYSCALL(0x64);
+SYSCALL(0x65);
+SYSCALL(0x66);
+SYSCALL(0x67);
+SYSCALL(0x68);
+SYSCALL(0x69);
+SYSCALL(0x6A);
+SYSCALL(0x6B);
+SYSCALL(0x6C);
+SYSCALL(0x6D);
+SYSCALL(0x6E);
+SYSCALL(0x6F);
+SYSCALL(0x70);
+SYSCALL(0x71);
+SYSCALL(0x72);
+SYSCALL(0x73);
+SYSCALL(0x74);
+SYSCALL(0x75);
+SYSCALL(0x76);
+SYSCALL(0x77);
+SYSCALL(0x78);
+SYSCALL(0x79);
+SYSCALL(0x7A);
+SYSCALL(0x7B);
+SYSCALL(0x7C);
+SYSCALL(0x7D);
+SYSCALL(0x7E);
+SYSCALL(0x7F);
diff --git a/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h
new file mode 100644
index 0000000..f80a4d3
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/NtCreateSection-template-x86-syscall-type-1.h
@@ -0,0 +1,286 @@
+SYSCALL(0x28);
+SYSCALL(0x29);
+SYSCALL(0x2A);
+SYSCALL(0x2B);
+SYSCALL(0x2C);
+SYSCALL(0x2D);
+SYSCALL(0x2E);
+SYSCALL(0x2F);
+SYSCALL(0x30);
+SYSCALL(0x31);
+
+SYSCALL(0x32); /* WinXP */
+SYSCALL(0x33);
+
+SYSCALL(0x34); /* W2K3 */
+SYSCALL(0x35);
+SYSCALL(0x36);
+SYSCALL(0x37);
+SYSCALL(0x38);
+SYSCALL(0x39);
+SYSCALL(0x3A);
+SYSCALL(0x3B);
+SYSCALL(0x3C);
+SYSCALL(0x3D);
+SYSCALL(0x3E);
+SYSCALL(0x3F);
+SYSCALL(0x40);
+SYSCALL(0x41);
+SYSCALL(0x42);
+SYSCALL(0x43);
+SYSCALL(0x44);
+SYSCALL(0x45);
+SYSCALL(0x46);
+SYSCALL(0x47);
+SYSCALL(0x48);
+SYSCALL(0x49);
+SYSCALL(0x4A);
+
+SYSCALL(0x4B); /* Vista */
+SYSCALL(0x4C);
+SYSCALL(0x4D);
+SYSCALL(0x4E);
+SYSCALL(0x4F);
+SYSCALL(0x50);
+SYSCALL(0x51);
+SYSCALL(0x52);
+SYSCALL(0x53);
+
+SYSCALL(0x54); /* Windows 7 */
+SYSCALL(0x55);
+SYSCALL(0x56);
+SYSCALL(0x57);
+SYSCALL(0x59);
+SYSCALL(0x5A);
+SYSCALL(0x5B);
+SYSCALL(0x5C);
+SYSCALL(0x5D);
+SYSCALL(0x5E);
+SYSCALL(0x5F);
+SYSCALL(0x60);
+SYSCALL(0x61);
+SYSCALL(0x62);
+SYSCALL(0x63);
+SYSCALL(0x64);
+SYSCALL(0x65);
+SYSCALL(0x66);
+SYSCALL(0x67);
+SYSCALL(0x68);
+SYSCALL(0x69);
+SYSCALL(0x6A);
+SYSCALL(0x6B);
+SYSCALL(0x6C);
+SYSCALL(0x6D);
+SYSCALL(0x6E);
+SYSCALL(0x6F);
+SYSCALL(0x70);
+SYSCALL(0x71);
+SYSCALL(0x72);
+SYSCALL(0x73);
+SYSCALL(0x74);
+SYSCALL(0x75);
+SYSCALL(0x76);
+SYSCALL(0x77);
+SYSCALL(0x78);
+SYSCALL(0x79);
+SYSCALL(0x7A);
+SYSCALL(0x7B);
+SYSCALL(0x7C);
+SYSCALL(0x7D);
+SYSCALL(0x7E);
+SYSCALL(0x7F);
+SYSCALL(0x80);
+SYSCALL(0x81);
+SYSCALL(0x82);
+SYSCALL(0x83);
+SYSCALL(0x84);
+SYSCALL(0x85);
+SYSCALL(0x86);
+SYSCALL(0x87);
+SYSCALL(0x88);
+SYSCALL(0x89);
+SYSCALL(0x8A);
+SYSCALL(0x8B);
+SYSCALL(0x8C);
+SYSCALL(0x8D);
+SYSCALL(0x8E);
+SYSCALL(0x8F);
+SYSCALL(0x90);
+SYSCALL(0x91);
+SYSCALL(0x92);
+SYSCALL(0x93);
+SYSCALL(0x94);
+SYSCALL(0x95);
+SYSCALL(0x96);
+SYSCALL(0x97);
+SYSCALL(0x98);
+SYSCALL(0x99);
+SYSCALL(0x9A);
+SYSCALL(0x9B);
+SYSCALL(0x9C);
+SYSCALL(0x9D);
+SYSCALL(0x9E);
+SYSCALL(0x9F);
+
+SYSCALL(0x100);
+SYSCALL(0x101);
+SYSCALL(0x102);
+SYSCALL(0x103);
+SYSCALL(0x104);
+SYSCALL(0x105);
+SYSCALL(0x106);
+SYSCALL(0x107);
+SYSCALL(0x108);
+SYSCALL(0x109);
+SYSCALL(0x10A);
+SYSCALL(0x10B);
+SYSCALL(0x10C);
+SYSCALL(0x10D);
+SYSCALL(0x10E);
+SYSCALL(0x10F);
+SYSCALL(0x110);
+SYSCALL(0x111);
+SYSCALL(0x112);
+SYSCALL(0x113);
+SYSCALL(0x114);
+SYSCALL(0x115);
+SYSCALL(0x116);
+SYSCALL(0x117);
+SYSCALL(0x118);
+SYSCALL(0x119);
+SYSCALL(0x11A);
+SYSCALL(0x11B);
+SYSCALL(0x11C);
+SYSCALL(0x11D);
+SYSCALL(0x11E);
+SYSCALL(0x11F);
+SYSCALL(0x120);
+SYSCALL(0x121);
+SYSCALL(0x122);
+SYSCALL(0x123);
+SYSCALL(0x124);
+SYSCALL(0x125);
+SYSCALL(0x126);
+SYSCALL(0x127);
+SYSCALL(0x128);
+SYSCALL(0x129);
+SYSCALL(0x12A);
+SYSCALL(0x12B);
+SYSCALL(0x12C);
+SYSCALL(0x12D);
+SYSCALL(0x12E);
+SYSCALL(0x12F);
+SYSCALL(0x130);
+SYSCALL(0x131);
+SYSCALL(0x132);
+SYSCALL(0x133);
+SYSCALL(0x134);
+SYSCALL(0x135);
+SYSCALL(0x136);
+SYSCALL(0x137);
+SYSCALL(0x138);
+SYSCALL(0x139);
+SYSCALL(0x13A);
+SYSCALL(0x13B);
+SYSCALL(0x13C);
+SYSCALL(0x13D);
+SYSCALL(0x13E);
+SYSCALL(0x13F);
+SYSCALL(0x140);
+SYSCALL(0x141);
+SYSCALL(0x142);
+SYSCALL(0x143);
+SYSCALL(0x144);
+SYSCALL(0x145);
+SYSCALL(0x146);
+SYSCALL(0x147);
+SYSCALL(0x148);
+SYSCALL(0x149);
+SYSCALL(0x14A);
+SYSCALL(0x14B);
+SYSCALL(0x14C);
+SYSCALL(0x14D);
+SYSCALL(0x14E);
+SYSCALL(0x14F);
+SYSCALL(0x150);
+SYSCALL(0x151);
+SYSCALL(0x152);
+SYSCALL(0x153);
+
+SYSCALL(0x154); /* Windows 8.1 */
+SYSCALL(0x155);
+SYSCALL(0x156);
+SYSCALL(0x157);
+SYSCALL(0x158);
+SYSCALL(0x159);
+SYSCALL(0x15A);
+SYSCALL(0x15B);
+SYSCALL(0x15C);
+SYSCALL(0x15D);
+SYSCALL(0x15E);
+SYSCALL(0x15F);
+SYSCALL(0x160);
+SYSCALL(0x161);
+SYSCALL(0x162);
+SYSCALL(0x163);
+SYSCALL(0x164);
+SYSCALL(0x165);
+SYSCALL(0x166);
+SYSCALL(0x167);
+SYSCALL(0x168);
+SYSCALL(0x169);
+SYSCALL(0x16A);
+SYSCALL(0x16B);
+SYSCALL(0x16C);
+SYSCALL(0x16D);
+SYSCALL(0x16E);
+SYSCALL(0x16F);
+SYSCALL(0x170);
+SYSCALL(0x171);
+SYSCALL(0x172);
+SYSCALL(0x173);
+SYSCALL(0x174);
+SYSCALL(0x175);
+SYSCALL(0x176);
+SYSCALL(0x177);
+SYSCALL(0x178);
+SYSCALL(0x179);
+SYSCALL(0x17A);
+SYSCALL(0x17B);
+SYSCALL(0x17C);
+SYSCALL(0x17D);
+SYSCALL(0x17E);
+SYSCALL(0x17F);
+SYSCALL(0x180);
+SYSCALL(0x181);
+SYSCALL(0x182);
+SYSCALL(0x183);
+SYSCALL(0x184);
+SYSCALL(0x185);
+SYSCALL(0x186);
+SYSCALL(0x187);
+SYSCALL(0x188);
+SYSCALL(0x189);
+SYSCALL(0x18A);
+SYSCALL(0x18B);
+SYSCALL(0x18C);
+SYSCALL(0x18D);
+SYSCALL(0x18E);
+SYSCALL(0x18F);
+SYSCALL(0x190);
+SYSCALL(0x191);
+SYSCALL(0x192);
+SYSCALL(0x193);
+SYSCALL(0x194);
+SYSCALL(0x195);
+SYSCALL(0x196);
+SYSCALL(0x197);
+SYSCALL(0x198);
+SYSCALL(0x199);
+SYSCALL(0x19A);
+SYSCALL(0x19B);
+SYSCALL(0x19C);
+SYSCALL(0x19D);
+SYSCALL(0x19E);
+SYSCALL(0x19F);
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp b/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
index a3cafc6..45e93d5 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
+++ b/src/VBox/HostDrivers/Support/win/SUPDrv-win.cpp
@@ -27,18 +27,29 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
+#define IPRT_NT_MAP_TO_ZW
 #define LOG_GROUP LOG_GROUP_SUP_DRV
 #include "../SUPDrvInternal.h"
 #include <excpt.h>
 #include <ntimage.h>
 
 #include <iprt/assert.h>
+#include <iprt/avl.h>
+#include <iprt/ctype.h>
 #include <iprt/initterm.h>
 #include <iprt/mem.h>
 #include <iprt/process.h>
 #include <iprt/power.h>
+#include <iprt/spinlock.h>
 #include <iprt/string.h>
 #include <VBox/log.h>
+#include <VBox/err.h>
+
+#include <iprt/asm-amd64-x86.h>
+
+#ifdef VBOX_WITH_HARDENING
+# include "SUPHardenedVerify-win.h"
+#endif
 
 
 /*******************************************************************************
@@ -49,33 +60,28 @@
 /** The Pool tag (VBox). */
 #define SUPDRV_NT_POOL_TAG  'xoBV'
 
-/** Win32 device name for system access. */
-#define DEVICE_NAME_SYS         "\\\\.\\VBoxDrv"
 /** NT device name for system access. */
 #define DEVICE_NAME_NT_SYS      L"\\Device\\VBoxDrv"
-/** Win Symlink name for system access. */
-#define DEVICE_NAME_DOS_SYS     L"\\DosDevices\\VBoxDrv"
-
-/** Win32 device name for user access. */
-#define DEVICE_NAME_USR         "\\\\.\\VBoxDrvU"
 /** NT device name for user access. */
 #define DEVICE_NAME_NT_USR      L"\\Device\\VBoxDrvU"
-/** Win Symlink name for user access. */
-#define DEVICE_NAME_DOS_USR     L"\\DosDevices\\VBoxDrvU"
+#ifdef VBOX_WITH_HARDENING
+/** NT device name for hardened stub access. */
+# define DEVICE_NAME_NT_STUB    L"\\Device\\VBoxDrvStub"
+
+/** Macro for checking for deflecting calls to the stub device. */
+# define VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(a_pDevObj, a_pIrp) \
+    do { if ((a_pDevObj) == g_pDevObjStub) supdrvNtCompleteRequest(STATUS_ACCESS_DENIED, a_pIrp); } while (0)
+#else
+# define VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(a_pDevObj, a_pIrp) do {} while (0)
+#endif
+
+/** Enables the fast I/O control code path. */
+#define VBOXDRV_WITH_FAST_IO
 
 
 /*******************************************************************************
 *   Structures and Typedefs                                                    *
 *******************************************************************************/
-#if 0 //def RT_ARCH_AMD64
-typedef struct SUPDRVEXECMEM
-{
-    PMDL pMdl;
-    void *pvMapping;
-    void *pvAllocation;
-} SUPDRVEXECMEM, *PSUPDRVEXECMEM;
-#endif
-
 /**
  * Device extension used by VBoxDrvU.
  */
@@ -98,6 +104,122 @@ typedef SUPDRVDEVEXTUSR *PSUPDRVDEVEXTUSR;
      ? (PSUPDRVDEVEXT)pDevObj->DeviceExtension \
      : ((PSUPDRVDEVEXTUSR)pDevObj->DeviceExtension)->pMainDrvExt )
 
+#ifdef VBOX_WITH_HARDENING
+
+/**
+ * Device extension used by VBoxDrvS.
+ */
+typedef struct SUPDRVDEVEXTSTUB
+{
+    /** Common header. */
+    SUPDRVDEVEXTUSR     Common;
+} SUPDRVDEVEXTSTUB;
+/** Pointer to the VBoxDrvS device extension. */
+typedef SUPDRVDEVEXTSTUB *PSUPDRVDEVEXTSTUB;
+/** Value of SUPDRVDEVEXTSTUB::Common.u32Cookie. */
+#define SUPDRVDEVEXTSTUB_COOKIE      UINT32_C(0x90abcdef)
+
+
+/**
+ * The kind of process we're protecting.
+ */
+typedef enum SUPDRVNTPROTECTKIND
+{
+    kSupDrvNtProtectKind_Invalid = 0,
+
+    /** Stub process protection while performing process verification.
+     * Next: StubSpawning (or free)  */
+    kSupDrvNtProtectKind_StubUnverified,
+    /** Stub process protection before it creates the VM process.
+     * Next: StubParent, StubDead. */
+    kSupDrvNtProtectKind_StubSpawning,
+    /** Stub process protection while having a VM process as child.
+     * Next: StubDead  */
+    kSupDrvNtProtectKind_StubParent,
+    /** Dead stub process. */
+    kSupDrvNtProtectKind_StubDead,
+
+    /** Potential VM process.
+     * Next: VmProcessConfirmed, VmProcessDead. */
+    kSupDrvNtProtectKind_VmProcessUnconfirmed,
+    /** Confirmed VM process.
+     * Next: VmProcessDead. */
+    kSupDrvNtProtectKind_VmProcessConfirmed,
+    /** Dead VM process. */
+    kSupDrvNtProtectKind_VmProcessDead,
+
+    /** End of valid protection kinds. */
+    kSupDrvNtProtectKind_End
+} SUPDRVNTPROTECTKIND;
+
+/**
+ * A NT process protection structure.
+ */
+typedef struct SUPDRVNTPROTECT
+{
+    /** The AVL node core structure.  The process ID is the pid. */
+    AVLPVNODECORE       AvlCore;
+    /** Magic value (SUPDRVNTPROTECT_MAGIC). */
+    uint32_t volatile   u32Magic;
+    /** Reference counter. */
+    uint32_t volatile   cRefs;
+    /** The kind of process we're protecting. */
+    SUPDRVNTPROTECTKIND volatile enmProcessKind;
+    /** Vista, 7 & 8: Hack to allow more rights to the handle returned by
+     *  NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+    bool                fFirstProcessCreateHandle : 1;
+    /** Vista, 7 & 8: Hack to allow more rights to the handle returned by
+     *  NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+    bool                fFirstThreadCreateHandle : 1;
+    /** 8.1: Hack to allow more rights to the handle returned by
+     *  NtCreateUserProcess. Only applicable to VmProcessUnconfirmed. */
+    bool                fCsrssFirstProcessCreateHandle : 1;
+    /** Vista, 7 & 8: Hack to allow more rights to the handle duplicated by CSR
+     *  during process creation. Only applicable to VmProcessUnconfirmed. */
+    bool                fCsrssFirstProcessDuplicateHandle : 1;
+    /** 7,: Hack to allow the supid themes service duplicate handle privileges to
+     *  our process. */
+    bool                fThemesFirstProcessCreateHandle : 1;
+
+    /** The parent PID for VM processes, otherwise NULL. */
+    HANDLE              hParentPid;
+    /** The PID of the CSRSS process associated with this process. */
+    HANDLE              hCsrssPid;
+    /** Pointer to the CSRSS process structure (referenced). */
+    PEPROCESS           pCsrssProcess;
+    /** State dependent data. */
+    union
+    {
+        /** A stub process in the StubParent state will keep a reference to a child
+         * while it's in the VmProcessUnconfirmed state so that it can be cleaned up
+         * correctly if things doesn't work out. */
+        struct SUPDRVNTPROTECT *pChild;
+        /** A process in the VmProcessUnconfirmed state will keep a weak
+         * reference to the parent's protection structure so it can clean up the pChild
+         * refernece the parent has to it. */
+        struct SUPDRVNTPROTECT *pParent;
+    } u;
+} SUPDRVNTPROTECT;
+/** Pointer to a NT process protection record. */
+typedef SUPDRVNTPROTECT *PSUPDRVNTPROTECT;
+/** The SUPDRVNTPROTECT::u32Magic value (Robert A. Heinlein). */
+# define SUPDRVNTPROTECT_MAGIC      UINT32_C(0x19070707)
+/** The SUPDRVNTPROTECT::u32Magic value of a dead structure. */
+# define SUPDRVNTPROTECT_MAGIC_DEAD UINT32_C(0x19880508)
+
+/** Pointer to ObRegisterCallbacks. */
+typedef NTSTATUS (NTAPI *PFNOBREGISTERCALLBACKS)(POB_CALLBACK_REGISTRATION, PVOID *);
+/** Pointer to ObUnregisterCallbacks. */
+typedef VOID     (NTAPI *PFNOBUNREGISTERCALLBACKS)(PVOID);
+/** Pointer to PsSetCreateProcessNotifyRoutineEx. */
+typedef NTSTATUS (NTAPI *PFNPSSETCREATEPROCESSNOTIFYROUTINEEX)(PCREATE_PROCESS_NOTIFY_ROUTINE_EX, BOOLEAN);
+/** Pointer to PsReferenceProcessFilePointer. */
+typedef NTSTATUS (NTAPI *PFNPSREFERENCEPROCESSFILEPOINTER)(PEPROCESS, PFILE_OBJECT *);
+/** Pointer to PsIsProtectedProcessLight. */
+typedef BOOLEAN  (NTAPI *PFNPSISPROTECTEDPROCESSLIGHT)(PEPROCESS);
+
+#endif /* VBOX_WITH_HARDENINIG */
+
 
 /*******************************************************************************
 *   Internal Functions                                                         *
@@ -106,12 +228,29 @@ static void     _stdcall   VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj);
 static NTSTATUS _stdcall   VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
 static NTSTATUS _stdcall   VBoxDrvNtCleanup(PDEVICE_OBJECT pDevObj, PIRP pIrp);
 static NTSTATUS _stdcall   VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
+#ifdef VBOXDRV_WITH_FAST_IO
+static BOOLEAN  _stdcall   VBoxDrvNtFastIoDeviceControl(PFILE_OBJECT pFileObj, BOOLEAN fWait, PVOID pvInput, ULONG cbInput,
+                                                        PVOID pvOutput, ULONG cbOutput, ULONG uCmd,
+                                                        PIO_STATUS_BLOCK pIoStatus, PDEVICE_OBJECT pDevObj);
+#endif
 static NTSTATUS _stdcall   VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
 static int                 VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack);
 static NTSTATUS _stdcall   VBoxDrvNtInternalDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
 static VOID     _stdcall   VBoxPowerDispatchCallback(PVOID pCallbackContext, PVOID pArgument1, PVOID pArgument2);
 static NTSTATUS _stdcall   VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);
 static NTSTATUS            VBoxDrvNtErr2NtStatus(int rc);
+#ifdef VBOX_WITH_HARDENING
+static NTSTATUS             supdrvNtProtectInit(void);
+static void                 supdrvNtProtectTerm(void);
+static int                  supdrvNtProtectCreate(PSUPDRVNTPROTECT *ppNtProtect, HANDLE hPid,
+                                                  SUPDRVNTPROTECTKIND enmProcessKind, bool fLink);
+static void                 supdrvNtProtectRelease(PSUPDRVNTPROTECT pNtProtect);
+static PSUPDRVNTPROTECT     supdrvNtProtectLookup(HANDLE hPid);
+static int                  supdrvNtProtectFindAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect);
+static int                  supdrvNtProtectVerifyProcess(PSUPDRVNTPROTECT pNtProtect);
+
+static bool                 supdrvNtIsDebuggerAttached(void);
+#endif
 
 
 /*******************************************************************************
@@ -129,6 +268,75 @@ RT_C_DECLS_END
 static PDEVICE_OBJECT g_pDevObjSys = NULL;
 /** Pointer to the user device instance. */
 static PDEVICE_OBJECT g_pDevObjUsr = NULL;
+#ifdef VBOXDRV_WITH_FAST_IO
+/** Fast I/O dispatch table. */
+static FAST_IO_DISPATCH const g_VBoxDrvFastIoDispatch =
+{
+    /* .SizeOfFastIoDispatch            = */ sizeof(g_VBoxDrvFastIoDispatch),
+    /* .FastIoCheckIfPossible           = */ NULL,
+    /* .FastIoRead                      = */ NULL,
+    /* .FastIoWrite                     = */ NULL,
+    /* .FastIoQueryBasicInfo            = */ NULL,
+    /* .FastIoQueryStandardInfo         = */ NULL,
+    /* .FastIoLock                      = */ NULL,
+    /* .FastIoUnlockSingle              = */ NULL,
+    /* .FastIoUnlockAll                 = */ NULL,
+    /* .FastIoUnlockAllByKey            = */ NULL,
+    /* .FastIoDeviceControl             = */ VBoxDrvNtFastIoDeviceControl,
+    /* .AcquireFileForNtCreateSection   = */ NULL,
+    /* .ReleaseFileForNtCreateSection   = */ NULL,
+    /* .FastIoDetachDevice              = */ NULL,
+    /* .FastIoQueryNetworkOpenInfo      = */ NULL,
+    /* .AcquireForModWrite              = */ NULL,
+    /* .MdlRead                         = */ NULL,
+    /* .MdlReadComplete                 = */ NULL,
+    /* .PrepareMdlWrite                 = */ NULL,
+    /* .MdlWriteComplete                = */ NULL,
+    /* .FastIoReadCompressed            = */ NULL,
+    /* .FastIoWriteCompressed           = */ NULL,
+    /* .MdlReadCompleteCompressed       = */ NULL,
+    /* .MdlWriteCompleteCompressed      = */ NULL,
+    /* .FastIoQueryOpen                 = */ NULL,
+    /* .ReleaseForModWrite              = */ NULL,
+    /* .AcquireForCcFlush               = */ NULL,
+    /* .ReleaseForCcFlush               = */ NULL,
+};
+#endif /* VBOXDRV_WITH_FAST_IO */
+
+#ifdef VBOX_WITH_HARDENING
+/** Pointer to the stub device instance. */
+static PDEVICE_OBJECT               g_pDevObjStub = NULL;
+/** Spinlock protecting g_NtProtectTree as well as the releasing of protection
+ *  structures. */
+static RTSPINLOCK                   g_hNtProtectLock = NIL_RTSPINLOCK;
+/** AVL tree of SUPDRVNTPROTECT structures. */
+static AVLPVTREE                    g_NtProtectTree  = NULL;
+/** Cookie returned by ObRegisterCallbacks for the callbacks. */
+static PVOID                        g_pvObCallbacksCookie = NULL;
+/** Combined windows NT version number.  See SUP_MAKE_NT_VER_COMBINED. */
+uint32_t                            g_uNtVerCombined = 0;
+/** Pointer to ObRegisterCallbacks if available.. */
+static PFNOBREGISTERCALLBACKS       g_pfnObRegisterCallbacks = NULL;
+/** Pointer to ObUnregisterCallbacks if available.. */
+static PFNOBUNREGISTERCALLBACKS     g_pfnObUnRegisterCallbacks = NULL;
+/** Pointer to PsSetCreateProcessNotifyRoutineEx if available.. */
+static PFNPSSETCREATEPROCESSNOTIFYROUTINEEX g_pfnPsSetCreateProcessNotifyRoutineEx = NULL;
+/** Pointer to PsReferenceProcessFilePointer if available. */
+static PFNPSREFERENCEPROCESSFILEPOINTER g_pfnPsReferenceProcessFilePointer = NULL;
+/** Pointer to PsIsProtectedProcessLight. */
+static PFNPSISPROTECTEDPROCESSLIGHT g_pfnPsIsProtectedProcessLight = NULL;
+
+# ifdef RT_ARCH_AMD64
+extern "C" {
+/** Pointer to KiServiceLinkage (used to fake missing ZwQueryVirtualMemory on
+ *  XP64 / W2K3-64). */
+PFNRT                               g_pfnKiServiceLinkage  = NULL;
+/** Pointer to KiServiceInternal (used to fake missing ZwQueryVirtualMemory on
+ *  XP64 / W2K3-64) */
+PFNRT                               g_pfnKiServiceInternal = NULL;
+}
+# endif
+#endif
 
 
 /**
@@ -147,36 +355,44 @@ static NTSTATUS vboxdrvNtCreateDevices(PDRIVER_OBJECT pDrvObj)
     NTSTATUS rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXT), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjSys);
     if (NT_SUCCESS(rcNt))
     {
-        UNICODE_STRING DosName;
-        RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_SYS);
-        rcNt = IoCreateSymbolicLink(&DosName, &DevName);
+        /*
+         * User device.
+         */
+        RtlInitUnicodeString(&DevName, DEVICE_NAME_NT_USR);
+        rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXTUSR), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjUsr);
         if (NT_SUCCESS(rcNt))
         {
+            PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
+            pDevExtUsr->pMainDrvExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+            pDevExtUsr->u32Cookie   = SUPDRVDEVEXTUSR_COOKIE;
+
+#ifdef VBOX_WITH_HARDENING
             /*
-             * User device.
+             * Hardened stub device.
              */
-            RtlInitUnicodeString(&DevName, DEVICE_NAME_NT_USR);
-            rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXTUSR), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjUsr);
+            RtlInitUnicodeString(&DevName, DEVICE_NAME_NT_STUB);
+            rcNt = IoCreateDevice(pDrvObj, sizeof(SUPDRVDEVEXTSTUB), &DevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &g_pDevObjStub);
             if (NT_SUCCESS(rcNt))
             {
-                UNICODE_STRING DosName;
-                RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_USR);
-                rcNt = IoCreateSymbolicLink(&DosName, &DevName);
                 if (NT_SUCCESS(rcNt))
                 {
-                    PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
-                    pDevExtUsr->pMainDrvExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
-                    pDevExtUsr->u32Cookie   = SUPDRVDEVEXTUSR_COOKIE;
+                    PSUPDRVDEVEXTSTUB pDevExtStub = (PSUPDRVDEVEXTSTUB)g_pDevObjStub->DeviceExtension;
+                    pDevExtStub->Common.pMainDrvExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+                    pDevExtStub->Common.u32Cookie   = SUPDRVDEVEXTSTUB_COOKIE;
+#endif
 
                     /* Done. */
                     return rcNt;
+#ifdef VBOX_WITH_HARDENING
                 }
 
                 /* Bail out. */
-                IoDeleteDevice(g_pDevObjUsr);
+                IoDeleteDevice(g_pDevObjStub);
                 g_pDevObjUsr = NULL;
             }
-            IoDeleteSymbolicLink(&DosName);
+#endif
+            IoDeleteDevice(g_pDevObjUsr);
+            g_pDevObjUsr = NULL;
         }
         IoDeleteDevice(g_pDevObjSys);
         g_pDevObjSys = NULL;
@@ -189,16 +405,23 @@ static NTSTATUS vboxdrvNtCreateDevices(PDRIVER_OBJECT pDrvObj)
  */
 static void vboxdrvNtDestroyDevices(void)
 {
-    UNICODE_STRING DosName;
-    RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_SYS);
-    NTSTATUS rcNt = IoDeleteSymbolicLink(&DosName);
-
-    RtlInitUnicodeString(&DosName, DEVICE_NAME_DOS_USR);
-    rcNt = IoDeleteSymbolicLink(&DosName);
-
-    PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
-    pDevExtUsr->pMainDrvExt = NULL;
+    if (g_pDevObjUsr)
+    {
+        PSUPDRVDEVEXTUSR pDevExtUsr = (PSUPDRVDEVEXTUSR)g_pDevObjUsr->DeviceExtension;
+        pDevExtUsr->pMainDrvExt = NULL;
+    }
+#ifdef VBOX_WITH_HARDENING
+    if (g_pDevObjStub)
+    {
+        PSUPDRVDEVEXTSTUB pDevExtStub = (PSUPDRVDEVEXTSTUB)g_pDevObjStub->DeviceExtension;
+        pDevExtStub->Common.pMainDrvExt = NULL;
+    }
+#endif
 
+#ifdef VBOX_WITH_HARDENING
+    IoDeleteDevice(g_pDevObjStub);
+    g_pDevObjStub = NULL;
+#endif
     IoDeleteDevice(g_pDevObjUsr);
     g_pDevObjUsr = NULL;
     IoDeleteDevice(g_pDevObjSys);
@@ -216,69 +439,107 @@ static void vboxdrvNtDestroyDevices(void)
 ULONG _stdcall DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
 {
     /*
-     * Create device.
-     * (That means creating a device object and a symbolic link so the DOS
-     * subsystems (OS/2, win32, ++) can access the device.)
+     * Sanity checks.
      */
-    NTSTATUS rcNt = vboxdrvNtCreateDevices(pDrvObj);
-    if (NT_SUCCESS(rcNt))
+#ifdef VBOXDRV_WITH_FAST_IO
+    if (g_VBoxDrvFastIoDispatch.FastIoDeviceControl != VBoxDrvNtFastIoDeviceControl)
     {
-        int vrc = RTR0Init(0);
-        if (RT_SUCCESS(vrc))
-        {
-            Log(("VBoxDrv::DriverEntry\n"));
+        DbgPrint("VBoxDrv: FastIoDeviceControl=%p instead of %p\n",
+                 g_VBoxDrvFastIoDispatch.FastIoDeviceControl, VBoxDrvNtFastIoDeviceControl);
+        return STATUS_INTERNAL_ERROR;
+    }
+#endif
+
+    /*
+     * Initialize the runtime (IPRT).
+     */
+    NTSTATUS rcNt;
+    int vrc = RTR0Init(0);
+    if (RT_SUCCESS(vrc))
+    {
+        Log(("VBoxDrv::DriverEntry\n"));
 
+#ifdef VBOX_WITH_HARDENING
+        /*
+         * Initialize process protection.
+         */
+        rcNt = supdrvNtProtectInit();
+        if (NT_SUCCESS(rcNt))
+#endif
+        {
             /*
-             * Initialize the device extension.
+             * Create device.
+             * (That means creating a device object and a symbolic link so the DOS
+             * subsystems (OS/2, win32, ++) can access the device.)
              */
-            PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
-            memset(pDevExt, 0, sizeof(*pDevExt));
-
-            vrc = supdrvInitDevExt(pDevExt, sizeof(SUPDRVSESSION));
-            if (!vrc)
+            rcNt = vboxdrvNtCreateDevices(pDrvObj);
+            if (NT_SUCCESS(rcNt))
             {
                 /*
-                 * Setup the driver entry points in pDrvObj.
+                 * Initialize the device extension.
                  */
-                pDrvObj->DriverUnload                                   = VBoxDrvNtUnload;
-                pDrvObj->MajorFunction[IRP_MJ_CREATE]                   = VBoxDrvNtCreate;
-                pDrvObj->MajorFunction[IRP_MJ_CLEANUP]                  = VBoxDrvNtCleanup;
-                pDrvObj->MajorFunction[IRP_MJ_CLOSE]                    = VBoxDrvNtClose;
-                pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]           = VBoxDrvNtDeviceControl;
-                pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]  = VBoxDrvNtInternalDeviceControl;
-                pDrvObj->MajorFunction[IRP_MJ_READ]                     = VBoxDrvNtNotSupportedStub;
-                pDrvObj->MajorFunction[IRP_MJ_WRITE]                    = VBoxDrvNtNotSupportedStub;
-
-                /* more? */
-
-                /* Register ourselves for power state changes. */
-                UNICODE_STRING      CallbackName;
-                OBJECT_ATTRIBUTES   Attr;
-
-                RtlInitUnicodeString(&CallbackName, L"\\Callback\\PowerState");
-                InitializeObjectAttributes(&Attr, &CallbackName, OBJ_CASE_INSENSITIVE, NULL, NULL);
-
-                rcNt = ExCreateCallback(&pDevExt->pObjPowerCallback, &Attr, TRUE, TRUE);
-                if (rcNt == STATUS_SUCCESS)
-                    pDevExt->hPowerCallback = ExRegisterCallback(pDevExt->pObjPowerCallback, VBoxPowerDispatchCallback,
-                                                                 g_pDevObjSys);
-
-                Log(("VBoxDrv::DriverEntry returning STATUS_SUCCESS\n"));
-                return STATUS_SUCCESS;
-            }
+                PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+                memset(pDevExt, 0, sizeof(*pDevExt));
 
-            Log(("supdrvInitDevExit failed with vrc=%d!\n", vrc));
-            rcNt = VBoxDrvNtErr2NtStatus(vrc);
+                vrc = supdrvInitDevExt(pDevExt, sizeof(SUPDRVSESSION));
+                if (!vrc)
+                {
+                    /*
+                     * Setup the driver entry points in pDrvObj.
+                     */
+                    pDrvObj->DriverUnload                                   = VBoxDrvNtUnload;
+                    pDrvObj->MajorFunction[IRP_MJ_CREATE]                   = VBoxDrvNtCreate;
+                    pDrvObj->MajorFunction[IRP_MJ_CLEANUP]                  = VBoxDrvNtCleanup;
+                    pDrvObj->MajorFunction[IRP_MJ_CLOSE]                    = VBoxDrvNtClose;
+                    pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]           = VBoxDrvNtDeviceControl;
+                    pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]  = VBoxDrvNtInternalDeviceControl;
+                    pDrvObj->MajorFunction[IRP_MJ_READ]                     = VBoxDrvNtNotSupportedStub;
+                    pDrvObj->MajorFunction[IRP_MJ_WRITE]                    = VBoxDrvNtNotSupportedStub;
+
+#ifdef VBOXDRV_WITH_FAST_IO
+                    /* Fast I/O to speed up guest execution roundtrips. */
+                    pDrvObj->FastIoDispatch = (PFAST_IO_DISPATCH)&g_VBoxDrvFastIoDispatch;
+#endif
 
-            RTR0Term();
-        }
-        else
-        {
-            Log(("RTR0Init failed with vrc=%d!\n", vrc));
-            rcNt = VBoxDrvNtErr2NtStatus(vrc);
-        }
+                    /*
+                     * Register ourselves for power state changes.  We don't
+                     * currently care if this fails.
+                     */
+                    UNICODE_STRING      CallbackName;
+                    RtlInitUnicodeString(&CallbackName, L"\\Callback\\PowerState");
+
+                    OBJECT_ATTRIBUTES   Attr;
+                    InitializeObjectAttributes(&Attr, &CallbackName, OBJ_CASE_INSENSITIVE, NULL, NULL);
+
+                    rcNt = ExCreateCallback(&pDevExt->pObjPowerCallback, &Attr, TRUE, TRUE);
+                    if (rcNt == STATUS_SUCCESS)
+                        pDevExt->hPowerCallback = ExRegisterCallback(pDevExt->pObjPowerCallback,
+                                                                     VBoxPowerDispatchCallback,
+                                                                     g_pDevObjSys);
+
+                    /*
+                     * Done! Returning success!
+                     */
+                    Log(("VBoxDrv::DriverEntry returning STATUS_SUCCESS\n"));
+                    return STATUS_SUCCESS;
+                }
 
-        vboxdrvNtDestroyDevices();
+                Log(("supdrvInitDevExit failed with vrc=%d!\n", vrc));
+                rcNt = VBoxDrvNtErr2NtStatus(vrc);
+
+                vboxdrvNtDestroyDevices();
+            }
+#ifdef VBOX_WITH_HARDENING
+            supdrvNtProtectTerm();
+#endif
+        }
+        RTTermRunCallbacks(RTTERMREASON_UNLOAD, 0);
+        RTR0Term();
+    }
+    else
+    {
+        Log(("RTR0Init failed with vrc=%d!\n", vrc));
+        rcNt = VBoxDrvNtErr2NtStatus(vrc);
     }
     if (NT_SUCCESS(rcNt))
         rcNt = STATUS_INVALID_PARAMETER;
@@ -307,6 +568,10 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
      * We ASSUME that it's not possible to unload a driver with open handles.
      */
     supdrvDeleteDevExt(pDevExt);
+#ifdef VBOX_WITH_HARDENING
+    supdrvNtProtectTerm();
+#endif
+    RTTermRunCallbacks(RTTERMREASON_UNLOAD, 0);
     RTR0Term();
     vboxdrvNtDestroyDevices();
 
@@ -315,6 +580,37 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
 
 
 /**
+ * For simplifying request completion into a simple return statement, extended
+ * version.
+ *
+ * @returns rcNt
+ * @param   rcNt                The status code.
+ * @param   uInfo               Extra info value.
+ * @param   pIrp                The IRP.
+ */
+DECLINLINE(NTSTATUS) supdrvNtCompleteRequestEx(NTSTATUS rcNt, ULONG_PTR uInfo, PIRP pIrp)
+{
+    pIrp->IoStatus.Status       = rcNt;
+    pIrp->IoStatus.Information  = uInfo;
+    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
+    return rcNt;
+}
+
+
+/**
+ * For simplifying request completion into a simple return statement.
+ *
+ * @returns rcNt
+ * @param   rcNt                The status code.
+ * @param   pIrp                The IRP.
+ */
+DECLINLINE(NTSTATUS) supdrvNtCompleteRequest(NTSTATUS rcNt, PIRP pIrp)
+{
+    return supdrvNtCompleteRequestEx(rcNt, 0 /*uInfo*/, pIrp);
+}
+
+
+/**
  * Create (i.e. Open) file entry point.
  *
  * @param   pDevObj     Device object.
@@ -323,49 +619,180 @@ void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
 NTSTATUS _stdcall VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
 {
     Log(("VBoxDrvNtCreate: RequestorMode=%d\n", pIrp->RequestorMode));
-    const bool          fUnrestricted = pDevObj == g_pDevObjSys;
-    PIO_STACK_LOCATION  pStack = IoGetCurrentIrpStackLocation(pIrp);
+    PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
     PFILE_OBJECT        pFileObj = pStack->FileObject;
-    PSUPDRVDEVEXT       pDevExt = SUPDRVNT_GET_DEVEXT(pDevObj);
+    PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
 
     /*
      * We are not remotely similar to a directory...
      * (But this is possible.)
      */
     if (pStack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
-    {
-        pIrp->IoStatus.Status       = STATUS_NOT_A_DIRECTORY;
-        pIrp->IoStatus.Information  = 0;
-        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-        return STATUS_NOT_A_DIRECTORY;
-    }
+        return supdrvNtCompleteRequest(STATUS_NOT_A_DIRECTORY, pIrp);
 
     /*
      * Don't create a session for kernel clients, they'll close the handle
      * immediately and work with the file object via
-     * VBoxDrvNtInternalDeviceControl.  The first request will there be one
-     * to create a session.
+     * VBoxDrvNtInternalDeviceControl.  The first request will be one to
+     * create a session.
      */
     NTSTATUS rcNt;
     if (pIrp->RequestorMode == KernelMode)
-        rcNt = STATUS_SUCCESS;
+    {
+        if (pDevObj == g_pDevObjSys)
+            return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+
+        rcNt = STATUS_ACCESS_DENIED;
+    }
     else
     {
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
         /*
-         * Call common code for the rest.
+         * Make sure no debuggers are attached to non-user processes.
          */
-        pFileObj->FsContext = NULL;
-        PSUPDRVSESSION pSession;
-        int rc = supdrvCreateSession(pDevExt, true /*fUser*/, fUnrestricted, &pSession);
-        if (!rc)
-            pFileObj->FsContext = pSession;
-        rcNt = pIrp->IoStatus.Status = VBoxDrvNtErr2NtStatus(rc);
-    }
+        if (   pDevObj != g_pDevObjUsr
+            && supdrvNtIsDebuggerAttached())
+        {
+            LogRel(("vboxdrv: Process %p is being debugged, access to vboxdrv / vboxdrvu declined.\n",
+                    PsGetProcessId(PsGetCurrentProcess())));
+            rcNt = STATUS_TRUST_FAILURE;
+        }
+        else
+#endif
+        {
+            int rc = VINF_SUCCESS;
 
-    pIrp->IoStatus.Information  = 0;
-    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
+#ifdef VBOX_WITH_HARDENING
+            /*
+             * Access to the stub device is only granted to processes which
+             * passes verification.
+             *
+             * Note! The stub device has no need for a SUPDRVSESSION structure,
+             *       so the it uses the SUPDRVNTPROTECT directly instead.
+             */
+            if (pDevObj == g_pDevObjStub)
+            {
+                PSUPDRVNTPROTECT pNtProtect = NULL;
+                rc = supdrvNtProtectCreate(&pNtProtect, PsGetProcessId(PsGetCurrentProcess()),
+                                           kSupDrvNtProtectKind_StubUnverified, true /*fLink*/);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = supdrvNtProtectFindAssociatedCsrss(pNtProtect);
+                    if (RT_SUCCESS(rc))
+                        rc = supdrvNtProtectVerifyProcess(pNtProtect);
+                    if (RT_SUCCESS(rc))
+                    {
+                        pFileObj->FsContext = pNtProtect; /* Keeps reference. */
+                        return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+                    }
 
-    return rcNt;
+                    supdrvNtProtectRelease(pNtProtect);
+                }
+                LogRel(("vboxdrv: Declined %p access to VBoxDrvStub: rc=%d\n", PsGetProcessId(PsGetCurrentProcess()), rc));
+            }
+            /*
+             * Unrestricted access is only granted to a process in the
+             * VmProcessUnconfirmed state that checks out correctly and is
+             * allowed to transition to VmProcessConfirmed.  Again, only one
+             * session per process.
+             */
+            else if (pDevObj != g_pDevObjUsr)
+            {
+                PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(PsGetProcessId(PsGetCurrentProcess()));
+                if (pNtProtect)
+                {
+                    if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+                    {
+                        rc = supdrvNtProtectVerifyProcess(pNtProtect);
+                        if (RT_SUCCESS(rc))
+                        {
+                            /* Create a session. */
+                            PSUPDRVSESSION pSession;
+                            rc = supdrvCreateSession(pDevExt, true /*fUser*/, pDevObj == g_pDevObjSys /*fUnrestricted*/,
+                                                     &pSession);
+                            if (RT_SUCCESS(rc))
+                            {
+                                rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+                                supdrvSessionRelease(pSession);
+                                if (RT_SUCCESS(rc))
+                                {
+                                    pSession->pNtProtect = pNtProtect; /* Keeps reference. */
+                                    return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+                                }
+                            }
+
+                            /* No second attempt. */
+                            RTSpinlockAcquire(g_hNtProtectLock);
+                            if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessConfirmed)
+                                pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+                            RTSpinlockRelease(g_hNtProtectLock);
+
+                            LogRel(("vboxdrv: supdrvCreateSession failed for process %p: rc=%d.\n",
+                                    PsGetProcessId(PsGetCurrentProcess()), rc));
+                        }
+                        else
+                            LogRel(("vboxdrv: Process %p failed process verification: rc=%d.\n",
+                                    PsGetProcessId(PsGetCurrentProcess()), rc));
+                    }
+                    else
+                    {
+                        LogRel(("vboxdrv: %p is not a budding VM process (enmProcessKind=%d).\n",
+                                PsGetProcessId(PsGetCurrentProcess()), pNtProtect->enmProcessKind));
+                        rc = VERR_ACCESS_DENIED;
+                    }
+                    supdrvNtProtectRelease(pNtProtect);
+                }
+                else
+                {
+                    LogRel(("vboxdrv: %p is not a budding VM process.\n", PsGetProcessId(PsGetCurrentProcess())));
+                    rc = VERR_ACCESS_DENIED;
+                }
+            }
+            /*
+             * Call common code to create an unprivileged session.
+             */
+            else
+            {
+                PSUPDRVSESSION pSession;
+                rc = supdrvCreateSession(pDevExt, true /*fUser*/, false /*fUnrestricted*/, &pSession);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+                    supdrvSessionRelease(pSession);
+                    if (RT_SUCCESS(rc))
+                    {
+                        pFileObj->FsContext  = pSession; /* Keeps reference. No race. */
+                        pSession->pNtProtect = NULL;
+                        return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+                    }
+                }
+            }
+
+#else  /* !VBOX_WITH_HARDENING */
+            /*
+             * Call common code to create a session.
+             */
+            pFileObj->FsContext = NULL;
+            PSUPDRVSESSION pSession;
+            rc = supdrvCreateSession(pDevExt, true /*fUser*/, pDevObj == g_pDevObjSys /*fUnrestricted*/, &pSession);
+            if (RT_SUCCESS(rc))
+            {
+                rc = supdrvSessionHashTabInsert(pDevExt, pSession, (PSUPDRVSESSION *)&pFileObj->FsContext, NULL);
+                supdrvSessionRelease(pSession);
+                if (RT_SUCCESS(rc))
+                    return supdrvNtCompleteRequestEx(STATUS_SUCCESS, FILE_OPENED, pIrp);
+
+            }
+#endif /* !VBOX_WITH_HARDENING */
+
+            /* bail out */
+            rcNt = VBoxDrvNtErr2NtStatus(rc);
+        }
+    }
+
+    Assert(!NT_SUCCESS(rcNt));
+    pFileObj->FsContext = NULL;
+    return supdrvNtCompleteRequest(rcNt, pIrp); /* Note. the IoStatus is completely ignored on error. */
 }
 
 
@@ -380,20 +807,32 @@ NTSTATUS _stdcall VBoxDrvNtCleanup(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
     PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
     PFILE_OBJECT        pFileObj = pStack->FileObject;
-    PSUPDRVSESSION      pSession = (PSUPDRVSESSION)pFileObj->FsContext;
 
-    Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
-    if (pSession)
+#ifdef VBOX_WITH_HARDENING
+    if (pDevObj == g_pDevObjStub)
+    {
+        PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)pFileObj->FsContext;
+        Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pNtProtect=%p\n", pDevExt, pFileObj, pNtProtect));
+        if (pNtProtect)
+        {
+            supdrvNtProtectRelease(pNtProtect);
+            pFileObj->FsContext = NULL;
+        }
+    }
+    else
+#endif
     {
-        supdrvSessionRelease(pSession);
-        pFileObj->FsContext = NULL;
+        PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+                                                             (PSUPDRVSESSION *)&pFileObj->FsContext);
+        Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
+        if (pSession)
+        {
+            supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+            supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+        }
     }
 
-    pIrp->IoStatus.Information = 0;
-    pIrp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-
-    return STATUS_SUCCESS;
+    return supdrvNtCompleteRequest(STATUS_SUCCESS, pIrp);
 }
 
 
@@ -408,127 +847,340 @@ NTSTATUS _stdcall VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
     PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
     PFILE_OBJECT        pFileObj = pStack->FileObject;
-    PSUPDRVSESSION      pSession = (PSUPDRVSESSION)pFileObj->FsContext;
 
-    Log(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
-    if (pSession)
+#ifdef VBOX_WITH_HARDENING
+    if (pDevObj == g_pDevObjStub)
     {
-        supdrvSessionRelease(pSession);
-        pFileObj->FsContext = NULL;
+        PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)pFileObj->FsContext;
+        Log(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pNtProtect=%p\n", pDevExt, pFileObj, pNtProtect));
+        if (pNtProtect)
+        {
+            supdrvNtProtectRelease(pNtProtect);
+            pFileObj->FsContext = NULL;
+        }
+    }
+    else
+#endif
+    {
+        PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+                                                             (PSUPDRVSESSION *)&pFileObj->FsContext);
+        Log(("VBoxDrvNtCleanup: pDevExt=%p pFileObj=%p pSession=%p\n", pDevExt, pFileObj, pSession));
+        if (pSession)
+        {
+            supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+            supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+        }
     }
 
-    pIrp->IoStatus.Information = 0;
-    pIrp->IoStatus.Status = STATUS_SUCCESS;
-    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-
-    return STATUS_SUCCESS;
+    return supdrvNtCompleteRequest(STATUS_SUCCESS, pIrp);
 }
 
 
+#ifdef VBOXDRV_WITH_FAST_IO
 /**
- * Device I/O Control entry point.
+ * Fast I/O device control callback.
  *
- * @param   pDevObj     Device object.
- * @param   pIrp        Request packet.
+ * This performs no buffering, neither on the way in or out.
+ *
+ * @returns TRUE if handled, FALSE if the normal I/O control routine should be
+ *          called.
+ * @param   pFileObj            The file object.
+ * @param   fWait               Whether it's a blocking call
+ * @param   pvInput             The input buffer as specified by the user.
+ * @param   cbInput             The size of the input buffer.
+ * @param   pvOutput            The output buffer as specfied by the user.
+ * @param   cbOutput            The size of the output buffer.
+ * @param   uFunction           The function.
+ * @param   pIoStatus           Where to return the status of the operation.
+ * @param   pDevObj             The device object..
  */
-NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
+static BOOLEAN _stdcall VBoxDrvNtFastIoDeviceControl(PFILE_OBJECT pFileObj, BOOLEAN fWait, PVOID pvInput, ULONG cbInput,
+                                                     PVOID pvOutput, ULONG cbOutput, ULONG uCmd,
+                                                     PIO_STATUS_BLOCK pIoStatus, PDEVICE_OBJECT pDevObj)
 {
-    PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
-    PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
-    PSUPDRVSESSION      pSession = (PSUPDRVSESSION)pStack->FileObject->FsContext;
+    PSUPDRVDEVEXT   pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
 
     /*
-     * Deal with the two high-speed IOCtl that takes it's arguments from
-     * the session and iCmd, and only returns a VBox status code.
-     *
-     * Note: The previous method of returning the rc prior to IOC version
-     *       7.4 has been abandond, we're no longer compatible with that
-     *       interface.
+     * Check the input a little bit and get a the session references.
      */
-    ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode;
-    if (   (   ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN
-            || ulCmd == SUP_IOCTL_FAST_DO_HM_RUN
-            || ulCmd == SUP_IOCTL_FAST_DO_NOP)
-        && pSession->fUnrestricted == true)
+    PSUPDRVSESSION  pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+                                                          (PSUPDRVSESSION *)&pFileObj->FsContext);
+    if (!pSession)
     {
-        int rc = supdrvIOCtlFast(ulCmd, (unsigned)(uintptr_t)pIrp->UserBuffer /* VMCPU id */, pDevExt, pSession);
-
-#if 0   /* When preemption was not used i.e. !VBOX_WITH_VMMR0_DISABLE_PREEMPTION. That's no longer required. */
-        /* Raise the IRQL to DISPATCH_LEVEL to prevent Windows from rescheduling us to another CPU/core. */
-        Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL);
-        KIRQL oldIrql;
-        KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
-        int rc = supdrvIOCtlFast(ulCmd, (unsigned)(uintptr_t)pIrp->UserBuffer /* VMCPU id */, pDevExt, pSession);
-        KeLowerIrql(oldIrql);
-#endif
-
-        /* Complete the I/O request. */
-        NTSTATUS rcNt = pIrp->IoStatus.Status = RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER;
-        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
-        return rcNt;
+        pIoStatus->Status      = STATUS_TRUST_FAILURE;
+        pIoStatus->Information = 0;
+        return TRUE;
     }
 
-    return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
-}
+    if (pSession->fUnrestricted)
+    {
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
+        if (supdrvNtIsDebuggerAttached())
+        {
+            pIoStatus->Status      = STATUS_TRUST_FAILURE;
+            pIoStatus->Information = 0;
+            supdrvSessionRelease(pSession);
+            return TRUE;
+        }
+#endif
 
+        /*
+         * Deal with the 2-3 high-speed IOCtl that takes their arguments from
+         * the session and iCmd, and does not return anything.
+         */
+        if (   uCmd == SUP_IOCTL_FAST_DO_RAW_RUN
+            || uCmd == SUP_IOCTL_FAST_DO_HM_RUN
+            || uCmd == SUP_IOCTL_FAST_DO_NOP)
+        {
+            int rc = supdrvIOCtlFast(uCmd, (unsigned)(uintptr_t)pvOutput/* VMCPU id */, pDevExt, pSession);
+            pIoStatus->Status      = RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER;
+            pIoStatus->Information = 0; /* Could be used to pass rc if we liked. */
+            supdrvSessionRelease(pSession);
+            return TRUE;
+        }
+    }
 
-/**
- * Worker for VBoxDrvNtDeviceControl that takes the slow IOCtl functions.
- *
- * @returns NT status code.
- *
- * @param   pDevObj     Device object.
- * @param   pSession    The session.
- * @param   pIrp        Request packet.
- * @param   pStack      The stack location containing the DeviceControl parameters.
- */
-static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)
-{
+    /*
+     * The normal path.
+     */
     NTSTATUS    rcNt;
     unsigned    cbOut = 0;
     int         rc = 0;
-    Log2(("VBoxDrvNtDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
-          pDevExt, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode,
-          pIrp->AssociatedIrp.SystemBuffer, pStack->Parameters.DeviceIoControl.InputBufferLength,
-          pStack->Parameters.DeviceIoControl.OutputBufferLength, pSession));
+    Log2(("VBoxDrvNtFastIoDeviceControl(%p): ioctl=%#x pvIn=%p cbIn=%#x pvOut=%p cbOut=%#x pSession=%p\n",
+          pDevExt, uCmd, pvInput, cbInput, pvOutput, cbOutput, pSession));
 
-#ifdef RT_ARCH_AMD64
+# ifdef RT_ARCH_AMD64
     /* Don't allow 32-bit processes to do any I/O controls. */
-    if (!IoIs32bitProcess(pIrp))
-#endif
+    if (!IoIs32bitProcess(NULL))
+# endif
     {
-        /* Verify that it's a buffered CTL. */
-        if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED)
+        /*
+         * In this fast I/O device control path we have to do our own buffering.
+         */
+        /* Verify that the I/O control function matches our pattern. */
+        if ((uCmd & 0x3) == METHOD_BUFFERED)
         {
-            /* Verify that the sizes in the request header are correct. */
-            PSUPREQHDR pHdr = (PSUPREQHDR)pIrp->AssociatedIrp.SystemBuffer;
-            if (    pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr)
-                &&  pStack->Parameters.DeviceIoControl.InputBufferLength ==  pHdr->cbIn
-                &&  pStack->Parameters.DeviceIoControl.OutputBufferLength ==  pHdr->cbOut)
+            /* Get the header so we can validate it a little bit against the
+               parameters before allocating any memory kernel for the reqest. */
+            SUPREQHDR Hdr;
+            if (cbInput >= sizeof(Hdr) && cbOutput >= sizeof(Hdr))
             {
-                /*
-                 * Do the job.
-                 */
-                rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, pHdr);
-                if (!rc)
+                __try
                 {
+                    RtlCopyMemory(&Hdr, pvInput, sizeof(Hdr));
                     rcNt = STATUS_SUCCESS;
-                    cbOut = pHdr->cbOut;
-                    if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
-                    {
-                        cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
-                        OSDBGPRINT(("VBoxDrvLinuxIOCtl: too much output! %#x > %#x; uCmd=%#x!\n",
-                                    pHdr->cbOut, cbOut, pStack->Parameters.DeviceIoControl.IoControlCode));
-                    }
                 }
-                else
-                    rcNt = STATUS_INVALID_PARAMETER;
-                Log2(("VBoxDrvNtDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
+                __except(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    rcNt = GetExceptionCode();
+                }
             }
             else
+                rcNt = STATUS_INVALID_PARAMETER;
+            if (NT_SUCCESS(rcNt))
             {
-                Log(("VBoxDrvNtDeviceControlSlow: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n",
-                     pStack->Parameters.DeviceIoControl.IoControlCode,
+                /* Verify that the sizes in the request header are correct. */
+                ULONG cbBuf = RT_MAX(cbInput, cbOutput);
+                if (   cbInput  == Hdr.cbIn
+                    && cbOutput == Hdr.cbOut
+                    && cbBuf < _1M*16)
+                {
+                    /* Allocate a buffer and copy all the input into it. */
+                    PSUPREQHDR pHdr = (PSUPREQHDR)ExAllocatePoolWithTag(NonPagedPool, cbBuf, 'VBox');
+                    if (pHdr)
+                    {
+                        __try
+                        {
+                            RtlCopyMemory(pHdr, pvInput, cbInput);
+                            if (cbInput < cbBuf)
+                                RtlZeroMemory((uint8_t *)pHdr + cbInput, cbBuf - cbInput);
+                            rcNt = STATUS_SUCCESS;
+                        }
+                        __except(EXCEPTION_EXECUTE_HANDLER)
+                        {
+                            rcNt = GetExceptionCode();
+                        }
+                    }
+                    else
+                        rcNt = STATUS_NO_MEMORY;
+                    if (NT_SUCCESS(rcNt))
+                    {
+                        /*
+                         * Now call the common code to do the real work.
+                         */
+                        rc = supdrvIOCtl(uCmd, pDevExt, pSession, pHdr);
+                        if (RT_SUCCESS(rc))
+                        {
+                            /*
+                             * Copy back the result.
+                             */
+                            cbOut = pHdr->cbOut;
+                            if (cbOut > cbOutput)
+                            {
+                                cbOut = cbOutput;
+                                OSDBGPRINT(("VBoxDrvNtFastIoDeviceControl: too much output! %#x > %#x; uCmd=%#x!\n",
+                                            pHdr->cbOut, cbOut, uCmd));
+                            }
+                            if (cbOut)
+                            {
+                                __try
+                                {
+                                    RtlCopyMemory(pvOutput, pHdr, cbOut);
+                                    rcNt = STATUS_SUCCESS;
+                                }
+                                __except(EXCEPTION_EXECUTE_HANDLER)
+                                {
+                                    rcNt = GetExceptionCode();
+                                }
+                            }
+                            else
+                                rcNt = STATUS_SUCCESS;
+                        }
+                        else if (rc == VERR_INVALID_PARAMETER)
+                            rcNt = STATUS_INVALID_PARAMETER;
+                        else
+                            rcNt = STATUS_NOT_SUPPORTED;
+                        Log2(("VBoxDrvNtFastIoDeviceControl: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
+                    }
+                    ExFreePoolWithTag(pHdr, 'VBox');
+                }
+                else
+                {
+                    Log(("VBoxDrvNtFastIoDeviceControl: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n",
+                         uCmd, Hdr.cbIn, Hdr.cbOut, cbInput, cbOutput));
+                    rcNt = STATUS_INVALID_PARAMETER;
+                }
+            }
+        }
+        else
+        {
+            Log(("VBoxDrvNtFastIoDeviceControl: not buffered request (%#x) - not supported\n", uCmd));
+            rcNt = STATUS_NOT_SUPPORTED;
+        }
+    }
+# ifdef RT_ARCH_AMD64
+    else
+    {
+        Log(("VBoxDrvNtFastIoDeviceControl: WOW64 req - not supported\n"));
+        rcNt = STATUS_NOT_SUPPORTED;
+    }
+# endif
+
+    /* complete the request. */
+    pIoStatus->Status = rcNt;
+    pIoStatus->Information = cbOut;
+    supdrvSessionRelease(pSession);
+    return TRUE; /* handled. */
+}
+#endif /* VBOXDRV_WITH_FAST_IO */
+
+
+/**
+ * Device I/O Control entry point.
+ *
+ * @param   pDevObj     Device object.
+ * @param   pIrp        Request packet.
+ */
+NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
+{
+    VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(pDevObj, pIrp);
+
+    PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
+    PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
+    PSUPDRVSESSION      pSession = supdrvSessionHashTabLookup(pDevExt, RTProcSelf(), RTR0ProcHandleSelf(),
+                                                              (PSUPDRVSESSION *)&pStack->FileObject->FsContext);
+
+    if (!RT_VALID_PTR(pSession))
+        return supdrvNtCompleteRequest(STATUS_TRUST_FAILURE, pIrp);
+
+    /*
+     * Deal with the 2-3 high-speed IOCtl that takes their arguments from
+     * the session and iCmd, and does not return anything.
+     */
+    if (pSession->fUnrestricted)
+    {
+#if defined(VBOX_WITH_HARDENING) && !defined(VBOX_WITHOUT_DEBUGGER_CHECKS)
+        if (supdrvNtIsDebuggerAttached())
+        {
+            supdrvSessionRelease(pSession);
+            return supdrvNtCompleteRequest(STATUS_TRUST_FAILURE, pIrp);
+        }
+#endif
+
+        ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode;
+        if (   ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN
+            || ulCmd == SUP_IOCTL_FAST_DO_HM_RUN
+            || ulCmd == SUP_IOCTL_FAST_DO_NOP)
+        {
+            int rc = supdrvIOCtlFast(ulCmd, (unsigned)(uintptr_t)pIrp->UserBuffer /* VMCPU id */, pDevExt, pSession);
+
+            /* Complete the I/O request. */
+            supdrvSessionRelease(pSession);
+            return supdrvNtCompleteRequest(RT_SUCCESS(rc) ? STATUS_SUCCESS : STATUS_INVALID_PARAMETER, pIrp);
+        }
+    }
+
+    return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
+}
+
+
+/**
+ * Worker for VBoxDrvNtDeviceControl that takes the slow IOCtl functions.
+ *
+ * @returns NT status code.
+ *
+ * @param   pDevObj     Device object.
+ * @param   pSession    The session.
+ * @param   pIrp        Request packet.
+ * @param   pStack      The stack location containing the DeviceControl parameters.
+ */
+static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)
+{
+    NTSTATUS    rcNt;
+    unsigned    cbOut = 0;
+    int         rc = 0;
+    Log2(("VBoxDrvNtDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
+          pDevExt, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode,
+          pIrp->AssociatedIrp.SystemBuffer, pStack->Parameters.DeviceIoControl.InputBufferLength,
+          pStack->Parameters.DeviceIoControl.OutputBufferLength, pSession));
+
+#ifdef RT_ARCH_AMD64
+    /* Don't allow 32-bit processes to do any I/O controls. */
+    if (!IoIs32bitProcess(pIrp))
+#endif
+    {
+        /* Verify that it's a buffered CTL. */
+        if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED)
+        {
+            /* Verify that the sizes in the request header are correct. */
+            PSUPREQHDR pHdr = (PSUPREQHDR)pIrp->AssociatedIrp.SystemBuffer;
+            if (    pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr)
+                &&  pStack->Parameters.DeviceIoControl.InputBufferLength ==  pHdr->cbIn
+                &&  pStack->Parameters.DeviceIoControl.OutputBufferLength ==  pHdr->cbOut)
+            {
+                /*
+                 * Do the job.
+                 */
+                rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, pHdr);
+                if (!rc)
+                {
+                    rcNt = STATUS_SUCCESS;
+                    cbOut = pHdr->cbOut;
+                    if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
+                    {
+                        cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
+                        OSDBGPRINT(("VBoxDrvLinuxIOCtl: too much output! %#x > %#x; uCmd=%#x!\n",
+                                    pHdr->cbOut, cbOut, pStack->Parameters.DeviceIoControl.IoControlCode));
+                    }
+                }
+                else
+                    rcNt = STATUS_INVALID_PARAMETER;
+                Log2(("VBoxDrvNtDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
+            }
+            else
+            {
+                Log(("VBoxDrvNtDeviceControlSlow: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n",
+                     pStack->Parameters.DeviceIoControl.IoControlCode,
                      pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbIn : 0,
                      pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbOut : 0,
                      pStack->Parameters.DeviceIoControl.InputBufferLength,
@@ -554,6 +1206,7 @@ static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSes
     /* complete the request. */
     pIrp->IoStatus.Status = rcNt;
     pIrp->IoStatus.Information = cbOut;
+    supdrvSessionRelease(pSession);
     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
     return rcNt;
 }
@@ -567,6 +1220,8 @@ static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSes
  */
 NTSTATUS _stdcall VBoxDrvNtInternalDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
 {
+    VBOXDRV_COMPLETE_IRP_AND_RETURN_IF_STUB_DEV(pDevObj, pIrp);
+
     PSUPDRVDEVEXT       pDevExt  = SUPDRVNT_GET_DEVEXT(pDevObj);
     PIO_STACK_LOCATION  pStack   = IoGetCurrentIrpStackLocation(pIrp);
     PFILE_OBJECT        pFileObj = pStack ? pStack->FileObject : NULL;
@@ -696,6 +1351,36 @@ VOID _stdcall VBoxPowerDispatchCallback(PVOID pCallbackContext, PVOID pArgument1
 
 
 /**
+ * Called to clean up the session structure before it's freed.
+ *
+ * @param   pDevExt             The device globals.
+ * @param   pSession            The session that's being cleaned up.
+ */
+void VBOXCALL supdrvOSCleanupSession(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession)
+{
+#ifdef VBOX_WITH_HARDENING
+    if (pSession->pNtProtect)
+    {
+        supdrvNtProtectRelease(pSession->pNtProtect);
+        pSession->pNtProtect = NULL;
+    }
+#endif
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabInserted(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+void VBOXCALL supdrvOSSessionHashTabRemoved(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, void *pvUser)
+{
+    NOREF(pDevExt); NOREF(pSession); NOREF(pvUser);
+}
+
+
+/**
  * Initializes any OS specific object creator fields.
  */
 void VBOXCALL   supdrvOSObjInitCreator(PSUPDRVOBJ pObj, PSUPDRVSESSION pSession)
@@ -849,10 +1534,10 @@ int  VBOXCALL   supdrvOSLdrOpen(PSUPDRVDEVEXT pDevExt, PSUPDRVLDRIMAGE pImage, c
                 case /* 0xC0000263 */ STATUS_DRIVER_ENTRYPOINT_NOT_FOUND:
                     rc = VERR_LDR_IMPORTED_SYMBOL_NOT_FOUND;
                     break;
-                case    0xC0000428 /* STATUS_INVALID_IMAGE_HASH */ :
+                case /* 0xC0000428 */ STATUS_INVALID_IMAGE_HASH:
                     rc = VERR_LDR_IMAGE_HASH;
                     break;
-                case    0xC000010E /* STATUS_IMAGE_ALREADY_LOADED */ :
+                case /* 0xC000010E */ STATUS_IMAGE_ALREADY_LOADED:
                     Log(("WARNING: see @bugref{4853} for cause of this failure on Windows 7 x64\n"));
                     rc = VERR_ALREADY_LOADED;
                     break;
@@ -1056,6 +1741,11 @@ static NTSTATUS     VBoxDrvNtErr2NtStatus(int rc)
         case VERR_VERSION_MISMATCH:         return STATUS_REVISION_MISMATCH;
     }
 
+    if (rc < 0)
+    {
+        if (((uint32_t)rc & UINT32_C(0xffff0000)) == UINT32_C(0xffff0000))
+            return (NTSTATUS)( ((uint32_t)rc & UINT32_C(0xffff)) | SUP_NT_STATUS_BASE );
+    }
     return STATUS_UNSUCCESSFUL;
 }
 
@@ -1094,3 +1784,1785 @@ SUPR0DECL(int) SUPR0Printf(const char *pszFormat, ...)
     return 0;
 }
 #endif
+
+
+#ifdef VBOX_WITH_HARDENING
+
+/** @name Identifying Special Processes: CSRSS.EXE
+ * @{ */
+
+
+/**
+ * Checks if the process is a system32 process by the given name.
+ *
+ * @returns true / false.
+ * @param   pProcess            The process to check.
+ * @param   pszName             The lower case process name (no path!).
+ */
+static bool supdrvNtProtectIsSystem32ProcessMatch(PEPROCESS pProcess, const char *pszName)
+{
+    Assert(strlen(pszName) < 16); /* see buffer below */
+
+    /*
+     * This test works on XP+.
+     */
+    const char *pszImageFile = (const char *)PsGetProcessImageFileName(pProcess);
+    if (!pszImageFile)
+        return false;
+
+    if (RTStrICmp(pszImageFile, pszName) != 0)
+        return false;
+
+    /*
+     * This test requires a Vista+ API.
+     */
+    if (g_pfnPsReferenceProcessFilePointer)
+    {
+        PFILE_OBJECT pFile = NULL;
+        NTSTATUS rcNt = g_pfnPsReferenceProcessFilePointer(pProcess, &pFile);
+        if (!NT_SUCCESS(rcNt))
+            return false;
+
+        union
+        {
+            OBJECT_NAME_INFORMATION Info;
+            uint8_t        abBuffer[sizeof(g_System32NtPath) + 16 * sizeof(WCHAR)];
+        } Buf;
+        ULONG cbIgn;
+        rcNt = ObQueryNameString(pFile, &Buf.Info, sizeof(Buf) - sizeof(WCHAR), &cbIgn);
+        ObDereferenceObject(pFile);
+        if (!NT_SUCCESS(rcNt))
+            return false;
+
+        /* Terminate the name. */
+        PRTUTF16 pwszName = Buf.Info.Name.Buffer;
+        pwszName[Buf.Info.Name.Length / sizeof(RTUTF16)] = '\0';
+
+        /* Match the name against the system32 directory path. */
+        uint32_t cbSystem32 = g_System32NtPath.UniStr.Length;
+        if (Buf.Info.Name.Length < cbSystem32)
+            return false;
+        if (memcmp(pwszName, g_System32NtPath.UniStr.Buffer, cbSystem32))
+            return false;
+        pwszName += cbSystem32 / sizeof(RTUTF16);
+        if (*pwszName++ != '\\')
+            return false;
+
+        /* Compare the name. */
+        const char *pszRight = pszName;
+        for (;;)
+        {
+            WCHAR wchLeft = *pwszName++;
+            char  chRight = *pszRight++;
+            Assert(chRight == RT_C_TO_LOWER(chRight));
+
+            if (   wchLeft != chRight
+                && RT_C_TO_LOWER(wchLeft) != chRight)
+                return false;
+            if (!chRight)
+                break;
+        }
+    }
+
+    return true;
+}
+
+
+/**
+ * Checks if the current process is likely to be CSRSS.
+ *
+ * @returns true/false.
+ * @param   pProcess        The process.
+ */
+static bool supdrvNtProtectIsCsrssByProcess(PEPROCESS pProcess)
+{
+    /*
+     * On Windows 8.1 CSRSS.EXE is a protected process.
+     */
+    if (g_pfnPsIsProtectedProcessLight)
+    {
+        if (!g_pfnPsIsProtectedProcessLight(pProcess))
+            return false;
+    }
+
+    /*
+     * The name tests.
+     */
+    if (!supdrvNtProtectIsSystem32ProcessMatch(pProcess, "csrss.exe"))
+        return false;
+
+    /** @todo Could extend the CSRSS.EXE check with that the TokenUser of the
+     *        current process must be "NT AUTHORITY\SYSTEM" (S-1-5-18). */
+
+    return true;
+}
+
+
+/**
+ * Called in the context of VBoxDrvNtCreate to determin the CSRSS for the
+ * current process.
+ *
+ * The Client/Server Runtime Subsystem (CSRSS) process needs to be allowed some
+ * additional access right so we need to make 101% sure we correctly identify
+ * the CSRSS process a process is associated with.
+ *
+ * @returns IPRT status code.
+ * @param   pNtProtect          The NT protected process structure. The
+ *                              hCsrssPid member will be updated on success.
+ */
+static int supdrvNtProtectFindAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect)
+{
+    Assert(pNtProtect->AvlCore.Key == PsGetCurrentProcessId());
+    Assert(pNtProtect->pCsrssProcess == NULL);
+    Assert(pNtProtect->hCsrssPid == NULL);
+
+    /*
+     * We'll try use the ApiPort LPC object for the session we're in to track
+     * down the CSRSS process. So, we start by constructing a path to it.
+     */
+    int rc;
+    uint32_t    uSessionId = PsGetProcessSessionId(PsGetCurrentProcess());
+    WCHAR       wszApiPort[48];
+    if (uSessionId == 0)
+        rc = RTUtf16CopyAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Windows\\ApiPort");
+    else
+    {
+        char szTmp[64];
+        ssize_t cchTmp = RTStrFormatU32(szTmp, sizeof(szTmp), uSessionId, 10, 0, 0, 0);
+        AssertReturn(cchTmp > 0, (int)cchTmp);
+        rc = RTUtf16CopyAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Sessions\\");
+        if (RT_SUCCESS(rc))
+            rc = RTUtf16CatAscii(wszApiPort, RT_ELEMENTS(wszApiPort), szTmp);
+        if (RT_SUCCESS(rc))
+            rc = RTUtf16CatAscii(wszApiPort, RT_ELEMENTS(wszApiPort), "\\Windows\\ApiPort");
+    }
+    AssertRCReturn(rc, rc);
+
+    UNICODE_STRING ApiPortStr;
+    ApiPortStr.Buffer = wszApiPort;
+    ApiPortStr.Length = (USHORT)(RTUtf16Len(wszApiPort) * sizeof(RTUTF16));
+    ApiPortStr.MaximumLength = ApiPortStr.Length + sizeof(RTUTF16);
+
+    /*
+     * The object cannot be opened, but we can reference it by name.
+     */
+    void *pvApiPortObj = NULL;
+    NTSTATUS rcNt = ObReferenceObjectByName(&ApiPortStr,
+                                            0,
+                                            NULL /*pAccessState*/,
+                                            STANDARD_RIGHTS_READ,
+                                            *LpcPortObjectType,
+                                            KernelMode,
+                                            NULL /*pvParseContext*/,
+                                            &pvApiPortObj);
+    if (!NT_SUCCESS(rcNt))
+    {
+        SUPR0Printf("vboxdrv: Error opening '%ls': %#x\n", wszApiPort, rcNt);
+        return VERR_SUPDRV_APIPORT_OPEN_ERROR;
+    }
+
+    /*
+     * Query the processes in the system so we can locate CSRSS.EXE candidates.
+     * Note! Attempts at using SystemSessionProcessInformation failed with
+     *       STATUS_ACCESS_VIOLATION.
+     * Note! The 32 bytes on the size of to counteract the allocation header
+     *       that rtR0MemAllocEx slaps on everything.
+     */
+    ULONG       cbNeeded = _64K - 32;
+    uint32_t    cbBuf;
+    uint8_t    *pbBuf = NULL;
+    do
+    {
+        cbBuf = RT_ALIGN(cbNeeded + _4K, _64K) - 32;
+        pbBuf = (uint8_t *)RTMemAlloc(cbBuf);
+        if (!pbBuf)
+            break;
+
+        cbNeeded = 0;
+#if 0 /* doesn't work. */
+        SYSTEM_SESSION_PROCESS_INFORMATION Req;
+        Req.SessionId    = uSessionId;
+        Req.BufferLength = cbBuf;
+        Req.Buffer       = pbBuf;
+        rcNt = NtQuerySystemInformation(SystemSessionProcessInformation, &Req, sizeof(Req), &cbNeeded);
+#else
+        rcNt = NtQuerySystemInformation(SystemProcessInformation, pbBuf, cbBuf, &cbNeeded);
+#endif
+        if (NT_SUCCESS(rcNt))
+            break;
+
+        RTMemFree(pbBuf);
+        pbBuf = NULL;
+    } while (   rcNt == STATUS_INFO_LENGTH_MISMATCH
+             && cbNeeded > cbBuf
+             && cbNeeded < 32U*_1M);
+
+    if (   pbBuf
+        && NT_SUCCESS(rcNt)
+        && cbNeeded >= sizeof(SYSTEM_PROCESS_INFORMATION))
+    {
+        /*
+         * Walk the returned data and look for the process associated with the
+         * ApiPort object.  The ApiPort object keeps the EPROCESS address of
+         * the owner process (i.e. CSRSS) relatively early in the structure. On
+         * 64-bit windows 8.1 it's at offset 0x18.  So, obtain the EPROCESS
+         * pointer to likely CSRSS processes and check for a match in the first
+         * 0x40 bytes of the ApiPort object.
+         */
+        rc = VERR_SUPDRV_CSRSS_NOT_FOUND;
+        for (uint32_t offBuf = 0; offBuf <= cbNeeded - sizeof(SYSTEM_PROCESS_INFORMATION);)
+        {
+            PRTNT_SYSTEM_PROCESS_INFORMATION pProcInfo = (PRTNT_SYSTEM_PROCESS_INFORMATION)&pbBuf[offBuf];
+            if (   pProcInfo->ProcessName.Length == 9 * sizeof(WCHAR)
+                && pProcInfo->NumberOfThreads > 2   /* Very low guess. */
+                && pProcInfo->HandleCount     > 32  /* Very low guess, I hope. */
+                && (uintptr_t)pProcInfo->ProcessName.Buffer - (uintptr_t)pbBuf < cbNeeded
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[0]) == 'c'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[1]) == 's'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[2]) == 'r'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[3]) == 's'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[4]) == 's'
+                &&               pProcInfo->ProcessName.Buffer[5]  == '.'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[6]) == 'e'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[7]) == 'x'
+                && RT_C_TO_LOWER(pProcInfo->ProcessName.Buffer[8]) == 'e' )
+            {
+
+                /* Get the process structure and perform some more thorough
+                   process checks. */
+                PEPROCESS pProcess;
+                rcNt = PsLookupProcessByProcessId(pProcInfo->UniqueProcessId, &pProcess);
+                if (NT_SUCCESS(rcNt))
+                {
+                    if (supdrvNtProtectIsCsrssByProcess(pProcess))
+                    {
+                        if (PsGetProcessSessionId(pProcess) == uSessionId)
+                        {
+                            /* Final test, check the ApiPort.
+                               Note! The old LPC (pre Vista) objects has the PID
+                                     much earlier in the structure.  Might be
+                                     worth looking for it instead. */
+                            bool fThatsIt = false;
+                            __try
+                            {
+                                PEPROCESS *ppPortProc = (PEPROCESS *)pvApiPortObj;
+                                uint32_t   cTests = g_uNtVerCombined >= SUP_NT_VER_VISTA ? 16 : 38; /* ALPC since Vista. */
+                                do
+                                {
+                                    fThatsIt = *ppPortProc == pProcess;
+                                    ppPortProc++;
+                                } while (!fThatsIt && --cTests > 0);
+                            }
+                            __except(EXCEPTION_EXECUTE_HANDLER)
+                            {
+                                fThatsIt = false;
+                            }
+                            if (fThatsIt)
+                            {
+                                /* Ok, we found it!  Keep the process structure
+                                   reference as well as the PID so we can
+                                   safely identify it later on.  */
+                                pNtProtect->hCsrssPid     = pProcInfo->UniqueProcessId;
+                                pNtProtect->pCsrssProcess = pProcess;
+                                rc = VINF_SUCCESS;
+                                break;
+                            }
+                        }
+                    }
+
+                    ObDereferenceObject(pProcess);
+                }
+            }
+
+            /* Advance. */
+            if (!pProcInfo->NextEntryOffset)
+                break;
+            offBuf += pProcInfo->NextEntryOffset;
+        }
+    }
+    else
+        rc = VERR_SUPDRV_SESSION_PROCESS_ENUM_ERROR;
+    RTMemFree(pbBuf);
+    ObDereferenceObject(pvApiPortObj);
+    return rc;
+}
+
+
+/**
+ * Checks that the given process is the CSRSS process associated with protected
+ * process.
+ *
+ * @returns true / false.
+ * @param   pNtProtect          The NT protection structure.
+ * @param   pCsrss              The process structure of the alleged CSRSS.EXE
+ *                              process.
+ */
+static bool supdrvNtProtectIsAssociatedCsrss(PSUPDRVNTPROTECT pNtProtect, PEPROCESS pCsrss)
+{
+    if (pNtProtect->pCsrssProcess == pCsrss)
+    {
+        if (pNtProtect->hCsrssPid == PsGetProcessId(pCsrss))
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/**
+ * Checks if the given process is the stupid themes service.
+ *
+ * The caller does some screening of access masks and what not. We do the rest.
+ *
+ * @returns true / false.
+ * @param   pNtProtect          The NT protection structure.
+ * @param   pAnnoyingProcess    The process structure of an process that might
+ *                              happen to be the annoying themes process.
+ */
+static bool supdrvNtProtectIsFrigginThemesService(PSUPDRVNTPROTECT pNtProtect, PEPROCESS pAnnoyingProcess)
+{
+    /*
+     * Check the process name.
+     */
+    if (!supdrvNtProtectIsSystem32ProcessMatch(pAnnoyingProcess, "svchost.exe"))
+        return false;
+
+    /** @todo Come up with more checks. */
+
+    return true;
+}
+
+
+/** @} */
+
+
+/** @name Process Creation Callbacks.
+ * @{ */
+
+/**
+ * Common worker used by the process creation hooks as well as the process
+ * handle creation hooks to check if a VM process is being created.
+ *
+ * @returns true if likely to be a VM process, false if not.
+ * @param   pNtStub             The NT protection structure for the possible
+ *                              stub process.
+ * @param   hParentPid          The parent pid.
+ * @param   hChildPid           The child pid.
+ */
+static bool supdrvNtProtectIsSpawningStubProcess(PSUPDRVNTPROTECT pNtStub, HANDLE hParentPid, HANDLE hChildPid)
+{
+    bool fRc = false;
+    if (pNtStub->AvlCore.Key == hParentPid) /* paranoia */
+    {
+        if (pNtStub->enmProcessKind == kSupDrvNtProtectKind_StubSpawning)
+        {
+            /* Compare short names. */
+            PEPROCESS pStubProcess;
+            NTSTATUS rcNt = PsLookupProcessByProcessId(hParentPid, &pStubProcess);
+            if (NT_SUCCESS(rcNt))
+            {
+                PEPROCESS pChildProcess;
+                rcNt = PsLookupProcessByProcessId(hChildPid, &pChildProcess);
+                if (NT_SUCCESS(rcNt))
+                {
+                    const char *pszStub  = (const char *)PsGetProcessImageFileName(pStubProcess);
+                    const char *pszChild = (const char *)PsGetProcessImageFileName(pChildProcess);
+                    fRc = pszStub != NULL
+                       && pszChild != NULL
+                       && strcmp(pszStub, pszChild) == 0;
+
+                    /** @todo check that the full image names matches. */
+
+                    ObDereferenceObject(pChildProcess);
+                }
+                ObDereferenceObject(pStubProcess);
+            }
+        }
+    }
+    return fRc;
+}
+
+
+/**
+ * Common code used by the notifies to protect a child process.
+ *
+ * @returns VBox status code.
+ * @param   pNtStub             The NT protect structure for the parent.
+ * @param   hChildPid           The child pid.
+ */
+static int supdrvNtProtectProtectNewStubChild(PSUPDRVNTPROTECT pNtParent, HANDLE hChildPid)
+{
+    /*
+     * Create a child protection struction.
+     */
+    PSUPDRVNTPROTECT pNtChild;
+    int rc = supdrvNtProtectCreate(&pNtChild, hChildPid, kSupDrvNtProtectKind_VmProcessUnconfirmed, false /*fLink*/);
+    if (RT_SUCCESS(rc))
+    {
+        pNtChild->fFirstProcessCreateHandle = true;
+        pNtChild->fFirstThreadCreateHandle = true;
+        pNtChild->fCsrssFirstProcessCreateHandle = true;
+        pNtChild->fCsrssFirstProcessDuplicateHandle = true;
+        pNtChild->fThemesFirstProcessCreateHandle = true;
+        pNtChild->hParentPid = pNtParent->AvlCore.Key;
+        pNtChild->hCsrssPid = pNtParent->hCsrssPid;
+        pNtChild->pCsrssProcess = pNtParent->pCsrssProcess;
+        if (pNtChild->pCsrssProcess)
+            ObReferenceObject(pNtChild->pCsrssProcess);
+
+        /*
+         * Take the spinlock, recheck parent conditions and link things.
+         */
+        RTSpinlockAcquire(g_hNtProtectLock);
+        if (pNtParent->enmProcessKind == kSupDrvNtProtectKind_StubSpawning)
+        {
+            bool fSuccess = RTAvlPVInsert(&g_NtProtectTree, &pNtChild->AvlCore);
+            if (fSuccess)
+            {
+                pNtParent->u.pChild       = pNtChild; /* Parent keeps the initial reference. */
+                pNtParent->enmProcessKind = kSupDrvNtProtectKind_StubParent;
+                pNtChild->u.pParent       = pNtParent;
+
+                RTSpinlockRelease(g_hNtProtectLock);
+                return VINF_SUCCESS;
+            }
+
+            rc = VERR_INTERNAL_ERROR_2;
+        }
+        else
+            rc = VERR_WRONG_ORDER;
+        RTSpinlockRelease(g_hNtProtectLock);
+
+        supdrvNtProtectRelease(pNtChild);
+    }
+    return rc;
+}
+
+
+/**
+ * Common process termination code.
+ *
+ * Transitions protected process to the dead states, protecting against handle
+ * PID reuse (esp. with unconfirmed VM processes) and handle cleanup issues.
+ *
+ * @param   hDeadPid            The PID of the dead process.
+ */
+static void supdrvNtProtectUnprotectDeadProcess(HANDLE hDeadPid)
+{
+    PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(hDeadPid);
+    if (pNtProtect)
+    {
+        PSUPDRVNTPROTECT pNtChild = NULL;
+
+        RTSpinlockAcquire(g_hNtProtectLock);
+
+        /*
+         * If this is an unconfirmed VM process, we must release the reference
+         * the parent structure holds.
+         */
+        if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+        {
+            PSUPDRVNTPROTECT pNtParent = pNtProtect->u.pParent;
+            AssertRelease(pNtParent); AssertRelease(pNtParent->u.pChild == pNtProtect);
+            pNtParent->u.pChild   = NULL;
+            pNtProtect->u.pParent = NULL;
+            pNtChild = pNtProtect;
+        }
+        /*
+         * If this is a stub exitting before the VM process gets confirmed,
+         * release the protection of the potential VM process as this is not
+         * the prescribed behavior.
+         */
+        else if (   pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent
+                 && pNtProtect->u.pChild)
+        {
+            pNtChild = pNtProtect->u.pChild;
+            pNtProtect->u.pChild = NULL;
+            pNtChild->u.pParent  = NULL;
+            pNtChild->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+        }
+
+        /*
+         * Transition it to the dead state to prevent it from opening the
+         * support driver again or be posthumously abused as a vm process parent.
+         */
+        if (   pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+            || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessConfirmed)
+            pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+        else if (   pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent
+                 || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubSpawning
+                 || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubUnverified)
+            pNtProtect->enmProcessKind = kSupDrvNtProtectKind_StubDead;
+
+        RTSpinlockRelease(g_hNtProtectLock);
+
+        supdrvNtProtectRelease(pNtProtect);
+        supdrvNtProtectRelease(pNtChild);
+
+        /*
+         * Do session cleanups.
+         */
+        AssertReturnVoid((HANDLE)(uintptr_t)RTProcSelf() == hDeadPid);
+        if (g_pDevObjSys)
+        {
+            PSUPDRVDEVEXT  pDevExt  = (PSUPDRVDEVEXT)g_pDevObjSys->DeviceExtension;
+            PSUPDRVSESSION pSession = supdrvSessionHashTabLookup(pDevExt, (RTPROCESS)(uintptr_t)hDeadPid,
+                                                                 RTR0ProcHandleSelf(), NULL);
+            if (pSession)
+            {
+                supdrvSessionHashTabRemove(pDevExt, pSession, NULL);
+                supdrvSessionRelease(pSession); /* Drops the reference from supdrvSessionHashTabLookup. */
+            }
+        }
+    }
+}
+
+
+/**
+ * Common worker for the process creation callback that verifies a new child
+ * being created by the handle creation callback code.
+ *
+ * @param   pNtStub         The parent.
+ * @param   pNtVm           The child.
+ * @param   fCallerChecks   The result of any additional tests the caller made.
+ *                          This is in order to avoid duplicating the failure
+ *                          path code.
+ */
+static void supdrvNtProtectVerifyNewChildProtection(PSUPDRVNTPROTECT pNtStub, PSUPDRVNTPROTECT pNtVm, bool fCallerChecks)
+{
+    if (   fCallerChecks
+        && pNtStub->enmProcessKind == kSupDrvNtProtectKind_StubParent
+        && pNtVm->enmProcessKind   == kSupDrvNtProtectKind_VmProcessUnconfirmed
+        && pNtVm->u.pParent        == pNtStub
+        && pNtStub->u.pChild       == pNtVm)
+    {
+        /* Fine, nothing to do. */
+        return;
+    }
+
+    LogRel(("vboxdrv: Misdetected vm stub; hParentPid=%p hChildPid=%p\n", pNtStub->AvlCore.Key, pNtVm->AvlCore.Key));
+    if (pNtStub->enmProcessKind != kSupDrvNtProtectKind_VmProcessConfirmed)
+        supdrvNtProtectUnprotectDeadProcess(pNtVm->AvlCore.Key);
+}
+
+
+/**
+ * Old style callback (since forever).
+ *
+ * @param   hParentPid          The parent PID.
+ * @param   hNewPid             The PID of the new child.
+ * @param   fCreated            TRUE if it's a creation notification,
+ *                              FALSE if termination.
+ * @remarks ASSUMES this arrives before the handle creation callback.
+ */
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessCreateNotify(HANDLE hParentPid, HANDLE hNewPid, BOOLEAN fCreated)
+{
+    /*
+     * Is it a new process that needs protection?
+     */
+    if (fCreated)
+    {
+        PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(hParentPid);
+        if (pNtStub)
+        {
+            PSUPDRVNTPROTECT pNtVm = supdrvNtProtectLookup(hNewPid);
+            if (!pNtVm)
+            {
+                if (supdrvNtProtectIsSpawningStubProcess(pNtStub, hParentPid, hNewPid))
+                    supdrvNtProtectProtectNewStubChild(pNtStub, hNewPid);
+            }
+            else
+            {
+                supdrvNtProtectVerifyNewChildProtection(pNtStub, pNtVm, true);
+                supdrvNtProtectRelease(pNtVm);
+            }
+            supdrvNtProtectRelease(pNtStub);
+        }
+    }
+    /*
+     * Process termination, do clean ups.
+     */
+    else
+        supdrvNtProtectUnprotectDeadProcess(hNewPid);
+}
+
+
+/**
+ * New style callback (Vista SP1+ / w2k8).
+ *
+ * @param   pNewProcess         The new process.
+ * @param   hNewPid             The PID of the new process.
+ * @param   pInfo               Process creation details. NULL if process
+ *                              termination notification.
+ * @remarks ASSUMES this arrives before the handle creation callback.
+ */
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessCreateNotifyEx(PEPROCESS pNewProcess, HANDLE hNewPid, PPS_CREATE_NOTIFY_INFO pInfo)
+{
+    /*
+     * Is it a new process that needs protection?
+     */
+    if (pInfo)
+    {
+        PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(pInfo->CreatingThreadId.UniqueProcess);
+
+        Log(("vboxdrv/NewProcessEx: ctx=%04zx/%p pid=%04zx ppid=%04zx ctor=%04zx/%04zx rcNt=%#x %.*ls\n",
+             PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+             hNewPid, pInfo->ParentProcessId,
+             pInfo->CreatingThreadId.UniqueProcess, pInfo->CreatingThreadId.UniqueThread, pInfo->CreationStatus,
+             pInfo->FileOpenNameAvailable && pInfo->ImageFileName ? (size_t)pInfo->ImageFileName->Length / 2 : 0,
+             pInfo->FileOpenNameAvailable && pInfo->ImageFileName ? pInfo->ImageFileName->Buffer : NULL));
+
+        if (pNtStub)
+        {
+            PSUPDRVNTPROTECT pNtVm = supdrvNtProtectLookup(hNewPid);
+            if (!pNtVm)
+            {
+                /* Parent must be creator. */
+                if (pInfo->CreatingThreadId.UniqueProcess == pInfo->ParentProcessId)
+                {
+                    if (supdrvNtProtectIsSpawningStubProcess(pNtStub, pInfo->ParentProcessId, hNewPid))
+                        supdrvNtProtectProtectNewStubChild(pNtStub, hNewPid);
+                }
+            }
+            else
+            {
+                /* Parent must be creator (as above). */
+                supdrvNtProtectVerifyNewChildProtection(pNtStub, pNtVm,
+                                                        pInfo->CreatingThreadId.UniqueProcess == pInfo->ParentProcessId);
+                supdrvNtProtectRelease(pNtVm);
+            }
+            supdrvNtProtectRelease(pNtStub);
+        }
+    }
+    /*
+     * Process termination, do clean ups.
+     */
+    else
+        supdrvNtProtectUnprotectDeadProcess(hNewPid);
+}
+
+/** @} */
+
+
+/** @name Process Handle Callbacks.
+ * @{ */
+
+/** Process rights that we allow for handles to stub and VM processes. */
+# define SUPDRV_NT_ALLOW_PROCESS_RIGHTS  \
+    (  PROCESS_TERMINATE \
+     | PROCESS_VM_READ \
+     | PROCESS_QUERY_INFORMATION \
+     | PROCESS_QUERY_LIMITED_INFORMATION \
+     | PROCESS_SUSPEND_RESUME \
+     | DELETE \
+     | READ_CONTROL \
+     | SYNCHRONIZE)
+
+/** Evil process rights. */
+# define SUPDRV_NT_EVIL_PROCESS_RIGHTS  \
+    (  PROCESS_CREATE_THREAD \
+     | PROCESS_SET_SESSIONID /*?*/ \
+     | PROCESS_VM_OPERATION \
+     | PROCESS_VM_WRITE \
+     | PROCESS_DUP_HANDLE \
+     | PROCESS_CREATE_PROCESS /*?*/ \
+     | PROCESS_SET_QUOTA /*?*/ \
+     | PROCESS_SET_INFORMATION \
+     | PROCESS_SET_LIMITED_INFORMATION /*?*/ \
+     | 0)
+AssertCompile((SUPDRV_NT_ALLOW_PROCESS_RIGHTS & SUPDRV_NT_EVIL_PROCESS_RIGHTS) == 0);
+
+
+static OB_PREOP_CALLBACK_STATUS __stdcall
+supdrvNtProtectCallback_ProcessHandlePre(PVOID pvUser, POB_PRE_OPERATION_INFORMATION pOpInfo)
+{
+    Assert(pvUser == NULL);
+    Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+    Assert(pOpInfo->ObjectType == *PsProcessType);
+
+    /*
+     * Protected?  Kludge required for NtOpenProcess calls comming in before
+     * the create process hook triggers on Windows 8.1 (possibly others too).
+     */
+    HANDLE           hObjPid    = PsGetProcessId((PEPROCESS)pOpInfo->Object);
+    PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(hObjPid);
+    if (!pNtProtect)
+    {
+        HANDLE           hParentPid = PsGetProcessInheritedFromUniqueProcessId((PEPROCESS)pOpInfo->Object);
+        PSUPDRVNTPROTECT pNtStub = supdrvNtProtectLookup(hParentPid);
+        if (pNtStub)
+        {
+            if (supdrvNtProtectIsSpawningStubProcess(pNtStub, hParentPid, hObjPid))
+            {
+                supdrvNtProtectProtectNewStubChild(pNtStub, hObjPid);
+                pNtProtect = supdrvNtProtectLookup(hObjPid);
+            }
+            supdrvNtProtectRelease(pNtStub);
+        }
+    }
+    pOpInfo->CallContext = pNtProtect; /* Just for reference. */
+    if (pNtProtect)
+    {
+        /*
+         * Ok, it's a protected process.  Strip rights as required or possible.
+         */
+        static ACCESS_MASK const s_fCsrssStupidDesires = 0x1fffff;
+        ACCESS_MASK fAllowedRights = SUPDRV_NT_ALLOW_PROCESS_RIGHTS;
+
+        if (pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE)
+        {
+            /* Don't restrict the process accessing itself. */
+            if ((PEPROCESS)pOpInfo->Object == PsGetCurrentProcess())
+            {
+                pOpInfo->CallContext = NULL; /* don't assert */
+                pNtProtect->fFirstProcessCreateHandle = false;
+
+                Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d] %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+                     PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+            }
+            else
+            {
+                /* Special case 1 on Vista, 7 & 8:
+                   The CreateProcess code passes the handle over to CSRSS.EXE
+                   and the code inBaseSrvCreateProcess will duplicate the
+                   handle with 0x1fffff as access mask.  NtDuplicateObject will
+                   fail this call before it ever gets down here.
+
+                   Special case 2 on 8.1:
+                   The CreateProcess code requires additional rights for
+                   something, we'll drop these in the stub code. */
+                if (   pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+                    && pNtProtect->fFirstProcessCreateHandle
+                    && pNtProtect->hParentPid == PsGetProcessId(PsGetCurrentProcess()))
+                {
+                    if (   !pOpInfo->KernelHandle
+                        && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+                    {
+                        if (g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3))
+                            fAllowedRights |= s_fCsrssStupidDesires;
+                        else
+                            fAllowedRights = fAllowedRights
+                                           | PROCESS_VM_OPERATION
+                                           | PROCESS_VM_WRITE
+                                           | PROCESS_SET_INFORMATION
+                                           | PROCESS_SET_LIMITED_INFORMATION
+                                           | 0;
+                        pOpInfo->CallContext = NULL; /* don't assert this. */
+                    }
+                    pNtProtect->fFirstProcessCreateHandle = false;
+                }
+
+                /* Special case 3 on 8.1:
+                   The interaction between the CreateProcess code and CSRSS.EXE
+                   has changed to the better with Windows 8.1.  CSRSS.EXE no
+                   longer duplicates the process (thread too) handle, but opens
+                   it, thus allowing us to do our job. */
+                if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)
+                    && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+                    && pNtProtect->fCsrssFirstProcessCreateHandle
+                    && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess())
+                   )
+                {
+                    pNtProtect->fCsrssFirstProcessCreateHandle = false;
+                    if (pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+                    {
+                        /* Not needed: PROCESS_CREATE_THREAD, PROCESS_SET_SESSIONID,
+                           PROCESS_CREATE_PROCESS */
+                        fAllowedRights = fAllowedRights
+                                       | PROCESS_VM_OPERATION
+                                       | PROCESS_VM_WRITE
+                                       | PROCESS_DUP_HANDLE /* Needed for CreateProcess/VBoxTestOGL. */
+                                       | 0;
+                        pOpInfo->CallContext = NULL; /* don't assert this. */
+                    }
+                }
+
+                /* Special case 4, Windows 7, Vista, possibly 8, but not 8.1:
+                   The Themes service requires PROCESS_DUP_HANDLE access to our
+                   process or we won't get any menus and dialogs will be half
+                   unreadable.  This is _very_ unfortunate and more work will
+                   go into making this more secure.  */
+                if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)
+                    && g_uNtVerCombined  < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+                    && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == 0x1478 /* 6.1.7600.16385 (win7_rtm.090713-1255) */
+                    && pNtProtect->fThemesFirstProcessCreateHandle
+                    && supdrvNtProtectIsFrigginThemesService(pNtProtect, PsGetCurrentProcess()))
+                {
+                    pNtProtect->fThemesFirstProcessCreateHandle = true; /* Only once! */
+                    fAllowedRights |= PROCESS_DUP_HANDLE;
+                    pOpInfo->CallContext = NULL; /* don't assert this. */
+                }
+
+                Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p wants %#x to %p/pid=%04zx [%d], allow %#x => %#x; %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess & fAllowedRights,
+                     PsGetProcessImageFileName(PsGetCurrentProcess())));
+
+                pOpInfo->Parameters->CreateHandleInformation.DesiredAccess &= fAllowedRights;
+            }
+        }
+        else
+        {
+            /* Don't restrict the process accessing itself. */
+            if (   (PEPROCESS)pOpInfo->Object == PsGetCurrentProcess()
+                && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == pOpInfo->Object)
+            {
+                Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+                     PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+                     pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+                     pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+                     PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+                pOpInfo->CallContext = NULL; /* don't assert */
+            }
+            else
+            {
+                /* Special case 5 on Vista, 7 & 8:
+                   This is the CSRSS.EXE end of special case #1. */
+                if (   g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3)
+                    && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+                    && pNtProtect->fCsrssFirstProcessDuplicateHandle
+                    &&    pNtProtect->hParentPid
+                       == PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess)
+                    && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == PsGetCurrentProcess()
+                    && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess())
+                   )
+                {
+                    pNtProtect->fCsrssFirstProcessDuplicateHandle = false;
+                    if (pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+                    {
+                        /* Not needed: PROCESS_CREATE_THREAD, PROCESS_SET_SESSIONID,
+                           PROCESS_CREATE_PROCESS, PROCESS_DUP_HANDLE */
+                        fAllowedRights = fAllowedRights
+                                       | PROCESS_VM_OPERATION
+                                       | PROCESS_VM_WRITE
+                                       | PROCESS_DUP_HANDLE /* Needed for launching VBoxTestOGL. */
+                                       | 0;
+                        pOpInfo->CallContext = NULL; /* don't assert this. */
+                    }
+                }
+
+                Log(("vboxdrv/ProcessHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+                     PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+                     pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+                     pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+                     PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+                pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= fAllowedRights;
+            }
+        }
+        supdrvNtProtectRelease(pNtProtect);
+    }
+
+    return OB_PREOP_SUCCESS;
+}
+
+
+static VOID __stdcall
+supdrvNtProtectCallback_ProcessHandlePost(PVOID pvUser, POB_POST_OPERATION_INFORMATION pOpInfo)
+{
+    Assert(pvUser == NULL);
+    Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+    Assert(pOpInfo->ObjectType == *PsProcessType);
+
+    if (   pOpInfo->CallContext
+        && NT_SUCCESS(pOpInfo->ReturnStatus))
+    {
+        ACCESS_MASK const fGrantedAccess = pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE
+                                         ? pOpInfo->Parameters->CreateHandleInformation.GrantedAccess
+                                         : pOpInfo->Parameters->DuplicateHandleInformation.GrantedAccess;
+        AssertReleaseMsg(   !(fGrantedAccess & ~(  SUPDRV_NT_ALLOW_PROCESS_RIGHTS
+                                                 | WRITE_OWNER | WRITE_DAC /* these two might be forced upon us */
+                                                 | PROCESS_UNKNOWN_4000 /* Seen set on win 8.1 */
+                                                 /*| PROCESS_UNKNOWN_8000 */ ) )
+                         || pOpInfo->KernelHandle,
+                         ("GrantedAccess=%#x - we allow %#x - we did not allow %#x\n",
+                          fGrantedAccess, SUPDRV_NT_ALLOW_PROCESS_RIGHTS, fGrantedAccess & ~SUPDRV_NT_ALLOW_PROCESS_RIGHTS));
+    }
+}
+
+# undef SUPDRV_NT_ALLOW_PROCESS_RIGHTS
+
+/** @} */
+
+
+/** @name Thread Handle Callbacks
+ * @{ */
+
+/* From ntifs.h */
+extern "C" NTKERNELAPI PEPROCESS __stdcall IoThreadToProcess(PETHREAD);
+
+/** Thread rights that we allow for handles to stub and VM processes. */
+# define SUPDRV_NT_ALLOWED_THREAD_RIGHTS  \
+    (  THREAD_TERMINATE \
+     | THREAD_GET_CONTEXT \
+     | THREAD_QUERY_INFORMATION \
+     | THREAD_QUERY_LIMITED_INFORMATION \
+     | DELETE \
+     | READ_CONTROL \
+     | SYNCHRONIZE)
+/** @todo consider THREAD_SET_LIMITED_INFORMATION & THREAD_RESUME */
+
+/** Evil thread rights.
+ * @remarks THREAD_RESUME is not included as it seems to be forced upon us by
+ *          Windows 8.1, at least for some processes.  We dont' actively
+ *          allow it though, just tollerate it when forced to. */
+# define SUPDRV_NT_EVIL_THREAD_RIGHTS  \
+    (  THREAD_SUSPEND_RESUME \
+     | THREAD_SET_CONTEXT \
+     | THREAD_SET_INFORMATION \
+     | THREAD_SET_LIMITED_INFORMATION /*?*/ \
+     | THREAD_SET_THREAD_TOKEN /*?*/ \
+     | THREAD_IMPERSONATE /*?*/ \
+     | THREAD_DIRECT_IMPERSONATION /*?*/ \
+     /*| THREAD_RESUME - see remarks. */ \
+     | 0)
+AssertCompile((SUPDRV_NT_EVIL_THREAD_RIGHTS & SUPDRV_NT_ALLOWED_THREAD_RIGHTS) == 0);
+
+
+static OB_PREOP_CALLBACK_STATUS __stdcall
+supdrvNtProtectCallback_ThreadHandlePre(PVOID pvUser, POB_PRE_OPERATION_INFORMATION pOpInfo)
+{
+    Assert(pvUser == NULL);
+    Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+    Assert(pOpInfo->ObjectType == *PsThreadType);
+
+    PEPROCESS pProcess = IoThreadToProcess((PETHREAD)pOpInfo->Object);
+    PSUPDRVNTPROTECT pNtProtect = supdrvNtProtectLookup(PsGetProcessId(pProcess));
+    pOpInfo->CallContext = pNtProtect; /* Just for reference. */
+    if (pNtProtect)
+    {
+        static ACCESS_MASK const s_fCsrssStupidDesires = 0x1fffff;
+        ACCESS_MASK fAllowedRights = SUPDRV_NT_ALLOWED_THREAD_RIGHTS;
+
+        if (pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE)
+        {
+            /* Don't restrict the process accessing its own threads. */
+            if (pProcess == PsGetCurrentProcess())
+            {
+                Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d] self\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind));
+                pOpInfo->CallContext = NULL; /* don't assert */
+                pNtProtect->fFirstThreadCreateHandle = false;
+            }
+            else
+            {
+                /* Special case 1 on Vista, 7, 8:
+                   The CreateProcess code passes the handle over to CSRSS.EXE
+                   and the code inBaseSrvCreateProcess will duplicate the
+                   handle with 0x1fffff as access mask.  NtDuplicateObject will
+                   fail this call before it ever gets down here.  */
+                if (   g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 3)
+                    && pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed
+                    && pNtProtect->fFirstThreadCreateHandle
+                    && pNtProtect->hParentPid == PsGetProcessId(PsGetCurrentProcess()))
+                {
+                    if (   !pOpInfo->KernelHandle
+                        && pOpInfo->Parameters->CreateHandleInformation.DesiredAccess == s_fCsrssStupidDesires)
+                    {
+                        fAllowedRights |= s_fCsrssStupidDesires;
+                        pOpInfo->CallContext = NULL; /* don't assert this. */
+                    }
+                    pNtProtect->fFirstThreadCreateHandle = false;
+                }
+
+                /* Special case 2 on 8.1, possibly also Vista, 7, 8:
+                   When creating a process like VBoxTestOGL from the VM process,
+                   CSRSS.EXE will try talk to the calling thread and, it
+                   appears, impersonate it.  We unfortunately need to allow
+                   this or there will be no 3D support.  Typical DbgPrint:
+                        "SXS: BasepCreateActCtx() Calling csrss server failed. Status = 0xc00000a5" */
+                SUPDRVNTPROTECTKIND enmProcessKind;
+                if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 0, 0, 0)
+                    && (   (enmProcessKind = pNtProtect->enmProcessKind) == kSupDrvNtProtectKind_VmProcessConfirmed
+                        || enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+                    && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess()) )
+                {
+                    fAllowedRights |= THREAD_IMPERSONATE;
+                    fAllowedRights |= THREAD_DIRECT_IMPERSONATION;
+                    //fAllowedRights |= THREAD_SET_LIMITED_INFORMATION; - try without this one
+                    pOpInfo->CallContext = NULL; /* don't assert this. */
+                }
+
+                Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p wants %#x to %p in pid=%04zx [%d], allow %#x => %#x; %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+                     pOpInfo->Parameters->CreateHandleInformation.DesiredAccess & fAllowedRights,
+                     PsGetProcessImageFileName(PsGetCurrentProcess())));
+
+                pOpInfo->Parameters->CreateHandleInformation.DesiredAccess &= fAllowedRights;
+            }
+        }
+        else
+        {
+            /* Don't restrict the process accessing its own threads. */
+            if (   pProcess == PsGetCurrentProcess()
+                && (PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == pProcess)
+            {
+                Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d] self\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+                     PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+                     pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+                     pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind,
+                     PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+                pOpInfo->CallContext = NULL; /* don't assert */
+            }
+            else
+            {
+                /* Special case 3 on Vista, 7, 8:
+                   This is the follow up to special case 1. */
+                SUPDRVNTPROTECTKIND enmProcessKind;
+                if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 0, 0, 0)
+                    && (   (enmProcessKind = pNtProtect->enmProcessKind) == kSupDrvNtProtectKind_VmProcessConfirmed
+                        || enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+                    && pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess == PsGetCurrentProcess()
+                    && supdrvNtProtectIsAssociatedCsrss(pNtProtect, PsGetCurrentProcess()) )
+                {
+                    fAllowedRights |= THREAD_IMPERSONATE;
+                    fAllowedRights |= THREAD_DIRECT_IMPERSONATION;
+                    //fAllowedRights |= THREAD_SET_LIMITED_INFORMATION; - try without this one
+                    pOpInfo->CallContext = NULL; /* don't assert this. */
+                }
+
+                Log(("vboxdrv/ThreadHandlePre: ctx=%04zx/%p[%p] dup from %04zx/%p with %#x to %p in pid=%04zx [%d], allow %#x => %#x; %s\n",
+                     PsGetProcessId(PsGetCurrentProcess()), PsGetCurrentProcess(),
+                     pOpInfo->Parameters->DuplicateHandleInformation.TargetProcess,
+                     PsGetProcessId((PEPROCESS)pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess),
+                     pOpInfo->Parameters->DuplicateHandleInformation.SourceProcess,
+                     pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess,
+                     pOpInfo->Object, pNtProtect->AvlCore.Key, pNtProtect->enmProcessKind, fAllowedRights,
+                     pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess & fAllowedRights,
+                     PsGetProcessImageFileName(PsGetCurrentProcess()) ));
+
+                pOpInfo->Parameters->DuplicateHandleInformation.DesiredAccess &= fAllowedRights;
+            }
+        }
+
+        supdrvNtProtectRelease(pNtProtect);
+    }
+
+    return OB_PREOP_SUCCESS;
+}
+
+
+static VOID __stdcall
+supdrvNtProtectCallback_ThreadHandlePost(PVOID pvUser, POB_POST_OPERATION_INFORMATION pOpInfo)
+{
+    Assert(pvUser == NULL);
+    Assert(pOpInfo->Operation == OB_OPERATION_HANDLE_CREATE || pOpInfo->Operation == OB_OPERATION_HANDLE_DUPLICATE);
+    Assert(pOpInfo->ObjectType == *PsThreadType);
+
+    if (   pOpInfo->CallContext
+        && NT_SUCCESS(pOpInfo->ReturnStatus))
+    {
+        ACCESS_MASK const fGrantedAccess = pOpInfo->Parameters->CreateHandleInformation.GrantedAccess;
+        AssertReleaseMsg(   !(fGrantedAccess & ~(  SUPDRV_NT_ALLOWED_THREAD_RIGHTS
+                                                 | WRITE_OWNER | WRITE_DAC /* these two might be forced upon us */
+                                                 | THREAD_RESUME /* This seems to be force upon us too with 8.1. */
+                                                 ) )
+                         || pOpInfo->KernelHandle,
+                         ("GrantedAccess=%#x - we allow %#x - we did not allow %#x\n",
+                          fGrantedAccess, SUPDRV_NT_ALLOWED_THREAD_RIGHTS, fGrantedAccess & ~SUPDRV_NT_ALLOWED_THREAD_RIGHTS));
+    }
+}
+
+# undef SUPDRV_NT_ALLOWED_THREAD_RIGHTS
+
+/** @} */
+
+
+/**
+ * Creates a new process protection structure.
+ *
+ * @returns VBox status code.
+ * @param   ppNtProtect         Where to return the pointer to the structure
+ *                              on success.
+ * @param   hPid                The process ID of the process to protect.
+ * @param   enmProcessKind      The kind of process we're protecting.
+ * @param   fLink               Whether to link the structure into the tree.
+ */
+static int supdrvNtProtectCreate(PSUPDRVNTPROTECT *ppNtProtect, HANDLE hPid, SUPDRVNTPROTECTKIND enmProcessKind, bool fLink)
+{
+    AssertReturn(g_hNtProtectLock != NIL_RTSPINLOCK, VERR_WRONG_ORDER);
+
+    PSUPDRVNTPROTECT pNtProtect = (PSUPDRVNTPROTECT)RTMemAllocZ(sizeof(*pNtProtect));
+    if (!pNtProtect)
+        return VERR_NO_MEMORY;
+
+    pNtProtect->AvlCore.Key                  = hPid;
+    pNtProtect->u32Magic                     = SUPDRVNTPROTECT_MAGIC;
+    pNtProtect->cRefs                        = 1;
+    pNtProtect->enmProcessKind               = enmProcessKind;
+    pNtProtect->hParentPid                   = NULL;
+    pNtProtect->hCsrssPid                    = NULL;
+    pNtProtect->pCsrssProcess                = NULL;
+
+    if (fLink)
+    {
+        RTSpinlockAcquire(g_hNtProtectLock);
+        bool fSuccess = RTAvlPVInsert(&g_NtProtectTree, &pNtProtect->AvlCore);
+        RTSpinlockRelease(g_hNtProtectLock);
+
+        if (!fSuccess)
+        {
+            /* Duplicate entry, fail. */
+            pNtProtect->u32Magic = SUPDRVNTPROTECT_MAGIC_DEAD;
+            RTMemFree(pNtProtect);
+            return VERR_ACCESS_DENIED;
+        }
+    }
+
+    *ppNtProtect = pNtProtect;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Releases a reference to a NT protection structure.
+ *
+ * @param   pNtProtect          The NT protection structure.
+ */
+static void supdrvNtProtectRelease(PSUPDRVNTPROTECT pNtProtect)
+{
+    if (!pNtProtect)
+        return;
+    AssertReturnVoid(pNtProtect->u32Magic == SUPDRVNTPROTECT_MAGIC);
+
+    RTSpinlockAcquire(g_hNtProtectLock);
+    uint32_t cRefs = ASMAtomicDecU32(&pNtProtect->cRefs);
+    if (cRefs != 0)
+        RTSpinlockRelease(g_hNtProtectLock);
+    else
+    {
+        /*
+         * That was the last reference.  Remove it from the tree, invalidate it
+         * and free the resources associated with it.  Also, release any
+         * child/parent references related to this protection structure.
+         */
+        ASMAtomicWriteU32(&pNtProtect->u32Magic, SUPDRVNTPROTECT_MAGIC_DEAD);
+        PSUPDRVNTPROTECT pRemoved = (PSUPDRVNTPROTECT)RTAvlPVRemove(&g_NtProtectTree, pNtProtect->AvlCore.Key);
+
+        PSUPDRVNTPROTECT pRemovedChild = NULL;
+        PSUPDRVNTPROTECT pChild = NULL;
+        if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubParent)
+        {
+            pChild = pNtProtect->u.pChild;
+            if (pChild)
+            {
+                pNtProtect->u.pChild   = NULL;
+                pChild->u.pParent      = NULL;
+                pChild->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+                uint32_t cChildRefs = ASMAtomicIncU32(&pChild->cRefs);
+                if (!cChildRefs)
+                    pRemovedChild = (PSUPDRVNTPROTECT)RTAvlPVRemove(&g_NtProtectTree, pChild->AvlCore.Key);
+                else
+                    pChild = NULL;
+            }
+        }
+        else
+            AssertRelease(pNtProtect->enmProcessKind != kSupDrvNtProtectKind_VmProcessUnconfirmed);
+
+        RTSpinlockRelease(g_hNtProtectLock);
+        Assert(pRemoved == pNtProtect);
+        Assert(pRemovedChild == pChild);
+
+        if (pNtProtect->pCsrssProcess)
+        {
+            ObDereferenceObject(pNtProtect->pCsrssProcess);
+            pNtProtect->pCsrssProcess = NULL;
+        }
+
+        RTMemFree(pNtProtect);
+        if (pChild)
+            RTMemFree(pChild);
+    }
+}
+
+
+/**
+ * Looks up a PID in the NT protect tree.
+ *
+ * @returns Pointer to a NT protection structure (with a referenced) on success,
+ *          NULL if not found.
+ * @param   hPid                The process ID.
+ */
+static PSUPDRVNTPROTECT supdrvNtProtectLookup(HANDLE hPid)
+{
+    RTSpinlockAcquire(g_hNtProtectLock);
+    PSUPDRVNTPROTECT pFound = (PSUPDRVNTPROTECT)RTAvlPVGet(&g_NtProtectTree, hPid);
+    if (pFound)
+        ASMAtomicIncU32(&pFound->cRefs);
+    RTSpinlockRelease(g_hNtProtectLock);
+    return pFound;
+}
+
+
+/**
+ * Worker for supdrvNtProtectVerifyProcess that verifies the handles to a VM
+ * process and its thread.
+ *
+ * @returns VBox status code.
+ * @param   pNtProtect          The NT protect structure for getting information
+ *                              about special processes.
+ */
+static int supdrvNtProtectRestrictHandlesToProcessAndThread(PSUPDRVNTPROTECT pNtProtect)
+{
+    /*
+     * What to protect.
+     */
+    PEPROCESS   pProtectedProcess = PsGetCurrentProcess();
+    HANDLE      hProtectedPid     = PsGetProcessId(pProtectedProcess);
+    PETHREAD    pProtectedThread  = PsGetCurrentThread();
+    AssertReturn(pNtProtect->AvlCore.Key == hProtectedPid, VERR_INTERNAL_ERROR_5);
+
+    /*
+     * Take a snapshot of all the handles in the system.
+     * Note! The 32 bytes on the size of to counteract the allocation header
+     *       that rtR0MemAllocEx slaps on everything.
+     */
+    uint32_t    cbBuf    = _256K - 32;
+    uint8_t    *pbBuf    = (uint8_t *)RTMemAlloc(cbBuf);
+    ULONG       cbNeeded = cbBuf;
+    NTSTATUS rcNt = NtQuerySystemInformation(SystemExtendedHandleInformation, pbBuf, cbBuf, &cbNeeded);
+    if (!NT_SUCCESS(rcNt))
+    {
+        while (   rcNt == STATUS_INFO_LENGTH_MISMATCH
+               && cbNeeded > cbBuf
+               && cbBuf <= 32U*_1M)
+        {
+            cbBuf = RT_ALIGN_32(cbNeeded + _4K, _64K) - 32;
+            RTMemFree(pbBuf);
+            pbBuf = (uint8_t *)RTMemAlloc(cbBuf);
+            if (!pbBuf)
+                return VERR_NO_MEMORY;
+            rcNt = NtQuerySystemInformation(SystemExtendedHandleInformation, pbBuf, cbBuf, &cbNeeded);
+        }
+        if (!NT_SUCCESS(rcNt))
+        {
+            RTMemFree(pbBuf);
+            return RTErrConvertFromNtStatus(rcNt);
+        }
+    }
+
+    /*
+     * Walk the information and look for handles to the two objects we're protecting.
+     */
+    int rc = VINF_SUCCESS;
+
+    uint32_t cCsrssProcessHandles  = 0;
+    uint32_t cSystemProcessHandles = 0;
+    uint32_t cEvilProcessHandles   = 0;
+    uint32_t cBenignProcessHandles = 0;
+
+    uint32_t cCsrssThreadHandles   = 0;
+    uint32_t cEvilThreadHandles    = 0;
+    uint32_t cBenignThreadHandles  = 0;
+
+    SYSTEM_HANDLE_INFORMATION_EX const *pInfo = (SYSTEM_HANDLE_INFORMATION_EX const *)pbBuf;
+    ULONG_PTR i = pInfo->NumberOfHandles;
+    AssertRelease(RT_OFFSETOF(SYSTEM_HANDLE_INFORMATION_EX, Handles[i]) == cbNeeded);
+    while (i-- > 0)
+    {
+        const char *pszType;
+        SYSTEM_HANDLE_ENTRY_INFO_EX const *pHandleInfo = &pInfo->Handles[i];
+        if (pHandleInfo->Object == pProtectedProcess)
+        {
+            /* Handles within the protected process is fine. */
+            if (   !(pHandleInfo->GrantedAccess & SUPDRV_NT_EVIL_PROCESS_RIGHTS)
+                || pHandleInfo->UniqueProcessId == hProtectedPid)
+            {
+                cBenignProcessHandles++;
+                continue;
+            }
+
+            /* CSRSS is allowed to have one evil process handle.
+               See the special cases in the hook code. */
+            if (   cCsrssProcessHandles < 1
+                && pHandleInfo->UniqueProcessId == pNtProtect->hCsrssPid)
+            {
+                cCsrssProcessHandles++;
+                continue;
+            }
+
+            /* The system process is allowed having one open process handle in
+               Windows 8.1 and later. */
+            if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)
+                && cSystemProcessHandles < 1
+                && pHandleInfo->UniqueProcessId == PsGetProcessId(PsInitialSystemProcess))
+            {
+                cSystemProcessHandles++;
+                continue;
+            }
+
+            cEvilProcessHandles++;
+            pszType = "process";
+        }
+        else if (pHandleInfo->Object == pProtectedThread)
+        {
+            /* Handles within the protected process is fine. */
+            if (   !(pHandleInfo->GrantedAccess & SUPDRV_NT_EVIL_THREAD_RIGHTS)
+                || pHandleInfo->UniqueProcessId == hProtectedPid)
+            {
+                cBenignThreadHandles++;
+                continue;
+            }
+
+            /* CSRSS is allowed to have one evil handle to the primary thread
+               for LPC purposes.  See the hook for special case. */
+            if (   cCsrssThreadHandles < 1
+                && pHandleInfo->UniqueProcessId == pNtProtect->hCsrssPid)
+            {
+                cCsrssThreadHandles++;
+                continue;
+            }
+
+            cEvilThreadHandles++;
+            pszType = "thread";
+        }
+        else
+            continue;
+
+        /* Found evil handle. Currently ignoring on pre-Vista. */
+# ifndef VBOX_WITH_VISTA_NO_SP
+        if (   g_uNtVerCombined >= SUP_NT_VER_VISTA
+# else
+        if (   g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0)
+# endif
+            || g_pfnObRegisterCallbacks)
+        {
+            LogRel(("vboxdrv: Found evil handle to budding VM process: pid=%p h=%p acc=%#x attr=%#x type=%s\n",
+                    pHandleInfo->UniqueProcessId, pHandleInfo->HandleValue,
+                    pHandleInfo->GrantedAccess, pHandleInfo->HandleAttributes, pszType));
+            rc = VERR_SUPDRV_HARDENING_EVIL_HANDLE;
+        }
+    }
+
+    RTMemFree(pbBuf);
+    return rc;
+}
+
+
+/**
+ * Checks if the current process checks out as a VM process stub.
+ *
+ * @returns VBox status code.
+ * @param   pNtProtect          The NT protect structure.  This is upgraded to a
+ *                              final protection kind (state) on success.
+ */
+static int supdrvNtProtectVerifyProcess(PSUPDRVNTPROTECT pNtProtect)
+{
+    AssertReturn(PsGetProcessId(PsGetCurrentProcess()) == pNtProtect->AvlCore.Key, VERR_INTERNAL_ERROR_3);
+
+    /*
+     * Do the verification.  The handle restriction checks are only preformed
+     * on VM processes.
+     */
+    int rc = VINF_SUCCESS;
+    if (pNtProtect->enmProcessKind >= kSupDrvNtProtectKind_VmProcessUnconfirmed)
+        rc = supdrvNtProtectRestrictHandlesToProcessAndThread(pNtProtect);
+    if (RT_SUCCESS(rc))
+    {
+        char szErr[256];
+        RT_ZERO(szErr);
+        RTERRINFO ErrInfo;
+        RTErrInfoInit(&ErrInfo, szErr, sizeof(szErr));
+
+        rc = supHardenedWinVerifyProcess(NtCurrentProcess(), NtCurrentThread(), &ErrInfo);
+        if (RT_FAILURE(rc))
+            RTLogWriteDebugger(szErr, strlen(szErr));
+    }
+
+    /*
+     * Upgrade and return.
+     */
+    RTSpinlockAcquire(g_hNtProtectLock);
+
+    /* Stub process verficiation is pretty much straight forward. */
+    if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubUnverified)
+        pNtProtect->enmProcessKind = RT_SUCCESS(rc) ? kSupDrvNtProtectKind_StubSpawning : kSupDrvNtProtectKind_StubDead;
+
+    /* The VM process verification is a little bit more complicated
+       because we need to drop the parent process reference as well. */
+    else if (pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessUnconfirmed)
+    {
+        AssertRelease(pNtProtect->cRefs >= 2); /* Parent + Caller */
+        PSUPDRVNTPROTECT pParent = pNtProtect->u.pParent;
+        AssertRelease(pParent);
+        AssertRelease(pParent->u.pParent == pNtProtect);
+        AssertRelease(pParent->enmProcessKind == kSupDrvNtProtectKind_StubParent);
+        pParent->u.pParent = NULL;
+
+        pNtProtect->u.pParent = NULL;
+        ASMAtomicDecU32(&pNtProtect->cRefs);
+
+        if (RT_SUCCESS(rc))
+            pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessConfirmed;
+        else
+            pNtProtect->enmProcessKind = kSupDrvNtProtectKind_VmProcessDead;
+    }
+
+    /* Since the stub and VM processes are only supposed to have one thread,
+       we're not supposed to be subject to any races from within the processes.
+
+       There is a race between VM process verification and the stub process
+       exiting, though.  We require the stub process to be alive until the new
+       VM process has made it thru the validation.  So, when the stub
+       terminates the notification handler will change the state of both stub
+       and VM process to dead.
+
+       Also, I'm not entirely certain where the process
+       termination notification is triggered from, so that can theorically
+       create a race in both cases.  */
+    else
+    {
+        AssertReleaseMsg(   pNtProtect->enmProcessKind == kSupDrvNtProtectKind_StubDead
+                         || pNtProtect->enmProcessKind == kSupDrvNtProtectKind_VmProcessDead,
+                         ("enmProcessKind=%d rc=%Rrc\n", pNtProtect->enmProcessKind, rc));
+        if (RT_SUCCESS(rc))
+            rc = VERR_INVALID_STATE; /* There should be no races here. */
+    }
+
+    RTSpinlockRelease(g_hNtProtectLock);
+    return rc;
+}
+
+
+# ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+
+/**
+ * Checks if the current process is being debugged.
+ * @return @c true if debugged, @c false if not.
+ */
+static bool supdrvNtIsDebuggerAttached(void)
+{
+    return PsIsProcessBeingDebugged(PsGetCurrentProcess()) != FALSE;
+}
+
+# endif /* !VBOX_WITHOUT_DEBUGGER_CHECKS */
+
+
+/**
+ * Terminates the hardening bits.
+ */
+static void supdrvNtProtectTerm(void)
+{
+    /*
+     * Stop intercepting process and thread handle creation calls.
+     */
+    if (g_pvObCallbacksCookie)
+    {
+        g_pfnObUnRegisterCallbacks(g_pvObCallbacksCookie);
+        g_pvObCallbacksCookie = NULL;
+    }
+
+    /*
+     * Stop intercepting process creation and termination notifications.
+     */
+    NTSTATUS rcNt;
+    if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+        rcNt = g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, TRUE /*fRemove*/);
+    else
+        rcNt = PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, TRUE /*fRemove*/);
+    AssertMsg(NT_SUCCESS(rcNt), ("rcNt=%#x\n", rcNt));
+
+    Assert(g_NtProtectTree == NULL);
+
+    /*
+     * Clean up globals.
+     */
+    RTSpinlockDestroy(g_hNtProtectLock);
+    g_NtProtectTree = NIL_RTSPINLOCK;
+
+    supHardenedWinTermImageVerifier();
+}
+
+# ifdef RT_ARCH_X86
+DECLASM(void) supdrvNtQueryVirtualMemory_0xAF(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB0(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB1(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB2(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB3(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB4(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB5(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB6(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB7(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB8(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xB9(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBA(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBB(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBC(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBD(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0xBE(void);
+# elif defined(RT_ARCH_AMD64)
+DECLASM(void) supdrvNtQueryVirtualMemory_0x1F(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x20(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x21(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x22(void);
+DECLASM(void) supdrvNtQueryVirtualMemory_0x23(void);
+extern "C" NTSYSAPI NTSTATUS NTAPI ZwRequestWaitReplyPort(HANDLE, PVOID, PVOID);
+# endif
+
+/**
+ * Initalizes the hardening bits.
+ *
+ * @returns NT status code.
+ */
+static NTSTATUS supdrvNtProtectInit(void)
+{
+    /*
+     * Initialize the globals.
+     */
+
+    /* The NT version. */
+    ULONG uMajor, uMinor, uBuild;
+    PsGetVersion(&uMajor, &uMinor, &uBuild, NULL);
+    g_uNtVerCombined = SUP_MAKE_NT_VER_COMBINED(uMajor, uMinor, uBuild, 0, 0);
+
+    /* Resolve methods we want but isn't available everywhere. */
+    UNICODE_STRING RoutineName;
+
+    RtlInitUnicodeString(&RoutineName, L"ObRegisterCallbacks");
+    g_pfnObRegisterCallbacks   = (PFNOBREGISTERCALLBACKS)MmGetSystemRoutineAddress(&RoutineName);
+
+    RtlInitUnicodeString(&RoutineName, L"ObUnRegisterCallbacks");
+    g_pfnObUnRegisterCallbacks = (PFNOBUNREGISTERCALLBACKS)MmGetSystemRoutineAddress(&RoutineName);
+
+    RtlInitUnicodeString(&RoutineName, L"PsSetCreateProcessNotifyRoutineEx");
+    g_pfnPsSetCreateProcessNotifyRoutineEx = (PFNPSSETCREATEPROCESSNOTIFYROUTINEEX)MmGetSystemRoutineAddress(&RoutineName);
+
+    RtlInitUnicodeString(&RoutineName, L"PsReferenceProcessFilePointer");
+    g_pfnPsReferenceProcessFilePointer = (PFNPSREFERENCEPROCESSFILEPOINTER)MmGetSystemRoutineAddress(&RoutineName);
+
+    RtlInitUnicodeString(&RoutineName, L"PsIsProtectedProcessLight");
+    g_pfnPsIsProtectedProcessLight = (PFNPSISPROTECTEDPROCESSLIGHT)MmGetSystemRoutineAddress(&RoutineName);
+
+    RtlInitUnicodeString(&RoutineName, L"ZwQueryVirtualMemory"); /* Yes, using Zw version here. */
+    g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)MmGetSystemRoutineAddress(&RoutineName);
+    if (!g_pfnNtQueryVirtualMemory && g_uNtVerCombined < SUP_NT_VER_VISTA)
+    {
+        /* XP & W2K3 doesn't have this function exported, so we've cooked up a
+           few alternative in the assembly helper file that uses the code in
+           ZwReadFile with a different eax value.  We figure the syscall number
+           by inspecting ZwQueryVolumeInformationFile as it's the next number. */
+# ifdef RT_ARCH_X86
+        uint8_t const *pbCode = (uint8_t const *)(uintptr_t)ZwQueryVolumeInformationFile;
+        if (*pbCode == 0xb8) /* mov eax, dword */
+            switch (*(uint32_t const *)&pbCode[1])
+            {
+                case 0xb0: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xAF; break; /* just in case */
+                case 0xb1: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB0; break; /* just in case */
+                case 0xb2: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB1; break; /* just in case */
+                case 0xb3: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB2; break; /* XP SP3 */
+                case 0xb4: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB2; break; /* just in case */
+                case 0xb5: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB3; break; /* just in case */
+                case 0xb6: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB4; break; /* just in case */
+                case 0xb7: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB5; break; /* just in case */
+                case 0xb8: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB6; break; /* just in case */
+                case 0xb9: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB7; break; /* just in case */
+                case 0xba: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xB8; break; /* just in case */
+                case 0xbb: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBA; break; /* W2K3 R2 SP2 */
+                case 0xbc: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBB; break; /* just in case */
+                case 0xbd: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBC; break; /* just in case */
+                case 0xbe: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBD; break; /* just in case */
+                case 0xbf: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0xBE; break; /* just in case */
+            }
+# elif defined(RT_ARCH_AMD64)
+        uint8_t const *pbCode = (uint8_t const *)(uintptr_t)ZwRequestWaitReplyPort;
+        if (   pbCode[ 0] == 0x48   /* mov rax, rsp */
+            && pbCode[ 1] == 0x8b
+            && pbCode[ 2] == 0xc4
+            && pbCode[ 3] == 0xfa   /* cli */
+            && pbCode[ 4] == 0x48   /* sub rsp, 10h */
+            && pbCode[ 5] == 0x83
+            && pbCode[ 6] == 0xec
+            && pbCode[ 7] == 0x10
+            && pbCode[ 8] == 0x50   /* push rax */
+            && pbCode[ 9] == 0x9c   /* pushfq */
+            && pbCode[10] == 0x6a   /* push 10 */
+            && pbCode[11] == 0x10
+            && pbCode[12] == 0x48   /* lea rax, [nt!KiServiceLinkage] */
+            && pbCode[13] == 0x8d
+            && pbCode[14] == 0x05
+            && pbCode[19] == 0x50   /* push rax */
+            && pbCode[20] == 0xb8   /* mov eax,1fh <- the syscall no. */
+            /*&& pbCode[21] == 0x1f*/
+            && pbCode[22] == 0x00
+            && pbCode[23] == 0x00
+            && pbCode[24] == 0x00
+            && pbCode[25] == 0xe9   /* jmp KiServiceInternal */
+           )
+        {
+            uint8_t const *pbKiServiceInternal = &pbCode[30] + *(int32_t const *)&pbCode[26];
+            uint8_t const *pbKiServiceLinkage  = &pbCode[19] + *(int32_t const *)&pbCode[15];
+            if (*pbKiServiceLinkage == 0xc3)
+            {
+                g_pfnKiServiceInternal = (PFNRT)pbKiServiceInternal;
+                g_pfnKiServiceLinkage  = (PFNRT)pbKiServiceLinkage;
+                switch (pbCode[21])
+                {
+                    case 0x1e: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x1F; break;
+                    case 0x1f: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x20; break;
+                    case 0x20: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x21; break;
+                    case 0x21: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x22; break;
+                    case 0x22: g_pfnNtQueryVirtualMemory = (PFNNTQUERYVIRTUALMEMORY)supdrvNtQueryVirtualMemory_0x23; break;
+                }
+            }
+        }
+# endif
+    }
+    if (!g_pfnNtQueryVirtualMemory)
+    {
+        LogRel(("vboxdrv: Cannot locate ZwQueryVirtualMemory in ntoskrnl, nor were we able to cook up a replacement.\n"));
+        return STATUS_PROCEDURE_NOT_FOUND;
+    }
+
+
+    /* The spinlock protecting our structures. */
+    int rc = RTSpinlockCreate(&g_hNtProtectLock, RTSPINLOCK_FLAGS_INTERRUPT_UNSAFE, "NtProtectLock");
+    if (RT_FAILURE(rc))
+        return VBoxDrvNtErr2NtStatus(rc);
+    g_NtProtectTree = NULL;
+
+    /* Image stuff + certificates. */
+    NTSTATUS rcNt;
+    rc = supHardenedWinInitImageVerifier(NULL);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Intercept process creation and termination.
+         */
+        if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+            rcNt = g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, FALSE /*fRemove*/);
+        else
+            rcNt = PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, FALSE /*fRemove*/);
+        if (NT_SUCCESS(rcNt))
+        {
+            /*
+             * Intercept process and thread handle creation calls.
+             * The preferred method is only available on Vista SP1+.
+             */
+            if (g_pfnObRegisterCallbacks && g_pfnObUnRegisterCallbacks)
+            {
+                static OB_OPERATION_REGISTRATION s_aObOperations[] =
+                {
+                    {
+                        PsProcessType,
+                        OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
+                        supdrvNtProtectCallback_ProcessHandlePre,
+                        supdrvNtProtectCallback_ProcessHandlePost,
+                    },
+                    {
+                        PsThreadType,
+                        OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE,
+                        supdrvNtProtectCallback_ThreadHandlePre,
+                        supdrvNtProtectCallback_ThreadHandlePost,
+                    },
+                };
+                static OB_CALLBACK_REGISTRATION s_ObCallbackReg =
+                {
+                    /* .Version                     = */ OB_FLT_REGISTRATION_VERSION,
+                    /* .OperationRegistrationCount  = */ RT_ELEMENTS(s_aObOperations),
+                    /* .Altitude.Length             = */ 0,
+                    /* .Altitude.MaximumLength      = */ 0,
+                    /* .Altitude.Buffer             = */ NULL,
+                    /* .RegistrationContext         = */ NULL,
+                    /* .OperationRegistration       = */ &s_aObOperations[0]
+                };
+                static WCHAR const *s_apwszAltitudes[] = /** @todo get a valid number */
+                {
+                     L"48596.98940",  L"46935.19485",  L"49739.39704",  L"40334.74976",
+                     L"66667.98940",  L"69888.19485",  L"69889.39704",  L"60364.74976",
+                     L"85780.98940",  L"88978.19485",  L"89939.39704",  L"80320.74976",
+                     L"329879.98940", L"326787.19485", L"328915.39704", L"320314.74976",
+                };
+
+                rcNt = STATUS_FLT_INSTANCE_ALTITUDE_COLLISION;
+                for (uint32_t i = 0; i < RT_ELEMENTS(s_apwszAltitudes) && rcNt == STATUS_FLT_INSTANCE_ALTITUDE_COLLISION; i++)
+                {
+                    s_ObCallbackReg.Altitude.Buffer = (WCHAR *)s_apwszAltitudes[i];
+                    s_ObCallbackReg.Altitude.Length = (uint16_t)RTUtf16Len(s_apwszAltitudes[i]) * sizeof(WCHAR);
+                    s_ObCallbackReg.Altitude.MaximumLength = s_ObCallbackReg.Altitude.Length + sizeof(WCHAR);
+
+                    rcNt = g_pfnObRegisterCallbacks(&s_ObCallbackReg, &g_pvObCallbacksCookie);
+                    if (NT_SUCCESS(rcNt))
+                    {
+                        /*
+                         * Happy ending.
+                         */
+                        return STATUS_SUCCESS;
+                    }
+                }
+                LogRel(("vboxdrv: ObRegisterCallbacks failed with rcNt=%#x\n", rcNt));
+                g_pvObCallbacksCookie = NULL;
+            }
+            else
+            {
+                /*
+                 * For the time being, we do not implement extra process
+                 * protection on pre-Vista-SP1 systems as they are lacking
+                 * necessary KPIs.  XP is end of life, we do not wish to
+                 * spend more time on it, so we don't put up a fuss there.
+                 * Vista users without SP1 can install SP1 (or later), darn it,
+                 * so refuse to load.
+                 */
+                /** @todo Hack up an XP solution - will require hooking kernel APIs or doing bad
+                 *        stuff to a couple of object types. */
+# ifndef VBOX_WITH_VISTA_NO_SP
+                if (g_uNtVerCombined >= SUP_NT_VER_VISTA)
+# else
+                if (g_uNtVerCombined >= SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0))
+# endif
+                {
+                    DbgPrint("vboxdrv: ObRegisterCallbacks was not found. Please make sure you got the latest updates and service packs installed\n");
+                    rcNt = STATUS_SXS_VERSION_CONFLICT;
+                }
+                else
+                {
+                    Log(("vboxdrv: ObRegisterCallbacks was not found; ignored pre-Vista\n"));
+                    return rcNt = STATUS_SUCCESS;
+                }
+                g_pvObCallbacksCookie = NULL;
+            }
+
+            /*
+             * Drop process create/term notifications.
+             */
+            if (g_pfnPsSetCreateProcessNotifyRoutineEx)
+                g_pfnPsSetCreateProcessNotifyRoutineEx(supdrvNtProtectCallback_ProcessCreateNotifyEx, TRUE /*fRemove*/);
+            else
+                PsSetCreateProcessNotifyRoutine(supdrvNtProtectCallback_ProcessCreateNotify, TRUE /*fRemove*/);
+        }
+        else
+            LogRel(("vboxdrv: PsSetCreateProcessNotifyRoutine%s failed with rcNt=%#x\n",
+                    g_pfnPsSetCreateProcessNotifyRoutineEx ? "Ex" : "", rcNt));
+        supHardenedWinTermImageVerifier();
+    }
+    else
+        rcNt = VBoxDrvNtErr2NtStatus(rc);
+
+    RTSpinlockDestroy(g_hNtProtectLock);
+    g_NtProtectTree = NIL_RTSPINLOCK;
+    return rcNt;
+}
+
+#endif /* VBOX_WITH_HARDENING */
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm b/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
index 11fdcf3..9a9b45e 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
+++ b/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
@@ -4,7 +4,7 @@
 ;
 
 ;
-; Copyright (C) 2006-2010 Oracle Corporation
+; Copyright (C) 2006-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -44,3 +44,80 @@ BEGINPROC SUPR0Printf
 ENDPROC SUPR0Printf
 %endif
 
+
+%ifdef VBOX_WITH_HARDENING
+
+ %ifdef RT_ARCH_X86
+;
+; Faking up ZwQueryVirtualMemory on XP and W2K3 where it's not exported.
+; Using ZwOpenFile as a helper as it has the name number of parameters.
+;
+extern  IMPNAME(ZwOpenFile at 24)
+
+BEGINPROC supdrvNtQueryVirtualMemory_Xxx
+  %macro NtQueryVirtualMemorySyscall 1
+  GLOBALNAME supdrvNtQueryVirtualMemory_ %+ %1
+        mov     eax, %1
+        jmp     supdrvNtQueryVirtualMemory_Jump
+  %endm
+    NtQueryVirtualMemorySyscall 0xAF
+    NtQueryVirtualMemorySyscall 0xB0
+    NtQueryVirtualMemorySyscall 0xB1
+    NtQueryVirtualMemorySyscall 0xB2
+    NtQueryVirtualMemorySyscall 0xB3
+    NtQueryVirtualMemorySyscall 0xB4
+    NtQueryVirtualMemorySyscall 0xB5
+    NtQueryVirtualMemorySyscall 0xB6
+    NtQueryVirtualMemorySyscall 0xB7
+    NtQueryVirtualMemorySyscall 0xB8
+    NtQueryVirtualMemorySyscall 0xB9
+    NtQueryVirtualMemorySyscall 0xBA
+    NtQueryVirtualMemorySyscall 0xBB
+    NtQueryVirtualMemorySyscall 0xBC
+    NtQueryVirtualMemorySyscall 0xBD
+    NtQueryVirtualMemorySyscall 0xBE
+
+supdrvNtQueryVirtualMemory_Jump:
+        mov     edx, IMP2(ZwOpenFile at 24)
+        lea     edx, [edx + 5]
+        jmp     edx
+ENDPROC   supdrvNtQueryVirtualMemory_Xxx
+
+ %endif
+
+ %ifdef RT_ARCH_AMD64
+;
+; Faking up ZwQueryVirtualMemory on XP64 and W2K3-64 where it's not exported.
+; The C code locates and verifies the essentials in ZwRequestWaitReplyPort.
+;
+extern NAME(g_pfnKiServiceLinkage)
+extern NAME(g_pfnKiServiceInternal)
+BEGINPROC supdrvNtQueryVirtualMemory_Xxx
+  %macro NtQueryVirtualMemorySyscall 1
+  GLOBALNAME supdrvNtQueryVirtualMemory_ %+ %1
+        mov     eax, %1
+        jmp     supdrvNtQueryVirtualMemory_Jump
+  %endm
+
+    NtQueryVirtualMemorySyscall 0x1F
+    NtQueryVirtualMemorySyscall 0x20
+    NtQueryVirtualMemorySyscall 0x21
+    NtQueryVirtualMemorySyscall 0x22
+    NtQueryVirtualMemorySyscall 0x23
+
+supdrvNtQueryVirtualMemory_Jump:
+        cli
+        mov     r10, rsp                ; save call frame pointer.
+        mov     r11, [NAME(g_pfnKiServiceLinkage) wrt rip]
+        push    0
+        push    0
+        push    r10                     ; call frame pointer (incoming rsp).
+        pushfq
+        push    10h
+        push    r11                     ; r11 = KiServiceLinkage (ret w/ unwind info)
+        jmp     qword [NAME(g_pfnKiServiceInternal) wrt rip]
+ENDPROC   supdrvNtQueryVirtualMemory_Xxx
+ %endif
+
+%endif ; VBOX_WITH_HARDENING
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h b/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h
new file mode 100644
index 0000000..3f01555
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h
@@ -0,0 +1,152 @@
+/* $Id: SUPHardenedVerify-win.h $ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___win_SUPHardenedVerify_win_h
+#define ___win_SUPHardenedVerify_win_h
+
+#include <iprt/types.h>
+#include <iprt/crypto/x509.h>
+
+RT_C_DECLS_BEGIN
+
+#ifndef SUP_CERTIFICATES_ONLY
+# ifdef RT_OS_WINDOWS
+DECLHIDDEN(int)      supHardenedWinInitImageVerifier(PRTERRINFO pErrInfo);
+DECLHIDDEN(void)     supHardenedWinTermImageVerifier(void);
+DECLHIDDEN(int)      supHardenedWinVerifyProcess(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo);
+
+DECLHIDDEN(bool)     supHardViIsAppPatchDir(PCRTUTF16 pwszPath, uint32_t cwcName);
+DECLHIDDEN(int)      supHardenedWinVerifyImageByHandle(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, bool *pfCacheable, PRTERRINFO pErrInfo);
+DECLHIDDEN(int)      supHardenedWinVerifyImageByHandleNoName(HANDLE hFile, uint32_t fFlags, PRTERRINFO pErrInfo);
+/** @name SUPHNTVI_F_XXX - Flags for supHardenedWinVerifyImageByHandle.
+ * @{ */
+/** The signing certificate must be the same as the one the VirtualBox build
+ * was signed with. */
+#  define SUPHNTVI_F_REQUIRE_BUILD_CERT             RT_BIT(0)
+/** Require kernel code signing level. */
+#  define SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING    RT_BIT(1)
+/** Require the image to force the memory mapper to do signature checking. */
+#  define SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT  RT_BIT(2)
+/** Whether to allow image verification by catalog file. */
+#  define SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION    RT_BIT(3)
+/** Resource image, could be any bitness. */
+#  define SUPHNTVI_F_RESOURCE_IMAGE                 RT_BIT(30)
+/** Raw-mode context image, always 32-bit. */
+#  define SUPHNTVI_F_RC_IMAGE                       RT_BIT(31)
+/** @} */
+
+/** Which directory under the system root to get. */
+typedef enum SUPHARDNTSYSROOTDIR
+{
+    kSupHardNtSysRootDir_System32 = 0,
+    kSupHardNtSysRootDir_WinSxS,
+} SUPHARDNTSYSROOTDIR;
+
+DECLHIDDEN(int) supHardNtGetSystemRootDir(void *pvBuf, uint32_t cbBuf, SUPHARDNTSYSROOTDIR enmDir, PRTERRINFO pErrInfo);
+
+#  ifndef SUPHNTVI_NO_NT_STUFF
+
+/** Typical system root directory buffer. */
+typedef struct SUPSYSROOTDIRBUF
+{
+    UNICODE_STRING  UniStr;
+    WCHAR           awcBuffer[260];
+} SUPSYSROOTDIRBUF;
+extern SUPSYSROOTDIRBUF g_System32NtPath;
+extern SUPSYSROOTDIRBUF g_WinSxSNtPath;
+extern SUPSYSROOTDIRBUF g_SupLibHardenedExeNtPath;
+extern uint32_t         g_offSupLibHardenedExeNtName;
+
+/** Pointer to NtQueryVirtualMemory. */
+typedef NTSTATUS (NTAPI *PFNNTQUERYVIRTUALMEMORY)(HANDLE, void const *, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
+extern PFNNTQUERYVIRTUALMEMORY g_pfnNtQueryVirtualMemory;
+
+#  endif /* SUPHNTVI_NO_NT_STUFF */
+
+/** Creates a combined NT version number for simple comparisons. */
+#define SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, a_uBuild, a_uSpMajor, a_uSpMinor) \
+    (   ((uint32_t)((a_uMajor) & UINT32_C(0xf))    << 28) \
+      | ((uint32_t)((a_uMinor) & UINT32_C(0xf))    << 24) \
+      | ((uint32_t)((a_uBuild) & UINT32_C(0xffff)) << 8) \
+      | ((uint32_t)((a_uSpMajor) & UINT32_C(0xf))  << 4) \
+      | RT_MIN((uint32_t)(a_uSpMinor), UINT32_C(0xf)) )
+/** Simple version of SUP_MAKE_NT_VER_COMBINED. */
+#define SUP_MAKE_NT_VER_SIMPLE(a_uMajor, a_uMinor) SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, 0, 0, 0)
+extern uint32_t         g_uNtVerCombined;
+
+/** Combined NT version number for XP. */
+#define SUP_NT_VER_XP       SUP_MAKE_NT_VER_SIMPLE(5,1)
+/** Combined NT version number for Vista. */
+#define SUP_NT_VER_VISTA    SUP_MAKE_NT_VER_SIMPLE(6,0)
+/** Combined NT version number for Windows 7. */
+#define SUP_NT_VER_W70      SUP_MAKE_NT_VER_SIMPLE(6,1)
+/** Combined NT version number for Windows 8.0. */
+#define SUP_NT_VER_W80      SUP_MAKE_NT_VER_SIMPLE(6,2)
+/** Combined NT version number for Windows 8.1. */
+#define SUP_NT_VER_W81      SUP_MAKE_NT_VER_SIMPLE(6,3)
+
+# endif
+
+# ifndef IN_SUP_HARDENED_R3
+#  include <iprt/mem.h>
+#  include <iprt/string.h>
+
+#  define suplibHardenedAllocZ       RTMemAllocZ
+#  define suplibHardenedReAlloc      RTMemRealloc
+#  define suplibHardenedFree         RTMemFree
+#  define suplibHardenedMemComp      memcmp
+#  define suplibHardenedMemCopy      memcpy
+#  define suplibHardenedMemSet       memset
+#  define suplibHardenedStrCopy      strcpy
+#  define suplibHardenedStrLen       strlen
+#  define suplibHardenedStrCat       strcat
+#  define suplibHardenedStrCmp       strcmp
+#  define suplibHardenedStrNCmp      strncmp
+#  define suplibHardenedStrICmp      stricmp
+# else   /* IN_SUP_HARDENED_R3 */
+#  include <iprt/mem.h>
+#if 0
+#  define memcmp                     suplibHardenedMemComp
+#  define memcpy                     suplibHardenedMemCopy
+#  define memset                     suplibHardenedMemSet
+#  define strcpy                     suplibHardenedStrCopy
+#  define strlen                     suplibHardenedStrLen
+#  define strcat                     suplibHardenedStrCat
+#  define strcmp                     suplibHardenedStrCmp
+#  define strncmp                    suplibHardenedStrNCmp
+#  define stricmp                    suplibHardenedStrICmp
+#endif
+DECLHIDDEN(void *)  suplibHardenedAllocZ(size_t cb);
+DECLHIDDEN(void *)  suplibHardenedReAlloc(void *pvOld, size_t cbNew);
+DECLHIDDEN(void)    suplibHardenedFree(void *pv);
+# endif  /* IN_SUP_HARDENED_R3 */
+
+#endif /* SUP_CERTIFICATES_ONLY */
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
new file mode 100644
index 0000000..18777fb
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
@@ -0,0 +1,1982 @@
+/* $Id: SUPHardenedVerifyImage-win.cpp $ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Image Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#ifdef IN_RING0
+# define IPRT_NT_MAP_TO_ZW
+# include <iprt/nt/nt.h>
+# include <ntimage.h>
+#else
+# include <iprt/nt/nt-and-windows.h>
+# include "Wintrust.h"
+# include "Softpub.h"
+# include "mscat.h"
+# ifndef LOAD_LIBRARY_SEARCH_APPLICATION_DIR
+#  define LOAD_LIBRARY_SEARCH_SYSTEM32           0x800
+# endif
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/ldr.h>
+#include <iprt/log.h>
+#include <iprt/path.h>
+#include <iprt/string.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/crypto/store.h>
+
+#ifdef IN_RING0
+# include "SUPDrvInternal.h"
+#else
+# include "SUPLibInternal.h"
+#endif
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The size of static hash (output) buffers.
+ * Avoids dynamic allocations and cleanups for of small buffers as well as extra
+ * calls for getting the appropriate buffer size.  The largest digest in regular
+ * use by current windows version is SHA-512, we double this and hope it's
+ * enough a good while. */
+#define SUPHARDNTVI_MAX_CAT_HASH_SIZE   128
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * SUP image verifier loader reader instance.
+ */
+typedef struct SUPHNTVIRDR
+{
+    /** The core reader structure. */
+    RTLDRREADER Core;
+    /** The file handle . */
+    HANDLE      hFile;
+    /** Current file offset. */
+    RTFOFF      off;
+    /** The file size. */
+    RTFOFF      cbFile;
+    /** Flags for the verification callback, SUPHNTVI_F_XXX. */
+    uint32_t    fFlags;
+    /** The executable timstamp in second since unix epoch. */
+    uint64_t    uTimestamp;
+    /** Log name. */
+    char        szFilename[1];
+} SUPHNTVIRDR;
+/** Pointer to an SUP image verifier loader reader instance. */
+typedef SUPHNTVIRDR *PSUPHNTVIRDR;
+
+
+#ifdef IN_RING3
+typedef LONG (WINAPI * PFNWINVERIFYTRUST)(HWND hwnd, GUID const *pgActionID, PVOID pWVTData);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINACQUIRECONTEXT)(HCATADMIN *phCatAdmin, const GUID *pGuidSubsystem, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINACQUIRECONTEXT2)(HCATADMIN *phCatAdmin, const GUID *pGuidSubsystem, PCWSTR pwszHashAlgorithm,
+                                                        struct _CERT_STRONG_SIGN_PARA const *pStrongHashPolicy, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE)(HANDLE hFile, DWORD *pcbHash, BYTE *pbHash, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2)(HCATADMIN hCatAdmin, HANDLE hFile, DWORD *pcbHash,
+                                                                BYTE *pbHash, DWORD dwFlags);
+typedef HCATINFO (WINAPI *PFNCRYPTCATADMINENUMCATALOGFROMHASH)(HCATADMIN hCatAdmin, BYTE *pbHash, DWORD cbHash,
+                                                               DWORD dwFlags, HCATINFO *phPrevCatInfo);
+typedef BOOL (WINAPI * PFNCRYPTCATADMINRELEASECATALOGCONTEXT)(HCATADMIN hCatAdmin, HCATINFO hCatInfo, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATDADMINRELEASECONTEXT)(HCATADMIN hCatAdmin, DWORD dwFlags);
+typedef BOOL (WINAPI * PFNCRYPTCATCATALOGINFOFROMCONTEXT)(HCATINFO hCatInfo, CATALOG_INFO *psCatInfo, DWORD dwFlags);
+
+typedef HCERTSTORE (WINAPI *PFNCERTOPENSTORE)(PCSTR pszStoreProvider, DWORD dwEncodingType, HCRYPTPROV_LEGACY hCryptProv,
+                                              DWORD dwFlags, const void *pvParam);
+typedef BOOL (WINAPI *PFNCERTCLOSESTORE)(HCERTSTORE hCertStore, DWORD dwFlags);
+typedef PCCERT_CONTEXT (WINAPI *PFNCERTENUMCERTIFICATESINSTORE)(HCERTSTORE hCertStore, PCCERT_CONTEXT pPrevCertContext);
+#endif
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** The build certificate. */
+static RTCRX509CERTIFICATE  g_BuildX509Cert;
+
+/** Store for root software publisher certificates. */
+static RTCRSTORE            g_hSpcRootStore = NIL_RTCRSTORE;
+/** Store for root NT kernel certificates. */
+static RTCRSTORE            g_hNtKernelRootStore = NIL_RTCRSTORE;
+
+/** Store containing SPC, NT kernel signing, and timestamp root certificates. */
+static RTCRSTORE            g_hSpcAndNtKernelRootStore = NIL_RTCRSTORE;
+/** Store for supplemental certificates for use with
+ * g_hSpcAndNtKernelRootStore. */
+static RTCRSTORE            g_hSpcAndNtKernelSuppStore = NIL_RTCRSTORE;
+
+/** The full \\SystemRoot\\System32 path. */
+SUPSYSROOTDIRBUF            g_System32NtPath;
+/** The full \\SystemRoot\\WinSxS path. */
+SUPSYSROOTDIRBUF            g_WinSxSNtPath;
+
+/** Set after we've retrived other SPC root certificates from the system. */
+static bool                 g_fHaveOtherRoots = false;
+
+#if defined(IN_RING3) && !defined(IN_SUP_HARDENED_R3)
+/** Combined windows NT version number.  See SUP_MAKE_NT_VER_COMBINED and
+ *  SUP_MAKE_NT_VER_SIMPLE. */
+uint32_t                    g_uNtVerCombined;
+#endif
+
+#ifdef IN_RING3
+/** Timestamp hack working around issues with old DLLs that we ship.
+ * See supHardenedWinVerifyImageByHandle() for details.  */
+static uint64_t             g_uBuildTimestampHack = 0;
+#endif
+
+#ifdef IN_RING3
+/** Pointer to WinVerifyTrust. */
+PFNWINVERIFYTRUST                       g_pfnWinVerifyTrust;
+/** Pointer to CryptCATAdminAcquireContext. */
+PFNCRYPTCATADMINACQUIRECONTEXT          g_pfnCryptCATAdminAcquireContext;
+/** Pointer to CryptCATAdminAcquireContext2 if available. */
+PFNCRYPTCATADMINACQUIRECONTEXT2         g_pfnCryptCATAdminAcquireContext2;
+/** Pointer to CryptCATAdminCalcHashFromFileHandle. */
+PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE  g_pfnCryptCATAdminCalcHashFromFileHandle;
+/** Pointer to CryptCATAdminCalcHashFromFileHandle2. */
+PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2 g_pfnCryptCATAdminCalcHashFromFileHandle2;
+/** Pointer to CryptCATAdminEnumCatalogFromHash. */
+PFNCRYPTCATADMINENUMCATALOGFROMHASH     g_pfnCryptCATAdminEnumCatalogFromHash;
+/** Pointer to CryptCATAdminReleaseCatalogContext. */
+PFNCRYPTCATADMINRELEASECATALOGCONTEXT   g_pfnCryptCATAdminReleaseCatalogContext;
+/** Pointer to CryptCATAdminReleaseContext. */
+PFNCRYPTCATDADMINRELEASECONTEXT         g_pfnCryptCATAdminReleaseContext;
+/** Pointer to CryptCATCatalogInfoFromContext. */
+PFNCRYPTCATCATALOGINFOFROMCONTEXT       g_pfnCryptCATCatalogInfoFromContext;
+#endif
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+#ifdef IN_RING3
+static int supR3HardNtViCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+                                           PFNWINVERIFYTRUST pfnWinVerifyTrust);
+static int supR3HardNtViCallWinVerifyTrustCatFile(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+                                                  PFNWINVERIFYTRUST pfnWinVerifyTrust);
+#endif
+
+
+
+
+/** @copydoc RTLDRREADER::pfnRead */
+static DECLCALLBACK(int) supHardNtViRdrRead(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+    if ((ULONG)cb != cb)
+        return VERR_OUT_OF_RANGE;
+
+
+    /*
+     * For some reason I'm getting occational read error in an XP VM with
+     * STATUS_FAILED_DRIVER_ENTRY.  Redoing the call again works in the
+     * debugger, so try do that automatically.
+     */
+    for (uint32_t iTry = 0;; iTry++)
+    {
+        LARGE_INTEGER offNt;
+        offNt.QuadPart = off;
+
+        IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+        NTSTATUS rcNt = NtReadFile(pNtViRdr->hFile,
+                                   NULL /*hEvent*/,
+                                   NULL /*ApcRoutine*/,
+                                   NULL /*ApcContext*/,
+                                   &Ios,
+                                   pvBuf,
+                                   (ULONG)cb,
+                                   &offNt,
+                                   NULL);
+        if (NT_SUCCESS(rcNt))
+            rcNt = Ios.Status;
+        if (NT_SUCCESS(rcNt))
+        {
+            if (Ios.Information == cb)
+            {
+                pNtViRdr->off = off + cb;
+                return VINF_SUCCESS;
+            }
+#ifdef IN_RING3
+            supR3HardenedError(VERR_READ_ERROR, false,
+                               "supHardNtViRdrRead: Only got %#zx bytes when requesting %#zx bytes at %#llx in '%s'.\n",
+                               Ios.Information, off, cb, pNtViRdr->szFilename);
+#endif
+            pNtViRdr->off = -1;
+            return VERR_READ_ERROR;
+        }
+
+        /*
+         * Delay a little before we retry?
+         */
+#ifdef IN_RING3
+        if (iTry == 0)
+            NtYieldExecution();
+        else if (iTry >= 1)
+        {
+            LARGE_INTEGER Time;
+            Time.QuadPart = -1000000 / 100; /* 1ms in 100ns units, relative time. */
+            NtDelayExecution(TRUE, &Time);
+        }
+#endif
+        /*
+         * Before we give up, we'll try split up the request in case the
+         * kernel is low on memory or similar.  For simplicity reasons, we do
+         * this in a recursion fashion.
+         */
+        if (iTry >= 2)
+        {
+            if (cb >= _8K)
+            {
+                size_t const cbBlock = RT_ALIGN_Z(cb / 4, 512);
+                while (cb > 0)
+                {
+                    size_t cbThisRead = RT_MIN(cb, cbBlock);
+                    int rc = supHardNtViRdrRead(&pNtViRdr->Core, pvBuf, cbThisRead, off);
+                    if (RT_FAILURE(rc))
+                        return rc;
+                    off  += cbThisRead;
+                    cb   -= cbThisRead;
+                    pvBuf = (uint8_t *)pvBuf + cbThisRead;
+                }
+                return VINF_SUCCESS;
+            }
+
+#ifdef IN_RING3
+            supR3HardenedError(VERR_READ_ERROR, false, "supHardNtViRdrRead: Error %#x reading %#zx bytes at %#llx in '%s'.\n",
+                               rcNt, off, cb, pNtViRdr->szFilename);
+#endif
+            pNtViRdr->off = -1;
+            return VERR_READ_ERROR;
+        }
+    }
+}
+
+
+/** @copydoc RTLDRREADER::pfnTell */
+static DECLCALLBACK(RTFOFF) supHardNtViRdrTell(PRTLDRREADER pReader)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+    return pNtViRdr->off;
+}
+
+
+/** @copydoc RTLDRREADER::pfnSize */
+static DECLCALLBACK(RTFOFF) supHardNtViRdrSize(PRTLDRREADER pReader)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+    return pNtViRdr->cbFile;
+}
+
+
+/** @copydoc RTLDRREADER::pfnLogName */
+static DECLCALLBACK(const char *) supHardNtViRdrLogName(PRTLDRREADER pReader)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+    return pNtViRdr->szFilename;
+}
+
+
+/** @copydoc RTLDRREADER::pfnMap */
+static DECLCALLBACK(int) supHardNtViRdrMap(PRTLDRREADER pReader, const void **ppvBits)
+{
+    return VERR_NOT_SUPPORTED;
+}
+
+
+/** @copydoc RTLDRREADER::pfnUnmap */
+static DECLCALLBACK(int) supHardNtViRdrUnmap(PRTLDRREADER pReader, const void *pvBits)
+{
+    return VERR_NOT_SUPPORTED;
+}
+
+
+/** @copydoc RTLDRREADER::pfnDestroy */
+static DECLCALLBACK(int) supHardNtViRdrDestroy(PRTLDRREADER pReader)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pReader;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+    pNtViRdr->Core.uMagic = ~RTLDRREADER_MAGIC;
+    pNtViRdr->hFile = NULL;
+
+    RTMemFree(pNtViRdr);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Creates a loader reader instance for the given NT file handle.
+ *
+ * @returns iprt status code.
+ * @param   hFile           Native NT file handle.
+ * @param   pwszName        Optional file name.
+ * @param   fFlags          Flags, SUPHNTVI_F_XXX.
+ * @param   ppNtViRdr       Where to store the reader instance on success.
+ */
+static int supHardNtViRdrCreate(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PSUPHNTVIRDR *ppNtViRdr)
+{
+    /*
+     * Try determine the size of the file.
+     */
+    IO_STATUS_BLOCK             Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+    FILE_STANDARD_INFORMATION   StdInfo;
+    NTSTATUS rcNt = NtQueryInformationFile(hFile, &Ios, &StdInfo, sizeof(StdInfo), FileStandardInformation);
+    if (!NT_SUCCESS(rcNt) || !NT_SUCCESS(Ios.Status))
+        return VERR_LDRVI_FILE_LENGTH_ERROR;
+
+    /*
+     * Calc the file name length and allocate memory for the reader instance.
+     */
+    size_t cchFilename = 0;
+    if (pwszName)
+        cchFilename = RTUtf16CalcUtf8Len(pwszName);
+
+    int rc = VERR_NO_MEMORY;
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)RTMemAllocZ(sizeof(*pNtViRdr) + cchFilename);
+    if (!pNtViRdr)
+        return VERR_NO_MEMORY;
+
+    /*
+     * Initialize the structure.
+     */
+    if (cchFilename)
+    {
+        char *pszName = &pNtViRdr->szFilename[0];
+        rc = RTUtf16ToUtf8Ex(pwszName, RTSTR_MAX, &pszName, cchFilename + 1, NULL);
+        AssertStmt(RT_SUCCESS(rc), pNtViRdr->szFilename[0] = '\0');
+    }
+    else
+        pNtViRdr->szFilename[0] = '\0';
+
+    pNtViRdr->Core.uMagic     = RTLDRREADER_MAGIC;
+    pNtViRdr->Core.pfnRead    = supHardNtViRdrRead;
+    pNtViRdr->Core.pfnTell    = supHardNtViRdrTell;
+    pNtViRdr->Core.pfnSize    = supHardNtViRdrSize;
+    pNtViRdr->Core.pfnLogName = supHardNtViRdrLogName;
+    pNtViRdr->Core.pfnMap     = supHardNtViRdrMap;
+    pNtViRdr->Core.pfnUnmap   = supHardNtViRdrUnmap;
+    pNtViRdr->Core.pfnDestroy = supHardNtViRdrDestroy;
+    pNtViRdr->hFile           = hFile;
+    pNtViRdr->off             = 0;
+    pNtViRdr->cbFile          = StdInfo.EndOfFile.QuadPart;
+    pNtViRdr->fFlags          = fFlags;
+    *ppNtViRdr = pNtViRdr;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII path compare.
+ *
+ * @returns true if equal, false if not.
+ * @param   pwszLeft            The UTF-16 path string.
+ * @param   pszRight            The ascii string.
+ */
+static bool supHardViUtf16PathIsEqual(PCRTUTF16 pwszLeft, const char *pszRight)
+{
+    for (;;)
+    {
+        RTUTF16 wc = *pwszLeft++;
+        uint8_t b  = *pszRight++;
+        if (b != wc)
+        {
+            if (wc >= 0x80)
+                return false;
+            wc = RT_C_TO_LOWER(wc);
+            if (wc != b)
+            {
+                b = RT_C_TO_LOWER(b);
+                if (wc != b)
+                {
+                    if (wc == '/')
+                        wc = '\\';
+                    if (b == '/')
+                        b = '\\';
+                    if (wc != b)
+                        return false;
+                }
+            }
+        }
+        if (!b)
+            return true;
+    }
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII ends-with path predicate.
+ *
+ * @returns true if equal, false if not.
+ * @param   pwsz                The UTF-16 path string.
+ * @param   pszSuffix           The ascii suffix string.
+ */
+static bool supHardViUtf16PathEndsWith(PCRTUTF16 pwsz, const char *pszSuffix)
+{
+    size_t cwc       = RTUtf16Len(pwsz);
+    size_t cchSuffix = strlen(pszSuffix);
+    if (cwc >= cchSuffix)
+        return supHardViUtf16PathIsEqual(pwsz + cwc - cchSuffix, pszSuffix);
+    return false;
+}
+
+
+/**
+ * Simple case insensitive UTF-16 / ASCII starts-with path predicate.
+ *
+ * @returns true if starts with given string, false if not.
+ * @param   pwsz                The UTF-16 path string.
+ * @param   pszPrefix           The ascii prefix string.
+ */
+static bool supHardViUtf16PathStartsWith(PCRTUTF16 pwszLeft, const char *pszRight)
+{
+    for (;;)
+    {
+        RTUTF16 wc = *pwszLeft++;
+        uint8_t b  = *pszRight++;
+        if (b != wc)
+        {
+            if (!b)
+                return true;
+            if (wc >= 0x80 || wc == 0)
+                return false;
+            wc = RT_C_TO_LOWER(wc);
+            if (wc != b)
+            {
+                b = RT_C_TO_LOWER(b);
+                if (wc != b)
+                {
+                    if (wc == '/')
+                        wc = '\\';
+                    if (b == '/')
+                        b = '\\';
+                    if (wc != b)
+                        return false;
+                }
+            }
+        }
+    }
+}
+
+
+/**
+ * Counts slashes in the given UTF-8 path string.
+ *
+ * @returns Number of slashes.
+ * @param   pwsz                The UTF-16 path string.
+ */
+static uint32_t supHardViUtf16PathCountSlashes(PCRTUTF16 pwsz)
+{
+    uint32_t cSlashes = 0;
+    RTUTF16 wc;
+    while ((wc = *pwsz++) != '\0')
+        if (wc == '/' || wc == '\\')
+            cSlashes++;
+    return cSlashes;
+}
+
+
+#ifdef VBOX_PERMIT_MORE
+/**
+ * Checks if the path goes into %windir%\apppatch\.
+ *
+ * @returns true if apppatch, false if not.
+ * @param   pwszPath        The path to examine.
+ */
+DECLHIDDEN(bool) supHardViIsAppPatchDir(PCRTUTF16 pwszPath, uint32_t cwcName)
+{
+    uint32_t cwcWinDir = (g_System32NtPath.UniStr.Length - sizeof(L"System32")) / sizeof(WCHAR);
+
+    if (cwcName <= cwcWinDir + sizeof("AppPatch"))
+        return false;
+
+    if (memcmp(pwszPath, g_System32NtPath.UniStr.Buffer, cwcWinDir * sizeof(WCHAR)))
+        return false;
+
+    if (!supHardViUtf16PathStartsWith(&pwszPath[cwcWinDir], "\\AppPatch\\"))
+        return false;
+
+    return g_uNtVerCombined >= SUP_NT_VER_VISTA;
+}
+#else
+# error should not get here..
+#endif
+
+
+
+/**
+ * Checks if the unsigned DLL is fine or not.
+ *
+ * @returns VINF_LDRVI_NOT_SIGNED or @a rc.
+ * @param   hLdrMod             The loader module handle.
+ * @param   pwszName            The NT name of the DLL/EXE.
+ * @param   fFlags              Flags.
+ * @param   rc                  The status code..
+ */
+static int supHardNtViCheckIfNotSignedOk(RTLDRMOD hLdrMod, PCRTUTF16 pwszName, uint32_t fFlags, int rc)
+{
+    if (fFlags & (SUPHNTVI_F_REQUIRE_BUILD_CERT | SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING))
+        return rc;
+
+    /*
+     * Version macros.
+     */
+    uint32_t const uNtVer = g_uNtVerCombined;
+#define IS_XP()    ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(5, 1) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(5, 2) )
+#define IS_W2K3()  ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(5, 2) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(5, 3) )
+#define IS_VISTA() ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 0) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 1) )
+#define IS_W70()   ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 1) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 2) )
+#define IS_W80()   ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 2) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 3) )
+#define IS_W81()   ( uNtVer >= SUP_MAKE_NT_VER_SIMPLE(6, 3) && uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) )
+
+    /*
+     * The System32 directory.
+     *
+     * System32 is full of unsigned DLLs shipped by microsoft, graphics
+     * hardware vendors, input device/method vendors and whatnot else that
+     * actually needs to be loaded into a process for it to work correctly.
+     * We have to ASSUME that anything our process attempts to load from
+     * System32 is trustworthy and that the Windows system with the help of
+     * anti-virus software make sure there is nothing evil lurking in System32
+     * or being loaded from it.
+     *
+     * A small measure of protection is to list DLLs we know should be signed
+     * and decline loading unsigned versions of them, assuming they have been
+     * replaced by an adversary with evil intentions.
+     */
+    PCRTUTF16 pwsz;
+    uint32_t cwcName = (uint32_t)RTUtf16Len(pwszName);
+    uint32_t cwcOther = g_System32NtPath.UniStr.Length / sizeof(WCHAR);
+    if (   cwcName > cwcOther
+        && RTPATH_IS_SLASH(pwszName[cwcOther])
+        && memcmp(pwszName, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length) == 0)
+    {
+        pwsz = pwszName + cwcOther + 1;
+
+        /* Core DLLs. */
+        if (supHardViUtf16PathIsEqual(pwsz, "ntdll.dll"))
+            return uNtVer < SUP_NT_VER_VISTA ? VINF_LDRVI_NOT_SIGNED : rc;
+        if (supHardViUtf16PathIsEqual(pwsz, "kernel32.dll"))
+            return uNtVer < SUP_NT_VER_W81 ? VINF_LDRVI_NOT_SIGNED : rc;
+        if (supHardViUtf16PathIsEqual(pwsz, "kernelbase.dll"))
+            return IS_W80() || IS_W70() ? VINF_LDRVI_NOT_SIGNED : rc;
+        if (supHardViUtf16PathIsEqual(pwsz, "apisetschema.dll"))
+            return IS_W70() ? VINF_LDRVI_NOT_SIGNED : rc;
+        if (supHardViUtf16PathIsEqual(pwsz, "apphelp.dll"))
+            return uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) ? VINF_LDRVI_NOT_SIGNED : rc;
+#ifdef VBOX_PERMIT_MORE
+        if (uNtVer >= SUP_NT_VER_W70) /* hard limit: user32.dll is unwanted prior to w7. */
+        {
+            if (supHardViUtf16PathIsEqual(pwsz, "sfc.dll"))
+                return uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) ? VINF_LDRVI_NOT_SIGNED : rc;
+            if (supHardViUtf16PathIsEqual(pwsz, "sfc_os.dll"))
+                return uNtVer < SUP_MAKE_NT_VER_SIMPLE(6, 4) ? VINF_LDRVI_NOT_SIGNED : rc;
+            if (supHardViUtf16PathIsEqual(pwsz, "user32.dll"))
+                return uNtVer < SUP_NT_VER_W81 ? VINF_LDRVI_NOT_SIGNED : rc;
+        }
+#endif
+
+#ifndef IN_RING0
+# if 0 /* Allow anything below System32 that WinVerifyTrust thinks is fine. */
+        /* The ATI drivers load system drivers into the process, allow this,
+           but reject anything else from a subdirectory. */
+        uint32_t cSlashes = supHardViUtf16PathCountSlashes(pwsz);
+        if (cSlashes > 0)
+        {
+            if (   cSlashes == 1
+                && supHardViUtf16PathStartsWith(pwsz, "drivers\\ati")
+                && (   supHardViUtf16PathEndsWith(pwsz, ".sys")
+                    || supHardViUtf16PathEndsWith(pwsz, ".dll") ) )
+                return VINF_LDRVI_NOT_SIGNED;
+            return rc;
+        }
+# endif
+
+        /* Check that this DLL isn't supposed to be signed on this windows
+           version.  If it should, it's likely to be a fake. */
+        /** @todo list of signed dlls for various windows versions.  */
+
+        /** @todo check file permissions? TrustedInstaller is supposed to be involved
+         *        with all of them. */
+        return VINF_LDRVI_NOT_SIGNED;
+#else
+        return rc;
+#endif
+    }
+
+#ifndef IN_RING0
+    /*
+     * The WinSxS white list.
+     *
+     * Just like with System32 there are potentially a number of DLLs that
+     * could be required from WinSxS.  However, so far only comctl32.dll
+     * variations have been required.  So, we limit ourselves to explicit
+     * whitelisting of unsigned families of DLLs.
+     */
+    cwcOther = g_WinSxSNtPath.UniStr.Length / sizeof(WCHAR);
+    if (   cwcName > cwcOther
+        && RTPATH_IS_SLASH(pwszName[cwcOther])
+        && memcmp(pwszName, g_WinSxSNtPath.UniStr.Buffer, g_WinSxSNtPath.UniStr.Length) == 0)
+    {
+        pwsz = pwszName + cwcOther + 1;
+        cwcName -= cwcOther + 1;
+
+        /* The WinSxS layout means everything worth loading is exactly one level down. */
+        uint32_t cSlashes = supHardViUtf16PathCountSlashes(pwsz);
+        if (cSlashes != 1)
+            return rc;
+
+# if 0 /* See below */
+        /* The common controls mess. */
+# ifdef RT_ARCH_AMD64
+        if (supHardViUtf16PathStartsWith(pwsz, "amd64_microsoft.windows.common-controls_"))
+# elif defined(RT_ARCH_X86)
+        if (supHardViUtf16PathStartsWith(pwsz, "x86_microsoft.windows.common-controls_"))
+# else
+#  error "Unsupported architecture"
+# endif
+        {
+            if (supHardViUtf16PathEndsWith(pwsz, "\\comctl32.dll"))
+                return VINF_LDRVI_NOT_SIGNED;
+        }
+# endif
+
+        /* Allow anything slightly microsoftish from WinSxS. W2K3 wanted winhttp.dll early on... */
+# ifdef RT_ARCH_AMD64
+        if (supHardViUtf16PathStartsWith(pwsz, "amd64_microsoft."))
+# elif defined(RT_ARCH_X86)
+        if (supHardViUtf16PathStartsWith(pwsz, "x86_microsoft."))
+# else
+#  error "Unsupported architecture"
+# endif
+        {
+            return VINF_LDRVI_NOT_SIGNED;
+        }
+
+        return rc;
+    }
+#endif
+
+#ifdef VBOX_PERMIT_MORE
+    /*
+     * AppPatch whitelist.
+     */
+    if (supHardViIsAppPatchDir(pwszName, cwcName))
+    {
+        cwcOther = g_System32NtPath.UniStr.Length / sizeof(WCHAR); /* ASSUMES System32 is called System32. */
+        pwsz = pwszName + cwcOther + 1;
+
+        if (supHardViUtf16PathIsEqual(pwsz, "acres.dll"))
+            return VINF_LDRVI_NOT_SIGNED;
+
+# ifdef RT_ARCH_AMD64
+        if (supHardViUtf16PathIsEqual(pwsz, "AppPatch64\\AcGenral.dll"))
+            return VINF_LDRVI_NOT_SIGNED;
+# elif defined(RT_ARCH_X86)
+        if (supHardViUtf16PathIsEqual(pwsz, "AcGenral.dll"))
+            return VINF_LDRVI_NOT_SIGNED;
+# endif
+
+        return rc;
+    }
+#else
+# error should not be here...
+#endif
+
+    return rc;
+}
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing.  Use this for Microsoft SPC.}
+ */
+static DECLCALLBACK(int) supHardNtViCertVerifyCallback(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                                       void *pvUser, PRTERRINFO pErrInfo)
+{
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pvUser;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+    /*
+     * If there is no certificate path build & validator associated with this
+     * callback, it must be because of the build certificate.  We trust the
+     * build certificate without any second thoughts.
+     */
+    if (hCertPaths == NIL_RTCRX509CERTPATHS)
+    {
+        if (RTCrX509Certificate_Compare(pCert, &g_BuildX509Cert) == 0) /* healthy paranoia */
+            return VINF_SUCCESS;
+        return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_NOT_BUILD_CERT_IPE, "Not valid kernel code signature.");
+    }
+
+    /*
+     * Standard code signing capabilites required.
+     */
+    int rc = RTCrPkcs7VerifyCertCallbackCodeSigning(pCert, hCertPaths, NULL, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * If kernel signing, a valid certificate path must be anchored by the
+         * microsoft kernel signing root certificate.
+         */
+        if (pNtViRdr->fFlags & SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING)
+        {
+            uint32_t cPaths = RTCrX509CertPathsGetPathCount(hCertPaths);
+            uint32_t cFound = 0;
+            uint32_t cValid = 0;
+            for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+            {
+                bool                            fTrusted;
+                PCRTCRX509NAME                  pSubject;
+                PCRTCRX509SUBJECTPUBLICKEYINFO  pPublicKeyInfo;
+                int                             rcVerify;
+                rc = RTCrX509CertPathsQueryPathInfo(hCertPaths, iPath, &fTrusted, NULL /*pcNodes*/, &pSubject, &pPublicKeyInfo,
+                                                    NULL, NULL /*pCertCtx*/, &rcVerify);
+                AssertRCBreak(rc);
+
+                if (RT_SUCCESS(rcVerify))
+                {
+                    Assert(fTrusted);
+                    cValid++;
+
+                    /*
+                     * Search the kernel signing root store for a matching anchor.
+                     */
+                    RTCRSTORECERTSEARCH Search;
+                    rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(g_hNtKernelRootStore, pSubject, &Search);
+                    AssertRCBreak(rc);
+
+                    PCRTCRCERTCTX pCertCtx;
+                    while ((pCertCtx = RTCrStoreCertSearchNext(g_hNtKernelRootStore, &Search)) != NULL)
+                    {
+                        PCRTCRX509SUBJECTPUBLICKEYINFO pCertPubKeyInfo = NULL;
+                        if (pCertCtx->pCert)
+                            pCertPubKeyInfo = &pCertCtx->pCert->TbsCertificate.SubjectPublicKeyInfo;
+                        else if (pCertCtx->pTaInfo)
+                            pCertPubKeyInfo = &pCertCtx->pTaInfo->PubKey;
+                        else
+                            pCertPubKeyInfo = NULL;
+                        if (   pCertPubKeyInfo
+                            && RTCrX509SubjectPublicKeyInfo_Compare(pCertPubKeyInfo, pPublicKeyInfo) == 0)
+                            cFound++;
+                        RTCrCertCtxRelease(pCertCtx);
+                    }
+
+                    int rc2 = RTCrStoreCertSearchDestroy(g_hNtKernelRootStore, &Search); AssertRC(rc2);
+                }
+            }
+            if (RT_SUCCESS(rc) && cFound == 0)
+                rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_NOT_VALID_KERNEL_CODE_SIGNATURE, "Not valid kernel code signature.");
+            if (RT_SUCCESS(rc) && cValid < 2 && g_fHaveOtherRoots)
+                rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT,
+                                   "Expected at least %u valid paths, not %u.", 2, cValid);
+        }
+    }
+
+    /*
+     * More requirements? NT5 build lab?
+     */
+
+    return rc;
+}
+
+
+static DECLCALLBACK(int) supHardNtViCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+                                             void const *pvSignature, size_t cbSignature,
+                                             PRTERRINFO pErrInfo, void *pvUser)
+{
+    /*
+     * Check out the input.
+     */
+    PSUPHNTVIRDR pNtViRdr = (PSUPHNTVIRDR)pvUser;
+    Assert(pNtViRdr->Core.uMagic == RTLDRREADER_MAGIC);
+
+    AssertReturn(cbSignature == sizeof(RTCRPKCS7CONTENTINFO), VERR_INTERNAL_ERROR_5);
+    PCRTCRPKCS7CONTENTINFO pContentInfo = (PCRTCRPKCS7CONTENTINFO)pvSignature;
+    AssertReturn(RTCrPkcs7ContentInfo_IsSignedData(pContentInfo), VERR_INTERNAL_ERROR_5);
+    AssertReturn(pContentInfo->u.pSignedData->SignerInfos.cItems == 1, VERR_INTERNAL_ERROR_5);
+    PCRTCRPKCS7SIGNERINFO pSignerInfo = &pContentInfo->u.pSignedData->SignerInfos.paItems[0];
+
+    /*
+     * If special certificate requirements, check them out before validating
+     * the signature.
+     */
+    if (pNtViRdr->fFlags & SUPHNTVI_F_REQUIRE_BUILD_CERT)
+    {
+        if (!RTCrX509Certificate_MatchIssuerAndSerialNumber(&g_BuildX509Cert,
+                                                            &pSignerInfo->IssuerAndSerialNumber.Name,
+                                                            &pSignerInfo->IssuerAndSerialNumber.SerialNumber))
+            return RTErrInfoSet(pErrInfo, VERR_SUP_VP_NOT_SIGNED_WITH_BUILD_CERT, "Not signed with the build certificate.");
+    }
+
+    /*
+     * Verify the signature.
+     */
+    RTTIMESPEC ValidationTime;
+    RTTimeSpecSetSeconds(&ValidationTime, pNtViRdr->uTimestamp);
+
+    return RTCrPkcs7VerifySignedData(pContentInfo, 0, g_hSpcAndNtKernelSuppStore, g_hSpcAndNtKernelRootStore, &ValidationTime,
+                                     supHardNtViCertVerifyCallback, pNtViRdr, pErrInfo);
+}
+
+
+/**
+ * Checks if it's safe to call WinVerifyTrust or whether we might end up in an
+ * infinite recursion.
+ *
+ * @returns true if ok, false if not.
+ * @param   hFile               The file name.
+ * @param   pwszName            The executable name.
+ */
+static bool supR3HardNtViCanCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName)
+{
+     /*
+      * Recursion preventions hacks:
+      *  - Don't try call WinVerifyTrust on Wintrust.dll when called from the
+      *    create section hook. CRYPT32.DLL tries to load WinTrust.DLL in some cases.
+      */
+     size_t cwcName = RTUtf16Len(pwszName);
+     if (   hFile != NULL
+         && cwcName > g_System32NtPath.UniStr.Length / sizeof(WCHAR)
+         && !memcmp(pwszName, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length)
+         && supHardViUtf16PathIsEqual(&pwszName[g_System32NtPath.UniStr.Length / sizeof(WCHAR)], "\\wintrust.dll"))
+         return false;
+
+     return true;
+}
+
+
+/**
+ * Verifies the given executable image.
+ *
+ * @returns IPRT status code.
+ * @param   hFile       File handle to the executable file.
+ * @param   pwszName    Full NT path to the DLL in question, used for dealing
+ *                      with unsigned system dlls as well as for error/logging.
+ * @param   fFlags      Flags, SUPHNTVI_F_XXX.
+ * @param   pfCacheable Where to return whether the result can be cached.  A
+ *                      valid value is always returned. Optional.
+ * @param   pErrInfo    Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandle(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags,
+                                                  bool *pfCacheable, PRTERRINFO pErrInfo)
+{
+    /* Clear the cacheable indicator as it needs to be valid in all return paths. */
+    if (pfCacheable)
+        *pfCacheable = false;
+
+#ifdef IN_RING3
+    /* Check that the caller has performed the necessary library initialization. */
+    if (!RTCrX509Certificate_IsPresent(&g_BuildX509Cert))
+        return RTErrInfoSet(pErrInfo, VERR_WRONG_ORDER,
+                            "supHardenedWinVerifyImageByHandle: supHardenedWinInitImageVerifier was not called.");
+#endif
+
+    /*
+     * Create a reader instance.
+     */
+    PSUPHNTVIRDR pNtViRdr;
+    int rc = supHardNtViRdrCreate(hFile, pwszName, fFlags, &pNtViRdr);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Open the image.
+         */
+        RTLDRMOD hLdrMod;
+        RTLDRARCH enmArch = fFlags & SUPHNTVI_F_RC_IMAGE ? RTLDRARCH_X86_32 : RTLDRARCH_HOST;
+        if (fFlags & SUPHNTVI_F_RESOURCE_IMAGE)
+            enmArch = RTLDRARCH_WHATEVER;
+        rc = RTLdrOpenWithReader(&pNtViRdr->Core, RTLDR_O_FOR_VALIDATION, enmArch, &hLdrMod, pErrInfo);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Verify it.
+             *
+             * The PKCS #7 SignedData signature is checked in the callback. Any
+             * signing certificate restrictions are also enforced there.
+             *
+             * For the time being, we use the executable timestamp as the
+             * certificate validation date.  We must query that first to avoid
+             * potential issues re-entering the loader code from the callback.
+             *
+             * Update: Save the first timestamp we validate with build cert and
+             *         use this as a minimum timestamp for further build cert
+             *         validations.  This works around issues with old DLLs that
+             *         we sign against with our certificate (crt, sdl, qt).
+             */
+            rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &pNtViRdr->uTimestamp, sizeof(pNtViRdr->uTimestamp));
+            if (RT_SUCCESS(rc))
+            {
+#ifdef IN_RING3 /* Hack alert! (see above) */
+                if (   (fFlags & SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING)
+                    && (fFlags & SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT)
+                    && pNtViRdr->uTimestamp < g_uBuildTimestampHack)
+                    pNtViRdr->uTimestamp = g_uBuildTimestampHack;
+#endif
+
+                rc = RTLdrVerifySignature(hLdrMod, supHardNtViCallback, pNtViRdr, pErrInfo);
+
+#ifdef IN_RING3 /* Hack alert! (see above) */
+                if ((fFlags & SUPHNTVI_F_REQUIRE_BUILD_CERT) && g_uBuildTimestampHack == 0 && RT_SUCCESS(rc))
+                    g_uBuildTimestampHack = pNtViRdr->uTimestamp;
+#endif
+
+                /*
+                 * Microsoft doesn't sign a whole bunch of DLLs, so we have to
+                 * ASSUME that a bunch of system DLLs are fine.
+                 */
+                if (rc == VERR_LDRVI_NOT_SIGNED)
+                    rc = supHardNtViCheckIfNotSignedOk(hLdrMod, pwszName, fFlags, rc);
+                if (RT_FAILURE(rc))
+                    RTErrInfoAddF(pErrInfo, rc, ": %ls", pwszName);
+
+                /*
+                 * Check for the signature checking enforcement, if requested to do so.
+                 */
+                if (RT_SUCCESS(rc) && (fFlags & SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT))
+                {
+                    bool fEnforced = false;
+                    int rc2 = RTLdrQueryProp(hLdrMod, RTLDRPROP_SIGNATURE_CHECKS_ENFORCED, &fEnforced, sizeof(fEnforced));
+                    if (RT_FAILURE(rc2))
+                        rc = RTErrInfoSetF(pErrInfo, rc2, "Querying RTLDRPROP_SIGNATURE_CHECKS_ENFORCED failed on %ls: %Rrc.",
+                                           pwszName, rc2);
+                    else if (!fEnforced)
+                        rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED,
+                                           "The image '%ls' was not linked with /IntegrityCheck.", pwszName);
+                }
+            }
+            else
+                RTErrInfoSetF(pErrInfo, rc, "RTLdrQueryProp/RTLDRPROP_TIMESTAMP_SECONDS failed on %ls: %Rrc", pwszName, rc);
+
+             int rc2 = RTLdrClose(hLdrMod); AssertRC(rc2);
+
+#ifdef IN_RING3
+             /*
+              * Call the windows verify trust API if we've resolved it.
+              */
+             if (   g_pfnWinVerifyTrust
+                 && supR3HardNtViCanCallWinVerifyTrust(hFile, pwszName))
+             {
+                 if (pfCacheable)
+                     *pfCacheable = g_pfnWinVerifyTrust != NULL;
+                 if (rc != VERR_LDRVI_NOT_SIGNED)
+                 {
+                     if (rc == VINF_LDRVI_NOT_SIGNED)
+                     {
+                         if (fFlags & SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION)
+                         {
+                             int rc2 = supR3HardNtViCallWinVerifyTrustCatFile(hFile, pwszName, fFlags, pErrInfo,
+                                                                              g_pfnWinVerifyTrust);
+                             SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile -> %d (org %d)\n", rc2, rc));
+                             rc = rc2;
+                         }
+                         else
+                         {
+                             AssertFailed();
+                             rc = VERR_LDRVI_NOT_SIGNED;
+                         }
+                     }
+                     else if (RT_SUCCESS(rc))
+                         rc = supR3HardNtViCallWinVerifyTrust(hFile, pwszName, fFlags, pErrInfo, g_pfnWinVerifyTrust);
+                     else
+                     {
+                         int rc2 = supR3HardNtViCallWinVerifyTrust(hFile, pwszName, fFlags, pErrInfo, g_pfnWinVerifyTrust);
+                         AssertMsg(RT_FAILURE_NP(rc2),
+                                   ("rc=%Rrc, rc2=%Rrc %s", rc, rc2, pErrInfo ? pErrInfo->pszMsg : "<no-err-info>"));
+                     }
+                 }
+             }
+#else
+             if (pfCacheable)
+                 *pfCacheable = true;
+#endif /* IN_RING3 */
+        }
+        else
+            supHardNtViRdrDestroy(&pNtViRdr->Core);
+    }
+    SUP_DPRINTF(("supHardenedWinVerifyImageByHandle: -> %d (%ls)\n", rc, pwszName));
+    return rc;
+}
+
+
+#ifdef IN_RING3
+/**
+ * supHardenedWinVerifyImageByHandle version without the name.
+ *
+ * The name is derived from the handle.
+ *
+ * @returns IPRT status code.
+ * @param   hFile       File handle to the executable file.
+ * @param   fFlags      Flags, SUPHNTVI_F_XXX.
+ * @param   pErrInfo    Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyImageByHandleNoName(HANDLE hFile, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    /*
+     * Determine the NT name and call the verification function.
+     */
+    union
+    {
+        UNICODE_STRING UniStr;
+        uint8_t abBuffer[(MAX_PATH + 8 + 1) * 2];
+    } uBuf;
+
+    ULONG cbIgn;
+    NTSTATUS rcNt = NtQueryObject(hFile,
+                                  ObjectNameInformation,
+                                  &uBuf,
+                                  sizeof(uBuf) - sizeof(WCHAR),
+                                  &cbIgn);
+    if (NT_SUCCESS(rcNt))
+        uBuf.UniStr.Buffer[uBuf.UniStr.Length / sizeof(WCHAR)] = '\0';
+    else
+        uBuf.UniStr.Buffer = (WCHAR *)L"TODO3";
+
+    return supHardenedWinVerifyImageByHandle(hFile, uBuf.UniStr.Buffer, fFlags, NULL /*pfCacheable*/, pErrInfo);
+}
+#endif /* IN_RING3 */
+
+
+/**
+ * Retrieves the full official path to the system root or one of it's sub
+ * directories.
+ *
+ * This code is also used by the support driver.
+ *
+ * @returns VBox status code.
+ * @param   pvBuf               The output buffer.  This will contain a
+ *                              UNICODE_STRING followed (at the kernel's
+ *                              discretion) the string buffer.
+ * @param   cbBuf               The size of the buffer @a pvBuf points to.
+ * @param   enmDir              Which directory under the system root we're
+ *                              interested in.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardNtGetSystemRootDir(void *pvBuf, uint32_t cbBuf, SUPHARDNTSYSROOTDIR enmDir, PRTERRINFO pErrInfo)
+{
+    HANDLE              hFile = RTNT_INVALID_HANDLE_VALUE;
+    IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+    UNICODE_STRING      NtName;
+    switch (enmDir)
+    {
+        case kSupHardNtSysRootDir_System32:
+        {
+            static const WCHAR  s_wszNameSystem32[] = L"\\SystemRoot\\System32\\";
+            NtName.Buffer        = (PWSTR)s_wszNameSystem32;
+            NtName.Length        = sizeof(s_wszNameSystem32) - sizeof(WCHAR);
+            NtName.MaximumLength = sizeof(s_wszNameSystem32);
+            break;
+        }
+        case kSupHardNtSysRootDir_WinSxS:
+        {
+            static const WCHAR  s_wszNameWinSxS[] = L"\\SystemRoot\\WinSxS\\";
+            NtName.Buffer        = (PWSTR)s_wszNameWinSxS;
+            NtName.Length        = sizeof(s_wszNameWinSxS) - sizeof(WCHAR);
+            NtName.MaximumLength = sizeof(s_wszNameWinSxS);
+            break;
+        }
+        default:
+            AssertFailed();
+            return VERR_INVALID_PARAMETER;
+    }
+
+    OBJECT_ATTRIBUTES ObjAttr;
+    InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+    NTSTATUS rcNt = NtCreateFile(&hFile,
+                                 FILE_READ_DATA | SYNCHRONIZE,
+                                 &ObjAttr,
+                                 &Ios,
+                                 NULL /* Allocation Size*/,
+                                 FILE_ATTRIBUTE_NORMAL,
+                                 FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                 FILE_OPEN,
+                                 FILE_DIRECTORY_FILE | FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
+                                 NULL /*EaBuffer*/,
+                                 0 /*EaLength*/);
+    if (NT_SUCCESS(rcNt))
+        rcNt = Ios.Status;
+    if (NT_SUCCESS(rcNt))
+    {
+        ULONG cbIgn;
+        rcNt = NtQueryObject(hFile,
+                             ObjectNameInformation,
+                             pvBuf,
+                             cbBuf - sizeof(WCHAR),
+                             &cbIgn);
+        NtClose(hFile);
+        if (NT_SUCCESS(rcNt))
+        {
+            PUNICODE_STRING pUniStr = (PUNICODE_STRING)pvBuf;
+            if (pUniStr->Length > 0)
+            {
+                /* Make sure it's terminated so it can safely be printed.*/
+                pUniStr->Buffer[pUniStr->Length / sizeof(WCHAR)] = '\0';
+                return VINF_SUCCESS;
+            }
+
+            return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH,
+                                 "NtQueryObject returned an empty path for '%ls'", NtName.Buffer);
+        }
+        return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH, "NtQueryObject failed on '%ls' dir: %#x", NtName.Buffer, rcNt);
+    }
+    return RTErrInfoSetF(pErrInfo, VERR_SUP_VP_SYSTEM32_PATH, "Failure to open '%ls': %#x", NtName.Buffer, rcNt);
+}
+
+
+/**
+ * Initialize one certificate entry.
+ *
+ * @returns VBox status code.
+ * @param   pCert               The X.509 certificate representation to init.
+ * @param   pabCert             The raw DER encoded certificate.
+ * @param   cbCert              The size of the raw certificate.
+ * @param   pErrInfo            Where to return extended error info. Optional.
+ * @param   pszErrorTag         Error tag.
+ */
+static int supHardNtViCertInit(PRTCRX509CERTIFICATE pCert, unsigned char const *pabCert, unsigned cbCert,
+                               PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    AssertReturn(cbCert > 16 && cbCert < _128K,
+                 RTErrInfoSetF(pErrInfo, VERR_INTERNAL_ERROR_3, "%s: cbCert=%#x out of range", pszErrorTag, cbCert));
+    AssertReturn(!RTCrX509Certificate_IsPresent(pCert),
+                 RTErrInfoSetF(pErrInfo, VERR_WRONG_ORDER, "%s: Certificate already decoded?", pszErrorTag));
+
+    RTASN1CURSORPRIMARY PrimaryCursor;
+    RTAsn1CursorInitPrimary(&PrimaryCursor, pabCert, cbCert, pErrInfo, &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, NULL);
+    int rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, pCert, pszErrorTag);
+    if (RT_SUCCESS(rc))
+        rc = RTCrX509Certificate_CheckSanity(pCert, 0, pErrInfo, pszErrorTag);
+    return rc;
+}
+
+
+static int supHardNtViCertStoreAddArray(RTCRSTORE hStore, PCSUPTAENTRY paCerts, unsigned cCerts, PRTERRINFO pErrInfo)
+{
+    for (uint32_t i = 0; i < cCerts; i++)
+    {
+        int rc = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_TAF_DER, paCerts[i].pch, paCerts[i].cb, pErrInfo);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Initialize a certificate table.
+ *
+ * @param   phStore             Where to return the store pointer.
+ * @param   paCerts1            Pointer to the first certificate table.
+ * @param   cCerts1             Entries in the first certificate table.
+ * @param   paCerts2            Pointer to the second certificate table.
+ * @param   cCerts2             Entries in the second certificate table.
+ * @param   paCerts3            Pointer to the third certificate table.
+ * @param   cCerts3             Entries in the third certificate table.
+ * @param   pErrInfo            Where to return extended error info. Optional.
+ * @param   pszErrorTag         Error tag.
+ */
+static int supHardNtViCertStoreInit(PRTCRSTORE phStore,
+                                    PCSUPTAENTRY paCerts1, unsigned cCerts1,
+                                    PCSUPTAENTRY paCerts2, unsigned cCerts2,
+                                    PCSUPTAENTRY paCerts3, unsigned cCerts3,
+                                    PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    AssertReturn(*phStore == NIL_RTCRSTORE, VERR_WRONG_ORDER);
+
+    int rc = RTCrStoreCreateInMem(phStore, cCerts1 + cCerts2);
+    if (RT_FAILURE(rc))
+        return RTErrInfoSetF(pErrInfo, rc, "RTCrStoreCreateMemoryStore failed: %Rrc", rc);
+
+    rc = supHardNtViCertStoreAddArray(*phStore, paCerts1, cCerts1, pErrInfo);
+    if (RT_SUCCESS(rc))
+        rc = supHardNtViCertStoreAddArray(*phStore, paCerts2, cCerts2, pErrInfo);
+    if (RT_SUCCESS(rc))
+        rc = supHardNtViCertStoreAddArray(*phStore, paCerts3, cCerts3, pErrInfo);
+    return rc;
+}
+
+
+/**
+ * This initializes the certificates globals so we don't have to reparse them
+ * every time we need to verify an image.
+ *
+ * @returns IPRT status code.
+ * @param   pErrInfo            Where to return extended error info. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinInitImageVerifier(PRTERRINFO pErrInfo)
+{
+    AssertReturn(!RTCrX509Certificate_IsPresent(&g_BuildX509Cert), VERR_WRONG_ORDER);
+
+    /*
+     * Get the system root paths.
+     */
+    int rc = supHardNtGetSystemRootDir(&g_System32NtPath, sizeof(g_System32NtPath), kSupHardNtSysRootDir_System32, pErrInfo);
+    if (RT_SUCCESS(rc))
+        rc = supHardNtGetSystemRootDir(&g_WinSxSNtPath, sizeof(g_WinSxSNtPath), kSupHardNtSysRootDir_WinSxS, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Initialize it, leaving the cleanup to the termination call.
+         */
+        rc = supHardNtViCertInit(&g_BuildX509Cert, g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo, "BuildCertificate");
+        if (RT_SUCCESS(rc))
+            rc = supHardNtViCertStoreInit(&g_hSpcRootStore, g_aSUPSpcRootTAs, g_cSUPSpcRootTAs,
+                                          NULL, 0, NULL, 0, pErrInfo, "SpcRoot");
+        if (RT_SUCCESS(rc))
+            rc = supHardNtViCertStoreInit(&g_hNtKernelRootStore, g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,
+                                          NULL, 0, NULL, 0, pErrInfo, "NtKernelRoot");
+        if (RT_SUCCESS(rc))
+            rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelRootStore,
+                                          g_aSUPSpcRootTAs, g_cSUPSpcRootTAs,
+                                          g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,
+                                          g_aSUPTimestampTAs, g_cSUPTimestampTAs,
+                                          pErrInfo, "SpcAndNtKernelRoot");
+        if (RT_SUCCESS(rc))
+            rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelSuppStore,
+                                          NULL, 0, NULL, 0, NULL, 0,
+                                          pErrInfo, "SpcAndNtKernelSupplemental");
+
+#if 0 /* For the time being, always trust the build certificate. It bypasses the timestamp issues of CRT and SDL. */
+        /* If the build certificate is a test singing certificate, it must be a
+           trusted root or we'll fail to validate anything. */
+        if (   RT_SUCCESS(rc)
+            && RTCrX509Name_Compare(&g_BuildX509Cert.TbsCertificate.Subject, &g_BuildX509Cert.TbsCertificate.Issuer) == 0)
+#else
+        if (RT_SUCCESS(rc))
+#endif
+            rc = RTCrStoreCertAddEncoded(g_hSpcAndNtKernelRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+                                         g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo);
+
+        if (RT_SUCCESS(rc))
+            return VINF_SUCCESS;
+        supHardenedWinTermImageVerifier();
+    }
+    return rc;
+}
+
+
+/**
+ * Releases resources allocated by supHardenedWinInitImageVerifier.
+ */
+DECLHIDDEN(void) supHardenedWinTermImageVerifier(void)
+{
+    if (RTCrX509Certificate_IsPresent(&g_BuildX509Cert))
+        RTAsn1VtDelete(&g_BuildX509Cert.SeqCore.Asn1Core);
+
+    RTCrStoreRelease(g_hSpcAndNtKernelSuppStore);
+    g_hSpcAndNtKernelSuppStore = NIL_RTCRSTORE;
+    RTCrStoreRelease(g_hSpcAndNtKernelRootStore);
+    g_hSpcAndNtKernelRootStore = NIL_RTCRSTORE;
+
+    RTCrStoreRelease(g_hNtKernelRootStore);
+    g_hNtKernelRootStore = NIL_RTCRSTORE;
+    RTCrStoreRelease(g_hSpcRootStore);
+    g_hSpcRootStore = NIL_RTCRSTORE;
+}
+
+#ifdef IN_RING3
+
+/**
+ * This is a hardcoded list of certificates we thing we might need.
+ *
+ * @returns true if wanted, false if not.
+ * @param   pCert               The certificate.
+ */
+static bool supR3HardenedWinIsDesiredRootCA(PCRTCRX509CERTIFICATE pCert)
+{
+    /*
+     * Check that it's a plausible root certificate.
+     */
+    if (!RTCrX509Certificate_IsSelfSigned(pCert))
+        return false;
+    if (RTAsn1Integer_UnsignedCompareWithU32(&pCert->TbsCertificate.T0.Version, 3) > 0)
+    {
+        if (   !(pCert->TbsCertificate.T3.fExtKeyUsage & RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN)
+            && (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE) )
+            return false;
+        if (   pCert->TbsCertificate.T3.pBasicConstraints
+            && !pCert->TbsCertificate.T3.pBasicConstraints->CA.fValue)
+            return false;
+    }
+    if (pCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey.cBits < 256) /* mostly for u64KeyId reading. */
+        return false;
+
+    /*
+     * Array of names and key clues of the certificates we want.
+     */
+    static struct
+    {
+        uint64_t    u64KeyId;
+        const char *pszName;
+    } const s_aWanted[] =
+    {
+        /* SPC */
+        { UINT64_C(0xffffffffffffffff), "C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority" },
+        { UINT64_C(0xffffffffffffffff), "L=Internet, O=VeriSign, Inc., OU=VeriSign Commercial Software Publishers CA" },
+        { UINT64_C(0x491857ead79dde00), "C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority" },
+
+        /* TS */
+        { UINT64_C(0xffffffffffffffff), "O=Microsoft Trust Network, OU=Microsoft Corporation, OU=Microsoft Time Stamping Service Root, OU=Copyright (c) 1997 Microsoft Corp." },
+        { UINT64_C(0xffffffffffffffff), "O=VeriSign Trust Network, OU=VeriSign, Inc., OU=VeriSign Time Stamping Service Root, OU=NO LIABILITY ACCEPTED, (c)97 VeriSign, Inc." },
+        { UINT64_C(0xffffffffffffffff), "C=ZA, ST=Western Cape, L=Durbanville, O=Thawte, OU=Thawte Certification, CN=Thawte Timestamping CA" },
+
+        /* Additional Windows 8.1 list: */
+        { UINT64_C(0x5ad46780fa5df300), "DC=com, DC=microsoft, CN=Microsoft Root Certificate Authority" },
+        { UINT64_C(0x3be670c1bd02a900), "OU=Copyright (c) 1997 Microsoft Corp., OU=Microsoft Corporation, CN=Microsoft Root Authority" },
+        { UINT64_C(0x4d3835aa4180b200), "C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Root Certificate Authority 2011" },
+        { UINT64_C(0x646e3fe3ba08df00), "C=US, O=MSFT, CN=Microsoft Authenticode(tm) Root Authority" },
+        { UINT64_C(0xece4e4289e08b900), "C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Root Certificate Authority 2010" },
+        { UINT64_C(0x59faf1086271bf00), "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2" },
+        { UINT64_C(0x3d98ab22bb04a300), "C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root" },
+        { UINT64_C(0x91e3728b8b40d000), "C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO Certification Authority" },
+        { UINT64_C(0x61a3a33f81aace00), "C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN-USERFirst-Object" },
+        { UINT64_C(0x9e5bc2d78b6a3636), "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA, Email=premium-server at thawte.com" },
+        { UINT64_C(0xf4fd306318ccda00), "C=US, O=GeoTrust Inc., CN=GeoTrust Global CA" },
+        { UINT64_C(0xa0ee62086758b15d), "C=US, O=Equifax, OU=Equifax Secure Certificate Authority" },
+        { UINT64_C(0x8ff6fc03c1edbd00), "C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2" },
+        { UINT64_C(0xa3ce8d99e60eda00), "C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA" },
+        { UINT64_C(0xa671e9fec832b700), "C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority" },
+        { UINT64_C(0xa8de7211e13be200), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA" },
+        { UINT64_C(0x0ff3891b54348328), "C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.netSecure Server Certification Authority" },
+        { UINT64_C(0x7ae89c50f0b6a00f), "C=US, O=GTE Corporation, OU=GTE CyberTrust Solutions, Inc., CN=GTE CyberTrust Global Root" },
+        { UINT64_C(0xd45980fbf0a0ac00), "C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA" },
+        { UINT64_C(0x9e5bc2d78b6a3636), "C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA, Email=premium-server at thawte.com" },
+        { UINT64_C(0x7c4fd32ec1b1ce00), "C=PL, O=Unizeto Sp. z o.o., CN=Certum CA" },
+        { UINT64_C(0xd4fbe673e5ccc600), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA" },
+        { UINT64_C(0x16e64d2a56ccf200), "C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., OU=http://certificates.starfieldtech.com/repository/, CN=Starfield Services Root Certificate Authority" },
+        { UINT64_C(0x6e2ba21058eedf00), "C=US, ST=UT, L=Salt Lake City, O=The USERTRUST Network, OU=http://www.usertrust.com, CN=UTN - DATACorp SGC" },
+        { UINT64_C(0xb28612a94b4dad00), "O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.netCertification Authority (2048)" },
+        { UINT64_C(0x357a29080824af00), "C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class3 Public Primary Certification Authority - G5" },
+        { UINT64_C(0x466cbc09db88c100), "C=IL, O=StartCom Ltd., OU=Secure Digital Certificate Signing, CN=StartCom Certification Authority" },
+        { UINT64_C(0x9259c8abe5ca713a), "L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com/, Email=info at valicert.com" },
+        { UINT64_C(0x1f78fc529cbacb00), "C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 1999 VeriSign, Inc. - For authorized use only, CN=VeriSign Class3 Public Primary Certification Authority - G3" },
+        { UINT64_C(0x8043e4ce150ead00), "C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA" },
+        { UINT64_C(0x00f2e6331af7b700), "C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root" },
+    };
+
+
+    uint64_t const u64KeyId = pCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey.uBits.pu64[1];
+    uint32_t i = RT_ELEMENTS(s_aWanted);
+    while (i-- > 0)
+        if (   s_aWanted[i].u64KeyId == u64KeyId
+            || s_aWanted[i].u64KeyId == UINT64_MAX)
+            if (RTCrX509Name_MatchWithString(&pCert->TbsCertificate.Subject, s_aWanted[i].pszName))
+                return true;
+
+#ifdef DEBUG_bird
+    char szTmp[512];
+    szTmp[sizeof(szTmp) - 1] = '\0';
+    RTCrX509Name_FormatAsString(&pCert->TbsCertificate.Issuer, szTmp, sizeof(szTmp) - 1, NULL);
+    SUP_DPRINTF(("supR3HardenedWinIsDesiredRootCA: %#llx %s\n", u64KeyId, szTmp));
+#endif
+    return false;
+}
+
+/**
+ * Called by supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation to
+ * import selected root CAs from the system certificate store.
+ *
+ * These certificates permits us to correctly validate third party DLLs.
+ *
+ * @param   fLoadLibraryFlags       The LoadLibraryExW flags that the caller
+ *                                  found to work.  Avoids us having to retry on
+ *                                  ERROR_INVALID_PARAMETER.
+ */
+static void supR3HardenedWinRetrieveTrustedRootCAs(DWORD fLoadLibraryFlags)
+{
+    uint32_t cAdded = 0;
+
+    /*
+     * Load crypt32.dll and resolve the APIs we need.
+     */
+    HMODULE hCrypt32 = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\crypt32.dll", NULL, fLoadLibraryFlags);
+    if (!hCrypt32)
+        supR3HardenedFatal("Error loading 'crypt32.dll': %u", GetLastError());
+
+#define RESOLVE_CRYPT32_API(a_Name, a_pfnType) \
+    a_pfnType pfn##a_Name = (a_pfnType)GetProcAddress(hCrypt32, #a_Name); \
+    if (pfn##a_Name == NULL) supR3HardenedFatal("Error locating '" #a_Name "' in 'crypt32.dll': %u", GetLastError())
+    RESOLVE_CRYPT32_API(CertOpenStore, PFNCERTOPENSTORE);
+    RESOLVE_CRYPT32_API(CertCloseStore, PFNCERTCLOSESTORE);
+    RESOLVE_CRYPT32_API(CertEnumCertificatesInStore, PFNCERTENUMCERTIFICATESINSTORE);
+#undef RESOLVE_CRYPT32_API
+
+    /*
+     * Open the root store and look for the certificates we wish to use.
+     */
+    DWORD fOpenStore = CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG;
+    HCERTSTORE hStore = pfnCertOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
+                                         NULL /* hCryptProv = default */, CERT_SYSTEM_STORE_LOCAL_MACHINE | fOpenStore, L"Root");
+    if (!hStore)
+        hStore = pfnCertOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
+                                  NULL /* hCryptProv = default */, CERT_SYSTEM_STORE_CURRENT_USER | fOpenStore, L"Root");
+    if (hStore)
+    {
+        PCCERT_CONTEXT pCurCtx  = NULL;
+        while ((pCurCtx = pfnCertEnumCertificatesInStore(hStore, pCurCtx)) != NULL)
+        {
+            if (pCurCtx->dwCertEncodingType & X509_ASN_ENCODING)
+            {
+                RTASN1CURSORPRIMARY PrimaryCursor;
+                RTAsn1CursorInitPrimary(&PrimaryCursor, pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/,
+                                        &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "CurCtx");
+                RTCRX509CERTIFICATE MyCert;
+                int rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &MyCert, "Cert");
+                AssertRC(rc);
+                if (RT_SUCCESS(rc))
+                {
+                    if (supR3HardenedWinIsDesiredRootCA(&MyCert))
+                    {
+                        rc = RTCrStoreCertAddEncoded(g_hSpcRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+                                                     pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/);
+                        AssertRC(rc);
+
+                        rc = RTCrStoreCertAddEncoded(g_hSpcAndNtKernelRootStore, RTCRCERTCTX_F_ENC_X509_DER,
+                                                     pCurCtx->pbCertEncoded, pCurCtx->cbCertEncoded, NULL /*pErrInfo*/);
+                        AssertRC(rc);
+                        cAdded++;
+                    }
+
+                    RTCrX509Certificate_Delete(&MyCert);
+                }
+            }
+        }
+        pfnCertCloseStore(hStore, CERT_CLOSE_STORE_CHECK_FLAG);
+        g_fHaveOtherRoots = true;
+    }
+    SUP_DPRINTF(("supR3HardenedWinRetrieveTrustedRootCAs: cAdded=%u\n", cAdded));
+}
+
+
+/**
+ * Resolves the WinVerifyTrust API after the process has been verified and
+ * installs a thread creation hook.
+ *
+ * The WinVerifyTrust API is used in addition our own Authenticode verification
+ * code.  If the image has the IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY flag
+ * set, it will be checked again by the kernel.  All our image has this flag set
+ * and we require all VBox extensions to have it set as well.  In effect, the
+ * authenticode signature will be checked two or three times.
+ */
+DECLHIDDEN(void) supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation(void)
+{
+# ifdef IN_SUP_HARDENED_R3
+    /*
+     * Load our the support library DLL that does the thread hooking as the
+     * security API may trigger the creation of COM worker threads (or
+     * whatever they are).
+     *
+     * The thread creation hook makes the threads very slippery to debuggers by
+     * irreversably disabling most (if not all) debug events for them.
+     */
+    char szPath[RTPATH_MAX];
+    supR3HardenedPathSharedLibs(szPath, sizeof(szPath) - sizeof("/VBoxSupLib.DLL"));
+    suplibHardenedStrCat(szPath, "/VBoxSupLib.DLL");
+    HMODULE hSupLibMod = (HMODULE)supR3HardenedWinLoadLibrary(szPath, true /*fSystem32Only*/);
+    if (hSupLibMod == NULL)
+        supR3HardenedFatal("Error loading '%s': %u", szPath, GetLastError());
+# endif
+
+    /*
+     * Resolve it.
+     */
+    DWORD fFlags = 0;
+    if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+       fFlags = LOAD_LIBRARY_SEARCH_SYSTEM32;
+    HMODULE hWintrust = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\Wintrust.dll", NULL, fFlags);
+    if (   hWintrust == NULL
+        && fFlags
+        && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+        && GetLastError() == ERROR_INVALID_PARAMETER)
+    {
+        fFlags = 0;
+        hWintrust = LoadLibraryExW(L"\\\\.\\GLOBALROOT\\SystemRoot\\System32\\Wintrust.dll", NULL, fFlags);
+    }
+    if (hWintrust == NULL)
+        supR3HardenedFatal("Error loading 'Wintrust.dll': %u", GetLastError());
+
+#define RESOLVE_CRYPT_API(a_Name, a_pfnType, a_uMinWinVer) \
+    do { \
+        g_pfn##a_Name = (a_pfnType)GetProcAddress(hWintrust, #a_Name); \
+        if (g_pfn##a_Name == NULL && (a_uMinWinVer) < g_uNtVerCombined) \
+            supR3HardenedFatal("Error locating '" #a_Name "' in 'Wintrust.dll': %u", GetLastError()); \
+    } while (0)
+
+    PFNWINVERIFYTRUST pfnWinVerifyTrust = (PFNWINVERIFYTRUST)GetProcAddress(hWintrust, "WinVerifyTrust");
+    if (!pfnWinVerifyTrust)
+        supR3HardenedFatal("Error locating 'WinVerifyTrust' in 'Wintrust.dll': %u", GetLastError());
+
+    RESOLVE_CRYPT_API(CryptCATAdminAcquireContext,           PFNCRYPTCATADMINACQUIRECONTEXT,          0);
+    RESOLVE_CRYPT_API(CryptCATAdminCalcHashFromFileHandle,   PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE,  0);
+    RESOLVE_CRYPT_API(CryptCATAdminEnumCatalogFromHash,      PFNCRYPTCATADMINENUMCATALOGFROMHASH,     0);
+    RESOLVE_CRYPT_API(CryptCATAdminReleaseCatalogContext,    PFNCRYPTCATADMINRELEASECATALOGCONTEXT,   0);
+    RESOLVE_CRYPT_API(CryptCATAdminReleaseContext,           PFNCRYPTCATDADMINRELEASECONTEXT,         0);
+    RESOLVE_CRYPT_API(CryptCATCatalogInfoFromContext,        PFNCRYPTCATCATALOGINFOFROMCONTEXT,       0);
+
+    RESOLVE_CRYPT_API(CryptCATAdminAcquireContext2,          PFNCRYPTCATADMINACQUIRECONTEXT2,         SUP_NT_VER_W80);
+    RESOLVE_CRYPT_API(CryptCATAdminCalcHashFromFileHandle2,  PFNCRYPTCATADMINCALCHASHFROMFILEHANDLE2, SUP_NT_VER_W80);
+
+    /*
+     * Call it on ourselves and ntdll to make sure it loads all the providers
+     * now, we would otherwise geting into recursive trouble in the
+     * NtCreateSection hook.
+     */
+# ifdef IN_SUP_HARDENED_R3
+    RTERRINFOSTATIC ErrInfoStatic;
+    RTErrInfoInitStatic(&ErrInfoStatic);
+    int rc = supR3HardNtViCallWinVerifyTrust(NULL, g_SupLibHardenedExeNtPath.UniStr.Buffer, 0,
+                                             &ErrInfoStatic.Core, pfnWinVerifyTrust);
+    if (RT_FAILURE(rc))
+        supR3HardenedFatal("WinVerifyTrust failed on stub executable: %s", ErrInfoStatic.szMsg);
+# endif
+
+    if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* ntdll isn't signed on XP, assuming this is the case on W2K3 for now. */
+        supR3HardNtViCallWinVerifyTrust(NULL, L"\\SystemRoot\\System32\\ntdll.dll", 0, NULL, pfnWinVerifyTrust);
+    supR3HardNtViCallWinVerifyTrustCatFile(NULL, L"\\SystemRoot\\System32\\ntdll.dll", 0, NULL, pfnWinVerifyTrust);
+
+    g_pfnWinVerifyTrust = pfnWinVerifyTrust;
+
+    /*
+     * Now, get trusted root CAs so we can verify a broader scope of signatures.
+     */
+    supR3HardenedWinRetrieveTrustedRootCAs(fFlags);
+}
+
+
+static int supR3HardNtViNtToWinPath(PCRTUTF16 pwszNtName, PCRTUTF16 *ppwszWinPath,
+                                    PRTUTF16 pwszWinPathBuf, size_t cwcWinPathBuf)
+{
+    static const RTUTF16 s_wszPrefix[] = L"\\\\.\\GLOBALROOT";
+
+    if (*pwszNtName != '\\' && *pwszNtName != '/')
+        return VERR_PATH_DOES_NOT_START_WITH_ROOT;
+
+    size_t cwcNtName = RTUtf16Len(pwszNtName);
+    if (RT_ELEMENTS(s_wszPrefix) + cwcNtName > cwcWinPathBuf)
+        return VERR_FILENAME_TOO_LONG;
+
+    memcpy(pwszWinPathBuf, s_wszPrefix, sizeof(s_wszPrefix));
+    memcpy(&pwszWinPathBuf[sizeof(s_wszPrefix) / sizeof(RTUTF16) - 1], pwszNtName, (cwcNtName + 1) * sizeof(RTUTF16));
+    *ppwszWinPath = pwszWinPathBuf;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Calls WinVerifyTrust to verify an PE image.
+ *
+ * @returns VBox status code.
+ * @param   hFile               File handle to the executable file.
+ * @param   pwszName            Full NT path to the DLL in question, used for
+ *                              dealing with unsigned system dlls as well as for
+ *                              error/logging.
+ * @param   fFlags              Flags, SUPHNTVI_F_XXX.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ * @param   pfnWinVerifyTrust   Pointer to the API.
+ */
+static int supR3HardNtViCallWinVerifyTrust(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+                                           PFNWINVERIFYTRUST pfnWinVerifyTrust)
+{
+    /*
+     * Convert the name into a Windows name.
+     */
+    RTUTF16 wszWinPathBuf[MAX_PATH];
+    PCRTUTF16 pwszWinPath;
+    int rc = supR3HardNtViNtToWinPath(pwszName, &pwszWinPath, wszWinPathBuf, RT_ELEMENTS(wszWinPathBuf));
+    if (RT_FAILURE(rc))
+        return RTErrInfoSetF(pErrInfo, rc, "Bad path passed to supR3HardNtViCallWinVerifyTrust: rc=%Rrc '%ls'", rc, pwszName);
+
+    /*
+     * Construct input parameters and call the API.
+     */
+    WINTRUST_FILE_INFO FileInfo;
+    RT_ZERO(FileInfo);
+    FileInfo.cbStruct = sizeof(FileInfo);
+    FileInfo.pcwszFilePath = pwszWinPath;
+    FileInfo.hFile = hFile;
+
+    GUID PolicyActionGuid = WINTRUST_ACTION_GENERIC_VERIFY_V2;
+
+    WINTRUST_DATA TrustData;
+    RT_ZERO(TrustData);
+    TrustData.cbStruct = sizeof(TrustData);
+    TrustData.fdwRevocationChecks = WTD_REVOKE_NONE;  /* Keep simple for now. */
+    TrustData.dwStateAction = WTD_STATEACTION_VERIFY;
+    TrustData.dwUIChoice = WTD_UI_NONE;
+    TrustData.dwProvFlags = 0;
+    if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+        TrustData.dwProvFlags = WTD_CACHE_ONLY_URL_RETRIEVAL;
+    else
+        TrustData.dwProvFlags = WTD_REVOCATION_CHECK_NONE;
+    TrustData.dwUnionChoice = WTD_CHOICE_FILE;
+    TrustData.pFile = &FileInfo;
+
+    HRESULT hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &PolicyActionGuid, &TrustData);
+    if (hrc == S_OK)
+        rc = VINF_SUCCESS;
+    else
+    {
+        /*
+         * Failed. Format a nice error message.
+         */
+# ifdef DEBUG_bird
+        __debugbreak();
+# endif
+        const char *pszErrConst = NULL;
+        switch (hrc)
+        {
+            case TRUST_E_SYSTEM_ERROR:             pszErrConst = "TRUST_E_SYSTEM_ERROR";          break;
+            case TRUST_E_NO_SIGNER_CERT:           pszErrConst = "TRUST_E_NO_SIGNER_CERT";        break;
+            case TRUST_E_COUNTER_SIGNER:           pszErrConst = "TRUST_E_COUNTER_SIGNER";        break;
+            case TRUST_E_CERT_SIGNATURE:           pszErrConst = "TRUST_E_CERT_SIGNATURE";        break;
+            case TRUST_E_TIME_STAMP:               pszErrConst = "TRUST_E_TIME_STAMP";            break;
+            case TRUST_E_BAD_DIGEST:               pszErrConst = "TRUST_E_BAD_DIGEST";            break;
+            case TRUST_E_BASIC_CONSTRAINTS:        pszErrConst = "TRUST_E_BASIC_CONSTRAINTS";     break;
+            case TRUST_E_FINANCIAL_CRITERIA:       pszErrConst = "TRUST_E_FINANCIAL_CRITERIA";    break;
+            case TRUST_E_PROVIDER_UNKNOWN:         pszErrConst = "TRUST_E_PROVIDER_UNKNOWN";      break;
+            case TRUST_E_ACTION_UNKNOWN:           pszErrConst = "TRUST_E_ACTION_UNKNOWN";        break;
+            case TRUST_E_SUBJECT_FORM_UNKNOWN:     pszErrConst = "TRUST_E_SUBJECT_FORM_UNKNOWN";  break;
+            case TRUST_E_SUBJECT_NOT_TRUSTED:      pszErrConst = "TRUST_E_SUBJECT_NOT_TRUSTED";   break;
+            case TRUST_E_NOSIGNATURE:              pszErrConst = "TRUST_E_NOSIGNATURE";           break;
+            case TRUST_E_FAIL:                     pszErrConst = "TRUST_E_FAIL";                  break;
+            case TRUST_E_EXPLICIT_DISTRUST:        pszErrConst = "TRUST_E_EXPLICIT_DISTRUST";     break;
+        }
+        if (pszErrConst)
+            rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_UNSUPPORTED_ARCH,
+                               "WinVerifyTrust failed with hrc=%s on '%ls'", pszErrConst, pwszName);
+        else
+            rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_UNSUPPORTED_ARCH,
+                               "WinVerifyTrust failed with hrc=%Rhrc on '%ls'", hrc, pwszName);
+    }
+
+    /* clean up state data. */
+    TrustData.dwStateAction = WTD_STATEACTION_CLOSE;
+    FileInfo.hFile = NULL;
+    hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &PolicyActionGuid, &TrustData);
+
+    return rc;
+}
+
+
+/**
+ * Calls WinVerifyTrust to verify an PE image via catalog files.
+ *
+ * @returns VBox status code.
+ * @param   hFile               File handle to the executable file.
+ * @param   pwszName            Full NT path to the DLL in question, used for
+ *                              dealing with unsigned system dlls as well as for
+ *                              error/logging.
+ * @param   fFlags              Flags, SUPHNTVI_F_XXX.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ * @param   pfnWinVerifyTrust   Pointer to the API.
+ */
+static int supR3HardNtViCallWinVerifyTrustCatFile(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PRTERRINFO pErrInfo,
+                                                  PFNWINVERIFYTRUST pfnWinVerifyTrust)
+{
+    SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: hFile=%p pwszName=%ls\n", hFile, pwszName));
+
+    /*
+     * Convert the name into a Windows name.
+     */
+    RTUTF16 wszWinPathBuf[MAX_PATH];
+    PCRTUTF16 pwszWinPath;
+    int rc = supR3HardNtViNtToWinPath(pwszName, &pwszWinPath, wszWinPathBuf, RT_ELEMENTS(wszWinPathBuf));
+    if (RT_FAILURE(rc))
+        return RTErrInfoSetF(pErrInfo, rc, "Bad path passed to supR3HardNtViCallWinVerifyTrustCatFile: rc=%Rrc '%ls'", rc, pwszName);
+
+    /*
+     * Open the file if we didn't get a handle.
+     */
+    HANDLE hFileClose = NULL;
+    if (hFile == RTNT_INVALID_HANDLE_VALUE || hFile == NULL)
+    {
+        hFile = RTNT_INVALID_HANDLE_VALUE;
+        IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+        UNICODE_STRING      NtName;
+        NtName.Buffer = (PWSTR)pwszName;
+        NtName.Length = (USHORT)(RTUtf16Len(pwszName) * sizeof(WCHAR));
+        NtName.MaximumLength = NtName.Length + sizeof(WCHAR);
+
+        OBJECT_ATTRIBUTES ObjAttr;
+        InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+        NTSTATUS rcNt = NtCreateFile(&hFile,
+                                     FILE_READ_DATA | SYNCHRONIZE,
+                                     &ObjAttr,
+                                     &Ios,
+                                     NULL /* Allocation Size*/,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     FILE_SHARE_READ,
+                                     FILE_OPEN,
+                                     FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
+                                     NULL /*EaBuffer*/,
+                                     0 /*EaLength*/);
+        if (NT_SUCCESS(rcNt))
+            rcNt = Ios.Status;
+        if (!NT_SUCCESS(rcNt))
+            return RTErrInfoSetF(pErrInfo, RTErrConvertFromNtStatus(rcNt),
+                                 "NtCreateFile returned %#x opening '%ls'.", rcNt, pwszName);
+        hFileClose = hFile;
+    }
+
+    /*
+     * On Windows 8.0 and later there are more than one digest choice.
+     */
+    rc = VERR_LDRVI_NOT_SIGNED;
+    static struct
+    {
+        /** The digest algorithm name. */
+        const WCHAR        *pszAlgorithm;
+        /** Cached catalog admin handle. */
+        HCATADMIN volatile  hCachedCatAdmin;
+    } s_aHashes[] =
+    {
+        { NULL,      NULL },
+        { L"SHA256", NULL },
+    };
+    for (uint32_t i = 0; i < RT_ELEMENTS(s_aHashes); i++)
+    {
+        /*
+         * Another loop for dealing with different trust provider policies
+         * required for successfully validating different catalog signatures.
+         */
+        bool                fTryNextPolicy;
+        uint32_t            iPolicy = 0;
+        static const GUID   s_aPolicies[] =
+        {
+            DRIVER_ACTION_VERIFY,              /* Works with microsoft bits. Most frequently used, thus first. */
+            WINTRUST_ACTION_GENERIC_VERIFY_V2, /* Works with ATI and other SPC kernel-code signed stuff. */
+        };
+        do
+        {
+            /*
+             * Create a context.
+             */
+            fTryNextPolicy = false;
+            BOOL fRc;
+            HCATADMIN hCatAdmin = ASMAtomicXchgPtr(&s_aHashes[i].hCachedCatAdmin, NULL);
+            if (hCatAdmin)
+                fRc = TRUE;
+            else if (g_pfnCryptCATAdminAcquireContext2)
+                fRc = g_pfnCryptCATAdminAcquireContext2(&hCatAdmin, &s_aPolicies[iPolicy], s_aHashes[i].pszAlgorithm,
+                                                        NULL /*pStrongHashPolicy*/, 0 /*dwFlags*/);
+            else
+                fRc = g_pfnCryptCATAdminAcquireContext(&hCatAdmin, &s_aPolicies[iPolicy], 0 /*dwFlags*/);
+            if (fRc)
+            {
+                SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: hCatAdmin=%p\n", hCatAdmin));
+
+                /*
+                 * Hash the file.
+                 */
+                BYTE  abHash[SUPHARDNTVI_MAX_CAT_HASH_SIZE];
+                DWORD cbHash = sizeof(abHash);
+                if (g_pfnCryptCATAdminCalcHashFromFileHandle2)
+                    fRc = g_pfnCryptCATAdminCalcHashFromFileHandle2(hCatAdmin, hFile, &cbHash, abHash, 0 /*dwFlags*/);
+                else
+                    fRc = g_pfnCryptCATAdminCalcHashFromFileHandle(hFile, &cbHash, abHash, 0 /*dwFlags*/);
+                if (fRc)
+                {
+                    /* Produce a string version of it that we can pass to WinVerifyTrust. */
+                    RTUTF16 wszDigest[SUPHARDNTVI_MAX_CAT_HASH_SIZE * 2 + 1];
+                    int rc2 = RTUtf16PrintHexBytes(wszDigest, RT_ELEMENTS(wszDigest), abHash, cbHash, RTSTRPRINTHEXBYTES_F_UPPER);
+                    if (RT_SUCCESS(rc2))
+                    {
+                        SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: cbHash=%u wszDigest=%ls\n", cbHash, wszDigest));
+
+                        /*
+                         * Enumerate catalog information that matches the hash.
+                         */
+                        uint32_t iCat = 0;
+                        HCATINFO hCatInfoPrev = NULL;
+                        do
+                        {
+                            /* Get the next match. */
+                            HCATINFO hCatInfo = g_pfnCryptCATAdminEnumCatalogFromHash(hCatAdmin, abHash, cbHash, 0, &hCatInfoPrev);
+                            if (!hCatInfo)
+                            {
+                                if (iCat == 0)
+                                    SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: CryptCATAdminEnumCatalogFromHash failed %u\n", GetLastError()));
+                                break;
+                            }
+                            Assert(hCatInfoPrev == NULL);
+                            hCatInfoPrev = hCatInfo;
+
+                            /*
+                             * Call WinVerifyTrust.
+                             */
+                            CATALOG_INFO CatInfo;
+                            CatInfo.cbStruct = sizeof(CatInfo);
+                            CatInfo.wszCatalogFile[0] = '\0';
+                            if (g_pfnCryptCATCatalogInfoFromContext(hCatInfo, &CatInfo, 0 /*dwFlags*/))
+                            {
+                                WINTRUST_CATALOG_INFO WtCatInfo;
+                                RT_ZERO(WtCatInfo);
+                                WtCatInfo.cbStruct              = sizeof(WtCatInfo);
+                                WtCatInfo.dwCatalogVersion      = 0;
+                                WtCatInfo.pcwszCatalogFilePath  = CatInfo.wszCatalogFile;
+                                WtCatInfo.pcwszMemberTag        = wszDigest;
+                                WtCatInfo.pcwszMemberFilePath   = pwszWinPath;
+                                WtCatInfo.pbCalculatedFileHash  = abHash;
+                                WtCatInfo.cbCalculatedFileHash  = cbHash;
+                                WtCatInfo.pcCatalogContext      = NULL;
+
+                                WINTRUST_DATA TrustData;
+                                RT_ZERO(TrustData);
+                                TrustData.cbStruct              = sizeof(TrustData);
+                                TrustData.fdwRevocationChecks   = WTD_REVOKE_NONE;  /* Keep simple for now. */
+                                TrustData.dwStateAction         = WTD_STATEACTION_VERIFY;
+                                TrustData.dwUIChoice            = WTD_UI_NONE;
+                                TrustData.dwProvFlags           = 0;
+                                if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+                                    TrustData.dwProvFlags       = WTD_CACHE_ONLY_URL_RETRIEVAL;
+                                else
+                                    TrustData.dwProvFlags       = WTD_REVOCATION_CHECK_NONE;
+                                TrustData.dwUnionChoice         = WTD_CHOICE_CATALOG;
+                                TrustData.pCatalog              = &WtCatInfo;
+
+                                HRESULT hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &s_aPolicies[iPolicy], &TrustData);
+                                SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: WinVerifyTrust => %#x; cat=%ls\n", hrc, CatInfo.wszCatalogFile));
+
+                                if (SUCCEEDED(hrc))
+                                    rc = VINF_SUCCESS;
+                                else if (hrc == TRUST_E_NOSIGNATURE)
+                                { /* ignore because it's useless. */ }
+                                else if (hrc == ERROR_INVALID_PARAMETER)
+                                { /* This is returned if the given file isn't found in the catalog, it seems. */ }
+                                else
+                                {
+                                    rc = RTErrInfoSetF(pErrInfo, VERR_SUP_VP_WINTRUST_CAT_FAILURE,
+                                                       "WinVerifyTrust failed with hrc=%#x on '%ls' and .cat-file='%ls'.",
+                                                       hrc, pwszWinPath, CatInfo.wszCatalogFile);
+                                    fTryNextPolicy = (hrc == CERT_E_UNTRUSTEDROOT);
+                                }
+
+                                /* clean up state data. */
+                                TrustData.dwStateAction = WTD_STATEACTION_CLOSE;
+                                hrc = pfnWinVerifyTrust(NULL /*hwnd*/, &s_aPolicies[iPolicy], &TrustData);
+                                Assert(SUCCEEDED(hrc));
+                            }
+                            else
+                            {
+                                rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+                                                   "CryptCATCatalogInfoFromContext failed: %d [file=%s]",
+                                                   GetLastError(), pwszName);
+                                SUP_DPRINTF(("supR3HardNtViCallWinVerifyTrustCatFile: CryptCATCatalogInfoFromContext failed\n"));
+                            }
+                            iCat++;
+                        } while (rc == VERR_LDRVI_NOT_SIGNED && iCat < 128);
+
+                        if (hCatInfoPrev != NULL)
+                            if (!g_pfnCryptCATAdminReleaseCatalogContext(hCatAdmin, hCatInfoPrev, 0 /*dwFlags*/))
+                                AssertFailed();
+                    }
+                    else
+                        rc = RTErrInfoSetF(pErrInfo, rc2, "RTUtf16PrintHexBytes failed: %Rrc", rc);
+                }
+                else
+                    rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+                                       "CryptCATAdminCalcHashFromFileHandle[2] failed: %d [file=%s]", GetLastError(), pwszName);
+
+                if (!ASMAtomicCmpXchgPtr(&s_aHashes[i].hCachedCatAdmin, hCatAdmin, NULL))
+                    if (!g_pfnCryptCATAdminReleaseContext(hCatAdmin, 0 /*dwFlags*/))
+                        AssertFailed();
+            }
+            else
+                rc = RTErrInfoSetF(pErrInfo, RTErrConvertFromWin32(GetLastError()),
+                                   "CryptCATAdminAcquireContext[2] failed: %d [file=%s]", GetLastError(), pwszName);
+             iPolicy++;
+        } while (   fTryNextPolicy
+                 && iPolicy < RT_ELEMENTS(s_aPolicies));
+
+        /*
+         * Only repeat if we've got g_pfnCryptCATAdminAcquireContext2 and can specify the hash algorithm.
+         */
+        if (!g_pfnCryptCATAdminAcquireContext2)
+            break;
+        if (rc != VERR_LDRVI_NOT_SIGNED)
+            break;
+    }
+
+    if (hFileClose != NULL)
+        NtClose(hFileClose);
+
+    return rc;
+}
+
+
+/**
+ * Initializes g_uNtVerCombined and g_NtVerInfo.
+ * Called from suplibHardenedWindowsMain and suplibOsInit.
+ */
+DECLHIDDEN(void) supR3HardenedWinInitVersion(void)
+{
+    /*
+     * Get the windows version.  Use RtlGetVersion as GetVersionExW and
+     * GetVersion might not be telling the whole truth (8.0 on 8.1 depending on
+     * the application manifest).
+     */
+    OSVERSIONINFOEXW NtVerInfo;
+
+    suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+    NtVerInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
+    if (!NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&NtVerInfo)))
+    {
+        suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+        NtVerInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
+        if (!NT_SUCCESS(RtlGetVersion((PRTL_OSVERSIONINFOW)&NtVerInfo)))
+        {
+            NtVerInfo.dwOSVersionInfoSize = sizeof(NtVerInfo);
+            if (!GetVersionExW((OSVERSIONINFOW *)&NtVerInfo))
+            {
+                suplibHardenedMemSet(&NtVerInfo, 0, sizeof(NtVerInfo));
+                DWORD dwVer = GetVersion();
+                NtVerInfo.dwMajorVersion = RT_BYTE1(dwVer);
+                NtVerInfo.dwMinorVersion = RT_BYTE2(dwVer);
+                NtVerInfo.dwBuildNumber  = RT_BIT_32(31) & dwVer ? 0 : RT_HI_U16(dwVer);
+            }
+        }
+    }
+    g_uNtVerCombined = SUP_MAKE_NT_VER_COMBINED(NtVerInfo.dwMajorVersion, NtVerInfo.dwMinorVersion, NtVerInfo.dwBuildNumber,
+                                                NtVerInfo.wServicePackMajor, NtVerInfo.wServicePackMinor);
+}
+
+#endif /* IN_RING3 */
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
new file mode 100644
index 0000000..46357a6
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
@@ -0,0 +1,1343 @@
+/* $Id: SUPHardenedVerifyProcess-win.cpp $ */
+/** @file
+ * VirtualBox Support Library/Driver - Hardened Process Verification, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#ifdef IN_RING0
+# define IPRT_NT_MAP_TO_ZW
+# include <iprt/nt/nt.h>
+# include <ntimage.h>
+#else
+# include <iprt/nt/nt-and-windows.h>
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/param.h>
+
+#ifdef IN_RING0
+# include "SUPDrvInternal.h"
+#else
+# include "SUPLibInternal.h"
+#endif
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Virtual address space region.
+ */
+typedef struct SUPHNTVPREGION
+{
+    /** The RVA of the region. */
+    uint32_t    uRva;
+    /** The size of the region. */
+    uint32_t    cb;
+    /** The protection of the region. */
+    uint32_t    fProt;
+} SUPHNTVPREGION;
+/** Pointer to a virtual address space region. */
+typedef SUPHNTVPREGION *PSUPHNTVPREGION;
+
+/**
+ * Virtual address space image information.
+ */
+typedef struct SUPHNTVPIMAGE
+{
+    /** The base address of the image. */
+    uintptr_t       uImageBase;
+    /** The size of the image mapping. */
+    uintptr_t       cbImage;
+
+    /** The name from the allowed lists. */
+    const char     *pszName;
+    /** Name structure for NtQueryVirtualMemory/MemorySectionName. */
+    struct
+    {
+        /** The full unicode name. */
+        UNICODE_STRING  UniStr;
+        /** Buffer space. */
+        WCHAR           awcBuffer[260];
+    } Name;
+
+    /** The number of mapping regions. */
+    uint32_t        cRegions;
+    /** Mapping regions. */
+    SUPHNTVPREGION  aRegions[16];
+
+    /** The image characteristics from the FileHeader. */
+    uint16_t        fImageCharecteristics;
+    /** The DLL characteristics from the OptionalHeader. */
+    uint16_t        fDllCharecteristics;
+
+    /** Set if this is the DLL. */
+    bool            fDll;
+    /** Set if the image is NTDLL an the verficiation code needs to watch out for
+     *  the NtCreateSection patch. */
+    bool            fNtCreateSectionPatch;
+    /** Whether the API set schema hack needs to be applied when verifying memory
+     * content.  The hack means that we only check if the 1st section is mapped. */
+    bool            fApiSetSchemaOnlySection1;
+    /** This may be a 32-bit resource DLL. */
+    bool            f32bitResourceDll;
+} SUPHNTVPIMAGE;
+/** Pointer to image info from the virtual address space scan. */
+typedef SUPHNTVPIMAGE *PSUPHNTVPIMAGE;
+
+/**
+ * Virtual address space scanning state.
+ */
+typedef struct SUPHNTVPSTATE
+{
+    /** The result. */
+    int                     rcResult;
+    /** Number of images in aImages. */
+    uint32_t                cImages;
+    /** Images found in the process.
+     * The array is large enough to hold the executable, all allowed DLLs, and one
+     * more so we can get the image name of the first unwanted DLL. */
+    SUPHNTVPIMAGE           aImages[1 + 6 + 1
+#ifdef VBOX_PERMIT_MORE
+                                    + 5
+#endif
+#ifdef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+                                    + 16
+#endif
+                                   ];
+    /** Memory compare scratch buffer.*/
+    uint8_t                 abMemory[_4K];
+    /** File compare scratch buffer.*/
+    uint8_t                 abFile[_4K];
+    /** Section headers for use when comparing file and loaded image. */
+    IMAGE_SECTION_HEADER    aSecHdrs[16];
+    /** Pointer to the error info. */
+    PRTERRINFO              pErrInfo;
+} SUPHNTVPSTATE;
+/** Pointer to stat information of a virtual address space scan. */
+typedef SUPHNTVPSTATE *PSUPHNTVPSTATE;
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/**
+ * System DLLs allowed to be loaded into the process.
+ * @remarks supHardNtVpCheckDlls assumes these are lower case.
+ */
+static const char *g_apszSupNtVpAllowedDlls[] =
+{
+    "ntdll.dll",
+    "kernel32.dll",
+    "kernelbase.dll",
+    "apphelp.dll",
+    "apisetschema.dll",
+#ifdef VBOX_PERMIT_MORE
+# define VBOX_PERMIT_MORE_FIRST_IDX 5
+    "sfc.dll",
+    "sfc_os.dll",
+    "user32.dll",
+    "acres.dll",
+    "acgenral.dll",
+#endif
+#ifdef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+    "psapi.dll",
+    "msvcrt.dll",
+    "advapi32.dll",
+    "sechost.dll",
+    "rpcrt4.dll",
+    "SamplingRuntime.dll",
+#endif
+};
+
+/**
+ * VBox executables allowed to start VMs.
+ * @remarks Remember to keep in sync with SUPR3HardenedVerify.cpp.
+ */
+static const char *g_apszSupNtVpAllowedVmExes[] =
+{
+    "VBoxHeadless.exe",
+    "VirtualBox.exe",
+    "VBoxSDL.exe",
+    "VBoxNetDHCP.exe",
+    "VBoxNetNAT.exe",
+
+    "tstMicro.exe",
+    "tstPDMAsyncCompletion.exe",
+    "tstPDMAsyncCompletionStress.exe",
+    "tstVMM.exe",
+    "tstVMREQ.exe",
+    "tstCFGM.exe",
+    "tstIntNet-1.exe",
+    "tstMMHyperHeap.exe",
+    "tstR0ThreadPreemptionDriver.exe",
+    "tstRTR0MemUserKernelDriver.exe",
+    "tstRTR0SemMutexDriver.exe",
+    "tstRTR0TimerDriver.exe",
+    "tstSSM.exe",
+};
+
+/** Pointer to NtQueryVirtualMemory.  Initialized by SUPDrv-win.cpp in
+ *  ring-0, in ring-3 it's just a slightly confusing define. */
+#ifdef IN_RING0
+PFNNTQUERYVIRTUALMEMORY g_pfnNtQueryVirtualMemory = NULL;
+#else
+# define g_pfnNtQueryVirtualMemory NtQueryVirtualMemory
+#endif
+
+
+/**
+ * Fills in error information.
+ *
+ * @returns @a rc.
+ * @param   pErrInfo            Pointer to the extended error info structure.
+ *                              Can be NULL.
+ * @param   pszErr              Where to return error details.
+ * @param   cbErr               Size of the buffer @a pszErr points to.
+ * @param   rc                  The status to return.
+ * @param   pszMsg              The format string for the message.
+ * @param   ...                 The arguments for the format string.
+ */
+static int supHardNtVpSetInfo1(PRTERRINFO pErrInfo, int rc, const char *pszMsg, ...)
+{
+    va_list va;
+#ifdef IN_RING3
+    va_start(va, pszMsg);
+    supR3HardenedError(rc, false /*fFatal*/, "%N\n", pszMsg, &va);
+    va_end(va);
+#endif
+
+    va_start(va, pszMsg);
+    RTErrInfoSetV(pErrInfo, rc, pszMsg, va);
+    va_end(va);
+
+    return rc;
+}
+
+
+/**
+ * Fills in error information.
+ *
+ * @returns @a rc.
+ * @param   pThis               The process validator instance.
+ * @param   pszErr              Where to return error details.
+ * @param   cbErr               Size of the buffer @a pszErr points to.
+ * @param   rc                  The status to return.
+ * @param   pszMsg              The format string for the message.
+ * @param   ...                 The arguments for the format string.
+ */
+static int supHardNtVpSetInfo2(PSUPHNTVPSTATE pThis, int rc, const char *pszMsg, ...)
+{
+    va_list va;
+#ifdef IN_RING3
+    va_start(va, pszMsg);
+    supR3HardenedError(rc, false /*fFatal*/, "%N\n", pszMsg, &va);
+    va_end(va);
+#endif
+
+    va_start(va, pszMsg);
+#ifdef IN_RING0
+    RTErrInfoSetV(pThis->pErrInfo, rc, pszMsg, va);
+    pThis->rcResult = rc;
+#else
+    if (RT_SUCCESS(pThis->rcResult))
+    {
+        RTErrInfoSetV(pThis->pErrInfo, rc, pszMsg, va);
+        pThis->rcResult = rc;
+    }
+    else
+    {
+        RTErrInfoAddF(pThis->pErrInfo, rc, " \n[rc=%d] ", rc);
+        RTErrInfoAddV(pThis->pErrInfo, rc, pszMsg, va);
+    }
+#endif
+    va_end(va);
+
+    return pThis->rcResult;
+}
+
+
+static NTSTATUS supHardNtVpReadFile(HANDLE hFile, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    if ((ULONG)cbRead != cbRead)
+        return STATUS_INTEGER_OVERFLOW;
+
+    IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+    NTSTATUS rcNt = NtReadFile(hFile,
+                               NULL /*hEvent*/,
+                               NULL /*ApcRoutine*/,
+                               NULL /*ApcContext*/,
+                               &Ios,
+                               pvBuf,
+                               (ULONG)cbRead,
+                               (PLARGE_INTEGER)&off,
+                               NULL);
+    if (NT_SUCCESS(rcNt))
+        rcNt = Ios.Status;
+    return rcNt;
+}
+
+
+static NTSTATUS supHardNtVpReadMem(HANDLE hProcess, uintptr_t uPtr, void *pvBuf, size_t cbRead)
+{
+#ifdef IN_RING0
+    /* ASSUMES hProcess is the current process. */
+    /** @todo use MmCopyVirtualMemory where available! */
+    int rc = RTR0MemUserCopyFrom(pvBuf, uPtr, cbRead);
+    if (RT_SUCCESS(rc))
+        return STATUS_SUCCESS;
+    return STATUS_ACCESS_DENIED;
+#else
+    SIZE_T cbIgn;
+    NTSTATUS rcNt = NtReadVirtualMemory(hProcess, (PVOID)uPtr, pvBuf, cbRead, &cbIgn);
+    if (NT_SUCCESS(rcNt) && cbIgn != cbRead)
+        rcNt = STATUS_IO_DEVICE_ERROR;
+    return rcNt;
+#endif
+}
+
+
+static int supHardNtVpFileMemCompare(PSUPHNTVPSTATE pThis, const void *pvFile, const void *pvMemory, size_t cbToCompare,
+                                     PSUPHNTVPIMAGE pImage, uint32_t uRva)
+{
+    if (suplibHardenedMemComp(pvFile, pvMemory, cbToCompare) == 0)
+        return VINF_SUCCESS;
+
+    /* Find the exact location. */
+    const uint8_t *pbFile   = (const uint8_t *)pvFile;
+    const uint8_t *pbMemory = (const uint8_t *)pvMemory;
+    while (cbToCompare > 0 && *pbFile == *pbMemory)
+    {
+        cbToCompare--;
+        pbFile++;
+        pbMemory++;
+        uRva++;
+    }
+
+    return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH,
+                               "%s: memory compare at %#x failed: %#x != %#x\n", pImage->pszName, uRva, *pbFile, *pbMemory);
+}
+
+
+static int supHardNtVpCheckSectionProtection(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage,
+                                             uint32_t uRva, uint32_t cb, uint32_t fProt)
+{
+    uint32_t const cbOrg = cb;
+    if (!cb)
+        return VINF_SUCCESS;
+
+    for (uint32_t i = 0; i < pImage->cRegions; i++)
+    {
+        uint32_t offRegion = uRva - pImage->aRegions[i].uRva;
+        if (offRegion < pImage->aRegions[i].cb)
+        {
+            uint32_t cbLeft = pImage->aRegions[i].cb - offRegion;
+            if (   pImage->aRegions[i].fProt != fProt
+                && (   fProt != PAGE_READWRITE
+                    || pImage->aRegions[i].fProt != PAGE_WRITECOPY))
+                return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_SECTION_PROTECTION_MISMATCH,
+                                           "%s: RVA range %#x-%#x protection is %#x, expected %#x. (cb=%#x)",
+                                           pImage->pszName, uRva, uRva + cbLeft - 1, pImage->aRegions[i].fProt, fProt, cb);
+            if (cbLeft >= cb)
+                return VINF_SUCCESS;
+            cb   -= cbLeft;
+            uRva += cbLeft;
+
+#if 0 /* This shouldn't ever be necessary. */
+            if (   i + 1 < pImage->cRegions
+                && uRva < pImage->aRegions[i + 1].uRva)
+            {
+                cbLeft = pImage->aRegions[i + 1].uRva - uRva;
+                if (cbLeft >= cb)
+                    return VINF_SUCCESS;
+                cb   -= cbLeft;
+                uRva += cbLeft;
+            }
+#endif
+        }
+    }
+
+    return supHardNtVpSetInfo2(pThis, cbOrg == cb ? VERR_SUP_VP_SECTION_NOT_MAPPED : VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED,
+                               "%s: RVA range %#x-%#x is not mapped?", pImage->pszName, uRva, uRva + cb - 1);
+}
+
+
+/**
+ * Compares process memory with the disk content.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure (for the
+ *                              two scratch buffers).
+ * @param   pImage              The image data collected during the address
+ *                              space scan.
+ * @param   hProcess            Handle to the process.
+ * @param   hFile               Handle to the image file.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+static int supHardNtVpVerifyImageCompareMemory(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, HANDLE hProcess, HANDLE hFile,
+                                               PRTERRINFO pErrInfo)
+{
+    /*
+     * Read and find the file headers.
+     */
+    NTSTATUS rcNt = supHardNtVpReadFile(hFile, 0, pThis->abFile, sizeof(pThis->abFile));
+    if (!NT_SUCCESS(rcNt))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_IMAGE_HDR_READ_ERROR,
+                                   "%s: Error reading image header: %#x", pImage->pszName, rcNt);
+
+    uint32_t offNtHdrs = 0;
+    PIMAGE_DOS_HEADER pDosHdr = (PIMAGE_DOS_HEADER)&pThis->abFile[0];
+    if (pDosHdr->e_magic == IMAGE_DOS_SIGNATURE)
+    {
+        offNtHdrs = pDosHdr->e_lfanew;
+        if (offNtHdrs > 512 || offNtHdrs < sizeof(*pDosHdr))
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_MZ_OFFSET,
+                                       "%s: Unexpected e_lfanew value: %#x", pImage->pszName, offNtHdrs);
+    }
+    PIMAGE_NT_HEADERS   pNtHdrs   = (PIMAGE_NT_HEADERS)&pThis->abFile[offNtHdrs];
+    PIMAGE_NT_HEADERS32 pNtHdrs32 = (PIMAGE_NT_HEADERS32)pNtHdrs;
+    if (pNtHdrs->Signature != IMAGE_NT_SIGNATURE)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_IMAGE_SIGNATURE,
+                                   "%s: No PE signature at %#x: %#x", pImage->pszName, offNtHdrs, pNtHdrs->Signature);
+
+    /*
+     * Do basic header validation.
+     */
+#ifdef RT_ARCH_AMD64
+    if (pNtHdrs->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64 && !pImage->f32bitResourceDll)
+#else
+    if (pNtHdrs->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
+#endif
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE,
+                                   "%s: Unexpected machine: %#x", pImage->pszName, pNtHdrs->FileHeader.Machine);
+    bool const fIs32Bit = pNtHdrs->FileHeader.Machine == IMAGE_FILE_MACHINE_I386;
+
+    if (pNtHdrs->FileHeader.SizeOfOptionalHeader != (fIs32Bit ? sizeof(IMAGE_OPTIONAL_HEADER32) : sizeof(IMAGE_OPTIONAL_HEADER64)))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+                                   "%s: Unexpected optional header size: %#x",
+                                   pImage->pszName, pNtHdrs->FileHeader.SizeOfOptionalHeader);
+
+    if (pNtHdrs->OptionalHeader.Magic != (fIs32Bit ? IMAGE_NT_OPTIONAL_HDR32_MAGIC : IMAGE_NT_OPTIONAL_HDR64_MAGIC))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+                                   "%s: Unexpected optional header magic: %#x", pImage->pszName, pNtHdrs->OptionalHeader.Magic);
+
+    uint32_t cDirs = (fIs32Bit ? pNtHdrs32->OptionalHeader.NumberOfRvaAndSizes : pNtHdrs->OptionalHeader.NumberOfRvaAndSizes);
+    if (cDirs != IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_OPTIONAL_HEADER,
+                                   "%s: Unexpected data dirs: %#x", pImage->pszName, cDirs);
+
+    /*
+     * Before we start comparing things, store what we need to know from the headers.
+     */
+    uint32_t  const cSections  = pNtHdrs->FileHeader.NumberOfSections;
+    if (cSections > RT_ELEMENTS(pThis->aSecHdrs))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_MANY_SECTIONS,
+                                   "%s: Too many section headers: %#x", pImage->pszName, cSections);
+    suplibHardenedMemCopy(pThis->aSecHdrs, (fIs32Bit ? (void *)(pNtHdrs32 + 1) : (void *)(pNtHdrs + 1)),
+                          cSections * sizeof(IMAGE_SECTION_HEADER));
+
+    uintptr_t const uImageBase = fIs32Bit ? pNtHdrs32->OptionalHeader.ImageBase : pNtHdrs->OptionalHeader.ImageBase;
+    if (uImageBase & PAGE_OFFSET_MASK)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_IMAGE_BASE,
+                                   "%s: Invalid image base: %p", pImage->pszName, uImageBase);
+
+    uint32_t  const cbImage    = fIs32Bit ? pNtHdrs32->OptionalHeader.SizeOfImage : pNtHdrs->OptionalHeader.SizeOfImage;
+    if (RT_ALIGN_32(pImage->cbImage, PAGE_SIZE) != RT_ALIGN_32(cbImage, PAGE_SIZE) && !pImage->fApiSetSchemaOnlySection1)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_IMAGE_SIZE,
+                                   "%s: SizeOfImage (%#x) isn't close enough to the mapping size (%#x)",
+                                   pImage->pszName, cbImage, pImage->cbImage);
+
+    uint32_t const cbSectAlign = fIs32Bit ? pNtHdrs32->OptionalHeader.SectionAlignment : pNtHdrs->OptionalHeader.SectionAlignment;
+    if (   !RT_IS_POWER_OF_TWO(cbSectAlign)
+        || cbSectAlign < PAGE_SIZE
+        || cbSectAlign > (pImage->fApiSetSchemaOnlySection1 ? _64K : (uint32_t)PAGE_SIZE) )
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE,
+                                   "%s: Unexpected SectionAlignment value: %#x", pImage->pszName, cbSectAlign);
+
+    uint32_t const cbFileAlign = fIs32Bit ? pNtHdrs32->OptionalHeader.FileAlignment : pNtHdrs->OptionalHeader.FileAlignment;
+    if (!RT_IS_POWER_OF_TWO(cbFileAlign) || cbFileAlign < 512 || cbFileAlign > PAGE_SIZE || cbFileAlign > cbSectAlign)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE,
+                                   "%s: Unexpected FileAlignment value: %#x (cbSectAlign=%#x)",
+                                   pImage->pszName, cbFileAlign, cbSectAlign);
+
+    uint32_t  const cbHeaders  = fIs32Bit ? pNtHdrs32->OptionalHeader.SizeOfHeaders : pNtHdrs->OptionalHeader.SizeOfHeaders;
+    uint32_t  const cbMinHdrs  = offNtHdrs + (fIs32Bit ? sizeof(*pNtHdrs32) : sizeof(*pNtHdrs) )
+                               + sizeof(IMAGE_SECTION_HEADER) * cSections;
+    if (cbHeaders < cbMinHdrs)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SIZE_OF_HEADERS,
+                                   "%s: Headers are too small: %#x < %#x (cSections=%#x)",
+                                   pImage->pszName, cbHeaders, cbMinHdrs, cSections);
+    uint32_t  const cbHdrsFile = RT_ALIGN_32(cbHeaders, cbFileAlign);
+    if (cbHdrsFile > sizeof(pThis->abFile))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SIZE_OF_HEADERS,
+                                   "%s: Headers are larger than expected: %#x/%#x (expected max %zx)",
+                                   pImage->pszName, cbHeaders, cbHdrsFile, sizeof(pThis->abFile));
+
+    /*
+     * Compare the file header with the loaded bits.  The loader will fiddle
+     * with image base, changing it to the actual load address.
+     */
+    int rc;
+    if (!pImage->fApiSetSchemaOnlySection1)
+    {
+        rcNt = supHardNtVpReadMem(hProcess, pImage->uImageBase, pThis->abMemory, cbHdrsFile);
+        if (!NT_SUCCESS(rcNt))
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_MEMORY_READ_ERROR,
+                                       "%s: Error reading image header from memory: %#x", pImage->pszName, rcNt);
+        if (uImageBase != pImage->uImageBase)
+        {
+            if (fIs32Bit)
+                pNtHdrs32->OptionalHeader.ImageBase = (uint32_t)pImage->uImageBase;
+            else
+                pNtHdrs->OptionalHeader.ImageBase = pImage->uImageBase;
+        }
+
+        rc = supHardNtVpFileMemCompare(pThis, pThis->abFile, pThis->abMemory, cbHeaders, pImage, 0 /*uRva*/);
+        if (RT_FAILURE(rc))
+            return rc;
+        rc = supHardNtVpCheckSectionProtection(pThis, pImage, 0 /*uRva*/, cbHdrsFile, PAGE_READONLY);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    /*
+     * Save some header fields we might be using later on.
+     */
+    pImage->fImageCharecteristics = pNtHdrs->FileHeader.Characteristics;
+    pImage->fDllCharecteristics   = fIs32Bit ? pNtHdrs32->OptionalHeader.DllCharacteristics : pNtHdrs->OptionalHeader.DllCharacteristics;
+
+    /*
+     * Validate sections and check them against the mapping regions.
+     */
+    uint32_t uRva = cbHdrsFile;
+    for (uint32_t i = 0; i < cSections; i++)
+    {
+        /* Validate the section. */
+        uint32_t uSectRva = pThis->aSecHdrs[i].VirtualAddress;
+        if (uSectRva < uRva || uSectRva > cbImage || RT_ALIGN_32(uSectRva, cbSectAlign) != uSectRva)
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SECTION_RVA,
+                                       "%s: Section %u: Invalid virtual address: %#x (uRva=%#x, cbImage=%#x, cbSectAlign=%#x)",
+                                       pImage->pszName, i, uSectRva, uRva, cbImage, cbSectAlign);
+        uint32_t cbMap  = pThis->aSecHdrs[i].Misc.VirtualSize;
+        if (cbMap > cbImage || uRva + cbMap > cbImage)
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE,
+                                       "%s: Section %u: Invalid virtual size: %#x (uSectRva=%#x, uRva=%#x, cbImage=%#x)",
+                                       pImage->pszName, i, cbMap, uSectRva, uRva, cbImage);
+        uint32_t cbFile = pThis->aSecHdrs[i].SizeOfRawData;
+        if (cbFile != RT_ALIGN_32(cbFile, cbFileAlign) || cbFile > RT_ALIGN_32(cbMap, cbSectAlign))
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_BAD_SECTION_FILE_SIZE,
+                                       "%s: Section %u: Invalid file size: %#x (cbMap=%#x, uSectRva=%#x)",
+                                       pImage->pszName, i, cbFile, cbMap, uSectRva);
+
+        /* Validate the protection. */
+        if (!pImage->fApiSetSchemaOnlySection1 || i == 0)
+        {
+            if (pImage->fApiSetSchemaOnlySection1)
+            {
+                pImage->uImageBase -= uSectRva;
+                pImage->cbImage    += uSectRva;
+                pImage->aRegions[i].uRva = uSectRva;
+            }
+
+            uint32_t fProt;
+            switch (pThis->aSecHdrs[i].Characteristics & (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE))
+            {
+                case IMAGE_SCN_MEM_READ:
+                    fProt = PAGE_READONLY;
+                    break;
+                case IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE:
+                    fProt = PAGE_READWRITE;
+                    if (!suplibHardenedMemComp(pThis->aSecHdrs[i].Name, ".mrdata", 8)) /* w8.1, ntdll */
+                        fProt = PAGE_READONLY;
+                    break;
+                case IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE:
+                    fProt = PAGE_EXECUTE_READ;
+                    break;
+                case IMAGE_SCN_MEM_EXECUTE:
+                    fProt = PAGE_EXECUTE;
+                    break;
+                default:
+                    return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS,
+                                               "%s: Section %u: Unexpected characteristics: %#x (uSectRva=%#x, cbMap=%#x)",
+                                               pImage->pszName, i, pThis->aSecHdrs[i].Characteristics, uSectRva, cbMap);
+
+            }
+            rc = supHardNtVpCheckSectionProtection(pThis, pImage, uSectRva, RT_ALIGN_32(cbMap, PAGE_SIZE), fProt);
+            if (RT_FAILURE(rc))
+                return rc;
+        }
+
+        /* Advance the RVA. */
+        uRva = uSectRva + RT_ALIGN_32(cbMap, cbSectAlign);
+    }
+
+    /*
+     * Check the mapping regions with the image to make sure someone didn't
+     * fill executable code into some gap in the image.
+     */
+    /** @todo not vital. */
+
+
+    /*
+     * Compare executable code.  If we're not loaded at the link address, we
+     * need to load base relocations and apply them while making the compare.
+     * A special case
+     */
+    /** @todo not vital. */
+
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Verifies the signature of the given image on disk, then checks if the memory
+ * mapping matches what we verified.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure (for the
+ *                              two scratch buffers).
+ * @param   pImage              The image data collected during the address
+ *                              space scan.
+ * @param   hProcess            Handle to the process.
+ * @param   hFile               Handle to the image file.
+ */
+static int supHardNtVpVerifyImage(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, HANDLE hProcess)
+{
+    /*
+     * Open the image.
+     */
+    HANDLE              hFile = RTNT_INVALID_HANDLE_VALUE;
+    IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+    OBJECT_ATTRIBUTES   ObjAttr;
+    InitializeObjectAttributes(&ObjAttr, &pImage->Name.UniStr, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+#ifdef IN_RING0
+    ObjAttr.Attributes |= OBJ_KERNEL_HANDLE;
+#endif
+
+    NTSTATUS rcNt = NtCreateFile(&hFile,
+                                 GENERIC_READ,
+                                 &ObjAttr,
+                                 &Ios,
+                                 NULL /* Allocation Size*/,
+                                 FILE_ATTRIBUTE_NORMAL,
+                                 FILE_SHARE_READ,
+                                 FILE_OPEN,
+                                 FILE_NON_DIRECTORY_FILE,
+                                 NULL /*EaBuffer*/,
+                                 0 /*EaLength*/);
+    if (NT_SUCCESS(rcNt))
+        rcNt = Ios.Status;
+    if (!NT_SUCCESS(rcNt))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR,
+                                  "Error opening image for scanning: %#x (name %ls)", rcNt, pImage->Name.UniStr.Buffer);
+
+    /*
+     * Validate the signature, then make an attempt at comparing memory and
+     * disk content.
+     */
+    uint32_t fFlags = pImage->fDll ? 0 : SUPHNTVI_F_REQUIRE_BUILD_CERT;
+    if (pImage->f32bitResourceDll)
+        fFlags |= SUPHNTVI_F_RESOURCE_IMAGE;
+    int rc = supHardenedWinVerifyImageByHandle(hFile, pImage->Name.UniStr.Buffer, fFlags, NULL /*pfCacheable*/, pThis->pErrInfo);
+    if (RT_SUCCESS(rc))
+        rc = supHardNtVpVerifyImageCompareMemory(pThis, pImage, hProcess, hFile, pThis->pErrInfo);
+
+    /*
+     * Clean up and return.
+     */
+    rcNt = NtClose(hFile);
+    if (!NT_SUCCESS(rcNt) && RT_SUCCESS(rc))
+        rc = supHardNtVpSetInfo2(pThis, VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR,
+                                "Error closing image after scanning: %#x (name %ls)", rcNt, pImage->Name.UniStr.Buffer);
+    return rc;
+}
+
+
+/**
+ * Verifies that there is only one thread in the process.
+ *
+ * @returns VBox status code.
+ * @param   hProcess            The process.
+ * @param   hThread             The thread.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+static int supHardNtVpThread(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo)
+{
+    /*
+     * Use the ThreadAmILastThread request to check that there is only one
+     * thread in the process.
+     */
+    ULONG cbIgn = 0;
+    ULONG fAmI  = 0;
+    NTSTATUS rcNt = NtQueryInformationThread(hThread, ThreadAmILastThread, &fAmI, sizeof(fAmI), &cbIgn);
+    if (!NT_SUCCESS(rcNt))
+        return supHardNtVpSetInfo1(pErrInfo, VERR_SUP_VP_NT_QI_THREAD_ERROR,
+                                   "NtQueryInformationThread/ThreadAmILastThread -> %#x", rcNt);
+    if (!fAmI)
+        return supHardNtVpSetInfo1(pErrInfo, VERR_SUP_VP_THREAD_NOT_ALONE,
+                                   "More than one thread in process");
+
+    /** @todo Would be nice to verify the relation ship between hProcess and hThread
+     *        as well... */
+    return VINF_SUCCESS;
+}
+
+
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+/**
+ * Verifies that there isn't a debugger attached to the process.
+ *
+ * @returns VBox status code.
+ * @param   hProcess            The process.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+static int supHardNtVpDebugger(HANDLE hProcess, PRTERRINFO pErrInfo)
+{
+    /*
+     * Use the ProcessDebugPort request to check there is no debugger
+     * currently attached to the process.
+     */
+    ULONG     cbIgn = 0;
+    uintptr_t uPtr  = ~(uintptr_t)0;
+    NTSTATUS rcNt = NtQueryInformationProcess(hProcess,
+                                              ProcessDebugPort,
+                                              &uPtr, sizeof(uPtr), &cbIgn);
+    if (!NT_SUCCESS(rcNt))
+        return supHardNtVpSetInfo1(pErrInfo, VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR,
+                                   "NtQueryInformationProcess/ProcessDebugPort -> %#x", rcNt);
+    if (uPtr != 0)
+        return supHardNtVpSetInfo1(pErrInfo, VERR_SUP_VP_DEBUGGED,
+                                   "Debugger attached (%#zx)", uPtr);
+    return VINF_SUCCESS;
+}
+#endif /* !VBOX_WITHOUT_DEBUGGER_CHECKS */
+
+
+/**
+ * Allocates and initalizes a process stat structure for process virtual memory
+ * scanning.
+ *
+ * @returns Pointer to the state structure on success, NULL on failure.
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+static PSUPHNTVPSTATE supHardNtVpCreateState(PRTERRINFO pErrInfo)
+{
+    /*
+     * Allocate the memory.
+     */
+    PSUPHNTVPSTATE pThis = (PSUPHNTVPSTATE)suplibHardenedAllocZ(sizeof(*pThis));
+    if (pThis)
+    {
+        pThis->rcResult = VINF_SUCCESS;
+        pThis->pErrInfo = pErrInfo;
+        return pThis;
+    }
+    supHardNtVpSetInfo1(pErrInfo, VERR_NO_MEMORY, "Failed to allocate %zu bytes for state structures.", sizeof(*pThis));
+    return NULL;
+}
+
+
+/**
+ * Matches two UNICODE_STRING structures in a case sensitive fashion.
+ *
+ * @returns true if equal, false if not.
+ * @param   pUniStr1            The first unicode string.
+ * @param   pUniStr2            The first unicode string.
+ */
+static bool supHardNtVpAreUniStringsEqual(PCUNICODE_STRING pUniStr1, PCUNICODE_STRING pUniStr2)
+{
+    if (pUniStr1->Length != pUniStr2->Length)
+        return false;
+    return suplibHardenedMemComp(pUniStr1->Buffer, pUniStr2->Buffer, pUniStr1->Length) == 0;
+}
+
+
+/**
+ * Performs a case insensitive comparison of an ASCII and an UTF-16 file name.
+ *
+ * @returns true / false
+ * @param   pszName1            The ASCII name.
+ * @param   pwszName2           The UTF-16 name.
+ */
+static bool supHardNtVpAreNamesEqual(const char *pszName1, PCRTUTF16 pwszName2)
+{
+    for (;;)
+    {
+        char    ch1 = *pszName1++;
+        RTUTF16 wc2 = *pwszName2++;
+        if (ch1 != wc2)
+        {
+            ch1 = RT_C_TO_LOWER(ch1);
+            wc2 = wc2 < 0x80 ? RT_C_TO_LOWER(wc2) : wc2;
+            if (ch1 != wc2)
+                return false;
+        }
+        if (!ch1)
+            return true;
+    }
+}
+
+
+/**
+ * Records an additional memory region for an image.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure.
+ * @param   pImage              The new image structure.  Only the unicode name
+ *                              buffer is valid.
+ * @param   pMemInfo            The memory information for the image.
+ */
+static int supHardNtVpNewImage(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, PMEMORY_BASIC_INFORMATION pMemInfo)
+{
+    /*
+     * Extract the final component.
+     */
+    unsigned  cwcDirName   = pImage->Name.UniStr.Length / sizeof(WCHAR);
+    PCRTUTF16 pwszFilename = &pImage->Name.UniStr.Buffer[cwcDirName];
+    while (   cwcDirName > 0
+           && pwszFilename[-1] != '\\'
+           && pwszFilename[-1] != '/'
+           && pwszFilename[-1] != ':')
+    {
+        pwszFilename--;
+        cwcDirName--;
+    }
+    if (!*pwszFilename)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NO_IMAGE_MAPPING_NAME,
+                                   "Empty filename (len=%u) for image at %p.", pImage->Name.UniStr.Length, pMemInfo->BaseAddress);
+
+    /*
+     * Drop trailing slashes from the directory name.
+     */
+    while (   cwcDirName > 0
+           && (   pImage->Name.UniStr.Buffer[cwcDirName - 1] == '\\'
+               || pImage->Name.UniStr.Buffer[cwcDirName - 1] == '/'))
+        cwcDirName--;
+
+    /*
+     * Match it against known DLLs.
+     */
+    pImage->pszName = NULL;
+    for (uint32_t i = 0; i < RT_ELEMENTS(g_apszSupNtVpAllowedDlls); i++)
+        if (supHardNtVpAreNamesEqual(g_apszSupNtVpAllowedDlls[i], pwszFilename))
+        {
+            pImage->pszName = g_apszSupNtVpAllowedDlls[i];
+            pImage->fDll    = true;
+
+#ifndef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+            /* The directory name must match the one we've got for System32. */
+            if (   (   cwcDirName * sizeof(WCHAR) != g_System32NtPath.UniStr.Length
+                    || suplibHardenedMemComp(pImage->Name.UniStr.Buffer,
+                                            g_System32NtPath.UniStr.Buffer,
+                                            cwcDirName * sizeof(WCHAR)) )
+# ifdef VBOX_PERMIT_MORE
+                && (   pImage->pszName[0] != 'a'
+                    || pImage->pszName[1] != 'c'
+                    || !supHardViIsAppPatchDir(pImage->Name.UniStr.Buffer, pImage->Name.UniStr.Length / sizeof(WCHAR)) )
+# endif
+                )
+                return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NON_SYSTEM32_DLL,
+                                           "Expected %ls to be loaded from %ls.",
+                                           pImage->Name.UniStr.Buffer, g_System32NtPath.UniStr.Buffer);
+# ifdef VBOX_PERMIT_MORE
+            if (g_uNtVerCombined < SUP_NT_VER_W70 && i >= VBOX_PERMIT_MORE_FIRST_IDX)
+                pImage->pszName = NULL; /* hard limit: user32.dll is unwanted prior to w7. */
+# endif
+
+#endif /* VBOX_PERMIT_VISUAL_STUDIO_PROFILING */
+            break;
+        }
+    if (!pImage->pszName)
+    {
+        /*
+         * Not a known DLL, executable?
+         */
+        for (uint32_t i = 0; i < RT_ELEMENTS(g_apszSupNtVpAllowedVmExes); i++)
+            if (supHardNtVpAreNamesEqual(g_apszSupNtVpAllowedVmExes[i], pwszFilename))
+            {
+                pImage->pszName = g_apszSupNtVpAllowedVmExes[i];
+                pImage->fDll    = false;
+                break;
+            }
+    }
+    if (!pImage->pszName)
+    {
+        if (   pMemInfo->AllocationBase == pMemInfo->BaseAddress
+            && (   supHardNtVpAreNamesEqual("sysfer.dll", pwszFilename)
+                || supHardNtVpAreNamesEqual("sysfer32.dll", pwszFilename)
+                || supHardNtVpAreNamesEqual("sysfer64.dll", pwszFilename)) )
+        {
+            supHardNtVpSetInfo2(pThis, VERR_SUP_VP_SYSFER_DLL,
+                                "Found %ls at %p - This is probably part of Symantec Endpoint Protection. \n"
+                                "You or your admin need to add and exception to the Application and Device Control (ADC) "
+                                "component (or disable it) to prevent ADC from injecting itself into the VirtualBox VM processes. "
+                                "See http://www.symantec.com/connect/articles/creating-application-control-exclusions-symantec-endpoint-protection-121"
+                                , pImage->Name.UniStr.Buffer, pMemInfo->BaseAddress);
+            return pThis->rcResult = VERR_SUP_VP_SYSFER_DLL; /* Try make sure this is what the user sees first! */
+        }
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE,
+                                   "Unknown image file %ls at %p.", pImage->Name.UniStr.Buffer, pMemInfo->BaseAddress);
+    }
+
+    /*
+     * Since it's a new image, we expect to be at the start of the mapping now.
+     */
+    if (pMemInfo->AllocationBase != pMemInfo->BaseAddress)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR,
+                                   "Invalid AllocationBase/BaseAddress for %s: %p vs %p.",
+                                   pImage->pszName, pMemInfo->AllocationBase, pMemInfo->BaseAddress);
+
+    /*
+     * Check for size/rva overflow.
+     */
+    if (pMemInfo->RegionSize >= _2G)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_LARGE_REGION,
+                                   "Region 0 of image %s is too large: %p.", pImage->pszName, pMemInfo->RegionSize);
+
+    /*
+     * Fill in details from the memory info.
+     */
+    pImage->uImageBase = (uintptr_t)pMemInfo->AllocationBase;
+    pImage->cbImage    = pMemInfo->RegionSize;
+    pImage->cRegions   = 1;
+    pImage->aRegions[0].uRva    = 0;
+    pImage->aRegions[0].cb      = (uint32_t)pMemInfo->RegionSize;
+    pImage->aRegions[0].fProt   = pMemInfo->Protect;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Records an additional memory region for an image.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure.
+ * @param   pImage              The image.
+ * @param   pMemInfo            The memory information for the region.
+ */
+static int supHardNtVpAddRegion(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE pImage, PMEMORY_BASIC_INFORMATION pMemInfo)
+{
+    /*
+     * Make sure the base address matches.
+     */
+    if (pImage->uImageBase != (uintptr_t)pMemInfo->AllocationBase)
+        return supHardNtVpSetInfo2(pThis, VERR_SUPLIB_NT_PROCESS_UNTRUSTED_3,
+                                   "Base address mismatch for %s: have %p, found %p for region %p LB %#zx.",
+                                   pImage->pszName, pImage->uImageBase, pMemInfo->AllocationBase,
+                                   pMemInfo->BaseAddress, pMemInfo->RegionSize);
+
+    /*
+     * Check for size and rva overflows.
+     */
+    uintptr_t uRva = (uintptr_t)pMemInfo->BaseAddress - pImage->uImageBase;
+    if (pMemInfo->RegionSize >= _2G)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_LARGE_REGION,
+                                   "Region %u of image %s is too large: %p/%p.", pImage->pszName, pMemInfo->RegionSize, uRva);
+    if (uRva >= _2G)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_HIGH_REGION_RVA,
+                                   "Region %u of image %s is too high: %p/%p.", pImage->pszName, pMemInfo->RegionSize, uRva);
+
+
+    /*
+     * Record the region.
+     */
+    uint32_t iRegion = pImage->cRegions;
+    if (iRegion + 1 >= RT_ELEMENTS(pImage->aRegions))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS,
+                                   "Too many regions for %s.", pImage->pszName);
+    pImage->aRegions[iRegion].uRva  = (uint32_t)uRva;
+    pImage->aRegions[iRegion].cb    = (uint32_t)pMemInfo->RegionSize;
+    pImage->aRegions[iRegion].fProt = pMemInfo->Protect;
+    pImage->cbImage = pImage->aRegions[iRegion].uRva + pImage->aRegions[iRegion].cb;
+    pImage->cRegions++;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Scans the virtual memory of the process.
+ *
+ * This collects the locations of DLLs and the EXE, and verifies that executable
+ * memory is only associated with these.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure. Details
+ *                              about images are added to this.
+ * @param   hProcess            The process to verify.
+ */
+static int supHardNtVpScanVirtualMemory(PSUPHNTVPSTATE pThis, HANDLE hProcess)
+{
+    uint32_t    cXpExceptions = 0;
+    uintptr_t   cbAdvance = 0;
+    uintptr_t   uPtrWhere = 0;
+    for (uint32_t i = 0; i < 1024; i++)
+    {
+        SIZE_T                      cbActual = 0;
+        MEMORY_BASIC_INFORMATION    MemInfo  = { 0, 0, 0, 0, 0, 0, 0 };
+        NTSTATUS rcNt = g_pfnNtQueryVirtualMemory(hProcess,
+                                                  (void const *)uPtrWhere,
+                                                  MemoryBasicInformation,
+                                                  &MemInfo,
+                                                  sizeof(MemInfo),
+                                                  &cbActual);
+        if (!NT_SUCCESS(rcNt))
+        {
+            if (rcNt == STATUS_INVALID_PARAMETER)
+                return pThis->rcResult;
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR,
+                                       "NtQueryVirtualMemory failed for %p: %#x", uPtrWhere, rcNt);
+        }
+
+        /*
+         * Record images.
+         */
+        if (   MemInfo.Type == SEC_IMAGE
+            || MemInfo.Type == SEC_PROTECTED_IMAGE
+            || MemInfo.Type == (SEC_IMAGE | SEC_PROTECTED_IMAGE))
+        {
+            uint32_t iImg = pThis->cImages;
+            rcNt = g_pfnNtQueryVirtualMemory(hProcess,
+                                             (void const *)uPtrWhere,
+                                             MemorySectionName,
+                                             &pThis->aImages[iImg].Name,
+                                             sizeof(pThis->aImages[iImg].Name) - sizeof(WCHAR),
+                                             &cbActual);
+            if (!NT_SUCCESS(rcNt))
+                return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR,
+                                           "NtQueryVirtualMemory/MemorySectionName failed for %p: %#x", uPtrWhere, rcNt);
+            pThis->aImages[iImg].Name.UniStr.Buffer[pThis->aImages[iImg].Name.UniStr.Length / sizeof(WCHAR)] = '\0';
+
+            /* New or existing image? */
+            bool fNew = true;
+            uint32_t iSearch = iImg;
+            while (iSearch-- > 0)
+                if (supHardNtVpAreUniStringsEqual(&pThis->aImages[iSearch].Name.UniStr, &pThis->aImages[iImg].Name.UniStr))
+                {
+                    int rc = supHardNtVpAddRegion(pThis, &pThis->aImages[iSearch], &MemInfo);
+                    if (RT_FAILURE(rc))
+                        return rc;
+                    fNew = false;
+                    break;
+                }
+                else if (pThis->aImages[iSearch].uImageBase == (uintptr_t)MemInfo.AllocationBase)
+                    return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NT_MAPPING_NAME_CHANGED,
+                                               "Unexpected base address match");
+
+            if (fNew)
+            {
+                int rc = supHardNtVpNewImage(pThis, &pThis->aImages[iImg], &MemInfo);
+                if (RT_SUCCESS(rc))
+                {
+                    pThis->cImages++;
+                    if (pThis->cImages >= RT_ELEMENTS(pThis->aImages))
+                        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_MANY_DLLS_LOADED,
+                                                   "Internal error: aImages is full.\n");
+                }
+#ifdef IN_RING3 /* Continue and add more information if unknown DLLs are found. */
+                else if (rc != VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE && rc != VERR_SUP_VP_NON_SYSTEM32_DLL)
+                    return rc;
+#else
+                else
+                    return rc;
+#endif
+            }
+        }
+        /*
+         * XP, W2K3: Ignore the CSRSS read-only region as best we can.
+         */
+        else if (      (MemInfo.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+                    == PAGE_EXECUTE_READ
+                 && cXpExceptions == 0
+                 && (uintptr_t)MemInfo.BaseAddress >= UINT32_C(0x78000000)
+                 /* && MemInfo.BaseAddress == pPeb->ReadOnlySharedMemoryBase */
+                 && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 0) )
+            cXpExceptions++;
+        /*
+         * Executable memory?
+         */
+#ifndef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+        else if (MemInfo.Protect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY))
+        {
+            supHardNtVpSetInfo2(pThis, VERR_SUP_VP_FOUND_EXEC_MEMORY,
+                                "Found executable memory at %p (%p LB %#zx): type=%#x prot=%#x state=%#x aprot=%#x abase=%p",
+                                uPtrWhere,
+                                MemInfo.BaseAddress,
+                                MemInfo.RegionSize,
+                                MemInfo.Type,
+                                MemInfo.Protect,
+                                MemInfo.State,
+                                MemInfo.AllocationBase,
+                                MemInfo.AllocationProtect);
+# ifdef IN_RING3
+            /* Continue add more information about the problematic process. */
+# else
+            return pThis->rcResult;
+# endif
+        }
+#endif
+
+        /*
+         * Advance.
+         */
+        cbAdvance = MemInfo.RegionSize;
+        if (uPtrWhere + cbAdvance <= uPtrWhere)
+            return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_EMPTY_REGION_TOO_LARGE,
+                                       "Empty region at %p.", uPtrWhere);
+        uPtrWhere += MemInfo.RegionSize;
+    }
+
+    return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS,
+                               "Too many virtual memory regions.\n");
+}
+
+
+/**
+ * Check the integrity of the executable of the process.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure. Details
+ *                              about images are added to this.
+ * @param   hProcess            The process to verify.
+ */
+static int supHardNtVpCheckExe(PSUPHNTVPSTATE pThis, HANDLE hProcess)
+{
+    /*
+     * Make sure there is exactly one executable image.
+     */
+    unsigned cExecs = 0;
+    unsigned iExe   = ~0U;
+    unsigned i = pThis->cImages;
+    while (i-- > 0)
+    {
+        if (!pThis->aImages[i].fDll)
+        {
+            cExecs++;
+            iExe = i;
+        }
+    }
+    if (cExecs == 0)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING,
+                                   "No executable mapping found in the virtual address space.");
+    if (cExecs != 1)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING,
+                                   "Found more than one executable mapping in the virtual address space.");
+    PSUPHNTVPIMAGE pImage = &pThis->aImages[iExe];
+
+    /*
+     * Check that it matches the executable image of the process.
+     */
+    int             rc;
+    ULONG           cbUniStr = sizeof(UNICODE_STRING) + RTPATH_MAX * sizeof(RTUTF16);
+    PUNICODE_STRING pUniStr  = (PUNICODE_STRING)suplibHardenedAllocZ(cbUniStr);
+    if (!pUniStr)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NO_MEMORY,
+                                  "Error allocating %zu bytes for process name.", cbUniStr);
+    ULONG    cbIgn = 0;
+    NTSTATUS rcNt = NtQueryInformationProcess(hProcess, ProcessImageFileName, pUniStr, cbUniStr - sizeof(WCHAR), &cbIgn);
+    if (NT_SUCCESS(rcNt))
+    {
+        if (supHardNtVpAreUniStringsEqual(pUniStr, &pImage->Name.UniStr))
+            rc = VINF_SUCCESS;
+        else
+        {
+            pUniStr->Buffer[pUniStr->Length / sizeof(WCHAR)] = '\0';
+            rc = supHardNtVpSetInfo2(pThis, VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH,
+                                     "Process image name does not match the exectuable we found: %ls vs %ls.",
+                                     pUniStr->Buffer, pImage->Name.UniStr.Buffer);
+        }
+    }
+    else
+        rc = supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR,
+                                 "NtQueryInformationProcess/ProcessImageFileName failed: %#x", rcNt);
+    suplibHardenedFree(pUniStr);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Validate the signing of the executable image.
+     * This will load the fDllCharecteristics and fImageCharecteristics members we use below.
+     */
+    rc = supHardNtVpVerifyImage(pThis, pImage, hProcess);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Check linking requirements.
+     */
+    SECTION_IMAGE_INFORMATION ImageInfo;
+    rcNt = NtQueryInformationProcess(hProcess, ProcessImageInformation, &ImageInfo, sizeof(ImageInfo), NULL);
+    if (!NT_SUCCESS(rcNt))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR,
+                                   "NtQueryInformationProcess/ProcessImageInformation failed: %#x", rcNt);
+    if ( !(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY,
+                                   "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY to be set.",
+                                   ImageInfo.DllCharacteristics);
+    if (!(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE,
+                                   "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE to be set.",
+                                   ImageInfo.DllCharacteristics);
+    if (!(ImageInfo.DllCharacteristics & IMAGE_DLLCHARACTERISTICS_NX_COMPAT))
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_EXE_MISSING_NX_COMPAT,
+                                   "EXE DllCharacteristics=%#x, expected IMAGE_DLLCHARACTERISTICS_NX_COMPAT to be set.",
+                                   ImageInfo.DllCharacteristics);
+
+    if (pImage->fDllCharecteristics != ImageInfo.DllCharacteristics)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH,
+                                   "EXE Info.DllCharacteristics=%#x fDllCharecteristics=%#x.",
+                                   ImageInfo.DllCharacteristics, pImage->fDllCharecteristics);
+
+    if (pImage->fImageCharecteristics != ImageInfo.ImageCharacteristics)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH,
+                                   "EXE Info.ImageCharacteristics=%#x fImageCharecteristics=%#x.",
+                                   ImageInfo.ImageCharacteristics, pImage->fImageCharecteristics);
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Check the integrity of the DLLs found in the process.
+ *
+ * @returns VBox status code.
+ * @param   pThis               The process scanning state structure. Details
+ *                              about images are added to this.
+ * @param   hProcess            The process to verify.
+ */
+static int supHardNtVpCheckDlls(PSUPHNTVPSTATE pThis, HANDLE hProcess)
+{
+    /*
+     * Check for duplicate entries.
+     */
+    uint32_t i = pThis->cImages;
+    while (i-- > 1)
+    {
+        const char *pszName = pThis->aImages[i].pszName;
+        uint32_t j = i;
+        while (j-- > 0)
+            if (pThis->aImages[j].pszName == pszName)
+                return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_DUPLICATE_DLL_MAPPING,
+                                           "Duplicate image entries for %s: %ls and %ls",
+                                           pszName, pThis->aImages[i].Name.UniStr.Buffer, pThis->aImages[j].Name.UniStr.Buffer);
+    }
+
+    /*
+     * Check that both ntdll and kernel32 are present.
+     * ASSUMES the entries in g_apszSupNtVpAllowedDlls are all lower case.
+     */
+    uint32_t iNtDll    = UINT32_MAX;
+    uint32_t iKernel32 = UINT32_MAX;
+    uint32_t iApiSetSchema = UINT32_MAX;
+    i = pThis->cImages;
+    while (i-- > 0)
+        if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "ntdll.dll") == 0)
+            iNtDll = i;
+        else if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "kernel32.dll") == 0)
+            iKernel32 = i;
+        else if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "apisetschema.dll") == 0)
+            iApiSetSchema = i;
+#ifdef VBOX_PERMIT_MORE
+        else if (suplibHardenedStrCmp(pThis->aImages[i].pszName, "acres.dll") == 0)
+            pThis->aImages[i].f32bitResourceDll = true;
+#endif
+    if (iNtDll == UINT32_MAX)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NO_NTDLL_MAPPING,
+                                   "The process has no NTDLL.DLL.");
+    if (iKernel32 == UINT32_MAX)
+        return supHardNtVpSetInfo2(pThis, VERR_SUP_VP_NO_KERNEL32_MAPPING,
+                                   "The process has no KERNEL32.DLL.");
+
+
+    /*
+     * Verify that the DLLs are correctly signed (by MS).
+     */
+    i = pThis->cImages;
+    while (i-- > 0)
+    {
+        pThis->aImages[i].fNtCreateSectionPatch     = i == iNtDll;
+        pThis->aImages[i].fApiSetSchemaOnlySection1 = i == iApiSetSchema && pThis->aImages[i].cRegions == 1;
+
+        int rc = supHardNtVpVerifyImage(pThis, &pThis->aImages[i], hProcess);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Verifies the given process.
+ *
+ * The following requirements are checked:
+ *  - The process only has one thread, the calling thread.
+ *  - The process has no debugger attached.
+ *  - The executable image of the process is verified to be signed with
+ *    certificate known to this code at build time.
+ *  - The executable image is one of a predefined set.
+ *  - The process has only a very limited set of system DLLs loaded.
+ *  - The system DLLs signatures check out fine.
+ *  - The only executable memory in the process belongs to the system DLLs and
+ *    the executable image.
+ *
+ * @returns VBox status code.
+ * @param   hProcess            The process to verify.
+ * @param   hThread             A thread in the process (the caller).
+ * @param   pErrInfo            Pointer to error info structure. Optional.
+ */
+DECLHIDDEN(int) supHardenedWinVerifyProcess(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo)
+{
+    int rc = supHardNtVpThread(hProcess, hThread, pErrInfo);
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+    if (RT_SUCCESS(rc))
+        rc = supHardNtVpDebugger(hProcess, pErrInfo);
+#endif
+    if (RT_SUCCESS(rc))
+    {
+        PSUPHNTVPSTATE pThis = supHardNtVpCreateState(pErrInfo);
+        if (pThis)
+        {
+            rc = supHardNtVpScanVirtualMemory(pThis, hProcess);
+            if (RT_SUCCESS(rc))
+                rc = supHardNtVpCheckExe(pThis, hProcess);
+            if (RT_SUCCESS(rc))
+                rc = supHardNtVpCheckDlls(pThis, hProcess);
+
+            suplibHardenedFree(pThis);
+        }
+        else
+            rc = VERR_SUP_VP_NO_MEMORY_STATE;
+    }
+    return rc;
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp b/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
index 99e5e78..0909283 100644
--- a/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
+++ b/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp
@@ -30,6 +30,7 @@
 #define LOG_GROUP LOG_GROUP_SUP
 #ifdef IN_SUP_HARDENED_R3
 # undef DEBUG /* Warning: disables RT_STRICT */
+# undef LOG_DISABLED
 # define LOG_DISABLED
   /** @todo RTLOGREL_DISABLED */
 # include <iprt/log.h>
@@ -37,7 +38,8 @@
 # define LogRelIt(pvInst, fFlags, iGroup, fmtargs) do { } while (0)
 #endif
 
-#include <Windows.h>
+#define USE_NT_DEVICE_IO_CONTROL_FILE
+#include <iprt/nt/nt-and-windows.h>
 
 #include <VBox/sup.h>
 #include <VBox/types.h>
@@ -49,6 +51,9 @@
 #include <iprt/string.h>
 #include "../SUPLibInternal.h"
 #include "../SUPDrvIOC.h"
+#ifdef VBOX_WITH_HARDENING
+# include "win/SUPHardenedVerify-win.h"
+#endif
 
 
 /*******************************************************************************
@@ -56,85 +61,158 @@
 *******************************************************************************/
 /** The support service name. */
 #define SERVICE_NAME    "VBoxDrv"
-/** Win32 Device name - system. */
-#define DEVICE_NAME_SYS "\\\\.\\VBoxDrv"
-/** Win32 Device name - user. */
-#define DEVICE_NAME_USR "\\\\.\\VBoxDrvU"
-/** NT Device name. */
-#define DEVICE_NAME_NT   L"\\Device\\VBoxDrv"
-/** Win32 Symlink name. */
-#define DEVICE_NAME_DOS  L"\\DosDevices\\VBoxDrv"
 
 
 /*******************************************************************************
 *   Internal Functions                                                         *
 *******************************************************************************/
+#ifndef IN_SUP_HARDENED_R3
 static int suplibOsCreateService(void);
 //unused: static int suplibOsUpdateService(void);
 static int suplibOsDeleteService(void);
 static int suplibOsStartService(void);
 static int suplibOsStopService(void);
+#endif
+#ifdef USE_NT_DEVICE_IO_CONTROL_FILE
+static int suplibConvertNtStatus(NTSTATUS rcNt);
+#else
 static int suplibConvertWin32Err(int);
+#endif
 
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static bool g_fHardenedVerifyInited = false;
 
 
+int suplibOsHardenedVerifyInit(void)
+{
+    if (!g_fHardenedVerifyInited)
+    {
+#if defined(VBOX_WITH_HARDENING) && !defined(IN_SUP_HARDENED_R3) && !defined(IN_SUP_R3_STATIC)
+        supR3HardenedWinInitVersion();
+        int rc = supHardenedWinInitImageVerifier(NULL);
+        if (RT_FAILURE(rc))
+            return rc;
+        supR3HardenedWinResolveVerifyTrustApiAndHookThreadCreation();
+#endif
+        g_fHardenedVerifyInited = true;
+    }
+    return VINF_SUCCESS;
+}
+
+
+int suplibOsHardenedVerifyTerm(void)
+{
+    /** @todo free resources...  */
+    return VINF_SUCCESS;
+}
+
 
 int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted)
 {
     /*
-     * Nothing to do if pre-inited.
+     * Make sure the image verifier is fully initialized.
+     */
+    int rc = suplibOsHardenedVerifyInit();
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Done if of pre-inited.
      */
     if (fPreInited)
+    {
+#if defined(VBOX_WITH_HARDENING) && !defined(IN_SUP_HARDENED_R3)
+# ifdef IN_SUP_R3_STATIC
+        return VERR_NOT_SUPPORTED;
+# else
         return VINF_SUCCESS;
+# endif
+#else
+        return VINF_SUCCESS;
+#endif
+    }
 
     /*
      * Try open the device.
      */
-    HANDLE hDevice = CreateFile(fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR,
-                                GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
-                                NULL,
-                                OPEN_EXISTING,
-                                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
-                                NULL);
-    if (hDevice == INVALID_HANDLE_VALUE)
-    {
 #ifndef IN_SUP_HARDENED_R3
-        /*
-         * Try start the service and retry opening it.
-         */
-        suplibOsStartService();
-
-        hDevice = CreateFile(fUnrestricted ? DEVICE_NAME_SYS : DEVICE_NAME_USR,
-                             GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
-                             NULL,
-                             OPEN_EXISTING,
-                             FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
-                             NULL);
-        if (hDevice == INVALID_HANDLE_VALUE)
-#endif /* !IN_SUP_HARDENED_R3 */
+    uint32_t cTry = 0;
+#endif
+    HANDLE hDevice;
+    for (;;)
+    {
+        IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+        static const WCHAR  s_wszName[] = L"\\Device\\VBoxDrvU";
+        UNICODE_STRING      NtName;
+        NtName.Buffer        = (PWSTR)s_wszName;
+        NtName.Length        = sizeof(s_wszName) - sizeof(WCHAR) * (fUnrestricted ? 2 : 1);
+        NtName.MaximumLength = NtName.Length;
+
+        OBJECT_ATTRIBUTES   ObjAttr;
+        InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+        hDevice = RTNT_INVALID_HANDLE_VALUE;
+
+        NTSTATUS rcNt = NtCreateFile(&hDevice,
+                                     GENERIC_READ | GENERIC_WRITE,
+                                     &ObjAttr,
+                                     &Ios,
+                                     NULL /* Allocation Size*/,
+                                     FILE_ATTRIBUTE_NORMAL,
+                                     FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                     FILE_OPEN,
+                                     FILE_NON_DIRECTORY_FILE,
+                                     NULL /*EaBuffer*/,
+                                     0 /*EaLength*/);
+        if (NT_SUCCESS(rcNt))
+            rcNt = Ios.Status;
+        if (!NT_SUCCESS(rcNt))
         {
-            int rc = GetLastError();
-            switch (rc)
+#ifndef IN_SUP_HARDENED_R3
+            /*
+             * Failed to open, try starting the service and reopen the device
+             * exactly once.
+             */
+            if (cTry == 0 && !NT_SUCCESS(rcNt))
+            {
+                cTry++;
+                suplibOsStartService();
+                continue;
+            }
+#endif
+            switch (rcNt)
             {
                 /** @todo someone must test what is actually returned. */
-                case ERROR_DEV_NOT_EXIST:
-                case ERROR_DEVICE_NOT_CONNECTED:
-                case ERROR_BAD_DEVICE:
-                case ERROR_DEVICE_REMOVED:
-                case ERROR_DEVICE_NOT_AVAILABLE:
+                case STATUS_DEVICE_DOES_NOT_EXIST:
+                case STATUS_DEVICE_NOT_CONNECTED:
+                //case ERROR_BAD_DEVICE:
+                case STATUS_DEVICE_REMOVED:
+                //case ERROR_DEVICE_NOT_AVAILABLE:
                     return VERR_VM_DRIVER_LOAD_ERROR;
-                case ERROR_PATH_NOT_FOUND:
-                case ERROR_FILE_NOT_FOUND:
+                case STATUS_OBJECT_PATH_NOT_FOUND:
+                case STATUS_NO_SUCH_DEVICE:
+                case STATUS_NO_SUCH_FILE:
+                case STATUS_OBJECT_NAME_NOT_FOUND:
                     return VERR_VM_DRIVER_NOT_INSTALLED;
-                case ERROR_ACCESS_DENIED:
-                case ERROR_SHARING_VIOLATION:
+                case STATUS_ACCESS_DENIED:
+                case STATUS_SHARING_VIOLATION:
                     return VERR_VM_DRIVER_NOT_ACCESSIBLE;
+                case STATUS_UNSUCCESSFUL:
+                    return VERR_SUPLIB_NT_PROCESS_UNTRUSTED_0;
+                case STATUS_TRUST_FAILURE:
+                    return VERR_SUPLIB_NT_PROCESS_UNTRUSTED_1;
+                case STATUS_TOO_LATE:
+                    return VERR_SUPDRV_HARDENING_EVIL_HANDLE;
                 default:
+                    if (SUP_NT_STATUS_IS_VBOX(rcNt)) /* See VBoxDrvNtErr2NtStatus. */
+                        return SUP_NT_STATUS_TO_VBOX(rcNt);
                     return VERR_VM_DRIVER_OPEN_ERROR;
             }
-
-            return -1 /** @todo define proper error codes for suplibOsInit failure. */;
         }
+        break;
     }
 
     /*
@@ -150,14 +228,21 @@ int suplibOsInit(PSUPLIBDATA pThis, bool fPreInited, bool fUnrestricted)
 
 int suplibOsInstall(void)
 {
-    return suplibOsCreateService();
+    int rc = suplibOsCreateService();
+    if (RT_SUCCESS(rc))
+    {
+        int rc2 = suplibOsStartService();
+        if (rc2 != VINF_SUCCESS)
+            rc = rc2;
+    }
+    return rc;
 }
 
 
 int suplibOsUninstall(void)
 {
     int rc = suplibOsStopService();
-    if (!rc)
+    if (RT_SUCCESS(rc))
         rc = suplibOsDeleteService();
     return rc;
 }
@@ -166,21 +251,22 @@ int suplibOsUninstall(void)
 /**
  * Creates the service.
  *
- * @returns 0 on success.
- * @returns -1 on failure.
+ * @returns VBox status code.
+ * @retval  VWRN_ALREADY_EXISTS if it already exists.
  */
 static int suplibOsCreateService(void)
 {
     /*
      * Assume it didn't exist, so we'll create the service.
      */
-    SC_HANDLE   hSMgrCreate = OpenSCManager(NULL, NULL, SERVICE_CHANGE_CONFIG);
-    DWORD LastError = GetLastError(); NOREF(LastError);
-    AssertMsg(hSMgrCreate, ("OpenSCManager(,,create) failed rc=%d\n", LastError));
-    if (hSMgrCreate)
+    int        rc;
+    SC_HANDLE hSMgrCreate = OpenSCManager(NULL, NULL, SERVICE_CHANGE_CONFIG);
+    DWORD     dwErr = GetLastError();
+    AssertMsg(hSMgrCreate, ("OpenSCManager(,,create) failed dwErr=%d\n", dwErr));
+    if (hSMgrCreate != NULL)
     {
         char szDriver[RTPATH_MAX];
-        int rc = RTPathExecDir(szDriver, sizeof(szDriver) - sizeof("\\VBoxDrv.sys"));
+        rc = RTPathExecDir(szDriver, sizeof(szDriver) - sizeof("\\VBoxDrv.sys"));
         if (RT_SUCCESS(rc))
         {
             strcat(szDriver, "\\VBoxDrv.sys");
@@ -193,34 +279,42 @@ static int suplibOsCreateService(void)
                                                SERVICE_ERROR_NORMAL,
                                                szDriver,
                                                NULL, NULL, NULL, NULL, NULL);
-            DWORD LastError = GetLastError(); NOREF(LastError);
-            AssertMsg(hService, ("CreateService failed! LastError=%Rwa szDriver=%s\n", LastError, szDriver));
-            CloseServiceHandle(hService);
-            CloseServiceHandle(hSMgrCreate);
-            return hService ? 0 : -1;
+            dwErr = GetLastError();
+            if (hService)
+            {
+                CloseServiceHandle(hService);
+                rc = VINF_SUCCESS;
+            }
+            else if (dwErr == ERROR_SERVICE_EXISTS)
+                rc = VWRN_ALREADY_EXISTS;
+            else
+            {
+                AssertMsgFailed(("CreateService failed! dwErr=%Rwa szDriver=%s\n", dwErr, szDriver));
+                rc = RTErrConvertFromWin32(dwErr);
+            }
         }
         CloseServiceHandle(hSMgrCreate);
-        return rc;
     }
-    return -1;
+    else
+        rc = RTErrConvertFromWin32(GetLastError());
+    return rc;
 }
 
 
 /**
  * Stops a possibly running service.
  *
- * @returns 0 on success.
- * @returns -1 on failure.
+ * @returns VBox status code.
  */
 static int suplibOsStopService(void)
 {
     /*
      * Assume it didn't exist, so we'll create the service.
      */
-    int rc = -1;
+    int         rc;
     SC_HANDLE   hSMgr = OpenSCManager(NULL, NULL, SERVICE_STOP | SERVICE_QUERY_STATUS);
-    DWORD LastError = GetLastError(); NOREF(LastError);
-    AssertMsg(hSMgr, ("OpenSCManager(,,delete) failed rc=%d\n", LastError));
+    DWORD       dwErr = GetLastError();
+    AssertMsg(hSMgr, ("OpenSCManager(,,delete) failed dwErr=%d\n", dwErr));
     if (hSMgr)
     {
         SC_HANDLE hService = OpenService(hSMgr, SERVICE_NAME, SERVICE_STOP | SERVICE_QUERY_STATUS);
@@ -232,7 +326,7 @@ static int suplibOsStopService(void)
             SERVICE_STATUS  Status;
             QueryServiceStatus(hService, &Status);
             if (Status.dwCurrentState == SERVICE_STOPPED)
-                rc = 0;
+                rc = VINF_SUCCESS;
             else if (ControlService(hService, SERVICE_CONTROL_STOP, &Status))
             {
                 int iWait = 100;
@@ -242,23 +336,31 @@ static int suplibOsStopService(void)
                     QueryServiceStatus(hService, &Status);
                 }
                 if (Status.dwCurrentState == SERVICE_STOPPED)
-                    rc = 0;
+                    rc = VINF_SUCCESS;
                 else
-                   AssertMsgFailed(("Failed to stop service. status=%d\n", Status.dwCurrentState));
+                {
+                    AssertMsgFailed(("Failed to stop service. status=%d\n", Status.dwCurrentState));
+                    rc = VERR_GENERAL_FAILURE;
+                }
             }
             else
             {
-                DWORD LastError = GetLastError(); NOREF(LastError);
-                AssertMsgFailed(("ControlService failed with LastError=%Rwa. status=%d\n", LastError, Status.dwCurrentState));
+                dwErr = GetLastError();
+                AssertMsgFailed(("ControlService failed with dwErr=%Rwa. status=%d\n", dwErr, Status.dwCurrentState));
+                rc = RTErrConvertFromWin32(dwErr);
             }
             CloseServiceHandle(hService);
         }
-        else if (GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
-            rc = 0;
         else
         {
-            DWORD LastError = GetLastError(); NOREF(LastError);
-            AssertMsgFailed(("OpenService failed LastError=%Rwa\n", LastError));
+            dwErr = GetLastError();
+            if (GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
+                rc = VINF_SUCCESS;
+            else
+            {
+                AssertMsgFailed(("OpenService failed dwErr=%Rwa\n", dwErr));
+                rc = RTErrConvertFromWin32(dwErr);
+            }
         }
         CloseServiceHandle(hSMgr);
     }
@@ -269,18 +371,17 @@ static int suplibOsStopService(void)
 /**
  * Deletes the service.
  *
- * @returns 0 on success.
- * @returns -1 on failure.
+ * @returns VBox status code.
  */
 int suplibOsDeleteService(void)
 {
     /*
      * Assume it didn't exist, so we'll create the service.
      */
-    int rc = -1;
+    int         rc;
     SC_HANDLE   hSMgr = OpenSCManager(NULL, NULL, SERVICE_CHANGE_CONFIG);
-    DWORD LastError = GetLastError(); NOREF(LastError);
-    AssertMsg(hSMgr, ("OpenSCManager(,,delete) failed rc=%d\n", LastError));
+    DWORD       dwErr = GetLastError();
+    AssertMsg(hSMgr, ("OpenSCManager(,,delete) failed rc=%d\n", dwErr));
     if (hSMgr)
     {
         SC_HANDLE hService = OpenService(hSMgr, SERVICE_NAME, DELETE);
@@ -290,20 +391,25 @@ int suplibOsDeleteService(void)
              * Delete the service.
              */
             if (DeleteService(hService))
-                rc = 0;
+                rc = VINF_SUCCESS;
             else
             {
-                DWORD LastError = GetLastError(); NOREF(LastError);
-                AssertMsgFailed(("DeleteService failed LastError=%Rwa\n", LastError));
+                dwErr = GetLastError();
+                AssertMsgFailed(("DeleteService failed dwErr=%Rwa\n", dwErr));
+                rc = RTErrConvertFromWin32(dwErr);
             }
             CloseServiceHandle(hService);
         }
-        else if (GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST)
-            rc = 0;
         else
         {
-            DWORD LastError = GetLastError(); NOREF(LastError);
-            AssertMsgFailed(("OpenService failed LastError=%Rwa\n", LastError));
+            dwErr = GetLastError();
+            if (dwErr == ERROR_SERVICE_DOES_NOT_EXIST)
+                rc = VINF_SUCCESS;
+            else
+            {
+                AssertMsgFailed(("OpenService failed dwErr=%Rwa\n", dwErr));
+                rc = RTErrConvertFromWin32(dwErr);
+            }
         }
         CloseServiceHandle(hSMgr);
     }
@@ -374,9 +480,7 @@ static int suplibOsUpdateService(void)
 /**
  * Attempts to start the service, creating it if necessary.
  *
- * @returns 0 on success.
- * @returns -1 on failure.
- * @param   fRetry  Indicates retry call.
+ * @returns VBox status code.
  */
 static int suplibOsStartService(void)
 {
@@ -386,8 +490,9 @@ static int suplibOsStartService(void)
     SC_HANDLE hSMgr = OpenSCManager(NULL, NULL, SERVICE_QUERY_STATUS | SERVICE_START);
     if (hSMgr == NULL)
     {
-        AssertMsgFailed(("couldn't open service manager in SERVICE_QUERY_CONFIG | SERVICE_QUERY_STATUS mode!\n"));
-        return -1;
+        DWORD dwErr = GetLastError();
+        AssertMsgFailed(("couldn't open service manager in SERVICE_QUERY_CONFIG | SERVICE_QUERY_STATUS mode! (dwErr=%d)\n", dwErr));
+        return RTErrConvertFromWin32(dwErr);
     }
 
     /*
@@ -400,7 +505,7 @@ static int suplibOsStartService(void)
          * Create the service.
          */
         int rc = suplibOsCreateService();
-        if (rc)
+        if (RT_FAILURE(rc))
             return rc;
 
         /*
@@ -412,48 +517,60 @@ static int suplibOsStartService(void)
     /*
      * Check if open and on demand create succeeded.
      */
-    int rc = -1;
+    int rc;
     if (hService)
     {
 
         /*
          * Query service status to see if we need to start it or not.
          */
-        SERVICE_STATUS  Status;
+        SERVICE_STATUS Status;
         BOOL fRc = QueryServiceStatus(hService, &Status);
         Assert(fRc);
-        if (    Status.dwCurrentState != SERVICE_RUNNING
-            &&  Status.dwCurrentState != SERVICE_START_PENDING)
+        if (Status.dwCurrentState == SERVICE_RUNNING)
+            rc = VINF_ALREADY_INITIALIZED;
+        else
         {
+            if (Status.dwCurrentState == SERVICE_START_PENDING)
+                rc = VINF_SUCCESS;
+            else
+            {
+                /*
+                 * Start it.
+                 */
+                if (StartService(hService, 0, NULL))
+                    rc = VINF_SUCCESS;
+                else
+                {
+                    DWORD dwErr = GetLastError();
+                    AssertMsg(fRc, ("StartService failed with dwErr=%Rwa\n", dwErr));
+                    rc = RTErrConvertFromWin32(dwErr);
+                }
+            }
+
             /*
-             * Start it.
+             * Wait for the service to finish starting.
+             * We'll wait for 10 seconds then we'll give up.
              */
-            fRc = StartService(hService, 0, NULL);
-            DWORD LastError = GetLastError(); NOREF(LastError);
-            AssertMsg(fRc, ("StartService failed with LastError=%Rwa\n", LastError));
-        }
-
-        /*
-         * Wait for the service to finish starting.
-         * We'll wait for 10 seconds then we'll give up.
-         */
-        QueryServiceStatus(hService, &Status);
-        if (Status.dwCurrentState == SERVICE_START_PENDING)
-        {
-            int iWait;
-            for (iWait = 100; iWait > 0 && Status.dwCurrentState == SERVICE_START_PENDING; iWait--)
+            QueryServiceStatus(hService, &Status);
+            if (Status.dwCurrentState == SERVICE_START_PENDING)
             {
-                Sleep(100);
-                QueryServiceStatus(hService, &Status);
+                int iWait;
+                for (iWait = 100; iWait > 0 && Status.dwCurrentState == SERVICE_START_PENDING; iWait--)
+                {
+                    Sleep(100);
+                    QueryServiceStatus(hService, &Status);
+                }
+                DWORD dwErr = GetLastError(); NOREF(dwErr);
+                AssertMsg(Status.dwCurrentState != SERVICE_RUNNING,
+                          ("Failed to start. dwErr=%Rwa iWait=%d status=%d\n", dwErr, iWait, Status.dwCurrentState));
             }
-            DWORD LastError = GetLastError(); NOREF(LastError);
-            AssertMsg(Status.dwCurrentState != SERVICE_RUNNING,
-                      ("Failed to start. LastError=%Rwa iWait=%d status=%d\n",
-                       LastError, iWait, Status.dwCurrentState));
-        }
 
-        if (Status.dwCurrentState == SERVICE_RUNNING)
-            rc = 0;
+            if (Status.dwCurrentState == SERVICE_RUNNING)
+                rc = VINF_SUCCESS;
+            else if (RT_SUCCESS_NP(rc))
+                rc = VERR_GENERAL_FAILURE;
+        }
 
         /*
          * Close open handles.
@@ -462,8 +579,9 @@ static int suplibOsStartService(void)
     }
     else
     {
-        DWORD LastError = GetLastError(); NOREF(LastError);
-        AssertMsgFailed(("OpenService failed! LastError=%Rwa\n", LastError));
+        DWORD dwErr = GetLastError();
+        AssertMsgFailed(("OpenService failed! LastError=%Rwa\n", dwErr));
+        rc = RTErrConvertFromWin32(dwErr);
     }
     if (!CloseServiceHandle(hSMgr))
         AssertFailed();
@@ -495,10 +613,28 @@ int suplibOsIOCtl(PSUPLIBDATA pThis, uintptr_t uFunction, void *pvReq, size_t cb
      */
     PSUPREQHDR pHdr = (PSUPREQHDR)pvReq;
     Assert(cbReq == RT_MAX(pHdr->cbIn, pHdr->cbOut));
+# ifdef USE_NT_DEVICE_IO_CONTROL_FILE
+    IO_STATUS_BLOCK Ios;
+    Ios.Status = -1;
+    Ios.Information = 0;
+    NTSTATUS rcNt = NtDeviceIoControlFile((HANDLE)pThis->hDevice, NULL /*hEvent*/, NULL /*pfnApc*/, NULL /*pvApcCtx*/, &Ios,
+                                          (ULONG)uFunction,
+                                          pvReq /*pvInput */, pHdr->cbIn /* cbInput */,
+                                          pvReq /*pvOutput*/, pHdr->cbOut /* cbOutput */);
+    if (NT_SUCCESS(rcNt))
+    {
+        if (NT_SUCCESS(Ios.Status))
+            return VINF_SUCCESS;
+        rcNt = Ios.Status;
+    }
+    return suplibConvertNtStatus(rcNt);
+
+# else
     DWORD cbReturned = (ULONG)pHdr->cbOut;
     if (DeviceIoControl((HANDLE)pThis->hDevice, uFunction, pvReq, pHdr->cbIn, pvReq, cbReturned, &cbReturned, NULL))
         return 0;
     return suplibConvertWin32Err(GetLastError());
+# endif
 }
 
 
@@ -507,10 +643,27 @@ int suplibOsIOCtlFast(PSUPLIBDATA pThis, uintptr_t uFunction, uintptr_t idCpu)
     /*
      * Issue device I/O control.
      */
+# ifdef USE_NT_DEVICE_IO_CONTROL_FILE
+    IO_STATUS_BLOCK Ios;
+    Ios.Status = -1;
+    Ios.Information = 0;
+    NTSTATUS rcNt = NtDeviceIoControlFile((HANDLE)pThis->hDevice, NULL /*hEvent*/, NULL /*pfnApc*/, NULL /*pvApcCtx*/, &Ios,
+                                          (ULONG)uFunction,
+                                          NULL /*pvInput */, 0 /* cbInput */,
+                                          (PVOID)idCpu /*pvOutput*/, 0 /* cbOutput */);
+    if (NT_SUCCESS(rcNt))
+    {
+        if (NT_SUCCESS(Ios.Status))
+            return VINF_SUCCESS;
+        rcNt = Ios.Status;
+    }
+    return suplibConvertNtStatus(rcNt);
+# else
     DWORD cbReturned = 0;
     if (DeviceIoControl((HANDLE)pThis->hDevice, uFunction, NULL, 0, (LPVOID)idCpu, 0, &cbReturned, NULL))
         return VINF_SUCCESS;
     return suplibConvertWin32Err(GetLastError());
+# endif
 }
 
 
@@ -520,7 +673,7 @@ int suplibOsPageAlloc(PSUPLIBDATA pThis, size_t cPages, void **ppvPages)
     *ppvPages = VirtualAlloc(NULL, (size_t)cPages << PAGE_SHIFT, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
     if (*ppvPages)
         return VINF_SUCCESS;
-    return suplibConvertWin32Err(GetLastError());
+    return RTErrConvertFromWin32(GetLastError());
 }
 
 
@@ -529,10 +682,11 @@ int suplibOsPageFree(PSUPLIBDATA pThis, void *pvPages, size_t /* cPages */)
     NOREF(pThis);
     if (VirtualFree(pvPages, 0, MEM_RELEASE))
         return VINF_SUCCESS;
-    return suplibConvertWin32Err(GetLastError());
+    return RTErrConvertFromWin32(GetLastError());
 }
 
 
+# ifndef USE_NT_DEVICE_IO_CONTROL_FILE
 /**
  * Converts a supdrv win32 error code to an IPRT status code.
  *
@@ -584,6 +738,36 @@ static int suplibConvertWin32Err(int rc)
     /* fall back on the default conversion. */
     return RTErrConvertFromWin32(rc);
 }
+# else
+/**
+ * Reverse of VBoxDrvNtErr2NtStatus
+ * returns VBox status code.
+ * @param   rcNt    NT status code.
+ */
+static int suplibConvertNtStatus(NTSTATUS rcNt)
+{
+    switch (rcNt)
+    {
+        case STATUS_SUCCESS:                    return VINF_SUCCESS;
+        case STATUS_NOT_SUPPORTED:              return VERR_GENERAL_FAILURE;
+        case STATUS_INVALID_PARAMETER:          return VERR_INVALID_PARAMETER;
+        case STATUS_UNKNOWN_REVISION:           return VERR_INVALID_MAGIC;
+        case STATUS_INVALID_HANDLE:             return VERR_INVALID_HANDLE;
+        case STATUS_INVALID_ADDRESS:            return VERR_INVALID_POINTER;
+        case STATUS_NOT_LOCKED:                 return VERR_LOCK_FAILED;
+        case STATUS_IMAGE_ALREADY_LOADED:       return VERR_ALREADY_LOADED;
+        case STATUS_ACCESS_DENIED:              return VERR_PERMISSION_DENIED;
+        case STATUS_REVISION_MISMATCH:          return VERR_VERSION_MISMATCH;
+    }
+
+    /* See VBoxDrvNtErr2NtStatus. */
+    if (SUP_NT_STATUS_IS_VBOX(rcNt))
+        return SUP_NT_STATUS_TO_VBOX(rcNt);
+
+    /* Fall back on IPRT for the rest. */
+    return RTErrConvertFromNtStatus(rcNt);
+}
+# endif
 
 #endif /* !IN_SUP_HARDENED_R3 */
 
diff --git a/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
new file mode 100644
index 0000000..f9d6b66
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
@@ -0,0 +1,1775 @@
+/* $Id: SUPR3HardenedMain-win.cpp $ */
+/** @file
+ * VirtualBox Support Library - Hardened main(), windows bits.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+#include <AccCtrl.h>
+#include <AclApi.h>
+#ifndef PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION        0x2000
+#endif
+#ifndef LOAD_LIBRARY_SEARCH_APPLICATION_DIR
+# define LOAD_LIBRARY_SEARCH_APPLICATION_DIR    0x200
+# define LOAD_LIBRARY_SEARCH_SYSTEM32           0x800
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/ctype.h>
+#include <iprt/string.h>
+#include <iprt/initterm.h>
+#include <iprt/param.h>
+
+#include "SUPLibInternal.h"
+#include "win/SUPHardenedVerify-win.h"
+#include "../SUPDrvIOC.h"
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The first argument of a respawed stub argument.
+ * This just needs to be unique enough to avoid most confusion with real
+ * executable names,  there are other checks in place to make sure we've respanwed. */
+#define SUPR3_RESPAWN_ARG0  "81954AF5-4D2F-31EB-A142-B7AF187A1C41-suplib-2ndchild"
+
+/** Unconditional assertion. */
+#define SUPR3HARDENED_ASSERT(a_Expr) \
+    do { \
+        if (!(a_Expr)) \
+            supR3HardenedFatal("%s: %s", __FUNCTION__, #a_Expr); \
+    } while (0)
+
+/** Unconditional assertion of NT_SUCCESS. */
+#define SUPR3HARDENED_ASSERT_NT_SUCCESS(a_Expr) \
+    do { \
+        NTSTATUS rcNtAssert = (a_Expr); \
+        if (!NT_SUCCESS(rcNtAssert)) \
+            supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, rcNtAssert); \
+    } while (0)
+
+/** Unconditional assertion of a WIN32 API returning non-FALSE. */
+#define SUPR3HARDENED_ASSERT_WIN32_SUCCESS(a_Expr) \
+    do { \
+        BOOL fRcAssert = (a_Expr); \
+        if (fRcAssert == FALSE) \
+            supR3HardenedFatal("%s: %s -> %#x", __FUNCTION__, #a_Expr, GetLastError()); \
+    } while (0)
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Security descriptor cleanup structure.
+ */
+typedef struct MYSECURITYCLEANUP
+{
+    union
+    {
+        SID                 Sid;
+        uint8_t             abPadding[SECURITY_MAX_SID_SIZE];
+    }                       Everyone, Owner, User, Login;
+    union
+    {
+        ACL                 AclHdr;
+        uint8_t             abPadding[1024];
+    }                       Acl;
+    PSECURITY_DESCRIPTOR    pSecDesc;
+} MYSECURITYCLEANUP;
+/** Pointer to security cleanup structure. */
+typedef MYSECURITYCLEANUP *PMYSECURITYCLEANUP;
+
+
+/**
+ * Image verifier cache entry.
+ */
+typedef struct VERIFIERCACHEENTRY
+{
+    /** Pointer to the next entry with the same hash value. */
+    struct VERIFIERCACHEENTRY * volatile pNext;
+    /** The file handle. */
+    HANDLE                  hFile;
+    /** If fIndexNumber is set, this is an file system internal file identifier. */
+    LARGE_INTEGER           IndexNumber;
+    /** The path hash value. */
+    uint32_t                uHash;
+    /** The verification result. */
+    int                     rc;
+    /** Whether IndexNumber is valid  */
+    bool                    fIndexNumberValid;
+    /** cwcPath * sizeof(RTUTF16). */
+    uint16_t                cbPath;
+    /** The full path of this entry (variable size).  */
+    RTUTF16                 wszPath[1];
+} VERIFIERCACHEENTRY;
+/** Pointer to an image verifier path entry. */
+typedef VERIFIERCACHEENTRY *PVERIFIERCACHEENTRY;
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** @name Global variables initialized by suplibHardenedWindowsMain.
+ * @{ */
+/** Combined windows NT version number.  See SUP_MAKE_NT_VER_COMBINED. */
+uint32_t                    g_uNtVerCombined = 0;
+/** Count calls to the special main function for linking santity checks. */
+static uint32_t volatile    g_cSuplibHardenedWindowsMainCalls;
+/** The UTF-16 windows path to the executable. */
+RTUTF16                     g_wszSupLibHardenedExePath[1024];
+/** The NT path of the executable. */
+SUPSYSROOTDIRBUF            g_SupLibHardenedExeNtPath;
+/** The offset into g_SupLibHardenedExeNtPath of the executable name (WCHAR,
+ * not byte). This also gives the length of the exectuable directory path,
+ * including a trailing slash. */
+uint32_t                    g_offSupLibHardenedExeNtName;
+/** @} */
+
+/** @name Hook related variables.
+ * @{ */
+/** The jump back address of the patched NtCreateSection. */
+extern "C" PFNRT            g_pfnNtCreateSectionJmpBack = NULL;
+/** Pointer to the bit of assembly code that will perform the original
+ *  NtCreateSection operation. */
+static NTSTATUS (NTAPI *    g_pfnNtCreateSectionReal)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
+                                                      PLARGE_INTEGER, ULONG, ULONG, HANDLE);
+/** The hash table of verifier cache . */
+static VERIFIERCACHEENTRY * volatile g_apVerifierCache[128];
+/** @ */
+
+/** Static error info structure used during init. */
+static RTERRINFOSTATIC      g_ErrInfoStatic;
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+#ifdef RT_ARCH_AMD64
+# define SYSCALL(a_Num) DECLASM(void) RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num)(void)
+# include "NtCreateSection-template-amd64-syscall-type-1.h"
+# undef SYSCALL
+#endif
+#ifdef RT_ARCH_X86
+# define SYSCALL(a_Num) DECLASM(void) RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num)(void)
+# include "NtCreateSection-template-x86-syscall-type-1.h"
+# undef SYSCALL
+#endif
+
+
+
+/**
+ * Simple wide char search routine.
+ *
+ * @returns Pointer to the first location of @a wcNeedle in @a pwszHaystack.
+ *          NULL if not found.
+ * @param   pwszHaystack    Pointer to the string that should be searched.
+ * @param   wcNeedle        The character to search for.
+ */
+static PRTUTF16 suplibHardenedWStrChr(PCRTUTF16 pwszHaystack, RTUTF16 wcNeedle)
+{
+    for (;;)
+    {
+        RTUTF16 wcCur = *pwszHaystack;
+        if (wcCur == wcNeedle)
+            return (PRTUTF16)pwszHaystack;
+        if (wcCur == '\0')
+            return NULL;
+        pwszHaystack++;
+    }
+}
+
+
+/**
+ * Simple wide char string length routine.
+ *
+ * @returns The number of characters in the given string. (Excludes the
+ *          terminator.)
+ * @param   pwsz            The string.
+ */
+static size_t suplibHardenedWStrLen(PCRTUTF16 pwsz)
+{
+    PCRTUTF16 pwszCur = pwsz;
+    while (*pwszCur != '\0')
+        pwszCur++;
+    return pwszCur - pwsz;
+}
+
+
+/**
+ * Allocate zero filled memory on the heap.
+ *
+ * @returns Pointer to the memory.  Will never return NULL, triggers a fatal
+ *          error instead.
+ * @param   cb                  The number of bytes to allocate.
+ */
+DECLHIDDEN(void *) suplibHardenedAllocZ(size_t cb)
+{
+    void *pv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb);
+    if (!pv)
+        supR3HardenedFatal("HeapAlloc failed to allocate %zu bytes.\n", cb);
+    return pv;
+}
+
+
+/**
+ * Reallocates memory on the heap.
+ *
+ * @returns Pointer to the resized memory block.  Will never return NULL,
+ *          triggers a fatal error instead.
+ * @param   pvOld               The old memory block.
+ * @param   cbNew               The new block size.
+ */
+DECLHIDDEN(void *) suplibHardenedReAlloc(void *pvOld, size_t cbNew)
+{
+    if (!pvOld)
+        return suplibHardenedAllocZ(cbNew);
+    void *pv = HeapReAlloc(GetProcessHeap(), 0 /*dwFlags*/, pvOld, cbNew);
+    if (!pv)
+        supR3HardenedFatal("HeapReAlloc failed to allocate %zu bytes.\n", cbNew);
+    return pv;
+}
+
+
+/**
+ * Frees memory allocated by suplibHardenedAlloc, suplibHardenedAllocZ or
+ * suplibHardenedReAlloc.
+ *
+ * @param   pv                  Pointer to the memeory to be freed.
+ */
+DECLHIDDEN(void) suplibHardenedFree(void *pv)
+{
+    if (pv)
+        HeapFree(GetProcessHeap(), 0 /* dwFlags*/, pv);
+}
+
+
+/**
+ * Wrapper around LoadLibraryEx that deals with the UTF-8 to UTF-16 conversion
+ * and supplies the right flags.
+ *
+ * @returns Module handle on success, NULL on failure.
+ * @param   pszName             The full path to the DLL.
+ * @param   fSystem32Only       Whether to only look for imports in the system32
+ *                              directory.  If set to false, the application
+ *                              directory is also searched.
+ */
+DECLHIDDEN(void *) supR3HardenedWinLoadLibrary(const char *pszName, bool fSystem32Only)
+{
+    WCHAR wszPath[RTPATH_MAX];
+    PRTUTF16 pwszPath = wszPath;
+    int rc = RTStrToUtf16Ex(pszName, RTSTR_MAX, &pwszPath, RT_ELEMENTS(wszPath), NULL);
+    if (RT_SUCCESS(rc))
+    {
+        while (*pwszPath)
+        {
+            if (*pwszPath == '/')
+                *pwszPath = '\\';
+            pwszPath++;
+        }
+
+        DWORD fFlags = 0;
+        if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0))
+        {
+           fFlags |= LOAD_LIBRARY_SEARCH_SYSTEM32;
+           if (!fSystem32Only)
+               fFlags |= LOAD_LIBRARY_SEARCH_APPLICATION_DIR;
+        }
+
+        void *pvRet = (void *)LoadLibraryExW(wszPath, NULL /*hFile*/, fFlags);
+
+        /* Vista, W7, W2K8R might not work without KB2533623, so retry with no flags. */
+        if (   !pvRet
+            && fFlags
+            && g_uNtVerCombined < SUP_MAKE_NT_VER_SIMPLE(6, 2)
+            && GetLastError() == ERROR_INVALID_PARAMETER)
+            pvRet = (void *)LoadLibraryExW(wszPath, NULL /*hFile*/, 0);
+
+        return pvRet;
+    }
+    supR3HardenedFatal("RTStrToUtf16Ex failed on '%s': %Rrc", pszName, rc);
+    return NULL;
+}
+
+
+/**
+ * Gets the internal index number of the file.
+ *
+ * @returns True if we got an index number, false if not.
+ * @param   hFile           The file in question.
+ * @param   pIndexNumber    where to return the index number.
+ */
+static bool supR3HardenedWinVerifyCacheGetIndexNumber(HANDLE hFile, PLARGE_INTEGER pIndexNumber)
+{
+    IO_STATUS_BLOCK Ios = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+    NTSTATUS rcNt = NtQueryInformationFile(hFile, &Ios, pIndexNumber, sizeof(*pIndexNumber), FileInternalInformation);
+    if (NT_SUCCESS(rcNt))
+        rcNt = Ios.Status;
+#ifdef DEBUG_bird
+    if (!NT_SUCCESS(rcNt))
+        __debugbreak();
+#endif
+    return NT_SUCCESS(rcNt) && pIndexNumber->QuadPart != 0;
+}
+
+
+/**
+ * Calculates the hash value for the given UTF-16 string.
+ *
+ * @returns Hash value.
+ * @param   pUniStr             String to hash.
+ */
+static uint32_t supR3HardenedWinVerifyCacheHashPath(PCUNICODE_STRING pUniStr)
+{
+    uint32_t uHash   = 0;
+    unsigned cwcLeft = pUniStr->Length / sizeof(WCHAR);
+    PRTUTF16 pwc     = pUniStr->Buffer;
+
+    while (cwcLeft-- > 0)
+    {
+        RTUTF16 wc = *pwc++;
+        uHash = wc + (uHash << 6) + (uHash << 16) - uHash;
+    }
+    return uHash;
+}
+
+
+/**
+ * Inserts the given verifier result into the cache.
+ *
+ * @param   pUniStr             The full path of the image.
+ * @param   hFile               The file handle - must either be entered into
+ *                              the cache or closed.
+ * @param   rc                  The verifier result.
+ * @param   fCacheable          Whether this is a cacheable result.  Passed in
+ *                              here instead of being handled by the caller to
+ *                              save code duplication.
+ */
+static void supR3HardenedWinVerifyCacheInsert(PCUNICODE_STRING pUniStr, HANDLE hFile, int rc, bool fCacheable)
+{
+    /*
+     * Don't cache anything until we've got the WinVerifyTrust API up and running.
+     */
+    if (   g_enmSupR3HardenedMainState >= SUPR3HARDENEDMAINSTATE_VERIFY_TRUST_READY
+        && fCacheable)
+    {
+        /*
+         * Allocate and initalize a new entry.
+         */
+        PVERIFIERCACHEENTRY pEntry = (PVERIFIERCACHEENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                                                    sizeof(VERIFIERCACHEENTRY) + pUniStr->Length);
+        if (pEntry)
+        {
+            pEntry->pNext   = NULL;
+            pEntry->hFile   = hFile;
+            pEntry->rc      = rc;
+            pEntry->uHash   = supR3HardenedWinVerifyCacheHashPath(pUniStr);
+            pEntry->cbPath  = pUniStr->Length;
+            memcpy(pEntry->wszPath, pUniStr->Buffer, pUniStr->Length);
+            pEntry->wszPath[pUniStr->Length / sizeof(WCHAR)] = '\0';
+            pEntry->fIndexNumberValid = supR3HardenedWinVerifyCacheGetIndexNumber(hFile, &pEntry->IndexNumber);
+
+            /*
+             * Try insert it, careful with concurrent code as well as potential duplicates.
+             */
+            uint32_t iHashTab = pEntry->uHash % RT_ELEMENTS(g_apVerifierCache);
+            VERIFIERCACHEENTRY * volatile *ppEntry = &g_apVerifierCache[iHashTab];
+            for (;;)
+            {
+                if (ASMAtomicCmpXchgPtr(ppEntry, pEntry, NULL))
+                    return;
+                PVERIFIERCACHEENTRY pOther = *ppEntry;
+                if (!pOther)
+                    continue;
+                if (   pOther->uHash  == pEntry->uHash
+                    && pOther->cbPath == pEntry->cbPath
+                    && memcmp(pOther->wszPath, pEntry->wszPath, pEntry->cbPath) == 0)
+                    break;
+                ppEntry = &pOther->pNext;
+            }
+
+            /* Duplicate entry. */
+#ifdef DEBUG_bird
+            __debugbreak();
+#endif
+            HeapFree(GetProcessHeap(), 0 /* dwFlags*/, pEntry);
+        }
+    }
+    NtClose(hFile);
+}
+
+
+/**
+ * Looks up an entry in the verifier hash table.
+ *
+ * @return  Pointer to the entry on if found, NULL if not.
+ * @param   pUniStr             The full path of the image.
+ * @param   hFile               The file handle.
+ */
+static PVERIFIERCACHEENTRY supR3HardenedWinVerifyCacheLookup(PCUNICODE_STRING pUniStr, HANDLE hFile)
+{
+    PRTUTF16 const      pwszPath = pUniStr->Buffer;
+    uint16_t const      cbPath   = pUniStr->Length;
+    uint32_t            uHash    = supR3HardenedWinVerifyCacheHashPath(pUniStr);
+    uint32_t            iHashTab = uHash % RT_ELEMENTS(g_apVerifierCache);
+    PVERIFIERCACHEENTRY pCur     = g_apVerifierCache[iHashTab];
+    while (pCur)
+    {
+        if (   pCur->uHash  == uHash
+            && pCur->cbPath == cbPath
+            && memcmp(pCur->wszPath, pwszPath, cbPath) == 0)
+        {
+
+            if (!pCur->fIndexNumberValid)
+                return pCur;
+            LARGE_INTEGER IndexNumber;
+            bool fIndexNumberValid = supR3HardenedWinVerifyCacheGetIndexNumber(hFile, &IndexNumber);
+            if (   fIndexNumberValid
+                && IndexNumber.QuadPart == pCur->IndexNumber.QuadPart)
+                return pCur;
+#ifdef DEBUG_bird
+            __debugbreak();
+#endif
+        }
+        pCur = pCur->pNext;
+    }
+    return NULL;
+}
+
+
+/**
+ * Hook that monitors NtCreateSection calls.
+ *
+ * @returns NT status code.
+ * @param   phSection           Where to return the section handle.
+ * @param   fAccess             The desired access.
+ * @param   pObjAttribs         The object attributes (optional).
+ * @param   pcbSection          The section size (optional).
+ * @param   fProtect            The max section protection.
+ * @param   fAttribs            The section attributes.
+ * @param   hFile               The file to create a section from (optional).
+ */
+static NTSTATUS NTAPI
+supR3HardenedMonitor_NtCreateSection(PHANDLE phSection, ACCESS_MASK fAccess, POBJECT_ATTRIBUTES pObjAttribs,
+                                     PLARGE_INTEGER pcbSection, ULONG fProtect, ULONG fAttribs, HANDLE hFile)
+{
+    if (   hFile != NULL
+        && hFile != INVALID_HANDLE_VALUE)
+    {
+        bool const fImage    = RT_BOOL(fAttribs & (SEC_IMAGE | SEC_PROTECTED_IMAGE));
+        bool const fExecMap  = RT_BOOL(fAccess & SECTION_MAP_EXECUTE);
+        bool const fExecProt = RT_BOOL(fProtect & (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_WRITECOPY
+                                                   | PAGE_EXECUTE_READWRITE));
+        if (fImage || fExecMap || fExecProt)
+        {
+            /*
+             * Query the name of the file, making sure to zero terminator the
+             * string. (2nd half of buffer is used for error info, see below.)
+             */
+            union
+            {
+                UNICODE_STRING UniStr;
+                uint8_t abBuffer[sizeof(UNICODE_STRING) + 2048 * sizeof(WCHAR)];
+            } uBuf;
+            RT_ZERO(uBuf);
+            ULONG cbNameBuf;
+            NTSTATUS rcNt = NtQueryObject(hFile, ObjectNameInformation, &uBuf, sizeof(uBuf) - sizeof(WCHAR) - 128, &cbNameBuf);
+            if (!NT_SUCCESS(rcNt))
+            {
+                supR3HardenedError(VINF_SUCCESS, false,
+                                   "supR3HardenedMonitor_NtCreateSection: NtQueryObject -> %#x (fImage=%d fExecMap=%d fExecProt=%d)\n",
+                                   fImage, fExecMap, fExecProt);
+                return rcNt;
+            }
+
+            /*
+             * Check the cache.
+             */
+            PVERIFIERCACHEENTRY pCacheHit = supR3HardenedWinVerifyCacheLookup(&uBuf.UniStr, hFile);
+            if (pCacheHit)
+            {
+                SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: cache hit (%Rrc) on %ls\n", pCacheHit->rc, pCacheHit->wszPath));
+                if (RT_SUCCESS(pCacheHit->rc))
+                    return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+                supR3HardenedError(VINF_SUCCESS, false,
+                                   "supR3HardenedMonitor_NtCreateSection: cached rc=%Rrc fImage=%d fExecMap=%d fExecProt=%d %ls\n",
+                                   pCacheHit->rc, fImage, fExecMap, fExecProt, uBuf.UniStr.Buffer);
+                return STATUS_TRUST_FAILURE;
+            }
+
+            /*
+             * On XP the loader might hand us handles with just FILE_EXECUTE and
+             * SYNCRHONIZE, the means reading will fail later on.  So, we might
+             * have to reopen the file here in order to validate it - annoying.
+             */
+            HANDLE hMyFile = NULL;
+            rcNt = NtDuplicateObject(NtCurrentProcess(), hFile, NtCurrentProcess(),
+                                     &hMyFile,
+                                     FILE_READ_DATA | SYNCHRONIZE,
+                                     0 /* Handle attributes*/, 0 /* Options */);
+            if (!NT_SUCCESS(rcNt))
+            {
+                if (rcNt == STATUS_ACCESS_DENIED)
+                {
+                    HANDLE              hFile = RTNT_INVALID_HANDLE_VALUE;
+                    IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+                    OBJECT_ATTRIBUTES   ObjAttr;
+                    InitializeObjectAttributes(&ObjAttr, &uBuf.UniStr, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+                    rcNt = NtCreateFile(&hMyFile,
+                                        FILE_READ_DATA | SYNCHRONIZE,
+                                        &ObjAttr,
+                                        &Ios,
+                                        NULL /* Allocation Size*/,
+                                        FILE_ATTRIBUTE_NORMAL,
+                                        FILE_SHARE_READ,
+                                        FILE_OPEN,
+                                        FILE_NON_DIRECTORY_FILE,
+                                        NULL /*EaBuffer*/,
+                                        0 /*EaLength*/);
+                    if (NT_SUCCESS(rcNt))
+                        rcNt = Ios.Status;
+                    if (!NT_SUCCESS(rcNt))
+                    {
+                        supR3HardenedError(VINF_SUCCESS, false,
+                                           "supR3HardenedMonitor_NtCreateSection: Failed to duplicate and open the file: rcNt=%#x hFile=%p %ls\n",
+                                           rcNt, hFile, uBuf.UniStr.Buffer);
+                        return rcNt;
+                    }
+                }
+                else
+                {
+#ifdef DEBUG
+
+                    supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_NtCreateSection: NtDuplicateObject(,%#x,) failed: %#x\n", hFile, rcNt);
+#endif
+                    hMyFile = hFile;
+                }
+            }
+
+            /*
+             * Special Kludge for Windows XP and W2K3 and their stupid attempts
+             * at mapping a hidden XML file called c:\Windows\WindowsShell.Manifest
+             * with executable access.  The image bit isn't set, fortunately.
+             */
+            if (   !fImage
+                && uBuf.UniStr.Length > g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)
+                && memcmp(uBuf.UniStr.Buffer, g_System32NtPath.UniStr.Buffer,
+                          g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)) == 0)
+            {
+                PRTUTF16 pwszName = &uBuf.UniStr.Buffer[(g_System32NtPath.UniStr.Length - sizeof(L"System32") + sizeof(WCHAR)) / sizeof(WCHAR)];
+                if (RTUtf16ICmpAscii(pwszName, "WindowsShell.Manifest") == 0)
+                {
+                    /*
+                     * Drop all executable access to the mapping and let it continue.
+                     */
+                    SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: Applying the drop-exec-kludge for '%ls'\n", uBuf.UniStr.Buffer));
+                    if (fAccess & SECTION_MAP_EXECUTE)
+                        fAccess = (fAccess & ~SECTION_MAP_EXECUTE) | SECTION_MAP_READ;
+                    if (fProtect & PAGE_EXECUTE)
+                        fProtect = (fProtect & ~PAGE_EXECUTE) | PAGE_READONLY;
+                    fProtect = (fProtect & ~UINT32_C(0xf0)) | ((fProtect & UINT32_C(0xe0)) >> 4);
+                    return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+                }
+            }
+
+            /*
+             * Check the path.  We don't allow DLLs to be loaded from just anywhere:
+             *      1. System32   - normal code or cat signing.
+             *      2. WinSxS     - normal code or cat signing.
+             *      3. VirtualBox - kernel code signing and integrity checks.
+             */
+            bool fSystem32 = false;
+            Assert(g_SupLibHardenedExeNtPath.UniStr.Buffer[g_offSupLibHardenedExeNtName - 1] == '\\');
+            uint32_t fFlags = 0;
+            if (   uBuf.UniStr.Length > g_System32NtPath.UniStr.Length
+                && memcmp(uBuf.UniStr.Buffer, g_System32NtPath.UniStr.Buffer, g_System32NtPath.UniStr.Length) == 0
+                && uBuf.UniStr.Buffer[g_System32NtPath.UniStr.Length / sizeof(WCHAR)] == '\\')
+            {
+                fSystem32 = true;
+                fFlags |= SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION;
+            }
+            else if (   uBuf.UniStr.Length > g_WinSxSNtPath.UniStr.Length
+                     && memcmp(uBuf.UniStr.Buffer, g_WinSxSNtPath.UniStr.Buffer, g_WinSxSNtPath.UniStr.Length) == 0
+                     && uBuf.UniStr.Buffer[g_WinSxSNtPath.UniStr.Length / sizeof(WCHAR)] == '\\')
+                fFlags |= SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION;
+            else if (   uBuf.UniStr.Length > g_offSupLibHardenedExeNtName
+                     && memcmp(uBuf.UniStr.Buffer, g_SupLibHardenedExeNtPath.UniStr.Buffer,
+                               g_offSupLibHardenedExeNtName * sizeof(WCHAR)) == 0)
+                fFlags |= SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING | SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT;
+#ifdef VBOX_PERMIT_MORE
+            else if (supHardViIsAppPatchDir(uBuf.UniStr.Buffer, uBuf.UniStr.Length / sizeof(WCHAR)))
+                fFlags |= SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION;
+#endif
+#ifdef VBOX_PERMIT_VISUAL_STUDIO_PROFILING
+            /* Hack to allow profiling our code with Visual Studio. */
+            else if (   uBuf.UniStr.Length > sizeof(L"\\SamplingRuntime.dll")
+                     && memcmp(uBuf.UniStr.Buffer + (uBuf.UniStr.Length - sizeof(L"\\SamplingRuntime.dll") + sizeof(WCHAR)) / sizeof(WCHAR),
+                               L"\\SamplingRuntime.dll", sizeof(L"\\SamplingRuntime.dll") - sizeof(WCHAR)) == 0 )
+            {
+                if (hMyFile != hFile)
+                    NtClose(hMyFile);
+                return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+            }
+#endif
+            else
+            {
+                supR3HardenedError(VINF_SUCCESS, false,
+                                   "supR3HardenedMonitor_NtCreateSection: Not a trusted location: '%ls' (fImage=%d fExecMap=%d fExecProt=%d)\n",
+                                    uBuf.UniStr.Buffer, fImage, fExecMap, fExecProt);
+                if (hMyFile != hFile)
+                    NtClose(hMyFile);
+                return STATUS_TRUST_FAILURE;
+            }
+
+            /*
+             * Do the verification. For better error message we borrow what's
+             * left of the path buffer for an RTERRINFO buffer.
+             */
+            RTERRINFO ErrInfo;
+            RTErrInfoInit(&ErrInfo, (char *)&uBuf.abBuffer[cbNameBuf], sizeof(uBuf) - cbNameBuf);
+
+            bool fCacheable = true;
+            int rc = supHardenedWinVerifyImageByHandle(hMyFile, uBuf.UniStr.Buffer, fFlags, &fCacheable, &ErrInfo);
+            if (RT_FAILURE(rc))
+            {
+                supR3HardenedError(VINF_SUCCESS, false,
+                                   "supR3HardenedMonitor_NtCreateSection: rc=%Rrc fImage=%d fExecMap=%d fExecProt=%d %ls: %s\n",
+                                   rc, fImage, fExecMap, fExecProt, uBuf.UniStr.Buffer, ErrInfo.pszMsg);
+                if (hMyFile != hFile)
+                    NtClose(hMyFile);
+                return STATUS_TRUST_FAILURE;
+            }
+            if (hMyFile != hFile)
+                supR3HardenedWinVerifyCacheInsert(&uBuf.UniStr, hMyFile, rc, fCacheable);
+        }
+    }
+
+    /*
+     * Call checked out OK, call the original.
+     */
+    return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
+}
+
+
+#ifdef RT_ARCH_AMD64
+/**
+ * Tries to allocate memory between @a uStart and @a uEnd.
+ *
+ * @returns Pointer to the memory on success.  NULL on failure.
+ * @param   uStart              The start address.
+ * @param   uEnd                The end address.  This is lower than @a uStart
+ *                              if @a iDirection is negative, and higher if
+ *                              positive.
+ * @param   iDirection          The search direction.
+ * @param   cbAlloc             The number of bytes to allocate.
+ */
+static void *supR3HardenedWinAllocHookMemory(uintptr_t uStart, uintptr_t uEnd, intptr_t iDirection, size_t cbAlloc)
+{
+    size_t const cbAllocGranularity    = _64K;
+    size_t const uAllocGranularityMask = ~(cbAllocGranularity - 1);
+    HANDLE const hProc                 = GetCurrentProcess();
+
+    /*
+     * Make uEnd the last valid return address.
+     */
+    if (iDirection > 0)
+    {
+        SUPR3HARDENED_ASSERT(uEnd > cbAlloc);
+        uEnd -= cbAlloc;
+        uEnd &= uAllocGranularityMask;
+    }
+    else
+        uEnd = RT_ALIGN_Z(uEnd, cbAllocGranularity);
+
+    /*
+     * Search for free memory.
+     */
+    uintptr_t uCur = uStart & uAllocGranularityMask;
+    for (;;)
+    {
+        /*
+         * Examine the memory at this address, if it's free, try make the allocation here.
+         */
+        SIZE_T                      cbIgn;
+        MEMORY_BASIC_INFORMATION    MemInfo;
+        SUPR3HARDENED_ASSERT_NT_SUCCESS(NtQueryVirtualMemory(hProc,
+                                                             (void *)uCur,
+                                                             MemoryBasicInformation,
+                                                             &MemInfo,
+                                                             sizeof(MemInfo),
+                                                             &cbIgn));
+        if (   MemInfo.State      == MEM_FREE
+            && MemInfo.RegionSize >= cbAlloc)
+        {
+            for (;;)
+            {
+                SUPR3HARDENED_ASSERT((uintptr_t)MemInfo.BaseAddress <= uCur);
+                void *pvMem = VirtualAllocEx(hProc, (void *)uCur, cbAlloc, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
+                if (pvMem)
+                {
+                    if (  iDirection > 0
+                        ?    (uintptr_t)pvMem >= uStart
+                          && (uintptr_t)pvMem <= uEnd
+                        :    (uintptr_t)pvMem >= uEnd
+                          && (uintptr_t)pvMem <= uStart)
+                        return pvMem;
+                    VirtualFreeEx(hProc, pvMem, cbAlloc, MEM_RELEASE);
+                }
+
+                /* Advance within the free area and try again? */
+                uintptr_t uNext = iDirection > 0 ? uCur + cbAllocGranularity : uCur - cbAllocGranularity;
+                uNext &= uAllocGranularityMask;
+                if (  iDirection > 0
+                    ?    uNext <= uCur
+                      || uNext >  uEnd
+                      || uNext - (uintptr_t)MemInfo.BaseAddress > MemInfo.RegionSize
+                      || MemInfo.RegionSize - (uNext - (uintptr_t)MemInfo.BaseAddress) < cbAlloc
+                    :    uNext >= uCur
+                      || uNext <  uEnd
+                      || uNext <  (uintptr_t)MemInfo.BaseAddress)
+                    break;
+                uCur = uNext;
+            }
+        }
+
+        /*
+         * Advance to the next memory region.
+         */
+        if (iDirection > 0)
+        {
+            uCur = (uintptr_t)MemInfo.BaseAddress + MemInfo.RegionSize;
+            uCur = RT_ALIGN_Z(uCur, cbAllocGranularity);
+            if (uCur >= uEnd)
+                break;
+        }
+        else
+        {
+            uCur = (uintptr_t)(MemInfo.AllocationBase ? MemInfo.AllocationBase : MemInfo.BaseAddress);
+            if (uCur > uEnd)
+                uCur -= cbAlloc;
+            uCur &= uAllocGranularityMask;
+            if (uCur < uEnd)
+                break;
+        }
+    }
+    return NULL;
+}
+#endif
+
+
+/**
+ * Install hooks for intercepting calls dealing with mapping shared libraries
+ * into the process.
+ *
+ * This allows us to prevent undesirable shared libraries from being loaded.
+ *
+ * @remarks We assume we're alone in this process, so no seralizing trickery is
+ *          necessary when installing the patch.
+ */
+DECLHIDDEN(void) supR3HardenedWinInstallHooks(void)
+{
+#ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+    /*
+     * Install a anti debugging hack before we continue.  This prevents most
+     * notifications from ending up in the debugger.
+     */
+    NTSTATUS rcNt = NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);
+    if (!NT_SUCCESS(rcNt))
+        supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+                              "NtSetInformationThread/ThreadHideFromDebugger failed: %#x\n", rcNt);
+#endif
+
+    /*
+     * Locate the routine.
+     */
+    HMODULE hmodNtDll = GetModuleHandleW(L"NTDLL");
+    SUPR3HARDENED_ASSERT(hmodNtDll != NULL);
+
+    FARPROC pfnNtCreateSection = GetProcAddress(hmodNtDll, "NtCreateSection");
+    SUPR3HARDENED_ASSERT(pfnNtCreateSection != NULL);
+    SUPR3HARDENED_ASSERT(pfnNtCreateSection == (FARPROC)NtCreateSection);
+
+    uint8_t * const pbNtCreateSection = (uint8_t *)(uintptr_t)pfnNtCreateSection;
+
+#ifdef RT_ARCH_AMD64
+    /*
+     * For 64-bit hosts we need some memory within a +/-2GB range of the
+     * actual function to be able to patch it.
+     */
+    size_t cbMem = _4K;
+    void  *pvMem = supR3HardenedWinAllocHookMemory((uintptr_t)pfnNtCreateSection,
+                                                   (uintptr_t)pfnNtCreateSection - _2G + PAGE_SIZE,
+                                                   -1, cbMem);
+    if (!pvMem)
+    {
+        pvMem = supR3HardenedWinAllocHookMemory((uintptr_t)pfnNtCreateSection,
+                                                (uintptr_t)pfnNtCreateSection + _2G - PAGE_SIZE,
+                                                1, cbMem);
+        if (!pvMem)
+            supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+                                  "Failed to allocate memory within the +/-2GB range from NTDLL.\n");
+    }
+    uintptr_t *puJmpTab = (uintptr_t *)pvMem;
+
+    /*
+     * Patch 64-bit hosts.
+     */
+    PFNRT       pfnCallReal = NULL;
+    uint8_t     offJmpBack  = UINT8_MAX;
+
+    /* Pattern #1: XP64/W2K3-64 thru Windows 8.1
+       0:000> u ntdll!NtCreateSection
+       ntdll!NtCreateSection:
+       00000000`779f1750 4c8bd1          mov     r10,rcx
+       00000000`779f1753 b847000000      mov     eax,47h
+       00000000`779f1758 0f05            syscall
+       00000000`779f175a c3              ret
+       00000000`779f175b 0f1f440000      nop     dword ptr [rax+rax]
+       The variant is the value loaded into eax: W2K3=??, Vista=47h?, W7=47h, W80=48h, W81=49h */
+    if (   pbNtCreateSection[ 0] == 0x4c /* mov r10, rcx */
+        && pbNtCreateSection[ 1] == 0x8b
+        && pbNtCreateSection[ 2] == 0xd1
+        && pbNtCreateSection[ 3] == 0xb8 /* mov eax, 000000xxh */
+        && pbNtCreateSection[ 5] == 0x00
+        && pbNtCreateSection[ 6] == 0x00
+        && pbNtCreateSection[ 7] == 0x00
+        && pbNtCreateSection[ 8] == 0x0f /* syscall */
+        && pbNtCreateSection[ 9] == 0x05
+        && pbNtCreateSection[10] == 0xc3 /* ret */
+       )
+    {
+        offJmpBack = 8; /* the 3rd instruction (syscall). */
+        switch (pbNtCreateSection[4])
+        {
+# define SYSCALL(a_Num) case a_Num: pfnCallReal = RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num); break;
+# include "NtCreateSection-template-amd64-syscall-type-1.h"
+# undef SYSCALL
+        }
+    }
+
+    if (pfnCallReal)
+    {
+        g_pfnNtCreateSectionJmpBack         = (PFNRT)(uintptr_t)(pbNtCreateSection + offJmpBack);
+        *(PFNRT *)&g_pfnNtCreateSectionReal = pfnCallReal;
+        *puJmpTab                           = (uintptr_t)supR3HardenedMonitor_NtCreateSection;
+
+        DWORD dwOldProt;
+        SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+                                                            PAGE_EXECUTE_READWRITE, &dwOldProt));
+        pbNtCreateSection[0] = 0xff;
+        pbNtCreateSection[1] = 0x25;
+        *(uint32_t *)&pbNtCreateSection[2] = (uint32_t)((uintptr_t)puJmpTab - (uintptr_t)&pbNtCreateSection[2+4]);
+
+        SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+                                                            PAGE_EXECUTE_READ, &dwOldProt));
+        return;
+    }
+
+#else
+    /*
+     * Patch 32-bit hosts.
+     */
+    PFNRT       pfnCallReal = NULL;
+    uint8_t     offJmpBack  = UINT8_MAX;
+
+    /* Pattern #1: XP thru Windows 7
+            kd> u ntdll!NtCreateSection
+            ntdll!NtCreateSection:
+            7c90d160 b832000000      mov     eax,32h
+            7c90d165 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
+            7c90d16a ff12            call    dword ptr [edx]
+            7c90d16c c21c00          ret     1Ch
+            7c90d16f 90              nop
+       The variable bit is the value loaded into eax: XP=32h, W2K3=34h, Vista=4bh, W7=54h
+
+       Pattern #2: Windows 8.1
+            0:000:x86> u ntdll_6a0f0000!NtCreateSection
+            ntdll_6a0f0000!NtCreateSection:
+            6a15eabc b854010000      mov     eax,154h
+            6a15eac1 e803000000      call    ntdll_6a0f0000!NtCreateSection+0xd (6a15eac9)
+            6a15eac6 c21c00          ret     1Ch
+            6a15eac9 8bd4            mov     edx,esp
+            6a15eacb 0f34            sysenter
+            6a15eacd c3              ret
+       The variable bit is the value loaded into eax: W81=154h
+       Note! One nice thing here is that we can share code pattern #1.  */
+
+    if (   pbNtCreateSection[ 0] == 0xb8 /* mov eax, 000000xxh*/
+        && pbNtCreateSection[ 2] <= 0x02
+        && pbNtCreateSection[ 3] == 0x00
+        && pbNtCreateSection[ 4] == 0x00
+           (   (   pbNtCreateSection[ 5] == 0xba /* mov edx, offset SharedUserData!SystemCallStub */
+                && pbNtCreateSection[ 6] == 0x00
+                && pbNtCreateSection[ 7] == 0x03
+                && pbNtCreateSection[ 8] == 0xfe
+                && pbNtCreateSection[ 9] == 0x7f
+                && pbNtCreateSection[10] == 0xff /* call [edx] */
+                && pbNtCreateSection[11] == 0x12
+                && pbNtCreateSection[12] == 0xc2 /* ret 1ch */
+                && pbNtCreateSection[13] == 0x1c
+                && pbNtCreateSection[14] == 0x00)
+
+            || (   pbNtCreateSection[ 5] == 0xe8 /* call [$+3] */
+                && RT_ABS(*(int32_t *)&pbNtCreateSection[6]) < 0x10
+                && pbNtCreateSection[10] == 0xc2 /* ret 1ch */
+                && pbNtCreateSection[11] == 0x1c
+                && pbNtCreateSection[12] == 0x00 )
+          )
+       )
+    {
+        offJmpBack = 5; /* the 2nd instruction. */
+        switch (*(uint32_t const *)&pbNtCreateSection[1])
+        {
+# define SYSCALL(a_Num) case a_Num: pfnCallReal = RT_CONCAT(supR3HardenedJmpBack_NtCreateSection_,a_Num); break;
+# include "NtCreateSection-template-x86-syscall-type-1.h"
+# undef SYSCALL
+        }
+    }
+
+    if (pfnCallReal)
+    {
+        g_pfnNtCreateSectionJmpBack         = (PFNRT)(uintptr_t)(pbNtCreateSection + offJmpBack);
+        *(PFNRT *)&g_pfnNtCreateSectionReal = pfnCallReal;
+
+        DWORD dwOldProt;
+        SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+                                                            PAGE_EXECUTE_READWRITE, &dwOldProt));
+        pbNtCreateSection[0] = 0xe9;
+        *(uint32_t *)&pbNtCreateSection[1] = (uintptr_t)supR3HardenedMonitor_NtCreateSection
+                                           - (uintptr_t)&pbNtCreateSection[1+4];
+
+        SUPR3HARDENED_ASSERT_WIN32_SUCCESS(VirtualProtectEx(GetCurrentProcess(), pbNtCreateSection, 16,
+                                                            PAGE_EXECUTE_READ, &dwOldProt));
+        return;
+    }
+#endif
+
+    supR3HardenedFatalMsg("supR3HardenedWinInstallHooks", kSupInitOp_Misc, VERR_NO_MEMORY,
+                          "Failed to install NtCreateSection monitor: %x %x %x %x  %x %x %x %x  %x %x %x %x  %x %x %x %x\n "
+#ifdef RT_ARCH_X86
+                          "(It is also possible you are running 32-bit VirtualBox under 64-bit windows.)\n"
+#endif
+                          ,
+                          pbNtCreateSection[0],  pbNtCreateSection[1],  pbNtCreateSection[2],  pbNtCreateSection[3],
+                          pbNtCreateSection[4],  pbNtCreateSection[5],  pbNtCreateSection[6],  pbNtCreateSection[7],
+                          pbNtCreateSection[8],  pbNtCreateSection[9],  pbNtCreateSection[10], pbNtCreateSection[11],
+                          pbNtCreateSection[12], pbNtCreateSection[13], pbNtCreateSection[14], pbNtCreateSection[15]);
+}
+
+
+/**
+ * Verifies the process integrity.
+ */
+DECLHIDDEN(void) supR3HardenedWinVerifyProcess(void)
+{
+    RTErrInfoInitStatic(&g_ErrInfoStatic);
+    int rc = supHardenedWinVerifyProcess(GetCurrentProcess(), GetCurrentThread(), &g_ErrInfoStatic.Core);
+    if (RT_FAILURE(rc))
+        supR3HardenedFatalMsg("supR3HardenedWinVerifyProcess", kSupInitOp_Integrity, rc,
+                              "Failed to verify process integrity: %s", g_ErrInfoStatic.szMsg);
+}
+
+
+/**
+ * Gets the SID of the user associated with the process.
+ *
+ * @returns @c true if we've got a login SID, @c false if not.
+ * @param   pSidUser            Where to return the user SID.
+ * @param   cbSidUser           The size of the user SID buffer.
+ * @param   pSidLogin           Where to return the login SID.
+ * @param   cbSidLogin          The size of the login SID buffer.
+ */
+static bool supR3HardenedGetUserAndLogSids(PSID pSidUser, ULONG cbSidUser, PSID pSidLogin, ULONG cbSidLogin)
+{
+    HANDLE hToken;
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(NtOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken));
+    union
+    {
+        TOKEN_USER      UserInfo;
+        TOKEN_GROUPS    Groups;
+        uint8_t         abPadding[4096];
+    } uBuf;
+    ULONG cbRet = 0;
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(NtQueryInformationToken(hToken, TokenUser, &uBuf, sizeof(uBuf), &cbRet));
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCopySid(cbSidUser, pSidUser, uBuf.UserInfo.User.Sid));
+
+    bool fLoginSid = false;
+    NTSTATUS rcNt = NtQueryInformationToken(hToken, TokenLogonSid, &uBuf, sizeof(uBuf), &cbRet);
+    if (NT_SUCCESS(rcNt))
+    {
+        for (DWORD i = 0; i < uBuf.Groups.GroupCount; i++)
+            if ((uBuf.Groups.Groups[i].Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
+            {
+                SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCopySid(cbSidLogin, pSidLogin, uBuf.Groups.Groups[i].Sid));
+                fLoginSid = true;
+                break;
+            }
+    }
+
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(NtClose(hToken));
+
+    return fLoginSid;
+}
+
+
+/**
+ * Build security attributes for the process or the primary thread (@a fProcess)
+ *
+ * Process DACLs can be bypassed using the SeDebugPrivilege (generally available
+ * to admins, i.e. normal windows users), or by taking ownership and/or
+ * modifying the DACL.  However, it restricts
+ *
+ * @param   pSecAttrs           Where to return the security attributes.
+ * @param   pCleanup            Cleanup record.
+ * @param   fProcess            Set if it's for the process, clear if it's for
+ *                              the primary thread.
+ */
+static void supR3HardenedInitSecAttrs(PSECURITY_ATTRIBUTES pSecAttrs, PMYSECURITYCLEANUP pCleanup, bool fProcess)
+{
+    /*
+     * Safe return values.
+     */
+    suplibHardenedMemSet(pCleanup, 0, sizeof(*pCleanup));
+
+    pSecAttrs->nLength              = sizeof(*pSecAttrs);
+    pSecAttrs->bInheritHandle       = FALSE;
+    pSecAttrs->lpSecurityDescriptor = NULL;
+
+/** @todo This isn't at all complete, just sketches... */
+
+    /*
+     * Create an ACL detailing the access of the above groups.
+     */
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCreateAcl(&pCleanup->Acl.AclHdr, sizeof(pCleanup->Acl), ACL_REVISION));
+
+    ULONG fDeny  = DELETE | WRITE_DAC | WRITE_OWNER | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL;
+    ULONG fAllow = SYNCHRONIZE | READ_CONTROL;
+    ULONG fAllowLogin = SYNCHRONIZE | READ_CONTROL;
+    if (fProcess)
+    {
+        fDeny       |= PROCESS_CREATE_THREAD | PROCESS_SET_SESSIONID | PROCESS_VM_OPERATION | PROCESS_VM_WRITE
+                    |  PROCESS_CREATE_PROCESS | PROCESS_DUP_HANDLE | PROCESS_SET_QUOTA
+                    |  PROCESS_SET_INFORMATION | PROCESS_SUSPEND_RESUME;
+        fAllow      |= PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
+        fAllowLogin |= PROCESS_TERMINATE | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
+        if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+        {
+            fAllow      |= PROCESS_QUERY_LIMITED_INFORMATION;
+            fAllowLogin |= PROCESS_QUERY_LIMITED_INFORMATION;
+        }
+        if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 3)) /* Introduced in Windows 8.1. */
+            fAllow  |= PROCESS_SET_LIMITED_INFORMATION;
+    }
+    else
+    {
+        fDeny       |= THREAD_SUSPEND_RESUME | THREAD_SET_CONTEXT | THREAD_SET_INFORMATION | THREAD_SET_THREAD_TOKEN
+                    |  THREAD_IMPERSONATE | THREAD_DIRECT_IMPERSONATION;
+        fAllow      |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION;
+        fAllowLogin |= THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION;
+        if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+        {
+            fAllow      |= THREAD_QUERY_LIMITED_INFORMATION | THREAD_SET_LIMITED_INFORMATION;
+            fAllowLogin |= THREAD_QUERY_LIMITED_INFORMATION;
+        }
+
+    }
+    fDeny |= ~fAllow & (SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL);
+
+    /* Deny everyone access to bad bits. */
+#if 1
+    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlInitializeSid(&pCleanup->Everyone.Sid, &SIDAuthWorld, 1));
+    *RtlSubAuthoritySid(&pCleanup->Everyone.Sid, 0) = SECURITY_WORLD_RID;
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                          fDeny, &pCleanup->Everyone.Sid));
+#endif
+
+#if 0
+    /* Grant some access to the owner - doesn't work. */
+    SID_IDENTIFIER_AUTHORITY SIDAuthCreator = SECURITY_CREATOR_SID_AUTHORITY;
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlInitializeSid(&pCleanup->Owner.Sid, &SIDAuthCreator, 1));
+    *RtlSubAuthoritySid(&pCleanup->Owner.Sid, 0) = SECURITY_CREATOR_OWNER_RID;
+
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                          fDeny, &pCleanup->Owner.Sid));
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                           fAllow, &pCleanup->Owner.Sid));
+#endif
+
+#if 1
+    bool fHasLoginSid = supR3HardenedGetUserAndLogSids(&pCleanup->User.Sid, sizeof(pCleanup->User),
+                                                       &pCleanup->Login.Sid, sizeof(pCleanup->Login));
+
+# if 1
+    /* Grant minimal access to the user. */
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessDeniedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                          fDeny, &pCleanup->User.Sid));
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                           fAllow, &pCleanup->User.Sid));
+# endif
+
+# if 1
+    /* Grant very limited access to the login sid. */
+    if (fHasLoginSid)
+    {
+        SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlAddAccessAllowedAce(&pCleanup->Acl.AclHdr, ACL_REVISION,
+                                                               fAllowLogin, &pCleanup->Login.Sid));
+    }
+# endif
+
+#endif
+
+    /*
+     * Create a security descriptor with the above ACL.
+     */
+    PSECURITY_DESCRIPTOR pSecDesc = (PSECURITY_DESCRIPTOR)suplibHardenedAllocZ(SECURITY_DESCRIPTOR_MIN_LENGTH);
+    pCleanup->pSecDesc = pSecDesc;
+
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlCreateSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION));
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(RtlSetDaclSecurityDescriptor(pSecDesc, TRUE /*fDaclPresent*/, &pCleanup->Acl.AclHdr,
+                                                                 FALSE /*fDaclDefaulted*/));
+    pSecAttrs->lpSecurityDescriptor = pSecDesc;
+}
+
+
+/**
+ * Predicate function which tests whether @a ch is a argument separator
+ * character.
+ *
+ * @returns True/false.
+ * @param   ch                  The character to examine.
+ */
+DECLINLINE(bool) suplibCommandLineIsArgSeparator(int ch)
+{
+    return ch == ' '
+        || ch == '\t'
+        || ch == '\n'
+        || ch == '\r';
+}
+
+
+/**
+ * Construct the new command line.  Since argc/argv are both derived from
+ * GetCommandLineW (see suplibHardenedWindowsMain), we skip the argument
+ * by argument UTF-8 -> UTF-16 conversion and quoting by going to the
+ * original source.
+ *
+ * The executable name, though, is replaced in case it's not a fullly
+ * qualified path.
+ *
+ * The re-spawn indicator is added immediately after the executable name
+ * so that we don't get tripped up missing close quote chars in the last
+ * argument.
+ *
+ * @returns Pointer to a command line string (heap).
+ */
+static PRTUTF16 supR3HardenedWinConstructCmdLine(void)
+{
+    /*
+     * Get the command line and skip the executable name.
+     */
+    PCRTUTF16 pwszArgs = GetCommandLineW();
+
+    /* Skip leading space (shouldn't be any, but whatever). */
+    while (suplibCommandLineIsArgSeparator(*pwszArgs))
+        pwszArgs++;
+    SUPR3HARDENED_ASSERT(*pwszArgs != '\0');
+
+    /* Walk to the end of it. */
+    int fQuoted = false;
+    do
+    {
+        if (*pwszArgs == '"')
+        {
+            fQuoted = !fQuoted;
+            pwszArgs++;
+        }
+        else if (*pwszArgs != '\\' || (pwszArgs[1] != '\\' && pwszArgs[1] != '"'))
+            pwszArgs++;
+        else
+        {
+            unsigned cSlashes = 0;
+            do
+                cSlashes++;
+            while (*++pwszArgs == '\\');
+            if (*pwszArgs == '"' && (cSlashes & 1))
+                pwszArgs++; /* odd number of slashes == escaped quote */
+        }
+    } while (*pwszArgs && (fQuoted || !suplibCommandLineIsArgSeparator(*pwszArgs)));
+
+    /* Skip trailing spaces. */
+    while (suplibCommandLineIsArgSeparator(*pwszArgs))
+        pwszArgs++;
+
+    /*
+     * Allocate a new buffer.
+     */
+    size_t cwcArgs    = suplibHardenedWStrLen(pwszArgs);
+    size_t cwcCmdLine = (sizeof(SUPR3_RESPAWN_ARG0) - 1) / sizeof(SUPR3_RESPAWN_ARG0[0]) /* Respawn exe name. */
+                      + !!cwcArgs + cwcArgs; /* if arguments present, add space + arguments. */
+    PRTUTF16 pwszCmdLine = (PRTUTF16)HeapAlloc(GetProcessHeap(), 0 /* dwFlags*/, (cwcCmdLine + 1) * sizeof(RTUTF16));
+    SUPR3HARDENED_ASSERT(pwszCmdLine != NULL);
+
+    /*
+     * Construct the new command line.
+     */
+    PRTUTF16 pwszDst = pwszCmdLine;
+    for (const char *pszSrc = SUPR3_RESPAWN_ARG0; *pszSrc; pszSrc++)
+        *pwszDst++ = *pszSrc;
+
+    if (cwcArgs)
+    {
+        *pwszDst++ = ' ';
+        suplibHardenedMemCopy(pwszDst, pwszArgs, cwcArgs * sizeof(RTUTF16));
+        pwszDst += cwcArgs;
+    }
+
+    *pwszDst = '\0';
+    SUPR3HARDENED_ASSERT(pwszDst - pwszCmdLine == cwcCmdLine);
+
+    return pwszCmdLine;
+}
+
+
+/**
+ * Does the actually respawning.
+ *
+ * @returns Exit code (if we get that far).
+ */
+static int supR3HardenedWinDoReSpawn(void)
+{
+    SUPR3HARDENED_ASSERT(g_cSuplibHardenedWindowsMainCalls == 1);
+
+    /*
+     * Configure the startup info and creation flags.
+     */
+    DWORD dwCreationFlags = 0;
+
+    STARTUPINFOEXW SiEx;
+    suplibHardenedMemSet(&SiEx, 0, sizeof(SiEx));
+    if (1)
+        SiEx.StartupInfo.cb = sizeof(SiEx.StartupInfo);
+    else
+    {
+        SiEx.StartupInfo.cb = sizeof(SiEx);
+        dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT;
+        /** @todo experiment with protected process stuff later on. */
+    }
+
+    SiEx.StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+    SiEx.StartupInfo.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
+    SiEx.StartupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+    SiEx.StartupInfo.hStdError  = GetStdHandle(STD_ERROR_HANDLE);
+
+    /*
+     * Set up security descriptors.
+     */
+    SECURITY_ATTRIBUTES ProcessSecAttrs;
+    MYSECURITYCLEANUP   ProcessSecAttrsCleanup;
+    supR3HardenedInitSecAttrs(&ProcessSecAttrs, &ProcessSecAttrsCleanup, true /*fProcess*/);
+
+    SECURITY_ATTRIBUTES ThreadSecAttrs;
+    MYSECURITYCLEANUP   ThreadSecAttrsCleanup;
+    supR3HardenedInitSecAttrs(&ThreadSecAttrs, &ThreadSecAttrsCleanup, false /*fProcess*/);
+
+    /*
+     * Construct the command line and launch the process.
+     */
+    PRTUTF16 pwszCmdLine = supR3HardenedWinConstructCmdLine();
+
+    PROCESS_INFORMATION ProcessInfo;
+    if (!CreateProcessW(g_wszSupLibHardenedExePath,
+                        pwszCmdLine,
+                        &ProcessSecAttrs,
+                        &ThreadSecAttrs,
+                        TRUE /*fInheritHandles*/,
+                        dwCreationFlags,
+                        NULL /*pwszzEnvironment*/,
+                        NULL /*pwszCurDir*/,
+                        &SiEx.StartupInfo,
+                        &ProcessInfo))
+        supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Misc, VERR_INVALID_NAME,
+                              "Error relaunching VirtualBox VM process: %u\n"
+                              "Command line: '%ls'",
+                              GetLastError(), pwszCmdLine);
+
+    /*
+     * Close the unrestricted access handles.  Since we need to wait on the
+     * child process, we'll reopen the process with limited access before doing
+     * away with the process handle returned by CreateProcess.
+     */
+    SUPR3HARDENED_ASSERT(CloseHandle(ProcessInfo.hThread));
+    ProcessInfo.hThread = NULL;
+
+    HANDLE hProcWait;
+    DWORD dwRights = SYNCHRONIZE;
+    if (g_uNtVerCombined >= SUP_MAKE_NT_VER_SIMPLE(6, 0)) /* Introduced in Vista. */
+        dwRights |= PROCESS_QUERY_LIMITED_INFORMATION;
+    else
+        dwRights |= PROCESS_QUERY_INFORMATION;
+    if (!DuplicateHandle(GetCurrentProcess(),
+                         ProcessInfo.hProcess,
+                         GetCurrentProcess(),
+                         &hProcWait,
+                         SYNCHRONIZE,
+                         FALSE /*fInheritHandle*/,
+                         0))
+    {
+        /* This is unacceptable, kill the process. */
+        DWORD dwErr = GetLastError();
+        TerminateProcess(ProcessInfo.hProcess, RTEXITCODE_FAILURE);
+        supR3HardenedError(dwErr, false /*fFatal*/, "DuplicateHandle failed on child process handle: %u\n", dwErr);
+
+        DWORD dwExit;
+        BOOL fExitOk = GetExitCodeProcess(ProcessInfo.hProcess, &dwExit)
+                    && dwExit != STILL_ACTIVE;
+        if (!fExitOk)
+        {
+            DWORD dwStartTick = GetTickCount();
+            DWORD dwWait;
+            do
+            {
+                TerminateProcess(ProcessInfo.hProcess, RTEXITCODE_FAILURE);
+                dwWait  = WaitForSingleObject(ProcessInfo.hProcess, 1000);
+                fExitOk = GetExitCodeProcess(ProcessInfo.hProcess, &dwExit)
+                       && dwExit != STILL_ACTIVE;
+            } while (   !fExitOk
+                     && (dwWait == WAIT_TIMEOUT || dwWait == WAIT_IO_COMPLETION)
+                     && GetTickCount() - dwStartTick < 60 * 1000);
+            if (fExitOk)
+                supR3HardenedError(dwErr, false /*fFatal*/,
+                                   "DuplicateHandle failed and we failed to kill child: dwErr=%u dwWait=%u err=%u hProcess=%p\n",
+                                   dwErr, dwWait, GetLastError(), ProcessInfo.hProcess);
+        }
+        supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Misc, VERR_INVALID_NAME,
+                              "DuplicateHandle failed on child process handle: %u\n", dwErr);
+    }
+
+    SUPR3HARDENED_ASSERT(CloseHandle(ProcessInfo.hProcess));
+    ProcessInfo.hProcess = NULL;
+
+    /*
+     * Wait for the process to terminate and proxy the termination code.
+     */
+    for (;;)
+    {
+        SetLastError(NO_ERROR);
+        DWORD dwWait = WaitForSingleObject(hProcWait, INFINITE);
+        if (   dwWait == WAIT_OBJECT_0
+            || dwWait == WAIT_ABANDONED_0)
+            break;
+        if (   dwWait != WAIT_TIMEOUT
+            && dwWait != WAIT_IO_COMPLETION)
+            supR3HardenedFatal("WaitForSingleObject returned %#x (last error %#x)\n", dwWait, GetLastError());
+    }
+
+    DWORD dwExit;
+    if (   !GetExitCodeProcess(hProcWait, &dwExit)
+        || dwExit == STILL_ACTIVE)
+        dwExit = RTEXITCODE_FAILURE;
+
+    CloseHandle(hProcWait);
+    suplibHardenedExit((RTEXITCODE)dwExit);
+}
+
+
+static bool supR3HardenedWinDriverExists(const char *pszDriver)
+{
+    /*
+     * Open the driver object directory.
+     */
+    UNICODE_STRING NtDirName;
+    NtDirName.Buffer = L"\\Driver";
+    NtDirName.MaximumLength = sizeof(L"\\Driver");
+    NtDirName.Length = NtDirName.MaximumLength - sizeof(WCHAR);
+
+    OBJECT_ATTRIBUTES ObjAttr;
+    InitializeObjectAttributes(&ObjAttr, &NtDirName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+    HANDLE hDir;
+    NTSTATUS rcNt = NtOpenDirectoryObject(&hDir, DIRECTORY_QUERY | FILE_LIST_DIRECTORY, &ObjAttr);
+#ifdef VBOX_STRICT
+    SUPR3HARDENED_ASSERT_NT_SUCCESS(rcNt);
+#endif
+    if (!NT_SUCCESS(rcNt))
+        return true;
+
+    /*
+     * Enumerate it, looking for the driver.
+     */
+    bool  fFound = true;
+    ULONG uObjDirCtx = 0;
+    do
+    {
+        uint32_t    abBuffer[_64K + _1K];
+        ULONG       cbActual;
+        rcNt = NtQueryDirectoryObject(hDir,
+                                      abBuffer,
+                                      sizeof(abBuffer) - 4, /* minus four for string terminator space. */
+                                      FALSE /*ReturnSingleEntry */,
+                                      FALSE /*RestartScan*/,
+                                      &uObjDirCtx,
+                                      &cbActual);
+        if (!NT_SUCCESS(rcNt) || cbActual < sizeof(OBJECT_DIRECTORY_INFORMATION))
+            break;
+
+        POBJECT_DIRECTORY_INFORMATION pObjDir = (POBJECT_DIRECTORY_INFORMATION)abBuffer;
+        while (pObjDir->Name.Length != 0)
+        {
+            WCHAR wcSaved = pObjDir->Name.Buffer[pObjDir->Name.Length / sizeof(WCHAR)];
+            pObjDir->Name.Buffer[pObjDir->Name.Length / sizeof(WCHAR)] = '\0';
+            if (   pObjDir->Name.Length > 1
+                && RTUtf16ICmpAscii(pObjDir->Name.Buffer, pszDriver) == 0)
+            {
+                fFound = true;
+                break;
+            }
+            pObjDir->Name.Buffer[pObjDir->Name.Length / sizeof(WCHAR)] = wcSaved;
+
+            /* Next directory entry. */
+            pObjDir++;
+        }
+    } while (!fFound);
+
+    /*
+     * Clean up and return.
+     */
+    NtClose(hDir);
+
+    return fFound;
+}
+
+
+/**
+ * Called by the main code if supR3HardenedWinIsReSpawnNeeded returns @c true.
+ *
+ * @returns Program exit code.
+ */
+DECLHIDDEN(int) supR3HardenedWinReSpawn(void)
+{
+    /*
+     * Open the stub device.  Retry if we think driver might still be
+     * initializing (STATUS_NO_SUCH_DEVICE + \Drivers\VBoxDrv).
+     */
+    static const WCHAR  s_wszName[] = L"\\Device\\VBoxDrvStub";
+    DWORD const         uStartTick = GetTickCount();
+    NTSTATUS            rcNt;
+    uint32_t            iTry;
+
+    for (iTry = 0;; iTry++)
+    {
+        HANDLE              hFile = RTNT_INVALID_HANDLE_VALUE;
+        IO_STATUS_BLOCK     Ios   = RTNT_IO_STATUS_BLOCK_INITIALIZER;
+
+        UNICODE_STRING      NtName;
+        NtName.Buffer        = (PWSTR)s_wszName;
+        NtName.Length        = sizeof(s_wszName) - sizeof(WCHAR);
+        NtName.MaximumLength = sizeof(s_wszName);
+
+        OBJECT_ATTRIBUTES   ObjAttr;
+        InitializeObjectAttributes(&ObjAttr, &NtName, OBJ_CASE_INSENSITIVE, NULL /*hRootDir*/, NULL /*pSecDesc*/);
+
+        rcNt = NtCreateFile(&hFile,
+                            GENERIC_READ | GENERIC_WRITE,
+                            &ObjAttr,
+                            &Ios,
+                            NULL /* Allocation Size*/,
+                            FILE_ATTRIBUTE_NORMAL,
+                            FILE_SHARE_READ | FILE_SHARE_WRITE,
+                            FILE_OPEN,
+                            FILE_NON_DIRECTORY_FILE,
+                            NULL /*EaBuffer*/,
+                            0 /*EaLength*/);
+        if (NT_SUCCESS(rcNt))
+            rcNt = Ios.Status;
+
+        /* The STATUS_NO_SUCH_DEVICE might be returned if the device is not
+           completely initialized.  Delay a little bit and try again. */
+        if (rcNt != STATUS_NO_SUCH_DEVICE)
+            break;
+        if (iTry > 0 && GetTickCount() - uStartTick > 5000)  /* 5 sec, at least two tries */
+            break;
+        if (!supR3HardenedWinDriverExists("VBoxDrv"))
+        {
+            /** @todo Consider starting the VBoxdrv.sys service. Requires 2nd process
+             *        though, rather complicated actually as CreateProcess causes all
+             *        kind of things to happen to this process which would make it hard to
+             *        pass the process verification tests... :-/ */
+            break;
+        }
+
+        LARGE_INTEGER Time;
+        if (iTry < 8)
+            Time.QuadPart = -1000000 / 100; /* 1ms in 100ns units, relative time. */
+        else
+            Time.QuadPart = -32000000 / 100; /* 32ms in 100ns units, relative time. */
+        NtDelayExecution(TRUE, &Time);
+    }
+
+    if (!NT_SUCCESS(rcNt))
+    {
+        int rc = VERR_OPEN_FAILED;
+        if (SUP_NT_STATUS_IS_VBOX(rcNt)) /* See VBoxDrvNtErr2NtStatus. */
+            rc = SUP_NT_STATUS_TO_VBOX(rcNt);
+        else
+        {
+            const char *pszDefine;
+            switch (rcNt)
+            {
+                case STATUS_NO_SUCH_DEVICE:         pszDefine = " STATUS_NO_SUCH_DEVICE"; break;
+                case STATUS_OBJECT_NAME_NOT_FOUND:  pszDefine = " STATUS_OBJECT_NAME_NOT_FOUND"; break;
+                case STATUS_ACCESS_DENIED:          pszDefine = " STATUS_ACCESS_DENIED"; break;
+                case STATUS_TRUST_FAILURE:          pszDefine = " STATUS_TRUST_FAILURE"; break;
+                default:                            pszDefine = ""; break;
+            }
+            supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, VERR_OPEN_FAILED,
+                                  "NtCreateFile(%ls) failed: %#x%s (%u retries)\n", s_wszName, rcNt, pszDefine, iTry);
+        }
+        supR3HardenedFatalMsg("supR3HardenedWinReSpawn", kSupInitOp_Driver, rc,
+                              "NtCreateFile(%ls) failed: %Rrc (rcNt=%#x)\n", s_wszName, rc, rcNt);
+    }
+
+    /*
+     * Respawn the process with kernel protection for the new process.
+     */
+    return supR3HardenedWinDoReSpawn();
+}
+
+
+/**
+ * Checks if re-spawning is required, replacing the respawn argument if not.
+ *
+ * @returns true if required, false if not. In the latter case, the first
+ *          argument in the vector is replaced.
+ * @param   cArgs               The number of arguments.
+ * @param   papszArgs           Pointer to the argument vector.
+ */
+DECLHIDDEN(bool) supR3HardenedWinIsReSpawnNeeded(int cArgs, char **papszArgs)
+{
+    SUPR3HARDENED_ASSERT(g_cSuplibHardenedWindowsMainCalls == 1);
+
+    if (cArgs < 1)
+        return true;
+    if (suplibHardenedStrCmp(papszArgs[0], SUPR3_RESPAWN_ARG0))
+        return true;
+
+    /* Replace the argument. */
+    papszArgs[0] = g_szSupLibHardenedExePath;
+    return false;
+}
+
+
+/**
+ * Initializes the windows verficiation bits.
+ * @param   fFlags          The main flags.
+ */
+DECLHIDDEN(void) supR3HardenedWinInit(uint32_t fFlags)
+{
+    RTErrInfoInitStatic(&g_ErrInfoStatic);
+    int rc = supHardenedWinInitImageVerifier(&g_ErrInfoStatic.Core);
+    if (RT_FAILURE(rc))
+        supR3HardenedFatalMsg("supR3HardenedWinInit", kSupInitOp_Misc, rc,
+                              "supHardenedWinInitImageVerifier failed: %s", g_ErrInfoStatic.szMsg);
+    supR3HardenedWinInstallHooks();
+
+#ifndef VBOX_WITH_VISTA_NO_SP
+    /*
+     * Complain about Vista w/o service pack if we're launching a VM.
+     */
+    if (   !(fFlags & SUPSECMAIN_FLAGS_DONT_OPEN_DEV)
+        && g_uNtVerCombined >= SUP_NT_VER_VISTA
+        && g_uNtVerCombined <  SUP_MAKE_NT_VER_COMBINED(6, 0, 6001, 0, 0))
+        supR3HardenedFatalMsg("supR3HardenedWinInit", kSupInitOp_Misc, VERR_NOT_SUPPORTED,
+                              "Window Vista without any service pack installed is not supported. Please install the latest service pack.");
+#endif
+}
+
+
+/**
+ * Converts the Windows command line string (UTF-16) to an array of UTF-8
+ * arguments suitable for passing to main().
+ *
+ * @returns Pointer to the argument array.
+ * @param   pwszCmdLine         The UTF-16 windows command line to parse.
+ * @param   pcArgs              Where to return the number of arguments.
+ */
+static char **suplibCommandLineToArgvWStub(PCRTUTF16 pwszCmdLine, int *pcArgs)
+{
+    /*
+     * Convert the command line string to UTF-8.
+     */
+    int   cbNeeded = WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, pwszCmdLine, -1, NULL /*pszDst*/, 0 /*cbDst*/,
+                                         NULL /*pchDefChar*/, NULL /* pfUsedDefChar */);
+    SUPR3HARDENED_ASSERT(cbNeeded > 0);
+    int   cbAllocated = cbNeeded + 16;
+    char *pszCmdLine = (char *)suplibHardenedAllocZ(cbAllocated);
+
+    SUPR3HARDENED_ASSERT(WideCharToMultiByte(CP_UTF8, 0 /*dwFlags*/, pwszCmdLine, -1,
+                                             pszCmdLine, cbAllocated - 1,
+                                             NULL /*pchDefChar*/, NULL /* pfUsedDefChar */) == cbNeeded);
+
+    /*
+     * Parse the command line, carving argument strings out of it.
+     */
+    int    cArgs          = 0;
+    int    cArgsAllocated = 4;
+    char **papszArgs      = (char **)suplibHardenedAllocZ(sizeof(char *) * cArgsAllocated);
+    char  *pszSrc         = pszCmdLine;
+    for (;;)
+    {
+        /* skip leading blanks. */
+        char ch = *pszSrc;
+        while (suplibCommandLineIsArgSeparator(ch))
+            ch = *++pszSrc;
+        if (!ch)
+            break;
+
+        /* Add argument to the vector. */
+        if (cArgs + 2 >= cArgsAllocated)
+        {
+            cArgsAllocated *= 2;
+            papszArgs = (char **)suplibHardenedReAlloc(papszArgs, sizeof(char *) * cArgsAllocated);
+        }
+        papszArgs[cArgs++] = pszSrc;
+        papszArgs[cArgs]   = NULL;
+
+        /* Unquote and unescape the string. */
+        char *pszDst = pszSrc++;
+        bool fQuoted = false;
+        do
+        {
+            if (ch == '"')
+                fQuoted = !fQuoted;
+            else if (ch != '\\' || (*pszSrc != '\\' && *pszSrc != '"'))
+                *pszDst++ = ch;
+            else
+            {
+                unsigned cSlashes = 0;
+                while ((ch = *pszSrc++) == '\\')
+                    cSlashes++;
+                if (ch == '"')
+                {
+                    while (cSlashes >= 2)
+                    {
+                        cSlashes -= 2;
+                        *pszDst++ = '\\';
+                    }
+                    if (cSlashes)
+                        *pszDst++ = '"';
+                    else
+                        fQuoted = !fQuoted;
+                }
+                else
+                {
+                    pszSrc--;
+                    while (cSlashes-- > 0)
+                        *pszDst++ = '\\';
+                }
+            }
+
+            ch = *pszSrc++;
+        } while (ch != '\0' && (fQuoted || !suplibCommandLineIsArgSeparator(ch)));
+
+        /* Terminate the argument. */
+        *pszDst = '\0';
+        if (!ch)
+            break;
+    }
+
+    *pcArgs = cArgs;
+    return papszArgs;
+}
+
+
+extern "C" int main(int argc, char **argv, char **envp);
+
+/**
+ * The executable entry point.
+ *
+ * This is normally taken care of by the C runtime library, but we don't want to
+ * get involved with anything as complicated like the CRT in this setup.  So, we
+ * it everything ourselves, including parameter parsing.
+ */
+extern "C" void __stdcall suplibHardenedWindowsMain(void)
+{
+    RTEXITCODE  rcExit = RTEXITCODE_FAILURE;
+
+    g_cSuplibHardenedWindowsMainCalls++;
+
+    /*
+     * Init g_uNtVerCombined. (The code is shared with SUPR3.lib and lives in
+     * SUPHardenedVerfiyImage-win.cpp.)
+     */
+    supR3HardenedWinInitVersion();
+
+    /*
+     * Get the executable name.
+     */
+    DWORD cwcExecName = GetModuleFileNameW(GetModuleHandle(NULL), g_wszSupLibHardenedExePath,
+                                           RT_ELEMENTS(g_wszSupLibHardenedExePath));
+    if (cwcExecName >= RT_ELEMENTS(g_wszSupLibHardenedExePath))
+        supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, VERR_BUFFER_OVERFLOW,
+                              "The executable path is too long.");
+
+    /* The NT version. */
+    HANDLE hFile = CreateFileW(g_wszSupLibHardenedExePath, GENERIC_READ, FILE_SHARE_READ, NULL /*pSecurityAttributes*/,
+                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL /*hTemplateFile*/);
+    if (hFile == NULL || hFile == INVALID_HANDLE_VALUE)
+        supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, RTErrConvertFromWin32(GetLastError()),
+                              "Error opening the executable: %u (%ls).", GetLastError());
+    RT_ZERO(g_SupLibHardenedExeNtPath);
+    ULONG cbIgn;
+    NTSTATUS rcNt = NtQueryObject(hFile, ObjectNameInformation, &g_SupLibHardenedExeNtPath,
+                                  sizeof(g_SupLibHardenedExeNtPath) - sizeof(WCHAR), &cbIgn);
+    if (!NT_SUCCESS(rcNt))
+        supR3HardenedFatalMsg("suplibHardenedWindowsMain", kSupInitOp_Integrity, RTErrConvertFromNtStatus(rcNt),
+                              "NtQueryObject -> %#x (on %ls)\n", rcNt, g_wszSupLibHardenedExePath);
+    CloseHandle(hFile);
+
+    /* The NT executable name offset / dir path length. */
+    g_offSupLibHardenedExeNtName = g_SupLibHardenedExeNtPath.UniStr.Length / sizeof(WCHAR);
+    while (   g_offSupLibHardenedExeNtName > 1
+           && g_SupLibHardenedExeNtPath.UniStr.Buffer[g_offSupLibHardenedExeNtName - 1] != '\\' )
+        g_offSupLibHardenedExeNtName--;
+
+    /*
+     * Convert the arguments to UTF-8 and call the C/C++ main function.
+     */
+    int    cArgs;
+    char **papszArgs = suplibCommandLineToArgvWStub(GetCommandLineW(), &cArgs);
+
+    rcExit = (RTEXITCODE)main(cArgs, papszArgs, NULL);
+
+    /*
+     * Exit the process (never return).
+     */
+    suplibHardenedExit(rcExit);
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm
similarity index 51%
copy from src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
copy to src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm
index 11fdcf3..1f21cb9 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedMainA-win.asm
@@ -1,10 +1,10 @@
-; $Id: SUPDrvA-win.asm $
+; $Id: SUPR3HardenedMainA-win.asm $
 ;; @file
-; VirtualBox Support Driver - Windows NT specific assembly parts.
+; VirtualBox Support Library - Hardened main(), Windows assembly bits.
 ;
 
 ;
-; Copyright (C) 2006-2010 Oracle Corporation
+; Copyright (C) 2012-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -29,18 +29,48 @@
 ;*******************************************************************************
 %include "iprt/asmdefs.mac"
 
+
+; External data.
+extern NAME(g_pfnNtCreateSectionJmpBack)
+
+
 BEGINCODE
+
+;
+; 64-bit
+;
 %ifdef RT_ARCH_AMD64
- %define _DbgPrint DbgPrint
+ %macro supR3HardenedJmpBack_NtCreateSection_Xxx 1
+ BEGINPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+        ; The code we replaced.
+        mov     r10, rcx
+        mov     eax, %1
+
+        ; Jump back to the original code.
+        jmp     [NAME(g_pfnNtCreateSectionJmpBack) wrt RIP]
+ ENDPROC   supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ %endm
+ %define SYSCALL(a_Num) supR3HardenedJmpBack_NtCreateSection_Xxx a_Num
+ %include "NtCreateSection-template-amd64-syscall-type-1.h"
+
 %endif
-extern _DbgPrint
-
-%if 1 ; see alternative in SUPDrv-win.cpp
-;;
-; Kind of alias for DbgPrint
-export NAME(SUPR0Printf)
-BEGINPROC SUPR0Printf
-        jmp     _DbgPrint
-ENDPROC SUPR0Printf
+
+
+;
+; 32-bit.
+;
+%ifdef RT_ARCH_X86
+ %macro supR3HardenedJmpBack_NtCreateSection_Xxx 1
+ BEGINPROC supR3HardenedJmpBack_NtCreateSection_ %+ %1
+        ; The code we replaced.
+        mov     eax, %1
+
+        ; Jump back to the original code.
+        jmp     [NAME(g_pfnNtCreateSectionJmpBack)]
+ ENDPROC   supR3HardenedJmpBack_NtCreateSection_ %+ %1
+ %endm
+ %define SYSCALL(a_Num) supR3HardenedJmpBack_NtCreateSection_Xxx a_Num
+ %include "NtCreateSection-template-x86-syscall-type-1.h"
+
 %endif
 
diff --git a/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp b/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp
new file mode 100644
index 0000000..93f034e
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/SUPR3HardenedNoCrt-win.cpp
@@ -0,0 +1,191 @@
+/* $Id: SUPR3HardenedNoCrt-win.cpp $ */
+/** @file
+ * VirtualBox Support Library - Hardened main(), windows bits.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+#include <AccCtrl.h>
+#include <AclApi.h>
+#ifndef PROCESS_SET_LIMITED_INFORMATION
+# define PROCESS_SET_LIMITED_INFORMATION 0x2000
+#endif
+
+#include <VBox/sup.h>
+#include <VBox/err.h>
+#include <iprt/assert.h>
+#include <iprt/ctype.h>
+#include <iprt/string.h>
+#include <iprt/initterm.h>
+#include <iprt/param.h>
+#include <iprt/mem.h>
+
+#include "SUPLibInternal.h"
+#include "win/SUPHardenedVerify-win.h"
+
+
+/*
+ * assert.cpp
+ */
+
+RTDATADECL(char)                     g_szRTAssertMsg1[1024];
+RTDATADECL(char)                     g_szRTAssertMsg2[4096];
+RTDATADECL(const char * volatile)    g_pszRTAssertExpr;
+RTDATADECL(const char * volatile)    g_pszRTAssertFile;
+RTDATADECL(uint32_t volatile)        g_u32RTAssertLine;
+RTDATADECL(const char * volatile)    g_pszRTAssertFunction;
+
+RTDECL(bool) RTAssertMayPanic(void)
+{
+    return true;
+}
+
+
+RTDECL(void) RTAssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction)
+{
+    /*
+     * Fill in the globals.
+     */
+    g_pszRTAssertExpr       = pszExpr;
+    g_pszRTAssertFile       = pszFile;
+    g_pszRTAssertFunction   = pszFunction;
+    g_u32RTAssertLine       = uLine;
+    RTStrPrintf(g_szRTAssertMsg1, sizeof(g_szRTAssertMsg1),
+                "\n!!Assertion Failed!!\n"
+                "Expression: %s\n"
+                "Location  : %s(%d) %s\n",
+                pszExpr, pszFile, uLine, pszFunction);
+}
+
+
+RTDECL(void) RTAssertMsg2V(const char *pszFormat, va_list va)
+{
+    RTStrPrintfV(g_szRTAssertMsg2, sizeof(g_szRTAssertMsg2), pszFormat, va);
+    if (g_enmSupR3HardenedMainState < SUPR3HARDENEDMAINSTATE_CALLED_TRUSTED_MAIN)
+        supR3HardenedFatalMsg(g_pszRTAssertExpr, kSupInitOp_Misc, VERR_INTERNAL_ERROR,
+                              "%s%s", g_szRTAssertMsg1,  g_szRTAssertMsg2);
+    else
+        supR3HardenedError(VERR_INTERNAL_ERROR, false/*fFatal*/, "%s%s", g_szRTAssertMsg1,  g_szRTAssertMsg2);
+}
+
+
+/*
+ * Memory allocator.
+ */
+
+RTDECL(void *) RTMemTmpAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    return RTMemAllocTag(cb, pszTag);
+}
+
+
+RTDECL(void *) RTMemTmpAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    return RTMemAllocZTag(cb, pszTag);
+}
+
+
+RTDECL(void) RTMemTmpFree(void *pv) RT_NO_THROW
+{
+    RTMemFree(pv);
+}
+
+
+RTDECL(void *) RTMemAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    return suplibHardenedAllocZ(cb);
+}
+
+
+RTDECL(void *) RTMemAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    return suplibHardenedAllocZ(cb);
+}
+
+
+RTDECL(void *) RTMemAllocVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
+{
+    size_t cbAligned;
+    if (cbUnaligned >= 16)
+        cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
+    else
+        cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
+    return RTMemAllocTag(cbAligned, pszTag);
+}
+
+
+RTDECL(void *) RTMemAllocZVarTag(size_t cbUnaligned, const char *pszTag) RT_NO_THROW
+{
+    size_t cbAligned;
+    if (cbUnaligned >= 16)
+        cbAligned = RT_ALIGN_Z(cbUnaligned, 16);
+    else
+        cbAligned = RT_ALIGN_Z(cbUnaligned, sizeof(void *));
+    return RTMemAllocZTag(cbAligned, pszTag);
+}
+
+
+RTDECL(void *) RTMemReallocTag(void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
+{
+    return suplibHardenedReAlloc(pvOld, cbNew);
+}
+
+
+RTDECL(void) RTMemFree(void *pv) RT_NO_THROW
+{
+    suplibHardenedFree(pv);
+}
+
+
+/*
+ * Simplified version of RTMemWipeThoroughly that avoids dragging in the
+ * random number code.
+ */
+
+RTDECL(void) RTMemWipeThoroughly(void *pv, size_t cb, size_t cMinPasses) RT_NO_THROW
+{
+    size_t cPasses = RT_MIN(cMinPasses, 6);
+    static const uint32_t s_aPatterns[] = { 0x00, 0xaa, 0x55, 0xff, 0xf0, 0x0f, 0xcc, 0x3c, 0xc3 };
+    uint32_t iPattern = 0;
+    do
+    {
+        memset(pv, s_aPatterns[iPattern], cb);
+        iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+        ASMMemoryFence();
+
+        memset(pv, s_aPatterns[iPattern], cb);
+        iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+        ASMMemoryFence();
+
+        memset(pv, s_aPatterns[iPattern], cb);
+        iPattern = (iPattern + 1) % RT_ELEMENTS(s_aPatterns);
+        ASMMemoryFence();
+    } while (cPasses-- > 0);
+
+    memset(pv, 0xff, cb);
+    ASMMemoryFence();
+}
+
diff --git a/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp b/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp
new file mode 100644
index 0000000..cafe8ea
--- /dev/null
+++ b/src/VBox/HostDrivers/Support/win/VBoxSupLib-win.cpp
@@ -0,0 +1,96 @@
+/* $Id: VBoxSupLib-win.cpp $ */
+/** @file
+ * IPRT - VBoxSupLib.dll, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2012 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/nt/nt-and-windows.h>
+
+#include <iprt/path.h>
+
+
+/**
+ * The Dll main entry point.
+ * @remarks The dllexport is for forcing the linker to generate an import
+ *          library, so the the build system doesn't get confused.
+ */
+extern "C" __declspec(dllexport)
+BOOL __stdcall DllMainEntrypoint(HANDLE hModule, DWORD dwReason, PVOID pvReserved)
+{
+    switch (dwReason)
+    {
+        /*
+         * Make sure the DLL isn't ever unloaded.
+         */
+        case DLL_PROCESS_ATTACH:
+        {
+            WCHAR wszName[RTPATH_MAX];
+            SetLastError(NO_ERROR);
+            if (   GetModuleFileNameW((HMODULE)hModule, wszName, RT_ELEMENTS(wszName)) > 0
+                && GetLastError() == NO_ERROR)
+            {
+                int cExtraLoads = 2;
+                while (cExtraLoads-- > 0)
+                    LoadLibraryW(wszName);
+            }
+            break;
+        }
+
+        case DLL_THREAD_ATTACH:
+        {
+#ifdef VBOX_WITH_HARDENING
+# ifndef VBOX_WITHOUT_DEBUGGER_CHECKS
+            /*
+             * Anti debugging hack that prevents most debug notifications from
+             * ending up in the debugger.
+             */
+            NTSTATUS rcNt = NtSetInformationThread(GetCurrentThread(), ThreadHideFromDebugger, NULL, 0);
+            if (!NT_SUCCESS(rcNt))
+            {
+                __debugbreak();
+                return FALSE;
+            }
+# endif
+#endif
+            break;
+        }
+
+        case DLL_THREAD_DETACH:
+            /* Nothing to do. */
+            break;
+
+        case DLL_PROCESS_DETACH:
+            /* Nothing to do. */
+            break;
+
+        default:
+            /* ignore */
+            break;
+    }
+    return TRUE;
+}
+
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp b/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp
index c4360d4..398d6cc 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp
+++ b/src/VBox/HostDrivers/VBoxNetFlt/win/cfg/VBoxNetCfg.cpp
@@ -144,20 +144,25 @@ VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinQueryINetCfg(OUT INetCfg **ppNetCfg,
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinReleaseINetCfg(IN INetCfg *pNetCfg, IN BOOL fHasWriteLock)
 {
     if (!pNetCfg) /* If network config has been released already, just bail out. */
+    {
+        NonStandardLogFlow(("Warning: No network config given but write lock is set to TRUE\n"));
         return S_OK;
+    }
 
     HRESULT hr = pNetCfg->Uninitialize();
     if (FAILED(hr))
     {
         NonStandardLogFlow(("Uninitialize failed, hr (0x%x)\n", hr));
-        return hr;
+        /* Try to release the write lock below. */
     }
 
     if (fHasWriteLock)
     {
-        hr = vboxNetCfgWinINetCfgUnlock(pNetCfg);
-        if (FAILED(hr))
-            NonStandardLogFlow(("vboxNetCfgWinINetCfgUnlock failed, hr (0x%x)\n", hr));
+        HRESULT hr2 = vboxNetCfgWinINetCfgUnlock(pNetCfg);
+        if (FAILED(hr2))
+            NonStandardLogFlow(("vboxNetCfgWinINetCfgUnlock failed, hr (0x%x)\n", hr2));
+        if (SUCCEEDED(hr))
+            hr = hr2;
     }
 
     pNetCfg->Release();
@@ -412,108 +417,113 @@ static HRESULT vboxNetCfgWinEnumNetCfgComponents(IN INetCfg *pNetCfg,
  * Forward declarations of functions used in vboxNetCfgWinRemoveAllNetDevicesOfIdCallback.
  */
 VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostonlyConnectionName(PCWSTR DevName, WCHAR *pBuf, PULONG pcbBuf);
-VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection (LPWSTR pGuid, PCWSTR NewName);
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRenameConnection(LPWSTR pGuid, PCWSTR NewName);
 
 static BOOL vboxNetCfgWinRemoveAllNetDevicesOfIdCallback(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext)
 {
-    HRESULT hr = S_OK;
     SP_REMOVEDEVICE_PARAMS rmdParams;
-    WCHAR pWCfgGuidString[50] = {L''};
-
+    memset(&rmdParams, 0, sizeof(SP_REMOVEDEVICE_PARAMS));
     rmdParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
     rmdParams.ClassInstallHeader.InstallFunction = DIF_REMOVE;
     rmdParams.Scope = DI_REMOVEDEVICE_GLOBAL;
-    rmdParams.HwProfile = 0;
 
-    if (SetupDiSetClassInstallParams(hDevInfo,pDev,&rmdParams.ClassInstallHeader,sizeof(rmdParams)))
+    if (SetupDiSetClassInstallParams(hDevInfo,pDev,
+                                     &rmdParams.ClassInstallHeader, sizeof(rmdParams)))
     {
-        if (SetupDiSetSelectedDevice (hDevInfo, pDev))
+        if (SetupDiSetSelectedDevice(hDevInfo, pDev))
         {
-            /* Figure out NetCfgInstanceId */
-            HKEY hkey = SetupDiOpenDevRegKey(hDevInfo,
+            /* Figure out NetCfgInstanceId. */
+            HKEY hKey = SetupDiOpenDevRegKey(hDevInfo,
                                              pDev,
                                              DICS_FLAG_GLOBAL,
                                              0,
                                              DIREG_DRV,
                                              KEY_READ);
-            if (hkey == INVALID_HANDLE_VALUE)
-                NonStandardLogFlow(("SetupDiOpenDevRegKey failed (0x%08X)", GetLastError()));
+            if (hKey == INVALID_HANDLE_VALUE)
+            {
+                NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiOpenDevRegKey failed with error %ld\n",
+                                    GetLastError()));
+            }
             else
             {
-                DWORD cbSize = sizeof(pWCfgGuidString);
+                WCHAR wszCfgGuidString[50] = { L'' };
+                DWORD cbSize = sizeof(wszCfgGuidString);
                 DWORD dwValueType;
-                DWORD ret = RegQueryValueExW (hkey, L"NetCfgInstanceId", NULL,
-                                              &dwValueType, (LPBYTE) pWCfgGuidString, &cbSize);
+                DWORD ret = RegQueryValueExW(hKey, L"NetCfgInstanceId", NULL,
+                                             &dwValueType, (LPBYTE)wszCfgGuidString, &cbSize);
                 if (ret == ERROR_SUCCESS)
                 {
-                    /* Figure out device name */
-                    WCHAR DevName[256], TempName[256];
-                    ULONG cbName = sizeof(TempName);
+                    NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Processing device ID \"%S\"\n",
+                                        wszCfgGuidString));
+
+                    /* Figure out device name. */
+                    WCHAR wszDevName[256], wszTempName[256];
+                    ULONG cbName = sizeof(wszTempName);
+
                     if (SetupDiGetDeviceRegistryPropertyW(hDevInfo, pDev,
-                                               SPDRP_FRIENDLYNAME , /* IN DWORD Property,*/
-                                               NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
-                                               (PBYTE)DevName, /*OUT PBYTE PropertyBuffer,*/
-                                               sizeof(DevName), /* IN DWORD PropertyBufferSize,*/
-                                               NULL /*OUT PDWORD RequiredSize OPTIONAL*/))
+                                                          SPDRP_FRIENDLYNAME, /* IN  DWORD Property,*/
+                                                          NULL,               /* OUT PDWORD PropertyRegDataType, OPTIONAL*/
+                                                          (PBYTE)wszDevName,  /* OUT PBYTE PropertyBuffer,*/
+                                                          sizeof(wszDevName), /* IN  DWORD PropertyBufferSize,*/
+                                                          NULL                /* OUT PDWORD RequiredSize OPTIONAL*/))
                     {
                         /*
                          * Rename the connection before removing the device. This will
                          * hopefully prevent an error when we will be attempting
                          * to rename a newly created connection (see @bugref{6740}).
                          */
-                        HRESULT hr_tmp = VBoxNetCfgWinGenHostonlyConnectionName(DevName, TempName, &cbName);
-                        wcscat_s(TempName, sizeof(TempName), L" removed");
+                        HRESULT hr = VBoxNetCfgWinGenHostonlyConnectionName(wszDevName, wszTempName, &cbName);
+                        wcscat_s(wszTempName, sizeof(wszTempName), L" removed");
                         if (SUCCEEDED(hr))
-                            hr_tmp = VBoxNetCfgWinRenameConnection(pWCfgGuidString, TempName);
+                            hr = VBoxNetCfgWinRenameConnection(wszCfgGuidString, wszTempName);
                         //NonStandardLogFlow(("VBoxNetCfgWinRenameConnection(%S,%S) => 0x%x\n", pWCfgGuidString, TempName, hr_tmp));
                     }
                     else
                     {
-                        NonStandardLogFlow(("Failed to get 'friendly name' property for %S\n", pWCfgGuidString));
+                        NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Failed to get friendly name for device \"%S\"\n",
+                                            wszCfgGuidString));
                     }
                 }
                 else
                 {
-                    NonStandardLogFlow(("RegQueryValueExW(L\"NetCfgInstanceId\") failed with %d\n", ret));
+                    NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: Querying instance ID failed with %d\n",
+                                        ret));
                 }
 
-                RegCloseKey (hkey);
+                RegCloseKey(hKey);
             }
 
-            if (SetupDiCallClassInstaller(DIF_REMOVE,hDevInfo,pDev))
+            if (SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, pDev))
             {
                 SP_DEVINSTALL_PARAMS devParams;
+                memset(&devParams, 0, sizeof(SP_DEVINSTALL_PARAMS));
                 devParams.cbSize = sizeof(devParams);
-                if (SetupDiGetDeviceInstallParams(hDevInfo,pDev,&devParams))
+
+                if (SetupDiGetDeviceInstallParams(hDevInfo, pDev, &devParams))
                 {
-                    if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))
+                    if (   (devParams.Flags & DI_NEEDRESTART)
+                        || (devParams.Flags & DI_NEEDREBOOT))
                     {
-                        hr = S_FALSE;
-                        NonStandardLog(("!!!REBOOT REQUIRED!!!\n"));
+                        NonStandardLog(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: A reboot is required\n"));
                     }
                 }
+                else
+                    NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %ld\n",
+                                        GetLastError()));
             }
             else
-            {
-                DWORD dwErr = GetLastError();
-                NonStandardLogFlow(("SetupDiCallClassInstaller failed with %ld\n", dwErr));
-                hr = HRESULT_FROM_WIN32(dwErr);
-            }
+                NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %ld\n",
+                                    GetLastError()));
         }
         else
-        {
-            DWORD dwErr = GetLastError();
-            NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %ld\n", dwErr));
-            hr = HRESULT_FROM_WIN32(dwErr);
-        }
+            NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetSelectedDevice failed with %ld\n",
+                                GetLastError()));
     }
     else
-    {
-        DWORD dwErr = GetLastError();
-        NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %ld\n", dwErr));
-        hr = HRESULT_FROM_WIN32(dwErr);
-    }
+        NonStandardLogFlow(("vboxNetCfgWinRemoveAllNetDevicesOfIdCallback: SetupDiSetClassInstallParams failed with %ld\n",
+                            GetLastError()));
 
+    /* Continue enumeration. */
     return TRUE;
 }
 
@@ -526,14 +536,13 @@ typedef struct VBOXNECTFGWINPROPCHANGE
 static BOOL vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext)
 {
     PVBOXNECTFGWINPROPCHANGE pPc = (PVBOXNECTFGWINPROPCHANGE)pContext;
-    HRESULT hr = S_OK;
+
     SP_PROPCHANGE_PARAMS PcParams;
     memset (&PcParams, 0, sizeof (PcParams));
-
-    PcParams.ClassInstallHeader.cbSize = sizeof (SP_CLASSINSTALL_HEADER);
+    PcParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
     PcParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
     PcParams.Scope = DICS_FLAG_GLOBAL;
-    PcParams.HwProfile = 0;
+
     switch(pPc->enmPcType)
     {
         case VBOXNECTFGWINPROPCHANGE_TYPE_DISABLE:
@@ -543,13 +552,12 @@ static BOOL vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback(HDEVINFO hDevInfo,
             PcParams.StateChange = DICS_ENABLE;
             break;
         default:
-            NonStandardLogFlow(("unexpected prop change type: %d\n", pPc->enmPcType));
+            NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: Unexpected prop change type: %d\n", pPc->enmPcType));
             pPc->hr = E_INVALIDARG;
             return FALSE;
     }
 
-
-    if (SetupDiSetClassInstallParams(hDevInfo, pDev, &PcParams.ClassInstallHeader, sizeof (PcParams)))
+    if (SetupDiSetClassInstallParams(hDevInfo, pDev, &PcParams.ClassInstallHeader, sizeof(PcParams)))
     {
         if (SetupDiSetSelectedDevice(hDevInfo, pDev))
         {
@@ -559,136 +567,148 @@ static BOOL vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback(HDEVINFO hDevInfo,
                 devParams.cbSize = sizeof(devParams);
                 if (SetupDiGetDeviceInstallParams(hDevInfo,pDev,&devParams))
                 {
-                    if (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))
+                    if (   (devParams.Flags & DI_NEEDRESTART)
+                        || (devParams.Flags & DI_NEEDREBOOT))
                     {
-                        hr = S_FALSE;
-                        NonStandardLogFlow(("PropChange: !!!REBOOT REQUIRED!!!\n"));
+                        NonStandardLog(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: A reboot is required\n"));
                     }
                 }
+                else
+                    NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiGetDeviceInstallParams failed with %ld\n",
+                                        GetLastError()));
             }
             else
-            {
-                DWORD dwErr = GetLastError();
-                NonStandardLogFlow(("SetupDiCallClassInstaller failed with %ld\n", dwErr));
-                hr = HRESULT_FROM_WIN32(dwErr);
-            }
+                NonStandardLogFlow(("vboxNetCfgWinPropChangeAllNetDevicesOfIdCallback: SetupDiCallClassInstaller failed with %ld\n",
+                                    GetLastError()));
         }
         else
-        {
-            DWORD dwErr = GetLastError();
-            NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %ld\n", dwErr));
-            hr = HRESULT_FROM_WIN32(dwErr);
-        }
+            NonStandardLogFlow(("SetupDiSetSelectedDevice failed with %ld\n", GetLastError()));
     }
     else
-    {
-        DWORD dwErr = GetLastError();
-        NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %ld\n", dwErr));
-        hr = HRESULT_FROM_WIN32(dwErr);
-    }
+        NonStandardLogFlow(("SetupDiSetClassInstallParams failed with %ld\n", GetLastError()));
 
+    /* Continue enumeration. */
     return TRUE;
 }
 
 typedef BOOL (*VBOXNETCFGWIN_NETENUM_CALLBACK) (HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDev, PVOID pContext);
-VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinEnumNetDevices(LPCWSTR pPnPId, VBOXNETCFGWIN_NETENUM_CALLBACK callback, PVOID pContext)
+VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinEnumNetDevices(LPCWSTR pwszPnPId,
+                                                        VBOXNETCFGWIN_NETENUM_CALLBACK callback, PVOID pContext)
 {
-    DWORD winEr;
-    HRESULT hr = S_OK;
+    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Searching for: %S\n", pwszPnPId));
 
-    HDEVINFO hDevInfo = SetupDiGetClassDevsExW(
-            &GUID_DEVCLASS_NET,
-            NULL, /* IN PCTSTR Enumerator, OPTIONAL*/
-            NULL, /*IN HWND hwndParent, OPTIONAL*/
-            DIGCF_PRESENT, /*IN DWORD Flags,*/
-            NULL, /*IN HDEVINFO DeviceInfoSet, OPTIONAL*/
-            NULL, /*IN PCTSTR MachineName, OPTIONAL*/
-            NULL /*IN PVOID Reserved*/
-        );
+    HRESULT hr;
+    HDEVINFO hDevInfo = SetupDiGetClassDevsExW(&GUID_DEVCLASS_NET,
+                                               NULL,            /* IN PCTSTR Enumerator, OPTIONAL */
+                                               NULL,            /* IN HWND hwndParent, OPTIONAL */
+                                               DIGCF_PRESENT,   /* IN DWORD Flags,*/
+                                               NULL,            /* IN HDEVINFO DeviceInfoSet, OPTIONAL */
+                                               NULL,            /* IN PCTSTR MachineName, OPTIONAL */
+                                               NULL             /* IN PVOID Reserved */);
     if (hDevInfo != INVALID_HANDLE_VALUE)
     {
-        DWORD iDev = 0;
-        SP_DEVINFO_DATA Dev;
-        PBYTE pBuffer = NULL;
-        DWORD cbBuffer = 0;
-        DWORD cbRequired = 0;
-        BOOL bEnumCompleted;
-        size_t cPnPId = wcslen(pPnPId);
+        DWORD winEr;
 
-        Dev.cbSize = sizeof(Dev);
+        DWORD dwDevId = 0;
+        size_t cPnPId = wcslen(pwszPnPId);
+
+        PBYTE pBuffer = NULL;
 
-        for (; bEnumCompleted = SetupDiEnumDeviceInfo(hDevInfo, iDev, &Dev); iDev++)
+        for (;;)
         {
-            if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo,&Dev,
-                      SPDRP_HARDWAREID, /* IN DWORD Property,*/
-                      NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
-                      pBuffer, /*OUT PBYTE PropertyBuffer,*/
-                      cbBuffer, /* IN DWORD PropertyBufferSize,*/
-                      &cbRequired /*OUT PDWORD RequiredSize OPTIONAL*/
-                    ))
+            SP_DEVINFO_DATA Dev;
+            memset(&Dev, 0, sizeof(SP_DEVINFO_DATA));
+            Dev.cbSize = sizeof(SP_DEVINFO_DATA);
+
+            if (!SetupDiEnumDeviceInfo(hDevInfo, dwDevId, &Dev))
+            {
+                winEr = GetLastError();
+                if (winEr == ERROR_NO_MORE_ITEMS)
+                    winEr = ERROR_SUCCESS;
+                break;
+            }
+
+            NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Enumerating device %ld ... \n", dwDevId));
+            dwDevId++;
+
+            if (pBuffer)
+                free(pBuffer);
+            pBuffer = NULL;
+            DWORD cbBuffer = 0;
+            DWORD cbRequired = 0;
+
+            if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo, &Dev,
+                                                   SPDRP_HARDWAREID, /* IN DWORD Property */
+                                                   NULL,             /* OUT PDWORD PropertyRegDataType OPTIONAL */
+                                                   pBuffer,          /* OUT PBYTE PropertyBuffer */
+                                                   cbBuffer,         /* IN DWORD PropertyBufferSize */
+                                                   &cbRequired       /* OUT PDWORD RequiredSize OPTIONAL */))
             {
                 winEr = GetLastError();
                 if (winEr != ERROR_INSUFFICIENT_BUFFER)
                 {
-                    NonStandardLogFlow(("SetupDiGetDeviceRegistryPropertyW (1) failed winErr(%d)\n", winEr));
-                    hr = HRESULT_FROM_WIN32(winEr);
+                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (1) failed with %ld\n", winEr));
                     break;
                 }
 
-                if (pBuffer)
-                    free(pBuffer);
-
                 pBuffer = (PBYTE)malloc(cbRequired);
+                if (!pBuffer)
+                {
+                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Out of memory allocating %ld bytes\n",
+                                        cbRequired));
+                    winEr = ERROR_OUTOFMEMORY;
+                    break;
+                }
+
                 cbBuffer = cbRequired;
 
                 if (!SetupDiGetDeviceRegistryPropertyW(hDevInfo,&Dev,
-                                                       SPDRP_HARDWAREID, /* IN DWORD Property,*/
-                                                       NULL, /*OUT PDWORD PropertyRegDataType, OPTIONAL*/
-                                                       pBuffer, /*OUT PBYTE PropertyBuffer,*/
-                                                       cbBuffer, /* IN DWORD PropertyBufferSize,*/
-                                                       &cbRequired /*OUT PDWORD RequiredSize OPTIONAL*/
-                                                       ))
+                                                       SPDRP_HARDWAREID, /* IN DWORD Property */
+                                                       NULL,             /* OUT PDWORD PropertyRegDataType, OPTIONAL */
+                                                       pBuffer,          /* OUT PBYTE PropertyBuffer */
+                                                       cbBuffer,         /* IN DWORD PropertyBufferSize */
+                                                       &cbRequired       /* OUT PDWORD RequiredSize OPTIONAL */))
                 {
                     winEr = GetLastError();
-                    NonStandardLogFlow(("SetupDiGetDeviceRegistryPropertyW (2) failed winErr(%d)\n", winEr));
-                    hr = HRESULT_FROM_WIN32(winEr);
+                    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetDeviceRegistryPropertyW (2) failed with %ld\n",
+                                        winEr));
                     break;
                 }
             }
 
-            PWCHAR pCurId = (PWCHAR)pBuffer;
+            PWSTR pCurId = (PWSTR)pBuffer;
             size_t cCurId = wcslen(pCurId);
+
+            NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Device %ld: %S\n", dwDevId, pCurId));
+
             if (cCurId >= cPnPId)
             {
                 pCurId += cCurId - cPnPId;
-                if (!wcsnicmp(pCurId, pPnPId, cPnPId))
+                if (!wcsnicmp(pCurId, pwszPnPId, cPnPId))
                 {
-
-                    if (!callback(hDevInfo,&Dev,pContext))
+                    if (!callback(hDevInfo, &Dev, pContext))
                         break;
                 }
             }
-
         }
 
+        NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Found %ld devices total\n", dwDevId));
+
         if (pBuffer)
             free(pBuffer);
 
-        if (bEnumCompleted)
-        {
-            winEr = GetLastError();
-            hr = winEr == ERROR_NO_MORE_ITEMS ? S_OK : HRESULT_FROM_WIN32(winEr);
-        }
+        hr = HRESULT_FROM_WIN32(winEr);
 
         SetupDiDestroyDeviceInfoList(hDevInfo);
     }
     else
     {
         DWORD winEr = GetLastError();
-        NonStandardLogFlow(("SetupDiGetClassDevsExW failed winErr(%d)\n", winEr));
+        NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: SetupDiGetClassDevsExW failed with %ld\n", winEr));
         hr = HRESULT_FROM_WIN32(winEr);
     }
 
+    NonStandardLogFlow(("VBoxNetCfgWinEnumNetDevices: Ended with hr (0x%x)\n", hr));
     return hr;
 }
 
@@ -1998,25 +2018,24 @@ VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinGenHostOnlyNetworkNetworkIp(OUT PULONG
 
 static HRESULT vboxNetCfgWinNetFltUninstall(IN INetCfg *pNc, DWORD InfRmFlags)
 {
-    INetCfgComponent * pNcc = NULL;
+    INetCfgComponent *pNcc = NULL;
     HRESULT hr = pNc->FindComponent(VBOXNETCFGWIN_NETFLT_ID, &pNcc);
     if (hr == S_OK)
     {
         NonStandardLog("NetFlt is installed currently, uninstalling ...\n");
 
         hr = VBoxNetCfgWinUninstallComponent(pNc, pNcc);
+        NonStandardLogFlow(("NetFlt component uninstallation ended with hr (0x%x)\n", hr));
 
         pNcc->Release();
     }
     else if (hr == S_FALSE)
     {
         NonStandardLog("NetFlt is not installed currently\n");
-        hr = S_OK;
     }
     else
     {
         NonStandardLogFlow(("FindComponent failed, hr (0x%x)\n", hr));
-        hr = S_OK;
     }
 
     VBoxDrvCfgInfUninstallAllF(L"NetService", VBOXNETCFGWIN_NETFLT_ID, InfRmFlags);
@@ -2474,12 +2493,12 @@ VBOXNETCFGWIN_DECL(HRESULT) VBoxNetCfgWinRemoveHostOnlyNetworkInterface(IN const
                     if (!_tcsicmp (DRIVERHWID, t))
                     {
                           /* get the device instance ID */
-                          TCHAR devID [MAX_DEVICE_ID_LEN];
+                          TCHAR devId[MAX_DEVICE_ID_LEN];
                           if (CM_Get_Device_ID(DeviceInfoData.DevInst,
-                                               devID, MAX_DEVICE_ID_LEN, 0) == CR_SUCCESS)
+                                               devId, MAX_DEVICE_ID_LEN, 0) == CR_SUCCESS)
                           {
                               /* compare to what we determined before */
-                              if (wcscmp(devID, lszPnPInstanceId) == 0)
+                              if (wcscmp(devId, lszPnPInstanceId) == 0)
                               {
                                   found = TRUE;
                                   break;
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetAdp.inf b/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetAdp.inf
index 033482a..5aedeaa 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetAdp.inf
+++ b/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetAdp.inf
@@ -53,10 +53,9 @@ VBoxNetAdp.Files.Sys   = 12   ; %windir%\System32\drivers
 %VBoxNetAdp_Desc% = VBoxNetAdp.ndi, sun_VBoxNetAdp
 
 [VBoxNetAdp.ndi]
-Characteristics = 0x4 ; NCF_PHYSICAL 
+Characteristics = 0x1 ; NCF_VIRTUAL 
 CopyFiles = VBoxNetAdp.Files.Sys
 AddReg = VBoxNetAdp.AddReg
-BusType = 1
 
 [VBoxNetAdp.Files.Sys]
 VBoxNetAdp.sys,,,2
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp b/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp
index 0c8ca40..a4a5029 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp
+++ b/src/VBox/HostDrivers/VBoxNetFlt/win/tools/VBoxNetFltUninstall.cpp
@@ -47,7 +47,7 @@ static int VBoxNetFltUninstall()
             if(hr == S_OK)
             {
                 hr = VBoxNetCfgWinNetFltUninstall(pnc);
-                if(hr != S_OK)
+                if(hr != S_OK && hr != S_FALSE)
                 {
                     wprintf(L"error uninstalling VBoxNetFlt (0x%x)\n", hr);
                     r = 1;
diff --git a/src/VBox/HostServices/SharedFolders/service.cpp b/src/VBox/HostServices/SharedFolders/service.cpp
index 8035d89..49a0006 100644
--- a/src/VBox/HostServices/SharedFolders/service.cpp
+++ b/src/VBox/HostServices/SharedFolders/service.cpp
@@ -146,7 +146,7 @@ static DECLCALLBACK(int) svcSaveState(void *, uint32_t u32ClientID, void *pvClie
         {
             uint32_t len;
 
-            len = strlen(pFolderMapping->pszFolderName);
+            len = (uint32_t)strlen(pFolderMapping->pszFolderName);
             rc = SSMR3PutU32(pSSM, len);
             AssertRCReturn(rc, rc);
 
@@ -272,6 +272,11 @@ static DECLCALLBACK(int) svcLoadState(void *, uint32_t u32ClientID, void *pvClie
 
             /* 'i' is the root handle of the saved mapping. */
             rc = vbsfMappingLoaded (&mapping, i);
+            if (RT_FAILURE(rc))
+            {
+                LogRel(("SharedFolders: %Rrc loading %d [%ls] -> [%s]\n",
+                        rc, i, pMapName->String.ucs2, pszFolderName));
+            }
 
             RTMemFree(pMapName);
             RTStrFree(pszFolderName);
diff --git a/src/VBox/HostServices/SharedOpenGL/Makefile.kmk b/src/VBox/HostServices/SharedOpenGL/Makefile.kmk
index 971c1c9..e4e3255 100644
--- a/src/VBox/HostServices/SharedOpenGL/Makefile.kmk
+++ b/src/VBox/HostServices/SharedOpenGL/Makefile.kmk
@@ -101,6 +101,7 @@ VBoxOGLcrserverlib_INCS  = \
 VBoxOGLcrserverlib_INTERMEDIATES = \
 	$(VBOX_PATH_CROGL_GENFILES)/spu_dispatch_table.h \
 	$(VBOX_PATH_CROGL_GENFILES)/server_dispatch.h \
+        $(VBOX_PATH_CROGL_GENFILES)/cr_opcodes.h \
 	$(VBOX_PATH_CROGL_GENFILES)/state/cr_currentpointers.h \
 	$(VBOX_PATH_CROGL_GENFILES)/state/cr_statefuncs.h
 VBoxOGLcrserverlib_SOURCES := \
diff --git a/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp b/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
index 77ddf19..c75d964 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
+++ b/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
@@ -44,6 +44,7 @@ PVBOXHGCMSVCHELPERS g_pHelpers;
 static IConsole* g_pConsole = NULL;
 static uint32_t g_u32ScreenCount = 0;
 static PVM g_pVM = NULL;
+static uint32_t g_u32fCrHgcmDisabled = 0;
 
 #ifndef RT_OS_WINDOWS
 # define DWORD int
@@ -267,6 +268,12 @@ static DECLCALLBACK(int) svcConnect (void *, uint32_t u32ClientID, void *pvClien
 
     NOREF(pvClient);
 
+    if (g_u32fCrHgcmDisabled)
+    {
+        WARN(("connect not expected"));
+        return VERR_INVALID_STATE;
+    }
+
     Log(("SHARED_CROPENGL svcConnect: u32ClientID = %d\n", u32ClientID));
 
     rc = crVBoxServerAddClient(u32ClientID);
@@ -280,6 +287,12 @@ static DECLCALLBACK(int) svcDisconnect (void *, uint32_t u32ClientID, void *pvCl
 
     NOREF(pvClient);
 
+    if (g_u32fCrHgcmDisabled)
+    {
+        WARN(("disconnect not expected"));
+        return VINF_SUCCESS;
+    }
+
     Log(("SHARED_CROPENGL svcDisconnect: u32ClientID = %d\n", u32ClientID));
 
     crVBoxServerRemoveClient(u32ClientID);
@@ -558,6 +571,12 @@ static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32
 
     NOREF(pvClient);
 
+    if (g_u32fCrHgcmDisabled)
+    {
+        WARN(("cr hgcm disabled!"));
+        return;
+    }
+
     Log(("SHARED_CROPENGL svcCall: u32ClientID = %d, fn = %d, cParms = %d, pparms = %d\n", u32ClientID, u32Function, cParms, paParms));
 
 #ifdef DEBUG
@@ -896,24 +915,56 @@ static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32
             break;
         }
 
-        case SHCRGL_GUEST_FN_GET_CAPS:
+        case SHCRGL_GUEST_FN_GET_CAPS_NEW:
         {
-            Log(("svcCall: SHCRGL_GUEST_FN_GET_CAPS\n"));
+            Log(("svcCall: SHCRGL_GUEST_FN_GET_CAPS_NEW\n"));
 
             /* Verify parameter count and types. */
-            if (cParms != SHCRGL_CPARMS_GET_CAPS)
+            if (cParms != SHCRGL_CPARMS_GET_CAPS_NEW)
             {
+                WARN(("invalid parameter count"));
                 rc = VERR_INVALID_PARAMETER;
+                break;
             }
-            else
-            if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT)
+
+            if (paParms[0].type != VBOX_HGCM_SVC_PARM_PTR)
+            {
+                WARN(("invalid parameter"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+
+            if (paParms[0].u.pointer.size < sizeof (CR_CAPS_INFO))
+            {
+                WARN(("invalid buffer size"));
+                rc = VERR_INVALID_PARAMETER;
+                break;
+            }
+
+            CR_CAPS_INFO *pInfo = (CR_CAPS_INFO*)paParms[0].u.pointer.addr;
+            rc = crVBoxServerClientGetCapsNew(u32ClientID, pInfo);
+            AssertRC(rc);
+
+            break;
+        }
+
+        case SHCRGL_GUEST_FN_GET_CAPS_LEGACY:
+        {
+            Log(("svcCall: SHCRGL_GUEST_FN_GET_CAPS_LEGACY\n"));
+
+            /* Verify parameter count and types. */
+            if (cParms != SHCRGL_CPARMS_GET_CAPS_LEGACY)
+            {
+                rc = VERR_INVALID_PARAMETER;
+            }
+            else if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT)
             {
                 rc = VERR_INVALID_PARAMETER;
             }
             else
             {
                 /* Execute the function. */
-                rc = crVBoxServerClientGetCaps(u32ClientID, &paParms[0].u.uint32);
+                rc = crVBoxServerClientGetCapsLegacy(u32ClientID, &paParms[0].u.uint32);
                 AssertRC(rc);
             }
 
@@ -922,6 +973,7 @@ static DECLCALLBACK(void) svcCall (void *, VBOXHGCMCALLHANDLE callHandle, uint32
 
         default:
         {
+            WARN(("svcCall: unexpected u32Function %d", u32Function));
             rc = VERR_NOT_IMPLEMENTED;
         }
     }
@@ -1457,13 +1509,14 @@ static int svcHostCallPerform(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVC
                 break;
             }
 
-            rc = crServerVBoxWindowsShow(paParms[0].u.uint32);
+            rc = crServerVBoxWindowsShow(!!paParms[0].u.uint32);
             if (!RT_SUCCESS(rc))
                 WARN(("crServerVBoxWindowsShow failed rc %d", rc));
 
             break;
         }
         default:
+            WARN(("svcHostCallPerform: unexpected u32Function %d", u32Function));
             rc = VERR_NOT_IMPLEMENTED;
             break;
     }
@@ -1516,25 +1569,41 @@ static DECLCALLBACK(int) svcHostCall(void *, uint32_t u32Function, uint32_t cPar
                 }
                 case VBOXCRCMDCTL_TYPE_DISABLE:
                 {
-                    if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL))
+                    if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL_DISABLE))
                         WARN(("invalid param size"));
-                    return crVBoxServerHgcmDisable();
+                    VBOXCRCMDCTL_DISABLE *pDisable = (VBOXCRCMDCTL_DISABLE*)pCtl;
+                    int rc = crVBoxServerHgcmDisable(&pDisable->Data);
+                    if (RT_SUCCESS(rc))
+                        g_u32fCrHgcmDisabled = 1;
+                    else
+                        WARN(("crVBoxServerHgcmDisable failed %d", rc));
+                    return rc;
                 }
                 case VBOXCRCMDCTL_TYPE_ENABLE:
                 {
                     if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL_ENABLE))
                         WARN(("invalid param size"));
                     VBOXCRCMDCTL_ENABLE *pEnable = (VBOXCRCMDCTL_ENABLE*)pCtl;
-                    return crVBoxServerHgcmEnable(pEnable->hRHCmd, pEnable->pfnRHCmd);
+                    int rc = crVBoxServerHgcmEnable(&pEnable->Data);
+                    if (RT_SUCCESS(rc))
+                        g_u32fCrHgcmDisabled = 0;
+                    else
+                        WARN(("crVBoxServerHgcmEnable failed %d", rc));
+                    return rc;
                 }
                 default:
-                    WARN(("invalid function"));
+                    WARN(("svcHostCall: invalid function %d", pCtl->enmType));
                     return VERR_INVALID_PARAMETER;
             }
             WARN(("should not be here!"));
             return VERR_INTERNAL_ERROR;
         }
         default:
+            if (g_u32fCrHgcmDisabled)
+            {
+                WARN(("cr hgcm disabled!"));
+                return VERR_INVALID_STATE;
+            }
             return svcHostCallPerform(u32Function, cParms, paParms);
     }
 }
@@ -1562,6 +1631,8 @@ extern "C" DECLCALLBACK(DECLEXPORT(int)) VBoxHGCMSvcLoad (VBOXHGCMSVCFNTABLE *pt
         {
             g_pHelpers = ptable->pHelpers;
 
+            g_u32fCrHgcmDisabled = 0;
+
             ptable->cbClient = sizeof (void*);
 
             ptable->pfnUnload     = svcUnload;
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h b/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
index 677bcf0..86b2457 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
@@ -26,6 +26,7 @@ RT_C_DECLS_BEGIN
 
 extern uint8_t* g_pvVRamBase;
 extern uint32_t g_cbVRam;
+extern PPDMLED g_pLed;
 extern HCRHGSMICMDCOMPLETION g_hCrHgsmiCompletion;
 extern PFNCRHGSMICMDCOMPLETION g_pfnCrHgsmiCompletion;
 
@@ -43,14 +44,16 @@ DECLINLINE(void) crServerCrHgsmiCmdComplete(struct VBOXVDMACMD_CHROMIUM_CMD *pCm
 }
 
 #define VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc) do { \
-        Assert(CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData)); \
         CRVBOXHGSMI_CMDDATA_ASSERT_ISSET(_pData); \
         CRVBOXHGSMI_CMDDATA_RC(_pData, _rc); \
-        crServerCrHgsmiCmdComplete((_pData)->pHgsmiCmd, VINF_SUCCESS); \
+        if (CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData)) { \
+            Assert(CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData)); \
+            crServerCrHgsmiCmdComplete((_pData)->pHgsmiCmd, VINF_SUCCESS); \
+        } \
     } while (0)
 
 #define VBOXCRHGSMI_CMD_CHECK_COMPLETE(_pData, _rc) do { \
-        if (CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) { \
+        if (CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) {\
             VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \
         } \
     } while (0)
@@ -368,8 +371,6 @@ DECLINLINE(void) crServerCtxSwitchPostprocess(CR_SERVER_CTX_SWITCH *pData)
 
 void crServerInitTmpCtxDispatch();
 
-int crServerVBoxParseNumerics(const char *pszStr, const int defaultVal);
-
 typedef struct CR_FBMAP
 {
     uint8_t Map[(CR_MAX_GUEST_MONITORS+7)/8];
@@ -406,28 +407,33 @@ int CrPMgrHlpGlblUpdateBegin(CR_FBMAP *pMap);
 void CrPMgrHlpGlblUpdateEnd(CR_FBMAP *pMap);
 HCR_FRAMEBUFFER CrPMgrFbGetFirstEnabled();
 HCR_FRAMEBUFFER CrPMgrFbGetNextEnabled(HCR_FRAMEBUFFER hFb);
-HCR_FRAMEBUFFER CrPMgrFbGetEnabled(uint32_t idScreen);
+HCR_FRAMEBUFFER CrPMgrFbGetEnabled(uint32_t idFb);
+HCR_FRAMEBUFFER CrPMgrFbGetEnabledForScreen(uint32_t idScreen);
 int CrPMgrModeVrdp(bool fEnable);
 int CrPMgrModeRootVr(bool fEnable);
 int CrPMgrModeWinVisible(bool fEnable);
 int CrPMgrRootVrUpdate();
 int CrPMgrViewportUpdate(uint32_t idScreen);
 int CrPMgrScreenChanged(uint32_t idScreen);
-int CrPMgrNotifyResize(HCR_FRAMEBUFFER hFb);
+int CrPMgrResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM, const uint32_t *pTargetMap);
 int CrPMgrSaveState(PSSMHANDLE pSSM);
 int CrPMgrLoadState(PSSMHANDLE pSSM, uint32_t version);
 HCR_FRAMEBUFFER CrPMgrFbGet(uint32_t idScreen);
 /*cleanup stuff*/
 
+
 int CrPMgrInit();
 void CrPMgrTerm();
+int CrPMgrDisable();
+int CrPMgrEnable();
 
 typedef DECLCALLBACKPTR(bool, PFNCR_FRAMEBUFFER_ENTRIES_VISITOR_CB)(HCR_FRAMEBUFFER hFb, HCR_FRAMEBUFFER_ENTRY hEntry, void *pvContext);
 
 bool CrFbHas3DData(HCR_FRAMEBUFFER hFb);
 void CrFbVisitCreatedEntries(HCR_FRAMEBUFFER hFb, PFNCR_FRAMEBUFFER_ENTRIES_VISITOR_CB pfnVisitorCb, void *pvContext);
 int CrFbResize(HCR_FRAMEBUFFER hFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM);
-int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg);
+int CrFbBltGetContentsEx(HCR_FRAMEBUFFER hFb, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg);
+int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg);
 bool CrFbIsEnabled(HCR_FRAMEBUFFER hFb);
 int CrFbEntryCreateForTexId(HCR_FRAMEBUFFER hFb, GLuint idTex, uint32_t fFlags, HCR_FRAMEBUFFER_ENTRY *phEntry);
 int CrFbEntryCreateForTexData(HCR_FRAMEBUFFER hFb, struct CR_TEXDATA *pTex, uint32_t fFlags, HCR_FRAMEBUFFER_ENTRY *phEntry);
@@ -463,7 +469,15 @@ void* CrFbDDataEntryGet(HCR_FRAMEBUFFER_ENTRY hEntry, CRHTABLE_HANDLE hSlot);
 CR_TEXDATA* CrFbTexDataCreate(const VBOXVR_TEXTURE *pTex);
 void CrFbTexDataInit(CR_TEXDATA* pFbTex, const VBOXVR_TEXTURE *pTex, PFNCRTEXDATA_RELEASED pfnTextureReleased);
 
-int32_t crVBoxServerCrCmdBltProcess(PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd);
+int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_BLT_HDR *pCmd, uint32_t cbCmd);
+int8_t crVBoxServerCrCmdClrFillProcess(const VBOXCMDVBVA_CLRFILL_HDR *pCmd, uint32_t cbCmd);
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip);
+
+
+int32_t crVBoxServerClientGet(uint32_t u32ClientID, CRClient **ppClient);
+
+int crServerPendSaveState(PSSMHANDLE pSSM);
+int crServerPendLoadState(PSSMHANDLE pSSM, uint32_t u32Version);
 
 //#define VBOX_WITH_CRSERVER_DUMPER
 #ifdef VBOX_WITH_CRSERVER_DUMPER
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
index b084b88..c81a516 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_config.c
@@ -57,62 +57,6 @@ setDefaults(void)
     cr_server.pfnNotifyEventCB = NULL;
 }
 
-int crServerVBoxParseNumerics(const char *pszStr, const int defaultVal)
-{
-    int result = 0;
-    bool neg = false;
-    unsigned char iDigit = 0;
-    if (!pszStr || pszStr[0] == '\0')
-        return defaultVal;
-
-    for (;;)
-    {
-        if (pszStr[0] == '\0')
-            return defaultVal;
-
-        if (pszStr[0] == ' ' || pszStr[0] == '\t' || pszStr[0] == '\n')
-        {
-            ++pszStr;
-            continue;
-        }
-
-        if (pszStr[0] == '-')
-        {
-            if (neg)
-                return defaultVal;
-
-            neg = true;
-            ++pszStr;
-            continue;
-        }
-
-        break;
-    }
-
-    for (;;)
-    {
-        unsigned char digit;
-        if (pszStr[0] == '\0')
-        {
-            if (!iDigit)
-                return defaultVal;
-            break;
-        }
-
-        digit = pszStr[0] - '0';
-        if (digit > 9)
-            return defaultVal;
-
-        result *= 10;
-        result += digit;
-        ++iDigit;
-
-        ++pszStr;
-    }
-
-    return !neg ? result : -result;
-}
-
 void crServerSetVBoxConfiguration()
 {
     CRMuralInfo *defaultMural;
@@ -212,7 +156,7 @@ void crServerSetVBoxConfiguration()
     env = crGetenv( "CR_SERVER_DEFAULT_VISUAL_BITS" );
     if (env != NULL && env[0] != '\0')
     {
-        unsigned int bits = (unsigned int)crServerVBoxParseNumerics(env, 0);
+        unsigned int bits = (unsigned int)crStrParseI32(env, 0);
         if (bits <= CR_ALL_BITS)
             cr_server.fVisualBitsDefault = bits;
         else
@@ -224,12 +168,14 @@ void crServerSetVBoxConfiguration()
     env = crGetenv("CR_SERVER_CAPS");
     if (env && env[0] != '\0')
     {
-        cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
+        cr_server.u32Caps = crStrParseI32(env, 0);
         cr_server.u32Caps &= CR_VBOX_CAPS_ALL;
     }
     else
     {
         cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT
+                | CR_VBOX_CAP_CMDVBVA
+                | CR_VBOX_CAP_CMDBLOCKS
                 | CR_VBOX_CAP_GETATTRIBSLOCATIONS
                 ;
     }
@@ -360,7 +306,7 @@ void crServerSetVBoxConfigurationHGCM()
     env = crGetenv( "CR_SERVER_DEFAULT_VISUAL_BITS" );
     if (env != NULL && env[0] != '\0')
     {
-        unsigned int bits = (unsigned int)crServerVBoxParseNumerics(env, 0);
+        unsigned int bits = (unsigned int)crStrParseI32(env, 0);
         if (bits <= CR_ALL_BITS)
             cr_server.fVisualBitsDefault = bits;
         else
@@ -372,12 +318,14 @@ void crServerSetVBoxConfigurationHGCM()
     env = crGetenv("CR_SERVER_CAPS");
     if (env && env[0] != '\0')
     {
-        cr_server.u32Caps = crServerVBoxParseNumerics(env, 0);
+        cr_server.u32Caps = crStrParseI32(env, 0);
         cr_server.u32Caps &= CR_VBOX_CAPS_ALL;
     }
     else
     {
         cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT
+                | CR_VBOX_CAP_CMDVBVA
+                | CR_VBOX_CAP_CMDBLOCKS
                 | CR_VBOX_CAP_GETATTRIBSLOCATIONS
                 ;
     }
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c
index 6c3d9bd..4560b9a 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c
@@ -60,7 +60,6 @@ GLuint crServerTranslateProgramID( GLuint id )
 void SERVER_DISPATCH_APIENTRY
 crServerDispatchNewList( GLuint list, GLenum mode )
 {
-    Assert(0);
     if (mode == GL_COMPILE_AND_EXECUTE)
         crWarning("using glNewList(GL_COMPILE_AND_EXECUTE) can confuse the crserver");
 
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
index 1a7e360..7cdd0a7 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
@@ -37,6 +37,8 @@
 # include <VBox/HostServices/VBoxCrOpenGLSvc.h>
 uint8_t* g_pvVRamBase = NULL;
 uint32_t g_cbVRam = 0;
+PPDMLED g_pLed = NULL;
+
 HCRHGSMICMDCOMPLETION g_hCrHgsmiCompletion = NULL;
 PFNCRHGSMICMDCOMPLETION g_pfnCrHgsmiCompletion = NULL;
 #endif
@@ -59,33 +61,44 @@ CRServer cr_server;
 
 int tearingdown = 0; /* can't be static */
 
-static DECLCALLBACK(int) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd);
+static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd);
 
-DECLINLINE(int32_t) crVBoxServerClientGet(uint32_t u32ClientID, CRClient **ppClient)
+DECLINLINE(CRClient*) crVBoxServerClientById(uint32_t u32ClientID)
 {
-    CRClient *pClient = NULL;
     int32_t i;
 
-    *ppClient = NULL;
+    if (cr_server.fCrCmdEnabled)
+        return CrHTableGet(&cr_server.clientTable, u32ClientID);
 
     for (i = 0; i < cr_server.numClients; i++)
     {
         if (cr_server.clients[i] && cr_server.clients[i]->conn
             && cr_server.clients[i]->conn->u32ClientID==u32ClientID)
         {
-            pClient = cr_server.clients[i];
-            break;
+            return cr_server.clients[i];
         }
     }
+
+    return NULL;
+}
+
+int32_t crVBoxServerClientGet(uint32_t u32ClientID, CRClient **ppClient)
+{
+    CRClient *pClient = NULL;
+
+    pClient = crVBoxServerClientById(u32ClientID);
+
     if (!pClient)
     {
-        crWarning("client not found!");
+        WARN(("client not found!"));
+        *ppClient = NULL;
         return VERR_INVALID_PARAMETER;
     }
 
     if (!pClient->conn->vMajor)
     {
-        crWarning("no major version specified for client!");
+        WARN(("no major version specified for client!"));
+        *ppClient = NULL;
         return VERR_NOT_SUPPORTED;
     }
 
@@ -134,11 +147,14 @@ static void deleteMuralInfoCallback( void *data )
     crFree(m);
 }
 
+static int crVBoxServerCrCmdDisablePostProcess(VBOXCRCMDCTL_HGCMENABLE_DATA *pData);
+
 static void crServerTearDown( void )
 {
     GLint i;
     CRClientNode *pNode, *pNext;
     GLboolean fOldEnableDiff;
+    GLboolean fContextsDeleted = GL_FALSE;
 
     /* avoid a race condition */
     if (tearingdown)
@@ -146,6 +162,30 @@ static void crServerTearDown( void )
 
     tearingdown = 1;
 
+    if (cr_server.fCrCmdEnabled)
+    {
+        VBOXCRCMDCTL_HGCMENABLE_DATA EnableData;
+        /* crVBoxServerHgcmEnable will erase the DisableData, preserve it here */
+        VBOXCRCMDCTL_HGCMDISABLE_DATA DisableData = cr_server.DisableData;
+        int rc;
+
+        CRASSERT(DisableData.pfnNotifyTerm);
+        rc = DisableData.pfnNotifyTerm(DisableData.hNotifyTerm, &EnableData);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("pfnNotifyTerm failed %d", rc));
+            return;
+        }
+
+        crVBoxServerCrCmdDisablePostProcess(&EnableData);
+        fContextsDeleted = GL_TRUE;
+
+        CRASSERT(DisableData.pfnNotifyTermDone);
+        DisableData.pfnNotifyTermDone(DisableData.hNotifyTerm);
+
+        Assert(!cr_server.fCrCmdEnabled);
+    }
+
     crStateSetCurrent( NULL );
 
     cr_server.curClient = NULL;
@@ -161,9 +201,12 @@ static void crServerTearDown( void )
     cr_server.currentNativeWindow = 0;
     cr_server.currentMural = NULL;
 
-    /* sync our state with renderspu,
-     * do it before mural & context deletion to avoid deleting currently set murals/contexts*/
-    cr_server.head_spu->dispatch_table.MakeCurrent(CR_RENDER_DEFAULT_WINDOW_ID, 0, CR_RENDER_DEFAULT_CONTEXT_ID);
+    if (!fContextsDeleted)
+    {
+        /* sync our state with renderspu,
+         * do it before mural & context deletion to avoid deleting currently set murals/contexts*/
+        cr_server.head_spu->dispatch_table.MakeCurrent(CR_RENDER_DEFAULT_WINDOW_ID, 0, CR_RENDER_DEFAULT_CONTEXT_ID);
+    }
 
     /* Deallocate all semaphores */
     crFreeHashtable(cr_server.semaphores, crFree);
@@ -177,10 +220,13 @@ static void crServerTearDown( void )
     crFreeHashtable(cr_server.contextTable, deleteContextInfoCallback);
 
     /* synchronize with reality */
-    fOldEnableDiff = crStateEnableDiffOnMakeCurrent(GL_FALSE);
-    if(cr_server.MainContextInfo.pContext)
-        crStateMakeCurrent(cr_server.MainContextInfo.pContext);
-    crStateEnableDiffOnMakeCurrent(fOldEnableDiff);
+    if (!fContextsDeleted)
+    {
+        fOldEnableDiff = crStateEnableDiffOnMakeCurrent(GL_FALSE);
+        if(cr_server.MainContextInfo.pContext)
+            crStateMakeCurrent(cr_server.MainContextInfo.pContext);
+        crStateEnableDiffOnMakeCurrent(fOldEnableDiff);
+    }
 
     /* Free vertex programs */
     crFreeHashtable(cr_server.programTable, crFree);
@@ -336,6 +382,9 @@ crServerInit(int argc, char *argv[])
     }
 #endif
 
+    cr_server.fCrCmdEnabled = GL_FALSE;
+    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
+
     cr_server.bUseMultipleContexts = (crGetenv( "CR_SERVER_ENABLE_MULTIPLE_CONTEXTS" ) != NULL);
 
     if (cr_server.bUseMultipleContexts)
@@ -440,6 +489,9 @@ GLboolean crVBoxServerInit(void)
     }
 #endif
 
+    cr_server.fCrCmdEnabled = GL_FALSE;
+    CrHTableCreate(&cr_server.clientTable, CR_MAX_CLIENTS);
+
     cr_server.bUseMultipleContexts = (crGetenv( "CR_SERVER_ENABLE_MULTIPLE_CONTEXTS" ) != NULL);
 
     if (cr_server.bUseMultipleContexts)
@@ -590,6 +642,29 @@ int32_t crVBoxServerAddClient(uint32_t u32ClientID)
     return VINF_SUCCESS;
 }
 
+static void crVBoxServerRemoveClientObj(CRClient *pClient)
+{
+#ifdef VBOX_WITH_CRHGSMI
+    CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
+#endif
+
+    /* Disconnect the client */
+    pClient->conn->Disconnect(pClient->conn);
+
+    /* Let server clear client from the queue */
+    crServerDeleteClient(pClient);
+}
+
+static void crVBoxServerRemoveAllClients()
+{
+    int32_t i;
+    for (i = cr_server.numClients - 1; i >= 0; --i)
+    {
+        Assert(cr_server.clients[i]);
+        crVBoxServerRemoveClientObj(cr_server.clients[i]);
+    }
+}
+
 void crVBoxServerRemoveClient(uint32_t u32ClientID)
 {
     CRClient *pClient=NULL;
@@ -609,22 +684,14 @@ void crVBoxServerRemoveClient(uint32_t u32ClientID)
     //if (!pClient) return VERR_INVALID_PARAMETER;
     if (!pClient)
     {
-        crWarning("Invalid client id %u passed to crVBoxServerRemoveClient", u32ClientID);
+        WARN(("Invalid client id %u passed to crVBoxServerRemoveClient", u32ClientID));
         return;
     }
 
-#ifdef VBOX_WITH_CRHGSMI
-    CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-#endif
-
-    /* Disconnect the client */
-    pClient->conn->Disconnect(pClient->conn);
-
-    /* Let server clear client from the queue */
-    crServerDeleteClient(pClient);
+    crVBoxServerRemoveClientObj(pClient);
 }
 
-static int32_t crVBoxServerInternalClientWriteRead(CRClient *pClient)
+static void crVBoxServerInternalClientWriteRead(CRClient *pClient)
 {
 #ifdef VBOXCR_LOGFPS
     uint64_t tstart, tend;
@@ -703,8 +770,6 @@ static int32_t crVBoxServerInternalClientWriteRead(CRClient *pClient)
     pClient->timeUsed += tend-tstart;
 #endif
     /*crDebug("<=crServer: ClientWrite u32ClientID=%d", u32ClientID);*/
-
-    return VINF_SUCCESS;
 }
 
 
@@ -728,7 +793,9 @@ int32_t crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t
     CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
 #endif
 
-    return crVBoxServerInternalClientWriteRead(pClient);
+    crVBoxServerInternalClientWriteRead(pClient);
+
+    return VINF_SUCCESS;
 }
 
 int32_t crVBoxServerInternalClientRead(CRClient *pClient, uint8_t *pBuffer, uint32_t *pcbBuffer)
@@ -772,9 +839,18 @@ int32_t crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t
     return crVBoxServerInternalClientRead(pClient, pBuffer, pcbBuffer);
 }
 
-extern DECLEXPORT(int32_t) crVBoxServerClientGetCaps(uint32_t u32ClientID, uint32_t *pu32Caps)
+extern DECLEXPORT(int32_t) crVBoxServerClientGetCapsLegacy(uint32_t u32ClientID, uint32_t *pu32Caps)
 {
-    *pu32Caps = cr_server.u32Caps;
+    uint32_t u32Caps = cr_server.u32Caps;
+    u32Caps &= ~CR_VBOX_CAP_CMDVBVA;
+    *pu32Caps = u32Caps;
+    return VINF_SUCCESS;
+}
+
+extern DECLEXPORT(int32_t) crVBoxServerClientGetCapsNew(uint32_t u32ClientID, CR_CAPS_INFO *pInfo)
+{
+    pInfo->u32Caps = cr_server.u32Caps;
+    pInfo->u32CmdVbvaVersion = CR_CMDVBVA_VERSION;
     return VINF_SUCCESS;
 }
 
@@ -1597,7 +1673,7 @@ static void crVBoxServerCheckConsistency()
 
 static uint32_t g_hackVBoxServerSaveLoadCallsLeft = 0;
 
-DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
+static int32_t crVBoxServerSaveStatePerform(PSSMHANDLE pSSM)
 {
     int32_t  rc, i;
     uint32_t ui32;
@@ -1618,7 +1694,7 @@ DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
 #endif
 
     /* We shouldn't be called if there's no clients at all*/
-    CRASSERT(cr_server.numClients>0);
+    CRASSERT(cr_server.numClients > 0);
 
     /* @todo it's hack atm */
     /* We want to be called only once to save server state but atm we're being called from svcSaveState
@@ -1632,7 +1708,8 @@ DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
         rc = SSMR3PutU32(pSSM, (uint32_t) cr_server.numClients);
         AssertRCReturn(rc, rc);
 
-        g_hackVBoxServerSaveLoadCallsLeft = cr_server.numClients;
+        /* we get called only once for CrCmd case, so disable the hack */
+        g_hackVBoxServerSaveLoadCallsLeft = cr_server.fCrCmdEnabled ? 1 : cr_server.numClients;
     }
 
     g_hackVBoxServerSaveLoadCallsLeft--;
@@ -1760,6 +1837,9 @@ DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
         }
     }
 
+    rc = crServerPendSaveState(pSSM);
+    AssertRCReturn(rc, rc);
+
     rc = CrPMgrSaveState(pSSM);
     AssertRCReturn(rc, rc);
 
@@ -1778,6 +1858,17 @@ DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
     return VINF_SUCCESS;
 }
 
+DECLEXPORT(int32_t) crVBoxServerSaveState(PSSMHANDLE pSSM)
+{
+    if (cr_server.fCrCmdEnabled)
+    {
+        WARN(("we should not be called with cmd enabled!"));
+        return VERR_INTERNAL_ERROR;
+    }
+
+    return crVBoxServerSaveStatePerform(pSSM);
+}
+
 static DECLCALLBACK(CRContext*) crVBoxServerGetContextCB(void* pvData)
 {
     CRContextInfo* pContextInfo = (CRContextInfo*)pvData;
@@ -2300,7 +2391,7 @@ static int crVBoxServerLoadFBImage(PSSMHANDLE pSSM, uint32_t version,
     return VINF_SUCCESS;
 }
 
-DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
+static int32_t crVBoxServerLoadStatePerform(PSSMHANDLE pSSM, uint32_t version)
 {
     int32_t  rc, i;
     uint32_t ui, uiNumElems;
@@ -2316,6 +2407,11 @@ DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
         /* Read number of clients */
         rc = SSMR3GetU32(pSSM, &g_hackVBoxServerSaveLoadCallsLeft);
         AssertRCReturn(rc, rc);
+
+        Assert(g_hackVBoxServerSaveLoadCallsLeft);
+        /* we get called only once for CrCmd */
+        if (cr_server.fCrCmdEnabled)
+            g_hackVBoxServerSaveLoadCallsLeft = 1;
     }
 
     g_hackVBoxServerSaveLoadCallsLeft--;
@@ -2639,6 +2735,9 @@ DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
 
     cr_server.curClient = NULL;
 
+    rc = crServerPendLoadState(pSSM, version);
+    AssertRCReturn(rc, rc);
+
     if (version >= SHCROGL_SSM_VERSION_WITH_SCREEN_INFO)
     {
         rc = CrPMgrLoadState(pSSM, version);
@@ -2665,6 +2764,17 @@ DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
     return VINF_SUCCESS;
 }
 
+DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version)
+{
+    if (cr_server.fCrCmdEnabled)
+    {
+        WARN(("CrCmd enabled"));
+        return VERR_INTERNAL_ERROR;
+    }
+
+    return crVBoxServerLoadStatePerform(pSSM, version);
+}
+
 #define SCREEN(i) (cr_server.screen[i])
 #define MAPPED(screen) ((screen).winID != 0)
 
@@ -2714,7 +2824,7 @@ DECLEXPORT(int32_t) crVBoxServerSetScreenCount(int sCount)
     for (i=0; i<cr_server.screenCount; ++i)
     {
         if (MAPPED(SCREEN(i)))
-            crWarning("Screen count is changing, but screen[%i] is still mapped", i);
+            WARN(("Screen count is changing, but screen[%i] is still mapped", i));
         return VERR_NOT_IMPLEMENTED;
     }
 
@@ -2925,37 +3035,97 @@ DECLEXPORT(int32_t) crVBoxServerSetScreenViewport(int sIndex, int32_t x, int32_t
     return VINF_SUCCESS;
 }
 
-static void crVBoxServerDefaultContextSet()
+static void crVBoxServerDeleteMuralCb(unsigned long key, void *data1, void *data2)
+{
+    CRHashTable *h = (CRHashTable*)data2;
+    CRMuralInfo *m = (CRMuralInfo *) data1;
+    if (m->spuWindow == CR_RENDER_DEFAULT_WINDOW_ID)
+        return;
+
+    crHashtableDelete(h, key, NULL);
+    crServerMuralTerm(m);
+    crFree(m);
+}
+
+static void crVBoxServerDefaultContextClear()
 {
-    GLint spuWindow, spuCtx;
+    HCR_FRAMEBUFFER hFb;
+    int rc = CrPMgrDisable();
+    if (RT_FAILURE(rc))
+    {
+        WARN(("CrPMgrDisable failed %d", rc));
+        return;
+    }
 
-    if (cr_server.MainContextInfo.SpuContext)
+    for (hFb = CrPMgrFbGetFirstEnabled(); hFb; hFb = CrPMgrFbGetNextEnabled(hFb))
     {
-        CRMuralInfo *pMural = crServerGetDummyMural(cr_server.MainContextInfo.CreateInfo.realVisualBits);
-        if (!pMural)
+        int rc = CrFbUpdateBegin(hFb);
+        if (RT_SUCCESS(rc))
         {
-            WARN(("dummy mural is NULL"));
-            spuCtx = CR_RENDER_DEFAULT_CONTEXT_ID;
-            spuWindow = CR_RENDER_DEFAULT_WINDOW_ID;
+            CrFbRegionsClear(hFb);
+            CrFbUpdateEnd(hFb);
         }
         else
-        {
-            spuCtx = cr_server.MainContextInfo.SpuContext;
-            spuWindow = pMural->CreateInfo.realVisualBits;
-        }
+            WARN(("CrFbUpdateBegin failed %d", rc));
     }
-    else
+
+    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
+    crStateCleanupCurrent();
+
+    /* note: we need to clean all contexts, since otherwise renderspu leanup won't work,
+     * i.e. renderspu would need to clean up its own internal windows, it won't be able to do that if
+     * some those windows is associated with any context.  */
+    if (cr_server.MainContextInfo.SpuContext)
     {
-        spuCtx = CR_RENDER_DEFAULT_CONTEXT_ID;
-        spuWindow = CR_RENDER_DEFAULT_WINDOW_ID;
+        cr_server.head_spu->dispatch_table.DestroyContext(cr_server.MainContextInfo.SpuContext);
+        crStateDestroyContext(cr_server.MainContextInfo.pContext);
+        if (cr_server.MainContextInfo.CreateInfo.pszDpyName)
+            crFree(cr_server.MainContextInfo.CreateInfo.pszDpyName);
+
+        memset(&cr_server.MainContextInfo, 0, sizeof (cr_server.MainContextInfo));
     }
 
-    cr_server.head_spu->dispatch_table.MakeCurrent(spuWindow, 0, spuCtx);
+    cr_server.firstCallCreateContext = GL_TRUE;
+    cr_server.firstCallMakeCurrent = GL_TRUE;
+    cr_server.bForceMakeCurrentOnClientSwitch = GL_FALSE;
+
+    CRASSERT(!cr_server.curClient);
+
+    cr_server.currentCtxInfo = NULL;
+    cr_server.currentWindow = 0;
+    cr_server.currentNativeWindow = 0;
+    cr_server.currentMural = NULL;
+
+    crStateDestroy();
+//    crStateCleanupCurrent();
+
+    if (CrBltIsInitialized(&cr_server.Blitter))
+    {
+        CrBltTerm(&cr_server.Blitter);
+        Assert(!CrBltIsInitialized(&cr_server.Blitter));
+    }
+
+    crHashtableWalk(cr_server.dummyMuralTable, crVBoxServerDeleteMuralCb, cr_server.dummyMuralTable);
+
+    cr_server.head_spu->dispatch_table.ChromiumParameteriCR(GL_HH_RENDERTHREAD_INFORM, 0);
+}
+
+static void crVBoxServerDefaultContextSet()
+{
+    cr_server.head_spu->dispatch_table.ChromiumParameteriCR(GL_HH_RENDERTHREAD_INFORM, 1);
+
+    CRASSERT(!cr_server.MainContextInfo.SpuContext);
+
+//    crStateSetCurrent(NULL);
+    crStateInit();
+    crStateDiffAPI( &(cr_server.head_spu->dispatch_table) );
+
+    CrPMgrEnable();
 }
 
 #ifdef VBOX_WITH_CRHGSMI
 
-static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCmd, uint32_t cbCmd)
+static int32_t crVBoxServerCmdVbvaCrCmdProcess(const struct VBOXCMDVBVA_CRCMD_CMD *pCmd, uint32_t cbCmd)
 {
     int32_t rc;
     uint32_t cBuffers = pCmd->cBuffers;
@@ -2980,7 +3150,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
 
     cParams = cBuffers-1;
 
-    if (cbCmd != RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers]))
+    if (cbCmd < RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers]))
     {
         WARN(("invalid buffer size"));
         return VERR_INVALID_PARAMETER;
@@ -3013,14 +3183,14 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
             if (cParams == 1)
             {
                 CRVBOXHGSMIWRITE* pFnCmd = (CRVBOXHGSMIWRITE*)pHdr;
-                VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
+                const VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
                 /* Fetch parameters. */
                 uint32_t cbBuffer = pBuf->cbBuffer;
                 uint8_t *pBuffer  = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t);
 
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid write cmd buffer size!");
+                    WARN(("invalid write cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3028,7 +3198,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 CRASSERT(cbBuffer);
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3036,6 +3206,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 rc = crVBoxServerClientGet(u32ClientID, &pClient);
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
 
@@ -3046,22 +3217,19 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, false);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
-            }
-            else
-            {
-                crWarning("invalid number of args");
-                rc = VERR_INVALID_PARAMETER;
-                break;
+                return VINF_SUCCESS;
             }
+
+            WARN(("invalid number of args"));
+            rc = VERR_INVALID_PARAMETER;
             break;
         }
 
         case SHCRGL_GUEST_FN_INJECT:
         {
-            Log(("svcCall: SHCRGL_GUEST_FN_INJECT\n"));
+            WARN(("svcCall: SHCRGL_GUEST_FN_INJECT\n"));
 
             /* @todo: Verify  */
             if (cParams == 1)
@@ -3069,13 +3237,13 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 CRVBOXHGSMIINJECT *pFnCmd = (CRVBOXHGSMIINJECT*)pHdr;
                 /* Fetch parameters. */
                 uint32_t u32InjectClientID = pFnCmd->u32ClientID;
-                VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
+                const VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
                 uint32_t cbBuffer = pBuf->cbBuffer;
                 uint8_t *pBuffer  = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t);
 
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid inject cmd buffer size!");
+                    WARN(("invalid inject cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3083,7 +3251,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 CRASSERT(cbBuffer);
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3091,6 +3259,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 rc = crVBoxServerClientGet(u32InjectClientID, &pClient);
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
 
@@ -3101,12 +3270,12 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, false);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                return VINF_SUCCESS;
             }
 
-            crWarning("invalid number of args");
+            WARN(("invalid number of args"));
             rc = VERR_INVALID_PARAMETER;
             break;
         }
@@ -3119,22 +3288,21 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
             if (cParams == 1)
             {
                 CRVBOXHGSMIREAD *pFnCmd = (CRVBOXHGSMIREAD*)pHdr;
-                VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
+                const VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
                 /* Fetch parameters. */
                 uint32_t cbBuffer = pBuf->cbBuffer;
                 uint8_t *pBuffer  = VBOXCRHGSMI_PTR_SAFE(pBuf->offBuffer, cbBuffer, uint8_t);
 
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid read cmd buffer size!");
+                    WARN(("invalid read cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
 
-
                 if (!pBuffer)
                 {
-                    crWarning("invalid buffer data received from guest!");
+                    WARN(("invalid buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3142,6 +3310,7 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 rc = crVBoxServerClientGet(u32ClientID, &pClient);
                 if (RT_FAILURE(rc))
                 {
+                    WARN(("crVBoxServerClientGet failed %d", rc));
                     break;
                 }
 
@@ -3155,9 +3324,13 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
 
                 /* the read command is never pended, complete it right away */
-                pHdr->result = rc;
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("crVBoxServerInternalClientRead failed %d", rc));
+                    break;
+                }
 
-                return VINF_SUCCESS;
+                break;
             }
 
             crWarning("invalid number of args");
@@ -3173,8 +3346,8 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
             if (cParams == 2)
             {
                 CRVBOXHGSMIWRITEREAD *pFnCmd = (CRVBOXHGSMIWRITEREAD*)pHdr;
-                VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
-                VBOXCMDVBVA_CRCMD_BUFFER *pWbBuf = &pCmd->aBuffers[2];
+                const VBOXCMDVBVA_CRCMD_BUFFER *pBuf = &pCmd->aBuffers[1];
+                const VBOXCMDVBVA_CRCMD_BUFFER *pWbBuf = &pCmd->aBuffers[2];
 
                 /* Fetch parameters. */
                 uint32_t cbBuffer = pBuf->cbBuffer;
@@ -3185,16 +3358,15 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
 
                 if (cbHdr < sizeof (*pFnCmd))
                 {
-                    crWarning("invalid write_read cmd buffer size!");
+                    WARN(("invalid write_read cmd buffer size!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
 
-
                 CRASSERT(cbBuffer);
                 if (!pBuffer)
                 {
-                    crWarning("invalid write buffer data received from guest!");
+                    WARN(("invalid write buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
@@ -3202,15 +3374,16 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 CRASSERT(cbWriteback);
                 if (!pWriteback)
                 {
-                    crWarning("invalid writeback buffer data received from guest!");
+                    WARN(("invalid writeback buffer data received from guest!"));
                     rc = VERR_INVALID_PARAMETER;
                     break;
                 }
+
                 rc = crVBoxServerClientGet(u32ClientID, &pClient);
                 if (RT_FAILURE(rc))
                 {
-                    pHdr->result = rc;
-                    return VINF_SUCCESS;
+                    WARN(("crVBoxServerClientGet failed %d", rc));
+                    break;
                 }
 
                 /* This should never fire unless we start to multithread */
@@ -3220,9 +3393,9 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SETWB(&pClient->conn->CmdData, pCmd, pHdr, pWriteback, cbWriteback, &pFnCmd->cbWriteback, false);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                return VINF_SUCCESS;
             }
 
             crWarning("invalid number of args");
@@ -3232,49 +3405,64 @@ static int32_t crVBoxServerCmdVbvaCrCmdProcess(struct VBOXCMDVBVA_CRCMD_CMD *pCm
 
         case SHCRGL_GUEST_FN_SET_VERSION:
         {
-            crWarning("invalid function");
+            WARN(("SHCRGL_GUEST_FN_SET_VERSION: invalid function"));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
 
         case SHCRGL_GUEST_FN_SET_PID:
         {
-            crWarning("invalid function");
+            WARN(("SHCRGL_GUEST_FN_SET_PID: invalid function"));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
 
         default:
         {
-            crWarning("invalid function");
+            WARN(("invalid function, %d", u32Function));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
 
     }
 
-    /* we can be on fail only here */
-    CRASSERT(RT_FAILURE(rc));
     pHdr->result = rc;
 
-    return rc;
+    return VINF_SUCCESS;
 }
 
 static DECLCALLBACK(int) crVBoxCrCmdEnable(HVBOXCRCMDSVR hSvr, VBOXCRCMD_SVRENABLE_INFO *pInfo)
 {
+    Assert(!cr_server.fCrCmdEnabled);
+    Assert(!cr_server.numClients);
+
     cr_server.CrCmdClientInfo = *pInfo;
 
     crVBoxServerDefaultContextSet();
 
+    cr_server.fCrCmdEnabled = GL_TRUE;
+
+    crInfo("crCmd ENABLED");
+
     return VINF_SUCCESS;
 }
 
 static DECLCALLBACK(int) crVBoxCrCmdDisable(HVBOXCRCMDSVR hSvr)
 {
-    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
+    Assert(cr_server.fCrCmdEnabled);
+
+    crVBoxServerRemoveAllClients();
+
+    CrHTableEmpty(&cr_server.clientTable);
+
+    crVBoxServerDefaultContextClear();
 
     memset(&cr_server.CrCmdClientInfo, 0, sizeof (cr_server.CrCmdClientInfo));
 
+    cr_server.fCrCmdEnabled = GL_FALSE;
+
+    crInfo("crCmd DISABLED");
+
     return VINF_SUCCESS;
 }
 
@@ -3283,6 +3471,75 @@ static DECLCALLBACK(int) crVBoxCrCmdHostCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, u
     return crVBoxServerHostCtl((VBOXCRCMDCTL*)pCmd, cbCmd);
 }
 
+static int crVBoxCrDisconnect(uint32_t u32Client)
+{
+    CRClient *pClient = (CRClient*)CrHTableRemove(&cr_server.clientTable, u32Client);
+    if (!pClient)
+    {
+        WARN(("invalid client id"));
+        return VERR_INVALID_PARAMETER;
+    }
+
+    crVBoxServerRemoveClientObj(pClient);
+
+    return VINF_SUCCESS;
+}
+
+static int crVBoxCrConnectEx(VBOXCMDVBVA_3DCTL_CONNECT *pConnect, uint32_t u32ClientId)
+{
+    CRClient *pClient;
+    int rc;
+
+    if (u32ClientId == CRHTABLE_HANDLE_INVALID)
+    {
+        /* allocate client id */
+        u32ClientId =  CrHTablePut(&cr_server.clientTable, (void*)1);
+        if (u32ClientId == CRHTABLE_HANDLE_INVALID)
+        {
+            WARN(("CrHTablePut failed"));
+            return VERR_NO_MEMORY;
+        }
+    }
+
+    rc = crVBoxServerAddClientObj(u32ClientId, &pClient);
+    if (RT_SUCCESS(rc))
+    {
+        rc = crVBoxServerClientObjSetVersion(pClient, pConnect->u32MajorVersion, pConnect->u32MinorVersion);
+        if (RT_SUCCESS(rc))
+        {
+            rc = crVBoxServerClientObjSetPID(pClient, pConnect->u64Pid);
+            if (RT_SUCCESS(rc))
+            {
+                rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient);
+                if (RT_SUCCESS(rc))
+                {
+                    pConnect->Hdr.u32CmdClientId = u32ClientId;
+                    return VINF_SUCCESS;
+                }
+                else
+                    WARN(("CrHTablePutToSlot failed %d", rc));
+            }
+            else
+                WARN(("crVBoxServerClientObjSetPID failed %d", rc));
+        }
+        else
+            WARN(("crVBoxServerClientObjSetVersion failed %d", rc));
+
+        crVBoxServerRemoveClientObj(pClient);
+    }
+    else
+        WARN(("crVBoxServerAddClientObj failed %d", rc));
+
+    CrHTableRemove(&cr_server.clientTable, u32ClientId);
+
+    return rc;
+}
+
+static int crVBoxCrConnect(VBOXCMDVBVA_3DCTL_CONNECT *pConnect)
+{
+    return crVBoxCrConnectEx(pConnect, CRHTABLE_HANDLE_INVALID);
+}
+
 static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd)
 {
     VBOXCMDVBVA_3DCTL *pCtl = (VBOXCMDVBVA_3DCTL*)pCmd;
@@ -3296,13 +3553,23 @@ static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd,
     {
         case VBOXCMDVBVA3DCTL_TYPE_CONNECT:
         {
-            VBOXCMDVBVA_3DCTL_CONNECT *pConnect = (VBOXCMDVBVA_3DCTL_CONNECT*)pCtl;
+            if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL_CONNECT))
+            {
+                WARN(("invalid command size"));
+                return VERR_INVALID_PARAMETER;
+            }
 
-            return VERR_NOT_SUPPORTED;
+            return crVBoxCrConnect((VBOXCMDVBVA_3DCTL_CONNECT*)pCtl);
         }
         case VBOXCMDVBVA3DCTL_TYPE_DISCONNECT:
         {
-            return VERR_NOT_SUPPORTED;
+            if (cbCmd != sizeof (VBOXCMDVBVA_3DCTL))
+            {
+                WARN(("invalid command size"));
+                return VERR_INVALID_PARAMETER;
+            }
+
+            return crVBoxCrDisconnect(pCtl->u32CmdClientId);
         }
         case VBOXCMDVBVA3DCTL_TYPE_CMD:
         {
@@ -3318,65 +3585,282 @@ static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd,
             return crVBoxCrCmdCmd(NULL, &p3DCmd->Cmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_3DCTL_CMD, Cmd));
         }
         default:
-            WARN(("invalid function"));
+            WARN(("crVBoxCrCmdGuestCtl: invalid function %d", pCtl->u32Type));
             return VERR_INVALID_PARAMETER;
     }
 }
 
+static DECLCALLBACK(int) crVBoxCrCmdResize(HVBOXCRCMDSVR hSvr, const struct VBVAINFOSCREEN *pScreen, const uint32_t *pTargetMap)
+{
+    CRASSERT(cr_server.fCrCmdEnabled);
+    return CrPMgrResize(pScreen, NULL, pTargetMap);
+}
+
+static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***";
+
+static int crVBoxCrCmdSaveClients(PSSMHANDLE pSSM)
+{
+    int i;
+    int rc = SSMR3PutU32(pSSM, cr_server.numClients);
+    AssertRCReturn(rc, rc);
+
+    for (i = 0; i < cr_server.numClients; i++)
+    {
+        CRClient * pClient = cr_server.clients[i];
+        Assert(pClient);
+
+        rc = SSMR3PutU32(pSSM, pClient->conn->u32ClientID);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3PutU32(pSSM, pClient->conn->vMajor);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3PutU32(pSSM, pClient->conn->vMinor);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3PutU64(pSSM, pClient->pid);
+        AssertRCReturn(rc, rc);
+    }
+
+    return VINF_SUCCESS;
+}
+
+static int crVBoxCrCmdLoadClients(PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    uint32_t i;
+    uint32_t u32;
+    VBOXCMDVBVA_3DCTL_CONNECT Connect;
+    int rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+
+    for (i = 0; i < u32; i++)
+    {
+        uint32_t u32ClientID;
+        Connect.Hdr.u32Type = VBOXCMDVBVA3DCTL_TYPE_CONNECT;
+        Connect.Hdr.u32CmdClientId = 0;
+
+        rc = SSMR3GetU32(pSSM, &u32ClientID);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3GetU32(pSSM, &Connect.u32MajorVersion);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3GetU32(pSSM, &Connect.u32MinorVersion);
+        AssertRCReturn(rc, rc);
+        rc = SSMR3GetU64(pSSM, &Connect.u64Pid);
+        AssertRCReturn(rc, rc);
+
+        rc = crVBoxCrConnectEx(&Connect, u32ClientID);
+        AssertRCReturn(rc, rc);
+    }
+
+    return VINF_SUCCESS;
+}
+
 static DECLCALLBACK(int) crVBoxCrCmdSaveState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM)
 {
-    AssertFailed();
-    return VERR_NOT_IMPLEMENTED;
+    int rc = VINF_SUCCESS;
+
+    Assert(cr_server.fCrCmdEnabled);
+
+    /* Start*/
+    rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
+    AssertRCReturn(rc, rc);
+
+    if (!cr_server.numClients)
+    {
+        rc = SSMR3PutU32(pSSM, 0);
+        AssertRCReturn(rc, rc);
+
+        rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
+        AssertRCReturn(rc, rc);
+
+        return VINF_SUCCESS;
+    }
+
+    rc = SSMR3PutU32(pSSM, 1);
+    AssertRCReturn(rc, rc);
+
+    /* Version */
+    rc = SSMR3PutU32(pSSM, (uint32_t) SHCROGL_SSM_VERSION);
+    AssertRCReturn(rc, rc);
+
+    rc = crVBoxCrCmdSaveClients(pSSM);
+    AssertRCReturn(rc, rc);
+
+    /* The state itself */
+    rc = crVBoxServerSaveStatePerform(pSSM);
+    AssertRCReturn(rc, rc);
+
+    /* Save svc buffers info */
+    {
+        rc = SSMR3PutU32(pSSM, 0);
+        AssertRCReturn(rc, rc);
+
+        rc = SSMR3PutU32(pSSM, 0);
+        AssertRCReturn(rc, rc);
+    }
+
+    /* End */
+    rc = SSMR3PutStrZ(pSSM, gszVBoxOGLSSMMagic);
+    AssertRCReturn(rc, rc);
+
+    return VINF_SUCCESS;
 }
 
 static DECLCALLBACK(int) crVBoxCrCmdLoadState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM, uint32_t u32Version)
 {
-    AssertFailed();
-    return VERR_NOT_IMPLEMENTED;
+    int rc = VINF_SUCCESS;
+
+    char psz[2000];
+    uint32_t ui32;
+
+    Assert(cr_server.fCrCmdEnabled);
+
+    /* Start of data */
+    rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
+    AssertRCReturn(rc, rc);
+    if (strcmp(gszVBoxOGLSSMMagic, psz))
+    {
+        WARN(("unexpected data"));
+        return VERR_SSM_UNEXPECTED_DATA;
+    }
+
+    /* num clients */
+    rc = SSMR3GetU32(pSSM, &ui32);
+    AssertRCReturn(rc, rc);
+
+    if (!ui32)
+    {
+        /* no clients, dummy stub */
+        rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
+        AssertRCReturn(rc, rc);
+        if (strcmp(gszVBoxOGLSSMMagic, psz))
+        {
+            WARN(("unexpected data"));
+            return VERR_SSM_UNEXPECTED_DATA;
+        }
+
+        return VINF_SUCCESS;
+    }
+    if (ui32 != 1)
+    {
+        WARN(("invalid id"));
+        return VERR_SSM_UNEXPECTED_DATA;
+    }
+
+    /* Version */
+    rc = SSMR3GetU32(pSSM, &ui32);
+    AssertRCReturn(rc, rc);
+
+    if (ui32 < SHCROGL_SSM_VERSION_CRCMD)
+    {
+        WARN(("unexpected version"));
+        return VERR_SSM_UNEXPECTED_DATA;
+    }
+
+    rc = crVBoxCrCmdLoadClients(pSSM, u32Version);
+    AssertRCReturn(rc, rc);
+
+    /* The state itself */
+    rc = crVBoxServerLoadStatePerform(pSSM, ui32);
+    AssertRCReturn(rc, rc);
+
+    /* Save svc buffers info */
+    {
+        rc = SSMR3GetU32(pSSM, &ui32);
+        AssertRCReturn(rc, rc);
+
+        if (ui32)
+        {
+            WARN(("unexpected data1"));
+            return VERR_SSM_UNEXPECTED_DATA;
+        }
+
+        rc = SSMR3GetU32(pSSM, &ui32);
+        AssertRCReturn(rc, rc);
+
+        if (ui32)
+        {
+            WARN(("unexpected data1"));
+            return VERR_SSM_UNEXPECTED_DATA;
+        }
+    }
+
+    /* End */
+    rc = SSMR3GetStrZEx(pSSM, psz, 2000, NULL);
+    AssertRCReturn(rc, rc);
+    if (strcmp(gszVBoxOGLSSMMagic, psz))
+    {
+        WARN(("unexpected data"));
+        return VERR_SSM_UNEXPECTED_DATA;
+    }
+
+    return VINF_SUCCESS;
 }
 
 
-static DECLCALLBACK(int) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
+static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd)
 {
-    AssertFailed();
     switch (pCmd->u8OpCode)
     {
         case VBOXCMDVBVA_OPTYPE_CRCMD:
         {
-            VBOXCMDVBVA_CRCMD *pCrCmdDr;
-            VBOXCMDVBVA_CRCMD_CMD *pCrCmd;
+            const VBOXCMDVBVA_CRCMD *pCrCmdDr;
+            const VBOXCMDVBVA_CRCMD_CMD *pCrCmd;
             int rc;
-            pCrCmdDr = (VBOXCMDVBVA_CRCMD*)pCmd;
+            pCrCmdDr = (const VBOXCMDVBVA_CRCMD*)pCmd;
             pCrCmd = &pCrCmdDr->Cmd;
             if (cbCmd < sizeof (VBOXCMDVBVA_CRCMD))
             {
                 WARN(("invalid buffer size"));
-                pCmd->u.i8Result = -1;
-                break;
+                return -1;
             }
             rc = crVBoxServerCmdVbvaCrCmdProcess(pCrCmd, cbCmd - RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd));
             if (RT_SUCCESS(rc))
             {
-            /* success */
-                pCmd->u.i8Result = 0;
+                /* success */
+                return 0;
             }
-            else
+
+            WARN(("crVBoxServerCmdVbvaCrCmdProcess failed, rc %d", rc));
+            return -1;
+        }
+        case VBOXCMDVBVA_OPTYPE_FLIP:
+        {
+            const VBOXCMDVBVA_FLIP *pFlip;
+
+            if (cbCmd < sizeof (VBOXCMDVBVA_FLIP))
             {
-                WARN(("crVBoxServerCmdVbvaCrCmdProcess failed, rc %d", rc));
-                pCmd->u.i8Result = -1;
+                WARN(("invalid buffer size"));
+                return -1;
             }
-            break;
+
+            pFlip = (const VBOXCMDVBVA_FLIP*)pCmd;
+            return crVBoxServerCrCmdFlipProcess(pFlip);
         }
-        case VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID:
+        case VBOXCMDVBVA_OPTYPE_BLT:
         {
-            crVBoxServerCrCmdBltProcess(pCmd, cbCmd);
-            break;
+            if (cbCmd < sizeof (VBOXCMDVBVA_BLT_HDR))
+            {
+                WARN(("invalid buffer size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdBltProcess((const VBOXCMDVBVA_BLT_HDR*)pCmd, cbCmd);
+        }
+        case VBOXCMDVBVA_OPTYPE_CLRFILL:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_CLRFILL_HDR))
+            {
+                WARN(("invalid buffer size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdClrFillProcess((const VBOXCMDVBVA_CLRFILL_HDR*)pCmd, cbCmd);
         }
         default:
             WARN(("unsupported command"));
-            pCmd->u.i8Result = -1;
+            return -1;
     }
-    return VINF_SUCCESS;
+
+    WARN(("internal error"));
+    return -1;
 }
 
 /* We moved all CrHgsmi command processing to crserverlib to keep the logic of dealing with CrHgsmi commands in one place.
@@ -3488,9 +3972,9 @@ int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t c
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, true);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                return VINF_SUCCESS;
             }
             else
             {
@@ -3543,9 +4027,9 @@ int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t c
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, true);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                return VINF_SUCCESS;
             }
 
             crWarning("invalid number of args");
@@ -3664,9 +4148,9 @@ int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t c
                 pClient->conn->pBuffer = pBuffer;
                 pClient->conn->cbBuffer = cbBuffer;
                 CRVBOXHGSMI_CMDDATA_SETWB(&pClient->conn->CmdData, pCmd, pHdr, pWriteback, cbWriteback, &pFnCmd->cbWriteback, true);
-                rc = crVBoxServerInternalClientWriteRead(pClient);
+                crVBoxServerInternalClientWriteRead(pClient);
                 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
-                return rc;
+                return VINF_SUCCESS;
             }
 
             crWarning("invalid number of args");
@@ -3676,21 +4160,21 @@ int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t c
 
         case SHCRGL_GUEST_FN_SET_VERSION:
         {
-            crWarning("invalid function");
+            WARN(("crVBoxServerCrHgsmiCmd, SHCRGL_GUEST_FN_SET_VERSION: invalid function"));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
 
         case SHCRGL_GUEST_FN_SET_PID:
         {
-            crWarning("invalid function");
+            WARN(("crVBoxServerCrHgsmiCmd, SHCRGL_GUEST_FN_SET_PID: invalid function"));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
 
         default:
         {
-            crWarning("invalid function");
+            WARN(("crVBoxServerCrHgsmiCmd: invalid functionm %d", u32Function));
             rc = VERR_NOT_IMPLEMENTED;
             break;
         }
@@ -3706,6 +4190,17 @@ int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t c
 
 }
 
+
+static DECLCALLBACK(bool) crVBoxServerHasDataForScreen(uint32_t u32ScreenID)
+{
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabledForScreen(u32ScreenID);
+    if (hFb)
+        return CrFbHas3DData(hFb);
+
+    return false;
+}
+
+
 static DECLCALLBACK(bool) crVBoxServerHasData()
 {
     HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
@@ -3731,12 +4226,16 @@ int32_t crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl, uint32_t c
             PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pSetup = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)pCtl;
             g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase;
             g_cbVRam = pSetup->cbVRam;
+
+            g_pLed = pSetup->pLed;
+
             pSetup->CrCmdServerInfo.hSvr = NULL;
             pSetup->CrCmdServerInfo.pfnEnable = crVBoxCrCmdEnable;
             pSetup->CrCmdServerInfo.pfnDisable = crVBoxCrCmdDisable;
             pSetup->CrCmdServerInfo.pfnCmd = crVBoxCrCmdCmd;
             pSetup->CrCmdServerInfo.pfnHostCtl = crVBoxCrCmdHostCtl;
             pSetup->CrCmdServerInfo.pfnGuestCtl = crVBoxCrCmdGuestCtl;
+            pSetup->CrCmdServerInfo.pfnResize = crVBoxCrCmdResize;
             pSetup->CrCmdServerInfo.pfnSaveState = crVBoxCrCmdSaveState;
             pSetup->CrCmdServerInfo.pfnLoadState = crVBoxCrCmdLoadState;
             rc = VINF_SUCCESS;
@@ -3753,6 +4252,7 @@ int32_t crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl, uint32_t c
             g_pfnCrHgsmiCompletion = pSetup->pfnCompletion;
 
             pSetup->MainInterface.pfnHasData = crVBoxServerHasData;
+            pSetup->MainInterface.pfnHasDataForScreen = crVBoxServerHasDataForScreen;
 
             rc = VINF_SUCCESS;
             break;
@@ -3771,11 +4271,15 @@ int32_t crVBoxServerCrHgsmiCtl(struct VBOXVDMACMD_CHROMIUM_CTL *pCtl, uint32_t c
     return rc;
 }
 
-int32_t crVBoxServerHgcmEnable(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd)
+static int crVBoxServerCrCmdDisablePostProcess(VBOXCRCMDCTL_HGCMENABLE_DATA *pData)
 {
     int rc = VINF_SUCCESS;
     uint8_t* pCtl;
     uint32_t cbCtl;
+    HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd = pData->hRHCmd;
+    PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd = pData->pfnRHCmd;
+
+    Assert(!cr_server.fCrCmdEnabled);
 
     if (cr_server.numClients)
     {
@@ -3788,20 +4292,38 @@ int32_t crVBoxServerHgcmEnable(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNV
         rc = crVBoxCrCmdHostCtl(NULL, pCtl, cbCtl);
     }
 
-    crVBoxServerDefaultContextSet();
+    memset(&cr_server.DisableData, 0, sizeof (cr_server.DisableData));
 
     return VINF_SUCCESS;
 }
 
-int32_t crVBoxServerHgcmDisable()
+int32_t crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData)
 {
-    if (cr_server.numClients)
+    int rc = crVBoxServerCrCmdDisablePostProcess(pData);
+    if (RT_FAILURE(rc))
     {
-        WARN(("cr_server.numClients(%d) is not NULL", cr_server.numClients));
-        return VERR_INVALID_STATE;
+        WARN(("crVBoxServerCrCmdDisablePostProcess failed %d", rc));
+        return rc;
     }
 
-    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
+    crVBoxServerDefaultContextSet();
+
+    return VINF_SUCCESS;
+}
+
+int32_t crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData)
+{
+    Assert(!cr_server.fCrCmdEnabled);
+
+    Assert(!cr_server.numClients);
+
+    crVBoxServerRemoveAllClients();
+
+    CRASSERT(!cr_server.numClients);
+
+    crVBoxServerDefaultContextClear();
+
+    cr_server.DisableData = *pData;
 
     return VINF_SUCCESS;
 }
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c
index e938599..9ccadc5 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c
@@ -93,6 +93,54 @@ void SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParametervCR(GLenum target
     static int gather_connect_count = 0;
 
     switch (target) {
+        case GL_SHARE_LISTS_CR:
+        {
+            CRContextInfo *pCtx[2];
+            GLint *ai32Values;
+            int i;
+            if (count != 2)
+            {
+                WARN(("GL_SHARE_LISTS_CR invalid cound %d", count));
+                return;
+            }
+
+            if (type != GL_UNSIGNED_INT && type != GL_INT)
+            {
+                WARN(("GL_SHARE_LISTS_CR invalid type %d", type));
+                return;
+            }
+
+            ai32Values = (GLint*)values;
+
+            for (i = 0; i < 2; ++i)
+            {
+                const int32_t val = ai32Values[i];
+
+                if (val == 0)
+                {
+                    WARN(("GL_SHARE_LISTS_CR invalid value[%d] %d", i, val));
+                    return;
+                }
+
+                pCtx[i] = (CRContextInfo *) crHashtableSearch(cr_server.contextTable, val);
+                if (!pCtx[i])
+                {
+                    WARN(("GL_SHARE_LISTS_CR invalid pCtx1 for value[%d] %d", i, val));
+                    return;
+                }
+
+                if (!pCtx[i]->pContext)
+                {
+                    WARN(("GL_SHARE_LISTS_CR invalid pCtx1 pContext for value[%d] %d", i, val));
+                    return;
+                }
+            }
+
+            crStateShareLists(pCtx[0]->pContext, pCtx[1]->pContext);
+
+            break;
+        }
+
     case GL_SET_MAX_VIEWPORT_CR:
         {
             GLint *maxDims = (GLint *)values;
@@ -281,6 +329,9 @@ void SERVER_DISPATCH_APIENTRY crServerDispatchChromiumParameteriCR(GLenum target
     case GL_HH_SET_DEFAULT_SHARED_CTX:
         crWarning("Recieved GL_HH_SET_DEFAULT_SHARED_CTX from guest, ignoring");
         break;
+    case GL_HH_RENDERTHREAD_INFORM:
+        crWarning("Recieved GL_HH_RENDERTHREAD_INFORM from guest, ignoring");
+        break;
     default:
         /* Pass the parameter info to the head SPU */
         cr_server.head_spu->dispatch_table.ChromiumParameteriCR( target, value );
@@ -724,7 +775,10 @@ int crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTU
         GLuint hwid;
 
         if (!mural->fRedirected)
+        {
+            WARN(("mural not redirected!"));
             return VERR_NOT_IMPLEMENTED;
+        }
 
         enmBuf = fDraw ? ctx->buffer.drawBuffer : ctx->buffer.readBuffer;
         switch (enmBuf)
@@ -740,7 +794,7 @@ int crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTU
                 hwid = mural->aidColorTexs[CR_SERVER_FBO_FB_IDX(mural)];
                 break;
             default:
-                crWarning("unsupported enum buf");
+                WARN(("unsupported enum buf %d", enmBuf));
                 return VERR_NOT_IMPLEMENTED;
                 break;
         }
@@ -775,7 +829,7 @@ int crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTU
 
     if (pAp->level)
     {
-        crWarning("non-zero level not implemented");
+        WARN(("non-zero level not implemented"));
         return VERR_NOT_IMPLEMENTED;
     }
 
@@ -788,7 +842,7 @@ int crServerVBoxBlitterTexInit(CRContext *ctx, CRMuralInfo *mural, PVBOXVR_TEXTU
 
     if (tobj->target != GL_TEXTURE_2D && tobj->target != GL_TEXTURE_RECTANGLE_NV)
     {
-        crWarning("non-texture[rect|2d] not implemented");
+        WARN(("non-texture[rect|2d] not implemented"));
         return VERR_NOT_IMPLEMENTED;
     }
 
@@ -819,7 +873,7 @@ int crServerVBoxBlitterBlitCurrentCtx(GLint srcX0, GLint srcY0, GLint srcX1, GLi
 
     if (mask != GL_COLOR_BUFFER_BIT)
     {
-        crWarning("not supported blit mask %d", mask);
+        WARN(("not supported blit mask %d", mask));
         return VERR_NOT_IMPLEMENTED;
     }
 
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
index 10cdf5c..43c9d7e 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
@@ -112,7 +112,7 @@ void crServerRedirMuralFbClear(CRMuralInfo *mural)
     }
     mural->cUsedFBDatas = 0;
 
-    for (i = 0; i < cr_server.screenCount; ++i)
+    for (i = 0; i < (uint32_t)cr_server.screenCount; ++i)
     {
         GLuint j;
         CR_FBDATA *pData = &mural->aFBDatas[i];
@@ -359,7 +359,7 @@ static void crVBoxServerMuralFbSetCB(unsigned long key, void *data1, void *data2
                 Assert(idCurScreen != idScreen);
             }
 
-            for (int j = pMI->cUsedFBDatas; j > i; --j)
+            for (uint32_t j = pMI->cUsedFBDatas; j > i; --j)
             {
                 pMI->apUsedFBDatas[j] = pMI->apUsedFBDatas[j-1];
             }
@@ -373,7 +373,7 @@ static void crVBoxServerMuralFbSetCB(unsigned long key, void *data1, void *data2
     {
         if (fFbWasUsed)
         {
-            for (int j = i; j < pMI->cUsedFBDatas - 1; ++j)
+            for (uint32_t j = i; j < pMI->cUsedFBDatas - 1; ++j)
             {
                 pMI->apUsedFBDatas[j] = pMI->apUsedFBDatas[j+1];
             }
@@ -393,44 +393,27 @@ void crVBoxServerMuralFbResizeBegin(HCR_FRAMEBUFFER hFb)
     crHashtableWalk(cr_server.muralTable, crVBoxServerMuralFbCleanCB, hFb);
 }
 
-
-static int crVBoxServerResizeScreen(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM)
+DECLEXPORT(int) crVBoxServerNotifyResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM)
 {
-    int rc;
-    HCR_FRAMEBUFFER hFb = CrPMgrFbGet(pScreen->u32ViewIndex);
-    if (!hFb)
+    if (cr_server.fCrCmdEnabled)
     {
-        WARN(("CrPMgrFbGet failed"));
-        return VERR_INVALID_PARAMETER;
-    }
-
-    rc = CrFbUpdateBegin(hFb);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("CrFbUpdateBegin failed %d", rc));
-        return rc;
+        WARN(("crVBoxServerNotifyResize for enabled CrCmd"));
+        return VERR_INVALID_STATE;
     }
 
-    crVBoxServerMuralFbResizeBegin(hFb);
-
-    rc = CrFbResize(hFb, pScreen, pvVRAM);
-    if (!RT_SUCCESS(rc))
+    if (pScreen->u32ViewIndex >= (uint32_t)cr_server.screenCount)
     {
-        WARN(("CrFbResize failed %d", rc));
+        WARN(("invalid view index"));
+        return VERR_INVALID_PARAMETER;
     }
 
-    crVBoxServerMuralFbResizeEnd(hFb);
-
-    CrFbUpdateEnd(hFb);
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
 
-    CrPMgrNotifyResize(hFb);
+    memset(aTargetMap, 0, sizeof (aTargetMap));
 
-    return rc;
-}
+    ASMBitSet(aTargetMap, pScreen->u32ViewIndex);
 
-DECLEXPORT(int) crVBoxServerNotifyResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM)
-{
-    int rc = crVBoxServerResizeScreen(pScreen, pvVRAM);
+    int rc = CrPMgrResize(pScreen, pvVRAM, aTargetMap);
     if (!RT_SUCCESS(rc))
     {
         WARN(("err"));
@@ -667,7 +650,7 @@ DECLEXPORT(void) crServerVBoxScreenshotRelease(CR_SCREENSHOT *pScreenshot)
 
 DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, uint32_t width, uint32_t height, uint32_t pitch, void *pvBuffer, CR_SCREENSHOT *pScreenshot)
 {
-    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u32Screen);
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabledForScreen(u32Screen);
     if (!hFb)
         return VERR_INVALID_STATE;
 
@@ -686,7 +669,7 @@ DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, uint32_t width, ui
             || pScreen->u32LineSize != pitch
             || pScreen->u16BitsPerPixel != 32)
     {
-        RTRECT SrcRect;
+        RTRECTSIZE SrcRectSize;
         RTRECT DstRect;
 
         pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height;
@@ -711,15 +694,13 @@ DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, uint32_t width, ui
         pScreenshot->Img.height = height;
         pScreenshot->Img.bpp = 32;
         pScreenshot->Img.pitch = pitch;
-        SrcRect.xLeft = 0;
-        SrcRect.yTop = 0;
-        SrcRect.xRight = pScreen->u32Width;
-        SrcRect.yBottom = pScreen->u32Height;
+        SrcRectSize.cx = pScreen->u32Width;
+        SrcRectSize.cy = pScreen->u32Height;
         DstRect.xLeft = 0;
         DstRect.yTop = 0;
         DstRect.xRight = width;
         DstRect.yBottom = height;
-        int rc = CrFbBltGetContents(hFb, &SrcRect, &DstRect, 1, &DstRect, &pScreenshot->Img);
+        int rc = CrFbBltGetContentsEx(hFb, &SrcRectSize, &DstRect, 1, &DstRect, &pScreenshot->Img);
         if (!RT_SUCCESS(rc))
         {
             WARN(("CrFbBltGetContents failed %d", rc));
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
index e1dca82..13ee4ec 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
@@ -113,14 +113,20 @@ typedef struct CR_FBTEX
 #define PCR_FRAMEBUFFER_FROM_COMPOSITOR(_pCompositor) ((CR_FRAMEBUFFER*)((uint8_t*)(_pCompositor) - RT_OFFSETOF(CR_FRAMEBUFFER, Compositor)))
 #define PCR_FBENTRY_FROM_ENTRY(_pEntry) ((CR_FRAMEBUFFER_ENTRY*)((uint8_t*)(_pEntry) - RT_OFFSETOF(CR_FRAMEBUFFER_ENTRY, Entry)))
 
+typedef struct CR_FB_INFO
+{
+    CrFbDisplayComposite *pDpComposite;
+    uint32_t u32Id;
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
+} CR_FB_INFO;
 
 typedef struct CR_FBDISPLAY_INFO
 {
-    uint32_t u32Mode;
     CrFbDisplayWindow *pDpWin;
     CrFbDisplayWindowRootVr *pDpWinRootVr;
     CrFbDisplayVrdp *pDpVrdp;
-    CrFbDisplayComposite *pDpComposite;
+    uint32_t u32Id;
+    int32_t iFb;
 } CR_FBDISPLAY_INFO;
 
 typedef struct CR_PRESENTER_GLOBALS
@@ -131,10 +137,13 @@ typedef struct CR_PRESENTER_GLOBALS
     RTMEMCACHE CEntryLookasideList;
 #endif
     uint32_t u32DisplayMode;
+    uint32_t u32DisabledDisplayMode;
+    bool fEnabled;
     CRHashTable *pFbTexMap;
     CR_FBDISPLAY_INFO aDisplayInfos[CR_MAX_GUEST_MONITORS];
     CR_FBMAP FramebufferInitMap;
     CR_FRAMEBUFFER aFramebuffers[CR_MAX_GUEST_MONITORS];
+    CR_FB_INFO aFbInfos[CR_MAX_GUEST_MONITORS];
     bool fWindowsForceHidden;
     uint32_t cbTmpBuf;
     void *pvTmpBuf;
@@ -146,7 +155,7 @@ static CR_PRESENTER_GLOBALS g_CrPresenter;
 
 /* FRAMEBUFFER */
 
-void CrFbInit(CR_FRAMEBUFFER *pFb, uint32_t idScreen)
+void CrFbInit(CR_FRAMEBUFFER *pFb, uint32_t idFb)
 {
     RTRECT Rect;
     Rect.xLeft = 0;
@@ -155,7 +164,7 @@ void CrFbInit(CR_FRAMEBUFFER *pFb, uint32_t idScreen)
     Rect.yBottom = 1;
     memset(pFb, 0, sizeof (*pFb));
     pFb->ScreenInfo.u16Flags = VBVA_SCREEN_F_DISABLED;
-    pFb->ScreenInfo.u32ViewIndex = idScreen;
+    pFb->ScreenInfo.u32ViewIndex = idFb;
     CrVrScrCompositorInit(&pFb->Compositor, &Rect);
     RTListInit(&pFb->EntriesList);
     CrHTableCreate(&pFb->SlotTable, 0);
@@ -228,164 +237,47 @@ bool CrFbHas3DData(HCR_FRAMEBUFFER hFb)
     return !CrVrScrCompositorIsEmpty(&hFb->Compositor);
 }
 
-static void crFbBltMem(uint8_t *pu8Src, int32_t cbSrcPitch, uint8_t *pu8Dst, int32_t cbDstPitch, uint32_t width, uint32_t height)
-{
-    uint32_t cbCopyRow = width * 4;
-
-    for (uint32_t i = 0; i < height; ++i)
-    {
-        memcpy(pu8Dst, pu8Src, cbCopyRow);
-
-        pu8Src += cbSrcPitch;
-        pu8Dst += cbDstPitch;
-    }
-}
-
-static void crFbBltImg(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, const RTPOINT *pDstDataPoint, CR_BLITTER_IMG *pDst)
+static void crFbImgFromScreenVram(const VBVAINFOSCREEN *pScreen, void *pvVram, CR_BLITTER_IMG *pImg)
 {
-    int32_t srcX = pCopyRect->xLeft - pSrcDataPoint->x;
-    int32_t srcY = pCopyRect->yTop - pSrcDataPoint->y;
-    Assert(srcX >= 0);
-    Assert(srcY >= 0);
-    Assert(srcX < (int32_t)pSrc->width);
-    Assert(srcY < (int32_t)pSrc->height);
-
-    int32_t dstX = pCopyRect->xLeft - pDstDataPoint->x;
-    int32_t dstY = pCopyRect->yTop - pDstDataPoint->y;
-    Assert(dstX >= 0);
-    Assert(dstY >= 0);
-
-    uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4;
-    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4;
-
-    crFbBltMem(pu8Src, fSrcInvert ? -((int32_t)pSrc->pitch) : (int32_t)pSrc->pitch, pu8Dst, pDst->pitch, pCopyRect->xRight - pCopyRect->xLeft, pCopyRect->yBottom - pCopyRect->yTop);
+    pImg->pvData = pvVram;
+    pImg->cbData = pScreen->u32LineSize * pScreen->u32Height;
+    pImg->enmFormat = GL_BGRA;
+    pImg->width = pScreen->u32Width;
+    pImg->height = pScreen->u32Height;
+    pImg->bpp = pScreen->u16BitsPerPixel;
+    pImg->pitch = pScreen->u32LineSize;
 }
 
-static void crFbBltImgScaled(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, const RTPOINT *pDstDataPoint, float strX, float strY, CR_BLITTER_IMG *pDst)
+static void crFbImgFromDimPtrBGRA(void *pvVram, uint32_t width, uint32_t height, CR_BLITTER_IMG *pImg)
 {
-    int32_t srcX = pCopyRect->xLeft - pSrcDataPoint->x;
-    int32_t srcY = pCopyRect->yTop - pSrcDataPoint->y;
-    Assert(srcX >= 0);
-    Assert(srcY >= 0);
-    Assert(srcX < (int32_t)pSrc->width);
-    Assert(srcY < (int32_t)pSrc->height);
-
-    RTPOINT ScaledDtsDataPoint;
-    RTRECT ScaledCopyRect;
-
-    VBoxRectScaled(pCopyRect, strX, strY, &ScaledCopyRect);
-    ScaledDtsDataPoint.x = CR_FLOAT_RCAST(int32_t, strX * pDstDataPoint->x);
-    ScaledDtsDataPoint.y = CR_FLOAT_RCAST(int32_t, strY * pDstDataPoint->y);
-
-    int32_t dstX = ScaledCopyRect.xLeft - ScaledDtsDataPoint.x;
-    int32_t dstY = ScaledCopyRect.yTop - ScaledDtsDataPoint.y;
-    Assert(dstX >= 0);
-    Assert(dstY >= 0);
-
-    int32_t ScaledDstWidth = ScaledCopyRect.xRight - ScaledCopyRect.xLeft;
-    int32_t delta = (int32_t)pDst->width - dstX - ScaledDstWidth;
-    if (delta < 0)
-        ScaledDstWidth += delta;
-
-    if (ScaledDstWidth <= 0)
-    {
-        LOG(("ScaledDstWidth <= 0"));
-        if (ScaledDstWidth < 0)
-            WARN(("dst width (%d) < 0", ScaledDstWidth));
-        return;
-    }
-
-    int32_t ScaledDstHeight = ScaledCopyRect.yBottom - ScaledCopyRect.yTop;
-    delta = (int32_t)pDst->height - dstY - ScaledDstHeight;
-    if (delta < 0)
-        ScaledDstHeight += delta;
-
-    if (ScaledDstHeight <= 0)
-    {
-        LOG(("ScaledDstHeight <= 0"));
-        if (ScaledDstHeight < 0)
-            WARN(("dst height (%d) < 0", ScaledDstHeight));
-        return;
-    }
-
-    uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4;
-    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4;
-
-    CrBmpScale32(pu8Dst, pDst->pitch,
-                        ScaledDstWidth,
-                        ScaledDstHeight,
-                        pu8Src,
-                        fSrcInvert ? -((int32_t)pSrc->pitch) : (int32_t)pSrc->pitch,
-                        pCopyRect->xRight - pCopyRect->xLeft, pCopyRect->yBottom - pCopyRect->yTop);
+    pImg->pvData = pvVram;
+    pImg->cbData = width * height * 4;
+    pImg->enmFormat = GL_BGRA;
+    pImg->width = width;
+    pImg->height = height;
+    pImg->bpp = 32;
+    pImg->pitch = width * 4;
 }
 
-static void crFbBltImgScaledRects(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, const RTPOINT *pDstDataPoint, float strX, float strY, CR_BLITTER_IMG *pDst)
+static int8_t crFbImgFromDimOffVramBGRA(VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, CR_BLITTER_IMG *pImg)
 {
-    int32_t srcX = pCopyRect->xLeft - pSrcDataPoint->x;
-    int32_t srcY = pCopyRect->yTop - pSrcDataPoint->y;
-    Assert(srcX >= 0);
-    Assert(srcY >= 0);
-
-    RTRECT UnscaledCopyRect;
-    VBoxRectUnscaled(pCopyRect, strX, strY, &UnscaledCopyRect);
-
-    srcX = CR_FLOAT_RCAST(int32_t, srcX / strX);
-    srcY = CR_FLOAT_RCAST(int32_t, srcY / strY);
-
-    int32_t UnscaledSrcWidth = UnscaledCopyRect.xRight - UnscaledCopyRect.xLeft;
-    int32_t delta = (int32_t)pSrc->width - srcX - UnscaledSrcWidth;
-    if (delta < 0)
-        UnscaledSrcWidth += delta;
-
-    if (UnscaledSrcWidth <= 0)
-    {
-        LOG(("UnscaledSrcWidth <= 0"));
-        if (UnscaledSrcWidth < 0)
-            WARN(("src width (%d) < 0", UnscaledSrcWidth));
-        return;
-    }
-
-    int32_t UnscaledSrcHeight = UnscaledCopyRect.yBottom - UnscaledCopyRect.yTop;
-    delta = (int32_t)pSrc->height - srcY - UnscaledSrcHeight;
-    if (delta < 0)
-        UnscaledSrcHeight += delta;
-
-    if (UnscaledSrcHeight <= 0)
+    uint32_t cbBuff = width * height * 4;
+    if (offVRAM >= g_cbVRam
+            || offVRAM + cbBuff >= g_cbVRam)
     {
-        LOG(("UnscaledSrcHeight <= 0"));
-        if (UnscaledSrcHeight < 0)
-            WARN(("src height (%d) < 0", UnscaledSrcHeight));
-        return;
+        WARN(("invalid param"));
+        return -1;
     }
 
-    int32_t dstX = pCopyRect->xLeft - pDstDataPoint->x;
-    int32_t dstY = pCopyRect->yTop - pDstDataPoint->y;
-    Assert(dstX >= 0);
-    Assert(dstY >= 0);
+    uint8_t *pu8Buf = g_pvVRamBase + offVRAM;
+    crFbImgFromDimPtrBGRA(pu8Buf, width, height, pImg);
 
-
-    uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4;
-    uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4;
-
-    CrBmpScale32(pu8Dst, pDst->pitch,
-                        pCopyRect->xRight - pCopyRect->xLeft,
-                        pCopyRect->yBottom - pCopyRect->yTop,
-                        pu8Src,
-                        fSrcInvert ? -pSrc->pitch : pSrc->pitch,
-                        UnscaledSrcWidth,
-                        UnscaledSrcHeight
-                        );
+    return 0;
 }
 
-static void crFbImgFromScreenVram(const VBVAINFOSCREEN *pScreen, void *pvVram, CR_BLITTER_IMG *pImg)
+static int8_t crFbImgFromDescBGRA(const VBOXCMDVBVA_ALLOCDESC *pDesc, CR_BLITTER_IMG *pImg)
 {
-    pImg->pvData = pvVram;
-    pImg->cbData = pScreen->u32LineSize * pScreen->u32Height;
-    pImg->enmFormat = GL_BGRA;
-    pImg->width = pScreen->u32Width;
-    pImg->height = pScreen->u32Height;
-    pImg->bpp = pScreen->u16BitsPerPixel;
-    pImg->pitch = pScreen->u32LineSize;
+    return crFbImgFromDimOffVramBGRA(pDesc->Info.u.offVRAM, pDesc->u16Width, pDesc->u16Height, pImg);
 }
 
 static void crFbImgFromFb(HCR_FRAMEBUFFER hFb, CR_BLITTER_IMG *pImg)
@@ -395,7 +287,24 @@ static void crFbImgFromFb(HCR_FRAMEBUFFER hFb, CR_BLITTER_IMG *pImg)
     crFbImgFromScreenVram(pScreen, pvVram, pImg);
 }
 
-static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+static int crFbTexDataGetContents(CR_TEXDATA *pTex, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst)
+{
+    const CR_BLITTER_IMG *pSrcImg;
+    int rc = CrTdBltDataAcquire(pTex, GL_BGRA, false, &pSrcImg);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrTdBltDataAcquire failed rc %d", rc));
+        return rc;
+    }
+
+    CrMBltImg(pSrcImg, pPos, cRects, pRects, pDst);
+
+    CrTdBltDataRelease(pTex);
+
+    return VINF_SUCCESS;
+}
+
+static int crFbBltGetContentsScaledDirect(HCR_FRAMEBUFFER hFb, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst)
 {
     VBOXVR_LIST List;
     uint32_t c2DRects = 0;
@@ -403,10 +312,11 @@ static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect,
     PCR_BLITTER pEnteredBlitter = NULL;
     uint32_t width = 0, height = 0;
     RTPOINT ScaledEntryPoint = {0};
+    RTRECT ScaledSrcRect = {0};
 
     VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR Iter;
-    int32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft;
-    int32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop;
+    int32_t srcWidth = pSrcRectSize->cx;
+    int32_t srcHeight = pSrcRectSize->cy;
     int32_t dstWidth = pDstRect->xRight - pDstRect->xLeft;
     int32_t dstHeight = pDstRect->yBottom - pDstRect->yTop;
 
@@ -414,8 +324,7 @@ static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect,
     float strX = ((float)dstWidth) / srcWidth;
     float strY = ((float)dstHeight) / srcHeight;
     bool fScale = (dstWidth != srcWidth || dstHeight != srcHeight);
-
-    const RTPOINT ZeroPoint = {0, 0};
+    Assert(fScale);
 
     VBoxVrListInit(&List);
     int rc = VBoxVrListRectsAdd(&List, 1, CrVrScrCompositorRectGet(&hFb->Compositor), NULL);
@@ -522,8 +431,16 @@ static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect,
                     height = CR_FLOAT_RCAST(uint32_t, strY * pVrTex->height);
                     ScaledEntryPoint.x = CR_FLOAT_RCAST(int32_t, strX * CrVrScrCompositorEntryRectGet(pEntry)->xLeft) + pDstRect->xLeft;
                     ScaledEntryPoint.y = CR_FLOAT_RCAST(int32_t, strY * CrVrScrCompositorEntryRectGet(pEntry)->yTop) + pDstRect->yTop;
+                    ScaledSrcRect.xLeft = ScaledEntryPoint.x;
+                    ScaledSrcRect.yTop = ScaledEntryPoint.y;
+                    ScaledSrcRect.xRight = width + ScaledEntryPoint.x;
+                    ScaledSrcRect.yBottom = height + ScaledEntryPoint.y;
                 }
 
+                VBoxRectIntersect(&Intersection, &ScaledSrcRect);
+                if (VBoxRectIsZero(&Intersection))
+                    continue;
+
                 rc = CrTdBltDataAcquireScaled(pTex, GL_BGRA, false, width, height, &pSrcImg);
                 if (!RT_SUCCESS(rc))
                 {
@@ -533,7 +450,7 @@ static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect,
 
                 bool fInvert = !(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS);
 
-                crFbBltImg(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, &ZeroPoint, pImg);
+                CrMBltImgRect(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, pDst);
 
                 CrTdBltDataReleaseScaled(pTex, pSrcImg);
             }
@@ -574,30 +491,12 @@ static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect,
 
         crFbImgFromFb(hFb, &FbImg);
 
-        for (uint32_t j = 0; j < c2DRects; ++j)
+        for (uint32_t i = 0; i < c2DRects; ++i)
         {
-            const RTRECT * p2DRect = &p2DRects[j];
-            RTRECT ScaledReg;
-            /* scale */
-            VBoxRectScaled(p2DRect, strX, strY, &ScaledReg);
-            /* translate */
-            VBoxRectTranslate(&ScaledReg, pDstRect->xLeft, pDstRect->yTop);
-
-            for (uint32_t i = 0; i < cRects; ++i)
-            {
-                const RTRECT * pRect = &pRects[i];
-                RTRECT Intersection;
-
-                VBoxRectIntersected(pRect, &ScaledReg, &Intersection);
-                if (VBoxRectIsZero(&Intersection))
-                    continue;
-
-                if (!fScale)
-                    crFbBltImg(&FbImg, &DstPoint, false, &Intersection, &ZeroPoint, pImg);
-                else
-                    crFbBltImgScaledRects(&FbImg, &DstPoint, false, &Intersection, &ZeroPoint, strX, strY, pImg);
-            }
+            VBoxRectScale(&p2DRects[i], strX, strY);
         }
+
+        CrMBltImgScaled(&FbImg, pSrcRectSize, pDstRect, c2DRects, p2DRects, pDst);
     }
 
 end:
@@ -613,10 +512,13 @@ end:
     return rc;
 }
 
-static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+static int crFbBltGetContentsScaledCPU(HCR_FRAMEBUFFER hFb, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
 {
-    int32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft;
-    int32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop;
+    WARN(("not implemented!"));
+    return VERR_NOT_IMPLEMENTED;
+#if 0
+    int32_t srcWidth = pSrcRectSize->cx;
+    int32_t srcHeight = pSrcRectSize->cy;
     int32_t dstWidth = pDstRect->xRight - pDstRect->xLeft;
     int32_t dstHeight = pDstRect->yBottom - pDstRect->yTop;
 
@@ -624,10 +526,9 @@ static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRec
     float strX = ((float)dstWidth) / srcWidth;
     float strY = ((float)dstHeight) / srcHeight;
 
-    RTRECT DstRect;
-    VBoxRectUnscaled(pDstRect, strX, strY, &DstRect);
-    DstRect.xRight = DstRect.xLeft + srcWidth;
-    DstRect.yBottom = DstRect.yTop + srcHeight;
+    RTPOINT UnscaledPos;
+    UnscaledPos.x = CR_FLOAT_RCAST(int32_t, pDstRect->xLeft / strX);
+    UnscaledPos.y = CR_FLOAT_RCAST(int32_t, pDstRect->yTop / strY);
 
     /* destination is bigger than the source, do 3D data stretching with CPU */
     CR_BLITTER_IMG Img;
@@ -644,7 +545,7 @@ static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRec
     Img.bpp = pImg->bpp;
     Img.pitch = Img.width * 4;
 
-    int rc = CrFbBltGetContents(hFb, pSrcRect, &DstRect, cRects, pRects, &Img);
+    int rc = CrFbBltGetContents(hFb, &UnscaledPos, cRects, pRects, &Img);
     if (RT_SUCCESS(rc))
     {
         CrBmpScale32((uint8_t *)pImg->pvData,
@@ -660,123 +561,134 @@ static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRec
     RTMemFree(Img.pvData);
 
     return rc;
-
+#endif
 }
 
-int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pDst)
 {
-    uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft;
-    uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop;
-    uint32_t dstWidth = pDstRect->xRight - pDstRect->xLeft;
-    uint32_t dstHeight = pDstRect->yBottom - pDstRect->yTop;
-    if ((srcWidth == dstWidth
-            && srcHeight == dstHeight)
-            || !CrFbHas3DData(hFb)
-            || (srcWidth * srcHeight > dstWidth * dstHeight))
+    VBOXVR_LIST List;
+    uint32_t c2DRects = 0;
+    CR_TEXDATA *pEnteredTex = NULL;
+    PCR_BLITTER pEnteredBlitter = NULL;
+    RTPOINT EntryPoint = {0};
+
+    VBoxVrListInit(&List);
+    int rc = VBoxVrListRectsAdd(&List, 1, CrVrScrCompositorRectGet(&hFb->Compositor), NULL);
+    if (!RT_SUCCESS(rc))
     {
-        return crFbBltGetContentsDirect(hFb, pSrcRect, pDstRect, cRects, pRects, pImg);
+        WARN(("VBoxVrListRectsAdd failed rc %d", rc));
+        goto end;
     }
 
-    return crFbBltGetContentsScaleCPU(hFb, pSrcRect, pDstRect, cRects, pRects, pImg);
-}
+    VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR Iter;
+    CrVrScrCompositorConstIterInit(&hFb->Compositor, &Iter);
 
-#if 0
-static int crFbBltPutContentsVram(HCR_FRAMEBUFFER hFb, const RTPOINT *pDstPoint, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg, float strX, float strY)
-{
-    const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor);
-    const RTPOINT ZeroPoint = {0};
+    for(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry = CrVrScrCompositorConstIterNext(&Iter);
+            pEntry;
+            pEntry = CrVrScrCompositorConstIterNext(&Iter))
+    {
+        uint32_t cRegions;
+        const RTRECT *pRegions;
+        rc = CrVrScrCompositorEntryRegionsGet(&hFb->Compositor, pEntry, &cRegions, NULL, NULL, &pRegions);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("CrVrScrCompositorEntryRegionsGet failed rc %d", rc));
+            goto end;
+        }
+
+        rc = VBoxVrListRectsSubst(&List, cRegions, pRegions, NULL);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("VBoxVrListRectsSubst failed rc %d", rc));
+            goto end;
+        }
 
-    uint32_t fbWidth = (pCompRect->xRight - pCompRect->xLeft);
-    uint32_t fbHeight = pCompRect->yBottom - pCompRect->yTop;
+        for (uint32_t j = 0; j < cRegions; ++j)
+        {
+            /* rects are in dst coordinates,
+             * while the pReg is in source coords
+             * convert */
+            const RTRECT * pReg = &pRegions[j];
+            RTRECT SrcReg;
+            /* translate */
+            VBoxRectTranslated(pReg, pPos->x, pPos->y, &SrcReg);
 
-    uint32_t stretchedWidth = CR_FLOAT_RCAST(uint32_t, strX * fbWidth);
-    uint32_t stretchedHeight = CR_FLOAT_RCAST(uint32_t, strY * fbHeight);
+            for (uint32_t i = 0; i < cRects; ++i)
+            {
+                const RTRECT * pRect = &pRects[i];
 
-    CR_BLITTER_IMG FbImg;
+                RTRECT Intersection;
+                VBoxRectIntersected(pRect, &SrcReg, &Intersection);
+                if (VBoxRectIsZero(&Intersection))
+                    continue;
 
-    bool fScale = fbWidth != stretchedWidth || fbHeight != stretchedHeight;
+                CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(pEntry);
+                const CR_BLITTER_IMG *pSrcImg;
 
-    crFbImgFromFb(hFb, &FbImg);
+                if (pEnteredTex != pTex)
+                {
+                    if (!pEnteredBlitter)
+                    {
+                        pEnteredBlitter = CrTdBlitterGet(pTex);
+                        rc = CrBltEnter(pEnteredBlitter);
+                        if (!RT_SUCCESS(rc))
+                        {
+                            WARN(("CrBltEnter failed %d", rc));
+                            pEnteredBlitter = NULL;
+                            goto end;
+                        }
+                    }
 
-    RTRECT Intersection;
+                    if (pEnteredTex)
+                    {
+                        CrTdBltLeave(pEnteredTex);
 
-    for (uint32_t i = 0; i < cRects; ++i)
-    {
-        const RTRECT * pRect = &pRects[i];
-        VBoxRectIntersected(pRect, pCompRect, &Intersection);
+                        pEnteredTex = NULL;
 
-        if (VBoxRectIsZero(&Intersection))
-            continue;
+                        if (pEnteredBlitter != CrTdBlitterGet(pTex))
+                        {
+                            WARN(("blitters not equal!"));
+                            CrBltLeave(pEnteredBlitter);
 
-        if (!fScale)
-            crFbBltImg(pImg, pDstPoint, false, &Intersection, &ZeroPoint, &FbImg);
-        else
-            crFbBltImgScaled(pImg, pDstPoint, false, &Intersection, &ZeroPoint, strX, strY, &FbImg);
-    }
+                            pEnteredBlitter = CrTdBlitterGet(pTex);
+                            rc = CrBltEnter(pEnteredBlitter);
+                             if (!RT_SUCCESS(rc))
+                             {
+                                 WARN(("CrBltEnter failed %d", rc));
+                                 pEnteredBlitter = NULL;
+                                 goto end;
+                             }
+                        }
+                    }
 
-    return VINF_SUCCESS;
-}
+                    rc = CrTdBltEnter(pTex);
+                    if (!RT_SUCCESS(rc))
+                    {
+                        WARN(("CrTdBltEnter failed %d", rc));
+                        goto end;
+                    }
 
-int CrFbBltPutContents(HCR_FRAMEBUFFER hFb, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
-{
-    RTPOINT DstPoint = {pDstRect->xLeft, pDstRect->yTop};
-    float strX = ((float)pImg->width) / (pDstRect->xRight - pDstRect->xLeft);
-    float strY = ((float)pImg->height) / (pDstRect->yBottom - pDstRect->yTop);
+                    pEnteredTex = pTex;
+                    EntryPoint.x = CrVrScrCompositorEntryRectGet(pEntry)->xLeft + pPos->x;
+                    EntryPoint.y = CrVrScrCompositorEntryRectGet(pEntry)->yTop + pPos->y;
+                }
 
-    int rc = CrFbEntryRegionsAdd(hFb, NULL, const RTPOINT *pPos, cRects, pRects, true)
-    if (!hFb->cUpdating)
-    {
-        WARN(("not updating\n"));
-        return VERR_INVALID_STATE;
-    }
-}
+                rc = CrTdBltDataAcquire(pTex, GL_BGRA, false, &pSrcImg);
+                if (!RT_SUCCESS(rc))
+                {
+                    WARN(("CrTdBltDataAcquire failed rc %d", rc));
+                    goto end;
+                }
 
-int CrFbBltPutContentsNe(HCR_FRAMEBUFFER hFb, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
-{
-    uint32_t cCompRects;
-    const RTRECT *pCompRects;
-    int rc = CrVrScrCompositorRegionsGet(&hFb->Compositor, &cCompRects, NULL, NULL, &pCompRects);
-    if (!RT_SUCCESS(rc))
-    {
-        WARN(("CrVrScrCompositorRegionsGet failed rc %d", rc));
-        return rc;
-    }
+                bool fInvert = !(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS);
 
-    bool fRegChanged = false;
-    for (uint32_t i = 0; i < cCompRects; ++i)
-    {
-        const RTRECT *pCompRect = pCompRects[i];
-        for (uint32_t j = 0; j < cRects; ++j)
-        {
-            const RTRECT *pRect = pRects[j];
-            if (VBoxRectIsIntersect(pCompRect, pRect))
-            {
-                fRegChanged = true;
-                break;
-            }
-        }
-    }
+                CrMBltImgRect(pSrcImg, &EntryPoint, fInvert, &Intersection, pDst);
 
-    if (fRegChanged)
-    {
-        rc = CrFbUpdateBegin(hFb);
-        if (RT_SUCCESS(rc))
-        {
-            rc = CrFbBltPutContents(hFb, pDstRect, cRects, pRects, pImg);
-            if (!RT_SUCCESS(rc))
-                WARN(("CrFbBltPutContents failed rc %d", rc));
-            CrFbUpdateEnd(hFb);
+                CrTdBltDataRelease(pTex);
+            }
         }
-        else
-            WARN(("CrFbUpdateBegin failed rc %d", rc));
-
-        return rc;
     }
 
-    return crFbBltPutContentsVram(HCR_FRAMEBUFFER hFb, const RTPOINT *pDstPoint, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg, float strX, float strY);
-
-    const RTPOINT ZeroPoint = {0, 0};
-
     c2DRects = VBoxVrListRectsCount(&List);
     if (c2DRects)
     {
@@ -805,30 +717,13 @@ int CrFbBltPutContentsNe(HCR_FRAMEBUFFER hFb, const RTRECT *pDstRect, uint32_t c
             goto end;
         }
 
-        RTPOINT Pos = {0};
         const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor);
 
         CR_BLITTER_IMG FbImg;
 
         crFbImgFromFb(hFb, &FbImg);
 
-        for (uint32_t i = 0; i < cRects; ++i)
-        {
-            const RTRECT * pRect = &pRects[i];
-            for (uint32_t j = 0; j < c2DRects; ++j)
-            {
-                const RTRECT * p2DRect = &p2DRects[j];
-                RTRECT Intersection;
-                VBoxRectIntersected(pRect, p2DRect, &Intersection);
-                if (VBoxRectIsZero(&Intersection))
-                    continue;
-
-                if (!fScale)
-                    crFbBltImg(&FbImg, &ZeroPoint, false, &Intersection, &SrcPoint, pImg);
-                else
-                    crFbBltImgScaled(&FbImg, &ZeroPoint, false, &Intersection, &SrcPoint, strX, strY, pImg);
-            }
-        }
+        CrMBltImg(&FbImg, pPos, c2DRects, p2DRects, pDst);
     }
 
 end:
@@ -843,12 +738,187 @@ end:
 
     return rc;
 }
-#endif
 
-int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM)
+int CrFbBltGetContentsEx(HCR_FRAMEBUFFER hFb, const RTRECTSIZE *pSrcRectSize, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
 {
-    if (!pFb->cUpdating)
-    {
+    uint32_t srcWidth = pSrcRectSize->cx;
+    uint32_t srcHeight = pSrcRectSize->cy;
+    uint32_t dstWidth = pDstRect->xRight - pDstRect->xLeft;
+    uint32_t dstHeight = pDstRect->yBottom - pDstRect->yTop;
+    if (srcWidth == dstWidth
+            && srcHeight == dstHeight)
+    {
+        RTPOINT Pos = {pDstRect->xLeft, pDstRect->yTop};
+        return CrFbBltGetContents(hFb, &Pos, cRects, pRects, pImg);
+    }
+    if (!CrFbHas3DData(hFb)
+            || (srcWidth * srcHeight > dstWidth * dstHeight))
+        return crFbBltGetContentsScaledDirect(hFb, pSrcRectSize, pDstRect, cRects, pRects, pImg);
+
+    return crFbBltGetContentsScaledCPU(hFb, pSrcRectSize, pDstRect, cRects, pRects, pImg);
+}
+
+static void crFbBltPutContentsFbVram(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pSrc)
+{
+    const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor);
+
+    CR_BLITTER_IMG FbImg;
+
+    crFbImgFromFb(hFb, &FbImg);
+
+    CrMBltImg(pSrc, pPos, cRects, pRects, &FbImg);
+}
+
+static void crFbClrFillFbVram(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects, uint32_t u32Color)
+{
+    CR_BLITTER_IMG FbImg;
+
+    crFbImgFromFb(hFb, &FbImg);
+
+    CrMClrFillImg(&FbImg, cRects, pRects, u32Color);
+}
+
+int CrFbClrFill(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects, uint32_t u32Color)
+{
+    if (!hFb->cUpdating)
+    {
+        WARN(("framebuffer not updating"));
+        return VERR_INVALID_STATE;
+    }
+
+    crFbClrFillFbVram(hFb, cRects, pRects, u32Color);
+
+    RTPOINT DstPoint = {0, 0};
+
+    int rc = CrFbEntryRegionsAdd(hFb, NULL, &DstPoint, cRects, pRects, false);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrFbEntryRegionsAdd failed %d", rc));
+        return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+static int crFbBltPutContents(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+{
+    crFbBltPutContentsFbVram(hFb, pPos, cRects, pRects, pImg);
+
+    int rc = CrFbEntryRegionsAdd(hFb, NULL, pPos, cRects, pRects, false);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrFbEntryRegionsAdd failed %d", rc));
+        return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+int CrFbBltPutContents(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+{
+    if (!hFb->cUpdating)
+    {
+        WARN(("framebuffer not updating"));
+        return VERR_INVALID_STATE;
+    }
+
+    return crFbBltPutContents(hFb, pPos, cRects, pRects, pImg);
+}
+
+static int crFbRegionsIsIntersectRects(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects, bool *pfRegChanged)
+{
+    uint32_t cCompRects;
+    const RTRECT *pCompRects;
+    int rc = CrVrScrCompositorRegionsGet(&hFb->Compositor, &cCompRects, NULL, NULL, &pCompRects);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrVrScrCompositorRegionsGet failed rc %d", rc));
+        return rc;
+    }
+
+    bool fRegChanged = false;
+    for (uint32_t i = 0; i < cCompRects; ++i)
+    {
+        const RTRECT *pCompRect = &pCompRects[i];
+        for (uint32_t j = 0; j < cRects; ++j)
+        {
+            const RTRECT *pRect = &pRects[j];
+            if (VBoxRectIsIntersect(pCompRect, pRect))
+            {
+                *pfRegChanged = true;
+                return VINF_SUCCESS;
+            }
+        }
+    }
+
+    *pfRegChanged = false;
+    return VINF_SUCCESS;
+}
+
+int CrFbBltPutContentsNe(HCR_FRAMEBUFFER hFb, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
+{
+    bool fRegChanged = false;
+    int rc = crFbRegionsIsIntersectRects(hFb, cRects, pRects, &fRegChanged);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("crFbRegionsIsIntersectRects failed rc %d", rc));
+        return rc;
+    }
+
+    if (fRegChanged)
+    {
+        rc = CrFbUpdateBegin(hFb);
+        if (RT_SUCCESS(rc))
+        {
+            rc = CrFbBltPutContents(hFb, pPos, cRects, pRects, pImg);
+            if (!RT_SUCCESS(rc))
+                WARN(("CrFbBltPutContents failed rc %d", rc));
+            CrFbUpdateEnd(hFb);
+        }
+        else
+            WARN(("CrFbUpdateBegin failed rc %d", rc));
+
+        return rc;
+    }
+
+    crFbBltPutContentsFbVram(hFb, pPos, cRects, pRects, pImg);
+    return VINF_SUCCESS;
+}
+
+int CrFbClrFillNe(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects, uint32_t u32Color)
+{
+    bool fRegChanged = false;
+    int rc = crFbRegionsIsIntersectRects(hFb, cRects, pRects, &fRegChanged);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("crFbRegionsIsIntersectRects failed rc %d", rc));
+        return rc;
+    }
+
+    if (fRegChanged)
+    {
+        rc = CrFbUpdateBegin(hFb);
+        if (RT_SUCCESS(rc))
+        {
+            rc = CrFbClrFill(hFb, cRects, pRects, u32Color);
+            if (!RT_SUCCESS(rc))
+                WARN(("CrFbClrFill failed rc %d", rc));
+            CrFbUpdateEnd(hFb);
+        }
+        else
+            WARN(("CrFbUpdateBegin failed rc %d", rc));
+
+        return rc;
+    }
+
+    crFbClrFillFbVram(hFb, cRects, pRects, u32Color);
+    return VINF_SUCCESS;
+}
+
+int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM)
+{
+    if (!pFb->cUpdating)
+    {
         WARN(("no update in progress"));
         return VERR_INVALID_STATE;
     }
@@ -871,7 +941,7 @@ int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void
     }
 
     pFb->ScreenInfo = *pScreen;
-    pFb->pvVram = pvVRAM;
+    pFb->pvVram = pvVRAM ? pvVRAM : g_pvVRamBase + pScreen->u32StartOffset;
 
     if (pFb->pDisplay)
         pFb->pDisplay->FramebufferChanged(pFb);
@@ -886,7 +956,7 @@ void CrFbTerm(CR_FRAMEBUFFER *pFb)
         WARN(("update in progress"));
         return;
     }
-    uint32_t idScreen = pFb->ScreenInfo.u32ViewIndex;
+    uint32_t idFb = pFb->ScreenInfo.u32ViewIndex;
 
     CrVrScrCompositorClear(&pFb->Compositor);
     CrHTableDestroy(&pFb->SlotTable);
@@ -897,7 +967,7 @@ void CrFbTerm(CR_FRAMEBUFFER *pFb)
     memset(pFb, 0, sizeof (*pFb));
 
     pFb->ScreenInfo.u16Flags = VBVA_SCREEN_F_DISABLED;
-    pFb->ScreenInfo.u32ViewIndex = idScreen;
+    pFb->ScreenInfo.u32ViewIndex = idFb;
 }
 
 ICrFbDisplay* CrFbDisplayGet(CR_FRAMEBUFFER *pFb)
@@ -928,6 +998,7 @@ int CrFbDisplaySet(CR_FRAMEBUFFER *pFb, ICrFbDisplay *pDisplay)
 #define CR_PMGR_MODE_ALL    0x7
 
 static int crPMgrModeModifyGlobal(uint32_t u32ModeAdd, uint32_t u32ModeRemove);
+static void crPMgrCleanUnusedDisplays();
 
 static CR_FBTEX* crFbTexAlloc()
 {
@@ -1019,7 +1090,6 @@ static CR_FBTEX* crFbTexCreate(const VBOXVR_TEXTURE *pTex)
     return pFbTex;
 }
 
-
 CR_TEXDATA* CrFbTexDataCreate(const VBOXVR_TEXTURE *pTex)
 {
     CR_FBTEX *pFbTex = crFbTexCreate(pTex);
@@ -1089,6 +1159,18 @@ static CR_FBTEX* crFbTexAcquire(GLuint idTexture)
     return pFbTex;
 }
 
+static CR_TEXDATA* CrFbTexDataAcquire(GLuint idTexture)
+{
+    CR_FBTEX* pTex = crFbTexAcquire(idTexture);
+    if (!pTex)
+    {
+        WARN(("crFbTexAcquire failed for %d", idTexture));
+        return NULL;
+    }
+
+    return &pTex->Tex;
+}
+
 static void crFbEntryMarkDestroyed(CR_FRAMEBUFFER *pFb, CR_FRAMEBUFFER_ENTRY* pEntry)
 {
     if (pEntry->Flags.fCreateNotified)
@@ -1271,6 +1353,8 @@ void CrFbEntryRelease(CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
     crFbEntryRelease(pFb, hEntry);
 }
 
+static int8_t crVBoxServerCrCmdBltPrimaryVramGenericProcess(uint32_t u32PrimaryID, VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, bool fToPrimary);
+
 int CrFbRegionsClear(HCR_FRAMEBUFFER hFb)
 {
     if (!hFb->cUpdating)
@@ -1279,9 +1363,44 @@ int CrFbRegionsClear(HCR_FRAMEBUFFER hFb)
         return VERR_INVALID_STATE;
     }
 
+    uint32_t cRegions;
+    const RTRECT *pRegions;
+    int rc = CrVrScrCompositorRegionsGet(&hFb->Compositor, &cRegions, NULL, NULL, &pRegions);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrVrScrCompositorEntryRegionsGet failed rc %d", rc));
+        return rc;
+    }
+
+    const struct VBVAINFOSCREEN* pScreen = CrFbGetScreenInfo(hFb);
+    VBOXCMDVBVAOFFSET offVRAM = (VBOXCMDVBVAOFFSET)(((uintptr_t)CrFbGetVRAM(hFb)) - ((uintptr_t)g_pvVRamBase));
+    RTPOINT Pos = {0,0};
+    int8_t i8Result = crVBoxServerCrCmdBltPrimaryVramGenericProcess(pScreen->u32ViewIndex, offVRAM, pScreen->u32Width, pScreen->u32Height, &Pos, cRegions, pRegions, true);
+    if (i8Result)
+    {
+        WARN(("crVBoxServerCrCmdBltPrimaryVramGenericProcess failed"));
+        return VERR_INTERNAL_ERROR;
+    }
+
+#ifdef DEBUG
+    {
+        uint32_t cTmpRegions;
+        const RTRECT *pTmpRegions;
+        int tmpRc = CrVrScrCompositorRegionsGet(&hFb->Compositor, &cTmpRegions, NULL, NULL, &pTmpRegions);
+        if (!RT_SUCCESS(tmpRc))
+        {
+            WARN(("CrVrScrCompositorEntryRegionsGet failed rc %d", tmpRc));
+        }
+        Assert(!cTmpRegions);
+    }
+#endif
+
+    /* just in case */
     bool fChanged = false;
     CrVrScrCompositorRegionsClear(&hFb->Compositor, &fChanged);
-    if (fChanged)
+    Assert(!fChanged);
+
+    if (cRegions)
     {
         if (hFb->pDisplay)
             hFb->pDisplay->RegionsChanged(hFb);
@@ -2205,11 +2324,16 @@ public:
         mFlags.Value = 0;
     }
 
-    bool IsCreated()
+    bool IsCreated() const
     {
         return !!mSpuWindow;
     }
 
+    bool IsVisivle() const
+    {
+        return mFlags.fVisible;
+    }
+
     void Destroy()
     {
         CRASSERT(!mcUpdates);
@@ -2376,7 +2500,22 @@ public:
             if (fPresentNeeded || mFlags.fForcePresentOnReenable)
             {
                 mFlags.fForcePresentOnReenable = false;
-                cr_server.head_spu->dispatch_table.VBoxPresentComposition(mSpuWindow, mpCompositor, NULL);
+                if (mpCompositor)
+                    cr_server.head_spu->dispatch_table.VBoxPresentComposition(mSpuWindow, mpCompositor, NULL);
+                else
+                {
+                    VBOXVR_SCR_COMPOSITOR TmpCompositor;
+                    RTRECT Rect;
+                    Rect.xLeft = 0;
+                    Rect.yTop = 0;
+                    Rect.xRight = mWidth;
+                    Rect.yBottom = mHeight;
+                    CrVrScrCompositorInit(&TmpCompositor, &Rect);
+                    /* this is a cleanup operation
+                     * empty compositor is guarantid to be released on VBoxPresentComposition return */
+                    cr_server.head_spu->dispatch_table.VBoxPresentComposition(mSpuWindow, &TmpCompositor, NULL);
+                }
+                g_pLed->Asserted.s.fWriting = 1;
             }
 
             /* even if the above branch is entered due to mFlags.fForcePresentOnReenable,
@@ -2537,6 +2676,28 @@ public:
         mpWindow->UpdateEnd();
     }
 
+    virtual int RegionsChanged(struct CR_FRAMEBUFFER *pFb)
+    {
+        int rc = CrFbDisplayBase::RegionsChanged(pFb);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("err"));
+            return rc;
+        }
+
+        if (mpWindow->GetParentId())
+        {
+            rc = mpWindow->Create();
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("err"));
+                return rc;
+            }
+        }
+
+        return VINF_SUCCESS;
+    }
+
     virtual int EntryCreated(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry)
     {
         int rc = CrFbDisplayBase::EntryCreated(pFb, hEntry);
@@ -2709,6 +2870,13 @@ public:
 
     int winVisibilityChanged()
     {
+        HCR_FRAMEBUFFER hFb = getFramebuffer();
+        if (!hFb || !CrFbIsEnabled(hFb))
+        {
+            Assert(!mpWindow->IsVisivle());
+            return VINF_SUCCESS;
+        }
+
         int rc = mpWindow->UpdateBegin();
         if (RT_SUCCESS(rc))
         {
@@ -2750,22 +2918,14 @@ protected:
             return VERR_INVALID_STATE;
         }
 
-        if (CrFbIsEnabled(getFramebuffer()))
+        int rc = windowDimensionsSync();
+        if (!RT_SUCCESS(rc))
         {
-            const RTRECT* pRect = getRect();
-            int rc = mpWindow->SetPosition(pRect->xLeft - mViewportRect.xLeft, pRect->yTop - mViewportRect.yTop);
-            if (!RT_SUCCESS(rc))
-            {
-                WARN(("SetComposition failed rc %d", rc));
-                return rc;
-            }
-
-            setRegionsChanged();
-
-            return mpWindow->SetSize((uint32_t)(pRect->xRight - pRect->xLeft), (uint32_t)(pRect->yBottom - pRect->yTop));
+            WARN(("windowDimensionsSync failed rc %d", rc));
+            return rc;
         }
 
-        return mpWindow->SetVisible(false);
+        return VINF_SUCCESS;
     }
 
     virtual int windowSetCompositor(bool fSet)
@@ -2787,7 +2947,7 @@ protected:
             return rc;
         }
 
-        rc = mpWindow->SetVisible(false);
+        rc = windowDimensionsSync(true);
         if (!RT_SUCCESS(rc))
         {
             WARN(("err"));
@@ -2819,34 +2979,61 @@ protected:
         return CrFbDisplayBase::fbCleanup();
     }
 
-    virtual int windowSync()
+    int windowDimensionsSync(bool fForceCleanup = false)
     {
-        const RTRECT* pRect = getRect();
+        int rc = VINF_SUCCESS;
 
-        int rc = mpWindow->UpdateBegin();
-        if (!RT_SUCCESS(rc))
+        HCR_FRAMEBUFFER hFb = getFramebuffer();
+        if (!fForceCleanup && hFb && CrFbIsEnabled(hFb))
         {
-            WARN(("err"));
-            return rc;
-        }
+            const RTRECT* pRect = getRect();
 
-        rc = windowSetCompositor(true);
-        if (!RT_SUCCESS(rc))
+            rc = mpWindow->SetPosition(pRect->xLeft - mViewportRect.xLeft, pRect->yTop - mViewportRect.yTop);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("err"));
+                return rc;
+            }
+
+            setRegionsChanged();
+
+            rc = mpWindow->SetSize((uint32_t)(pRect->xRight - pRect->xLeft), (uint32_t)(pRect->yBottom - pRect->yTop));
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("err"));
+                return rc;
+            }
+
+            rc = mpWindow->SetVisible(!g_CrPresenter.fWindowsForceHidden);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("err"));
+                return rc;
+            }
+        }
+        else
         {
-            WARN(("err"));
-            mpWindow->UpdateEnd();
-            return rc;
+            rc = mpWindow->SetVisible(false);
+            if (!RT_SUCCESS(rc))
+            {
+                WARN(("err"));
+                return rc;
+            }
         }
 
-        rc = mpWindow->SetPosition(pRect->xLeft - mViewportRect.xLeft, pRect->yTop - mViewportRect.yTop);
+        return rc;
+    }
+
+    virtual int windowSync()
+    {
+        int rc = mpWindow->UpdateBegin();
         if (!RT_SUCCESS(rc))
         {
             WARN(("err"));
-            mpWindow->UpdateEnd();
             return rc;
         }
 
-        rc = mpWindow->SetSize((uint32_t)(pRect->xRight - pRect->xLeft), (uint32_t)(pRect->yBottom - pRect->yTop));
+        rc = windowSetCompositor(true);
         if (!RT_SUCCESS(rc))
         {
             WARN(("err"));
@@ -2854,7 +3041,7 @@ protected:
             return rc;
         }
 
-        rc = mpWindow->SetVisible(!g_CrPresenter.fWindowsForceHidden);
+        rc = windowDimensionsSync();
         if (!RT_SUCCESS(rc))
         {
             WARN(("err"));
@@ -2876,9 +3063,31 @@ protected:
             return rc;
         }
 
-        mu32Screen = CrFbGetScreenInfo(getFramebuffer())->u32ViewIndex;
+        HCR_FRAMEBUFFER hFb = getFramebuffer();
+
+        mu32Screen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+
+        rc = windowSync();
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("windowSync failed %d", rc));
+            return rc;
+        }
+
+        if (CrFbHas3DData(hFb))
+        {
+            if (mpWindow->GetParentId())
+            {
+                rc = mpWindow->Create();
+                if (!RT_SUCCESS(rc))
+                {
+                    WARN(("err"));
+                    return rc;
+                }
+            }
+        }
 
-        return windowSync();
+        return VINF_SUCCESS;
     }
 
     virtual const struct RTRECT* getRect()
@@ -3424,7 +3633,7 @@ protected:
         uint32_t cRects;
         const RTRECT *pRects;
 
-        int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, NULL, &pRects, NULL);
+        int rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, &pRects, NULL, NULL);
         if (!RT_SUCCESS(rc))
         {
             WARN(("CrVrScrCompositorEntryRegionsGet failed, rc %d", rc));
@@ -3584,59 +3793,6 @@ void crDbgDumpRects(uint32_t cRects, const RTRECT *paRects)
     crDebug("End Dumping rects (%d)", cRects);
 }
 
-int crServerDisplaySaveState(PSSMHANDLE pSSM)
-{
-    int rc;
-    int cDisplays = 0, i;
-    for (i = 0; i < cr_server.screenCount; ++i)
-    {
-        if (ASMBitTest(cr_server.DisplaysInitMap, i) && !CrDpIsEmpty(&cr_server.aDispplays[i]))
-            ++cDisplays;
-    }
-
-    rc = SSMR3PutS32(pSSM, cDisplays);
-    AssertRCReturn(rc, rc);
-
-    if (!cDisplays)
-        return VINF_SUCCESS;
-
-    rc = SSMR3PutS32(pSSM, cr_server.screenCount);
-    AssertRCReturn(rc, rc);
-
-    for (i = 0; i < cr_server.screenCount; ++i)
-    {
-        rc = SSMR3PutS32(pSSM, cr_server.screen[i].x);
-        AssertRCReturn(rc, rc);
-
-        rc = SSMR3PutS32(pSSM, cr_server.screen[i].y);
-        AssertRCReturn(rc, rc);
-
-        rc = SSMR3PutU32(pSSM, cr_server.screen[i].w);
-        AssertRCReturn(rc, rc);
-
-        rc = SSMR3PutU32(pSSM, cr_server.screen[i].h);
-        AssertRCReturn(rc, rc);
-    }
-
-    for (i = 0; i < cr_server.screenCount; ++i)
-    {
-        if (ASMBitTest(cr_server.DisplaysInitMap, i) && !CrDpIsEmpty(&cr_server.aDispplays[i]))
-        {
-            rc = SSMR3PutS32(pSSM, i);
-            AssertRCReturn(rc, rc);
-
-            rc = CrDpSaveState(&cr_server.aDispplays[i], pSSM);
-            AssertRCReturn(rc, rc);
-        }
-    }
-
-    return VINF_SUCCESS;
-}
-
-int crServerDisplayLoadState(PSSMHANDLE pSSM, uint32_t u32Version)
-{
-
-}
 #endif
 
 class CrFbDisplayEntryDataMonitor : public CrFbDisplayBase
@@ -3666,10 +3822,60 @@ protected:
     }
 };
 
+int CrPMgrDisable()
+{
+    if (!g_CrPresenter.fEnabled)
+        return VINF_SUCCESS;
+
+    g_CrPresenter.u32DisabledDisplayMode = g_CrPresenter.u32DisplayMode;
+
+    int rc = crPMgrModeModifyGlobal(0, CR_PMGR_MODE_WINDOW);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("crPMgrModeModifyGlobal failed %d", rc));
+        return rc;
+    }
+
+    crPMgrCleanUnusedDisplays();
+
+    g_CrPresenter.fEnabled = false;
+
+    return VINF_SUCCESS;
+}
+
+int CrPMgrEnable()
+{
+    if (g_CrPresenter.fEnabled)
+        return VINF_SUCCESS;
+
+    g_CrPresenter.fEnabled = true;
+
+    int rc = crPMgrModeModifyGlobal(g_CrPresenter.u32DisabledDisplayMode, 0);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("crPMgrModeModifyGlobal failed %d", rc));
+        g_CrPresenter.fEnabled = false;
+        return rc;
+    }
+
+    g_CrPresenter.u32DisabledDisplayMode = 0;
+
+    return VINF_SUCCESS;
+}
+
 int CrPMgrInit()
 {
     int rc = VINF_SUCCESS;
     memset(&g_CrPresenter, 0, sizeof (g_CrPresenter));
+    g_CrPresenter.fEnabled = true;
+    for (int i = 0; i < RT_ELEMENTS(g_CrPresenter.aDisplayInfos); ++i)
+    {
+        g_CrPresenter.aDisplayInfos[i].u32Id = i;
+        g_CrPresenter.aDisplayInfos[i].iFb = -1;
+
+        g_CrPresenter.aFbInfos[i].u32Id = i;
+    }
+
     g_CrPresenter.pFbTexMap = crAllocHashtable();
     if (g_CrPresenter.pFbTexMap)
     {
@@ -3745,20 +3951,20 @@ void CrPMgrTerm()
             hFb;
             hFb = CrPMgrFbGetNextInitialized(hFb))
     {
-        uint32_t idScreen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+        uint32_t iFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
         CrFbDisplaySet(hFb, NULL);
-        CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
-
-        if (pInfo->pDpComposite)
-            delete pInfo->pDpComposite;
-
-        Assert(!pInfo->pDpWin);
-        Assert(!pInfo->pDpWinRootVr);
-        Assert(!pInfo->pDpVrdp);
+        CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[iFb];
+        if (pFbInfo->pDpComposite)
+        {
+            delete pFbInfo->pDpComposite;
+            pFbInfo->pDpComposite = NULL;
+        }
 
         CrFbTerm(hFb);
     }
 
+    crPMgrCleanUnusedDisplays();
+
 #ifndef VBOXVDBG_MEMCACHE_DISABLE
     RTMemCacheDestroy(g_CrPresenter.FbEntryLookasideList);
     RTMemCacheDestroy(g_CrPresenter.FbTexLookasideList);
@@ -3775,46 +3981,46 @@ void CrPMgrTerm()
     memset(&g_CrPresenter, 0, sizeof (g_CrPresenter));
 }
 
-HCR_FRAMEBUFFER CrPMgrFbGet(uint32_t idScreen)
+HCR_FRAMEBUFFER CrPMgrFbGet(uint32_t idFb)
 {
-    if (idScreen >= CR_MAX_GUEST_MONITORS)
+    if (idFb >= CR_MAX_GUEST_MONITORS)
     {
-        WARN(("invalid idScreen %d", idScreen));
+        WARN(("invalid idFb %d", idFb));
         return NULL;
     }
 
-    if (!CrFBmIsSet(&g_CrPresenter.FramebufferInitMap, idScreen))
+    if (!CrFBmIsSet(&g_CrPresenter.FramebufferInitMap, idFb))
     {
-        CrFbInit(&g_CrPresenter.aFramebuffers[idScreen], idScreen);
-        CrFBmSetAtomic(&g_CrPresenter.FramebufferInitMap, idScreen);
+        CrFbInit(&g_CrPresenter.aFramebuffers[idFb], idFb);
+        CrFBmSetAtomic(&g_CrPresenter.FramebufferInitMap, idFb);
     }
     else
-        Assert(g_CrPresenter.aFramebuffers[idScreen].ScreenInfo.u32ViewIndex == idScreen);
+        Assert(g_CrPresenter.aFramebuffers[idFb].ScreenInfo.u32ViewIndex == idFb);
 
-    return &g_CrPresenter.aFramebuffers[idScreen];
+    return &g_CrPresenter.aFramebuffers[idFb];
 }
 
-HCR_FRAMEBUFFER CrPMgrFbGetInitialized(uint32_t idScreen)
+HCR_FRAMEBUFFER CrPMgrFbGetInitialized(uint32_t idFb)
 {
-    if (idScreen >= CR_MAX_GUEST_MONITORS)
+    if (idFb >= CR_MAX_GUEST_MONITORS)
     {
-        WARN(("invalid idScreen %d", idScreen));
+        WARN(("invalid idFb %d", idFb));
         return NULL;
     }
 
-    if (!CrFBmIsSet(&g_CrPresenter.FramebufferInitMap, idScreen))
+    if (!CrFBmIsSet(&g_CrPresenter.FramebufferInitMap, idFb))
     {
         return NULL;
     }
     else
-        Assert(g_CrPresenter.aFramebuffers[idScreen].ScreenInfo.u32ViewIndex == idScreen);
+        Assert(g_CrPresenter.aFramebuffers[idFb].ScreenInfo.u32ViewIndex == idFb);
 
-    return &g_CrPresenter.aFramebuffers[idScreen];
+    return &g_CrPresenter.aFramebuffers[idFb];
 }
 
-HCR_FRAMEBUFFER CrPMgrFbGetEnabled(uint32_t idScreen)
+HCR_FRAMEBUFFER CrPMgrFbGetEnabled(uint32_t idFb)
 {
-    HCR_FRAMEBUFFER hFb = CrPMgrFbGetInitialized(idScreen);
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetInitialized(idFb);
 
     if(hFb && CrFbIsEnabled(hFb))
         return hFb;
@@ -3822,6 +4028,21 @@ HCR_FRAMEBUFFER CrPMgrFbGetEnabled(uint32_t idScreen)
     return NULL;
 }
 
+HCR_FRAMEBUFFER CrPMgrFbGetEnabledForScreen(uint32_t idScreen)
+{
+    if (idScreen >= (uint32_t)cr_server.screenCount)
+    {
+        WARN(("invalid target id"));
+        return NULL;
+    }
+
+    const CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[idScreen];
+    if (pDpInfo->iFb < 0)
+        return NULL;
+
+    return CrPMgrFbGetEnabled(pDpInfo->iFb);
+}
+
 static HCR_FRAMEBUFFER crPMgrFbGetNextEnabled(uint32_t i)
 {
     for (;i < (uint32_t)cr_server.screenCount; ++i)
@@ -3872,6 +4093,21 @@ HCR_FRAMEBUFFER CrPMgrFbGetNextInitialized(HCR_FRAMEBUFFER hFb)
     return crPMgrFbGetNextInitialized(hFb->ScreenInfo.u32ViewIndex+1);
 }
 
+HCR_FRAMEBUFFER CrPMgrFbGetEnabledByVramStart(VBOXCMDVBVAOFFSET offVRAM)
+{
+    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
+            hFb;
+            hFb = CrPMgrFbGetNextEnabled(hFb))
+    {
+        const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+        if (pScreen->u32StartOffset == offVRAM)
+            return hFb;
+    }
+
+    return NULL;
+}
+
+
 static uint32_t crPMgrModeAdjustVal(uint32_t u32Mode)
 {
     u32Mode = CR_PMGR_MODE_ALL & u32Mode;
@@ -3888,22 +4124,22 @@ int CrPMgrScreenChanged(uint32_t idScreen)
         return VERR_INVALID_PARAMETER;
     }
 
-    CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
-    if (pInfo->pDpWin)
+    CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[idScreen];
+    if (pDpInfo->pDpWin)
     {
-        HCR_FRAMEBUFFER hFb = CrPMgrFbGet(idScreen);
-        if (CrFbIsUpdating(hFb))
+        HCR_FRAMEBUFFER hFb = pDpInfo->iFb >= 0 ? CrPMgrFbGet(pDpInfo->iFb) : NULL;
+        if (hFb && CrFbIsUpdating(hFb))
         {
             WARN(("trying to update viewport while framebuffer is being updated"));
             return VERR_INVALID_STATE;
         }
 
-        int rc = pInfo->pDpWin->UpdateBegin(hFb);
+        int rc = pDpInfo->pDpWin->UpdateBegin(hFb);
         if (RT_SUCCESS(rc))
         {
-            pInfo->pDpWin->reparent(cr_server.screen[idScreen].winID);
+            pDpInfo->pDpWin->reparent(cr_server.screen[idScreen].winID);
 
-            pInfo->pDpWin->UpdateEnd(hFb);
+            pDpInfo->pDpWin->UpdateEnd(hFb);
         }
         else
             WARN(("UpdateBegin failed %d", rc));
@@ -3920,21 +4156,21 @@ int CrPMgrViewportUpdate(uint32_t idScreen)
         return VERR_INVALID_PARAMETER;
     }
 
-    CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
-    if (pInfo->pDpWin)
+    CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[idScreen];
+    if (pDpInfo->iFb >= 0)
     {
-        HCR_FRAMEBUFFER hFb = CrPMgrFbGet(idScreen);
+        HCR_FRAMEBUFFER hFb = CrPMgrFbGet(pDpInfo->iFb);
         if (CrFbIsUpdating(hFb))
         {
             WARN(("trying to update viewport while framebuffer is being updated"));
             return VERR_INVALID_STATE;
         }
 
-        int rc = pInfo->pDpWin->UpdateBegin(hFb);
+        int rc = pDpInfo->pDpWin->UpdateBegin(hFb);
         if (RT_SUCCESS(rc))
         {
-            pInfo->pDpWin->setViewportRect(&cr_server.screenVieport[idScreen].Rect);
-            pInfo->pDpWin->UpdateEnd(hFb);
+            pDpInfo->pDpWin->setViewportRect(&cr_server.screenVieport[idScreen].Rect);
+            pDpInfo->pDpWin->UpdateEnd(hFb);
         }
         else
             WARN(("UpdateBegin failed %d", rc));
@@ -3943,208 +4179,541 @@ int CrPMgrViewportUpdate(uint32_t idScreen)
     return VINF_SUCCESS;
 }
 
-int CrPMgrModeModify(HCR_FRAMEBUFFER hFb, uint32_t u32ModeAdd, uint32_t u32ModeRemove)
+static int crPMgrFbDisconnectDisplay(HCR_FRAMEBUFFER hFb, CrFbDisplayBase *pDp)
 {
-    uint32_t idScreen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    if (pDp->getFramebuffer() != hFb)
+        return VINF_SUCCESS;
 
-    CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
-    u32ModeRemove = ((u32ModeRemove | crPMgrModeAdjustVal(u32ModeRemove)) & CR_PMGR_MODE_ALL);
-    u32ModeAdd = crPMgrModeAdjustVal(u32ModeAdd);
-    u32ModeRemove &= pInfo->u32Mode;
-    u32ModeAdd &= ~(u32ModeRemove | pInfo->u32Mode);
-    uint32_t u32ModeResulting = ((pInfo->u32Mode | u32ModeAdd) & ~u32ModeRemove);
-    uint32_t u32Tmp = crPMgrModeAdjustVal(u32ModeResulting);
-    if (u32Tmp != u32ModeResulting)
+    CrFbDisplayBase * pCurDp = (CrFbDisplayBase*)CrFbDisplayGet(hFb);
+    if (!pCurDp)
     {
-        u32ModeAdd |= (u32Tmp & ~u32ModeResulting);
-        u32ModeRemove |= (~u32Tmp & u32ModeResulting);
-        u32ModeResulting = u32Tmp;
-        Assert(u32ModeResulting == ((pInfo->u32Mode | u32ModeAdd) & ~u32ModeRemove));
+        WARN(("no display set, unexpected"));
+        return VERR_INTERNAL_ERROR;
     }
-    if (!u32ModeRemove && !u32ModeAdd)
-        return VINF_SUCCESS;
 
-    if (!pInfo->pDpComposite)
+    if (pCurDp == pDp)
     {
-        pInfo->pDpComposite = new CrFbDisplayComposite();
-        pInfo->pDpComposite->setFramebuffer(hFb);
+        pDp->setFramebuffer(NULL);
+        CrFbDisplaySet(hFb, NULL);
+        return VINF_SUCCESS;
     }
 
-    CrFbWindow * pOldWin = NULL;
-
-    if (u32ModeRemove & CR_PMGR_MODE_ROOTVR)
+    uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+    if (pFbInfo->pDpComposite != pCurDp)
     {
-        CRASSERT(pInfo->pDpWinRootVr);
-        CRASSERT(pInfo->pDpWin == pInfo->pDpWinRootVr);
-        pInfo->pDpComposite->remove(pInfo->pDpWinRootVr);
-        pOldWin = pInfo->pDpWinRootVr->windowDetach();
-        CRASSERT(pOldWin);
-        delete pInfo->pDpWinRootVr;
-        pInfo->pDpWinRootVr = NULL;
-        pInfo->pDpWin = NULL;
+        WARN(("misconfig, expectig the curret framebuffer to be present, and thus composite is expected"));
+        return VERR_INTERNAL_ERROR;
     }
-    else if (u32ModeRemove & CR_PMGR_MODE_WINDOW)
+
+    if (pDp->getContainer() == pFbInfo->pDpComposite)
     {
-        CRASSERT(!pInfo->pDpWinRootVr);
-        CRASSERT(pInfo->pDpWin);
-        pInfo->pDpComposite->remove(pInfo->pDpWin);
-        pOldWin = pInfo->pDpWin->windowDetach();
-        CRASSERT(pOldWin);
-        delete pInfo->pDpWin;
-        pInfo->pDpWin = NULL;
+        pFbInfo->pDpComposite->remove(pDp);
+        uint32_t cDisplays = pFbInfo->pDpComposite->getDisplayCount();
+        if (cDisplays <= 1)
+        {
+            Assert(cDisplays == 1);
+            CrFbDisplayBase *pDpFirst = pFbInfo->pDpComposite->first();
+            if (pDpFirst)
+                pFbInfo->pDpComposite->remove(pDpFirst, false);
+            CrFbDisplaySet(hFb, pDpFirst);
+        }
+        return VINF_SUCCESS;
     }
 
-    if (u32ModeRemove & CR_PMGR_MODE_VRDP)
-    {
-        CRASSERT(pInfo->pDpVrdp);
-        if (pInfo->pDpComposite)
-            pInfo->pDpComposite->remove(pInfo->pDpVrdp);
-        else
-            CrFbDisplaySet(hFb, NULL);
+    WARN(("misconfig"));
+    return VERR_INTERNAL_ERROR;
+}
 
-        delete pInfo->pDpVrdp;
-        pInfo->pDpVrdp = NULL;
-    }
+static int crPMgrFbConnectDisplay(HCR_FRAMEBUFFER hFb, CrFbDisplayBase *pDp)
+{
+    if (pDp->getFramebuffer() == hFb)
+        return VINF_SUCCESS;
 
-    CrFbDisplayBase *pDpToSet = NULL;
+    CrFbDisplayBase * pCurDp = (CrFbDisplayBase*)CrFbDisplayGet(hFb);
+    if (!pCurDp)
+    {
+        pDp->setFramebuffer(hFb);
+        CrFbDisplaySet(hFb, pDp);
+        return VINF_SUCCESS;
+    }
 
-    if (u32ModeAdd & CR_PMGR_MODE_ROOTVR)
+    if (pCurDp == pDp)
     {
-        CRASSERT(!pInfo->pDpWin);
-        CRASSERT(!pInfo->pDpWinRootVr);
+        WARN(("misconfig, current framebuffer is not expected to be set"));
+        return VERR_INTERNAL_ERROR;
+    }
 
-        if (!pOldWin)
-            pOldWin = new CrFbWindow(cr_server.screen[idScreen].winID);
+    uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+    if (pFbInfo->pDpComposite != pCurDp)
+    {
+        if (!pFbInfo->pDpComposite)
+        {
+            pFbInfo->pDpComposite = new CrFbDisplayComposite();
+            pFbInfo->pDpComposite->setFramebuffer(hFb);
+        }
 
-        pInfo->pDpWinRootVr = new CrFbDisplayWindowRootVr(pOldWin, &cr_server.screenVieport[idScreen].Rect);
-        pOldWin = NULL;
-        pInfo->pDpWin = pInfo->pDpWinRootVr;
-        pInfo->pDpComposite->add(pInfo->pDpWinRootVr);
+        pFbInfo->pDpComposite->add(pCurDp);
+        CrFbDisplaySet(hFb, pFbInfo->pDpComposite);
     }
-    else if (u32ModeAdd & CR_PMGR_MODE_WINDOW)
-    {
-        CRASSERT(!pInfo->pDpWin);
-        CRASSERT(!pInfo->pDpWinRootVr);
 
-        if (!pOldWin)
-            pOldWin = new CrFbWindow(cr_server.screen[idScreen].winID);
+    pFbInfo->pDpComposite->add(pDp);
+    return VINF_SUCCESS;
+}
 
-        pInfo->pDpWin = new CrFbDisplayWindow(pOldWin, &cr_server.screenVieport[idScreen].Rect);
-        pOldWin = NULL;
-        pInfo->pDpComposite->add(pInfo->pDpWin);
+static int crPMgrFbDisconnectTarget(HCR_FRAMEBUFFER hFb, uint32_t i)
+{
+    uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+    CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+    if (pDpInfo->iFb != idFb)
+    {
+        WARN(("target not connected"));
+        Assert(!ASMBitTest(pFbInfo->aTargetMap, i));
+        return VINF_SUCCESS;
     }
 
-    if (u32ModeAdd & CR_PMGR_MODE_VRDP)
+    Assert(ASMBitTest(pFbInfo->aTargetMap, i));
+
+    int rc = VINF_SUCCESS;
+    if (pDpInfo->pDpVrdp)
     {
-        CRASSERT(!pInfo->pDpVrdp);
-        pInfo->pDpVrdp = new CrFbDisplayVrdp();
-        pInfo->pDpComposite->add(pInfo->pDpVrdp);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpVrdp);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay failed %d", rc));
+            return rc;
+        }
     }
 
-    if (pInfo->pDpComposite->getDisplayCount() > 1)
+    if (pDpInfo->pDpWinRootVr)
     {
-        ICrFbDisplay* pCur = CrFbDisplayGet(hFb);
-        if (pCur != (ICrFbDisplay*)pInfo->pDpComposite)
-            CrFbDisplaySet(hFb, pInfo->pDpComposite);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpWinRootVr);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay failed %d", rc));
+            return rc;
+        }
     }
-    else
+
+    if (pDpInfo->pDpWin)
     {
-        ICrFbDisplay* pCur = CrFbDisplayGet(hFb);
-        ICrFbDisplay* pFirst = pInfo->pDpComposite->first();
-        if (pCur != pFirst)
-            CrFbDisplaySet(hFb, pFirst);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpWin);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay failed %d", rc));
+            return rc;
+        }
     }
 
-    if (pOldWin)
-        delete pOldWin;
-
-    pInfo->u32Mode = u32ModeResulting;
+    ASMBitClear(pFbInfo->aTargetMap, i);
+    pDpInfo->iFb = -1;
 
     return VINF_SUCCESS;
 }
 
-static int crPMgrModeModifyGlobal(uint32_t u32ModeAdd, uint32_t u32ModeRemove)
+static void crPMgrDpWinRootVrCreate(CR_FBDISPLAY_INFO *pDpInfo)
 {
-    g_CrPresenter.u32DisplayMode = (g_CrPresenter.u32DisplayMode | u32ModeAdd) & ~u32ModeRemove;
-
-    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
-            hFb;
-            hFb = CrPMgrFbGetNextEnabled(hFb))
+    if (!pDpInfo->pDpWinRootVr)
     {
-        CrPMgrModeModify(hFb, u32ModeAdd, u32ModeRemove);
-    }
+        CrFbWindow *pWin = NULL;
+        if (pDpInfo->pDpWin)
+        {
+            pWin = pDpInfo->pDpWin->windowDetach();
+            CRASSERT(pWin);
+            delete pDpInfo->pDpWin;
+            pDpInfo->pDpWin = NULL;
+        }
+        else
+            pWin = new CrFbWindow(cr_server.screen[pDpInfo->u32Id].winID);
 
-    return VINF_SUCCESS;
+        pDpInfo->pDpWinRootVr = new CrFbDisplayWindowRootVr(pWin, &cr_server.screenVieport[pDpInfo->u32Id].Rect);
+        pDpInfo->pDpWin = pDpInfo->pDpWinRootVr;
+    }
 }
 
-int CrPMgrModeVrdp(bool fEnable)
+static void crPMgrDpWinCreate(CR_FBDISPLAY_INFO *pDpInfo)
 {
-    uint32_t u32ModeAdd, u32ModeRemove;
-    if (fEnable)
+    CrFbWindow *pWin = NULL;
+    if (pDpInfo->pDpWinRootVr)
     {
-        u32ModeAdd = CR_PMGR_MODE_VRDP;
-        u32ModeRemove = 0;
+        CRASSERT(pDpInfo->pDpWinRootVr == pDpInfo->pDpWin);
+        pWin = pDpInfo->pDpWin->windowDetach();
+        CRASSERT(pWin);
+        delete pDpInfo->pDpWinRootVr;
+        pDpInfo->pDpWinRootVr = NULL;
+        pDpInfo->pDpWin = NULL;
     }
-    else
+
+    if (!pDpInfo->pDpWin)
     {
-        u32ModeAdd = 0;
-        u32ModeRemove = CR_PMGR_MODE_VRDP;
+        if (!pWin)
+            pWin = new CrFbWindow(cr_server.screen[pDpInfo->u32Id].winID);
+
+        pDpInfo->pDpWin = new CrFbDisplayWindow(pWin, &cr_server.screenVieport[pDpInfo->u32Id].Rect);
     }
-    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
 }
 
-int CrPMgrModeRootVr(bool fEnable)
+static int crPMgrFbDisconnectTargetDisplays(HCR_FRAMEBUFFER hFb, CR_FBDISPLAY_INFO *pDpInfo, uint32_t u32ModeRemove)
 {
-    uint32_t u32ModeAdd, u32ModeRemove;
-    if (fEnable)
+    int rc = VINF_SUCCESS;
+    if (u32ModeRemove & CR_PMGR_MODE_ROOTVR)
     {
-        u32ModeAdd = CR_PMGR_MODE_ROOTVR;
-        u32ModeRemove = CR_PMGR_MODE_WINDOW;
+        CRASSERT(pDpInfo->pDpWinRootVr);
+        CRASSERT(pDpInfo->pDpWin == pDpInfo->pDpWinRootVr);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpWinRootVr);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay pDpWinRootVr failed %d", rc));
+            return rc;
+        }
     }
-    else
+    else if (u32ModeRemove & CR_PMGR_MODE_WINDOW)
     {
-        u32ModeAdd = CR_PMGR_MODE_WINDOW;
-        u32ModeRemove = CR_PMGR_MODE_ROOTVR;
+        CRASSERT(!pDpInfo->pDpWinRootVr);
+        CRASSERT(pDpInfo->pDpWin);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpWin);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay pDpWin failed %d", rc));
+            return rc;
+        }
     }
 
-    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
+    if (u32ModeRemove & CR_PMGR_MODE_VRDP)
+    {
+        CRASSERT(pDpInfo->pDpVrdp);
+        rc = crPMgrFbDisconnectDisplay(hFb, pDpInfo->pDpVrdp);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectDisplay pDpVrdp failed %d", rc));
+            return rc;
+        }
+    }
+
+    return VINF_SUCCESS;
 }
 
-int CrPMgrModeWinVisible(bool fEnable)
+static int crPMgrFbConnectTargetDisplays(HCR_FRAMEBUFFER hFb, CR_FBDISPLAY_INFO *pDpInfo, uint32_t u32ModeAdd)
 {
-    if (!g_CrPresenter.fWindowsForceHidden == !!fEnable)
-        return VINF_SUCCESS;
+    int rc = VINF_SUCCESS;
 
-    g_CrPresenter.fWindowsForceHidden = !fEnable;
+    if (u32ModeAdd & CR_PMGR_MODE_ROOTVR)
+    {
+        crPMgrDpWinRootVrCreate(pDpInfo);
 
-    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
-            hFb;
-            hFb = CrPMgrFbGetNextEnabled(hFb))
+        rc = crPMgrFbConnectDisplay(hFb, pDpInfo->pDpWinRootVr);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbConnectDisplay pDpWinRootVr failed %d", rc));
+            return rc;
+        }
+    }
+    else if (u32ModeAdd & CR_PMGR_MODE_WINDOW)
     {
-        uint32_t idScreen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+        crPMgrDpWinCreate(pDpInfo);
+
+        rc = crPMgrFbConnectDisplay(hFb, pDpInfo->pDpWin);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbConnectDisplay pDpWin failed %d", rc));
+            return rc;
+        }
+    }
 
-        CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
+    if (u32ModeAdd & CR_PMGR_MODE_VRDP)
+    {
+        if (!pDpInfo->pDpVrdp)
+            pDpInfo->pDpVrdp = new CrFbDisplayVrdp();
 
-        if (pInfo->pDpWin)
-            pInfo->pDpWin->winVisibilityChanged();
+        rc = crPMgrFbConnectDisplay(hFb, pDpInfo->pDpVrdp);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbConnectDisplay pDpVrdp failed %d", rc));
+            return rc;
+        }
     }
 
     return VINF_SUCCESS;
 }
 
-int CrPMgrRootVrUpdate()
+static int crPMgrFbConnectTarget(HCR_FRAMEBUFFER hFb, uint32_t i)
 {
-    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
-            hFb;
-            hFb = CrPMgrFbGetNextEnabled(hFb))
+    uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+    CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+    if (pDpInfo->iFb == idFb)
     {
-        uint32_t idScreen = CrFbGetScreenInfo(hFb)->u32ViewIndex;
-        CR_FBDISPLAY_INFO *pInfo = &g_CrPresenter.aDisplayInfos[idScreen];
-        int rc = CrFbUpdateBegin(hFb);
-        if (RT_SUCCESS(rc))
-        {
-            pInfo->pDpWinRootVr->RegionsChanged(hFb);
-            CrFbUpdateEnd(hFb);
+        WARN(("target not connected"));
+        Assert(ASMBitTest(pFbInfo->aTargetMap, i));
+        return VINF_SUCCESS;
+    }
+
+    Assert(!ASMBitTest(pFbInfo->aTargetMap, i));
+
+    int rc = VINF_SUCCESS;
+
+    if (pDpInfo->iFb != -1)
+    {
+        Assert(pDpInfo->iFb < cr_server.screenCount);
+        HCR_FRAMEBUFFER hAssignedFb = CrPMgrFbGet(pDpInfo->iFb);
+        Assert(hAssignedFb);
+        rc = crPMgrFbDisconnectTarget(hAssignedFb, i);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectTarget failed %d", rc));
+            return rc;
+        }
+    }
+
+    rc = crPMgrFbConnectTargetDisplays(hFb, pDpInfo, g_CrPresenter.u32DisplayMode);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("crPMgrFbConnectTargetDisplays failed %d", rc));
+        return rc;
+    }
+
+    ASMBitSet(pFbInfo->aTargetMap, i);
+    pDpInfo->iFb = idFb;
+
+    return VINF_SUCCESS;
+}
+
+static int crPMgrFbDisconnect(HCR_FRAMEBUFFER hFb, const uint32_t *pTargetMap)
+{
+    int rc = VINF_SUCCESS;
+    for (int i = ASMBitFirstSet(pTargetMap, cr_server.screenCount);
+            i >= 0;
+            i = ASMBitNextSet(pTargetMap, cr_server.screenCount, i))
+    {
+        rc = crPMgrFbDisconnectTarget(hFb, (uint32_t)i);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnectTarget failed %d", rc));
+            return rc;
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+static int crPMgrFbConnect(HCR_FRAMEBUFFER hFb, const uint32_t *pTargetMap)
+{
+    int rc = VINF_SUCCESS;
+    for (int i = ASMBitFirstSet(pTargetMap, cr_server.screenCount);
+            i >= 0;
+            i = ASMBitNextSet(pTargetMap, cr_server.screenCount, i))
+    {
+        rc = crPMgrFbConnectTarget(hFb, (uint32_t)i);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbConnectTarget failed %d", rc));
+            return rc;
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+static int crPMgrModeModifyTarget(HCR_FRAMEBUFFER hFb, uint32_t iDisplay, uint32_t u32ModeAdd, uint32_t u32ModeRemove)
+{
+    CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[iDisplay];
+    int rc = crPMgrFbDisconnectTargetDisplays(hFb, pDpInfo, u32ModeRemove);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("crPMgrFbDisconnectTargetDisplays failed %d", rc));
+        return rc;
+    }
+
+    rc = crPMgrFbConnectTargetDisplays(hFb, pDpInfo, u32ModeAdd);
+    if (RT_FAILURE(rc))
+    {
+        WARN(("crPMgrFbConnectTargetDisplays failed %d", rc));
+        return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+static int crPMgrModeModify(HCR_FRAMEBUFFER hFb, uint32_t u32ModeAdd, uint32_t u32ModeRemove)
+{
+    int rc = VINF_SUCCESS;
+    uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+    for (int i = ASMBitFirstSet(pFbInfo->aTargetMap, cr_server.screenCount);
+            i >= 0;
+            i = ASMBitNextSet(pFbInfo->aTargetMap, cr_server.screenCount, i))
+    {
+        rc = crPMgrModeModifyTarget(hFb, (uint32_t)i, u32ModeAdd, u32ModeRemove);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrModeModifyTarget failed %d", rc));
+            return rc;
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+static void crPMgrCleanUnusedDisplays()
+{
+    for (int i = 0; i < cr_server.screenCount; ++i)
+    {
+        CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+
+        if (pDpInfo->pDpWinRootVr)
+        {
+            if (!pDpInfo->pDpWinRootVr->getFramebuffer())
+            {
+                delete pDpInfo->pDpWinRootVr;
+                pDpInfo->pDpWinRootVr = NULL;
+                pDpInfo->pDpWin = NULL;
+            }
+            else
+                WARN(("pDpWinRootVr is used"));
+        }
+        else if (pDpInfo->pDpWin)
+        {
+            if (!pDpInfo->pDpWin->getFramebuffer())
+            {
+                delete pDpInfo->pDpWin;
+                pDpInfo->pDpWin = NULL;
+            }
+            else
+                WARN(("pDpWin is used"));
+        }
+
+        if (pDpInfo->pDpVrdp)
+        {
+            if (!pDpInfo->pDpVrdp->getFramebuffer())
+            {
+                delete pDpInfo->pDpVrdp;
+                pDpInfo->pDpVrdp = NULL;
+            }
+            else
+                WARN(("pDpVrdp is used"));
+        }
+    }
+}
+
+static int crPMgrModeModifyGlobal(uint32_t u32ModeAdd, uint32_t u32ModeRemove)
+{
+    uint32_t u32InternalMode = g_CrPresenter.fEnabled ? g_CrPresenter.u32DisplayMode : g_CrPresenter.u32DisabledDisplayMode;
+
+    u32ModeRemove = ((u32ModeRemove | crPMgrModeAdjustVal(u32ModeRemove)) & CR_PMGR_MODE_ALL);
+    u32ModeAdd = crPMgrModeAdjustVal(u32ModeAdd);
+    u32ModeRemove &= u32InternalMode;
+    u32ModeAdd &= ~(u32ModeRemove | u32InternalMode);
+    uint32_t u32ModeResulting = ((u32InternalMode | u32ModeAdd) & ~u32ModeRemove);
+    uint32_t u32Tmp = crPMgrModeAdjustVal(u32ModeResulting);
+    if (u32Tmp != u32ModeResulting)
+    {
+        u32ModeAdd |= (u32Tmp & ~u32ModeResulting);
+        u32ModeRemove |= (~u32Tmp & u32ModeResulting);
+        u32ModeResulting = u32Tmp;
+        Assert(u32ModeResulting == ((u32InternalMode | u32ModeAdd) & ~u32ModeRemove));
+    }
+    if (!u32ModeRemove && !u32ModeAdd)
+        return VINF_SUCCESS;
+
+    uint32_t u32DisplayMode = (g_CrPresenter.u32DisplayMode | u32ModeAdd) & ~u32ModeRemove;
+    if (!g_CrPresenter.fEnabled)
+    {
+        Assert(g_CrPresenter.u32DisplayMode == 0);
+        g_CrPresenter.u32DisabledDisplayMode = u32DisplayMode;
+        return VINF_SUCCESS;
+    }
+
+    g_CrPresenter.u32DisplayMode = u32DisplayMode;
+
+    /* disabled framebuffers may still have displays attached */
+    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstInitialized();
+            hFb;
+            hFb = CrPMgrFbGetNextInitialized(hFb))
+    {
+        crPMgrModeModify(hFb, u32ModeAdd, u32ModeRemove);
+    }
+
+    return VINF_SUCCESS;
+}
+
+int CrPMgrModeVrdp(bool fEnable)
+{
+    uint32_t u32ModeAdd, u32ModeRemove;
+    if (fEnable)
+    {
+        u32ModeAdd = CR_PMGR_MODE_VRDP;
+        u32ModeRemove = 0;
+    }
+    else
+    {
+        u32ModeAdd = 0;
+        u32ModeRemove = CR_PMGR_MODE_VRDP;
+    }
+    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
+}
+
+int CrPMgrModeRootVr(bool fEnable)
+{
+    uint32_t u32ModeAdd, u32ModeRemove;
+    if (fEnable)
+    {
+        u32ModeAdd = CR_PMGR_MODE_ROOTVR;
+        u32ModeRemove = CR_PMGR_MODE_WINDOW;
+    }
+    else
+    {
+        u32ModeAdd = CR_PMGR_MODE_WINDOW;
+        u32ModeRemove = CR_PMGR_MODE_ROOTVR;
+    }
+
+    return crPMgrModeModifyGlobal(u32ModeAdd, u32ModeRemove);
+}
+
+int CrPMgrModeWinVisible(bool fEnable)
+{
+    if (!g_CrPresenter.fWindowsForceHidden == !!fEnable)
+        return VINF_SUCCESS;
+
+    g_CrPresenter.fWindowsForceHidden = !fEnable;
+
+    for (int i = 0; i < cr_server.screenCount; ++i)
+    {
+        CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+
+        if (pDpInfo->pDpWin)
+            pDpInfo->pDpWin->winVisibilityChanged();
+    }
+
+    return VINF_SUCCESS;
+}
+
+int CrPMgrRootVrUpdate()
+{
+    for (HCR_FRAMEBUFFER hFb = CrPMgrFbGetFirstEnabled();
+            hFb;
+            hFb = CrPMgrFbGetNextEnabled(hFb))
+    {
+        if (!CrFbHas3DData(hFb))
+            continue;
+
+        uint32_t idFb = CrFbGetScreenInfo(hFb)->u32ViewIndex;
+        CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+        int rc = CrFbUpdateBegin(hFb);
+        if (RT_SUCCESS(rc))
+        {
+            for (int i = ASMBitFirstSet(pFbInfo->aTargetMap, cr_server.screenCount);
+                    i >= 0;
+                    i = ASMBitNextSet(pFbInfo->aTargetMap, cr_server.screenCount, i))
+            {
+                CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+                Assert(pDpInfo->iFb == (int32_t)idFb);
+
+                pDpInfo->pDpWinRootVr->RegionsChanged(hFb);
+            }
+
+            CrFbUpdateEnd(hFb);
         }
         else
             WARN(("CrFbUpdateBegin failed %d", rc));
@@ -4195,25 +4764,137 @@ void CrPMgrHlpGlblUpdateEnd(CR_FBMAP *pMap)
     }
 }
 
-/*client should notify the manager about the framebuffer resize via this function */
-int CrPMgrNotifyResize(HCR_FRAMEBUFFER hFb)
+int CrPMgrResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM, const uint32_t *pTargetMap)
 {
     int rc = VINF_SUCCESS;
-    if (CrFbIsEnabled(hFb))
+
+    if (pScreen->u32ViewIndex == 0xffffffff)
     {
-        rc = CrPMgrModeModify(hFb, g_CrPresenter.u32DisplayMode, 0);
-        if (!RT_SUCCESS(rc))
+        /* this is just a request to disable targets, search and disable */
+        for (int i = ASMBitFirstSet(pTargetMap, cr_server.screenCount);
+                i >= 0;
+                i = ASMBitNextSet(pTargetMap, cr_server.screenCount, i))
         {
-            WARN(("CrPMgrModeModify failed rc %d", rc));
-            return rc;
+            CR_FBDISPLAY_INFO *pDpInfo = &g_CrPresenter.aDisplayInfos[i];
+            if (pDpInfo->iFb < 0)
+                continue;
+
+            Assert(pDpInfo->iFb < cr_server.screenCount);
+            HCR_FRAMEBUFFER hAssignedFb = CrPMgrFbGet(pDpInfo->iFb);
+
+            rc = crPMgrFbDisconnectTarget(hAssignedFb, (uint32_t)i);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("crPMgrFbDisconnectTarget failed %d", rc));
+                return rc;
+            }
+        }
+
+        return VINF_SUCCESS;
+    }
+
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGet(pScreen->u32ViewIndex);
+    if (!hFb)
+    {
+        WARN(("CrPMgrFbGet failed"));
+        return VERR_INVALID_PARAMETER;
+    }
+
+    const VBVAINFOSCREEN *pFbScreen = CrFbGetScreenInfo(hFb);
+    bool fFbInfoChanged = true;
+
+    if (!memcmp(pFbScreen, pScreen, sizeof (*pScreen)))
+    {
+        if (!pvVRAM || pvVRAM == CrFbGetVRAM(hFb))
+            fFbInfoChanged = false;
+    }
+
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[pScreen->u32ViewIndex];
+
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aRemovedTargetMap);
+    VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aAddedTargetMap);
+
+    bool fDisplaysAdded = false, fDisplaysRemoved = false;
+
+    memcpy(aRemovedTargetMap, pFbInfo->aTargetMap, sizeof (aRemovedTargetMap));
+
+    if (pScreen->u16Flags & VBVA_SCREEN_F_DISABLED)
+    {
+        /* so far there is no need in keeping displays attached to disabled Framebffer,
+         * just disconnect everything */
+        for (int i = 0; i < RT_ELEMENTS(aRemovedTargetMap); ++i)
+        {
+            if (aRemovedTargetMap[i])
+            {
+                fDisplaysRemoved = true;
+                break;
+            }
         }
+
+        memset(aAddedTargetMap, 0, sizeof (aAddedTargetMap));
     }
     else
     {
-        rc = CrPMgrModeModify(hFb, 0, CR_PMGR_MODE_ALL);
+        for (int i = 0; i < RT_ELEMENTS(aRemovedTargetMap); ++i)
+        {
+            aRemovedTargetMap[i] = (aRemovedTargetMap[i] & ~pTargetMap[i]);
+            if (aRemovedTargetMap[i])
+                fDisplaysRemoved = true;
+        }
+
+        memcpy(aAddedTargetMap, pFbInfo->aTargetMap, sizeof (aAddedTargetMap));
+        for (int i = 0; i < RT_ELEMENTS(aAddedTargetMap); ++i)
+        {
+            aAddedTargetMap[i] = (pTargetMap[i] & ~aAddedTargetMap[i]);
+            if (aAddedTargetMap[i])
+                fDisplaysAdded = true;
+        }
+    }
+
+    if (!fFbInfoChanged && !fDisplaysRemoved && !fDisplaysAdded)
+    {
+        crDebug("resize: no changes");
+        return VINF_SUCCESS;
+    }
+
+    if (fDisplaysRemoved)
+    {
+        rc = crPMgrFbDisconnect(hFb, aRemovedTargetMap);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbDisconnect failed %d", rc));
+            return rc;
+        }
+    }
+
+    if (fFbInfoChanged)
+    {
+        rc = CrFbUpdateBegin(hFb);
+        if (!RT_SUCCESS(rc))
+        {
+            WARN(("CrFbUpdateBegin failed %d", rc));
+            return rc;
+        }
+
+        crVBoxServerMuralFbResizeBegin(hFb);
+
+        rc = CrFbResize(hFb, pScreen, pvVRAM);
         if (!RT_SUCCESS(rc))
         {
-            WARN(("CrPMgrModeModify failed rc %d", rc));
+            WARN(("CrFbResize failed %d", rc));
+        }
+
+        crVBoxServerMuralFbResizeEnd(hFb);
+
+        CrFbUpdateEnd(hFb);
+    }
+
+    if (fDisplaysAdded)
+    {
+        rc = crPMgrFbConnect(hFb, aAddedTargetMap);
+        if (RT_FAILURE(rc))
+        {
+            WARN(("crPMgrFbConnect failed %d", rc));
             return rc;
         }
     }
@@ -4300,6 +4981,7 @@ int CrPMgrSaveState(PSSMHANDLE pSSM)
 {
     int rc;
     int cDisplays = 0, i;
+
     for (i = 0; i < cr_server.screenCount; ++i)
     {
         if (CrPMgrFbGetEnabled(i))
@@ -4348,7 +5030,11 @@ int CrPMgrSaveState(PSSMHANDLE pSSM)
             rc = SSMR3PutU16(pSSM, hFb->ScreenInfo.u16Flags);
             AssertRCReturn(rc, rc);
 
-            rc = SSMR3PutU32(pSSM, (uint32_t)(((uintptr_t)hFb->pvVram) - ((uintptr_t)g_pvVRamBase)));
+            rc = SSMR3PutU32(pSSM, hFb->ScreenInfo.u32StartOffset);
+            AssertRCReturn(rc, rc);
+
+            CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[hFb->ScreenInfo.u32ViewIndex];
+            rc = SSMR3PutMem(pSSM, pFbInfo->aTargetMap, sizeof (pFbInfo->aTargetMap));
             AssertRCReturn(rc, rc);
 
             rc = CrFbSaveState(hFb, pSSM);
@@ -4433,7 +5119,6 @@ int CrFbLoadState(CR_FRAMEBUFFER *pFb, PSSMHANDLE pSSM, uint32_t version)
     {
         rc = CrFbEntryLoadState(pFb, pSSM, version);
         AssertRCReturn(rc, rc);
-
     }
 
     CrFbUpdateEnd(pFb);
@@ -4487,18 +5172,15 @@ int CrPMgrLoadState(PSSMHANDLE pSSM, uint32_t version)
         CR_FRAMEBUFFER *pFb = CrPMgrFbGet(iScreen);
         Assert(pFb);
 
-        rc = CrFbUpdateBegin(pFb);
-        if (!RT_SUCCESS(rc))
-        {
-            WARN(("CrFbUpdateBegin failed %d", rc));
-            return rc;
-        }
-
         VBVAINFOSCREEN Screen;
-        void *pvVRAM;
 
         Screen.u32ViewIndex = iScreen;
 
+        VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aTargetMap);
+
+        memset(aTargetMap, 0, sizeof (aTargetMap));
+        ASMBitSet(aTargetMap, iScreen);
+
         if (version < SHCROGL_SSM_VERSION_WITH_FB_INFO)
         {
             memset(&Screen, 0, sizeof (Screen));
@@ -4507,8 +5189,6 @@ int CrPMgrLoadState(PSSMHANDLE pSSM, uint32_t version)
             Screen.u32Height = screen[iScreen].h;
             Screen.u16BitsPerPixel = 4;
             Screen.u16Flags = VBVA_SCREEN_F_ACTIVE;
-
-            pvVRAM = g_pvVRamBase;
         }
         else
         {
@@ -4536,30 +5216,45 @@ int CrPMgrLoadState(PSSMHANDLE pSSM, uint32_t version)
             rc = SSMR3GetU16(pSSM, &Screen.u16Flags);
             AssertRCReturn(rc, rc);
 
-            uint32_t offVram = 0;
-            rc = SSMR3GetU32(pSSM, &offVram);
+            rc = SSMR3GetU32(pSSM, &Screen.u32StartOffset);
             AssertRCReturn(rc, rc);
+            if (Screen.u32StartOffset == 0xffffffff)
+            {
+                WARN(("not expected offVram"));
+                Screen.u32StartOffset = 0;
+            }
 
-            pvVRAM = (void*)(((uintptr_t)g_pvVRamBase) + offVram);
-        }
+            if (version >= SHCROGL_SSM_VERSION_WITH_SCREEN_MAP_REORDERED)
+            {
+                rc = SSMR3GetMem(pSSM, aTargetMap, sizeof (aTargetMap));
+                AssertRCReturn(rc, rc);
+            }
 
-        crVBoxServerMuralFbResizeBegin(pFb);
+            if (version == SHCROGL_SSM_VERSION_WITH_SCREEN_MAP)
+            {
+                VBOXCMDVBVA_SCREENMAP_DECL(uint32_t, aEmptyTargetMap);
 
-        rc = CrFbResize(pFb, &Screen, pvVRAM);
-        if (!RT_SUCCESS(rc))
-        {
-            WARN(("CrFbResize failed %d", rc));
-            return rc;
-        }
+                memset(aEmptyTargetMap, 0, sizeof (aEmptyTargetMap));
 
-        rc = CrFbLoadState(pFb, pSSM, version);
-        AssertRCReturn(rc, rc);
+                rc = CrPMgrResize(&Screen, cr_server.fCrCmdEnabled ? NULL : CrFbGetVRAM(pFb), aEmptyTargetMap);
+                AssertRCReturn(rc, rc);
+
+                rc = CrFbLoadState(pFb, pSSM, version);
+                AssertRCReturn(rc, rc);
 
-        crVBoxServerMuralFbResizeEnd(pFb);
+                rc = SSMR3GetMem(pSSM, aTargetMap, sizeof (aTargetMap));
+                AssertRCReturn(rc, rc);
+            }
+        }
 
-        CrFbUpdateEnd(pFb);
+        rc = CrPMgrResize(&Screen, cr_server.fCrCmdEnabled ? NULL : CrFbGetVRAM(pFb), aTargetMap);
+        AssertRCReturn(rc, rc);
 
-        CrPMgrNotifyResize(pFb);
+        if (version >= SHCROGL_SSM_VERSION_WITH_FB_INFO && version != SHCROGL_SSM_VERSION_WITH_SCREEN_MAP)
+        {
+            rc = CrFbLoadState(pFb, pSSM, version);
+            AssertRCReturn(rc, rc);
+        }
     }
 
     return VINF_SUCCESS;
@@ -4569,14 +5264,14 @@ int CrPMgrLoadState(PSSMHANDLE pSSM, uint32_t version)
 void SERVER_DISPATCH_APIENTRY
 crServerDispatchVBoxTexPresent(GLuint texture, GLuint cfg, GLint xPos, GLint yPos, GLint cRects, const GLint *pRects)
 {
-    uint32_t idScreen = CR_PRESENT_GET_SCREEN(cfg);
-    if (idScreen >= CR_MAX_GUEST_MONITORS)
+    uint32_t idFb = CR_PRESENT_GET_SCREEN(cfg);
+    if (idFb >= CR_MAX_GUEST_MONITORS)
     {
         WARN(("Invalid guest screen"));
         return;
     }
 
-    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(idScreen);
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(idFb);
     if (!hFb)
     {
         WARN(("request to present on disabled framebuffer, ignore"));
@@ -4647,141 +5342,755 @@ DECLINLINE(void) crVBoxPRectUnpacks(const VBOXCMDVBVA_RECT *paVbvaRects, RTRECT
     }
 }
 
-int32_t crVBoxServerCrCmdBltProcess(PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
+static RTRECT * crVBoxServerCrCmdBltRecsUnpack(const VBOXCMDVBVA_RECT *pPRects, uint32_t cRects)
 {
-    uint8_t u8Flags = pCmd->u8Flags;
-    if (u8Flags & (VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY | VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY))
+    if (g_CrPresenter.cbTmpBuf < cRects * sizeof (RTRECT))
     {
-        VBOXCMDVBVA_BLT_PRIMARY *pBlt = (VBOXCMDVBVA_BLT_PRIMARY*)pCmd;
-        uint8_t u8PrimaryID = pBlt->Hdr.u.u8PrimaryID;
-        HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u8PrimaryID);
-        if (!hFb)
+        if (g_CrPresenter.pvTmpBuf)
+            RTMemFree(g_CrPresenter.pvTmpBuf);
+
+        g_CrPresenter.cbTmpBuf = (cRects + 10) * sizeof (RTRECT);
+        g_CrPresenter.pvTmpBuf = RTMemAlloc(g_CrPresenter.cbTmpBuf);
+        if (!g_CrPresenter.pvTmpBuf)
         {
-            WARN(("request to present on disabled framebuffer, ignore"));
-            pCmd->u.i8Result = -1;
-            return VINF_SUCCESS;
+            WARN(("RTMemAlloc failed!"));
+            g_CrPresenter.cbTmpBuf = 0;
+            return NULL;
         }
+    }
+
+    RTRECT *pRects = (RTRECT *)g_CrPresenter.pvTmpBuf;
+    crVBoxPRectUnpacks(pPRects, pRects, cRects);
+
+    return pRects;
+}
+
+static void crPMgrPrimaryUpdateScreen(HCR_FRAMEBUFFER hFb, uint32_t idScreen, uint32_t cRects, const RTRECT *pRects)
+{
+    const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+
+    bool fDirtyEmpty = true;
+    RTRECT dirtyRect;
+    cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr, idScreen);
 
-        const VBOXCMDVBVA_RECT *pPRects = pBlt->aRects;
-        uint32_t cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects)) / sizeof (VBOXCMDVBVA_RECT);
-        RTRECT *pRects;
-        if (g_CrPresenter.cbTmpBuf < cRects * sizeof (RTRECT))
+    VBVACMDHDR hdr;
+    for (uint32_t i = 0; i < cRects; ++i)
+    {
+        hdr.x = pRects[i].xLeft;
+        hdr.y = pRects[i].yTop;
+        hdr.w = hdr.x + pRects[i].xRight;
+        hdr.h = hdr.y + pRects[i].yBottom;
+
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateProcess(cr_server.CrCmdClientInfo.hCltScr, idScreen, &hdr, sizeof (hdr));
+
+        if (fDirtyEmpty)
+        {
+            /* This is the first rectangle to be added. */
+            dirtyRect.xLeft   = pRects[i].xLeft;
+            dirtyRect.yTop    = pRects[i].yTop;
+            dirtyRect.xRight  = pRects[i].xRight;
+            dirtyRect.yBottom = pRects[i].yBottom;
+            fDirtyEmpty       = false;
+        }
+        else
         {
-            if (g_CrPresenter.pvTmpBuf)
-                RTMemFree(g_CrPresenter.pvTmpBuf);
+            /* Adjust region coordinates. */
+            if (dirtyRect.xLeft > pRects[i].xLeft)
+            {
+                dirtyRect.xLeft = pRects[i].xLeft;
+            }
 
-            g_CrPresenter.cbTmpBuf = (cRects + 10) * sizeof (RTRECT);
-            g_CrPresenter.pvTmpBuf = RTMemAlloc(g_CrPresenter.cbTmpBuf);
-            if (!g_CrPresenter.pvTmpBuf)
+            if (dirtyRect.yTop > pRects[i].yTop)
             {
-                WARN(("RTMemAlloc failed!"));
-                g_CrPresenter.cbTmpBuf = 0;
-                pCmd->u.i8Result = -1;
-                return VINF_SUCCESS;
+                dirtyRect.yTop = pRects[i].yTop;
+            }
+
+            if (dirtyRect.xRight < pRects[i].xRight)
+            {
+                dirtyRect.xRight = pRects[i].xRight;
+            }
+
+            if (dirtyRect.yBottom < pRects[i].yBottom)
+            {
+                dirtyRect.yBottom = pRects[i].yBottom;
             }
         }
+    }
 
-        pRects = (RTRECT *)g_CrPresenter.pvTmpBuf;
+    if (dirtyRect.xRight - dirtyRect.xLeft)
+    {
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, idScreen, pScreen->i32OriginX + dirtyRect.xLeft, pScreen->i32OriginY + dirtyRect.yTop,
+                                           dirtyRect.xRight - dirtyRect.xLeft, dirtyRect.yBottom - dirtyRect.yTop);
+    }
+    else
+    {
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, idScreen, 0, 0, 0, 0);
+    }
 
-        crVBoxPRectUnpacks(pPRects, pRects, cRects);
+}
 
-        Assert(!((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects)) % sizeof (VBOXCMDVBVA_RECT)));
+static void crPMgrPrimaryUpdate(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects)
+{
+    if (!cRects)
+        return;
+
+    const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+
+    uint32_t idFb = pScreen->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+
+    for (int i = ASMBitFirstSet(pFbInfo->aTargetMap, cr_server.screenCount);
+            i >= 0;
+            i = ASMBitNextSet(pFbInfo->aTargetMap, cr_server.screenCount, i))
+    {
+        crPMgrPrimaryUpdateScreen(hFb, i, cRects, pRects);
+    }
+}
 
-        if (u8Flags & VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY)
+static int8_t crVBoxServerCrCmdBltPrimaryVramGenericProcess(uint32_t u32PrimaryID, VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects, bool fToPrimary)
+{
+    CR_BLITTER_IMG Img;
+    int8_t i8Result = crFbImgFromDimOffVramBGRA(offVRAM, width, height, &Img);
+    if (i8Result)
+    {
+        WARN(("invalid param"));
+        return -1;
+    }
+
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u32PrimaryID);
+    if (!hFb)
+    {
+        WARN(("request to present on disabled framebuffer"));
+        return -1;
+    }
+
+    if (!fToPrimary)
+    {
+        int rc = CrFbBltGetContents(hFb, pPos, cRects, pRects, &Img);
+        if (!RT_SUCCESS(rc))
         {
-            if (!(u8Flags & VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY))
+            WARN(("CrFbBltGetContents failed %d", rc));
+            return -1;
+        }
+
+        return 0;
+    }
+
+    int rc = CrFbBltPutContentsNe(hFb, pPos, cRects, pRects, &Img);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrFbBltPutContentsNe failed %d", rc));
+        return -1;
+    }
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdBltPrimaryProcess(const VBOXCMDVBVA_BLT_PRIMARY *pCmd, uint32_t cbCmd)
+{
+    uint32_t u32PrimaryID = (uint32_t)pCmd->Hdr.Hdr.u.u8PrimaryID;
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u32PrimaryID);
+    if (!hFb)
+    {
+        WARN(("request to present on disabled framebuffer, ignore"));
+        return 0;
+    }
+
+    uint32_t cRects;
+    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
+    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects)) % sizeof (VBOXCMDVBVA_RECT))
+    {
+        WARN(("invalid argument size"));
+        return -1;
+    }
+
+    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects)) / sizeof (VBOXCMDVBVA_RECT);
+
+    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+    if (!pRects)
+    {
+        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
+        return -1;
+    }
+
+    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
+
+    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID)
+    {
+        uint32_t texId = pCmd->alloc.u.id;
+        if (!texId)
+        {
+            WARN(("texId is NULL!\n"));
+            return -1;
+        }
+
+        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+        {
+            WARN(("blit from primary to texture not implemented"));
+            return -1;
+        }
+
+        crServerDispatchVBoxTexPresent(texId, u32PrimaryID, pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y, cRects, (const GLint*)pRects);
+
+        return 0;
+    }
+    else
+    {
+        const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+        uint32_t width = pScreen->u32Width, height = pScreen->u32Height;
+        VBOXCMDVBVAOFFSET offVRAM = pCmd->alloc.u.offVRAM;
+
+        bool fToPrymary = !(u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2);
+        RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
+        int8_t i8Result = crVBoxServerCrCmdBltPrimaryVramGenericProcess(u32PrimaryID, offVRAM, width, height, &Pos, cRects, pRects, fToPrymary);
+        if (i8Result < 0)
+        {
+            WARN(("crVBoxServerCrCmdBltPrimaryVramGenericProcess failed"));
+            return i8Result;
+        }
+
+        if (!fToPrymary)
+            return 0;
+    }
+
+    crPMgrPrimaryUpdate(hFb, cRects, pRects);
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdBltIdToVramMem(uint32_t hostId, VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects)
+{
+    CR_TEXDATA* pTex = CrFbTexDataAcquire(hostId);
+    if (!pTex)
+    {
+        WARN(("pTex failed for %d", hostId));
+        return -1;
+    }
+
+    const VBOXVR_TEXTURE *pVrTex = CrTdTexGet(pTex);
+    if (!width)
+    {
+        width = pVrTex->width;
+        height = pVrTex->height;
+    }
+
+    CR_BLITTER_IMG Img;
+    int8_t i8Result = crFbImgFromDimOffVramBGRA(offVRAM, width, height, &Img);
+    if (i8Result)
+    {
+        WARN(("invalid param"));
+        return -1;
+    }
+
+    int rc = CrTdBltEnter(pTex);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrTdBltEnter failed %d", rc));
+        return -1;
+    }
+
+    rc = crFbTexDataGetContents(pTex, pPos, cRects, pRects, &Img);
+
+    CrTdBltLeave(pTex);
+
+    CrTdRelease(pTex);
+
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("crFbTexDataGetContents failed %d", rc));
+        return -1;
+    }
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdBltIdToVram(uint32_t hostId, VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects)
+{
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabledByVramStart(offVRAM);
+    if (hFb)
+    {
+        const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+        Assert(!width || pScreen->u32Width == width);
+        Assert(!height || pScreen->u32Height == height);
+
+        crServerDispatchVBoxTexPresent(hostId, pScreen->u32ViewIndex, pPos->x, pPos->y, cRects, (const GLint*)pRects);
+        return 0;
+    }
+
+    return crVBoxServerCrCmdBltIdToVramMem(hostId, offVRAM, width, height, pPos, cRects, pRects);
+}
+
+static int8_t crVBoxServerCrCmdBltVramToVramMem(VBOXCMDVBVAOFFSET offSrcVRAM, uint32_t srcWidth, uint32_t srcHeight, VBOXCMDVBVAOFFSET offDstVRAM, uint32_t dstWidth, uint32_t dstHeight, const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects)
+{
+    CR_BLITTER_IMG srcImg, dstImg;
+    int8_t i8Result = crFbImgFromDimOffVramBGRA(offSrcVRAM, srcWidth, srcHeight, &srcImg);
+    if (i8Result)
+    {
+        WARN(("invalid param"));
+        return -1;
+    }
+
+    i8Result = crFbImgFromDimOffVramBGRA(offDstVRAM, dstWidth, dstHeight, &dstImg);
+    if (i8Result)
+    {
+        WARN(("invalid param"));
+        return -1;
+    }
+
+    CrMBltImg(&srcImg, pPos, cRects, pRects, &dstImg);
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdBltVramToVram(VBOXCMDVBVAOFFSET offSrcVRAM, uint32_t srcWidth, uint32_t srcHeight,
+        VBOXCMDVBVAOFFSET offDstVRAM, uint32_t dstWidth, uint32_t dstHeight,
+        const RTPOINT *pPos, uint32_t cRects, const RTRECT *pRects)
+{
+    HCR_FRAMEBUFFER hSrcFb = CrPMgrFbGetEnabledByVramStart(offSrcVRAM);
+    HCR_FRAMEBUFFER hDstFb = CrPMgrFbGetEnabledByVramStart(offDstVRAM);
+
+    if (hDstFb)
+    {
+        if (hSrcFb)
+        {
+            LOG(("blit from one framebuffer, wow"));
+
+            int rc = CrFbUpdateBegin(hSrcFb);
+            if (RT_SUCCESS(rc))
             {
-                /* blit to primary from non-primary */
-                uint32_t texId;
-                if (u8Flags & VBOXCMDVBVA_OPF_ALLOC_DSTID)
-                {
-                    /* TexPresent */
-                    texId = pBlt->alloc.u.id;
-                }
-                else
-                {
-                    VBOXCMDVBVAOFFSET offVRAM = pBlt->alloc.u.offVRAM;
-                    const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
-                    uint32_t cbScreen = pScreen->u32LineSize * pScreen->u32Height;
-                    if (offVRAM >= g_cbVRam
-                            || offVRAM + cbScreen >= g_cbVRam)
-                    {
-                        WARN(("invalid param"));
-                        pCmd->u.i8Result = -1;
-                        return VINF_SUCCESS;
-                    }
+                CrFbRegionsClear(hSrcFb);
 
-                    uint8_t *pu8Buf = g_pvVRamBase + offVRAM;
-                    texId = 0;
-//                    cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr);
-                    /*todo: notify VGA device to perform updates */
-                }
+                CrFbUpdateEnd(hSrcFb);
+            }
+            else
+                WARN(("CrFbUpdateBegin failed %d", rc));
+        }
+
+        CR_BLITTER_IMG Img;
+        int8_t i8Result = crFbImgFromDimOffVramBGRA(offSrcVRAM, srcWidth, srcHeight, &Img);
+        if (i8Result)
+        {
+            WARN(("invalid param"));
+            return -1;
+        }
 
-                crServerDispatchVBoxTexPresent(texId, u8PrimaryID, pBlt->Pos.x, pBlt->Pos.y, cRects, (const GLint*)pRects);
+        const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hDstFb);
+        if (pScreen->u32Width == dstWidth && pScreen->u32Height == dstHeight)
+        {
+            int rc = CrFbBltPutContentsNe(hDstFb, pPos, cRects, pRects, &Img);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("CrFbBltPutContentsNe failed %d", rc));
+                return -1;
+            }
+        }
+        else
+        {
+            int rc = CrFbUpdateBegin(hDstFb);
+            if (RT_SUCCESS(rc))
+            {
+                CrFbRegionsClear(hDstFb);
+
+                CrFbUpdateEnd(hDstFb);
             }
             else
+                WARN(("CrFbUpdateBegin failed %d", rc));
+
+            rc = crVBoxServerCrCmdBltVramToVramMem(offSrcVRAM, srcWidth, srcHeight, offDstVRAM, dstWidth, dstHeight, pPos, cRects, pRects);
+            if (RT_FAILURE(rc))
             {
-                /* blit from one primary to another primary, wow */
-                WARN(("not implemented"));
-                pCmd->u.i8Result = -1;
-                return VINF_SUCCESS;
+                WARN(("crVBoxServerCrCmdBltVramToVramMem failed, %d", rc));
+                return -1;
+            }
+        }
+
+        crPMgrPrimaryUpdate(hDstFb, cRects, pRects);
+
+        return 0;
+    }
+    else if (hSrcFb)
+    {
+        CR_BLITTER_IMG Img;
+        int8_t i8Result = crFbImgFromDimOffVramBGRA(offDstVRAM, dstWidth, dstHeight, &Img);
+        if (i8Result)
+        {
+            WARN(("invalid param"));
+            return -1;
+        }
+
+        const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hSrcFb);
+        if (pScreen->u32Width == srcWidth && pScreen->u32Height == srcHeight)
+        {
+            int rc = CrFbBltGetContents(hSrcFb, pPos, cRects, pRects, &Img);
+            if (RT_FAILURE(rc))
+            {
+                WARN(("CrFbBltGetContents failed %d", rc));
+                return -1;
             }
         }
         else
         {
-            Assert(u8Flags & VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY);
-            /* blit from primary to non-primary */
-            if (u8Flags & VBOXCMDVBVA_OPF_ALLOC_DSTID)
+            int rc = CrFbUpdateBegin(hSrcFb);
+            if (RT_SUCCESS(rc))
             {
-                uint32_t texId = pBlt->alloc.u.id;
-                WARN(("not implemented"));
-                pCmd->u.i8Result = -1;
-                return VINF_SUCCESS;
+                CrFbRegionsClear(hSrcFb);
+
+                CrFbUpdateEnd(hSrcFb);
             }
             else
+                WARN(("CrFbUpdateBegin failed %d", rc));
+
+            rc = crVBoxServerCrCmdBltVramToVramMem(offSrcVRAM, srcWidth, srcHeight, offDstVRAM, dstWidth, dstHeight, pPos, cRects, pRects);
+            if (RT_FAILURE(rc))
             {
-                VBOXCMDVBVAOFFSET offVRAM = pBlt->alloc.u.offVRAM;
-                const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
-                uint32_t cbScreen = pScreen->u32LineSize * pScreen->u32Height;
-                if (offVRAM >= g_cbVRam
-                        || offVRAM + cbScreen >= g_cbVRam)
-                {
-                    WARN(("invalid param"));
-                    pCmd->u.i8Result = -1;
-                    return VINF_SUCCESS;
-                }
+                WARN(("crVBoxServerCrCmdBltVramToVramMem failed, %d", rc));
+                return -1;
+            }
+        }
 
-                uint8_t *pu8Buf = g_pvVRamBase + offVRAM;
-
-                RTRECT SrcRect;
-                SrcRect.xLeft = 0;
-                SrcRect.yTop = 0;
-                SrcRect.xRight = pScreen->u32Width;
-                SrcRect.yBottom = pScreen->u32Height;
-                RTRECT DstRect;
-                DstRect.xLeft = pBlt->Pos.x;
-                DstRect.yTop = pBlt->Pos.y;
-                DstRect.xRight = DstRect.xLeft + pScreen->u32Width;
-                DstRect.yBottom = DstRect.yTop + pScreen->u32Height;
-                CR_BLITTER_IMG Img;
-                crFbImgFromScreenVram(pScreen, pu8Buf, &Img);
-                int rc = CrFbBltGetContents(hFb, &SrcRect, &DstRect, cRects, pRects, &Img);
-                if (!RT_SUCCESS(rc))
-                {
-                    WARN(("CrFbBltGetContents failed %d", rc));
-                    pCmd->u.i8Result = -1;
-                    return VINF_SUCCESS;
-                }
+        return 0;
+    }
+
+    return crVBoxServerCrCmdBltVramToVramMem(offSrcVRAM, srcWidth, srcHeight, offDstVRAM, dstWidth, dstHeight, pPos, cRects, pRects);
+}
+
+
+static int8_t crVBoxServerCrCmdBltOffIdProcess(const VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID *pCmd, uint32_t cbCmd)
+{
+    uint32_t cRects;
+    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
+    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects)) % sizeof (VBOXCMDVBVA_RECT))
+    {
+        WARN(("invalid argument size"));
+        return -1;
+    }
+
+    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects)) / sizeof (VBOXCMDVBVA_RECT);
+
+    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+    if (!pRects)
+    {
+        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
+        return -1;
+    }
+
+    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
+    uint32_t hostId = pCmd->id;
+
+    Assert(u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID);
+
+    if (!hostId)
+    {
+        WARN(("zero host id"));
+        return -1;
+    }
+
+    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+    {
+        WARN(("blit from texture to texture not implemented"));
+        return -1;
+    }
+
+    if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+    {
+        WARN(("blit to texture not implemented"));
+        return -1;
+    }
+
+    VBOXCMDVBVAOFFSET offVRAM = pCmd->alloc.u.offVRAM;
+
+    RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
+    return crVBoxServerCrCmdBltIdToVram(hostId, offVRAM, 0, 0, &Pos, cRects, pRects);
+}
+
+static int8_t crVBoxServerCrCmdBltSameDimOrId(const VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8 *pCmd, uint32_t cbCmd)
+{
+    uint32_t cRects;
+    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
+    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8, aRects)) % sizeof (VBOXCMDVBVA_RECT))
+    {
+        WARN(("invalid argument size"));
+        return -1;
+    }
+
+    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8, aRects)) / sizeof (VBOXCMDVBVA_RECT);
+
+    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+    if (!pRects)
+    {
+        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
+        return -1;
+    }
+
+    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
+    VBOXCMDVBVAOFFSET offVRAM = pCmd->alloc1.Info.u.offVRAM;
+    uint32_t width = pCmd->alloc1.u16Width;
+    uint32_t height = pCmd->alloc1.u16Height;
+    RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
+
+    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID)
+    {
+        uint32_t hostId = pCmd->info2.u.id;
+
+        if (!hostId)
+        {
+            WARN(("zero host id"));
+            return -1;
+        }
+
+        if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+        {
+            WARN(("blit from texture to texture not implemented"));
+            return -1;
+        }
+
+        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+        {
+            WARN(("blit to texture not implemented"));
+            return -1;
+        }
+
+        return crVBoxServerCrCmdBltIdToVram(hostId, offVRAM, width, height, &Pos, cRects, pRects);
+    }
+
+    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+    {
+        if (!(u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2))
+        {
+            WARN(("blit to texture not implemented"));
+            return -1;
+        }
+
+        return crVBoxServerCrCmdBltIdToVram(pCmd->alloc1.Info.u.id, pCmd->info2.u.offVRAM, width, height, &Pos, cRects, pRects);
+    }
+
+    if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+        crVBoxServerCrCmdBltVramToVram(offVRAM, width, height, pCmd->info2.u.offVRAM, width, height, &Pos, cRects, pRects);
+    else
+        crVBoxServerCrCmdBltVramToVram(pCmd->info2.u.offVRAM, width, height, offVRAM, width, height, &Pos, cRects, pRects);
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdBltGenericBGRAProcess(const VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8 *pCmd, uint32_t cbCmd)
+{
+    uint32_t cRects;
+    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
+    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8, aRects)) % sizeof (VBOXCMDVBVA_RECT))
+    {
+        WARN(("invalid argument size"));
+        return -1;
+    }
+
+    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8, aRects)) / sizeof (VBOXCMDVBVA_RECT);
+
+    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+    if (!pRects)
+    {
+        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
+        return -1;
+    }
+
+    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
+    RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
+
+    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID)
+    {
+        if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+        {
+            WARN(("blit from texture to texture not implemented"));
+            return -1;
+        }
+
+        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+        {
+            WARN(("blit to texture not implemented"));
+            return -1;
+        }
+
+        return crVBoxServerCrCmdBltIdToVram(pCmd->alloc2.Info.u.id, pCmd->alloc1.Info.u.offVRAM, pCmd->alloc1.u16Width, pCmd->alloc1.u16Height, &Pos, cRects, pRects);
+    }
+    else
+    {
+        if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+        {
+            if (!(u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2))
+            {
+                WARN(("blit to texture not implemented"));
+                return -1;
             }
+
+            RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
+            return crVBoxServerCrCmdBltIdToVram(pCmd->alloc1.Info.u.id, pCmd->alloc2.Info.u.offVRAM, pCmd->alloc2.u16Width, pCmd->alloc2.u16Height, &Pos, cRects, pRects);
+        }
+
+        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
+            crVBoxServerCrCmdBltVramToVram(pCmd->alloc1.Info.u.offVRAM, pCmd->alloc1.u16Width, pCmd->alloc1.u16Height, pCmd->alloc2.Info.u.offVRAM, pCmd->alloc2.u16Width, pCmd->alloc2.u16Height, &Pos, cRects, pRects);
+        else
+            crVBoxServerCrCmdBltVramToVram(pCmd->alloc2.Info.u.offVRAM, pCmd->alloc2.u16Width, pCmd->alloc2.u16Height, pCmd->alloc1.Info.u.offVRAM, pCmd->alloc1.u16Width, pCmd->alloc1.u16Height, &Pos, cRects, pRects);
+
+        return 0;
+    }
+}
+
+static int8_t crVBoxServerCrCmdClrFillPrimaryGenericProcess(uint32_t u32PrimaryID, const RTRECT *pRects, uint32_t cRects, uint32_t u32Color)
+{
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u32PrimaryID);
+    if (!hFb)
+    {
+        WARN(("request to present on disabled framebuffer, ignore"));
+        return 0;
+    }
+
+    int rc = CrFbClrFillNe(hFb, cRects, pRects, u32Color);
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("CrFbClrFillNe failed %d", rc));
+        return -1;
+    }
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdClrFillVramGenericProcess(VBOXCMDVBVAOFFSET offVRAM, uint32_t width, uint32_t height, const RTRECT *pRects, uint32_t cRects, uint32_t u32Color)
+{
+    CR_BLITTER_IMG Img;
+    int8_t i8Result = crFbImgFromDimOffVramBGRA(offVRAM, width, height, &Img);
+    if (i8Result)
+    {
+        WARN(("invalid param"));
+        return -1;
+    }
+
+    CrMClrFillImg(&Img, cRects, pRects, u32Color);
+
+    return 0;
+}
+
+static int8_t crVBoxServerCrCmdClrFillGenericBGRAProcess(const VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8 *pCmd, uint32_t cbCmd)
+{
+    uint32_t cRects;
+    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
+    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8, aRects)) % sizeof (VBOXCMDVBVA_RECT))
+    {
+        WARN(("invalid argument size"));
+        return -1;
+    }
+
+    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8, aRects)) / sizeof (VBOXCMDVBVA_RECT);
+
+    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+    if (!pRects)
+    {
+        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
+        return -1;
+    }
+
+//    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
+    int8_t i8Result = crVBoxServerCrCmdClrFillVramGenericProcess(pCmd->dst.Info.u.offVRAM, pCmd->dst.u16Width, pCmd->dst.u16Height, pRects, cRects, pCmd->Hdr.u32Color);
+    if (i8Result < 0)
+    {
+        WARN(("crVBoxServerCrCmdClrFillVramGenericProcess failed"));
+        return i8Result;
+    }
+
+    return 0;
+}
+
+int8_t crVBoxServerCrCmdClrFillProcess(const VBOXCMDVBVA_CLRFILL_HDR *pCmd, uint32_t cbCmd)
+{
+    uint8_t u8Flags = pCmd->Hdr.u8Flags;
+    uint8_t u8Cmd = (VBOXCMDVBVA_OPF_CLRFILL_TYPE_MASK & u8Flags);
+
+    switch (u8Cmd)
+    {
+        case VBOXCMDVBVA_OPF_CLRFILL_TYPE_GENERIC_A8R8G8B8:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8))
+            {
+                WARN(("VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8: invalid command size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdClrFillGenericBGRAProcess((const VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8*)pCmd, cbCmd);
+        }
+        default:
+            WARN(("unsupported command"));
+            return -1;
+    }
+
+}
+
+int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_BLT_HDR *pCmd, uint32_t cbCmd)
+{
+    uint8_t u8Flags = pCmd->Hdr.u8Flags;
+    uint8_t u8Cmd = (VBOXCMDVBVA_OPF_BLT_TYPE_MASK & u8Flags);
+
+    switch (u8Cmd)
+    {
+        case VBOXCMDVBVA_OPF_BLT_TYPE_SAMEDIM_A8R8G8B8:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8))
+            {
+                WARN(("VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8: invalid command size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdBltSameDimOrId((const VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8 *)pCmd, cbCmd);
+        }
+        case VBOXCMDVBVA_OPF_BLT_TYPE_OFFPRIMSZFMT_OR_ID:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID))
+            {
+                WARN(("VBOXCMDVBVA_OPF_BLT_TYPE_OFFPRIMSZFMT_OR_ID: invalid command size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdBltOffIdProcess((const VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID *)pCmd, cbCmd);
+        }
+        case VBOXCMDVBVA_OPF_BLT_TYPE_GENERIC_A8R8G8B8:
+        {
+            if (cbCmd < sizeof (VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8))
+            {
+                WARN(("VBOXCMDVBVA_OPF_BLT_TYPE_GENERIC_A8R8G8B8: invalid command size"));
+                return -1;
+            }
+
+            return crVBoxServerCrCmdBltGenericBGRAProcess((const VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8 *)pCmd, cbCmd);
+        }
+        default:
+            WARN(("unsupported command"));
+            return -1;
+    }
+}
+
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip)
+{
+    uint32_t hostId;
+    if (pFlip->Hdr.u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
+    {
+        hostId = pFlip->src.u.id;
+        if (!hostId)
+        {
+            WARN(("hostId is NULL"));
+            return -1;
         }
     }
     else
     {
-        WARN(("not implemented"));
-        pCmd->u.i8Result = -1;
-        return VINF_SUCCESS;
+        WARN(("VBOXCMDVBVA_OPF_ALLOC_SRCID not specified"));
+        hostId = 0;
     }
 
-    pCmd->u.i8Result = 0;
-    return VINF_SUCCESS;
+    uint32_t idFb = pFlip->Hdr.u.u8PrimaryID;
+    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(idFb);
+    if (!hFb)
+    {
+        WARN(("request to present on disabled framebuffer, ignore"));
+        return 0;
+    }
+
+    const RTRECT *pRect = CrVrScrCompositorRectGet(&hFb->Compositor);
+    crServerDispatchVBoxTexPresent(hostId, idFb, 0, 0, 1, (const GLint*)pRect);
+    return 0;
 }
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c
index 2967079..eaf1879 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_stream.c
@@ -415,13 +415,172 @@ getNextClient(GLboolean block)
     /* return NULL; */
 }
 
+typedef struct CR_SERVER_PENDING_MSG
+{
+    RTLISTNODE Node;
+    uint32_t cbMsg;
+    CRMessage Msg;
+} CR_SERVER_PENDING_MSG;
+
+static int crServerPendMsg(CRConnection *conn, const CRMessage *msg, int cbMsg)
+{
+    CR_SERVER_PENDING_MSG *pMsg;
+
+    if (!cbMsg)
+    {
+        WARN(("cbMsg is null!"));
+        return VERR_INVALID_PARAMETER;
+    }
+
+    pMsg = (CR_SERVER_PENDING_MSG*)RTMemAlloc(cbMsg + RT_OFFSETOF(CR_SERVER_PENDING_MSG, Msg));
+    if (!pMsg)
+    {
+        WARN(("RTMemAlloc failed"));
+        return VERR_NO_MEMORY;
+    }
+
+    pMsg->cbMsg = cbMsg;
+
+    memcpy(&pMsg->Msg, msg, cbMsg);
+
+    RTListAppend(&conn->PendingMsgList, &pMsg->Node);
+
+    return VINF_SUCCESS;
+}
+
+int crServerPendSaveState(PSSMHANDLE pSSM)
+{
+    int i, rc;
+
+    for (i = 0; i < cr_server.numClients; i++)
+    {
+        CR_SERVER_PENDING_MSG *pIter;
+        CRClient *pClient = cr_server.clients[i];
+        CRConnection *pConn;
+        if (!pClient || !pClient->conn)
+        {
+            WARN(("invalid client state"));
+            continue;
+        }
+
+        pConn = pClient->conn;
+
+        if (RTListIsEmpty(&pConn->PendingMsgList))
+            continue;
+
+        CRASSERT(pConn->u32ClientID);
+
+        rc = SSMR3PutU32(pSSM, pConn->u32ClientID);
+        AssertRCReturn(rc, rc);
+
+        RTListForEach(&pConn->PendingMsgList, pIter, CR_SERVER_PENDING_MSG, Node)
+        {
+            CRASSERT(pIter->cbMsg);
+
+            rc = SSMR3PutU32(pSSM, pIter->cbMsg);
+            AssertRCReturn(rc, rc);
+
+            rc = SSMR3PutMem(pSSM, &pIter->Msg, pIter->cbMsg);
+            AssertRCReturn(rc, rc);
+        }
+
+        rc = SSMR3PutU32(pSSM, 0);
+        AssertRCReturn(rc, rc);
+    }
+
+    rc = SSMR3PutU32(pSSM, 0);
+    AssertRCReturn(rc, rc);
+
+    return VINF_SUCCESS;
+}
+
+int crServerPendLoadState(PSSMHANDLE pSSM, uint32_t u32Version)
+{
+    int rc;
+    uint32_t u32;
+    CRClient *pClient;
+
+    if (u32Version < SHCROGL_SSM_VERSION_WITH_PEND_CMD_INFO)
+        return VINF_SUCCESS;
+
+    rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+
+    if (!u32)
+        return VINF_SUCCESS;
+
+    do {
+        rc = crVBoxServerClientGet(u32, &pClient);
+        AssertRCReturn(rc, rc);
+
+        for(;;)
+        {
+            CR_SERVER_PENDING_MSG *pMsg;
+
+            rc = SSMR3GetU32(pSSM, &u32);
+            AssertRCReturn(rc, rc);
+
+            if (!u32)
+                break;
+
+            pMsg = (CR_SERVER_PENDING_MSG*)RTMemAlloc(u32 + RT_OFFSETOF(CR_SERVER_PENDING_MSG, Msg));
+            if (!pMsg)
+            {
+                WARN(("RTMemAlloc failed"));
+                return VERR_NO_MEMORY;
+            }
+
+            pMsg->cbMsg = u32;
+            rc = SSMR3GetMem(pSSM, &pMsg->Msg, u32);
+            AssertRCReturn(rc, rc);
+
+            RTListAppend(&pClient->conn->PendingMsgList, &pMsg->Node);
+        }
+
+        rc = SSMR3GetU32(pSSM, &u32);
+        AssertRCReturn(rc, rc);
+    } while (u32);
+
+    rc = SSMR3GetU32(pSSM, &u32);
+    AssertRCReturn(rc, rc);
+
+    return VINF_SUCCESS;
+}
+
+static void crServerPendProcess(CRConnection *conn)
+{
+    CR_SERVER_PENDING_MSG *pIter, *pNext;
+    RTListForEachSafe(&conn->PendingMsgList, pIter, pNext, CR_SERVER_PENDING_MSG, Node)
+    {
+        CRMessage *msg = &pIter->Msg;
+        const CRMessageOpcodes *msg_opcodes;
+        int opcodeBytes;
+        const char *data_ptr;
+
+        RTListNodeRemove(&pIter->Node);
+
+        CRASSERT(msg->header.type == CR_MESSAGE_OPCODES);
+
+        msg_opcodes = (const CRMessageOpcodes *) msg;
+        opcodeBytes = (msg_opcodes->numOpcodes + 3) & ~0x03;
+
+        data_ptr = (const char *) msg_opcodes + sizeof (CRMessageOpcodes) + opcodeBytes;
+
+        crUnpack(data_ptr,                 /* first command's operands */
+                 data_ptr - 1,             /* first command's opcode */
+                 msg_opcodes->numOpcodes,  /* how many opcodes */
+                 &(cr_server.dispatch));   /* the CR dispatch table */
+
+        RTMemFree(pIter);
+    }
+}
 
 /**
  * This function takes the given message (which should be a buffer of
  * rendering commands) and executes it.
  */
 static void
-crServerDispatchMessage(CRConnection *conn, CRMessage *msg)
+crServerDispatchMessage(CRConnection *conn, CRMessage *msg, int cbMsg)
 {
     const CRMessageOpcodes *msg_opcodes;
     int opcodeBytes;
@@ -429,6 +588,8 @@ crServerDispatchMessage(CRConnection *conn, CRMessage *msg)
 #ifdef VBOX_WITH_CRHGSMI
     PCRVBOXHGSMI_CMDDATA pCmdData = NULL;
 #endif
+    CR_UNPACK_BUFFER_TYPE enmType;
+    bool fUnpack = true;
 
     if (msg->header.type == CR_MESSAGE_REDIR_PTR)
     {
@@ -449,10 +610,64 @@ crServerDispatchMessage(CRConnection *conn, CRMessage *msg)
 #endif
 
     data_ptr = (const char *) msg_opcodes + sizeof(CRMessageOpcodes) + opcodeBytes;
-    crUnpack(data_ptr,                 /* first command's operands */
-             data_ptr - 1,             /* first command's opcode */
-             msg_opcodes->numOpcodes,  /* how many opcodes */
-             &(cr_server.dispatch));   /* the CR dispatch table */
+
+    enmType = crUnpackGetBufferType(data_ptr - 1,             /* first command's opcode */
+                msg_opcodes->numOpcodes  /* how many opcodes */);
+    switch (enmType)
+    {
+        case CR_UNPACK_BUFFER_TYPE_GENERIC:
+        {
+            if (RTListIsEmpty(&conn->PendingMsgList))
+                break;
+
+            if (RT_SUCCESS(crServerPendMsg(conn, msg, cbMsg)))
+            {
+                fUnpack = false;
+                break;
+            }
+
+            WARN(("crServerPendMsg failed"));
+            crServerPendProcess(conn);
+            break;
+        }
+        case CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN:
+        {
+            if (RTListIsEmpty(&conn->PendingMsgList))
+            {
+                if (RT_SUCCESS(crServerPendMsg(conn, msg, cbMsg)))
+                {
+                    Assert(!RTListIsEmpty(&conn->PendingMsgList));
+                    fUnpack = false;
+                    break;
+                }
+                else
+                    WARN(("crServerPendMsg failed"));
+            }
+            else
+                WARN(("Pend List is NOT empty, drain the current list, and ignore this command"));
+
+            crServerPendProcess(conn);
+            break;
+        }
+        case CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END:
+        {
+            CRASSERT(!RTListIsEmpty(&conn->PendingMsgList));
+            crServerPendProcess(conn);
+            Assert(RTListIsEmpty(&conn->PendingMsgList));
+            break;
+        }
+        default:
+            WARN(("unsupported buffer type"));
+            break;
+    }
+
+    if (fUnpack)
+    {
+        crUnpack(data_ptr,                 /* first command's operands */
+                 data_ptr - 1,             /* first command's opcode */
+                 msg_opcodes->numOpcodes,  /* how many opcodes */
+                 &(cr_server.dispatch));   /* the CR dispatch table */
+    }
 
 #ifdef VBOX_WITH_CRHGSMI
     if (pCmdData)
@@ -583,7 +798,7 @@ crServerServiceClient(const RunQueue *qEntry)
         cr_server.currentSerialNo = 0;
 
         /* Commands get dispatched here */
-        crServerDispatchMessage( conn, msg );
+        crServerDispatchMessage( conn, msg, len );
 
         crNetFree( conn, msg );
 
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
index 6935125..ec37378 100644
--- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
+++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
@@ -202,7 +202,7 @@ void crServerMuralTerm(CRMuralInfo *mural)
     }
     else
     {
-        CRASSERT(cr_server.currentWindow != mural->CreateInfo.externalID);
+        CRASSERT(cr_server.currentMural != mural);
     }
 
     pBlitter = crServerVBoxBlitterGetInitialized();
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu.c
index b907c6a..e3d92d7 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu.c
@@ -449,7 +449,6 @@ GLboolean renderspuWindowInitWithVisual( WindowInfo *window, VisualInfo *visual,
 {
     crMemset(window, 0, sizeof (*window));
     RTCritSectInit(&window->CompositorLock);
-    window->fCompositorPresentEmpty = GL_FALSE;
     window->pCompositor = NULL;
 
     window->BltInfo.Base.id = id;
@@ -598,16 +597,21 @@ static void renderspuCheckCurrentCtxWindowCB(unsigned long key, void *data1, voi
     }
 }
 
+void renderspuWindowTermBase( WindowInfo *window )
+{
+    renderspuVBoxCompositorSet(window, NULL);
+    renderspuVBoxPresentBlitterCleanup(window);
+    renderspu_SystemDestroyWindow( window );
+    RTCritSectDelete(&window->CompositorLock);
+}
+
 void renderspuWindowTerm( WindowInfo *window )
 {
     GET_CONTEXT(pOldCtx);
     WindowInfo * pOldWindow = pOldCtx ? pOldCtx->currentWindow : NULL;
     CRASSERT(!pOldCtx == !pOldWindow);
     /* ensure no concurrent draws can take place */
-    renderspuVBoxCompositorSet(window, NULL);
-    renderspuVBoxPresentBlitterCleanup(window);
-    renderspu_SystemDestroyWindow( window );
-    RTCritSectDelete(&window->CompositorLock);
+    renderspuWindowTermBase(window);
     /* check if this window is bound to some ctx. Note: window pointer is already freed here */
     crHashtableWalk(render_spu.contextTable, renderspuCheckCurrentCtxWindowCB, window);
     /* restore current context */
@@ -771,14 +775,7 @@ renderspuVBoxPresentComposition( GLint win, const struct VBOXVR_SCR_COMPOSITOR *
     CRASSERT(win >= 0);
     window = (WindowInfo *) crHashtableSearch(render_spu.windowTable, win);
     if (window) {
-        if (pCompositor && CrVrScrCompositorIsEmpty(pCompositor) && !window->fCompositorPresentEmpty)
-            pCompositor = NULL;
-
-        if (pCompositor)
-            window->fCompositorPresentEmpty = GL_FALSE;
-
-        renderspuVBoxCompositorSet( window, pCompositor);
-        if (pCompositor)
+        if (renderspuVBoxCompositorSet(window, pCompositor))
         {
             renderspu_SystemVBoxPresentComposition(window, pChangedEntry);
         }
@@ -940,9 +937,9 @@ int renderspuVBoxPresentBlitterEnter( PCR_BLITTER pBlitter, int32_t i32MakeCurre
     return VINF_SUCCESS;
 }
 
-PCR_BLITTER renderspuVBoxPresentBlitterGetAndEnter( WindowInfo *window, int32_t i32MakeCurrentUserData )
+PCR_BLITTER renderspuVBoxPresentBlitterGetAndEnter( WindowInfo *window, int32_t i32MakeCurrentUserData, bool fRedraw )
 {
-    PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGet(window);
+    PCR_BLITTER pBlitter = fRedraw ? window->pBlitter : renderspuVBoxPresentBlitterGet(window);
     if (pBlitter)
     {
         int rc = renderspuVBoxPresentBlitterEnter(pBlitter, i32MakeCurrentUserData);
@@ -995,9 +992,11 @@ PCR_BLITTER renderspuVBoxPresentBlitterEnsureCreated( WindowInfo *window, int32_
     return window->pBlitter;
 }
 
-void renderspuVBoxPresentCompositionGeneric( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor, const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry, int32_t i32MakeCurrentUserData )
+void renderspuVBoxPresentCompositionGeneric( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor,
+        const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry, int32_t i32MakeCurrentUserData,
+        bool fRedraw )
 {
-    PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGetAndEnter(window, i32MakeCurrentUserData);
+    PCR_BLITTER pBlitter = renderspuVBoxPresentBlitterGetAndEnter(window, i32MakeCurrentUserData, fRedraw);
     if (!pBlitter)
         return;
 
@@ -1008,25 +1007,39 @@ void renderspuVBoxPresentCompositionGeneric( WindowInfo *window, const struct VB
     CrBltLeave(pBlitter);
 }
 
-void renderspuVBoxCompositorSet( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor)
+GLboolean renderspuVBoxCompositorSet( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor)
 {
     int rc;
+    GLboolean fEmpty = pCompositor && CrVrScrCompositorIsEmpty(pCompositor);
+    GLboolean fNeedPresent;
+
     /* renderspuVBoxCompositorSet can be invoked from the chromium thread only and is not reentrant,
      * no need to synch here
      * the lock is actually needed to ensure we're in synch with the redraw thread */
-    if (window->pCompositor == pCompositor)
-        return;
+    if (window->pCompositor == pCompositor && !fEmpty)
+        return !!pCompositor;
+
     rc = RTCritSectEnter(&window->CompositorLock);
     if (RT_SUCCESS(rc))
     {
-        window->pCompositor = pCompositor;
+        if (!fEmpty)
+            fNeedPresent = !!pCompositor;
+        else
+        {
+            fNeedPresent = renderspu_SystemWindowNeedEmptyPresent(window);
+            pCompositor = NULL;
+        }
+
+        window->pCompositor = !fEmpty ? pCompositor : NULL;
         RTCritSectLeave(&window->CompositorLock);
-        return;
+        return fNeedPresent;
     }
     else
     {
-        crWarning("RTCritSectEnter failed rc %d", rc);
+        WARN(("RTCritSectEnter failed rc %d", rc));
     }
+
+    return GL_FALSE;
 }
 
 static void renderspuVBoxCompositorClearAllCB(unsigned long key, void *data1, void *data2)
@@ -1052,7 +1065,10 @@ const struct VBOXVR_SCR_COMPOSITOR * renderspuVBoxCompositorAcquire( WindowInfo
     {
         const VBOXVR_SCR_COMPOSITOR * pCompositor = window->pCompositor;
         if (pCompositor)
+        {
+            Assert(!CrVrScrCompositorIsEmpty(window->pCompositor));
             return pCompositor;
+        }
 
         /* if no compositor is set, release the lock and return */
         RTCritSectLeave(&window->CompositorLock);
@@ -1064,10 +1080,16 @@ const struct VBOXVR_SCR_COMPOSITOR * renderspuVBoxCompositorAcquire( WindowInfo
     return NULL;
 }
 
-int renderspuVBoxCompositorLock(WindowInfo *window)
+int renderspuVBoxCompositorLock(WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR **ppCompositor)
 {
     int rc = RTCritSectEnter(&window->CompositorLock);
-    AssertRC(rc);
+    if (RT_SUCCESS(rc))
+    {
+        if (ppCompositor)
+            *ppCompositor = window->pCompositor;
+    }
+    else
+        WARN(("RTCritSectEnter failed %d", rc));
     return rc;
 }
 
@@ -1085,7 +1107,10 @@ int renderspuVBoxCompositorTryAcquire(WindowInfo *window, const struct VBOXVR_SC
     {
         *ppCompositor = window->pCompositor;
         if (*ppCompositor)
+        {
+            Assert(!CrVrScrCompositorIsEmpty(window->pCompositor));
             return VINF_SUCCESS;
+        }
 
         /* if no compositor is set, release the lock and return */
         RTCritSectLeave(&window->CompositorLock);
@@ -1102,8 +1127,7 @@ void renderspuVBoxCompositorRelease( WindowInfo *window)
 {
     int rc;
     Assert(window->pCompositor);
-    if (CrVrScrCompositorIsEmpty(window->pCompositor) && RTCritSectGetRecursion(&window->CompositorLock) == 1)
-        window->pCompositor = NULL;
+    Assert(!CrVrScrCompositorIsEmpty(window->pCompositor));
     rc = RTCritSectLeave(&window->CompositorLock);
     if (!RT_SUCCESS(rc))
     {
@@ -1366,10 +1390,8 @@ void renderspuSetDefaultSharedContext(ContextInfo *pCtx)
     render_spu.defaultSharedContext = pCtx;
 }
 
-
 static void RENDER_APIENTRY renderspuChromiumParameteriCR(GLenum target, GLint value)
 {
-
     switch (target)
     {
         case GL_HH_SET_DEFAULT_SHARED_CTX:
@@ -1383,6 +1405,23 @@ static void RENDER_APIENTRY renderspuChromiumParameteriCR(GLenum target, GLint v
             renderspuSetDefaultSharedContext(pCtx);
             break;
         }
+        case GL_HH_RENDERTHREAD_INFORM:
+        {
+            if (value)
+            {
+                int rc = renderspuDefaultCtxInit();
+                if (RT_FAILURE(rc))
+                {
+                    WARN(("renderspuDefaultCtxInit failed"));
+                    break;
+                }
+            }
+            else
+            {
+                renderspuCleanupBase(false);
+            }
+            break;
+        }
         default:
 //            crWarning("Unhandled target in renderspuChromiumParameteriCR()");
             break;
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu.h b/src/VBox/HostServices/SharedOpenGL/render/renderspu.h
index 1d7704c..89cc7d5 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu.h
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu.h
@@ -100,7 +100,6 @@ typedef struct WindowInfo {
     GLboolean mapPending;
     GLboolean visible;
     GLboolean everCurrent; /**< has this window ever been bound? */
-    GLboolean fCompositorPresentEmpty;
     char *title;
 
     const VBOXVR_SCR_COMPOSITOR *pCompositor;
@@ -399,6 +398,7 @@ extern void renderspu_SystemGetWindowGeometry( WindowInfo *window, GLint *x, GLi
 extern void renderspu_SystemGetMaxWindowSize( WindowInfo *window, GLint *w, GLint *h );
 extern void renderspu_SystemWindowPosition( WindowInfo *window, GLint x, GLint y );
 extern void renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, const GLint* pRects);
+extern GLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *window);
 extern int renderspu_SystemInit();
 extern int renderspu_SystemTerm();
 extern void renderspu_SystemDefaultSharedContextChanged(ContextInfo *fromContext, ContextInfo *toContext);
@@ -410,19 +410,22 @@ extern void renderspu_SystemVBoxPresentComposition( WindowInfo *window, const st
 uint32_t renderspu_SystemPostprocessFunctions(SPUNamedFunctionTable *aFunctions, uint32_t cFunctions, uint32_t cTable);
 extern void renderspu_GCWindow(void);
 extern int renderspuCreateFunctions( SPUNamedFunctionTable table[] );
-extern void renderspuVBoxCompositorSet( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor);
+extern GLboolean renderspuVBoxCompositorSet( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor);
 extern void renderspuVBoxCompositorClearAll();
-extern int renderspuVBoxCompositorLock(WindowInfo *window);
+extern int renderspuVBoxCompositorLock(WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR **ppCompositor);
 extern int renderspuVBoxCompositorUnlock(WindowInfo *window);
 extern const struct VBOXVR_SCR_COMPOSITOR * renderspuVBoxCompositorAcquire( WindowInfo *window);
 extern int renderspuVBoxCompositorTryAcquire(WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR **ppCompositor);
 extern void renderspuVBoxCompositorRelease( WindowInfo *window);
-extern void renderspuVBoxPresentCompositionGeneric( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor, const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry, int32_t i32MakeCurrentUserData );
+extern void renderspuVBoxPresentCompositionGeneric( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor,
+        const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry, int32_t i32MakeCurrentUserData,
+        bool fRedraw);
 extern PCR_BLITTER renderspuVBoxPresentBlitterGet( WindowInfo *window );
 void renderspuVBoxPresentBlitterCleanup( WindowInfo *window );
 extern int renderspuVBoxPresentBlitterEnter( PCR_BLITTER pBlitter, int32_t i32MakeCurrentUserData );
-extern PCR_BLITTER renderspuVBoxPresentBlitterGetAndEnter( WindowInfo *window, int32_t i32MakeCurrentUserData );
+extern PCR_BLITTER renderspuVBoxPresentBlitterGetAndEnter( WindowInfo *window, int32_t i32MakeCurrentUserData, bool fRedraw );
 extern PCR_BLITTER renderspuVBoxPresentBlitterEnsureCreated( WindowInfo *window, int32_t i32MakeCurrentUserData );
+void renderspuWindowTermBase( WindowInfo *window );
 extern void renderspuWindowTerm( WindowInfo *window );
 extern WindowInfo* renderspuGetDummyWindow(GLint visBits);
 extern void renderspuPerformMakeCurrent(WindowInfo *window, GLint nativeWindow, ContextInfo *context);
@@ -442,6 +445,9 @@ extern void RENDER_APIENTRY renderspuSwapBuffers( GLint window, GLint flags );
 
 extern uint32_t renderspuContextMarkDeletedAndRelease( ContextInfo *context );
 
+int renderspuDefaultCtxInit();
+void renderspuCleanupBase(bool fDeleteTables);
+
 ContextInfo * renderspuDefaultSharedContextAcquire();
 void renderspuDefaultSharedContextRelease(ContextInfo * pCtx);
 uint32_t renderspuContextRelease(ContextInfo *context);
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_agl.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_agl.c
index 3d14fa3..de55160 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_agl.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_agl.c
@@ -609,7 +609,7 @@ renderspu_SystemShowWindow(WindowInfo *window, GLboolean showIt)
 
 void renderspu_SystemVBoxPresentComposition( WindowInfo *window, const struct VBOXVR_SCR_COMPOSITOR * pCompositor, const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry )
 {
-    renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0);
+    renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0, false);
 }
 
 void
@@ -703,6 +703,11 @@ renderspu_SystemSwapBuffers(WindowInfo *window, GLint flags)
     }
 }
 
+GLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *window)
+{
+    return GL_FALSE;
+}
+
 void renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, const GLint* pRects)
 {
     CRASSERT(window);
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa.c
index f9492a2..9ef119a 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa.c
@@ -179,6 +179,11 @@ void renderspu_SystemSwapBuffers(WindowInfo *pWinInfo, GLint flags)
     cocoaViewDisplay(pWinInfo->window);
 }
 
+GLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *pWinInfo)
+{
+    return cocoaViewNeedsEmptyPresent(pWinInfo->window);
+}
+
 void renderspu_SystemWindowVisibleRegion(WindowInfo *pWinInfo, GLint cRects, const GLint* paRects)
 {
     CRASSERT(pWinInfo);
@@ -228,7 +233,7 @@ void renderspuCtxInfoInitCurrent(CR_RENDER_CTX_INFO *pInfo)
 {
     GET_CONTEXT(pCurCtx);
     pInfo->pContext = pCurCtx;
-    pInfo->pWindow = pCurCtx->currentWindow;
+    pInfo->pWindow = pCurCtx ? pCurCtx->currentWindow : NULL;
 }
 
 void renderspuCtxInfoRestoreCurrent(CR_RENDER_CTX_INFO *pInfo)
@@ -253,7 +258,7 @@ GLboolean renderspuCtxSetCurrentWithAnyWindow(ContextInfo * pContext, CR_RENDER_
         window = renderspuGetDummyWindow(pContext->BltInfo.Base.visualBits);
         if (!window)
         {
-            crWarning("renderspuGetDummyWindow failed");
+            WARN(("renderspuGetDummyWindow failed"));
             return GL_FALSE;
         }
     }
@@ -284,7 +289,7 @@ void renderspu_SystemDefaultSharedContextChanged(ContextInfo *fromContext, Conte
                 renderspuCtxInfoRestoreCurrent(&Info);
             }
             else
-                crWarning("renderspuCtxSetCurrentWithAnyWindow failed!");
+                WARN(("renderspuCtxSetCurrentWithAnyWindow failed!"));
         }
     }
     else
@@ -301,7 +306,7 @@ void renderspu_SystemDefaultSharedContextChanged(ContextInfo *fromContext, Conte
         {
             int rc = CrGlslProgGenAllNoAlpha(&render_spu.GlobalShaders);
             if (!RT_SUCCESS(rc))
-                crWarning("CrGlslProgGenAllNoAlpha failed, rc %d", rc);
+                WARN(("CrGlslProgGenAllNoAlpha failed, rc %d", rc));
 
             renderspuCtxInfoRestoreCurrent(&Info);
         }
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.h b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.h
index 546f98b..d3121df 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.h
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.h
@@ -48,6 +48,7 @@ void cocoaViewGetGeometry(NativeNSViewRef pView, int *pX, int *pY, int *pW, int
 
 void cocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef pCtx);
 void cocoaViewSetVisibleRegion(NativeNSViewRef pView, GLint cRects, const GLint* paRects);
+GLboolean cocoaViewNeedsEmptyPresent(NativeNSViewRef pView);
 void cocoaViewPresentComposition(NativeNSViewRef pView, const struct VBOXVR_SCR_COMPOSITOR_ENTRY *pChangedEntry);
 
 RT_C_DECLS_END
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
index db2c00c..8ecf256 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m
@@ -348,6 +348,7 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
     bool m_fNeedViewportUpdate;
     bool m_fNeedCtxUpdate;
     bool m_fDataVisible;
+    bool m_fCleanupNeeded;
     bool m_fEverSized;
 }
 - (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView*)pParentView winInfo:(WindowInfo*)pWinInfo;
@@ -385,6 +386,7 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
 
 - (void)clearVisibleRegions;
 - (void)setVisibleRegions:(GLint)cRects paRects:(const GLint*)paRects;
+- (GLboolean)vboxNeedsEmptyPresent;
 
 - (NSView*)dockTileScreen;
 - (void)reshapeDockTile;
@@ -795,6 +797,7 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
     m_fNeedViewportUpdate     = true;        
     m_fNeedCtxUpdate          = true;
     m_fDataVisible            = false;
+    m_fCleanupNeeded          = false;
     m_fEverSized              = false;
     
     self = [super initWithFrame:frame];
@@ -899,14 +902,6 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
 
     if (m_fEverSized)
         [self performSelectorOnMainThread:@selector(vboxReshapePerform) withObject:nil waitUntilDone:NO];
-    
-    /* we need to redwar on regions change, however the compositor now is cleared 
-     * because all compositor&window data-related modifications are performed with compositor cleared
-     * the renderspu client will re-set the compositor after modifications are complete
-     * this way we indicate renderspu generic code not to ignore the empty compositor */
-     /* generally this should not be needed for setPos because compositor should not be zeroed with it,
-      * in any way setting this flag here should not hurt as it will be re-set on next present */
-    m_pWinInfo->fCompositorPresentEmpty = GL_TRUE;
 }
 
 - (NSPoint)pos
@@ -930,13 +925,8 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
     DEBUG_MSG(("OVIW(%p): setSize: new size: %dx%d\n", (void*)self, (int)size.width, (int)size.height));
     [self performSelectorOnMainThread:@selector(vboxReshapeOnResizePerform) withObject:nil waitUntilDone:NO];
 
-    /* we need to redwar on regions change, however the compositor now is cleared 
-     * because all compositor&window data-related modifications are performed with compositor cleared
-     * the renderspu client will re-set the compositor after modifications are complete
-     * this way we indicate renderspu generic code not to ignore the empty compositor */
-     /* generally this should not be needed for setSize because compositor should not be zeroed with it,
-      * in any way setting this flag here should not hurt as it will be re-set on next present */
-    m_pWinInfo->fCompositorPresentEmpty = GL_TRUE;
+    /* ensure window contents is updated after that */
+    [self setNeedsDisplay:YES];
 }
 
 - (NSSize)size
@@ -1192,9 +1182,19 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
 
 - (void)vboxTryDrawUI
 {
-    const VBOXVR_SCR_COMPOSITOR *pCompositor = renderspuVBoxCompositorAcquire(m_pWinInfo);
-    if (!m_fDataVisible && !pCompositor)
+    const VBOXVR_SCR_COMPOSITOR *pCompositor;
+    int rc = renderspuVBoxCompositorLock(m_pWinInfo, &pCompositor);
+    if (RT_FAILURE(rc))
+    {
+        DEBUG_WARN(("renderspuVBoxCompositorLock failed\n"));
+        return;
+    }
+
+    if (!pCompositor && !m_fCleanupNeeded)
+    {
+        renderspuVBoxCompositorUnlock(m_pWinInfo);
         return;
+    }
 
     VBOXVR_SCR_COMPOSITOR TmpCompositor;
     
@@ -1203,6 +1203,7 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
         if (!m_pSharedGLCtx)
         {
             Assert(!m_fDataVisible);
+            Assert(!m_fCleanupNeeded);
             renderspuVBoxCompositorRelease(m_pWinInfo);
             if (![self vboxSharedCtxCreate])
             {
@@ -1214,28 +1215,29 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
             
             pCompositor = renderspuVBoxCompositorAcquire(m_pWinInfo);
             Assert(!m_fDataVisible);
+            Assert(!m_fCleanupNeeded);
             if (!pCompositor)
                 return;
         }
     }
     else
     {
+        Assert(m_fCleanupNeeded);
         CrVrScrCompositorInit(&TmpCompositor, NULL);
         pCompositor = &TmpCompositor;
     }
     
     if ([self lockFocusIfCanDraw])
     {
-        [self vboxPresent:pCompositor];
-        if (pCompositor != &TmpCompositor)
-            renderspuVBoxCompositorRelease(m_pWinInfo);
-            
+        [self vboxPresent:pCompositor];            
         [self unlockFocus];
     }
     else
     {
         [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(vboxTryDrawUI) userInfo:nil repeats:NO];
     }
+    
+    renderspuVBoxCompositorUnlock(m_pWinInfo);
 }
 
 - (void)swapFBO
@@ -1274,6 +1276,8 @@ static void vboxCtxLeave(PVBOX_CR_RENDER_CTX_INFO pCtxInfo)
                 m_fNeedViewportUpdate = false;
             }
             
+            m_fCleanupNeeded = GL_FALSE;
+            
             /* Render FBO content to the dock tile when necessary. */
             [self vboxPresentToDockTileCS:pCompositor];
             /* change to #if 0 to see thumbnail image */            
@@ -1568,6 +1572,17 @@ static int g_cVBoxTgaCtr = 0;
     m_cClipRects = 0;
 }
 
+- (GLboolean)vboxNeedsEmptyPresent
+{
+    if (m_fDataVisible)
+    {
+        m_fCleanupNeeded = true;
+        return GL_TRUE;
+    }
+    
+    return GL_FALSE;
+}
+
 - (void)setVisibleRegions:(GLint)cRects paRects:(const GLint*)paRects
 {
     GLint cOldRects = m_cClipRects;
@@ -1588,12 +1603,6 @@ static int g_cVBoxTgaCtr = 0;
         m_cClipRects = cRects;
         memcpy(m_paClipRects, paRects, sizeof(GLint) * 4 * cRects);
     }
-
-    /* we need to redwar on regions change, however the compositor now is cleared 
-     * because all compositor&window data-related modifications are performed with compositor cleared
-     * the renderspu client will re-set the compositor after modifications are complete
-     * this way we indicate renderspu generic code not to ignore the empty compositor */
-    m_pWinInfo->fCompositorPresentEmpty = GL_TRUE;
 }
 
 - (NSView*)dockTileScreen
@@ -1937,6 +1946,17 @@ void cocoaViewMakeCurrentContext(NativeNSViewRef pView, NativeNSOpenGLContextRef
     [pPool release];
 }
 
+GLboolean cocoaViewNeedsEmptyPresent(NativeNSViewRef pView)
+{
+    NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
+
+    GLboolean fNeedsPresent = [(OverlayView*)pView vboxNeedsEmptyPresent];
+
+    [pPool release];
+    
+    return fNeedsPresent;
+}
+
 void cocoaViewSetVisibleRegion(NativeNSViewRef pView, GLint cRects, const GLint* paRects)
 {
     NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_glx.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_glx.c
index 9bdcf29..8e197e4 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_glx.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_glx.c
@@ -583,7 +583,7 @@ static DECLCALLBACK(int) renderspuWinCmdThreadProc(RTTHREAD ThreadSelf, void *pv
                         pCompositor = renderspuVBoxCompositorAcquire(pWindow);
                         if (pCompositor)
                         {
-                            renderspuVBoxPresentCompositionGeneric(pWindow, pCompositor, NULL, 0);
+                            renderspuVBoxPresentCompositionGeneric(pWindow, pCompositor, NULL, 0, true);
                             renderspuVBoxCompositorRelease(pWindow);
                         }
                     }
@@ -672,23 +672,23 @@ int renderspu_SystemInit()
         rc = RTThreadCreate(&render_spu.hWinCmdThread, renderspuWinCmdThreadProc, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "VBoxCrWinCmd");
 	if (RT_SUCCESS(rc))
 	{
-            rc = RTSemEventWait(render_spu.hWinCmdCompleteEvent, RT_INDEFINITE_WAIT);
+	    rc = RTSemEventWait(render_spu.hWinCmdCompleteEvent, RT_INDEFINITE_WAIT);
 	    if (RT_SUCCESS(rc))
 	    {
-                return VINF_SUCCESS;
-            }
+	        return VINF_SUCCESS;
+	    }
 	    else
 	    {
-                crWarning("RTSemEventWait failed rc %d", rc);
-            }
+            crWarning("RTSemEventWait failed rc %d", rc);
+        }
 
-	    RTThreadWait(render_spu.hWinCmdThread, RT_INDEFINITE_WAIT, NULL);
+        RTThreadWait(render_spu.hWinCmdThread, RT_INDEFINITE_WAIT, NULL);
         }
         else
         {
             crWarning("RTThreadCreate failed rc %d", rc);
         }
-	RTSemEventDestroy(render_spu.hWinCmdCompleteEvent);
+	    RTSemEventDestroy(render_spu.hWinCmdCompleteEvent);
     }
     else
     {
@@ -1888,6 +1888,11 @@ renderspu_SystemWindowPosition( WindowInfo *window, GLint x, GLint y )
     }
 }
 
+GLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *window)
+{
+    return GL_FALSE;
+}
+
 void
 renderspu_SystemWindowVisibleRegion( WindowInfo *window, GLint cRects, const GLint *pRects )
 {
@@ -1980,7 +1985,7 @@ void renderspu_SystemVBoxPresentComposition( WindowInfo *window, const struct VB
     int rc = renderspuVBoxCompositorTryAcquire(window, &pCompositor);
     if (RT_SUCCESS(rc))
     {
-        renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0);
+        renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0, false);
         renderspuVBoxCompositorRelease(window);
     }
     else if (rc == VERR_SEM_BUSY)
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
index 6d46faf..3ceac50 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c
@@ -133,13 +133,48 @@ static DWORD WINAPI renderSPUWindowThreadProc(void* unused)
 }
 #endif
 
+int renderspuDefaultCtxInit()
+{
+    GLint defaultWin, defaultCtx;
+    WindowInfo *windowInfo;
+
+    /*
+     * Create the default window and context.  Their indexes are zero and
+     * a client can use them without calling CreateContext or WindowCreate.
+     */
+    crDebug("Render SPU: Creating default window (visBits=0x%x, id=0)",
+            render_spu.default_visual);
+    defaultWin = renderspuWindowCreateEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_WINDOW_ID );
+    if (defaultWin != CR_RENDER_DEFAULT_WINDOW_ID) {
+        crError("Render SPU: Couldn't get a double-buffered, RGB visual with Z!");
+        return VERR_GENERAL_FAILURE;
+    }
+    crDebug( "Render SPU: WindowCreate returned %d (0=normal)", defaultWin );
+
+    crDebug("Render SPU: Creating default context, visBits=0x%x",
+            render_spu.default_visual );
+    defaultCtx = renderspuCreateContextEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_CONTEXT_ID, 0 );
+    if (defaultCtx != CR_RENDER_DEFAULT_CONTEXT_ID) {
+        crError("Render SPU: failed to create default context!");
+        return VERR_GENERAL_FAILURE;
+    }
+
+    renderspuMakeCurrent( defaultWin, 0, defaultCtx );
+
+    /* Get windowInfo for the default window */
+    windowInfo = (WindowInfo *) crHashtableSearch(render_spu.windowTable, CR_RENDER_DEFAULT_WINDOW_ID);
+    CRASSERT(windowInfo);
+    windowInfo->mapPending = GL_TRUE;
+
+    return VINF_SUCCESS;
+}
+
 static SPUFunctions *
 renderSPUInit( int id, SPU *child, SPU *self,
                unsigned int context_id, unsigned int num_contexts )
 {
     int numFuncs, numSpecial;
-    GLint defaultWin, defaultCtx;
-    WindowInfo *windowInfo;
+
     const char * pcpwSetting;
     int rc;
 
@@ -266,34 +301,13 @@ renderSPUInit( int id, SPU *child, SPU *self,
 # endif /* VBOX_WITH_COCOA_QT */
 #endif /* DARWIN */
 
-    /*
-     * Create the default window and context.  Their indexes are zero and
-     * a client can use them without calling CreateContext or WindowCreate.
-     */
-    crDebug("Render SPU: Creating default window (visBits=0x%x, id=0)",
-            render_spu.default_visual);
-    defaultWin = renderspuWindowCreateEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_WINDOW_ID );
-    if (defaultWin != CR_RENDER_DEFAULT_WINDOW_ID) {
-        crError("Render SPU: Couldn't get a double-buffered, RGB visual with Z!");
-        return NULL;
-    }
-    crDebug( "Render SPU: WindowCreate returned %d (0=normal)", defaultWin );
-
-    crDebug("Render SPU: Creating default context, visBits=0x%x",
-            render_spu.default_visual );
-    defaultCtx = renderspuCreateContextEx( NULL, render_spu.default_visual, CR_RENDER_DEFAULT_CONTEXT_ID, 0 );
-    if (defaultCtx != CR_RENDER_DEFAULT_CONTEXT_ID) {
-        crError("Render SPU: failed to create default context!");
+    rc = renderspuDefaultCtxInit();
+    if (!RT_SUCCESS(rc))
+    {
+        WARN(("renderspuDefaultCtxInit failed %d", rc));
         return NULL;
     }
 
-    renderspuMakeCurrent( defaultWin, 0, defaultCtx );
-
-    /* Get windowInfo for the default window */
-    windowInfo = (WindowInfo *) crHashtableSearch(render_spu.windowTable, CR_RENDER_DEFAULT_WINDOW_ID);
-    CRASSERT(windowInfo);
-    windowInfo->mapPending = GL_TRUE;
-
     /*
      * Get the OpenGL extension functions.
      * SIGH -- we have to wait until the very bitter end to load the
@@ -413,7 +427,7 @@ static void DeleteContextCallback( void *data )
 static void DeleteWindowCallback( void *data )
 {
     WindowInfo *window = (WindowInfo *) data;
-    renderspu_SystemDestroyWindow(window);
+    renderspuWindowTermBase(window);
     crFree(window);
 }
 
@@ -432,14 +446,60 @@ static void renderspuBlitterCleanupCB(unsigned long key, void *data1, void *data
     renderspuVBoxPresentBlitterCleanup( window );
 }
 
-static int renderSPUCleanup(void)
+
+static void renderspuDeleteBlitterCB(unsigned long key, void *data1, void *data2)
+{
+    CRHashTable *pTbl = (CRHashTable*)data2;
+
+    crHashtableDelete( pTbl, key, NULL );
+
+    DeleteBlitterCallback(data1);
+}
+
+
+static void renderspuDeleteWindowCB(unsigned long key, void *data1, void *data2)
+{
+    CRHashTable *pTbl = (CRHashTable*)data2;
+
+    crHashtableDelete( pTbl, key, NULL );
+
+    DeleteWindowCallback(data1);
+}
+
+static void renderspuDeleteBarierCB(unsigned long key, void *data1, void *data2)
+{
+    CRHashTable *pTbl = (CRHashTable*)data2;
+
+    crHashtableDelete( pTbl, key, NULL );
+
+    crFree(data1);
+}
+
+
+static void renderspuDeleteContextCB(unsigned long key, void *data1, void *data2)
+{
+    CRHashTable *pTbl = (CRHashTable*)data2;
+
+    crHashtableDelete( pTbl, key, NULL );
+
+    DeleteContextCallback(data1);
+}
+
+void renderspuCleanupBase(bool fDeleteTables)
 {
     renderspuVBoxCompositorClearAll();
 
     if (render_spu.blitterTable)
     {
-        crFreeHashtable(render_spu.blitterTable, DeleteBlitterCallback);
-        render_spu.blitterTable = NULL;
+        if (fDeleteTables)
+        {
+            crFreeHashtable(render_spu.blitterTable, DeleteBlitterCallback);
+            render_spu.blitterTable = NULL;
+        }
+        else
+        {
+            crHashtableWalk(render_spu.blitterTable, renderspuDeleteBlitterCB, render_spu.contextTable);
+        }
     }
     else
     {
@@ -450,14 +510,29 @@ static int renderSPUCleanup(void)
 
     renderspuSetDefaultSharedContext(NULL);
 
-    crFreeHashtable(render_spu.contextTable, DeleteContextCallback);
-    render_spu.contextTable = NULL;
-    crFreeHashtable(render_spu.windowTable, DeleteWindowCallback);
-    render_spu.windowTable = NULL;
-    crFreeHashtable(render_spu.dummyWindowTable, DeleteWindowCallback);
-    render_spu.dummyWindowTable = NULL;
-    crFreeHashtable(render_spu.barrierHash, crFree);
-    render_spu.barrierHash = NULL;
+    if (fDeleteTables)
+    {
+        crFreeHashtable(render_spu.contextTable, DeleteContextCallback);
+        render_spu.contextTable = NULL;
+        crFreeHashtable(render_spu.windowTable, DeleteWindowCallback);
+        render_spu.windowTable = NULL;
+        crFreeHashtable(render_spu.dummyWindowTable, DeleteWindowCallback);
+        render_spu.dummyWindowTable = NULL;
+        crFreeHashtable(render_spu.barrierHash, crFree);
+        render_spu.barrierHash = NULL;
+    }
+    else
+    {
+        crHashtableWalk(render_spu.contextTable, renderspuDeleteContextCB, render_spu.contextTable);
+        crHashtableWalk(render_spu.windowTable, renderspuDeleteWindowCB, render_spu.windowTable);
+        crHashtableWalk(render_spu.dummyWindowTable, renderspuDeleteWindowCB, render_spu.dummyWindowTable);
+        crHashtableWalk(render_spu.barrierHash, renderspuDeleteBarierCB, render_spu.barrierHash);
+    }
+}
+
+static int renderSPUCleanup(void)
+{
+    renderspuCleanupBase(true);
 
 #ifdef RT_OS_DARWIN
 # ifndef VBOX_WITH_COCOA_QT
diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_wgl.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_wgl.c
index 1bd745a..f5e8010 100644
--- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_wgl.c
+++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_wgl.c
@@ -445,7 +445,7 @@ MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
                         BOOL bRc;
                         pWindow->redraw_device_context = hDC;
 
-                        renderspuVBoxPresentCompositionGeneric(pWindow, pCompositor, NULL, 1);
+                        renderspuVBoxPresentCompositionGeneric(pWindow, pCompositor, NULL, 1, true);
 
                         bRc = EndPaint(pWindow->hWnd, &Paint);
 
@@ -1294,7 +1294,7 @@ void renderspu_SystemVBoxPresentComposition( WindowInfo *window, const struct VB
     int rc = renderspuVBoxCompositorTryAcquire(window, &pCompositor);
     if (RT_SUCCESS(rc))
     {
-        renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0);
+        renderspuVBoxPresentCompositionGeneric(window, pCompositor, pChangedEntry, 0, false);
         renderspuVBoxCompositorRelease(window);
     }
     else if (rc == VERR_SEM_BUSY)
@@ -1579,6 +1579,11 @@ void renderspu_SystemWindowPosition( WindowInfo *window, GLint x, GLint y )
     window->y = y;
 }
 
+GLboolean renderspu_SystemWindowNeedEmptyPresent(WindowInfo *window)
+{
+    return GL_FALSE;
+}
+
 void renderspu_SystemWindowVisibleRegion(WindowInfo *window, GLint cRects, const GLint* pRects)
 {
     GLint i;
diff --git a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py
index b86db49..6a04c0c 100644
--- a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py
+++ b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py
@@ -29,12 +29,8 @@ SPUDispatchTable cr_unpackDispatch;
 static void crUnpackExtend(void);
 static void crUnpackExtendDbg(void);
 
-static GLenum g_VBoxDbgCrLastOpcode = 0;
-
-#ifdef DEBUG_misha
-//# define CR_UNPACK_DEBUG_OPCODES
-# define CR_UNPACK_DEBUG_LAST_OPCODES
-#endif
+/*#define CR_UNPACK_DEBUG_OPCODES*/
+/*#define CR_UNPACK_DEBUG_LAST_OPCODES*/
 """
 
 nodebug_opcodes = [
@@ -210,6 +206,29 @@ void crUnpackPop(void)
     crFree( node );
 }
 
+CR_UNPACK_BUFFER_TYPE crUnpackGetBufferType(const void *opcodes, unsigned int num_opcodes)
+{
+    const uint8_t *pu8Codes = (const uint8_t *)opcodes;
+
+    CR_UNPACK_BUFFER_TYPE enmType;
+    uint8_t first;
+    uint8_t last;
+
+    if (!num_opcodes)
+        return CR_UNPACK_BUFFER_TYPE_GENERIC;
+
+    first = pu8Codes[0];
+    last = pu8Codes[1-(int)num_opcodes];
+
+    enmType = (first != CR_CMDBLOCKBEGIN_OPCODE) ? CR_UNPACK_BUFFER_TYPE_GENERIC : CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN;
+
+    if (last != CR_CMDBLOCKEND_OPCODE)
+        return enmType;
+
+    /* last is CMDBLOCKEND*/
+    return (enmType == CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN) ? CR_UNPACK_BUFFER_TYPE_GENERIC : CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END;
+}
+
 void crUnpack( const void *data, const void *opcodes, 
         unsigned int num_opcodes, SPUDispatchTable *table )
 {
@@ -266,6 +285,11 @@ print """
                     crUnpackExtend();
                 #endif
                 break;
+            case CR_CMDBLOCKBEGIN_OPCODE:
+            case CR_CMDBLOCKEND_OPCODE:
+            case CR_NOP_OPCODE:
+                INCR_DATA_PTR_NO_ARGS( );
+                break;
             default:
                 crError( "Unknown opcode: %d", *unpack_opcodes );
                 break;
@@ -296,8 +320,6 @@ print 'static void crUnpackExtend(void)'
 print '{'
 print '\tGLenum extend_opcode = %s;' % ReadData( 4, 'GLenum' );
 print ''
-print '\tg_VBoxDbgCrLastOpcode = extend_opcode;'
-print ''
 print '\t/*crDebug(\"Unpacking extended opcode \%d", extend_opcode);*/'
 print '\tswitch( extend_opcode )'
 print '\t{'
@@ -324,8 +346,6 @@ print 'static void crUnpackExtendDbg(void)'
 print '{'
 print '\tGLenum extend_opcode = %s;' % ReadData( 4, 'GLenum' );
 print ''
-print '\tg_VBoxDbgCrLastOpcode = extend_opcode;'
-print ''
 print '\t/*crDebug(\"Unpacking extended opcode \%d", extend_opcode);*/'
 print '\tswitch( extend_opcode )'
 print '\t{'
diff --git a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_shaders.c b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_shaders.c
index 22a1d27..069d583 100644
--- a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_shaders.c
+++ b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_shaders.c
@@ -76,8 +76,7 @@ void crUnpackExtendShaderSource(void)
     }
 
 //    cr_unpackDispatch.ShaderSource(shader, count, ppStrings, length ? length : pLocalLength);
-
-    cr_unpackDispatch.ShaderSource(shader, 1, ppStrings, 0);
+    cr_unpackDispatch.ShaderSource(shader, 1, (const char**)ppStrings, 0);
 
     crFree(ppStrings);
 }
diff --git a/src/VBox/Installer/linux/rpm/LocalConfig.kmk b/src/VBox/Installer/linux/rpm/LocalConfig.kmk
index a9bebf8..2c5ef83 100644
--- a/src/VBox/Installer/linux/rpm/LocalConfig.kmk
+++ b/src/VBox/Installer/linux/rpm/LocalConfig.kmk
@@ -18,6 +18,7 @@
 # don't build testcases to save time, they are not needed for the package
 VBOX_WITH_TESTCASES        :=
 VBOX_WITH_TESTSUITE        :=
+VBOX_WITH_PLUGIN_CRYPT     :=
 
 # required for VBOX_WITH_RUNPATH
 VBOX_WITH_ORIGIN           :=
diff --git a/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp b/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp
index c801f17..528aa5b 100644
--- a/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp
+++ b/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp
@@ -699,9 +699,6 @@ UINT __stdcall UninstallNetFlt(MSIHANDLE hModule)
             VBoxNetCfgWinReleaseINetCfg(pNetCfg, TRUE);
 
             logStringW(hModule, L"Uninstalling NetFlt done, error = 0x%x", uErr);
-
-            /* Never fail on uninstall. */
-            uErr = ERROR_SUCCESS;
         }
         else
             logStringW(hModule, L"UninstallNetFlt: doNetCfgInit failed, error = 0x%x", uErr);
diff --git a/src/VBox/Installer/win/Makefile.kmk b/src/VBox/Installer/win/Makefile.kmk
index 49c16df..bf38f92 100644
--- a/src/VBox/Installer/win/Makefile.kmk
+++ b/src/VBox/Installer/win/Makefile.kmk
@@ -59,8 +59,8 @@ VBOX_INSTALLER_LANGUAGES += $(VBOX_INSTALLER_ADD_LANGUAGES)
 # size.
 #
 ifneq ($(int-mod $(VBOX_VERSION_BUILD),2),0)
-# VBOX_WITH_MSM_INSTALL := 1
-# VBOX_INSTALLER_LANGUAGES = en_US
+ VBOX_WITH_MSM_INSTALL := 1
+ VBOX_INSTALLER_LANGUAGES = en_US
 endif
 
 ifeq ($(USERNAME),andy)
@@ -548,6 +548,7 @@ $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixobj: \
 		-E 'VBOX_WITH_EXTPACK=$(if $(VBOX_WITH_EXTPACK),yes,no)' \
 		-E 'VBOX_WITH_GUEST_CONTROL=$(if $(VBOX_WITH_GUEST_CONTROL),yes,no)' \
 		-E 'VBOX_WITH_GUEST_PROPS=$(if $(VBOX_WITH_GUEST_PROPS),yes,no)' \
+		-E 'VBOX_WITH_HARDENING=$(if $(VBOX_WITH_HARDENING),yes,no)' \
 		-E 'VBOX_WITH_DRAG_AND_DROP=$(if $(VBOX_WITH_DRAG_AND_DROP),yes,no)' \
 		-E 'VBOX_WITH_NETFLT=$(if $(VBOX_WITH_NETFLT),yes,no)' \
 		-E 'VBOX_WITH_PYTHON=$(if $(VBOX_WITH_PYTHON),yes,no)' \
@@ -639,6 +640,7 @@ $(VBOX_WIN_INST_OUT_DIR)/VBoxMerge$(module)_$(lang).wixobj: \
 		-E 'VBOX_WITH_EXTPACK=$(if $(VBOX_WITH_EXTPACK),yes,no)' \
 		-E 'VBOX_WITH_GUEST_CONTROL=$(if $(VBOX_WITH_GUEST_CONTROL),yes,no)' \
 		-E 'VBOX_WITH_GUEST_PROPS=$(if $(VBOX_WITH_GUEST_PROPS),yes,no)' \
+		-E 'VBOX_WITH_HARDENING=$(if $(VBOX_WITH_HARDENING),yes,no)' \
 		-E 'VBOX_WITH_DRAG_AND_DROP=$(if $(VBOX_WITH_DRAG_AND_DROP),yes,no)' \
 		-E 'VBOX_WITH_NETFLT=$(if $(VBOX_WITH_NETFLT),yes,no)' \
 		-E 'VBOX_WITH_PYTHON=$(if $(VBOX_WITH_PYTHON),yes,no)' \
@@ -792,6 +794,7 @@ $(PATH_STAGE_BIN)/$(PACKAGE_NAME_MULTIARCH_FINAL): \
 			-target-amd64 $(PATH_MULTIARCH_TEMP)/$(PACKAGE_NAME_MULTIARCH.amd64) \
 			$(if $(VBOX_WITH_MSM_INSTALL),,-target-all $(PACKAGE_NAME_MULTIARCH_COMMONCAB)) \
 			-stub $(PATH_STAGE_BIN)/VBoxStub.exe
+	$(VBOX_VCC_EDITBIN) /IntegrityCheck:NO $@
 	$(call VBOX_SIGN_FILE_FN,$@)
 endif
 
diff --git a/src/VBox/Installer/win/StubBld/Makefile.kmk b/src/VBox/Installer/win/StubBld/Makefile.kmk
index a28930e..9e4622b 100644
--- a/src/VBox/Installer/win/StubBld/Makefile.kmk
+++ b/src/VBox/Installer/win/StubBld/Makefile.kmk
@@ -20,7 +20,7 @@ include $(KBUILD_PATH)/subheader.kmk
 
 # This is only used in the 32-bit build (see ../Stub/Makefile.kmk).
 PROGRAMS.x86 += VBoxStubBld
-VBoxStubBld_TEMPLATE= VBOXBLDPROG
+VBoxStubBld_TEMPLATE= VBoxBldProg
 VBoxStubBld_DEFS    = _WIN32_WINNT=0x0400 VBOX_SVN_REV=$(VBOX_SVN_REV) $(VBOX_SVN_REV_KMK)
 VBoxStubBld_SOURCES = VBoxStubBld.cpp
 
diff --git a/src/VBox/Installer/win/VBoxMergeApp.wxi b/src/VBox/Installer/win/VBoxMergeApp.wxi
index e943724..bb8e5db 100644
--- a/src/VBox/Installer/win/VBoxMergeApp.wxi
+++ b/src/VBox/Installer/win/VBoxMergeApp.wxi
@@ -154,14 +154,29 @@
             <!-- Create a simple shortcut for VBoxVRDP, which is not present anymore, pointing to VBoxHeadless.exe -->
        <!--     <Shortcut Id="ShortcutVBoxVRDP" Directory="INSTALLDIR" Name="VBoxVRDP" Show="normal" WorkingDirectory="INSTALLDIR"/> -->
         </File>
+<?if $(env.VBOX_WITH_HARDENING) = "yes" ?>
+        <File Id="file_VBoxHeadless.dll" Name="VBoxHeadless.dll"
+              Source="$(env.PATH_OUT)\bin\VBoxHeadless.dll">
+        </File>
+<?endif ?>
         <File Id="file_VBoxBalloonCtrl.exe" Name="VBoxBalloonCtrl.exe"
               Source="$(env.PATH_OUT)\bin\VBoxBalloonCtrl.exe"/>
 
         <!-- Misc tools -->
         <File Id="file_VBoxNetDHCP.exe" Name="VBoxNetDHCP.exe"
               Source="$(env.PATH_OUT)\bin\VBoxNetDHCP.exe"/>
+<?if $(env.VBOX_WITH_HARDENING) = "yes" ?>
+        <File Id="file_VBoxNetDHCP.dll" Name="VBoxNetDHCP.dll"
+              Source="$(env.PATH_OUT)\bin\VBoxNetDHCP.dll">
+        </File>
+<?endif ?>
         <File Id="file_VBoxNetNAT.exe" Name="VBoxNetNAT.exe"
               Source="$(env.PATH_OUT)\bin\VBoxNetNAT.exe"/>
+<?if $(env.VBOX_WITH_HARDENING) = "yes" ?>
+        <File Id="file_VBoxNetNAT.dll" Name="VBoxNetNAT.dll"
+              Source="$(env.PATH_OUT)\bin\VBoxNetNAT.dll">
+        </File>
+<?endif ?>
 <?if $(env.VBOX_WITH_EXTPACK) = "yes" ?>
         <File Id="file_VBoxExtPackHelperApp.exe" Name="VBoxExtPackHelperApp.exe"
               Source="$(env.PATH_OUT)\bin\VBoxExtPackHelperApp.exe"/>
@@ -183,6 +198,8 @@
         <File Id="file_VBoxREM64.dll" Name="VBoxREM64.dll"
               Source="$(env.PATH_OUT)\bin\VBoxREM64.dll" />
 <?endif ?>
+        <File Id="file_VBoxSupLib.dll" Name="VBoxSupLib.dll"
+              Source="$(env.PATH_OUT)\bin\VBoxSupLib.dll" />
         <File Id="file_VBoxVMM.dll" Name="VBoxVMM.dll"
               Source="$(env.PATH_OUT)\bin\VBoxVMM.dll" />
 <?if $(env.VBOX_WITH_VRDP) = "yes" ?>
@@ -239,6 +256,11 @@
         <File Id="file_VirtualBox.exe" Name="VirtualBox.exe"
               Source="$(env.PATH_OUT)\bin\VirtualBox.exe">
         </File>
+    <?if $(env.VBOX_WITH_HARDENING) = "yes" ?>
+        <File Id="file_VirtualBox.dll" Name="VirtualBox.dll"
+              Source="$(env.PATH_OUT)\bin\VirtualBox.dll">
+        </File>
+    <?endif ?>
         <File Id="file_QtCoreVBox4.dll" Name="QtCoreVBox4.dll"
               Source="$(env.PATH_OUT)\bin\QtCoreVBox4.dll" />
         <File Id="file_QtGuiVBox4.dll" Name="QtGuiVBox4.dll"
@@ -320,6 +342,11 @@
                Win64="$(var.Property_Win64)">
         <File Id="file_VBoxSDL.exe" Name="VBoxSDL.exe"
               Source="$(env.PATH_OUT)\bin\VBoxSDL.exe" />
+<?if $(env.VBOX_WITH_HARDENING) = "yes" ?>
+        <File Id="file_VBoxSDL.dll" Name="VBoxSDL.dll"
+              Source="$(env.PATH_OUT)\bin\VBoxSDL.dll">
+        </File>
+<?endif ?>
         <File Id="file_SDL.dll" Name="SDL.dll"
               Source="$(env.PATH_OUT)\bin\SDL.dll" />
 <?if $(env.VBOX_WITH_SECURELABEL) = "yes" ?>
diff --git a/src/VBox/Installer/win/VBoxMergeNetAdpSeq.wxi b/src/VBox/Installer/win/VBoxMergeNetAdpSeq.wxi
index 851f3df..0866688 100644
--- a/src/VBox/Installer/win/VBoxMergeNetAdpSeq.wxi
+++ b/src/VBox/Installer/win/VBoxMergeNetAdpSeq.wxi
@@ -33,12 +33,20 @@
         <?endif ?>
     </Custom>
     <!-- Don't remove the host-only interfaces on update, only on uninstall -->
-    <Custom Action="ca_RemoveHostOnlyInterfaces" Before="InstallFinalize" ><![CDATA[(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")]]></Custom>
+    <Custom Action="ca_RemoveHostOnlyInterfaces" After="InstallInitialize" >
+        <![CDATA[(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")]]>
+    </Custom>
     <!-- First stop the existing host-only interfaces on update ... -->
-    <Custom Action="ca_StopHostOnlyInterfaces" Before="ca_UpdateHostOnlyInterfaces" ><![CDATA[UPGRADINGPRODUCTCODE]]></Custom>
+    <Custom Action="ca_StopHostOnlyInterfaces" Before="ca_UpdateHostOnlyInterfaces" >
+        <![CDATA[UPGRADINGPRODUCTCODE]]>
+    </Custom>
     <!-- ... then do the actual driver update -->
-    <Custom Action="ca_UpdateHostOnlyInterfacesArgs" Before="ca_UpdateHostOnlyInterfaces" ><![CDATA[Installed AND UPGRADINGPRODUCTCODE AND (NOT REMOVE="ALL")]]></Custom>
-    <Custom Action="ca_UpdateHostOnlyInterfaces" Before="InstallFiles" ><![CDATA[Installed AND UPGRADINGPRODUCTCODE AND (NOT REMOVE="ALL")]]></Custom>
+    <Custom Action="ca_UpdateHostOnlyInterfacesArgs" Before="ca_UpdateHostOnlyInterfaces" >
+        <![CDATA[Installed AND UPGRADINGPRODUCTCODE AND (NOT REMOVE="ALL")]]>
+    </Custom>
+    <Custom Action="ca_UpdateHostOnlyInterfaces" Before="InstallFiles" >
+        <![CDATA[Installed AND UPGRADINGPRODUCTCODE AND (NOT REMOVE="ALL")]]>
+    </Custom>
 <?endif ?>
 
 </Include>
diff --git a/src/VBox/Installer/win/VirtualBox.wxs b/src/VBox/Installer/win/VirtualBox.wxs
index 13cb3c5..b0a513f 100644
--- a/src/VBox/Installer/win/VirtualBox.wxs
+++ b/src/VBox/Installer/win/VirtualBox.wxs
@@ -344,8 +344,9 @@
     <?if $(env.VBOX_WITH_WEBSERVICES) = "yes" ?>
         <ComponentRef Id="cp_VBoxWebService" />
     <?endif ?>
+        <ComponentRef Id="cp_VBoxCAPI" />
         <ComponentRef Id="cp_VBoxDrv" />
-    <?endif ?>
+<?endif ?>
 
         <Feature Id="VBoxUSB" Title="VirtualBox USB Support" Level="1"
                  Description="!(loc.VB_USBDriver)"
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
index 6f2739c..1800389 100644
--- a/src/VBox/Main/idl/VirtualBox.xidl
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -1624,24 +1624,24 @@
     <attribute name="vmConfigs" type="wstring" safearray="yes" readonly="yes"/>
 
     <!-- VM-slot settings
-	 It's corresponds to dhcpd.conf entries, like:
+     It's corresponds to dhcpd.conf entries, like:
 
-	 host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
+     host ncd1 { hardware ethernet 0:c0:c3:11:90:23; }
 
-	 - in Main we can match (vm name, slot) to ethernet address
-	 that why it's easy to configure dhcp server in such way,
-	 then ask user to to enter valid name,
+     - in Main we can match (vm name, slot) to ethernet address
+     that why it's easy to configure dhcp server in such way,
+     then ask user to to enter valid name,
 
-	 - mac address might change because of adapter type (e1k <-> pcnet) or because
-	 of import/export
+     - mac address might change because of adapter type (e1k <-> pcnet) or because
+     of import/export
 
-	 - it's easy to provide vm-name.rom in boot filename VM with network boot.
+     - it's easy to provide vm-name.rom in boot filename VM with network boot.
 
-	 XXX: do we need classic getOptionValueByMAC?
+     XXX: do we need classic getOptionValueByMAC?
 
-	 XML: O-o-oh, this settings are per VM, so perhaps they should be stored in
-	      VM configuration files. And we haven't got the attachment type for
-	      NATNetwork.
+     XML: O-o-oh, this settings are per VM, so perhaps they should be stored in
+          VM configuration files. And we haven't got the attachment type for
+          NATNetwork.
     -->
     <method name="addVmSlotOption">
       <param name="vmname" type="wstring" dir="in"/>
diff --git a/src/VBox/Main/idl/apiwrap-server.xsl b/src/VBox/Main/idl/apiwrap-server.xsl
index 2f08e71..7f85886 100644
--- a/src/VBox/Main/idl/apiwrap-server.xsl
+++ b/src/VBox/Main/idl/apiwrap-server.xsl
@@ -5,15 +5,15 @@
         XSLT stylesheet that generates C++ API wrappers (server side) from
         VirtualBox.xidl.
 
-     Copyright (C) 2010-2014 Oracle Corporation
-
-     This file is part of VirtualBox Open Source Edition (OSE), as
-     available from http://www.virtualbox.org. This file is free software;
-     you can redistribute it and/or modify it under the terms of the GNU
-     General Public License (GPL) as published by the Free Software
-     Foundation, in version 2 as it comes in the "COPYING" file of the
-     VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-     hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+    Copyright (C) 2010-2014 Oracle Corporation
+
+    This file is part of VirtualBox Open Source Edition (OSE), as
+    available from http://www.virtualbox.org. This file is free software;
+    you can redistribute it and/or modify it under the terms of the GNU
+    General Public License (GPL) as published by the Free Software
+    Foundation, in version 2 as it comes in the "COPYING" file of the
+    VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+    hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 -->
 
 <xsl:stylesheet
diff --git a/src/VBox/Main/include/ConsoleImpl.h b/src/VBox/Main/include/ConsoleImpl.h
index a1c9a02..d31b409 100644
--- a/src/VBox/Main/include/ConsoleImpl.h
+++ b/src/VBox/Main/include/ConsoleImpl.h
@@ -306,6 +306,22 @@ public:
 
     EmulatedUSB *getEmulatedUSB(void) { return mEmulatedUSB; }
 
+    /**
+     * Sets the disk encryption keys.
+     *
+     * @returns COM status code.
+     * @þaram   strCfg    The config for the disks.
+     *
+     * @note: One line in the config string contains all required data for one disk.
+     *        The format for one disk is some sort of comma separated value using
+     *        key=value pairs.
+     *        There are two keys defined at the moment:
+     *            - uuid: The uuid of the base image the key is for (with or without)
+     *                    the curly braces.
+     *            - dek: The data encryption key in base64 encoding
+     */
+    HRESULT setDiskEncryptionKeys(const Utf8Str &strCfg);
+
 private:
 
     /**
@@ -749,6 +765,14 @@ private:
 
     bool isResetTurnedIntoPowerOff(void);
 
+    /** @name Disk encryption support
+     * @{ */
+    HRESULT consoleParseDiskEncryption(const char *psz, const char **ppszEnd);
+    HRESULT configureEncryptionForDisk(const char *pszUuid, const uint8_t *pbKey, size_t cbKey);
+    int consoleParseKeyValue(const char *psz, const char **ppszEnd,
+                             char **ppszKey, char **ppszVal);
+    /** @} */
+
     /** @name Teleporter support
      * @{ */
     static DECLCALLBACK(int)    teleporterSrcThreadWrapper(RTTHREAD hThread, void *pvUser);
diff --git a/src/VBox/Main/include/DisplayImpl.h b/src/VBox/Main/include/DisplayImpl.h
index b0e0980..cf3ceaf 100644
--- a/src/VBox/Main/include/DisplayImpl.h
+++ b/src/VBox/Main/include/DisplayImpl.h
@@ -95,6 +95,7 @@ typedef struct _DISPLAYFBINFO
 
 #ifdef VBOX_WITH_HGSMI
     bool fVBVAEnabled;
+    bool fRenderThreadMode;
     uint32_t cVBVASkipUpdate;
     struct
     {
@@ -166,17 +167,15 @@ public:
     int handleVHWACommandProcess(PVBOXVHWACMD pCommand);
 #endif
 #ifdef VBOX_WITH_CRHGSMI
-    void handleCrHgsmiCommandProcess(PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd);
-    void handleCrHgsmiControlProcess(PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl);
-
     void handleCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
     void handleCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
+    void handleCrHgsmiCommandProcess(PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd);
+    void handleCrHgsmiControlProcess(PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32_t cbCtl);
 #endif
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     int  handleCrHgcmCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
                                         PFNCRCTLCOMPLETION pfnCompletion,
                                         void *pvCompletion);
-    void  handleCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam);
     void  handleCrVRecScreenshotPerform(uint32_t uScreen,
                                         uint32_t x, uint32_t y, uint32_t uPixelFormat, uint32_t uBitsPerPixel,
                                         uint32_t uBytesPerLine, uint32_t uGuestWidth, uint32_t uGuestHeight,
@@ -243,7 +242,7 @@ private:
 #endif
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
-    void crViewportNotify(class VMMDev *pVMMDev, ULONG aScreenId, ULONG x, ULONG y, ULONG width, ULONG height);
+    int crViewportNotify(ULONG aScreenId, ULONG x, ULONG y, ULONG width, ULONG height);
 #endif
 
     static DECLCALLBACK(int)   changeFramebuffer(Display *that, IFramebuffer *aFB, unsigned uScreenId);
@@ -279,7 +278,7 @@ private:
     static DECLCALLBACK(void)  displayCrHgcmCtlSubmitCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
 #endif
 #ifdef VBOX_WITH_HGSMI
-    static DECLCALLBACK(int)   displayVBVAEnable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags);
+    static DECLCALLBACK(int)   displayVBVAEnable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags, bool fRenderThreadMode);
     static DECLCALLBACK(void)  displayVBVADisable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId);
     static DECLCALLBACK(void)  displayVBVAUpdateBegin(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId);
     static DECLCALLBACK(void)  displayVBVAUpdateProcess(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, const PVBVACMDHDR pCmd, size_t cbCmd);
@@ -298,8 +297,8 @@ private:
     static DECLCALLBACK(void) displayCrVRecScreenshotEnd(void *pvCtx, uint32_t uScreen, uint64_t u64TimeStamp);
 
     static DECLCALLBACK(void)  displayVRecCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
-    static DECLCALLBACK(void)  displayCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext);
 #endif
+    static DECLCALLBACK(void) displayCrCmdFree(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, int rc, void *pvCompletion);
 
     static DECLCALLBACK(void)  displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser);
     static DECLCALLBACK(int)   displaySSMLoadScreenshot(PSSMHANDLE pSSM, void *pvUser, uint32_t uVersion, uint32_t uPass);
@@ -345,17 +344,19 @@ private:
 #ifdef VBOX_WITH_CRHGSMI
     /* for fast host hgcm calls */
     HGCMCVSHANDLE mhCrOglSvc;
+    RTCRITSECTRW mCrOglLock;
 #endif
 #ifdef VBOX_WITH_CROGL
     CR_MAIN_INTERFACE mCrOglCallbacks;
     volatile uint32_t mfCrOglVideoRecState;
     CRVBOXHGCMTAKESCREENSHOT mCrOglScreenshotData;
+    VBOXCRCMDCTL_HGCM mCrOglScreenshotCtl;
 #endif
 
     bool vbvaFetchCmd(VBVACMDHDR **ppHdr, uint32_t *pcbCmd);
     void vbvaReleaseCmd(VBVACMDHDR *pHdr, int32_t cbCmd);
 
-    void handleResizeCompletedEMT(void);
+    void handleResizeCompletedEMT(BOOL fResizeContext);
 
     RTCRITSECT mVBVALock;
     volatile uint32_t mfu32PendingVideoAccelDisable;
@@ -372,7 +373,21 @@ public:
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     static BOOL  displayCheckTakeScreenshotCrOgl(Display *pDisplay, ULONG aScreenId, uint8_t *pu8Data, uint32_t u32Width, uint32_t u32Height);
+    int crCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, PFNCRCTLCOMPLETION pfnCompletion, void *pvCompletion);
+    int crCtlSubmitSync(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd);
+    /* copies the given command and submits it asynchronously,
+     * i.e. the pCmd data may be discarded right after the call returns */
+    int crCtlSubmitAsyncCmdCopy(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd);
+    /* performs synchronous request processing if 3D backend has something to display
+     * this is primarily to work-around 3d<->main thread deadlocks on OSX
+     * in case of async completion, the command is coppied to the allocated buffer,
+     * freeded on command completion
+     * can be used for "notification" commands, when client is not interested in command result,
+     * that must synchronize with 3D backend only when some 3D data is displayed.
+     * The routine does NOT provide any info on whether command is processed asynchronously or not */
+    int crCtlSubmitSyncIfHasDataForScreen(uint32_t u32ScreenID, struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd);
 #endif
+
 private:
     static void InvalidateAndUpdateEMT(Display *pDisplay, unsigned uId, bool fUpdateAll);
     static int  drawToScreenEMT(Display *pDisplay, ULONG aScreenId, BYTE *address, ULONG x, ULONG y, ULONG width, ULONG height);
diff --git a/src/VBox/Main/src-all/ExtPackManagerImpl.cpp b/src/VBox/Main/src-all/ExtPackManagerImpl.cpp
index 7fcc55c..2ad3d4e 100644
--- a/src/VBox/Main/src-all/ExtPackManagerImpl.cpp
+++ b/src/VBox/Main/src-all/ExtPackManagerImpl.cpp
@@ -793,6 +793,13 @@ HRESULT ExtPack::initWithDir(VBOXEXTPACKCTX a_enmContext, const char *a_pszName,
     m->fMadeReadyCall               = false;
 
     /*
+     * Make sure the SUPR3Hardened API works (ignoring errors for now).
+     */
+    int rc = SUPR3HardenedVerifyInit();
+    if (RT_FAILURE(rc))
+        LogRel(("SUPR3HardenedVerifyInit failed: %Rrc\n", rc));
+
+    /*
      * Probe the extension pack (this code is shared with refresh()).
      */
     probeAndLoad();
diff --git a/src/VBox/Main/src-all/Global.cpp b/src/VBox/Main/src-all/Global.cpp
index fdfac74..f28113e 100644
--- a/src/VBox/Main/src-all/Global.cpp
+++ b/src/VBox/Main/src-all/Global.cpp
@@ -110,11 +110,11 @@ const Global::OSType Global::sOSTypes[] =
        2048,128, 25 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
         StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_HDA  },
     { "Windows", "Microsoft Windows", "Windows81",          "Windows 8.1 (32 bit)",
-      VBOXOSTYPE_Win8,             VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET | VBOXOSHINT_PAE,
+      VBOXOSTYPE_Win81,            VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET | VBOXOSHINT_PAE,
        1024,128, 25 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
         StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_HDA  },
     { "Windows", "Microsoft Windows", "Windows81_64",       "Windows 8.1 (64 bit)",
-      VBOXOSTYPE_Win8_x64,        VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET,
+      VBOXOSTYPE_Win81_x64,       VBOXOSHINT_64BIT | VBOXOSHINT_HWVIRTEX | VBOXOSHINT_IOAPIC | VBOXOSHINT_USBTABLET,
        2048,128, 25 * _1G64, NetworkAdapterType_I82540EM, 0, StorageControllerType_PIIX4, StorageBus_IDE,
         StorageControllerType_IntelAhci, StorageBus_SATA, ChipsetType_PIIX3, AudioControllerType_HDA  },
     { "Windows", "Microsoft Windows", "Windows2012_64",     "Windows 2012 (64 bit)",
diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp
index d0c74c2..60f6014 100644
--- a/src/VBox/Main/src-client/ConsoleImpl.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl.cpp
@@ -87,6 +87,7 @@
 #include <iprt/process.h>
 #include <iprt/string.h>
 #include <iprt/system.h>
+#include <iprt/base64.h>
 
 #include <VBox/vmm/vmapi.h>
 #include <VBox/vmm/vmm.h>
@@ -4376,6 +4377,306 @@ DisplayMouseInterface *Console::getDisplayMouseInterface()
 }
 
 /**
+ * Parses one key value pair.
+ *
+ * @returns VBox status code.
+ * @param   psz     Configuration string.
+ * @param   ppszEnd Where to store the pointer to the string following the key value pair.
+ * @param   ppszKey Where to store the key on success.
+ * @param   ppszVal Where to store the value on success.
+ */
+int Console::consoleParseKeyValue(const char *psz, const char **ppszEnd,
+                                  char **ppszKey, char **ppszVal)
+{
+    int rc = VINF_SUCCESS;
+    const char *pszKeyStart = psz;
+    const char *pszValStart = NULL;
+    size_t cchKey = 0;
+    size_t cchVal = 0;
+
+    while (   *psz != '='
+           && *psz)
+        psz++;
+
+    /* End of string at this point is invalid. */
+    if (*psz == '\0')
+        return VERR_INVALID_PARAMETER;
+
+    cchKey = psz - pszKeyStart;
+    psz++; /* Skip = character */
+    pszValStart = psz;
+
+    while (   *psz != ','
+           && *psz != '\n'
+           && *psz != '\r'
+           && *psz)
+        psz++;
+
+    cchVal = psz - pszValStart;
+
+    if (cchKey && cchVal)
+    {
+        *ppszKey = RTStrDupN(pszKeyStart, cchKey);
+        if (*ppszKey)
+        {
+            *ppszVal = RTStrDupN(pszValStart, cchVal);
+            if (!*ppszVal)
+            {
+                RTStrFree(*ppszKey);
+                rc = VERR_NO_MEMORY;
+            }
+        }
+        else
+            rc = VERR_NO_MEMORY;
+    }
+    else
+        rc = VERR_INVALID_PARAMETER;
+
+    if (RT_SUCCESS(rc))
+        *ppszEnd = psz;
+
+    return rc;
+}
+
+/**
+ * Configures the encryption support for the disk identified by the gien UUID with
+ * the given key.
+ *
+ * @returns COM status code.
+ * @param   pszUuid   The UUID of the disk to configure encryption for.
+ * @param   pbKey     The key to use
+ * @param   cbKey     Size of the key in bytes.
+ */
+HRESULT Console::configureEncryptionForDisk(const char *pszUuid, const uint8_t *pbKey, size_t cbKey)
+{
+    HRESULT hrc = S_OK;
+    SafeIfaceArray<IMediumAttachment> sfaAttachments;
+
+    AutoCaller autoCaller(this);
+    AssertComRCReturnRC(autoCaller.rc());
+
+    /* Get the VM - must be done before the read-locking. */
+    SafeVMPtr ptrVM(this);
+    if (!ptrVM.isOk())
+        return ptrVM.rc();
+
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+    hrc = mMachine->COMGETTER(MediumAttachments)(ComSafeArrayAsOutParam(sfaAttachments));
+    if (FAILED(hrc))
+        return hrc;
+
+    /* Find the correct attachment. */
+    for (unsigned i = 0; i < sfaAttachments.size(); i++)
+    {
+        const ComPtr<IMediumAttachment> &pAtt = sfaAttachments[i];
+        ComPtr<IMedium> pMedium;
+        ComPtr<IMedium> pBase;
+        Bstr uuid;
+
+        hrc = pAtt->COMGETTER(Medium)(pMedium.asOutParam());
+        if (FAILED(hrc))
+            break;
+
+        /* Skip non hard disk attachments. */
+        if (pMedium.isNull())
+            continue;
+
+        /* Get the UUID of the base medium and compare. */
+        hrc = pMedium->COMGETTER(Base)(pBase.asOutParam());
+        if (FAILED(hrc))
+            break;
+
+        hrc = pBase->COMGETTER(Id)(uuid.asOutParam());
+        if (FAILED(hrc))
+            break;
+
+        if (!RTUuidCompare2Strs(Utf8Str(uuid).c_str(), pszUuid))
+        {
+            /*
+             * Found the matching medium, query storage controller, port and device
+             * to identify the correct driver.
+             */
+            ComPtr<IStorageController> pStorageCtrl;
+            Bstr storageCtrlName;
+            LONG lPort, lDev;
+            ULONG ulStorageCtrlInst;
+
+            hrc = pAtt->COMGETTER(Controller)(storageCtrlName.asOutParam());
+            if (FAILED(hrc))
+                break;
+
+            hrc = pAtt->COMGETTER(Port)(&lPort);
+            if (FAILED(hrc))
+                break;
+
+            hrc = pAtt->COMGETTER(Device)(&lDev);
+            if (FAILED(hrc))
+                break;
+
+            hrc = mMachine->GetStorageControllerByName(storageCtrlName.raw(), pStorageCtrl.asOutParam());
+            if (FAILED(hrc))
+                break;
+
+            hrc = pStorageCtrl->COMGETTER(Instance)(&ulStorageCtrlInst);
+            if (FAILED(hrc))
+                break;
+
+            StorageControllerType_T enmCtrlType;
+            hrc = pStorageCtrl->COMGETTER(ControllerType)(&enmCtrlType);
+            AssertComRC(hrc);
+            const char *pcszDevice = convertControllerTypeToDev(enmCtrlType);
+
+            StorageBus_T enmBus;
+            hrc = pStorageCtrl->COMGETTER(Bus)(&enmBus);
+            AssertComRC(hrc);
+
+            unsigned uLUN;
+            hrc = Console::convertBusPortDeviceToLun(enmBus, lPort, lDev, uLUN);
+            AssertComRCReturnRC(hrc);
+
+            PPDMIBASE pIBase = NULL;
+            PPDMIMEDIA pIMedium = NULL;
+            int rc = PDMR3QueryDriverOnLun(ptrVM.rawUVM(), pcszDevice, ulStorageCtrlInst, uLUN, "VD", &pIBase);
+            if (RT_SUCCESS(rc))
+            {
+                if (pIBase)
+                {
+                    pIMedium = (PPDMIMEDIA)pIBase->pfnQueryInterface(pIBase, PDMIMEDIA_IID);
+                    if (!pIMedium)
+                        return setError(E_FAIL, tr("could not query medium interface of controller"));
+                }
+                else
+                    return setError(E_FAIL, tr("could not query base interface of controller"));
+            }
+
+            rc = pIMedium->pfnSetKey(pIMedium, pbKey, cbKey);
+            if (RT_FAILURE(rc))
+                return setError(E_FAIL, tr("Failed to set the encryption key (%Rrc)"), rc);
+        }
+    }
+
+    return hrc;
+}
+
+/**
+ * Parses the encryption configuration for one disk.
+ *
+ * @returns Pointer to the string following encryption configuration.
+ * @param   psz    Pointer to the configuration for the encryption of one disk.
+ */
+HRESULT Console::consoleParseDiskEncryption(const char *psz, const char **ppszEnd)
+{
+    char *pszUuid = NULL;
+    char *pszKeyEnc = NULL;
+    int rc = VINF_SUCCESS;
+    HRESULT hrc = S_OK;
+
+    while (   *psz
+           && RT_SUCCESS(rc))
+    {
+        char *pszKey = NULL;
+        char *pszVal = NULL;
+        const char *pszEnd = NULL;
+
+        rc = consoleParseKeyValue(psz, &pszEnd, &pszKey, &pszVal);
+        if (RT_SUCCESS(rc))
+        {
+            if (!RTStrCmp(pszKey, "uuid"))
+                pszUuid = pszVal;
+            else if (!RTStrCmp(pszKey, "dek"))
+                pszKeyEnc = pszVal;
+            else
+                rc = VERR_INVALID_PARAMETER;
+
+            RTStrFree(pszKey);
+
+            if (*pszEnd == ',')
+                psz = pszEnd + 1;
+            else
+            {
+                /*
+                 * End of the configuration for the current disk, skip linefeed and
+                 * carriage returns.
+                 */
+                while (   *pszEnd == '\n'
+                       || *pszEnd == '\r')
+                    pszEnd++;
+
+                psz = pszEnd;
+                break; /* Stop parsing */
+            }
+
+        }
+    }
+
+    if (   RT_SUCCESS(rc)
+        && pszUuid
+        && pszKeyEnc)
+    {
+        ssize_t cbKey = 0;
+
+        /* Decode the key. */
+        cbKey = RTBase64DecodedSize(pszKeyEnc, NULL);
+        if (cbKey != -1)
+        {
+            uint8_t *pbKey = (uint8_t *)RTMemLockedAlloc(cbKey);
+            if (pbKey)
+            {
+                rc = RTBase64Decode(pszKeyEnc, pbKey, cbKey, NULL, NULL);
+                if (RT_SUCCESS(rc))
+                    hrc = configureEncryptionForDisk(pszUuid, pbKey, cbKey);
+                else
+                    hrc = setError(E_FAIL,
+                                   tr("Failed to decode the key (%Rrc)"),
+                                   rc);
+
+                RTMemWipeThoroughly(pbKey, cbKey, 10 /* cMinPasses */);
+                RTMemLockedFree(pbKey);
+            }
+            else
+                hrc = setError(E_FAIL,
+                               tr("Failed to allocate secure memory for the key"));
+        }
+        else
+            hrc = setError(E_FAIL,
+                           tr("The base64 encoding of the passed key is incorrect"));
+    }
+    else if (RT_SUCCESS(rc))
+        hrc = setError(E_FAIL,
+                       tr("The encryption configuration is incomplete"));
+
+    if (pszUuid)
+        RTStrFree(pszUuid);
+    if (pszKeyEnc)
+    {
+        RTMemWipeThoroughly(pszKeyEnc, strlen(pszKeyEnc), 10 /* cMinPasses */);
+        RTStrFree(pszKeyEnc);
+    }
+
+    if (ppszEnd)
+        *ppszEnd = psz;
+
+    return hrc;
+}
+
+HRESULT Console::setDiskEncryptionKeys(const Utf8Str &strCfg)
+{
+    HRESULT hrc = S_OK;
+    const char *pszCfg = strCfg.c_str();
+
+    while (   *pszCfg
+           && SUCCEEDED(hrc))
+    {
+        const char *pszNext = NULL;
+        hrc = consoleParseDiskEncryption(pszCfg, &pszNext);
+        pszCfg = pszNext;
+    }
+
+    return hrc;
+}
+
+/**
  * Process a network adaptor change.
  *
  * @returns COM status code.
@@ -8581,6 +8882,16 @@ Console::setVMRuntimeErrorCallback(PUVM pUVM, void *pvUser, uint32_t fFlags,
     LogRel(("Console: VM runtime error: fatal=%RTbool, errorID=%s message=\"%s\"\n",
             fFatal, pszErrorId, message.c_str()));
 
+    /* Set guest property if the reason of the error is a missing DEK for a disk. */
+    if (!RTStrCmp(pszErrorId, "DrvVD_DEKMISSING"))
+    {
+        that->mMachine->DeleteGuestProperty(Bstr("/VirtualBox/HostInfo/DekMissing").raw());
+        that->mMachine->SetGuestProperty(Bstr("/VirtualBox/HostInfo/DekMissing").raw(),
+                                         Bstr("1").raw(), Bstr("RDONLYGUEST").raw());
+        that->mMachine->SaveSettings();
+    }
+
+
     that->onRuntimeError(BOOL(fFatal), Bstr(pszErrorId).raw(), Bstr(message).raw());
 
     LogFlowFuncLeave(); NOREF(pUVM);
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 78feac8..30f92fa 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -3920,6 +3920,26 @@ int Console::configMedium(PCFGMNODE pLunL0,
                 InsertConfigString(pLunL1, "Driver", "VD");
                 InsertConfigNode(pLunL1, "Config", &pCfg);
 
+# ifdef VBOX_WITH_EXTPACK
+                static const Utf8Str strExtPackPuel("Oracle VM VirtualBox Extension Pack");
+                static const char *s_pszVDPlugin = "VDPluginCrypt";
+                if (mptrExtPackManager->isExtPackUsable(strExtPackPuel.c_str()))
+                {
+                    /* Configure loading the VDPlugin. */
+                    PCFGMNODE pCfgPlugins = NULL;
+                    PCFGMNODE pCfgPlugin = NULL;
+                    Utf8Str strPlugin;
+                    hrc = mptrExtPackManager->getLibraryPathForExtPack(s_pszVDPlugin, &strExtPackPuel, &strPlugin);
+                    // Don't fail, this is optional!
+                    if (SUCCEEDED(hrc))
+                    {
+                        InsertConfigNode(pCfg, "Plugins", &pCfgPlugins);
+                        InsertConfigNode(pCfgPlugins, s_pszVDPlugin, &pCfgPlugin);
+                        InsertConfigString(pCfgPlugin, "Path", strPlugin.c_str());
+                    }
+                }
+# endif
+
                 hrc = pMedium->COMGETTER(Location)(bstr.asOutParam());                      H();
                 InsertConfigString(pCfg, "Path", bstr);
 
diff --git a/src/VBox/Main/src-client/DisplayImpl.cpp b/src/VBox/Main/src-client/DisplayImpl.cpp
index 2350ee5..0e62d43 100644
--- a/src/VBox/Main/src-client/DisplayImpl.cpp
+++ b/src/VBox/Main/src-client/DisplayImpl.cpp
@@ -32,6 +32,7 @@
 #include <iprt/asm.h>
 #include <iprt/time.h>
 #include <iprt/cpp/utils.h>
+#include <iprt/alloca.h>
 
 #include <VBox/vmm/pdmdrv.h>
 #if defined(DEBUG) || defined(VBOX_STRICT) /* for VM_ASSERT_EMT(). */
@@ -151,6 +152,8 @@ HRESULT Display::FinalConstruct()
 
 #ifdef VBOX_WITH_CRHGSMI
     mhCrOglSvc = NULL;
+    rc = RTCritSectRwInit(&mCrOglLock);
+    AssertRC(rc);
 #endif
 #ifdef VBOX_WITH_CROGL
     RT_ZERO(mCrOglCallbacks);
@@ -181,6 +184,14 @@ void Display::FinalRelease()
         RTCritSectDelete(&mSaveSeamlessRectLock);
         RT_ZERO(mSaveSeamlessRectLock);
     }
+
+#ifdef VBOX_WITH_CRHGSMI
+    if (RTCritSectRwIsInitialized (&mCrOglLock))
+    {
+        RTCritSectRwDelete (&mCrOglLock);
+        RT_ZERO(mCrOglLock);
+    }
+#endif
     BaseFinalRelease();
 }
 
@@ -323,7 +334,8 @@ Display::displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser)
             VMMDev *pVMMDev = that->mParent->getVMMDev();
             if (pVMMDev)
             {
-                VBOX_DISPLAY_SAVESCREENSHOT_DATA *pScreenshot = (VBOX_DISPLAY_SAVESCREENSHOT_DATA*)RTMemAllocZ(sizeof (*pScreenshot));
+                VBOX_DISPLAY_SAVESCREENSHOT_DATA *pScreenshot =
+                    (VBOX_DISPLAY_SAVESCREENSHOT_DATA*)RTMemAllocZ(sizeof (*pScreenshot));
                 if (pScreenshot)
                 {
                     /* screen id or CRSCREEN_ALL to specify all enabled */
@@ -337,13 +349,15 @@ Display::displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser)
                     pScreenshot->Base.pfnScreenshotPerform = displaySaveScreenshotReport;
                     pScreenshot->Base.pfnScreenshotEnd = NULL;
 
-                    VBOXHGCMSVCPARM parm;
+                    VBOXCRCMDCTL_HGCM data;
+                    data.Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                    data.Hdr.u32Function = SHCRGL_HOST_FN_TAKE_SCREENSHOT;
 
-                    parm.type = VBOX_HGCM_SVC_PARM_PTR;
-                    parm.u.pointer.addr = &pScreenshot->Base;
-                    parm.u.pointer.size = sizeof (pScreenshot->Base);
+                    data.aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+                    data.aParms[0].u.pointer.addr = &pScreenshot->Base;
+                    data.aParms[0].u.pointer.size = sizeof (pScreenshot->Base);
 
-                    int rc = pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_TAKE_SCREENSHOT, 1, &parm);
+                    int rc = that->crCtlSubmitSync(&data.Hdr, sizeof (data));
                     if (RT_SUCCESS(rc))
                     {
                         if (pScreenshot->pu8PNG)
@@ -620,6 +634,7 @@ HRESULT Display::init(Console *aParent)
         RT_ZERO(maFramebuffers[ul].pendingResize);
 #ifdef VBOX_WITH_HGSMI
         maFramebuffers[ul].fVBVAEnabled = false;
+        maFramebuffers[ul].fRenderThreadMode = false;
         maFramebuffers[ul].cVBVASkipUpdate = 0;
         RT_ZERO(maFramebuffers[ul].vbvaSkippedRect);
         maFramebuffers[ul].pVBVAHostFlags = NULL;
@@ -721,6 +736,12 @@ int Display::registerSSM(PUVM pUVM)
     return VINF_SUCCESS;
 }
 
+DECLCALLBACK(void) Display::displayCrCmdFree(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, int rc, void *pvCompletion)
+{
+    Assert(pvCompletion);
+    RTMemFree(pvCompletion);
+}
+
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
 int Display::crOglWindowsShow(bool fShow)
 {
@@ -745,16 +766,27 @@ int Display::crOglWindowsShow(bool fShow)
         return VERR_INVALID_STATE;
     }
 
-    VBOXHGCMSVCPARM parm;
+    VBOXCRCMDCTL_HGCM *pData = (VBOXCRCMDCTL_HGCM*)RTMemAlloc(sizeof (VBOXCRCMDCTL_HGCM));
+    if (!pData)
+    {
+        AssertMsgFailed(("RTMemAlloc failed\n"));
+        return VERR_NO_MEMORY;
+    }
+
+    pData->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+    pData->Hdr.u32Function = SHCRGL_HOST_FN_WINDOWS_SHOW;
 
-    parm.type = VBOX_HGCM_SVC_PARM_32BIT;
-    parm.u.uint32 = (uint32_t)fShow;
+    pData->aParms[0].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[0].u.uint32 = (uint32_t)fShow;
 
-    int rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_WINDOWS_SHOW, &parm, NULL, NULL);
+    int rc = crCtlSubmit(&pData->Hdr, sizeof (*pData), displayCrCmdFree, pData);
     if (RT_SUCCESS(rc))
         mfCrOglDataHidden = !fShow;
     else
-        AssertMsgFailed(("hgcmHostFastCallAsync failed rc %n", rc));
+    {
+        AssertMsgFailed(("crCtlSubmit failed rc %d\n", rc));
+        RTMemFree(pData);
+    }
 
     return rc;
 }
@@ -837,6 +869,9 @@ static int callFramebufferResize (IFramebuffer *pFramebuffer, unsigned uScreenId
 int Display::notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM)
 {
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
+    if (maFramebuffers[pScreen->u32ViewIndex].fRenderThreadMode)
+        return VINF_SUCCESS; /* nop it */
+
     BOOL is3denabled;
     mParent->machine()->COMGETTER(Accelerate3DEnabled)(&is3denabled);
 
@@ -848,20 +883,26 @@ int Display::notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN
             VMMDev *pVMMDev = mParent->getVMMDev();
             if (pVMMDev)
             {
-                CRVBOXHGCMDEVRESIZE *pData = (CRVBOXHGCMDEVRESIZE*)RTMemAlloc(sizeof (*pData));
-                if (pData)
+                VBOXCRCMDCTL_HGCM *pCtl =
+                    (VBOXCRCMDCTL_HGCM*)RTMemAlloc(sizeof (CRVBOXHGCMDEVRESIZE) + sizeof (VBOXCRCMDCTL_HGCM));
+                if (pCtl)
                 {
+                    CRVBOXHGCMDEVRESIZE *pData = (CRVBOXHGCMDEVRESIZE*)(pCtl+1);
                     pData->Screen = *pScreen;
                     pData->pvVRAM = pvVRAM;
 
-                    VBOXHGCMSVCPARM parm;
-
-                    parm.type = VBOX_HGCM_SVC_PARM_PTR;
-                    parm.u.pointer.addr = pData;
-                    parm.u.pointer.size = sizeof (*pData);
+                    pCtl->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                    pCtl->Hdr.u32Function = SHCRGL_HOST_FN_DEV_RESIZE;
+                    pCtl->aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+                    pCtl->aParms[0].u.pointer.addr = pData;
+                    pCtl->aParms[0].u.pointer.size = sizeof (*pData);
 
-                    rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_DEV_RESIZE, &parm, displayCrAsyncCmdCompletion, this);
-                    AssertRC(rc);
+                    rc = crCtlSubmit(&pCtl->Hdr, sizeof (*pCtl), displayCrCmdFree, pCtl);
+                    if (!RT_SUCCESS(rc))
+                    {
+                        AssertMsgFailed(("crCtlSubmit failed rc %d\n", rc));
+                        RTMemFree(pCtl);
+                    }
                 }
                 else
                     rc = VERR_NO_MEMORY;
@@ -978,7 +1019,7 @@ int Display::handleDisplayResize (unsigned uScreenId, uint32_t bpp, void *pvVRAM
     AssertRelease(!maFramebuffers[uScreenId].pendingResize.fPending);
 
     /* The method also unlocks the framebuffer. */
-    handleResizeCompletedEMT();
+    handleResizeCompletedEMT(TRUE);
 
     return VINF_SUCCESS;
 }
@@ -989,7 +1030,7 @@ int Display::handleDisplayResize (unsigned uScreenId, uint32_t bpp, void *pvVRAM
  *
  *  @thread EMT
  */
-void Display::handleResizeCompletedEMT (void)
+void Display::handleResizeCompletedEMT(BOOL fResizeContext)
 {
     LogRelFlowFunc(("\n"));
 
@@ -1106,23 +1147,17 @@ void Display::handleResizeCompletedEMT (void)
 
             if (is3denabled)
             {
-                VBOXHGCMSVCPARM parm;
+                VBOXCRCMDCTL_HGCM data;
+                data.Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                data.Hdr.u32Function = SHCRGL_HOST_FN_SCREEN_CHANGED;
 
-                parm.type = VBOX_HGCM_SVC_PARM_32BIT;
-                parm.u.uint32 = uScreenId;
+                data.aParms[0].type = VBOX_HGCM_SVC_PARM_32BIT;
+                data.aParms[0].u.uint32 = uScreenId;
 
-                VMMDev *pVMMDev = mParent->getVMMDev();
-                if (pVMMDev)
-                {
-#if 0
-                    if (mhCrOglSvc)
-                        pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_SCREEN_CHANGED, &parm, NULL, NULL);
-                    else
-                        AssertMsgFailed(("mhCrOglSvc is NULL\n"));
-#else
-                    pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_SCREEN_CHANGED, SHCRGL_CPARMS_SCREEN_CHANGED, &parm);
-#endif
-                }
+                if (fResizeContext)
+                    crCtlSubmitAsyncCmdCopy(&data.Hdr, sizeof (data));
+                else
+                    crCtlSubmitSync(&data.Hdr, sizeof (data));
             }
         }
 #endif /* VBOX_WITH_CROGL */
@@ -1440,19 +1475,26 @@ int Display::handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect)
     {
         if (mhCrOglSvc)
         {
-            RTRECT *pRectsCopy = (RTRECT *)RTMemAlloc(  RT_MAX(cRect, 1)
-                                                             * sizeof (RTRECT));
-            if (pRectsCopy)
+            VBOXCRCMDCTL_HGCM *pCtl = (VBOXCRCMDCTL_HGCM*)RTMemAlloc(RT_MAX(cRect, 1) * sizeof (RTRECT)
+                    + sizeof (VBOXCRCMDCTL_HGCM));
+            if (pCtl)
             {
+                RTRECT *pRectsCopy = (RTRECT*)(pCtl+1);
                 memcpy(pRectsCopy, pRect, cRect * sizeof (RTRECT));
 
-                VBOXHGCMSVCPARM parm;
+                pCtl->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                pCtl->Hdr.u32Function = SHCRGL_HOST_FN_SET_VISIBLE_REGION;
 
-                parm.type = VBOX_HGCM_SVC_PARM_PTR;
-                parm.u.pointer.addr = pRectsCopy;
-                parm.u.pointer.size = cRect * sizeof (RTRECT);
+                pCtl->aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+                pCtl->aParms[0].u.pointer.addr = pRectsCopy;
+                pCtl->aParms[0].u.pointer.size = cRect * sizeof (RTRECT);
 
-                vmmDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_SET_VISIBLE_REGION, &parm, displayCrAsyncCmdCompletion, this);
+                int rc = crCtlSubmit(&pCtl->Hdr, sizeof (*pCtl), displayCrCmdFree, pCtl);
+                if (!RT_SUCCESS(rc))
+                {
+                    AssertMsgFailed(("crCtlSubmit failed rc %d\n", rc));
+                    RTMemFree(pCtl);
+                }
             }
             else
                 AssertMsgFailed(("failed to allocate rects memory\n"));
@@ -2403,27 +2445,16 @@ STDMETHODIMP Display::SetFramebuffer(ULONG aScreenId, IFramebuffer *aFramebuffer
 
             if (is3denabled)
             {
-                VBOXHGCMSVCPARM parm;
-
-                parm.type = VBOX_HGCM_SVC_PARM_32BIT;
-                parm.u.uint32 = aScreenId;
+                VBOXCRCMDCTL_HGCM data;
+                data.Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                data.Hdr.u32Function = SHCRGL_HOST_FN_SCREEN_CHANGED;
 
-                VMMDev *pVMMDev = mParent->getVMMDev();
+                data.aParms[0].type = VBOX_HGCM_SVC_PARM_32BIT;
+                data.aParms[0].u.uint32 = aScreenId;
 
                 alock.release();
 
-                if (pVMMDev)
-                {
-#if 0
-                    if (mhCrOglSvc)
-                        pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_SCREEN_CHANGED, &parm, NULL, NULL);
-                    else
-                        AssertMsgFailed(("mhCrOglSvc is NULL\n"));
-#else
-                    pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_SCREEN_CHANGED, SHCRGL_CPARMS_SCREEN_CHANGED, &parm);
-#endif
-                }
-                /*ComAssertRCRet (vrc, E_FAIL);*/
+                crCtlSubmitSync(&data.Hdr, sizeof (data));
 
                 alock.acquire();
             }
@@ -2553,18 +2584,26 @@ STDMETHODIMP Display::SetSeamlessMode (BOOL enabled)
         VMMDev *vmmDev = mParent->getVMMDev();
         if (is3denabled && vmmDev)
         {
-            VBOXHGCMSVCPARM parm;
+            VBOXCRCMDCTL_HGCM *pData = (VBOXCRCMDCTL_HGCM*)RTMemAlloc(sizeof (VBOXCRCMDCTL_HGCM));
+            if (!pData)
+            {
+                AssertMsgFailed(("RTMemAlloc failed\n"));
+                return VERR_NO_MEMORY;
+            }
 
-            parm.type = VBOX_HGCM_SVC_PARM_PTR;
-            /* NULL means disable */
-            parm.u.pointer.addr = NULL;
-            parm.u.pointer.size = 0;  /* <- means null rects, NULL pRects address and 0 rects means "disable" */
+            pData->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+            pData->Hdr.u32Function = SHCRGL_HOST_FN_SET_VISIBLE_REGION;
 
-            if (mhCrOglSvc)
-                vmmDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_SET_VISIBLE_REGION, &parm, NULL, NULL);
-            else
-                AssertMsgFailed(("mhCrOglSvc is NULL\n"));
+            pData->aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+            pData->aParms[0].u.pointer.addr = NULL;
+            pData->aParms[0].u.pointer.size = 0; /* <- means null rects, NULL pRects address and 0 rects means "disable" */
 
+            int rc = crCtlSubmit(&pData->Hdr, sizeof (*pData), displayCrCmdFree, pData);
+            if (!RT_SUCCESS(rc))
+            {
+                AssertMsgFailed(("crCtlSubmit failed rc %d\n", rc));
+                RTMemFree(pData);
+            }
         }
     }
 #endif
@@ -2572,7 +2611,8 @@ STDMETHODIMP Display::SetSeamlessMode (BOOL enabled)
 }
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
-BOOL Display::displayCheckTakeScreenshotCrOgl(Display *pDisplay, ULONG aScreenId, uint8_t *pu8Data, uint32_t u32Width, uint32_t u32Height)
+BOOL Display::displayCheckTakeScreenshotCrOgl(Display *pDisplay, ULONG aScreenId, uint8_t *pu8Data,
+                                              uint32_t u32Width, uint32_t u32Height)
 {
     BOOL is3denabled;
     pDisplay->mParent->machine()->COMGETTER(Accelerate3DEnabled)(&is3denabled);
@@ -2595,13 +2635,15 @@ BOOL Display::displayCheckTakeScreenshotCrOgl(Display *pDisplay, ULONG aScreenId
                 pScreenshot->pfnScreenshotPerform = NULL;
                 pScreenshot->pfnScreenshotEnd = NULL;
 
-                VBOXHGCMSVCPARM parm;
+                VBOXCRCMDCTL_HGCM data;
+                data.Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                data.Hdr.u32Function = SHCRGL_HOST_FN_TAKE_SCREENSHOT;
 
-                parm.type = VBOX_HGCM_SVC_PARM_PTR;
-                parm.u.pointer.addr = pScreenshot;
-                parm.u.pointer.size = sizeof (*pScreenshot);
+                data.aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+                data.aParms[0].u.pointer.addr = pScreenshot;
+                data.aParms[0].u.pointer.size = sizeof (*pScreenshot);
 
-                int rc = pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_TAKE_SCREENSHOT, 1, &parm);
+                int rc = pDisplay->crCtlSubmitSync(&data.Hdr, sizeof (data));
 
                 RTMemFree(pScreenshot);
 
@@ -3456,7 +3498,7 @@ STDMETHODIMP Display::ResizeCompleted(ULONG aScreenId)
 STDMETHODIMP Display::CompleteVHWACommand(BYTE *pCommand)
 {
 #ifdef VBOX_WITH_VIDEOHWACCEL
-    mpDrv->pVBVACallbacks->pfnVHWACommandCompleteAsynch(mpDrv->pVBVACallbacks, (PVBOXVHWACMD)pCommand);
+    mpDrv->pVBVACallbacks->pfnVHWACommandCompleteAsync(mpDrv->pVBVACallbacks, (PVBOXVHWACMD)pCommand);
     return S_OK;
 #else
     return E_NOTIMPL;
@@ -3478,13 +3520,8 @@ STDMETHODIMP Display::ViewportChanged(ULONG aScreenId, ULONG x, ULONG y, ULONG w
 
     if (is3denabled)
     {
-        VMMDev *pVMMDev = mParent->getVMMDev();
-
-        if (pVMMDev)
-        {
-            crViewportNotify(pVMMDev, aScreenId, x, y, width, height);
-        }
-        else
+        int rc = crViewportNotify(aScreenId, x, y, width, height);
+        if (RT_FAILURE(rc))
         {
             DISPLAYFBINFO *pFb = &maFramebuffers[aScreenId];
             pFb->pendingViewportInfo.fPending = true;
@@ -3581,50 +3618,34 @@ int Display::updateDisplayData(void)
 }
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
-void Display::crViewportNotify(VMMDev *pVMMDev, ULONG aScreenId, ULONG x, ULONG y, ULONG width, ULONG height)
+int Display::crViewportNotify(ULONG aScreenId, ULONG x, ULONG y, ULONG width, ULONG height)
 {
-#if 0
-    VBOXHGCMSVCPARM parm;
-
-    CRVBOXHGCMVIEWPORT *pViewportInfo = (CRVBOXHGCMVIEWPORT*)RTMemAlloc(sizeof (*pViewportInfo));
-    if(!pViewportInfo)
-    {
-        AssertMsgFailed(("RTMemAlloc failed!\n"));
-        return;
-    }
-
-    pViewportInfo->u32Screen = aScreenId;
-    pViewportInfo->x = x;
-    pViewportInfo->y = y;
-    pViewportInfo->width = width;
-    pViewportInfo->height = height;
-
-    parm.type = VBOX_HGCM_SVC_PARM_PTR;
-    parm.u.pointer.addr = pViewportInfo;
-    parm.u.pointer.size = sizeof (*pViewportInfo);
+    VMMDev *pVMMDev = mParent->getVMMDev();
+    if (!pVMMDev)
+        return VERR_INVALID_STATE;
 
-    pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_VIEWPORT_CHANGED2, &parm, displayCrAsyncCmdCompletion, this);
-#else
-    VBOXHGCMSVCPARM aParms[5];
+    size_t cbData = RT_UOFFSETOF(VBOXCRCMDCTL_HGCM, aParms[5]);
+    VBOXCRCMDCTL_HGCM *pData = (VBOXCRCMDCTL_HGCM*)alloca(cbData);
 
-    aParms[0].type = VBOX_HGCM_SVC_PARM_32BIT;
-    aParms[0].u.uint32 = aScreenId;
+    pData->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+    pData->Hdr.u32Function = SHCRGL_HOST_FN_VIEWPORT_CHANGED;
 
-    aParms[1].type = VBOX_HGCM_SVC_PARM_32BIT;
-    aParms[1].u.uint32 = x;
+    pData->aParms[0].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[0].u.uint32 = aScreenId;
 
-    aParms[2].type = VBOX_HGCM_SVC_PARM_32BIT;
-    aParms[2].u.uint32 = y;
+    pData->aParms[1].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[1].u.uint32 = x;
 
+    pData->aParms[2].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[2].u.uint32 = y;
 
-    aParms[3].type = VBOX_HGCM_SVC_PARM_32BIT;
-    aParms[3].u.uint32 = width;
+    pData->aParms[3].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[3].u.uint32 = width;
 
-    aParms[4].type = VBOX_HGCM_SVC_PARM_32BIT;
-    aParms[4].u.uint32 = height;
+    pData->aParms[4].type = VBOX_HGCM_SVC_PARM_32BIT;
+    pData->aParms[4].u.uint32 = height;
 
-    pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_VIEWPORT_CHANGED, SHCRGL_CPARMS_VIEWPORT_CHANGED, aParms);
-#endif
+    return crCtlSubmitSyncIfHasDataForScreen(aScreenId, &pData->Hdr, cbData);
 }
 #endif
 
@@ -3633,9 +3654,13 @@ void Display::setupCrHgsmiData(void)
 {
     VMMDev *pVMMDev = mParent->getVMMDev();
     Assert(pVMMDev);
-    int rc = VERR_GENERAL_FAILURE;
+    int rc = RTCritSectRwEnterExcl(&mCrOglLock);
+    AssertRC(rc);
+
     if (pVMMDev)
         rc = pVMMDev->hgcmHostSvcHandleCreate("VBoxSharedCrOpenGL", &mhCrOglSvc);
+    else
+        rc = VERR_GENERAL_FAILURE;
 
     if (RT_SUCCESS(rc))
     {
@@ -3654,33 +3679,23 @@ void Display::setupCrHgsmiData(void)
 
         rc = pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_CRHGSMI_CTL, 1, &parm);
         if (RT_SUCCESS(rc))
-        {
-            ULONG ul;
-
-            for (ul = 0; ul < mcMonitors; ul++)
-            {
-                DISPLAYFBINFO *pFb = &maFramebuffers[ul];
-                if (!pFb->pendingViewportInfo.fPending)
-                    continue;
-
-                crViewportNotify(pVMMDev, ul, pFb->pendingViewportInfo.x, pFb->pendingViewportInfo.y, pFb->pendingViewportInfo.width, pFb->pendingViewportInfo.height);
-                pFb->pendingViewportInfo.fPending = false;
-            }
-
             mCrOglCallbacks = Completion.MainInterface;
-
-            return;
-        }
-
-        AssertMsgFailed(("VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP_COMPLETION failed rc %d", rc));
+        else
+            AssertMsgFailed(("VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP_COMPLETION failed rc %d", rc));
     }
 
-    mhCrOglSvc = NULL;
+    if (RT_FAILURE(rc))
+        mhCrOglSvc = NULL;
+
+    RTCritSectRwLeaveExcl(&mCrOglLock);
 }
 
 void Display::destructCrHgsmiData(void)
 {
+    int rc = RTCritSectRwEnterExcl(&mCrOglLock);
+    AssertRC(rc);
     mhCrOglSvc = NULL;
+    RTCritSectRwLeaveExcl(&mCrOglLock);
 }
 #endif
 
@@ -3834,7 +3849,7 @@ DECLCALLBACK(void) Display::displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterf
             LogRelFlowFunc(("ResizeStatus_UpdateDisplayData %d\n", uScreenId));
             fNoUpdate = true; /* Always set it here, because pfnUpdateDisplayAll can cause a new resize. */
             /* The framebuffer was resized and display data need to be updated. */
-            pDisplay->handleResizeCompletedEMT ();
+            pDisplay->handleResizeCompletedEMT(FALSE);
             if (pFBInfo->u32ResizeStatus != ResizeStatus_Void)
             {
                 /* The resize status could be not Void here because a pending resize is issued. */
@@ -3905,24 +3920,17 @@ DECLCALLBACK(void) Display::displayRefreshCallback(PPDMIDISPLAYCONNECTOR pInterf
                     if (pDisplay->mCrOglCallbacks.pfnHasData())
                     {
                         /* submit */
+                        VBOXCRCMDCTL_HGCM *pData = &pDisplay->mCrOglScreenshotCtl;
 
-                        VBOXHGCMSVCPARM parm;
-
-                        parm.type = VBOX_HGCM_SVC_PARM_PTR;
-                        parm.u.pointer.addr = &pDisplay->mCrOglScreenshotData;
-                        parm.u.pointer.size = sizeof (pDisplay->mCrOglScreenshotData);
+                        pData->Hdr.enmType = VBOXCRCMDCTL_TYPE_HGCM;
+                        pData->Hdr.u32Function = SHCRGL_HOST_FN_TAKE_SCREENSHOT;
 
-                        VMMDev *pVMMDev = pDisplay->mParent->getVMMDev();
-                        if (pVMMDev)
-                        {
-                            int rc = pVMMDev->hgcmHostFastCallAsync(pDisplay->mhCrOglSvc, SHCRGL_HOST_FN_TAKE_SCREENSHOT, &parm, displayVRecCompletion, pDisplay);
-                            if (RT_SUCCESS(rc))
-                                break;
-                            else
-                                AssertMsgFailed(("hgcmHostFastCallAsync failed %f\n", rc));
-                        }
-                        else
-                            AssertMsgFailed(("no VMMDev\n"));
+                        pData->aParms[0].type = VBOX_HGCM_SVC_PARM_PTR;
+                        pData->aParms[0].u.pointer.addr = &pDisplay->mCrOglScreenshotData;
+                        pData->aParms[0].u.pointer.size = sizeof (pDisplay->mCrOglScreenshotData);
+                        int rc = pDisplay->crCtlSubmit(&pData->Hdr, sizeof (*pData), displayCrCmdFree, pData);
+                        if (!RT_SUCCESS(rc))
+                            AssertMsgFailed(("crCtlSubmit failed rc %d\n", rc));
                     }
 
                     /* no 3D data available, or error has occured,
@@ -4292,12 +4300,14 @@ DECLCALLBACK(int) Display::displayVHWACommandProcess(PPDMIDISPLAYCONNECTOR pInte
 #ifdef VBOX_WITH_CRHGSMI
 void Display::handleCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam)
 {
-    mpDrv->pVBVACallbacks->pfnCrHgsmiCommandCompleteAsync(mpDrv->pVBVACallbacks, (PVBOXVDMACMD_CHROMIUM_CMD)pParam->u.pointer.addr, result);
+    mpDrv->pVBVACallbacks->pfnCrHgsmiCommandCompleteAsync(mpDrv->pVBVACallbacks,
+                                                          (PVBOXVDMACMD_CHROMIUM_CMD)pParam->u.pointer.addr, result);
 }
 
 void Display::handleCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam)
 {
-    mpDrv->pVBVACallbacks->pfnCrHgsmiControlCompleteAsync(mpDrv->pVBVACallbacks, (PVBOXVDMACMD_CHROMIUM_CTL)pParam->u.pointer.addr, result);
+    PVBOXVDMACMD_CHROMIUM_CTL pCtl = (PVBOXVDMACMD_CHROMIUM_CTL)pParam->u.pointer.addr;
+    mpDrv->pVBVACallbacks->pfnCrHgsmiControlCompleteAsync(mpDrv->pVBVACallbacks, pCtl, result);
 }
 
 void Display::handleCrHgsmiCommandProcess(PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd)
@@ -4341,10 +4351,34 @@ void Display::handleCrHgsmiControlProcess(PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32
         VMMDev *pVMMDev = mParent->getVMMDev();
         if (pVMMDev)
         {
-            rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_CRHGSMI_CTL, &parm, Display::displayCrHgsmiControlCompletion, this);
+            bool fCheckPendingViewport = (pCtl->enmType == VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP);
+            rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_CRHGSMI_CTL, &parm,
+                                                Display::displayCrHgsmiControlCompletion, this);
             AssertRC(rc);
             if (RT_SUCCESS(rc))
+            {
+                if (fCheckPendingViewport)
+                {
+                    ULONG ul;
+                    for (ul = 0; ul < mcMonitors; ul++)
+                    {
+                        DISPLAYFBINFO *pFb = &maFramebuffers[ul];
+                        if (!pFb->pendingViewportInfo.fPending)
+                            continue;
+
+                        rc = crViewportNotify(ul, pFb->pendingViewportInfo.x, pFb->pendingViewportInfo.y,
+                                              pFb->pendingViewportInfo.width, pFb->pendingViewportInfo.height);
+                        if (RT_SUCCESS(rc))
+                            pFb->pendingViewportInfo.fPending = false;
+                        else
+                        {
+                            AssertMsgFailed(("crViewportNotify failed %d\n", rc));
+                            rc = VINF_SUCCESS;
+                        }
+                    }
+                }
                 return;
+            }
         }
         else
             rc = VERR_INVALID_STATE;
@@ -4354,47 +4388,53 @@ void Display::handleCrHgsmiControlProcess(PVBOXVDMACMD_CHROMIUM_CTL pCtl, uint32
     handleCrHgsmiControlCompletion(rc, SHCRGL_HOST_FN_CRHGSMI_CTL, &parm);
 }
 
-DECLCALLBACK(void) Display::displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, uint32_t cbCmd)
+DECLCALLBACK(void) Display::displayCrHgsmiCommandProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd,
+                                                         uint32_t cbCmd)
 {
     PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
 
     pDrv->pDisplay->handleCrHgsmiCommandProcess(pCmd, cbCmd);
 }
 
-DECLCALLBACK(void) Display::displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, uint32_t cbCmd)
+DECLCALLBACK(void) Display::displayCrHgsmiControlProcess(PPDMIDISPLAYCONNECTOR pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd,
+                                                         uint32_t cbCmd)
 {
     PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
 
     pDrv->pDisplay->handleCrHgsmiControlProcess(pCmd, cbCmd);
 }
 
-DECLCALLBACK(void) Display::displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext)
+DECLCALLBACK(void) Display::displayCrHgsmiCommandCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
+                                                            void *pvContext)
 {
     AssertMsgFailed(("not expected!"));
     Display *pDisplay = (Display *)pvContext;
     pDisplay->handleCrHgsmiCommandCompletion(result, u32Function, pParam);
 }
 
-DECLCALLBACK(void) Display::displayCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext)
+DECLCALLBACK(void) Display::displayCrHgsmiControlCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
+                                                            void *pvContext)
 {
     Display *pDisplay = (Display *)pvContext;
     pDisplay->handleCrHgsmiControlCompletion(result, u32Function, pParam);
+
 }
 #endif
 
 #if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
-DECLCALLBACK(void)  Display::displayCrHgcmCtlSubmitCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext)
+DECLCALLBACK(void)  Display::displayCrHgcmCtlSubmitCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam,
+                                                              void *pvContext)
 {
     VBOXCRCMDCTL *pCmd = (VBOXCRCMDCTL*)pParam->u.pointer.addr;
-    if (pCmd->pfnInternal)
-        ((PFNCRCTLCOMPLETION)pCmd->pfnInternal)(pCmd, pParam->u.pointer.size, result, pvContext);
+    if (pCmd->u.pfnInternal)
+        ((PFNCRCTLCOMPLETION)pCmd->u.pfnInternal)(pCmd, pParam->u.pointer.size, result, pvContext);
 }
 
 int  Display::handleCrHgcmCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
-                                        PFNCRCTLCOMPLETION pfnCompletion,
-                                        void *pvCompletion)
+                                    PFNCRCTLCOMPLETION pfnCompletion,
+                                    void *pvCompletion)
 {
-    VMMDev *pVMMDev = mParent->getVMMDev();
+    VMMDev *pVMMDev = mParent ? mParent->getVMMDev() : NULL;
     if (!pVMMDev)
     {
         AssertMsgFailed(("no vmmdev\n"));
@@ -4407,10 +4447,11 @@ int  Display::handleCrHgcmCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd,
     parm.u.pointer.addr = pCmd;
     parm.u.pointer.size = cbCmd;
 
-    pCmd->pfnInternal = (void(*)())pfnCompletion;
-    int rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_CTL, &parm, displayCrHgcmCtlSubmitCompletion, pvCompletion);
+    pCmd->u.pfnInternal = (void(*)())pfnCompletion;
+    int rc = pVMMDev->hgcmHostFastCallAsync(mhCrOglSvc, SHCRGL_HOST_FN_CTL, &parm, displayCrHgcmCtlSubmitCompletion,
+                                            pvCompletion);
     if (!RT_SUCCESS(rc))
-        AssertMsgFailed(("hgcmHostFastCallAsync failed rc %n", rc));
+        AssertMsgFailed(("hgcmHostFastCallAsync failed rc %d\n", rc));
 
     return rc;
 }
@@ -4425,17 +4466,71 @@ DECLCALLBACK(int)  Display::displayCrHgcmCtlSubmit(PPDMIDISPLAYCONNECTOR pInterf
     return pThis->handleCrHgcmCtlSubmit(pCmd, cbCmd, pfnCompletion, pvCompletion);
 }
 
-DECLCALLBACK(void)  Display::displayCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam, void *pvContext)
+int Display::crCtlSubmit(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd, PFNCRCTLCOMPLETION pfnCompletion, void *pvCompletion)
 {
-    Display *pDisplay = (Display *)pvContext;
-    pDisplay->handleCrAsyncCmdCompletion(result, u32Function, pParam);
+    int rc = RTCritSectRwEnterShared(&mCrOglLock);
+    if (RT_SUCCESS(rc))
+    {
+        if (mhCrOglSvc)
+            rc = mpDrv->pVBVACallbacks->pfnCrCtlSubmit(mpDrv->pVBVACallbacks, pCmd, cbCmd, pfnCompletion, pvCompletion);
+        else
+            rc = VERR_NOT_SUPPORTED;
+
+        RTCritSectRwLeaveShared(&mCrOglLock);
+    }
+    return rc;
 }
 
+int Display::crCtlSubmitSync(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd)
+{
+    int rc = RTCritSectRwEnterShared(&mCrOglLock);
+    if (RT_SUCCESS(rc))
+    {
+        if (mhCrOglSvc)
+            rc = mpDrv->pVBVACallbacks->pfnCrCtlSubmitSync(mpDrv->pVBVACallbacks, pCmd, cbCmd);
+        else
+            rc = VERR_NOT_SUPPORTED;
 
-void  Display::handleCrAsyncCmdCompletion(int32_t result, uint32_t u32Function, PVBOXHGCMSVCPARM pParam)
+        RTCritSectRwLeaveShared(&mCrOglLock);
+    }
+    return rc;
+}
+
+int Display::crCtlSubmitAsyncCmdCopy(struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd)
 {
-    if (pParam->type == VBOX_HGCM_SVC_PARM_PTR && pParam->u.pointer.addr)
-        RTMemFree(pParam->u.pointer.addr);
+    VBOXCRCMDCTL* pCmdCopy = (VBOXCRCMDCTL*)RTMemAlloc(cbCmd);
+    if (!pCmdCopy)
+    {
+        LogRel(("RTMemAlloc failed\n"));
+        return VERR_NO_MEMORY;
+    }
+
+    memcpy(pCmdCopy, pCmd, cbCmd);
+
+    int rc = crCtlSubmit(pCmdCopy, cbCmd, displayCrCmdFree, pCmdCopy);
+    if (RT_FAILURE(rc))
+    {
+        LogRel(("crCtlSubmit failed %d\n", rc));
+        RTMemFree(pCmdCopy);
+        return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+int Display::crCtlSubmitSyncIfHasDataForScreen(uint32_t u32ScreenID, struct VBOXCRCMDCTL* pCmd, uint32_t cbCmd)
+{
+    int rc = RTCritSectRwEnterShared(&mCrOglLock);
+    AssertRCReturn(rc, rc);
+
+    if (mCrOglCallbacks.pfnHasDataForScreen && mCrOglCallbacks.pfnHasDataForScreen(u32ScreenID))
+        rc = crCtlSubmitSync(pCmd, cbCmd);
+    else
+        rc = crCtlSubmitAsyncCmdCopy(pCmd, cbCmd);
+
+    RTCritSectRwLeaveShared(&mCrOglLock);
+
+    return rc;
 }
 
 bool  Display::handleCrVRecScreenshotBegin(uint32_t uScreen, uint64_t u64TimeStamp)
@@ -4507,17 +4602,26 @@ DECLCALLBACK(void)  Display::displayVRecCompletion(int32_t result, uint32_t u32F
 
 #endif
 
-
 #ifdef VBOX_WITH_HGSMI
-DECLCALLBACK(int) Display::displayVBVAEnable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags)
+DECLCALLBACK(int) Display::displayVBVAEnable(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, PVBVAHOSTFLAGS pHostFlags, bool fRenderThreadMode)
 {
     LogRelFlowFunc(("uScreenId %d\n", uScreenId));
 
     PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
     Display *pThis = pDrv->pDisplay;
 
+    if (pThis->maFramebuffers[uScreenId].fVBVAEnabled && pThis->maFramebuffers[uScreenId].fRenderThreadMode != fRenderThreadMode)
+    {
+        LogRel(("enabling different vbva mode"));
+#ifdef DEBUG_misha
+        AssertMsgFailed(("enabling different vbva mode"));
+#endif
+        return VERR_INVALID_STATE;
+    }
+
     pThis->maFramebuffers[uScreenId].fVBVAEnabled = true;
     pThis->maFramebuffers[uScreenId].pVBVAHostFlags = pHostFlags;
+    pThis->maFramebuffers[uScreenId].fRenderThreadMode = fRenderThreadMode;
 
     vbvaSetMemoryFlagsHGSMI(uScreenId, pThis->mfu32SupportedOrders, pThis->mfVideoAccelVRDP, &pThis->maFramebuffers[uScreenId]);
 
@@ -4550,6 +4654,7 @@ DECLCALLBACK(void) Display::displayVBVADisable(PPDMIDISPLAYCONNECTOR pInterface,
     }
 
     pFBInfo->fVBVAEnabled = false;
+    pFBInfo->fRenderThreadMode = false;
 
     vbvaSetMemoryFlagsHGSMI(uScreenId, 0, false, pFBInfo);
 
diff --git a/src/VBox/Main/src-client/GuestImpl.cpp b/src/VBox/Main/src-client/GuestImpl.cpp
index 41469b0..b438f9d 100644
--- a/src/VBox/Main/src-client/GuestImpl.cpp
+++ b/src/VBox/Main/src-client/GuestImpl.cpp
@@ -813,23 +813,34 @@ STDMETHODIMP Guest::SetCredentials(IN_BSTR aUserName, IN_BSTR aPassword,
     AutoCaller autoCaller(this);
     if (FAILED(autoCaller.rc())) return autoCaller.rc();
 
-    /* forward the information to the VMM device */
-    VMMDev *pVMMDev = mParent->getVMMDev();
-    if (pVMMDev)
+    /* Check for magic domain names which are used to pass encryption keys to the disk. */
+    if (Utf8Str(aDomain) == "@@disk")
+        return mParent->setDiskEncryptionKeys(Utf8Str(aPassword));
+    else if (Utf8Str(aDomain) == "@@mem")
     {
-        PPDMIVMMDEVPORT pVMMDevPort = pVMMDev->getVMMDevPort();
-        if (pVMMDevPort)
+        /** @todo */
+        return E_NOTIMPL;    
+    }
+    else
+    {
+        /* forward the information to the VMM device */
+        VMMDev *pVMMDev = mParent->getVMMDev();
+        if (pVMMDev)
         {
-            uint32_t u32Flags = VMMDEV_SETCREDENTIALS_GUESTLOGON;
-            if (!aAllowInteractiveLogon)
-                u32Flags = VMMDEV_SETCREDENTIALS_NOLOCALLOGON;
-
-            pVMMDevPort->pfnSetCredentials(pVMMDevPort,
-                                           Utf8Str(aUserName).c_str(),
-                                           Utf8Str(aPassword).c_str(),
-                                           Utf8Str(aDomain).c_str(),
-                                           u32Flags);
-            return S_OK;
+            PPDMIVMMDEVPORT pVMMDevPort = pVMMDev->getVMMDevPort();
+            if (pVMMDevPort)
+            {
+                uint32_t u32Flags = VMMDEV_SETCREDENTIALS_GUESTLOGON;
+                if (!aAllowInteractiveLogon)
+                    u32Flags = VMMDEV_SETCREDENTIALS_NOLOCALLOGON;
+    
+                pVMMDevPort->pfnSetCredentials(pVMMDevPort,
+                                               Utf8Str(aUserName).c_str(),
+                                               Utf8Str(aPassword).c_str(),
+                                               Utf8Str(aDomain).c_str(),
+                                               u32Flags);
+                return S_OK;
+            }
         }
     }
 
diff --git a/src/VBox/Main/src-client/RemoteUSBBackend.cpp b/src/VBox/Main/src-client/RemoteUSBBackend.cpp
index 83d30b1..604e530 100644
--- a/src/VBox/Main/src-client/RemoteUSBBackend.cpp
+++ b/src/VBox/Main/src-client/RemoteUSBBackend.cpp
@@ -15,7 +15,7 @@
  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
  */
 
-#define LOG_GROUP LOG_GROUP_DEV_USB
+#define LOG_GROUP LOG_GROUP_USB_REMOTE
 #include "ConsoleImpl.h"
 #include "ConsoleVRDPServer.h"
 #include "RemoteUSBBackend.h"
@@ -115,6 +115,7 @@ typedef struct _REMOTEUSBDEVICE
     volatile uint32_t hURB;            /* Source for URB's handles. */
     bool              fFailed;         /* True if an operation has failed for the device. */
     RTCRITSECT        critsect;        /* Protects the queued urb list. */
+    volatile bool     fWokenUp;        /* Flag whther the reaper was woken up. */
 } REMOTEUSBDEVICE;
 
 
@@ -276,6 +277,7 @@ static DECLCALLBACK(int) iface_Open (PREMOTEUSBBACKEND pInstance, const char *ps
         {
             /* Initialize the device structure. */
             pDevice->pOwner = pThis;
+            pDevice->fWokenUp = false;
 
             rc = RTCritSectInit(&pDevice->critsect);
             AssertRC(rc);
@@ -690,6 +692,9 @@ static DECLCALLBACK(int) iface_ReapURB (PREMOTEUSBDEVICE pDevice, uint32_t u32Mi
     {
         uint32_t u32ClientId;
 
+        if (ASMAtomicXchgBool(&pDevice->fWokenUp, false))
+            break;
+
         /* Scan queued URBs, look for completed. */
         requestDevice (pDevice);
 
@@ -783,6 +788,12 @@ static DECLCALLBACK(int) iface_ReapURB (PREMOTEUSBDEVICE pDevice, uint32_t u32Mi
     return rc;
 }
 
+static DECLCALLBACK(int) iface_Wakeup (PREMOTEUSBDEVICE pDevice)
+{
+    ASMAtomicXchgBool(&pDevice->fWokenUp, true);
+    return VINF_SUCCESS;
+}
+
 void RemoteUSBBackend::AddRef (void)
 {
     cRefs++;
@@ -976,6 +987,7 @@ RemoteUSBBackend::RemoteUSBBackend(Console *console, ConsoleVRDPServer *server,
     mCallback.pfnReapURB          = iface_ReapURB;
     mCallback.pfnClearHaltedEP    = iface_ClearHaltedEP;
     mCallback.pfnCancelURB        = iface_CancelURB;
+    mCallback.pfnWakeup           = iface_Wakeup;
 }
 
 RemoteUSBBackend::~RemoteUSBBackend()
diff --git a/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp b/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
index 21d97de..551c0dd 100644
--- a/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
+++ b/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
@@ -236,8 +236,19 @@ static RTEXITCODE CommonUninstallWorker(const char *pszExtPackDir)
         return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to construct temporary extension pack path: %Rrc", rc);
 
     rc = RTDirRename(pszExtPackDir, szExtPackUnInstDir, RTPATHRENAME_FLAGS_NO_REPLACE);
+    if (rc == VERR_ALREADY_EXISTS)
+    {
+        /* Automatic cleanup and try again.  It's in theory possible that we're
+           racing another cleanup operation here, so just ignore errors and try
+           again. (There is no installation race due to the exclusive temporary
+           installation directory.) */
+        RemoveExtPackDir(szExtPackUnInstDir, false /*fTemporary*/);
+        rc = RTDirRename(pszExtPackDir, szExtPackUnInstDir, RTPATHRENAME_FLAGS_NO_REPLACE);
+    }
     if (RT_FAILURE(rc))
-        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to rename the extension pack directory: %Rrc", rc);
+        return RTMsgErrorExit(RTEXITCODE_FAILURE,
+                              "Failed to rename the extension pack directory: %Rrc\n"
+                              "If the problem persists, try running the command: VBoxManage extpack cleanup", rc);
 
     /* Recursively delete the directory content. */
     return RemoveExtPackDir(szExtPackUnInstDir, false /*fTemporary*/);
@@ -1775,6 +1786,7 @@ int main(int argc, char **argv)
     if (RT_FAILURE(rc))
         return RTMsgInitFailure(rc);
 
+    SUPR3HardenedVerifyInit();
     RTERRINFOSTATIC ErrInfo;
     RTErrInfoInitStatic(&ErrInfo);
     rc = SUPR3HardenedVerifySelf(argv[0], true /*fInternal*/, &ErrInfo.Core);
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index 6c94aaa..64b8902 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -3652,6 +3652,19 @@ STDMETHODIMP Machine::LockMachine(ISession *aSession,
             LogFlowThisFunc(("mSession.mPID=%d(0x%x)\n", mData->mSession.mPID, mData->mSession.mPID));
             LogFlowThisFunc(("session.pid=%d(0x%x)\n", pid, pid));
 
+#if defined(VBOX_WITH_HARDENING) && defined(RT_OS_WINDOWS)
+            /* Hardened windows builds have spawns two processes when a VM is
+               launched, the 2nd one is the one that will end up here.  */
+            RTPROCESS ppid;
+            int rc = RTProcQueryParent(pid, &ppid);
+            if (   (RT_SUCCESS(rc) && mData->mSession.mPID == ppid)
+                || rc == VERR_ACCESS_DENIED)
+            {
+                LogFlowThisFunc(("mSession.mPID => %d(%#x) - windows hardening stub\n", mData->mSession.mPID, pid));
+                mData->mSession.mPID = pid;
+            }
+#endif
+
             if (mData->mSession.mPID != pid)
                 return setError(E_ACCESSDENIED,
                                 tr("An unexpected process (PID=0x%08X) has tried to lock the "
diff --git a/src/VBox/Main/src-server/MediumImpl.cpp b/src/VBox/Main/src-server/MediumImpl.cpp
index 3e5da5b..d050fe4 100644
--- a/src/VBox/Main/src-server/MediumImpl.cpp
+++ b/src/VBox/Main/src-server/MediumImpl.cpp
@@ -8203,7 +8203,7 @@ HRESULT Medium::taskExportHandler(Medium::ExportTask &task)
                              task.mVDOperationIfaces);
                 if (RT_FAILURE(vrc))
                     throw setError(VBOX_E_FILE_ERROR,
-                                   tr("Could not create the clone medium '%s'%s"),
+                                   tr("Could not create the exported medium '%s'%s"),
                                    targetLocation.c_str(), vdError(vrc).c_str());
             }
             catch (HRESULT aRC) { rc = aRC; }
@@ -8372,7 +8372,7 @@ HRESULT Medium::taskImportHandler(Medium::ImportTask &task)
                              task.mVDOperationIfaces);
                 if (RT_FAILURE(vrc))
                     throw setError(VBOX_E_FILE_ERROR,
-                                   tr("Could not create the clone medium '%s'%s"),
+                                   tr("Could not create the imported medium '%s'%s"),
                                    targetLocation.c_str(), vdError(vrc).c_str());
 
                 size = VDGetFileSize(targetHdd, VD_LAST_IMAGE);
@@ -8405,7 +8405,7 @@ HRESULT Medium::taskImportHandler(Medium::ImportTask &task)
 
         if (pParent)
         {
-            /* associate the clone with the parent and deassociate
+            /* associate the imported medium with the parent and deassociate
              * from VirtualBox */
             m->pParent = pParent;
             pParent->m->llChildren.push_back(this);
diff --git a/src/VBox/Main/src-server/darwin/iokit.cpp b/src/VBox/Main/src-server/darwin/iokit.cpp
index b4ee60e..3fa8c8f 100644
--- a/src/VBox/Main/src-server/darwin/iokit.cpp
+++ b/src/VBox/Main/src-server/darwin/iokit.cpp
@@ -1275,7 +1275,7 @@ int DarwinReEnumerateUSBDevice(PCUSBDEVICE pCur)
 
 
 /**
- * Enumerate the DVD drives returning a FIFO of device name strings.
+ * Enumerate the CD, DVD and BlueRay drives returning a FIFO of device name strings.
  *
  * @returns Pointer to the head.
  *          The caller is responsible for calling RTMemFree() on each of the nodes.
@@ -1285,15 +1285,13 @@ PDARWINDVD DarwinGetDVDDrives(void)
     AssertReturn(darwinOpenMasterPort(), NULL);
 
     /*
-     * Create a matching dictionary for searching for DVD services in the IOKit.
+     * Create a matching dictionary for searching for CD, DVD and BlueRay services in the IOKit.
      *
-     * [If I understand this correctly, plain CDROMs doesn't show up as
-     * IODVDServices. Too keep things simple, we will only support DVDs
-     * until somebody complains about it and we get hardware to test it on.
-     * (Unless I'm much mistaken, there aren't any (orignal) intel macs with
-     * plain cdroms.)]
+     * The idea is to find all the devices which are of class IOCDBlockStorageDevice.
+     * CD devices are represented by IOCDBlockStorageDevice class itself, while DVD and BlueRay ones
+     * have it as a parent class.
      */
-    CFMutableDictionaryRef RefMatchingDict = IOServiceMatching("IODVDServices");
+    CFMutableDictionaryRef RefMatchingDict = IOServiceMatching("IOCDBlockStorageDevice");
     AssertReturn(RefMatchingDict, NULL);
 
     /*
@@ -1305,7 +1303,7 @@ PDARWINDVD DarwinGetDVDDrives(void)
     RefMatchingDict = NULL; /* the reference is consumed by IOServiceGetMatchingServices. */
 
     /*
-     * Enumerate the DVD services.
+     * Enumerate the matching services.
      * (This enumeration must be identical to the one performed in DrvHostBase.cpp.)
      */
     PDARWINDVD pHead = NULL;
diff --git a/src/VBox/Main/testcase/tstCollector.cpp b/src/VBox/Main/testcase/tstCollector.cpp
index 63aaff4..44b6428 100644
--- a/src/VBox/Main/testcase/tstCollector.cpp
+++ b/src/VBox/Main/testcase/tstCollector.cpp
@@ -247,12 +247,12 @@ int testDisk(pm::CollectorHAL *collector)
         if (disksUsage.empty())
         {
             RTPrintf("tstCollector: getDiskListByFs(%s) returned empty usage list\n", FSNAME);
-            return 1;
+            return 0;
         }
         if (disksLoad.empty())
         {
             RTPrintf("tstCollector: getDiskListByFs(%s) returned empty usage list\n", FSNAME);
-            return 1;
+            return 0;
         }
 
         pm::DiskList::iterator it;
diff --git a/src/VBox/Main/webservice/Makefile.kmk b/src/VBox/Main/webservice/Makefile.kmk
index abc1512..11ee22a 100644
--- a/src/VBox/Main/webservice/Makefile.kmk
+++ b/src/VBox/Main/webservice/Makefile.kmk
@@ -228,7 +228,7 @@ ifdef VBOX_GSOAP_INSTALLED
 	$(VBOXWEB_OUT_DIR)/soapC.cpp
  else
   BLDPROGS += split-soapC
-  split-soapC_TEMPLATE = VBOXBLDPROG
+  split-soapC_TEMPLATE = VBoxBldProg
   split-soapC_SOURCES = split-soapC.cpp
 
   vboxsoap_SOURCES = \
diff --git a/src/VBox/Main/webservice/jaxlibs/FastInfoset.jar b/src/VBox/Main/webservice/jaxlibs/FastInfoset.jar
deleted file mode 100644
index 8f5e3fb..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/FastInfoset.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/activation.jar b/src/VBox/Main/webservice/jaxlibs/activation.jar
deleted file mode 100644
index e31e71c..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/activation.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/http.jar b/src/VBox/Main/webservice/jaxlibs/http.jar
deleted file mode 100644
index 7532545..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/http.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxb-api.jar b/src/VBox/Main/webservice/jaxlibs/jaxb-api.jar
deleted file mode 100644
index be3d6dc..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxb-api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxb-impl.jar b/src/VBox/Main/webservice/jaxlibs/jaxb-impl.jar
deleted file mode 100644
index 034c158..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxb-impl.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxb-xjc.jar b/src/VBox/Main/webservice/jaxlibs/jaxb-xjc.jar
deleted file mode 100644
index ba2ec46..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxb-xjc.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxws-api.jar b/src/VBox/Main/webservice/jaxlibs/jaxws-api.jar
deleted file mode 100644
index 6599dc5..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxws-api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxws-rt.jar b/src/VBox/Main/webservice/jaxlibs/jaxws-rt.jar
deleted file mode 100644
index 45a201e..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxws-rt.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jaxws-tools.jar b/src/VBox/Main/webservice/jaxlibs/jaxws-tools.jar
deleted file mode 100644
index c4208c6..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jaxws-tools.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jsr173_api.jar b/src/VBox/Main/webservice/jaxlibs/jsr173_api.jar
deleted file mode 100644
index 015169d..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jsr173_api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jsr181-api.jar b/src/VBox/Main/webservice/jaxlibs/jsr181-api.jar
deleted file mode 100644
index 91538a7..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jsr181-api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/jsr250-api.jar b/src/VBox/Main/webservice/jaxlibs/jsr250-api.jar
deleted file mode 100644
index 2b10def..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/jsr250-api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/mimepull.jar b/src/VBox/Main/webservice/jaxlibs/mimepull.jar
deleted file mode 100644
index cfcc9b9..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/mimepull.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/resolver.jar b/src/VBox/Main/webservice/jaxlibs/resolver.jar
deleted file mode 100644
index 0f97dc7..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/resolver.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/saaj-api.jar b/src/VBox/Main/webservice/jaxlibs/saaj-api.jar
deleted file mode 100644
index 19664f0..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/saaj-api.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/saaj-impl.jar b/src/VBox/Main/webservice/jaxlibs/saaj-impl.jar
deleted file mode 100644
index 56c1a38..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/saaj-impl.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/sjsxp.jar b/src/VBox/Main/webservice/jaxlibs/sjsxp.jar
deleted file mode 100644
index 01f5373..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/sjsxp.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/stax-ex.jar b/src/VBox/Main/webservice/jaxlibs/stax-ex.jar
deleted file mode 100644
index ab58236..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/stax-ex.jar and /dev/null differ
diff --git a/src/VBox/Main/webservice/jaxlibs/streambuffer.jar b/src/VBox/Main/webservice/jaxlibs/streambuffer.jar
deleted file mode 100644
index 244aed2..0000000
Binary files a/src/VBox/Main/webservice/jaxlibs/streambuffer.jar and /dev/null differ
diff --git a/src/VBox/Makefile.kmk b/src/VBox/Makefile.kmk
index 19a7e5c..7bb7035 100644
--- a/src/VBox/Makefile.kmk
+++ b/src/VBox/Makefile.kmk
@@ -35,6 +35,7 @@ else ifdef VBOX_ONLY_DOCS
 
 else ifdef VBOX_ONLY_EXTPACKS
  include $(PATH_SUB_CURRENT)/Runtime/Makefile.kmk
+ include $(PATH_SUB_CURRENT)/Storage/Makefile.kmk
  include $(PATH_SUB_CURRENT)/Devices/Makefile.kmk
  include $(PATH_SUB_CURRENT)/HostDrivers/Makefile.kmk
  include $(PATH_SUB_CURRENT)/ExtPacks/Makefile.kmk
diff --git a/src/VBox/NetworkServices/DHCP/Makefile.kmk b/src/VBox/NetworkServices/DHCP/Makefile.kmk
index 623b9d9..045e3a5 100644
--- a/src/VBox/NetworkServices/DHCP/Makefile.kmk
+++ b/src/VBox/NetworkServices/DHCP/Makefile.kmk
@@ -34,7 +34,9 @@ endif
 #
 VBoxNetDHCPHardened_TEMPLATE = VBOXR3HARDENEDEXE
 VBoxNetDHCPHardened_SOURCES = VBoxNetDHCPHardened.cpp
+VBoxNetDHCPHardened_SOURCES.win = $(VBoxNetDHCP_0_OUTDIR)/VBoxNetDHCP-icon.rc
 VBoxNetDHCPHardened_NAME = VBoxNetDHCP
+VBoxNetDHCPHardened_LDFLAGS.win = /SUBSYSTEM:windows
 
 
 #
@@ -54,4 +56,13 @@ VBoxNetDHCP_LIBS = \
 	$(LIB_RUNTIME)
 VBoxNetDHCP_LDFLAGS.win = /SUBSYSTEM:windows
 
+# Icon include file.
+VBoxNetDHCP_SOURCES.win += $(VBoxNetDHCP_0_OUTDIR)/VBoxNetDHCP-icon.rc
+VBoxNetDHCP_CLEAN.win   += $(VBoxNetDHCP_0_OUTDIR)/VBoxNetDHCP-icon.rc
+$$(VBoxNetDHCP_0_OUTDIR)/VBoxNetDHCP-icon.rc: $(VBOX_WINDOWS_ICON_FILE) $$(VBoxNetDHCP_DEFPATH)/Makefile.kmk | $$(dir $$@)
+	$(RM) -f $@
+	$(APPEND) $@ 'IDI_VIRTUALBOX ICON DISCARDABLE "$(subst /,\\,$(VBOX_WINDOWS_ICON_FILE))"'
+
+
+
 include $(FILE_KBUILD_SUB_FOOTER)
diff --git a/src/VBox/NetworkServices/NAT/Makefile.kmk b/src/VBox/NetworkServices/NAT/Makefile.kmk
index 6682b08..8ac7b4b 100644
--- a/src/VBox/NetworkServices/NAT/Makefile.kmk
+++ b/src/VBox/NetworkServices/NAT/Makefile.kmk
@@ -32,9 +32,11 @@ endif
 
 ifdef VBOX_WITH_HARDENING
  VBoxNetLwipNATHardened_SOURCES += VBoxNetNATHardened.cpp
+ VBoxNetLwipNATHardened_SOURCES.win = $(VBoxNetLwipNAT_0_OUTDIR)/VBoxNetLwipNAT-icon.rc
  VBoxNetLwipNATHardened_DEFS += SERVICE_NAME=\"VBoxNetNAT\"
  VBoxNetLwipNATHardened_TEMPLATE=VBOXR3HARDENEDEXE
  VBoxNetLwipNATHardened_NAME = VBoxNetNAT
+ VBoxNetLwipNATHardened_LDFLAGS.win = /SUBSYSTEM:windows
 endif
 
 VBoxNetLwipNAT_TEMPLATE =
@@ -56,11 +58,32 @@ VBoxNetLwipNAT_LIBS = \
 VBoxNetLwipNAT_LIBS.solaris += socket nsl
 VBoxNetLwipNAT_LDFLAGS.win = /SUBSYSTEM:windows
 
-# Convince Solaris headers to expose socket stuff we need.  600 would
-# also work, but <sys/feature_tests.h> insists on C99 for it and so
-# explodes for C++.  Note that for 500 it insists on NOT using C99, so
-# when some day we decide to use -std=c99 we are in for some fun.
-VBoxNetLwipNAT_DEFS.solaris += _XOPEN_SOURCE=500 __EXTENSIONS__=1
+# Convince Solaris headers to expose socket stuff we need.
+#
+# Setting _XOPEN_SOURCE to either 500 or 600 would always work, but
+# <sys/feature_tests.h> insists that 600 requires C99 and so it
+# explodes for older g++.  It also insists that 500 is NOT to be used
+# with C99.
+#
+# Newer g++ in C++11 mode (formerly known as C++0x) needs 600, so it
+# employs sleight of hand to pretend it's C99 to keep feature test
+# happy.
+#
+# Compile the C code with settings that match g++.  This probably
+# should be centralized so that whole codebase uses consistent
+# settings.
+ifeq ($(KBUILD_TARGET),solaris)
+ ifneq ($(VBOX_GCC_VERSION_CXX),)
+  ifneq ($(int-ge $(VBOX_GCC_VERSION_CXX),40600),)
+   # we compile C++ code with -std=c++0x / -std=c++11
+   VBoxNetLwipNAT_CFLAGS.solaris += -std=c99
+   VBoxNetLwipNAT_DEFS.solaris += _XOPEN_SOURCE=600
+  else
+   VBoxNetLwipNAT_DEFS.solaris += _XOPEN_SOURCE=500
+  endif
+ endif
+ VBoxNetLwipNAT_DEFS.solaris += __EXTENSIONS__=1
+endif
 
 VBoxNetLwipNAT_SOURCES += \
     proxy_pollmgr.c \
@@ -107,4 +130,12 @@ $(eval $(call def_vbox_lwip_public, \
     VBoxNetLwipNAT, ../../Devices/Network/lwip-new))
 endif
 
+# Icon include file.
+VBoxNetLwipNAT_SOURCES.win += $(VBoxNetLwipNAT_0_OUTDIR)/VBoxNetLwipNAT-icon.rc
+VBoxNetLwipNAT_CLEAN.win   += $(VBoxNetLwipNAT_0_OUTDIR)/VBoxNetLwipNAT-icon.rc
+$$(VBoxNetLwipNAT_0_OUTDIR)/VBoxNetLwipNAT-icon.rc: $(VBOX_WINDOWS_ICON_FILE) $$(VBoxNetLwipNAT_DEFPATH)/Makefile.kmk | $$(dir $$@)
+	$(RM) -f $@
+	$(APPEND) $@ 'IDI_VIRTUALBOX ICON DISCARDABLE "$(subst /,\\,$(VBOX_WINDOWS_ICON_FILE))"'
+
+
 include $(FILE_KBUILD_SUB_FOOTER)
diff --git a/src/VBox/NetworkServices/NAT/fwtcp.c b/src/VBox/NetworkServices/NAT/fwtcp.c
index fa0fde4..4ecae66 100644
--- a/src/VBox/NetworkServices/NAT/fwtcp.c
+++ b/src/VBox/NetworkServices/NAT/fwtcp.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 #include "proxy.h"
 #include "proxy_pollmgr.h"
@@ -141,7 +143,6 @@ fwtcp_create(struct fwspec *fwspec)
 
     lsock = proxy_bound_socket(fwspec->sdom, fwspec->stype, &fwspec->src.sa);
     if (lsock == INVALID_SOCKET) {
-        perror("socket");
         return NULL;
     }
 
@@ -199,8 +200,6 @@ fwtcp_pmgr_listen(struct pollmgr_handler *handler, SOCKET fd, int revents)
     struct fwtcp *fwtcp;
     struct sockaddr_storage ss;
     socklen_t sslen;
-    void *peer_addr;
-    uint16_t peer_port;
     struct pxtcp *pxtcp;
     SOCKET newsock;
     int status;
@@ -226,30 +225,14 @@ fwtcp_pmgr_listen(struct pollmgr_handler *handler, SOCKET fd, int revents)
 
     if (ss.ss_family == PF_INET) {
         struct sockaddr_in *peer4 = (struct sockaddr_in *)&ss;
-        peer_addr = &peer4->sin_addr;
-        peer_port = peer4->sin_port;
+        DPRINTF(("<--- TCP %RTnaipv4:%d\n",
+                 peer4->sin_addr.s_addr, ntohs(peer4->sin_port)));
     }
     else { /* PF_INET6 */
         struct sockaddr_in6 *peer6 = (struct sockaddr_in6 *)&ss;
-        peer_addr = &peer6->sin6_addr;
-        peer_port = peer6->sin6_port;
-    }
-    peer_port = ntohs(peer_port);
-
-#if PLEASE_ABSTAIN_FROM_DPRINFING > 1 /* DPRINTF */ && !defined(RT_OS_WINDOWS)
-    {
-        char addrbuf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
-        const char *addrstr;
-
-        addrstr = inet_ntop(ss.ss_family, peer_addr, addrbuf, sizeof(addrbuf));
-        DPRINTF(("<--- TCP %s%s%s:%d\n",
-                 ss.ss_family == AF_INET6 ? "[" : "",
-                 addrstr,
-                 ss.ss_family == AF_INET6 ? "]" : "",
-                 peer_port));
+        DPRINTF(("<--- TCP %RTnaipv6:%d\n",
+                 &peer6->sin6_addr, ntohs(peer6->sin6_port)));
     }
-#endif  /* DPRINTF */
-
 
     pxtcp = pxtcp_create_forwarded(newsock);
     if (pxtcp == NULL) {
diff --git a/src/VBox/NetworkServices/NAT/fwudp.c b/src/VBox/NetworkServices/NAT/fwudp.c
index 1cc256f..ded9330 100644
--- a/src/VBox/NetworkServices/NAT/fwudp.c
+++ b/src/VBox/NetworkServices/NAT/fwudp.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 #include "proxy.h"
 #include "proxy_pollmgr.h"
@@ -168,7 +170,6 @@ fwudp_create(struct fwspec *fwspec)
 
     sock = proxy_bound_socket(fwspec->sdom, fwspec->stype, &fwspec->src.sa);
     if (sock == INVALID_SOCKET) {
-        perror("socket");
         return NULL;
     }
 
@@ -264,7 +265,7 @@ fwudp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
     nread = recvfrom(fwudp->sock, pollmgr_udpbuf, sizeof(pollmgr_udpbuf), 0,
                      (struct sockaddr *)&ss, &sslen);
     if (nread < 0) {
-        perror(__func__);
+        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
         return POLLIN;
     }
 
diff --git a/src/VBox/NetworkServices/NAT/lwipopts.h b/src/VBox/NetworkServices/NAT/lwipopts.h
index 2ac2645..eb1d927 100644
--- a/src/VBox/NetworkServices/NAT/lwipopts.h
+++ b/src/VBox/NetworkServices/NAT/lwipopts.h
@@ -47,7 +47,7 @@
 
 /* TCP sender buffer space (pbufs). This must be at least = 2 *
    TCP_SND_BUF/TCP_MSS for things to work. */
-#define TCP_SND_QUEUELEN        64
+#define TCP_SND_QUEUELEN        128
 
 /* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
    sends a lot of data out of ROM (or other static memory), this
diff --git a/src/VBox/NetworkServices/NAT/portfwd.c b/src/VBox/NetworkServices/NAT/portfwd.c
index d459383..e916a72 100644
--- a/src/VBox/NetworkServices/NAT/portfwd.c
+++ b/src/VBox/NetworkServices/NAT/portfwd.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 #include "portfwd.h"
 
diff --git a/src/VBox/NetworkServices/NAT/proxy.c b/src/VBox/NetworkServices/NAT/proxy.c
index eed93da..964bf7e 100644
--- a/src/VBox/NetworkServices/NAT/proxy.c
+++ b/src/VBox/NetworkServices/NAT/proxy.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "proxy.h"
@@ -32,6 +34,8 @@
 # define __arraycount(a) (sizeof(a)/sizeof(a[0]))
 #endif
 
+static FNRTSTRFORMATTYPE proxy_sockerr_rtstrfmt;
+
 static SOCKET proxy_create_socket(int, int);
 
 volatile struct proxy_options *g_proxy_options;
@@ -39,6 +43,8 @@ static sys_thread_t pollmgr_tid;
 
 /* XXX: for mapping loopbacks to addresses in our network (ip4) */
 struct netif *g_proxy_netif;
+
+
 /*
  * Called on the lwip thread (aka tcpip thread) from tcpip_init() via
  * its "tcpip_init_done" callback.  Raw API is ok to use here
@@ -52,6 +58,9 @@ proxy_init(struct netif *proxy_netif, struct proxy_options *opts)
     LWIP_ASSERT1(opts != NULL);
     LWIP_UNUSED_ARG(proxy_netif);
 
+    status = RTStrFormatTypeRegister("sockerr", proxy_sockerr_rtstrfmt, NULL);
+    AssertRC(status);
+
     g_proxy_options = opts;
     g_proxy_netif = proxy_netif;
 
@@ -98,6 +107,124 @@ proxy_init(struct netif *proxy_netif, struct proxy_options *opts)
 }
 
 
+#if !defined(RT_OS_WINDOWS)
+/**
+ * Formatter for %R[sockerr] - unix strerror_r() version.
+ */
+static DECLCALLBACK(size_t)
+proxy_sockerr_rtstrfmt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
+                       const char *pszType, const void *pvValue,
+                       int cchWidth, int cchPrecision, unsigned int fFlags,
+                       void *pvUser)
+{
+    const int error = (int)(intptr_t)pvValue;
+    size_t cb = 0;
+
+    const char *msg = NULL;
+    char buf[128];
+
+    NOREF(cchWidth);
+    NOREF(cchPrecision);
+    NOREF(fFlags);
+    NOREF(pvUser);
+
+    AssertReturn(strcmp(pszType, "sockerr") == 0, 0);
+
+    /* make sure return type mismatch is caught */
+#if defined(RT_OS_LINUX) && defined(_GNU_SOURCE)
+    msg = strerror_r(error, buf, sizeof(buf));
+#else
+    {
+        int status = strerror_r(error, buf, sizeof(buf));
+        msg = buf;
+    }
+#endif
+    return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "%s", msg);
+}
+
+#else /* RT_OS_WINDOWS */
+
+/**
+ * Formatter for %R[sockerr] - windows FormatMessage() version.
+ */
+static DECLCALLBACK(size_t)
+proxy_sockerr_rtstrfmt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
+                       const char *pszType, const void *pvValue,
+                       int cchWidth, int cchPrecision, unsigned int fFlags,
+                       void *pvUser)
+{
+    const int error = (int)(intptr_t)pvValue;
+    size_t cb = 0;
+
+    NOREF(cchWidth);
+    NOREF(cchPrecision);
+    NOREF(fFlags);
+    NOREF(pvUser);
+
+    AssertReturn(strcmp(pszType, "sockerr") == 0, 0);
+
+    /*
+     * XXX: Windows strerror() doesn't handle posix error codes, but
+     * since winsock uses its own, it shouldn't be much of a problem.
+     * If you see a strange error message, it's probably from
+     * FormatMessage() for an error from <WinError.h> that has the
+     * same numeric value.
+     */
+    if (error < _sys_nerr) {
+        char buf[128] = "";
+        int status;
+
+        status = strerror_s(buf, sizeof(buf), error);
+        if (status == 0) {
+            if (strcmp(buf, "Unknown error") == 0) {
+                /* windows strerror() doesn't add the numeric value */
+                cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                                  "Unknown error: %d", error);
+            }
+            else {
+                cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                                  "%s", buf);
+            }
+        }
+        else {
+            cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                              "Unknown error: %d", error);
+        }
+    }
+    else {
+        DWORD nchars;
+        char *msg = NULL;
+
+        nchars = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
+                                | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+                                NULL, error, LANG_NEUTRAL,
+                                (LPSTR)&msg, 0,
+                                NULL);
+        if (nchars == 0 || msg == NULL) {
+            cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                              "Unknown error: %d", error);
+        }
+        else {
+            /* FormatMessage() "helpfully" adds newline; get rid of it */
+            char *crpos = strchr(msg, '\r');
+            if (crpos != NULL) {
+                *crpos = '\0';
+            }
+
+            cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                              "%s", msg);
+        }
+
+        if (msg != NULL) {
+            LocalFree(msg);
+        }
+    }
+
+    return cb;
+}
+#endif /* RT_OS_WINDOWS */
+
+
 /**
  * Send static callback message from poll manager thread to lwip
  * thread, scheduling a function call in lwip thread context.
@@ -170,7 +297,7 @@ proxy_create_socket(int sdom, int stype)
 
     s = socket(sdom, stype_and_flags, 0);
     if (s == INVALID_SOCKET) {
-        perror("socket");
+        DPRINTF(("socket: %R[sockerr]\n", SOCKERRNO()));
         return INVALID_SOCKET;
     }
 
@@ -180,14 +307,14 @@ proxy_create_socket(int sdom, int stype)
 
         sflags = fcntl(s, F_GETFL, 0);
         if (sflags < 0) {
-            perror("F_GETFL");
+            DPRINTF(("F_GETFL: %R[sockerr]\n", SOCKERRNO()));
             closesocket(s);
             return INVALID_SOCKET;
         }
 
         status = fcntl(s, F_SETFL, sflags | O_NONBLOCK);
         if (status < 0) {
-            perror("O_NONBLOCK");
+            DPRINTF(("O_NONBLOCK: %R[sockerr]\n", SOCKERRNO()));
             closesocket(s);
             return INVALID_SOCKET;
         }
@@ -201,7 +328,7 @@ proxy_create_socket(int sdom, int stype)
 
         status = setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &on, onlen);
         if (status < 0) {
-            perror("SO_NOSIGPIPE");
+            DPRINTF(("SO_NOSIGPIPE: %R[sockerr]\n", SOCKERRNO()));
             closesocket(s);
             return INVALID_SOCKET;
         }
@@ -213,7 +340,8 @@ proxy_create_socket(int sdom, int stype)
         u_long mode = 0;
         status = ioctlsocket(s, FIONBIO, &mode);
         if (status == SOCKET_ERROR) {
-            warn("ioctl error: %d\n", WSAGetLastError());
+            DPRINTF(("FIONBIO: %R[sockerr]\n", SOCKERRNO()));
+            closesocket(s);
             return INVALID_SOCKET;
         }
     }
@@ -247,6 +375,7 @@ proxy_connected_socket(int sdom, int stype,
     LWIP_ASSERT1(sdom == PF_INET || sdom == PF_INET6);
     LWIP_ASSERT1(stype == SOCK_STREAM || stype == SOCK_DGRAM);
 
+    DPRINTF(("---> %s ", stype == SOCK_STREAM ? "TCP" : "UDP"));
     if (sdom == PF_INET6) {
         pdst_sa = (struct sockaddr *)&dst_sin6;
         pdst_addr = (void *)&dst_sin6.sin6_addr;
@@ -259,6 +388,8 @@ proxy_connected_socket(int sdom, int stype,
         dst_sin6.sin6_family = AF_INET6;
         memcpy(&dst_sin6.sin6_addr, &dst_addr->ip6, sizeof(ip6_addr_t));
         dst_sin6.sin6_port = htons(dst_port);
+
+        DPRINTF(("[%RTnaipv6]:%d ", &dst_sin6.sin6_addr, dst_port));
     }
     else { /* sdom = PF_INET */
         pdst_sa = (struct sockaddr *)&dst_sin;
@@ -272,22 +403,9 @@ proxy_connected_socket(int sdom, int stype,
         dst_sin.sin_family = AF_INET;
         dst_sin.sin_addr.s_addr = dst_addr->ip4.addr; /* byte-order? */
         dst_sin.sin_port = htons(dst_port);
-    }
 
-#if LWIP_PROXY_DEBUG && !RT_OS_WINDOWS
-    {
-        char addrbuf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
-        const char *addrstr;
-
-        addrstr = inet_ntop(sdom, pdst_addr, addrbuf, sizeof(addrbuf));
-        DPRINTF(("---> %s %s%s%s:%d ",
-                 stype == SOCK_STREAM ? "TCP" : "UDP",
-                 sdom == PF_INET6 ? "[" : "",
-                 addrstr,
-                 sdom == PF_INET6 ? "]" : "",
-                 dst_port));
+        DPRINTF(("%RTnaipv4:%d ", dst_sin.sin_addr.s_addr, dst_port));
     }
-#endif
 
     s = proxy_create_socket(sdom, stype);
     if (s == INVALID_SOCKET) {
@@ -307,15 +425,15 @@ proxy_connected_socket(int sdom, int stype,
     if (psrc_sa != NULL) {
         status = bind(s, psrc_sa, src_sa_len);
         if (status == SOCKET_ERROR) {
-            DPRINTF(("socket %d: bind: %s\n", s, strerror(errno)));
+            DPRINTF(("socket %d: bind: %R[sockerr]\n", s, SOCKERRNO()));
             closesocket(s);
             return INVALID_SOCKET;
         }
     }
 
     status = connect(s, pdst_sa, dst_sa_len);
-    if (status == SOCKET_ERROR && errno != EINPROGRESS) {
-        DPRINTF(("socket %d: connect: %s\n", s, strerror(errno)));
+    if (status == SOCKET_ERROR && SOCKERRNO() != EINPROGRESS) {
+        DPRINTF(("socket %d: connect: %R[sockerr]\n", s, SOCKERRNO()));
         closesocket(s);
         return INVALID_SOCKET;
     }
@@ -352,7 +470,7 @@ proxy_bound_socket(int sdom, int stype, struct sockaddr *src_addr)
     on = 1;
     status = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&on, onlen);
     if (status < 0) {           /* not good, but not fatal */
-        warn("SO_REUSEADDR");
+        DPRINTF(("SO_REUSEADDR: %R[sockerr]\n", SOCKERRNO()));
     }
 
     status = bind(s, src_addr,
@@ -360,7 +478,7 @@ proxy_bound_socket(int sdom, int stype, struct sockaddr *src_addr)
                     sizeof(struct sockaddr_in)
                   : sizeof(struct sockaddr_in6));
     if (status < 0) {
-        perror("bind");
+        DPRINTF(("bind: %R[sockerr]\n", SOCKERRNO()));
         closesocket(s);
         return INVALID_SOCKET;
     }
@@ -368,7 +486,7 @@ proxy_bound_socket(int sdom, int stype, struct sockaddr *src_addr)
     if (stype == SOCK_STREAM) {
         status = listen(s, 5);
         if (status < 0) {
-            perror("listen");
+            DPRINTF(("listen: %R[sockerr]\n", SOCKERRNO()));
             closesocket(s);
             return INVALID_SOCKET;
         }
@@ -409,8 +527,8 @@ proxy_sendto(SOCKET sock, struct pbuf *p, void *name, size_t namelen)
     ssize_t nsent;
 #else
     DWORD nsent;
-    int rc;
 #endif
+    int rc;
     IOVEC fixiov[8];     /* fixed size (typical case) */
     const size_t fixiovsize = sizeof(fixiov)/sizeof(fixiov[0]);
     IOVEC *dyniov;       /* dynamically sized */
@@ -428,7 +546,7 @@ proxy_sendto(SOCKET sock, struct pbuf *p, void *name, size_t namelen)
          */
         dyniov = (IOVEC *)malloc(clen * sizeof(*dyniov));
         if (dyniov == NULL) {
-            error = -errno;
+            error = -errno;     /* sic: not a socket error */
             goto out;
         }
         iov = dyniov;
@@ -454,20 +572,17 @@ proxy_sendto(SOCKET sock, struct pbuf *p, void *name, size_t namelen)
     mh.msg_iovlen = clen;
 
     nsent = sendmsg(sock, &mh, 0);
-    if (nsent < 0) {
-        error = -errno;
-        DPRINTF(("%s: fd %d: sendmsg errno %d\n",
-                 __func__, sock, errno));
-    }
+    rc = (nsent >= 0) ? 0 : SOCKET_ERROR;
 #else
     rc = WSASendTo(sock, iov, (DWORD)clen, &nsent, 0,
                    name, (int)namelen, NULL, NULL);
+#endif
     if (rc == SOCKET_ERROR) {
-         DPRINTF(("%s: fd %d: sendmsg errno %d\n",
-                  __func__, sock, WSAGetLastError()));
-         error = -WSAGetLastError();
+        error = SOCKERRNO();
+        DPRINTF(("%s: socket %d: sendmsg: %R[sockerr]\n",
+                 __func__, sock, error));
+        error = -error;
     }
-#endif
 
   out:
     if (dyniov != NULL) {
diff --git a/src/VBox/NetworkServices/NAT/proxy.h b/src/VBox/NetworkServices/NAT/proxy.h
index 20df34b..9a7b02d 100644
--- a/src/VBox/NetworkServices/NAT/proxy.h
+++ b/src/VBox/NetworkServices/NAT/proxy.h
@@ -86,16 +86,15 @@ err_t pxping_init(struct netif *, SOCKET, SOCKET);
 #endif
 
 #define LWIP_ASSERT1(condition) LWIP_ASSERT(#condition, condition)
-/* TODO: review debug levels and types */
-#if !LWIP_PROXY_DEBUG
-# define DPRINTF_LEVEL(y, x)      do {} while (0)
-#else
-# define DPRINTF_LEVEL(level, x) do { LWIP_DEBUGF(LWIP_PROXY_DEBUG | (level), x); } while (0)
-#endif
 
-#define DPRINTF(x) DPRINTF_LEVEL(0, x)
-#define DPRINTF0(x) DPRINTF_LEVEL(LWIP_DBG_LEVEL_WARNING, x)
-#define DPRINTF1(x) DPRINTF_LEVEL(LWIP_DBG_LEVEL_SERIOUS, x)
-#define DPRINTF2(x) DPRINTF_LEVEL(LWIP_DBG_LEVEL_SEVERE, x)
+/*
+ * TODO: DPRINTF0 should probably become LogRel but its usage needs to
+ * be cleaned up a bit before.
+ */
+#define DPRINTF0(a) Log(a)
+
+#define DPRINTF(a)  DPRINTF1(a)
+#define DPRINTF1(a) Log2(a)
+#define DPRINTF2(a) Log3(a)
 
 #endif /* _nat_proxy_h_ */
diff --git a/src/VBox/NetworkServices/NAT/proxy_dhcp6ds.c b/src/VBox/NetworkServices/NAT/proxy_dhcp6ds.c
index 2eebeef..5764b56 100644
--- a/src/VBox/NetworkServices/NAT/proxy_dhcp6ds.c
+++ b/src/VBox/NetworkServices/NAT/proxy_dhcp6ds.c
@@ -2,6 +2,8 @@
 /**
  * Simple stateless DHCPv6 (RFC 3736) server.
  */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 #include "dhcp6.h"
 #include "proxy.h"
diff --git a/src/VBox/NetworkServices/NAT/proxy_pollmgr.c b/src/VBox/NetworkServices/NAT/proxy_pollmgr.c
index 054eceb..1469b17 100644
--- a/src/VBox/NetworkServices/NAT/proxy_pollmgr.c
+++ b/src/VBox/NetworkServices/NAT/proxy_pollmgr.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "proxy_pollmgr.h"
@@ -80,15 +82,12 @@ pollmgr_init(void)
 #ifndef RT_OS_WINDOWS
         status = socketpair(PF_LOCAL, SOCK_DGRAM, 0, pollmgr.chan[i]);
         if (status < 0) {
-            perror("socketpair");
+            DPRINTF(("socketpair: %R[sockerr]\n", SOCKERRNO()));
             goto cleanup_close;
         }
 #else
         status = RTWinSocketPair(PF_INET, SOCK_DGRAM, 0, pollmgr.chan[i]);
-        AssertRCReturn(status, -1);
-
         if (RT_FAILURE(status)) {
-            perror("socketpair");
             goto cleanup_close;
         }
 #endif
@@ -101,14 +100,14 @@ pollmgr_init(void)
     newfds = (struct pollfd *)
         malloc(newcap * sizeof(*pollmgr.fds));
     if (newfds == NULL) {
-        perror("calloc");
+        DPRINTF(("%s: Failed to allocate fds array\n", __func__));
         goto cleanup_close;
     }
 
     newhdls = (struct pollmgr_handler **)
         malloc(newcap * sizeof(*pollmgr.handlers));
     if (newhdls == NULL) {
-        perror("malloc");
+        DPRINTF(("%s: Failed to allocate handlers array\n", __func__));
         free(newfds);
         goto cleanup_close;
     }
@@ -177,7 +176,7 @@ pollmgr_add(struct pollmgr_handler *handler, SOCKET fd, int events)
         newfds = (struct pollfd *)
             realloc(pollmgr.fds, newcap * sizeof(*pollmgr.fds));
         if (newfds == NULL) {
-            perror("realloc");
+            DPRINTF(("%s: Failed to reallocate fds array\n", __func__));
             handler->slot = -1;
             return -1;
         }
@@ -188,7 +187,7 @@ pollmgr_add(struct pollmgr_handler *handler, SOCKET fd, int events)
         newhdls = (struct pollmgr_handler **)
             realloc(pollmgr.handlers, newcap * sizeof(*pollmgr.handlers));
         if (newhdls == NULL) {
-            perror("realloc");
+            DPRINTF(("%s: Failed to reallocate handlers array\n", __func__));
             /* if we failed to realloc here, then fds points to the
              * new array, but we pretend we still has old capacity */
             handler->slot = -1;
@@ -239,12 +238,12 @@ pollmgr_chan_send(int slot, void *buf, size_t nbytes)
     fd = pollmgr.chan[slot][POLLMGR_CHFD_WR];
     nsent = send(fd, buf, (int)nbytes, 0);
     if (nsent == SOCKET_ERROR) {
-        warn("send on chan %d", slot);
+        DPRINTF(("send on chan %d: %R[sockerr]\n", slot, SOCKERRNO()));
         return -1;
     }
     else if ((size_t)nsent != nbytes) {
-        warnx("send on chan %d: datagram truncated to %u bytes",
-              slot, (unsigned int)nsent);
+        DPRINTF(("send on chan %d: datagram truncated to %u bytes",
+                 slot, (unsigned int)nsent));
         return -1;
     }
 
diff --git a/src/VBox/NetworkServices/NAT/proxy_rtadvd.c b/src/VBox/NetworkServices/NAT/proxy_rtadvd.c
index f3a1086..6120866 100644
--- a/src/VBox/NetworkServices/NAT/proxy_rtadvd.c
+++ b/src/VBox/NetworkServices/NAT/proxy_rtadvd.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "proxy.h"
@@ -271,13 +273,13 @@ proxy_rtadvd_send_multicast(struct netif *proxy_netif)
 
     ph = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);
     if (ph == NULL) {
-        DPRINTF0(("%s: failed to allocate RA header pbuf", __func__));
+        DPRINTF0(("%s: failed to allocate RA header pbuf\n", __func__));
         return;
     }
 
     pp = pbuf_alloc(PBUF_RAW, unsolicited_ra_payload_length, PBUF_ROM);
     if (pp == NULL) {
-        DPRINTF0(("%s: failed to allocate RA payload pbuf", __func__));
+        DPRINTF0(("%s: failed to allocate RA payload pbuf\n", __func__));
         pbuf_free(ph);
         return;
     }
@@ -292,7 +294,7 @@ proxy_rtadvd_send_multicast(struct netif *proxy_netif)
                           IP6_NEXTH_ICMP6,
                           proxy_netif);
     if (error != ERR_OK) {
-        DPRINTF0(("%s: failed to send RA (err=%d)", __func__, error));
+        DPRINTF0(("%s: failed to send RA (err=%d)\n", __func__, error));
     }
 
     pbuf_free(pp);
diff --git a/src/VBox/NetworkServices/NAT/proxy_tftpd.c b/src/VBox/NetworkServices/NAT/proxy_tftpd.c
index a29ac68..e24cd39 100644
--- a/src/VBox/NetworkServices/NAT/proxy_tftpd.c
+++ b/src/VBox/NetworkServices/NAT/proxy_tftpd.c
@@ -1,6 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
-#define _USE_WINSTD_ERRNO
-/* XXX: replace POSIX file operations with IPRT, to avoid hacks with errno renamings */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "proxy.h"
diff --git a/src/VBox/NetworkServices/NAT/pxdns.c b/src/VBox/NetworkServices/NAT/pxdns.c
index 2f3b19f..c5b3d4d 100644
--- a/src/VBox/NetworkServices/NAT/pxdns.c
+++ b/src/VBox/NetworkServices/NAT/pxdns.c
@@ -33,6 +33,8 @@
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "proxy.h"
@@ -713,7 +715,7 @@ pxdns_forward_outbound(struct pxdns *pxdns, struct request *req)
     }
 
     if (nsent < 0) {
-        DPRINTF2(("%s: send: errno %d\n", __func__, errno));
+        DPRINTF2(("%s: send: %R[sockerr]\n", __func__, SOCKERRNO()));
     }
     else {
         DPRINTF2(("%s: sent only %lu of %lu\n",
@@ -779,11 +781,11 @@ pxdns_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
         status = getsockopt(fd, SOL_SOCKET,
                             SO_ERROR, (char *)&sockerr, &optlen);
         if (status < 0) {
-            DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",
-                     __func__, fd, errno));
+            DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
+                     __func__, fd, SOCKERRNO()));
         }
         else {
-            DPRINTF(("%s: sock %d: errno %d\n",
+            DPRINTF(("%s: sock %d: %R[sockerr]\n",
                      __func__, fd, sockerr));
         }
     }
@@ -795,7 +797,7 @@ pxdns_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
 
     nread = recv(fd, pollmgr_udpbuf, sizeof(pollmgr_udpbuf), 0);
     if (nread < 0) {
-        perror(__func__);
+        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
         return POLLIN;
     }
 
diff --git a/src/VBox/NetworkServices/NAT/pxping.c b/src/VBox/NetworkServices/NAT/pxping.c
index 0c3672d..b55f677 100644
--- a/src/VBox/NetworkServices/NAT/pxping.c
+++ b/src/VBox/NetworkServices/NAT/pxping.c
@@ -1,10 +1,13 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
 
 #include "winutils.h"
 #include "proxy.h"
 #include "proxy_pollmgr.h"
 #include "pxremap.h"
 
+#include <iprt/string.h>
+
 #ifndef RT_OS_WINDOWS
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -12,7 +15,6 @@
 # define __APPLE_USE_RFC_3542
 #endif
 #include <netinet/in.h>
-#include <arpa/inet.h>          /* XXX: inet_ntop */
 #include <poll.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -191,13 +193,13 @@ static struct ping_pcb *pxping_pcb_for_request(struct pxping *pxping,
 static struct ping_pcb *pxping_pcb_for_reply(struct pxping *pxping, int is_ipv6,
                                              ipX_addr_t *dst, u16_t host_id);
 
+static FNRTSTRFORMATTYPE pxping_pcb_rtstrfmt;
 static struct ping_pcb *pxping_pcb_allocate(struct pxping *pxping);
 static void pxping_pcb_register(struct pxping *pxping, struct ping_pcb *pcb);
 static void pxping_pcb_deregister(struct pxping *pxping, struct ping_pcb *pcb);
 static void pxping_pcb_delete(struct pxping *pxping, struct ping_pcb *pcb);
 static void pxping_timeout_add(struct pxping *pxping, struct ping_pcb *pcb);
 static void pxping_timeout_del(struct pxping *pxping, struct ping_pcb *pcb);
-static void pxping_pcb_debug_print(struct ping_pcb *pcb);
 
 static int pxping_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents);
 
@@ -256,7 +258,7 @@ pxping_init(struct netif *netif, SOCKET sock4, SOCKET sock6)
     g_pxping.sock4 = sock4;
     if (g_pxping.sock4 != INVALID_SOCKET) {
 #ifdef DF_WITH_IP_HDRINCL
-        g_pxping.hdrincl = -1;
+        g_pxping.hdrincl = 0;
 #else
         g_pxping.df = -1;
 #endif
@@ -269,7 +271,7 @@ pxping_init(struct netif *netif, SOCKET sock4, SOCKET sock6)
             status = setsockopt(sock4, IPPROTO_IP, IP_MTU_DISCOVER,
                                 &dont, sizeof(dont));
             if (status != 0) {
-                perror("IP_MTU_DISCOVER");
+                DPRINTF(("IP_MTU_DISCOVER: %R[sockerr]\n", SOCKERRNO()));
             }
         }
 #endif /* RT_OS_LINUX */
@@ -302,7 +304,7 @@ pxping_init(struct netif *netif, SOCKET sock4, SOCKET sock6)
         status = setsockopt(sock6, IPPROTO_IPV6, IPV6_RECVPKTINFO,
                             (const char *)&on, sizeof(on));
         if (status < 0) {
-            perror("IPV6_RECVPKTINFO");
+            DPRINTF(("IPV6_RECVPKTINFO: %R[sockerr]\n", SOCKERRNO()));
             /* XXX: for now this is fatal */
         }
 
@@ -312,7 +314,7 @@ pxping_init(struct netif *netif, SOCKET sock4, SOCKET sock6)
         status = setsockopt(sock6, IPPROTO_IPV6, IPV6_RECVHOPLIMIT,
                             (const char *)&on, sizeof(on));
         if (status < 0) {
-            perror("IPV6_RECVHOPLIMIT");
+            DPRINTF(("IPV6_RECVHOPLIMIT: %R[sockerr]\n", SOCKERRNO()));
         }
 
 #ifdef IPV6_RECVTCLASS  /* new in RFC 3542, there's no RFC 2292 counterpart */
@@ -327,6 +329,9 @@ pxping_init(struct netif *netif, SOCKET sock4, SOCKET sock6)
         ping6_proxy_accept(pxping_recv6, &g_pxping);
     }
 
+    status = RTStrFormatTypeRegister("ping_pcb", pxping_pcb_rtstrfmt, NULL);
+    AssertRC(status);
+
     return ERR_OK;
 }
 
@@ -453,8 +458,8 @@ pxping_recv4(void *arg, struct pbuf *p)
         return;
     }
 
-    pxping_pcb_debug_print(pcb); /* XXX */
-    DPRINTF((" seq %d len %u ttl %d\n",
+    DPRINTF(("ping %p: %R[ping_pcb] seq %d len %u ttl %d\n",
+             pcb, pcb,
              ntohs(icmph->seqno), (unsigned int)p->tot_len,
              IPH_TTL(iph)));
 
@@ -489,7 +494,7 @@ pxping_recv4(void *arg, struct pbuf *p)
             pxping->hdrincl = df;
         }
         else {
-            perror("IP_HDRINCL");
+            DPRINTF(("IP_HDRINCL: %R[sockerr]\n", SOCKERRNO()));
         }
     }
 
@@ -503,13 +508,16 @@ pxping_recv4(void *arg, struct pbuf *p)
         /* we will overwrite IP header, save original for ICMP errors */
         memcpy(&iph_orig, iph, iphlen);
 
+        if (pcb->is_mapped) {
+            ip4_addr_set_u32(&iph->dest, pcb->peer.sin.sin_addr.s_addr);
+        }
+
         if (g_proxy_options->src4 != NULL) {
-            memcpy(&iph->src, &g_proxy_options->src4->sin_addr,
-                   sizeof(g_proxy_options->src4->sin_addr));
+            ip4_addr_set_u32(&iph->src, g_proxy_options->src4->sin_addr.s_addr);
         }
         else {
             /* let the kernel select suitable source address */
-            memset(&iph->src, 0, sizeof(iph->src));
+            ip_addr_set_any(&iph->src);
         }
 
         IPH_TTL_SET(iph, ttl);  /* already decremented */
@@ -548,7 +556,7 @@ pxping_recv4(void *arg, struct pbuf *p)
                 pxping->df = df;
             }
             else {
-                perror(dfoptname);
+                DPRINTF(("%s: %R[sockerr]\n", dfoptname, SOCKERRNO()));
             }
         }
 #endif /* !DF_WITH_IP_HDRINCL */
@@ -560,7 +568,7 @@ pxping_recv4(void *arg, struct pbuf *p)
                 pxping->ttl = ttl;
             }
             else {
-                perror("IP_TTL");
+                DPRINTF(("IP_TTL: %R[sockerr]\n", SOCKERRNO()));
             }
         }
 
@@ -572,7 +580,7 @@ pxping_recv4(void *arg, struct pbuf *p)
                 pxping->tos = tos;
             }
             else {
-                perror("IP_TOS");
+                DPRINTF(("IP_TOS: %R[sockerr]\n", SOCKERRNO()));
             }
         }
     }
@@ -588,7 +596,7 @@ pxping_recv4(void *arg, struct pbuf *p)
                           &pcb->peer.sin, sizeof(pcb->peer.sin));
     if (status != 0) {
         int error = -status;
-        DPRINTF(("%s: sendto errno %d\n", __func__, error));
+        DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error));
 
 #ifdef DF_WITH_IP_HDRINCL
         if (pxping->hdrincl) {
@@ -671,8 +679,8 @@ pxping_recv6(void *arg, struct pbuf *p)
         return;
     }
 
-    pxping_pcb_debug_print(pcb); /* XXX */
-    DPRINTF((" seq %d len %u hopl %d\n",
+    DPRINTF(("ping %p: %R[ping_pcb] seq %d len %u hopl %d\n",
+             pcb, pcb,
              ntohs(seq), (unsigned int)p->tot_len,
              IP6H_HOPLIM(iph)));
 
@@ -705,7 +713,7 @@ pxping_recv6(void *arg, struct pbuf *p)
             pxping->hopl = hopl;
         }
         else {
-            perror("IPV6_HOPLIMIT");
+            DPRINTF(("IPV6_HOPLIMIT: %R[sockerr]\n", SOCKERRNO()));
         }
     }
 
@@ -713,7 +721,7 @@ pxping_recv6(void *arg, struct pbuf *p)
                           &pcb->peer.sin6, sizeof(pcb->peer.sin6));
     if (status != 0) {
         int error = -status;
-        DPRINTF(("%s: sendto errno %d\n", __func__, error));
+        DPRINTF(("%s: sendto: %R[sockerr]\n", __func__, error));
 
         status = pbuf_header(p, iphlen); /* back to IP header */
         if (RT_UNLIKELY(status != 0)) {
@@ -745,24 +753,53 @@ pxping_recv6(void *arg, struct pbuf *p)
 }
 
 
-static void
-pxping_pcb_debug_print(struct ping_pcb *pcb)
+/**
+ * Formatter for %R[ping_pcb].
+ */
+static DECLCALLBACK(size_t)
+pxping_pcb_rtstrfmt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
+                    const char *pszType, const void *pvValue,
+                    int cchWidth, int cchPrecision, unsigned int fFlags,
+                    void *pvUser)
 {
-    char addrbuf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
-    const char *addrstr;
-    int sdom = pcb->is_ipv6 ? AF_INET6 : AF_INET;
+    const struct ping_pcb *pcb = (const struct ping_pcb *)pvValue;
+    size_t cb = 0;
 
-    DPRINTF(("ping %p:", (void *)pcb));
+    NOREF(cchWidth);
+    NOREF(cchPrecision);
+    NOREF(fFlags);
+    NOREF(pvUser);
 
-    addrstr = inet_ntop(sdom, (void *)&pcb->src, addrbuf, sizeof(addrbuf));
-    DPRINTF((" %s", addrstr));
+    AssertReturn(strcmp(pszType, "ping_pcb") == 0, 0);
 
-    DPRINTF((" ->"));
+    if (pcb == NULL) {
+        return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "(null)");
+    }
 
-    addrstr = inet_ntop(sdom, (void *)&pcb->dst, addrbuf, sizeof(addrbuf));
-    DPRINTF((" %s", addrstr));
+    /* XXX: %RTnaipv4 takes the value, but %RTnaipv6 takes the pointer */
+    if (pcb->is_ipv6) {
+        cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                          "%RTnaipv6 -> %RTnaipv6", &pcb->src, &pcb->dst);
+        if (pcb->is_mapped) {
+            cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                              " (%RTnaipv6)", &pcb->peer.sin6.sin6_addr);
+        }
+    }
+    else {
+        cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                          "%RTnaipv4 -> %RTnaipv4",
+                          ip4_addr_get_u32(ipX_2_ip(&pcb->src)),
+                          ip4_addr_get_u32(ipX_2_ip(&pcb->dst)));
+        if (pcb->is_mapped) {
+            cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                              " (%RTnaipv4)", pcb->peer.sin.sin_addr.s_addr);
+        }
+    }
+                      
+    cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL,
+                      " id %04x->%04x", ntohs(pcb->guest_id), ntohs(pcb->host_id));
 
-    DPRINTF((" id %04x->%04x", ntohs(pcb->guest_id), ntohs(pcb->host_id)));
+    return cb;
 }
 
 
@@ -930,15 +967,14 @@ pxping_pcb_for_request(struct pxping *pxping,
         pxping_pcb_register(pxping, pcb);
         sys_mutex_unlock(&pxping->lock);
 
-        pxping_pcb_debug_print(pcb); /* XXX */
-        DPRINTF((" - created\n"));
+        DPRINTF(("ping %p: %R[ping_pcb] - created\n", pcb, pcb));
 
         pxping_timer_needed(pxping);
     }
     else {
         /* just bump up expiration timeout lazily */
-        pxping_pcb_debug_print(pcb); /* XXX */
-        DPRINTF((" - slot %d -> %d\n",
+        DPRINTF(("ping %p: %R[ping_pcb] - slot %d -> %d\n",
+                 pcb, pcb,
                  (unsigned int)pcb->timeout_slot,
                  (unsigned int)pxping->timeout_slot));
         pcb->timeout_slot = pxping->timeout_slot;
@@ -1050,11 +1086,11 @@ pxping_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
         status = getsockopt(fd, SOL_SOCKET,
                             SO_ERROR, (char *)&sockerr, &optlen);
         if (status < 0) {
-            DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",
-                     __func__, fd, errno));
+            DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
+                     __func__, fd, SOCKERRNO()));
         }
         else {
-            DPRINTF(("%s: sock %d: errno %d\n",
+            DPRINTF(("%s: sock %d: %R[sockerr]\n",
                      __func__, fd, sockerr));
         }
     }
@@ -1086,7 +1122,7 @@ pxping_pmgr_icmp4(struct pxping *pxping)
     ssize_t nread;
     struct ip_hdr *iph;
     struct icmp_echo_hdr *icmph;
-    u16_t iplen;
+    u16_t iplen, ipoff;
 
     memset(&sin, 0, sizeof(sin));
 
@@ -1097,7 +1133,7 @@ pxping_pmgr_icmp4(struct pxping *pxping)
     nread = recvfrom(pxping->sock4, pollmgr_udpbuf, sizeof(pollmgr_udpbuf), 0,
                      (struct sockaddr *)&sin, &salen);
     if (nread < 0) {
-        perror(__func__);
+        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
         return;
     }
 
@@ -1116,8 +1152,15 @@ pxping_pmgr_icmp4(struct pxping *pxping)
     }
 
     /* no fragmentation */
-    if ((IPH_OFFSET(iph) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
-        DPRINTF2(("%s: dropping fragmented datagram\n", __func__));
+    ipoff = IPH_OFFSET(iph);
+#if defined(RT_OS_DARWIN)
+    /* darwin reports IPH_OFFSET in host byte order */
+    ipoff = htons(ipoff);
+    IPH_OFFSET_SET(iph, ipoff);
+#endif
+    if ((ipoff & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {
+        DPRINTF2(("%s: dropping fragmented datagram (0x%04x)\n",
+                  __func__, ntohs(ipoff)));
         return;
     }
 
@@ -1141,7 +1184,7 @@ pxping_pmgr_icmp4(struct pxping *pxping)
 #if defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS)
     /* darwin and solaris change IPH_LEN to payload length only */
     iplen += IP_HLEN;           /* we verified there are no options */
-    IPH_LEN(iph) = htons(iplen);
+    IPH_LEN_SET(iph, htons(iplen));
 #endif
     if (nread < iplen) {
         DPRINTF2(("%s: read %d bytes but total length is %d bytes\n",
@@ -1185,6 +1228,7 @@ pxping_pmgr_icmp4_echo(struct pxping *pxping,
     int mapped;
     struct ping_pcb *pcb;
     u16_t guest_id;
+    u16_t oipsum;
     u32_t sum;
 
     iph = (struct ip_hdr *)pollmgr_udpbuf;
@@ -1193,15 +1237,8 @@ pxping_pmgr_icmp4_echo(struct pxping *pxping,
     id  = icmph->id;
     seq = icmph->seqno;
 
-    {
-        char addrbuf[sizeof "255.255.255.255"];
-        const char *addrstr;
-
-        addrstr = inet_ntop(AF_INET, &peer->sin_addr, addrbuf, sizeof(addrbuf));
-        DPRINTF(("<--- PING %s id 0x%x seq %d\n",
-                 addrstr, ntohs(id), ntohs(seq)));
-    }
-
+    DPRINTF(("<--- PING %RTnaipv4 id 0x%x seq %d\n",
+             peer->sin_addr.s_addr, ntohs(id), ntohs(seq)));
 
     /*
      * Is this a reply to one of our pings?
@@ -1245,19 +1282,33 @@ pxping_pmgr_icmp4_echo(struct pxping *pxping,
     icmph->chksum = ~sum;
 
     /* rewrite IP header */
-    sum = (u16_t)~IPH_CHKSUM(iph);
-    sum += chksum_update_32((u32_t *)&iph->dest,
-                                ip4_addr_get_u32(&guest_ip));
-    if (mapped == PXREMAP_MAPPED) {
-        sum += chksum_update_32((u32_t *)&iph->src,
-                                    ip4_addr_get_u32(&target_ip));
+    oipsum = IPH_CHKSUM(iph);
+    if (oipsum == 0) {
+        /* Solaris doesn't compute checksum for local replies */
+        ip_addr_copy(iph->dest, guest_ip);
+        if (mapped == PXREMAP_MAPPED) {
+            ip_addr_copy(iph->src, target_ip);
+        }
+        else {
+            IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
+        }
+        IPH_CHKSUM_SET(iph, inet_chksum(iph, ntohs(IPH_LEN(iph))));
     }
     else {
-        IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
-        sum += PP_NTOHS(~0x0100);
+        sum = (u16_t)~oipsum;
+        sum += chksum_update_32((u32_t *)&iph->dest,
+                                ip4_addr_get_u32(&guest_ip));
+        if (mapped == PXREMAP_MAPPED) {
+            sum += chksum_update_32((u32_t *)&iph->src,
+                                    ip4_addr_get_u32(&target_ip));
+        }
+        else {
+            IPH_TTL_SET(iph, IPH_TTL(iph) - 1);
+            sum += PP_NTOHS(~0x0100);
+        }
+        sum = FOLD_U32T(sum);
+        IPH_CHKSUM_SET(iph, ~sum);
     }
-    sum = FOLD_U32T(sum);
-    IPH_CHKSUM_SET(iph, ~sum);
 
     pxping_pmgr_forward_inbound(pxping, iplen);
 }
@@ -1337,19 +1388,13 @@ pxping_pmgr_icmp4_error(struct pxping *pxping,
     id  = oicmph->id;
     seq = oicmph->seqno;
 
-    {
-        char addrbuf[sizeof "255.255.255.255"];
-        const char *addrstr;
-
-        addrstr = inet_ntop(AF_INET, &oiph->dest, addrbuf, sizeof(addrbuf));
-        DPRINTF2(("%s: ping %s id 0x%x seq %d",
-                  __func__, addrstr, ntohs(id), ntohs(seq)));
-        if (ICMPH_TYPE(icmph) == ICMP_DUR) {
-            DPRINTF2((" unreachable (code %d)\n", ICMPH_CODE(icmph)));
-        }
-        else {
-            DPRINTF2((" time exceeded\n"));
-        }
+    DPRINTF2(("%s: ping %RTnaipv4 id 0x%x seq %d",
+              __func__, ip4_addr_get_u32(&oiph->dest), ntohs(id), ntohs(seq)));
+    if (ICMPH_TYPE(icmph) == ICMP_DUR) {
+        DPRINTF2((" unreachable (code %d)\n", ICMPH_CODE(icmph)));
+    }
+    else {
+        DPRINTF2((" time exceeded\n"));
     }
 
 
@@ -1403,6 +1448,10 @@ pxping_pmgr_icmp4_error(struct pxping *pxping,
     oicmph->chksum = ~sum;
 
     /* rewrite inner IP header */
+#if defined(RT_OS_DARWIN)
+    /* darwin converts inner length to host byte order too */
+    IPH_LEN_SET(oiph, htons(IPH_LEN(oiph)));
+#endif
     sum = (u16_t)~IPH_CHKSUM(oiph);
     sum += chksum_update_32((u32_t *)&oiph->src, ip4_addr_get_u32(&guest_ip));
     if (target_mapped == PXREMAP_MAPPED) {
@@ -1452,9 +1501,6 @@ pxping_pmgr_icmp6(struct pxping *pxping)
     int hopl, tclass;
     int status;
 
-    char addrbuf[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
-    const char *addrstr;
-
     /*
      * Reads from raw IPv6 sockets deliver only the payload.  Full
      * headers are available via recvmsg(2)/cmsg(3).
@@ -1474,7 +1520,7 @@ pxping_pmgr_icmp6(struct pxping *pxping)
 
     nread = recvmsg(pxping->sock6, &mh, 0);
     if (nread < 0) {
-        perror(__func__);
+        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
         return;
     }
 #else  /* RT_OS_WINDOWS */
@@ -1495,9 +1541,7 @@ pxping_pmgr_icmp6(struct pxping *pxping)
 
     icmph = (struct icmp6_echo_hdr *)pollmgr_udpbuf;
 
-    addrstr = inet_ntop(AF_INET6, (void *)&sin6.sin6_addr,
-                        addrbuf, sizeof(addrbuf));
-    DPRINTF2(("%s: %s ICMPv6: ", __func__, addrstr));
+    DPRINTF2(("%s: %RTnaipv6 ICMPv6: ", __func__, &sin6.sin6_addr));
 
     if (icmph->type == ICMP6_TYPE_EREP) {
         DPRINTF2(("echo reply %04x %u\n",
@@ -1733,14 +1777,14 @@ pxping_pmgr_icmp6_error(struct pxping *pxping,
         return;
     }
 
-    memcpy(&target_ip, &oiph->dest, sizeof(target_ip)); /* inner (failed) */
+    ip6_addr_copy(target_ip, oiph->dest); /* inner (failed) */
     target_mapped = pxremap_inbound_ip6(&target_ip, &target_ip);
     if (target_mapped == PXREMAP_FAILED) {
         return;
     }
 
     sys_mutex_lock(&pxping->lock);
-    pcb = pxping_pcb_for_reply(pxping, 1, ip_2_ipX(&target_ip), oicmph->id);
+    pcb = pxping_pcb_for_reply(pxping, 1, ip6_2_ipX(&target_ip), oicmph->id);
     if (pcb == NULL) {
         sys_mutex_unlock(&pxping->lock);
         DPRINTF2(("%s: no match\n", __func__));
diff --git a/src/VBox/NetworkServices/NAT/pxping_win.c b/src/VBox/NetworkServices/NAT/pxping_win.c
index 58eb9c8..21254b5 100644
--- a/src/VBox/NetworkServices/NAT/pxping_win.c
+++ b/src/VBox/NetworkServices/NAT/pxping_win.c
@@ -1,4 +1,5 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
 
 #include "winutils.h"
 #include "proxy.h"
@@ -301,7 +302,7 @@ pxping_icmp4_callback(struct pong4 *pong)
     int mapped;
 
     nreplies = IcmpParseReplies(pong->buf, (DWORD)pong->bufsize);
-    if (nreplies <= 0) {
+    if (nreplies == 0) {
         DWORD error = GetLastError();
         if (error == IP_REQ_TIMED_OUT) {
             DPRINTF2(("pong4: %p timed out\n", (void *)pong));
@@ -580,7 +581,7 @@ pxping_icmp6_callback(struct pong6 *pong)
     int mapped;
 
     nreplies = Icmp6ParseReplies(pong->buf, (DWORD)pong->bufsize);
-    if (nreplies <= 0) {
+    if (nreplies == 0) {
         DWORD error = GetLastError();
         if (error == IP_REQ_TIMED_OUT) {
             DPRINTF2(("pong6: %p timed out\n", (void *)pong));
diff --git a/src/VBox/NetworkServices/NAT/pxremap.c b/src/VBox/NetworkServices/NAT/pxremap.c
index 616bad9..d108051 100644
--- a/src/VBox/NetworkServices/NAT/pxremap.c
+++ b/src/VBox/NetworkServices/NAT/pxremap.c
@@ -11,6 +11,8 @@
  *
  * Ditto for IPv6, except that IPv6 only has one loopback address.
  */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 #include "pxremap.h"
 #include "proxy.h"
diff --git a/src/VBox/NetworkServices/NAT/pxtcp.c b/src/VBox/NetworkServices/NAT/pxtcp.c
index 8bdc558..efa3e25 100644
--- a/src/VBox/NetworkServices/NAT/pxtcp.c
+++ b/src/VBox/NetworkServices/NAT/pxtcp.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "winutils.h"
 
 #include "pxtcp.h"
@@ -40,11 +42,19 @@
 #include "lwip/icmp.h"
 #include "lwip/icmp6.h"
 
-/* NetBSD doesn't report POLLHUP for TCP sockets */
-#ifdef __NetBSD__
-# define HAVE_TCP_POLLHUP 0
+/*
+ * Different OSes have different quirks in reporting POLLHUP for TCP
+ * sockets.
+ *
+ * Using shutdown(2) "how" values here would be more readable, but
+ * since SHUT_RD is 0, we can't use 0 for "none", unfortunately.
+ */
+#if defined(RT_OS_NETBSD) || defined(RT_OS_SOLARIS)
+# define HAVE_TCP_POLLHUP 0                     /* not reported */
+#elif defined(RT_OS_DARWIN)
+# define HAVE_TCP_POLLHUP POLLIN                /* reported when remote closes */
 #else
-# define HAVE_TCP_POLLHUP 1
+# define HAVE_TCP_POLLHUP (POLLIN|POLLOUT)      /* reported when both directions are closed */
 #endif
 
 
@@ -169,9 +179,6 @@ struct pxtcp {
      * the guest: lwIP may need to resend and the data are in pxtcp's
      * inbuf::buf.  We defer delete until all data are acked to
      * pxtcp_pcb_sent().
-     *
-     * It's also implied by inbound_pull.  It probably means that
-     * "deferred" is not a very fortunate name.
      */
     int deferred_delete;
 
@@ -210,7 +217,7 @@ static void pxtcp_pcb_dissociate(struct pxtcp *);
 static int pxtcp_pmgr_chan_add(struct pollmgr_handler *, SOCKET, int);
 static int pxtcp_pmgr_chan_pollout(struct pollmgr_handler *, SOCKET, int);
 static int pxtcp_pmgr_chan_pollin(struct pollmgr_handler *, SOCKET, int);
-#if !HAVE_TCP_POLLHUP
+#if !(HAVE_TCP_POLLHUP & POLLOUT)
 static int pxtcp_pmgr_chan_del(struct pollmgr_handler *, SOCKET, int);
 #endif
 static int pxtcp_pmgr_chan_reset(struct pollmgr_handler *, SOCKET, int);
@@ -225,7 +232,9 @@ static struct pxtcp *pxtcp_chan_recv_strong(struct pollmgr_handler *, SOCKET, in
 static int pxtcp_pmgr_connect(struct pollmgr_handler *, SOCKET, int);
 static int pxtcp_pmgr_pump(struct pollmgr_handler *, SOCKET, int);
 
+/* get incoming traffic into ring buffer */
 static ssize_t pxtcp_sock_read(struct pxtcp *, int *);
+static ssize_t pxtcp_sock_recv(struct pxtcp *, IOVEC *, size_t); /* default */
 
 /* convenience functions for poll manager callbacks */
 static int pxtcp_schedule_delete(struct pxtcp *);
@@ -253,6 +262,8 @@ static void pxtcp_pcb_err(void *, err_t);
 static err_t pxtcp_pcb_forward_outbound(struct pxtcp *, struct pbuf *);
 static void pxtcp_pcb_forward_outbound_close(struct pxtcp *);
 
+static ssize_t pxtcp_sock_send(struct pxtcp *, IOVEC *, size_t);
+
 static void pxtcp_pcb_forward_inbound(struct pxtcp *);
 static void pxtcp_pcb_forward_inbound_close(struct pxtcp *);
 DECLINLINE(int) pxtcp_pcb_forward_inbound_done(const struct pxtcp *);
@@ -266,7 +277,7 @@ DECLINLINE(void) pxtcp_pcb_maybe_deferred_delete(struct pxtcp *);
 static struct pollmgr_handler pxtcp_pmgr_chan_add_hdl;
 static struct pollmgr_handler pxtcp_pmgr_chan_pollout_hdl;
 static struct pollmgr_handler pxtcp_pmgr_chan_pollin_hdl;
-#if !HAVE_TCP_POLLHUP
+#if !(HAVE_TCP_POLLHUP & POLLOUT)
 static struct pollmgr_handler pxtcp_pmgr_chan_del_hdl;
 #endif
 static struct pollmgr_handler pxtcp_pmgr_chan_reset_hdl;
@@ -292,7 +303,7 @@ pxtcp_init(void)
     CHANNEL(POLLMGR_CHAN_PXTCP_ADD,     pxtcp_pmgr_chan_add);
     CHANNEL(POLLMGR_CHAN_PXTCP_POLLIN,  pxtcp_pmgr_chan_pollin);
     CHANNEL(POLLMGR_CHAN_PXTCP_POLLOUT, pxtcp_pmgr_chan_pollout);
-#if !HAVE_TCP_POLLHUP
+#if !(HAVE_TCP_POLLHUP & POLLOUT)
     CHANNEL(POLLMGR_CHAN_PXTCP_DEL,     pxtcp_pmgr_chan_del);
 #endif
     CHANNEL(POLLMGR_CHAN_PXTCP_RESET,   pxtcp_pmgr_chan_reset);
@@ -480,7 +491,7 @@ pxtcp_pmgr_chan_pollin(struct pollmgr_handler *handler, SOCKET fd, int revents)
 }
 
 
-#if !HAVE_TCP_POLLHUP
+#if !(HAVE_TCP_POLLHUP & POLLOUT)
 /**
  * POLLMGR_CHAN_PXTCP_DEL handler.
  *
@@ -511,7 +522,7 @@ pxtcp_pmgr_chan_del(struct pollmgr_handler *handler, SOCKET fd, int revents)
 
     return POLLIN;
 }
-#endif  /* !HAVE_TCP_POLLHUP  */
+#endif  /* !(HAVE_TCP_POLLHUP & POLLOUT)  */
 
 
 /**
@@ -928,7 +939,7 @@ pxtcp_pcb_accept_refuse(void *ctx)
 {
     struct pxtcp *pxtcp = (struct pxtcp *)ctx;
 
-    DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: errno %d\n",
+    DPRINTF0(("%s: pxtcp %p, pcb %p, sock %d: %R[sockerr]\n",
               __func__, (void *)pxtcp, (void *)pxtcp->pcb,
               pxtcp->sock, pxtcp->sockerr));
 
@@ -999,7 +1010,7 @@ pxtcp_pcb_heard(void *arg, struct tcp_pcb *newpcb, err_t error)
     sock = proxy_connected_socket(sdom, SOCK_STREAM,
                                   &dst_addr, newpcb->local_port);
     if (sock == INVALID_SOCKET) {
-        sockerr = errno;
+        sockerr = SOCKERRNO();
         goto abort;
     }
 
@@ -1031,7 +1042,7 @@ pxtcp_pcb_heard(void *arg, struct tcp_pcb *newpcb, err_t error)
     return ERR_OK;
 
   abort:
-    DPRINTF0(("%s: pcb %p, sock %d: errno %d\n",
+    DPRINTF0(("%s: pcb %p, sock %d: %R[sockerr]\n",
               __func__, (void *)newpcb, sock, sockerr));
     pxtcp_pcb_reject(ip_current_netif(), newpcb, p, sockerr);
     return ERR_ABRT;
@@ -1073,7 +1084,6 @@ static int
 pxtcp_pmgr_connect(struct pollmgr_handler *handler, SOCKET fd, int revents)
 {
     struct pxtcp *pxtcp;
-    int sockerr;
 
     pxtcp = (struct pxtcp *)handler->data;
     LWIP_ASSERT1(handler == &pxtcp->pmhdl);
@@ -1085,24 +1095,19 @@ pxtcp_pmgr_connect(struct pollmgr_handler *handler, SOCKET fd, int revents)
             pxtcp->sockerr = ETIMEDOUT;
         }
         else {
-            socklen_t optlen = (socklen_t)sizeof(sockerr);
+            socklen_t optlen = (socklen_t)sizeof(pxtcp->sockerr);
             int status;
             SOCKET s;
 
             status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR,
                                 (char *)&pxtcp->sockerr, &optlen);
-            if (status < 0) {       /* should not happen */
-                sockerr = errno;    /* ??? */
-                perror("connect: getsockopt");
+            if (status < 0) {   /* should not happen */
+                DPRINTF(("%s: sock %d: SO_ERROR failed: %R[sockerr]\n",
+                         __func__, fd, SOCKERRNO()));
             }
             else {
-#ifndef RT_OS_WINDOWS
-                errno = pxtcp->sockerr; /* to avoid strerror_r */
-#else
-                /* see winutils.h */
-                WSASetLastError(pxtcp->sockerr);
-#endif
-                perror("connect");
+                DPRINTF(("%s: sock %d: connect: %R[sockerr]\n",
+                         __func__, fd, pxtcp->sockerr));
             }
             s = pxtcp->sock;
             pxtcp->sock = INVALID_SOCKET;
@@ -1372,18 +1377,14 @@ pxtcp_pcb_forward_outbound_close(struct pxtcp *pxtcp)
              (void *)pxtcp, (void *)pcb, tcp_debug_state_str(pcb->state)));
 
 
-    /*
-     * NB: set the flag first, since shutdown() will trigger POLLHUP
-     * if inbound is already closed, and poll manager asserts
-     * outbound_close_done (may be it should not?).
-     */
+    /* set the flag first, since shutdown() may trigger POLLHUP */
     pxtcp->outbound_close_done = 1;
     shutdown(pxtcp->sock, SHUT_WR); /* half-close the socket */
 
-#if !HAVE_TCP_POLLHUP
+#if !(HAVE_TCP_POLLHUP & POLLOUT)
     /*
-     * On NetBSD POLLHUP is not reported for TCP sockets, so we need
-     * to nudge poll manager manually.
+     * We need to nudge poll manager manually, since OS will not
+     * report POLLHUP.
      */
     if (pxtcp->inbound_close) {
         pxtcp_chan_send_weak(POLLMGR_CHAN_PXTCP_DEL, pxtcp);
@@ -1425,13 +1426,6 @@ pxtcp_pcb_forward_outbound(struct pxtcp *pxtcp, struct pbuf *p)
     size_t forwarded;
     int sockerr;
 
-#if defined(MSG_NOSIGNAL)
-    const int send_flags = MSG_NOSIGNAL;
-#else
-    const int send_flags = 0;
-#endif
-
-
     LWIP_ASSERT1(pxtcp->unsent == NULL || pxtcp->unsent == p);
 
     forwarded = 0;
@@ -1442,11 +1436,6 @@ pxtcp_pcb_forward_outbound(struct pxtcp *pxtcp, struct pbuf *p)
 
     qs = p;
     while (qs != NULL) {
-#ifndef RT_OS_WINDOWS
-        struct msghdr mh;
-#else
-        int rc;
-#endif
         IOVEC iov[8];
         const size_t iovsize = sizeof(iov)/sizeof(iov[0]);
         size_t fwd1;
@@ -1461,30 +1450,11 @@ pxtcp_pcb_forward_outbound(struct pxtcp *pxtcp, struct pbuf *p)
             fwd1 += q->len;
         }
 
-#ifndef RT_OS_WINDOWS
-        memset(&mh, 0, sizeof(mh));
-        mh.msg_iov = iov;
-        mh.msg_iovlen = i;
-
-        nsent = sendmsg(pxtcp->sock, &mh, send_flags);
-#else
-        /**
-         * WSASend(,,,DWORD *,,,) - takes SSIZE_T (64bit value) ... so all nsent's
-         * bits should be zeroed before passing to WSASent.
+        /*
+         * TODO: This is where application-level proxy can hook into
+         * to process outbound traffic.
          */
-        nsent = 0;
-        rc = WSASend(pxtcp->sock, iov, (DWORD)i, (DWORD *)&nsent, 0, NULL, NULL);
-        if (rc == SOCKET_ERROR) {
-            /* WSASent reports SOCKET_ERROR and updates error accessible with
-             * WSAGetLastError(). We assign nsent to -1, enforcing code below
-             * to access error in BSD style.
-             */
-            warn("pxtcp_pcb_forward_outbound:WSASend error:%d nsent:%d\n",
-                 WSAGetLastError(),
-                 nsent);
-            nsent = -1;
-       }
-#endif
+        nsent = pxtcp_sock_send(pxtcp, iov, i);
 
         if (nsent == (ssize_t)fwd1) {
             /* successfully sent this chain fragment completely */
@@ -1508,18 +1478,15 @@ pxtcp_pcb_forward_outbound(struct pxtcp *pxtcp, struct pbuf *p)
             break;
         }
         else {
+            sockerr = -nsent;
+
             /*
              * Some errors are really not errors - if we get them,
              * it's not different from getting nsent == 0, so filter
              * them out here.
              */
-            if (errno != EWOULDBLOCK
-                && errno != EAGAIN
-                && errno != ENOBUFS
-                && errno != ENOMEM
-                && errno != EINTR)
-            {
-                sockerr = errno;
+            if (proxy_error_is_transient(sockerr)) {
+                sockerr = 0;
             }
             q = qs;
             qoff = 0;
@@ -1580,6 +1547,49 @@ pxtcp_pcb_forward_outbound(struct pxtcp *pxtcp, struct pbuf *p)
 }
 
 
+#if !defined(RT_OS_WINDOWS)
+static ssize_t
+pxtcp_sock_send(struct pxtcp *pxtcp, IOVEC *iov, size_t iovlen)
+{
+    struct msghdr mh;
+    ssize_t nsent;
+
+#ifdef MSG_NOSIGNAL
+    const int send_flags = MSG_NOSIGNAL;
+#else
+    const int send_flags = 0;
+#endif
+
+    memset(&mh, 0, sizeof(mh));
+
+    mh.msg_iov = iov;
+    mh.msg_iovlen = iovlen;
+
+    nsent = sendmsg(pxtcp->sock, &mh, send_flags);
+    if (nsent < 0) {
+        nsent = -SOCKERRNO();
+    }
+
+    return nsent;
+}
+#else /* RT_OS_WINDOWS */
+static ssize_t
+pxtcp_sock_send(struct pxtcp *pxtcp, IOVEC *iov, size_t iovlen)
+{
+    DWORD nsent;
+    int status;
+
+    status = WSASend(pxtcp->sock, iov, (DWORD)iovlen, &nsent,
+                     0, NULL, NULL);
+    if (status == SOCKET_ERROR) {
+        return -SOCKERRNO();
+    }
+
+    return nsent;
+}
+#endif /* RT_OS_WINDOWS */
+
+
 /**
  * Callback from poll manager (on POLLOUT) to send data from
  * pxtcp::unsent pbuf to socket.
@@ -1624,11 +1634,12 @@ pxtcp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
         status = getsockopt(pxtcp->sock, SOL_SOCKET, SO_ERROR,
                             (char *)&sockerr, &optlen);
         if (status < 0) {       /* should not happen */
-            perror("getsockopt");
-            sockerr = ECONNRESET;
+            DPRINTF(("sock %d: SO_ERROR failed: %R[sockerr]\n",
+                     fd, SOCKERRNO()));
+        }
+        else {
+            DPRINTF0(("sock %d: %R[sockerr]\n", fd, sockerr));
         }
-
-        DPRINTF0(("sock %d: errno %d\n", fd, sockerr));
         return pxtcp_schedule_reset(pxtcp);
     }
 
@@ -1644,7 +1655,7 @@ pxtcp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
         nread = pxtcp_sock_read(pxtcp, &stop_pollin);
         if (nread < 0) {
             sockerr = -(int)nread;
-            DPRINTF0(("sock %d: errno %d\n", fd, sockerr));
+            DPRINTF0(("sock %d: %R[sockerr]\n", fd, sockerr));
             return pxtcp_schedule_reset(pxtcp);
         }
 
@@ -1671,79 +1682,45 @@ pxtcp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
     LWIP_ASSERT1((revents & POLLHUP) == 0);
 #else
     if (revents & POLLHUP) {
+#if HAVE_TCP_POLLHUP == POLLIN
         /*
-         * Linux and Darwin seems to report POLLHUP when both
-         * directions are shut down.  And they do report POLLHUP even
-         * when there's unread data (which they aslo report as POLLIN
-         * along with that POLLHUP).
-         *
-         * FreeBSD (from source inspection) seems to follow Linux,
-         * reporting POLLHUP when both directions are shut down, but
-         * POLLHUP is always accompanied with POLLIN.
-         *
-         * NetBSD never reports POLLHUP for sockets.
-         *
-         * ---
-         *
-         * If external half-closes first, we don't get POLLHUP, we
-         * recv 0 bytes from the socket as EOF indicator, stop polling
-         * for POLLIN and poll with events == 0 (with occasional
-         * one-shot POLLOUT).  When guest eventually closes, we get
-         * POLLHUP.
-         *
-         * If guest half-closes first things are more tricky.  As soon
-         * as host sees the FIN from external it will spam POLLHUP,
-         * even when there's unread data.  The problem is that we
-         * might have stopped polling for POLLIN because the ring
-         * buffer is full or we were polling POLLIN but can't read all
-         * of the data becuase buffer doesn't have enough space.
-         * Either way, there's unread data but we can't keep polling
-         * the socket.
+         * Remote closed inbound.
          */
-        DPRINTF(("sock %d: HUP\n", fd));
-        LWIP_ASSERT1(pxtcp->outbound_close_done);
-
-        if (pxtcp->inbound_close) {
-            /* there's no unread data, we are done */
-            return pxtcp_schedule_delete(pxtcp);
+        if (!pxtcp->outbound_close_done) {
+            /* 
+             * We might still need to poll for POLLOUT, but we can not
+             * poll for POLLIN anymore (even if not all data are read)
+             * because we will be spammed by POLLHUP.
+             */
+            pxtcp->events &= ~POLLIN;
+            if (!pxtcp->inbound_close) {
+                /* the rest of the input has to be pulled */
+                proxy_lwip_post(&pxtcp->msg_inpull);
+            }
         }
-        else {
-            /* DPRINTF */ {
-#ifndef RT_OS_WINDOWS
-                int unread;
-#else
-                u_long unread;
+        else
 #endif
-                status = ioctlsocket(fd, FIONREAD, &unread);
-                if (status == SOCKET_ERROR) {
-                    perror("FIONREAD");
-                }
-                else {
-                    DPRINTF2(("sock %d: %d UNREAD bytes\n", fd, unread));
-                }
-            }
+        /*
+         * Both directions are closed.
+         */
+        {
+            DPRINTF(("sock %d: HUP\n", fd));
+            LWIP_ASSERT1(pxtcp->outbound_close_done);
 
-            /*
-             * We cannot just set a flag here and let pxtcp_pcb_sent()
-             * notice and start pulling, because if we are preempted
-             * before setting the flag and all data in inbuf is ACKed
-             * there will be no more calls to pxtcp_pcb_sent() to
-             * notice the flag.
-             *
-             * We cannot set a flag and then send a message to make
-             * sure it noticed, because if it has and it has read all
-             * data while the message is in transit it will delete
-             * pxtcp.
-             *
-             * In a sense this message is like msg_delete (except we
-             * ask to pull some data first).
-             */
-            proxy_lwip_post(&pxtcp->msg_inpull);
-            pxtcp->pmhdl.slot = -1;
-            return -1;
+            if (pxtcp->inbound_close) {
+                /* there's no unread data, we are done */
+                return pxtcp_schedule_delete(pxtcp);
+            }
+            else {
+                /* pull the rest of the input first (deferred_delete) */
+                pxtcp->pmhdl.slot = -1;
+                proxy_lwip_post(&pxtcp->msg_inpull);
+                return -1;
+            }
+            /* NOTREACHED */
         }
-        /* NOTREACHED */
-    } /* POLLHUP */
+
+    }
 #endif  /* HAVE_TCP_POLLHUP */
 
     return pxtcp->events;
@@ -1761,7 +1738,7 @@ pxtcp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
  * Returns number of bytes read.  NB: EOF is reported as 1!
  *
  * Returns zero if nothing was read, either because buffer is full, or
- * if no data is available (EAGAIN, EINTR &c).
+ * if no data is available (EWOULDBLOCK, EINTR &c).
  *
  * Returns -errno on real socket errors.
  */
@@ -1769,13 +1746,7 @@ static ssize_t
 pxtcp_sock_read(struct pxtcp *pxtcp, int *pstop)
 {
     IOVEC iov[2];
-#ifndef RT_OS_WINDOWS
-    struct msghdr mh;
-#else
-    DWORD dwFlags;
-    int rc;
-#endif
-    int iovlen;
+    size_t iovlen;
     ssize_t nread;
 
     const size_t sz = pxtcp->inbuf.bufsize;
@@ -1783,11 +1754,6 @@ pxtcp_sock_read(struct pxtcp *pxtcp, int *pstop)
 
     *pstop = 0;
 
-#ifndef RT_OS_WINDOWS
-    memset(&mh, 0, sizeof(mh));
-    mh.msg_iov = iov;
-#endif
-
     beg = pxtcp->inbuf.vacant;
     IOVEC_SET_BASE(iov[0], &pxtcp->inbuf.buf[beg]);
 
@@ -1796,7 +1762,7 @@ pxtcp_sock_read(struct pxtcp *pxtcp, int *pstop)
     if (lim == 0) {
         lim = sz - 1;           /* empty slot at the end */
     }
-    else if (lim == 1) {
+    else if (lim == 1 && beg != 0) {
         lim = sz;               /* empty slot at the beginning */
     }
     else {
@@ -1827,31 +1793,11 @@ pxtcp_sock_read(struct pxtcp *pxtcp, int *pstop)
         IOVEC_SET_LEN(iov[1], lim);
     }
 
-#ifndef RT_OS_WINDOWS
-    mh.msg_iovlen = iovlen;
-    nread = recvmsg(pxtcp->sock, &mh, 0);
-#else
-    dwFlags = 0;
-    /* We can't assign nread to -1 expecting, that we'll got it back in case of error,
-     * instead, WSARecv(,,,DWORD *,,,) will rewrite only half of the 64bit value.
+    /*
+     * TODO: This is where application-level proxy can hook into to
+     * process inbound traffic.
      */
-    nread = 0;
-    rc = WSARecv(pxtcp->sock, iov, iovlen, (DWORD *)&nread, &dwFlags, NULL, NULL);
-    if (rc == SOCKET_ERROR) {
-        warn("pxtcp_sock_read:WSARecv(%d) error:%d nread:%d\n",
-             pxtcp->sock,
-             WSAGetLastError(),
-             nread);
-        nread = -1;
-    }
-
-    if (dwFlags) {
-        warn("pxtcp_sock_read:WSARecv(%d) dwFlags:%x nread:%d\n",
-             pxtcp->sock,
-             WSAGetLastError(),
-             nread);
-    }
-#endif
+    nread = pxtcp_sock_recv(pxtcp, iov, iovlen);
 
     if (nread > 0) {
         wrnew = beg + nread;
@@ -1870,21 +1816,64 @@ pxtcp_sock_read(struct pxtcp *pxtcp, int *pstop)
                  (void *)pxtcp, pxtcp->sock));
         return 1;
     }
-    else if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) {
-        /* haven't read anything, just return */
-        DPRINTF2(("pxtcp %p: sock %d read cancelled\n",
-                  (void *)pxtcp, pxtcp->sock));
-        return 0;
-    }
     else {
-        /* socket error! */
-        DPRINTF0(("pxtcp %p: sock %d read errno %d\n",
-                  (void *)pxtcp, pxtcp->sock, errno));
-        return -errno;
+        int sockerr = -nread;
+
+        if (proxy_error_is_transient(sockerr)) {
+            /* haven't read anything, just return */
+            DPRINTF2(("pxtcp %p: sock %d read cancelled\n",
+                      (void *)pxtcp, pxtcp->sock));
+            return 0;
+        }
+        else {
+            /* socket error! */
+            DPRINTF0(("pxtcp %p: sock %d read: %R[sockerr]\n",
+                      (void *)pxtcp, pxtcp->sock, sockerr));
+            return -sockerr;
+        }
     }
 }
 
 
+#if !defined(RT_OS_WINDOWS)
+static ssize_t
+pxtcp_sock_recv(struct pxtcp *pxtcp, IOVEC *iov, size_t iovlen)
+{
+    struct msghdr mh;
+    ssize_t nread;
+
+    memset(&mh, 0, sizeof(mh));
+
+    mh.msg_iov = iov;
+    mh.msg_iovlen = iovlen;
+
+    nread = recvmsg(pxtcp->sock, &mh, 0);
+    if (nread < 0) {
+        nread = -SOCKERRNO();
+    }
+
+    return nread;
+}
+#else /* RT_OS_WINDOWS */
+static ssize_t
+pxtcp_sock_recv(struct pxtcp *pxtcp, IOVEC *iov, size_t iovlen)
+{
+    DWORD flags;
+    DWORD nread;
+    int status;
+
+    flags = 0;
+    status = WSARecv(pxtcp->sock, iov, (DWORD)iovlen, &nread,
+                     &flags, NULL, NULL);
+    if (status == SOCKET_ERROR) {
+        return -SOCKERRNO();
+    }
+
+    return (ssize_t)nread;
+}
+#endif /* RT_OS_WINDOWS */
+
+
 /**
  * Callback from poll manager (pxtcp::msg_inbound) to trigger output
  * from ringbuf to guest.
@@ -2203,7 +2192,6 @@ pxtcp_pcb_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
 
     if (/* __predict_false */ len == 0) {
         /* we are notified to start pulling */
-        LWIP_ASSERT1(pxtcp->outbound_close_done);
         LWIP_ASSERT1(!pxtcp->inbound_close);
         LWIP_ASSERT1(pxtcp->inbound_pull);
 
@@ -2244,7 +2232,7 @@ pxtcp_pcb_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
             if (nread < 0) {
                 int sockerr = -(int)nread;
                 LWIP_UNUSED_ARG(sockerr);
-                DPRINTF0(("%s: sock %d: errno %d\n",
+                DPRINTF0(("%s: sock %d: %R[sockerr]\n",
                           __func__, pxtcp->sock, sockerr));
 
                 /*
@@ -2319,10 +2307,17 @@ pxtcp_pcb_pull_inbound(void *ctx)
         return;
     }
 
-    DPRINTF(("%s: pxtcp %p: pcb %p\n",
-             __func__, (void *)pxtcp, (void *)pxtcp->pcb));
     pxtcp->inbound_pull = 1;
-    pxtcp->deferred_delete = 1;
+    if (pxtcp->outbound_close_done) {
+        DPRINTF(("%s: pxtcp %p: pcb %p (deferred delete)\n",
+                 __func__, (void *)pxtcp, (void *)pxtcp->pcb));
+        pxtcp->deferred_delete = 1;
+    }
+    else {
+        DPRINTF(("%s: pxtcp %p: pcb %p\n",
+                 __func__, (void *)pxtcp, (void *)pxtcp->pcb));
+    }
+
     pxtcp_pcb_sent(pxtcp, pxtcp->pcb, 0);
 }
 
diff --git a/src/VBox/NetworkServices/NAT/pxudp.c b/src/VBox/NetworkServices/NAT/pxudp.c
index 9213c7a..79a8342 100644
--- a/src/VBox/NetworkServices/NAT/pxudp.c
+++ b/src/VBox/NetworkServices/NAT/pxudp.c
@@ -1,4 +1,5 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
 
 #include "winutils.h"
 #include "proxy.h"
@@ -562,11 +563,11 @@ pxudp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
         status = getsockopt(pxudp->sock, SOL_SOCKET,
                             SO_ERROR, (char *)&sockerr, &optlen);
         if (status < 0) {
-            DPRINTF(("%s: sock %d: SO_ERROR failed with errno %d\n",
-                     __func__, pxudp->sock, errno));
+            DPRINTF(("%s: sock %d: SO_ERROR failed:%R[sockerr]\n",
+                     __func__, pxudp->sock, SOCKERRNO()));
         }
         else {
-            DPRINTF(("%s: sock %d: errno %d\n",
+            DPRINTF(("%s: sock %d: %R[sockerr]\n",
                      __func__, pxudp->sock, sockerr));
         }
     }
@@ -577,7 +578,7 @@ pxudp_pmgr_pump(struct pollmgr_handler *handler, SOCKET fd, int revents)
 
     nread = recv(pxudp->sock, pollmgr_udpbuf, sizeof(pollmgr_udpbuf), 0);
     if (nread == SOCKET_ERROR) {
-        perror(__func__);
+        DPRINTF(("%s: %R[sockerr]\n", __func__, SOCKERRNO()));
         return POLLIN;
     }
 
diff --git a/src/VBox/NetworkServices/NAT/rtmon_bsd.c b/src/VBox/NetworkServices/NAT/rtmon_bsd.c
index 52da301..529cca1 100644
--- a/src/VBox/NetworkServices/NAT/rtmon_bsd.c
+++ b/src/VBox/NetworkServices/NAT/rtmon_bsd.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "proxy.h"
 
 #include <sys/types.h>
diff --git a/src/VBox/NetworkServices/NAT/rtmon_linux.c b/src/VBox/NetworkServices/NAT/rtmon_linux.c
index ecbfe39..c225316 100644
--- a/src/VBox/NetworkServices/NAT/rtmon_linux.c
+++ b/src/VBox/NetworkServices/NAT/rtmon_linux.c
@@ -1,4 +1,6 @@
 /* -*- indent-tabs-mode: nil; -*- */
+#define LOG_GROUP LOG_GROUP_NAT_SERVICE
+
 #include "proxy.h"
 
 #include <sys/types.h>          /* must come before linux/netlink */
diff --git a/src/VBox/NetworkServices/NAT/winutils.h b/src/VBox/NetworkServices/NAT/winutils.h
index 281c0c6..580db8a 100644
--- a/src/VBox/NetworkServices/NAT/winutils.h
+++ b/src/VBox/NetworkServices/NAT/winutils.h
@@ -1,8 +1,9 @@
 #ifndef __WINUTILS_H_
 # define __WINUTILS_H_
 
+# include <iprt/cdefs.h>
+
 # ifdef RT_OS_WINDOWS
-#  include <iprt/cdefs.h>
 #  include <WinSock2.h>
 #  include <ws2tcpip.h>
 #  include <mswsock.h>
@@ -20,8 +21,6 @@
 #   define PF_LOCAL AF_INET
 #  endif
 
-#  define warn(...) DPRINTF2((__VA_ARGS__))
-#  define warnx warn
 #  ifdef DEBUG
 #   define err(code,...) do { \
       AssertMsgFailed((__VA_ARGS__));           \
@@ -36,77 +35,75 @@
 #  define __func__ __FUNCTION__
 #  define __attribute__(x) /* IGNORE */
 
-/*
- * XXX: inet_ntop() is only available starting from Vista.
- */
-DECLINLINE(PCSTR)
-inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
-{
-    DWORD size = (DWORD)StringBufSize;
-    int status;
-
-    if (Family == AF_INET)
-    {
-        struct sockaddr_in sin;
-        memset(&sin, 0, sizeof(sin));
-        sin.sin_family = AF_INET;
-        memcpy(&sin.sin_addr, pAddr, sizeof(sin.sin_addr));
-        sin.sin_port = 0;
-        status = WSAAddressToStringA((LPSOCKADDR)&sin, sizeof(sin), NULL,
-                                     pStringBuf, &size);
-    }
-    else if (Family == AF_INET6)
-    {
-        struct sockaddr_in6 sin6;
-        memset(&sin6, 0, sizeof(sin6));
-        sin6.sin6_family = AF_INET6;
-        memcpy(&sin6.sin6_addr, pAddr, sizeof(sin6.sin6_addr));
-        sin6.sin6_port = 0;
-        status = WSAAddressToStringA((LPSOCKADDR)&sin6, sizeof(sin6), NULL,
-                                     pStringBuf, &size);
-    }
-    else
-    {
-        WSASetLastError(WSAEAFNOSUPPORT);
-        return NULL;
-    }
-
-    if (status == SOCKET_ERROR)
-    {
-        return NULL;
-    }
-
-    return pStringBuf;
-}
-
-
-/**
- * tftpd emulation we're using POSIX operations which needs "DOS errno". see proxy_tftpd.c
- */
-#  ifndef _USE_WINSTD_ERRNO
-/**
- * http://msdn.microsoft.com/en-us/library/windows/desktop/ms737828(v=vs.85).aspx
- * "Error Codes - errno, h_errno and WSAGetLastError" says "Error codes set by Windows Sockets are
- *  not made available through the errno variable."
- */
-#   include <errno.h>
-#   ifdef errno
-#    undef errno
-#   endif
-#   define errno (WSAGetLastError())
-#  endif
-/* Missing errno codes */
+#  define SOCKERRNO() (WSAGetLastError())
 
 /**
  * "Windows Sockets Error Codes" obtained with WSAGetLastError().
  * http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
+ *
+ * This block of error codes from <winsock2.h> conflicts with "POSIX
+ * supplement" error codes from <errno.h>, but we don't expect to ever
+ * encounter the latter in the proxy code, so redefine them to their
+ * unixy names.
  */
+#  undef  EWOULDBLOCK
+#  define EWOULDBLOCK           WSAEWOULDBLOCK
+#  undef  EINPROGRESS
+#  define EINPROGRESS           WSAEINPROGRESS
+#  undef  EALREADY
+#  define EALREADY              WSAEALREADY
+#  undef  ENOTSOCK
+#  define ENOTSOCK              WSAENOTSOCK
+#  undef  EDESTADDRREQ
+#  define EDESTADDRREQ          WSAEDESTADDRREQ
 #  undef  EMSGSIZE
 #  define EMSGSIZE              WSAEMSGSIZE
+#  undef  EPROTOTYPE
+#  define EPROTOTYPE            WSAEPROTOTYPE
+#  undef  ENOPROTOOPT
+#  define ENOPROTOOPT           WSAENOPROTOOPT
+#  undef  EPROTONOSUPPORT
+#  define EPROTONOSUPPORT       WSAEPROTONOSUPPORT
+#  undef  ESOCKTNOSUPPORT
+#  define ESOCKTNOSUPPORT       WSAESOCKTNOSUPPORT
+#  undef  EOPNOTSUPP
+#  define EOPNOTSUPP            WSAEOPNOTSUPP
+#  undef  EPFNOSUPPORT
+#  define EPFNOSUPPORT          WSAEPFNOSUPPORT
+#  undef  EAFNOSUPPORT
+#  define EAFNOSUPPORT          WSAEAFNOSUPPORT
+#  undef  EADDRINUSE
+#  define EADDRINUSE            WSAEADDRINUSE
+#  undef  EADDRNOTAVAIL
+#  define EADDRNOTAVAIL         WSAEADDRNOTAVAIL
 #  undef  ENETDOWN
 #  define ENETDOWN              WSAENETDOWN
 #  undef  ENETUNREACH
 #  define ENETUNREACH           WSAENETUNREACH
+#  undef  ENETRESET
+#  define ENETRESET             WSAENETRESET
+#  undef  ECONNABORTED
+#  define ECONNABORTED          WSAECONNABORTED
+#  undef  ECONNRESET
+#  define ECONNRESET            WSAECONNRESET
+#  undef  ENOBUFS
+#  define ENOBUFS               WSAENOBUFS
+#  undef  EISCONN
+#  define EISCONN               WSAEISCONN
+#  undef  ENOTCONN
+#  define ENOTCONN              WSAENOTCONN
+#  undef  ESHUTDOWN
+#  define ESHUTDOWN             WSAESHUTDOWN
+#  undef  ETOOMANYREFS
+#  define ETOOMANYREFS          WSAETOOMANYREFS
+#  undef  ETIMEDOUT
+#  define ETIMEDOUT             WSAETIMEDOUT
+#  undef  ECONNREFUSED
+#  define ECONNREFUSED          WSAECONNREFUSED
+#  undef  ELOOP
+#  define ELOOP                 WSAELOOP
+#  undef  ENAMETOOLONG
+#  define ENAMETOOLONG          WSAENAMETOOLONG
 #  undef  EHOSTDOWN
 #  define EHOSTDOWN             WSAEHOSTDOWN
 #  undef  EHOSTUNREACH
@@ -148,12 +145,18 @@ int RTWinSocketPair(int domain, int type, int protocol, SOCKET socket_vector[2])
 RT_C_DECLS_END
 
 # else /* !RT_OS_WINDOWS */
-#  define ioctlsocket ioctl
-#  define closesocket close
+
+#  include <errno.h>
+
 #  define SOCKET int
 #  define INVALID_SOCKET (-1)
 #  define SOCKET_ERROR (-1)
 
+#  define SOCKERRNO() (errno)
+
+#  define closesocket(s) close(s)
+#  define ioctlsocket(s, req, arg) ioctl((s), (req), (arg))
+
 typedef struct iovec IOVEC;
 
 #  define IOVEC_GET_BASE(iov) ((iov).iov_base)
@@ -162,4 +165,23 @@ typedef struct iovec IOVEC;
 #  define IOVEC_GET_LEN(iov) ((iov).iov_len)
 #  define IOVEC_SET_LEN(iov, l) ((iov).iov_len = (l))
 # endif
+
+DECLINLINE(int)
+proxy_error_is_transient(int error)
+{
+# if !defined(RT_OS_WINDOWS)
+    return error == EWOULDBLOCK
+#  if EAGAIN != EWOULDBLOCK
+	|| error == EAGAIN
+#  endif
+	|| error == EINTR
+	|| error == ENOBUFS
+	|| error == ENOMEM;
+# else
+    return error == WSAEWOULDBLOCK
+	|| error == WSAEINTR	/* NB: we don't redefine EINTR above */
+	|| error == WSAENOBUFS;
+# endif
+}
+
 #endif
diff --git a/src/VBox/RDP/client/Makefile.in b/src/VBox/RDP/client/Makefile.in
index 145cad0..d61607b 100644
--- a/src/VBox/RDP/client/Makefile.in
+++ b/src/VBox/RDP/client/Makefile.in
@@ -28,7 +28,7 @@ VNCLINK     = @VNCLINK@
 SOUNDOBJ    = @SOUNDOBJ@
 SCARDOBJ    = @SCARDOBJ@
 
-RDPOBJ   = tcp.o iso.o mcs.o secure.o licence.o rdp.o orders.o bitmap.o cache.o rdp5.o channels.o rdpdr.o serial.o printer.o disk.o parallel.o printercache.o mppc.o pstcache.o lspci.o seamless.o ssl.o Runtime/common/alloc/alloc.o Runtime/common/err/errmsg.o Runtime/common/err/errmsgxpcom.o Runtime/common/err/RTErrConvertFromErrno.o Runtime/common/err/RTErrConvertToErrno.o Runtime/common/path/RTPathAppend.o Runtime/common/path/RTPathAppendEx.o Runtime/common/path/RTPathCountComponents.o R [...]
+RDPOBJ   = tcp.o iso.o mcs.o secure.o licence.o rdp.o orders.o bitmap.o cache.o rdp5.o channels.o rdpdr.o serial.o printer.o disk.o parallel.o printercache.o mppc.o pstcache.o lspci.o seamless.o ssl.o Runtime/common/alloc/alloc.o Runtime/common/err/errmsg.o Runtime/common/err/errmsgxpcom.o Runtime/common/err/RTErrConvertFromErrno.o Runtime/common/err/RTErrConvertToErrno.o Runtime/common/misc/sg.o Runtime/common/path/RTPathAppend.o Runtime/common/path/RTPathAppendEx.o Runtime/common/path/ [...]
 X11OBJ   = rdesktop.o xwin.o xkeymap.o ewmhints.o xclip.o cliprdr.o
 VNCOBJ   = vnc/rdp2vnc.o vnc/vnc.o vnc/xkeymap.o vnc/x11stubs.o
 
diff --git a/src/VBox/RDP/client/Makefile.kmk b/src/VBox/RDP/client/Makefile.kmk
index f3f8a74..abb1fbe 100644
--- a/src/VBox/RDP/client/Makefile.kmk
+++ b/src/VBox/RDP/client/Makefile.kmk
@@ -270,20 +270,27 @@ rdesktop-src_SOURCES = \
 	$(PATH_ROOT)/include/iprt/avl.h=>include/iprt/avl.h \
 	$(PATH_ROOT)/include/iprt/cdefs.h=>include/iprt/cdefs.h \
 	$(PATH_ROOT)/include/iprt/cpp/autores.h=>include/iprt/cpp/autores.h \
+	$(PATH_ROOT)/include/iprt/critsect.h=>include/iprt/critsect.h \
 	$(PATH_ROOT)/include/iprt/ctype.h=>include/iprt/ctype.h \
 	$(PATH_ROOT)/include/iprt/dir.h=>include/iprt/dir.h \
 	$(PATH_ROOT)/include/iprt/env.h=>include/iprt/env.h \
 	$(PATH_ROOT)/include/iprt/err.h=>include/iprt/err.h \
+	$(PATH_ROOT)/include/iprt/errno.h=>include/iprt/errno.h \
 	$(PATH_ROOT)/include/iprt/file.h=>include/iprt/file.h \
 	$(PATH_ROOT)/include/iprt/fs.h=>include/iprt/fs.h \
 	$(PATH_ROOT)/include/iprt/linux/sysfs.h=>include/iprt/linux/sysfs.h \
 	$(PATH_ROOT)/include/iprt/list.h=>include/iprt/list.h \
 	$(PATH_ROOT)/include/iprt/log.h=>include/iprt/log.h \
+	$(PATH_ROOT)/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \
 	$(PATH_ROOT)/include/iprt/mem.h=>include/iprt/mem.h \
 	$(PATH_ROOT)/include/iprt/net.h=>include/iprt/net.h \
 	$(PATH_ROOT)/include/iprt/param.h=>include/iprt/param.h \
 	$(PATH_ROOT)/include/iprt/path.h=>include/iprt/path.h \
+	$(PATH_ROOT)/include/iprt/pipe.h=>include/iprt/pipe.h \
+	$(PATH_ROOT)/include/iprt/poll.h=>include/iprt/poll.h \
 	$(PATH_ROOT)/include/iprt/process.h=>include/iprt/process.h \
+	$(PATH_ROOT)/include/iprt/queueatomic.h=>include/iprt/queueatomic.h \
+	$(PATH_ROOT)/include/iprt/sg.h=>include/iprt/sg.h \
 	$(PATH_ROOT)/include/iprt/stdarg.h=>include/iprt/stdarg.h \
 	$(PATH_ROOT)/include/iprt/stdint.h=>include/iprt/stdint.h \
 	$(PATH_ROOT)/include/iprt/stream.h=>include/iprt/stream.h \
@@ -314,6 +321,7 @@ rdesktop-src_SOURCES = \
 	$(PATH_ROOT)/src/VBox/Runtime/common/err/errmsgxpcom.cpp=>Runtime/common/err/errmsgxpcom.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/err/RTErrConvertFromErrno.cpp=>Runtime/common/err/RTErrConvertFromErrno.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/err/RTErrConvertToErrno.cpp=>Runtime/common/err/RTErrConvertToErrno.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/common/misc/sg.cpp=>Runtime/common/misc/sg.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathAppend.cpp=>Runtime/common/path/RTPathAppend.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathAppendEx.cpp=>Runtime/common/path/RTPathAppendEx.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/path/RTPathCountComponents.cpp=>Runtime/common/path/RTPathCountComponents.cpp \
@@ -334,7 +342,9 @@ rdesktop-src_SOURCES = \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/strprintf.cpp=>Runtime/common/string/strprintf.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/strstrip.cpp=>Runtime/common/string/strstrip.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/strtonum.cpp=>Runtime/common/string/strtonum.cpp \
-	$(PATH_ROOT)/src/VBox/Runtime/common/string/unidata.cpp=>Runtime/common/string/unidata.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-flags.cpp=>Runtime/common/string/unidata-flags.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-upper.cpp=>Runtime/common/string/unidata-upper.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/common/string/unidata-lower.cpp=>Runtime/common/string/unidata-lower.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-16.cpp=>Runtime/common/string/utf-16.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-8.cpp=>Runtime/common/string/utf-8.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/common/string/utf-8-case.cpp=>Runtime/common/string/utf-8-case.cpp \
@@ -345,11 +355,14 @@ rdesktop-src_SOURCES = \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/file.h=>include/internal/file.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/fs.h=>include/internal/fs.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/iprt.h=>include/internal/iprt.h \
+	$(PATH_ROOT)/src/VBox/Runtime/include/internal/lockvalidator.h=>include/internal/lockvalidator.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/magics.h=>include/internal/magics.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/mem.h=>include/internal/mem.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/path.h=>include/internal/path.h \
+	$(PATH_ROOT)/src/VBox/Runtime/include/internal/pipe.h=>include/internal/pipe.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/process.h=>include/internal/process.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/string.h=>include/internal/string.h \
+	$(PATH_ROOT)/src/VBox/Runtime/include/internal/thread.h=>include/internal/thread.h \
 	$(PATH_ROOT)/src/VBox/Runtime/include/internal/time.h=>include/internal/time.h \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/alloc.cpp=>Runtime/r3/alloc.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/alloc-ef.h=>Runtime/r3/alloc-ef.h \
@@ -365,6 +378,8 @@ rdesktop-src_SOURCES = \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/fs3-posix.cpp=>Runtime/r3/posix/fs3-posix.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/path-posix.cpp=>Runtime/r3/posix/path-posix.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/path2-posix.cpp=>Runtime/r3/posix/path2-posix.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/pipe-posix.cpp=>Runtime/r3/posix/pipe-posix.cpp \
+	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/thread2-posix.cpp=>Runtime/r3/posix/thread2-posix.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/posix/utf8-posix.cpp=>Runtime/r3/posix/utf8-posix.cpp \
 	$(PATH_ROOT)/src/VBox/Runtime/r3/stream.cpp=>Runtime/r3/stream.cpp
 
diff --git a/src/VBox/RDP/client/vrdp/rdpusb.c b/src/VBox/RDP/client/vrdp/rdpusb.c
index 013a579..0f88d64 100644
--- a/src/VBox/RDP/client/vrdp/rdpusb.c
+++ b/src/VBox/RDP/client/vrdp/rdpusb.c
@@ -132,9 +132,9 @@ static inline int op_usbproxy_back_interface_setting(PUSBPROXYDEV pDev, int ifnu
     return g_USBProxyDeviceHost.pfnSetInterface (pDev, ifnum, setting);
 }
 
-static inline int op_usbproxy_back_queue_urb(PVUSBURB pUrb)
+static inline int op_usbproxy_back_queue_urb(PUSBPROXYDEV pDev, PVUSBURB pUrb)
 {
-    return g_USBProxyDeviceHost.pfnUrbQueue(pUrb);
+    return g_USBProxyDeviceHost.pfnUrbQueue(pDev, pUrb);
 }
 
 static inline PVUSBURB op_usbproxy_back_reap_urb(PUSBPROXYDEV pDev, unsigned cMillies)
@@ -147,9 +147,9 @@ static inline bool op_usbproxy_back_clear_halted_ep(PUSBPROXYDEV pDev, unsigned
     return g_USBProxyDeviceHost.pfnClearHaltedEndpoint (pDev, EndPoint);
 }
 
-static inline void op_usbproxy_back_cancel_urb(PVUSBURB pUrb)
+static inline int op_usbproxy_back_cancel_urb(PUSBPROXYDEV pDev, PVUSBURB pUrb)
 {
-    return g_USBProxyDeviceHost.pfnUrbCancel (pUrb);
+    return g_USBProxyDeviceHost.pfnUrbCancel (pDev, pUrb);
 }
 
 
@@ -461,9 +461,21 @@ rdpusb_process(STREAM s)
 		{
 			PUSBDEVICE pDevice;
 
-	        	in_uint32_le(s, devid);
+			in_uint32_le(s, devid);
 
 			proxy = (PUSBPROXYDEV )xmalloc (sizeof (USBPROXYDEV));
+			if (!proxy)
+			{
+				error("RDPUSB: Out of memory allocating proxy backend data\n");
+				return;
+			}
+
+			proxy->pvInstanceDataR3 = xmalloc(g_USBProxyDeviceHost.cbBackend);
+			if (!proxy->pvInstanceDataR3)
+			{
+				error("RDPUSB: Out of memory allocating proxy backend data\n");
+				return;
+			}
 
 			memset (proxy, 0, sizeof (USBPROXYDEV));
 
@@ -471,15 +483,15 @@ rdpusb_process(STREAM s)
 			proxy->devid = devid;
 
 			for (pDevice = g_pUsbDevices; pDevice; pDevice = pDevice->pNext)
-			    if ((pDevice->bPort << 8) + pDevice->bBus == devid)
-			        break;
+				if ((pDevice->bPort << 8) + pDevice->bBus == devid)
+					break;
 
 			rc = pDevice ? op_usbproxy_back_open(proxy, pDevice->pszAddress)
 			             : VERR_NOT_FOUND;
 
 			if (rc != VINF_SUCCESS)
 			{
-			        rdpusb_send_access_denied (code, devid);
+				rdpusb_send_access_denied (code, devid);
 				xfree (proxy);
 				proxy = NULL;
 			}
@@ -497,7 +509,7 @@ rdpusb_process(STREAM s)
 
 		case RDPUSB_REQ_CLOSE:
 		{
-	        	in_uint32_le(s, devid);
+			in_uint32_le(s, devid);
 			proxy = devid2proxy (devid);
 
 			if (proxy)
@@ -518,6 +530,7 @@ rdpusb_process(STREAM s)
 					proxy->pNext->pPrev = proxy->pPrev;
 				}
 
+				xfree (proxy->pvInstanceDataR3);
 				xfree (proxy);
 				proxy = NULL;
 			}
@@ -685,7 +698,7 @@ rdpusb_process(STREAM s)
 				in_uint8a (s, pUrb->abData, datalen);
 			}
 
-			rc = op_usbproxy_back_queue_urb(pUrb);
+			rc = op_usbproxy_back_queue_urb(proxy, pUrb);
 
 			/* No reply required. */
 
@@ -758,7 +771,7 @@ rdpusb_process(STREAM s)
 
 			if (pUrb)
 			{
-				op_usbproxy_back_cancel_urb(pUrb);
+				op_usbproxy_back_cancel_urb(proxy, pUrb);
 
 				/* No reply required. */
 
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index 4cd2511..c10df24 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -43,10 +43,11 @@ else ifdef VBOX_ONLY_TESTSUITE
  #
  # Only build the testsuite.
  #
- LIBRARIES += RuntimeGuestR3 RuntimeGuestR3Shared RuntimeR3 RuntimeR0
+ LIBRARIES += RuntimeGuestR3 RuntimeGuestR3Shared RuntimeR3 RuntimeR0 RuntimeBldProg
  LIBRARIES.solaris += RuntimeR0Stub
  LIBRARIES.win += RuntimeR0Stub
  LIBRARIES.win.x86 += RuntimeR3VccTricks
+ include $(PATH_SUB_CURRENT)/tools/Makefile.kmk
 
 else ifdef VBOX_ONLY_DOCS
  #
@@ -145,9 +146,9 @@ common/misc/buildconfig.cpp_DEFS = \
 	IPRT_BLDCFG_TYPE=\"$(KBUILD_TYPE)\"
 
 #
-# Unicode Specification reader used to regenerate unidata.cpp.
+# Unicode Specification reader used to regenerate unidata-*.cpp.
 #
-uniread_TEMPLATE = VBOXBLDPROG
+uniread_TEMPLATE = VBoxBldProg
 uniread_SOURCES  = common/string/uniread.cpp
 uniread_INCS = include
 
@@ -223,7 +224,16 @@ endif
 RuntimeR3_TEMPLATE      = VBoxR3Static
 RuntimeR3_SDKS          = VBOX_OPENSSL VBOX_LIBXML2
 RuntimeR3_SDKS.win      = $(VBOX_WINPSDK) $(VBOX_WINDDK)
-RuntimeR3_DEFS          = IN_RT_R3 IN_SUP_R3 LDR_WITH_NATIVE LDR_WITH_ELF32 LDR_WITH_PE RT_WITH_VBOX RT_NO_GIP
+RuntimeR3_DEFS          = \
+	IN_RT_R3 \
+	IN_SUP_R3 \
+	LDR_WITH_NATIVE \
+	LDR_WITH_ELF32 \
+	LDR_WITH_PE \
+	RT_WITH_VBOX \
+ 	RT_NO_GIP \
+	RT_WITHOUT_NOCRT_WRAPPERS \
+       IPRT_WITH_OPENSSL
 #RuntimeR3_DEFS         += RTMEM_WRAP_TO_EF_APIS
 ifdef IPRT_WITH_KSTUFF
  RuntimeR3_DEFS        += LDR_WITH_KLDR
@@ -259,10 +269,40 @@ RuntimeR3_SOURCES       = \
 	common/alloc/heapoffset.cpp \
 	common/alloc/memcache.cpp \
 	common/alloc/memtracker.cpp \
+	common/asn1/asn1-basics.cpp \
+	common/asn1/asn1-cursor.cpp \
+	common/asn1/asn1-default-allocator.cpp \
+	common/asn1/asn1-dump.cpp \
+	common/asn1/asn1-encode.cpp \
+	common/asn1/asn1-ut-bitstring.cpp \
+	common/asn1/asn1-ut-bitstring-decode.cpp \
+	common/asn1/asn1-ut-boolean.cpp \
+	common/asn1/asn1-ut-boolean-decode.cpp \
+	common/asn1/asn1-ut-core.cpp \
+	common/asn1/asn1-ut-core-decode.cpp \
+	common/asn1/asn1-ut-dyntype.cpp \
+	common/asn1/asn1-ut-dyntype-decode.cpp \
+	common/asn1/asn1-ut-integer.cpp \
+	common/asn1/asn1-ut-integer-decode.cpp \
+	common/asn1/asn1-ut-null.cpp \
+	common/asn1/asn1-ut-null-decode.cpp \
+	common/asn1/asn1-ut-objid.cpp \
+	common/asn1/asn1-ut-objid-decode.cpp \
+	common/asn1/asn1-ut-octetstring.cpp \
+	common/asn1/asn1-ut-octetstring-decode.cpp \
+	common/asn1/asn1-ut-string.cpp \
+	common/asn1/asn1-ut-string-decode.cpp \
+	common/asn1/asn1-ut-time.cpp \
+	common/asn1/asn1-ut-time-decode.cpp \
 	common/checksum/adler32.cpp \
 	common/checksum/crc32.cpp \
 	common/checksum/crc64.cpp \
-	common/checksum/md5.cpp \
+	common/checksum/alt-md2.cpp \
+	common/checksum/alt-md5.cpp \
+	common/checksum/alt-sha1.cpp \
+	common/checksum/alt-sha256.cpp \
+	common/checksum/alt-sha512.cpp \
+	common/checksum/md2str.cpp \
 	common/checksum/md5str.cpp \
 	common/checksum/ipv4.cpp \
 	common/checksum/ipv6.cpp \
@@ -272,12 +312,49 @@ RuntimeR3_SOURCES       = \
 	common/checksum/manifest-file.cpp \
 	common/checksum/RTSha1Digest.cpp \
 	common/checksum/RTSha256Digest.cpp \
-	common/checksum/sha1.cpp \
 	common/checksum/sha1str.cpp \
-	common/checksum/sha256.cpp \
+	common/checksum/sha224str.cpp \
 	common/checksum/sha256str.cpp \
-	common/checksum/sha512.cpp \
+	common/checksum/sha384str.cpp \
 	common/checksum/sha512str.cpp \
+	common/checksum/sha512t224str.cpp \
+	common/checksum/sha512t256str.cpp \
+	common/crypto/digest-core.cpp \
+	common/crypto/digest-builtin.cpp \
+	common/crypto/iprt-openssl.cpp \
+	common/crypto/rsa-asn1-decoder.cpp \
+	common/crypto/rsa-core.cpp \
+	common/crypto/rsa-init.cpp \
+	common/crypto/rsa-sanity.cpp \
+	common/crypto/pemfile.cpp \
+	common/crypto/pkcs7-asn1-decoder.cpp \
+	common/crypto/pkcs7-core.cpp \
+	common/crypto/pkcs7-init.cpp \
+	common/crypto/pkcs7-sanity.cpp \
+	common/crypto/pkcs7-verify.cpp \
+	common/crypto/pkix-signature-builtin.cpp \
+	common/crypto/pkix-signature-core.cpp \
+	common/crypto/pkix-signature-rsa.cpp \
+	common/crypto/pkix-util.cpp \
+	common/crypto/pkix-verify.cpp \
+	common/crypto/spc-asn1-decoder.cpp \
+	common/crypto/spc-core.cpp \
+	common/crypto/spc-init.cpp \
+	common/crypto/spc-sanity.cpp \
+	common/crypto/x509-asn1-decoder.cpp \
+	common/crypto/x509-certpaths.cpp \
+	common/crypto/x509-core.cpp \
+	common/crypto/x509-file.cpp \
+	common/crypto/x509-init.cpp \
+	common/crypto/x509-sanity.cpp \
+	common/crypto/x509-verify.cpp \
+	common/crypto/taf-asn1-decoder.cpp \
+	common/crypto/taf-core.cpp \
+	common/crypto/taf-init.cpp \
+	common/crypto/taf-sanity.cpp \
+	common/crypto/store.cpp \
+	common/crypto/store-inmem.cpp \
+	common/crypto/RTCrStoreCertAddFromFile.cpp \
 	common/dbg/dbg.cpp \
 	common/dbg/dbgas.cpp \
 	common/dbg/dbgcfg.cpp \
@@ -295,6 +372,7 @@ RuntimeR3_SOURCES       = \
 	common/dvm/dvmmbr.cpp \
 	common/dvm/dvmvfs.cpp \
 	common/err/errinfo.cpp \
+	common/err/errinfo-alloc.cpp \
 	common/err/errmsg.cpp \
 	common/err/RTErrConvertFromErrno.cpp \
 	common/err/RTErrConvertToErrno.cpp \
@@ -315,6 +393,7 @@ RuntimeR3_SOURCES       = \
 	common/log/logformat.cpp \
 	common/log/tracebuf.cpp \
 	common/log/tracedefault.cpp \
+	common/math/bignum.cpp \
 	common/misc/RTAssertMsg1Weak.cpp \
 	common/misc/RTAssertMsg2.cpp \
 	common/misc/RTAssertMsg2Add.cpp \
@@ -349,6 +428,7 @@ RuntimeR3_SOURCES       = \
 	common/misc/thread.cpp \
 	common/misc/term.cpp \
 	common/misc/uri.cpp \
+	common/misc/zero.asm \
 	common/net/netaddrstr.cpp \
 	common/net/netaddrstr2.cpp \
 	common/net/macstr.cpp \
@@ -405,6 +485,16 @@ RuntimeR3_SOURCES       = \
 	common/string/RTStrNLenEx.cpp \
 	common/string/RTStrPrintHexBytes.cpp \
 	common/string/RTStrStr.cpp \
+	common/string/RTUtf16Copy.cpp \
+	common/string/RTUtf16CopyAscii.cpp \
+	common/string/RTUtf16Cat.cpp \
+	common/string/RTUtf16CatAscii.cpp \
+	common/string/RTUtf16CmpAscii.cpp \
+	common/string/RTUtf16ICmpAscii.cpp \
+	common/string/RTUtf16End.cpp \
+	common/string/RTUtf16NLen.cpp \
+	common/string/RTUtf16NLenEx.cpp \
+	common/string/RTUtf16PrintHexBytes.cpp \
 	common/string/base64.cpp \
 	common/string/simplepattern.cpp \
 	common/string/straprintf.cpp \
@@ -421,10 +511,15 @@ RuntimeR3_SOURCES       = \
 	common/string/strtonum.cpp \
 	common/string/strversion.cpp \
 	common/string/uni.cpp \
-	common/string/unidata.cpp \
+	common/string/unidata-flags.cpp \
+	common/string/unidata-lower.cpp \
+	common/string/unidata-upper.cpp \
 	common/string/utf-16.cpp \
+	common/string/utf-16-case.cpp \
+	common/string/utf-16-latin-1.cpp \
 	common/string/utf-8.cpp \
 	common/string/utf-8-case.cpp \
+	common/string/utf-8-case2.cpp \
 	common/string/ministring.cpp \
 	common/table/avlgcptr.cpp \
 	common/table/avlhcphys.cpp \
@@ -460,8 +555,11 @@ RuntimeR3_SOURCES       = \
 	common/vfs/vfsstdfile.cpp \
 	common/zip/tar.cpp \
 	common/zip/tarcmd.cpp \
+	common/zip/unzipcmd.cpp \
 	common/zip/tarvfs.cpp \
 	common/zip/gzipvfs.cpp \
+	common/zip/pkzip.cpp \
+	common/zip/pkzipvfs.cpp \
 	common/zip/zip.cpp \
 	generic/createtemp-generic.cpp \
 	generic/critsect-generic.cpp \
@@ -483,6 +581,7 @@ RuntimeR3_SOURCES       = \
 	generic/RTProcessQueryUsernameA-generic.cpp \
 	generic/RTTimerLRCreate-generic.cpp \
 	generic/mempool-generic.cpp \
+	generic/memsafer-generic.cpp \
 	generic/semfastmutex-generic.cpp \
 	generic/semxroads-generic.cpp \
 	generic/spinlock-generic.cpp \
@@ -602,6 +701,7 @@ RuntimeR3_SOURCES.win = \
 	nt/RTErrConvertFromNtStatus.cpp \
  	r3/nt/fs-nt.cpp \
  	r3/nt/pathint-nt.cpp \
+ 	r3/nt/RTProcQueryParent-r3-nt.cpp \
 	r3/win/env-win.cpp \
 	r3/win/RTHandleGetStandard-win.cpp \
 	r3/win/RTSystemQueryOSInfo-win.cpp \
@@ -629,6 +729,7 @@ RuntimeR3_SOURCES.win = \
 	r3/win/semmutex-win.cpp \
 	r3/win/symlink-win.cpp \
 	r3/win/rtFileNativeSetAttributes-win.cpp \
+	r3/win/rtmemlocked-win.cpp \
 	r3/win/thread-win.cpp \
 	r3/win/thread2-win.cpp \
 	r3/win/time-win.cpp \
@@ -638,7 +739,8 @@ RuntimeR3_SOURCES.win = \
 	r3/win/utf8-win.cpp \
 	r3/win/RTUuidCreate-win.cpp \
 	win/errmsgwin.cpp \
-	win/RTErrConvertFromWin32.cpp
+	win/RTErrConvertFromWin32.cpp \
+	common/string/mempcpy.asm
 
 RuntimeR3_SOURCES.win.amd64 := $(RuntimeWin64ASM_SOURCES)
 RuntimeR3_SOURCES.win.x86   := $(RuntimeWin32ASM_SOURCES)
@@ -679,6 +781,7 @@ RuntimeR3_SOURCES.linux = \
 	r3/posix/RTTimeNow-posix.cpp \
 	r3/posix/RTTimeSet-posix.cpp \
 	r3/posix/rtmempage-exec-mmap-heap-posix.cpp \
+	r3/posix/rtmemlocked-posix.cpp \
 	r3/posix/dir-posix.cpp \
 	r3/posix/env-posix.cpp \
 	r3/posix/errvars-posix.cpp \
@@ -849,6 +952,7 @@ RuntimeR3_SOURCES.darwin = \
 	r3/posix/fs3-posix.cpp \
 	r3/posix/ldrNative-posix.cpp \
 	r3/posix/rtmempage-exec-mmap-heap-posix.cpp \
+	r3/posix/rtmemlocked-posix.cpp \
 	r3/posix/path-posix.cpp \
 	r3/posix/path2-posix.cpp \
 	r3/posix/pipe-posix.cpp \
@@ -914,6 +1018,7 @@ RuntimeR3_SOURCES.freebsd = \
 	r3/posix/fs3-posix.cpp \
 	r3/posix/ldrNative-posix.cpp \
 	r3/posix/rtmempage-exec-mmap-heap-posix.cpp \
+	r3/posix/rtmemlocked-posix.cpp \
 	r3/posix/path-posix.cpp \
 	r3/posix/path2-posix.cpp \
 	r3/posix/pathhost-posix.cpp \
@@ -972,6 +1077,7 @@ RuntimeR3_SOURCES.solaris = \
 	r3/posix/fs3-posix.cpp \
 	r3/posix/ldrNative-posix.cpp \
 	r3/posix/rtmempage-exec-mmap-heap-posix.cpp \
+	r3/posix/rtmemlocked-posix.cpp \
 	r3/posix/path-posix.cpp \
 	r3/posix/path2-posix.cpp \
 	r3/posix/pathhost-posix.cpp \
@@ -1050,6 +1156,7 @@ RuntimeR3_SOURCES.haiku = \
 	r3/posix/fs3-posix.cpp \
 	r3/posix/ldrNative-posix.cpp \
 	r3/posix/rtmempage-exec-mmap-heap-posix.cpp \
+	r3/posix/rtmemlocked-posix.cpp \
 	r3/posix/path-posix.cpp \
 	r3/posix/path2-posix.cpp \
 	r3/posix/pathhost-posix.cpp \
@@ -1076,11 +1183,12 @@ RuntimeR3_SOURCES.haiku = \
 # Note! This is a bit of hacky since kBuild doesn't support building libraries
 #       for build programs.
 #
-RuntimeBldProg_TEMPLATE         := VBoxAdvBldProg
-RuntimeBldProg_EXTENDS          := RuntimeR3
-RuntimeBldProg_BLD_TRG          := $(KBUILD_HOST)
-RuntimeBldProg_BLD_TRG_ARCH     := $(KBUILD_HOST_ARCH)
-RuntimeBldProg_BLD_TRG_CPU      := $(KBUILD_HOST_CPU)
+RuntimeBldProg_TEMPLATE        := VBoxAdvBldProg
+RuntimeBldProg_EXTENDS         := RuntimeR3
+RuntimeBldProg_BLD_TRG         := $(KBUILD_HOST)
+RuntimeBldProg_BLD_TRG_ARCH    := $(KBUILD_HOST_ARCH)
+RuntimeBldProg_BLD_TRG_CPU     := $(KBUILD_HOST_CPU)
+RuntimeBldProg_DEFS            := $(RuntimeR3_DEFS) IPRT_WITHOUT_LDR_VERIFY
 RuntimeBldProg_SOURCES          = $(filter-out \
 	r3/xml.cpp \
 	common/zip/xarvfs.cpp \
@@ -1096,7 +1204,7 @@ RuntimeBldProg_SOURCES          = $(filter-out \
 RuntimeGuestR3_TEMPLATE                 := VBoxGuestR3Lib
 ## @todo change this to EXTEND the RuntimeR3 target.
 RuntimeGuestR3_SDKS.win                 := $(RuntimeR3_SDKS.win)
-RuntimeGuestR3_DEFS                     := $(filter-out RTCRITSECT_STRICT RT_NO_GIP, $(RuntimeR3_DEFS))
+RuntimeGuestR3_DEFS                     := $(filter-out RTCRITSECT_STRICT RT_NO_GIP IPRT_WITH_OPENSSL, $(RuntimeR3_DEFS))
 RuntimeGuestR3_DEFS.$(KBUILD_TARGET)    := $(RuntimeR3_DEFS.$(KBUILD_TARGET))
 RuntimeGuestR3_DEFS.$(KBUILD_HOST)      := $(RuntimeR3_DEFS.$(KBUILD_HOST))
 RuntimeGuestR3_INCS                     := $(RuntimeR3_INCS)
@@ -1106,9 +1214,7 @@ RuntimeGuestR3_SOURCES                  := $(filter-out \
 	common/time/timesupref.cpp \
 	common/time/timesupA.asm \
 	common/time/timesup.cpp \
-	common/checksum/RTSha1Digest.cpp \
-	common/checksum/RTSha256Digest.cpp \
-	common/checksum/sha% \
+	common/checksum/openssl-% \
 	generic/RTLogWriteUser-generic.cpp \
 	r3/xml.cpp \
 	common/zip/xarvfs.cpp \
@@ -1223,10 +1329,15 @@ RuntimeGuestR3Mini_SOURCES = \
 	common/string/stringalloc.cpp \
 	common/string/strprintf.cpp \
 	common/string/strtonum.cpp \
-	common/string/unidata.cpp \
+	common/string/unidata-flags.cpp \
+	common/string/unidata-lower.cpp \
+	common/string/unidata-upper.cpp \
 	common/string/utf-8.cpp \
 	common/string/utf-8-case.cpp \
+	common/string/utf-8-case2.cpp \
 	common/string/utf-16.cpp \
+	common/string/utf-16-case.cpp \
+	common/string/utf-16-latin-1.cpp \
 	common/table/avlpv.cpp \
 	generic/critsect-generic.cpp \
 	generic/pathhost-generic.cpp \
@@ -1297,10 +1408,12 @@ ifdef VBOX_WITH_LIBCURL
 endif
 VBoxRT_SDKS                   += VBOX_OPENSSL
 VBoxRT_SDKS.win                = $(VBOX_WINPSDK) $(VBOX_WINDDK) VBOX_NTDLL
-if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win)
+if1of ($(KBUILD_TARGET)$(VBOX_WITH_HARDENING), darwin win$(VBOX_WITH_HARDENING))
 VBoxRT_INST                    = $(INST_DLL) $(INST_TESTCASE)
 endif
-VBoxRT_DEFS                   := $(filter-out RT_NO_GIP,$(RuntimeR3_DEFS)) IN_SUP_R3 IN_SUP_R3 IPRT_WITH_XAR
+VBoxRT_DEFS                   := $(filter-out RT_NO_GIP, $(RuntimeR3_DEFS)) \
+	IN_SUP_R3 IN_SUP_R3 IPRT_WITH_XAR \
+	$(if-expr !defined(VBOX_WITH_ALT_HASH_CODE),IPRT_WITHOUT_SHA512T224 IPRT_WITHOUT_SHA512T256,)
 ifn1of ($(KBUILD_TARGET_ARCH), amd64 x86)
  VBoxRT_DEFS                  += RT_NO_GIP
 endif
@@ -1310,7 +1423,9 @@ endif
 VBoxRT_DEFS.$(KBUILD_TYPE)    := $(RuntimeR3_DEFS.$(KBUILD_TYPE))
 VBoxRT_SOURCES                := \
 	VBox/VBoxRTDeps.cpp \
-	$(filter-out common/checksum/crc32.cpp, $(RuntimeR3_SOURCES)) \
+	$(filter-out common/checksum/crc32.cpp, \
+       	$(if-expr defined(VBOX_WITH_ALT_HASH_CODE), $(RuntimeR3_SOURCES), \
+		$(patsubst common/checksum/alt-%,common/checksum/openssl-%,$(RuntimeR3_SOURCES)) ) ) \
 	common/checksum/crc32-zlib.cpp \
 	common/misc/aiomgr.cpp
 ifdef VBOX_WITH_LIBCURL
@@ -1406,7 +1521,7 @@ VBoxRT_INSTTYPE = none
 VBoxRT_DEBUG_INSTTYPE = both
 
 DLLS += VBoxRTDummy
-VBoxRTDummy_TEMPLATE = VBOXR3
+VBoxRTDummy_TEMPLATE = VBoxR3Dll
 VBoxRTDummy_INSTTYPE = none
 VBoxRTDummy_LIBS  = $(PATH_STAGE_BIN)/VBoxRT.so
 VBoxRTDummy_CLEAN = $(PATH_STAGE_BIN)/VBoxRT.so
@@ -1505,7 +1620,7 @@ endif
 # This is used together with VBoxRT.
 #
 ## @todo the *_alias.c stuff is busted, remove and use RT_WITH_NOCRT_ALIASES instead.
-RuntimeR3NoCRTGCC_TEMPLATE = VBOXNOCRTGCC
+RuntimeR3NoCRTGCC_TEMPLATE = VBoxNoCrtGccLib
 RuntimeR3NoCRTGCC_LIBSUFF = $(VBOX_SUFF_LIB)
 ifn1of ($(KBUILD_TARGET_ARCH), amd64 x86)
  RuntimeR3NoCRTGCC_DEFS  += RT_NO_GIP
@@ -1577,8 +1692,6 @@ RuntimeR3NoCRTGCC_SOURCES.x86 = \
 	common/math/gcc/xordi3.c
 
 
-## @todo stop using the old memcpy.c and memset.c code.
-
 #
 # RuntimeR0 - Ring-0 library for VMMR0.
 #
@@ -1637,6 +1750,7 @@ RuntimeR0_SOURCES      := \
 	common/table/avlou32.cpp \
 	common/time/timesup.cpp \
 	generic/RTAssertShouldPanic-generic.cpp \
+	generic/critsect-generic.cpp \
 	\
 	$(RuntimeNoCrt_SOURCES)
 
@@ -1709,9 +1823,9 @@ RuntimeR0Stub_SOURCES.solaris = \
 # RuntimeR0Drv - Ring-0 library for host drivers.
 #
 RuntimeR0Drv_TEMPLATE   = VBoxR0DrvLib
-RuntimeR0Drv_SDKS.win   = ReorderCompilerIncs $(VBOX_WINDDK) $(VBOX_WINPSDK)INCS
+RuntimeR0Drv_SDKS.win   = ReorderCompilerIncs $(VBOX_WINDDK) $(VBOX_WINPSDK)INCS VBOX_OPENSSL
 RuntimeR0Drv_DEFS       = IN_RT_R0 RT_WITH_VBOX RT_WITHOUT_NOCRT_WRAPPERS RT_NO_EXPORT_SYMBOL
-RuntimeR0Drv_DEFS.win   = IN_SUP_R0
+RuntimeR0Drv_DEFS.win   = IN_SUP_R0 LDR_ONLY_PE
 RuntimeR0Drv_DEFS.linux = MODULE KBUILD_MODNAME=KBUILD_STR\(vboxdrv\) KBUILD_BASENAME=KBUILD_STR\(vboxdrv\) IN_SUP_R0
 
 RuntimeR0Drv_INCS      := $(PATH_SUB_CURRENT) include
@@ -1727,9 +1841,9 @@ RuntimeR0Drv_SOURCES    = \
 	common/alloc/alloc.cpp \
 	common/alloc/heapsimple.cpp \
 	common/alloc/heapoffset.cpp \
+	common/checksum/alt-md5.cpp \
 	common/checksum/crc32.cpp \
 	common/checksum/crc64.cpp \
-	common/checksum/md5.cpp \
 	common/checksum/ipv4.cpp \
 	common/checksum/ipv6.cpp \
 	common/err/RTErrConvertToErrno.cpp \
@@ -1758,6 +1872,7 @@ RuntimeR0Drv_SOURCES    = \
 	common/misc/sanity-c.c \
 	common/misc/sanity-cpp.cpp \
 	common/misc/term.cpp \
+	common/misc/RTMemWipeThoroughly.cpp \
 	common/path/rtPathVolumeSpecLen.cpp \
 	common/path/RTPathAbsDup.cpp \
 	common/path/RTPathAbsEx.cpp \
@@ -1797,8 +1912,15 @@ RuntimeR0Drv_SOURCES    = \
 	common/string/strprintf.cpp \
 	common/string/strtonum.cpp \
 	common/string/stringalloc.cpp \
-	common/string/utf-16.cpp \
+	common/string/unidata-flags.cpp \
+	common/string/unidata-lower.cpp \
+	common/string/unidata-upper.cpp \
 	common/string/utf-8.cpp \
+	common/string/utf-8-case.cpp \
+	common/string/utf-8-case2.cpp \
+	common/string/utf-16.cpp \
+	common/string/utf-16-case.cpp \
+	common/string/utf-16-latin-1.cpp \
 	common/table/avlpv.cpp \
 	common/time/time.cpp \
 	generic/RTLogWriteStdErr-stub-generic.cpp \
@@ -1809,6 +1931,7 @@ RuntimeR0Drv_SOURCES    = \
  	generic/RTSemEventWaitNoResume-2-ex-generic.cpp \
  	generic/RTSemEventMultiWait-2-ex-generic.cpp \
  	generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp \
+	generic/critsect-generic.cpp \
 	generic/errvars-generic.cpp \
 	generic/uuid-generic.cpp \
 	r0drv/alloc-r0drv.cpp \
@@ -1855,6 +1978,95 @@ RuntimeR0Drv_SOURCES.linux = \
 	r0drv/powernotification-r0drv.c
 
 RuntimeR0Drv_SOURCES.win = \
+	common/ldr/ldr.cpp \
+	common/ldr/ldrEx.cpp \
+	common/ldr/ldrPE.cpp \
+	common/asn1/asn1-basics.cpp \
+	common/asn1/asn1-dump.cpp \
+	common/asn1/asn1-cursor.cpp \
+	common/asn1/asn1-default-allocator.cpp \
+	common/asn1/asn1-encode.cpp \
+	common/asn1/asn1-ut-bitstring.cpp \
+	common/asn1/asn1-ut-bitstring-decode.cpp \
+	common/asn1/asn1-ut-boolean.cpp \
+	common/asn1/asn1-ut-boolean-decode.cpp \
+	common/asn1/asn1-ut-core.cpp \
+	common/asn1/asn1-ut-core-decode.cpp \
+	common/asn1/asn1-ut-dyntype.cpp \
+	common/asn1/asn1-ut-dyntype-decode.cpp \
+	common/asn1/asn1-ut-integer.cpp \
+	common/asn1/asn1-ut-integer-decode.cpp \
+	common/asn1/asn1-ut-null.cpp \
+	common/asn1/asn1-ut-null-decode.cpp \
+	common/asn1/asn1-ut-objid.cpp \
+	common/asn1/asn1-ut-objid-decode.cpp \
+	common/asn1/asn1-ut-octetstring.cpp \
+	common/asn1/asn1-ut-octetstring-decode.cpp \
+	common/asn1/asn1-ut-string.cpp \
+	common/asn1/asn1-ut-string-decode.cpp \
+	common/asn1/asn1-ut-time.cpp \
+	common/asn1/asn1-ut-time-decode.cpp \
+	common/crypto/digest-core.cpp \
+	common/crypto/digest-builtin.cpp \
+	common/crypto/rsa-asn1-decoder.cpp \
+	common/crypto/rsa-core.cpp \
+	common/crypto/rsa-init.cpp \
+	common/crypto/rsa-sanity.cpp \
+	common/crypto/pkcs7-asn1-decoder.cpp \
+	common/crypto/pkcs7-core.cpp \
+	common/crypto/pkcs7-init.cpp \
+	common/crypto/pkcs7-sanity.cpp \
+	common/crypto/pkcs7-verify.cpp \
+	common/crypto/pkix-signature-builtin.cpp \
+	common/crypto/pkix-signature-core.cpp \
+	common/crypto/pkix-signature-rsa.cpp \
+	common/crypto/pkix-util.cpp \
+	common/crypto/pkix-verify.cpp \
+	common/crypto/spc-asn1-decoder.cpp \
+	common/crypto/spc-core.cpp \
+	common/crypto/spc-init.cpp \
+	common/crypto/spc-sanity.cpp \
+	common/crypto/x509-asn1-decoder.cpp \
+	common/crypto/x509-certpaths.cpp \
+	common/crypto/x509-core.cpp \
+	common/crypto/x509-init.cpp \
+	common/crypto/x509-sanity.cpp \
+	common/crypto/x509-verify.cpp \
+	common/crypto/store.cpp \
+	common/crypto/store-inmem.cpp \
+	common/crypto/taf-asn1-decoder.cpp \
+	common/crypto/taf-core.cpp \
+	common/crypto/taf-init.cpp \
+	common/crypto/taf-sanity.cpp \
+	common/checksum/alt-md2.cpp \
+	common/checksum/alt-sha1.cpp \
+	common/checksum/alt-sha256.cpp \
+	common/checksum/alt-sha512.cpp \
+	common/checksum/md2str.cpp \
+	common/checksum/md5str.cpp \
+	common/checksum/sha1str.cpp \
+	common/checksum/sha224str.cpp \
+	common/checksum/sha256str.cpp \
+	common/checksum/sha384str.cpp \
+	common/checksum/sha512str.cpp \
+	common/checksum/sha512t224str.cpp \
+	common/checksum/sha512t256str.cpp \
+	common/err/errinfo.cpp \
+	common/path/RTPathChangeToUnixSlashes.cpp \
+	common/math/bignum.cpp \
+	common/misc/zero.asm \
+	common/string/RTStrPrintHexBytes.cpp \
+	common/string/RTUtf16Copy.cpp \
+	common/string/RTUtf16CopyAscii.cpp \
+	common/string/RTUtf16Cat.cpp \
+	common/string/RTUtf16CatAscii.cpp \
+	common/string/RTUtf16End.cpp \
+	common/string/RTUtf16NLen.cpp \
+	common/string/RTUtf16NLenEx.cpp \
+	common/string/RTUtf16PrintHexBytes.cpp \
+	common/string/strstrip.cpp \
+	generic/memsafer-generic.cpp \
+       \
 	common/misc/thread.cpp \
 	common/string/memcmp.asm \
 	common/string/memchr.asm \
@@ -1892,6 +2104,7 @@ RuntimeR0Drv_SOURCES.win = \
 	r0drv/nt/thread2-r0drv-nt.cpp \
 	r0drv/nt/time-r0drv-nt.cpp \
 	r0drv/nt/timer-r0drv-nt.cpp \
+	r0drv/nt/toxic-chkstk-r0drv-nt.asm \
 	r0drv/nt/RTTimerGetSystemGranularity-r0drv-nt.cpp
 
 RuntimeR0Drv_SOURCES.win.amd64 := $(RuntimeWin64ASM_SOURCES)
@@ -2112,6 +2325,8 @@ RuntimeGuestR0_EXTENDS    = RuntimeR0Drv
 RuntimeGuestR0_SOURCES   := $(filter-out generic/RTLogWriteUser-generic.cpp, $(RuntimeR0Drv_SOURCES))
 RuntimeGuestR0_SOURCES   += \
 	VBox/logbackdoor.cpp
+RuntimeGuestR0_SOURCES.win := \
+	$(filter-out common/checksum/md% common/checksum/sha%, $(RuntimeR0Drv_SOURCES.win))
 
 
 #
@@ -2130,9 +2345,9 @@ ifdef VBOX_WITH_RAW_MODE
  RuntimeRC_DEFS          = IN_RT_RC RT_WITH_VBOX
  RuntimeRC_INCS          = include
  RuntimeRC_SOURCES      := \
+	common/checksum/alt-md5.cpp \
 	common/checksum/crc32.cpp \
 	common/checksum/crc64.cpp \
-	common/checksum/md5.cpp \
  	common/log/log.cpp \
  	common/log/logellipsis.cpp \
  	common/log/logrel.cpp \
@@ -2253,17 +2468,37 @@ RuntimeEFCPP_SOURCES   := r3/alloc-ef-cpp.cpp
 #           later WINDDK ntdll.lib have and thus we may easily end up with
 #           images that does not load on older windows versions.
 #
+if1of (win,$(KBUILD_TARGET) $(KBUILD_HOST))
 RuntimeR3NtDll-amd64_TEMPLATE     = VBoxR3Dll
 RuntimeR3NtDll-amd64_BLD_TRG_ARCH = amd64
 RuntimeR3NtDll-amd64_ARFLAGS      = /NODEFAULTLIB /MACHINE:amd64
 RuntimeR3NtDll-amd64_SOURCES      = \
-	r3/win/ntdll-mini-implib.c \
 	r3/win/ntdll-mini-implib.def
 
-RuntimeR3NtDll-x86_EXTENDS        = RuntimeR3NtDll-amd64
+RuntimeR3NtDll-x86_TEMPLATE       = VBoxR3Dll
 RuntimeR3NtDll-x86_BLD_TRG_ARCH   = x86
 RuntimeR3NtDll-x86_ARFLAGS        = /NODEFAULTLIB /MACHINE:x86
-
+RuntimeR3NtDll-x86_SOURCES        = \
+	r3/win/ntdll-mini-implib.def \
+	$(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm
+RuntimeR3NtDll-x86_CLEAN          = \
+	$(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm
+
+$$(RuntimeR3NtDll-x86_0_OUTDIR)/ntdll-mini-implib.asm: $(PATH_SUB_CURRENT)/r3/win/ntdll-mini-implib.def | $$(dir $$@)
+	$(call MSG_GENERATE,,$@,$<)
+	$(QUIET)$(APPEND) -nt "$@" \
+		';Autogenerated, do not edit' \
+		'%include "iprt/asmdefs.mac"' \
+               'BEGINCODE' \
+               '%macro IMPLIB_EXPORT 1' \
+               'global %1:function' \
+               '%1: nop' \
+               '%endm' \
+               ''
+	$(QUIET)$(SED) -e '1,/EXPORTS/d' \
+		-e 's/^.*;;=[[:space:]]*\([^[:space:]]*\)[[:space:]]*$$/IMPLIB_EXPORT \1/' \
+		$< --append $@
+endif
 
 #
 # Bag of tricks required for making VCC100 output binaries work on NT4, W2K
@@ -2492,24 +2727,28 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
 	$(call MSG_L1,IPRT: skipped mangling test.)
  else
 # Generate a SED script from mangling.h that checks for known symbols.
-	@$(SED) \
+	$(QUIET)$(SED) \
 		-e '/# *define.*RT_MANGLER/!d' \
 		-e 's/^.*RT_MANGLER(\([^)][^)]*\)).*$(DOLLAR)/\/^\1$(DOLLAR)\/b ok/' \
 		$(PATH_ROOT)/include/iprt/mangling.h \
 		--output "$@"
-	@$(APPEND) -n '$@' \
+	$(QUIET)$(APPEND) -n '$@' \
 		':bad' \
-		's/^\(.*\)$(DOLLAR)/error: Missing # define \1   RT_MANGLER(\1)/' \
+		's/^\(.*\)$(DOLLAR)/error: Missing # define \1 /' \
+               ':bad-pad' \
+               '/^.\{0,70\}$(DOLLAR)/ { s/$(DOLLAR)/ /; bbad-pad; }' \
+               's/define \([^ ]*\) \([ ]*\)$(DOLLAR)/define \1 \2RT_MANGLER(\1)/' \
 		'p' \
-		'q 1' \
+		$(if-expr !defined(IPRT_IGNORE_TEST_MANGLING),'q 1') \
 		'' \
 		':ok' \
 		'd'
 # Find the best way to generate a symbol list and subject it to mangling.h.
   if $(intersects $(KBUILD_TARGET), linux) && "$(VBOX_GCC_fvisibility-hidden)"
 	$(call MSG_L1,IPRT: Testing mangling and visiblity for newer gcc...)
-	@readelf -Ws $^ \
+	$(QUIET)readelf -Ws $^ \
 		| $(SED) \
+               	-e 's/[[:space:]]\+/ /g' \
 			-e '/^  *[[:digit:]]\+:/!d' \
 			-e 's/^ \+[[:digit:]]\+: \+[[:xdigit:]]\+ \+[[:digit:]]\+ \+//' \
 			-e '/^SECTION/d' \
@@ -2517,7 +2756,10 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
 			-e 's/^[[:alpha:]]\+ \+//' \
 			-e '/LOCAL/d' \
 			-e 's/^[[:alpha:]]\+ \+//' \
+                       -e '/^HIDDEN [[:xdigit:]]\+ RT/bkeep-hidden' \
+                       -e '/^HIDDEN [[:xdigit:]]\+ g_[a-z0-9]*RT/bkeep-hidden' \
 			-e '/^HIDDEN/d' \
+			-e ':keep-hidden' \
 			-e 's/^[[:alpha:]]\+ \+//' \
 			-e '/^UND/d' \
 			-e 's/^[[:digit:]]\+ \+//' \
@@ -2538,7 +2780,7 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
 			-e '/^strlen/d' \
 			-e '/^_Z[[:alpha:]]*[[:digit:]]\+RTC/d' \
 			-e '/^_Z[[:alpha:]]*[[:digit:]]\+RTC/d' \
-                       \
+			\
 			-e '/^_ZnwjPv/d' \
 			-e '/^_ZnwmPv/d' \
 			-e '/^_ZNSt9bad_allocC1Ev/d' \
@@ -2549,7 +2791,7 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
                        -e '/^_ZN[a-zA-Z]*[[:digit:]]*__gnu_cxx/d' \
                        -e '/^_ZNSa.*ElementNode.*/d' \
                        -e '/^_ZSt.*ElementNode.*/d' \
-                       \
+			\
 			-e '/^_Z[[:digit:]]\+dbus/d' \
 			-e '/^_Z13RTDBusLoadLibv/d' \
 			\
@@ -2557,11 +2799,14 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
 			-e '/^VBoxGuest_/d'\
 		| $(SED) -nf "$@"
   endif
-	$(call MSG_L1,IPRT: Testing mangling for older gcc...)
-	@nm $^ 	| $(SED) -n \
+	$(call MSG_L1,IPRT: Testing mangling using nm...)
+	$(QUIET)nm $^  2> /dev/null \
+		| $(SED) -n \
 			-e 's/^[0-9a-f][0-9a-f]* //' \
 			-e '/^[TUDB] /!d' \
 			-e 's/^. //' \
+			$(if-expr "$(KBUILD_TARGET)" == "darwin" || "$(KBUILD_TARGET)" == "os2" || "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.x86", \
+                       -e 's/^_//',) \
 			\
 			-e '/^g_cchrt/d'\
 			-e '/^g_frt/d'\
@@ -2573,6 +2818,8 @@ if1of ($(LIBRARIES),RuntimeR3 RuntimeR0 RuntimeR0Drv RuntimeRC)
 			-e '/^g_u64ProgramStart/d'\
 			-e '/^g_enmProcessPriority/d'\
 			-e '/^g_hDbgModStrCache/d'\
+			-e '/^g_pfnR0Darwin/d'\
+			-e '/^g_pDarwinLockGroup/d'\
 			\
 			-e '/^RTDBusLoadLib/d' \
 			\
@@ -2598,3 +2845,13 @@ endif
 #
 include $(FILE_KBUILD_SUB_FOOTER)
 
+
+#
+# Aliases for code templates.
+#
+rsa-template.o rsa-template.obj: rsa-core.o rsa-asn1-decoder.o rsa-sanity.o rsa-init.o
+spc-template.o spc-template.obj: spc-core.o spc-asn1-decoder.o spc-sanity.o spc-init.o
+taf-template.o taf-template.obj: taf-core.o taf-asn1-decoder.o taf-sanity.o taf-init.o
+x509-template.o x509-template.obj: x509-core.o x509-asn1-decoder.o x509-sanity.o x509-init.o
+pkcs7-template.o pkcs7-template.obj: pkcs7-core.o pkcs7-asn1-decoder.o pkcs7-sanity.o pkcs7-init.o
+
diff --git a/src/VBox/Runtime/VBox/VBoxRTImp.def b/src/VBox/Runtime/VBox/VBoxRTImp.def
index d7c1c0d..0c1f3ba 100644
--- a/src/VBox/Runtime/VBox/VBoxRTImp.def
+++ b/src/VBox/Runtime/VBox/VBoxRTImp.def
@@ -709,6 +709,9 @@ EXPORTS
     RTMemExecAllocTag
     RTMemExecFree
     RTMemFree
+    RTMemLockedAllocTag
+    RTMemLockedAllocZTag
+    RTMemLockedFree
     RTMemPageAllocTag
     RTMemPageAllocZTag
     RTMemPageFree
diff --git a/src/VBox/Runtime/VBox/log-vbox.cpp b/src/VBox/Runtime/VBox/log-vbox.cpp
index 390a9a5..ef53798 100644
--- a/src/VBox/Runtime/VBox/log-vbox.cpp
+++ b/src/VBox/Runtime/VBox/log-vbox.cpp
@@ -231,7 +231,6 @@ RTDECL(PRTLOGGER) RTLogDefaultInit(void)
     ASSERT_LOG_GROUP(DEV_RTC);
     ASSERT_LOG_GROUP(DEV_SERIAL);
     ASSERT_LOG_GROUP(DEV_SMC);
-    ASSERT_LOG_GROUP(DEV_USB);
     ASSERT_LOG_GROUP(DEV_VGA);
     ASSERT_LOG_GROUP(DEV_VMM);
     ASSERT_LOG_GROUP(DEV_VMM_STDERR);
diff --git a/src/VBox/Runtime/common/asm/asm-fake.cpp b/src/VBox/Runtime/common/asm/asm-fake.cpp
index b737ffe..15e02bd 100644
--- a/src/VBox/Runtime/common/asm/asm-fake.cpp
+++ b/src/VBox/Runtime/common/asm/asm-fake.cpp
@@ -460,3 +460,9 @@ RTDECL(uint32_t) ASMByteSwapU32(uint32_t u32)
     return RT_MAKE_U32_FROM_U8(RT_BYTE4(u32), RT_BYTE3(u32), RT_BYTE2(u32), RT_BYTE1(u32));
 }
 
+RTDECL(uint64_t) ASMByteSwapU64(uint64_t u64)
+{
+    return RT_MAKE_U64_FROM_U8(RT_BYTE8(u64), RT_BYTE7(u64), RT_BYTE6(u64), RT_BYTE5(u64),
+                               RT_BYTE4(u64), RT_BYTE3(u64), RT_BYTE2(u64), RT_BYTE1(u64));
+}
+
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/src/VBox/Runtime/common/asn1/Makefile.kup
similarity index 100%
copy from src/VBox/Runtime/common/ldr/Makefile.kup
copy to src/VBox/Runtime/common/asn1/Makefile.kup
diff --git a/src/VBox/Runtime/common/asn1/asn1-basics.cpp b/src/VBox/Runtime/common/asn1/asn1-basics.cpp
new file mode 100644
index 0000000..4de3b01
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-basics.cpp
@@ -0,0 +1,592 @@
+/* $Id: asn1-basics.cpp $ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * ASN.1 content/value allocation.
+ *
+ * The currently most frequent use of the RTAsn1 module is to decode ASN.1 byte
+ * streams.  In that scenario we do not allocate memory for the raw content
+ * bytes, but share it with the byte stream.  Also, a great number of RTASN1CORE
+ * structures will never need to have any content bytes allocated with this.
+ *
+ * So, in order to avoid adding an extra 16 (64-bit) or 8 (32-bit) bytes to each
+ * RTASN1CORE structure just to keep track of the occational content allocation,
+ * we put the allocator tracking structure inside the allocation.  During
+ * allocator operations it lives temporarily on the stack.
+ */
+typedef struct RTASN1MEMCONTENT
+{
+    /** The allocation tracker. */
+    RTASN1ALLOCATION    Allocation;
+#if ARCH_BITS == 32
+    uint32_t            Padding; /**< Alignment padding. */
+#endif
+    /** The content bytes, i.e. what RTASN1CORE::uData.pv points to.  Use a 64-bit
+     * type here to emphasize that it's 8-byte aligned on all platforms.  */
+    uint64_t            au64Content[1];
+} RTASN1MEMCONTENT;
+AssertCompileMemberAlignment(RTASN1MEMCONTENT, au64Content, 8);
+/** Pointer to a ASN.1 content allocation. */
+typedef RTASN1MEMCONTENT *PRTASN1MEMCONTENT;
+
+
+
+
+RTDECL(int) RTAsn1MemGrowArray(PRTASN1ALLOCATION pAllocation, void **ppvArray, size_t cbEntry,
+                               uint32_t cCurrent, uint32_t cNew)
+{
+    AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+    AssertReturn(cbEntry > 0, VERR_INVALID_PARAMETER);
+    AssertReturn(cNew > cCurrent, VERR_INVALID_PARAMETER);
+    AssertReturn(cNew < _1M, VERR_OUT_OF_RANGE);
+
+    pAllocation->cReallocs++;
+
+    void *pvOld = *ppvArray;
+
+    /* Initial allocation? */
+    if (cCurrent == 0)
+    {
+        AssertReturn(pvOld == NULL, VERR_INVALID_PARAMETER);
+        AssertReturn(cNew != 0, VERR_INVALID_PARAMETER);
+        return pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvArray, cNew * cbEntry);
+    }
+
+    /* Do we need to grow the allocation or did we already allocate sufficient memory in a previous call? */
+    size_t cbNew = cNew * cbEntry;
+    if (pAllocation->cbAllocated < cbNew)
+    {
+        /* Need to grow.  Adjust the new size according to how many times we've been called. */
+        if (pAllocation->cReallocs > 2)
+        {
+            if (pAllocation->cReallocs > 8)
+                cNew += 8;
+            else if (pAllocation->cReallocs < 4)
+                cNew += 2;
+            else
+                cNew += 4;
+            cbNew += cNew * cbEntry;
+        }
+
+        int rc = pAllocation->pAllocator->pfnRealloc(pAllocation->pAllocator, pAllocation, pvOld, ppvArray, cbNew);
+        if (RT_FAILURE(rc))
+            return rc;
+        Assert(pAllocation->cbAllocated >= cbNew);
+
+        /* Clear the memory. */
+        size_t cbOld = cCurrent * cbEntry;
+        RT_BZERO((uint8_t *)*ppvArray + cbOld, pAllocation->cbAllocated - cbOld);
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1MemAllocZ(PRTASN1ALLOCATION pAllocation, void **ppvMem, size_t cbMem)
+{
+    AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+    AssertPtr(ppvMem);
+    Assert(cbMem > 0);
+    int rc = pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvMem, cbMem);
+    Assert(pAllocation->cbAllocated >= cbMem || RT_FAILURE_NP(rc));
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1MemDup(PRTASN1ALLOCATION pAllocation, void **ppvMem, const void *pvSrc, size_t cbMem)
+{
+    AssertReturn(pAllocation->pAllocator != NULL, VERR_WRONG_ORDER);
+    AssertPtr(ppvMem);
+    AssertPtr(pvSrc);
+    Assert(cbMem > 0);
+    int rc = pAllocation->pAllocator->pfnAlloc(pAllocation->pAllocator, pAllocation, ppvMem, cbMem);
+    if (RT_SUCCESS(rc))
+    {
+        Assert(pAllocation->cbAllocated >= cbMem);
+        memcpy(*ppvMem, pvSrc, cbMem);
+        return VINF_SUCCESS;
+    }
+    return rc;
+}
+
+
+RTDECL(void) RTAsn1MemFree(PRTASN1ALLOCATION pAllocation, void *pv)
+{
+    Assert(pAllocation->pAllocator != NULL);
+    if (pv)
+    {
+        pAllocation->pAllocator->pfnFree(pAllocation->pAllocator, pAllocation, pv);
+        Assert(pAllocation->cbAllocated == 0);
+    }
+}
+
+
+RTDECL(PRTASN1ALLOCATION) RTAsn1MemInitAllocation(PRTASN1ALLOCATION pAllocation, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    pAllocation->cbAllocated = 0;
+    pAllocation->cReallocs   = 0;
+    pAllocation->uReserved0  = 0;
+    pAllocation->pAllocator  = pAllocator;
+    return pAllocation;
+}
+
+
+RTDECL(int) RTAsn1ContentAllocZ(PRTASN1CORE pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertReturn(pAllocator != NULL, VERR_WRONG_ORDER);
+    AssertReturn(cb > 0 && cb < _1G, VERR_INVALID_PARAMETER);
+    AssertPtr(pAsn1Core);
+    AssertReturn(!(pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT), VERR_INVALID_STATE);
+
+    /* Initialize the temporary allocation tracker. */
+    RTASN1ALLOCATION Allocation;
+    Allocation.cbAllocated = 0;
+    Allocation.cReallocs   = 0;
+    Allocation.uReserved0  = 0;
+    Allocation.pAllocator  = pAllocator;
+
+    /* Make the allocation. */
+    uint32_t            cbAlloc = RT_OFFSETOF(RTASN1MEMCONTENT, au64Content) + (uint32_t)cb;
+    PRTASN1MEMCONTENT   pHdr;
+    int rc = pAllocator->pfnAlloc(pAllocator, &Allocation, (void **)&pHdr, cbAlloc);
+    if (RT_SUCCESS(rc))
+    {
+        Assert(Allocation.cbAllocated >= cbAlloc);
+        pHdr->Allocation = Allocation;
+        pAsn1Core->cb       = (uint32_t)cb;
+        pAsn1Core->uData.pv = &pHdr->au64Content[0];
+        pAsn1Core->fFlags  |= RTASN1CORE_F_ALLOCATED_CONTENT;
+    }
+
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1ContentDup(PRTASN1CORE pAsn1Core, void const *pvSrc, size_t cbSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    int rc = RTAsn1ContentAllocZ(pAsn1Core, cbSrc, pAllocator);
+    if (RT_SUCCESS(rc))
+        memcpy((void *)pAsn1Core->uData.pv, pvSrc, cbSrc);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1ContentReallocZ(PRTASN1CORE pAsn1Core, size_t cb, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    /* Validate input. */
+    AssertPtr(pAsn1Core);
+    AssertReturn(cb < _1G, VERR_INVALID_PARAMETER);
+
+    if (cb > 0)
+    {
+        /*
+         * Case 1 - Initial allocation.
+         */
+        uint32_t cbNeeded  = RT_OFFSETOF(RTASN1MEMCONTENT, au64Content) + (uint32_t)cb;
+        if (!(pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT))
+            return RTAsn1ContentAllocZ(pAsn1Core, cb, pAllocator);
+
+        /* Locate the header. */
+        PRTASN1MEMCONTENT pHdr = RT_FROM_MEMBER(pAsn1Core->uData.pv, RTASN1MEMCONTENT, au64Content);
+
+        /*
+         * Case 2 - Reallocation using the same allocator.
+         */
+        if (   pHdr->Allocation.pAllocator == pAllocator
+            || !pAllocator)
+        {
+            pHdr->Allocation.cReallocs++;
+
+            /* Modify the allocation if necessary. */
+            if (pHdr->Allocation.cbAllocated < cbNeeded)
+            {
+                RTASN1ALLOCATION Allocation = pHdr->Allocation;
+                int rc = Allocation.pAllocator->pfnRealloc(Allocation.pAllocator, &Allocation, pHdr, (void **)&pHdr, cbNeeded);
+                if (RT_FAILURE(rc))
+                    return rc;
+                Assert(Allocation.cbAllocated >= cbNeeded);
+                pAsn1Core->uData.pv = &pHdr->au64Content[0];
+                pHdr->Allocation    = Allocation;
+            }
+
+            /* Clear any additional memory we're letting the user use and
+               update the content size. */
+            if (pAsn1Core->cb < cb)
+                RT_BZERO((uint8_t *)&pAsn1Core->uData.pu8[pAsn1Core->cb], cb - pAsn1Core->cb);
+            pAsn1Core->cb = (uint32_t)cb;
+        }
+        /*
+         * Case 3 - Reallocation using a different allocator.
+         */
+        else
+        {
+            /* Initialize the temporary allocation tracker. */
+            RTASN1ALLOCATION Allocation;
+            Allocation.cbAllocated = 0;
+            Allocation.cReallocs   = pHdr->Allocation.cReallocs + 1;
+            Allocation.uReserved0  = 0;
+            Allocation.pAllocator  = pAllocator;
+
+            /* Make the allocation. */
+            PRTASN1MEMCONTENT pHdrNew;
+            int rc = pAllocator->pfnAlloc(pAllocator, &Allocation, (void **)&pHdrNew, cbNeeded);
+            if (RT_FAILURE(rc))
+                return rc;
+            Assert(Allocation.cbAllocated >= cbNeeded);
+
+            /* Duplicate the old content and zero any new memory we might've added. */
+            if (pAsn1Core->cb >= cb)
+                memcpy(&pHdrNew->au64Content[0], &pHdr->au64Content[0], cb);
+            else
+            {
+                memcpy(&pHdrNew->au64Content[0], &pHdr->au64Content[0], pAsn1Core->cb);
+                RT_BZERO((uint8_t *)&pHdrNew->au64Content[0] + pAsn1Core->cb, cb - pAsn1Core->cb);
+            }
+
+            /* Update the core. */
+            pHdrNew->Allocation = Allocation;
+            pAsn1Core->uData.pv = &pHdrNew->au64Content[0];
+            pAsn1Core->fFlags  |= RTASN1CORE_F_ALLOCATED_CONTENT; /* free cleared it. */
+            pAsn1Core->cb       = (uint32_t)cb;
+
+            /* Free the old content. */
+            Allocation = pHdr->Allocation;
+            Allocation.pAllocator->pfnFree(Allocation.pAllocator, &Allocation, pHdr);
+            Assert(Allocation.cbAllocated == 0);
+        }
+    }
+    /*
+     * Case 4 - It's a request to free the memory.
+     */
+    else
+        RTAsn1ContentFree(pAsn1Core);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1ContentFree(PRTASN1CORE pAsn1Core)
+{
+    if (pAsn1Core)
+    {
+        pAsn1Core->cb = 0;
+        if (pAsn1Core->fFlags & RTASN1CORE_F_ALLOCATED_CONTENT)
+        {
+            pAsn1Core->fFlags &= ~RTASN1CORE_F_ALLOCATED_CONTENT;
+            AssertReturnVoid(pAsn1Core->uData.pv);
+
+            PRTASN1MEMCONTENT pHdr       = RT_FROM_MEMBER(pAsn1Core->uData.pv, RTASN1MEMCONTENT, au64Content);
+            RTASN1ALLOCATION  Allocation = pHdr->Allocation;
+
+            Allocation.pAllocator->pfnFree(Allocation.pAllocator, &Allocation, pHdr);
+            Assert(Allocation.cbAllocated == 0);
+        }
+        pAsn1Core->uData.pv = NULL;
+    }
+}
+
+
+
+/*
+ * Virtual method table based API.
+ */
+
+RTDECL(void) RTAsn1VtDelete(PRTASN1CORE pAsn1Core)
+{
+    if (pAsn1Core)
+    {
+        PCRTASN1COREVTABLE pOps = pAsn1Core->pOps;
+        if (pOps)
+            pOps->pfnDtor(pAsn1Core);
+    }
+}
+
+
+/**
+ * Context data passed by RTAsn1VtDeepEnum to it's worker callbacks.
+ */
+typedef struct RTASN1DEEPENUMCTX
+{
+    PFNRTASN1ENUMCALLBACK   pfnCallback;
+    void                   *pvUser;
+} RTASN1DEEPENUMCTX;
+
+
+static DECLCALLBACK(int) rtAsn1VtDeepEnumDepthFirst(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+    AssertReturn(pAsn1Core, VINF_SUCCESS);
+
+    if (pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum)
+    {
+        int rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1VtDeepEnumDepthFirst, uDepth, pvUser);
+        if (rc != VINF_SUCCESS)
+            return rc;
+    }
+
+    RTASN1DEEPENUMCTX *pCtx = (RTASN1DEEPENUMCTX *)pvUser;
+    return pCtx->pfnCallback(pAsn1Core, pszName, uDepth, pCtx->pvUser);
+}
+
+
+static DECLCALLBACK(int) rtAsn1VtDeepEnumDepthLast(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+    AssertReturn(pAsn1Core, VINF_SUCCESS);
+
+    RTASN1DEEPENUMCTX *pCtx = (RTASN1DEEPENUMCTX *)pvUser;
+    int rc = pCtx->pfnCallback(pAsn1Core, pszName, uDepth, pCtx->pvUser);
+    if (rc == VINF_SUCCESS)
+    {
+        if (pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum)
+            rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1VtDeepEnumDepthFirst, uDepth, pvUser);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1VtDeepEnum(PRTASN1CORE pThisCore, bool fDepthFirst, uint32_t uDepth,
+                             PFNRTASN1ENUMCALLBACK pfnCallback, void *pvUser)
+{
+    int rc;
+    if (RTAsn1Core_IsPresent(pThisCore))
+    {
+        PCRTASN1COREVTABLE pOps = pThisCore->pOps;
+        if (pOps && pOps->pfnEnum)
+        {
+            RTASN1DEEPENUMCTX Ctx;
+            Ctx.pfnCallback = pfnCallback;
+            Ctx.pvUser      = pvUser;
+            rc = pOps->pfnEnum(pThisCore, fDepthFirst ? rtAsn1VtDeepEnumDepthFirst : rtAsn1VtDeepEnumDepthLast, uDepth, &Ctx);
+        }
+        else
+            rc = VINF_SUCCESS;
+    }
+    else
+        rc = VINF_SUCCESS;
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1VtClone(PRTASN1CORE pThisCore, PRTASN1CORE pSrcCore, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtrReturn(pThisCore,  VERR_INVALID_POINTER);
+    AssertPtrReturn(pSrcCore,   VERR_INVALID_POINTER);
+    AssertPtrReturn(pAllocator, VERR_INVALID_POINTER);
+
+    if (RTAsn1Core_IsPresent(pSrcCore))
+    {
+        AssertPtrReturn(pSrcCore->pOps, VERR_INVALID_POINTER);
+        AssertPtr(pSrcCore->pOps->pfnClone);
+        return pSrcCore->pOps->pfnClone(pThisCore, pSrcCore, pAllocator);
+    }
+
+    RT_ZERO(*pThisCore);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1VtCompare(PCRTASN1CORE pLeftCore, PCRTASN1CORE pRightCore)
+{
+    int iDiff;
+    if (RTAsn1Core_IsPresent(pLeftCore))
+    {
+        if (RTAsn1Core_IsPresent(pRightCore))
+        {
+            PCRTASN1COREVTABLE pOps = pLeftCore->pOps;
+            if (pOps == pRightCore->pOps)
+            {
+                AssertPtr(pOps->pfnCompare);
+                iDiff = pOps->pfnCompare(pLeftCore, pRightCore);
+            }
+            else
+                iDiff = (uintptr_t)pOps < (uintptr_t)pRightCore->pOps ? -1 : 1;
+        }
+        else
+            iDiff = 1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1Core_IsPresent(pRightCore);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1VtCheckSanity(PCRTASN1CORE pThisCore, uint32_t fFlags,
+                                PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    int rc;
+    if (RTAsn1Core_IsPresent(pThisCore))
+    {
+        PCRTASN1COREVTABLE pOps = pThisCore->pOps;
+        if (pOps && pOps->pfnCheckSanity)
+            rc = pOps->pfnCheckSanity(pThisCore, fFlags, pErrInfo, pszErrorTag);
+        else if (pOps)
+            rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NO_CHECK_SANITY_METHOD,
+                               "%s: Has no pfnCheckSanity function.", pszErrorTag);
+        else
+            rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NO_VTABLE, "%s: Has no Vtable function.", pszErrorTag);
+    }
+    else
+        rc = RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Not present.", pszErrorTag);
+    return rc;
+}
+
+
+
+/*
+ * Dummy ASN.1 object.
+ */
+
+RTDECL(int) RTAsn1Dummy_InitEx(PRTASN1DUMMY pThis)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             UINT32_MAX,
+                             ASN1_TAGCLASS_PRIVATE | ASN1_TAGFLAG_CONSTRUCTED,
+                             NULL,
+                             RTASN1CORE_F_DUMMY);
+}
+
+
+/*
+ * ASN.1 SEQUENCE OF object.
+ */
+
+RTDECL(int) RTAsn1SeqOfCore_Init(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             ASN1_TAG_SEQUENCE,
+                             ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                             pVtable,
+                             RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SeqOfCore_Clone(PRTASN1SEQOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQOFCORE pSrc)
+{
+    AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+    return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SET OF object.
+ */
+
+RTDECL(int) RTAsn1SetOfCore_Init(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             ASN1_TAG_SET,
+                             ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                             pVtable,
+                             RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SetOfCore_Clone(PRTASN1SETOFCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETOFCORE pSrc)
+{
+    AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+    return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SEQUENCE object.
+ */
+
+RTDECL(int) RTAsn1SequenceCore_Init(PRTASN1SEQUENCECORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             ASN1_TAG_SEQUENCE,
+                             ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                             pVtable,
+                             RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SequenceCore_Clone(PRTASN1SEQUENCECORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SEQUENCECORE pSrc)
+{
+    AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+    return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 SEQUENCE object - only used by SPC, so probably doing something wrong there.
+ */
+
+RTDECL(int) RTAsn1SetCore_Init(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             ASN1_TAG_SET,
+                             ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                             pVtable,
+                             RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1SetCore_Clone(PRTASN1SETCORE pThis, PCRTASN1COREVTABLE pVtable, PCRTASN1SETCORE pSrc)
+{
+    AssertReturn(pSrc->Asn1Core.pOps == pVtable, VERR_ASN1_INTERNAL_ERROR_5);
+    return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
+
+/*
+ * ASN.1 Context Tag object.
+ */
+
+RTDECL(int) RTAsn1ContextTagN_Init(PRTASN1CONTEXTTAG pThis, uint32_t uTag)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core,
+                             uTag,
+                             ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED,
+                             NULL,
+                             RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1ContextTagN_Clone(PRTASN1CONTEXTTAG pThis, PCRTASN1CONTEXTTAG pSrc, uint32_t uTag)
+{
+    Assert(pSrc->Asn1Core.uTag == uTag || !RTASN1CORE_IS_PRESENT(&pSrc->Asn1Core));
+    return RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-cursor.cpp b/src/VBox/Runtime/common/asn1/asn1-cursor.cpp
new file mode 100644
index 0000000..fb90efa
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-cursor.cpp
@@ -0,0 +1,505 @@
+/* $Id: asn1-cursor.cpp $ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static char const g_achDigits[11] = "0123456789";
+
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitPrimary(PRTASN1CURSORPRIMARY pPrimaryCursor, void const *pvFirst, uint32_t cb,
+                                              PRTERRINFO pErrInfo, PCRTASN1ALLOCATORVTABLE pAllocator, uint32_t fFlags,
+                                              const char *pszErrorTag)
+{
+    pPrimaryCursor->Cursor.pbCur        = (uint8_t const *)pvFirst;
+    pPrimaryCursor->Cursor.cbLeft       = cb;
+    pPrimaryCursor->Cursor.fFlags       = fFlags;
+    pPrimaryCursor->Cursor.pPrimary     = pPrimaryCursor;
+    pPrimaryCursor->Cursor.pUp          = NULL;
+    pPrimaryCursor->Cursor.pszErrorTag  = pszErrorTag;
+    pPrimaryCursor->pErrInfo            = pErrInfo;
+    pPrimaryCursor->pAllocator          = pAllocator;
+    return &pPrimaryCursor->Cursor;
+}
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSub(PRTASN1CURSOR pParent, uint32_t cb, PRTASN1CURSOR pChild, const char *pszErrorTag)
+{
+    Assert(pParent->pPrimary);
+    Assert(pParent->pbCur);
+
+    pChild->pbCur       = pParent->pbCur;
+    pChild->cbLeft      = cb;
+    pChild->fFlags      = pParent->fFlags;
+    pChild->pPrimary    = pParent->pPrimary;
+    pChild->pUp         = pParent;
+    pChild->pszErrorTag = pszErrorTag;
+
+    AssertRelease(pParent->cbLeft >= cb);
+    pParent->pbCur  += cb;
+    pParent->cbLeft -= cb;
+
+    return pChild;
+}
+
+
+RTDECL(PRTASN1CURSOR) RTAsn1CursorInitSubFromCore(PRTASN1CURSOR pParent, PRTASN1CORE pAsn1Core,
+                                                  PRTASN1CURSOR pChild, const char *pszErrorTag)
+{
+    Assert(pParent->pPrimary);
+    Assert(pParent->pbCur);
+
+    pChild->pbCur       = pAsn1Core->uData.pu8;
+    pChild->cbLeft      = pAsn1Core->cb;
+    pChild->fFlags      = pParent->fFlags;
+    pChild->pPrimary    = pParent->pPrimary;
+    pChild->pUp         = pParent;
+    pChild->pszErrorTag = pszErrorTag;
+
+    return pChild;
+}
+
+
+RTDECL(int) RTAsn1CursorSetInfoV(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, va_list va)
+{
+    PRTERRINFO pErrInfo = pCursor->pPrimary->pErrInfo;
+    if (pErrInfo)
+    {
+        /* Format the message. */
+        RTErrInfoSetV(pErrInfo, rc, pszMsg, va);
+
+        /* Add the prefixes.  This isn't the fastest way, but it's the one
+           which eats the least stack. */
+        char   *pszBuf = pErrInfo->pszMsg;
+        size_t  cbBuf  = pErrInfo->cbMsg;
+        if (pszBuf && cbBuf > 32)
+        {
+            size_t cbMove = strlen(pszBuf) + 1;
+
+            /* Make sure there is a ': '. */
+            bool fFirst = false;
+            if (pszMsg[0] != '%' || pszMsg[1] != 's' || pszMsg[2] != ':')
+            {
+                if (cbMove + 2 < cbBuf)
+                {
+                    memmove(pszBuf + 2, pszBuf, cbMove);
+                    pszBuf[0] = ':';
+                    pszBuf[1] = ' ';
+                    cbMove += 2;
+                    fFirst = true;
+                }
+            }
+
+            /* Add the prefixes from the cursor chain. */
+            while (pCursor)
+            {
+                if (pCursor->pszErrorTag)
+                {
+                    size_t cchErrorTag = strlen(pCursor->pszErrorTag);
+                    if (cchErrorTag + !fFirst + cbMove > cbBuf)
+                        break;
+                    memmove(pszBuf + cchErrorTag + !fFirst, pszBuf, cbMove);
+                    memcpy(pszBuf, pCursor->pszErrorTag, cchErrorTag);
+                    if (!fFirst)
+                        pszBuf[cchErrorTag] = '.';
+                    cbMove += cchErrorTag + !fFirst;
+                    fFirst  = false;
+                }
+                pCursor = pCursor->pUp;
+            }
+        }
+    }
+
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorSetInfo(PRTASN1CURSOR pCursor, int rc, const char *pszMsg, ...)
+{
+    va_list va;
+    va_start(va, pszMsg);
+    rc = RTAsn1CursorSetInfoV(pCursor, rc, pszMsg, va);
+    va_end(va);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorCheckEnd(PRTASN1CURSOR pCursor)
+{
+    if (pCursor->cbLeft == 0)
+        return VINF_SUCCESS;
+    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_NOT_AT_END,
+                               "%u (%#x) bytes left over", pCursor->cbLeft, pCursor->cbLeft);
+}
+
+
+RTDECL(PRTASN1ALLOCATION) RTAsn1CursorInitAllocation(PRTASN1CURSOR pCursor, PRTASN1ALLOCATION pAllocation)
+{
+    pAllocation->cbAllocated = 0;
+    pAllocation->cReallocs   = 0;
+    pAllocation->uReserved0  = 0;
+    pAllocation->pAllocator  = pCursor->pPrimary->pAllocator;
+    return pAllocation;
+}
+
+
+RTDECL(int) RTAsn1CursorReadHdr(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, const char *pszErrorTag)
+{
+    /*
+     * Initialize the return structure in case of failure.
+     */
+    pAsn1Core->uTag         = 0;
+    pAsn1Core->fClass       = 0;
+    pAsn1Core->uRealTag     = 0;
+    pAsn1Core->fRealClass   = 0;
+    pAsn1Core->cbHdr        = 0;
+    pAsn1Core->cb           = 0;
+    pAsn1Core->fFlags       = 0;
+    pAsn1Core->uData.pv     = NULL;
+    pAsn1Core->pOps         = NULL;
+
+    /*
+     * The header has at least two bytes: Type & length.
+     */
+    if (pCursor->cbLeft >= 2)
+    {
+        uint32_t uTag = pCursor->pbCur[0];
+        uint32_t cb   = pCursor->pbCur[1];
+        pCursor->cbLeft -= 2;
+        pCursor->pbCur  += 2;
+
+        pAsn1Core->uRealTag   = pAsn1Core->uTag   = uTag & ASN1_TAG_MASK;
+        pAsn1Core->fRealClass = pAsn1Core->fClass = uTag & ~ASN1_TAG_MASK;
+        pAsn1Core->cbHdr  = 2;
+        if ((uTag & ASN1_TAG_MASK) == ASN1_TAG_USE_LONG_FORM)
+            return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_LONG_TAG,
+                                       "%s: Implement parsing of tags > 30: %#x (length=%#x)", pszErrorTag, uTag, cb);
+
+        /* Extended length field? */
+        if (cb & RT_BIT(7))
+        {
+            if (cb != RT_BIT(7))
+            {
+                /* Definite form. */
+                uint8_t cbEnc = cb & 0x7f;
+                if (cbEnc > pCursor->cbLeft)
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+                                               "%s: Extended BER length field longer than available data: %#x vs %#x (uTag=%#x)",
+                                               pszErrorTag, cbEnc, pCursor->cbLeft, uTag);
+                switch (cbEnc)
+                {
+                    case 1:
+                        cb = pCursor->pbCur[0];
+                        break;
+                    case 2:
+                        cb = RT_MAKE_U16(pCursor->pbCur[1], pCursor->pbCur[0]);
+                        break;
+                    case 3:
+                        cb = RT_MAKE_U32_FROM_U8(pCursor->pbCur[2], pCursor->pbCur[1], pCursor->pbCur[0], 0);
+                        break;
+                    case 4:
+                        cb = RT_MAKE_U32_FROM_U8(pCursor->pbCur[3], pCursor->pbCur[2], pCursor->pbCur[1], pCursor->pbCur[0]);
+                        break;
+                    default:
+                        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+                                                   "%s: Too long/short extended BER length field: %#x (uTag=%#x)",
+                                                   pszErrorTag, cbEnc, uTag);
+                }
+                pCursor->cbLeft  -= cbEnc;
+                pCursor->pbCur   += cbEnc;
+                pAsn1Core->cbHdr += cbEnc;
+
+                /* Check the length encoding efficiency (T-REC-X.690-200811 10.1, 9.1). */
+                if (pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER))
+                {
+                    if (cb <= 0x7f)
+                        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+                                                   "%s: Invalid DER/CER length encoding: cbEnc=%u cb=%#x uTag=%#x",
+                                                   pszErrorTag, cbEnc, cb, uTag);
+                    uint8_t cbNeeded;
+                    if (cb <= 0x000000ff)       cbNeeded = 1;
+                    else if (cb <= 0x0000ffff)  cbNeeded = 2;
+                    else if (cb <= 0x00ffffff)  cbNeeded = 3;
+                    else                        cbNeeded = 4;
+                    if (cbNeeded != cbEnc)
+                        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH_ENCODING,
+                                                   "%s: Invalid DER/CER length encoding: cb=%#x uTag=%#x cbEnc=%u cbNeeded=%u",
+                                                   pszErrorTag, cb, uTag, cbEnc, cbNeeded);
+                }
+            }
+            /* Indefinite form. */
+            else if (pCursor->fFlags & RTASN1CURSOR_FLAGS_DER)
+                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_IDEFINITE_LENGTH,
+                                           "%s: Indefinite length form not allowed in DER mode (uTag=%#x).", pszErrorTag, uTag);
+            else
+                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_IDEFINITE_LENGTH_NOT_SUP,
+                                           "%s: Indefinite BER/CER length not supported (uTag=%#x)", pszErrorTag, uTag);
+        }
+
+        /* Check if the length makes sense. */
+        if (cb > pCursor->cbLeft)
+            return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_BAD_LENGTH,
+                                       "%s: BER value length out of bounds: %#x (max=%#x uTag=%#x)",
+                                       pszErrorTag, cb, pCursor->cbLeft, uTag);
+
+        pAsn1Core->fFlags  |= RTASN1CORE_F_PRESENT | RTASN1CORE_F_DECODED_CONTENT;
+        pAsn1Core->cb       = cb;
+        pAsn1Core->uData.pv = (void *)pCursor->pbCur;
+        return VINF_SUCCESS;
+    }
+
+    if (pCursor->cbLeft)
+        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TOO_LITTLE_DATA_LEFT,
+                                   "%s: Too little data left to form a valid BER header", pszErrorTag);
+    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_NO_MORE_DATA,
+                               "%s: No more data reading BER header", pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorMatchTagClassFlagsEx(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core, uint32_t uTag, uint32_t fClass,
+                                             bool fString, uint32_t fFlags, const char *pszErrorTag, const char *pszWhat)
+{
+    if (pAsn1Core->uTag == uTag)
+    {
+        if (pAsn1Core->fClass == fClass)
+            return VINF_SUCCESS;
+        if (   fString
+            && pAsn1Core->fClass == (fClass | ASN1_TAGFLAG_CONSTRUCTED))
+        {
+            if (!(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER)))
+                return VINF_SUCCESS;
+            if (pCursor->fFlags & RTASN1CURSOR_FLAGS_CER)
+            {
+                if (pAsn1Core->cb > 1000)
+                    return VINF_SUCCESS;
+                return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+                                           "%s: Constructed %s only allowed for >1000 byte in CER encoding: cb=%#x uTag=%#x fClass=%#x",
+                                           pszErrorTag, pszWhat, pAsn1Core->cb, pAsn1Core->uTag, pAsn1Core->fClass);
+            }
+            return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+                                       "%s: DER encoding does not allow constructed %s (cb=%#x uTag=%#x fClass=%#x)",
+                                       pszErrorTag, pszWhat, pAsn1Core->cb, pAsn1Core->uTag, pAsn1Core->fClass);
+        }
+    }
+
+    if (fFlags & RTASN1CURSOR_GET_F_IMPLICIT)
+    {
+        pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+        pAsn1Core->uRealTag   = uTag;
+        pAsn1Core->fRealClass = fClass;
+        return VINF_SUCCESS;
+    }
+
+    return RTAsn1CursorSetInfo(pCursor, pAsn1Core->uTag != uTag ? VERR_ASN1_CURSOR_TAG_MISMATCH : VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+                               "%s: Unexpected %s type/flags: %#x/%#x (expected %#x/%#x)",
+                               pszErrorTag, pszWhat, pAsn1Core->uTag, pAsn1Core->fClass, uTag, fClass);
+}
+
+
+
+static int rtAsn1CursorGetXxxxCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uTag, uint8_t fClass,
+                                     PRTASN1CORE pAsn1Core, PRTASN1CURSOR pRetCursor,
+                                     const char *pszErrorTag, const char *pszWhat)
+{
+    int rc = RTAsn1CursorReadHdr(pCursor, pAsn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        if (   pAsn1Core->uTag == uTag
+            && pAsn1Core->fClass == fClass)
+            rc = VINF_SUCCESS;
+        else if (fFlags & RTASN1CURSOR_GET_F_IMPLICIT)
+        {
+            pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+            pAsn1Core->uRealTag   = uTag;
+            pAsn1Core->fRealClass = fClass;
+            rc = VINF_SUCCESS;
+        }
+        else
+            return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+                                       "%s: Unexpected %s type/flags: %#x/%#x (expected %#x/%#x)",
+                                       pszErrorTag, pszWhat, pAsn1Core->uTag, pAsn1Core->fClass, uTag, fClass);
+        RTAsn1CursorInitSub(pCursor, pAsn1Core->cb, pRetCursor, pszErrorTag);
+        pAsn1Core->fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+        return VINF_SUCCESS;
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1CursorGetSequenceCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                          PRTASN1SEQUENCECORE pSeqCore, PRTASN1CURSOR pSeqCursor, const char *pszErrorTag)
+{
+    return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, ASN1_TAG_SEQUENCE, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                                     &pSeqCore->Asn1Core, pSeqCursor, pszErrorTag, "sequence");
+}
+
+
+RTDECL(int) RTAsn1CursorGetSetCursor(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                     PRTASN1SETCORE pSetCore, PRTASN1CURSOR pSetCursor, const char *pszErrorTag)
+{
+    return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, ASN1_TAG_SET, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED,
+                                     &pSetCore->Asn1Core, pSetCursor, pszErrorTag, "set");
+}
+
+
+RTDECL(int) RTAsn1CursorGetContextTagNCursor(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t uExpectedTag,
+                                             PRTASN1CONTEXTTAG pCtxTag, PRTASN1CURSOR pCtxTagCursor, const char *pszErrorTag)
+{
+    return rtAsn1CursorGetXxxxCursor(pCursor, fFlags, uExpectedTag, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_CONSTRUCTED,
+                                     &pCtxTag->Asn1Core, pCtxTagCursor, pszErrorTag, "ctx tag");
+}
+
+
+RTDECL(int) RTAsn1CursorPeek(PRTASN1CURSOR pCursor, PRTASN1CORE pAsn1Core)
+{
+    uint32_t        cbSavedLeft = pCursor->cbLeft;
+    uint8_t const  *pbSavedCur  = pCursor->pbCur;
+    PRTERRINFO      pErrInfo    = pCursor->pPrimary->pErrInfo;
+    pCursor->pPrimary->pErrInfo = NULL;
+
+    int rc = RTAsn1CursorReadHdr(pCursor, pAsn1Core, "peek");
+
+    pCursor->pPrimary->pErrInfo = pErrInfo;
+    pCursor->pbCur  = pbSavedCur;
+    pCursor->cbLeft = cbSavedLeft;
+    return rc;
+}
+
+
+RTDECL(bool) RTAsn1CursorIsNextEx(PRTASN1CURSOR pCursor, uint32_t uTag, uint8_t fClass)
+{
+    RTASN1CORE Asn1Core;
+    int rc = RTAsn1CursorPeek(pCursor, &Asn1Core);
+    if (RT_SUCCESS(rc))
+        return uTag   == Asn1Core.uTag
+            && fClass == Asn1Core.fClass;
+    return false;
+}
+
+
+/** @name Legacy Interfaces.
+ * @{ */
+RTDECL(int) RTAsn1CursorGetCore(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pAsn1Core, const char *pszErrorTag)
+{
+    return RTAsn1Core_DecodeAsn1(pCursor, fFlags, pAsn1Core, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetNull(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pNull, const char *pszErrorTag)
+{
+    return RTAsn1Null_DecodeAsn1(pCursor, fFlags, pNull, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetInteger(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pInteger, const char *pszErrorTag)
+{
+    return RTAsn1Integer_DecodeAsn1(pCursor, fFlags, pInteger, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBoolean(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pBoolean, const char *pszErrorTag)
+{
+    return RTAsn1Boolean_DecodeAsn1(pCursor, fFlags, pBoolean, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetObjId(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pObjId, const char *pszErrorTag)
+{
+    return RTAsn1ObjId_DecodeAsn1(pCursor, fFlags, pObjId, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetTime(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pTime, const char *pszErrorTag)
+{
+    return RTAsn1Time_DecodeAsn1(pCursor, fFlags, pTime, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBitStringEx(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pBitString,
+                                       const char *pszErrorTag)
+{
+    return RTAsn1BitString_DecodeAsn1Ex(pCursor, fFlags, cMaxBits, pBitString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBitString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pBitString, const char *pszErrorTag)
+{
+    return RTAsn1BitString_DecodeAsn1(pCursor, fFlags, pBitString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetOctetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pOctetString,
+                                       const char *pszErrorTag)
+{
+    return RTAsn1OctetString_DecodeAsn1(pCursor, fFlags, pOctetString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+    return RTAsn1String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetIa5String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+    return RTAsn1Ia5String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetUtf8String(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+    return RTAsn1Utf8String_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetBmpString(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pString, const char *pszErrorTag)
+{
+    return RTAsn1BmpString_DecodeAsn1(pCursor, fFlags, pString, pszErrorTag);
+}
+
+
+RTDECL(int) RTAsn1CursorGetDynType(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag)
+{
+    return RTAsn1DynType_DecodeAsn1(pCursor, fFlags, pDynType, pszErrorTag);
+}
+/** @} */
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp b/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp
new file mode 100644
index 0000000..2e52e57
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-default-allocator.cpp
@@ -0,0 +1,105 @@
+/* $Id: asn1-default-allocator.cpp $ */
+/** @file
+ * IPRT - ASN.1, Default Allocator.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/mem.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+/**
+ * Aligns allocation sizes a little.
+ *
+ * @returns Aligned size.
+ * @param   cb                  Requested size.
+ */
+static size_t rtAsn1DefaultAllocator_AlignSize(size_t cb)
+{
+    if (cb >= 64)
+        return RT_ALIGN_Z(cb, 64);
+    if (cb >= 32)
+        return RT_ALIGN_Z(cb, 32);
+    if (cb >= 16)
+        return RT_ALIGN_Z(cb, 16);
+    return cb;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnFree} */
+static DECLCALLBACK(void) rtAsn1DefaultAllocator_Free(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation, void *pv)
+{
+    RTMemFree(pv);
+    pAllocation->cbAllocated = 0;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnAlloc} */
+static DECLCALLBACK(int)  rtAsn1DefaultAllocator_Alloc(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation,
+                                                       void **ppv, size_t cb)
+{
+    size_t cbAlloc = rtAsn1DefaultAllocator_AlignSize(cb);
+    void *pv = RTMemAllocZ(cbAlloc);
+    if (pv)
+    {
+        *ppv = pv;
+        pAllocation->cbAllocated = (uint32_t)cbAlloc;
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+/** @interface_method_impl{RTASN1ALLOCATORVTABLE, pfnRealloc} */
+static DECLCALLBACK(int)  rtAsn1DefaultAllocator_Realloc(PCRTASN1ALLOCATORVTABLE pThis, PRTASN1ALLOCATION pAllocation,
+                                                         void *pvOld, void **ppvNew, size_t cbNew)
+{
+    Assert(pvOld);
+    Assert(cbNew);
+    size_t cbAlloc = rtAsn1DefaultAllocator_AlignSize(cbNew);
+    void *pv = RTMemRealloc(pvOld, cbAlloc);
+    if (pv)
+    {
+        *ppvNew = pv;
+        pAllocation->cbAllocated = (uint32_t)cbAlloc;
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+/** The default ASN.1 allocator. */
+RT_DECL_DATA_CONST(RTASN1ALLOCATORVTABLE const) g_RTAsn1DefaultAllocator =
+{
+    rtAsn1DefaultAllocator_Free,
+    rtAsn1DefaultAllocator_Alloc,
+    rtAsn1DefaultAllocator_Realloc
+};
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-dump.cpp b/src/VBox/Runtime/common/asn1/asn1-dump.cpp
new file mode 100644
index 0000000..35f5140
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-dump.cpp
@@ -0,0 +1,826 @@
+/* $Id: asn1-dump.cpp $ */
+/** @file
+ * IPRT - ASN.1, Structure Dumper.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/log.h>
+#ifdef IN_RING3
+# include <iprt/stream.h>
+#endif
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Dump data structure.
+ */
+typedef struct RTASN1DUMPDATA
+{
+    /** RTASN1DUMP_F_XXX. */
+    uint32_t                fFlags;
+    /** The printfv like output function. */
+    PFNRTDUMPPRINTFV        pfnPrintfV;
+    /** PrintfV user argument. */
+    void                   *pvUser;
+} RTASN1DUMPDATA;
+/** Pointer to a dump data structure. */
+typedef RTASN1DUMPDATA *PRTASN1DUMPDATA;
+
+
+/**
+ * Wrapper around FNRTASN1DUMPPRINTFV.
+ *
+ * @param   pData               The dump data structure.
+ * @param   pszFormat           Format string.
+ * @param   ...                 Format arguments.
+ */
+static void rtAsn1DumpPrintf(PRTASN1DUMPDATA pData, const char *pszFormat, ...)
+{
+    va_list va;
+    va_start(va, pszFormat);
+    pData->pfnPrintfV(pData->pvUser, pszFormat, va);
+    va_end(va);
+}
+
+
+/**
+ * Prints indentation.
+ *
+ * @param   pData               The dump data structure.
+ * @param   uDepth              The indentation depth.
+ */
+static void rtAsn1DumpPrintIdent(PRTASN1DUMPDATA pData, uint32_t uDepth)
+{
+    uint32_t i = 0;
+    uDepth *= 2;
+    while (i < uDepth)
+    {
+        static char const s_szSpaces[] = "                                        ";
+        uint32_t cch = RT_MIN(uDepth, sizeof(s_szSpaces) - 1);
+        rtAsn1DumpPrintf(pData, &s_szSpaces[sizeof(s_szSpaces) - 1 - cch]);
+        i += cch;
+    }
+}
+
+
+/**
+ * Dumps UTC TIME and GENERALIZED TIME
+ *
+ * @param   pData               The dump data structure.
+ * @param   pAsn1Core           The ASN.1 core object representation.
+ * @param   pszType             The time type name.
+ */
+static void rtAsn1DumpTime(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszType)
+{
+    if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+    {
+        PCRTASN1TIME pTime = (PCRTASN1TIME)pAsn1Core;
+        rtAsn1DumpPrintf(pData, "%s -- %04u-%02u-%02u %02u:%02u:%02.%09Z\n",
+                         pszType,
+                         pTime->Time.i32Year, pTime->Time.u8Month,  pTime->Time.u8MonthDay,
+                         pTime->Time.u8Hour, pTime->Time.u8Minute, pTime->Time.u8Second,
+                         pTime->Time.u32Nanosecond);
+    }
+    else if (pAsn1Core->cb > 0 && pAsn1Core->cb < 32 && pAsn1Core->uData.pch)
+        rtAsn1DumpPrintf(pData, "%s '%.*s'\n", pszType, (size_t)pAsn1Core->cb, pAsn1Core->uData.pch);
+    else
+        rtAsn1DumpPrintf(pData, "%s -- cb=%u\n", pszType, pAsn1Core->cb);
+}
+
+
+/**
+ * Dumps strings sharing the RTASN1STRING structure.
+ *
+ * @param   pData               The dump data structure.
+ * @param   pAsn1Core           The ASN.1 core object representation.
+ * @param   pszType             The string type name.
+ * @param   uDepth              The current identation level.
+ */
+static void rtAsn1DumpString(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, const char *pszType, uint32_t uDepth)
+{
+    rtAsn1DumpPrintf(pData, "%s", pszType);
+
+    const char     *pszPostfix  = "'\n";
+    bool            fUtf8       = false;
+    const char     *pch         = pAsn1Core->uData.pch;
+    uint32_t        cch         = pAsn1Core->cb;
+    PCRTASN1STRING  pString     = (PCRTASN1STRING)pAsn1Core;
+    if (   (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
+        && pString->pszUtf8
+        && pString->cchUtf8)
+    {
+        fUtf8 = true;
+        pszPostfix = "' -- utf-8\n";
+    }
+
+    if (cch == 0 || !pch)
+        rtAsn1DumpPrintf(pData, "-- cb=%u\n", pszType, pAsn1Core->cb);
+    else
+    {
+        if (cch >= 48)
+        {
+            rtAsn1DumpPrintf(pData, "\n");
+            rtAsn1DumpPrintIdent(pData, uDepth + 1);
+        }
+        rtAsn1DumpPrintf(pData, " '");
+
+        /** @todo Handle BMP and UNIVERSIAL strings specially. */
+        do
+        {
+            const char *pchStart = pch;
+            while (   cch > 0
+                   && (uint8_t)*pch >= 0x20
+                   && (!fUtf8 ? (uint8_t)*pch < 0x7f : (uint8_t)*pch != 0x7f)
+                   && *pch != '\'')
+                cch--, pch++;
+            if (pchStart != pch)
+                rtAsn1DumpPrintf(pData, "%.*s", pch - pchStart, pchStart);
+
+            while (   cch > 0
+                   && (   (uint8_t)*pch < 0x20
+                       || (!fUtf8 ? (uint8_t)*pch >= 0x7f : (uint8_t)*pch == 0x7f)
+                       || (uint8_t)*pch == '\'') )
+            {
+                rtAsn1DumpPrintf(pData, "\\x%02x", *pch);
+                cch--;
+                pch++;
+            }
+        } while (cch > 0);
+
+        rtAsn1DumpPrintf(pData, pszPostfix);
+    }
+}
+
+
+/**
+ * Returns a name for the given object ID.
+ *
+ * This is just to make some of the dumps a little easier to read.  It's no our
+ * intention to have the whole ODI repository encoded here.
+ *
+ * @returns Name if available, NULL if not.
+ * @param   pszObjId            The dotted object identifier string.
+ */
+static const char *rtAsn1DumpLookupObjIdName(const char *pszObjId)
+{
+#define STARTS_WITH_1(a_off, a_uValue) \
+    ( pszObjId[a_off] == (a_uValue) + '0' && pszObjId[a_off + 1] == '.' )
+#define STARTS_WITH_2(a_off, a_uValue) \
+    ( pszObjId[a_off] == (a_uValue) / 10 + '0' && pszObjId[a_off + 1] == (a_uValue) % 10 + '0' && pszObjId[a_off + 2] == '.' )
+#define STARTS_WITH_3(a_off, a_uValue) \
+    (   pszObjId[a_off]     == (a_uValue) / 100 + '0' \
+     && pszObjId[a_off + 1] == ((a_uValue) % 100) / 10 + '0' \
+     && pszObjId[a_off + 2] == (a_uValue) % 10 + '0' \
+     && pszObjId[a_off + 3] == '.' )
+#define STARTS_WITH_6(a_off, a_uValue) \
+    (   pszObjId[a_off]     == (a_uValue) / 100000 + '0' \
+     && pszObjId[a_off + 1] == ((a_uValue) % 100000) / 10000 + '0' \
+     && pszObjId[a_off + 2] == ((a_uValue) % 10000) / 1000 + '0' \
+     && pszObjId[a_off + 3] == ((a_uValue) % 1000) / 100 + '0' \
+     && pszObjId[a_off + 4] == ((a_uValue) % 100) / 10 + '0' \
+     && pszObjId[a_off + 5] == (a_uValue) % 10 + '0' \
+     && pszObjId[a_off + 6] == '.' )
+
+#define ENDS_WITH_1(a_off, a_uValue) \
+    ( pszObjId[a_off] == (a_uValue) + '0' && !pszObjId[a_off + 1] )
+#define ENDS_WITH_2(a_off, a_uValue) \
+    ( pszObjId[a_off] == (a_uValue) / 10 + '0' && pszObjId[a_off + 1] == (a_uValue) % 10 + '0' && !pszObjId[a_off + 2] )
+
+    if (STARTS_WITH_1(0, 0))        /* ITU-T assigned - top level 0. */
+    {
+
+    }
+    else if (STARTS_WITH_1(0, 1))   /* ISO assigned - top level 1. */
+    {
+        if (STARTS_WITH_1(2, 0))        /* ISO standard - 1.0. */
+        {
+            /* */
+        }
+        else if (STARTS_WITH_1(2, 2))   /* ISO member body - 1.2. */
+        {
+            if (STARTS_WITH_3(4, 840))      /* USA - 1.2.840. */
+            {
+                if (STARTS_WITH_6(8, 113549))   /* RSADSI / RSA Data Security inc - 1.2.840.113549. */
+                {
+                    if (STARTS_WITH_1(15, 1))       /* PKCS - 1.2.840.113549.1. */
+                    {
+                        if (STARTS_WITH_1(17, 1))       /* PKCS-1 - 1.2.840.113549.1.1. */
+                        {
+                                  if (ENDS_WITH_1(19, 1))    return "pkcs1-RsaEncryption";
+                             else if (ENDS_WITH_1(19, 2))    return "pkcs1-Md2WithRsaEncryption";
+                             else if (ENDS_WITH_1(19, 3))    return "pkcs1-Md4WithRsaEncryption";
+                             else if (ENDS_WITH_1(19, 4))    return "pkcs1-Md5WithRsaEncryption";
+                             else if (ENDS_WITH_1(19, 5))    return "pkcs1-Sha1WithRsaEncryption";
+                             else if (ENDS_WITH_2(19, 10))   return "pkcs1-RsaPss";
+                             else if (ENDS_WITH_2(19, 11))   return "pkcs1-Sha256WithRsaEncryption";
+                             else if (ENDS_WITH_2(19, 12))   return "pkcs1-Sha384WithRsaEncryption";
+                             else if (ENDS_WITH_2(19, 13))   return "pkcs1-Sha512WithRsaEncryption";
+                             else if (ENDS_WITH_2(19, 14))   return "pkcs1-Sha224WithRsaEncryption";
+                        }
+                        else if (STARTS_WITH_1(17, 9))  /* PKCS-9 signatures - 1.2.840.113549.1.9. */
+                        {
+                                 if (ENDS_WITH_1(19, 1))    return "pkcs9-EMailAddress";
+                            else if (ENDS_WITH_1(19, 2))    return "pkcs9-UntrustedName";
+                            else if (ENDS_WITH_1(19, 3))    return "pkcs9-ContentType";
+                            else if (ENDS_WITH_1(19, 4))    return "pkcs9-MessageDigest";
+                            else if (ENDS_WITH_1(19, 5))    return "pkcs9-SigningTime";
+                            else if (ENDS_WITH_1(19, 6))    return "pkcs9-CounterSignature";
+                            else if (ENDS_WITH_1(19, 7))    return "pkcs9-challengePassword";
+                            else if (ENDS_WITH_1(19, 8))    return "pkcs9-UnstructuredAddress";
+                            else if (ENDS_WITH_1(19, 9))    return "pkcs9-ExtendedCertificateAttributes";
+                            else if (ENDS_WITH_2(19, 13))   return "pkcs9-SigningDescription";
+                            else if (ENDS_WITH_2(19, 14))   return "pkcs9-ExtensionRequest";
+                            else if (ENDS_WITH_2(19, 15))   return "pkcs9-SMimeCapabilities";
+                        }
+                    }
+                    else if (STARTS_WITH_1(15, 2))  /* PKCS #2 - 1.2.840.113549.2. */
+                    {
+                    }
+                }
+            }
+        }
+        else if (STARTS_WITH_1(2, 3))   /* ISO identified organiziation - 1.3. */
+        {
+            if (STARTS_WITH_1(4, 6))        /* DOD - 1.3.6. */
+            {
+                if (STARTS_WITH_1(6, 1))        /* Internet - 1.3.6.1. */
+                {
+                    if (STARTS_WITH_1(8, 4))        /* Private - 1.3.6.1.4. */
+                    {
+                        if (STARTS_WITH_1(10, 1))       /* IANA-registered Private Enterprises. */
+                        {
+                            if (STARTS_WITH_3(12, 311))     /* Microsoft - 1.3.6.1.4.1.311 */
+                            {
+                                if (STARTS_WITH_1(16, 1))       /* 1.3.6.1.4.1.311.1. */
+                                {
+                                }
+                                else if (STARTS_WITH_1(16, 2))  /* 1.3.6.1.4.1.311.2 */
+                                {
+                                    if (STARTS_WITH_1(18, 1))       /* 1.3.6.1.4.1.311.2.1. */
+                                    {
+                                             if (ENDS_WITH_1(20, 1))     return "Ms-??-2.1";
+                                        else if (ENDS_WITH_1(20, 4))     return "Ms-SpcIndirectDataContext";
+                                        else if (ENDS_WITH_2(20, 10))    return "Ms-SpcAgencyInfo";
+                                        else if (ENDS_WITH_2(20, 11))    return "Ms-SpcStatemntType";
+                                        else if (ENDS_WITH_2(20, 12))    return "Ms-SpcOpusInfo";
+                                        else if (ENDS_WITH_2(20, 14))    return "Ms-CertReqExtensions";
+                                        else if (ENDS_WITH_2(20, 15))    return "Ms-SpcPeImageData";
+                                        else if (ENDS_WITH_2(20, 18))    return "Ms-SpcRawFileData";
+                                        else if (ENDS_WITH_2(20, 19))    return "Ms-SpcStructuredStorageData";
+                                        else if (ENDS_WITH_2(20, 20))    return "Ms-SpcJavaClassDataType1";
+                                        else if (ENDS_WITH_2(20, 21))    return "Ms-SpcIndividualCodeSigning";
+                                        else if (ENDS_WITH_2(20, 22))    return "Ms-SpcCommericalSigning";
+                                        else if (ENDS_WITH_2(20, 25))    return "Ms-SpcLinkType2-Aka-CabData";
+                                        else if (ENDS_WITH_2(20, 26))    return "Ms-SpcMinimalCriterialInfo";
+                                        else if (ENDS_WITH_2(20, 27))    return "Ms-SpcFinacialCriterialInfo";
+                                        else if (ENDS_WITH_2(20, 28))    return "Ms-SpcLinkType3";
+                                    }
+                                    else if (STARTS_WITH_1(18, 3))  /* 1.3.6.1.4.1.311.2.3. */
+                                    {
+                                             if (ENDS_WITH_1(20, 1))     return "Ms-SpcPeImagePageHashesV1";
+                                        else if (ENDS_WITH_1(20, 2))     return "Ms-SpcPeImagePageHashesV2";
+                                    }
+                                }
+                                else if (STARTS_WITH_1(16, 3))  /* 1.3.6.1.4.1.311.3 */
+                                {
+                                    if (STARTS_WITH_1(18, 3))       /* 1.3.6.1.4.1.311.3.3. */
+                                    {
+                                             if (ENDS_WITH_1(20, 1))     return "Ms-CounterSign";
+                                        else if (ENDS_WITH_1(20, 2))     return "Ms-??-3.2";
+                                    }
+                                }
+                                else if (STARTS_WITH_2(16, 10)) /* 1.3.6.1.4.1.311.10 */
+                                {
+                                    if (STARTS_WITH_1(19, 3))       /* . */
+                                    {
+                                             if (ENDS_WITH_1(21, 1))     return "Ms-CertTrustListSigning";
+                                        else if (ENDS_WITH_1(21, 2))     return "Ms-TimeStampSigning";
+                                        else if (ENDS_WITH_1(21, 4))     return "Ms-EncryptedFileSystem";
+                                        else if (ENDS_WITH_1(21, 5))     return "Ms-WhqlCrypto";
+                                        else if (ENDS_WITH_1(21, 6))     return "Ms-Nt5Crypto";
+                                        else if (ENDS_WITH_1(21, 7))     return "Ms-OemWhqlCrypto";
+                                        else if (ENDS_WITH_1(21, 8))     return "Ms-EmbeddedNtCrypto";
+                                        else if (ENDS_WITH_1(21, 9))     return "Ms-RootListSigner";
+                                        else if (ENDS_WITH_2(21, 10))    return "Ms-QualifiedSubordination";
+                                        else if (ENDS_WITH_2(21, 11))    return "Ms-KeyRecovery";
+                                        else if (ENDS_WITH_2(21, 12))    return "Ms-DocumentSigning";
+                                        else if (ENDS_WITH_2(21, 13))    return "Ms-LifetimeSigning";
+                                    }
+                                    else if (STARTS_WITH_1(19, 5))  /* . */
+                                    {
+                                             if (ENDS_WITH_1(21, 1))     return "Ms-Drm";
+                                        else if (ENDS_WITH_1(21, 2))     return "Ms-DrmIndividualization";
+                                    }
+                                    else if (STARTS_WITH_1(19, 9))  /* . */
+                                    {
+                                        if (ENDS_WITH_1(21, 1))     return "Ms-CrossCertDistPoints";
+                                    }
+                                }
+                                else if (STARTS_WITH_2(16, 20)) /* 1.3.6.1.4.1.311.20 */
+                                {
+                                         if (ENDS_WITH_1(19, 1))     return "Ms-AutoEnrollCtlUsage";
+                                    else if (ENDS_WITH_1(19, 2))     return "Ms-EnrollCerttypeExtension";
+                                }
+                                else if (STARTS_WITH_2(16, 21)) /* CertSrv Infrastructure - 1.3.6.1.4.1.311.21 */
+                                {
+                                         if (ENDS_WITH_1(19, 1))     return "Ms-CaKeyCertIndexPair";
+                                    else if (ENDS_WITH_1(19, 2))     return "Ms-CertSrvPreviousCertHash";
+                                    else if (ENDS_WITH_1(19, 3))     return "Ms-CrlVirtualBase";
+                                    else if (ENDS_WITH_1(19, 4))     return "Ms-CrlNextPublish";
+                                    else if (ENDS_WITH_1(19, 6))     return "Ms-KeyRecovery";
+                                    else if (ENDS_WITH_1(19, 7))     return "Ms-CertificateTemplate";
+                                    else if (ENDS_WITH_1(19, 9))     return "Ms-DummySigner";
+                                }
+                            }
+                        }
+                    }
+                    else if (STARTS_WITH_1(8, 5))   /* Security - 1.3.6.1.5. */
+                    {
+                        if (STARTS_WITH_1(10, 5))       /* Mechanisms - 1.3.6.1.5.5. */
+                        {
+                            if (STARTS_WITH_1(12, 7))       /* Public-Key Infrastructure (X.509) - 1.3.6.1.5.5.7. */
+                            {
+                                if (STARTS_WITH_1(14, 1))        /* Private Extension - 1.3.6.1.5.5.7.1. */
+                                {
+                                         if (ENDS_WITH_1(16, 1))    return "pkix-AuthorityInfoAccess";
+                                    else if (ENDS_WITH_2(16, 12))   return "pkix-LogoType";
+                                }
+                                else if (STARTS_WITH_1(14, 2))   /* Private Extension - 1.3.6.1.5.5.7.2. */
+                                {
+                                         if (ENDS_WITH_1(16, 1))    return "id-qt-CPS";
+                                    else if (ENDS_WITH_1(16, 2))    return "id-qt-UNotice";
+                                    else if (ENDS_WITH_1(16, 3))    return "id-qt-TextNotice";
+                                    else if (ENDS_WITH_1(16, 4))    return "id-qt-ACPS";
+                                    else if (ENDS_WITH_1(16, 5))    return "id-qt-ACUNotice";
+                                }
+                                else if (STARTS_WITH_1(14, 3))   /* Private Extension - 1.3.6.1.5.5.7.3. */
+                                {
+                                         if (ENDS_WITH_1(16,  1))   return "id-kp-ServerAuth";
+                                    else if (ENDS_WITH_1(16,  2))   return "id-kp-ClientAuth";
+                                    else if (ENDS_WITH_1(16,  3))   return "id-kp-CodeSigning";
+                                    else if (ENDS_WITH_1(16,  4))   return "id-kp-EmailProtection";
+                                    else if (ENDS_WITH_1(16,  5))   return "id-kp-IPSecEndSystem";
+                                    else if (ENDS_WITH_1(16,  6))   return "id-kp-IPSecTunnel";
+                                    else if (ENDS_WITH_1(16,  7))   return "id-kp-IPSecUser";
+                                    else if (ENDS_WITH_1(16,  8))   return "id-kp-Timestamping";
+                                    else if (ENDS_WITH_1(16,  9))   return "id-kp-OCSPSigning";
+                                    else if (ENDS_WITH_2(16, 10))   return "id-kp-DVCS";
+                                    else if (ENDS_WITH_2(16, 11))   return "id-kp-SBGPCertAAServiceAuth";
+                                    else if (ENDS_WITH_2(16, 13))   return "id-kp-EAPOverPPP";
+                                    else if (ENDS_WITH_2(16, 14))   return "id-kp-EAPOverLAN";
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            else if (STARTS_WITH_2(4, 14))  /* 1.3.14. */
+            {
+                if (STARTS_WITH_1(7, 3))        /* OIW Security Special Interest Group - 1.3.14.3. */
+                {
+                    if (STARTS_WITH_1(9, 2))        /* OIW SSIG algorithms - 1.3.14.3.2. */
+                    {
+                             if (ENDS_WITH_1(11, 2))     return "oiw-ssig-Md4WithRsa";
+                        else if (ENDS_WITH_1(11, 3))     return "oiw-ssig-Md5WithRsa";
+                        else if (ENDS_WITH_1(11, 4))     return "oiw-ssig-Md4WithRsaEncryption";
+                        else if (ENDS_WITH_2(11, 15))    return "oiw-ssig-ShaWithRsaEncryption";
+                        else if (ENDS_WITH_2(11, 24))    return "oiw-ssig-Md2WithRsaEncryption";
+                        else if (ENDS_WITH_2(11, 25))    return "oiw-ssig-Md5WithRsaEncryption";
+                        else if (ENDS_WITH_2(11, 26))    return "oiw-ssig-Sha1";
+                        else if (ENDS_WITH_2(11, 29))    return "oiw-ssig-Sha1WithRsaEncryption";
+                    }
+                }
+            }
+        }
+    }
+    else if (STARTS_WITH_1(0, 2))  /* Joint ISO/ITU-T assigned - top level 2.*/
+    {
+        if (STARTS_WITH_1(2, 1))        /* ASN.1 - 2.1. */
+        {
+        }
+        else if (STARTS_WITH_1(2, 5))   /* Directory (X.500) - 2.5. */
+        {
+            if (STARTS_WITH_1(4, 4))        /* X.500 Attribute types - 2.5.4. */
+            {
+                     if (ENDS_WITH_1(6, 3))     return "x500-CommonName";
+                else if (ENDS_WITH_1(6, 6))     return "x500-CountryName";
+                else if (ENDS_WITH_1(6, 7))     return "x500-LocalityName";
+                else if (ENDS_WITH_1(6, 8))     return "x500-StatOrProvinceName";
+                else if (ENDS_WITH_2(6, 10))    return "x500-OrganizationName";
+                else if (ENDS_WITH_2(6, 11))    return "x500-OrganizationUnitName";
+            }
+            else if (STARTS_WITH_2(4, 29))  /* certificateExtension (id-ce) - 2.5.29. */
+            {
+                     if (ENDS_WITH_1(7, 1))     return "id-ce-AuthorityKeyIdentifier-Deprecated";
+                else if (ENDS_WITH_1(7, 2))     return "id-ce-KeyAttributes-Deprecated";
+                else if (ENDS_WITH_1(7, 3))     return "id-ce-CertificatePolicies-Deprecated";
+                else if (ENDS_WITH_1(7, 4))     return "id-ce-KeyUsageRestriction-Deprecated";
+                else if (ENDS_WITH_1(7, 7))     return "id-ce-SubjectAltName-Deprecated";
+                else if (ENDS_WITH_1(7, 8))     return "id-ce-IssuerAltName-Deprecated";
+                else if (ENDS_WITH_2(7, 14))    return "id-ce-SubjectKeyIdentifier";
+                else if (ENDS_WITH_2(7, 15))    return "id-ce-KeyUsage";
+                else if (ENDS_WITH_2(7, 16))    return "id-ce-PrivateKeyUsagePeriod";
+                else if (ENDS_WITH_2(7, 17))    return "id-ce-SubjectAltName";
+                else if (ENDS_WITH_2(7, 18))    return "id-ce-issuerAltName";
+                else if (ENDS_WITH_2(7, 19))    return "id-ce-BasicConstraints";
+                else if (ENDS_WITH_2(7, 25))    return "id-ce-CrlDistributionPoints";
+                else if (ENDS_WITH_2(7, 29))    return "id-ce-CertificateIssuer";
+                else if (ENDS_WITH_2(7, 30))    return "id-ce-NameConstraints";
+                else if (ENDS_WITH_2(7, 31))    return "id-ce-CrlDistributionPoints";
+                else if (ENDS_WITH_2(7, 32))    return "id-ce-CertificatePolicies";
+                else if (STARTS_WITH_2(7, 32))
+                {
+                    if (ENDS_WITH_1(10, 0))         return "id-ce-cp-anyPolicy";
+                }
+                else if (ENDS_WITH_2(7, 35))    return "id-ce-AuthorityKeyIdentifier";
+                else if (ENDS_WITH_2(7, 36))    return "id-ce-PolicyConstraints";
+                else if (ENDS_WITH_2(7, 37))    return "id-ce-ExtKeyUsage";
+            }
+        }
+        else if (STARTS_WITH_2(2, 16))  /* Join assignments by country - 2.16. */
+        {
+            if (0)
+            {
+            }
+            else if (STARTS_WITH_3(5, 840)) /* USA - 2.16.840. */
+            {
+                if (STARTS_WITH_1(9, 1))        /* US company arc. */
+                {
+                    if (STARTS_WITH_3(11, 101))     /* US Government */
+                    {
+                        if (STARTS_WITH_1(15, 3))       /* Computer Security Objects Register */
+                        {
+                            if (STARTS_WITH_1(17, 4))       /* NIST Algorithms - 2.16.840.1.101.3.4. */
+                            {
+                                if (STARTS_WITH_1(19, 1))       /* AES - 2.16.840.1.101.3.4.1. */
+                                {
+                                }
+                                else if (STARTS_WITH_1(19, 2))  /* Hash algorithms - 2.16.840.1.101.3.4.2. */
+                                {
+                                         if (ENDS_WITH_1(21, 1))    return "nist-Sha256";
+                                    else if (ENDS_WITH_1(21, 2))    return "nist-Sha384";
+                                    else if (ENDS_WITH_1(21, 3))    return "nist-Sha512";
+                                    else if (ENDS_WITH_1(21, 4))    return "nist-Sha224";
+                                }
+                            }
+                        }
+                    }
+                    else if (STARTS_WITH_6(11, 113730)) /* Netscape - 2.16.840.1.113730. */
+                    {
+                        if (STARTS_WITH_1(18, 1))           /* Netscape - 2.16.840.1.113730.1. */
+                        {
+                                 if (ENDS_WITH_1(20, 1))    return "netscape-cert-type";
+                            else if (ENDS_WITH_1(20, 2))    return "netscape-base-url";
+                            else if (ENDS_WITH_1(20, 3))    return "netscape-revocation-url";
+                            else if (ENDS_WITH_1(20, 4))    return "netscape-ca-revocation-url";
+                            else if (ENDS_WITH_1(20, 7))    return "netscape-cert-renewal-url";
+                            else if (ENDS_WITH_1(20, 8))    return "netscape-ca-policy-url";
+                            else if (ENDS_WITH_1(20, 9))    return "netscape-HomePage-url";
+                            else if (ENDS_WITH_2(20, 10))   return "netscape-EntityLogo";
+                            else if (ENDS_WITH_2(20, 11))   return "netscape-UserPicture";
+                            else if (ENDS_WITH_2(20, 12))   return "netscape-ssl-server-name";
+                            else if (ENDS_WITH_2(20, 13))   return "netscape-comment";
+                        }
+                        else if (STARTS_WITH_1(18, 4))      /* Netscape - 2.16.840.1.113730.4. */
+                        {
+                            if (ENDS_WITH_1(20, 1))    return "netscape-eku-serverGatedCrypto";
+                        }
+                    }
+                    else if (STARTS_WITH_6(11, 113733)) /* Verisign, Inc. - 2.16.840.1.113733. */
+                    {
+                        if (STARTS_WITH_1(18, 1))           /* Verisign PKI Sub Tree - 2.16.840.1.113733.1. */
+                        {
+                                 if (ENDS_WITH_1(20, 6))    return "verisign-pki-extensions-subtree";
+                            else if (STARTS_WITH_1(20, 6))      /* 2.16.840.1.113733.1.6. */
+                            {
+                                if (ENDS_WITH_1(22, 7))         return "verisign-pki-ext-RolloverID";
+                            }
+                            else if (ENDS_WITH_1(20, 7))    return "verisign-pki-policies";
+                            else if (STARTS_WITH_1(20, 7))      /* 2.16.840.1.113733.1.7. */
+                            {
+                                     if (ENDS_WITH_1(22, 9))    return "verisign-pki-policy-9";
+                                else if (ENDS_WITH_2(22, 21))   return "verisign-pki-policy-21";
+                                else if (ENDS_WITH_2(22, 23))   return "verisign-pki-policy-vtn-cp";
+                                else if (STARTS_WITH_2(22, 23))
+                                {
+                                         if (ENDS_WITH_1(25, 1))    return "verisign-pki-policy-vtn-cp-class1";
+                                    else if (ENDS_WITH_1(25, 2))    return "verisign-pki-policy-vtn-cp-class2";
+                                    else if (ENDS_WITH_1(25, 3))    return "verisign-pki-policy-vtn-cp-class3";
+                                    else if (ENDS_WITH_1(25, 4))    return "verisign-pki-policy-vtn-cp-class4";
+                                    else if (ENDS_WITH_1(25, 6))    return "verisign-pki-policy-vtn-cp-6";
+                                }
+                            }
+                            else if (STARTS_WITH_1(20, 8))      /* 2.16.840.1.113733.1.8. */
+                            {
+                                if (ENDS_WITH_1(22, 1))     return "verisign-pki-eku-IssStrongCrypto";
+                            }
+                            else if (ENDS_WITH_2(22, 46))   return "verisign-pki-policy-cis";
+                            else if (STARTS_WITH_2(22, 46))
+                            {
+                                     if (ENDS_WITH_1(25, 1))    return "verisign-pki-policy-cis-type1";
+                                else if (ENDS_WITH_1(25, 2))    return "verisign-pki-policy-cis-type2";
+                            }
+                            else if (ENDS_WITH_2(22, 48))   return "verisign-pki-policy-thawte";
+                            else if (STARTS_WITH_2(22, 48))
+                            {
+                                if (ENDS_WITH_1(25, 1))         return "verisign-pki-policy-thawte-cps-1";
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+
+/**
+ * Dumps the type and value of an universal ASN.1 type.
+ *
+ * @returns True if it opens a child, false if not.
+ * @param   pData               The dumper data.
+ * @param   pAsn1Core           The ASN.1 object to dump.
+ * @param   uDepth              The current depth (for indentation).
+ */
+static bool rtAsn1DumpUniversalTypeAndValue(PRTASN1DUMPDATA pData, PCRTASN1CORE pAsn1Core, uint32_t uDepth)
+{
+    const char *pszValuePrefix = "-- value:";
+    const char *pszDefault = "";
+    if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+    {
+        pszValuePrefix = "DEFAULT";
+        pszDefault = "DEFAULT ";
+    }
+
+    bool fOpen = false;
+    switch (pAsn1Core->uRealTag)
+    {
+        case ASN1_TAG_BOOLEAN:
+            if (pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT)
+                rtAsn1DumpPrintf(pData, "BOOLEAN %s %RTbool\n", pszValuePrefix, ((PCRTASN1BOOLEAN)pAsn1Core)->fValue);
+            else if (pAsn1Core->cb == 1 && pAsn1Core->uData.pu8)
+                rtAsn1DumpPrintf(pData, "BOOLEAN %s %u\n", pszValuePrefix, *pAsn1Core->uData.pu8);
+            else
+                rtAsn1DumpPrintf(pData, "BOOLEAN -- cb=%u\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_INTEGER:
+            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT) && pAsn1Core->cb <= 8)
+                rtAsn1DumpPrintf(pData, "INTEGER %s %llu / %#llx\n", pszValuePrefix,
+                                 ((PCRTASN1INTEGER)pAsn1Core)->uValue, ((PCRTASN1INTEGER)pAsn1Core)->uValue);
+            else if (pAsn1Core->cb == 0 || pAsn1Core->cb >= 512 || !pAsn1Core->uData.pu8)
+                rtAsn1DumpPrintf(pData, "INTEGER -- cb=%u\n", pAsn1Core->cb);
+            else if (pAsn1Core->cb <= 32)
+                rtAsn1DumpPrintf(pData, "INTEGER %s %.*Rhxs\n", pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
+            else
+                rtAsn1DumpPrintf(pData, "INTEGER %s\n%.*Rhxd\n", pszValuePrefix, (size_t)pAsn1Core->cb, pAsn1Core->uData.pu8);
+            break;
+
+        case ASN1_TAG_BIT_STRING:
+            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+            {
+                PCRTASN1BITSTRING pBitString = (PCRTASN1BITSTRING)pAsn1Core;
+                rtAsn1DumpPrintf(pData, "BIT STRING %s-- cb=%u cBits=%#x cMaxBits=%#x",
+                                 pszDefault, pBitString->Asn1Core.cb, pBitString->cBits, pBitString->cMaxBits);
+                if (pBitString->cBits <= 64)
+                    rtAsn1DumpPrintf(pData, " value=%#llx\n", RTAsn1BitString_GetAsUInt64(pBitString));
+                else
+                    rtAsn1DumpPrintf(pData, "\n");
+            }
+            else
+                rtAsn1DumpPrintf(pData, "BIT STRING %s-- cb=%u\n", pszDefault, pAsn1Core->cb);
+            fOpen = pAsn1Core->pOps != NULL;
+            break;
+
+        case ASN1_TAG_OCTET_STRING:
+            rtAsn1DumpPrintf(pData, "OCTET STRING %s-- cb=%u\n", pszDefault, pAsn1Core->cb);
+            fOpen = pAsn1Core->pOps != NULL;
+            break;
+
+        case ASN1_TAG_NULL:
+            rtAsn1DumpPrintf(pData, "NULL\n");
+            break;
+
+        case ASN1_TAG_OID:
+            if ((pAsn1Core->fFlags & RTASN1CORE_F_PRIMITE_TAG_STRUCT))
+            {
+                const char *pszObjIdName = rtAsn1DumpLookupObjIdName(((PCRTASN1OBJID)pAsn1Core)->szObjId);
+                if (pszObjIdName)
+                    rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s%s ('%s')\n",
+                                     pszDefault, pszObjIdName, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
+                else
+                    rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s'%s'\n", pszDefault, ((PCRTASN1OBJID)pAsn1Core)->szObjId);
+            }
+            else
+                rtAsn1DumpPrintf(pData, "OBJECT IDENTIFIER %s -- cb=%u\n", pszDefault, pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_OBJECT_DESCRIPTOR:
+            rtAsn1DumpPrintf(pData, "OBJECT DESCRIPTOR -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_EXTERNAL:
+            rtAsn1DumpPrintf(pData, "EXTERNAL -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_REAL:
+            rtAsn1DumpPrintf(pData, "REAL -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_ENUMERATED:
+            rtAsn1DumpPrintf(pData, "ENUMERATED -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_EMBEDDED_PDV:
+            rtAsn1DumpPrintf(pData, "EMBEDDED PDV -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_UTF8_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "UTF8 STRING", uDepth);
+            break;
+
+        case ASN1_TAG_RELATIVE_OID:
+            rtAsn1DumpPrintf(pData, "RELATIVE OBJECT IDENTIFIER -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        case ASN1_TAG_SEQUENCE:
+            rtAsn1DumpPrintf(pData, "SEQUENCE -- cb=%u\n", pAsn1Core->cb);
+            fOpen = true;
+            break;
+        case ASN1_TAG_SET:
+            rtAsn1DumpPrintf(pData, "SET -- cb=%u\n", pAsn1Core->cb);
+            fOpen = true;
+            break;
+
+        case ASN1_TAG_NUMERIC_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "NUMERIC STRING", uDepth);
+            break;
+
+        case ASN1_TAG_PRINTABLE_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "PRINTABLE STRING", uDepth);
+            break;
+
+        case ASN1_TAG_T61_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "T61 STRING", uDepth);
+            break;
+
+        case ASN1_TAG_VIDEOTEX_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "VIDEOTEX STRING", uDepth);
+            break;
+
+        case ASN1_TAG_IA5_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "IA5 STRING", uDepth);
+            break;
+
+        case ASN1_TAG_GRAPHIC_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "GRAPHIC STRING", uDepth);
+            break;
+
+        case ASN1_TAG_VISIBLE_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "VISIBLE STRING", uDepth);
+            break;
+
+        case ASN1_TAG_GENERAL_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "GENERAL STRING", uDepth);
+            break;
+
+        case ASN1_TAG_UNIVERSAL_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "UNIVERSAL STRING", uDepth);
+            break;
+
+        case ASN1_TAG_BMP_STRING:
+            rtAsn1DumpString(pData, pAsn1Core, "BMP STRING", uDepth);
+            break;
+
+        case ASN1_TAG_UTC_TIME:
+            rtAsn1DumpTime(pData, pAsn1Core, "UTC TIME");
+            break;
+
+        case ASN1_TAG_GENERALIZED_TIME:
+            rtAsn1DumpTime(pData, pAsn1Core, "GENERALIZED TIME");
+            break;
+
+        case ASN1_TAG_CHARACTER_STRING:
+            rtAsn1DumpPrintf(pData, "CHARACTER STRING -- cb=%u TODO\n", pAsn1Core->cb);
+            break;
+
+        default:
+            rtAsn1DumpPrintf(pData, "[UNIVERSAL %u]\n", pAsn1Core->uTag);
+            break;
+    }
+    return fOpen;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENUMCALLBACK}  */
+static DECLCALLBACK(int) rtAsn1DumpEnumCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+    PRTASN1DUMPDATA pData = (PRTASN1DUMPDATA)pvUser;
+    if (!pAsn1Core->fFlags)
+        return VINF_SUCCESS;
+
+    bool fOpen = false;
+    rtAsn1DumpPrintIdent(pData, uDepth);
+    switch (pAsn1Core->fClass & ASN1_TAGCLASS_MASK)
+    {
+        case ASN1_TAGCLASS_UNIVERSAL:
+            rtAsn1DumpPrintf(pData, "%-16s ", pszName);
+            fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
+            break;
+
+        case ASN1_TAGCLASS_CONTEXT:
+            if ((pAsn1Core->fRealClass & ASN1_TAGCLASS_MASK) == ASN1_TAGCLASS_UNIVERSAL)
+            {
+                rtAsn1DumpPrintf(pData, "%-16s [%u] ", pszName, pAsn1Core->uTag);
+                fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
+            }
+            else
+            {
+                rtAsn1DumpPrintf(pData, "%-16s [%u]\n", pszName, pAsn1Core->uTag);
+                fOpen = true;
+            }
+            break;
+
+        case ASN1_TAGCLASS_APPLICATION:
+            if ((pAsn1Core->fRealClass & ASN1_TAGCLASS_MASK) == ASN1_TAGCLASS_UNIVERSAL)
+            {
+                rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u] ", pszName, pAsn1Core->uTag);
+                fOpen = rtAsn1DumpUniversalTypeAndValue(pData, pAsn1Core, uDepth);
+            }
+            else
+            {
+                rtAsn1DumpPrintf(pData, "%-16s [APPLICATION %u]\n", pszName, pAsn1Core->uTag);
+                fOpen = true;
+            }
+            break;
+
+        case ASN1_TAGCLASS_PRIVATE:
+            if (RTASN1CORE_IS_DUMMY(pAsn1Core))
+                rtAsn1DumpPrintf(pData, "%-16s DUMMY\n", pszName);
+            else
+            {
+                rtAsn1DumpPrintf(pData, "%-16s [PRIVATE %u]\n", pszName, pAsn1Core->uTag);
+                fOpen = true;
+            }
+            break;
+    }
+    /** @todo {} */
+
+    /*
+     * Recurse.
+     */
+    if (   pAsn1Core->pOps
+        && pAsn1Core->pOps->pfnEnum)
+        pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1DumpEnumCallback, uDepth, pData);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Dump(PCRTASN1CORE pAsn1Core, uint32_t fFlags, uint32_t uLevel, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+    if (   pAsn1Core->pOps
+        && pAsn1Core->pOps->pfnEnum)
+    {
+        RTASN1DUMPDATA Data;
+        Data.fFlags     = fFlags;
+        Data.pfnPrintfV = pfnPrintfV;
+        Data.pvUser     = pvUser;
+
+        return pAsn1Core->pOps->pfnEnum((PRTASN1CORE)pAsn1Core, rtAsn1DumpEnumCallback, uLevel, &Data);
+    }
+    return VINF_SUCCESS;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-encode.cpp b/src/VBox/Runtime/common/asn1/asn1-encode.cpp
new file mode 100644
index 0000000..554f87c
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-encode.cpp
@@ -0,0 +1,426 @@
+/* $Id: asn1-encode.cpp $ */
+/** @file
+ * IPRT - ASN.1, Encoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/assert.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Argument package for rtAsn1EncodePrepareCallback passed by RTAsn1EncodePrepare.
+ */
+typedef struct RTASN1ENCODEPREPARGS
+{
+    /** The size at this level. */
+    uint32_t        cb;
+    /** RTASN1ENCODE_F_XXX. */
+    uint32_t        fFlags;
+    /** Pointer to the error info. (optional) */
+    PRTERRINFO      pErrInfo;
+} RTASN1ENCODEPREPARGS;
+
+
+/**
+ * Argument package for rtAsn1EncodeWriteCallback passed by RTAsn1EncodeWrite.
+ */
+typedef struct RTASN1ENCODEWRITEARGS
+{
+    /** RTASN1ENCODE_F_XXX. */
+    uint32_t                fFlags;
+    /** Pointer to the writer funtion. */
+    PFNRTASN1ENCODEWRITER   pfnWriter;
+    /** User argument to the writer function. */
+    void                   *pvUser;
+    /** Pointer to the error info. (optional) */
+    PRTERRINFO              pErrInfo;
+} RTASN1ENCODEWRITEARGS;
+
+
+RTDECL(int) RTAsn1EncodeRecalcHdrSize(PRTASN1CORE pAsn1Core, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+    int rc = VINF_SUCCESS;
+
+    uint8_t cbHdr;
+    if ((pAsn1Core->fFlags & (RTASN1CORE_F_PRESENT | RTASN1CORE_F_DUMMY | RTASN1CORE_F_DEFAULT)) == RTASN1CORE_F_PRESENT)
+    {
+        /*
+         * The minimum header size is two bytes.
+         */
+        cbHdr = 2;
+
+        /*
+         * Add additional bytes for encoding the tag.
+         */
+        uint32_t uTag = pAsn1Core->uTag;
+        if (uTag >= ASN1_TAG_USE_LONG_FORM)
+        {
+            AssertReturn(pAsn1Core->uTag != UINT32_MAX, RTErrInfoSet(pErrInfo, VERR_ASN1_DUMMY_OBJECT, "uTag=UINT32_MAX"));
+            do
+            {
+                cbHdr++;
+                uTag >>= 7;
+            } while (uTag > 0);
+        }
+
+        /*
+         * Add additional bytes for encoding the content length.
+         */
+        uint32_t cb = pAsn1Core->cb;
+        if (cb >= 0x80)
+        {
+            AssertReturn(cb < _1G, RTErrInfoSetF(pErrInfo, VERR_ASN1_TOO_LONG, "cb=%u (%#x)", cb, cb));
+
+            if (cb <= UINT32_C(0xffff))
+            {
+                if (cb <= UINT32_C(0xff))
+                    cbHdr += 1;
+                else
+                    cbHdr += 2;
+            }
+            else
+            {
+                if (cb <= UINT32_C(0xffffff))
+                    cbHdr += 3;
+                else
+                    cbHdr += 4;
+            }
+        }
+    }
+    /*
+     * Not present, dummy or otherwise not encoded.
+     */
+    else
+    {
+        cbHdr = 0;
+        if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+            rc = VINF_ASN1_NOT_ENCODED;
+        else
+        {
+            Assert(RTASN1CORE_IS_DUMMY(pAsn1Core));
+            Assert(pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum);
+            rc = VINF_SUCCESS;
+        }
+    }
+
+    /*
+     * Update the header length.
+     */
+    pAsn1Core->cbHdr = cbHdr;
+    return rc;
+}
+
+
+/**
+ * @callback_method_impl{FNRTASN1ENUMCALLBACK}
+ */
+static DECLCALLBACK(int) rtAsn1EncodePrepareCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+    RTASN1ENCODEPREPARGS *pArgs = (RTASN1ENCODEPREPARGS *)pvUser;
+    if (RTASN1CORE_IS_PRESENT(pAsn1Core))
+    {
+        /*
+         * Depth first, where relevant.
+         */
+        uint32_t const cbSaved = pArgs->cb;
+        if (pAsn1Core->pOps)
+        {
+            /*
+             * Use the encoding preparation method when available.
+             */
+            int rc;
+            if (pAsn1Core->pOps->pfnEncodePrep)
+                rc = pAsn1Core->pOps->pfnEncodePrep(pAsn1Core, pArgs->fFlags, pArgs->pErrInfo);
+            else if (pAsn1Core->pOps->pfnEnum)
+            {
+                /*
+                 * Recurse to prepare the child objects (if any).
+                 */
+                rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1EncodePrepareCallback, uDepth + 1, pArgs);
+                if (RT_SUCCESS(rc))
+                    pAsn1Core->cb = pArgs->cb - cbSaved;
+            }
+            else
+            {
+                /*
+                 * Must be a primitive type if DER.
+                 */
+                if (   (pAsn1Core->fClass & ASN1_TAGFLAG_CONSTRUCTED)
+                    && (pArgs->fFlags & RTASN1ENCODE_F_DER) )
+                    return RTErrInfoSetF(pArgs->pErrInfo, VERR_ASN1_EXPECTED_PRIMITIVE,
+                                         "Expected primitive ASN.1 object: uTag=%#x fClass=%#x cb=%u",
+                                         RTASN1CORE_GET_TAG(pAsn1Core), pAsn1Core->fClass, pAsn1Core->cb);
+                rc = VINF_SUCCESS;
+            }
+            if (RT_SUCCESS(rc))
+                rc = RTAsn1EncodeRecalcHdrSize(pAsn1Core, pArgs->fFlags, pArgs->pErrInfo);
+            if (RT_FAILURE(rc))
+                return rc;
+        }
+        else
+        {
+            AssertFailed();
+            pAsn1Core->cb    = 0;
+            pAsn1Core->cbHdr = 0;
+        }
+
+        /*
+         * Recalculate the output size, thus far.  Dummy objects propagates the
+         * content size, but the header size is zero.  Other objects with
+         * header size zero are not encoded and should be omitted entirely.
+         */
+        if (pAsn1Core->cbHdr > 0 || RTASN1CORE_IS_DUMMY(pAsn1Core))
+            pArgs->cb = RTASN1CORE_GET_RAW_ASN1_SIZE(pAsn1Core) + cbSaved;
+        else
+            pArgs->cb = cbSaved;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1EncodePrepare(PRTASN1CORE pRoot, uint32_t fFlags, uint32_t *pcbEncoded, PRTERRINFO pErrInfo)
+{
+    AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+    /*
+     * This is implemented as a recursive enumeration of the ASN.1 object structure.
+     */
+    RTASN1ENCODEPREPARGS Args;
+    Args.cb       = 0;
+    Args.fFlags   = fFlags;
+    Args.pErrInfo = pErrInfo;
+    int rc = rtAsn1EncodePrepareCallback(pRoot, "root", 0, &Args);
+    if (pcbEncoded)
+        *pcbEncoded = RTASN1CORE_GET_RAW_ASN1_SIZE(pRoot);
+    return rc;
+}
+
+
+RTDECL(int) RTAsnEncodeWriteHeader(PCRTASN1CORE pAsn1Core, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+                                   PRTERRINFO pErrInfo)
+{
+    AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+    if ((pAsn1Core->fFlags & (RTASN1CORE_F_PRESENT | RTASN1CORE_F_DUMMY | RTASN1CORE_F_DEFAULT)) == RTASN1CORE_F_PRESENT)
+    {
+        uint8_t  abHdr[16];  /* 2 + max 5 tag + max 4 length = 11 */
+        uint8_t *pbDst = &abHdr[0];
+
+        /*
+         * Encode the tag.
+         */
+        uint32_t uTag = pAsn1Core->uTag;
+        if (uTag < ASN1_TAG_USE_LONG_FORM)
+            *pbDst++ = (uint8_t)uTag | (pAsn1Core->fClass & ~ASN1_TAG_MASK);
+        else
+        {
+            AssertReturn(pAsn1Core->uTag != UINT32_MAX, RTErrInfoSet(pErrInfo, VERR_ASN1_DUMMY_OBJECT, "uTag=UINT32_MAX"));
+
+            /* In the long form, the tag is encoded MSB style with the 8th bit
+               of each byte indicating the whether there are more byte. */
+            *pbDst++ = ASN1_TAG_USE_LONG_FORM | (pAsn1Core->fClass & ~ASN1_TAG_MASK);
+            if (uTag <= UINT32_C(0x7f))
+                *pbDst++ = uTag;
+            else if (uTag <= UINT32_C(0x3fff))  /* 2**(7*2) = 0x4000 (16384) */
+            {
+                *pbDst++ = (uTag >> 7) | 0x80;
+                *pbDst++ = uTag & 0x7f;
+            }
+            else if (uTag <= UINT32_C(0x1fffff)) /* 2**(7*3) = 0x200000 (2097152) */
+            {
+                *pbDst++ =  (uTag >> 14)         | 0x80;
+                *pbDst++ = ((uTag >>  7) & 0x7f) | 0x80;
+                *pbDst++ =   uTag        & 0x7f;
+            }
+            else if (uTag <= UINT32_C(0xfffffff)) /* 2**(7*4) = 0x10000000 (268435456) */
+            {
+                *pbDst++ =  (uTag >> 21)         | 0x80;
+                *pbDst++ = ((uTag >> 14) & 0x7f) | 0x80;
+                *pbDst++ = ((uTag >>  7) & 0x7f) | 0x80;
+                *pbDst++ =   uTag        & 0x7f;
+            }
+            else
+            {
+                *pbDst++ =  (uTag >> 28)         | 0x80;
+                *pbDst++ = ((uTag >> 21) & 0x7f) | 0x80;
+                *pbDst++ = ((uTag >> 14) & 0x7f) | 0x80;
+                *pbDst++ = ((uTag >>  7) & 0x7f) | 0x80;
+                *pbDst++ =   uTag        & 0x7f;
+            }
+        }
+
+        /*
+         * Encode the length.
+         */
+        uint32_t cb = pAsn1Core->cb;
+        if (cb < 0x80)
+            *pbDst++ = (uint8_t)cb;
+        else
+        {
+            AssertReturn(cb < _1G, RTErrInfoSetF(pErrInfo, VERR_ASN1_TOO_LONG, "cb=%u (%#x)", cb, cb));
+
+            if (cb <= UINT32_C(0xffff))
+            {
+                if (cb <= UINT32_C(0xff))
+                {
+                    pbDst[0] = 0x81;
+                    pbDst[1] = (uint8_t)cb;
+                    pbDst += 2;
+                }
+                else
+                {
+                    pbDst[0] = 0x82;
+                    pbDst[1] = cb >> 8;
+                    pbDst[2] = (uint8_t)cb;
+                    pbDst += 3;
+                }
+            }
+            else
+            {
+                if (cb <= UINT32_C(0xffffff))
+                {
+                    pbDst[0] = 0x83;
+                    pbDst[1] = (uint8_t)(cb >> 16);
+                    pbDst[2] = (uint8_t)(cb >> 8);
+                    pbDst[3] = (uint8_t)cb;
+                    pbDst += 4;
+                }
+                else
+                {
+                    pbDst[0] = 0x84;
+                    pbDst[1] = (uint8_t)(cb >> 24);
+                    pbDst[2] = (uint8_t)(cb >> 16);
+                    pbDst[3] = (uint8_t)(cb >> 8);
+                    pbDst[4] = (uint8_t)cb;
+                    pbDst += 5;
+                }
+            }
+        }
+
+        size_t const cbHdr = pbDst - &abHdr[0];
+        Assert(sizeof(abHdr) >= cbHdr);
+        Assert(pAsn1Core->cbHdr == cbHdr);
+
+        /*
+         * Write it.
+         */
+        return pfnWriter(abHdr, cbHdr, pvUser, pErrInfo);
+    }
+
+    /*
+     * Not present, dummy or otherwise not encoded.
+     */
+    Assert(pAsn1Core->cbHdr == 0);
+    if (pAsn1Core->fFlags & RTASN1CORE_F_DEFAULT)
+        return VINF_ASN1_NOT_ENCODED;
+    Assert(RTASN1CORE_IS_DUMMY(pAsn1Core));
+    Assert(pAsn1Core->pOps && pAsn1Core->pOps->pfnEnum);
+    return  VINF_SUCCESS;
+}
+
+
+/**
+ * @callback_method_impl{FNRTASN1ENUMCALLBACK}
+ */
+static DECLCALLBACK(int) rtAsn1EncodeWriteCallback(PRTASN1CORE pAsn1Core, const char *pszName, uint32_t uDepth, void *pvUser)
+{
+    RTASN1ENCODEWRITEARGS *pArgs = (RTASN1ENCODEWRITEARGS *)pvUser;
+    int rc;
+    if (RTASN1CORE_IS_PRESENT(pAsn1Core))
+    {
+        /*
+         * If there is an write method, use it.
+         */
+        if (   pAsn1Core->pOps
+            && pAsn1Core->pOps->pfnEncodeWrite)
+            rc = pAsn1Core->pOps->pfnEncodeWrite(pAsn1Core, pArgs->fFlags, pArgs->pfnWriter, pArgs->pvUser, pArgs->pErrInfo);
+        else
+        {
+            /*
+             * Generic path. Start by writing the header for this object.
+             */
+            rc = RTAsnEncodeWriteHeader(pAsn1Core, pArgs->fFlags, pArgs->pfnWriter, pArgs->pvUser, pArgs->pErrInfo);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * If there is an enum function, call it to assemble the content.
+                 * Otherwise ASSUME the pointer in the header points to the content.
+                 */
+                if (   pAsn1Core->pOps
+                    && pAsn1Core->pOps->pfnEnum)
+                {
+                    if (rc != VINF_ASN1_NOT_ENCODED)
+                        rc = pAsn1Core->pOps->pfnEnum(pAsn1Core, rtAsn1EncodeWriteCallback, uDepth + 1, pArgs);
+                }
+                else if (pAsn1Core->cb && rc != VINF_ASN1_NOT_ENCODED)
+                {
+                    Assert(!RTASN1CORE_IS_DUMMY(pAsn1Core));
+                    AssertPtrReturn(pAsn1Core->uData.pv,
+                                    RTErrInfoSetF(pArgs->pErrInfo, VERR_ASN1_INVALID_DATA_POINTER,
+                                                  "Invalid uData pointer %p for no pfnEnum object with %#x bytes of content",
+                                                  pAsn1Core->uData.pv, pAsn1Core->cb));
+                    rc = pArgs->pfnWriter(pAsn1Core->uData.pv, pAsn1Core->cb, pArgs->pvUser, pArgs->pErrInfo);
+                }
+            }
+        }
+        if (RT_SUCCESS(rc))
+            rc = VINF_SUCCESS;
+    }
+    else
+        rc = VINF_SUCCESS;
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1EncodeWrite(PCRTASN1CORE pRoot, uint32_t fFlags, FNRTASN1ENCODEWRITER pfnWriter, void *pvUser,
+                              PRTERRINFO pErrInfo)
+{
+    AssertReturn((fFlags & RTASN1ENCODE_F_RULE_MASK) == RTASN1ENCODE_F_DER, VERR_INVALID_FLAGS);
+
+    /*
+     * This is implemented as a recursive enumeration of the ASN.1 object structure.
+     */
+    RTASN1ENCODEWRITEARGS Args;
+    Args.fFlags     = fFlags;
+    Args.pfnWriter  = pfnWriter;
+    Args.pvUser     = pvUser;
+    Args.pErrInfo   = pErrInfo;
+    return rtAsn1EncodeWriteCallback((PRTASN1CORE)pRoot, "root", 0, &Args);
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp
new file mode 100644
index 0000000..b82c347
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-decode.cpp
@@ -0,0 +1,130 @@
+/* $Id: asn1-ut-bitstring-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, BIT STRING Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1Ex(PRTASN1CURSOR pCursor, uint32_t fFlags, uint32_t cMaxBits, PRTASN1BITSTRING pThis,
+                                         const char *pszErrorTag)
+{
+    pThis->cBits         = 0;
+    pThis->cMaxBits      = cMaxBits;
+    pThis->uBits.pv      = NULL;
+    pThis->pEncapsulated = NULL;
+    RTAsn1CursorInitAllocation(pCursor, &pThis->EncapsulatedAllocation);
+
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, ASN1_TAG_BIT_STRING,
+                                                  ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                                  fFlags, pszErrorTag, "BIT STRING");
+        if (RT_SUCCESS(rc))
+        {
+            if (!(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED))
+            {
+                if (   (    cMaxBits == UINT32_MAX
+                        || RT_ALIGN(cMaxBits, 8) / 8 + 1 >= pThis->Asn1Core.cb)
+                    && pThis->Asn1Core.cb > 0)
+                {
+                    uint8_t cUnusedBits = pThis->Asn1Core.cb > 0 ? *pThis->Asn1Core.uData.pu8 : 0;
+                    if (pThis->Asn1Core.cb < 2)
+                    {
+                        /* Not bits present. */
+                        if (cUnusedBits == 0)
+                        {
+                            pThis->cBits    = 0;
+                            pThis->uBits.pv = NULL;
+                            RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                            pThis->Asn1Core.pOps = &g_RTAsn1BitString_Vtable;
+                            pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                            return VINF_SUCCESS;
+                        }
+                        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+                                                 "%s: Bad unused bit count: %#x (cb=%#x)",
+                                                 pszErrorTag, cUnusedBits, pThis->Asn1Core.cb);
+                    }
+                    else if (cUnusedBits < 8)
+                    {
+                        pThis->cBits  = (pThis->Asn1Core.cb - 1) * 8;
+                        pThis->cBits -= cUnusedBits;
+                        pThis->uBits.pu8 = pThis->Asn1Core.uData.pu8 + 1;
+                        if (   !(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER))
+                            || cUnusedBits == 0
+                            || !( pThis->uBits.pu8[pThis->Asn1Core.cb - 2] & (((uint8_t)1 << cUnusedBits) - (uint8_t)1) ) )
+                        {
+                            RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                            pThis->Asn1Core.pOps = &g_RTAsn1BitString_Vtable;
+                            pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                            return VINF_SUCCESS;
+                        }
+                        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+                                                 "%s: Unused bits shall be zero in DER/CER mode: last byte=%#x cUnused=%#x",
+                                                 pszErrorTag, pThis->uBits.pu8[pThis->cBits / 8], cUnusedBits);
+                    }
+                    else
+                        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+                                                 "%s: Bad unused bit count: %#x (cb=%#x)",
+                                                 pszErrorTag, cUnusedBits, pThis->Asn1Core.cb);
+                }
+                else
+                    rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BITSTRING_ENCODING,
+                                             "%s: Size mismatch: cb=%#x, expected %#x (cMaxBits=%#x)",
+                                             pszErrorTag, pThis->Asn1Core.cb,  RT_ALIGN(cMaxBits, 8) / 8 + 1, cMaxBits);
+            }
+            else
+                rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+                                         "%s: Constructed BIT STRING not implemented.", pszErrorTag);
+        }
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1BitString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BITSTRING pThis, const char *pszErrorTag)
+{
+    return RTAsn1BitString_DecodeAsn1Ex(pCursor, fFlags, UINT32_MAX, pThis, pszErrorTag);
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-bitstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h
index 35b6d89..b5971d4 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-bitstring-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, Bit String Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFBITSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfBitStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfBitStrings
+RTASN1TMPL_SEQ_OF(RTASN1BITSTRING, RTAsn1BitString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFBITSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfBitStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfBitStrings
+RTASN1TMPL_SET_OF(RTASN1BITSTRING, RTAsn1BitString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp
new file mode 100644
index 0000000..5e16466
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-bitstring.cpp
@@ -0,0 +1,516 @@
+/* $Id: asn1-ut-bitstring.cpp $ */
+/** @file
+ * IPRT - ASN.1, Bit String Type.
+ *
+ * @remarks This file should remain very similar to asn1-ut-octetstring.cpp.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+typedef struct RTASN1BITSTRINGWRITERCTX
+{
+    /** Pointer to the output buffer. */
+    uint8_t        *pbBuf;
+    /** The current buffer offset. */
+    uint32_t        offBuf;
+    /** The size of the buffer. */
+    uint32_t        cbBuf;
+} RTASN1BITSTRINGWRITERCTX;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ *  Used to refresh the content of octet and bit strings. } */
+static DECLCALLBACK(int) rtAsn1BitStringEncodeWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+    RTASN1BITSTRINGWRITERCTX *pCtx = (RTASN1BITSTRINGWRITERCTX *)pvUser;
+    AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf,
+                 RTErrInfoSetF(pErrInfo, VERR_BUFFER_OVERFLOW,
+                               "cbToWrite=%#x offBuf=%#x cbBuf=%#x", cbToWrite, pCtx->cbBuf, pCtx->offBuf));
+    memcpy(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite);
+    pCtx->offBuf += (uint32_t)cbToWrite;
+    return VINF_SUCCESS;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ *  Used to compare the encoded raw content of an octet or bit string with the
+ *  encapsulated object. } */
+static DECLCALLBACK(int) rtAsn1BitStringEncodeCompare(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+    RTASN1BITSTRINGWRITERCTX *pCtx = (RTASN1BITSTRINGWRITERCTX *)pvUser;
+    AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf, VERR_BUFFER_OVERFLOW);
+    if (!memcmp(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite) != 0)
+        return VERR_NOT_EQUAL;
+    pCtx->offBuf += (uint32_t)cbToWrite;
+    return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 BIT STRING - Special Methods.
+ */
+
+RTDECL(uint64_t) RTAsn1BitString_GetAsUInt64(PCRTASN1BITSTRING pThis)
+{
+    /*
+     * Extract the first 64 bits in host order.
+     */
+    uint8_t const  *pb     = pThis->uBits.pu8;
+    uint64_t        uRet   = 0;
+    uint32_t        cShift = 0;
+    uint32_t        cBits  = RT_MIN(pThis->cBits, 64);
+    while (cBits > 0)
+    {
+        uint8_t b = *pb++;
+#if 1 /* We don't have a bit-order constant... */
+        b = ((b & 0x01) << 7)
+          | ((b & 0x02) << 5)
+          | ((b & 0x04) << 3)
+          | ((b & 0x08) << 1)
+          | ((b & 0x10) >> 1)
+          | ((b & 0x20) >> 3)
+          | ((b & 0x40) >> 5)
+          | ((b & 0x80) >> 7);
+#endif
+        if (cBits < 8)
+        {
+            b &= RT_BIT_32(cBits) - 1;
+            uRet |= (uint64_t)b << cShift;
+            break;
+        }
+        uRet   |= (uint64_t)b << cShift;
+        cShift += 8;
+        cBits  -= 8;
+    }
+
+    return uRet;
+}
+
+
+RTDECL(int) RTAsn1BitString_RefreshContent(PRTASN1BITSTRING pThis, uint32_t fFlags,
+                                           PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+    AssertReturn(pThis->pEncapsulated, VERR_INVALID_STATE);
+
+    uint32_t cbEncoded;
+    int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->Asn1Core.cb = 1 + cbEncoded;
+        pThis->cBits       = cbEncoded * 8;
+        AssertReturn(pThis->cBits / 8 == cbEncoded, RTErrInfoSetF(pErrInfo, VERR_TOO_MUCH_DATA, "cbEncoded=%#x", cbEncoded));
+
+        rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cbEncoded + 1, pAllocator);
+        if (RT_SUCCESS(rc))
+        {
+            pThis->uBits.pu8 = pThis->Asn1Core.uData.pu8 + 1;
+
+            /* Initialize the writer context and write the first byte concerning unused bits. */
+            RTASN1BITSTRINGWRITERCTX Ctx;
+            Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+            Ctx.cbBuf  = cbEncoded + 1;
+            Ctx.offBuf = 1;
+            *Ctx.pbBuf = 0;
+
+            rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeWriter, &Ctx, pErrInfo);
+            if (RT_SUCCESS(rc))
+            {
+                if (Ctx.offBuf == cbEncoded + 1)
+                    return VINF_SUCCESS;
+
+                rc = RTErrInfoSetF(pErrInfo, rc, "Expected %#x + 1 bytes, got %#x", cbEncoded, Ctx.offBuf);
+            }
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, rc, "Error allocating %#x + 1 bytes for storing content\n", cbEncoded);
+    }
+    return rc;
+}
+
+
+RTDECL(bool) RTAsn1BitString_AreContentBitsValid(PCRTASN1BITSTRING pThis, uint32_t fFlags)
+{
+    if (pThis->pEncapsulated)
+    {
+        if (pThis->cBits & 7)
+            return false;
+
+        /* Check the encoded length of the bits. */
+        uint32_t cbEncoded;
+        int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, NULL);
+        if (RT_FAILURE(rc))
+            return false;
+        if (pThis->Asn1Core.cb != 1 + cbEncoded)
+            return false;
+
+        /* Check the encoded bits, if there are any. */
+        if (cbEncoded)
+        {
+            if (!pThis->Asn1Core.uData.pv)
+                return false;
+
+            /* Check the first byte, the unused bit count. */
+            if (*pThis->Asn1Core.uData.pu8 != 0)
+                return false;
+
+            /* Check the other bytes. */
+            RTASN1BITSTRINGWRITERCTX Ctx;
+            Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+            Ctx.cbBuf  = cbEncoded + 1;
+            Ctx.offBuf = 1;
+            rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeCompare, &Ctx, NULL);
+            if (RT_FAILURE(rc))
+                return false;
+        }
+    }
+    return true;
+}
+
+
+
+
+/*
+ * ASN.1 BIT STRING - Standard Methods.
+ */
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEPREP} */
+static DECLCALLBACK(int) RTAsn1BitString_EncodePrep(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    PRTASN1BITSTRING pThis = (PRTASN1BITSTRING)pThisCore;
+    if (!pThis->pEncapsulated)
+    {
+        Assert(pThis->cBits == 0 || pThis->Asn1Core.uData.pv);
+        return VINF_SUCCESS;
+    }
+
+    /* Figure out the size of the encapsulated content. */
+    uint32_t cbEncoded;
+    int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        /* Free the bytes if they don't match up.  */
+        if (pThis->Asn1Core.uData.pv)
+        {
+            bool fMustFree = pThis->Asn1Core.cb != 1 + cbEncoded || (pThis->cBits & 7);
+            if (!fMustFree)
+            {
+                RTASN1BITSTRINGWRITERCTX Ctx;
+                Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+                Ctx.cbBuf  = 1 + cbEncoded;
+                Ctx.offBuf = 1;
+                fMustFree  = *Ctx.pbBuf != 0;
+                if (!fMustFree)
+                {
+                    rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1BitStringEncodeCompare, &Ctx, NULL);
+                    fMustFree = RT_FAILURE_NP(rc);
+                }
+            }
+            if (fMustFree)
+            {
+                pThis->uBits.pv = NULL;
+                RTAsn1ContentFree(&pThis->Asn1Core);
+            }
+        }
+        pThis->Asn1Core.cb = 1 + cbEncoded;
+        pThis->cBits       = cbEncoded * 8;
+
+        rc = RTAsn1EncodeRecalcHdrSize(&pThis->Asn1Core, fFlags, pErrInfo);
+    }
+    return rc;
+}
+
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEWRITE} */
+static DECLCALLBACK(int) RTAsn1BitString_EncodeWrite(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+                                                     void *pvUser, PRTERRINFO pErrInfo)
+{
+    PRTASN1BITSTRING pThis = (PRTASN1BITSTRING)pThisCore;
+
+    AssertReturn(RT_ALIGN(pThis->cBits, 7) / 8 + 1 == pThis->Asn1Core.cb, VERR_INTERNAL_ERROR_3);
+
+    /*
+     * First the header.
+     */
+    int rc = RTAsnEncodeWriteHeader(&pThis->Asn1Core, fFlags, pfnWriter, pvUser, pErrInfo);
+    if (RT_SUCCESS(rc) && rc != VINF_ASN1_NOT_ENCODED)
+    {
+        /*
+         * The content starts with an unused bit count. Calculate it in case we
+         * need to write it out.
+         */
+        uint8_t cUnusedBits = 0;
+        if ((pThis->cBits & 7) != 0)
+            cUnusedBits = 8 - (pThis->cBits & 7);
+
+        /*
+         * If nothing is encapsulated, the core points to the content (if we have any).
+         */
+        if (!pThis->pEncapsulated)
+        {
+            if (pThis->cBits > 0)
+            {
+                Assert(pThis->Asn1Core.uData.pu8[0] == cUnusedBits);
+                rc = pfnWriter(pThis->Asn1Core.uData.pu8, pThis->Asn1Core.cb, pvUser, pErrInfo);
+            }
+            else
+                rc = pfnWriter(&cUnusedBits, sizeof(cUnusedBits), pvUser, pErrInfo);
+        }
+        /*
+         * Write the unused bit count and then call upon the encapsulated
+         * content to serialize itself.
+         */
+        else
+        {
+            rc = pfnWriter(&cUnusedBits, sizeof(cUnusedBits), pvUser, pErrInfo);
+            if (RT_SUCCESS(rc))
+                rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, pfnWriter, pvUser, pErrInfo);
+        }
+    }
+    return rc;
+}
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1BitString_Vtable =
+{
+    "RTAsn1BitString",
+    sizeof(RTASN1BITSTRING),
+    ASN1_TAG_BIT_STRING,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1BitString_Delete,
+    (PFNRTASN1COREVTENUM)RTAsn1BitString_Enum,
+    (PFNRTASN1COREVTCLONE)RTAsn1BitString_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1BitString_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1BitString_CheckSanity,
+    RTAsn1BitString_EncodePrep,
+    RTAsn1BitString_EncodeWrite
+};
+
+
+RTDECL(int) RTAsn1BitString_Init(PRTASN1BITSTRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RT_ZERO(*pThis);
+
+    RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BIT_STRING, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1BitString_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    /*pThis->cBits = 0;
+    pThis->cMaxBits = 0;
+    pThis->uBits.pv = NULL;
+    pThis->pEncapsulated = NULL; */
+    RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1BitString_Clone(PRTASN1BITSTRING pThis, PCRTASN1BITSTRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+
+    RT_ZERO(*pThis);
+    if (RTAsn1BitString_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1BitString_Vtable, VERR_INTERNAL_ERROR_3);
+
+        int rc;
+        if (!pSrc->pEncapsulated)
+            rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+        else
+            rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+        if (RT_FAILURE(rc))
+            return rc;
+
+        RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+        pThis->cBits    = pSrc->cBits;
+        pThis->cMaxBits = pSrc->cMaxBits;
+        if (!pSrc->pEncapsulated)
+            pThis->uBits.pv = pThis->Asn1Core.uData.pu8 ? pThis->Asn1Core.uData.pu8 + 1 : NULL;
+        else
+        {
+            PCRTASN1COREVTABLE pOps = pSrc->pEncapsulated->pOps;
+            Assert(!pOps || pOps->pfnClone);
+            if (pOps && pOps->pfnClone)
+            {
+                /* We can clone the decoded encapsulated object. */
+                rc = RTAsn1MemAllocZ(&pThis->EncapsulatedAllocation, (void **)&pThis->pEncapsulated, pOps->cbStruct);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = pOps->pfnClone(pThis->pEncapsulated, pSrc->pEncapsulated, pAllocator);
+                    if (RT_FAILURE(rc))
+                        RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+                }
+            }
+            else
+            {
+                /* Borrow the encapsulated pointer and use RTAsn1BitString_RefreshContent
+                   to get an accurate copy of the bytes. */
+                pThis->pEncapsulated = pSrc->pEncapsulated;
+                rc = RTAsn1BitString_RefreshContent(pThis, RTASN1ENCODE_F_DER, pAllocator, NULL);
+                pThis->pEncapsulated = NULL;
+            }
+            if (RT_FAILURE(rc))
+            {
+                RTAsn1ContentFree(&pThis->Asn1Core);
+                RT_ZERO(*pThis);
+                return rc;
+            }
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1BitString_Delete(PRTASN1BITSTRING pThis)
+{
+    if (   pThis
+        && RTAsn1BitString_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1BitString_Vtable);
+
+        /* Destroy the encapsulated object. */
+        if (pThis->pEncapsulated)
+        {
+            RTAsn1VtDelete(pThis->pEncapsulated);
+            if (pThis->EncapsulatedAllocation.cbAllocated)
+                RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+        }
+
+        /* Delete content and wipe the content. */
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1BitString_Enum(PRTASN1BITSTRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1BitString_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1BitString_Vtable));
+
+    /* Enumerate the encapsulated object if present. */
+    if (pThis->pEncapsulated)
+        return pfnCallback(pThis->pEncapsulated, "Encapsulated", uDepth + 1, pvUser);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1BitString_Compare(PCRTASN1BITSTRING pLeft, PCRTASN1BITSTRING pRight)
+{
+    Assert(pLeft  && (!RTAsn1BitString_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1BitString_Vtable));
+    Assert(pRight && (!RTAsn1BitString_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1BitString_Vtable));
+
+    int iDiff;
+    if (RTAsn1BitString_IsPresent(pLeft))
+    {
+        if (RTAsn1BitString_IsPresent(pRight))
+        {
+            /* Since it's really hard to tell whether encapsulated objects have
+               been modified or not, we might have to refresh both objects
+               while doing this compare.  We'll try our best to avoid it though. */
+            if (pLeft->pEncapsulated || pRight->pEncapsulated)
+            {
+                if (   pLeft->pEncapsulated
+                    && pRight->pEncapsulated
+                    && pLeft->pEncapsulated->pOps == pRight->pEncapsulated->pOps)
+                    iDiff = pLeft->pEncapsulated->pOps->pfnCompare(pLeft->pEncapsulated, pRight->pEncapsulated);
+                else
+                {
+                    /* No direct comparison of encapsulated objects possible,
+                       make sure we've got the rigth bytes then.  */
+                    if (   pLeft->pEncapsulated
+                        && !RTAsn1BitString_AreContentBitsValid(pLeft, RTASN1ENCODE_F_DER))
+                    {
+                        int rc = RTAsn1BitString_RefreshContent((PRTASN1BITSTRING)pLeft, RTASN1ENCODE_F_DER,
+                                                                pLeft->EncapsulatedAllocation.pAllocator, NULL);
+                        AssertRC(rc);
+                    }
+
+                    if (   pRight->pEncapsulated
+                        && !RTAsn1BitString_AreContentBitsValid(pRight, RTASN1ENCODE_F_DER))
+                    {
+                        int rc = RTAsn1BitString_RefreshContent((PRTASN1BITSTRING)pRight, RTASN1ENCODE_F_DER,
+                                                                pRight->EncapsulatedAllocation.pAllocator, NULL);
+                        AssertRC(rc);
+                    }
+
+                    /* Compare the content bytes. */
+                    iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+                }
+            }
+            /*
+             * No encapsulated object, just compare the raw content bytes.
+             */
+            else
+                iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+        }
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1BitString_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1BitString_CheckSanity(PCRTASN1BITSTRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1BitString_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (BIT STRING).", pszErrorTag);
+
+    if (pThis->cBits > pThis->cMaxBits)
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_BITSTRING_OUT_OF_BOUNDS, "%s: Exceeding max bits: cBits=%u cMaxBits=%u.",
+                             pszErrorTag, pThis->cBits, pThis->cMaxBits);
+
+    if (pThis->pEncapsulated)
+        return pThis->pEncapsulated->pOps->pfnCheckSanity(pThis->pEncapsulated, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK,
+                                                          pErrInfo, pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-bitstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp
new file mode 100644
index 0000000..6e22512
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-decode.cpp
@@ -0,0 +1,81 @@
+/* $Id: asn1-ut-boolean-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, BOOLEAN Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1Boolean_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1BOOLEAN pThis, const char *pszErrorTag)
+{
+    pThis->fValue = 0;
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_BOOLEAN,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "BOOLEAN");
+        if (RT_SUCCESS(rc))
+        {
+            if (pThis->Asn1Core.cb == 1)
+            {
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                pThis->Asn1Core.pOps    = &g_RTAsn1Boolean_Vtable;
+
+                pThis->fValue = *pThis->Asn1Core.uData.pu8 != 0;
+                if (   *pThis->Asn1Core.uData.pu8 == 0
+                    || *pThis->Asn1Core.uData.pu8 == 0xff
+                    || !(pCursor->fFlags & (RTASN1CURSOR_FLAGS_DER | RTASN1CURSOR_FLAGS_CER)) )
+                    return VINF_SUCCESS;
+
+                rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BOOLEAN_ENCODING,
+                                         "%s: Invalid CER/DER boolean value: %#x, valid: 0, 0xff",
+                                         pszErrorTag, *pThis->Asn1Core.uData.pu8);
+            }
+            else
+                rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_BOOLEAN_ENCODING, "%s: Invalid boolean length, exepcted 1: %#x",
+                                         pszErrorTag, pThis->Asn1Core.cb);
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-boolean-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h
index 35b6d89..db2fa19 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-boolean-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, BOOLEAN Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFBOOLEANS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfBooleans
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfBooleans
+RTASN1TMPL_SEQ_OF(RTASN1BOOLEAN, RTAsn1Boolean);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFBOOLEANS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfBooleans
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfBooleans
+RTASN1TMPL_SET_OF(RTASN1BOOLEAN, RTAsn1Boolean);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp
new file mode 100644
index 0000000..1e65549
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-boolean.cpp
@@ -0,0 +1,203 @@
+/* $Id: asn1-ut-boolean.cpp $ */
+/** @file
+ * IPRT - ASN.1, BOOLEAN Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** The false value (DER & CER). */
+static const uint8_t  g_bFalse = 0;
+/** The true value (DER & CER). */
+static const uint8_t  g_bTrue  = 0xff;
+
+
+/*
+ * ASN.1 BOOLEAN - Special Methods.
+ */
+
+RTDECL(int) RTAsn1Boolean_InitDefault(PRTASN1BOOLEAN pThis, bool fValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BOOLEAN, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1Boolean_Vtable, RTASN1CORE_F_DEFAULT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    pThis->fValue = fValue;
+    pThis->Asn1Core.uData.pv = (void *)(fValue ? &g_bTrue : &g_bFalse);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Set(PRTASN1BOOLEAN pThis, bool fValue)
+{
+    /* Since we don't need an allocator, let's automatically initialize the struct. */
+    if (!RTAsn1Boolean_IsPresent(pThis))
+        RTAsn1Boolean_Init(pThis, NULL);
+    else
+        RTAsn1ContentFree(&pThis->Asn1Core);
+    pThis->fValue            = fValue;
+    pThis->Asn1Core.uData.pv = (void *)(fValue ? &g_bTrue : &g_bFalse);
+    pThis->Asn1Core.cb       = 1;
+    pThis->Asn1Core.fFlags  &= ~RTASN1CORE_F_DEFAULT;
+    pThis->Asn1Core.fFlags  |= RTASN1CORE_F_PRESENT;
+    return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 BOOLEAN - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Boolean_Vtable =
+{
+    "RTAsn1Boolean",
+    sizeof(RTASN1BOOLEAN),
+    ASN1_TAG_BOOLEAN,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1Boolean_Delete,
+    NULL,
+    (PFNRTASN1COREVTCLONE)RTAsn1Boolean_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1Boolean_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1Boolean_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1Boolean_Init(PRTASN1BOOLEAN pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_BOOLEAN, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1Boolean_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    pThis->fValue = true;
+    pThis->Asn1Core.cb = 1;
+    pThis->Asn1Core.uData.pv = (void *)&g_bTrue;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Clone(PRTASN1BOOLEAN pThis, PCRTASN1BOOLEAN pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1Boolean_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable, VERR_INTERNAL_ERROR_3);
+        AssertReturn(pSrc->Asn1Core.cb <= 1, VERR_INTERNAL_ERROR_4);
+
+        int rc;
+        if (   pSrc->Asn1Core.cb == 1
+            && pSrc->Asn1Core.uData.pu8[0] != 0x00
+            && pSrc->Asn1Core.uData.pu8[0] != 0xff)
+        {
+            /* DER/CER incompatible value must be copied as-is. */
+            rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+            if (RT_FAILURE(rc))
+                return rc;
+        }
+        else
+        {
+            /* No value or one of the standard values. */
+            rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+            if (RT_FAILURE(rc))
+                return rc;
+            pThis->Asn1Core.uData.pv = (void *)(pSrc->fValue ? &g_bTrue : &g_bFalse);
+        }
+        pThis->fValue = pSrc->fValue;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Boolean_Delete(PRTASN1BOOLEAN pThis)
+{
+    if (   pThis
+        && RTAsn1Boolean_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable);
+        Assert(pThis->Asn1Core.cb <= 1);
+
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1Boolean_Enum(PRTASN1BOOLEAN pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1Boolean_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Boolean_Compare(PCRTASN1BOOLEAN pLeft, PCRTASN1BOOLEAN pRight)
+{
+    Assert(pLeft  && (!RTAsn1Boolean_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1Boolean_Vtable));
+    Assert(pRight && (!RTAsn1Boolean_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Boolean_Vtable));
+
+    int iDiff;
+    if (RTAsn1Boolean_IsPresent(pLeft))
+    {
+        if (RTAsn1Boolean_IsPresent(pRight))
+            iDiff = (int)pLeft->fValue - (int)pRight->fValue;
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1Boolean_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Boolean_CheckSanity(PCRTASN1BOOLEAN pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1Boolean_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (BOOLEAN).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-boolean-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp
similarity index 61%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp
index 35b6d89..d4bcd84 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core-decode.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-core-decode.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, Generic Core Type, Decoding.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,33 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
 
-    int rc = SUPR3Install();
+RTDECL(int) RTAsn1Core_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1CORE pThis, const char *pszErrorTag)
+{
+    int rc = RTAsn1CursorReadHdr(pCursor, pThis, pszErrorTag);
     if (RT_SUCCESS(rc))
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        RTAsn1CursorSkip(pCursor, pThis->cb);
+        pThis->pOps = &g_RTAsn1Core_Vtable;
+        return VINF_SUCCESS;
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return rc;
 }
 
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-core-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-core-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-core-template.h
index 35b6d89..2005f2d 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-core-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, Generic Core Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFCORES
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfCores
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfCores
+RTASN1TMPL_SEQ_OF(RTASN1CORE, RTAsn1Core);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFCORES
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfCores
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfCores
+RTASN1TMPL_SET_OF(RTASN1CORE, RTAsn1Core);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp
new file mode 100644
index 0000000..70b8877
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-core.cpp
@@ -0,0 +1,278 @@
+/* $Id: asn1-ut-core.cpp $ */
+/** @file
+ * IPRT - ASN.1, Generic Core Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 Core - Special methods (for all applications of RTASN1CORE).
+ */
+
+RTDECL(int) RTAsn1Core_SetTagAndFlags(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass)
+{
+    if (!(pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT))
+    {
+        pAsn1Core->fRealClass = pAsn1Core->fClass;
+        pAsn1Core->uRealTag   = pAsn1Core->uTag;
+        Assert(pAsn1Core->uRealTag == pAsn1Core->uTag);
+        pAsn1Core->fFlags |= RTASN1CORE_F_TAG_IMPLICIT;
+    }
+    pAsn1Core->uTag   = uTag;
+    pAsn1Core->fClass = fClass;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_ChangeTag(PRTASN1CORE pAsn1Core, uint32_t uTag)
+{
+    if (!(pAsn1Core->fFlags & RTASN1CORE_F_TAG_IMPLICIT))
+        pAsn1Core->uTag = uTag;
+    pAsn1Core->uRealTag = uTag;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Core_ResetImplict(PRTASN1CORE pThis)
+{
+    AssertPtr(pThis);
+    if (pThis->fFlags & RTASN1CORE_F_TAG_IMPLICIT)
+    {
+        pThis->fFlags &= ~RTASN1CORE_F_TAG_IMPLICIT;
+        pThis->uTag    = pThis->uRealTag;
+        pThis->fClass  = pThis->fRealClass;
+    }
+}
+
+
+RTDECL(int) RTAsn1Core_InitEx(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass, PCRTASN1COREVTABLE pOps, uint32_t fFlags)
+{
+    pAsn1Core->uTag         = uTag;
+    pAsn1Core->fClass       = fClass;
+    pAsn1Core->uRealTag     = uTag;
+    pAsn1Core->fRealClass   = fClass;
+    pAsn1Core->cbHdr        = 0;
+    pAsn1Core->cb           = 0;
+    pAsn1Core->fFlags       = fFlags;
+    pAsn1Core->uData.pv     = NULL;
+    pAsn1Core->pOps         = pOps;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_InitDefault(PRTASN1CORE pAsn1Core, uint32_t uTag, uint8_t fClass)
+{
+    return RTAsn1Core_InitEx(pAsn1Core, uTag, fClass, NULL, RTASN1CORE_F_DEFAULT);
+}
+
+
+static int rtAsn1Core_CloneEx(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator, bool fCopyContent)
+{
+    Assert(RTASN1CORE_IS_PRESENT(pSrc));
+    pThis->uTag         = pSrc->uTag;
+    pThis->fClass       = pSrc->fClass;
+    pThis->uRealTag     = pSrc->uRealTag;
+    pThis->fRealClass   = pSrc->fRealClass;
+    pThis->cbHdr        = pSrc->cbHdr;
+    pThis->fFlags       = pSrc->fFlags & ~(RTASN1CORE_F_ALLOCATED_CONTENT | RTASN1CORE_F_DECODED_CONTENT);
+    pThis->pOps         = pSrc->pOps;
+    pThis->cb           = 0;
+    pThis->uData.pv     = NULL;
+    if (pSrc->cb)
+    {
+        if (!fCopyContent)
+            pThis->cb = pSrc->cb;
+        else
+        {
+            int rc = RTAsn1ContentDup(pThis, pSrc->uData.pv, pSrc->cb, pAllocator);
+            if (RT_FAILURE(rc))
+            {
+                RT_ZERO(*pThis);
+                return rc;
+            }
+            Assert(pThis->cb == pSrc->cb);
+            AssertPtr(pThis->uData.pv);
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_CloneContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    return rtAsn1Core_CloneEx(pThis, pSrc, pAllocator, true /*fConpyContent*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CloneNoContent(PRTASN1CORE pThis, PCRTASN1CORE pSrc)
+{
+    return rtAsn1Core_CloneEx(pThis, pSrc, NULL, false /*fConpyContent*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CompareEx(PCRTASN1CORE pLeft, PCRTASN1CORE pRight, bool fIgnoreTagAndClass)
+{
+    int iDiff;
+    if (RTASN1CORE_IS_PRESENT(pLeft))
+    {
+        if (RTASN1CORE_IS_PRESENT(pRight))
+        {
+            iDiff = memcmp(pLeft->uData.pv, pRight->uData.pv, RT_MIN(pLeft->cb, pRight->cb));
+            if (!iDiff)
+            {
+                if (pLeft->cb != pRight->cb)
+                    iDiff = pLeft->cb < pRight->cb ? -1 : 1;
+                else if (!fIgnoreTagAndClass)
+                {
+                    if (pLeft->uTag != pRight->uTag)
+                        iDiff = pLeft->uTag < pRight->uTag ? -1 : 1;
+                    else if (pLeft->fClass != pRight->fClass)
+                        iDiff = pLeft->fClass < pRight->fClass ? -1 : 1;
+                }
+            }
+            else
+                iDiff = iDiff < 0 ? -1 : 1;
+        }
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTASN1CORE_IS_PRESENT(pRight);
+    return iDiff;
+}
+
+
+
+/*
+ * ASN.1 Core - Standard Methods.
+ *
+ * Note! Children of the ASN.1 Core doesn't normally call these, they are for
+ *       when RTASN1CORE is used as a member type.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Core_Vtable =
+{
+    "RTAsn1Core",
+    sizeof(RTASN1CORE),
+    UINT8_MAX,
+    UINT8_MAX,
+    0,
+    RTAsn1Core_Delete,
+    RTAsn1Core_Enum,
+    (PFNRTASN1COREVTCLONE)RTAsn1Core_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1Core_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1Core_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1Core_Init(PRTASN1CORE pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    return RTAsn1Core_InitEx(pThis, 0, ASN1_TAGCLASS_CONTEXT | ASN1_TAGFLAG_PRIMITIVE,
+                             &g_RTAsn1Core_Vtable, RTASN1CORE_F_PRESENT);
+}
+
+
+RTDECL(int) RTAsn1Core_Clone(PRTASN1CORE pThis, PCRTASN1CORE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    int rc;
+    RT_ZERO(*pThis);
+    if (RTASN1CORE_IS_PRESENT(pSrc))
+    {
+        Assert(pSrc->pOps == &g_RTAsn1Core_Vtable);
+
+        rc = RTAsn1Core_CloneContent(pThis, pSrc, pAllocator);
+    }
+    else
+        rc = VINF_SUCCESS;
+    return rc;
+}
+
+
+RTDECL(void) RTAsn1Core_Delete(PRTASN1CORE pThis)
+{
+    if (pThis && RTASN1CORE_IS_PRESENT(pThis))
+    {
+        Assert(pThis->pOps == &g_RTAsn1Core_Vtable);
+
+        RTAsn1ContentFree(pThis);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1Core_Enum(PRTASN1CORE pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    /* We have no children to enumerate. */
+    Assert(pThis && (!RTASN1CORE_IS_PRESENT(pThis) || pThis->pOps == &g_RTAsn1Core_Vtable));
+    NOREF(pThis);
+    NOREF(pfnCallback);
+    NOREF(uDepth);
+    NOREF(pvUser);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Core_Compare(PCRTASN1CORE pLeft, PCRTASN1CORE pRight)
+{
+    Assert(pLeft  && (!RTASN1CORE_IS_PRESENT(pLeft)  || pLeft->pOps  == &g_RTAsn1Core_Vtable));
+    Assert(pRight && (!RTASN1CORE_IS_PRESENT(pRight) || pRight->pOps == &g_RTAsn1Core_Vtable));
+
+    return RTAsn1Core_CompareEx(pLeft, pRight, false /*fIgnoreTagAndClass*/);
+}
+
+
+RTDECL(int) RTAsn1Core_CheckSanity(PCRTASN1CORE pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    /* We can only check that it's present. */
+    if (!RTAsn1Core_IsPresent(pThis))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (RTASN1CORE).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-core-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp
new file mode 100644
index 0000000..27766dc
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype-decode.cpp
@@ -0,0 +1,228 @@
+/* $Id: asn1-ut-dyntype-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, Dynamic Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+
+RTDECL(int) RTAsn1DynType_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1DYNTYPE pDynType, const char *pszErrorTag)
+{
+    RT_ZERO(*pDynType);
+
+    Assert(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT));
+    uint32_t        cbSavedLeft = pCursor->cbLeft;
+    uint8_t const  *pbSavedCur  = pCursor->pbCur;
+
+    int rc = RTAsn1CursorReadHdr(pCursor, &pDynType->u.Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        pDynType->enmType = RTASN1TYPE_CORE;
+
+        if (pDynType->u.Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE))
+        {
+            switch (pDynType->u.Core.uTag)
+            {
+                case ASN1_TAG_BOOLEAN:
+                    pDynType->enmType = RTASN1TYPE_BOOLEAN;
+                    break;
+                case ASN1_TAG_INTEGER:
+                    pDynType->enmType = RTASN1TYPE_INTEGER;
+                    break;
+                //case ASN1_TAG_ENUMERATED:
+                //    pDynType->enmType = RTASN1TYPE_ENUMERATED;
+                //    break;
+                //case ASN1_TAG_REAL:
+                //    pDynType->enmType = RTASN1TYPE_REAL;
+                //    break;
+                case ASN1_TAG_BIT_STRING:
+                    pDynType->enmType = RTASN1TYPE_BIT_STRING;
+                    break;
+                case ASN1_TAG_OCTET_STRING:
+                    pDynType->enmType = RTASN1TYPE_OCTET_STRING;
+                    break;
+                case ASN1_TAG_NULL:
+                    pDynType->enmType = RTASN1TYPE_NULL;
+                    break;
+                case ASN1_TAG_SEQUENCE:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 SEQUENCE shall be constructed.");
+                case ASN1_TAG_SET:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 SET shall be constructed.");
+                case ASN1_TAG_OID:
+                    pDynType->enmType = RTASN1TYPE_OBJID;
+                    break;
+                //case ASN1_TAG_RELATIVE_OID:
+                //    pDynType->enmType = RTASN1TYPE_RELATIVE_OBJID;
+                //    break;
+                case ASN1_TAG_UTC_TIME:
+                case ASN1_TAG_GENERALIZED_TIME:
+                    pDynType->enmType = RTASN1TYPE_TIME;
+                    break;
+                case ASN1_TAG_UTF8_STRING:
+                case ASN1_TAG_NUMERIC_STRING:
+                case ASN1_TAG_PRINTABLE_STRING:
+                case ASN1_TAG_T61_STRING:
+                case ASN1_TAG_VIDEOTEX_STRING:
+                case ASN1_TAG_IA5_STRING:
+                case ASN1_TAG_GRAPHIC_STRING:
+                case ASN1_TAG_VISIBLE_STRING:
+                case ASN1_TAG_UNIVERSAL_STRING:
+                case ASN1_TAG_GENERAL_STRING:
+                case ASN1_TAG_BMP_STRING:
+                    pDynType->enmType = RTASN1TYPE_STRING;
+                    break;
+                //case ASN1_TAG_CHARACTER_STRING:
+                //    pDynType->enmType = RTASN1TYPE_CHARACTER_STRING;
+                //    break;
+
+                default:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_TAG_NOT_IMPL,
+                                               "Primitive tag %u (%#x) not implemented.",
+                                               pDynType->u.Core.uTag, pDynType->u.Core.uTag);
+            }
+        }
+        else if (pDynType->u.Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED))
+            switch (pDynType->u.Core.uTag)
+            {
+                case ASN1_TAG_BOOLEAN:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 BOOLEAN shall be primitive.");
+                case ASN1_TAG_INTEGER:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 BOOLEAN shall be primitive.");
+                case ASN1_TAG_ENUMERATED:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 ENUMERATED shall be primitive.");
+                case ASN1_TAG_REAL:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 REAL shall be primitive.");
+                case ASN1_TAG_BIT_STRING:
+                    pDynType->enmType = RTASN1TYPE_BIT_STRING;
+                    break;
+                case ASN1_TAG_OCTET_STRING:
+                    pDynType->enmType = RTASN1TYPE_OCTET_STRING;
+                    break;
+                case ASN1_TAG_NULL:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 NULL shall be primitive.");
+                case ASN1_TAG_SEQUENCE:
+#if 0
+                    pDynType->enmType = RTASN1TYPE_SEQUENCE_CORE;
+                    pDynType->u.SeqCore.Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                    RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+                    return VINF_SUCCESS;
+#else
+                    pDynType->enmType = RTASN1TYPE_CORE;
+#endif
+                    break;
+                case ASN1_TAG_SET:
+#if 0
+                    pDynType->enmType = RTASN1TYPE_SET_CORE;
+                    pDynType->u.SeqCore.Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                    RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+                    return VINF_SUCCESS;
+#else
+                    pDynType->enmType = RTASN1TYPE_CORE;
+#endif
+                    break;
+                case ASN1_TAG_OID:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 OBJECT ID shall be primitive.");
+                case ASN1_TAG_RELATIVE_OID:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_BAD_TAG, "ASN.1 RELATIVE OID shall be primitive.");
+
+                case ASN1_TAG_UTF8_STRING:
+                case ASN1_TAG_NUMERIC_STRING:
+                case ASN1_TAG_PRINTABLE_STRING:
+                case ASN1_TAG_T61_STRING:
+                case ASN1_TAG_VIDEOTEX_STRING:
+                case ASN1_TAG_IA5_STRING:
+                case ASN1_TAG_GRAPHIC_STRING:
+                case ASN1_TAG_VISIBLE_STRING:
+                case ASN1_TAG_UNIVERSAL_STRING:
+                case ASN1_TAG_GENERAL_STRING:
+                case ASN1_TAG_BMP_STRING:
+                    pDynType->enmType = RTASN1TYPE_STRING;
+                    break;
+                //case ASN1_TAG_CHARACTER_STRING:
+                //    pDynType->enmType = RTASN1TYPE_CHARACTER_STRING;
+                //    break;
+
+                default:
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_DYNTYPE_TAG_NOT_IMPL,
+                                               "Constructed tag %u (%#x) not implemented.",
+                                               pDynType->u.Core.uTag, pDynType->u.Core.uTag);
+            }
+        else
+        {
+            RTAsn1CursorSkip(pCursor, pDynType->u.Core.cb);
+            return VINF_SUCCESS;
+        }
+
+        /*
+         * Restore the cursor and redo with specific type.
+         */
+        pCursor->pbCur  = pbSavedCur;
+        pCursor->cbLeft = cbSavedLeft;
+
+        switch (pDynType->enmType)
+        {
+            case RTASN1TYPE_INTEGER:
+                rc = RTAsn1Integer_DecodeAsn1(pCursor, 0, &pDynType->u.Integer, pszErrorTag);
+                break;
+            case RTASN1TYPE_BOOLEAN:
+                rc = RTAsn1Boolean_DecodeAsn1(pCursor, 0, &pDynType->u.Boolean, pszErrorTag);
+                break;
+            case RTASN1TYPE_OBJID:
+                rc = RTAsn1ObjId_DecodeAsn1(pCursor, 0, &pDynType->u.ObjId, pszErrorTag);
+                break;
+            case RTASN1TYPE_BIT_STRING:
+                rc = RTAsn1BitString_DecodeAsn1(pCursor, 0, &pDynType->u.BitString, pszErrorTag);
+                break;
+            case RTASN1TYPE_OCTET_STRING:
+                rc = RTAsn1OctetString_DecodeAsn1(pCursor, 0, &pDynType->u.OctetString, pszErrorTag);
+                break;
+            case RTASN1TYPE_NULL:
+                rc = RTAsn1Null_DecodeAsn1(pCursor, 0, &pDynType->u.Asn1Null, pszErrorTag);
+                break;
+            case RTASN1TYPE_TIME:
+                rc = RTAsn1Time_DecodeAsn1(pCursor, 0, &pDynType->u.Time, pszErrorTag);
+                break;
+            case RTASN1TYPE_STRING:
+                rc = RTAsn1String_DecodeAsn1(pCursor, 0, &pDynType->u.String, pszErrorTag);
+                break;
+            case RTASN1TYPE_CORE:
+                rc = RTAsn1Core_DecodeAsn1(pCursor, 0, &pDynType->u.Core, pszErrorTag);
+                break;
+            default:
+                AssertFailedReturn(VERR_INTERNAL_ERROR_4);
+        }
+    }
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp
new file mode 100644
index 0000000..88962d9
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-dyntype.cpp
@@ -0,0 +1,169 @@
+/* $Id: asn1-ut-dyntype.cpp $ */
+/** @file
+ * IPRT - ASN.1, Basic Operations.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 dynamic type union - Standard Methods.
+ */
+
+
+RTDECL(int) RTAsn1DynType_Init(PRTASN1DYNTYPE pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RT_ZERO(*pThis);
+    pThis->enmType = RTASN1TYPE_NOT_PRESENT;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1DynType_Clone(PRTASN1DYNTYPE pThis, PCRTASN1DYNTYPE pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1DynType_IsPresent(pSrc))
+    {
+        int rc;
+        switch (pSrc->enmType)
+        {
+            case RTASN1TYPE_CORE:           rc = RTAsn1Core_Clone(&pThis->u.Core, &pSrc->u.Core, pAllocator); break;
+            case RTASN1TYPE_NULL:           rc = RTAsn1Null_Clone(&pThis->u.Asn1Null, &pSrc->u.Asn1Null, pAllocator); break;
+            case RTASN1TYPE_INTEGER:        rc = RTAsn1Integer_Clone(&pThis->u.Integer, &pSrc->u.Integer, pAllocator); break;
+            case RTASN1TYPE_BOOLEAN:        rc = RTAsn1Boolean_Clone(&pThis->u.Boolean, &pSrc->u.Boolean, pAllocator); break;
+            case RTASN1TYPE_STRING:         rc = RTAsn1String_Clone(&pThis->u.String, &pSrc->u.String, pAllocator); break;
+            case RTASN1TYPE_OCTET_STRING:   rc = RTAsn1OctetString_Clone(&pThis->u.OctetString, &pSrc->u.OctetString, pAllocator); break;
+            case RTASN1TYPE_BIT_STRING:     rc = RTAsn1BitString_Clone(&pThis->u.BitString, &pSrc->u.BitString, pAllocator); break;
+            case RTASN1TYPE_TIME:           rc = RTAsn1Time_Clone(&pThis->u.Time, &pSrc->u.Time, pAllocator); break;
+#if 0
+            case RTASN1TYPE_SEQUENCE_CORE:  rc = VERR_NOT_SUPPORTED; //rc = RTAsn1SequenceCore_Clone(&pThis->u.SeqCore, &pSrc->u.SeqCore, pAllocator); break;
+            case RTASN1TYPE_SET_CORE:       rc = VERR_NOT_SUPPORTED; //rc = RTAsn1SetCore_Clone(&pThis->u.SetCore, &pSrc->u.SetCore, pAllocator); break;
+#endif
+            case RTASN1TYPE_OBJID:          rc = RTAsn1ObjId_Clone(&pThis->u.ObjId, &pSrc->u.ObjId, pAllocator); break;
+            default:
+                AssertFailedReturn(VERR_ASN1_INTERNAL_ERROR_2);
+        }
+        if (RT_FAILURE(rc))
+        {
+            RT_ZERO(*pThis);
+            return rc;
+        }
+        pThis->enmType = pSrc->enmType;
+    }
+    else
+        pThis->enmType = RTASN1TYPE_NOT_PRESENT;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1DynType_Delete(PRTASN1DYNTYPE pThis)
+{
+    if (   pThis
+        && RTAsn1DynType_IsPresent(pThis))
+    {
+        if (   pThis->u.Core.pOps
+            && pThis->u.Core.pOps->pfnDtor)
+            pThis->u.Core.pOps->pfnDtor(&pThis->u.Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1DynType_Enum(PRTASN1DYNTYPE pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    if (   pThis
+        && RTAsn1DynType_IsPresent(pThis))
+    {
+        if (   pThis->u.Core.pOps
+            && pThis->u.Core.pOps->pfnEnum)
+            return pThis->u.Core.pOps->pfnEnum(&pThis->u.Core, pfnCallback, uDepth, pvUser);
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1DynType_Compare(PCRTASN1DYNTYPE pLeft, PCRTASN1DYNTYPE pRight)
+{
+    if (RTAsn1DynType_IsPresent(pLeft) && RTAsn1DynType_IsPresent(pRight))
+    {
+        if (pLeft->enmType != pRight->enmType)
+            return pLeft->enmType < pRight->enmType ? -1 : 1;
+
+        switch (pLeft->enmType)
+        {
+            case RTASN1TYPE_CORE:           return RTAsn1Core_Compare(&pLeft->u.Core, &pRight->u.Core); break;
+            case RTASN1TYPE_NULL:           return RTAsn1Null_Compare(&pLeft->u.Asn1Null, &pRight->u.Asn1Null);
+            case RTASN1TYPE_INTEGER:        return RTAsn1Integer_Compare(&pLeft->u.Integer, &pRight->u.Integer);
+            case RTASN1TYPE_BOOLEAN:        return RTAsn1Boolean_Compare(&pLeft->u.Boolean, &pRight->u.Boolean);
+            case RTASN1TYPE_STRING:         return RTAsn1String_Compare(&pLeft->u.String, &pRight->u.String);
+            case RTASN1TYPE_OCTET_STRING:   return RTAsn1OctetString_Compare(&pLeft->u.OctetString, &pRight->u.OctetString);
+            case RTASN1TYPE_BIT_STRING:     return RTAsn1BitString_Compare(&pLeft->u.BitString, &pRight->u.BitString);
+            case RTASN1TYPE_TIME:           return RTAsn1Time_Compare(&pLeft->u.Time, &pRight->u.Time);
+            case RTASN1TYPE_OBJID:          return RTAsn1ObjId_Compare(&pLeft->u.ObjId, &pRight->u.ObjId);
+            default:  AssertFailedReturn(-1);
+        }
+    }
+    else
+        return (int)RTAsn1DynType_IsPresent(pLeft) - (int)RTAsn1DynType_IsPresent(pRight);
+}
+
+
+RTDECL(int) RTAsn1DynType_CheckSanity(PCRTASN1DYNTYPE pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1DynType_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (DYNTYPE).", pszErrorTag);
+
+    int rc;
+    switch (pThis->enmType)
+    {
+        case RTASN1TYPE_CORE:           rc = RTAsn1Core_CheckSanity(&pThis->u.Core, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_NULL:           rc = RTAsn1Null_CheckSanity(&pThis->u.Asn1Null, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_INTEGER:        rc = RTAsn1Integer_CheckSanity(&pThis->u.Integer, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_BOOLEAN:        rc = RTAsn1Boolean_CheckSanity(&pThis->u.Boolean, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_STRING:         rc = RTAsn1String_CheckSanity(&pThis->u.String, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_OCTET_STRING:   rc = RTAsn1OctetString_CheckSanity(&pThis->u.OctetString, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_BIT_STRING:     rc = RTAsn1BitString_CheckSanity(&pThis->u.BitString, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_TIME:           rc = RTAsn1Time_CheckSanity(&pThis->u.Time, fFlags, pErrInfo, pszErrorTag); break;
+#if 0
+        case RTASN1TYPE_SEQUENCE_CORE:  rc = VINF_SUCCESS; //rc = RTAsn1SequenceCore_CheckSanity(&pThis->u.SeqCore, fFlags, pErrInfo, pszErrorTag); break;
+        case RTASN1TYPE_SET_CORE:       rc = VINF_SUCCESS; //rc = RTAsn1SetCore_CheckSanity(&pThis->u.SetCore, fFlags, pErrInfo, pszErrorTag); break;
+#endif
+        case RTASN1TYPE_OBJID:          rc = RTAsn1ObjId_CheckSanity(&pThis->u.ObjId, fFlags, pErrInfo, pszErrorTag); break;
+        default:
+            AssertFailedReturn(VERR_ASN1_INTERNAL_ERROR_2);
+    }
+
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp
new file mode 100644
index 0000000..1d47e1d
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer-decode.cpp
@@ -0,0 +1,79 @@
+/* $Id: asn1-ut-integer-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, INTEGER Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1Integer_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1INTEGER pThis, const char *pszErrorTag)
+{
+    pThis->uValue.u = 0;
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_INTEGER,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                            fFlags, pszErrorTag, "INTEGER");
+        if (RT_SUCCESS(rc))
+        {
+            uint32_t offLast = pThis->Asn1Core.cb - 1;
+            switch (pThis->Asn1Core.cb)
+            {
+                default:
+                case 8: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 7] << 56;
+                case 7: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 6] << 48;
+                case 6: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 5] << 40;
+                case 5: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 4] << 32;
+                case 4: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 3] << 24;
+                case 3: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 2] << 16;
+                case 2: pThis->uValue.u |= (uint16_t)pThis->Asn1Core.uData.pu8[offLast - 1] << 8;
+                case 1: pThis->uValue.u |=           pThis->Asn1Core.uData.pu8[offLast];
+            }
+            RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+            pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+            pThis->Asn1Core.pOps    = &g_RTAsn1Integer_Vtable;
+            return VINF_SUCCESS;
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-integer-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h
index 35b6d89..4ac433f 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-integer-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, INTEGER Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFINTEGERS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfIntegers
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfIntegers
+RTASN1TMPL_SEQ_OF(RTASN1INTEGER, RTAsn1Integer);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFINTEGERS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfIntegers
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfIntegers
+RTASN1TMPL_SET_OF(RTASN1INTEGER, RTAsn1Integer);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp
new file mode 100644
index 0000000..4d6ce3d
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp
@@ -0,0 +1,451 @@
+/* $Id: asn1-ut-integer.cpp $ */
+/** @file
+ * IPRT - ASN.1, INTEGER Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** Fixed on-byte constants for small numbers.
+ * Good for structure version values and such. */
+static const uint8_t g_abSmall[] =
+{
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
+    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+};
+
+
+
+/*
+ * ASN.1 INTEGER - Special Methods.
+ */
+
+
+/**
+ * Updates the native value we keep in RTASN1INTEGER::uValue.
+ *
+ * @param   pThis               The integer.
+ */
+static void rtAsn1Integer_UpdateNativeValue(PRTASN1INTEGER pThis)
+{
+    uint32_t offLast = pThis->Asn1Core.cb - 1;
+    switch (pThis->Asn1Core.cb)
+    {
+        default:
+        case 8: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 7] << 56;
+        case 7: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 6] << 48;
+        case 6: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 5] << 40;
+        case 5: pThis->uValue.u |= (uint64_t)pThis->Asn1Core.uData.pu8[offLast - 4] << 32;
+        case 4: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 3] << 24;
+        case 3: pThis->uValue.u |= (uint32_t)pThis->Asn1Core.uData.pu8[offLast - 2] << 16;
+        case 2: pThis->uValue.u |= (uint16_t)pThis->Asn1Core.uData.pu8[offLast - 1] << 8;
+        case 1: pThis->uValue.u |=           pThis->Asn1Core.uData.pu8[offLast];
+    }
+}
+
+
+RTDECL(int) RTAsn1Integer_InitU64(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    /*
+     * Initialize the core and the native value.
+     */
+    RTAsn1Core_InitEx(&pThis->Asn1Core,
+                      ASN1_TAG_INTEGER,
+                      ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1Integer_Vtable,
+                      RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    pThis->uValue.u = uValue;
+
+    /*
+     * Use one of the constants if possible.
+     */
+    if (uValue < RT_ELEMENTS(g_abSmall))
+    {
+        pThis->Asn1Core.cb = 1;
+        pThis->Asn1Core.uData.pv = (void *)&g_abSmall[0];
+    }
+    else
+    {
+        /*
+         * Need to turn uValue into a big endian number without any
+         * unnecessary leading zero bytes.
+         */
+        /* Figure the size. */
+        uint32_t cb = 0;
+        if (uValue <= UINT32_MAX)
+        {
+            if (uValue <= UINT16_MAX)
+            {
+                if (uValue <= UINT8_MAX)
+                    cb = 1;
+                else
+                    cb = 2;
+            }
+            else
+            {
+                if (uValue <= UINT32_C(0xffffff))
+                    cb = 3;
+                else
+                    cb = 4;
+            }
+        }
+        else
+        {
+            if (uValue <= UINT64_C(0x0000FfffFfffFfff))
+            {
+                if (uValue <= UINT64_C(0x000000ffFfffFfff))
+                    cb = 5;
+                else
+                    cb = 6;
+            }
+            else
+            {
+                if (uValue <= UINT64_C(0x00ffFfffFfffFfff))
+                    cb = 7;
+                else
+                    cb = 8;
+            }
+        }
+
+        /* Allocate space. */
+        int rc = RTAsn1ContentAllocZ(&pThis->Asn1Core, cb, pAllocator);
+        if (RT_FAILURE(rc))
+        {
+            RT_ZERO(*pThis);
+            return rc;
+        }
+
+        /* Serialize the number in MSB order. */
+        uint8_t *pb = (uint8_t *)pThis->Asn1Core.uData.pu8;
+        while (cb-- > 0)
+        {
+            pb[cb] = (uint8_t)uValue;
+            uValue >>= 8;
+        }
+        Assert(uValue == 0);
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_InitDefault(PRTASN1INTEGER pThis, uint64_t uValue, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    int rc = RTAsn1Integer_InitU64(pThis, uValue, pAllocator);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->Asn1Core.fFlags &= ~RTASN1CORE_F_PRESENT;
+        pThis->Asn1Core.fFlags |= RTASN1CORE_F_DEFAULT;
+    }
+    return rc;
+}
+
+
+RTDECL(int32_t) RTAsn1Integer_UnsignedLastBit(PCRTASN1INTEGER pThis)
+{
+    AssertReturn(pThis->Asn1Core.fFlags, -1);
+    uint8_t const *pb = pThis->Asn1Core.uData.pu8;
+    AssertReturn(pb, -1);
+    uint32_t cb = pThis->Asn1Core.cb;
+    AssertReturn(pThis->Asn1Core.cb < (uint32_t)INT32_MAX / 8, -1);
+
+    while (cb-- > 0)
+    {
+        uint8_t b = *pb++;
+        if (b)
+        {
+            int32_t iRet = cb * 8;
+            if (b & 0x80)       iRet += 7;
+            else if (b & 0x40)  iRet += 6;
+            else if (b & 0x20)  iRet += 5;
+            else if (b & 0x10)  iRet += 4;
+            else if (b & 0x08)  iRet += 3;
+            else if (b & 0x04)  iRet += 2;
+            else if (b & 0x02)  iRet += 1;
+            else Assert(b == 0x01);
+            return iRet;
+        }
+    }
+    return -1;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight)
+{
+    Assert(pLeft  && (!RTAsn1Integer_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1Integer_Vtable));
+    Assert(pRight && (!RTAsn1Integer_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Integer_Vtable));
+
+    int iDiff;
+    if (RTAsn1Integer_IsPresent(pLeft))
+    {
+        if (RTAsn1Integer_IsPresent(pRight))
+        {
+            if (   pLeft->Asn1Core.cb > 8
+                || pRight->Asn1Core.cb > 8)
+            {
+                uint32_t iLeft  = RTAsn1Integer_UnsignedLastBit(pLeft);
+                uint32_t iRight = RTAsn1Integer_UnsignedLastBit(pRight);
+                if (iLeft != iRight)
+                    return iLeft < iRight ? -1 : 1;
+
+                uint32_t i = iLeft / 8;
+                if (i > 8)
+                {
+                    uint8_t const *pbLeft  = &pLeft->Asn1Core.uData.pu8[pLeft->Asn1Core.cb - i - 1];
+                    uint8_t const *pbRight = &pRight->Asn1Core.uData.pu8[pRight->Asn1Core.cb - i - 1];
+                    for (;;)
+                    {
+                        if (*pbLeft != *pbRight)
+                            return *pbLeft < *pbRight ? -1 : 1;
+                        if (--i <= 8)
+                            break;
+                        pbLeft++;
+                        pbRight++;
+                    }
+                }
+            }
+
+            if (pLeft->uValue.u == pRight->uValue.u)
+                iDiff = 0;
+            else
+                iDiff = pLeft->uValue.u < pRight->uValue.u ? -1 : 1;
+        }
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1Integer_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU64(PCRTASN1INTEGER pThis, uint64_t u64Const)
+{
+    int iDiff;
+    if (RTAsn1Integer_IsPresent(pThis))
+    {
+        if (pThis->Asn1Core.cb > 8)
+        {
+            int32_t iLast = RTAsn1Integer_UnsignedLastBit(pThis);
+            if (iLast >= 64)
+                return 1;
+        }
+
+        if (pThis->uValue.u == u64Const)
+            iDiff = 0;
+        else
+            iDiff = pThis->uValue.u < u64Const ? -1 : 1;
+    }
+    else
+        iDiff = 1;
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_UnsignedCompareWithU32(PCRTASN1INTEGER pThis, uint32_t u32Const)
+{
+    int iDiff;
+    if (RTAsn1Integer_IsPresent(pThis))
+    {
+        if (pThis->Asn1Core.cb > 8)
+        {
+            int32_t iLast = RTAsn1Integer_UnsignedLastBit(pThis);
+            if (iLast >= 32)
+                return 1;
+        }
+
+        if (pThis->uValue.u == u32Const)
+            iDiff = 0;
+        else
+            iDiff = pThis->uValue.u < u32Const ? -1 : 1;
+    }
+    else
+        iDiff = 1;
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Integer_ToBigNum(PCRTASN1INTEGER pThis, PRTBIGNUM pBigNum, uint32_t fBigNumInit)
+{
+    AssertReturn(!(fBigNumInit & ~(  RTBIGNUMINIT_F_SENSITIVE | RTBIGNUMINIT_F_UNSIGNED | RTBIGNUMINIT_F_SIGNED
+                                   | RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_ENDIAN_BIG)),
+                 VERR_INVALID_PARAMETER);
+    AssertReturn(RTAsn1Integer_IsPresent(pThis), VERR_INVALID_PARAMETER);
+
+    if (!(fBigNumInit & (RTBIGNUMINIT_F_UNSIGNED | RTBIGNUMINIT_F_SIGNED)))
+        fBigNumInit |= RTBIGNUMINIT_F_SIGNED;
+
+    if (!(fBigNumInit & (RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_ENDIAN_LITTLE)))
+        fBigNumInit |= RTBIGNUMINIT_F_ENDIAN_BIG;
+
+    return RTBigNumInit(pBigNum, fBigNumInit, pThis->Asn1Core.uData.pv, pThis->Asn1Core.cb);
+}
+
+
+RTDECL(int) RTAsn1Integer_FromBigNum(PRTASN1INTEGER pThis, PCRTBIGNUM pBigNum, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pThis); AssertPtr(pBigNum); AssertPtr(pAllocator);
+
+    /* Be nice and auto init the object. */
+    if (!RTAsn1Integer_IsPresent(pThis))
+        RTAsn1Integer_Init(pThis, NULL);
+
+    uint32_t cb = RTBigNumByteWidth(pBigNum); Assert(cb > 0);
+    int rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cb, pAllocator);
+    if (RT_SUCCESS(rc))
+    {
+        Assert(cb == pThis->Asn1Core.cb);
+        rc = RTBigNumToBytesBigEndian(pBigNum, (void *)pThis->Asn1Core.uData.pv, cb);
+        if (RT_SUCCESS(rc))
+            rtAsn1Integer_UpdateNativeValue(pThis);
+    }
+    return rc;
+}
+
+
+
+/*
+ * ASN.1 INTEGER - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Integer_Vtable =
+{
+    "RTAsn1Integer",
+    sizeof(RTASN1INTEGER),
+    ASN1_TAG_INTEGER,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1Integer_Delete,
+    NULL,
+    (PFNRTASN1COREVTCLONE)RTAsn1Integer_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1Integer_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1Integer_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1Integer_Init(PRTASN1INTEGER pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RTAsn1Core_InitEx(&pThis->Asn1Core,
+                      ASN1_TAG_INTEGER,
+                      ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1Integer_Vtable,
+                      RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    pThis->uValue.u = 1;
+    pThis->Asn1Core.cb = 1;
+    pThis->Asn1Core.uData.pv = (void *)&g_abSmall[0];
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_Clone(PRTASN1INTEGER pThis, PCRTASN1INTEGER pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1Integer_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Integer_Vtable, VERR_INTERNAL_ERROR_3);
+
+        int rc;
+        if (   pSrc->Asn1Core.cb != 1
+            || pSrc->uValue.u >= RT_ELEMENTS(g_abSmall))
+        {
+            /* Value is too large, copy it. */
+            rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+            if (RT_FAILURE(rc))
+                return rc;
+        }
+        else
+        {
+            /* Use one of the const values. */
+            rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+            if (RT_FAILURE(rc))
+                return rc;
+            Assert(g_abSmall[pSrc->uValue.u] == pSrc->uValue.u);
+            pThis->Asn1Core.uData.pv = (void *)&g_abSmall[pSrc->uValue.u];
+        }
+        pThis->uValue.u = pSrc->uValue.u;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Integer_Delete(PRTASN1INTEGER pThis)
+{
+    if (   pThis
+        && RTAsn1Integer_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1Integer_Vtable);
+
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1Integer_Enum(PRTASN1INTEGER pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1Integer_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Integer_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Integer_Compare(PCRTASN1INTEGER pLeft, PCRTASN1INTEGER pRight)
+{
+    return RTAsn1Integer_UnsignedCompare(pLeft, pRight);
+}
+
+
+RTDECL(int) RTAsn1Integer_CheckSanity(PCRTASN1INTEGER pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1Integer_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (INTEGER).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-integer-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp
similarity index 53%
copy from src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp
index 492f2f4..3d941b9 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-null-decode.cpp
@@ -1,10 +1,10 @@
-/* $Id: RTStrPrintHexBytes.cpp $ */
+/* $Id: asn1-ut-null-decode.cpp $ */
 /** @file
- * IPRT - RTStrPrintHexBytes.
+ * IPRT - ASN.1, NULL type, Decoding.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,35 +24,38 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
 #include "internal/iprt.h"
-#include <iprt/string.h>
+#include <iprt/asn1.h>
 
-#include <iprt/assert.h>
 #include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
 
 
-RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
+RTDECL(int) RTAsn1Null_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1NULL pThis, const char *pszErrorTag)
 {
-    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
-    AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
-    AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
-    if (cb)
-        AssertPtrReturn(pv, VERR_INVALID_POINTER);
-
-    uint8_t const *pb = (uint8_t const *)pv;
-    while (cb-- > 0)
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
     {
-        static char const s_szHexDigits[17] = "0123456789abcdef";
-        uint8_t b = *pb++;
-        *pszBuf++ = s_szHexDigits[b >> 4];
-        *pszBuf++ = s_szHexDigits[b & 0xf];
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_NULL,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "NULL");
+        if (RT_SUCCESS(rc))
+        {
+            if (pThis->Asn1Core.cb == 0)
+            {
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                pThis->Asn1Core.pOps    = &g_RTAsn1Null_Vtable;
+                return VINF_SUCCESS;
+            }
+
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_NULL_ENCODING,
+                                     "%s: Expected NULL object to have zero length: %#x", pszErrorTag, pThis->Asn1Core.cb);
+        }
     }
-    *pszBuf = '\0';
-    return VINF_SUCCESS;
+    return rc;
 }
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp
new file mode 100644
index 0000000..13ae878
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-null.cpp
@@ -0,0 +1,127 @@
+/* $Id: asn1-ut-null.cpp $ */
+/** @file
+ * IPRT - ASN.1, NULL type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*
+ * ASN.1 NULL - Special Methods.
+ */
+
+
+/*
+ * ASN.1 NULL - Standard Methods.
+ */
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Null_Vtable =
+{
+    "RTAsn1Null",
+    sizeof(RTASN1NULL),
+    ASN1_TAG_NULL,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1Null_Delete,
+    (PFNRTASN1COREVTENUM)RTAsn1Null_Enum,
+    (PFNRTASN1COREVTCLONE)RTAsn1Null_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1Null_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1Null_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1Null_Init(PRTASN1NULL pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    return RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_NULL, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                             &g_RTAsn1Null_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+}
+
+
+RTDECL(int) RTAsn1Null_Clone(PRTASN1NULL pThis, PCRTASN1NULL pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1Null_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Null_Vtable, VERR_INTERNAL_ERROR_3);
+        AssertReturn(pSrc->Asn1Core.cb == 0, VERR_INTERNAL_ERROR_4);
+
+        int rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Null_Delete(PRTASN1NULL pThis)
+{
+    if (   pThis
+        && RTAsn1Null_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1Null_Vtable);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1Null_Enum(PRTASN1NULL pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1Null_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Null_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Null_Compare(PCRTASN1NULL pLeft, PCRTASN1NULL pRight)
+{
+    Assert(pLeft  && (!RTAsn1Null_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1Null_Vtable));
+    Assert(pRight && (!RTAsn1Null_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Null_Vtable));
+
+    return (int)RTAsn1Null_IsPresent(pLeft) - (int)RTAsn1Null_IsPresent(pRight);
+}
+
+
+RTDECL(int) RTAsn1Null_CheckSanity(PCRTASN1NULL pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1Null_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (NULL).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+/* No NULL object collections. */
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp
new file mode 100644
index 0000000..8056acf
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid-decode.cpp
@@ -0,0 +1,362 @@
+/* $Id: asn1-ut-objid-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type, Decoder.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static char const g_achDigits[11] = "0123456789";
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId); /* asn1-ut-objid.cpp */
+
+
+/**
+ * Internal worker for RTAsn1ObjId_DecodeAsn1 that formats a component, with a
+ * leading dot.
+ *
+ * @returns VBox status code (caller complains on failure).
+ * @param   uValue      The component ID value.
+ * @param   ppszObjId   Pointer to the output buffer pointer.
+ * @param   pcbObjId    Pointer to the remaining size of the output buffer.
+ */
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId)
+{
+    /*
+     * Format the number backwards.
+     */
+    char szTmp[32];
+    char *psz = &szTmp[sizeof(szTmp) - 1];
+    *psz = '\0';
+
+    do
+    {
+        *--psz = g_achDigits[uValue % 10];
+        uValue /= 10;
+    } while (uValue > 0);
+
+    /*
+     * Do we have enough space?
+     * We add a dot and save space for the terminator.
+     */
+    size_t cchNeeded = &szTmp[sizeof(szTmp) - 1] - psz;
+    if (1 + cchNeeded < *pcbObjId)
+    {
+        *pcbObjId  -= cchNeeded + 1;
+        char *pszObjId = *ppszObjId;
+        *ppszObjId = pszObjId + cchNeeded + 1;
+
+        *pszObjId = '.';
+        memcpy(pszObjId + 1, psz, cchNeeded);
+        return VINF_SUCCESS;
+    }
+
+    AssertFailed();
+    return VERR_ASN1_OBJID_TOO_LONG_STRING_FORM;
+}
+
+
+/**
+ * Reads one object ID component, returning it's value and encoded length.
+ *
+ * @returns The encoded length (positive) on success, negative IPRT status code
+ *          on failure.
+ * @param   pbContent           The start of the component to parse.
+ * @param   cbContent           The number of content bytes left.
+ * @param   puValue             Where to return the value.
+ */
+static int rtAsn1ObjId_ReadComponent(uint8_t const *pbContent, uint32_t cbContent, uint32_t *puValue)
+{
+    if (cbContent >= 1)
+    {
+        /* The first byte. */
+        uint8_t b = *pbContent;
+        if (!(b & 0x80))
+        {
+            *puValue = b;
+            return 1;
+        }
+
+        /* Encoded as more than one byte.  Make sure that it's efficently
+           encoded as 8.19.2 indicates it must. */
+        if (b != 0x80)
+        {
+            uint32_t off    = 1;
+            uint32_t uValue = b & 0x7f;
+            while (off < cbContent)
+            {
+                b = pbContent[off++];
+                uValue <<= 7;
+                uValue |= b & 0x7f;
+                if (!(b & 0x80))
+                {
+                    *puValue = uValue;
+                    return (int)off;
+                }
+
+                if (RT_UNLIKELY(uValue & UINT32_C(0x0e000000)))
+                    return VERR_ASN1_OBJID_COMPONENT_TOO_BIG;
+            }
+        }
+        return VERR_ASN1_INVALID_OBJID_ENCODING;
+    }
+    return VERR_NO_DATA;
+}
+
+
+/**
+ * This function parses the binary content of an OBJECT IDENTIFIER, check the
+ * encoding as well as calculating the storage requirements.
+ *
+ * @returns IPRT status code
+ * @param   pbContent       Pointer to the content.
+ * @param   cbContent       The length of the content.
+ * @param   pCursor         The cursor (for error reporting).
+ * @param   pszErrorTag     The error tag.
+ * @param   pcComponents    Where to return the component count.
+ * @param   pcchObjId       Where to return the length of the dotted string
+ *                          representation.
+ */
+static int rtAsn1ObjId_PreParse(uint8_t const *pbContent, uint32_t cbContent, PRTASN1CURSOR pCursor, const char *pszErrorTag,
+                                uint8_t *pcComponents, uint8_t *pcchObjId)
+{
+    int rc;
+    if (cbContent >= 1 && cbContent < _1K)
+    {
+        /*
+         * Decode the first two numbers.  Monkey business: X*40 + Y
+         * Where X is the first number, X in {0,1,2}, and Y is the second
+         * one.  The range of Y is {0,...,39} for X in {0,1}, but has a
+         * free range for X = 2.
+         */
+        uint32_t cComponents = 1;
+        uint32_t uValue;
+        rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+        if (rc > 0)
+        {
+            uint32_t cchObjId = 1;
+            uValue = uValue < 2*40 ? uValue % 40 : uValue - 2*40; /* Y */
+            do
+            {
+                cComponents++;
+
+                /* Figure the encoded string length, binary search fashion. */
+                if (uValue < 10000)
+                {
+                    if (uValue < 100)
+                    {
+                        if (uValue < 10)
+                            cchObjId += 1 + 1;
+                        else
+                            cchObjId += 1 + 2;
+                    }
+                    else
+                    {
+                        if (uValue < 1000)
+                            cchObjId += 1 + 3;
+                        else
+                            cchObjId += 1 + 4;
+                    }
+                }
+                else
+                {
+                    if (uValue < 1000000)
+                    {
+                        if (uValue < 100000)
+                            cchObjId += 1 + 5;
+                        else
+                            cchObjId += 1 + 6;
+                    }
+                    else
+                    {
+                        if (uValue < 10000000)
+                            cchObjId += 1 + 7;
+                        else if (uValue < 100000000)
+                            cchObjId += 1 + 8;
+                        else
+                            cchObjId += 1 + 9;
+                    }
+                }
+
+                /* advance. */
+                pbContent += rc;
+                cbContent -= rc;
+                if (!cbContent)
+                {
+                    if (cComponents < 128)
+                    {
+                        if (cchObjId < RT_SIZEOFMEMB(RTASN1OBJID, szObjId))
+                        {
+                            *pcComponents = cComponents;
+                            *pcchObjId    = cchObjId;
+                            return VINF_SUCCESS;
+                        }
+                        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_OBJID_TOO_LONG_STRING_FORM,
+                                                   "Object ID has a too long string form: %#x (max %#x)",
+                                                   cchObjId, RT_SIZEOFMEMB(RTASN1OBJID, szObjId));
+                    }
+                    return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_OBJID_TOO_MANY_COMPONENTS,
+                                               "Object ID has too many components: %#x (max 127)", cComponents);
+                }
+
+                /* next */
+                rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+            } while (rc > 0);
+        }
+        rc = RTAsn1CursorSetInfo(pCursor, rc, "Bad object ID component #%u encoding: %.*Rhxs",
+                                 cComponents, cbContent, pbContent);
+    }
+    else if (cbContent)
+        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_OBJID_ENCODING, "Object ID content is loo long: %#x", cbContent);
+    else
+        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_OBJID_ENCODING, "Zero length object ID content");
+    return rc;
+}
+
+
+
+RTDECL(int) RTAsn1ObjId_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OBJID pThis, const char *pszErrorTag)
+{
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_OID,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE, fFlags, pszErrorTag, "OID");
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Validate and count things first.
+             */
+            uint8_t cComponents = 0; /* gcc maybe-crap */
+            uint8_t cchObjId = 0;    /* ditto */
+            rc = rtAsn1ObjId_PreParse(pCursor->pbCur, pThis->Asn1Core.cb, pCursor, pszErrorTag, &cComponents, &cchObjId);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Allocate memory for the components array, either out of the
+                 * string buffer or off the heap.
+                 */
+                pThis->cComponents = cComponents;
+                RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+                if (cComponents * sizeof(uint32_t) <= sizeof(pThis->szObjId) - cchObjId - 1)
+                    pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - cComponents * sizeof(uint32_t)];
+                else
+#endif
+                    rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->pauComponents,
+                                         cComponents * sizeof(pThis->pauComponents[0]));
+                if (RT_SUCCESS(rc))
+                {
+                    uint32_t *pauComponents = (uint32_t *)pThis->pauComponents;
+
+                    /*
+                     * Deal with the two first components first since they are
+                     * encoded in a weird way to save a byte.
+                     */
+                    uint8_t const  *pbContent = pCursor->pbCur;
+                    uint32_t        cbContent = pThis->Asn1Core.cb;
+                    uint32_t        uValue;
+                    rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue); AssertRC(rc);
+                    if (RT_SUCCESS(rc))
+                    {
+                        pbContent += rc;
+                        cbContent -= rc;
+
+                        if (uValue < 80)
+                        {
+                            pauComponents[0] = uValue / 40;
+                            pauComponents[1] = uValue % 40;
+                        }
+                        else
+                        {
+                            pauComponents[0] = 2;
+                            pauComponents[1] = uValue - 2*40;
+                        }
+
+                        char  *pszObjId    = &pThis->szObjId[0];
+                        *pszObjId++        = g_achDigits[pauComponents[0]];
+                        size_t cbObjIdLeft = cchObjId + 1 - 1;
+
+                        rc = rtAsn1ObjId_InternalFormatComponent(pauComponents[1], &pszObjId, &cbObjIdLeft); AssertRC(rc);
+                        if (RT_SUCCESS(rc))
+                        {
+                            /*
+                             * The other components are encoded in less complicated manner.
+                             */
+                            for (uint32_t i = 2; i < cComponents; i++)
+                            {
+                                rc = rtAsn1ObjId_ReadComponent(pbContent, cbContent, &uValue);
+                                AssertRCBreak(rc);
+                                pbContent += rc;
+                                cbContent -= rc;
+                                pauComponents[i] = uValue;
+                                rc = rtAsn1ObjId_InternalFormatComponent(uValue, &pszObjId, &cbObjIdLeft);
+                                AssertRCBreak(rc);
+                            }
+                            if (RT_SUCCESS(rc))
+                            {
+                                Assert(cbObjIdLeft == 1);
+                                *pszObjId = '\0';
+
+                                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                                pThis->Asn1Core.pOps = &g_RTAsn1ObjId_Vtable;
+                                return VINF_SUCCESS;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    return rc;
+}
+
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-objid-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h
index 35b6d89..3f6f862 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-objid-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFOBJIDS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfObjIds
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfObjIds
+RTASN1TMPL_SEQ_OF(RTASN1OBJID, RTAsn1ObjId);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFOBJIDS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfObjIds
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfObjIds
+RTASN1TMPL_SET_OF(RTASN1OBJID, RTAsn1ObjId);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp
new file mode 100644
index 0000000..7cf0826
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-objid.cpp
@@ -0,0 +1,537 @@
+/* $Id: asn1-ut-objid.cpp $ */
+/** @file
+ * IPRT - ASN.1, OBJECT IDENTIFIER Type.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static char const       g_szDefault[] = "2.16.840.1.113894";
+static uint32_t const   g_auDefault[] = { 2, 16, 840, 1, 113894 };
+static uint8_t const    g_abDefault[] =
+{
+    2*40 + 16,  0x80 | (840 >> 7), 840 & 0x7f,  1,  0x80 | (113894 >> 14), 0x80 | ((113894 >> 7) & 0x7f), 113894 & 0x7f
+};
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+DECLHIDDEN(int) rtAsn1ObjId_InternalFormatComponent(uint32_t uValue, char **ppszObjId, size_t *pcbObjId); /* asn1-ut-objid.cpp */
+/** @todo check if we really need this. */
+
+
+
+/*
+ * ASN.1 OBJECT IDENTIFIER - Special Methods.
+ */
+
+/**
+ * Encodes the ASN.1 byte sequence for a set of components.
+ *
+ * @returns IPRT status code.
+ * @param   cComponents     The number of components. Must be at least two.
+ * @param   pauComponents   The components array.
+ * @param   pbEncoded       The output buffer.
+ * @param   pcbEncoded      On input, this holds the size of the output buffer.
+ *                          On successful return it's the encoded size in bytes.
+ */
+static int rtAsn1ObjId_EncodeComponents(uint32_t cComponents, uint32_t const *pauComponents,
+                                        uint8_t *pbEncoded, uint32_t *pcbEncoded)
+{
+    uint8_t *pbCur  = pbEncoded;
+    uint32_t cbLeft = *pcbEncoded;
+
+    /* The first two componets are encoded together to save a byte, so the loop
+       organization is a little special. */
+    AssertReturn(cComponents >= 2, VERR_ASN1_INTERNAL_ERROR_1);
+    AssertReturn(pauComponents[0] <= 2, VERR_ASN1_INTERNAL_ERROR_1);
+    AssertReturn(pauComponents[1] <= (pauComponents[0] < 2 ? 39 : UINT32_MAX - 80), VERR_ASN1_INTERNAL_ERROR_1);
+    uint32_t i = 1;
+    uint32_t uValue = pauComponents[0] * 40 + pauComponents[1];
+
+    for (;;)
+    {
+        if (uValue < 0x80)
+        {
+            if (RT_UNLIKELY(cbLeft < 1))
+                return VERR_BUFFER_OVERFLOW;
+            cbLeft  -= 1;
+            *pbCur++ = (uint8_t)uValue;
+        }
+        else if (uValue < 0x4000)
+        {
+            if (RT_UNLIKELY(cbLeft < 2))
+                return VERR_BUFFER_OVERFLOW;
+            cbLeft  -= 2;
+            pbCur[0] = (uValue >> 7) | 0x80;
+            pbCur[1] = uValue & 0x7f;
+            pbCur   += 2;
+        }
+        else if (uValue < 0x200000)
+        {
+            if (RT_UNLIKELY(cbLeft < 3))
+                return VERR_BUFFER_OVERFLOW;
+            cbLeft  -= 3;
+            pbCur[0] =  (uValue >> 14)         | 0x80;
+            pbCur[1] = ((uValue >>  7) & 0x7f) | 0x80;
+            pbCur[2] = uValue & 0x7f;
+            pbCur   += 3;
+        }
+        else if (uValue < 0x10000000)
+        {
+            if (RT_UNLIKELY(cbLeft < 4))
+                return VERR_BUFFER_OVERFLOW;
+            cbLeft  -= 4;
+            pbCur[0] =  (uValue >> 21)         | 0x80;
+            pbCur[1] = ((uValue >> 14) & 0x7f) | 0x80;
+            pbCur[2] = ((uValue >>  7) & 0x7f) | 0x80;
+            pbCur[3] = uValue & 0x7f;
+            pbCur   += 4;
+        }
+        else
+        {
+            if (RT_UNLIKELY(cbLeft < 5))
+                return VERR_BUFFER_OVERFLOW;
+            cbLeft  -= 5;
+            pbCur[0] =  (uValue >> 28)         | 0x80;
+            pbCur[1] = ((uValue >> 21) & 0x7f) | 0x80;
+            pbCur[2] = ((uValue >> 14) & 0x7f) | 0x80;
+            pbCur[3] = ((uValue >>  7) & 0x7f) | 0x80;
+            pbCur[4] = uValue & 0x7f;
+            pbCur   += 5;
+        }
+
+        /* Advance / return. */
+        i++;
+        if (i >= cComponents)
+        {
+            *pcbEncoded = (uint32_t)(pbCur - pbEncoded);
+            return VINF_SUCCESS;
+        }
+        uValue = pauComponents[i];
+    }
+}
+
+
+RTDECL(int) RTAsn1ObjId_InitFromString(PRTASN1OBJID pThis, const char *pszObjId, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RT_ZERO(*pThis);
+
+    /*
+     * Check the string, counting the number of components and checking their validity.
+     */
+    size_t cbObjId = strlen(pszObjId) + 1;
+    AssertReturn(cbObjId < sizeof(pThis->szObjId), VERR_ASN1_OBJID_TOO_LONG_STRING_FORM);
+
+    const char *psz = pszObjId;
+
+    /* Special checking of the first component. It has only three valid values: 0,1,2. */
+    char ch = *psz++;
+    if (RT_UNLIKELY(ch < '0' || ch > '2'))
+        return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+    char const chFirst = ch;
+    ch = *psz++;
+    if (RT_UNLIKELY(ch != '.'))
+        return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+    /* The 2nd component.  It the first is 0 or 1, it has a max of 39. */
+    uint32_t cComponents = 1;
+    if (chFirst < '2')
+    {
+        ch = *psz++;
+        if (*psz == '.')
+        {
+            if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+        }
+        else
+        {
+            if (RT_UNLIKELY(ch < '0' || ch > '3'))
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+            ch = *psz++;
+            if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+            if (*psz != '.')
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+        }
+        cComponents++;
+    }
+    else
+        psz--;
+
+    /* Subsequent components have max values of UINT32_MAX - 80. */
+    while ((ch = *psz++) != '\0')
+    {
+        if (RT_UNLIKELY(ch != '.'))
+            return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+        const char *pszStart = psz;
+
+        /* Special treatment of the first digit. Need to make sure it isn't an
+           unnecessary leading 0. */
+        ch = *psz++;
+        if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+            return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+        if (RT_UNLIKELY(ch == '0' && RT_C_IS_DIGIT(*psz)))
+            return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+        /* The rest of the digits. */
+        while ((ch = *psz) != '.' && ch != '\0')
+        {
+            if (RT_UNLIKELY(!RT_C_IS_DIGIT(ch)))
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+            psz++;
+        }
+
+        /* Check the value range. */
+        if (RT_UNLIKELY(psz - pszStart >= 9))
+            if (   psz - pszStart > 9
+                || strncmp(pszStart, "4294967216", 9) >= 0) /* 2^32 - 80 */
+                return VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+
+        cComponents++;
+    }
+
+    if (RT_UNLIKELY(cComponents >= 128))
+        return VERR_ASN1_OBJID_TOO_MANY_COMPONENTS;
+    pThis->cComponents = (uint8_t)cComponents;
+
+    /*
+     * Find space for the component array, either at the unused end of szObjId
+     * or on the heap.
+     */
+    int rc;
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+    size_t cbLeft = sizeof(pThis->szObjId) - cbObjId;
+    if (cbLeft >= cComponents * sizeof(uint32_t))
+    {
+        pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - cComponents * sizeof(uint32_t)];
+        cbLeft -= cComponents * sizeof(uint32_t);
+        rc = VINF_SUCCESS;
+    }
+    else
+#endif
+        rc = RTAsn1MemAllocZ(&pThis->Allocation, (void **)&pThis->pauComponents, cComponents * sizeof(uint32_t));
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Fill the elements array.
+         */
+        uint32_t *pauComponents = (uint32_t *)pThis->pauComponents;
+        rc  = VINF_SUCCESS;
+        psz = pszObjId;
+        for (uint32_t i = 0; i < cComponents; i++)
+        {
+            uint32_t uValue = 0;
+            rc = RTStrToUInt32Ex(psz, (char **)&psz, 10, &uValue);
+            if (rc == VWRN_TRAILING_CHARS)
+            {
+                pauComponents[i] = uValue;
+                AssertBreakStmt(*psz == '.', rc = VERR_TRAILING_CHARS);
+                psz++;
+            }
+            else if (rc == VINF_SUCCESS)
+            {
+                pauComponents[i] = uValue;
+                Assert(*psz == '\0');
+            }
+            else if (RT_FAILURE(rc))
+                break;
+            else
+            {
+                rc = -rc;
+                break;
+            }
+        }
+        if (rc == VINF_SUCCESS && *psz == '\0')
+        {
+            /*
+             * Initialize the core structure before we start on the encoded bytes.
+             */
+            RTAsn1Core_InitEx(&pThis->Asn1Core,
+                              ASN1_TAG_OID,
+                              ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                              &g_RTAsn1ObjId_Vtable,
+                              RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+
+            /*
+             * Encode the value into the string buffer. This will NOT overflow
+             * because the string representation is much less efficient than the
+             * binary ASN.1 representation (base-10 + separators vs. base-128).
+             */
+            pThis->Asn1Core.cb = (uint32_t)cbObjId;
+            rc = rtAsn1ObjId_EncodeComponents(cComponents, pThis->pauComponents,
+                                              (uint8_t *)&pThis->szObjId[0], &pThis->Asn1Core.cb);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Now, find a place for the encoded bytes.  There might be
+                 * enough room left in the szObjId for it if we're lucky.
+                 */
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+                if (pThis->Asn1Core.cb >= cbLeft)
+                    pThis->Asn1Core.uData.pv = memmove(&pThis->szObjId[cbObjId], &pThis->szObjId[0], pThis->Asn1Core.cb);
+                else
+#endif
+                    rc = RTAsn1ContentDup(&pThis->Asn1Core, pThis->szObjId, pThis->Asn1Core.cb, pAllocator);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Finally, copy the dotted string.
+                     */
+                    memcpy(pThis->szObjId, pszObjId, cbObjId);
+                    return VINF_SUCCESS;
+                }
+            }
+            else
+            {
+                AssertMsgFailed(("%Rrc\n", rc));
+                rc = VERR_ASN1_INTERNAL_ERROR_3;
+            }
+        }
+        else
+            rc = VERR_ASN1_OBJID_INVALID_DOTTED_STRING;
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1ObjId_CompareWithString(PCRTASN1OBJID pThis, const char *pszRight)
+{
+    return strcmp(pThis->szObjId, pszRight);
+}
+
+
+RTDECL(bool) RTAsn1ObjId_StartsWith(PCRTASN1OBJID pThis, const char *pszStartsWith)
+{
+    size_t cchStartsWith = strlen(pszStartsWith);
+    return !strncmp(pThis->szObjId, pszStartsWith, cchStartsWith)
+        && (   pszStartsWith[cchStartsWith] == '.'
+            || pszStartsWith[cchStartsWith] == '\0');
+}
+
+
+RTDECL(uint8_t) RTAsn1ObjIdCountComponents(PCRTASN1OBJID pThis)
+{
+    return pThis->cComponents;
+}
+
+
+RTDECL(uint32_t) RTAsn1ObjIdGetComponentsAsUInt32(PCRTASN1OBJID pThis, uint8_t iComponent)
+{
+    if (iComponent < pThis->cComponents)
+        return pThis->pauComponents[iComponent];
+    return UINT32_MAX;
+}
+
+
+RTDECL(uint32_t) RTAsn1ObjIdGetLastComponentsAsUInt32(PCRTASN1OBJID pThis)
+{
+    return pThis->pauComponents[pThis->cComponents - 1];
+}
+
+
+/*
+ * ASN.1 OBJECT IDENTIFIER - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1ObjId_Vtable =
+{
+    "RTAsn1ObjId",
+    sizeof(RTASN1OBJID),
+    ASN1_TAG_OID,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1ObjId_Delete,
+    NULL,
+    (PFNRTASN1COREVTCLONE)RTAsn1ObjId_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1ObjId_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1ObjId_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1ObjId_Init(PRTASN1OBJID pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RTAsn1Core_InitEx(&pThis->Asn1Core,
+                      ASN1_TAG_OID,
+                      ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1ObjId_Vtable,
+                      RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    pThis->Asn1Core.cb       = sizeof(g_abDefault);
+    pThis->Asn1Core.uData.pv = (void *)&g_abDefault[0];
+    pThis->cComponents       = RT_ELEMENTS(g_auDefault);
+    pThis->pauComponents     = g_auDefault;
+    AssertCompile(sizeof(g_szDefault) <= sizeof(pThis->szObjId));
+    memcpy(pThis->szObjId, g_szDefault, sizeof(g_szDefault));
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1ObjId_Clone(PRTASN1OBJID pThis, PCRTASN1OBJID pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1ObjId_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable, VERR_INTERNAL_ERROR_3);
+
+        /* Copy the dotted string representation. */
+        size_t cbObjId = strlen(pSrc->szObjId) + 1;
+        AssertReturn(cbObjId <= sizeof(pThis->szObjId), VERR_INTERNAL_ERROR_5);
+        memcpy(pThis->szObjId, pSrc->szObjId, cbObjId);
+
+        /* Copy the integer component array. Try fit it in the unused space of
+           the dotted object string buffer. We place it at the end of the
+           buffer as that is simple alignment wise and avoid wasting bytes that
+           could be used to sequueze in the content bytes (see below). */
+        int rc;
+        RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+        pThis->cComponents = pSrc->cComponents;
+        size_t cbLeft = sizeof(pThis->szObjId);
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+        if (pSrc->cComponents * sizeof(uint32_t) <= cbLeft)
+        {
+            pThis->pauComponents = (uint32_t *)&pThis->szObjId[sizeof(pThis->szObjId) - pSrc->cComponents * sizeof(uint32_t)];
+            memcpy((uint32_t *)pThis->pauComponents, pSrc->pauComponents, pSrc->cComponents * sizeof(uint32_t));
+            cbLeft -= pSrc->cComponents * sizeof(uint32_t);
+            rc = VINF_SUCCESS;
+        }
+        else
+#endif
+        {
+            rc = RTAsn1MemDup(&pThis->Allocation, (void **)&pThis->pauComponents, pSrc->pauComponents,
+                              pSrc->cComponents * sizeof(uint32_t));
+        }
+        if (RT_SUCCESS(rc))
+        {
+            /* See if we can fit the content value into the szObjId as well.
+               It will follow immediately after the string as the component
+               array is the end of the string buffer, when present. */
+#if 0 /** @todo breaks with arrays of ObjIds or structs containing them. They get resized and repositioned in memory, thus invalidating the pointer. Add recall-pointers callback, or just waste memory? Or maybe make all arrays pointer-arrays? */
+            uint32_t cbContent = pSrc->Asn1Core.cb;
+            if (cbContent <= cbLeft)
+            {
+                rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+                if (RT_SUCCESS(rc))
+                {
+                    pThis->Asn1Core.uData.pv = memcpy(&pThis->szObjId[cbObjId], pSrc->Asn1Core.uData.pv, cbContent);
+                    return VINF_SUCCESS;
+                }
+            }
+            else
+#endif
+            {
+                rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+                if (RT_SUCCESS(rc))
+                    return VINF_SUCCESS;
+            }
+        }
+
+        /* failed, clean up. */
+        if (pThis->Allocation.cbAllocated)
+            RTAsn1MemFree(&pThis->Allocation, (uint32_t *)pThis->pauComponents);
+        RT_ZERO(*pThis);
+        return rc;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1ObjId_Delete(PRTASN1OBJID pThis)
+{
+    if (   pThis
+        && RTAsn1ObjId_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable);
+
+        if (pThis->Allocation.cbAllocated)
+            RTAsn1MemFree(&pThis->Allocation, (uint32_t *)pThis->pauComponents);
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1ObjId_Enum(PRTASN1OBJID pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1ObjId_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1ObjId_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1ObjId_Compare(PCRTASN1OBJID pLeft, PCRTASN1OBJID pRight)
+{
+    if (!RTAsn1ObjId_IsPresent(pLeft) || RTAsn1ObjId_IsPresent(pRight))
+        return (int)RTAsn1ObjId_IsPresent(pLeft) - (int)RTAsn1ObjId_IsPresent(pRight);
+
+    uint8_t cComponents = RT_MIN(pLeft->cComponents, pRight->cComponents);
+    for (uint32_t i = 0; i < cComponents; i++)
+        if (pLeft->pauComponents[i] != pRight->pauComponents[i])
+            return pLeft->pauComponents[i] < pRight->pauComponents[i] ? -1 : 1;
+
+    if (pLeft->cComponents == pRight->cComponents)
+        return 0;
+    return pLeft->cComponents < pRight->cComponents ? -1 : 1;
+}
+
+
+RTDECL(int) RTAsn1ObjId_CheckSanity(PCRTASN1OBJID pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1ObjId_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (OBJID).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-objid-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp
new file mode 100644
index 0000000..b20d580
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-decode.cpp
@@ -0,0 +1,78 @@
+/* $Id: asn1-ut-octetstring-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, OCTET STRING Type, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1OctetString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1OCTETSTRING pThis,
+                                         const char *pszErrorTag)
+{
+    pThis->pEncapsulated = NULL;
+    RTAsn1CursorInitAllocation(pCursor, &pThis->EncapsulatedAllocation);
+
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, ASN1_TAG_OCTET_STRING,
+                                                  ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                                  fFlags, pszErrorTag, "OCTET STRING");
+        if (RT_SUCCESS(rc))
+        {
+            if (   !(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED)
+                || (fFlags & RTASN1CURSOR_GET_F_IMPLICIT) ) /* PKCS #7 ContentInfo tweak. */
+            {
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.pOps    = &g_RTAsn1OctetString_Vtable;
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                return VINF_SUCCESS;
+            }
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+                                     "%s: Constructed OCTET STRING not implemented.", pszErrorTag);
+        }
+        else
+            rc = RTAsn1CursorSetInfo(pCursor, rc, "%s: Not OCTET STRING: fClass=%#x / uTag=%#x",
+                                     pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+    }
+    return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-octetstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h
index 35b6d89..b196bf5 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-octetstring-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, Octet String Type, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFOCTETSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfOctetStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfOctetStrings
+RTASN1TMPL_SEQ_OF(RTASN1OCTETSTRING, RTAsn1OctetString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFOCTETSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfOctetStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfOctetStrings
+RTASN1TMPL_SET_OF(RTASN1OCTETSTRING, RTAsn1OctetString);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp
new file mode 100644
index 0000000..63d5857
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-octetstring.cpp
@@ -0,0 +1,426 @@
+/* $Id: asn1-ut-octetstring.cpp $ */
+/** @file
+ * IPRT - ASN.1, Octet String.
+ *
+ * @remarks This file should remain very similar to asn1-ut-bitstring.cpp.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/bignum.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+typedef struct RTASN1OCTETSTRINGWRITERCTX
+{
+    /** Pointer to the output buffer. */
+    uint8_t        *pbBuf;
+    /** The current buffer offset. */
+    uint32_t        offBuf;
+    /** The size of the buffer. */
+    uint32_t        cbBuf;
+} RTASN1OCTETSTRINGWRITERCTX;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ *  Used to refresh the content of octet and bit strings. } */
+static DECLCALLBACK(int) rtAsn1OctetStringEncodeWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+    RTASN1OCTETSTRINGWRITERCTX *pCtx = (RTASN1OCTETSTRINGWRITERCTX *)pvUser;
+    AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf,
+                 RTErrInfoSetF(pErrInfo, VERR_BUFFER_OVERFLOW,
+                               "cbToWrite=%#x offBuf=%#x cbBuf=%#x", cbToWrite, pCtx->cbBuf, pCtx->offBuf));
+    memcpy(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite);
+    pCtx->offBuf += (uint32_t)cbToWrite;
+    return VINF_SUCCESS;
+}
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER,
+ *  Used to compare the encoded raw content of an octet or bit string with the
+ *  encapsulated object. } */
+static DECLCALLBACK(int) rtAsn1OctetStringEncodeCompare(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+    RTASN1OCTETSTRINGWRITERCTX *pCtx = (RTASN1OCTETSTRINGWRITERCTX *)pvUser;
+    AssertReturn(cbToWrite <= pCtx->cbBuf - pCtx->offBuf, VERR_BUFFER_OVERFLOW);
+    if (!memcmp(&pCtx->pbBuf[pCtx->offBuf], pvBuf, cbToWrite) != 0)
+        return VERR_NOT_EQUAL;
+    pCtx->offBuf += (uint32_t)cbToWrite;
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * ASN.1 OCTET STRING - Specific Methods
+ */
+
+RTDECL(int) RTAsn1OctetString_RefreshContent(PRTASN1OCTETSTRING pThis, uint32_t fFlags,
+                                             PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+    AssertReturn(pThis->pEncapsulated, VERR_INVALID_STATE);
+
+    uint32_t cbEncoded;
+    int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->Asn1Core.cb = cbEncoded;
+
+        rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, cbEncoded, pAllocator);
+        if (RT_SUCCESS(rc))
+        {
+            /* Initialize the writer context. */
+            RTASN1OCTETSTRINGWRITERCTX Ctx;
+            Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+            Ctx.cbBuf  = cbEncoded;
+            Ctx.offBuf = 0;
+
+            rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeWriter, &Ctx, pErrInfo);
+            if (RT_SUCCESS(rc))
+            {
+                if (Ctx.offBuf == cbEncoded)
+                    return VINF_SUCCESS;
+
+                rc = RTErrInfoSetF(pErrInfo, rc, "Expected %#x bytes, got %#x", cbEncoded, Ctx.offBuf);
+            }
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, rc, "Error allocating %#x bytes for storing content\n", cbEncoded);
+    }
+    return rc;
+}
+
+
+RTDECL(bool) RTAsn1OctetString_AreContentBytesValid(PCRTASN1OCTETSTRING pThis, uint32_t fFlags)
+{
+    if (pThis->pEncapsulated)
+    {
+        /* Check the encoded length of the octets. */
+        uint32_t cbEncoded;
+        int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, NULL);
+        if (RT_FAILURE(rc))
+            return false;
+        if (pThis->Asn1Core.cb != cbEncoded)
+            return false;
+
+        /* Check the encoded bytes, if there are any. */
+        if (cbEncoded)
+        {
+            if (!pThis->Asn1Core.uData.pv)
+                return false;
+
+            /* Check the other bytes. */
+            RTASN1OCTETSTRINGWRITERCTX Ctx;
+            Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+            Ctx.cbBuf  = cbEncoded;
+            Ctx.offBuf = 0;
+            rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeCompare, &Ctx, NULL);
+            if (RT_FAILURE(rc))
+                return false;
+        }
+    }
+    return true;
+}
+
+
+/*
+ * ASN.1 OCTET STRING - Standard Methods.
+ */
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEPREP} */
+static DECLCALLBACK(int) RTAsn1OctetString_EncodePrep(PRTASN1CORE pThisCore, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    PRTASN1OCTETSTRING pThis = (PRTASN1OCTETSTRING)pThisCore;
+    if (!pThis->pEncapsulated)
+    {
+        Assert(pThis->Asn1Core.cb == 0 || pThis->Asn1Core.uData.pv);
+        return VINF_SUCCESS;
+    }
+
+    /* Figure out the size of the encapsulated content. */
+    uint32_t cbEncoded;
+    int rc = RTAsn1EncodePrepare(pThis->pEncapsulated, fFlags, &cbEncoded, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        /* Free the bytes if they don't match up.  */
+        if (pThis->Asn1Core.uData.pv)
+        {
+            bool fMustFree = pThis->Asn1Core.cb != cbEncoded;
+            if (!fMustFree)
+            {
+                RTASN1OCTETSTRINGWRITERCTX Ctx;
+                Ctx.pbBuf  = (uint8_t *)pThis->Asn1Core.uData.pu8;
+                Ctx.cbBuf  = cbEncoded;
+                Ctx.offBuf = 0;
+                rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, rtAsn1OctetStringEncodeCompare, &Ctx, NULL);
+                fMustFree = RT_FAILURE_NP(rc);
+            }
+            if (fMustFree)
+                RTAsn1ContentFree(&pThis->Asn1Core);
+        }
+
+        pThis->Asn1Core.cb = cbEncoded;
+        rc = RTAsn1EncodeRecalcHdrSize(&pThis->Asn1Core, fFlags, pErrInfo);
+    }
+    return rc;
+}
+
+
+/** @interface_method_impl{FNRTASN1COREVTENCODEWRITE} */
+static DECLCALLBACK(int) RTAsn1OctetString_EncodeWrite(PRTASN1CORE pThisCore, uint32_t fFlags, PFNRTASN1ENCODEWRITER pfnWriter,
+                                                       void *pvUser, PRTERRINFO pErrInfo)
+{
+    PRTASN1OCTETSTRING pThis = (PRTASN1OCTETSTRING)pThisCore;
+
+    /*
+     * First the header.
+     */
+    int rc = RTAsnEncodeWriteHeader(&pThis->Asn1Core, fFlags, pfnWriter, pvUser, pErrInfo);
+    if (RT_SUCCESS(rc) && rc != VINF_ASN1_NOT_ENCODED)
+    {
+        /*
+         * If nothing is encapsulated, the core points to the content (if we have any).
+         */
+        if (!pThis->pEncapsulated)
+        {
+            if (pThis->Asn1Core.cb > 0)
+                rc = pfnWriter(pThis->Asn1Core.uData.pu8, pThis->Asn1Core.cb, pvUser, pErrInfo);
+        }
+        /*
+         * Call upon the encapsulated content to serialize itself.
+         */
+        else
+            rc = RTAsn1EncodeWrite(pThis->pEncapsulated, fFlags, pfnWriter, pvUser, pErrInfo);
+    }
+    return rc;
+}
+
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1OctetString_Vtable =
+{
+    "OctetString",
+    sizeof(RTASN1OCTETSTRING),
+    ASN1_TAG_OCTET_STRING,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1OctetString_Delete,
+    (PFNRTASN1COREVTENUM)RTAsn1OctetString_Enum,
+    (PFNRTASN1COREVTCLONE)RTAsn1OctetString_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1OctetString_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1OctetString_CheckSanity,
+    RTAsn1OctetString_EncodePrep,
+    RTAsn1OctetString_EncodeWrite
+};
+
+
+RTDECL(int) RTAsn1OctetString_Init(PRTASN1OCTETSTRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RT_ZERO(*pThis);
+
+    RTAsn1Core_InitEx(&pThis->Asn1Core, ASN1_TAG_OCTET_STRING, ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1OctetString_Vtable, RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    /*pThis->pEncapsulated = NULL;*/
+    RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1OctetString_Clone(PRTASN1OCTETSTRING pThis, PCRTASN1OCTETSTRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+
+    RT_ZERO(*pThis);
+    if (RTAsn1OctetString_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable, VERR_INTERNAL_ERROR_3);
+
+        int rc;
+        if (!pSrc->pEncapsulated)
+            rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+        else
+            rc = RTAsn1Core_CloneNoContent(&pThis->Asn1Core, &pSrc->Asn1Core);
+        if (RT_FAILURE(rc))
+            return rc;
+
+        RTAsn1MemInitAllocation(&pThis->EncapsulatedAllocation, pAllocator);
+        if (pSrc->pEncapsulated)
+        {
+            PCRTASN1COREVTABLE pOps = pSrc->pEncapsulated->pOps;
+            Assert(!pOps || pOps->pfnClone);
+            if (pOps && pOps->pfnClone)
+            {
+                /* We can clone the decoded encapsulated object. */
+                rc = RTAsn1MemAllocZ(&pThis->EncapsulatedAllocation, (void **)&pThis->pEncapsulated, pOps->cbStruct);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = pOps->pfnClone(pThis->pEncapsulated, pSrc->pEncapsulated, pAllocator);
+                    if (RT_FAILURE(rc))
+                        RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+                }
+            }
+            else
+            {
+                /* Borrow the encapsulated pointer and use RTAsn1OctetString_RefreshContent
+                   to get an accurate copy of the bytes. */
+                pThis->pEncapsulated = pSrc->pEncapsulated;
+                rc = RTAsn1OctetString_RefreshContent(pThis, RTASN1ENCODE_F_DER, pAllocator, NULL);
+                pThis->pEncapsulated = NULL;
+            }
+            if (RT_FAILURE(rc))
+            {
+                RTAsn1ContentFree(&pThis->Asn1Core);
+                RT_ZERO(*pThis);
+                return rc;
+            }
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1OctetString_Delete(PRTASN1OCTETSTRING pThis)
+{
+    if (   pThis
+        && RTAsn1OctetString_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable);
+
+        /* Destroy the encapsulated object. */
+        if (pThis->pEncapsulated)
+        {
+            RTAsn1VtDelete(pThis->pEncapsulated);
+            if (pThis->EncapsulatedAllocation.cbAllocated)
+                RTAsn1MemFree(&pThis->EncapsulatedAllocation, pThis->pEncapsulated);
+        }
+
+        /* Delete content and wipe the content. */
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1OctetString_Enum(PRTASN1OCTETSTRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1OctetString_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable));
+
+    /* Enumerate the encapsulated object if present. */
+    if (pThis->pEncapsulated)
+        return pfnCallback(pThis->pEncapsulated, "Encapsulated", uDepth + 1, pvUser);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1OctetString_Compare(PCRTASN1OCTETSTRING pLeft, PCRTASN1OCTETSTRING pRight)
+{
+    Assert(pLeft  && (!RTAsn1OctetString_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1OctetString_Vtable));
+    Assert(pRight && (!RTAsn1OctetString_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1OctetString_Vtable));
+
+    int iDiff;
+    if (RTAsn1OctetString_IsPresent(pLeft))
+    {
+        if (RTAsn1OctetString_IsPresent(pRight))
+        {
+            /* Since it's really hard to tell whether encapsulated objects have
+               been modified or not, we might have to refresh both objects
+               while doing this compare.  We'll try our best to avoid it though. */
+            if (pLeft->pEncapsulated || pRight->pEncapsulated)
+            {
+                if (   pLeft->pEncapsulated
+                    && pRight->pEncapsulated
+                    && pLeft->pEncapsulated->pOps == pRight->pEncapsulated->pOps)
+                    iDiff = pLeft->pEncapsulated->pOps->pfnCompare(pLeft->pEncapsulated, pRight->pEncapsulated);
+                else
+                {
+                    /* No direct comparison of encapsulated objects possible,
+                       make sure we've got the rigth bytes then.  */
+                    if (   pLeft->pEncapsulated
+                        && !RTAsn1OctetString_AreContentBytesValid(pLeft, RTASN1ENCODE_F_DER))
+                    {
+                        int rc = RTAsn1OctetString_RefreshContent((PRTASN1OCTETSTRING)pLeft, RTASN1ENCODE_F_DER,
+                                                                  pLeft->EncapsulatedAllocation.pAllocator, NULL);
+                        AssertRC(rc);
+                    }
+
+                    if (   pRight->pEncapsulated
+                        && !RTAsn1OctetString_AreContentBytesValid(pRight, RTASN1ENCODE_F_DER))
+                    {
+                        int rc = RTAsn1OctetString_RefreshContent((PRTASN1OCTETSTRING)pRight, RTASN1ENCODE_F_DER,
+                                                                  pRight->EncapsulatedAllocation.pAllocator, NULL);
+                        AssertRC(rc);
+                    }
+
+                    /* Compare the content bytes. */
+                    iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+                }
+            }
+            /*
+             * No encapsulated object, just compare the raw content bytes.
+             */
+            else
+                iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+        }
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1OctetString_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1OctetString_CheckSanity(PCRTASN1OCTETSTRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1OctetString_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (OCTET STRING).", pszErrorTag);
+
+    if (pThis->pEncapsulated)
+        return pThis->pEncapsulated->pOps->pfnCheckSanity(pThis->pEncapsulated, fFlags & RTASN1_CHECK_SANITY_F_COMMON_MASK,
+                                                          pErrInfo, pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-octetstring-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp
new file mode 100644
index 0000000..f1a68b0
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-decode.cpp
@@ -0,0 +1,187 @@
+/* $Id: asn1-ut-string-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+RTDECL(int) RTAsn1String_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1STRING pThis, const char *pszErrorTag)
+{
+    RT_ZERO(*pThis);
+    AssertReturn(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT), VERR_INVALID_PARAMETER);
+
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Do tag matching.
+         */
+        switch (pThis->Asn1Core.uTag)
+        {
+            case ASN1_TAG_UTF8_STRING:
+            case ASN1_TAG_NUMERIC_STRING:
+            case ASN1_TAG_PRINTABLE_STRING:
+            case ASN1_TAG_T61_STRING:
+            case ASN1_TAG_VIDEOTEX_STRING:
+            case ASN1_TAG_IA5_STRING:
+            case ASN1_TAG_GENERALIZED_TIME:
+            case ASN1_TAG_GRAPHIC_STRING:
+            case ASN1_TAG_VISIBLE_STRING:
+            case ASN1_TAG_GENERAL_STRING:
+            case ASN1_TAG_UNIVERSAL_STRING:
+            case ASN1_TAG_BMP_STRING:
+                rc = VINF_SUCCESS;
+                break;
+            default:
+                rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_MISMATCH,
+                                         "%s: Not a string object: fClass=%#x / uTag=%#x",
+                                         pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+        }
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Match flags. CER/DER makes it complicated.
+             */
+            if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE))
+            {
+                /*
+                 * Primitive strings are simple.
+                 */
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.pOps    = &g_RTAsn1String_Vtable;
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+
+                /* UTF-8 conversion is done lazily, upon request. */
+                return VINF_SUCCESS;
+            }
+
+            if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED))
+            {
+                /*
+                 * Constructed strings are not yet fully implemented.
+                 */
+                if (pCursor->fFlags & RTASN1CURSOR_FLAGS_DER)
+                    rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+                                             "%s: DER encoding does not allow constructed strings (cb=%#x uTag=%#x fClass=%#x)",
+                                             pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uTag, pThis->Asn1Core.fClass);
+                else if (pCursor->fFlags & RTASN1CURSOR_FLAGS_CER)
+                {
+                    if (pThis->Asn1Core.cb > 1000)
+                        rc = VINF_SUCCESS;
+                    else
+                        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_ILLEGAL_CONSTRUCTED_STRING,
+                                                 "%s: Constructed strings only allowed for >1000 byte in CER encoding: cb=%#x uTag=%#x fClass=%#x",
+                                                 pszErrorTag, pThis->Asn1Core.cb,
+                                                 pThis->Asn1Core.uTag, pThis->Asn1Core.fClass);
+                }
+                /** @todo implement constructed strings. */
+                if (RT_SUCCESS(rc))
+                    rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+                                             "%s: Support for constructed strings is not implemented", pszErrorTag);
+            }
+            else
+                rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+                                         "%s: Not a valid string object: fClass=%#x / uTag=%#x",
+                                         pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+        }
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+/**
+ * Common worker for the specific string type getters.
+ *
+ * @returns IPRT status code
+ * @param   pCursor             The cursor.
+ * @param   fFlags              The RTASN1CURSOR_GET_F_XXX flags.
+ * @param   uTag                The string tag.
+ * @param   pThis               The output object.
+ * @param   pszErrorTag         The error tag.
+ * @param   pszWhat             The string type name.
+ */
+static int rtAsn1XxxString_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, uint8_t uTag, PRTASN1STRING pThis,
+                                      const char *pszErrorTag, const char *pszWhat)
+{
+    pThis->cchUtf8 = 0;
+    pThis->pszUtf8 = NULL;
+
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlagsString(pCursor, &pThis->Asn1Core, uTag,
+                                                  ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                                  fFlags, pszErrorTag, pszWhat);
+        if (RT_SUCCESS(rc))
+        {
+            if (!(pThis->Asn1Core.fClass & ASN1_TAGFLAG_CONSTRUCTED))
+            {
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.pOps    = &g_RTAsn1String_Vtable;
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                RTAsn1CursorInitAllocation(pCursor, &pThis->Allocation);
+                /* UTF-8 conversion is done lazily, upon request. */
+                return VINF_SUCCESS;
+            }
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CONSTRUCTED_STRING_NOT_IMPL,
+                                     "%s: Constructed %s not implemented.", pszErrorTag, pszWhat);
+        }
+    }
+    return rc;
+}
+
+
+/*
+ * Generate code for the tag specific decoders.
+ */
+#define RTASN1STRING_IMPL(a_uTag, a_szTag, a_Api) \
+    RTDECL(int) RT_CONCAT(a_Api,_DecodeAsn1)(PRTASN1CURSOR pCursor, uint32_t fFlags, \
+                                             PRTASN1STRING pThis, const char *pszErrorTag) \
+    { \
+        return rtAsn1XxxString_DecodeAsn1(pCursor, fFlags, a_uTag, pThis, pszErrorTag, a_szTag); \
+    }
+#include "asn1-ut-string-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-string-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-string-template.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-string-template.h
index 35b6d89..12915b8 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-string-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, XXX STRING Types, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,22 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfStrings
+RTASN1TMPL_SEQ_OF(RTASN1STRING, RTAsn1String);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#define RTASN1TMPL_TYPE         RTASN1SETOFSTRINGS
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfStrings
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfStrings
+RTASN1TMPL_SET_OF(RTASN1STRING, RTAsn1String);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h b/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h
new file mode 100644
index 0000000..0f835e4
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string-template2.h
@@ -0,0 +1,39 @@
+/* $Id: asn1-ut-string-template2.h $ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types, Template for type specific wrappers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+RTASN1STRING_IMPL(ASN1_TAG_NUMERIC_STRING,      "NUMERIC STRING",   RTAsn1NumericString)
+RTASN1STRING_IMPL(ASN1_TAG_PRINTABLE_STRING,    "PRINTABLE STRING", RTAsn1PrintableString)
+RTASN1STRING_IMPL(ASN1_TAG_T61_STRING,          "T61 STRING",       RTAsn1T61String)
+RTASN1STRING_IMPL(ASN1_TAG_VIDEOTEX_STRING,     "VIDEOTEX STRING",  RTAsn1VideotexString)
+RTASN1STRING_IMPL(ASN1_TAG_VISIBLE_STRING,      "VISIBLE STRING",   RTAsn1VisibleString)
+RTASN1STRING_IMPL(ASN1_TAG_IA5_STRING,          "IA5 STRING",       RTAsn1Ia5String)
+RTASN1STRING_IMPL(ASN1_TAG_GRAPHIC_STRING,      "GRAPHIC STRING",   RTAsn1GraphicString)
+RTASN1STRING_IMPL(ASN1_TAG_GENERAL_STRING,      "GENERAL STRING",   RTAsn1GeneralString)
+RTASN1STRING_IMPL(ASN1_TAG_UTF8_STRING,         "UTF8 STRING",      RTAsn1Utf8String)
+RTASN1STRING_IMPL(ASN1_TAG_BMP_STRING,          "BMP STRING",       RTAsn1BmpString)
+RTASN1STRING_IMPL(ASN1_TAG_UNIVERSAL_STRING,    "UNIVERSAL STRING", RTAsn1UniversalString)
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp
new file mode 100644
index 0000000..f11a8ba
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-string.cpp
@@ -0,0 +1,1824 @@
+/* $Id: asn1-ut-string.cpp $ */
+/** @file
+ * IPRT - ASN.1, XXX STRING Types.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static uint8_t const g_acbStringTags[] =
+{
+    /* [ASN1_TAG_EOC]               = */ 0,
+    /* [ASN1_TAG_BOOLEAN]           = */ 0,
+    /* [ASN1_TAG_INTEGER]           = */ 0,
+    /* [ASN1_TAG_BIT_STRING]        = */ 0,
+    /* [ASN1_TAG_OCTET_STRING]      = */ 0,
+    /* [ASN1_TAG_NULL]              = */ 0,
+    /* [ASN1_TAG_OID]               = */ 0,
+    /* [ASN1_TAG_OBJECT_DESCRIPTOR] = */ 0,
+    /* [ASN1_TAG_EXTERNAL]          = */ 0,
+    /* [ASN1_TAG_REAL]              = */ 0,
+    /* [ASN1_TAG_ENUMERATED]        = */ 0,
+    /* [ASN1_TAG_EMBEDDED_PDV]      = */ 0,
+    /* [ASN1_TAG_UTF8_STRING]       = */ 1,
+    /* [ASN1_TAG_RELATIVE_OID]      = */ 0,
+    /* [ASN1_TAG_RESERVED_14]       = */ 0,
+    /* [ASN1_TAG_RESERVED_15]       = */ 0,
+    /* [ASN1_TAG_SEQUENCE]          = */ 0,
+    /* [ASN1_TAG_SET]               = */ 0,
+    /* [ASN1_TAG_NUMERIC_STRING]    = */ 1,
+    /* [ASN1_TAG_PRINTABLE_STRING]  = */ 1,
+    /* [ASN1_TAG_T61_STRING]        = */ 1,
+    /* [ASN1_TAG_VIDEOTEX_STRING]   = */ 1,
+    /* [ASN1_TAG_IA5_STRING]        = */ 1,
+    /* [ASN1_TAG_UTC_TIME]          = */ 0,
+    /* [ASN1_TAG_GENERALIZED_TIME]  = */ 0,
+    /* [ASN1_TAG_GRAPHIC_STRING]    = */ 1,
+    /* [ASN1_TAG_VISIBLE_STRING]    = */ 1,
+    /* [ASN1_TAG_GENERAL_STRING]    = */ 1,
+    /* [ASN1_TAG_UNIVERSAL_STRING]  = */ 4,
+    /* [ASN1_TAG_CHARACTER_STRING]  = */ 1,
+    /* [ASN1_TAG_BMP_STRING]        = */ 2,
+};
+
+
+
+
+/*
+ * ISO/IEC-2022 + TeletexString mess.
+ */
+
+/**
+ * ISO-2022 codepoint mappings.
+ */
+typedef struct RTISO2022MAP
+{
+    /** The number of bytes per character. */
+    uint8_t         cb;
+    /** The registration number. */
+    uint16_t        uRegistration;
+    /** The size of the pauToUni table. */
+    uint16_t        cToUni;
+    /** Pointer to the convertion table from ISO-2022 to Unicode.
+     * ASSUMES that unicode chars above 0xffff won't be required.  */
+    uint16_t const *pauToUni;
+
+    /** Escape sequence for loading into G0 or C0 or C1 depending on the type (sans
+     * ESC). */
+    uint8_t         abEscLoadXX[6];
+    /** Escape sequence for loading into G1 (sans ESC). */
+    uint8_t         abEscLoadG1[6];
+    /** Escape sequence for loading into G2 (sans ESC). */
+    uint8_t         abEscLoadG2[6];
+    /** Escape sequence for loading into G3 (sans ESC). */
+    uint8_t         abEscLoadG3[6];
+} RTISO2022MAP;
+/** Pointer to const ISO-2022 mappings. */
+typedef RTISO2022MAP const *PCRTISO2022MAP;
+
+/** Unused codepoint value. */
+#define RTISO2022_UNUSED    UINT16_C(0xffff)
+
+
+/** Dummy mappings to avoid dealing with NULL pointers in the decoder
+ *  registers. */
+static const RTISO2022MAP g_DummyMap =
+{
+    1, UINT16_MAX, 0,  NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G0 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G1 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G2 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* No escape into G3 */
+};
+
+
+/** GL mappings for ISO-IR-168 (Japanese, update of #87), with space and
+ *  delete. */
+static const RTISO2022MAP g_IsoIr168Map =
+{
+    //2, 168, RT_ELEMENTS(g_awcIsoIr168Decode), g_awcIsoIr168Decode,
+    2, 168, 0, NULL,
+    { 0x26, 0x40, 0x2b, 0x24, 0x42, 0xff } /* Esc into G0 */,
+    { 0x26, 0x40, 0x2b, 0x24, 0x29, 0x42 } /* Esc into G1 */,
+    { 0x26, 0x40, 0x2b, 0x24, 0x2a, 0x42 } /* Esc into G2 */,
+    { 0x26, 0x40, 0x2b, 0x24, 0x2b, 0x42 } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-165 (Chinese), with space and delete. */
+static const RTISO2022MAP g_IsoIr165Map =
+{
+    //2, 165, RT_ELEMENTS(g_awcIsoIr165Decode), g_awcIsoIr165Decode,
+    2, 165, 0, NULL,
+    { 0x24, 0x28, 0x45, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x24, 0x29, 0x45, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x24, 0x2a, 0x45, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x24, 0x2b, 0x45, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-150 (Greek), with space and delete. */
+static const RTISO2022MAP g_IsoIr150Map =
+{
+    //1, 150, RT_ELEMENTS(g_awcIsoIr150Decode), g_awcIsoIr150Decode,
+    1, 150, 0, NULL,
+    { 0x28, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x29, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2a, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2b, 0x21, 0x40, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-103 (Teletex supplementary), with space and
+ *  delete. */
+static const RTISO2022MAP g_IsoIr103Map =
+{
+    //1, 103, RT_ELEMENTS(g_awcIsoIr103Decode), g_awcIsoIr103Decode,
+    1, 103, 0, NULL,
+    { 0x28, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x29, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2a, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2b, 0x76, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/**
+ * GL mapping from ISO-IR-102 (Teletex primary) to unicode, with space and
+ * delete.
+ *
+ * Mostly 1:1, except that (a) what would be dollar is currency sign, (b)
+ * positions 0x5c, 0x5e, 0x7b, 0x7d and 0x7e are defined not to be used.
+ */
+static uint16_t const g_awcIsoIr102Decode[0x60] =
+{
+    0x0020, 0x0021, 0x0022, 0x0023, 0x00A4, 0x0025, 0x0026, 0x0027,  0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,  0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,  0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,  0x0058, 0x0059, 0x005a, 0x005b, 0xffff, 0x005d, 0xffff, 0x005f,
+    0xffff, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,  0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,  0x0078, 0x0079, 0x007a, 0xffff, 0x007c, 0xffff, 0xffff, 0x007f,
+};
+
+/** GL mappings for ISO-IR-102, with space and delete. */
+static const RTISO2022MAP g_IsoIr102Map =
+{
+    1, 102, RT_ELEMENTS(g_awcIsoIr102Decode), g_awcIsoIr102Decode,
+    { 0x28, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x29, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2a, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2b, 0x75, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL mappings for ISO-IR-87 (Japanese),  with space and delete. */
+static const RTISO2022MAP g_IsoIr87Map =
+{
+    //1, 87, RT_ELEMENTS(g_awcIsoIr87Decode), g_awcIsoIr97Decode,
+    1, 87, 0, NULL,
+    { 0x24, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x24, 0x29, 0x42, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x24, 0x2a, 0x42, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x24, 0x2b, 0x42, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/**
+ * GL mapping from ISO-IR-6 (ASCII) to unicode, with space and delete.
+ *
+ * Completely 1:1.
+ */
+static uint16_t const g_awcIsoIr6Decode[0x60] =
+{
+    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,  0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,  0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,  0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,  0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,  0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,  0x0078, 0x0079, 0x007a, 0x006b, 0x007c, 0x007d, 0x007e, 0x007f,
+};
+
+/** GL mappings for ISO-IR-6 (ASCII), with space and delete. */
+static const RTISO2022MAP g_IsoIr6Map =
+{
+    1, 6, RT_ELEMENTS(g_awcIsoIr6Decode), g_awcIsoIr6Decode,
+    { 0x28, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x29, 0x42, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GL maps. */
+static PCRTISO2022MAP g_paGLMaps[] =
+{
+    &g_IsoIr6Map,
+    &g_IsoIr102Map,
+    &g_IsoIr103Map,
+    &g_IsoIr150Map,
+    &g_IsoIr165Map,
+    &g_IsoIr168Map,
+};
+
+
+
+/** GR mappings for ISO-IR-164 (Hebrew supplementary). */
+static const RTISO2022MAP g_IsoIr164Map =
+{
+    //1, 164, RT_ELEMENTS(g_awcIsoIr164Decode), g_awcIsoIr164Decode
+    1, 164, 0, NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x2d, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2e, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2f, 0x53, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-156 (Supplementary for ASCII (#6)). */
+static const RTISO2022MAP g_IsoIr156Map =
+{
+    //1, 156, RT_ELEMENTS(g_awcIsoIr156Decode), g_awcIsoIr156Decode
+    1, 156, 0, NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x2d, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2e, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2f, 0x52, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-153 (Basic Cyrillic). */
+static const RTISO2022MAP g_IsoIr153Map =
+{
+    //1, 153, RT_ELEMENTS(g_awcIsoIr153Decode), g_awcIsoIr153Decode
+    1, 153, 0, NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x2d, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2e, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2f, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-144 (Cryllic part of Latin/Cyrillic). */
+static const RTISO2022MAP g_IsoIr144Map =
+{
+    //1, 144, RT_ELEMENTS(g_awcIsoIr144Decode), g_awcIsoIr144Decode
+    1, 144, 0, NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x2d, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2e, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2f, 0x4f, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR mappings for ISO-IR-126 (Latin/Greek). */
+static const RTISO2022MAP g_IsoIr126Map =
+{
+    //1, 126, RT_ELEMENTS(g_awcIsoIr126Decode), g_awcIsoIr126Decode
+    1, 126, 0, NULL,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* Esc into G0 */,
+    { 0x2d, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G1 */,
+    { 0x2e, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G2 */,
+    { 0x2f, 0x46, 0xff, 0xff, 0xff, 0xff } /* Esc into G3 */,
+};
+
+
+/** GR maps. */
+static PCRTISO2022MAP g_paGRMaps[] =
+{
+    &g_IsoIr126Map,
+    &g_IsoIr144Map,
+    &g_IsoIr153Map,
+    &g_IsoIr156Map,
+    &g_IsoIr164Map,
+};
+
+
+
+/** C0 mapping from ISO-IR-106 to unicode. */
+static uint16_t g_awcIsoIr106Decode[0x20] =
+{
+    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,  0x0008, 0xffff, 0x000a, 0xffff, 0x000c, 0x000d, 0x000e, 0x000f,
+    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,  0xffff, 0x008e, 0x000a, 0x001b, 0xffff, 0x008f, 0xffff, 0xffff,
+};
+
+/** C0 mappings for ISO-IR-106. */
+static const RTISO2022MAP g_IsoIr106Map =
+{
+    1, 106, RT_ELEMENTS(g_awcIsoIr106Decode), g_awcIsoIr106Decode,
+    { 0x21, 0x45, 0xff, 0xff, 0xff, 0xff } /* Esc into C0 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+};
+
+/** C0 maps. */
+static PCRTISO2022MAP g_paC0Maps[] =
+{
+    &g_IsoIr106Map,
+};
+
+
+
+/** C1 mapping from ISO-IR-107 to unicode. */
+static uint16_t g_awcIsoIr107Decode[0x20] =
+{
+    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,  0xffff, 0xffff, 0xffff, 0x008b, 0x008c, 0xffff, 0xffff, 0xffff,
+    0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,  0xffff, 0xffff, 0xffff, 0x009b, 0xffff, 0xffff, 0xffff, 0xffff,
+};
+
+/** C1 mappings for ISO-IR-107. */
+static const RTISO2022MAP g_IsoIr107Map =
+{
+    1, 107, RT_ELEMENTS(g_awcIsoIr107Decode), g_awcIsoIr107Decode,
+    { 0x22, 0x48, 0xff, 0xff, 0xff, 0xff } /* Esc into C1 */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } /* N/A */,
+};
+
+/** C1 maps. */
+static PCRTISO2022MAP g_paC1Maps[] =
+{
+    &g_IsoIr107Map,
+};
+
+
+static int rtIso2022Decoder_LookupAndSet(PCRTISO2022MAP *ppMapRet, uint16_t uRegistration, PCRTISO2022MAP *papMaps, uint32_t cMaps)
+{
+    uint32_t i = cMaps;
+    while (i-- > 0)
+        if (papMaps[i]->uRegistration == uRegistration)
+        {
+            /** @todo skip non-Teletex codesets if we ever add more than we need for it. */
+            *ppMapRet = papMaps[i];
+            return VINF_SUCCESS;
+        }
+    return VERR_ASN1_INVALID_T61_STRING_ENCODING;
+}
+
+
+/**
+ * ISO-2022 decoder state.
+ */
+typedef struct RTISO2022DECODERSTATE
+{
+    /** Pointer to the string */
+    uint8_t const          *pabString;
+    /** The string size. */
+    uint32_t                cbString;
+    /** The current string position. */
+    uint32_t                offString;
+
+    /** The GL mapping. */
+    PCRTISO2022MAP          pMapGL;
+    /** The GR mapping. */
+    PCRTISO2022MAP          pMapGR;
+    /** The lower control set (C0) mapping. */
+    PCRTISO2022MAP          pMapC0;
+    /** The higher control set (C1) mapping. */
+    PCRTISO2022MAP          pMapC1;
+    /** The G0, G1, G2, and G3 mappings. */
+    PCRTISO2022MAP          apMapGn[4];
+    /** Used by SS2 & SS3 to store the orignal GL value that is to be restored. */
+    PCRTISO2022MAP          pRestoreGL;
+    /** Pointer to extended error info buffer, optional. */
+    PRTERRINFO              pErrInfo;
+} RTISO2022DECODERSTATE;
+/** Pointer to a const ISO-2022 decoder state. */
+typedef RTISO2022DECODERSTATE *PRTISO2022DECODERSTATE;
+
+
+static int rtIso2022Decoder_SetGL(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pNewMap)
+{
+    pThis->pMapGL = pNewMap;
+    return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetGR(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pNewMap)
+{
+    pThis->pMapGR = pNewMap;
+    return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetGLForOneChar(PRTISO2022DECODERSTATE pThis, PCRTISO2022MAP pTmpMap)
+{
+    pThis->pRestoreGL = pThis->pMapGL;
+    pThis->pMapGL     = pTmpMap;
+    return VINF_SUCCESS;
+}
+
+
+static int rtIso2022Decoder_SetC0(PRTISO2022DECODERSTATE pThis, uint16_t uRegistration)
+{
+    return rtIso2022Decoder_LookupAndSet(&pThis->pMapC0, uRegistration, g_paC0Maps, RT_ELEMENTS(g_paC0Maps));
+}
+
+
+static int rtIso2022Decoder_SetC1(PRTISO2022DECODERSTATE pThis, uint16_t uRegistration)
+{
+    return rtIso2022Decoder_LookupAndSet(&pThis->pMapC1, uRegistration, g_paC1Maps, RT_ELEMENTS(g_paC1Maps));
+}
+
+
+/**
+ * Worker for rtIso2022Decoder_FindEscAndSet.
+ *
+ * @returns true if match, false if not.
+ * @param   pabLeft     Pointer to the first string byte after the ESC.
+ * @param   cbLeft      The number of bytes left in the string.
+ * @param   pabRight    Pointer to the abEscLoad* byte array to match with.
+ * @param   cbRight     Size of the mapping sequence (fixed).
+ * @param   pcchMatch   Where to return the length of the escape sequence (sans
+ *                      ESC) on success.
+ */
+static bool rtIso2022Decoder_MatchEscSeqFrom2ndByte(uint8_t const *pabLeft, uint32_t cbLeft,
+                                                   uint8_t const *pabRight, uint32_t cbRight,
+                                                   uint32_t *pcchMatch)
+{
+    Assert(cbRight == 6);
+    uint32_t i = 1;
+    while (i < cbRight)
+    {
+        if (pabRight[i] == 0xff)
+            break;
+        if (cbLeft <= i || pabLeft[i] != pabRight[i])
+            return false;
+        i++;
+    }
+    *pcchMatch = i;
+    return true;
+}
+
+
+/**
+ * Finds a the set with a matching abEscLoad* escape sequence and loads it into
+ * the designated register.
+ *
+ * @returns The length of the sequence on success, negative error status code on
+ *          failure.
+ * @param   pThis               The decoder instance.
+ * @param   ppMapRet            Used to specify C0 or C1 maps when processing
+ *                              escape sequences for loading these.  Only the
+ *                              abEscLoadXX arrays will be searched if this is
+ *                              not NULL.  For loading {G0,...,G3} pass NULL.
+ * @param   pb                  Pointer to the start of the escape sequence.
+ * @param   cb                  The number of bytes remaining in the string.
+ * @param   papMaps             The maps to search.
+ * @param   cMaps               The number of maps @a papMaps points to.
+ */
+static int rtIso2022Decoder_FindEscAndSet(PRTISO2022DECODERSTATE pThis,
+                                          PCRTISO2022MAP *ppMapRet, PCRTISO2022MAP *papMaps, uint32_t cMaps)
+{
+    /* Skip the ESC.*/
+    uint8_t const  *pb = &pThis->pabString[pThis->offString + 1];
+    uint32_t        cb = pThis->cbString - (pThis->offString + 1);
+
+    /* Cache the first char. */
+    uint8_t const b0 = pb[0];
+
+    /* Scan the array of maps for matching sequences. */
+    uint32_t i = cMaps;
+    while (i-- > 0)
+    {
+        uint32_t cchMatch;
+        PCRTISO2022MAP pMap = papMaps[i];
+        /** @todo skip non-Teletex codesets if we ever add more than we need for it. */
+        if (   pMap->abEscLoadXX[0] == b0
+            && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadXX, sizeof(pMap->abEscLoadXX), &cchMatch) )
+        {
+            if (ppMapRet)
+                *ppMapRet         = pMap;
+            else
+                pThis->apMapGn[0] = pMap;
+            return cchMatch + 1;
+        }
+        else if (!ppMapRet) /* ppMapRet is NULL if Gn. */
+        {
+            uint32_t iGn;
+            if (   pMap->abEscLoadG1[0] == b0
+                && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG1, sizeof(pMap->abEscLoadG1), &cchMatch))
+                iGn = 1;
+            else if (   pMap->abEscLoadG2[0] == b0
+                     && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG2, sizeof(pMap->abEscLoadG2), &cchMatch))
+                iGn = 2;
+            else if (   pMap->abEscLoadG3[0] == b0
+                     && rtIso2022Decoder_MatchEscSeqFrom2ndByte(pb, cb, pMap->abEscLoadG3, sizeof(pMap->abEscLoadG3), &cchMatch))
+                iGn = 3;
+            else
+                iGn = UINT32_MAX;
+            if (iGn != UINT32_MAX)
+            {
+                pThis->apMapGn[iGn] = pMap;
+                return cchMatch + 1;
+            }
+        }
+    }
+    return VERR_ASN1_TELETEX_UNSUPPORTED_CHARSET;
+}
+
+
+/**
+ * Interprets an escape sequence.
+ *
+ * @returns The length of the sequence on success, negative error status code on
+ *          failure.
+ * @param   pThis               The decoder instance.  The offString must be
+ *                              pointing to the escape byte.
+ */
+static int rtIso2022Decoder_InterpretEsc(PRTISO2022DECODERSTATE pThis)
+{
+    /* the first escape byte. */
+    uint32_t offString = pThis->offString;
+    if (offString + 1 >= pThis->cbString)
+        return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                             "@%u: Unexpected EOS parsing ESC...", offString);
+    int rc;
+    switch (pThis->pabString[offString + 1])
+    {
+        /*
+         * GL selection:
+         */
+        case 0x6e: /* Lock shift two: G2 -> GL */
+            rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[2]);
+            break;
+        case 0x6f: /* Lock shift three: G3 -> GL */
+            rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[3]);
+            break;
+        case 0x4e:  /* Single shift two:  G2 -> GL for one char. */
+            rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[2]);
+            break;
+        case 0x4f: /* Single shift three: G3 -> GL for one char. */
+            rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[3]);
+            break;
+
+        /*
+         * GR selection:
+         */
+        case 0x7e: /* Locking shift one right:   G1 -> GR. */
+            rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[1]);
+            break;
+        case 0x7d: /* Locking shift two right:   G2 -> GR. */
+            rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[2]);
+            break;
+        case 0x7c: /* Locking shift three right: G3 -> GR. */
+            rc = rtIso2022Decoder_SetGR(pThis, pThis->apMapGn[3]);
+            break;
+
+        /*
+         * Cx selection:
+         */
+        case 0x21: /* C0-designate */
+            return rtIso2022Decoder_FindEscAndSet(pThis, &pThis->pMapC0, g_paC0Maps, RT_ELEMENTS(g_paC0Maps));
+        case 0x22: /* C1-designate */
+            return rtIso2022Decoder_FindEscAndSet(pThis, &pThis->pMapC1, g_paC1Maps, RT_ELEMENTS(g_paC1Maps));
+
+        /*
+         * Single-byte character set selection.
+         */
+        case 0x28: /* G0-designate, 94 chars. */
+        case 0x29: /* G1-designate, 94 chars. */
+        case 0x2a: /* G2-designate, 94 chars. */
+        case 0x2b: /* G3-designate, 94 chars. */
+            return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+        case 0x2c: /* G0-designate, 96 chars. */
+        case 0x2d: /* G1-designate, 96 chars. */
+        case 0x2e: /* G2-designate, 96 chars. */
+        case 0x2f: /* G3-designate, 96 chars. */
+            return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGRMaps, RT_ELEMENTS(g_paGRMaps));
+
+        /*
+         * Multibyte character set selection.
+         */
+        case 0x24:
+            if (offString + 2 >= pThis->cbString)
+                return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                     "@%u: Unexpected EOS parsing ESC %#x...", offString, pThis->pabString[offString + 1]);
+            switch (pThis->pabString[offString + 2])
+            {
+                case 0x28: /* G0-designate, 94^n chars. */
+                case 0x29: /* G1-designate, 94^n chars. */
+                case 0x2a: /* G2-designate, 94^n chars. */
+                case 0x2b: /* G3-designate, 94^n chars. */
+                default:   /* G0-designate that skips the 0x28? (See japanese ones.) */
+                    return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+                case 0x2c: /* G0-designate, 96^n chars. */
+                case 0x2d: /* G1-designate, 96^n chars. */
+                case 0x2e: /* G2-designate, 96^n chars. */
+                case 0x2f: /* G3-designate, 96^n chars. */
+                    return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGRMaps, RT_ELEMENTS(g_paGRMaps));
+            }                                            \
+            break;
+
+        case 0x26: /* Special escape prefix for #168. */
+            return rtIso2022Decoder_FindEscAndSet(pThis, NULL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+
+        /*
+         * Unknown/unsupported/unimplemented.
+         */
+        case 0x25: /* Designate other coding system. */
+            return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_TELETEX_UNSUPPORTED_ESC_SEQ,
+                                 "@%u: ESC DOCS not supported\n", offString);
+        default:
+            return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_TELETEX_UNKNOWN_ESC_SEQ,
+                                 "@%u: Unknown escape sequence: ESC %#x...\n", offString, pThis->pabString[offString + 1]);
+    }
+
+    /* Only single byte escapes sequences for shifting ends up here. */
+    if (RT_SUCCESS(rc))
+        return 1;
+    return rc;
+}
+
+
+static int rtIso2022Decoder_ControlCharHook(PRTISO2022DECODERSTATE pThis, uint16_t wcControl)
+{
+    int rc;
+    switch (wcControl)
+    {
+        case 0x000e: /* Locking shift zero: G0 -> GL. */
+            rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[0]);
+            break;
+
+        case 0x000f: /* Locking shift one:  G1 -> GL. */
+            rc = rtIso2022Decoder_SetGL(pThis, pThis->apMapGn[1]);
+            break;
+
+        case 0x008e:  /* Single shift two:  G2 -> GL for one char. */
+            rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[2]);
+            break;
+
+        case 0x008f: /* Single shift three: G3 -> GL for one char. */
+            rc = rtIso2022Decoder_SetGLForOneChar(pThis, pThis->apMapGn[3]);
+            break;
+
+        case 0x002b: /* Escape should be handled by the caller. */
+            rc = rtIso2022Decoder_InterpretEsc(pThis);
+            break;
+
+        default:
+            return 0;
+    }
+
+    return RT_SUCCESS(rc) ? 1 : rc;
+}
+
+
+static int rtIso2022Decoder_Init(PRTISO2022DECODERSTATE pThis, const char *pchString, uint32_t cchString,
+                                 uint32_t uGL, uint32_t uC0, uint32_t uC1, uint32_t uG0,
+                                 PRTERRINFO pErrInfo)
+{
+    pThis->pabString  = (uint8_t const *)pchString;
+    pThis->cbString   = cchString;
+    pThis->offString  = 0;
+
+    pThis->pMapGL     = &g_DummyMap;
+    pThis->pMapGR     = &g_DummyMap;
+    pThis->pMapC0     = &g_DummyMap;
+    pThis->pMapC1     = &g_DummyMap;
+    pThis->pRestoreGL = NULL;
+    pThis->apMapGn[0] = &g_DummyMap;
+    pThis->apMapGn[1] = &g_DummyMap;
+    pThis->apMapGn[2] = &g_DummyMap;
+    pThis->apMapGn[3] = &g_DummyMap;
+    pThis->pErrInfo   = pErrInfo;
+
+    int rc = VINF_SUCCESS;
+    if (uGL != UINT32_MAX)
+        rc = rtIso2022Decoder_LookupAndSet(&pThis->pMapGL,     uGL, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+    if (RT_SUCCESS(rc) && uG0 != UINT32_MAX)
+        rc = rtIso2022Decoder_LookupAndSet(&pThis->apMapGn[0], uG0, g_paGLMaps, RT_ELEMENTS(g_paGLMaps));
+    if (RT_SUCCESS(rc) && uC0 != UINT32_MAX)
+        rc = rtIso2022Decoder_SetC0(pThis, uC0);
+    if (RT_SUCCESS(rc) && uC1 != UINT32_MAX)
+        rc = rtIso2022Decoder_SetC1(pThis, uC1);
+    return rc;
+}
+
+
+static int rtIso2022Decoder_GetNextUniCpSlow(PRTISO2022DECODERSTATE pThis, PRTUNICP pUniCp)
+{
+    while (pThis->offString < pThis->cbString)
+    {
+        uint8_t  b = pThis->pabString[pThis->offString];
+        if (!(b & 0x80))
+        {
+            if (b >= 0x20)
+            {
+                /*
+                 * GL range.
+                 */
+                b -= 0x20;
+                PCRTISO2022MAP pMap = pThis->pMapGL;
+
+                /* Single byte character map. */
+                if (pMap->cb == 1)
+                {
+                    if (RT_LIKELY(b < pMap->cToUni))
+                    {
+                        uint16_t wc = pMap->pauToUni[b];
+                        if (RT_LIKELY(wc != RTISO2022_UNUSED))
+                        {
+                            *pUniCp = wc;
+                            pThis->offString += 1;
+                            return VINF_SUCCESS;
+                        }
+                        *pUniCp = RTUNICP_INVALID;
+                        return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                             "@%u: GL b=%#x is marked unused in map #u range %u.",
+                                             pThis->offString, b + 0x20, pMap->uRegistration, pMap->cToUni);
+                    }
+                    *pUniCp = RTUNICP_INVALID;
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: GL b=%#x is outside map #u range %u.",
+                                         pThis->offString, b + 0x20, pMap->uRegistration, pMap->cToUni);
+                }
+
+                /* Double byte character set. */
+                Assert(pMap->cb == 2);
+                if (pThis->offString + 1 < pThis->cbString)
+                {
+                    uint8_t b2 = pThis->pabString[pThis->offString + 1];
+                    b2 -= 0x20;
+                    if (RT_LIKELY(b2 < 0x60))
+                    {
+                        uint16_t u16 = ((uint16_t)b << 8) | b2;
+                        if (RT_LIKELY(u16 < pMap->cToUni))
+                        {
+                            uint16_t wc = pMap->pauToUni[b];
+                            if (RT_LIKELY(wc != RTISO2022_UNUSED))
+                            {
+                                *pUniCp = wc;
+                                pThis->offString += 2;
+                                return VINF_SUCCESS;
+                            }
+                            *pUniCp = RTUNICP_INVALID;
+                            return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                                 "@%u: GL b=%#x is marked unused in map #u.",
+                                                 pThis->offString, b + 0x20, pMap->uRegistration);
+                        }
+                        if (u16 >= 0x7f00)
+                        {
+                            *pUniCp = 0x7f; /* delete */
+                            pThis->offString += 2;
+                            return VINF_SUCCESS;
+                        }
+                        *pUniCp = RTUNICP_INVALID;
+                        return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                             "@%u: GL u16=%#x (b0=%#x b1=%#x) is outside map #u range %u.",
+                                             pThis->offString, u16, b + 0x20, b2 + 0x20, pMap->uRegistration, pMap->cToUni);
+                    }
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: 2nd GL byte outside GL range: b0=%#x b1=%#x (map #u)",
+                                         pThis->offString, b + 0x20, b2 + 0x20, pMap->uRegistration);
+
+                }
+                return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                     "@%u: EOS reading 2nd byte for GL b=%#x (map #u).",
+                                     pThis->offString, b + 0x20, pMap->uRegistration);
+            }
+            else
+            {
+                /*
+                 * C0 range.
+                 */
+                Assert(pThis->pMapC0->cb == 0x20);
+                uint16_t wc = pThis->pMapC0->pauToUni[b];
+                if (wc != RTISO2022_UNUSED)
+                {
+                    int rc;
+                    if (b == 0x1b || wc == 0x1b) /* ESC is hardcoded, or so they say. */
+                        rc = rtIso2022Decoder_InterpretEsc(pThis);
+                    else
+                        rc = rtIso2022Decoder_ControlCharHook(pThis, wc);
+                    if (RT_SUCCESS(rc))
+                    {
+                        if (rc == 0)
+                        {
+                            pThis->offString += 1;
+                            *pUniCp = wc;
+                            return VINF_SUCCESS;
+                        }
+                        pThis->offString += rc;
+                    }
+                    else
+                        return rc;
+                }
+                else
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: C0 b=%#x is marked unused in map #u.",
+                                         pThis->offString, b, pThis->pMapC0->uRegistration);
+            }
+        }
+        else
+        {
+            if (b >= 0xa0)
+            {
+                /*
+                 * GR range.
+                 */
+                b -= 0xa0;
+                PCRTISO2022MAP pMap = pThis->pMapGR;
+
+                /* Single byte character map. */
+                if (pMap->cb == 1)
+                {
+                    /** @todo 0xa0 = SPACE and 0xff = DELETE if it's a 94 charater map... */
+                    if (RT_LIKELY(b < pMap->cToUni))
+                    {
+                        uint16_t wc = pMap->pauToUni[b];
+                        if (RT_LIKELY(wc != RTISO2022_UNUSED))
+                        {
+                            *pUniCp = wc;
+                            pThis->offString += 1;
+                            return VINF_SUCCESS;
+                        }
+
+                        *pUniCp = RTUNICP_INVALID;
+                        return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                             "@%u: GR b=%#x is marked unused in map #u.",
+                                             pThis->offString, b + 0xa0, pMap->uRegistration);
+                    }
+                    *pUniCp = RTUNICP_INVALID;
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: GR b=%#x is outside map #u range %u",
+                                         pThis->offString, b + 0xa0, pMap->uRegistration, pMap->cToUni);
+                }
+
+                /* Double byte character set. */
+                Assert(pMap->cb == 2);
+                if (pThis->offString + 1 < pThis->cbString)
+                {
+                    uint8_t b2 = pThis->pabString[pThis->offString + 1];
+                    b2 -= 0xa0;
+                    if (RT_LIKELY(b2 < 0x60))
+                    {
+                        uint16_t u16 = ((uint16_t)b << 8) | b2;
+                        if (RT_LIKELY(u16 < pMap->cToUni))
+                        {
+                            uint16_t wc = pMap->pauToUni[b];
+                            if (RT_LIKELY(wc != RTISO2022_UNUSED))
+                            {
+                                *pUniCp = wc;
+                                pThis->offString += 2;
+                                return VINF_SUCCESS;
+                            }
+
+                            *pUniCp = RTUNICP_INVALID;
+                            return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                                 "@%u: GR b=%#x is marked unused in map #u.",
+                                                 pThis->offString, b + 0xa0, pMap->uRegistration);
+                        }
+                        *pUniCp = RTUNICP_INVALID;
+                        return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                             "@%u: GR u16=%#x (b0=%#x b1=%#x) is outside map #u range %u.",
+                                             pThis->offString, u16, b + 0xa0, b2 + 0xa0, pMap->uRegistration, pMap->cToUni);
+                    }
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: 2nd GR byte outside GR range: b0=%#x b1=%#x (map #u).",
+                                         pThis->offString, b + 0xa0, b2 + 0xa0, pMap->uRegistration);
+
+                }
+                return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                     "@%u: EOS reading 2nd byte for GR b=%#x (map #u).",
+                                     pThis->offString, b + 0xa0, pMap->uRegistration);
+            }
+            else
+            {
+                /*
+                 * C2 range.
+                 */
+                Assert(pThis->pMapC1->cb == 0x20);
+                b -= 0x80;
+                uint16_t wc = pThis->pMapC1->pauToUni[b];
+                if (wc != RTISO2022_UNUSED)
+                {
+                    int rc = rtIso2022Decoder_ControlCharHook(pThis, wc);
+                    if (RT_SUCCESS(rc))
+                    {
+                        if (rc == 0)
+                        {
+                            pThis->offString += 1;
+                            *pUniCp = wc;
+                            return VINF_SUCCESS;
+                        }
+                        pThis->offString += rc;
+                    }
+                    else
+                        return rc;
+                }
+                else
+                    return RTErrInfoSetF(pThis->pErrInfo, VERR_ASN1_INVALID_T61_STRING_ENCODING,
+                                         "@%u: C1 b=%#x is marked unused in map #u.",
+                                         pThis->offString, b + 0x80, pThis->pMapC1->uRegistration);
+            }
+        }
+    }
+
+    /* End of string. */
+    *pUniCp = RTUNICP_INVALID;
+    return VERR_END_OF_STRING;
+}
+
+DECLINLINE(int) rtIso2022Decoder_GetNextUniCp(PRTISO2022DECODERSTATE pThis, PRTUNICP pUniCp)
+{
+    /*
+     * Deal with single byte GL.
+     */
+    uint32_t const offString = pThis->offString;
+    if (pThis->offString < pThis->cbString)
+    {
+        PCRTISO2022MAP const pMapGL = pThis->pMapGL;
+        if (pMapGL->cb == 1)
+        {
+            uint8_t const b = pThis->pabString[offString] - (uint8_t)0x20;
+            if (b < pMapGL->cToUni)
+            {
+                uint16_t wc = pMapGL->pauToUni[b];
+                if (wc != RTISO2022_UNUSED)
+                {
+                    pThis->offString = offString + 1;
+                    *pUniCp = wc;
+                    return VINF_SUCCESS;
+                }
+            }
+        }
+
+        /*
+         * Deal with complications in the non-inline function.
+         */
+        return rtIso2022Decoder_GetNextUniCpSlow(pThis, pUniCp);
+    }
+
+    *pUniCp = RTUNICP_INVALID;
+    return VERR_END_OF_STRING;
+}
+
+
+static int rtIso2022ValidateString(uint32_t uProfile, const char *pch, uint32_t cch, size_t *pcchUtf8, PRTERRINFO pErrInfo)
+{
+    AssertReturn(uProfile == ASN1_TAG_T61_STRING, VERR_INVALID_PARAMETER); /* just a place holder for now. */
+
+    RTISO2022DECODERSTATE Decoder;
+    int rc = rtIso2022Decoder_Init(&Decoder, pch, cch, 102, 106, 107, 102, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        size_t cchUtf8 = 0;
+        for (;;)
+        {
+            RTUNICP uc;
+            rc = rtIso2022Decoder_GetNextUniCp(&Decoder, &uc);
+            if (RT_SUCCESS(rc))
+                cchUtf8 += RTStrCpSize(uc);
+            else
+            {
+                if (RT_LIKELY(rc == VERR_END_OF_STRING))
+                {
+                    *pcchUtf8 = cchUtf8;
+                    return VINF_SUCCESS;
+                }
+                return rc;
+            }
+        }
+    }
+    return rc;
+}
+
+
+static int rtIso2022RecodeAsUtf8(uint32_t uProfile, const char *pchSrc, uint32_t cchSrc, char *pszDst, size_t cbDst)
+{
+    AssertReturn(uProfile == ASN1_TAG_T61_STRING, VERR_INVALID_PARAMETER); /* just a place holder for now. */
+    AssertReturn(cbDst > 0, VERR_INVALID_PARAMETER);
+
+    RTISO2022DECODERSTATE Decoder;
+    int rc = rtIso2022Decoder_Init(&Decoder, pchSrc, cchSrc, 102, 106, 107, 102, NULL /*pErrInfo*/);
+    if (RT_SUCCESS(rc))
+    {
+        size_t cchUtf8 = 0;
+        for (;;)
+        {
+            RTUNICP uc;
+            rc = rtIso2022Decoder_GetNextUniCp(&Decoder, &uc);
+            if (RT_SUCCESS(rc))
+            {
+                if (uc < 0x80 && cbDst > 1)
+                {
+                    *pszDst++ = (char)uc;
+                    cbDst--;
+                }
+                else
+                {
+                    size_t cchUniCp = RTStrCpSize(uc);
+                    if (cbDst > cchUniCp)
+                    {
+                        cbDst -= cchUniCp;
+                        pszDst = RTStrPutCp(pszDst, uc);
+                    }
+                    else
+                    {
+                        *pszDst = '\0';
+                        return VERR_BUFFER_OVERFLOW;
+                    }
+                }
+            }
+            else if (RT_LIKELY(rc == VERR_END_OF_STRING))
+            {
+                *pszDst = '\0';
+                return VINF_SUCCESS;
+            }
+            else
+                return rc;
+        }
+    }
+    return rc;
+}
+
+
+
+/** The unicode mapping of the C1 area of windows codepage 1252.
+ * The rest of the code page is 1:1 with unicode.   */
+static uint16_t g_awcWin1252_C1[0x20] =
+{
+    0x20ac, 0x0081, 0x201a, 0x0192,  0x201e, 0x2026, 0x2020, 0x2021,  0x02c6, 0x2030, 0x0160, 0x2039,  0x0152, 0x008d, 0x017d, 0x008f,
+    0x0090, 0x2018, 0x2019, 0x201c,  0x201d, 0x2022, 0x2013, 0x2014,  0x02dc, 0x2122, 0x0161, 0x203a,  0x0153, 0x009d, 0x017e, 0x0178,
+};
+
+
+static size_t rtWin1252CalcUtf8Length(const char *pch, uint32_t cch)
+{
+    size_t cchUtf8 = 0;
+    while (cch-- > 0)
+    {
+        uint8_t const b = *pch++;
+        if (b < 0x80)
+            cchUtf8 += 1;
+        else if (b >= 0xa0)
+            cchUtf8 += 2;
+        else
+        {
+            uint16_t const wc = g_awcWin1252_C1[b - 0x80];
+            cchUtf8 += RTStrCpSize(wc);
+        }
+    }
+    return cchUtf8;
+}
+
+
+static int rtWin1252RecodeAsUtf8(const char *pchSrc, uint32_t cchSrc, char *pszDst, size_t cbDst)
+{
+    while (cchSrc-- > 0)
+    {
+        uint8_t b = *pchSrc++;
+        if (b < 0x80)
+        {
+            if (cbDst <= 1)
+                return VERR_BUFFER_OVERFLOW;
+            *pszDst++ = (char)b;
+        }
+        else
+        {
+            uint16_t const wc = b >= 0xa0 ? b : g_awcWin1252_C1[b - 0x80];
+            size_t         cchCp = RTStrCpSize(wc);
+            if (cbDst <= cchCp)
+                return VERR_BUFFER_OVERFLOW;
+            pszDst = RTStrPutCp(pszDst, wc);
+        }
+    }
+
+    if (!cbDst)
+        return VERR_BUFFER_OVERFLOW;
+    *pszDst = '\0';
+    return VINF_SUCCESS;
+}
+
+
+
+/*
+ * ASN.1 STRING - Specific Methods.
+ */
+
+/** rtAsn1String_IsTeletexLatin1 results. */
+typedef enum RTASN1TELETEXVARIANT
+{
+    /** Couldn't find hard evidence of either. */
+    RTASN1TELETEXVARIANT_UNDECIDED = 1,
+    /** Pretty certain that it's real teletex. */
+    RTASN1TELETEXVARIANT_TELETEX,
+    /** Pretty sure it's latin-1 or Windows-1252. */
+    RTASN1TELETEXVARIANT_LATIN1,
+    /** Pretty sure it's Windows-1252. */
+    RTASN1TELETEXVARIANT_WIN_1252
+} RTASN1TELETEXVARIANT;
+
+/**
+ * Takes a guess as whether TELETEX STRING (T61 STRING) is actually is Latin-1
+ * or the real thing.
+ *
+ * According to RFC-2459, section 4.1.2.4, various libraries, certificate
+ * authorities and others have perverted the TeletexString/T61String tag by
+ * ISO-8859-1 (aka latin-1) strings (more probably these are actually Windows
+ * CP-1252 rather than latin-1).  We'll try detect incompatible latin-1
+ * perversions by:
+ *      - The use of GR (0xf0-0xff) chars.
+ *      - The lack of ESC sequences and shifts (LS0,LS1,SS2,SS3)
+ *
+ * An ASSUMTION here is that GR is not loaded with anything at the start of a
+ * teletex string, as per table 3 in section 8.23.5.2 in T-REC-X.590.200811.
+ *
+ * @retval  @c true if chances are good that it's LATIN-1.
+ * @retval  @c false if changes are very good that it's real teletex.
+ * @param   pch         The first char in the string.
+ * @param   cch         The string length.
+ *
+ * @remarks Useful info on Teletex and ISO/IEC-2022:
+ *          https://www.mail-archive.com/asn1@asn1.org/msg00460.html
+ *          http://en.wikipedia.org/wiki/ISO/IEC_2022
+ *          http://www.open-std.org/cen/tc304/guide/GCONCEPT.HTM
+ *          http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-035.pdf
+ */
+static RTASN1TELETEXVARIANT rtAsn1String_IsTeletexLatin1(const char *pch, uint32_t cch)
+{
+    RTASN1TELETEXVARIANT enmVariant = RTASN1TELETEXVARIANT_UNDECIDED;
+    while (cch-- > 0)
+    {
+        uint8_t const b = *pch;
+        if (b >= 0x20 && b <= 0x7f)
+        {
+            if (g_awcIsoIr102Decode[b - 0x20] == RTISO2022_UNUSED)
+                enmVariant = RTASN1TELETEXVARIANT_LATIN1;
+        }
+        else
+        {
+            if (   b == 0x1b /* ESC */
+                || b == 0x0e /* LS0 / SI */
+                || b == 0x0f /* LS1 / SO */
+                || b == 0x19 /* SS2 */
+                || b == 0x1d /* SS3 */ )
+                return RTASN1TELETEXVARIANT_TELETEX;
+
+            if (b >= 0xa0)
+                enmVariant = RTASN1TELETEXVARIANT_LATIN1;
+            else if (b >= 0x80 && b <= 0x9f)
+            {
+                /* Any use of C1 characters defined by windows cp-1252 will
+                   lead us to believe it's the windows code rather than the
+                   ISO/IEC standard that is being used.  (Not that it makes
+                   much of a difference, because we're gonna treat it as the
+                   windows codepage, anyways.) */
+                if (   b != 0x81
+                    && b != 0x8d
+                    && b != 0x8f
+                    && b != 0x90
+                    && b != 0x9d)
+                    return RTASN1TELETEXVARIANT_WIN_1252;
+            }
+        }
+    }
+    return RTASN1TELETEXVARIANT_UNDECIDED;
+}
+
+
+/**
+ * Checks the encoding of an ASN.1 string according to it's tag.
+ *
+ * @returns IPRT status code.
+ * @param   pThis       The string to santity check.
+ * @param   pErrInfo    Where to store extra error info.  Optional.
+ * @param   pcchUtf8    Where to return the UTF-8 string length.  Optional.
+ */
+static int rtAsn1String_CheckSanity(PCRTASN1STRING pThis, PRTERRINFO pErrInfo, const char *pszErrorTag, size_t *pcchUtf8)
+{
+    int         rc;
+    uint32_t    cch     = pThis->Asn1Core.cb;
+    size_t      cchUtf8 = cch;
+    const char *pch     = pThis->Asn1Core.uData.pch;
+    uint32_t    uTag    = RTASN1CORE_GET_TAG(&pThis->Asn1Core);
+    switch (uTag)
+    {
+        case ASN1_TAG_UTF8_STRING:
+            rc = RTStrValidateEncodingEx(pch, cch, 0);
+            if (RT_SUCCESS(rc))
+                break;
+            return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UTF8_STRING_ENCODING,
+                                 "%s: Bad UTF-8 encoding (%Rrc)", pszErrorTag, rc);
+
+        case ASN1_TAG_NUMERIC_STRING:
+            while (cch-- > 0)
+            {
+                char ch = *pch++;
+                if (   !RT_C_IS_DIGIT(ch)
+                    && ch != ' ')
+                    return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_NUMERIC_STRING_ENCODING,
+                                         "%s: Bad numberic string: ch=%#x", pszErrorTag, ch);
+            }
+            break;
+
+        case ASN1_TAG_PRINTABLE_STRING:
+            while (cch-- > 0)
+            {
+                char ch = *pch++;
+                if (   !RT_C_IS_ALNUM(ch)
+                    && ch != ' '
+                    && ch != '\''
+                    && ch != '('
+                    && ch != ')'
+                    && ch != '+'
+                    && ch != ','
+                    && ch != '-'
+                    && ch != '.'
+                    && ch != '/'
+                    && ch != ':'
+                    && ch != '='
+                    && ch != '?'
+                   )
+                    return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_PRINTABLE_STRING_ENCODING,
+                                         "%s: Bad printable string: ch=%#x", pszErrorTag, ch);
+            }
+            break;
+
+        case ASN1_TAG_IA5_STRING: /* ASCII */
+            while (cch-- > 0)
+            {
+                unsigned char ch = *pch++;
+                if (ch == 0 || ch >= 0x80)
+                    return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_IA5_STRING_ENCODING,
+                                         "%s: Bad IA5 string: ch=%#x", pszErrorTag, ch);
+            }
+            break;
+
+        case ASN1_TAG_T61_STRING:
+            switch (rtAsn1String_IsTeletexLatin1(pch, cch))
+            {
+                default:
+                    rc = rtIso2022ValidateString(ASN1_TAG_T61_STRING, pch, cch, &cchUtf8, pErrInfo);
+                    if (RT_FAILURE(rc))
+                        return rc;
+                    break;
+                case RTASN1TELETEXVARIANT_UNDECIDED:
+                case RTASN1TELETEXVARIANT_LATIN1:
+                case RTASN1TELETEXVARIANT_WIN_1252:
+                    cchUtf8 = rtWin1252CalcUtf8Length(pch, cch);
+                    break;
+            }
+            break;
+
+        case ASN1_TAG_VIDEOTEX_STRING:
+        case ASN1_TAG_GRAPHIC_STRING:
+            return VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED;
+
+        case ASN1_TAG_VISIBLE_STRING:
+            while (cch-- > 0)
+            {
+                unsigned char ch = *pch++;
+                if (ch < 0x20 || ch >= 0x7f)
+                    return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_VISIBLE_STRING_ENCODING,
+                                         "%s: Bad visible string: ch=%#x", pszErrorTag, ch);
+            }
+            break;
+
+        case ASN1_TAG_GENERAL_STRING:
+            return VERR_ASN1_STRING_TYPE_NOT_IMPLEMENTED;
+
+        case ASN1_TAG_UNIVERSAL_STRING:
+            if (!(cch & 3))
+            {
+                uint8_t const *pb = (uint8_t const *)pch;
+                cchUtf8 = 0;
+                while (cch > 0)
+                {
+                    RTUNICP uc = RT_MAKE_U32_FROM_U8(pb[3], pb[2], pb[1], pb[0]); /* big endian */
+                    if (!RTUniCpIsValid(uc))
+                        return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING,
+                                             "%s: Bad universal string: uc=%#x", pszErrorTag, uc);
+                    cchUtf8 += RTUniCpCalcUtf8Len(uc);
+
+                    /* next */
+                    pb  += 4;
+                    cch -= 4;
+                }
+                break;
+            }
+            return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_UNIVERSAL_STRING_ENCODING,
+                                 "%s: Bad universal string: size not a multiple of 4: cch=%#x", pszErrorTag, cch);
+
+        case ASN1_TAG_BMP_STRING:
+            if (!(cch & 1))
+            {
+                uint8_t const *pb = (uint8_t const *)pch;
+                cchUtf8 = 0;
+                while (cch > 0)
+                {
+                    RTUNICP uc = RT_MAKE_U32_FROM_U8(pb[1], pb[0], 0, 0); /* big endian */
+                    if (!RTUniCpIsValid(uc))
+                        return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_BMP_STRING_ENCODING,
+                                             "%s: Bad BMP string: uc=%#x", pszErrorTag, uc);
+                    cchUtf8 += RTUniCpCalcUtf8Len(uc);
+
+                    /* next */
+                    pb  += 2;
+                    cch -= 2;
+                }
+                break;
+            }
+            return RTErrInfoSetF(pErrInfo, VERR_ASN1_INVALID_BMP_STRING_ENCODING,
+                                 "%s: Bad BMP string: odd number of bytes cch=%#x", pszErrorTag, cch);
+
+        default:
+            AssertMsgFailedReturn(("uTag=%#x\n", uTag), VERR_INTERNAL_ERROR_3);
+    }
+
+    if (pcchUtf8)
+        *pcchUtf8 = cchUtf8;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_CompareValues(PCRTASN1STRING pLeft, PCRTASN1STRING pRight)
+{
+    return RTAsn1String_CompareEx(pLeft, pRight, false /*fTypeToo*/);
+}
+
+
+RTDECL(int) RTAsn1String_CompareEx(PCRTASN1STRING pLeft, PCRTASN1STRING pRight, bool fTypeToo)
+{
+    Assert(pLeft  && (!RTAsn1String_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1String_Vtable));
+    Assert(pRight && (!RTAsn1String_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+
+    int iDiff;
+    if (RTAsn1String_IsPresent(pLeft))
+    {
+        if (RTAsn1String_IsPresent(pRight))
+        {
+            if (!fTypeToo || RTASN1CORE_GET_TAG(&pLeft->Asn1Core) == RTASN1CORE_GET_TAG(&pRight->Asn1Core))
+                iDiff = RTAsn1Core_CompareEx(&pLeft->Asn1Core, &pRight->Asn1Core, true /*fIgnoreTagAndClass*/);
+            else
+                iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < RTASN1CORE_GET_TAG(&pRight->Asn1Core) ? -1 : 1;
+        }
+        else
+            iDiff = 1;
+    }
+    else
+        iDiff = 0 - RTAsn1String_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1String_CompareWithString(PCRTASN1STRING pThis, const char *pszString, size_t cchString)
+{
+    Assert(pThis && (!RTAsn1String_IsPresent(pThis) || pThis->Asn1Core.pOps  == &g_RTAsn1String_Vtable));
+    AssertPtr(pszString);
+
+    int iDiff;
+    if (RTAsn1String_IsPresent(pThis))
+    {
+        if (cchString == RTSTR_MAX)
+            cchString = strlen(pszString);
+
+        /*
+         * If there is a UTF-8 conversion available already, use it.
+         */
+        if (pThis->pszUtf8)
+        {
+            iDiff = strncmp(pThis->pszUtf8, pszString, cchString);
+            if (!iDiff && pThis->cchUtf8 != cchString)
+                iDiff = pThis->cchUtf8 < cchString ? -1 : 1;
+        }
+        else
+        {
+            /*
+             * Some types are UTF-8 compatible, so try do the compare without
+             * RTAsn1String_QueryUtf8.
+             */
+            uint32_t    cch = pThis->Asn1Core.cb;
+            const char *pch = pThis->Asn1Core.uData.pch;
+            switch (RTASN1CORE_GET_TAG(&pThis->Asn1Core))
+            {
+                case ASN1_TAG_UTF8_STRING:
+                case ASN1_TAG_NUMERIC_STRING:
+                case ASN1_TAG_IA5_STRING:
+                case ASN1_TAG_PRINTABLE_STRING:
+                    iDiff = strncmp(pch, pszString, RT_MIN(cch, cchString));
+                    if (iDiff && cch != cchString)
+                        iDiff = cch < cchString ? - 1 : 1;
+                    break;
+
+                /** @todo Implement compating ASN1_TAG_BMP_STRING, ASN1_TAG_UNIVERSAL_STRING and
+                 *        ASN1_TAG_T61_STRING with UTF-8 strings without conversion. */
+
+                default:
+                {
+                    int rc = RTAsn1String_QueryUtf8(pThis, NULL, NULL);
+                    if (RT_SUCCESS(rc))
+                    {
+                        iDiff = strncmp(pThis->pszUtf8, pszString, cchString);
+                        if (!iDiff && pThis->cchUtf8 != cchString)
+                            iDiff = pThis->cchUtf8 < cchString ? -1 : 1;
+                    }
+                    else
+                        iDiff = -1;
+                    break;
+                }
+            }
+        }
+
+        /* Reduce the strcmp return value. */
+        if (iDiff != 0)
+            iDiff = iDiff < 0 ? -1 : 1;
+    }
+    else
+        iDiff = -1;
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1String_QueryUtf8(PCRTASN1STRING pThis, const char **ppsz, size_t *pcch)
+{
+    Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+    char    *psz = (char *)pThis->pszUtf8;
+    size_t   cch = pThis->cchUtf8;
+    if (!psz)
+    {
+
+        /*
+         * Convert the first time around.  Start by validating the encoding and
+         * calculating the length.
+         */
+        int rc = rtAsn1String_CheckSanity(pThis, NULL, NULL, &cch);
+        if (RT_SUCCESS(rc))
+        {
+            PRTASN1STRING pThisNC = (PRTASN1STRING)pThis;
+            rc = RTAsn1MemAllocZ(&pThisNC->Allocation, (void **)&psz, cch + 1);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Got memory, now do the actual convertion to UTF-8 / copying.
+                 */
+                switch (RTASN1CORE_GET_TAG(&pThis->Asn1Core))
+                {
+                    case ASN1_TAG_UTF8_STRING:
+                    case ASN1_TAG_NUMERIC_STRING:
+                    case ASN1_TAG_PRINTABLE_STRING:
+                    case ASN1_TAG_IA5_STRING:
+                    case ASN1_TAG_VISIBLE_STRING:
+                        Assert(cch == pThis->Asn1Core.cb);
+                        memcpy(psz, pThis->Asn1Core.uData.pch, cch);
+                        psz[cch] = '\0';
+                        break;
+
+                    case ASN1_TAG_T61_STRING:
+                        switch (rtAsn1String_IsTeletexLatin1(pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb))
+                        {
+                            default:
+                                rc = rtIso2022RecodeAsUtf8(ASN1_TAG_T61_STRING, pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb,
+                                                           psz, cch + 1);
+                                break;
+                            case RTASN1TELETEXVARIANT_UNDECIDED:
+                            case RTASN1TELETEXVARIANT_LATIN1:
+                            case RTASN1TELETEXVARIANT_WIN_1252:
+                                rc = rtWin1252RecodeAsUtf8(pThis->Asn1Core.uData.pch, pThis->Asn1Core.cb, psz, cch + 1);
+                                break;
+                        }
+                        AssertReturnStmt(RT_SUCCESS(rc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_3);
+                        break;
+
+                    /* case ASN1_TAG_VIDEOTEX_STRING: */
+                    /* case ASN1_TAG_GRAPHIC_STRING:  */
+                    /* case ASN1_TAG_GENERAL_STRING:  */
+
+                    case ASN1_TAG_UNIVERSAL_STRING:
+                    {
+                        char           *pszDst = psz;
+                        size_t          cchSrc = pThis->Asn1Core.cb;
+                        uint8_t const  *pbSrc  = (uint8_t const *)psz;
+                        while (cchSrc > 0)
+                        {
+                            RTUNICP uc = RT_MAKE_U32_FROM_U8(pbSrc[3], pbSrc[2], pbSrc[1], pbSrc[0]); /* big endian */
+                            AssertReturnStmt(RTUniCpIsValid(uc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_2);
+                            pszDst = RTStrPutCp(pszDst, uc);
+
+                            /* next */
+                            pbSrc  += 4;
+                            cchSrc -= 4;
+                        }
+                        Assert((size_t)(pszDst - psz) == cch);
+                        break;
+                    }
+
+                    case ASN1_TAG_BMP_STRING:
+                    {
+                        char           *pszDst = psz;
+                        size_t          cchSrc = pThis->Asn1Core.cb;
+                        uint8_t const  *pbSrc  = (uint8_t const *)psz;
+                        while (cchSrc > 0)
+                        {
+                            RTUNICP uc = RT_MAKE_U32_FROM_U8(pbSrc[1], pbSrc[0], 0, 0); /* big endian */
+                            AssertReturnStmt(RTUniCpIsValid(uc), RTAsn1MemFree(&pThisNC->Allocation, psz), VERR_INTERNAL_ERROR_2);
+                            pszDst = RTStrPutCp(pszDst, uc);
+
+                            /* next */
+                            pbSrc  += 2;
+                            cchSrc -= 2;
+                        }
+                        Assert((size_t)(pszDst - psz) == cch);
+                        break;
+                    }
+
+                    default:
+                        RTAsn1MemFree(&pThisNC->Allocation, psz);
+                        AssertMsgFailedReturn(("uTag=%#x\n", RTASN1CORE_GET_TAG(&pThis->Asn1Core)), VERR_INTERNAL_ERROR_3);
+                }
+
+                /*
+                 * Successfully produced UTF-8.  Save it in the object.
+                 */
+                pThisNC->pszUtf8 = psz;
+                pThisNC->cchUtf8 = (uint32_t)cch;
+            }
+            else
+                return rc;
+        }
+        else
+            return rc;
+    }
+
+    /*
+     * Success.
+     */
+    if (ppsz)
+        *ppsz = psz;
+    if (pcch)
+        *pcch = cch;
+    return VINF_SUCCESS;
+}
+
+
+
+RTDECL(int) RTAsn1String_QueryUtf8Len(PCRTASN1STRING pThis, size_t *pcch)
+{
+    Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+    size_t cch = pThis->cchUtf8;
+    if (!cch && !pThis->pszUtf8)
+    {
+        int rc = rtAsn1String_CheckSanity(pThis, NULL, NULL, &cch);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    *pcch = cch;
+    return VINF_SUCCESS;
+}
+
+
+
+
+RTDECL(int) RTAsn1String_InitEx(PRTASN1STRING pThis, uint32_t uTag, void const *pvValue, size_t cbValue,
+                                PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    RT_ZERO(*pThis);
+    AssertMsgReturn(uTag < RT_ELEMENTS(g_acbStringTags) && g_acbStringTags[uTag] > 0, ("uTag=%#x\n", uTag),
+                    VERR_INVALID_PARAMETER);
+
+    RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+    RTAsn1Core_InitEx(&pThis->Asn1Core,
+                      uTag,
+                      ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1String_Vtable,
+                      RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+
+    if (cbValue > 0)
+    {
+        int rc = RTAsn1ContentDup(&pThis->Asn1Core, pvValue, cbValue, pAllocator);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_InitWithValue(PRTASN1STRING pThis, const char *pszUtf8Value, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    Assert(RTStrValidateEncoding(pszUtf8Value));
+    return RTAsn1String_InitEx(pThis, ASN1_TAG_UTF8_STRING, pszUtf8Value, strlen(pszUtf8Value), pAllocator);
+}
+
+
+RTDECL(int) RTAsn1String_RecodeAsUtf8(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    /*
+     * Query the UTF-8 string. Do this even if it's already an
+     * ASN1_TAG_UTF8_STRING object as it makes sure we've got a valid UTF-8
+     * string upon successful return.
+     */
+    int rc = RTAsn1String_QueryUtf8(pThis, NULL, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != ASN1_TAG_UTF8_STRING)
+        {
+            /*
+             * Resize the content, copy the UTF-8 bytes in there, and change
+             * the tag.
+             */
+            rc = RTAsn1ContentReallocZ(&pThis->Asn1Core, pThis->cchUtf8, pAllocator);
+            if (RT_SUCCESS(rc))
+            {
+                memcpy((void *)pThis->Asn1Core.uData.pv, pThis->pszUtf8, pThis->cchUtf8);
+                rc = RTAsn1Core_ChangeTag(&pThis->Asn1Core, ASN1_TAG_UTF8_STRING);
+            }
+        }
+    }
+    return rc;
+}
+
+
+
+/*
+ * ASN.1 STRING - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1String_Vtable =
+{
+    "RTAsn1String",
+    sizeof(RTASN1STRING),
+    UINT8_MAX,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1String_Delete,
+    NULL,
+    (PFNRTASN1COREVTCLONE)RTAsn1String_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1String_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1String_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1String_Init(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    return RTAsn1String_InitEx(pThis, ASN1_TAG_UTF8_STRING, NULL /*pvValue*/, 0 /*cbValue*/, pAllocator);
+}
+
+
+RTDECL(int) RTAsn1String_Clone(PRTASN1STRING pThis, PCRTASN1STRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1String_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1String_Vtable, VERR_INTERNAL_ERROR_3);
+        int rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+        if (RT_SUCCESS(rc))
+        {
+            /* Don't copy the UTF-8 representation, decode it when queried. */
+            RTAsn1MemInitAllocation(&pThis->Allocation, pAllocator);
+            return VINF_SUCCESS;
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1String_Delete(PRTASN1STRING pThis)
+{
+    if (   pThis
+        && RTAsn1String_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable);
+
+        if (pThis->Allocation.cbAllocated)
+            RTAsn1MemFree(&pThis->Allocation, (char *)pThis->pszUtf8);
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1String_Enum(PRTASN1STRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1String_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1String_Compare(PCRTASN1STRING pLeft, PCRTASN1STRING pRight)
+{
+    /* Compare tag and binary value. */
+    return RTAsn1String_CompareEx(pLeft, pRight, true /*fTypeToo*/);
+}
+
+
+RTDECL(int) RTAsn1String_CheckSanity(PCRTASN1STRING pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1String_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (STRING).", pszErrorTag);
+    return rtAsn1String_CheckSanity(pThis, pErrInfo, pszErrorTag, NULL /*pcchUtf8*/);
+}
+
+
+/*
+ * Generate code for the tag specific methods.
+ * Note! This is very similar to what we're doing in asn1-ut-time.cpp.
+ */
+#define RTASN1STRING_IMPL(a_uTag, a_szTag, a_Api) \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Init)(PRTASN1STRING pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { \
+        return RTAsn1String_InitEx(pThis, a_uTag, NULL /*pvValue*/, 0 /*cbValue*/, pAllocator); \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Clone)(PRTASN1STRING pThis, PCRTASN1STRING pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { \
+        AssertReturn(RTASN1CORE_GET_TAG(&pSrc->Asn1Core) == a_uTag || !RTAsn1String_IsPresent(pSrc), \
+                     VERR_ASN1_STRING_TAG_MISMATCH); \
+        return RTAsn1String_Clone(pThis, pSrc, pAllocator); \
+    } \
+    \
+    RTDECL(void) RT_CONCAT(a_Api,_Delete)(PRTASN1STRING pThis) \
+    { \
+        Assert(   !pThis \
+               || !RTAsn1String_IsPresent(pThis) \
+               || (   pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable \
+                   && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ); \
+        RTAsn1String_Delete(pThis); \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Enum)(PRTASN1STRING pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser) \
+    { \
+        Assert(   pThis \
+               && (   !RTAsn1String_IsPresent(pThis) \
+                   || (   pThis->Asn1Core.pOps == &g_RTAsn1String_Vtable \
+                       && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ) ); \
+        /* No children to enumerate. */ \
+        return VINF_SUCCESS; \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Compare)(PCRTASN1STRING pLeft, PCRTASN1STRING pRight) \
+    { \
+        int iDiff = RTAsn1String_CompareEx(pLeft, pRight, true /*fTypeToo*/); \
+        if (!iDiff && RTASN1CORE_GET_TAG(&pLeft->Asn1Core) != a_uTag && RTAsn1String_IsPresent(pLeft)) \
+            iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < a_uTag ? -1 : 1; \
+        return iDiff; \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_CheckSanity)(PCRTASN1STRING pThis, uint32_t fFlags, \
+                                              PRTERRINFO pErrInfo, const char *pszErrorTag) \
+    { \
+        if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != a_uTag && RTAsn1String_IsPresent(pThis)) \
+            return RTErrInfoSetF(pErrInfo, VERR_ASN1_STRING_TAG_MISMATCH, "%s: uTag=%#x, expected %#x (%s)", \
+                                 pszErrorTag, RTASN1CORE_GET_TAG(&pThis->Asn1Core), a_uTag, a_szTag); \
+        return RTAsn1String_CheckSanity(pThis, fFlags, pErrInfo, pszErrorTag); \
+    }
+
+#include "asn1-ut-string-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-string-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp
new file mode 100644
index 0000000..dae7afc
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-decode.cpp
@@ -0,0 +1,389 @@
+/* $Id: asn1-ut-time-decode.cpp $ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Decoding.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/alloca.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/ctype.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/**
+ * Common code for UTCTime and GeneralizedTime converters that normalizes the
+ * converted time and checks that the input values doesn't change.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor to use when reporting an error.
+ * @param   pThis               The time to normalize and check.
+ * @param   pszType             The type name.
+ * @param   pszErrorTag         The error tag.
+ */
+static int rtAsn1Time_NormalizeTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszType, const char *pszErrorTag)
+{
+    int rc;
+    if (   pThis->Time.u8Month  >  0
+        && pThis->Time.u8Month  <= 12
+        && pThis->Time.u8Hour   <  24
+        && pThis->Time.u8Minute <  60
+        && pThis->Time.u8Second <  60) /** @todo what about leap seconds? */
+    {
+        RTTIME const TimeCopy = pThis->Time;
+        if (RTTimeNormalize(&pThis->Time))
+        {
+            if (   TimeCopy.u8MonthDay  ==  pThis->Time.u8MonthDay
+                && TimeCopy.u8Month     ==  pThis->Time.u8Month
+                && TimeCopy.i32Year     ==  pThis->Time.i32Year
+                && TimeCopy.u8Hour      ==  pThis->Time.u8Hour
+                && TimeCopy.u8Minute    ==  pThis->Time.u8Minute
+                && TimeCopy.u8Second    ==  pThis->Time.u8Second)
+                return VINF_SUCCESS;
+
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_NORMALIZE_MISMATCH,
+                                     "%s: Normalized result not the same as %s: '%.*s'",
+                                     pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+        }
+        else
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_NORMALIZE_ERROR,
+                                     "%s: RTTimeNormalize failed on %s: '%.*s'",
+                                     pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+    }
+    else
+        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_TIME_BAD_NORMALIZE_INPUT,
+                                 "%s: Bad %s values: '%.*s'; mth=%u h=%u min=%u sec=%u",
+                                 pszErrorTag, pszType, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch,
+                                 pThis->Time.u8Month, pThis->Time.u8Hour, pThis->Time.u8Minute, pThis->Time.u8Second);
+    return rc;
+}
+
+
+/**
+ * Converts the UTCTime string into an the RTTIME member of RTASN1TIME.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor to use when reporting an error.
+ * @param   pThis               The time to parse.
+ * @param   pszErrorTag         The error tag.
+ */
+static int rtAsn1Time_ConvertUTCTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    /*
+     * While the current spec says the seconds field is not optional, this
+     * restriction was added later on.  So, when parsing UTCTime we must deal
+     * with it being absent.
+     */
+    int rc;
+    bool fHaveSeconds = pThis->Asn1Core.cb == sizeof("YYMMDDHHMMSSZ") - 1;
+    if (fHaveSeconds || pThis->Asn1Core.cb == sizeof("YYMMDDHHMMZ") - 1)
+    {
+        const char *pachTime = pThis->Asn1Core.uData.pch;
+
+        /* Basic encoding validation. */
+        if (   RT_C_IS_DIGIT(pachTime[0]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[1]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[2]) /* M */
+            && RT_C_IS_DIGIT(pachTime[3]) /* M */
+            && RT_C_IS_DIGIT(pachTime[4]) /* D */
+            && RT_C_IS_DIGIT(pachTime[5]) /* D */
+            && RT_C_IS_DIGIT(pachTime[6]) /* H */
+            && RT_C_IS_DIGIT(pachTime[7]) /* H */
+            && RT_C_IS_DIGIT(pachTime[8]) /* M */
+            && RT_C_IS_DIGIT(pachTime[9]) /* M */
+            && (   !fHaveSeconds
+                || (   RT_C_IS_DIGIT(pachTime[10]) /* S */
+                    && RT_C_IS_DIGIT(pachTime[11]) /* S */ ) )
+            && pachTime[fHaveSeconds ? 12 : 10] == 'Z'
+           )
+        {
+            /* Basic conversion. */
+            pThis->Time.i32Year         = (pachTime[0] - '0') * 10  +  (pachTime[1] - '0');
+            pThis->Time.i32Year        += pThis->Time.i32Year < 50 ? 2000 : 1900;
+            pThis->Time.u8Month         = (pachTime[2] - '0') * 10  +  (pachTime[3] - '0');
+            pThis->Time.u8WeekDay       = 0;
+            pThis->Time.u16YearDay      = 0;
+            pThis->Time.u8MonthDay      = (pachTime[4] - '0') * 10  +  (pachTime[5] - '0');
+            pThis->Time.u8Hour          = (pachTime[6] - '0') * 10  +  (pachTime[7] - '0');
+            pThis->Time.u8Minute        = (pachTime[8] - '0') * 10  +  (pachTime[9] - '0');
+            if (fHaveSeconds)
+                pThis->Time.u8Second    = (pachTime[10] - '0') * 10 +  (pachTime[11] - '0');
+            else
+                pThis->Time.u8Second    = 0;
+            pThis->Time.u32Nanosecond   = 0;
+            pThis->Time.fFlags          = RTTIME_FLAGS_TYPE_UTC;
+            pThis->Time.offUTC          = 0;
+
+            /* Check the convered data and normalize the time structure. */
+            rc = rtAsn1Time_NormalizeTime(pCursor, pThis, "UTCTime", pszErrorTag);
+            if (RT_SUCCESS(rc))
+                return rc;
+        }
+        else
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_UTC_TIME_ENCODING, "%s: Bad UTCTime encoding: '%.*s'",
+                                     pszErrorTag, pThis->Asn1Core.cb, pachTime);
+    }
+    else
+        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_UTC_TIME_ENCODING, "%s: Bad UTCTime length: %#x",
+                                 pszErrorTag, pThis->Asn1Core.cb);
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+/**
+ * Converts the fraction part of a generalized time into nanoseconds.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor         The cursor to use when reporting an error.
+ * @param   pchFraction     Pointer to the start of the fraction (dot).
+ * @param   cchFraction     The length of the fraction.
+ * @param   pThis           The time object we're working on,
+ *                          Time.u32Nanoseconds will be update.
+ * @param   pszErrorTag     The error tag.
+ */
+static int rtAsn1Time_ConvertGeneralizedTimeFraction(PRTASN1CURSOR pCursor, const char *pchFraction, uint32_t cchFraction,
+                                                      PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    pThis->Time.u32Nanosecond = 0;
+
+    /*
+     * Check the dot.
+     */
+    if (*pchFraction == '.')
+        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                   "%s: Expected GeneralizedTime fraction dot, found: '%c' ('%.*s')",
+                                   pszErrorTag, *pchFraction, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+    pchFraction++;
+    cchFraction--;
+    if (!cchFraction)
+        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                   "%s: No digit following GeneralizedTime fraction dot: '%.*s'",
+                                   pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core);
+
+    /*
+     * Do the conversion.
+     */
+    char chLastDigit;
+    uint32_t uMult = 1000000000;
+    do
+    {
+        char chDigit = chLastDigit = *pchFraction;
+        if (!RT_C_IS_DIGIT(chDigit))
+            return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                       "%s: Bad GeneralizedTime fraction digit: '%.*s'",
+                                       pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+        pThis->Time.u32Nanosecond += uMult * (uint32_t)(chDigit - '0');
+
+        /* Advance */
+        cchFraction--;
+        pchFraction++;
+        uMult /= 10;
+    } while (cchFraction > 0 && uMult > 0);
+
+    /*
+     * Lazy bird: For now, we don't permit higher resolution than we can
+     * internally represent.  Deal with this if it ever becomes an issue.
+     */
+    if (cchFraction > 0)
+        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                   "%s: Bad GeneralizedTime fraction too long: '%.*s'",
+                                   pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+    if (chLastDigit == '0')
+        return RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                   "%s: Trailing zeros not allowed for GeneralizedTime: '%.*s'",
+                                   pszErrorTag, pThis->Asn1Core.cb, pThis->Asn1Core.uData.pch);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Converts the GeneralizedTime string into an the RTTIME member of RTASN1TIME.
+ *
+ * @returns IPRT status code.
+ * @param   pCursor             The cursor to use when reporting an error.
+ * @param   pThis               The time to parse.
+ * @param   pszErrorTag         The error tag.
+ */
+static int rtAsn1Time_ConvertGeneralizedTime(PRTASN1CURSOR pCursor, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    int rc;
+    if (pThis->Asn1Core.cb >= sizeof("YYYYMMDDHHMMSSZ") - 1)
+    {
+        const char *pachTime = pThis->Asn1Core.uData.pch;
+
+        /* Basic encoding validation. */
+        if (   RT_C_IS_DIGIT(pachTime[0]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[1]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[2]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[3]) /* Y */
+            && RT_C_IS_DIGIT(pachTime[4]) /* M */
+            && RT_C_IS_DIGIT(pachTime[5]) /* M */
+            && RT_C_IS_DIGIT(pachTime[6]) /* D */
+            && RT_C_IS_DIGIT(pachTime[7]) /* D */
+            && RT_C_IS_DIGIT(pachTime[8]) /* H */
+            && RT_C_IS_DIGIT(pachTime[9]) /* H */
+            && RT_C_IS_DIGIT(pachTime[10]) /* M */
+            && RT_C_IS_DIGIT(pachTime[11]) /* M */
+            && RT_C_IS_DIGIT(pachTime[12]) /* S */ /** @todo was this once optional? */
+            && RT_C_IS_DIGIT(pachTime[13]) /* S */
+            && pachTime[pThis->Asn1Core.cb - 1] == 'Z'
+           )
+        {
+            /* Basic conversion. */
+            pThis->Time.i32Year         = 1000 * (pachTime[0] - '0')
+                                        +  100 * (pachTime[1] - '0')
+                                        +   10 * (pachTime[2] - '0')
+                                        +        (pachTime[3] - '0');
+            pThis->Time.u8Month         = (pachTime[4]  - '0') * 10  +  (pachTime[5]  - '0');
+            pThis->Time.u8WeekDay       = 0;
+            pThis->Time.u16YearDay      = 0;
+            pThis->Time.u8MonthDay      = (pachTime[6]  - '0') * 10  +  (pachTime[7]  - '0');
+            pThis->Time.u8Hour          = (pachTime[8]  - '0') * 10  +  (pachTime[9]  - '0');
+            pThis->Time.u8Minute        = (pachTime[10] - '0') * 10  +  (pachTime[11] - '0');
+            pThis->Time.u8Second        = (pachTime[12] - '0') * 10  +  (pachTime[13] - '0');
+            pThis->Time.u32Nanosecond   = 0;
+            pThis->Time.fFlags          = RTTIME_FLAGS_TYPE_UTC;
+            pThis->Time.offUTC          = 0;
+
+            /* Optional fraction part. */
+            rc = VINF_SUCCESS;
+            uint32_t cchLeft = pThis->Asn1Core.cb - 14 - 1;
+            if (cchLeft > 0)
+                rc = rtAsn1Time_ConvertGeneralizedTimeFraction(pCursor, pachTime + 14, cchLeft, pThis, pszErrorTag);
+
+            /* Check the convered data and normalize the time structure. */
+            if (RT_SUCCESS(rc))
+            {
+                rc = rtAsn1Time_NormalizeTime(pCursor, pThis, "GeneralizedTime", pszErrorTag);
+                if (RT_SUCCESS(rc))
+                    return VINF_SUCCESS;
+            }
+        }
+        else
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                     "%s: Bad GeneralizedTime encoding: '%.*s'",
+                                     pszErrorTag, pThis->Asn1Core.cb, pachTime);
+    }
+    else
+        rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_INVALID_GENERALIZED_TIME_ENCODING,
+                                 "%s: Bad GeneralizedTime length: %#x",
+                                 pszErrorTag, pThis->Asn1Core.cb);
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1Time_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    Assert(!(fFlags & RTASN1CURSOR_GET_F_IMPLICIT));
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        if (pThis->Asn1Core.fClass == (ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE) )
+        {
+            if (pThis->Asn1Core.uTag == ASN1_TAG_UTC_TIME)
+            {
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.pOps    = &g_RTAsn1Time_Vtable;
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                return rtAsn1Time_ConvertUTCTime(pCursor, pThis, pszErrorTag);
+            }
+
+            if (pThis->Asn1Core.uTag == ASN1_TAG_GENERALIZED_TIME)
+            {
+                RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+                pThis->Asn1Core.pOps    = &g_RTAsn1Time_Vtable;
+                pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+                return rtAsn1Time_ConvertGeneralizedTime(pCursor, pThis, pszErrorTag);
+            }
+
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_MISMATCH, "%s: Not UTCTime nor GeneralizedTime: uTag=%#x",
+                                     pszErrorTag, pThis->Asn1Core.uTag);
+        }
+        else
+            rc = RTAsn1CursorSetInfo(pCursor, VERR_ASN1_CURSOR_TAG_FLAG_CLASS_MISMATCH,
+                                     "%s: Not UTCTime nor GeneralizedTime: fClass=%#x / uTag=%#x",
+                                     pszErrorTag, pThis->Asn1Core.fClass, pThis->Asn1Core.uTag);
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1UtcTime_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_UTC_TIME,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                            fFlags, pszErrorTag, "UTC TIME");
+        if (RT_SUCCESS(rc))
+        {
+            RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+            pThis->Asn1Core.pOps    = &g_RTAsn1Time_Vtable;
+            pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+            return rtAsn1Time_ConvertUTCTime(pCursor, pThis, pszErrorTag);
+        }
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+RTDECL(int) RTAsn1GeneralizedTime_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTASN1TIME pThis, const char *pszErrorTag)
+{
+    int rc = RTAsn1CursorReadHdr(pCursor, &pThis->Asn1Core, pszErrorTag);
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTAsn1CursorMatchTagClassFlags(pCursor, &pThis->Asn1Core, ASN1_TAG_GENERALIZED_TIME,
+                                            ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                                            fFlags, pszErrorTag, "GENERALIZED TIME");
+        if (RT_SUCCESS(rc))
+        {
+            RTAsn1CursorSkip(pCursor, pThis->Asn1Core.cb);
+            pThis->Asn1Core.pOps    = &g_RTAsn1Time_Vtable;
+            pThis->Asn1Core.fFlags |= RTASN1CORE_F_PRIMITE_TAG_STRUCT;
+            return rtAsn1Time_ConvertGeneralizedTime(pCursor, pThis, pszErrorTag);
+        }
+    }
+    RT_ZERO(*pThis);
+    return rc;
+}
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-time-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time-template.h
similarity index 53%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-time-template.h
index 35b6d89..9b371c6 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-template.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-time-template.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Collection Type Template.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,23 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
+#define RTASN1TMPL_DECL         RTDECL
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#define RTASN1TMPL_TYPE         RTASN1SEQOFTIMES
+#define RTASN1TMPL_EXT_NAME     RTAsn1SeqOfTimes
+#define RTASN1TMPL_INT_NAME     rtAsn1SeqOfTimes
+RTASN1TMPL_SEQ_OF(RTASN1TIME, RTAsn1Time);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#define RTASN1TMPL_TYPE         RTASN1SETOFTIMES
+#define RTASN1TMPL_EXT_NAME     RTAsn1SetOfTimes
+#define RTASN1TMPL_INT_NAME     rtAsn1SetOfTimes
+RTASN1TMPL_SET_OF(RTASN1TIME, RTAsn1Time);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h
index 35b6d89..e895cd7 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time-template2.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: asn1-ut-time-template2.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types, Template for type specific wrappers.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,6 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+RTASN1TIME_IMPL(ASN1_TAG_UTC_TIME,          "UTC TIME",         RTAsn1UtcTime)
+RTASN1TIME_IMPL(ASN1_TAG_GENERALIZED_TIME,  "GENERALIZED TIME", RTAsn1GeneralizedTime)
 
diff --git a/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp b/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp
new file mode 100644
index 0000000..77073be
--- /dev/null
+++ b/src/VBox/Runtime/common/asn1/asn1-ut-time.cpp
@@ -0,0 +1,270 @@
+/* $Id: asn1-ut-time.cpp $ */
+/** @file
+ * IPRT - ASN.1, UTC TIME and GENERALIZED TIME Types.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/asn1.h>
+
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include <iprt/formats/asn1.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** The UTC TIME encoding of the IPRT epoch time. */
+static const char g_szEpochUtc[] = "700101000000Z";
+/** The GENERALIZED TIME encoding of the IPRT epoch time. */
+static const char g_szEpochGeneralized[] = "19700101000000Z";
+
+
+/*
+ * ASN.1 TIME - Special Methods.
+ */
+
+RTDECL(int) RTAsn1Time_InitEx(PRTASN1TIME pThis, uint32_t uTag, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertReturn(uTag == ASN1_TAG_UTC_TIME || uTag == ASN1_TAG_GENERALIZED_TIME, VERR_INVALID_PARAMETER);
+    RTAsn1Core_InitEx(&pThis->Asn1Core,
+                      uTag,
+                      ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+                      &g_RTAsn1Time_Vtable,
+                      RTASN1CORE_F_PRESENT | RTASN1CORE_F_PRIMITE_TAG_STRUCT);
+    if (uTag == ASN1_TAG_UTC_TIME)
+    {
+        pThis->Asn1Core.cb = sizeof(g_szEpochUtc) - 1;
+        pThis->Asn1Core.uData.pv = &g_szEpochUtc[0];
+    }
+    else
+    {
+        pThis->Asn1Core.cb = sizeof(g_szEpochGeneralized) - 1;
+        pThis->Asn1Core.uData.pv = &g_szEpochGeneralized[0];
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Time_CompareWithTimeSpec(PCRTASN1TIME pLeft, PCRTTIMESPEC pTsRight)
+{
+    int iDiff = RTAsn1Time_IsPresent(pLeft) ? 0 : -1;
+    if (!iDiff)
+    {
+        RTTIMESPEC TsLeft;
+        AssertReturn(RTTimeImplode(&TsLeft, &pLeft->Time), -1);
+
+        iDiff = RTTimeSpecCompare(&TsLeft, pTsRight);
+    }
+
+    return iDiff;
+}
+
+
+/*
+ * ASN.1 TIME - Standard Methods.
+ */
+
+RT_DECL_DATA_CONST(RTASN1COREVTABLE const) g_RTAsn1Time_Vtable =
+{
+    "RTAsn1Time",
+    sizeof(RTASN1TIME),
+    UINT8_MAX,
+    ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_PRIMITIVE,
+    0,
+    (PFNRTASN1COREVTDTOR)RTAsn1Time_Delete,
+    NULL,
+    (PFNRTASN1COREVTCLONE)RTAsn1Time_Clone,
+    (PFNRTASN1COREVTCOMPARE)RTAsn1Time_Compare,
+    (PFNRTASN1COREVTCHECKSANITY)RTAsn1Time_CheckSanity,
+    NULL,
+    NULL
+};
+
+
+RTDECL(int) RTAsn1Time_Init(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    /* Using UTC TIME since epoch would be encoded using UTC TIME following
+       X.509 Validity / Whatever time tag guidelines. */
+    return RTAsn1Time_InitEx(pThis, ASN1_TAG_UTC_TIME, pAllocator);
+}
+
+
+RTDECL(int) RTAsn1Time_Clone(PRTASN1TIME pThis, PCRTASN1TIME pSrc, PCRTASN1ALLOCATORVTABLE pAllocator)
+{
+    AssertPtr(pSrc); AssertPtr(pThis); AssertPtr(pAllocator);
+    RT_ZERO(*pThis);
+    if (RTAsn1Time_IsPresent(pSrc))
+    {
+        AssertReturn(pSrc->Asn1Core.pOps == &g_RTAsn1Time_Vtable, VERR_INTERNAL_ERROR_3);
+
+        int rc = RTAsn1Core_CloneContent(&pThis->Asn1Core, &pSrc->Asn1Core, pAllocator);
+        if (RT_SUCCESS(rc))
+        {
+            pThis->Time = pSrc->Time;
+            return VINF_SUCCESS;
+        }
+        return rc;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(void) RTAsn1Time_Delete(PRTASN1TIME pThis)
+{
+    if (   pThis
+        && RTAsn1Time_IsPresent(pThis))
+    {
+        Assert(pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable);
+
+        RTAsn1ContentFree(&pThis->Asn1Core);
+        RT_ZERO(*pThis);
+    }
+}
+
+
+RTDECL(int) RTAsn1Time_Enum(PRTASN1TIME pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser)
+{
+    Assert(pThis && (!RTAsn1Time_IsPresent(pThis) || pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable));
+
+    /* No children to enumerate. */
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTAsn1Time_Compare(PCRTASN1TIME pLeft, PCRTASN1TIME pRight)
+{
+    Assert(pLeft  && (!RTAsn1Time_IsPresent(pLeft)  || pLeft->Asn1Core.pOps  == &g_RTAsn1Time_Vtable));
+    Assert(pRight && (!RTAsn1Time_IsPresent(pRight) || pRight->Asn1Core.pOps == &g_RTAsn1Time_Vtable));
+
+    int iDiff;
+    if (RTAsn1Time_IsPresent(pLeft))
+    {
+        if (RTAsn1Time_IsPresent(pRight))
+        {
+            RTTIMESPEC TsLeft;
+            AssertReturn(RTTimeImplode(&TsLeft, &pLeft->Time), -1);
+
+            RTTIMESPEC TsRight;
+            AssertReturn(RTTimeImplode(&TsRight, &pRight->Time), 1);
+
+            iDiff = RTTimeSpecCompare(&TsLeft, &TsRight);
+        }
+        else
+            iDiff = -1;
+    }
+    else
+        iDiff = 0 - (int)RTAsn1Time_IsPresent(pRight);
+    return iDiff;
+}
+
+
+RTDECL(int) RTAsn1Time_CheckSanity(PCRTASN1TIME pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RT_UNLIKELY(!RTAsn1Time_IsPresent(pThis)))
+        return RTErrInfoSetF(pErrInfo, VERR_ASN1_NOT_PRESENT, "%s: Missing (TIME).", pszErrorTag);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate code for the tag specific methods.
+ * Note! This is very similar to what we're doing in asn1-ut-string.cpp.
+ */
+#define RTASN1TIME_IMPL(a_uTag, a_szTag, a_Api) \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Init)(PRTASN1TIME pThis, PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { \
+        return RTAsn1Time_InitEx(pThis, a_uTag, pAllocator); \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Clone)(PRTASN1TIME pThis, PCRTASN1TIME pSrc, PCRTASN1ALLOCATORVTABLE pAllocator) \
+    { \
+        AssertReturn(RTASN1CORE_GET_TAG(&pSrc->Asn1Core) == a_uTag || !RTAsn1Time_IsPresent(pSrc), \
+                     VERR_ASN1_TIME_TAG_MISMATCH); \
+        return RTAsn1Time_Clone(pThis, pSrc, pAllocator); \
+    } \
+    \
+    RTDECL(void) RT_CONCAT(a_Api,_Delete)(PRTASN1TIME pThis) \
+    { \
+        Assert(   !pThis \
+               || !RTAsn1Time_IsPresent(pThis) \
+               || (   pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable \
+                   && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ); \
+        RTAsn1Time_Delete(pThis); \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Enum)(PRTASN1TIME pThis, PFNRTASN1ENUMCALLBACK pfnCallback, uint32_t uDepth, void *pvUser) \
+    { \
+        Assert(   pThis \
+               && (   !RTAsn1Time_IsPresent(pThis) \
+                   || (   pThis->Asn1Core.pOps == &g_RTAsn1Time_Vtable \
+                       && RTASN1CORE_GET_TAG(&pThis->Asn1Core) == a_uTag) ) ); \
+        /* No children to enumerate. */ \
+        return VINF_SUCCESS; \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_Compare)(PCRTASN1TIME pLeft, PCRTASN1TIME pRight) \
+    { \
+        int iDiff = RTAsn1Time_Compare(pLeft, pRight); \
+        if (!iDiff && RTAsn1Time_IsPresent(pLeft)) \
+        { \
+            if (RTASN1CORE_GET_TAG(&pLeft->Asn1Core) == RTASN1CORE_GET_TAG(&pRight->Asn1Core)) \
+            { \
+                if (RTASN1CORE_GET_TAG(&pLeft->Asn1Core) != a_uTag) \
+                    iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < a_uTag ? -1 : 1; \
+            } \
+            else \
+                iDiff = RTASN1CORE_GET_TAG(&pLeft->Asn1Core) < RTASN1CORE_GET_TAG(&pRight->Asn1Core) ? -1 : 1; \
+        } \
+        return iDiff; \
+    } \
+    \
+    RTDECL(int) RT_CONCAT(a_Api,_CheckSanity)(PCRTASN1TIME pThis, uint32_t fFlags, \
+                                              PRTERRINFO pErrInfo, const char *pszErrorTag) \
+    { \
+        if (RTASN1CORE_GET_TAG(&pThis->Asn1Core) != a_uTag && RTAsn1Time_IsPresent(pThis)) \
+            return RTErrInfoSetF(pErrInfo, VERR_ASN1_TIME_TAG_MISMATCH, "%s: uTag=%#x, expected %#x (%s)", \
+                                 pszErrorTag, RTASN1CORE_GET_TAG(&pThis->Asn1Core), a_uTag, a_szTag); \
+        return RTAsn1Time_CheckSanity(pThis, fFlags, pErrInfo, pszErrorTag); \
+    }
+
+#include "asn1-ut-time-template2.h"
+
+
+/*
+ * Generate code for the associated collection types.
+ */
+#define RTASN1TMPL_TEMPLATE_FILE "../common/asn1/asn1-ut-time-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+#include <iprt/asn1-generator-core.h>
+#include <iprt/asn1-generator-init.h>
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/checksum/RTSha1Digest.cpp b/src/VBox/Runtime/common/checksum/RTSha1Digest.cpp
index 70b158b..e12393a 100644
--- a/src/VBox/Runtime/common/checksum/RTSha1Digest.cpp
+++ b/src/VBox/Runtime/common/checksum/RTSha1Digest.cpp
@@ -1,6 +1,9 @@
 /* $Id: RTSha1Digest.cpp $ */
 /** @file
  * IPRT - SHA1 digest creation
+ *
+ * @todo Replace this with generic RTCrDigest based implementation. Too much
+ *       stupid code duplication.
  */
 
 /*
@@ -37,8 +40,6 @@
 #include <iprt/string.h>
 #include <iprt/file.h>
 
-#include <openssl/sha.h>
-
 
 RTR3DECL(int) RTSha1Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser)
 {
@@ -50,28 +51,22 @@ RTR3DECL(int) RTSha1Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPR
     int rc = VINF_SUCCESS;
     *ppszDigest = NULL;
 
-    /* Initialize OpenSSL. */
-    SHA_CTX ctx;
-    if (!SHA1_Init(&ctx))
-        return VERR_INTERNAL_ERROR;
+    /* Initialize the hash context. */
+    RTSHA1CONTEXT Ctx;
+    RTSha1Init(&Ctx);
 
     /* Buffer size for progress callback */
-    double rdMulti = 100.0 / cbBuf;
+    double rdMulti = 100.0 / (cbBuf ? cbBuf : 1);
 
     /* Working buffer */
     char *pvTmp = (char*)pvBuf;
 
     /* Process the memory in blocks */
-    size_t cbRead;
     size_t cbReadTotal = 0;
     for (;;)
     {
-        cbRead = RT_MIN(cbBuf - cbReadTotal, _1M);
-        if(!SHA1_Update(&ctx, pvTmp, cbRead))
-        {
-            rc = VERR_INTERNAL_ERROR;
-            break;
-        }
+        size_t cbRead = RT_MIN(cbBuf - cbReadTotal, _1M);
+        RTSha1Update(&Ctx, pvTmp, cbRead);
         cbReadTotal += cbRead;
         pvTmp += cbRead;
 
@@ -89,15 +84,14 @@ RTR3DECL(int) RTSha1Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPR
     if (RT_SUCCESS(rc))
     {
         /* Finally calculate & format the SHA1 sum */
-        unsigned char auchDig[RTSHA1_HASH_SIZE];
-        if (!SHA1_Final(auchDig, &ctx))
-            return VERR_INTERNAL_ERROR;
+        uint8_t abHash[RTSHA1_HASH_SIZE];
+        RTSha1Final(&Ctx, abHash);
 
         char *pszDigest;
         rc = RTStrAllocEx(&pszDigest, RTSHA1_DIGEST_LEN + 1);
         if (RT_SUCCESS(rc))
         {
-            rc = RTSha1ToString(auchDig, pszDigest, RTSHA1_DIGEST_LEN + 1);
+            rc = RTSha1ToString(abHash, pszDigest, RTSHA1_DIGEST_LEN + 1);
             if (RT_SUCCESS(rc))
                 *ppszDigest = pszDigest;
             else
@@ -117,11 +111,6 @@ RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRT
 
     *ppszDigest = NULL;
 
-    /* Initialize OpenSSL. */
-    SHA_CTX ctx;
-    if (!SHA1_Init(&ctx))
-        return VERR_INTERNAL_ERROR;
-
     /* Open the file to calculate a SHA1 sum of */
     RTFILE hFile;
     int rc = RTFileOpen(&hFile, pszFile, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE);
@@ -139,7 +128,7 @@ RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRT
             RTFileClose(hFile);
             return rc;
         }
-        rdMulti = 100.0 / cbFile;
+        rdMulti = 100.0 / (cbFile ? cbFile : 1);
     }
 
     /* Allocate a reasonably large buffer, fall back on a tiny one. */
@@ -152,19 +141,19 @@ RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRT
         pvBuf = alloca(cbBuf);
     }
 
+    /* Initialize the hash context. */
+    RTSHA1CONTEXT Ctx;
+    RTSha1Init(&Ctx);
+
     /* Read that file in blocks */
-    size_t cbRead;
     size_t cbReadTotal = 0;
     for (;;)
     {
+        size_t cbRead;
         rc = RTFileRead(hFile, pvBuf, cbBuf, &cbRead);
         if (RT_FAILURE(rc) || !cbRead)
             break;
-        if(!SHA1_Update(&ctx, pvBuf, cbRead))
-        {
-            rc = VERR_INTERNAL_ERROR;
-            break;
-        }
+        RTSha1Update(&Ctx, pvBuf, cbRead);
         cbReadTotal += cbRead;
 
         /* Call the progress callback if one is defined */
@@ -182,15 +171,14 @@ RTR3DECL(int) RTSha1DigestFromFile(const char *pszFile, char **ppszDigest, PFNRT
         return rc;
 
     /* Finally calculate & format the SHA1 sum */
-    unsigned char auchDig[RTSHA1_HASH_SIZE];
-    if (!SHA1_Final(auchDig, &ctx))
-        return VERR_INTERNAL_ERROR;
+    uint8_t abHash[RTSHA1_HASH_SIZE];
+    RTSha1Final(&Ctx, abHash);
 
     char *pszDigest;
     rc = RTStrAllocEx(&pszDigest, RTSHA1_DIGEST_LEN + 1);
     if (RT_SUCCESS(rc))
     {
-        rc = RTSha1ToString(auchDig, pszDigest, RTSHA1_DIGEST_LEN + 1);
+        rc = RTSha1ToString(abHash, pszDigest, RTSHA1_DIGEST_LEN + 1);
         if (RT_SUCCESS(rc))
             *ppszDigest = pszDigest;
         else
diff --git a/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp b/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
index 5b8679c..cfc25a0 100644
--- a/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
+++ b/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
@@ -1,9 +1,12 @@
 /** @file
  * IPRT - SHA256 digest creation
+ *
+ * @todo Replace this with generic RTCrDigest based implementation. Too much
+ *       stupid code duplication.
  */
 
 /*
- * Copyright (C) 2009-2013 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -36,8 +39,6 @@
 #include <iprt/string.h>
 #include <iprt/file.h>
 
-#include <openssl/sha.h>
-
 
 RTR3DECL(int) RTSha256Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRTPROGRESS pfnProgressCallback, void *pvUser)
 {
@@ -49,28 +50,22 @@ RTR3DECL(int) RTSha256Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRT
     int rc = VINF_SUCCESS;
     *ppszDigest = NULL;
 
-    /* Initialize OpenSSL. */
-    SHA256_CTX ctx;
-    if (!SHA256_Init(&ctx))
-        return VERR_INTERNAL_ERROR;
+    /* Initialize the hash context. */
+    RTSHA256CONTEXT Ctx;
+    RTSha256Init(&Ctx);
 
     /* Buffer size for progress callback */
-    double rdMulti = 100.0 / cbBuf;
+    double rdMulti = 100.0 / (cbBuf ? cbBuf : 1);
 
     /* Working buffer */
     char *pvTmp = (char*)pvBuf;
 
     /* Process the memory in blocks */
-    size_t cbRead;
     size_t cbReadTotal = 0;
     for (;;)
     {
-        cbRead = RT_MIN(cbBuf - cbReadTotal, _1M);
-        if(!SHA256_Update(&ctx, pvTmp, cbRead))
-        {
-            rc = VERR_INTERNAL_ERROR;
-            break;
-        }
+        size_t cbRead = RT_MIN(cbBuf - cbReadTotal, _1M);
+        RTSha256Update(&Ctx, pvTmp, cbRead);
         cbReadTotal += cbRead;
         pvTmp += cbRead;
 
@@ -88,15 +83,14 @@ RTR3DECL(int) RTSha256Digest(void* pvBuf, size_t cbBuf, char **ppszDigest, PFNRT
     if (RT_SUCCESS(rc))
     {
         /* Finally calculate & format the SHA256 sum */
-        unsigned char auchDig[RTSHA256_HASH_SIZE];
-        if (!SHA256_Final(auchDig, &ctx))
-            return VERR_INTERNAL_ERROR;
+        uint8_t abHash[RTSHA256_HASH_SIZE];
+        RTSha256Final(&Ctx, abHash);
 
         char *pszDigest;
         rc = RTStrAllocEx(&pszDigest, RTSHA256_DIGEST_LEN + 1);
         if (RT_SUCCESS(rc))
         {
-            rc = RTSha256ToString(auchDig, pszDigest, RTSHA256_DIGEST_LEN + 1);
+            rc = RTSha256ToString(abHash, pszDigest, RTSHA256_DIGEST_LEN + 1);
             if (RT_SUCCESS(rc))
                 *ppszDigest = pszDigest;
             else
@@ -116,10 +110,9 @@ RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFN
 
     *ppszDigest = NULL;
 
-    /* Initialize OpenSSL. */
-    SHA256_CTX ctx;
-    if (!SHA256_Init(&ctx))
-        return VERR_INTERNAL_ERROR;
+    /* Initialize the hash context. */
+    RTSHA256CONTEXT Ctx;
+    RTSha256Init(&Ctx);
 
     /* Open the file to calculate a SHA256 sum of */
     RTFILE hFile;
@@ -138,7 +131,7 @@ RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFN
             RTFileClose(hFile);
             return rc;
         }
-        rdMulti = 100.0 / cbFile;
+        rdMulti = 100.0 / (cbFile ? cbFile : 1);
     }
 
     /* Allocate a reasonably large buffer, fall back on a tiny one. */
@@ -152,18 +145,14 @@ RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFN
     }
 
     /* Read that file in blocks */
-    size_t cbRead;
     size_t cbReadTotal = 0;
     for (;;)
     {
+        size_t cbRead;
         rc = RTFileRead(hFile, pvBuf, cbBuf, &cbRead);
         if (RT_FAILURE(rc) || !cbRead)
             break;
-        if(!SHA256_Update(&ctx, pvBuf, cbRead))
-        {
-            rc = VERR_INTERNAL_ERROR;
-            break;
-        }
+        RTSha256Update(&Ctx, pvBuf, cbRead);
         cbReadTotal += cbRead;
 
         /* Call the progress callback if one is defined */
@@ -181,15 +170,14 @@ RTR3DECL(int) RTSha256DigestFromFile(const char *pszFile, char **ppszDigest, PFN
         return rc;
 
     /* Finally calculate & format the SHA256 sum */
-    unsigned char auchDig[RTSHA256_HASH_SIZE];
-    if (!SHA256_Final(auchDig, &ctx))
-        return VERR_INTERNAL_ERROR;
+    uint8_t abHash[RTSHA256_HASH_SIZE];
+    RTSha256Final(&Ctx, abHash);
 
     char *pszDigest;
     rc = RTStrAllocEx(&pszDigest, RTSHA256_DIGEST_LEN + 1);
     if (RT_SUCCESS(rc))
     {
-        rc = RTSha256ToString(auchDig, pszDigest, RTSHA256_DIGEST_LEN + 1);
+        rc = RTSha256ToString(abHash, pszDigest, RTSHA256_DIGEST_LEN + 1);
         if (RT_SUCCESS(rc))
             *ppszDigest = pszDigest;
         else
diff --git a/src/VBox/Runtime/common/checksum/alt-md2.cpp b/src/VBox/Runtime/common/checksum/alt-md2.cpp
new file mode 100644
index 0000000..8db73bc
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/alt-md2.cpp
@@ -0,0 +1,272 @@
+/* $Id: alt-md2.cpp $ */
+/** @file
+ * IPRT - Message-Digest Algorithm 2, Alternative Implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The MD2 block size. */
+#define RTMD2_BLOCK_SIZE    16
+/** The offset of the buffer into RTMD2ALTPRIVATECTX::abStateX. */
+#define RTMD2_BUF_OFF       RTMD2_BLOCK_SIZE
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/types.h>
+
+
+/** Our private context structure. */
+typedef struct RTMD2ALTPRIVATECTX
+{
+    /** The state (X).
+     * The staging buffer starts byte 16. */
+    uint8_t     abStateX[RTMD2_BLOCK_SIZE * 3];
+    /** The checksum. */
+    uint8_t     abChecksum[RTMD2_BLOCK_SIZE];
+    /** The number of buffered bytes. */
+    uint8_t     cbBuffer;
+} RTMD2ALTPRIVATECTX;
+
+#define RT_MD2_PRIVATE_ALT_CONTEXT
+#include <iprt/md2.h>
+
+#include <iprt/assert.h>
+#include <iprt/string.h>
+
+AssertCompile(RT_SIZEOFMEMB(RTMD2CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTMD2CONTEXT, AltPrivate));
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** PI substitation used by MD2. */
+static uint8_t const g_PiSubst[256] =
+{
+     41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240,   6,  19,
+     98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,  76, 130, 202,
+     30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111,  24, 138,  23, 229,  18,
+    190,  78, 196, 214, 218, 158, 222,  73, 160, 251, 245, 142, 187,  47, 238, 122,
+    169, 104, 121, 145,  21, 178,   7,  63, 148, 194,  16, 137,  11,  34,  95,  33,
+    128, 127,  93, 154,  90, 144, 50,   39,  53,  62, 204, 231, 191, 247, 151,   3,
+    255,  25,  48, 179,  72, 165, 181, 209, 215,  94, 146,  42, 172,  86, 170, 198,
+     79, 184,  56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,
+     69, 157, 112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2,
+     27,  96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126,  15,
+     85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197, 234,  38,
+     44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244,  65, 129,  77,  82,
+    106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,   8,  12, 189, 177,  74,
+    120, 136, 149, 139, 227,  99, 232, 109, 233, 203, 213, 254,  59,   0,  29,  57,
+    242, 239, 183,  14, 102,  88, 208, 228, 166, 119, 114, 248, 235, 117,  75,  10,
+     49,  68,  80, 180, 143, 237,  31,  26, 219, 153, 141,  51, 159,  17, 131,  20,
+};
+
+
+RTDECL(void) RTMd2Init(PRTMD2CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbBuffer = 0;
+    RT_ZERO(pCtx->AltPrivate.abStateX);
+    RT_ZERO(pCtx->AltPrivate.abChecksum);
+}
+RT_EXPORT_SYMBOL(RTMd2Init);
+
+
+
+/**
+ * Initializes the processing of a whole block directly from the input buffer.
+ *
+ * This will update the checksum as well as initializing abStateX.
+ *
+ * @param   pCtx                The MD2 context.
+ * @param   pbBlock             The block.
+ */
+DECLINLINE(void) rtMd2BlockInit(PRTMD2CONTEXT pCtx, const uint8_t *pbBlock)
+{
+    uint8_t bL = pCtx->AltPrivate.abChecksum[15];
+    for (unsigned j = 0; j < RTMD2_BLOCK_SIZE; j++)
+    {
+        uint8_t bIn = pbBlock[j];
+        pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE] = bIn;
+        pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE * 2] = bIn ^ pCtx->AltPrivate.abStateX[j];
+        bL = pCtx->AltPrivate.abChecksum[j] ^= g_PiSubst[bIn ^ bL];
+    }
+}
+
+
+/**
+ * Special version of rtMd2BlockInit that does not update the checksum.
+ *
+ * This is used in the final round when adding the checksum to the calculation.
+ *
+ * @param   pCtx                The MD2 context.
+ * @param   pbBlock             The block (i.e. the checksum).
+ */
+DECLINLINE(void) rtMd2BlockInitNoChecksum(PRTMD2CONTEXT pCtx, const uint8_t *pbBlock)
+{
+    for (unsigned j = 0; j < RTMD2_BLOCK_SIZE; j++)
+    {
+        uint8_t bIn = pbBlock[j];
+        pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE] = bIn;
+        pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE * 2] = bIn ^ pCtx->AltPrivate.abStateX[j];
+    }
+}
+
+
+/**
+ * Initalizes the abStateX from a full buffer and update the checksum.
+ *
+ * The buffer is part of the abStateX structure (bytes 16 thru 31), so this
+ * is a somewhat reduced version of rtMd2BlockInit.
+ *
+ * @param   pCtx                The MD2 context.
+ */
+DECLINLINE(void) rtMd2BlockInitBuffered(PRTMD2CONTEXT pCtx)
+{
+    uint8_t bL = pCtx->AltPrivate.abChecksum[15];
+    for (unsigned j = 0; j < RTMD2_BLOCK_SIZE; j++)
+    {
+        uint8_t bIn = pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE];
+        pCtx->AltPrivate.abStateX[j + RTMD2_BLOCK_SIZE * 2] = bIn ^ pCtx->AltPrivate.abStateX[j];
+        bL = pCtx->AltPrivate.abChecksum[j] ^= g_PiSubst[bIn ^ bL];
+    }
+}
+
+
+/**
+ * Process the current block.
+ *
+ * Requires one of the rtMd2BlockInit functions to be called first.
+ *
+ * @param   pCtx                The MD2 context.
+ */
+DECLINLINE(void) rtMd2BlockProcess(PRTMD2CONTEXT pCtx)
+{
+    uint8_t bT = 0;
+    for (unsigned j = 0; j < 18; j++) /* 18 rounds */
+    {
+        for (unsigned k = 0; k < RTMD2_BLOCK_SIZE * 3; k++)
+            pCtx->AltPrivate.abStateX[k] = bT = pCtx->AltPrivate.abStateX[k] ^ g_PiSubst[bT];
+        bT += (uint8_t)j;
+    }
+}
+
+
+RTDECL(void) RTMd2Update(PRTMD2CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    Assert(pCtx->AltPrivate.cbBuffer < RTMD2_BLOCK_SIZE);
+    uint8_t const *pbBuf = (uint8_t const *)pvBuf;
+
+    /*
+     * Deal with buffered bytes first.
+     */
+    if (pCtx->AltPrivate.cbBuffer)
+    {
+        uint8_t cbMissing = RTMD2_BLOCK_SIZE - pCtx->AltPrivate.cbBuffer;
+        if (cbBuf >= cbMissing)
+        {
+            memcpy(&pCtx->AltPrivate.abStateX[RTMD2_BUF_OFF + pCtx->AltPrivate.cbBuffer], pbBuf, cbMissing);
+            pbBuf += cbMissing;
+            cbBuf -= cbMissing;
+
+            rtMd2BlockInitBuffered(pCtx);
+            rtMd2BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbBuffer = 0;
+        }
+        else
+        {
+            memcpy(&pCtx->AltPrivate.abStateX[RTMD2_BUF_OFF + pCtx->AltPrivate.cbBuffer], pbBuf, cbBuf);
+            pCtx->AltPrivate.cbBuffer += (uint8_t)cbBuf;
+            return;
+        }
+    }
+
+    /*
+     * Process full blocks directly from the input buffer.
+     */
+    while (cbBuf >= RTMD2_BLOCK_SIZE)
+    {
+        rtMd2BlockInit(pCtx, pbBuf);
+        rtMd2BlockProcess(pCtx);
+
+        pbBuf += RTMD2_BLOCK_SIZE;
+        cbBuf -= RTMD2_BLOCK_SIZE;
+    }
+
+    /*
+     * Stash any remaining bytes into the context buffer.
+     */
+    if (cbBuf > 0)
+    {
+        memcpy(&pCtx->AltPrivate.abStateX[RTMD2_BUF_OFF], pbBuf, cbBuf);
+        pCtx->AltPrivate.cbBuffer = (uint8_t)cbBuf;
+    }
+}
+RT_EXPORT_SYMBOL(RTMd2Update);
+
+
+RTDECL(void) RTMd2Final(PRTMD2CONTEXT pCtx, uint8_t pabDigest[RTMD2_HASH_SIZE])
+{
+    Assert(pCtx->AltPrivate.cbBuffer < RTMD2_BLOCK_SIZE);
+
+    /*
+     * Pad the message to a multiple of 16 bytes. This is done even if the
+     * message already is a multiple of 16.
+     */
+    unsigned cbPad = RTMD2_BLOCK_SIZE - pCtx->AltPrivate.cbBuffer;
+    memset(&pCtx->AltPrivate.abStateX[RTMD2_BUF_OFF + pCtx->AltPrivate.cbBuffer], cbPad, cbPad);
+    rtMd2BlockInitBuffered(pCtx);
+    rtMd2BlockProcess(pCtx);
+    pCtx->AltPrivate.cbBuffer = 0;
+
+    /*
+     * Add the checksum.
+     */
+    rtMd2BlockInitNoChecksum(pCtx, pCtx->AltPrivate.abChecksum);
+    rtMd2BlockProcess(pCtx);
+
+    /*
+     * Done. Just copy out the digest.
+     */
+    memcpy(pabDigest, pCtx->AltPrivate.abStateX, RTMD2_HASH_SIZE);
+
+    RT_ZERO(pCtx->AltPrivate);
+    pCtx->AltPrivate.cbBuffer = UINT8_MAX;
+}
+RT_EXPORT_SYMBOL(RTMd2Final);
+
+
+RTDECL(void) RTMd2(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD2_HASH_SIZE])
+{
+    RTMD2CONTEXT Ctx;
+    RTMd2Init(&Ctx);
+    RTMd2Update(&Ctx, pvBuf, cbBuf);
+    RTMd2Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTMd2);
+
diff --git a/src/VBox/Runtime/common/checksum/md5.cpp b/src/VBox/Runtime/common/checksum/alt-md5.cpp
similarity index 84%
rename from src/VBox/Runtime/common/checksum/md5.cpp
rename to src/VBox/Runtime/common/checksum/alt-md5.cpp
index 05aff4a..a2c0b5c 100644
--- a/src/VBox/Runtime/common/checksum/md5.cpp
+++ b/src/VBox/Runtime/common/checksum/alt-md5.cpp
@@ -1,6 +1,6 @@
-/* $Id: md5.cpp $ */
+/* $Id: alt-md5.cpp $ */
 /** @file
- * IPRT - MD5 message digest functions.
+ * IPRT - MD5 message digest functions, alternative implementation.
  */
 
 /*
@@ -211,15 +211,15 @@ static void rtMd5ByteReverse(uint32_t *buf, unsigned int longs)
  * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
  * initialization constants.
  */
-RTDECL(void) RTMd5Init(PRTMD5CONTEXT ctx)
+RTDECL(void) RTMd5Init(PRTMD5CONTEXT pCtx)
 {
-    ctx->buf[0] = 0x67452301;
-    ctx->buf[1] = 0xefcdab89;
-    ctx->buf[2] = 0x98badcfe;
-    ctx->buf[3] = 0x10325476;
+    pCtx->AltPrivate.buf[0] = 0x67452301;
+    pCtx->AltPrivate.buf[1] = 0xefcdab89;
+    pCtx->AltPrivate.buf[2] = 0x98badcfe;
+    pCtx->AltPrivate.buf[3] = 0x10325476;
 
-    ctx->bits[0] = 0;
-    ctx->bits[1] = 0;
+    pCtx->AltPrivate.bits[0] = 0;
+    pCtx->AltPrivate.bits[1] = 0;
 }
 RT_EXPORT_SYMBOL(RTMd5Init);
 
@@ -228,23 +228,23 @@ RT_EXPORT_SYMBOL(RTMd5Init);
  * Update context to reflect the concatenation of another buffer full
  * of bytes.
  */
-RTDECL(void) RTMd5Update(PRTMD5CONTEXT ctx, const void *pvBuf, size_t len)
+RTDECL(void) RTMd5Update(PRTMD5CONTEXT pCtx, const void *pvBuf, size_t len)
 {
     const uint8_t  *buf = (const uint8_t *)pvBuf;
     uint32_t        t;
 
     /* Update bitcount */
-    t = ctx->bits[0];
-    if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
-    ctx->bits[1]++; /* Carry from low to high */
-    ctx->bits[1] += (uint32_t)(len >> 29);
+    t = pCtx->AltPrivate.bits[0];
+    if ((pCtx->AltPrivate.bits[0] = t + ((uint32_t) len << 3)) < t)
+    pCtx->AltPrivate.bits[1]++; /* Carry from low to high */
+    pCtx->AltPrivate.bits[1] += (uint32_t)(len >> 29);
 
     t = (t >> 3) & 0x3f;        /* Bytes already in shsInfo->data */
 
     /* Handle any leading odd-sized chunks */
     if (t)
     {
-        uint8_t *p = (uint8_t *) ctx->in + t;
+        uint8_t *p = (uint8_t *) pCtx->AltPrivate.in + t;
 
         t = 64 - t;
         if (len < t)
@@ -253,8 +253,8 @@ RTDECL(void) RTMd5Update(PRTMD5CONTEXT ctx, const void *pvBuf, size_t len)
             return;
         }
         memcpy(p, buf, t);
-        rtMd5ByteReverse(ctx->in, 16);
-        rtMd5Transform(ctx->buf, ctx->in);
+        rtMd5ByteReverse(pCtx->AltPrivate.in, 16);
+        rtMd5Transform(pCtx->AltPrivate.buf, pCtx->AltPrivate.in);
         buf += t;
         len -= t;
     }
@@ -264,7 +264,7 @@ RTDECL(void) RTMd5Update(PRTMD5CONTEXT ctx, const void *pvBuf, size_t len)
     if (!((uintptr_t)buf & 0x3))
     {
         while (len >= 64) {
-            rtMd5Transform(ctx->buf, (uint32_t const *)buf);
+            rtMd5Transform(pCtx->AltPrivate.buf, (uint32_t const *)buf);
             buf += 64;
             len -= 64;
         }
@@ -273,16 +273,16 @@ RTDECL(void) RTMd5Update(PRTMD5CONTEXT ctx, const void *pvBuf, size_t len)
 #endif
     {
         while (len >= 64) {
-            memcpy(ctx->in, buf, 64);
-            rtMd5ByteReverse(ctx->in, 16);
-            rtMd5Transform(ctx->buf, ctx->in);
+            memcpy(pCtx->AltPrivate.in, buf, 64);
+            rtMd5ByteReverse(pCtx->AltPrivate.in, 16);
+            rtMd5Transform(pCtx->AltPrivate.buf, pCtx->AltPrivate.in);
             buf += 64;
             len -= 64;
         }
     }
 
     /* Handle any remaining bytes of data */
-    memcpy(ctx->in, buf, len);
+    memcpy(pCtx->AltPrivate.in, buf, len);
 }
 RT_EXPORT_SYMBOL(RTMd5Update);
 
@@ -291,17 +291,17 @@ RT_EXPORT_SYMBOL(RTMd5Update);
  * Final wrapup - pad to 64-byte boundary with the bit pattern
  * 1 0* (64-bit count of bits processed, MSB-first)
  */
-RTDECL(void) RTMd5Final(uint8_t digest[16], PRTMD5CONTEXT ctx)
+RTDECL(void) RTMd5Final(uint8_t digest[16], PRTMD5CONTEXT pCtx)
 {
     unsigned int count;
     uint8_t *p;
 
     /* Compute number of bytes mod 64 */
-    count = (ctx->bits[0] >> 3) & 0x3F;
+    count = (pCtx->AltPrivate.bits[0] >> 3) & 0x3F;
 
     /* Set the first char of padding to 0x80.  This is safe since there is
        always at least one byte free */
-    p = (uint8_t *)ctx->in + count;
+    p = (uint8_t *)pCtx->AltPrivate.in + count;
     *p++ = 0x80;
 
     /* Bytes of padding needed to make 64 bytes */
@@ -312,27 +312,27 @@ RTDECL(void) RTMd5Final(uint8_t digest[16], PRTMD5CONTEXT ctx)
     {
         /* Two lots of padding:  Pad the first block to 64 bytes */
         memset(p, 0, count);
-        rtMd5ByteReverse(ctx->in, 16);
-        rtMd5Transform(ctx->buf, ctx->in);
+        rtMd5ByteReverse(pCtx->AltPrivate.in, 16);
+        rtMd5Transform(pCtx->AltPrivate.buf, pCtx->AltPrivate.in);
 
         /* Now fill the next block with 56 bytes */
-        memset(ctx->in, 0, 56);
+        memset(pCtx->AltPrivate.in, 0, 56);
     }
     else
     {
         /* Pad block to 56 bytes */
         memset(p, 0, count - 8);
     }
-    rtMd5ByteReverse(ctx->in, 14);
+    rtMd5ByteReverse(pCtx->AltPrivate.in, 14);
 
     /* Append length in bits and transform */
-    ctx->in[14] = ctx->bits[0];
-    ctx->in[15] = ctx->bits[1];
+    pCtx->AltPrivate.in[14] = pCtx->AltPrivate.bits[0];
+    pCtx->AltPrivate.in[15] = pCtx->AltPrivate.bits[1];
 
-    rtMd5Transform(ctx->buf, ctx->in);
-    rtMd5ByteReverse(ctx->buf, 4);
-    memcpy(digest, ctx->buf, 16);
-    memset(ctx, 0, sizeof(*ctx));        /* In case it's sensitive */
+    rtMd5Transform(pCtx->AltPrivate.buf, pCtx->AltPrivate.in);
+    rtMd5ByteReverse(pCtx->AltPrivate.buf, 4);
+    memcpy(digest, pCtx->AltPrivate.buf, 16);
+    memset(pCtx, 0, sizeof(*pCtx));        /* In case it's sensitive */
 }
 RT_EXPORT_SYMBOL(RTMd5Final);
 
diff --git a/src/VBox/Runtime/common/checksum/alt-sha1.cpp b/src/VBox/Runtime/common/checksum/alt-sha1.cpp
new file mode 100644
index 0000000..2c499fa
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/alt-sha1.cpp
@@ -0,0 +1,501 @@
+/* $Id: alt-sha1.cpp $ */
+/** @file
+ * IPRT - SHA-1 hash functions, Alternative Implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The SHA-1 block size (in bytes). */
+#define RTSHA1_BLOCK_SIZE   64U
+
+/** Enables the unrolled code. */
+#define RTSHA1_UNROLLED 1
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/types.h>
+#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/string.h>
+
+
+/** Our private context structure. */
+typedef struct RTSHA1ALTPRIVATECTX
+{
+    /** The W array.
+     * Buffering happens in the first 16 words, converted from big endian to host
+     * endian immediately before processing.  The amount of buffered data is kept
+     * in the 6 least significant bits of cbMessage. */
+    uint32_t    auW[80];
+    /** The message length (in bytes). */
+    uint64_t    cbMessage;
+
+    /** The 5 hash values. */
+    uint32_t    auH[5];
+} RTSHA1ALTPRIVATECTX;
+
+#define RT_SHA1_PRIVATE_ALT_CONTEXT
+#include <iprt/sha.h>
+
+
+AssertCompile(RT_SIZEOFMEMB(RTSHA1CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA1CONTEXT, AltPrivate));
+AssertCompileMemberSize(RTSHA1ALTPRIVATECTX, auH, RTSHA1_HASH_SIZE);
+
+
+
+
+RTDECL(void) RTSha1Init(PRTSHA1CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage = 0;
+    pCtx->AltPrivate.auH[0] = UINT32_C(0x67452301);
+    pCtx->AltPrivate.auH[1] = UINT32_C(0xefcdab89);
+    pCtx->AltPrivate.auH[2] = UINT32_C(0x98badcfe);
+    pCtx->AltPrivate.auH[3] = UINT32_C(0x10325476);
+    pCtx->AltPrivate.auH[4] = UINT32_C(0xc3d2e1f0);
+}
+RT_EXPORT_SYMBOL(RTSha1Init);
+
+
+/**
+ * Initializes the auW array from the specfied input block.
+ *
+ * @param   pCtx                The SHA1 context.
+ * @param   pbBlock             The block.  Must be 32-bit aligned.
+ */
+DECLINLINE(void) rtSha1BlockInit(PRTSHA1CONTEXT pCtx, uint8_t const *pbBlock)
+{
+#ifdef RTSHA1_UNROLLED
+    uint32_t const *puSrc = (uint32_t const *)pbBlock;
+    uint32_t       *puW   = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puSrc & 3));
+    Assert(!((uintptr_t)puW & 3));
+
+    /* Copy and byte-swap the block. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+# else
+    memcpy(puW, puSrc, RTSHA1_BLOCK_SIZE);
+# endif
+
+#else  /* !RTSHA1_UNROLLED */
+    uint32_t const *pu32Block = (uint32_t const *)pbBlock;
+    Assert(!((uintptr_t)pu32Block & 3));
+
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pu32Block[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t u32 = pCtx->AltPrivate.auW[iWord - 16];
+        u32         ^= pCtx->AltPrivate.auW[iWord - 14];
+        u32         ^= pCtx->AltPrivate.auW[iWord -  8];
+        u32         ^= pCtx->AltPrivate.auW[iWord -  3];
+        pCtx->AltPrivate.auW[iWord] = ASMRotateLeftU32(u32, 1);
+    }
+#endif /* !RTSHA1_UNROLLED */
+}
+
+
+/**
+ * Initializes the auW array from data buffered in the first part of the array.
+ *
+ * @param   pCtx                The SHA1 context.
+ */
+DECLINLINE(void) rtSha1BlockInitBuffered(PRTSHA1CONTEXT pCtx)
+{
+#ifdef RTSHA1_UNROLLED
+    uint32_t       *puW   = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puW & 3));
+
+    /* Do the byte swap if necessary. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+# endif
+
+#else  /* !RTSHA1_UNROLLED_INIT */
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pCtx->AltPrivate.auW[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t u32 = pCtx->AltPrivate.auW[iWord - 16];
+        u32         ^= pCtx->AltPrivate.auW[iWord - 14];
+        u32         ^= pCtx->AltPrivate.auW[iWord -  8];
+        u32         ^= pCtx->AltPrivate.auW[iWord -  3];
+        pCtx->AltPrivate.auW[iWord] = ASMRotateLeftU32(u32, 1);
+    }
+#endif /* !RTSHA1_UNROLLED_INIT */
+}
+
+
+/** Function 4.1, Ch(x,y,z). */
+DECL_FORCE_INLINE(uint32_t) rtSha1Ch(uint32_t uX, uint32_t uY, uint32_t uZ)
+{
+#if 1
+    /* Optimization that saves one operation and probably a temporary variable. */
+    uint32_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint32_t uResult = uX & uY;
+    uResult ^= ~uX & uZ;
+    return uResult;
+#endif
+}
+
+
+/** Function 4.1, Parity(x,y,z). */
+DECL_FORCE_INLINE(uint32_t) rtSha1Parity(uint32_t uX, uint32_t uY, uint32_t uZ)
+{
+    uint32_t uResult = uX;
+    uResult ^= uY;
+    uResult ^= uZ;
+    return uResult;
+}
+
+
+/** Function 4.1, Maj(x,y,z). */
+DECL_FORCE_INLINE(uint32_t) rtSha1Maj(uint32_t uX, uint32_t uY, uint32_t uZ)
+{
+#if 1
+    /* Optimization that save one operation and probably a temporary variable. */
+    uint32_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uY & uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint32_t uResult = (uX & uY);
+    uResult |= (uX & uZ);
+    uResult |= (uY & uZ);
+    return uResult;
+#endif
+}
+
+
+/**
+ * Process the current block.
+ *
+ * Requires one of the rtSha1BlockInit functions to be called first.
+ *
+ * @param   pCtx                The SHA1 context.
+ */
+static void rtSha1BlockProcess(PRTSHA1CONTEXT pCtx)
+{
+    uint32_t uA = pCtx->AltPrivate.auH[0];
+    uint32_t uB = pCtx->AltPrivate.auH[1];
+    uint32_t uC = pCtx->AltPrivate.auH[2];
+    uint32_t uD = pCtx->AltPrivate.auH[3];
+    uint32_t uE = pCtx->AltPrivate.auH[4];
+
+#ifdef RTSHA1_UNROLLED
+    /* This fully unrolled version will avoid the variable rotation by
+       embedding it into the loop unrolling. */
+    uint32_t *puW = &pCtx->AltPrivate.auW[0];
+# define SHA1_BODY(a_iWord, a_uK, a_fnFt, a_uA, a_uB, a_uC, a_uD, a_uE) \
+        do { \
+            if (a_iWord < 16) \
+                a_uE += *puW++; \
+            else \
+            { \
+                uint32_t u32 = puW[-16]; \
+                u32         ^= puW[-14]; \
+                u32         ^= puW[-8]; \
+                u32         ^= puW[-3]; \
+                u32 = ASMRotateLeftU32(u32, 1); \
+                *puW++ = u32; \
+                a_uE += u32; \
+            } \
+            a_uE += (a_uK); \
+            a_uE += ASMRotateLeftU32(a_uA, 5); \
+            a_uE += a_fnFt(a_uB, a_uC, a_uD); \
+            a_uB = ASMRotateLeftU32(a_uB, 30); \
+        } while (0)
+# define FIVE_ITERATIONS(a_iFirst, a_uK, a_fnFt) \
+    do { \
+        SHA1_BODY(a_iFirst + 0, a_uK, a_fnFt, uA, uB, uC, uD, uE); \
+        SHA1_BODY(a_iFirst + 1, a_uK, a_fnFt, uE, uA, uB, uC, uD); \
+        SHA1_BODY(a_iFirst + 2, a_uK, a_fnFt, uD, uE, uA, uB, uC); \
+        SHA1_BODY(a_iFirst + 3, a_uK, a_fnFt, uC, uD, uE, uA, uB); \
+        SHA1_BODY(a_iFirst + 4, a_uK, a_fnFt, uB, uC, uD, uE, uA); \
+    } while (0)
+# define TWENTY_ITERATIONS(a_iStart, a_uK, a_fnFt) \
+    do { \
+        FIVE_ITERATIONS(a_iStart +  0, a_uK, a_fnFt); \
+        FIVE_ITERATIONS(a_iStart +  5, a_uK, a_fnFt); \
+        FIVE_ITERATIONS(a_iStart + 10, a_uK, a_fnFt); \
+        FIVE_ITERATIONS(a_iStart + 15, a_uK, a_fnFt); \
+    } while (0)
+
+    TWENTY_ITERATIONS( 0, UINT32_C(0x5a827999), rtSha1Ch);
+    TWENTY_ITERATIONS(20, UINT32_C(0x6ed9eba1), rtSha1Parity);
+    TWENTY_ITERATIONS(40, UINT32_C(0x8f1bbcdc), rtSha1Maj);
+    TWENTY_ITERATIONS(60, UINT32_C(0xca62c1d6), rtSha1Parity);
+
+#elif 1 /* Version avoiding the constant selection. */
+    unsigned iWord = 0;
+# define TWENTY_ITERATIONS(a_iWordStop, a_uK, a_uExprBCD) \
+        for (; iWord < a_iWordStop; iWord++) \
+        { \
+            uint32_t uTemp = ASMRotateLeftU32(uA, 5); \
+            uTemp += (a_uExprBCD); \
+            uTemp += uE; \
+            uTemp += pCtx->AltPrivate.auW[iWord]; \
+            uTemp += (a_uK); \
+            \
+            uE = uD; \
+            uD = uC; \
+            uC = ASMRotateLeftU32(uB, 30); \
+            uB = uA; \
+            uA = uTemp; \
+        } do { } while (0)
+    TWENTY_ITERATIONS(20, UINT32_C(0x5a827999), rtSha1Ch(uB, uC, uD));
+    TWENTY_ITERATIONS(40, UINT32_C(0x6ed9eba1), rtSha1Parity(uB, uC, uD));
+    TWENTY_ITERATIONS(60, UINT32_C(0x8f1bbcdc), rtSha1Maj(uB, uC, uD));
+    TWENTY_ITERATIONS(80, UINT32_C(0xca62c1d6), rtSha1Parity(uB, uC, uD));
+
+#else /* Dead simple implementation. */
+    for (unsigned iWord = 0; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t uTemp = ASMRotateLeftU32(uA, 5);
+        uTemp += uE;
+        uTemp += pCtx->AltPrivate.auW[iWord];
+        if (iWord <= 19)
+        {
+            uTemp += (uB & uC) | (~uB & uD);
+            uTemp += UINT32_C(0x5a827999);
+        }
+        else if (iWord <= 39)
+        {
+            uTemp += uB ^ uC ^ uD;
+            uTemp += UINT32_C(0x6ed9eba1);
+        }
+        else if (iWord <= 59)
+        {
+            uTemp += (uB & uC) | (uB & uD) | (uC & uD);
+            uTemp += UINT32_C(0x8f1bbcdc);
+        }
+        else
+        {
+            uTemp += uB ^ uC ^ uD;
+            uTemp += UINT32_C(0xca62c1d6);
+        }
+
+        uE = uD;
+        uD = uC;
+        uC = ASMRotateLeftU32(uB, 30);
+        uB = uA;
+        uA = uTemp;
+    }
+#endif
+
+    pCtx->AltPrivate.auH[0] += uA;
+    pCtx->AltPrivate.auH[1] += uB;
+    pCtx->AltPrivate.auH[2] += uC;
+    pCtx->AltPrivate.auH[3] += uD;
+    pCtx->AltPrivate.auH[4] += uE;
+}
+
+
+RTDECL(void) RTSha1Update(PRTSHA1CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    Assert(pCtx->AltPrivate.cbMessage < UINT64_MAX / 2);
+    uint8_t const *pbBuf = (uint8_t const *)pvBuf;
+
+    /*
+     * Deal with buffered bytes first.
+     */
+    size_t cbBuffered = (size_t)pCtx->AltPrivate.cbMessage & (RTSHA1_BLOCK_SIZE - 1U);
+    if (cbBuffered)
+    {
+        size_t cbMissing = RTSHA1_BLOCK_SIZE - cbBuffered;
+        if (cbBuf >= cbMissing)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbMissing);
+            pCtx->AltPrivate.cbMessage += cbMissing;
+            pbBuf += cbMissing;
+            cbBuf -= cbMissing;
+
+            rtSha1BlockInitBuffered(pCtx);
+            rtSha1BlockProcess(pCtx);
+        }
+        else
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbBuf);
+            pCtx->AltPrivate.cbMessage += cbBuf;
+            return;
+        }
+    }
+
+    if (!((uintptr_t)pbBuf & 3))
+    {
+        /*
+         * Process full blocks directly from the input buffer.
+         */
+        while (cbBuf >= RTSHA1_BLOCK_SIZE)
+        {
+            rtSha1BlockInit(pCtx, pbBuf);
+            rtSha1BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage += RTSHA1_BLOCK_SIZE;
+            pbBuf += RTSHA1_BLOCK_SIZE;
+            cbBuf -= RTSHA1_BLOCK_SIZE;
+        }
+    }
+    else
+    {
+        /*
+         * Unaligned input, so buffer it.
+         */
+        while (cbBuf >= RTSHA1_BLOCK_SIZE)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, RTSHA1_BLOCK_SIZE);
+            rtSha1BlockInitBuffered(pCtx);
+            rtSha1BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage += RTSHA1_BLOCK_SIZE;
+            pbBuf += RTSHA1_BLOCK_SIZE;
+            cbBuf -= RTSHA1_BLOCK_SIZE;
+        }
+    }
+
+    /*
+     * Stash any remaining bytes into the context buffer.
+     */
+    if (cbBuf > 0)
+    {
+        memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, cbBuf);
+        pCtx->AltPrivate.cbMessage += cbBuf;
+    }
+}
+RT_EXPORT_SYMBOL(RTSha1Update);
+
+
+RTDECL(void) RTSha1Final(PRTSHA1CONTEXT pCtx, uint8_t pabDigest[RTSHA1_HASH_SIZE])
+{
+    Assert(pCtx->AltPrivate.cbMessage < UINT64_MAX / 2);
+
+    /*
+     * Complete the message by adding a single bit (0x80), padding till
+     * the next 448-bit boundrary, the add the message length.
+     */
+    uint64_t const cMessageBits = pCtx->AltPrivate.cbMessage * 8;
+
+    unsigned cbMissing = RTSHA1_BLOCK_SIZE - ((unsigned)pCtx->AltPrivate.cbMessage & (RTSHA1_BLOCK_SIZE - 1U));
+    static uint8_t const s_abSingleBitAndSomePadding[12] =  { 0x80, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, };
+    if (cbMissing < 1U + 8U)
+        /* Less than 64+8 bits left in the current block, force a new block. */
+        RTSha1Update(pCtx, &s_abSingleBitAndSomePadding, sizeof(s_abSingleBitAndSomePadding));
+    else
+        RTSha1Update(pCtx, &s_abSingleBitAndSomePadding, 1);
+
+    unsigned cbBuffered = (unsigned)pCtx->AltPrivate.cbMessage & (RTSHA1_BLOCK_SIZE - 1U);
+    cbMissing = RTSHA1_BLOCK_SIZE - cbBuffered;
+    Assert(cbMissing >= 8);
+    memset((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, 0, cbMissing - 8);
+
+    *(uint64_t *)&pCtx->AltPrivate.auW[14] = RT_H2BE_U64(cMessageBits);
+
+    /*
+     * Process the last buffered block constructed/completed above.
+     */
+    rtSha1BlockInitBuffered(pCtx);
+    rtSha1BlockProcess(pCtx);
+
+    /*
+     * Convert the byte order of the hash words and we're done.
+     */
+    pCtx->AltPrivate.auH[0] = RT_H2BE_U32(pCtx->AltPrivate.auH[0]);
+    pCtx->AltPrivate.auH[1] = RT_H2BE_U32(pCtx->AltPrivate.auH[1]);
+    pCtx->AltPrivate.auH[2] = RT_H2BE_U32(pCtx->AltPrivate.auH[2]);
+    pCtx->AltPrivate.auH[3] = RT_H2BE_U32(pCtx->AltPrivate.auH[3]);
+    pCtx->AltPrivate.auH[4] = RT_H2BE_U32(pCtx->AltPrivate.auH[4]);
+
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA1_HASH_SIZE);
+
+    RT_ZERO(pCtx->AltPrivate);
+    pCtx->AltPrivate.cbMessage = UINT64_MAX;
+}
+RT_EXPORT_SYMBOL(RTSha1Final);
+
+
+RTDECL(void) RTSha1(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA1_HASH_SIZE])
+{
+    RTSHA1CONTEXT Ctx;
+    RTSha1Init(&Ctx);
+    RTSha1Update(&Ctx, pvBuf, cbBuf);
+    RTSha1Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha1);
+
+
diff --git a/src/VBox/Runtime/common/checksum/alt-sha256.cpp b/src/VBox/Runtime/common/checksum/alt-sha256.cpp
new file mode 100644
index 0000000..d0e02a5
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/alt-sha256.cpp
@@ -0,0 +1,653 @@
+/* $Id: alt-sha256.cpp $ */
+/** @file
+ * IPRT - SHA-256 and SHA-224 hash functions, Alternative Implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The SHA-256 block size (in bytes). */
+#define RTSHA256_BLOCK_SIZE   64U
+
+/** Enables the unrolled code. */
+#define RTSHA256_UNROLLED 1
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/types.h>
+#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/string.h>
+
+
+/** Our private context structure. */
+typedef struct RTSHA256ALTPRIVATECTX
+{
+    /** The W array.
+     * Buffering happens in the first 16 words, converted from big endian to host
+     * endian immediately before processing.  The amount of buffered data is kept
+     * in the 6 least significant bits of cbMessage. */
+    uint32_t    auW[64];
+    /** The message length (in bytes). */
+    uint64_t    cbMessage;
+    /** The 8 hash values. */
+    uint32_t    auH[8];
+} RTSHA256ALTPRIVATECTX;
+
+#define RT_SHA256_PRIVATE_ALT_CONTEXT
+#include <iprt/sha.h>
+
+
+AssertCompile(RT_SIZEOFMEMB(RTSHA256CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA256CONTEXT, AltPrivate));
+AssertCompileMemberSize(RTSHA256ALTPRIVATECTX, auH, RTSHA256_HASH_SIZE);
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+#ifndef RTSHA256_UNROLLED
+/** The K constants */
+static uint32_t const g_auKs[] =
+{
+    UINT32_C(0x428a2f98), UINT32_C(0x71374491), UINT32_C(0xb5c0fbcf), UINT32_C(0xe9b5dba5),
+    UINT32_C(0x3956c25b), UINT32_C(0x59f111f1), UINT32_C(0x923f82a4), UINT32_C(0xab1c5ed5),
+    UINT32_C(0xd807aa98), UINT32_C(0x12835b01), UINT32_C(0x243185be), UINT32_C(0x550c7dc3),
+    UINT32_C(0x72be5d74), UINT32_C(0x80deb1fe), UINT32_C(0x9bdc06a7), UINT32_C(0xc19bf174),
+    UINT32_C(0xe49b69c1), UINT32_C(0xefbe4786), UINT32_C(0x0fc19dc6), UINT32_C(0x240ca1cc),
+    UINT32_C(0x2de92c6f), UINT32_C(0x4a7484aa), UINT32_C(0x5cb0a9dc), UINT32_C(0x76f988da),
+    UINT32_C(0x983e5152), UINT32_C(0xa831c66d), UINT32_C(0xb00327c8), UINT32_C(0xbf597fc7),
+    UINT32_C(0xc6e00bf3), UINT32_C(0xd5a79147), UINT32_C(0x06ca6351), UINT32_C(0x14292967),
+    UINT32_C(0x27b70a85), UINT32_C(0x2e1b2138), UINT32_C(0x4d2c6dfc), UINT32_C(0x53380d13),
+    UINT32_C(0x650a7354), UINT32_C(0x766a0abb), UINT32_C(0x81c2c92e), UINT32_C(0x92722c85),
+    UINT32_C(0xa2bfe8a1), UINT32_C(0xa81a664b), UINT32_C(0xc24b8b70), UINT32_C(0xc76c51a3),
+    UINT32_C(0xd192e819), UINT32_C(0xd6990624), UINT32_C(0xf40e3585), UINT32_C(0x106aa070),
+    UINT32_C(0x19a4c116), UINT32_C(0x1e376c08), UINT32_C(0x2748774c), UINT32_C(0x34b0bcb5),
+    UINT32_C(0x391c0cb3), UINT32_C(0x4ed8aa4a), UINT32_C(0x5b9cca4f), UINT32_C(0x682e6ff3),
+    UINT32_C(0x748f82ee), UINT32_C(0x78a5636f), UINT32_C(0x84c87814), UINT32_C(0x8cc70208),
+    UINT32_C(0x90befffa), UINT32_C(0xa4506ceb), UINT32_C(0xbef9a3f7), UINT32_C(0xc67178f2),
+};
+#endif /* !RTSHA256_UNROLLED */
+
+
+
+RTDECL(void) RTSha256Init(PRTSHA256CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage = 0;
+    pCtx->AltPrivate.auH[0] = UINT32_C(0x6a09e667);
+    pCtx->AltPrivate.auH[1] = UINT32_C(0xbb67ae85);
+    pCtx->AltPrivate.auH[2] = UINT32_C(0x3c6ef372);
+    pCtx->AltPrivate.auH[3] = UINT32_C(0xa54ff53a);
+    pCtx->AltPrivate.auH[4] = UINT32_C(0x510e527f);
+    pCtx->AltPrivate.auH[5] = UINT32_C(0x9b05688c);
+    pCtx->AltPrivate.auH[6] = UINT32_C(0x1f83d9ab);
+    pCtx->AltPrivate.auH[7] = UINT32_C(0x5be0cd19);
+}
+RT_EXPORT_SYMBOL(RTSha256Init);
+
+
+/** Function 4.2. */
+DECL_FORCE_INLINE(uint32_t) rtSha256Ch(uint32_t uX, uint32_t uY, uint32_t uZ)
+{
+#if 1
+    /* Optimization that saves one operation and probably a temporary variable. */
+    uint32_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint32_t uResult = uX & uY;
+    uResult ^= ~uX & uZ;
+    return uResult;
+#endif
+}
+
+
+/** Function 4.3. */
+DECL_FORCE_INLINE(uint32_t) rtSha256Maj(uint32_t uX, uint32_t uY, uint32_t uZ)
+{
+#if 1
+    /* Optimization that save one operation and probably a temporary variable. */
+    uint32_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uY & uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint32_t uResult = uX & uY;
+    uResult ^= uX & uZ;
+    uResult ^= uY & uZ;
+    return uResult;
+#endif
+}
+
+
+/** Function 4.4. */
+DECL_FORCE_INLINE(uint32_t) rtSha256CapitalSigma0(uint32_t uX)
+{
+    uint32_t uResult = uX = ASMRotateRightU32(uX, 2);
+    uX = ASMRotateRightU32(uX, 13 - 2);
+    uResult ^= uX;
+    uX = ASMRotateRightU32(uX, 22 - 13);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.5. */
+DECL_FORCE_INLINE(uint32_t) rtSha256CapitalSigma1(uint32_t uX)
+{
+    uint32_t uResult = uX = ASMRotateRightU32(uX, 6);
+    uX = ASMRotateRightU32(uX, 11 - 6);
+    uResult ^= uX;
+    uX = ASMRotateRightU32(uX, 25 - 11);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.6. */
+DECL_FORCE_INLINE(uint32_t) rtSha256SmallSigma0(uint32_t uX)
+{
+    uint32_t uResult = uX >> 3;
+    uX = ASMRotateRightU32(uX, 7);
+    uResult ^= uX;
+    uX = ASMRotateRightU32(uX, 18 - 7);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.7. */
+DECL_FORCE_INLINE(uint32_t) rtSha256SmallSigma1(uint32_t uX)
+{
+    uint32_t uResult = uX >> 10;
+    uX = ASMRotateRightU32(uX, 17);
+    uResult ^= uX;
+    uX = ASMRotateRightU32(uX, 19 - 17);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/**
+ * Initializes the auW array from the specfied input block.
+ *
+ * @param   pCtx                The SHA-256 context.
+ * @param   pbBlock             The block.  Must be arch-bit-width aligned.
+ */
+DECLINLINE(void) rtSha256BlockInit(PRTSHA256CONTEXT pCtx, uint8_t const *pbBlock)
+{
+#ifdef RTSHA256_UNROLLED
+    /* Copy and byte-swap the block. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+#  if 0 /* Just an idea... very little gain as this isn't the expensive code. */
+    __m128i const  uBSwapConst = { 3, 2, 1, 0,  7, 6, 5, 4,  11, 10, 9, 8,  15, 14, 13, 12 };
+    __m128i const *puSrc = (__m128i const *)pbBlock;
+    __m128i       *puDst = (__m128i *)&pCtx->AltPrivate.auW[0];
+
+    _mm_storeu_si128(puDst, _mm_shuffle_epi8(_mm_loadu_si128(puSrc), uBSwapConst)); puDst++; puSrc++;
+    _mm_storeu_si128(puDst, _mm_shuffle_epi8(_mm_loadu_si128(puSrc), uBSwapConst)); puDst++; puSrc++;
+    _mm_storeu_si128(puDst, _mm_shuffle_epi8(_mm_loadu_si128(puSrc), uBSwapConst)); puDst++; puSrc++;
+    _mm_storeu_si128(puDst, _mm_shuffle_epi8(_mm_loadu_si128(puSrc), uBSwapConst)); puDst++; puSrc++;
+
+#  elif ARCH_BITS == 64
+    uint64_t const *puSrc = (uint64_t const *)pbBlock;
+    uint64_t       *puW   = (uint64_t *)&pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puSrc & 7));
+    Assert(!((uintptr_t)puW & 7));
+
+    /* b0 b1 b2 b3  b4 b5 b6 b7 --bwap--> b7 b6 b5 b4 b3 b2 b1 b0 --ror--> b3 b2 b1 b0  b7 b6 b5 b4; */
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+    *puW++ = ASMRotateRightU64(ASMByteSwapU64(*puSrc++), 32);
+
+#  else
+    uint32_t const *puSrc = (uint32_t const *)pbBlock;
+    uint32_t       *puW   = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puSrc & 3));
+    Assert(!((uintptr_t)puW & 3));
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+    *puW++ = ASMByteSwapU32(*puSrc++);
+#  endif
+# else  /* RT_BIG_ENDIAN */
+    memcpy(&pCtx->AltPrivate.auW[0], pbBlock, RTSHA256_BLOCK_SIZE);
+# endif /* RT_BIG_ENDIAN */
+
+#else  /* !RTSHA256_UNROLLED */
+    uint32_t const *pu32Block = (uint32_t const *)pbBlock;
+    Assert(!((uintptr_t)pu32Block & 3));
+
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pu32Block[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t u32 = rtSha256SmallSigma1(pCtx->AltPrivate.auW[iWord - 2]);
+        u32         += rtSha256SmallSigma0(pCtx->AltPrivate.auW[iWord - 15]);
+        u32         += pCtx->AltPrivate.auW[iWord - 7];
+        u32         += pCtx->AltPrivate.auW[iWord - 16];
+        pCtx->AltPrivate.auW[iWord] = u32;
+    }
+#endif /* !RTSHA256_UNROLLED */
+}
+
+
+/**
+ * Initializes the auW array from data buffered in the first part of the array.
+ *
+ * @param   pCtx                The SHA-256 context.
+ */
+DECLINLINE(void) rtSha256BlockInitBuffered(PRTSHA256CONTEXT pCtx)
+{
+#ifdef RTSHA256_UNROLLED
+    /* Do the byte swap if necessary. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+#  if ARCH_BITS == 64
+    uint64_t *puW = (uint64_t *)&pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puW & 7));
+    /* b0 b1 b2 b3  b4 b5 b6 b7 --bwap--> b7 b6 b5 b4 b3 b2 b1 b0 --ror--> b3 b2 b1 b0  b7 b6 b5 b4; */
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+    *puW = ASMRotateRightU64(ASMByteSwapU64(*puW), 32); puW++;
+
+#  else
+    uint32_t *puW = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puW & 3));
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+    *puW = ASMByteSwapU32(*puW); puW++;
+#  endif
+# endif
+
+#else  /* !RTSHA256_UNROLLED */
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U32(pCtx->AltPrivate.auW[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t u32 = rtSha256SmallSigma1(pCtx->AltPrivate.auW[iWord - 2]);
+        u32         += rtSha256SmallSigma0(pCtx->AltPrivate.auW[iWord - 15]);
+        u32         += pCtx->AltPrivate.auW[iWord - 7];
+        u32         += pCtx->AltPrivate.auW[iWord - 16];
+        pCtx->AltPrivate.auW[iWord] = u32;
+    }
+#endif /* !RTSHA256_UNROLLED */
+}
+
+
+/**
+ * Process the current block.
+ *
+ * Requires one of the rtSha256BlockInit functions to be called first.
+ *
+ * @param   pCtx                The SHA-256 context.
+ */
+static void rtSha256BlockProcess(PRTSHA256CONTEXT pCtx)
+{
+    uint32_t uA = pCtx->AltPrivate.auH[0];
+    uint32_t uB = pCtx->AltPrivate.auH[1];
+    uint32_t uC = pCtx->AltPrivate.auH[2];
+    uint32_t uD = pCtx->AltPrivate.auH[3];
+    uint32_t uE = pCtx->AltPrivate.auH[4];
+    uint32_t uF = pCtx->AltPrivate.auH[5];
+    uint32_t uG = pCtx->AltPrivate.auH[6];
+    uint32_t uH = pCtx->AltPrivate.auH[7];
+
+#ifdef RTSHA256_UNROLLED
+    uint32_t *puW = &pCtx->AltPrivate.auW[0];
+# define RTSHA256_BODY(a_iWord, a_uK, a_uA, a_uB, a_uC, a_uD, a_uE, a_uF, a_uG, a_uH) \
+        do { \
+            if ((a_iWord) < 16) \
+                a_uH += *puW++; \
+            else \
+            { \
+                uint32_t u32 = puW[-16]; \
+                u32 += rtSha256SmallSigma0(puW[-15]); \
+                u32 += puW[-7]; \
+                u32 += rtSha256SmallSigma1(puW[-2]); \
+                if (a_iWord < 64-2) *puW++ = u32; else puW++; \
+                a_uH += u32; \
+            } \
+            \
+            a_uH += rtSha256CapitalSigma1(a_uE); \
+            a_uH += a_uK; \
+            a_uH += rtSha256Ch(a_uE, a_uF, a_uG); \
+            a_uD += a_uH; \
+            \
+            a_uH += rtSha256CapitalSigma0(a_uA); \
+            a_uH += rtSha256Maj(a_uA, a_uB, a_uC); \
+        } while (0)
+# define RTSHA256_EIGHT(a_uK0, a_uK1, a_uK2, a_uK3, a_uK4, a_uK5, a_uK6, a_uK7, a_iFirst) \
+        do { \
+            RTSHA256_BODY(a_iFirst + 0, a_uK0, uA, uB, uC, uD, uE, uF, uG, uH); \
+            RTSHA256_BODY(a_iFirst + 1, a_uK1, uH, uA, uB, uC, uD, uE, uF, uG); \
+            RTSHA256_BODY(a_iFirst + 2, a_uK2, uG, uH, uA, uB, uC, uD, uE, uF); \
+            RTSHA256_BODY(a_iFirst + 3, a_uK3, uF, uG, uH, uA, uB, uC, uD, uE); \
+            RTSHA256_BODY(a_iFirst + 4, a_uK4, uE, uF, uG, uH, uA, uB, uC, uD); \
+            RTSHA256_BODY(a_iFirst + 5, a_uK5, uD, uE, uF, uG, uH, uA, uB, uC); \
+            RTSHA256_BODY(a_iFirst + 6, a_uK6, uC, uD, uE, uF, uG, uH, uA, uB); \
+            RTSHA256_BODY(a_iFirst + 7, a_uK7, uB, uC, uD, uE, uF, uG, uH, uA); \
+        } while (0)
+    RTSHA256_EIGHT(UINT32_C(0x428a2f98), UINT32_C(0x71374491), UINT32_C(0xb5c0fbcf), UINT32_C(0xe9b5dba5),
+                   UINT32_C(0x3956c25b), UINT32_C(0x59f111f1), UINT32_C(0x923f82a4), UINT32_C(0xab1c5ed5), 0);
+    RTSHA256_EIGHT(UINT32_C(0xd807aa98), UINT32_C(0x12835b01), UINT32_C(0x243185be), UINT32_C(0x550c7dc3),
+                   UINT32_C(0x72be5d74), UINT32_C(0x80deb1fe), UINT32_C(0x9bdc06a7), UINT32_C(0xc19bf174), 8);
+    RTSHA256_EIGHT(UINT32_C(0xe49b69c1), UINT32_C(0xefbe4786), UINT32_C(0x0fc19dc6), UINT32_C(0x240ca1cc),
+                   UINT32_C(0x2de92c6f), UINT32_C(0x4a7484aa), UINT32_C(0x5cb0a9dc), UINT32_C(0x76f988da), 16);
+    RTSHA256_EIGHT(UINT32_C(0x983e5152), UINT32_C(0xa831c66d), UINT32_C(0xb00327c8), UINT32_C(0xbf597fc7),
+                   UINT32_C(0xc6e00bf3), UINT32_C(0xd5a79147), UINT32_C(0x06ca6351), UINT32_C(0x14292967), 24);
+    RTSHA256_EIGHT(UINT32_C(0x27b70a85), UINT32_C(0x2e1b2138), UINT32_C(0x4d2c6dfc), UINT32_C(0x53380d13),
+                   UINT32_C(0x650a7354), UINT32_C(0x766a0abb), UINT32_C(0x81c2c92e), UINT32_C(0x92722c85), 32);
+    RTSHA256_EIGHT(UINT32_C(0xa2bfe8a1), UINT32_C(0xa81a664b), UINT32_C(0xc24b8b70), UINT32_C(0xc76c51a3),
+                   UINT32_C(0xd192e819), UINT32_C(0xd6990624), UINT32_C(0xf40e3585), UINT32_C(0x106aa070), 40);
+    RTSHA256_EIGHT(UINT32_C(0x19a4c116), UINT32_C(0x1e376c08), UINT32_C(0x2748774c), UINT32_C(0x34b0bcb5),
+                   UINT32_C(0x391c0cb3), UINT32_C(0x4ed8aa4a), UINT32_C(0x5b9cca4f), UINT32_C(0x682e6ff3), 48);
+    RTSHA256_EIGHT(UINT32_C(0x748f82ee), UINT32_C(0x78a5636f), UINT32_C(0x84c87814), UINT32_C(0x8cc70208),
+                   UINT32_C(0x90befffa), UINT32_C(0xa4506ceb), UINT32_C(0xbef9a3f7), UINT32_C(0xc67178f2), 56);
+
+#else  /* !RTSHA256_UNROLLED */
+    for (unsigned iWord = 0; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint32_t uT1 = uH;
+        uT1 += rtSha256CapitalSigma1(uE);
+        uT1 += rtSha256Ch(uE, uF, uG);
+        uT1 += g_auKs[iWord];
+        uT1 += pCtx->AltPrivate.auW[iWord];
+
+        uint32_t uT2 = rtSha256CapitalSigma0(uA);
+        uT2 += rtSha256Maj(uA, uB, uC);
+
+        uH = uG;
+        uG = uF;
+        uF = uE;
+        uE = uD + uT1;
+        uD = uC;
+        uC = uB;
+        uB = uA;
+        uA = uT1 + uT2;
+    }
+#endif /* !RTSHA256_UNROLLED */
+
+    pCtx->AltPrivate.auH[0] += uA;
+    pCtx->AltPrivate.auH[1] += uB;
+    pCtx->AltPrivate.auH[2] += uC;
+    pCtx->AltPrivate.auH[3] += uD;
+    pCtx->AltPrivate.auH[4] += uE;
+    pCtx->AltPrivate.auH[5] += uF;
+    pCtx->AltPrivate.auH[6] += uG;
+    pCtx->AltPrivate.auH[7] += uH;
+}
+
+
+RTDECL(void) RTSha256Update(PRTSHA256CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    Assert(pCtx->AltPrivate.cbMessage < UINT64_MAX / 8);
+    uint8_t const *pbBuf = (uint8_t const *)pvBuf;
+
+    /*
+     * Deal with buffered bytes first.
+     */
+    size_t cbBuffered = (size_t)pCtx->AltPrivate.cbMessage & (RTSHA256_BLOCK_SIZE - 1U);
+    if (cbBuffered)
+    {
+        size_t cbMissing = RTSHA256_BLOCK_SIZE - cbBuffered;
+        if (cbBuf >= cbMissing)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbMissing);
+            pCtx->AltPrivate.cbMessage += cbMissing;
+            pbBuf += cbMissing;
+            cbBuf -= cbMissing;
+
+            rtSha256BlockInitBuffered(pCtx);
+            rtSha256BlockProcess(pCtx);
+        }
+        else
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbBuf);
+            pCtx->AltPrivate.cbMessage += cbBuf;
+            return;
+        }
+    }
+
+    if (!((uintptr_t)pbBuf & (sizeof(void *) - 1)))
+    {
+        /*
+         * Process full blocks directly from the input buffer.
+         */
+        while (cbBuf >= RTSHA256_BLOCK_SIZE)
+        {
+            rtSha256BlockInit(pCtx, pbBuf);
+            rtSha256BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage += RTSHA256_BLOCK_SIZE;
+            pbBuf += RTSHA256_BLOCK_SIZE;
+            cbBuf -= RTSHA256_BLOCK_SIZE;
+        }
+    }
+    else
+    {
+        /*
+         * Unaligned input, so buffer it.
+         */
+        while (cbBuf >= RTSHA256_BLOCK_SIZE)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, RTSHA256_BLOCK_SIZE);
+            rtSha256BlockInitBuffered(pCtx);
+            rtSha256BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage += RTSHA256_BLOCK_SIZE;
+            pbBuf += RTSHA256_BLOCK_SIZE;
+            cbBuf -= RTSHA256_BLOCK_SIZE;
+        }
+    }
+
+    /*
+     * Stash any remaining bytes into the context buffer.
+     */
+    if (cbBuf > 0)
+    {
+        memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, cbBuf);
+        pCtx->AltPrivate.cbMessage += cbBuf;
+    }
+}
+RT_EXPORT_SYMBOL(RTSha256Update);
+
+
+/**
+ * Internal worker for RTSha256Final and RTSha224Final that finalizes the
+ * computation but does not copy out the hash value.
+ *
+ * @param   pCtx                The SHA-256 context.
+ */
+static void rtSha256FinalInternal(PRTSHA256CONTEXT pCtx)
+{
+    Assert(pCtx->AltPrivate.cbMessage < UINT64_MAX / 8);
+
+    /*
+     * Complete the message by adding a single bit (0x80), padding till
+     * the next 448-bit boundrary, the add the message length.
+     */
+    uint64_t const cMessageBits = pCtx->AltPrivate.cbMessage * 8;
+
+    unsigned cbMissing = RTSHA256_BLOCK_SIZE - ((unsigned)pCtx->AltPrivate.cbMessage & (RTSHA256_BLOCK_SIZE - 1U));
+    static uint8_t const s_abSingleBitAndSomePadding[12] =  { 0x80, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, };
+    if (cbMissing < 1U + 8U)
+        /* Less than 64+8 bits left in the current block, force a new block. */
+        RTSha256Update(pCtx, &s_abSingleBitAndSomePadding, sizeof(s_abSingleBitAndSomePadding));
+    else
+        RTSha256Update(pCtx, &s_abSingleBitAndSomePadding, 1);
+
+    unsigned cbBuffered = (unsigned)pCtx->AltPrivate.cbMessage & (RTSHA256_BLOCK_SIZE - 1U);
+    cbMissing = RTSHA256_BLOCK_SIZE - cbBuffered;
+    Assert(cbMissing >= 8);
+    memset((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, 0, cbMissing - 8);
+
+    *(uint64_t *)&pCtx->AltPrivate.auW[14] = RT_H2BE_U64(cMessageBits);
+
+    /*
+     * Process the last buffered block constructed/completed above.
+     */
+    rtSha256BlockInitBuffered(pCtx);
+    rtSha256BlockProcess(pCtx);
+
+    /*
+     * Convert the byte order of the hash words and we're done.
+     */
+    pCtx->AltPrivate.auH[0] = RT_H2BE_U32(pCtx->AltPrivate.auH[0]);
+    pCtx->AltPrivate.auH[1] = RT_H2BE_U32(pCtx->AltPrivate.auH[1]);
+    pCtx->AltPrivate.auH[2] = RT_H2BE_U32(pCtx->AltPrivate.auH[2]);
+    pCtx->AltPrivate.auH[3] = RT_H2BE_U32(pCtx->AltPrivate.auH[3]);
+    pCtx->AltPrivate.auH[4] = RT_H2BE_U32(pCtx->AltPrivate.auH[4]);
+    pCtx->AltPrivate.auH[5] = RT_H2BE_U32(pCtx->AltPrivate.auH[5]);
+    pCtx->AltPrivate.auH[6] = RT_H2BE_U32(pCtx->AltPrivate.auH[6]);
+    pCtx->AltPrivate.auH[7] = RT_H2BE_U32(pCtx->AltPrivate.auH[7]);
+
+    RT_ZERO(pCtx->AltPrivate.auW);
+    pCtx->AltPrivate.cbMessage = UINT64_MAX;
+}
+RT_EXPORT_SYMBOL(RTSha256Final);
+
+
+RTDECL(void) RTSha256Final(PRTSHA256CONTEXT pCtx, uint8_t pabDigest[RTSHA256_HASH_SIZE])
+{
+    rtSha256FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA256_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha256Final);
+
+
+RTDECL(void) RTSha256(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA256_HASH_SIZE])
+{
+    RTSHA256CONTEXT Ctx;
+    RTSha256Init(&Ctx);
+    RTSha256Update(&Ctx, pvBuf, cbBuf);
+    RTSha256Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha256);
+
+
+
+/*
+ * SHA-224 is just SHA-256 with different initial values an a truncated result.
+ */
+
+RTDECL(void) RTSha224Init(PRTSHA224CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage = 0;
+    pCtx->AltPrivate.auH[0] = UINT32_C(0xc1059ed8);
+    pCtx->AltPrivate.auH[1] = UINT32_C(0x367cd507);
+    pCtx->AltPrivate.auH[2] = UINT32_C(0x3070dd17);
+    pCtx->AltPrivate.auH[3] = UINT32_C(0xf70e5939);
+    pCtx->AltPrivate.auH[4] = UINT32_C(0xffc00b31);
+    pCtx->AltPrivate.auH[5] = UINT32_C(0x68581511);
+    pCtx->AltPrivate.auH[6] = UINT32_C(0x64f98fa7);
+    pCtx->AltPrivate.auH[7] = UINT32_C(0xbefa4fa4);
+}
+RT_EXPORT_SYMBOL(RTSha224Init);
+
+
+RTDECL(void) RTSha224Update(PRTSHA224CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    RTSha256Update(pCtx, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha224Update);
+
+
+RTDECL(void) RTSha224Final(PRTSHA224CONTEXT pCtx, uint8_t pabDigest[RTSHA224_HASH_SIZE])
+{
+    rtSha256FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA224_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha224Final);
+
+
+RTDECL(void) RTSha224(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA224_HASH_SIZE])
+{
+    RTSHA224CONTEXT Ctx;
+    RTSha224Init(&Ctx);
+    RTSha224Update(&Ctx, pvBuf, cbBuf);
+    RTSha224Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha224);
+
diff --git a/src/VBox/Runtime/common/checksum/alt-sha512.cpp b/src/VBox/Runtime/common/checksum/alt-sha512.cpp
new file mode 100644
index 0000000..f7e7e20
--- /dev/null
+++ b/src/VBox/Runtime/common/checksum/alt-sha512.cpp
@@ -0,0 +1,735 @@
+/* $Id: alt-sha512.cpp $ */
+/** @file
+ * IPRT - SHA-512 and SHA-384 hash functions, Alternative Implementation.
+ */
+
+/*
+ * Copyright (C) 2009-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** The SHA-512 block size (in bytes). */
+#define RTSHA512_BLOCK_SIZE   128U
+
+/** Enables the unrolled code. */
+#define RTSHA512_UNROLLED 1
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/types.h>
+#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/string.h>
+
+
+/** Our private context structure. */
+typedef struct RTSHA512ALTPRIVATECTX
+{
+    /** The W array.
+     * Buffering happens in the first 16 words, converted from big endian to host
+     * endian immediately before processing.  The amount of buffered data is kept
+     * in the 6 least significant bits of cbMessage. */
+    uint64_t    auW[80];
+    /** The message length (in bytes). */
+    RTUINT128U  cbMessage;
+    /** The 8 hash values. */
+    uint64_t    auH[8];
+} RTSHA512ALTPRIVATECTX;
+
+#define RT_SHA512_PRIVATE_ALT_CONTEXT
+#include <iprt/sha.h>
+
+
+AssertCompile(RT_SIZEOFMEMB(RTSHA512CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA512CONTEXT, AltPrivate));
+AssertCompileMemberSize(RTSHA512ALTPRIVATECTX, auH, RTSHA512_HASH_SIZE);
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+#ifndef RTSHA512_UNROLLED
+/** The K constants. */
+static uint64_t const g_auKs[] =
+{
+    UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc),
+    UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118),
+    UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2),
+    UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694),
+    UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65),
+    UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5),
+    UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4),
+    UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70),
+    UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df),
+    UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b),
+    UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30),
+    UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8),
+    UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8),
+    UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3),
+    UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec),
+    UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b),
+    UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178),
+    UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b),
+    UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c),
+    UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817),
+};
+#endif /* !RTSHA512_UNROLLED */
+
+
+
+RTDECL(void) RTSha512Init(PRTSHA512CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage.s.Lo = 0;
+    pCtx->AltPrivate.cbMessage.s.Hi = 0;
+    pCtx->AltPrivate.auH[0] = UINT64_C(0x6a09e667f3bcc908);
+    pCtx->AltPrivate.auH[1] = UINT64_C(0xbb67ae8584caa73b);
+    pCtx->AltPrivate.auH[2] = UINT64_C(0x3c6ef372fe94f82b);
+    pCtx->AltPrivate.auH[3] = UINT64_C(0xa54ff53a5f1d36f1);
+    pCtx->AltPrivate.auH[4] = UINT64_C(0x510e527fade682d1);
+    pCtx->AltPrivate.auH[5] = UINT64_C(0x9b05688c2b3e6c1f);
+    pCtx->AltPrivate.auH[6] = UINT64_C(0x1f83d9abfb41bd6b);
+    pCtx->AltPrivate.auH[7] = UINT64_C(0x5be0cd19137e2179);
+}
+RT_EXPORT_SYMBOL(RTSha512Init);
+
+
+/** Function 4.8. */
+DECL_FORCE_INLINE(uint64_t) rtSha512Ch(uint64_t uX, uint64_t uY, uint64_t uZ)
+{
+#if 1
+    /* Optimization that saves one operation and probably a temporary variable. */
+    uint64_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint64_t uResult = uX & uY;
+    uResult ^= ~uX & uZ;
+    return uResult;
+#endif
+}
+
+
+/** Function 4.9. */
+DECL_FORCE_INLINE(uint64_t) rtSha512Maj(uint64_t uX, uint64_t uY, uint64_t uZ)
+{
+#if 1
+    /* Optimization that save one operation and probably a temporary variable. */
+    uint64_t uResult = uY;
+    uResult ^= uZ;
+    uResult &= uX;
+    uResult ^= uY & uZ;
+    return uResult;
+#else
+    /* The original. */
+    uint64_t uResult = uX & uY;
+    uResult ^= uX & uZ;
+    uResult ^= uY & uZ;
+    return uResult;
+#endif
+}
+
+
+/** Function 4.10. */
+DECL_FORCE_INLINE(uint64_t) rtSha512CapitalSigma0(uint64_t uX)
+{
+    uint64_t uResult = uX = ASMRotateRightU64(uX, 28);
+    uX = ASMRotateRightU64(uX, 34 - 28);
+    uResult ^= uX;
+    uX = ASMRotateRightU64(uX, 39 - 34);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.11. */
+DECL_FORCE_INLINE(uint64_t) rtSha512CapitalSigma1(uint64_t uX)
+{
+    uint64_t uResult = uX = ASMRotateRightU64(uX, 14);
+    uX = ASMRotateRightU64(uX, 18 - 14);
+    uResult ^= uX;
+    uX = ASMRotateRightU64(uX, 41 - 18);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.12. */
+DECL_FORCE_INLINE(uint64_t) rtSha512SmallSigma0(uint64_t uX)
+{
+    uint64_t uResult = uX >> 7;
+    uX = ASMRotateRightU64(uX, 1);
+    uResult ^= uX;
+    uX = ASMRotateRightU64(uX, 8 - 1);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/** Function 4.13. */
+DECL_FORCE_INLINE(uint64_t) rtSha512SmallSigma1(uint64_t uX)
+{
+    uint64_t uResult = uX >> 6;
+    uX = ASMRotateRightU64(uX, 19);
+    uResult ^= uX;
+    uX = ASMRotateRightU64(uX, 61 - 19);
+    uResult ^= uX;
+    return uResult;
+}
+
+
+/**
+ * Initializes the auW array from the specfied input block.
+ *
+ * @param   pCtx                The SHA-512 context.
+ * @param   pbBlock             The block.  Must be 64-bit aligned.
+ */
+DECLINLINE(void) rtSha512BlockInit(PRTSHA512CONTEXT pCtx, uint8_t const *pbBlock)
+{
+#ifdef RTSHA512_UNROLLED
+    uint64_t const *puSrc = (uint64_t const *)pbBlock;
+    uint64_t       *puW   = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puSrc & 7));
+    Assert(!((uintptr_t)puW & 7));
+
+    /* Copy and byte-swap the block. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+    *puW++ = ASMByteSwapU64(*puSrc++);
+# else
+    memcpy(puW, puSrc, RTSHA512_BLOCK_SIZE);
+# endif
+
+#else  /* !RTSHA512_UNROLLED */
+
+    uint64_t const *pu32Block = (uint64_t const *)pbBlock;
+    Assert(!((uintptr_t)pu32Block & 3));
+
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U64(pu32Block[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint64_t u64 = rtSha512SmallSigma1(pCtx->AltPrivate.auW[iWord - 2]);
+        u64         += rtSha512SmallSigma0(pCtx->AltPrivate.auW[iWord - 15]);
+        u64         += pCtx->AltPrivate.auW[iWord - 7];
+        u64         += pCtx->AltPrivate.auW[iWord - 16];
+        pCtx->AltPrivate.auW[iWord] = u64;
+    }
+#endif /* !RTSHA512_UNROLLED */
+}
+
+
+/**
+ * Initializes the auW array from data buffered in the first part of the array.
+ *
+ * @param   pCtx                The SHA-512 context.
+ */
+DECLINLINE(void) rtSha512BlockInitBuffered(PRTSHA512CONTEXT pCtx)
+{
+#ifdef RTSHA512_UNROLLED
+    uint64_t *puW = &pCtx->AltPrivate.auW[0];
+    Assert(!((uintptr_t)puW & 7));
+
+    /* Do the byte swap if necessary. Initializing the rest of the Ws are done
+       in the processing loop. */
+# ifdef RT_LITTLE_ENDIAN
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+    *puW = ASMByteSwapU64(*puW); puW++;
+# endif
+
+#else  /* !RTSHA512_UNROLLED */
+
+    unsigned iWord;
+    for (iWord = 0; iWord < 16; iWord++)
+        pCtx->AltPrivate.auW[iWord] = RT_BE2H_U64(pCtx->AltPrivate.auW[iWord]);
+
+    for (; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint64_t u64 = rtSha512SmallSigma1(pCtx->AltPrivate.auW[iWord - 2]);
+        u64         += rtSha512SmallSigma0(pCtx->AltPrivate.auW[iWord - 15]);
+        u64         += pCtx->AltPrivate.auW[iWord - 7];
+        u64         += pCtx->AltPrivate.auW[iWord - 16];
+        pCtx->AltPrivate.auW[iWord] = u64;
+    }
+#endif /* !RTSHA512_UNROLLED */
+}
+
+
+/**
+ * Process the current block.
+ *
+ * Requires one of the rtSha512BlockInit functions to be called first.
+ *
+ * @param   pCtx                The SHA-512 context.
+ */
+static void rtSha512BlockProcess(PRTSHA512CONTEXT pCtx)
+{
+    uint64_t uA = pCtx->AltPrivate.auH[0];
+    uint64_t uB = pCtx->AltPrivate.auH[1];
+    uint64_t uC = pCtx->AltPrivate.auH[2];
+    uint64_t uD = pCtx->AltPrivate.auH[3];
+    uint64_t uE = pCtx->AltPrivate.auH[4];
+    uint64_t uF = pCtx->AltPrivate.auH[5];
+    uint64_t uG = pCtx->AltPrivate.auH[6];
+    uint64_t uH = pCtx->AltPrivate.auH[7];
+
+#ifdef RTSHA512_UNROLLED
+    uint64_t *puW = &pCtx->AltPrivate.auW[0];
+# define RTSHA512_BODY(a_iWord, a_uK, a_uA, a_uB, a_uC, a_uD, a_uE, a_uF, a_uG, a_uH) \
+        do { \
+            if ((a_iWord) < 16) \
+                a_uH += *puW++; \
+            else \
+            { \
+                uint64_t u64 = puW[-16]; \
+                u64 += rtSha512SmallSigma0(puW[-15]); \
+                u64 += puW[-7]; \
+                u64 += rtSha512SmallSigma1(puW[-2]); \
+                if (a_iWord < 80-2) *puW++ = u64; else puW++; \
+                a_uH += u64; \
+            } \
+            \
+            a_uH += rtSha512CapitalSigma1(a_uE); \
+            a_uH += a_uK; \
+            a_uH += rtSha512Ch(a_uE, a_uF, a_uG); \
+            a_uD += a_uH; \
+            \
+            a_uH += rtSha512CapitalSigma0(a_uA); \
+            a_uH += rtSha512Maj(a_uA, a_uB, a_uC); \
+        } while (0)
+# define RTSHA512_EIGHT(a_uK0, a_uK1, a_uK2, a_uK3, a_uK4, a_uK5, a_uK6, a_uK7, a_iFirst) \
+        do { \
+            RTSHA512_BODY(a_iFirst + 0, a_uK0, uA, uB, uC, uD, uE, uF, uG, uH); \
+            RTSHA512_BODY(a_iFirst + 1, a_uK1, uH, uA, uB, uC, uD, uE, uF, uG); \
+            RTSHA512_BODY(a_iFirst + 2, a_uK2, uG, uH, uA, uB, uC, uD, uE, uF); \
+            RTSHA512_BODY(a_iFirst + 3, a_uK3, uF, uG, uH, uA, uB, uC, uD, uE); \
+            RTSHA512_BODY(a_iFirst + 4, a_uK4, uE, uF, uG, uH, uA, uB, uC, uD); \
+            RTSHA512_BODY(a_iFirst + 5, a_uK5, uD, uE, uF, uG, uH, uA, uB, uC); \
+            RTSHA512_BODY(a_iFirst + 6, a_uK6, uC, uD, uE, uF, uG, uH, uA, uB); \
+            RTSHA512_BODY(a_iFirst + 7, a_uK7, uB, uC, uD, uE, uF, uG, uH, uA); \
+        } while (0)
+    RTSHA512_EIGHT(UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc),
+                   UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118),
+                   0);
+    RTSHA512_EIGHT(UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2),
+                   UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694),
+                   8);
+    RTSHA512_EIGHT(UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65),
+                   UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5),
+                   16);
+    RTSHA512_EIGHT(UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4),
+                   UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70),
+                   24);
+    RTSHA512_EIGHT(UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df),
+                   UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b),
+                   32);
+    RTSHA512_EIGHT(UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30),
+                   UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8),
+                   40);
+    RTSHA512_EIGHT(UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8),
+                   UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3),
+                   48);
+    RTSHA512_EIGHT(UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec),
+                   UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b),
+                   56);
+    RTSHA512_EIGHT(UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178),
+                   UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b),
+                   64);
+    RTSHA512_EIGHT(UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c),
+                   UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817),
+                   72);
+#else
+    for (unsigned iWord = 0; iWord < RT_ELEMENTS(pCtx->AltPrivate.auW); iWord++)
+    {
+        uint64_t uT1 = uH;
+        uT1 += rtSha512CapitalSigma1(uE);
+        uT1 += rtSha512Ch(uE, uF, uG);
+        uT1 += g_auKs[iWord];
+        uT1 += pCtx->AltPrivate.auW[iWord];
+
+        uint64_t uT2 = rtSha512CapitalSigma0(uA);
+        uT2 += rtSha512Maj(uA, uB, uC);
+
+        uH = uG;
+        uG = uF;
+        uF = uE;
+        uE = uD + uT1;
+        uD = uC;
+        uC = uB;
+        uB = uA;
+        uA = uT1 + uT2;
+    }
+#endif
+
+    pCtx->AltPrivate.auH[0] += uA;
+    pCtx->AltPrivate.auH[1] += uB;
+    pCtx->AltPrivate.auH[2] += uC;
+    pCtx->AltPrivate.auH[3] += uD;
+    pCtx->AltPrivate.auH[4] += uE;
+    pCtx->AltPrivate.auH[5] += uF;
+    pCtx->AltPrivate.auH[6] += uG;
+    pCtx->AltPrivate.auH[7] += uH;
+}
+
+
+RTDECL(void) RTSha512Update(PRTSHA512CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    Assert(pCtx->AltPrivate.cbMessage.s.Hi < UINT64_MAX / 8);
+    uint8_t const *pbBuf = (uint8_t const *)pvBuf;
+
+    /*
+     * Deal with buffered bytes first.
+     */
+    size_t cbBuffered = (size_t)pCtx->AltPrivate.cbMessage.s.Lo & (RTSHA512_BLOCK_SIZE - 1U);
+    if (cbBuffered)
+    {
+        size_t cbMissing = RTSHA512_BLOCK_SIZE - cbBuffered;
+        if (cbBuf >= cbMissing)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbMissing);
+            pCtx->AltPrivate.cbMessage.s.Lo += cbMissing;
+            if (!pCtx->AltPrivate.cbMessage.s.Lo)
+                pCtx->AltPrivate.cbMessage.s.Hi++;
+            pbBuf += cbMissing;
+            cbBuf -= cbMissing;
+
+            rtSha512BlockInitBuffered(pCtx);
+            rtSha512BlockProcess(pCtx);
+        }
+        else
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, pbBuf, cbBuf);
+            pCtx->AltPrivate.cbMessage.s.Lo += cbBuf;
+            return;
+        }
+    }
+
+    if (!((uintptr_t)pbBuf & 7))
+    {
+        /*
+         * Process full blocks directly from the input buffer.
+         */
+        while (cbBuf >= RTSHA512_BLOCK_SIZE)
+        {
+            rtSha512BlockInit(pCtx, pbBuf);
+            rtSha512BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage.s.Lo += RTSHA512_BLOCK_SIZE;
+            if (!pCtx->AltPrivate.cbMessage.s.Lo)
+                pCtx->AltPrivate.cbMessage.s.Hi++;
+            pbBuf += RTSHA512_BLOCK_SIZE;
+            cbBuf -= RTSHA512_BLOCK_SIZE;
+        }
+    }
+    else
+    {
+        /*
+         * Unaligned input, so buffer it.
+         */
+        while (cbBuf >= RTSHA512_BLOCK_SIZE)
+        {
+            memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, RTSHA512_BLOCK_SIZE);
+            rtSha512BlockInitBuffered(pCtx);
+            rtSha512BlockProcess(pCtx);
+
+            pCtx->AltPrivate.cbMessage.s.Lo += RTSHA512_BLOCK_SIZE;
+            if (!pCtx->AltPrivate.cbMessage.s.Lo)
+                pCtx->AltPrivate.cbMessage.s.Hi++;
+            pbBuf += RTSHA512_BLOCK_SIZE;
+            cbBuf -= RTSHA512_BLOCK_SIZE;
+        }
+    }
+
+    /*
+     * Stash any remaining bytes into the context buffer.
+     */
+    if (cbBuf > 0)
+    {
+        memcpy((uint8_t *)&pCtx->AltPrivate.auW[0], pbBuf, cbBuf);
+        pCtx->AltPrivate.cbMessage.s.Lo += cbBuf;
+        if (!pCtx->AltPrivate.cbMessage.s.Lo)
+            pCtx->AltPrivate.cbMessage.s.Hi++;
+    }
+}
+RT_EXPORT_SYMBOL(RTSha512Update);
+
+
+/**
+ * Internal worker for RTSha512Final and RTSha384Final that finalizes the
+ * computation but does not copy out the hash value.
+ *
+ * @param   pCtx                The SHA-512 context.
+ */
+static void rtSha512FinalInternal(PRTSHA512CONTEXT pCtx)
+{
+    Assert(pCtx->AltPrivate.cbMessage.s.Hi < UINT64_MAX / 8);
+
+    /*
+     * Complete the message by adding a single bit (0x80), padding till
+     * the next 448-bit boundrary, the add the message length.
+     */
+    RTUINT128U cMessageBits = pCtx->AltPrivate.cbMessage;
+    cMessageBits.s.Hi <<= 3;
+    cMessageBits.s.Hi |= cMessageBits.s.Lo >> 61;
+    cMessageBits.s.Lo <<= 3;
+
+    unsigned cbMissing = RTSHA512_BLOCK_SIZE - ((unsigned)pCtx->AltPrivate.cbMessage.s.Lo & (RTSHA512_BLOCK_SIZE - 1U));
+    static uint8_t const s_abSingleBitAndSomePadding[20] =
+    {   0x80, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,};
+    if (cbMissing < 1U + 16U)
+        /* Less than 64+16 bits left in the current block, force a new block. */
+        RTSha512Update(pCtx, &s_abSingleBitAndSomePadding, sizeof(s_abSingleBitAndSomePadding));
+    else
+        RTSha512Update(pCtx, &s_abSingleBitAndSomePadding, 1);
+
+    unsigned cbBuffered = (unsigned)pCtx->AltPrivate.cbMessage.s.Lo & (RTSHA512_BLOCK_SIZE - 1U);
+    cbMissing = RTSHA512_BLOCK_SIZE - cbBuffered;
+    Assert(cbMissing >= 16);
+    memset((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, 0, cbMissing - 16);
+
+    pCtx->AltPrivate.auW[14] = RT_H2BE_U64(cMessageBits.s.Hi);
+    pCtx->AltPrivate.auW[15] = RT_H2BE_U64(cMessageBits.s.Lo);
+
+    /*
+     * Process the last buffered block constructed/completed above.
+     */
+    rtSha512BlockInitBuffered(pCtx);
+    rtSha512BlockProcess(pCtx);
+
+    /*
+     * Convert the byte order of the hash words and we're done.
+     */
+    pCtx->AltPrivate.auH[0] = RT_H2BE_U64(pCtx->AltPrivate.auH[0]);
+    pCtx->AltPrivate.auH[1] = RT_H2BE_U64(pCtx->AltPrivate.auH[1]);
+    pCtx->AltPrivate.auH[2] = RT_H2BE_U64(pCtx->AltPrivate.auH[2]);
+    pCtx->AltPrivate.auH[3] = RT_H2BE_U64(pCtx->AltPrivate.auH[3]);
+    pCtx->AltPrivate.auH[4] = RT_H2BE_U64(pCtx->AltPrivate.auH[4]);
+    pCtx->AltPrivate.auH[5] = RT_H2BE_U64(pCtx->AltPrivate.auH[5]);
+    pCtx->AltPrivate.auH[6] = RT_H2BE_U64(pCtx->AltPrivate.auH[6]);
+    pCtx->AltPrivate.auH[7] = RT_H2BE_U64(pCtx->AltPrivate.auH[7]);
+
+    RT_ZERO(pCtx->AltPrivate.auW);
+    pCtx->AltPrivate.cbMessage.s.Lo = UINT64_MAX;
+    pCtx->AltPrivate.cbMessage.s.Hi = UINT64_MAX;
+}
+RT_EXPORT_SYMBOL(RTSha512Final);
+
+
+RTDECL(void) RTSha512Final(PRTSHA512CONTEXT pCtx, uint8_t pabDigest[RTSHA512_HASH_SIZE])
+{
+    rtSha512FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA512_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha512Final);
+
+
+RTDECL(void) RTSha512(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA512_HASH_SIZE])
+{
+    RTSHA512CONTEXT Ctx;
+    RTSha512Init(&Ctx);
+    RTSha512Update(&Ctx, pvBuf, cbBuf);
+    RTSha512Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha512);
+
+
+
+/*
+ * SHA-384 is just SHA-512 with different initial values an a truncated result.
+ */
+
+RTDECL(void) RTSha384Init(PRTSHA384CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage.s.Lo = 0;
+    pCtx->AltPrivate.cbMessage.s.Hi = 0;
+    pCtx->AltPrivate.auH[0] = UINT64_C(0xcbbb9d5dc1059ed8);
+    pCtx->AltPrivate.auH[1] = UINT64_C(0x629a292a367cd507);
+    pCtx->AltPrivate.auH[2] = UINT64_C(0x9159015a3070dd17);
+    pCtx->AltPrivate.auH[3] = UINT64_C(0x152fecd8f70e5939);
+    pCtx->AltPrivate.auH[4] = UINT64_C(0x67332667ffc00b31);
+    pCtx->AltPrivate.auH[5] = UINT64_C(0x8eb44a8768581511);
+    pCtx->AltPrivate.auH[6] = UINT64_C(0xdb0c2e0d64f98fa7);
+    pCtx->AltPrivate.auH[7] = UINT64_C(0x47b5481dbefa4fa4);
+}
+RT_EXPORT_SYMBOL(RTSha384Init);
+
+
+RTDECL(void) RTSha384Update(PRTSHA384CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    RTSha512Update(pCtx, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha384Update);
+
+
+RTDECL(void) RTSha384Final(PRTSHA384CONTEXT pCtx, uint8_t pabDigest[RTSHA384_HASH_SIZE])
+{
+    rtSha512FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA384_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha384Final);
+
+
+RTDECL(void) RTSha384(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA384_HASH_SIZE])
+{
+    RTSHA384CONTEXT Ctx;
+    RTSha384Init(&Ctx);
+    RTSha384Update(&Ctx, pvBuf, cbBuf);
+    RTSha384Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha384);
+
+
+/*
+ * SHA-512/224 is just SHA-512 with different initial values an a truncated result.
+ */
+
+RTDECL(void) RTSha512t224Init(PRTSHA512T224CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage.s.Lo = 0;
+    pCtx->AltPrivate.cbMessage.s.Hi = 0;
+    pCtx->AltPrivate.auH[0] = UINT64_C(0x8c3d37c819544da2);
+    pCtx->AltPrivate.auH[1] = UINT64_C(0x73e1996689dcd4d6);
+    pCtx->AltPrivate.auH[2] = UINT64_C(0x1dfab7ae32ff9c82);
+    pCtx->AltPrivate.auH[3] = UINT64_C(0x679dd514582f9fcf);
+    pCtx->AltPrivate.auH[4] = UINT64_C(0x0f6d2b697bd44da8);
+    pCtx->AltPrivate.auH[5] = UINT64_C(0x77e36f7304c48942);
+    pCtx->AltPrivate.auH[6] = UINT64_C(0x3f9d85a86a1d36c8);
+    pCtx->AltPrivate.auH[7] = UINT64_C(0x1112e6ad91d692a1);
+}
+RT_EXPORT_SYMBOL(RTSha512t224Init);
+
+
+RTDECL(void) RTSha512t224Update(PRTSHA512T224CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    RTSha512Update(pCtx, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha512t224Update);
+
+
+RTDECL(void) RTSha512t224Final(PRTSHA512T224CONTEXT pCtx, uint8_t pabDigest[RTSHA512T224_HASH_SIZE])
+{
+    rtSha512FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA512T224_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha512t224Final);
+
+
+RTDECL(void) RTSha512t224(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA512T224_HASH_SIZE])
+{
+    RTSHA512T224CONTEXT Ctx;
+    RTSha512t224Init(&Ctx);
+    RTSha512t224Update(&Ctx, pvBuf, cbBuf);
+    RTSha512t224Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha512t224);
+
+
+/*
+ * SHA-512/256 is just SHA-512 with different initial values an a truncated result.
+ */
+
+RTDECL(void) RTSha512t256Init(PRTSHA512T256CONTEXT pCtx)
+{
+    pCtx->AltPrivate.cbMessage.s.Lo = 0;
+    pCtx->AltPrivate.cbMessage.s.Hi = 0;
+    pCtx->AltPrivate.auH[0] = UINT64_C(0x22312194fc2bf72c);
+    pCtx->AltPrivate.auH[1] = UINT64_C(0x9f555fa3c84c64c2);
+    pCtx->AltPrivate.auH[2] = UINT64_C(0x2393b86b6f53b151);
+    pCtx->AltPrivate.auH[3] = UINT64_C(0x963877195940eabd);
+    pCtx->AltPrivate.auH[4] = UINT64_C(0x96283ee2a88effe3);
+    pCtx->AltPrivate.auH[5] = UINT64_C(0xbe5e1e2553863992);
+    pCtx->AltPrivate.auH[6] = UINT64_C(0x2b0199fc2c85b8aa);
+    pCtx->AltPrivate.auH[7] = UINT64_C(0x0eb72ddc81c52ca2);
+}
+RT_EXPORT_SYMBOL(RTSha512t256Init);
+
+
+RTDECL(void) RTSha512t256Update(PRTSHA512T256CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    RTSha512Update(pCtx, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha512t256Update);
+
+
+RTDECL(void) RTSha512t256Final(PRTSHA512T256CONTEXT pCtx, uint8_t pabDigest[RTSHA512T256_HASH_SIZE])
+{
+    rtSha512FinalInternal(pCtx);
+    memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA512T256_HASH_SIZE);
+    RT_ZERO(pCtx->AltPrivate.auH);
+}
+RT_EXPORT_SYMBOL(RTSha512t256Final);
+
+
+RTDECL(void) RTSha512t256(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA512T256_HASH_SIZE])
+{
+    RTSHA512T256CONTEXT Ctx;
+    RTSha512t256Init(&Ctx);
+    RTSha512t256Update(&Ctx, pvBuf, cbBuf);
+    RTSha512t256Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha512t256);
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/checksum/md2str.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/checksum/md2str.cpp
index 35b6d89..850555a 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/checksum/md2str.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: md2str.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - MD2 string functions.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,22 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/md2.h>
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+
+RTDECL(int) RTMd2ToString(uint8_t const pabDigest[RTMD2_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+    return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTMD2_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTMd2FromString(char const *pszDigest, uint8_t pabDigest[RTMD2_HASH_SIZE])
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTMD2_HASH_SIZE, 0 /*fFlags*/);
 }
 
diff --git a/src/VBox/Runtime/common/checksum/sha1.cpp b/src/VBox/Runtime/common/checksum/openssl-md2.cpp
similarity index 51%
copy from src/VBox/Runtime/common/checksum/sha1.cpp
copy to src/VBox/Runtime/common/checksum/openssl-md2.cpp
index 9db75a2..80fa859 100644
--- a/src/VBox/Runtime/common/checksum/sha1.cpp
+++ b/src/VBox/Runtime/common/checksum/openssl-md2.cpp
@@ -1,10 +1,10 @@
-/* $Id: sha1.cpp $ */
+/* $Id: openssl-md2.cpp $ */
 /** @file
- * IPRT - SHA-1 hash functions.
+ * IPRT - Message-Digest Algorithm 2.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -30,43 +30,53 @@
 *******************************************************************************/
 #include "internal/iprt.h"
 
-#include <openssl/sha.h>
+#include <openssl/opensslconf.h>
+#ifndef OPENSSL_NO_MD2
+# include <openssl/md2.h>
 
-#define RT_SHA1_PRIVATE_CONTEXT
-#include <iprt/sha.h>
+# define RT_MD2_PRIVATE_CONTEXT
+# include <iprt/md2.h>
 
-#include <iprt/assert.h>
+# include <iprt/assert.h>
 
-AssertCompile(RT_SIZEOFMEMB(RTSHA1CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA1CONTEXT, Private));
+AssertCompile(RT_SIZEOFMEMB(RTMD2CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTMD2CONTEXT, Private));
 
 
-RTDECL(void) RTSha1(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA1_HASH_SIZE])
+RTDECL(void) RTMd2(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD2_HASH_SIZE])
 {
-    RTSHA1CONTEXT Ctx;
-    RTSha1Init(&Ctx);
-    RTSha1Update(&Ctx, pvBuf, cbBuf);
-    RTSha1Final(&Ctx, pabDigest);
+    RTMD2CONTEXT Ctx;
+    RTMd2Init(&Ctx);
+    RTMd2Update(&Ctx, pvBuf, cbBuf);
+    RTMd2Final(&Ctx, pabDigest);
 }
-RT_EXPORT_SYMBOL(RTSha1);
+RT_EXPORT_SYMBOL(RTMd2);
 
 
-RTDECL(void) RTSha1Init(PRTSHA1CONTEXT pCtx)
+RTDECL(void) RTMd2Init(PRTMD2CONTEXT pCtx)
 {
-    SHA1_Init(&pCtx->Private);
+    MD2_Init(&pCtx->Private);
 }
-RT_EXPORT_SYMBOL(RTSha1Init);
+RT_EXPORT_SYMBOL(RTMd2Init);
 
 
-RTDECL(void) RTSha1Update(PRTSHA1CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+RTDECL(void) RTMd2Update(PRTMD2CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
 {
-    SHA1_Update(&pCtx->Private, pvBuf, cbBuf);
+    MD2_Update(&pCtx->Private, (const unsigned char *)pvBuf, cbBuf);
 }
-RT_EXPORT_SYMBOL(RTSha1Update);
+RT_EXPORT_SYMBOL(RTMd2Update);
 
 
-RTDECL(void) RTSha1Final(PRTSHA1CONTEXT pCtx, uint8_t pabDigest[32])
+RTDECL(void) RTMd2Final(PRTMD2CONTEXT pCtx, uint8_t pabDigest[RTMD2_HASH_SIZE])
 {
-    SHA1_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
+    MD2_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
 }
-RT_EXPORT_SYMBOL(RTSha1Final);
+RT_EXPORT_SYMBOL(RTMd2Final);
+
+
+#else /* OPENSSL_NO_MD2 */
+/*
+ * If the OpenSSL build doesn't have MD2, use the IPRT implementation.
+ */
+# include "alt-md2.cpp"
+#endif /* OPENSSL_NO_MD2 */
 
diff --git a/src/VBox/Runtime/common/checksum/sha1.cpp b/src/VBox/Runtime/common/checksum/openssl-md5.cpp
similarity index 56%
copy from src/VBox/Runtime/common/checksum/sha1.cpp
copy to src/VBox/Runtime/common/checksum/openssl-md5.cpp
index 9db75a2..fae89f6 100644
--- a/src/VBox/Runtime/common/checksum/sha1.cpp
+++ b/src/VBox/Runtime/common/checksum/openssl-md5.cpp
@@ -1,10 +1,10 @@
-/* $Id: sha1.cpp $ */
+/* $Id: openssl-md5.cpp $ */
 /** @file
- * IPRT - SHA-1 hash functions.
+ * IPRT - MD5 message digest functions, implemented using OpenSSL.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -30,43 +30,43 @@
 *******************************************************************************/
 #include "internal/iprt.h"
 
-#include <openssl/sha.h>
+#include <openssl/md5.h>
 
-#define RT_SHA1_PRIVATE_CONTEXT
-#include <iprt/sha.h>
+#define RT_MD5_OPENSSL_PRIVATE_CONTEXT
+#include <iprt/md5.h>
 
 #include <iprt/assert.h>
 
-AssertCompile(RT_SIZEOFMEMB(RTSHA1CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTSHA1CONTEXT, Private));
+AssertCompile(RT_SIZEOFMEMB(RTMD5CONTEXT, abPadding) >= RT_SIZEOFMEMB(RTMD5CONTEXT, OsslPrivate));
 
 
-RTDECL(void) RTSha1(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA1_HASH_SIZE])
+RTDECL(void) RTMd5(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTMD5_HASH_SIZE])
 {
-    RTSHA1CONTEXT Ctx;
-    RTSha1Init(&Ctx);
-    RTSha1Update(&Ctx, pvBuf, cbBuf);
-    RTSha1Final(&Ctx, pabDigest);
+    RTMD5CONTEXT Ctx;
+    RTMd5Init(&Ctx);
+    RTMd5Update(&Ctx, pvBuf, cbBuf);
+    RTMd5Final(pabDigest, &Ctx);
 }
-RT_EXPORT_SYMBOL(RTSha1);
+RT_EXPORT_SYMBOL(RTMd5);
 
 
-RTDECL(void) RTSha1Init(PRTSHA1CONTEXT pCtx)
+RTDECL(void) RTMd5Init(PRTMD5CONTEXT pCtx)
 {
-    SHA1_Init(&pCtx->Private);
+    MD5_Init(&pCtx->OsslPrivate);
 }
-RT_EXPORT_SYMBOL(RTSha1Init);
+RT_EXPORT_SYMBOL(RTMd5Init);
 
 
-RTDECL(void) RTSha1Update(PRTSHA1CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+RTDECL(void) RTMd5Update(PRTMD5CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
 {
-    SHA1_Update(&pCtx->Private, pvBuf, cbBuf);
+    MD5_Update(&pCtx->OsslPrivate, pvBuf, cbBuf);
 }
-RT_EXPORT_SYMBOL(RTSha1Update);
+RT_EXPORT_SYMBOL(RTMd5Update);
 
 
-RTDECL(void) RTSha1Final(PRTSHA1CONTEXT pCtx, uint8_t pabDigest[32])
+RTDECL(void) RTMd5Final(uint8_t pabDigest[32], PRTMD5CONTEXT pCtx)
 {
-    SHA1_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
+    MD5_Final((unsigned char *)&pabDigest[0], &pCtx->OsslPrivate);
 }
-RT_EXPORT_SYMBOL(RTSha1Final);
+RT_EXPORT_SYMBOL(RTMd5Final);
 
diff --git a/src/VBox/Runtime/common/checksum/sha1.cpp b/src/VBox/Runtime/common/checksum/openssl-sha1.cpp
similarity index 98%
rename from src/VBox/Runtime/common/checksum/sha1.cpp
rename to src/VBox/Runtime/common/checksum/openssl-sha1.cpp
index 9db75a2..db28550 100644
--- a/src/VBox/Runtime/common/checksum/sha1.cpp
+++ b/src/VBox/Runtime/common/checksum/openssl-sha1.cpp
@@ -1,4 +1,4 @@
-/* $Id: sha1.cpp $ */
+/* $Id: openssl-sha1.cpp $ */
 /** @file
  * IPRT - SHA-1 hash functions.
  */
diff --git a/src/VBox/Runtime/common/checksum/sha256.cpp b/src/VBox/Runtime/common/checksum/openssl-sha256.cpp
similarity index 70%
rename from src/VBox/Runtime/common/checksum/sha256.cpp
rename to src/VBox/Runtime/common/checksum/openssl-sha256.cpp
index da2a70e..6686017 100644
--- a/src/VBox/Runtime/common/checksum/sha256.cpp
+++ b/src/VBox/Runtime/common/checksum/openssl-sha256.cpp
@@ -1,4 +1,4 @@
-/* $Id: sha256.cpp $ */
+/* $Id: openssl-sha256.cpp $ */
 /** @file
  * IPRT - SHA-256 hash functions.
  */
@@ -70,3 +70,39 @@ RTDECL(void) RTSha256Final(PRTSHA256CONTEXT pCtx, uint8_t pabDigest[32])
 }
 RT_EXPORT_SYMBOL(RTSha256Final);
 
+
+/*
+ * We have to expose the same API as alt-sha256.cpp, so the SHA-224
+ * implementation also lives here. (SHA-224 is just a truncated SHA-256 with
+ * different initial values.)
+ */
+RTDECL(void) RTSha224(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA224_HASH_SIZE])
+{
+    RTSHA224CONTEXT Ctx;
+    RTSha224Init(&Ctx);
+    RTSha224Update(&Ctx, pvBuf, cbBuf);
+    RTSha224Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha224);
+
+
+RTDECL(void) RTSha224Init(PRTSHA224CONTEXT pCtx)
+{
+    SHA224_Init(&pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTSha224Init);
+
+
+RTDECL(void) RTSha224Update(PRTSHA224CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    SHA224_Update(&pCtx->Private, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha224Update);
+
+
+RTDECL(void) RTSha224Final(PRTSHA224CONTEXT pCtx, uint8_t pabDigest[32])
+{
+    SHA224_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTSha224Final);
+
diff --git a/src/VBox/Runtime/common/checksum/sha512.cpp b/src/VBox/Runtime/common/checksum/openssl-sha512.cpp
similarity index 69%
rename from src/VBox/Runtime/common/checksum/sha512.cpp
rename to src/VBox/Runtime/common/checksum/openssl-sha512.cpp
index 570c0a7..9f3ad45 100644
--- a/src/VBox/Runtime/common/checksum/sha512.cpp
+++ b/src/VBox/Runtime/common/checksum/openssl-sha512.cpp
@@ -1,4 +1,4 @@
-/* $Id: sha512.cpp $ */
+/* $Id: openssl-sha512.cpp $ */
 /** @file
  * IPRT - SHA-512 hash functions.
  */
@@ -70,3 +70,41 @@ RTDECL(void) RTSha512Final(PRTSHA512CONTEXT pCtx, uint8_t pabDigest[32])
 }
 RT_EXPORT_SYMBOL(RTSha512Final);
 
+
+/*
+ * We have to expose the same API as alt-sha512.cpp, so the SHA-384,
+ * SHA-512/224 and SHA-512/256 implementations also live here. (They are all
+ * just truncted SHA-512 with different initial values.)
+ */
+
+RTDECL(void) RTSha384(const void *pvBuf, size_t cbBuf, uint8_t pabDigest[RTSHA384_HASH_SIZE])
+{
+    RTSHA384CONTEXT Ctx;
+    RTSha384Init(&Ctx);
+    RTSha384Update(&Ctx, pvBuf, cbBuf);
+    RTSha384Final(&Ctx, pabDigest);
+}
+RT_EXPORT_SYMBOL(RTSha384);
+
+
+RTDECL(void) RTSha384Init(PRTSHA384CONTEXT pCtx)
+{
+    SHA384_Init(&pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTSha384Init);
+
+
+RTDECL(void) RTSha384Update(PRTSHA384CONTEXT pCtx, const void *pvBuf, size_t cbBuf)
+{
+    SHA384_Update(&pCtx->Private, pvBuf, cbBuf);
+}
+RT_EXPORT_SYMBOL(RTSha384Update);
+
+
+RTDECL(void) RTSha384Final(PRTSHA384CONTEXT pCtx, uint8_t pabDigest[32])
+{
+    SHA384_Final((unsigned char *)&pabDigest[0], &pCtx->Private);
+}
+RT_EXPORT_SYMBOL(RTSha384Final);
+
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/checksum/sha224str.cpp
similarity index 65%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/checksum/sha224str.cpp
index 35b6d89..c5a3593 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/checksum/sha224str.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: sha224str.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - SHA-224 string functions.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,22 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/sha.h>
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+
+RTDECL(int) RTSha224ToString(uint8_t const pabDigest[RTSHA224_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+    return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTSHA224_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTSha224FromString(char const *pszDigest, uint8_t pabDigest[RTSHA224_HASH_SIZE])
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTSHA224_HASH_SIZE, 0 /*fFlags*/);
 }
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/checksum/sha384str.cpp
similarity index 65%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/checksum/sha384str.cpp
index 35b6d89..5d45c3d 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/checksum/sha384str.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: sha384str.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - SHA-384 string functions.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,22 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/sha.h>
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+
+RTDECL(int) RTSha384ToString(uint8_t const pabDigest[RTSHA384_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+    return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTSHA384_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTSha384FromString(char const *pszDigest, uint8_t pabDigest[RTSHA384_HASH_SIZE])
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTSHA384_HASH_SIZE, 0 /*fFlags*/);
 }
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/checksum/sha512t224str.cpp
similarity index 64%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/checksum/sha512t224str.cpp
index 35b6d89..18cc1f6 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/checksum/sha512t224str.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: sha512t224str.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - SHA-512/224 string functions.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,22 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/sha.h>
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+
+RTDECL(int) RTSha512t224ToString(uint8_t const pabDigest[RTSHA512T224_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+    return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTSHA512T224_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTSha512t224FromString(char const *pszDigest, uint8_t pabDigest[RTSHA512T224_HASH_SIZE])
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTSHA512T224_HASH_SIZE, 0 /*fFlags*/);
 }
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/checksum/sha512t256str.cpp
similarity index 64%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/checksum/sha512t256str.cpp
index 35b6d89..2ba7cb9 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/checksum/sha512t256str.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: sha512t256str.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - SHA-512/256 string functions.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,22 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/sha.h>
 
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+
+RTDECL(int) RTSha512t256ToString(uint8_t const pabDigest[RTSHA512T256_HASH_SIZE], char *pszDigest, size_t cchDigest)
+{
+    return RTStrPrintHexBytes(pszDigest, cchDigest, &pabDigest[0], RTSHA512T256_HASH_SIZE, 0 /*fFlags*/);
+}
+
+
+RTDECL(int) RTSha512t256FromString(char const *pszDigest, uint8_t pabDigest[RTSHA512T256_HASH_SIZE])
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTStrConvertHexBytes(RTStrStripL(pszDigest), &pabDigest[0], RTSHA512T256_HASH_SIZE, 0 /*fFlags*/);
 }
 
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/src/VBox/Runtime/common/crypto/Makefile.kup
similarity index 100%
copy from src/VBox/Runtime/common/ldr/Makefile.kup
copy to src/VBox/Runtime/common/crypto/Makefile.kup
diff --git a/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp
new file mode 100644
index 0000000..b79eded
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/RTCrStoreCertAddFromFile.cpp
@@ -0,0 +1,114 @@
+/* $Id: RTCrStoreCertAddFromFile.cpp $ */
+/** @file
+ * IPRT - Cryptographic (Certificate) Store, RTCrStoreCertAddFromFile.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/crypto/pem.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static RTCRPEMMARKERWORD const g_aWords_Certificate[]  = { { RT_STR_TUPLE("CERTIFICATE") } };
+/** X509 Certificate markers. */
+static RTCRPEMMARKER     const g_aCertificateMarkers[] = { { g_aWords_Certificate, RT_ELEMENTS(g_aWords_Certificate) } };
+
+
+#if 0
+RTDECL(int) RTCrX509Certificates_ReadFromFile(const char *pszFilename, uint32_t fFlags,
+                                              PRTCRX509CERTIFICATES pCertificates, PRTERRINFO pErrInfo)
+{
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+    PCRTCRPEMSECTION pSectionHead;
+    int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        pCertificates->Allocation
+
+        PCRTCRPEMSECTION pCurSec = pSectionHead;
+        while (pCurSec)
+        {
+
+            pCurSec = pCurSec->pNext;
+        }
+
+        RTCrPemFreeSections(pSectionHead);
+    }
+    return rc;
+}
+#endif
+
+
+RTDECL(int) RTCrStoreCertAddFromFile(RTCRSTORE hStore, uint32_t fFlags, const char *pszFilename, PRTERRINFO pErrInfo)
+{
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+#if 0
+    RTCRX509CERTIFICATES Certs;
+    int rc = RTCrX509Certificates_ReadFromFile(pszFilename, 0, &Certs, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        for (uint32_t i = 0; i < Certs.cCerts; i++)
+        {
+            int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER,
+                                              RTASN1CORE_GET_RAW_ASN1_PTR(&Certs.paCerts[i].SeqCore.Asn1Core),
+                                              RTASN1CORE_GET_RAW_ASN1_SIZE(&Certs.paCerts[i].SeqCore.Asn1Core),
+                                              RT_SUCCESS(rc) ? pErrInfo : NULL);
+            if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+                rc = rc2;
+        }
+
+        RTAsn1Destroy(&Certs.SetCore.Asn1Core);
+    }
+    return rc;
+#else
+
+    PCRTCRPEMSECTION pSectionHead;
+    int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        PCRTCRPEMSECTION pCurSec = pSectionHead;
+        while (pCurSec)
+        {
+            int rc2 = RTCrStoreCertAddEncoded(hStore, RTCRCERTCTX_F_ENC_X509_DER, pCurSec->pbData, pCurSec->cbData,
+                                              RT_SUCCESS(rc) ? pErrInfo : NULL);
+            if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+                rc = rc2;
+            pCurSec = pCurSec->pNext;
+        }
+
+        RTCrPemFreeSections(pSectionHead);
+    }
+    return rc;
+#endif
+}
+
diff --git a/src/VBox/Runtime/common/crypto/digest-builtin.cpp b/src/VBox/Runtime/common/crypto/digest-builtin.cpp
new file mode 100644
index 0000000..914e2c8
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/digest-builtin.cpp
@@ -0,0 +1,729 @@
+/* $Id: digest-builtin.cpp $ */
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest API, Built-in providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/digest.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/md2.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+#include <iprt/crypto/pkix.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/evp.h>
+#endif
+
+/*
+ * MD2
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestMd2_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTMd2Update((PRTMD2CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestMd2_Final(void *pvState, uint8_t *pbHash)
+{
+    RTMd2Final((PRTMD2CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestMd2_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTMd2Init((PRTMD2CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** MD2 alias ODIs. */
+static const char * const g_apszMd2Aliases[] =
+{
+    RTCR_PKCS1_MD2_WITH_RSA_OID,
+    "1.3.14.3.2.24" /* OIW md2WithRSASignature */,
+    NULL
+};
+
+/** MD2 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestMd2Desc =
+{
+    "md2",
+    "1.2.840.113549.2.2",
+    g_apszMd2Aliases,
+    RTDIGESTTYPE_MD2,
+    RTMD2_HASH_SIZE,
+    sizeof(RTMD2CONTEXT),
+    0,
+    rtCrDigestMd2_Update,
+    rtCrDigestMd2_Final,
+    rtCrDigestMd2_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * MD5
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestMd5_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTMd5Update((PRTMD5CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestMd5_Final(void *pvState, uint8_t *pbHash)
+{
+    RTMd5Final(pbHash, (PRTMD5CONTEXT)pvState);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestMd5_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTMd5Init((PRTMD5CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** MD5 alias ODIs. */
+static const char * const g_apszMd5Aliases[] =
+{
+    RTCR_PKCS1_MD5_WITH_RSA_OID,
+    "1.3.14.3.2.25" /* OIW md5WithRSASignature */,
+    NULL
+};
+
+/** MD5 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestMd5Desc =
+{
+    "md5",
+    "1.2.840.113549.2.5",
+    g_apszMd5Aliases,
+    RTDIGESTTYPE_MD5,
+    RTMD5_HASH_SIZE,
+    sizeof(RTMD5CONTEXT),
+    0,
+    rtCrDigestMd5_Update,
+    rtCrDigestMd5_Final,
+    rtCrDigestMd5_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * SHA-1
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha1_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha1Update((PRTSHA1CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha1_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha1Final((PRTSHA1CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha1_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha1Init((PRTSHA1CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-1 alias ODIs. */
+static const char * const g_apszSha1Aliases[] =
+{
+    RTCR_PKCS1_SHA1_WITH_RSA_OID,
+    "1.3.14.3.2.29" /* OIW sha1WithRSASignature */,
+    NULL
+};
+
+/** SHA-1 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha1Desc =
+{
+    "sha-1",
+    "1.3.14.3.2.26",
+    g_apszSha1Aliases,
+    RTDIGESTTYPE_SHA1,
+    RTSHA1_HASH_SIZE,
+    sizeof(RTSHA1CONTEXT),
+    0,
+    rtCrDigestSha1_Update,
+    rtCrDigestSha1_Final,
+    rtCrDigestSha1_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * SHA-256
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha256_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha256Update((PRTSHA256CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha256_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha256Final((PRTSHA256CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha256_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha256Init((PRTSHA256CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-256 alias ODIs. */
+static const char * const g_apszSha256Aliases[] =
+{
+    RTCR_PKCS1_SHA256_WITH_RSA_OID,
+    NULL
+};
+
+/** SHA-256 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha256Desc =
+{
+    "sha-256",
+    "2.16.840.1.101.3.4.2.1",
+    g_apszSha256Aliases,
+    RTDIGESTTYPE_SHA256,
+    RTSHA256_HASH_SIZE,
+    sizeof(RTSHA256CONTEXT),
+    0,
+    rtCrDigestSha256_Update,
+    rtCrDigestSha256_Final,
+    rtCrDigestSha256_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * SHA-512
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha512_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha512Update((PRTSHA512CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha512_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha512Final((PRTSHA512CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha512_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha512Init((PRTSHA512CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-512 alias ODIs. */
+static const char * const g_apszSha512Aliases[] =
+{
+    RTCR_PKCS1_SHA512_WITH_RSA_OID,
+    NULL
+};
+
+/** SHA-512 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha512Desc =
+{
+    "sha-512",
+    "2.16.840.1.101.3.4.2.3",
+    g_apszSha512Aliases,
+    RTDIGESTTYPE_SHA512,
+    RTSHA512_HASH_SIZE,
+    sizeof(RTSHA512CONTEXT),
+    0,
+    rtCrDigestSha512_Update,
+    rtCrDigestSha512_Final,
+    rtCrDigestSha512_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * SHA-224
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha224_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha224Update((PRTSHA224CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha224_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha224Final((PRTSHA224CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha224_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha224Init((PRTSHA224CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-224 alias ODIs. */
+static const char * const g_apszSha224Aliases[] =
+{
+    RTCR_PKCS1_SHA224_WITH_RSA_OID,
+    NULL
+};
+
+/** SHA-224 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha224Desc =
+{
+    "sha-224",
+    "2.16.840.1.101.3.4.2.4",
+    g_apszSha224Aliases,
+    RTDIGESTTYPE_SHA224,
+    RTSHA224_HASH_SIZE,
+    sizeof(RTSHA224CONTEXT),
+    0,
+    rtCrDigestSha224_Update,
+    rtCrDigestSha224_Final,
+    rtCrDigestSha224_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+/*
+ * SHA-384
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha384_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha384Update((PRTSHA384CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha384_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha384Final((PRTSHA384CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha384_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha384Init((PRTSHA384CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-384 alias ODIs. */
+static const char * const g_apszSha384Aliases[] =
+{
+    RTCR_PKCS1_SHA384_WITH_RSA_OID,
+    NULL
+};
+
+/** SHA-384 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha384Desc =
+{
+    "sha-384",
+    "2.16.840.1.101.3.4.2.2",
+    g_apszSha384Aliases,
+    RTDIGESTTYPE_SHA384,
+    RTSHA384_HASH_SIZE,
+    sizeof(RTSHA384CONTEXT),
+    0,
+    rtCrDigestSha384_Update,
+    rtCrDigestSha384_Final,
+    rtCrDigestSha384_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
+#ifndef IPRT_WITHOUT_SHA512T224
+/*
+ * SHA-512/224
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha512t224_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha512t224Update((PRTSHA512T224CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha512t224_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha512t224Final((PRTSHA512T224CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha512t224_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha512t224Init((PRTSHA512T224CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-512/224 alias ODIs. */
+static const char * const g_apszSha512t224Aliases[] =
+{
+    NULL
+};
+
+/** SHA-512/224 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha512t224Desc =
+{
+    "sha-512/224",
+    "2.16.840.1.101.3.4.2.5",
+    g_apszSha512t224Aliases,
+    RTDIGESTTYPE_SHA512T224,
+    RTSHA512T224_HASH_SIZE,
+    sizeof(RTSHA512T224CONTEXT),
+    0,
+    rtCrDigestSha512t224_Update,
+    rtCrDigestSha512t224_Final,
+    rtCrDigestSha512t224_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+#endif /* !IPRT_WITHOUT_SHA512T224 */
+
+
+#ifndef IPRT_WITHOUT_SHA512T256
+/*
+ * SHA-512/256
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestSha512t256_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    RTSha512t256Update((PRTSHA512T256CONTEXT)pvState, pvData, cbData);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestSha512t256_Final(void *pvState, uint8_t *pbHash)
+{
+    RTSha512t256Final((PRTSHA512T256CONTEXT)pvState, pbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestSha512t256_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    AssertReturn(pvOpaque == NULL, VERR_INVALID_PARAMETER);
+    RTSha512t256Init((PRTSHA512T256CONTEXT)pvState);
+    return VINF_SUCCESS;
+}
+
+/** SHA-512/256 alias ODIs. */
+static const char * const g_apszSha512t256Aliases[] =
+{
+    NULL
+};
+
+/** SHA-512/256 descriptor. */
+static RTCRDIGESTDESC const g_rtCrDigestSha512t256Desc =
+{
+    "sha-512/256",
+    "2.16.840.1.101.3.4.2.6",
+    g_apszSha512t256Aliases,
+    RTDIGESTTYPE_SHA512T256,
+    RTSHA512T256_HASH_SIZE,
+    sizeof(RTSHA512T256CONTEXT),
+    0,
+    rtCrDigestSha512t256_Update,
+    rtCrDigestSha512t256_Final,
+    rtCrDigestSha512t256_Init,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+};
+#endif /* !IPRT_WITHOUT_SHA512T256 */
+
+
+/**
+ * Array of built in message digest vtables.
+ */
+static PCRTCRDIGESTDESC const g_apDigestOps[] =
+{
+    &g_rtCrDigestMd2Desc,
+    &g_rtCrDigestMd5Desc,
+    &g_rtCrDigestSha1Desc,
+    &g_rtCrDigestSha256Desc,
+    &g_rtCrDigestSha512Desc,
+    &g_rtCrDigestSha224Desc,
+    &g_rtCrDigestSha384Desc,
+#ifndef IPRT_WITHOUT_SHA512T224
+    &g_rtCrDigestSha512t224Desc,
+#endif
+#ifndef IPRT_WITHOUT_SHA512T256
+    &g_rtCrDigestSha512t256Desc,
+#endif
+};
+
+
+#ifdef IPRT_WITH_OPENSSL
+/*
+ * OpenSSL EVP.
+ */
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Update(void *pvState, const void *pvData, size_t cbData)
+{
+    EVP_DigestUpdate((EVP_MD_CTX *)pvState, pvData, cbData);
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Final(void *pvState, uint8_t *pbHash)
+{
+    unsigned int cbHash = EVP_MAX_MD_SIZE;
+    EVP_DigestFinal((EVP_MD_CTX *)pvState, (unsigned char *)pbHash, &cbHash);
+}
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnInit} */
+static DECLCALLBACK(int) rtCrDigestOsslEvp_Init(void *pvState, void *pvOpaque, bool fReInit)
+{
+    EVP_MD_CTX   *pThis    = (EVP_MD_CTX *)pvState;
+    EVP_MD const *pEvpType = (EVP_MD const *)pvOpaque;
+
+    if (fReInit)
+    {
+        pEvpType = EVP_MD_CTX_md(pThis);
+        EVP_MD_CTX_cleanup(pThis);
+    }
+
+    AssertPtrReturn(pEvpType, VERR_INVALID_PARAMETER);
+    Assert(pEvpType->md_size);
+    if (EVP_DigestInit(pThis, pEvpType))
+        return VINF_SUCCESS;
+    return VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR;
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfn} */
+static DECLCALLBACK(void) rtCrDigestOsslEvp_Delete(void *pvState)
+{
+    EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+    EVP_MD_CTX_cleanup(pThis);
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnClone} */
+static DECLCALLBACK(int) rtCrDigestOsslEvp_Clone(void *pvState, void const *pvSrcState)
+{
+    EVP_MD_CTX        *pThis = (EVP_MD_CTX *)pvState;
+    EVP_MD_CTX const  *pSrc  = (EVP_MD_CTX const *)pvSrcState;
+
+    if (EVP_MD_CTX_copy(pThis, pSrc))
+        return VINF_SUCCESS;
+    return VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR;
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnGetHashSize} */
+static DECLCALLBACK(uint32_t) rtCrDigestOsslEvp_GetHashSize(void *pvState)
+{
+    EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+    return EVP_MD_size(EVP_MD_CTX_md(pThis));
+}
+
+
+/** @impl_interface_method{RTCRDIGESTDESC::pfnGetHashSize} */
+static DECLCALLBACK(RTDIGESTTYPE) rtCrDigestOsslEvp_GetDigestType(void *pvState)
+{
+    EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState;
+    /** @todo figure which digest algorithm it is! */
+    return RTDIGESTTYPE_UNKNOWN;
+}
+
+
+/** Descriptor for the OpenSSL EVP base message digest provider. */
+static RTCRDIGESTDESC const g_rtCrDigestOpenSslDesc =
+{
+    "OpenSSL EVP",
+    NULL,
+    NULL,
+    RTDIGESTTYPE_UNKNOWN,
+    EVP_MAX_MD_SIZE,
+    sizeof(EVP_MD_CTX),
+    0,
+    rtCrDigestOsslEvp_Update,
+    rtCrDigestOsslEvp_Final,
+    rtCrDigestOsslEvp_Init,
+    rtCrDigestOsslEvp_Delete,
+    rtCrDigestOsslEvp_Clone,
+    rtCrDigestOsslEvp_GetHashSize,
+    rtCrDigestOsslEvp_GetDigestType
+};
+
+#endif /* IPRT_WITH_OPENSSL */
+
+
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjIdString(const char *pszObjId, void **ppvOpaque)
+{
+    if (ppvOpaque)
+        *ppvOpaque = NULL;
+
+    /*
+     * Primary OIDs.
+     */
+    uint32_t i = RT_ELEMENTS(g_apDigestOps);
+    while (i-- > 0)
+        if (strcmp(g_apDigestOps[i]->pszObjId, pszObjId) == 0)
+            return g_apDigestOps[i];
+
+    /*
+     * Alias OIDs.
+     */
+    i = RT_ELEMENTS(g_apDigestOps);
+    while (i-- > 0)
+    {
+        const char * const *ppszAliases = g_apDigestOps[i]->papszObjIdAliases;
+        if (ppszAliases)
+            for (; *ppszAliases; ppszAliases++)
+                if (strcmp(*ppszAliases, pszObjId) == 0)
+                    return g_apDigestOps[i];
+    }
+
+#ifdef IPRT_WITH_OPENSSL
+    /*
+     * Try EVP and see if it knows the algorithm.
+     */
+    if (ppvOpaque)
+    {
+        rtCrOpenSslInit();
+        int iAlgoNid = OBJ_txt2nid(pszObjId);
+        if (iAlgoNid != NID_undef)
+        {
+            const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+            const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+            if (pEvpMdType)
+            {
+                /*
+                 * Return the OpenSSL provider descriptor and the EVP_MD address.
+                 */
+                Assert(pEvpMdType->md_size);
+                *ppvOpaque = (void *)pEvpMdType;
+                return &g_rtCrDigestOpenSslDesc;
+            }
+        }
+    }
+#endif
+    return NULL;
+}
+
+
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByObjId(PCRTASN1OBJID pObjId, void **ppvOpaque)
+{
+    return RTCrDigestFindByObjIdString(pObjId->szObjId, ppvOpaque);
+}
+
+
+RTDECL(int) RTCrDigestCreateByObjIdString(PRTCRDIGEST phDigest, const char *pszObjId)
+{
+    void *pvOpaque;
+    PCRTCRDIGESTDESC pDesc = RTCrDigestFindByObjIdString(pszObjId, &pvOpaque);
+    if (pDesc)
+        return RTCrDigestCreate(phDigest, pDesc, pvOpaque);
+    return VERR_NOT_FOUND;
+}
+
+
+RTDECL(int) RTCrDigestCreateByObjId(PRTCRDIGEST phDigest, PCRTASN1OBJID pObjId)
+{
+    void *pvOpaque;
+    PCRTCRDIGESTDESC pDesc = RTCrDigestFindByObjId(pObjId, &pvOpaque);
+    if (pDesc)
+        return RTCrDigestCreate(phDigest, pDesc, pvOpaque);
+    return VERR_NOT_FOUND;
+}
+
+
+RTDECL(PCRTCRDIGESTDESC) RTCrDigestFindByType(RTDIGESTTYPE enmDigestType)
+{
+    AssertReturn(enmDigestType > RTDIGESTTYPE_INVALID && enmDigestType <= RTDIGESTTYPE_END, NULL);
+
+    uint32_t i = RT_ELEMENTS(g_apDigestOps);
+    while (i-- > 0)
+        if (g_apDigestOps[i]->enmType == enmDigestType)
+            return g_apDigestOps[i];
+    return NULL;
+}
+
+
+RTDECL(int) RTCrDigestCreateByType(PRTCRDIGEST phDigest, RTDIGESTTYPE enmDigestType)
+{
+    PCRTCRDIGESTDESC pDesc = RTCrDigestFindByType(enmDigestType);
+    if (pDesc)
+        return RTCrDigestCreate(phDigest, pDesc, NULL);
+    return VERR_NOT_FOUND;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/digest-core.cpp b/src/VBox/Runtime/common/crypto/digest-core.cpp
new file mode 100644
index 0000000..3387447
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/digest-core.cpp
@@ -0,0 +1,338 @@
+/* $Id: digest-core.cpp $ */
+/** @file
+ * IPRT - Crypto - Cryptographic Hash / Message Digest API
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/digest.h>
+
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Generic message digest instance.
+ */
+typedef struct RTCRDIGESTINT
+{
+    /** Magic value (RTCRDIGESTINT_MAGIC). */
+    uint32_t            u32Magic;
+    /** Reference counter. */
+    uint32_t volatile   cRefs;
+    /** Pointer to the message digest descriptor. */
+    PCRTCRDIGESTDESC    pDesc;
+    /** The offset into abState of the storage space .  At
+     * least RTCRDIGESTDESC::cbHash bytes is available at that location. */
+    uint32_t            offHash;
+    /** State. */
+    uint32_t            uState;
+    /** The number of bytes consumed. */
+    uint64_t            cbConsumed;
+    /** Opaque data specific to the message digest algorithm, size given by
+     * RTCRDIGESTDESC::cbState.  This is followed by space for the final hash at
+     * offHash with size RTCRDIGESTDESC::cbHash. */
+    uint8_t             abState[1];
+} RTCRDIGESTINT;
+/** Pointer to a message digest instance. */
+typedef RTCRDIGESTINT *PRTCRDIGESTINT;
+
+/** Magic value for RTCRDIGESTINT::u32Magic (Ralph C. Merkle). */
+#define RTCRDIGESTINT_MAGIC         UINT32_C(0x19520202)
+
+/** @name RTCRDIGESTINT::uState values.
+ * @{ */
+/** Ready for more data. */
+#define RTCRDIGEST_STATE_READY      UINT32_C(1)
+/** The hash has been finalized and can be found at offHash. */
+#define RTCRDIGEST_STATE_FINAL      UINT32_C(2)
+/** Busted state, can happen after re-init. */
+#define RTCRDIGEST_STATE_BUSTED     UINT32_C(3)
+/** @} */
+
+
+
+RTDECL(int) RTCrDigestCreate(PRTCRDIGEST phDigest, PCRTCRDIGESTDESC pDesc, void *pvOpaque)
+{
+    AssertPtrReturn(phDigest, VERR_INVALID_POINTER);
+    AssertPtrReturn(pDesc, VERR_INVALID_POINTER);
+
+    int rc = VINF_SUCCESS;
+    uint32_t offHash = RT_ALIGN_32(pDesc->cbState, 8);
+    PRTCRDIGESTINT pThis = (PRTCRDIGESTINT)RTMemAllocZ(RT_OFFSETOF(RTCRDIGESTINT, abState[offHash + pDesc->cbHash]));
+    if (pThis)
+    {
+        pThis->u32Magic = RTCRDIGESTINT_MAGIC;
+        pThis->cRefs    = 1;
+        pThis->offHash  = offHash;
+        pThis->pDesc    = pDesc;
+        pThis->uState   = RTCRDIGEST_STATE_READY;
+        if (pDesc->pfnInit)
+            rc = pDesc->pfnInit(pThis->abState, pvOpaque, false /*fReInit*/);
+        if (RT_SUCCESS(rc))
+        {
+            *phDigest = pThis;
+            return VINF_SUCCESS;
+        }
+        pThis->u32Magic = 0;
+        RTMemFree(pThis);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+}
+
+
+RTDECL(int) RTCrDigestClone(PRTCRDIGEST phDigest, RTCRDIGEST hSrc)
+{
+    AssertPtrReturn(phDigest, VERR_INVALID_POINTER);
+    AssertPtrReturn(hSrc, VERR_INVALID_HANDLE);
+    AssertReturn(hSrc->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+
+    int rc = VINF_SUCCESS;
+    uint32_t const offHash = hSrc->offHash;
+    PRTCRDIGESTINT pThis = (PRTCRDIGESTINT)RTMemAllocZ(RT_OFFSETOF(RTCRDIGESTINT, abState[offHash + hSrc->pDesc->cbHash]));
+    if (pThis)
+    {
+        pThis->u32Magic = RTCRDIGESTINT_MAGIC;
+        pThis->cRefs    = 1;
+        pThis->offHash  = offHash;
+        pThis->pDesc    = hSrc->pDesc;
+        if (hSrc->pDesc->pfnClone)
+            rc = hSrc->pDesc->pfnClone(pThis->abState, hSrc->abState);
+        else
+            memcpy(pThis->abState, hSrc->abState, offHash);
+        memcpy(&pThis->abState[offHash], &hSrc->abState[offHash], hSrc->pDesc->cbHash);
+        pThis->uState = hSrc->uState;
+
+        if (RT_SUCCESS(rc))
+        {
+            *phDigest = pThis;
+            return VINF_SUCCESS;
+        }
+        pThis->u32Magic = 0;
+        RTMemFree(pThis);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+}
+
+
+RTDECL(int) RTCrDigestReset(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+
+    pThis->cbConsumed = 0;
+    pThis->uState = RTCRDIGEST_STATE_READY;
+
+    int rc = VINF_SUCCESS;
+    if (pThis->pDesc->pfnInit)
+    {
+        rc = pThis->pDesc->pfnInit(pThis->abState, NULL, true /*fReInit*/);
+        if (RT_FAILURE(rc))
+            pThis->uState = RTCRDIGEST_STATE_BUSTED;
+        RT_BZERO(&pThis->abState[pThis->offHash], pThis->pDesc->cbHash);
+    }
+    else
+        RT_BZERO(pThis->abState, pThis->offHash + pThis->pDesc->cbHash);
+    return rc;
+}
+
+
+RTDECL(uint32_t) RTCrDigestRetain(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, UINT32_MAX);
+
+    uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+    Assert(cRefs < 64);
+    return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrDigestRelease(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    if (pThis == NIL_RTCRDIGEST)
+        return 0;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, UINT32_MAX);
+
+    uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs);
+    if (!cRefs)
+    {
+        pThis->u32Magic = ~RTCRDIGESTINT_MAGIC;
+        if (pThis->pDesc->pfnDelete)
+            pThis->pDesc->pfnDelete(pThis->abState);
+        RTMemFree(pThis);
+    }
+    Assert(cRefs < 64);
+    return cRefs;
+}
+
+
+RTDECL(int) RTCrDigestUpdate(RTCRDIGEST hDigest, void const *pvData, size_t cbData)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->uState == RTCRDIGEST_STATE_READY, VERR_INVALID_STATE);
+
+    pThis->pDesc->pfnUpdate(pThis->abState, pvData, cbData);
+    pThis->cbConsumed += cbData;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrDigestFinal(RTCRDIGEST hDigest, void *pvHash, size_t cbHash)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->uState == RTCRDIGEST_STATE_READY || pThis->uState == RTCRDIGEST_STATE_FINAL, VERR_INVALID_STATE);
+    AssertPtrNullReturn(pvHash, VERR_INVALID_POINTER);
+
+    /*
+     * Make sure the hash calculation is final.
+     */
+    if (pThis->uState == RTCRDIGEST_STATE_READY)
+    {
+        pThis->pDesc->pfnFinal(pThis->abState, &pThis->abState[pThis->offHash]);
+        pThis->uState = RTCRDIGEST_STATE_FINAL;
+    }
+    else
+        AssertReturn(pThis->uState == RTCRDIGEST_STATE_FINAL, VERR_INVALID_STATE);
+
+    /*
+     * Copy out the hash if requested.
+     */
+    if (cbHash > 0)
+    {
+        uint32_t cbNeeded = pThis->pDesc->cbHash;
+        if (pThis->pDesc->pfnGetHashSize)
+            cbNeeded = pThis->pDesc->pfnGetHashSize(pThis->abState);
+        Assert(cbNeeded > 0);
+
+        if (cbNeeded == cbHash)
+            memcpy(pvHash, &pThis->abState[pThis->offHash], cbNeeded);
+        else if (cbNeeded > cbHash)
+        {
+            memcpy(pvHash, &pThis->abState[pThis->offHash], cbNeeded);
+            memset((uint8_t *)pvHash + cbNeeded, 0, cbHash - cbNeeded);
+            return VINF_BUFFER_UNDERFLOW;
+        }
+        else
+        {
+            memcpy(pvHash, &pThis->abState[pThis->offHash], cbHash);
+            return VERR_BUFFER_OVERFLOW;
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(bool) RTCrDigestMatch(RTCRDIGEST hDigest, void const *pvHash, size_t cbHash)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+
+    int rc = RTCrDigestFinal(pThis, NULL, 0);
+    AssertRCReturn(rc, false);
+
+    AssertPtrReturn(pvHash, false);
+    return pThis->pDesc->cbHash == cbHash
+        && !memcmp(&pThis->abState[pThis->offHash], pvHash, cbHash);
+}
+
+
+RTDECL(uint8_t const *) RTCrDigestGetHash(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, NULL);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, NULL);
+
+    int rc = RTCrDigestFinal(pThis, NULL, 0);
+    AssertRCReturn(rc, NULL);
+
+    return &pThis->abState[pThis->offHash];
+}
+
+
+RTDECL(uint32_t) RTCrDigestGetHashSize(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, 0);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, 0);
+    if (pThis->pDesc->pfnGetHashSize)
+    {
+        uint32_t cbHash = pThis->pDesc->pfnGetHashSize(pThis->abState);
+        Assert(cbHash <= pThis->pDesc->cbHash);
+        return cbHash;
+    }
+    return pThis->pDesc->cbHash;
+}
+
+
+RTDECL(uint64_t) RTCrDigestGetConsumedSize(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, 0);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, 0);
+    return pThis->cbConsumed;
+}
+
+
+RTDECL(bool) RTCrDigestIsFinalized(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, false);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, false);
+    return pThis->uState == RTCRDIGEST_STATE_FINAL;
+}
+
+
+RTDECL(RTDIGESTTYPE) RTCrDigestGetType(RTCRDIGEST hDigest)
+{
+    PRTCRDIGESTINT pThis = hDigest;
+    AssertPtrReturn(pThis, RTDIGESTTYPE_INVALID);
+    AssertReturn(pThis->u32Magic == RTCRDIGESTINT_MAGIC, RTDIGESTTYPE_INVALID);
+
+    RTDIGESTTYPE enmType = pThis->pDesc->enmType;
+    if (pThis->pDesc->pfnGetDigestType)
+        enmType = pThis->pDesc->pfnGetDigestType(pThis->abState);
+    return enmType;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/iprt-openssl.cpp b/src/VBox/Runtime/common/crypto/iprt-openssl.cpp
new file mode 100644
index 0000000..d5eaf94
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/iprt-openssl.cpp
@@ -0,0 +1,88 @@
+/* $Id: iprt-openssl.cpp $ */
+/** @file
+ * IPRT - Crypto - OpenSSL Helpers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+
+#ifdef IPRT_WITH_OPENSSL    /* Whole file. */
+# include <iprt/err.h>
+# include <iprt/string.h>
+
+# include "internal/iprt-openssl.h"
+# include <openssl/x509.h>
+# include <openssl/err.h>
+
+
+DECLHIDDEN(void) rtCrOpenSslInit(void)
+{
+    static bool s_fOssInitalized;
+    if (!s_fOssInitalized)
+    {
+        OpenSSL_add_all_algorithms();
+        ERR_load_ERR_strings();
+        ERR_load_crypto_strings();
+
+        s_fOssInitalized = true;
+    }
+}
+
+
+DECLHIDDEN(int) rtCrOpenSslErrInfoCallback(const char *pach, size_t cch, void *pvUser)
+{
+    PRTERRINFO pErrInfo = (PRTERRINFO)pvUser;
+    size_t cchAlready = pErrInfo->fFlags & RTERRINFO_FLAGS_SET ? strlen(pErrInfo->pszMsg) : 0;
+    if (cchAlready + 1 < pErrInfo->cbMsg)
+        RTStrCopyEx(pErrInfo->pszMsg + cchAlready, pErrInfo->cbMsg - cchAlready, pach, cch);
+    return -1;
+}
+
+
+DECLHIDDEN(int) rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert)
+{
+    int                  rc;
+    const unsigned char *pabEncoded = (const unsigned char *)RTASN1CORE_GET_RAW_ASN1_PTR(&pCert->SeqCore.Asn1Core);
+    uint32_t             cbEncoded  = RTASN1CORE_GET_RAW_ASN1_SIZE(&pCert->SeqCore.Asn1Core);
+    X509                *pOsslCert  = NULL;
+    if (d2i_X509(&pOsslCert, &pabEncoded, cbEncoded) == pOsslCert)
+    {
+        if (sk_X509_push((STACK_OF(X509) *)pvOsslStack, pOsslCert))
+            rc = VINF_SUCCESS;
+        else
+        {
+            rc = VERR_NO_MEMORY;
+            X509_free(pOsslCert);
+        }
+    }
+    else
+        rc = VERR_CR_X509_OSSL_D2I_FAILED;
+    return rc;
+}
+
+#endif /* IPRT_WITH_OPENSSL */
+
diff --git a/src/VBox/Runtime/common/crypto/pemfile.cpp b/src/VBox/Runtime/common/crypto/pemfile.cpp
new file mode 100644
index 0000000..441c96e
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pemfile.cpp
@@ -0,0 +1,418 @@
+/* $Id: pemfile.cpp $ */
+/** @file
+ * IPRT - Crypto - PEM file reader / writer.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pem.h>
+
+#include <iprt/base64.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/file.h>
+#include <iprt/string.h>
+
+
+
+/**
+ * Looks for a PEM-like marker.
+ *
+ * @returns true if found, fasle if not.
+ * @param   pbContent           Start of the content to search thru.
+ * @param   cbContent           The size of the content to search.
+ * @param   offStart            The offset into pbContent to start searching.
+ * @param   pszLeadWord         The lead word (BEGIN/END).
+ * @param   cchLeadWord         The length of the lead word.
+ * @param   paMarkers           Pointer to an array of markers.
+ * @param   cMarkers            Number of markers in the array.
+ * @param   ppMatch             Where to return the pointer to the matching
+ *                              marker. Optional.
+ * @param   poffBegin           Where to return the start offset of the marker.
+ *                              Optional.
+ * @param   poffEnd             Where to return the end offset of the marker
+ *                              (trailing whitespace and newlines will be
+ *                              skipped).  Optional.
+ */
+static bool rtCrPemFindMarker(uint8_t const *pbContent, size_t cbContent, size_t offStart,
+                              const char *pszLeadWord, size_t cchLeadWord, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+                              PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd)
+{
+    /* Remember the start of the content for the purpose of calculating offsets. */
+    uint8_t const * const pbStart = pbContent;
+
+    /* Skip adhead by offStart */
+    if (offStart >= cbContent)
+        return false;
+    pbContent += offStart;
+    cbContent -= offStart;
+
+    /*
+     * Search the content.
+     */
+    while (cbContent > 6)
+    {
+        /*
+         * Look for dashes.
+         */
+        uint8_t const *pbStartSearch = pbContent;
+        pbContent = (uint8_t const *)memchr(pbContent, '-', cbContent);
+        if (!pbContent)
+            break;
+
+        cbContent -= pbContent - pbStartSearch;
+        if (cbContent < 6)
+            break;
+
+        /*
+         * There must be at least three to interest us.
+         */
+        if (   pbContent[1] == '-'
+            && pbContent[2] == '-')
+        {
+            unsigned cDashes = 3;
+            while (cDashes < cbContent && pbContent[cDashes] == '-')
+                cDashes++;
+
+            if (poffBegin)
+                *poffBegin = pbContent - pbStart;
+            cbContent -= cDashes;
+            pbContent += cDashes;
+
+            /*
+             * Match lead word.
+             */
+            if (   cbContent > cchLeadWord
+                && memcmp(pbContent, pszLeadWord, cchLeadWord) == 0
+                && RT_C_IS_BLANK(pbContent[cchLeadWord]) )
+            {
+                pbContent += cchLeadWord;
+                cbContent -= cchLeadWord;
+                while (cbContent > 0 && RT_C_IS_BLANK(*pbContent))
+                {
+                    pbContent++;
+                    cbContent--;
+                }
+
+                /*
+                 * Match one of the specified markers.
+                 */
+                uint8_t const  *pbSavedContent = pbContent;
+                size_t  const   cbSavedContent = cbContent;
+                uint32_t        iMarker = 0;
+                while (iMarker < cMarkers)
+                {
+                    pbContent = pbSavedContent;
+                    cbContent = cbSavedContent;
+
+                    uint32_t            cWords = paMarkers[iMarker].cWords;
+                    PCRTCRPEMMARKERWORD pWord  = paMarkers[iMarker].paWords;
+                    while (cWords > 0)
+                    {
+                        uint32_t const cchWord = pWord->cchWord;
+                        if (cbContent <= cchWord)
+                            break;
+                        if (memcmp(pbContent, pWord->pszWord, cchWord))
+                            break;
+                        pbContent += cchWord;
+                        cbContent -= cchWord;
+
+                        if (!cbContent || !RT_C_IS_BLANK(*pbContent))
+                            break;
+                        do
+                        {
+                            pbContent++;
+                            cbContent--;
+                        } while (cbContent > 0 && RT_C_IS_BLANK(*pbContent));
+
+                        cWords--;
+                        if (cWords == 0)
+                        {
+                            /*
+                             * If there are three or more dashes following now, we've got a hit.
+                             */
+                            if (   cbContent > 3
+                                && pbContent[0] == '-'
+                                && pbContent[1] == '-'
+                                && pbContent[2] == '-')
+                            {
+                                cDashes = 3;
+                                while (cDashes < cbContent && pbContent[cDashes] == '-')
+                                    cDashes++;
+                                cbContent -= cDashes;
+                                pbContent += cDashes;
+
+                                /*
+                                 * Skip spaces and newline.
+                                 */
+                                while (cbContent > 0 && RT_C_IS_SPACE(*pbContent))
+                                    pbContent++, cbContent--;
+                                if (poffEnd)
+                                    *poffEnd = pbContent - pbStart;
+                                if (*ppMatch)
+                                    *ppMatch = &paMarkers[iMarker];
+                                return true;
+                            }
+                            break;
+                        }
+                    } /* for each word in marker. */
+                } /* for each marker. */
+            }
+        }
+        else
+        {
+            pbContent++;
+            cbContent--;
+        }
+    }
+
+    return false;
+}
+
+
+static bool rtCrPemFindMarkerSection(uint8_t const *pbContent, size_t cbContent, size_t offStart,
+                                     PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+                                     PCRTCRPEMMARKER *ppMatch, size_t *poffBegin, size_t *poffEnd, size_t *poffResume)
+{
+    /** @todo Detect BEGIN / END mismatch. */
+    PCRTCRPEMMARKER pMatch;
+    if (rtCrPemFindMarker(pbContent, cbContent, offStart, "BEGIN", 5, paMarkers, cMarkers,
+                          &pMatch, NULL /*poffStart*/, poffBegin))
+    {
+        if (rtCrPemFindMarker(pbContent, cbContent, *poffBegin, "END", 3, pMatch, 1,
+                              NULL /*ppMatch*/, poffEnd, poffResume))
+        {
+            *ppMatch = pMatch;
+            return true;
+        }
+    }
+    *ppMatch = NULL;
+    return false;
+}
+
+
+
+/**
+ * Does the decoding of a PEM-like data blob after it has been located.
+ *
+ * @returns IPRT status ocde
+ * @param   pbContent           The start of the PEM-like content (text).
+ * @param   cbContent           The max size of the PEM-like content.
+ * @param   ppvDecoded          Where to return a heap block containing the
+ *                              decoded content.
+ * @param   pcbDecoded          Where to return the size of the decoded content.
+ */
+static int rtCrPemDecodeBase64(uint8_t const *pbContent, size_t cbContent, void **ppvDecoded, size_t *pcbDecoded)
+{
+    ssize_t cbDecoded = RTBase64DecodedSizeEx((const char *)pbContent, cbContent, NULL);
+    if (cbDecoded < 0)
+        return VERR_INVALID_BASE64_ENCODING;
+
+    *pcbDecoded = cbDecoded;
+    void *pvDecoded = RTMemAlloc(cbDecoded);
+    if (!pvDecoded)
+        return VERR_NO_MEMORY;
+
+    size_t cbActual;
+    int rc = RTBase64DecodeEx((const char *)pbContent, cbContent, pvDecoded, cbDecoded, &cbActual, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        if (cbActual == (size_t)cbDecoded)
+        {
+            *ppvDecoded = pvDecoded;
+            return VINF_SUCCESS;
+        }
+        rc = VERR_INTERNAL_ERROR_3;
+    }
+    RTMemFree(pvDecoded);
+    return rc;
+}
+
+
+/**
+ * Checks if the content of a file looks to be binary or not.
+ *
+ * @returns true if likely to be binary, false if not binary.
+ * @param   pbFile              The file bytes to scan.
+ * @param   cbFile              The number of bytes.
+ */
+static bool rtCrPemIsBinaryFile(uint8_t *pbFile, size_t cbFile)
+{
+    /*
+     * Assume a well formed PEM file contains only 7-bit ASCII and restricts
+     * itself to the following control characters:
+     *      tab, newline, return, form feed
+     */
+    while (cbFile-- > 0)
+    {
+        uint8_t const b = *pbFile++;
+        if (   b >= 0x7f
+            || (b < 32 && b != '\t' && b != '\n' && b != '\r' && b != '\f') )
+        {
+            /* Ignore EOT (4), SUB (26) and NUL (0) at the end of the file. */
+            if (   (b == 4 || b == 26)
+                && (   cbFile == 0
+                    || (   cbFile == 1
+                        && *pbFile == '\0')))
+                return true;
+            if (b == 0 && cbFile == 0)
+                return true;
+            return false;
+        }
+    }
+    return true;
+}
+
+
+RTDECL(int) RTCrPemFreeSections(PCRTCRPEMSECTION pSectionHead)
+{
+    while (pSectionHead != NULL)
+    {
+        PRTCRPEMSECTION pFree = (PRTCRPEMSECTION)pSectionHead;
+        pSectionHead = pSectionHead->pNext;
+
+        if (pFree->pMarker)
+        {
+            if (pFree->pbData)
+            {
+                RTMemFree(pFree->pbData);
+                pFree->pbData = NULL;
+                pFree->cbData = 0;
+            }
+
+            if (pFree->pszPreamble)
+            {
+                RTMemFree(pFree->pszPreamble);
+                pFree->pszPreamble = NULL;
+                pFree->cchPreamble = 0;
+            }
+        }
+        else
+        {
+            RTFileReadAllFree(pFree->pbData, pFree->cbData);
+            Assert(!pFree->pszPreamble);
+        }
+        pFree->pbData = NULL;
+        pFree->cbData = 0;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrPemReadFile(const char *pszFilename, uint32_t fFlags, PCRTCRPEMMARKER paMarkers, size_t cMarkers,
+                            PCRTCRPEMSECTION *ppSectionHead, PRTERRINFO pErrInfo)
+{
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+
+    size_t      cbContent;
+    uint8_t    *pbContent;
+    int rc = RTFileReadAllEx(pszFilename, 0, 64U*_1M, RTFILE_RDALL_O_DENY_WRITE, (void **)&pbContent, &cbContent);
+    if (RT_SUCCESS(rc))
+    {
+        PRTCRPEMSECTION pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection));
+        if (pSection)
+        {
+            /*
+             * Try locate the first section.
+             */
+            size_t          offBegin, offEnd, offResume;
+            PCRTCRPEMMARKER pMatch;
+            if (   !rtCrPemIsBinaryFile(pbContent, cbContent)
+                && rtCrPemFindMarkerSection(pbContent, cbContent, 0 /*offStart*/, paMarkers, cMarkers,
+                                            &pMatch, &offBegin, &offEnd, &offResume) )
+            {
+                PCRTCRPEMSECTION *ppNext = ppSectionHead;
+                for (;;)
+                {
+                    //pSection->pNext         = NULL;
+                    pSection->pMarker           = pMatch;
+                    //pSection->pbData        = NULL;
+                    //pSection->cbData        = 0;
+                    //pSection->pszPreamble   = NULL;
+                    //pSection->cchPreamble   = 0;
+
+                    *ppNext = pSection;
+                    ppNext = &pSection->pNext;
+
+                    /* Decode the section. */
+                    /** @todo copy the preamble as well. */
+                    rc = rtCrPemDecodeBase64(pbContent + offBegin, offEnd - offBegin,
+                                             (void **)&pSection->pbData, &pSection->cbData);
+                    if (RT_FAILURE(rc))
+                    {
+                        pSection->pbData = NULL;
+                        pSection->cbData = 0;
+                        break;
+                    }
+
+                    /* More sections? */
+                    if (   offResume + 12 >= cbContent
+                        || offResume      >= cbContent
+                        || !rtCrPemFindMarkerSection(pbContent, cbContent, offResume, paMarkers, cMarkers,
+                                                     &pMatch, &offBegin, &offEnd, &offResume) )
+                        break; /* No. */
+
+                    /* Ok, allocate a new record for it. */
+                    pSection = (PRTCRPEMSECTION)RTMemAllocZ(sizeof(*pSection));
+                    if (RT_UNLIKELY(!pSection))
+                    {
+                        rc = VERR_NO_MEMORY;
+                        break;
+                    }
+                }
+                if (RT_SUCCESS(rc))
+                {
+                    RTFileReadAllFree(pbContent, cbContent);
+                    return rc;
+                }
+
+                RTCrPemFreeSections(*ppSectionHead);
+            }
+            else
+            {
+                /*
+                 * No PEM section found.  Return the whole file as one binary section.
+                 */
+                //pSection->pNext         = NULL;
+                //pSection->pMarker       = NULL;
+                pSection->pbData        = pbContent;
+                pSection->cbData        = cbContent;
+                //pSection->pszPreamble   = NULL;
+                //pSection->cchPreamble   = 0;
+                *ppSectionHead = pSection;
+                return VINF_SUCCESS;
+            }
+        }
+        else
+            rc = VERR_NO_MEMORY;
+        RTFileReadAllFree(pbContent, cbContent);
+    }
+    *ppSectionHead = NULL;
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp
new file mode 100644
index 0000000..a8f4738
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-asn1-decoder.cpp
@@ -0,0 +1,89 @@
+/* $Id: pkcs7-asn1-decoder.cpp $ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/spc.h>
+
+#include "pkcs7-internal.h"
+
+
+/*
+ * PKCS #7 ContentInfo
+ */
+
+static int rtCrPkcs7ContentInfo_DecodeExtra(PRTASN1CURSOR pCursor, uint32_t fFlags, PRTCRPKCS7CONTENTINFO pThis,
+                                            const char *pszErrorTag)
+{
+    pThis->u.pCore = NULL;
+
+    int             rc;
+    RTASN1CURSOR    ContentCursor;
+    if (RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0)
+    {
+        rc = RTAsn1MemAllocZ(&pThis->Content.EncapsulatedAllocation, (void **)&pThis->Content.pEncapsulated,
+                             sizeof(*pThis->u.pSignedData));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->u.pCore = pThis->Content.pEncapsulated;
+            RTAsn1CursorInitSubFromCore(pCursor, &pThis->Content.Asn1Core, &ContentCursor, "Content");
+            rc = RTCrPkcs7SignedData_DecodeAsn1(&ContentCursor, 0, pThis->u.pSignedData, "SignedData");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRSPCINDIRECTDATACONTENT_OID) == 0)
+    {
+        rc = RTAsn1MemAllocZ(&pThis->Content.EncapsulatedAllocation, (void **)&pThis->Content.pEncapsulated,
+                             sizeof(*pThis->u.pIndirectDataContent));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->u.pCore = pThis->Content.pEncapsulated;
+            RTAsn1CursorInitSubFromCore(pCursor, &pThis->Content.Asn1Core, &ContentCursor, "Content");
+            rc = RTCrSpcIndirectDataContent_DecodeAsn1(&ContentCursor, 0, pThis->u.pIndirectDataContent, "IndirectDataContent");
+        }
+    }
+    else
+        return VINF_SUCCESS;
+
+    if (RT_SUCCESS(rc))
+        rc = RTAsn1CursorCheckEnd(&ContentCursor);
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+    return rc;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/pkcs7-core.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/pkcs7-core.cpp
index 35b6d89..969a139 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/pkcs7-core.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: pkcs7-core.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - PKCS \#7, Core APIs.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,27 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
+#include "pkcs7-internal.h"
+
+
+/*
+ * PCKS #7 ContentInfo.
+ */
+
+RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0;
 }
 
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/pkcs7-init.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/pkcs7-init.cpp
index 35b6d89..a602225 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/pkcs7-init.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: pkcs7-init.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - PKCS \#7, Initialization API.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,26 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
 
-int main(int argc, char **argv)
+#include "pkcs7-internal.h"
+
+
+static int rtCrPkcs7ContentInfo_CloneExtra(PRTCRPKCS7CONTENTINFO pThis)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    pThis->u.pCore = pThis->Content.pEncapsulated;
+    return VINF_SUCCESS;
 }
 
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/pkcs7-internal.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/pkcs7-internal.h
index 35b6d89..d4dc2cf 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/pkcs7-internal.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: pkcs7-internal.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - PKCS \#7, Internal Header.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,11 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#ifndef ___common_crypto_pkcs7_internal_h
+#define ___common_crypto_pkcs7_internal_h
 
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/pkcs7-template.h"
+#include <iprt/asn1-generator-internal-header.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp b/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp
new file mode 100644
index 0000000..b6b2935
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-sanity.cpp
@@ -0,0 +1,209 @@
+/* $Id: pkcs7-sanity.cpp $ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+//#include <iprt/stream.h>
+
+#include "pkcs7-internal.h"
+
+
+static int rtCrPkcs7SignedData_CheckSanityExtra(PCRTCRPKCS7SIGNEDDATA pSignedData, uint32_t fFlags,
+                                                PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    bool const fAuthenticode = RT_BOOL(fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE);
+
+    //RTAsn1Dump(&pSignedData->SeqCore.Asn1Core, 0, 0, RTAsn1DumpStrmPrintfV, g_pStdOut);
+
+    if (RTAsn1Integer_UnsignedCompareWithU32(&pSignedData->Version, RTCRPKCS7SIGNEDDATA_V1) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_VERSION, "SignedData version is %llu, expected %u",
+                             pSignedData->Version.uValue.u, RTCRPKCS7SIGNEDDATA_V1);
+
+    /*
+     * DigestAlgorithms.
+     */
+    if (pSignedData->DigestAlgorithms.cItems == 0) /** @todo this might be too strict */
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_NO_DIGEST_ALGOS, "SignedData.DigestAlgorithms is empty");
+    if (pSignedData->DigestAlgorithms.cItems != 1 && fAuthenticode)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO,
+                             "SignedData.DigestAlgorithms has more than one algorithm (%u)",
+                             pSignedData->DigestAlgorithms.cItems);
+
+    if (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH)
+        for (uint32_t i = 0; i < pSignedData->DigestAlgorithms.cItems; i++)
+        {
+            if (RTCrX509AlgorithmIdentifier_QueryDigestType(&pSignedData->DigestAlgorithms.paItems[i]) == RTDIGESTTYPE_INVALID)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_UNKNOWN_DIGEST_ALGORITHM,
+                                     "SignedData.DigestAlgorithms[%i] is not known: %s",
+                                     i, pSignedData->DigestAlgorithms.paItems[i].Algorithm.szObjId);
+            if (pSignedData->DigestAlgorithms.paItems[i].Parameters.enmType != RTASN1TYPE_NULL)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL,
+                                     "SignedData.DigestAlgorithms[%i] has parameters: tag=%u",
+                                     i, pSignedData->DigestAlgorithms.paItems[i].Parameters.u.Core.uTag);
+        }
+
+    /*
+     * Certificates.
+     */
+    if (   (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT)
+        && pSignedData->Certificates.cItems == 0)
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NO_CERTIFICATES,
+                            "SignedData.Certifcates is empty, expected at least one certificate");
+
+    if (pSignedData->Certificates.cItems > 0)
+    {
+        int rc = RTCrX509Certificates_CheckSanity(&pSignedData->Certificates, 0, pErrInfo, "SignedData.T0.Certificates");
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    /*
+     * Crls.
+     */
+    if (fAuthenticode && RTAsn1Core_IsPresent(&pSignedData->Crls))
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_EXPECTED_NO_CRLS,
+                            "SignedData.Crls is not empty as expected for authenticode.");
+    /** @todo check Crls when they become important. */
+
+    /*
+     * SignerInfos.
+     */
+    if (pSignedData->SignerInfos.cItems == 0)
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NO_SIGNER_INFOS, "SignedData.SignerInfos is empty?");
+    if (fAuthenticode && pSignedData->SignerInfos.cItems != 1)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_EXPECTED_ONE_SIGNER_INFO,
+                             "SignedData.SignerInfos should have one entry for authenticode: %u",
+                             pSignedData->SignerInfos.cItems);
+
+    for (uint32_t i = 0; i < pSignedData->SignerInfos.cItems; i++)
+    {
+        PCRTCRPKCS7SIGNERINFO pSignerInfo = &pSignedData->SignerInfos.paItems[i];
+
+        if (RTAsn1Integer_UnsignedCompareWithU32(&pSignerInfo->Version, RTCRPKCS7SIGNERINFO_V1) != 0)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_VERSION,
+                                 "SignedData.SignerInfos[%u] version is %llu, expected %u",
+                                 pSignerInfo->Version.uValue.u, RTCRPKCS7SIGNERINFO_V1);
+
+        /* IssuerAndSerialNumber. */
+        int rc = RTCrX509Name_CheckSanity(&pSignerInfo->IssuerAndSerialNumber.Name, 0, pErrInfo,
+                                          "SignedData.SignerInfos[#].IssuerAndSerialNumber.Name");
+        if (RT_FAILURE(rc))
+            return rc;
+
+        if (pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.cb == 0)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_NO_ISSUER_SERIAL_NO,
+                                 "SignedData.SignerInfos[%u].IssuerAndSerialNumber.SerialNumber is missing (zero length)", i);
+
+        PCRTCRX509CERTIFICATE pCert;
+        pCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSignedData->Certificates,
+                                                                 &pSignerInfo->IssuerAndSerialNumber.Name,
+                                                                 &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+        if (!pCert && (fFlags & RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT))
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_CERT_NOT_SHIPPED,
+                                 "SignedData.SignerInfos[%u].IssuerAndSerialNumber not found in T0.Certificates", i);
+
+        /* DigestAlgorithm */
+        uint32_t j = 0;
+        while (   j < pSignedData->DigestAlgorithms.cItems
+               && RTCrX509AlgorithmIdentifier_Compare(&pSignedData->DigestAlgorithms.paItems[j],
+                                                      &pSignerInfo->DigestAlgorithm) != 0)
+            j++;
+        if (j >= pSignedData->DigestAlgorithms.cItems)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST,
+                                 "SignedData.SignerInfos[%u].DigestAlgorithm (%s) not found in SignedData.DigestAlgorithms",
+                                 i, pSignerInfo->DigestAlgorithm.Algorithm.szObjId);
+
+        /* Digest encryption algorithm. */
+        if (   pCert
+            && RTCrX509AlgorithmIdentifier_Compare(&pSignerInfo->DigestEncryptionAlgorithm,
+                                                   &pCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm) != 0)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNER_INFO_DIGEST_ENCRYPT_MISMATCH,
+                                 "SignedData.SignerInfos[%u].DigestEncryptionAlgorithm (%s) mismatch with certificate (%s)",
+                                 i, pSignerInfo->DigestEncryptionAlgorithm.Algorithm.szObjId,
+                                 pCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm.szObjId);
+
+        /* Authenticated attributes we know. */
+        if (RTCrPkcs7Attributes_IsPresent(&pSignerInfo->AuthenticatedAttributes))
+        {
+            bool fFoundContentInfo   = false;
+            bool fFoundMessageDigest = false;
+            for (j = 0; j < pSignerInfo->AuthenticatedAttributes.cItems; j++)
+            {
+                PCRTCRPKCS7ATTRIBUTE pAttrib = &pSignerInfo->AuthenticatedAttributes.paItems[j];
+                if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0)
+                {
+                    if (fFoundContentInfo)
+                        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB,
+                                            "Multiple authenticated content-type attributes.");
+                    fFoundContentInfo = true;
+                    AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, VERR_INTERNAL_ERROR_3);
+                    if (pAttrib->uValues.pObjIds->cItems != 1)
+                        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB,
+                                             "Expected exactly one value for content-type attrib, found: %u",
+                                             pAttrib->uValues.pObjIds->cItems);
+                }
+                else if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0)
+                {
+                    if (fFoundMessageDigest)
+                        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB,
+                                            "Multiple authenticated message-digest attributes.");
+                    fFoundMessageDigest = true;
+                    AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, VERR_INTERNAL_ERROR_3);
+                    if (pAttrib->uValues.pOctetStrings->cItems != 1)
+                        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_BAD_CONTENT_TYPE_ATTRIB,
+                                             "Expected exactly one value for message-digest attrib, found: %u",
+                                             pAttrib->uValues.pOctetStrings->cItems);
+                }
+                else
+                    AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_UNKNOWN, VERR_INTERNAL_ERROR_3);
+            }
+
+            if (!fFoundContentInfo)
+                return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_CONTENT_TYPE_ATTRIB,
+                                    "Missing authenticated content-type attribute.");
+            if (!fFoundMessageDigest)
+                return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_MISSING_MESSAGE_DIGEST_ATTRIB,
+                                    "Missing authenticated message-digest attribute.");
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-template.h b/src/VBox/Runtime/common/crypto/pkcs7-template.h
new file mode 100644
index 0000000..9913997
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-template.h
@@ -0,0 +1,160 @@
+/* $Id: pkcs7-template.h $ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Core APIs, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL         RTDECL
+
+/*
+ * One PCKS #7 IssuerAndSerialNumber.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7ISSUERANDSERIALNUMBER
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7IssuerAndSerialNumber
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7IssuerAndSerialNumber
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Name,               RTCRX509NAME,                   RTCrX509Name);
+RTASN1TMPL_MEMBER(              SerialNumber,       RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One PCKS #7 Attribute.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7ATTRIBUTE
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7Attribute
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7Attribute
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Type,               RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN(          uValues,    pOctetStrings,  RTASN1SETOFOCTETSTRINGS,    RTAsn1SetOfOctetStrings,    Allocation,
+    enmType, RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS,  RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0);
+RTASN1TMPL_MEMBER_DYN(          uValues,    pObjIds,        RTASN1SETOFOBJIDS,          RTAsn1SetOfObjIds,          Allocation,
+    enmType, RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS,        RTAsn1ObjId_CompareWithString(&pThis->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT(  uValues,    pCores,         RTASN1SETOFCORES,           RTAsn1SetOfCores,           Allocation,
+    enmType, RTCRPKCS7ATTRIBUTETYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END(RTCRPKCS7ATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of PCKS #7 Attributes.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7ATTRIBUTES
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7Attributes
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7Attributes
+RTASN1TMPL_SET_OF(RTCRPKCS7ATTRIBUTE, RTCrPkcs7Attribute);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One PCKS #7 SignerInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7SIGNERINFO
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7SignerInfo
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7SignerInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Version,                    RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              IssuerAndSerialNumber,      RTCRPKCS7ISSUERANDSERIALNUMBER, RTCrPkcs7IssuerAndSerialNumber);
+RTASN1TMPL_MEMBER(              DigestAlgorithm,            RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER_OPT_ITAG(     AuthenticatedAttributes,    RTCRPKCS7ATTRIBUTES,            RTCrPkcs7Attributes,     0);
+RTASN1TMPL_MEMBER(              DigestEncryptionAlgorithm,  RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              EncryptedDigest,            RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_MEMBER_OPT_ITAG(     UnauthenticatedAttributes,  RTCRPKCS7ATTRIBUTES,            RTCrPkcs7Attributes,    1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of PCKS #7 SignerInfos.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7SIGNERINFOS
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7SignerInfos
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7SignerInfos
+RTASN1TMPL_SET_OF(RTCRPKCS7SIGNERINFO, RTCrPkcs7SignerInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 SignedData.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7SIGNEDDATA
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7SignedData
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7SignedData
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Version,                    RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              DigestAlgorithms,           RTCRX509ALGORITHMIDENTIFIERS,   RTCrX509AlgorithmIdentifiers);
+RTASN1TMPL_MEMBER(              ContentInfo,                RTCRPKCS7CONTENTINFO,           RTCrPkcs7ContentInfo);
+RTASN1TMPL_MEMBER_OPT_ITAG(     Certificates,               RTCRX509CERTIFICATES,           RTCrX509Certificates,   0);
+RTASN1TMPL_MEMBER_OPT_ITAG(     Crls,                       RTASN1CORE,                     RTAsn1Core,             1);
+RTASN1TMPL_MEMBER(              SignerInfos,                RTCRPKCS7SIGNERINFOS,           RTCrPkcs7SignerInfos);
+RTASN1TMPL_EXEC_CHECK_SANITY(   rc = rtCrPkcs7SignedData_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 DigestInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7DIGESTINFO
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7DigestInfo
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7DigestInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              DigestAlgorithm,            RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              Digest,                     RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * PCKS #7 ContentInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRPKCS7CONTENTINFO
+#define RTASN1TMPL_EXT_NAME     RTCrPkcs7ContentInfo
+#define RTASN1TMPL_INT_NAME     rtCrPkcs7ContentInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              ContentType,                RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER_OPT_ITAG(     Content,                    RTASN1OCTETSTRING,              RTAsn1OctetString, 0);
+RTASN1TMPL_EXEC_DECODE(         rc = rtCrPkcs7ContentInfo_DecodeExtra(pCursor, fFlags, pThis, pszErrorTag)) /* no ; */
+RTASN1TMPL_EXEC_CLONE(          rc = rtCrPkcs7ContentInfo_CloneExtra(pThis) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp b/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp
new file mode 100644
index 0000000..b7e6ed0
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkcs7-verify.cpp
@@ -0,0 +1,552 @@
+/* $Id: pkcs7-verify.cpp $ */
+/** @file
+ * IPRT - Crypto - PKCS \#7, Verification
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkcs7.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+#include <iprt/crypto/pkix.h>
+#include <iprt/crypto/store.h>
+#include <iprt/crypto/x509.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/pkcs7.h>
+# include <openssl/x509.h>
+# include <openssl/err.h>
+#endif
+
+
+
+#ifdef IPRT_WITH_OPENSSL
+static int rtCrPkcs7VerifySignedDataUsingOpenSsl(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+                                                 RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+                                                 void const *pvContent, uint32_t cbContent, PRTERRINFO pErrInfo)
+{
+    /*
+     * Verify using OpenSSL.
+     */
+    int rcOssl;
+    unsigned char const *pbRawContent = RTASN1CORE_GET_RAW_ASN1_PTR(&pContentInfo->SeqCore.Asn1Core);
+    PKCS7 *pOsslPkcs7 = NULL;
+    if (d2i_PKCS7(&pOsslPkcs7, &pbRawContent, RTASN1CORE_GET_RAW_ASN1_SIZE(&pContentInfo->SeqCore.Asn1Core)) == pOsslPkcs7)
+    {
+        STACK_OF(X509) *pAddCerts = NULL;
+        if (hAdditionalCerts != NIL_RTCRSTORE)
+            rcOssl = RTCrStoreConvertToOpenSslCertStack(hAdditionalCerts, 0, (void **)&pAddCerts);
+        else
+        {
+            pAddCerts = sk_X509_new_null();
+            rcOssl = RT_LIKELY(pAddCerts != NULL) ? VINF_SUCCESS : VERR_NO_MEMORY;
+        }
+        if (RT_SUCCESS(rcOssl))
+        {
+            for (uint32_t i = 0; i < pContentInfo->u.pSignedData->Certificates.cItems; i++)
+                rtCrOpenSslAddX509CertToStack(pAddCerts, &pContentInfo->u.pSignedData->Certificates.paItems[i]);
+
+
+            X509_STORE *pTrustedCerts = NULL;
+            if (hTrustedCerts != NIL_RTCRSTORE)
+                rcOssl = RTCrStoreConvertToOpenSslCertStore(hTrustedCerts, 0, (void **)&pTrustedCerts);
+            if (RT_SUCCESS(rcOssl))
+            {
+                rtCrOpenSslInit();
+
+                BIO *pBioContent = BIO_new_mem_buf((void *)pvContent, cbContent);
+                if (pBioContent)
+                {
+                    uint32_t fOsslFlags = PKCS7_NOCHAIN;
+                    fOsslFlags |= PKCS7_NOVERIFY; // temporary hack.
+                    if (PKCS7_verify(pOsslPkcs7, pAddCerts, pTrustedCerts, pBioContent, NULL /*out*/, fOsslFlags))
+                        rcOssl = VINF_SUCCESS;
+                    else
+                    {
+                        rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_OSSL_VERIFY_FAILED, "PKCS7_verify failed: ");
+                        if (pErrInfo)
+                            ERR_print_errors_cb(rtCrOpenSslErrInfoCallback, pErrInfo);
+                    }
+                    BIO_free(pBioContent);
+                }
+                if (pTrustedCerts)
+                    X509_STORE_free(pTrustedCerts);
+            }
+            else
+                rcOssl = RTErrInfoSet(pErrInfo, rcOssl, "RTCrStoreConvertToOpenSslCertStack failed");
+            if (pAddCerts)
+                sk_X509_pop_free(pAddCerts, X509_free);
+        }
+        else
+            rcOssl = RTErrInfoSet(pErrInfo, rcOssl, "RTCrStoreConvertToOpenSslCertStack failed");
+        PKCS7_free(pOsslPkcs7);
+    }
+    else
+        rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_OSSL_D2I_FAILED, "d2i_PKCS7 failed");
+
+    return rcOssl;
+}
+#endif /* IPRT_WITH_OPENSSL */
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ *  Default implementation that checks for the DigitalSignature KeyUsage bit.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackDefault(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                               void *pvUser, PRTERRINFO pErrInfo)
+{
+    /*
+     * Check for the digital signature key usage.
+     */
+    if (   (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+        && !(pCert->TbsCertificate.T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fKeyUsage=%#x, missing %#x",
+                             pCert->TbsCertificate.T3.fKeyUsage, RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing.  Use this for Microsoft SPC.}
+ */
+RTDECL(int) RTCrPkcs7VerifyCertCallbackCodeSigning(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                                   void *pvUser, PRTERRINFO pErrInfo)
+{
+    /*
+     * Check for the digital signature key usage.  Not required to be present.
+     */
+    if (pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+    {
+        if (!(pCert->TbsCertificate.T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE))
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fKeyUsage=%#x, missing %#x",
+                                 pCert->TbsCertificate.T3.fKeyUsage, RTCRX509CERT_KEY_USAGE_F_DIGITAL_SIGNATURE);
+    }
+
+    /*
+     * Check the extended key usage bits if present.
+     */
+    if (!(pCert->TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "No extended key usage certificate attribute.");
+    if (!(pCert->TbsCertificate.T3.fExtKeyUsage & RTCRX509CERT_EKU_F_CODE_SIGNING))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_KEY_USAGE_MISMATCH, "fExtKeyUsage=%#x, missing %#x",
+                             pCert->TbsCertificate.T3.fExtKeyUsage, RTCRX509CERT_EKU_F_CODE_SIGNING);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Deals with authenticated attributes.
+ *
+ * When authenticated attributes are present (checked by caller) we must:
+ *  - fish out the content type and check it against the content inof,
+ *  - fish out the message digest among and check it against *phDigest,
+ *  - compute the message digest of the authenticated attributes and
+ *    replace *phDigest with this for the signature verification.
+ *
+ * @returns IPRT status code.
+ * @param   pSignerInfo         The signer info being verified.
+ * @param   pSignedData         The signed data.
+ * @param   phDigest            On input this is the digest of the content. On
+ *                              output it will (on success) be a reference to
+ *                              the message digest of the authenticated
+ *                              attributes.  The input reference is consumed.
+ *                              The caller shall release the output reference.
+ * @param   fFlags              Flags.
+ * @param   pErrInfo            Extended error info, optional.
+ */
+static int rtCrPkcs7VerifySignerInfoAuthAttribs(PCRTCRPKCS7SIGNERINFO pSignerInfo, PCRTCRPKCS7SIGNEDDATA pSignedData,
+                                                PRTCRDIGEST phDigest, uint32_t fFlags, PRTERRINFO pErrInfo)
+{
+    /*
+     * Scan the attributes and validate the two required attributes
+     * (RFC-2315, chapter 9.2, fourth bullet).  Checking that we've got exactly
+     * one of each of them is checked by the santiy checker function, so we'll
+     * just assert that it did it's job here.
+     */
+    uint32_t    cContentTypes   = 0;
+    uint32_t    cMessageDigests = 0;
+    uint32_t    i               = pSignerInfo->AuthenticatedAttributes.cItems;
+    while (i-- > 0)
+    {
+        PCRTCRPKCS7ATTRIBUTE pAttrib = &pSignerInfo->AuthenticatedAttributes.paItems[i];
+
+        if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_CONTENT_TYPE_OID) == 0)
+        {
+            AssertReturn(!cContentTypes, VERR_CR_PKCS7_INTERNAL_ERROR);
+            AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OBJ_IDS, VERR_CR_PKCS7_INTERNAL_ERROR);
+            AssertReturn(pAttrib->uValues.pObjIds->cItems == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+            if (RTAsn1ObjId_Compare(&pAttrib->uValues.pObjIds->paItems[0], &pSignedData->ContentInfo.ContentType) != 0)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_CONTENT_TYPE_ATTRIB_MISMATCH,
+                                     "Expected content-type %s, found %s",
+                                     &pAttrib->uValues.pObjIds->paItems[0], pSignedData->ContentInfo.ContentType.szObjId);
+            cContentTypes++;
+        }
+        else if (RTAsn1ObjId_CompareWithString(&pAttrib->Type, RTCR_PKCS9_ID_MESSAGE_DIGEST_OID) == 0)
+        {
+            AssertReturn(!cMessageDigests, VERR_CR_PKCS7_INTERNAL_ERROR);
+            AssertReturn(pAttrib->enmType == RTCRPKCS7ATTRIBUTETYPE_OCTET_STRINGS, VERR_CR_PKCS7_INTERNAL_ERROR);
+            AssertReturn(pAttrib->uValues.pOctetStrings->cItems == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+            if (!RTCrDigestMatch(*phDigest,
+                                 pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.uData.pv,
+                                 pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb))
+            {
+                size_t cbHash = RTCrDigestGetHashSize(*phDigest);
+                if (cbHash != pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb)
+                    return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH,
+                                         "Authenticated message-digest attribute mismatch: cbHash=%#zx cbValue=%#x",
+                                         cbHash, pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.cb);
+                return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_MESSAGE_DIGEST_ATTRIB_MISMATCH,
+                                     "Authenticated message-digest attribute mismatch (cbHash=%#zx):\n"
+                                     "signed: %.*Rhxs\n"
+                                     "our:    %.*Rhxs\n",
+                                     cbHash,
+                                     cbHash, pAttrib->uValues.pOctetStrings->paItems[0].Asn1Core.uData.pv,
+                                     cbHash, RTCrDigestGetHash(*phDigest));
+            }
+            cMessageDigests++;
+        }
+    }
+
+    AssertReturn(cContentTypes == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+    AssertReturn(cMessageDigests == 1, VERR_CR_PKCS7_INTERNAL_ERROR);
+
+    /*
+     * Calculate the digest of the the authenticated attributes for use in the
+     * signature validation.
+     */
+    if (   pSignerInfo->DigestAlgorithm.Parameters.enmType != RTASN1TYPE_NULL
+        && pSignerInfo->DigestAlgorithm.Parameters.enmType != RTASN1TYPE_NOT_PRESENT)
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_DIGEST_PARAMS_NOT_IMPL, "Digest algorithm has unsupported parameters");
+
+    RTCRDIGEST hDigest;
+    int rc = RTCrDigestCreateByObjId(&hDigest, &pSignerInfo->DigestAlgorithm.Algorithm);
+    if (RT_SUCCESS(rc))
+    {
+        RTCrDigestRelease(*phDigest);
+        *phDigest = hDigest;
+
+        /* ASSUMES that the attributes are encoded according to DER. */
+        uint8_t const  *pbData = (uint8_t const *)RTASN1CORE_GET_RAW_ASN1_PTR(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core);
+        uint32_t        cbData = RTASN1CORE_GET_RAW_ASN1_SIZE(&pSignerInfo->AuthenticatedAttributes.SetCore.Asn1Core);
+        uint8_t         bSetOfTag = ASN1_TAG_SET | ASN1_TAGCLASS_UNIVERSAL | ASN1_TAGFLAG_CONSTRUCTED;
+        rc = RTCrDigestUpdate(hDigest, &bSetOfTag, sizeof(bSetOfTag)); /* Replace the implict tag with a SET-OF tag. */
+        if (RT_SUCCESS(rc))
+            rc = RTCrDigestUpdate(hDigest, pbData + sizeof(bSetOfTag), cbData - sizeof(bSetOfTag)); /* Skip the implicit tag. */
+        if (RT_SUCCESS(rc))
+            rc = RTCrDigestFinal(hDigest, NULL, 0);
+    }
+    return rc;
+}
+
+
+/**
+ * Verifies one signature on a PKCS \#7 SignedData.
+ *
+ * @returns IPRT status code.
+ * @param   pSignerInfo         The signature.
+ * @param   pSignedData         The SignedData.
+ * @param   pahDigests          Array of content digests that runs parallel to
+ *                              pSignedData->DigestAlgorithms.
+ * @param   fFlags              Verficiation flags.
+ * @param   hAdditionalCerts    Store containing optional certificates,
+ *                              optional.
+ * @param   hTrustedCerts       Store containing trusted certificates, required.
+ * @param   pValidationTime     The time we're supposed to validate the
+ *                              certificates chains at.
+ * @param   pfnVerifyCert       Signing certificate verification callback.
+ * @param   pvUser              Callback parameter.
+ * @param   pErrInfo            Where to store additional error details,
+ *                              optional.
+ */
+static int rtCrPkcs7VerifySignerInfo(PCRTCRPKCS7SIGNERINFO pSignerInfo, PCRTCRPKCS7SIGNEDDATA pSignedData,
+                                     PRTCRDIGEST pahDigests, uint32_t fFlags, RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+                                     PCRTTIMESPEC pValidationTime, RTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+                                     PRTERRINFO pErrInfo)
+{
+    /*
+     * Check for counter signatures with timestamp.  Verify the signature for
+     * the current time if not present.
+     */
+    /** @todo timestamp counter signatures. */
+
+    /*
+     * Locate the certificate used for signing.
+     */
+    PCRTCRCERTCTX           pSignerCertCtx = NULL;
+    PCRTCRX509CERTIFICATE   pSignerCert = NULL;
+    RTCRSTORE               hSignerCertSrc = hTrustedCerts;
+    if (hSignerCertSrc != NIL_RTCRSTORE)
+        pSignerCertCtx = RTCrStoreCertByIssuerAndSerialNo(hSignerCertSrc, &pSignerInfo->IssuerAndSerialNumber.Name,
+                                                          &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+    if (!pSignerCertCtx)
+    {
+        hSignerCertSrc = hAdditionalCerts;
+        if (hSignerCertSrc != NIL_RTCRSTORE)
+            pSignerCertCtx = RTCrStoreCertByIssuerAndSerialNo(hSignerCertSrc, &pSignerInfo->IssuerAndSerialNumber.Name,
+                                                              &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+    }
+    if (pSignerCertCtx)
+        pSignerCert = pSignerCertCtx->pCert;
+    else
+    {
+        hSignerCertSrc = NULL;
+        pSignerCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSignedData->Certificates,
+                                                                       &pSignerInfo->IssuerAndSerialNumber.Name,
+                                                                       &pSignerInfo->IssuerAndSerialNumber.SerialNumber);
+        if (!pSignerCert)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND,
+                                 "Certificate not found: serial=%.*Rhxs",
+                                 pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.cb,
+                                 pSignerInfo->IssuerAndSerialNumber.SerialNumber.Asn1Core.uData.pv);
+    }
+
+    /*
+     * If not a trusted certificate, we'll have to build certificate paths
+     * and verify them.  If no valid paths are found, this step will fail.
+     */
+    int rc = VINF_SUCCESS;
+    if (   hSignerCertSrc == NIL_RTCRSTORE
+        || hSignerCertSrc != hTrustedCerts)
+    {
+        RTCRX509CERTPATHS hCertPaths;
+        rc = RTCrX509CertPathsCreate(&hCertPaths, pSignerCert);
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTCrX509CertPathsSetValidTimeSpec(hCertPaths, pValidationTime);
+            if (hTrustedCerts != NIL_RTCRSTORE && RT_SUCCESS(rc))
+                rc = RTCrX509CertPathsSetTrustedStore(hCertPaths, hTrustedCerts);
+            if (hAdditionalCerts != NIL_RTCRSTORE && RT_SUCCESS(rc))
+                rc = RTCrX509CertPathsSetUntrustedStore(hCertPaths, hAdditionalCerts);
+            if (pSignedData->Certificates.cItems > 0 && RT_SUCCESS(rc))
+                rc = RTCrX509CertPathsSetUntrustedArray(hCertPaths,
+                                                        pSignedData->Certificates.paItems,
+                                                        pSignedData->Certificates.cItems);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTCrX509CertPathsBuild(hCertPaths, pErrInfo);
+                if (RT_SUCCESS(rc))
+                    rc = RTCrX509CertPathsValidateAll(hCertPaths, NULL, pErrInfo);
+
+                /*
+                 * Check that the certificate purpose and whatnot matches what
+                 * is being signed.
+                 */
+                if (RT_SUCCESS(rc))
+                    rc = pfnVerifyCert(pSignerCert, hCertPaths, pvUser, pErrInfo);
+            }
+            else
+                RTErrInfoSetF(pErrInfo, rc, "Error configuring path builder: %Rrc", rc);
+            RTCrX509CertPathsRelease(hCertPaths);
+        }
+    }
+    /*
+     * Check that the certificate purpose matches what is signed.
+     */
+    else
+        rc = pfnVerifyCert(pSignerCert, NIL_RTCRX509CERTPATHS, pvUser, pErrInfo);
+
+    /*
+     * Find the digest that is signed and reference it so we can replace it
+     * below if necessary.
+     */
+    RTCRDIGEST hDigest = NIL_RTCRDIGEST;
+    uint32_t iDigest = pSignedData->DigestAlgorithms.cItems;
+    while (iDigest-- > 0)
+        if (RTCrX509AlgorithmIdentifier_Compare(&pSignedData->DigestAlgorithms.paItems[iDigest],
+                                                &pSignerInfo->DigestAlgorithm) == 0)
+        {
+            hDigest = pahDigests[iDigest];
+            uint32_t cRefs = RTCrDigestRetain(hDigest);
+            AssertStmt(cRefs != UINT32_MAX, cRefs = NIL_RTCRDIGEST; rc = VERR_CR_PKCS7_INTERNAL_ERROR);
+            break;
+        }
+    if (hDigest == NIL_RTCRDIGEST && RT_SUCCESS(rc))
+        rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_ALGO_NOT_FOUND_IN_LIST,
+                           "SignerInfo.DigestAlgorithm %s not found.",
+                           pSignerInfo->DigestAlgorithm.Algorithm.szObjId);
+
+    /*
+     * If there are authenticated attributes, we've got more work before we
+     * can verify the signature.
+     */
+    if (   RT_SUCCESS(rc)
+        && RTCrPkcs7Attributes_IsPresent(&pSignerInfo->AuthenticatedAttributes))
+        rc = rtCrPkcs7VerifySignerInfoAuthAttribs(pSignerInfo, pSignedData, &hDigest, fFlags, pErrInfo);
+
+    /*
+     * Verify the signature.
+     */
+    if (RT_SUCCESS(rc))
+    {
+        RTCRPKIXSIGNATURE hSignature;
+        rc = RTCrPkixSignatureCreateByObjId(&hSignature,
+                                            &pSignerCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm,
+                                            false /*fSigning*/,
+                                            &pSignerCert->TbsCertificate.SubjectPublicKeyInfo.SubjectPublicKey,
+                                            &pSignerInfo->DigestEncryptionAlgorithm.Parameters);
+        if (RT_SUCCESS(rc))
+        {
+            /** @todo Check that DigestEncryptionAlgorithm is compatible with hSignature
+             *        (this is not vital). */
+            rc = RTCrPkixSignatureVerifyOctetString(hSignature, hDigest, &pSignerInfo->EncryptedDigest);
+            if (RT_FAILURE(rc))
+                rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_SIGNATURE_VERIFICATION_FAILED,
+                                   "Signature verficiation failed: %Rrc", rc);
+            RTCrPkixSignatureRelease(hSignature);
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, rc, "Failure to instantiate public key algorithm [IPRT]: %s (%s)",
+                               pSignerCert->TbsCertificate.SubjectPublicKeyInfo.Algorithm.Algorithm.szObjId,
+                               pSignerInfo->DigestEncryptionAlgorithm.Algorithm.szObjId);
+    }
+
+    RTCrDigestRelease(hDigest);
+    RTCrCertCtxRelease(pSignerCertCtx);
+    return rc;
+}
+
+
+RTDECL(int) RTCrPkcs7VerifySignedData(PCRTCRPKCS7CONTENTINFO pContentInfo, uint32_t fFlags,
+                                      RTCRSTORE hAdditionalCerts, RTCRSTORE hTrustedCerts,
+                                      PCRTTIMESPEC pValidationTime, PRTCRPKCS7VERIFYCERTCALLBACK pfnVerifyCert, void *pvUser,
+                                      PRTERRINFO pErrInfo)
+{
+    /*
+     * Check the input.
+     */
+    if (pfnVerifyCert)
+        AssertPtrReturn(pfnVerifyCert, VERR_INVALID_POINTER);
+    else
+        pfnVerifyCert = RTCrPkcs7VerifyCertCallbackDefault;
+
+    if (!RTCrPkcs7ContentInfo_IsSignedData(pContentInfo))
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKCS7_NOT_SIGNED_DATA, "Not PKCS #7 SignedData.");
+    PCRTCRPKCS7SIGNEDDATA pSignedData = pContentInfo->u.pSignedData;
+    int rc = RTCrPkcs7SignedData_CheckSanity(pSignedData, 0, pErrInfo, "");
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Hash the content info.
+     */
+    /* Exactly what the content is, for some stupid reason unnecessarily
+       complicated.  Figure it out here as we'll need it for the OpenSSL code
+       path as well. */
+    void const *pvContent = pSignedData->ContentInfo.Content.Asn1Core.uData.pv;
+    uint32_t    cbContent = pSignedData->ContentInfo.Content.Asn1Core.cb;
+    if (pSignedData->ContentInfo.Content.pEncapsulated)
+    {
+        pvContent = pSignedData->ContentInfo.Content.pEncapsulated->uData.pv;
+        cbContent = pSignedData->ContentInfo.Content.pEncapsulated->cb;
+    }
+
+    /* Check that there aren't too many or too few hash algorithms for our
+       implementation and purposes. */
+    RTCRDIGEST     ahDigests[2];
+    uint32_t const cDigests = pSignedData->DigestAlgorithms.cItems;
+    if (!cDigests) /** @todo we might have to support this... */
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS, "No digest algorithms");
+
+    if (cDigests > RT_ELEMENTS(ahDigests))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS,
+                             "Too many digest algorithm: cAlgorithms=%u", cDigests);
+
+    /* Create the message digest calculators. */
+    rc = VERR_CR_PKCS7_NO_DIGEST_ALGORITHMS;
+    uint32_t i;
+    for (i = 0; i < cDigests; i++)
+    {
+        rc = RTCrDigestCreateByObjId(&ahDigests[i], &pSignedData->DigestAlgorithms.paItems[i].Algorithm);
+        if (RT_FAILURE(rc))
+        {
+            rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_CREATE_ERROR, "Error creating digest for '%s': %Rrc",
+                               pSignedData->DigestAlgorithms.paItems[i].Algorithm.szObjId, rc);
+            break;
+        }
+    }
+    if (RT_SUCCESS(rc))
+    {
+        /* Hash the content. */
+        for (i = 0; i < cDigests && RT_SUCCESS(rc); i++)
+        {
+            rc = RTCrDigestUpdate(ahDigests[i], pvContent, cbContent);
+            if (RT_SUCCESS(rc))
+                rc = RTCrDigestFinal(ahDigests[i], NULL, 0);
+        }
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Validate the signed infos.
+             */
+            rc = VERR_CR_PKCS7_NO_SIGNER_INFOS;
+            for (i = 0; i < pSignedData->SignerInfos.cItems; i++)
+            {
+                rc = rtCrPkcs7VerifySignerInfo(&pSignedData->SignerInfos.paItems[i], pSignedData, ahDigests,
+                                               fFlags, hAdditionalCerts, hTrustedCerts, pValidationTime,
+                                               pfnVerifyCert, pvUser, pErrInfo);
+                if (RT_FAILURE(rc))
+                    break;
+            }
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, VERR_CR_PKCS7_DIGEST_CALC_ERROR,
+                               "Hashing content failed unexpectedly (i=%u): %Rrc", i, rc);
+
+        /* Clean up digests. */
+        i = cDigests;
+    }
+    while (i-- > 0)
+    {
+        int rc2 = RTCrDigestRelease(ahDigests[i]);
+        AssertRC(rc2);
+    }
+
+
+#ifdef IPRT_WITH_OPENSSL
+    /*
+     * Verify using OpenSSL and combine the results (should be identical).
+     */
+    int rcOssl = rtCrPkcs7VerifySignedDataUsingOpenSsl(pContentInfo, fFlags, hAdditionalCerts, hTrustedCerts,
+                                                       pvContent, cbContent, RT_SUCCESS(rc) ? pErrInfo : NULL);
+    if (RT_SUCCESS(rcOssl) && RT_SUCCESS(rc))
+        return rc;
+//    AssertMsg(RT_FAILURE_NP(rcOssl) && RT_FAILURE_NP(rc), ("%Rrc, %Rrc\n", rcOssl, rc));
+    if (RT_FAILURE(rc))
+        return rc;
+    return rcOssl;
+#else
+    return rc;
+#endif
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp
new file mode 100644
index 0000000..1897550
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.cpp
@@ -0,0 +1,139 @@
+/* $Id: pkix-signature-builtin.cpp $ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schemas, Built-in providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include <openssl/evp.h>
+#endif
+
+#include "pkix-signature-builtin.h"
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/**
+ * Array of built in message digest vtables.
+ */
+static PCRTCRPKIXSIGNATUREDESC const g_apPkixSignatureDescriptors[] =
+{
+    &g_rtCrPkixSigningHashWithRsaDesc,
+};
+
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjIdString(const char *pszObjId, void **ppvOpaque)
+{
+    if (ppvOpaque)
+        *ppvOpaque = NULL;
+
+    /*
+     * Primary OIDs.
+     */
+    uint32_t i = RT_ELEMENTS(g_apPkixSignatureDescriptors);
+    while (i-- > 0)
+        if (strcmp(g_apPkixSignatureDescriptors[i]->pszObjId, pszObjId) == 0)
+            return g_apPkixSignatureDescriptors[i];
+
+    /*
+     * Alias OIDs.
+     */
+    i = RT_ELEMENTS(g_apPkixSignatureDescriptors);
+    while (i-- > 0)
+    {
+        const char * const *ppszAliases = g_apPkixSignatureDescriptors[i]->papszObjIdAliases;
+        if (ppszAliases)
+            for (; *ppszAliases; ppszAliases++)
+                if (strcmp(*ppszAliases, pszObjId) == 0)
+                    return g_apPkixSignatureDescriptors[i];
+    }
+
+#if 0//def IPRT_WITH_OPENSSL
+    /*
+     * Try EVP and see if it knows the algorithm.
+     */
+    if (ppvOpaque)
+    {
+        rtCrOpenSslInit();
+        int iAlgoNid = OBJ_txt2nid(pszObjId);
+        if (iAlgoNid != NID_undef)
+        {
+            const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+            const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+            if (pEvpMdType)
+            {
+                /*
+                 * Return the OpenSSL provider descriptor and the EVP_MD address.
+                 */
+                Assert(pEvpMdType->md_size);
+                *ppvOpaque = (void *)pEvpMdType;
+                return &g_rtCrPkixSignatureOpenSslDesc;
+            }
+        }
+    }
+#endif
+    return NULL;
+}
+
+
+PCRTCRPKIXSIGNATUREDESC RTCrPkixSignatureFindByObjId(PCRTASN1OBJID pObjId, void **ppvOpaque)
+{
+    return RTCrPkixSignatureFindByObjIdString(pObjId->szObjId, ppvOpaque);
+}
+
+
+RTDECL(int) RTCrPkixSignatureCreateByObjIdString(PRTCRPKIXSIGNATURE phSignature, const char *pszObjId, bool fSigning,
+                                                 PCRTASN1BITSTRING pKey,PCRTASN1DYNTYPE pParams)
+{
+    void *pvOpaque;
+    PCRTCRPKIXSIGNATUREDESC pDesc = RTCrPkixSignatureFindByObjIdString(pszObjId, &pvOpaque);
+    if (pDesc)
+        return RTCrPkixSignatureCreate(phSignature, pDesc, pvOpaque, fSigning, pKey, pParams);
+    return VERR_NOT_FOUND;
+}
+
+
+RTDECL(int) RTCrPkixSignatureCreateByObjId(PRTCRPKIXSIGNATURE phSignature, PCRTASN1OBJID pObjId, bool fSigning,
+                                           PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+    void *pvOpaque;
+    PCRTCRPKIXSIGNATUREDESC pDesc = RTCrPkixSignatureFindByObjId(pObjId, &pvOpaque);
+    if (pDesc)
+        return RTCrPkixSignatureCreate(phSignature, pDesc, pvOpaque, fSigning, pKey, pParams);
+    return VERR_NOT_FOUND;
+}
+
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.h
similarity index 53%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/pkix-signature-builtin.h
index 35b6d89..c4be73b 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-builtin.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: pkix-signature-builtin.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Public Key Signature Schemas, Built-in providers.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,12 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#ifndef ___common_crypto_pkix_signature_builtin_h
+#define ___common_crypto_pkix_signature_builtin_h
 
+#include <iprt/crypto/pkix.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+extern DECLHIDDEN(RTCRPKIXSIGNATUREDESC const) g_rtCrPkixSigningHashWithRsaDesc;
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp
new file mode 100644
index 0000000..c373f1c
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-core.cpp
@@ -0,0 +1,274 @@
+/* $Id: pkix-signature-core.cpp $ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schema Algorithm, Core API.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Generic public key signature scheme instance.
+ */
+typedef struct RTCRPKIXSIGNATUREINT
+{
+    /** Magic value (RTCRPKIXSIGNATUREINT_MAGIC). */
+    uint32_t                u32Magic;
+    /** Reference counter. */
+    uint32_t volatile       cRefs;
+    /** Pointer to the message digest descriptor. */
+    PCRTCRPKIXSIGNATUREDESC pDesc;
+    /** The operation this instance is licensed for. */
+    bool                    fSigning;
+    /** State. */
+    uint32_t                uState;
+#if ARCH_BITS == 32
+    uint32_t                uPadding;
+#endif
+
+    /** Opaque data specific to the message digest algorithm, size given by
+     * RTCRPKIXSIGNATUREDESC::cbState. */
+    uint8_t                 abState[1];
+} RTCRPKIXSIGNATUREINT;
+AssertCompileMemberAlignment(RTCRPKIXSIGNATUREINT, abState, 8);
+/** Pointer to a public key algorithm instance. */
+typedef RTCRPKIXSIGNATUREINT *PRTCRPKIXSIGNATUREINT;
+
+/** Magic value for RTCRPKIXSIGNATUREINT::u32Magic (Baley Withfield Diffie). */
+#define RTCRPKIXSIGNATUREINT_MAGIC         UINT32_C(0x19440605)
+
+/** @name RTCRPKIXSIGNATUREINT::uState values.
+ * @{ */
+/** Ready to go. */
+#define RTCRPKIXSIGNATURE_STATE_READY      UINT32_C(1)
+/** Need reset. */
+#define RTCRPKIXSIGNATURE_STATE_DONE       UINT32_C(2)
+/** Busted state, can happen after re-init. */
+#define RTCRPKIXSIGNATURE_STATE_BUSTED     UINT32_C(3)
+/** @} */
+
+
+
+RTDECL(int) RTCrPkixSignatureCreate(PRTCRPKIXSIGNATURE phSignature, PCRTCRPKIXSIGNATUREDESC pDesc, void *pvOpaque,
+                                    bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+    /*
+     * Validate input.
+     */
+    AssertPtrReturn(phSignature, VERR_INVALID_POINTER);
+    AssertPtrReturn(pDesc, VERR_INVALID_POINTER);
+    AssertPtrReturn(pKey, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1BitString_IsPresent(pKey), VERR_INVALID_PARAMETER);
+    if (pParams)
+    {
+        AssertPtrReturn(pParams, VERR_INVALID_POINTER);
+        if (   pParams->enmType == RTASN1TYPE_NULL
+            || !RTASN1CORE_IS_PRESENT(&pParams->u.Core))
+            pParams = NULL;
+    }
+
+    /*
+     * Instantiate the algorithm for the given operation.
+     */
+    int rc = VINF_SUCCESS;
+    PRTCRPKIXSIGNATUREINT pThis = (PRTCRPKIXSIGNATUREINT)RTMemAllocZ(RT_OFFSETOF(RTCRPKIXSIGNATUREINT, abState[pDesc->cbState]));
+    if (pThis)
+    {
+        pThis->u32Magic     = RTCRPKIXSIGNATUREINT_MAGIC;
+        pThis->cRefs        = 1;
+        pThis->pDesc        = pDesc;
+        pThis->fSigning     = fSigning;
+        pThis->uState       = RTCRPKIXSIGNATURE_STATE_READY;
+        if (pDesc->pfnInit)
+            rc = pDesc->pfnInit(pDesc, pThis->abState, pvOpaque, fSigning, pKey, pParams);
+        if (RT_SUCCESS(rc))
+        {
+            *phSignature = pThis;
+            return VINF_SUCCESS;
+        }
+        pThis->u32Magic = 0;
+        RTMemFree(pThis);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+
+}
+
+
+RTDECL(uint32_t) RTCrPkixSignatureRetain(RTCRPKIXSIGNATURE hSignature)
+{
+    PRTCRPKIXSIGNATUREINT pThis = hSignature;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, UINT32_MAX);
+
+    uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+    Assert(cRefs < 64);
+    return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrPkixSignatureRelease(RTCRPKIXSIGNATURE hSignature)
+{
+    PRTCRPKIXSIGNATUREINT pThis = hSignature;
+    if (pThis == NIL_RTCRPKIXSIGNATURE)
+        return 0;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, UINT32_MAX);
+
+    uint32_t cRefs = ASMAtomicDecU32(&pThis->cRefs);
+    Assert(cRefs < 64);
+    if (!cRefs)
+    {
+        pThis->u32Magic = ~RTCRPKIXSIGNATUREINT_MAGIC;
+        if (pThis->pDesc->pfnDelete)
+            pThis->pDesc->pfnDelete(pThis->pDesc, pThis->abState, pThis->fSigning);
+
+        size_t cbToWipe = RT_OFFSETOF(RTCRPKIXSIGNATUREINT, abState[pThis->pDesc->cbState]);
+        RTMemWipeThoroughly(pThis, cbToWipe, 6);
+
+        RTMemFree(pThis);
+    }
+    return cRefs;
+}
+
+
+/**
+ * Resets the signature provider instance prior to a new signing or verification
+ * opartion.
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The instance to reset.
+ */
+static int rtCrPkxiSignatureReset(PRTCRPKIXSIGNATUREINT pThis)
+{
+    if (pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE)
+    {
+        if (pThis->pDesc->pfnReset)
+        {
+            int rc = pThis->pDesc->pfnReset(pThis->pDesc, pThis->abState, pThis->fSigning);
+            if (RT_FAILURE(rc))
+            {
+                pThis->uState = RTCRPKIXSIGNATURE_STATE_BUSTED;
+                return rc;
+            }
+        }
+        pThis->uState = RTCRPKIXSIGNATURE_STATE_READY;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerify(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+                                    void const *pvSignature, size_t cbSignature)
+{
+    PRTCRPKIXSIGNATUREINT pThis = hSignature;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(!pThis->fSigning, VERR_INVALID_FUNCTION);
+    AssertReturn(pThis->uState == RTCRPKIXSIGNATURE_STATE_READY || pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE, VERR_INVALID_STATE);
+
+    uint32_t cRefs = RTCrDigestRetain(hDigest);
+    AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE);
+
+    int rc = rtCrPkxiSignatureReset(pThis);
+    if (RT_SUCCESS(rc))
+    {
+        rc = pThis->pDesc->pfnVerify(pThis->pDesc, pThis->abState, hDigest, pvSignature, cbSignature);
+        pThis->uState = RTCRPKIXSIGNATURE_STATE_DONE;
+    }
+
+    RTCrDigestRelease(hDigest);
+    return rc;
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerifyBitString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1BITSTRING pSignature)
+{
+    /*
+     * Just unpack it and pass it on to the lower level API.
+     */
+    AssertPtrReturn(pSignature, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1BitString_IsPresent(pSignature), VERR_INVALID_PARAMETER);
+    uint32_t    cbData = RTASN1BITSTRING_GET_BYTE_SIZE(pSignature);
+    void const *pvData = RTASN1BITSTRING_GET_BIT0_PTR(pSignature);
+    AssertPtrReturn(pvData, VERR_INVALID_PARAMETER);
+
+    return RTCrPkixSignatureVerify(hSignature, hDigest, pvData, cbData);
+}
+
+
+RTDECL(int) RTCrPkixSignatureVerifyOctetString(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest, PCRTASN1OCTETSTRING pSignature)
+{
+    /*
+     * Just unpack it and pass it on to the lower level API.
+     */
+    AssertPtrReturn(pSignature, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1OctetString_IsPresent(pSignature), VERR_INVALID_PARAMETER);
+    uint32_t    cbData = pSignature->Asn1Core.cb;
+    void const *pvData = pSignature->Asn1Core.uData.pv;
+    AssertPtrReturn(pvData, VERR_INVALID_PARAMETER);
+
+    return RTCrPkixSignatureVerify(hSignature, hDigest, pvData, cbData);
+}
+
+
+RTDECL(int) RTCrPkixSignatureSign(RTCRPKIXSIGNATURE hSignature, RTCRDIGEST hDigest,
+                                  void *pvSignature, size_t *pcbSignature)
+{
+    PRTCRPKIXSIGNATUREINT pThis = hSignature;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRPKIXSIGNATUREINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->fSigning, VERR_INVALID_FUNCTION);
+    AssertReturn(pThis->uState == RTCRPKIXSIGNATURE_STATE_READY || pThis->uState == RTCRPKIXSIGNATURE_STATE_DONE, VERR_INVALID_STATE);
+
+    uint32_t cRefs = RTCrDigestRetain(hDigest);
+    AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE);
+
+    int rc = rtCrPkxiSignatureReset(pThis);
+    if (RT_SUCCESS(rc))
+    {
+        rc = pThis->pDesc->pfnSign(pThis->pDesc, pThis->abState, hDigest, pvSignature, pcbSignature);
+        if (rc != VERR_BUFFER_OVERFLOW)
+            pThis->uState = RTCRPKIXSIGNATURE_STATE_DONE;
+    }
+
+    RTCrDigestRelease(hDigest);
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp b/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp
new file mode 100644
index 0000000..5a74e8a
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-signature-rsa.cpp
@@ -0,0 +1,407 @@
+/* $Id: pkix-signature-rsa.cpp $ */
+/** @file
+ * IPRT - Crypto - Public Key Signature Schema Algorithm, RSA Providers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
+
+#include <iprt/bignum.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+#include <iprt/crypto/pkix.h>
+
+#include "rsa-internal.h"
+#include "pkix-signature-builtin.h"
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * RSA signature provider instance.
+ */
+typedef struct RTCRPKIXSIGNATURERSA
+{
+    /** Set if we're signing, clear if verifying.  */
+    bool                    fSigning;
+    /** The modulus.  */
+    RTBIGNUM                Modulus;
+    /** The exponent.  */
+    RTBIGNUM                Exponent;
+
+    /** Temporary big number for use when signing or verifiying. */
+    RTBIGNUM                TmpBigNum1;
+    /** Temporary big number for use when signing or verifiying. */
+    RTBIGNUM                TmpBigNum2;
+
+    /** Scratch space for decoding the key. */
+    union
+    {
+        /** Public key. */
+        RTCRRSAPUBLICKEY    PublicKey;
+        /** Private key. */
+        RTCRRSAPRIVATEKEY   PrivateKey;
+        /** Scratch area where we assemble the signature. */
+        uint8_t             abSignature[RTCRRSA_MAX_MODULUS_BITS / 8 * 2];
+    } Scratch;
+} RTCRPKIXSIGNATURERSA;
+/** Pointer to an RSA signature provider instance. */
+typedef RTCRPKIXSIGNATURERSA *PRTCRPKIXSIGNATURERSA;
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** @name Pre-encoded DigestInfo DER sequences.
+ * @{ */
+static const uint8_t g_abMd2[] =
+{/* {          {          1.2.840.113549.2.2 (MD2),                          NULL },    hash octet-string } */
+    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x02, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abMd4[] =
+{/* {          {          1.2.840.113549.2.4 (MD4),                          NULL },    hash octet-string } */
+    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x04, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abMd5[] =
+{/* {          {          1.2.840.113549.2.5 (MD5),                          NULL },    hash octet-string } */
+    0x30,0x20, 0x30,0x0c, 0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05, 0x05,0x00, 0x04,0x10
+};
+static const uint8_t g_abSha1[] =
+{/* {          {          1.3.14.3.2.26 (SHA-1),              NULL },    hash octet-string } */
+    0x30,0x21, 0x30,0x09, 0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a, 0x05,0x00, 0x04,0x14
+};
+static const uint8_t g_abSha256[] =
+{/* {          {          2.16.840.1.101.3.4.2.1 (SHA-256),                       NULL },    hash octet-string } */
+    0x30,0x31, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 0x05,0x00, 0x04,0x20
+};
+static const uint8_t g_abSha384[] =
+{/* {          {          2.16.840.1.101.3.4.2.2 (SHA-384),                       NULL },    hash octet-string } */
+    0x30,0x41, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02, 0x05,0x00, 0x04,0x30
+};
+static const uint8_t g_abSha512[] =
+{/* {          {          2.16.840.1.101.3.4.2.3 (SHA-512),                       NULL },    hash octet-string } */
+    0x30,0x51, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03, 0x05,0x00, 0x04,0x40
+};
+static const uint8_t g_abSha224[] =
+{/* {          {          2.16.840.1.101.3.4.2.4 (SHA-224),                       NULL },    hash octet-string } */
+    0x30,0x21, 0x30,0x0d, 0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04, 0x05,0x00, 0x04,0x14
+};
+/** @} */
+
+/** Lookup array for the pre-encoded DigestInfo DER sequences. */
+static struct
+{
+    RTDIGESTTYPE    enmDigest;
+    const uint8_t  *pb;
+    size_t          cb;
+} const g_aDigestInfos[] =
+{
+    { RTDIGESTTYPE_MD2,     g_abMd2,    sizeof(g_abMd2) },
+    { RTDIGESTTYPE_MD4,     g_abMd4,    sizeof(g_abMd4) },
+    { RTDIGESTTYPE_MD5,     g_abMd5,    sizeof(g_abMd5) },
+    { RTDIGESTTYPE_SHA1,    g_abSha1,   sizeof(g_abSha1) },
+    { RTDIGESTTYPE_SHA256,  g_abSha256, sizeof(g_abSha256) },
+    { RTDIGESTTYPE_SHA384,  g_abSha384, sizeof(g_abSha384) },
+    { RTDIGESTTYPE_SHA512,  g_abSha512, sizeof(g_abSha512) },
+    { RTDIGESTTYPE_SHA224,  g_abSha224, sizeof(g_abSha224) },
+};
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnInit}  */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Init(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, void *pvOpaque,
+                                                   bool fSigning, PCRTASN1BITSTRING pKey, PCRTASN1DYNTYPE pParams)
+{
+    if (pParams)
+        return VERR_CR_PKIX_SIGNATURE_TAKES_NO_PARAMETERS;
+
+    PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+    pThis->fSigning = fSigning;
+
+    /*
+     * Decode the key and pick the bits we really need from it.
+     */
+    RTASN1CURSORPRIMARY PrimaryCursor;
+    RTAsn1CursorInitPrimary(&PrimaryCursor, RTASN1BITSTRING_GET_BIT0_PTR(pKey), RTASN1BITSTRING_GET_BYTE_SIZE(pKey),
+                            NULL, &g_RTAsn1DefaultAllocator, RTASN1CURSOR_FLAGS_DER, "rsa");
+    int rc;
+    if (!fSigning)
+    {
+        rc = RTCrRsaPublicKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pThis->Scratch.PublicKey, "PublicKey");
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PublicKey.Modulus, &pThis->Modulus, 0);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PublicKey.PublicExponent, &pThis->Exponent, 0);
+                if (RT_SUCCESS(rc))
+                {
+                    RTAsn1VtDelete(&pThis->Scratch.PublicKey.SeqCore.Asn1Core);
+                    return VINF_SUCCESS;
+                }
+                RTBigNumDestroy(&pThis->Modulus);
+            }
+            RTAsn1VtDelete(&pThis->Scratch.PublicKey.SeqCore.Asn1Core);
+        }
+    }
+    else
+    {
+        rc = RTCrRsaPrivateKey_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pThis->Scratch.PrivateKey, "PrivateKey");
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PrivateKey.Modulus, &pThis->Modulus, RTBIGNUMINIT_F_SENSITIVE);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTAsn1Integer_ToBigNum(&pThis->Scratch.PrivateKey.PublicExponent, &pThis->Exponent, RTBIGNUMINIT_F_SENSITIVE);
+                if (RT_SUCCESS(rc))
+                {
+                    RTAsn1VtDelete(&pThis->Scratch.PrivateKey.SeqCore.Asn1Core);
+                    return VINF_SUCCESS;
+                }
+                RTBigNumDestroy(&pThis->Modulus);
+            }
+            RTAsn1VtDelete(&pThis->Scratch.PrivateKey.SeqCore.Asn1Core);
+        }
+    }
+    return rc;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnReset}  */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Reset(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, bool fSigning)
+{
+    PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+    Assert(pThis->fSigning == fSigning); NOREF(pThis);
+    return VINF_SUCCESS;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnDelete}  */
+static DECLCALLBACK(void) rtCrPkixSignatureRsa_Delete(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState, bool fSigning)
+{
+    PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+    Assert(pThis->fSigning == fSigning); NOREF(pThis);
+
+    RTBigNumDestroy(&pThis->Modulus);
+    RTBigNumDestroy(&pThis->Exponent);
+}
+
+
+/**
+ * Common worker for rtCrPkixSignatureRsa_Verify and
+ * rtCrPkixSignatureRsa_Sign that encodes an EMSA-PKCS1-V1_5 signature in
+ * the scratch area.
+ *
+ * This function is referred to as EMSA-PKCS1-v1_5-ENCODE(M,k) in RFC-3447 and
+ * is described in section 9.2
+ *
+ * @returns IPRT status code.
+ * @param   pThis           The RSA signature provider instance.
+ * @param   hDigest         The digest which hash to turn into a signature.
+ * @param   cbEncodedMsg    The desired encoded message length.
+ */
+static int rtCrPkixSignatureRsa_EmsaPkcs1V15Encode(PRTCRPKIXSIGNATURERSA pThis, RTCRDIGEST hDigest, size_t cbEncodedMsg)
+{
+    AssertReturn(cbEncodedMsg * 2 <= sizeof(pThis->Scratch), VERR_CR_PKIX_INTERNAL_ERROR);
+
+    /*
+     * Figure out which hash and select the associate prebaked DigestInfo.
+     */
+    RTDIGESTTYPE const  enmDigest    = RTCrDigestGetType(hDigest);
+    AssertReturn(enmDigest != RTDIGESTTYPE_INVALID && enmDigest != RTDIGESTTYPE_UNKNOWN, VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE);
+    uint8_t const      *pbDigestInfoStart = NULL;
+    size_t              cbDigestInfoStart = 0;
+    for (uint32_t i = 0; i < RT_ELEMENTS(g_aDigestInfos); i++)
+        if (g_aDigestInfos[i].enmDigest == enmDigest)
+        {
+            pbDigestInfoStart = g_aDigestInfos[i].pb;
+            cbDigestInfoStart = g_aDigestInfos[i].cb;
+            break;
+        }
+    if (!pbDigestInfoStart)
+        return VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE;
+
+    /*
+     * Get the hash size and verify that it matches what we've got in the
+     * precooked DigestInfo. ASSUMES less that 256 bytes of hash.
+     */
+    uint32_t const cbHash = RTCrDigestGetHashSize(hDigest);
+    AssertReturn(cbHash > 0 && cbHash < _16K, VERR_OUT_OF_RANGE);
+    AssertReturn(cbHash == pbDigestInfoStart[cbDigestInfoStart - 1], VERR_CR_PKIX_INTERNAL_ERROR);
+
+    if (cbDigestInfoStart + cbHash + 11 > cbEncodedMsg)
+        return VERR_CR_PKIX_HASH_TOO_LONG_FOR_KEY;
+
+    /*
+     * Encode the message the first part of the scratch area.
+     */
+    uint8_t *pbDst = &pThis->Scratch.abSignature[0];
+    pbDst[0] = 0x00;
+    pbDst[1] = 0x01;
+    size_t cbFFs = cbEncodedMsg - cbHash - cbDigestInfoStart - 3;
+    memset(&pbDst[2], 0xff, cbFFs);
+    pbDst += cbFFs + 2;
+    *pbDst++ = 0x00;
+    memcpy(pbDst, pbDigestInfoStart, cbDigestInfoStart);
+    pbDst += cbDigestInfoStart;
+    int rc = RTCrDigestFinal(hDigest, pbDst, cbHash);
+    if (RT_FAILURE(rc))
+        return rc;
+    pbDst += cbHash;
+    Assert((size_t)(pbDst - &pThis->Scratch.abSignature[0]) == cbEncodedMsg);
+    return VINF_SUCCESS;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnVerify}  */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Verify(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState,
+                                                     RTCRDIGEST hDigest, void const *pvSignature, size_t cbSignature)
+{
+    PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+    Assert(!pThis->fSigning);
+    if (cbSignature > sizeof(pThis->Scratch) / 2)
+        return VERR_CR_PKIX_SIGNATURE_TOO_LONG;
+
+    /*
+     * 8.2.2.1 - Length check.
+     */
+    if (cbSignature != RTBigNumByteWidth(&pThis->Modulus))
+        return VERR_CR_PKIX_INVALID_SIGNATURE_LENGTH;
+
+    /*
+     * 8.2.2.2 - RSA verification / Decrypt the signature.
+     */
+    /* a) s = OS2IP(S) -- Convert signature to integer. */
+    int rc = RTBigNumInit(&pThis->TmpBigNum1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
+                          pvSignature, cbSignature);
+    if (RT_FAILURE(rc))
+        return rc;
+    /* b) RSAVP1 - 5.2.2.2: Range check (0 <= s < n). */
+    if (RTBigNumCompare(&pThis->TmpBigNum1, &pThis->Modulus) < 0)
+    {
+        if (RTBigNumCompareWithU64(&pThis->TmpBigNum1, 0) >= 0)
+        {
+            /* b) RSAVP1 - 5.2.2.3: s^e mod n */
+            rc = RTBigNumInitZero(&pThis->TmpBigNum2, 0);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTBigNumModExp(&pThis->TmpBigNum2, &pThis->TmpBigNum1, &pThis->Exponent, &pThis->Modulus);
+                if (RT_SUCCESS(rc))
+                {
+                    /* c) EM' = I2OSP(m, k) -- Convert the result to bytes. */
+                    uint32_t cbDecrypted = RTBigNumByteWidth(&pThis->TmpBigNum2) + 1; /* 1 = leading zero byte */
+                    if (cbDecrypted <= sizeof(pThis->Scratch) / 2)
+                    {
+                        uint8_t *pbDecrypted = &pThis->Scratch.abSignature[sizeof(pThis->Scratch) / 2];
+                        rc = RTBigNumToBytesBigEndian(&pThis->TmpBigNum2, pbDecrypted, cbDecrypted);
+                        if (RT_SUCCESS(rc))
+                        {
+                            /*
+                             * 8.2.2.3 - Build a hopefully identical signature using hDigest.
+                             */
+                            rc = rtCrPkixSignatureRsa_EmsaPkcs1V15Encode(pThis, hDigest, cbDecrypted);
+                            if (RT_SUCCESS(rc))
+                            {
+                                /*
+                                 * 8.2.2.4 - Compare the two.
+                                 */
+                                if (memcmp(&pThis->Scratch.abSignature[0], pbDecrypted, cbDecrypted) == 0)
+                                    rc = VINF_SUCCESS;
+                                else
+                                    rc = VERR_CR_PKIX_SIGNATURE_MISMATCH;
+                            }
+                        }
+                    }
+                    else
+                        rc = VERR_CR_PKIX_SIGNATURE_TOO_LONG;
+                }
+                RTBigNumDestroy(&pThis->TmpBigNum2);
+            }
+        }
+        else
+            rc = VERR_CR_PKIX_SIGNATURE_NEGATIVE;
+    }
+    else
+        rc = VERR_CR_PKIX_SIGNATURE_GE_KEY;
+    RTBigNumDestroy(&pThis->TmpBigNum1);
+    return rc;
+}
+
+
+/** @impl_interface_method{RTCRPKIXSIGNATUREDESC,pfnSign}  */
+static DECLCALLBACK(int) rtCrPkixSignatureRsa_Sign(PCRTCRPKIXSIGNATUREDESC pDesc, void *pvState,
+                                                   RTCRDIGEST hDigest, void *pvSignature, size_t *pcbSignature)
+{
+    PRTCRPKIXSIGNATURERSA pThis = (PRTCRPKIXSIGNATURERSA)pvState;
+    Assert(pThis->fSigning); NOREF(pThis);
+    return VERR_NOT_IMPLEMENTED;
+}
+
+
+
+
+/** RSA alias ODIs. */
+static const char * const g_apszHashWithRsaAliases[] =
+{
+    RTCR_PKCS1_MD2_WITH_RSA_OID,
+    RTCR_PKCS1_MD4_WITH_RSA_OID,
+    RTCR_PKCS1_MD5_WITH_RSA_OID,
+    RTCR_PKCS1_SHA1_WITH_RSA_OID,
+    RTCR_PKCS1_SHA256_WITH_RSA_OID,
+    RTCR_PKCS1_SHA384_WITH_RSA_OID,
+    RTCR_PKCS1_SHA512_WITH_RSA_OID,
+    RTCR_PKCS1_SHA224_WITH_RSA_OID,
+    /* Note: Note quite sure about these OIW oddballs. */
+    "1.3.14.3.2.11" /* OIW rsaSignature */,
+    "1.3.14.3.2.14" /* OIW mdc2WithRSASignature */,
+    "1.3.14.3.2.15" /* OIW shaWithRSASignature */,
+    "1.3.14.3.2.24" /* OIW md2WithRSASignature */,
+    "1.3.14.3.2.25" /* OIW md5WithRSASignature */,
+    "1.3.14.3.2.29" /* OIW sha1WithRSASignature */,
+    NULL
+};
+
+
+/** RSA descriptor. */
+DECL_HIDDEN_CONST(RTCRPKIXSIGNATUREDESC const) g_rtCrPkixSigningHashWithRsaDesc =
+{
+    "RSASSA-PKCS1-v1_5",
+    RTCR_PKCS1_RSA_OID,
+    g_apszHashWithRsaAliases,
+    sizeof(RTCRPKIXSIGNATURERSA),
+    0,
+    0,
+    rtCrPkixSignatureRsa_Init,
+    rtCrPkixSignatureRsa_Reset,
+    rtCrPkixSignatureRsa_Delete,
+    rtCrPkixSignatureRsa_Verify,
+    rtCrPkixSignatureRsa_Sign,
+};
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-util.cpp b/src/VBox/Runtime/common/crypto/pkix-util.cpp
new file mode 100644
index 0000000..7dcf812
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-util.cpp
@@ -0,0 +1,92 @@
+/* $Id: pkix-util.cpp $ */
+/** @file
+ * IPRT - Crypto - Public Key Infrastructure API, Utilities.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include "openssl/evp.h"
+#endif
+
+
+
+
+RTDECL(const char *) RTCrPkixGetCiperOidFromSignatureAlgorithm(PCRTASN1OBJID pAlgorithm)
+{
+    /*
+     * This is all hardcoded, at least for the time being.
+     */
+    if (RTAsn1ObjId_StartsWith(pAlgorithm, RTCR_PKCS1_OID))
+    {
+        if (RTAsn1ObjIdCountComponents(pAlgorithm) == 7)
+            switch (RTAsn1ObjIdGetLastComponentsAsUInt32(pAlgorithm))
+            {
+                case 2:
+                case 3:
+                case 4:
+                case 5:
+                case 11:
+                case 12:
+                case 13:
+                case 14:
+                    return RTCR_PKCS1_RSA_OID;
+                case 1: AssertFailed();
+                default:
+                    return NULL;
+            }
+    }
+    /*
+     * OIW oddballs.
+     */
+    else if (RTAsn1ObjId_StartsWith(pAlgorithm, "1.3.14.3.2"))
+    {
+        if (RTAsn1ObjIdCountComponents(pAlgorithm) == 6)
+            switch (RTAsn1ObjIdGetLastComponentsAsUInt32(pAlgorithm))
+            {
+                case 11:
+                case 14:
+                case 15:
+                case 24:
+                case 25:
+                case 29:
+                    return RTCR_PKCS1_RSA_OID;
+                default:
+                    return NULL;
+            }
+    }
+
+
+    return NULL;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/pkix-verify.cpp b/src/VBox/Runtime/common/crypto/pkix-verify.cpp
new file mode 100644
index 0000000..017270e
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/pkix-verify.cpp
@@ -0,0 +1,180 @@
+/* $Id: pkix-verify.cpp $ */
+/** @file
+ * IPRT - Crypto - Public Key Infrastructure API, Verification.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/digest.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include "internal/iprt-openssl.h"
+# include "openssl/evp.h"
+#endif
+
+
+RTDECL(int) RTCrPkixPubKeyVerifySignature(PCRTASN1OBJID pAlgorithm, PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+                                          PCRTASN1BITSTRING pSignatureValue, const void *pvData, size_t cbData,
+                                          PRTERRINFO pErrInfo)
+{
+    /*
+     * Valid input.
+     */
+    AssertPtrReturn(pAlgorithm, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1ObjId_IsPresent(pAlgorithm), VERR_INVALID_POINTER);
+
+    if (pParameters)
+    {
+        AssertPtrReturn(pParameters, VERR_INVALID_POINTER);
+        if (pParameters->enmType == RTASN1TYPE_NULL)
+            pParameters = NULL;
+    }
+
+    AssertPtrReturn(pPublicKey, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1BitString_IsPresent(pPublicKey), VERR_INVALID_POINTER);
+
+    AssertPtrReturn(pSignatureValue, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1BitString_IsPresent(pSignatureValue), VERR_INVALID_POINTER);
+
+    AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+    AssertReturn(cbData > 0, VERR_INVALID_PARAMETER);
+
+    /*
+     * Parameters are not currently supported (openssl code path).
+     */
+    if (pParameters)
+        return RTErrInfoSet(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL,
+                            "Cipher algorithm parameters are not yet supported.");
+
+    /*
+     * Validate using IPRT.
+     */
+    RTCRPKIXSIGNATURE hSignature;
+    int rcIprt = RTCrPkixSignatureCreateByObjId(&hSignature, pAlgorithm, false /*fSigning*/, pPublicKey, pParameters);
+    if (RT_FAILURE(rcIprt))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN,
+                             "Unknown public key algorithm [IPRT]: %s", pAlgorithm->szObjId);
+
+    RTCRDIGEST hDigest;
+    rcIprt = RTCrDigestCreateByObjId(&hDigest, pAlgorithm);
+    if (RT_SUCCESS(rcIprt))
+    {
+        /* Calculate the digest. */
+        rcIprt = RTCrDigestUpdate(hDigest, pvData, cbData);
+        if (RT_SUCCESS(rcIprt))
+        {
+            rcIprt = RTCrPkixSignatureVerifyBitString(hSignature, hDigest, pSignatureValue);
+            if (RT_FAILURE(rcIprt))
+                RTErrInfoSet(pErrInfo, rcIprt, "RTCrPkixSignatureVerifyBitString failed");
+        }
+        else
+            RTErrInfoSet(pErrInfo, rcIprt, "RTCrDigestUpdate failed");
+        RTCrDigestRelease(hDigest);
+    }
+    else
+        RTErrInfoSetF(pErrInfo, rcIprt, "Unknown digest algorithm [IPRT]: %s", pAlgorithm->szObjId);
+    RTCrPkixSignatureRelease(hSignature);
+
+#ifdef IPRT_WITH_OPENSSL
+    /*
+     * Validate using OpenSSL EVP.
+     */
+    rtCrOpenSslInit();
+
+    /* Translate the algorithm ID into a EVP message digest type pointer. */
+    int iAlgoNid = OBJ_txt2nid(pAlgorithm->szObjId);
+    if (iAlgoNid == NID_undef)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN,
+                             "Unknown public key algorithm [OpenSSL]: %s", pAlgorithm->szObjId);
+    const char *pszAlogSn = OBJ_nid2sn(iAlgoNid);
+    const EVP_MD *pEvpMdType = EVP_get_digestbyname(pszAlogSn);
+    if (!pEvpMdType)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN_EVP,
+                             "EVP_get_digestbyname failed on %s (%s)", pszAlogSn, pAlgorithm->szObjId);
+
+    /* Initialize the EVP message digest context. */
+    EVP_MD_CTX EvpMdCtx;
+    EVP_MD_CTX_init(&EvpMdCtx);
+    if (!EVP_VerifyInit_ex(&EvpMdCtx, pEvpMdType, NULL /*engine*/))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_CIPHER_ALOG_INIT_FAILED,
+                             "EVP_VerifyInit_ex failed (algorithm type is %s / %s)", pszAlogSn, pAlgorithm->szObjId);
+
+    /* Create an EVP public key. */
+    int rcOssl;
+    EVP_PKEY *pEvpPublicKey = EVP_PKEY_new();
+    if (pEvpPublicKey)
+    {
+        pEvpPublicKey->type = EVP_PKEY_type(pEvpMdType->required_pkey_type[0]);
+        if (pEvpPublicKey->type != NID_undef)
+        {
+            const unsigned char *puchPublicKey = RTASN1BITSTRING_GET_BIT0_PTR(pPublicKey);
+            if (d2i_PublicKey(pEvpPublicKey->type, &pEvpPublicKey, &puchPublicKey, RTASN1BITSTRING_GET_BYTE_SIZE(pPublicKey)))
+            {
+                /* Digest the data. */
+                EVP_VerifyUpdate(&EvpMdCtx, pvData, cbData);
+
+                /* Verify the signature. */
+                if (EVP_VerifyFinal(&EvpMdCtx,
+                                    RTASN1BITSTRING_GET_BIT0_PTR(pSignatureValue),
+                                    RTASN1BITSTRING_GET_BYTE_SIZE(pSignatureValue),
+                                    pEvpPublicKey) > 0)
+                    rcOssl = VINF_SUCCESS;
+                else
+                    rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKIX_OSSL_VERIFY_FINAL_FAILED, "EVP_VerifyFinal failed");
+            }
+            else
+                rcOssl = RTErrInfoSet(pErrInfo, VERR_CR_PKIX_OSSL_D2I_PUBLIC_KEY_FAILED, "d2i_PublicKey failed");
+        }
+        else
+            rcOssl = RTErrInfoSetF(pErrInfo, VERR_CR_PKIX_OSSL_EVP_PKEY_TYPE_ERROR,
+                                   "EVP_PKEY_type(%d) failed", pEvpMdType->required_pkey_type[0]);
+        /* Cleanup and return.*/
+        EVP_PKEY_free(pEvpPublicKey);
+    }
+    else
+        rcOssl = RTErrInfoSetF(pErrInfo, VERR_NO_MEMORY, "EVP_PKEY_new(%d) failed", pEvpMdType->required_pkey_type[0]);
+    EVP_MD_CTX_cleanup(&EvpMdCtx);
+
+    /*
+     * Check the result.
+     */
+    if (RT_SUCCESS(rcIprt) && RT_SUCCESS(rcOssl))
+        return VINF_SUCCESS;
+    if (RT_FAILURE_NP(rcIprt) && RT_FAILURE_NP(rcOssl))
+        return rcIprt;
+    AssertMsgFailed(("rcIprt=%Rrc rcOssl=%Rrc\n", rcIprt, rcOssl));
+    if (RT_FAILURE_NP(rcOssl))
+        return rcOssl;
+#endif /* IPRT_WITH_OPENSSL */
+
+    return rcIprt;
+}
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp
index 35b6d89..c3d68b3 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/rsa-asn1-decoder.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: rsa-asn1-decoder.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - RSA, Decoder for ASN.1.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,16 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "rsa-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/rsa-core.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/rsa-core.cpp
index 35b6d89..dd0e63d 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/rsa-core.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: rsa-core.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - RSA, Core APIs.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,17 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
 
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "rsa-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/rsa-init.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/rsa-init.cpp
index 35b6d89..780d951 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/rsa-init.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: rsa-init.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - RSA, Initialization API.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,16 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "rsa-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/rsa-internal.h
similarity index 53%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/rsa-internal.h
index 35b6d89..95c3bcd 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/rsa-internal.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: rsa-internal.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - RSA, Internal Header.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,15 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#ifndef ___common_crypto_rsa_internal_h
+#define ___common_crypto_rsa_internal_h
+
+/** The max number of bits we support in the modulus. */
+#define RTCRRSA_MAX_MODULUS_BITS        16384
+
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/rsa-template.h"
+#include <iprt/asn1-generator-internal-header.h>
+
+#endif
+
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/rsa-sanity.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/rsa-sanity.cpp
index 35b6d89..b62f79f 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/rsa-sanity.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: rsa-sanity.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - RSA, Sanity Checkers.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,16 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/rsa.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "rsa-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
 
diff --git a/src/VBox/Runtime/common/crypto/rsa-template.h b/src/VBox/Runtime/common/crypto/rsa-template.h
new file mode 100644
index 0000000..e60a0de
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/rsa-template.h
@@ -0,0 +1,109 @@
+/* $Id: rsa-template.h $ */
+/** @file
+ * IPRT - Crypto - RSA, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL         RTDECL
+
+/*
+ * RSA public key.
+ */
+#define RTASN1TMPL_TYPE         RTCRRSAPUBLICKEY
+#define RTASN1TMPL_EXT_NAME     RTCrRsaPublicKey
+#define RTASN1TMPL_INT_NAME     rtCrRsaPublicKey
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Modulus,            RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              PublicExponent,     RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One RSA other prime info.
+ */
+#define RTASN1TMPL_TYPE         RTCRRSAOTHERPRIMEINFO
+#define RTASN1TMPL_EXT_NAME     RTCrRsaOtherPrimeInfo
+#define RTASN1TMPL_INT_NAME     rtCrRsaOtherPrimeInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Prime,              RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Exponent,           RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Coefficient,        RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of RSA other prime infos.
+ */
+#define RTASN1TMPL_TYPE         RTCRRSAOTHERPRIMEINFOS
+#define RTASN1TMPL_EXT_NAME     RTCrRsaOtherPrimeInfos
+#define RTASN1TMPL_INT_NAME     rtCrRsaOtherPrimeInfos
+RTASN1TMPL_SEQ_OF(RTCRRSAOTHERPRIMEINFO, RTCrRsaOtherPrimeInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * RSA private key.
+ */
+#define RTASN1TMPL_TYPE         RTCRRSAPRIVATEKEY
+#define RTASN1TMPL_EXT_NAME     RTCrRsaPrivateKey
+#define RTASN1TMPL_INT_NAME     rtCrRsaPrivateKey
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Version,            RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Modulus,            RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              PublicExponent,     RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              PrivateExponent,    RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Prime1,             RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Prime2,             RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Exponent1,          RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Exponent2,          RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Coefficient,        RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER_OPT_ITAG_EX(  OtherPrimeInfos,    RTCRRSAOTHERPRIMEINFOS,         RTCrRsaOtherPrimeInfos, ASN1_TAG_SEQUENCE, RTASN1TMPL_ITAG_F_UC,  RT_NOTHING);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * RSA Digest Info.
+ */
+#define RTASN1TMPL_TYPE         RTCRRSADIGESTINFO
+#define RTASN1TMPL_EXT_NAME     RTCrRsaDigestInfo
+#define RTASN1TMPL_INT_NAME     rtCrRsaDigestInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              DigestAlgorithm,    RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              Digest,             RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
diff --git a/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp
new file mode 100644
index 0000000..20449cf
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-asn1-decoder.cpp
@@ -0,0 +1,75 @@
+/* $Id: spc-asn1-decoder.cpp $ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+/*
+ * One SPC Serialized Object Attribute.
+ */
+
+/** Decode the content of the octet string value if known. */
+static int rtCrSpcSerializedObject_DecodeMore(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                              PRTCRSPCSERIALIZEDOBJECT pThis, const char *pszErrorTag)
+
+{
+    int rc;
+    RTASN1CURSOR SubCursor;
+    if (RTUuidCompareStr(pThis->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR) == 0)
+    {
+        rc = RTAsn1MemAllocZ(&pThis->SerializedData.EncapsulatedAllocation, (void **)&pThis->u.pData, sizeof(*pThis->u.pData));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->SerializedData.pEncapsulated = (PRTASN1CORE)pThis->u.pData;
+            pThis->enmType = RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES;
+
+            RTAsn1CursorInitSubFromCore(pCursor, &pThis->SerializedData.Asn1Core, &SubCursor, "SerializedData");
+            rc = RTCrSpcSerializedObjectAttributes_DecodeAsn1(&SubCursor, 0, pThis->u.pData, "SD");
+        }
+    }
+    else
+        return VINF_SUCCESS;
+    if (RT_SUCCESS(rc))
+        rc = RTAsn1CursorCheckEnd(&SubCursor);
+    return rc;
+}
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/spc-core.cpp b/src/VBox/Runtime/common/crypto/spc-core.cpp
new file mode 100644
index 0000000..4e58912
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-core.cpp
@@ -0,0 +1,84 @@
+/* $Id: spc-core.cpp $ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+RTDECL(int) RTCrSpcSerializedPageHashes_UpdateDerivedData(PRTCRSPCSERIALIZEDPAGEHASHES pThis)
+{
+    pThis->pData = (PCRTCRSPCPEIMAGEPAGEHASHES)pThis->RawData.Asn1Core.uData.pv;
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * SPC Indirect Data Content.
+ */
+
+RTDECL(PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE)
+RTCrSpcIndirectDataContent_GetPeImageObjAttrib(PCRTCRSPCINDIRECTDATACONTENT pThis,
+                                               RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE enmType)
+{
+    if (pThis->Data.enmType == RTCRSPCAAOVTYPE_PE_IMAGE_DATA)
+    {
+        Assert(RTAsn1ObjId_CompareWithString(&pThis->Data.Type, RTCRSPCPEIMAGEDATA_OID) == 0);
+
+        if (   pThis->Data.uValue.pPeImage
+            && pThis->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_MONIKER
+            && RTCrSpcSerializedObject_IsPresent(pThis->Data.uValue.pPeImage->T0.File.u.pMoniker) )
+        {
+            if (pThis->Data.uValue.pPeImage->T0.File.u.pMoniker->enmType == RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES)
+            {
+                Assert(RTUuidCompareStr(pThis->Data.uValue.pPeImage->T0.File.u.pMoniker->Uuid.Asn1Core.uData.pUuid,
+                                        RTCRSPCSERIALIZEDOBJECT_UUID_STR) == 0);
+                PCRTCRSPCSERIALIZEDOBJECTATTRIBUTES pData = pThis->Data.uValue.pPeImage->T0.File.u.pMoniker->u.pData;
+                if (pData)
+                    for (uint32_t i = 0; i < pData->cItems; i++)
+                        if (pData->paItems[i].enmType == enmType)
+                            return &pData->paItems[i];
+            }
+        }
+    }
+    return NULL;
+}
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-core.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/spc-init.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/spc-init.cpp
index 35b6d89..ea1e3db 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/spc-init.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: spc-init.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Initialization API.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,19 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-init.h>
+
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/spc-internal.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/spc-internal.h
index 35b6d89..fc27316 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/spc-internal.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: spc-internal.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Internal Header.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,11 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#ifndef ___common_crypto_spc_internal_h
+#define ___common_crypto_spc_internal_h
 
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/spc-template.h"
+#include <iprt/asn1-generator-internal-header.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/src/VBox/Runtime/common/crypto/spc-sanity.cpp b/src/VBox/Runtime/common/crypto/spc-sanity.cpp
new file mode 100644
index 0000000..3d838d7
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-sanity.cpp
@@ -0,0 +1,168 @@
+/* $Id: spc-sanity.cpp $ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/spc.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/uuid.h>
+
+#include "spc-internal.h"
+
+
+RTDECL(int) RTCrSpcIndirectDataContent_CheckSanityEx(PCRTCRSPCINDIRECTDATACONTENT pIndData,
+                                                     PCRTCRPKCS7SIGNEDDATA pSignedData,
+                                                     uint32_t fFlags,
+                                                     PRTERRINFO pErrInfo)
+{
+    /*
+     * Match up the digest algorithms (page 8, v1.0).
+     */
+    if (pSignedData->SignerInfos.cItems != 1)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_SIGNER_INFOS,
+                             "SpcIndirectDataContent expects SignedData to have exactly one SignerInfos entries, found: %u",
+                             pSignedData->SignerInfos.cItems);
+    if (pSignedData->DigestAlgorithms.cItems != 1)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_NOT_EXACTLY_ONE_DIGEST_ALGO,
+                             "SpcIndirectDataContent expects SignedData to have exactly one DigestAlgorithms entries, found: %u",
+                             pSignedData->DigestAlgorithms.cItems);
+
+    if (RTCrX509AlgorithmIdentifier_Compare(&pIndData->DigestInfo.DigestAlgorithm, /** @todo not entirely sure about this check... */
+                                            &pSignedData->SignerInfos.paItems[0].DigestAlgorithm) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_SIGNED_IND_DATA_DIGEST_ALGO_MISMATCH,
+                             "SpcIndirectDataContent DigestInfo and SignerInfos algorithms mismatch: %s vs %s",
+                             pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId,
+                             pSignedData->SignerInfos.paItems[0].DigestAlgorithm.Algorithm.szObjId);
+
+    if (RTCrX509AlgorithmIdentifier_Compare(&pIndData->DigestInfo.DigestAlgorithm,
+                                            &pSignedData->DigestAlgorithms.paItems[0]) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_IND_DATA_DIGEST_ALGO_NOT_IN_DIGEST_ALGOS,
+                             "SpcIndirectDataContent DigestInfo and SignedData.DigestAlgorithms[0] mismatch: %s vs %s",
+                             pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId,
+                             pSignedData->DigestAlgorithms.paItems[0].Algorithm.szObjId);
+
+    if (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH)
+    {
+        if (RTCrX509AlgorithmIdentifier_QueryDigestType(&pIndData->DigestInfo.DigestAlgorithm) == RTDIGESTTYPE_INVALID)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_UNKNOWN_DIGEST_ALGO,
+                                 "SpcIndirectDataContent DigestAlgortihm is not known: %s",
+                                 pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId);
+    }
+
+    uint32_t cbDigest = RTCrX509AlgorithmIdentifier_QueryDigestSize(&pIndData->DigestInfo.DigestAlgorithm);
+    if (   pIndData->DigestInfo.Digest.Asn1Core.cb != cbDigest
+        && (cbDigest != UINT32_MAX || (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH)))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH,
+                             "SpcIndirectDataContent Digest size mismatch with algorithm: %u, expected %u (%s)",
+                             pIndData->DigestInfo.Digest.Asn1Core.cb, cbDigest,
+                             pIndData->DigestInfo.DigestAlgorithm.Algorithm.szObjId);
+
+    /*
+     * Data.
+     */
+    if (fFlags & RTCRSPCINDIRECTDATACONTENT_SANITY_F_PE_IMAGE)
+    {
+        if (   pIndData->Data.enmType != RTCRSPCAAOVTYPE_PE_IMAGE_DATA
+            || RTAsn1ObjId_CompareWithString(&pIndData->Data.Type, RTCRSPCPEIMAGEDATA_OID) != 0)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA,
+                                 "SpcIndirectDataContent.Data.Type is %s, expected %s (SpcPeImageData) [enmType=%d]",
+                                 pIndData->Data.Type.szObjId, RTCRSPCPEIMAGEDATA_OID, pIndData->Data.enmType);
+        if (   pIndData->Data.uValue.pPeImage
+            || !RTCrSpcPeImageData_IsPresent(pIndData->Data.uValue.pPeImage) )
+            return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT,
+                                "SpcIndirectDataContent.Data.uValue/PEImage is missing");
+
+        if (   pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_MONIKER
+            && RTCrSpcSerializedObject_IsPresent(pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker) )
+        {
+            PCRTCRSPCSERIALIZEDOBJECT pObj = pIndData->Data.uValue.pPeImage->T0.File.u.pMoniker;
+
+            if (pObj->Uuid.Asn1Core.cb != sizeof(RTUUID))
+                return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_BAD_MONIKER_UUID,
+                                     "SpcIndirectDataContent...MonikerT1.Uuid incorrect size: %u, expected %u.",
+                                     pObj->Uuid.Asn1Core.cb, sizeof(RTUUID));
+            if (RTUuidCompareStr(pObj->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR) != 0)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_UNKNOWN_MONIKER_UUID,
+                                     "SpcIndirectDataContent...MonikerT1.Uuid mismatch: %RTuuid, expected %s.",
+                                     pObj->Uuid.Asn1Core.uData.pUuid, RTCRSPCSERIALIZEDOBJECT_UUID_STR);
+
+            if (pObj->enmType != RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_BAD_MONIKER_CHOICE,
+                                     "SpcIndirectDataContent...pMoniker->enmType=%d, expected %d.",
+                                     pObj->enmType, RTCRSPCSERIALIZEDOBJECTTYPE_ATTRIBUTES);
+            if (!pObj->u.pData)
+                return RTErrInfoSet(pErrInfo, VERR_CR_SPC_MONIKER_BAD_DATA,
+                                    "SpcIndirectDataContent...pMoniker->pData is NULL.");
+
+            uint32_t cPageHashTabs = 0;
+            for (uint32_t i = 0; i < pObj->u.pData->cItems; i++)
+            {
+                PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttr = &pObj->u.pData->paItems[i];
+                if (   RTAsn1ObjId_CompareWithString(&pAttr->Type, RTCRSPC_PE_IMAGE_HASHES_V1_OID) == 0
+                    || RTAsn1ObjId_CompareWithString(&pAttr->Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0 )
+                {
+                    cPageHashTabs++;
+                    AssertPtr(pAttr->u.pPageHashes->pData);
+                }
+                else
+                    return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_UNKNOWN_ATTRIBUTE,
+                                         "SpcIndirectDataContent...MonikerT1 unknown attribute %u: %s.",
+                                         i, pAttr->Type.szObjId);
+            }
+            if (cPageHashTabs > 0)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_SPC_PEIMAGE_MULTIPLE_HASH_TABS,
+                                     "SpcIndirectDataContent...MonikerT1 multiple page hash attributes (%u).", cPageHashTabs);
+
+        }
+        else if (   pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_FILE
+                 && RTCrSpcString_IsPresent(&pIndData->Data.uValue.pPeImage->T0.File.u.pT2->File) )
+        {
+            /* Could check for "<<<Obsolete>>>" here, but it's really irrelevant. */
+        }
+        else if (   pIndData->Data.uValue.pPeImage->T0.File.enmChoice == RTCRSPCLINKCHOICE_URL
+                 && RTAsn1String_IsPresent(pIndData->Data.uValue.pPeImage->T0.File.u.pUrl) )
+            return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_URL_UNEXPECTED,
+                                "SpcIndirectDataContent.Data.uValue.pPeImage->File is an URL, expected object Moniker or File.");
+        else
+            return RTErrInfoSet(pErrInfo, VERR_CR_SPC_PEIMAGE_NO_CONTENT,
+                                "SpcIndirectDataContent.Data.uValue.pPeImage->File has no content");
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the standard core code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
+
diff --git a/src/VBox/Runtime/common/crypto/spc-template.h b/src/VBox/Runtime/common/crypto/spc-template.h
new file mode 100644
index 0000000..22bed2e
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/spc-template.h
@@ -0,0 +1,186 @@
+/* $Id: spc-template.h $ */
+/** @file
+ * IPRT - Crypto - Microsoft SPC / Authenticode, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL         RTDECL
+
+
+/*
+ * One SPC Serialized Page Hashes V2 Object.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCSERIALIZEDPAGEHASHES
+#define RTASN1TMPL_EXT_NAME     RTCrSpcSerializedPageHashes
+#define RTASN1TMPL_INT_NAME     rtCrSpcSerializedPageHashes
+RTASN1TMPL_BEGIN_SETCORE();
+RTASN1TMPL_MEMBER(              RawData,               RTASN1OCTETSTRING,           RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE(         rc = RTCrSpcSerializedPageHashes_UpdateDerivedData(pThis) ) /* no ; */
+RTASN1TMPL_EXEC_CLONE(          rc = RTCrSpcSerializedPageHashes_UpdateDerivedData(pThis) ) /* no ; */
+RTASN1TMPL_END_SETCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One SPC Serialized Object Attribute.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCSERIALIZEDOBJECTATTRIBUTE
+#define RTASN1TMPL_EXT_NAME     RTCrSpcSerializedObjectAttribute
+#define RTASN1TMPL_INT_NAME     rtCrSpcSerializedObjectAttribute
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Type,               RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN(    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN(          u, pPageHashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, enmType,
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPC_PE_IMAGE_HASHES_V1_OID) == 0);
+RTASN1TMPL_MEMBER_DYN(          u, pPageHashes, RTCRSPCSERIALIZEDPAGEHASHES, RTCrSpcSerializedPageHashes, Allocation, enmType,
+    RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPC_PE_IMAGE_HASHES_V2_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT(  u, pCore, RTASN1CORE, RTAsn1Core, Allocation, enmType, RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END(      RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * Set of SPC Serialized Object Attributes.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCSERIALIZEDOBJECTATTRIBUTES
+#define RTASN1TMPL_EXT_NAME     RTCrSpcSerializedObjectAttributes
+#define RTASN1TMPL_INT_NAME     rtCrSpcSerializedObjectAttributes
+RTASN1TMPL_SET_OF(RTCRSPCSERIALIZEDOBJECTATTRIBUTE, RTCrSpcSerializedObjectAttribute);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One SPC Serialized Object.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCSERIALIZEDOBJECT
+#define RTASN1TMPL_EXT_NAME     RTCrSpcSerializedObject
+#define RTASN1TMPL_INT_NAME     rtCrSpcSerializedObject
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_EX(           Uuid,               RTASN1OCTETSTRING,              RTAsn1OctetString,
+                                RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(Uuid, RTASN1OCTETSTRING, RTAsn1OctetString, 16, 16, RT_NOTHING));
+RTASN1TMPL_MEMBER(              SerializedData,     RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE(         rc = rtCrSpcSerializedObject_DecodeMore(pCursor, fFlags, pThis, pszErrorTag) ) /* no ; */
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Choosy SPC strings.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCSTRING
+#define RTASN1TMPL_EXT_NAME     RTCrSpcString
+#define RTASN1TMPL_INT_NAME     rtCrSpcString
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG_CP(     0, RTCRSPCSTRINGCHOICE_UCS2,     u.pUcs2,   Ucs2,   RTASN1STRING, RTAsn1BmpString);
+RTASN1TMPL_PCHOICE_ITAG_CP(     1, RTCRSPCSTRINGCHOICE_ASCII,    u.pAscii,  Ascii,  RTASN1STRING, RTAsn1Ia5String);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Link.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCLINK
+#define RTASN1TMPL_EXT_NAME     RTCrSpcLink
+#define RTASN1TMPL_INT_NAME     rtCrSpcLink
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG_CP(     0, RTCRSPCLINKCHOICE_URL,     u.pUrl,     Url,      RTASN1STRING,            RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG(        1, RTCRSPCLINKCHOICE_MONIKER, u.pMoniker, Moniker,  RTCRSPCSERIALIZEDOBJECT, RTCrSpcSerializedObject);
+RTASN1TMPL_PCHOICE_XTAG(        2, RTCRSPCLINKCHOICE_FILE,    u.pT2, CtxTag2, File, RTCRSPCSTRING,           RTCrSpcString);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC PE Image Data.
+ *
+ * Note! This is not correctly declared in available specifications. The file
+ *       member is tagged.  Seeing the the '--#public--' comment in the specs,
+ *       one can't only guess that there are other alternatives in that part
+ *       of the structure that microsoft does not wish to document.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCPEIMAGEDATA
+#define RTASN1TMPL_EXT_NAME     RTCrSpcPeImageData
+#define RTASN1TMPL_INT_NAME     rtCrSpcPeImageData
+RTASN1TMPL_BEGIN_SEQCORE();
+/** @todo The flags defaults to includeResources. Could be expressed here rather
+ *        than left to the user to deal with. */
+RTASN1TMPL_MEMBER_OPT_ITAG_EX(  Flags,              RTASN1BITSTRING, RTAsn1BitString, ASN1_TAG_BIT_STRING, RTASN1TMPL_ITAG_F_UP,
+                                RTASN1TMPL_MEMBER_CONSTR_BITSTRING_MIN_MAX(Flags, 0, 3, RT_NOTHING));
+RTASN1TMPL_MEMBER_OPT_XTAG_EX(  T0, CtxTag0, File,  RTCRSPCLINK,     RTCrSpcLink, 0, \
+                                RTASN1TMPL_MEMBER_CONSTR_PRESENT(T0.File, RTCrSpcLink, RT_NOTHING));
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Attribute Type And Optional Value.
+ *
+ * Note! The value doesn't look very optional in available examples and specs.
+ *       The available specs also claim there is an explicit 0 tag around the
+ *       data, which isn't there is in signed executables.  Gotta love Microsoft...
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE
+#define RTASN1TMPL_EXT_NAME     RTCrSpcAttributeTypeAndOptionalValue
+#define RTASN1TMPL_INT_NAME     rtCrSpcAttributeTypeAndOptionalValue
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Type,               RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DYN_BEGIN(    RTCRSPCAAOVTYPE, enmType, Allocation);
+RTASN1TMPL_MEMBER_DYN(          uValue, pPeImage, RTCRSPCPEIMAGEDATA, RTCrSpcPeImageData, Allocation, enmType,
+    RTCRSPCAAOVTYPE_PE_IMAGE_DATA, RTAsn1ObjId_CompareWithString(&pThis->Type, RTCRSPCPEIMAGEDATA_OID) == 0);
+RTASN1TMPL_MEMBER_DYN_DEFAULT(  uValue, pCore,    RTASN1CORE,         RTAsn1Core, Allocation, enmType, RTCRSPCAAOVTYPE_UNKNOWN);
+RTASN1TMPL_MEMBER_DYN_END(      RTCRSPCAAOVTYPE, enmType, Allocation);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * SPC Indirect Data Content.
+ */
+#define RTASN1TMPL_TYPE         RTCRSPCINDIRECTDATACONTENT
+#define RTASN1TMPL_EXT_NAME     RTCrSpcIndirectDataContent
+#define RTASN1TMPL_INT_NAME     rtCrSpcIndirectDataContent
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Data,               RTCRSPCATTRIBUTETYPEANDOPTIONALVALUE,  RTCrSpcAttributeTypeAndOptionalValue);
+RTASN1TMPL_MEMBER(              DigestInfo,         RTCRPKCS7DIGESTINFO,                   RTCrPkcs7DigestInfo);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/store-inmem.cpp b/src/VBox/Runtime/common/crypto/store-inmem.cpp
new file mode 100644
index 0000000..59015b1
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store-inmem.cpp
@@ -0,0 +1,360 @@
+/* $Id: store-inmem.cpp $ */
+/** @file
+ * IPRT - In Memory Cryptographic Certificate Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include "store-internal.h"
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * A certificate entry in the in-memory store.
+ */
+typedef struct RTCRSTOREINMEMCERT
+{
+    /** The core certificate context. */
+    RTCRCERTCTXINT          Core;
+    /** Internal copy of the flag (paranoia). */
+    uint32_t                fFlags;
+    /** Decoded data. */
+    union
+    {
+        /** ASN.1 core structure for generic access. */
+        RTASN1CORE              Asn1Core;
+        /** The decoded X.509 certificate (RTCRCERTCTX_F_ENC_X509_DER). */
+        RTCRX509CERTIFICATE     X509Cert;
+        /** The decoded trust anchor info (RTCRCERTCTX_F_ENC_TAF_DER). */
+        RTCRTAFTRUSTANCHORINFO  TaInfo;
+    } u;
+    /** Pointer to the store if still in it (no reference). */
+    struct RTCRSTOREINMEM  *pStore;
+    /** The DER encoding of the certificate. */
+    uint8_t                 abEncoded[1];
+} RTCRSTOREINMEMCERT;
+AssertCompileMembersAtSameOffset(RTCRSTOREINMEMCERT, u.X509Cert.SeqCore.Asn1Core, RTCRSTOREINMEMCERT, u.Asn1Core);
+AssertCompileMembersAtSameOffset(RTCRSTOREINMEMCERT, u.TaInfo.SeqCore.Asn1Core,   RTCRSTOREINMEMCERT, u.Asn1Core);
+/** Pointer to an in-memory store certificate entry. */
+typedef RTCRSTOREINMEMCERT *PRTCRSTOREINMEMCERT;
+
+
+/**
+ * The per instance data of a in-memory crypto store.
+ *
+ * Currently we ASSUME we don't need serialization.  Add that when needed!
+ */
+typedef struct RTCRSTOREINMEM
+{
+    /** The number of certificates. */
+    uint32_t                cCerts;
+    /** The max number of certificates papCerts can store before growing it. */
+    uint32_t                cCertsAlloc;
+    /** Array of certificates. */
+    PRTCRSTOREINMEMCERT    *papCerts;
+} RTCRSTOREINMEM;
+/** Pointer to an in-memory crypto store. */
+typedef RTCRSTOREINMEM *PRTCRSTOREINMEM;
+
+
+
+
+static DECLCALLBACK(void) rtCrStoreInMemCertEntry_Dtor(PRTCRCERTCTXINT pCertCtx)
+{
+    PRTCRSTOREINMEMCERT pEntry = (PRTCRSTOREINMEMCERT)pCertCtx;
+    AssertRelease(!pEntry->pStore);
+
+    pEntry->Core.pfnDtor = NULL;
+    RTAsn1VtDelete(&pEntry->u.Asn1Core);
+    RTMemFree(pEntry);
+}
+
+
+/**
+ * Internal method for allocating and initalizing a certificate entry in the
+ * in-memory store.
+ *
+ * @returns IPRT status code.
+ * @param   pThis       The in-memory store instance.
+ * @param   fEnc        RTCRCERTCTX_F_ENC_X509_DER or RTCRCERTCTX_F_ENC_TAF_DER.
+ * @param   pbSrc       The DER encoded X.509 certificate to add.
+ * @param   cbSrc       The size of the encoded certificate.
+ * @param   pErrInfo    Where to return extended error info.  Optional.
+ * @param   ppEntry     Where to return the pointer to the new entry.
+ */
+static int rtCrStoreInMemCreateCertEntry(PRTCRSTOREINMEM pThis, uint32_t fEnc, uint8_t const *pbSrc, uint32_t cbSrc,
+                                         PRTERRINFO pErrInfo, PRTCRSTOREINMEMCERT *ppEntry)
+{
+    int                 rc;
+    PRTCRSTOREINMEMCERT pEntry    = (PRTCRSTOREINMEMCERT)RTMemAllocZ(RT_UOFFSETOF(RTCRSTOREINMEMCERT, abEncoded[cbSrc]));
+    if (pEntry)
+    {
+        memcpy(pEntry->abEncoded, pbSrc, cbSrc);
+        pEntry->Core.u32Magic           = RTCRCERTCTXINT_MAGIC;
+        pEntry->Core.cRefs              = 1;
+        pEntry->Core.pfnDtor            = rtCrStoreInMemCertEntry_Dtor;
+        pEntry->Core.Public.fFlags      = fEnc;
+        pEntry->Core.Public.cbEncoded   = cbSrc;
+        pEntry->Core.Public.pabEncoded  = &pEntry->abEncoded[0];
+        if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+        {
+            pEntry->Core.Public.pCert   = &pEntry->u.X509Cert;
+            pEntry->Core.Public.pTaInfo = NULL;
+        }
+        else
+        {
+            pEntry->Core.Public.pCert   = NULL;
+            pEntry->Core.Public.pTaInfo = &pEntry->u.TaInfo;
+        }
+        pEntry->pStore                  = pThis;
+
+        RTASN1CURSORPRIMARY Cursor;
+        RTAsn1CursorInitPrimary(&Cursor, &pEntry->abEncoded[0], cbSrc, pErrInfo, &g_RTAsn1DefaultAllocator,
+                                RTASN1CURSOR_FLAGS_DER, "InMem");
+        if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+            rc = RTCrX509Certificate_DecodeAsn1(&Cursor.Cursor, 0, &pEntry->u.X509Cert, "Cert");
+        else
+            rc = RTCrTafTrustAnchorInfo_DecodeAsn1(&Cursor.Cursor, 0, &pEntry->u.TaInfo, "TaInfo");
+        if (RT_SUCCESS(rc))
+        {
+            if (fEnc == RTCRCERTCTX_F_ENC_X509_DER)
+                rc = RTCrX509Certificate_CheckSanity(&pEntry->u.X509Cert, 0, pErrInfo, "Cert");
+            else
+                rc = RTCrTafTrustAnchorInfo_CheckSanity(&pEntry->u.TaInfo, 0, pErrInfo, "TaInfo");
+            if (RT_SUCCESS(rc))
+            {
+                *ppEntry = pEntry;
+                return VINF_SUCCESS;
+            }
+
+            RTAsn1VtDelete(&pEntry->u.Asn1Core);
+        }
+        RTMemFree(pEntry);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+}
+
+
+/**
+ * Grows the certificate pointer array to at least @a cMin entries.
+ *
+ * @returns IPRT status code.
+ * @param   pThis       The in-memory store instance.
+ * @param   cMin        The new minimum store size.
+ */
+static int rtCrStoreInMemGrow(PRTCRSTOREINMEM pThis, uint32_t cMin)
+{
+    AssertReturn(cMin <= _1M, VERR_OUT_OF_RANGE);
+    AssertReturn(cMin > pThis->cCertsAlloc, VERR_INTERNAL_ERROR_3);
+
+    if (cMin < 64)
+        cMin = RT_ALIGN_32(cMin, 8);
+    else
+        cMin = RT_ALIGN_32(cMin, 32);
+
+    void *pv = RTMemRealloc(pThis->papCerts, cMin * sizeof(pThis->papCerts[0]));
+    if (pv)
+    {
+        pThis->papCerts = (PRTCRSTOREINMEMCERT *)pv;
+        for (uint32_t i = pThis->cCertsAlloc; i < cMin; i++)
+            pThis->papCerts[i] = NULL;
+        pThis->cCertsAlloc = cMin;
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnDestroyStore} */
+static DECLCALLBACK(void) rtCrStoreInMem_DestroyStore(void *pvProvider)
+{
+    PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+
+    while (pThis->cCerts > 0)
+    {
+        uint32_t i = --pThis->cCerts;
+        PRTCRSTOREINMEMCERT pEntry = pThis->papCerts[i];
+        pThis->papCerts[i] = NULL;
+        AssertPtr(pEntry);
+
+        pEntry->pStore = NULL;
+        RTCrCertCtxRelease(&pEntry->Core.Public);
+    }
+
+    RTMemFree(pThis->papCerts);
+    pThis->papCerts = NULL;
+    RTMemFree(pThis);
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertCtxQueryPrivateKey} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertCtxQueryPrivateKey(void *pvProvider, PRTCRCERTCTXINT pCertCtx,
+                                                               uint8_t *pbKey, size_t cbKey, size_t *pcbKeyRet)
+{
+    //PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+    return VERR_NOT_FOUND;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertFindAll} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertFindAll(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+    pSearch->auOpaque[0] = ~(uintptr_t)pvProvider;
+    pSearch->auOpaque[1] = 0;
+    pSearch->auOpaque[2] = ~(uintptr_t)0;  /* For the front-end API. */
+    pSearch->auOpaque[3] = ~(uintptr_t)0;  /* For the front-end API. */
+    return VINF_SUCCESS;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchNext} */
+static DECLCALLBACK(PCRTCRCERTCTX) rtCrStoreInMem_CertSearchNext(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+    AssertReturn(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider, NULL);
+
+    uintptr_t i = pSearch->auOpaque[1];
+    if (i < pThis->cCerts)
+    {
+        pSearch->auOpaque[1] = i + 1;
+        pThis->papCerts[i]->Core.cRefs++;
+        return &pThis->papCerts[i]->Core.Public;
+    }
+    return NULL;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchDestroy} */
+static DECLCALLBACK(void) rtCrStoreInMem_CertSearchDestroy(void *pvProvider, PRTCRSTORECERTSEARCH pSearch)
+{
+    NOREF(pvProvider);
+    AssertReturnVoid(pSearch->auOpaque[0] == ~(uintptr_t)pvProvider);
+    pSearch->auOpaque[0] = 0;
+    pSearch->auOpaque[1] = 0;
+    pSearch->auOpaque[2] = 0;
+    pSearch->auOpaque[3] = 0;
+}
+
+
+/** @interface_method_impl{RTCRSTOREPROVIDER, pfnCertSearchDestroy} */
+static DECLCALLBACK(int) rtCrStoreInMem_CertAddEncoded(void *pvProvider, uint32_t fFlags,
+                                                       uint8_t const *pbEncoded, uint32_t cbEncoded, PRTERRINFO pErrInfo)
+{
+    PRTCRSTOREINMEM pThis = (PRTCRSTOREINMEM)pvProvider;
+    int rc;
+
+    AssertMsgReturn(   fFlags == RTCRCERTCTX_F_ENC_X509_DER
+                    || fFlags == RTCRCERTCTX_F_ENC_TAF_DER
+                    , ("Only X.509 and TAF DER are supported: %#x\n", fFlags), VERR_INVALID_FLAGS);
+
+    if (pThis->cCerts + 1 > pThis->cCertsAlloc)
+    {
+        rc = rtCrStoreInMemGrow(pThis, pThis->cCerts + 1);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    rc = rtCrStoreInMemCreateCertEntry(pThis, fFlags, pbEncoded, cbEncoded, pErrInfo, &pThis->papCerts[pThis->cCerts]);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->cCerts++;
+        return VINF_SUCCESS;
+    }
+    return rc;
+}
+
+
+/**
+ * In-memory store provider.
+ */
+static RTCRSTOREPROVIDER const g_rtCrStoreInMemProvider =
+{
+    "in-memory",
+    rtCrStoreInMem_DestroyStore,
+    rtCrStoreInMem_CertCtxQueryPrivateKey,
+    rtCrStoreInMem_CertFindAll,
+    rtCrStoreInMem_CertSearchNext,
+    rtCrStoreInMem_CertSearchDestroy,
+    rtCrStoreInMem_CertAddEncoded,
+    NULL,
+    42
+};
+
+
+/**
+ * Common worker for RTCrStoreCreateInMem and future constructors...
+ *
+ * @returns IPRT status code.
+ * @param   ppStore         Where to return the store instance.
+ */
+static int rtCrStoreInMemCreateInternal(PRTCRSTOREINMEM *ppStore)
+{
+    PRTCRSTOREINMEM pStore = (PRTCRSTOREINMEM)RTMemAlloc(sizeof(*pStore));
+    if (pStore)
+    {
+        pStore->cCerts      = 0;
+        pStore->cCertsAlloc = 0;
+        pStore->papCerts    = NULL;
+        *ppStore = pStore;
+        return VINF_SUCCESS;
+    }
+    *ppStore = NULL; /* shut up gcc-maybe-pita warning. */
+    return VERR_NO_MEMORY;
+}
+
+
+RTDECL(int) RTCrStoreCreateInMem(PRTCRSTORE phStore, uint32_t cSizeHint)
+{
+    PRTCRSTOREINMEM pStore;
+    int rc = rtCrStoreInMemCreateInternal(&pStore);
+    if (RT_SUCCESS(rc))
+    {
+        if (cSizeHint)
+            rc = rtCrStoreInMemGrow(pStore, RT_MIN(cSizeHint, 512));
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtCrStoreCreate(&g_rtCrStoreInMemProvider, pStore, phStore);
+            if (RT_SUCCESS(rc))
+                return VINF_SUCCESS;
+        }
+        RTMemFree(pStore);
+    }
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/crypto/store-internal.h b/src/VBox/Runtime/common/crypto/store-internal.h
new file mode 100644
index 0000000..d0e35f3
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store-internal.h
@@ -0,0 +1,161 @@
+/* $Id: store-internal.h $ */
+/** @file
+ * IPRT - Cryptographic Store, Internal Header.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+#ifndef ___common_crypto_store_internal_h
+#define ___common_crypto_store_internal_h
+
+
+/**
+ * Internal certificate context.
+ *
+ * In addition to the externally visible structure (RTCRCERTCTX) this has the
+ * reference counter and store reference.  (This structure may again be part of
+ * a larger structure internal to the store, depending on the source store.)
+ */
+typedef struct RTCRCERTCTXINT
+{
+    /** Magic number (RTCRCERTCTXINT_MAGIC). */
+    uint32_t                u32Magic;
+    /** Reference counter. */
+    uint32_t volatile       cRefs;
+    /**
+     * Destructor that gets called with cRefs reaches zero.
+     * @param   pCertCtx        The internal certificate context.
+     */
+    DECLCALLBACKMEMBER(void, pfnDtor)(struct RTCRCERTCTXINT *pCertCtx);
+    /** The public store context. */
+    RTCRCERTCTX             Public;
+} RTCRCERTCTXINT;
+/** Pointer to an internal certificate context. */
+typedef RTCRCERTCTXINT *PRTCRCERTCTXINT;
+
+/** Magic value for RTCRCERTCTXINT::u32Magic (Alan Mathison Turing).  */
+#define RTCRCERTCTXINT_MAGIC       UINT32_C(0x19120623)
+/** Dead magic value for RTCRCERTCTXINT::u32Magic. */
+#define RTCRCERTCTXINT_MAGIC_DEAD  UINT32_C(0x19540607)
+
+
+/**
+ * IPRT Cryptographic Store Provider.
+ *
+ * @remarks This is a very incomplete sketch.
+ */
+typedef struct RTCRSTOREPROVIDER
+{
+    /** The provider name.  */
+    const char *pszName;
+
+    /**
+     * Called to destroy an open store.
+     *
+     * @param   pvProvider      The provider specific data.
+     */
+    DECLCALLBACKMEMBER(void, pfnDestroyStore)(void *pvProvider);
+
+    /**
+     * Queries the private key.
+     *
+     * @returns IPRT status code.
+     * @retval  VERR_NOT_FOUND if not private key.
+     * @retval  VERR_ACCESS_DENIED if the private key isn't allowed to leave the
+     *          store.  One would then have to use the pfnCertCtxSign method.
+     *
+     * @param   pvProvider      The provider specific data.
+     * @param   pCertCtx        The internal certificate context.
+     * @param   pbKey           Where to return the key bytes.
+     * @param   cbKey           The size of the buffer @a pbKey points to.
+     * @param   pcbKeyRet       Where to return the size of the returned key.
+     */
+    DECLCALLBACKMEMBER(int, pfnCertCtxQueryPrivateKey)(void *pvProvider, PRTCRCERTCTXINT pCertCtx,
+                                                       uint8_t *pbKey, size_t cbKey, size_t *pcbKeyRet);
+
+    /**
+     * Open an enumeration of all certificates.
+     *
+     * @returns IPRT status code
+     * @param   pvProvider      The provider specific data.
+     * @param   pSearch         Pointer to opaque search state structure.  The
+     *                          provider should initalize this on success.
+     */
+    DECLCALLBACKMEMBER(int, pfnCertFindAll)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+    /**
+     * Get the next certificate.
+     *
+     * @returns Reference to the next certificate context (must be released by
+     *          caller).  NULL if no more certificates in the search result.
+     * @param   pvProvider      The provider specific data.
+     * @param   pSearch         Pointer to opaque search state structure.
+     */
+    DECLCALLBACKMEMBER(PCRTCRCERTCTX, pfnCertSearchNext)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+    /**
+     * Closes a certficate search state.
+     *
+     * @param   pvProvider      The provider specific data.
+     * @param   pSearch         Pointer to opaque search state structure to destroy.
+     */
+    DECLCALLBACKMEMBER(void, pfnCertSearchDestroy)(void *pvProvider, PRTCRSTORECERTSEARCH pSearch);
+
+    /**
+     * Adds a certificate to the store.
+     *
+     * @param   pvProvider      The provider specific data.
+     * @param   fFlags          RTCRCERTCTX_F_XXX.
+     * @param   pbEncoded       The encoded certificate bytes.
+     * @param   cbEncoded       The size of the encoded certificate.
+     * @param   pErrInfo        Where to store extended error info. Optional.
+     */
+    DECLCALLBACKMEMBER(int, pfnCertAddEncoded)(void *pvProvider, uint32_t fFlags, uint8_t const *pbEncoded, uint32_t cbEncoded,
+                                               PRTERRINFO pErrInfo);
+
+
+    /* Optional: */
+
+    /**
+     * Find all certficates matching a given issuer and serial number.
+     *
+     * (Usually only one result.)
+     *
+     * @returns IPRT status code
+     * @param   pvProvider      The provider specific data.
+     * @param   phSearch        Pointer to a provider specific search handle.
+     */
+    DECLCALLBACKMEMBER(int, pfnCertFindByIssuerAndSerialNo)(void *pvProvider, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo,
+                                                            PRTCRSTORECERTSEARCH phSearch);
+    /** Non-zero end marker. */
+    uintptr_t               uEndMarker;
+} RTCRSTOREPROVIDER;
+
+/** Pointer to a store provider call table. */
+typedef RTCRSTOREPROVIDER const *PCRTCRSTOREPROVIDER;
+
+
+DECLHIDDEN(int) rtCrStoreCreate(PCRTCRSTOREPROVIDER pProvider, void *pvProvider, PRTCRSTORE phStore);
+
+#endif
+
diff --git a/src/VBox/Runtime/common/crypto/store.cpp b/src/VBox/Runtime/common/crypto/store.cpp
new file mode 100644
index 0000000..b4e1edb
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/store.cpp
@@ -0,0 +1,440 @@
+/* $Id: store.cpp $ */
+/** @file
+ * IPRT - Cryptographic (Certificate) Store.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/store.h>
+
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+#include <iprt/crypto/x509.h>
+
+#ifdef IPRT_WITH_OPENSSL
+# include <openssl/x509.h>
+#endif
+
+#include "store-internal.h"
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Internal representation of a (certificate,++) store.
+ */
+typedef struct RTCRSTOREINT
+{
+    /** Magic number (RTCRSTOREINT_MAGIC). */
+    uint32_t                    u32Magic;
+    /** Reference counter. */
+    uint32_t volatile           cRefs;
+    /** Pointer to the store provider. */
+    PCRTCRSTOREPROVIDER         pProvider;
+    /** Provider specific data. */
+    void                       *pvProvider;
+} RTCRSTOREINT;
+/** Pointer to the internal representation of a store. */
+typedef RTCRSTOREINT *PRTCRSTOREINT;
+
+/** Magic value for RTCRSTOREINT::u32Magic (Alfred Dillwyn "Dilly" Knox). */
+#define RTCRSTOREINT_MAGIC          UINT32_C(0x18840723)
+/** Dead magic value for RTCRSTOREINT::u32Magic. */
+#define RTCRSTOREINT_MAGIC_DEAD     UINT32_C(0x19430227)
+
+
+
+/**
+ * Internal method a store provider uses to create a store handle.
+ *
+ * @returns IPRT status code
+ * @param   pProvider       Pointer to the store provider callback table.
+ * @param   pvProvider      Pointer to the provider specific instance data.
+ * @param   phStore         Where to return the store handle.
+ */
+DECLHIDDEN(int) rtCrStoreCreate(PCRTCRSTOREPROVIDER pProvider, void *pvProvider, PRTCRSTORE phStore)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)RTMemAlloc(sizeof(*pThis));
+    if (pThis)
+    {
+        pThis->pvProvider   = pvProvider;
+        pThis->pProvider    = pProvider;
+        pThis->cRefs        = 1;
+        pThis->u32Magic     = RTCRSTOREINT_MAGIC;
+        *phStore = pThis;
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+
+RTDECL(uint32_t) RTCrStoreRetain(RTCRSTORE hStore)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, UINT32_MAX);
+
+    uint32_t cRet = ASMAtomicIncU32(&pThis->cRefs);
+    Assert(cRet < 8192);
+    return cRet;
+}
+
+
+RTDECL(uint32_t) RTCrStoreRelease(RTCRSTORE hStore)
+{
+    if (hStore == NIL_RTCRSTORE)
+        return 0;
+
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, UINT32_MAX);
+
+    uint32_t cStore = ASMAtomicDecU32(&pThis->cRefs);
+    if (!cStore)
+    {
+        ASMAtomicWriteU32(&pThis->u32Magic, RTCRSTOREINT_MAGIC_DEAD);
+        pThis->pProvider->pfnDestroyStore(pThis->pvProvider);
+        RTMemFree(pThis);
+    }
+    return cStore;
+}
+
+
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertByIssuerAndSerialNo(RTCRSTORE hStore, PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNo)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, NULL);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, NULL);
+    AssertPtrReturn(pIssuer, NULL);
+
+    int rc;
+    RTCRSTORECERTSEARCH Search;
+    if (pThis->pProvider->pfnCertFindByIssuerAndSerialNo)
+        rc = pThis->pProvider->pfnCertFindByIssuerAndSerialNo(pThis->pvProvider, pIssuer, pSerialNo, &Search);
+    else
+        rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+
+    PCRTCRCERTCTX pCertCtx = NULL;
+    if (RT_SUCCESS(rc))
+    {
+        for (;;)
+        {
+            pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+            if (!pCertCtx)
+                break;
+
+            if (   pCertCtx->pCert
+                && RTCrX509Certificate_MatchIssuerAndSerialNumber(pCertCtx->pCert, pIssuer, pSerialNo))
+                break;
+            RTCrCertCtxRelease(pCertCtx);
+        }
+
+        pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+    }
+    else
+        AssertMsg(rc == VERR_NOT_FOUND, ("%Rrc\n", rc));
+    return pCertCtx;
+}
+
+
+RTDECL(int) RTCrStoreCertAddEncoded(RTCRSTORE hStore, uint32_t fFlags, void const *pvSrc, size_t cbSrc, PRTERRINFO pErrInfo)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pvSrc, VERR_INVALID_POINTER);
+    AssertReturn(cbSrc > 16 && cbSrc < _1M, VERR_OUT_OF_RANGE);
+    AssertMsgReturn(   fFlags == RTCRCERTCTX_F_ENC_X509_DER
+                    || fFlags == RTCRCERTCTX_F_ENC_TAF_DER
+                    , ("Only X.509 and TAF DER supported: %#x\n", fFlags), VERR_INVALID_FLAGS);
+
+    int rc;
+    if (pThis->pProvider->pfnCertAddEncoded)
+        rc = pThis->pProvider->pfnCertAddEncoded(pThis->pvProvider, fFlags, (uint8_t const *)pvSrc, (uint32_t)cbSrc, pErrInfo);
+    else
+        rc = VERR_WRITE_PROTECT;
+
+    return rc;
+}
+
+
+
+/*
+ * Searching.
+ * Searching.
+ * Searching.
+ */
+
+RTDECL(int) RTCrStoreCertFindAll(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+
+    return pThis->pProvider->pfnCertFindAll(pThis->pvProvider, pSearch);
+}
+
+
+/** Indicator for RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280 searches
+ *  implemented by this front-end code. */
+#define RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280     UINT32_C(0x5be9145d)
+
+RTDECL(int) RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(RTCRSTORE hStore, PCRTCRX509NAME pSubject,
+                                                            PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+
+    int rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, pSearch);
+    if (RT_SUCCESS(rc))
+    {
+        pSearch->auOpaque[2] = RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280;
+        pSearch->auOpaque[3] = (uintptr_t)pSubject;
+    }
+    return rc;
+}
+
+
+RTDECL(PCRTCRCERTCTX) RTCrStoreCertSearchNext(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, NULL);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, NULL);
+    AssertPtrReturn(pSearch, NULL);
+
+    PCRTCRCERTCTX pRet;
+    switch (pSearch->auOpaque[2])
+    {
+        default:
+            pRet = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, pSearch);
+            break;
+
+        case RTCRSTORECERTSEARCH_BY_SUBECT_OR_ALT_SUBJECT_BY_RFC5280:
+        {
+            PCRTCRX509NAME pSubject = (PCRTCRX509NAME)pSearch->auOpaque[3];
+            AssertPtrReturn(pSubject, NULL);
+
+            for (;;)
+            {
+                pRet = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, pSearch);
+                if (!pRet)
+                    break;
+                if (pRet->pCert)
+                {
+                    if (RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(pRet->pCert, pSubject))
+                        break;
+                }
+                else if (pRet->pTaInfo)
+                {
+                    if (   RTCrTafCertPathControls_IsPresent(&pRet->pTaInfo->CertPath)
+                        && RTCrX509Name_MatchByRfc5280(&pRet->pTaInfo->CertPath.TaName, pSubject))
+                        break;
+                }
+                RTCrCertCtxRelease(pRet);
+            }
+            break;
+        }
+    }
+    return pRet;
+}
+
+
+RTDECL(int) RTCrStoreCertSearchDestroy(RTCRSTORE hStore, PRTCRSTORECERTSEARCH pSearch)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+    if (pSearch)
+    {
+        AssertPtrReturn(pSearch, VERR_INVALID_POINTER);
+        pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, pSearch);
+    }
+    return VINF_SUCCESS;
+}
+
+
+
+#ifdef IPRT_WITH_OPENSSL
+/*
+ * OpenSSL helper.
+ * OpenSSL helper.
+ * OpenSSL helper.
+ */
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStore(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStore)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+
+    /*
+     * Use the pfnCertFindAll method to add all certificates to the store we're returning.
+     */
+    int rc;
+    X509_STORE *pOsslStore = X509_STORE_new();
+    if (pOsslStore)
+    {
+        RTCRSTORECERTSEARCH Search;
+        rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+        if (RT_SUCCESS(rc))
+        {
+            do
+            {
+                PCRTCRCERTCTX pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+                if (!pCertCtx)
+                    break;
+
+                if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER)
+                {
+                    X509 *pOsslCert = NULL;
+                    const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded;
+                    if (d2i_X509(&pOsslCert, &pabEncoded, pCertCtx->cbEncoded) == pOsslCert)
+                    {
+                        if (!X509_STORE_add_cert(pOsslStore, pOsslCert))
+                            rc = VERR_NO_MEMORY;
+                        X509_free(pOsslCert);
+                    }
+                }
+
+                RTCrCertCtxRelease(pCertCtx);
+            } while (RT_SUCCESS(rc));
+
+            pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+            if (RT_SUCCESS(rc))
+            {
+                *ppvOpenSslStore = pOsslStore;
+                return VINF_SUCCESS;
+            }
+        }
+        X509_STORE_free(pOsslStore);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+}
+
+
+RTDECL(int) RTCrStoreConvertToOpenSslCertStack(RTCRSTORE hStore, uint32_t fFlags, void **ppvOpenSslStack)
+{
+    PRTCRSTOREINT pThis = (PRTCRSTOREINT)hStore;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRSTOREINT_MAGIC, VERR_INVALID_HANDLE);
+
+    /*
+     * Use the pfnCertFindAll method to add all certificates to the store we're returning.
+     */
+    int rc;
+    STACK_OF(X509) *pOsslStack = sk_X509_new_null();
+    if (pOsslStack)
+    {
+        RTCRSTORECERTSEARCH Search;
+        rc = pThis->pProvider->pfnCertFindAll(pThis->pvProvider, &Search);
+        if (RT_SUCCESS(rc))
+        {
+            do
+            {
+                PCRTCRCERTCTX pCertCtx = pThis->pProvider->pfnCertSearchNext(pThis->pvProvider, &Search);
+                if (!pCertCtx)
+                    break;
+
+                if (pCertCtx->fFlags & RTCRCERTCTX_F_ENC_X509_DER)
+                {
+                    X509 *pOsslCert = NULL;
+                    const unsigned char *pabEncoded = (const unsigned char *)pCertCtx->pabEncoded;
+                    if (d2i_X509(&pOsslCert, &pabEncoded, pCertCtx->cbEncoded) == pOsslCert)
+                    {
+                        if (!sk_X509_push(pOsslStack, pOsslCert))
+                        {
+                            rc = VERR_NO_MEMORY;
+                            X509_free(pOsslCert);
+                        }
+                    }
+                }
+
+                RTCrCertCtxRelease(pCertCtx);
+            } while (RT_SUCCESS(rc));
+
+            pThis->pProvider->pfnCertSearchDestroy(pThis->pvProvider, &Search);
+            if (RT_SUCCESS(rc))
+            {
+                *ppvOpenSslStack = pOsslStack;
+                return VINF_SUCCESS;
+            }
+        }
+        sk_X509_pop_free(pOsslStack, X509_free);
+    }
+    else
+        rc = VERR_NO_MEMORY;
+    return rc;
+}
+
+#endif /* IPRT_WITH_OPENSSL */
+
+
+/*
+ * Certificate context.
+ * Certificate context.
+ * Certificate context.
+ */
+
+
+RTDECL(uint32_t) RTCrCertCtxRetain(PCRTCRCERTCTX pCertCtx)
+{
+    AssertPtrReturn(pCertCtx, UINT32_MAX);
+    PRTCRCERTCTXINT pThis = RT_FROM_MEMBER(pCertCtx, RTCRCERTCTXINT, Public);
+    AssertReturn(pThis->u32Magic == RTCRCERTCTXINT_MAGIC, UINT32_MAX);
+    uint32_t cRet = ASMAtomicIncU32(&pThis->cRefs);
+    Assert(cRet < 64);
+    return cRet;
+}
+
+
+RTDECL(uint32_t) RTCrCertCtxRelease(PCRTCRCERTCTX pCertCtx)
+{
+    if (!pCertCtx)
+        return 0;
+
+    AssertPtrReturn(pCertCtx, UINT32_MAX);
+    PRTCRCERTCTXINT pThis = RT_FROM_MEMBER(pCertCtx, RTCRCERTCTXINT, Public);
+    AssertReturn(pThis->u32Magic == RTCRCERTCTXINT_MAGIC, UINT32_MAX);
+    uint32_t cRet = ASMAtomicDecU32(&pThis->cRefs);
+    if (!cRet)
+    {
+        ASMAtomicWriteU32(&pThis->u32Magic, RTCRCERTCTXINT_MAGIC_DEAD);
+        pThis->pfnDtor(pThis);
+    }
+    return cRet;
+}
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp
index 35b6d89..d4c1dc5 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/taf-asn1-decoder.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: taf-asn1-decoder.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Decoder for ASN.1.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,17 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
 
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "taf-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/taf-core.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/taf-core.cpp
index 35b6d89..ea1e192 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/taf-core.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: taf-core.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Core API.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,14 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
 
+#include "taf-internal.h"
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/taf-init.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/taf-init.cpp
index 35b6d89..c45969c 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/taf-init.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: taf-init.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Initialization API.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,17 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
 
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/crypto/x509.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "taf-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/taf-internal.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/taf-internal.h
index 35b6d89..082002a 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/taf-internal.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: taf-internal.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - TAF, Internal Header.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,11 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#ifndef ___common_crypto_taf_internal_h
+#define ___common_crypto_taf_internal_h
 
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/taf-template.h"
+#include <iprt/asn1-generator-internal-header.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/taf-sanity.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/taf-sanity.cpp
index 35b6d89..691da41 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/taf-sanity.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: taf-sanity.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Sanity Checkers.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,15 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include "internal/iprt.h"
+#include <iprt/crypto/taf.h>
 
+#include <iprt/err.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+#include "taf-internal.h"
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
 
diff --git a/src/VBox/Runtime/common/crypto/taf-template.h b/src/VBox/Runtime/common/crypto/taf-template.h
new file mode 100644
index 0000000..9067a4b
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/taf-template.h
@@ -0,0 +1,94 @@
+/* $Id: taf-template.h $ */
+/** @file
+ * IPRT - Crypto - Trust Anchor Format (RFC-5914), Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL         RTDECL
+
+/*
+ * CertPathControls (not sequence-/set-of).
+ */
+#define RTASN1TMPL_TYPE         RTCRTAFCERTPATHCONTROLS
+#define RTASN1TMPL_EXT_NAME     RTCrTafCertPathControls
+#define RTASN1TMPL_INT_NAME     rtCrTafCertPathControls
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              TaName,             RTCRX509NAME,                   RTCrX509Name);
+RTASN1TMPL_MEMBER_OPT_ITAG(     Certificate,        RTCRX509CERTIFICATE,            RTCrX509Certificate,            0);
+RTASN1TMPL_MEMBER_OPT_ITAG(     PolicySet,          RTCRX509CERTIFICATEPOLICIES,    RTCrX509CertificatePolicies,    1);
+RTASN1TMPL_MEMBER_OPT_ITAG_BITSTRING(PolicyFlags,    3 /* max bits */,                                              2);
+RTASN1TMPL_MEMBER_OPT_ITAG(     NameConstr,         RTCRX509NAMECONSTRAINTS,        RTCrX509NameConstraints,        3);
+RTASN1TMPL_MEMBER_OPT_ITAG_EX(  PathLenConstraint,  RTASN1INTEGER,                  RTAsn1Integer,                  4, RTASN1TMPL_ITAG_F_CP, RT_NOTHING);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRTAFTRUSTANCHORINFO
+#define RTASN1TMPL_EXT_NAME     RTCrTafTrustAnchorInfo
+#define RTASN1TMPL_INT_NAME     rtCrTafTrustAnchorInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_DEF_ITAG_UP(  Version,            RTASN1INTEGER,                  RTAsn1Integer, ASN1_TAG_INTEGER, RTCRTAFTRUSTANCHORINFO_V1);
+RTASN1TMPL_MEMBER(              PubKey,             RTCRX509SUBJECTPUBLICKEYINFO,   RTCrX509SubjectPublicKeyInfo);
+RTASN1TMPL_MEMBER(              KeyIdentifier,      RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(TaTitle,       RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(TaTitleLangTag, RTASN1STRING, RTAsn1String, 1, 64, RT_NOTHING));
+RTASN1TMPL_MEMBER_OPT_ITAG_EX(  CertPath,           RTCRTAFCERTPATHCONTROLS,        RTCrTafCertPathControls, ASN1_TAG_SEQUENCE, RTASN1TMPL_ITAG_F_UC, RT_NOTHING);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T1, CtxTag1, Exts,  RTCRX509EXTENSIONS,             RTCrX509Extensions, 1);
+RTASN1TMPL_MEMBER_OPT_UTF8_STRING_EX(TaTitleLangTag, RTASN1TMPL_MEMBER_CONSTR_MIN_MAX(TaTitleLangTag, RTASN1STRING, RTAsn1String, 2, 4, RT_NOTHING));
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorChoice.
+ */
+#define RTASN1TMPL_TYPE         RTCRTAFTRUSTANCHORCHOICE
+#define RTASN1TMPL_EXT_NAME     RTCrTafTrustAnchorChoice
+#define RTASN1TMPL_INT_NAME     rtCrTafTrustAnchorChoice
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_ITAG(ASN1_TAG_SEQUENCE, RTCRTAFTRUSTANCHORCHOICEVAL_CERTIFICATE,         u.pCertificate, Certificate, RTCRX509CERTIFICATE, RTCrX509Certificate);
+RTASN1TMPL_PCHOICE_XTAG(1,                 RTCRTAFTRUSTANCHORCHOICEVAL_TBS_CERTIFICATE,     u.pT1, CtxTag1, TbsCert,  RTCRX509TBSCERTIFICATE, RTCrX509TbsCertificate);
+RTASN1TMPL_PCHOICE_XTAG(2,                 RTCRTAFTRUSTANCHORCHOICEVAL_TRUST_ANCHOR_INFO,   u.pT2, CtxTag2, TaInfo,   RTCRTAFTRUSTANCHORINFO, RTCrTafTrustAnchorInfo);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * TrustAnchorList
+ */
+#define RTASN1TMPL_TYPE         RTCRTAFTRUSTANCHORLIST
+#define RTASN1TMPL_EXT_NAME     RTCrTafTrustAnchorList
+#define RTASN1TMPL_INT_NAME     rtCrTafTrustAnchorList
+RTASN1TMPL_SEQ_OF(RTCRTAFTRUSTANCHORCHOICE, RTCrTafTrustAnchorChoice);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp b/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp
new file mode 100644
index 0000000..c1c207e
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-asn1-decoder.cpp
@@ -0,0 +1,217 @@
+/* $Id: x509-asn1-decoder.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, Decoder for ASN.1.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "x509-internal.h"
+
+
+/*
+ * One X.509 Extension.
+ */
+RTDECL(int) RTCrX509Extension_ExtnValue_DecodeAsn1(PRTASN1CURSOR pCursor, uint32_t fFlags,
+                                                   PRTCRX509EXTENSION pThis, const char *pszErrorTag)
+{
+    pThis->enmValue = RTCRX509EXTENSIONVALUE_UNKNOWN;
+
+    /*
+     * Decode the encapsulated extension bytes if know the format.
+     */
+    RTASN1CURSOR ValueCursor;
+    RTAsn1CursorInitSubFromCore(pCursor, &pThis->ExtnValue.Asn1Core, &ValueCursor, "ExtnValue");
+    pCursor = &ValueCursor;
+
+    int rc;
+    if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+    {
+        /* 4.2.1.1 Authority Key Identifier */
+        PRTCRX509AUTHORITYKEYIDENTIFIER pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER;
+            rc = RTCrX509AuthorityKeyIdentifier_DecodeAsn1(&ValueCursor, 0, pThat, "AuthorityKeyIdentifier");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+    {
+        /* Old and obsolete version of the above, still found in microsoft certificates. */
+        PRTCRX509OLDAUTHORITYKEYIDENTIFIER pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER;
+            rc = RTCrX509OldAuthorityKeyIdentifier_DecodeAsn1(&ValueCursor, 0, pThat, "OldAuthorityKeyIdentifier");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID) == 0)
+    {
+        /* 4.2.1.2 Subject Key Identifier */
+        PRTASN1OCTETSTRING pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_OCTET_STRING;
+            rc = RTAsn1CursorGetOctetString(&ValueCursor, 0, pThat, "SubjectKeyIdentifier");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) == 0)
+    {
+        /* 4.2.1.3 Key Usage */
+        PRTASN1BITSTRING pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_BIT_STRING;
+            rc = RTAsn1CursorGetBitStringEx(&ValueCursor, 0, 9, pThat, "KeyUsage");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) == 0)
+    {
+        /* 4.2.1.4 Certificate Policies */
+        PRTCRX509CERTIFICATEPOLICIES pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES;
+            rc = RTCrX509CertificatePolicies_DecodeAsn1(&ValueCursor, 0, pThat, "CertPolicies");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) == 0)
+    {
+        /* 4.2.1.5 Policy Mappings */
+        PRTCRX509POLICYMAPPINGS pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS;
+            rc = RTCrX509PolicyMappings_DecodeAsn1(&ValueCursor, 0, pThat, "PolicyMapppings");
+        }
+    }
+    else if (   RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) == 0
+             || RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) == 0)
+    {
+        /* 4.2.1.6 Subject Alternative Name  /  4.2.1.7 Issuer Alternative Name */
+        PRTCRX509GENERALNAMES pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_GENERAL_NAMES;
+            rc = RTCrX509GeneralNames_DecodeAsn1(&ValueCursor, 0, pThat, "AltName");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) == 0)
+    {
+        /* 4.2.1.9 Basic Constraints */
+        PRTCRX509BASICCONSTRAINTS pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS;
+            rc = RTCrX509BasicConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "BasicConstraints");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) == 0)
+    {
+        /* 4.2.1.10 Name Constraints */
+        PRTCRX509NAMECONSTRAINTS pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS;
+            rc = RTCrX509NameConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "NameConstraints");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) == 0)
+    {
+        /* 4.2.1.11 Policy Constraints */
+        PRTCRX509POLICYCONSTRAINTS pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS;
+            rc = RTCrX509PolicyConstraints_DecodeAsn1(&ValueCursor, 0, pThat, "PolicyConstraints");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+    {
+        /* 4.2.1.12 Extended Key Usage */
+        PRTASN1SEQOFOBJIDS pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->SeqCore.Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS;
+            rc = RTAsn1SeqOfObjIds_DecodeAsn1(&ValueCursor, 0, pThat, "ExKeyUsage");
+        }
+    }
+    else if (RTAsn1ObjId_CompareWithString(&pThis->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+    {
+        /* 4.2.1.14 Inhibit anyPolicy */
+        PRTASN1INTEGER pThat;
+        rc = RTAsn1MemAllocZ(&pThis->ExtnValue.EncapsulatedAllocation, (void **)&pThat, sizeof(*pThat));
+        if (RT_SUCCESS(rc))
+        {
+            pThis->ExtnValue.pEncapsulated = &pThat->Asn1Core;
+            pThis->enmValue = RTCRX509EXTENSIONVALUE_INTEGER;
+            rc = RTAsn1CursorGetInteger(&ValueCursor, 0, pThat, "InhibitAnyPolicy");
+        }
+    }
+    else
+        return VINF_SUCCESS;
+
+    if (RT_SUCCESS(rc))
+        rc = RTAsn1CursorCheckEnd(&ValueCursor);
+
+    if (RT_SUCCESS(rc))
+        return VINF_SUCCESS;
+    return rc;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-asn1-decoder.h>
+
diff --git a/src/VBox/Runtime/common/crypto/x509-certpaths.cpp b/src/VBox/Runtime/common/crypto/x509-certpaths.cpp
new file mode 100644
index 0000000..ee4b342
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-certpaths.cpp
@@ -0,0 +1,2798 @@
+/* $Id: x509-certpaths.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, Simple Certificate Path Builder & Validator.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/asm.h>
+#include <iprt/ctype.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/list.h>
+#include <iprt/time.h>
+#include <iprt/crypto/store.h>
+
+#include "x509-internal.h"
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * X.509 certificate path node.
+ */
+typedef struct RTCRX509CERTPATHNODE
+{
+    /** Sibling list entry. */
+    RTLISTNODE                      SiblingEntry;
+    /** List of children or leaf list entry. */
+    RTLISTANCHOR                    ChildListOrLeafEntry;
+    /** Pointer to the parent node.  NULL for root. */
+    struct RTCRX509CERTPATHNODE    *pParent;
+
+    /** The distance between this node and the target.  */
+    uint32_t                        uDepth : 8;
+    /** Indicates the source of this certificate.  */
+    uint32_t                        uSrc : 3;
+    /** Set if this is a leaf node. */
+    uint32_t                        fLeaf : 1;
+    /** Makes sure it's a 32-bit bitfield. */
+    uint32_t                        uReserved : 20;
+
+    /** Leaf only: The result of the last path vertification. */
+    int                             rcVerify;
+
+    /** Pointer to the certificate.  This can be NULL only for trust anchors. */
+    PCRTCRX509CERTIFICATE           pCert;
+
+    /** If the certificate or trust anchor was obtained from a store, this is the
+     * associated certificate context (referenced of course).  This is used to
+     * access the trust anchor information, if present.
+     *
+     * (If this is NULL it's from a certificate array or some such given directly to
+     * the path building code.  It's assumed the caller doesn't free these until the
+     * path validation/whatever is done with and the paths destroyed.) */
+    PCRTCRCERTCTX                   pCertCtx;
+} RTCRX509CERTPATHNODE;
+/** Pointer to a X.509 path node. */
+typedef RTCRX509CERTPATHNODE *PRTCRX509CERTPATHNODE;
+
+/** @name RTCRX509CERTPATHNODE::uSrc values.
+ * The trusted and untrusted sources ordered in priority order, where higher
+ * number means high priority in case of duplicates.
+ * @{ */
+#define RTCRX509CERTPATHNODE_SRC_NONE               0
+#define RTCRX509CERTPATHNODE_SRC_TARGET             1
+#define RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY    2
+#define RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE    3
+#define RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE      4
+#define RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT       5
+#define RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(uSrc)   ((uSrc) >= RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE)
+/** @} */
+
+
+/**
+ * Policy tree node.
+ */
+typedef struct RTCRX509CERTPATHSPOLICYNODE
+{
+    /** Sibling list entry. */
+    RTLISTNODE                      SiblingEntry;
+    /** Tree depth list entry. */
+    RTLISTNODE                      DepthEntry;
+    /** List of children or leaf list entry. */
+    RTLISTANCHOR                    ChildList;
+    /** Pointer to the parent. */
+    struct RTCRX509CERTPATHSPOLICYNODE *pParent;
+
+    /** The policy object ID. */
+    PCRTASN1OBJID                   pValidPolicy;
+
+    /** Optional sequence of policy qualifiers. */
+    PCRTCRX509POLICYQUALIFIERINFOS  pPolicyQualifiers;
+
+    /** The first policy ID in the exepcted policy set. */
+    PCRTASN1OBJID                   pExpectedPolicyFirst;
+    /** Set if we've already mapped pExpectedPolicyFirst. */
+    bool                            fAlreadyMapped;
+    /** Number of additional items in the expected policy set. */
+    uint32_t                        cMoreExpectedPolicySet;
+    /** Additional items in the expected policy set.  */
+    PCRTASN1OBJID                  *papMoreExpectedPolicySet;
+} RTCRX509CERTPATHSPOLICYNODE;
+/** Pointer to a policy tree node. */
+typedef RTCRX509CERTPATHSPOLICYNODE *PRTCRX509CERTPATHSPOLICYNODE;
+
+
+/**
+ * Path builder and validator instance.
+ *
+ * The path builder creates a tree of certificates by forward searching from the
+ * end-entity towards a trusted source.  The leaf nodes are inserted into list
+ * ordered by the source of the leaf certificate and the path length (i.e. tree
+ * depth).
+ *
+ * The path validator works the tree from the leaf end and validates each
+ * potential path found by the builder.  It is generally happy with one working
+ * path, but may be told to verify all of them.
+ */
+typedef struct RTCRX509CERTPATHSINT
+{
+    /** Magic number. */
+    uint32_t                        u32Magic;
+    /** Reference counter. */
+    uint32_t volatile               cRefs;
+
+    /** @name Input
+     * @{ */
+    /** The target certificate (end entity) to build a trusted path for. */
+    PCRTCRX509CERTIFICATE           pTarget;
+
+    /** Lone trusted certificate.  */
+    PCRTCRX509CERTIFICATE           pTrustedCert;
+    /** Store of trusted certificates. */
+    RTCRSTORE                       hTrustedStore;
+
+    /** Store of untrusted certificates. */
+    RTCRSTORE                       hUntrustedStore;
+    /** Array of untrusted certificates, typically from the protocol (like the
+     *  certificates member of PKCS \#7 SignedData). */
+    PCRTCRX509CERTIFICATE           paUntrustedCerts;
+    /** Number of entries in paUntrusted. */
+    uint32_t                        cUntrustedCerts;
+
+    /** UTC time we're going to validate the path at, requires
+     *  RTCRX509CERTPATHSINT_F_VALID_TIME to be set. */
+    RTTIMESPEC                      ValidTime;
+    /** Number of policy OIDs in the user initial policy set, 0 means anyPolicy. */
+    uint32_t                        cInitialUserPolicySet;
+    /** The user initial policy set.  As with all other user provided data, we
+     * assume it's immutable and remains valid for the usage period of the path
+     * builder & validator. */
+    PCRTASN1OBJID                  *papInitialUserPolicySet;
+    /** Number of certificates before the user wants an explicit policy result.
+     * Set to UINT32_MAX no explicit policy restriction required by the user. */
+    uint32_t                        cInitialExplicitPolicy;
+    /** Number of certificates before the user wants policy mapping to be
+     * inhibited.  Set to UINT32_MAX if no initial policy mapping inhibition
+     * desired by the user. */
+    uint32_t                        cInitialPolicyMappingInhibit;
+    /** Number of certificates before the user wants the anyPolicy to be rejected.
+     * Set to UINT32_MAX no explicit policy restriction required by the user. */
+    uint32_t                        cInitialInhibitAnyPolicy;
+    /** Initial name restriction: Permitted subtrees.  */
+    PCRTCRX509GENERALSUBTREES       pInitialPermittedSubtrees;
+    /** Initial name restriction: Excluded subtrees.  */
+    PCRTCRX509GENERALSUBTREES       pInitialExcludedSubtrees;
+
+    /** Flags RTCRX509CERTPATHSINT_F_XXX. */
+    uint32_t                        fFlags;
+    /** @} */
+
+    /** Sticky status for remembering allocation errors and the like.  */
+    int32_t                         rc;
+    /** Where to store extended error info (optional). */
+    PRTERRINFO                      pErrInfo;
+
+    /** @name Path Builder Output
+     * @{  */
+    /** Pointer to the root of the tree.  This will always be non-NULL after path
+     *  building and thus can be reliably used to tell if path building has taken
+     *  place or not. */
+    PRTCRX509CERTPATHNODE           pRoot;
+    /** List of working leaf tree nodes. */
+    RTLISTANCHOR                    LeafList;
+    /** The number of paths (leafs). */
+    uint32_t                        cPaths;
+    /** @} */
+
+    /** Path Validator State. */
+    struct
+    {
+        /** Number of nodes in the certificate path we're validating (aka 'n'). */
+        uint32_t                        cNodes;
+        /** The current node (0 being the trust anchor). */
+        uint32_t                        iNode;
+
+        /** The root node of the valid policy tree. */
+        PRTCRX509CERTPATHSPOLICYNODE    pValidPolicyTree;
+        /** An array of length cNodes + 1 which tracks all nodes at the given (index)
+         *  tree depth via the RTCRX509CERTPATHSPOLICYNODE::DepthEntry member. */
+        PRTLISTANCHOR                   paValidPolicyDepthLists;
+
+        /** Number of entries in paPermittedSubtrees (name constraints).
+         * If zero, no permitted name constrains currently in effect.  */
+        uint32_t                        cPermittedSubtrees;
+        /** The allocated size of papExcludedSubtrees */
+        uint32_t                        cPermittedSubtreesAlloc;
+        /** Array of permitted subtrees we've collected so far (name constraints). */
+        PCRTCRX509GENERALSUBTREE       *papPermittedSubtrees;
+        /** Set if we end up with an empty set after calculating a name constraints
+         * union.  */
+        bool                            fNoPermittedSubtrees;
+
+        /** Number of entries in paExcludedSubtrees (name constraints).
+         * If zero, no excluded name constrains currently in effect.  */
+        uint32_t                        cExcludedSubtrees;
+        /** Array of excluded subtrees we've collected so far (name constraints). */
+        PCRTCRX509GENERALSUBTREES      *papExcludedSubtrees;
+
+        /** Number of non-self-issued certificates to be processed before a non-NULL
+         * paValidPolicyTree is required. */
+        uint32_t                        cExplicitPolicy;
+        /** Number of non-self-issued certificates to be processed we stop processing
+         * policy mapping extensions. */
+        uint32_t                        cInhibitPolicyMapping;
+        /** Number of non-self-issued certificates to be processed before a the
+         * anyPolicy is rejected. */
+        uint32_t                        cInhibitAnyPolicy;
+        /** Number of non-self-issued certificates we're allowed to process. */
+        uint32_t                        cMaxPathLength;
+
+        /** The working issuer name. */
+        PCRTCRX509NAME                  pWorkingIssuer;
+        /** The working public key algorithm ID. */
+        PCRTASN1OBJID                   pWorkingPublicKeyAlgorithm;
+        /** The working public key algorithm parameters. */
+        PCRTASN1DYNTYPE                 pWorkingPublicKeyParameters;
+        /** A bit string containing the public key. */
+        PCRTASN1BITSTRING               pWorkingPublicKey;
+    } v;
+
+    /** An object identifier initialized to anyPolicy. */
+    RTASN1OBJID                         AnyPolicyObjId;
+
+    /** Temporary scratch space. */
+    char                                szTmp[1024];
+} RTCRX509CERTPATHSINT;
+typedef RTCRX509CERTPATHSINT *PRTCRX509CERTPATHSINT;
+
+/** Magic value for RTCRX509CERTPATHSINT::u32Magic (Bruce Schneier). */
+#define RTCRX509CERTPATHSINT_MAGIC                          UINT32_C(0x19630115)
+
+/** @name RTCRX509CERTPATHSINT_F_XXX - Certificate path build flags.
+ * @{ */
+#define RTCRX509CERTPATHSINT_F_VALID_TIME                    RT_BIT_32(0)
+#define RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS     RT_BIT_32(1)
+#define RTCRX509CERTPATHSINT_F_VALID_MASK                    UINT32_C(0x00000003)
+/** @} */
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+static void rtCrX509CertPathsDestroyTree(PRTCRX509CERTPATHSINT pThis);
+static void rtCrX509CpvCleanup(PRTCRX509CERTPATHSINT pThis);
+
+
+/** @name Path Builder and Validator Config APIs
+ * @{
+ */
+
+RTDECL(int) RTCrX509CertPathsCreate(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget)
+{
+    AssertPtrReturn(phCertPaths, VERR_INVALID_POINTER);
+
+    PRTCRX509CERTPATHSINT pThis = (PRTCRX509CERTPATHSINT)RTMemAllocZ(sizeof(*pThis));
+    if (pThis)
+    {
+        int rc = RTAsn1ObjId_InitFromString(&pThis->AnyPolicyObjId, RTCRX509_ID_CE_CP_ANY_POLICY_OID, &g_RTAsn1DefaultAllocator);
+        if (RT_SUCCESS(rc))
+        {
+            pThis->u32Magic                     = RTCRX509CERTPATHSINT_MAGIC;
+            pThis->cRefs                        = 1;
+            pThis->pTarget                      = pTarget;
+            pThis->hTrustedStore                = NIL_RTCRSTORE;
+            pThis->hUntrustedStore              = NIL_RTCRSTORE;
+            pThis->cInitialExplicitPolicy       = UINT32_MAX;
+            pThis->cInitialPolicyMappingInhibit = UINT32_MAX;
+            pThis->cInitialInhibitAnyPolicy     = UINT32_MAX;
+            pThis->rc                           = VINF_SUCCESS;
+            RTListInit(&pThis->LeafList);
+            *phCertPaths = pThis;
+            return VINF_SUCCESS;
+        }
+        return rc;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsRetain(RTCRX509CERTPATHS hCertPaths)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, UINT32_MAX);
+
+    uint32_t cRefs = ASMAtomicIncU32(&pThis->cRefs);
+    Assert(cRefs > 0 && cRefs < 64);
+    return cRefs;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsRelease(RTCRX509CERTPATHS hCertPaths)
+{
+    uint32_t cRefs;
+    if (hCertPaths != NIL_RTCRX509CERTPATHS)
+    {
+        PRTCRX509CERTPATHSINT pThis = hCertPaths;
+        AssertPtrReturn(pThis, UINT32_MAX);
+        AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+
+        cRefs = ASMAtomicDecU32(&pThis->cRefs);
+        Assert(cRefs < 64);
+        if (!cRefs)
+        {
+            /*
+             * No more references, destroy the whole thing.
+             */
+            ASMAtomicWriteU32(&pThis->u32Magic, ~RTCRX509CERTPATHSINT_MAGIC);
+
+            /* config */
+            pThis->pTarget                      = NULL; /* Referencing user memory. */
+            pThis->pTrustedCert                 = NULL; /* Referencing user memory. */
+            RTCrStoreRelease(pThis->hTrustedStore);
+            pThis->hTrustedStore                = NIL_RTCRSTORE;
+            RTCrStoreRelease(pThis->hUntrustedStore);
+            pThis->hUntrustedStore              = NIL_RTCRSTORE;
+            pThis->paUntrustedCerts             = NULL; /* Referencing user memory. */
+            pThis->papInitialUserPolicySet      = NULL; /* Referencing user memory. */
+            pThis->pInitialPermittedSubtrees    = NULL; /* Referencing user memory. */
+            pThis->pInitialExcludedSubtrees     = NULL; /* Referencing user memory. */
+
+            /* builder */
+            rtCrX509CertPathsDestroyTree(pThis);
+
+            /* validator */
+            rtCrX509CpvCleanup(pThis);
+
+            /* misc */
+            RTAsn1VtDelete(&pThis->AnyPolicyObjId.Asn1Core);
+
+            /* Finally, the instance itself. */
+            RTMemFree(pThis);
+        }
+    }
+    else
+        cRefs = 0;
+    return cRefs;
+}
+
+
+
+RTDECL(int) RTCrX509CertPathsSetTrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hTrustedStore)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+    if (pThis->hTrustedStore != NIL_RTCRSTORE)
+    {
+        RTCrStoreRelease(pThis->hTrustedStore);
+        pThis->hTrustedStore = NIL_RTCRSTORE;
+    }
+    if (hTrustedStore != NIL_RTCRSTORE)
+    {
+        AssertReturn(RTCrStoreRetain(hTrustedStore) != UINT32_MAX, VERR_INVALID_HANDLE);
+        pThis->hTrustedStore = hTrustedStore;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetUntrustedStore(RTCRX509CERTPATHS hCertPaths, RTCRSTORE hUntrustedStore)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+    if (pThis->hUntrustedStore != NIL_RTCRSTORE)
+    {
+        RTCrStoreRelease(pThis->hUntrustedStore);
+        pThis->hUntrustedStore = NIL_RTCRSTORE;
+    }
+    if (hUntrustedStore != NIL_RTCRSTORE)
+    {
+        AssertReturn(RTCrStoreRetain(hUntrustedStore) != UINT32_MAX, VERR_INVALID_HANDLE);
+        pThis->hUntrustedStore = hUntrustedStore;
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetUntrustedArray(RTCRX509CERTPATHS hCertPaths, PCRTCRX509CERTIFICATE paCerts, uint32_t cCerts)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+
+    pThis->paUntrustedCerts = paCerts;
+    pThis->cUntrustedCerts  = cCerts;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetValidTime(RTCRX509CERTPATHS hCertPaths, PCRTTIME pTime)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+    if (pTime)
+    {
+        if (RTTimeImplode(&pThis->ValidTime, pTime))
+            return VERR_INVALID_PARAMETER;
+        pThis->fFlags |= RTCRX509CERTPATHSINT_F_VALID_TIME;
+    }
+    else
+        pThis->fFlags &= ~RTCRX509CERTPATHSINT_F_VALID_TIME;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsSetValidTimeSpec(RTCRX509CERTPATHS hCertPaths, PCRTTIMESPEC pTimeSpec)
+{
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->pRoot == NULL, VERR_WRONG_ORDER);
+
+    if (pTimeSpec)
+    {
+        pThis->ValidTime = *pTimeSpec;
+        pThis->fFlags |= RTCRX509CERTPATHSINT_F_VALID_TIME;
+    }
+    else
+        pThis->fFlags &= ~RTCRX509CERTPATHSINT_F_VALID_TIME;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTCrX509CertPathsCreateEx(PRTCRX509CERTPATHS phCertPaths, PCRTCRX509CERTIFICATE pTarget, RTCRSTORE hTrustedStore,
+                                      RTCRSTORE hUntrustedStore, PCRTCRX509CERTIFICATE paUntrustedCerts, uint32_t cUntrustedCerts,
+                                      PCRTTIMESPEC pValidTime)
+{
+    int rc = RTCrX509CertPathsCreate(phCertPaths, pTarget);
+    if (RT_SUCCESS(rc))
+    {
+        PRTCRX509CERTPATHSINT pThis = *phCertPaths;
+
+        rc = RTCrX509CertPathsSetTrustedStore(pThis, hTrustedStore);
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTCrX509CertPathsSetUntrustedStore(pThis, hUntrustedStore);
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTCrX509CertPathsSetUntrustedArray(pThis, paUntrustedCerts, cUntrustedCerts);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = RTCrX509CertPathsSetValidTimeSpec(pThis, pValidTime);
+                    if (RT_SUCCESS(rc))
+                    {
+                        return VINF_SUCCESS;
+                    }
+                }
+                RTCrStoreRelease(pThis->hUntrustedStore);
+            }
+            RTCrStoreRelease(pThis->hTrustedStore);
+        }
+        RTMemFree(pThis);
+        *phCertPaths = NIL_RTCRX509CERTPATHS;
+    }
+    return rc;
+}
+
+/** @} */
+
+
+
+/** @name Path Builder and Validator Common Utility Functions.
+ * @{
+ */
+
+/**
+ * Checks if the certificate is self-issued.
+ *
+ * @returns true / false.
+ * @param   pNode               The path node to check..
+ */
+static bool rtCrX509CertPathsIsSelfIssued(PRTCRX509CERTPATHNODE pNode)
+{
+    return pNode->pCert
+        && RTCrX509Name_MatchByRfc5280(&pNode->pCert->TbsCertificate.Subject, &pNode->pCert->TbsCertificate.Issuer);
+}
+
+/** @}  */
+
+
+
+/** @name Path Builder Functions.
+ * @{
+ */
+
+/**
+ *
+ * @returns
+ * @param   pThis               .
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsNewNode(PRTCRX509CERTPATHSINT pThis)
+{
+    PRTCRX509CERTPATHNODE pNode = (PRTCRX509CERTPATHNODE)RTMemAllocZ(sizeof(*pNode));
+    if (RT_LIKELY(pNode))
+    {
+        RTListInit(&pNode->SiblingEntry);
+        RTListInit(&pNode->ChildListOrLeafEntry);
+        pNode->rcVerify = VERR_CR_X509_NOT_VERIFIED;
+
+        return pNode;
+    }
+
+    pThis->rc = RTErrInfoSet(pThis->pErrInfo, VERR_NO_MEMORY, "No memory for path node");
+    return NULL;
+}
+
+
+static void rtCrX509CertPathsDestroyNode(PRTCRX509CERTPATHNODE pNode)
+{
+    if (pNode->pCertCtx)
+    {
+        RTCrCertCtxRelease(pNode->pCertCtx);
+        pNode->pCertCtx = NULL;
+    }
+    RT_ZERO(*pNode);
+    RTMemFree(pNode);
+}
+
+
+static void rtCrX509CertPathsAddIssuer(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pParent,
+                                       PCRTCRX509CERTIFICATE pCert, PCRTCRCERTCTX pCertCtx, uint8_t uSrc)
+{
+    /*
+     * Check if we've seen this certificate already in the current path or
+     * among the already gathered issuers.
+     */
+    if (pCert)
+    {
+        /* No duplicate certificates in the path. */
+        PRTCRX509CERTPATHNODE pTmpNode = pParent;
+        while (pTmpNode)
+        {
+            Assert(pTmpNode->pCert);
+            if (   pTmpNode->pCert == pCert
+                || RTCrX509Certificate_Compare(pTmpNode->pCert, pCert) == 0)
+                return;
+            pTmpNode = pTmpNode->pParent;
+        }
+
+        /* No duplicate tree branches. */
+        RTListForEach(&pParent->ChildListOrLeafEntry, pTmpNode, RTCRX509CERTPATHNODE, SiblingEntry)
+        {
+            if (RTCrX509Certificate_Compare(pTmpNode->pCert, pCert) == 0)
+                return;
+        }
+    }
+    else
+        Assert(pCertCtx);
+
+    /*
+     * Reference the context core before making the allocation.
+     */
+    if (pCertCtx)
+        AssertReturnVoidStmt(RTCrCertCtxRetain(pCertCtx) != UINT32_MAX,
+                             pThis->rc = RTErrInfoSetF(pThis->pErrInfo, VERR_CR_X509_CPB_BAD_CERT_CTX,
+                                                       "Bad pCertCtx=%p", pCertCtx));
+
+    /*
+     * We haven't see it, append it as a child.
+     */
+    PRTCRX509CERTPATHNODE pNew = rtCrX509CertPathsNewNode(pThis);
+    if (pNew)
+    {
+        pNew->pParent  = pParent;
+        pNew->pCert    = pCert;
+        pNew->pCertCtx = pCertCtx;
+        pNew->uSrc     = uSrc;
+        pNew->uDepth   = pParent->uDepth + 1;
+        RTListAppend(&pParent->ChildListOrLeafEntry, &pNew->SiblingEntry);
+    }
+    else
+        RTCrCertCtxRelease(pCertCtx);
+}
+
+
+static void rtCrX509CertPathsGetIssuersFromStore(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode,
+                                                 PCRTCRX509NAME pIssuer, RTCRSTORE hStore, uint8_t uSrc)
+{
+    RTCRSTORECERTSEARCH Search;
+    int rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(hStore, pIssuer, &Search);
+    if (RT_SUCCESS(rc))
+    {
+        PCRTCRCERTCTX pCertCtx;
+        while ((pCertCtx = RTCrStoreCertSearchNext(hStore, &Search)) != NULL)
+        {
+            if (   pCertCtx->pCert
+                || (   RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(uSrc)
+                    && pCertCtx->pTaInfo) )
+                rtCrX509CertPathsAddIssuer(pThis, pNode, pCertCtx->pCert, pCertCtx, uSrc);
+            RTCrCertCtxRelease(pCertCtx);
+        }
+        RTCrStoreCertSearchDestroy(hStore, &Search);
+    }
+}
+
+
+static void rtCrX509CertPathsGetIssuers(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    Assert(RTListIsEmpty(&pNode->ChildListOrLeafEntry));
+    Assert(!pNode->fLeaf);
+    Assert(pNode->pCert);
+
+    /*
+     * Don't recurse infintely.
+     */
+    if (RT_UNLIKELY(pNode->uDepth >= 50))
+        return;
+
+    PCRTCRX509NAME const pIssuer = &pNode->pCert->TbsCertificate.Issuer;
+
+    /*
+     * Trusted certificate.
+     */
+    if (   pThis->pTrustedCert
+        && RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(pThis->pTrustedCert, pIssuer))
+        rtCrX509CertPathsAddIssuer(pThis, pNode, pThis->pTrustedCert, NULL, RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT);
+
+    /*
+     * Trusted certificate store.
+     */
+    if (pThis->hTrustedStore != NIL_RTCRSTORE)
+        rtCrX509CertPathsGetIssuersFromStore(pThis, pNode, pIssuer, pThis->hTrustedStore,
+                                             RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE);
+
+    /*
+     * Untrusted store.
+     */
+    if (pThis->hUntrustedStore != NIL_RTCRSTORE)
+        rtCrX509CertPathsGetIssuersFromStore(pThis, pNode, pIssuer, pThis->hTrustedStore,
+                                             RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE);
+
+    /*
+     * Untrusted array.
+     */
+    if (pThis->paUntrustedCerts)
+        for (uint32_t i = 0; i < pThis->cUntrustedCerts; i++)
+            if (RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(&pThis->paUntrustedCerts[i], pIssuer))
+                rtCrX509CertPathsAddIssuer(pThis, pNode, &pThis->paUntrustedCerts[i], NULL,
+                                                 RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY);
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetNextRightUp(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    for (;;)
+    {
+        /* The root node has no siblings. */
+        PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+        if (!pNode->pParent)
+            return NULL;
+
+        /* Try go to the right. */
+        PRTCRX509CERTPATHNODE pNext = RTListGetNext(&pParent->ChildListOrLeafEntry, pNode, RTCRX509CERTPATHNODE, SiblingEntry);
+        if (pNext)
+            return pNext;
+
+        /* Up. */
+        pNode = pParent;
+    }
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsEliminatePath(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    for (;;)
+    {
+        Assert(RTListIsEmpty(&pNode->ChildListOrLeafEntry));
+
+        /* Don't remove the root node. */
+        PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+        if (!pParent)
+            return NULL;
+
+        /* Before removing and deleting the node check if there is sibling
+           right to it that we should continue processing from. */
+        PRTCRX509CERTPATHNODE pNext = RTListGetNext(&pParent->ChildListOrLeafEntry, pNode, RTCRX509CERTPATHNODE, SiblingEntry);
+        RTListNodeRemove(&pNode->SiblingEntry);
+        rtCrX509CertPathsDestroyNode(pNode);
+
+        if (pNext)
+            return pNext;
+
+        /* If the parent node cannot be removed, do a normal get-next-rigth-up
+           to find the continuation point for the tree loop. */
+        if (!RTListIsEmpty(&pParent->ChildListOrLeafEntry))
+            return rtCrX509CertPathsGetNextRightUp(pThis, pParent);
+
+        pNode = pParent;
+    }
+}
+
+
+/**
+ * Destroys the whole path tree.
+ *
+ * @param   pThis       The path builder and verifier instance.
+ */
+static void rtCrX509CertPathsDestroyTree(PRTCRX509CERTPATHSINT pThis)
+{
+    PRTCRX509CERTPATHNODE pNode, pNextLeaf;
+    RTListForEachSafe(&pThis->LeafList, pNode, pNextLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+    {
+        RTListNodeRemove(&pNode->ChildListOrLeafEntry);
+        RTListInit(&pNode->ChildListOrLeafEntry);
+
+        for (;;)
+        {
+            PRTCRX509CERTPATHNODE pParent = pNode->pParent;
+
+            RTListNodeRemove(&pNode->SiblingEntry);
+            rtCrX509CertPathsDestroyNode(pNode);
+
+            if (!pParent)
+            {
+                pThis->pRoot = NULL;
+                break;
+            }
+
+            if (!RTListIsEmpty(&pParent->ChildListOrLeafEntry))
+                break;
+
+            pNode = pParent;
+        }
+    }
+    Assert(!pThis->pRoot);
+}
+
+
+/**
+ * Adds a leaf node.
+ *
+ * This should normally be a trusted certificate, but the caller can also
+ * request the incomplete paths, in which case this will be an untrusted
+ * certificate.
+ *
+ * @returns Pointer to the next node in the tree to process.
+ * @param   pThis               The path builder instance.
+ * @param   pNode               The leaf node.
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsAddLeaf(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    pNode->fLeaf = true;
+
+    /*
+     * Priority insert by source and depth.
+     */
+    PRTCRX509CERTPATHNODE pCurLeaf;
+    RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+    {
+        if (   pNode->uSrc > pCurLeaf->uSrc
+            || (   pNode->uSrc == pCurLeaf->uSrc
+                && pNode->uDepth < pCurLeaf->uDepth) )
+        {
+            RTListNodeInsertBefore(&pCurLeaf->ChildListOrLeafEntry, &pNode->ChildListOrLeafEntry);
+            pThis->cPaths++;
+            return rtCrX509CertPathsGetNextRightUp(pThis, pNode);
+        }
+    }
+
+    RTListAppend(&pThis->LeafList, &pNode->ChildListOrLeafEntry);
+    pThis->cPaths++;
+    return rtCrX509CertPathsGetNextRightUp(pThis, pNode);
+}
+
+
+
+RTDECL(int) RTCrX509CertPathsBuild(RTCRX509CERTPATHS hCertPaths, PRTERRINFO pErrInfo)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+    AssertReturn(   (pThis->paUntrustedCerts == NULL && pThis->cUntrustedCerts == 0)
+                 || (pThis->paUntrustedCerts != NULL && pThis->cUntrustedCerts > 0),
+                 VERR_INVALID_PARAMETER);
+    AssertReturn(RTListIsEmpty(&pThis->LeafList), VERR_INVALID_PARAMETER);
+    AssertReturn(pThis->pRoot == NULL, VERR_INVALID_PARAMETER);
+    AssertReturn(pThis->rc == VINF_SUCCESS, pThis->rc);
+    AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+    Assert(RT_SUCCESS(RTCrX509Certificate_CheckSanity(pThis->pTarget, 0, NULL, NULL)));
+
+    /*
+     * Set up the target.
+     */
+    PRTCRX509CERTPATHNODE pCur;
+    pThis->pRoot = pCur = rtCrX509CertPathsNewNode(pThis);
+    if (pThis->pRoot)
+    {
+        pCur->pCert  = pThis->pTarget;
+        pCur->uDepth = 0;
+        pCur->uSrc   = RTCRX509CERTPATHNODE_SRC_TARGET;
+
+        pThis->pErrInfo = pErrInfo;
+
+        /*
+         * The tree construction loop.
+         * Walks down, up, and right as the tree is constructed.
+         */
+        do
+        {
+            /*
+             * Check for the two leaf cases first.
+             */
+            if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCur->uSrc))
+                pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+#if 0 /* This isn't right.*/
+            else if (rtCrX509CertPathsIsSelfIssued(pCur))
+            {
+                if (pThis->fFlags & RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS)
+                    pCur = rtCrX509CertPathsEliminatePath(pThis, pCur);
+                else
+                    pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+            }
+#endif
+            /*
+             * Not a leaf, find all potential issuers and decend into these.
+             */
+            else
+            {
+                rtCrX509CertPathsGetIssuers(pThis, pCur);
+                if (RT_FAILURE(pThis->rc))
+                    break;
+
+                if (!RTListIsEmpty(&pCur->ChildListOrLeafEntry))
+                    pCur = RTListGetFirst(&pCur->ChildListOrLeafEntry, RTCRX509CERTPATHNODE, SiblingEntry);
+                else if (pThis->fFlags & RTCRX509CERTPATHSINT_F_ELIMINATE_UNTRUSTED_PATHS)
+                    pCur = rtCrX509CertPathsEliminatePath(pThis, pCur);
+                else
+                    pCur = rtCrX509CertPathsAddLeaf(pThis, pCur);
+            }
+        } while (pCur);
+
+        pThis->pErrInfo = NULL;
+        if (RT_SUCCESS(pThis->rc))
+            return VINF_SUCCESS;
+    }
+    else
+        Assert(RT_FAILURE_NP(pThis->rc));
+    return pThis->rc;
+}
+
+
+/**
+ * Looks up path by leaf/path index.
+ *
+ * @returns Pointer to the leaf node of the path.
+ * @param   pThis           The path builder & validator instance.
+ * @param   iPath           The oridnal of the path to get.
+ */
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetLeafByIndex(PRTCRX509CERTPATHSINT pThis, uint32_t iPath)
+{
+    Assert(iPath < pThis->cPaths);
+
+    uint32_t                iCurPath = 0;
+    PRTCRX509CERTPATHNODE   pCurLeaf;
+    RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+    {
+        if (iCurPath == iPath)
+            return pCurLeaf;
+        iCurPath++;
+    }
+
+    AssertFailedReturn(NULL);
+}
+
+
+static void rtDumpPrintf(PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser, const char *pszFormat, ...)
+{
+    va_list va;
+    va_start(va, pszFormat);
+    pfnPrintfV(pvUser, pszFormat, va);
+    va_end(va);
+}
+
+
+static void rtDumpIndent(PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser, uint32_t cchSpaces, const char *pszFormat, ...)
+{
+    static const char s_szSpaces[] = "                          ";
+    while (cchSpaces > 0)
+    {
+        uint32_t cchBurst = RT_MIN(sizeof(s_szSpaces) - 1, cchSpaces);
+        rtDumpPrintf(pfnPrintfV, pvUser, &s_szSpaces[sizeof(s_szSpaces) - cchBurst - 1]);
+        cchSpaces -= cchBurst;
+    }
+
+    va_list va;
+    va_start(va, pszFormat);
+    pfnPrintfV(pvUser, pszFormat, va);
+    va_end(va);
+}
+
+/** @name X.500 attribute types
+ * See RFC-4519 among others.
+ * @{ */
+#define RTCRX500_ID_AT_OBJECT_CLASS_OID                     "2.5.4.0"
+#define RTCRX500_ID_AT_ALIASED_ENTRY_NAME_OID               "2.5.4.1"
+#define RTCRX500_ID_AT_KNOWLDGEINFORMATION_OID              "2.5.4.2"
+#define RTCRX500_ID_AT_COMMON_NAME_OID                      "2.5.4.3"
+#define RTCRX500_ID_AT_SURNAME_OID                          "2.5.4.4"
+#define RTCRX500_ID_AT_SERIAL_NUMBER_OID                    "2.5.4.5"
+#define RTCRX500_ID_AT_COUNTRY_NAME_OID                     "2.5.4.6"
+#define RTCRX500_ID_AT_LOCALITY_NAME_OID                    "2.5.4.7"
+#define RTCRX500_ID_AT_STATE_OR_PROVINCE_NAME_OID           "2.5.4.8"
+#define RTCRX500_ID_AT_STREET_ADDRESS_OID                   "2.5.4.9"
+#define RTCRX500_ID_AT_ORGANIZATION_NAME_OID                "2.5.4.10"
+#define RTCRX500_ID_AT_ORGANIZATION_UNIT_NAME_OID           "2.5.4.11"
+#define RTCRX500_ID_AT_TITLE_OID                            "2.5.4.12"
+#define RTCRX500_ID_AT_DESCRIPTION_OID                      "2.5.4.13"
+#define RTCRX500_ID_AT_SEARCH_GUIDE_OID                     "2.5.4.14"
+#define RTCRX500_ID_AT_BUSINESS_CATEGORY_OID                "2.5.4.15"
+#define RTCRX500_ID_AT_POSTAL_ADDRESS_OID                   "2.5.4.16"
+#define RTCRX500_ID_AT_POSTAL_CODE_OID                      "2.5.4.17"
+#define RTCRX500_ID_AT_POST_OFFICE_BOX_OID                  "2.5.4.18"
+#define RTCRX500_ID_AT_PHYSICAL_DELIVERY_OFFICE_NAME_OID    "2.5.4.19"
+#define RTCRX500_ID_AT_TELEPHONE_NUMBER_OID                 "2.5.4.20"
+#define RTCRX500_ID_AT_TELEX_NUMBER_OID                     "2.5.4.21"
+#define RTCRX500_ID_AT_TELETEX_TERMINAL_IDENTIFIER_OID      "2.5.4.22"
+#define RTCRX500_ID_AT_FACIMILE_TELEPHONE_NUMBER_OID        "2.5.4.23"
+#define RTCRX500_ID_AT_X121_ADDRESS_OID                     "2.5.4.24"
+#define RTCRX500_ID_AT_INTERNATIONAL_ISDN_NUMBER_OID        "2.5.4.25"
+#define RTCRX500_ID_AT_REGISTERED_ADDRESS_OID               "2.5.4.26"
+#define RTCRX500_ID_AT_DESTINATION_INDICATOR_OID            "2.5.4.27"
+#define RTCRX500_ID_AT_PREFERRED_DELIVERY_METHOD_OID        "2.5.4.28"
+#define RTCRX500_ID_AT_PRESENTATION_ADDRESS_OID             "2.5.4.29"
+#define RTCRX500_ID_AT_SUPPORTED_APPLICATION_CONTEXT_OID    "2.5.4.30"
+#define RTCRX500_ID_AT_MEMBER_OID                           "2.5.4.31"
+#define RTCRX500_ID_AT_OWNER_OID                            "2.5.4.32"
+#define RTCRX500_ID_AT_ROLE_OCCUPANT_OID                    "2.5.4.33"
+#define RTCRX500_ID_AT_SEE_ALSO_OID                         "2.5.4.34"
+#define RTCRX500_ID_AT_USER_PASSWORD_OID                    "2.5.4.35"
+#define RTCRX500_ID_AT_USER_CERTIFICATE_OID                 "2.5.4.36"
+#define RTCRX500_ID_AT_CA_CERTIFICATE_OID                   "2.5.4.37"
+#define RTCRX500_ID_AT_AUTHORITY_REVOCATION_LIST_OID        "2.5.4.38"
+#define RTCRX500_ID_AT_CERTIFICATE_REVOCATION_LIST_OID      "2.5.4.39"
+#define RTCRX500_ID_AT_CROSS_CERTIFICATE_PAIR_OID           "2.5.4.40"
+#define RTCRX500_ID_AT_NAME_OID                             "2.5.4.41"
+#define RTCRX500_ID_AT_GIVEN_NAME_OID                       "2.5.4.42"
+#define RTCRX500_ID_AT_INITIALS_OID                         "2.5.4.43"
+#define RTCRX500_ID_AT_GENERATION_QUALIFIER_OID             "2.5.4.44"
+#define RTCRX500_ID_AT_UNIQUE_IDENTIFIER_OID                "2.5.4.45"
+#define RTCRX500_ID_AT_DN_QUALIFIER_OID                     "2.5.4.46"
+#define RTCRX500_ID_AT_ENHANCHED_SEARCH_GUIDE_OID           "2.5.4.47"
+#define RTCRX500_ID_AT_PROTOCOL_INFORMATION_OID             "2.5.4.48"
+#define RTCRX500_ID_AT_DISTINGUISHED_NAME_OID               "2.5.4.49"
+#define RTCRX500_ID_AT_UNIQUE_MEMBER_OID                    "2.5.4.50"
+#define RTCRX500_ID_AT_HOUSE_IDENTIFIER_OID                 "2.5.4.51"
+#define RTCRX500_ID_AT_SUPPORTED_ALGORITHMS_OID             "2.5.4.52"
+#define RTCRX500_ID_AT_DELTA_REVOCATION_LIST_OID            "2.5.4.53"
+#define RTCRX500_ID_AT_ATTRIBUTE_CERTIFICATE_OID            "2.5.4.58"
+#define RTCRX500_ID_AT_PSEUDONYM_OID                        "2.5.4.65"
+/** @} */
+
+
+static void rtCrX509NameDump(PCRTCRX509NAME pName, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+    for (uint32_t i = 0; i < pName->cItems; i++)
+        for (uint32_t j = 0; j < pName->paItems[i].cItems; j++)
+        {
+            PRTCRX509ATTRIBUTETYPEANDVALUE pAttrib = &pName->paItems[i].paItems[j];
+
+            const char *pszType = pAttrib->Type.szObjId;
+            if (   !strncmp(pAttrib->Type.szObjId, "2.5.4.", 6)
+                && (pAttrib->Type.szObjId[8] == '\0' || pAttrib->Type.szObjId[9] == '\0'))
+            {
+                switch (RTStrToUInt8(&pAttrib->Type.szObjId[6]))
+                {
+                    case  3: pszType = "cn"; break;
+                    case  4: pszType = "sn"; break;
+                    case  5: pszType = "serialNumber"; break;
+                    case  6: pszType = "c"; break;
+                    case  7: pszType = "l"; break;
+                    case  8: pszType = "st"; break;
+                    case  9: pszType = "street"; break;
+                    case 10: pszType = "o"; break;
+                    case 11: pszType = "ou"; break;
+                    case 13: pszType = "description"; break;
+                    case 15: pszType = "businessCategory"; break;
+                    case 16: pszType = "postalAddress"; break;
+                    case 17: pszType = "postalCode"; break;
+                    case 18: pszType = "postOfficeBox"; break;
+                    case 20: pszType = "telephoneNumber"; break;
+                    case 26: pszType = "registeredAddress"; break;
+                    case 31: pszType = "member"; break;
+                    case 41: pszType = "name"; break;
+                    case 42: pszType = "givenName"; break;
+                    case 43: pszType = "initials"; break;
+                    case 45: pszType = "x500UniqueIdentifier"; break;
+                    case 50: pszType = "uniqueMember"; break;
+                }
+            }
+            rtDumpPrintf(pfnPrintfV, pvUser, "/%s=", pszType);
+            if (pAttrib->Value.enmType == RTASN1TYPE_STRING)
+            {
+                if (pAttrib->Value.u.String.pszUtf8)
+                    rtDumpPrintf(pfnPrintfV, pvUser, "%s", pAttrib->Value.u.String.pszUtf8);
+                else
+                {
+                    const char *pch = pAttrib->Value.u.String.Asn1Core.uData.pch;
+                    uint32_t    cch = pAttrib->Value.u.String.Asn1Core.cb;
+                    int rc = RTStrValidateEncodingEx(pch, cch, 0);
+                    if (RT_SUCCESS(rc) && cch)
+                        rtDumpPrintf(pfnPrintfV, pvUser, "%.*s", (size_t)cch, pch);
+                    else
+                        while (cch > 0)
+                        {
+                            if (RT_C_IS_PRINT(*pch))
+                                rtDumpPrintf(pfnPrintfV, pvUser, "%c", *pch);
+                            else
+                                rtDumpPrintf(pfnPrintfV, pvUser, "\\x%02x", *pch);
+                            cch--;
+                            pch++;
+                        }
+                }
+            }
+            else
+                rtDumpPrintf(pfnPrintfV, pvUser, "<not-string: uTag=%#x>", pAttrib->Value.u.Core.uTag);
+        }
+}
+
+
+static const char *rtCrX509CertPathsNodeGetSourceName(PRTCRX509CERTPATHNODE pNode)
+{
+    switch (pNode->uSrc)
+    {
+        case RTCRX509CERTPATHNODE_SRC_TARGET:           return "target";
+        case RTCRX509CERTPATHNODE_SRC_UNTRUSTED_ARRAY:  return "untrusted_array";
+        case RTCRX509CERTPATHNODE_SRC_UNTRUSTED_STORE:  return "untrusted_store";
+        case RTCRX509CERTPATHNODE_SRC_TRUSTED_STORE:    return "trusted_store";
+        case RTCRX509CERTPATHNODE_SRC_TRUSTED_CERT:     return "trusted_cert";
+        default:                                        return "invalid";
+    }
+}
+
+
+static void rtCrX509CertPathsDumpOneWorker(PRTCRX509CERTPATHSINT pThis, uint32_t iPath, PRTCRX509CERTPATHNODE pCurLeaf,
+                                           uint32_t uVerbosity, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+    rtDumpPrintf(pfnPrintfV, pvUser, "Path #%u: %s, %u deep, rcVerify=%Rrc\n",
+                 iPath, RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCurLeaf->uSrc) ? "trusted" : "untrusted", pCurLeaf->uDepth,
+                 pCurLeaf->rcVerify);
+
+    for (uint32_t iIndent = 2; pCurLeaf; iIndent += 2, pCurLeaf = pCurLeaf->pParent)
+    {
+        if (pCurLeaf->pCert)
+        {
+            rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Issuer : ");
+            rtCrX509NameDump(&pCurLeaf->pCert->TbsCertificate.Issuer, pfnPrintfV, pvUser);
+            rtDumpPrintf(pfnPrintfV, pvUser, "\n");
+
+            rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Subject: ");
+            rtCrX509NameDump(&pCurLeaf->pCert->TbsCertificate.Subject, pfnPrintfV, pvUser);
+            rtDumpPrintf(pfnPrintfV, pvUser, "\n");
+
+            if (uVerbosity >= 4)
+                RTAsn1Dump(&pCurLeaf->pCert->SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+            else if (uVerbosity >= 3)
+                RTAsn1Dump(&pCurLeaf->pCert->TbsCertificate.T3.Extensions.SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+        }
+        else
+        {
+            Assert(pCurLeaf->pCertCtx); Assert(pCurLeaf->pCertCtx->pTaInfo);
+            rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Subject: ");
+            rtCrX509NameDump(&pCurLeaf->pCertCtx->pTaInfo->CertPath.TaName, pfnPrintfV, pvUser);
+
+            if (uVerbosity >= 4)
+                RTAsn1Dump(&pCurLeaf->pCertCtx->pTaInfo->SeqCore.Asn1Core, 0, iIndent, pfnPrintfV, pvUser);
+        }
+
+        const char *pszSrc = rtCrX509CertPathsNodeGetSourceName(pCurLeaf);
+        rtDumpIndent(pfnPrintfV, pvUser, iIndent, "Source : %s\n", pszSrc);
+    }
+}
+
+
+RTDECL(int) RTCrX509CertPathsDumpOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t uVerbosity,
+                                     PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pfnPrintfV, VERR_INVALID_POINTER);
+    int rc;
+    if (iPath < pThis->cPaths)
+    {
+        PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+        if (pLeaf)
+        {
+            rtCrX509CertPathsDumpOneWorker(pThis, iPath, pLeaf, uVerbosity, pfnPrintfV, pvUser);
+            rc = VINF_SUCCESS;
+        }
+        else
+            rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR;
+    }
+    else
+        rc = VERR_NOT_FOUND;
+    return rc;
+}
+
+
+RTDECL(int) RTCrX509CertPathsDumpAll(RTCRX509CERTPATHS hCertPaths, uint32_t uVerbosity, PFNRTDUMPPRINTFV pfnPrintfV, void *pvUser)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pfnPrintfV, VERR_INVALID_POINTER);
+
+    /*
+     * Dump all the paths.
+     */
+    rtDumpPrintf(pfnPrintfV, pvUser, "%u paths, rc=%Rrc\n", pThis->cPaths, pThis->rc);
+    uint32_t iPath = 0;
+    PRTCRX509CERTPATHNODE pCurLeaf, pNextLeaf;
+    RTListForEachSafe(&pThis->LeafList, pCurLeaf, pNextLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+    {
+        rtCrX509CertPathsDumpOneWorker(pThis, iPath, pCurLeaf, uVerbosity, pfnPrintfV, pvUser);
+        iPath++;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/** @} */
+
+
+/** @name Path Validator Functions.
+ * @{
+ */
+
+
+static void *rtCrX509CpvAllocZ(PRTCRX509CERTPATHSINT pThis, size_t cb, const char *pszWhat)
+{
+    void *pv = RTMemAllocZ(cb);
+    if (!pv)
+        pThis->rc = RTErrInfoSetF(pThis->pErrInfo, VERR_NO_MEMORY, "Failed to allocate %zu bytes for %s", cb, pszWhat);
+    return pv;
+}
+
+
+DECL_NO_INLINE(static, bool) rtCrX509CpvFailed(PRTCRX509CERTPATHSINT pThis, int rc, const char *pszFormat, ...)
+{
+    va_list va;
+    va_start(va, pszFormat);
+    pThis->rc = RTErrInfoSetV(pThis->pErrInfo, rc, pszFormat, va);
+    va_end(va);
+    return false;
+}
+
+
+/**
+ * Adds a sequence of excluded sub-trees.
+ *
+ * Don't waste time optimizing the output if this is supposed to be a union.
+ * Unless the path is very long, it's a lot more work to optimize and the result
+ * will be the same anyway.
+ *
+ * @returns success indicator.
+ * @param   pThis               The validator instance.
+ * @param   pSubtrees           The sequence of sub-trees to add.
+ */
+static bool rtCrX509CpvAddExcludedSubtrees(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREES pSubtrees)
+{
+    if (((pThis->v.cExcludedSubtrees + 1) & 0xf) == 0)
+    {
+        void *pvNew = RTMemRealloc(pThis->v.papExcludedSubtrees,
+                                   (pThis->v.cExcludedSubtrees + 16) * sizeof(pThis->v.papExcludedSubtrees[0]));
+        if (RT_UNLIKELY(!pvNew))
+            return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Error growing subtrees pointer array to %u elements",
+                                     pThis->v.cExcludedSubtrees + 16);
+        pThis->v.papExcludedSubtrees = (PCRTCRX509GENERALSUBTREES *)pvNew;
+    }
+    pThis->v.papExcludedSubtrees[pThis->v.cExcludedSubtrees] = pSubtrees;
+    pThis->v.cExcludedSubtrees++;
+    return true;
+}
+
+
+/**
+ * Checks if a sub-tree is according to RFC-5280.
+ *
+ * @returns Success indiciator.
+ * @param   pThis               The validator instance.
+ * @param   pSubtree            The subtree to check.
+ */
+static bool rtCrX509CpvCheckSubtreeValidity(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREE pSubtree)
+{
+    if (   pSubtree->Base.enmChoice <= RTCRX509GENERALNAMECHOICE_INVALID
+        || pSubtree->Base.enmChoice >= RTCRX509GENERALNAMECHOICE_END)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_CHOICE,
+                                 "Unexpected GeneralSubtree choice %#x", pSubtree->Base.enmChoice);
+
+    if (RTAsn1Integer_UnsignedCompareWithU32(&pSubtree->Minimum, 0) != 0)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MIN,
+                                 "Unexpected GeneralSubtree Minimum value: %#llx",
+                                 pSubtree->Minimum.uValue);
+
+    if (RTAsn1Integer_IsPresent(&pSubtree->Maximum))
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNEXP_GENERAL_SUBTREE_MAX,
+                                 "Unexpected GeneralSubtree Maximum value: %#llx",
+                                 pSubtree->Maximum.uValue);
+
+    return true;
+}
+
+
+/**
+ * Grows the array of permitted sub-trees.
+ *
+ * @returns success indiciator.
+ * @param   pThis               The validator instance.
+ * @param   cAdding             The number of subtrees we should grow by
+ *                              (relative to the current number of valid
+ *                              entries).
+ */
+static bool rtCrX509CpvGrowPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, uint32_t cAdding)
+{
+    uint32_t cNew = RT_ALIGN_32(pThis->v.cPermittedSubtrees + cAdding, 16);
+    if (cNew > pThis->v.cPermittedSubtreesAlloc)
+    {
+        if (cNew >= _4K)
+            return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Too many permitted subtrees: %u (cur %u)",
+                                     cNew, pThis->v.cPermittedSubtrees);
+        void *pvNew = RTMemRealloc(pThis->v.papPermittedSubtrees, cNew * sizeof(pThis->v.papPermittedSubtrees[0]));
+        if (RT_UNLIKELY(!pvNew))
+            return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY, "Error growing subtrees pointer array from %u to %u elements",
+                                     pThis->v.cPermittedSubtreesAlloc, cNew);
+        pThis->v.papPermittedSubtrees = (PCRTCRX509GENERALSUBTREE *)pvNew;
+    }
+    return true;
+}
+
+
+/**
+ * Adds a sequence of permitted sub-trees.
+ *
+ * We store reference to each individual sub-tree because we must support
+ * intersection calculation.
+ *
+ * @returns success indiciator.
+ * @param   pThis               The validator instance.
+ * @param   cSubtrees           The number of sub-trees to add.
+ * @param   paSubtrees          Array of sub-trees to add.
+ */
+static bool rtCrX509CpvAddPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, uint32_t cSubtrees, PCRTCRX509GENERALSUBTREE paSubtrees)
+{
+    /*
+     * If the array is empty, assume no permitted names.
+     */
+    if (!cSubtrees)
+    {
+        pThis->v.fNoPermittedSubtrees = true;
+        return true;
+    }
+
+    /*
+     * Grow the array if necessary.
+     */
+    if (!rtCrX509CpvGrowPermittedSubtrees(pThis, cSubtrees))
+        return false;
+
+    /*
+     * Append each subtree to the array.
+     */
+    uint32_t iDst = pThis->v.cPermittedSubtrees;
+    for (uint32_t iSrc = 0; iSrc < cSubtrees; iSrc++)
+    {
+        if (!rtCrX509CpvCheckSubtreeValidity(pThis, &paSubtrees[iSrc]))
+            return false;
+        pThis->v.papPermittedSubtrees[iDst] = &paSubtrees[iSrc];
+        iDst++;
+    }
+    pThis->v.cPermittedSubtrees = iDst;
+
+    return true;
+}
+
+
+/**
+ * Calculates the intersection between @a pSubtrees and the current permitted
+ * sub-trees.
+ *
+ * @returns Success indicator.
+ * @param   pThis               The validator instance.
+ * @param   pSubtrees           The sub-tree sequence to intersect with.
+ */
+static bool rtCrX509CpvIntersectionPermittedSubtrees(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALSUBTREES pSubtrees)
+{
+    /*
+     * Deal with special cases first.
+     */
+    if (pThis->v.fNoPermittedSubtrees)
+    {
+        Assert(pThis->v.cPermittedSubtrees == 0);
+        return true;
+    }
+
+    uint32_t                    cRight  = pSubtrees->cItems;
+    PCRTCRX509GENERALSUBTREE    paRight = pSubtrees->paItems;
+    if (cRight == 0)
+    {
+        pThis->v.cPermittedSubtrees = 0;
+        pThis->v.fNoPermittedSubtrees = true;
+        return true;
+    }
+
+    uint32_t                    cLeft   = pThis->v.cPermittedSubtrees;
+    PCRTCRX509GENERALSUBTREE   *papLeft = pThis->v.papPermittedSubtrees;
+    if (!cLeft) /* first name constraint, no initial constraint */
+        return rtCrX509CpvAddPermittedSubtrees(pThis, cRight, paRight);
+
+    /*
+     * Create a new array with the intersection, freeing the old (left) array
+     * once we're done.
+     */
+    bool afRightTags[RTCRX509GENERALNAMECHOICE_END] = { 0, 0, 0, 0,  0, 0, 0, 0,  0 };
+
+    pThis->v.cPermittedSubtrees      = 0;
+    pThis->v.cPermittedSubtreesAlloc = 0;
+    pThis->v.papPermittedSubtrees    = NULL;
+
+    for (uint32_t iRight = 0; iRight < cRight; iRight++)
+    {
+        if (!rtCrX509CpvCheckSubtreeValidity(pThis, &paRight[iRight]))
+            return false;
+
+        RTCRX509GENERALNAMECHOICE const enmRightChoice = paRight[iRight].Base.enmChoice;
+        afRightTags[enmRightChoice] = true;
+
+        bool fHaveRight = false;
+        for (uint32_t iLeft = 0; iLeft < cLeft; iLeft++)
+            if (papLeft[iLeft]->Base.enmChoice == enmRightChoice)
+            {
+                if (RTCrX509GeneralSubtree_Compare(papLeft[iLeft], &paRight[iRight]) == 0)
+                {
+                    if (!fHaveRight)
+                    {
+                        fHaveRight = true;
+                        rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+                    }
+                }
+                else if (RTCrX509GeneralSubtree_ConstraintMatch(papLeft[iLeft], &paRight[iRight]))
+                {
+                    if (!fHaveRight)
+                    {
+                        fHaveRight = true;
+                        rtCrX509CpvAddPermittedSubtrees(pThis, 1, &paRight[iRight]);
+                    }
+                }
+                else if (RTCrX509GeneralSubtree_ConstraintMatch(&paRight[iRight], papLeft[iLeft]))
+                    rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+            }
+    }
+
+    /*
+     * Add missing types not specified in the right set.
+     */
+    for (uint32_t iLeft = 0; iLeft < cLeft; iLeft++)
+        if (!afRightTags[papLeft[iLeft]->Base.enmChoice])
+            rtCrX509CpvAddPermittedSubtrees(pThis, 1, papLeft[iLeft]);
+
+    /*
+     * If we ended up with an empty set, no names are permitted any more.
+     */
+    if (pThis->v.cPermittedSubtrees == 0)
+        pThis->v.fNoPermittedSubtrees = true;
+
+    RTMemFree(papLeft);
+    return RT_SUCCESS(pThis->rc);
+}
+
+
+/**
+ * Check if the given X.509 name is permitted by current name constraints.
+ *
+ * @returns true is permitteded, false if not (caller set error info).
+ * @param   pThis       The validator instance.
+ * @param   pName       The name to match.
+ */
+static bool rtCrX509CpvIsNamePermitted(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAME pName)
+{
+    uint32_t i = pThis->v.cPermittedSubtrees;
+    if (i == 0)
+        return !pThis->v.fNoPermittedSubtrees;
+
+    while (i-- > 0)
+    {
+        PCRTCRX509GENERALSUBTREE pConstraint = pThis->v.papPermittedSubtrees[i];
+        if (   RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pConstraint->Base)
+            && RTCrX509Name_ConstraintMatch(&pConstraint->Base.u.pT4->DirectoryName, pName))
+            return true;
+    }
+    return false;
+}
+
+
+/**
+ * Check if the given X.509 general name is permitted by current name
+ * constraints.
+ *
+ * @returns true is permitteded, false if not (caller sets error info).
+ * @param   pThis           The validator instance.
+ * @param   pGeneralName    The name to match.
+ */
+static bool rtCrX509CpvIsGeneralNamePermitted(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALNAME pGeneralName)
+{
+    uint32_t i = pThis->v.cPermittedSubtrees;
+    if (i == 0)
+        return !pThis->v.fNoPermittedSubtrees;
+
+    while (i-- > 0)
+        if (RTCrX509GeneralName_ConstraintMatch(&pThis->v.papPermittedSubtrees[i]->Base, pGeneralName))
+            return true;
+    return false;
+}
+
+
+/**
+ * Check if the given X.509 name is excluded by current name constraints.
+ *
+ * @returns true if excluded (caller sets error info), false if not explicitly
+ *          excluded.
+ * @param   pThis       The validator instance.
+ * @param   pName       The name to match.
+ */
+static bool rtCrX509CpvIsNameExcluded(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAME pName)
+{
+    uint32_t i = pThis->v.cExcludedSubtrees;
+    while (i-- > 0)
+    {
+        PCRTCRX509GENERALSUBTREES pSubTrees = pThis->v.papExcludedSubtrees[i];
+        uint32_t j = pSubTrees->cItems;
+        while (j-- > 0)
+            if (   RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pSubTrees->paItems[j].Base)
+                && RTCrX509Name_ConstraintMatch(&pSubTrees->paItems[j].Base.u.pT4->DirectoryName, pName))
+                return true;
+    }
+    return false;
+}
+
+
+/**
+ * Check if the given X.509 general name is excluded by current name
+ * constraints.
+ *
+ * @returns true if excluded (caller sets error info), false if not explicitly
+ *          excluded.
+ * @param   pThis           The validator instance.
+ * @param   pGeneralName    The name to match.
+ */
+static bool rtCrX509CpvIsGeneralNameExcluded(PRTCRX509CERTPATHSINT pThis, PCRTCRX509GENERALNAME pGeneralName)
+{
+    uint32_t i = pThis->v.cExcludedSubtrees;
+    while (i-- > 0)
+    {
+        PCRTCRX509GENERALSUBTREES pSubTrees = pThis->v.papExcludedSubtrees[i];
+        uint32_t j = pSubTrees->cItems;
+        while (j-- > 0)
+            if (RTCrX509GeneralName_ConstraintMatch(&pSubTrees->paItems[j].Base, pGeneralName))
+                return true;
+    }
+    return false;
+}
+
+
+/**
+ * Creates a new node and inserts it.
+ *
+ * @param   pThis           The path builder & validator instance.
+ * @param   pParent         The parent node. NULL for the root node.
+ * @param   iDepth          The tree depth to insert at.
+ * @param   pValidPolicy    The valid policy of the new node.
+ * @param   pQualifiers     The qualifiers of the new node.
+ * @param   pExpectedPolicy The (first) expected polcy of the new node.
+ */
+static bool rtCrX509CpvPolicyTreeInsertNew(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pParent, uint32_t iDepth,
+                                           PCRTASN1OBJID pValidPolicy, PCRTCRX509POLICYQUALIFIERINFOS pQualifiers,
+                                           PCRTASN1OBJID pExpectedPolicy)
+{
+    Assert(iDepth <= pThis->v.cNodes);
+
+    PRTCRX509CERTPATHSPOLICYNODE pNode;
+    pNode = (PRTCRX509CERTPATHSPOLICYNODE)rtCrX509CpvAllocZ(pThis, sizeof(*pNode), "policy tree node");
+    if (pNode)
+    {
+        pNode->pParent = pParent;
+        if (pParent)
+            RTListAppend(&pParent->ChildList, &pNode->SiblingEntry);
+        else
+        {
+            Assert(pThis->v.pValidPolicyTree == NULL);
+            pThis->v.pValidPolicyTree = pNode;
+            RTListInit(&pNode->SiblingEntry);
+        }
+        RTListInit(&pNode->ChildList);
+        RTListAppend(&pThis->v.paValidPolicyDepthLists[iDepth], &pNode->DepthEntry);
+
+        pNode->pValidPolicy = pValidPolicy;
+        pNode->pPolicyQualifiers = pQualifiers;
+        pNode->pExpectedPolicyFirst = pExpectedPolicy;
+        pNode->cMoreExpectedPolicySet = 0;
+        pNode->papMoreExpectedPolicySet = NULL;
+        return true;
+    }
+    return false;
+}
+
+
+/**
+ * Unlinks and frees a node in the valid policy tree.
+ *
+ * @param   pThis           The path builder & validator instance.
+ * @param   pNode           The node to destroy.
+ */
+static void rtCrX509CpvPolicyTreeDestroyNode(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pNode)
+{
+    Assert(RTListIsEmpty(&pNode->ChildList));
+    if (pNode->pParent)
+        RTListNodeRemove(&pNode->SiblingEntry);
+    else
+        pThis->v.pValidPolicyTree = NULL;
+    RTListNodeRemove(&pNode->DepthEntry);
+    pNode->pParent = NULL;
+
+    if (pNode->papMoreExpectedPolicySet)
+    {
+        RTMemFree(pNode->papMoreExpectedPolicySet);
+        pNode->papMoreExpectedPolicySet = NULL;
+    }
+    RTMemFree(pNode);
+}
+
+
+/**
+ * Unlinks and frees a sub-tree in the valid policy tree.
+ *
+ * @param   pThis           The path builder & validator instance.
+ * @param   pNode           The node that is the root of the subtree.
+ */
+static void rtCrX509CpvPolicyTreeDestroySubtree(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHSPOLICYNODE pNode)
+{
+    if (!RTListIsEmpty(&pNode->ChildList))
+    {
+        PRTCRX509CERTPATHSPOLICYNODE pCur = pNode;
+        do
+        {
+            Assert(!RTListIsEmpty(&pCur->ChildList));
+
+            /* Decend until we find a leaf. */
+            do
+                pCur = RTListGetFirst(&pCur->ChildList, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry);
+            while (!RTListIsEmpty(&pCur->ChildList));
+
+            /* Remove it and all leafy siblings. */
+            PRTCRX509CERTPATHSPOLICYNODE pParent = pCur->pParent;
+            do
+            {
+                Assert(pCur != pNode);
+                rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+                pCur = RTListGetFirst(&pParent->ChildList, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry);
+                if (!pCur)
+                {
+                    pCur = pParent;
+                    pParent = pParent->pParent;
+                }
+            } while (RTListIsEmpty(&pCur->ChildList) && pCur != pNode);
+        } while (pCur != pNode);
+    }
+
+    rtCrX509CpvPolicyTreeDestroyNode(pThis, pNode);
+}
+
+
+
+/**
+ * Destroys the entire policy tree.
+ *
+ * @param   pThis           The path builder & validator instance.
+ */
+static void rtCrX509CpvPolicyTreeDestroy(PRTCRX509CERTPATHSINT pThis)
+{
+    uint32_t i = pThis->v.cNodes + 1;
+    while (i-- > 0)
+    {
+        PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+        RTListForEachSafe(&pThis->v.paValidPolicyDepthLists[i], pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+        {
+            rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+        }
+    }
+}
+
+
+/**
+ * Removes all leaf nodes at level @a iDepth and above.
+ *
+ * @param   pThis           The path builder & validator instance.
+ * @param   iDepth          The depth to start pruning at.
+ */
+static void rtCrX509CpvPolicyTreePrune(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth)
+{
+    do
+    {
+        PRTLISTANCHOR pList = &pThis->v.paValidPolicyDepthLists[iDepth];
+        PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+        RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+        {
+            if (RTListIsEmpty(&pCur->ChildList))
+                rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+        }
+
+    } while (iDepth-- > 0);
+}
+
+
+/**
+ * Checks if @a pPolicy is the valid policy of a child of @a pNode.
+ *
+ * @returns true if in child node, false if not.
+ * @param   pNode           The node which children to check.
+ * @param   pPolicy         The valid policy to look for among the children.
+ */
+static bool rtCrX509CpvPolicyTreeIsChild(PRTCRX509CERTPATHSPOLICYNODE pNode, PCRTASN1OBJID pPolicy)
+{
+    PRTCRX509CERTPATHSPOLICYNODE pChild;
+    RTListForEach(&pNode->ChildList, pChild, RTCRX509CERTPATHSPOLICYNODE, SiblingEntry)
+    {
+        if (RTAsn1ObjId_Compare(pChild->pValidPolicy, pPolicy) == 0)
+            return true;
+    }
+    return true;
+}
+
+
+/**
+ * Prunes the valid policy tree according to the specified user policy set.
+ *
+ * @returns Pointer to the policy object from @a papPolicies if found, NULL if
+ *          no match.
+ * @param   pObjId          The object ID to locate at match in the set.
+ * @param   cPolicies       The number of policies in @a papPolicies.
+ * @param   papPolicies     The policy set to search.
+ */
+static PCRTASN1OBJID rtCrX509CpvFindObjIdInPolicySet(PCRTASN1OBJID pObjId, uint32_t cPolicies, PCRTASN1OBJID *papPolicies)
+{
+    uint32_t i = cPolicies;
+    while (i-- > 0)
+        if (RTAsn1ObjId_Compare(pObjId, papPolicies[i]) == 0)
+            return papPolicies[i];
+    return NULL;
+}
+
+
+/**
+ * Prunes the valid policy tree according to the specified user policy set.
+ *
+ * @returns success indicator (allocates memory)
+ * @param   pThis           The path builder & validator instance.
+ * @param   cPolicies       The number of policies in @a papPolicies.
+ * @param   papPolicies     The user initial policies.
+ */
+static bool rtCrX509CpvPolicyTreeIntersect(PRTCRX509CERTPATHSINT pThis, uint32_t cPolicies, PCRTASN1OBJID *papPolicies)
+{
+    /*
+     * 4.1.6.g.i - NULL tree remains NULL.
+     */
+    if (!pThis->v.pValidPolicyTree)
+        return true;
+
+    /*
+     * 4.1.6.g.ii - If the user set includes anyPolicy, the whole tree is the
+     *              result of the intersection.
+     */
+    uint32_t i = cPolicies;
+    while (i-- > 0)
+        if (RTAsn1ObjId_CompareWithString(papPolicies[i], RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+            return true;
+
+    /*
+     * 4.1.6.g.iii - Complicated.
+     */
+    PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+    PRTLISTANCHOR pList;
+
+    /* 1 & 2: Delete nodes which parent has valid policy == anyPolicy and which
+              valid policy is neither anyPolicy nor a member of papszPolicies.
+              While doing so, construct a set of unused user policies that
+              we'll replace anyPolicy nodes with in step 3. */
+    uint32_t        cPoliciesLeft   = 0;
+    PCRTASN1OBJID  *papPoliciesLeft = NULL;
+    if (cPolicies)
+    {
+        papPoliciesLeft = (PCRTASN1OBJID *)rtCrX509CpvAllocZ(pThis, cPolicies * sizeof(papPoliciesLeft[0]), "papPoliciesLeft");
+        if (!papPoliciesLeft)
+            return false;
+        for (i = 0; i < cPolicies; i++)
+            papPoliciesLeft[i] = papPolicies[i];
+    }
+
+    for (uint32_t iDepth = 1; iDepth <= pThis->v.cNodes; iDepth++)
+    {
+        pList = &pThis->v.paValidPolicyDepthLists[iDepth];
+        RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+        {
+            Assert(pCur->pParent);
+            if (   RTAsn1ObjId_CompareWithString(pCur->pParent->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0
+                && RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) != 0)
+            {
+                PCRTASN1OBJID pFound = rtCrX509CpvFindObjIdInPolicySet(pCur->pValidPolicy, cPolicies, papPolicies);
+                if (!pFound)
+                    rtCrX509CpvPolicyTreeDestroySubtree(pThis, pCur);
+                else
+                    for (i = 0; i < cPoliciesLeft; i++)
+                        if (papPoliciesLeft[i] == pFound)
+                        {
+                            cPoliciesLeft--;
+                            if (i < cPoliciesLeft)
+                                papPoliciesLeft[i] = papPoliciesLeft[cPoliciesLeft];
+                            papPoliciesLeft[cPoliciesLeft] = NULL;
+                            break;
+                        }
+            }
+        }
+    }
+
+    /*
+     * 4.1.5.g.iii.3 - Replace anyPolicy nodes on the final tree depth with
+     *                 the policies in papPoliciesLeft.
+     */
+    pList = &pThis->v.paValidPolicyDepthLists[pThis->v.cNodes];
+    RTListForEachSafe(pList, pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+    {
+        if (RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+        {
+            for (i = 0; i < cPoliciesLeft; i++)
+                rtCrX509CpvPolicyTreeInsertNew(pThis, pCur->pParent, pThis->v.cNodes - 1,
+                                               papPoliciesLeft[i], pCur->pPolicyQualifiers, papPoliciesLeft[i]);
+            rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+        }
+    }
+
+    RTMemFree(papPoliciesLeft);
+
+    /*
+     * 4.1.5.g.iii.4 - Prune the tree
+     */
+    rtCrX509CpvPolicyTreePrune(pThis, pThis->v.cNodes - 1);
+
+    return RT_SUCCESS(pThis->rc);
+}
+
+
+
+/**
+ * Frees the path validator state.
+ *
+ * @param   pThis           The path builder & validator instance.
+ */
+static void rtCrX509CpvCleanup(PRTCRX509CERTPATHSINT pThis)
+{
+    /*
+     * Destroy the policy tree and all its nodes.  We do this from the bottom
+     * up via the depth lists, saving annoying tree traversal.
+     */
+    if (pThis->v.paValidPolicyDepthLists)
+    {
+        rtCrX509CpvPolicyTreeDestroy(pThis);
+
+        RTMemFree(pThis->v.paValidPolicyDepthLists);
+        pThis->v.paValidPolicyDepthLists = NULL;
+    }
+
+    Assert(pThis->v.pValidPolicyTree == NULL);
+    pThis->v.pValidPolicyTree = NULL;
+
+    /*
+     * Destroy the name constraint arrays.
+     */
+    if (pThis->v.papPermittedSubtrees)
+    {
+        RTMemFree(pThis->v.papPermittedSubtrees);
+        pThis->v.papPermittedSubtrees = NULL;
+    }
+    pThis->v.cPermittedSubtrees = 0;
+    pThis->v.cPermittedSubtreesAlloc = 0;
+    pThis->v.fNoPermittedSubtrees = false;
+
+    if (pThis->v.papExcludedSubtrees)
+    {
+        RTMemFree(pThis->v.papExcludedSubtrees);
+        pThis->v.papExcludedSubtrees = NULL;
+    }
+    pThis->v.cExcludedSubtrees = 0;
+
+    /*
+     * Clear other pointers.
+     */
+    pThis->v.pWorkingIssuer              = NULL;
+    pThis->v.pWorkingPublicKey           = NULL;
+    pThis->v.pWorkingPublicKeyAlgorithm  = NULL;
+    pThis->v.pWorkingPublicKeyParameters = NULL;
+}
+
+
+
+/**
+ * Initializes the state.
+ *
+ * Caller must check pThis->rc.
+ *
+ * @param   pThis           The path builder & validator instance.
+ * @param   pTrustAnchor    The trust anchor node for the path that we're about
+ *                          to validate.
+ */
+static void rtCrX509CpvInit(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pTrustAnchor)
+{
+    rtCrX509CpvCleanup(pThis);
+
+    /*
+     * The node count does not include the trust anchor.
+     */
+    pThis->v.cNodes = pTrustAnchor->uDepth;
+
+    /*
+     * Valid policy tree starts with an anyPolicy node.
+     */
+    uint32_t i = pThis->v.cNodes + 1;
+    pThis->v.paValidPolicyDepthLists = (PRTLISTANCHOR)rtCrX509CpvAllocZ(pThis, i * sizeof(RTLISTANCHOR),
+                                                                        "paValidPolicyDepthLists");
+    if (RT_UNLIKELY(!pThis->v.paValidPolicyDepthLists))
+        return;
+    while (i-- > 0)
+        RTListInit(&pThis->v.paValidPolicyDepthLists[i]);
+
+    if (!rtCrX509CpvPolicyTreeInsertNew(pThis, NULL, 0 /* iDepth*/, &pThis->AnyPolicyObjId, NULL, &pThis->AnyPolicyObjId))
+        return;
+    Assert(!RTListIsEmpty(&pThis->v.paValidPolicyDepthLists[0])); Assert(pThis->v.pValidPolicyTree);
+
+    /*
+     * Name constrains.
+     */
+    if (pThis->pInitialPermittedSubtrees)
+        rtCrX509CpvAddPermittedSubtrees(pThis, pThis->pInitialPermittedSubtrees->cItems,
+                                        pThis->pInitialPermittedSubtrees->paItems);
+    if (pThis->pInitialExcludedSubtrees)
+        rtCrX509CpvAddExcludedSubtrees(pThis, pThis->pInitialExcludedSubtrees);
+
+    /*
+     * Counters.
+     */
+    pThis->v.cExplicitPolicy        = pThis->cInitialExplicitPolicy;
+    pThis->v.cInhibitPolicyMapping  = pThis->cInitialPolicyMappingInhibit;
+    pThis->v.cInhibitAnyPolicy      = pThis->cInitialInhibitAnyPolicy;
+    pThis->v.cMaxPathLength         = pThis->v.cNodes;
+
+    /*
+     * Certificate info from the trust anchor.
+     */
+    if (pTrustAnchor->pCert)
+    {
+        PCRTCRX509TBSCERTIFICATE const pTbsCert = &pTrustAnchor->pCert->TbsCertificate;
+        pThis->v.pWorkingIssuer                 = &pTbsCert->Subject;
+        pThis->v.pWorkingPublicKey              = &pTbsCert->SubjectPublicKeyInfo.SubjectPublicKey;
+        pThis->v.pWorkingPublicKeyAlgorithm     = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm;
+        pThis->v.pWorkingPublicKeyParameters    = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters;
+    }
+    else
+    {
+        Assert(pTrustAnchor->pCertCtx); Assert(pTrustAnchor->pCertCtx->pTaInfo);
+
+        PCRTCRTAFTRUSTANCHORINFO const  pTaInfo = pTrustAnchor->pCertCtx->pTaInfo;
+        pThis->v.pWorkingIssuer                 = &pTaInfo->CertPath.TaName;
+        pThis->v.pWorkingPublicKey              = &pTaInfo->PubKey.SubjectPublicKey;
+        pThis->v.pWorkingPublicKeyAlgorithm     = &pTaInfo->PubKey.Algorithm.Algorithm;
+        pThis->v.pWorkingPublicKeyParameters    = &pTaInfo->PubKey.Algorithm.Parameters;
+    }
+    if (   !RTASN1CORE_IS_PRESENT(&pThis->v.pWorkingPublicKeyParameters->u.Core)
+        || pThis->v.pWorkingPublicKeyParameters->enmType == RTASN1TYPE_NULL)
+        pThis->v.pWorkingPublicKeyParameters = NULL;
+}
+
+
+/**
+ * Step 6.1.3.a.
+ */
+static bool rtCrX509CpvCheckBasicCertInfo(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    /*
+     * 6.1.3.a.1 - Verify the certificate signature.
+     */
+    int rc = RTCrX509Certificate_VerifySignature(pNode->pCert, pThis->v.pWorkingPublicKeyAlgorithm,
+                                                 pThis->v.pWorkingPublicKeyParameters, pThis->v.pWorkingPublicKey,
+                                                 pThis->pErrInfo);
+    if (RT_FAILURE(rc))
+    {
+        pThis->rc = rc;
+        return false;
+    }
+
+    /*
+     * 6.1.3.a.2 - Verify that the certificate is valid at the specified time.
+     */
+    AssertCompile(sizeof(pThis->szTmp) >= 36 * 3);
+    if (!RTCrX509Validity_IsValidAtTimeSpec(&pNode->pCert->TbsCertificate.Validity, &pThis->ValidTime))
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_VALID_AT_TIME,
+                                 "Certificate is not valid (ValidTime=%s Validity=[%s...%s])",
+                                 RTTimeSpecToString(&pThis->ValidTime, &pThis->szTmp[0], 36),
+                                 RTTimeToString(&pNode->pCert->TbsCertificate.Validity.NotBefore.Time, &pThis->szTmp[36], 36),
+                                 RTTimeToString(&pNode->pCert->TbsCertificate.Validity.NotAfter.Time,  &pThis->szTmp[2*36], 36) );
+
+    /*
+     * 6.1.3.a.3 - Verified that the certficiate is not revoked.
+     */
+    /** @todo rainy day. */
+
+    /*
+     * 6.1.3.a.4 - Check the issuer name.
+     */
+    if (!RTCrX509Name_MatchByRfc5280(&pNode->pCert->TbsCertificate.Issuer, pThis->v.pWorkingIssuer))
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_ISSUER_MISMATCH, "Issuer mismatch");
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.3.b-c.
+ */
+static bool rtCrX509CpvCheckNameConstraints(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    if (pThis->v.fNoPermittedSubtrees)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_PERMITTED_NAMES, "No permitted subtrees");
+
+    if (   pNode->pCert->TbsCertificate.Subject.cItems > 0
+        && (   !rtCrX509CpvIsNamePermitted(pThis, &pNode->pCert->TbsCertificate.Subject)
+            || rtCrX509CpvIsNameExcluded(pThis, &pNode->pCert->TbsCertificate.Subject)) )
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NAME_NOT_PERMITTED,
+                                 "Subject name is not permitted by current name constraints");
+
+    PCRTCRX509GENERALNAMES pAltSubjectName = pNode->pCert->TbsCertificate.T3.pAltSubjectName;
+    if (pAltSubjectName)
+    {
+        uint32_t i = pAltSubjectName->cItems;
+        while (i-- > 0)
+            if (   !rtCrX509CpvIsGeneralNamePermitted(pThis, &pAltSubjectName->paItems[i])
+                || rtCrX509CpvIsGeneralNameExcluded(pThis, &pAltSubjectName->paItems[i]))
+                return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_ALT_NAME_NOT_PERMITTED,
+                                         "Alternative name #%u is is not permitted by current name constraints", i);
+    }
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.3.d-f.
+ */
+static bool rtCrX509CpvWorkValidPolicyTree(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth, PRTCRX509CERTPATHNODE pNode,
+                                           bool fSelfIssued)
+{
+    PCRTCRX509CERTIFICATEPOLICIES pPolicies = pNode->pCert->TbsCertificate.T3.pCertificatePolicies;
+    if (pPolicies)
+    {
+        /*
+         * 6.1.3.d.1 - Work the certiciate policies into the tree.
+         */
+        PRTCRX509CERTPATHSPOLICYNODE    pCur;
+        PRTLISTANCHOR                   pListAbove  = &pThis->v.paValidPolicyDepthLists[iDepth - 1];
+        uint32_t                        iAnyPolicy  = UINT32_MAX;
+        uint32_t                        i           = pPolicies->cItems;
+        while (i-- > 0)
+        {
+            PCRTCRX509POLICYQUALIFIERINFOS const    pQualifiers = &pPolicies->paItems[i].PolicyQualifiers;
+            PCRTASN1OBJID const                     pIdP        = &pPolicies->paItems[i].PolicyIdentifier;
+            if (RTAsn1ObjId_CompareWithString(pIdP, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+            {
+                iAnyPolicy++;
+                continue;
+            }
+
+            /*
+             * 6.1.3.d.1.i - Create children for matching policies.
+             */
+            uint32_t cMatches = 0;
+            RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+            {
+                bool fMatch = RTAsn1ObjId_Compare(pCur->pExpectedPolicyFirst, pIdP) == 0;
+                if (!fMatch && pCur->cMoreExpectedPolicySet)
+                    for (uint32_t j = 0; !fMatch && j < pCur->cMoreExpectedPolicySet; j++)
+                        fMatch = RTAsn1ObjId_Compare(pCur->papMoreExpectedPolicySet[j], pIdP) == 0;
+                if (fMatch)
+                {
+                    if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pIdP, pQualifiers, pIdP))
+                        return false;
+                    cMatches++;
+                }
+            }
+
+            /*
+             * 6.1.3.d.1.ii - If no matches above do the same for anyPolicy
+             *                nodes, only match with valid policy this time.
+             */
+            if (cMatches == 0)
+            {
+                RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+                {
+                    if (RTAsn1ObjId_CompareWithString(pCur->pExpectedPolicyFirst, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+                    {
+                        if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pIdP, pQualifiers, pIdP))
+                            return false;
+                    }
+                }
+            }
+        }
+
+        /*
+         * 6.1.3.d.2 - If anyPolicy present, make sure all expected policies
+         *             are propagated to the current depth.
+         */
+        if (   iAnyPolicy < pPolicies->cItems
+            && (   pThis->v.cInhibitAnyPolicy > 0
+                || (pNode->pParent && fSelfIssued) ) )
+        {
+            PCRTCRX509POLICYQUALIFIERINFOS pApQ = &pPolicies->paItems[iAnyPolicy].PolicyQualifiers;
+            RTListForEach(pListAbove, pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+            {
+                if (!rtCrX509CpvPolicyTreeIsChild(pCur, pCur->pExpectedPolicyFirst))
+                    rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pCur->pExpectedPolicyFirst, pApQ,
+                                                   pCur->pExpectedPolicyFirst);
+                for (uint32_t j = 0; j < pCur->cMoreExpectedPolicySet; j++)
+                    if (!rtCrX509CpvPolicyTreeIsChild(pCur, pCur->papMoreExpectedPolicySet[j]))
+                        rtCrX509CpvPolicyTreeInsertNew(pThis, pCur, iDepth, pCur->papMoreExpectedPolicySet[j], pApQ,
+                                                       pCur->papMoreExpectedPolicySet[j]);
+            }
+        }
+        /*
+         * 6.1.3.d.3 - Prune the tree.
+         */
+        else
+            rtCrX509CpvPolicyTreePrune(pThis, iDepth - 1);
+    }
+    else
+    {
+        /*
+         * 6.1.3.e - No policy extension present, set tree to NULL.
+         */
+        rtCrX509CpvPolicyTreeDestroy(pThis);
+    }
+
+    /*
+     * 6.1.3.f - NULL tree check.
+     */
+    if (   pThis->v.pValidPolicyTree == NULL
+        && pThis->v.cExplicitPolicy == 0)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_VALID_POLICY,
+                                 "An explicit policy is called for but the valid policy tree is NULL.");
+    return RT_SUCCESS(pThis->rc);
+}
+
+
+/**
+ * Step 6.1.4.a-b.
+ */
+static bool rtCrX509CpvSoakUpPolicyMappings(PRTCRX509CERTPATHSINT pThis, uint32_t iDepth,
+                                            PCRTCRX509POLICYMAPPINGS pPolicyMappings)
+{
+    /*
+     * 6.1.4.a - The anyPolicy is not allowed in policy mappings as it would
+     *           allow an evil intermediate certificate to expand the policy
+     *           scope of a certiciate chain without regard to upstream.
+     */
+    uint32_t i = pPolicyMappings->cItems;
+    while (i-- > 0)
+    {
+        if (RTAsn1ObjId_CompareWithString(&pPolicyMappings->paItems[i].IssuerDomainPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+            return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_INVALID_POLICY_MAPPING,
+                                     "Invalid policy mapping %#u: IssuerDomainPolicy is anyPolicy.", i);
+
+        if (RTAsn1ObjId_CompareWithString(&pPolicyMappings->paItems[i].SubjectDomainPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+            return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_INVALID_POLICY_MAPPING,
+                                     "Invalid policy mapping %#u: SubjectDomainPolicy is anyPolicy.", i);
+    }
+
+    PRTCRX509CERTPATHSPOLICYNODE pCur, pNext;
+    if (pThis->v.cInhibitPolicyMapping > 0)
+    {
+        /*
+         * 6.1.4.b.1 - Do the policy mapping.
+         */
+        i = pPolicyMappings->cItems;
+        while (i-- > 0)
+        {
+            uint32_t cFound = 0;
+            RTListForEach(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+            {
+                if (RTAsn1ObjId_Compare(pCur->pValidPolicy, &pPolicyMappings->paItems[i].IssuerDomainPolicy))
+                {
+                    if (!pCur->fAlreadyMapped)
+                    {
+                        pCur->fAlreadyMapped = true;
+                        pCur->pExpectedPolicyFirst = &pPolicyMappings->paItems[i].SubjectDomainPolicy;
+                    }
+                    else
+                    {
+                        uint32_t iExpected = pCur->cMoreExpectedPolicySet;
+                        void *pvNew = RTMemRealloc(pCur->papMoreExpectedPolicySet,
+                                                   sizeof(pCur->papMoreExpectedPolicySet[0]) * (iExpected + 1));
+                        if (!pvNew)
+                            return rtCrX509CpvFailed(pThis, VERR_NO_MEMORY,
+                                                     "Error growing papMoreExpectedPolicySet array (cur %u, depth %u)",
+                                                     pCur->cMoreExpectedPolicySet, iDepth);
+                        pCur->papMoreExpectedPolicySet = (PCRTASN1OBJID *)pvNew;
+                        pCur->papMoreExpectedPolicySet[iExpected] = &pPolicyMappings->paItems[i].SubjectDomainPolicy;
+                        pCur->cMoreExpectedPolicySet = iExpected  + 1;
+                    }
+                    cFound++;
+                }
+            }
+
+            /*
+             * If no mapping took place, look for an anyPolicy node.
+             */
+            if (!cFound)
+            {
+                RTListForEach(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+                {
+                    if (RTAsn1ObjId_CompareWithString(pCur->pValidPolicy, RTCRX509_ID_CE_CP_ANY_POLICY_OID) == 0)
+                    {
+                        if (!rtCrX509CpvPolicyTreeInsertNew(pThis, pCur->pParent, iDepth,
+                                                            &pPolicyMappings->paItems[i].IssuerDomainPolicy,
+                                                            pCur->pPolicyQualifiers,
+                                                            &pPolicyMappings->paItems[i].SubjectDomainPolicy))
+                            return false;
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        /*
+         * 6.1.4.b.2 - Remove matching policies from the tree if mapping is
+         *             inhibited and prune the tree.
+         */
+        uint32_t cRemoved = 0;
+        i = pPolicyMappings->cItems;
+        while (i-- > 0)
+        {
+            RTListForEachSafe(&pThis->v.paValidPolicyDepthLists[iDepth], pCur, pNext, RTCRX509CERTPATHSPOLICYNODE, DepthEntry)
+            {
+                if (RTAsn1ObjId_Compare(pCur->pValidPolicy, &pPolicyMappings->paItems[i].IssuerDomainPolicy))
+                {
+                    rtCrX509CpvPolicyTreeDestroyNode(pThis, pCur);
+                    cRemoved++;
+                }
+            }
+        }
+        if (cRemoved)
+            rtCrX509CpvPolicyTreePrune(pThis, iDepth - 1);
+    }
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.4.d-f & 6.1.5.c-e.
+ */
+static void rtCrX509CpvSetWorkingPublicKeyInfo(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+
+    /*
+     * 6.1.4.d - The public key.
+     */
+    pThis->v.pWorkingPublicKey = &pTbsCert->SubjectPublicKeyInfo.SubjectPublicKey;
+
+    /*
+     * 6.1.4.e - The public key parameters.  Use new ones if present, keep old
+     *           if the algorithm remains the same.
+     */
+    if (   RTASN1CORE_IS_PRESENT(&pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters.u.Core)
+        && pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters.enmType != RTASN1TYPE_NULL)
+        pThis->v.pWorkingPublicKeyParameters = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Parameters;
+    else if (   pThis->v.pWorkingPublicKeyParameters
+             && RTAsn1ObjId_Compare(pThis->v.pWorkingPublicKeyAlgorithm, &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm) != 0)
+        pThis->v.pWorkingPublicKeyParameters = NULL;
+
+    /*
+     * 6.1.4.f - The public algorithm.
+     */
+    pThis->v.pWorkingPublicKeyAlgorithm = &pTbsCert->SubjectPublicKeyInfo.Algorithm.Algorithm;
+}
+
+
+/**
+ * Step 6.1.4.g.
+ */
+static bool rtCrX509CpvSoakUpNameConstraints(PRTCRX509CERTPATHSINT pThis, PCRTCRX509NAMECONSTRAINTS pNameConstraints)
+{
+    if (pNameConstraints->T0.PermittedSubtrees.cItems > 0)
+        if (!rtCrX509CpvIntersectionPermittedSubtrees(pThis, &pNameConstraints->T0.PermittedSubtrees))
+            return false;
+
+    if (pNameConstraints->T1.ExcludedSubtrees.cItems > 0)
+        if (!rtCrX509CpvAddExcludedSubtrees(pThis, &pNameConstraints->T1.ExcludedSubtrees))
+            return false;
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.4.i.
+ */
+static bool rtCrX509CpvSoakUpPolicyConstraints(PRTCRX509CERTPATHSINT pThis, PCRTCRX509POLICYCONSTRAINTS pPolicyConstraints)
+{
+    if (RTAsn1Integer_IsPresent(&pPolicyConstraints->RequireExplicitPolicy))
+    {
+        if (RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->RequireExplicitPolicy, pThis->v.cExplicitPolicy) < 0)
+            pThis->v.cExplicitPolicy = pPolicyConstraints->RequireExplicitPolicy.uValue.s.Lo;
+    }
+
+    if (RTAsn1Integer_IsPresent(&pPolicyConstraints->InhibitPolicyMapping))
+    {
+        if (RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->InhibitPolicyMapping, pThis->v.cInhibitPolicyMapping) < 0)
+            pThis->v.cInhibitPolicyMapping = pPolicyConstraints->InhibitPolicyMapping.uValue.s.Lo;
+    }
+    return true;
+}
+
+
+/**
+ * Step 6.1.4.j.
+ */
+static bool rtCrX509CpvSoakUpInhibitAnyPolicy(PRTCRX509CERTPATHSINT pThis, PCRTASN1INTEGER pInhibitAnyPolicy)
+{
+    if (RTAsn1Integer_UnsignedCompareWithU32(pInhibitAnyPolicy, pThis->v.cInhibitAnyPolicy) < 0)
+        pThis->v.cInhibitAnyPolicy = pInhibitAnyPolicy->uValue.s.Lo;
+    return true;
+}
+
+
+/**
+ * Steps 6.1.4.k, 6.1.4.l, 6.1.4.m, and 6.1.4.n.
+ */
+static bool rtCrX509CpvCheckAndSoakUpBasicConstraintsAndKeyUsage(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode,
+                                                                 bool fSelfIssued)
+{
+    /* 6.1.4.k - If basic constraints present, CA must be set. */
+    if (RTAsn1Integer_UnsignedCompareWithU32(&pNode->pCert->TbsCertificate.T0.Version, RTCRX509TBSCERTIFICATE_V3) != 0)
+    {
+        /* Note! Add flags if support for older certificates is needed later. */
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_V3_CERT,
+                                 "Only version 3 certificates are supported (Version=%llu)",
+                                 pNode->pCert->TbsCertificate.T0.Version.uValue);
+    }
+    PCRTCRX509BASICCONSTRAINTS pBasicConstraints = pNode->pCert->TbsCertificate.T3.pBasicConstraints;
+    if (pBasicConstraints)
+    {
+        if (!pBasicConstraints->CA.fValue)
+            return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NOT_CA_CERT,
+                                     "Intermediate certificate (#%u) is not marked as a CA", pThis->v.iNode);
+    }
+
+    /* 6.1.4.l - Work cMaxPathLength. */
+    if (!fSelfIssued)
+    {
+        if (pThis->v.cMaxPathLength > 0)
+            pThis->v.cMaxPathLength--;
+        else
+            return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_MAX_PATH_LENGTH,
+                                     "Hit max path length at node #%u", pThis->v.iNode);
+    }
+
+    /* 6.1.4.m - Update cMaxPathLength if basic constrain field is present and smaller. */
+    if (pBasicConstraints)
+    {
+        if (RTAsn1Integer_IsPresent(&pBasicConstraints->PathLenConstraint))
+            if (RTAsn1Integer_UnsignedCompareWithU32(&pBasicConstraints->PathLenConstraint, pThis->v.cMaxPathLength) < 0)
+                pThis->v.cMaxPathLength = pBasicConstraints->PathLenConstraint.uValue.s.Lo;
+    }
+
+    /* 6.1.4.n - Require keyCertSign in key usage if the extension is present. */
+    PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+    if (   (pTbsCert->T3.fFlags     & RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE)
+        && !(pTbsCert->T3.fKeyUsage & RTCRX509CERT_KEY_USAGE_F_KEY_CERT_SIGN))
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_MISSING_KEY_CERT_SIGN,
+                                 "Node #%u does not have KeyCertSign set (keyUsage=%#x)",
+                                 pThis->v.iNode, pTbsCert->T3.fKeyUsage);
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.4.o - check out critical extensions.
+ */
+static bool rtCrX509CpvCheckCriticalExtensions(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    uint32_t                cLeft = pNode->pCert->TbsCertificate.T3.Extensions.cItems;
+    PCRTCRX509EXTENSION     pCur  = pNode->pCert->TbsCertificate.T3.Extensions.paItems;
+    while (cLeft-- > 0)
+    {
+        if (pCur->Critical.fValue)
+        {
+            if (   RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) != 0
+                && RTAsn1ObjId_CompareWithString(&pCur->ExtnId, RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID) != 0
+               )
+                return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_UNKNOWN_CRITICAL_EXTENSION,
+                                         "Node #%u has an unknown critical extension: %s", pThis->v.iNode, pCur->ExtnId.szObjId);
+        }
+
+        pCur++;
+    }
+
+    return true;
+}
+
+
+/**
+ * Step 6.1.5 - The wrapping up.
+ */
+static bool rtCrX509CpvWrapUp(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pNode)
+{
+    Assert(!pNode->pParent); Assert(pThis->pTarget == pNode->pCert);
+
+    /*
+     * 6.1.5.a - Decrement explicit policy.
+     */
+    if (pThis->v.cExplicitPolicy > 0)
+        pThis->v.cExplicitPolicy--;
+
+    /*
+     * 6.1.5.b - Policy constraints and explicit policy.
+     */
+    PCRTCRX509POLICYCONSTRAINTS pPolicyConstraints = pNode->pCert->TbsCertificate.T3.pPolicyConstraints;
+    if (   pPolicyConstraints
+        && RTAsn1Integer_IsPresent(&pPolicyConstraints->RequireExplicitPolicy)
+        && RTAsn1Integer_UnsignedCompareWithU32(&pPolicyConstraints->RequireExplicitPolicy, 0) == 0)
+        pThis->v.cExplicitPolicy = 0;
+
+    /*
+     * 6.1.5.c-e - Update working public key info.
+     */
+    rtCrX509CpvSetWorkingPublicKeyInfo(pThis, pNode);
+
+    /*
+     * 6.1.5.f - Critical extensions.
+     */
+    if (!rtCrX509CpvCheckCriticalExtensions(pThis, pNode))
+        return false;
+
+    /*
+     * 6.1.5.g - Calculate the intersection between the user initial policy set
+     *           and the valid policy tree.
+     */
+    rtCrX509CpvPolicyTreeIntersect(pThis, pThis->cInitialUserPolicySet, pThis->papInitialUserPolicySet);
+
+    if (   pThis->v.cExplicitPolicy == 0
+        && pThis->v.pValidPolicyTree == NULL)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CPV_NO_VALID_POLICY, "No valid policy (wrap-up).");
+
+    return true;
+}
+
+
+/**
+ * Worker that validates one path.
+ *
+ * This implements the the algorithm in RFC-5280, section 6.1, with exception of
+ * the CRL checks in 6.1.3.a.3.
+ *
+ * @returns success indicator.
+ * @param   pThis           The path builder & validator instance.
+ * @param   pTrustAnchor    The trust anchor node.
+ */
+static bool rtCrX509CpvOneWorker(PRTCRX509CERTPATHSINT pThis, PRTCRX509CERTPATHNODE pTrustAnchor)
+{
+    /*
+     * Special case, target certificate is trusted.
+     */
+    if (!pTrustAnchor->pParent)
+        return rtCrX509CpvFailed(pThis, VERR_CR_X509_CERTPATHS_INTERNAL_ERROR, "Target certificate is trusted.");
+
+    /*
+     * Normal processing.
+     */
+    rtCrX509CpvInit(pThis, pTrustAnchor);
+    if (RT_SUCCESS(pThis->rc))
+    {
+        PRTCRX509CERTPATHNODE   pNode = pTrustAnchor->pParent;
+        uint32_t                iNode = pThis->v.iNode = 1; /* We count to cNode (inclusive).  Same a validation tree depth. */
+        while (pNode && RT_SUCCESS(pThis->rc))
+        {
+            /*
+             * Basic certificate processing.
+             */
+            if (!rtCrX509CpvCheckBasicCertInfo(pThis, pNode))                                           /* Step 6.1.3.a */
+                break;
+
+            bool const fSelfIssued = rtCrX509CertPathsIsSelfIssued(pNode);
+            if (!fSelfIssued || !pNode->pParent)                                                        /* Step 6.1.3.b-c */
+                if (!rtCrX509CpvCheckNameConstraints(pThis, pNode))
+                    break;
+
+            if (!rtCrX509CpvWorkValidPolicyTree(pThis, iNode, pNode, fSelfIssued))                      /* Step 6.1.3.d-f */
+                break;
+
+            /*
+             * If it's the last certificate in the path, do wrap-ups.
+             */
+            if (!pNode->pParent)                                                                         /* Step 6.1.5 */
+            {
+                Assert(iNode == pThis->v.cNodes);
+                if (!rtCrX509CpvWrapUp(pThis, pNode))
+                    break;
+                AssertRCBreak(pThis->rc);
+                return true;
+            }
+
+            /*
+             * Preparations for the next certificate.
+             */
+            PCRTCRX509TBSCERTIFICATE const pTbsCert = &pNode->pCert->TbsCertificate;
+            if (   pTbsCert->T3.pPolicyMappings
+                && !rtCrX509CpvSoakUpPolicyMappings(pThis, iNode, pTbsCert->T3.pPolicyMappings))        /* Step 6.1.4.a-b */
+                break;
+
+            pThis->v.pWorkingIssuer = &pTbsCert->Subject;                                               /* Step 6.1.4.c */
+
+            rtCrX509CpvSetWorkingPublicKeyInfo(pThis, pNode);                                           /* Step 6.1.4.d-f */
+
+            if (   pTbsCert->T3.pNameConstraints                                                        /* Step 6.1.4.g */
+                && !rtCrX509CpvSoakUpNameConstraints(pThis, pTbsCert->T3.pNameConstraints))
+                break;
+
+            if (!fSelfIssued)                                                                           /* Step 6.1.4.h */
+            {
+                if (pThis->v.cExplicitPolicy > 0)
+                    pThis->v.cExplicitPolicy--;
+                if (pThis->v.cInhibitPolicyMapping > 0)
+                    pThis->v.cInhibitPolicyMapping--;
+                if (pThis->v.cInhibitAnyPolicy > 0)
+                    pThis->v.cInhibitAnyPolicy--;
+            }
+
+            if (   pTbsCert->T3.pPolicyConstraints                                                      /* Step 6.1.4.j */
+                && !rtCrX509CpvSoakUpPolicyConstraints(pThis, pTbsCert->T3.pPolicyConstraints))
+                break;
+
+            if (   pTbsCert->T3.pInhibitAnyPolicy                                                       /* Step 6.1.4.j */
+                && !rtCrX509CpvSoakUpInhibitAnyPolicy(pThis, pTbsCert->T3.pInhibitAnyPolicy))
+                break;
+
+            if (!rtCrX509CpvCheckAndSoakUpBasicConstraintsAndKeyUsage(pThis, pNode, fSelfIssued))       /* Step 6.1.4.k-n */
+                break;
+
+            if (!rtCrX509CpvCheckCriticalExtensions(pThis, pNode))                                      /* Step 6.1.4.o */
+                break;
+
+            /*
+             * Advance to the next certificate.
+             */
+            pNode = pNode->pParent;
+            pThis->v.iNode = ++iNode;
+        }
+        AssertStmt(RT_FAILURE_NP(pThis->rc), pThis->rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR);
+    }
+    return false;
+}
+
+
+RTDECL(int) RTCrX509CertPathsValidateOne(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, PRTERRINFO pErrInfo)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pThis->pRoot, VERR_INVALID_PARAMETER);
+    AssertReturn(pThis->rc == VINF_SUCCESS, VERR_INVALID_PARAMETER);
+
+    /*
+     * Locate the path and validate it.
+     */
+    int rc;
+    if (iPath < pThis->cPaths)
+    {
+        PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+        if (pLeaf)
+        {
+            if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pLeaf->uSrc))
+            {
+                pThis->pErrInfo = pErrInfo;
+                rtCrX509CpvOneWorker(pThis, pLeaf);
+                pThis->pErrInfo = NULL;
+                rc = pThis->rc;
+                pThis->rc = VINF_SUCCESS;
+            }
+            else
+                rc = RTErrInfoSetF(pErrInfo, VERR_CR_X509_NO_TRUST_ANCHOR, "Path #%u is does not have a trust anchor: uSrc=%s",
+                                   iPath, rtCrX509CertPathsNodeGetSourceName(pLeaf));
+            pLeaf->rcVerify = rc;
+        }
+        else
+            rc = VERR_CR_X509_CERTPATHS_INTERNAL_ERROR;
+    }
+    else
+        rc = VERR_NOT_FOUND;
+    return rc;
+}
+
+
+RTDECL(int) RTCrX509CertPathsValidateAll(RTCRX509CERTPATHS hCertPaths, uint32_t *pcValidPaths, PRTERRINFO pErrInfo)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertReturn(!(pThis->fFlags & ~RTCRX509CERTPATHSINT_F_VALID_MASK), VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pThis->pTarget, VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pThis->pRoot, VERR_INVALID_PARAMETER);
+    AssertReturn(pThis->rc == VINF_SUCCESS, VERR_INVALID_PARAMETER);
+    AssertPtrNullReturn(pcValidPaths, VERR_INVALID_POINTER);
+
+    /*
+     * Validate the paths.
+     */
+    pThis->pErrInfo = pErrInfo;
+
+    int      rcLastFailure = VINF_SUCCESS;
+    uint32_t cValidPaths   = 0;
+    uint32_t iPath         = 0;
+    PRTCRX509CERTPATHNODE pCurLeaf;
+    RTListForEach(&pThis->LeafList, pCurLeaf, RTCRX509CERTPATHNODE, ChildListOrLeafEntry)
+    {
+        if (RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pCurLeaf->uSrc))
+        {
+            rtCrX509CpvOneWorker(hCertPaths, pCurLeaf);
+            if (RT_SUCCESS(pThis->rc))
+                cValidPaths++;
+            else
+                rcLastFailure = pThis->rc;
+            pCurLeaf->rcVerify = pThis->rc;
+            pThis->rc = VINF_SUCCESS;
+        }
+        else
+            pCurLeaf->rcVerify = VERR_CR_X509_NO_TRUST_ANCHOR;
+    }
+
+    pThis->pErrInfo = NULL;
+
+    if (pcValidPaths)
+        *pcValidPaths = cValidPaths;
+    if (cValidPaths > 0)
+        return VINF_SUCCESS;
+    if (RT_SUCCESS_NP(rcLastFailure))
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CPV_NO_TRUSTED_PATHS,
+                             "None of the %u path(s) have a trust anchor.", pThis->cPaths);
+    return rcLastFailure;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathCount(RTCRX509CERTPATHS hCertPaths)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+    AssertPtrReturn(pThis->pRoot, UINT32_MAX);
+
+    /*
+     * Return data.
+     */
+    return pThis->cPaths;
+}
+
+
+RTDECL(int)  RTCrX509CertPathsQueryPathInfo(RTCRX509CERTPATHS hCertPaths, uint32_t iPath,
+                                            bool *pfTrusted, uint32_t *pcNodes, PCRTCRX509NAME *ppSubject,
+                                            PCRTCRX509SUBJECTPUBLICKEYINFO *ppPublicKeyInfo,
+                                            PCRTCRX509CERTIFICATE *ppCert, PCRTCRCERTCTX *ppCertCtx,
+                                            int *prcVerify)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pThis->pRoot, VERR_WRONG_ORDER);
+    AssertReturn(iPath < pThis->cPaths, VERR_NOT_FOUND);
+
+    /*
+     * Get the data.
+     */
+    PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+    AssertReturn(pLeaf, VERR_CR_X509_INTERNAL_ERROR);
+
+    if (pfTrusted)
+        *pfTrusted = RTCRX509CERTPATHNODE_SRC_IS_TRUSTED(pLeaf->uSrc);
+
+    if (pcNodes)
+        *pcNodes = pLeaf->uDepth + 1; /* Includes both trust anchor and target. */
+
+    if (ppSubject)
+        *ppSubject = pLeaf->pCert ? &pLeaf->pCert->TbsCertificate.Subject : &pLeaf->pCertCtx->pTaInfo->CertPath.TaName;
+
+    if (ppPublicKeyInfo)
+        *ppPublicKeyInfo = pLeaf->pCert ? &pLeaf->pCert->TbsCertificate.SubjectPublicKeyInfo : &pLeaf->pCertCtx->pTaInfo->PubKey;
+
+    if (ppCert)
+        *ppCert = pLeaf->pCert;
+
+    if (ppCertCtx)
+    {
+        if (pLeaf->pCertCtx)
+        {
+            uint32_t cRefs = RTCrCertCtxRetain(pLeaf->pCertCtx);
+            AssertReturn(cRefs != UINT32_MAX, VERR_CR_X509_INTERNAL_ERROR);
+        }
+        *ppCertCtx = pLeaf->pCertCtx;
+    }
+
+    if (prcVerify)
+        *prcVerify = pLeaf->rcVerify;
+
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(uint32_t) RTCrX509CertPathsGetPathLength(RTCRX509CERTPATHS hCertPaths, uint32_t iPath)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, UINT32_MAX);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, UINT32_MAX);
+    AssertPtrReturn(pThis->pRoot, UINT32_MAX);
+    AssertReturn(iPath < pThis->cPaths, UINT32_MAX);
+
+    /*
+     * Get the data.
+     */
+    PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+    AssertReturn(pLeaf, UINT32_MAX);
+    return pLeaf->uDepth + 1;
+}
+
+
+RTDECL(int) RTCrX509CertPathsGetPathVerifyResult(RTCRX509CERTPATHS hCertPaths, uint32_t iPath)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pThis->pRoot, VERR_WRONG_ORDER);
+    AssertReturn(iPath < pThis->cPaths, VERR_NOT_FOUND);
+
+    /*
+     * Get the data.
+     */
+    PRTCRX509CERTPATHNODE pLeaf = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+    AssertReturn(pLeaf, VERR_CR_X509_INTERNAL_ERROR);
+
+    return pLeaf->rcVerify;
+}
+
+
+static PRTCRX509CERTPATHNODE rtCrX509CertPathsGetPathNodeByIndexes(PRTCRX509CERTPATHSINT pThis, uint32_t iPath, uint32_t iNode)
+{
+    PRTCRX509CERTPATHNODE pNode = rtCrX509CertPathsGetLeafByIndex(pThis, iPath);
+    Assert(pNode);
+    if (pNode)
+    {
+        if (iNode <= pNode->uDepth)
+        {
+            uint32_t uCertDepth = pNode->uDepth - iNode;
+            while (pNode->uDepth > uCertDepth)
+                pNode = pNode->pParent;
+            Assert(pNode);
+            Assert(pNode && pNode->uDepth == uCertDepth);
+            return pNode;
+        }
+    }
+
+    return NULL;
+}
+
+
+RTDECL(PCRTCRX509CERTIFICATE) RTCrX509CertPathsGetPathNodeCert(RTCRX509CERTPATHS hCertPaths, uint32_t iPath, uint32_t iNode)
+{
+    /*
+     * Validate the input.
+     */
+    PRTCRX509CERTPATHSINT pThis = hCertPaths;
+    AssertPtrReturn(pThis, NULL);
+    AssertReturn(pThis->u32Magic == RTCRX509CERTPATHSINT_MAGIC, NULL);
+    AssertPtrReturn(pThis->pRoot, NULL);
+    AssertReturn(iPath < pThis->cPaths, NULL);
+
+    /*
+     * Get the data.
+     */
+    PRTCRX509CERTPATHNODE pNode = rtCrX509CertPathsGetPathNodeByIndexes(pThis, iPath, iNode);
+    if (pNode)
+        return pNode->pCert;
+    return NULL;
+}
+
+
+/** @} */
+
diff --git a/src/VBox/Runtime/common/crypto/x509-core.cpp b/src/VBox/Runtime/common/crypto/x509-core.cpp
new file mode 100644
index 0000000..0cd1c68
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-core.cpp
@@ -0,0 +1,1533 @@
+/* $Id: x509-core.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, Core APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include "x509-internal.h"
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-core.h>
+
+
+/*
+ * X.509 Validity.
+ */
+
+RTDECL(bool) RTCrX509Validity_IsValidAtTimeSpec(PCRTCRX509VALIDITY pThis, PCRTTIMESPEC pTimeSpec)
+{
+    if (RTAsn1Time_CompareWithTimeSpec(&pThis->NotBefore, pTimeSpec) > 0)
+        return false;
+    if (RTAsn1Time_CompareWithTimeSpec(&pThis->NotAfter, pTimeSpec) < 0)
+        return false;
+    return true;
+}
+
+
+/*
+ * One X.509 Algorithm Identifier.
+ */
+
+RTDECL(RTDIGESTTYPE) RTCrX509AlgorithmIdentifier_QueryDigestType(PCRTCRX509ALGORITHMIDENTIFIER pThis)
+{
+    AssertPtrReturn(pThis, RTDIGESTTYPE_INVALID);
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+        return RTDIGESTTYPE_MD5;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+        return RTDIGESTTYPE_SHA1;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+        return RTDIGESTTYPE_SHA256;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+        return RTDIGESTTYPE_SHA512;
+
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384))
+        return RTDIGESTTYPE_SHA384;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224))
+        return RTDIGESTTYPE_SHA224;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224))
+        return RTDIGESTTYPE_SHA512T224;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256))
+        return RTDIGESTTYPE_SHA512T256;
+    return RTDIGESTTYPE_INVALID;
+}
+
+
+RTDECL(uint32_t) RTCrX509AlgorithmIdentifier_QueryDigestSize(PCRTCRX509ALGORITHMIDENTIFIER pThis)
+{
+    AssertPtrReturn(pThis, UINT32_MAX);
+
+    /* common */
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+        return 128 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+        return 160 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+        return 256 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+        return 512 / 8;
+
+    /* Less common. */
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2))
+        return 128 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4))
+        return 128 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384))
+        return 384 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224))
+        return 224 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T224))
+        return 224 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512T256))
+        return 256 / 8;
+    if (!strcmp(pThis->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
+        return 512 / 8;
+
+    return UINT32_MAX;
+}
+
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareWithString(PCRTCRX509ALGORITHMIDENTIFIER pThis, const char *pszObjId)
+{
+    return strcmp(pThis->Algorithm.szObjId, pszObjId);
+}
+
+
+RTDECL(int) RTCrX509AlgorithmIdentifier_CompareDigestAndEncryptedDigest(PCRTCRX509ALGORITHMIDENTIFIER pDigest,
+                                                                        PCRTCRX509ALGORITHMIDENTIFIER pEncryptedDigest)
+{
+    /* common */
+    if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD5_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA1_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA256_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA512_WITH_RSA))
+            return 0;
+    }
+    /* Less common. */
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD2_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_MD4_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA384_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224))
+    {
+        if (!strcmp(pEncryptedDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_SHA224_WITH_RSA))
+            return 0;
+    }
+    else if (!strcmp(pDigest->Algorithm.szObjId, RTCRX509ALGORITHMIDENTIFIERID_WHIRLPOOL))
+    {
+        /* ?? */
+    }
+    else
+        return -1;
+    return 1;
+}
+
+
+/*
+ * Set of X.509 Algorithm Identifiers.
+ */
+
+
+/*
+ * One X.509 AttributeTypeAndValue.
+ */
+
+
+/*
+ * Set of X.509 AttributeTypeAndValues / X.509 RelativeDistinguishedName.
+ */
+
+/**
+ * Slow code path of rtCrX509CanNameIsNothing.
+ *
+ * @returns true if @uc maps to nothing, false if not.
+ * @param   uc          The unicode code point.
+ */
+static bool rtCrX509CanNameIsNothingSlow(RTUNICP uc)
+{
+    switch (uc)
+    {
+        /* 2.2 Map - Paragraph 1: */
+        case 0x00ad:
+        case 0x1806:
+        case 0x034f:
+        case 0x180b: case 0x180c: case 0x180d:
+
+        case 0xfe00: case 0xfe01: case 0xfe02: case 0xfe03:
+        case 0xfe04: case 0xfe05: case 0xfe06: case 0xfe07:
+        case 0xfe08: case 0xfe09: case 0xfe0a: case 0xfe0b:
+        case 0xfe0c: case 0xfe0d: case 0xfe0e: case 0xfe0f:
+
+        case 0xfffc:
+
+        /* 2.2 Map - Paragraph 3 (control code/function): */
+        case 0x0000: case 0x0001: case 0x0002: case 0x0003:
+        case 0x0004: case 0x0005: case 0x0006: case 0x0007:
+        case 0x0008:
+
+        case 0x000e: case 0x000f:
+        case 0x0010: case 0x0011: case 0x0012: case 0x0013:
+        case 0x0014: case 0x0015: case 0x0016: case 0x0017:
+        case 0x0018: case 0x0019: case 0x001a: case 0x001b:
+        case 0x001c: case 0x001d: case 0x001e: case 0x001f:
+
+        case 0x007f:
+        case 0x0080: case 0x0081: case 0x0082: case 0x0083:
+        case 0x0084: /*case 0x0085:*/ case 0x0086: case 0x0087:
+        case 0x0088: case 0x0089: case 0x008a: case 0x008b:
+        case 0x008c: case 0x008d: case 0x008e: case 0x008f:
+        case 0x0090: case 0x0091: case 0x0092: case 0x0093:
+        case 0x0094: case 0x0095: case 0x0096: case 0x0097:
+        case 0x0098: case 0x0099: case 0x009a: case 0x009b:
+        case 0x009c: case 0x009d: case 0x009e: case 0x009f:
+
+        case 0x06dd:
+        case 0x070f:
+        case 0x180e:
+        case 0x200c: case 0x200d: case 0x200e: case 0x200f:
+        case 0x202a: case 0x202b: case 0x202c: case 0x202d: case 0x202e:
+        case 0x2060: case 0x2061: case 0x2062: case 0x2063:
+        case 0x206a: case 0x206b: case 0x206c: case 0x206d: case 0x206e: case 0x206f:
+        case 0xfeff:
+        case 0xfff9: case 0xfffa: case 0xfffb:
+        case 0x1d173: case 0x1d174: case 0x1d175: case 0x1d176: case 0x1d177: case 0x1d178: case 0x1d179: case 0x1d17a:
+        case 0xe0001:
+        case 0xe0020: case 0xe0021: case 0xe0022: case 0xe0023:
+        case 0xe0024: case 0xe0025: case 0xe0026: case 0xe0027:
+        case 0xe0028: case 0xe0029: case 0xe002a: case 0xe002b:
+        case 0xe002c: case 0xe002d: case 0xe002e: case 0xe002f:
+        case 0xe0030: case 0xe0031: case 0xe0032: case 0xe0033:
+        case 0xe0034: case 0xe0035: case 0xe0036: case 0xe0037:
+        case 0xe0038: case 0xe0039: case 0xe003a: case 0xe003b:
+        case 0xe003c: case 0xe003d: case 0xe003e: case 0xe003f:
+        case 0xe0040: case 0xe0041: case 0xe0042: case 0xe0043:
+        case 0xe0044: case 0xe0045: case 0xe0046: case 0xe0047:
+        case 0xe0048: case 0xe0049: case 0xe004a: case 0xe004b:
+        case 0xe004c: case 0xe004d: case 0xe004e: case 0xe004f:
+        case 0xe0050: case 0xe0051: case 0xe0052: case 0xe0053:
+        case 0xe0054: case 0xe0055: case 0xe0056: case 0xe0057:
+        case 0xe0058: case 0xe0059: case 0xe005a: case 0xe005b:
+        case 0xe005c: case 0xe005d: case 0xe005e: case 0xe005f:
+        case 0xe0060: case 0xe0061: case 0xe0062: case 0xe0063:
+        case 0xe0064: case 0xe0065: case 0xe0066: case 0xe0067:
+        case 0xe0068: case 0xe0069: case 0xe006a: case 0xe006b:
+        case 0xe006c: case 0xe006d: case 0xe006e: case 0xe006f:
+        case 0xe0070: case 0xe0071: case 0xe0072: case 0xe0073:
+        case 0xe0074: case 0xe0075: case 0xe0076: case 0xe0077:
+        case 0xe0078: case 0xe0079: case 0xe007a: case 0xe007b:
+        case 0xe007c: case 0xe007d: case 0xe007e: case 0xe007f:
+
+        /* 2.2 Map - Paragraph 4. */
+        case 0x200b:
+            return true;
+    }
+    return false;
+}
+
+
+/**
+ * Checks if @a uc maps to nothing according to mapping rules of RFC-5280 and
+ * RFC-4518.
+ *
+ * @returns true if @uc maps to nothing, false if not.
+ * @param   uc          The unicode code point.
+ */
+DECLINLINE(bool) rtCrX509CanNameIsNothing(RTUNICP uc)
+{
+    if (uc > 0x001f && uc < 0x00ad)
+        return false;
+    return rtCrX509CanNameIsNothingSlow(uc);
+}
+
+
+/**
+ * Slow code path of rtCrX509CanNameIsSpace.
+ *
+ * @returns true if space, false if not.
+ * @param   uc          The unicode code point.
+ */
+static bool rtCrX509CanNameIsSpaceSlow(RTUNICP uc)
+{
+    switch (uc)
+    {
+        /* 2.2 Map - Paragraph 2. */
+        case 0x09:
+        case 0x0a:
+        case 0x0b:
+        case 0x0c:
+        case 0x0d:
+        case 0x20:
+        case 0x0085:
+        case 0x00a0:
+        case 0x1680:
+        case 0x2000: case 0x2001: case 0x2002: case 0x2003:
+        case 0x2004: case 0x2005: case 0x2006: case 0x2007:
+        case 0x2008: case 0x2009: case 0x200a:
+        case 0x2028: case 0x2029:
+        case 0x202f:
+        case 0x205f:
+        case 0x3000:
+            return true;
+    }
+    return false;
+}
+
+
+/**
+ * Checks if @a uc is a space character according to the mapping rules of
+ * RFC-5280 and RFC-4518.
+ *
+ * @returns true if space, false if not.
+ * @param   uc          The unicode code point.
+ */
+DECLINLINE(bool) rtCrX509CanNameIsSpace(RTUNICP uc)
+{
+    if (uc < 0x0085)
+    {
+        if (uc > 0x0020)
+            return false;
+        if (uc == 0x0020) /* space */
+            return true;
+    }
+    return rtCrX509CanNameIsSpaceSlow(uc);
+}
+
+
+static const char *rtCrX509CanNameStripLeft(const char *psz, size_t *pcch)
+{
+    /*
+     * Return space when we've encountered the first non-space-non-nothing code point.
+     */
+    const char * const pszStart = psz;
+    const char        *pszPrev;
+    for (;;)
+    {
+        pszPrev = psz;
+        RTUNICP uc;
+        int rc = RTStrGetCpEx(&psz, &uc);
+        AssertRCBreak(rc);
+        if (!uc)
+        {
+            if ((uintptr_t)(pszPrev - pszStart) >= *pcch)
+                break;
+            /* NUL inside the string, maps to nothing => ignore it. */
+        }
+        else if (!rtCrX509CanNameIsSpace(uc) && !rtCrX509CanNameIsNothing(uc))
+            break;
+    }
+    *pcch -= pszPrev - pszStart;
+    return pszPrev;
+}
+
+
+static RTUNICP rtCrX509CanNameGetNextCpWithMappingSlowSpace(const char **ppsz, size_t *pcch)
+{
+    /*
+     * Return space when we've encountered the first non-space-non-nothing code point.
+     */
+    RTUNICP            uc;
+    const char        *psz      = *ppsz;
+    const char * const pszStart = psz;
+    const char        *pszPrev;
+    for (;;)
+    {
+        pszPrev = psz;
+        int rc = RTStrGetCpEx(&psz, &uc);
+        AssertRCBreakStmt(rc, uc = 0x20);
+        if (!uc)
+        {
+            if ((uintptr_t)(pszPrev - pszStart) >= *pcch)
+            {
+                uc = 0;     /* End of string: Ignore trailing spaces. */
+                break;
+            }
+            /* NUL inside the string, maps to nothing => ignore it. */
+        }
+        else if (!rtCrX509CanNameIsSpace(uc) && !rtCrX509CanNameIsNothing(uc))
+        {
+            uc = 0x20;      /* Return space before current char. */
+            break;
+        }
+    }
+
+    *ppsz  = pszPrev;
+    *pcch -= pszPrev - pszStart;
+    return uc;
+}
+
+
+DECLINLINE(RTUNICP) rtCrX509CanNameGetNextCpIgnoreNul(const char **ppsz, size_t *pcch)
+{
+    while (*pcch > 0)
+    {
+        const char *psz = *ppsz;
+        RTUNICP uc = *psz;
+        if (uc < 0x80)
+        {
+            *pcch -= 1;
+            *ppsz = psz + 1;
+        }
+        else
+        {
+            int rc = RTStrGetCpEx(ppsz, &uc);
+            AssertRCReturn(rc, uc);
+            size_t cchCp = *ppsz - psz;
+            AssertReturn(cchCp <= *pcch, 0);
+            *pcch -= cchCp;
+        }
+        if (uc != 0)
+            return uc;
+    }
+    return 0;
+}
+
+
+static RTUNICP rtCrX509CanNameGetNextCpWithMappingSlowNothing(const char **ppsz, size_t *pcch)
+{
+    /*
+     * Return first code point which doesn't map to nothing.  If we encounter
+     * a space, we defer to the mapping-after-space routine above.
+     */
+    for (;;)
+    {
+        RTUNICP uc = rtCrX509CanNameGetNextCpIgnoreNul(ppsz, pcch);
+        if (rtCrX509CanNameIsSpace(uc))
+            return rtCrX509CanNameGetNextCpWithMappingSlowSpace(ppsz, pcch);
+        if (!rtCrX509CanNameIsNothing(uc) || uc == 0)
+            return uc;
+    }
+}
+
+
+DECLINLINE(RTUNICP) rtCrX509CanNameGetNextCpWithMapping(const char **ppsz, size_t *pcch)
+{
+    RTUNICP uc = rtCrX509CanNameGetNextCpIgnoreNul(ppsz, pcch);
+    if (uc)
+    {
+        if (!rtCrX509CanNameIsSpace(uc))
+        {
+            if (!rtCrX509CanNameIsNothing(uc))
+                return uc;
+            return rtCrX509CanNameGetNextCpWithMappingSlowNothing(ppsz, pcch);
+        }
+        return rtCrX509CanNameGetNextCpWithMappingSlowSpace(ppsz, pcch);
+    }
+    return uc;
+}
+
+
+RTDECL(bool) RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(PCRTCRX509ATTRIBUTETYPEANDVALUE pLeft,
+                                                               PCRTCRX509ATTRIBUTETYPEANDVALUE pRight)
+{
+    if (RTAsn1ObjId_Compare(&pLeft->Type, &pRight->Type) == 0)
+    {
+        /*
+         * Try for perfect match in case we get luck.
+         */
+#ifdef DEBUG_bird  /* Want to test the complicated code path first */
+        if (pLeft->Value.enmType != RTASN1TYPE_STRING || pRight->Value.enmType != RTASN1TYPE_STRING)
+#endif
+        if (RTAsn1DynType_Compare(&pLeft->Value, &pRight->Value) == 0)
+            return true;
+
+        /*
+         * If both are string types, we can compare them according to RFC-5280.
+         */
+        if (   pLeft->Value.enmType == RTASN1TYPE_STRING
+            && pRight->Value.enmType == RTASN1TYPE_STRING)
+        {
+            size_t      cchLeft;
+            const char *pszLeft;
+            int rc = RTAsn1String_QueryUtf8(&pLeft->Value.u.String, &pszLeft, &cchLeft);
+            if (RT_SUCCESS(rc))
+            {
+                size_t      cchRight;
+                const char *pszRight;
+                rc = RTAsn1String_QueryUtf8(&pRight->Value.u.String, &pszRight, &cchRight);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Perform a simplified RFC-5280 comparsion.
+                     * The algorithm as be relaxed on the following counts:
+                     *      1. No unicode normalization.
+                     *      2. Prohibited characters not checked for.
+                     *      3. Bidirectional characters are not ignored.
+                     */
+                    pszLeft  = rtCrX509CanNameStripLeft(pszLeft, &cchLeft);
+                    pszRight = rtCrX509CanNameStripLeft(pszRight, &cchRight);
+                    while (*pszLeft && *pszRight)
+                    {
+                        RTUNICP ucLeft  = rtCrX509CanNameGetNextCpWithMapping(&pszLeft, &cchLeft);
+                        RTUNICP ucRight = rtCrX509CanNameGetNextCpWithMapping(&pszRight, &cchRight);
+                        if (ucLeft != ucRight)
+                        {
+                            ucLeft  = RTUniCpToLower(ucLeft);
+                            ucRight = RTUniCpToLower(ucRight);
+                            if (ucLeft != ucRight)
+                                return false;
+                        }
+                    }
+
+                    return cchRight == 0 && cchLeft == 0;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+
+RTDECL(bool) RTCrX509RelativeDistinguishedName_MatchByRfc5280(PCRTCRX509RELATIVEDISTINGUISHEDNAME pLeft,
+                                                              PCRTCRX509RELATIVEDISTINGUISHEDNAME pRight)
+{
+    /*
+     * No match if the attribute count differs.
+     */
+    uint32_t const cItems = pLeft->cItems;
+    if (cItems == pRight->cItems)
+    {
+        /*
+         * Compare each attribute, but don't insist on the same order nor
+         * bother checking for duplicates (too complicated).
+         */
+        for (uint32_t iLeft = 0; iLeft < cItems; iLeft++)
+        {
+            PCRTCRX509ATTRIBUTETYPEANDVALUE pLeftAttr = &pLeft->paItems[iLeft];
+            bool fFound = false;
+            for (uint32_t iRight = 0; iRight < cItems; iRight++)
+                if (RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(pLeftAttr, &pRight->paItems[iRight]))
+                {
+                    fFound = true;
+                    break;
+                }
+            if (!fFound)
+                return false;
+        }
+        return true;
+    }
+    return false;
+
+}
+
+
+/*
+ * X.509 Name.
+ */
+
+RTDECL(bool) RTCrX509Name_MatchByRfc5280(PCRTCRX509NAME pLeft, PCRTCRX509NAME pRight)
+{
+    uint32_t const cItems = pLeft->cItems;
+    if (cItems == pRight->cItems)
+    {
+        /* Require exact order. */
+        for (uint32_t iRdn = 0; iRdn < cItems; iRdn++)
+            if (!RTCrX509RelativeDistinguishedName_MatchByRfc5280(&pLeft->paItems[iRdn], &pRight->paItems[iRdn]))
+                return false;
+        return true;
+    }
+    return false;
+}
+
+
+RTDECL(bool) RTCrX509Name_ConstraintMatch(PCRTCRX509NAME pConstraint, PCRTCRX509NAME pName)
+{
+    /*
+     * Check that the constraint is a prefix of the name.  This means that
+     * the name must have at least as many components and the constraint.
+     */
+    if (pName->cItems >= pConstraint->cItems)
+    {
+        /*
+         * Parallel crawl of the two RDNs arrays.
+         */
+        for (uint32_t i = 0; pConstraint->cItems; i++)
+        {
+            PCRTCRX509RELATIVEDISTINGUISHEDNAME pConstrRdns = &pConstraint->paItems[i];
+            PCRTCRX509RELATIVEDISTINGUISHEDNAME pNameRdns   = &pName->paItems[i];
+
+            /*
+             * Walk the constraint attribute & value array.
+             */
+            for (uint32_t iConstrAttrib = 0; iConstrAttrib < pConstrRdns->cItems; iConstrAttrib++)
+            {
+                PCRTCRX509ATTRIBUTETYPEANDVALUE pConstrAttrib = &pConstrRdns->paItems[iConstrAttrib];
+
+                /*
+                 * Find matching attribute & value in the name.
+                 */
+                bool fFound = false;
+                for (uint32_t iNameAttrib = 0; iNameAttrib < pNameRdns->cItems; iNameAttrib++)
+                    if (RTCrX509AttributeTypeAndValue_MatchAsRdnByRfc5280(pConstrAttrib, &pNameRdns->paItems[iNameAttrib]))
+                    {
+                        fFound = true;
+                        break;
+                    }
+                if (fFound)
+                    return false;
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+
+/**
+ * Mapping between X.500 object IDs and short and long names.
+ *
+ * See RFC-1327, ...
+ */
+static struct
+{
+    const char *pszOid;
+    const char *pszShortNm;
+    size_t      cchShortNm;
+    const char *pszLongNm;
+} const g_aRdnMap[] =
+{
+    {   "0.9.2342.19200300.100.1.25", RT_STR_TUPLE("DC"),                   "DomainComponent" },
+    {   "1.2.840.113549.1.9.1",       RT_STR_TUPLE("Email"),                "EmailAddress" },
+    {   "2.5.4.3",                    RT_STR_TUPLE("CN"),                   "CommonName" },
+    {   "2.5.4.4",                    RT_STR_TUPLE("S"),                    "Surname" },
+    {   "2.5.4.6",                    RT_STR_TUPLE("C"),                    "CountryName" },
+    {   "2.5.4.7",                    RT_STR_TUPLE("L"),                    "LocalityName" },
+    {   "2.5.4.8",                    RT_STR_TUPLE("ST"),                   "StatOrProviceName" },
+    {   "2.5.4.10",                   RT_STR_TUPLE("O"),                    "OrganizationName" },
+    {   "2.5.4.11",                   RT_STR_TUPLE("OU"),                   "OrganizationUnitName" },
+    {   "2.5.4.42",                   RT_STR_TUPLE("G"),                    "GivenName" },
+    {   "2.5.4.43",                   RT_STR_TUPLE("I"),                    "Initials" },
+    {   "2.5.4.44",                   RT_STR_TUPLE("GQ"),                   "GenerationQualifier" },
+};
+
+
+RTDECL(bool) RTCrX509Name_MatchWithString(PCRTCRX509NAME pThis, const char *pszString)
+{
+    /* Keep track of the string length. */
+    size_t cchString = strlen(pszString);
+
+    /*
+     * The usual double loop for walking the components.
+     */
+    for (uint32_t i = 0; i < pThis->cItems; i++)
+    {
+        PCRTCRX509RELATIVEDISTINGUISHEDNAME pRdn = &pThis->paItems[i];
+        for (uint32_t j = 0; j < pRdn->cItems; j++)
+        {
+            PCRTCRX509ATTRIBUTETYPEANDVALUE pComponent = &pRdn->paItems[j];
+
+            /*
+             * Must be a string.
+             */
+            if (pComponent->Value.enmType != RTASN1TYPE_STRING)
+                return false;
+
+            /*
+             * Look up the component name prefix and check whether it's also in the string.
+             */
+            uint32_t iName = RT_ELEMENTS(g_aRdnMap);
+            while (iName-- > 0)
+                if (RTAsn1ObjId_CompareWithString(&pComponent->Type, g_aRdnMap[iName].pszOid) == 0)
+                    break;
+            AssertMsgReturn(iName != UINT32_MAX, ("Please extend g_aRdnMap with '%s'.\n", pComponent->Type.szObjId), false);
+
+            if (   strncmp(pszString, g_aRdnMap[iName].pszShortNm, g_aRdnMap[iName].cchShortNm) != 0
+                || pszString[g_aRdnMap[iName].cchShortNm] != '=')
+                return false;
+
+            pszString += g_aRdnMap[iName].cchShortNm + 1;
+            cchString -= g_aRdnMap[iName].cchShortNm + 1;
+
+            /*
+             * Compare the component string.
+             */
+            size_t cchComponent;
+            int rc = RTAsn1String_QueryUtf8Len(&pComponent->Value.u.String, &cchComponent);
+            AssertRCReturn(rc, false);
+
+            if (cchComponent > cchString)
+                return false;
+            if (RTAsn1String_CompareWithString(&pComponent->Value.u.String, pszString, cchComponent) != 0)
+                return false;
+
+            cchString -= cchComponent;
+            pszString += cchComponent;
+
+            /*
+             * Check separator comma + space and skip extra spaces before the next component.
+             */
+            if (cchString)
+            {
+                if (pszString[0] != ',')
+                    return false;
+                if (pszString[1] != ' ' && pszString[1] != '\t')
+                    return false;
+                pszString += 2;
+                cchString -= 2;
+
+                while (*pszString == ' ' || *pszString == '\t')
+                {
+                    pszString++;
+                    cchString--;
+                }
+            }
+        }
+    }
+
+    /*
+     * If we got thru the whole name and the whole string, we're good.
+     */
+    return *pszString == '\0';
+}
+
+
+RTDECL(int) RTCrX509Name_FormatAsString(PCRTCRX509NAME pThis, char *pszBuf, size_t cbBuf, size_t *pcbActual)
+{
+    /*
+     * The usual double loop for walking the components.
+     */
+    size_t off = 0;
+    int    rc  = VINF_SUCCESS;
+    for (uint32_t i = 0; i < pThis->cItems; i++)
+    {
+        PCRTCRX509RELATIVEDISTINGUISHEDNAME pRdn = &pThis->paItems[i];
+        for (uint32_t j = 0; j < pRdn->cItems; j++)
+        {
+            PCRTCRX509ATTRIBUTETYPEANDVALUE pComponent = &pRdn->paItems[j];
+
+            /*
+             * Must be a string.
+             */
+            if (pComponent->Value.enmType != RTASN1TYPE_STRING)
+                return VERR_CR_X509_NAME_NOT_STRING;
+
+            /*
+             * Look up the component name prefix.
+             */
+            uint32_t iName = RT_ELEMENTS(g_aRdnMap);
+            while (iName-- > 0)
+                if (RTAsn1ObjId_CompareWithString(&pComponent->Type, g_aRdnMap[iName].pszOid) == 0)
+                    break;
+            AssertMsgReturn(iName != UINT32_MAX, ("Please extend g_aRdnMap with '%s'.\n", pComponent->Type.szObjId),
+                            VERR_CR_X509_NAME_MISSING_RDN_MAP_ENTRY);
+
+            /*
+             * Append the prefix.
+             */
+            if (off)
+            {
+                if (off + 2 < cbBuf)
+                {
+                    pszBuf[off]     = ',';
+                    pszBuf[off + 1] = ' ';
+                }
+                else
+                    rc = VERR_BUFFER_OVERFLOW;
+                off += 2;
+            }
+
+            if (off + g_aRdnMap[iName].cchShortNm + 1 < cbBuf)
+            {
+                memcpy(&pszBuf[off], g_aRdnMap[iName].pszShortNm, g_aRdnMap[iName].cchShortNm);
+                pszBuf[off + g_aRdnMap[iName].cchShortNm] = '=';
+            }
+            else
+                rc = VERR_BUFFER_OVERFLOW;
+            off += g_aRdnMap[iName].cchShortNm + 1;
+
+            /*
+             * Add the component string.
+             */
+            const char *pszUtf8;
+            size_t      cchUtf8;
+            int rc2 = RTAsn1String_QueryUtf8(&pComponent->Value.u.String, &pszUtf8, &cchUtf8);
+            AssertRCReturn(rc2, rc2);
+            if (off + cchUtf8 < cbBuf)
+                memcpy(&pszBuf[off], pszUtf8, cchUtf8);
+            else
+                rc = VERR_BUFFER_OVERFLOW;
+            off += cchUtf8;
+        }
+    }
+
+    if (pcbActual)
+        *pcbActual = off + 1;
+    if (off < cbBuf)
+        pszBuf[off] = '\0';
+    return rc;
+}
+
+
+
+/*
+ * One X.509 GeneralName.
+ */
+
+/**
+ * Name constraint matching (RFC-5280): DNS Name.
+ *
+ * @returns true on match, false on mismatch.
+ * @param   pConstraint     The constraint name.
+ * @param   pName           The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchDnsName(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+    /*
+     * Empty constraint string is taken to match everything.
+     */
+    if (pConstraint->u.pT2_DnsName->Asn1Core.cb == 0)
+        return true;
+
+    /*
+     * Get the UTF-8 strings for the two.
+     */
+    size_t      cchConstraint;
+    char const *pszConstraint;
+    int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT2_DnsName, &pszConstraint, &cchConstraint);
+    if (RT_SUCCESS(rc))
+    {
+        size_t      cchFull;
+        char const *pszFull;
+        rc = RTAsn1String_QueryUtf8(pName->u.pT2_DnsName, &pszFull, &cchFull);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * No match if the constraint is longer.
+             */
+            if (cchConstraint > cchFull)
+                return false;
+
+            /*
+             * No match if the constraint and name tail doesn't match
+             * in a case-insensitive compare.
+             */
+            size_t offFull = cchFull - cchConstraint;
+            if (RTStrICmp(&pszFull[offFull], pszConstraint) != 0)
+                return false;
+            if (!offFull)
+                return true;
+
+            /*
+             * The matching constraint must be delimited by a dot in the full
+             * name.  There seems to be some discussion whether ".oracle.com"
+             * should match "www..oracle.com".  This implementation does choose
+             * to not succeed in that case.
+             */
+            if ((pszFull[offFull - 1] == '.') ^ (pszFull[offFull] == '.'))
+                return true;
+
+            return false;
+        }
+    }
+
+    /* fall back. */
+    return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): RFC-822 (email).
+ *
+ * @returns true on match, false on mismatch.
+ * @param   pConstraint     The constraint name.
+ * @param   pName           The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchRfc822Name(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+    /*
+     * Empty constraint string is taken to match everything.
+     */
+    if (pConstraint->u.pT1_Rfc822->Asn1Core.cb == 0)
+        return true;
+
+    /*
+     * Get the UTF-8 strings for the two.
+     */
+    size_t      cchConstraint;
+    char const *pszConstraint;
+    int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT1_Rfc822, &pszConstraint, &cchConstraint);
+    if (RT_SUCCESS(rc))
+    {
+        size_t      cchFull;
+        char const *pszFull;
+        rc = RTAsn1String_QueryUtf8(pName->u.pT1_Rfc822, &pszFull, &cchFull);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * No match if the constraint is longer.
+             */
+            if (cchConstraint > cchFull)
+                return false;
+
+            /*
+             * A lone dot matches everything.
+             */
+            if (cchConstraint == 1 && *pszConstraint == '.')
+                return true;
+
+            /*
+             * If there is a '@' in the constraint, the entire address must match.
+             */
+            const char *pszConstraintAt = (const char *)memchr(pszConstraint, '@', cchConstraint);
+            if (pszConstraintAt)
+                return cchConstraint == cchFull && RTStrICmp(pszConstraint, pszFull) == 0;
+
+            /*
+             * No match if the constraint and name tail doesn't match
+             * in a case-insensitive compare.
+             */
+            size_t offFull = cchFull - cchConstraint;
+            if (RTStrICmp(&pszFull[offFull], pszConstraint) != 0)
+                return false;
+
+            /*
+             * If the constraint starts with a dot, we're supposed to be
+             * satisfied with a tail match.
+             */
+            /** @todo Check if this should match even if offFull == 0. */
+            if (*pszConstraint == '.')
+                return true;
+
+            /*
+             * Otherwise, we require a hostname match and thus expect an '@'
+             * immediatly preceding the constraint match.
+             */
+            if (pszFull[offFull - 1] == '@')
+                return true;
+
+            return false;
+        }
+    }
+
+    /* fall back. */
+    return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Extracts the hostname from an URI.
+ *
+ * @returns true if successfully extract, false if no hostname present.
+ * @param   pszUri          The URI.
+ * @param   pchHostName     .
+ * @param   pcchHostName    .
+ */
+static bool rtCrX509GeneralName_ExtractHostName(const char *pszUri,  const char **pchHostName,  size_t *pcchHostName)
+{
+    /*
+     * Skip the schema name.
+     */
+    const char *pszStart = strchr(pszUri, ':');
+    while (pszStart && (pszStart[1] != '/' || pszStart[2] != '/'))
+        pszStart = strchr(pszStart + 1, ':');
+    if (pszStart)
+    {
+        pszStart += 3;
+
+        /*
+         * The name ends with the first slash or ":port".
+         */
+        const char *pszEnd = strchr(pszStart, '/');
+        if (!pszEnd)
+            pszEnd = strchr(pszStart, '\0');
+        if (memchr(pszStart, ':', pszEnd - pszStart))
+            do
+                pszEnd--;
+            while (*pszEnd != ':');
+        if (pszEnd != pszStart)
+        {
+            /*
+             * Drop access credentials at the front of the string if present.
+             */
+            const char *pszAt = (const char *)memchr(pszStart, '@', pszEnd - pszStart);
+            if (pszAt)
+                pszStart = pszAt + 1;
+
+            /*
+             * If there is still some string left, that's the host name.
+             */
+            if (pszEnd != pszStart)
+            {
+                *pcchHostName = pszEnd - pszStart;
+                *pchHostName  = pszStart;
+                return true;
+            }
+        }
+    }
+
+    *pcchHostName = 0;
+    *pchHostName  = NULL;
+    return false;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): URI.
+ *
+ * @returns true on match, false on mismatch.
+ * @param   pConstraint     The constraint name.
+ * @param   pName           The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchUri(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+    /*
+     * Empty constraint string is taken to match everything.
+     */
+    if (pConstraint->u.pT6_Uri->Asn1Core.cb == 0)
+        return true;
+
+    /*
+     * Get the UTF-8 strings for the two.
+     */
+    size_t      cchConstraint;
+    char const *pszConstraint;
+    int rc = RTAsn1String_QueryUtf8(pConstraint->u.pT6_Uri, &pszConstraint, &cchConstraint);
+    if (RT_SUCCESS(rc))
+    {
+        size_t      cchFull;
+        char const *pszFull;
+        rc = RTAsn1String_QueryUtf8(pName->u.pT6_Uri, &pszFull, &cchFull);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Isolate the hostname in the name.
+             */
+            size_t      cchHostName;
+            const char *pchHostName;
+            if (rtCrX509GeneralName_ExtractHostName(pszFull, &pchHostName, &cchHostName))
+            {
+                /*
+                 * Domain constraint.
+                 */
+                if (*pszConstraint == '.')
+                {
+                    if (cchHostName >= cchConstraint)
+                    {
+                        size_t offHostName = cchHostName - cchConstraint;
+                        if (RTStrICmp(&pchHostName[offHostName], pszConstraint) == 0)
+                        {
+                            /* "http://www..oracle.com" does not match ".oracle.com".
+                               It's debatable whether "http://.oracle.com/" should match. */
+                            if (  !offHostName
+                                || pchHostName[offHostName - 1] != '.')
+                                return true;
+                        }
+                    }
+                }
+                /*
+                 * Host name constraint.  Full match required.
+                 */
+                else if (   cchHostName == cchConstraint
+                         && RTStrNICmp(pchHostName, pszConstraint, cchHostName) == 0)
+                    return true;
+            }
+            return false;
+        }
+    }
+
+    /* fall back. */
+    return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+/**
+ * Name constraint matching (RFC-5280): IP address.
+ *
+ * @returns true on match, false on mismatch.
+ * @param   pConstraint     The constraint name.
+ * @param   pName           The name to match against the constraint.
+ */
+static bool rtCrX509GeneralName_ConstraintMatchIpAddress(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+    uint8_t const *pbConstraint = pConstraint->u.pT7_IpAddress->Asn1Core.uData.pu8;
+    uint8_t const *pbFull       = pName->u.pT7_IpAddress->Asn1Core.uData.pu8;
+
+    /*
+     * IPv4.
+     */
+    if (   pConstraint->u.pT7_IpAddress->Asn1Core.cb == 8  /* ip+netmask*/
+        && pName->u.pT7_IpAddress->Asn1Core.cb       == 4) /* ip */
+        return ((pbFull[0] ^ pbConstraint[0]) & pbConstraint[4]) == 0
+            && ((pbFull[1] ^ pbConstraint[1]) & pbConstraint[5]) == 0
+            && ((pbFull[2] ^ pbConstraint[2]) & pbConstraint[6]) == 0
+            && ((pbFull[3] ^ pbConstraint[3]) & pbConstraint[7]) == 0;
+
+    /*
+     * IPv6.
+     */
+    if (   pConstraint->u.pT7_IpAddress->Asn1Core.cb == 32  /* ip+netmask*/
+        && pName->u.pT7_IpAddress->Asn1Core.cb       == 16) /* ip */
+    {
+        for (uint32_t i = 0; i < 16; i++)
+            if (((pbFull[i] ^ pbConstraint[i]) & pbConstraint[i + 16]) != 0)
+                return false;
+        return true;
+    }
+
+    return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+}
+
+
+RTDECL(bool) RTCrX509GeneralName_ConstraintMatch(PCRTCRX509GENERALNAME pConstraint, PCRTCRX509GENERALNAME pName)
+{
+    if (pConstraint->enmChoice == pName->enmChoice)
+    {
+        if (RTCRX509GENERALNAME_IS_DIRECTORY_NAME(pConstraint))
+            return RTCrX509Name_ConstraintMatch(&pConstraint->u.pT4->DirectoryName,  &pName->u.pT4->DirectoryName);
+
+        if (RTCRX509GENERALNAME_IS_DNS_NAME(pConstraint))
+            return rtCrX509GeneralName_ConstraintMatchDnsName(pConstraint, pName);
+
+        if (RTCRX509GENERALNAME_IS_RFC822_NAME(pConstraint))
+            return rtCrX509GeneralName_ConstraintMatchRfc822Name(pConstraint, pName);
+
+        if (RTCRX509GENERALNAME_IS_URI(pConstraint))
+            return rtCrX509GeneralName_ConstraintMatchUri(pConstraint, pName);
+
+        if (RTCRX509GENERALNAME_IS_IP_ADDRESS(pConstraint))
+            return rtCrX509GeneralName_ConstraintMatchIpAddress(pConstraint, pName);
+
+        AssertFailed();
+        return RTCrX509GeneralName_Compare(pConstraint, pName) == 0;
+    }
+    return false;
+}
+
+
+/*
+ * Sequence of X.509 GeneralNames.
+ */
+
+
+/*
+ * X.509 UniqueIdentifier.
+ */
+
+
+/*
+ * X.509 SubjectPublicKeyInfo.
+ */
+
+
+/*
+ * X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+
+
+/*
+ * One X.509 PolicyQualifierInfo.
+ */
+
+
+/*
+ * Sequence of X.509 PolicyQualifierInfo.
+ */
+
+
+/*
+ * One X.509 PolicyInformation.
+ */
+
+
+/*
+ * Sequence of X.509 CertificatePolicies.
+ */
+
+
+/*
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+
+
+/*
+ * Sequence of X.509 PolicyMappings (IPRT representation).
+ */
+
+
+/*
+ * X.509 BasicConstraints (IPRT representation).
+ */
+
+
+/*
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+
+
+RTDECL(bool) RTCrX509GeneralSubtree_ConstraintMatch(PCRTCRX509GENERALSUBTREE pConstraint, PCRTCRX509GENERALSUBTREE pName)
+{
+    return RTCrX509GeneralName_ConstraintMatch(&pConstraint->Base, &pName->Base);
+}
+
+
+/*
+ * Sequence of X.509 GeneralSubtrees (IPRT representation).
+ */
+
+
+/*
+ * X.509 NameConstraints (IPRT representation).
+ */
+
+
+/*
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+
+
+/*
+ * One X.509 Extension.
+ */
+
+
+/*
+ * Sequence of X.509 Extensions.
+ */
+
+
+/*
+ * X.509 TbsCertificate.
+ */
+
+static void rtCrx509TbsCertificate_AddKeyUsageFlags(PRTCRX509TBSCERTIFICATE pThis, PCRTCRX509EXTENSION pExtension)
+{
+    AssertReturnVoid(pExtension->enmValue == RTCRX509EXTENSIONVALUE_BIT_STRING);
+    AssertReturnVoid(pExtension->ExtnValue.pEncapsulated->cb <= 2);
+    pThis->T3.fKeyUsage |= (uint32_t)RTAsn1BitString_GetAsUInt64((PCRTASN1BITSTRING)pExtension->ExtnValue.pEncapsulated);
+}
+
+
+static void rtCrx509TbsCertificate_AddExtKeyUsageFlags(PRTCRX509TBSCERTIFICATE pThis, PCRTCRX509EXTENSION pExtension)
+{
+    AssertReturnVoid(pExtension->enmValue == RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS);
+    PCRTASN1SEQOFOBJIDS pObjIds = (PCRTASN1SEQOFOBJIDS)pExtension->ExtnValue.pEncapsulated;
+    uint32_t i = pObjIds->cItems;
+    while (i-- > 0)
+    {
+
+        if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_ANY_EXTENDED_KEY_USAGE_OID) == 0)
+            pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_ANY;
+        else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], RTCRX509_ID_KP_OID))
+        {
+            if (RTAsn1ObjIdCountComponents(&pObjIds->paItems[i]) == 9)
+                switch (RTAsn1ObjIdGetLastComponentsAsUInt32(&pObjIds->paItems[i]))
+                {
+                    case  1: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_SERVER_AUTH; break;
+                    case  2: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_CLIENT_AUTH; break;
+                    case  3: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_CODE_SIGNING; break;
+                    case  4: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EMAIL_PROTECTION; break;
+                    case  5: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_END_SYSTEM; break;
+                    case  6: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_TUNNEL; break;
+                    case  7: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_IPSEC_USER; break;
+                    case  8: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_TIME_STAMPING; break;
+                    case  9: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OCSP_SIGNING; break;
+                    case 10: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_DVCS; break;
+                    case 11: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_SBGP_CERT_AA_SERVICE_AUTH; break;
+                    case 13: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EAP_OVER_PPP; break;
+                    case 14: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_EAP_OVER_LAN; break;
+                    default: pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER; break;
+                }
+            else
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+        }
+        else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_APPLE_EXTENDED_KEY_USAGE_OID))
+        {
+            if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_DEVELOPMENT_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_DEVELOPMENT;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_SOFTWARE_UPDATE_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_SOFTWARE_UPDATE_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_CODE_SIGNING_THRID_PARTY_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_CODE_SIGNING_THIRD_PARTY;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_RESOURCE_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_RESOURCE_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_APPLE_EKU_SYSTEM_IDENTITY_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_APPLE_SYSTEM_IDENTITY;
+            else
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+        }
+        else if (RTAsn1ObjId_StartsWith(&pObjIds->paItems[i], "1.3.6.1.4.1.311"))
+        {
+            if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_TIMESTAMP_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_TIMESTAMP_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_NT5_CRYPTO_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_NT5_CRYPTO;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_OEM_WHQL_CRYPTO_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_OEM_WHQL_CRYPTO;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_EMBEDDED_NT_CRYPTO_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_EMBEDDED_NT_CRYPTO;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_KERNEL_MODE_CODE_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_KERNEL_MODE_CODE_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_LIFETIME_SIGNING_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_LIFETIME_SIGNING;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_DRM_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_DRM;
+            else if (RTAsn1ObjId_CompareWithString(&pObjIds->paItems[i], RTCRX509_MS_EKU_DRM_INDIVIDUALIZATION_OID) == 0)
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_MS_DRM_INDIVIDUALIZATION;
+            else
+                pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+        }
+        else
+            pThis->T3.fExtKeyUsage |= RTCRX509CERT_EKU_F_OTHER;
+    }
+}
+
+
+/**
+ * (Re-)Process the certificate extensions.
+ *
+ * Will fail if duplicate extensions are encountered.
+ *
+ * @returns IPRT status code.
+ * @param   pThis               The to-be-signed certificate part.
+ * @param   pErrInfo            Where to return extended error details,
+ *                              optional.
+ */
+RTDECL(int) RTCrX509TbsCertificate_ReprocessExtensions(PRTCRX509TBSCERTIFICATE pThis, PRTERRINFO pErrInfo)
+{
+    /*
+     * Clear all variables we will set.
+     */
+    pThis->T3.fFlags                    = 0;
+    pThis->T3.fKeyUsage                 = 0;
+    pThis->T3.fExtKeyUsage              = 0;
+    pThis->T3.pAuthorityKeyIdentifier   = NULL;
+    pThis->T3.pSubjectKeyIdentifier     = NULL;
+    pThis->T3.pAltSubjectName           = NULL;
+    pThis->T3.pAltIssuerName            = NULL;
+    pThis->T3.pCertificatePolicies      = NULL;
+    pThis->T3.pPolicyMappings           = NULL;
+    pThis->T3.pBasicConstraints         = NULL;
+    pThis->T3.pNameConstraints          = NULL;
+    pThis->T3.pPolicyConstraints        = NULL;
+    pThis->T3.pInhibitAnyPolicy         = NULL;
+
+#define CHECK_SET_PRESENT_RET_ON_DUP(a_pThis, a_pErrInfo, a_fPresentFlag) \
+    do { \
+        if ((a_pThis)->T3.fFlags & (a_fPresentFlag)) \
+            return RTErrInfoSet(a_pErrInfo, VERR_CR_X509_TBSCERT_DUPLICATE_EXTENSION, \
+                                "Duplicate extension " #a_fPresentFlag); \
+        (a_pThis)->T3.fFlags |= (a_fPresentFlag); \
+    } while (0)
+
+    /*
+     * Process all the extensions.
+     */
+    for (uint32_t i = 0; i < pThis->T3.Extensions.cItems; i++)
+    {
+        PCRTASN1OBJID       pExtnId   = &pThis->T3.Extensions.paItems[i].ExtnId;
+        PCRTASN1OCTETSTRING pExtValue = &pThis->T3.Extensions.paItems[i].ExtnValue;
+        if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_KEY_USAGE_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_KEY_USAGE);
+            rtCrx509TbsCertificate_AddKeyUsageFlags(pThis, &pThis->T3.Extensions.paItems[i]);
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_BIT_STRING);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_EXT_KEY_USAGE_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_EXT_KEY_USAGE);
+            rtCrx509TbsCertificate_AddExtKeyUsageFlags(pThis, &pThis->T3.Extensions.paItems[i]);
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_SEQ_OF_OBJ_IDS);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER);
+            pThis->T3.pAuthorityKeyIdentifier = (PCRTCRX509AUTHORITYKEYIDENTIFIER)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_AUTHORITY_KEY_IDENTIFIER);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_OLD_AUTHORITY_KEY_IDENTIFIER_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER);
+            pThis->T3.pOldAuthorityKeyIdentifier = (PCRTCRX509OLDAUTHORITYKEYIDENTIFIER)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_OLD_AUTHORITY_KEY_IDENTIFIER);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_SUBJECT_KEY_IDENTIFIER_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER);
+            pThis->T3.pSubjectKeyIdentifier = (PCRTASN1OCTETSTRING)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_OCTET_STRING);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_ALT_NAME);
+            pThis->T3.pAltSubjectName = (PCRTCRX509GENERALNAMES)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_ISSUER_ALT_NAME_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_ISSUER_ALT_NAME);
+            pThis->T3.pAltIssuerName = (PCRTCRX509GENERALNAMES)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_CERTIFICATE_POLICIES_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_CERTIFICATE_POLICIES);
+            pThis->T3.pCertificatePolicies = (PCRTCRX509CERTIFICATEPOLICIES)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_CERTIFICATE_POLICIES);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_POLICY_MAPPINGS_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_MAPPINGS);
+            pThis->T3.pPolicyMappings = (PCRTCRX509POLICYMAPPINGS)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_POLICY_MAPPINGS);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_BASIC_CONSTRAINTS_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_BASIC_CONSTRAINTS);
+            pThis->T3.pBasicConstraints = (PCRTCRX509BASICCONSTRAINTS)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_BASIC_CONSTRAINTS);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_NAME_CONSTRAINTS_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_NAME_CONSTRAINTS);
+            pThis->T3.pNameConstraints = (PCRTCRX509NAMECONSTRAINTS)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_NAME_CONSTRAINTS);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_POLICY_CONSTRAINTS_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_POLICY_CONSTRAINTS);
+            pThis->T3.pPolicyConstraints = (PCRTCRX509POLICYCONSTRAINTS)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_POLICY_CONSTRAINTS);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_INHIBIT_ANY_POLICY_OID) == 0)
+        {
+            CHECK_SET_PRESENT_RET_ON_DUP(pThis, pErrInfo, RTCRX509TBSCERTIFICATE_F_PRESENT_INHIBIT_ANY_POLICY);
+            pThis->T3.pInhibitAnyPolicy = (PCRTASN1INTEGER)pExtValue->pEncapsulated;
+            Assert(pThis->T3.Extensions.paItems[i].enmValue == RTCRX509EXTENSIONVALUE_INTEGER);
+        }
+        else if (RTAsn1ObjId_CompareWithString(pExtnId, RTCRX509_ID_CE_ACCEPTABLE_CERT_POLICIES_OID) == 0)
+            pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_ACCEPTABLE_CERT_POLICIES;
+        else
+            pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_OTHER;
+    }
+
+    if (!pThis->T3.fFlags)
+        pThis->T3.fFlags |= RTCRX509TBSCERTIFICATE_F_PRESENT_NONE;
+
+#undef CHECK_SET_PRESENT_RET_ON_DUP
+    return VINF_SUCCESS;
+}
+
+
+
+/*
+ * One X.509 Certificate.
+ */
+
+RTDECL(bool) RTCrX509Certificate_MatchIssuerAndSerialNumber(PCRTCRX509CERTIFICATE pCertificate,
+                                                            PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber)
+{
+    if (   RTAsn1Integer_UnsignedCompare(&pCertificate->TbsCertificate.SerialNumber, pSerialNumber) == 0
+        && RTCrX509Name_Compare(&pCertificate->TbsCertificate.Issuer, pIssuer) == 0)
+        return true;
+    return false;
+}
+
+
+RTDECL(bool) RTCrX509Certificate_MatchSubjectOrAltSubjectByRfc5280(PCRTCRX509CERTIFICATE pThis, PCRTCRX509NAME pName)
+{
+    if (RTCrX509Name_MatchByRfc5280(&pThis->TbsCertificate.Subject, pName))
+        return true;
+
+    if (RTCrX509Extensions_IsPresent(&pThis->TbsCertificate.T3.Extensions))
+        for (uint32_t i = 0; i < pThis->TbsCertificate.T3.Extensions.cItems; i++)
+        {
+            PCRTCRX509EXTENSION pExt = &pThis->TbsCertificate.T3.Extensions.paItems[i];
+            if (   pExt->enmValue == RTCRX509EXTENSIONVALUE_GENERAL_NAMES
+                && RTAsn1ObjId_CompareWithString(&pExt->ExtnId, RTCRX509_ID_CE_SUBJECT_ALT_NAME_OID))
+            {
+                PCRTCRX509GENERALNAMES pGeneralNames = (PCRTCRX509GENERALNAMES)pExt->ExtnValue.pEncapsulated;
+                for (uint32_t j = 0; j < pGeneralNames->cItems; j++)
+                    if (   RTCRX509GENERALNAME_IS_DIRECTORY_NAME(&pGeneralNames->paItems[j])
+                        && RTCrX509Name_MatchByRfc5280(&pGeneralNames->paItems[j].u.pT4->DirectoryName, pName))
+                        return true;
+            }
+        }
+    return false;
+}
+
+
+RTDECL(bool) RTCrX509Certificate_IsSelfSigned(PCRTCRX509CERTIFICATE pCertificate)
+{
+    if (RTCrX509Certificate_IsPresent(pCertificate))
+    {
+        return RTCrX509Name_MatchByRfc5280(&pCertificate->TbsCertificate.Subject,
+                                           &pCertificate->TbsCertificate.Issuer);
+    }
+    return false;
+}
+
+
+/*
+ * Set of X.509 Certificates.
+ */
+
+RTDECL(PCRTCRX509CERTIFICATE)
+RTCrX509Certificates_FindByIssuerAndSerialNumber(PCRTCRX509CERTIFICATES pCertificates,
+                                                 PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber)
+{
+    for (uint32_t i = 0; i < pCertificates->cItems; i++)
+        if (RTCrX509Certificate_MatchIssuerAndSerialNumber(&pCertificates->paItems[i], pIssuer, pSerialNumber))
+            return &pCertificates->paItems[i];
+    return NULL;
+}
+
+
diff --git a/src/VBox/Runtime/common/crypto/x509-file.cpp b/src/VBox/Runtime/common/crypto/x509-file.cpp
new file mode 100644
index 0000000..10bc8e5
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-file.cpp
@@ -0,0 +1,105 @@
+/* $Id: x509-file.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, File related APIs.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/path.h>
+#include <iprt/crypto/pem.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static RTCRPEMMARKERWORD const g_aWords_Certificate[]  = { { RT_STR_TUPLE("CERTIFICATE") } };
+/** X509 Certificate markers. */
+static RTCRPEMMARKER     const g_aCertificateMarkers[] = { { g_aWords_Certificate, RT_ELEMENTS(g_aWords_Certificate) } };
+
+
+RTDECL(int) RTCrX509Certificate_ReadFromFile(PRTCRX509CERTIFICATE pCertificate, const char *pszFilename, uint32_t fFlags,
+                                             PCRTASN1ALLOCATORVTABLE pAllocator, PRTERRINFO pErrInfo)
+{
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+    PCRTCRPEMSECTION pSectionHead;
+    int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        RTCRX509CERTIFICATE TmpCert;
+        RTASN1CURSORPRIMARY PrimaryCursor;
+        RTAsn1CursorInitPrimary(&PrimaryCursor, pSectionHead->pbData, (uint32_t)RT_MIN(pSectionHead->cbData, UINT32_MAX),
+                                pErrInfo, pAllocator, RTASN1CURSOR_FLAGS_DER, RTPathFilename(pszFilename));
+        rc = RTCrX509Certificate_DecodeAsn1(&PrimaryCursor.Cursor, 0, &TmpCert, "Cert");
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTCrX509Certificate_CheckSanity(&TmpCert, 0, pErrInfo, "Cert");
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTCrX509Certificate_Clone(pCertificate, &TmpCert, &g_RTAsn1DefaultAllocator);
+                if (RT_SUCCESS(rc))
+                {
+                    if (pSectionHead->pNext || PrimaryCursor.Cursor.cbLeft)
+                        rc = VINF_ASN1_MORE_DATA;
+                }
+            }
+            RTCrX509Certificate_Delete(&TmpCert);
+        }
+        RTCrPemFreeSections(pSectionHead);
+    }
+    return rc;
+}
+
+
+
+#if 0
+RTDECL(int) RTCrX509Certificates_ReadFromFile(const char *pszFilename, uint32_t fFlags,
+                                              PRTCRX509CERTIFICATES pCertificates, PRTERRINFO pErrInfo)
+{
+    AssertReturn(!fFlags, VERR_INVALID_FLAGS);
+    PCRTCRPEMSECTION pSectionHead;
+    int rc = RTCrPemReadFile(pszFilename, 0, g_aCertificateMarkers, RT_ELEMENTS(g_aCertificateMarkers), &pSectionHead, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        pCertificates->Allocation
+
+        PCRTCRPEMSECTION pCurSec = pSectionHead;
+        while (pCurSec)
+        {
+
+            pCurSec = pCurSec->pNext;
+        }
+
+        RTCrPemFreeSections(pSectionHead);
+    }
+    return rc;
+}
+#endif
+
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/crypto/x509-init.cpp
similarity index 53%
copy from src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
copy to src/VBox/Runtime/common/crypto/x509-init.cpp
index 492f2f4..ed5f688 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/crypto/x509-init.cpp
@@ -1,10 +1,10 @@
-/* $Id: RTStrPrintHexBytes.cpp $ */
+/* $Id: x509-init.cpp $ */
 /** @file
- * IPRT - RTStrPrintHexBytes.
+ * IPRT - Crypto - X.509, Initialization API.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -29,30 +29,48 @@
 *   Header Files                                                               *
 *******************************************************************************/
 #include "internal/iprt.h"
-#include <iprt/string.h>
+#include <iprt/crypto/x509.h>
 
-#include <iprt/assert.h>
 #include <iprt/err.h>
+#include <iprt/string.h>
+#include <iprt/uni.h>
+
+#include "x509-internal.h"
+
+
+static int rtCrX509Extension_ExtnValue_Clone(PRTCRX509EXTENSION pThis, PCRTCRX509EXTENSION pSrc)
+{
+    pThis->enmValue = pSrc->enmValue;
+    return VINF_SUCCESS;
+}
 
 
-RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
+RTDECL(int) RTCrX509Name_RecodeAsUtf8(PRTCRX509NAME pThis, PCRTASN1ALLOCATORVTABLE pAllocator)
 {
-    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
-    AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
-    AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
-    if (cb)
-        AssertPtrReturn(pv, VERR_INVALID_POINTER);
-
-    uint8_t const *pb = (uint8_t const *)pv;
-    while (cb-- > 0)
+    uint32_t                            cRdns = pThis->cItems;
+    PRTCRX509RELATIVEDISTINGUISHEDNAME  pRdn   = &pThis->paItems[0];
+    while (cRdns-- > 0)
     {
-        static char const s_szHexDigits[17] = "0123456789abcdef";
-        uint8_t b = *pb++;
-        *pszBuf++ = s_szHexDigits[b >> 4];
-        *pszBuf++ = s_szHexDigits[b & 0xf];
+        uint32_t                        cAttribs = pRdn->cItems;
+        PRTCRX509ATTRIBUTETYPEANDVALUE  pAttrib  = &pRdn->paItems[0];
+        while (cAttribs-- > 0)
+        {
+            if (pAttrib->Value.enmType == RTASN1TYPE_STRING)
+            {
+                int rc = RTAsn1String_RecodeAsUtf8(&pAttrib->Value.u.String, pAllocator);
+                if (RT_FAILURE(rc))
+                    return rc;
+            }
+            pAttrib++;
+        }
+        pRdn++;
     }
-    *pszBuf = '\0';
     return VINF_SUCCESS;
 }
 
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-init.h>
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/crypto/x509-internal.h
similarity index 52%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/crypto/x509-internal.h
index 35b6d89..9eb95e8 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/crypto/x509-internal.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: x509-internal.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Crypto - X.509, Internal Header.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,11 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#ifndef ___common_crypto_x509_internal_h
+#define ___common_crypto_x509_internal_h
 
+#define RTASN1TMPL_TEMPLATE_FILE "../common/crypto/x509-template.h"
+#include <iprt/asn1-generator-internal-header.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#endif
 
diff --git a/src/VBox/Runtime/common/crypto/x509-sanity.cpp b/src/VBox/Runtime/common/crypto/x509-sanity.cpp
new file mode 100644
index 0000000..3b8e3a3
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-sanity.cpp
@@ -0,0 +1,149 @@
+/* $Id: x509-sanity.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, Sanity Checkers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+#include "x509-internal.h"
+
+
+
+static int rtCrX509Validity_CheckSanityExtra(PCRTCRX509VALIDITY pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RTAsn1Time_Compare(&pThis->NotBefore, &pThis->NotAfter) > 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_VALIDITY_SWAPPED, "%s: NotBefore is after NotAfter", pszErrorTag);
+    /** @todo check tag constraints? */
+    return VINF_SUCCESS;
+}
+
+
+static int rtCrX509Name_CheckSanityExtra(PCRTCRX509NAME pThis, uint32_t fFlags, PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (pThis->cItems == 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_SET, "%s: Has no components.", pszErrorTag);
+
+    for (uint32_t i = 0; i < pThis->cItems; i++)
+    {
+        if (pThis->cItems == 0)
+            return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_SUB_SET,
+                                 "%s: Items[%u] has no sub components.", pszErrorTag, i);
+
+        for (uint32_t j = 0; j < pThis->paItems[i].cItems; j++)
+        {
+            if (pThis->paItems[i].paItems[j].Value.enmType != RTASN1TYPE_STRING)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_NOT_STRING,
+                                     "%s: Items[%u].paItems[%u].enmType is %d instead of string (%d).",
+                                     pszErrorTag, i, j, pThis->paItems[i].paItems[j].Value.enmType, RTASN1TYPE_STRING);
+            if (pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.cb == 0)
+                return RTErrInfoSetF(pErrInfo, VERR_CR_X509_NAME_EMPTY_STRING,
+                                     "%s: Items[%u].paItems[%u] is an empty string", pszErrorTag, i, j);
+            switch (pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.uTag)
+            {
+                case ASN1_TAG_PRINTABLE_STRING:
+                case ASN1_TAG_UTF8_STRING:
+                    break;
+                case ASN1_TAG_T61_STRING:
+                case ASN1_TAG_UNIVERSAL_STRING:
+                case ASN1_TAG_BMP_STRING:
+                    break;
+                case ASN1_TAG_IA5_STRING: /* Used by "Microsoft Root Certificate Authority" in the "com" part of the Issuer. */
+                    break;
+                default:
+                    return RTErrInfoSetF(pErrInfo, VERR_CR_X509_INVALID_NAME_STRING_TAG,
+                                         "%s: Items[%u].paItems[%u] invalid string type: %u",  pszErrorTag, i, j,
+                                         pThis->paItems[i].paItems[j].Value.u.String.Asn1Core.uTag);
+            }
+        }
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+static int rtCrX509SubjectPublicKeyInfo_CheckSanityExtra(PCRTCRX509SUBJECTPUBLICKEYINFO pThis, uint32_t fFlags,
+                                                         PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (pThis->SubjectPublicKey.cBits <= 32)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_PUBLIC_KEY_TOO_SMALL,
+                             "%s: SubjectPublicKey is too small, only %u bits", pszErrorTag, pThis->SubjectPublicKey.cBits);
+    return VINF_SUCCESS;
+}
+
+
+static int rtCrX509TbsCertificate_CheckSanityExtra(PCRTCRX509TBSCERTIFICATE pThis, uint32_t fFlags,
+                                                   PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (   RTAsn1Integer_IsPresent(&pThis->T0.Version)
+        && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V1) != 0
+        && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V2) != 0
+        && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V3) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION,
+                             "%s: Unknown Version number: %llu",
+                             pszErrorTag, pThis->T0.Version.uValue.u);
+
+    if (   pThis->SerialNumber.Asn1Core.cb < 1
+        || pThis->SerialNumber.Asn1Core.cb > 1024)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_SERIAL_NUMBER_OUT_OF_BOUNDS,
+                             "%s: Bad SerialNumber length: %u", pszErrorTag, pThis->SerialNumber.Asn1Core.cb);
+
+    if (  (   RTAsn1BitString_IsPresent(&pThis->T1.IssuerUniqueId)
+           || RTAsn1BitString_IsPresent(&pThis->T2.SubjectUniqueId))
+        && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V2) < 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_UNIQUE_IDS_REQ_V2,
+                             "%s: IssuerUniqueId and SubjectUniqueId requires version 2", pszErrorTag);
+
+    if (   RTCrX509Extensions_IsPresent(&pThis->T3.Extensions)
+        && RTAsn1Integer_UnsignedCompareWithU32(&pThis->T0.Version, RTCRX509TBSCERTIFICATE_V3) < 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_TBSCERT_EXTS_REQ_V3, "%s: Extensions requires version 3", pszErrorTag);
+
+    return VINF_SUCCESS;
+}
+
+
+static int rtCrX509Certificate_CheckSanityExtra(PCRTCRX509CERTIFICATE pThis, uint32_t fFlags,
+                                               PRTERRINFO pErrInfo, const char *pszErrorTag)
+{
+    if (RTCrX509AlgorithmIdentifier_Compare(&pThis->SignatureAlgorithm, &pThis->TbsCertificate.Signature) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH,
+                             "%s: SignatureAlgorithm (%s) does not match TbsCertificate.Signature (%s).", pszErrorTag,
+                             pThis->SignatureAlgorithm.Algorithm.szObjId,
+                             pThis->TbsCertificate.Signature.Algorithm.szObjId);
+    return VINF_SUCCESS;
+}
+
+
+/*
+ * Generate the code.
+ */
+#include <iprt/asn1-generator-sanity.h>
+
diff --git a/src/VBox/Runtime/common/crypto/x509-template.h b/src/VBox/Runtime/common/crypto/x509-template.h
new file mode 100644
index 0000000..c378521
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-template.h
@@ -0,0 +1,441 @@
+/* $Id: x509-template.h $ */
+/** @file
+ * IPRT - Crypto - X.509, Code Generator Template.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#define RTASN1TMPL_DECL         RTDECL
+
+/*
+ * X.509 Validity.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509VALIDITY
+#define RTASN1TMPL_EXT_NAME     RTCrX509Validity
+#define RTASN1TMPL_INT_NAME     rtCrX509Validity
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              NotBefore,          RTASN1TIME,                     RTAsn1Time);
+RTASN1TMPL_MEMBER(              NotAfter,           RTASN1TIME,                     RTAsn1Time);
+RTASN1TMPL_EXEC_CHECK_SANITY(   rc = rtCrX509Validity_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Algorithm Identifier.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509ALGORITHMIDENTIFIER
+#define RTASN1TMPL_EXT_NAME     RTCrX509AlgorithmIdentifier
+#define RTASN1TMPL_INT_NAME     rtCrX509AlgorithmIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Algorithm,          RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER(              Parameters,         RTASN1DYNTYPE,                  RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 Algorithm Identifiers.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509ALGORITHMIDENTIFIERS
+#define RTASN1TMPL_EXT_NAME     RTCrX509AlgorithmIdentifiers
+#define RTASN1TMPL_INT_NAME     rtCrX509AlgorithmIdentifiers
+RTASN1TMPL_SET_OF(RTCRX509ALGORITHMIDENTIFIER, RTCrX509AlgorithmIdentifier);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 AttributeTypeAndValue.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509ATTRIBUTETYPEANDVALUE
+#define RTASN1TMPL_EXT_NAME     RTCrX509AttributeTypeAndValue
+#define RTASN1TMPL_INT_NAME     rtCrX509AttributeTypeAndValue
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Type,               RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER(              Value,              RTASN1DYNTYPE,                  RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 AttributeTypeAndValues / X.509 RelativeDistinguishedName.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509ATTRIBUTETYPEANDVALUES
+#define RTASN1TMPL_EXT_NAME     RTCrX509AttributeTypeAndValues
+#define RTASN1TMPL_INT_NAME     rtCrX509AttributeTypeAndValues
+RTASN1TMPL_SET_OF(RTCRX509ATTRIBUTETYPEANDVALUE, RTCrX509AttributeTypeAndValue);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * X.509 Name.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509NAME
+#define RTASN1TMPL_EXT_NAME     RTCrX509Name
+#define RTASN1TMPL_INT_NAME     rtCrX509Name
+#undef  RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() rc = rtCrX509Name_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag)
+RTASN1TMPL_SEQ_OF(RTCRX509RELATIVEDISTINGUISHEDNAME, RTCrX509RelativeDistinguishedName);
+#undef  RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY
+#define RTASN1TMPL_SET_SEQ_EXEC_CHECK_SANITY() do { } while (0)
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+/*
+ * One X.509 GeneralName.
+ * Note! This is simplified and might not work correctly for all types with
+ *       non-DER compatible encodings.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509GENERALNAME
+#define RTASN1TMPL_EXT_NAME     RTCrX509GeneralName
+#define RTASN1TMPL_INT_NAME     rtCrX509GeneralName
+RTASN1TMPL_BEGIN_PCHOICE();
+RTASN1TMPL_PCHOICE_XTAG(        0, RTCRX509GENERALNAMECHOICE_OTHER_NAME,     u.pT0, CtxTag0, Other,         RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_ITAG_CP(     1, RTCRX509GENERALNAMECHOICE_RFC822_NAME,    u.pT1_Rfc822,   Rfc822,        RTASN1STRING,  RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG_CP(     2, RTCRX509GENERALNAMECHOICE_DNS_NAME,       u.pT2_DnsName,  DnsType,       RTASN1STRING,  RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_XTAG(        3, RTCRX509GENERALNAMECHOICE_X400_ADDRESS,   u.pT3, CtxTag3, X400Address,   RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_XTAG(        4, RTCRX509GENERALNAMECHOICE_DIRECTORY_NAME, u.pT4, CtxTag4, DirectoryName, RTCRX509NAME,  RTCrX509Name);
+RTASN1TMPL_PCHOICE_XTAG(        5, RTCRX509GENERALNAMECHOICE_EDI_PARTY_NAME, u.pT5, CtxTag5, EdiPartyName,  RTASN1DYNTYPE, RTAsn1DynType); /** @todo */
+RTASN1TMPL_PCHOICE_ITAG_CP(     6, RTCRX509GENERALNAMECHOICE_URI,            u.pT6_Uri,      Uri,           RTASN1STRING,  RTAsn1Ia5String);
+RTASN1TMPL_PCHOICE_ITAG_CP(     7, RTCRX509GENERALNAMECHOICE_IP_ADDRESS,     u.pT7_IpAddress, IpAddress,    RTASN1OCTETSTRING, RTAsn1OctetString); /** @todo Constraints */
+RTASN1TMPL_PCHOICE_ITAG_CP(     8, RTCRX509GENERALNAMECHOICE_REGISTERED_ID,  u.pT8_RegisteredId,RegisteredId,RTASN1OBJID,  RTAsn1ObjId);
+RTASN1TMPL_END_PCHOICE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 GeneralNames.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509GENERALNAMES
+#define RTASN1TMPL_EXT_NAME     RTCrX509GeneralNames
+#define RTASN1TMPL_INT_NAME     rtCrX509GeneralNames
+RTASN1TMPL_SEQ_OF(RTCRX509GENERALNAME, RTCrX509GeneralName);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 UniqueIdentifier - RTASN1BITSTRING alias.
+ */
+
+
+/*
+ * X.509 SubjectPublicKeyInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509SUBJECTPUBLICKEYINFO
+#define RTASN1TMPL_EXT_NAME     RTCrX509SubjectPublicKeyInfo
+#define RTASN1TMPL_INT_NAME     rtCrX509SubjectPublicKeyInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Algorithm,          RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              SubjectPublicKey,   RTASN1BITSTRING,                RTAsn1BitString);
+RTASN1TMPL_EXEC_CHECK_SANITY(   rc = rtCrX509SubjectPublicKeyInfo_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 AuthorityKeyIdentifier (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509AUTHORITYKEYIDENTIFIER
+#define RTASN1TMPL_EXT_NAME     RTCrX509AuthorityKeyIdentifier
+#define RTASN1TMPL_INT_NAME     rtCrX509AuthorityKeyIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  KeyIdentifier,                      RTASN1OCTETSTRING,      RTAsn1OctetString,      0);
+RTASN1TMPL_MEMBER_OPT_ITAG(     AuthorityCertIssuer,                RTCRX509GENERALNAMES,   RTCrX509GeneralNames,   1);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  AuthorityCertSerialNumber,          RTASN1INTEGER,          RTAsn1Integer,          2);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 OldAuthorityKeyIdentifier (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509OLDAUTHORITYKEYIDENTIFIER
+#define RTASN1TMPL_EXT_NAME     RTCrX509OldAuthorityKeyIdentifier
+#define RTASN1TMPL_INT_NAME     rtCrX509OldAuthorityKeyIdentifier
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  KeyIdentifier,                      RTASN1OCTETSTRING,      RTAsn1OctetString,      0);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T1, CtxTag1, AuthorityCertIssuer,   RTCRX509NAME,           RTCrX509Name,           1);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  AuthorityCertSerialNumber,          RTASN1INTEGER,          RTAsn1Integer,          2);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyQualifierInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYQUALIFIERINFO
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyQualifierInfo
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyQualifierInfo
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              PolicyQualifierId,                  RTASN1OBJID,            RTAsn1ObjId);
+RTASN1TMPL_MEMBER(              Qualifier,                          RTASN1DYNTYPE,          RTAsn1DynType);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 PolicyQualifierInfo.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYQUALIFIERINFOS
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyQualifierInfos
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyQualifierInfos
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYQUALIFIERINFO, RTCrX509PolicyQualifierInfo);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyInformation.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYINFORMATION
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyInformation
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyInformation
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              PolicyIdentifier, RTASN1OBJID,                  RTAsn1ObjId);
+RTASN1TMPL_MEMBER_OPT_ITAG_UC(  PolicyQualifiers, RTCRX509POLICYQUALIFIERINFOS, RTCrX509PolicyQualifierInfos, ASN1_TAG_SEQUENCE);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 CertificatePolicies.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509CERTIFICATEPOLICIES
+#define RTASN1TMPL_EXT_NAME     RTCrX509CertificatePolicies
+#define RTASN1TMPL_INT_NAME     rtCrX509CertificatePolicies
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYINFORMATION, RTCrX509PolicyInformation);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 PolicyMapping (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYMAPPING
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyMapping
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyMapping
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              IssuerDomainPolicy,                 RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER(              SubjectDomainPolicy,                RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 PolicyMappings (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYMAPPINGS
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyMappings
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyMappings
+RTASN1TMPL_SEQ_OF(RTCRX509POLICYMAPPING, RTCrX509PolicyMapping);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 BasicConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509BASICCONSTRAINTS
+#define RTASN1TMPL_EXT_NAME     RTCrX509BasicConstraints
+#define RTASN1TMPL_INT_NAME     rtCrX509BasicConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_DEF_ITAG_UP(  CA,                                 RTASN1BOOLEAN,      RTAsn1Boolean,    ASN1_TAG_BOOLEAN, false);
+RTASN1TMPL_MEMBER_OPT_ITAG_UP(  PathLenConstraint,                  RTASN1INTEGER,      RTAsn1Integer,    ASN1_TAG_INTEGER);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 GeneralSubtree (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509GENERALSUBTREE
+#define RTASN1TMPL_EXT_NAME     RTCrX509GeneralSubtree
+#define RTASN1TMPL_INT_NAME     rtCrX509GeneralSubtree
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              Base,                               RTCRX509GENERALNAME,            RTCrX509GeneralName);
+RTASN1TMPL_MEMBER_DEF_ITAG_UP(  Minimum,                            RTASN1INTEGER,                  RTAsn1Integer,    ASN1_TAG_INTEGER, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG_UP(  Maximum,                            RTASN1INTEGER,                  RTAsn1Integer,    ASN1_TAG_INTEGER);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+
+/*
+ * Sequence of X.509 GeneralSubtrees (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509GENERALSUBTREES
+#define RTASN1TMPL_EXT_NAME     RTCrX509GeneralSubtrees
+#define RTASN1TMPL_INT_NAME     rtCrX509GeneralSubtrees
+RTASN1TMPL_SEQ_OF(RTCRX509GENERALSUBTREE, RTCrX509GeneralSubtree);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 NameConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509NAMECONSTRAINTS
+#define RTASN1TMPL_EXT_NAME     RTCrX509NameConstraints
+#define RTASN1TMPL_INT_NAME     rtCrX509NameConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_XTAG(     T0, CtxTag0, PermittedSubtrees,     RTCRX509GENERALSUBTREES,        RTCrX509GeneralSubtrees, 0);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T1, CtxTag1, ExcludedSubtrees,      RTCRX509GENERALSUBTREES,        RTCrX509GeneralSubtrees, 1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 PolicyConstraints (IPRT representation).
+ */
+#define RTASN1TMPL_TYPE         RTCRX509POLICYCONSTRAINTS
+#define RTASN1TMPL_EXT_NAME     RTCrX509PolicyConstraints
+#define RTASN1TMPL_INT_NAME     rtCrX509PolicyConstraints
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  RequireExplicitPolicy,              RTASN1INTEGER,                  RTAsn1Integer, 0);
+RTASN1TMPL_MEMBER_OPT_ITAG_CP(  InhibitPolicyMapping,               RTASN1INTEGER,                  RTAsn1Integer, 1);
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Extension.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509EXTENSION
+#define RTASN1TMPL_EXT_NAME     RTCrX509Extension
+#define RTASN1TMPL_INT_NAME     rtCrX509Extension
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              ExtnId,                             RTASN1OBJID,                    RTAsn1ObjId);
+RTASN1TMPL_MEMBER_DEF_ITAG_UP(  Critical,                           RTASN1BOOLEAN,                  RTAsn1Boolean, ASN1_TAG_BOOLEAN, false);
+RTASN1TMPL_MEMBER(              ExtnValue,                          RTASN1OCTETSTRING,              RTAsn1OctetString);
+RTASN1TMPL_EXEC_DECODE(rc = RTCrX509Extension_ExtnValue_DecodeAsn1(pCursor, fFlags, pThis, "ExtnValue"))
+RTASN1TMPL_EXEC_CLONE( rc = rtCrX509Extension_ExtnValue_Clone(pThis, pSrc))
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Sequence of X.509 Extensions.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509EXTENSIONS
+#define RTASN1TMPL_EXT_NAME     RTCrX509Extensions
+#define RTASN1TMPL_INT_NAME     rtCrX509Extensions
+RTASN1TMPL_SEQ_OF(RTCRX509EXTENSION, RTCrX509Extension);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * X.509 TbsCertificate.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509TBSCERTIFICATE
+#define RTASN1TMPL_EXT_NAME     RTCrX509TbsCertificate
+#define RTASN1TMPL_INT_NAME     rtCrX509TbsCertificate
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER_OPT_XTAG(     T0, CtxTag0, Version,               RTASN1INTEGER,                  RTAsn1Integer, 0);
+RTASN1TMPL_MEMBER(              SerialNumber,                       RTASN1INTEGER,                  RTAsn1Integer);
+RTASN1TMPL_MEMBER(              Signature,                          RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              Issuer,                             RTCRX509NAME,                   RTCrX509Name);
+RTASN1TMPL_MEMBER(              Validity,                           RTCRX509VALIDITY,               RTCrX509Validity);
+RTASN1TMPL_MEMBER(              Subject,                            RTCRX509NAME,                   RTCrX509Name);
+RTASN1TMPL_MEMBER(              SubjectPublicKeyInfo,               RTCRX509SUBJECTPUBLICKEYINFO,   RTCrX509SubjectPublicKeyInfo);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T1, CtxTag1, IssuerUniqueId,        RTCRX509UNIQUEIDENTIFIER,       RTCrX509UniqueIdentifier, 1);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T2, CtxTag2, SubjectUniqueId,       RTCRX509UNIQUEIDENTIFIER,       RTCrX509UniqueIdentifier, 2);
+RTASN1TMPL_MEMBER_OPT_XTAG(     T3, CtxTag3, Extensions,            RTCRX509EXTENSIONS,             RTCrX509Extensions, 3);
+RTASN1TMPL_EXEC_DECODE(         rc = RTCrX509TbsCertificate_ReprocessExtensions(pThis, pCursor->pPrimary->pErrInfo) )
+RTASN1TMPL_EXEC_CLONE(          rc = RTCrX509TbsCertificate_ReprocessExtensions(pThis, NULL) )
+RTASN1TMPL_EXEC_CHECK_SANITY(   rc = rtCrX509TbsCertificate_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * One X.509 Certificate.
+ */
+#define RTASN1TMPL_TYPE         RTCRX509CERTIFICATE
+#define RTASN1TMPL_EXT_NAME     RTCrX509Certificate
+#define RTASN1TMPL_INT_NAME     rtCrX509Certificate
+RTASN1TMPL_BEGIN_SEQCORE();
+RTASN1TMPL_MEMBER(              TbsCertificate,                     RTCRX509TBSCERTIFICATE,         RTCrX509TbsCertificate);
+RTASN1TMPL_MEMBER(              SignatureAlgorithm,                 RTCRX509ALGORITHMIDENTIFIER,    RTCrX509AlgorithmIdentifier);
+RTASN1TMPL_MEMBER(              SignatureValue,                     RTASN1BITSTRING,                RTAsn1BitString);
+RTASN1TMPL_EXEC_CHECK_SANITY(   rc = rtCrX509Certificate_CheckSanityExtra(pThis, fFlags, pErrInfo, pszErrorTag) )
+RTASN1TMPL_END_SEQCORE();
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
+
+/*
+ * Set of X.509 Certificates.
+ */
+/** @todo Microsoft Hacks. ExtendedCertificates. */
+#define RTASN1TMPL_TYPE         RTCRX509CERTIFICATES
+#define RTASN1TMPL_EXT_NAME     RTCrX509Certificates
+#define RTASN1TMPL_INT_NAME     rtCrX509Certificates
+RTASN1TMPL_SET_OF(RTCRX509CERTIFICATE, RTCrX509Certificate);
+#undef RTASN1TMPL_TYPE
+#undef RTASN1TMPL_EXT_NAME
+#undef RTASN1TMPL_INT_NAME
+
diff --git a/src/VBox/Runtime/common/crypto/x509-verify.cpp b/src/VBox/Runtime/common/crypto/x509-verify.cpp
new file mode 100644
index 0000000..1beb086
--- /dev/null
+++ b/src/VBox/Runtime/common/crypto/x509-verify.cpp
@@ -0,0 +1,85 @@
+/* $Id: x509-verify.cpp $ */
+/** @file
+ * IPRT - Crypto - X.509, Signature verficiation.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkix.h>
+
+#include <iprt/err.h>
+#include <iprt/string.h>
+
+
+RTDECL(int) RTCrX509Certificate_VerifySignature(PCRTCRX509CERTIFICATE pThis, PCRTASN1OBJID pAlgorithm,
+                                                PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
+                                                PRTERRINFO pErrInfo)
+{
+    /*
+     * Validate the input a little.
+     */
+    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
+    AssertReturn(RTCrX509Certificate_IsPresent(pThis), VERR_INVALID_PARAMETER);
+
+    AssertPtrReturn(pAlgorithm, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1ObjId_IsPresent(pAlgorithm), VERR_INVALID_POINTER);
+
+    if (pParameters)
+    {
+        AssertPtrReturn(pParameters, VERR_INVALID_POINTER);
+        if (pParameters->enmType == RTASN1TYPE_NULL)
+            pParameters = NULL;
+    }
+
+    AssertPtrReturn(pPublicKey, VERR_INVALID_POINTER);
+    AssertReturn(RTAsn1BitString_IsPresent(pPublicKey), VERR_INVALID_POINTER);
+
+    /*
+     * Check if the algorithm matches.
+     */
+    const char *pszCipherOid = RTCrPkixGetCiperOidFromSignatureAlgorithm(&pThis->SignatureAlgorithm.Algorithm);
+    if (!pszCipherOid)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO,
+                             "Certificate signature algorithm not known: %s",
+                             pThis->SignatureAlgorithm.Algorithm.szObjId);
+
+    if (RTAsn1ObjId_CompareWithString(pAlgorithm, pszCipherOid) != 0)
+        return RTErrInfoSetF(pErrInfo, VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH,
+                             "Certificate signature cipher algorithm mismatch: cert uses %s (%s) while key uses %s",
+                             pszCipherOid, pThis->SignatureAlgorithm.Algorithm.szObjId, pAlgorithm->szObjId);
+
+    /*
+     * Here we should recode the to-be-signed part as DER, but we'll ASSUME
+     * that it's already in DER encoding.  This is safe.
+     */
+    return RTCrPkixPubKeyVerifySignature(&pThis->SignatureAlgorithm.Algorithm, pParameters, pPublicKey, &pThis->SignatureValue,
+                                         RTASN1CORE_GET_RAW_ASN1_PTR(&pThis->TbsCertificate.SeqCore.Asn1Core),
+                                         RTASN1CORE_GET_RAW_ASN1_SIZE(&pThis->TbsCertificate.SeqCore.Asn1Core),
+                                         pErrInfo);
+}
+
diff --git a/src/VBox/Runtime/common/dbg/dbgcfg.cpp b/src/VBox/Runtime/common/dbg/dbgcfg.cpp
index 7755518..63a13c9 100644
--- a/src/VBox/Runtime/common/dbg/dbgcfg.cpp
+++ b/src/VBox/Runtime/common/dbg/dbgcfg.cpp
@@ -1424,8 +1424,6 @@ RTDECL(int) RTDbgCfgOpenDsymBundle(RTDBGCFG hDbgCfg, const char *pszImage, PCRTU
     int rcRet = VINF_SUCCESS;
     int rc2;
 
-    //RTStrPrintf(szFile, sizeof(szFile), "%s.dSYM/Contents/Resources/DWARF/%s", pszFilename, pszFilename);
-
     /*
      * Do a little validating first.
      */
@@ -1542,8 +1540,6 @@ RTDECL(int) RTDbgCfgOpenDsymBundle(RTDBGCFG hDbgCfg, const char *pszImage, PCRTU
     else if (RT_SUCCESS(rcRet))
         rcRet = VERR_NOT_FOUND;
     return rcRet;
-
-
 }
 
 
diff --git a/src/VBox/Runtime/common/dbg/dbgmod.cpp b/src/VBox/Runtime/common/dbg/dbgmod.cpp
index 7e627fd..2755a72 100644
--- a/src/VBox/Runtime/common/dbg/dbgmod.cpp
+++ b/src/VBox/Runtime/common/dbg/dbgmod.cpp
@@ -46,6 +46,7 @@
 #include <iprt/semaphore.h>
 #include <iprt/strcache.h>
 #include <iprt/string.h>
+#include <iprt/uuid.h>
 #include "internal/dbgmod.h"
 #include "internal/magics.h"
 
@@ -325,7 +326,7 @@ RTDECL(int) RTDbgModCreate(PRTDBGMOD phDbgMod, const char *pszName, RTUINTPTR cb
     *phDbgMod = NIL_RTDBGMOD;
     AssertPtrReturn(pszName, VERR_INVALID_POINTER);
     AssertReturn(*pszName, VERR_INVALID_PARAMETER);
-    AssertReturn(fFlags == 0, VERR_INVALID_PARAMETER);
+    AssertReturn(fFlags == 0 || fFlags == RTDBGMOD_F_NOT_DEFERRED, VERR_INVALID_PARAMETER);
 
     int rc = rtDbgModLazyInit();
     if (RT_FAILURE(rc))
@@ -1134,7 +1135,8 @@ RTDECL(int) RTDbgModCreateFromPeImage(PRTDBGMOD phDbgMod, const char *pszFilenam
                     else
                     {
                         PRTDBGMODDEFERRED pDeferred;
-                        rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromPeImageDeferredCallback, cbImage, hDbgCfg, &pDeferred);
+                        rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromPeImageDeferredCallback, cbImage, hDbgCfg, 0,
+                                                    &pDeferred);
                         if (RT_SUCCESS(rc))
                             pDeferred->u.PeImage.uTimestamp = uTimestamp;
                     }
@@ -1169,6 +1171,302 @@ RTDECL(int) RTDbgModCreateFromPeImage(PRTDBGMOD phDbgMod, const char *pszFilenam
 RT_EXPORT_SYMBOL(RTDbgModCreateFromPeImage);
 
 
+
+
+/*
+ *
+ *  M a c h - O   I M A G E
+ *  M a c h - O   I M A G E
+ *  M a c h - O   I M A G E
+ *
+ */
+
+/** @callback_method_impl{FNRTDBGCFGOPEN} */
+static DECLCALLBACK(int)
+rtDbgModFromMachOImageOpenMachOCallback(RTDBGCFG hDbgCfg, const char *pszFilename, void *pvUser1, void *pvUser2)
+{
+    PRTDBGMODINT        pDbgMod   = (PRTDBGMODINT)pvUser1;
+    PCRTDBGDWARFSEGPKG  pSegPkg   = (PCRTDBGDWARFSEGPKG)pvUser2;
+
+    /** @todo  */
+
+    return VERR_OPEN_FAILED;
+}
+
+
+/** @callback_method_impl{FNRTDBGCFGOPEN} */
+static DECLCALLBACK(int)
+rtDbgModFromMachOImageOpenDsymCallback(RTDBGCFG hDbgCfg, const char *pszFilename, void *pvUser1, void *pvUser2)
+{
+    PRTDBGMODINT        pDbgMod   = (PRTDBGMODINT)pvUser1;
+    PCRTDBGDWARFSEGPKG  pSegPkg   = (PCRTDBGDWARFSEGPKG)pvUser2;
+
+    Assert(!pDbgMod->pDbgVt);
+    Assert(!pDbgMod->pvDbgPriv);
+    Assert(!pDbgMod->pszDbgFile);
+    Assert(!pDbgMod->pImgVt);
+    Assert(!pDbgMod->pvDbgPriv);
+    Assert(pDbgMod->pszImgFile);
+    Assert(pDbgMod->pszImgFileSpecified);
+
+    const char *pszImgFileOrg = pDbgMod->pszImgFile;
+    pDbgMod->pszImgFile = RTStrCacheEnter(g_hDbgModStrCache, pszFilename);
+    if (!pDbgMod->pszImgFile)
+        return VERR_NO_STR_MEMORY;
+    RTStrCacheRetain(pDbgMod->pszImgFile);
+    pDbgMod->pszDbgFile = pDbgMod->pszImgFile;
+
+    /*
+     * Try image interpreters as the dwarf file inside the dSYM bundle is a
+     * Mach-O file with dwarf debug sections insides it and no code or data.
+     */
+    int rc = RTSemRWRequestRead(g_hDbgModRWSem, RT_INDEFINITE_WAIT);
+    if (RT_SUCCESS(rc))
+    {
+        rc = VERR_DBG_NO_MATCHING_INTERPRETER;
+        PRTDBGMODREGIMG pImg;
+        for (pImg = g_pImgHead; pImg; pImg = pImg->pNext)
+        {
+            pDbgMod->pImgVt    = pImg->pVt;
+            pDbgMod->pvImgPriv = NULL;
+            rc = pImg->pVt->pfnTryOpen(pDbgMod, pSegPkg->enmArch);
+            if (RT_SUCCESS(rc))
+                break;
+            pDbgMod->pImgVt    = NULL;
+            Assert(pDbgMod->pvImgPriv == NULL);
+        }
+
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Check the UUID if one was given.
+             */
+            if (pSegPkg->pUuid)
+            {
+                RTUUID UuidOpened;
+                rc = pDbgMod->pImgVt->pfnQueryProp(pDbgMod, RTLDRPROP_UUID, &UuidOpened, sizeof(UuidOpened));
+                if (RT_SUCCESS(rc))
+                {
+                    if (RTUuidCompare(&UuidOpened, pSegPkg->pUuid) != 0)
+                        rc = VERR_DBG_FILE_MISMATCH;
+                }
+                else if (rc == VERR_NOT_FOUND || rc == VERR_NOT_IMPLEMENTED)
+                    rc = VERR_DBG_FILE_MISMATCH;
+            }
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Pass it to the DWARF reader(s).
+                 */
+                for (PRTDBGMODREGDBG pDbg = g_pDbgHead; pDbg; pDbg = pDbg->pNext)
+                {
+                    if (pDbg->pVt->fSupports & RT_DBGTYPE_DWARF)
+                    {
+                        pDbgMod->pDbgVt    = pDbg->pVt;
+                        pDbgMod->pvDbgPriv = pSegPkg->cSegs ? (void *)pSegPkg : NULL;
+                        rc = pDbg->pVt->pfnTryOpen(pDbgMod, pDbgMod->pImgVt->pfnGetArch(pDbgMod));
+                        if (RT_SUCCESS(rc))
+                        {
+                            /*
+                             * Got it!
+                             */
+                            ASMAtomicIncU32(&pDbg->cUsers);
+                            RTSemRWReleaseRead(g_hDbgModRWSem);
+                            RTStrCacheRelease(g_hDbgModStrCache, pszImgFileOrg);
+                            return VINF_CALLBACK_RETURN;
+                        }
+                        pDbgMod->pDbgVt    = NULL;
+                        Assert(pDbgMod->pvDbgPriv == NULL);
+                    }
+                }
+            }
+
+            pDbgMod->pImgVt->pfnClose(pDbgMod);
+            pDbgMod->pImgVt    = NULL;
+            pDbgMod->pvImgPriv = NULL;
+        }
+    }
+
+    /* No joy. */
+    RTSemRWReleaseRead(g_hDbgModRWSem);
+    RTStrCacheRelease(g_hDbgModStrCache, pDbgMod->pszImgFile);
+    pDbgMod->pszImgFile = pszImgFileOrg;
+    RTStrCacheRelease(g_hDbgModStrCache, pDbgMod->pszDbgFile);
+    pDbgMod->pszDbgFile = NULL;
+    return rc;
+}
+
+
+static int rtDbgModFromMachOImageWorker(PRTDBGMODINT pDbgMod, RTLDRARCH enmArch, uint32_t cbImage,
+                                        uint32_t cSegs, PCRTDBGSEGMENT paSegs, PCRTUUID pUuid, RTDBGCFG hDbgCfg)
+{
+    RTDBGDWARFSEGPKG SegPkg;
+    SegPkg.cSegs    = cSegs;
+    SegPkg.paSegs   = paSegs;
+    SegPkg.enmArch  = enmArch;
+    SegPkg.pUuid    = pUuid && RTUuidIsNull(pUuid) ? pUuid : NULL;
+
+    /*
+     * Search for the .dSYM bundle first, since that's generally all we need.
+     */
+    int rc = RTDbgCfgOpenDsymBundle(hDbgCfg, pDbgMod->pszImgFile, pUuid,
+                                    rtDbgModFromMachOImageOpenDsymCallback, pDbgMod, &SegPkg);
+    if (RT_FAILURE(rc))
+    {
+        /*
+         * If we cannot get at the .dSYM, try the executable image.
+         */
+        //rc = RTDbgCfgOpenMachOImage(hDbgCfg, pDbgMod->pszImgFile, pUuid,
+        //                            rtDbgModFromMachOImageOpenMachOCallback, pDbgMod, &SegPkg);
+    }
+    return rc;
+}
+
+
+/** @callback_method_impl{FNRTDBGMODDEFERRED}  */
+static DECLCALLBACK(int) rtDbgModFromMachOImageDeferredCallback(PRTDBGMODINT pDbgMod, PRTDBGMODDEFERRED pDeferred)
+{
+    return rtDbgModFromMachOImageWorker(pDbgMod, pDeferred->u.MachO.enmArch, pDeferred->cbImage,
+                                        pDeferred->u.MachO.cSegs, pDeferred->u.MachO.aSegs,
+                                        &pDeferred->u.MachO.Uuid, pDeferred->hDbgCfg);
+}
+
+
+RTDECL(int) RTDbgModCreateFromMachOImage(PRTDBGMOD phDbgMod, const char *pszFilename, const char *pszName,
+                                         RTLDRARCH enmArch, uint32_t cbImage, uint32_t cSegs, PCRTDBGSEGMENT paSegs,
+                                         PCRTUUID pUuid, RTDBGCFG hDbgCfg, uint32_t fFlags)
+{
+    /*
+     * Input validation and lazy initialization.
+     */
+    AssertPtrReturn(phDbgMod, VERR_INVALID_POINTER);
+    *phDbgMod = NIL_RTDBGMOD;
+    AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
+    AssertReturn(*pszFilename, VERR_INVALID_PARAMETER);
+    if (!pszName)
+        pszName = RTPathFilenameEx(pszFilename, RTPATH_STR_F_STYLE_HOST);
+    AssertPtrReturn(pszName, VERR_INVALID_POINTER);
+    if (cSegs)
+    {
+        AssertReturn(cSegs < 1024, VERR_INVALID_PARAMETER);
+        AssertPtrReturn(paSegs, VERR_INVALID_POINTER);
+        AssertReturn(!cbImage, VERR_INVALID_PARAMETER);
+    }
+    AssertReturn(cbImage || cSegs, VERR_INVALID_PARAMETER);
+    AssertPtrNullReturn(pUuid, VERR_INVALID_POINTER);
+    AssertReturn(!(fFlags & ~(RTDBGMOD_F_NOT_DEFERRED)), VERR_INVALID_PARAMETER);
+
+    int rc = rtDbgModLazyInit();
+    if (RT_FAILURE(rc))
+        return rc;
+
+    uint64_t fDbgCfg = 0;
+    if (hDbgCfg)
+    {
+        rc = RTDbgCfgQueryUInt(hDbgCfg, RTDBGCFGPROP_FLAGS, &fDbgCfg);
+        AssertRCReturn(rc, rc);
+    }
+
+    /*
+     * Allocate a new module instance.
+     */
+    PRTDBGMODINT pDbgMod = (PRTDBGMODINT)RTMemAllocZ(sizeof(*pDbgMod));
+    if (!pDbgMod)
+        return VERR_NO_MEMORY;
+    pDbgMod->u32Magic = RTDBGMOD_MAGIC;
+    pDbgMod->cRefs = 1;
+    rc = RTCritSectInit(&pDbgMod->CritSect);
+    if (RT_SUCCESS(rc))
+    {
+        pDbgMod->pszName = RTStrCacheEnterLower(g_hDbgModStrCache, pszName);
+        if (pDbgMod->pszName)
+        {
+            pDbgMod->pszImgFile = RTStrCacheEnter(g_hDbgModStrCache, pszFilename);
+            if (pDbgMod->pszImgFile)
+            {
+                RTStrCacheRetain(pDbgMod->pszImgFile);
+                pDbgMod->pszImgFileSpecified = pDbgMod->pszImgFile;
+
+                /*
+                 * Load it immediately?
+                 */
+                if (   !(fDbgCfg & RTDBGCFG_FLAGS_DEFERRED)
+                    || (!cbImage && !cSegs)
+                    || (fFlags & RTDBGMOD_F_NOT_DEFERRED) )
+                    rc = rtDbgModFromMachOImageWorker(pDbgMod, enmArch, cbImage, cSegs, paSegs, pUuid, hDbgCfg);
+                else
+                {
+                    /*
+                     * Procrastinate.  Need image size atm.
+                     */
+                    uint32_t uRvaMax = cbImage;
+                    if (!uRvaMax)
+                        for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
+                        {
+                            if (   paSegs[iSeg].uRva > uRvaMax
+                                && paSegs[iSeg].uRva - uRvaMax < _1M)
+                                uRvaMax = paSegs[iSeg].uRva;
+                            uRvaMax += paSegs[iSeg].cb;
+                        }
+
+                    PRTDBGMODDEFERRED pDeferred;
+                    rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromMachOImageDeferredCallback, uRvaMax, hDbgCfg,
+                                                RT_OFFSETOF(RTDBGMODDEFERRED, u.MachO.aSegs[cSegs]),
+                                                &pDeferred);
+                    if (RT_SUCCESS(rc))
+                    {
+                        pDeferred->u.MachO.Uuid    = *pUuid;
+                        pDeferred->u.MachO.enmArch = enmArch;
+                        pDeferred->u.MachO.cSegs   = cSegs;
+                        if (cSegs)
+                        {
+                            memcpy(&pDeferred->u.MachO.aSegs, paSegs, cSegs * sizeof(paSegs[0]));
+                            if (!cbImage)
+                            {
+                                /* If we calculated a cbImage above, do corresponding RVA adjustments. */
+                                uRvaMax = 0;
+                                for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
+                                {
+                                    if (   paSegs[iSeg].uRva > uRvaMax
+                                        && paSegs[iSeg].uRva - uRvaMax < _1M)
+                                        uRvaMax = paSegs[iSeg].uRva;
+                                    else
+                                        pDeferred->u.MachO.aSegs[iSeg].uRva = uRvaMax;
+                                    uRvaMax += paSegs[iSeg].cb;
+                                }
+                            }
+                        }
+                    }
+                }
+                if (RT_SUCCESS(rc))
+                {
+                    *phDbgMod = pDbgMod;
+                    return VINF_SUCCESS;
+                }
+
+                /* Failed, bail out. */
+                RTStrCacheRelease(g_hDbgModStrCache, pDbgMod->pszName);
+            }
+            else
+                rc = VERR_NO_STR_MEMORY;
+            RTStrCacheRelease(g_hDbgModStrCache, pDbgMod->pszImgFileSpecified);
+            RTStrCacheRelease(g_hDbgModStrCache, pDbgMod->pszImgFile);
+        }
+        else
+            rc = VERR_NO_STR_MEMORY;
+        RTCritSectDelete(&pDbgMod->CritSect);
+    }
+
+    RTMemFree(pDbgMod);
+    return rc;
+}
+
+
+
+RT_EXPORT_SYMBOL(RTDbgModCreateFromMachOImage);
+
+
+
 /**
  * Destroys an module after the reference count has reached zero.
  *
diff --git a/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp b/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp
index 1e2893e..276d67b 100644
--- a/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp
+++ b/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp
@@ -439,6 +439,15 @@ DECL_HIDDEN_CONST(RTDBGMODVTDBG) const g_rtDbgModVtDbgDeferred =
  *
  */
 
+/** @interface_method_impl{RTDBGMODVTIMG,pfnQueryProp} */
+static DECLCALLBACK(int ) rtDbgModDeferredImg_QueryProp(PRTDBGMODINT pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
+{
+    int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
+    if (RT_SUCCESS(rc))
+        rc = pMod->pImgVt->pfnQueryProp(pMod, enmProp, pvBuf, cbBuf);
+    return rc;
+}
+
 
 /** @interface_method_impl{RTDBGMODVTIMG,pfnGetArch} */
 static DECLCALLBACK(RTLDRARCH) rtDbgModDeferredImg_GetArch(PRTDBGMODINT pMod)
@@ -592,6 +601,7 @@ DECL_HIDDEN_CONST(RTDBGMODVTIMG) const g_rtDbgModVtImgDeferred =
     /*.pfnReadAt = */                   rtDbgModDeferredImg_ReadAt,
     /*.pfnGetFormat = */                rtDbgModDeferredImg_GetFormat,
     /*.pfnGetArch = */                  rtDbgModDeferredImg_GetArch,
+    /*.pfnQueryProp = */                rtDbgModDeferredImg_QueryProp,
 
     /*.u32EndMagic = */                 RTDBGMODVTIMG_MAGIC
 };
@@ -607,14 +617,18 @@ DECL_HIDDEN_CONST(RTDBGMODVTIMG) const g_rtDbgModVtImgDeferred =
  * @param   cbImage             The size of the image.
  * @param   hDbgCfg             The debug config handle.  Can be NIL.  A
  *                              reference will be retained.
+ * @param   cbDeferred          The size of the deferred instance data, 0 if the
+ *                              default structure is good enough.
  * @param   ppDeferred          Where to return the instance data. Can be NULL.
  */
 DECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
-                                       RTDBGCFG hDbgCfg, PRTDBGMODDEFERRED *ppDeferred)
+                                       RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred)
 {
     AssertReturn(!pDbgMod->pDbgVt, VERR_DBG_MOD_IPE);
 
-    PRTDBGMODDEFERRED pDeferred = (PRTDBGMODDEFERRED)RTMemAllocZ(sizeof(*pDeferred));
+    if (cbDeferred < sizeof(RTDBGMODDEFERRED))
+        cbDeferred = sizeof(RTDBGMODDEFERRED);
+    PRTDBGMODDEFERRED pDeferred = (PRTDBGMODDEFERRED)RTMemAllocZ(cbDeferred);
     if (!pDeferred)
         return VERR_NO_MEMORY;
 
diff --git a/src/VBox/Runtime/common/dbg/dbgmodldr.cpp b/src/VBox/Runtime/common/dbg/dbgmodldr.cpp
index 64ad918..7d4a599 100644
--- a/src/VBox/Runtime/common/dbg/dbgmodldr.cpp
+++ b/src/VBox/Runtime/common/dbg/dbgmodldr.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2011 Oracle Corporation
+ * Copyright (C) 2011-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -60,6 +60,14 @@ typedef RTDBGMODLDR *PRTDBGMODLDR;
 
 
 
+/** @interface_method_impl{RTDBGMODVTIMG,pfnQueryProp} */
+static DECLCALLBACK(int) rtDbgModLdr_QueryProp(PRTDBGMODINT pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
+{
+    PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv;
+    return RTLdrQueryProp(pThis->hLdrMod, enmProp, pvBuf, cbBuf);
+}
+
+
 /** @interface_method_impl{RTDBGMODVTIMG,pfnGetArch} */
 static DECLCALLBACK(RTLDRARCH) rtDbgModLdr_GetArch(PRTDBGMODINT pMod)
 {
@@ -215,6 +223,7 @@ DECL_HIDDEN_CONST(RTDBGMODVTIMG) const g_rtDbgModVtImgLdr =
     /*.pfnReadAt = */                   rtDbgModLdr_ReadAt,
     /*.pfnGetFormat = */                rtDbgModLdr_GetFormat,
     /*.pfnGetArch = */                  rtDbgModLdr_GetArch,
+    /*.pfnQueryProp = */                rtDbgModLdr_QueryProp,
 
     /*.u32EndMagic = */                 RTDBGMODVTIMG_MAGIC
 };
diff --git a/src/VBox/Runtime/common/err/errinfo.cpp b/src/VBox/Runtime/common/err/errinfo-alloc.cpp
similarity index 64%
copy from src/VBox/Runtime/common/err/errinfo.cpp
copy to src/VBox/Runtime/common/err/errinfo-alloc.cpp
index 4d50db5..7e9017b 100644
--- a/src/VBox/Runtime/common/err/errinfo.cpp
+++ b/src/VBox/Runtime/common/err/errinfo-alloc.cpp
@@ -1,10 +1,10 @@
-/* $Id: errinfo.cpp $ */
+/* $Id: errinfo-alloc.cpp $ */
 /** @file
- * IPRT - Error Info.
+ * IPRT - Error Info, Allocators.
  */
 
 /*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -68,43 +68,3 @@ RTDECL(void)        RTErrInfoFree(PRTERRINFO pErrInfo)
     RTMemTmpFree(pErrInfo);
 }
 
-
-RTDECL(int)         RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
-{
-    if (pErrInfo)
-    {
-        AssertPtr(pErrInfo);
-        Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
-
-        RTStrCopy(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
-        pErrInfo->rc      = rc;
-        pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
-    }
-    return rc;
-}
-
-
-RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
-{
-    va_list va;
-    va_start(va, pszFormat);
-    RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
-    va_end(va);
-    return rc;
-}
-
-
-RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
-{
-    if (pErrInfo)
-    {
-        AssertPtr(pErrInfo);
-        Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
-
-        RTStrPrintfV(pErrInfo->pszMsg, pErrInfo->cbMsg, pszFormat, va);
-        pErrInfo->rc      = rc;
-        pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
-    }
-    return rc;
-}
-
diff --git a/src/VBox/Runtime/common/err/errinfo.cpp b/src/VBox/Runtime/common/err/errinfo.cpp
index 4d50db5..aef23b8 100644
--- a/src/VBox/Runtime/common/err/errinfo.cpp
+++ b/src/VBox/Runtime/common/err/errinfo.cpp
@@ -1,10 +1,10 @@
 /* $Id: errinfo.cpp $ */
 /** @file
- * IPRT - Error Info.
+ * IPRT - Error Info, Setters.
  */
 
 /*
- * Copyright (C) 2010-2012 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -32,51 +32,42 @@
 #include <iprt/err.h>
 
 #include <iprt/assert.h>
-#include <iprt/mem.h>
 #include <iprt/string.h>
 
 
-
-RTDECL(PRTERRINFO)  RTErrInfoAlloc(size_t cbMsg)
+RTDECL(int) RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
 {
-    PRTERRINFO pErrInfo;
-    RTErrInfoAllocEx(cbMsg, &pErrInfo);
-    return pErrInfo;
-}
-
+    if (pErrInfo)
+    {
+        AssertPtr(pErrInfo);
+        Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
 
-RTDECL(int)         RTErrInfoAllocEx(size_t cbMsg, PRTERRINFO *ppErrInfo)
-{
-    if (cbMsg == 0)
-        cbMsg = _4K;
-    else
-        cbMsg = RT_ALIGN_Z(cbMsg, 256);
-
-    PRTERRINFO pErrInfo;
-    *ppErrInfo = pErrInfo = (PRTERRINFO)RTMemTmpAlloc(sizeof(*pErrInfo) + cbMsg);
-    if (RT_UNLIKELY(!pErrInfo))
-        return VERR_NO_TMP_MEMORY;
-
-    RTErrInfoInit(pErrInfo, (char *)(pErrInfo + 1), cbMsg);
-    pErrInfo->fFlags = RTERRINFO_FLAGS_T_ALLOC | RTERRINFO_FLAGS_MAGIC;
-    return VINF_SUCCESS;
+        RTStrCopy(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+        pErrInfo->rc      = rc;
+        pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
+    }
+    return rc;
 }
 
 
-RTDECL(void)        RTErrInfoFree(PRTERRINFO pErrInfo)
+RTDECL(int) RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
 {
-    RTMemTmpFree(pErrInfo);
+    va_list va;
+    va_start(va, pszFormat);
+    RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+    va_end(va);
+    return rc;
 }
 
 
-RTDECL(int)         RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
+RTDECL(int) RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
 {
     if (pErrInfo)
     {
         AssertPtr(pErrInfo);
         Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
 
-        RTStrCopy(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+        RTStrPrintfV(pErrInfo->pszMsg, pErrInfo->cbMsg, pszFormat, va);
         pErrInfo->rc      = rc;
         pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
     }
@@ -84,26 +75,52 @@ RTDECL(int)         RTErrInfoSet(PRTERRINFO pErrInfo, int rc, const char *pszMsg
 }
 
 
-RTDECL(int)         RTErrInfoSetF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
+RTDECL(int) RTErrInfoAdd(PRTERRINFO pErrInfo, int rc, const char *pszMsg)
+{
+    if (pErrInfo)
+    {
+        AssertPtr(pErrInfo);
+        if (pErrInfo->fFlags & RTERRINFO_FLAGS_SET)
+            RTStrCat(pErrInfo->pszMsg, pErrInfo->cbMsg, pszMsg);
+        else
+        {
+            while (*pszMsg == ' ')
+                pszMsg++;
+            return RTErrInfoSet(pErrInfo, rc, pszMsg);
+        }
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTErrInfoAddF(PRTERRINFO pErrInfo, int rc, const char *pszFormat, ...)
 {
     va_list va;
     va_start(va, pszFormat);
-    RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+    RTErrInfoAddV(pErrInfo, rc, pszFormat, va);
     va_end(va);
     return rc;
 }
 
 
-RTDECL(int)         RTErrInfoSetV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
+RTDECL(int) RTErrInfoAddV(PRTERRINFO pErrInfo, int rc, const char *pszFormat, va_list va)
 {
     if (pErrInfo)
     {
         AssertPtr(pErrInfo);
         Assert((pErrInfo->fFlags & RTERRINFO_FLAGS_MAGIC_MASK) == RTERRINFO_FLAGS_MAGIC);
-
-        RTStrPrintfV(pErrInfo->pszMsg, pErrInfo->cbMsg, pszFormat, va);
-        pErrInfo->rc      = rc;
-        pErrInfo->fFlags |= RTERRINFO_FLAGS_SET;
+        if (pErrInfo->fFlags & RTERRINFO_FLAGS_SET)
+        {
+            char *pszOut = (char *)memchr(pErrInfo->pszMsg, '\0', pErrInfo->cbMsg - 2);
+            if (pszOut)
+                RTStrPrintfV(pszOut, &pErrInfo->pszMsg[pErrInfo->cbMsg] - pszOut, pszFormat, va);
+        }
+        else
+        {
+            while (*pszFormat == ' ')
+                pszFormat++;
+            return RTErrInfoSetV(pErrInfo, rc, pszFormat, va);
+        }
     }
     return rc;
 }
diff --git a/src/VBox/Runtime/common/err/errmsg.cpp b/src/VBox/Runtime/common/err/errmsg.cpp
index 31cd437..a48f135 100644
--- a/src/VBox/Runtime/common/err/errmsg.cpp
+++ b/src/VBox/Runtime/common/err/errmsg.cpp
@@ -45,7 +45,11 @@
  */
 static const RTSTATUSMSG  g_aStatusMsgs[] =
 {
-#include "errmsgdata.h"
+#ifndef IPRT_NO_ERROR_DATA
+# include "errmsgdata.h"
+#else
+    { "Success.", "Success.", "VINF_SUCCESS", 0 },
+#endif
     { NULL, NULL, NULL, 0 }
 };
 
@@ -76,7 +80,7 @@ RTDECL(PCRTSTATUSMSG) RTErrGet(int rc)
 {
     unsigned iFound = ~0;
     unsigned i;
-    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1; i++)
     {
         if (g_aStatusMsgs[i].iCode == rc)
         {
@@ -104,7 +108,7 @@ RTDECL(PCRTSTATUSMSG) RTErrGet(int rc)
      * Need to use the temporary stuff.
      */
     int iMsg = ASMAtomicXchgU32(&g_iUnknownMsgs, (g_iUnknownMsgs + 1) % RT_ELEMENTS(g_aUnknownMsgs));
-    RTStrPrintf(&g_aszUnknownStr[iMsg][0], sizeof(g_aszUnknownStr[iMsg]), "Unknown Status 0x%X", rc);
+    RTStrPrintf(&g_aszUnknownStr[iMsg][0], sizeof(g_aszUnknownStr[iMsg]), "Unknown Status %d (%#x)", rc, rc);
     return &g_aUnknownMsgs[iMsg];
 }
 RT_EXPORT_SYMBOL(RTErrGet);
diff --git a/src/VBox/Runtime/common/ldr/Makefile.kup b/src/VBox/Runtime/common/ldr/Makefile.kup
index e69de29..d3f5a12 100644
--- a/src/VBox/Runtime/common/ldr/Makefile.kup
+++ b/src/VBox/Runtime/common/ldr/Makefile.kup
@@ -0,0 +1 @@
+
diff --git a/src/VBox/Runtime/common/ldr/ldr.cpp b/src/VBox/Runtime/common/ldr/ldr.cpp
index 218b410..7c4e5d7 100644
--- a/src/VBox/Runtime/common/ldr/ldr.cpp
+++ b/src/VBox/Runtime/common/ldr/ldr.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -40,23 +40,6 @@
 #include "internal/ldr.h"
 
 
-RTDECL(bool) RTLdrIsLoadable(const char *pszFilename)
-{
-    /*
-     * Try to load the library.
-     */
-    RTLDRMOD hLib;
-    int rc = RTLdrLoad(pszFilename, &hLib);
-    if (RT_SUCCESS(rc))
-    {
-        RTLdrClose(hLib);
-        return true;
-    }
-    return false;
-}
-RT_EXPORT_SYMBOL(RTLdrIsLoadable);
-
-
 RTDECL(int) RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue)
 {
     LogFlow(("RTLdrGetSymbol: hLdrMod=%RTldrm pszSymbol=%p:{%s} ppvValue=%p\n",
@@ -147,6 +130,8 @@ RTDECL(int) RTLdrClose(RTLDRMOD hLdrMod)
     /*
      * Validate input.
      */
+    if (hLdrMod == NIL_RTLDRMOD)
+        return VINF_SUCCESS;
     AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
     //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
diff --git a/src/VBox/Runtime/common/ldr/ldrELF.cpp b/src/VBox/Runtime/common/ldr/ldrELF.cpp
index ce08533..8053ec3 100644
--- a/src/VBox/Runtime/common/ldr/ldrELF.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrELF.cpp
@@ -116,8 +116,9 @@ static const char *rtldrElfGetShdrType(uint32_t iType)
  * @param   fFlags      Reserved, MBZ.
  * @param   enmArch     Architecture specifier.
  * @param   phLdrMod    Where to store the handle.
+ * @param   pErrInfo    Where to return extended error information. Optional.
  */
-int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
+int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
 {
     const char *pszLogName = pReader->pfnLogName(pReader); NOREF(pszLogName);
 
diff --git a/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h b/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
index bd7760b..212129d 100644
--- a/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
+++ b/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
@@ -1400,6 +1400,9 @@ static RTLDROPS RTLDRELF_MID(s_rtldrElf,Ops) =
     RTLDRELF_NAME(SegOffsetToRva),
     RTLDRELF_NAME(RvaToSegOffset),
     RTLDRELF_NAME(ReadDbgInfo),
+    NULL /*pfnQueryProp*/,
+    NULL /*pfnVerifySignature*/,
+    NULL /*pfnHashImage*/,
     42
 };
 
diff --git a/src/VBox/Runtime/common/ldr/ldrEx.cpp b/src/VBox/Runtime/common/ldr/ldrEx.cpp
index ba73910..46f10c0 100644
--- a/src/VBox/Runtime/common/ldr/ldrEx.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrEx.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2013 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -32,27 +32,44 @@
 #include <iprt/ldr.h>
 #include "internal/iprt.h"
 
-#include <iprt/alloc.h>
 #include <iprt/assert.h>
+#include <iprt/err.h>
 #include <iprt/log.h>
+#include <iprt/md5.h>
+#include <iprt/mem.h>
+#include <iprt/sha.h>
 #include <iprt/string.h>
-#include <iprt/err.h>
 #include "internal/ldr.h"
 #include "internal/ldrMZ.h"
 
+#ifdef LDR_ONLY_PE
+# undef LDR_WITH_PE
+# undef LDR_WITH_KLDR
+# undef LDR_WITH_ELF
+# undef LDR_WITH_LX
+# undef LDR_WITH_LE
+# undef LDR_WITH_NE
+# undef LDR_WITH_MZ
+# undef LDR_WITH_AOUT
+# define LDR_WITH_PE
+#endif
 
-/**
- * Open part with reader.
- *
- * @returns iprt status code.
- * @param   pReader     The loader reader instance which will provide the raw image bits.
- * @param   fFlags      Reserved, MBZ.
- * @param   enmArch     Architecture specifier.
- * @param   phMod       Where to store the handle.
- */
-int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod)
+
+RTDECL(int) RTLdrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod, PRTERRINFO pErrInfo)
 {
     /*
+     * Resolve RTLDRARCH_HOST.
+     */
+    if (enmArch == RTLDRARCH_HOST)
+#if   defined(RT_ARCH_AMD64)
+        enmArch = RTLDRARCH_AMD64;
+#elif defined(RT_ARCH_X86)
+        enmArch = RTLDRARCH_X86_32;
+#else
+        enmArch = RTLDRARCH_WHATEVER;
+#endif
+
+    /*
      * Read and verify the file signature.
      */
     union
@@ -104,37 +121,37 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
      */
     if (uSign.u32 == IMAGE_NT_SIGNATURE)
 #ifdef LDR_WITH_PE
-        rc = rtldrPEOpen(pReader, fFlags, enmArch, offHdr, phMod);
+        rc = rtldrPEOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
 #else
         rc = VERR_PE_EXE_NOT_SUPPORTED;
 #endif
     else if (uSign.u32 == IMAGE_ELF_SIGNATURE)
 #if defined(LDR_WITH_ELF)
-        rc = rtldrELFOpen(pReader, fFlags, enmArch, phMod);
+        rc = rtldrELFOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
 #else
         rc = VERR_ELF_EXE_NOT_SUPPORTED;
 #endif
     else if (uSign.au16[0] == IMAGE_LX_SIGNATURE)
 #ifdef LDR_WITH_LX
-        rc = rtldrLXOpen(pReader, fFlags, enmArch, offHdr, phMod);
+        rc = rtldrLXOpen(pReader, fFlags, enmArch, offHdr, phMod, pErrInfo);
 #else
         rc = VERR_LX_EXE_NOT_SUPPORTED;
 #endif
     else if (uSign.au16[0] == IMAGE_LE_SIGNATURE)
 #ifdef LDR_WITH_LE
-        rc = rtldrLEOpen(pReader, fFlags, enmArch, phMod);
+        rc = rtldrLEOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
 #else
         rc = VERR_LE_EXE_NOT_SUPPORTED;
 #endif
     else if (uSign.au16[0] == IMAGE_NE_SIGNATURE)
 #ifdef LDR_WITH_NE
-        rc = rtldrNEOpen(pReader, fFlags, enmArch, phMod);
+        rc = rtldrNEOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
 #else
         rc = VERR_NE_EXE_NOT_SUPPORTED;
 #endif
     else if (uSign.au16[0] == IMAGE_DOS_SIGNATURE)
 #ifdef LDR_WITH_MZ
-        rc = rtldrMZOpen(pReader, fFlags, enmArch, phMod);
+        rc = rtldrMZOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
 #else
         rc = VERR_MZ_EXE_NOT_SUPPORTED;
 #endif
@@ -142,7 +159,7 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
              || uSign.u32 == IMAGE_AOUT_Z_SIGNATURE*/ /** @todo find the aout magics in emx or binutils. */
              0)
 #ifdef LDR_WITH_AOUT
-        rc = rtldrAOUTOpen(pReader, fFlags, enmArch, phMod);
+        rc = rtldrAOUTOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
 #else
         rc = VERR_AOUT_EXE_NOT_SUPPORTED;
 #endif
@@ -157,7 +174,14 @@ int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch
 #ifdef LDR_WITH_KLDR
     /* Try kLdr if it's a format we don't recognize. */
     if (rc <= VERR_INVALID_EXE_SIGNATURE && rc > VERR_BAD_EXE_FORMAT)
-        rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phMod);
+    {
+        int rc2 = rtldrkLdrOpen(pReader, fFlags, enmArch, phMod, pErrInfo);
+        if (   RT_SUCCESS(rc2)
+            || (rc == VERR_INVALID_EXE_SIGNATURE && rc2 != VERR_MZ_EXE_NOT_SUPPORTED /* Quick fix for bad return code. */)
+            || rc2 >  VERR_INVALID_EXE_SIGNATURE
+            || rc2 <= VERR_BAD_EXE_FORMAT)
+            rc = rc2;
+    }
 #endif
 
     LogFlow(("rtldrOpenWithReader: %s: returns %Rrc *phMod=%p\n", pReader->pfnLogName(pReader), rc, *phMod));
@@ -539,6 +563,111 @@ RTDECL(int) RTLdrRvaToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR Rva, uint32_t *piSeg
 RT_EXPORT_SYMBOL(RTLdrRvaToSegOffset);
 
 
+RTDECL(int) RTLdrQueryProp(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf)
+{
+    return RTLdrQueryPropEx(hLdrMod, enmProp, pvBuf, cbBuf, NULL);
+}
+RT_EXPORT_SYMBOL(RTLdrQueryProp);
+
+
+RTDECL(int) RTLdrQueryPropEx(RTLDRMOD hLdrMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
+{
+    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), RTLDRENDIAN_INVALID);
+    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+
+    AssertPtrNullReturn(pcbRet, VERR_INVALID_POINTER);
+    size_t cbRet;
+    if (!pcbRet)
+        pcbRet = &cbRet;
+
+    /*
+     * Do some pre screening of the input
+     */
+    switch (enmProp)
+    {
+        case RTLDRPROP_UUID:
+            *pcbRet = sizeof(RTUUID);
+            AssertReturn(cbBuf == sizeof(RTUUID), VERR_INVALID_PARAMETER);
+            break;
+        case RTLDRPROP_TIMESTAMP_SECONDS:
+            *pcbRet = sizeof(int64_t);
+            AssertReturn(cbBuf == sizeof(int32_t) || cbBuf == sizeof(int64_t), VERR_INVALID_PARAMETER);
+            break;
+        case RTLDRPROP_IS_SIGNED:
+            *pcbRet = sizeof(bool);
+            AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER);
+            break;
+        case RTLDRPROP_PKCS7_SIGNED_DATA:
+            *pcbRet = 0;
+            break;
+        case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED:
+            *pcbRet = sizeof(bool);
+            AssertReturn(cbBuf == sizeof(bool), VERR_INVALID_PARAMETER);
+            break;
+
+        default:
+            AssertFailedReturn(VERR_INVALID_FUNCTION);
+    }
+    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+
+    /*
+     * Call the image specific worker, if there is one.
+     */
+    if (!pMod->pOps->pfnQueryProp)
+        return VERR_NOT_SUPPORTED;
+    return pMod->pOps->pfnQueryProp(pMod, enmProp, pvBuf, cbBuf, pcbRet);
+}
+RT_EXPORT_SYMBOL(RTLdrQueryPropEx);
+
+
+RTDECL(int) RTLdrVerifySignature(RTLDRMOD hLdrMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser, PRTERRINFO pErrInfo)
+{
+    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
+    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+    AssertPtrReturn(pfnCallback, VERR_INVALID_POINTER);
+
+    /*
+     * Call the image specific worker, if there is one.
+     */
+    if (!pMod->pOps->pfnVerifySignature)
+        return VERR_NOT_SUPPORTED;
+    return pMod->pOps->pfnVerifySignature(pMod, pfnCallback, pvUser, pErrInfo);
+}
+RT_EXPORT_SYMBOL(RTLdrVerifySignature);
+
+
+RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
+{
+    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
+    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
+
+    /*
+     * Make sure there is sufficient space for the wanted digest and that
+     * it's supported.
+     */
+    switch (enmDigest)
+    {
+        case RTDIGESTTYPE_MD5:      AssertReturn(cbDigest >= RTMD5_DIGEST_LEN    + 1, VERR_BUFFER_OVERFLOW); break;
+        case RTDIGESTTYPE_SHA1:     AssertReturn(cbDigest >= RTSHA1_DIGEST_LEN   + 1, VERR_BUFFER_OVERFLOW); break;
+        case RTDIGESTTYPE_SHA256:   AssertReturn(cbDigest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+        case RTDIGESTTYPE_SHA512:   AssertReturn(cbDigest >= RTSHA512_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
+        default:
+            if (enmDigest > RTDIGESTTYPE_INVALID && enmDigest < RTDIGESTTYPE_END)
+                return VERR_NOT_SUPPORTED;
+            AssertFailedReturn(VERR_INVALID_PARAMETER);
+    }
+    AssertPtrReturn(pszDigest, VERR_INVALID_POINTER);
+
+    /*
+     * Call the image specific worker, if there is one.
+     */
+    if (!pMod->pOps->pfnHashImage)
+        return VERR_NOT_SUPPORTED;
+    return pMod->pOps->pfnHashImage(pMod, enmDigest, pszDigest, cbDigest);
+}
+RT_EXPORT_SYMBOL(RTLdrHashImage);
+
+
 /**
  * Internal method used by the IPRT debug bits.
  *
diff --git a/src/VBox/Runtime/common/ldr/ldrFile.cpp b/src/VBox/Runtime/common/ldr/ldrFile.cpp
index e10fe70..ab78e5c 100644
--- a/src/VBox/Runtime/common/ldr/ldrFile.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrFile.cpp
@@ -217,6 +217,7 @@ static int rtldrFileCreate(PRTLDRREADER *ppReader, const char *pszFilename)
             rc = RTFileGetSize(pFileReader->hFile, (uint64_t *)&pFileReader->cbFile);
             if (RT_SUCCESS(rc))
             {
+                pFileReader->Core.uMagic     = RTLDRREADER_MAGIC;
                 pFileReader->Core.pfnRead    = rtldrFileRead;
                 pFileReader->Core.pfnTell    = rtldrFileTell;
                 pFileReader->Core.pfnSize    = rtldrFileSize;
@@ -257,25 +258,13 @@ RTDECL(int) RTLdrOpen(const char *pszFilename, uint32_t fFlags, RTLDRARCH enmArc
     AssertMsgReturn(enmArch > RTLDRARCH_INVALID && enmArch < RTLDRARCH_END, ("%d\n", enmArch), VERR_INVALID_PARAMETER);
 
     /*
-     * Resolve RTLDRARCH_HOST.
-     */
-    if (enmArch == RTLDRARCH_HOST)
-#if   defined(RT_ARCH_AMD64)
-        enmArch = RTLDRARCH_AMD64;
-#elif defined(RT_ARCH_X86)
-        enmArch = RTLDRARCH_X86_32;
-#else
-        enmArch = RTLDRARCH_WHATEVER;
-#endif
-
-    /*
      * Create file reader & invoke worker which identifies and calls the image interpreter.
      */
     PRTLDRREADER pReader;
     int rc = rtldrFileCreate(&pReader, pszFilename);
     if (RT_SUCCESS(rc))
     {
-        rc = rtldrOpenWithReader(pReader, fFlags, enmArch, phLdrMod);
+        rc = RTLdrOpenWithReader(pReader, fFlags, enmArch, phLdrMod, NULL);
         if (RT_SUCCESS(rc))
         {
             LogFlow(("RTLdrOpen: return %Rrc *phLdrMod\n", rc, *phLdrMod));
@@ -308,25 +297,13 @@ RTDECL(int) RTLdrOpenkLdr(const char *pszFilename, uint32_t fFlags, RTLDRARCH en
     AssertMsgReturn(!(fFlags & ~RTLDR_O_VALID_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
 
     /*
-     * Resolve RTLDRARCH_HOST.
-     */
-    if (enmArch == RTLDRARCH_HOST)
-# if   defined(RT_ARCH_AMD64)
-        enmArch = RTLDRARCH_AMD64;
-# elif defined(RT_ARCH_X86)
-        enmArch = RTLDRARCH_X86_32;
-# else
-        enmArch = RTLDRARCH_WHATEVER;
-# endif
-
-    /*
      * Create file reader & invoke worker which identifies and calls the image interpreter.
      */
     PRTLDRREADER pReader;
     int rc = rtldrFileCreate(&pReader, pszFilename);
     if (RT_SUCCESS(rc))
     {
-        rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phLdrMod);
+        rc = rtldrkLdrOpen(pReader, fFlags, enmArch, phLdrMod, NULL);
         if (RT_SUCCESS(rc))
         {
             LogFlow(("RTLdrOpenkLdr: return %Rrc *phLdrMod\n", rc, *phLdrMod));
diff --git a/src/VBox/Runtime/common/ldr/ldrMemory.cpp b/src/VBox/Runtime/common/ldr/ldrMemory.cpp
index 7e82c90..c402949 100644
--- a/src/VBox/Runtime/common/ldr/ldrMemory.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrMemory.cpp
@@ -243,7 +243,7 @@ static int rtldrRdrMem_Create(PRTLDRREADER *ppReader, const char *pszName, size_
         pThis->pfnDtor      = pfnDtor ? pfnDtor : rtldrRdrMemDefaultDtor;
         pThis->pvMapping    = NULL;
         pThis->cMappings    = 0;
-        pThis->Core.pszName    = "rdrmem";
+        pThis->Core.uMagic     = RTLDRREADER_MAGIC;
         pThis->Core.pfnRead    = rtldrRdrMem_Read;
         pThis->Core.pfnTell    = rtldrRdrMem_Tell;
         pThis->Core.pfnSize    = rtldrRdrMem_Size;
@@ -304,7 +304,7 @@ RTDECL(int) RTLdrOpenInMemory(const char *pszName, uint32_t fFlags, RTLDRARCH en
     int rc = rtldrRdrMem_Create(&pReader, pszName, cbImage, pfnRead, pfnDtor, pvUser);
     if (RT_SUCCESS(rc))
     {
-        rc = rtldrOpenWithReader(pReader, fFlags, enmArch, phLdrMod);
+        rc = RTLdrOpenWithReader(pReader, fFlags, enmArch, phLdrMod, NULL);
         if (RT_SUCCESS(rc))
         {
             LogFlow(("RTLdrOpen: return %Rrc *phLdrMod\n", rc, *phLdrMod));
diff --git a/src/VBox/Runtime/common/ldr/ldrNative.cpp b/src/VBox/Runtime/common/ldr/ldrNative.cpp
index 38fe571..d189681 100644
--- a/src/VBox/Runtime/common/ldr/ldrNative.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrNative.cpp
@@ -81,6 +81,9 @@ static const RTLDROPS g_rtldrNativeOps =
     NULL,
     NULL,
     NULL,
+    NULL,
+    NULL,
+    NULL,
     42
 };
 
@@ -317,3 +320,20 @@ RTDECL(uintptr_t) RTLdrGetNativeHandle(RTLDRMOD hLdrMod)
 }
 RT_EXPORT_SYMBOL(RTLdrGetNativeHandle);
 
+
+RTDECL(bool) RTLdrIsLoadable(const char *pszFilename)
+{
+    /*
+     * Try to load the library.
+     */
+    RTLDRMOD hLib;
+    int rc = RTLdrLoad(pszFilename, &hLib);
+    if (RT_SUCCESS(rc))
+    {
+        RTLdrClose(hLib);
+        return true;
+    }
+    return false;
+}
+RT_EXPORT_SYMBOL(RTLdrIsLoadable);
+
diff --git a/src/VBox/Runtime/common/ldr/ldrPE.cpp b/src/VBox/Runtime/common/ldr/ldrPE.cpp
index 283b861..97f3917 100644
--- a/src/VBox/Runtime/common/ldr/ldrPE.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrPE.cpp
@@ -32,12 +32,21 @@
 #include <iprt/ldr.h>
 #include "internal/iprt.h"
 
-#include <iprt/alloc.h>
 #include <iprt/assert.h>
+#include <iprt/asm.h>
+#include <iprt/err.h>
 #include <iprt/log.h>
+#include <iprt/md5.h>
+#include <iprt/mem.h>
 #include <iprt/path.h>
+#include <iprt/sha.h>
 #include <iprt/string.h>
-#include <iprt/err.h>
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+#include <iprt/zero.h>
+# include <iprt/crypto/pkcs7.h>
+# include <iprt/crypto/spc.h>
+# include <iprt/crypto/x509.h>
+#endif
 #include <iprt/formats/codeview.h>
 #include "internal/ldrPE.h"
 #include "internal/ldr.h"
@@ -53,6 +62,13 @@
  */
 #define PE_RVA2TYPE(pvBits, rva, type)  ((type) ((uintptr_t)pvBits + (uintptr_t)(rva)) )
 
+/** The max size of the security directory. */
+#ifdef IN_RING3
+# define RTLDRMODPE_MAX_SECURITY_DIR_SIZE   _4M
+#else
+# define RTLDRMODPE_MAX_SECURITY_DIR_SIZE   _1M
+#endif
+
 
 /*******************************************************************************
 *   Structures and Typedefs                                                    *
@@ -91,6 +107,8 @@ typedef struct RTLDRMODPE
     uint32_t                cbHeaders;
     /** The image timestamp. */
     uint32_t                uTimestamp;
+    /** Set if the image is 64-bit, clear if 32-bit. */
+    bool                    f64Bit;
     /** The import data directory entry. */
     IMAGE_DATA_DIRECTORY    ImportDir;
     /** The base relocation data directory entry. */
@@ -99,7 +117,20 @@ typedef struct RTLDRMODPE
     IMAGE_DATA_DIRECTORY    ExportDir;
     /** The debug directory entry. */
     IMAGE_DATA_DIRECTORY    DebugDir;
-} RTLDRMODPE, *PRTLDRMODPE;
+    /** The security directory entry. */
+    IMAGE_DATA_DIRECTORY    SecurityDir;
+
+    /** Offset of the first PKCS \#7 SignedData signature if present. */
+    uint32_t                offPkcs7SignedData;
+    /** Size of the first PKCS \#7 SignedData. */
+    uint32_t                cbPkcs7SignedData;
+
+    /** Copy of the optional header field DllCharacteristics. */
+    uint16_t                fDllCharacteristics;
+} RTLDRMODPE;
+/** Pointer to the instance data for a PE loader module. */
+typedef RTLDRMODPE *PRTLDRMODPE;
+
 
 /**
  * PE Loader module operations.
@@ -131,6 +162,79 @@ typedef struct RTLDROPSPE
 } RTLDROPSPE, *PRTLDROPSPE;
 
 
+/**
+ * PE hash context union.
+ */
+typedef union RTLDRPEHASHCTXUNION
+{
+    RTSHA512CONTEXT Sha512;
+    RTSHA256CONTEXT Sha256;
+    RTSHA1CONTEXT   Sha1;
+    RTMD5CONTEXT    Md5;
+} RTLDRPEHASHCTXUNION;
+/** Pointer to a PE hash context union. */
+typedef RTLDRPEHASHCTXUNION *PRTLDRPEHASHCTXUNION;
+
+
+/**
+ * PE hash digests
+ */
+typedef union RTLDRPEHASHRESUNION
+{
+    uint8_t abSha512[RTSHA512_HASH_SIZE];
+    uint8_t abSha256[RTSHA256_HASH_SIZE];
+    uint8_t abSha1[RTSHA1_HASH_SIZE];
+    uint8_t abMd5[RTMD5_HASH_SIZE];
+} RTLDRPEHASHRESUNION;
+/** Pointer to a PE hash work set. */
+typedef RTLDRPEHASHRESUNION *PRTLDRPEHASHRESUNION;
+
+/**
+ * Special places to watch out for when hashing a PE image.
+ */
+typedef struct RTLDRPEHASHSPECIALS
+{
+    uint32_t    cbToHash;
+    uint32_t    offCksum;
+    uint32_t    cbCksum;
+    uint32_t    offSecDir;
+    uint32_t    cbSecDir;
+    uint32_t    offEndSpecial;
+} RTLDRPEHASHSPECIALS;
+/** Pointer to the structure with the special hash places. */
+typedef RTLDRPEHASHSPECIALS *PRTLDRPEHASHSPECIALS;
+
+
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+/**
+ * Parsed signature data.
+ */
+typedef struct RTLDRPESIGNATURE
+{
+    /** The outer content info wrapper. */
+    RTCRPKCS7CONTENTINFO        ContentInfo;
+    /** Pointer to the decoded SignedData inside the ContentInfo member. */
+    PRTCRPKCS7SIGNEDDATA        pSignedData;
+    /** Pointer to the indirect data content. */
+    PRTCRSPCINDIRECTDATACONTENT pIndData;
+    /** The digest type employed by the signature. */
+    RTDIGESTTYPE                enmDigest;
+
+    /** Pointer to the raw signatures.  This is allocated in the continuation of
+     * this structure to keep things simple.  The size is given by  the security
+     * export directory. */
+    WIN_CERTIFICATE const      *pRawData;
+
+    /** Hash scratch data. */
+    RTLDRPEHASHCTXUNION         HashCtx;
+    /** Hash result. */
+    RTLDRPEHASHRESUNION         HashRes;
+} RTLDRPESIGNATURE;
+/** Pointed to SigneData parsing stat and output. */
+typedef RTLDRPESIGNATURE *PRTLDRPESIGNATURE;
+#endif
+
+
 /*******************************************************************************
 *   Internal Functions                                                         *
 *******************************************************************************/
@@ -250,7 +354,7 @@ static int rtldrPEReadPartByRva(PRTLDRMODPE pThis, const void *pvBits, uint32_t
         if (cbToRead)
         {
             if ((RTFOFF)offFile + cbToRead > cbFile)
-                cbToRead = cbFile - (RTFOFF)offFile;
+                cbToRead = (uint32_t)(cbFile - (RTFOFF)offFile);
             int rc = pThis->Core.pReader->pfnRead(pThis->Core.pReader, pbMem, cbToRead, offFile);
             if (RT_FAILURE(rc))
             {
@@ -330,11 +434,11 @@ static int rtldrPEReadPart(PRTLDRMODPE pThis, const void *pvBits, RTFOFF offFile
 {
     if (uRva == NIL_RTLDRADDR || uRva > pThis->cbImage)
     {
-        if (offFile < 0)
+        if (offFile < 0 || offFile >= UINT32_MAX)
             return VERR_INVALID_PARAMETER;
-        return rtldrPEReadPartFromFile(pThis, offFile, cbMem, ppvMem);
+        return rtldrPEReadPartFromFile(pThis, (uint32_t)offFile, cbMem, ppvMem);
     }
-    return rtldrPEReadPartByRva(pThis, pvBits, uRva, cbMem, ppvMem);
+    return rtldrPEReadPartByRva(pThis, pvBits, (uint32_t)uRva, cbMem, ppvMem);
 }
 
 
@@ -548,7 +652,7 @@ static DECLCALLBACK(int) rtldrPEResolveImports32(PRTLDRMODPE pModPe, const void
                 AssertMsgFailed(("bad import data thunk!\n"));
                 rc = VERR_BAD_EXE_FORMAT;
             }
-            pFirstThunk->u1.Function = Value;
+            pFirstThunk->u1.Function = (uint32_t)Value;
             if (pFirstThunk->u1.Function != Value)
             {
                 AssertMsgFailed(("external symbol address to big!\n"));
@@ -663,7 +767,8 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
 
         /* Some bound checking just to be sure it works... */
         if ((uintptr_t)pbr - (uintptr_t)pBaseRelocs + pbr->SizeOfBlock > cbBaseRelocs)
-            cRelocations = (((uintptr_t)pBaseRelocs + cbBaseRelocs) - (uintptr_t)pbr - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(uint16_t);
+            cRelocations = (uint32_t)(  (((uintptr_t)pBaseRelocs + cbBaseRelocs) - (uintptr_t)pbr - sizeof(IMAGE_BASE_RELOCATION))
+                                      / sizeof(uint16_t) );
 
         /*
          * Loop thru the fixups in this chunk.
@@ -691,7 +796,7 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
             switch (fType)
             {
                 case IMAGE_REL_BASED_HIGHLOW:   /* 32-bit, add delta. */
-                    *u.pu32 += uDelta;
+                    *u.pu32 += (uint32_t)uDelta;
                     break;
                 case IMAGE_REL_BASED_DIR64:     /* 64-bit, add delta. */
                     *u.pu64 += (RTINTPTR)uDelta;
@@ -716,7 +821,7 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
                     cRelocations--;
                     pwoffFixup++;
                     int32_t i32 = (uint32_t)(*u.pu16 << 16) | *pwoffFixup;
-                    i32 += uDelta;
+                    i32 += (uint32_t)uDelta;
                     i32 += 0x8000; //??
                     *u.pu16 = (uint16_t)(i32 >> 16);
                     break;
@@ -759,7 +864,8 @@ static int rtldrPEApplyFixups(PRTLDRMODPE pModPe, const void *pvBitsR, void *pvB
 
 
 /** @copydoc RTLDROPS::pfnRelocate. */
-static int rtldrPERelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)
+static DECLCALLBACK(int) rtldrPERelocate(PRTLDRMODINTERNAL pMod, void *pvBits, RTUINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress,
+                                         PFNRTLDRIMPORT pfnGetImport, void *pvUser)
 {
     PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
 
@@ -925,7 +1031,7 @@ static int rtldrPEEnumSymbolsSlow(PRTLDRMODPE pThis, unsigned fFlags, RTUINTPTR
                                   (void const **)&paOrdinals);
     if (RT_SUCCESS(rc))
     {
-        uintptr_t   uNamePrev = 0;
+        uint32_t uNamePrev = 0;
         for (uint32_t uOrdinal = 0; uOrdinal < cOrdinals; uOrdinal++)
         {
             if (paAddress[uOrdinal] /* needed? */)
@@ -1062,7 +1168,7 @@ static DECLCALLBACK(int) rtldrPEEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFl
     uint32_t   *paAddress  = PE_RVA2TYPE(pvBits, pExpDir->AddressOfFunctions, uint32_t *);
     uint32_t   *paRVANames = PE_RVA2TYPE(pvBits, pExpDir->AddressOfNames, uint32_t *);
     uint16_t   *paOrdinals = PE_RVA2TYPE(pvBits, pExpDir->AddressOfNameOrdinals, uint16_t *);
-    uintptr_t   uNamePrev = 0;
+    uint32_t    uNamePrev = 0;
     unsigned    cOrdinals = RT_MAX(pExpDir->NumberOfNames, pExpDir->NumberOfFunctions);
     for (unsigned uOrdinal = 0; uOrdinal < cOrdinals; uOrdinal++)
     {
@@ -1073,7 +1179,7 @@ static DECLCALLBACK(int) rtldrPEEnumSymbols(PRTLDRMODINTERNAL pMod, unsigned fFl
              */
             const char *pszName = NULL;
             /* Search from previous + 1 to the end.  */
-            unsigned    uName = uNamePrev + 1;
+            uint32_t uName = uNamePrev + 1;
             while (uName < pExpDir->NumberOfNames)
             {
                 if (paOrdinals[uName] == uOrdinal)
@@ -1146,6 +1252,14 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
         return VINF_SUCCESS;
 
     /*
+     * Allocate temporary memory for a path buffer (this code is also compiled
+     * and maybe even used in stack starved environments).
+     */
+    char *pszPath = (char *)RTMemTmpAlloc(RTPATH_MAX);
+    if (!pszPath)
+        return VERR_NO_TMP_MEMORY;
+
+    /*
      * Get the debug directory.
      */
     if (!pvBits)
@@ -1155,7 +1269,10 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
     int rcRet = rtldrPEReadPartByRva(pModPe, pvBits, pModPe->DebugDir.VirtualAddress, pModPe->DebugDir.Size,
                                      (void const **)&paDbgDir);
     if (RT_FAILURE(rcRet))
+    {
+        RTMemTmpFree(pszPath);
         return rcRet;
+    }
 
     /*
      * Enumerate the debug directory.
@@ -1169,7 +1286,6 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
             continue;
 
         void const     *pvPart = NULL;
-        char            szPath[RTPATH_MAX];
         RTLDRDBGINFO    DbgInfo;
         RT_ZERO(DbgInfo.u);
         DbgInfo.iDbgInfo    = i;
@@ -1189,7 +1305,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
                 DbgInfo.u.Cv.uMajorVer  = paDbgDir[i].MajorVersion;
                 DbgInfo.u.Cv.uMinorVer  = paDbgDir[i].MinorVersion;
                 DbgInfo.u.Cv.uTimestamp = paDbgDir[i].TimeDateStamp;
-                if (   paDbgDir[i].SizeOfData < sizeof(szPath)
+                if (   paDbgDir[i].SizeOfData < RTPATH_MAX
                     && paDbgDir[i].SizeOfData > 16
                     && (   DbgInfo.LinkAddress != NIL_RTLDRADDR
                         || DbgInfo.offFile > 0)
@@ -1227,7 +1343,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
 
             case IMAGE_DEBUG_TYPE_MISC:
                 DbgInfo.enmType = RTLDRDBGINFOTYPE_UNKNOWN;
-                if (   paDbgDir[i].SizeOfData < sizeof(szPath)
+                if (   paDbgDir[i].SizeOfData < RTPATH_MAX
                     && paDbgDir[i].SizeOfData > RT_UOFFSETOF(IMAGE_DEBUG_MISC, Data))
                 {
                     DbgInfo.enmType             = RTLDRDBGINFOTYPE_CODEVIEW_DBG;
@@ -1248,12 +1364,11 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
                                 DbgInfo.pszExtFile      = (const char *)&pMisc->Data[0];
                             else
                             {
-                                char *pszPath = szPath;
                                 rc = RTUtf16ToUtf8Ex((PCRTUTF16)&pMisc->Data[0],
                                                      (pMisc->Length - RT_OFFSETOF(IMAGE_DEBUG_MISC, Data)) / sizeof(RTUTF16),
-                                                     &pszPath, sizeof(szPath), NULL);
+                                                     &pszPath, RTPATH_MAX, NULL);
                                 if (RT_SUCCESS(rc))
-                                    DbgInfo.pszExtFile = szPath;
+                                    DbgInfo.pszExtFile = pszPath;
                                 else
                                     rcRet = rc; /* continue without a filename. */
                             }
@@ -1282,12 +1397,11 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
            (I don't think we know exactly which encoding this is anyway, as
            it's probably the current ANSI/Windows code page for the process
            generating the image anyways.) */
-        if (DbgInfo.pszExtFile && DbgInfo.pszExtFile != szPath)
+        if (DbgInfo.pszExtFile && DbgInfo.pszExtFile != pszPath)
         {
-            char *pszPath = szPath;
             rc = RTLatin1ToUtf8Ex(DbgInfo.pszExtFile,
                                   paDbgDir[i].SizeOfData - ((uintptr_t)DbgInfo.pszExtFile - (uintptr_t)pvBits),
-                                  &pszPath, sizeof(szPath), NULL);
+                                  &pszPath, RTPATH_MAX, NULL);
             if (RT_FAILURE(rc))
             {
                 rcRet = rc;
@@ -1295,7 +1409,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
             }
         }
         if (DbgInfo.pszExtFile)
-            RTPathChangeToUnixSlashes(szPath, true /*fForce*/);
+            RTPathChangeToUnixSlashes(pszPath, true /*fForce*/);
 
         rc = pfnCallback(pMod, &DbgInfo, pvUser);
         rtldrPEFreePart(pModPe, pvBits, pvPart);
@@ -1307,6 +1421,7 @@ static DECLCALLBACK(int) rtldrPE_EnumDbgInfo(PRTLDRMODINTERNAL pMod, const void
     }
 
     rtldrPEFreePart(pModPe, pvBits, paDbgDir);
+    RTMemTmpFree(pszPath);
     return rcRet;
 }
 
@@ -1489,6 +1604,895 @@ static DECLCALLBACK(int) rtldrPE_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADD
 }
 
 
+/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
+static DECLCALLBACK(int) rtldrPE_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
+{
+    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
+    switch (enmProp)
+    {
+        case RTLDRPROP_TIMESTAMP_SECONDS:
+            Assert(*pcbRet == cbBuf);
+            if (cbBuf == sizeof(int32_t))
+                *(int32_t *)pvBuf = pModPe->uTimestamp;
+            else if (cbBuf == sizeof(int64_t))
+                *(int64_t *)pvBuf = pModPe->uTimestamp;
+            else
+                AssertFailedReturn(VERR_INTERNAL_ERROR_3);
+            break;
+
+        case RTLDRPROP_IS_SIGNED:
+            Assert(cbBuf == sizeof(bool));
+            Assert(*pcbRet == cbBuf);
+            *(bool *)pvBuf = pModPe->offPkcs7SignedData != 0;
+            break;
+
+        case RTLDRPROP_PKCS7_SIGNED_DATA:
+        {
+            if (pModPe->cbPkcs7SignedData == 0)
+                return VERR_NOT_FOUND;
+            Assert(pModPe->offPkcs7SignedData > pModPe->SecurityDir.VirtualAddress);
+
+            *pcbRet = pModPe->cbPkcs7SignedData;
+            if (cbBuf < pModPe->cbPkcs7SignedData)
+                return VERR_BUFFER_OVERFLOW;
+            return pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pvBuf, pModPe->cbPkcs7SignedData,
+                                                 pModPe->offPkcs7SignedData);
+        }
+
+        case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED:
+            Assert(cbBuf == sizeof(bool));
+            Assert(*pcbRet == cbBuf);
+            *(bool *)pvBuf = pModPe->offPkcs7SignedData > 0
+                          && (pModPe->fDllCharacteristics & IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY);
+            break;
+
+        default:
+            return VERR_NOT_FOUND;
+    }
+    return VINF_SUCCESS;
+}
+
+
+
+/*
+ * Lots of Authenticode fun ahead.
+ */
+
+
+/**
+ * Initializes the hash context.
+ *
+ * @returns VINF_SUCCESS or VERR_NOT_SUPPORTED.
+ * @param   pHashCtx            The hash context union.
+ * @param   enmDigest           The hash type we're calculating..
+ */
+static int rtLdrPE_HashInit(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest)
+{
+    switch (enmDigest)
+    {
+        case RTDIGESTTYPE_SHA512:  RTSha512Init(&pHashCtx->Sha512); break;
+        case RTDIGESTTYPE_SHA256:  RTSha256Init(&pHashCtx->Sha256); break;
+        case RTDIGESTTYPE_SHA1:    RTSha1Init(&pHashCtx->Sha1); break;
+        case RTDIGESTTYPE_MD5:     RTMd5Init(&pHashCtx->Md5); break;
+        default:                   AssertFailedReturn(VERR_NOT_SUPPORTED);
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Updates the hash with more data.
+ *
+ * @param   pHashCtx            The hash context union.
+ * @param   enmDigest           The hash type we're calculating..
+ * @param   pvBuf               Pointer to a buffer with bytes to add to thash.
+ * @param   cbBuf               How many bytes to add from @a pvBuf.
+ */
+static void rtLdrPE_HashUpdate(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest, void const *pvBuf, size_t cbBuf)
+{
+    switch (enmDigest)
+    {
+        case RTDIGESTTYPE_SHA512:  RTSha512Update(&pHashCtx->Sha512, pvBuf, cbBuf); break;
+        case RTDIGESTTYPE_SHA256:  RTSha256Update(&pHashCtx->Sha256, pvBuf, cbBuf); break;
+        case RTDIGESTTYPE_SHA1:    RTSha1Update(&pHashCtx->Sha1, pvBuf, cbBuf); break;
+        case RTDIGESTTYPE_MD5:     RTMd5Update(&pHashCtx->Md5, pvBuf, cbBuf); break;
+        default:                   AssertReleaseFailed();
+    }
+}
+
+
+/**
+ * Finalizes the hash calculations.
+ *
+ * @param   pHashCtx            The hash context union.
+ * @param   enmDigest           The hash type we're calculating..
+ * @param   pHashRes            The hash result union.
+ */
+static void rtLdrPE_HashFinalize(PRTLDRPEHASHCTXUNION pHashCtx, RTDIGESTTYPE enmDigest, PRTLDRPEHASHRESUNION pHashRes)
+{
+    switch (enmDigest)
+    {
+        case RTDIGESTTYPE_SHA512:  RTSha512Final(&pHashCtx->Sha512, pHashRes->abSha512); break;
+        case RTDIGESTTYPE_SHA256:  RTSha256Final(&pHashCtx->Sha256, pHashRes->abSha256); break;
+        case RTDIGESTTYPE_SHA1:    RTSha1Final(&pHashCtx->Sha1, pHashRes->abSha1); break;
+        case RTDIGESTTYPE_MD5:     RTMd5Final(pHashRes->abMd5, &pHashCtx->Md5); break;
+        default:                   AssertReleaseFailed();
+    }
+}
+
+
+/**
+ * Returns the digest size for the given digest type.
+ *
+ * @returns Size in bytes.
+ * @param   enmDigest           The hash type in question.
+ */
+static uint32_t rtLdrPE_HashGetHashSize(RTDIGESTTYPE enmDigest)
+{
+    switch (enmDigest)
+    {
+        case RTDIGESTTYPE_SHA512:  return RTSHA512_HASH_SIZE;
+        case RTDIGESTTYPE_SHA256:  return RTSHA256_HASH_SIZE;
+        case RTDIGESTTYPE_SHA1:    return RTSHA1_HASH_SIZE;
+        case RTDIGESTTYPE_MD5:     return RTMD5_HASH_SIZE;
+        default:                   AssertReleaseFailedReturn(0);
+    }
+}
+
+
+/**
+ * Calculate the special too watch out for when hashing the image.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe              The PE module.
+ * @param   pPlaces             The structure where to store the special places.
+ * @param   pErrInfo            Optional error info.
+ */
+static int rtldrPe_CalcSpecialHashPlaces(PRTLDRMODPE pModPe, PRTLDRPEHASHSPECIALS pPlaces, PRTERRINFO pErrInfo)
+{
+    /*
+     * If we're here despite a missing signature, we need to get the file size.
+     */
+    pPlaces->cbToHash = pModPe->SecurityDir.VirtualAddress;
+    if (pPlaces->cbToHash == 0)
+    {
+        RTFOFF cbFile = pModPe->Core.pReader->pfnSize(pModPe->Core.pReader);
+        pPlaces->cbToHash = (uint32_t)cbFile;
+        if (pPlaces->cbToHash != (RTFOFF)cbFile)
+            return RTErrInfoSetF(pErrInfo, VERR_LDRVI_FILE_LENGTH_ERROR, "File is too large: %RTfoff", cbFile);
+    }
+
+    /*
+     * Calculate the special places.
+     */
+    pPlaces->offCksum       = (uint32_t)pModPe->offNtHdrs
+                            + (pModPe->f64Bit
+                               ? RT_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.CheckSum)
+                               : RT_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.CheckSum));
+    pPlaces->cbCksum        = RT_SIZEOFMEMB(IMAGE_NT_HEADERS32, OptionalHeader.CheckSum);
+    pPlaces->offSecDir      = (uint32_t)pModPe->offNtHdrs
+                            + (pModPe->f64Bit
+                               ? RT_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY])
+                               : RT_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]));
+    pPlaces->cbSecDir       = sizeof(IMAGE_DATA_DIRECTORY);
+    pPlaces->offEndSpecial  = pPlaces->offSecDir + pPlaces->cbSecDir;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Calculates the whole image hash.
+ *
+ * The Authenticode_PE.docx version 1.0 explains how the hash is calculated,
+ * points 8 thru 14 are bogus.  If you study them a little carefully, it is
+ * clear that the algorithm will only work if the raw data for the section have
+ * no gaps between them or in front of them.  So, this elaborate section sorting
+ * by PointerToRawData and working them section by section could simply be
+ * replaced by one point:
+ *
+ *      8. Add all the file content between SizeOfHeaders and the
+ *         attribute certificate table to the hash.  Then finalize
+ *         the hash.
+ *
+ * Not sure if Microsoft is screwing with us on purpose here or whether they
+ * assigned some of this work to less talented engineers and tech writers.  I
+ * love fact that they say it's "simplified" and should yield the correct hash
+ * for "almost all" files.  Stupid, Stupid, Microsofties!!
+ *
+ * My simplified implementation that just hashes the entire file up to the
+ * signature or end of the file produces the same SHA1 values as "signtool
+ * verify /v" does both for edited executables with gaps between/before/after
+ * sections raw data and normal executables without any gaps.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe      The PE module.
+ * @param   pvScratch   Scratch buffer.
+ * @param   cbScratch   Size of the scratch buffer.
+ * @param   enmDigest   The hash digest type we're calculating.
+ * @param   pHashCtx    Hash context scratch area.
+ * @param   pHashRes    Hash result buffer.
+ * @param   pErrInfo    Optional error info buffer.
+ */
+static int rtldrPE_HashImageCommon(PRTLDRMODPE pModPe, void *pvScratch, uint32_t cbScratch, RTDIGESTTYPE enmDigest,
+                                   PRTLDRPEHASHCTXUNION pHashCtx, PRTLDRPEHASHRESUNION pHashRes, PRTERRINFO pErrInfo)
+{
+    int rc = rtLdrPE_HashInit(pHashCtx, enmDigest);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Calculate the special places.
+     */
+    RTLDRPEHASHSPECIALS SpecialPlaces = { 0, 0, 0, 0, 0, 0 }; /* shut up gcc */
+    rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    /*
+     * Work our way thru the image data.
+     */
+    uint32_t off = 0;
+    while (off < SpecialPlaces.cbToHash)
+    {
+        uint32_t cbRead = RT_MIN(SpecialPlaces.cbToHash - off, cbScratch);
+        uint8_t *pbCur  = (uint8_t *)pvScratch;
+        rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbRead, off);
+        if (RT_FAILURE(rc))
+            return RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_HASH, "Hash read error at %#x: %Rrc (cbRead=%#zx)",
+                                 off, rc, cbRead);
+
+        if (off < SpecialPlaces.offEndSpecial)
+        {
+            if (off < SpecialPlaces.offCksum)
+            {
+                /* Hash everything up to the checksum. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum - off, cbRead);
+                rtLdrPE_HashUpdate(pHashCtx, enmDigest, pbCur, cbChunk);
+                pbCur  += cbChunk;
+                cbRead -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offCksum + SpecialPlaces.cbCksum && off >= SpecialPlaces.offCksum)
+            {
+                /* Skip the checksum */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum + SpecialPlaces.cbCksum - off, cbRead);
+                pbCur  += cbChunk;
+                cbRead -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offSecDir && off >= SpecialPlaces.offCksum + SpecialPlaces.cbCksum)
+            {
+                /* Hash everything between the checksum and the data dir entry. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir - off, cbRead);
+                rtLdrPE_HashUpdate(pHashCtx, enmDigest,  pbCur, cbChunk);
+                pbCur  += cbChunk;
+                cbRead -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir && off >= SpecialPlaces.offSecDir)
+            {
+                /* Skip the security data directory entry. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir - off, cbRead);
+                pbCur  += cbChunk;
+                cbRead -= cbChunk;
+                off    += cbChunk;
+            }
+        }
+
+        rtLdrPE_HashUpdate(pHashCtx, enmDigest, pbCur, cbRead);
+
+        /* Advance */
+        off += cbRead;
+    }
+
+    /*
+     * If there isn't a signature, experiments with signtool indicates that we
+     * have to zero padd the file size until it's a multiple of 8.  (This is
+     * most likely to give 64-bit values in the certificate a natural alignment
+     * when memory mapped.)
+     */
+    if (   pModPe->SecurityDir.Size != SpecialPlaces.cbToHash
+        && SpecialPlaces.cbToHash != RT_ALIGN_32(SpecialPlaces.cbToHash, WIN_CERTIFICATE_ALIGNMENT))
+    {
+        static const uint8_t s_abZeros[WIN_CERTIFICATE_ALIGNMENT] = { 0,0,0,0, 0,0,0,0 };
+        rtLdrPE_HashUpdate(pHashCtx, enmDigest, s_abZeros,
+                           RT_ALIGN_32(SpecialPlaces.cbToHash, WIN_CERTIFICATE_ALIGNMENT) - SpecialPlaces.cbToHash);
+    }
+
+    /*
+     * Done. Finalize the hashes.
+     */
+    rtLdrPE_HashFinalize(pHashCtx, enmDigest, pHashRes);
+    return VINF_SUCCESS;
+}
+
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+
+/**
+ * Verifies image preconditions not checked by the open validation code.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe              The PE module.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureImagePrecoditions(PRTLDRMODPE pModPe, PRTERRINFO pErrInfo)
+{
+    /*
+     * Validate the sections.  While doing so, track the amount of section raw
+     * section data in the file so we can use this to validate the signature
+     * table location later.
+     */
+    uint32_t offNext = pModPe->cbHeaders; /* same */
+    for (uint32_t i = 0; i < pModPe->cSections; i++)
+        if (pModPe->paSections[i].SizeOfRawData > 0)
+        {
+            uint64_t offEnd = (uint64_t)pModPe->paSections[i].PointerToRawData + pModPe->paSections[i].SizeOfRawData;
+            if (offEnd > offNext)
+            {
+                if (offEnd >= _2G)
+                    return RTErrInfoSetF(pErrInfo, VERR_LDRVI_SECTION_RAW_DATA_VALUES,
+                                         "Section %#u specifies file data after 2GB: PointerToRawData=%#x SizeOfRawData=%#x",
+                                         i, pModPe->paSections[i].PointerToRawData, pModPe->paSections[i].SizeOfRawData);
+                offNext = (uint32_t)offEnd;
+            }
+        }
+    uint32_t offEndOfSectionData = offNext;
+
+    /*
+     * Validate the signature.
+     */
+    if (!pModPe->SecurityDir.Size)
+        return RTErrInfoSet(pErrInfo, VERR_LDRVI_NOT_SIGNED, "Not signed.");
+
+    uint32_t const offSignature = pModPe->SecurityDir.VirtualAddress;
+    uint32_t const cbSignature  = pModPe->SecurityDir.Size;
+    if (   cbSignature  <= sizeof(WIN_CERTIFICATE)
+        || cbSignature  >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE
+        || offSignature >= _2G)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+                             "Invalid security data dir entry: cb=%#x off=%#x", cbSignature, offSignature);
+
+    if (offSignature < offEndOfSectionData)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+                             "Invalid security data dir entry offset: %#x offEndOfSectionData=%#x",
+                             offSignature, offEndOfSectionData);
+
+    if (RT_ALIGN_32(offSignature, WIN_CERTIFICATE_ALIGNMENT) != offSignature)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+                             "Misaligned security dir entry offset: %#x (alignment=%#x)",
+                             offSignature, WIN_CERTIFICATE_ALIGNMENT);
+
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Reads and checks the raw signature data.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe              The PE module.
+ * @param   ppSignature         Where to return the pointer to the parsed
+ *                              signature data.  Pass to
+ *                              rtldrPE_VerifySignatureDestroy when done.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureRead(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE *ppSignature, PRTERRINFO pErrInfo)
+{
+    *ppSignature = NULL;
+    AssertReturn(pModPe->SecurityDir.Size > 0, VERR_INTERNAL_ERROR_2);
+
+    /*
+     * Allocate memory for reading and parsing it.
+     */
+    if (pModPe->SecurityDir.Size >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY,
+                             "Signature directory is to large: %#x", pModPe->SecurityDir.Size);
+
+    PRTLDRPESIGNATURE pSignature = (PRTLDRPESIGNATURE)RTMemTmpAllocZ(sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
+    if (!pSignature)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_NO_MEMORY_SIGNATURE, "Failed to allocate %zu bytes",
+                             sizeof(*pSignature) + 64 + pModPe->SecurityDir.Size);
+    pSignature->pRawData = RT_ALIGN_PT(pSignature + 1, 64, WIN_CERTIFICATE const *);
+
+
+    /*
+     * Read it.
+     */
+    int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, (void *)pSignature->pRawData,
+                                           pModPe->SecurityDir.Size, pModPe->SecurityDir.VirtualAddress);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Check the table we've read in.
+         */
+        uint32_t               cbLeft = pModPe->SecurityDir.Size;
+        WIN_CERTIFICATE const *pEntry = pSignature->pRawData;
+        for (;;)
+        {
+            if (   cbLeft           < sizeof(*pEntry)
+                || pEntry->dwLength > cbLeft
+                || pEntry->dwLength < sizeof(*pEntry))
+                rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_LENGTH,
+                                   "Bad WIN_CERTIFICATE length: %#x  (max %#x, signature=%u)",
+                                   pEntry->dwLength, cbLeft, 0);
+            else if (pEntry->wRevision != WIN_CERT_REVISION_2_0)
+                rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_REVISION,
+                                   "Unsupported WIN_CERTIFICATE revision value: %#x (signature=%u)",
+                                   pEntry->wRevision, 0);
+            else if (pEntry->wCertificateType != WIN_CERT_TYPE_PKCS_SIGNED_DATA)
+                rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_BAD_CERT_HDR_TYPE,
+                                   "Unsupported WIN_CERTIFICATE certificate type: %#x (signature=%u)",
+                                   pEntry->wCertificateType, 0);
+            else
+            {
+                /* advance */
+                uint32_t cbEntry = RT_ALIGN(pEntry->dwLength, WIN_CERTIFICATE_ALIGNMENT);
+                if (cbEntry >= cbLeft)
+                    break;
+                cbLeft -= cbEntry;
+                pEntry = (WIN_CERTIFICATE *)((uintptr_t)pEntry + cbEntry);
+
+                /* For now, only one entry is supported. */
+                rc = RTErrInfoSet(pErrInfo, VERR_LDRVI_BAD_CERT_MULTIPLE, "Multiple WIN_CERTIFICATE entries are not supported.");
+            }
+            break;
+        }
+        if (RT_SUCCESS(rc))
+        {
+            *ppSignature = pSignature;
+            return VINF_SUCCESS;
+        }
+    }
+    else
+        rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_SIGNATURE, "Signature read error: %Rrc", rc);
+    RTMemTmpFree(pSignature);
+    return rc;
+}
+
+
+/**
+ * Destroys the parsed signature.
+ *
+ * @param   pModPe              The PE module.
+ * @param   pSignature          The signature data to destroy.
+ */
+static void rtldrPE_VerifySignatureDestroy(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature)
+{
+    RTCrPkcs7ContentInfo_Delete(&pSignature->ContentInfo);
+    RTMemTmpFree(pSignature);
+}
+
+
+/**
+ * Decodes the raw signature.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe              The PE module.
+ * @param   pSignature          The signature data.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureDecode(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
+{
+    WIN_CERTIFICATE const  *pEntry = pSignature->pRawData;
+    AssertReturn(pEntry->wCertificateType == WIN_CERT_TYPE_PKCS_SIGNED_DATA, VERR_INTERNAL_ERROR_2);
+    AssertReturn(pEntry->wRevision        == WIN_CERT_REVISION_2_0, VERR_INTERNAL_ERROR_2);
+
+    RTASN1CURSORPRIMARY PrimaryCursor;
+    RTAsn1CursorInitPrimary(&PrimaryCursor,
+                            &pEntry->bCertificate[0],
+                            pEntry->dwLength - RT_OFFSETOF(WIN_CERTIFICATE, bCertificate),
+                            pErrInfo,
+                            &g_RTAsn1DefaultAllocator,
+                            0,
+                            "WinCert");
+
+    int rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, &pSignature->ContentInfo, "CI");
+    if (RT_SUCCESS(rc))
+    {
+        if (RTCrPkcs7ContentInfo_IsSignedData(&pSignature->ContentInfo))
+        {
+            pSignature->pSignedData = pSignature->ContentInfo.u.pSignedData;
+
+            /*
+             * Decode the authenticode bits.
+             */
+            if (!strcmp(pSignature->pSignedData->ContentInfo.ContentType.szObjId, RTCRSPCINDIRECTDATACONTENT_OID))
+            {
+                pSignature->pIndData = pSignature->pSignedData->ContentInfo.u.pIndirectDataContent;
+                Assert(pSignature->pIndData);
+
+                /*
+                 * Check that things add up.
+                 */
+                if (RT_SUCCESS(rc))
+                    rc = RTCrPkcs7SignedData_CheckSanity(pSignature->pSignedData,
+                                                         RTCRPKCS7SIGNEDDATA_SANITY_F_AUTHENTICODE
+                                                         | RTCRPKCS7SIGNEDDATA_SANITY_F_ONLY_KNOWN_HASH
+                                                         | RTCRPKCS7SIGNEDDATA_SANITY_F_SIGNING_CERT_PRESENT,
+                                                         pErrInfo, "SD");
+                if (RT_SUCCESS(rc))
+                    rc = RTCrSpcIndirectDataContent_CheckSanityEx(pSignature->pIndData,
+                                                                  pSignature->pSignedData,
+                                                                  RTCRSPCINDIRECTDATACONTENT_SANITY_F_ONLY_KNOWN_HASH,
+                                                                  pErrInfo);
+                if (RT_SUCCESS(rc))
+                {
+                    PCRTCRX509ALGORITHMIDENTIFIER pDigestAlgorithm = &pSignature->pIndData->DigestInfo.DigestAlgorithm;
+                    pSignature->enmDigest = RTCrX509AlgorithmIdentifier_QueryDigestType(pDigestAlgorithm);
+                    AssertReturn(pSignature->enmDigest != RTDIGESTTYPE_INVALID, VERR_INTERNAL_ERROR_4); /* Checked above! */
+                }
+            }
+            else
+                rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_EXPECTED_INDIRECT_DATA_CONTENT_OID,
+                                   "Unknown pSignedData.ContentInfo.ContentType.szObjId value: %s (expected %s)",
+                                   pSignature->pSignedData->ContentInfo.ContentType.szObjId, RTCRSPCINDIRECTDATACONTENT_OID);
+        }
+    }
+    return rc;
+}
+
+
+static int rtldrPE_VerifyAllPageHashes(PRTLDRMODPE pModPe, PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttrib, RTDIGESTTYPE enmDigest,
+                                       void *pvScratch, size_t cbScratch, PRTERRINFO pErrInfo)
+{
+    AssertReturn(cbScratch >= _4K, VERR_INTERNAL_ERROR_3);
+
+    /*
+     * Calculate the special places.
+     */
+    RTLDRPEHASHSPECIALS SpecialPlaces = { 0, 0, 0, 0, 0, 0 }; /* shut up gcc */
+    int rc = rtldrPe_CalcSpecialHashPlaces(pModPe, &SpecialPlaces, pErrInfo);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    uint32_t const cbHash = rtLdrPE_HashGetHashSize(enmDigest);
+    uint32_t const cPages = pAttrib->u.pPageHashes->RawData.Asn1Core.cb / (cbHash + 4);
+    if (cPages * (cbHash + 4) != pAttrib->u.pPageHashes->RawData.Asn1Core.cb)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_SIZE_OVERFLOW,
+                             "Page hashes size issue: cb=%#x cbHash=%#x",
+                             pAttrib->u.pPageHashes->RawData.Asn1Core.cb, cbHash);
+
+    /*
+     * Walk the table.
+     */
+    uint32_t const  cbScratchReadMax = cbScratch & ~(uint32_t)(_4K - 1);
+    uint32_t        cbScratchRead    = 0;
+    uint32_t        offScratchRead   = 0;
+
+    uint32_t        offPrev    = 0;
+#ifdef COMPLICATED_AND_WRONG
+    uint32_t        offSectEnd = pModPe->cbHeaders;
+    uint32_t        iSh        = UINT32_MAX;
+#endif
+    uint8_t const  *pbHashTab  = pAttrib->u.pPageHashes->RawData.Asn1Core.uData.pu8;
+    for (uint32_t iPage = 0; iPage < cPages - 1; iPage++)
+    {
+        /* Decode the page offset. */
+        uint32_t const offPageInFile = RT_MAKE_U32_FROM_U8(pbHashTab[0], pbHashTab[1], pbHashTab[2], pbHashTab[3]);
+        if (RT_UNLIKELY(offPageInFile >= SpecialPlaces.cbToHash))
+            return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG,
+                                 "Page hash entry #%u is beyond the signature table start: %#x, %#x",
+                                 iPage, offPageInFile, SpecialPlaces.cbToHash);
+        if (RT_UNLIKELY(offPageInFile < offPrev))
+            return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED,
+                                 "Page hash table is not strictly sorted: entry #%u @%#x, previous @%#x\n",
+                                 iPage, offPageInFile, offPrev);
+
+#ifdef COMPLICATED_AND_WRONG
+        /* Figure out how much to read and how much to zero.  Need keep track
+           of the on-disk section boundraries. */
+        if (offPageInFile >= offSectEnd)
+        {
+            iSh++;
+            if (   iSh < pModPe->cSections
+                && offPageInFile - pModPe->paSections[iSh].PointerToRawData < pModPe->paSections[iSh].SizeOfRawData)
+                offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
+            else
+            {
+                iSh = 0;
+                while (   iSh < pModPe->cSections
+                       && offPageInFile - pModPe->paSections[iSh].PointerToRawData >= pModPe->paSections[iSh].SizeOfRawData)
+                    iSh++;
+                if (iSh < pModPe->cSections)
+                    offSectEnd = pModPe->paSections[iSh].PointerToRawData + pModPe->paSections[iSh].SizeOfRawData;
+                else
+                    return RTErrInfoSetF(pErrInfo, VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA,
+                                         "Page hash entry #%u isn't in any section: %#x", iPage, offPageInFile);
+            }
+        }
+
+#else
+        /* Figure out how much to read and how much take as zero.  Use the next
+           page offset and the signature as upper boundraries.  */
+#endif
+        uint32_t cbPageInFile = _4K;
+#ifdef COMPLICATED_AND_WRONG
+        if (offPageInFile + cbPageInFile > offSectEnd)
+            cbPageInFile = offSectEnd - offPageInFile;
+#else
+        if (iPage + 1 < cPages)
+        {
+            uint32_t offNextPage = RT_MAKE_U32_FROM_U8(pbHashTab[0 + 4 + cbHash], pbHashTab[1 + 4 + cbHash],
+                                                       pbHashTab[2 + 4 + cbHash], pbHashTab[3 + 4 + cbHash]);
+            if (offNextPage - offPageInFile < cbPageInFile)
+                cbPageInFile = offNextPage - offPageInFile;
+        }
+#endif
+
+        if (offPageInFile + cbPageInFile > SpecialPlaces.cbToHash)
+            cbPageInFile = SpecialPlaces.cbToHash - offPageInFile;
+
+        /* Did we get a cache hit? */
+        uint8_t *pbCur = (uint8_t *)pvScratch;
+        if (   offPageInFile + cbPageInFile <= offScratchRead + cbScratchRead
+            && offPageInFile          >= offScratchRead)
+            pbCur += offPageInFile - offScratchRead;
+        /* Missed, read more. */
+        else
+        {
+            offScratchRead = offPageInFile;
+#ifdef COMPLICATED_AND_WRONG
+            cbScratchRead  = offSectEnd - offPageInFile;
+#else
+            cbScratchRead  = SpecialPlaces.cbToHash - offPageInFile;
+#endif
+            if (cbScratchRead > cbScratchReadMax)
+                cbScratchRead = cbScratchReadMax;
+            rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pbCur, cbScratchRead, offScratchRead);
+            if (RT_FAILURE(rc))
+                return RTErrInfoSetF(pErrInfo, VERR_LDRVI_READ_ERROR_HASH,
+                                     "Page hash read error at %#x: %Rrc (cbScratchRead=%#zx)",
+                                     offScratchRead, rc, cbScratchRead);
+        }
+
+        /*
+         * Hash it.
+         */
+        RTLDRPEHASHCTXUNION HashCtx;
+        rc = rtLdrPE_HashInit(&HashCtx, enmDigest);
+        AssertRCReturn(rc, rc);
+
+        /* Deal with special places. */
+        uint32_t       cbLeft = cbPageInFile;
+        if (offPageInFile < SpecialPlaces.offEndSpecial)
+        {
+            uint32_t off = offPageInFile;
+            if (off < SpecialPlaces.offCksum)
+            {
+                /* Hash everything up to the checksum. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum - off, cbLeft);
+                rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk);
+                pbCur  += cbChunk;
+                cbLeft -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offCksum + SpecialPlaces.cbCksum && off >= SpecialPlaces.offCksum)
+            {
+                /* Skip the checksum */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offCksum + SpecialPlaces.cbCksum - off, cbLeft);
+                pbCur  += cbChunk;
+                cbLeft -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offSecDir && off >= SpecialPlaces.offCksum + SpecialPlaces.cbCksum)
+            {
+                /* Hash everything between the checksum and the data dir entry. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir - off, cbLeft);
+                rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbChunk);
+                pbCur  += cbChunk;
+                cbLeft -= cbChunk;
+                off    += cbChunk;
+            }
+
+            if (off < SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir && off >= SpecialPlaces.offSecDir)
+            {
+                /* Skip the security data directory entry. */
+                uint32_t cbChunk = RT_MIN(SpecialPlaces.offSecDir + SpecialPlaces.cbSecDir - off, cbLeft);
+                pbCur  += cbChunk;
+                cbLeft -= cbChunk;
+                off    += cbChunk;
+            }
+        }
+
+        rtLdrPE_HashUpdate(&HashCtx, enmDigest, pbCur, cbLeft);
+        if (cbPageInFile < _4K)
+            rtLdrPE_HashUpdate(&HashCtx, enmDigest, &g_abRTZero4K[cbPageInFile], _4K - cbPageInFile);
+
+        /*
+         * Finish the hash calculation and compare the result.
+         */
+        RTLDRPEHASHRESUNION HashRes;
+        rtLdrPE_HashFinalize(&HashCtx, enmDigest, &HashRes);
+
+        pbHashTab += 4;
+        if (memcmp(pbHashTab, &HashRes, cbHash) != 0)
+            return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_MISMATCH,
+                                 "Page hash failed for page #%u, @%#x, %#x bytes: %.*Rhxs != %.*Rhxs",
+                                 iPage, offPageInFile, cbPageInFile, (size_t)cbHash, pbHashTab, (size_t)cbHash, &HashRes);
+        pbHashTab += cbHash;
+        offPrev = offPageInFile;
+    }
+
+    /*
+     * Check that the last table entry has a hash value of zero.
+     */
+    if (ASMMemIsAll8(pbHashTab + 4, cbHash, 0) != NULL)
+        return RTErrInfoSetF(pErrInfo, VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG,
+                             "Maltform final page hash table entry: #%u %#010x %.*Rhxs",
+                             cPages - 1, RT_MAKE_U32_FROM_U8(pbHashTab[0], pbHashTab[1], pbHashTab[2], pbHashTab[3]),
+                             (size_t)cbHash, pbHashTab + 4);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Validates the image hash, including page hashes if present.
+ *
+ * @returns IPRT status code.
+ * @param   pModPe              The PE module.
+ * @param   pSignature          The decoded signature data.
+ * @param   pErrInfo            Optional error info buffer.
+ */
+static int rtldrPE_VerifySignatureValidateHash(PRTLDRMODPE pModPe, PRTLDRPESIGNATURE pSignature, PRTERRINFO pErrInfo)
+{
+    AssertReturn(pSignature->enmDigest > RTDIGESTTYPE_INVALID && pSignature->enmDigest < RTDIGESTTYPE_END, VERR_INTERNAL_ERROR_4);
+    AssertPtrReturn(pSignature->pIndData, VERR_INTERNAL_ERROR_5);
+    AssertReturn(RTASN1CORE_IS_PRESENT(&pSignature->pIndData->DigestInfo.Digest.Asn1Core), VERR_INTERNAL_ERROR_5);
+    AssertPtrReturn(pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv, VERR_INTERNAL_ERROR_5);
+
+    uint32_t const cbHash = rtLdrPE_HashGetHashSize(pSignature->enmDigest);
+    AssertReturn(pSignature->pIndData->DigestInfo.Digest.Asn1Core.cb == cbHash, VERR_INTERNAL_ERROR_5);
+
+    /*
+     * Allocate a temporary memory buffer.
+     * Note! The _4K that gets subtracted is to avoid that the 16-byte heap
+     *       block header in ring-0 (iprt) caused any unnecessary internal
+     *       heap fragmentation.
+     */
+#ifdef IN_RING0
+    uint32_t    cbScratch = _256K - _4K;
+#else
+    uint32_t    cbScratch = _1M;
+#endif
+    void       *pvScratch = RTMemTmpAlloc(cbScratch);
+    if (!pvScratch)
+    {
+        cbScratch = _4K;
+        pvScratch = RTMemTmpAlloc(cbScratch);
+        if (!pvScratch)
+            return RTErrInfoSet(pErrInfo, VERR_NO_TMP_MEMORY, "Failed to allocate 4KB of scratch space for hashing image.");
+    }
+
+    /*
+     * Calculate and compare the full image hash.
+     */
+    int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, pSignature->enmDigest,
+                                     &pSignature->HashCtx, &pSignature->HashRes, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        if (!memcmp(&pSignature->HashRes, pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv, cbHash))
+        {
+            /*
+             * Compare the page hashes if present.
+             *
+             * Seems the difference between V1 and V2 page hash attributes is
+             * that v1 uses SHA-1 while v2 uses SHA-256. The data structures to
+             * be identical otherwise.  Initially we assumed the digest
+             * algorithm was supposed to be RTCRSPCINDIRECTDATACONTENT::DigestInfo,
+             * i.e. the same as for the whole image hash.  The initial approach
+             * worked just fine, but this makes more sense.
+             *
+             * (See also comments in osslsigncode.c (google it).)
+             */
+            PCRTCRSPCSERIALIZEDOBJECTATTRIBUTE pAttrib;
+            pAttrib = RTCrSpcIndirectDataContent_GetPeImageObjAttrib(pSignature->pIndData,
+                                                                     RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V2);
+            if (pAttrib)
+                rc = rtldrPE_VerifyAllPageHashes(pModPe, pAttrib, RTDIGESTTYPE_SHA256, pvScratch, cbScratch, pErrInfo);
+            else
+            {
+                pAttrib = RTCrSpcIndirectDataContent_GetPeImageObjAttrib(pSignature->pIndData,
+                                                                         RTCRSPCSERIALIZEDOBJECTATTRIBUTETYPE_PAGE_HASHES_V1);
+                if (pAttrib)
+                    rc = rtldrPE_VerifyAllPageHashes(pModPe, pAttrib, RTDIGESTTYPE_SHA1, pvScratch, cbScratch, pErrInfo);
+            }
+        }
+        else
+            rc = RTErrInfoSetF(pErrInfo, VERR_LDRVI_IMAGE_HASH_MISMATCH,
+                               "Full image signature mismatch: %.*Rhxs, expected %.*Rhxs",
+                               cbHash, &pSignature->HashRes,
+                               cbHash, pSignature->pIndData->DigestInfo.Digest.Asn1Core.uData.pv);
+    }
+
+    RTMemTmpFree(pvScratch);
+    return rc;
+}
+
+#endif /* !IPRT_WITHOUT_LDR_VERIFY */
+
+
+/** @interface_method_impl{RTLDROPS,pfnVerifySignature} */
+static DECLCALLBACK(int) rtldrPE_VerifySignature(PRTLDRMODINTERNAL pMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser,
+                                                 PRTERRINFO pErrInfo)
+{
+#ifndef IPRT_WITHOUT_LDR_VERIFY
+    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
+
+    int rc = rtldrPE_VerifySignatureImagePrecoditions(pModPe, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        PRTLDRPESIGNATURE pSignature = NULL;
+        rc = rtldrPE_VerifySignatureRead(pModPe, &pSignature, pErrInfo);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtldrPE_VerifySignatureDecode(pModPe, pSignature, pErrInfo);
+            if (RT_SUCCESS(rc))
+                rc = rtldrPE_VerifySignatureValidateHash(pModPe, pSignature, pErrInfo);
+            if (RT_SUCCESS(rc))
+            {
+                rc = pfnCallback(&pModPe->Core, RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA,
+                                 &pSignature->ContentInfo, sizeof(pSignature->ContentInfo),
+                                 pErrInfo, pvUser);
+            }
+            rtldrPE_VerifySignatureDestroy(pModPe, pSignature);
+        }
+    }
+    return rc;
+#else
+    return VERR_NOT_SUPPORTED;
+#endif
+}
+
+
+
+/**  @interface_method_impl{RTLDROPS,pfnHashImage}  */
+static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
+{
+    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
+
+    /*
+     * Allocate a temporary memory buffer.
+     */
+    uint32_t    cbScratch = _16K;
+    void       *pvScratch = RTMemTmpAlloc(cbScratch);
+    if (!pvScratch)
+    {
+        cbScratch = _4K;
+        pvScratch = RTMemTmpAlloc(cbScratch);
+        if (!pvScratch)
+            return VERR_NO_TMP_MEMORY;
+    }
+
+    /*
+     * Do the hashing.
+     */
+    RTLDRPEHASHCTXUNION HashCtx;
+    RTLDRPEHASHRESUNION HashRes;
+    int rc = rtldrPE_HashImageCommon(pModPe, pvScratch, cbScratch, enmDigest, &HashCtx, &HashRes, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Format the digest into as human readable hash string.
+         */
+        switch (enmDigest)
+        {
+            case RTDIGESTTYPE_SHA512:  rc = RTSha512ToString(HashRes.abSha512, pszDigest, cbDigest); break;
+            case RTDIGESTTYPE_SHA256:  rc = RTSha256ToString(HashRes.abSha256, pszDigest, cbDigest); break;
+            case RTDIGESTTYPE_SHA1:    rc = RTSha1ToString(HashRes.abSha1, pszDigest, cbDigest); break;
+            case RTDIGESTTYPE_MD5:     rc = RTMd5ToString(HashRes.abMd5, pszDigest, cbDigest); break;
+            default:                   AssertFailedReturn(VERR_INTERNAL_ERROR_3);
+        }
+    }
+    return rc;
+}
+
+
 /** @copydoc RTLDROPS::pfnDone */
 static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod)
 {
@@ -1501,6 +2505,7 @@ static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod)
     return VINF_SUCCESS;
 }
 
+
 /** @copydoc RTLDROPS::pfnClose */
 static DECLCALLBACK(int) rtldrPEClose(PRTLDRMODINTERNAL pMod)
 {
@@ -1542,6 +2547,9 @@ static const RTLDROPSPE s_rtldrPE32Ops =
         rtldrPE_SegOffsetToRva,
         rtldrPE_RvaToSegOffset,
         NULL,
+        rtldrPE_QueryProp,
+        rtldrPE_VerifySignature,
+        rtldrPE_HashImage,
         42
     },
     rtldrPEResolveImports32,
@@ -1572,6 +2580,9 @@ static const RTLDROPSPE s_rtldrPE64Ops =
         rtldrPE_SegOffsetToRva,
         rtldrPE_RvaToSegOffset,
         NULL,
+        rtldrPE_QueryProp,
+        rtldrPE_VerifySignature,
+        rtldrPE_HashImage,
         42
     },
     rtldrPEResolveImports64,
@@ -1635,23 +2646,28 @@ static void rtldrPEConvert32BitLoadConfigTo64Bit(PIMAGE_LOAD_CONFIG_DIRECTORY64
     /*
      * volatile everywhere! Trying to prevent the compiler being a smarta$$ and reorder stuff.
      */
-    IMAGE_LOAD_CONFIG_DIRECTORY32 volatile *pLoadCfg32 = (IMAGE_LOAD_CONFIG_DIRECTORY32 volatile *)pLoadCfg;
-    IMAGE_LOAD_CONFIG_DIRECTORY64 volatile *pLoadCfg64 = pLoadCfg;
-
-    pLoadCfg64->SEHandlerCount             = pLoadCfg32->SEHandlerCount;
-    pLoadCfg64->SEHandlerTable             = pLoadCfg32->SEHandlerTable;
-    pLoadCfg64->SecurityCookie             = pLoadCfg32->SecurityCookie;
-    pLoadCfg64->EditList                   = pLoadCfg32->EditList;
-    pLoadCfg64->Reserved1                  = pLoadCfg32->Reserved1;
-    pLoadCfg64->CSDVersion                 = pLoadCfg32->CSDVersion;
-    pLoadCfg64->ProcessHeapFlags           = pLoadCfg32->ProcessHeapFlags; /* switched place with ProcessAffinityMask, but we're more than 16 byte off by now so it doesn't matter. */
-    pLoadCfg64->ProcessAffinityMask        = pLoadCfg32->ProcessAffinityMask;
-    pLoadCfg64->VirtualMemoryThreshold     = pLoadCfg32->VirtualMemoryThreshold;
-    pLoadCfg64->MaximumAllocationSize      = pLoadCfg32->MaximumAllocationSize;
-    pLoadCfg64->LockPrefixTable            = pLoadCfg32->LockPrefixTable;
-    pLoadCfg64->DeCommitTotalFreeThreshold = pLoadCfg32->DeCommitTotalFreeThreshold;
-    uint32_t u32DeCommitFreeBlockThreshold = pLoadCfg32->DeCommitFreeBlockThreshold;
-    pLoadCfg64->DeCommitFreeBlockThreshold = u32DeCommitFreeBlockThreshold;
+    IMAGE_LOAD_CONFIG_DIRECTORY32_V3 volatile *pLoadCfg32 = (IMAGE_LOAD_CONFIG_DIRECTORY32_V3 volatile *)pLoadCfg;
+    IMAGE_LOAD_CONFIG_DIRECTORY64_V3 volatile *pLoadCfg64 = pLoadCfg;
+
+    pLoadCfg64->GuardFlags                  = pLoadCfg32->GuardFlags;
+    pLoadCfg64->GuardCFFunctionCount        = pLoadCfg32->GuardCFFunctionCount;
+    pLoadCfg64->GuardCFFunctionTable        = pLoadCfg32->GuardCFFunctionTable;
+    pLoadCfg64->Reserved2                   = pLoadCfg32->Reserved2;
+    pLoadCfg64->GuardCFCCheckFunctionPointer= pLoadCfg32->GuardCFCCheckFunctionPointer;
+    pLoadCfg64->SEHandlerCount              = pLoadCfg32->SEHandlerCount;
+    pLoadCfg64->SEHandlerTable              = pLoadCfg32->SEHandlerTable;
+    pLoadCfg64->SecurityCookie              = pLoadCfg32->SecurityCookie;
+    pLoadCfg64->EditList                    = pLoadCfg32->EditList;
+    pLoadCfg64->Reserved1                   = pLoadCfg32->Reserved1;
+    pLoadCfg64->CSDVersion                  = pLoadCfg32->CSDVersion;
+    pLoadCfg64->ProcessHeapFlags            = pLoadCfg32->ProcessHeapFlags; /* switched place with ProcessAffinityMask, but we're more than 16 byte off by now so it doesn't matter. */
+    pLoadCfg64->ProcessAffinityMask         = pLoadCfg32->ProcessAffinityMask;
+    pLoadCfg64->VirtualMemoryThreshold      = pLoadCfg32->VirtualMemoryThreshold;
+    pLoadCfg64->MaximumAllocationSize       = pLoadCfg32->MaximumAllocationSize;
+    pLoadCfg64->LockPrefixTable             = pLoadCfg32->LockPrefixTable;
+    pLoadCfg64->DeCommitTotalFreeThreshold  = pLoadCfg32->DeCommitTotalFreeThreshold;
+    uint32_t u32DeCommitFreeBlockThreshold  = pLoadCfg32->DeCommitFreeBlockThreshold;
+    pLoadCfg64->DeCommitFreeBlockThreshold  = u32DeCommitFreeBlockThreshold;
     /* the rest is equal. */
     Assert(     RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY32, DeCommitFreeBlockThreshold)
            ==   RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY64, DeCommitFreeBlockThreshold));
@@ -1695,7 +2711,7 @@ static int rtldrPEValidateFileHeader(PIMAGE_FILE_HEADER pFileHdr, uint32_t fFlag
     }
     /* This restriction needs to be implemented elsewhere. */
     if (   (pFileHdr->Characteristics & IMAGE_FILE_RELOCS_STRIPPED)
-        && !(fFlags & RTLDR_O_FOR_DEBUG))
+        && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
     {
         Log(("rtldrPEOpen: %s: IMAGE_FILE_RELOCS_STRIPPED\n", pszLogName));
         return VERR_BAD_EXE_FORMAT;
@@ -1831,6 +2847,8 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
                 break;
 
             case IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT:  // 13
+                if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+                    break;
                 Log(("rtldrPEOpen: %s: dir no. %d (DELAY_IMPORT) VirtualAddress=%#x Size=%#x is not supported!!!\n",
                      pszLogName, i, pDir->VirtualAddress, pDir->Size));
                 return VERR_LDRPE_DELAY_IMPORT;
@@ -1845,7 +2863,7 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
                     Log(("rtldrPEOpen: %s: Security directory is too small: %#x bytes\n", pszLogName, i, pDir->Size));
                     return VERR_LDRPE_CERT_MALFORMED;
                 }
-                if (pDir->Size >= _1M)
+                if (pDir->Size >= RTLDRMODPE_MAX_SECURITY_DIR_SIZE)
                 {
                     Log(("rtldrPEOpen: %s: Security directory is too large: %#x bytes\n", pszLogName, i, pDir->Size));
                     return VERR_LDRPE_CERT_MALFORMED;
@@ -1869,11 +2887,15 @@ static int rtldrPEValidateOptionalHeader(const IMAGE_OPTIONAL_HEADER64 *pOptHdr,
                 return VERR_LDRPE_GLOBALPTR;
 
             case IMAGE_DIRECTORY_ENTRY_TLS:           // 9
+                if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+                    break;
                 Log(("rtldrPEOpen: %s: dir no. %d (TLS) VirtualAddress=%#x Size=%#x is not supported!!!\n",
                      pszLogName, i, pDir->VirtualAddress, pDir->Size));
                 return VERR_LDRPE_TLS;
 
             case IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR:// 14
+                if (fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION))
+                    break;
                 Log(("rtldrPEOpen: %s: dir no. %d (COM_DESCRIPTOR) VirtualAddress=%#x Size=%#x is not supported!!!\n",
                      pszLogName, i, pDir->VirtualAddress, pDir->Size));
                 return VERR_LDRPE_COM_DESCRIPTOR;
@@ -1920,7 +2942,7 @@ static int rtldrPEValidateSectionHeaders(const IMAGE_SECTION_HEADER *paSections,
     Log3(("RTLdrPE: Section Headers:\n"));
     for (unsigned cSHdrsLeft = cSections;  cSHdrsLeft > 0; cSHdrsLeft--, pSH++)
     {
-        const unsigned iSH = pSH - &paSections[0]; NOREF(iSH);
+        const unsigned iSH = (unsigned)(pSH - &paSections[0]); NOREF(iSH);
         Log3(("RTLdrPE: #%d '%-8.8s'  Characteristics: %08RX32\n"
               "RTLdrPE: VirtAddr: %08RX32  VirtSize: %08RX32\n"
               "RTLdrPE:  FileOff: %08RX32  FileSize: %08RX32\n"
@@ -2085,17 +3107,18 @@ static int rtldrPEReadRVA(PRTLDRMODPE pModPe, void *pvBuf, uint32_t cb, uint32_t
 
 
 /**
- * Validates the data of some selected data directories entries.
+ * Validates the data of some selected data directories entries and remember
+ * important bits for later.
  *
- * This requires a valid section table and thus has to wait
- * till after we've read and validated it.
+ * This requires a valid section table and thus has to wait till after we've
+ * read and validated it.
  *
  * @returns iprt status code.
  * @param   pModPe      The PE module instance.
  * @param   pOptHdr     Pointer to the optional header (valid).
  * @param   fFlags      Loader flags, RTLDR_O_XXX.
  */
-static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_HEADER64 *pOptHdr, uint32_t fFlags)
+static int rtldrPEValidateDirectoriesAndRememberStuff(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_HEADER64 *pOptHdr, uint32_t fFlags)
 {
     const char *pszLogName = pModPe->Core.pReader->pfnLogName(pModPe->Core.pReader); NOREF(pszLogName);
     union /* combine stuff we're reading to help reduce stack usage. */
@@ -2111,16 +3134,22 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
     IMAGE_DATA_DIRECTORY Dir = pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG];
     if (Dir.Size)
     {
-        const size_t cbExpect = pOptHdr->Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC
-            ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32)
-            : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64);
-        if (    Dir.Size != cbExpect
-            && (    cbExpect == sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32)
-                &&  Dir.Size != (uint32_t)RT_OFFSETOF(IMAGE_LOAD_CONFIG_DIRECTORY32, SEHandlerTable))
-           )
+        const size_t cbExpectV3 = !pModPe->f64Bit
+                                ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V3)
+                                : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V3);
+        const size_t cbExpectV2 = !pModPe->f64Bit
+                                ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V2)
+                                : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V2);
+        const size_t cbExpectV1 = !pModPe->f64Bit
+                                ? sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_V1)
+                                : sizeof(IMAGE_LOAD_CONFIG_DIRECTORY64_V2) /*No V1*/;
+
+        if (   Dir.Size != cbExpectV3
+            && Dir.Size != cbExpectV2
+            && Dir.Size != cbExpectV1)
         {
-            Log(("rtldrPEOpen: %s: load cfg dir: unexpected dir size of %d bytes, expected %d.\n",
-                 pszLogName, Dir.Size, cbExpect));
+            Log(("rtldrPEOpen: %s: load cfg dir: unexpected dir size of %d bytes, expected %d, %d, or %d.\n",
+                 pszLogName, Dir.Size, cbExpectV3, cbExpectV2, cbExpectV1));
             return VERR_LDRPE_LOAD_CONFIG_SIZE;
         }
 
@@ -2133,13 +3162,32 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
             return rc;
         rtldrPEConvert32BitLoadConfigTo64Bit(&u.Cfg64);
 
-        if (u.Cfg64.Size != cbExpect)
+        if (u.Cfg64.Size != Dir.Size)
         {
-            Log(("rtldrPEOpen: %s: load cfg dir: unexpected header size of %d bytes, expected %d.\n",
-                 pszLogName, u.Cfg64.Size, cbExpect));
-            return VERR_LDRPE_LOAD_CONFIG_SIZE;
+            /* Kludge, seen ati shipping 32-bit DLLs and EXEs with Dir.Size=0x40
+               and Cfg64.Size=0x5c or 0x48.  Windows seems to deal with it, so
+               lets do so as well. */
+            if (   Dir.Size < u.Cfg64.Size
+                && (   u.Cfg64.Size == cbExpectV3
+                    || u.Cfg64.Size == cbExpectV2) )
+            {
+                Log(("rtldrPEOpen: %s: load cfg dir: Header (%d) and directory (%d) size mismatch, applying the ATI kludge\n",
+                     pszLogName, u.Cfg64.Size, Dir.Size));
+                Dir.Size = u.Cfg64.Size;
+                memset(&u.Cfg64, 0, sizeof(u.Cfg64));
+                rc = rtldrPEReadRVA(pModPe, &u.Cfg64, Dir.Size, Dir.VirtualAddress);
+                if (RT_FAILURE(rc))
+                    return rc;
+                rtldrPEConvert32BitLoadConfigTo64Bit(&u.Cfg64);
+            }
+            if (u.Cfg64.Size != Dir.Size)
+            {
+                Log(("rtldrPEOpen: %s: load cfg dir: unexpected header size of %d bytes, expected %d.\n",
+                     pszLogName, u.Cfg64.Size, Dir.Size));
+                return VERR_LDRPE_LOAD_CONFIG_SIZE;
+            }
         }
-        if (u.Cfg64.LockPrefixTable)
+        if (u.Cfg64.LockPrefixTable && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
         {
             Log(("rtldrPEOpen: %s: load cfg dir: lock prefix table at %RX64. We don't support lock prefix tables!\n",
                  pszLogName, u.Cfg64.LockPrefixTable));
@@ -2154,12 +3202,28 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
             return VERR_BAD_EXE_FORMAT;
         }
 #endif
-        if (u.Cfg64.EditList)
+        if (u.Cfg64.EditList && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
         {
             Log(("rtldrPEOpen: %s: load cfg dir: EditList=%RX64 is unsupported!\n",
                  pszLogName, u.Cfg64.EditList));
             return VERR_BAD_EXE_FORMAT;
         }
+        /** @todo GuardCFC? Possibly related to:
+         *         http://research.microsoft.com/pubs/69217/ccs05-cfi.pdf
+         * Not trusting something designed by bakas who don't know how to modify a
+         * structure without messing up its natural alignment. */
+        if (    (   u.Cfg64.GuardCFCCheckFunctionPointer
+                 || u.Cfg64.Reserved2
+                 || u.Cfg64.GuardCFFunctionTable
+                 || u.Cfg64.GuardCFFunctionCount
+                 || u.Cfg64.GuardFlags)
+            && !(fFlags & (RTLDR_O_FOR_DEBUG | RTLDR_O_FOR_VALIDATION)))
+        {
+            Log(("rtldrPEOpen: %s: load cfg dir: Guard stuff: %RX64,%RX64,%RX64,%RX64,%RX32!\n",
+                 pszLogName, u.Cfg64.GuardCFCCheckFunctionPointer, u.Cfg64.Reserved2,
+                 u.Cfg64.GuardCFFunctionTable, u.Cfg64.GuardCFFunctionCount, u.Cfg64.GuardFlags));
+            return VERR_BAD_EXE_FORMAT;
+        }
     }
 
     /*
@@ -2167,7 +3231,7 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
      * take a look at the signature.
      */
     Dir = pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];
-    if (Dir.Size && !(fFlags & RTLDR_O_FOR_DEBUG))
+    if (Dir.Size)
     {
         PWIN_CERTIFICATE pFirst = (PWIN_CERTIFICATE)RTMemTmpAlloc(Dir.Size);
         if (!pFirst)
@@ -2175,14 +3239,14 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
         int rc = pModPe->Core.pReader->pfnRead(pModPe->Core.pReader, pFirst, Dir.Size, Dir.VirtualAddress);
         if (RT_SUCCESS(rc))
         {
-            uint32_t         off  = 0;
-            PWIN_CERTIFICATE pCur = pFirst;
+            uint32_t off  = 0;
             do
             {
+                PWIN_CERTIFICATE pCur = (PWIN_CERTIFICATE)((uint8_t *)pFirst + off);
+
                 /* validate the members. */
-                uint32_t const cbCur = RT_ALIGN_32(pCur->dwLength, 8);
-                if (   cbCur < sizeof(WIN_CERTIFICATE)
-                    || cbCur + off > RT_ALIGN_32(Dir.Size, 8))
+                if (   pCur->dwLength < sizeof(WIN_CERTIFICATE)
+                    || pCur->dwLength + off > Dir.Size)
                 {
                     Log(("rtldrPEOpen: %s: cert at %#x/%#x: dwLength=%#x\n", pszLogName, off, Dir.Size, pCur->dwLength));
                     rc = VERR_LDRPE_CERT_MALFORMED;
@@ -2208,11 +3272,17 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
                     break;
                 }
 
-                /** @todo Rainy Day: Implement further verification using openssl. */
+                /* Remember the first signed data certificate. */
+                if (   pCur->wCertificateType == WIN_CERT_TYPE_PKCS_SIGNED_DATA
+                    && pModPe->offPkcs7SignedData == 0)
+                {
+                    pModPe->offPkcs7SignedData = Dir.VirtualAddress
+                                               + (uint32_t)((uintptr_t)&pCur->bCertificate[0] - (uintptr_t)pFirst);
+                    pModPe->cbPkcs7SignedData  = pCur->dwLength - RT_OFFSETOF(WIN_CERTIFICATE, bCertificate);
+                }
 
                 /* next */
-                off += cbCur;
-                pCur = (PWIN_CERTIFICATE)((uint8_t *)pCur + cbCur);
+                off += RT_ALIGN(pCur->dwLength, WIN_CERTIFICATE_ALIGNMENT);
             } while (off < Dir.Size);
         }
         RTMemTmpFree(pFirst);
@@ -2234,8 +3304,10 @@ static int rtldrPEValidateDirectories(PRTLDRMODPE pModPe, const IMAGE_OPTIONAL_H
  * @param   enmArch     Architecture specifier.
  * @param   offNtHdrs   The offset of the NT headers (where you find "PE\0\0").
  * @param   phLdrMod    Where to store the handle.
+ * @param   pErrInfo    Where to return extended error information. Optional.
  */
-int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod)
+int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs,
+                PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
 {
     /*
      * Read and validate the file header.
@@ -2324,16 +3396,20 @@ int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF
                 pModPe->cbImage       = OptHdr.SizeOfImage;
                 pModPe->cbHeaders     = OptHdr.SizeOfHeaders;
                 pModPe->uTimestamp    = FileHdr.TimeDateStamp;
+                pModPe->f64Bit        = FileHdr.SizeOfOptionalHeader == sizeof(OptHdr);
                 pModPe->ImportDir     = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
                 pModPe->RelocDir      = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
                 pModPe->ExportDir     = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
                 pModPe->DebugDir      = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
+                pModPe->SecurityDir   = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY];
+                pModPe->fDllCharacteristics = OptHdr.DllCharacteristics;
 
                 /*
                  * Perform validation of some selected data directories which requires
-                 * inspection of the actual data.
+                 * inspection of the actual data.  This also saves some certificate
+                 * information.
                  */
-                rc = rtldrPEValidateDirectories(pModPe, &OptHdr, fFlags);
+                rc = rtldrPEValidateDirectoriesAndRememberStuff(pModPe, &OptHdr, fFlags);
                 if (RT_SUCCESS(rc))
                 {
                     *phLdrMod = &pModPe->Core;
diff --git a/src/VBox/Runtime/common/ldr/ldrkStuff.cpp b/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
index da53c29..9670bac 100644
--- a/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
@@ -108,6 +108,7 @@ static int rtkldrConvertError(int krc)
         case KERR_INVALID_PARAMETER:                        return VERR_INVALID_PARAMETER;
         case KERR_INVALID_HANDLE:                           return VERR_INVALID_HANDLE;
         case KERR_NO_MEMORY:                                return VERR_NO_MEMORY;
+        case KLDR_ERR_CPU_ARCH_MISMATCH:                    return VERR_LDR_ARCH_MISMATCH;
 
 
         case KLDR_ERR_UNKNOWN_FORMAT:
@@ -148,7 +149,7 @@ static int rtkldrConvertError(int krc)
         case KRDR_ERR_TOO_MANY_MAPPINGS:
         case KLDR_ERR_NOT_DLL:
         case KLDR_ERR_NOT_EXE:
-            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
+            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
 
 
         case KLDR_ERR_PE_UNSUPPORTED_MACHINE:
@@ -159,7 +160,7 @@ static int rtkldrConvertError(int krc)
         case KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND:
         case KLDR_ERR_PE_BAD_FIXUP:
         case KLDR_ERR_PE_BAD_IMPORT:
-            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
+            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
 
         case KLDR_ERR_LX_BAD_HEADER:
         case KLDR_ERR_LX_BAD_LOADER_SECTION:
@@ -173,11 +174,11 @@ static int rtkldrConvertError(int krc)
         case KLDR_ERR_LX_BAD_SONAME:
         case KLDR_ERR_LX_BAD_FORWARDER:
         case KLDR_ERR_LX_NRICHAIN_NOT_SUPPORTED:
-            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
+            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
 
+        case KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE:          return VERR_LDR_GENERAL_FAILURE;
         case KLDR_ERR_MACHO_OTHER_ENDIAN_NOT_SUPPORTED:
         case KLDR_ERR_MACHO_BAD_HEADER:
-        case KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE:
         case KLDR_ERR_MACHO_UNSUPPORTED_MACHINE:
         case KLDR_ERR_MACHO_BAD_LOAD_COMMAND:
         case KLDR_ERR_MACHO_UNKNOWN_LOAD_COMMAND:
@@ -194,7 +195,7 @@ static int rtkldrConvertError(int krc)
         case KLDR_ERR_MACHO_BAD_OBJECT_FILE:
         case KLDR_ERR_MACHO_BAD_SYMBOL:
         case KLDR_ERR_MACHO_UNSUPPORTED_FIXUP_TYPE:
-            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_GENERAL_FAILURE);
+            AssertMsgFailedReturn(("krc=%d (%#x): %s\n", krc, krc, kErrName(krc)), VERR_LDR_GENERAL_FAILURE);
 
         default:
             if (RT_FAILURE(krc))
@@ -836,6 +837,31 @@ static DECLCALLBACK(int) rtkldr_ReadDbgInfo(PRTLDRMODINTERNAL pMod, uint32_t iDb
 }
 
 
+/** @interface_method_impl{RTLDROPS,pfnQueryProp} */
+static DECLCALLBACK(int) rtkldr_QueryProp(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet)
+{
+    PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
+#if 0
+    int           rc;
+#endif
+    switch (enmProp)
+    {
+        case RTLDRPROP_UUID:
+#if 0 /* Requires neewer kStuff version. */
+            rc = kLdrModQueryImageUuid(pThis->pMod, /*pvBits*/ NULL, (uint8_t *)pvBuf, cbBuf);
+            if (rc == KLDR_ERR_NO_IMAGE_UUID)
+                return VERR_NOT_FOUND;
+            AssertReturn(rc == 0, VERR_INVALID_PARAMETER);
+            break;
+#endif
+
+        default:
+            return VERR_NOT_FOUND;
+    }
+    return VINF_SUCCESS;
+}
+
+
 /**
  * Operations for a kLdr module.
  */
@@ -858,6 +884,9 @@ static const RTLDROPS g_rtkldrOps =
     rtkldr_SegOffsetToRva,
     rtkldr_RvaToSegOffset,
     rtkldr_ReadDbgInfo,
+    rtkldr_QueryProp,
+    NULL,
+    NULL,
     42
 };
 
@@ -870,8 +899,9 @@ static const RTLDROPS g_rtkldrOps =
  * @param   fFlags      Reserved, MBZ.
  * @param   enmArch     CPU architecture specifier for the image to be loaded.
  * @param   phLdrMod    Where to store the handle.
+ * @param   pErrInfo    Where to return extended error information. Optional.
  */
-int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod)
+int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo)
 {
     /* Convert enmArch to k-speak. */
     KCPUARCH enmCpuArch;
diff --git a/src/VBox/Runtime/common/log/log.cpp b/src/VBox/Runtime/common/log/log.cpp
index 944895c..62463c4 100644
--- a/src/VBox/Runtime/common/log/log.cpp
+++ b/src/VBox/Runtime/common/log/log.cpp
@@ -2608,6 +2608,22 @@ RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args)
 }
 RT_EXPORT_SYMBOL(RTLogPrintfV);
 
+
+/**
+ * Dumper vprintf-like function outputting to a logger.
+ *
+ * @param   pvUser          Pointer to the logger instance to use, NULL for
+ *                          default instance.
+ * @param   pszFormat       Format string.
+ * @param   va              Format arguments.
+ */
+RTDECL(void) RTLogDumpPrintfV(void *pvUser, const char *pszFormat, va_list va)
+{
+    RTLogLoggerV((PRTLOGGER)pvUser, pszFormat, va);
+}
+RT_EXPORT_SYMBOL(RTLogDumpPrintfV);
+
+
 #ifdef IN_RING3
 
 /**
diff --git a/src/VBox/Runtime/common/math/bignum.cpp b/src/VBox/Runtime/common/math/bignum.cpp
new file mode 100644
index 0000000..d3abb78
--- /dev/null
+++ b/src/VBox/Runtime/common/math/bignum.cpp
@@ -0,0 +1,1895 @@
+/* $Id: bignum.cpp $ */
+/** @file
+ * IPRT - Big Integer Numbers.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/bignum.h>
+
+#include <iprt/asm.h>
+#include <iprt/asm-math.h>
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/memsafer.h>
+#include <iprt/string.h>
+
+
+/** The max size (in bytes) of an elements array. */
+#define RTBIGNUM_MAX_SIZE               _4M
+
+
+/**
+ * Scrambles a big number if required.
+ *
+ * @param   pBigNum     The big number.
+ */
+DECLINLINE(void) rtBigNumScramble(PRTBIGNUM pBigNum)
+{
+    if (pBigNum->fSensitive)
+    {
+        AssertReturnVoid(!pBigNum->fCurScrambled);
+        if (pBigNum->pauElements)
+        {
+            int rc = RTMemSaferScramble(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE); AssertRC(rc);
+            pBigNum->fCurScrambled = RT_SUCCESS(rc);
+        }
+        else
+            pBigNum->fCurScrambled = true;
+    }
+}
+
+
+/**
+ * Unscrambles a big number if required.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum     The big number.
+ */
+DECLINLINE(int) rtBigNumUnscramble(PRTBIGNUM pBigNum)
+{
+    if (pBigNum->fSensitive)
+    {
+        AssertReturn(pBigNum->fCurScrambled, VERR_INTERNAL_ERROR_2);
+        if (pBigNum->pauElements)
+        {
+            int rc = RTMemSaferUnscramble(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE); AssertRC(rc);
+            pBigNum->fCurScrambled = !RT_SUCCESS(rc);
+            return rc;
+        }
+        else
+            pBigNum->fCurScrambled = false;
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Getter function for pauElements which extends the array to infinity.
+ *
+ * @returns The element value.
+ * @param   pBigNum         The big number.
+ * @param   iElement        The element index.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumGetElement(PCRTBIGNUM pBigNum, uint32_t iElement)
+{
+    if (iElement < pBigNum->cUsed)
+        return pBigNum->pauElements[iElement];
+    return 0;
+}
+
+
+/**
+ * Grows the pauElements array so it can fit at least @a cNewUsed entries.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The big number.
+ * @param   cNewUsed        The new cUsed value.
+ */
+static int rtBigNumGrow(PRTBIGNUM pBigNum, uint32_t cNewUsed)
+{
+    uint32_t const cbOld = pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE;
+    uint32_t const cNew  = RT_ALIGN_32(cNewUsed, 4);
+    uint32_t const cbNew = cNew * RTBIGNUM_ELEMENT_SIZE;
+    Assert(cbNew > cbOld);
+
+    void *pvNew;
+    if (pBigNum->fSensitive)
+        pvNew = RTMemSaferReallocZ(cbOld, pBigNum->pauElements, cbNew);
+    else
+        pvNew = RTMemRealloc(pBigNum->pauElements, cbNew);
+    if (RT_LIKELY(pvNew))
+    {
+        if (cbNew > cbOld)
+            RT_BZERO((char *)pvNew + cbOld, cbNew - cbOld);
+
+        pBigNum->pauElements = (RTBIGNUMELEMENT *)pvNew;
+        pBigNum->cUsed       = cNewUsed;
+        pBigNum->cAllocated  = cNew;
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+
+
+/**
+ * Changes the cUsed member, growing the pauElements array if necessary.
+ *
+ * No assumptions about the value of any added elements should be made. This
+ * method is mainly for resizing result values where the caller will repopulate
+ * the element values short after this call.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The big number.
+ * @param   cNewUsed        The new cUsed value.
+ */
+DECLINLINE(int) rtBigNumSetUsed(PRTBIGNUM pBigNum, uint32_t cNewUsed)
+{
+    if (pBigNum->cAllocated >= cNewUsed)
+    {
+        pBigNum->cUsed = cNewUsed;
+        return VINF_SUCCESS;
+    }
+    return rtBigNumGrow(pBigNum, cNewUsed);
+}
+
+/**
+ * The slow part of rtBigNumEnsureElementPresent where we need to do actual zero
+ * extending.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum             The big number.
+ * @param   iElement            The element we wish to access.
+ */
+static int rtBigNumEnsureElementPresentSlow(PRTBIGNUM pBigNum, uint32_t iElement)
+{
+    uint32_t const cOldUsed = pBigNum->cUsed;
+    int rc = rtBigNumSetUsed(pBigNum, iElement + 1);
+    if (RT_SUCCESS(rc))
+    {
+        RT_BZERO(&pBigNum->pauElements[cOldUsed], (iElement + 1 - cOldUsed) * RTBIGNUM_ELEMENT_SIZE);
+        return VINF_SUCCESS;
+    }
+    return rc;
+}
+
+
+/**
+ * Zero extends the element array to make sure a the specified element index is
+ * accessible.
+ *
+ * This is typically used with bit operations and self modifying methods.  Any
+ * new elements added will be initialized to zero.  The caller is responsible
+ * for there not being any trailing zero elements.
+ *
+ * The number must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum             The big number.
+ * @param   iElement            The element we wish to access.
+ */
+DECLINLINE(int) rtBigNumEnsureElementPresent(PRTBIGNUM pBigNum, uint32_t iElement)
+{
+    if (iElement < pBigNum->cUsed)
+        return VINF_SUCCESS;
+    return rtBigNumEnsureElementPresentSlow(pBigNum, iElement);
+}
+
+
+/**
+ * Strips zero elements from the magnitude value.
+ *
+ * @param   pBigNum         The big number to strip.
+ */
+static void rtBigNumStripTrailingZeros(PRTBIGNUM pBigNum)
+{
+    uint32_t i = pBigNum->cUsed;
+    while (i > 0 && pBigNum->pauElements[i - 1] == 0)
+        i--;
+    pBigNum->cUsed = i;
+}
+
+
+/**
+ * Initialize the big number to zero.
+ *
+ * @returns @a pBigNum
+ * @param   pBigNum         The big number.
+ * @param   fFlags          The flags.
+ * @internal
+ */
+DECLINLINE(PRTBIGNUM) rtBigNumInitZeroInternal(PRTBIGNUM pBigNum, uint32_t fFlags)
+{
+    RT_ZERO(*pBigNum);
+    pBigNum->fSensitive = RT_BOOL(fFlags & RTBIGNUMINIT_F_SENSITIVE);
+    return pBigNum;
+}
+
+
+/**
+ * Initialize the big number to zero from a template variable.
+ *
+ * @returns @a pBigNum
+ * @param   pBigNum         The big number.
+ * @param   pTemplate       The template big number.
+ * @internal
+ */
+DECLINLINE(PRTBIGNUM) rtBigNumInitZeroTemplate(PRTBIGNUM pBigNum, PCRTBIGNUM pTemplate)
+{
+    RT_ZERO(*pBigNum);
+    pBigNum->fSensitive = pTemplate->fSensitive;
+    return pBigNum;
+}
+
+
+RTDECL(int) RTBigNumInit(PRTBIGNUM pBigNum, uint32_t fFlags, void const *pvRaw, size_t cbRaw)
+{
+    /*
+     * Validate input.
+     */
+    AssertPtrReturn(pBigNum, VERR_INVALID_POINTER);
+    AssertReturn(RT_BOOL(fFlags & RTBIGNUMINIT_F_ENDIAN_BIG) ^ RT_BOOL(fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE),
+                 VERR_INVALID_PARAMETER);
+    AssertReturn(RT_BOOL(fFlags & RTBIGNUMINIT_F_UNSIGNED) ^ RT_BOOL(fFlags & RTBIGNUMINIT_F_SIGNED), VERR_INVALID_PARAMETER);
+    if (cbRaw)
+        AssertPtrReturn(pvRaw, VERR_INVALID_POINTER);
+
+    /*
+     * Initalize the big number to zero.
+     */
+    rtBigNumInitZeroInternal(pBigNum, fFlags);
+
+    /*
+     * Strip the input and figure the sign flag.
+     */
+    uint8_t const *pb = (uint8_t const *)pvRaw;
+    if (cbRaw)
+    {
+        if (fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE)
+        {
+            if (fFlags & RTBIGNUMINIT_F_UNSIGNED)
+            {
+                while (cbRaw > 0 && pb[cbRaw - 1] == 0)
+                    cbRaw--;
+            }
+            else
+            {
+                if (pb[cbRaw - 1] >> 7)
+                {
+                    pBigNum->fNegative = 1;
+                    while (cbRaw > 1 && pb[cbRaw - 1] == 0xff)
+                        cbRaw--;
+                }
+                else
+                    while (cbRaw > 0 && pb[cbRaw - 1] == 0)
+                        cbRaw--;
+            }
+        }
+        else
+        {
+            if (fFlags & RTBIGNUMINIT_F_UNSIGNED)
+            {
+                while (cbRaw > 0 && *pb == 0)
+                    pb++, cbRaw--;
+            }
+            else
+            {
+                if (*pb >> 7)
+                {
+                    pBigNum->fNegative = 1;
+                    while (cbRaw > 1 && *pb == 0xff)
+                        pb++, cbRaw--;
+                }
+                else
+                    while (cbRaw > 0 && *pb == 0)
+                        pb++, cbRaw--;
+            }
+        }
+    }
+
+    /*
+     * Allocate memory for the elements.
+     */
+    size_t cbAligned = RT_ALIGN_Z(cbRaw, RTBIGNUM_ELEMENT_SIZE);
+    if (RT_UNLIKELY(cbAligned >= RTBIGNUM_MAX_SIZE))
+        return VERR_OUT_OF_RANGE;
+    pBigNum->cUsed = (uint32_t)cbAligned / RTBIGNUM_ELEMENT_SIZE;
+    if (pBigNum->cUsed)
+    {
+        pBigNum->cAllocated = RT_ALIGN_32(pBigNum->cUsed, 4);
+        if (pBigNum->fSensitive)
+            pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemSaferAllocZ(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+        else
+            pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemAlloc(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+        if (RT_UNLIKELY(!pBigNum->pauElements))
+            return VERR_NO_MEMORY;
+
+        /*
+         * Initialize the array.
+         */
+        uint32_t i = 0;
+        if (fFlags & RTBIGNUMINIT_F_ENDIAN_LITTLE)
+        {
+            while (cbRaw >= RTBIGNUM_ELEMENT_SIZE)
+            {
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                pBigNum->pauElements[i] = RT_MAKE_U64_FROM_U8(pb[0], pb[1], pb[2], pb[3], pb[4], pb[5], pb[6], pb[7]);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+                pBigNum->pauElements[i] = RT_MAKE_U32_FROM_U8(pb[0], pb[1], pb[2], pb[3]);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                i++;
+                pb    += RTBIGNUM_ELEMENT_SIZE;
+                cbRaw -= RTBIGNUM_ELEMENT_SIZE;
+            }
+
+            if (cbRaw > 0)
+            {
+                RTBIGNUMELEMENT uLast = pBigNum->fNegative ? ~(RTBIGNUMELEMENT)0 : 0;
+                switch (cbRaw)
+                {
+                    default: AssertFailed();
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                    case 7: uLast = (uLast << 8) | pb[6];
+                    case 6: uLast = (uLast << 8) | pb[5];
+                    case 5: uLast = (uLast << 8) | pb[4];
+                    case 4: uLast = (uLast << 8) | pb[3];
+#endif
+                    case 3: uLast = (uLast << 8) | pb[2];
+                    case 2: uLast = (uLast << 8) | pb[1];
+                    case 1: uLast = (uLast << 8) | pb[0];
+                }
+                pBigNum->pauElements[i] = uLast;
+            }
+        }
+        else
+        {
+            pb += cbRaw;
+            while (cbRaw >= RTBIGNUM_ELEMENT_SIZE)
+            {
+                pb -= RTBIGNUM_ELEMENT_SIZE;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                pBigNum->pauElements[i] = RT_MAKE_U64_FROM_U8(pb[7], pb[6], pb[5], pb[4], pb[3], pb[2], pb[1], pb[0]);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+                pBigNum->pauElements[i] = RT_MAKE_U32_FROM_U8(pb[3], pb[2], pb[1], pb[0]);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                i++;
+                cbRaw -= RTBIGNUM_ELEMENT_SIZE;
+            }
+
+            if (cbRaw > 0)
+            {
+                RTBIGNUMELEMENT uLast = pBigNum->fNegative ? ~(RTBIGNUMELEMENT)0 : 0;
+                pb -= cbRaw;
+                switch (cbRaw)
+                {
+                    default: AssertFailed();
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                    case 7: uLast = (uLast << 8) | *pb++;
+                    case 6: uLast = (uLast << 8) | *pb++;
+                    case 5: uLast = (uLast << 8) | *pb++;
+                    case 4: uLast = (uLast << 8) | *pb++;
+#endif
+                    case 3: uLast = (uLast << 8) | *pb++;
+                    case 2: uLast = (uLast << 8) | *pb++;
+                    case 1: uLast = (uLast << 8) | *pb++;
+                }
+                pBigNum->pauElements[i] = uLast;
+            }
+        }
+
+        /*
+         * If negative, negate it so we get a positive magnitude value in pauElements.
+         */
+        if (pBigNum->fNegative)
+        {
+            pBigNum->pauElements[0] = 0U - pBigNum->pauElements[0];
+            for (i = 1; i < pBigNum->cUsed; i++)
+                pBigNum->pauElements[i] = 0U - pBigNum->pauElements[i] - 1U;
+        }
+    }
+
+    rtBigNumScramble(pBigNum);
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumInitZero(PRTBIGNUM pBigNum, uint32_t fFlags)
+{
+    AssertReturn(!(fFlags & ~RTBIGNUMINIT_F_SENSITIVE), VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pBigNum, VERR_INVALID_POINTER);
+
+    rtBigNumInitZeroInternal(pBigNum, fFlags);
+    rtBigNumScramble(pBigNum);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Internal clone function that assumes the caller takes care of scrambling.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The target number.
+ * @param   pSrc            The source number.
+ */
+static int rtBigNumCloneInternal(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc)
+{
+    Assert(!pSrc->fCurScrambled);
+    int rc = VINF_SUCCESS;
+
+    /*
+     * Copy over the data.
+     */
+    RT_ZERO(*pBigNum);
+    pBigNum->fNegative  = pSrc->fNegative;
+    pBigNum->fSensitive = pSrc->fSensitive;
+    pBigNum->cUsed      = pSrc->cUsed;
+    if (pSrc->cUsed)
+    {
+        /* Duplicate the element array. */
+        pBigNum->cAllocated = RT_ALIGN_32(pBigNum->cUsed, 4);
+        if (pBigNum->fSensitive)
+            pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemSaferAllocZ(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+        else
+            pBigNum->pauElements = (RTBIGNUMELEMENT *)RTMemAlloc(pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+        if (RT_LIKELY(pBigNum->pauElements))
+            memcpy(pBigNum->pauElements, pSrc->pauElements, pBigNum->cUsed * RTBIGNUM_ELEMENT_SIZE);
+        else
+        {
+            RT_ZERO(*pBigNum);
+            rc = VERR_NO_MEMORY;
+        }
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumClone(PRTBIGNUM pBigNum, PCRTBIGNUM pSrc)
+{
+    int rc = rtBigNumUnscramble((PRTBIGNUM)pSrc);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumCloneInternal(pBigNum, pSrc);
+        if (RT_SUCCESS(rc))
+            rtBigNumScramble(pBigNum);
+        rtBigNumScramble((PRTBIGNUM)pSrc);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumDestroy(PRTBIGNUM pBigNum)
+{
+    if (pBigNum)
+    {
+        if (pBigNum->pauElements)
+        {
+            Assert(pBigNum->cAllocated > 0);
+            if (pBigNum->fSensitive)
+            {
+                RTMemSaferFree(pBigNum->pauElements, pBigNum->cAllocated * RTBIGNUM_ELEMENT_SIZE);
+                RT_ZERO(*pBigNum);
+            }
+            RTMemFree(pBigNum->pauElements);
+            pBigNum->pauElements = NULL;
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumAssign(PRTBIGNUM pDst, PCRTBIGNUM pSrc)
+{
+    AssertReturn(pDst->fSensitive >= pSrc->fSensitive, VERR_BIGNUM_SENSITIVE_INPUT);
+    int rc = rtBigNumUnscramble(pDst);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pSrc);
+        if (RT_SUCCESS(rc))
+        {
+            if (   pDst->fSensitive == pSrc->fSensitive
+                || pDst->fSensitive)
+            {
+                if (pDst->cAllocated >= pSrc->cUsed)
+                {
+                    pDst->cUsed     = pSrc->cUsed;
+                    pDst->fNegative = pSrc->fNegative;
+                    memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+                }
+                else
+                {
+                    rc = rtBigNumGrow(pDst, pSrc->cUsed);
+                    if (RT_SUCCESS(rc))
+                    {
+                        pDst->fNegative = pSrc->fNegative;
+                        memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+                    }
+                }
+            }
+            else
+                rc = VERR_BIGNUM_SENSITIVE_INPUT;
+            rtBigNumScramble((PRTBIGNUM)pSrc);
+        }
+        rtBigNumScramble(pDst);
+    }
+    return rc;
+}
+
+
+static uint32_t rtBigNumElementBitCount(RTBIGNUMELEMENT uElement)
+{
+#if RTBIGNUM_ELEMENT_SIZE == 8
+    if (uElement >> 32)
+        return ASMBitLastSetU32((uint32_t)(uElement >> 32)) + 32;
+    return ASMBitLastSetU32((uint32_t)uElement);
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+    return ASMBitLastSetU32(uElement);
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+}
+
+
+/**
+ * Same as RTBigNumBitWidth, except that it ignore the signed bit.
+ *
+ * The number must be unscrambled.
+ *
+ * @returns The effective width of the magnitude, in bits.  Returns 0 if the
+ *          value is zero.
+ * @param   pBigNum         The bit number.
+ */
+static uint32_t rtBigNumMagnitudeBitWidth(PCRTBIGNUM pBigNum)
+{
+    uint32_t idxLast = pBigNum->cUsed;
+    if (idxLast)
+    {
+        idxLast--;
+        RTBIGNUMELEMENT uLast = pBigNum->pauElements[idxLast]; Assert(uLast);
+        return rtBigNumElementBitCount(uLast) + idxLast * RTBIGNUM_ELEMENT_BITS;
+    }
+    return 0;
+}
+
+
+RTDECL(uint32_t) RTBigNumBitWidth(PCRTBIGNUM pBigNum)
+{
+    uint32_t idxLast = pBigNum->cUsed;
+    if (idxLast)
+    {
+        idxLast--;
+        rtBigNumUnscramble((PRTBIGNUM)pBigNum);
+        RTBIGNUMELEMENT uLast = pBigNum->pauElements[idxLast]; Assert(uLast);
+        rtBigNumScramble((PRTBIGNUM)pBigNum);
+        return rtBigNumElementBitCount(uLast) + idxLast * RTBIGNUM_ELEMENT_BITS + pBigNum->fNegative;
+    }
+    return 0;
+}
+
+
+RTDECL(uint32_t) RTBigNumByteWidth(PCRTBIGNUM pBigNum)
+{
+    uint32_t cBits = RTBigNumBitWidth(pBigNum);
+    return (cBits + 7) / 8;
+}
+
+
+RTDECL(int) RTBigNumToBytesBigEndian(PCRTBIGNUM pBigNum, void *pvBuf, size_t cbWanted)
+{
+    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+    AssertReturn(cbWanted > 0, VERR_INVALID_PARAMETER);
+
+    int rc = rtBigNumUnscramble((PRTBIGNUM)pBigNum);
+    if (RT_SUCCESS(rc))
+    {
+        rc = VINF_SUCCESS;
+        if (pBigNum->cUsed != 0)
+        {
+            uint8_t *pbDst = (uint8_t *)pvBuf;
+            pbDst += cbWanted - 1;
+            for (uint32_t i = 0; i < pBigNum->cUsed; i++)
+            {
+                RTBIGNUMELEMENT uElement = pBigNum->pauElements[i];
+                if (pBigNum->fNegative)
+                    uElement = (RTBIGNUMELEMENT)0 - uElement - (i > 0);
+                if (cbWanted >= sizeof(uElement))
+                {
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+                    uElement >>= 8;
+                    *pbDst-- = (uint8_t)uElement;
+#elif RTBIGNUM_ELEMENT_SIZE != 4
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                    cbWanted -= sizeof(uElement);
+                }
+                else
+                {
+
+                    uint32_t cBitsLeft = RTBIGNUM_ELEMENT_BITS;
+                    while (cbWanted > 0)
+                    {
+                        *pbDst-- = (uint8_t)uElement;
+                        uElement >>= 8;
+                        cBitsLeft -= 8;
+                        cbWanted--;
+                    }
+                    Assert(cBitsLeft > 0); Assert(cBitsLeft < RTBIGNUM_ELEMENT_BITS);
+                    if (   i + 1 < pBigNum->cUsed
+                        || (  !pBigNum->fNegative
+                            ? uElement != 0
+                            : uElement != ((RTBIGNUMELEMENT)1 << cBitsLeft) - 1U ) )
+                        rc = VERR_BUFFER_OVERFLOW;
+                    break;
+                }
+            }
+
+            /* Sign extend the number to the desired output size. */
+            if (cbWanted > 0)
+                memset(pbDst - cbWanted, pBigNum->fNegative ? 0 : 0xff, cbWanted);
+        }
+        else
+            RT_BZERO(pvBuf, cbWanted);
+        rtBigNumScramble((PRTBIGNUM)pBigNum);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumCompare(PRTBIGNUM pLeft, PRTBIGNUM pRight)
+{
+    int rc = rtBigNumUnscramble(pLeft);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble(pRight);
+        if (RT_SUCCESS(rc))
+        {
+            if (pLeft->fNegative == pRight->fNegative)
+            {
+                if (pLeft->cUsed == pRight->cUsed)
+                {
+                    rc = 0;
+                    uint32_t i = pLeft->cUsed;
+                    while (i-- > 0)
+                        if (pLeft->pauElements[i] != pRight->pauElements[i])
+                        {
+                            rc = pLeft->pauElements[i] < pRight->pauElements[i] ? -1 : 1;
+                            break;
+                        }
+                    if (pLeft->fNegative)
+                        rc = -rc;
+                }
+                else
+                    rc = !pLeft->fNegative
+                       ? pLeft->cUsed < pRight->cUsed ? -1 : 1
+                       : pLeft->cUsed < pRight->cUsed ? 1 : -1;
+            }
+            else
+                rc = pLeft->fNegative ? -1 : 1;
+
+            rtBigNumScramble(pRight);
+        }
+        rtBigNumScramble(pLeft);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumCompareWithU64(PRTBIGNUM pLeft, uint64_t uRight)
+{
+    int rc = rtBigNumUnscramble(pLeft);
+    if (RT_SUCCESS(rc))
+    {
+        if (!pLeft->fNegative)
+        {
+            if (pLeft->cUsed * RTBIGNUM_ELEMENT_SIZE <= sizeof(uRight))
+            {
+                if (pLeft->cUsed == 0)
+                    rc = uRight == 0 ? 0 : -1;
+                else
+                {
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                    uint64_t uLeft = rtBigNumGetElement(pLeft, 0);
+                    if (uLeft < uRight)
+                        rc = -1;
+                    else
+                        rc = uLeft == uRight ? 0 : 1;
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+                    uint32_t uSubLeft  = rtBigNumGetElement(pLeft, 1);
+                    uint32_t uSubRight = uRight >> 32;
+                    if (uSubLeft == uSubRight)
+                    {
+                        uSubLeft  = rtBigNumGetElement(pLeft, 0);
+                        uSubRight = (uint32_t)uRight;
+                    }
+                    if (uSubLeft < uSubRight)
+                        rc = -1;
+                    else
+                        rc = uSubLeft == uSubRight ? 0 : 1;
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                }
+            }
+            else
+                rc = 1;
+        }
+        else
+            rc = -1;
+        rtBigNumScramble(pLeft);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumCompareWithS64(PRTBIGNUM pLeft, int64_t iRight)
+{
+    int rc = rtBigNumUnscramble(pLeft);
+    if (RT_SUCCESS(rc))
+    {
+        if (pLeft->fNegative == (iRight < 0))
+        {
+            if (pLeft->cUsed * RTBIGNUM_ELEMENT_SIZE <= sizeof(iRight))
+            {
+                uint64_t uRightMagn = !pLeft->fNegative ? (uint64_t)iRight : (uint64_t)-iRight;
+#if RTBIGNUM_ELEMENT_SIZE == 8
+                uint64_t uLeft = rtBigNumGetElement(pLeft, 0);
+                if (uLeft < uRightMagn)
+                    rc = -1;
+                else
+                    rc = uLeft == (uint64_t)uRightMagn ? 0 : 1;
+#elif RTBIGNUM_ELEMENT_SIZE == 4
+                uint32_t uSubLeft  = rtBigNumGetElement(pLeft, 1);
+                uint32_t uSubRight = uRightMagn >> 32;
+                if (uSubLeft == uSubRight)
+                {
+                    uSubLeft  = rtBigNumGetElement(pLeft, 0);
+                    uSubRight = (uint32_t)uRightMagn;
+                }
+                if (uSubLeft < uSubRight)
+                    rc = -1;
+                else
+                    rc = uSubLeft == uSubRight ? 0 : 1;
+#else
+# error "Bad RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                if (pLeft->fNegative)
+                    rc = -rc;
+            }
+            else
+                rc = pLeft->fNegative ? -1 : 1;
+        }
+        else
+            rc = pLeft->fNegative ? -1 : 1;
+        rtBigNumScramble(pLeft);
+    }
+    return rc;
+}
+
+
+#define RTBIGNUMELEMENT_HALF_MASK              ( ((RTBIGNUMELEMENT)1 << (RTBIGNUM_ELEMENT_BITS / 2)) - (RTBIGNUMELEMENT)1)
+#define RTBIGNUMELEMENT_LO_HALF(a_uElement)    ( (RTBIGNUMELEMENT_HALF_MASK) & (a_uElement) )
+#define RTBIGNUMELEMENT_HI_HALF(a_uElement)    ( (a_uElement) >> (RTBIGNUM_ELEMENT_BITS / 2) )
+
+
+/**
+ * Compares the magnitude values of two big numbers.
+ *
+ * @retval  -1 if pLeft is smaller than pRight.
+ * @retval  0 if pLeft is equal to pRight.
+ * @retval  1 if pLeft is larger than pRight.
+ * @param   pLeft           The left side number.
+ * @param   pRight          The right side number.
+ */
+static int rtBigNumMagnitudeCompare(PCRTBIGNUM pLeft, PCRTBIGNUM pRight)
+{
+    Assert(!pLeft->fCurScrambled); Assert(!pRight->fCurScrambled);
+    int rc;
+    uint32_t i = pLeft->cUsed;
+    if (i == pRight->cUsed)
+    {
+        rc = 0;
+        while (i-- > 0)
+            if (pLeft->pauElements[i] != pRight->pauElements[i])
+            {
+                rc = pLeft->pauElements[i] < pRight->pauElements[i] ? -1 : 1;
+                break;
+            }
+    }
+    else
+        rc = i < pRight->cUsed ? -1 : 1;
+    return rc;
+}
+
+
+/**
+ * Does addition with carry.
+ *
+ * This is a candidate for inline assembly on some platforms.
+ *
+ * @returns The result (the sum)
+ * @param   uAugend         What to add to.
+ * @param   uAddend         What to add to it.
+ * @param   pfCarry         Where to read the input carry and return the output
+ *                          carry.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumElementAddWithCarry(RTBIGNUMELEMENT uAugend, RTBIGNUMELEMENT uAddend,
+                                                        RTBIGNUMELEMENT *pfCarry)
+{
+    RTBIGNUMELEMENT uRet = uAugend + uAddend + *pfCarry;
+
+    /* Determin carry the expensive way. */
+    RTBIGNUMELEMENT uTmp = RTBIGNUMELEMENT_HI_HALF(uAugend) + RTBIGNUMELEMENT_HI_HALF(uAddend);
+    if (uTmp < RTBIGNUMELEMENT_HALF_MASK)
+        *pfCarry = 0;
+    else
+        *pfCarry = uTmp > RTBIGNUMELEMENT_HALF_MASK
+                ||   RTBIGNUMELEMENT_LO_HALF(uAugend) + RTBIGNUMELEMENT_LO_HALF(uAddend) + *pfCarry
+                   > RTBIGNUMELEMENT_HALF_MASK;
+    return uRet;
+}
+
+
+/**
+ * Adds two magnitudes and stores them into a third.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched.
+ *
+ * @returns IPRT status code.
+ * @param   pResult         The resultant.
+ * @param   pAugend         To whom it shall be addede.
+ * @param   pAddend         The nombre to addede.
+ */
+static int rtBigNumMagnitudeAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend)
+{
+    Assert(!pResult->fCurScrambled); Assert(!pAugend->fCurScrambled); Assert(!pAddend->fCurScrambled);
+    Assert(pResult != pAugend); Assert(pResult != pAddend);
+
+    uint32_t cElements = RT_MAX(pAugend->cUsed, pAddend->cUsed);
+    int rc = rtBigNumSetUsed(pResult, cElements);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * The primitive way, requires at least two additions for each entry
+         * without machine code help.
+         */
+        RTBIGNUMELEMENT fCarry = 0;
+        for (uint32_t i = 0; i < cElements; i++)
+            pResult->pauElements[i] = rtBigNumElementAddWithCarry(rtBigNumGetElement(pAugend, i),
+                                                                  rtBigNumGetElement(pAddend, i),
+                                                                  &fCarry);
+        if (fCarry)
+        {
+            rc = rtBigNumSetUsed(pResult, cElements + 1);
+            if (RT_SUCCESS(rc))
+                pResult->pauElements[cElements++] = 1;
+        }
+        Assert(pResult->cUsed == cElements || RT_FAILURE_NP(rc));
+    }
+
+    return rc;
+}
+
+
+/**
+ * Does addition with borrow.
+ *
+ * This is a candidate for inline assembly on some platforms.
+ *
+ * @returns The result (the sum)
+ * @param   uMinuend        What to subtract from.
+ * @param   uSubtrahend     What to subtract.
+ * @param   pfBorrow        Where to read the input borrow and return the output
+ *                          borrow.
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumElementSubWithBorrow(RTBIGNUMELEMENT uMinuend, RTBIGNUMELEMENT uSubtrahend,
+                                                         RTBIGNUMELEMENT *pfBorrow)
+{
+    RTBIGNUMELEMENT uRet = uMinuend - uSubtrahend - *pfBorrow;
+
+    /* Figure out if we borrowed. */
+    *pfBorrow = !*pfBorrow ? uMinuend < uSubtrahend : uMinuend <= uSubtrahend;
+    return uRet;
+}
+
+
+/**
+ * Substracts a smaller (or equal) magnitude from another one and stores it into
+ * a third.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched.  For this reason, the @a pMinuend must be larger or equal to @a
+ * pSubtrahend.
+ *
+ * @returns IPRT status code.
+ * @param   pResult             There to store the result.
+ * @param   pMinuend            What to subtract from.
+ * @param   pSubtrahend         What to subtract.
+ */
+static int rtBigNumMagnitudeSub(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend)
+{
+    Assert(!pResult->fCurScrambled); Assert(!pMinuend->fCurScrambled); Assert(!pSubtrahend->fCurScrambled);
+    Assert(pResult != pMinuend); Assert(pResult != pSubtrahend);
+    Assert(pMinuend->cUsed >= pSubtrahend->cUsed);
+
+    int rc = rtBigNumSetUsed(pResult, pMinuend->cUsed);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * The primitive way, as usual.
+         */
+        RTBIGNUMELEMENT fBorrow = 0;
+        for (uint32_t i = 0; i < pMinuend->cUsed; i++)
+            pResult->pauElements[i] = rtBigNumElementSubWithBorrow(pMinuend->pauElements[i],
+                                                                   rtBigNumGetElement(pSubtrahend, i),
+                                                                   &fBorrow);
+        Assert(fBorrow == 0);
+
+        /*
+         * Trim the result.
+         */
+        rtBigNumStripTrailingZeros(pResult);
+    }
+
+    return rc;
+}
+
+
+/**
+ * Substracts a smaller (or equal) magnitude from another one and stores the
+ * result into the first.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched.  For this reason, the @a pMinuendResult must be larger or equal to
+ * @a pSubtrahend.
+ *
+ * @param   pMinuendResult      What to subtract from and return as result.
+ * @param   pSubtrahend         What to subtract.
+ */
+static void rtBigNumMagnitudeSubThis(PRTBIGNUM pMinuendResult, PCRTBIGNUM pSubtrahend)
+{
+    Assert(!pMinuendResult->fCurScrambled); Assert(!pSubtrahend->fCurScrambled);
+    Assert(pMinuendResult != pSubtrahend);
+    Assert(pMinuendResult->cUsed >= pSubtrahend->cUsed);
+
+    /*
+     * The primitive way, as usual.
+     */
+    RTBIGNUMELEMENT fBorrow = 0;
+    for (uint32_t i = 0; i < pMinuendResult->cUsed; i++)
+        pMinuendResult->pauElements[i] = rtBigNumElementSubWithBorrow(pMinuendResult->pauElements[i],
+                                                                      rtBigNumGetElement(pSubtrahend, i),
+                                                                      &fBorrow);
+    Assert(fBorrow == 0);
+
+    /*
+     * Trim the result.
+     */
+    rtBigNumStripTrailingZeros(pMinuendResult);
+}
+
+
+RTDECL(int) RTBigNumAdd(PRTBIGNUM pResult, PCRTBIGNUM pAugend, PCRTBIGNUM pAddend)
+{
+    Assert(pResult != pAugend); Assert(pResult != pAddend);
+    AssertReturn(pResult->fSensitive >= (pAugend->fSensitive | pAddend->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pResult);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pAugend);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pAddend);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Same sign: Add magnitude, keep sign.
+                 *       1  +   1  =  2
+                 *     (-1) + (-1) = -2
+                 */
+                if (pAugend->fNegative == pAddend->fNegative)
+                {
+                    pResult->fNegative = pAugend->fNegative;
+                    rc = rtBigNumMagnitudeAdd(pResult, pAugend, pAddend);
+                }
+                /*
+                 * Different sign: Subtract smaller from larger, keep sign of larger.
+                 *     (-5) +   3  = -2
+                 *       5  + (-3) =  2
+                 *     (-1) +   3  =  2
+                 *       1  + (-3) = -2
+                 */
+                else if (rtBigNumMagnitudeCompare(pAugend, pAddend) >= 0)
+                {
+                    pResult->fNegative = pAugend->fNegative;
+                    rc = rtBigNumMagnitudeSub(pResult, pAugend, pAddend);
+                    if (!pResult->cUsed)
+                        pResult->fNegative = 0;
+                }
+                else
+                {
+                    pResult->fNegative = pAddend->fNegative;
+                    rc = rtBigNumMagnitudeSub(pResult, pAddend, pAugend);
+                }
+                rtBigNumScramble((PRTBIGNUM)pAddend);
+            }
+            rtBigNumScramble((PRTBIGNUM)pAugend);
+        }
+        rtBigNumScramble(pResult);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumSubtract(PRTBIGNUM pResult, PCRTBIGNUM pMinuend, PCRTBIGNUM pSubtrahend)
+{
+    Assert(pResult != pMinuend); Assert(pResult != pSubtrahend);
+    AssertReturn(pResult->fSensitive >= (pMinuend->fSensitive | pSubtrahend->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pResult);
+    if (RT_SUCCESS(rc))
+    {
+        if (pMinuend != pSubtrahend)
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pMinuend);
+            if (RT_SUCCESS(rc))
+            {
+                rc = rtBigNumUnscramble((PRTBIGNUM)pSubtrahend);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * Different sign: Add magnitude, keep sign of first.
+                     *       1 - (-2) ==  3
+                     *      -1 -   2  == -3
+                     */
+                    if (pMinuend->fNegative != pSubtrahend->fNegative)
+                    {
+                        pResult->fNegative = pMinuend->fNegative;
+                        rc = rtBigNumMagnitudeAdd(pResult, pMinuend, pSubtrahend);
+                    }
+                    /*
+                     * Same sign, minuend has greater or equal absolute value: Subtract, keep sign of first.
+                     *      10 - 7 = 3
+                     */
+                    else if (rtBigNumMagnitudeCompare(pMinuend, pSubtrahend) >= 0)
+                    {
+                        pResult->fNegative = pMinuend->fNegative;
+                        rc = rtBigNumMagnitudeSub(pResult, pMinuend, pSubtrahend);
+                    }
+                    /*
+                     * Same sign, subtrahend is larger: Reverse and subtract, invert sign of first.
+                     *      7 -  10  = -3
+                     *     -1 - (-3) =  2
+                     */
+                    else
+                    {
+                        pResult->fNegative = !pMinuend->fNegative;
+                        rc = rtBigNumMagnitudeSub(pResult, pSubtrahend, pMinuend);
+                    }
+                    rtBigNumScramble((PRTBIGNUM)pSubtrahend);
+                }
+                rtBigNumScramble((PRTBIGNUM)pMinuend);
+            }
+        }
+        else
+        {
+            /* zero. */
+            pResult->fNegative = 0;
+            pResult->cUsed     = 0;
+        }
+        rtBigNumScramble(pResult);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumNegateThis(PRTBIGNUM pThis)
+{
+    pThis->fNegative = !pThis->fNegative;
+    return VINF_SUCCESS;
+}
+
+
+RTDECL(int) RTBigNumNegate(PRTBIGNUM pResult, PCRTBIGNUM pBigNum)
+{
+    int rc = RTBigNumAssign(pResult, pBigNum);
+    if (RT_SUCCESS(rc))
+        rc = RTBigNumNegateThis(pResult);
+    return rc;
+}
+
+
+/**
+ * Multiplies the magnitudes of two values, letting the caller care about the
+ * sign bit.
+ *
+ * @returns IPRT status code.
+ * @param   pResult         Where to store the result.
+ * @param   pMultiplicand   The first value.
+ * @param   pMultiplier     The second value.
+ */
+static int rtBigNumMagnitudeMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier)
+{
+    Assert(pResult != pMultiplicand); Assert(pResult != pMultiplier);
+    Assert(!pResult->fCurScrambled); Assert(!pMultiplicand->fCurScrambled); Assert(!pMultiplier->fCurScrambled);
+
+    /*
+     * Multiplication involving zero is zero.
+     */
+    if (!pMultiplicand->cUsed || !pMultiplier->cUsed)
+    {
+        pResult->fNegative = 0;
+        pResult->cUsed = 0;
+        return VINF_SUCCESS;
+    }
+
+    /*
+     * Allocate a result array that is the sum of the two factors, initialize
+     * it to zero.
+     */
+    uint32_t cMax = pMultiplicand->cUsed + pMultiplier->cUsed;
+    int rc = rtBigNumSetUsed(pResult, cMax);
+    if (RT_SUCCESS(rc))
+    {
+        RT_BZERO(pResult->pauElements, pResult->cUsed * RTBIGNUM_ELEMENT_SIZE);
+
+        for (uint32_t i = 0; i < pMultiplier->cUsed; i++)
+        {
+            RTBIGNUMELEMENT uMultiplier = pMultiplier->pauElements[i];
+            for (uint32_t j = 0; j < pMultiplicand->cUsed; j++)
+            {
+                RTBIGNUMELEMENT uHi;
+                RTBIGNUMELEMENT uLo;
+#if RTBIGNUM_ELEMENT_SIZE == 4
+                uint64_t u64 = ASMMult2xU32RetU64(pMultiplicand->pauElements[j], uMultiplier);
+                uLo = (uint32_t)u64;
+                uHi = u64 >> 32;
+#elif RTBIGNUM_ELEMENT_SIZE == 8
+                uLo = ASMMult2xU64Ret2xU64(pMultiplicand->pauElements[j], uMultiplier, &uHi);
+#else
+# error "Invalid RTBIGNUM_ELEMENT_SIZE value"
+#endif
+                RTBIGNUMELEMENT fCarry = 0;
+                uint64_t k = i + j;
+                pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], uLo, &fCarry);
+                k++;
+                pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], uHi, &fCarry);
+                while (fCarry)
+                {
+                    k++;
+                    pResult->pauElements[k] = rtBigNumElementAddWithCarry(pResult->pauElements[k], 0, &fCarry);
+                }
+                Assert(k < cMax);
+            }
+        }
+
+        /* It's possible we overestimated the output size by 1 element. */
+        rtBigNumStripTrailingZeros(pResult);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumMultiply(PRTBIGNUM pResult, PCRTBIGNUM pMultiplicand, PCRTBIGNUM pMultiplier)
+{
+    Assert(pResult != pMultiplicand); Assert(pResult != pMultiplier);
+    AssertReturn(pResult->fSensitive >= (pMultiplicand->fSensitive | pMultiplier->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pResult);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pMultiplicand);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pMultiplier);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * The sign values follow XOR rules:
+                 *       -1 *  1 = -1;      1 ^ 0 = 1
+                 *        1 * -1 = -1;      1 ^ 0 = 1
+                 *       -1 * -1 =  1;      1 ^ 1 = 0
+                 *        1 *  1 =  1;      0 ^ 0 = 0
+                 */
+                pResult->fNegative = pMultiplicand->fNegative ^ pMultiplier->fNegative;
+                rc = rtBigNumMagnitudeMultiply(pResult, pMultiplicand, pMultiplier);
+
+                rtBigNumScramble((PRTBIGNUM)pMultiplier);
+            }
+            rtBigNumScramble((PRTBIGNUM)pMultiplicand);
+        }
+        rtBigNumScramble(pResult);
+    }
+    return rc;
+}
+
+
+/**
+ * Copies the magnitude of on number (@a pSrc) to another (@a pBigNum).
+ *
+ * The variables must be unscrambled.  The sign flag is not considered nor
+ * touched.
+ *
+ * @returns IPRT status code.
+ * @param   pDst            The destination number.
+ * @param   pSrc            The source number.
+ */
+DECLINLINE(int) rtBigNumMagnitudeCopy(PRTBIGNUM pDst, PCRTBIGNUM pSrc)
+{
+    int rc = rtBigNumSetUsed(pDst, pSrc->cUsed);
+    if (RT_SUCCESS(rc))
+        memcpy(pDst->pauElements, pSrc->pauElements, pSrc->cUsed * RTBIGNUM_ELEMENT_SIZE);
+    return rc;
+}
+
+
+/**
+ * Clears a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @param   pBigNum         The big number.
+ * @param   iBit            The bit to clear (0-based).
+ */
+DECLINLINE(void) rtBigNumMagnitudeClearBit(PRTBIGNUM pBigNum, uint32_t iBit)
+{
+    uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+    if (iElement < pBigNum->cUsed)
+    {
+        pBigNum->pauElements[iElement] &= ~RTBIGNUM_ELEMENT_BIT(iBit);
+        if (iElement + 1 == pBigNum->cUsed && !pBigNum->pauElements[iElement])
+            rtBigNumStripTrailingZeros(pBigNum);
+    }
+}
+
+
+/**
+ * Sets a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The big number.
+ * @param   iBit            The bit to clear (0-based).
+ */
+DECLINLINE(int) rtBigNumMagnitudeSetBit(PRTBIGNUM pBigNum, uint32_t iBit)
+{
+    uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+    int rc = rtBigNumEnsureElementPresent(pBigNum, iElement);
+    if (RT_SUCCESS(rc))
+    {
+        pBigNum->pauElements[iElement] |= RTBIGNUM_ELEMENT_BIT(iBit);
+        return VINF_SUCCESS;
+    }
+    return rc;
+}
+
+
+/**
+ * Writes a bit in the magnitude of @a pBigNum.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The big number.
+ * @param   iBit            The bit to write (0-based).
+ * @param   fValue          The bit value.
+ */
+DECLINLINE(int) rtBigNumMagnitudeWriteBit(PRTBIGNUM pBigNum, uint32_t iBit, bool fValue)
+{
+    if (fValue)
+        return rtBigNumMagnitudeSetBit(pBigNum, iBit);
+    rtBigNumMagnitudeClearBit(pBigNum, iBit);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Returns the given magnitude bit.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns The bit value (1 or 0).
+ * @param   pBigNum         The big number.
+ * @param   iBit            The bit to return (0-based).
+ */
+DECLINLINE(RTBIGNUMELEMENT) rtBigNumMagnitudeGetBit(PCRTBIGNUM pBigNum, uint32_t iBit)
+{
+    uint32_t iElement = iBit / RTBIGNUM_ELEMENT_BITS;
+    if (iElement < pBigNum->cUsed)
+        return (pBigNum->pauElements[iElement] >> iBit) & 1;
+    return 0;
+}
+
+
+/**
+ * Shifts the magnitude left by one.
+ *
+ * The variables must be unscrambled.
+ *
+ * @returns IPRT status code.
+ * @param   pBigNum         The big number.
+ * @param   uCarry          The value to shift in at the bottom.
+ */
+DECLINLINE(int) rtBigNumMagnitudeShiftLeftOne(PRTBIGNUM pBigNum, RTBIGNUMELEMENT uCarry)
+{
+    Assert(uCarry <= 1);
+
+    /* Do the shifting. */
+    uint32_t cUsed = pBigNum->cUsed;
+    for (uint32_t i = 0; i < cUsed; i++)
+    {
+        RTBIGNUMELEMENT uTmp = pBigNum->pauElements[i];
+        pBigNum->pauElements[i] = (uTmp << 1) | uCarry;
+        uCarry = uTmp >> (RTBIGNUM_ELEMENT_BITS - 1);
+    }
+
+    /* If we still carry a bit, we need to increase the size. */
+    if (uCarry)
+    {
+        int rc = rtBigNumSetUsed(pBigNum, cUsed + 1);
+        pBigNum->pauElements[cUsed] = uCarry;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Divides the magnitudes of two values, letting the caller care about the sign
+ * bit.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched, this means the caller have to check for zero outputs.
+ *
+ * @returns IPRT status code.
+ * @param   pQuotient       Where to return the quotient.
+ * @param   pRemainder      Where to return the reminder.
+ * @param   pDividend       What to divide.
+ * @param   pDivisor        What to divide by.
+ */
+static int rtBigNumMagnitudeDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+    Assert(pQuotient != pDividend); Assert(pQuotient != pDivisor); Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor); Assert(pRemainder != pQuotient);
+    Assert(!pQuotient->fCurScrambled); Assert(!pRemainder->fCurScrambled); Assert(!pDividend->fCurScrambled); Assert(!pDivisor->fCurScrambled);
+
+    /*
+     * Just set both output values to zero as that's the return for several
+     * special case and the initial state of the general case.
+     */
+    pQuotient->cUsed = 0;
+    pRemainder->cUsed = 0;
+
+    /*
+     * Dividing something by zero is undefined.
+     * Diving zero by something is zero, unless the divsor is also zero.
+     */
+    if (!pDivisor->cUsed || !pDividend->cUsed)
+        return pDivisor->cUsed ? VINF_SUCCESS : VERR_BIGNUM_DIV_BY_ZERO;
+
+    /*
+     * Dividing by one? Quotient = dividend, no remainder.
+     */
+    if (pDivisor->cUsed == 1 && pDivisor->pauElements[0] == 1)
+        return rtBigNumMagnitudeCopy(pQuotient, pDividend);
+
+    /*
+     * Dividend smaller than the divisor. Zero quotient, all divisor.
+     */
+    int iDiff = rtBigNumMagnitudeCompare(pDividend, pDivisor);
+    if (iDiff < 0)
+        return rtBigNumMagnitudeCopy(pRemainder, pDividend);
+
+    /*
+     * Since we already have done the compare, check if the two values are the
+     * same.  The result is 1 and no remainder then.
+     */
+    if (iDiff == 0)
+    {
+        int rc = rtBigNumSetUsed(pQuotient, 1);
+        if (RT_SUCCESS(rc))
+            pQuotient->pauElements[0] = 1;
+        return rc;
+    }
+
+    /*
+     * Do very simple long division.  This ain't fast, but it does the trick.
+     */
+    int rc = VINF_SUCCESS;
+    uint32_t iBit = rtBigNumMagnitudeBitWidth(pDividend);
+    while (iBit-- > 0)
+    {
+        rc = rtBigNumMagnitudeShiftLeftOne(pRemainder, rtBigNumMagnitudeGetBit(pDividend, iBit));
+        AssertRCBreak(rc);
+        iDiff = rtBigNumMagnitudeCompare(pRemainder, pDivisor);
+        if (iDiff >= 0)
+        {
+            if (iDiff != 0)
+                rtBigNumMagnitudeSubThis(pRemainder, pDivisor);
+            else
+                pRemainder->cUsed = 0;
+            rc = rtBigNumMagnitudeSetBit(pQuotient, iBit);
+            AssertRCBreak(rc);
+        }
+    }
+
+    /* This shouldn't be necessary. */
+    rtBigNumStripTrailingZeros(pQuotient);
+    rtBigNumStripTrailingZeros(pRemainder);
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumDivide(PRTBIGNUM pQuotient, PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+    Assert(pQuotient != pDividend); Assert(pQuotient != pDivisor); Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor); Assert(pRemainder != pQuotient);
+    AssertReturn(pQuotient->fSensitive  >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+    AssertReturn(pRemainder->fSensitive >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pQuotient);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble(pRemainder);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pDividend);
+            if (RT_SUCCESS(rc))
+            {
+                rc = rtBigNumUnscramble((PRTBIGNUM)pDivisor);
+                if (RT_SUCCESS(rc))
+                {
+                    /*
+                     * The sign value of the remainder is the same as the dividend.
+                     * The sign values of the quotient follow XOR rules, just like multiplication:
+                     *       -3 /  2 = -1; r=-1;    1 ^ 0 = 1
+                     *        3 / -2 = -1; r= 1;    1 ^ 0 = 1
+                     *       -3 / -2 =  1; r=-1;    1 ^ 1 = 0
+                     *        3 /  2 =  1; r= 1;    0 ^ 0 = 0
+                     */
+                    pQuotient->fNegative  = pDividend->fNegative ^ pDivisor->fNegative;
+                    pRemainder->fNegative = pDividend->fNegative;
+
+                    rc = rtBigNumMagnitudeDivide(pQuotient, pRemainder, pDividend, pDivisor);
+
+                    if (pQuotient->cUsed == 0)
+                        pQuotient->fNegative = 0;
+                    if (pRemainder->cUsed == 0)
+                        pRemainder->fNegative = 0;
+
+                    rtBigNumScramble((PRTBIGNUM)pDivisor);
+                }
+                rtBigNumScramble((PRTBIGNUM)pDividend);
+            }
+            rtBigNumScramble(pRemainder);
+        }
+        rtBigNumScramble(pQuotient);
+    }
+    return rc;
+}
+
+
+/**
+ * Calculates the modulus of a magnitude value, leaving the sign bit to the
+ * caller.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched, this means the caller have to check for zero outputs.
+ *
+ * @returns IPRT status code.
+ * @param   pRemainder      Where to return the reminder.
+ * @param   pDividend       What to divide.
+ * @param   pDivisor        What to divide by.
+ */
+static int rtBigNumMagnitudeModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+    Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor);
+    Assert(!pRemainder->fCurScrambled); Assert(!pDividend->fCurScrambled); Assert(!pDivisor->fCurScrambled);
+
+    /*
+     * Just set the output value to zero as that's the return for several
+     * special case and the initial state of the general case.
+     */
+    pRemainder->cUsed = 0;
+
+    /*
+     * Dividing something by zero is undefined.
+     * Diving zero by something is zero, unless the divsor is also zero.
+     */
+    if (!pDivisor->cUsed || !pDividend->cUsed)
+        return pDivisor->cUsed ? VINF_SUCCESS : VERR_BIGNUM_DIV_BY_ZERO;
+
+    /*
+     * Dividing by one? Quotient = dividend, no remainder.
+     */
+    if (pDivisor->cUsed == 1 && pDivisor->pauElements[0] == 1)
+        return VINF_SUCCESS;
+
+    /*
+     * Dividend smaller than the divisor. Zero quotient, all divisor.
+     */
+    int iDiff = rtBigNumMagnitudeCompare(pDividend, pDivisor);
+    if (iDiff < 0)
+        return rtBigNumMagnitudeCopy(pRemainder, pDividend);
+
+    /*
+     * Since we already have done the compare, check if the two values are the
+     * same.  The result is 1 and no remainder then.
+     */
+    if (iDiff == 0)
+        return VINF_SUCCESS;
+
+    /*
+     * Do very simple long division.  This ain't fast, but it does the trick.
+     */
+    int rc = VINF_SUCCESS;
+    uint32_t iBit = rtBigNumMagnitudeBitWidth(pDividend);
+    while (iBit-- > 0)
+    {
+        rc = rtBigNumMagnitudeShiftLeftOne(pRemainder, rtBigNumMagnitudeGetBit(pDividend, iBit));
+        AssertRCBreak(rc);
+        iDiff = rtBigNumMagnitudeCompare(pRemainder, pDivisor);
+        if (iDiff >= 0)
+        {
+            if (iDiff != 0)
+                rtBigNumMagnitudeSubThis(pRemainder, pDivisor);
+            else
+                pRemainder->cUsed = 0;
+            AssertRCBreak(rc);
+        }
+    }
+
+    /* This shouldn't be necessary. */
+    rtBigNumStripTrailingZeros(pRemainder);
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumModulo(PRTBIGNUM pRemainder, PCRTBIGNUM pDividend, PCRTBIGNUM pDivisor)
+{
+     Assert(pRemainder != pDividend); Assert(pRemainder != pDivisor);
+    AssertReturn(pRemainder->fSensitive >= (pDividend->fSensitive | pDivisor->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pRemainder);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pDividend);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pDivisor);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * The sign value of the remainder is the same as the dividend.
+                 */
+                pRemainder->fNegative = pDividend->fNegative;
+
+                rc = rtBigNumMagnitudeModulo(pRemainder, pDividend, pDivisor);
+
+                if (pRemainder->cUsed == 0)
+                    pRemainder->fNegative = 0;
+
+                rtBigNumScramble((PRTBIGNUM)pDivisor);
+            }
+            rtBigNumScramble((PRTBIGNUM)pDividend);
+        }
+        rtBigNumScramble(pRemainder);
+    }
+    return rc;
+}
+
+
+
+/**
+ * Exponentiate the magnitude.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched, this means the caller have to reject negative exponents.
+ *
+ * @returns IPRT status code.
+ * @param   pResult             Where to return power.
+ * @param   pBase               The base value.
+ * @param   pExponent           The exponent (assumed positive or zero).
+ */
+static int rtBigNumMagnitudeExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent)
+{
+    Assert(pResult != pBase); Assert(pResult != pExponent);
+    Assert(!pResult->fCurScrambled); Assert(!pBase->fCurScrambled); Assert(!pExponent->fCurScrambled);
+
+    /*
+     * A couple of special cases.
+     */
+    int rc;
+    /* base ^ 0 => 1. */
+    if (pExponent->cUsed == 0)
+    {
+        rc = rtBigNumSetUsed(pResult, 1);
+        if (RT_SUCCESS(rc))
+            pResult->pauElements[0] = 1;
+        return rc;
+    }
+
+    /* base ^ 1 => base. */
+    if (pExponent->cUsed == 1 && pExponent->pauElements[0] == 1)
+        return rtBigNumMagnitudeCopy(pResult, pBase);
+
+    /*
+     * Set up.
+     */
+    /* Init temporary power-of-two variable to base. */
+    RTBIGNUM Pow2;
+    rc = rtBigNumCloneInternal(&Pow2, pBase);
+    if (RT_SUCCESS(rc))
+    {
+        /* Init result to 1. */
+        rc = rtBigNumSetUsed(pResult, 1);
+        if (RT_SUCCESS(rc))
+        {
+            pResult->pauElements[0] = 1;
+
+            /* Make a temporary variable that we can use for temporary storage of the result. */
+            RTBIGNUM TmpMultiplicand;
+            rc = rtBigNumCloneInternal(&TmpMultiplicand, pResult);
+            if (RT_SUCCESS(rc))
+            {
+                /*
+                 * Exponentiation by squaring.  Reduces the number of
+                 * multiplications to: NumBitsSet(Exponent) + BitWidth(Exponent).
+                 */
+                uint32_t const  cExpBits = rtBigNumMagnitudeBitWidth(pExponent);
+                uint32_t        iBit = 0;
+                for (;;)
+                {
+                    if (rtBigNumMagnitudeGetBit(pExponent, iBit) != 0)
+                    {
+                        rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, pResult);
+                        if (RT_SUCCESS(rc))
+                            rc = rtBigNumMagnitudeMultiply(pResult, &TmpMultiplicand, &Pow2);
+                        if (RT_FAILURE(rc))
+                            break;
+                    }
+
+                    /* Done? */
+                    iBit++;
+                    if (iBit >= cExpBits)
+                        break;
+
+                    /* Not done yet, square the base again. */
+                    rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, &Pow2);
+                    if (RT_SUCCESS(rc))
+                        rc = rtBigNumMagnitudeMultiply(&Pow2, &TmpMultiplicand, &TmpMultiplicand);
+                    if (RT_FAILURE(rc))
+                        break;
+                }
+            }
+        }
+        RTBigNumDestroy(&Pow2);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumExponentiate(PRTBIGNUM pResult, PCRTBIGNUM pBase, PCRTBIGNUM pExponent)
+{
+    Assert(pResult != pBase); Assert(pResult != pExponent);
+    AssertReturn(pResult->fSensitive >= (pBase->fSensitive | pExponent->fSensitive), VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pResult);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pBase);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pExponent);
+            if (RT_SUCCESS(rc))
+            {
+                if (!pExponent->fNegative)
+                {
+                    pResult->fNegative = pBase->fNegative; /* sign unchanged. */
+                    rc = rtBigNumMagnitudeExponentiate(pResult, pBase, pExponent);
+                }
+                else
+                    rc = VERR_BIGNUM_NEGATIVE_EXPONENT;
+
+                rtBigNumScramble((PRTBIGNUM)pExponent);
+            }
+            rtBigNumScramble((PRTBIGNUM)pBase);
+        }
+        rtBigNumScramble(pResult);
+    }
+    return rc;
+}
+
+
+/**
+ * Modular exponentiation, magnitudes only.
+ *
+ * All variables must be unscrambled.  The sign flag is not considered nor
+ * touched, this means the caller have to reject negative exponents and do any
+ * other necessary sign bit fiddling.
+ *
+ * @returns IPRT status code.
+ * @param   pResult             Where to return the remainder of the power.
+ * @param   pBase               The base value.
+ * @param   pExponent           The exponent (assumed positive or zero).
+ * @param   pModulus            The modulus value (or divisor if you like).
+ */
+static int rtBigNumMagnitudeModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus)
+{
+    Assert(pResult != pBase); Assert(pResult != pBase); Assert(pResult != pExponent); Assert(pResult != pModulus);
+    Assert(!pResult->fCurScrambled); Assert(!pBase->fCurScrambled); Assert(!pExponent->fCurScrambled); Assert(!pModulus->fCurScrambled);
+    int rc;
+
+    /*
+     * Check some special cases to get them out of the way.
+     */
+    /* Div by 0 => invalid. */
+    if (pModulus->cUsed == 0)
+        return VERR_BIGNUM_DIV_BY_ZERO;
+
+    /* Div by 1 => no remainder. */
+    if (pModulus->cUsed == 1 && pModulus->pauElements[0] == 1)
+    {
+        pResult->cUsed = 0;
+        return VINF_SUCCESS;
+    }
+
+    /* base ^ 0 => 1. */
+    if (pExponent->cUsed == 0)
+    {
+        rc = rtBigNumSetUsed(pResult, 1);
+        if (RT_SUCCESS(rc))
+            pResult->pauElements[0] = 1;
+        return rc;
+    }
+
+    /* base ^ 1 => base. */
+    if (pExponent->cUsed == 1 && pExponent->pauElements[0] == 1)
+        return rtBigNumMagnitudeModulo(pResult, pBase, pModulus);
+
+    /*
+     * Set up.
+     */
+    /* Result = 1; preallocate space for the result while at it. */
+    rc = rtBigNumSetUsed(pResult, pModulus->cUsed + 1);
+    if (RT_SUCCESS(rc))
+        rc = rtBigNumSetUsed(pResult, 1);
+    if (RT_SUCCESS(rc))
+    {
+        pResult->pauElements[0] = 1;
+
+        /* ModBase = pBase or pBase % pModulus depending on the difference in size. */
+        RTBIGNUM Pow2;
+        if (pBase->cUsed <= pModulus->cUsed + pModulus->cUsed / 2)
+            rc = rtBigNumCloneInternal(&Pow2, pBase);
+        else
+            rc = rtBigNumMagnitudeModulo(rtBigNumInitZeroTemplate(&Pow2, pBase), pBase, pModulus);
+
+        /* Need a couple of temporary variables. */
+        RTBIGNUM TmpMultiplicand;
+        rtBigNumInitZeroTemplate(&TmpMultiplicand, pResult);
+
+        RTBIGNUM TmpProduct;
+        rtBigNumInitZeroTemplate(&TmpProduct, pResult);
+
+        /*
+         * We combine the exponentiation by squaring with the fact that:
+         *      (a*b) mod n = ( (a mod n) * (b mod n) ) mod n
+         *
+         * Thus, we can reduce the size of intermediate results by mod'ing them
+         * in each step.
+         */
+        uint32_t const  cExpBits = rtBigNumMagnitudeBitWidth(pExponent);
+        uint32_t        iBit = 0;
+        for (;;)
+        {
+            if (rtBigNumMagnitudeGetBit(pExponent, iBit) != 0)
+            {
+                rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, pResult);
+                if (RT_SUCCESS(rc))
+                    rc = rtBigNumMagnitudeMultiply(&TmpProduct, &TmpMultiplicand, &Pow2);
+                if (RT_SUCCESS(rc))
+                    rc = rtBigNumMagnitudeModulo(pResult, &TmpProduct, pModulus);
+                if (RT_FAILURE(rc))
+                    break;
+            }
+
+            /* Done? */
+            iBit++;
+            if (iBit >= cExpBits)
+                break;
+
+            /* Not done yet, square and mod the base again. */
+            rc = rtBigNumMagnitudeCopy(&TmpMultiplicand, &Pow2);
+            if (RT_SUCCESS(rc))
+                rc = rtBigNumMagnitudeMultiply(&TmpProduct, &TmpMultiplicand, &TmpMultiplicand);
+            if (RT_SUCCESS(rc))
+                rc = rtBigNumMagnitudeModulo(&Pow2, &TmpProduct, pModulus);
+            if (RT_FAILURE(rc))
+                break;
+        }
+
+        RTBigNumDestroy(&TmpMultiplicand);
+        RTBigNumDestroy(&TmpProduct);
+        RTBigNumDestroy(&Pow2);
+    }
+    return rc;
+}
+
+
+RTDECL(int) RTBigNumModExp(PRTBIGNUM pResult, PRTBIGNUM pBase, PRTBIGNUM pExponent, PRTBIGNUM pModulus)
+{
+    Assert(pResult != pBase); Assert(pResult != pBase); Assert(pResult != pExponent); Assert(pResult != pModulus);
+    AssertReturn(pResult->fSensitive >= (pBase->fSensitive | pExponent->fSensitive | pModulus->fSensitive),
+                 VERR_BIGNUM_SENSITIVE_INPUT);
+
+    int rc = rtBigNumUnscramble(pResult);
+    if (RT_SUCCESS(rc))
+    {
+        rc = rtBigNumUnscramble((PRTBIGNUM)pBase);
+        if (RT_SUCCESS(rc))
+        {
+            rc = rtBigNumUnscramble((PRTBIGNUM)pExponent);
+            if (RT_SUCCESS(rc))
+            {
+                rc = rtBigNumUnscramble((PRTBIGNUM)pModulus);
+                if (RT_SUCCESS(rc))
+                {
+                    if (!pExponent->fNegative)
+                    {
+                        pResult->fNegative = pModulus->fNegative; /* pBase ^ pExponent / pModulus; result = remainder. */
+                        rc = rtBigNumMagnitudeModExp(pResult, pBase, pExponent, pModulus);
+                    }
+                    else
+                        rc = VERR_BIGNUM_NEGATIVE_EXPONENT;
+                    rtBigNumScramble((PRTBIGNUM)pModulus);
+                }
+                rtBigNumScramble((PRTBIGNUM)pExponent);
+            }
+            rtBigNumScramble((PRTBIGNUM)pBase);
+        }
+        rtBigNumScramble(pResult);
+    }
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/common/misc/http.cpp b/src/VBox/Runtime/common/misc/http.cpp
index 52baa39..3f4be29 100644
--- a/src/VBox/Runtime/common/misc/http.cpp
+++ b/src/VBox/Runtime/common/misc/http.cpp
@@ -49,23 +49,26 @@
 *******************************************************************************/
 typedef struct RTHTTPINTERNAL
 {
-    /** magic value */
-    uint32_t u32Magic;
-    /** cURL handle */
-    CURL *pCurl;
-    long lLastResp;
+    /** Magic value. */
+    uint32_t            u32Magic;
+    /** cURL handle. */
+    CURL                *pCurl;
+    /** The last response code. */
+    long                lLastResp;
     /** custom headers */
-    struct curl_slist *pHeaders;
-    /** CA certificate for HTTPS authentication check */
-    char *pcszCAFile;
-    /** abort the current HTTP request if true */
-    bool fAbort;
+    struct curl_slist   *pHeaders;
+    /** CA certificate for HTTPS authentication check. */
+    char                *pcszCAFile;
+    /** Abort the current HTTP request if true. */
+    bool                fAbort;
+    /** The location field for 301 responses. */
+    char                *pszRedirLocation;
 } RTHTTPINTERNAL;
 typedef RTHTTPINTERNAL *PRTHTTPINTERNAL;
 
 typedef struct RTHTTPMEMCHUNK
 {
-    char *pszMem;
+    uint8_t *pu8Mem;
     size_t cb;
 } RTHTTPMEMCHUNK;
 typedef RTHTTPMEMCHUNK *PRTHTTPMEMCHUNK;
@@ -135,6 +138,9 @@ RTR3DECL(void) RTHttpDestroy(RTHTTP hHttp)
     if (pHttpInt->pcszCAFile)
         RTStrFree(pHttpInt->pcszCAFile);
 
+    if (pHttpInt->pszRedirLocation)
+        RTStrFree(pHttpInt->pszRedirLocation);
+
     RTMemFree(pHttpInt);
 
     curl_global_cleanup();
@@ -145,12 +151,12 @@ static DECLCALLBACK(size_t) rtHttpWriteData(void *pvBuf, size_t cb, size_t n, vo
     PRTHTTPMEMCHUNK pMem = (PRTHTTPMEMCHUNK)pvUser;
     size_t cbAll = cb * n;
 
-    pMem->pszMem = (char*)RTMemRealloc(pMem->pszMem, pMem->cb + cbAll + 1);
-    if (pMem->pszMem)
+    pMem->pu8Mem = (uint8_t*)RTMemRealloc(pMem->pu8Mem, pMem->cb + cbAll + 1);
+    if (pMem->pu8Mem)
     {
-        memcpy(&pMem->pszMem[pMem->cb], pvBuf, cbAll);
+        memcpy(&pMem->pu8Mem[pMem->cb], pvBuf, cbAll);
         pMem->cb += cbAll;
-        pMem->pszMem[pMem->cb] = '\0';
+        pMem->pu8Mem[pMem->cb] = '\0';
     }
     return cbAll;
 }
@@ -174,6 +180,18 @@ RTR3DECL(int) RTHttpAbort(RTHTTP hHttp)
     return VINF_SUCCESS;
 }
 
+RTR3DECL(int) RTHttpGetRedirLocation(RTHTTP hHttp, char **ppszRedirLocation)
+{
+    PRTHTTPINTERNAL pHttpInt = hHttp;
+    RTHTTP_VALID_RETURN(pHttpInt);
+
+    if (!pHttpInt->pszRedirLocation)
+        return VERR_HTTP_NOT_FOUND;
+
+    *ppszRedirLocation = RTStrDup(pHttpInt->pszRedirLocation);
+    return VINF_SUCCESS;
+}
+
 RTR3DECL(int) RTHttpUseSystemProxySettings(RTHTTP hHttp)
 {
     PRTHTTPINTERNAL pHttpInt = hHttp;
@@ -353,6 +371,12 @@ RTR3DECL(int) RTHttpSetCAFile(RTHTTP hHttp, const char *pcszCAFile)
 static int rtHttpGetCalcStatus(PRTHTTPINTERNAL pHttpInt, int rcCurl)
 {
     int rc = VERR_INTERNAL_ERROR;
+
+    if (pHttpInt->pszRedirLocation)
+    {
+        RTStrFree(pHttpInt->pszRedirLocation);
+        pHttpInt->pszRedirLocation = NULL;
+    }
     if (rcCurl == CURLE_OK)
     {
         curl_easy_getinfo(pHttpInt->pCurl, CURLINFO_RESPONSE_CODE, &pHttpInt->lLastResp);
@@ -364,6 +388,16 @@ static int rtHttpGetCalcStatus(PRTHTTPINTERNAL pHttpInt, int rcCurl)
                 /* empty response */
                 rc = VINF_SUCCESS;
                 break;
+            case 301:
+            {
+                const char *pszRedirect;
+                curl_easy_getinfo(pHttpInt->pCurl, CURLINFO_REDIRECT_URL, &pszRedirect);
+                size_t cb = strlen(pszRedirect);
+                if (cb > 0 && cb < 2048)
+                    pHttpInt->pszRedirLocation = RTStrDup(pszRedirect);
+                rc = VERR_HTTP_REDIRECTED;
+                break;
+            }
             case 400:
                 /* bad request */
                 rc = VERR_HTTP_BAD_REQUEST;
@@ -413,7 +447,7 @@ static int rtHttpGetCalcStatus(PRTHTTPINTERNAL pHttpInt, int rcCurl)
     return rc;
 }
 
-RTR3DECL(int) RTHttpGet(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
+RTR3DECL(int) rtHttpGet(RTHTTP hHttp, const char *pcszUrl, uint8_t **ppvResponse, size_t *pcb)
 {
     PRTHTTPINTERNAL pHttpInt = hHttp;
     RTHTTP_VALID_RETURN(pHttpInt);
@@ -459,12 +493,29 @@ RTR3DECL(int) RTHttpGet(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
 
     rcCurl = curl_easy_perform(pHttpInt->pCurl);
     int rc = rtHttpGetCalcStatus(pHttpInt, rcCurl);
-    *ppszResponse = chunk.pszMem;
+    *ppvResponse = chunk.pu8Mem;
+    *pcb = chunk.cb;
+
+    return rc;
+}
+
 
+RTR3DECL(int) RTHttpGetText(RTHTTP hHttp, const char *pcszUrl, char **ppszResponse)
+{
+    uint8_t *pv;
+    size_t cb;
+    int rc = rtHttpGet(hHttp, pcszUrl, &pv, &cb);
+    *ppszResponse = (char*)pv;
     return rc;
 }
 
 
+RTR3DECL(int) RTHttpGetBinary(RTHTTP hHttp, const char *pcszUrl, void **ppvResponse, size_t *pcb)
+{
+    return rtHttpGet(hHttp, pcszUrl, (uint8_t**)ppvResponse, pcb);
+}
+
+
 static size_t rtHttpWriteDataToFile(void *pvBuf, size_t cb, size_t n, void *pvUser)
 {
     size_t cbAll = cb * n;
diff --git a/src/VBox/Runtime/common/misc/once.cpp b/src/VBox/Runtime/common/misc/once.cpp
index a3b6f60..ad8fca6 100644
--- a/src/VBox/Runtime/common/misc/once.cpp
+++ b/src/VBox/Runtime/common/misc/once.cpp
@@ -33,7 +33,15 @@
 
 #include <iprt/asm.h>
 #include <iprt/assert.h>
-#include <iprt/critsect.h>
+#ifdef IN_RING3
+# include <iprt/critsect.h>
+# define RTONCE_USE_CRITSECT_FOR_TERM
+#elif defined(IN_RING0)
+# include <iprt/spinlock.h>
+# define RTONCE_USE_SPINLOCK_FOR_TERM
+#else
+# define RTONCE_NO_TERM
+#endif
 #include <iprt/err.h>
 #include <iprt/initterm.h>
 #include <iprt/semaphore.h>
@@ -43,21 +51,39 @@
 /*******************************************************************************
 *   Global Variables                                                           *
 *******************************************************************************/
-#ifdef IN_RING3
-
+#ifndef RTONCE_NO_TERM
 /** For initializing the clean-up list code. */
 static RTONCE           g_OnceCleanUp = RTONCE_INITIALIZER;
-/** Critical section protecting the clean-up list. */
+/** Lock protecting the clean-up list. */
+#ifdef RTONCE_USE_CRITSECT_FOR_TERM
 static RTCRITSECT       g_CleanUpCritSect;
+#else
+static RTSEMFASTMUTEX   g_hCleanUpLock;
+#endif
 /** The clean-up list. */
 static RTLISTANCHOR     g_CleanUpList;
 
+/** Locks the clean-up list. */
+#ifdef RTONCE_USE_CRITSECT_FOR_TERM
+# define RTONCE_CLEANUP_LOCK()      RTCritSectEnter(&g_CleanUpCritSect)
+#else
+# define RTONCE_CLEANUP_LOCK()      RTSemFastMutexRequest(g_hCleanUpLock);
+#endif
+
+/** Unlocks the clean-up list. */
+#ifdef RTONCE_USE_CRITSECT_FOR_TERM
+# define RTONCE_CLEANUP_UNLOCK()    RTCritSectLeave(&g_CleanUpCritSect);
+#else
+# define RTONCE_CLEANUP_UNLOCK()    RTSemFastMutexRelease(g_hCleanUpLock);
+#endif
+
+
 
 /** @callback_method_impl{FNRTTERMCALLBACK} */
 static DECLCALLBACK(void) rtOnceTermCallback(RTTERMREASON enmReason, int32_t iStatus, void *pvUser)
 {
     bool const fLazyCleanUpOk = RTTERMREASON_IS_LAZY_CLEANUP_OK(enmReason);
-    RTCritSectEnter(&g_CleanUpCritSect); /* Potentially dangerous. */
+    RTONCE_CLEANUP_LOCK();      /* Potentially dangerous. */
 
     PRTONCE pCur, pPrev;
     RTListForEachReverseSafe(&g_CleanUpList, pCur, pPrev, RTONCE, CleanUpNode)
@@ -86,8 +112,25 @@ static DECLCALLBACK(void) rtOnceTermCallback(RTTERMREASON enmReason, int32_t iSt
         }
     }
 
-    RTCritSectLeave(&g_CleanUpCritSect);
-    NOREF(pvUser); NOREF(enmReason); NOREF(iStatus);
+    RTONCE_CLEANUP_UNLOCK();
+
+    /*
+     * Reset our own structure and the critsect / mutex.
+     */
+    if (!fLazyCleanUpOk)
+    {
+# ifdef RTONCE_USE_CRITSECT_FOR_TERM
+        RTCritSectDelete(&g_CleanUpCritSect);
+# else
+        RTSemFastMutexDestroy(g_hCleanUpLock);
+        g_hCleanUpLock = NIL_RTSEMFASTMUTEX;
+# endif
+
+        ASMAtomicWriteS32(&g_OnceCleanUp.rc, VERR_INTERNAL_ERROR);
+        ASMAtomicWriteS32(&g_OnceCleanUp.iState, RTONCESTATE_UNINITIALIZED);
+    }
+
+    NOREF(pvUser); NOREF(iStatus);
 }
 
 
@@ -102,21 +145,28 @@ static DECLCALLBACK(int32_t) rtOnceInitCleanUp(void *pvUser)
 {
     NOREF(pvUser);
     RTListInit(&g_CleanUpList);
+# ifdef RTONCE_USE_CRITSECT_FOR_TERM
     int rc = RTCritSectInit(&g_CleanUpCritSect);
+# else
+    int rc = RTSemFastMutexCreate(&g_hCleanUpLock);
+# endif
     if (RT_SUCCESS(rc))
     {
         rc = RTTermRegisterCallback(rtOnceTermCallback, NULL);
         if (RT_SUCCESS(rc))
             return rc;
 
+# ifdef RTONCE_USE_CRITSECT_FOR_TERM
         RTCritSectDelete(&g_CleanUpCritSect);
+# else
+        RTSemFastMutexDestroy(g_hCleanUpLock);
+        g_hCleanUpLock = NIL_RTSEMFASTMUTEX;
+# endif
     }
     return rc;
 }
 
-#endif /* IN_RING3 */
-
-
+#endif /* !RTONCE_NO_TERM */
 
 /**
  * The state loop of the other threads.
@@ -261,9 +311,9 @@ RTDECL(int) RTOnceSlow(PRTONCE pOnce, PFNRTONCE pfnOnce, PFNRTONCECLEANUP pfnCle
                  || iState == RTONCESTATE_BUSY_HAVE_SEM
                  , VERR_INTERNAL_ERROR);
 
-#ifndef IN_RING3
+#ifdef RTONCE_NO_TERM
     AssertReturn(!pfnCleanUp, VERR_NOT_SUPPORTED);
-#else /* IN_RING3 */
+#else /* !RTONCE_NO_TERM */
 
     /*
      * Make sure our clean-up bits are working if needed later.
@@ -274,7 +324,7 @@ RTDECL(int) RTOnceSlow(PRTONCE pOnce, PFNRTONCE pfnOnce, PFNRTONCECLEANUP pfnCle
         if (RT_FAILURE(rc))
             return rc;
     }
-#endif /* IN_RING3 */
+#endif /* !RTONCE_NO_TERM */
 
     /*
      * Do we initialize it?
@@ -289,19 +339,21 @@ RTDECL(int) RTOnceSlow(PRTONCE pOnce, PFNRTONCE pfnOnce, PFNRTONCECLEANUP pfnCle
         rcOnce = pfnOnce(pvUser);
         ASMAtomicWriteS32(&pOnce->rc, rcOnce);
 
-#ifdef IN_RING3
+#ifndef RTONCE_NO_TERM
         /*
          * Register clean-up if requested and we were successful.
          */
         if (pfnCleanUp && RT_SUCCESS(rcOnce))
         {
-            RTCritSectEnter(&g_CleanUpCritSect);
+            RTONCE_CLEANUP_LOCK();
+
             pOnce->pfnCleanUp = pfnCleanUp;
             pOnce->pvUser     = pvUser;
             RTListAppend(&g_CleanUpList, &pOnce->CleanUpNode);
-            RTCritSectLeave(&g_CleanUpCritSect);
+
+            RTONCE_CLEANUP_UNLOCK();
         }
-#endif
+#endif /* !RTONCE_NO_TERM */
 
         /*
          * If there is a sempahore to signal, we're in for some extra work here.
@@ -366,17 +418,19 @@ RTDECL(void) RTOnceReset(PRTONCE pOnce)
               ("%d\n", iState));
     NOREF(iState);
 
-#ifdef IN_RING3
+#ifndef RTONCE_NO_TERM
     /* Unregister clean-up. */
     if (pOnce->pfnCleanUp)
     {
-        RTCritSectEnter(&g_CleanUpCritSect);
+        RTONCE_CLEANUP_LOCK();
+
         RTListNodeRemove(&pOnce->CleanUpNode);
         pOnce->pfnCleanUp = NULL;
         pOnce->pvUser     = NULL;
-        RTCritSectLeave(&g_CleanUpCritSect);
+
+        RTONCE_CLEANUP_UNLOCK();
     }
-#endif /* IN_RING3 */
+#endif /* !RTONCE_NO_TERM */
 
     /* Do the same as RTONCE_INITIALIZER does. */
     ASMAtomicWriteS32(&pOnce->rc, VERR_INTERNAL_ERROR);
diff --git a/src/VBox/Runtime/common/misc/sg.cpp b/src/VBox/Runtime/common/misc/sg.cpp
index 2866722..6629c12 100644
--- a/src/VBox/Runtime/common/misc/sg.cpp
+++ b/src/VBox/Runtime/common/misc/sg.cpp
@@ -47,12 +47,14 @@ static void *sgBufGet(PRTSGBUF pSgBuf, size_t *pcbData)
         return NULL;
     }
 
+#ifndef RDESKTOP
     AssertReleaseMsg(      pSgBuf->cbSegLeft <= 32 * _1M
                      &&    (uintptr_t)pSgBuf->pvSegCur                     >= (uintptr_t)pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg
                      &&    (uintptr_t)pSgBuf->pvSegCur + pSgBuf->cbSegLeft <= (uintptr_t)pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg + pSgBuf->paSegs[pSgBuf->idxSeg].cbSeg,
                      ("pSgBuf->idxSeg=%d pSgBuf->cSegs=%d pSgBuf->pvSegCur=%p pSgBuf->cbSegLeft=%zd pSgBuf->paSegs[%d].pvSeg=%p pSgBuf->paSegs[%d].cbSeg=%zd\n",
                       pSgBuf->idxSeg, pSgBuf->cSegs, pSgBuf->pvSegCur, pSgBuf->cbSegLeft,
                       pSgBuf->idxSeg, pSgBuf->paSegs[pSgBuf->idxSeg].pvSeg, pSgBuf->idxSeg, pSgBuf->paSegs[pSgBuf->idxSeg].cbSeg));
+#endif
 
     cbData = RT_MIN(*pcbData, pSgBuf->cbSegLeft);
     pvBuf  = pSgBuf->pvSegCur;
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm b/src/VBox/Runtime/common/misc/zero.asm
similarity index 72%
copy from src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
copy to src/VBox/Runtime/common/misc/zero.asm
index 11fdcf3..5f6b250 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
+++ b/src/VBox/Runtime/common/misc/zero.asm
@@ -1,10 +1,10 @@
-; $Id: SUPDrvA-win.asm $
+; $Id: zero.asm $
 ;; @file
-; VirtualBox Support Driver - Windows NT specific assembly parts.
+; IPRT - Zero Memory.
 ;
 
 ;
-; Copyright (C) 2006-2010 Oracle Corporation
+; Copyright (C) 2013 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -29,18 +29,17 @@
 ;*******************************************************************************
 %include "iprt/asmdefs.mac"
 
+; Putting it in the code segment/section for now.
 BEGINCODE
-%ifdef RT_ARCH_AMD64
- %define _DbgPrint DbgPrint
-%endif
-extern _DbgPrint
 
-%if 1 ; see alternative in SUPDrv-win.cpp
 ;;
-; Kind of alias for DbgPrint
-export NAME(SUPR0Printf)
-BEGINPROC SUPR0Printf
-        jmp     _DbgPrint
-ENDPROC SUPR0Printf
-%endif
+; 64KB of zero memory with various sized labels.
+;
+EXPORTEDNAME_EX g_abRTZeroPage, object
+EXPORTEDNAME_EX g_abRTZero4K, object
+EXPORTEDNAME_EX g_abRTZero8K, object
+EXPORTEDNAME_EX g_abRTZero16K, object
+EXPORTEDNAME_EX g_abRTZero32K, object
+EXPORTEDNAME_EX g_abRTZero64K, object
+        times 0x10000/(16*4) dd 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
 
diff --git a/src/VBox/Runtime/common/rand/rand.cpp b/src/VBox/Runtime/common/rand/rand.cpp
index 75637eb..c6d4582 100644
--- a/src/VBox/Runtime/common/rand/rand.cpp
+++ b/src/VBox/Runtime/common/rand/rand.cpp
@@ -80,9 +80,32 @@ static DECLCALLBACK(int) rtRandInitOnce(void *pvUser)
 }
 
 
+/**
+ * Termination counterpart to rtRandInitOnce.
+ *
+ * @returns IPRT status code.
+ * @param   pvUser          Ignored.
+ * @param   fLazyCleanUpOk  Set if we're terminating the process.
+ */
+static DECLCALLBACK(void) rtRandTermOnce(void *pvUser, bool fLazyCleanUpOk)
+{
+    if (!fLazyCleanUpOk)
+    {
+        RTRAND hRand = g_hRand;
+        g_hRand = NIL_RTRAND;
+        if (hRand != NIL_RTRAND)
+        {
+            int rc = RTRandAdvDestroy(hRand);
+            AssertRC(rc);
+        }
+    }
+    NOREF(pvUser);
+}
+
+
 RTDECL(void) RTRandBytes(void *pv, size_t cb) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     RTRandAdvBytes(g_hRand, pv, cb);
 }
 RT_EXPORT_SYMBOL(RTRandBytes);
@@ -90,7 +113,7 @@ RT_EXPORT_SYMBOL(RTRandBytes);
 
 RTDECL(uint32_t) RTRandU32Ex(uint32_t u32First, uint32_t u32Last) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvU32Ex(g_hRand, u32First, u32Last);
 }
 RT_EXPORT_SYMBOL(RTRandU32Ex);
@@ -98,7 +121,7 @@ RT_EXPORT_SYMBOL(RTRandU32Ex);
 
 RTDECL(uint32_t) RTRandU32(void) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvU32(g_hRand);
 }
 RT_EXPORT_SYMBOL(RTRandU32);
@@ -106,7 +129,7 @@ RT_EXPORT_SYMBOL(RTRandU32);
 
 RTDECL(int32_t) RTRandS32Ex(int32_t i32First, int32_t i32Last) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvS32Ex(g_hRand, i32First, i32Last);
 }
 RT_EXPORT_SYMBOL(RTRandS32Ex);
@@ -114,7 +137,7 @@ RT_EXPORT_SYMBOL(RTRandS32Ex);
 
 RTDECL(int32_t) RTRandS32(void) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvS32(g_hRand);
 }
 RT_EXPORT_SYMBOL(RTRandS32);
@@ -122,7 +145,7 @@ RT_EXPORT_SYMBOL(RTRandS32);
 
 RTDECL(uint64_t) RTRandU64Ex(uint64_t u64First, uint64_t u64Last) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvU64Ex(g_hRand, u64First, u64Last);
 }
 RT_EXPORT_SYMBOL(RTRandU64Ex);
@@ -130,7 +153,7 @@ RT_EXPORT_SYMBOL(RTRandU64Ex);
 
 RTDECL(uint64_t) RTRandU64(void) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvU64(g_hRand);
 }
 RT_EXPORT_SYMBOL(RTRandU64);
@@ -138,7 +161,7 @@ RT_EXPORT_SYMBOL(RTRandU64);
 
 RTDECL(int64_t) RTRandS64Ex(int64_t i64First, int64_t i64Last) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvS64Ex(g_hRand, i64First, i64Last);
 }
 RT_EXPORT_SYMBOL(RTRandS64Ex);
@@ -146,7 +169,7 @@ RT_EXPORT_SYMBOL(RTRandS64Ex);
 
 RTDECL(int64_t) RTRandS64(void) RT_NO_THROW
 {
-    RTOnce(&g_rtRandOnce, rtRandInitOnce, NULL);
+    RTOnceEx(&g_rtRandOnce, rtRandInitOnce, rtRandTermOnce, NULL);
     return RTRandAdvS32(g_hRand);
 }
 RT_EXPORT_SYMBOL(RTRandS64);
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
index 492f2f4..8f15551 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -37,20 +37,23 @@
 
 RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
 {
-    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
+    AssertReturn(!(fFlags & ~RTSTRPRINTHEXBYTES_F_UPPER), VERR_INVALID_PARAMETER);
     AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
     AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
     AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
     if (cb)
         AssertPtrReturn(pv, VERR_INVALID_POINTER);
 
+    static char const s_szHexDigitsLower[17] = "0123456789abcdef";
+    static char const s_szHexDigitsUpper[17] = "0123456789ABCDEF";
+    const char *pszHexDigits = !(fFlags & RTSTRPRINTHEXBYTES_F_UPPER) ? s_szHexDigitsLower : s_szHexDigitsUpper;
+
     uint8_t const *pb = (uint8_t const *)pv;
     while (cb-- > 0)
     {
-        static char const s_szHexDigits[17] = "0123456789abcdef";
         uint8_t b = *pb++;
-        *pszBuf++ = s_szHexDigits[b >> 4];
-        *pszBuf++ = s_szHexDigits[b & 0xf];
+        *pszBuf++ = pszHexDigits[b >> 4];
+        *pszBuf++ = pszHexDigits[b & 0xf];
     }
     *pszBuf = '\0';
     return VINF_SUCCESS;
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16Cat.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16Cat.cpp
index 35b6d89..4ddac2c 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16Cat.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16Cat.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16Cat.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,15 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(int) RTUtf16Cat(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    PRTUTF16 pwszDst2 = (PRTUTF16)RTUtf16End(pwszDst, cwcDst);
+    AssertReturn(pwszDst2, VERR_INVALID_PARAMETER);
+    return RTUtf16Copy(pwszDst2, cwcDst - (pwszDst2 - pwszDst), pwszSrc);
 }
+RT_EXPORT_SYMBOL(RTUtf16Cat);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp
index 35b6d89..79de535 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16CatAscii.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16CatAscii.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16CatAscii.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,15 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(int) RTUtf16CatAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    PRTUTF16 pwszDst2 = (PRTUTF16)RTUtf16End(pwszDst, cwcDst);
+    AssertReturn(pwszDst2, VERR_INVALID_PARAMETER);
+    return RTUtf16CopyAscii(pwszDst2, cwcDst - (pwszDst2 - pwszDst), pszSrc);
 }
+RT_EXPORT_SYMBOL(RTUtf16CatAscii);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp
similarity index 67%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp
index 35b6d89..2a4238b 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16CmpAscii.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16CmpAscii.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16CmpAscii.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,23 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
+#include <iprt/assert.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
+RTDECL(int) RTUtf16CmpAscii(PCRTUTF16 pwsz1, const char *psz2)
+{
+    for (;;)
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        RTUTF16         wc1  = *pwsz1++;
+        unsigned char   uch2 = *psz2++; Assert(uch2 < 0x80);
+        if (wc1 != uch2)
+            return wc1 < uch2 ? -1 : 1;
+        if (!uch2)
+            return 0;
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
 }
+RT_EXPORT_SYMBOL(RTUtf16ICmpAscii);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16Copy.cpp
similarity index 67%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16Copy.cpp
index 35b6d89..7325351 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16Copy.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16Copy.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16Copy.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,25 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(int) RTUtf16Copy(PRTUTF16 pwszDst, size_t cwcDst, PCRTUTF16 pwszSrc)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
+    size_t wcwSrc = RTUtf16Len(pwszSrc);
+    if (RT_LIKELY(wcwSrc < cwcDst))
+    {
+        memcpy(pwszDst, pwszSrc, wcwSrc + 1);
+        return VINF_SUCCESS;
+    }
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
+    if (cwcDst != 0)
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        memcpy(pwszDst, pwszSrc, cwcDst - 1);
+        pwszDst[cwcDst - 1] = '\0';
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return VERR_BUFFER_OVERFLOW;
 }
+RT_EXPORT_SYMBOL(RTUtf16Copy);
 
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp
similarity index 58%
copy from src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
copy to src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp
index 492f2f4..510dab3 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16CopyAscii.cpp
@@ -1,10 +1,10 @@
-/* $Id: RTStrPrintHexBytes.cpp $ */
+/* $Id: RTUtf16CopyAscii.cpp $ */
 /** @file
- * IPRT - RTStrPrintHexBytes.
+ * IPRT - RTUtf16CopyAscii.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,31 +28,43 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include "internal/iprt.h"
 #include <iprt/string.h>
-
-#include <iprt/assert.h>
-#include <iprt/err.h>
+#include "internal/iprt.h"
 
 
-RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
+RTDECL(int) RTUtf16CopyAscii(PRTUTF16 pwszDst, size_t cwcDst, const char *pszSrc)
 {
-    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
-    AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
-    AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
-    if (cb)
-        AssertPtrReturn(pv, VERR_INVALID_POINTER);
+    int rc;
+    size_t cchSrc = strlen(pszSrc);
+    size_t cchCopy;
+    if (RT_LIKELY(cchSrc < cwcDst))
+    {
+        rc = VINF_SUCCESS;
+        cchCopy = cchSrc;
+    }
+    else if (cwcDst != 0)
+    {
+        rc = VERR_BUFFER_OVERFLOW;
+        cchCopy = cwcDst - 1;
+    }
+    else
+        return VERR_BUFFER_OVERFLOW;
 
-    uint8_t const *pb = (uint8_t const *)pv;
-    while (cb-- > 0)
+    pwszDst[cchCopy] = '\0';
+    while (cchCopy-- > 0)
     {
-        static char const s_szHexDigits[17] = "0123456789abcdef";
-        uint8_t b = *pb++;
-        *pszBuf++ = s_szHexDigits[b >> 4];
-        *pszBuf++ = s_szHexDigits[b & 0xf];
+        unsigned char ch = pszSrc[cchCopy];
+        if (RT_LIKELY(ch < 0x80))
+            pwszDst[cchCopy] = ch;
+        else
+        {
+            AssertMsgFailed(("ch=%#x\n", ch));
+            pwszDst[cchCopy] = 0x7f;
+            if (rc == VINF_SUCCESS)
+                rc = VERR_OUT_OF_RANGE;
+        }
     }
-    *pszBuf = '\0';
-    return VINF_SUCCESS;
+    return rc;
 }
+RT_EXPORT_SYMBOL(RTUtf16CopyAscii);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16End.cpp
similarity index 67%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16End.cpp
index 35b6d89..04d8558 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16End.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16End.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16End.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,19 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(PCRTUTF16) RTUtf16End(PCRTUTF16 pwszString, size_t cwcMax)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
+    while (cwcMax-- > 0)
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        if (!*pwszString)
+            return pwszString;
+        pwszString++;
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    return NULL;
 }
+RT_EXPORT_SYMBOL(RTUtf16Cat);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp
similarity index 64%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp
index 35b6d89..2b02b34 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16ICmpAscii.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16ICmpAscii.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16ICmpAscii.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,29 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
+#include <iprt/assert.h>
+#include <iprt/ctype.h>
 
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
 
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
+RTDECL(int) RTUtf16ICmpAscii(PCRTUTF16 pwsz1, const char *psz2)
+{
+    for (;;)
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        RTUTF16         wc1  = *pwsz1++;
+        unsigned char   uch2 = *psz2++; Assert(uch2 < 0x80);
+        if (wc1 != uch2)
+        {
+            if (wc1 >= 0x80)
+                return 1;
+            if (RT_C_TO_LOWER(wc1) != RT_C_TO_LOWER(uch2))
+                return wc1 < uch2 ? -1 : 1;
+        }
+        if (!uch2)
+            return 0;
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
 }
+RT_EXPORT_SYMBOL(RTUtf16ICmpAscii);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16NLen.cpp
similarity index 66%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16NLen.cpp
index 35b6d89..3883435 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16NLen.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16NLen.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16NLen.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,16 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(size_t) RTUtf16NLen(PCRTUTF16 pwszString, size_t cwcMax)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    PCRTUTF16 pwszStart = pwszString;
+    while (cwcMax-- > 0 && pwszString != '\0')
+        pwszString++;
+    return pwszString - pwszStart;
 }
+RT_EXPORT_SYMBOL(RTUtf16NLen);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp
similarity index 67%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp
index 35b6d89..183c692 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16NLenEx.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUtf16NLenEx.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - RTUtf16NLenEx.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2008-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -24,29 +24,23 @@
  * terms and conditions of either the GPL or the CDDL or both.
  */
 
-
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
+#include <iprt/string.h>
+#include "internal/iprt.h"
 
 
-int main(int argc, char **argv)
+RTDECL(int) RTUtf16NLenEx(PCRTUTF16 pwszString, size_t cwcMax, size_t *pcwc)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
+    PCRTUTF16 pwcEnd = RTUtf16End(pwszString, cwcMax);
+    if (!pwcEnd)
     {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
+        *pcwc = cwcMax;
+        return VERR_BUFFER_OVERFLOW;
     }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    *pcwc = pwcEnd - pwszString;
+    return VINF_SUCCESS;
 }
+RT_EXPORT_SYMBOL(RTUtf16NLenEx);
 
diff --git a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp b/src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp
similarity index 66%
copy from src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
copy to src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp
index 492f2f4..8a32253 100644
--- a/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
+++ b/src/VBox/Runtime/common/string/RTUtf16PrintHexBytes.cpp
@@ -1,10 +1,10 @@
-/* $Id: RTStrPrintHexBytes.cpp $ */
+/* $Id: RTUtf16PrintHexBytes.cpp $ */
 /** @file
- * IPRT - RTStrPrintHexBytes.
+ * IPRT - RTUtf16PrintHexBytes.
  */
 
 /*
- * Copyright (C) 2009-2010 Oracle Corporation
+ * Copyright (C) 2009-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -35,24 +35,27 @@
 #include <iprt/err.h>
 
 
-RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
+RTDECL(int) RTUtf16PrintHexBytes(PRTUTF16 pwszBuf, size_t cwcBuf, void const *pv, size_t cb, uint32_t fFlags)
 {
-    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
-    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
+    AssertReturn(!(fFlags & ~RTSTRPRINTHEXBYTES_F_UPPER), VERR_INVALID_PARAMETER);
+    AssertPtrReturn(pwszBuf, VERR_INVALID_POINTER);
     AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
-    AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
+    AssertReturn(cwcBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
     if (cb)
         AssertPtrReturn(pv, VERR_INVALID_POINTER);
 
+    static char const s_szHexDigitsLower[17] = "0123456789abcdef";
+    static char const s_szHexDigitsUpper[17] = "0123456789ABCDEF";
+    const char *pszHexDigits = !(fFlags & RTSTRPRINTHEXBYTES_F_UPPER) ? s_szHexDigitsLower : s_szHexDigitsUpper;
+
     uint8_t const *pb = (uint8_t const *)pv;
     while (cb-- > 0)
     {
-        static char const s_szHexDigits[17] = "0123456789abcdef";
         uint8_t b = *pb++;
-        *pszBuf++ = s_szHexDigits[b >> 4];
-        *pszBuf++ = s_szHexDigits[b & 0xf];
+        *pwszBuf++ = pszHexDigits[b >> 4];
+        *pwszBuf++ = pszHexDigits[b & 0xf];
     }
-    *pszBuf = '\0';
+    *pwszBuf = '\0';
     return VINF_SUCCESS;
 }
 
diff --git a/src/VBox/Runtime/common/string/base64.cpp b/src/VBox/Runtime/common/string/base64.cpp
index 9626964..94b1697 100644
--- a/src/VBox/Runtime/common/string/base64.cpp
+++ b/src/VBox/Runtime/common/string/base64.cpp
@@ -34,6 +34,7 @@
 #include <iprt/assert.h>
 #include <iprt/err.h>
 #include <iprt/ctype.h>
+#include <iprt/string.h>
 #ifdef RT_STRICT
 # include <iprt/asm.h>
 #endif
@@ -108,8 +109,7 @@ static void rtBase64Sanity(void)
                    || (     u8 == BASE64_PAD
                        &&   i  == '=')
                    || (     u8 == BASE64_SPACE
-                       &&   (   RT_C_IS_SPACE(i)
-                             || (i == '\r'))) /* Carriage return is handled as a space character as well. */
+                       &&   RT_C_IS_SPACE(i))
                    || (     u8 < 64
                        &&   (unsigned)g_szValToChar[u8] == i));
         }
@@ -119,17 +119,7 @@ static void rtBase64Sanity(void)
 #endif /* RT_STRICT */
 
 
-/**
- * Calculates the decoded data size for a Base64 encoded string.
- *
- * @returns The length in bytes. -1 if the encoding is bad.
- *
- * @param   pszString           The Base64 encoded string.
- * @param   ppszEnd             If not NULL, this will point to the first char
- *                              following the Base64 encoded text block. If
- *                              NULL the entire string is assumed to be Base64.
- */
-RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
+RTDECL(ssize_t) RTBase64DecodedSizeEx(const char *pszString, size_t cchStringMax, char **ppszEnd)
 {
 #ifdef RT_STRICT
     rtBase64Sanity();
@@ -140,10 +130,10 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
      */
     uint32_t    c6Bits = 0;
     uint8_t     u8     = BASE64_INVALID;
-    unsigned    ch;
+    unsigned    ch     = 0;
     AssertCompile(sizeof(char) == sizeof(uint8_t));
 
-    while ((ch = *pszString))
+    while (cchStringMax > 0 && (ch = *pszString))
     {
         u8 = g_au8CharToVal[ch];
         if (u8 < 64)
@@ -153,6 +143,7 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
 
         /* advance */
         pszString++;
+        cchStringMax--;
     }
 
     /*
@@ -165,7 +156,8 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
         cbPad = 1;
         c6Bits++;
         pszString++;
-        while ((ch = *pszString))
+        cchStringMax--;
+        while (cchStringMax > 0 && (ch = *pszString))
         {
             u8 = g_au8CharToVal[ch];
             if (u8 != BASE64_SPACE)
@@ -176,6 +168,7 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
                 cbPad++;
             }
             pszString++;
+            cchStringMax--;
         }
         if (cbPad >= 3)
             return -1;
@@ -215,31 +208,18 @@ RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
         *ppszEnd = (char *)pszString;
     return cb;
 }
+RT_EXPORT_SYMBOL(RTBase64DecodedSizeEx);
+
+
+RTDECL(ssize_t) RTBase64DecodedSize(const char *pszString, char **ppszEnd)
+{
+    return RTBase64DecodedSizeEx(pszString, RTSTR_MAX, ppszEnd);
+}
 RT_EXPORT_SYMBOL(RTBase64DecodedSize);
 
 
-/**
- * Decodes a Base64 encoded string into the buffer supplied by the caller.
- *
- * @returns IPRT status code.
- * @retval  VERR_BUFFER_OVERFLOW if the buffer is too small. pcbActual will not
- *          be set, nor will ppszEnd.
- * @retval  VERR_INVALID_BASE64_ENCODING if the encoding is wrong.
- *
- * @param   pszString       The Base64 string. Whether the entire string or
- *                          just the start of the string is in Base64 depends
- *                          on whether ppszEnd is specified or not.
- * @param   pvData          Where to store the decoded data.
- * @param   cbData          The size of the output buffer that pvData points to.
- * @param   pcbActual       Where to store the actual number of bytes returned.
- *                          Optional.
- * @param   ppszEnd         Indicates that the string may contain other stuff
- *                          after the Base64 encoded data when not NULL. Will
- *                          be set to point to the first char that's not part of
- *                          the encoding. If NULL the entire string must be part
- *                          of the Base64 encoded data.
- */
-RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd)
+RTDECL(int) RTBase64DecodeEx(const char *pszString, size_t cchStringMax, void *pvData, size_t cbData,
+                             size_t *pcbActual, char **ppszEnd)
 {
 #ifdef RT_STRICT
     rtBase64Sanity();
@@ -250,16 +230,16 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
      */
     uint8_t     u8Trio[3] = { 0, 0, 0 }; /* shuts up gcc */
     uint8_t    *pbData    = (uint8_t *)pvData;
-    uint8_t     u8        = BASE64_INVALID;
-    unsigned    c6Bits    = 0;
     unsigned    ch;
+    uint8_t     u8;
+    unsigned    c6Bits    = 0;
     AssertCompile(sizeof(char) == sizeof(uint8_t));
 
     for (;;)
     {
         /* The first 6-bit group. */
-        while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
-            pszString++;
+        while ((u8 = g_au8CharToVal[ch = cchStringMax > 0 ? (uint8_t)*pszString : 0]) == BASE64_SPACE)
+            pszString++, cchStringMax--;
         if (u8 >= 64)
         {
             c6Bits = 0;
@@ -267,10 +247,11 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
         }
         u8Trio[0] = u8 << 2;
         pszString++;
+        cchStringMax--;
 
         /* The second 6-bit group. */
-        while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
-            pszString++;
+        while ((u8 = g_au8CharToVal[ch = cchStringMax > 0 ? (uint8_t)*pszString : 0]) == BASE64_SPACE)
+            pszString++, cchStringMax--;
         if (u8 >= 64)
         {
             c6Bits = 1;
@@ -279,10 +260,12 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
         u8Trio[0] |= u8 >> 4;
         u8Trio[1]  = u8 << 4;
         pszString++;
+        cchStringMax--;
 
         /* The third 6-bit group. */
-        while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
-            pszString++;
+        u8 = BASE64_INVALID;
+        while ((u8 = g_au8CharToVal[ch = cchStringMax > 0 ? (uint8_t)*pszString : 0]) == BASE64_SPACE)
+            pszString++, cchStringMax--;
         if (u8 >= 64)
         {
             c6Bits = 2;
@@ -291,10 +274,12 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
         u8Trio[1] |= u8 >> 2;
         u8Trio[2]  = u8 << 6;
         pszString++;
+        cchStringMax--;
 
         /* The fourth 6-bit group. */
-        while ((u8 = g_au8CharToVal[ch = *pszString]) == BASE64_SPACE)
-            pszString++;
+        u8 = BASE64_INVALID;
+        while ((u8 = g_au8CharToVal[ch = cchStringMax > 0 ? (uint8_t)*pszString : 0]) == BASE64_SPACE)
+            pszString++, cchStringMax--;
         if (u8 >= 64)
         {
             c6Bits = 3;
@@ -302,6 +287,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
         }
         u8Trio[2] |= u8;
         pszString++;
+        cchStringMax--;
 
         /* flush the trio */
         if (cbData < 3)
@@ -322,7 +308,8 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
     {
         cbPad = 1;
         pszString++;
-        while ((ch = *pszString))
+        cchStringMax--;
+        while (cchStringMax > 0 && (ch = (uint8_t)*pszString))
         {
             u8 = g_au8CharToVal[ch];
             if (u8 != BASE64_SPACE)
@@ -332,6 +319,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
                 cbPad++;
             }
             pszString++;
+            cchStringMax--;
         }
         if (cbPad >= 3)
             return VERR_INVALID_BASE64_ENCODING;
@@ -343,7 +331,7 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
      */
     if (    u8 == BASE64_INVALID
         &&  !ppszEnd
-        &&  ch)
+        &&  ch != '\0')
         return VERR_INVALID_BASE64_ENCODING;
 
     /*
@@ -399,6 +387,13 @@ RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, s
         *pcbActual = pbData - (uint8_t *)pvData;
     return VINF_SUCCESS;
 }
+RT_EXPORT_SYMBOL(RTBase64DecodeEx);
+
+
+RTDECL(int) RTBase64Decode(const char *pszString, void *pvData, size_t cbData, size_t *pcbActual, char **ppszEnd)
+{
+    return RTBase64DecodeEx(pszString, RTSTR_MAX, pvData, cbData, pcbActual, ppszEnd);
+}
 RT_EXPORT_SYMBOL(RTBase64Decode);
 
 
diff --git a/src/VBox/Runtime/common/string/strncmp.asm b/src/VBox/Runtime/common/string/strncmp.asm
new file mode 100644
index 0000000..ffd8993
--- /dev/null
+++ b/src/VBox/Runtime/common/string/strncmp.asm
@@ -0,0 +1,121 @@
+; $Id: strncmp.asm $
+;; @file
+; IPRT - No-CRT strncmp - AMD64 & X86.
+;
+
+;
+; Copyright (C) 2006-2014 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+; The contents of this file may alternatively be used under the terms
+; of the Common Development and Distribution License Version 1.0
+; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+; VirtualBox OSE distribution, in which case the provisions of the
+; CDDL are applicable instead of those of the GPL.
+;
+; You may elect to license modified versions of this file under the
+; terms and conditions of either the GPL or the CDDL or both.
+;
+
+%include "iprt/asmdefs.mac"
+
+BEGINCODE
+
+;;
+; @param    psz1   gcc: rdi  msc: rcx  x86:[esp+4]
+; @param    psz2   gcc: rsi  msc: rdx  x86:[esp+8]
+; @param    cch    gcc: rdx  msc: r8   x86:[esp+12]
+RT_NOCRT_BEGINPROC strncmp
+        ; input
+%ifdef RT_ARCH_AMD64
+ %ifdef ASM_CALL64_MSC
+  %define psz1 rcx
+  %define psz2 rdx
+  %define cch  r8
+ %else
+  %define psz1 rdi
+  %define psz2 rsi
+  %define cch  rdx
+ %endif
+%elifdef RT_ARCH_X86
+        mov     ecx, [esp + 4]
+        mov     edx, [esp + 8]
+        push    ebx
+        mov     ebx, [esp + 12+4]
+  %define psz1 ecx
+  %define psz2 edx
+  %define cch  ebx
+%else
+ %error "Unknown arch"
+%endif
+
+        ;
+        ; The loop.
+        ;
+        test    cch, cch
+        jz      .equal
+.next:
+        mov     al, [psz1]
+        mov     ah, [psz2]
+        cmp     al, ah
+        jne     .not_equal
+        test    al, al
+        jz      .equal
+        dec     cch
+        jz      .equal
+
+        mov     al, [psz1 + 1]
+        mov     ah, [psz2 + 1]
+        cmp     al, ah
+        jne     .not_equal
+        test    al, al
+        jz      .equal
+        dec     cch
+        jz      .equal
+
+        mov     al, [psz1 + 2]
+        mov     ah, [psz2 + 2]
+        cmp     al, ah
+        jne     .not_equal
+        test    al, al
+        jz      .equal
+        dec     cch
+        jz      .equal
+
+        mov     al, [psz1 + 3]
+        mov     ah, [psz2 + 3]
+        cmp     al, ah
+        jne     .not_equal
+        test    al, al
+        jz      .equal
+        dec     cch
+        jz      .equal
+
+        add     psz1, 4
+        add     psz2, 4
+        jmp     .next
+
+.equal:
+        xor     eax, eax
+%ifdef RT_ARCH_X86
+        pop     ebx
+%endif
+        ret
+
+.not_equal:
+        movzx   ecx, ah
+        and     eax, 0ffh
+        sub     eax, ecx
+%ifdef RT_ARCH_X86
+        pop     ebx
+%endif
+        ret
+ENDPROC RT_NOCRT(strncmp)
+
diff --git a/src/VBox/Runtime/common/string/unidata-flags.cpp b/src/VBox/Runtime/common/string/unidata-flags.cpp
new file mode 100644
index 0000000..5f85b8f
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-flags.cpp
@@ -0,0 +1,47008 @@
+/* $Id: unidata-flags.cpp $ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const uint8_t g_afRTUniFlags0x000000[] =
+{
+                                                     0, /* U+000000: <control>*/
+                                                     0, /* U+000001: <control>*/
+                                                     0, /* U+000002: <control>*/
+                                                     0, /* U+000003: <control>*/
+                                                     0, /* U+000004: <control>*/
+                                                     0, /* U+000005: <control>*/
+                                                     0, /* U+000006: <control>*/
+                                                     0, /* U+000007: <control>*/
+                                                     0, /* U+000008: <control>*/
+                                          RTUNI_WSPACE, /* U+000009: <control>*/
+                                          RTUNI_WSPACE, /* U+00000a: <control>*/
+                                          RTUNI_WSPACE, /* U+00000b: <control>*/
+                                          RTUNI_WSPACE, /* U+00000c: <control>*/
+                                          RTUNI_WSPACE, /* U+00000d: <control>*/
+                                                     0, /* U+00000e: <control>*/
+                                                     0, /* U+00000f: <control>*/
+                                                     0, /* U+000010: <control>*/
+                                                     0, /* U+000011: <control>*/
+                                                     0, /* U+000012: <control>*/
+                                                     0, /* U+000013: <control>*/
+                                                     0, /* U+000014: <control>*/
+                                                     0, /* U+000015: <control>*/
+                                                     0, /* U+000016: <control>*/
+                                                     0, /* U+000017: <control>*/
+                                                     0, /* U+000018: <control>*/
+                                                     0, /* U+000019: <control>*/
+                                                     0, /* U+00001a: <control>*/
+                                                     0, /* U+00001b: <control>*/
+                                                     0, /* U+00001c: <control>*/
+                                                     0, /* U+00001d: <control>*/
+                                                     0, /* U+00001e: <control>*/
+                                                     0, /* U+00001f: <control>*/
+                                          RTUNI_WSPACE, /* U+000020: SPACE*/
+                                                     0, /* U+000021: EXCLAMATION MARK*/
+                                                     0, /* U+000022: QUOTATION MARK*/
+                                                     0, /* U+000023: NUMBER SIGN*/
+                                                     0, /* U+000024: DOLLAR SIGN*/
+                                                     0, /* U+000025: PERCENT SIGN*/
+                                                     0, /* U+000026: AMPERSAND*/
+                                                     0, /* U+000027: APOSTROPHE*/
+                                                     0, /* U+000028: LEFT PARENTHESIS*/
+                                                     0, /* U+000029: RIGHT PARENTHESIS*/
+                                                     0, /* U+00002a: ASTERISK*/
+                                                     0, /* U+00002b: PLUS SIGN*/
+                                                     0, /* U+00002c: COMMA*/
+                                                     0, /* U+00002d: HYPHEN-MINUS*/
+                                                     0, /* U+00002e: FULL STOP*/
+                                                     0, /* U+00002f: SOLIDUS*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000030: DIGIT ZERO*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000031: DIGIT ONE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000032: DIGIT TWO*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000033: DIGIT THREE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000034: DIGIT FOUR*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000035: DIGIT FIVE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000036: DIGIT SIX*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000037: DIGIT SEVEN*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000038: DIGIT EIGHT*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000039: DIGIT NINE*/
+                                                     0, /* U+00003a: COLON*/
+                                                     0, /* U+00003b: SEMICOLON*/
+                                                     0, /* U+00003c: LESS-THAN SIGN*/
+                                                     0, /* U+00003d: EQUALS SIGN*/
+                                                     0, /* U+00003e: GREATER-THAN SIGN*/
+                                                     0, /* U+00003f: QUESTION MARK*/
+                                                     0, /* U+000040: COMMERCIAL AT*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000041: LATIN CAPITAL LETTER A*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000042: LATIN CAPITAL LETTER B*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000043: LATIN CAPITAL LETTER C*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000044: LATIN CAPITAL LETTER D*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000045: LATIN CAPITAL LETTER E*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000046: LATIN CAPITAL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000047: LATIN CAPITAL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000048: LATIN CAPITAL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000049: LATIN CAPITAL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004a: LATIN CAPITAL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004b: LATIN CAPITAL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004c: LATIN CAPITAL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004d: LATIN CAPITAL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004e: LATIN CAPITAL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004f: LATIN CAPITAL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000050: LATIN CAPITAL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000051: LATIN CAPITAL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000052: LATIN CAPITAL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000053: LATIN CAPITAL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000054: LATIN CAPITAL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000055: LATIN CAPITAL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000056: LATIN CAPITAL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000057: LATIN CAPITAL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000058: LATIN CAPITAL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000059: LATIN CAPITAL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00005a: LATIN CAPITAL LETTER Z*/
+                                                     0, /* U+00005b: LEFT SQUARE BRACKET*/
+                                                     0, /* U+00005c: REVERSE SOLIDUS*/
+                                                     0, /* U+00005d: RIGHT SQUARE BRACKET*/
+                                                     0, /* U+00005e: CIRCUMFLEX ACCENT*/
+                                                     0, /* U+00005f: LOW LINE*/
+                                                     0, /* U+000060: GRAVE ACCENT*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000061: LATIN SMALL LETTER A*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000062: LATIN SMALL LETTER B*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000063: LATIN SMALL LETTER C*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000064: LATIN SMALL LETTER D*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000065: LATIN SMALL LETTER E*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000066: LATIN SMALL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000067: LATIN SMALL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000068: LATIN SMALL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000069: LATIN SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006a: LATIN SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006b: LATIN SMALL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006c: LATIN SMALL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006d: LATIN SMALL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006e: LATIN SMALL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006f: LATIN SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000070: LATIN SMALL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000071: LATIN SMALL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000072: LATIN SMALL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000073: LATIN SMALL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000074: LATIN SMALL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000075: LATIN SMALL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000076: LATIN SMALL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000077: LATIN SMALL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000078: LATIN SMALL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000079: LATIN SMALL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00007a: LATIN SMALL LETTER Z*/
+                                                     0, /* U+00007b: LEFT CURLY BRACKET*/
+                                                     0, /* U+00007c: VERTICAL LINE*/
+                                                     0, /* U+00007d: RIGHT CURLY BRACKET*/
+                                                     0, /* U+00007e: TILDE*/
+                                                     0, /* U+00007f: <control>*/
+                                                     0, /* U+000080: <control>*/
+                                                     0, /* U+000081: <control>*/
+                                                     0, /* U+000082: <control>*/
+                                                     0, /* U+000083: <control>*/
+                                                     0, /* U+000084: <control>*/
+                                          RTUNI_WSPACE, /* U+000085: <control>*/
+                                                     0, /* U+000086: <control>*/
+                                                     0, /* U+000087: <control>*/
+                                                     0, /* U+000088: <control>*/
+                                                     0, /* U+000089: <control>*/
+                                                     0, /* U+00008a: <control>*/
+                                                     0, /* U+00008b: <control>*/
+                                                     0, /* U+00008c: <control>*/
+                                                     0, /* U+00008d: <control>*/
+                                                     0, /* U+00008e: <control>*/
+                                                     0, /* U+00008f: <control>*/
+                                                     0, /* U+000090: <control>*/
+                                                     0, /* U+000091: <control>*/
+                                                     0, /* U+000092: <control>*/
+                                                     0, /* U+000093: <control>*/
+                                                     0, /* U+000094: <control>*/
+                                                     0, /* U+000095: <control>*/
+                                                     0, /* U+000096: <control>*/
+                                                     0, /* U+000097: <control>*/
+                                                     0, /* U+000098: <control>*/
+                                                     0, /* U+000099: <control>*/
+                                                     0, /* U+00009a: <control>*/
+                                                     0, /* U+00009b: <control>*/
+                                                     0, /* U+00009c: <control>*/
+                                                     0, /* U+00009d: <control>*/
+                                                     0, /* U+00009e: <control>*/
+                                                     0, /* U+00009f: <control>*/
+                                          RTUNI_WSPACE, /* U+0000a0: NO-BREAK SPACE*/
+                                                     0, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+                                                     0, /* U+0000a2: CENT SIGN*/
+                                                     0, /* U+0000a3: POUND SIGN*/
+                                                     0, /* U+0000a4: CURRENCY SIGN*/
+                                                     0, /* U+0000a5: YEN SIGN*/
+                                                     0, /* U+0000a6: BROKEN BAR*/
+                                                     0, /* U+0000a7: SECTION SIGN*/
+                                                     0, /* U+0000a8: DIAERESIS*/
+                                                     0, /* U+0000a9: COPYRIGHT SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+                                                     0, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+                                                     0, /* U+0000ac: NOT SIGN*/
+                                                     0, /* U+0000ad: SOFT HYPHEN*/
+                                                     0, /* U+0000ae: REGISTERED SIGN*/
+                                                     0, /* U+0000af: MACRON*/
+                                                     0, /* U+0000b0: DEGREE SIGN*/
+                                                     0, /* U+0000b1: PLUS-MINUS SIGN*/
+                                                     0, /* U+0000b2: SUPERSCRIPT TWO*/
+                                                     0, /* U+0000b3: SUPERSCRIPT THREE*/
+                                                     0, /* U+0000b4: ACUTE ACCENT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000b5: MICRO SIGN*/
+                                                     0, /* U+0000b6: PILCROW SIGN*/
+                                                     0, /* U+0000b7: MIDDLE DOT*/
+                                                     0, /* U+0000b8: CEDILLA*/
+                                                     0, /* U+0000b9: SUPERSCRIPT ONE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+                                                     0, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+                                                     0, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+                                                     0, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+                                                     0, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+                                                     0, /* U+0000bf: INVERTED QUESTION MARK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+                                                     0, /* U+0000d7: MULTIPLICATION SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e6: LATIN SMALL LETTER AE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f0: LATIN SMALL LETTER ETH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+                                                     0, /* U+0000f7: DIVISION SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fe: LATIN SMALL LETTER THORN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000133: LATIN SMALL LIGATURE IJ*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000138: LATIN SMALL LETTER KRA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014b: LATIN SMALL LETTER ENG*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000153: LATIN SMALL LIGATURE OE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017f: LATIN SMALL LETTER LONG S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000195: LATIN SMALL LETTER HV*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a3: LATIN SMALL LETTER OI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a6: LATIN LETTER YR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+                                           RTUNI_ALPHA, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bf: LATIN LETTER WYNN*/
+                                           RTUNI_ALPHA, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+                                           RTUNI_ALPHA, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+                                           RTUNI_ALPHA, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+                                           RTUNI_ALPHA, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+                                           RTUNI_ALPHA, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+                                           RTUNI_ALPHA, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c9: LATIN SMALL LETTER LJ*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+                                           RTUNI_ALPHA, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001cc: LATIN SMALL LETTER NJ*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+                                           RTUNI_ALPHA, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f3: LATIN SMALL LETTER DZ*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021d: LATIN SMALL LETTER YOGH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000222: LATIN CAPITAL LETTER OU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000223: LATIN SMALL LETTER OU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000250: LATIN SMALL LETTER TURNED A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000251: LATIN SMALL LETTER ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000254: LATIN SMALL LETTER OPEN O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000259: LATIN SMALL LETTER SCHWA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000263: LATIN SMALL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000265: LATIN SMALL LETTER TURNED H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000269: LATIN SMALL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026e: LATIN SMALL LETTER LEZH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000275: LATIN SMALL LETTER BARRED O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000278: LATIN SMALL LETTER PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000279: LATIN SMALL LETTER TURNED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000283: LATIN SMALL LETTER ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000287: LATIN SMALL LETTER TURNED T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000289: LATIN SMALL LETTER U BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000292: LATIN SMALL LETTER EZH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+                                           RTUNI_ALPHA, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000297: LATIN LETTER STRETCHED C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b0: MODIFIER LETTER SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b2: MODIFIER LETTER SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b3: MODIFIER LETTER SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b7: MODIFIER LETTER SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+                                           RTUNI_ALPHA, /* U+0002b9: MODIFIER LETTER PRIME*/
+                                           RTUNI_ALPHA, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+                                           RTUNI_ALPHA, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+                                           RTUNI_ALPHA, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+                                           RTUNI_ALPHA, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+                                           RTUNI_ALPHA, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+                                           RTUNI_ALPHA, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+                                                     0, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+                                                     0, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+                                                     0, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+                                                     0, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+                                           RTUNI_ALPHA, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+                                           RTUNI_ALPHA, /* U+0002c7: CARON*/
+                                           RTUNI_ALPHA, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+                                           RTUNI_ALPHA, /* U+0002c9: MODIFIER LETTER MACRON*/
+                                           RTUNI_ALPHA, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+                                           RTUNI_ALPHA, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+                                           RTUNI_ALPHA, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+                                           RTUNI_ALPHA, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+                                           RTUNI_ALPHA, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+                                           RTUNI_ALPHA, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+                                           RTUNI_ALPHA, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+                                           RTUNI_ALPHA, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+                                                     0, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+                                                     0, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+                                                     0, /* U+0002d4: MODIFIER LETTER UP TACK*/
+                                                     0, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+                                                     0, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+                                                     0, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+                                                     0, /* U+0002d8: BREVE*/
+                                                     0, /* U+0002d9: DOT ABOVE*/
+                                                     0, /* U+0002da: RING ABOVE*/
+                                                     0, /* U+0002db: OGONEK*/
+                                                     0, /* U+0002dc: SMALL TILDE*/
+                                                     0, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+                                                     0, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+                                                     0, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e1: MODIFIER LETTER SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e2: MODIFIER LETTER SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e3: MODIFIER LETTER SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+                                                     0, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+                                                     0, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+                                                     0, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+                                                     0, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+                                                     0, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+                                                     0, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+                                                     0, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+                                           RTUNI_ALPHA, /* U+0002ec: MODIFIER LETTER VOICING*/
+                                                     0, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+                                           RTUNI_ALPHA, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+                                                     0, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+                                                     0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+                                                     0, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+                                                     0, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+                                                     0, /* U+0002f3: MODIFIER LETTER LOW RING*/
+                                                     0, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+                                                     0, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+                                                     0, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+                                                     0, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+                                                     0, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+                                                     0, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+                                                     0, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+                                                     0, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+                                                     0, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+                                                     0, /* U+0002fd: MODIFIER LETTER SHELF*/
+                                                     0, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+                                                     0, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+                                                     0, /* U+000300: COMBINING GRAVE ACCENT*/
+                                                     0, /* U+000301: COMBINING ACUTE ACCENT*/
+                                                     0, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+                                                     0, /* U+000303: COMBINING TILDE*/
+                                                     0, /* U+000304: COMBINING MACRON*/
+                                                     0, /* U+000305: COMBINING OVERLINE*/
+                                                     0, /* U+000306: COMBINING BREVE*/
+                                                     0, /* U+000307: COMBINING DOT ABOVE*/
+                                                     0, /* U+000308: COMBINING DIAERESIS*/
+                                                     0, /* U+000309: COMBINING HOOK ABOVE*/
+                                                     0, /* U+00030a: COMBINING RING ABOVE*/
+                                                     0, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+                                                     0, /* U+00030c: COMBINING CARON*/
+                                                     0, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+                                                     0, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+                                                     0, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+                                                     0, /* U+000310: COMBINING CANDRABINDU*/
+                                                     0, /* U+000311: COMBINING INVERTED BREVE*/
+                                                     0, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+                                                     0, /* U+000313: COMBINING COMMA ABOVE*/
+                                                     0, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+                                                     0, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+                                                     0, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+                                                     0, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+                                                     0, /* U+000318: COMBINING LEFT TACK BELOW*/
+                                                     0, /* U+000319: COMBINING RIGHT TACK BELOW*/
+                                                     0, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+                                                     0, /* U+00031b: COMBINING HORN*/
+                                                     0, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+                                                     0, /* U+00031d: COMBINING UP TACK BELOW*/
+                                                     0, /* U+00031e: COMBINING DOWN TACK BELOW*/
+                                                     0, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+                                                     0, /* U+000320: COMBINING MINUS SIGN BELOW*/
+                                                     0, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+                                                     0, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+                                                     0, /* U+000323: COMBINING DOT BELOW*/
+                                                     0, /* U+000324: COMBINING DIAERESIS BELOW*/
+                                                     0, /* U+000325: COMBINING RING BELOW*/
+                                                     0, /* U+000326: COMBINING COMMA BELOW*/
+                                                     0, /* U+000327: COMBINING CEDILLA*/
+                                                     0, /* U+000328: COMBINING OGONEK*/
+                                                     0, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+                                                     0, /* U+00032a: COMBINING BRIDGE BELOW*/
+                                                     0, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+                                                     0, /* U+00032c: COMBINING CARON BELOW*/
+                                                     0, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+                                                     0, /* U+00032e: COMBINING BREVE BELOW*/
+                                                     0, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+                                                     0, /* U+000330: COMBINING TILDE BELOW*/
+                                                     0, /* U+000331: COMBINING MACRON BELOW*/
+                                                     0, /* U+000332: COMBINING LOW LINE*/
+                                                     0, /* U+000333: COMBINING DOUBLE LOW LINE*/
+                                                     0, /* U+000334: COMBINING TILDE OVERLAY*/
+                                                     0, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+                                                     0, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+                                                     0, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+                                                     0, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+                                                     0, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+                                                     0, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+                                                     0, /* U+00033b: COMBINING SQUARE BELOW*/
+                                                     0, /* U+00033c: COMBINING SEAGULL BELOW*/
+                                                     0, /* U+00033d: COMBINING X ABOVE*/
+                                                     0, /* U+00033e: COMBINING VERTICAL TILDE*/
+                                                     0, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+                                                     0, /* U+000340: COMBINING GRAVE TONE MARK*/
+                                                     0, /* U+000341: COMBINING ACUTE TONE MARK*/
+                                                     0, /* U+000342: COMBINING GREEK PERISPOMENI*/
+                                                     0, /* U+000343: COMBINING GREEK KORONIS*/
+                                                     0, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+                                                     0, /* U+000346: COMBINING BRIDGE ABOVE*/
+                                                     0, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+                                                     0, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+                                                     0, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+                                                     0, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+                                                     0, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+                                                     0, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+                                                     0, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+                                                     0, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+                                                     0, /* U+00034f: COMBINING GRAPHEME JOINER*/
+                                                     0, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+                                                     0, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+                                                     0, /* U+000352: COMBINING FERMATA*/
+                                                     0, /* U+000353: COMBINING X BELOW*/
+                                                     0, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+                                                     0, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+                                                     0, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+                                                     0, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+                                                     0, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+                                                     0, /* U+000359: COMBINING ASTERISK BELOW*/
+                                                     0, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+                                                     0, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+                                                     0, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+                                                     0, /* U+00035d: COMBINING DOUBLE BREVE*/
+                                                     0, /* U+00035e: COMBINING DOUBLE MACRON*/
+                                                     0, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+                                                     0, /* U+000360: COMBINING DOUBLE TILDE*/
+                                                     0, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+                                                     0, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+                                                     0, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+                                                     0, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+                                                     0, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+                                                     0, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+                                                     0, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+                                                     0, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+                                                     0, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+                                                     0, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+                                                     0, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+                                                     0, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+                                                     0, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+                                                     0, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+                                                     0, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000370: GREEK CAPITAL LETTER HETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000371: GREEK SMALL LETTER HETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+                                           RTUNI_ALPHA, /* U+000374: GREEK NUMERAL SIGN*/
+                                                     0, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+                                                     0, /* U+000378: */
+                                                     0, /* U+000379: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00037a: GREEK YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+                                                     0, /* U+00037e: GREEK QUESTION MARK*/
+                                                     0, /* U+00037f: */
+                                                     0, /* U+000380: */
+                                                     0, /* U+000381: */
+                                                     0, /* U+000382: */
+                                                     0, /* U+000383: */
+                                                     0, /* U+000384: GREEK TONOS*/
+                                                     0, /* U+000385: GREEK DIALYTIKA TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+                                                     0, /* U+000387: GREEK ANO TELEIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+                                                     0, /* U+00038b: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+                                                     0, /* U+00038d: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000392: GREEK CAPITAL LETTER BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000397: GREEK CAPITAL LETTER ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000398: GREEK CAPITAL LETTER THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039c: GREEK CAPITAL LETTER MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039d: GREEK CAPITAL LETTER NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039e: GREEK CAPITAL LETTER XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+                                                     0, /* U+0003a2: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b2: GREEK SMALL LETTER BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b7: GREEK SMALL LETTER ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b8: GREEK SMALL LETTER THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bc: GREEK SMALL LETTER MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bd: GREEK SMALL LETTER NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003be: GREEK SMALL LETTER XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c0: GREEK SMALL LETTER PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c1: GREEK SMALL LETTER RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c4: GREEK SMALL LETTER TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c6: GREEK SMALL LETTER PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c7: GREEK SMALL LETTER CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c8: GREEK SMALL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d0: GREEK BETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d1: GREEK THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d5: GREEK PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d6: GREEK PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d7: GREEK KAI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003da: GREEK LETTER STIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003dc: GREEK LETTER DIGAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003de: GREEK LETTER KOPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e0: GREEK LETTER SAMPI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f0: GREEK KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f1: GREEK RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f3: GREEK LETTER YOT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+                                                     0, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f8: GREEK SMALL LETTER SHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fb: GREEK SMALL LETTER SAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000430: CYRILLIC SMALL LETTER A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000431: CYRILLIC SMALL LETTER BE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000432: CYRILLIC SMALL LETTER VE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000434: CYRILLIC SMALL LETTER DE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000435: CYRILLIC SMALL LETTER IE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000438: CYRILLIC SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043e: CYRILLIC SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000440: CYRILLIC SMALL LETTER ER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000441: CYRILLIC SMALL LETTER ES*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000442: CYRILLIC SMALL LETTER TE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000443: CYRILLIC SMALL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000444: CYRILLIC SMALL LETTER EF*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000445: CYRILLIC SMALL LETTER HA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044d: CYRILLIC SMALL LETTER E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000451: CYRILLIC SMALL LETTER IO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000457: CYRILLIC SMALL LETTER YI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000458: CYRILLIC SMALL LETTER JE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000479: CYRILLIC SMALL LETTER UK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+                                                     0, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+                                                     0, /* U+000483: COMBINING CYRILLIC TITLO*/
+                                                     0, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+                                                     0, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+                                                     0, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+                                                     0, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+                                                     0, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+                                                     0, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+                                                     0, /* U+000528: */
+                                                     0, /* U+000529: */
+                                                     0, /* U+00052a: */
+                                                     0, /* U+00052b: */
+                                                     0, /* U+00052c: */
+                                                     0, /* U+00052d: */
+                                                     0, /* U+00052e: */
+                                                     0, /* U+00052f: */
+                                                     0, /* U+000530: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+                                                     0, /* U+000557: */
+                                                     0, /* U+000558: */
+                                           RTUNI_ALPHA, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
+                                                     0, /* U+00055a: ARMENIAN APOSTROPHE*/
+                                                     0, /* U+00055b: ARMENIAN EMPHASIS MARK*/
+                                                     0, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
+                                                     0, /* U+00055d: ARMENIAN COMMA*/
+                                                     0, /* U+00055e: ARMENIAN QUESTION MARK*/
+                                                     0, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
+                                                     0, /* U+000560: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000561: ARMENIAN SMALL LETTER AYB*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000562: ARMENIAN SMALL LETTER BEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000563: ARMENIAN SMALL LETTER GIM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000564: ARMENIAN SMALL LETTER DA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000565: ARMENIAN SMALL LETTER ECH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000566: ARMENIAN SMALL LETTER ZA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000567: ARMENIAN SMALL LETTER EH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000568: ARMENIAN SMALL LETTER ET*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000569: ARMENIAN SMALL LETTER TO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056b: ARMENIAN SMALL LETTER INI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056e: ARMENIAN SMALL LETTER CA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000570: ARMENIAN SMALL LETTER HO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000571: ARMENIAN SMALL LETTER JA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000574: ARMENIAN SMALL LETTER MEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000575: ARMENIAN SMALL LETTER YI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000576: ARMENIAN SMALL LETTER NOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000577: ARMENIAN SMALL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000578: ARMENIAN SMALL LETTER VO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000579: ARMENIAN SMALL LETTER CHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057c: ARMENIAN SMALL LETTER RA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000580: ARMENIAN SMALL LETTER REH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000581: ARMENIAN SMALL LETTER CO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000584: ARMENIAN SMALL LETTER KEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000585: ARMENIAN SMALL LETTER OH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000586: ARMENIAN SMALL LETTER FEH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000587: ARMENIAN SMALL LIGATURE ECH YIWN*/
+                                                     0, /* U+000588: */
+                                                     0, /* U+000589: ARMENIAN FULL STOP*/
+                                                     0, /* U+00058a: ARMENIAN HYPHEN*/
+                                                     0, /* U+00058b: */
+                                                     0, /* U+00058c: */
+                                                     0, /* U+00058d: */
+                                                     0, /* U+00058e: */
+                                                     0, /* U+00058f: ARMENIAN DRAM SIGN*/
+                                                     0, /* U+000590: */
+                                                     0, /* U+000591: HEBREW ACCENT ETNAHTA*/
+                                                     0, /* U+000592: HEBREW ACCENT SEGOL*/
+                                                     0, /* U+000593: HEBREW ACCENT SHALSHELET*/
+                                                     0, /* U+000594: HEBREW ACCENT ZAQEF QATAN*/
+                                                     0, /* U+000595: HEBREW ACCENT ZAQEF GADOL*/
+                                                     0, /* U+000596: HEBREW ACCENT TIPEHA*/
+                                                     0, /* U+000597: HEBREW ACCENT REVIA*/
+                                                     0, /* U+000598: HEBREW ACCENT ZARQA*/
+                                                     0, /* U+000599: HEBREW ACCENT PASHTA*/
+                                                     0, /* U+00059a: HEBREW ACCENT YETIV*/
+                                                     0, /* U+00059b: HEBREW ACCENT TEVIR*/
+                                                     0, /* U+00059c: HEBREW ACCENT GERESH*/
+                                                     0, /* U+00059d: HEBREW ACCENT GERESH MUQDAM*/
+                                                     0, /* U+00059e: HEBREW ACCENT GERSHAYIM*/
+                                                     0, /* U+00059f: HEBREW ACCENT QARNEY PARA*/
+                                                     0, /* U+0005a0: HEBREW ACCENT TELISHA GEDOLA*/
+                                                     0, /* U+0005a1: HEBREW ACCENT PAZER*/
+                                                     0, /* U+0005a2: HEBREW ACCENT ATNAH HAFUKH*/
+                                                     0, /* U+0005a3: HEBREW ACCENT MUNAH*/
+                                                     0, /* U+0005a4: HEBREW ACCENT MAHAPAKH*/
+                                                     0, /* U+0005a5: HEBREW ACCENT MERKHA*/
+                                                     0, /* U+0005a6: HEBREW ACCENT MERKHA KEFULA*/
+                                                     0, /* U+0005a7: HEBREW ACCENT DARGA*/
+                                                     0, /* U+0005a8: HEBREW ACCENT QADMA*/
+                                                     0, /* U+0005a9: HEBREW ACCENT TELISHA QETANA*/
+                                                     0, /* U+0005aa: HEBREW ACCENT YERAH BEN YOMO*/
+                                                     0, /* U+0005ab: HEBREW ACCENT OLE*/
+                                                     0, /* U+0005ac: HEBREW ACCENT ILUY*/
+                                                     0, /* U+0005ad: HEBREW ACCENT DEHI*/
+                                                     0, /* U+0005ae: HEBREW ACCENT ZINOR*/
+                                                     0, /* U+0005af: HEBREW MARK MASORA CIRCLE*/
+                                           RTUNI_ALPHA, /* U+0005b0: HEBREW POINT SHEVA*/
+                                           RTUNI_ALPHA, /* U+0005b1: HEBREW POINT HATAF SEGOL*/
+                                           RTUNI_ALPHA, /* U+0005b2: HEBREW POINT HATAF PATAH*/
+                                           RTUNI_ALPHA, /* U+0005b3: HEBREW POINT HATAF QAMATS*/
+                                           RTUNI_ALPHA, /* U+0005b4: HEBREW POINT HIRIQ*/
+                                           RTUNI_ALPHA, /* U+0005b5: HEBREW POINT TSERE*/
+                                           RTUNI_ALPHA, /* U+0005b6: HEBREW POINT SEGOL*/
+                                           RTUNI_ALPHA, /* U+0005b7: HEBREW POINT PATAH*/
+                                           RTUNI_ALPHA, /* U+0005b8: HEBREW POINT QAMATS*/
+                                           RTUNI_ALPHA, /* U+0005b9: HEBREW POINT HOLAM*/
+                                           RTUNI_ALPHA, /* U+0005ba: HEBREW POINT HOLAM HASER FOR VAV*/
+                                           RTUNI_ALPHA, /* U+0005bb: HEBREW POINT QUBUTS*/
+                                           RTUNI_ALPHA, /* U+0005bc: HEBREW POINT DAGESH OR MAPIQ*/
+                                           RTUNI_ALPHA, /* U+0005bd: HEBREW POINT METEG*/
+                                                     0, /* U+0005be: HEBREW PUNCTUATION MAQAF*/
+                                           RTUNI_ALPHA, /* U+0005bf: HEBREW POINT RAFE*/
+                                                     0, /* U+0005c0: HEBREW PUNCTUATION PASEQ*/
+                                           RTUNI_ALPHA, /* U+0005c1: HEBREW POINT SHIN DOT*/
+                                           RTUNI_ALPHA, /* U+0005c2: HEBREW POINT SIN DOT*/
+                                                     0, /* U+0005c3: HEBREW PUNCTUATION SOF PASUQ*/
+                                           RTUNI_ALPHA, /* U+0005c4: HEBREW MARK UPPER DOT*/
+                                           RTUNI_ALPHA, /* U+0005c5: HEBREW MARK LOWER DOT*/
+                                                     0, /* U+0005c6: HEBREW PUNCTUATION NUN HAFUKHA*/
+                                           RTUNI_ALPHA, /* U+0005c7: HEBREW POINT QAMATS QATAN*/
+                                                     0, /* U+0005c8: */
+                                                     0, /* U+0005c9: */
+                                                     0, /* U+0005ca: */
+                                                     0, /* U+0005cb: */
+                                                     0, /* U+0005cc: */
+                                                     0, /* U+0005cd: */
+                                                     0, /* U+0005ce: */
+                                                     0, /* U+0005cf: */
+                                           RTUNI_ALPHA, /* U+0005d0: HEBREW LETTER ALEF*/
+                                           RTUNI_ALPHA, /* U+0005d1: HEBREW LETTER BET*/
+                                           RTUNI_ALPHA, /* U+0005d2: HEBREW LETTER GIMEL*/
+                                           RTUNI_ALPHA, /* U+0005d3: HEBREW LETTER DALET*/
+                                           RTUNI_ALPHA, /* U+0005d4: HEBREW LETTER HE*/
+                                           RTUNI_ALPHA, /* U+0005d5: HEBREW LETTER VAV*/
+                                           RTUNI_ALPHA, /* U+0005d6: HEBREW LETTER ZAYIN*/
+                                           RTUNI_ALPHA, /* U+0005d7: HEBREW LETTER HET*/
+                                           RTUNI_ALPHA, /* U+0005d8: HEBREW LETTER TET*/
+                                           RTUNI_ALPHA, /* U+0005d9: HEBREW LETTER YOD*/
+                                           RTUNI_ALPHA, /* U+0005da: HEBREW LETTER FINAL KAF*/
+                                           RTUNI_ALPHA, /* U+0005db: HEBREW LETTER KAF*/
+                                           RTUNI_ALPHA, /* U+0005dc: HEBREW LETTER LAMED*/
+                                           RTUNI_ALPHA, /* U+0005dd: HEBREW LETTER FINAL MEM*/
+                                           RTUNI_ALPHA, /* U+0005de: HEBREW LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+0005df: HEBREW LETTER FINAL NUN*/
+                                           RTUNI_ALPHA, /* U+0005e0: HEBREW LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+0005e1: HEBREW LETTER SAMEKH*/
+                                           RTUNI_ALPHA, /* U+0005e2: HEBREW LETTER AYIN*/
+                                           RTUNI_ALPHA, /* U+0005e3: HEBREW LETTER FINAL PE*/
+                                           RTUNI_ALPHA, /* U+0005e4: HEBREW LETTER PE*/
+                                           RTUNI_ALPHA, /* U+0005e5: HEBREW LETTER FINAL TSADI*/
+                                           RTUNI_ALPHA, /* U+0005e6: HEBREW LETTER TSADI*/
+                                           RTUNI_ALPHA, /* U+0005e7: HEBREW LETTER QOF*/
+                                           RTUNI_ALPHA, /* U+0005e8: HEBREW LETTER RESH*/
+                                           RTUNI_ALPHA, /* U+0005e9: HEBREW LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+0005ea: HEBREW LETTER TAV*/
+                                                     0, /* U+0005eb: */
+                                                     0, /* U+0005ec: */
+                                                     0, /* U+0005ed: */
+                                                     0, /* U+0005ee: */
+                                                     0, /* U+0005ef: */
+                                           RTUNI_ALPHA, /* U+0005f0: HEBREW LIGATURE YIDDISH DOUBLE VAV*/
+                                           RTUNI_ALPHA, /* U+0005f1: HEBREW LIGATURE YIDDISH VAV YOD*/
+                                           RTUNI_ALPHA, /* U+0005f2: HEBREW LIGATURE YIDDISH DOUBLE YOD*/
+                                                     0, /* U+0005f3: HEBREW PUNCTUATION GERESH*/
+                                                     0, /* U+0005f4: HEBREW PUNCTUATION GERSHAYIM*/
+                                                     0, /* U+0005f5: */
+                                                     0, /* U+0005f6: */
+                                                     0, /* U+0005f7: */
+                                                     0, /* U+0005f8: */
+                                                     0, /* U+0005f9: */
+                                                     0, /* U+0005fa: */
+                                                     0, /* U+0005fb: */
+                                                     0, /* U+0005fc: */
+                                                     0, /* U+0005fd: */
+                                                     0, /* U+0005fe: */
+                                                     0, /* U+0005ff: */
+                                                     0, /* U+000600: ARABIC NUMBER SIGN*/
+                                                     0, /* U+000601: ARABIC SIGN SANAH*/
+                                                     0, /* U+000602: ARABIC FOOTNOTE MARKER*/
+                                                     0, /* U+000603: ARABIC SIGN SAFHA*/
+                                                     0, /* U+000604: ARABIC SIGN SAMVAT*/
+                                                     0, /* U+000605: */
+                                                     0, /* U+000606: ARABIC-INDIC CUBE ROOT*/
+                                                     0, /* U+000607: ARABIC-INDIC FOURTH ROOT*/
+                                                     0, /* U+000608: ARABIC RAY*/
+                                                     0, /* U+000609: ARABIC-INDIC PER MILLE SIGN*/
+                                                     0, /* U+00060a: ARABIC-INDIC PER TEN THOUSAND SIGN*/
+                                                     0, /* U+00060b: AFGHANI SIGN*/
+                                                     0, /* U+00060c: ARABIC COMMA*/
+                                                     0, /* U+00060d: ARABIC DATE SEPARATOR*/
+                                                     0, /* U+00060e: ARABIC POETIC VERSE SIGN*/
+                                                     0, /* U+00060f: ARABIC SIGN MISRA*/
+                                           RTUNI_ALPHA, /* U+000610: ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM*/
+                                           RTUNI_ALPHA, /* U+000611: ARABIC SIGN ALAYHE ASSALLAM*/
+                                           RTUNI_ALPHA, /* U+000612: ARABIC SIGN RAHMATULLAH ALAYHE*/
+                                           RTUNI_ALPHA, /* U+000613: ARABIC SIGN RADI ALLAHOU ANHU*/
+                                           RTUNI_ALPHA, /* U+000614: ARABIC SIGN TAKHALLUS*/
+                                           RTUNI_ALPHA, /* U+000615: ARABIC SMALL HIGH TAH*/
+                                           RTUNI_ALPHA, /* U+000616: ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH*/
+                                           RTUNI_ALPHA, /* U+000617: ARABIC SMALL HIGH ZAIN*/
+                                           RTUNI_ALPHA, /* U+000618: ARABIC SMALL FATHA*/
+                                           RTUNI_ALPHA, /* U+000619: ARABIC SMALL DAMMA*/
+                                           RTUNI_ALPHA, /* U+00061a: ARABIC SMALL KASRA*/
+                                                     0, /* U+00061b: ARABIC SEMICOLON*/
+                                                     0, /* U+00061c: ARABIC LETTER MARK*/
+                                                     0, /* U+00061d: */
+                                                     0, /* U+00061e: ARABIC TRIPLE DOT PUNCTUATION MARK*/
+                                                     0, /* U+00061f: ARABIC QUESTION MARK*/
+                                           RTUNI_ALPHA, /* U+000620: ARABIC LETTER KASHMIRI YEH*/
+                                           RTUNI_ALPHA, /* U+000621: ARABIC LETTER HAMZA*/
+                                           RTUNI_ALPHA, /* U+000622: ARABIC LETTER ALEF WITH MADDA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000623: ARABIC LETTER ALEF WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000624: ARABIC LETTER WAW WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000625: ARABIC LETTER ALEF WITH HAMZA BELOW*/
+                                           RTUNI_ALPHA, /* U+000626: ARABIC LETTER YEH WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000627: ARABIC LETTER ALEF*/
+                                           RTUNI_ALPHA, /* U+000628: ARABIC LETTER BEH*/
+                                           RTUNI_ALPHA, /* U+000629: ARABIC LETTER TEH MARBUTA*/
+                                           RTUNI_ALPHA, /* U+00062a: ARABIC LETTER TEH*/
+                                           RTUNI_ALPHA, /* U+00062b: ARABIC LETTER THEH*/
+                                           RTUNI_ALPHA, /* U+00062c: ARABIC LETTER JEEM*/
+                                           RTUNI_ALPHA, /* U+00062d: ARABIC LETTER HAH*/
+                                           RTUNI_ALPHA, /* U+00062e: ARABIC LETTER KHAH*/
+                                           RTUNI_ALPHA, /* U+00062f: ARABIC LETTER DAL*/
+                                           RTUNI_ALPHA, /* U+000630: ARABIC LETTER THAL*/
+                                           RTUNI_ALPHA, /* U+000631: ARABIC LETTER REH*/
+                                           RTUNI_ALPHA, /* U+000632: ARABIC LETTER ZAIN*/
+                                           RTUNI_ALPHA, /* U+000633: ARABIC LETTER SEEN*/
+                                           RTUNI_ALPHA, /* U+000634: ARABIC LETTER SHEEN*/
+                                           RTUNI_ALPHA, /* U+000635: ARABIC LETTER SAD*/
+                                           RTUNI_ALPHA, /* U+000636: ARABIC LETTER DAD*/
+                                           RTUNI_ALPHA, /* U+000637: ARABIC LETTER TAH*/
+                                           RTUNI_ALPHA, /* U+000638: ARABIC LETTER ZAH*/
+                                           RTUNI_ALPHA, /* U+000639: ARABIC LETTER AIN*/
+                                           RTUNI_ALPHA, /* U+00063a: ARABIC LETTER GHAIN*/
+                                           RTUNI_ALPHA, /* U+00063b: ARABIC LETTER KEHEH WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00063c: ARABIC LETTER KEHEH WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+00063d: ARABIC LETTER FARSI YEH WITH INVERTED V*/
+                                           RTUNI_ALPHA, /* U+00063e: ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00063f: ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000640: ARABIC TATWEEL*/
+                                           RTUNI_ALPHA, /* U+000641: ARABIC LETTER FEH*/
+                                           RTUNI_ALPHA, /* U+000642: ARABIC LETTER QAF*/
+                                           RTUNI_ALPHA, /* U+000643: ARABIC LETTER KAF*/
+                                           RTUNI_ALPHA, /* U+000644: ARABIC LETTER LAM*/
+                                           RTUNI_ALPHA, /* U+000645: ARABIC LETTER MEEM*/
+                                           RTUNI_ALPHA, /* U+000646: ARABIC LETTER NOON*/
+                                           RTUNI_ALPHA, /* U+000647: ARABIC LETTER HEH*/
+                                           RTUNI_ALPHA, /* U+000648: ARABIC LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+000649: ARABIC LETTER ALEF MAKSURA*/
+                                           RTUNI_ALPHA, /* U+00064a: ARABIC LETTER YEH*/
+                                           RTUNI_ALPHA, /* U+00064b: ARABIC FATHATAN*/
+                                           RTUNI_ALPHA, /* U+00064c: ARABIC DAMMATAN*/
+                                           RTUNI_ALPHA, /* U+00064d: ARABIC KASRATAN*/
+                                           RTUNI_ALPHA, /* U+00064e: ARABIC FATHA*/
+                                           RTUNI_ALPHA, /* U+00064f: ARABIC DAMMA*/
+                                           RTUNI_ALPHA, /* U+000650: ARABIC KASRA*/
+                                           RTUNI_ALPHA, /* U+000651: ARABIC SHADDA*/
+                                           RTUNI_ALPHA, /* U+000652: ARABIC SUKUN*/
+                                           RTUNI_ALPHA, /* U+000653: ARABIC MADDAH ABOVE*/
+                                           RTUNI_ALPHA, /* U+000654: ARABIC HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000655: ARABIC HAMZA BELOW*/
+                                           RTUNI_ALPHA, /* U+000656: ARABIC SUBSCRIPT ALEF*/
+                                           RTUNI_ALPHA, /* U+000657: ARABIC INVERTED DAMMA*/
+                                                     0, /* U+000658: ARABIC MARK NOON GHUNNA*/
+                                           RTUNI_ALPHA, /* U+000659: ARABIC ZWARAKAY*/
+                                           RTUNI_ALPHA, /* U+00065a: ARABIC VOWEL SIGN SMALL V ABOVE*/
+                                           RTUNI_ALPHA, /* U+00065b: ARABIC VOWEL SIGN INVERTED SMALL V ABOVE*/
+                                           RTUNI_ALPHA, /* U+00065c: ARABIC VOWEL SIGN DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+00065d: ARABIC REVERSED DAMMA*/
+                                           RTUNI_ALPHA, /* U+00065e: ARABIC FATHA WITH TWO DOTS*/
+                                           RTUNI_ALPHA, /* U+00065f: ARABIC WAVY HAMZA BELOW*/
+                                          RTUNI_DDIGIT, /* U+000660: ARABIC-INDIC DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000661: ARABIC-INDIC DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000662: ARABIC-INDIC DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000663: ARABIC-INDIC DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000664: ARABIC-INDIC DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000665: ARABIC-INDIC DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000666: ARABIC-INDIC DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000667: ARABIC-INDIC DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000668: ARABIC-INDIC DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000669: ARABIC-INDIC DIGIT NINE*/
+                                                     0, /* U+00066a: ARABIC PERCENT SIGN*/
+                                                     0, /* U+00066b: ARABIC DECIMAL SEPARATOR*/
+                                                     0, /* U+00066c: ARABIC THOUSANDS SEPARATOR*/
+                                                     0, /* U+00066d: ARABIC FIVE POINTED STAR*/
+                                           RTUNI_ALPHA, /* U+00066e: ARABIC LETTER DOTLESS BEH*/
+                                           RTUNI_ALPHA, /* U+00066f: ARABIC LETTER DOTLESS QAF*/
+                                           RTUNI_ALPHA, /* U+000670: ARABIC LETTER SUPERSCRIPT ALEF*/
+                                           RTUNI_ALPHA, /* U+000671: ARABIC LETTER ALEF WASLA*/
+                                           RTUNI_ALPHA, /* U+000672: ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000673: ARABIC LETTER ALEF WITH WAVY HAMZA BELOW*/
+                                           RTUNI_ALPHA, /* U+000674: ARABIC LETTER HIGH HAMZA*/
+                                           RTUNI_ALPHA, /* U+000675: ARABIC LETTER HIGH HAMZA ALEF*/
+                                           RTUNI_ALPHA, /* U+000676: ARABIC LETTER HIGH HAMZA WAW*/
+                                           RTUNI_ALPHA, /* U+000677: ARABIC LETTER U WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000678: ARABIC LETTER HIGH HAMZA YEH*/
+                                           RTUNI_ALPHA, /* U+000679: ARABIC LETTER TTEH*/
+                                           RTUNI_ALPHA, /* U+00067a: ARABIC LETTER TTEHEH*/
+                                           RTUNI_ALPHA, /* U+00067b: ARABIC LETTER BEEH*/
+                                           RTUNI_ALPHA, /* U+00067c: ARABIC LETTER TEH WITH RING*/
+                                           RTUNI_ALPHA, /* U+00067d: ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS*/
+                                           RTUNI_ALPHA, /* U+00067e: ARABIC LETTER PEH*/
+                                           RTUNI_ALPHA, /* U+00067f: ARABIC LETTER TEHEH*/
+                                           RTUNI_ALPHA, /* U+000680: ARABIC LETTER BEHEH*/
+                                           RTUNI_ALPHA, /* U+000681: ARABIC LETTER HAH WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000682: ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE*/
+                                           RTUNI_ALPHA, /* U+000683: ARABIC LETTER NYEH*/
+                                           RTUNI_ALPHA, /* U+000684: ARABIC LETTER DYEH*/
+                                           RTUNI_ALPHA, /* U+000685: ARABIC LETTER HAH WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000686: ARABIC LETTER TCHEH*/
+                                           RTUNI_ALPHA, /* U+000687: ARABIC LETTER TCHEHEH*/
+                                           RTUNI_ALPHA, /* U+000688: ARABIC LETTER DDAL*/
+                                           RTUNI_ALPHA, /* U+000689: ARABIC LETTER DAL WITH RING*/
+                                           RTUNI_ALPHA, /* U+00068a: ARABIC LETTER DAL WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+00068b: ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH*/
+                                           RTUNI_ALPHA, /* U+00068c: ARABIC LETTER DAHAL*/
+                                           RTUNI_ALPHA, /* U+00068d: ARABIC LETTER DDAHAL*/
+                                           RTUNI_ALPHA, /* U+00068e: ARABIC LETTER DUL*/
+                                           RTUNI_ALPHA, /* U+00068f: ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS*/
+                                           RTUNI_ALPHA, /* U+000690: ARABIC LETTER DAL WITH FOUR DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000691: ARABIC LETTER RREH*/
+                                           RTUNI_ALPHA, /* U+000692: ARABIC LETTER REH WITH SMALL V*/
+                                           RTUNI_ALPHA, /* U+000693: ARABIC LETTER REH WITH RING*/
+                                           RTUNI_ALPHA, /* U+000694: ARABIC LETTER REH WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+000695: ARABIC LETTER REH WITH SMALL V BELOW*/
+                                           RTUNI_ALPHA, /* U+000696: ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+000697: ARABIC LETTER REH WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000698: ARABIC LETTER JEH*/
+                                           RTUNI_ALPHA, /* U+000699: ARABIC LETTER REH WITH FOUR DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00069a: ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+00069b: ARABIC LETTER SEEN WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+00069c: ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00069d: ARABIC LETTER SAD WITH TWO DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+00069e: ARABIC LETTER SAD WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00069f: ARABIC LETTER TAH WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006a0: ARABIC LETTER AIN WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006a1: ARABIC LETTER DOTLESS FEH*/
+                                           RTUNI_ALPHA, /* U+0006a2: ARABIC LETTER FEH WITH DOT MOVED BELOW*/
+                                           RTUNI_ALPHA, /* U+0006a3: ARABIC LETTER FEH WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0006a4: ARABIC LETTER VEH*/
+                                           RTUNI_ALPHA, /* U+0006a5: ARABIC LETTER FEH WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+0006a6: ARABIC LETTER PEHEH*/
+                                           RTUNI_ALPHA, /* U+0006a7: ARABIC LETTER QAF WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006a8: ARABIC LETTER QAF WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006a9: ARABIC LETTER KEHEH*/
+                                           RTUNI_ALPHA, /* U+0006aa: ARABIC LETTER SWASH KAF*/
+                                           RTUNI_ALPHA, /* U+0006ab: ARABIC LETTER KAF WITH RING*/
+                                           RTUNI_ALPHA, /* U+0006ac: ARABIC LETTER KAF WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006ad: ARABIC LETTER NG*/
+                                           RTUNI_ALPHA, /* U+0006ae: ARABIC LETTER KAF WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+0006af: ARABIC LETTER GAF*/
+                                           RTUNI_ALPHA, /* U+0006b0: ARABIC LETTER GAF WITH RING*/
+                                           RTUNI_ALPHA, /* U+0006b1: ARABIC LETTER NGOEH*/
+                                           RTUNI_ALPHA, /* U+0006b2: ARABIC LETTER GAF WITH TWO DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+0006b3: ARABIC LETTER GUEH*/
+                                           RTUNI_ALPHA, /* U+0006b4: ARABIC LETTER GAF WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006b5: ARABIC LETTER LAM WITH SMALL V*/
+                                           RTUNI_ALPHA, /* U+0006b6: ARABIC LETTER LAM WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006b7: ARABIC LETTER LAM WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006b8: ARABIC LETTER LAM WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+0006b9: ARABIC LETTER NOON WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0006ba: ARABIC LETTER NOON GHUNNA*/
+                                           RTUNI_ALPHA, /* U+0006bb: ARABIC LETTER RNOON*/
+                                           RTUNI_ALPHA, /* U+0006bc: ARABIC LETTER NOON WITH RING*/
+                                           RTUNI_ALPHA, /* U+0006bd: ARABIC LETTER NOON WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006be: ARABIC LETTER HEH DOACHASHMEE*/
+                                           RTUNI_ALPHA, /* U+0006bf: ARABIC LETTER TCHEH WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006c0: ARABIC LETTER HEH WITH YEH ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006c1: ARABIC LETTER HEH GOAL*/
+                                           RTUNI_ALPHA, /* U+0006c2: ARABIC LETTER HEH GOAL WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006c3: ARABIC LETTER TEH MARBUTA GOAL*/
+                                           RTUNI_ALPHA, /* U+0006c4: ARABIC LETTER WAW WITH RING*/
+                                           RTUNI_ALPHA, /* U+0006c5: ARABIC LETTER KIRGHIZ OE*/
+                                           RTUNI_ALPHA, /* U+0006c6: ARABIC LETTER OE*/
+                                           RTUNI_ALPHA, /* U+0006c7: ARABIC LETTER U*/
+                                           RTUNI_ALPHA, /* U+0006c8: ARABIC LETTER YU*/
+                                           RTUNI_ALPHA, /* U+0006c9: ARABIC LETTER KIRGHIZ YU*/
+                                           RTUNI_ALPHA, /* U+0006ca: ARABIC LETTER WAW WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006cb: ARABIC LETTER VE*/
+                                           RTUNI_ALPHA, /* U+0006cc: ARABIC LETTER FARSI YEH*/
+                                           RTUNI_ALPHA, /* U+0006cd: ARABIC LETTER YEH WITH TAIL*/
+                                           RTUNI_ALPHA, /* U+0006ce: ARABIC LETTER YEH WITH SMALL V*/
+                                           RTUNI_ALPHA, /* U+0006cf: ARABIC LETTER WAW WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0006d0: ARABIC LETTER E*/
+                                           RTUNI_ALPHA, /* U+0006d1: ARABIC LETTER YEH WITH THREE DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+0006d2: ARABIC LETTER YEH BARREE*/
+                                           RTUNI_ALPHA, /* U+0006d3: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE*/
+                                                     0, /* U+0006d4: ARABIC FULL STOP*/
+                                           RTUNI_ALPHA, /* U+0006d5: ARABIC LETTER AE*/
+                                           RTUNI_ALPHA, /* U+0006d6: ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA*/
+                                           RTUNI_ALPHA, /* U+0006d7: ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA*/
+                                           RTUNI_ALPHA, /* U+0006d8: ARABIC SMALL HIGH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+0006d9: ARABIC SMALL HIGH LAM ALEF*/
+                                           RTUNI_ALPHA, /* U+0006da: ARABIC SMALL HIGH JEEM*/
+                                           RTUNI_ALPHA, /* U+0006db: ARABIC SMALL HIGH THREE DOTS*/
+                                           RTUNI_ALPHA, /* U+0006dc: ARABIC SMALL HIGH SEEN*/
+                                                     0, /* U+0006dd: ARABIC END OF AYAH*/
+                                                     0, /* U+0006de: ARABIC START OF RUB EL HIZB*/
+                                                     0, /* U+0006df: ARABIC SMALL HIGH ROUNDED ZERO*/
+                                                     0, /* U+0006e0: ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO*/
+                                           RTUNI_ALPHA, /* U+0006e1: ARABIC SMALL HIGH DOTLESS HEAD OF KHAH*/
+                                           RTUNI_ALPHA, /* U+0006e2: ARABIC SMALL HIGH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+0006e3: ARABIC SMALL LOW SEEN*/
+                                           RTUNI_ALPHA, /* U+0006e4: ARABIC SMALL HIGH MADDA*/
+                                           RTUNI_ALPHA, /* U+0006e5: ARABIC SMALL WAW*/
+                                           RTUNI_ALPHA, /* U+0006e6: ARABIC SMALL YEH*/
+                                           RTUNI_ALPHA, /* U+0006e7: ARABIC SMALL HIGH YEH*/
+                                           RTUNI_ALPHA, /* U+0006e8: ARABIC SMALL HIGH NOON*/
+                                                     0, /* U+0006e9: ARABIC PLACE OF SAJDAH*/
+                                                     0, /* U+0006ea: ARABIC EMPTY CENTRE LOW STOP*/
+                                                     0, /* U+0006eb: ARABIC EMPTY CENTRE HIGH STOP*/
+                                                     0, /* U+0006ec: ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE*/
+                                           RTUNI_ALPHA, /* U+0006ed: ARABIC SMALL LOW MEEM*/
+                                           RTUNI_ALPHA, /* U+0006ee: ARABIC LETTER DAL WITH INVERTED V*/
+                                           RTUNI_ALPHA, /* U+0006ef: ARABIC LETTER REH WITH INVERTED V*/
+                                          RTUNI_DDIGIT, /* U+0006f0: EXTENDED ARABIC-INDIC DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0006f1: EXTENDED ARABIC-INDIC DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0006f2: EXTENDED ARABIC-INDIC DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0006f3: EXTENDED ARABIC-INDIC DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0006f4: EXTENDED ARABIC-INDIC DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0006f5: EXTENDED ARABIC-INDIC DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0006f6: EXTENDED ARABIC-INDIC DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0006f7: EXTENDED ARABIC-INDIC DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0006f8: EXTENDED ARABIC-INDIC DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0006f9: EXTENDED ARABIC-INDIC DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+0006fa: ARABIC LETTER SHEEN WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0006fb: ARABIC LETTER DAD WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0006fc: ARABIC LETTER GHAIN WITH DOT BELOW*/
+                                                     0, /* U+0006fd: ARABIC SIGN SINDHI AMPERSAND*/
+                                                     0, /* U+0006fe: ARABIC SIGN SINDHI POSTPOSITION MEN*/
+                                           RTUNI_ALPHA, /* U+0006ff: ARABIC LETTER HEH WITH INVERTED V*/
+                                                     0, /* U+000700: SYRIAC END OF PARAGRAPH*/
+                                                     0, /* U+000701: SYRIAC SUPRALINEAR FULL STOP*/
+                                                     0, /* U+000702: SYRIAC SUBLINEAR FULL STOP*/
+                                                     0, /* U+000703: SYRIAC SUPRALINEAR COLON*/
+                                                     0, /* U+000704: SYRIAC SUBLINEAR COLON*/
+                                                     0, /* U+000705: SYRIAC HORIZONTAL COLON*/
+                                                     0, /* U+000706: SYRIAC COLON SKEWED LEFT*/
+                                                     0, /* U+000707: SYRIAC COLON SKEWED RIGHT*/
+                                                     0, /* U+000708: SYRIAC SUPRALINEAR COLON SKEWED LEFT*/
+                                                     0, /* U+000709: SYRIAC SUBLINEAR COLON SKEWED RIGHT*/
+                                                     0, /* U+00070a: SYRIAC CONTRACTION*/
+                                                     0, /* U+00070b: SYRIAC HARKLEAN OBELUS*/
+                                                     0, /* U+00070c: SYRIAC HARKLEAN METOBELUS*/
+                                                     0, /* U+00070d: SYRIAC HARKLEAN ASTERISCUS*/
+                                                     0, /* U+00070e: */
+                                                     0, /* U+00070f: SYRIAC ABBREVIATION MARK*/
+                                           RTUNI_ALPHA, /* U+000710: SYRIAC LETTER ALAPH*/
+                                           RTUNI_ALPHA, /* U+000711: SYRIAC LETTER SUPERSCRIPT ALAPH*/
+                                           RTUNI_ALPHA, /* U+000712: SYRIAC LETTER BETH*/
+                                           RTUNI_ALPHA, /* U+000713: SYRIAC LETTER GAMAL*/
+                                           RTUNI_ALPHA, /* U+000714: SYRIAC LETTER GAMAL GARSHUNI*/
+                                           RTUNI_ALPHA, /* U+000715: SYRIAC LETTER DALATH*/
+                                           RTUNI_ALPHA, /* U+000716: SYRIAC LETTER DOTLESS DALATH RISH*/
+                                           RTUNI_ALPHA, /* U+000717: SYRIAC LETTER HE*/
+                                           RTUNI_ALPHA, /* U+000718: SYRIAC LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+000719: SYRIAC LETTER ZAIN*/
+                                           RTUNI_ALPHA, /* U+00071a: SYRIAC LETTER HETH*/
+                                           RTUNI_ALPHA, /* U+00071b: SYRIAC LETTER TETH*/
+                                           RTUNI_ALPHA, /* U+00071c: SYRIAC LETTER TETH GARSHUNI*/
+                                           RTUNI_ALPHA, /* U+00071d: SYRIAC LETTER YUDH*/
+                                           RTUNI_ALPHA, /* U+00071e: SYRIAC LETTER YUDH HE*/
+                                           RTUNI_ALPHA, /* U+00071f: SYRIAC LETTER KAPH*/
+                                           RTUNI_ALPHA, /* U+000720: SYRIAC LETTER LAMADH*/
+                                           RTUNI_ALPHA, /* U+000721: SYRIAC LETTER MIM*/
+                                           RTUNI_ALPHA, /* U+000722: SYRIAC LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+000723: SYRIAC LETTER SEMKATH*/
+                                           RTUNI_ALPHA, /* U+000724: SYRIAC LETTER FINAL SEMKATH*/
+                                           RTUNI_ALPHA, /* U+000725: SYRIAC LETTER E*/
+                                           RTUNI_ALPHA, /* U+000726: SYRIAC LETTER PE*/
+                                           RTUNI_ALPHA, /* U+000727: SYRIAC LETTER REVERSED PE*/
+                                           RTUNI_ALPHA, /* U+000728: SYRIAC LETTER SADHE*/
+                                           RTUNI_ALPHA, /* U+000729: SYRIAC LETTER QAPH*/
+                                           RTUNI_ALPHA, /* U+00072a: SYRIAC LETTER RISH*/
+                                           RTUNI_ALPHA, /* U+00072b: SYRIAC LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+00072c: SYRIAC LETTER TAW*/
+                                           RTUNI_ALPHA, /* U+00072d: SYRIAC LETTER PERSIAN BHETH*/
+                                           RTUNI_ALPHA, /* U+00072e: SYRIAC LETTER PERSIAN GHAMAL*/
+                                           RTUNI_ALPHA, /* U+00072f: SYRIAC LETTER PERSIAN DHALATH*/
+                                           RTUNI_ALPHA, /* U+000730: SYRIAC PTHAHA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000731: SYRIAC PTHAHA BELOW*/
+                                           RTUNI_ALPHA, /* U+000732: SYRIAC PTHAHA DOTTED*/
+                                           RTUNI_ALPHA, /* U+000733: SYRIAC ZQAPHA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000734: SYRIAC ZQAPHA BELOW*/
+                                           RTUNI_ALPHA, /* U+000735: SYRIAC ZQAPHA DOTTED*/
+                                           RTUNI_ALPHA, /* U+000736: SYRIAC RBASA ABOVE*/
+                                           RTUNI_ALPHA, /* U+000737: SYRIAC RBASA BELOW*/
+                                           RTUNI_ALPHA, /* U+000738: SYRIAC DOTTED ZLAMA HORIZONTAL*/
+                                           RTUNI_ALPHA, /* U+000739: SYRIAC DOTTED ZLAMA ANGULAR*/
+                                           RTUNI_ALPHA, /* U+00073a: SYRIAC HBASA ABOVE*/
+                                           RTUNI_ALPHA, /* U+00073b: SYRIAC HBASA BELOW*/
+                                           RTUNI_ALPHA, /* U+00073c: SYRIAC HBASA-ESASA DOTTED*/
+                                           RTUNI_ALPHA, /* U+00073d: SYRIAC ESASA ABOVE*/
+                                           RTUNI_ALPHA, /* U+00073e: SYRIAC ESASA BELOW*/
+                                           RTUNI_ALPHA, /* U+00073f: SYRIAC RWAHA*/
+                                                     0, /* U+000740: SYRIAC FEMININE DOT*/
+                                                     0, /* U+000741: SYRIAC QUSHSHAYA*/
+                                                     0, /* U+000742: SYRIAC RUKKAKHA*/
+                                                     0, /* U+000743: SYRIAC TWO VERTICAL DOTS ABOVE*/
+                                                     0, /* U+000744: SYRIAC TWO VERTICAL DOTS BELOW*/
+                                                     0, /* U+000745: SYRIAC THREE DOTS ABOVE*/
+                                                     0, /* U+000746: SYRIAC THREE DOTS BELOW*/
+                                                     0, /* U+000747: SYRIAC OBLIQUE LINE ABOVE*/
+                                                     0, /* U+000748: SYRIAC OBLIQUE LINE BELOW*/
+                                                     0, /* U+000749: SYRIAC MUSIC*/
+                                                     0, /* U+00074a: SYRIAC BARREKH*/
+                                                     0, /* U+00074b: */
+                                                     0, /* U+00074c: */
+                                           RTUNI_ALPHA, /* U+00074d: SYRIAC LETTER SOGDIAN ZHAIN*/
+                                           RTUNI_ALPHA, /* U+00074e: SYRIAC LETTER SOGDIAN KHAPH*/
+                                           RTUNI_ALPHA, /* U+00074f: SYRIAC LETTER SOGDIAN FE*/
+                                           RTUNI_ALPHA, /* U+000750: ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW*/
+                                           RTUNI_ALPHA, /* U+000751: ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000752: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+                                           RTUNI_ALPHA, /* U+000753: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000754: ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+000755: ARABIC LETTER BEH WITH INVERTED SMALL V BELOW*/
+                                           RTUNI_ALPHA, /* U+000756: ARABIC LETTER BEH WITH SMALL V*/
+                                           RTUNI_ALPHA, /* U+000757: ARABIC LETTER HAH WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000758: ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW*/
+                                           RTUNI_ALPHA, /* U+000759: ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH*/
+                                           RTUNI_ALPHA, /* U+00075a: ARABIC LETTER DAL WITH INVERTED SMALL V BELOW*/
+                                           RTUNI_ALPHA, /* U+00075b: ARABIC LETTER REH WITH STROKE*/
+                                           RTUNI_ALPHA, /* U+00075c: ARABIC LETTER SEEN WITH FOUR DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00075d: ARABIC LETTER AIN WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00075e: ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE*/
+                                           RTUNI_ALPHA, /* U+00075f: ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE*/
+                                           RTUNI_ALPHA, /* U+000760: ARABIC LETTER FEH WITH TWO DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+000761: ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+                                           RTUNI_ALPHA, /* U+000762: ARABIC LETTER KEHEH WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+000763: ARABIC LETTER KEHEH WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000764: ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW*/
+                                           RTUNI_ALPHA, /* U+000765: ARABIC LETTER MEEM WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+000766: ARABIC LETTER MEEM WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+000767: ARABIC LETTER NOON WITH TWO DOTS BELOW*/
+                                           RTUNI_ALPHA, /* U+000768: ARABIC LETTER NOON WITH SMALL TAH*/
+                                           RTUNI_ALPHA, /* U+000769: ARABIC LETTER NOON WITH SMALL V*/
+                                           RTUNI_ALPHA, /* U+00076a: ARABIC LETTER LAM WITH BAR*/
+                                           RTUNI_ALPHA, /* U+00076b: ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE*/
+                                           RTUNI_ALPHA, /* U+00076c: ARABIC LETTER REH WITH HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+00076d: ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE*/
+                                           RTUNI_ALPHA, /* U+00076e: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW*/
+                                           RTUNI_ALPHA, /* U+00076f: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+                                           RTUNI_ALPHA, /* U+000770: ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+                                           RTUNI_ALPHA, /* U+000771: ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS*/
+                                           RTUNI_ALPHA, /* U+000772: ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE*/
+                                           RTUNI_ALPHA, /* U+000773: ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+                                           RTUNI_ALPHA, /* U+000774: ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+                                           RTUNI_ALPHA, /* U+000775: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+                                           RTUNI_ALPHA, /* U+000776: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+                                           RTUNI_ALPHA, /* U+000777: ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW*/
+                                           RTUNI_ALPHA, /* U+000778: ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+                                           RTUNI_ALPHA, /* U+000779: ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+                                           RTUNI_ALPHA, /* U+00077a: ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE*/
+                                           RTUNI_ALPHA, /* U+00077b: ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE*/
+                                           RTUNI_ALPHA, /* U+00077c: ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW*/
+                                           RTUNI_ALPHA, /* U+00077d: ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE*/
+                                           RTUNI_ALPHA, /* U+00077e: ARABIC LETTER SEEN WITH INVERTED V*/
+                                           RTUNI_ALPHA, /* U+00077f: ARABIC LETTER KAF WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+000780: THAANA LETTER HAA*/
+                                           RTUNI_ALPHA, /* U+000781: THAANA LETTER SHAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000782: THAANA LETTER NOONU*/
+                                           RTUNI_ALPHA, /* U+000783: THAANA LETTER RAA*/
+                                           RTUNI_ALPHA, /* U+000784: THAANA LETTER BAA*/
+                                           RTUNI_ALPHA, /* U+000785: THAANA LETTER LHAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000786: THAANA LETTER KAAFU*/
+                                           RTUNI_ALPHA, /* U+000787: THAANA LETTER ALIFU*/
+                                           RTUNI_ALPHA, /* U+000788: THAANA LETTER VAAVU*/
+                                           RTUNI_ALPHA, /* U+000789: THAANA LETTER MEEMU*/
+                                           RTUNI_ALPHA, /* U+00078a: THAANA LETTER FAAFU*/
+                                           RTUNI_ALPHA, /* U+00078b: THAANA LETTER DHAALU*/
+                                           RTUNI_ALPHA, /* U+00078c: THAANA LETTER THAA*/
+                                           RTUNI_ALPHA, /* U+00078d: THAANA LETTER LAAMU*/
+                                           RTUNI_ALPHA, /* U+00078e: THAANA LETTER GAAFU*/
+                                           RTUNI_ALPHA, /* U+00078f: THAANA LETTER GNAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000790: THAANA LETTER SEENU*/
+                                           RTUNI_ALPHA, /* U+000791: THAANA LETTER DAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000792: THAANA LETTER ZAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000793: THAANA LETTER TAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000794: THAANA LETTER YAA*/
+                                           RTUNI_ALPHA, /* U+000795: THAANA LETTER PAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000796: THAANA LETTER JAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000797: THAANA LETTER CHAVIYANI*/
+                                           RTUNI_ALPHA, /* U+000798: THAANA LETTER TTAA*/
+                                           RTUNI_ALPHA, /* U+000799: THAANA LETTER HHAA*/
+                                           RTUNI_ALPHA, /* U+00079a: THAANA LETTER KHAA*/
+                                           RTUNI_ALPHA, /* U+00079b: THAANA LETTER THAALU*/
+                                           RTUNI_ALPHA, /* U+00079c: THAANA LETTER ZAA*/
+                                           RTUNI_ALPHA, /* U+00079d: THAANA LETTER SHEENU*/
+                                           RTUNI_ALPHA, /* U+00079e: THAANA LETTER SAADHU*/
+                                           RTUNI_ALPHA, /* U+00079f: THAANA LETTER DAADHU*/
+                                           RTUNI_ALPHA, /* U+0007a0: THAANA LETTER TO*/
+                                           RTUNI_ALPHA, /* U+0007a1: THAANA LETTER ZO*/
+                                           RTUNI_ALPHA, /* U+0007a2: THAANA LETTER AINU*/
+                                           RTUNI_ALPHA, /* U+0007a3: THAANA LETTER GHAINU*/
+                                           RTUNI_ALPHA, /* U+0007a4: THAANA LETTER QAAFU*/
+                                           RTUNI_ALPHA, /* U+0007a5: THAANA LETTER WAAVU*/
+                                           RTUNI_ALPHA, /* U+0007a6: THAANA ABAFILI*/
+                                           RTUNI_ALPHA, /* U+0007a7: THAANA AABAAFILI*/
+                                           RTUNI_ALPHA, /* U+0007a8: THAANA IBIFILI*/
+                                           RTUNI_ALPHA, /* U+0007a9: THAANA EEBEEFILI*/
+                                           RTUNI_ALPHA, /* U+0007aa: THAANA UBUFILI*/
+                                           RTUNI_ALPHA, /* U+0007ab: THAANA OOBOOFILI*/
+                                           RTUNI_ALPHA, /* U+0007ac: THAANA EBEFILI*/
+                                           RTUNI_ALPHA, /* U+0007ad: THAANA EYBEYFILI*/
+                                           RTUNI_ALPHA, /* U+0007ae: THAANA OBOFILI*/
+                                           RTUNI_ALPHA, /* U+0007af: THAANA OABOAFILI*/
+                                           RTUNI_ALPHA, /* U+0007b0: THAANA SUKUN*/
+                                           RTUNI_ALPHA, /* U+0007b1: THAANA LETTER NAA*/
+                                                     0, /* U+0007b2: */
+                                                     0, /* U+0007b3: */
+                                                     0, /* U+0007b4: */
+                                                     0, /* U+0007b5: */
+                                                     0, /* U+0007b6: */
+                                                     0, /* U+0007b7: */
+                                                     0, /* U+0007b8: */
+                                                     0, /* U+0007b9: */
+                                                     0, /* U+0007ba: */
+                                                     0, /* U+0007bb: */
+                                                     0, /* U+0007bc: */
+                                                     0, /* U+0007bd: */
+                                                     0, /* U+0007be: */
+                                                     0, /* U+0007bf: */
+                                          RTUNI_DDIGIT, /* U+0007c0: NKO DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0007c1: NKO DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0007c2: NKO DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0007c3: NKO DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0007c4: NKO DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0007c5: NKO DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0007c6: NKO DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0007c7: NKO DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0007c8: NKO DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0007c9: NKO DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+0007ca: NKO LETTER A*/
+                                           RTUNI_ALPHA, /* U+0007cb: NKO LETTER EE*/
+                                           RTUNI_ALPHA, /* U+0007cc: NKO LETTER I*/
+                                           RTUNI_ALPHA, /* U+0007cd: NKO LETTER E*/
+                                           RTUNI_ALPHA, /* U+0007ce: NKO LETTER U*/
+                                           RTUNI_ALPHA, /* U+0007cf: NKO LETTER OO*/
+                                           RTUNI_ALPHA, /* U+0007d0: NKO LETTER O*/
+                                           RTUNI_ALPHA, /* U+0007d1: NKO LETTER DAGBASINNA*/
+                                           RTUNI_ALPHA, /* U+0007d2: NKO LETTER N*/
+                                           RTUNI_ALPHA, /* U+0007d3: NKO LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0007d4: NKO LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0007d5: NKO LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0007d6: NKO LETTER JA*/
+                                           RTUNI_ALPHA, /* U+0007d7: NKO LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+0007d8: NKO LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0007d9: NKO LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0007da: NKO LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+0007db: NKO LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0007dc: NKO LETTER GBA*/
+                                           RTUNI_ALPHA, /* U+0007dd: NKO LETTER FA*/
+                                           RTUNI_ALPHA, /* U+0007de: NKO LETTER KA*/
+                                           RTUNI_ALPHA, /* U+0007df: NKO LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0007e0: NKO LETTER NA WOLOSO*/
+                                           RTUNI_ALPHA, /* U+0007e1: NKO LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0007e2: NKO LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+0007e3: NKO LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0007e4: NKO LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0007e5: NKO LETTER WA*/
+                                           RTUNI_ALPHA, /* U+0007e6: NKO LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0007e7: NKO LETTER NYA WOLOSO*/
+                                           RTUNI_ALPHA, /* U+0007e8: NKO LETTER JONA JA*/
+                                           RTUNI_ALPHA, /* U+0007e9: NKO LETTER JONA CHA*/
+                                           RTUNI_ALPHA, /* U+0007ea: NKO LETTER JONA RA*/
+                                                     0, /* U+0007eb: NKO COMBINING SHORT HIGH TONE*/
+                                                     0, /* U+0007ec: NKO COMBINING SHORT LOW TONE*/
+                                                     0, /* U+0007ed: NKO COMBINING SHORT RISING TONE*/
+                                                     0, /* U+0007ee: NKO COMBINING LONG DESCENDING TONE*/
+                                                     0, /* U+0007ef: NKO COMBINING LONG HIGH TONE*/
+                                                     0, /* U+0007f0: NKO COMBINING LONG LOW TONE*/
+                                                     0, /* U+0007f1: NKO COMBINING LONG RISING TONE*/
+                                                     0, /* U+0007f2: NKO COMBINING NASALIZATION MARK*/
+                                                     0, /* U+0007f3: NKO COMBINING DOUBLE DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0007f4: NKO HIGH TONE APOSTROPHE*/
+                                           RTUNI_ALPHA, /* U+0007f5: NKO LOW TONE APOSTROPHE*/
+                                                     0, /* U+0007f6: NKO SYMBOL OO DENNEN*/
+                                                     0, /* U+0007f7: NKO SYMBOL GBAKURUNEN*/
+                                                     0, /* U+0007f8: NKO COMMA*/
+                                                     0, /* U+0007f9: NKO EXCLAMATION MARK*/
+                                           RTUNI_ALPHA, /* U+0007fa: NKO LAJANYALAN*/
+                                                     0, /* U+0007fb: */
+                                                     0, /* U+0007fc: */
+                                                     0, /* U+0007fd: */
+                                                     0, /* U+0007fe: */
+                                                     0, /* U+0007ff: */
+                                           RTUNI_ALPHA, /* U+000800: SAMARITAN LETTER ALAF*/
+                                           RTUNI_ALPHA, /* U+000801: SAMARITAN LETTER BIT*/
+                                           RTUNI_ALPHA, /* U+000802: SAMARITAN LETTER GAMAN*/
+                                           RTUNI_ALPHA, /* U+000803: SAMARITAN LETTER DALAT*/
+                                           RTUNI_ALPHA, /* U+000804: SAMARITAN LETTER IY*/
+                                           RTUNI_ALPHA, /* U+000805: SAMARITAN LETTER BAA*/
+                                           RTUNI_ALPHA, /* U+000806: SAMARITAN LETTER ZEN*/
+                                           RTUNI_ALPHA, /* U+000807: SAMARITAN LETTER IT*/
+                                           RTUNI_ALPHA, /* U+000808: SAMARITAN LETTER TIT*/
+                                           RTUNI_ALPHA, /* U+000809: SAMARITAN LETTER YUT*/
+                                           RTUNI_ALPHA, /* U+00080a: SAMARITAN LETTER KAAF*/
+                                           RTUNI_ALPHA, /* U+00080b: SAMARITAN LETTER LABAT*/
+                                           RTUNI_ALPHA, /* U+00080c: SAMARITAN LETTER MIM*/
+                                           RTUNI_ALPHA, /* U+00080d: SAMARITAN LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+00080e: SAMARITAN LETTER SINGAAT*/
+                                           RTUNI_ALPHA, /* U+00080f: SAMARITAN LETTER IN*/
+                                           RTUNI_ALPHA, /* U+000810: SAMARITAN LETTER FI*/
+                                           RTUNI_ALPHA, /* U+000811: SAMARITAN LETTER TSAADIY*/
+                                           RTUNI_ALPHA, /* U+000812: SAMARITAN LETTER QUF*/
+                                           RTUNI_ALPHA, /* U+000813: SAMARITAN LETTER RISH*/
+                                           RTUNI_ALPHA, /* U+000814: SAMARITAN LETTER SHAN*/
+                                           RTUNI_ALPHA, /* U+000815: SAMARITAN LETTER TAAF*/
+                                           RTUNI_ALPHA, /* U+000816: SAMARITAN MARK IN*/
+                                           RTUNI_ALPHA, /* U+000817: SAMARITAN MARK IN-ALAF*/
+                                                     0, /* U+000818: SAMARITAN MARK OCCLUSION*/
+                                                     0, /* U+000819: SAMARITAN MARK DAGESH*/
+                                           RTUNI_ALPHA, /* U+00081a: SAMARITAN MODIFIER LETTER EPENTHETIC YUT*/
+                                           RTUNI_ALPHA, /* U+00081b: SAMARITAN MARK EPENTHETIC YUT*/
+                                           RTUNI_ALPHA, /* U+00081c: SAMARITAN VOWEL SIGN LONG E*/
+                                           RTUNI_ALPHA, /* U+00081d: SAMARITAN VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+00081e: SAMARITAN VOWEL SIGN OVERLONG AA*/
+                                           RTUNI_ALPHA, /* U+00081f: SAMARITAN VOWEL SIGN LONG AA*/
+                                           RTUNI_ALPHA, /* U+000820: SAMARITAN VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000821: SAMARITAN VOWEL SIGN OVERLONG A*/
+                                           RTUNI_ALPHA, /* U+000822: SAMARITAN VOWEL SIGN LONG A*/
+                                           RTUNI_ALPHA, /* U+000823: SAMARITAN VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+000824: SAMARITAN MODIFIER LETTER SHORT A*/
+                                           RTUNI_ALPHA, /* U+000825: SAMARITAN VOWEL SIGN SHORT A*/
+                                           RTUNI_ALPHA, /* U+000826: SAMARITAN VOWEL SIGN LONG U*/
+                                           RTUNI_ALPHA, /* U+000827: SAMARITAN VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000828: SAMARITAN MODIFIER LETTER I*/
+                                           RTUNI_ALPHA, /* U+000829: SAMARITAN VOWEL SIGN LONG I*/
+                                           RTUNI_ALPHA, /* U+00082a: SAMARITAN VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00082b: SAMARITAN VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+00082c: SAMARITAN VOWEL SIGN SUKUN*/
+                                                     0, /* U+00082d: SAMARITAN MARK NEQUDAA*/
+                                                     0, /* U+00082e: */
+                                                     0, /* U+00082f: */
+                                                     0, /* U+000830: SAMARITAN PUNCTUATION NEQUDAA*/
+                                                     0, /* U+000831: SAMARITAN PUNCTUATION AFSAAQ*/
+                                                     0, /* U+000832: SAMARITAN PUNCTUATION ANGED*/
+                                                     0, /* U+000833: SAMARITAN PUNCTUATION BAU*/
+                                                     0, /* U+000834: SAMARITAN PUNCTUATION ATMAAU*/
+                                                     0, /* U+000835: SAMARITAN PUNCTUATION SHIYYAALAA*/
+                                                     0, /* U+000836: SAMARITAN ABBREVIATION MARK*/
+                                                     0, /* U+000837: SAMARITAN PUNCTUATION MELODIC QITSA*/
+                                                     0, /* U+000838: SAMARITAN PUNCTUATION ZIQAA*/
+                                                     0, /* U+000839: SAMARITAN PUNCTUATION QITSA*/
+                                                     0, /* U+00083a: SAMARITAN PUNCTUATION ZAEF*/
+                                                     0, /* U+00083b: SAMARITAN PUNCTUATION TURU*/
+                                                     0, /* U+00083c: SAMARITAN PUNCTUATION ARKAANU*/
+                                                     0, /* U+00083d: SAMARITAN PUNCTUATION SOF MASHFAAT*/
+                                                     0, /* U+00083e: SAMARITAN PUNCTUATION ANNAAU*/
+                                                     0, /* U+00083f: */
+                                           RTUNI_ALPHA, /* U+000840: MANDAIC LETTER HALQA*/
+                                           RTUNI_ALPHA, /* U+000841: MANDAIC LETTER AB*/
+                                           RTUNI_ALPHA, /* U+000842: MANDAIC LETTER AG*/
+                                           RTUNI_ALPHA, /* U+000843: MANDAIC LETTER AD*/
+                                           RTUNI_ALPHA, /* U+000844: MANDAIC LETTER AH*/
+                                           RTUNI_ALPHA, /* U+000845: MANDAIC LETTER USHENNA*/
+                                           RTUNI_ALPHA, /* U+000846: MANDAIC LETTER AZ*/
+                                           RTUNI_ALPHA, /* U+000847: MANDAIC LETTER IT*/
+                                           RTUNI_ALPHA, /* U+000848: MANDAIC LETTER ATT*/
+                                           RTUNI_ALPHA, /* U+000849: MANDAIC LETTER AKSA*/
+                                           RTUNI_ALPHA, /* U+00084a: MANDAIC LETTER AK*/
+                                           RTUNI_ALPHA, /* U+00084b: MANDAIC LETTER AL*/
+                                           RTUNI_ALPHA, /* U+00084c: MANDAIC LETTER AM*/
+                                           RTUNI_ALPHA, /* U+00084d: MANDAIC LETTER AN*/
+                                           RTUNI_ALPHA, /* U+00084e: MANDAIC LETTER AS*/
+                                           RTUNI_ALPHA, /* U+00084f: MANDAIC LETTER IN*/
+                                           RTUNI_ALPHA, /* U+000850: MANDAIC LETTER AP*/
+                                           RTUNI_ALPHA, /* U+000851: MANDAIC LETTER ASZ*/
+                                           RTUNI_ALPHA, /* U+000852: MANDAIC LETTER AQ*/
+                                           RTUNI_ALPHA, /* U+000853: MANDAIC LETTER AR*/
+                                           RTUNI_ALPHA, /* U+000854: MANDAIC LETTER ASH*/
+                                           RTUNI_ALPHA, /* U+000855: MANDAIC LETTER AT*/
+                                           RTUNI_ALPHA, /* U+000856: MANDAIC LETTER DUSHENNA*/
+                                           RTUNI_ALPHA, /* U+000857: MANDAIC LETTER KAD*/
+                                           RTUNI_ALPHA, /* U+000858: MANDAIC LETTER AIN*/
+                                                     0, /* U+000859: MANDAIC AFFRICATION MARK*/
+                                                     0, /* U+00085a: MANDAIC VOCALIZATION MARK*/
+                                                     0, /* U+00085b: MANDAIC GEMINATION MARK*/
+                                                     0, /* U+00085c: */
+                                                     0, /* U+00085d: */
+                                                     0, /* U+00085e: MANDAIC PUNCTUATION*/
+                                                     0, /* U+00085f: */
+                                                     0, /* U+000860: */
+                                                     0, /* U+000861: */
+                                                     0, /* U+000862: */
+                                                     0, /* U+000863: */
+                                                     0, /* U+000864: */
+                                                     0, /* U+000865: */
+                                                     0, /* U+000866: */
+                                                     0, /* U+000867: */
+                                                     0, /* U+000868: */
+                                                     0, /* U+000869: */
+                                                     0, /* U+00086a: */
+                                                     0, /* U+00086b: */
+                                                     0, /* U+00086c: */
+                                                     0, /* U+00086d: */
+                                                     0, /* U+00086e: */
+                                                     0, /* U+00086f: */
+                                                     0, /* U+000870: */
+                                                     0, /* U+000871: */
+                                                     0, /* U+000872: */
+                                                     0, /* U+000873: */
+                                                     0, /* U+000874: */
+                                                     0, /* U+000875: */
+                                                     0, /* U+000876: */
+                                                     0, /* U+000877: */
+                                                     0, /* U+000878: */
+                                                     0, /* U+000879: */
+                                                     0, /* U+00087a: */
+                                                     0, /* U+00087b: */
+                                                     0, /* U+00087c: */
+                                                     0, /* U+00087d: */
+                                                     0, /* U+00087e: */
+                                                     0, /* U+00087f: */
+                                                     0, /* U+000880: */
+                                                     0, /* U+000881: */
+                                                     0, /* U+000882: */
+                                                     0, /* U+000883: */
+                                                     0, /* U+000884: */
+                                                     0, /* U+000885: */
+                                                     0, /* U+000886: */
+                                                     0, /* U+000887: */
+                                                     0, /* U+000888: */
+                                                     0, /* U+000889: */
+                                                     0, /* U+00088a: */
+                                                     0, /* U+00088b: */
+                                                     0, /* U+00088c: */
+                                                     0, /* U+00088d: */
+                                                     0, /* U+00088e: */
+                                                     0, /* U+00088f: */
+                                                     0, /* U+000890: */
+                                                     0, /* U+000891: */
+                                                     0, /* U+000892: */
+                                                     0, /* U+000893: */
+                                                     0, /* U+000894: */
+                                                     0, /* U+000895: */
+                                                     0, /* U+000896: */
+                                                     0, /* U+000897: */
+                                                     0, /* U+000898: */
+                                                     0, /* U+000899: */
+                                                     0, /* U+00089a: */
+                                                     0, /* U+00089b: */
+                                                     0, /* U+00089c: */
+                                                     0, /* U+00089d: */
+                                                     0, /* U+00089e: */
+                                                     0, /* U+00089f: */
+                                           RTUNI_ALPHA, /* U+0008a0: ARABIC LETTER BEH WITH SMALL V BELOW*/
+                                                     0, /* U+0008a1: */
+                                           RTUNI_ALPHA, /* U+0008a2: ARABIC LETTER JEEM WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008a3: ARABIC LETTER TAH WITH TWO DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008a4: ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008a5: ARABIC LETTER QAF WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0008a6: ARABIC LETTER LAM WITH DOUBLE BAR*/
+                                           RTUNI_ALPHA, /* U+0008a7: ARABIC LETTER MEEM WITH THREE DOTS ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008a8: ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008a9: ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008aa: ARABIC LETTER REH WITH LOOP*/
+                                           RTUNI_ALPHA, /* U+0008ab: ARABIC LETTER WAW WITH DOT WITHIN*/
+                                           RTUNI_ALPHA, /* U+0008ac: ARABIC LETTER ROHINGYA YEH*/
+                                                     0, /* U+0008ad: */
+                                                     0, /* U+0008ae: */
+                                                     0, /* U+0008af: */
+                                                     0, /* U+0008b0: */
+                                                     0, /* U+0008b1: */
+                                                     0, /* U+0008b2: */
+                                                     0, /* U+0008b3: */
+                                                     0, /* U+0008b4: */
+                                                     0, /* U+0008b5: */
+                                                     0, /* U+0008b6: */
+                                                     0, /* U+0008b7: */
+                                                     0, /* U+0008b8: */
+                                                     0, /* U+0008b9: */
+                                                     0, /* U+0008ba: */
+                                                     0, /* U+0008bb: */
+                                                     0, /* U+0008bc: */
+                                                     0, /* U+0008bd: */
+                                                     0, /* U+0008be: */
+                                                     0, /* U+0008bf: */
+                                                     0, /* U+0008c0: */
+                                                     0, /* U+0008c1: */
+                                                     0, /* U+0008c2: */
+                                                     0, /* U+0008c3: */
+                                                     0, /* U+0008c4: */
+                                                     0, /* U+0008c5: */
+                                                     0, /* U+0008c6: */
+                                                     0, /* U+0008c7: */
+                                                     0, /* U+0008c8: */
+                                                     0, /* U+0008c9: */
+                                                     0, /* U+0008ca: */
+                                                     0, /* U+0008cb: */
+                                                     0, /* U+0008cc: */
+                                                     0, /* U+0008cd: */
+                                                     0, /* U+0008ce: */
+                                                     0, /* U+0008cf: */
+                                                     0, /* U+0008d0: */
+                                                     0, /* U+0008d1: */
+                                                     0, /* U+0008d2: */
+                                                     0, /* U+0008d3: */
+                                                     0, /* U+0008d4: */
+                                                     0, /* U+0008d5: */
+                                                     0, /* U+0008d6: */
+                                                     0, /* U+0008d7: */
+                                                     0, /* U+0008d8: */
+                                                     0, /* U+0008d9: */
+                                                     0, /* U+0008da: */
+                                                     0, /* U+0008db: */
+                                                     0, /* U+0008dc: */
+                                                     0, /* U+0008dd: */
+                                                     0, /* U+0008de: */
+                                                     0, /* U+0008df: */
+                                                     0, /* U+0008e0: */
+                                                     0, /* U+0008e1: */
+                                                     0, /* U+0008e2: */
+                                                     0, /* U+0008e3: */
+                                           RTUNI_ALPHA, /* U+0008e4: ARABIC CURLY FATHA*/
+                                           RTUNI_ALPHA, /* U+0008e5: ARABIC CURLY DAMMA*/
+                                           RTUNI_ALPHA, /* U+0008e6: ARABIC CURLY KASRA*/
+                                           RTUNI_ALPHA, /* U+0008e7: ARABIC CURLY FATHATAN*/
+                                           RTUNI_ALPHA, /* U+0008e8: ARABIC CURLY DAMMATAN*/
+                                           RTUNI_ALPHA, /* U+0008e9: ARABIC CURLY KASRATAN*/
+                                                     0, /* U+0008ea: ARABIC TONE ONE DOT ABOVE*/
+                                                     0, /* U+0008eb: ARABIC TONE TWO DOTS ABOVE*/
+                                                     0, /* U+0008ec: ARABIC TONE LOOP ABOVE*/
+                                                     0, /* U+0008ed: ARABIC TONE ONE DOT BELOW*/
+                                                     0, /* U+0008ee: ARABIC TONE TWO DOTS BELOW*/
+                                                     0, /* U+0008ef: ARABIC TONE LOOP BELOW*/
+                                           RTUNI_ALPHA, /* U+0008f0: ARABIC OPEN FATHATAN*/
+                                           RTUNI_ALPHA, /* U+0008f1: ARABIC OPEN DAMMATAN*/
+                                           RTUNI_ALPHA, /* U+0008f2: ARABIC OPEN KASRATAN*/
+                                           RTUNI_ALPHA, /* U+0008f3: ARABIC SMALL HIGH WAW*/
+                                           RTUNI_ALPHA, /* U+0008f4: ARABIC FATHA WITH RING*/
+                                           RTUNI_ALPHA, /* U+0008f5: ARABIC FATHA WITH DOT ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008f6: ARABIC KASRA WITH DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+0008f7: ARABIC LEFT ARROWHEAD ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008f8: ARABIC RIGHT ARROWHEAD ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008f9: ARABIC LEFT ARROWHEAD BELOW*/
+                                           RTUNI_ALPHA, /* U+0008fa: ARABIC RIGHT ARROWHEAD BELOW*/
+                                           RTUNI_ALPHA, /* U+0008fb: ARABIC DOUBLE RIGHT ARROWHEAD ABOVE*/
+                                           RTUNI_ALPHA, /* U+0008fc: ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT*/
+                                           RTUNI_ALPHA, /* U+0008fd: ARABIC RIGHT ARROWHEAD ABOVE WITH DOT*/
+                                           RTUNI_ALPHA, /* U+0008fe: ARABIC DAMMA WITH DOT*/
+                                                     0, /* U+0008ff: */
+                                           RTUNI_ALPHA, /* U+000900: DEVANAGARI SIGN INVERTED CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000901: DEVANAGARI SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000902: DEVANAGARI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000903: DEVANAGARI SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+000904: DEVANAGARI LETTER SHORT A*/
+                                           RTUNI_ALPHA, /* U+000905: DEVANAGARI LETTER A*/
+                                           RTUNI_ALPHA, /* U+000906: DEVANAGARI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000907: DEVANAGARI LETTER I*/
+                                           RTUNI_ALPHA, /* U+000908: DEVANAGARI LETTER II*/
+                                           RTUNI_ALPHA, /* U+000909: DEVANAGARI LETTER U*/
+                                           RTUNI_ALPHA, /* U+00090a: DEVANAGARI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+00090b: DEVANAGARI LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+00090c: DEVANAGARI LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+00090d: DEVANAGARI LETTER CANDRA E*/
+                                           RTUNI_ALPHA, /* U+00090e: DEVANAGARI LETTER SHORT E*/
+                                           RTUNI_ALPHA, /* U+00090f: DEVANAGARI LETTER E*/
+                                           RTUNI_ALPHA, /* U+000910: DEVANAGARI LETTER AI*/
+                                           RTUNI_ALPHA, /* U+000911: DEVANAGARI LETTER CANDRA O*/
+                                           RTUNI_ALPHA, /* U+000912: DEVANAGARI LETTER SHORT O*/
+                                           RTUNI_ALPHA, /* U+000913: DEVANAGARI LETTER O*/
+                                           RTUNI_ALPHA, /* U+000914: DEVANAGARI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000915: DEVANAGARI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000916: DEVANAGARI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000917: DEVANAGARI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000918: DEVANAGARI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000919: DEVANAGARI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00091a: DEVANAGARI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00091b: DEVANAGARI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00091c: DEVANAGARI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00091d: DEVANAGARI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+00091e: DEVANAGARI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00091f: DEVANAGARI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000920: DEVANAGARI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000921: DEVANAGARI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000922: DEVANAGARI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000923: DEVANAGARI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000924: DEVANAGARI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000925: DEVANAGARI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000926: DEVANAGARI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000927: DEVANAGARI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000928: DEVANAGARI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+000929: DEVANAGARI LETTER NNNA*/
+                                           RTUNI_ALPHA, /* U+00092a: DEVANAGARI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00092b: DEVANAGARI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00092c: DEVANAGARI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00092d: DEVANAGARI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+00092e: DEVANAGARI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00092f: DEVANAGARI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000930: DEVANAGARI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000931: DEVANAGARI LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000932: DEVANAGARI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000933: DEVANAGARI LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+000934: DEVANAGARI LETTER LLLA*/
+                                           RTUNI_ALPHA, /* U+000935: DEVANAGARI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000936: DEVANAGARI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000937: DEVANAGARI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000938: DEVANAGARI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000939: DEVANAGARI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00093a: DEVANAGARI VOWEL SIGN OE*/
+                                           RTUNI_ALPHA, /* U+00093b: DEVANAGARI VOWEL SIGN OOE*/
+                                                     0, /* U+00093c: DEVANAGARI SIGN NUKTA*/
+                                           RTUNI_ALPHA, /* U+00093d: DEVANAGARI SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+00093e: DEVANAGARI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+00093f: DEVANAGARI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000940: DEVANAGARI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000941: DEVANAGARI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000942: DEVANAGARI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000943: DEVANAGARI VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000944: DEVANAGARI VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000945: DEVANAGARI VOWEL SIGN CANDRA E*/
+                                           RTUNI_ALPHA, /* U+000946: DEVANAGARI VOWEL SIGN SHORT E*/
+                                           RTUNI_ALPHA, /* U+000947: DEVANAGARI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000948: DEVANAGARI VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+000949: DEVANAGARI VOWEL SIGN CANDRA O*/
+                                           RTUNI_ALPHA, /* U+00094a: DEVANAGARI VOWEL SIGN SHORT O*/
+                                           RTUNI_ALPHA, /* U+00094b: DEVANAGARI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+00094c: DEVANAGARI VOWEL SIGN AU*/
+                                                     0, /* U+00094d: DEVANAGARI SIGN VIRAMA*/
+                                           RTUNI_ALPHA, /* U+00094e: DEVANAGARI VOWEL SIGN PRISHTHAMATRA E*/
+                                           RTUNI_ALPHA, /* U+00094f: DEVANAGARI VOWEL SIGN AW*/
+                                           RTUNI_ALPHA, /* U+000950: DEVANAGARI OM*/
+                                                     0, /* U+000951: DEVANAGARI STRESS SIGN UDATTA*/
+                                                     0, /* U+000952: DEVANAGARI STRESS SIGN ANUDATTA*/
+                                                     0, /* U+000953: DEVANAGARI GRAVE ACCENT*/
+                                                     0, /* U+000954: DEVANAGARI ACUTE ACCENT*/
+                                           RTUNI_ALPHA, /* U+000955: DEVANAGARI VOWEL SIGN CANDRA LONG E*/
+                                           RTUNI_ALPHA, /* U+000956: DEVANAGARI VOWEL SIGN UE*/
+                                           RTUNI_ALPHA, /* U+000957: DEVANAGARI VOWEL SIGN UUE*/
+                                           RTUNI_ALPHA, /* U+000958: DEVANAGARI LETTER QA*/
+                                           RTUNI_ALPHA, /* U+000959: DEVANAGARI LETTER KHHA*/
+                                           RTUNI_ALPHA, /* U+00095a: DEVANAGARI LETTER GHHA*/
+                                           RTUNI_ALPHA, /* U+00095b: DEVANAGARI LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+00095c: DEVANAGARI LETTER DDDHA*/
+                                           RTUNI_ALPHA, /* U+00095d: DEVANAGARI LETTER RHA*/
+                                           RTUNI_ALPHA, /* U+00095e: DEVANAGARI LETTER FA*/
+                                           RTUNI_ALPHA, /* U+00095f: DEVANAGARI LETTER YYA*/
+                                           RTUNI_ALPHA, /* U+000960: DEVANAGARI LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000961: DEVANAGARI LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000962: DEVANAGARI VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000963: DEVANAGARI VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000964: DEVANAGARI DANDA*/
+                                                     0, /* U+000965: DEVANAGARI DOUBLE DANDA*/
+                                          RTUNI_DDIGIT, /* U+000966: DEVANAGARI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000967: DEVANAGARI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000968: DEVANAGARI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000969: DEVANAGARI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00096a: DEVANAGARI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00096b: DEVANAGARI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00096c: DEVANAGARI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00096d: DEVANAGARI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00096e: DEVANAGARI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00096f: DEVANAGARI DIGIT NINE*/
+                                                     0, /* U+000970: DEVANAGARI ABBREVIATION SIGN*/
+                                           RTUNI_ALPHA, /* U+000971: DEVANAGARI SIGN HIGH SPACING DOT*/
+                                           RTUNI_ALPHA, /* U+000972: DEVANAGARI LETTER CANDRA A*/
+                                           RTUNI_ALPHA, /* U+000973: DEVANAGARI LETTER OE*/
+                                           RTUNI_ALPHA, /* U+000974: DEVANAGARI LETTER OOE*/
+                                           RTUNI_ALPHA, /* U+000975: DEVANAGARI LETTER AW*/
+                                           RTUNI_ALPHA, /* U+000976: DEVANAGARI LETTER UE*/
+                                           RTUNI_ALPHA, /* U+000977: DEVANAGARI LETTER UUE*/
+                                                     0, /* U+000978: */
+                                           RTUNI_ALPHA, /* U+000979: DEVANAGARI LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+00097a: DEVANAGARI LETTER HEAVY YA*/
+                                           RTUNI_ALPHA, /* U+00097b: DEVANAGARI LETTER GGA*/
+                                           RTUNI_ALPHA, /* U+00097c: DEVANAGARI LETTER JJA*/
+                                           RTUNI_ALPHA, /* U+00097d: DEVANAGARI LETTER GLOTTAL STOP*/
+                                           RTUNI_ALPHA, /* U+00097e: DEVANAGARI LETTER DDDA*/
+                                           RTUNI_ALPHA, /* U+00097f: DEVANAGARI LETTER BBA*/
+                                                     0, /* U+000980: */
+                                           RTUNI_ALPHA, /* U+000981: BENGALI SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000982: BENGALI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000983: BENGALI SIGN VISARGA*/
+                                                     0, /* U+000984: */
+                                           RTUNI_ALPHA, /* U+000985: BENGALI LETTER A*/
+                                           RTUNI_ALPHA, /* U+000986: BENGALI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000987: BENGALI LETTER I*/
+                                           RTUNI_ALPHA, /* U+000988: BENGALI LETTER II*/
+                                           RTUNI_ALPHA, /* U+000989: BENGALI LETTER U*/
+                                           RTUNI_ALPHA, /* U+00098a: BENGALI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+00098b: BENGALI LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+00098c: BENGALI LETTER VOCALIC L*/
+                                                     0, /* U+00098d: */
+                                                     0, /* U+00098e: */
+                                           RTUNI_ALPHA, /* U+00098f: BENGALI LETTER E*/
+                                           RTUNI_ALPHA, /* U+000990: BENGALI LETTER AI*/
+                                                     0, /* U+000991: */
+                                                     0, /* U+000992: */
+                                           RTUNI_ALPHA, /* U+000993: BENGALI LETTER O*/
+                                           RTUNI_ALPHA, /* U+000994: BENGALI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000995: BENGALI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000996: BENGALI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000997: BENGALI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000998: BENGALI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000999: BENGALI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00099a: BENGALI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00099b: BENGALI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00099c: BENGALI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00099d: BENGALI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+00099e: BENGALI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00099f: BENGALI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+0009a0: BENGALI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+0009a1: BENGALI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+0009a2: BENGALI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+0009a3: BENGALI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+0009a4: BENGALI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0009a5: BENGALI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+0009a6: BENGALI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0009a7: BENGALI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+0009a8: BENGALI LETTER NA*/
+                                                     0, /* U+0009a9: */
+                                           RTUNI_ALPHA, /* U+0009aa: BENGALI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0009ab: BENGALI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+0009ac: BENGALI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0009ad: BENGALI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+0009ae: BENGALI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0009af: BENGALI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0009b0: BENGALI LETTER RA*/
+                                                     0, /* U+0009b1: */
+                                           RTUNI_ALPHA, /* U+0009b2: BENGALI LETTER LA*/
+                                                     0, /* U+0009b3: */
+                                                     0, /* U+0009b4: */
+                                                     0, /* U+0009b5: */
+                                           RTUNI_ALPHA, /* U+0009b6: BENGALI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+0009b7: BENGALI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+0009b8: BENGALI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0009b9: BENGALI LETTER HA*/
+                                                     0, /* U+0009ba: */
+                                                     0, /* U+0009bb: */
+                                                     0, /* U+0009bc: BENGALI SIGN NUKTA*/
+                                           RTUNI_ALPHA, /* U+0009bd: BENGALI SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+0009be: BENGALI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0009bf: BENGALI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+0009c0: BENGALI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0009c1: BENGALI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0009c2: BENGALI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0009c3: BENGALI VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+0009c4: BENGALI VOWEL SIGN VOCALIC RR*/
+                                                     0, /* U+0009c5: */
+                                                     0, /* U+0009c6: */
+                                           RTUNI_ALPHA, /* U+0009c7: BENGALI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0009c8: BENGALI VOWEL SIGN AI*/
+                                                     0, /* U+0009c9: */
+                                                     0, /* U+0009ca: */
+                                           RTUNI_ALPHA, /* U+0009cb: BENGALI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+0009cc: BENGALI VOWEL SIGN AU*/
+                                                     0, /* U+0009cd: BENGALI SIGN VIRAMA*/
+                                           RTUNI_ALPHA, /* U+0009ce: BENGALI LETTER KHANDA TA*/
+                                                     0, /* U+0009cf: */
+                                                     0, /* U+0009d0: */
+                                                     0, /* U+0009d1: */
+                                                     0, /* U+0009d2: */
+                                                     0, /* U+0009d3: */
+                                                     0, /* U+0009d4: */
+                                                     0, /* U+0009d5: */
+                                                     0, /* U+0009d6: */
+                                           RTUNI_ALPHA, /* U+0009d7: BENGALI AU LENGTH MARK*/
+                                                     0, /* U+0009d8: */
+                                                     0, /* U+0009d9: */
+                                                     0, /* U+0009da: */
+                                                     0, /* U+0009db: */
+                                           RTUNI_ALPHA, /* U+0009dc: BENGALI LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+0009dd: BENGALI LETTER RHA*/
+                                                     0, /* U+0009de: */
+                                           RTUNI_ALPHA, /* U+0009df: BENGALI LETTER YYA*/
+                                           RTUNI_ALPHA, /* U+0009e0: BENGALI LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+0009e1: BENGALI LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+0009e2: BENGALI VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+0009e3: BENGALI VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+0009e4: */
+                                                     0, /* U+0009e5: */
+                                          RTUNI_DDIGIT, /* U+0009e6: BENGALI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0009e7: BENGALI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0009e8: BENGALI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0009e9: BENGALI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0009ea: BENGALI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0009eb: BENGALI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0009ec: BENGALI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0009ed: BENGALI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0009ee: BENGALI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0009ef: BENGALI DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+0009f0: BENGALI LETTER RA WITH MIDDLE DIAGONAL*/
+                                           RTUNI_ALPHA, /* U+0009f1: BENGALI LETTER RA WITH LOWER DIAGONAL*/
+                                                     0, /* U+0009f2: BENGALI RUPEE MARK*/
+                                                     0, /* U+0009f3: BENGALI RUPEE SIGN*/
+                                                     0, /* U+0009f4: BENGALI CURRENCY NUMERATOR ONE*/
+                                                     0, /* U+0009f5: BENGALI CURRENCY NUMERATOR TWO*/
+                                                     0, /* U+0009f6: BENGALI CURRENCY NUMERATOR THREE*/
+                                                     0, /* U+0009f7: BENGALI CURRENCY NUMERATOR FOUR*/
+                                                     0, /* U+0009f8: BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR*/
+                                                     0, /* U+0009f9: BENGALI CURRENCY DENOMINATOR SIXTEEN*/
+                                                     0, /* U+0009fa: BENGALI ISSHAR*/
+                                                     0, /* U+0009fb: BENGALI GANDA MARK*/
+                                                     0, /* U+0009fc: */
+                                                     0, /* U+0009fd: */
+                                                     0, /* U+0009fe: */
+                                                     0, /* U+0009ff: */
+                                                     0, /* U+000a00: */
+                                           RTUNI_ALPHA, /* U+000a01: GURMUKHI SIGN ADAK BINDI*/
+                                           RTUNI_ALPHA, /* U+000a02: GURMUKHI SIGN BINDI*/
+                                           RTUNI_ALPHA, /* U+000a03: GURMUKHI SIGN VISARGA*/
+                                                     0, /* U+000a04: */
+                                           RTUNI_ALPHA, /* U+000a05: GURMUKHI LETTER A*/
+                                           RTUNI_ALPHA, /* U+000a06: GURMUKHI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000a07: GURMUKHI LETTER I*/
+                                           RTUNI_ALPHA, /* U+000a08: GURMUKHI LETTER II*/
+                                           RTUNI_ALPHA, /* U+000a09: GURMUKHI LETTER U*/
+                                           RTUNI_ALPHA, /* U+000a0a: GURMUKHI LETTER UU*/
+                                                     0, /* U+000a0b: */
+                                                     0, /* U+000a0c: */
+                                                     0, /* U+000a0d: */
+                                                     0, /* U+000a0e: */
+                                           RTUNI_ALPHA, /* U+000a0f: GURMUKHI LETTER EE*/
+                                           RTUNI_ALPHA, /* U+000a10: GURMUKHI LETTER AI*/
+                                                     0, /* U+000a11: */
+                                                     0, /* U+000a12: */
+                                           RTUNI_ALPHA, /* U+000a13: GURMUKHI LETTER OO*/
+                                           RTUNI_ALPHA, /* U+000a14: GURMUKHI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000a15: GURMUKHI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000a16: GURMUKHI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000a17: GURMUKHI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000a18: GURMUKHI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000a19: GURMUKHI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000a1a: GURMUKHI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000a1b: GURMUKHI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000a1c: GURMUKHI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000a1d: GURMUKHI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000a1e: GURMUKHI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000a1f: GURMUKHI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000a20: GURMUKHI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000a21: GURMUKHI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000a22: GURMUKHI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000a23: GURMUKHI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000a24: GURMUKHI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000a25: GURMUKHI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000a26: GURMUKHI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000a27: GURMUKHI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000a28: GURMUKHI LETTER NA*/
+                                                     0, /* U+000a29: */
+                                           RTUNI_ALPHA, /* U+000a2a: GURMUKHI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000a2b: GURMUKHI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000a2c: GURMUKHI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000a2d: GURMUKHI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000a2e: GURMUKHI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000a2f: GURMUKHI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000a30: GURMUKHI LETTER RA*/
+                                                     0, /* U+000a31: */
+                                           RTUNI_ALPHA, /* U+000a32: GURMUKHI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000a33: GURMUKHI LETTER LLA*/
+                                                     0, /* U+000a34: */
+                                           RTUNI_ALPHA, /* U+000a35: GURMUKHI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000a36: GURMUKHI LETTER SHA*/
+                                                     0, /* U+000a37: */
+                                           RTUNI_ALPHA, /* U+000a38: GURMUKHI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000a39: GURMUKHI LETTER HA*/
+                                                     0, /* U+000a3a: */
+                                                     0, /* U+000a3b: */
+                                                     0, /* U+000a3c: GURMUKHI SIGN NUKTA*/
+                                                     0, /* U+000a3d: */
+                                           RTUNI_ALPHA, /* U+000a3e: GURMUKHI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000a3f: GURMUKHI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000a40: GURMUKHI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000a41: GURMUKHI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000a42: GURMUKHI VOWEL SIGN UU*/
+                                                     0, /* U+000a43: */
+                                                     0, /* U+000a44: */
+                                                     0, /* U+000a45: */
+                                                     0, /* U+000a46: */
+                                           RTUNI_ALPHA, /* U+000a47: GURMUKHI VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000a48: GURMUKHI VOWEL SIGN AI*/
+                                                     0, /* U+000a49: */
+                                                     0, /* U+000a4a: */
+                                           RTUNI_ALPHA, /* U+000a4b: GURMUKHI VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000a4c: GURMUKHI VOWEL SIGN AU*/
+                                                     0, /* U+000a4d: GURMUKHI SIGN VIRAMA*/
+                                                     0, /* U+000a4e: */
+                                                     0, /* U+000a4f: */
+                                                     0, /* U+000a50: */
+                                           RTUNI_ALPHA, /* U+000a51: GURMUKHI SIGN UDAAT*/
+                                                     0, /* U+000a52: */
+                                                     0, /* U+000a53: */
+                                                     0, /* U+000a54: */
+                                                     0, /* U+000a55: */
+                                                     0, /* U+000a56: */
+                                                     0, /* U+000a57: */
+                                                     0, /* U+000a58: */
+                                           RTUNI_ALPHA, /* U+000a59: GURMUKHI LETTER KHHA*/
+                                           RTUNI_ALPHA, /* U+000a5a: GURMUKHI LETTER GHHA*/
+                                           RTUNI_ALPHA, /* U+000a5b: GURMUKHI LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+000a5c: GURMUKHI LETTER RRA*/
+                                                     0, /* U+000a5d: */
+                                           RTUNI_ALPHA, /* U+000a5e: GURMUKHI LETTER FA*/
+                                                     0, /* U+000a5f: */
+                                                     0, /* U+000a60: */
+                                                     0, /* U+000a61: */
+                                                     0, /* U+000a62: */
+                                                     0, /* U+000a63: */
+                                                     0, /* U+000a64: */
+                                                     0, /* U+000a65: */
+                                          RTUNI_DDIGIT, /* U+000a66: GURMUKHI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000a67: GURMUKHI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000a68: GURMUKHI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000a69: GURMUKHI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000a6a: GURMUKHI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000a6b: GURMUKHI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000a6c: GURMUKHI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000a6d: GURMUKHI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000a6e: GURMUKHI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000a6f: GURMUKHI DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+000a70: GURMUKHI TIPPI*/
+                                           RTUNI_ALPHA, /* U+000a71: GURMUKHI ADDAK*/
+                                           RTUNI_ALPHA, /* U+000a72: GURMUKHI IRI*/
+                                           RTUNI_ALPHA, /* U+000a73: GURMUKHI URA*/
+                                           RTUNI_ALPHA, /* U+000a74: GURMUKHI EK ONKAR*/
+                                           RTUNI_ALPHA, /* U+000a75: GURMUKHI SIGN YAKASH*/
+                                                     0, /* U+000a76: */
+                                                     0, /* U+000a77: */
+                                                     0, /* U+000a78: */
+                                                     0, /* U+000a79: */
+                                                     0, /* U+000a7a: */
+                                                     0, /* U+000a7b: */
+                                                     0, /* U+000a7c: */
+                                                     0, /* U+000a7d: */
+                                                     0, /* U+000a7e: */
+                                                     0, /* U+000a7f: */
+                                                     0, /* U+000a80: */
+                                           RTUNI_ALPHA, /* U+000a81: GUJARATI SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000a82: GUJARATI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000a83: GUJARATI SIGN VISARGA*/
+                                                     0, /* U+000a84: */
+                                           RTUNI_ALPHA, /* U+000a85: GUJARATI LETTER A*/
+                                           RTUNI_ALPHA, /* U+000a86: GUJARATI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000a87: GUJARATI LETTER I*/
+                                           RTUNI_ALPHA, /* U+000a88: GUJARATI LETTER II*/
+                                           RTUNI_ALPHA, /* U+000a89: GUJARATI LETTER U*/
+                                           RTUNI_ALPHA, /* U+000a8a: GUJARATI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+000a8b: GUJARATI LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000a8c: GUJARATI LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000a8d: GUJARATI VOWEL CANDRA E*/
+                                                     0, /* U+000a8e: */
+                                           RTUNI_ALPHA, /* U+000a8f: GUJARATI LETTER E*/
+                                           RTUNI_ALPHA, /* U+000a90: GUJARATI LETTER AI*/
+                                           RTUNI_ALPHA, /* U+000a91: GUJARATI VOWEL CANDRA O*/
+                                                     0, /* U+000a92: */
+                                           RTUNI_ALPHA, /* U+000a93: GUJARATI LETTER O*/
+                                           RTUNI_ALPHA, /* U+000a94: GUJARATI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000a95: GUJARATI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000a96: GUJARATI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000a97: GUJARATI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000a98: GUJARATI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000a99: GUJARATI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000a9a: GUJARATI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000a9b: GUJARATI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000a9c: GUJARATI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000a9d: GUJARATI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000a9e: GUJARATI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000a9f: GUJARATI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000aa0: GUJARATI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000aa1: GUJARATI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000aa2: GUJARATI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000aa3: GUJARATI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000aa4: GUJARATI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000aa5: GUJARATI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000aa6: GUJARATI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000aa7: GUJARATI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000aa8: GUJARATI LETTER NA*/
+                                                     0, /* U+000aa9: */
+                                           RTUNI_ALPHA, /* U+000aaa: GUJARATI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000aab: GUJARATI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000aac: GUJARATI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000aad: GUJARATI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000aae: GUJARATI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000aaf: GUJARATI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000ab0: GUJARATI LETTER RA*/
+                                                     0, /* U+000ab1: */
+                                           RTUNI_ALPHA, /* U+000ab2: GUJARATI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000ab3: GUJARATI LETTER LLA*/
+                                                     0, /* U+000ab4: */
+                                           RTUNI_ALPHA, /* U+000ab5: GUJARATI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000ab6: GUJARATI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000ab7: GUJARATI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000ab8: GUJARATI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000ab9: GUJARATI LETTER HA*/
+                                                     0, /* U+000aba: */
+                                                     0, /* U+000abb: */
+                                                     0, /* U+000abc: GUJARATI SIGN NUKTA*/
+                                           RTUNI_ALPHA, /* U+000abd: GUJARATI SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+000abe: GUJARATI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000abf: GUJARATI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000ac0: GUJARATI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000ac1: GUJARATI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000ac2: GUJARATI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000ac3: GUJARATI VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000ac4: GUJARATI VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000ac5: GUJARATI VOWEL SIGN CANDRA E*/
+                                                     0, /* U+000ac6: */
+                                           RTUNI_ALPHA, /* U+000ac7: GUJARATI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000ac8: GUJARATI VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+000ac9: GUJARATI VOWEL SIGN CANDRA O*/
+                                                     0, /* U+000aca: */
+                                           RTUNI_ALPHA, /* U+000acb: GUJARATI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000acc: GUJARATI VOWEL SIGN AU*/
+                                                     0, /* U+000acd: GUJARATI SIGN VIRAMA*/
+                                                     0, /* U+000ace: */
+                                                     0, /* U+000acf: */
+                                           RTUNI_ALPHA, /* U+000ad0: GUJARATI OM*/
+                                                     0, /* U+000ad1: */
+                                                     0, /* U+000ad2: */
+                                                     0, /* U+000ad3: */
+                                                     0, /* U+000ad4: */
+                                                     0, /* U+000ad5: */
+                                                     0, /* U+000ad6: */
+                                                     0, /* U+000ad7: */
+                                                     0, /* U+000ad8: */
+                                                     0, /* U+000ad9: */
+                                                     0, /* U+000ada: */
+                                                     0, /* U+000adb: */
+                                                     0, /* U+000adc: */
+                                                     0, /* U+000add: */
+                                                     0, /* U+000ade: */
+                                                     0, /* U+000adf: */
+                                           RTUNI_ALPHA, /* U+000ae0: GUJARATI LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000ae1: GUJARATI LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000ae2: GUJARATI VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000ae3: GUJARATI VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000ae4: */
+                                                     0, /* U+000ae5: */
+                                          RTUNI_DDIGIT, /* U+000ae6: GUJARATI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000ae7: GUJARATI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000ae8: GUJARATI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000ae9: GUJARATI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000aea: GUJARATI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000aeb: GUJARATI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000aec: GUJARATI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000aed: GUJARATI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000aee: GUJARATI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000aef: GUJARATI DIGIT NINE*/
+                                                     0, /* U+000af0: GUJARATI ABBREVIATION SIGN*/
+                                                     0, /* U+000af1: GUJARATI RUPEE SIGN*/
+                                                     0, /* U+000af2: */
+                                                     0, /* U+000af3: */
+                                                     0, /* U+000af4: */
+                                                     0, /* U+000af5: */
+                                                     0, /* U+000af6: */
+                                                     0, /* U+000af7: */
+                                                     0, /* U+000af8: */
+                                                     0, /* U+000af9: */
+                                                     0, /* U+000afa: */
+                                                     0, /* U+000afb: */
+                                                     0, /* U+000afc: */
+                                                     0, /* U+000afd: */
+                                                     0, /* U+000afe: */
+                                                     0, /* U+000aff: */
+                                                     0, /* U+000b00: */
+                                           RTUNI_ALPHA, /* U+000b01: ORIYA SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000b02: ORIYA SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000b03: ORIYA SIGN VISARGA*/
+                                                     0, /* U+000b04: */
+                                           RTUNI_ALPHA, /* U+000b05: ORIYA LETTER A*/
+                                           RTUNI_ALPHA, /* U+000b06: ORIYA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000b07: ORIYA LETTER I*/
+                                           RTUNI_ALPHA, /* U+000b08: ORIYA LETTER II*/
+                                           RTUNI_ALPHA, /* U+000b09: ORIYA LETTER U*/
+                                           RTUNI_ALPHA, /* U+000b0a: ORIYA LETTER UU*/
+                                           RTUNI_ALPHA, /* U+000b0b: ORIYA LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000b0c: ORIYA LETTER VOCALIC L*/
+                                                     0, /* U+000b0d: */
+                                                     0, /* U+000b0e: */
+                                           RTUNI_ALPHA, /* U+000b0f: ORIYA LETTER E*/
+                                           RTUNI_ALPHA, /* U+000b10: ORIYA LETTER AI*/
+                                                     0, /* U+000b11: */
+                                                     0, /* U+000b12: */
+                                           RTUNI_ALPHA, /* U+000b13: ORIYA LETTER O*/
+                                           RTUNI_ALPHA, /* U+000b14: ORIYA LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000b15: ORIYA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000b16: ORIYA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000b17: ORIYA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000b18: ORIYA LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000b19: ORIYA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000b1a: ORIYA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000b1b: ORIYA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000b1c: ORIYA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000b1d: ORIYA LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000b1e: ORIYA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000b1f: ORIYA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000b20: ORIYA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000b21: ORIYA LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000b22: ORIYA LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000b23: ORIYA LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000b24: ORIYA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000b25: ORIYA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000b26: ORIYA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000b27: ORIYA LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000b28: ORIYA LETTER NA*/
+                                                     0, /* U+000b29: */
+                                           RTUNI_ALPHA, /* U+000b2a: ORIYA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000b2b: ORIYA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000b2c: ORIYA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000b2d: ORIYA LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000b2e: ORIYA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000b2f: ORIYA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000b30: ORIYA LETTER RA*/
+                                                     0, /* U+000b31: */
+                                           RTUNI_ALPHA, /* U+000b32: ORIYA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000b33: ORIYA LETTER LLA*/
+                                                     0, /* U+000b34: */
+                                           RTUNI_ALPHA, /* U+000b35: ORIYA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000b36: ORIYA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000b37: ORIYA LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000b38: ORIYA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000b39: ORIYA LETTER HA*/
+                                                     0, /* U+000b3a: */
+                                                     0, /* U+000b3b: */
+                                                     0, /* U+000b3c: ORIYA SIGN NUKTA*/
+                                           RTUNI_ALPHA, /* U+000b3d: ORIYA SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+000b3e: ORIYA VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000b3f: ORIYA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000b40: ORIYA VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000b41: ORIYA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000b42: ORIYA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000b43: ORIYA VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000b44: ORIYA VOWEL SIGN VOCALIC RR*/
+                                                     0, /* U+000b45: */
+                                                     0, /* U+000b46: */
+                                           RTUNI_ALPHA, /* U+000b47: ORIYA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000b48: ORIYA VOWEL SIGN AI*/
+                                                     0, /* U+000b49: */
+                                                     0, /* U+000b4a: */
+                                           RTUNI_ALPHA, /* U+000b4b: ORIYA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000b4c: ORIYA VOWEL SIGN AU*/
+                                                     0, /* U+000b4d: ORIYA SIGN VIRAMA*/
+                                                     0, /* U+000b4e: */
+                                                     0, /* U+000b4f: */
+                                                     0, /* U+000b50: */
+                                                     0, /* U+000b51: */
+                                                     0, /* U+000b52: */
+                                                     0, /* U+000b53: */
+                                                     0, /* U+000b54: */
+                                                     0, /* U+000b55: */
+                                           RTUNI_ALPHA, /* U+000b56: ORIYA AI LENGTH MARK*/
+                                           RTUNI_ALPHA, /* U+000b57: ORIYA AU LENGTH MARK*/
+                                                     0, /* U+000b58: */
+                                                     0, /* U+000b59: */
+                                                     0, /* U+000b5a: */
+                                                     0, /* U+000b5b: */
+                                           RTUNI_ALPHA, /* U+000b5c: ORIYA LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000b5d: ORIYA LETTER RHA*/
+                                                     0, /* U+000b5e: */
+                                           RTUNI_ALPHA, /* U+000b5f: ORIYA LETTER YYA*/
+                                           RTUNI_ALPHA, /* U+000b60: ORIYA LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000b61: ORIYA LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000b62: ORIYA VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000b63: ORIYA VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000b64: */
+                                                     0, /* U+000b65: */
+                                          RTUNI_DDIGIT, /* U+000b66: ORIYA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000b67: ORIYA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000b68: ORIYA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000b69: ORIYA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000b6a: ORIYA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000b6b: ORIYA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000b6c: ORIYA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000b6d: ORIYA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000b6e: ORIYA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000b6f: ORIYA DIGIT NINE*/
+                                                     0, /* U+000b70: ORIYA ISSHAR*/
+                                           RTUNI_ALPHA, /* U+000b71: ORIYA LETTER WA*/
+                                                     0, /* U+000b72: ORIYA FRACTION ONE QUARTER*/
+                                                     0, /* U+000b73: ORIYA FRACTION ONE HALF*/
+                                                     0, /* U+000b74: ORIYA FRACTION THREE QUARTERS*/
+                                                     0, /* U+000b75: ORIYA FRACTION ONE SIXTEENTH*/
+                                                     0, /* U+000b76: ORIYA FRACTION ONE EIGHTH*/
+                                                     0, /* U+000b77: ORIYA FRACTION THREE SIXTEENTHS*/
+                                                     0, /* U+000b78: */
+                                                     0, /* U+000b79: */
+                                                     0, /* U+000b7a: */
+                                                     0, /* U+000b7b: */
+                                                     0, /* U+000b7c: */
+                                                     0, /* U+000b7d: */
+                                                     0, /* U+000b7e: */
+                                                     0, /* U+000b7f: */
+                                                     0, /* U+000b80: */
+                                                     0, /* U+000b81: */
+                                           RTUNI_ALPHA, /* U+000b82: TAMIL SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000b83: TAMIL SIGN VISARGA*/
+                                                     0, /* U+000b84: */
+                                           RTUNI_ALPHA, /* U+000b85: TAMIL LETTER A*/
+                                           RTUNI_ALPHA, /* U+000b86: TAMIL LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000b87: TAMIL LETTER I*/
+                                           RTUNI_ALPHA, /* U+000b88: TAMIL LETTER II*/
+                                           RTUNI_ALPHA, /* U+000b89: TAMIL LETTER U*/
+                                           RTUNI_ALPHA, /* U+000b8a: TAMIL LETTER UU*/
+                                                     0, /* U+000b8b: */
+                                                     0, /* U+000b8c: */
+                                                     0, /* U+000b8d: */
+                                           RTUNI_ALPHA, /* U+000b8e: TAMIL LETTER E*/
+                                           RTUNI_ALPHA, /* U+000b8f: TAMIL LETTER EE*/
+                                           RTUNI_ALPHA, /* U+000b90: TAMIL LETTER AI*/
+                                                     0, /* U+000b91: */
+                                           RTUNI_ALPHA, /* U+000b92: TAMIL LETTER O*/
+                                           RTUNI_ALPHA, /* U+000b93: TAMIL LETTER OO*/
+                                           RTUNI_ALPHA, /* U+000b94: TAMIL LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000b95: TAMIL LETTER KA*/
+                                                     0, /* U+000b96: */
+                                                     0, /* U+000b97: */
+                                                     0, /* U+000b98: */
+                                           RTUNI_ALPHA, /* U+000b99: TAMIL LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000b9a: TAMIL LETTER CA*/
+                                                     0, /* U+000b9b: */
+                                           RTUNI_ALPHA, /* U+000b9c: TAMIL LETTER JA*/
+                                                     0, /* U+000b9d: */
+                                           RTUNI_ALPHA, /* U+000b9e: TAMIL LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000b9f: TAMIL LETTER TTA*/
+                                                     0, /* U+000ba0: */
+                                                     0, /* U+000ba1: */
+                                                     0, /* U+000ba2: */
+                                           RTUNI_ALPHA, /* U+000ba3: TAMIL LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000ba4: TAMIL LETTER TA*/
+                                                     0, /* U+000ba5: */
+                                                     0, /* U+000ba6: */
+                                                     0, /* U+000ba7: */
+                                           RTUNI_ALPHA, /* U+000ba8: TAMIL LETTER NA*/
+                                           RTUNI_ALPHA, /* U+000ba9: TAMIL LETTER NNNA*/
+                                           RTUNI_ALPHA, /* U+000baa: TAMIL LETTER PA*/
+                                                     0, /* U+000bab: */
+                                                     0, /* U+000bac: */
+                                                     0, /* U+000bad: */
+                                           RTUNI_ALPHA, /* U+000bae: TAMIL LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000baf: TAMIL LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000bb0: TAMIL LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000bb1: TAMIL LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000bb2: TAMIL LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000bb3: TAMIL LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+000bb4: TAMIL LETTER LLLA*/
+                                           RTUNI_ALPHA, /* U+000bb5: TAMIL LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000bb6: TAMIL LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000bb7: TAMIL LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000bb8: TAMIL LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000bb9: TAMIL LETTER HA*/
+                                                     0, /* U+000bba: */
+                                                     0, /* U+000bbb: */
+                                                     0, /* U+000bbc: */
+                                                     0, /* U+000bbd: */
+                                           RTUNI_ALPHA, /* U+000bbe: TAMIL VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000bbf: TAMIL VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000bc0: TAMIL VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000bc1: TAMIL VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000bc2: TAMIL VOWEL SIGN UU*/
+                                                     0, /* U+000bc3: */
+                                                     0, /* U+000bc4: */
+                                                     0, /* U+000bc5: */
+                                           RTUNI_ALPHA, /* U+000bc6: TAMIL VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000bc7: TAMIL VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000bc8: TAMIL VOWEL SIGN AI*/
+                                                     0, /* U+000bc9: */
+                                           RTUNI_ALPHA, /* U+000bca: TAMIL VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000bcb: TAMIL VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000bcc: TAMIL VOWEL SIGN AU*/
+                                                     0, /* U+000bcd: TAMIL SIGN VIRAMA*/
+                                                     0, /* U+000bce: */
+                                                     0, /* U+000bcf: */
+                                           RTUNI_ALPHA, /* U+000bd0: TAMIL OM*/
+                                                     0, /* U+000bd1: */
+                                                     0, /* U+000bd2: */
+                                                     0, /* U+000bd3: */
+                                                     0, /* U+000bd4: */
+                                                     0, /* U+000bd5: */
+                                                     0, /* U+000bd6: */
+                                           RTUNI_ALPHA, /* U+000bd7: TAMIL AU LENGTH MARK*/
+                                                     0, /* U+000bd8: */
+                                                     0, /* U+000bd9: */
+                                                     0, /* U+000bda: */
+                                                     0, /* U+000bdb: */
+                                                     0, /* U+000bdc: */
+                                                     0, /* U+000bdd: */
+                                                     0, /* U+000bde: */
+                                                     0, /* U+000bdf: */
+                                                     0, /* U+000be0: */
+                                                     0, /* U+000be1: */
+                                                     0, /* U+000be2: */
+                                                     0, /* U+000be3: */
+                                                     0, /* U+000be4: */
+                                                     0, /* U+000be5: */
+                                          RTUNI_DDIGIT, /* U+000be6: TAMIL DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000be7: TAMIL DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000be8: TAMIL DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000be9: TAMIL DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000bea: TAMIL DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000beb: TAMIL DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000bec: TAMIL DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000bed: TAMIL DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000bee: TAMIL DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000bef: TAMIL DIGIT NINE*/
+                                                     0, /* U+000bf0: TAMIL NUMBER TEN*/
+                                                     0, /* U+000bf1: TAMIL NUMBER ONE HUNDRED*/
+                                                     0, /* U+000bf2: TAMIL NUMBER ONE THOUSAND*/
+                                                     0, /* U+000bf3: TAMIL DAY SIGN*/
+                                                     0, /* U+000bf4: TAMIL MONTH SIGN*/
+                                                     0, /* U+000bf5: TAMIL YEAR SIGN*/
+                                                     0, /* U+000bf6: TAMIL DEBIT SIGN*/
+                                                     0, /* U+000bf7: TAMIL CREDIT SIGN*/
+                                                     0, /* U+000bf8: TAMIL AS ABOVE SIGN*/
+                                                     0, /* U+000bf9: TAMIL RUPEE SIGN*/
+                                                     0, /* U+000bfa: TAMIL NUMBER SIGN*/
+                                                     0, /* U+000bfb: */
+                                                     0, /* U+000bfc: */
+                                                     0, /* U+000bfd: */
+                                                     0, /* U+000bfe: */
+                                                     0, /* U+000bff: */
+                                                     0, /* U+000c00: */
+                                           RTUNI_ALPHA, /* U+000c01: TELUGU SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+000c02: TELUGU SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000c03: TELUGU SIGN VISARGA*/
+                                                     0, /* U+000c04: */
+                                           RTUNI_ALPHA, /* U+000c05: TELUGU LETTER A*/
+                                           RTUNI_ALPHA, /* U+000c06: TELUGU LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000c07: TELUGU LETTER I*/
+                                           RTUNI_ALPHA, /* U+000c08: TELUGU LETTER II*/
+                                           RTUNI_ALPHA, /* U+000c09: TELUGU LETTER U*/
+                                           RTUNI_ALPHA, /* U+000c0a: TELUGU LETTER UU*/
+                                           RTUNI_ALPHA, /* U+000c0b: TELUGU LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000c0c: TELUGU LETTER VOCALIC L*/
+                                                     0, /* U+000c0d: */
+                                           RTUNI_ALPHA, /* U+000c0e: TELUGU LETTER E*/
+                                           RTUNI_ALPHA, /* U+000c0f: TELUGU LETTER EE*/
+                                           RTUNI_ALPHA, /* U+000c10: TELUGU LETTER AI*/
+                                                     0, /* U+000c11: */
+                                           RTUNI_ALPHA, /* U+000c12: TELUGU LETTER O*/
+                                           RTUNI_ALPHA, /* U+000c13: TELUGU LETTER OO*/
+                                           RTUNI_ALPHA, /* U+000c14: TELUGU LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000c15: TELUGU LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000c16: TELUGU LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000c17: TELUGU LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000c18: TELUGU LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000c19: TELUGU LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000c1a: TELUGU LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000c1b: TELUGU LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000c1c: TELUGU LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000c1d: TELUGU LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000c1e: TELUGU LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000c1f: TELUGU LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000c20: TELUGU LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000c21: TELUGU LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000c22: TELUGU LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000c23: TELUGU LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000c24: TELUGU LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000c25: TELUGU LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000c26: TELUGU LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000c27: TELUGU LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000c28: TELUGU LETTER NA*/
+                                                     0, /* U+000c29: */
+                                           RTUNI_ALPHA, /* U+000c2a: TELUGU LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000c2b: TELUGU LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000c2c: TELUGU LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000c2d: TELUGU LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000c2e: TELUGU LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000c2f: TELUGU LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000c30: TELUGU LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000c31: TELUGU LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000c32: TELUGU LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000c33: TELUGU LETTER LLA*/
+                                                     0, /* U+000c34: */
+                                           RTUNI_ALPHA, /* U+000c35: TELUGU LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000c36: TELUGU LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000c37: TELUGU LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000c38: TELUGU LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000c39: TELUGU LETTER HA*/
+                                                     0, /* U+000c3a: */
+                                                     0, /* U+000c3b: */
+                                                     0, /* U+000c3c: */
+                                           RTUNI_ALPHA, /* U+000c3d: TELUGU SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+000c3e: TELUGU VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000c3f: TELUGU VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000c40: TELUGU VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000c41: TELUGU VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000c42: TELUGU VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000c43: TELUGU VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000c44: TELUGU VOWEL SIGN VOCALIC RR*/
+                                                     0, /* U+000c45: */
+                                           RTUNI_ALPHA, /* U+000c46: TELUGU VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000c47: TELUGU VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000c48: TELUGU VOWEL SIGN AI*/
+                                                     0, /* U+000c49: */
+                                           RTUNI_ALPHA, /* U+000c4a: TELUGU VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000c4b: TELUGU VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000c4c: TELUGU VOWEL SIGN AU*/
+                                                     0, /* U+000c4d: TELUGU SIGN VIRAMA*/
+                                                     0, /* U+000c4e: */
+                                                     0, /* U+000c4f: */
+                                                     0, /* U+000c50: */
+                                                     0, /* U+000c51: */
+                                                     0, /* U+000c52: */
+                                                     0, /* U+000c53: */
+                                                     0, /* U+000c54: */
+                                           RTUNI_ALPHA, /* U+000c55: TELUGU LENGTH MARK*/
+                                           RTUNI_ALPHA, /* U+000c56: TELUGU AI LENGTH MARK*/
+                                                     0, /* U+000c57: */
+                                           RTUNI_ALPHA, /* U+000c58: TELUGU LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+000c59: TELUGU LETTER DZA*/
+                                                     0, /* U+000c5a: */
+                                                     0, /* U+000c5b: */
+                                                     0, /* U+000c5c: */
+                                                     0, /* U+000c5d: */
+                                                     0, /* U+000c5e: */
+                                                     0, /* U+000c5f: */
+                                           RTUNI_ALPHA, /* U+000c60: TELUGU LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000c61: TELUGU LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000c62: TELUGU VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000c63: TELUGU VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000c64: */
+                                                     0, /* U+000c65: */
+                                          RTUNI_DDIGIT, /* U+000c66: TELUGU DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000c67: TELUGU DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000c68: TELUGU DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000c69: TELUGU DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000c6a: TELUGU DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000c6b: TELUGU DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000c6c: TELUGU DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000c6d: TELUGU DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000c6e: TELUGU DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000c6f: TELUGU DIGIT NINE*/
+                                                     0, /* U+000c70: */
+                                                     0, /* U+000c71: */
+                                                     0, /* U+000c72: */
+                                                     0, /* U+000c73: */
+                                                     0, /* U+000c74: */
+                                                     0, /* U+000c75: */
+                                                     0, /* U+000c76: */
+                                                     0, /* U+000c77: */
+                                                     0, /* U+000c78: TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR*/
+                                                     0, /* U+000c79: TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR*/
+                                                     0, /* U+000c7a: TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR*/
+                                                     0, /* U+000c7b: TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR*/
+                                                     0, /* U+000c7c: TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR*/
+                                                     0, /* U+000c7d: TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR*/
+                                                     0, /* U+000c7e: TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR*/
+                                                     0, /* U+000c7f: TELUGU SIGN TUUMU*/
+                                                     0, /* U+000c80: */
+                                                     0, /* U+000c81: */
+                                           RTUNI_ALPHA, /* U+000c82: KANNADA SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000c83: KANNADA SIGN VISARGA*/
+                                                     0, /* U+000c84: */
+                                           RTUNI_ALPHA, /* U+000c85: KANNADA LETTER A*/
+                                           RTUNI_ALPHA, /* U+000c86: KANNADA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000c87: KANNADA LETTER I*/
+                                           RTUNI_ALPHA, /* U+000c88: KANNADA LETTER II*/
+                                           RTUNI_ALPHA, /* U+000c89: KANNADA LETTER U*/
+                                           RTUNI_ALPHA, /* U+000c8a: KANNADA LETTER UU*/
+                                           RTUNI_ALPHA, /* U+000c8b: KANNADA LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000c8c: KANNADA LETTER VOCALIC L*/
+                                                     0, /* U+000c8d: */
+                                           RTUNI_ALPHA, /* U+000c8e: KANNADA LETTER E*/
+                                           RTUNI_ALPHA, /* U+000c8f: KANNADA LETTER EE*/
+                                           RTUNI_ALPHA, /* U+000c90: KANNADA LETTER AI*/
+                                                     0, /* U+000c91: */
+                                           RTUNI_ALPHA, /* U+000c92: KANNADA LETTER O*/
+                                           RTUNI_ALPHA, /* U+000c93: KANNADA LETTER OO*/
+                                           RTUNI_ALPHA, /* U+000c94: KANNADA LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000c95: KANNADA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000c96: KANNADA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000c97: KANNADA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000c98: KANNADA LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000c99: KANNADA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000c9a: KANNADA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000c9b: KANNADA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000c9c: KANNADA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000c9d: KANNADA LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000c9e: KANNADA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000c9f: KANNADA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000ca0: KANNADA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000ca1: KANNADA LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000ca2: KANNADA LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000ca3: KANNADA LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000ca4: KANNADA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000ca5: KANNADA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000ca6: KANNADA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000ca7: KANNADA LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000ca8: KANNADA LETTER NA*/
+                                                     0, /* U+000ca9: */
+                                           RTUNI_ALPHA, /* U+000caa: KANNADA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000cab: KANNADA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000cac: KANNADA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000cad: KANNADA LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000cae: KANNADA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000caf: KANNADA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000cb0: KANNADA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000cb1: KANNADA LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000cb2: KANNADA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000cb3: KANNADA LETTER LLA*/
+                                                     0, /* U+000cb4: */
+                                           RTUNI_ALPHA, /* U+000cb5: KANNADA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000cb6: KANNADA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000cb7: KANNADA LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000cb8: KANNADA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000cb9: KANNADA LETTER HA*/
+                                                     0, /* U+000cba: */
+                                                     0, /* U+000cbb: */
+                                                     0, /* U+000cbc: KANNADA SIGN NUKTA*/
+                                           RTUNI_ALPHA, /* U+000cbd: KANNADA SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+000cbe: KANNADA VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000cbf: KANNADA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000cc0: KANNADA VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000cc1: KANNADA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000cc2: KANNADA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000cc3: KANNADA VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000cc4: KANNADA VOWEL SIGN VOCALIC RR*/
+                                                     0, /* U+000cc5: */
+                                           RTUNI_ALPHA, /* U+000cc6: KANNADA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000cc7: KANNADA VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000cc8: KANNADA VOWEL SIGN AI*/
+                                                     0, /* U+000cc9: */
+                                           RTUNI_ALPHA, /* U+000cca: KANNADA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000ccb: KANNADA VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000ccc: KANNADA VOWEL SIGN AU*/
+                                                     0, /* U+000ccd: KANNADA SIGN VIRAMA*/
+                                                     0, /* U+000cce: */
+                                                     0, /* U+000ccf: */
+                                                     0, /* U+000cd0: */
+                                                     0, /* U+000cd1: */
+                                                     0, /* U+000cd2: */
+                                                     0, /* U+000cd3: */
+                                                     0, /* U+000cd4: */
+                                           RTUNI_ALPHA, /* U+000cd5: KANNADA LENGTH MARK*/
+                                           RTUNI_ALPHA, /* U+000cd6: KANNADA AI LENGTH MARK*/
+                                                     0, /* U+000cd7: */
+                                                     0, /* U+000cd8: */
+                                                     0, /* U+000cd9: */
+                                                     0, /* U+000cda: */
+                                                     0, /* U+000cdb: */
+                                                     0, /* U+000cdc: */
+                                                     0, /* U+000cdd: */
+                                           RTUNI_ALPHA, /* U+000cde: KANNADA LETTER FA*/
+                                                     0, /* U+000cdf: */
+                                           RTUNI_ALPHA, /* U+000ce0: KANNADA LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000ce1: KANNADA LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000ce2: KANNADA VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000ce3: KANNADA VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000ce4: */
+                                                     0, /* U+000ce5: */
+                                          RTUNI_DDIGIT, /* U+000ce6: KANNADA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000ce7: KANNADA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000ce8: KANNADA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000ce9: KANNADA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000cea: KANNADA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000ceb: KANNADA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000cec: KANNADA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000ced: KANNADA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000cee: KANNADA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000cef: KANNADA DIGIT NINE*/
+                                                     0, /* U+000cf0: */
+                                           RTUNI_ALPHA, /* U+000cf1: KANNADA SIGN JIHVAMULIYA*/
+                                           RTUNI_ALPHA, /* U+000cf2: KANNADA SIGN UPADHMANIYA*/
+                                                     0, /* U+000cf3: */
+                                                     0, /* U+000cf4: */
+                                                     0, /* U+000cf5: */
+                                                     0, /* U+000cf6: */
+                                                     0, /* U+000cf7: */
+                                                     0, /* U+000cf8: */
+                                                     0, /* U+000cf9: */
+                                                     0, /* U+000cfa: */
+                                                     0, /* U+000cfb: */
+                                                     0, /* U+000cfc: */
+                                                     0, /* U+000cfd: */
+                                                     0, /* U+000cfe: */
+                                                     0, /* U+000cff: */
+                                                     0, /* U+000d00: */
+                                                     0, /* U+000d01: */
+                                           RTUNI_ALPHA, /* U+000d02: MALAYALAM SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+000d03: MALAYALAM SIGN VISARGA*/
+                                                     0, /* U+000d04: */
+                                           RTUNI_ALPHA, /* U+000d05: MALAYALAM LETTER A*/
+                                           RTUNI_ALPHA, /* U+000d06: MALAYALAM LETTER AA*/
+                                           RTUNI_ALPHA, /* U+000d07: MALAYALAM LETTER I*/
+                                           RTUNI_ALPHA, /* U+000d08: MALAYALAM LETTER II*/
+                                           RTUNI_ALPHA, /* U+000d09: MALAYALAM LETTER U*/
+                                           RTUNI_ALPHA, /* U+000d0a: MALAYALAM LETTER UU*/
+                                           RTUNI_ALPHA, /* U+000d0b: MALAYALAM LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000d0c: MALAYALAM LETTER VOCALIC L*/
+                                                     0, /* U+000d0d: */
+                                           RTUNI_ALPHA, /* U+000d0e: MALAYALAM LETTER E*/
+                                           RTUNI_ALPHA, /* U+000d0f: MALAYALAM LETTER EE*/
+                                           RTUNI_ALPHA, /* U+000d10: MALAYALAM LETTER AI*/
+                                                     0, /* U+000d11: */
+                                           RTUNI_ALPHA, /* U+000d12: MALAYALAM LETTER O*/
+                                           RTUNI_ALPHA, /* U+000d13: MALAYALAM LETTER OO*/
+                                           RTUNI_ALPHA, /* U+000d14: MALAYALAM LETTER AU*/
+                                           RTUNI_ALPHA, /* U+000d15: MALAYALAM LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000d16: MALAYALAM LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000d17: MALAYALAM LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000d18: MALAYALAM LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000d19: MALAYALAM LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000d1a: MALAYALAM LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000d1b: MALAYALAM LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000d1c: MALAYALAM LETTER JA*/
+                                           RTUNI_ALPHA, /* U+000d1d: MALAYALAM LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+000d1e: MALAYALAM LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000d1f: MALAYALAM LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000d20: MALAYALAM LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000d21: MALAYALAM LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000d22: MALAYALAM LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000d23: MALAYALAM LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000d24: MALAYALAM LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000d25: MALAYALAM LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000d26: MALAYALAM LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000d27: MALAYALAM LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000d28: MALAYALAM LETTER NA*/
+                                           RTUNI_ALPHA, /* U+000d29: MALAYALAM LETTER NNNA*/
+                                           RTUNI_ALPHA, /* U+000d2a: MALAYALAM LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000d2b: MALAYALAM LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000d2c: MALAYALAM LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000d2d: MALAYALAM LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000d2e: MALAYALAM LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000d2f: MALAYALAM LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000d30: MALAYALAM LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000d31: MALAYALAM LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+000d32: MALAYALAM LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000d33: MALAYALAM LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+000d34: MALAYALAM LETTER LLLA*/
+                                           RTUNI_ALPHA, /* U+000d35: MALAYALAM LETTER VA*/
+                                           RTUNI_ALPHA, /* U+000d36: MALAYALAM LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000d37: MALAYALAM LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000d38: MALAYALAM LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000d39: MALAYALAM LETTER HA*/
+                                           RTUNI_ALPHA, /* U+000d3a: MALAYALAM LETTER TTTA*/
+                                                     0, /* U+000d3b: */
+                                                     0, /* U+000d3c: */
+                                           RTUNI_ALPHA, /* U+000d3d: MALAYALAM SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+000d3e: MALAYALAM VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000d3f: MALAYALAM VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000d40: MALAYALAM VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000d41: MALAYALAM VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000d42: MALAYALAM VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000d43: MALAYALAM VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000d44: MALAYALAM VOWEL SIGN VOCALIC RR*/
+                                                     0, /* U+000d45: */
+                                           RTUNI_ALPHA, /* U+000d46: MALAYALAM VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000d47: MALAYALAM VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000d48: MALAYALAM VOWEL SIGN AI*/
+                                                     0, /* U+000d49: */
+                                           RTUNI_ALPHA, /* U+000d4a: MALAYALAM VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000d4b: MALAYALAM VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000d4c: MALAYALAM VOWEL SIGN AU*/
+                                                     0, /* U+000d4d: MALAYALAM SIGN VIRAMA*/
+                                           RTUNI_ALPHA, /* U+000d4e: MALAYALAM LETTER DOT REPH*/
+                                                     0, /* U+000d4f: */
+                                                     0, /* U+000d50: */
+                                                     0, /* U+000d51: */
+                                                     0, /* U+000d52: */
+                                                     0, /* U+000d53: */
+                                                     0, /* U+000d54: */
+                                                     0, /* U+000d55: */
+                                                     0, /* U+000d56: */
+                                           RTUNI_ALPHA, /* U+000d57: MALAYALAM AU LENGTH MARK*/
+                                                     0, /* U+000d58: */
+                                                     0, /* U+000d59: */
+                                                     0, /* U+000d5a: */
+                                                     0, /* U+000d5b: */
+                                                     0, /* U+000d5c: */
+                                                     0, /* U+000d5d: */
+                                                     0, /* U+000d5e: */
+                                                     0, /* U+000d5f: */
+                                           RTUNI_ALPHA, /* U+000d60: MALAYALAM LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000d61: MALAYALAM LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000d62: MALAYALAM VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000d63: MALAYALAM VOWEL SIGN VOCALIC LL*/
+                                                     0, /* U+000d64: */
+                                                     0, /* U+000d65: */
+                                          RTUNI_DDIGIT, /* U+000d66: MALAYALAM DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000d67: MALAYALAM DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000d68: MALAYALAM DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000d69: MALAYALAM DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000d6a: MALAYALAM DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000d6b: MALAYALAM DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000d6c: MALAYALAM DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000d6d: MALAYALAM DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000d6e: MALAYALAM DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000d6f: MALAYALAM DIGIT NINE*/
+                                                     0, /* U+000d70: MALAYALAM NUMBER TEN*/
+                                                     0, /* U+000d71: MALAYALAM NUMBER ONE HUNDRED*/
+                                                     0, /* U+000d72: MALAYALAM NUMBER ONE THOUSAND*/
+                                                     0, /* U+000d73: MALAYALAM FRACTION ONE QUARTER*/
+                                                     0, /* U+000d74: MALAYALAM FRACTION ONE HALF*/
+                                                     0, /* U+000d75: MALAYALAM FRACTION THREE QUARTERS*/
+                                                     0, /* U+000d76: */
+                                                     0, /* U+000d77: */
+                                                     0, /* U+000d78: */
+                                                     0, /* U+000d79: MALAYALAM DATE MARK*/
+                                           RTUNI_ALPHA, /* U+000d7a: MALAYALAM LETTER CHILLU NN*/
+                                           RTUNI_ALPHA, /* U+000d7b: MALAYALAM LETTER CHILLU N*/
+                                           RTUNI_ALPHA, /* U+000d7c: MALAYALAM LETTER CHILLU RR*/
+                                           RTUNI_ALPHA, /* U+000d7d: MALAYALAM LETTER CHILLU L*/
+                                           RTUNI_ALPHA, /* U+000d7e: MALAYALAM LETTER CHILLU LL*/
+                                           RTUNI_ALPHA, /* U+000d7f: MALAYALAM LETTER CHILLU K*/
+                                                     0, /* U+000d80: */
+                                                     0, /* U+000d81: */
+                                           RTUNI_ALPHA, /* U+000d82: SINHALA SIGN ANUSVARAYA*/
+                                           RTUNI_ALPHA, /* U+000d83: SINHALA SIGN VISARGAYA*/
+                                                     0, /* U+000d84: */
+                                           RTUNI_ALPHA, /* U+000d85: SINHALA LETTER AYANNA*/
+                                           RTUNI_ALPHA, /* U+000d86: SINHALA LETTER AAYANNA*/
+                                           RTUNI_ALPHA, /* U+000d87: SINHALA LETTER AEYANNA*/
+                                           RTUNI_ALPHA, /* U+000d88: SINHALA LETTER AEEYANNA*/
+                                           RTUNI_ALPHA, /* U+000d89: SINHALA LETTER IYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8a: SINHALA LETTER IIYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8b: SINHALA LETTER UYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8c: SINHALA LETTER UUYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8d: SINHALA LETTER IRUYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8e: SINHALA LETTER IRUUYANNA*/
+                                           RTUNI_ALPHA, /* U+000d8f: SINHALA LETTER ILUYANNA*/
+                                           RTUNI_ALPHA, /* U+000d90: SINHALA LETTER ILUUYANNA*/
+                                           RTUNI_ALPHA, /* U+000d91: SINHALA LETTER EYANNA*/
+                                           RTUNI_ALPHA, /* U+000d92: SINHALA LETTER EEYANNA*/
+                                           RTUNI_ALPHA, /* U+000d93: SINHALA LETTER AIYANNA*/
+                                           RTUNI_ALPHA, /* U+000d94: SINHALA LETTER OYANNA*/
+                                           RTUNI_ALPHA, /* U+000d95: SINHALA LETTER OOYANNA*/
+                                           RTUNI_ALPHA, /* U+000d96: SINHALA LETTER AUYANNA*/
+                                                     0, /* U+000d97: */
+                                                     0, /* U+000d98: */
+                                                     0, /* U+000d99: */
+                                           RTUNI_ALPHA, /* U+000d9a: SINHALA LETTER ALPAPRAANA KAYANNA*/
+                                           RTUNI_ALPHA, /* U+000d9b: SINHALA LETTER MAHAAPRAANA KAYANNA*/
+                                           RTUNI_ALPHA, /* U+000d9c: SINHALA LETTER ALPAPRAANA GAYANNA*/
+                                           RTUNI_ALPHA, /* U+000d9d: SINHALA LETTER MAHAAPRAANA GAYANNA*/
+                                           RTUNI_ALPHA, /* U+000d9e: SINHALA LETTER KANTAJA NAASIKYAYA*/
+                                           RTUNI_ALPHA, /* U+000d9f: SINHALA LETTER SANYAKA GAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da0: SINHALA LETTER ALPAPRAANA CAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da1: SINHALA LETTER MAHAAPRAANA CAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da2: SINHALA LETTER ALPAPRAANA JAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da3: SINHALA LETTER MAHAAPRAANA JAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da4: SINHALA LETTER TAALUJA NAASIKYAYA*/
+                                           RTUNI_ALPHA, /* U+000da5: SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA*/
+                                           RTUNI_ALPHA, /* U+000da6: SINHALA LETTER SANYAKA JAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da7: SINHALA LETTER ALPAPRAANA TTAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da8: SINHALA LETTER MAHAAPRAANA TTAYANNA*/
+                                           RTUNI_ALPHA, /* U+000da9: SINHALA LETTER ALPAPRAANA DDAYANNA*/
+                                           RTUNI_ALPHA, /* U+000daa: SINHALA LETTER MAHAAPRAANA DDAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dab: SINHALA LETTER MUURDHAJA NAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dac: SINHALA LETTER SANYAKA DDAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dad: SINHALA LETTER ALPAPRAANA TAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dae: SINHALA LETTER MAHAAPRAANA TAYANNA*/
+                                           RTUNI_ALPHA, /* U+000daf: SINHALA LETTER ALPAPRAANA DAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db0: SINHALA LETTER MAHAAPRAANA DAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db1: SINHALA LETTER DANTAJA NAYANNA*/
+                                                     0, /* U+000db2: */
+                                           RTUNI_ALPHA, /* U+000db3: SINHALA LETTER SANYAKA DAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db4: SINHALA LETTER ALPAPRAANA PAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db5: SINHALA LETTER MAHAAPRAANA PAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db6: SINHALA LETTER ALPAPRAANA BAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db7: SINHALA LETTER MAHAAPRAANA BAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db8: SINHALA LETTER MAYANNA*/
+                                           RTUNI_ALPHA, /* U+000db9: SINHALA LETTER AMBA BAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dba: SINHALA LETTER YAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dbb: SINHALA LETTER RAYANNA*/
+                                                     0, /* U+000dbc: */
+                                           RTUNI_ALPHA, /* U+000dbd: SINHALA LETTER DANTAJA LAYANNA*/
+                                                     0, /* U+000dbe: */
+                                                     0, /* U+000dbf: */
+                                           RTUNI_ALPHA, /* U+000dc0: SINHALA LETTER VAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc1: SINHALA LETTER TAALUJA SAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc2: SINHALA LETTER MUURDHAJA SAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc3: SINHALA LETTER DANTAJA SAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc4: SINHALA LETTER HAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc5: SINHALA LETTER MUURDHAJA LAYANNA*/
+                                           RTUNI_ALPHA, /* U+000dc6: SINHALA LETTER FAYANNA*/
+                                                     0, /* U+000dc7: */
+                                                     0, /* U+000dc8: */
+                                                     0, /* U+000dc9: */
+                                                     0, /* U+000dca: SINHALA SIGN AL-LAKUNA*/
+                                                     0, /* U+000dcb: */
+                                                     0, /* U+000dcc: */
+                                                     0, /* U+000dcd: */
+                                                     0, /* U+000dce: */
+                                           RTUNI_ALPHA, /* U+000dcf: SINHALA VOWEL SIGN AELA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd0: SINHALA VOWEL SIGN KETTI AEDA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd1: SINHALA VOWEL SIGN DIGA AEDA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd2: SINHALA VOWEL SIGN KETTI IS-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd3: SINHALA VOWEL SIGN DIGA IS-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd4: SINHALA VOWEL SIGN KETTI PAA-PILLA*/
+                                                     0, /* U+000dd5: */
+                                           RTUNI_ALPHA, /* U+000dd6: SINHALA VOWEL SIGN DIGA PAA-PILLA*/
+                                                     0, /* U+000dd7: */
+                                           RTUNI_ALPHA, /* U+000dd8: SINHALA VOWEL SIGN GAETTA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dd9: SINHALA VOWEL SIGN KOMBUVA*/
+                                           RTUNI_ALPHA, /* U+000dda: SINHALA VOWEL SIGN DIGA KOMBUVA*/
+                                           RTUNI_ALPHA, /* U+000ddb: SINHALA VOWEL SIGN KOMBU DEKA*/
+                                           RTUNI_ALPHA, /* U+000ddc: SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000ddd: SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000dde: SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA*/
+                                           RTUNI_ALPHA, /* U+000ddf: SINHALA VOWEL SIGN GAYANUKITTA*/
+                                                     0, /* U+000de0: */
+                                                     0, /* U+000de1: */
+                                                     0, /* U+000de2: */
+                                                     0, /* U+000de3: */
+                                                     0, /* U+000de4: */
+                                                     0, /* U+000de5: */
+                                                     0, /* U+000de6: */
+                                                     0, /* U+000de7: */
+                                                     0, /* U+000de8: */
+                                                     0, /* U+000de9: */
+                                                     0, /* U+000dea: */
+                                                     0, /* U+000deb: */
+                                                     0, /* U+000dec: */
+                                                     0, /* U+000ded: */
+                                                     0, /* U+000dee: */
+                                                     0, /* U+000def: */
+                                                     0, /* U+000df0: */
+                                                     0, /* U+000df1: */
+                                           RTUNI_ALPHA, /* U+000df2: SINHALA VOWEL SIGN DIGA GAETTA-PILLA*/
+                                           RTUNI_ALPHA, /* U+000df3: SINHALA VOWEL SIGN DIGA GAYANUKITTA*/
+                                                     0, /* U+000df4: SINHALA PUNCTUATION KUNDDALIYA*/
+                                                     0, /* U+000df5: */
+                                                     0, /* U+000df6: */
+                                                     0, /* U+000df7: */
+                                                     0, /* U+000df8: */
+                                                     0, /* U+000df9: */
+                                                     0, /* U+000dfa: */
+                                                     0, /* U+000dfb: */
+                                                     0, /* U+000dfc: */
+                                                     0, /* U+000dfd: */
+                                                     0, /* U+000dfe: */
+                                                     0, /* U+000dff: */
+                                                     0, /* U+000e00: */
+                                           RTUNI_ALPHA, /* U+000e01: THAI CHARACTER KO KAI*/
+                                           RTUNI_ALPHA, /* U+000e02: THAI CHARACTER KHO KHAI*/
+                                           RTUNI_ALPHA, /* U+000e03: THAI CHARACTER KHO KHUAT*/
+                                           RTUNI_ALPHA, /* U+000e04: THAI CHARACTER KHO KHWAI*/
+                                           RTUNI_ALPHA, /* U+000e05: THAI CHARACTER KHO KHON*/
+                                           RTUNI_ALPHA, /* U+000e06: THAI CHARACTER KHO RAKHANG*/
+                                           RTUNI_ALPHA, /* U+000e07: THAI CHARACTER NGO NGU*/
+                                           RTUNI_ALPHA, /* U+000e08: THAI CHARACTER CHO CHAN*/
+                                           RTUNI_ALPHA, /* U+000e09: THAI CHARACTER CHO CHING*/
+                                           RTUNI_ALPHA, /* U+000e0a: THAI CHARACTER CHO CHANG*/
+                                           RTUNI_ALPHA, /* U+000e0b: THAI CHARACTER SO SO*/
+                                           RTUNI_ALPHA, /* U+000e0c: THAI CHARACTER CHO CHOE*/
+                                           RTUNI_ALPHA, /* U+000e0d: THAI CHARACTER YO YING*/
+                                           RTUNI_ALPHA, /* U+000e0e: THAI CHARACTER DO CHADA*/
+                                           RTUNI_ALPHA, /* U+000e0f: THAI CHARACTER TO PATAK*/
+                                           RTUNI_ALPHA, /* U+000e10: THAI CHARACTER THO THAN*/
+                                           RTUNI_ALPHA, /* U+000e11: THAI CHARACTER THO NANGMONTHO*/
+                                           RTUNI_ALPHA, /* U+000e12: THAI CHARACTER THO PHUTHAO*/
+                                           RTUNI_ALPHA, /* U+000e13: THAI CHARACTER NO NEN*/
+                                           RTUNI_ALPHA, /* U+000e14: THAI CHARACTER DO DEK*/
+                                           RTUNI_ALPHA, /* U+000e15: THAI CHARACTER TO TAO*/
+                                           RTUNI_ALPHA, /* U+000e16: THAI CHARACTER THO THUNG*/
+                                           RTUNI_ALPHA, /* U+000e17: THAI CHARACTER THO THAHAN*/
+                                           RTUNI_ALPHA, /* U+000e18: THAI CHARACTER THO THONG*/
+                                           RTUNI_ALPHA, /* U+000e19: THAI CHARACTER NO NU*/
+                                           RTUNI_ALPHA, /* U+000e1a: THAI CHARACTER BO BAIMAI*/
+                                           RTUNI_ALPHA, /* U+000e1b: THAI CHARACTER PO PLA*/
+                                           RTUNI_ALPHA, /* U+000e1c: THAI CHARACTER PHO PHUNG*/
+                                           RTUNI_ALPHA, /* U+000e1d: THAI CHARACTER FO FA*/
+                                           RTUNI_ALPHA, /* U+000e1e: THAI CHARACTER PHO PHAN*/
+                                           RTUNI_ALPHA, /* U+000e1f: THAI CHARACTER FO FAN*/
+                                           RTUNI_ALPHA, /* U+000e20: THAI CHARACTER PHO SAMPHAO*/
+                                           RTUNI_ALPHA, /* U+000e21: THAI CHARACTER MO MA*/
+                                           RTUNI_ALPHA, /* U+000e22: THAI CHARACTER YO YAK*/
+                                           RTUNI_ALPHA, /* U+000e23: THAI CHARACTER RO RUA*/
+                                           RTUNI_ALPHA, /* U+000e24: THAI CHARACTER RU*/
+                                           RTUNI_ALPHA, /* U+000e25: THAI CHARACTER LO LING*/
+                                           RTUNI_ALPHA, /* U+000e26: THAI CHARACTER LU*/
+                                           RTUNI_ALPHA, /* U+000e27: THAI CHARACTER WO WAEN*/
+                                           RTUNI_ALPHA, /* U+000e28: THAI CHARACTER SO SALA*/
+                                           RTUNI_ALPHA, /* U+000e29: THAI CHARACTER SO RUSI*/
+                                           RTUNI_ALPHA, /* U+000e2a: THAI CHARACTER SO SUA*/
+                                           RTUNI_ALPHA, /* U+000e2b: THAI CHARACTER HO HIP*/
+                                           RTUNI_ALPHA, /* U+000e2c: THAI CHARACTER LO CHULA*/
+                                           RTUNI_ALPHA, /* U+000e2d: THAI CHARACTER O ANG*/
+                                           RTUNI_ALPHA, /* U+000e2e: THAI CHARACTER HO NOKHUK*/
+                                           RTUNI_ALPHA, /* U+000e2f: THAI CHARACTER PAIYANNOI*/
+                                           RTUNI_ALPHA, /* U+000e30: THAI CHARACTER SARA A*/
+                                           RTUNI_ALPHA, /* U+000e31: THAI CHARACTER MAI HAN-AKAT*/
+                                           RTUNI_ALPHA, /* U+000e32: THAI CHARACTER SARA AA*/
+                                           RTUNI_ALPHA, /* U+000e33: THAI CHARACTER SARA AM*/
+                                           RTUNI_ALPHA, /* U+000e34: THAI CHARACTER SARA I*/
+                                           RTUNI_ALPHA, /* U+000e35: THAI CHARACTER SARA II*/
+                                           RTUNI_ALPHA, /* U+000e36: THAI CHARACTER SARA UE*/
+                                           RTUNI_ALPHA, /* U+000e37: THAI CHARACTER SARA UEE*/
+                                           RTUNI_ALPHA, /* U+000e38: THAI CHARACTER SARA U*/
+                                           RTUNI_ALPHA, /* U+000e39: THAI CHARACTER SARA UU*/
+                                           RTUNI_ALPHA, /* U+000e3a: THAI CHARACTER PHINTHU*/
+                                                     0, /* U+000e3b: */
+                                                     0, /* U+000e3c: */
+                                                     0, /* U+000e3d: */
+                                                     0, /* U+000e3e: */
+                                                     0, /* U+000e3f: THAI CURRENCY SYMBOL BAHT*/
+                                           RTUNI_ALPHA, /* U+000e40: THAI CHARACTER SARA E*/
+                                           RTUNI_ALPHA, /* U+000e41: THAI CHARACTER SARA AE*/
+                                           RTUNI_ALPHA, /* U+000e42: THAI CHARACTER SARA O*/
+                                           RTUNI_ALPHA, /* U+000e43: THAI CHARACTER SARA AI MAIMUAN*/
+                                           RTUNI_ALPHA, /* U+000e44: THAI CHARACTER SARA AI MAIMALAI*/
+                                           RTUNI_ALPHA, /* U+000e45: THAI CHARACTER LAKKHANGYAO*/
+                                           RTUNI_ALPHA, /* U+000e46: THAI CHARACTER MAIYAMOK*/
+                                                     0, /* U+000e47: THAI CHARACTER MAITAIKHU*/
+                                                     0, /* U+000e48: THAI CHARACTER MAI EK*/
+                                                     0, /* U+000e49: THAI CHARACTER MAI THO*/
+                                                     0, /* U+000e4a: THAI CHARACTER MAI TRI*/
+                                                     0, /* U+000e4b: THAI CHARACTER MAI CHATTAWA*/
+                                                     0, /* U+000e4c: THAI CHARACTER THANTHAKHAT*/
+                                           RTUNI_ALPHA, /* U+000e4d: THAI CHARACTER NIKHAHIT*/
+                                                     0, /* U+000e4e: THAI CHARACTER YAMAKKAN*/
+                                                     0, /* U+000e4f: THAI CHARACTER FONGMAN*/
+                                          RTUNI_DDIGIT, /* U+000e50: THAI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000e51: THAI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000e52: THAI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000e53: THAI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000e54: THAI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000e55: THAI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000e56: THAI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000e57: THAI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000e58: THAI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000e59: THAI DIGIT NINE*/
+                                                     0, /* U+000e5a: THAI CHARACTER ANGKHANKHU*/
+                                                     0, /* U+000e5b: THAI CHARACTER KHOMUT*/
+                                                     0, /* U+000e5c: */
+                                                     0, /* U+000e5d: */
+                                                     0, /* U+000e5e: */
+                                                     0, /* U+000e5f: */
+                                                     0, /* U+000e60: */
+                                                     0, /* U+000e61: */
+                                                     0, /* U+000e62: */
+                                                     0, /* U+000e63: */
+                                                     0, /* U+000e64: */
+                                                     0, /* U+000e65: */
+                                                     0, /* U+000e66: */
+                                                     0, /* U+000e67: */
+                                                     0, /* U+000e68: */
+                                                     0, /* U+000e69: */
+                                                     0, /* U+000e6a: */
+                                                     0, /* U+000e6b: */
+                                                     0, /* U+000e6c: */
+                                                     0, /* U+000e6d: */
+                                                     0, /* U+000e6e: */
+                                                     0, /* U+000e6f: */
+                                                     0, /* U+000e70: */
+                                                     0, /* U+000e71: */
+                                                     0, /* U+000e72: */
+                                                     0, /* U+000e73: */
+                                                     0, /* U+000e74: */
+                                                     0, /* U+000e75: */
+                                                     0, /* U+000e76: */
+                                                     0, /* U+000e77: */
+                                                     0, /* U+000e78: */
+                                                     0, /* U+000e79: */
+                                                     0, /* U+000e7a: */
+                                                     0, /* U+000e7b: */
+                                                     0, /* U+000e7c: */
+                                                     0, /* U+000e7d: */
+                                                     0, /* U+000e7e: */
+                                                     0, /* U+000e7f: */
+                                                     0, /* U+000e80: */
+                                           RTUNI_ALPHA, /* U+000e81: LAO LETTER KO*/
+                                           RTUNI_ALPHA, /* U+000e82: LAO LETTER KHO SUNG*/
+                                                     0, /* U+000e83: */
+                                           RTUNI_ALPHA, /* U+000e84: LAO LETTER KHO TAM*/
+                                                     0, /* U+000e85: */
+                                                     0, /* U+000e86: */
+                                           RTUNI_ALPHA, /* U+000e87: LAO LETTER NGO*/
+                                           RTUNI_ALPHA, /* U+000e88: LAO LETTER CO*/
+                                                     0, /* U+000e89: */
+                                           RTUNI_ALPHA, /* U+000e8a: LAO LETTER SO TAM*/
+                                                     0, /* U+000e8b: */
+                                                     0, /* U+000e8c: */
+                                           RTUNI_ALPHA, /* U+000e8d: LAO LETTER NYO*/
+                                                     0, /* U+000e8e: */
+                                                     0, /* U+000e8f: */
+                                                     0, /* U+000e90: */
+                                                     0, /* U+000e91: */
+                                                     0, /* U+000e92: */
+                                                     0, /* U+000e93: */
+                                           RTUNI_ALPHA, /* U+000e94: LAO LETTER DO*/
+                                           RTUNI_ALPHA, /* U+000e95: LAO LETTER TO*/
+                                           RTUNI_ALPHA, /* U+000e96: LAO LETTER THO SUNG*/
+                                           RTUNI_ALPHA, /* U+000e97: LAO LETTER THO TAM*/
+                                                     0, /* U+000e98: */
+                                           RTUNI_ALPHA, /* U+000e99: LAO LETTER NO*/
+                                           RTUNI_ALPHA, /* U+000e9a: LAO LETTER BO*/
+                                           RTUNI_ALPHA, /* U+000e9b: LAO LETTER PO*/
+                                           RTUNI_ALPHA, /* U+000e9c: LAO LETTER PHO SUNG*/
+                                           RTUNI_ALPHA, /* U+000e9d: LAO LETTER FO TAM*/
+                                           RTUNI_ALPHA, /* U+000e9e: LAO LETTER PHO TAM*/
+                                           RTUNI_ALPHA, /* U+000e9f: LAO LETTER FO SUNG*/
+                                                     0, /* U+000ea0: */
+                                           RTUNI_ALPHA, /* U+000ea1: LAO LETTER MO*/
+                                           RTUNI_ALPHA, /* U+000ea2: LAO LETTER YO*/
+                                           RTUNI_ALPHA, /* U+000ea3: LAO LETTER LO LING*/
+                                                     0, /* U+000ea4: */
+                                           RTUNI_ALPHA, /* U+000ea5: LAO LETTER LO LOOT*/
+                                                     0, /* U+000ea6: */
+                                           RTUNI_ALPHA, /* U+000ea7: LAO LETTER WO*/
+                                                     0, /* U+000ea8: */
+                                                     0, /* U+000ea9: */
+                                           RTUNI_ALPHA, /* U+000eaa: LAO LETTER SO SUNG*/
+                                           RTUNI_ALPHA, /* U+000eab: LAO LETTER HO SUNG*/
+                                                     0, /* U+000eac: */
+                                           RTUNI_ALPHA, /* U+000ead: LAO LETTER O*/
+                                           RTUNI_ALPHA, /* U+000eae: LAO LETTER HO TAM*/
+                                           RTUNI_ALPHA, /* U+000eaf: LAO ELLIPSIS*/
+                                           RTUNI_ALPHA, /* U+000eb0: LAO VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+000eb1: LAO VOWEL SIGN MAI KAN*/
+                                           RTUNI_ALPHA, /* U+000eb2: LAO VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000eb3: LAO VOWEL SIGN AM*/
+                                           RTUNI_ALPHA, /* U+000eb4: LAO VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000eb5: LAO VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000eb6: LAO VOWEL SIGN Y*/
+                                           RTUNI_ALPHA, /* U+000eb7: LAO VOWEL SIGN YY*/
+                                           RTUNI_ALPHA, /* U+000eb8: LAO VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000eb9: LAO VOWEL SIGN UU*/
+                                                     0, /* U+000eba: */
+                                           RTUNI_ALPHA, /* U+000ebb: LAO VOWEL SIGN MAI KON*/
+                                           RTUNI_ALPHA, /* U+000ebc: LAO SEMIVOWEL SIGN LO*/
+                                           RTUNI_ALPHA, /* U+000ebd: LAO SEMIVOWEL SIGN NYO*/
+                                                     0, /* U+000ebe: */
+                                                     0, /* U+000ebf: */
+                                           RTUNI_ALPHA, /* U+000ec0: LAO VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000ec1: LAO VOWEL SIGN EI*/
+                                           RTUNI_ALPHA, /* U+000ec2: LAO VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000ec3: LAO VOWEL SIGN AY*/
+                                           RTUNI_ALPHA, /* U+000ec4: LAO VOWEL SIGN AI*/
+                                                     0, /* U+000ec5: */
+                                           RTUNI_ALPHA, /* U+000ec6: LAO KO LA*/
+                                                     0, /* U+000ec7: */
+                                                     0, /* U+000ec8: LAO TONE MAI EK*/
+                                                     0, /* U+000ec9: LAO TONE MAI THO*/
+                                                     0, /* U+000eca: LAO TONE MAI TI*/
+                                                     0, /* U+000ecb: LAO TONE MAI CATAWA*/
+                                                     0, /* U+000ecc: LAO CANCELLATION MARK*/
+                                           RTUNI_ALPHA, /* U+000ecd: LAO NIGGAHITA*/
+                                                     0, /* U+000ece: */
+                                                     0, /* U+000ecf: */
+                                          RTUNI_DDIGIT, /* U+000ed0: LAO DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000ed1: LAO DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000ed2: LAO DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000ed3: LAO DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000ed4: LAO DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000ed5: LAO DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000ed6: LAO DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000ed7: LAO DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000ed8: LAO DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000ed9: LAO DIGIT NINE*/
+                                                     0, /* U+000eda: */
+                                                     0, /* U+000edb: */
+                                           RTUNI_ALPHA, /* U+000edc: LAO HO NO*/
+                                           RTUNI_ALPHA, /* U+000edd: LAO HO MO*/
+                                           RTUNI_ALPHA, /* U+000ede: LAO LETTER KHMU GO*/
+                                           RTUNI_ALPHA, /* U+000edf: LAO LETTER KHMU NYO*/
+                                                     0, /* U+000ee0: */
+                                                     0, /* U+000ee1: */
+                                                     0, /* U+000ee2: */
+                                                     0, /* U+000ee3: */
+                                                     0, /* U+000ee4: */
+                                                     0, /* U+000ee5: */
+                                                     0, /* U+000ee6: */
+                                                     0, /* U+000ee7: */
+                                                     0, /* U+000ee8: */
+                                                     0, /* U+000ee9: */
+                                                     0, /* U+000eea: */
+                                                     0, /* U+000eeb: */
+                                                     0, /* U+000eec: */
+                                                     0, /* U+000eed: */
+                                                     0, /* U+000eee: */
+                                                     0, /* U+000eef: */
+                                                     0, /* U+000ef0: */
+                                                     0, /* U+000ef1: */
+                                                     0, /* U+000ef2: */
+                                                     0, /* U+000ef3: */
+                                                     0, /* U+000ef4: */
+                                                     0, /* U+000ef5: */
+                                                     0, /* U+000ef6: */
+                                                     0, /* U+000ef7: */
+                                                     0, /* U+000ef8: */
+                                                     0, /* U+000ef9: */
+                                                     0, /* U+000efa: */
+                                                     0, /* U+000efb: */
+                                                     0, /* U+000efc: */
+                                                     0, /* U+000efd: */
+                                                     0, /* U+000efe: */
+                                                     0, /* U+000eff: */
+                                           RTUNI_ALPHA, /* U+000f00: TIBETAN SYLLABLE OM*/
+                                                     0, /* U+000f01: TIBETAN MARK GTER YIG MGO TRUNCATED A*/
+                                                     0, /* U+000f02: TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA*/
+                                                     0, /* U+000f03: TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA*/
+                                                     0, /* U+000f04: TIBETAN MARK INITIAL YIG MGO MDUN MA*/
+                                                     0, /* U+000f05: TIBETAN MARK CLOSING YIG MGO SGAB MA*/
+                                                     0, /* U+000f06: TIBETAN MARK CARET YIG MGO PHUR SHAD MA*/
+                                                     0, /* U+000f07: TIBETAN MARK YIG MGO TSHEG SHAD MA*/
+                                                     0, /* U+000f08: TIBETAN MARK SBRUL SHAD*/
+                                                     0, /* U+000f09: TIBETAN MARK BSKUR YIG MGO*/
+                                                     0, /* U+000f0a: TIBETAN MARK BKA- SHOG YIG MGO*/
+                                                     0, /* U+000f0b: TIBETAN MARK INTERSYLLABIC TSHEG*/
+                                                     0, /* U+000f0c: TIBETAN MARK DELIMITER TSHEG BSTAR*/
+                                                     0, /* U+000f0d: TIBETAN MARK SHAD*/
+                                                     0, /* U+000f0e: TIBETAN MARK NYIS SHAD*/
+                                                     0, /* U+000f0f: TIBETAN MARK TSHEG SHAD*/
+                                                     0, /* U+000f10: TIBETAN MARK NYIS TSHEG SHAD*/
+                                                     0, /* U+000f11: TIBETAN MARK RIN CHEN SPUNGS SHAD*/
+                                                     0, /* U+000f12: TIBETAN MARK RGYA GRAM SHAD*/
+                                                     0, /* U+000f13: TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN*/
+                                                     0, /* U+000f14: TIBETAN MARK GTER TSHEG*/
+                                                     0, /* U+000f15: TIBETAN LOGOTYPE SIGN CHAD RTAGS*/
+                                                     0, /* U+000f16: TIBETAN LOGOTYPE SIGN LHAG RTAGS*/
+                                                     0, /* U+000f17: TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS*/
+                                                     0, /* U+000f18: TIBETAN ASTROLOGICAL SIGN -KHYUD PA*/
+                                                     0, /* U+000f19: TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS*/
+                                                     0, /* U+000f1a: TIBETAN SIGN RDEL DKAR GCIG*/
+                                                     0, /* U+000f1b: TIBETAN SIGN RDEL DKAR GNYIS*/
+                                                     0, /* U+000f1c: TIBETAN SIGN RDEL DKAR GSUM*/
+                                                     0, /* U+000f1d: TIBETAN SIGN RDEL NAG GCIG*/
+                                                     0, /* U+000f1e: TIBETAN SIGN RDEL NAG GNYIS*/
+                                                     0, /* U+000f1f: TIBETAN SIGN RDEL DKAR RDEL NAG*/
+                                          RTUNI_DDIGIT, /* U+000f20: TIBETAN DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+000f21: TIBETAN DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+000f22: TIBETAN DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+000f23: TIBETAN DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+000f24: TIBETAN DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+000f25: TIBETAN DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+000f26: TIBETAN DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+000f27: TIBETAN DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+000f28: TIBETAN DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+000f29: TIBETAN DIGIT NINE*/
+                                                     0, /* U+000f2a: TIBETAN DIGIT HALF ONE*/
+                                                     0, /* U+000f2b: TIBETAN DIGIT HALF TWO*/
+                                                     0, /* U+000f2c: TIBETAN DIGIT HALF THREE*/
+                                                     0, /* U+000f2d: TIBETAN DIGIT HALF FOUR*/
+                                                     0, /* U+000f2e: TIBETAN DIGIT HALF FIVE*/
+                                                     0, /* U+000f2f: TIBETAN DIGIT HALF SIX*/
+                                                     0, /* U+000f30: TIBETAN DIGIT HALF SEVEN*/
+                                                     0, /* U+000f31: TIBETAN DIGIT HALF EIGHT*/
+                                                     0, /* U+000f32: TIBETAN DIGIT HALF NINE*/
+                                                     0, /* U+000f33: TIBETAN DIGIT HALF ZERO*/
+                                                     0, /* U+000f34: TIBETAN MARK BSDUS RTAGS*/
+                                                     0, /* U+000f35: TIBETAN MARK NGAS BZUNG NYI ZLA*/
+                                                     0, /* U+000f36: TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN*/
+                                                     0, /* U+000f37: TIBETAN MARK NGAS BZUNG SGOR RTAGS*/
+                                                     0, /* U+000f38: TIBETAN MARK CHE MGO*/
+                                                     0, /* U+000f39: TIBETAN MARK TSA -PHRU*/
+                                                     0, /* U+000f3a: TIBETAN MARK GUG RTAGS GYON*/
+                                                     0, /* U+000f3b: TIBETAN MARK GUG RTAGS GYAS*/
+                                                     0, /* U+000f3c: TIBETAN MARK ANG KHANG GYON*/
+                                                     0, /* U+000f3d: TIBETAN MARK ANG KHANG GYAS*/
+                                                     0, /* U+000f3e: TIBETAN SIGN YAR TSHES*/
+                                                     0, /* U+000f3f: TIBETAN SIGN MAR TSHES*/
+                                           RTUNI_ALPHA, /* U+000f40: TIBETAN LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000f41: TIBETAN LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000f42: TIBETAN LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000f43: TIBETAN LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000f44: TIBETAN LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000f45: TIBETAN LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000f46: TIBETAN LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000f47: TIBETAN LETTER JA*/
+                                                     0, /* U+000f48: */
+                                           RTUNI_ALPHA, /* U+000f49: TIBETAN LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000f4a: TIBETAN LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000f4b: TIBETAN LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000f4c: TIBETAN LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000f4d: TIBETAN LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000f4e: TIBETAN LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000f4f: TIBETAN LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000f50: TIBETAN LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000f51: TIBETAN LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000f52: TIBETAN LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000f53: TIBETAN LETTER NA*/
+                                           RTUNI_ALPHA, /* U+000f54: TIBETAN LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000f55: TIBETAN LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000f56: TIBETAN LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000f57: TIBETAN LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000f58: TIBETAN LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000f59: TIBETAN LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+000f5a: TIBETAN LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+000f5b: TIBETAN LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+000f5c: TIBETAN LETTER DZHA*/
+                                           RTUNI_ALPHA, /* U+000f5d: TIBETAN LETTER WA*/
+                                           RTUNI_ALPHA, /* U+000f5e: TIBETAN LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+000f5f: TIBETAN LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+000f60: TIBETAN LETTER -A*/
+                                           RTUNI_ALPHA, /* U+000f61: TIBETAN LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000f62: TIBETAN LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000f63: TIBETAN LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000f64: TIBETAN LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000f65: TIBETAN LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000f66: TIBETAN LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000f67: TIBETAN LETTER HA*/
+                                           RTUNI_ALPHA, /* U+000f68: TIBETAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+000f69: TIBETAN LETTER KSSA*/
+                                           RTUNI_ALPHA, /* U+000f6a: TIBETAN LETTER FIXED-FORM RA*/
+                                           RTUNI_ALPHA, /* U+000f6b: TIBETAN LETTER KKA*/
+                                           RTUNI_ALPHA, /* U+000f6c: TIBETAN LETTER RRA*/
+                                                     0, /* U+000f6d: */
+                                                     0, /* U+000f6e: */
+                                                     0, /* U+000f6f: */
+                                                     0, /* U+000f70: */
+                                           RTUNI_ALPHA, /* U+000f71: TIBETAN VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+000f72: TIBETAN VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+000f73: TIBETAN VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+000f74: TIBETAN VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+000f75: TIBETAN VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+000f76: TIBETAN VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+000f77: TIBETAN VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+000f78: TIBETAN VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+000f79: TIBETAN VOWEL SIGN VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+000f7a: TIBETAN VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+000f7b: TIBETAN VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+000f7c: TIBETAN VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+000f7d: TIBETAN VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+000f7e: TIBETAN SIGN RJES SU NGA RO*/
+                                           RTUNI_ALPHA, /* U+000f7f: TIBETAN SIGN RNAM BCAD*/
+                                           RTUNI_ALPHA, /* U+000f80: TIBETAN VOWEL SIGN REVERSED I*/
+                                           RTUNI_ALPHA, /* U+000f81: TIBETAN VOWEL SIGN REVERSED II*/
+                                                     0, /* U+000f82: TIBETAN SIGN NYI ZLA NAA DA*/
+                                                     0, /* U+000f83: TIBETAN SIGN SNA LDAN*/
+                                                     0, /* U+000f84: TIBETAN MARK HALANTA*/
+                                                     0, /* U+000f85: TIBETAN MARK PALUTA*/
+                                                     0, /* U+000f86: TIBETAN SIGN LCI RTAGS*/
+                                                     0, /* U+000f87: TIBETAN SIGN YANG RTAGS*/
+                                           RTUNI_ALPHA, /* U+000f88: TIBETAN SIGN LCE TSA CAN*/
+                                           RTUNI_ALPHA, /* U+000f89: TIBETAN SIGN MCHU CAN*/
+                                           RTUNI_ALPHA, /* U+000f8a: TIBETAN SIGN GRU CAN RGYINGS*/
+                                           RTUNI_ALPHA, /* U+000f8b: TIBETAN SIGN GRU MED RGYINGS*/
+                                           RTUNI_ALPHA, /* U+000f8c: TIBETAN SIGN INVERTED MCHU CAN*/
+                                           RTUNI_ALPHA, /* U+000f8d: TIBETAN SUBJOINED SIGN LCE TSA CAN*/
+                                           RTUNI_ALPHA, /* U+000f8e: TIBETAN SUBJOINED SIGN MCHU CAN*/
+                                           RTUNI_ALPHA, /* U+000f8f: TIBETAN SUBJOINED SIGN INVERTED MCHU CAN*/
+                                           RTUNI_ALPHA, /* U+000f90: TIBETAN SUBJOINED LETTER KA*/
+                                           RTUNI_ALPHA, /* U+000f91: TIBETAN SUBJOINED LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+000f92: TIBETAN SUBJOINED LETTER GA*/
+                                           RTUNI_ALPHA, /* U+000f93: TIBETAN SUBJOINED LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+000f94: TIBETAN SUBJOINED LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+000f95: TIBETAN SUBJOINED LETTER CA*/
+                                           RTUNI_ALPHA, /* U+000f96: TIBETAN SUBJOINED LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+000f97: TIBETAN SUBJOINED LETTER JA*/
+                                                     0, /* U+000f98: */
+                                           RTUNI_ALPHA, /* U+000f99: TIBETAN SUBJOINED LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+000f9a: TIBETAN SUBJOINED LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+000f9b: TIBETAN SUBJOINED LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+000f9c: TIBETAN SUBJOINED LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+000f9d: TIBETAN SUBJOINED LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+000f9e: TIBETAN SUBJOINED LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+000f9f: TIBETAN SUBJOINED LETTER TA*/
+                                           RTUNI_ALPHA, /* U+000fa0: TIBETAN SUBJOINED LETTER THA*/
+                                           RTUNI_ALPHA, /* U+000fa1: TIBETAN SUBJOINED LETTER DA*/
+                                           RTUNI_ALPHA, /* U+000fa2: TIBETAN SUBJOINED LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+000fa3: TIBETAN SUBJOINED LETTER NA*/
+                                           RTUNI_ALPHA, /* U+000fa4: TIBETAN SUBJOINED LETTER PA*/
+                                           RTUNI_ALPHA, /* U+000fa5: TIBETAN SUBJOINED LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+000fa6: TIBETAN SUBJOINED LETTER BA*/
+                                           RTUNI_ALPHA, /* U+000fa7: TIBETAN SUBJOINED LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+000fa8: TIBETAN SUBJOINED LETTER MA*/
+                                           RTUNI_ALPHA, /* U+000fa9: TIBETAN SUBJOINED LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+000faa: TIBETAN SUBJOINED LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+000fab: TIBETAN SUBJOINED LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+000fac: TIBETAN SUBJOINED LETTER DZHA*/
+                                           RTUNI_ALPHA, /* U+000fad: TIBETAN SUBJOINED LETTER WA*/
+                                           RTUNI_ALPHA, /* U+000fae: TIBETAN SUBJOINED LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+000faf: TIBETAN SUBJOINED LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+000fb0: TIBETAN SUBJOINED LETTER -A*/
+                                           RTUNI_ALPHA, /* U+000fb1: TIBETAN SUBJOINED LETTER YA*/
+                                           RTUNI_ALPHA, /* U+000fb2: TIBETAN SUBJOINED LETTER RA*/
+                                           RTUNI_ALPHA, /* U+000fb3: TIBETAN SUBJOINED LETTER LA*/
+                                           RTUNI_ALPHA, /* U+000fb4: TIBETAN SUBJOINED LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+000fb5: TIBETAN SUBJOINED LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+000fb6: TIBETAN SUBJOINED LETTER SA*/
+                                           RTUNI_ALPHA, /* U+000fb7: TIBETAN SUBJOINED LETTER HA*/
+                                           RTUNI_ALPHA, /* U+000fb8: TIBETAN SUBJOINED LETTER A*/
+                                           RTUNI_ALPHA, /* U+000fb9: TIBETAN SUBJOINED LETTER KSSA*/
+                                           RTUNI_ALPHA, /* U+000fba: TIBETAN SUBJOINED LETTER FIXED-FORM WA*/
+                                           RTUNI_ALPHA, /* U+000fbb: TIBETAN SUBJOINED LETTER FIXED-FORM YA*/
+                                           RTUNI_ALPHA, /* U+000fbc: TIBETAN SUBJOINED LETTER FIXED-FORM RA*/
+                                                     0, /* U+000fbd: */
+                                                     0, /* U+000fbe: TIBETAN KU RU KHA*/
+                                                     0, /* U+000fbf: TIBETAN KU RU KHA BZHI MIG CAN*/
+                                                     0, /* U+000fc0: TIBETAN CANTILLATION SIGN HEAVY BEAT*/
+                                                     0, /* U+000fc1: TIBETAN CANTILLATION SIGN LIGHT BEAT*/
+                                                     0, /* U+000fc2: TIBETAN CANTILLATION SIGN CANG TE-U*/
+                                                     0, /* U+000fc3: TIBETAN CANTILLATION SIGN SBUB -CHAL*/
+                                                     0, /* U+000fc4: TIBETAN SYMBOL DRIL BU*/
+                                                     0, /* U+000fc5: TIBETAN SYMBOL RDO RJE*/
+                                                     0, /* U+000fc6: TIBETAN SYMBOL PADMA GDAN*/
+                                                     0, /* U+000fc7: TIBETAN SYMBOL RDO RJE RGYA GRAM*/
+                                                     0, /* U+000fc8: TIBETAN SYMBOL PHUR PA*/
+                                                     0, /* U+000fc9: TIBETAN SYMBOL NOR BU*/
+                                                     0, /* U+000fca: TIBETAN SYMBOL NOR BU NYIS -KHYIL*/
+                                                     0, /* U+000fcb: TIBETAN SYMBOL NOR BU GSUM -KHYIL*/
+                                                     0, /* U+000fcc: TIBETAN SYMBOL NOR BU BZHI -KHYIL*/
+                                                     0, /* U+000fcd: */
+                                                     0, /* U+000fce: TIBETAN SIGN RDEL NAG RDEL DKAR*/
+                                                     0, /* U+000fcf: TIBETAN SIGN RDEL NAG GSUM*/
+                                                     0, /* U+000fd0: TIBETAN MARK BSKA- SHOG GI MGO RGYAN*/
+                                                     0, /* U+000fd1: TIBETAN MARK MNYAM YIG GI MGO RGYAN*/
+                                                     0, /* U+000fd2: TIBETAN MARK NYIS TSHEG*/
+                                                     0, /* U+000fd3: TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA*/
+                                                     0, /* U+000fd4: TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA*/
+                                                     0, /* U+000fd5: RIGHT-FACING SVASTI SIGN*/
+                                                     0, /* U+000fd6: LEFT-FACING SVASTI SIGN*/
+                                                     0, /* U+000fd7: RIGHT-FACING SVASTI SIGN WITH DOTS*/
+                                                     0, /* U+000fd8: LEFT-FACING SVASTI SIGN WITH DOTS*/
+                                                     0, /* U+000fd9: TIBETAN MARK LEADING MCHAN RTAGS*/
+                                                     0, /* U+000fda: TIBETAN MARK TRAILING MCHAN RTAGS*/
+                                                     0, /* U+000fdb: */
+                                                     0, /* U+000fdc: */
+                                                     0, /* U+000fdd: */
+                                                     0, /* U+000fde: */
+                                                     0, /* U+000fdf: */
+                                                     0, /* U+000fe0: */
+                                                     0, /* U+000fe1: */
+                                                     0, /* U+000fe2: */
+                                                     0, /* U+000fe3: */
+                                                     0, /* U+000fe4: */
+                                                     0, /* U+000fe5: */
+                                                     0, /* U+000fe6: */
+                                                     0, /* U+000fe7: */
+                                                     0, /* U+000fe8: */
+                                                     0, /* U+000fe9: */
+                                                     0, /* U+000fea: */
+                                                     0, /* U+000feb: */
+                                                     0, /* U+000fec: */
+                                                     0, /* U+000fed: */
+                                                     0, /* U+000fee: */
+                                                     0, /* U+000fef: */
+                                                     0, /* U+000ff0: */
+                                                     0, /* U+000ff1: */
+                                                     0, /* U+000ff2: */
+                                                     0, /* U+000ff3: */
+                                                     0, /* U+000ff4: */
+                                                     0, /* U+000ff5: */
+                                                     0, /* U+000ff6: */
+                                                     0, /* U+000ff7: */
+                                                     0, /* U+000ff8: */
+                                                     0, /* U+000ff9: */
+                                                     0, /* U+000ffa: */
+                                                     0, /* U+000ffb: */
+                                                     0, /* U+000ffc: */
+                                                     0, /* U+000ffd: */
+                                                     0, /* U+000ffe: */
+                                                     0, /* U+000fff: */
+                                           RTUNI_ALPHA, /* U+001000: MYANMAR LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001001: MYANMAR LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001002: MYANMAR LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001003: MYANMAR LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+001004: MYANMAR LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001005: MYANMAR LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001006: MYANMAR LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+001007: MYANMAR LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001008: MYANMAR LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+001009: MYANMAR LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00100a: MYANMAR LETTER NNYA*/
+                                           RTUNI_ALPHA, /* U+00100b: MYANMAR LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+00100c: MYANMAR LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+00100d: MYANMAR LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00100e: MYANMAR LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+00100f: MYANMAR LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+001010: MYANMAR LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001011: MYANMAR LETTER THA*/
+                                           RTUNI_ALPHA, /* U+001012: MYANMAR LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001013: MYANMAR LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+001014: MYANMAR LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001015: MYANMAR LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001016: MYANMAR LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+001017: MYANMAR LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001018: MYANMAR LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+001019: MYANMAR LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00101a: MYANMAR LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00101b: MYANMAR LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00101c: MYANMAR LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00101d: MYANMAR LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00101e: MYANMAR LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00101f: MYANMAR LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001020: MYANMAR LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+001021: MYANMAR LETTER A*/
+                                           RTUNI_ALPHA, /* U+001022: MYANMAR LETTER SHAN A*/
+                                           RTUNI_ALPHA, /* U+001023: MYANMAR LETTER I*/
+                                           RTUNI_ALPHA, /* U+001024: MYANMAR LETTER II*/
+                                           RTUNI_ALPHA, /* U+001025: MYANMAR LETTER U*/
+                                           RTUNI_ALPHA, /* U+001026: MYANMAR LETTER UU*/
+                                           RTUNI_ALPHA, /* U+001027: MYANMAR LETTER E*/
+                                           RTUNI_ALPHA, /* U+001028: MYANMAR LETTER MON E*/
+                                           RTUNI_ALPHA, /* U+001029: MYANMAR LETTER O*/
+                                           RTUNI_ALPHA, /* U+00102a: MYANMAR LETTER AU*/
+                                           RTUNI_ALPHA, /* U+00102b: MYANMAR VOWEL SIGN TALL AA*/
+                                           RTUNI_ALPHA, /* U+00102c: MYANMAR VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+00102d: MYANMAR VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00102e: MYANMAR VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+00102f: MYANMAR VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001030: MYANMAR VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+001031: MYANMAR VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001032: MYANMAR VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+001033: MYANMAR VOWEL SIGN MON II*/
+                                           RTUNI_ALPHA, /* U+001034: MYANMAR VOWEL SIGN MON O*/
+                                           RTUNI_ALPHA, /* U+001035: MYANMAR VOWEL SIGN E ABOVE*/
+                                           RTUNI_ALPHA, /* U+001036: MYANMAR SIGN ANUSVARA*/
+                                                     0, /* U+001037: MYANMAR SIGN DOT BELOW*/
+                                           RTUNI_ALPHA, /* U+001038: MYANMAR SIGN VISARGA*/
+                                                     0, /* U+001039: MYANMAR SIGN VIRAMA*/
+                                                     0, /* U+00103a: MYANMAR SIGN ASAT*/
+                                           RTUNI_ALPHA, /* U+00103b: MYANMAR CONSONANT SIGN MEDIAL YA*/
+                                           RTUNI_ALPHA, /* U+00103c: MYANMAR CONSONANT SIGN MEDIAL RA*/
+                                           RTUNI_ALPHA, /* U+00103d: MYANMAR CONSONANT SIGN MEDIAL WA*/
+                                           RTUNI_ALPHA, /* U+00103e: MYANMAR CONSONANT SIGN MEDIAL HA*/
+                                           RTUNI_ALPHA, /* U+00103f: MYANMAR LETTER GREAT SA*/
+                                          RTUNI_DDIGIT, /* U+001040: MYANMAR DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001041: MYANMAR DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001042: MYANMAR DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001043: MYANMAR DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001044: MYANMAR DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001045: MYANMAR DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001046: MYANMAR DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001047: MYANMAR DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001048: MYANMAR DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001049: MYANMAR DIGIT NINE*/
+                                                     0, /* U+00104a: MYANMAR SIGN LITTLE SECTION*/
+                                                     0, /* U+00104b: MYANMAR SIGN SECTION*/
+                                                     0, /* U+00104c: MYANMAR SYMBOL LOCATIVE*/
+                                                     0, /* U+00104d: MYANMAR SYMBOL COMPLETED*/
+                                                     0, /* U+00104e: MYANMAR SYMBOL AFOREMENTIONED*/
+                                                     0, /* U+00104f: MYANMAR SYMBOL GENITIVE*/
+                                           RTUNI_ALPHA, /* U+001050: MYANMAR LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+001051: MYANMAR LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+001052: MYANMAR LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+001053: MYANMAR LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+001054: MYANMAR LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+001055: MYANMAR LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+001056: MYANMAR VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+001057: MYANMAR VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+001058: MYANMAR VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+001059: MYANMAR VOWEL SIGN VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+00105a: MYANMAR LETTER MON NGA*/
+                                           RTUNI_ALPHA, /* U+00105b: MYANMAR LETTER MON JHA*/
+                                           RTUNI_ALPHA, /* U+00105c: MYANMAR LETTER MON BBA*/
+                                           RTUNI_ALPHA, /* U+00105d: MYANMAR LETTER MON BBE*/
+                                           RTUNI_ALPHA, /* U+00105e: MYANMAR CONSONANT SIGN MON MEDIAL NA*/
+                                           RTUNI_ALPHA, /* U+00105f: MYANMAR CONSONANT SIGN MON MEDIAL MA*/
+                                           RTUNI_ALPHA, /* U+001060: MYANMAR CONSONANT SIGN MON MEDIAL LA*/
+                                           RTUNI_ALPHA, /* U+001061: MYANMAR LETTER SGAW KAREN SHA*/
+                                           RTUNI_ALPHA, /* U+001062: MYANMAR VOWEL SIGN SGAW KAREN EU*/
+                                                     0, /* U+001063: MYANMAR TONE MARK SGAW KAREN HATHI*/
+                                                     0, /* U+001064: MYANMAR TONE MARK SGAW KAREN KE PHO*/
+                                           RTUNI_ALPHA, /* U+001065: MYANMAR LETTER WESTERN PWO KAREN THA*/
+                                           RTUNI_ALPHA, /* U+001066: MYANMAR LETTER WESTERN PWO KAREN PWA*/
+                                           RTUNI_ALPHA, /* U+001067: MYANMAR VOWEL SIGN WESTERN PWO KAREN EU*/
+                                           RTUNI_ALPHA, /* U+001068: MYANMAR VOWEL SIGN WESTERN PWO KAREN UE*/
+                                                     0, /* U+001069: MYANMAR SIGN WESTERN PWO KAREN TONE-1*/
+                                                     0, /* U+00106a: MYANMAR SIGN WESTERN PWO KAREN TONE-2*/
+                                                     0, /* U+00106b: MYANMAR SIGN WESTERN PWO KAREN TONE-3*/
+                                                     0, /* U+00106c: MYANMAR SIGN WESTERN PWO KAREN TONE-4*/
+                                                     0, /* U+00106d: MYANMAR SIGN WESTERN PWO KAREN TONE-5*/
+                                           RTUNI_ALPHA, /* U+00106e: MYANMAR LETTER EASTERN PWO KAREN NNA*/
+                                           RTUNI_ALPHA, /* U+00106f: MYANMAR LETTER EASTERN PWO KAREN YWA*/
+                                           RTUNI_ALPHA, /* U+001070: MYANMAR LETTER EASTERN PWO KAREN GHWA*/
+                                           RTUNI_ALPHA, /* U+001071: MYANMAR VOWEL SIGN GEBA KAREN I*/
+                                           RTUNI_ALPHA, /* U+001072: MYANMAR VOWEL SIGN KAYAH OE*/
+                                           RTUNI_ALPHA, /* U+001073: MYANMAR VOWEL SIGN KAYAH U*/
+                                           RTUNI_ALPHA, /* U+001074: MYANMAR VOWEL SIGN KAYAH EE*/
+                                           RTUNI_ALPHA, /* U+001075: MYANMAR LETTER SHAN KA*/
+                                           RTUNI_ALPHA, /* U+001076: MYANMAR LETTER SHAN KHA*/
+                                           RTUNI_ALPHA, /* U+001077: MYANMAR LETTER SHAN GA*/
+                                           RTUNI_ALPHA, /* U+001078: MYANMAR LETTER SHAN CA*/
+                                           RTUNI_ALPHA, /* U+001079: MYANMAR LETTER SHAN ZA*/
+                                           RTUNI_ALPHA, /* U+00107a: MYANMAR LETTER SHAN NYA*/
+                                           RTUNI_ALPHA, /* U+00107b: MYANMAR LETTER SHAN DA*/
+                                           RTUNI_ALPHA, /* U+00107c: MYANMAR LETTER SHAN NA*/
+                                           RTUNI_ALPHA, /* U+00107d: MYANMAR LETTER SHAN PHA*/
+                                           RTUNI_ALPHA, /* U+00107e: MYANMAR LETTER SHAN FA*/
+                                           RTUNI_ALPHA, /* U+00107f: MYANMAR LETTER SHAN BA*/
+                                           RTUNI_ALPHA, /* U+001080: MYANMAR LETTER SHAN THA*/
+                                           RTUNI_ALPHA, /* U+001081: MYANMAR LETTER SHAN HA*/
+                                           RTUNI_ALPHA, /* U+001082: MYANMAR CONSONANT SIGN SHAN MEDIAL WA*/
+                                           RTUNI_ALPHA, /* U+001083: MYANMAR VOWEL SIGN SHAN AA*/
+                                           RTUNI_ALPHA, /* U+001084: MYANMAR VOWEL SIGN SHAN E*/
+                                           RTUNI_ALPHA, /* U+001085: MYANMAR VOWEL SIGN SHAN E ABOVE*/
+                                           RTUNI_ALPHA, /* U+001086: MYANMAR VOWEL SIGN SHAN FINAL Y*/
+                                                     0, /* U+001087: MYANMAR SIGN SHAN TONE-2*/
+                                                     0, /* U+001088: MYANMAR SIGN SHAN TONE-3*/
+                                                     0, /* U+001089: MYANMAR SIGN SHAN TONE-5*/
+                                                     0, /* U+00108a: MYANMAR SIGN SHAN TONE-6*/
+                                                     0, /* U+00108b: MYANMAR SIGN SHAN COUNCIL TONE-2*/
+                                                     0, /* U+00108c: MYANMAR SIGN SHAN COUNCIL TONE-3*/
+                                                     0, /* U+00108d: MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE*/
+                                           RTUNI_ALPHA, /* U+00108e: MYANMAR LETTER RUMAI PALAUNG FA*/
+                                                     0, /* U+00108f: MYANMAR SIGN RUMAI PALAUNG TONE-5*/
+                                          RTUNI_DDIGIT, /* U+001090: MYANMAR SHAN DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001091: MYANMAR SHAN DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001092: MYANMAR SHAN DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001093: MYANMAR SHAN DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001094: MYANMAR SHAN DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001095: MYANMAR SHAN DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001096: MYANMAR SHAN DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001097: MYANMAR SHAN DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001098: MYANMAR SHAN DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001099: MYANMAR SHAN DIGIT NINE*/
+                                                     0, /* U+00109a: MYANMAR SIGN KHAMTI TONE-1*/
+                                                     0, /* U+00109b: MYANMAR SIGN KHAMTI TONE-3*/
+                                           RTUNI_ALPHA, /* U+00109c: MYANMAR VOWEL SIGN AITON A*/
+                                           RTUNI_ALPHA, /* U+00109d: MYANMAR VOWEL SIGN AITON AI*/
+                                                     0, /* U+00109e: MYANMAR SYMBOL SHAN ONE*/
+                                                     0, /* U+00109f: MYANMAR SYMBOL SHAN EXCLAMATION*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
+                                                     0, /* U+0010c6: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c7: GEORGIAN CAPITAL LETTER YN*/
+                                                     0, /* U+0010c8: */
+                                                     0, /* U+0010c9: */
+                                                     0, /* U+0010ca: */
+                                                     0, /* U+0010cb: */
+                                                     0, /* U+0010cc: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010cd: GEORGIAN CAPITAL LETTER AEN*/
+                                                     0, /* U+0010ce: */
+                                                     0, /* U+0010cf: */
+                                           RTUNI_ALPHA, /* U+0010d0: GEORGIAN LETTER AN*/
+                                           RTUNI_ALPHA, /* U+0010d1: GEORGIAN LETTER BAN*/
+                                           RTUNI_ALPHA, /* U+0010d2: GEORGIAN LETTER GAN*/
+                                           RTUNI_ALPHA, /* U+0010d3: GEORGIAN LETTER DON*/
+                                           RTUNI_ALPHA, /* U+0010d4: GEORGIAN LETTER EN*/
+                                           RTUNI_ALPHA, /* U+0010d5: GEORGIAN LETTER VIN*/
+                                           RTUNI_ALPHA, /* U+0010d6: GEORGIAN LETTER ZEN*/
+                                           RTUNI_ALPHA, /* U+0010d7: GEORGIAN LETTER TAN*/
+                                           RTUNI_ALPHA, /* U+0010d8: GEORGIAN LETTER IN*/
+                                           RTUNI_ALPHA, /* U+0010d9: GEORGIAN LETTER KAN*/
+                                           RTUNI_ALPHA, /* U+0010da: GEORGIAN LETTER LAS*/
+                                           RTUNI_ALPHA, /* U+0010db: GEORGIAN LETTER MAN*/
+                                           RTUNI_ALPHA, /* U+0010dc: GEORGIAN LETTER NAR*/
+                                           RTUNI_ALPHA, /* U+0010dd: GEORGIAN LETTER ON*/
+                                           RTUNI_ALPHA, /* U+0010de: GEORGIAN LETTER PAR*/
+                                           RTUNI_ALPHA, /* U+0010df: GEORGIAN LETTER ZHAR*/
+                                           RTUNI_ALPHA, /* U+0010e0: GEORGIAN LETTER RAE*/
+                                           RTUNI_ALPHA, /* U+0010e1: GEORGIAN LETTER SAN*/
+                                           RTUNI_ALPHA, /* U+0010e2: GEORGIAN LETTER TAR*/
+                                           RTUNI_ALPHA, /* U+0010e3: GEORGIAN LETTER UN*/
+                                           RTUNI_ALPHA, /* U+0010e4: GEORGIAN LETTER PHAR*/
+                                           RTUNI_ALPHA, /* U+0010e5: GEORGIAN LETTER KHAR*/
+                                           RTUNI_ALPHA, /* U+0010e6: GEORGIAN LETTER GHAN*/
+                                           RTUNI_ALPHA, /* U+0010e7: GEORGIAN LETTER QAR*/
+                                           RTUNI_ALPHA, /* U+0010e8: GEORGIAN LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+0010e9: GEORGIAN LETTER CHIN*/
+                                           RTUNI_ALPHA, /* U+0010ea: GEORGIAN LETTER CAN*/
+                                           RTUNI_ALPHA, /* U+0010eb: GEORGIAN LETTER JIL*/
+                                           RTUNI_ALPHA, /* U+0010ec: GEORGIAN LETTER CIL*/
+                                           RTUNI_ALPHA, /* U+0010ed: GEORGIAN LETTER CHAR*/
+                                           RTUNI_ALPHA, /* U+0010ee: GEORGIAN LETTER XAN*/
+                                           RTUNI_ALPHA, /* U+0010ef: GEORGIAN LETTER JHAN*/
+                                           RTUNI_ALPHA, /* U+0010f0: GEORGIAN LETTER HAE*/
+                                           RTUNI_ALPHA, /* U+0010f1: GEORGIAN LETTER HE*/
+                                           RTUNI_ALPHA, /* U+0010f2: GEORGIAN LETTER HIE*/
+                                           RTUNI_ALPHA, /* U+0010f3: GEORGIAN LETTER WE*/
+                                           RTUNI_ALPHA, /* U+0010f4: GEORGIAN LETTER HAR*/
+                                           RTUNI_ALPHA, /* U+0010f5: GEORGIAN LETTER HOE*/
+                                           RTUNI_ALPHA, /* U+0010f6: GEORGIAN LETTER FI*/
+                                           RTUNI_ALPHA, /* U+0010f7: GEORGIAN LETTER YN*/
+                                           RTUNI_ALPHA, /* U+0010f8: GEORGIAN LETTER ELIFI*/
+                                           RTUNI_ALPHA, /* U+0010f9: GEORGIAN LETTER TURNED GAN*/
+                                           RTUNI_ALPHA, /* U+0010fa: GEORGIAN LETTER AIN*/
+                                                     0, /* U+0010fb: GEORGIAN PARAGRAPH SEPARATOR*/
+                                           RTUNI_ALPHA, /* U+0010fc: MODIFIER LETTER GEORGIAN NAR*/
+                                           RTUNI_ALPHA, /* U+0010fd: GEORGIAN LETTER AEN*/
+                                           RTUNI_ALPHA, /* U+0010fe: GEORGIAN LETTER HARD SIGN*/
+                                           RTUNI_ALPHA, /* U+0010ff: GEORGIAN LETTER LABIAL SIGN*/
+                                           RTUNI_ALPHA, /* U+001100: HANGUL CHOSEONG KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001101: HANGUL CHOSEONG SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+001102: HANGUL CHOSEONG NIEUN*/
+                                           RTUNI_ALPHA, /* U+001103: HANGUL CHOSEONG TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001104: HANGUL CHOSEONG SSANGTIKEUT*/
+                                           RTUNI_ALPHA, /* U+001105: HANGUL CHOSEONG RIEUL*/
+                                           RTUNI_ALPHA, /* U+001106: HANGUL CHOSEONG MIEUM*/
+                                           RTUNI_ALPHA, /* U+001107: HANGUL CHOSEONG PIEUP*/
+                                           RTUNI_ALPHA, /* U+001108: HANGUL CHOSEONG SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+001109: HANGUL CHOSEONG SIOS*/
+                                           RTUNI_ALPHA, /* U+00110a: HANGUL CHOSEONG SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+00110b: HANGUL CHOSEONG IEUNG*/
+                                           RTUNI_ALPHA, /* U+00110c: HANGUL CHOSEONG CIEUC*/
+                                           RTUNI_ALPHA, /* U+00110d: HANGUL CHOSEONG SSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+00110e: HANGUL CHOSEONG CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00110f: HANGUL CHOSEONG KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+001110: HANGUL CHOSEONG THIEUTH*/
+                                           RTUNI_ALPHA, /* U+001111: HANGUL CHOSEONG PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+001112: HANGUL CHOSEONG HIEUH*/
+                                           RTUNI_ALPHA, /* U+001113: HANGUL CHOSEONG NIEUN-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001114: HANGUL CHOSEONG SSANGNIEUN*/
+                                           RTUNI_ALPHA, /* U+001115: HANGUL CHOSEONG NIEUN-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001116: HANGUL CHOSEONG NIEUN-PIEUP*/
+                                           RTUNI_ALPHA, /* U+001117: HANGUL CHOSEONG TIKEUT-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001118: HANGUL CHOSEONG RIEUL-NIEUN*/
+                                           RTUNI_ALPHA, /* U+001119: HANGUL CHOSEONG SSANGRIEUL*/
+                                           RTUNI_ALPHA, /* U+00111a: HANGUL CHOSEONG RIEUL-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00111b: HANGUL CHOSEONG KAPYEOUNRIEUL*/
+                                           RTUNI_ALPHA, /* U+00111c: HANGUL CHOSEONG MIEUM-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00111d: HANGUL CHOSEONG KAPYEOUNMIEUM*/
+                                           RTUNI_ALPHA, /* U+00111e: HANGUL CHOSEONG PIEUP-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00111f: HANGUL CHOSEONG PIEUP-NIEUN*/
+                                           RTUNI_ALPHA, /* U+001120: HANGUL CHOSEONG PIEUP-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001121: HANGUL CHOSEONG PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+001122: HANGUL CHOSEONG PIEUP-SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001123: HANGUL CHOSEONG PIEUP-SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001124: HANGUL CHOSEONG PIEUP-SIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+001125: HANGUL CHOSEONG PIEUP-SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+001126: HANGUL CHOSEONG PIEUP-SIOS-CIEUC*/
+                                           RTUNI_ALPHA, /* U+001127: HANGUL CHOSEONG PIEUP-CIEUC*/
+                                           RTUNI_ALPHA, /* U+001128: HANGUL CHOSEONG PIEUP-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+001129: HANGUL CHOSEONG PIEUP-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00112a: HANGUL CHOSEONG PIEUP-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00112b: HANGUL CHOSEONG KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+00112c: HANGUL CHOSEONG KAPYEOUNSSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00112d: HANGUL CHOSEONG SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00112e: HANGUL CHOSEONG SIOS-NIEUN*/
+                                           RTUNI_ALPHA, /* U+00112f: HANGUL CHOSEONG SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001130: HANGUL CHOSEONG SIOS-RIEUL*/
+                                           RTUNI_ALPHA, /* U+001131: HANGUL CHOSEONG SIOS-MIEUM*/
+                                           RTUNI_ALPHA, /* U+001132: HANGUL CHOSEONG SIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+001133: HANGUL CHOSEONG SIOS-PIEUP-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001134: HANGUL CHOSEONG SIOS-SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+001135: HANGUL CHOSEONG SIOS-IEUNG*/
+                                           RTUNI_ALPHA, /* U+001136: HANGUL CHOSEONG SIOS-CIEUC*/
+                                           RTUNI_ALPHA, /* U+001137: HANGUL CHOSEONG SIOS-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+001138: HANGUL CHOSEONG SIOS-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+001139: HANGUL CHOSEONG SIOS-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00113a: HANGUL CHOSEONG SIOS-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00113b: HANGUL CHOSEONG SIOS-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00113c: HANGUL CHOSEONG CHITUEUMSIOS*/
+                                           RTUNI_ALPHA, /* U+00113d: HANGUL CHOSEONG CHITUEUMSSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+00113e: HANGUL CHOSEONG CEONGCHIEUMSIOS*/
+                                           RTUNI_ALPHA, /* U+00113f: HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+001140: HANGUL CHOSEONG PANSIOS*/
+                                           RTUNI_ALPHA, /* U+001141: HANGUL CHOSEONG IEUNG-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+001142: HANGUL CHOSEONG IEUNG-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+001143: HANGUL CHOSEONG IEUNG-MIEUM*/
+                                           RTUNI_ALPHA, /* U+001144: HANGUL CHOSEONG IEUNG-PIEUP*/
+                                           RTUNI_ALPHA, /* U+001145: HANGUL CHOSEONG IEUNG-SIOS*/
+                                           RTUNI_ALPHA, /* U+001146: HANGUL CHOSEONG IEUNG-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+001147: HANGUL CHOSEONG SSANGIEUNG*/
+                                           RTUNI_ALPHA, /* U+001148: HANGUL CHOSEONG IEUNG-CIEUC*/
+                                           RTUNI_ALPHA, /* U+001149: HANGUL CHOSEONG IEUNG-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00114a: HANGUL CHOSEONG IEUNG-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00114b: HANGUL CHOSEONG IEUNG-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00114c: HANGUL CHOSEONG YESIEUNG*/
+                                           RTUNI_ALPHA, /* U+00114d: HANGUL CHOSEONG CIEUC-IEUNG*/
+                                           RTUNI_ALPHA, /* U+00114e: HANGUL CHOSEONG CHITUEUMCIEUC*/
+                                           RTUNI_ALPHA, /* U+00114f: HANGUL CHOSEONG CHITUEUMSSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+001150: HANGUL CHOSEONG CEONGCHIEUMCIEUC*/
+                                           RTUNI_ALPHA, /* U+001151: HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+001152: HANGUL CHOSEONG CHIEUCH-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+001153: HANGUL CHOSEONG CHIEUCH-HIEUH*/
+                                           RTUNI_ALPHA, /* U+001154: HANGUL CHOSEONG CHITUEUMCHIEUCH*/
+                                           RTUNI_ALPHA, /* U+001155: HANGUL CHOSEONG CEONGCHIEUMCHIEUCH*/
+                                           RTUNI_ALPHA, /* U+001156: HANGUL CHOSEONG PHIEUPH-PIEUP*/
+                                           RTUNI_ALPHA, /* U+001157: HANGUL CHOSEONG KAPYEOUNPHIEUPH*/
+                                           RTUNI_ALPHA, /* U+001158: HANGUL CHOSEONG SSANGHIEUH*/
+                                           RTUNI_ALPHA, /* U+001159: HANGUL CHOSEONG YEORINHIEUH*/
+                                           RTUNI_ALPHA, /* U+00115a: HANGUL CHOSEONG KIYEOK-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00115b: HANGUL CHOSEONG NIEUN-SIOS*/
+                                           RTUNI_ALPHA, /* U+00115c: HANGUL CHOSEONG NIEUN-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00115d: HANGUL CHOSEONG NIEUN-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00115e: HANGUL CHOSEONG TIKEUT-RIEUL*/
+                                           RTUNI_ALPHA, /* U+00115f: HANGUL CHOSEONG FILLER*/
+                                           RTUNI_ALPHA, /* U+001160: HANGUL JUNGSEONG FILLER*/
+                                           RTUNI_ALPHA, /* U+001161: HANGUL JUNGSEONG A*/
+                                           RTUNI_ALPHA, /* U+001162: HANGUL JUNGSEONG AE*/
+                                           RTUNI_ALPHA, /* U+001163: HANGUL JUNGSEONG YA*/
+                                           RTUNI_ALPHA, /* U+001164: HANGUL JUNGSEONG YAE*/
+                                           RTUNI_ALPHA, /* U+001165: HANGUL JUNGSEONG EO*/
+                                           RTUNI_ALPHA, /* U+001166: HANGUL JUNGSEONG E*/
+                                           RTUNI_ALPHA, /* U+001167: HANGUL JUNGSEONG YEO*/
+                                           RTUNI_ALPHA, /* U+001168: HANGUL JUNGSEONG YE*/
+                                           RTUNI_ALPHA, /* U+001169: HANGUL JUNGSEONG O*/
+                                           RTUNI_ALPHA, /* U+00116a: HANGUL JUNGSEONG WA*/
+                                           RTUNI_ALPHA, /* U+00116b: HANGUL JUNGSEONG WAE*/
+                                           RTUNI_ALPHA, /* U+00116c: HANGUL JUNGSEONG OE*/
+                                           RTUNI_ALPHA, /* U+00116d: HANGUL JUNGSEONG YO*/
+                                           RTUNI_ALPHA, /* U+00116e: HANGUL JUNGSEONG U*/
+                                           RTUNI_ALPHA, /* U+00116f: HANGUL JUNGSEONG WEO*/
+                                           RTUNI_ALPHA, /* U+001170: HANGUL JUNGSEONG WE*/
+                                           RTUNI_ALPHA, /* U+001171: HANGUL JUNGSEONG WI*/
+                                           RTUNI_ALPHA, /* U+001172: HANGUL JUNGSEONG YU*/
+                                           RTUNI_ALPHA, /* U+001173: HANGUL JUNGSEONG EU*/
+                                           RTUNI_ALPHA, /* U+001174: HANGUL JUNGSEONG YI*/
+                                           RTUNI_ALPHA, /* U+001175: HANGUL JUNGSEONG I*/
+                                           RTUNI_ALPHA, /* U+001176: HANGUL JUNGSEONG A-O*/
+                                           RTUNI_ALPHA, /* U+001177: HANGUL JUNGSEONG A-U*/
+                                           RTUNI_ALPHA, /* U+001178: HANGUL JUNGSEONG YA-O*/
+                                           RTUNI_ALPHA, /* U+001179: HANGUL JUNGSEONG YA-YO*/
+                                           RTUNI_ALPHA, /* U+00117a: HANGUL JUNGSEONG EO-O*/
+                                           RTUNI_ALPHA, /* U+00117b: HANGUL JUNGSEONG EO-U*/
+                                           RTUNI_ALPHA, /* U+00117c: HANGUL JUNGSEONG EO-EU*/
+                                           RTUNI_ALPHA, /* U+00117d: HANGUL JUNGSEONG YEO-O*/
+                                           RTUNI_ALPHA, /* U+00117e: HANGUL JUNGSEONG YEO-U*/
+                                           RTUNI_ALPHA, /* U+00117f: HANGUL JUNGSEONG O-EO*/
+                                           RTUNI_ALPHA, /* U+001180: HANGUL JUNGSEONG O-E*/
+                                           RTUNI_ALPHA, /* U+001181: HANGUL JUNGSEONG O-YE*/
+                                           RTUNI_ALPHA, /* U+001182: HANGUL JUNGSEONG O-O*/
+                                           RTUNI_ALPHA, /* U+001183: HANGUL JUNGSEONG O-U*/
+                                           RTUNI_ALPHA, /* U+001184: HANGUL JUNGSEONG YO-YA*/
+                                           RTUNI_ALPHA, /* U+001185: HANGUL JUNGSEONG YO-YAE*/
+                                           RTUNI_ALPHA, /* U+001186: HANGUL JUNGSEONG YO-YEO*/
+                                           RTUNI_ALPHA, /* U+001187: HANGUL JUNGSEONG YO-O*/
+                                           RTUNI_ALPHA, /* U+001188: HANGUL JUNGSEONG YO-I*/
+                                           RTUNI_ALPHA, /* U+001189: HANGUL JUNGSEONG U-A*/
+                                           RTUNI_ALPHA, /* U+00118a: HANGUL JUNGSEONG U-AE*/
+                                           RTUNI_ALPHA, /* U+00118b: HANGUL JUNGSEONG U-EO-EU*/
+                                           RTUNI_ALPHA, /* U+00118c: HANGUL JUNGSEONG U-YE*/
+                                           RTUNI_ALPHA, /* U+00118d: HANGUL JUNGSEONG U-U*/
+                                           RTUNI_ALPHA, /* U+00118e: HANGUL JUNGSEONG YU-A*/
+                                           RTUNI_ALPHA, /* U+00118f: HANGUL JUNGSEONG YU-EO*/
+                                           RTUNI_ALPHA, /* U+001190: HANGUL JUNGSEONG YU-E*/
+                                           RTUNI_ALPHA, /* U+001191: HANGUL JUNGSEONG YU-YEO*/
+                                           RTUNI_ALPHA, /* U+001192: HANGUL JUNGSEONG YU-YE*/
+                                           RTUNI_ALPHA, /* U+001193: HANGUL JUNGSEONG YU-U*/
+                                           RTUNI_ALPHA, /* U+001194: HANGUL JUNGSEONG YU-I*/
+                                           RTUNI_ALPHA, /* U+001195: HANGUL JUNGSEONG EU-U*/
+                                           RTUNI_ALPHA, /* U+001196: HANGUL JUNGSEONG EU-EU*/
+                                           RTUNI_ALPHA, /* U+001197: HANGUL JUNGSEONG YI-U*/
+                                           RTUNI_ALPHA, /* U+001198: HANGUL JUNGSEONG I-A*/
+                                           RTUNI_ALPHA, /* U+001199: HANGUL JUNGSEONG I-YA*/
+                                           RTUNI_ALPHA, /* U+00119a: HANGUL JUNGSEONG I-O*/
+                                           RTUNI_ALPHA, /* U+00119b: HANGUL JUNGSEONG I-U*/
+                                           RTUNI_ALPHA, /* U+00119c: HANGUL JUNGSEONG I-EU*/
+                                           RTUNI_ALPHA, /* U+00119d: HANGUL JUNGSEONG I-ARAEA*/
+                                           RTUNI_ALPHA, /* U+00119e: HANGUL JUNGSEONG ARAEA*/
+                                           RTUNI_ALPHA, /* U+00119f: HANGUL JUNGSEONG ARAEA-EO*/
+                                           RTUNI_ALPHA, /* U+0011a0: HANGUL JUNGSEONG ARAEA-U*/
+                                           RTUNI_ALPHA, /* U+0011a1: HANGUL JUNGSEONG ARAEA-I*/
+                                           RTUNI_ALPHA, /* U+0011a2: HANGUL JUNGSEONG SSANGARAEA*/
+                                           RTUNI_ALPHA, /* U+0011a3: HANGUL JUNGSEONG A-EU*/
+                                           RTUNI_ALPHA, /* U+0011a4: HANGUL JUNGSEONG YA-U*/
+                                           RTUNI_ALPHA, /* U+0011a5: HANGUL JUNGSEONG YEO-YA*/
+                                           RTUNI_ALPHA, /* U+0011a6: HANGUL JUNGSEONG O-YA*/
+                                           RTUNI_ALPHA, /* U+0011a7: HANGUL JUNGSEONG O-YAE*/
+                                           RTUNI_ALPHA, /* U+0011a8: HANGUL JONGSEONG KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011a9: HANGUL JONGSEONG SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011aa: HANGUL JONGSEONG KIYEOK-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011ab: HANGUL JONGSEONG NIEUN*/
+                                           RTUNI_ALPHA, /* U+0011ac: HANGUL JONGSEONG NIEUN-CIEUC*/
+                                           RTUNI_ALPHA, /* U+0011ad: HANGUL JONGSEONG NIEUN-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011ae: HANGUL JONGSEONG TIKEUT*/
+                                           RTUNI_ALPHA, /* U+0011af: HANGUL JONGSEONG RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011b0: HANGUL JONGSEONG RIEUL-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011b1: HANGUL JONGSEONG RIEUL-MIEUM*/
+                                           RTUNI_ALPHA, /* U+0011b2: HANGUL JONGSEONG RIEUL-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011b3: HANGUL JONGSEONG RIEUL-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011b4: HANGUL JONGSEONG RIEUL-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+0011b5: HANGUL JONGSEONG RIEUL-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+0011b6: HANGUL JONGSEONG RIEUL-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011b7: HANGUL JONGSEONG MIEUM*/
+                                           RTUNI_ALPHA, /* U+0011b8: HANGUL JONGSEONG PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011b9: HANGUL JONGSEONG PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011ba: HANGUL JONGSEONG SIOS*/
+                                           RTUNI_ALPHA, /* U+0011bb: HANGUL JONGSEONG SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+0011bc: HANGUL JONGSEONG IEUNG*/
+                                           RTUNI_ALPHA, /* U+0011bd: HANGUL JONGSEONG CIEUC*/
+                                           RTUNI_ALPHA, /* U+0011be: HANGUL JONGSEONG CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+0011bf: HANGUL JONGSEONG KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+0011c0: HANGUL JONGSEONG THIEUTH*/
+                                           RTUNI_ALPHA, /* U+0011c1: HANGUL JONGSEONG PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+0011c2: HANGUL JONGSEONG HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011c3: HANGUL JONGSEONG KIYEOK-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011c4: HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011c5: HANGUL JONGSEONG NIEUN-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011c6: HANGUL JONGSEONG NIEUN-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+0011c7: HANGUL JONGSEONG NIEUN-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011c8: HANGUL JONGSEONG NIEUN-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+0011c9: HANGUL JONGSEONG NIEUN-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+0011ca: HANGUL JONGSEONG TIKEUT-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011cb: HANGUL JONGSEONG TIKEUT-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011cc: HANGUL JONGSEONG RIEUL-KIYEOK-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011cd: HANGUL JONGSEONG RIEUL-NIEUN*/
+                                           RTUNI_ALPHA, /* U+0011ce: HANGUL JONGSEONG RIEUL-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+0011cf: HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011d0: HANGUL JONGSEONG SSANGRIEUL*/
+                                           RTUNI_ALPHA, /* U+0011d1: HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011d2: HANGUL JONGSEONG RIEUL-MIEUM-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011d3: HANGUL JONGSEONG RIEUL-PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011d4: HANGUL JONGSEONG RIEUL-PIEUP-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011d5: HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+0011d6: HANGUL JONGSEONG RIEUL-SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+0011d7: HANGUL JONGSEONG RIEUL-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+0011d8: HANGUL JONGSEONG RIEUL-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+0011d9: HANGUL JONGSEONG RIEUL-YEORINHIEUH*/
+                                           RTUNI_ALPHA, /* U+0011da: HANGUL JONGSEONG MIEUM-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011db: HANGUL JONGSEONG MIEUM-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011dc: HANGUL JONGSEONG MIEUM-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011dd: HANGUL JONGSEONG MIEUM-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011de: HANGUL JONGSEONG MIEUM-SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+0011df: HANGUL JONGSEONG MIEUM-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+0011e0: HANGUL JONGSEONG MIEUM-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+0011e1: HANGUL JONGSEONG MIEUM-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011e2: HANGUL JONGSEONG KAPYEOUNMIEUM*/
+                                           RTUNI_ALPHA, /* U+0011e3: HANGUL JONGSEONG PIEUP-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011e4: HANGUL JONGSEONG PIEUP-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+0011e5: HANGUL JONGSEONG PIEUP-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011e6: HANGUL JONGSEONG KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+0011e7: HANGUL JONGSEONG SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011e8: HANGUL JONGSEONG SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+0011e9: HANGUL JONGSEONG SIOS-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011ea: HANGUL JONGSEONG SIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011eb: HANGUL JONGSEONG PANSIOS*/
+                                           RTUNI_ALPHA, /* U+0011ec: HANGUL JONGSEONG IEUNG-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011ed: HANGUL JONGSEONG IEUNG-SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+0011ee: HANGUL JONGSEONG SSANGIEUNG*/
+                                           RTUNI_ALPHA, /* U+0011ef: HANGUL JONGSEONG IEUNG-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+0011f0: HANGUL JONGSEONG YESIEUNG*/
+                                           RTUNI_ALPHA, /* U+0011f1: HANGUL JONGSEONG YESIEUNG-SIOS*/
+                                           RTUNI_ALPHA, /* U+0011f2: HANGUL JONGSEONG YESIEUNG-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+0011f3: HANGUL JONGSEONG PHIEUPH-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011f4: HANGUL JONGSEONG KAPYEOUNPHIEUPH*/
+                                           RTUNI_ALPHA, /* U+0011f5: HANGUL JONGSEONG HIEUH-NIEUN*/
+                                           RTUNI_ALPHA, /* U+0011f6: HANGUL JONGSEONG HIEUH-RIEUL*/
+                                           RTUNI_ALPHA, /* U+0011f7: HANGUL JONGSEONG HIEUH-MIEUM*/
+                                           RTUNI_ALPHA, /* U+0011f8: HANGUL JONGSEONG HIEUH-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011f9: HANGUL JONGSEONG YEORINHIEUH*/
+                                           RTUNI_ALPHA, /* U+0011fa: HANGUL JONGSEONG KIYEOK-NIEUN*/
+                                           RTUNI_ALPHA, /* U+0011fb: HANGUL JONGSEONG KIYEOK-PIEUP*/
+                                           RTUNI_ALPHA, /* U+0011fc: HANGUL JONGSEONG KIYEOK-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+0011fd: HANGUL JONGSEONG KIYEOK-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+0011fe: HANGUL JONGSEONG KIYEOK-HIEUH*/
+                                           RTUNI_ALPHA, /* U+0011ff: HANGUL JONGSEONG SSANGNIEUN*/
+                                           RTUNI_ALPHA, /* U+001200: ETHIOPIC SYLLABLE HA*/
+                                           RTUNI_ALPHA, /* U+001201: ETHIOPIC SYLLABLE HU*/
+                                           RTUNI_ALPHA, /* U+001202: ETHIOPIC SYLLABLE HI*/
+                                           RTUNI_ALPHA, /* U+001203: ETHIOPIC SYLLABLE HAA*/
+                                           RTUNI_ALPHA, /* U+001204: ETHIOPIC SYLLABLE HEE*/
+                                           RTUNI_ALPHA, /* U+001205: ETHIOPIC SYLLABLE HE*/
+                                           RTUNI_ALPHA, /* U+001206: ETHIOPIC SYLLABLE HO*/
+                                           RTUNI_ALPHA, /* U+001207: ETHIOPIC SYLLABLE HOA*/
+                                           RTUNI_ALPHA, /* U+001208: ETHIOPIC SYLLABLE LA*/
+                                           RTUNI_ALPHA, /* U+001209: ETHIOPIC SYLLABLE LU*/
+                                           RTUNI_ALPHA, /* U+00120a: ETHIOPIC SYLLABLE LI*/
+                                           RTUNI_ALPHA, /* U+00120b: ETHIOPIC SYLLABLE LAA*/
+                                           RTUNI_ALPHA, /* U+00120c: ETHIOPIC SYLLABLE LEE*/
+                                           RTUNI_ALPHA, /* U+00120d: ETHIOPIC SYLLABLE LE*/
+                                           RTUNI_ALPHA, /* U+00120e: ETHIOPIC SYLLABLE LO*/
+                                           RTUNI_ALPHA, /* U+00120f: ETHIOPIC SYLLABLE LWA*/
+                                           RTUNI_ALPHA, /* U+001210: ETHIOPIC SYLLABLE HHA*/
+                                           RTUNI_ALPHA, /* U+001211: ETHIOPIC SYLLABLE HHU*/
+                                           RTUNI_ALPHA, /* U+001212: ETHIOPIC SYLLABLE HHI*/
+                                           RTUNI_ALPHA, /* U+001213: ETHIOPIC SYLLABLE HHAA*/
+                                           RTUNI_ALPHA, /* U+001214: ETHIOPIC SYLLABLE HHEE*/
+                                           RTUNI_ALPHA, /* U+001215: ETHIOPIC SYLLABLE HHE*/
+                                           RTUNI_ALPHA, /* U+001216: ETHIOPIC SYLLABLE HHO*/
+                                           RTUNI_ALPHA, /* U+001217: ETHIOPIC SYLLABLE HHWA*/
+                                           RTUNI_ALPHA, /* U+001218: ETHIOPIC SYLLABLE MA*/
+                                           RTUNI_ALPHA, /* U+001219: ETHIOPIC SYLLABLE MU*/
+                                           RTUNI_ALPHA, /* U+00121a: ETHIOPIC SYLLABLE MI*/
+                                           RTUNI_ALPHA, /* U+00121b: ETHIOPIC SYLLABLE MAA*/
+                                           RTUNI_ALPHA, /* U+00121c: ETHIOPIC SYLLABLE MEE*/
+                                           RTUNI_ALPHA, /* U+00121d: ETHIOPIC SYLLABLE ME*/
+                                           RTUNI_ALPHA, /* U+00121e: ETHIOPIC SYLLABLE MO*/
+                                           RTUNI_ALPHA, /* U+00121f: ETHIOPIC SYLLABLE MWA*/
+                                           RTUNI_ALPHA, /* U+001220: ETHIOPIC SYLLABLE SZA*/
+                                           RTUNI_ALPHA, /* U+001221: ETHIOPIC SYLLABLE SZU*/
+                                           RTUNI_ALPHA, /* U+001222: ETHIOPIC SYLLABLE SZI*/
+                                           RTUNI_ALPHA, /* U+001223: ETHIOPIC SYLLABLE SZAA*/
+                                           RTUNI_ALPHA, /* U+001224: ETHIOPIC SYLLABLE SZEE*/
+                                           RTUNI_ALPHA, /* U+001225: ETHIOPIC SYLLABLE SZE*/
+                                           RTUNI_ALPHA, /* U+001226: ETHIOPIC SYLLABLE SZO*/
+                                           RTUNI_ALPHA, /* U+001227: ETHIOPIC SYLLABLE SZWA*/
+                                           RTUNI_ALPHA, /* U+001228: ETHIOPIC SYLLABLE RA*/
+                                           RTUNI_ALPHA, /* U+001229: ETHIOPIC SYLLABLE RU*/
+                                           RTUNI_ALPHA, /* U+00122a: ETHIOPIC SYLLABLE RI*/
+                                           RTUNI_ALPHA, /* U+00122b: ETHIOPIC SYLLABLE RAA*/
+                                           RTUNI_ALPHA, /* U+00122c: ETHIOPIC SYLLABLE REE*/
+                                           RTUNI_ALPHA, /* U+00122d: ETHIOPIC SYLLABLE RE*/
+                                           RTUNI_ALPHA, /* U+00122e: ETHIOPIC SYLLABLE RO*/
+                                           RTUNI_ALPHA, /* U+00122f: ETHIOPIC SYLLABLE RWA*/
+                                           RTUNI_ALPHA, /* U+001230: ETHIOPIC SYLLABLE SA*/
+                                           RTUNI_ALPHA, /* U+001231: ETHIOPIC SYLLABLE SU*/
+                                           RTUNI_ALPHA, /* U+001232: ETHIOPIC SYLLABLE SI*/
+                                           RTUNI_ALPHA, /* U+001233: ETHIOPIC SYLLABLE SAA*/
+                                           RTUNI_ALPHA, /* U+001234: ETHIOPIC SYLLABLE SEE*/
+                                           RTUNI_ALPHA, /* U+001235: ETHIOPIC SYLLABLE SE*/
+                                           RTUNI_ALPHA, /* U+001236: ETHIOPIC SYLLABLE SO*/
+                                           RTUNI_ALPHA, /* U+001237: ETHIOPIC SYLLABLE SWA*/
+                                           RTUNI_ALPHA, /* U+001238: ETHIOPIC SYLLABLE SHA*/
+                                           RTUNI_ALPHA, /* U+001239: ETHIOPIC SYLLABLE SHU*/
+                                           RTUNI_ALPHA, /* U+00123a: ETHIOPIC SYLLABLE SHI*/
+                                           RTUNI_ALPHA, /* U+00123b: ETHIOPIC SYLLABLE SHAA*/
+                                           RTUNI_ALPHA, /* U+00123c: ETHIOPIC SYLLABLE SHEE*/
+                                           RTUNI_ALPHA, /* U+00123d: ETHIOPIC SYLLABLE SHE*/
+                                           RTUNI_ALPHA, /* U+00123e: ETHIOPIC SYLLABLE SHO*/
+                                           RTUNI_ALPHA, /* U+00123f: ETHIOPIC SYLLABLE SHWA*/
+                                           RTUNI_ALPHA, /* U+001240: ETHIOPIC SYLLABLE QA*/
+                                           RTUNI_ALPHA, /* U+001241: ETHIOPIC SYLLABLE QU*/
+                                           RTUNI_ALPHA, /* U+001242: ETHIOPIC SYLLABLE QI*/
+                                           RTUNI_ALPHA, /* U+001243: ETHIOPIC SYLLABLE QAA*/
+                                           RTUNI_ALPHA, /* U+001244: ETHIOPIC SYLLABLE QEE*/
+                                           RTUNI_ALPHA, /* U+001245: ETHIOPIC SYLLABLE QE*/
+                                           RTUNI_ALPHA, /* U+001246: ETHIOPIC SYLLABLE QO*/
+                                           RTUNI_ALPHA, /* U+001247: ETHIOPIC SYLLABLE QOA*/
+                                           RTUNI_ALPHA, /* U+001248: ETHIOPIC SYLLABLE QWA*/
+                                                     0, /* U+001249: */
+                                           RTUNI_ALPHA, /* U+00124a: ETHIOPIC SYLLABLE QWI*/
+                                           RTUNI_ALPHA, /* U+00124b: ETHIOPIC SYLLABLE QWAA*/
+                                           RTUNI_ALPHA, /* U+00124c: ETHIOPIC SYLLABLE QWEE*/
+                                           RTUNI_ALPHA, /* U+00124d: ETHIOPIC SYLLABLE QWE*/
+                                                     0, /* U+00124e: */
+                                                     0, /* U+00124f: */
+                                           RTUNI_ALPHA, /* U+001250: ETHIOPIC SYLLABLE QHA*/
+                                           RTUNI_ALPHA, /* U+001251: ETHIOPIC SYLLABLE QHU*/
+                                           RTUNI_ALPHA, /* U+001252: ETHIOPIC SYLLABLE QHI*/
+                                           RTUNI_ALPHA, /* U+001253: ETHIOPIC SYLLABLE QHAA*/
+                                           RTUNI_ALPHA, /* U+001254: ETHIOPIC SYLLABLE QHEE*/
+                                           RTUNI_ALPHA, /* U+001255: ETHIOPIC SYLLABLE QHE*/
+                                           RTUNI_ALPHA, /* U+001256: ETHIOPIC SYLLABLE QHO*/
+                                                     0, /* U+001257: */
+                                           RTUNI_ALPHA, /* U+001258: ETHIOPIC SYLLABLE QHWA*/
+                                                     0, /* U+001259: */
+                                           RTUNI_ALPHA, /* U+00125a: ETHIOPIC SYLLABLE QHWI*/
+                                           RTUNI_ALPHA, /* U+00125b: ETHIOPIC SYLLABLE QHWAA*/
+                                           RTUNI_ALPHA, /* U+00125c: ETHIOPIC SYLLABLE QHWEE*/
+                                           RTUNI_ALPHA, /* U+00125d: ETHIOPIC SYLLABLE QHWE*/
+                                                     0, /* U+00125e: */
+                                                     0, /* U+00125f: */
+                                           RTUNI_ALPHA, /* U+001260: ETHIOPIC SYLLABLE BA*/
+                                           RTUNI_ALPHA, /* U+001261: ETHIOPIC SYLLABLE BU*/
+                                           RTUNI_ALPHA, /* U+001262: ETHIOPIC SYLLABLE BI*/
+                                           RTUNI_ALPHA, /* U+001263: ETHIOPIC SYLLABLE BAA*/
+                                           RTUNI_ALPHA, /* U+001264: ETHIOPIC SYLLABLE BEE*/
+                                           RTUNI_ALPHA, /* U+001265: ETHIOPIC SYLLABLE BE*/
+                                           RTUNI_ALPHA, /* U+001266: ETHIOPIC SYLLABLE BO*/
+                                           RTUNI_ALPHA, /* U+001267: ETHIOPIC SYLLABLE BWA*/
+                                           RTUNI_ALPHA, /* U+001268: ETHIOPIC SYLLABLE VA*/
+                                           RTUNI_ALPHA, /* U+001269: ETHIOPIC SYLLABLE VU*/
+                                           RTUNI_ALPHA, /* U+00126a: ETHIOPIC SYLLABLE VI*/
+                                           RTUNI_ALPHA, /* U+00126b: ETHIOPIC SYLLABLE VAA*/
+                                           RTUNI_ALPHA, /* U+00126c: ETHIOPIC SYLLABLE VEE*/
+                                           RTUNI_ALPHA, /* U+00126d: ETHIOPIC SYLLABLE VE*/
+                                           RTUNI_ALPHA, /* U+00126e: ETHIOPIC SYLLABLE VO*/
+                                           RTUNI_ALPHA, /* U+00126f: ETHIOPIC SYLLABLE VWA*/
+                                           RTUNI_ALPHA, /* U+001270: ETHIOPIC SYLLABLE TA*/
+                                           RTUNI_ALPHA, /* U+001271: ETHIOPIC SYLLABLE TU*/
+                                           RTUNI_ALPHA, /* U+001272: ETHIOPIC SYLLABLE TI*/
+                                           RTUNI_ALPHA, /* U+001273: ETHIOPIC SYLLABLE TAA*/
+                                           RTUNI_ALPHA, /* U+001274: ETHIOPIC SYLLABLE TEE*/
+                                           RTUNI_ALPHA, /* U+001275: ETHIOPIC SYLLABLE TE*/
+                                           RTUNI_ALPHA, /* U+001276: ETHIOPIC SYLLABLE TO*/
+                                           RTUNI_ALPHA, /* U+001277: ETHIOPIC SYLLABLE TWA*/
+                                           RTUNI_ALPHA, /* U+001278: ETHIOPIC SYLLABLE CA*/
+                                           RTUNI_ALPHA, /* U+001279: ETHIOPIC SYLLABLE CU*/
+                                           RTUNI_ALPHA, /* U+00127a: ETHIOPIC SYLLABLE CI*/
+                                           RTUNI_ALPHA, /* U+00127b: ETHIOPIC SYLLABLE CAA*/
+                                           RTUNI_ALPHA, /* U+00127c: ETHIOPIC SYLLABLE CEE*/
+                                           RTUNI_ALPHA, /* U+00127d: ETHIOPIC SYLLABLE CE*/
+                                           RTUNI_ALPHA, /* U+00127e: ETHIOPIC SYLLABLE CO*/
+                                           RTUNI_ALPHA, /* U+00127f: ETHIOPIC SYLLABLE CWA*/
+                                           RTUNI_ALPHA, /* U+001280: ETHIOPIC SYLLABLE XA*/
+                                           RTUNI_ALPHA, /* U+001281: ETHIOPIC SYLLABLE XU*/
+                                           RTUNI_ALPHA, /* U+001282: ETHIOPIC SYLLABLE XI*/
+                                           RTUNI_ALPHA, /* U+001283: ETHIOPIC SYLLABLE XAA*/
+                                           RTUNI_ALPHA, /* U+001284: ETHIOPIC SYLLABLE XEE*/
+                                           RTUNI_ALPHA, /* U+001285: ETHIOPIC SYLLABLE XE*/
+                                           RTUNI_ALPHA, /* U+001286: ETHIOPIC SYLLABLE XO*/
+                                           RTUNI_ALPHA, /* U+001287: ETHIOPIC SYLLABLE XOA*/
+                                           RTUNI_ALPHA, /* U+001288: ETHIOPIC SYLLABLE XWA*/
+                                                     0, /* U+001289: */
+                                           RTUNI_ALPHA, /* U+00128a: ETHIOPIC SYLLABLE XWI*/
+                                           RTUNI_ALPHA, /* U+00128b: ETHIOPIC SYLLABLE XWAA*/
+                                           RTUNI_ALPHA, /* U+00128c: ETHIOPIC SYLLABLE XWEE*/
+                                           RTUNI_ALPHA, /* U+00128d: ETHIOPIC SYLLABLE XWE*/
+                                                     0, /* U+00128e: */
+                                                     0, /* U+00128f: */
+                                           RTUNI_ALPHA, /* U+001290: ETHIOPIC SYLLABLE NA*/
+                                           RTUNI_ALPHA, /* U+001291: ETHIOPIC SYLLABLE NU*/
+                                           RTUNI_ALPHA, /* U+001292: ETHIOPIC SYLLABLE NI*/
+                                           RTUNI_ALPHA, /* U+001293: ETHIOPIC SYLLABLE NAA*/
+                                           RTUNI_ALPHA, /* U+001294: ETHIOPIC SYLLABLE NEE*/
+                                           RTUNI_ALPHA, /* U+001295: ETHIOPIC SYLLABLE NE*/
+                                           RTUNI_ALPHA, /* U+001296: ETHIOPIC SYLLABLE NO*/
+                                           RTUNI_ALPHA, /* U+001297: ETHIOPIC SYLLABLE NWA*/
+                                           RTUNI_ALPHA, /* U+001298: ETHIOPIC SYLLABLE NYA*/
+                                           RTUNI_ALPHA, /* U+001299: ETHIOPIC SYLLABLE NYU*/
+                                           RTUNI_ALPHA, /* U+00129a: ETHIOPIC SYLLABLE NYI*/
+                                           RTUNI_ALPHA, /* U+00129b: ETHIOPIC SYLLABLE NYAA*/
+                                           RTUNI_ALPHA, /* U+00129c: ETHIOPIC SYLLABLE NYEE*/
+                                           RTUNI_ALPHA, /* U+00129d: ETHIOPIC SYLLABLE NYE*/
+                                           RTUNI_ALPHA, /* U+00129e: ETHIOPIC SYLLABLE NYO*/
+                                           RTUNI_ALPHA, /* U+00129f: ETHIOPIC SYLLABLE NYWA*/
+                                           RTUNI_ALPHA, /* U+0012a0: ETHIOPIC SYLLABLE GLOTTAL A*/
+                                           RTUNI_ALPHA, /* U+0012a1: ETHIOPIC SYLLABLE GLOTTAL U*/
+                                           RTUNI_ALPHA, /* U+0012a2: ETHIOPIC SYLLABLE GLOTTAL I*/
+                                           RTUNI_ALPHA, /* U+0012a3: ETHIOPIC SYLLABLE GLOTTAL AA*/
+                                           RTUNI_ALPHA, /* U+0012a4: ETHIOPIC SYLLABLE GLOTTAL EE*/
+                                           RTUNI_ALPHA, /* U+0012a5: ETHIOPIC SYLLABLE GLOTTAL E*/
+                                           RTUNI_ALPHA, /* U+0012a6: ETHIOPIC SYLLABLE GLOTTAL O*/
+                                           RTUNI_ALPHA, /* U+0012a7: ETHIOPIC SYLLABLE GLOTTAL WA*/
+                                           RTUNI_ALPHA, /* U+0012a8: ETHIOPIC SYLLABLE KA*/
+                                           RTUNI_ALPHA, /* U+0012a9: ETHIOPIC SYLLABLE KU*/
+                                           RTUNI_ALPHA, /* U+0012aa: ETHIOPIC SYLLABLE KI*/
+                                           RTUNI_ALPHA, /* U+0012ab: ETHIOPIC SYLLABLE KAA*/
+                                           RTUNI_ALPHA, /* U+0012ac: ETHIOPIC SYLLABLE KEE*/
+                                           RTUNI_ALPHA, /* U+0012ad: ETHIOPIC SYLLABLE KE*/
+                                           RTUNI_ALPHA, /* U+0012ae: ETHIOPIC SYLLABLE KO*/
+                                           RTUNI_ALPHA, /* U+0012af: ETHIOPIC SYLLABLE KOA*/
+                                           RTUNI_ALPHA, /* U+0012b0: ETHIOPIC SYLLABLE KWA*/
+                                                     0, /* U+0012b1: */
+                                           RTUNI_ALPHA, /* U+0012b2: ETHIOPIC SYLLABLE KWI*/
+                                           RTUNI_ALPHA, /* U+0012b3: ETHIOPIC SYLLABLE KWAA*/
+                                           RTUNI_ALPHA, /* U+0012b4: ETHIOPIC SYLLABLE KWEE*/
+                                           RTUNI_ALPHA, /* U+0012b5: ETHIOPIC SYLLABLE KWE*/
+                                                     0, /* U+0012b6: */
+                                                     0, /* U+0012b7: */
+                                           RTUNI_ALPHA, /* U+0012b8: ETHIOPIC SYLLABLE KXA*/
+                                           RTUNI_ALPHA, /* U+0012b9: ETHIOPIC SYLLABLE KXU*/
+                                           RTUNI_ALPHA, /* U+0012ba: ETHIOPIC SYLLABLE KXI*/
+                                           RTUNI_ALPHA, /* U+0012bb: ETHIOPIC SYLLABLE KXAA*/
+                                           RTUNI_ALPHA, /* U+0012bc: ETHIOPIC SYLLABLE KXEE*/
+                                           RTUNI_ALPHA, /* U+0012bd: ETHIOPIC SYLLABLE KXE*/
+                                           RTUNI_ALPHA, /* U+0012be: ETHIOPIC SYLLABLE KXO*/
+                                                     0, /* U+0012bf: */
+                                           RTUNI_ALPHA, /* U+0012c0: ETHIOPIC SYLLABLE KXWA*/
+                                                     0, /* U+0012c1: */
+                                           RTUNI_ALPHA, /* U+0012c2: ETHIOPIC SYLLABLE KXWI*/
+                                           RTUNI_ALPHA, /* U+0012c3: ETHIOPIC SYLLABLE KXWAA*/
+                                           RTUNI_ALPHA, /* U+0012c4: ETHIOPIC SYLLABLE KXWEE*/
+                                           RTUNI_ALPHA, /* U+0012c5: ETHIOPIC SYLLABLE KXWE*/
+                                                     0, /* U+0012c6: */
+                                                     0, /* U+0012c7: */
+                                           RTUNI_ALPHA, /* U+0012c8: ETHIOPIC SYLLABLE WA*/
+                                           RTUNI_ALPHA, /* U+0012c9: ETHIOPIC SYLLABLE WU*/
+                                           RTUNI_ALPHA, /* U+0012ca: ETHIOPIC SYLLABLE WI*/
+                                           RTUNI_ALPHA, /* U+0012cb: ETHIOPIC SYLLABLE WAA*/
+                                           RTUNI_ALPHA, /* U+0012cc: ETHIOPIC SYLLABLE WEE*/
+                                           RTUNI_ALPHA, /* U+0012cd: ETHIOPIC SYLLABLE WE*/
+                                           RTUNI_ALPHA, /* U+0012ce: ETHIOPIC SYLLABLE WO*/
+                                           RTUNI_ALPHA, /* U+0012cf: ETHIOPIC SYLLABLE WOA*/
+                                           RTUNI_ALPHA, /* U+0012d0: ETHIOPIC SYLLABLE PHARYNGEAL A*/
+                                           RTUNI_ALPHA, /* U+0012d1: ETHIOPIC SYLLABLE PHARYNGEAL U*/
+                                           RTUNI_ALPHA, /* U+0012d2: ETHIOPIC SYLLABLE PHARYNGEAL I*/
+                                           RTUNI_ALPHA, /* U+0012d3: ETHIOPIC SYLLABLE PHARYNGEAL AA*/
+                                           RTUNI_ALPHA, /* U+0012d4: ETHIOPIC SYLLABLE PHARYNGEAL EE*/
+                                           RTUNI_ALPHA, /* U+0012d5: ETHIOPIC SYLLABLE PHARYNGEAL E*/
+                                           RTUNI_ALPHA, /* U+0012d6: ETHIOPIC SYLLABLE PHARYNGEAL O*/
+                                                     0, /* U+0012d7: */
+                                           RTUNI_ALPHA, /* U+0012d8: ETHIOPIC SYLLABLE ZA*/
+                                           RTUNI_ALPHA, /* U+0012d9: ETHIOPIC SYLLABLE ZU*/
+                                           RTUNI_ALPHA, /* U+0012da: ETHIOPIC SYLLABLE ZI*/
+                                           RTUNI_ALPHA, /* U+0012db: ETHIOPIC SYLLABLE ZAA*/
+                                           RTUNI_ALPHA, /* U+0012dc: ETHIOPIC SYLLABLE ZEE*/
+                                           RTUNI_ALPHA, /* U+0012dd: ETHIOPIC SYLLABLE ZE*/
+                                           RTUNI_ALPHA, /* U+0012de: ETHIOPIC SYLLABLE ZO*/
+                                           RTUNI_ALPHA, /* U+0012df: ETHIOPIC SYLLABLE ZWA*/
+                                           RTUNI_ALPHA, /* U+0012e0: ETHIOPIC SYLLABLE ZHA*/
+                                           RTUNI_ALPHA, /* U+0012e1: ETHIOPIC SYLLABLE ZHU*/
+                                           RTUNI_ALPHA, /* U+0012e2: ETHIOPIC SYLLABLE ZHI*/
+                                           RTUNI_ALPHA, /* U+0012e3: ETHIOPIC SYLLABLE ZHAA*/
+                                           RTUNI_ALPHA, /* U+0012e4: ETHIOPIC SYLLABLE ZHEE*/
+                                           RTUNI_ALPHA, /* U+0012e5: ETHIOPIC SYLLABLE ZHE*/
+                                           RTUNI_ALPHA, /* U+0012e6: ETHIOPIC SYLLABLE ZHO*/
+                                           RTUNI_ALPHA, /* U+0012e7: ETHIOPIC SYLLABLE ZHWA*/
+                                           RTUNI_ALPHA, /* U+0012e8: ETHIOPIC SYLLABLE YA*/
+                                           RTUNI_ALPHA, /* U+0012e9: ETHIOPIC SYLLABLE YU*/
+                                           RTUNI_ALPHA, /* U+0012ea: ETHIOPIC SYLLABLE YI*/
+                                           RTUNI_ALPHA, /* U+0012eb: ETHIOPIC SYLLABLE YAA*/
+                                           RTUNI_ALPHA, /* U+0012ec: ETHIOPIC SYLLABLE YEE*/
+                                           RTUNI_ALPHA, /* U+0012ed: ETHIOPIC SYLLABLE YE*/
+                                           RTUNI_ALPHA, /* U+0012ee: ETHIOPIC SYLLABLE YO*/
+                                           RTUNI_ALPHA, /* U+0012ef: ETHIOPIC SYLLABLE YOA*/
+                                           RTUNI_ALPHA, /* U+0012f0: ETHIOPIC SYLLABLE DA*/
+                                           RTUNI_ALPHA, /* U+0012f1: ETHIOPIC SYLLABLE DU*/
+                                           RTUNI_ALPHA, /* U+0012f2: ETHIOPIC SYLLABLE DI*/
+                                           RTUNI_ALPHA, /* U+0012f3: ETHIOPIC SYLLABLE DAA*/
+                                           RTUNI_ALPHA, /* U+0012f4: ETHIOPIC SYLLABLE DEE*/
+                                           RTUNI_ALPHA, /* U+0012f5: ETHIOPIC SYLLABLE DE*/
+                                           RTUNI_ALPHA, /* U+0012f6: ETHIOPIC SYLLABLE DO*/
+                                           RTUNI_ALPHA, /* U+0012f7: ETHIOPIC SYLLABLE DWA*/
+                                           RTUNI_ALPHA, /* U+0012f8: ETHIOPIC SYLLABLE DDA*/
+                                           RTUNI_ALPHA, /* U+0012f9: ETHIOPIC SYLLABLE DDU*/
+                                           RTUNI_ALPHA, /* U+0012fa: ETHIOPIC SYLLABLE DDI*/
+                                           RTUNI_ALPHA, /* U+0012fb: ETHIOPIC SYLLABLE DDAA*/
+                                           RTUNI_ALPHA, /* U+0012fc: ETHIOPIC SYLLABLE DDEE*/
+                                           RTUNI_ALPHA, /* U+0012fd: ETHIOPIC SYLLABLE DDE*/
+                                           RTUNI_ALPHA, /* U+0012fe: ETHIOPIC SYLLABLE DDO*/
+                                           RTUNI_ALPHA, /* U+0012ff: ETHIOPIC SYLLABLE DDWA*/
+                                           RTUNI_ALPHA, /* U+001300: ETHIOPIC SYLLABLE JA*/
+                                           RTUNI_ALPHA, /* U+001301: ETHIOPIC SYLLABLE JU*/
+                                           RTUNI_ALPHA, /* U+001302: ETHIOPIC SYLLABLE JI*/
+                                           RTUNI_ALPHA, /* U+001303: ETHIOPIC SYLLABLE JAA*/
+                                           RTUNI_ALPHA, /* U+001304: ETHIOPIC SYLLABLE JEE*/
+                                           RTUNI_ALPHA, /* U+001305: ETHIOPIC SYLLABLE JE*/
+                                           RTUNI_ALPHA, /* U+001306: ETHIOPIC SYLLABLE JO*/
+                                           RTUNI_ALPHA, /* U+001307: ETHIOPIC SYLLABLE JWA*/
+                                           RTUNI_ALPHA, /* U+001308: ETHIOPIC SYLLABLE GA*/
+                                           RTUNI_ALPHA, /* U+001309: ETHIOPIC SYLLABLE GU*/
+                                           RTUNI_ALPHA, /* U+00130a: ETHIOPIC SYLLABLE GI*/
+                                           RTUNI_ALPHA, /* U+00130b: ETHIOPIC SYLLABLE GAA*/
+                                           RTUNI_ALPHA, /* U+00130c: ETHIOPIC SYLLABLE GEE*/
+                                           RTUNI_ALPHA, /* U+00130d: ETHIOPIC SYLLABLE GE*/
+                                           RTUNI_ALPHA, /* U+00130e: ETHIOPIC SYLLABLE GO*/
+                                           RTUNI_ALPHA, /* U+00130f: ETHIOPIC SYLLABLE GOA*/
+                                           RTUNI_ALPHA, /* U+001310: ETHIOPIC SYLLABLE GWA*/
+                                                     0, /* U+001311: */
+                                           RTUNI_ALPHA, /* U+001312: ETHIOPIC SYLLABLE GWI*/
+                                           RTUNI_ALPHA, /* U+001313: ETHIOPIC SYLLABLE GWAA*/
+                                           RTUNI_ALPHA, /* U+001314: ETHIOPIC SYLLABLE GWEE*/
+                                           RTUNI_ALPHA, /* U+001315: ETHIOPIC SYLLABLE GWE*/
+                                                     0, /* U+001316: */
+                                                     0, /* U+001317: */
+                                           RTUNI_ALPHA, /* U+001318: ETHIOPIC SYLLABLE GGA*/
+                                           RTUNI_ALPHA, /* U+001319: ETHIOPIC SYLLABLE GGU*/
+                                           RTUNI_ALPHA, /* U+00131a: ETHIOPIC SYLLABLE GGI*/
+                                           RTUNI_ALPHA, /* U+00131b: ETHIOPIC SYLLABLE GGAA*/
+                                           RTUNI_ALPHA, /* U+00131c: ETHIOPIC SYLLABLE GGEE*/
+                                           RTUNI_ALPHA, /* U+00131d: ETHIOPIC SYLLABLE GGE*/
+                                           RTUNI_ALPHA, /* U+00131e: ETHIOPIC SYLLABLE GGO*/
+                                           RTUNI_ALPHA, /* U+00131f: ETHIOPIC SYLLABLE GGWAA*/
+                                           RTUNI_ALPHA, /* U+001320: ETHIOPIC SYLLABLE THA*/
+                                           RTUNI_ALPHA, /* U+001321: ETHIOPIC SYLLABLE THU*/
+                                           RTUNI_ALPHA, /* U+001322: ETHIOPIC SYLLABLE THI*/
+                                           RTUNI_ALPHA, /* U+001323: ETHIOPIC SYLLABLE THAA*/
+                                           RTUNI_ALPHA, /* U+001324: ETHIOPIC SYLLABLE THEE*/
+                                           RTUNI_ALPHA, /* U+001325: ETHIOPIC SYLLABLE THE*/
+                                           RTUNI_ALPHA, /* U+001326: ETHIOPIC SYLLABLE THO*/
+                                           RTUNI_ALPHA, /* U+001327: ETHIOPIC SYLLABLE THWA*/
+                                           RTUNI_ALPHA, /* U+001328: ETHIOPIC SYLLABLE CHA*/
+                                           RTUNI_ALPHA, /* U+001329: ETHIOPIC SYLLABLE CHU*/
+                                           RTUNI_ALPHA, /* U+00132a: ETHIOPIC SYLLABLE CHI*/
+                                           RTUNI_ALPHA, /* U+00132b: ETHIOPIC SYLLABLE CHAA*/
+                                           RTUNI_ALPHA, /* U+00132c: ETHIOPIC SYLLABLE CHEE*/
+                                           RTUNI_ALPHA, /* U+00132d: ETHIOPIC SYLLABLE CHE*/
+                                           RTUNI_ALPHA, /* U+00132e: ETHIOPIC SYLLABLE CHO*/
+                                           RTUNI_ALPHA, /* U+00132f: ETHIOPIC SYLLABLE CHWA*/
+                                           RTUNI_ALPHA, /* U+001330: ETHIOPIC SYLLABLE PHA*/
+                                           RTUNI_ALPHA, /* U+001331: ETHIOPIC SYLLABLE PHU*/
+                                           RTUNI_ALPHA, /* U+001332: ETHIOPIC SYLLABLE PHI*/
+                                           RTUNI_ALPHA, /* U+001333: ETHIOPIC SYLLABLE PHAA*/
+                                           RTUNI_ALPHA, /* U+001334: ETHIOPIC SYLLABLE PHEE*/
+                                           RTUNI_ALPHA, /* U+001335: ETHIOPIC SYLLABLE PHE*/
+                                           RTUNI_ALPHA, /* U+001336: ETHIOPIC SYLLABLE PHO*/
+                                           RTUNI_ALPHA, /* U+001337: ETHIOPIC SYLLABLE PHWA*/
+                                           RTUNI_ALPHA, /* U+001338: ETHIOPIC SYLLABLE TSA*/
+                                           RTUNI_ALPHA, /* U+001339: ETHIOPIC SYLLABLE TSU*/
+                                           RTUNI_ALPHA, /* U+00133a: ETHIOPIC SYLLABLE TSI*/
+                                           RTUNI_ALPHA, /* U+00133b: ETHIOPIC SYLLABLE TSAA*/
+                                           RTUNI_ALPHA, /* U+00133c: ETHIOPIC SYLLABLE TSEE*/
+                                           RTUNI_ALPHA, /* U+00133d: ETHIOPIC SYLLABLE TSE*/
+                                           RTUNI_ALPHA, /* U+00133e: ETHIOPIC SYLLABLE TSO*/
+                                           RTUNI_ALPHA, /* U+00133f: ETHIOPIC SYLLABLE TSWA*/
+                                           RTUNI_ALPHA, /* U+001340: ETHIOPIC SYLLABLE TZA*/
+                                           RTUNI_ALPHA, /* U+001341: ETHIOPIC SYLLABLE TZU*/
+                                           RTUNI_ALPHA, /* U+001342: ETHIOPIC SYLLABLE TZI*/
+                                           RTUNI_ALPHA, /* U+001343: ETHIOPIC SYLLABLE TZAA*/
+                                           RTUNI_ALPHA, /* U+001344: ETHIOPIC SYLLABLE TZEE*/
+                                           RTUNI_ALPHA, /* U+001345: ETHIOPIC SYLLABLE TZE*/
+                                           RTUNI_ALPHA, /* U+001346: ETHIOPIC SYLLABLE TZO*/
+                                           RTUNI_ALPHA, /* U+001347: ETHIOPIC SYLLABLE TZOA*/
+                                           RTUNI_ALPHA, /* U+001348: ETHIOPIC SYLLABLE FA*/
+                                           RTUNI_ALPHA, /* U+001349: ETHIOPIC SYLLABLE FU*/
+                                           RTUNI_ALPHA, /* U+00134a: ETHIOPIC SYLLABLE FI*/
+                                           RTUNI_ALPHA, /* U+00134b: ETHIOPIC SYLLABLE FAA*/
+                                           RTUNI_ALPHA, /* U+00134c: ETHIOPIC SYLLABLE FEE*/
+                                           RTUNI_ALPHA, /* U+00134d: ETHIOPIC SYLLABLE FE*/
+                                           RTUNI_ALPHA, /* U+00134e: ETHIOPIC SYLLABLE FO*/
+                                           RTUNI_ALPHA, /* U+00134f: ETHIOPIC SYLLABLE FWA*/
+                                           RTUNI_ALPHA, /* U+001350: ETHIOPIC SYLLABLE PA*/
+                                           RTUNI_ALPHA, /* U+001351: ETHIOPIC SYLLABLE PU*/
+                                           RTUNI_ALPHA, /* U+001352: ETHIOPIC SYLLABLE PI*/
+                                           RTUNI_ALPHA, /* U+001353: ETHIOPIC SYLLABLE PAA*/
+                                           RTUNI_ALPHA, /* U+001354: ETHIOPIC SYLLABLE PEE*/
+                                           RTUNI_ALPHA, /* U+001355: ETHIOPIC SYLLABLE PE*/
+                                           RTUNI_ALPHA, /* U+001356: ETHIOPIC SYLLABLE PO*/
+                                           RTUNI_ALPHA, /* U+001357: ETHIOPIC SYLLABLE PWA*/
+                                           RTUNI_ALPHA, /* U+001358: ETHIOPIC SYLLABLE RYA*/
+                                           RTUNI_ALPHA, /* U+001359: ETHIOPIC SYLLABLE MYA*/
+                                           RTUNI_ALPHA, /* U+00135a: ETHIOPIC SYLLABLE FYA*/
+                                                     0, /* U+00135b: */
+                                                     0, /* U+00135c: */
+                                                     0, /* U+00135d: ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK*/
+                                                     0, /* U+00135e: ETHIOPIC COMBINING VOWEL LENGTH MARK*/
+                                           RTUNI_ALPHA, /* U+00135f: ETHIOPIC COMBINING GEMINATION MARK*/
+                                                     0, /* U+001360: ETHIOPIC SECTION MARK*/
+                                                     0, /* U+001361: ETHIOPIC WORDSPACE*/
+                                                     0, /* U+001362: ETHIOPIC FULL STOP*/
+                                                     0, /* U+001363: ETHIOPIC COMMA*/
+                                                     0, /* U+001364: ETHIOPIC SEMICOLON*/
+                                                     0, /* U+001365: ETHIOPIC COLON*/
+                                                     0, /* U+001366: ETHIOPIC PREFACE COLON*/
+                                                     0, /* U+001367: ETHIOPIC QUESTION MARK*/
+                                                     0, /* U+001368: ETHIOPIC PARAGRAPH SEPARATOR*/
+                                                     0, /* U+001369: ETHIOPIC DIGIT ONE*/
+                                                     0, /* U+00136a: ETHIOPIC DIGIT TWO*/
+                                                     0, /* U+00136b: ETHIOPIC DIGIT THREE*/
+                                                     0, /* U+00136c: ETHIOPIC DIGIT FOUR*/
+                                                     0, /* U+00136d: ETHIOPIC DIGIT FIVE*/
+                                                     0, /* U+00136e: ETHIOPIC DIGIT SIX*/
+                                                     0, /* U+00136f: ETHIOPIC DIGIT SEVEN*/
+                                                     0, /* U+001370: ETHIOPIC DIGIT EIGHT*/
+                                                     0, /* U+001371: ETHIOPIC DIGIT NINE*/
+                                                     0, /* U+001372: ETHIOPIC NUMBER TEN*/
+                                                     0, /* U+001373: ETHIOPIC NUMBER TWENTY*/
+                                                     0, /* U+001374: ETHIOPIC NUMBER THIRTY*/
+                                                     0, /* U+001375: ETHIOPIC NUMBER FORTY*/
+                                                     0, /* U+001376: ETHIOPIC NUMBER FIFTY*/
+                                                     0, /* U+001377: ETHIOPIC NUMBER SIXTY*/
+                                                     0, /* U+001378: ETHIOPIC NUMBER SEVENTY*/
+                                                     0, /* U+001379: ETHIOPIC NUMBER EIGHTY*/
+                                                     0, /* U+00137a: ETHIOPIC NUMBER NINETY*/
+                                                     0, /* U+00137b: ETHIOPIC NUMBER HUNDRED*/
+                                                     0, /* U+00137c: ETHIOPIC NUMBER TEN THOUSAND*/
+                                                     0, /* U+00137d: */
+                                                     0, /* U+00137e: */
+                                                     0, /* U+00137f: */
+                                           RTUNI_ALPHA, /* U+001380: ETHIOPIC SYLLABLE SEBATBEIT MWA*/
+                                           RTUNI_ALPHA, /* U+001381: ETHIOPIC SYLLABLE MWI*/
+                                           RTUNI_ALPHA, /* U+001382: ETHIOPIC SYLLABLE MWEE*/
+                                           RTUNI_ALPHA, /* U+001383: ETHIOPIC SYLLABLE MWE*/
+                                           RTUNI_ALPHA, /* U+001384: ETHIOPIC SYLLABLE SEBATBEIT BWA*/
+                                           RTUNI_ALPHA, /* U+001385: ETHIOPIC SYLLABLE BWI*/
+                                           RTUNI_ALPHA, /* U+001386: ETHIOPIC SYLLABLE BWEE*/
+                                           RTUNI_ALPHA, /* U+001387: ETHIOPIC SYLLABLE BWE*/
+                                           RTUNI_ALPHA, /* U+001388: ETHIOPIC SYLLABLE SEBATBEIT FWA*/
+                                           RTUNI_ALPHA, /* U+001389: ETHIOPIC SYLLABLE FWI*/
+                                           RTUNI_ALPHA, /* U+00138a: ETHIOPIC SYLLABLE FWEE*/
+                                           RTUNI_ALPHA, /* U+00138b: ETHIOPIC SYLLABLE FWE*/
+                                           RTUNI_ALPHA, /* U+00138c: ETHIOPIC SYLLABLE SEBATBEIT PWA*/
+                                           RTUNI_ALPHA, /* U+00138d: ETHIOPIC SYLLABLE PWI*/
+                                           RTUNI_ALPHA, /* U+00138e: ETHIOPIC SYLLABLE PWEE*/
+                                           RTUNI_ALPHA, /* U+00138f: ETHIOPIC SYLLABLE PWE*/
+                                                     0, /* U+001390: ETHIOPIC TONAL MARK YIZET*/
+                                                     0, /* U+001391: ETHIOPIC TONAL MARK DERET*/
+                                                     0, /* U+001392: ETHIOPIC TONAL MARK RIKRIK*/
+                                                     0, /* U+001393: ETHIOPIC TONAL MARK SHORT RIKRIK*/
+                                                     0, /* U+001394: ETHIOPIC TONAL MARK DIFAT*/
+                                                     0, /* U+001395: ETHIOPIC TONAL MARK KENAT*/
+                                                     0, /* U+001396: ETHIOPIC TONAL MARK CHIRET*/
+                                                     0, /* U+001397: ETHIOPIC TONAL MARK HIDET*/
+                                                     0, /* U+001398: ETHIOPIC TONAL MARK DERET-HIDET*/
+                                                     0, /* U+001399: ETHIOPIC TONAL MARK KURT*/
+                                                     0, /* U+00139a: */
+                                                     0, /* U+00139b: */
+                                                     0, /* U+00139c: */
+                                                     0, /* U+00139d: */
+                                                     0, /* U+00139e: */
+                                                     0, /* U+00139f: */
+                                           RTUNI_ALPHA, /* U+0013a0: CHEROKEE LETTER A*/
+                                           RTUNI_ALPHA, /* U+0013a1: CHEROKEE LETTER E*/
+                                           RTUNI_ALPHA, /* U+0013a2: CHEROKEE LETTER I*/
+                                           RTUNI_ALPHA, /* U+0013a3: CHEROKEE LETTER O*/
+                                           RTUNI_ALPHA, /* U+0013a4: CHEROKEE LETTER U*/
+                                           RTUNI_ALPHA, /* U+0013a5: CHEROKEE LETTER V*/
+                                           RTUNI_ALPHA, /* U+0013a6: CHEROKEE LETTER GA*/
+                                           RTUNI_ALPHA, /* U+0013a7: CHEROKEE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+0013a8: CHEROKEE LETTER GE*/
+                                           RTUNI_ALPHA, /* U+0013a9: CHEROKEE LETTER GI*/
+                                           RTUNI_ALPHA, /* U+0013aa: CHEROKEE LETTER GO*/
+                                           RTUNI_ALPHA, /* U+0013ab: CHEROKEE LETTER GU*/
+                                           RTUNI_ALPHA, /* U+0013ac: CHEROKEE LETTER GV*/
+                                           RTUNI_ALPHA, /* U+0013ad: CHEROKEE LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0013ae: CHEROKEE LETTER HE*/
+                                           RTUNI_ALPHA, /* U+0013af: CHEROKEE LETTER HI*/
+                                           RTUNI_ALPHA, /* U+0013b0: CHEROKEE LETTER HO*/
+                                           RTUNI_ALPHA, /* U+0013b1: CHEROKEE LETTER HU*/
+                                           RTUNI_ALPHA, /* U+0013b2: CHEROKEE LETTER HV*/
+                                           RTUNI_ALPHA, /* U+0013b3: CHEROKEE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0013b4: CHEROKEE LETTER LE*/
+                                           RTUNI_ALPHA, /* U+0013b5: CHEROKEE LETTER LI*/
+                                           RTUNI_ALPHA, /* U+0013b6: CHEROKEE LETTER LO*/
+                                           RTUNI_ALPHA, /* U+0013b7: CHEROKEE LETTER LU*/
+                                           RTUNI_ALPHA, /* U+0013b8: CHEROKEE LETTER LV*/
+                                           RTUNI_ALPHA, /* U+0013b9: CHEROKEE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0013ba: CHEROKEE LETTER ME*/
+                                           RTUNI_ALPHA, /* U+0013bb: CHEROKEE LETTER MI*/
+                                           RTUNI_ALPHA, /* U+0013bc: CHEROKEE LETTER MO*/
+                                           RTUNI_ALPHA, /* U+0013bd: CHEROKEE LETTER MU*/
+                                           RTUNI_ALPHA, /* U+0013be: CHEROKEE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0013bf: CHEROKEE LETTER HNA*/
+                                           RTUNI_ALPHA, /* U+0013c0: CHEROKEE LETTER NAH*/
+                                           RTUNI_ALPHA, /* U+0013c1: CHEROKEE LETTER NE*/
+                                           RTUNI_ALPHA, /* U+0013c2: CHEROKEE LETTER NI*/
+                                           RTUNI_ALPHA, /* U+0013c3: CHEROKEE LETTER NO*/
+                                           RTUNI_ALPHA, /* U+0013c4: CHEROKEE LETTER NU*/
+                                           RTUNI_ALPHA, /* U+0013c5: CHEROKEE LETTER NV*/
+                                           RTUNI_ALPHA, /* U+0013c6: CHEROKEE LETTER QUA*/
+                                           RTUNI_ALPHA, /* U+0013c7: CHEROKEE LETTER QUE*/
+                                           RTUNI_ALPHA, /* U+0013c8: CHEROKEE LETTER QUI*/
+                                           RTUNI_ALPHA, /* U+0013c9: CHEROKEE LETTER QUO*/
+                                           RTUNI_ALPHA, /* U+0013ca: CHEROKEE LETTER QUU*/
+                                           RTUNI_ALPHA, /* U+0013cb: CHEROKEE LETTER QUV*/
+                                           RTUNI_ALPHA, /* U+0013cc: CHEROKEE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0013cd: CHEROKEE LETTER S*/
+                                           RTUNI_ALPHA, /* U+0013ce: CHEROKEE LETTER SE*/
+                                           RTUNI_ALPHA, /* U+0013cf: CHEROKEE LETTER SI*/
+                                           RTUNI_ALPHA, /* U+0013d0: CHEROKEE LETTER SO*/
+                                           RTUNI_ALPHA, /* U+0013d1: CHEROKEE LETTER SU*/
+                                           RTUNI_ALPHA, /* U+0013d2: CHEROKEE LETTER SV*/
+                                           RTUNI_ALPHA, /* U+0013d3: CHEROKEE LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0013d4: CHEROKEE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0013d5: CHEROKEE LETTER DE*/
+                                           RTUNI_ALPHA, /* U+0013d6: CHEROKEE LETTER TE*/
+                                           RTUNI_ALPHA, /* U+0013d7: CHEROKEE LETTER DI*/
+                                           RTUNI_ALPHA, /* U+0013d8: CHEROKEE LETTER TI*/
+                                           RTUNI_ALPHA, /* U+0013d9: CHEROKEE LETTER DO*/
+                                           RTUNI_ALPHA, /* U+0013da: CHEROKEE LETTER DU*/
+                                           RTUNI_ALPHA, /* U+0013db: CHEROKEE LETTER DV*/
+                                           RTUNI_ALPHA, /* U+0013dc: CHEROKEE LETTER DLA*/
+                                           RTUNI_ALPHA, /* U+0013dd: CHEROKEE LETTER TLA*/
+                                           RTUNI_ALPHA, /* U+0013de: CHEROKEE LETTER TLE*/
+                                           RTUNI_ALPHA, /* U+0013df: CHEROKEE LETTER TLI*/
+                                           RTUNI_ALPHA, /* U+0013e0: CHEROKEE LETTER TLO*/
+                                           RTUNI_ALPHA, /* U+0013e1: CHEROKEE LETTER TLU*/
+                                           RTUNI_ALPHA, /* U+0013e2: CHEROKEE LETTER TLV*/
+                                           RTUNI_ALPHA, /* U+0013e3: CHEROKEE LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+0013e4: CHEROKEE LETTER TSE*/
+                                           RTUNI_ALPHA, /* U+0013e5: CHEROKEE LETTER TSI*/
+                                           RTUNI_ALPHA, /* U+0013e6: CHEROKEE LETTER TSO*/
+                                           RTUNI_ALPHA, /* U+0013e7: CHEROKEE LETTER TSU*/
+                                           RTUNI_ALPHA, /* U+0013e8: CHEROKEE LETTER TSV*/
+                                           RTUNI_ALPHA, /* U+0013e9: CHEROKEE LETTER WA*/
+                                           RTUNI_ALPHA, /* U+0013ea: CHEROKEE LETTER WE*/
+                                           RTUNI_ALPHA, /* U+0013eb: CHEROKEE LETTER WI*/
+                                           RTUNI_ALPHA, /* U+0013ec: CHEROKEE LETTER WO*/
+                                           RTUNI_ALPHA, /* U+0013ed: CHEROKEE LETTER WU*/
+                                           RTUNI_ALPHA, /* U+0013ee: CHEROKEE LETTER WV*/
+                                           RTUNI_ALPHA, /* U+0013ef: CHEROKEE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0013f0: CHEROKEE LETTER YE*/
+                                           RTUNI_ALPHA, /* U+0013f1: CHEROKEE LETTER YI*/
+                                           RTUNI_ALPHA, /* U+0013f2: CHEROKEE LETTER YO*/
+                                           RTUNI_ALPHA, /* U+0013f3: CHEROKEE LETTER YU*/
+                                           RTUNI_ALPHA, /* U+0013f4: CHEROKEE LETTER YV*/
+                                                     0, /* U+0013f5: */
+                                                     0, /* U+0013f6: */
+                                                     0, /* U+0013f7: */
+                                                     0, /* U+0013f8: */
+                                                     0, /* U+0013f9: */
+                                                     0, /* U+0013fa: */
+                                                     0, /* U+0013fb: */
+                                                     0, /* U+0013fc: */
+                                                     0, /* U+0013fd: */
+                                                     0, /* U+0013fe: */
+                                                     0, /* U+0013ff: */
+                                                     0, /* U+001400: CANADIAN SYLLABICS HYPHEN*/
+                                           RTUNI_ALPHA, /* U+001401: CANADIAN SYLLABICS E*/
+                                           RTUNI_ALPHA, /* U+001402: CANADIAN SYLLABICS AAI*/
+                                           RTUNI_ALPHA, /* U+001403: CANADIAN SYLLABICS I*/
+                                           RTUNI_ALPHA, /* U+001404: CANADIAN SYLLABICS II*/
+                                           RTUNI_ALPHA, /* U+001405: CANADIAN SYLLABICS O*/
+                                           RTUNI_ALPHA, /* U+001406: CANADIAN SYLLABICS OO*/
+                                           RTUNI_ALPHA, /* U+001407: CANADIAN SYLLABICS Y-CREE OO*/
+                                           RTUNI_ALPHA, /* U+001408: CANADIAN SYLLABICS CARRIER EE*/
+                                           RTUNI_ALPHA, /* U+001409: CANADIAN SYLLABICS CARRIER I*/
+                                           RTUNI_ALPHA, /* U+00140a: CANADIAN SYLLABICS A*/
+                                           RTUNI_ALPHA, /* U+00140b: CANADIAN SYLLABICS AA*/
+                                           RTUNI_ALPHA, /* U+00140c: CANADIAN SYLLABICS WE*/
+                                           RTUNI_ALPHA, /* U+00140d: CANADIAN SYLLABICS WEST-CREE WE*/
+                                           RTUNI_ALPHA, /* U+00140e: CANADIAN SYLLABICS WI*/
+                                           RTUNI_ALPHA, /* U+00140f: CANADIAN SYLLABICS WEST-CREE WI*/
+                                           RTUNI_ALPHA, /* U+001410: CANADIAN SYLLABICS WII*/
+                                           RTUNI_ALPHA, /* U+001411: CANADIAN SYLLABICS WEST-CREE WII*/
+                                           RTUNI_ALPHA, /* U+001412: CANADIAN SYLLABICS WO*/
+                                           RTUNI_ALPHA, /* U+001413: CANADIAN SYLLABICS WEST-CREE WO*/
+                                           RTUNI_ALPHA, /* U+001414: CANADIAN SYLLABICS WOO*/
+                                           RTUNI_ALPHA, /* U+001415: CANADIAN SYLLABICS WEST-CREE WOO*/
+                                           RTUNI_ALPHA, /* U+001416: CANADIAN SYLLABICS NASKAPI WOO*/
+                                           RTUNI_ALPHA, /* U+001417: CANADIAN SYLLABICS WA*/
+                                           RTUNI_ALPHA, /* U+001418: CANADIAN SYLLABICS WEST-CREE WA*/
+                                           RTUNI_ALPHA, /* U+001419: CANADIAN SYLLABICS WAA*/
+                                           RTUNI_ALPHA, /* U+00141a: CANADIAN SYLLABICS WEST-CREE WAA*/
+                                           RTUNI_ALPHA, /* U+00141b: CANADIAN SYLLABICS NASKAPI WAA*/
+                                           RTUNI_ALPHA, /* U+00141c: CANADIAN SYLLABICS AI*/
+                                           RTUNI_ALPHA, /* U+00141d: CANADIAN SYLLABICS Y-CREE W*/
+                                           RTUNI_ALPHA, /* U+00141e: CANADIAN SYLLABICS GLOTTAL STOP*/
+                                           RTUNI_ALPHA, /* U+00141f: CANADIAN SYLLABICS FINAL ACUTE*/
+                                           RTUNI_ALPHA, /* U+001420: CANADIAN SYLLABICS FINAL GRAVE*/
+                                           RTUNI_ALPHA, /* U+001421: CANADIAN SYLLABICS FINAL BOTTOM HALF RING*/
+                                           RTUNI_ALPHA, /* U+001422: CANADIAN SYLLABICS FINAL TOP HALF RING*/
+                                           RTUNI_ALPHA, /* U+001423: CANADIAN SYLLABICS FINAL RIGHT HALF RING*/
+                                           RTUNI_ALPHA, /* U+001424: CANADIAN SYLLABICS FINAL RING*/
+                                           RTUNI_ALPHA, /* U+001425: CANADIAN SYLLABICS FINAL DOUBLE ACUTE*/
+                                           RTUNI_ALPHA, /* U+001426: CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES*/
+                                           RTUNI_ALPHA, /* U+001427: CANADIAN SYLLABICS FINAL MIDDLE DOT*/
+                                           RTUNI_ALPHA, /* U+001428: CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE*/
+                                           RTUNI_ALPHA, /* U+001429: CANADIAN SYLLABICS FINAL PLUS*/
+                                           RTUNI_ALPHA, /* U+00142a: CANADIAN SYLLABICS FINAL DOWN TACK*/
+                                           RTUNI_ALPHA, /* U+00142b: CANADIAN SYLLABICS EN*/
+                                           RTUNI_ALPHA, /* U+00142c: CANADIAN SYLLABICS IN*/
+                                           RTUNI_ALPHA, /* U+00142d: CANADIAN SYLLABICS ON*/
+                                           RTUNI_ALPHA, /* U+00142e: CANADIAN SYLLABICS AN*/
+                                           RTUNI_ALPHA, /* U+00142f: CANADIAN SYLLABICS PE*/
+                                           RTUNI_ALPHA, /* U+001430: CANADIAN SYLLABICS PAAI*/
+                                           RTUNI_ALPHA, /* U+001431: CANADIAN SYLLABICS PI*/
+                                           RTUNI_ALPHA, /* U+001432: CANADIAN SYLLABICS PII*/
+                                           RTUNI_ALPHA, /* U+001433: CANADIAN SYLLABICS PO*/
+                                           RTUNI_ALPHA, /* U+001434: CANADIAN SYLLABICS POO*/
+                                           RTUNI_ALPHA, /* U+001435: CANADIAN SYLLABICS Y-CREE POO*/
+                                           RTUNI_ALPHA, /* U+001436: CANADIAN SYLLABICS CARRIER HEE*/
+                                           RTUNI_ALPHA, /* U+001437: CANADIAN SYLLABICS CARRIER HI*/
+                                           RTUNI_ALPHA, /* U+001438: CANADIAN SYLLABICS PA*/
+                                           RTUNI_ALPHA, /* U+001439: CANADIAN SYLLABICS PAA*/
+                                           RTUNI_ALPHA, /* U+00143a: CANADIAN SYLLABICS PWE*/
+                                           RTUNI_ALPHA, /* U+00143b: CANADIAN SYLLABICS WEST-CREE PWE*/
+                                           RTUNI_ALPHA, /* U+00143c: CANADIAN SYLLABICS PWI*/
+                                           RTUNI_ALPHA, /* U+00143d: CANADIAN SYLLABICS WEST-CREE PWI*/
+                                           RTUNI_ALPHA, /* U+00143e: CANADIAN SYLLABICS PWII*/
+                                           RTUNI_ALPHA, /* U+00143f: CANADIAN SYLLABICS WEST-CREE PWII*/
+                                           RTUNI_ALPHA, /* U+001440: CANADIAN SYLLABICS PWO*/
+                                           RTUNI_ALPHA, /* U+001441: CANADIAN SYLLABICS WEST-CREE PWO*/
+                                           RTUNI_ALPHA, /* U+001442: CANADIAN SYLLABICS PWOO*/
+                                           RTUNI_ALPHA, /* U+001443: CANADIAN SYLLABICS WEST-CREE PWOO*/
+                                           RTUNI_ALPHA, /* U+001444: CANADIAN SYLLABICS PWA*/
+                                           RTUNI_ALPHA, /* U+001445: CANADIAN SYLLABICS WEST-CREE PWA*/
+                                           RTUNI_ALPHA, /* U+001446: CANADIAN SYLLABICS PWAA*/
+                                           RTUNI_ALPHA, /* U+001447: CANADIAN SYLLABICS WEST-CREE PWAA*/
+                                           RTUNI_ALPHA, /* U+001448: CANADIAN SYLLABICS Y-CREE PWAA*/
+                                           RTUNI_ALPHA, /* U+001449: CANADIAN SYLLABICS P*/
+                                           RTUNI_ALPHA, /* U+00144a: CANADIAN SYLLABICS WEST-CREE P*/
+                                           RTUNI_ALPHA, /* U+00144b: CANADIAN SYLLABICS CARRIER H*/
+                                           RTUNI_ALPHA, /* U+00144c: CANADIAN SYLLABICS TE*/
+                                           RTUNI_ALPHA, /* U+00144d: CANADIAN SYLLABICS TAAI*/
+                                           RTUNI_ALPHA, /* U+00144e: CANADIAN SYLLABICS TI*/
+                                           RTUNI_ALPHA, /* U+00144f: CANADIAN SYLLABICS TII*/
+                                           RTUNI_ALPHA, /* U+001450: CANADIAN SYLLABICS TO*/
+                                           RTUNI_ALPHA, /* U+001451: CANADIAN SYLLABICS TOO*/
+                                           RTUNI_ALPHA, /* U+001452: CANADIAN SYLLABICS Y-CREE TOO*/
+                                           RTUNI_ALPHA, /* U+001453: CANADIAN SYLLABICS CARRIER DEE*/
+                                           RTUNI_ALPHA, /* U+001454: CANADIAN SYLLABICS CARRIER DI*/
+                                           RTUNI_ALPHA, /* U+001455: CANADIAN SYLLABICS TA*/
+                                           RTUNI_ALPHA, /* U+001456: CANADIAN SYLLABICS TAA*/
+                                           RTUNI_ALPHA, /* U+001457: CANADIAN SYLLABICS TWE*/
+                                           RTUNI_ALPHA, /* U+001458: CANADIAN SYLLABICS WEST-CREE TWE*/
+                                           RTUNI_ALPHA, /* U+001459: CANADIAN SYLLABICS TWI*/
+                                           RTUNI_ALPHA, /* U+00145a: CANADIAN SYLLABICS WEST-CREE TWI*/
+                                           RTUNI_ALPHA, /* U+00145b: CANADIAN SYLLABICS TWII*/
+                                           RTUNI_ALPHA, /* U+00145c: CANADIAN SYLLABICS WEST-CREE TWII*/
+                                           RTUNI_ALPHA, /* U+00145d: CANADIAN SYLLABICS TWO*/
+                                           RTUNI_ALPHA, /* U+00145e: CANADIAN SYLLABICS WEST-CREE TWO*/
+                                           RTUNI_ALPHA, /* U+00145f: CANADIAN SYLLABICS TWOO*/
+                                           RTUNI_ALPHA, /* U+001460: CANADIAN SYLLABICS WEST-CREE TWOO*/
+                                           RTUNI_ALPHA, /* U+001461: CANADIAN SYLLABICS TWA*/
+                                           RTUNI_ALPHA, /* U+001462: CANADIAN SYLLABICS WEST-CREE TWA*/
+                                           RTUNI_ALPHA, /* U+001463: CANADIAN SYLLABICS TWAA*/
+                                           RTUNI_ALPHA, /* U+001464: CANADIAN SYLLABICS WEST-CREE TWAA*/
+                                           RTUNI_ALPHA, /* U+001465: CANADIAN SYLLABICS NASKAPI TWAA*/
+                                           RTUNI_ALPHA, /* U+001466: CANADIAN SYLLABICS T*/
+                                           RTUNI_ALPHA, /* U+001467: CANADIAN SYLLABICS TTE*/
+                                           RTUNI_ALPHA, /* U+001468: CANADIAN SYLLABICS TTI*/
+                                           RTUNI_ALPHA, /* U+001469: CANADIAN SYLLABICS TTO*/
+                                           RTUNI_ALPHA, /* U+00146a: CANADIAN SYLLABICS TTA*/
+                                           RTUNI_ALPHA, /* U+00146b: CANADIAN SYLLABICS KE*/
+                                           RTUNI_ALPHA, /* U+00146c: CANADIAN SYLLABICS KAAI*/
+                                           RTUNI_ALPHA, /* U+00146d: CANADIAN SYLLABICS KI*/
+                                           RTUNI_ALPHA, /* U+00146e: CANADIAN SYLLABICS KII*/
+                                           RTUNI_ALPHA, /* U+00146f: CANADIAN SYLLABICS KO*/
+                                           RTUNI_ALPHA, /* U+001470: CANADIAN SYLLABICS KOO*/
+                                           RTUNI_ALPHA, /* U+001471: CANADIAN SYLLABICS Y-CREE KOO*/
+                                           RTUNI_ALPHA, /* U+001472: CANADIAN SYLLABICS KA*/
+                                           RTUNI_ALPHA, /* U+001473: CANADIAN SYLLABICS KAA*/
+                                           RTUNI_ALPHA, /* U+001474: CANADIAN SYLLABICS KWE*/
+                                           RTUNI_ALPHA, /* U+001475: CANADIAN SYLLABICS WEST-CREE KWE*/
+                                           RTUNI_ALPHA, /* U+001476: CANADIAN SYLLABICS KWI*/
+                                           RTUNI_ALPHA, /* U+001477: CANADIAN SYLLABICS WEST-CREE KWI*/
+                                           RTUNI_ALPHA, /* U+001478: CANADIAN SYLLABICS KWII*/
+                                           RTUNI_ALPHA, /* U+001479: CANADIAN SYLLABICS WEST-CREE KWII*/
+                                           RTUNI_ALPHA, /* U+00147a: CANADIAN SYLLABICS KWO*/
+                                           RTUNI_ALPHA, /* U+00147b: CANADIAN SYLLABICS WEST-CREE KWO*/
+                                           RTUNI_ALPHA, /* U+00147c: CANADIAN SYLLABICS KWOO*/
+                                           RTUNI_ALPHA, /* U+00147d: CANADIAN SYLLABICS WEST-CREE KWOO*/
+                                           RTUNI_ALPHA, /* U+00147e: CANADIAN SYLLABICS KWA*/
+                                           RTUNI_ALPHA, /* U+00147f: CANADIAN SYLLABICS WEST-CREE KWA*/
+                                           RTUNI_ALPHA, /* U+001480: CANADIAN SYLLABICS KWAA*/
+                                           RTUNI_ALPHA, /* U+001481: CANADIAN SYLLABICS WEST-CREE KWAA*/
+                                           RTUNI_ALPHA, /* U+001482: CANADIAN SYLLABICS NASKAPI KWAA*/
+                                           RTUNI_ALPHA, /* U+001483: CANADIAN SYLLABICS K*/
+                                           RTUNI_ALPHA, /* U+001484: CANADIAN SYLLABICS KW*/
+                                           RTUNI_ALPHA, /* U+001485: CANADIAN SYLLABICS SOUTH-SLAVEY KEH*/
+                                           RTUNI_ALPHA, /* U+001486: CANADIAN SYLLABICS SOUTH-SLAVEY KIH*/
+                                           RTUNI_ALPHA, /* U+001487: CANADIAN SYLLABICS SOUTH-SLAVEY KOH*/
+                                           RTUNI_ALPHA, /* U+001488: CANADIAN SYLLABICS SOUTH-SLAVEY KAH*/
+                                           RTUNI_ALPHA, /* U+001489: CANADIAN SYLLABICS CE*/
+                                           RTUNI_ALPHA, /* U+00148a: CANADIAN SYLLABICS CAAI*/
+                                           RTUNI_ALPHA, /* U+00148b: CANADIAN SYLLABICS CI*/
+                                           RTUNI_ALPHA, /* U+00148c: CANADIAN SYLLABICS CII*/
+                                           RTUNI_ALPHA, /* U+00148d: CANADIAN SYLLABICS CO*/
+                                           RTUNI_ALPHA, /* U+00148e: CANADIAN SYLLABICS COO*/
+                                           RTUNI_ALPHA, /* U+00148f: CANADIAN SYLLABICS Y-CREE COO*/
+                                           RTUNI_ALPHA, /* U+001490: CANADIAN SYLLABICS CA*/
+                                           RTUNI_ALPHA, /* U+001491: CANADIAN SYLLABICS CAA*/
+                                           RTUNI_ALPHA, /* U+001492: CANADIAN SYLLABICS CWE*/
+                                           RTUNI_ALPHA, /* U+001493: CANADIAN SYLLABICS WEST-CREE CWE*/
+                                           RTUNI_ALPHA, /* U+001494: CANADIAN SYLLABICS CWI*/
+                                           RTUNI_ALPHA, /* U+001495: CANADIAN SYLLABICS WEST-CREE CWI*/
+                                           RTUNI_ALPHA, /* U+001496: CANADIAN SYLLABICS CWII*/
+                                           RTUNI_ALPHA, /* U+001497: CANADIAN SYLLABICS WEST-CREE CWII*/
+                                           RTUNI_ALPHA, /* U+001498: CANADIAN SYLLABICS CWO*/
+                                           RTUNI_ALPHA, /* U+001499: CANADIAN SYLLABICS WEST-CREE CWO*/
+                                           RTUNI_ALPHA, /* U+00149a: CANADIAN SYLLABICS CWOO*/
+                                           RTUNI_ALPHA, /* U+00149b: CANADIAN SYLLABICS WEST-CREE CWOO*/
+                                           RTUNI_ALPHA, /* U+00149c: CANADIAN SYLLABICS CWA*/
+                                           RTUNI_ALPHA, /* U+00149d: CANADIAN SYLLABICS WEST-CREE CWA*/
+                                           RTUNI_ALPHA, /* U+00149e: CANADIAN SYLLABICS CWAA*/
+                                           RTUNI_ALPHA, /* U+00149f: CANADIAN SYLLABICS WEST-CREE CWAA*/
+                                           RTUNI_ALPHA, /* U+0014a0: CANADIAN SYLLABICS NASKAPI CWAA*/
+                                           RTUNI_ALPHA, /* U+0014a1: CANADIAN SYLLABICS C*/
+                                           RTUNI_ALPHA, /* U+0014a2: CANADIAN SYLLABICS SAYISI TH*/
+                                           RTUNI_ALPHA, /* U+0014a3: CANADIAN SYLLABICS ME*/
+                                           RTUNI_ALPHA, /* U+0014a4: CANADIAN SYLLABICS MAAI*/
+                                           RTUNI_ALPHA, /* U+0014a5: CANADIAN SYLLABICS MI*/
+                                           RTUNI_ALPHA, /* U+0014a6: CANADIAN SYLLABICS MII*/
+                                           RTUNI_ALPHA, /* U+0014a7: CANADIAN SYLLABICS MO*/
+                                           RTUNI_ALPHA, /* U+0014a8: CANADIAN SYLLABICS MOO*/
+                                           RTUNI_ALPHA, /* U+0014a9: CANADIAN SYLLABICS Y-CREE MOO*/
+                                           RTUNI_ALPHA, /* U+0014aa: CANADIAN SYLLABICS MA*/
+                                           RTUNI_ALPHA, /* U+0014ab: CANADIAN SYLLABICS MAA*/
+                                           RTUNI_ALPHA, /* U+0014ac: CANADIAN SYLLABICS MWE*/
+                                           RTUNI_ALPHA, /* U+0014ad: CANADIAN SYLLABICS WEST-CREE MWE*/
+                                           RTUNI_ALPHA, /* U+0014ae: CANADIAN SYLLABICS MWI*/
+                                           RTUNI_ALPHA, /* U+0014af: CANADIAN SYLLABICS WEST-CREE MWI*/
+                                           RTUNI_ALPHA, /* U+0014b0: CANADIAN SYLLABICS MWII*/
+                                           RTUNI_ALPHA, /* U+0014b1: CANADIAN SYLLABICS WEST-CREE MWII*/
+                                           RTUNI_ALPHA, /* U+0014b2: CANADIAN SYLLABICS MWO*/
+                                           RTUNI_ALPHA, /* U+0014b3: CANADIAN SYLLABICS WEST-CREE MWO*/
+                                           RTUNI_ALPHA, /* U+0014b4: CANADIAN SYLLABICS MWOO*/
+                                           RTUNI_ALPHA, /* U+0014b5: CANADIAN SYLLABICS WEST-CREE MWOO*/
+                                           RTUNI_ALPHA, /* U+0014b6: CANADIAN SYLLABICS MWA*/
+                                           RTUNI_ALPHA, /* U+0014b7: CANADIAN SYLLABICS WEST-CREE MWA*/
+                                           RTUNI_ALPHA, /* U+0014b8: CANADIAN SYLLABICS MWAA*/
+                                           RTUNI_ALPHA, /* U+0014b9: CANADIAN SYLLABICS WEST-CREE MWAA*/
+                                           RTUNI_ALPHA, /* U+0014ba: CANADIAN SYLLABICS NASKAPI MWAA*/
+                                           RTUNI_ALPHA, /* U+0014bb: CANADIAN SYLLABICS M*/
+                                           RTUNI_ALPHA, /* U+0014bc: CANADIAN SYLLABICS WEST-CREE M*/
+                                           RTUNI_ALPHA, /* U+0014bd: CANADIAN SYLLABICS MH*/
+                                           RTUNI_ALPHA, /* U+0014be: CANADIAN SYLLABICS ATHAPASCAN M*/
+                                           RTUNI_ALPHA, /* U+0014bf: CANADIAN SYLLABICS SAYISI M*/
+                                           RTUNI_ALPHA, /* U+0014c0: CANADIAN SYLLABICS NE*/
+                                           RTUNI_ALPHA, /* U+0014c1: CANADIAN SYLLABICS NAAI*/
+                                           RTUNI_ALPHA, /* U+0014c2: CANADIAN SYLLABICS NI*/
+                                           RTUNI_ALPHA, /* U+0014c3: CANADIAN SYLLABICS NII*/
+                                           RTUNI_ALPHA, /* U+0014c4: CANADIAN SYLLABICS NO*/
+                                           RTUNI_ALPHA, /* U+0014c5: CANADIAN SYLLABICS NOO*/
+                                           RTUNI_ALPHA, /* U+0014c6: CANADIAN SYLLABICS Y-CREE NOO*/
+                                           RTUNI_ALPHA, /* U+0014c7: CANADIAN SYLLABICS NA*/
+                                           RTUNI_ALPHA, /* U+0014c8: CANADIAN SYLLABICS NAA*/
+                                           RTUNI_ALPHA, /* U+0014c9: CANADIAN SYLLABICS NWE*/
+                                           RTUNI_ALPHA, /* U+0014ca: CANADIAN SYLLABICS WEST-CREE NWE*/
+                                           RTUNI_ALPHA, /* U+0014cb: CANADIAN SYLLABICS NWA*/
+                                           RTUNI_ALPHA, /* U+0014cc: CANADIAN SYLLABICS WEST-CREE NWA*/
+                                           RTUNI_ALPHA, /* U+0014cd: CANADIAN SYLLABICS NWAA*/
+                                           RTUNI_ALPHA, /* U+0014ce: CANADIAN SYLLABICS WEST-CREE NWAA*/
+                                           RTUNI_ALPHA, /* U+0014cf: CANADIAN SYLLABICS NASKAPI NWAA*/
+                                           RTUNI_ALPHA, /* U+0014d0: CANADIAN SYLLABICS N*/
+                                           RTUNI_ALPHA, /* U+0014d1: CANADIAN SYLLABICS CARRIER NG*/
+                                           RTUNI_ALPHA, /* U+0014d2: CANADIAN SYLLABICS NH*/
+                                           RTUNI_ALPHA, /* U+0014d3: CANADIAN SYLLABICS LE*/
+                                           RTUNI_ALPHA, /* U+0014d4: CANADIAN SYLLABICS LAAI*/
+                                           RTUNI_ALPHA, /* U+0014d5: CANADIAN SYLLABICS LI*/
+                                           RTUNI_ALPHA, /* U+0014d6: CANADIAN SYLLABICS LII*/
+                                           RTUNI_ALPHA, /* U+0014d7: CANADIAN SYLLABICS LO*/
+                                           RTUNI_ALPHA, /* U+0014d8: CANADIAN SYLLABICS LOO*/
+                                           RTUNI_ALPHA, /* U+0014d9: CANADIAN SYLLABICS Y-CREE LOO*/
+                                           RTUNI_ALPHA, /* U+0014da: CANADIAN SYLLABICS LA*/
+                                           RTUNI_ALPHA, /* U+0014db: CANADIAN SYLLABICS LAA*/
+                                           RTUNI_ALPHA, /* U+0014dc: CANADIAN SYLLABICS LWE*/
+                                           RTUNI_ALPHA, /* U+0014dd: CANADIAN SYLLABICS WEST-CREE LWE*/
+                                           RTUNI_ALPHA, /* U+0014de: CANADIAN SYLLABICS LWI*/
+                                           RTUNI_ALPHA, /* U+0014df: CANADIAN SYLLABICS WEST-CREE LWI*/
+                                           RTUNI_ALPHA, /* U+0014e0: CANADIAN SYLLABICS LWII*/
+                                           RTUNI_ALPHA, /* U+0014e1: CANADIAN SYLLABICS WEST-CREE LWII*/
+                                           RTUNI_ALPHA, /* U+0014e2: CANADIAN SYLLABICS LWO*/
+                                           RTUNI_ALPHA, /* U+0014e3: CANADIAN SYLLABICS WEST-CREE LWO*/
+                                           RTUNI_ALPHA, /* U+0014e4: CANADIAN SYLLABICS LWOO*/
+                                           RTUNI_ALPHA, /* U+0014e5: CANADIAN SYLLABICS WEST-CREE LWOO*/
+                                           RTUNI_ALPHA, /* U+0014e6: CANADIAN SYLLABICS LWA*/
+                                           RTUNI_ALPHA, /* U+0014e7: CANADIAN SYLLABICS WEST-CREE LWA*/
+                                           RTUNI_ALPHA, /* U+0014e8: CANADIAN SYLLABICS LWAA*/
+                                           RTUNI_ALPHA, /* U+0014e9: CANADIAN SYLLABICS WEST-CREE LWAA*/
+                                           RTUNI_ALPHA, /* U+0014ea: CANADIAN SYLLABICS L*/
+                                           RTUNI_ALPHA, /* U+0014eb: CANADIAN SYLLABICS WEST-CREE L*/
+                                           RTUNI_ALPHA, /* U+0014ec: CANADIAN SYLLABICS MEDIAL L*/
+                                           RTUNI_ALPHA, /* U+0014ed: CANADIAN SYLLABICS SE*/
+                                           RTUNI_ALPHA, /* U+0014ee: CANADIAN SYLLABICS SAAI*/
+                                           RTUNI_ALPHA, /* U+0014ef: CANADIAN SYLLABICS SI*/
+                                           RTUNI_ALPHA, /* U+0014f0: CANADIAN SYLLABICS SII*/
+                                           RTUNI_ALPHA, /* U+0014f1: CANADIAN SYLLABICS SO*/
+                                           RTUNI_ALPHA, /* U+0014f2: CANADIAN SYLLABICS SOO*/
+                                           RTUNI_ALPHA, /* U+0014f3: CANADIAN SYLLABICS Y-CREE SOO*/
+                                           RTUNI_ALPHA, /* U+0014f4: CANADIAN SYLLABICS SA*/
+                                           RTUNI_ALPHA, /* U+0014f5: CANADIAN SYLLABICS SAA*/
+                                           RTUNI_ALPHA, /* U+0014f6: CANADIAN SYLLABICS SWE*/
+                                           RTUNI_ALPHA, /* U+0014f7: CANADIAN SYLLABICS WEST-CREE SWE*/
+                                           RTUNI_ALPHA, /* U+0014f8: CANADIAN SYLLABICS SWI*/
+                                           RTUNI_ALPHA, /* U+0014f9: CANADIAN SYLLABICS WEST-CREE SWI*/
+                                           RTUNI_ALPHA, /* U+0014fa: CANADIAN SYLLABICS SWII*/
+                                           RTUNI_ALPHA, /* U+0014fb: CANADIAN SYLLABICS WEST-CREE SWII*/
+                                           RTUNI_ALPHA, /* U+0014fc: CANADIAN SYLLABICS SWO*/
+                                           RTUNI_ALPHA, /* U+0014fd: CANADIAN SYLLABICS WEST-CREE SWO*/
+                                           RTUNI_ALPHA, /* U+0014fe: CANADIAN SYLLABICS SWOO*/
+                                           RTUNI_ALPHA, /* U+0014ff: CANADIAN SYLLABICS WEST-CREE SWOO*/
+                                           RTUNI_ALPHA, /* U+001500: CANADIAN SYLLABICS SWA*/
+                                           RTUNI_ALPHA, /* U+001501: CANADIAN SYLLABICS WEST-CREE SWA*/
+                                           RTUNI_ALPHA, /* U+001502: CANADIAN SYLLABICS SWAA*/
+                                           RTUNI_ALPHA, /* U+001503: CANADIAN SYLLABICS WEST-CREE SWAA*/
+                                           RTUNI_ALPHA, /* U+001504: CANADIAN SYLLABICS NASKAPI SWAA*/
+                                           RTUNI_ALPHA, /* U+001505: CANADIAN SYLLABICS S*/
+                                           RTUNI_ALPHA, /* U+001506: CANADIAN SYLLABICS ATHAPASCAN S*/
+                                           RTUNI_ALPHA, /* U+001507: CANADIAN SYLLABICS SW*/
+                                           RTUNI_ALPHA, /* U+001508: CANADIAN SYLLABICS BLACKFOOT S*/
+                                           RTUNI_ALPHA, /* U+001509: CANADIAN SYLLABICS MOOSE-CREE SK*/
+                                           RTUNI_ALPHA, /* U+00150a: CANADIAN SYLLABICS NASKAPI SKW*/
+                                           RTUNI_ALPHA, /* U+00150b: CANADIAN SYLLABICS NASKAPI S-W*/
+                                           RTUNI_ALPHA, /* U+00150c: CANADIAN SYLLABICS NASKAPI SPWA*/
+                                           RTUNI_ALPHA, /* U+00150d: CANADIAN SYLLABICS NASKAPI STWA*/
+                                           RTUNI_ALPHA, /* U+00150e: CANADIAN SYLLABICS NASKAPI SKWA*/
+                                           RTUNI_ALPHA, /* U+00150f: CANADIAN SYLLABICS NASKAPI SCWA*/
+                                           RTUNI_ALPHA, /* U+001510: CANADIAN SYLLABICS SHE*/
+                                           RTUNI_ALPHA, /* U+001511: CANADIAN SYLLABICS SHI*/
+                                           RTUNI_ALPHA, /* U+001512: CANADIAN SYLLABICS SHII*/
+                                           RTUNI_ALPHA, /* U+001513: CANADIAN SYLLABICS SHO*/
+                                           RTUNI_ALPHA, /* U+001514: CANADIAN SYLLABICS SHOO*/
+                                           RTUNI_ALPHA, /* U+001515: CANADIAN SYLLABICS SHA*/
+                                           RTUNI_ALPHA, /* U+001516: CANADIAN SYLLABICS SHAA*/
+                                           RTUNI_ALPHA, /* U+001517: CANADIAN SYLLABICS SHWE*/
+                                           RTUNI_ALPHA, /* U+001518: CANADIAN SYLLABICS WEST-CREE SHWE*/
+                                           RTUNI_ALPHA, /* U+001519: CANADIAN SYLLABICS SHWI*/
+                                           RTUNI_ALPHA, /* U+00151a: CANADIAN SYLLABICS WEST-CREE SHWI*/
+                                           RTUNI_ALPHA, /* U+00151b: CANADIAN SYLLABICS SHWII*/
+                                           RTUNI_ALPHA, /* U+00151c: CANADIAN SYLLABICS WEST-CREE SHWII*/
+                                           RTUNI_ALPHA, /* U+00151d: CANADIAN SYLLABICS SHWO*/
+                                           RTUNI_ALPHA, /* U+00151e: CANADIAN SYLLABICS WEST-CREE SHWO*/
+                                           RTUNI_ALPHA, /* U+00151f: CANADIAN SYLLABICS SHWOO*/
+                                           RTUNI_ALPHA, /* U+001520: CANADIAN SYLLABICS WEST-CREE SHWOO*/
+                                           RTUNI_ALPHA, /* U+001521: CANADIAN SYLLABICS SHWA*/
+                                           RTUNI_ALPHA, /* U+001522: CANADIAN SYLLABICS WEST-CREE SHWA*/
+                                           RTUNI_ALPHA, /* U+001523: CANADIAN SYLLABICS SHWAA*/
+                                           RTUNI_ALPHA, /* U+001524: CANADIAN SYLLABICS WEST-CREE SHWAA*/
+                                           RTUNI_ALPHA, /* U+001525: CANADIAN SYLLABICS SH*/
+                                           RTUNI_ALPHA, /* U+001526: CANADIAN SYLLABICS YE*/
+                                           RTUNI_ALPHA, /* U+001527: CANADIAN SYLLABICS YAAI*/
+                                           RTUNI_ALPHA, /* U+001528: CANADIAN SYLLABICS YI*/
+                                           RTUNI_ALPHA, /* U+001529: CANADIAN SYLLABICS YII*/
+                                           RTUNI_ALPHA, /* U+00152a: CANADIAN SYLLABICS YO*/
+                                           RTUNI_ALPHA, /* U+00152b: CANADIAN SYLLABICS YOO*/
+                                           RTUNI_ALPHA, /* U+00152c: CANADIAN SYLLABICS Y-CREE YOO*/
+                                           RTUNI_ALPHA, /* U+00152d: CANADIAN SYLLABICS YA*/
+                                           RTUNI_ALPHA, /* U+00152e: CANADIAN SYLLABICS YAA*/
+                                           RTUNI_ALPHA, /* U+00152f: CANADIAN SYLLABICS YWE*/
+                                           RTUNI_ALPHA, /* U+001530: CANADIAN SYLLABICS WEST-CREE YWE*/
+                                           RTUNI_ALPHA, /* U+001531: CANADIAN SYLLABICS YWI*/
+                                           RTUNI_ALPHA, /* U+001532: CANADIAN SYLLABICS WEST-CREE YWI*/
+                                           RTUNI_ALPHA, /* U+001533: CANADIAN SYLLABICS YWII*/
+                                           RTUNI_ALPHA, /* U+001534: CANADIAN SYLLABICS WEST-CREE YWII*/
+                                           RTUNI_ALPHA, /* U+001535: CANADIAN SYLLABICS YWO*/
+                                           RTUNI_ALPHA, /* U+001536: CANADIAN SYLLABICS WEST-CREE YWO*/
+                                           RTUNI_ALPHA, /* U+001537: CANADIAN SYLLABICS YWOO*/
+                                           RTUNI_ALPHA, /* U+001538: CANADIAN SYLLABICS WEST-CREE YWOO*/
+                                           RTUNI_ALPHA, /* U+001539: CANADIAN SYLLABICS YWA*/
+                                           RTUNI_ALPHA, /* U+00153a: CANADIAN SYLLABICS WEST-CREE YWA*/
+                                           RTUNI_ALPHA, /* U+00153b: CANADIAN SYLLABICS YWAA*/
+                                           RTUNI_ALPHA, /* U+00153c: CANADIAN SYLLABICS WEST-CREE YWAA*/
+                                           RTUNI_ALPHA, /* U+00153d: CANADIAN SYLLABICS NASKAPI YWAA*/
+                                           RTUNI_ALPHA, /* U+00153e: CANADIAN SYLLABICS Y*/
+                                           RTUNI_ALPHA, /* U+00153f: CANADIAN SYLLABICS BIBLE-CREE Y*/
+                                           RTUNI_ALPHA, /* U+001540: CANADIAN SYLLABICS WEST-CREE Y*/
+                                           RTUNI_ALPHA, /* U+001541: CANADIAN SYLLABICS SAYISI YI*/
+                                           RTUNI_ALPHA, /* U+001542: CANADIAN SYLLABICS RE*/
+                                           RTUNI_ALPHA, /* U+001543: CANADIAN SYLLABICS R-CREE RE*/
+                                           RTUNI_ALPHA, /* U+001544: CANADIAN SYLLABICS WEST-CREE LE*/
+                                           RTUNI_ALPHA, /* U+001545: CANADIAN SYLLABICS RAAI*/
+                                           RTUNI_ALPHA, /* U+001546: CANADIAN SYLLABICS RI*/
+                                           RTUNI_ALPHA, /* U+001547: CANADIAN SYLLABICS RII*/
+                                           RTUNI_ALPHA, /* U+001548: CANADIAN SYLLABICS RO*/
+                                           RTUNI_ALPHA, /* U+001549: CANADIAN SYLLABICS ROO*/
+                                           RTUNI_ALPHA, /* U+00154a: CANADIAN SYLLABICS WEST-CREE LO*/
+                                           RTUNI_ALPHA, /* U+00154b: CANADIAN SYLLABICS RA*/
+                                           RTUNI_ALPHA, /* U+00154c: CANADIAN SYLLABICS RAA*/
+                                           RTUNI_ALPHA, /* U+00154d: CANADIAN SYLLABICS WEST-CREE LA*/
+                                           RTUNI_ALPHA, /* U+00154e: CANADIAN SYLLABICS RWAA*/
+                                           RTUNI_ALPHA, /* U+00154f: CANADIAN SYLLABICS WEST-CREE RWAA*/
+                                           RTUNI_ALPHA, /* U+001550: CANADIAN SYLLABICS R*/
+                                           RTUNI_ALPHA, /* U+001551: CANADIAN SYLLABICS WEST-CREE R*/
+                                           RTUNI_ALPHA, /* U+001552: CANADIAN SYLLABICS MEDIAL R*/
+                                           RTUNI_ALPHA, /* U+001553: CANADIAN SYLLABICS FE*/
+                                           RTUNI_ALPHA, /* U+001554: CANADIAN SYLLABICS FAAI*/
+                                           RTUNI_ALPHA, /* U+001555: CANADIAN SYLLABICS FI*/
+                                           RTUNI_ALPHA, /* U+001556: CANADIAN SYLLABICS FII*/
+                                           RTUNI_ALPHA, /* U+001557: CANADIAN SYLLABICS FO*/
+                                           RTUNI_ALPHA, /* U+001558: CANADIAN SYLLABICS FOO*/
+                                           RTUNI_ALPHA, /* U+001559: CANADIAN SYLLABICS FA*/
+                                           RTUNI_ALPHA, /* U+00155a: CANADIAN SYLLABICS FAA*/
+                                           RTUNI_ALPHA, /* U+00155b: CANADIAN SYLLABICS FWAA*/
+                                           RTUNI_ALPHA, /* U+00155c: CANADIAN SYLLABICS WEST-CREE FWAA*/
+                                           RTUNI_ALPHA, /* U+00155d: CANADIAN SYLLABICS F*/
+                                           RTUNI_ALPHA, /* U+00155e: CANADIAN SYLLABICS THE*/
+                                           RTUNI_ALPHA, /* U+00155f: CANADIAN SYLLABICS N-CREE THE*/
+                                           RTUNI_ALPHA, /* U+001560: CANADIAN SYLLABICS THI*/
+                                           RTUNI_ALPHA, /* U+001561: CANADIAN SYLLABICS N-CREE THI*/
+                                           RTUNI_ALPHA, /* U+001562: CANADIAN SYLLABICS THII*/
+                                           RTUNI_ALPHA, /* U+001563: CANADIAN SYLLABICS N-CREE THII*/
+                                           RTUNI_ALPHA, /* U+001564: CANADIAN SYLLABICS THO*/
+                                           RTUNI_ALPHA, /* U+001565: CANADIAN SYLLABICS THOO*/
+                                           RTUNI_ALPHA, /* U+001566: CANADIAN SYLLABICS THA*/
+                                           RTUNI_ALPHA, /* U+001567: CANADIAN SYLLABICS THAA*/
+                                           RTUNI_ALPHA, /* U+001568: CANADIAN SYLLABICS THWAA*/
+                                           RTUNI_ALPHA, /* U+001569: CANADIAN SYLLABICS WEST-CREE THWAA*/
+                                           RTUNI_ALPHA, /* U+00156a: CANADIAN SYLLABICS TH*/
+                                           RTUNI_ALPHA, /* U+00156b: CANADIAN SYLLABICS TTHE*/
+                                           RTUNI_ALPHA, /* U+00156c: CANADIAN SYLLABICS TTHI*/
+                                           RTUNI_ALPHA, /* U+00156d: CANADIAN SYLLABICS TTHO*/
+                                           RTUNI_ALPHA, /* U+00156e: CANADIAN SYLLABICS TTHA*/
+                                           RTUNI_ALPHA, /* U+00156f: CANADIAN SYLLABICS TTH*/
+                                           RTUNI_ALPHA, /* U+001570: CANADIAN SYLLABICS TYE*/
+                                           RTUNI_ALPHA, /* U+001571: CANADIAN SYLLABICS TYI*/
+                                           RTUNI_ALPHA, /* U+001572: CANADIAN SYLLABICS TYO*/
+                                           RTUNI_ALPHA, /* U+001573: CANADIAN SYLLABICS TYA*/
+                                           RTUNI_ALPHA, /* U+001574: CANADIAN SYLLABICS NUNAVIK HE*/
+                                           RTUNI_ALPHA, /* U+001575: CANADIAN SYLLABICS NUNAVIK HI*/
+                                           RTUNI_ALPHA, /* U+001576: CANADIAN SYLLABICS NUNAVIK HII*/
+                                           RTUNI_ALPHA, /* U+001577: CANADIAN SYLLABICS NUNAVIK HO*/
+                                           RTUNI_ALPHA, /* U+001578: CANADIAN SYLLABICS NUNAVIK HOO*/
+                                           RTUNI_ALPHA, /* U+001579: CANADIAN SYLLABICS NUNAVIK HA*/
+                                           RTUNI_ALPHA, /* U+00157a: CANADIAN SYLLABICS NUNAVIK HAA*/
+                                           RTUNI_ALPHA, /* U+00157b: CANADIAN SYLLABICS NUNAVIK H*/
+                                           RTUNI_ALPHA, /* U+00157c: CANADIAN SYLLABICS NUNAVUT H*/
+                                           RTUNI_ALPHA, /* U+00157d: CANADIAN SYLLABICS HK*/
+                                           RTUNI_ALPHA, /* U+00157e: CANADIAN SYLLABICS QAAI*/
+                                           RTUNI_ALPHA, /* U+00157f: CANADIAN SYLLABICS QI*/
+                                           RTUNI_ALPHA, /* U+001580: CANADIAN SYLLABICS QII*/
+                                           RTUNI_ALPHA, /* U+001581: CANADIAN SYLLABICS QO*/
+                                           RTUNI_ALPHA, /* U+001582: CANADIAN SYLLABICS QOO*/
+                                           RTUNI_ALPHA, /* U+001583: CANADIAN SYLLABICS QA*/
+                                           RTUNI_ALPHA, /* U+001584: CANADIAN SYLLABICS QAA*/
+                                           RTUNI_ALPHA, /* U+001585: CANADIAN SYLLABICS Q*/
+                                           RTUNI_ALPHA, /* U+001586: CANADIAN SYLLABICS TLHE*/
+                                           RTUNI_ALPHA, /* U+001587: CANADIAN SYLLABICS TLHI*/
+                                           RTUNI_ALPHA, /* U+001588: CANADIAN SYLLABICS TLHO*/
+                                           RTUNI_ALPHA, /* U+001589: CANADIAN SYLLABICS TLHA*/
+                                           RTUNI_ALPHA, /* U+00158a: CANADIAN SYLLABICS WEST-CREE RE*/
+                                           RTUNI_ALPHA, /* U+00158b: CANADIAN SYLLABICS WEST-CREE RI*/
+                                           RTUNI_ALPHA, /* U+00158c: CANADIAN SYLLABICS WEST-CREE RO*/
+                                           RTUNI_ALPHA, /* U+00158d: CANADIAN SYLLABICS WEST-CREE RA*/
+                                           RTUNI_ALPHA, /* U+00158e: CANADIAN SYLLABICS NGAAI*/
+                                           RTUNI_ALPHA, /* U+00158f: CANADIAN SYLLABICS NGI*/
+                                           RTUNI_ALPHA, /* U+001590: CANADIAN SYLLABICS NGII*/
+                                           RTUNI_ALPHA, /* U+001591: CANADIAN SYLLABICS NGO*/
+                                           RTUNI_ALPHA, /* U+001592: CANADIAN SYLLABICS NGOO*/
+                                           RTUNI_ALPHA, /* U+001593: CANADIAN SYLLABICS NGA*/
+                                           RTUNI_ALPHA, /* U+001594: CANADIAN SYLLABICS NGAA*/
+                                           RTUNI_ALPHA, /* U+001595: CANADIAN SYLLABICS NG*/
+                                           RTUNI_ALPHA, /* U+001596: CANADIAN SYLLABICS NNG*/
+                                           RTUNI_ALPHA, /* U+001597: CANADIAN SYLLABICS SAYISI SHE*/
+                                           RTUNI_ALPHA, /* U+001598: CANADIAN SYLLABICS SAYISI SHI*/
+                                           RTUNI_ALPHA, /* U+001599: CANADIAN SYLLABICS SAYISI SHO*/
+                                           RTUNI_ALPHA, /* U+00159a: CANADIAN SYLLABICS SAYISI SHA*/
+                                           RTUNI_ALPHA, /* U+00159b: CANADIAN SYLLABICS WOODS-CREE THE*/
+                                           RTUNI_ALPHA, /* U+00159c: CANADIAN SYLLABICS WOODS-CREE THI*/
+                                           RTUNI_ALPHA, /* U+00159d: CANADIAN SYLLABICS WOODS-CREE THO*/
+                                           RTUNI_ALPHA, /* U+00159e: CANADIAN SYLLABICS WOODS-CREE THA*/
+                                           RTUNI_ALPHA, /* U+00159f: CANADIAN SYLLABICS WOODS-CREE TH*/
+                                           RTUNI_ALPHA, /* U+0015a0: CANADIAN SYLLABICS LHI*/
+                                           RTUNI_ALPHA, /* U+0015a1: CANADIAN SYLLABICS LHII*/
+                                           RTUNI_ALPHA, /* U+0015a2: CANADIAN SYLLABICS LHO*/
+                                           RTUNI_ALPHA, /* U+0015a3: CANADIAN SYLLABICS LHOO*/
+                                           RTUNI_ALPHA, /* U+0015a4: CANADIAN SYLLABICS LHA*/
+                                           RTUNI_ALPHA, /* U+0015a5: CANADIAN SYLLABICS LHAA*/
+                                           RTUNI_ALPHA, /* U+0015a6: CANADIAN SYLLABICS LH*/
+                                           RTUNI_ALPHA, /* U+0015a7: CANADIAN SYLLABICS TH-CREE THE*/
+                                           RTUNI_ALPHA, /* U+0015a8: CANADIAN SYLLABICS TH-CREE THI*/
+                                           RTUNI_ALPHA, /* U+0015a9: CANADIAN SYLLABICS TH-CREE THII*/
+                                           RTUNI_ALPHA, /* U+0015aa: CANADIAN SYLLABICS TH-CREE THO*/
+                                           RTUNI_ALPHA, /* U+0015ab: CANADIAN SYLLABICS TH-CREE THOO*/
+                                           RTUNI_ALPHA, /* U+0015ac: CANADIAN SYLLABICS TH-CREE THA*/
+                                           RTUNI_ALPHA, /* U+0015ad: CANADIAN SYLLABICS TH-CREE THAA*/
+                                           RTUNI_ALPHA, /* U+0015ae: CANADIAN SYLLABICS TH-CREE TH*/
+                                           RTUNI_ALPHA, /* U+0015af: CANADIAN SYLLABICS AIVILIK B*/
+                                           RTUNI_ALPHA, /* U+0015b0: CANADIAN SYLLABICS BLACKFOOT E*/
+                                           RTUNI_ALPHA, /* U+0015b1: CANADIAN SYLLABICS BLACKFOOT I*/
+                                           RTUNI_ALPHA, /* U+0015b2: CANADIAN SYLLABICS BLACKFOOT O*/
+                                           RTUNI_ALPHA, /* U+0015b3: CANADIAN SYLLABICS BLACKFOOT A*/
+                                           RTUNI_ALPHA, /* U+0015b4: CANADIAN SYLLABICS BLACKFOOT WE*/
+                                           RTUNI_ALPHA, /* U+0015b5: CANADIAN SYLLABICS BLACKFOOT WI*/
+                                           RTUNI_ALPHA, /* U+0015b6: CANADIAN SYLLABICS BLACKFOOT WO*/
+                                           RTUNI_ALPHA, /* U+0015b7: CANADIAN SYLLABICS BLACKFOOT WA*/
+                                           RTUNI_ALPHA, /* U+0015b8: CANADIAN SYLLABICS BLACKFOOT NE*/
+                                           RTUNI_ALPHA, /* U+0015b9: CANADIAN SYLLABICS BLACKFOOT NI*/
+                                           RTUNI_ALPHA, /* U+0015ba: CANADIAN SYLLABICS BLACKFOOT NO*/
+                                           RTUNI_ALPHA, /* U+0015bb: CANADIAN SYLLABICS BLACKFOOT NA*/
+                                           RTUNI_ALPHA, /* U+0015bc: CANADIAN SYLLABICS BLACKFOOT KE*/
+                                           RTUNI_ALPHA, /* U+0015bd: CANADIAN SYLLABICS BLACKFOOT KI*/
+                                           RTUNI_ALPHA, /* U+0015be: CANADIAN SYLLABICS BLACKFOOT KO*/
+                                           RTUNI_ALPHA, /* U+0015bf: CANADIAN SYLLABICS BLACKFOOT KA*/
+                                           RTUNI_ALPHA, /* U+0015c0: CANADIAN SYLLABICS SAYISI HE*/
+                                           RTUNI_ALPHA, /* U+0015c1: CANADIAN SYLLABICS SAYISI HI*/
+                                           RTUNI_ALPHA, /* U+0015c2: CANADIAN SYLLABICS SAYISI HO*/
+                                           RTUNI_ALPHA, /* U+0015c3: CANADIAN SYLLABICS SAYISI HA*/
+                                           RTUNI_ALPHA, /* U+0015c4: CANADIAN SYLLABICS CARRIER GHU*/
+                                           RTUNI_ALPHA, /* U+0015c5: CANADIAN SYLLABICS CARRIER GHO*/
+                                           RTUNI_ALPHA, /* U+0015c6: CANADIAN SYLLABICS CARRIER GHE*/
+                                           RTUNI_ALPHA, /* U+0015c7: CANADIAN SYLLABICS CARRIER GHEE*/
+                                           RTUNI_ALPHA, /* U+0015c8: CANADIAN SYLLABICS CARRIER GHI*/
+                                           RTUNI_ALPHA, /* U+0015c9: CANADIAN SYLLABICS CARRIER GHA*/
+                                           RTUNI_ALPHA, /* U+0015ca: CANADIAN SYLLABICS CARRIER RU*/
+                                           RTUNI_ALPHA, /* U+0015cb: CANADIAN SYLLABICS CARRIER RO*/
+                                           RTUNI_ALPHA, /* U+0015cc: CANADIAN SYLLABICS CARRIER RE*/
+                                           RTUNI_ALPHA, /* U+0015cd: CANADIAN SYLLABICS CARRIER REE*/
+                                           RTUNI_ALPHA, /* U+0015ce: CANADIAN SYLLABICS CARRIER RI*/
+                                           RTUNI_ALPHA, /* U+0015cf: CANADIAN SYLLABICS CARRIER RA*/
+                                           RTUNI_ALPHA, /* U+0015d0: CANADIAN SYLLABICS CARRIER WU*/
+                                           RTUNI_ALPHA, /* U+0015d1: CANADIAN SYLLABICS CARRIER WO*/
+                                           RTUNI_ALPHA, /* U+0015d2: CANADIAN SYLLABICS CARRIER WE*/
+                                           RTUNI_ALPHA, /* U+0015d3: CANADIAN SYLLABICS CARRIER WEE*/
+                                           RTUNI_ALPHA, /* U+0015d4: CANADIAN SYLLABICS CARRIER WI*/
+                                           RTUNI_ALPHA, /* U+0015d5: CANADIAN SYLLABICS CARRIER WA*/
+                                           RTUNI_ALPHA, /* U+0015d6: CANADIAN SYLLABICS CARRIER HWU*/
+                                           RTUNI_ALPHA, /* U+0015d7: CANADIAN SYLLABICS CARRIER HWO*/
+                                           RTUNI_ALPHA, /* U+0015d8: CANADIAN SYLLABICS CARRIER HWE*/
+                                           RTUNI_ALPHA, /* U+0015d9: CANADIAN SYLLABICS CARRIER HWEE*/
+                                           RTUNI_ALPHA, /* U+0015da: CANADIAN SYLLABICS CARRIER HWI*/
+                                           RTUNI_ALPHA, /* U+0015db: CANADIAN SYLLABICS CARRIER HWA*/
+                                           RTUNI_ALPHA, /* U+0015dc: CANADIAN SYLLABICS CARRIER THU*/
+                                           RTUNI_ALPHA, /* U+0015dd: CANADIAN SYLLABICS CARRIER THO*/
+                                           RTUNI_ALPHA, /* U+0015de: CANADIAN SYLLABICS CARRIER THE*/
+                                           RTUNI_ALPHA, /* U+0015df: CANADIAN SYLLABICS CARRIER THEE*/
+                                           RTUNI_ALPHA, /* U+0015e0: CANADIAN SYLLABICS CARRIER THI*/
+                                           RTUNI_ALPHA, /* U+0015e1: CANADIAN SYLLABICS CARRIER THA*/
+                                           RTUNI_ALPHA, /* U+0015e2: CANADIAN SYLLABICS CARRIER TTU*/
+                                           RTUNI_ALPHA, /* U+0015e3: CANADIAN SYLLABICS CARRIER TTO*/
+                                           RTUNI_ALPHA, /* U+0015e4: CANADIAN SYLLABICS CARRIER TTE*/
+                                           RTUNI_ALPHA, /* U+0015e5: CANADIAN SYLLABICS CARRIER TTEE*/
+                                           RTUNI_ALPHA, /* U+0015e6: CANADIAN SYLLABICS CARRIER TTI*/
+                                           RTUNI_ALPHA, /* U+0015e7: CANADIAN SYLLABICS CARRIER TTA*/
+                                           RTUNI_ALPHA, /* U+0015e8: CANADIAN SYLLABICS CARRIER PU*/
+                                           RTUNI_ALPHA, /* U+0015e9: CANADIAN SYLLABICS CARRIER PO*/
+                                           RTUNI_ALPHA, /* U+0015ea: CANADIAN SYLLABICS CARRIER PE*/
+                                           RTUNI_ALPHA, /* U+0015eb: CANADIAN SYLLABICS CARRIER PEE*/
+                                           RTUNI_ALPHA, /* U+0015ec: CANADIAN SYLLABICS CARRIER PI*/
+                                           RTUNI_ALPHA, /* U+0015ed: CANADIAN SYLLABICS CARRIER PA*/
+                                           RTUNI_ALPHA, /* U+0015ee: CANADIAN SYLLABICS CARRIER P*/
+                                           RTUNI_ALPHA, /* U+0015ef: CANADIAN SYLLABICS CARRIER GU*/
+                                           RTUNI_ALPHA, /* U+0015f0: CANADIAN SYLLABICS CARRIER GO*/
+                                           RTUNI_ALPHA, /* U+0015f1: CANADIAN SYLLABICS CARRIER GE*/
+                                           RTUNI_ALPHA, /* U+0015f2: CANADIAN SYLLABICS CARRIER GEE*/
+                                           RTUNI_ALPHA, /* U+0015f3: CANADIAN SYLLABICS CARRIER GI*/
+                                           RTUNI_ALPHA, /* U+0015f4: CANADIAN SYLLABICS CARRIER GA*/
+                                           RTUNI_ALPHA, /* U+0015f5: CANADIAN SYLLABICS CARRIER KHU*/
+                                           RTUNI_ALPHA, /* U+0015f6: CANADIAN SYLLABICS CARRIER KHO*/
+                                           RTUNI_ALPHA, /* U+0015f7: CANADIAN SYLLABICS CARRIER KHE*/
+                                           RTUNI_ALPHA, /* U+0015f8: CANADIAN SYLLABICS CARRIER KHEE*/
+                                           RTUNI_ALPHA, /* U+0015f9: CANADIAN SYLLABICS CARRIER KHI*/
+                                           RTUNI_ALPHA, /* U+0015fa: CANADIAN SYLLABICS CARRIER KHA*/
+                                           RTUNI_ALPHA, /* U+0015fb: CANADIAN SYLLABICS CARRIER KKU*/
+                                           RTUNI_ALPHA, /* U+0015fc: CANADIAN SYLLABICS CARRIER KKO*/
+                                           RTUNI_ALPHA, /* U+0015fd: CANADIAN SYLLABICS CARRIER KKE*/
+                                           RTUNI_ALPHA, /* U+0015fe: CANADIAN SYLLABICS CARRIER KKEE*/
+                                           RTUNI_ALPHA, /* U+0015ff: CANADIAN SYLLABICS CARRIER KKI*/
+                                           RTUNI_ALPHA, /* U+001600: CANADIAN SYLLABICS CARRIER KKA*/
+                                           RTUNI_ALPHA, /* U+001601: CANADIAN SYLLABICS CARRIER KK*/
+                                           RTUNI_ALPHA, /* U+001602: CANADIAN SYLLABICS CARRIER NU*/
+                                           RTUNI_ALPHA, /* U+001603: CANADIAN SYLLABICS CARRIER NO*/
+                                           RTUNI_ALPHA, /* U+001604: CANADIAN SYLLABICS CARRIER NE*/
+                                           RTUNI_ALPHA, /* U+001605: CANADIAN SYLLABICS CARRIER NEE*/
+                                           RTUNI_ALPHA, /* U+001606: CANADIAN SYLLABICS CARRIER NI*/
+                                           RTUNI_ALPHA, /* U+001607: CANADIAN SYLLABICS CARRIER NA*/
+                                           RTUNI_ALPHA, /* U+001608: CANADIAN SYLLABICS CARRIER MU*/
+                                           RTUNI_ALPHA, /* U+001609: CANADIAN SYLLABICS CARRIER MO*/
+                                           RTUNI_ALPHA, /* U+00160a: CANADIAN SYLLABICS CARRIER ME*/
+                                           RTUNI_ALPHA, /* U+00160b: CANADIAN SYLLABICS CARRIER MEE*/
+                                           RTUNI_ALPHA, /* U+00160c: CANADIAN SYLLABICS CARRIER MI*/
+                                           RTUNI_ALPHA, /* U+00160d: CANADIAN SYLLABICS CARRIER MA*/
+                                           RTUNI_ALPHA, /* U+00160e: CANADIAN SYLLABICS CARRIER YU*/
+                                           RTUNI_ALPHA, /* U+00160f: CANADIAN SYLLABICS CARRIER YO*/
+                                           RTUNI_ALPHA, /* U+001610: CANADIAN SYLLABICS CARRIER YE*/
+                                           RTUNI_ALPHA, /* U+001611: CANADIAN SYLLABICS CARRIER YEE*/
+                                           RTUNI_ALPHA, /* U+001612: CANADIAN SYLLABICS CARRIER YI*/
+                                           RTUNI_ALPHA, /* U+001613: CANADIAN SYLLABICS CARRIER YA*/
+                                           RTUNI_ALPHA, /* U+001614: CANADIAN SYLLABICS CARRIER JU*/
+                                           RTUNI_ALPHA, /* U+001615: CANADIAN SYLLABICS SAYISI JU*/
+                                           RTUNI_ALPHA, /* U+001616: CANADIAN SYLLABICS CARRIER JO*/
+                                           RTUNI_ALPHA, /* U+001617: CANADIAN SYLLABICS CARRIER JE*/
+                                           RTUNI_ALPHA, /* U+001618: CANADIAN SYLLABICS CARRIER JEE*/
+                                           RTUNI_ALPHA, /* U+001619: CANADIAN SYLLABICS CARRIER JI*/
+                                           RTUNI_ALPHA, /* U+00161a: CANADIAN SYLLABICS SAYISI JI*/
+                                           RTUNI_ALPHA, /* U+00161b: CANADIAN SYLLABICS CARRIER JA*/
+                                           RTUNI_ALPHA, /* U+00161c: CANADIAN SYLLABICS CARRIER JJU*/
+                                           RTUNI_ALPHA, /* U+00161d: CANADIAN SYLLABICS CARRIER JJO*/
+                                           RTUNI_ALPHA, /* U+00161e: CANADIAN SYLLABICS CARRIER JJE*/
+                                           RTUNI_ALPHA, /* U+00161f: CANADIAN SYLLABICS CARRIER JJEE*/
+                                           RTUNI_ALPHA, /* U+001620: CANADIAN SYLLABICS CARRIER JJI*/
+                                           RTUNI_ALPHA, /* U+001621: CANADIAN SYLLABICS CARRIER JJA*/
+                                           RTUNI_ALPHA, /* U+001622: CANADIAN SYLLABICS CARRIER LU*/
+                                           RTUNI_ALPHA, /* U+001623: CANADIAN SYLLABICS CARRIER LO*/
+                                           RTUNI_ALPHA, /* U+001624: CANADIAN SYLLABICS CARRIER LE*/
+                                           RTUNI_ALPHA, /* U+001625: CANADIAN SYLLABICS CARRIER LEE*/
+                                           RTUNI_ALPHA, /* U+001626: CANADIAN SYLLABICS CARRIER LI*/
+                                           RTUNI_ALPHA, /* U+001627: CANADIAN SYLLABICS CARRIER LA*/
+                                           RTUNI_ALPHA, /* U+001628: CANADIAN SYLLABICS CARRIER DLU*/
+                                           RTUNI_ALPHA, /* U+001629: CANADIAN SYLLABICS CARRIER DLO*/
+                                           RTUNI_ALPHA, /* U+00162a: CANADIAN SYLLABICS CARRIER DLE*/
+                                           RTUNI_ALPHA, /* U+00162b: CANADIAN SYLLABICS CARRIER DLEE*/
+                                           RTUNI_ALPHA, /* U+00162c: CANADIAN SYLLABICS CARRIER DLI*/
+                                           RTUNI_ALPHA, /* U+00162d: CANADIAN SYLLABICS CARRIER DLA*/
+                                           RTUNI_ALPHA, /* U+00162e: CANADIAN SYLLABICS CARRIER LHU*/
+                                           RTUNI_ALPHA, /* U+00162f: CANADIAN SYLLABICS CARRIER LHO*/
+                                           RTUNI_ALPHA, /* U+001630: CANADIAN SYLLABICS CARRIER LHE*/
+                                           RTUNI_ALPHA, /* U+001631: CANADIAN SYLLABICS CARRIER LHEE*/
+                                           RTUNI_ALPHA, /* U+001632: CANADIAN SYLLABICS CARRIER LHI*/
+                                           RTUNI_ALPHA, /* U+001633: CANADIAN SYLLABICS CARRIER LHA*/
+                                           RTUNI_ALPHA, /* U+001634: CANADIAN SYLLABICS CARRIER TLHU*/
+                                           RTUNI_ALPHA, /* U+001635: CANADIAN SYLLABICS CARRIER TLHO*/
+                                           RTUNI_ALPHA, /* U+001636: CANADIAN SYLLABICS CARRIER TLHE*/
+                                           RTUNI_ALPHA, /* U+001637: CANADIAN SYLLABICS CARRIER TLHEE*/
+                                           RTUNI_ALPHA, /* U+001638: CANADIAN SYLLABICS CARRIER TLHI*/
+                                           RTUNI_ALPHA, /* U+001639: CANADIAN SYLLABICS CARRIER TLHA*/
+                                           RTUNI_ALPHA, /* U+00163a: CANADIAN SYLLABICS CARRIER TLU*/
+                                           RTUNI_ALPHA, /* U+00163b: CANADIAN SYLLABICS CARRIER TLO*/
+                                           RTUNI_ALPHA, /* U+00163c: CANADIAN SYLLABICS CARRIER TLE*/
+                                           RTUNI_ALPHA, /* U+00163d: CANADIAN SYLLABICS CARRIER TLEE*/
+                                           RTUNI_ALPHA, /* U+00163e: CANADIAN SYLLABICS CARRIER TLI*/
+                                           RTUNI_ALPHA, /* U+00163f: CANADIAN SYLLABICS CARRIER TLA*/
+                                           RTUNI_ALPHA, /* U+001640: CANADIAN SYLLABICS CARRIER ZU*/
+                                           RTUNI_ALPHA, /* U+001641: CANADIAN SYLLABICS CARRIER ZO*/
+                                           RTUNI_ALPHA, /* U+001642: CANADIAN SYLLABICS CARRIER ZE*/
+                                           RTUNI_ALPHA, /* U+001643: CANADIAN SYLLABICS CARRIER ZEE*/
+                                           RTUNI_ALPHA, /* U+001644: CANADIAN SYLLABICS CARRIER ZI*/
+                                           RTUNI_ALPHA, /* U+001645: CANADIAN SYLLABICS CARRIER ZA*/
+                                           RTUNI_ALPHA, /* U+001646: CANADIAN SYLLABICS CARRIER Z*/
+                                           RTUNI_ALPHA, /* U+001647: CANADIAN SYLLABICS CARRIER INITIAL Z*/
+                                           RTUNI_ALPHA, /* U+001648: CANADIAN SYLLABICS CARRIER DZU*/
+                                           RTUNI_ALPHA, /* U+001649: CANADIAN SYLLABICS CARRIER DZO*/
+                                           RTUNI_ALPHA, /* U+00164a: CANADIAN SYLLABICS CARRIER DZE*/
+                                           RTUNI_ALPHA, /* U+00164b: CANADIAN SYLLABICS CARRIER DZEE*/
+                                           RTUNI_ALPHA, /* U+00164c: CANADIAN SYLLABICS CARRIER DZI*/
+                                           RTUNI_ALPHA, /* U+00164d: CANADIAN SYLLABICS CARRIER DZA*/
+                                           RTUNI_ALPHA, /* U+00164e: CANADIAN SYLLABICS CARRIER SU*/
+                                           RTUNI_ALPHA, /* U+00164f: CANADIAN SYLLABICS CARRIER SO*/
+                                           RTUNI_ALPHA, /* U+001650: CANADIAN SYLLABICS CARRIER SE*/
+                                           RTUNI_ALPHA, /* U+001651: CANADIAN SYLLABICS CARRIER SEE*/
+                                           RTUNI_ALPHA, /* U+001652: CANADIAN SYLLABICS CARRIER SI*/
+                                           RTUNI_ALPHA, /* U+001653: CANADIAN SYLLABICS CARRIER SA*/
+                                           RTUNI_ALPHA, /* U+001654: CANADIAN SYLLABICS CARRIER SHU*/
+                                           RTUNI_ALPHA, /* U+001655: CANADIAN SYLLABICS CARRIER SHO*/
+                                           RTUNI_ALPHA, /* U+001656: CANADIAN SYLLABICS CARRIER SHE*/
+                                           RTUNI_ALPHA, /* U+001657: CANADIAN SYLLABICS CARRIER SHEE*/
+                                           RTUNI_ALPHA, /* U+001658: CANADIAN SYLLABICS CARRIER SHI*/
+                                           RTUNI_ALPHA, /* U+001659: CANADIAN SYLLABICS CARRIER SHA*/
+                                           RTUNI_ALPHA, /* U+00165a: CANADIAN SYLLABICS CARRIER SH*/
+                                           RTUNI_ALPHA, /* U+00165b: CANADIAN SYLLABICS CARRIER TSU*/
+                                           RTUNI_ALPHA, /* U+00165c: CANADIAN SYLLABICS CARRIER TSO*/
+                                           RTUNI_ALPHA, /* U+00165d: CANADIAN SYLLABICS CARRIER TSE*/
+                                           RTUNI_ALPHA, /* U+00165e: CANADIAN SYLLABICS CARRIER TSEE*/
+                                           RTUNI_ALPHA, /* U+00165f: CANADIAN SYLLABICS CARRIER TSI*/
+                                           RTUNI_ALPHA, /* U+001660: CANADIAN SYLLABICS CARRIER TSA*/
+                                           RTUNI_ALPHA, /* U+001661: CANADIAN SYLLABICS CARRIER CHU*/
+                                           RTUNI_ALPHA, /* U+001662: CANADIAN SYLLABICS CARRIER CHO*/
+                                           RTUNI_ALPHA, /* U+001663: CANADIAN SYLLABICS CARRIER CHE*/
+                                           RTUNI_ALPHA, /* U+001664: CANADIAN SYLLABICS CARRIER CHEE*/
+                                           RTUNI_ALPHA, /* U+001665: CANADIAN SYLLABICS CARRIER CHI*/
+                                           RTUNI_ALPHA, /* U+001666: CANADIAN SYLLABICS CARRIER CHA*/
+                                           RTUNI_ALPHA, /* U+001667: CANADIAN SYLLABICS CARRIER TTSU*/
+                                           RTUNI_ALPHA, /* U+001668: CANADIAN SYLLABICS CARRIER TTSO*/
+                                           RTUNI_ALPHA, /* U+001669: CANADIAN SYLLABICS CARRIER TTSE*/
+                                           RTUNI_ALPHA, /* U+00166a: CANADIAN SYLLABICS CARRIER TTSEE*/
+                                           RTUNI_ALPHA, /* U+00166b: CANADIAN SYLLABICS CARRIER TTSI*/
+                                           RTUNI_ALPHA, /* U+00166c: CANADIAN SYLLABICS CARRIER TTSA*/
+                                                     0, /* U+00166d: CANADIAN SYLLABICS CHI SIGN*/
+                                                     0, /* U+00166e: CANADIAN SYLLABICS FULL STOP*/
+                                           RTUNI_ALPHA, /* U+00166f: CANADIAN SYLLABICS QAI*/
+                                           RTUNI_ALPHA, /* U+001670: CANADIAN SYLLABICS NGAI*/
+                                           RTUNI_ALPHA, /* U+001671: CANADIAN SYLLABICS NNGI*/
+                                           RTUNI_ALPHA, /* U+001672: CANADIAN SYLLABICS NNGII*/
+                                           RTUNI_ALPHA, /* U+001673: CANADIAN SYLLABICS NNGO*/
+                                           RTUNI_ALPHA, /* U+001674: CANADIAN SYLLABICS NNGOO*/
+                                           RTUNI_ALPHA, /* U+001675: CANADIAN SYLLABICS NNGA*/
+                                           RTUNI_ALPHA, /* U+001676: CANADIAN SYLLABICS NNGAA*/
+                                           RTUNI_ALPHA, /* U+001677: CANADIAN SYLLABICS WOODS-CREE THWEE*/
+                                           RTUNI_ALPHA, /* U+001678: CANADIAN SYLLABICS WOODS-CREE THWI*/
+                                           RTUNI_ALPHA, /* U+001679: CANADIAN SYLLABICS WOODS-CREE THWII*/
+                                           RTUNI_ALPHA, /* U+00167a: CANADIAN SYLLABICS WOODS-CREE THWO*/
+                                           RTUNI_ALPHA, /* U+00167b: CANADIAN SYLLABICS WOODS-CREE THWOO*/
+                                           RTUNI_ALPHA, /* U+00167c: CANADIAN SYLLABICS WOODS-CREE THWA*/
+                                           RTUNI_ALPHA, /* U+00167d: CANADIAN SYLLABICS WOODS-CREE THWAA*/
+                                           RTUNI_ALPHA, /* U+00167e: CANADIAN SYLLABICS WOODS-CREE FINAL TH*/
+                                           RTUNI_ALPHA, /* U+00167f: CANADIAN SYLLABICS BLACKFOOT W*/
+                                          RTUNI_WSPACE, /* U+001680: OGHAM SPACE MARK*/
+                                           RTUNI_ALPHA, /* U+001681: OGHAM LETTER BEITH*/
+                                           RTUNI_ALPHA, /* U+001682: OGHAM LETTER LUIS*/
+                                           RTUNI_ALPHA, /* U+001683: OGHAM LETTER FEARN*/
+                                           RTUNI_ALPHA, /* U+001684: OGHAM LETTER SAIL*/
+                                           RTUNI_ALPHA, /* U+001685: OGHAM LETTER NION*/
+                                           RTUNI_ALPHA, /* U+001686: OGHAM LETTER UATH*/
+                                           RTUNI_ALPHA, /* U+001687: OGHAM LETTER DAIR*/
+                                           RTUNI_ALPHA, /* U+001688: OGHAM LETTER TINNE*/
+                                           RTUNI_ALPHA, /* U+001689: OGHAM LETTER COLL*/
+                                           RTUNI_ALPHA, /* U+00168a: OGHAM LETTER CEIRT*/
+                                           RTUNI_ALPHA, /* U+00168b: OGHAM LETTER MUIN*/
+                                           RTUNI_ALPHA, /* U+00168c: OGHAM LETTER GORT*/
+                                           RTUNI_ALPHA, /* U+00168d: OGHAM LETTER NGEADAL*/
+                                           RTUNI_ALPHA, /* U+00168e: OGHAM LETTER STRAIF*/
+                                           RTUNI_ALPHA, /* U+00168f: OGHAM LETTER RUIS*/
+                                           RTUNI_ALPHA, /* U+001690: OGHAM LETTER AILM*/
+                                           RTUNI_ALPHA, /* U+001691: OGHAM LETTER ONN*/
+                                           RTUNI_ALPHA, /* U+001692: OGHAM LETTER UR*/
+                                           RTUNI_ALPHA, /* U+001693: OGHAM LETTER EADHADH*/
+                                           RTUNI_ALPHA, /* U+001694: OGHAM LETTER IODHADH*/
+                                           RTUNI_ALPHA, /* U+001695: OGHAM LETTER EABHADH*/
+                                           RTUNI_ALPHA, /* U+001696: OGHAM LETTER OR*/
+                                           RTUNI_ALPHA, /* U+001697: OGHAM LETTER UILLEANN*/
+                                           RTUNI_ALPHA, /* U+001698: OGHAM LETTER IFIN*/
+                                           RTUNI_ALPHA, /* U+001699: OGHAM LETTER EAMHANCHOLL*/
+                                           RTUNI_ALPHA, /* U+00169a: OGHAM LETTER PEITH*/
+                                                     0, /* U+00169b: OGHAM FEATHER MARK*/
+                                                     0, /* U+00169c: OGHAM REVERSED FEATHER MARK*/
+                                                     0, /* U+00169d: */
+                                                     0, /* U+00169e: */
+                                                     0, /* U+00169f: */
+                                           RTUNI_ALPHA, /* U+0016a0: RUNIC LETTER FEHU FEOH FE F*/
+                                           RTUNI_ALPHA, /* U+0016a1: RUNIC LETTER V*/
+                                           RTUNI_ALPHA, /* U+0016a2: RUNIC LETTER URUZ UR U*/
+                                           RTUNI_ALPHA, /* U+0016a3: RUNIC LETTER YR*/
+                                           RTUNI_ALPHA, /* U+0016a4: RUNIC LETTER Y*/
+                                           RTUNI_ALPHA, /* U+0016a5: RUNIC LETTER W*/
+                                           RTUNI_ALPHA, /* U+0016a6: RUNIC LETTER THURISAZ THURS THORN*/
+                                           RTUNI_ALPHA, /* U+0016a7: RUNIC LETTER ETH*/
+                                           RTUNI_ALPHA, /* U+0016a8: RUNIC LETTER ANSUZ A*/
+                                           RTUNI_ALPHA, /* U+0016a9: RUNIC LETTER OS O*/
+                                           RTUNI_ALPHA, /* U+0016aa: RUNIC LETTER AC A*/
+                                           RTUNI_ALPHA, /* U+0016ab: RUNIC LETTER AESC*/
+                                           RTUNI_ALPHA, /* U+0016ac: RUNIC LETTER LONG-BRANCH-OSS O*/
+                                           RTUNI_ALPHA, /* U+0016ad: RUNIC LETTER SHORT-TWIG-OSS O*/
+                                           RTUNI_ALPHA, /* U+0016ae: RUNIC LETTER O*/
+                                           RTUNI_ALPHA, /* U+0016af: RUNIC LETTER OE*/
+                                           RTUNI_ALPHA, /* U+0016b0: RUNIC LETTER ON*/
+                                           RTUNI_ALPHA, /* U+0016b1: RUNIC LETTER RAIDO RAD REID R*/
+                                           RTUNI_ALPHA, /* U+0016b2: RUNIC LETTER KAUNA*/
+                                           RTUNI_ALPHA, /* U+0016b3: RUNIC LETTER CEN*/
+                                           RTUNI_ALPHA, /* U+0016b4: RUNIC LETTER KAUN K*/
+                                           RTUNI_ALPHA, /* U+0016b5: RUNIC LETTER G*/
+                                           RTUNI_ALPHA, /* U+0016b6: RUNIC LETTER ENG*/
+                                           RTUNI_ALPHA, /* U+0016b7: RUNIC LETTER GEBO GYFU G*/
+                                           RTUNI_ALPHA, /* U+0016b8: RUNIC LETTER GAR*/
+                                           RTUNI_ALPHA, /* U+0016b9: RUNIC LETTER WUNJO WYNN W*/
+                                           RTUNI_ALPHA, /* U+0016ba: RUNIC LETTER HAGLAZ H*/
+                                           RTUNI_ALPHA, /* U+0016bb: RUNIC LETTER HAEGL H*/
+                                           RTUNI_ALPHA, /* U+0016bc: RUNIC LETTER LONG-BRANCH-HAGALL H*/
+                                           RTUNI_ALPHA, /* U+0016bd: RUNIC LETTER SHORT-TWIG-HAGALL H*/
+                                           RTUNI_ALPHA, /* U+0016be: RUNIC LETTER NAUDIZ NYD NAUD N*/
+                                           RTUNI_ALPHA, /* U+0016bf: RUNIC LETTER SHORT-TWIG-NAUD N*/
+                                           RTUNI_ALPHA, /* U+0016c0: RUNIC LETTER DOTTED-N*/
+                                           RTUNI_ALPHA, /* U+0016c1: RUNIC LETTER ISAZ IS ISS I*/
+                                           RTUNI_ALPHA, /* U+0016c2: RUNIC LETTER E*/
+                                           RTUNI_ALPHA, /* U+0016c3: RUNIC LETTER JERAN J*/
+                                           RTUNI_ALPHA, /* U+0016c4: RUNIC LETTER GER*/
+                                           RTUNI_ALPHA, /* U+0016c5: RUNIC LETTER LONG-BRANCH-AR AE*/
+                                           RTUNI_ALPHA, /* U+0016c6: RUNIC LETTER SHORT-TWIG-AR A*/
+                                           RTUNI_ALPHA, /* U+0016c7: RUNIC LETTER IWAZ EOH*/
+                                           RTUNI_ALPHA, /* U+0016c8: RUNIC LETTER PERTHO PEORTH P*/
+                                           RTUNI_ALPHA, /* U+0016c9: RUNIC LETTER ALGIZ EOLHX*/
+                                           RTUNI_ALPHA, /* U+0016ca: RUNIC LETTER SOWILO S*/
+                                           RTUNI_ALPHA, /* U+0016cb: RUNIC LETTER SIGEL LONG-BRANCH-SOL S*/
+                                           RTUNI_ALPHA, /* U+0016cc: RUNIC LETTER SHORT-TWIG-SOL S*/
+                                           RTUNI_ALPHA, /* U+0016cd: RUNIC LETTER C*/
+                                           RTUNI_ALPHA, /* U+0016ce: RUNIC LETTER Z*/
+                                           RTUNI_ALPHA, /* U+0016cf: RUNIC LETTER TIWAZ TIR TYR T*/
+                                           RTUNI_ALPHA, /* U+0016d0: RUNIC LETTER SHORT-TWIG-TYR T*/
+                                           RTUNI_ALPHA, /* U+0016d1: RUNIC LETTER D*/
+                                           RTUNI_ALPHA, /* U+0016d2: RUNIC LETTER BERKANAN BEORC BJARKAN B*/
+                                           RTUNI_ALPHA, /* U+0016d3: RUNIC LETTER SHORT-TWIG-BJARKAN B*/
+                                           RTUNI_ALPHA, /* U+0016d4: RUNIC LETTER DOTTED-P*/
+                                           RTUNI_ALPHA, /* U+0016d5: RUNIC LETTER OPEN-P*/
+                                           RTUNI_ALPHA, /* U+0016d6: RUNIC LETTER EHWAZ EH E*/
+                                           RTUNI_ALPHA, /* U+0016d7: RUNIC LETTER MANNAZ MAN M*/
+                                           RTUNI_ALPHA, /* U+0016d8: RUNIC LETTER LONG-BRANCH-MADR M*/
+                                           RTUNI_ALPHA, /* U+0016d9: RUNIC LETTER SHORT-TWIG-MADR M*/
+                                           RTUNI_ALPHA, /* U+0016da: RUNIC LETTER LAUKAZ LAGU LOGR L*/
+                                           RTUNI_ALPHA, /* U+0016db: RUNIC LETTER DOTTED-L*/
+                                           RTUNI_ALPHA, /* U+0016dc: RUNIC LETTER INGWAZ*/
+                                           RTUNI_ALPHA, /* U+0016dd: RUNIC LETTER ING*/
+                                           RTUNI_ALPHA, /* U+0016de: RUNIC LETTER DAGAZ DAEG D*/
+                                           RTUNI_ALPHA, /* U+0016df: RUNIC LETTER OTHALAN ETHEL O*/
+                                           RTUNI_ALPHA, /* U+0016e0: RUNIC LETTER EAR*/
+                                           RTUNI_ALPHA, /* U+0016e1: RUNIC LETTER IOR*/
+                                           RTUNI_ALPHA, /* U+0016e2: RUNIC LETTER CWEORTH*/
+                                           RTUNI_ALPHA, /* U+0016e3: RUNIC LETTER CALC*/
+                                           RTUNI_ALPHA, /* U+0016e4: RUNIC LETTER CEALC*/
+                                           RTUNI_ALPHA, /* U+0016e5: RUNIC LETTER STAN*/
+                                           RTUNI_ALPHA, /* U+0016e6: RUNIC LETTER LONG-BRANCH-YR*/
+                                           RTUNI_ALPHA, /* U+0016e7: RUNIC LETTER SHORT-TWIG-YR*/
+                                           RTUNI_ALPHA, /* U+0016e8: RUNIC LETTER ICELANDIC-YR*/
+                                           RTUNI_ALPHA, /* U+0016e9: RUNIC LETTER Q*/
+                                           RTUNI_ALPHA, /* U+0016ea: RUNIC LETTER X*/
+                                                     0, /* U+0016eb: RUNIC SINGLE PUNCTUATION*/
+                                                     0, /* U+0016ec: RUNIC MULTIPLE PUNCTUATION*/
+                                                     0, /* U+0016ed: RUNIC CROSS PUNCTUATION*/
+                                           RTUNI_ALPHA, /* U+0016ee: RUNIC ARLAUG SYMBOL*/
+                                           RTUNI_ALPHA, /* U+0016ef: RUNIC TVIMADUR SYMBOL*/
+                                           RTUNI_ALPHA, /* U+0016f0: RUNIC BELGTHOR SYMBOL*/
+                                                     0, /* U+0016f1: */
+                                                     0, /* U+0016f2: */
+                                                     0, /* U+0016f3: */
+                                                     0, /* U+0016f4: */
+                                                     0, /* U+0016f5: */
+                                                     0, /* U+0016f6: */
+                                                     0, /* U+0016f7: */
+                                                     0, /* U+0016f8: */
+                                                     0, /* U+0016f9: */
+                                                     0, /* U+0016fa: */
+                                                     0, /* U+0016fb: */
+                                                     0, /* U+0016fc: */
+                                                     0, /* U+0016fd: */
+                                                     0, /* U+0016fe: */
+                                                     0, /* U+0016ff: */
+                                           RTUNI_ALPHA, /* U+001700: TAGALOG LETTER A*/
+                                           RTUNI_ALPHA, /* U+001701: TAGALOG LETTER I*/
+                                           RTUNI_ALPHA, /* U+001702: TAGALOG LETTER U*/
+                                           RTUNI_ALPHA, /* U+001703: TAGALOG LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001704: TAGALOG LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001705: TAGALOG LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001706: TAGALOG LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001707: TAGALOG LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001708: TAGALOG LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001709: TAGALOG LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00170a: TAGALOG LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00170b: TAGALOG LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00170c: TAGALOG LETTER YA*/
+                                                     0, /* U+00170d: */
+                                           RTUNI_ALPHA, /* U+00170e: TAGALOG LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00170f: TAGALOG LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001710: TAGALOG LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001711: TAGALOG LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001712: TAGALOG VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001713: TAGALOG VOWEL SIGN U*/
+                                                     0, /* U+001714: TAGALOG SIGN VIRAMA*/
+                                                     0, /* U+001715: */
+                                                     0, /* U+001716: */
+                                                     0, /* U+001717: */
+                                                     0, /* U+001718: */
+                                                     0, /* U+001719: */
+                                                     0, /* U+00171a: */
+                                                     0, /* U+00171b: */
+                                                     0, /* U+00171c: */
+                                                     0, /* U+00171d: */
+                                                     0, /* U+00171e: */
+                                                     0, /* U+00171f: */
+                                           RTUNI_ALPHA, /* U+001720: HANUNOO LETTER A*/
+                                           RTUNI_ALPHA, /* U+001721: HANUNOO LETTER I*/
+                                           RTUNI_ALPHA, /* U+001722: HANUNOO LETTER U*/
+                                           RTUNI_ALPHA, /* U+001723: HANUNOO LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001724: HANUNOO LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001725: HANUNOO LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001726: HANUNOO LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001727: HANUNOO LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001728: HANUNOO LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001729: HANUNOO LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00172a: HANUNOO LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00172b: HANUNOO LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00172c: HANUNOO LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00172d: HANUNOO LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00172e: HANUNOO LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00172f: HANUNOO LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001730: HANUNOO LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001731: HANUNOO LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001732: HANUNOO VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001733: HANUNOO VOWEL SIGN U*/
+                                                     0, /* U+001734: HANUNOO SIGN PAMUDPOD*/
+                                                     0, /* U+001735: PHILIPPINE SINGLE PUNCTUATION*/
+                                                     0, /* U+001736: PHILIPPINE DOUBLE PUNCTUATION*/
+                                                     0, /* U+001737: */
+                                                     0, /* U+001738: */
+                                                     0, /* U+001739: */
+                                                     0, /* U+00173a: */
+                                                     0, /* U+00173b: */
+                                                     0, /* U+00173c: */
+                                                     0, /* U+00173d: */
+                                                     0, /* U+00173e: */
+                                                     0, /* U+00173f: */
+                                           RTUNI_ALPHA, /* U+001740: BUHID LETTER A*/
+                                           RTUNI_ALPHA, /* U+001741: BUHID LETTER I*/
+                                           RTUNI_ALPHA, /* U+001742: BUHID LETTER U*/
+                                           RTUNI_ALPHA, /* U+001743: BUHID LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001744: BUHID LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001745: BUHID LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001746: BUHID LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001747: BUHID LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001748: BUHID LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001749: BUHID LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00174a: BUHID LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00174b: BUHID LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00174c: BUHID LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00174d: BUHID LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00174e: BUHID LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00174f: BUHID LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001750: BUHID LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001751: BUHID LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001752: BUHID VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001753: BUHID VOWEL SIGN U*/
+                                                     0, /* U+001754: */
+                                                     0, /* U+001755: */
+                                                     0, /* U+001756: */
+                                                     0, /* U+001757: */
+                                                     0, /* U+001758: */
+                                                     0, /* U+001759: */
+                                                     0, /* U+00175a: */
+                                                     0, /* U+00175b: */
+                                                     0, /* U+00175c: */
+                                                     0, /* U+00175d: */
+                                                     0, /* U+00175e: */
+                                                     0, /* U+00175f: */
+                                           RTUNI_ALPHA, /* U+001760: TAGBANWA LETTER A*/
+                                           RTUNI_ALPHA, /* U+001761: TAGBANWA LETTER I*/
+                                           RTUNI_ALPHA, /* U+001762: TAGBANWA LETTER U*/
+                                           RTUNI_ALPHA, /* U+001763: TAGBANWA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001764: TAGBANWA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001765: TAGBANWA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001766: TAGBANWA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001767: TAGBANWA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001768: TAGBANWA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001769: TAGBANWA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00176a: TAGBANWA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00176b: TAGBANWA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00176c: TAGBANWA LETTER YA*/
+                                                     0, /* U+00176d: */
+                                           RTUNI_ALPHA, /* U+00176e: TAGBANWA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00176f: TAGBANWA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001770: TAGBANWA LETTER SA*/
+                                                     0, /* U+001771: */
+                                           RTUNI_ALPHA, /* U+001772: TAGBANWA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001773: TAGBANWA VOWEL SIGN U*/
+                                                     0, /* U+001774: */
+                                                     0, /* U+001775: */
+                                                     0, /* U+001776: */
+                                                     0, /* U+001777: */
+                                                     0, /* U+001778: */
+                                                     0, /* U+001779: */
+                                                     0, /* U+00177a: */
+                                                     0, /* U+00177b: */
+                                                     0, /* U+00177c: */
+                                                     0, /* U+00177d: */
+                                                     0, /* U+00177e: */
+                                                     0, /* U+00177f: */
+                                           RTUNI_ALPHA, /* U+001780: KHMER LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001781: KHMER LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001782: KHMER LETTER KO*/
+                                           RTUNI_ALPHA, /* U+001783: KHMER LETTER KHO*/
+                                           RTUNI_ALPHA, /* U+001784: KHMER LETTER NGO*/
+                                           RTUNI_ALPHA, /* U+001785: KHMER LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001786: KHMER LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+001787: KHMER LETTER CO*/
+                                           RTUNI_ALPHA, /* U+001788: KHMER LETTER CHO*/
+                                           RTUNI_ALPHA, /* U+001789: KHMER LETTER NYO*/
+                                           RTUNI_ALPHA, /* U+00178a: KHMER LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00178b: KHMER LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+00178c: KHMER LETTER DO*/
+                                           RTUNI_ALPHA, /* U+00178d: KHMER LETTER TTHO*/
+                                           RTUNI_ALPHA, /* U+00178e: KHMER LETTER NNO*/
+                                           RTUNI_ALPHA, /* U+00178f: KHMER LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001790: KHMER LETTER THA*/
+                                           RTUNI_ALPHA, /* U+001791: KHMER LETTER TO*/
+                                           RTUNI_ALPHA, /* U+001792: KHMER LETTER THO*/
+                                           RTUNI_ALPHA, /* U+001793: KHMER LETTER NO*/
+                                           RTUNI_ALPHA, /* U+001794: KHMER LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001795: KHMER LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+001796: KHMER LETTER PO*/
+                                           RTUNI_ALPHA, /* U+001797: KHMER LETTER PHO*/
+                                           RTUNI_ALPHA, /* U+001798: KHMER LETTER MO*/
+                                           RTUNI_ALPHA, /* U+001799: KHMER LETTER YO*/
+                                           RTUNI_ALPHA, /* U+00179a: KHMER LETTER RO*/
+                                           RTUNI_ALPHA, /* U+00179b: KHMER LETTER LO*/
+                                           RTUNI_ALPHA, /* U+00179c: KHMER LETTER VO*/
+                                           RTUNI_ALPHA, /* U+00179d: KHMER LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00179e: KHMER LETTER SSO*/
+                                           RTUNI_ALPHA, /* U+00179f: KHMER LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0017a0: KHMER LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0017a1: KHMER LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0017a2: KHMER LETTER QA*/
+                                           RTUNI_ALPHA, /* U+0017a3: KHMER INDEPENDENT VOWEL QAQ*/
+                                           RTUNI_ALPHA, /* U+0017a4: KHMER INDEPENDENT VOWEL QAA*/
+                                           RTUNI_ALPHA, /* U+0017a5: KHMER INDEPENDENT VOWEL QI*/
+                                           RTUNI_ALPHA, /* U+0017a6: KHMER INDEPENDENT VOWEL QII*/
+                                           RTUNI_ALPHA, /* U+0017a7: KHMER INDEPENDENT VOWEL QU*/
+                                           RTUNI_ALPHA, /* U+0017a8: KHMER INDEPENDENT VOWEL QUK*/
+                                           RTUNI_ALPHA, /* U+0017a9: KHMER INDEPENDENT VOWEL QUU*/
+                                           RTUNI_ALPHA, /* U+0017aa: KHMER INDEPENDENT VOWEL QUUV*/
+                                           RTUNI_ALPHA, /* U+0017ab: KHMER INDEPENDENT VOWEL RY*/
+                                           RTUNI_ALPHA, /* U+0017ac: KHMER INDEPENDENT VOWEL RYY*/
+                                           RTUNI_ALPHA, /* U+0017ad: KHMER INDEPENDENT VOWEL LY*/
+                                           RTUNI_ALPHA, /* U+0017ae: KHMER INDEPENDENT VOWEL LYY*/
+                                           RTUNI_ALPHA, /* U+0017af: KHMER INDEPENDENT VOWEL QE*/
+                                           RTUNI_ALPHA, /* U+0017b0: KHMER INDEPENDENT VOWEL QAI*/
+                                           RTUNI_ALPHA, /* U+0017b1: KHMER INDEPENDENT VOWEL QOO TYPE ONE*/
+                                           RTUNI_ALPHA, /* U+0017b2: KHMER INDEPENDENT VOWEL QOO TYPE TWO*/
+                                           RTUNI_ALPHA, /* U+0017b3: KHMER INDEPENDENT VOWEL QAU*/
+                                                     0, /* U+0017b4: KHMER VOWEL INHERENT AQ*/
+                                                     0, /* U+0017b5: KHMER VOWEL INHERENT AA*/
+                                           RTUNI_ALPHA, /* U+0017b6: KHMER VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0017b7: KHMER VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+0017b8: KHMER VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0017b9: KHMER VOWEL SIGN Y*/
+                                           RTUNI_ALPHA, /* U+0017ba: KHMER VOWEL SIGN YY*/
+                                           RTUNI_ALPHA, /* U+0017bb: KHMER VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0017bc: KHMER VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0017bd: KHMER VOWEL SIGN UA*/
+                                           RTUNI_ALPHA, /* U+0017be: KHMER VOWEL SIGN OE*/
+                                           RTUNI_ALPHA, /* U+0017bf: KHMER VOWEL SIGN YA*/
+                                           RTUNI_ALPHA, /* U+0017c0: KHMER VOWEL SIGN IE*/
+                                           RTUNI_ALPHA, /* U+0017c1: KHMER VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0017c2: KHMER VOWEL SIGN AE*/
+                                           RTUNI_ALPHA, /* U+0017c3: KHMER VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+0017c4: KHMER VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+0017c5: KHMER VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+0017c6: KHMER SIGN NIKAHIT*/
+                                           RTUNI_ALPHA, /* U+0017c7: KHMER SIGN REAHMUK*/
+                                           RTUNI_ALPHA, /* U+0017c8: KHMER SIGN YUUKALEAPINTU*/
+                                                     0, /* U+0017c9: KHMER SIGN MUUSIKATOAN*/
+                                                     0, /* U+0017ca: KHMER SIGN TRIISAP*/
+                                                     0, /* U+0017cb: KHMER SIGN BANTOC*/
+                                                     0, /* U+0017cc: KHMER SIGN ROBAT*/
+                                                     0, /* U+0017cd: KHMER SIGN TOANDAKHIAT*/
+                                                     0, /* U+0017ce: KHMER SIGN KAKABAT*/
+                                                     0, /* U+0017cf: KHMER SIGN AHSDA*/
+                                                     0, /* U+0017d0: KHMER SIGN SAMYOK SANNYA*/
+                                                     0, /* U+0017d1: KHMER SIGN VIRIAM*/
+                                                     0, /* U+0017d2: KHMER SIGN COENG*/
+                                                     0, /* U+0017d3: KHMER SIGN BATHAMASAT*/
+                                                     0, /* U+0017d4: KHMER SIGN KHAN*/
+                                                     0, /* U+0017d5: KHMER SIGN BARIYOOSAN*/
+                                                     0, /* U+0017d6: KHMER SIGN CAMNUC PII KUUH*/
+                                           RTUNI_ALPHA, /* U+0017d7: KHMER SIGN LEK TOO*/
+                                                     0, /* U+0017d8: KHMER SIGN BEYYAL*/
+                                                     0, /* U+0017d9: KHMER SIGN PHNAEK MUAN*/
+                                                     0, /* U+0017da: KHMER SIGN KOOMUUT*/
+                                                     0, /* U+0017db: KHMER CURRENCY SYMBOL RIEL*/
+                                           RTUNI_ALPHA, /* U+0017dc: KHMER SIGN AVAKRAHASANYA*/
+                                                     0, /* U+0017dd: KHMER SIGN ATTHACAN*/
+                                                     0, /* U+0017de: */
+                                                     0, /* U+0017df: */
+                                          RTUNI_DDIGIT, /* U+0017e0: KHMER DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0017e1: KHMER DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0017e2: KHMER DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0017e3: KHMER DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0017e4: KHMER DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0017e5: KHMER DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0017e6: KHMER DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0017e7: KHMER DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0017e8: KHMER DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0017e9: KHMER DIGIT NINE*/
+                                                     0, /* U+0017ea: */
+                                                     0, /* U+0017eb: */
+                                                     0, /* U+0017ec: */
+                                                     0, /* U+0017ed: */
+                                                     0, /* U+0017ee: */
+                                                     0, /* U+0017ef: */
+                                                     0, /* U+0017f0: KHMER SYMBOL LEK ATTAK SON*/
+                                                     0, /* U+0017f1: KHMER SYMBOL LEK ATTAK MUOY*/
+                                                     0, /* U+0017f2: KHMER SYMBOL LEK ATTAK PII*/
+                                                     0, /* U+0017f3: KHMER SYMBOL LEK ATTAK BEI*/
+                                                     0, /* U+0017f4: KHMER SYMBOL LEK ATTAK BUON*/
+                                                     0, /* U+0017f5: KHMER SYMBOL LEK ATTAK PRAM*/
+                                                     0, /* U+0017f6: KHMER SYMBOL LEK ATTAK PRAM-MUOY*/
+                                                     0, /* U+0017f7: KHMER SYMBOL LEK ATTAK PRAM-PII*/
+                                                     0, /* U+0017f8: KHMER SYMBOL LEK ATTAK PRAM-BEI*/
+                                                     0, /* U+0017f9: KHMER SYMBOL LEK ATTAK PRAM-BUON*/
+                                                     0, /* U+0017fa: */
+                                                     0, /* U+0017fb: */
+                                                     0, /* U+0017fc: */
+                                                     0, /* U+0017fd: */
+                                                     0, /* U+0017fe: */
+                                                     0, /* U+0017ff: */
+                                                     0, /* U+001800: MONGOLIAN BIRGA*/
+                                                     0, /* U+001801: MONGOLIAN ELLIPSIS*/
+                                                     0, /* U+001802: MONGOLIAN COMMA*/
+                                                     0, /* U+001803: MONGOLIAN FULL STOP*/
+                                                     0, /* U+001804: MONGOLIAN COLON*/
+                                                     0, /* U+001805: MONGOLIAN FOUR DOTS*/
+                                                     0, /* U+001806: MONGOLIAN TODO SOFT HYPHEN*/
+                                                     0, /* U+001807: MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER*/
+                                                     0, /* U+001808: MONGOLIAN MANCHU COMMA*/
+                                                     0, /* U+001809: MONGOLIAN MANCHU FULL STOP*/
+                                                     0, /* U+00180a: MONGOLIAN NIRUGU*/
+                                                     0, /* U+00180b: MONGOLIAN FREE VARIATION SELECTOR ONE*/
+                                                     0, /* U+00180c: MONGOLIAN FREE VARIATION SELECTOR TWO*/
+                                                     0, /* U+00180d: MONGOLIAN FREE VARIATION SELECTOR THREE*/
+                                                     0, /* U+00180e: MONGOLIAN VOWEL SEPARATOR*/
+                                                     0, /* U+00180f: */
+                                          RTUNI_DDIGIT, /* U+001810: MONGOLIAN DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001811: MONGOLIAN DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001812: MONGOLIAN DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001813: MONGOLIAN DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001814: MONGOLIAN DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001815: MONGOLIAN DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001816: MONGOLIAN DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001817: MONGOLIAN DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001818: MONGOLIAN DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001819: MONGOLIAN DIGIT NINE*/
+                                                     0, /* U+00181a: */
+                                                     0, /* U+00181b: */
+                                                     0, /* U+00181c: */
+                                                     0, /* U+00181d: */
+                                                     0, /* U+00181e: */
+                                                     0, /* U+00181f: */
+                                           RTUNI_ALPHA, /* U+001820: MONGOLIAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+001821: MONGOLIAN LETTER E*/
+                                           RTUNI_ALPHA, /* U+001822: MONGOLIAN LETTER I*/
+                                           RTUNI_ALPHA, /* U+001823: MONGOLIAN LETTER O*/
+                                           RTUNI_ALPHA, /* U+001824: MONGOLIAN LETTER U*/
+                                           RTUNI_ALPHA, /* U+001825: MONGOLIAN LETTER OE*/
+                                           RTUNI_ALPHA, /* U+001826: MONGOLIAN LETTER UE*/
+                                           RTUNI_ALPHA, /* U+001827: MONGOLIAN LETTER EE*/
+                                           RTUNI_ALPHA, /* U+001828: MONGOLIAN LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001829: MONGOLIAN LETTER ANG*/
+                                           RTUNI_ALPHA, /* U+00182a: MONGOLIAN LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00182b: MONGOLIAN LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00182c: MONGOLIAN LETTER QA*/
+                                           RTUNI_ALPHA, /* U+00182d: MONGOLIAN LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00182e: MONGOLIAN LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00182f: MONGOLIAN LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001830: MONGOLIAN LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001831: MONGOLIAN LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+001832: MONGOLIAN LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001833: MONGOLIAN LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001834: MONGOLIAN LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+001835: MONGOLIAN LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001836: MONGOLIAN LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001837: MONGOLIAN LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001838: MONGOLIAN LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001839: MONGOLIAN LETTER FA*/
+                                           RTUNI_ALPHA, /* U+00183a: MONGOLIAN LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00183b: MONGOLIAN LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00183c: MONGOLIAN LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+00183d: MONGOLIAN LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+00183e: MONGOLIAN LETTER HAA*/
+                                           RTUNI_ALPHA, /* U+00183f: MONGOLIAN LETTER ZRA*/
+                                           RTUNI_ALPHA, /* U+001840: MONGOLIAN LETTER LHA*/
+                                           RTUNI_ALPHA, /* U+001841: MONGOLIAN LETTER ZHI*/
+                                           RTUNI_ALPHA, /* U+001842: MONGOLIAN LETTER CHI*/
+                                           RTUNI_ALPHA, /* U+001843: MONGOLIAN LETTER TODO LONG VOWEL SIGN*/
+                                           RTUNI_ALPHA, /* U+001844: MONGOLIAN LETTER TODO E*/
+                                           RTUNI_ALPHA, /* U+001845: MONGOLIAN LETTER TODO I*/
+                                           RTUNI_ALPHA, /* U+001846: MONGOLIAN LETTER TODO O*/
+                                           RTUNI_ALPHA, /* U+001847: MONGOLIAN LETTER TODO U*/
+                                           RTUNI_ALPHA, /* U+001848: MONGOLIAN LETTER TODO OE*/
+                                           RTUNI_ALPHA, /* U+001849: MONGOLIAN LETTER TODO UE*/
+                                           RTUNI_ALPHA, /* U+00184a: MONGOLIAN LETTER TODO ANG*/
+                                           RTUNI_ALPHA, /* U+00184b: MONGOLIAN LETTER TODO BA*/
+                                           RTUNI_ALPHA, /* U+00184c: MONGOLIAN LETTER TODO PA*/
+                                           RTUNI_ALPHA, /* U+00184d: MONGOLIAN LETTER TODO QA*/
+                                           RTUNI_ALPHA, /* U+00184e: MONGOLIAN LETTER TODO GA*/
+                                           RTUNI_ALPHA, /* U+00184f: MONGOLIAN LETTER TODO MA*/
+                                           RTUNI_ALPHA, /* U+001850: MONGOLIAN LETTER TODO TA*/
+                                           RTUNI_ALPHA, /* U+001851: MONGOLIAN LETTER TODO DA*/
+                                           RTUNI_ALPHA, /* U+001852: MONGOLIAN LETTER TODO CHA*/
+                                           RTUNI_ALPHA, /* U+001853: MONGOLIAN LETTER TODO JA*/
+                                           RTUNI_ALPHA, /* U+001854: MONGOLIAN LETTER TODO TSA*/
+                                           RTUNI_ALPHA, /* U+001855: MONGOLIAN LETTER TODO YA*/
+                                           RTUNI_ALPHA, /* U+001856: MONGOLIAN LETTER TODO WA*/
+                                           RTUNI_ALPHA, /* U+001857: MONGOLIAN LETTER TODO KA*/
+                                           RTUNI_ALPHA, /* U+001858: MONGOLIAN LETTER TODO GAA*/
+                                           RTUNI_ALPHA, /* U+001859: MONGOLIAN LETTER TODO HAA*/
+                                           RTUNI_ALPHA, /* U+00185a: MONGOLIAN LETTER TODO JIA*/
+                                           RTUNI_ALPHA, /* U+00185b: MONGOLIAN LETTER TODO NIA*/
+                                           RTUNI_ALPHA, /* U+00185c: MONGOLIAN LETTER TODO DZA*/
+                                           RTUNI_ALPHA, /* U+00185d: MONGOLIAN LETTER SIBE E*/
+                                           RTUNI_ALPHA, /* U+00185e: MONGOLIAN LETTER SIBE I*/
+                                           RTUNI_ALPHA, /* U+00185f: MONGOLIAN LETTER SIBE IY*/
+                                           RTUNI_ALPHA, /* U+001860: MONGOLIAN LETTER SIBE UE*/
+                                           RTUNI_ALPHA, /* U+001861: MONGOLIAN LETTER SIBE U*/
+                                           RTUNI_ALPHA, /* U+001862: MONGOLIAN LETTER SIBE ANG*/
+                                           RTUNI_ALPHA, /* U+001863: MONGOLIAN LETTER SIBE KA*/
+                                           RTUNI_ALPHA, /* U+001864: MONGOLIAN LETTER SIBE GA*/
+                                           RTUNI_ALPHA, /* U+001865: MONGOLIAN LETTER SIBE HA*/
+                                           RTUNI_ALPHA, /* U+001866: MONGOLIAN LETTER SIBE PA*/
+                                           RTUNI_ALPHA, /* U+001867: MONGOLIAN LETTER SIBE SHA*/
+                                           RTUNI_ALPHA, /* U+001868: MONGOLIAN LETTER SIBE TA*/
+                                           RTUNI_ALPHA, /* U+001869: MONGOLIAN LETTER SIBE DA*/
+                                           RTUNI_ALPHA, /* U+00186a: MONGOLIAN LETTER SIBE JA*/
+                                           RTUNI_ALPHA, /* U+00186b: MONGOLIAN LETTER SIBE FA*/
+                                           RTUNI_ALPHA, /* U+00186c: MONGOLIAN LETTER SIBE GAA*/
+                                           RTUNI_ALPHA, /* U+00186d: MONGOLIAN LETTER SIBE HAA*/
+                                           RTUNI_ALPHA, /* U+00186e: MONGOLIAN LETTER SIBE TSA*/
+                                           RTUNI_ALPHA, /* U+00186f: MONGOLIAN LETTER SIBE ZA*/
+                                           RTUNI_ALPHA, /* U+001870: MONGOLIAN LETTER SIBE RAA*/
+                                           RTUNI_ALPHA, /* U+001871: MONGOLIAN LETTER SIBE CHA*/
+                                           RTUNI_ALPHA, /* U+001872: MONGOLIAN LETTER SIBE ZHA*/
+                                           RTUNI_ALPHA, /* U+001873: MONGOLIAN LETTER MANCHU I*/
+                                           RTUNI_ALPHA, /* U+001874: MONGOLIAN LETTER MANCHU KA*/
+                                           RTUNI_ALPHA, /* U+001875: MONGOLIAN LETTER MANCHU RA*/
+                                           RTUNI_ALPHA, /* U+001876: MONGOLIAN LETTER MANCHU FA*/
+                                           RTUNI_ALPHA, /* U+001877: MONGOLIAN LETTER MANCHU ZHA*/
+                                                     0, /* U+001878: */
+                                                     0, /* U+001879: */
+                                                     0, /* U+00187a: */
+                                                     0, /* U+00187b: */
+                                                     0, /* U+00187c: */
+                                                     0, /* U+00187d: */
+                                                     0, /* U+00187e: */
+                                                     0, /* U+00187f: */
+                                           RTUNI_ALPHA, /* U+001880: MONGOLIAN LETTER ALI GALI ANUSVARA ONE*/
+                                           RTUNI_ALPHA, /* U+001881: MONGOLIAN LETTER ALI GALI VISARGA ONE*/
+                                           RTUNI_ALPHA, /* U+001882: MONGOLIAN LETTER ALI GALI DAMARU*/
+                                           RTUNI_ALPHA, /* U+001883: MONGOLIAN LETTER ALI GALI UBADAMA*/
+                                           RTUNI_ALPHA, /* U+001884: MONGOLIAN LETTER ALI GALI INVERTED UBADAMA*/
+                                           RTUNI_ALPHA, /* U+001885: MONGOLIAN LETTER ALI GALI BALUDA*/
+                                           RTUNI_ALPHA, /* U+001886: MONGOLIAN LETTER ALI GALI THREE BALUDA*/
+                                           RTUNI_ALPHA, /* U+001887: MONGOLIAN LETTER ALI GALI A*/
+                                           RTUNI_ALPHA, /* U+001888: MONGOLIAN LETTER ALI GALI I*/
+                                           RTUNI_ALPHA, /* U+001889: MONGOLIAN LETTER ALI GALI KA*/
+                                           RTUNI_ALPHA, /* U+00188a: MONGOLIAN LETTER ALI GALI NGA*/
+                                           RTUNI_ALPHA, /* U+00188b: MONGOLIAN LETTER ALI GALI CA*/
+                                           RTUNI_ALPHA, /* U+00188c: MONGOLIAN LETTER ALI GALI TTA*/
+                                           RTUNI_ALPHA, /* U+00188d: MONGOLIAN LETTER ALI GALI TTHA*/
+                                           RTUNI_ALPHA, /* U+00188e: MONGOLIAN LETTER ALI GALI DDA*/
+                                           RTUNI_ALPHA, /* U+00188f: MONGOLIAN LETTER ALI GALI NNA*/
+                                           RTUNI_ALPHA, /* U+001890: MONGOLIAN LETTER ALI GALI TA*/
+                                           RTUNI_ALPHA, /* U+001891: MONGOLIAN LETTER ALI GALI DA*/
+                                           RTUNI_ALPHA, /* U+001892: MONGOLIAN LETTER ALI GALI PA*/
+                                           RTUNI_ALPHA, /* U+001893: MONGOLIAN LETTER ALI GALI PHA*/
+                                           RTUNI_ALPHA, /* U+001894: MONGOLIAN LETTER ALI GALI SSA*/
+                                           RTUNI_ALPHA, /* U+001895: MONGOLIAN LETTER ALI GALI ZHA*/
+                                           RTUNI_ALPHA, /* U+001896: MONGOLIAN LETTER ALI GALI ZA*/
+                                           RTUNI_ALPHA, /* U+001897: MONGOLIAN LETTER ALI GALI AH*/
+                                           RTUNI_ALPHA, /* U+001898: MONGOLIAN LETTER TODO ALI GALI TA*/
+                                           RTUNI_ALPHA, /* U+001899: MONGOLIAN LETTER TODO ALI GALI ZHA*/
+                                           RTUNI_ALPHA, /* U+00189a: MONGOLIAN LETTER MANCHU ALI GALI GHA*/
+                                           RTUNI_ALPHA, /* U+00189b: MONGOLIAN LETTER MANCHU ALI GALI NGA*/
+                                           RTUNI_ALPHA, /* U+00189c: MONGOLIAN LETTER MANCHU ALI GALI CA*/
+                                           RTUNI_ALPHA, /* U+00189d: MONGOLIAN LETTER MANCHU ALI GALI JHA*/
+                                           RTUNI_ALPHA, /* U+00189e: MONGOLIAN LETTER MANCHU ALI GALI TTA*/
+                                           RTUNI_ALPHA, /* U+00189f: MONGOLIAN LETTER MANCHU ALI GALI DDHA*/
+                                           RTUNI_ALPHA, /* U+0018a0: MONGOLIAN LETTER MANCHU ALI GALI TA*/
+                                           RTUNI_ALPHA, /* U+0018a1: MONGOLIAN LETTER MANCHU ALI GALI DHA*/
+                                           RTUNI_ALPHA, /* U+0018a2: MONGOLIAN LETTER MANCHU ALI GALI SSA*/
+                                           RTUNI_ALPHA, /* U+0018a3: MONGOLIAN LETTER MANCHU ALI GALI CYA*/
+                                           RTUNI_ALPHA, /* U+0018a4: MONGOLIAN LETTER MANCHU ALI GALI ZHA*/
+                                           RTUNI_ALPHA, /* U+0018a5: MONGOLIAN LETTER MANCHU ALI GALI ZA*/
+                                           RTUNI_ALPHA, /* U+0018a6: MONGOLIAN LETTER ALI GALI HALF U*/
+                                           RTUNI_ALPHA, /* U+0018a7: MONGOLIAN LETTER ALI GALI HALF YA*/
+                                           RTUNI_ALPHA, /* U+0018a8: MONGOLIAN LETTER MANCHU ALI GALI BHA*/
+                                           RTUNI_ALPHA, /* U+0018a9: MONGOLIAN LETTER ALI GALI DAGALGA*/
+                                           RTUNI_ALPHA, /* U+0018aa: MONGOLIAN LETTER MANCHU ALI GALI LHA*/
+                                                     0, /* U+0018ab: */
+                                                     0, /* U+0018ac: */
+                                                     0, /* U+0018ad: */
+                                                     0, /* U+0018ae: */
+                                                     0, /* U+0018af: */
+                                           RTUNI_ALPHA, /* U+0018b0: CANADIAN SYLLABICS OY*/
+                                           RTUNI_ALPHA, /* U+0018b1: CANADIAN SYLLABICS AY*/
+                                           RTUNI_ALPHA, /* U+0018b2: CANADIAN SYLLABICS AAY*/
+                                           RTUNI_ALPHA, /* U+0018b3: CANADIAN SYLLABICS WAY*/
+                                           RTUNI_ALPHA, /* U+0018b4: CANADIAN SYLLABICS POY*/
+                                           RTUNI_ALPHA, /* U+0018b5: CANADIAN SYLLABICS PAY*/
+                                           RTUNI_ALPHA, /* U+0018b6: CANADIAN SYLLABICS PWOY*/
+                                           RTUNI_ALPHA, /* U+0018b7: CANADIAN SYLLABICS TAY*/
+                                           RTUNI_ALPHA, /* U+0018b8: CANADIAN SYLLABICS KAY*/
+                                           RTUNI_ALPHA, /* U+0018b9: CANADIAN SYLLABICS KWAY*/
+                                           RTUNI_ALPHA, /* U+0018ba: CANADIAN SYLLABICS MAY*/
+                                           RTUNI_ALPHA, /* U+0018bb: CANADIAN SYLLABICS NOY*/
+                                           RTUNI_ALPHA, /* U+0018bc: CANADIAN SYLLABICS NAY*/
+                                           RTUNI_ALPHA, /* U+0018bd: CANADIAN SYLLABICS LAY*/
+                                           RTUNI_ALPHA, /* U+0018be: CANADIAN SYLLABICS SOY*/
+                                           RTUNI_ALPHA, /* U+0018bf: CANADIAN SYLLABICS SAY*/
+                                           RTUNI_ALPHA, /* U+0018c0: CANADIAN SYLLABICS SHOY*/
+                                           RTUNI_ALPHA, /* U+0018c1: CANADIAN SYLLABICS SHAY*/
+                                           RTUNI_ALPHA, /* U+0018c2: CANADIAN SYLLABICS SHWOY*/
+                                           RTUNI_ALPHA, /* U+0018c3: CANADIAN SYLLABICS YOY*/
+                                           RTUNI_ALPHA, /* U+0018c4: CANADIAN SYLLABICS YAY*/
+                                           RTUNI_ALPHA, /* U+0018c5: CANADIAN SYLLABICS RAY*/
+                                           RTUNI_ALPHA, /* U+0018c6: CANADIAN SYLLABICS NWI*/
+                                           RTUNI_ALPHA, /* U+0018c7: CANADIAN SYLLABICS OJIBWAY NWI*/
+                                           RTUNI_ALPHA, /* U+0018c8: CANADIAN SYLLABICS NWII*/
+                                           RTUNI_ALPHA, /* U+0018c9: CANADIAN SYLLABICS OJIBWAY NWII*/
+                                           RTUNI_ALPHA, /* U+0018ca: CANADIAN SYLLABICS NWO*/
+                                           RTUNI_ALPHA, /* U+0018cb: CANADIAN SYLLABICS OJIBWAY NWO*/
+                                           RTUNI_ALPHA, /* U+0018cc: CANADIAN SYLLABICS NWOO*/
+                                           RTUNI_ALPHA, /* U+0018cd: CANADIAN SYLLABICS OJIBWAY NWOO*/
+                                           RTUNI_ALPHA, /* U+0018ce: CANADIAN SYLLABICS RWEE*/
+                                           RTUNI_ALPHA, /* U+0018cf: CANADIAN SYLLABICS RWI*/
+                                           RTUNI_ALPHA, /* U+0018d0: CANADIAN SYLLABICS RWII*/
+                                           RTUNI_ALPHA, /* U+0018d1: CANADIAN SYLLABICS RWO*/
+                                           RTUNI_ALPHA, /* U+0018d2: CANADIAN SYLLABICS RWOO*/
+                                           RTUNI_ALPHA, /* U+0018d3: CANADIAN SYLLABICS RWA*/
+                                           RTUNI_ALPHA, /* U+0018d4: CANADIAN SYLLABICS OJIBWAY P*/
+                                           RTUNI_ALPHA, /* U+0018d5: CANADIAN SYLLABICS OJIBWAY T*/
+                                           RTUNI_ALPHA, /* U+0018d6: CANADIAN SYLLABICS OJIBWAY K*/
+                                           RTUNI_ALPHA, /* U+0018d7: CANADIAN SYLLABICS OJIBWAY C*/
+                                           RTUNI_ALPHA, /* U+0018d8: CANADIAN SYLLABICS OJIBWAY M*/
+                                           RTUNI_ALPHA, /* U+0018d9: CANADIAN SYLLABICS OJIBWAY N*/
+                                           RTUNI_ALPHA, /* U+0018da: CANADIAN SYLLABICS OJIBWAY S*/
+                                           RTUNI_ALPHA, /* U+0018db: CANADIAN SYLLABICS OJIBWAY SH*/
+                                           RTUNI_ALPHA, /* U+0018dc: CANADIAN SYLLABICS EASTERN W*/
+                                           RTUNI_ALPHA, /* U+0018dd: CANADIAN SYLLABICS WESTERN W*/
+                                           RTUNI_ALPHA, /* U+0018de: CANADIAN SYLLABICS FINAL SMALL RING*/
+                                           RTUNI_ALPHA, /* U+0018df: CANADIAN SYLLABICS FINAL RAISED DOT*/
+                                           RTUNI_ALPHA, /* U+0018e0: CANADIAN SYLLABICS R-CREE RWE*/
+                                           RTUNI_ALPHA, /* U+0018e1: CANADIAN SYLLABICS WEST-CREE LOO*/
+                                           RTUNI_ALPHA, /* U+0018e2: CANADIAN SYLLABICS WEST-CREE LAA*/
+                                           RTUNI_ALPHA, /* U+0018e3: CANADIAN SYLLABICS THWE*/
+                                           RTUNI_ALPHA, /* U+0018e4: CANADIAN SYLLABICS THWA*/
+                                           RTUNI_ALPHA, /* U+0018e5: CANADIAN SYLLABICS TTHWE*/
+                                           RTUNI_ALPHA, /* U+0018e6: CANADIAN SYLLABICS TTHOO*/
+                                           RTUNI_ALPHA, /* U+0018e7: CANADIAN SYLLABICS TTHAA*/
+                                           RTUNI_ALPHA, /* U+0018e8: CANADIAN SYLLABICS TLHWE*/
+                                           RTUNI_ALPHA, /* U+0018e9: CANADIAN SYLLABICS TLHOO*/
+                                           RTUNI_ALPHA, /* U+0018ea: CANADIAN SYLLABICS SAYISI SHWE*/
+                                           RTUNI_ALPHA, /* U+0018eb: CANADIAN SYLLABICS SAYISI SHOO*/
+                                           RTUNI_ALPHA, /* U+0018ec: CANADIAN SYLLABICS SAYISI HOO*/
+                                           RTUNI_ALPHA, /* U+0018ed: CANADIAN SYLLABICS CARRIER GWU*/
+                                           RTUNI_ALPHA, /* U+0018ee: CANADIAN SYLLABICS CARRIER DENE GEE*/
+                                           RTUNI_ALPHA, /* U+0018ef: CANADIAN SYLLABICS CARRIER GAA*/
+                                           RTUNI_ALPHA, /* U+0018f0: CANADIAN SYLLABICS CARRIER GWA*/
+                                           RTUNI_ALPHA, /* U+0018f1: CANADIAN SYLLABICS SAYISI JUU*/
+                                           RTUNI_ALPHA, /* U+0018f2: CANADIAN SYLLABICS CARRIER JWA*/
+                                           RTUNI_ALPHA, /* U+0018f3: CANADIAN SYLLABICS BEAVER DENE L*/
+                                           RTUNI_ALPHA, /* U+0018f4: CANADIAN SYLLABICS BEAVER DENE R*/
+                                           RTUNI_ALPHA, /* U+0018f5: CANADIAN SYLLABICS CARRIER DENTAL S*/
+                                                     0, /* U+0018f6: */
+                                                     0, /* U+0018f7: */
+                                                     0, /* U+0018f8: */
+                                                     0, /* U+0018f9: */
+                                                     0, /* U+0018fa: */
+                                                     0, /* U+0018fb: */
+                                                     0, /* U+0018fc: */
+                                                     0, /* U+0018fd: */
+                                                     0, /* U+0018fe: */
+                                                     0, /* U+0018ff: */
+                                           RTUNI_ALPHA, /* U+001900: LIMBU VOWEL-CARRIER LETTER*/
+                                           RTUNI_ALPHA, /* U+001901: LIMBU LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001902: LIMBU LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001903: LIMBU LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001904: LIMBU LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+001905: LIMBU LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001906: LIMBU LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001907: LIMBU LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+001908: LIMBU LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001909: LIMBU LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+00190a: LIMBU LETTER YAN*/
+                                           RTUNI_ALPHA, /* U+00190b: LIMBU LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00190c: LIMBU LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00190d: LIMBU LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00190e: LIMBU LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+00190f: LIMBU LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001910: LIMBU LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001911: LIMBU LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+001912: LIMBU LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001913: LIMBU LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+001914: LIMBU LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001915: LIMBU LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001916: LIMBU LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001917: LIMBU LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001918: LIMBU LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001919: LIMBU LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00191a: LIMBU LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+00191b: LIMBU LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00191c: LIMBU LETTER HA*/
+                                                     0, /* U+00191d: */
+                                                     0, /* U+00191e: */
+                                                     0, /* U+00191f: */
+                                           RTUNI_ALPHA, /* U+001920: LIMBU VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+001921: LIMBU VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001922: LIMBU VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001923: LIMBU VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+001924: LIMBU VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+001925: LIMBU VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+001926: LIMBU VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+001927: LIMBU VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001928: LIMBU VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+001929: LIMBU SUBJOINED LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00192a: LIMBU SUBJOINED LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00192b: LIMBU SUBJOINED LETTER WA*/
+                                                     0, /* U+00192c: */
+                                                     0, /* U+00192d: */
+                                                     0, /* U+00192e: */
+                                                     0, /* U+00192f: */
+                                           RTUNI_ALPHA, /* U+001930: LIMBU SMALL LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001931: LIMBU SMALL LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001932: LIMBU SMALL LETTER ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+001933: LIMBU SMALL LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001934: LIMBU SMALL LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001935: LIMBU SMALL LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001936: LIMBU SMALL LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001937: LIMBU SMALL LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001938: LIMBU SMALL LETTER LA*/
+                                                     0, /* U+001939: LIMBU SIGN MUKPHRENG*/
+                                                     0, /* U+00193a: LIMBU SIGN KEMPHRENG*/
+                                                     0, /* U+00193b: LIMBU SIGN SA-I*/
+                                                     0, /* U+00193c: */
+                                                     0, /* U+00193d: */
+                                                     0, /* U+00193e: */
+                                                     0, /* U+00193f: */
+                                                     0, /* U+001940: LIMBU SIGN LOO*/
+                                                     0, /* U+001941: */
+                                                     0, /* U+001942: */
+                                                     0, /* U+001943: */
+                                                     0, /* U+001944: LIMBU EXCLAMATION MARK*/
+                                                     0, /* U+001945: LIMBU QUESTION MARK*/
+                                          RTUNI_DDIGIT, /* U+001946: LIMBU DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001947: LIMBU DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001948: LIMBU DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001949: LIMBU DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00194a: LIMBU DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00194b: LIMBU DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00194c: LIMBU DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00194d: LIMBU DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00194e: LIMBU DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00194f: LIMBU DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+001950: TAI LE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001951: TAI LE LETTER XA*/
+                                           RTUNI_ALPHA, /* U+001952: TAI LE LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001953: TAI LE LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+001954: TAI LE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001955: TAI LE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001956: TAI LE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001957: TAI LE LETTER THA*/
+                                           RTUNI_ALPHA, /* U+001958: TAI LE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001959: TAI LE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00195a: TAI LE LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00195b: TAI LE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00195c: TAI LE LETTER FA*/
+                                           RTUNI_ALPHA, /* U+00195d: TAI LE LETTER VA*/
+                                           RTUNI_ALPHA, /* U+00195e: TAI LE LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00195f: TAI LE LETTER QA*/
+                                           RTUNI_ALPHA, /* U+001960: TAI LE LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001961: TAI LE LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+001962: TAI LE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001963: TAI LE LETTER A*/
+                                           RTUNI_ALPHA, /* U+001964: TAI LE LETTER I*/
+                                           RTUNI_ALPHA, /* U+001965: TAI LE LETTER EE*/
+                                           RTUNI_ALPHA, /* U+001966: TAI LE LETTER EH*/
+                                           RTUNI_ALPHA, /* U+001967: TAI LE LETTER U*/
+                                           RTUNI_ALPHA, /* U+001968: TAI LE LETTER OO*/
+                                           RTUNI_ALPHA, /* U+001969: TAI LE LETTER O*/
+                                           RTUNI_ALPHA, /* U+00196a: TAI LE LETTER UE*/
+                                           RTUNI_ALPHA, /* U+00196b: TAI LE LETTER E*/
+                                           RTUNI_ALPHA, /* U+00196c: TAI LE LETTER AUE*/
+                                           RTUNI_ALPHA, /* U+00196d: TAI LE LETTER AI*/
+                                                     0, /* U+00196e: */
+                                                     0, /* U+00196f: */
+                                           RTUNI_ALPHA, /* U+001970: TAI LE LETTER TONE-2*/
+                                           RTUNI_ALPHA, /* U+001971: TAI LE LETTER TONE-3*/
+                                           RTUNI_ALPHA, /* U+001972: TAI LE LETTER TONE-4*/
+                                           RTUNI_ALPHA, /* U+001973: TAI LE LETTER TONE-5*/
+                                           RTUNI_ALPHA, /* U+001974: TAI LE LETTER TONE-6*/
+                                                     0, /* U+001975: */
+                                                     0, /* U+001976: */
+                                                     0, /* U+001977: */
+                                                     0, /* U+001978: */
+                                                     0, /* U+001979: */
+                                                     0, /* U+00197a: */
+                                                     0, /* U+00197b: */
+                                                     0, /* U+00197c: */
+                                                     0, /* U+00197d: */
+                                                     0, /* U+00197e: */
+                                                     0, /* U+00197f: */
+                                           RTUNI_ALPHA, /* U+001980: NEW TAI LUE LETTER HIGH QA*/
+                                           RTUNI_ALPHA, /* U+001981: NEW TAI LUE LETTER LOW QA*/
+                                           RTUNI_ALPHA, /* U+001982: NEW TAI LUE LETTER HIGH KA*/
+                                           RTUNI_ALPHA, /* U+001983: NEW TAI LUE LETTER HIGH XA*/
+                                           RTUNI_ALPHA, /* U+001984: NEW TAI LUE LETTER HIGH NGA*/
+                                           RTUNI_ALPHA, /* U+001985: NEW TAI LUE LETTER LOW KA*/
+                                           RTUNI_ALPHA, /* U+001986: NEW TAI LUE LETTER LOW XA*/
+                                           RTUNI_ALPHA, /* U+001987: NEW TAI LUE LETTER LOW NGA*/
+                                           RTUNI_ALPHA, /* U+001988: NEW TAI LUE LETTER HIGH TSA*/
+                                           RTUNI_ALPHA, /* U+001989: NEW TAI LUE LETTER HIGH SA*/
+                                           RTUNI_ALPHA, /* U+00198a: NEW TAI LUE LETTER HIGH YA*/
+                                           RTUNI_ALPHA, /* U+00198b: NEW TAI LUE LETTER LOW TSA*/
+                                           RTUNI_ALPHA, /* U+00198c: NEW TAI LUE LETTER LOW SA*/
+                                           RTUNI_ALPHA, /* U+00198d: NEW TAI LUE LETTER LOW YA*/
+                                           RTUNI_ALPHA, /* U+00198e: NEW TAI LUE LETTER HIGH TA*/
+                                           RTUNI_ALPHA, /* U+00198f: NEW TAI LUE LETTER HIGH THA*/
+                                           RTUNI_ALPHA, /* U+001990: NEW TAI LUE LETTER HIGH NA*/
+                                           RTUNI_ALPHA, /* U+001991: NEW TAI LUE LETTER LOW TA*/
+                                           RTUNI_ALPHA, /* U+001992: NEW TAI LUE LETTER LOW THA*/
+                                           RTUNI_ALPHA, /* U+001993: NEW TAI LUE LETTER LOW NA*/
+                                           RTUNI_ALPHA, /* U+001994: NEW TAI LUE LETTER HIGH PA*/
+                                           RTUNI_ALPHA, /* U+001995: NEW TAI LUE LETTER HIGH PHA*/
+                                           RTUNI_ALPHA, /* U+001996: NEW TAI LUE LETTER HIGH MA*/
+                                           RTUNI_ALPHA, /* U+001997: NEW TAI LUE LETTER LOW PA*/
+                                           RTUNI_ALPHA, /* U+001998: NEW TAI LUE LETTER LOW PHA*/
+                                           RTUNI_ALPHA, /* U+001999: NEW TAI LUE LETTER LOW MA*/
+                                           RTUNI_ALPHA, /* U+00199a: NEW TAI LUE LETTER HIGH FA*/
+                                           RTUNI_ALPHA, /* U+00199b: NEW TAI LUE LETTER HIGH VA*/
+                                           RTUNI_ALPHA, /* U+00199c: NEW TAI LUE LETTER HIGH LA*/
+                                           RTUNI_ALPHA, /* U+00199d: NEW TAI LUE LETTER LOW FA*/
+                                           RTUNI_ALPHA, /* U+00199e: NEW TAI LUE LETTER LOW VA*/
+                                           RTUNI_ALPHA, /* U+00199f: NEW TAI LUE LETTER LOW LA*/
+                                           RTUNI_ALPHA, /* U+0019a0: NEW TAI LUE LETTER HIGH HA*/
+                                           RTUNI_ALPHA, /* U+0019a1: NEW TAI LUE LETTER HIGH DA*/
+                                           RTUNI_ALPHA, /* U+0019a2: NEW TAI LUE LETTER HIGH BA*/
+                                           RTUNI_ALPHA, /* U+0019a3: NEW TAI LUE LETTER LOW HA*/
+                                           RTUNI_ALPHA, /* U+0019a4: NEW TAI LUE LETTER LOW DA*/
+                                           RTUNI_ALPHA, /* U+0019a5: NEW TAI LUE LETTER LOW BA*/
+                                           RTUNI_ALPHA, /* U+0019a6: NEW TAI LUE LETTER HIGH KVA*/
+                                           RTUNI_ALPHA, /* U+0019a7: NEW TAI LUE LETTER HIGH XVA*/
+                                           RTUNI_ALPHA, /* U+0019a8: NEW TAI LUE LETTER LOW KVA*/
+                                           RTUNI_ALPHA, /* U+0019a9: NEW TAI LUE LETTER LOW XVA*/
+                                           RTUNI_ALPHA, /* U+0019aa: NEW TAI LUE LETTER HIGH SUA*/
+                                           RTUNI_ALPHA, /* U+0019ab: NEW TAI LUE LETTER LOW SUA*/
+                                                     0, /* U+0019ac: */
+                                                     0, /* U+0019ad: */
+                                                     0, /* U+0019ae: */
+                                                     0, /* U+0019af: */
+                                           RTUNI_ALPHA, /* U+0019b0: NEW TAI LUE VOWEL SIGN VOWEL SHORTENER*/
+                                           RTUNI_ALPHA, /* U+0019b1: NEW TAI LUE VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0019b2: NEW TAI LUE VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0019b3: NEW TAI LUE VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0019b4: NEW TAI LUE VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0019b5: NEW TAI LUE VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0019b6: NEW TAI LUE VOWEL SIGN AE*/
+                                           RTUNI_ALPHA, /* U+0019b7: NEW TAI LUE VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+0019b8: NEW TAI LUE VOWEL SIGN OA*/
+                                           RTUNI_ALPHA, /* U+0019b9: NEW TAI LUE VOWEL SIGN UE*/
+                                           RTUNI_ALPHA, /* U+0019ba: NEW TAI LUE VOWEL SIGN AY*/
+                                           RTUNI_ALPHA, /* U+0019bb: NEW TAI LUE VOWEL SIGN AAY*/
+                                           RTUNI_ALPHA, /* U+0019bc: NEW TAI LUE VOWEL SIGN UY*/
+                                           RTUNI_ALPHA, /* U+0019bd: NEW TAI LUE VOWEL SIGN OY*/
+                                           RTUNI_ALPHA, /* U+0019be: NEW TAI LUE VOWEL SIGN OAY*/
+                                           RTUNI_ALPHA, /* U+0019bf: NEW TAI LUE VOWEL SIGN UEY*/
+                                           RTUNI_ALPHA, /* U+0019c0: NEW TAI LUE VOWEL SIGN IY*/
+                                           RTUNI_ALPHA, /* U+0019c1: NEW TAI LUE LETTER FINAL V*/
+                                           RTUNI_ALPHA, /* U+0019c2: NEW TAI LUE LETTER FINAL NG*/
+                                           RTUNI_ALPHA, /* U+0019c3: NEW TAI LUE LETTER FINAL N*/
+                                           RTUNI_ALPHA, /* U+0019c4: NEW TAI LUE LETTER FINAL M*/
+                                           RTUNI_ALPHA, /* U+0019c5: NEW TAI LUE LETTER FINAL K*/
+                                           RTUNI_ALPHA, /* U+0019c6: NEW TAI LUE LETTER FINAL D*/
+                                           RTUNI_ALPHA, /* U+0019c7: NEW TAI LUE LETTER FINAL B*/
+                                           RTUNI_ALPHA, /* U+0019c8: NEW TAI LUE TONE MARK-1*/
+                                           RTUNI_ALPHA, /* U+0019c9: NEW TAI LUE TONE MARK-2*/
+                                                     0, /* U+0019ca: */
+                                                     0, /* U+0019cb: */
+                                                     0, /* U+0019cc: */
+                                                     0, /* U+0019cd: */
+                                                     0, /* U+0019ce: */
+                                                     0, /* U+0019cf: */
+                                          RTUNI_DDIGIT, /* U+0019d0: NEW TAI LUE DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0019d1: NEW TAI LUE DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0019d2: NEW TAI LUE DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0019d3: NEW TAI LUE DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0019d4: NEW TAI LUE DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0019d5: NEW TAI LUE DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0019d6: NEW TAI LUE DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0019d7: NEW TAI LUE DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0019d8: NEW TAI LUE DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0019d9: NEW TAI LUE DIGIT NINE*/
+                                                     0, /* U+0019da: NEW TAI LUE THAM DIGIT ONE*/
+                                                     0, /* U+0019db: */
+                                                     0, /* U+0019dc: */
+                                                     0, /* U+0019dd: */
+                                                     0, /* U+0019de: NEW TAI LUE SIGN LAE*/
+                                                     0, /* U+0019df: NEW TAI LUE SIGN LAEV*/
+                                                     0, /* U+0019e0: KHMER SYMBOL PATHAMASAT*/
+                                                     0, /* U+0019e1: KHMER SYMBOL MUOY KOET*/
+                                                     0, /* U+0019e2: KHMER SYMBOL PII KOET*/
+                                                     0, /* U+0019e3: KHMER SYMBOL BEI KOET*/
+                                                     0, /* U+0019e4: KHMER SYMBOL BUON KOET*/
+                                                     0, /* U+0019e5: KHMER SYMBOL PRAM KOET*/
+                                                     0, /* U+0019e6: KHMER SYMBOL PRAM-MUOY KOET*/
+                                                     0, /* U+0019e7: KHMER SYMBOL PRAM-PII KOET*/
+                                                     0, /* U+0019e8: KHMER SYMBOL PRAM-BEI KOET*/
+                                                     0, /* U+0019e9: KHMER SYMBOL PRAM-BUON KOET*/
+                                                     0, /* U+0019ea: KHMER SYMBOL DAP KOET*/
+                                                     0, /* U+0019eb: KHMER SYMBOL DAP-MUOY KOET*/
+                                                     0, /* U+0019ec: KHMER SYMBOL DAP-PII KOET*/
+                                                     0, /* U+0019ed: KHMER SYMBOL DAP-BEI KOET*/
+                                                     0, /* U+0019ee: KHMER SYMBOL DAP-BUON KOET*/
+                                                     0, /* U+0019ef: KHMER SYMBOL DAP-PRAM KOET*/
+                                                     0, /* U+0019f0: KHMER SYMBOL TUTEYASAT*/
+                                                     0, /* U+0019f1: KHMER SYMBOL MUOY ROC*/
+                                                     0, /* U+0019f2: KHMER SYMBOL PII ROC*/
+                                                     0, /* U+0019f3: KHMER SYMBOL BEI ROC*/
+                                                     0, /* U+0019f4: KHMER SYMBOL BUON ROC*/
+                                                     0, /* U+0019f5: KHMER SYMBOL PRAM ROC*/
+                                                     0, /* U+0019f6: KHMER SYMBOL PRAM-MUOY ROC*/
+                                                     0, /* U+0019f7: KHMER SYMBOL PRAM-PII ROC*/
+                                                     0, /* U+0019f8: KHMER SYMBOL PRAM-BEI ROC*/
+                                                     0, /* U+0019f9: KHMER SYMBOL PRAM-BUON ROC*/
+                                                     0, /* U+0019fa: KHMER SYMBOL DAP ROC*/
+                                                     0, /* U+0019fb: KHMER SYMBOL DAP-MUOY ROC*/
+                                                     0, /* U+0019fc: KHMER SYMBOL DAP-PII ROC*/
+                                                     0, /* U+0019fd: KHMER SYMBOL DAP-BEI ROC*/
+                                                     0, /* U+0019fe: KHMER SYMBOL DAP-BUON ROC*/
+                                                     0, /* U+0019ff: KHMER SYMBOL DAP-PRAM ROC*/
+                                           RTUNI_ALPHA, /* U+001a00: BUGINESE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001a01: BUGINESE LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001a02: BUGINESE LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001a03: BUGINESE LETTER NGKA*/
+                                           RTUNI_ALPHA, /* U+001a04: BUGINESE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001a05: BUGINESE LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001a06: BUGINESE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001a07: BUGINESE LETTER MPA*/
+                                           RTUNI_ALPHA, /* U+001a08: BUGINESE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001a09: BUGINESE LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001a0a: BUGINESE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001a0b: BUGINESE LETTER NRA*/
+                                           RTUNI_ALPHA, /* U+001a0c: BUGINESE LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001a0d: BUGINESE LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001a0e: BUGINESE LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001a0f: BUGINESE LETTER NYCA*/
+                                           RTUNI_ALPHA, /* U+001a10: BUGINESE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001a11: BUGINESE LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001a12: BUGINESE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001a13: BUGINESE LETTER VA*/
+                                           RTUNI_ALPHA, /* U+001a14: BUGINESE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001a15: BUGINESE LETTER A*/
+                                           RTUNI_ALPHA, /* U+001a16: BUGINESE LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001a17: BUGINESE VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001a18: BUGINESE VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001a19: BUGINESE VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001a1a: BUGINESE VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+001a1b: BUGINESE VOWEL SIGN AE*/
+                                                     0, /* U+001a1c: */
+                                                     0, /* U+001a1d: */
+                                                     0, /* U+001a1e: BUGINESE PALLAWA*/
+                                                     0, /* U+001a1f: BUGINESE END OF SECTION*/
+                                           RTUNI_ALPHA, /* U+001a20: TAI THAM LETTER HIGH KA*/
+                                           RTUNI_ALPHA, /* U+001a21: TAI THAM LETTER HIGH KHA*/
+                                           RTUNI_ALPHA, /* U+001a22: TAI THAM LETTER HIGH KXA*/
+                                           RTUNI_ALPHA, /* U+001a23: TAI THAM LETTER LOW KA*/
+                                           RTUNI_ALPHA, /* U+001a24: TAI THAM LETTER LOW KXA*/
+                                           RTUNI_ALPHA, /* U+001a25: TAI THAM LETTER LOW KHA*/
+                                           RTUNI_ALPHA, /* U+001a26: TAI THAM LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001a27: TAI THAM LETTER HIGH CA*/
+                                           RTUNI_ALPHA, /* U+001a28: TAI THAM LETTER HIGH CHA*/
+                                           RTUNI_ALPHA, /* U+001a29: TAI THAM LETTER LOW CA*/
+                                           RTUNI_ALPHA, /* U+001a2a: TAI THAM LETTER LOW SA*/
+                                           RTUNI_ALPHA, /* U+001a2b: TAI THAM LETTER LOW CHA*/
+                                           RTUNI_ALPHA, /* U+001a2c: TAI THAM LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001a2d: TAI THAM LETTER RATA*/
+                                           RTUNI_ALPHA, /* U+001a2e: TAI THAM LETTER HIGH RATHA*/
+                                           RTUNI_ALPHA, /* U+001a2f: TAI THAM LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001a30: TAI THAM LETTER LOW RATHA*/
+                                           RTUNI_ALPHA, /* U+001a31: TAI THAM LETTER RANA*/
+                                           RTUNI_ALPHA, /* U+001a32: TAI THAM LETTER HIGH TA*/
+                                           RTUNI_ALPHA, /* U+001a33: TAI THAM LETTER HIGH THA*/
+                                           RTUNI_ALPHA, /* U+001a34: TAI THAM LETTER LOW TA*/
+                                           RTUNI_ALPHA, /* U+001a35: TAI THAM LETTER LOW THA*/
+                                           RTUNI_ALPHA, /* U+001a36: TAI THAM LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001a37: TAI THAM LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001a38: TAI THAM LETTER HIGH PA*/
+                                           RTUNI_ALPHA, /* U+001a39: TAI THAM LETTER HIGH PHA*/
+                                           RTUNI_ALPHA, /* U+001a3a: TAI THAM LETTER HIGH FA*/
+                                           RTUNI_ALPHA, /* U+001a3b: TAI THAM LETTER LOW PA*/
+                                           RTUNI_ALPHA, /* U+001a3c: TAI THAM LETTER LOW FA*/
+                                           RTUNI_ALPHA, /* U+001a3d: TAI THAM LETTER LOW PHA*/
+                                           RTUNI_ALPHA, /* U+001a3e: TAI THAM LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001a3f: TAI THAM LETTER LOW YA*/
+                                           RTUNI_ALPHA, /* U+001a40: TAI THAM LETTER HIGH YA*/
+                                           RTUNI_ALPHA, /* U+001a41: TAI THAM LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001a42: TAI THAM LETTER RUE*/
+                                           RTUNI_ALPHA, /* U+001a43: TAI THAM LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001a44: TAI THAM LETTER LUE*/
+                                           RTUNI_ALPHA, /* U+001a45: TAI THAM LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001a46: TAI THAM LETTER HIGH SHA*/
+                                           RTUNI_ALPHA, /* U+001a47: TAI THAM LETTER HIGH SSA*/
+                                           RTUNI_ALPHA, /* U+001a48: TAI THAM LETTER HIGH SA*/
+                                           RTUNI_ALPHA, /* U+001a49: TAI THAM LETTER HIGH HA*/
+                                           RTUNI_ALPHA, /* U+001a4a: TAI THAM LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+001a4b: TAI THAM LETTER A*/
+                                           RTUNI_ALPHA, /* U+001a4c: TAI THAM LETTER LOW HA*/
+                                           RTUNI_ALPHA, /* U+001a4d: TAI THAM LETTER I*/
+                                           RTUNI_ALPHA, /* U+001a4e: TAI THAM LETTER II*/
+                                           RTUNI_ALPHA, /* U+001a4f: TAI THAM LETTER U*/
+                                           RTUNI_ALPHA, /* U+001a50: TAI THAM LETTER UU*/
+                                           RTUNI_ALPHA, /* U+001a51: TAI THAM LETTER EE*/
+                                           RTUNI_ALPHA, /* U+001a52: TAI THAM LETTER OO*/
+                                           RTUNI_ALPHA, /* U+001a53: TAI THAM LETTER LAE*/
+                                           RTUNI_ALPHA, /* U+001a54: TAI THAM LETTER GREAT SA*/
+                                           RTUNI_ALPHA, /* U+001a55: TAI THAM CONSONANT SIGN MEDIAL RA*/
+                                           RTUNI_ALPHA, /* U+001a56: TAI THAM CONSONANT SIGN MEDIAL LA*/
+                                           RTUNI_ALPHA, /* U+001a57: TAI THAM CONSONANT SIGN LA TANG LAI*/
+                                           RTUNI_ALPHA, /* U+001a58: TAI THAM SIGN MAI KANG LAI*/
+                                           RTUNI_ALPHA, /* U+001a59: TAI THAM CONSONANT SIGN FINAL NGA*/
+                                           RTUNI_ALPHA, /* U+001a5a: TAI THAM CONSONANT SIGN LOW PA*/
+                                           RTUNI_ALPHA, /* U+001a5b: TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA*/
+                                           RTUNI_ALPHA, /* U+001a5c: TAI THAM CONSONANT SIGN MA*/
+                                           RTUNI_ALPHA, /* U+001a5d: TAI THAM CONSONANT SIGN BA*/
+                                           RTUNI_ALPHA, /* U+001a5e: TAI THAM CONSONANT SIGN SA*/
+                                                     0, /* U+001a5f: */
+                                                     0, /* U+001a60: TAI THAM SIGN SAKOT*/
+                                           RTUNI_ALPHA, /* U+001a61: TAI THAM VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+001a62: TAI THAM VOWEL SIGN MAI SAT*/
+                                           RTUNI_ALPHA, /* U+001a63: TAI THAM VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+001a64: TAI THAM VOWEL SIGN TALL AA*/
+                                           RTUNI_ALPHA, /* U+001a65: TAI THAM VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001a66: TAI THAM VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+001a67: TAI THAM VOWEL SIGN UE*/
+                                           RTUNI_ALPHA, /* U+001a68: TAI THAM VOWEL SIGN UUE*/
+                                           RTUNI_ALPHA, /* U+001a69: TAI THAM VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001a6a: TAI THAM VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+001a6b: TAI THAM VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+001a6c: TAI THAM VOWEL SIGN OA BELOW*/
+                                           RTUNI_ALPHA, /* U+001a6d: TAI THAM VOWEL SIGN OY*/
+                                           RTUNI_ALPHA, /* U+001a6e: TAI THAM VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001a6f: TAI THAM VOWEL SIGN AE*/
+                                           RTUNI_ALPHA, /* U+001a70: TAI THAM VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+001a71: TAI THAM VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+001a72: TAI THAM VOWEL SIGN THAM AI*/
+                                           RTUNI_ALPHA, /* U+001a73: TAI THAM VOWEL SIGN OA ABOVE*/
+                                           RTUNI_ALPHA, /* U+001a74: TAI THAM SIGN MAI KANG*/
+                                                     0, /* U+001a75: TAI THAM SIGN TONE-1*/
+                                                     0, /* U+001a76: TAI THAM SIGN TONE-2*/
+                                                     0, /* U+001a77: TAI THAM SIGN KHUEN TONE-3*/
+                                                     0, /* U+001a78: TAI THAM SIGN KHUEN TONE-4*/
+                                                     0, /* U+001a79: TAI THAM SIGN KHUEN TONE-5*/
+                                                     0, /* U+001a7a: TAI THAM SIGN RA HAAM*/
+                                                     0, /* U+001a7b: TAI THAM SIGN MAI SAM*/
+                                                     0, /* U+001a7c: TAI THAM SIGN KHUEN-LUE KARAN*/
+                                                     0, /* U+001a7d: */
+                                                     0, /* U+001a7e: */
+                                                     0, /* U+001a7f: TAI THAM COMBINING CRYPTOGRAMMIC DOT*/
+                                          RTUNI_DDIGIT, /* U+001a80: TAI THAM HORA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001a81: TAI THAM HORA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001a82: TAI THAM HORA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001a83: TAI THAM HORA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001a84: TAI THAM HORA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001a85: TAI THAM HORA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001a86: TAI THAM HORA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001a87: TAI THAM HORA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001a88: TAI THAM HORA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001a89: TAI THAM HORA DIGIT NINE*/
+                                                     0, /* U+001a8a: */
+                                                     0, /* U+001a8b: */
+                                                     0, /* U+001a8c: */
+                                                     0, /* U+001a8d: */
+                                                     0, /* U+001a8e: */
+                                                     0, /* U+001a8f: */
+                                          RTUNI_DDIGIT, /* U+001a90: TAI THAM THAM DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001a91: TAI THAM THAM DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001a92: TAI THAM THAM DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001a93: TAI THAM THAM DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001a94: TAI THAM THAM DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001a95: TAI THAM THAM DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001a96: TAI THAM THAM DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001a97: TAI THAM THAM DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001a98: TAI THAM THAM DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001a99: TAI THAM THAM DIGIT NINE*/
+                                                     0, /* U+001a9a: */
+                                                     0, /* U+001a9b: */
+                                                     0, /* U+001a9c: */
+                                                     0, /* U+001a9d: */
+                                                     0, /* U+001a9e: */
+                                                     0, /* U+001a9f: */
+                                                     0, /* U+001aa0: TAI THAM SIGN WIANG*/
+                                                     0, /* U+001aa1: TAI THAM SIGN WIANGWAAK*/
+                                                     0, /* U+001aa2: TAI THAM SIGN SAWAN*/
+                                                     0, /* U+001aa3: TAI THAM SIGN KEOW*/
+                                                     0, /* U+001aa4: TAI THAM SIGN HOY*/
+                                                     0, /* U+001aa5: TAI THAM SIGN DOKMAI*/
+                                                     0, /* U+001aa6: TAI THAM SIGN REVERSED ROTATED RANA*/
+                                           RTUNI_ALPHA, /* U+001aa7: TAI THAM SIGN MAI YAMOK*/
+                                                     0, /* U+001aa8: TAI THAM SIGN KAAN*/
+                                                     0, /* U+001aa9: TAI THAM SIGN KAANKUU*/
+                                                     0, /* U+001aaa: TAI THAM SIGN SATKAAN*/
+                                                     0, /* U+001aab: TAI THAM SIGN SATKAANKUU*/
+                                                     0, /* U+001aac: TAI THAM SIGN HANG*/
+                                                     0, /* U+001aad: TAI THAM SIGN CAANG*/
+                                                     0, /* U+001aae: */
+                                                     0, /* U+001aaf: */
+                                                     0, /* U+001ab0: */
+                                                     0, /* U+001ab1: */
+                                                     0, /* U+001ab2: */
+                                                     0, /* U+001ab3: */
+                                                     0, /* U+001ab4: */
+                                                     0, /* U+001ab5: */
+                                                     0, /* U+001ab6: */
+                                                     0, /* U+001ab7: */
+                                                     0, /* U+001ab8: */
+                                                     0, /* U+001ab9: */
+                                                     0, /* U+001aba: */
+                                                     0, /* U+001abb: */
+                                                     0, /* U+001abc: */
+                                                     0, /* U+001abd: */
+                                                     0, /* U+001abe: */
+                                                     0, /* U+001abf: */
+                                                     0, /* U+001ac0: */
+                                                     0, /* U+001ac1: */
+                                                     0, /* U+001ac2: */
+                                                     0, /* U+001ac3: */
+                                                     0, /* U+001ac4: */
+                                                     0, /* U+001ac5: */
+                                                     0, /* U+001ac6: */
+                                                     0, /* U+001ac7: */
+                                                     0, /* U+001ac8: */
+                                                     0, /* U+001ac9: */
+                                                     0, /* U+001aca: */
+                                                     0, /* U+001acb: */
+                                                     0, /* U+001acc: */
+                                                     0, /* U+001acd: */
+                                                     0, /* U+001ace: */
+                                                     0, /* U+001acf: */
+                                                     0, /* U+001ad0: */
+                                                     0, /* U+001ad1: */
+                                                     0, /* U+001ad2: */
+                                                     0, /* U+001ad3: */
+                                                     0, /* U+001ad4: */
+                                                     0, /* U+001ad5: */
+                                                     0, /* U+001ad6: */
+                                                     0, /* U+001ad7: */
+                                                     0, /* U+001ad8: */
+                                                     0, /* U+001ad9: */
+                                                     0, /* U+001ada: */
+                                                     0, /* U+001adb: */
+                                                     0, /* U+001adc: */
+                                                     0, /* U+001add: */
+                                                     0, /* U+001ade: */
+                                                     0, /* U+001adf: */
+                                                     0, /* U+001ae0: */
+                                                     0, /* U+001ae1: */
+                                                     0, /* U+001ae2: */
+                                                     0, /* U+001ae3: */
+                                                     0, /* U+001ae4: */
+                                                     0, /* U+001ae5: */
+                                                     0, /* U+001ae6: */
+                                                     0, /* U+001ae7: */
+                                                     0, /* U+001ae8: */
+                                                     0, /* U+001ae9: */
+                                                     0, /* U+001aea: */
+                                                     0, /* U+001aeb: */
+                                                     0, /* U+001aec: */
+                                                     0, /* U+001aed: */
+                                                     0, /* U+001aee: */
+                                                     0, /* U+001aef: */
+                                                     0, /* U+001af0: */
+                                                     0, /* U+001af1: */
+                                                     0, /* U+001af2: */
+                                                     0, /* U+001af3: */
+                                                     0, /* U+001af4: */
+                                                     0, /* U+001af5: */
+                                                     0, /* U+001af6: */
+                                                     0, /* U+001af7: */
+                                                     0, /* U+001af8: */
+                                                     0, /* U+001af9: */
+                                                     0, /* U+001afa: */
+                                                     0, /* U+001afb: */
+                                                     0, /* U+001afc: */
+                                                     0, /* U+001afd: */
+                                                     0, /* U+001afe: */
+                                                     0, /* U+001aff: */
+                                           RTUNI_ALPHA, /* U+001b00: BALINESE SIGN ULU RICEM*/
+                                           RTUNI_ALPHA, /* U+001b01: BALINESE SIGN ULU CANDRA*/
+                                           RTUNI_ALPHA, /* U+001b02: BALINESE SIGN CECEK*/
+                                           RTUNI_ALPHA, /* U+001b03: BALINESE SIGN SURANG*/
+                                           RTUNI_ALPHA, /* U+001b04: BALINESE SIGN BISAH*/
+                                           RTUNI_ALPHA, /* U+001b05: BALINESE LETTER AKARA*/
+                                           RTUNI_ALPHA, /* U+001b06: BALINESE LETTER AKARA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b07: BALINESE LETTER IKARA*/
+                                           RTUNI_ALPHA, /* U+001b08: BALINESE LETTER IKARA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b09: BALINESE LETTER UKARA*/
+                                           RTUNI_ALPHA, /* U+001b0a: BALINESE LETTER UKARA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b0b: BALINESE LETTER RA REPA*/
+                                           RTUNI_ALPHA, /* U+001b0c: BALINESE LETTER RA REPA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b0d: BALINESE LETTER LA LENGA*/
+                                           RTUNI_ALPHA, /* U+001b0e: BALINESE LETTER LA LENGA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b0f: BALINESE LETTER EKARA*/
+                                           RTUNI_ALPHA, /* U+001b10: BALINESE LETTER AIKARA*/
+                                           RTUNI_ALPHA, /* U+001b11: BALINESE LETTER OKARA*/
+                                           RTUNI_ALPHA, /* U+001b12: BALINESE LETTER OKARA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b13: BALINESE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001b14: BALINESE LETTER KA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+001b15: BALINESE LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001b16: BALINESE LETTER GA GORA*/
+                                           RTUNI_ALPHA, /* U+001b17: BALINESE LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001b18: BALINESE LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001b19: BALINESE LETTER CA LACA*/
+                                           RTUNI_ALPHA, /* U+001b1a: BALINESE LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001b1b: BALINESE LETTER JA JERA*/
+                                           RTUNI_ALPHA, /* U+001b1c: BALINESE LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001b1d: BALINESE LETTER TA LATIK*/
+                                           RTUNI_ALPHA, /* U+001b1e: BALINESE LETTER TA MURDA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+001b1f: BALINESE LETTER DA MURDA ALPAPRANA*/
+                                           RTUNI_ALPHA, /* U+001b20: BALINESE LETTER DA MURDA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+001b21: BALINESE LETTER NA RAMBAT*/
+                                           RTUNI_ALPHA, /* U+001b22: BALINESE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001b23: BALINESE LETTER TA TAWA*/
+                                           RTUNI_ALPHA, /* U+001b24: BALINESE LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001b25: BALINESE LETTER DA MADU*/
+                                           RTUNI_ALPHA, /* U+001b26: BALINESE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001b27: BALINESE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001b28: BALINESE LETTER PA KAPAL*/
+                                           RTUNI_ALPHA, /* U+001b29: BALINESE LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001b2a: BALINESE LETTER BA KEMBANG*/
+                                           RTUNI_ALPHA, /* U+001b2b: BALINESE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001b2c: BALINESE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001b2d: BALINESE LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001b2e: BALINESE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001b2f: BALINESE LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001b30: BALINESE LETTER SA SAGA*/
+                                           RTUNI_ALPHA, /* U+001b31: BALINESE LETTER SA SAPA*/
+                                           RTUNI_ALPHA, /* U+001b32: BALINESE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001b33: BALINESE LETTER HA*/
+                                                     0, /* U+001b34: BALINESE SIGN REREKAN*/
+                                           RTUNI_ALPHA, /* U+001b35: BALINESE VOWEL SIGN TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b36: BALINESE VOWEL SIGN ULU*/
+                                           RTUNI_ALPHA, /* U+001b37: BALINESE VOWEL SIGN ULU SARI*/
+                                           RTUNI_ALPHA, /* U+001b38: BALINESE VOWEL SIGN SUKU*/
+                                           RTUNI_ALPHA, /* U+001b39: BALINESE VOWEL SIGN SUKU ILUT*/
+                                           RTUNI_ALPHA, /* U+001b3a: BALINESE VOWEL SIGN RA REPA*/
+                                           RTUNI_ALPHA, /* U+001b3b: BALINESE VOWEL SIGN RA REPA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b3c: BALINESE VOWEL SIGN LA LENGA*/
+                                           RTUNI_ALPHA, /* U+001b3d: BALINESE VOWEL SIGN LA LENGA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b3e: BALINESE VOWEL SIGN TALING*/
+                                           RTUNI_ALPHA, /* U+001b3f: BALINESE VOWEL SIGN TALING REPA*/
+                                           RTUNI_ALPHA, /* U+001b40: BALINESE VOWEL SIGN TALING TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b41: BALINESE VOWEL SIGN TALING REPA TEDUNG*/
+                                           RTUNI_ALPHA, /* U+001b42: BALINESE VOWEL SIGN PEPET*/
+                                           RTUNI_ALPHA, /* U+001b43: BALINESE VOWEL SIGN PEPET TEDUNG*/
+                                                     0, /* U+001b44: BALINESE ADEG ADEG*/
+                                           RTUNI_ALPHA, /* U+001b45: BALINESE LETTER KAF SASAK*/
+                                           RTUNI_ALPHA, /* U+001b46: BALINESE LETTER KHOT SASAK*/
+                                           RTUNI_ALPHA, /* U+001b47: BALINESE LETTER TZIR SASAK*/
+                                           RTUNI_ALPHA, /* U+001b48: BALINESE LETTER EF SASAK*/
+                                           RTUNI_ALPHA, /* U+001b49: BALINESE LETTER VE SASAK*/
+                                           RTUNI_ALPHA, /* U+001b4a: BALINESE LETTER ZAL SASAK*/
+                                           RTUNI_ALPHA, /* U+001b4b: BALINESE LETTER ASYURA SASAK*/
+                                                     0, /* U+001b4c: */
+                                                     0, /* U+001b4d: */
+                                                     0, /* U+001b4e: */
+                                                     0, /* U+001b4f: */
+                                          RTUNI_DDIGIT, /* U+001b50: BALINESE DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001b51: BALINESE DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001b52: BALINESE DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001b53: BALINESE DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001b54: BALINESE DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001b55: BALINESE DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001b56: BALINESE DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001b57: BALINESE DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001b58: BALINESE DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001b59: BALINESE DIGIT NINE*/
+                                                     0, /* U+001b5a: BALINESE PANTI*/
+                                                     0, /* U+001b5b: BALINESE PAMADA*/
+                                                     0, /* U+001b5c: BALINESE WINDU*/
+                                                     0, /* U+001b5d: BALINESE CARIK PAMUNGKAH*/
+                                                     0, /* U+001b5e: BALINESE CARIK SIKI*/
+                                                     0, /* U+001b5f: BALINESE CARIK PAREREN*/
+                                                     0, /* U+001b60: BALINESE PAMENENG*/
+                                                     0, /* U+001b61: BALINESE MUSICAL SYMBOL DONG*/
+                                                     0, /* U+001b62: BALINESE MUSICAL SYMBOL DENG*/
+                                                     0, /* U+001b63: BALINESE MUSICAL SYMBOL DUNG*/
+                                                     0, /* U+001b64: BALINESE MUSICAL SYMBOL DANG*/
+                                                     0, /* U+001b65: BALINESE MUSICAL SYMBOL DANG SURANG*/
+                                                     0, /* U+001b66: BALINESE MUSICAL SYMBOL DING*/
+                                                     0, /* U+001b67: BALINESE MUSICAL SYMBOL DAENG*/
+                                                     0, /* U+001b68: BALINESE MUSICAL SYMBOL DEUNG*/
+                                                     0, /* U+001b69: BALINESE MUSICAL SYMBOL DAING*/
+                                                     0, /* U+001b6a: BALINESE MUSICAL SYMBOL DANG GEDE*/
+                                                     0, /* U+001b6b: BALINESE MUSICAL SYMBOL COMBINING TEGEH*/
+                                                     0, /* U+001b6c: BALINESE MUSICAL SYMBOL COMBINING ENDEP*/
+                                                     0, /* U+001b6d: BALINESE MUSICAL SYMBOL COMBINING KEMPUL*/
+                                                     0, /* U+001b6e: BALINESE MUSICAL SYMBOL COMBINING KEMPLI*/
+                                                     0, /* U+001b6f: BALINESE MUSICAL SYMBOL COMBINING JEGOGAN*/
+                                                     0, /* U+001b70: BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN*/
+                                                     0, /* U+001b71: BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN*/
+                                                     0, /* U+001b72: BALINESE MUSICAL SYMBOL COMBINING BENDE*/
+                                                     0, /* U+001b73: BALINESE MUSICAL SYMBOL COMBINING GONG*/
+                                                     0, /* U+001b74: BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG*/
+                                                     0, /* U+001b75: BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG*/
+                                                     0, /* U+001b76: BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK*/
+                                                     0, /* U+001b77: BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK*/
+                                                     0, /* U+001b78: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG*/
+                                                     0, /* U+001b79: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG*/
+                                                     0, /* U+001b7a: BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK*/
+                                                     0, /* U+001b7b: BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK*/
+                                                     0, /* U+001b7c: BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING*/
+                                                     0, /* U+001b7d: */
+                                                     0, /* U+001b7e: */
+                                                     0, /* U+001b7f: */
+                                           RTUNI_ALPHA, /* U+001b80: SUNDANESE SIGN PANYECEK*/
+                                           RTUNI_ALPHA, /* U+001b81: SUNDANESE SIGN PANGLAYAR*/
+                                           RTUNI_ALPHA, /* U+001b82: SUNDANESE SIGN PANGWISAD*/
+                                           RTUNI_ALPHA, /* U+001b83: SUNDANESE LETTER A*/
+                                           RTUNI_ALPHA, /* U+001b84: SUNDANESE LETTER I*/
+                                           RTUNI_ALPHA, /* U+001b85: SUNDANESE LETTER U*/
+                                           RTUNI_ALPHA, /* U+001b86: SUNDANESE LETTER AE*/
+                                           RTUNI_ALPHA, /* U+001b87: SUNDANESE LETTER O*/
+                                           RTUNI_ALPHA, /* U+001b88: SUNDANESE LETTER E*/
+                                           RTUNI_ALPHA, /* U+001b89: SUNDANESE LETTER EU*/
+                                           RTUNI_ALPHA, /* U+001b8a: SUNDANESE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001b8b: SUNDANESE LETTER QA*/
+                                           RTUNI_ALPHA, /* U+001b8c: SUNDANESE LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001b8d: SUNDANESE LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001b8e: SUNDANESE LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001b8f: SUNDANESE LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001b90: SUNDANESE LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+001b91: SUNDANESE LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001b92: SUNDANESE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001b93: SUNDANESE LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001b94: SUNDANESE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001b95: SUNDANESE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001b96: SUNDANESE LETTER FA*/
+                                           RTUNI_ALPHA, /* U+001b97: SUNDANESE LETTER VA*/
+                                           RTUNI_ALPHA, /* U+001b98: SUNDANESE LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001b99: SUNDANESE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001b9a: SUNDANESE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001b9b: SUNDANESE LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001b9c: SUNDANESE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001b9d: SUNDANESE LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001b9e: SUNDANESE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001b9f: SUNDANESE LETTER XA*/
+                                           RTUNI_ALPHA, /* U+001ba0: SUNDANESE LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001ba1: SUNDANESE CONSONANT SIGN PAMINGKAL*/
+                                           RTUNI_ALPHA, /* U+001ba2: SUNDANESE CONSONANT SIGN PANYAKRA*/
+                                           RTUNI_ALPHA, /* U+001ba3: SUNDANESE CONSONANT SIGN PANYIKU*/
+                                           RTUNI_ALPHA, /* U+001ba4: SUNDANESE VOWEL SIGN PANGHULU*/
+                                           RTUNI_ALPHA, /* U+001ba5: SUNDANESE VOWEL SIGN PANYUKU*/
+                                           RTUNI_ALPHA, /* U+001ba6: SUNDANESE VOWEL SIGN PANAELAENG*/
+                                           RTUNI_ALPHA, /* U+001ba7: SUNDANESE VOWEL SIGN PANOLONG*/
+                                           RTUNI_ALPHA, /* U+001ba8: SUNDANESE VOWEL SIGN PAMEPET*/
+                                           RTUNI_ALPHA, /* U+001ba9: SUNDANESE VOWEL SIGN PANEULEUNG*/
+                                                     0, /* U+001baa: SUNDANESE SIGN PAMAAEH*/
+                                                     0, /* U+001bab: SUNDANESE SIGN VIRAMA*/
+                                           RTUNI_ALPHA, /* U+001bac: SUNDANESE CONSONANT SIGN PASANGAN MA*/
+                                           RTUNI_ALPHA, /* U+001bad: SUNDANESE CONSONANT SIGN PASANGAN WA*/
+                                           RTUNI_ALPHA, /* U+001bae: SUNDANESE LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001baf: SUNDANESE LETTER SYA*/
+                                          RTUNI_DDIGIT, /* U+001bb0: SUNDANESE DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001bb1: SUNDANESE DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001bb2: SUNDANESE DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001bb3: SUNDANESE DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001bb4: SUNDANESE DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001bb5: SUNDANESE DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001bb6: SUNDANESE DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001bb7: SUNDANESE DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001bb8: SUNDANESE DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001bb9: SUNDANESE DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+001bba: SUNDANESE AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+001bbb: SUNDANESE LETTER REU*/
+                                           RTUNI_ALPHA, /* U+001bbc: SUNDANESE LETTER LEU*/
+                                           RTUNI_ALPHA, /* U+001bbd: SUNDANESE LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+001bbe: SUNDANESE LETTER FINAL K*/
+                                           RTUNI_ALPHA, /* U+001bbf: SUNDANESE LETTER FINAL M*/
+                                           RTUNI_ALPHA, /* U+001bc0: BATAK LETTER A*/
+                                           RTUNI_ALPHA, /* U+001bc1: BATAK LETTER SIMALUNGUN A*/
+                                           RTUNI_ALPHA, /* U+001bc2: BATAK LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001bc3: BATAK LETTER SIMALUNGUN HA*/
+                                           RTUNI_ALPHA, /* U+001bc4: BATAK LETTER MANDAILING HA*/
+                                           RTUNI_ALPHA, /* U+001bc5: BATAK LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001bc6: BATAK LETTER KARO BA*/
+                                           RTUNI_ALPHA, /* U+001bc7: BATAK LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001bc8: BATAK LETTER SIMALUNGUN PA*/
+                                           RTUNI_ALPHA, /* U+001bc9: BATAK LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001bca: BATAK LETTER MANDAILING NA*/
+                                           RTUNI_ALPHA, /* U+001bcb: BATAK LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001bcc: BATAK LETTER SIMALUNGUN WA*/
+                                           RTUNI_ALPHA, /* U+001bcd: BATAK LETTER PAKPAK WA*/
+                                           RTUNI_ALPHA, /* U+001bce: BATAK LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001bcf: BATAK LETTER SIMALUNGUN GA*/
+                                           RTUNI_ALPHA, /* U+001bd0: BATAK LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001bd1: BATAK LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001bd2: BATAK LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001bd3: BATAK LETTER SIMALUNGUN RA*/
+                                           RTUNI_ALPHA, /* U+001bd4: BATAK LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001bd5: BATAK LETTER SIMALUNGUN MA*/
+                                           RTUNI_ALPHA, /* U+001bd6: BATAK LETTER SOUTHERN TA*/
+                                           RTUNI_ALPHA, /* U+001bd7: BATAK LETTER NORTHERN TA*/
+                                           RTUNI_ALPHA, /* U+001bd8: BATAK LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001bd9: BATAK LETTER SIMALUNGUN SA*/
+                                           RTUNI_ALPHA, /* U+001bda: BATAK LETTER MANDAILING SA*/
+                                           RTUNI_ALPHA, /* U+001bdb: BATAK LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001bdc: BATAK LETTER SIMALUNGUN YA*/
+                                           RTUNI_ALPHA, /* U+001bdd: BATAK LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001bde: BATAK LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001bdf: BATAK LETTER SIMALUNGUN LA*/
+                                           RTUNI_ALPHA, /* U+001be0: BATAK LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001be1: BATAK LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001be2: BATAK LETTER NDA*/
+                                           RTUNI_ALPHA, /* U+001be3: BATAK LETTER MBA*/
+                                           RTUNI_ALPHA, /* U+001be4: BATAK LETTER I*/
+                                           RTUNI_ALPHA, /* U+001be5: BATAK LETTER U*/
+                                                     0, /* U+001be6: BATAK SIGN TOMPI*/
+                                           RTUNI_ALPHA, /* U+001be7: BATAK VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001be8: BATAK VOWEL SIGN PAKPAK E*/
+                                           RTUNI_ALPHA, /* U+001be9: BATAK VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+001bea: BATAK VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001beb: BATAK VOWEL SIGN KARO I*/
+                                           RTUNI_ALPHA, /* U+001bec: BATAK VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+001bed: BATAK VOWEL SIGN KARO O*/
+                                           RTUNI_ALPHA, /* U+001bee: BATAK VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001bef: BATAK VOWEL SIGN U FOR SIMALUNGUN SA*/
+                                           RTUNI_ALPHA, /* U+001bf0: BATAK CONSONANT SIGN NG*/
+                                           RTUNI_ALPHA, /* U+001bf1: BATAK CONSONANT SIGN H*/
+                                                     0, /* U+001bf2: BATAK PANGOLAT*/
+                                                     0, /* U+001bf3: BATAK PANONGONAN*/
+                                                     0, /* U+001bf4: */
+                                                     0, /* U+001bf5: */
+                                                     0, /* U+001bf6: */
+                                                     0, /* U+001bf7: */
+                                                     0, /* U+001bf8: */
+                                                     0, /* U+001bf9: */
+                                                     0, /* U+001bfa: */
+                                                     0, /* U+001bfb: */
+                                                     0, /* U+001bfc: BATAK SYMBOL BINDU NA METEK*/
+                                                     0, /* U+001bfd: BATAK SYMBOL BINDU PINARBORAS*/
+                                                     0, /* U+001bfe: BATAK SYMBOL BINDU JUDUL*/
+                                                     0, /* U+001bff: BATAK SYMBOL BINDU PANGOLAT*/
+                                           RTUNI_ALPHA, /* U+001c00: LEPCHA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+001c01: LEPCHA LETTER KLA*/
+                                           RTUNI_ALPHA, /* U+001c02: LEPCHA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+001c03: LEPCHA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+001c04: LEPCHA LETTER GLA*/
+                                           RTUNI_ALPHA, /* U+001c05: LEPCHA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+001c06: LEPCHA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+001c07: LEPCHA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+001c08: LEPCHA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+001c09: LEPCHA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+001c0a: LEPCHA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+001c0b: LEPCHA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+001c0c: LEPCHA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+001c0d: LEPCHA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+001c0e: LEPCHA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+001c0f: LEPCHA LETTER PLA*/
+                                           RTUNI_ALPHA, /* U+001c10: LEPCHA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+001c11: LEPCHA LETTER FA*/
+                                           RTUNI_ALPHA, /* U+001c12: LEPCHA LETTER FLA*/
+                                           RTUNI_ALPHA, /* U+001c13: LEPCHA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+001c14: LEPCHA LETTER BLA*/
+                                           RTUNI_ALPHA, /* U+001c15: LEPCHA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+001c16: LEPCHA LETTER MLA*/
+                                           RTUNI_ALPHA, /* U+001c17: LEPCHA LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+001c18: LEPCHA LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+001c19: LEPCHA LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+001c1a: LEPCHA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001c1b: LEPCHA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001c1c: LEPCHA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001c1d: LEPCHA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+001c1e: LEPCHA LETTER HLA*/
+                                           RTUNI_ALPHA, /* U+001c1f: LEPCHA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+001c20: LEPCHA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+001c21: LEPCHA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+001c22: LEPCHA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+001c23: LEPCHA LETTER A*/
+                                           RTUNI_ALPHA, /* U+001c24: LEPCHA SUBJOINED LETTER YA*/
+                                           RTUNI_ALPHA, /* U+001c25: LEPCHA SUBJOINED LETTER RA*/
+                                           RTUNI_ALPHA, /* U+001c26: LEPCHA VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+001c27: LEPCHA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+001c28: LEPCHA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+001c29: LEPCHA VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+001c2a: LEPCHA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+001c2b: LEPCHA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+001c2c: LEPCHA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+001c2d: LEPCHA CONSONANT SIGN K*/
+                                           RTUNI_ALPHA, /* U+001c2e: LEPCHA CONSONANT SIGN M*/
+                                           RTUNI_ALPHA, /* U+001c2f: LEPCHA CONSONANT SIGN L*/
+                                           RTUNI_ALPHA, /* U+001c30: LEPCHA CONSONANT SIGN N*/
+                                           RTUNI_ALPHA, /* U+001c31: LEPCHA CONSONANT SIGN P*/
+                                           RTUNI_ALPHA, /* U+001c32: LEPCHA CONSONANT SIGN R*/
+                                           RTUNI_ALPHA, /* U+001c33: LEPCHA CONSONANT SIGN T*/
+                                           RTUNI_ALPHA, /* U+001c34: LEPCHA CONSONANT SIGN NYIN-DO*/
+                                           RTUNI_ALPHA, /* U+001c35: LEPCHA CONSONANT SIGN KANG*/
+                                                     0, /* U+001c36: LEPCHA SIGN RAN*/
+                                                     0, /* U+001c37: LEPCHA SIGN NUKTA*/
+                                                     0, /* U+001c38: */
+                                                     0, /* U+001c39: */
+                                                     0, /* U+001c3a: */
+                                                     0, /* U+001c3b: LEPCHA PUNCTUATION TA-ROL*/
+                                                     0, /* U+001c3c: LEPCHA PUNCTUATION NYET THYOOM TA-ROL*/
+                                                     0, /* U+001c3d: LEPCHA PUNCTUATION CER-WA*/
+                                                     0, /* U+001c3e: LEPCHA PUNCTUATION TSHOOK CER-WA*/
+                                                     0, /* U+001c3f: LEPCHA PUNCTUATION TSHOOK*/
+                                          RTUNI_DDIGIT, /* U+001c40: LEPCHA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001c41: LEPCHA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001c42: LEPCHA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001c43: LEPCHA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001c44: LEPCHA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001c45: LEPCHA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001c46: LEPCHA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001c47: LEPCHA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001c48: LEPCHA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001c49: LEPCHA DIGIT NINE*/
+                                                     0, /* U+001c4a: */
+                                                     0, /* U+001c4b: */
+                                                     0, /* U+001c4c: */
+                                           RTUNI_ALPHA, /* U+001c4d: LEPCHA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+001c4e: LEPCHA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+001c4f: LEPCHA LETTER DDA*/
+                                          RTUNI_DDIGIT, /* U+001c50: OL CHIKI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+001c51: OL CHIKI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+001c52: OL CHIKI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+001c53: OL CHIKI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+001c54: OL CHIKI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+001c55: OL CHIKI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+001c56: OL CHIKI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+001c57: OL CHIKI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+001c58: OL CHIKI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+001c59: OL CHIKI DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+001c5a: OL CHIKI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+001c5b: OL CHIKI LETTER AT*/
+                                           RTUNI_ALPHA, /* U+001c5c: OL CHIKI LETTER AG*/
+                                           RTUNI_ALPHA, /* U+001c5d: OL CHIKI LETTER ANG*/
+                                           RTUNI_ALPHA, /* U+001c5e: OL CHIKI LETTER AL*/
+                                           RTUNI_ALPHA, /* U+001c5f: OL CHIKI LETTER LAA*/
+                                           RTUNI_ALPHA, /* U+001c60: OL CHIKI LETTER AAK*/
+                                           RTUNI_ALPHA, /* U+001c61: OL CHIKI LETTER AAJ*/
+                                           RTUNI_ALPHA, /* U+001c62: OL CHIKI LETTER AAM*/
+                                           RTUNI_ALPHA, /* U+001c63: OL CHIKI LETTER AAW*/
+                                           RTUNI_ALPHA, /* U+001c64: OL CHIKI LETTER LI*/
+                                           RTUNI_ALPHA, /* U+001c65: OL CHIKI LETTER IS*/
+                                           RTUNI_ALPHA, /* U+001c66: OL CHIKI LETTER IH*/
+                                           RTUNI_ALPHA, /* U+001c67: OL CHIKI LETTER INY*/
+                                           RTUNI_ALPHA, /* U+001c68: OL CHIKI LETTER IR*/
+                                           RTUNI_ALPHA, /* U+001c69: OL CHIKI LETTER LU*/
+                                           RTUNI_ALPHA, /* U+001c6a: OL CHIKI LETTER UC*/
+                                           RTUNI_ALPHA, /* U+001c6b: OL CHIKI LETTER UD*/
+                                           RTUNI_ALPHA, /* U+001c6c: OL CHIKI LETTER UNN*/
+                                           RTUNI_ALPHA, /* U+001c6d: OL CHIKI LETTER UY*/
+                                           RTUNI_ALPHA, /* U+001c6e: OL CHIKI LETTER LE*/
+                                           RTUNI_ALPHA, /* U+001c6f: OL CHIKI LETTER EP*/
+                                           RTUNI_ALPHA, /* U+001c70: OL CHIKI LETTER EDD*/
+                                           RTUNI_ALPHA, /* U+001c71: OL CHIKI LETTER EN*/
+                                           RTUNI_ALPHA, /* U+001c72: OL CHIKI LETTER ERR*/
+                                           RTUNI_ALPHA, /* U+001c73: OL CHIKI LETTER LO*/
+                                           RTUNI_ALPHA, /* U+001c74: OL CHIKI LETTER OTT*/
+                                           RTUNI_ALPHA, /* U+001c75: OL CHIKI LETTER OB*/
+                                           RTUNI_ALPHA, /* U+001c76: OL CHIKI LETTER OV*/
+                                           RTUNI_ALPHA, /* U+001c77: OL CHIKI LETTER OH*/
+                                           RTUNI_ALPHA, /* U+001c78: OL CHIKI MU TTUDDAG*/
+                                           RTUNI_ALPHA, /* U+001c79: OL CHIKI GAAHLAA TTUDDAAG*/
+                                           RTUNI_ALPHA, /* U+001c7a: OL CHIKI MU-GAAHLAA TTUDDAAG*/
+                                           RTUNI_ALPHA, /* U+001c7b: OL CHIKI RELAA*/
+                                           RTUNI_ALPHA, /* U+001c7c: OL CHIKI PHAARKAA*/
+                                           RTUNI_ALPHA, /* U+001c7d: OL CHIKI AHAD*/
+                                                     0, /* U+001c7e: OL CHIKI PUNCTUATION MUCAAD*/
+                                                     0, /* U+001c7f: OL CHIKI PUNCTUATION DOUBLE MUCAAD*/
+                                                     0, /* U+001c80: */
+                                                     0, /* U+001c81: */
+                                                     0, /* U+001c82: */
+                                                     0, /* U+001c83: */
+                                                     0, /* U+001c84: */
+                                                     0, /* U+001c85: */
+                                                     0, /* U+001c86: */
+                                                     0, /* U+001c87: */
+                                                     0, /* U+001c88: */
+                                                     0, /* U+001c89: */
+                                                     0, /* U+001c8a: */
+                                                     0, /* U+001c8b: */
+                                                     0, /* U+001c8c: */
+                                                     0, /* U+001c8d: */
+                                                     0, /* U+001c8e: */
+                                                     0, /* U+001c8f: */
+                                                     0, /* U+001c90: */
+                                                     0, /* U+001c91: */
+                                                     0, /* U+001c92: */
+                                                     0, /* U+001c93: */
+                                                     0, /* U+001c94: */
+                                                     0, /* U+001c95: */
+                                                     0, /* U+001c96: */
+                                                     0, /* U+001c97: */
+                                                     0, /* U+001c98: */
+                                                     0, /* U+001c99: */
+                                                     0, /* U+001c9a: */
+                                                     0, /* U+001c9b: */
+                                                     0, /* U+001c9c: */
+                                                     0, /* U+001c9d: */
+                                                     0, /* U+001c9e: */
+                                                     0, /* U+001c9f: */
+                                                     0, /* U+001ca0: */
+                                                     0, /* U+001ca1: */
+                                                     0, /* U+001ca2: */
+                                                     0, /* U+001ca3: */
+                                                     0, /* U+001ca4: */
+                                                     0, /* U+001ca5: */
+                                                     0, /* U+001ca6: */
+                                                     0, /* U+001ca7: */
+                                                     0, /* U+001ca8: */
+                                                     0, /* U+001ca9: */
+                                                     0, /* U+001caa: */
+                                                     0, /* U+001cab: */
+                                                     0, /* U+001cac: */
+                                                     0, /* U+001cad: */
+                                                     0, /* U+001cae: */
+                                                     0, /* U+001caf: */
+                                                     0, /* U+001cb0: */
+                                                     0, /* U+001cb1: */
+                                                     0, /* U+001cb2: */
+                                                     0, /* U+001cb3: */
+                                                     0, /* U+001cb4: */
+                                                     0, /* U+001cb5: */
+                                                     0, /* U+001cb6: */
+                                                     0, /* U+001cb7: */
+                                                     0, /* U+001cb8: */
+                                                     0, /* U+001cb9: */
+                                                     0, /* U+001cba: */
+                                                     0, /* U+001cbb: */
+                                                     0, /* U+001cbc: */
+                                                     0, /* U+001cbd: */
+                                                     0, /* U+001cbe: */
+                                                     0, /* U+001cbf: */
+                                                     0, /* U+001cc0: SUNDANESE PUNCTUATION BINDU SURYA*/
+                                                     0, /* U+001cc1: SUNDANESE PUNCTUATION BINDU PANGLONG*/
+                                                     0, /* U+001cc2: SUNDANESE PUNCTUATION BINDU PURNAMA*/
+                                                     0, /* U+001cc3: SUNDANESE PUNCTUATION BINDU CAKRA*/
+                                                     0, /* U+001cc4: SUNDANESE PUNCTUATION BINDU LEU SATANGA*/
+                                                     0, /* U+001cc5: SUNDANESE PUNCTUATION BINDU KA SATANGA*/
+                                                     0, /* U+001cc6: SUNDANESE PUNCTUATION BINDU DA SATANGA*/
+                                                     0, /* U+001cc7: SUNDANESE PUNCTUATION BINDU BA SATANGA*/
+                                                     0, /* U+001cc8: */
+                                                     0, /* U+001cc9: */
+                                                     0, /* U+001cca: */
+                                                     0, /* U+001ccb: */
+                                                     0, /* U+001ccc: */
+                                                     0, /* U+001ccd: */
+                                                     0, /* U+001cce: */
+                                                     0, /* U+001ccf: */
+                                                     0, /* U+001cd0: VEDIC TONE KARSHANA*/
+                                                     0, /* U+001cd1: VEDIC TONE SHARA*/
+                                                     0, /* U+001cd2: VEDIC TONE PRENKHA*/
+                                                     0, /* U+001cd3: VEDIC SIGN NIHSHVASA*/
+                                                     0, /* U+001cd4: VEDIC SIGN YAJURVEDIC MIDLINE SVARITA*/
+                                                     0, /* U+001cd5: VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA*/
+                                                     0, /* U+001cd6: VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA*/
+                                                     0, /* U+001cd7: VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA*/
+                                                     0, /* U+001cd8: VEDIC TONE CANDRA BELOW*/
+                                                     0, /* U+001cd9: VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER*/
+                                                     0, /* U+001cda: VEDIC TONE DOUBLE SVARITA*/
+                                                     0, /* U+001cdb: VEDIC TONE TRIPLE SVARITA*/
+                                                     0, /* U+001cdc: VEDIC TONE KATHAKA ANUDATTA*/
+                                                     0, /* U+001cdd: VEDIC TONE DOT BELOW*/
+                                                     0, /* U+001cde: VEDIC TONE TWO DOTS BELOW*/
+                                                     0, /* U+001cdf: VEDIC TONE THREE DOTS BELOW*/
+                                                     0, /* U+001ce0: VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA*/
+                                                     0, /* U+001ce1: VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA*/
+                                                     0, /* U+001ce2: VEDIC SIGN VISARGA SVARITA*/
+                                                     0, /* U+001ce3: VEDIC SIGN VISARGA UDATTA*/
+                                                     0, /* U+001ce4: VEDIC SIGN REVERSED VISARGA UDATTA*/
+                                                     0, /* U+001ce5: VEDIC SIGN VISARGA ANUDATTA*/
+                                                     0, /* U+001ce6: VEDIC SIGN REVERSED VISARGA ANUDATTA*/
+                                                     0, /* U+001ce7: VEDIC SIGN VISARGA UDATTA WITH TAIL*/
+                                                     0, /* U+001ce8: VEDIC SIGN VISARGA ANUDATTA WITH TAIL*/
+                                           RTUNI_ALPHA, /* U+001ce9: VEDIC SIGN ANUSVARA ANTARGOMUKHA*/
+                                           RTUNI_ALPHA, /* U+001cea: VEDIC SIGN ANUSVARA BAHIRGOMUKHA*/
+                                           RTUNI_ALPHA, /* U+001ceb: VEDIC SIGN ANUSVARA VAMAGOMUKHA*/
+                                           RTUNI_ALPHA, /* U+001cec: VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL*/
+                                                     0, /* U+001ced: VEDIC SIGN TIRYAK*/
+                                           RTUNI_ALPHA, /* U+001cee: VEDIC SIGN HEXIFORM LONG ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+001cef: VEDIC SIGN LONG ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+001cf0: VEDIC SIGN RTHANG LONG ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+001cf1: VEDIC SIGN ANUSVARA UBHAYATO MUKHA*/
+                                           RTUNI_ALPHA, /* U+001cf2: VEDIC SIGN ARDHAVISARGA*/
+                                           RTUNI_ALPHA, /* U+001cf3: VEDIC SIGN ROTATED ARDHAVISARGA*/
+                                                     0, /* U+001cf4: VEDIC TONE CANDRA ABOVE*/
+                                           RTUNI_ALPHA, /* U+001cf5: VEDIC SIGN JIHVAMULIYA*/
+                                           RTUNI_ALPHA, /* U+001cf6: VEDIC SIGN UPADHMANIYA*/
+                                                     0, /* U+001cf7: */
+                                                     0, /* U+001cf8: */
+                                                     0, /* U+001cf9: */
+                                                     0, /* U+001cfa: */
+                                                     0, /* U+001cfb: */
+                                                     0, /* U+001cfc: */
+                                                     0, /* U+001cfd: */
+                                                     0, /* U+001cfe: */
+                                                     0, /* U+001cff: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d00: LATIN LETTER SMALL CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d01: LATIN LETTER SMALL CAPITAL AE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d02: LATIN SMALL LETTER TURNED AE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d03: LATIN LETTER SMALL CAPITAL BARRED B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d04: LATIN LETTER SMALL CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d05: LATIN LETTER SMALL CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d06: LATIN LETTER SMALL CAPITAL ETH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d07: LATIN LETTER SMALL CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d08: LATIN SMALL LETTER TURNED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d09: LATIN SMALL LETTER TURNED I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0a: LATIN LETTER SMALL CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0b: LATIN LETTER SMALL CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0c: LATIN LETTER SMALL CAPITAL L WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0d: LATIN LETTER SMALL CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0e: LATIN LETTER SMALL CAPITAL REVERSED N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0f: LATIN LETTER SMALL CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d10: LATIN LETTER SMALL CAPITAL OPEN O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d11: LATIN SMALL LETTER SIDEWAYS O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d12: LATIN SMALL LETTER SIDEWAYS OPEN O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d13: LATIN SMALL LETTER SIDEWAYS O WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d14: LATIN SMALL LETTER TURNED OE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d15: LATIN LETTER SMALL CAPITAL OU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d16: LATIN SMALL LETTER TOP HALF O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d17: LATIN SMALL LETTER BOTTOM HALF O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d18: LATIN LETTER SMALL CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d19: LATIN LETTER SMALL CAPITAL REVERSED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1a: LATIN LETTER SMALL CAPITAL TURNED R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1b: LATIN LETTER SMALL CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1c: LATIN LETTER SMALL CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1d: LATIN SMALL LETTER SIDEWAYS U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1e: LATIN SMALL LETTER SIDEWAYS DIAERESIZED U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1f: LATIN SMALL LETTER SIDEWAYS TURNED M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d20: LATIN LETTER SMALL CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d21: LATIN LETTER SMALL CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d22: LATIN LETTER SMALL CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d23: LATIN LETTER SMALL CAPITAL EZH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d24: LATIN LETTER VOICED LARYNGEAL SPIRANT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d25: LATIN LETTER AIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d26: GREEK LETTER SMALL CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d27: GREEK LETTER SMALL CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d28: GREEK LETTER SMALL CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d29: GREEK LETTER SMALL CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2a: GREEK LETTER SMALL CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2b: CYRILLIC LETTER SMALL CAPITAL EL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2c: MODIFIER LETTER CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2d: MODIFIER LETTER CAPITAL AE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2e: MODIFIER LETTER CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2f: MODIFIER LETTER CAPITAL BARRED B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d30: MODIFIER LETTER CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d31: MODIFIER LETTER CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d32: MODIFIER LETTER CAPITAL REVERSED E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d33: MODIFIER LETTER CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d34: MODIFIER LETTER CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d35: MODIFIER LETTER CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d36: MODIFIER LETTER CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d37: MODIFIER LETTER CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d38: MODIFIER LETTER CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d39: MODIFIER LETTER CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3a: MODIFIER LETTER CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3b: MODIFIER LETTER CAPITAL REVERSED N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3c: MODIFIER LETTER CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3d: MODIFIER LETTER CAPITAL OU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3e: MODIFIER LETTER CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3f: MODIFIER LETTER CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d40: MODIFIER LETTER CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d41: MODIFIER LETTER CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d42: MODIFIER LETTER CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d43: MODIFIER LETTER SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d44: MODIFIER LETTER SMALL TURNED A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d45: MODIFIER LETTER SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d46: MODIFIER LETTER SMALL TURNED AE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d47: MODIFIER LETTER SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d48: MODIFIER LETTER SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d49: MODIFIER LETTER SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4a: MODIFIER LETTER SMALL SCHWA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4b: MODIFIER LETTER SMALL OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4c: MODIFIER LETTER SMALL TURNED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4d: MODIFIER LETTER SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4e: MODIFIER LETTER SMALL TURNED I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4f: MODIFIER LETTER SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d50: MODIFIER LETTER SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d51: MODIFIER LETTER SMALL ENG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d52: MODIFIER LETTER SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d53: MODIFIER LETTER SMALL OPEN O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d54: MODIFIER LETTER SMALL TOP HALF O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d55: MODIFIER LETTER SMALL BOTTOM HALF O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d56: MODIFIER LETTER SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d57: MODIFIER LETTER SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d58: MODIFIER LETTER SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d59: MODIFIER LETTER SMALL SIDEWAYS U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5a: MODIFIER LETTER SMALL TURNED M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5b: MODIFIER LETTER SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5c: MODIFIER LETTER SMALL AIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5d: MODIFIER LETTER SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5e: MODIFIER LETTER SMALL GREEK GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5f: MODIFIER LETTER SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d60: MODIFIER LETTER SMALL GREEK PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d61: MODIFIER LETTER SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d62: LATIN SUBSCRIPT SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d63: LATIN SUBSCRIPT SMALL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d64: LATIN SUBSCRIPT SMALL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d65: LATIN SUBSCRIPT SMALL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d66: GREEK SUBSCRIPT SMALL LETTER BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d67: GREEK SUBSCRIPT SMALL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d68: GREEK SUBSCRIPT SMALL LETTER RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d69: GREEK SUBSCRIPT SMALL LETTER PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6a: GREEK SUBSCRIPT SMALL LETTER CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6b: LATIN SMALL LETTER UE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6c: LATIN SMALL LETTER B WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6d: LATIN SMALL LETTER D WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6e: LATIN SMALL LETTER F WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6f: LATIN SMALL LETTER M WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d70: LATIN SMALL LETTER N WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d71: LATIN SMALL LETTER P WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d72: LATIN SMALL LETTER R WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d73: LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d74: LATIN SMALL LETTER S WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d75: LATIN SMALL LETTER T WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d76: LATIN SMALL LETTER Z WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d77: LATIN SMALL LETTER TURNED G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d78: MODIFIER LETTER CYRILLIC EN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9c: MODIFIER LETTER SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da0: MODIFIER LETTER SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db2: MODIFIER LETTER SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db4: MODIFIER LETTER SMALL ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbb: MODIFIER LETTER SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
+                                                     0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
+                                                     0, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
+                                                     0, /* U+001dc2: COMBINING SNAKE BELOW*/
+                                                     0, /* U+001dc3: COMBINING SUSPENSION MARK*/
+                                                     0, /* U+001dc4: COMBINING MACRON-ACUTE*/
+                                                     0, /* U+001dc5: COMBINING GRAVE-MACRON*/
+                                                     0, /* U+001dc6: COMBINING MACRON-GRAVE*/
+                                                     0, /* U+001dc7: COMBINING ACUTE-MACRON*/
+                                                     0, /* U+001dc8: COMBINING GRAVE-ACUTE-GRAVE*/
+                                                     0, /* U+001dc9: COMBINING ACUTE-GRAVE-ACUTE*/
+                                                     0, /* U+001dca: COMBINING LATIN SMALL LETTER R BELOW*/
+                                                     0, /* U+001dcb: COMBINING BREVE-MACRON*/
+                                                     0, /* U+001dcc: COMBINING MACRON-BREVE*/
+                                                     0, /* U+001dcd: COMBINING DOUBLE CIRCUMFLEX ABOVE*/
+                                                     0, /* U+001dce: COMBINING OGONEK ABOVE*/
+                                                     0, /* U+001dcf: COMBINING ZIGZAG BELOW*/
+                                                     0, /* U+001dd0: COMBINING IS BELOW*/
+                                                     0, /* U+001dd1: COMBINING UR ABOVE*/
+                                                     0, /* U+001dd2: COMBINING US ABOVE*/
+                                                     0, /* U+001dd3: COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE*/
+                                                     0, /* U+001dd4: COMBINING LATIN SMALL LETTER AE*/
+                                                     0, /* U+001dd5: COMBINING LATIN SMALL LETTER AO*/
+                                                     0, /* U+001dd6: COMBINING LATIN SMALL LETTER AV*/
+                                                     0, /* U+001dd7: COMBINING LATIN SMALL LETTER C CEDILLA*/
+                                                     0, /* U+001dd8: COMBINING LATIN SMALL LETTER INSULAR D*/
+                                                     0, /* U+001dd9: COMBINING LATIN SMALL LETTER ETH*/
+                                                     0, /* U+001dda: COMBINING LATIN SMALL LETTER G*/
+                                                     0, /* U+001ddb: COMBINING LATIN LETTER SMALL CAPITAL G*/
+                                                     0, /* U+001ddc: COMBINING LATIN SMALL LETTER K*/
+                                                     0, /* U+001ddd: COMBINING LATIN SMALL LETTER L*/
+                                                     0, /* U+001dde: COMBINING LATIN LETTER SMALL CAPITAL L*/
+                                                     0, /* U+001ddf: COMBINING LATIN LETTER SMALL CAPITAL M*/
+                                                     0, /* U+001de0: COMBINING LATIN SMALL LETTER N*/
+                                                     0, /* U+001de1: COMBINING LATIN LETTER SMALL CAPITAL N*/
+                                                     0, /* U+001de2: COMBINING LATIN LETTER SMALL CAPITAL R*/
+                                                     0, /* U+001de3: COMBINING LATIN SMALL LETTER R ROTUNDA*/
+                                                     0, /* U+001de4: COMBINING LATIN SMALL LETTER S*/
+                                                     0, /* U+001de5: COMBINING LATIN SMALL LETTER LONG S*/
+                                                     0, /* U+001de6: COMBINING LATIN SMALL LETTER Z*/
+                                                     0, /* U+001de7: */
+                                                     0, /* U+001de8: */
+                                                     0, /* U+001de9: */
+                                                     0, /* U+001dea: */
+                                                     0, /* U+001deb: */
+                                                     0, /* U+001dec: */
+                                                     0, /* U+001ded: */
+                                                     0, /* U+001dee: */
+                                                     0, /* U+001def: */
+                                                     0, /* U+001df0: */
+                                                     0, /* U+001df1: */
+                                                     0, /* U+001df2: */
+                                                     0, /* U+001df3: */
+                                                     0, /* U+001df4: */
+                                                     0, /* U+001df5: */
+                                                     0, /* U+001df6: */
+                                                     0, /* U+001df7: */
+                                                     0, /* U+001df8: */
+                                                     0, /* U+001df9: */
+                                                     0, /* U+001dfa: */
+                                                     0, /* U+001dfb: */
+                                                     0, /* U+001dfc: COMBINING DOUBLE INVERTED BREVE BELOW*/
+                                                     0, /* U+001dfd: COMBINING ALMOST EQUAL TO BELOW*/
+                                                     0, /* U+001dfe: COMBINING LEFT ARROWHEAD ABOVE*/
+                                                     0, /* U+001dff: COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+                                                     0, /* U+001f16: */
+                                                     0, /* U+001f17: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+                                                     0, /* U+001f1e: */
+                                                     0, /* U+001f1f: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+                                                     0, /* U+001f46: */
+                                                     0, /* U+001f47: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+                                                     0, /* U+001f4e: */
+                                                     0, /* U+001f4f: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+                                                     0, /* U+001f58: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+                                                     0, /* U+001f5a: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+                                                     0, /* U+001f5c: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+                                                     0, /* U+001f5e: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+                                                     0, /* U+001f7e: */
+                                                     0, /* U+001f7f: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+                                           RTUNI_ALPHA, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+                                                     0, /* U+001fb5: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+                                           RTUNI_ALPHA, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+                                                     0, /* U+001fbd: GREEK KORONIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+                                                     0, /* U+001fbf: GREEK PSILI*/
+                                                     0, /* U+001fc0: GREEK PERISPOMENI*/
+                                                     0, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+                                                     0, /* U+001fc5: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+                                           RTUNI_ALPHA, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+                                                     0, /* U+001fcd: GREEK PSILI AND VARIA*/
+                                                     0, /* U+001fce: GREEK PSILI AND OXIA*/
+                                                     0, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+                                                     0, /* U+001fd4: */
+                                                     0, /* U+001fd5: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+                                                     0, /* U+001fdc: */
+                                                     0, /* U+001fdd: GREEK DASIA AND VARIA*/
+                                                     0, /* U+001fde: GREEK DASIA AND OXIA*/
+                                                     0, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+                                                     0, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+                                                     0, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+                                                     0, /* U+001fef: GREEK VARIA*/
+                                                     0, /* U+001ff0: */
+                                                     0, /* U+001ff1: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+                                                     0, /* U+001ff5: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+                                           RTUNI_ALPHA, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+                                                     0, /* U+001ffd: GREEK OXIA*/
+                                                     0, /* U+001ffe: GREEK DASIA*/
+                                                     0, /* U+001fff: */
+                                          RTUNI_WSPACE, /* U+002000: EN QUAD*/
+                                          RTUNI_WSPACE, /* U+002001: EM QUAD*/
+                                          RTUNI_WSPACE, /* U+002002: EN SPACE*/
+                                          RTUNI_WSPACE, /* U+002003: EM SPACE*/
+                                          RTUNI_WSPACE, /* U+002004: THREE-PER-EM SPACE*/
+                                          RTUNI_WSPACE, /* U+002005: FOUR-PER-EM SPACE*/
+                                          RTUNI_WSPACE, /* U+002006: SIX-PER-EM SPACE*/
+                                          RTUNI_WSPACE, /* U+002007: FIGURE SPACE*/
+                                          RTUNI_WSPACE, /* U+002008: PUNCTUATION SPACE*/
+                                          RTUNI_WSPACE, /* U+002009: THIN SPACE*/
+                                          RTUNI_WSPACE, /* U+00200a: HAIR SPACE*/
+                                                     0, /* U+00200b: ZERO WIDTH SPACE*/
+                                                     0, /* U+00200c: ZERO WIDTH NON-JOINER*/
+                                                     0, /* U+00200d: ZERO WIDTH JOINER*/
+                                                     0, /* U+00200e: LEFT-TO-RIGHT MARK*/
+                                                     0, /* U+00200f: RIGHT-TO-LEFT MARK*/
+                                                     0, /* U+002010: HYPHEN*/
+                                                     0, /* U+002011: NON-BREAKING HYPHEN*/
+                                                     0, /* U+002012: FIGURE DASH*/
+                                                     0, /* U+002013: EN DASH*/
+                                                     0, /* U+002014: EM DASH*/
+                                                     0, /* U+002015: HORIZONTAL BAR*/
+                                                     0, /* U+002016: DOUBLE VERTICAL LINE*/
+                                                     0, /* U+002017: DOUBLE LOW LINE*/
+                                                     0, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+                                                     0, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+                                                     0, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+                                                     0, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+                                                     0, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+                                                     0, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+                                                     0, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+                                                     0, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+                                                     0, /* U+002020: DAGGER*/
+                                                     0, /* U+002021: DOUBLE DAGGER*/
+                                                     0, /* U+002022: BULLET*/
+                                                     0, /* U+002023: TRIANGULAR BULLET*/
+                                                     0, /* U+002024: ONE DOT LEADER*/
+                                                     0, /* U+002025: TWO DOT LEADER*/
+                                                     0, /* U+002026: HORIZONTAL ELLIPSIS*/
+                                                     0, /* U+002027: HYPHENATION POINT*/
+                                          RTUNI_WSPACE, /* U+002028: LINE SEPARATOR*/
+                                          RTUNI_WSPACE, /* U+002029: PARAGRAPH SEPARATOR*/
+                                                     0, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+                                                     0, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+                                                     0, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+                                                     0, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+                                                     0, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+                                          RTUNI_WSPACE, /* U+00202f: NARROW NO-BREAK SPACE*/
+                                                     0, /* U+002030: PER MILLE SIGN*/
+                                                     0, /* U+002031: PER TEN THOUSAND SIGN*/
+                                                     0, /* U+002032: PRIME*/
+                                                     0, /* U+002033: DOUBLE PRIME*/
+                                                     0, /* U+002034: TRIPLE PRIME*/
+                                                     0, /* U+002035: REVERSED PRIME*/
+                                                     0, /* U+002036: REVERSED DOUBLE PRIME*/
+                                                     0, /* U+002037: REVERSED TRIPLE PRIME*/
+                                                     0, /* U+002038: CARET*/
+                                                     0, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+                                                     0, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+                                                     0, /* U+00203b: REFERENCE MARK*/
+                                                     0, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+                                                     0, /* U+00203d: INTERROBANG*/
+                                                     0, /* U+00203e: OVERLINE*/
+                                                     0, /* U+00203f: UNDERTIE*/
+                                                     0, /* U+002040: CHARACTER TIE*/
+                                                     0, /* U+002041: CARET INSERTION POINT*/
+                                                     0, /* U+002042: ASTERISM*/
+                                                     0, /* U+002043: HYPHEN BULLET*/
+                                                     0, /* U+002044: FRACTION SLASH*/
+                                                     0, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+                                                     0, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+                                                     0, /* U+002047: DOUBLE QUESTION MARK*/
+                                                     0, /* U+002048: QUESTION EXCLAMATION MARK*/
+                                                     0, /* U+002049: EXCLAMATION QUESTION MARK*/
+                                                     0, /* U+00204a: TIRONIAN SIGN ET*/
+                                                     0, /* U+00204b: REVERSED PILCROW SIGN*/
+                                                     0, /* U+00204c: BLACK LEFTWARDS BULLET*/
+                                                     0, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+                                                     0, /* U+00204e: LOW ASTERISK*/
+                                                     0, /* U+00204f: REVERSED SEMICOLON*/
+                                                     0, /* U+002050: CLOSE UP*/
+                                                     0, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+                                                     0, /* U+002052: COMMERCIAL MINUS SIGN*/
+                                                     0, /* U+002053: SWUNG DASH*/
+                                                     0, /* U+002054: INVERTED UNDERTIE*/
+                                                     0, /* U+002055: FLOWER PUNCTUATION MARK*/
+                                                     0, /* U+002056: THREE DOT PUNCTUATION*/
+                                                     0, /* U+002057: QUADRUPLE PRIME*/
+                                                     0, /* U+002058: FOUR DOT PUNCTUATION*/
+                                                     0, /* U+002059: FIVE DOT PUNCTUATION*/
+                                                     0, /* U+00205a: TWO DOT PUNCTUATION*/
+                                                     0, /* U+00205b: FOUR DOT MARK*/
+                                                     0, /* U+00205c: DOTTED CROSS*/
+                                                     0, /* U+00205d: TRICOLON*/
+                                                     0, /* U+00205e: VERTICAL FOUR DOTS*/
+                                          RTUNI_WSPACE, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+                                                     0, /* U+002060: WORD JOINER*/
+                                                     0, /* U+002061: FUNCTION APPLICATION*/
+                                                     0, /* U+002062: INVISIBLE TIMES*/
+                                                     0, /* U+002063: INVISIBLE SEPARATOR*/
+                                                     0, /* U+002064: INVISIBLE PLUS*/
+                                                     0, /* U+002065: */
+                                                     0, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+                                                     0, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+                                                     0, /* U+002068: FIRST STRONG ISOLATE*/
+                                                     0, /* U+002069: POP DIRECTIONAL ISOLATE*/
+                                                     0, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+                                                     0, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+                                                     0, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+                                                     0, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+                                                     0, /* U+00206e: NATIONAL DIGIT SHAPES*/
+                                                     0, /* U+00206f: NOMINAL DIGIT SHAPES*/
+                                                     0, /* U+002070: SUPERSCRIPT ZERO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+                                                     0, /* U+002072: */
+                                                     0, /* U+002073: */
+                                                     0, /* U+002074: SUPERSCRIPT FOUR*/
+                                                     0, /* U+002075: SUPERSCRIPT FIVE*/
+                                                     0, /* U+002076: SUPERSCRIPT SIX*/
+                                                     0, /* U+002077: SUPERSCRIPT SEVEN*/
+                                                     0, /* U+002078: SUPERSCRIPT EIGHT*/
+                                                     0, /* U+002079: SUPERSCRIPT NINE*/
+                                                     0, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+                                                     0, /* U+00207b: SUPERSCRIPT MINUS*/
+                                                     0, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+                                                     0, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+                                                     0, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+                                                     0, /* U+002080: SUBSCRIPT ZERO*/
+                                                     0, /* U+002081: SUBSCRIPT ONE*/
+                                                     0, /* U+002082: SUBSCRIPT TWO*/
+                                                     0, /* U+002083: SUBSCRIPT THREE*/
+                                                     0, /* U+002084: SUBSCRIPT FOUR*/
+                                                     0, /* U+002085: SUBSCRIPT FIVE*/
+                                                     0, /* U+002086: SUBSCRIPT SIX*/
+                                                     0, /* U+002087: SUBSCRIPT SEVEN*/
+                                                     0, /* U+002088: SUBSCRIPT EIGHT*/
+                                                     0, /* U+002089: SUBSCRIPT NINE*/
+                                                     0, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+                                                     0, /* U+00208b: SUBSCRIPT MINUS*/
+                                                     0, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+                                                     0, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+                                                     0, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+                                                     0, /* U+00208f: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+                                                     0, /* U+00209d: */
+                                                     0, /* U+00209e: */
+                                                     0, /* U+00209f: */
+                                                     0, /* U+0020a0: EURO-CURRENCY SIGN*/
+                                                     0, /* U+0020a1: COLON SIGN*/
+                                                     0, /* U+0020a2: CRUZEIRO SIGN*/
+                                                     0, /* U+0020a3: FRENCH FRANC SIGN*/
+                                                     0, /* U+0020a4: LIRA SIGN*/
+                                                     0, /* U+0020a5: MILL SIGN*/
+                                                     0, /* U+0020a6: NAIRA SIGN*/
+                                                     0, /* U+0020a7: PESETA SIGN*/
+                                                     0, /* U+0020a8: RUPEE SIGN*/
+                                                     0, /* U+0020a9: WON SIGN*/
+                                                     0, /* U+0020aa: NEW SHEQEL SIGN*/
+                                                     0, /* U+0020ab: DONG SIGN*/
+                                                     0, /* U+0020ac: EURO SIGN*/
+                                                     0, /* U+0020ad: KIP SIGN*/
+                                                     0, /* U+0020ae: TUGRIK SIGN*/
+                                                     0, /* U+0020af: DRACHMA SIGN*/
+                                                     0, /* U+0020b0: GERMAN PENNY SIGN*/
+                                                     0, /* U+0020b1: PESO SIGN*/
+                                                     0, /* U+0020b2: GUARANI SIGN*/
+                                                     0, /* U+0020b3: AUSTRAL SIGN*/
+                                                     0, /* U+0020b4: HRYVNIA SIGN*/
+                                                     0, /* U+0020b5: CEDI SIGN*/
+                                                     0, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+                                                     0, /* U+0020b7: SPESMILO SIGN*/
+                                                     0, /* U+0020b8: TENGE SIGN*/
+                                                     0, /* U+0020b9: INDIAN RUPEE SIGN*/
+                                                     0, /* U+0020ba: TURKISH LIRA SIGN*/
+                                                     0, /* U+0020bb: */
+                                                     0, /* U+0020bc: */
+                                                     0, /* U+0020bd: */
+                                                     0, /* U+0020be: */
+                                                     0, /* U+0020bf: */
+                                                     0, /* U+0020c0: */
+                                                     0, /* U+0020c1: */
+                                                     0, /* U+0020c2: */
+                                                     0, /* U+0020c3: */
+                                                     0, /* U+0020c4: */
+                                                     0, /* U+0020c5: */
+                                                     0, /* U+0020c6: */
+                                                     0, /* U+0020c7: */
+                                                     0, /* U+0020c8: */
+                                                     0, /* U+0020c9: */
+                                                     0, /* U+0020ca: */
+                                                     0, /* U+0020cb: */
+                                                     0, /* U+0020cc: */
+                                                     0, /* U+0020cd: */
+                                                     0, /* U+0020ce: */
+                                                     0, /* U+0020cf: */
+                                                     0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+                                                     0, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+                                                     0, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+                                                     0, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+                                                     0, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+                                                     0, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+                                                     0, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+                                                     0, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+                                                     0, /* U+0020d8: COMBINING RING OVERLAY*/
+                                                     0, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+                                                     0, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+                                                     0, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+                                                     0, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+                                                     0, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+                                                     0, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+                                                     0, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+                                                     0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+                                                     0, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+                                                     0, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+                                                     0, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+                                                     0, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+                                                     0, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+                                                     0, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+                                                     0, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+                                                     0, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+                                                     0, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+                                                     0, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+                                                     0, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+                                                     0, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+                                                     0, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+                                                     0, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+                                                     0, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+                                                     0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+                                                     0, /* U+0020f1: */
+                                                     0, /* U+0020f2: */
+                                                     0, /* U+0020f3: */
+                                                     0, /* U+0020f4: */
+                                                     0, /* U+0020f5: */
+                                                     0, /* U+0020f6: */
+                                                     0, /* U+0020f7: */
+                                                     0, /* U+0020f8: */
+                                                     0, /* U+0020f9: */
+                                                     0, /* U+0020fa: */
+                                                     0, /* U+0020fb: */
+                                                     0, /* U+0020fc: */
+                                                     0, /* U+0020fd: */
+                                                     0, /* U+0020fe: */
+                                                     0, /* U+0020ff: */
+                                                     0, /* U+002100: ACCOUNT OF*/
+                                                     0, /* U+002101: ADDRESSED TO THE SUBJECT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+                                                     0, /* U+002103: DEGREE CELSIUS*/
+                                                     0, /* U+002104: CENTRE LINE SYMBOL*/
+                                                     0, /* U+002105: CARE OF*/
+                                                     0, /* U+002106: CADA UNA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002107: EULER CONSTANT*/
+                                                     0, /* U+002108: SCRUPLE*/
+                                                     0, /* U+002109: DEGREE FAHRENHEIT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210a: SCRIPT SMALL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210b: SCRIPT CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210c: BLACK-LETTER CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210e: PLANCK CONSTANT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002110: SCRIPT CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002111: BLACK-LETTER CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002112: SCRIPT CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002113: SCRIPT SMALL L*/
+                                                     0, /* U+002114: L B BAR SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+                                                     0, /* U+002116: NUMERO SIGN*/
+                                                     0, /* U+002117: SOUND RECORDING COPYRIGHT*/
+                                                     0, /* U+002118: SCRIPT CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211b: SCRIPT CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211c: BLACK-LETTER CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+                                                     0, /* U+00211e: PRESCRIPTION TAKE*/
+                                                     0, /* U+00211f: RESPONSE*/
+                                                     0, /* U+002120: SERVICE MARK*/
+                                                     0, /* U+002121: TELEPHONE SIGN*/
+                                                     0, /* U+002122: TRADE MARK SIGN*/
+                                                     0, /* U+002123: VERSICLE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+                                                     0, /* U+002125: OUNCE SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002126: OHM SIGN*/
+                                                     0, /* U+002127: INVERTED OHM SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002128: BLACK-LETTER CAPITAL Z*/
+                                                     0, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212a: KELVIN SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212b: ANGSTROM SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212c: SCRIPT CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212d: BLACK-LETTER CAPITAL C*/
+                                                     0, /* U+00212e: ESTIMATED SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00212f: SCRIPT SMALL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002130: SCRIPT CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002131: SCRIPT CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002132: TURNED CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002133: SCRIPT CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002134: SCRIPT SMALL O*/
+                                           RTUNI_ALPHA, /* U+002135: ALEF SYMBOL*/
+                                           RTUNI_ALPHA, /* U+002136: BET SYMBOL*/
+                                           RTUNI_ALPHA, /* U+002137: GIMEL SYMBOL*/
+                                           RTUNI_ALPHA, /* U+002138: DALET SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002139: INFORMATION SOURCE*/
+                                                     0, /* U+00213a: ROTATED CAPITAL Q*/
+                                                     0, /* U+00213b: FACSIMILE SIGN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+                                                     0, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+                                                     0, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+                                                     0, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+                                                     0, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+                                                     0, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+                                                     0, /* U+00214a: PROPERTY LINE*/
+                                                     0, /* U+00214b: TURNED AMPERSAND*/
+                                                     0, /* U+00214c: PER SIGN*/
+                                                     0, /* U+00214d: AKTIESELSKAB*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00214e: TURNED SMALL F*/
+                                                     0, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+                                                     0, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+                                                     0, /* U+002151: VULGAR FRACTION ONE NINTH*/
+                                                     0, /* U+002152: VULGAR FRACTION ONE TENTH*/
+                                                     0, /* U+002153: VULGAR FRACTION ONE THIRD*/
+                                                     0, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+                                                     0, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+                                                     0, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+                                                     0, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+                                                     0, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+                                                     0, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+                                                     0, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+                                                     0, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+                                                     0, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+                                                     0, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+                                                     0, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+                                                     0, /* U+00215f: FRACTION NUMERATOR ONE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002160: ROMAN NUMERAL ONE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002161: ROMAN NUMERAL TWO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002162: ROMAN NUMERAL THREE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002163: ROMAN NUMERAL FOUR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002164: ROMAN NUMERAL FIVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002165: ROMAN NUMERAL SIX*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002166: ROMAN NUMERAL SEVEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002167: ROMAN NUMERAL EIGHT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002168: ROMAN NUMERAL NINE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002169: ROMAN NUMERAL TEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216b: ROMAN NUMERAL TWELVE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216c: ROMAN NUMERAL FIFTY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+                                           RTUNI_ALPHA, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+                                           RTUNI_ALPHA, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+                                           RTUNI_ALPHA, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+                                           RTUNI_ALPHA, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+                                           RTUNI_ALPHA, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+                                                     0, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+                                                     0, /* U+00218a: */
+                                                     0, /* U+00218b: */
+                                                     0, /* U+00218c: */
+                                                     0, /* U+00218d: */
+                                                     0, /* U+00218e: */
+                                                     0, /* U+00218f: */
+                                                     0, /* U+002190: LEFTWARDS ARROW*/
+                                                     0, /* U+002191: UPWARDS ARROW*/
+                                                     0, /* U+002192: RIGHTWARDS ARROW*/
+                                                     0, /* U+002193: DOWNWARDS ARROW*/
+                                                     0, /* U+002194: LEFT RIGHT ARROW*/
+                                                     0, /* U+002195: UP DOWN ARROW*/
+                                                     0, /* U+002196: NORTH WEST ARROW*/
+                                                     0, /* U+002197: NORTH EAST ARROW*/
+                                                     0, /* U+002198: SOUTH EAST ARROW*/
+                                                     0, /* U+002199: SOUTH WEST ARROW*/
+                                                     0, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+                                                     0, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+                                                     0, /* U+00219c: LEFTWARDS WAVE ARROW*/
+                                                     0, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+                                                     0, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+                                                     0, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+                                                     0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+                                                     0, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+                                                     0, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+                                                     0, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+                                                     0, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+                                                     0, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+                                                     0, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+                                                     0, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+                                                     0, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+                                                     0, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+                                                     0, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+                                                     0, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+                                                     0, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+                                                     0, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+                                                     0, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+                                                     0, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+                                                     0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+                                                     0, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+                                                     0, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+                                                     0, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+                                                     0, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+                                                     0, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+                                                     0, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+                                                     0, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+                                                     0, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+                                                     0, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+                                                     0, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+                                                     0, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+                                                     0, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+                                                     0, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+                                                     0, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+                                                     0, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+                                                     0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+                                                     0, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+                                                     0, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+                                                     0, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+                                                     0, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+                                                     0, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+                                                     0, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+                                                     0, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+                                                     0, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+                                                     0, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+                                                     0, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+                                                     0, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+                                                     0, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+                                                     0, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+                                                     0, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+                                                     0, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+                                                     0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+                                                     0, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+                                                     0, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+                                                     0, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+                                                     0, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+                                                     0, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+                                                     0, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+                                                     0, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+                                                     0, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+                                                     0, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+                                                     0, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+                                                     0, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+                                                     0, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+                                                     0, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+                                                     0, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+                                                     0, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+                                                     0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+                                                     0, /* U+0021e1: UPWARDS DASHED ARROW*/
+                                                     0, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+                                                     0, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+                                                     0, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+                                                     0, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+                                                     0, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+                                                     0, /* U+0021e7: UPWARDS WHITE ARROW*/
+                                                     0, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+                                                     0, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+                                                     0, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+                                                     0, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+                                                     0, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+                                                     0, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+                                                     0, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+                                                     0, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+                                                     0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+                                                     0, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+                                                     0, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+                                                     0, /* U+0021f3: UP DOWN WHITE ARROW*/
+                                                     0, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+                                                     0, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+                                                     0, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+                                                     0, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+                                                     0, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+                                                     0, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+                                                     0, /* U+002200: FOR ALL*/
+                                                     0, /* U+002201: COMPLEMENT*/
+                                                     0, /* U+002202: PARTIAL DIFFERENTIAL*/
+                                                     0, /* U+002203: THERE EXISTS*/
+                                                     0, /* U+002204: THERE DOES NOT EXIST*/
+                                                     0, /* U+002205: EMPTY SET*/
+                                                     0, /* U+002206: INCREMENT*/
+                                                     0, /* U+002207: NABLA*/
+                                                     0, /* U+002208: ELEMENT OF*/
+                                                     0, /* U+002209: NOT AN ELEMENT OF*/
+                                                     0, /* U+00220a: SMALL ELEMENT OF*/
+                                                     0, /* U+00220b: CONTAINS AS MEMBER*/
+                                                     0, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+                                                     0, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+                                                     0, /* U+00220e: END OF PROOF*/
+                                                     0, /* U+00220f: N-ARY PRODUCT*/
+                                                     0, /* U+002210: N-ARY COPRODUCT*/
+                                                     0, /* U+002211: N-ARY SUMMATION*/
+                                                     0, /* U+002212: MINUS SIGN*/
+                                                     0, /* U+002213: MINUS-OR-PLUS SIGN*/
+                                                     0, /* U+002214: DOT PLUS*/
+                                                     0, /* U+002215: DIVISION SLASH*/
+                                                     0, /* U+002216: SET MINUS*/
+                                                     0, /* U+002217: ASTERISK OPERATOR*/
+                                                     0, /* U+002218: RING OPERATOR*/
+                                                     0, /* U+002219: BULLET OPERATOR*/
+                                                     0, /* U+00221a: SQUARE ROOT*/
+                                                     0, /* U+00221b: CUBE ROOT*/
+                                                     0, /* U+00221c: FOURTH ROOT*/
+                                                     0, /* U+00221d: PROPORTIONAL TO*/
+                                                     0, /* U+00221e: INFINITY*/
+                                                     0, /* U+00221f: RIGHT ANGLE*/
+                                                     0, /* U+002220: ANGLE*/
+                                                     0, /* U+002221: MEASURED ANGLE*/
+                                                     0, /* U+002222: SPHERICAL ANGLE*/
+                                                     0, /* U+002223: DIVIDES*/
+                                                     0, /* U+002224: DOES NOT DIVIDE*/
+                                                     0, /* U+002225: PARALLEL TO*/
+                                                     0, /* U+002226: NOT PARALLEL TO*/
+                                                     0, /* U+002227: LOGICAL AND*/
+                                                     0, /* U+002228: LOGICAL OR*/
+                                                     0, /* U+002229: INTERSECTION*/
+                                                     0, /* U+00222a: UNION*/
+                                                     0, /* U+00222b: INTEGRAL*/
+                                                     0, /* U+00222c: DOUBLE INTEGRAL*/
+                                                     0, /* U+00222d: TRIPLE INTEGRAL*/
+                                                     0, /* U+00222e: CONTOUR INTEGRAL*/
+                                                     0, /* U+00222f: SURFACE INTEGRAL*/
+                                                     0, /* U+002230: VOLUME INTEGRAL*/
+                                                     0, /* U+002231: CLOCKWISE INTEGRAL*/
+                                                     0, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+                                                     0, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+                                                     0, /* U+002234: THEREFORE*/
+                                                     0, /* U+002235: BECAUSE*/
+                                                     0, /* U+002236: RATIO*/
+                                                     0, /* U+002237: PROPORTION*/
+                                                     0, /* U+002238: DOT MINUS*/
+                                                     0, /* U+002239: EXCESS*/
+                                                     0, /* U+00223a: GEOMETRIC PROPORTION*/
+                                                     0, /* U+00223b: HOMOTHETIC*/
+                                                     0, /* U+00223c: TILDE OPERATOR*/
+                                                     0, /* U+00223d: REVERSED TILDE*/
+                                                     0, /* U+00223e: INVERTED LAZY S*/
+                                                     0, /* U+00223f: SINE WAVE*/
+                                                     0, /* U+002240: WREATH PRODUCT*/
+                                                     0, /* U+002241: NOT TILDE*/
+                                                     0, /* U+002242: MINUS TILDE*/
+                                                     0, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+                                                     0, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+                                                     0, /* U+002245: APPROXIMATELY EQUAL TO*/
+                                                     0, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+                                                     0, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+                                                     0, /* U+002248: ALMOST EQUAL TO*/
+                                                     0, /* U+002249: NOT ALMOST EQUAL TO*/
+                                                     0, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+                                                     0, /* U+00224b: TRIPLE TILDE*/
+                                                     0, /* U+00224c: ALL EQUAL TO*/
+                                                     0, /* U+00224d: EQUIVALENT TO*/
+                                                     0, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+                                                     0, /* U+00224f: DIFFERENCE BETWEEN*/
+                                                     0, /* U+002250: APPROACHES THE LIMIT*/
+                                                     0, /* U+002251: GEOMETRICALLY EQUAL TO*/
+                                                     0, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+                                                     0, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+                                                     0, /* U+002254: COLON EQUALS*/
+                                                     0, /* U+002255: EQUALS COLON*/
+                                                     0, /* U+002256: RING IN EQUAL TO*/
+                                                     0, /* U+002257: RING EQUAL TO*/
+                                                     0, /* U+002258: CORRESPONDS TO*/
+                                                     0, /* U+002259: ESTIMATES*/
+                                                     0, /* U+00225a: EQUIANGULAR TO*/
+                                                     0, /* U+00225b: STAR EQUALS*/
+                                                     0, /* U+00225c: DELTA EQUAL TO*/
+                                                     0, /* U+00225d: EQUAL TO BY DEFINITION*/
+                                                     0, /* U+00225e: MEASURED BY*/
+                                                     0, /* U+00225f: QUESTIONED EQUAL TO*/
+                                                     0, /* U+002260: NOT EQUAL TO*/
+                                                     0, /* U+002261: IDENTICAL TO*/
+                                                     0, /* U+002262: NOT IDENTICAL TO*/
+                                                     0, /* U+002263: STRICTLY EQUIVALENT TO*/
+                                                     0, /* U+002264: LESS-THAN OR EQUAL TO*/
+                                                     0, /* U+002265: GREATER-THAN OR EQUAL TO*/
+                                                     0, /* U+002266: LESS-THAN OVER EQUAL TO*/
+                                                     0, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+                                                     0, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+                                                     0, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+                                                     0, /* U+00226a: MUCH LESS-THAN*/
+                                                     0, /* U+00226b: MUCH GREATER-THAN*/
+                                                     0, /* U+00226c: BETWEEN*/
+                                                     0, /* U+00226d: NOT EQUIVALENT TO*/
+                                                     0, /* U+00226e: NOT LESS-THAN*/
+                                                     0, /* U+00226f: NOT GREATER-THAN*/
+                                                     0, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+                                                     0, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+                                                     0, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+                                                     0, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+                                                     0, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+                                                     0, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+                                                     0, /* U+002276: LESS-THAN OR GREATER-THAN*/
+                                                     0, /* U+002277: GREATER-THAN OR LESS-THAN*/
+                                                     0, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+                                                     0, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+                                                     0, /* U+00227a: PRECEDES*/
+                                                     0, /* U+00227b: SUCCEEDS*/
+                                                     0, /* U+00227c: PRECEDES OR EQUAL TO*/
+                                                     0, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+                                                     0, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+                                                     0, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+                                                     0, /* U+002280: DOES NOT PRECEDE*/
+                                                     0, /* U+002281: DOES NOT SUCCEED*/
+                                                     0, /* U+002282: SUBSET OF*/
+                                                     0, /* U+002283: SUPERSET OF*/
+                                                     0, /* U+002284: NOT A SUBSET OF*/
+                                                     0, /* U+002285: NOT A SUPERSET OF*/
+                                                     0, /* U+002286: SUBSET OF OR EQUAL TO*/
+                                                     0, /* U+002287: SUPERSET OF OR EQUAL TO*/
+                                                     0, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+                                                     0, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+                                                     0, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+                                                     0, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+                                                     0, /* U+00228c: MULTISET*/
+                                                     0, /* U+00228d: MULTISET MULTIPLICATION*/
+                                                     0, /* U+00228e: MULTISET UNION*/
+                                                     0, /* U+00228f: SQUARE IMAGE OF*/
+                                                     0, /* U+002290: SQUARE ORIGINAL OF*/
+                                                     0, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+                                                     0, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+                                                     0, /* U+002293: SQUARE CAP*/
+                                                     0, /* U+002294: SQUARE CUP*/
+                                                     0, /* U+002295: CIRCLED PLUS*/
+                                                     0, /* U+002296: CIRCLED MINUS*/
+                                                     0, /* U+002297: CIRCLED TIMES*/
+                                                     0, /* U+002298: CIRCLED DIVISION SLASH*/
+                                                     0, /* U+002299: CIRCLED DOT OPERATOR*/
+                                                     0, /* U+00229a: CIRCLED RING OPERATOR*/
+                                                     0, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+                                                     0, /* U+00229c: CIRCLED EQUALS*/
+                                                     0, /* U+00229d: CIRCLED DASH*/
+                                                     0, /* U+00229e: SQUARED PLUS*/
+                                                     0, /* U+00229f: SQUARED MINUS*/
+                                                     0, /* U+0022a0: SQUARED TIMES*/
+                                                     0, /* U+0022a1: SQUARED DOT OPERATOR*/
+                                                     0, /* U+0022a2: RIGHT TACK*/
+                                                     0, /* U+0022a3: LEFT TACK*/
+                                                     0, /* U+0022a4: DOWN TACK*/
+                                                     0, /* U+0022a5: UP TACK*/
+                                                     0, /* U+0022a6: ASSERTION*/
+                                                     0, /* U+0022a7: MODELS*/
+                                                     0, /* U+0022a8: TRUE*/
+                                                     0, /* U+0022a9: FORCES*/
+                                                     0, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+                                                     0, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+                                                     0, /* U+0022ac: DOES NOT PROVE*/
+                                                     0, /* U+0022ad: NOT TRUE*/
+                                                     0, /* U+0022ae: DOES NOT FORCE*/
+                                                     0, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+                                                     0, /* U+0022b0: PRECEDES UNDER RELATION*/
+                                                     0, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+                                                     0, /* U+0022b2: NORMAL SUBGROUP OF*/
+                                                     0, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+                                                     0, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+                                                     0, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+                                                     0, /* U+0022b6: ORIGINAL OF*/
+                                                     0, /* U+0022b7: IMAGE OF*/
+                                                     0, /* U+0022b8: MULTIMAP*/
+                                                     0, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+                                                     0, /* U+0022ba: INTERCALATE*/
+                                                     0, /* U+0022bb: XOR*/
+                                                     0, /* U+0022bc: NAND*/
+                                                     0, /* U+0022bd: NOR*/
+                                                     0, /* U+0022be: RIGHT ANGLE WITH ARC*/
+                                                     0, /* U+0022bf: RIGHT TRIANGLE*/
+                                                     0, /* U+0022c0: N-ARY LOGICAL AND*/
+                                                     0, /* U+0022c1: N-ARY LOGICAL OR*/
+                                                     0, /* U+0022c2: N-ARY INTERSECTION*/
+                                                     0, /* U+0022c3: N-ARY UNION*/
+                                                     0, /* U+0022c4: DIAMOND OPERATOR*/
+                                                     0, /* U+0022c5: DOT OPERATOR*/
+                                                     0, /* U+0022c6: STAR OPERATOR*/
+                                                     0, /* U+0022c7: DIVISION TIMES*/
+                                                     0, /* U+0022c8: BOWTIE*/
+                                                     0, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+                                                     0, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+                                                     0, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+                                                     0, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+                                                     0, /* U+0022cd: REVERSED TILDE EQUALS*/
+                                                     0, /* U+0022ce: CURLY LOGICAL OR*/
+                                                     0, /* U+0022cf: CURLY LOGICAL AND*/
+                                                     0, /* U+0022d0: DOUBLE SUBSET*/
+                                                     0, /* U+0022d1: DOUBLE SUPERSET*/
+                                                     0, /* U+0022d2: DOUBLE INTERSECTION*/
+                                                     0, /* U+0022d3: DOUBLE UNION*/
+                                                     0, /* U+0022d4: PITCHFORK*/
+                                                     0, /* U+0022d5: EQUAL AND PARALLEL TO*/
+                                                     0, /* U+0022d6: LESS-THAN WITH DOT*/
+                                                     0, /* U+0022d7: GREATER-THAN WITH DOT*/
+                                                     0, /* U+0022d8: VERY MUCH LESS-THAN*/
+                                                     0, /* U+0022d9: VERY MUCH GREATER-THAN*/
+                                                     0, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+                                                     0, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+                                                     0, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+                                                     0, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+                                                     0, /* U+0022de: EQUAL TO OR PRECEDES*/
+                                                     0, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+                                                     0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+                                                     0, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+                                                     0, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+                                                     0, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+                                                     0, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+                                                     0, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+                                                     0, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+                                                     0, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+                                                     0, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+                                                     0, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+                                                     0, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+                                                     0, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+                                                     0, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+                                                     0, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+                                                     0, /* U+0022ee: VERTICAL ELLIPSIS*/
+                                                     0, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+                                                     0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+                                                     0, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+                                                     0, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+                                                     0, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+                                                     0, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+                                                     0, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+                                                     0, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+                                                     0, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+                                                     0, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+                                                     0, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+                                                     0, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+                                                     0, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+                                                     0, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+                                                     0, /* U+0022fd: CONTAINS WITH OVERBAR*/
+                                                     0, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+                                                     0, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+                                                     0, /* U+002300: DIAMETER SIGN*/
+                                                     0, /* U+002301: ELECTRIC ARROW*/
+                                                     0, /* U+002302: HOUSE*/
+                                                     0, /* U+002303: UP ARROWHEAD*/
+                                                     0, /* U+002304: DOWN ARROWHEAD*/
+                                                     0, /* U+002305: PROJECTIVE*/
+                                                     0, /* U+002306: PERSPECTIVE*/
+                                                     0, /* U+002307: WAVY LINE*/
+                                                     0, /* U+002308: LEFT CEILING*/
+                                                     0, /* U+002309: RIGHT CEILING*/
+                                                     0, /* U+00230a: LEFT FLOOR*/
+                                                     0, /* U+00230b: RIGHT FLOOR*/
+                                                     0, /* U+00230c: BOTTOM RIGHT CROP*/
+                                                     0, /* U+00230d: BOTTOM LEFT CROP*/
+                                                     0, /* U+00230e: TOP RIGHT CROP*/
+                                                     0, /* U+00230f: TOP LEFT CROP*/
+                                                     0, /* U+002310: REVERSED NOT SIGN*/
+                                                     0, /* U+002311: SQUARE LOZENGE*/
+                                                     0, /* U+002312: ARC*/
+                                                     0, /* U+002313: SEGMENT*/
+                                                     0, /* U+002314: SECTOR*/
+                                                     0, /* U+002315: TELEPHONE RECORDER*/
+                                                     0, /* U+002316: POSITION INDICATOR*/
+                                                     0, /* U+002317: VIEWDATA SQUARE*/
+                                                     0, /* U+002318: PLACE OF INTEREST SIGN*/
+                                                     0, /* U+002319: TURNED NOT SIGN*/
+                                                     0, /* U+00231a: WATCH*/
+                                                     0, /* U+00231b: HOURGLASS*/
+                                                     0, /* U+00231c: TOP LEFT CORNER*/
+                                                     0, /* U+00231d: TOP RIGHT CORNER*/
+                                                     0, /* U+00231e: BOTTOM LEFT CORNER*/
+                                                     0, /* U+00231f: BOTTOM RIGHT CORNER*/
+                                                     0, /* U+002320: TOP HALF INTEGRAL*/
+                                                     0, /* U+002321: BOTTOM HALF INTEGRAL*/
+                                                     0, /* U+002322: FROWN*/
+                                                     0, /* U+002323: SMILE*/
+                                                     0, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+                                                     0, /* U+002325: OPTION KEY*/
+                                                     0, /* U+002326: ERASE TO THE RIGHT*/
+                                                     0, /* U+002327: X IN A RECTANGLE BOX*/
+                                                     0, /* U+002328: KEYBOARD*/
+                                                     0, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+                                                     0, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+                                                     0, /* U+00232b: ERASE TO THE LEFT*/
+                                                     0, /* U+00232c: BENZENE RING*/
+                                                     0, /* U+00232d: CYLINDRICITY*/
+                                                     0, /* U+00232e: ALL AROUND-PROFILE*/
+                                                     0, /* U+00232f: SYMMETRY*/
+                                                     0, /* U+002330: TOTAL RUNOUT*/
+                                                     0, /* U+002331: DIMENSION ORIGIN*/
+                                                     0, /* U+002332: CONICAL TAPER*/
+                                                     0, /* U+002333: SLOPE*/
+                                                     0, /* U+002334: COUNTERBORE*/
+                                                     0, /* U+002335: COUNTERSINK*/
+                                                     0, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+                                                     0, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+                                                     0, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+                                                     0, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+                                                     0, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+                                                     0, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+                                                     0, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+                                                     0, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+                                                     0, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+                                                     0, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+                                                     0, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+                                                     0, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+                                                     0, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+                                                     0, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+                                                     0, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+                                                     0, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+                                                     0, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+                                                     0, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+                                                     0, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+                                                     0, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+                                                     0, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+                                                     0, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+                                                     0, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+                                                     0, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+                                                     0, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+                                                     0, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+                                                     0, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+                                                     0, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+                                                     0, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+                                                     0, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+                                                     0, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+                                                     0, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+                                                     0, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+                                                     0, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+                                                     0, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+                                                     0, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+                                                     0, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+                                                     0, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+                                                     0, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+                                                     0, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+                                                     0, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+                                                     0, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+                                                     0, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+                                                     0, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+                                                     0, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+                                                     0, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+                                                     0, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+                                                     0, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+                                                     0, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+                                                     0, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+                                                     0, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+                                                     0, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+                                                     0, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+                                                     0, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+                                                     0, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+                                                     0, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+                                                     0, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+                                                     0, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+                                                     0, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+                                                     0, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+                                                     0, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+                                                     0, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+                                                     0, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+                                                     0, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+                                                     0, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+                                                     0, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+                                                     0, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+                                                     0, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+                                                     0, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+                                                     0, /* U+00237b: NOT CHECK MARK*/
+                                                     0, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+                                                     0, /* U+00237d: SHOULDERED OPEN BOX*/
+                                                     0, /* U+00237e: BELL SYMBOL*/
+                                                     0, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+                                                     0, /* U+002380: INSERTION SYMBOL*/
+                                                     0, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+                                                     0, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+                                                     0, /* U+002383: EMPHASIS SYMBOL*/
+                                                     0, /* U+002384: COMPOSITION SYMBOL*/
+                                                     0, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+                                                     0, /* U+002386: ENTER SYMBOL*/
+                                                     0, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+                                                     0, /* U+002388: HELM SYMBOL*/
+                                                     0, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+                                                     0, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+                                                     0, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+                                                     0, /* U+00238c: UNDO SYMBOL*/
+                                                     0, /* U+00238d: MONOSTABLE SYMBOL*/
+                                                     0, /* U+00238e: HYSTERESIS SYMBOL*/
+                                                     0, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+                                                     0, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+                                                     0, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+                                                     0, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+                                                     0, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+                                                     0, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+                                                     0, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+                                                     0, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+                                                     0, /* U+002397: PREVIOUS PAGE*/
+                                                     0, /* U+002398: NEXT PAGE*/
+                                                     0, /* U+002399: PRINT SCREEN SYMBOL*/
+                                                     0, /* U+00239a: CLEAR SCREEN SYMBOL*/
+                                                     0, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+                                                     0, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+                                                     0, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+                                                     0, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+                                                     0, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+                                                     0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+                                                     0, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+                                                     0, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+                                                     0, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+                                                     0, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+                                                     0, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+                                                     0, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+                                                     0, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+                                                     0, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+                                                     0, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+                                                     0, /* U+0023aa: CURLY BRACKET EXTENSION*/
+                                                     0, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+                                                     0, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+                                                     0, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+                                                     0, /* U+0023ae: INTEGRAL EXTENSION*/
+                                                     0, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+                                                     0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+                                                     0, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+                                                     0, /* U+0023b2: SUMMATION TOP*/
+                                                     0, /* U+0023b3: SUMMATION BOTTOM*/
+                                                     0, /* U+0023b4: TOP SQUARE BRACKET*/
+                                                     0, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+                                                     0, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+                                                     0, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+                                                     0, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+                                                     0, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+                                                     0, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+                                                     0, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+                                                     0, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+                                                     0, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+                                                     0, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+                                                     0, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+                                                     0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+                                                     0, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+                                                     0, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+                                                     0, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+                                                     0, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+                                                     0, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+                                                     0, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+                                                     0, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+                                                     0, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+                                                     0, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+                                                     0, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+                                                     0, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+                                                     0, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+                                                     0, /* U+0023cd: SQUARE FOOT*/
+                                                     0, /* U+0023ce: RETURN SYMBOL*/
+                                                     0, /* U+0023cf: EJECT SYMBOL*/
+                                                     0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+                                                     0, /* U+0023d1: METRICAL BREVE*/
+                                                     0, /* U+0023d2: METRICAL LONG OVER SHORT*/
+                                                     0, /* U+0023d3: METRICAL SHORT OVER LONG*/
+                                                     0, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+                                                     0, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+                                                     0, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+                                                     0, /* U+0023d7: METRICAL TRISEME*/
+                                                     0, /* U+0023d8: METRICAL TETRASEME*/
+                                                     0, /* U+0023d9: METRICAL PENTASEME*/
+                                                     0, /* U+0023da: EARTH GROUND*/
+                                                     0, /* U+0023db: FUSE*/
+                                                     0, /* U+0023dc: TOP PARENTHESIS*/
+                                                     0, /* U+0023dd: BOTTOM PARENTHESIS*/
+                                                     0, /* U+0023de: TOP CURLY BRACKET*/
+                                                     0, /* U+0023df: BOTTOM CURLY BRACKET*/
+                                                     0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+                                                     0, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+                                                     0, /* U+0023e2: WHITE TRAPEZIUM*/
+                                                     0, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+                                                     0, /* U+0023e4: STRAIGHTNESS*/
+                                                     0, /* U+0023e5: FLATNESS*/
+                                                     0, /* U+0023e6: AC CURRENT*/
+                                                     0, /* U+0023e7: ELECTRICAL INTERSECTION*/
+                                                     0, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+                                                     0, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+                                                     0, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+                                                     0, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+                                                     0, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+                                                     0, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+                                                     0, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+                                                     0, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+                                                     0, /* U+0023f0: ALARM CLOCK*/
+                                                     0, /* U+0023f1: STOPWATCH*/
+                                                     0, /* U+0023f2: TIMER CLOCK*/
+                                                     0, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+                                                     0, /* U+0023f4: */
+                                                     0, /* U+0023f5: */
+                                                     0, /* U+0023f6: */
+                                                     0, /* U+0023f7: */
+                                                     0, /* U+0023f8: */
+                                                     0, /* U+0023f9: */
+                                                     0, /* U+0023fa: */
+                                                     0, /* U+0023fb: */
+                                                     0, /* U+0023fc: */
+                                                     0, /* U+0023fd: */
+                                                     0, /* U+0023fe: */
+                                                     0, /* U+0023ff: */
+                                                     0, /* U+002400: SYMBOL FOR NULL*/
+                                                     0, /* U+002401: SYMBOL FOR START OF HEADING*/
+                                                     0, /* U+002402: SYMBOL FOR START OF TEXT*/
+                                                     0, /* U+002403: SYMBOL FOR END OF TEXT*/
+                                                     0, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+                                                     0, /* U+002405: SYMBOL FOR ENQUIRY*/
+                                                     0, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+                                                     0, /* U+002407: SYMBOL FOR BELL*/
+                                                     0, /* U+002408: SYMBOL FOR BACKSPACE*/
+                                                     0, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+                                                     0, /* U+00240a: SYMBOL FOR LINE FEED*/
+                                                     0, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+                                                     0, /* U+00240c: SYMBOL FOR FORM FEED*/
+                                                     0, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+                                                     0, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+                                                     0, /* U+00240f: SYMBOL FOR SHIFT IN*/
+                                                     0, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+                                                     0, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+                                                     0, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+                                                     0, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+                                                     0, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+                                                     0, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+                                                     0, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+                                                     0, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+                                                     0, /* U+002418: SYMBOL FOR CANCEL*/
+                                                     0, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+                                                     0, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+                                                     0, /* U+00241b: SYMBOL FOR ESCAPE*/
+                                                     0, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+                                                     0, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+                                                     0, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+                                                     0, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+                                                     0, /* U+002420: SYMBOL FOR SPACE*/
+                                                     0, /* U+002421: SYMBOL FOR DELETE*/
+                                                     0, /* U+002422: BLANK SYMBOL*/
+                                                     0, /* U+002423: OPEN BOX*/
+                                                     0, /* U+002424: SYMBOL FOR NEWLINE*/
+                                                     0, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+                                                     0, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+                                                     0, /* U+002427: */
+                                                     0, /* U+002428: */
+                                                     0, /* U+002429: */
+                                                     0, /* U+00242a: */
+                                                     0, /* U+00242b: */
+                                                     0, /* U+00242c: */
+                                                     0, /* U+00242d: */
+                                                     0, /* U+00242e: */
+                                                     0, /* U+00242f: */
+                                                     0, /* U+002430: */
+                                                     0, /* U+002431: */
+                                                     0, /* U+002432: */
+                                                     0, /* U+002433: */
+                                                     0, /* U+002434: */
+                                                     0, /* U+002435: */
+                                                     0, /* U+002436: */
+                                                     0, /* U+002437: */
+                                                     0, /* U+002438: */
+                                                     0, /* U+002439: */
+                                                     0, /* U+00243a: */
+                                                     0, /* U+00243b: */
+                                                     0, /* U+00243c: */
+                                                     0, /* U+00243d: */
+                                                     0, /* U+00243e: */
+                                                     0, /* U+00243f: */
+                                                     0, /* U+002440: OCR HOOK*/
+                                                     0, /* U+002441: OCR CHAIR*/
+                                                     0, /* U+002442: OCR FORK*/
+                                                     0, /* U+002443: OCR INVERTED FORK*/
+                                                     0, /* U+002444: OCR BELT BUCKLE*/
+                                                     0, /* U+002445: OCR BOW TIE*/
+                                                     0, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+                                                     0, /* U+002447: OCR AMOUNT OF CHECK*/
+                                                     0, /* U+002448: OCR DASH*/
+                                                     0, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+                                                     0, /* U+00244a: OCR DOUBLE BACKSLASH*/
+                                                     0, /* U+00244b: */
+                                                     0, /* U+00244c: */
+                                                     0, /* U+00244d: */
+                                                     0, /* U+00244e: */
+                                                     0, /* U+00244f: */
+                                                     0, /* U+002450: */
+                                                     0, /* U+002451: */
+                                                     0, /* U+002452: */
+                                                     0, /* U+002453: */
+                                                     0, /* U+002454: */
+                                                     0, /* U+002455: */
+                                                     0, /* U+002456: */
+                                                     0, /* U+002457: */
+                                                     0, /* U+002458: */
+                                                     0, /* U+002459: */
+                                                     0, /* U+00245a: */
+                                                     0, /* U+00245b: */
+                                                     0, /* U+00245c: */
+                                                     0, /* U+00245d: */
+                                                     0, /* U+00245e: */
+                                                     0, /* U+00245f: */
+                                                     0, /* U+002460: CIRCLED DIGIT ONE*/
+                                                     0, /* U+002461: CIRCLED DIGIT TWO*/
+                                                     0, /* U+002462: CIRCLED DIGIT THREE*/
+                                                     0, /* U+002463: CIRCLED DIGIT FOUR*/
+                                                     0, /* U+002464: CIRCLED DIGIT FIVE*/
+                                                     0, /* U+002465: CIRCLED DIGIT SIX*/
+                                                     0, /* U+002466: CIRCLED DIGIT SEVEN*/
+                                                     0, /* U+002467: CIRCLED DIGIT EIGHT*/
+                                                     0, /* U+002468: CIRCLED DIGIT NINE*/
+                                                     0, /* U+002469: CIRCLED NUMBER TEN*/
+                                                     0, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+                                                     0, /* U+00246b: CIRCLED NUMBER TWELVE*/
+                                                     0, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+                                                     0, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+                                                     0, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+                                                     0, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+                                                     0, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+                                                     0, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+                                                     0, /* U+002472: CIRCLED NUMBER NINETEEN*/
+                                                     0, /* U+002473: CIRCLED NUMBER TWENTY*/
+                                                     0, /* U+002474: PARENTHESIZED DIGIT ONE*/
+                                                     0, /* U+002475: PARENTHESIZED DIGIT TWO*/
+                                                     0, /* U+002476: PARENTHESIZED DIGIT THREE*/
+                                                     0, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+                                                     0, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+                                                     0, /* U+002479: PARENTHESIZED DIGIT SIX*/
+                                                     0, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+                                                     0, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+                                                     0, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+                                                     0, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+                                                     0, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+                                                     0, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+                                                     0, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+                                                     0, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+                                                     0, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+                                                     0, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+                                                     0, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+                                                     0, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+                                                     0, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+                                                     0, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+                                                     0, /* U+002488: DIGIT ONE FULL STOP*/
+                                                     0, /* U+002489: DIGIT TWO FULL STOP*/
+                                                     0, /* U+00248a: DIGIT THREE FULL STOP*/
+                                                     0, /* U+00248b: DIGIT FOUR FULL STOP*/
+                                                     0, /* U+00248c: DIGIT FIVE FULL STOP*/
+                                                     0, /* U+00248d: DIGIT SIX FULL STOP*/
+                                                     0, /* U+00248e: DIGIT SEVEN FULL STOP*/
+                                                     0, /* U+00248f: DIGIT EIGHT FULL STOP*/
+                                                     0, /* U+002490: DIGIT NINE FULL STOP*/
+                                                     0, /* U+002491: NUMBER TEN FULL STOP*/
+                                                     0, /* U+002492: NUMBER ELEVEN FULL STOP*/
+                                                     0, /* U+002493: NUMBER TWELVE FULL STOP*/
+                                                     0, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+                                                     0, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+                                                     0, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+                                                     0, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+                                                     0, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+                                                     0, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+                                                     0, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+                                                     0, /* U+00249b: NUMBER TWENTY FULL STOP*/
+                                                     0, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+                                                     0, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+                                                     0, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+                                                     0, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+                                                     0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+                                                     0, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+                                                     0, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+                                                     0, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+                                                     0, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+                                                     0, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+                                                     0, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+                                                     0, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+                                                     0, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+                                                     0, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+                                                     0, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+                                                     0, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+                                                     0, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+                                                     0, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+                                                     0, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+                                                     0, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+                                                     0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+                                                     0, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+                                                     0, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+                                                     0, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+                                                     0, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+                                                     0, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
+                                                     0, /* U+0024ea: CIRCLED DIGIT ZERO*/
+                                                     0, /* U+0024eb: NEGATIVE CIRCLED NUMBER ELEVEN*/
+                                                     0, /* U+0024ec: NEGATIVE CIRCLED NUMBER TWELVE*/
+                                                     0, /* U+0024ed: NEGATIVE CIRCLED NUMBER THIRTEEN*/
+                                                     0, /* U+0024ee: NEGATIVE CIRCLED NUMBER FOURTEEN*/
+                                                     0, /* U+0024ef: NEGATIVE CIRCLED NUMBER FIFTEEN*/
+                                                     0, /* U+0024f0: NEGATIVE CIRCLED NUMBER SIXTEEN*/
+                                                     0, /* U+0024f1: NEGATIVE CIRCLED NUMBER SEVENTEEN*/
+                                                     0, /* U+0024f2: NEGATIVE CIRCLED NUMBER EIGHTEEN*/
+                                                     0, /* U+0024f3: NEGATIVE CIRCLED NUMBER NINETEEN*/
+                                                     0, /* U+0024f4: NEGATIVE CIRCLED NUMBER TWENTY*/
+                                                     0, /* U+0024f5: DOUBLE CIRCLED DIGIT ONE*/
+                                                     0, /* U+0024f6: DOUBLE CIRCLED DIGIT TWO*/
+                                                     0, /* U+0024f7: DOUBLE CIRCLED DIGIT THREE*/
+                                                     0, /* U+0024f8: DOUBLE CIRCLED DIGIT FOUR*/
+                                                     0, /* U+0024f9: DOUBLE CIRCLED DIGIT FIVE*/
+                                                     0, /* U+0024fa: DOUBLE CIRCLED DIGIT SIX*/
+                                                     0, /* U+0024fb: DOUBLE CIRCLED DIGIT SEVEN*/
+                                                     0, /* U+0024fc: DOUBLE CIRCLED DIGIT EIGHT*/
+                                                     0, /* U+0024fd: DOUBLE CIRCLED DIGIT NINE*/
+                                                     0, /* U+0024fe: DOUBLE CIRCLED NUMBER TEN*/
+                                                     0, /* U+0024ff: NEGATIVE CIRCLED DIGIT ZERO*/
+                                                     0, /* U+002500: BOX DRAWINGS LIGHT HORIZONTAL*/
+                                                     0, /* U+002501: BOX DRAWINGS HEAVY HORIZONTAL*/
+                                                     0, /* U+002502: BOX DRAWINGS LIGHT VERTICAL*/
+                                                     0, /* U+002503: BOX DRAWINGS HEAVY VERTICAL*/
+                                                     0, /* U+002504: BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL*/
+                                                     0, /* U+002505: BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL*/
+                                                     0, /* U+002506: BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL*/
+                                                     0, /* U+002507: BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL*/
+                                                     0, /* U+002508: BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL*/
+                                                     0, /* U+002509: BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL*/
+                                                     0, /* U+00250a: BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL*/
+                                                     0, /* U+00250b: BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL*/
+                                                     0, /* U+00250c: BOX DRAWINGS LIGHT DOWN AND RIGHT*/
+                                                     0, /* U+00250d: BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY*/
+                                                     0, /* U+00250e: BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT*/
+                                                     0, /* U+00250f: BOX DRAWINGS HEAVY DOWN AND RIGHT*/
+                                                     0, /* U+002510: BOX DRAWINGS LIGHT DOWN AND LEFT*/
+                                                     0, /* U+002511: BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY*/
+                                                     0, /* U+002512: BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT*/
+                                                     0, /* U+002513: BOX DRAWINGS HEAVY DOWN AND LEFT*/
+                                                     0, /* U+002514: BOX DRAWINGS LIGHT UP AND RIGHT*/
+                                                     0, /* U+002515: BOX DRAWINGS UP LIGHT AND RIGHT HEAVY*/
+                                                     0, /* U+002516: BOX DRAWINGS UP HEAVY AND RIGHT LIGHT*/
+                                                     0, /* U+002517: BOX DRAWINGS HEAVY UP AND RIGHT*/
+                                                     0, /* U+002518: BOX DRAWINGS LIGHT UP AND LEFT*/
+                                                     0, /* U+002519: BOX DRAWINGS UP LIGHT AND LEFT HEAVY*/
+                                                     0, /* U+00251a: BOX DRAWINGS UP HEAVY AND LEFT LIGHT*/
+                                                     0, /* U+00251b: BOX DRAWINGS HEAVY UP AND LEFT*/
+                                                     0, /* U+00251c: BOX DRAWINGS LIGHT VERTICAL AND RIGHT*/
+                                                     0, /* U+00251d: BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY*/
+                                                     0, /* U+00251e: BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT*/
+                                                     0, /* U+00251f: BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT*/
+                                                     0, /* U+002520: BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT*/
+                                                     0, /* U+002521: BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY*/
+                                                     0, /* U+002522: BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY*/
+                                                     0, /* U+002523: BOX DRAWINGS HEAVY VERTICAL AND RIGHT*/
+                                                     0, /* U+002524: BOX DRAWINGS LIGHT VERTICAL AND LEFT*/
+                                                     0, /* U+002525: BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY*/
+                                                     0, /* U+002526: BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT*/
+                                                     0, /* U+002527: BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT*/
+                                                     0, /* U+002528: BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT*/
+                                                     0, /* U+002529: BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY*/
+                                                     0, /* U+00252a: BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY*/
+                                                     0, /* U+00252b: BOX DRAWINGS HEAVY VERTICAL AND LEFT*/
+                                                     0, /* U+00252c: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL*/
+                                                     0, /* U+00252d: BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT*/
+                                                     0, /* U+00252e: BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT*/
+                                                     0, /* U+00252f: BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY*/
+                                                     0, /* U+002530: BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT*/
+                                                     0, /* U+002531: BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY*/
+                                                     0, /* U+002532: BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY*/
+                                                     0, /* U+002533: BOX DRAWINGS HEAVY DOWN AND HORIZONTAL*/
+                                                     0, /* U+002534: BOX DRAWINGS LIGHT UP AND HORIZONTAL*/
+                                                     0, /* U+002535: BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT*/
+                                                     0, /* U+002536: BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT*/
+                                                     0, /* U+002537: BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY*/
+                                                     0, /* U+002538: BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT*/
+                                                     0, /* U+002539: BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY*/
+                                                     0, /* U+00253a: BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY*/
+                                                     0, /* U+00253b: BOX DRAWINGS HEAVY UP AND HORIZONTAL*/
+                                                     0, /* U+00253c: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL*/
+                                                     0, /* U+00253d: BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT*/
+                                                     0, /* U+00253e: BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT*/
+                                                     0, /* U+00253f: BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY*/
+                                                     0, /* U+002540: BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT*/
+                                                     0, /* U+002541: BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT*/
+                                                     0, /* U+002542: BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT*/
+                                                     0, /* U+002543: BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT*/
+                                                     0, /* U+002544: BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT*/
+                                                     0, /* U+002545: BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT*/
+                                                     0, /* U+002546: BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT*/
+                                                     0, /* U+002547: BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY*/
+                                                     0, /* U+002548: BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY*/
+                                                     0, /* U+002549: BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY*/
+                                                     0, /* U+00254a: BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY*/
+                                                     0, /* U+00254b: BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL*/
+                                                     0, /* U+00254c: BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL*/
+                                                     0, /* U+00254d: BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL*/
+                                                     0, /* U+00254e: BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL*/
+                                                     0, /* U+00254f: BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL*/
+                                                     0, /* U+002550: BOX DRAWINGS DOUBLE HORIZONTAL*/
+                                                     0, /* U+002551: BOX DRAWINGS DOUBLE VERTICAL*/
+                                                     0, /* U+002552: BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE*/
+                                                     0, /* U+002553: BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE*/
+                                                     0, /* U+002554: BOX DRAWINGS DOUBLE DOWN AND RIGHT*/
+                                                     0, /* U+002555: BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE*/
+                                                     0, /* U+002556: BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE*/
+                                                     0, /* U+002557: BOX DRAWINGS DOUBLE DOWN AND LEFT*/
+                                                     0, /* U+002558: BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE*/
+                                                     0, /* U+002559: BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE*/
+                                                     0, /* U+00255a: BOX DRAWINGS DOUBLE UP AND RIGHT*/
+                                                     0, /* U+00255b: BOX DRAWINGS UP SINGLE AND LEFT DOUBLE*/
+                                                     0, /* U+00255c: BOX DRAWINGS UP DOUBLE AND LEFT SINGLE*/
+                                                     0, /* U+00255d: BOX DRAWINGS DOUBLE UP AND LEFT*/
+                                                     0, /* U+00255e: BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE*/
+                                                     0, /* U+00255f: BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE*/
+                                                     0, /* U+002560: BOX DRAWINGS DOUBLE VERTICAL AND RIGHT*/
+                                                     0, /* U+002561: BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE*/
+                                                     0, /* U+002562: BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE*/
+                                                     0, /* U+002563: BOX DRAWINGS DOUBLE VERTICAL AND LEFT*/
+                                                     0, /* U+002564: BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE*/
+                                                     0, /* U+002565: BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE*/
+                                                     0, /* U+002566: BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL*/
+                                                     0, /* U+002567: BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE*/
+                                                     0, /* U+002568: BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE*/
+                                                     0, /* U+002569: BOX DRAWINGS DOUBLE UP AND HORIZONTAL*/
+                                                     0, /* U+00256a: BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE*/
+                                                     0, /* U+00256b: BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE*/
+                                                     0, /* U+00256c: BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL*/
+                                                     0, /* U+00256d: BOX DRAWINGS LIGHT ARC DOWN AND RIGHT*/
+                                                     0, /* U+00256e: BOX DRAWINGS LIGHT ARC DOWN AND LEFT*/
+                                                     0, /* U+00256f: BOX DRAWINGS LIGHT ARC UP AND LEFT*/
+                                                     0, /* U+002570: BOX DRAWINGS LIGHT ARC UP AND RIGHT*/
+                                                     0, /* U+002571: BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT*/
+                                                     0, /* U+002572: BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT*/
+                                                     0, /* U+002573: BOX DRAWINGS LIGHT DIAGONAL CROSS*/
+                                                     0, /* U+002574: BOX DRAWINGS LIGHT LEFT*/
+                                                     0, /* U+002575: BOX DRAWINGS LIGHT UP*/
+                                                     0, /* U+002576: BOX DRAWINGS LIGHT RIGHT*/
+                                                     0, /* U+002577: BOX DRAWINGS LIGHT DOWN*/
+                                                     0, /* U+002578: BOX DRAWINGS HEAVY LEFT*/
+                                                     0, /* U+002579: BOX DRAWINGS HEAVY UP*/
+                                                     0, /* U+00257a: BOX DRAWINGS HEAVY RIGHT*/
+                                                     0, /* U+00257b: BOX DRAWINGS HEAVY DOWN*/
+                                                     0, /* U+00257c: BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT*/
+                                                     0, /* U+00257d: BOX DRAWINGS LIGHT UP AND HEAVY DOWN*/
+                                                     0, /* U+00257e: BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT*/
+                                                     0, /* U+00257f: BOX DRAWINGS HEAVY UP AND LIGHT DOWN*/
+                                                     0, /* U+002580: UPPER HALF BLOCK*/
+                                                     0, /* U+002581: LOWER ONE EIGHTH BLOCK*/
+                                                     0, /* U+002582: LOWER ONE QUARTER BLOCK*/
+                                                     0, /* U+002583: LOWER THREE EIGHTHS BLOCK*/
+                                                     0, /* U+002584: LOWER HALF BLOCK*/
+                                                     0, /* U+002585: LOWER FIVE EIGHTHS BLOCK*/
+                                                     0, /* U+002586: LOWER THREE QUARTERS BLOCK*/
+                                                     0, /* U+002587: LOWER SEVEN EIGHTHS BLOCK*/
+                                                     0, /* U+002588: FULL BLOCK*/
+                                                     0, /* U+002589: LEFT SEVEN EIGHTHS BLOCK*/
+                                                     0, /* U+00258a: LEFT THREE QUARTERS BLOCK*/
+                                                     0, /* U+00258b: LEFT FIVE EIGHTHS BLOCK*/
+                                                     0, /* U+00258c: LEFT HALF BLOCK*/
+                                                     0, /* U+00258d: LEFT THREE EIGHTHS BLOCK*/
+                                                     0, /* U+00258e: LEFT ONE QUARTER BLOCK*/
+                                                     0, /* U+00258f: LEFT ONE EIGHTH BLOCK*/
+                                                     0, /* U+002590: RIGHT HALF BLOCK*/
+                                                     0, /* U+002591: LIGHT SHADE*/
+                                                     0, /* U+002592: MEDIUM SHADE*/
+                                                     0, /* U+002593: DARK SHADE*/
+                                                     0, /* U+002594: UPPER ONE EIGHTH BLOCK*/
+                                                     0, /* U+002595: RIGHT ONE EIGHTH BLOCK*/
+                                                     0, /* U+002596: QUADRANT LOWER LEFT*/
+                                                     0, /* U+002597: QUADRANT LOWER RIGHT*/
+                                                     0, /* U+002598: QUADRANT UPPER LEFT*/
+                                                     0, /* U+002599: QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT*/
+                                                     0, /* U+00259a: QUADRANT UPPER LEFT AND LOWER RIGHT*/
+                                                     0, /* U+00259b: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT*/
+                                                     0, /* U+00259c: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT*/
+                                                     0, /* U+00259d: QUADRANT UPPER RIGHT*/
+                                                     0, /* U+00259e: QUADRANT UPPER RIGHT AND LOWER LEFT*/
+                                                     0, /* U+00259f: QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT*/
+                                                     0, /* U+0025a0: BLACK SQUARE*/
+                                                     0, /* U+0025a1: WHITE SQUARE*/
+                                                     0, /* U+0025a2: WHITE SQUARE WITH ROUNDED CORNERS*/
+                                                     0, /* U+0025a3: WHITE SQUARE CONTAINING BLACK SMALL SQUARE*/
+                                                     0, /* U+0025a4: SQUARE WITH HORIZONTAL FILL*/
+                                                     0, /* U+0025a5: SQUARE WITH VERTICAL FILL*/
+                                                     0, /* U+0025a6: SQUARE WITH ORTHOGONAL CROSSHATCH FILL*/
+                                                     0, /* U+0025a7: SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL*/
+                                                     0, /* U+0025a8: SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL*/
+                                                     0, /* U+0025a9: SQUARE WITH DIAGONAL CROSSHATCH FILL*/
+                                                     0, /* U+0025aa: BLACK SMALL SQUARE*/
+                                                     0, /* U+0025ab: WHITE SMALL SQUARE*/
+                                                     0, /* U+0025ac: BLACK RECTANGLE*/
+                                                     0, /* U+0025ad: WHITE RECTANGLE*/
+                                                     0, /* U+0025ae: BLACK VERTICAL RECTANGLE*/
+                                                     0, /* U+0025af: WHITE VERTICAL RECTANGLE*/
+                                                     0, /* U+0025b0: BLACK PARALLELOGRAM*/
+                                                     0, /* U+0025b1: WHITE PARALLELOGRAM*/
+                                                     0, /* U+0025b2: BLACK UP-POINTING TRIANGLE*/
+                                                     0, /* U+0025b3: WHITE UP-POINTING TRIANGLE*/
+                                                     0, /* U+0025b4: BLACK UP-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025b5: WHITE UP-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025b6: BLACK RIGHT-POINTING TRIANGLE*/
+                                                     0, /* U+0025b7: WHITE RIGHT-POINTING TRIANGLE*/
+                                                     0, /* U+0025b8: BLACK RIGHT-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025b9: WHITE RIGHT-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025ba: BLACK RIGHT-POINTING POINTER*/
+                                                     0, /* U+0025bb: WHITE RIGHT-POINTING POINTER*/
+                                                     0, /* U+0025bc: BLACK DOWN-POINTING TRIANGLE*/
+                                                     0, /* U+0025bd: WHITE DOWN-POINTING TRIANGLE*/
+                                                     0, /* U+0025be: BLACK DOWN-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025bf: WHITE DOWN-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025c0: BLACK LEFT-POINTING TRIANGLE*/
+                                                     0, /* U+0025c1: WHITE LEFT-POINTING TRIANGLE*/
+                                                     0, /* U+0025c2: BLACK LEFT-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025c3: WHITE LEFT-POINTING SMALL TRIANGLE*/
+                                                     0, /* U+0025c4: BLACK LEFT-POINTING POINTER*/
+                                                     0, /* U+0025c5: WHITE LEFT-POINTING POINTER*/
+                                                     0, /* U+0025c6: BLACK DIAMOND*/
+                                                     0, /* U+0025c7: WHITE DIAMOND*/
+                                                     0, /* U+0025c8: WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND*/
+                                                     0, /* U+0025c9: FISHEYE*/
+                                                     0, /* U+0025ca: LOZENGE*/
+                                                     0, /* U+0025cb: WHITE CIRCLE*/
+                                                     0, /* U+0025cc: DOTTED CIRCLE*/
+                                                     0, /* U+0025cd: CIRCLE WITH VERTICAL FILL*/
+                                                     0, /* U+0025ce: BULLSEYE*/
+                                                     0, /* U+0025cf: BLACK CIRCLE*/
+                                                     0, /* U+0025d0: CIRCLE WITH LEFT HALF BLACK*/
+                                                     0, /* U+0025d1: CIRCLE WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0025d2: CIRCLE WITH LOWER HALF BLACK*/
+                                                     0, /* U+0025d3: CIRCLE WITH UPPER HALF BLACK*/
+                                                     0, /* U+0025d4: CIRCLE WITH UPPER RIGHT QUADRANT BLACK*/
+                                                     0, /* U+0025d5: CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK*/
+                                                     0, /* U+0025d6: LEFT HALF BLACK CIRCLE*/
+                                                     0, /* U+0025d7: RIGHT HALF BLACK CIRCLE*/
+                                                     0, /* U+0025d8: INVERSE BULLET*/
+                                                     0, /* U+0025d9: INVERSE WHITE CIRCLE*/
+                                                     0, /* U+0025da: UPPER HALF INVERSE WHITE CIRCLE*/
+                                                     0, /* U+0025db: LOWER HALF INVERSE WHITE CIRCLE*/
+                                                     0, /* U+0025dc: UPPER LEFT QUADRANT CIRCULAR ARC*/
+                                                     0, /* U+0025dd: UPPER RIGHT QUADRANT CIRCULAR ARC*/
+                                                     0, /* U+0025de: LOWER RIGHT QUADRANT CIRCULAR ARC*/
+                                                     0, /* U+0025df: LOWER LEFT QUADRANT CIRCULAR ARC*/
+                                                     0, /* U+0025e0: UPPER HALF CIRCLE*/
+                                                     0, /* U+0025e1: LOWER HALF CIRCLE*/
+                                                     0, /* U+0025e2: BLACK LOWER RIGHT TRIANGLE*/
+                                                     0, /* U+0025e3: BLACK LOWER LEFT TRIANGLE*/
+                                                     0, /* U+0025e4: BLACK UPPER LEFT TRIANGLE*/
+                                                     0, /* U+0025e5: BLACK UPPER RIGHT TRIANGLE*/
+                                                     0, /* U+0025e6: WHITE BULLET*/
+                                                     0, /* U+0025e7: SQUARE WITH LEFT HALF BLACK*/
+                                                     0, /* U+0025e8: SQUARE WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0025e9: SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK*/
+                                                     0, /* U+0025ea: SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK*/
+                                                     0, /* U+0025eb: WHITE SQUARE WITH VERTICAL BISECTING LINE*/
+                                                     0, /* U+0025ec: WHITE UP-POINTING TRIANGLE WITH DOT*/
+                                                     0, /* U+0025ed: UP-POINTING TRIANGLE WITH LEFT HALF BLACK*/
+                                                     0, /* U+0025ee: UP-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0025ef: LARGE CIRCLE*/
+                                                     0, /* U+0025f0: WHITE SQUARE WITH UPPER LEFT QUADRANT*/
+                                                     0, /* U+0025f1: WHITE SQUARE WITH LOWER LEFT QUADRANT*/
+                                                     0, /* U+0025f2: WHITE SQUARE WITH LOWER RIGHT QUADRANT*/
+                                                     0, /* U+0025f3: WHITE SQUARE WITH UPPER RIGHT QUADRANT*/
+                                                     0, /* U+0025f4: WHITE CIRCLE WITH UPPER LEFT QUADRANT*/
+                                                     0, /* U+0025f5: WHITE CIRCLE WITH LOWER LEFT QUADRANT*/
+                                                     0, /* U+0025f6: WHITE CIRCLE WITH LOWER RIGHT QUADRANT*/
+                                                     0, /* U+0025f7: WHITE CIRCLE WITH UPPER RIGHT QUADRANT*/
+                                                     0, /* U+0025f8: UPPER LEFT TRIANGLE*/
+                                                     0, /* U+0025f9: UPPER RIGHT TRIANGLE*/
+                                                     0, /* U+0025fa: LOWER LEFT TRIANGLE*/
+                                                     0, /* U+0025fb: WHITE MEDIUM SQUARE*/
+                                                     0, /* U+0025fc: BLACK MEDIUM SQUARE*/
+                                                     0, /* U+0025fd: WHITE MEDIUM SMALL SQUARE*/
+                                                     0, /* U+0025fe: BLACK MEDIUM SMALL SQUARE*/
+                                                     0, /* U+0025ff: LOWER RIGHT TRIANGLE*/
+                                                     0, /* U+002600: BLACK SUN WITH RAYS*/
+                                                     0, /* U+002601: CLOUD*/
+                                                     0, /* U+002602: UMBRELLA*/
+                                                     0, /* U+002603: SNOWMAN*/
+                                                     0, /* U+002604: COMET*/
+                                                     0, /* U+002605: BLACK STAR*/
+                                                     0, /* U+002606: WHITE STAR*/
+                                                     0, /* U+002607: LIGHTNING*/
+                                                     0, /* U+002608: THUNDERSTORM*/
+                                                     0, /* U+002609: SUN*/
+                                                     0, /* U+00260a: ASCENDING NODE*/
+                                                     0, /* U+00260b: DESCENDING NODE*/
+                                                     0, /* U+00260c: CONJUNCTION*/
+                                                     0, /* U+00260d: OPPOSITION*/
+                                                     0, /* U+00260e: BLACK TELEPHONE*/
+                                                     0, /* U+00260f: WHITE TELEPHONE*/
+                                                     0, /* U+002610: BALLOT BOX*/
+                                                     0, /* U+002611: BALLOT BOX WITH CHECK*/
+                                                     0, /* U+002612: BALLOT BOX WITH X*/
+                                                     0, /* U+002613: SALTIRE*/
+                                                     0, /* U+002614: UMBRELLA WITH RAIN DROPS*/
+                                                     0, /* U+002615: HOT BEVERAGE*/
+                                                     0, /* U+002616: WHITE SHOGI PIECE*/
+                                                     0, /* U+002617: BLACK SHOGI PIECE*/
+                                                     0, /* U+002618: SHAMROCK*/
+                                                     0, /* U+002619: REVERSED ROTATED FLORAL HEART BULLET*/
+                                                     0, /* U+00261a: BLACK LEFT POINTING INDEX*/
+                                                     0, /* U+00261b: BLACK RIGHT POINTING INDEX*/
+                                                     0, /* U+00261c: WHITE LEFT POINTING INDEX*/
+                                                     0, /* U+00261d: WHITE UP POINTING INDEX*/
+                                                     0, /* U+00261e: WHITE RIGHT POINTING INDEX*/
+                                                     0, /* U+00261f: WHITE DOWN POINTING INDEX*/
+                                                     0, /* U+002620: SKULL AND CROSSBONES*/
+                                                     0, /* U+002621: CAUTION SIGN*/
+                                                     0, /* U+002622: RADIOACTIVE SIGN*/
+                                                     0, /* U+002623: BIOHAZARD SIGN*/
+                                                     0, /* U+002624: CADUCEUS*/
+                                                     0, /* U+002625: ANKH*/
+                                                     0, /* U+002626: ORTHODOX CROSS*/
+                                                     0, /* U+002627: CHI RHO*/
+                                                     0, /* U+002628: CROSS OF LORRAINE*/
+                                                     0, /* U+002629: CROSS OF JERUSALEM*/
+                                                     0, /* U+00262a: STAR AND CRESCENT*/
+                                                     0, /* U+00262b: FARSI SYMBOL*/
+                                                     0, /* U+00262c: ADI SHAKTI*/
+                                                     0, /* U+00262d: HAMMER AND SICKLE*/
+                                                     0, /* U+00262e: PEACE SYMBOL*/
+                                                     0, /* U+00262f: YIN YANG*/
+                                                     0, /* U+002630: TRIGRAM FOR HEAVEN*/
+                                                     0, /* U+002631: TRIGRAM FOR LAKE*/
+                                                     0, /* U+002632: TRIGRAM FOR FIRE*/
+                                                     0, /* U+002633: TRIGRAM FOR THUNDER*/
+                                                     0, /* U+002634: TRIGRAM FOR WIND*/
+                                                     0, /* U+002635: TRIGRAM FOR WATER*/
+                                                     0, /* U+002636: TRIGRAM FOR MOUNTAIN*/
+                                                     0, /* U+002637: TRIGRAM FOR EARTH*/
+                                                     0, /* U+002638: WHEEL OF DHARMA*/
+                                                     0, /* U+002639: WHITE FROWNING FACE*/
+                                                     0, /* U+00263a: WHITE SMILING FACE*/
+                                                     0, /* U+00263b: BLACK SMILING FACE*/
+                                                     0, /* U+00263c: WHITE SUN WITH RAYS*/
+                                                     0, /* U+00263d: FIRST QUARTER MOON*/
+                                                     0, /* U+00263e: LAST QUARTER MOON*/
+                                                     0, /* U+00263f: MERCURY*/
+                                                     0, /* U+002640: FEMALE SIGN*/
+                                                     0, /* U+002641: EARTH*/
+                                                     0, /* U+002642: MALE SIGN*/
+                                                     0, /* U+002643: JUPITER*/
+                                                     0, /* U+002644: SATURN*/
+                                                     0, /* U+002645: URANUS*/
+                                                     0, /* U+002646: NEPTUNE*/
+                                                     0, /* U+002647: PLUTO*/
+                                                     0, /* U+002648: ARIES*/
+                                                     0, /* U+002649: TAURUS*/
+                                                     0, /* U+00264a: GEMINI*/
+                                                     0, /* U+00264b: CANCER*/
+                                                     0, /* U+00264c: LEO*/
+                                                     0, /* U+00264d: VIRGO*/
+                                                     0, /* U+00264e: LIBRA*/
+                                                     0, /* U+00264f: SCORPIUS*/
+                                                     0, /* U+002650: SAGITTARIUS*/
+                                                     0, /* U+002651: CAPRICORN*/
+                                                     0, /* U+002652: AQUARIUS*/
+                                                     0, /* U+002653: PISCES*/
+                                                     0, /* U+002654: WHITE CHESS KING*/
+                                                     0, /* U+002655: WHITE CHESS QUEEN*/
+                                                     0, /* U+002656: WHITE CHESS ROOK*/
+                                                     0, /* U+002657: WHITE CHESS BISHOP*/
+                                                     0, /* U+002658: WHITE CHESS KNIGHT*/
+                                                     0, /* U+002659: WHITE CHESS PAWN*/
+                                                     0, /* U+00265a: BLACK CHESS KING*/
+                                                     0, /* U+00265b: BLACK CHESS QUEEN*/
+                                                     0, /* U+00265c: BLACK CHESS ROOK*/
+                                                     0, /* U+00265d: BLACK CHESS BISHOP*/
+                                                     0, /* U+00265e: BLACK CHESS KNIGHT*/
+                                                     0, /* U+00265f: BLACK CHESS PAWN*/
+                                                     0, /* U+002660: BLACK SPADE SUIT*/
+                                                     0, /* U+002661: WHITE HEART SUIT*/
+                                                     0, /* U+002662: WHITE DIAMOND SUIT*/
+                                                     0, /* U+002663: BLACK CLUB SUIT*/
+                                                     0, /* U+002664: WHITE SPADE SUIT*/
+                                                     0, /* U+002665: BLACK HEART SUIT*/
+                                                     0, /* U+002666: BLACK DIAMOND SUIT*/
+                                                     0, /* U+002667: WHITE CLUB SUIT*/
+                                                     0, /* U+002668: HOT SPRINGS*/
+                                                     0, /* U+002669: QUARTER NOTE*/
+                                                     0, /* U+00266a: EIGHTH NOTE*/
+                                                     0, /* U+00266b: BEAMED EIGHTH NOTES*/
+                                                     0, /* U+00266c: BEAMED SIXTEENTH NOTES*/
+                                                     0, /* U+00266d: MUSIC FLAT SIGN*/
+                                                     0, /* U+00266e: MUSIC NATURAL SIGN*/
+                                                     0, /* U+00266f: MUSIC SHARP SIGN*/
+                                                     0, /* U+002670: WEST SYRIAC CROSS*/
+                                                     0, /* U+002671: EAST SYRIAC CROSS*/
+                                                     0, /* U+002672: UNIVERSAL RECYCLING SYMBOL*/
+                                                     0, /* U+002673: RECYCLING SYMBOL FOR TYPE-1 PLASTICS*/
+                                                     0, /* U+002674: RECYCLING SYMBOL FOR TYPE-2 PLASTICS*/
+                                                     0, /* U+002675: RECYCLING SYMBOL FOR TYPE-3 PLASTICS*/
+                                                     0, /* U+002676: RECYCLING SYMBOL FOR TYPE-4 PLASTICS*/
+                                                     0, /* U+002677: RECYCLING SYMBOL FOR TYPE-5 PLASTICS*/
+                                                     0, /* U+002678: RECYCLING SYMBOL FOR TYPE-6 PLASTICS*/
+                                                     0, /* U+002679: RECYCLING SYMBOL FOR TYPE-7 PLASTICS*/
+                                                     0, /* U+00267a: RECYCLING SYMBOL FOR GENERIC MATERIALS*/
+                                                     0, /* U+00267b: BLACK UNIVERSAL RECYCLING SYMBOL*/
+                                                     0, /* U+00267c: RECYCLED PAPER SYMBOL*/
+                                                     0, /* U+00267d: PARTIALLY-RECYCLED PAPER SYMBOL*/
+                                                     0, /* U+00267e: PERMANENT PAPER SIGN*/
+                                                     0, /* U+00267f: WHEELCHAIR SYMBOL*/
+                                                     0, /* U+002680: DIE FACE-1*/
+                                                     0, /* U+002681: DIE FACE-2*/
+                                                     0, /* U+002682: DIE FACE-3*/
+                                                     0, /* U+002683: DIE FACE-4*/
+                                                     0, /* U+002684: DIE FACE-5*/
+                                                     0, /* U+002685: DIE FACE-6*/
+                                                     0, /* U+002686: WHITE CIRCLE WITH DOT RIGHT*/
+                                                     0, /* U+002687: WHITE CIRCLE WITH TWO DOTS*/
+                                                     0, /* U+002688: BLACK CIRCLE WITH WHITE DOT RIGHT*/
+                                                     0, /* U+002689: BLACK CIRCLE WITH TWO WHITE DOTS*/
+                                                     0, /* U+00268a: MONOGRAM FOR YANG*/
+                                                     0, /* U+00268b: MONOGRAM FOR YIN*/
+                                                     0, /* U+00268c: DIGRAM FOR GREATER YANG*/
+                                                     0, /* U+00268d: DIGRAM FOR LESSER YIN*/
+                                                     0, /* U+00268e: DIGRAM FOR LESSER YANG*/
+                                                     0, /* U+00268f: DIGRAM FOR GREATER YIN*/
+                                                     0, /* U+002690: WHITE FLAG*/
+                                                     0, /* U+002691: BLACK FLAG*/
+                                                     0, /* U+002692: HAMMER AND PICK*/
+                                                     0, /* U+002693: ANCHOR*/
+                                                     0, /* U+002694: CROSSED SWORDS*/
+                                                     0, /* U+002695: STAFF OF AESCULAPIUS*/
+                                                     0, /* U+002696: SCALES*/
+                                                     0, /* U+002697: ALEMBIC*/
+                                                     0, /* U+002698: FLOWER*/
+                                                     0, /* U+002699: GEAR*/
+                                                     0, /* U+00269a: STAFF OF HERMES*/
+                                                     0, /* U+00269b: ATOM SYMBOL*/
+                                                     0, /* U+00269c: FLEUR-DE-LIS*/
+                                                     0, /* U+00269d: OUTLINED WHITE STAR*/
+                                                     0, /* U+00269e: THREE LINES CONVERGING RIGHT*/
+                                                     0, /* U+00269f: THREE LINES CONVERGING LEFT*/
+                                                     0, /* U+0026a0: WARNING SIGN*/
+                                                     0, /* U+0026a1: HIGH VOLTAGE SIGN*/
+                                                     0, /* U+0026a2: DOUBLED FEMALE SIGN*/
+                                                     0, /* U+0026a3: DOUBLED MALE SIGN*/
+                                                     0, /* U+0026a4: INTERLOCKED FEMALE AND MALE SIGN*/
+                                                     0, /* U+0026a5: MALE AND FEMALE SIGN*/
+                                                     0, /* U+0026a6: MALE WITH STROKE SIGN*/
+                                                     0, /* U+0026a7: MALE WITH STROKE AND MALE AND FEMALE SIGN*/
+                                                     0, /* U+0026a8: VERTICAL MALE WITH STROKE SIGN*/
+                                                     0, /* U+0026a9: HORIZONTAL MALE WITH STROKE SIGN*/
+                                                     0, /* U+0026aa: MEDIUM WHITE CIRCLE*/
+                                                     0, /* U+0026ab: MEDIUM BLACK CIRCLE*/
+                                                     0, /* U+0026ac: MEDIUM SMALL WHITE CIRCLE*/
+                                                     0, /* U+0026ad: MARRIAGE SYMBOL*/
+                                                     0, /* U+0026ae: DIVORCE SYMBOL*/
+                                                     0, /* U+0026af: UNMARRIED PARTNERSHIP SYMBOL*/
+                                                     0, /* U+0026b0: COFFIN*/
+                                                     0, /* U+0026b1: FUNERAL URN*/
+                                                     0, /* U+0026b2: NEUTER*/
+                                                     0, /* U+0026b3: CERES*/
+                                                     0, /* U+0026b4: PALLAS*/
+                                                     0, /* U+0026b5: JUNO*/
+                                                     0, /* U+0026b6: VESTA*/
+                                                     0, /* U+0026b7: CHIRON*/
+                                                     0, /* U+0026b8: BLACK MOON LILITH*/
+                                                     0, /* U+0026b9: SEXTILE*/
+                                                     0, /* U+0026ba: SEMISEXTILE*/
+                                                     0, /* U+0026bb: QUINCUNX*/
+                                                     0, /* U+0026bc: SESQUIQUADRATE*/
+                                                     0, /* U+0026bd: SOCCER BALL*/
+                                                     0, /* U+0026be: BASEBALL*/
+                                                     0, /* U+0026bf: SQUARED KEY*/
+                                                     0, /* U+0026c0: WHITE DRAUGHTS MAN*/
+                                                     0, /* U+0026c1: WHITE DRAUGHTS KING*/
+                                                     0, /* U+0026c2: BLACK DRAUGHTS MAN*/
+                                                     0, /* U+0026c3: BLACK DRAUGHTS KING*/
+                                                     0, /* U+0026c4: SNOWMAN WITHOUT SNOW*/
+                                                     0, /* U+0026c5: SUN BEHIND CLOUD*/
+                                                     0, /* U+0026c6: RAIN*/
+                                                     0, /* U+0026c7: BLACK SNOWMAN*/
+                                                     0, /* U+0026c8: THUNDER CLOUD AND RAIN*/
+                                                     0, /* U+0026c9: TURNED WHITE SHOGI PIECE*/
+                                                     0, /* U+0026ca: TURNED BLACK SHOGI PIECE*/
+                                                     0, /* U+0026cb: WHITE DIAMOND IN SQUARE*/
+                                                     0, /* U+0026cc: CROSSING LANES*/
+                                                     0, /* U+0026cd: DISABLED CAR*/
+                                                     0, /* U+0026ce: OPHIUCHUS*/
+                                                     0, /* U+0026cf: PICK*/
+                                                     0, /* U+0026d0: CAR SLIDING*/
+                                                     0, /* U+0026d1: HELMET WITH WHITE CROSS*/
+                                                     0, /* U+0026d2: CIRCLED CROSSING LANES*/
+                                                     0, /* U+0026d3: CHAINS*/
+                                                     0, /* U+0026d4: NO ENTRY*/
+                                                     0, /* U+0026d5: ALTERNATE ONE-WAY LEFT WAY TRAFFIC*/
+                                                     0, /* U+0026d6: BLACK TWO-WAY LEFT WAY TRAFFIC*/
+                                                     0, /* U+0026d7: WHITE TWO-WAY LEFT WAY TRAFFIC*/
+                                                     0, /* U+0026d8: BLACK LEFT LANE MERGE*/
+                                                     0, /* U+0026d9: WHITE LEFT LANE MERGE*/
+                                                     0, /* U+0026da: DRIVE SLOW SIGN*/
+                                                     0, /* U+0026db: HEAVY WHITE DOWN-POINTING TRIANGLE*/
+                                                     0, /* U+0026dc: LEFT CLOSED ENTRY*/
+                                                     0, /* U+0026dd: SQUARED SALTIRE*/
+                                                     0, /* U+0026de: FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE*/
+                                                     0, /* U+0026df: BLACK TRUCK*/
+                                                     0, /* U+0026e0: RESTRICTED LEFT ENTRY-1*/
+                                                     0, /* U+0026e1: RESTRICTED LEFT ENTRY-2*/
+                                                     0, /* U+0026e2: ASTRONOMICAL SYMBOL FOR URANUS*/
+                                                     0, /* U+0026e3: HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE*/
+                                                     0, /* U+0026e4: PENTAGRAM*/
+                                                     0, /* U+0026e5: RIGHT-HANDED INTERLACED PENTAGRAM*/
+                                                     0, /* U+0026e6: LEFT-HANDED INTERLACED PENTAGRAM*/
+                                                     0, /* U+0026e7: INVERTED PENTAGRAM*/
+                                                     0, /* U+0026e8: BLACK CROSS ON SHIELD*/
+                                                     0, /* U+0026e9: SHINTO SHRINE*/
+                                                     0, /* U+0026ea: CHURCH*/
+                                                     0, /* U+0026eb: CASTLE*/
+                                                     0, /* U+0026ec: HISTORIC SITE*/
+                                                     0, /* U+0026ed: GEAR WITHOUT HUB*/
+                                                     0, /* U+0026ee: GEAR WITH HANDLES*/
+                                                     0, /* U+0026ef: MAP SYMBOL FOR LIGHTHOUSE*/
+                                                     0, /* U+0026f0: MOUNTAIN*/
+                                                     0, /* U+0026f1: UMBRELLA ON GROUND*/
+                                                     0, /* U+0026f2: FOUNTAIN*/
+                                                     0, /* U+0026f3: FLAG IN HOLE*/
+                                                     0, /* U+0026f4: FERRY*/
+                                                     0, /* U+0026f5: SAILBOAT*/
+                                                     0, /* U+0026f6: SQUARE FOUR CORNERS*/
+                                                     0, /* U+0026f7: SKIER*/
+                                                     0, /* U+0026f8: ICE SKATE*/
+                                                     0, /* U+0026f9: PERSON WITH BALL*/
+                                                     0, /* U+0026fa: TENT*/
+                                                     0, /* U+0026fb: JAPANESE BANK SYMBOL*/
+                                                     0, /* U+0026fc: HEADSTONE GRAVEYARD SYMBOL*/
+                                                     0, /* U+0026fd: FUEL PUMP*/
+                                                     0, /* U+0026fe: CUP ON BLACK SQUARE*/
+                                                     0, /* U+0026ff: WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE*/
+                                                     0, /* U+002700: */
+                                                     0, /* U+002701: UPPER BLADE SCISSORS*/
+                                                     0, /* U+002702: BLACK SCISSORS*/
+                                                     0, /* U+002703: LOWER BLADE SCISSORS*/
+                                                     0, /* U+002704: WHITE SCISSORS*/
+                                                     0, /* U+002705: WHITE HEAVY CHECK MARK*/
+                                                     0, /* U+002706: TELEPHONE LOCATION SIGN*/
+                                                     0, /* U+002707: TAPE DRIVE*/
+                                                     0, /* U+002708: AIRPLANE*/
+                                                     0, /* U+002709: ENVELOPE*/
+                                                     0, /* U+00270a: RAISED FIST*/
+                                                     0, /* U+00270b: RAISED HAND*/
+                                                     0, /* U+00270c: VICTORY HAND*/
+                                                     0, /* U+00270d: WRITING HAND*/
+                                                     0, /* U+00270e: LOWER RIGHT PENCIL*/
+                                                     0, /* U+00270f: PENCIL*/
+                                                     0, /* U+002710: UPPER RIGHT PENCIL*/
+                                                     0, /* U+002711: WHITE NIB*/
+                                                     0, /* U+002712: BLACK NIB*/
+                                                     0, /* U+002713: CHECK MARK*/
+                                                     0, /* U+002714: HEAVY CHECK MARK*/
+                                                     0, /* U+002715: MULTIPLICATION X*/
+                                                     0, /* U+002716: HEAVY MULTIPLICATION X*/
+                                                     0, /* U+002717: BALLOT X*/
+                                                     0, /* U+002718: HEAVY BALLOT X*/
+                                                     0, /* U+002719: OUTLINED GREEK CROSS*/
+                                                     0, /* U+00271a: HEAVY GREEK CROSS*/
+                                                     0, /* U+00271b: OPEN CENTRE CROSS*/
+                                                     0, /* U+00271c: HEAVY OPEN CENTRE CROSS*/
+                                                     0, /* U+00271d: LATIN CROSS*/
+                                                     0, /* U+00271e: SHADOWED WHITE LATIN CROSS*/
+                                                     0, /* U+00271f: OUTLINED LATIN CROSS*/
+                                                     0, /* U+002720: MALTESE CROSS*/
+                                                     0, /* U+002721: STAR OF DAVID*/
+                                                     0, /* U+002722: FOUR TEARDROP-SPOKED ASTERISK*/
+                                                     0, /* U+002723: FOUR BALLOON-SPOKED ASTERISK*/
+                                                     0, /* U+002724: HEAVY FOUR BALLOON-SPOKED ASTERISK*/
+                                                     0, /* U+002725: FOUR CLUB-SPOKED ASTERISK*/
+                                                     0, /* U+002726: BLACK FOUR POINTED STAR*/
+                                                     0, /* U+002727: WHITE FOUR POINTED STAR*/
+                                                     0, /* U+002728: SPARKLES*/
+                                                     0, /* U+002729: STRESS OUTLINED WHITE STAR*/
+                                                     0, /* U+00272a: CIRCLED WHITE STAR*/
+                                                     0, /* U+00272b: OPEN CENTRE BLACK STAR*/
+                                                     0, /* U+00272c: BLACK CENTRE WHITE STAR*/
+                                                     0, /* U+00272d: OUTLINED BLACK STAR*/
+                                                     0, /* U+00272e: HEAVY OUTLINED BLACK STAR*/
+                                                     0, /* U+00272f: PINWHEEL STAR*/
+                                                     0, /* U+002730: SHADOWED WHITE STAR*/
+                                                     0, /* U+002731: HEAVY ASTERISK*/
+                                                     0, /* U+002732: OPEN CENTRE ASTERISK*/
+                                                     0, /* U+002733: EIGHT SPOKED ASTERISK*/
+                                                     0, /* U+002734: EIGHT POINTED BLACK STAR*/
+                                                     0, /* U+002735: EIGHT POINTED PINWHEEL STAR*/
+                                                     0, /* U+002736: SIX POINTED BLACK STAR*/
+                                                     0, /* U+002737: EIGHT POINTED RECTILINEAR BLACK STAR*/
+                                                     0, /* U+002738: HEAVY EIGHT POINTED RECTILINEAR BLACK STAR*/
+                                                     0, /* U+002739: TWELVE POINTED BLACK STAR*/
+                                                     0, /* U+00273a: SIXTEEN POINTED ASTERISK*/
+                                                     0, /* U+00273b: TEARDROP-SPOKED ASTERISK*/
+                                                     0, /* U+00273c: OPEN CENTRE TEARDROP-SPOKED ASTERISK*/
+                                                     0, /* U+00273d: HEAVY TEARDROP-SPOKED ASTERISK*/
+                                                     0, /* U+00273e: SIX PETALLED BLACK AND WHITE FLORETTE*/
+                                                     0, /* U+00273f: BLACK FLORETTE*/
+                                                     0, /* U+002740: WHITE FLORETTE*/
+                                                     0, /* U+002741: EIGHT PETALLED OUTLINED BLACK FLORETTE*/
+                                                     0, /* U+002742: CIRCLED OPEN CENTRE EIGHT POINTED STAR*/
+                                                     0, /* U+002743: HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK*/
+                                                     0, /* U+002744: SNOWFLAKE*/
+                                                     0, /* U+002745: TIGHT TRIFOLIATE SNOWFLAKE*/
+                                                     0, /* U+002746: HEAVY CHEVRON SNOWFLAKE*/
+                                                     0, /* U+002747: SPARKLE*/
+                                                     0, /* U+002748: HEAVY SPARKLE*/
+                                                     0, /* U+002749: BALLOON-SPOKED ASTERISK*/
+                                                     0, /* U+00274a: EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
+                                                     0, /* U+00274b: HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
+                                                     0, /* U+00274c: CROSS MARK*/
+                                                     0, /* U+00274d: SHADOWED WHITE CIRCLE*/
+                                                     0, /* U+00274e: NEGATIVE SQUARED CROSS MARK*/
+                                                     0, /* U+00274f: LOWER RIGHT DROP-SHADOWED WHITE SQUARE*/
+                                                     0, /* U+002750: UPPER RIGHT DROP-SHADOWED WHITE SQUARE*/
+                                                     0, /* U+002751: LOWER RIGHT SHADOWED WHITE SQUARE*/
+                                                     0, /* U+002752: UPPER RIGHT SHADOWED WHITE SQUARE*/
+                                                     0, /* U+002753: BLACK QUESTION MARK ORNAMENT*/
+                                                     0, /* U+002754: WHITE QUESTION MARK ORNAMENT*/
+                                                     0, /* U+002755: WHITE EXCLAMATION MARK ORNAMENT*/
+                                                     0, /* U+002756: BLACK DIAMOND MINUS WHITE X*/
+                                                     0, /* U+002757: HEAVY EXCLAMATION MARK SYMBOL*/
+                                                     0, /* U+002758: LIGHT VERTICAL BAR*/
+                                                     0, /* U+002759: MEDIUM VERTICAL BAR*/
+                                                     0, /* U+00275a: HEAVY VERTICAL BAR*/
+                                                     0, /* U+00275b: HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+00275c: HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+00275d: HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+00275e: HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+00275f: HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+002760: HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+002761: CURVED STEM PARAGRAPH SIGN ORNAMENT*/
+                                                     0, /* U+002762: HEAVY EXCLAMATION MARK ORNAMENT*/
+                                                     0, /* U+002763: HEAVY HEART EXCLAMATION MARK ORNAMENT*/
+                                                     0, /* U+002764: HEAVY BLACK HEART*/
+                                                     0, /* U+002765: ROTATED HEAVY BLACK HEART BULLET*/
+                                                     0, /* U+002766: FLORAL HEART*/
+                                                     0, /* U+002767: ROTATED FLORAL HEART BULLET*/
+                                                     0, /* U+002768: MEDIUM LEFT PARENTHESIS ORNAMENT*/
+                                                     0, /* U+002769: MEDIUM RIGHT PARENTHESIS ORNAMENT*/
+                                                     0, /* U+00276a: MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT*/
+                                                     0, /* U+00276b: MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT*/
+                                                     0, /* U+00276c: MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT*/
+                                                     0, /* U+00276d: MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
+                                                     0, /* U+00276e: HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+00276f: HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
+                                                     0, /* U+002770: HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT*/
+                                                     0, /* U+002771: HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
+                                                     0, /* U+002772: LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT*/
+                                                     0, /* U+002773: LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT*/
+                                                     0, /* U+002774: MEDIUM LEFT CURLY BRACKET ORNAMENT*/
+                                                     0, /* U+002775: MEDIUM RIGHT CURLY BRACKET ORNAMENT*/
+                                                     0, /* U+002776: DINGBAT NEGATIVE CIRCLED DIGIT ONE*/
+                                                     0, /* U+002777: DINGBAT NEGATIVE CIRCLED DIGIT TWO*/
+                                                     0, /* U+002778: DINGBAT NEGATIVE CIRCLED DIGIT THREE*/
+                                                     0, /* U+002779: DINGBAT NEGATIVE CIRCLED DIGIT FOUR*/
+                                                     0, /* U+00277a: DINGBAT NEGATIVE CIRCLED DIGIT FIVE*/
+                                                     0, /* U+00277b: DINGBAT NEGATIVE CIRCLED DIGIT SIX*/
+                                                     0, /* U+00277c: DINGBAT NEGATIVE CIRCLED DIGIT SEVEN*/
+                                                     0, /* U+00277d: DINGBAT NEGATIVE CIRCLED DIGIT EIGHT*/
+                                                     0, /* U+00277e: DINGBAT NEGATIVE CIRCLED DIGIT NINE*/
+                                                     0, /* U+00277f: DINGBAT NEGATIVE CIRCLED NUMBER TEN*/
+                                                     0, /* U+002780: DINGBAT CIRCLED SANS-SERIF DIGIT ONE*/
+                                                     0, /* U+002781: DINGBAT CIRCLED SANS-SERIF DIGIT TWO*/
+                                                     0, /* U+002782: DINGBAT CIRCLED SANS-SERIF DIGIT THREE*/
+                                                     0, /* U+002783: DINGBAT CIRCLED SANS-SERIF DIGIT FOUR*/
+                                                     0, /* U+002784: DINGBAT CIRCLED SANS-SERIF DIGIT FIVE*/
+                                                     0, /* U+002785: DINGBAT CIRCLED SANS-SERIF DIGIT SIX*/
+                                                     0, /* U+002786: DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN*/
+                                                     0, /* U+002787: DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT*/
+                                                     0, /* U+002788: DINGBAT CIRCLED SANS-SERIF DIGIT NINE*/
+                                                     0, /* U+002789: DINGBAT CIRCLED SANS-SERIF NUMBER TEN*/
+                                                     0, /* U+00278a: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE*/
+                                                     0, /* U+00278b: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO*/
+                                                     0, /* U+00278c: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE*/
+                                                     0, /* U+00278d: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR*/
+                                                     0, /* U+00278e: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE*/
+                                                     0, /* U+00278f: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX*/
+                                                     0, /* U+002790: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN*/
+                                                     0, /* U+002791: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT*/
+                                                     0, /* U+002792: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE*/
+                                                     0, /* U+002793: DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN*/
+                                                     0, /* U+002794: HEAVY WIDE-HEADED RIGHTWARDS ARROW*/
+                                                     0, /* U+002795: HEAVY PLUS SIGN*/
+                                                     0, /* U+002796: HEAVY MINUS SIGN*/
+                                                     0, /* U+002797: HEAVY DIVISION SIGN*/
+                                                     0, /* U+002798: HEAVY SOUTH EAST ARROW*/
+                                                     0, /* U+002799: HEAVY RIGHTWARDS ARROW*/
+                                                     0, /* U+00279a: HEAVY NORTH EAST ARROW*/
+                                                     0, /* U+00279b: DRAFTING POINT RIGHTWARDS ARROW*/
+                                                     0, /* U+00279c: HEAVY ROUND-TIPPED RIGHTWARDS ARROW*/
+                                                     0, /* U+00279d: TRIANGLE-HEADED RIGHTWARDS ARROW*/
+                                                     0, /* U+00279e: HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW*/
+                                                     0, /* U+00279f: DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a0: HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a1: BLACK RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a2: THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD*/
+                                                     0, /* U+0027a3: THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD*/
+                                                     0, /* U+0027a4: BLACK RIGHTWARDS ARROWHEAD*/
+                                                     0, /* U+0027a5: HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a6: HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a7: SQUAT BLACK RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a8: HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW*/
+                                                     0, /* U+0027a9: RIGHT-SHADED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027aa: LEFT-SHADED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027ab: BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027ac: FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027ad: HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027ae: HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027af: NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b0: CURLY LOOP*/
+                                                     0, /* U+0027b1: NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b2: CIRCLED HEAVY WHITE RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b3: WHITE-FEATHERED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b4: BLACK-FEATHERED SOUTH EAST ARROW*/
+                                                     0, /* U+0027b5: BLACK-FEATHERED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b6: BLACK-FEATHERED NORTH EAST ARROW*/
+                                                     0, /* U+0027b7: HEAVY BLACK-FEATHERED SOUTH EAST ARROW*/
+                                                     0, /* U+0027b8: HEAVY BLACK-FEATHERED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027b9: HEAVY BLACK-FEATHERED NORTH EAST ARROW*/
+                                                     0, /* U+0027ba: TEARDROP-BARBED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027bb: HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027bc: WEDGE-TAILED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027bd: HEAVY WEDGE-TAILED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027be: OPEN-OUTLINED RIGHTWARDS ARROW*/
+                                                     0, /* U+0027bf: DOUBLE CURLY LOOP*/
+                                                     0, /* U+0027c0: THREE DIMENSIONAL ANGLE*/
+                                                     0, /* U+0027c1: WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE*/
+                                                     0, /* U+0027c2: PERPENDICULAR*/
+                                                     0, /* U+0027c3: OPEN SUBSET*/
+                                                     0, /* U+0027c4: OPEN SUPERSET*/
+                                                     0, /* U+0027c5: LEFT S-SHAPED BAG DELIMITER*/
+                                                     0, /* U+0027c6: RIGHT S-SHAPED BAG DELIMITER*/
+                                                     0, /* U+0027c7: OR WITH DOT INSIDE*/
+                                                     0, /* U+0027c8: REVERSE SOLIDUS PRECEDING SUBSET*/
+                                                     0, /* U+0027c9: SUPERSET PRECEDING SOLIDUS*/
+                                                     0, /* U+0027ca: VERTICAL BAR WITH HORIZONTAL STROKE*/
+                                                     0, /* U+0027cb: MATHEMATICAL RISING DIAGONAL*/
+                                                     0, /* U+0027cc: LONG DIVISION*/
+                                                     0, /* U+0027cd: MATHEMATICAL FALLING DIAGONAL*/
+                                                     0, /* U+0027ce: SQUARED LOGICAL AND*/
+                                                     0, /* U+0027cf: SQUARED LOGICAL OR*/
+                                                     0, /* U+0027d0: WHITE DIAMOND WITH CENTRED DOT*/
+                                                     0, /* U+0027d1: AND WITH DOT*/
+                                                     0, /* U+0027d2: ELEMENT OF OPENING UPWARDS*/
+                                                     0, /* U+0027d3: LOWER RIGHT CORNER WITH DOT*/
+                                                     0, /* U+0027d4: UPPER LEFT CORNER WITH DOT*/
+                                                     0, /* U+0027d5: LEFT OUTER JOIN*/
+                                                     0, /* U+0027d6: RIGHT OUTER JOIN*/
+                                                     0, /* U+0027d7: FULL OUTER JOIN*/
+                                                     0, /* U+0027d8: LARGE UP TACK*/
+                                                     0, /* U+0027d9: LARGE DOWN TACK*/
+                                                     0, /* U+0027da: LEFT AND RIGHT DOUBLE TURNSTILE*/
+                                                     0, /* U+0027db: LEFT AND RIGHT TACK*/
+                                                     0, /* U+0027dc: LEFT MULTIMAP*/
+                                                     0, /* U+0027dd: LONG RIGHT TACK*/
+                                                     0, /* U+0027de: LONG LEFT TACK*/
+                                                     0, /* U+0027df: UP TACK WITH CIRCLE ABOVE*/
+                                                     0, /* U+0027e0: LOZENGE DIVIDED BY HORIZONTAL RULE*/
+                                                     0, /* U+0027e1: WHITE CONCAVE-SIDED DIAMOND*/
+                                                     0, /* U+0027e2: WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK*/
+                                                     0, /* U+0027e3: WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK*/
+                                                     0, /* U+0027e4: WHITE SQUARE WITH LEFTWARDS TICK*/
+                                                     0, /* U+0027e5: WHITE SQUARE WITH RIGHTWARDS TICK*/
+                                                     0, /* U+0027e6: MATHEMATICAL LEFT WHITE SQUARE BRACKET*/
+                                                     0, /* U+0027e7: MATHEMATICAL RIGHT WHITE SQUARE BRACKET*/
+                                                     0, /* U+0027e8: MATHEMATICAL LEFT ANGLE BRACKET*/
+                                                     0, /* U+0027e9: MATHEMATICAL RIGHT ANGLE BRACKET*/
+                                                     0, /* U+0027ea: MATHEMATICAL LEFT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+0027eb: MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+0027ec: MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET*/
+                                                     0, /* U+0027ed: MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET*/
+                                                     0, /* U+0027ee: MATHEMATICAL LEFT FLATTENED PARENTHESIS*/
+                                                     0, /* U+0027ef: MATHEMATICAL RIGHT FLATTENED PARENTHESIS*/
+                                                     0, /* U+0027f0: UPWARDS QUADRUPLE ARROW*/
+                                                     0, /* U+0027f1: DOWNWARDS QUADRUPLE ARROW*/
+                                                     0, /* U+0027f2: ANTICLOCKWISE GAPPED CIRCLE ARROW*/
+                                                     0, /* U+0027f3: CLOCKWISE GAPPED CIRCLE ARROW*/
+                                                     0, /* U+0027f4: RIGHT ARROW WITH CIRCLED PLUS*/
+                                                     0, /* U+0027f5: LONG LEFTWARDS ARROW*/
+                                                     0, /* U+0027f6: LONG RIGHTWARDS ARROW*/
+                                                     0, /* U+0027f7: LONG LEFT RIGHT ARROW*/
+                                                     0, /* U+0027f8: LONG LEFTWARDS DOUBLE ARROW*/
+                                                     0, /* U+0027f9: LONG RIGHTWARDS DOUBLE ARROW*/
+                                                     0, /* U+0027fa: LONG LEFT RIGHT DOUBLE ARROW*/
+                                                     0, /* U+0027fb: LONG LEFTWARDS ARROW FROM BAR*/
+                                                     0, /* U+0027fc: LONG RIGHTWARDS ARROW FROM BAR*/
+                                                     0, /* U+0027fd: LONG LEFTWARDS DOUBLE ARROW FROM BAR*/
+                                                     0, /* U+0027fe: LONG RIGHTWARDS DOUBLE ARROW FROM BAR*/
+                                                     0, /* U+0027ff: LONG RIGHTWARDS SQUIGGLE ARROW*/
+                                                     0, /* U+002800: BRAILLE PATTERN BLANK*/
+                                                     0, /* U+002801: BRAILLE PATTERN DOTS-1*/
+                                                     0, /* U+002802: BRAILLE PATTERN DOTS-2*/
+                                                     0, /* U+002803: BRAILLE PATTERN DOTS-12*/
+                                                     0, /* U+002804: BRAILLE PATTERN DOTS-3*/
+                                                     0, /* U+002805: BRAILLE PATTERN DOTS-13*/
+                                                     0, /* U+002806: BRAILLE PATTERN DOTS-23*/
+                                                     0, /* U+002807: BRAILLE PATTERN DOTS-123*/
+                                                     0, /* U+002808: BRAILLE PATTERN DOTS-4*/
+                                                     0, /* U+002809: BRAILLE PATTERN DOTS-14*/
+                                                     0, /* U+00280a: BRAILLE PATTERN DOTS-24*/
+                                                     0, /* U+00280b: BRAILLE PATTERN DOTS-124*/
+                                                     0, /* U+00280c: BRAILLE PATTERN DOTS-34*/
+                                                     0, /* U+00280d: BRAILLE PATTERN DOTS-134*/
+                                                     0, /* U+00280e: BRAILLE PATTERN DOTS-234*/
+                                                     0, /* U+00280f: BRAILLE PATTERN DOTS-1234*/
+                                                     0, /* U+002810: BRAILLE PATTERN DOTS-5*/
+                                                     0, /* U+002811: BRAILLE PATTERN DOTS-15*/
+                                                     0, /* U+002812: BRAILLE PATTERN DOTS-25*/
+                                                     0, /* U+002813: BRAILLE PATTERN DOTS-125*/
+                                                     0, /* U+002814: BRAILLE PATTERN DOTS-35*/
+                                                     0, /* U+002815: BRAILLE PATTERN DOTS-135*/
+                                                     0, /* U+002816: BRAILLE PATTERN DOTS-235*/
+                                                     0, /* U+002817: BRAILLE PATTERN DOTS-1235*/
+                                                     0, /* U+002818: BRAILLE PATTERN DOTS-45*/
+                                                     0, /* U+002819: BRAILLE PATTERN DOTS-145*/
+                                                     0, /* U+00281a: BRAILLE PATTERN DOTS-245*/
+                                                     0, /* U+00281b: BRAILLE PATTERN DOTS-1245*/
+                                                     0, /* U+00281c: BRAILLE PATTERN DOTS-345*/
+                                                     0, /* U+00281d: BRAILLE PATTERN DOTS-1345*/
+                                                     0, /* U+00281e: BRAILLE PATTERN DOTS-2345*/
+                                                     0, /* U+00281f: BRAILLE PATTERN DOTS-12345*/
+                                                     0, /* U+002820: BRAILLE PATTERN DOTS-6*/
+                                                     0, /* U+002821: BRAILLE PATTERN DOTS-16*/
+                                                     0, /* U+002822: BRAILLE PATTERN DOTS-26*/
+                                                     0, /* U+002823: BRAILLE PATTERN DOTS-126*/
+                                                     0, /* U+002824: BRAILLE PATTERN DOTS-36*/
+                                                     0, /* U+002825: BRAILLE PATTERN DOTS-136*/
+                                                     0, /* U+002826: BRAILLE PATTERN DOTS-236*/
+                                                     0, /* U+002827: BRAILLE PATTERN DOTS-1236*/
+                                                     0, /* U+002828: BRAILLE PATTERN DOTS-46*/
+                                                     0, /* U+002829: BRAILLE PATTERN DOTS-146*/
+                                                     0, /* U+00282a: BRAILLE PATTERN DOTS-246*/
+                                                     0, /* U+00282b: BRAILLE PATTERN DOTS-1246*/
+                                                     0, /* U+00282c: BRAILLE PATTERN DOTS-346*/
+                                                     0, /* U+00282d: BRAILLE PATTERN DOTS-1346*/
+                                                     0, /* U+00282e: BRAILLE PATTERN DOTS-2346*/
+                                                     0, /* U+00282f: BRAILLE PATTERN DOTS-12346*/
+                                                     0, /* U+002830: BRAILLE PATTERN DOTS-56*/
+                                                     0, /* U+002831: BRAILLE PATTERN DOTS-156*/
+                                                     0, /* U+002832: BRAILLE PATTERN DOTS-256*/
+                                                     0, /* U+002833: BRAILLE PATTERN DOTS-1256*/
+                                                     0, /* U+002834: BRAILLE PATTERN DOTS-356*/
+                                                     0, /* U+002835: BRAILLE PATTERN DOTS-1356*/
+                                                     0, /* U+002836: BRAILLE PATTERN DOTS-2356*/
+                                                     0, /* U+002837: BRAILLE PATTERN DOTS-12356*/
+                                                     0, /* U+002838: BRAILLE PATTERN DOTS-456*/
+                                                     0, /* U+002839: BRAILLE PATTERN DOTS-1456*/
+                                                     0, /* U+00283a: BRAILLE PATTERN DOTS-2456*/
+                                                     0, /* U+00283b: BRAILLE PATTERN DOTS-12456*/
+                                                     0, /* U+00283c: BRAILLE PATTERN DOTS-3456*/
+                                                     0, /* U+00283d: BRAILLE PATTERN DOTS-13456*/
+                                                     0, /* U+00283e: BRAILLE PATTERN DOTS-23456*/
+                                                     0, /* U+00283f: BRAILLE PATTERN DOTS-123456*/
+                                                     0, /* U+002840: BRAILLE PATTERN DOTS-7*/
+                                                     0, /* U+002841: BRAILLE PATTERN DOTS-17*/
+                                                     0, /* U+002842: BRAILLE PATTERN DOTS-27*/
+                                                     0, /* U+002843: BRAILLE PATTERN DOTS-127*/
+                                                     0, /* U+002844: BRAILLE PATTERN DOTS-37*/
+                                                     0, /* U+002845: BRAILLE PATTERN DOTS-137*/
+                                                     0, /* U+002846: BRAILLE PATTERN DOTS-237*/
+                                                     0, /* U+002847: BRAILLE PATTERN DOTS-1237*/
+                                                     0, /* U+002848: BRAILLE PATTERN DOTS-47*/
+                                                     0, /* U+002849: BRAILLE PATTERN DOTS-147*/
+                                                     0, /* U+00284a: BRAILLE PATTERN DOTS-247*/
+                                                     0, /* U+00284b: BRAILLE PATTERN DOTS-1247*/
+                                                     0, /* U+00284c: BRAILLE PATTERN DOTS-347*/
+                                                     0, /* U+00284d: BRAILLE PATTERN DOTS-1347*/
+                                                     0, /* U+00284e: BRAILLE PATTERN DOTS-2347*/
+                                                     0, /* U+00284f: BRAILLE PATTERN DOTS-12347*/
+                                                     0, /* U+002850: BRAILLE PATTERN DOTS-57*/
+                                                     0, /* U+002851: BRAILLE PATTERN DOTS-157*/
+                                                     0, /* U+002852: BRAILLE PATTERN DOTS-257*/
+                                                     0, /* U+002853: BRAILLE PATTERN DOTS-1257*/
+                                                     0, /* U+002854: BRAILLE PATTERN DOTS-357*/
+                                                     0, /* U+002855: BRAILLE PATTERN DOTS-1357*/
+                                                     0, /* U+002856: BRAILLE PATTERN DOTS-2357*/
+                                                     0, /* U+002857: BRAILLE PATTERN DOTS-12357*/
+                                                     0, /* U+002858: BRAILLE PATTERN DOTS-457*/
+                                                     0, /* U+002859: BRAILLE PATTERN DOTS-1457*/
+                                                     0, /* U+00285a: BRAILLE PATTERN DOTS-2457*/
+                                                     0, /* U+00285b: BRAILLE PATTERN DOTS-12457*/
+                                                     0, /* U+00285c: BRAILLE PATTERN DOTS-3457*/
+                                                     0, /* U+00285d: BRAILLE PATTERN DOTS-13457*/
+                                                     0, /* U+00285e: BRAILLE PATTERN DOTS-23457*/
+                                                     0, /* U+00285f: BRAILLE PATTERN DOTS-123457*/
+                                                     0, /* U+002860: BRAILLE PATTERN DOTS-67*/
+                                                     0, /* U+002861: BRAILLE PATTERN DOTS-167*/
+                                                     0, /* U+002862: BRAILLE PATTERN DOTS-267*/
+                                                     0, /* U+002863: BRAILLE PATTERN DOTS-1267*/
+                                                     0, /* U+002864: BRAILLE PATTERN DOTS-367*/
+                                                     0, /* U+002865: BRAILLE PATTERN DOTS-1367*/
+                                                     0, /* U+002866: BRAILLE PATTERN DOTS-2367*/
+                                                     0, /* U+002867: BRAILLE PATTERN DOTS-12367*/
+                                                     0, /* U+002868: BRAILLE PATTERN DOTS-467*/
+                                                     0, /* U+002869: BRAILLE PATTERN DOTS-1467*/
+                                                     0, /* U+00286a: BRAILLE PATTERN DOTS-2467*/
+                                                     0, /* U+00286b: BRAILLE PATTERN DOTS-12467*/
+                                                     0, /* U+00286c: BRAILLE PATTERN DOTS-3467*/
+                                                     0, /* U+00286d: BRAILLE PATTERN DOTS-13467*/
+                                                     0, /* U+00286e: BRAILLE PATTERN DOTS-23467*/
+                                                     0, /* U+00286f: BRAILLE PATTERN DOTS-123467*/
+                                                     0, /* U+002870: BRAILLE PATTERN DOTS-567*/
+                                                     0, /* U+002871: BRAILLE PATTERN DOTS-1567*/
+                                                     0, /* U+002872: BRAILLE PATTERN DOTS-2567*/
+                                                     0, /* U+002873: BRAILLE PATTERN DOTS-12567*/
+                                                     0, /* U+002874: BRAILLE PATTERN DOTS-3567*/
+                                                     0, /* U+002875: BRAILLE PATTERN DOTS-13567*/
+                                                     0, /* U+002876: BRAILLE PATTERN DOTS-23567*/
+                                                     0, /* U+002877: BRAILLE PATTERN DOTS-123567*/
+                                                     0, /* U+002878: BRAILLE PATTERN DOTS-4567*/
+                                                     0, /* U+002879: BRAILLE PATTERN DOTS-14567*/
+                                                     0, /* U+00287a: BRAILLE PATTERN DOTS-24567*/
+                                                     0, /* U+00287b: BRAILLE PATTERN DOTS-124567*/
+                                                     0, /* U+00287c: BRAILLE PATTERN DOTS-34567*/
+                                                     0, /* U+00287d: BRAILLE PATTERN DOTS-134567*/
+                                                     0, /* U+00287e: BRAILLE PATTERN DOTS-234567*/
+                                                     0, /* U+00287f: BRAILLE PATTERN DOTS-1234567*/
+                                                     0, /* U+002880: BRAILLE PATTERN DOTS-8*/
+                                                     0, /* U+002881: BRAILLE PATTERN DOTS-18*/
+                                                     0, /* U+002882: BRAILLE PATTERN DOTS-28*/
+                                                     0, /* U+002883: BRAILLE PATTERN DOTS-128*/
+                                                     0, /* U+002884: BRAILLE PATTERN DOTS-38*/
+                                                     0, /* U+002885: BRAILLE PATTERN DOTS-138*/
+                                                     0, /* U+002886: BRAILLE PATTERN DOTS-238*/
+                                                     0, /* U+002887: BRAILLE PATTERN DOTS-1238*/
+                                                     0, /* U+002888: BRAILLE PATTERN DOTS-48*/
+                                                     0, /* U+002889: BRAILLE PATTERN DOTS-148*/
+                                                     0, /* U+00288a: BRAILLE PATTERN DOTS-248*/
+                                                     0, /* U+00288b: BRAILLE PATTERN DOTS-1248*/
+                                                     0, /* U+00288c: BRAILLE PATTERN DOTS-348*/
+                                                     0, /* U+00288d: BRAILLE PATTERN DOTS-1348*/
+                                                     0, /* U+00288e: BRAILLE PATTERN DOTS-2348*/
+                                                     0, /* U+00288f: BRAILLE PATTERN DOTS-12348*/
+                                                     0, /* U+002890: BRAILLE PATTERN DOTS-58*/
+                                                     0, /* U+002891: BRAILLE PATTERN DOTS-158*/
+                                                     0, /* U+002892: BRAILLE PATTERN DOTS-258*/
+                                                     0, /* U+002893: BRAILLE PATTERN DOTS-1258*/
+                                                     0, /* U+002894: BRAILLE PATTERN DOTS-358*/
+                                                     0, /* U+002895: BRAILLE PATTERN DOTS-1358*/
+                                                     0, /* U+002896: BRAILLE PATTERN DOTS-2358*/
+                                                     0, /* U+002897: BRAILLE PATTERN DOTS-12358*/
+                                                     0, /* U+002898: BRAILLE PATTERN DOTS-458*/
+                                                     0, /* U+002899: BRAILLE PATTERN DOTS-1458*/
+                                                     0, /* U+00289a: BRAILLE PATTERN DOTS-2458*/
+                                                     0, /* U+00289b: BRAILLE PATTERN DOTS-12458*/
+                                                     0, /* U+00289c: BRAILLE PATTERN DOTS-3458*/
+                                                     0, /* U+00289d: BRAILLE PATTERN DOTS-13458*/
+                                                     0, /* U+00289e: BRAILLE PATTERN DOTS-23458*/
+                                                     0, /* U+00289f: BRAILLE PATTERN DOTS-123458*/
+                                                     0, /* U+0028a0: BRAILLE PATTERN DOTS-68*/
+                                                     0, /* U+0028a1: BRAILLE PATTERN DOTS-168*/
+                                                     0, /* U+0028a2: BRAILLE PATTERN DOTS-268*/
+                                                     0, /* U+0028a3: BRAILLE PATTERN DOTS-1268*/
+                                                     0, /* U+0028a4: BRAILLE PATTERN DOTS-368*/
+                                                     0, /* U+0028a5: BRAILLE PATTERN DOTS-1368*/
+                                                     0, /* U+0028a6: BRAILLE PATTERN DOTS-2368*/
+                                                     0, /* U+0028a7: BRAILLE PATTERN DOTS-12368*/
+                                                     0, /* U+0028a8: BRAILLE PATTERN DOTS-468*/
+                                                     0, /* U+0028a9: BRAILLE PATTERN DOTS-1468*/
+                                                     0, /* U+0028aa: BRAILLE PATTERN DOTS-2468*/
+                                                     0, /* U+0028ab: BRAILLE PATTERN DOTS-12468*/
+                                                     0, /* U+0028ac: BRAILLE PATTERN DOTS-3468*/
+                                                     0, /* U+0028ad: BRAILLE PATTERN DOTS-13468*/
+                                                     0, /* U+0028ae: BRAILLE PATTERN DOTS-23468*/
+                                                     0, /* U+0028af: BRAILLE PATTERN DOTS-123468*/
+                                                     0, /* U+0028b0: BRAILLE PATTERN DOTS-568*/
+                                                     0, /* U+0028b1: BRAILLE PATTERN DOTS-1568*/
+                                                     0, /* U+0028b2: BRAILLE PATTERN DOTS-2568*/
+                                                     0, /* U+0028b3: BRAILLE PATTERN DOTS-12568*/
+                                                     0, /* U+0028b4: BRAILLE PATTERN DOTS-3568*/
+                                                     0, /* U+0028b5: BRAILLE PATTERN DOTS-13568*/
+                                                     0, /* U+0028b6: BRAILLE PATTERN DOTS-23568*/
+                                                     0, /* U+0028b7: BRAILLE PATTERN DOTS-123568*/
+                                                     0, /* U+0028b8: BRAILLE PATTERN DOTS-4568*/
+                                                     0, /* U+0028b9: BRAILLE PATTERN DOTS-14568*/
+                                                     0, /* U+0028ba: BRAILLE PATTERN DOTS-24568*/
+                                                     0, /* U+0028bb: BRAILLE PATTERN DOTS-124568*/
+                                                     0, /* U+0028bc: BRAILLE PATTERN DOTS-34568*/
+                                                     0, /* U+0028bd: BRAILLE PATTERN DOTS-134568*/
+                                                     0, /* U+0028be: BRAILLE PATTERN DOTS-234568*/
+                                                     0, /* U+0028bf: BRAILLE PATTERN DOTS-1234568*/
+                                                     0, /* U+0028c0: BRAILLE PATTERN DOTS-78*/
+                                                     0, /* U+0028c1: BRAILLE PATTERN DOTS-178*/
+                                                     0, /* U+0028c2: BRAILLE PATTERN DOTS-278*/
+                                                     0, /* U+0028c3: BRAILLE PATTERN DOTS-1278*/
+                                                     0, /* U+0028c4: BRAILLE PATTERN DOTS-378*/
+                                                     0, /* U+0028c5: BRAILLE PATTERN DOTS-1378*/
+                                                     0, /* U+0028c6: BRAILLE PATTERN DOTS-2378*/
+                                                     0, /* U+0028c7: BRAILLE PATTERN DOTS-12378*/
+                                                     0, /* U+0028c8: BRAILLE PATTERN DOTS-478*/
+                                                     0, /* U+0028c9: BRAILLE PATTERN DOTS-1478*/
+                                                     0, /* U+0028ca: BRAILLE PATTERN DOTS-2478*/
+                                                     0, /* U+0028cb: BRAILLE PATTERN DOTS-12478*/
+                                                     0, /* U+0028cc: BRAILLE PATTERN DOTS-3478*/
+                                                     0, /* U+0028cd: BRAILLE PATTERN DOTS-13478*/
+                                                     0, /* U+0028ce: BRAILLE PATTERN DOTS-23478*/
+                                                     0, /* U+0028cf: BRAILLE PATTERN DOTS-123478*/
+                                                     0, /* U+0028d0: BRAILLE PATTERN DOTS-578*/
+                                                     0, /* U+0028d1: BRAILLE PATTERN DOTS-1578*/
+                                                     0, /* U+0028d2: BRAILLE PATTERN DOTS-2578*/
+                                                     0, /* U+0028d3: BRAILLE PATTERN DOTS-12578*/
+                                                     0, /* U+0028d4: BRAILLE PATTERN DOTS-3578*/
+                                                     0, /* U+0028d5: BRAILLE PATTERN DOTS-13578*/
+                                                     0, /* U+0028d6: BRAILLE PATTERN DOTS-23578*/
+                                                     0, /* U+0028d7: BRAILLE PATTERN DOTS-123578*/
+                                                     0, /* U+0028d8: BRAILLE PATTERN DOTS-4578*/
+                                                     0, /* U+0028d9: BRAILLE PATTERN DOTS-14578*/
+                                                     0, /* U+0028da: BRAILLE PATTERN DOTS-24578*/
+                                                     0, /* U+0028db: BRAILLE PATTERN DOTS-124578*/
+                                                     0, /* U+0028dc: BRAILLE PATTERN DOTS-34578*/
+                                                     0, /* U+0028dd: BRAILLE PATTERN DOTS-134578*/
+                                                     0, /* U+0028de: BRAILLE PATTERN DOTS-234578*/
+                                                     0, /* U+0028df: BRAILLE PATTERN DOTS-1234578*/
+                                                     0, /* U+0028e0: BRAILLE PATTERN DOTS-678*/
+                                                     0, /* U+0028e1: BRAILLE PATTERN DOTS-1678*/
+                                                     0, /* U+0028e2: BRAILLE PATTERN DOTS-2678*/
+                                                     0, /* U+0028e3: BRAILLE PATTERN DOTS-12678*/
+                                                     0, /* U+0028e4: BRAILLE PATTERN DOTS-3678*/
+                                                     0, /* U+0028e5: BRAILLE PATTERN DOTS-13678*/
+                                                     0, /* U+0028e6: BRAILLE PATTERN DOTS-23678*/
+                                                     0, /* U+0028e7: BRAILLE PATTERN DOTS-123678*/
+                                                     0, /* U+0028e8: BRAILLE PATTERN DOTS-4678*/
+                                                     0, /* U+0028e9: BRAILLE PATTERN DOTS-14678*/
+                                                     0, /* U+0028ea: BRAILLE PATTERN DOTS-24678*/
+                                                     0, /* U+0028eb: BRAILLE PATTERN DOTS-124678*/
+                                                     0, /* U+0028ec: BRAILLE PATTERN DOTS-34678*/
+                                                     0, /* U+0028ed: BRAILLE PATTERN DOTS-134678*/
+                                                     0, /* U+0028ee: BRAILLE PATTERN DOTS-234678*/
+                                                     0, /* U+0028ef: BRAILLE PATTERN DOTS-1234678*/
+                                                     0, /* U+0028f0: BRAILLE PATTERN DOTS-5678*/
+                                                     0, /* U+0028f1: BRAILLE PATTERN DOTS-15678*/
+                                                     0, /* U+0028f2: BRAILLE PATTERN DOTS-25678*/
+                                                     0, /* U+0028f3: BRAILLE PATTERN DOTS-125678*/
+                                                     0, /* U+0028f4: BRAILLE PATTERN DOTS-35678*/
+                                                     0, /* U+0028f5: BRAILLE PATTERN DOTS-135678*/
+                                                     0, /* U+0028f6: BRAILLE PATTERN DOTS-235678*/
+                                                     0, /* U+0028f7: BRAILLE PATTERN DOTS-1235678*/
+                                                     0, /* U+0028f8: BRAILLE PATTERN DOTS-45678*/
+                                                     0, /* U+0028f9: BRAILLE PATTERN DOTS-145678*/
+                                                     0, /* U+0028fa: BRAILLE PATTERN DOTS-245678*/
+                                                     0, /* U+0028fb: BRAILLE PATTERN DOTS-1245678*/
+                                                     0, /* U+0028fc: BRAILLE PATTERN DOTS-345678*/
+                                                     0, /* U+0028fd: BRAILLE PATTERN DOTS-1345678*/
+                                                     0, /* U+0028fe: BRAILLE PATTERN DOTS-2345678*/
+                                                     0, /* U+0028ff: BRAILLE PATTERN DOTS-12345678*/
+                                                     0, /* U+002900: RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+002901: RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002902: LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+002903: RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+002904: LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+002905: RIGHTWARDS TWO-HEADED ARROW FROM BAR*/
+                                                     0, /* U+002906: LEFTWARDS DOUBLE ARROW FROM BAR*/
+                                                     0, /* U+002907: RIGHTWARDS DOUBLE ARROW FROM BAR*/
+                                                     0, /* U+002908: DOWNWARDS ARROW WITH HORIZONTAL STROKE*/
+                                                     0, /* U+002909: UPWARDS ARROW WITH HORIZONTAL STROKE*/
+                                                     0, /* U+00290a: UPWARDS TRIPLE ARROW*/
+                                                     0, /* U+00290b: DOWNWARDS TRIPLE ARROW*/
+                                                     0, /* U+00290c: LEFTWARDS DOUBLE DASH ARROW*/
+                                                     0, /* U+00290d: RIGHTWARDS DOUBLE DASH ARROW*/
+                                                     0, /* U+00290e: LEFTWARDS TRIPLE DASH ARROW*/
+                                                     0, /* U+00290f: RIGHTWARDS TRIPLE DASH ARROW*/
+                                                     0, /* U+002910: RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW*/
+                                                     0, /* U+002911: RIGHTWARDS ARROW WITH DOTTED STEM*/
+                                                     0, /* U+002912: UPWARDS ARROW TO BAR*/
+                                                     0, /* U+002913: DOWNWARDS ARROW TO BAR*/
+                                                     0, /* U+002914: RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
+                                                     0, /* U+002915: RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002916: RIGHTWARDS TWO-HEADED ARROW WITH TAIL*/
+                                                     0, /* U+002917: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
+                                                     0, /* U+002918: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002919: LEFTWARDS ARROW-TAIL*/
+                                                     0, /* U+00291a: RIGHTWARDS ARROW-TAIL*/
+                                                     0, /* U+00291b: LEFTWARDS DOUBLE ARROW-TAIL*/
+                                                     0, /* U+00291c: RIGHTWARDS DOUBLE ARROW-TAIL*/
+                                                     0, /* U+00291d: LEFTWARDS ARROW TO BLACK DIAMOND*/
+                                                     0, /* U+00291e: RIGHTWARDS ARROW TO BLACK DIAMOND*/
+                                                     0, /* U+00291f: LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
+                                                     0, /* U+002920: RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
+                                                     0, /* U+002921: NORTH WEST AND SOUTH EAST ARROW*/
+                                                     0, /* U+002922: NORTH EAST AND SOUTH WEST ARROW*/
+                                                     0, /* U+002923: NORTH WEST ARROW WITH HOOK*/
+                                                     0, /* U+002924: NORTH EAST ARROW WITH HOOK*/
+                                                     0, /* U+002925: SOUTH EAST ARROW WITH HOOK*/
+                                                     0, /* U+002926: SOUTH WEST ARROW WITH HOOK*/
+                                                     0, /* U+002927: NORTH WEST ARROW AND NORTH EAST ARROW*/
+                                                     0, /* U+002928: NORTH EAST ARROW AND SOUTH EAST ARROW*/
+                                                     0, /* U+002929: SOUTH EAST ARROW AND SOUTH WEST ARROW*/
+                                                     0, /* U+00292a: SOUTH WEST ARROW AND NORTH WEST ARROW*/
+                                                     0, /* U+00292b: RISING DIAGONAL CROSSING FALLING DIAGONAL*/
+                                                     0, /* U+00292c: FALLING DIAGONAL CROSSING RISING DIAGONAL*/
+                                                     0, /* U+00292d: SOUTH EAST ARROW CROSSING NORTH EAST ARROW*/
+                                                     0, /* U+00292e: NORTH EAST ARROW CROSSING SOUTH EAST ARROW*/
+                                                     0, /* U+00292f: FALLING DIAGONAL CROSSING NORTH EAST ARROW*/
+                                                     0, /* U+002930: RISING DIAGONAL CROSSING SOUTH EAST ARROW*/
+                                                     0, /* U+002931: NORTH EAST ARROW CROSSING NORTH WEST ARROW*/
+                                                     0, /* U+002932: NORTH WEST ARROW CROSSING NORTH EAST ARROW*/
+                                                     0, /* U+002933: WAVE ARROW POINTING DIRECTLY RIGHT*/
+                                                     0, /* U+002934: ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS*/
+                                                     0, /* U+002935: ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS*/
+                                                     0, /* U+002936: ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS*/
+                                                     0, /* U+002937: ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS*/
+                                                     0, /* U+002938: RIGHT-SIDE ARC CLOCKWISE ARROW*/
+                                                     0, /* U+002939: LEFT-SIDE ARC ANTICLOCKWISE ARROW*/
+                                                     0, /* U+00293a: TOP ARC ANTICLOCKWISE ARROW*/
+                                                     0, /* U+00293b: BOTTOM ARC ANTICLOCKWISE ARROW*/
+                                                     0, /* U+00293c: TOP ARC CLOCKWISE ARROW WITH MINUS*/
+                                                     0, /* U+00293d: TOP ARC ANTICLOCKWISE ARROW WITH PLUS*/
+                                                     0, /* U+00293e: LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW*/
+                                                     0, /* U+00293f: LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW*/
+                                                     0, /* U+002940: ANTICLOCKWISE CLOSED CIRCLE ARROW*/
+                                                     0, /* U+002941: CLOCKWISE CLOSED CIRCLE ARROW*/
+                                                     0, /* U+002942: RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW*/
+                                                     0, /* U+002943: LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW*/
+                                                     0, /* U+002944: SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+002945: RIGHTWARDS ARROW WITH PLUS BELOW*/
+                                                     0, /* U+002946: LEFTWARDS ARROW WITH PLUS BELOW*/
+                                                     0, /* U+002947: RIGHTWARDS ARROW THROUGH X*/
+                                                     0, /* U+002948: LEFT RIGHT ARROW THROUGH SMALL CIRCLE*/
+                                                     0, /* U+002949: UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE*/
+                                                     0, /* U+00294a: LEFT BARB UP RIGHT BARB DOWN HARPOON*/
+                                                     0, /* U+00294b: LEFT BARB DOWN RIGHT BARB UP HARPOON*/
+                                                     0, /* U+00294c: UP BARB RIGHT DOWN BARB LEFT HARPOON*/
+                                                     0, /* U+00294d: UP BARB LEFT DOWN BARB RIGHT HARPOON*/
+                                                     0, /* U+00294e: LEFT BARB UP RIGHT BARB UP HARPOON*/
+                                                     0, /* U+00294f: UP BARB RIGHT DOWN BARB RIGHT HARPOON*/
+                                                     0, /* U+002950: LEFT BARB DOWN RIGHT BARB DOWN HARPOON*/
+                                                     0, /* U+002951: UP BARB LEFT DOWN BARB LEFT HARPOON*/
+                                                     0, /* U+002952: LEFTWARDS HARPOON WITH BARB UP TO BAR*/
+                                                     0, /* U+002953: RIGHTWARDS HARPOON WITH BARB UP TO BAR*/
+                                                     0, /* U+002954: UPWARDS HARPOON WITH BARB RIGHT TO BAR*/
+                                                     0, /* U+002955: DOWNWARDS HARPOON WITH BARB RIGHT TO BAR*/
+                                                     0, /* U+002956: LEFTWARDS HARPOON WITH BARB DOWN TO BAR*/
+                                                     0, /* U+002957: RIGHTWARDS HARPOON WITH BARB DOWN TO BAR*/
+                                                     0, /* U+002958: UPWARDS HARPOON WITH BARB LEFT TO BAR*/
+                                                     0, /* U+002959: DOWNWARDS HARPOON WITH BARB LEFT TO BAR*/
+                                                     0, /* U+00295a: LEFTWARDS HARPOON WITH BARB UP FROM BAR*/
+                                                     0, /* U+00295b: RIGHTWARDS HARPOON WITH BARB UP FROM BAR*/
+                                                     0, /* U+00295c: UPWARDS HARPOON WITH BARB RIGHT FROM BAR*/
+                                                     0, /* U+00295d: DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR*/
+                                                     0, /* U+00295e: LEFTWARDS HARPOON WITH BARB DOWN FROM BAR*/
+                                                     0, /* U+00295f: RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR*/
+                                                     0, /* U+002960: UPWARDS HARPOON WITH BARB LEFT FROM BAR*/
+                                                     0, /* U+002961: DOWNWARDS HARPOON WITH BARB LEFT FROM BAR*/
+                                                     0, /* U+002962: LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
+                                                     0, /* U+002963: UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
+                                                     0, /* U+002964: RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
+                                                     0, /* U+002965: DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
+                                                     0, /* U+002966: LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP*/
+                                                     0, /* U+002967: LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
+                                                     0, /* U+002968: RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP*/
+                                                     0, /* U+002969: RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
+                                                     0, /* U+00296a: LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
+                                                     0, /* U+00296b: LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
+                                                     0, /* U+00296c: RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
+                                                     0, /* U+00296d: RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
+                                                     0, /* U+00296e: UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
+                                                     0, /* U+00296f: DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
+                                                     0, /* U+002970: RIGHT DOUBLE ARROW WITH ROUNDED HEAD*/
+                                                     0, /* U+002971: EQUALS SIGN ABOVE RIGHTWARDS ARROW*/
+                                                     0, /* U+002972: TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
+                                                     0, /* U+002973: LEFTWARDS ARROW ABOVE TILDE OPERATOR*/
+                                                     0, /* U+002974: RIGHTWARDS ARROW ABOVE TILDE OPERATOR*/
+                                                     0, /* U+002975: RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002976: LESS-THAN ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+002977: LEFTWARDS ARROW THROUGH LESS-THAN*/
+                                                     0, /* U+002978: GREATER-THAN ABOVE RIGHTWARDS ARROW*/
+                                                     0, /* U+002979: SUBSET ABOVE RIGHTWARDS ARROW*/
+                                                     0, /* U+00297a: LEFTWARDS ARROW THROUGH SUBSET*/
+                                                     0, /* U+00297b: SUPERSET ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+00297c: LEFT FISH TAIL*/
+                                                     0, /* U+00297d: RIGHT FISH TAIL*/
+                                                     0, /* U+00297e: UP FISH TAIL*/
+                                                     0, /* U+00297f: DOWN FISH TAIL*/
+                                                     0, /* U+002980: TRIPLE VERTICAL BAR DELIMITER*/
+                                                     0, /* U+002981: Z NOTATION SPOT*/
+                                                     0, /* U+002982: Z NOTATION TYPE COLON*/
+                                                     0, /* U+002983: LEFT WHITE CURLY BRACKET*/
+                                                     0, /* U+002984: RIGHT WHITE CURLY BRACKET*/
+                                                     0, /* U+002985: LEFT WHITE PARENTHESIS*/
+                                                     0, /* U+002986: RIGHT WHITE PARENTHESIS*/
+                                                     0, /* U+002987: Z NOTATION LEFT IMAGE BRACKET*/
+                                                     0, /* U+002988: Z NOTATION RIGHT IMAGE BRACKET*/
+                                                     0, /* U+002989: Z NOTATION LEFT BINDING BRACKET*/
+                                                     0, /* U+00298a: Z NOTATION RIGHT BINDING BRACKET*/
+                                                     0, /* U+00298b: LEFT SQUARE BRACKET WITH UNDERBAR*/
+                                                     0, /* U+00298c: RIGHT SQUARE BRACKET WITH UNDERBAR*/
+                                                     0, /* U+00298d: LEFT SQUARE BRACKET WITH TICK IN TOP CORNER*/
+                                                     0, /* U+00298e: RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
+                                                     0, /* U+00298f: LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
+                                                     0, /* U+002990: RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER*/
+                                                     0, /* U+002991: LEFT ANGLE BRACKET WITH DOT*/
+                                                     0, /* U+002992: RIGHT ANGLE BRACKET WITH DOT*/
+                                                     0, /* U+002993: LEFT ARC LESS-THAN BRACKET*/
+                                                     0, /* U+002994: RIGHT ARC GREATER-THAN BRACKET*/
+                                                     0, /* U+002995: DOUBLE LEFT ARC GREATER-THAN BRACKET*/
+                                                     0, /* U+002996: DOUBLE RIGHT ARC LESS-THAN BRACKET*/
+                                                     0, /* U+002997: LEFT BLACK TORTOISE SHELL BRACKET*/
+                                                     0, /* U+002998: RIGHT BLACK TORTOISE SHELL BRACKET*/
+                                                     0, /* U+002999: DOTTED FENCE*/
+                                                     0, /* U+00299a: VERTICAL ZIGZAG LINE*/
+                                                     0, /* U+00299b: MEASURED ANGLE OPENING LEFT*/
+                                                     0, /* U+00299c: RIGHT ANGLE VARIANT WITH SQUARE*/
+                                                     0, /* U+00299d: MEASURED RIGHT ANGLE WITH DOT*/
+                                                     0, /* U+00299e: ANGLE WITH S INSIDE*/
+                                                     0, /* U+00299f: ACUTE ANGLE*/
+                                                     0, /* U+0029a0: SPHERICAL ANGLE OPENING LEFT*/
+                                                     0, /* U+0029a1: SPHERICAL ANGLE OPENING UP*/
+                                                     0, /* U+0029a2: TURNED ANGLE*/
+                                                     0, /* U+0029a3: REVERSED ANGLE*/
+                                                     0, /* U+0029a4: ANGLE WITH UNDERBAR*/
+                                                     0, /* U+0029a5: REVERSED ANGLE WITH UNDERBAR*/
+                                                     0, /* U+0029a6: OBLIQUE ANGLE OPENING UP*/
+                                                     0, /* U+0029a7: OBLIQUE ANGLE OPENING DOWN*/
+                                                     0, /* U+0029a8: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT*/
+                                                     0, /* U+0029a9: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT*/
+                                                     0, /* U+0029aa: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT*/
+                                                     0, /* U+0029ab: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT*/
+                                                     0, /* U+0029ac: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP*/
+                                                     0, /* U+0029ad: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP*/
+                                                     0, /* U+0029ae: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN*/
+                                                     0, /* U+0029af: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN*/
+                                                     0, /* U+0029b0: REVERSED EMPTY SET*/
+                                                     0, /* U+0029b1: EMPTY SET WITH OVERBAR*/
+                                                     0, /* U+0029b2: EMPTY SET WITH SMALL CIRCLE ABOVE*/
+                                                     0, /* U+0029b3: EMPTY SET WITH RIGHT ARROW ABOVE*/
+                                                     0, /* U+0029b4: EMPTY SET WITH LEFT ARROW ABOVE*/
+                                                     0, /* U+0029b5: CIRCLE WITH HORIZONTAL BAR*/
+                                                     0, /* U+0029b6: CIRCLED VERTICAL BAR*/
+                                                     0, /* U+0029b7: CIRCLED PARALLEL*/
+                                                     0, /* U+0029b8: CIRCLED REVERSE SOLIDUS*/
+                                                     0, /* U+0029b9: CIRCLED PERPENDICULAR*/
+                                                     0, /* U+0029ba: CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR*/
+                                                     0, /* U+0029bb: CIRCLE WITH SUPERIMPOSED X*/
+                                                     0, /* U+0029bc: CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN*/
+                                                     0, /* U+0029bd: UP ARROW THROUGH CIRCLE*/
+                                                     0, /* U+0029be: CIRCLED WHITE BULLET*/
+                                                     0, /* U+0029bf: CIRCLED BULLET*/
+                                                     0, /* U+0029c0: CIRCLED LESS-THAN*/
+                                                     0, /* U+0029c1: CIRCLED GREATER-THAN*/
+                                                     0, /* U+0029c2: CIRCLE WITH SMALL CIRCLE TO THE RIGHT*/
+                                                     0, /* U+0029c3: CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT*/
+                                                     0, /* U+0029c4: SQUARED RISING DIAGONAL SLASH*/
+                                                     0, /* U+0029c5: SQUARED FALLING DIAGONAL SLASH*/
+                                                     0, /* U+0029c6: SQUARED ASTERISK*/
+                                                     0, /* U+0029c7: SQUARED SMALL CIRCLE*/
+                                                     0, /* U+0029c8: SQUARED SQUARE*/
+                                                     0, /* U+0029c9: TWO JOINED SQUARES*/
+                                                     0, /* U+0029ca: TRIANGLE WITH DOT ABOVE*/
+                                                     0, /* U+0029cb: TRIANGLE WITH UNDERBAR*/
+                                                     0, /* U+0029cc: S IN TRIANGLE*/
+                                                     0, /* U+0029cd: TRIANGLE WITH SERIFS AT BOTTOM*/
+                                                     0, /* U+0029ce: RIGHT TRIANGLE ABOVE LEFT TRIANGLE*/
+                                                     0, /* U+0029cf: LEFT TRIANGLE BESIDE VERTICAL BAR*/
+                                                     0, /* U+0029d0: VERTICAL BAR BESIDE RIGHT TRIANGLE*/
+                                                     0, /* U+0029d1: BOWTIE WITH LEFT HALF BLACK*/
+                                                     0, /* U+0029d2: BOWTIE WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0029d3: BLACK BOWTIE*/
+                                                     0, /* U+0029d4: TIMES WITH LEFT HALF BLACK*/
+                                                     0, /* U+0029d5: TIMES WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0029d6: WHITE HOURGLASS*/
+                                                     0, /* U+0029d7: BLACK HOURGLASS*/
+                                                     0, /* U+0029d8: LEFT WIGGLY FENCE*/
+                                                     0, /* U+0029d9: RIGHT WIGGLY FENCE*/
+                                                     0, /* U+0029da: LEFT DOUBLE WIGGLY FENCE*/
+                                                     0, /* U+0029db: RIGHT DOUBLE WIGGLY FENCE*/
+                                                     0, /* U+0029dc: INCOMPLETE INFINITY*/
+                                                     0, /* U+0029dd: TIE OVER INFINITY*/
+                                                     0, /* U+0029de: INFINITY NEGATED WITH VERTICAL BAR*/
+                                                     0, /* U+0029df: DOUBLE-ENDED MULTIMAP*/
+                                                     0, /* U+0029e0: SQUARE WITH CONTOURED OUTLINE*/
+                                                     0, /* U+0029e1: INCREASES AS*/
+                                                     0, /* U+0029e2: SHUFFLE PRODUCT*/
+                                                     0, /* U+0029e3: EQUALS SIGN AND SLANTED PARALLEL*/
+                                                     0, /* U+0029e4: EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE*/
+                                                     0, /* U+0029e5: IDENTICAL TO AND SLANTED PARALLEL*/
+                                                     0, /* U+0029e6: GLEICH STARK*/
+                                                     0, /* U+0029e7: THERMODYNAMIC*/
+                                                     0, /* U+0029e8: DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK*/
+                                                     0, /* U+0029e9: DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
+                                                     0, /* U+0029ea: BLACK DIAMOND WITH DOWN ARROW*/
+                                                     0, /* U+0029eb: BLACK LOZENGE*/
+                                                     0, /* U+0029ec: WHITE CIRCLE WITH DOWN ARROW*/
+                                                     0, /* U+0029ed: BLACK CIRCLE WITH DOWN ARROW*/
+                                                     0, /* U+0029ee: ERROR-BARRED WHITE SQUARE*/
+                                                     0, /* U+0029ef: ERROR-BARRED BLACK SQUARE*/
+                                                     0, /* U+0029f0: ERROR-BARRED WHITE DIAMOND*/
+                                                     0, /* U+0029f1: ERROR-BARRED BLACK DIAMOND*/
+                                                     0, /* U+0029f2: ERROR-BARRED WHITE CIRCLE*/
+                                                     0, /* U+0029f3: ERROR-BARRED BLACK CIRCLE*/
+                                                     0, /* U+0029f4: RULE-DELAYED*/
+                                                     0, /* U+0029f5: REVERSE SOLIDUS OPERATOR*/
+                                                     0, /* U+0029f6: SOLIDUS WITH OVERBAR*/
+                                                     0, /* U+0029f7: REVERSE SOLIDUS WITH HORIZONTAL STROKE*/
+                                                     0, /* U+0029f8: BIG SOLIDUS*/
+                                                     0, /* U+0029f9: BIG REVERSE SOLIDUS*/
+                                                     0, /* U+0029fa: DOUBLE PLUS*/
+                                                     0, /* U+0029fb: TRIPLE PLUS*/
+                                                     0, /* U+0029fc: LEFT-POINTING CURVED ANGLE BRACKET*/
+                                                     0, /* U+0029fd: RIGHT-POINTING CURVED ANGLE BRACKET*/
+                                                     0, /* U+0029fe: TINY*/
+                                                     0, /* U+0029ff: MINY*/
+                                                     0, /* U+002a00: N-ARY CIRCLED DOT OPERATOR*/
+                                                     0, /* U+002a01: N-ARY CIRCLED PLUS OPERATOR*/
+                                                     0, /* U+002a02: N-ARY CIRCLED TIMES OPERATOR*/
+                                                     0, /* U+002a03: N-ARY UNION OPERATOR WITH DOT*/
+                                                     0, /* U+002a04: N-ARY UNION OPERATOR WITH PLUS*/
+                                                     0, /* U+002a05: N-ARY SQUARE INTERSECTION OPERATOR*/
+                                                     0, /* U+002a06: N-ARY SQUARE UNION OPERATOR*/
+                                                     0, /* U+002a07: TWO LOGICAL AND OPERATOR*/
+                                                     0, /* U+002a08: TWO LOGICAL OR OPERATOR*/
+                                                     0, /* U+002a09: N-ARY TIMES OPERATOR*/
+                                                     0, /* U+002a0a: MODULO TWO SUM*/
+                                                     0, /* U+002a0b: SUMMATION WITH INTEGRAL*/
+                                                     0, /* U+002a0c: QUADRUPLE INTEGRAL OPERATOR*/
+                                                     0, /* U+002a0d: FINITE PART INTEGRAL*/
+                                                     0, /* U+002a0e: INTEGRAL WITH DOUBLE STROKE*/
+                                                     0, /* U+002a0f: INTEGRAL AVERAGE WITH SLASH*/
+                                                     0, /* U+002a10: CIRCULATION FUNCTION*/
+                                                     0, /* U+002a11: ANTICLOCKWISE INTEGRATION*/
+                                                     0, /* U+002a12: LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE*/
+                                                     0, /* U+002a13: LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE*/
+                                                     0, /* U+002a14: LINE INTEGRATION NOT INCLUDING THE POLE*/
+                                                     0, /* U+002a15: INTEGRAL AROUND A POINT OPERATOR*/
+                                                     0, /* U+002a16: QUATERNION INTEGRAL OPERATOR*/
+                                                     0, /* U+002a17: INTEGRAL WITH LEFTWARDS ARROW WITH HOOK*/
+                                                     0, /* U+002a18: INTEGRAL WITH TIMES SIGN*/
+                                                     0, /* U+002a19: INTEGRAL WITH INTERSECTION*/
+                                                     0, /* U+002a1a: INTEGRAL WITH UNION*/
+                                                     0, /* U+002a1b: INTEGRAL WITH OVERBAR*/
+                                                     0, /* U+002a1c: INTEGRAL WITH UNDERBAR*/
+                                                     0, /* U+002a1d: JOIN*/
+                                                     0, /* U+002a1e: LARGE LEFT TRIANGLE OPERATOR*/
+                                                     0, /* U+002a1f: Z NOTATION SCHEMA COMPOSITION*/
+                                                     0, /* U+002a20: Z NOTATION SCHEMA PIPING*/
+                                                     0, /* U+002a21: Z NOTATION SCHEMA PROJECTION*/
+                                                     0, /* U+002a22: PLUS SIGN WITH SMALL CIRCLE ABOVE*/
+                                                     0, /* U+002a23: PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE*/
+                                                     0, /* U+002a24: PLUS SIGN WITH TILDE ABOVE*/
+                                                     0, /* U+002a25: PLUS SIGN WITH DOT BELOW*/
+                                                     0, /* U+002a26: PLUS SIGN WITH TILDE BELOW*/
+                                                     0, /* U+002a27: PLUS SIGN WITH SUBSCRIPT TWO*/
+                                                     0, /* U+002a28: PLUS SIGN WITH BLACK TRIANGLE*/
+                                                     0, /* U+002a29: MINUS SIGN WITH COMMA ABOVE*/
+                                                     0, /* U+002a2a: MINUS SIGN WITH DOT BELOW*/
+                                                     0, /* U+002a2b: MINUS SIGN WITH FALLING DOTS*/
+                                                     0, /* U+002a2c: MINUS SIGN WITH RISING DOTS*/
+                                                     0, /* U+002a2d: PLUS SIGN IN LEFT HALF CIRCLE*/
+                                                     0, /* U+002a2e: PLUS SIGN IN RIGHT HALF CIRCLE*/
+                                                     0, /* U+002a2f: VECTOR OR CROSS PRODUCT*/
+                                                     0, /* U+002a30: MULTIPLICATION SIGN WITH DOT ABOVE*/
+                                                     0, /* U+002a31: MULTIPLICATION SIGN WITH UNDERBAR*/
+                                                     0, /* U+002a32: SEMIDIRECT PRODUCT WITH BOTTOM CLOSED*/
+                                                     0, /* U+002a33: SMASH PRODUCT*/
+                                                     0, /* U+002a34: MULTIPLICATION SIGN IN LEFT HALF CIRCLE*/
+                                                     0, /* U+002a35: MULTIPLICATION SIGN IN RIGHT HALF CIRCLE*/
+                                                     0, /* U+002a36: CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT*/
+                                                     0, /* U+002a37: MULTIPLICATION SIGN IN DOUBLE CIRCLE*/
+                                                     0, /* U+002a38: CIRCLED DIVISION SIGN*/
+                                                     0, /* U+002a39: PLUS SIGN IN TRIANGLE*/
+                                                     0, /* U+002a3a: MINUS SIGN IN TRIANGLE*/
+                                                     0, /* U+002a3b: MULTIPLICATION SIGN IN TRIANGLE*/
+                                                     0, /* U+002a3c: INTERIOR PRODUCT*/
+                                                     0, /* U+002a3d: RIGHTHAND INTERIOR PRODUCT*/
+                                                     0, /* U+002a3e: Z NOTATION RELATIONAL COMPOSITION*/
+                                                     0, /* U+002a3f: AMALGAMATION OR COPRODUCT*/
+                                                     0, /* U+002a40: INTERSECTION WITH DOT*/
+                                                     0, /* U+002a41: UNION WITH MINUS SIGN*/
+                                                     0, /* U+002a42: UNION WITH OVERBAR*/
+                                                     0, /* U+002a43: INTERSECTION WITH OVERBAR*/
+                                                     0, /* U+002a44: INTERSECTION WITH LOGICAL AND*/
+                                                     0, /* U+002a45: UNION WITH LOGICAL OR*/
+                                                     0, /* U+002a46: UNION ABOVE INTERSECTION*/
+                                                     0, /* U+002a47: INTERSECTION ABOVE UNION*/
+                                                     0, /* U+002a48: UNION ABOVE BAR ABOVE INTERSECTION*/
+                                                     0, /* U+002a49: INTERSECTION ABOVE BAR ABOVE UNION*/
+                                                     0, /* U+002a4a: UNION BESIDE AND JOINED WITH UNION*/
+                                                     0, /* U+002a4b: INTERSECTION BESIDE AND JOINED WITH INTERSECTION*/
+                                                     0, /* U+002a4c: CLOSED UNION WITH SERIFS*/
+                                                     0, /* U+002a4d: CLOSED INTERSECTION WITH SERIFS*/
+                                                     0, /* U+002a4e: DOUBLE SQUARE INTERSECTION*/
+                                                     0, /* U+002a4f: DOUBLE SQUARE UNION*/
+                                                     0, /* U+002a50: CLOSED UNION WITH SERIFS AND SMASH PRODUCT*/
+                                                     0, /* U+002a51: LOGICAL AND WITH DOT ABOVE*/
+                                                     0, /* U+002a52: LOGICAL OR WITH DOT ABOVE*/
+                                                     0, /* U+002a53: DOUBLE LOGICAL AND*/
+                                                     0, /* U+002a54: DOUBLE LOGICAL OR*/
+                                                     0, /* U+002a55: TWO INTERSECTING LOGICAL AND*/
+                                                     0, /* U+002a56: TWO INTERSECTING LOGICAL OR*/
+                                                     0, /* U+002a57: SLOPING LARGE OR*/
+                                                     0, /* U+002a58: SLOPING LARGE AND*/
+                                                     0, /* U+002a59: LOGICAL OR OVERLAPPING LOGICAL AND*/
+                                                     0, /* U+002a5a: LOGICAL AND WITH MIDDLE STEM*/
+                                                     0, /* U+002a5b: LOGICAL OR WITH MIDDLE STEM*/
+                                                     0, /* U+002a5c: LOGICAL AND WITH HORIZONTAL DASH*/
+                                                     0, /* U+002a5d: LOGICAL OR WITH HORIZONTAL DASH*/
+                                                     0, /* U+002a5e: LOGICAL AND WITH DOUBLE OVERBAR*/
+                                                     0, /* U+002a5f: LOGICAL AND WITH UNDERBAR*/
+                                                     0, /* U+002a60: LOGICAL AND WITH DOUBLE UNDERBAR*/
+                                                     0, /* U+002a61: SMALL VEE WITH UNDERBAR*/
+                                                     0, /* U+002a62: LOGICAL OR WITH DOUBLE OVERBAR*/
+                                                     0, /* U+002a63: LOGICAL OR WITH DOUBLE UNDERBAR*/
+                                                     0, /* U+002a64: Z NOTATION DOMAIN ANTIRESTRICTION*/
+                                                     0, /* U+002a65: Z NOTATION RANGE ANTIRESTRICTION*/
+                                                     0, /* U+002a66: EQUALS SIGN WITH DOT BELOW*/
+                                                     0, /* U+002a67: IDENTICAL WITH DOT ABOVE*/
+                                                     0, /* U+002a68: TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002a69: TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE*/
+                                                     0, /* U+002a6a: TILDE OPERATOR WITH DOT ABOVE*/
+                                                     0, /* U+002a6b: TILDE OPERATOR WITH RISING DOTS*/
+                                                     0, /* U+002a6c: SIMILAR MINUS SIMILAR*/
+                                                     0, /* U+002a6d: CONGRUENT WITH DOT ABOVE*/
+                                                     0, /* U+002a6e: EQUALS WITH ASTERISK*/
+                                                     0, /* U+002a6f: ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT*/
+                                                     0, /* U+002a70: APPROXIMATELY EQUAL OR EQUAL TO*/
+                                                     0, /* U+002a71: EQUALS SIGN ABOVE PLUS SIGN*/
+                                                     0, /* U+002a72: PLUS SIGN ABOVE EQUALS SIGN*/
+                                                     0, /* U+002a73: EQUALS SIGN ABOVE TILDE OPERATOR*/
+                                                     0, /* U+002a74: DOUBLE COLON EQUAL*/
+                                                     0, /* U+002a75: TWO CONSECUTIVE EQUALS SIGNS*/
+                                                     0, /* U+002a76: THREE CONSECUTIVE EQUALS SIGNS*/
+                                                     0, /* U+002a77: EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW*/
+                                                     0, /* U+002a78: EQUIVALENT WITH FOUR DOTS ABOVE*/
+                                                     0, /* U+002a79: LESS-THAN WITH CIRCLE INSIDE*/
+                                                     0, /* U+002a7a: GREATER-THAN WITH CIRCLE INSIDE*/
+                                                     0, /* U+002a7b: LESS-THAN WITH QUESTION MARK ABOVE*/
+                                                     0, /* U+002a7c: GREATER-THAN WITH QUESTION MARK ABOVE*/
+                                                     0, /* U+002a7d: LESS-THAN OR SLANTED EQUAL TO*/
+                                                     0, /* U+002a7e: GREATER-THAN OR SLANTED EQUAL TO*/
+                                                     0, /* U+002a7f: LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
+                                                     0, /* U+002a80: GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
+                                                     0, /* U+002a81: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
+                                                     0, /* U+002a82: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
+                                                     0, /* U+002a83: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT*/
+                                                     0, /* U+002a84: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT*/
+                                                     0, /* U+002a85: LESS-THAN OR APPROXIMATE*/
+                                                     0, /* U+002a86: GREATER-THAN OR APPROXIMATE*/
+                                                     0, /* U+002a87: LESS-THAN AND SINGLE-LINE NOT EQUAL TO*/
+                                                     0, /* U+002a88: GREATER-THAN AND SINGLE-LINE NOT EQUAL TO*/
+                                                     0, /* U+002a89: LESS-THAN AND NOT APPROXIMATE*/
+                                                     0, /* U+002a8a: GREATER-THAN AND NOT APPROXIMATE*/
+                                                     0, /* U+002a8b: LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN*/
+                                                     0, /* U+002a8c: GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN*/
+                                                     0, /* U+002a8d: LESS-THAN ABOVE SIMILAR OR EQUAL*/
+                                                     0, /* U+002a8e: GREATER-THAN ABOVE SIMILAR OR EQUAL*/
+                                                     0, /* U+002a8f: LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN*/
+                                                     0, /* U+002a90: GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN*/
+                                                     0, /* U+002a91: LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL*/
+                                                     0, /* U+002a92: GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL*/
+                                                     0, /* U+002a93: LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL*/
+                                                     0, /* U+002a94: GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL*/
+                                                     0, /* U+002a95: SLANTED EQUAL TO OR LESS-THAN*/
+                                                     0, /* U+002a96: SLANTED EQUAL TO OR GREATER-THAN*/
+                                                     0, /* U+002a97: SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE*/
+                                                     0, /* U+002a98: SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE*/
+                                                     0, /* U+002a99: DOUBLE-LINE EQUAL TO OR LESS-THAN*/
+                                                     0, /* U+002a9a: DOUBLE-LINE EQUAL TO OR GREATER-THAN*/
+                                                     0, /* U+002a9b: DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN*/
+                                                     0, /* U+002a9c: DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN*/
+                                                     0, /* U+002a9d: SIMILAR OR LESS-THAN*/
+                                                     0, /* U+002a9e: SIMILAR OR GREATER-THAN*/
+                                                     0, /* U+002a9f: SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN*/
+                                                     0, /* U+002aa0: SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN*/
+                                                     0, /* U+002aa1: DOUBLE NESTED LESS-THAN*/
+                                                     0, /* U+002aa2: DOUBLE NESTED GREATER-THAN*/
+                                                     0, /* U+002aa3: DOUBLE NESTED LESS-THAN WITH UNDERBAR*/
+                                                     0, /* U+002aa4: GREATER-THAN OVERLAPPING LESS-THAN*/
+                                                     0, /* U+002aa5: GREATER-THAN BESIDE LESS-THAN*/
+                                                     0, /* U+002aa6: LESS-THAN CLOSED BY CURVE*/
+                                                     0, /* U+002aa7: GREATER-THAN CLOSED BY CURVE*/
+                                                     0, /* U+002aa8: LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
+                                                     0, /* U+002aa9: GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
+                                                     0, /* U+002aaa: SMALLER THAN*/
+                                                     0, /* U+002aab: LARGER THAN*/
+                                                     0, /* U+002aac: SMALLER THAN OR EQUAL TO*/
+                                                     0, /* U+002aad: LARGER THAN OR EQUAL TO*/
+                                                     0, /* U+002aae: EQUALS SIGN WITH BUMPY ABOVE*/
+                                                     0, /* U+002aaf: PRECEDES ABOVE SINGLE-LINE EQUALS SIGN*/
+                                                     0, /* U+002ab0: SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN*/
+                                                     0, /* U+002ab1: PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO*/
+                                                     0, /* U+002ab2: SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO*/
+                                                     0, /* U+002ab3: PRECEDES ABOVE EQUALS SIGN*/
+                                                     0, /* U+002ab4: SUCCEEDS ABOVE EQUALS SIGN*/
+                                                     0, /* U+002ab5: PRECEDES ABOVE NOT EQUAL TO*/
+                                                     0, /* U+002ab6: SUCCEEDS ABOVE NOT EQUAL TO*/
+                                                     0, /* U+002ab7: PRECEDES ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002ab8: SUCCEEDS ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002ab9: PRECEDES ABOVE NOT ALMOST EQUAL TO*/
+                                                     0, /* U+002aba: SUCCEEDS ABOVE NOT ALMOST EQUAL TO*/
+                                                     0, /* U+002abb: DOUBLE PRECEDES*/
+                                                     0, /* U+002abc: DOUBLE SUCCEEDS*/
+                                                     0, /* U+002abd: SUBSET WITH DOT*/
+                                                     0, /* U+002abe: SUPERSET WITH DOT*/
+                                                     0, /* U+002abf: SUBSET WITH PLUS SIGN BELOW*/
+                                                     0, /* U+002ac0: SUPERSET WITH PLUS SIGN BELOW*/
+                                                     0, /* U+002ac1: SUBSET WITH MULTIPLICATION SIGN BELOW*/
+                                                     0, /* U+002ac2: SUPERSET WITH MULTIPLICATION SIGN BELOW*/
+                                                     0, /* U+002ac3: SUBSET OF OR EQUAL TO WITH DOT ABOVE*/
+                                                     0, /* U+002ac4: SUPERSET OF OR EQUAL TO WITH DOT ABOVE*/
+                                                     0, /* U+002ac5: SUBSET OF ABOVE EQUALS SIGN*/
+                                                     0, /* U+002ac6: SUPERSET OF ABOVE EQUALS SIGN*/
+                                                     0, /* U+002ac7: SUBSET OF ABOVE TILDE OPERATOR*/
+                                                     0, /* U+002ac8: SUPERSET OF ABOVE TILDE OPERATOR*/
+                                                     0, /* U+002ac9: SUBSET OF ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002aca: SUPERSET OF ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002acb: SUBSET OF ABOVE NOT EQUAL TO*/
+                                                     0, /* U+002acc: SUPERSET OF ABOVE NOT EQUAL TO*/
+                                                     0, /* U+002acd: SQUARE LEFT OPEN BOX OPERATOR*/
+                                                     0, /* U+002ace: SQUARE RIGHT OPEN BOX OPERATOR*/
+                                                     0, /* U+002acf: CLOSED SUBSET*/
+                                                     0, /* U+002ad0: CLOSED SUPERSET*/
+                                                     0, /* U+002ad1: CLOSED SUBSET OR EQUAL TO*/
+                                                     0, /* U+002ad2: CLOSED SUPERSET OR EQUAL TO*/
+                                                     0, /* U+002ad3: SUBSET ABOVE SUPERSET*/
+                                                     0, /* U+002ad4: SUPERSET ABOVE SUBSET*/
+                                                     0, /* U+002ad5: SUBSET ABOVE SUBSET*/
+                                                     0, /* U+002ad6: SUPERSET ABOVE SUPERSET*/
+                                                     0, /* U+002ad7: SUPERSET BESIDE SUBSET*/
+                                                     0, /* U+002ad8: SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET*/
+                                                     0, /* U+002ad9: ELEMENT OF OPENING DOWNWARDS*/
+                                                     0, /* U+002ada: PITCHFORK WITH TEE TOP*/
+                                                     0, /* U+002adb: TRANSVERSAL INTERSECTION*/
+                                                     0, /* U+002adc: FORKING*/
+                                                     0, /* U+002add: NONFORKING*/
+                                                     0, /* U+002ade: SHORT LEFT TACK*/
+                                                     0, /* U+002adf: SHORT DOWN TACK*/
+                                                     0, /* U+002ae0: SHORT UP TACK*/
+                                                     0, /* U+002ae1: PERPENDICULAR WITH S*/
+                                                     0, /* U+002ae2: VERTICAL BAR TRIPLE RIGHT TURNSTILE*/
+                                                     0, /* U+002ae3: DOUBLE VERTICAL BAR LEFT TURNSTILE*/
+                                                     0, /* U+002ae4: VERTICAL BAR DOUBLE LEFT TURNSTILE*/
+                                                     0, /* U+002ae5: DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE*/
+                                                     0, /* U+002ae6: LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL*/
+                                                     0, /* U+002ae7: SHORT DOWN TACK WITH OVERBAR*/
+                                                     0, /* U+002ae8: SHORT UP TACK WITH UNDERBAR*/
+                                                     0, /* U+002ae9: SHORT UP TACK ABOVE SHORT DOWN TACK*/
+                                                     0, /* U+002aea: DOUBLE DOWN TACK*/
+                                                     0, /* U+002aeb: DOUBLE UP TACK*/
+                                                     0, /* U+002aec: DOUBLE STROKE NOT SIGN*/
+                                                     0, /* U+002aed: REVERSED DOUBLE STROKE NOT SIGN*/
+                                                     0, /* U+002aee: DOES NOT DIVIDE WITH REVERSED NEGATION SLASH*/
+                                                     0, /* U+002aef: VERTICAL LINE WITH CIRCLE ABOVE*/
+                                                     0, /* U+002af0: VERTICAL LINE WITH CIRCLE BELOW*/
+                                                     0, /* U+002af1: DOWN TACK WITH CIRCLE BELOW*/
+                                                     0, /* U+002af2: PARALLEL WITH HORIZONTAL STROKE*/
+                                                     0, /* U+002af3: PARALLEL WITH TILDE OPERATOR*/
+                                                     0, /* U+002af4: TRIPLE VERTICAL BAR BINARY RELATION*/
+                                                     0, /* U+002af5: TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE*/
+                                                     0, /* U+002af6: TRIPLE COLON OPERATOR*/
+                                                     0, /* U+002af7: TRIPLE NESTED LESS-THAN*/
+                                                     0, /* U+002af8: TRIPLE NESTED GREATER-THAN*/
+                                                     0, /* U+002af9: DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO*/
+                                                     0, /* U+002afa: DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO*/
+                                                     0, /* U+002afb: TRIPLE SOLIDUS BINARY RELATION*/
+                                                     0, /* U+002afc: LARGE TRIPLE VERTICAL BAR OPERATOR*/
+                                                     0, /* U+002afd: DOUBLE SOLIDUS OPERATOR*/
+                                                     0, /* U+002afe: WHITE VERTICAL BAR*/
+                                                     0, /* U+002aff: N-ARY WHITE VERTICAL BAR*/
+                                                     0, /* U+002b00: NORTH EAST WHITE ARROW*/
+                                                     0, /* U+002b01: NORTH WEST WHITE ARROW*/
+                                                     0, /* U+002b02: SOUTH EAST WHITE ARROW*/
+                                                     0, /* U+002b03: SOUTH WEST WHITE ARROW*/
+                                                     0, /* U+002b04: LEFT RIGHT WHITE ARROW*/
+                                                     0, /* U+002b05: LEFTWARDS BLACK ARROW*/
+                                                     0, /* U+002b06: UPWARDS BLACK ARROW*/
+                                                     0, /* U+002b07: DOWNWARDS BLACK ARROW*/
+                                                     0, /* U+002b08: NORTH EAST BLACK ARROW*/
+                                                     0, /* U+002b09: NORTH WEST BLACK ARROW*/
+                                                     0, /* U+002b0a: SOUTH EAST BLACK ARROW*/
+                                                     0, /* U+002b0b: SOUTH WEST BLACK ARROW*/
+                                                     0, /* U+002b0c: LEFT RIGHT BLACK ARROW*/
+                                                     0, /* U+002b0d: UP DOWN BLACK ARROW*/
+                                                     0, /* U+002b0e: RIGHTWARDS ARROW WITH TIP DOWNWARDS*/
+                                                     0, /* U+002b0f: RIGHTWARDS ARROW WITH TIP UPWARDS*/
+                                                     0, /* U+002b10: LEFTWARDS ARROW WITH TIP DOWNWARDS*/
+                                                     0, /* U+002b11: LEFTWARDS ARROW WITH TIP UPWARDS*/
+                                                     0, /* U+002b12: SQUARE WITH TOP HALF BLACK*/
+                                                     0, /* U+002b13: SQUARE WITH BOTTOM HALF BLACK*/
+                                                     0, /* U+002b14: SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK*/
+                                                     0, /* U+002b15: SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK*/
+                                                     0, /* U+002b16: DIAMOND WITH LEFT HALF BLACK*/
+                                                     0, /* U+002b17: DIAMOND WITH RIGHT HALF BLACK*/
+                                                     0, /* U+002b18: DIAMOND WITH TOP HALF BLACK*/
+                                                     0, /* U+002b19: DIAMOND WITH BOTTOM HALF BLACK*/
+                                                     0, /* U+002b1a: DOTTED SQUARE*/
+                                                     0, /* U+002b1b: BLACK LARGE SQUARE*/
+                                                     0, /* U+002b1c: WHITE LARGE SQUARE*/
+                                                     0, /* U+002b1d: BLACK VERY SMALL SQUARE*/
+                                                     0, /* U+002b1e: WHITE VERY SMALL SQUARE*/
+                                                     0, /* U+002b1f: BLACK PENTAGON*/
+                                                     0, /* U+002b20: WHITE PENTAGON*/
+                                                     0, /* U+002b21: WHITE HEXAGON*/
+                                                     0, /* U+002b22: BLACK HEXAGON*/
+                                                     0, /* U+002b23: HORIZONTAL BLACK HEXAGON*/
+                                                     0, /* U+002b24: BLACK LARGE CIRCLE*/
+                                                     0, /* U+002b25: BLACK MEDIUM DIAMOND*/
+                                                     0, /* U+002b26: WHITE MEDIUM DIAMOND*/
+                                                     0, /* U+002b27: BLACK MEDIUM LOZENGE*/
+                                                     0, /* U+002b28: WHITE MEDIUM LOZENGE*/
+                                                     0, /* U+002b29: BLACK SMALL DIAMOND*/
+                                                     0, /* U+002b2a: BLACK SMALL LOZENGE*/
+                                                     0, /* U+002b2b: WHITE SMALL LOZENGE*/
+                                                     0, /* U+002b2c: BLACK HORIZONTAL ELLIPSE*/
+                                                     0, /* U+002b2d: WHITE HORIZONTAL ELLIPSE*/
+                                                     0, /* U+002b2e: BLACK VERTICAL ELLIPSE*/
+                                                     0, /* U+002b2f: WHITE VERTICAL ELLIPSE*/
+                                                     0, /* U+002b30: LEFT ARROW WITH SMALL CIRCLE*/
+                                                     0, /* U+002b31: THREE LEFTWARDS ARROWS*/
+                                                     0, /* U+002b32: LEFT ARROW WITH CIRCLED PLUS*/
+                                                     0, /* U+002b33: LONG LEFTWARDS SQUIGGLE ARROW*/
+                                                     0, /* U+002b34: LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
+                                                     0, /* U+002b35: LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002b36: LEFTWARDS TWO-HEADED ARROW FROM BAR*/
+                                                     0, /* U+002b37: LEFTWARDS TWO-HEADED TRIPLE DASH ARROW*/
+                                                     0, /* U+002b38: LEFTWARDS ARROW WITH DOTTED STEM*/
+                                                     0, /* U+002b39: LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
+                                                     0, /* U+002b3a: LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002b3b: LEFTWARDS TWO-HEADED ARROW WITH TAIL*/
+                                                     0, /* U+002b3c: LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
+                                                     0, /* U+002b3d: LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
+                                                     0, /* U+002b3e: LEFTWARDS ARROW THROUGH X*/
+                                                     0, /* U+002b3f: WAVE ARROW POINTING DIRECTLY LEFT*/
+                                                     0, /* U+002b40: EQUALS SIGN ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+002b41: REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+002b42: LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO*/
+                                                     0, /* U+002b43: RIGHTWARDS ARROW THROUGH GREATER-THAN*/
+                                                     0, /* U+002b44: RIGHTWARDS ARROW THROUGH SUPERSET*/
+                                                     0, /* U+002b45: LEFTWARDS QUADRUPLE ARROW*/
+                                                     0, /* U+002b46: RIGHTWARDS QUADRUPLE ARROW*/
+                                                     0, /* U+002b47: REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
+                                                     0, /* U+002b48: RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO*/
+                                                     0, /* U+002b49: TILDE OPERATOR ABOVE LEFTWARDS ARROW*/
+                                                     0, /* U+002b4a: LEFTWARDS ARROW ABOVE ALMOST EQUAL TO*/
+                                                     0, /* U+002b4b: LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR*/
+                                                     0, /* U+002b4c: RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR*/
+                                                     0, /* U+002b4d: */
+                                                     0, /* U+002b4e: */
+                                                     0, /* U+002b4f: */
+                                                     0, /* U+002b50: WHITE MEDIUM STAR*/
+                                                     0, /* U+002b51: BLACK SMALL STAR*/
+                                                     0, /* U+002b52: WHITE SMALL STAR*/
+                                                     0, /* U+002b53: BLACK RIGHT-POINTING PENTAGON*/
+                                                     0, /* U+002b54: WHITE RIGHT-POINTING PENTAGON*/
+                                                     0, /* U+002b55: HEAVY LARGE CIRCLE*/
+                                                     0, /* U+002b56: HEAVY OVAL WITH OVAL INSIDE*/
+                                                     0, /* U+002b57: HEAVY CIRCLE WITH CIRCLE INSIDE*/
+                                                     0, /* U+002b58: HEAVY CIRCLE*/
+                                                     0, /* U+002b59: HEAVY CIRCLED SALTIRE*/
+                                                     0, /* U+002b5a: */
+                                                     0, /* U+002b5b: */
+                                                     0, /* U+002b5c: */
+                                                     0, /* U+002b5d: */
+                                                     0, /* U+002b5e: */
+                                                     0, /* U+002b5f: */
+                                                     0, /* U+002b60: */
+                                                     0, /* U+002b61: */
+                                                     0, /* U+002b62: */
+                                                     0, /* U+002b63: */
+                                                     0, /* U+002b64: */
+                                                     0, /* U+002b65: */
+                                                     0, /* U+002b66: */
+                                                     0, /* U+002b67: */
+                                                     0, /* U+002b68: */
+                                                     0, /* U+002b69: */
+                                                     0, /* U+002b6a: */
+                                                     0, /* U+002b6b: */
+                                                     0, /* U+002b6c: */
+                                                     0, /* U+002b6d: */
+                                                     0, /* U+002b6e: */
+                                                     0, /* U+002b6f: */
+                                                     0, /* U+002b70: */
+                                                     0, /* U+002b71: */
+                                                     0, /* U+002b72: */
+                                                     0, /* U+002b73: */
+                                                     0, /* U+002b74: */
+                                                     0, /* U+002b75: */
+                                                     0, /* U+002b76: */
+                                                     0, /* U+002b77: */
+                                                     0, /* U+002b78: */
+                                                     0, /* U+002b79: */
+                                                     0, /* U+002b7a: */
+                                                     0, /* U+002b7b: */
+                                                     0, /* U+002b7c: */
+                                                     0, /* U+002b7d: */
+                                                     0, /* U+002b7e: */
+                                                     0, /* U+002b7f: */
+                                                     0, /* U+002b80: */
+                                                     0, /* U+002b81: */
+                                                     0, /* U+002b82: */
+                                                     0, /* U+002b83: */
+                                                     0, /* U+002b84: */
+                                                     0, /* U+002b85: */
+                                                     0, /* U+002b86: */
+                                                     0, /* U+002b87: */
+                                                     0, /* U+002b88: */
+                                                     0, /* U+002b89: */
+                                                     0, /* U+002b8a: */
+                                                     0, /* U+002b8b: */
+                                                     0, /* U+002b8c: */
+                                                     0, /* U+002b8d: */
+                                                     0, /* U+002b8e: */
+                                                     0, /* U+002b8f: */
+                                                     0, /* U+002b90: */
+                                                     0, /* U+002b91: */
+                                                     0, /* U+002b92: */
+                                                     0, /* U+002b93: */
+                                                     0, /* U+002b94: */
+                                                     0, /* U+002b95: */
+                                                     0, /* U+002b96: */
+                                                     0, /* U+002b97: */
+                                                     0, /* U+002b98: */
+                                                     0, /* U+002b99: */
+                                                     0, /* U+002b9a: */
+                                                     0, /* U+002b9b: */
+                                                     0, /* U+002b9c: */
+                                                     0, /* U+002b9d: */
+                                                     0, /* U+002b9e: */
+                                                     0, /* U+002b9f: */
+                                                     0, /* U+002ba0: */
+                                                     0, /* U+002ba1: */
+                                                     0, /* U+002ba2: */
+                                                     0, /* U+002ba3: */
+                                                     0, /* U+002ba4: */
+                                                     0, /* U+002ba5: */
+                                                     0, /* U+002ba6: */
+                                                     0, /* U+002ba7: */
+                                                     0, /* U+002ba8: */
+                                                     0, /* U+002ba9: */
+                                                     0, /* U+002baa: */
+                                                     0, /* U+002bab: */
+                                                     0, /* U+002bac: */
+                                                     0, /* U+002bad: */
+                                                     0, /* U+002bae: */
+                                                     0, /* U+002baf: */
+                                                     0, /* U+002bb0: */
+                                                     0, /* U+002bb1: */
+                                                     0, /* U+002bb2: */
+                                                     0, /* U+002bb3: */
+                                                     0, /* U+002bb4: */
+                                                     0, /* U+002bb5: */
+                                                     0, /* U+002bb6: */
+                                                     0, /* U+002bb7: */
+                                                     0, /* U+002bb8: */
+                                                     0, /* U+002bb9: */
+                                                     0, /* U+002bba: */
+                                                     0, /* U+002bbb: */
+                                                     0, /* U+002bbc: */
+                                                     0, /* U+002bbd: */
+                                                     0, /* U+002bbe: */
+                                                     0, /* U+002bbf: */
+                                                     0, /* U+002bc0: */
+                                                     0, /* U+002bc1: */
+                                                     0, /* U+002bc2: */
+                                                     0, /* U+002bc3: */
+                                                     0, /* U+002bc4: */
+                                                     0, /* U+002bc5: */
+                                                     0, /* U+002bc6: */
+                                                     0, /* U+002bc7: */
+                                                     0, /* U+002bc8: */
+                                                     0, /* U+002bc9: */
+                                                     0, /* U+002bca: */
+                                                     0, /* U+002bcb: */
+                                                     0, /* U+002bcc: */
+                                                     0, /* U+002bcd: */
+                                                     0, /* U+002bce: */
+                                                     0, /* U+002bcf: */
+                                                     0, /* U+002bd0: */
+                                                     0, /* U+002bd1: */
+                                                     0, /* U+002bd2: */
+                                                     0, /* U+002bd3: */
+                                                     0, /* U+002bd4: */
+                                                     0, /* U+002bd5: */
+                                                     0, /* U+002bd6: */
+                                                     0, /* U+002bd7: */
+                                                     0, /* U+002bd8: */
+                                                     0, /* U+002bd9: */
+                                                     0, /* U+002bda: */
+                                                     0, /* U+002bdb: */
+                                                     0, /* U+002bdc: */
+                                                     0, /* U+002bdd: */
+                                                     0, /* U+002bde: */
+                                                     0, /* U+002bdf: */
+                                                     0, /* U+002be0: */
+                                                     0, /* U+002be1: */
+                                                     0, /* U+002be2: */
+                                                     0, /* U+002be3: */
+                                                     0, /* U+002be4: */
+                                                     0, /* U+002be5: */
+                                                     0, /* U+002be6: */
+                                                     0, /* U+002be7: */
+                                                     0, /* U+002be8: */
+                                                     0, /* U+002be9: */
+                                                     0, /* U+002bea: */
+                                                     0, /* U+002beb: */
+                                                     0, /* U+002bec: */
+                                                     0, /* U+002bed: */
+                                                     0, /* U+002bee: */
+                                                     0, /* U+002bef: */
+                                                     0, /* U+002bf0: */
+                                                     0, /* U+002bf1: */
+                                                     0, /* U+002bf2: */
+                                                     0, /* U+002bf3: */
+                                                     0, /* U+002bf4: */
+                                                     0, /* U+002bf5: */
+                                                     0, /* U+002bf6: */
+                                                     0, /* U+002bf7: */
+                                                     0, /* U+002bf8: */
+                                                     0, /* U+002bf9: */
+                                                     0, /* U+002bfa: */
+                                                     0, /* U+002bfb: */
+                                                     0, /* U+002bfc: */
+                                                     0, /* U+002bfd: */
+                                                     0, /* U+002bfe: */
+                                                     0, /* U+002bff: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
+                                                     0, /* U+002c2f: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+                                                     0, /* U+002c5f: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c76: LATIN SMALL LETTER HALF H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c89: COPTIC SMALL LETTER EIE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c99: COPTIC SMALL LETTER MI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9b: COPTIC SMALL LETTER NI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9f: COPTIC SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca1: COPTIC SMALL LETTER PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca3: COPTIC SMALL LETTER RO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca9: COPTIC SMALL LETTER UA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cab: COPTIC SMALL LETTER FI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cad: COPTIC SMALL LETTER KHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002caf: COPTIC SMALL LETTER PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce4: COPTIC SYMBOL KAI*/
+                                                     0, /* U+002ce5: COPTIC SYMBOL MI RO*/
+                                                     0, /* U+002ce6: COPTIC SYMBOL PI RO*/
+                                                     0, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+                                                     0, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+                                                     0, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+                                                     0, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+                                                     0, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+                                                     0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+                                                     0, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cf3: COPTIC SMALL LETTER BOHAIRIC KHEI*/
+                                                     0, /* U+002cf4: */
+                                                     0, /* U+002cf5: */
+                                                     0, /* U+002cf6: */
+                                                     0, /* U+002cf7: */
+                                                     0, /* U+002cf8: */
+                                                     0, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
+                                                     0, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
+                                                     0, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
+                                                     0, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
+                                                     0, /* U+002cfd: COPTIC FRACTION ONE HALF*/
+                                                     0, /* U+002cfe: COPTIC FULL STOP*/
+                                                     0, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d00: GEORGIAN SMALL LETTER AN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d03: GEORGIAN SMALL LETTER DON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d04: GEORGIAN SMALL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d08: GEORGIAN SMALL LETTER IN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d13: GEORGIAN SMALL LETTER UN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d21: GEORGIAN SMALL LETTER HE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d23: GEORGIAN SMALL LETTER WE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
+                                                     0, /* U+002d26: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d27: GEORGIAN SMALL LETTER YN*/
+                                                     0, /* U+002d28: */
+                                                     0, /* U+002d29: */
+                                                     0, /* U+002d2a: */
+                                                     0, /* U+002d2b: */
+                                                     0, /* U+002d2c: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d2d: GEORGIAN SMALL LETTER AEN*/
+                                                     0, /* U+002d2e: */
+                                                     0, /* U+002d2f: */
+                                           RTUNI_ALPHA, /* U+002d30: TIFINAGH LETTER YA*/
+                                           RTUNI_ALPHA, /* U+002d31: TIFINAGH LETTER YAB*/
+                                           RTUNI_ALPHA, /* U+002d32: TIFINAGH LETTER YABH*/
+                                           RTUNI_ALPHA, /* U+002d33: TIFINAGH LETTER YAG*/
+                                           RTUNI_ALPHA, /* U+002d34: TIFINAGH LETTER YAGHH*/
+                                           RTUNI_ALPHA, /* U+002d35: TIFINAGH LETTER BERBER ACADEMY YAJ*/
+                                           RTUNI_ALPHA, /* U+002d36: TIFINAGH LETTER YAJ*/
+                                           RTUNI_ALPHA, /* U+002d37: TIFINAGH LETTER YAD*/
+                                           RTUNI_ALPHA, /* U+002d38: TIFINAGH LETTER YADH*/
+                                           RTUNI_ALPHA, /* U+002d39: TIFINAGH LETTER YADD*/
+                                           RTUNI_ALPHA, /* U+002d3a: TIFINAGH LETTER YADDH*/
+                                           RTUNI_ALPHA, /* U+002d3b: TIFINAGH LETTER YEY*/
+                                           RTUNI_ALPHA, /* U+002d3c: TIFINAGH LETTER YAF*/
+                                           RTUNI_ALPHA, /* U+002d3d: TIFINAGH LETTER YAK*/
+                                           RTUNI_ALPHA, /* U+002d3e: TIFINAGH LETTER TUAREG YAK*/
+                                           RTUNI_ALPHA, /* U+002d3f: TIFINAGH LETTER YAKHH*/
+                                           RTUNI_ALPHA, /* U+002d40: TIFINAGH LETTER YAH*/
+                                           RTUNI_ALPHA, /* U+002d41: TIFINAGH LETTER BERBER ACADEMY YAH*/
+                                           RTUNI_ALPHA, /* U+002d42: TIFINAGH LETTER TUAREG YAH*/
+                                           RTUNI_ALPHA, /* U+002d43: TIFINAGH LETTER YAHH*/
+                                           RTUNI_ALPHA, /* U+002d44: TIFINAGH LETTER YAA*/
+                                           RTUNI_ALPHA, /* U+002d45: TIFINAGH LETTER YAKH*/
+                                           RTUNI_ALPHA, /* U+002d46: TIFINAGH LETTER TUAREG YAKH*/
+                                           RTUNI_ALPHA, /* U+002d47: TIFINAGH LETTER YAQ*/
+                                           RTUNI_ALPHA, /* U+002d48: TIFINAGH LETTER TUAREG YAQ*/
+                                           RTUNI_ALPHA, /* U+002d49: TIFINAGH LETTER YI*/
+                                           RTUNI_ALPHA, /* U+002d4a: TIFINAGH LETTER YAZH*/
+                                           RTUNI_ALPHA, /* U+002d4b: TIFINAGH LETTER AHAGGAR YAZH*/
+                                           RTUNI_ALPHA, /* U+002d4c: TIFINAGH LETTER TUAREG YAZH*/
+                                           RTUNI_ALPHA, /* U+002d4d: TIFINAGH LETTER YAL*/
+                                           RTUNI_ALPHA, /* U+002d4e: TIFINAGH LETTER YAM*/
+                                           RTUNI_ALPHA, /* U+002d4f: TIFINAGH LETTER YAN*/
+                                           RTUNI_ALPHA, /* U+002d50: TIFINAGH LETTER TUAREG YAGN*/
+                                           RTUNI_ALPHA, /* U+002d51: TIFINAGH LETTER TUAREG YANG*/
+                                           RTUNI_ALPHA, /* U+002d52: TIFINAGH LETTER YAP*/
+                                           RTUNI_ALPHA, /* U+002d53: TIFINAGH LETTER YU*/
+                                           RTUNI_ALPHA, /* U+002d54: TIFINAGH LETTER YAR*/
+                                           RTUNI_ALPHA, /* U+002d55: TIFINAGH LETTER YARR*/
+                                           RTUNI_ALPHA, /* U+002d56: TIFINAGH LETTER YAGH*/
+                                           RTUNI_ALPHA, /* U+002d57: TIFINAGH LETTER TUAREG YAGH*/
+                                           RTUNI_ALPHA, /* U+002d58: TIFINAGH LETTER AYER YAGH*/
+                                           RTUNI_ALPHA, /* U+002d59: TIFINAGH LETTER YAS*/
+                                           RTUNI_ALPHA, /* U+002d5a: TIFINAGH LETTER YASS*/
+                                           RTUNI_ALPHA, /* U+002d5b: TIFINAGH LETTER YASH*/
+                                           RTUNI_ALPHA, /* U+002d5c: TIFINAGH LETTER YAT*/
+                                           RTUNI_ALPHA, /* U+002d5d: TIFINAGH LETTER YATH*/
+                                           RTUNI_ALPHA, /* U+002d5e: TIFINAGH LETTER YACH*/
+                                           RTUNI_ALPHA, /* U+002d5f: TIFINAGH LETTER YATT*/
+                                           RTUNI_ALPHA, /* U+002d60: TIFINAGH LETTER YAV*/
+                                           RTUNI_ALPHA, /* U+002d61: TIFINAGH LETTER YAW*/
+                                           RTUNI_ALPHA, /* U+002d62: TIFINAGH LETTER YAY*/
+                                           RTUNI_ALPHA, /* U+002d63: TIFINAGH LETTER YAZ*/
+                                           RTUNI_ALPHA, /* U+002d64: TIFINAGH LETTER TAWELLEMET YAZ*/
+                                           RTUNI_ALPHA, /* U+002d65: TIFINAGH LETTER YAZZ*/
+                                           RTUNI_ALPHA, /* U+002d66: TIFINAGH LETTER YE*/
+                                           RTUNI_ALPHA, /* U+002d67: TIFINAGH LETTER YO*/
+                                                     0, /* U+002d68: */
+                                                     0, /* U+002d69: */
+                                                     0, /* U+002d6a: */
+                                                     0, /* U+002d6b: */
+                                                     0, /* U+002d6c: */
+                                                     0, /* U+002d6d: */
+                                                     0, /* U+002d6e: */
+                                           RTUNI_ALPHA, /* U+002d6f: TIFINAGH MODIFIER LETTER LABIALIZATION MARK*/
+                                                     0, /* U+002d70: TIFINAGH SEPARATOR MARK*/
+                                                     0, /* U+002d71: */
+                                                     0, /* U+002d72: */
+                                                     0, /* U+002d73: */
+                                                     0, /* U+002d74: */
+                                                     0, /* U+002d75: */
+                                                     0, /* U+002d76: */
+                                                     0, /* U+002d77: */
+                                                     0, /* U+002d78: */
+                                                     0, /* U+002d79: */
+                                                     0, /* U+002d7a: */
+                                                     0, /* U+002d7b: */
+                                                     0, /* U+002d7c: */
+                                                     0, /* U+002d7d: */
+                                                     0, /* U+002d7e: */
+                                                     0, /* U+002d7f: TIFINAGH CONSONANT JOINER*/
+                                           RTUNI_ALPHA, /* U+002d80: ETHIOPIC SYLLABLE LOA*/
+                                           RTUNI_ALPHA, /* U+002d81: ETHIOPIC SYLLABLE MOA*/
+                                           RTUNI_ALPHA, /* U+002d82: ETHIOPIC SYLLABLE ROA*/
+                                           RTUNI_ALPHA, /* U+002d83: ETHIOPIC SYLLABLE SOA*/
+                                           RTUNI_ALPHA, /* U+002d84: ETHIOPIC SYLLABLE SHOA*/
+                                           RTUNI_ALPHA, /* U+002d85: ETHIOPIC SYLLABLE BOA*/
+                                           RTUNI_ALPHA, /* U+002d86: ETHIOPIC SYLLABLE TOA*/
+                                           RTUNI_ALPHA, /* U+002d87: ETHIOPIC SYLLABLE COA*/
+                                           RTUNI_ALPHA, /* U+002d88: ETHIOPIC SYLLABLE NOA*/
+                                           RTUNI_ALPHA, /* U+002d89: ETHIOPIC SYLLABLE NYOA*/
+                                           RTUNI_ALPHA, /* U+002d8a: ETHIOPIC SYLLABLE GLOTTAL OA*/
+                                           RTUNI_ALPHA, /* U+002d8b: ETHIOPIC SYLLABLE ZOA*/
+                                           RTUNI_ALPHA, /* U+002d8c: ETHIOPIC SYLLABLE DOA*/
+                                           RTUNI_ALPHA, /* U+002d8d: ETHIOPIC SYLLABLE DDOA*/
+                                           RTUNI_ALPHA, /* U+002d8e: ETHIOPIC SYLLABLE JOA*/
+                                           RTUNI_ALPHA, /* U+002d8f: ETHIOPIC SYLLABLE THOA*/
+                                           RTUNI_ALPHA, /* U+002d90: ETHIOPIC SYLLABLE CHOA*/
+                                           RTUNI_ALPHA, /* U+002d91: ETHIOPIC SYLLABLE PHOA*/
+                                           RTUNI_ALPHA, /* U+002d92: ETHIOPIC SYLLABLE POA*/
+                                           RTUNI_ALPHA, /* U+002d93: ETHIOPIC SYLLABLE GGWA*/
+                                           RTUNI_ALPHA, /* U+002d94: ETHIOPIC SYLLABLE GGWI*/
+                                           RTUNI_ALPHA, /* U+002d95: ETHIOPIC SYLLABLE GGWEE*/
+                                           RTUNI_ALPHA, /* U+002d96: ETHIOPIC SYLLABLE GGWE*/
+                                                     0, /* U+002d97: */
+                                                     0, /* U+002d98: */
+                                                     0, /* U+002d99: */
+                                                     0, /* U+002d9a: */
+                                                     0, /* U+002d9b: */
+                                                     0, /* U+002d9c: */
+                                                     0, /* U+002d9d: */
+                                                     0, /* U+002d9e: */
+                                                     0, /* U+002d9f: */
+                                           RTUNI_ALPHA, /* U+002da0: ETHIOPIC SYLLABLE SSA*/
+                                           RTUNI_ALPHA, /* U+002da1: ETHIOPIC SYLLABLE SSU*/
+                                           RTUNI_ALPHA, /* U+002da2: ETHIOPIC SYLLABLE SSI*/
+                                           RTUNI_ALPHA, /* U+002da3: ETHIOPIC SYLLABLE SSAA*/
+                                           RTUNI_ALPHA, /* U+002da4: ETHIOPIC SYLLABLE SSEE*/
+                                           RTUNI_ALPHA, /* U+002da5: ETHIOPIC SYLLABLE SSE*/
+                                           RTUNI_ALPHA, /* U+002da6: ETHIOPIC SYLLABLE SSO*/
+                                                     0, /* U+002da7: */
+                                           RTUNI_ALPHA, /* U+002da8: ETHIOPIC SYLLABLE CCA*/
+                                           RTUNI_ALPHA, /* U+002da9: ETHIOPIC SYLLABLE CCU*/
+                                           RTUNI_ALPHA, /* U+002daa: ETHIOPIC SYLLABLE CCI*/
+                                           RTUNI_ALPHA, /* U+002dab: ETHIOPIC SYLLABLE CCAA*/
+                                           RTUNI_ALPHA, /* U+002dac: ETHIOPIC SYLLABLE CCEE*/
+                                           RTUNI_ALPHA, /* U+002dad: ETHIOPIC SYLLABLE CCE*/
+                                           RTUNI_ALPHA, /* U+002dae: ETHIOPIC SYLLABLE CCO*/
+                                                     0, /* U+002daf: */
+                                           RTUNI_ALPHA, /* U+002db0: ETHIOPIC SYLLABLE ZZA*/
+                                           RTUNI_ALPHA, /* U+002db1: ETHIOPIC SYLLABLE ZZU*/
+                                           RTUNI_ALPHA, /* U+002db2: ETHIOPIC SYLLABLE ZZI*/
+                                           RTUNI_ALPHA, /* U+002db3: ETHIOPIC SYLLABLE ZZAA*/
+                                           RTUNI_ALPHA, /* U+002db4: ETHIOPIC SYLLABLE ZZEE*/
+                                           RTUNI_ALPHA, /* U+002db5: ETHIOPIC SYLLABLE ZZE*/
+                                           RTUNI_ALPHA, /* U+002db6: ETHIOPIC SYLLABLE ZZO*/
+                                                     0, /* U+002db7: */
+                                           RTUNI_ALPHA, /* U+002db8: ETHIOPIC SYLLABLE CCHA*/
+                                           RTUNI_ALPHA, /* U+002db9: ETHIOPIC SYLLABLE CCHU*/
+                                           RTUNI_ALPHA, /* U+002dba: ETHIOPIC SYLLABLE CCHI*/
+                                           RTUNI_ALPHA, /* U+002dbb: ETHIOPIC SYLLABLE CCHAA*/
+                                           RTUNI_ALPHA, /* U+002dbc: ETHIOPIC SYLLABLE CCHEE*/
+                                           RTUNI_ALPHA, /* U+002dbd: ETHIOPIC SYLLABLE CCHE*/
+                                           RTUNI_ALPHA, /* U+002dbe: ETHIOPIC SYLLABLE CCHO*/
+                                                     0, /* U+002dbf: */
+                                           RTUNI_ALPHA, /* U+002dc0: ETHIOPIC SYLLABLE QYA*/
+                                           RTUNI_ALPHA, /* U+002dc1: ETHIOPIC SYLLABLE QYU*/
+                                           RTUNI_ALPHA, /* U+002dc2: ETHIOPIC SYLLABLE QYI*/
+                                           RTUNI_ALPHA, /* U+002dc3: ETHIOPIC SYLLABLE QYAA*/
+                                           RTUNI_ALPHA, /* U+002dc4: ETHIOPIC SYLLABLE QYEE*/
+                                           RTUNI_ALPHA, /* U+002dc5: ETHIOPIC SYLLABLE QYE*/
+                                           RTUNI_ALPHA, /* U+002dc6: ETHIOPIC SYLLABLE QYO*/
+                                                     0, /* U+002dc7: */
+                                           RTUNI_ALPHA, /* U+002dc8: ETHIOPIC SYLLABLE KYA*/
+                                           RTUNI_ALPHA, /* U+002dc9: ETHIOPIC SYLLABLE KYU*/
+                                           RTUNI_ALPHA, /* U+002dca: ETHIOPIC SYLLABLE KYI*/
+                                           RTUNI_ALPHA, /* U+002dcb: ETHIOPIC SYLLABLE KYAA*/
+                                           RTUNI_ALPHA, /* U+002dcc: ETHIOPIC SYLLABLE KYEE*/
+                                           RTUNI_ALPHA, /* U+002dcd: ETHIOPIC SYLLABLE KYE*/
+                                           RTUNI_ALPHA, /* U+002dce: ETHIOPIC SYLLABLE KYO*/
+                                                     0, /* U+002dcf: */
+                                           RTUNI_ALPHA, /* U+002dd0: ETHIOPIC SYLLABLE XYA*/
+                                           RTUNI_ALPHA, /* U+002dd1: ETHIOPIC SYLLABLE XYU*/
+                                           RTUNI_ALPHA, /* U+002dd2: ETHIOPIC SYLLABLE XYI*/
+                                           RTUNI_ALPHA, /* U+002dd3: ETHIOPIC SYLLABLE XYAA*/
+                                           RTUNI_ALPHA, /* U+002dd4: ETHIOPIC SYLLABLE XYEE*/
+                                           RTUNI_ALPHA, /* U+002dd5: ETHIOPIC SYLLABLE XYE*/
+                                           RTUNI_ALPHA, /* U+002dd6: ETHIOPIC SYLLABLE XYO*/
+                                                     0, /* U+002dd7: */
+                                           RTUNI_ALPHA, /* U+002dd8: ETHIOPIC SYLLABLE GYA*/
+                                           RTUNI_ALPHA, /* U+002dd9: ETHIOPIC SYLLABLE GYU*/
+                                           RTUNI_ALPHA, /* U+002dda: ETHIOPIC SYLLABLE GYI*/
+                                           RTUNI_ALPHA, /* U+002ddb: ETHIOPIC SYLLABLE GYAA*/
+                                           RTUNI_ALPHA, /* U+002ddc: ETHIOPIC SYLLABLE GYEE*/
+                                           RTUNI_ALPHA, /* U+002ddd: ETHIOPIC SYLLABLE GYE*/
+                                           RTUNI_ALPHA, /* U+002dde: ETHIOPIC SYLLABLE GYO*/
+                                                     0, /* U+002ddf: */
+                                           RTUNI_ALPHA, /* U+002de0: COMBINING CYRILLIC LETTER BE*/
+                                           RTUNI_ALPHA, /* U+002de1: COMBINING CYRILLIC LETTER VE*/
+                                           RTUNI_ALPHA, /* U+002de2: COMBINING CYRILLIC LETTER GHE*/
+                                           RTUNI_ALPHA, /* U+002de3: COMBINING CYRILLIC LETTER DE*/
+                                           RTUNI_ALPHA, /* U+002de4: COMBINING CYRILLIC LETTER ZHE*/
+                                           RTUNI_ALPHA, /* U+002de5: COMBINING CYRILLIC LETTER ZE*/
+                                           RTUNI_ALPHA, /* U+002de6: COMBINING CYRILLIC LETTER KA*/
+                                           RTUNI_ALPHA, /* U+002de7: COMBINING CYRILLIC LETTER EL*/
+                                           RTUNI_ALPHA, /* U+002de8: COMBINING CYRILLIC LETTER EM*/
+                                           RTUNI_ALPHA, /* U+002de9: COMBINING CYRILLIC LETTER EN*/
+                                           RTUNI_ALPHA, /* U+002dea: COMBINING CYRILLIC LETTER O*/
+                                           RTUNI_ALPHA, /* U+002deb: COMBINING CYRILLIC LETTER PE*/
+                                           RTUNI_ALPHA, /* U+002dec: COMBINING CYRILLIC LETTER ER*/
+                                           RTUNI_ALPHA, /* U+002ded: COMBINING CYRILLIC LETTER ES*/
+                                           RTUNI_ALPHA, /* U+002dee: COMBINING CYRILLIC LETTER TE*/
+                                           RTUNI_ALPHA, /* U+002def: COMBINING CYRILLIC LETTER HA*/
+                                           RTUNI_ALPHA, /* U+002df0: COMBINING CYRILLIC LETTER TSE*/
+                                           RTUNI_ALPHA, /* U+002df1: COMBINING CYRILLIC LETTER CHE*/
+                                           RTUNI_ALPHA, /* U+002df2: COMBINING CYRILLIC LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+002df3: COMBINING CYRILLIC LETTER SHCHA*/
+                                           RTUNI_ALPHA, /* U+002df4: COMBINING CYRILLIC LETTER FITA*/
+                                           RTUNI_ALPHA, /* U+002df5: COMBINING CYRILLIC LETTER ES-TE*/
+                                           RTUNI_ALPHA, /* U+002df6: COMBINING CYRILLIC LETTER A*/
+                                           RTUNI_ALPHA, /* U+002df7: COMBINING CYRILLIC LETTER IE*/
+                                           RTUNI_ALPHA, /* U+002df8: COMBINING CYRILLIC LETTER DJERV*/
+                                           RTUNI_ALPHA, /* U+002df9: COMBINING CYRILLIC LETTER MONOGRAPH UK*/
+                                           RTUNI_ALPHA, /* U+002dfa: COMBINING CYRILLIC LETTER YAT*/
+                                           RTUNI_ALPHA, /* U+002dfb: COMBINING CYRILLIC LETTER YU*/
+                                           RTUNI_ALPHA, /* U+002dfc: COMBINING CYRILLIC LETTER IOTIFIED A*/
+                                           RTUNI_ALPHA, /* U+002dfd: COMBINING CYRILLIC LETTER LITTLE YUS*/
+                                           RTUNI_ALPHA, /* U+002dfe: COMBINING CYRILLIC LETTER BIG YUS*/
+                                           RTUNI_ALPHA, /* U+002dff: COMBINING CYRILLIC LETTER IOTIFIED BIG YUS*/
+                                                     0, /* U+002e00: RIGHT ANGLE SUBSTITUTION MARKER*/
+                                                     0, /* U+002e01: RIGHT ANGLE DOTTED SUBSTITUTION MARKER*/
+                                                     0, /* U+002e02: LEFT SUBSTITUTION BRACKET*/
+                                                     0, /* U+002e03: RIGHT SUBSTITUTION BRACKET*/
+                                                     0, /* U+002e04: LEFT DOTTED SUBSTITUTION BRACKET*/
+                                                     0, /* U+002e05: RIGHT DOTTED SUBSTITUTION BRACKET*/
+                                                     0, /* U+002e06: RAISED INTERPOLATION MARKER*/
+                                                     0, /* U+002e07: RAISED DOTTED INTERPOLATION MARKER*/
+                                                     0, /* U+002e08: DOTTED TRANSPOSITION MARKER*/
+                                                     0, /* U+002e09: LEFT TRANSPOSITION BRACKET*/
+                                                     0, /* U+002e0a: RIGHT TRANSPOSITION BRACKET*/
+                                                     0, /* U+002e0b: RAISED SQUARE*/
+                                                     0, /* U+002e0c: LEFT RAISED OMISSION BRACKET*/
+                                                     0, /* U+002e0d: RIGHT RAISED OMISSION BRACKET*/
+                                                     0, /* U+002e0e: EDITORIAL CORONIS*/
+                                                     0, /* U+002e0f: PARAGRAPHOS*/
+                                                     0, /* U+002e10: FORKED PARAGRAPHOS*/
+                                                     0, /* U+002e11: REVERSED FORKED PARAGRAPHOS*/
+                                                     0, /* U+002e12: HYPODIASTOLE*/
+                                                     0, /* U+002e13: DOTTED OBELOS*/
+                                                     0, /* U+002e14: DOWNWARDS ANCORA*/
+                                                     0, /* U+002e15: UPWARDS ANCORA*/
+                                                     0, /* U+002e16: DOTTED RIGHT-POINTING ANGLE*/
+                                                     0, /* U+002e17: DOUBLE OBLIQUE HYPHEN*/
+                                                     0, /* U+002e18: INVERTED INTERROBANG*/
+                                                     0, /* U+002e19: PALM BRANCH*/
+                                                     0, /* U+002e1a: HYPHEN WITH DIAERESIS*/
+                                                     0, /* U+002e1b: TILDE WITH RING ABOVE*/
+                                                     0, /* U+002e1c: LEFT LOW PARAPHRASE BRACKET*/
+                                                     0, /* U+002e1d: RIGHT LOW PARAPHRASE BRACKET*/
+                                                     0, /* U+002e1e: TILDE WITH DOT ABOVE*/
+                                                     0, /* U+002e1f: TILDE WITH DOT BELOW*/
+                                                     0, /* U+002e20: LEFT VERTICAL BAR WITH QUILL*/
+                                                     0, /* U+002e21: RIGHT VERTICAL BAR WITH QUILL*/
+                                                     0, /* U+002e22: TOP LEFT HALF BRACKET*/
+                                                     0, /* U+002e23: TOP RIGHT HALF BRACKET*/
+                                                     0, /* U+002e24: BOTTOM LEFT HALF BRACKET*/
+                                                     0, /* U+002e25: BOTTOM RIGHT HALF BRACKET*/
+                                                     0, /* U+002e26: LEFT SIDEWAYS U BRACKET*/
+                                                     0, /* U+002e27: RIGHT SIDEWAYS U BRACKET*/
+                                                     0, /* U+002e28: LEFT DOUBLE PARENTHESIS*/
+                                                     0, /* U+002e29: RIGHT DOUBLE PARENTHESIS*/
+                                                     0, /* U+002e2a: TWO DOTS OVER ONE DOT PUNCTUATION*/
+                                                     0, /* U+002e2b: ONE DOT OVER TWO DOTS PUNCTUATION*/
+                                                     0, /* U+002e2c: SQUARED FOUR DOT PUNCTUATION*/
+                                                     0, /* U+002e2d: FIVE DOT MARK*/
+                                                     0, /* U+002e2e: REVERSED QUESTION MARK*/
+                                           RTUNI_ALPHA, /* U+002e2f: VERTICAL TILDE*/
+                                                     0, /* U+002e30: RING POINT*/
+                                                     0, /* U+002e31: WORD SEPARATOR MIDDLE DOT*/
+                                                     0, /* U+002e32: TURNED COMMA*/
+                                                     0, /* U+002e33: RAISED DOT*/
+                                                     0, /* U+002e34: RAISED COMMA*/
+                                                     0, /* U+002e35: TURNED SEMICOLON*/
+                                                     0, /* U+002e36: DAGGER WITH LEFT GUARD*/
+                                                     0, /* U+002e37: DAGGER WITH RIGHT GUARD*/
+                                                     0, /* U+002e38: TURNED DAGGER*/
+                                                     0, /* U+002e39: TOP HALF SECTION SIGN*/
+                                                     0, /* U+002e3a: TWO-EM DASH*/
+                                                     0, /* U+002e3b: THREE-EM DASH*/
+                                                     0, /* U+002e3c: */
+                                                     0, /* U+002e3d: */
+                                                     0, /* U+002e3e: */
+                                                     0, /* U+002e3f: */
+                                                     0, /* U+002e40: */
+                                                     0, /* U+002e41: */
+                                                     0, /* U+002e42: */
+                                                     0, /* U+002e43: */
+                                                     0, /* U+002e44: */
+                                                     0, /* U+002e45: */
+                                                     0, /* U+002e46: */
+                                                     0, /* U+002e47: */
+                                                     0, /* U+002e48: */
+                                                     0, /* U+002e49: */
+                                                     0, /* U+002e4a: */
+                                                     0, /* U+002e4b: */
+                                                     0, /* U+002e4c: */
+                                                     0, /* U+002e4d: */
+                                                     0, /* U+002e4e: */
+                                                     0, /* U+002e4f: */
+                                                     0, /* U+002e50: */
+                                                     0, /* U+002e51: */
+                                                     0, /* U+002e52: */
+                                                     0, /* U+002e53: */
+                                                     0, /* U+002e54: */
+                                                     0, /* U+002e55: */
+                                                     0, /* U+002e56: */
+                                                     0, /* U+002e57: */
+                                                     0, /* U+002e58: */
+                                                     0, /* U+002e59: */
+                                                     0, /* U+002e5a: */
+                                                     0, /* U+002e5b: */
+                                                     0, /* U+002e5c: */
+                                                     0, /* U+002e5d: */
+                                                     0, /* U+002e5e: */
+                                                     0, /* U+002e5f: */
+                                                     0, /* U+002e60: */
+                                                     0, /* U+002e61: */
+                                                     0, /* U+002e62: */
+                                                     0, /* U+002e63: */
+                                                     0, /* U+002e64: */
+                                                     0, /* U+002e65: */
+                                                     0, /* U+002e66: */
+                                                     0, /* U+002e67: */
+                                                     0, /* U+002e68: */
+                                                     0, /* U+002e69: */
+                                                     0, /* U+002e6a: */
+                                                     0, /* U+002e6b: */
+                                                     0, /* U+002e6c: */
+                                                     0, /* U+002e6d: */
+                                                     0, /* U+002e6e: */
+                                                     0, /* U+002e6f: */
+                                                     0, /* U+002e70: */
+                                                     0, /* U+002e71: */
+                                                     0, /* U+002e72: */
+                                                     0, /* U+002e73: */
+                                                     0, /* U+002e74: */
+                                                     0, /* U+002e75: */
+                                                     0, /* U+002e76: */
+                                                     0, /* U+002e77: */
+                                                     0, /* U+002e78: */
+                                                     0, /* U+002e79: */
+                                                     0, /* U+002e7a: */
+                                                     0, /* U+002e7b: */
+                                                     0, /* U+002e7c: */
+                                                     0, /* U+002e7d: */
+                                                     0, /* U+002e7e: */
+                                                     0, /* U+002e7f: */
+                                                     0, /* U+002e80: CJK RADICAL REPEAT*/
+                                                     0, /* U+002e81: CJK RADICAL CLIFF*/
+                                                     0, /* U+002e82: CJK RADICAL SECOND ONE*/
+                                                     0, /* U+002e83: CJK RADICAL SECOND TWO*/
+                                                     0, /* U+002e84: CJK RADICAL SECOND THREE*/
+                                                     0, /* U+002e85: CJK RADICAL PERSON*/
+                                                     0, /* U+002e86: CJK RADICAL BOX*/
+                                                     0, /* U+002e87: CJK RADICAL TABLE*/
+                                                     0, /* U+002e88: CJK RADICAL KNIFE ONE*/
+                                                     0, /* U+002e89: CJK RADICAL KNIFE TWO*/
+                                                     0, /* U+002e8a: CJK RADICAL DIVINATION*/
+                                                     0, /* U+002e8b: CJK RADICAL SEAL*/
+                                                     0, /* U+002e8c: CJK RADICAL SMALL ONE*/
+                                                     0, /* U+002e8d: CJK RADICAL SMALL TWO*/
+                                                     0, /* U+002e8e: CJK RADICAL LAME ONE*/
+                                                     0, /* U+002e8f: CJK RADICAL LAME TWO*/
+                                                     0, /* U+002e90: CJK RADICAL LAME THREE*/
+                                                     0, /* U+002e91: CJK RADICAL LAME FOUR*/
+                                                     0, /* U+002e92: CJK RADICAL SNAKE*/
+                                                     0, /* U+002e93: CJK RADICAL THREAD*/
+                                                     0, /* U+002e94: CJK RADICAL SNOUT ONE*/
+                                                     0, /* U+002e95: CJK RADICAL SNOUT TWO*/
+                                                     0, /* U+002e96: CJK RADICAL HEART ONE*/
+                                                     0, /* U+002e97: CJK RADICAL HEART TWO*/
+                                                     0, /* U+002e98: CJK RADICAL HAND*/
+                                                     0, /* U+002e99: CJK RADICAL RAP*/
+                                                     0, /* U+002e9a: */
+                                                     0, /* U+002e9b: CJK RADICAL CHOKE*/
+                                                     0, /* U+002e9c: CJK RADICAL SUN*/
+                                                     0, /* U+002e9d: CJK RADICAL MOON*/
+                                                     0, /* U+002e9e: CJK RADICAL DEATH*/
+                                                     0, /* U+002e9f: CJK RADICAL MOTHER*/
+                                                     0, /* U+002ea0: CJK RADICAL CIVILIAN*/
+                                                     0, /* U+002ea1: CJK RADICAL WATER ONE*/
+                                                     0, /* U+002ea2: CJK RADICAL WATER TWO*/
+                                                     0, /* U+002ea3: CJK RADICAL FIRE*/
+                                                     0, /* U+002ea4: CJK RADICAL PAW ONE*/
+                                                     0, /* U+002ea5: CJK RADICAL PAW TWO*/
+                                                     0, /* U+002ea6: CJK RADICAL SIMPLIFIED HALF TREE TRUNK*/
+                                                     0, /* U+002ea7: CJK RADICAL COW*/
+                                                     0, /* U+002ea8: CJK RADICAL DOG*/
+                                                     0, /* U+002ea9: CJK RADICAL JADE*/
+                                                     0, /* U+002eaa: CJK RADICAL BOLT OF CLOTH*/
+                                                     0, /* U+002eab: CJK RADICAL EYE*/
+                                                     0, /* U+002eac: CJK RADICAL SPIRIT ONE*/
+                                                     0, /* U+002ead: CJK RADICAL SPIRIT TWO*/
+                                                     0, /* U+002eae: CJK RADICAL BAMBOO*/
+                                                     0, /* U+002eaf: CJK RADICAL SILK*/
+                                                     0, /* U+002eb0: CJK RADICAL C-SIMPLIFIED SILK*/
+                                                     0, /* U+002eb1: CJK RADICAL NET ONE*/
+                                                     0, /* U+002eb2: CJK RADICAL NET TWO*/
+                                                     0, /* U+002eb3: CJK RADICAL NET THREE*/
+                                                     0, /* U+002eb4: CJK RADICAL NET FOUR*/
+                                                     0, /* U+002eb5: CJK RADICAL MESH*/
+                                                     0, /* U+002eb6: CJK RADICAL SHEEP*/
+                                                     0, /* U+002eb7: CJK RADICAL RAM*/
+                                                     0, /* U+002eb8: CJK RADICAL EWE*/
+                                                     0, /* U+002eb9: CJK RADICAL OLD*/
+                                                     0, /* U+002eba: CJK RADICAL BRUSH ONE*/
+                                                     0, /* U+002ebb: CJK RADICAL BRUSH TWO*/
+                                                     0, /* U+002ebc: CJK RADICAL MEAT*/
+                                                     0, /* U+002ebd: CJK RADICAL MORTAR*/
+                                                     0, /* U+002ebe: CJK RADICAL GRASS ONE*/
+                                                     0, /* U+002ebf: CJK RADICAL GRASS TWO*/
+                                                     0, /* U+002ec0: CJK RADICAL GRASS THREE*/
+                                                     0, /* U+002ec1: CJK RADICAL TIGER*/
+                                                     0, /* U+002ec2: CJK RADICAL CLOTHES*/
+                                                     0, /* U+002ec3: CJK RADICAL WEST ONE*/
+                                                     0, /* U+002ec4: CJK RADICAL WEST TWO*/
+                                                     0, /* U+002ec5: CJK RADICAL C-SIMPLIFIED SEE*/
+                                                     0, /* U+002ec6: CJK RADICAL SIMPLIFIED HORN*/
+                                                     0, /* U+002ec7: CJK RADICAL HORN*/
+                                                     0, /* U+002ec8: CJK RADICAL C-SIMPLIFIED SPEECH*/
+                                                     0, /* U+002ec9: CJK RADICAL C-SIMPLIFIED SHELL*/
+                                                     0, /* U+002eca: CJK RADICAL FOOT*/
+                                                     0, /* U+002ecb: CJK RADICAL C-SIMPLIFIED CART*/
+                                                     0, /* U+002ecc: CJK RADICAL SIMPLIFIED WALK*/
+                                                     0, /* U+002ecd: CJK RADICAL WALK ONE*/
+                                                     0, /* U+002ece: CJK RADICAL WALK TWO*/
+                                                     0, /* U+002ecf: CJK RADICAL CITY*/
+                                                     0, /* U+002ed0: CJK RADICAL C-SIMPLIFIED GOLD*/
+                                                     0, /* U+002ed1: CJK RADICAL LONG ONE*/
+                                                     0, /* U+002ed2: CJK RADICAL LONG TWO*/
+                                                     0, /* U+002ed3: CJK RADICAL C-SIMPLIFIED LONG*/
+                                                     0, /* U+002ed4: CJK RADICAL C-SIMPLIFIED GATE*/
+                                                     0, /* U+002ed5: CJK RADICAL MOUND ONE*/
+                                                     0, /* U+002ed6: CJK RADICAL MOUND TWO*/
+                                                     0, /* U+002ed7: CJK RADICAL RAIN*/
+                                                     0, /* U+002ed8: CJK RADICAL BLUE*/
+                                                     0, /* U+002ed9: CJK RADICAL C-SIMPLIFIED TANNED LEATHER*/
+                                                     0, /* U+002eda: CJK RADICAL C-SIMPLIFIED LEAF*/
+                                                     0, /* U+002edb: CJK RADICAL C-SIMPLIFIED WIND*/
+                                                     0, /* U+002edc: CJK RADICAL C-SIMPLIFIED FLY*/
+                                                     0, /* U+002edd: CJK RADICAL EAT ONE*/
+                                                     0, /* U+002ede: CJK RADICAL EAT TWO*/
+                                                     0, /* U+002edf: CJK RADICAL EAT THREE*/
+                                                     0, /* U+002ee0: CJK RADICAL C-SIMPLIFIED EAT*/
+                                                     0, /* U+002ee1: CJK RADICAL HEAD*/
+                                                     0, /* U+002ee2: CJK RADICAL C-SIMPLIFIED HORSE*/
+                                                     0, /* U+002ee3: CJK RADICAL BONE*/
+                                                     0, /* U+002ee4: CJK RADICAL GHOST*/
+                                                     0, /* U+002ee5: CJK RADICAL C-SIMPLIFIED FISH*/
+                                                     0, /* U+002ee6: CJK RADICAL C-SIMPLIFIED BIRD*/
+                                                     0, /* U+002ee7: CJK RADICAL C-SIMPLIFIED SALT*/
+                                                     0, /* U+002ee8: CJK RADICAL SIMPLIFIED WHEAT*/
+                                                     0, /* U+002ee9: CJK RADICAL SIMPLIFIED YELLOW*/
+                                                     0, /* U+002eea: CJK RADICAL C-SIMPLIFIED FROG*/
+                                                     0, /* U+002eeb: CJK RADICAL J-SIMPLIFIED EVEN*/
+                                                     0, /* U+002eec: CJK RADICAL C-SIMPLIFIED EVEN*/
+                                                     0, /* U+002eed: CJK RADICAL J-SIMPLIFIED TOOTH*/
+                                                     0, /* U+002eee: CJK RADICAL C-SIMPLIFIED TOOTH*/
+                                                     0, /* U+002eef: CJK RADICAL J-SIMPLIFIED DRAGON*/
+                                                     0, /* U+002ef0: CJK RADICAL C-SIMPLIFIED DRAGON*/
+                                                     0, /* U+002ef1: CJK RADICAL TURTLE*/
+                                                     0, /* U+002ef2: CJK RADICAL J-SIMPLIFIED TURTLE*/
+                                                     0, /* U+002ef3: CJK RADICAL C-SIMPLIFIED TURTLE*/
+                                                     0, /* U+002ef4: */
+                                                     0, /* U+002ef5: */
+                                                     0, /* U+002ef6: */
+                                                     0, /* U+002ef7: */
+                                                     0, /* U+002ef8: */
+                                                     0, /* U+002ef9: */
+                                                     0, /* U+002efa: */
+                                                     0, /* U+002efb: */
+                                                     0, /* U+002efc: */
+                                                     0, /* U+002efd: */
+                                                     0, /* U+002efe: */
+                                                     0, /* U+002eff: */
+                                                     0, /* U+002f00: KANGXI RADICAL ONE*/
+                                                     0, /* U+002f01: KANGXI RADICAL LINE*/
+                                                     0, /* U+002f02: KANGXI RADICAL DOT*/
+                                                     0, /* U+002f03: KANGXI RADICAL SLASH*/
+                                                     0, /* U+002f04: KANGXI RADICAL SECOND*/
+                                                     0, /* U+002f05: KANGXI RADICAL HOOK*/
+                                                     0, /* U+002f06: KANGXI RADICAL TWO*/
+                                                     0, /* U+002f07: KANGXI RADICAL LID*/
+                                                     0, /* U+002f08: KANGXI RADICAL MAN*/
+                                                     0, /* U+002f09: KANGXI RADICAL LEGS*/
+                                                     0, /* U+002f0a: KANGXI RADICAL ENTER*/
+                                                     0, /* U+002f0b: KANGXI RADICAL EIGHT*/
+                                                     0, /* U+002f0c: KANGXI RADICAL DOWN BOX*/
+                                                     0, /* U+002f0d: KANGXI RADICAL COVER*/
+                                                     0, /* U+002f0e: KANGXI RADICAL ICE*/
+                                                     0, /* U+002f0f: KANGXI RADICAL TABLE*/
+                                                     0, /* U+002f10: KANGXI RADICAL OPEN BOX*/
+                                                     0, /* U+002f11: KANGXI RADICAL KNIFE*/
+                                                     0, /* U+002f12: KANGXI RADICAL POWER*/
+                                                     0, /* U+002f13: KANGXI RADICAL WRAP*/
+                                                     0, /* U+002f14: KANGXI RADICAL SPOON*/
+                                                     0, /* U+002f15: KANGXI RADICAL RIGHT OPEN BOX*/
+                                                     0, /* U+002f16: KANGXI RADICAL HIDING ENCLOSURE*/
+                                                     0, /* U+002f17: KANGXI RADICAL TEN*/
+                                                     0, /* U+002f18: KANGXI RADICAL DIVINATION*/
+                                                     0, /* U+002f19: KANGXI RADICAL SEAL*/
+                                                     0, /* U+002f1a: KANGXI RADICAL CLIFF*/
+                                                     0, /* U+002f1b: KANGXI RADICAL PRIVATE*/
+                                                     0, /* U+002f1c: KANGXI RADICAL AGAIN*/
+                                                     0, /* U+002f1d: KANGXI RADICAL MOUTH*/
+                                                     0, /* U+002f1e: KANGXI RADICAL ENCLOSURE*/
+                                                     0, /* U+002f1f: KANGXI RADICAL EARTH*/
+                                                     0, /* U+002f20: KANGXI RADICAL SCHOLAR*/
+                                                     0, /* U+002f21: KANGXI RADICAL GO*/
+                                                     0, /* U+002f22: KANGXI RADICAL GO SLOWLY*/
+                                                     0, /* U+002f23: KANGXI RADICAL EVENING*/
+                                                     0, /* U+002f24: KANGXI RADICAL BIG*/
+                                                     0, /* U+002f25: KANGXI RADICAL WOMAN*/
+                                                     0, /* U+002f26: KANGXI RADICAL CHILD*/
+                                                     0, /* U+002f27: KANGXI RADICAL ROOF*/
+                                                     0, /* U+002f28: KANGXI RADICAL INCH*/
+                                                     0, /* U+002f29: KANGXI RADICAL SMALL*/
+                                                     0, /* U+002f2a: KANGXI RADICAL LAME*/
+                                                     0, /* U+002f2b: KANGXI RADICAL CORPSE*/
+                                                     0, /* U+002f2c: KANGXI RADICAL SPROUT*/
+                                                     0, /* U+002f2d: KANGXI RADICAL MOUNTAIN*/
+                                                     0, /* U+002f2e: KANGXI RADICAL RIVER*/
+                                                     0, /* U+002f2f: KANGXI RADICAL WORK*/
+                                                     0, /* U+002f30: KANGXI RADICAL ONESELF*/
+                                                     0, /* U+002f31: KANGXI RADICAL TURBAN*/
+                                                     0, /* U+002f32: KANGXI RADICAL DRY*/
+                                                     0, /* U+002f33: KANGXI RADICAL SHORT THREAD*/
+                                                     0, /* U+002f34: KANGXI RADICAL DOTTED CLIFF*/
+                                                     0, /* U+002f35: KANGXI RADICAL LONG STRIDE*/
+                                                     0, /* U+002f36: KANGXI RADICAL TWO HANDS*/
+                                                     0, /* U+002f37: KANGXI RADICAL SHOOT*/
+                                                     0, /* U+002f38: KANGXI RADICAL BOW*/
+                                                     0, /* U+002f39: KANGXI RADICAL SNOUT*/
+                                                     0, /* U+002f3a: KANGXI RADICAL BRISTLE*/
+                                                     0, /* U+002f3b: KANGXI RADICAL STEP*/
+                                                     0, /* U+002f3c: KANGXI RADICAL HEART*/
+                                                     0, /* U+002f3d: KANGXI RADICAL HALBERD*/
+                                                     0, /* U+002f3e: KANGXI RADICAL DOOR*/
+                                                     0, /* U+002f3f: KANGXI RADICAL HAND*/
+                                                     0, /* U+002f40: KANGXI RADICAL BRANCH*/
+                                                     0, /* U+002f41: KANGXI RADICAL RAP*/
+                                                     0, /* U+002f42: KANGXI RADICAL SCRIPT*/
+                                                     0, /* U+002f43: KANGXI RADICAL DIPPER*/
+                                                     0, /* U+002f44: KANGXI RADICAL AXE*/
+                                                     0, /* U+002f45: KANGXI RADICAL SQUARE*/
+                                                     0, /* U+002f46: KANGXI RADICAL NOT*/
+                                                     0, /* U+002f47: KANGXI RADICAL SUN*/
+                                                     0, /* U+002f48: KANGXI RADICAL SAY*/
+                                                     0, /* U+002f49: KANGXI RADICAL MOON*/
+                                                     0, /* U+002f4a: KANGXI RADICAL TREE*/
+                                                     0, /* U+002f4b: KANGXI RADICAL LACK*/
+                                                     0, /* U+002f4c: KANGXI RADICAL STOP*/
+                                                     0, /* U+002f4d: KANGXI RADICAL DEATH*/
+                                                     0, /* U+002f4e: KANGXI RADICAL WEAPON*/
+                                                     0, /* U+002f4f: KANGXI RADICAL DO NOT*/
+                                                     0, /* U+002f50: KANGXI RADICAL COMPARE*/
+                                                     0, /* U+002f51: KANGXI RADICAL FUR*/
+                                                     0, /* U+002f52: KANGXI RADICAL CLAN*/
+                                                     0, /* U+002f53: KANGXI RADICAL STEAM*/
+                                                     0, /* U+002f54: KANGXI RADICAL WATER*/
+                                                     0, /* U+002f55: KANGXI RADICAL FIRE*/
+                                                     0, /* U+002f56: KANGXI RADICAL CLAW*/
+                                                     0, /* U+002f57: KANGXI RADICAL FATHER*/
+                                                     0, /* U+002f58: KANGXI RADICAL DOUBLE X*/
+                                                     0, /* U+002f59: KANGXI RADICAL HALF TREE TRUNK*/
+                                                     0, /* U+002f5a: KANGXI RADICAL SLICE*/
+                                                     0, /* U+002f5b: KANGXI RADICAL FANG*/
+                                                     0, /* U+002f5c: KANGXI RADICAL COW*/
+                                                     0, /* U+002f5d: KANGXI RADICAL DOG*/
+                                                     0, /* U+002f5e: KANGXI RADICAL PROFOUND*/
+                                                     0, /* U+002f5f: KANGXI RADICAL JADE*/
+                                                     0, /* U+002f60: KANGXI RADICAL MELON*/
+                                                     0, /* U+002f61: KANGXI RADICAL TILE*/
+                                                     0, /* U+002f62: KANGXI RADICAL SWEET*/
+                                                     0, /* U+002f63: KANGXI RADICAL LIFE*/
+                                                     0, /* U+002f64: KANGXI RADICAL USE*/
+                                                     0, /* U+002f65: KANGXI RADICAL FIELD*/
+                                                     0, /* U+002f66: KANGXI RADICAL BOLT OF CLOTH*/
+                                                     0, /* U+002f67: KANGXI RADICAL SICKNESS*/
+                                                     0, /* U+002f68: KANGXI RADICAL DOTTED TENT*/
+                                                     0, /* U+002f69: KANGXI RADICAL WHITE*/
+                                                     0, /* U+002f6a: KANGXI RADICAL SKIN*/
+                                                     0, /* U+002f6b: KANGXI RADICAL DISH*/
+                                                     0, /* U+002f6c: KANGXI RADICAL EYE*/
+                                                     0, /* U+002f6d: KANGXI RADICAL SPEAR*/
+                                                     0, /* U+002f6e: KANGXI RADICAL ARROW*/
+                                                     0, /* U+002f6f: KANGXI RADICAL STONE*/
+                                                     0, /* U+002f70: KANGXI RADICAL SPIRIT*/
+                                                     0, /* U+002f71: KANGXI RADICAL TRACK*/
+                                                     0, /* U+002f72: KANGXI RADICAL GRAIN*/
+                                                     0, /* U+002f73: KANGXI RADICAL CAVE*/
+                                                     0, /* U+002f74: KANGXI RADICAL STAND*/
+                                                     0, /* U+002f75: KANGXI RADICAL BAMBOO*/
+                                                     0, /* U+002f76: KANGXI RADICAL RICE*/
+                                                     0, /* U+002f77: KANGXI RADICAL SILK*/
+                                                     0, /* U+002f78: KANGXI RADICAL JAR*/
+                                                     0, /* U+002f79: KANGXI RADICAL NET*/
+                                                     0, /* U+002f7a: KANGXI RADICAL SHEEP*/
+                                                     0, /* U+002f7b: KANGXI RADICAL FEATHER*/
+                                                     0, /* U+002f7c: KANGXI RADICAL OLD*/
+                                                     0, /* U+002f7d: KANGXI RADICAL AND*/
+                                                     0, /* U+002f7e: KANGXI RADICAL PLOW*/
+                                                     0, /* U+002f7f: KANGXI RADICAL EAR*/
+                                                     0, /* U+002f80: KANGXI RADICAL BRUSH*/
+                                                     0, /* U+002f81: KANGXI RADICAL MEAT*/
+                                                     0, /* U+002f82: KANGXI RADICAL MINISTER*/
+                                                     0, /* U+002f83: KANGXI RADICAL SELF*/
+                                                     0, /* U+002f84: KANGXI RADICAL ARRIVE*/
+                                                     0, /* U+002f85: KANGXI RADICAL MORTAR*/
+                                                     0, /* U+002f86: KANGXI RADICAL TONGUE*/
+                                                     0, /* U+002f87: KANGXI RADICAL OPPOSE*/
+                                                     0, /* U+002f88: KANGXI RADICAL BOAT*/
+                                                     0, /* U+002f89: KANGXI RADICAL STOPPING*/
+                                                     0, /* U+002f8a: KANGXI RADICAL COLOR*/
+                                                     0, /* U+002f8b: KANGXI RADICAL GRASS*/
+                                                     0, /* U+002f8c: KANGXI RADICAL TIGER*/
+                                                     0, /* U+002f8d: KANGXI RADICAL INSECT*/
+                                                     0, /* U+002f8e: KANGXI RADICAL BLOOD*/
+                                                     0, /* U+002f8f: KANGXI RADICAL WALK ENCLOSURE*/
+                                                     0, /* U+002f90: KANGXI RADICAL CLOTHES*/
+                                                     0, /* U+002f91: KANGXI RADICAL WEST*/
+                                                     0, /* U+002f92: KANGXI RADICAL SEE*/
+                                                     0, /* U+002f93: KANGXI RADICAL HORN*/
+                                                     0, /* U+002f94: KANGXI RADICAL SPEECH*/
+                                                     0, /* U+002f95: KANGXI RADICAL VALLEY*/
+                                                     0, /* U+002f96: KANGXI RADICAL BEAN*/
+                                                     0, /* U+002f97: KANGXI RADICAL PIG*/
+                                                     0, /* U+002f98: KANGXI RADICAL BADGER*/
+                                                     0, /* U+002f99: KANGXI RADICAL SHELL*/
+                                                     0, /* U+002f9a: KANGXI RADICAL RED*/
+                                                     0, /* U+002f9b: KANGXI RADICAL RUN*/
+                                                     0, /* U+002f9c: KANGXI RADICAL FOOT*/
+                                                     0, /* U+002f9d: KANGXI RADICAL BODY*/
+                                                     0, /* U+002f9e: KANGXI RADICAL CART*/
+                                                     0, /* U+002f9f: KANGXI RADICAL BITTER*/
+                                                     0, /* U+002fa0: KANGXI RADICAL MORNING*/
+                                                     0, /* U+002fa1: KANGXI RADICAL WALK*/
+                                                     0, /* U+002fa2: KANGXI RADICAL CITY*/
+                                                     0, /* U+002fa3: KANGXI RADICAL WINE*/
+                                                     0, /* U+002fa4: KANGXI RADICAL DISTINGUISH*/
+                                                     0, /* U+002fa5: KANGXI RADICAL VILLAGE*/
+                                                     0, /* U+002fa6: KANGXI RADICAL GOLD*/
+                                                     0, /* U+002fa7: KANGXI RADICAL LONG*/
+                                                     0, /* U+002fa8: KANGXI RADICAL GATE*/
+                                                     0, /* U+002fa9: KANGXI RADICAL MOUND*/
+                                                     0, /* U+002faa: KANGXI RADICAL SLAVE*/
+                                                     0, /* U+002fab: KANGXI RADICAL SHORT TAILED BIRD*/
+                                                     0, /* U+002fac: KANGXI RADICAL RAIN*/
+                                                     0, /* U+002fad: KANGXI RADICAL BLUE*/
+                                                     0, /* U+002fae: KANGXI RADICAL WRONG*/
+                                                     0, /* U+002faf: KANGXI RADICAL FACE*/
+                                                     0, /* U+002fb0: KANGXI RADICAL LEATHER*/
+                                                     0, /* U+002fb1: KANGXI RADICAL TANNED LEATHER*/
+                                                     0, /* U+002fb2: KANGXI RADICAL LEEK*/
+                                                     0, /* U+002fb3: KANGXI RADICAL SOUND*/
+                                                     0, /* U+002fb4: KANGXI RADICAL LEAF*/
+                                                     0, /* U+002fb5: KANGXI RADICAL WIND*/
+                                                     0, /* U+002fb6: KANGXI RADICAL FLY*/
+                                                     0, /* U+002fb7: KANGXI RADICAL EAT*/
+                                                     0, /* U+002fb8: KANGXI RADICAL HEAD*/
+                                                     0, /* U+002fb9: KANGXI RADICAL FRAGRANT*/
+                                                     0, /* U+002fba: KANGXI RADICAL HORSE*/
+                                                     0, /* U+002fbb: KANGXI RADICAL BONE*/
+                                                     0, /* U+002fbc: KANGXI RADICAL TALL*/
+                                                     0, /* U+002fbd: KANGXI RADICAL HAIR*/
+                                                     0, /* U+002fbe: KANGXI RADICAL FIGHT*/
+                                                     0, /* U+002fbf: KANGXI RADICAL SACRIFICIAL WINE*/
+                                                     0, /* U+002fc0: KANGXI RADICAL CAULDRON*/
+                                                     0, /* U+002fc1: KANGXI RADICAL GHOST*/
+                                                     0, /* U+002fc2: KANGXI RADICAL FISH*/
+                                                     0, /* U+002fc3: KANGXI RADICAL BIRD*/
+                                                     0, /* U+002fc4: KANGXI RADICAL SALT*/
+                                                     0, /* U+002fc5: KANGXI RADICAL DEER*/
+                                                     0, /* U+002fc6: KANGXI RADICAL WHEAT*/
+                                                     0, /* U+002fc7: KANGXI RADICAL HEMP*/
+                                                     0, /* U+002fc8: KANGXI RADICAL YELLOW*/
+                                                     0, /* U+002fc9: KANGXI RADICAL MILLET*/
+                                                     0, /* U+002fca: KANGXI RADICAL BLACK*/
+                                                     0, /* U+002fcb: KANGXI RADICAL EMBROIDERY*/
+                                                     0, /* U+002fcc: KANGXI RADICAL FROG*/
+                                                     0, /* U+002fcd: KANGXI RADICAL TRIPOD*/
+                                                     0, /* U+002fce: KANGXI RADICAL DRUM*/
+                                                     0, /* U+002fcf: KANGXI RADICAL RAT*/
+                                                     0, /* U+002fd0: KANGXI RADICAL NOSE*/
+                                                     0, /* U+002fd1: KANGXI RADICAL EVEN*/
+                                                     0, /* U+002fd2: KANGXI RADICAL TOOTH*/
+                                                     0, /* U+002fd3: KANGXI RADICAL DRAGON*/
+                                                     0, /* U+002fd4: KANGXI RADICAL TURTLE*/
+                                                     0, /* U+002fd5: KANGXI RADICAL FLUTE*/
+                                                     0, /* U+002fd6: */
+                                                     0, /* U+002fd7: */
+                                                     0, /* U+002fd8: */
+                                                     0, /* U+002fd9: */
+                                                     0, /* U+002fda: */
+                                                     0, /* U+002fdb: */
+                                                     0, /* U+002fdc: */
+                                                     0, /* U+002fdd: */
+                                                     0, /* U+002fde: */
+                                                     0, /* U+002fdf: */
+                                                     0, /* U+002fe0: */
+                                                     0, /* U+002fe1: */
+                                                     0, /* U+002fe2: */
+                                                     0, /* U+002fe3: */
+                                                     0, /* U+002fe4: */
+                                                     0, /* U+002fe5: */
+                                                     0, /* U+002fe6: */
+                                                     0, /* U+002fe7: */
+                                                     0, /* U+002fe8: */
+                                                     0, /* U+002fe9: */
+                                                     0, /* U+002fea: */
+                                                     0, /* U+002feb: */
+                                                     0, /* U+002fec: */
+                                                     0, /* U+002fed: */
+                                                     0, /* U+002fee: */
+                                                     0, /* U+002fef: */
+                                                     0, /* U+002ff0: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT*/
+                                                     0, /* U+002ff1: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW*/
+                                                     0, /* U+002ff2: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT*/
+                                                     0, /* U+002ff3: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW*/
+                                                     0, /* U+002ff4: IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND*/
+                                                     0, /* U+002ff5: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE*/
+                                                     0, /* U+002ff6: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW*/
+                                                     0, /* U+002ff7: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT*/
+                                                     0, /* U+002ff8: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT*/
+                                                     0, /* U+002ff9: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT*/
+                                                     0, /* U+002ffa: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT*/
+                                                     0, /* U+002ffb: IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID*/
+                                                     0, /* U+002ffc: */
+                                                     0, /* U+002ffd: */
+                                                     0, /* U+002ffe: */
+                                                     0, /* U+002fff: */
+                                          RTUNI_WSPACE, /* U+003000: IDEOGRAPHIC SPACE*/
+                                                     0, /* U+003001: IDEOGRAPHIC COMMA*/
+                                                     0, /* U+003002: IDEOGRAPHIC FULL STOP*/
+                                                     0, /* U+003003: DITTO MARK*/
+                                                     0, /* U+003004: JAPANESE INDUSTRIAL STANDARD SYMBOL*/
+                                           RTUNI_ALPHA, /* U+003005: IDEOGRAPHIC ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+003006: IDEOGRAPHIC CLOSING MARK*/
+                                           RTUNI_ALPHA, /* U+003007: IDEOGRAPHIC NUMBER ZERO*/
+                                                     0, /* U+003008: LEFT ANGLE BRACKET*/
+                                                     0, /* U+003009: RIGHT ANGLE BRACKET*/
+                                                     0, /* U+00300a: LEFT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+00300b: RIGHT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+00300c: LEFT CORNER BRACKET*/
+                                                     0, /* U+00300d: RIGHT CORNER BRACKET*/
+                                                     0, /* U+00300e: LEFT WHITE CORNER BRACKET*/
+                                                     0, /* U+00300f: RIGHT WHITE CORNER BRACKET*/
+                                                     0, /* U+003010: LEFT BLACK LENTICULAR BRACKET*/
+                                                     0, /* U+003011: RIGHT BLACK LENTICULAR BRACKET*/
+                                                     0, /* U+003012: POSTAL MARK*/
+                                                     0, /* U+003013: GETA MARK*/
+                                                     0, /* U+003014: LEFT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+003015: RIGHT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+003016: LEFT WHITE LENTICULAR BRACKET*/
+                                                     0, /* U+003017: RIGHT WHITE LENTICULAR BRACKET*/
+                                                     0, /* U+003018: LEFT WHITE TORTOISE SHELL BRACKET*/
+                                                     0, /* U+003019: RIGHT WHITE TORTOISE SHELL BRACKET*/
+                                                     0, /* U+00301a: LEFT WHITE SQUARE BRACKET*/
+                                                     0, /* U+00301b: RIGHT WHITE SQUARE BRACKET*/
+                                                     0, /* U+00301c: WAVE DASH*/
+                                                     0, /* U+00301d: REVERSED DOUBLE PRIME QUOTATION MARK*/
+                                                     0, /* U+00301e: DOUBLE PRIME QUOTATION MARK*/
+                                                     0, /* U+00301f: LOW DOUBLE PRIME QUOTATION MARK*/
+                                                     0, /* U+003020: POSTAL MARK FACE*/
+                                           RTUNI_ALPHA, /* U+003021: HANGZHOU NUMERAL ONE*/
+                                           RTUNI_ALPHA, /* U+003022: HANGZHOU NUMERAL TWO*/
+                                           RTUNI_ALPHA, /* U+003023: HANGZHOU NUMERAL THREE*/
+                                           RTUNI_ALPHA, /* U+003024: HANGZHOU NUMERAL FOUR*/
+                                           RTUNI_ALPHA, /* U+003025: HANGZHOU NUMERAL FIVE*/
+                                           RTUNI_ALPHA, /* U+003026: HANGZHOU NUMERAL SIX*/
+                                           RTUNI_ALPHA, /* U+003027: HANGZHOU NUMERAL SEVEN*/
+                                           RTUNI_ALPHA, /* U+003028: HANGZHOU NUMERAL EIGHT*/
+                                           RTUNI_ALPHA, /* U+003029: HANGZHOU NUMERAL NINE*/
+                                                     0, /* U+00302a: IDEOGRAPHIC LEVEL TONE MARK*/
+                                                     0, /* U+00302b: IDEOGRAPHIC RISING TONE MARK*/
+                                                     0, /* U+00302c: IDEOGRAPHIC DEPARTING TONE MARK*/
+                                                     0, /* U+00302d: IDEOGRAPHIC ENTERING TONE MARK*/
+                                                     0, /* U+00302e: HANGUL SINGLE DOT TONE MARK*/
+                                                     0, /* U+00302f: HANGUL DOUBLE DOT TONE MARK*/
+                                                     0, /* U+003030: WAVY DASH*/
+                                           RTUNI_ALPHA, /* U+003031: VERTICAL KANA REPEAT MARK*/
+                                           RTUNI_ALPHA, /* U+003032: VERTICAL KANA REPEAT WITH VOICED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+003033: VERTICAL KANA REPEAT MARK UPPER HALF*/
+                                           RTUNI_ALPHA, /* U+003034: VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF*/
+                                           RTUNI_ALPHA, /* U+003035: VERTICAL KANA REPEAT MARK LOWER HALF*/
+                                                     0, /* U+003036: CIRCLED POSTAL MARK*/
+                                                     0, /* U+003037: IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL*/
+                                           RTUNI_ALPHA, /* U+003038: HANGZHOU NUMERAL TEN*/
+                                           RTUNI_ALPHA, /* U+003039: HANGZHOU NUMERAL TWENTY*/
+                                           RTUNI_ALPHA, /* U+00303a: HANGZHOU NUMERAL THIRTY*/
+                                           RTUNI_ALPHA, /* U+00303b: VERTICAL IDEOGRAPHIC ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+00303c: MASU MARK*/
+                                                     0, /* U+00303d: PART ALTERNATION MARK*/
+                                                     0, /* U+00303e: IDEOGRAPHIC VARIATION INDICATOR*/
+                                                     0, /* U+00303f: IDEOGRAPHIC HALF FILL SPACE*/
+                                                     0, /* U+003040: */
+                                           RTUNI_ALPHA, /* U+003041: HIRAGANA LETTER SMALL A*/
+                                           RTUNI_ALPHA, /* U+003042: HIRAGANA LETTER A*/
+                                           RTUNI_ALPHA, /* U+003043: HIRAGANA LETTER SMALL I*/
+                                           RTUNI_ALPHA, /* U+003044: HIRAGANA LETTER I*/
+                                           RTUNI_ALPHA, /* U+003045: HIRAGANA LETTER SMALL U*/
+                                           RTUNI_ALPHA, /* U+003046: HIRAGANA LETTER U*/
+                                           RTUNI_ALPHA, /* U+003047: HIRAGANA LETTER SMALL E*/
+                                           RTUNI_ALPHA, /* U+003048: HIRAGANA LETTER E*/
+                                           RTUNI_ALPHA, /* U+003049: HIRAGANA LETTER SMALL O*/
+                                           RTUNI_ALPHA, /* U+00304a: HIRAGANA LETTER O*/
+                                           RTUNI_ALPHA, /* U+00304b: HIRAGANA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00304c: HIRAGANA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00304d: HIRAGANA LETTER KI*/
+                                           RTUNI_ALPHA, /* U+00304e: HIRAGANA LETTER GI*/
+                                           RTUNI_ALPHA, /* U+00304f: HIRAGANA LETTER KU*/
+                                           RTUNI_ALPHA, /* U+003050: HIRAGANA LETTER GU*/
+                                           RTUNI_ALPHA, /* U+003051: HIRAGANA LETTER KE*/
+                                           RTUNI_ALPHA, /* U+003052: HIRAGANA LETTER GE*/
+                                           RTUNI_ALPHA, /* U+003053: HIRAGANA LETTER KO*/
+                                           RTUNI_ALPHA, /* U+003054: HIRAGANA LETTER GO*/
+                                           RTUNI_ALPHA, /* U+003055: HIRAGANA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+003056: HIRAGANA LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+003057: HIRAGANA LETTER SI*/
+                                           RTUNI_ALPHA, /* U+003058: HIRAGANA LETTER ZI*/
+                                           RTUNI_ALPHA, /* U+003059: HIRAGANA LETTER SU*/
+                                           RTUNI_ALPHA, /* U+00305a: HIRAGANA LETTER ZU*/
+                                           RTUNI_ALPHA, /* U+00305b: HIRAGANA LETTER SE*/
+                                           RTUNI_ALPHA, /* U+00305c: HIRAGANA LETTER ZE*/
+                                           RTUNI_ALPHA, /* U+00305d: HIRAGANA LETTER SO*/
+                                           RTUNI_ALPHA, /* U+00305e: HIRAGANA LETTER ZO*/
+                                           RTUNI_ALPHA, /* U+00305f: HIRAGANA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+003060: HIRAGANA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+003061: HIRAGANA LETTER TI*/
+                                           RTUNI_ALPHA, /* U+003062: HIRAGANA LETTER DI*/
+                                           RTUNI_ALPHA, /* U+003063: HIRAGANA LETTER SMALL TU*/
+                                           RTUNI_ALPHA, /* U+003064: HIRAGANA LETTER TU*/
+                                           RTUNI_ALPHA, /* U+003065: HIRAGANA LETTER DU*/
+                                           RTUNI_ALPHA, /* U+003066: HIRAGANA LETTER TE*/
+                                           RTUNI_ALPHA, /* U+003067: HIRAGANA LETTER DE*/
+                                           RTUNI_ALPHA, /* U+003068: HIRAGANA LETTER TO*/
+                                           RTUNI_ALPHA, /* U+003069: HIRAGANA LETTER DO*/
+                                           RTUNI_ALPHA, /* U+00306a: HIRAGANA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00306b: HIRAGANA LETTER NI*/
+                                           RTUNI_ALPHA, /* U+00306c: HIRAGANA LETTER NU*/
+                                           RTUNI_ALPHA, /* U+00306d: HIRAGANA LETTER NE*/
+                                           RTUNI_ALPHA, /* U+00306e: HIRAGANA LETTER NO*/
+                                           RTUNI_ALPHA, /* U+00306f: HIRAGANA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+003070: HIRAGANA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+003071: HIRAGANA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+003072: HIRAGANA LETTER HI*/
+                                           RTUNI_ALPHA, /* U+003073: HIRAGANA LETTER BI*/
+                                           RTUNI_ALPHA, /* U+003074: HIRAGANA LETTER PI*/
+                                           RTUNI_ALPHA, /* U+003075: HIRAGANA LETTER HU*/
+                                           RTUNI_ALPHA, /* U+003076: HIRAGANA LETTER BU*/
+                                           RTUNI_ALPHA, /* U+003077: HIRAGANA LETTER PU*/
+                                           RTUNI_ALPHA, /* U+003078: HIRAGANA LETTER HE*/
+                                           RTUNI_ALPHA, /* U+003079: HIRAGANA LETTER BE*/
+                                           RTUNI_ALPHA, /* U+00307a: HIRAGANA LETTER PE*/
+                                           RTUNI_ALPHA, /* U+00307b: HIRAGANA LETTER HO*/
+                                           RTUNI_ALPHA, /* U+00307c: HIRAGANA LETTER BO*/
+                                           RTUNI_ALPHA, /* U+00307d: HIRAGANA LETTER PO*/
+                                           RTUNI_ALPHA, /* U+00307e: HIRAGANA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00307f: HIRAGANA LETTER MI*/
+                                           RTUNI_ALPHA, /* U+003080: HIRAGANA LETTER MU*/
+                                           RTUNI_ALPHA, /* U+003081: HIRAGANA LETTER ME*/
+                                           RTUNI_ALPHA, /* U+003082: HIRAGANA LETTER MO*/
+                                           RTUNI_ALPHA, /* U+003083: HIRAGANA LETTER SMALL YA*/
+                                           RTUNI_ALPHA, /* U+003084: HIRAGANA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+003085: HIRAGANA LETTER SMALL YU*/
+                                           RTUNI_ALPHA, /* U+003086: HIRAGANA LETTER YU*/
+                                           RTUNI_ALPHA, /* U+003087: HIRAGANA LETTER SMALL YO*/
+                                           RTUNI_ALPHA, /* U+003088: HIRAGANA LETTER YO*/
+                                           RTUNI_ALPHA, /* U+003089: HIRAGANA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00308a: HIRAGANA LETTER RI*/
+                                           RTUNI_ALPHA, /* U+00308b: HIRAGANA LETTER RU*/
+                                           RTUNI_ALPHA, /* U+00308c: HIRAGANA LETTER RE*/
+                                           RTUNI_ALPHA, /* U+00308d: HIRAGANA LETTER RO*/
+                                           RTUNI_ALPHA, /* U+00308e: HIRAGANA LETTER SMALL WA*/
+                                           RTUNI_ALPHA, /* U+00308f: HIRAGANA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+003090: HIRAGANA LETTER WI*/
+                                           RTUNI_ALPHA, /* U+003091: HIRAGANA LETTER WE*/
+                                           RTUNI_ALPHA, /* U+003092: HIRAGANA LETTER WO*/
+                                           RTUNI_ALPHA, /* U+003093: HIRAGANA LETTER N*/
+                                           RTUNI_ALPHA, /* U+003094: HIRAGANA LETTER VU*/
+                                           RTUNI_ALPHA, /* U+003095: HIRAGANA LETTER SMALL KA*/
+                                           RTUNI_ALPHA, /* U+003096: HIRAGANA LETTER SMALL KE*/
+                                                     0, /* U+003097: */
+                                                     0, /* U+003098: */
+                                                     0, /* U+003099: COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK*/
+                                                     0, /* U+00309a: COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
+                                                     0, /* U+00309b: KATAKANA-HIRAGANA VOICED SOUND MARK*/
+                                                     0, /* U+00309c: KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+00309d: HIRAGANA ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+00309e: HIRAGANA VOICED ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+00309f: HIRAGANA DIGRAPH YORI*/
+                                                     0, /* U+0030a0: KATAKANA-HIRAGANA DOUBLE HYPHEN*/
+                                           RTUNI_ALPHA, /* U+0030a1: KATAKANA LETTER SMALL A*/
+                                           RTUNI_ALPHA, /* U+0030a2: KATAKANA LETTER A*/
+                                           RTUNI_ALPHA, /* U+0030a3: KATAKANA LETTER SMALL I*/
+                                           RTUNI_ALPHA, /* U+0030a4: KATAKANA LETTER I*/
+                                           RTUNI_ALPHA, /* U+0030a5: KATAKANA LETTER SMALL U*/
+                                           RTUNI_ALPHA, /* U+0030a6: KATAKANA LETTER U*/
+                                           RTUNI_ALPHA, /* U+0030a7: KATAKANA LETTER SMALL E*/
+                                           RTUNI_ALPHA, /* U+0030a8: KATAKANA LETTER E*/
+                                           RTUNI_ALPHA, /* U+0030a9: KATAKANA LETTER SMALL O*/
+                                           RTUNI_ALPHA, /* U+0030aa: KATAKANA LETTER O*/
+                                           RTUNI_ALPHA, /* U+0030ab: KATAKANA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+0030ac: KATAKANA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+0030ad: KATAKANA LETTER KI*/
+                                           RTUNI_ALPHA, /* U+0030ae: KATAKANA LETTER GI*/
+                                           RTUNI_ALPHA, /* U+0030af: KATAKANA LETTER KU*/
+                                           RTUNI_ALPHA, /* U+0030b0: KATAKANA LETTER GU*/
+                                           RTUNI_ALPHA, /* U+0030b1: KATAKANA LETTER KE*/
+                                           RTUNI_ALPHA, /* U+0030b2: KATAKANA LETTER GE*/
+                                           RTUNI_ALPHA, /* U+0030b3: KATAKANA LETTER KO*/
+                                           RTUNI_ALPHA, /* U+0030b4: KATAKANA LETTER GO*/
+                                           RTUNI_ALPHA, /* U+0030b5: KATAKANA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0030b6: KATAKANA LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+0030b7: KATAKANA LETTER SI*/
+                                           RTUNI_ALPHA, /* U+0030b8: KATAKANA LETTER ZI*/
+                                           RTUNI_ALPHA, /* U+0030b9: KATAKANA LETTER SU*/
+                                           RTUNI_ALPHA, /* U+0030ba: KATAKANA LETTER ZU*/
+                                           RTUNI_ALPHA, /* U+0030bb: KATAKANA LETTER SE*/
+                                           RTUNI_ALPHA, /* U+0030bc: KATAKANA LETTER ZE*/
+                                           RTUNI_ALPHA, /* U+0030bd: KATAKANA LETTER SO*/
+                                           RTUNI_ALPHA, /* U+0030be: KATAKANA LETTER ZO*/
+                                           RTUNI_ALPHA, /* U+0030bf: KATAKANA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0030c0: KATAKANA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0030c1: KATAKANA LETTER TI*/
+                                           RTUNI_ALPHA, /* U+0030c2: KATAKANA LETTER DI*/
+                                           RTUNI_ALPHA, /* U+0030c3: KATAKANA LETTER SMALL TU*/
+                                           RTUNI_ALPHA, /* U+0030c4: KATAKANA LETTER TU*/
+                                           RTUNI_ALPHA, /* U+0030c5: KATAKANA LETTER DU*/
+                                           RTUNI_ALPHA, /* U+0030c6: KATAKANA LETTER TE*/
+                                           RTUNI_ALPHA, /* U+0030c7: KATAKANA LETTER DE*/
+                                           RTUNI_ALPHA, /* U+0030c8: KATAKANA LETTER TO*/
+                                           RTUNI_ALPHA, /* U+0030c9: KATAKANA LETTER DO*/
+                                           RTUNI_ALPHA, /* U+0030ca: KATAKANA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0030cb: KATAKANA LETTER NI*/
+                                           RTUNI_ALPHA, /* U+0030cc: KATAKANA LETTER NU*/
+                                           RTUNI_ALPHA, /* U+0030cd: KATAKANA LETTER NE*/
+                                           RTUNI_ALPHA, /* U+0030ce: KATAKANA LETTER NO*/
+                                           RTUNI_ALPHA, /* U+0030cf: KATAKANA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0030d0: KATAKANA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0030d1: KATAKANA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0030d2: KATAKANA LETTER HI*/
+                                           RTUNI_ALPHA, /* U+0030d3: KATAKANA LETTER BI*/
+                                           RTUNI_ALPHA, /* U+0030d4: KATAKANA LETTER PI*/
+                                           RTUNI_ALPHA, /* U+0030d5: KATAKANA LETTER HU*/
+                                           RTUNI_ALPHA, /* U+0030d6: KATAKANA LETTER BU*/
+                                           RTUNI_ALPHA, /* U+0030d7: KATAKANA LETTER PU*/
+                                           RTUNI_ALPHA, /* U+0030d8: KATAKANA LETTER HE*/
+                                           RTUNI_ALPHA, /* U+0030d9: KATAKANA LETTER BE*/
+                                           RTUNI_ALPHA, /* U+0030da: KATAKANA LETTER PE*/
+                                           RTUNI_ALPHA, /* U+0030db: KATAKANA LETTER HO*/
+                                           RTUNI_ALPHA, /* U+0030dc: KATAKANA LETTER BO*/
+                                           RTUNI_ALPHA, /* U+0030dd: KATAKANA LETTER PO*/
+                                           RTUNI_ALPHA, /* U+0030de: KATAKANA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0030df: KATAKANA LETTER MI*/
+                                           RTUNI_ALPHA, /* U+0030e0: KATAKANA LETTER MU*/
+                                           RTUNI_ALPHA, /* U+0030e1: KATAKANA LETTER ME*/
+                                           RTUNI_ALPHA, /* U+0030e2: KATAKANA LETTER MO*/
+                                           RTUNI_ALPHA, /* U+0030e3: KATAKANA LETTER SMALL YA*/
+                                           RTUNI_ALPHA, /* U+0030e4: KATAKANA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0030e5: KATAKANA LETTER SMALL YU*/
+                                           RTUNI_ALPHA, /* U+0030e6: KATAKANA LETTER YU*/
+                                           RTUNI_ALPHA, /* U+0030e7: KATAKANA LETTER SMALL YO*/
+                                           RTUNI_ALPHA, /* U+0030e8: KATAKANA LETTER YO*/
+                                           RTUNI_ALPHA, /* U+0030e9: KATAKANA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0030ea: KATAKANA LETTER RI*/
+                                           RTUNI_ALPHA, /* U+0030eb: KATAKANA LETTER RU*/
+                                           RTUNI_ALPHA, /* U+0030ec: KATAKANA LETTER RE*/
+                                           RTUNI_ALPHA, /* U+0030ed: KATAKANA LETTER RO*/
+                                           RTUNI_ALPHA, /* U+0030ee: KATAKANA LETTER SMALL WA*/
+                                           RTUNI_ALPHA, /* U+0030ef: KATAKANA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+0030f0: KATAKANA LETTER WI*/
+                                           RTUNI_ALPHA, /* U+0030f1: KATAKANA LETTER WE*/
+                                           RTUNI_ALPHA, /* U+0030f2: KATAKANA LETTER WO*/
+                                           RTUNI_ALPHA, /* U+0030f3: KATAKANA LETTER N*/
+                                           RTUNI_ALPHA, /* U+0030f4: KATAKANA LETTER VU*/
+                                           RTUNI_ALPHA, /* U+0030f5: KATAKANA LETTER SMALL KA*/
+                                           RTUNI_ALPHA, /* U+0030f6: KATAKANA LETTER SMALL KE*/
+                                           RTUNI_ALPHA, /* U+0030f7: KATAKANA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+0030f8: KATAKANA LETTER VI*/
+                                           RTUNI_ALPHA, /* U+0030f9: KATAKANA LETTER VE*/
+                                           RTUNI_ALPHA, /* U+0030fa: KATAKANA LETTER VO*/
+                                                     0, /* U+0030fb: KATAKANA MIDDLE DOT*/
+                                           RTUNI_ALPHA, /* U+0030fc: KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+0030fd: KATAKANA ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+0030fe: KATAKANA VOICED ITERATION MARK*/
+                                           RTUNI_ALPHA, /* U+0030ff: KATAKANA DIGRAPH KOTO*/
+                                                     0, /* U+003100: */
+                                                     0, /* U+003101: */
+                                                     0, /* U+003102: */
+                                                     0, /* U+003103: */
+                                                     0, /* U+003104: */
+                                           RTUNI_ALPHA, /* U+003105: BOPOMOFO LETTER B*/
+                                           RTUNI_ALPHA, /* U+003106: BOPOMOFO LETTER P*/
+                                           RTUNI_ALPHA, /* U+003107: BOPOMOFO LETTER M*/
+                                           RTUNI_ALPHA, /* U+003108: BOPOMOFO LETTER F*/
+                                           RTUNI_ALPHA, /* U+003109: BOPOMOFO LETTER D*/
+                                           RTUNI_ALPHA, /* U+00310a: BOPOMOFO LETTER T*/
+                                           RTUNI_ALPHA, /* U+00310b: BOPOMOFO LETTER N*/
+                                           RTUNI_ALPHA, /* U+00310c: BOPOMOFO LETTER L*/
+                                           RTUNI_ALPHA, /* U+00310d: BOPOMOFO LETTER G*/
+                                           RTUNI_ALPHA, /* U+00310e: BOPOMOFO LETTER K*/
+                                           RTUNI_ALPHA, /* U+00310f: BOPOMOFO LETTER H*/
+                                           RTUNI_ALPHA, /* U+003110: BOPOMOFO LETTER J*/
+                                           RTUNI_ALPHA, /* U+003111: BOPOMOFO LETTER Q*/
+                                           RTUNI_ALPHA, /* U+003112: BOPOMOFO LETTER X*/
+                                           RTUNI_ALPHA, /* U+003113: BOPOMOFO LETTER ZH*/
+                                           RTUNI_ALPHA, /* U+003114: BOPOMOFO LETTER CH*/
+                                           RTUNI_ALPHA, /* U+003115: BOPOMOFO LETTER SH*/
+                                           RTUNI_ALPHA, /* U+003116: BOPOMOFO LETTER R*/
+                                           RTUNI_ALPHA, /* U+003117: BOPOMOFO LETTER Z*/
+                                           RTUNI_ALPHA, /* U+003118: BOPOMOFO LETTER C*/
+                                           RTUNI_ALPHA, /* U+003119: BOPOMOFO LETTER S*/
+                                           RTUNI_ALPHA, /* U+00311a: BOPOMOFO LETTER A*/
+                                           RTUNI_ALPHA, /* U+00311b: BOPOMOFO LETTER O*/
+                                           RTUNI_ALPHA, /* U+00311c: BOPOMOFO LETTER E*/
+                                           RTUNI_ALPHA, /* U+00311d: BOPOMOFO LETTER EH*/
+                                           RTUNI_ALPHA, /* U+00311e: BOPOMOFO LETTER AI*/
+                                           RTUNI_ALPHA, /* U+00311f: BOPOMOFO LETTER EI*/
+                                           RTUNI_ALPHA, /* U+003120: BOPOMOFO LETTER AU*/
+                                           RTUNI_ALPHA, /* U+003121: BOPOMOFO LETTER OU*/
+                                           RTUNI_ALPHA, /* U+003122: BOPOMOFO LETTER AN*/
+                                           RTUNI_ALPHA, /* U+003123: BOPOMOFO LETTER EN*/
+                                           RTUNI_ALPHA, /* U+003124: BOPOMOFO LETTER ANG*/
+                                           RTUNI_ALPHA, /* U+003125: BOPOMOFO LETTER ENG*/
+                                           RTUNI_ALPHA, /* U+003126: BOPOMOFO LETTER ER*/
+                                           RTUNI_ALPHA, /* U+003127: BOPOMOFO LETTER I*/
+                                           RTUNI_ALPHA, /* U+003128: BOPOMOFO LETTER U*/
+                                           RTUNI_ALPHA, /* U+003129: BOPOMOFO LETTER IU*/
+                                           RTUNI_ALPHA, /* U+00312a: BOPOMOFO LETTER V*/
+                                           RTUNI_ALPHA, /* U+00312b: BOPOMOFO LETTER NG*/
+                                           RTUNI_ALPHA, /* U+00312c: BOPOMOFO LETTER GN*/
+                                           RTUNI_ALPHA, /* U+00312d: BOPOMOFO LETTER IH*/
+                                                     0, /* U+00312e: */
+                                                     0, /* U+00312f: */
+                                                     0, /* U+003130: */
+                                           RTUNI_ALPHA, /* U+003131: HANGUL LETTER KIYEOK*/
+                                           RTUNI_ALPHA, /* U+003132: HANGUL LETTER SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+003133: HANGUL LETTER KIYEOK-SIOS*/
+                                           RTUNI_ALPHA, /* U+003134: HANGUL LETTER NIEUN*/
+                                           RTUNI_ALPHA, /* U+003135: HANGUL LETTER NIEUN-CIEUC*/
+                                           RTUNI_ALPHA, /* U+003136: HANGUL LETTER NIEUN-HIEUH*/
+                                           RTUNI_ALPHA, /* U+003137: HANGUL LETTER TIKEUT*/
+                                           RTUNI_ALPHA, /* U+003138: HANGUL LETTER SSANGTIKEUT*/
+                                           RTUNI_ALPHA, /* U+003139: HANGUL LETTER RIEUL*/
+                                           RTUNI_ALPHA, /* U+00313a: HANGUL LETTER RIEUL-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00313b: HANGUL LETTER RIEUL-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00313c: HANGUL LETTER RIEUL-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00313d: HANGUL LETTER RIEUL-SIOS*/
+                                           RTUNI_ALPHA, /* U+00313e: HANGUL LETTER RIEUL-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00313f: HANGUL LETTER RIEUL-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+003140: HANGUL LETTER RIEUL-HIEUH*/
+                                           RTUNI_ALPHA, /* U+003141: HANGUL LETTER MIEUM*/
+                                           RTUNI_ALPHA, /* U+003142: HANGUL LETTER PIEUP*/
+                                           RTUNI_ALPHA, /* U+003143: HANGUL LETTER SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+003144: HANGUL LETTER PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+003145: HANGUL LETTER SIOS*/
+                                           RTUNI_ALPHA, /* U+003146: HANGUL LETTER SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+003147: HANGUL LETTER IEUNG*/
+                                           RTUNI_ALPHA, /* U+003148: HANGUL LETTER CIEUC*/
+                                           RTUNI_ALPHA, /* U+003149: HANGUL LETTER SSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+00314a: HANGUL LETTER CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00314b: HANGUL LETTER KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+00314c: HANGUL LETTER THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00314d: HANGUL LETTER PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00314e: HANGUL LETTER HIEUH*/
+                                           RTUNI_ALPHA, /* U+00314f: HANGUL LETTER A*/
+                                           RTUNI_ALPHA, /* U+003150: HANGUL LETTER AE*/
+                                           RTUNI_ALPHA, /* U+003151: HANGUL LETTER YA*/
+                                           RTUNI_ALPHA, /* U+003152: HANGUL LETTER YAE*/
+                                           RTUNI_ALPHA, /* U+003153: HANGUL LETTER EO*/
+                                           RTUNI_ALPHA, /* U+003154: HANGUL LETTER E*/
+                                           RTUNI_ALPHA, /* U+003155: HANGUL LETTER YEO*/
+                                           RTUNI_ALPHA, /* U+003156: HANGUL LETTER YE*/
+                                           RTUNI_ALPHA, /* U+003157: HANGUL LETTER O*/
+                                           RTUNI_ALPHA, /* U+003158: HANGUL LETTER WA*/
+                                           RTUNI_ALPHA, /* U+003159: HANGUL LETTER WAE*/
+                                           RTUNI_ALPHA, /* U+00315a: HANGUL LETTER OE*/
+                                           RTUNI_ALPHA, /* U+00315b: HANGUL LETTER YO*/
+                                           RTUNI_ALPHA, /* U+00315c: HANGUL LETTER U*/
+                                           RTUNI_ALPHA, /* U+00315d: HANGUL LETTER WEO*/
+                                           RTUNI_ALPHA, /* U+00315e: HANGUL LETTER WE*/
+                                           RTUNI_ALPHA, /* U+00315f: HANGUL LETTER WI*/
+                                           RTUNI_ALPHA, /* U+003160: HANGUL LETTER YU*/
+                                           RTUNI_ALPHA, /* U+003161: HANGUL LETTER EU*/
+                                           RTUNI_ALPHA, /* U+003162: HANGUL LETTER YI*/
+                                           RTUNI_ALPHA, /* U+003163: HANGUL LETTER I*/
+                                           RTUNI_ALPHA, /* U+003164: HANGUL FILLER*/
+                                           RTUNI_ALPHA, /* U+003165: HANGUL LETTER SSANGNIEUN*/
+                                           RTUNI_ALPHA, /* U+003166: HANGUL LETTER NIEUN-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+003167: HANGUL LETTER NIEUN-SIOS*/
+                                           RTUNI_ALPHA, /* U+003168: HANGUL LETTER NIEUN-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+003169: HANGUL LETTER RIEUL-KIYEOK-SIOS*/
+                                           RTUNI_ALPHA, /* U+00316a: HANGUL LETTER RIEUL-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00316b: HANGUL LETTER RIEUL-PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+00316c: HANGUL LETTER RIEUL-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+00316d: HANGUL LETTER RIEUL-YEORINHIEUH*/
+                                           RTUNI_ALPHA, /* U+00316e: HANGUL LETTER MIEUM-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00316f: HANGUL LETTER MIEUM-SIOS*/
+                                           RTUNI_ALPHA, /* U+003170: HANGUL LETTER MIEUM-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+003171: HANGUL LETTER KAPYEOUNMIEUM*/
+                                           RTUNI_ALPHA, /* U+003172: HANGUL LETTER PIEUP-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+003173: HANGUL LETTER PIEUP-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+003174: HANGUL LETTER PIEUP-SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+003175: HANGUL LETTER PIEUP-SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+003176: HANGUL LETTER PIEUP-CIEUC*/
+                                           RTUNI_ALPHA, /* U+003177: HANGUL LETTER PIEUP-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+003178: HANGUL LETTER KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+003179: HANGUL LETTER KAPYEOUNSSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00317a: HANGUL LETTER SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00317b: HANGUL LETTER SIOS-NIEUN*/
+                                           RTUNI_ALPHA, /* U+00317c: HANGUL LETTER SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00317d: HANGUL LETTER SIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00317e: HANGUL LETTER SIOS-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00317f: HANGUL LETTER PANSIOS*/
+                                           RTUNI_ALPHA, /* U+003180: HANGUL LETTER SSANGIEUNG*/
+                                           RTUNI_ALPHA, /* U+003181: HANGUL LETTER YESIEUNG*/
+                                           RTUNI_ALPHA, /* U+003182: HANGUL LETTER YESIEUNG-SIOS*/
+                                           RTUNI_ALPHA, /* U+003183: HANGUL LETTER YESIEUNG-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+003184: HANGUL LETTER KAPYEOUNPHIEUPH*/
+                                           RTUNI_ALPHA, /* U+003185: HANGUL LETTER SSANGHIEUH*/
+                                           RTUNI_ALPHA, /* U+003186: HANGUL LETTER YEORINHIEUH*/
+                                           RTUNI_ALPHA, /* U+003187: HANGUL LETTER YO-YA*/
+                                           RTUNI_ALPHA, /* U+003188: HANGUL LETTER YO-YAE*/
+                                           RTUNI_ALPHA, /* U+003189: HANGUL LETTER YO-I*/
+                                           RTUNI_ALPHA, /* U+00318a: HANGUL LETTER YU-YEO*/
+                                           RTUNI_ALPHA, /* U+00318b: HANGUL LETTER YU-YE*/
+                                           RTUNI_ALPHA, /* U+00318c: HANGUL LETTER YU-I*/
+                                           RTUNI_ALPHA, /* U+00318d: HANGUL LETTER ARAEA*/
+                                           RTUNI_ALPHA, /* U+00318e: HANGUL LETTER ARAEAE*/
+                                                     0, /* U+00318f: */
+                                                     0, /* U+003190: IDEOGRAPHIC ANNOTATION LINKING MARK*/
+                                                     0, /* U+003191: IDEOGRAPHIC ANNOTATION REVERSE MARK*/
+                                                     0, /* U+003192: IDEOGRAPHIC ANNOTATION ONE MARK*/
+                                                     0, /* U+003193: IDEOGRAPHIC ANNOTATION TWO MARK*/
+                                                     0, /* U+003194: IDEOGRAPHIC ANNOTATION THREE MARK*/
+                                                     0, /* U+003195: IDEOGRAPHIC ANNOTATION FOUR MARK*/
+                                                     0, /* U+003196: IDEOGRAPHIC ANNOTATION TOP MARK*/
+                                                     0, /* U+003197: IDEOGRAPHIC ANNOTATION MIDDLE MARK*/
+                                                     0, /* U+003198: IDEOGRAPHIC ANNOTATION BOTTOM MARK*/
+                                                     0, /* U+003199: IDEOGRAPHIC ANNOTATION FIRST MARK*/
+                                                     0, /* U+00319a: IDEOGRAPHIC ANNOTATION SECOND MARK*/
+                                                     0, /* U+00319b: IDEOGRAPHIC ANNOTATION THIRD MARK*/
+                                                     0, /* U+00319c: IDEOGRAPHIC ANNOTATION FOURTH MARK*/
+                                                     0, /* U+00319d: IDEOGRAPHIC ANNOTATION HEAVEN MARK*/
+                                                     0, /* U+00319e: IDEOGRAPHIC ANNOTATION EARTH MARK*/
+                                                     0, /* U+00319f: IDEOGRAPHIC ANNOTATION MAN MARK*/
+                                           RTUNI_ALPHA, /* U+0031a0: BOPOMOFO LETTER BU*/
+                                           RTUNI_ALPHA, /* U+0031a1: BOPOMOFO LETTER ZI*/
+                                           RTUNI_ALPHA, /* U+0031a2: BOPOMOFO LETTER JI*/
+                                           RTUNI_ALPHA, /* U+0031a3: BOPOMOFO LETTER GU*/
+                                           RTUNI_ALPHA, /* U+0031a4: BOPOMOFO LETTER EE*/
+                                           RTUNI_ALPHA, /* U+0031a5: BOPOMOFO LETTER ENN*/
+                                           RTUNI_ALPHA, /* U+0031a6: BOPOMOFO LETTER OO*/
+                                           RTUNI_ALPHA, /* U+0031a7: BOPOMOFO LETTER ONN*/
+                                           RTUNI_ALPHA, /* U+0031a8: BOPOMOFO LETTER IR*/
+                                           RTUNI_ALPHA, /* U+0031a9: BOPOMOFO LETTER ANN*/
+                                           RTUNI_ALPHA, /* U+0031aa: BOPOMOFO LETTER INN*/
+                                           RTUNI_ALPHA, /* U+0031ab: BOPOMOFO LETTER UNN*/
+                                           RTUNI_ALPHA, /* U+0031ac: BOPOMOFO LETTER IM*/
+                                           RTUNI_ALPHA, /* U+0031ad: BOPOMOFO LETTER NGG*/
+                                           RTUNI_ALPHA, /* U+0031ae: BOPOMOFO LETTER AINN*/
+                                           RTUNI_ALPHA, /* U+0031af: BOPOMOFO LETTER AUNN*/
+                                           RTUNI_ALPHA, /* U+0031b0: BOPOMOFO LETTER AM*/
+                                           RTUNI_ALPHA, /* U+0031b1: BOPOMOFO LETTER OM*/
+                                           RTUNI_ALPHA, /* U+0031b2: BOPOMOFO LETTER ONG*/
+                                           RTUNI_ALPHA, /* U+0031b3: BOPOMOFO LETTER INNN*/
+                                           RTUNI_ALPHA, /* U+0031b4: BOPOMOFO FINAL LETTER P*/
+                                           RTUNI_ALPHA, /* U+0031b5: BOPOMOFO FINAL LETTER T*/
+                                           RTUNI_ALPHA, /* U+0031b6: BOPOMOFO FINAL LETTER K*/
+                                           RTUNI_ALPHA, /* U+0031b7: BOPOMOFO FINAL LETTER H*/
+                                           RTUNI_ALPHA, /* U+0031b8: BOPOMOFO LETTER GH*/
+                                           RTUNI_ALPHA, /* U+0031b9: BOPOMOFO LETTER LH*/
+                                           RTUNI_ALPHA, /* U+0031ba: BOPOMOFO LETTER ZY*/
+                                                     0, /* U+0031bb: */
+                                                     0, /* U+0031bc: */
+                                                     0, /* U+0031bd: */
+                                                     0, /* U+0031be: */
+                                                     0, /* U+0031bf: */
+                                                     0, /* U+0031c0: CJK STROKE T*/
+                                                     0, /* U+0031c1: CJK STROKE WG*/
+                                                     0, /* U+0031c2: CJK STROKE XG*/
+                                                     0, /* U+0031c3: CJK STROKE BXG*/
+                                                     0, /* U+0031c4: CJK STROKE SW*/
+                                                     0, /* U+0031c5: CJK STROKE HZZ*/
+                                                     0, /* U+0031c6: CJK STROKE HZG*/
+                                                     0, /* U+0031c7: CJK STROKE HP*/
+                                                     0, /* U+0031c8: CJK STROKE HZWG*/
+                                                     0, /* U+0031c9: CJK STROKE SZWG*/
+                                                     0, /* U+0031ca: CJK STROKE HZT*/
+                                                     0, /* U+0031cb: CJK STROKE HZZP*/
+                                                     0, /* U+0031cc: CJK STROKE HPWG*/
+                                                     0, /* U+0031cd: CJK STROKE HZW*/
+                                                     0, /* U+0031ce: CJK STROKE HZZZ*/
+                                                     0, /* U+0031cf: CJK STROKE N*/
+                                                     0, /* U+0031d0: CJK STROKE H*/
+                                                     0, /* U+0031d1: CJK STROKE S*/
+                                                     0, /* U+0031d2: CJK STROKE P*/
+                                                     0, /* U+0031d3: CJK STROKE SP*/
+                                                     0, /* U+0031d4: CJK STROKE D*/
+                                                     0, /* U+0031d5: CJK STROKE HZ*/
+                                                     0, /* U+0031d6: CJK STROKE HG*/
+                                                     0, /* U+0031d7: CJK STROKE SZ*/
+                                                     0, /* U+0031d8: CJK STROKE SWZ*/
+                                                     0, /* U+0031d9: CJK STROKE ST*/
+                                                     0, /* U+0031da: CJK STROKE SG*/
+                                                     0, /* U+0031db: CJK STROKE PD*/
+                                                     0, /* U+0031dc: CJK STROKE PZ*/
+                                                     0, /* U+0031dd: CJK STROKE TN*/
+                                                     0, /* U+0031de: CJK STROKE SZZ*/
+                                                     0, /* U+0031df: CJK STROKE SWG*/
+                                                     0, /* U+0031e0: CJK STROKE HXWG*/
+                                                     0, /* U+0031e1: CJK STROKE HZZZG*/
+                                                     0, /* U+0031e2: CJK STROKE PG*/
+                                                     0, /* U+0031e3: CJK STROKE Q*/
+                                                     0, /* U+0031e4: */
+                                                     0, /* U+0031e5: */
+                                                     0, /* U+0031e6: */
+                                                     0, /* U+0031e7: */
+                                                     0, /* U+0031e8: */
+                                                     0, /* U+0031e9: */
+                                                     0, /* U+0031ea: */
+                                                     0, /* U+0031eb: */
+                                                     0, /* U+0031ec: */
+                                                     0, /* U+0031ed: */
+                                                     0, /* U+0031ee: */
+                                                     0, /* U+0031ef: */
+                                           RTUNI_ALPHA, /* U+0031f0: KATAKANA LETTER SMALL KU*/
+                                           RTUNI_ALPHA, /* U+0031f1: KATAKANA LETTER SMALL SI*/
+                                           RTUNI_ALPHA, /* U+0031f2: KATAKANA LETTER SMALL SU*/
+                                           RTUNI_ALPHA, /* U+0031f3: KATAKANA LETTER SMALL TO*/
+                                           RTUNI_ALPHA, /* U+0031f4: KATAKANA LETTER SMALL NU*/
+                                           RTUNI_ALPHA, /* U+0031f5: KATAKANA LETTER SMALL HA*/
+                                           RTUNI_ALPHA, /* U+0031f6: KATAKANA LETTER SMALL HI*/
+                                           RTUNI_ALPHA, /* U+0031f7: KATAKANA LETTER SMALL HU*/
+                                           RTUNI_ALPHA, /* U+0031f8: KATAKANA LETTER SMALL HE*/
+                                           RTUNI_ALPHA, /* U+0031f9: KATAKANA LETTER SMALL HO*/
+                                           RTUNI_ALPHA, /* U+0031fa: KATAKANA LETTER SMALL MU*/
+                                           RTUNI_ALPHA, /* U+0031fb: KATAKANA LETTER SMALL RA*/
+                                           RTUNI_ALPHA, /* U+0031fc: KATAKANA LETTER SMALL RI*/
+                                           RTUNI_ALPHA, /* U+0031fd: KATAKANA LETTER SMALL RU*/
+                                           RTUNI_ALPHA, /* U+0031fe: KATAKANA LETTER SMALL RE*/
+                                           RTUNI_ALPHA, /* U+0031ff: KATAKANA LETTER SMALL RO*/
+                                                     0, /* U+003200: PARENTHESIZED HANGUL KIYEOK*/
+                                                     0, /* U+003201: PARENTHESIZED HANGUL NIEUN*/
+                                                     0, /* U+003202: PARENTHESIZED HANGUL TIKEUT*/
+                                                     0, /* U+003203: PARENTHESIZED HANGUL RIEUL*/
+                                                     0, /* U+003204: PARENTHESIZED HANGUL MIEUM*/
+                                                     0, /* U+003205: PARENTHESIZED HANGUL PIEUP*/
+                                                     0, /* U+003206: PARENTHESIZED HANGUL SIOS*/
+                                                     0, /* U+003207: PARENTHESIZED HANGUL IEUNG*/
+                                                     0, /* U+003208: PARENTHESIZED HANGUL CIEUC*/
+                                                     0, /* U+003209: PARENTHESIZED HANGUL CHIEUCH*/
+                                                     0, /* U+00320a: PARENTHESIZED HANGUL KHIEUKH*/
+                                                     0, /* U+00320b: PARENTHESIZED HANGUL THIEUTH*/
+                                                     0, /* U+00320c: PARENTHESIZED HANGUL PHIEUPH*/
+                                                     0, /* U+00320d: PARENTHESIZED HANGUL HIEUH*/
+                                                     0, /* U+00320e: PARENTHESIZED HANGUL KIYEOK A*/
+                                                     0, /* U+00320f: PARENTHESIZED HANGUL NIEUN A*/
+                                                     0, /* U+003210: PARENTHESIZED HANGUL TIKEUT A*/
+                                                     0, /* U+003211: PARENTHESIZED HANGUL RIEUL A*/
+                                                     0, /* U+003212: PARENTHESIZED HANGUL MIEUM A*/
+                                                     0, /* U+003213: PARENTHESIZED HANGUL PIEUP A*/
+                                                     0, /* U+003214: PARENTHESIZED HANGUL SIOS A*/
+                                                     0, /* U+003215: PARENTHESIZED HANGUL IEUNG A*/
+                                                     0, /* U+003216: PARENTHESIZED HANGUL CIEUC A*/
+                                                     0, /* U+003217: PARENTHESIZED HANGUL CHIEUCH A*/
+                                                     0, /* U+003218: PARENTHESIZED HANGUL KHIEUKH A*/
+                                                     0, /* U+003219: PARENTHESIZED HANGUL THIEUTH A*/
+                                                     0, /* U+00321a: PARENTHESIZED HANGUL PHIEUPH A*/
+                                                     0, /* U+00321b: PARENTHESIZED HANGUL HIEUH A*/
+                                                     0, /* U+00321c: PARENTHESIZED HANGUL CIEUC U*/
+                                                     0, /* U+00321d: PARENTHESIZED KOREAN CHARACTER OJEON*/
+                                                     0, /* U+00321e: PARENTHESIZED KOREAN CHARACTER O HU*/
+                                                     0, /* U+00321f: */
+                                                     0, /* U+003220: PARENTHESIZED IDEOGRAPH ONE*/
+                                                     0, /* U+003221: PARENTHESIZED IDEOGRAPH TWO*/
+                                                     0, /* U+003222: PARENTHESIZED IDEOGRAPH THREE*/
+                                                     0, /* U+003223: PARENTHESIZED IDEOGRAPH FOUR*/
+                                                     0, /* U+003224: PARENTHESIZED IDEOGRAPH FIVE*/
+                                                     0, /* U+003225: PARENTHESIZED IDEOGRAPH SIX*/
+                                                     0, /* U+003226: PARENTHESIZED IDEOGRAPH SEVEN*/
+                                                     0, /* U+003227: PARENTHESIZED IDEOGRAPH EIGHT*/
+                                                     0, /* U+003228: PARENTHESIZED IDEOGRAPH NINE*/
+                                                     0, /* U+003229: PARENTHESIZED IDEOGRAPH TEN*/
+                                                     0, /* U+00322a: PARENTHESIZED IDEOGRAPH MOON*/
+                                                     0, /* U+00322b: PARENTHESIZED IDEOGRAPH FIRE*/
+                                                     0, /* U+00322c: PARENTHESIZED IDEOGRAPH WATER*/
+                                                     0, /* U+00322d: PARENTHESIZED IDEOGRAPH WOOD*/
+                                                     0, /* U+00322e: PARENTHESIZED IDEOGRAPH METAL*/
+                                                     0, /* U+00322f: PARENTHESIZED IDEOGRAPH EARTH*/
+                                                     0, /* U+003230: PARENTHESIZED IDEOGRAPH SUN*/
+                                                     0, /* U+003231: PARENTHESIZED IDEOGRAPH STOCK*/
+                                                     0, /* U+003232: PARENTHESIZED IDEOGRAPH HAVE*/
+                                                     0, /* U+003233: PARENTHESIZED IDEOGRAPH SOCIETY*/
+                                                     0, /* U+003234: PARENTHESIZED IDEOGRAPH NAME*/
+                                                     0, /* U+003235: PARENTHESIZED IDEOGRAPH SPECIAL*/
+                                                     0, /* U+003236: PARENTHESIZED IDEOGRAPH FINANCIAL*/
+                                                     0, /* U+003237: PARENTHESIZED IDEOGRAPH CONGRATULATION*/
+                                                     0, /* U+003238: PARENTHESIZED IDEOGRAPH LABOR*/
+                                                     0, /* U+003239: PARENTHESIZED IDEOGRAPH REPRESENT*/
+                                                     0, /* U+00323a: PARENTHESIZED IDEOGRAPH CALL*/
+                                                     0, /* U+00323b: PARENTHESIZED IDEOGRAPH STUDY*/
+                                                     0, /* U+00323c: PARENTHESIZED IDEOGRAPH SUPERVISE*/
+                                                     0, /* U+00323d: PARENTHESIZED IDEOGRAPH ENTERPRISE*/
+                                                     0, /* U+00323e: PARENTHESIZED IDEOGRAPH RESOURCE*/
+                                                     0, /* U+00323f: PARENTHESIZED IDEOGRAPH ALLIANCE*/
+                                                     0, /* U+003240: PARENTHESIZED IDEOGRAPH FESTIVAL*/
+                                                     0, /* U+003241: PARENTHESIZED IDEOGRAPH REST*/
+                                                     0, /* U+003242: PARENTHESIZED IDEOGRAPH SELF*/
+                                                     0, /* U+003243: PARENTHESIZED IDEOGRAPH REACH*/
+                                                     0, /* U+003244: CIRCLED IDEOGRAPH QUESTION*/
+                                                     0, /* U+003245: CIRCLED IDEOGRAPH KINDERGARTEN*/
+                                                     0, /* U+003246: CIRCLED IDEOGRAPH SCHOOL*/
+                                                     0, /* U+003247: CIRCLED IDEOGRAPH KOTO*/
+                                                     0, /* U+003248: CIRCLED NUMBER TEN ON BLACK SQUARE*/
+                                                     0, /* U+003249: CIRCLED NUMBER TWENTY ON BLACK SQUARE*/
+                                                     0, /* U+00324a: CIRCLED NUMBER THIRTY ON BLACK SQUARE*/
+                                                     0, /* U+00324b: CIRCLED NUMBER FORTY ON BLACK SQUARE*/
+                                                     0, /* U+00324c: CIRCLED NUMBER FIFTY ON BLACK SQUARE*/
+                                                     0, /* U+00324d: CIRCLED NUMBER SIXTY ON BLACK SQUARE*/
+                                                     0, /* U+00324e: CIRCLED NUMBER SEVENTY ON BLACK SQUARE*/
+                                                     0, /* U+00324f: CIRCLED NUMBER EIGHTY ON BLACK SQUARE*/
+                                                     0, /* U+003250: PARTNERSHIP SIGN*/
+                                                     0, /* U+003251: CIRCLED NUMBER TWENTY ONE*/
+                                                     0, /* U+003252: CIRCLED NUMBER TWENTY TWO*/
+                                                     0, /* U+003253: CIRCLED NUMBER TWENTY THREE*/
+                                                     0, /* U+003254: CIRCLED NUMBER TWENTY FOUR*/
+                                                     0, /* U+003255: CIRCLED NUMBER TWENTY FIVE*/
+                                                     0, /* U+003256: CIRCLED NUMBER TWENTY SIX*/
+                                                     0, /* U+003257: CIRCLED NUMBER TWENTY SEVEN*/
+                                                     0, /* U+003258: CIRCLED NUMBER TWENTY EIGHT*/
+                                                     0, /* U+003259: CIRCLED NUMBER TWENTY NINE*/
+                                                     0, /* U+00325a: CIRCLED NUMBER THIRTY*/
+                                                     0, /* U+00325b: CIRCLED NUMBER THIRTY ONE*/
+                                                     0, /* U+00325c: CIRCLED NUMBER THIRTY TWO*/
+                                                     0, /* U+00325d: CIRCLED NUMBER THIRTY THREE*/
+                                                     0, /* U+00325e: CIRCLED NUMBER THIRTY FOUR*/
+                                                     0, /* U+00325f: CIRCLED NUMBER THIRTY FIVE*/
+                                                     0, /* U+003260: CIRCLED HANGUL KIYEOK*/
+                                                     0, /* U+003261: CIRCLED HANGUL NIEUN*/
+                                                     0, /* U+003262: CIRCLED HANGUL TIKEUT*/
+                                                     0, /* U+003263: CIRCLED HANGUL RIEUL*/
+                                                     0, /* U+003264: CIRCLED HANGUL MIEUM*/
+                                                     0, /* U+003265: CIRCLED HANGUL PIEUP*/
+                                                     0, /* U+003266: CIRCLED HANGUL SIOS*/
+                                                     0, /* U+003267: CIRCLED HANGUL IEUNG*/
+                                                     0, /* U+003268: CIRCLED HANGUL CIEUC*/
+                                                     0, /* U+003269: CIRCLED HANGUL CHIEUCH*/
+                                                     0, /* U+00326a: CIRCLED HANGUL KHIEUKH*/
+                                                     0, /* U+00326b: CIRCLED HANGUL THIEUTH*/
+                                                     0, /* U+00326c: CIRCLED HANGUL PHIEUPH*/
+                                                     0, /* U+00326d: CIRCLED HANGUL HIEUH*/
+                                                     0, /* U+00326e: CIRCLED HANGUL KIYEOK A*/
+                                                     0, /* U+00326f: CIRCLED HANGUL NIEUN A*/
+                                                     0, /* U+003270: CIRCLED HANGUL TIKEUT A*/
+                                                     0, /* U+003271: CIRCLED HANGUL RIEUL A*/
+                                                     0, /* U+003272: CIRCLED HANGUL MIEUM A*/
+                                                     0, /* U+003273: CIRCLED HANGUL PIEUP A*/
+                                                     0, /* U+003274: CIRCLED HANGUL SIOS A*/
+                                                     0, /* U+003275: CIRCLED HANGUL IEUNG A*/
+                                                     0, /* U+003276: CIRCLED HANGUL CIEUC A*/
+                                                     0, /* U+003277: CIRCLED HANGUL CHIEUCH A*/
+                                                     0, /* U+003278: CIRCLED HANGUL KHIEUKH A*/
+                                                     0, /* U+003279: CIRCLED HANGUL THIEUTH A*/
+                                                     0, /* U+00327a: CIRCLED HANGUL PHIEUPH A*/
+                                                     0, /* U+00327b: CIRCLED HANGUL HIEUH A*/
+                                                     0, /* U+00327c: CIRCLED KOREAN CHARACTER CHAMKO*/
+                                                     0, /* U+00327d: CIRCLED KOREAN CHARACTER JUEUI*/
+                                                     0, /* U+00327e: CIRCLED HANGUL IEUNG U*/
+                                                     0, /* U+00327f: KOREAN STANDARD SYMBOL*/
+                                                     0, /* U+003280: CIRCLED IDEOGRAPH ONE*/
+                                                     0, /* U+003281: CIRCLED IDEOGRAPH TWO*/
+                                                     0, /* U+003282: CIRCLED IDEOGRAPH THREE*/
+                                                     0, /* U+003283: CIRCLED IDEOGRAPH FOUR*/
+                                                     0, /* U+003284: CIRCLED IDEOGRAPH FIVE*/
+                                                     0, /* U+003285: CIRCLED IDEOGRAPH SIX*/
+                                                     0, /* U+003286: CIRCLED IDEOGRAPH SEVEN*/
+                                                     0, /* U+003287: CIRCLED IDEOGRAPH EIGHT*/
+                                                     0, /* U+003288: CIRCLED IDEOGRAPH NINE*/
+                                                     0, /* U+003289: CIRCLED IDEOGRAPH TEN*/
+                                                     0, /* U+00328a: CIRCLED IDEOGRAPH MOON*/
+                                                     0, /* U+00328b: CIRCLED IDEOGRAPH FIRE*/
+                                                     0, /* U+00328c: CIRCLED IDEOGRAPH WATER*/
+                                                     0, /* U+00328d: CIRCLED IDEOGRAPH WOOD*/
+                                                     0, /* U+00328e: CIRCLED IDEOGRAPH METAL*/
+                                                     0, /* U+00328f: CIRCLED IDEOGRAPH EARTH*/
+                                                     0, /* U+003290: CIRCLED IDEOGRAPH SUN*/
+                                                     0, /* U+003291: CIRCLED IDEOGRAPH STOCK*/
+                                                     0, /* U+003292: CIRCLED IDEOGRAPH HAVE*/
+                                                     0, /* U+003293: CIRCLED IDEOGRAPH SOCIETY*/
+                                                     0, /* U+003294: CIRCLED IDEOGRAPH NAME*/
+                                                     0, /* U+003295: CIRCLED IDEOGRAPH SPECIAL*/
+                                                     0, /* U+003296: CIRCLED IDEOGRAPH FINANCIAL*/
+                                                     0, /* U+003297: CIRCLED IDEOGRAPH CONGRATULATION*/
+                                                     0, /* U+003298: CIRCLED IDEOGRAPH LABOR*/
+                                                     0, /* U+003299: CIRCLED IDEOGRAPH SECRET*/
+                                                     0, /* U+00329a: CIRCLED IDEOGRAPH MALE*/
+                                                     0, /* U+00329b: CIRCLED IDEOGRAPH FEMALE*/
+                                                     0, /* U+00329c: CIRCLED IDEOGRAPH SUITABLE*/
+                                                     0, /* U+00329d: CIRCLED IDEOGRAPH EXCELLENT*/
+                                                     0, /* U+00329e: CIRCLED IDEOGRAPH PRINT*/
+                                                     0, /* U+00329f: CIRCLED IDEOGRAPH ATTENTION*/
+                                                     0, /* U+0032a0: CIRCLED IDEOGRAPH ITEM*/
+                                                     0, /* U+0032a1: CIRCLED IDEOGRAPH REST*/
+                                                     0, /* U+0032a2: CIRCLED IDEOGRAPH COPY*/
+                                                     0, /* U+0032a3: CIRCLED IDEOGRAPH CORRECT*/
+                                                     0, /* U+0032a4: CIRCLED IDEOGRAPH HIGH*/
+                                                     0, /* U+0032a5: CIRCLED IDEOGRAPH CENTRE*/
+                                                     0, /* U+0032a6: CIRCLED IDEOGRAPH LOW*/
+                                                     0, /* U+0032a7: CIRCLED IDEOGRAPH LEFT*/
+                                                     0, /* U+0032a8: CIRCLED IDEOGRAPH RIGHT*/
+                                                     0, /* U+0032a9: CIRCLED IDEOGRAPH MEDICINE*/
+                                                     0, /* U+0032aa: CIRCLED IDEOGRAPH RELIGION*/
+                                                     0, /* U+0032ab: CIRCLED IDEOGRAPH STUDY*/
+                                                     0, /* U+0032ac: CIRCLED IDEOGRAPH SUPERVISE*/
+                                                     0, /* U+0032ad: CIRCLED IDEOGRAPH ENTERPRISE*/
+                                                     0, /* U+0032ae: CIRCLED IDEOGRAPH RESOURCE*/
+                                                     0, /* U+0032af: CIRCLED IDEOGRAPH ALLIANCE*/
+                                                     0, /* U+0032b0: CIRCLED IDEOGRAPH NIGHT*/
+                                                     0, /* U+0032b1: CIRCLED NUMBER THIRTY SIX*/
+                                                     0, /* U+0032b2: CIRCLED NUMBER THIRTY SEVEN*/
+                                                     0, /* U+0032b3: CIRCLED NUMBER THIRTY EIGHT*/
+                                                     0, /* U+0032b4: CIRCLED NUMBER THIRTY NINE*/
+                                                     0, /* U+0032b5: CIRCLED NUMBER FORTY*/
+                                                     0, /* U+0032b6: CIRCLED NUMBER FORTY ONE*/
+                                                     0, /* U+0032b7: CIRCLED NUMBER FORTY TWO*/
+                                                     0, /* U+0032b8: CIRCLED NUMBER FORTY THREE*/
+                                                     0, /* U+0032b9: CIRCLED NUMBER FORTY FOUR*/
+                                                     0, /* U+0032ba: CIRCLED NUMBER FORTY FIVE*/
+                                                     0, /* U+0032bb: CIRCLED NUMBER FORTY SIX*/
+                                                     0, /* U+0032bc: CIRCLED NUMBER FORTY SEVEN*/
+                                                     0, /* U+0032bd: CIRCLED NUMBER FORTY EIGHT*/
+                                                     0, /* U+0032be: CIRCLED NUMBER FORTY NINE*/
+                                                     0, /* U+0032bf: CIRCLED NUMBER FIFTY*/
+                                                     0, /* U+0032c0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY*/
+                                                     0, /* U+0032c1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY*/
+                                                     0, /* U+0032c2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH*/
+                                                     0, /* U+0032c3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL*/
+                                                     0, /* U+0032c4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY*/
+                                                     0, /* U+0032c5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE*/
+                                                     0, /* U+0032c6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY*/
+                                                     0, /* U+0032c7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST*/
+                                                     0, /* U+0032c8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER*/
+                                                     0, /* U+0032c9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER*/
+                                                     0, /* U+0032ca: IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER*/
+                                                     0, /* U+0032cb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER*/
+                                                     0, /* U+0032cc: SQUARE HG*/
+                                                     0, /* U+0032cd: SQUARE ERG*/
+                                                     0, /* U+0032ce: SQUARE EV*/
+                                                     0, /* U+0032cf: LIMITED LIABILITY SIGN*/
+                                                     0, /* U+0032d0: CIRCLED KATAKANA A*/
+                                                     0, /* U+0032d1: CIRCLED KATAKANA I*/
+                                                     0, /* U+0032d2: CIRCLED KATAKANA U*/
+                                                     0, /* U+0032d3: CIRCLED KATAKANA E*/
+                                                     0, /* U+0032d4: CIRCLED KATAKANA O*/
+                                                     0, /* U+0032d5: CIRCLED KATAKANA KA*/
+                                                     0, /* U+0032d6: CIRCLED KATAKANA KI*/
+                                                     0, /* U+0032d7: CIRCLED KATAKANA KU*/
+                                                     0, /* U+0032d8: CIRCLED KATAKANA KE*/
+                                                     0, /* U+0032d9: CIRCLED KATAKANA KO*/
+                                                     0, /* U+0032da: CIRCLED KATAKANA SA*/
+                                                     0, /* U+0032db: CIRCLED KATAKANA SI*/
+                                                     0, /* U+0032dc: CIRCLED KATAKANA SU*/
+                                                     0, /* U+0032dd: CIRCLED KATAKANA SE*/
+                                                     0, /* U+0032de: CIRCLED KATAKANA SO*/
+                                                     0, /* U+0032df: CIRCLED KATAKANA TA*/
+                                                     0, /* U+0032e0: CIRCLED KATAKANA TI*/
+                                                     0, /* U+0032e1: CIRCLED KATAKANA TU*/
+                                                     0, /* U+0032e2: CIRCLED KATAKANA TE*/
+                                                     0, /* U+0032e3: CIRCLED KATAKANA TO*/
+                                                     0, /* U+0032e4: CIRCLED KATAKANA NA*/
+                                                     0, /* U+0032e5: CIRCLED KATAKANA NI*/
+                                                     0, /* U+0032e6: CIRCLED KATAKANA NU*/
+                                                     0, /* U+0032e7: CIRCLED KATAKANA NE*/
+                                                     0, /* U+0032e8: CIRCLED KATAKANA NO*/
+                                                     0, /* U+0032e9: CIRCLED KATAKANA HA*/
+                                                     0, /* U+0032ea: CIRCLED KATAKANA HI*/
+                                                     0, /* U+0032eb: CIRCLED KATAKANA HU*/
+                                                     0, /* U+0032ec: CIRCLED KATAKANA HE*/
+                                                     0, /* U+0032ed: CIRCLED KATAKANA HO*/
+                                                     0, /* U+0032ee: CIRCLED KATAKANA MA*/
+                                                     0, /* U+0032ef: CIRCLED KATAKANA MI*/
+                                                     0, /* U+0032f0: CIRCLED KATAKANA MU*/
+                                                     0, /* U+0032f1: CIRCLED KATAKANA ME*/
+                                                     0, /* U+0032f2: CIRCLED KATAKANA MO*/
+                                                     0, /* U+0032f3: CIRCLED KATAKANA YA*/
+                                                     0, /* U+0032f4: CIRCLED KATAKANA YU*/
+                                                     0, /* U+0032f5: CIRCLED KATAKANA YO*/
+                                                     0, /* U+0032f6: CIRCLED KATAKANA RA*/
+                                                     0, /* U+0032f7: CIRCLED KATAKANA RI*/
+                                                     0, /* U+0032f8: CIRCLED KATAKANA RU*/
+                                                     0, /* U+0032f9: CIRCLED KATAKANA RE*/
+                                                     0, /* U+0032fa: CIRCLED KATAKANA RO*/
+                                                     0, /* U+0032fb: CIRCLED KATAKANA WA*/
+                                                     0, /* U+0032fc: CIRCLED KATAKANA WI*/
+                                                     0, /* U+0032fd: CIRCLED KATAKANA WE*/
+                                                     0, /* U+0032fe: CIRCLED KATAKANA WO*/
+                                                     0, /* U+0032ff: */
+                                                     0, /* U+003300: SQUARE APAATO*/
+                                                     0, /* U+003301: SQUARE ARUHUA*/
+                                                     0, /* U+003302: SQUARE ANPEA*/
+                                                     0, /* U+003303: SQUARE AARU*/
+                                                     0, /* U+003304: SQUARE ININGU*/
+                                                     0, /* U+003305: SQUARE INTI*/
+                                                     0, /* U+003306: SQUARE UON*/
+                                                     0, /* U+003307: SQUARE ESUKUUDO*/
+                                                     0, /* U+003308: SQUARE EEKAA*/
+                                                     0, /* U+003309: SQUARE ONSU*/
+                                                     0, /* U+00330a: SQUARE OOMU*/
+                                                     0, /* U+00330b: SQUARE KAIRI*/
+                                                     0, /* U+00330c: SQUARE KARATTO*/
+                                                     0, /* U+00330d: SQUARE KARORII*/
+                                                     0, /* U+00330e: SQUARE GARON*/
+                                                     0, /* U+00330f: SQUARE GANMA*/
+                                                     0, /* U+003310: SQUARE GIGA*/
+                                                     0, /* U+003311: SQUARE GINII*/
+                                                     0, /* U+003312: SQUARE KYURII*/
+                                                     0, /* U+003313: SQUARE GIRUDAA*/
+                                                     0, /* U+003314: SQUARE KIRO*/
+                                                     0, /* U+003315: SQUARE KIROGURAMU*/
+                                                     0, /* U+003316: SQUARE KIROMEETORU*/
+                                                     0, /* U+003317: SQUARE KIROWATTO*/
+                                                     0, /* U+003318: SQUARE GURAMU*/
+                                                     0, /* U+003319: SQUARE GURAMUTON*/
+                                                     0, /* U+00331a: SQUARE KURUZEIRO*/
+                                                     0, /* U+00331b: SQUARE KUROONE*/
+                                                     0, /* U+00331c: SQUARE KEESU*/
+                                                     0, /* U+00331d: SQUARE KORUNA*/
+                                                     0, /* U+00331e: SQUARE KOOPO*/
+                                                     0, /* U+00331f: SQUARE SAIKURU*/
+                                                     0, /* U+003320: SQUARE SANTIIMU*/
+                                                     0, /* U+003321: SQUARE SIRINGU*/
+                                                     0, /* U+003322: SQUARE SENTI*/
+                                                     0, /* U+003323: SQUARE SENTO*/
+                                                     0, /* U+003324: SQUARE DAASU*/
+                                                     0, /* U+003325: SQUARE DESI*/
+                                                     0, /* U+003326: SQUARE DORU*/
+                                                     0, /* U+003327: SQUARE TON*/
+                                                     0, /* U+003328: SQUARE NANO*/
+                                                     0, /* U+003329: SQUARE NOTTO*/
+                                                     0, /* U+00332a: SQUARE HAITU*/
+                                                     0, /* U+00332b: SQUARE PAASENTO*/
+                                                     0, /* U+00332c: SQUARE PAATU*/
+                                                     0, /* U+00332d: SQUARE BAARERU*/
+                                                     0, /* U+00332e: SQUARE PIASUTORU*/
+                                                     0, /* U+00332f: SQUARE PIKURU*/
+                                                     0, /* U+003330: SQUARE PIKO*/
+                                                     0, /* U+003331: SQUARE BIRU*/
+                                                     0, /* U+003332: SQUARE HUARADDO*/
+                                                     0, /* U+003333: SQUARE HUIITO*/
+                                                     0, /* U+003334: SQUARE BUSSYERU*/
+                                                     0, /* U+003335: SQUARE HURAN*/
+                                                     0, /* U+003336: SQUARE HEKUTAARU*/
+                                                     0, /* U+003337: SQUARE PESO*/
+                                                     0, /* U+003338: SQUARE PENIHI*/
+                                                     0, /* U+003339: SQUARE HERUTU*/
+                                                     0, /* U+00333a: SQUARE PENSU*/
+                                                     0, /* U+00333b: SQUARE PEEZI*/
+                                                     0, /* U+00333c: SQUARE BEETA*/
+                                                     0, /* U+00333d: SQUARE POINTO*/
+                                                     0, /* U+00333e: SQUARE BORUTO*/
+                                                     0, /* U+00333f: SQUARE HON*/
+                                                     0, /* U+003340: SQUARE PONDO*/
+                                                     0, /* U+003341: SQUARE HOORU*/
+                                                     0, /* U+003342: SQUARE HOON*/
+                                                     0, /* U+003343: SQUARE MAIKURO*/
+                                                     0, /* U+003344: SQUARE MAIRU*/
+                                                     0, /* U+003345: SQUARE MAHHA*/
+                                                     0, /* U+003346: SQUARE MARUKU*/
+                                                     0, /* U+003347: SQUARE MANSYON*/
+                                                     0, /* U+003348: SQUARE MIKURON*/
+                                                     0, /* U+003349: SQUARE MIRI*/
+                                                     0, /* U+00334a: SQUARE MIRIBAARU*/
+                                                     0, /* U+00334b: SQUARE MEGA*/
+                                                     0, /* U+00334c: SQUARE MEGATON*/
+                                                     0, /* U+00334d: SQUARE MEETORU*/
+                                                     0, /* U+00334e: SQUARE YAADO*/
+                                                     0, /* U+00334f: SQUARE YAARU*/
+                                                     0, /* U+003350: SQUARE YUAN*/
+                                                     0, /* U+003351: SQUARE RITTORU*/
+                                                     0, /* U+003352: SQUARE RIRA*/
+                                                     0, /* U+003353: SQUARE RUPII*/
+                                                     0, /* U+003354: SQUARE RUUBURU*/
+                                                     0, /* U+003355: SQUARE REMU*/
+                                                     0, /* U+003356: SQUARE RENTOGEN*/
+                                                     0, /* U+003357: SQUARE WATTO*/
+                                                     0, /* U+003358: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO*/
+                                                     0, /* U+003359: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE*/
+                                                     0, /* U+00335a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO*/
+                                                     0, /* U+00335b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE*/
+                                                     0, /* U+00335c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR*/
+                                                     0, /* U+00335d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE*/
+                                                     0, /* U+00335e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX*/
+                                                     0, /* U+00335f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN*/
+                                                     0, /* U+003360: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT*/
+                                                     0, /* U+003361: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE*/
+                                                     0, /* U+003362: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN*/
+                                                     0, /* U+003363: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN*/
+                                                     0, /* U+003364: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE*/
+                                                     0, /* U+003365: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN*/
+                                                     0, /* U+003366: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN*/
+                                                     0, /* U+003367: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN*/
+                                                     0, /* U+003368: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN*/
+                                                     0, /* U+003369: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN*/
+                                                     0, /* U+00336a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN*/
+                                                     0, /* U+00336b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN*/
+                                                     0, /* U+00336c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY*/
+                                                     0, /* U+00336d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE*/
+                                                     0, /* U+00336e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO*/
+                                                     0, /* U+00336f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE*/
+                                                     0, /* U+003370: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR*/
+                                                     0, /* U+003371: SQUARE HPA*/
+                                                     0, /* U+003372: SQUARE DA*/
+                                                     0, /* U+003373: SQUARE AU*/
+                                                     0, /* U+003374: SQUARE BAR*/
+                                                     0, /* U+003375: SQUARE OV*/
+                                                     0, /* U+003376: SQUARE PC*/
+                                                     0, /* U+003377: SQUARE DM*/
+                                                     0, /* U+003378: SQUARE DM SQUARED*/
+                                                     0, /* U+003379: SQUARE DM CUBED*/
+                                                     0, /* U+00337a: SQUARE IU*/
+                                                     0, /* U+00337b: SQUARE ERA NAME HEISEI*/
+                                                     0, /* U+00337c: SQUARE ERA NAME SYOUWA*/
+                                                     0, /* U+00337d: SQUARE ERA NAME TAISYOU*/
+                                                     0, /* U+00337e: SQUARE ERA NAME MEIZI*/
+                                                     0, /* U+00337f: SQUARE CORPORATION*/
+                                                     0, /* U+003380: SQUARE PA AMPS*/
+                                                     0, /* U+003381: SQUARE NA*/
+                                                     0, /* U+003382: SQUARE MU A*/
+                                                     0, /* U+003383: SQUARE MA*/
+                                                     0, /* U+003384: SQUARE KA*/
+                                                     0, /* U+003385: SQUARE KB*/
+                                                     0, /* U+003386: SQUARE MB*/
+                                                     0, /* U+003387: SQUARE GB*/
+                                                     0, /* U+003388: SQUARE CAL*/
+                                                     0, /* U+003389: SQUARE KCAL*/
+                                                     0, /* U+00338a: SQUARE PF*/
+                                                     0, /* U+00338b: SQUARE NF*/
+                                                     0, /* U+00338c: SQUARE MU F*/
+                                                     0, /* U+00338d: SQUARE MU G*/
+                                                     0, /* U+00338e: SQUARE MG*/
+                                                     0, /* U+00338f: SQUARE KG*/
+                                                     0, /* U+003390: SQUARE HZ*/
+                                                     0, /* U+003391: SQUARE KHZ*/
+                                                     0, /* U+003392: SQUARE MHZ*/
+                                                     0, /* U+003393: SQUARE GHZ*/
+                                                     0, /* U+003394: SQUARE THZ*/
+                                                     0, /* U+003395: SQUARE MU L*/
+                                                     0, /* U+003396: SQUARE ML*/
+                                                     0, /* U+003397: SQUARE DL*/
+                                                     0, /* U+003398: SQUARE KL*/
+                                                     0, /* U+003399: SQUARE FM*/
+                                                     0, /* U+00339a: SQUARE NM*/
+                                                     0, /* U+00339b: SQUARE MU M*/
+                                                     0, /* U+00339c: SQUARE MM*/
+                                                     0, /* U+00339d: SQUARE CM*/
+                                                     0, /* U+00339e: SQUARE KM*/
+                                                     0, /* U+00339f: SQUARE MM SQUARED*/
+                                                     0, /* U+0033a0: SQUARE CM SQUARED*/
+                                                     0, /* U+0033a1: SQUARE M SQUARED*/
+                                                     0, /* U+0033a2: SQUARE KM SQUARED*/
+                                                     0, /* U+0033a3: SQUARE MM CUBED*/
+                                                     0, /* U+0033a4: SQUARE CM CUBED*/
+                                                     0, /* U+0033a5: SQUARE M CUBED*/
+                                                     0, /* U+0033a6: SQUARE KM CUBED*/
+                                                     0, /* U+0033a7: SQUARE M OVER S*/
+                                                     0, /* U+0033a8: SQUARE M OVER S SQUARED*/
+                                                     0, /* U+0033a9: SQUARE PA*/
+                                                     0, /* U+0033aa: SQUARE KPA*/
+                                                     0, /* U+0033ab: SQUARE MPA*/
+                                                     0, /* U+0033ac: SQUARE GPA*/
+                                                     0, /* U+0033ad: SQUARE RAD*/
+                                                     0, /* U+0033ae: SQUARE RAD OVER S*/
+                                                     0, /* U+0033af: SQUARE RAD OVER S SQUARED*/
+                                                     0, /* U+0033b0: SQUARE PS*/
+                                                     0, /* U+0033b1: SQUARE NS*/
+                                                     0, /* U+0033b2: SQUARE MU S*/
+                                                     0, /* U+0033b3: SQUARE MS*/
+                                                     0, /* U+0033b4: SQUARE PV*/
+                                                     0, /* U+0033b5: SQUARE NV*/
+                                                     0, /* U+0033b6: SQUARE MU V*/
+                                                     0, /* U+0033b7: SQUARE MV*/
+                                                     0, /* U+0033b8: SQUARE KV*/
+                                                     0, /* U+0033b9: SQUARE MV MEGA*/
+                                                     0, /* U+0033ba: SQUARE PW*/
+                                                     0, /* U+0033bb: SQUARE NW*/
+                                                     0, /* U+0033bc: SQUARE MU W*/
+                                                     0, /* U+0033bd: SQUARE MW*/
+                                                     0, /* U+0033be: SQUARE KW*/
+                                                     0, /* U+0033bf: SQUARE MW MEGA*/
+                                                     0, /* U+0033c0: SQUARE K OHM*/
+                                                     0, /* U+0033c1: SQUARE M OHM*/
+                                                     0, /* U+0033c2: SQUARE AM*/
+                                                     0, /* U+0033c3: SQUARE BQ*/
+                                                     0, /* U+0033c4: SQUARE CC*/
+                                                     0, /* U+0033c5: SQUARE CD*/
+                                                     0, /* U+0033c6: SQUARE C OVER KG*/
+                                                     0, /* U+0033c7: SQUARE CO*/
+                                                     0, /* U+0033c8: SQUARE DB*/
+                                                     0, /* U+0033c9: SQUARE GY*/
+                                                     0, /* U+0033ca: SQUARE HA*/
+                                                     0, /* U+0033cb: SQUARE HP*/
+                                                     0, /* U+0033cc: SQUARE IN*/
+                                                     0, /* U+0033cd: SQUARE KK*/
+                                                     0, /* U+0033ce: SQUARE KM CAPITAL*/
+                                                     0, /* U+0033cf: SQUARE KT*/
+                                                     0, /* U+0033d0: SQUARE LM*/
+                                                     0, /* U+0033d1: SQUARE LN*/
+                                                     0, /* U+0033d2: SQUARE LOG*/
+                                                     0, /* U+0033d3: SQUARE LX*/
+                                                     0, /* U+0033d4: SQUARE MB SMALL*/
+                                                     0, /* U+0033d5: SQUARE MIL*/
+                                                     0, /* U+0033d6: SQUARE MOL*/
+                                                     0, /* U+0033d7: SQUARE PH*/
+                                                     0, /* U+0033d8: SQUARE PM*/
+                                                     0, /* U+0033d9: SQUARE PPM*/
+                                                     0, /* U+0033da: SQUARE PR*/
+                                                     0, /* U+0033db: SQUARE SR*/
+                                                     0, /* U+0033dc: SQUARE SV*/
+                                                     0, /* U+0033dd: SQUARE WB*/
+                                                     0, /* U+0033de: SQUARE V OVER M*/
+                                                     0, /* U+0033df: SQUARE A OVER M*/
+                                                     0, /* U+0033e0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE*/
+                                                     0, /* U+0033e1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO*/
+                                                     0, /* U+0033e2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE*/
+                                                     0, /* U+0033e3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR*/
+                                                     0, /* U+0033e4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE*/
+                                                     0, /* U+0033e5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX*/
+                                                     0, /* U+0033e6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN*/
+                                                     0, /* U+0033e7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT*/
+                                                     0, /* U+0033e8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE*/
+                                                     0, /* U+0033e9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN*/
+                                                     0, /* U+0033ea: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN*/
+                                                     0, /* U+0033eb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE*/
+                                                     0, /* U+0033ec: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN*/
+                                                     0, /* U+0033ed: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN*/
+                                                     0, /* U+0033ee: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN*/
+                                                     0, /* U+0033ef: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN*/
+                                                     0, /* U+0033f0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN*/
+                                                     0, /* U+0033f1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN*/
+                                                     0, /* U+0033f2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN*/
+                                                     0, /* U+0033f3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY*/
+                                                     0, /* U+0033f4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE*/
+                                                     0, /* U+0033f5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO*/
+                                                     0, /* U+0033f6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE*/
+                                                     0, /* U+0033f7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR*/
+                                                     0, /* U+0033f8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE*/
+                                                     0, /* U+0033f9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX*/
+                                                     0, /* U+0033fa: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN*/
+                                                     0, /* U+0033fb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT*/
+                                                     0, /* U+0033fc: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE*/
+                                                     0, /* U+0033fd: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY*/
+                                                     0, /* U+0033fe: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE*/
+                                                     0, /* U+0033ff: SQUARE GAL*/
+                                           RTUNI_ALPHA, /* U+003400: <CJK Ideograph Extension A, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x004db5[] =
+{
+                                           RTUNI_ALPHA, /* U+004db5: <CJK Ideograph Extension A, Last>*/
+                                                     0, /* U+004db6: */
+                                                     0, /* U+004db7: */
+                                                     0, /* U+004db8: */
+                                                     0, /* U+004db9: */
+                                                     0, /* U+004dba: */
+                                                     0, /* U+004dbb: */
+                                                     0, /* U+004dbc: */
+                                                     0, /* U+004dbd: */
+                                                     0, /* U+004dbe: */
+                                                     0, /* U+004dbf: */
+                                                     0, /* U+004dc0: HEXAGRAM FOR THE CREATIVE HEAVEN*/
+                                                     0, /* U+004dc1: HEXAGRAM FOR THE RECEPTIVE EARTH*/
+                                                     0, /* U+004dc2: HEXAGRAM FOR DIFFICULTY AT THE BEGINNING*/
+                                                     0, /* U+004dc3: HEXAGRAM FOR YOUTHFUL FOLLY*/
+                                                     0, /* U+004dc4: HEXAGRAM FOR WAITING*/
+                                                     0, /* U+004dc5: HEXAGRAM FOR CONFLICT*/
+                                                     0, /* U+004dc6: HEXAGRAM FOR THE ARMY*/
+                                                     0, /* U+004dc7: HEXAGRAM FOR HOLDING TOGETHER*/
+                                                     0, /* U+004dc8: HEXAGRAM FOR SMALL TAMING*/
+                                                     0, /* U+004dc9: HEXAGRAM FOR TREADING*/
+                                                     0, /* U+004dca: HEXAGRAM FOR PEACE*/
+                                                     0, /* U+004dcb: HEXAGRAM FOR STANDSTILL*/
+                                                     0, /* U+004dcc: HEXAGRAM FOR FELLOWSHIP*/
+                                                     0, /* U+004dcd: HEXAGRAM FOR GREAT POSSESSION*/
+                                                     0, /* U+004dce: HEXAGRAM FOR MODESTY*/
+                                                     0, /* U+004dcf: HEXAGRAM FOR ENTHUSIASM*/
+                                                     0, /* U+004dd0: HEXAGRAM FOR FOLLOWING*/
+                                                     0, /* U+004dd1: HEXAGRAM FOR WORK ON THE DECAYED*/
+                                                     0, /* U+004dd2: HEXAGRAM FOR APPROACH*/
+                                                     0, /* U+004dd3: HEXAGRAM FOR CONTEMPLATION*/
+                                                     0, /* U+004dd4: HEXAGRAM FOR BITING THROUGH*/
+                                                     0, /* U+004dd5: HEXAGRAM FOR GRACE*/
+                                                     0, /* U+004dd6: HEXAGRAM FOR SPLITTING APART*/
+                                                     0, /* U+004dd7: HEXAGRAM FOR RETURN*/
+                                                     0, /* U+004dd8: HEXAGRAM FOR INNOCENCE*/
+                                                     0, /* U+004dd9: HEXAGRAM FOR GREAT TAMING*/
+                                                     0, /* U+004dda: HEXAGRAM FOR MOUTH CORNERS*/
+                                                     0, /* U+004ddb: HEXAGRAM FOR GREAT PREPONDERANCE*/
+                                                     0, /* U+004ddc: HEXAGRAM FOR THE ABYSMAL WATER*/
+                                                     0, /* U+004ddd: HEXAGRAM FOR THE CLINGING FIRE*/
+                                                     0, /* U+004dde: HEXAGRAM FOR INFLUENCE*/
+                                                     0, /* U+004ddf: HEXAGRAM FOR DURATION*/
+                                                     0, /* U+004de0: HEXAGRAM FOR RETREAT*/
+                                                     0, /* U+004de1: HEXAGRAM FOR GREAT POWER*/
+                                                     0, /* U+004de2: HEXAGRAM FOR PROGRESS*/
+                                                     0, /* U+004de3: HEXAGRAM FOR DARKENING OF THE LIGHT*/
+                                                     0, /* U+004de4: HEXAGRAM FOR THE FAMILY*/
+                                                     0, /* U+004de5: HEXAGRAM FOR OPPOSITION*/
+                                                     0, /* U+004de6: HEXAGRAM FOR OBSTRUCTION*/
+                                                     0, /* U+004de7: HEXAGRAM FOR DELIVERANCE*/
+                                                     0, /* U+004de8: HEXAGRAM FOR DECREASE*/
+                                                     0, /* U+004de9: HEXAGRAM FOR INCREASE*/
+                                                     0, /* U+004dea: HEXAGRAM FOR BREAKTHROUGH*/
+                                                     0, /* U+004deb: HEXAGRAM FOR COMING TO MEET*/
+                                                     0, /* U+004dec: HEXAGRAM FOR GATHERING TOGETHER*/
+                                                     0, /* U+004ded: HEXAGRAM FOR PUSHING UPWARD*/
+                                                     0, /* U+004dee: HEXAGRAM FOR OPPRESSION*/
+                                                     0, /* U+004def: HEXAGRAM FOR THE WELL*/
+                                                     0, /* U+004df0: HEXAGRAM FOR REVOLUTION*/
+                                                     0, /* U+004df1: HEXAGRAM FOR THE CAULDRON*/
+                                                     0, /* U+004df2: HEXAGRAM FOR THE AROUSING THUNDER*/
+                                                     0, /* U+004df3: HEXAGRAM FOR THE KEEPING STILL MOUNTAIN*/
+                                                     0, /* U+004df4: HEXAGRAM FOR DEVELOPMENT*/
+                                                     0, /* U+004df5: HEXAGRAM FOR THE MARRYING MAIDEN*/
+                                                     0, /* U+004df6: HEXAGRAM FOR ABUNDANCE*/
+                                                     0, /* U+004df7: HEXAGRAM FOR THE WANDERER*/
+                                                     0, /* U+004df8: HEXAGRAM FOR THE GENTLE WIND*/
+                                                     0, /* U+004df9: HEXAGRAM FOR THE JOYOUS LAKE*/
+                                                     0, /* U+004dfa: HEXAGRAM FOR DISPERSION*/
+                                                     0, /* U+004dfb: HEXAGRAM FOR LIMITATION*/
+                                                     0, /* U+004dfc: HEXAGRAM FOR INNER TRUTH*/
+                                                     0, /* U+004dfd: HEXAGRAM FOR SMALL PREPONDERANCE*/
+                                                     0, /* U+004dfe: HEXAGRAM FOR AFTER COMPLETION*/
+                                                     0, /* U+004dff: HEXAGRAM FOR BEFORE COMPLETION*/
+                                           RTUNI_ALPHA, /* U+004e00: <CJK Ideograph, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x009fcc[] =
+{
+                                           RTUNI_ALPHA, /* U+009fcc: <CJK Ideograph, Last>*/
+                                                     0, /* U+009fcd: */
+                                                     0, /* U+009fce: */
+                                                     0, /* U+009fcf: */
+                                                     0, /* U+009fd0: */
+                                                     0, /* U+009fd1: */
+                                                     0, /* U+009fd2: */
+                                                     0, /* U+009fd3: */
+                                                     0, /* U+009fd4: */
+                                                     0, /* U+009fd5: */
+                                                     0, /* U+009fd6: */
+                                                     0, /* U+009fd7: */
+                                                     0, /* U+009fd8: */
+                                                     0, /* U+009fd9: */
+                                                     0, /* U+009fda: */
+                                                     0, /* U+009fdb: */
+                                                     0, /* U+009fdc: */
+                                                     0, /* U+009fdd: */
+                                                     0, /* U+009fde: */
+                                                     0, /* U+009fdf: */
+                                                     0, /* U+009fe0: */
+                                                     0, /* U+009fe1: */
+                                                     0, /* U+009fe2: */
+                                                     0, /* U+009fe3: */
+                                                     0, /* U+009fe4: */
+                                                     0, /* U+009fe5: */
+                                                     0, /* U+009fe6: */
+                                                     0, /* U+009fe7: */
+                                                     0, /* U+009fe8: */
+                                                     0, /* U+009fe9: */
+                                                     0, /* U+009fea: */
+                                                     0, /* U+009feb: */
+                                                     0, /* U+009fec: */
+                                                     0, /* U+009fed: */
+                                                     0, /* U+009fee: */
+                                                     0, /* U+009fef: */
+                                                     0, /* U+009ff0: */
+                                                     0, /* U+009ff1: */
+                                                     0, /* U+009ff2: */
+                                                     0, /* U+009ff3: */
+                                                     0, /* U+009ff4: */
+                                                     0, /* U+009ff5: */
+                                                     0, /* U+009ff6: */
+                                                     0, /* U+009ff7: */
+                                                     0, /* U+009ff8: */
+                                                     0, /* U+009ff9: */
+                                                     0, /* U+009ffa: */
+                                                     0, /* U+009ffb: */
+                                                     0, /* U+009ffc: */
+                                                     0, /* U+009ffd: */
+                                                     0, /* U+009ffe: */
+                                                     0, /* U+009fff: */
+                                           RTUNI_ALPHA, /* U+00a000: YI SYLLABLE IT*/
+                                           RTUNI_ALPHA, /* U+00a001: YI SYLLABLE IX*/
+                                           RTUNI_ALPHA, /* U+00a002: YI SYLLABLE I*/
+                                           RTUNI_ALPHA, /* U+00a003: YI SYLLABLE IP*/
+                                           RTUNI_ALPHA, /* U+00a004: YI SYLLABLE IET*/
+                                           RTUNI_ALPHA, /* U+00a005: YI SYLLABLE IEX*/
+                                           RTUNI_ALPHA, /* U+00a006: YI SYLLABLE IE*/
+                                           RTUNI_ALPHA, /* U+00a007: YI SYLLABLE IEP*/
+                                           RTUNI_ALPHA, /* U+00a008: YI SYLLABLE AT*/
+                                           RTUNI_ALPHA, /* U+00a009: YI SYLLABLE AX*/
+                                           RTUNI_ALPHA, /* U+00a00a: YI SYLLABLE A*/
+                                           RTUNI_ALPHA, /* U+00a00b: YI SYLLABLE AP*/
+                                           RTUNI_ALPHA, /* U+00a00c: YI SYLLABLE UOX*/
+                                           RTUNI_ALPHA, /* U+00a00d: YI SYLLABLE UO*/
+                                           RTUNI_ALPHA, /* U+00a00e: YI SYLLABLE UOP*/
+                                           RTUNI_ALPHA, /* U+00a00f: YI SYLLABLE OT*/
+                                           RTUNI_ALPHA, /* U+00a010: YI SYLLABLE OX*/
+                                           RTUNI_ALPHA, /* U+00a011: YI SYLLABLE O*/
+                                           RTUNI_ALPHA, /* U+00a012: YI SYLLABLE OP*/
+                                           RTUNI_ALPHA, /* U+00a013: YI SYLLABLE EX*/
+                                           RTUNI_ALPHA, /* U+00a014: YI SYLLABLE E*/
+                                           RTUNI_ALPHA, /* U+00a015: YI SYLLABLE WU*/
+                                           RTUNI_ALPHA, /* U+00a016: YI SYLLABLE BIT*/
+                                           RTUNI_ALPHA, /* U+00a017: YI SYLLABLE BIX*/
+                                           RTUNI_ALPHA, /* U+00a018: YI SYLLABLE BI*/
+                                           RTUNI_ALPHA, /* U+00a019: YI SYLLABLE BIP*/
+                                           RTUNI_ALPHA, /* U+00a01a: YI SYLLABLE BIET*/
+                                           RTUNI_ALPHA, /* U+00a01b: YI SYLLABLE BIEX*/
+                                           RTUNI_ALPHA, /* U+00a01c: YI SYLLABLE BIE*/
+                                           RTUNI_ALPHA, /* U+00a01d: YI SYLLABLE BIEP*/
+                                           RTUNI_ALPHA, /* U+00a01e: YI SYLLABLE BAT*/
+                                           RTUNI_ALPHA, /* U+00a01f: YI SYLLABLE BAX*/
+                                           RTUNI_ALPHA, /* U+00a020: YI SYLLABLE BA*/
+                                           RTUNI_ALPHA, /* U+00a021: YI SYLLABLE BAP*/
+                                           RTUNI_ALPHA, /* U+00a022: YI SYLLABLE BUOX*/
+                                           RTUNI_ALPHA, /* U+00a023: YI SYLLABLE BUO*/
+                                           RTUNI_ALPHA, /* U+00a024: YI SYLLABLE BUOP*/
+                                           RTUNI_ALPHA, /* U+00a025: YI SYLLABLE BOT*/
+                                           RTUNI_ALPHA, /* U+00a026: YI SYLLABLE BOX*/
+                                           RTUNI_ALPHA, /* U+00a027: YI SYLLABLE BO*/
+                                           RTUNI_ALPHA, /* U+00a028: YI SYLLABLE BOP*/
+                                           RTUNI_ALPHA, /* U+00a029: YI SYLLABLE BEX*/
+                                           RTUNI_ALPHA, /* U+00a02a: YI SYLLABLE BE*/
+                                           RTUNI_ALPHA, /* U+00a02b: YI SYLLABLE BEP*/
+                                           RTUNI_ALPHA, /* U+00a02c: YI SYLLABLE BUT*/
+                                           RTUNI_ALPHA, /* U+00a02d: YI SYLLABLE BUX*/
+                                           RTUNI_ALPHA, /* U+00a02e: YI SYLLABLE BU*/
+                                           RTUNI_ALPHA, /* U+00a02f: YI SYLLABLE BUP*/
+                                           RTUNI_ALPHA, /* U+00a030: YI SYLLABLE BURX*/
+                                           RTUNI_ALPHA, /* U+00a031: YI SYLLABLE BUR*/
+                                           RTUNI_ALPHA, /* U+00a032: YI SYLLABLE BYT*/
+                                           RTUNI_ALPHA, /* U+00a033: YI SYLLABLE BYX*/
+                                           RTUNI_ALPHA, /* U+00a034: YI SYLLABLE BY*/
+                                           RTUNI_ALPHA, /* U+00a035: YI SYLLABLE BYP*/
+                                           RTUNI_ALPHA, /* U+00a036: YI SYLLABLE BYRX*/
+                                           RTUNI_ALPHA, /* U+00a037: YI SYLLABLE BYR*/
+                                           RTUNI_ALPHA, /* U+00a038: YI SYLLABLE PIT*/
+                                           RTUNI_ALPHA, /* U+00a039: YI SYLLABLE PIX*/
+                                           RTUNI_ALPHA, /* U+00a03a: YI SYLLABLE PI*/
+                                           RTUNI_ALPHA, /* U+00a03b: YI SYLLABLE PIP*/
+                                           RTUNI_ALPHA, /* U+00a03c: YI SYLLABLE PIEX*/
+                                           RTUNI_ALPHA, /* U+00a03d: YI SYLLABLE PIE*/
+                                           RTUNI_ALPHA, /* U+00a03e: YI SYLLABLE PIEP*/
+                                           RTUNI_ALPHA, /* U+00a03f: YI SYLLABLE PAT*/
+                                           RTUNI_ALPHA, /* U+00a040: YI SYLLABLE PAX*/
+                                           RTUNI_ALPHA, /* U+00a041: YI SYLLABLE PA*/
+                                           RTUNI_ALPHA, /* U+00a042: YI SYLLABLE PAP*/
+                                           RTUNI_ALPHA, /* U+00a043: YI SYLLABLE PUOX*/
+                                           RTUNI_ALPHA, /* U+00a044: YI SYLLABLE PUO*/
+                                           RTUNI_ALPHA, /* U+00a045: YI SYLLABLE PUOP*/
+                                           RTUNI_ALPHA, /* U+00a046: YI SYLLABLE POT*/
+                                           RTUNI_ALPHA, /* U+00a047: YI SYLLABLE POX*/
+                                           RTUNI_ALPHA, /* U+00a048: YI SYLLABLE PO*/
+                                           RTUNI_ALPHA, /* U+00a049: YI SYLLABLE POP*/
+                                           RTUNI_ALPHA, /* U+00a04a: YI SYLLABLE PUT*/
+                                           RTUNI_ALPHA, /* U+00a04b: YI SYLLABLE PUX*/
+                                           RTUNI_ALPHA, /* U+00a04c: YI SYLLABLE PU*/
+                                           RTUNI_ALPHA, /* U+00a04d: YI SYLLABLE PUP*/
+                                           RTUNI_ALPHA, /* U+00a04e: YI SYLLABLE PURX*/
+                                           RTUNI_ALPHA, /* U+00a04f: YI SYLLABLE PUR*/
+                                           RTUNI_ALPHA, /* U+00a050: YI SYLLABLE PYT*/
+                                           RTUNI_ALPHA, /* U+00a051: YI SYLLABLE PYX*/
+                                           RTUNI_ALPHA, /* U+00a052: YI SYLLABLE PY*/
+                                           RTUNI_ALPHA, /* U+00a053: YI SYLLABLE PYP*/
+                                           RTUNI_ALPHA, /* U+00a054: YI SYLLABLE PYRX*/
+                                           RTUNI_ALPHA, /* U+00a055: YI SYLLABLE PYR*/
+                                           RTUNI_ALPHA, /* U+00a056: YI SYLLABLE BBIT*/
+                                           RTUNI_ALPHA, /* U+00a057: YI SYLLABLE BBIX*/
+                                           RTUNI_ALPHA, /* U+00a058: YI SYLLABLE BBI*/
+                                           RTUNI_ALPHA, /* U+00a059: YI SYLLABLE BBIP*/
+                                           RTUNI_ALPHA, /* U+00a05a: YI SYLLABLE BBIET*/
+                                           RTUNI_ALPHA, /* U+00a05b: YI SYLLABLE BBIEX*/
+                                           RTUNI_ALPHA, /* U+00a05c: YI SYLLABLE BBIE*/
+                                           RTUNI_ALPHA, /* U+00a05d: YI SYLLABLE BBIEP*/
+                                           RTUNI_ALPHA, /* U+00a05e: YI SYLLABLE BBAT*/
+                                           RTUNI_ALPHA, /* U+00a05f: YI SYLLABLE BBAX*/
+                                           RTUNI_ALPHA, /* U+00a060: YI SYLLABLE BBA*/
+                                           RTUNI_ALPHA, /* U+00a061: YI SYLLABLE BBAP*/
+                                           RTUNI_ALPHA, /* U+00a062: YI SYLLABLE BBUOX*/
+                                           RTUNI_ALPHA, /* U+00a063: YI SYLLABLE BBUO*/
+                                           RTUNI_ALPHA, /* U+00a064: YI SYLLABLE BBUOP*/
+                                           RTUNI_ALPHA, /* U+00a065: YI SYLLABLE BBOT*/
+                                           RTUNI_ALPHA, /* U+00a066: YI SYLLABLE BBOX*/
+                                           RTUNI_ALPHA, /* U+00a067: YI SYLLABLE BBO*/
+                                           RTUNI_ALPHA, /* U+00a068: YI SYLLABLE BBOP*/
+                                           RTUNI_ALPHA, /* U+00a069: YI SYLLABLE BBEX*/
+                                           RTUNI_ALPHA, /* U+00a06a: YI SYLLABLE BBE*/
+                                           RTUNI_ALPHA, /* U+00a06b: YI SYLLABLE BBEP*/
+                                           RTUNI_ALPHA, /* U+00a06c: YI SYLLABLE BBUT*/
+                                           RTUNI_ALPHA, /* U+00a06d: YI SYLLABLE BBUX*/
+                                           RTUNI_ALPHA, /* U+00a06e: YI SYLLABLE BBU*/
+                                           RTUNI_ALPHA, /* U+00a06f: YI SYLLABLE BBUP*/
+                                           RTUNI_ALPHA, /* U+00a070: YI SYLLABLE BBURX*/
+                                           RTUNI_ALPHA, /* U+00a071: YI SYLLABLE BBUR*/
+                                           RTUNI_ALPHA, /* U+00a072: YI SYLLABLE BBYT*/
+                                           RTUNI_ALPHA, /* U+00a073: YI SYLLABLE BBYX*/
+                                           RTUNI_ALPHA, /* U+00a074: YI SYLLABLE BBY*/
+                                           RTUNI_ALPHA, /* U+00a075: YI SYLLABLE BBYP*/
+                                           RTUNI_ALPHA, /* U+00a076: YI SYLLABLE NBIT*/
+                                           RTUNI_ALPHA, /* U+00a077: YI SYLLABLE NBIX*/
+                                           RTUNI_ALPHA, /* U+00a078: YI SYLLABLE NBI*/
+                                           RTUNI_ALPHA, /* U+00a079: YI SYLLABLE NBIP*/
+                                           RTUNI_ALPHA, /* U+00a07a: YI SYLLABLE NBIEX*/
+                                           RTUNI_ALPHA, /* U+00a07b: YI SYLLABLE NBIE*/
+                                           RTUNI_ALPHA, /* U+00a07c: YI SYLLABLE NBIEP*/
+                                           RTUNI_ALPHA, /* U+00a07d: YI SYLLABLE NBAT*/
+                                           RTUNI_ALPHA, /* U+00a07e: YI SYLLABLE NBAX*/
+                                           RTUNI_ALPHA, /* U+00a07f: YI SYLLABLE NBA*/
+                                           RTUNI_ALPHA, /* U+00a080: YI SYLLABLE NBAP*/
+                                           RTUNI_ALPHA, /* U+00a081: YI SYLLABLE NBOT*/
+                                           RTUNI_ALPHA, /* U+00a082: YI SYLLABLE NBOX*/
+                                           RTUNI_ALPHA, /* U+00a083: YI SYLLABLE NBO*/
+                                           RTUNI_ALPHA, /* U+00a084: YI SYLLABLE NBOP*/
+                                           RTUNI_ALPHA, /* U+00a085: YI SYLLABLE NBUT*/
+                                           RTUNI_ALPHA, /* U+00a086: YI SYLLABLE NBUX*/
+                                           RTUNI_ALPHA, /* U+00a087: YI SYLLABLE NBU*/
+                                           RTUNI_ALPHA, /* U+00a088: YI SYLLABLE NBUP*/
+                                           RTUNI_ALPHA, /* U+00a089: YI SYLLABLE NBURX*/
+                                           RTUNI_ALPHA, /* U+00a08a: YI SYLLABLE NBUR*/
+                                           RTUNI_ALPHA, /* U+00a08b: YI SYLLABLE NBYT*/
+                                           RTUNI_ALPHA, /* U+00a08c: YI SYLLABLE NBYX*/
+                                           RTUNI_ALPHA, /* U+00a08d: YI SYLLABLE NBY*/
+                                           RTUNI_ALPHA, /* U+00a08e: YI SYLLABLE NBYP*/
+                                           RTUNI_ALPHA, /* U+00a08f: YI SYLLABLE NBYRX*/
+                                           RTUNI_ALPHA, /* U+00a090: YI SYLLABLE NBYR*/
+                                           RTUNI_ALPHA, /* U+00a091: YI SYLLABLE HMIT*/
+                                           RTUNI_ALPHA, /* U+00a092: YI SYLLABLE HMIX*/
+                                           RTUNI_ALPHA, /* U+00a093: YI SYLLABLE HMI*/
+                                           RTUNI_ALPHA, /* U+00a094: YI SYLLABLE HMIP*/
+                                           RTUNI_ALPHA, /* U+00a095: YI SYLLABLE HMIEX*/
+                                           RTUNI_ALPHA, /* U+00a096: YI SYLLABLE HMIE*/
+                                           RTUNI_ALPHA, /* U+00a097: YI SYLLABLE HMIEP*/
+                                           RTUNI_ALPHA, /* U+00a098: YI SYLLABLE HMAT*/
+                                           RTUNI_ALPHA, /* U+00a099: YI SYLLABLE HMAX*/
+                                           RTUNI_ALPHA, /* U+00a09a: YI SYLLABLE HMA*/
+                                           RTUNI_ALPHA, /* U+00a09b: YI SYLLABLE HMAP*/
+                                           RTUNI_ALPHA, /* U+00a09c: YI SYLLABLE HMUOX*/
+                                           RTUNI_ALPHA, /* U+00a09d: YI SYLLABLE HMUO*/
+                                           RTUNI_ALPHA, /* U+00a09e: YI SYLLABLE HMUOP*/
+                                           RTUNI_ALPHA, /* U+00a09f: YI SYLLABLE HMOT*/
+                                           RTUNI_ALPHA, /* U+00a0a0: YI SYLLABLE HMOX*/
+                                           RTUNI_ALPHA, /* U+00a0a1: YI SYLLABLE HMO*/
+                                           RTUNI_ALPHA, /* U+00a0a2: YI SYLLABLE HMOP*/
+                                           RTUNI_ALPHA, /* U+00a0a3: YI SYLLABLE HMUT*/
+                                           RTUNI_ALPHA, /* U+00a0a4: YI SYLLABLE HMUX*/
+                                           RTUNI_ALPHA, /* U+00a0a5: YI SYLLABLE HMU*/
+                                           RTUNI_ALPHA, /* U+00a0a6: YI SYLLABLE HMUP*/
+                                           RTUNI_ALPHA, /* U+00a0a7: YI SYLLABLE HMURX*/
+                                           RTUNI_ALPHA, /* U+00a0a8: YI SYLLABLE HMUR*/
+                                           RTUNI_ALPHA, /* U+00a0a9: YI SYLLABLE HMYX*/
+                                           RTUNI_ALPHA, /* U+00a0aa: YI SYLLABLE HMY*/
+                                           RTUNI_ALPHA, /* U+00a0ab: YI SYLLABLE HMYP*/
+                                           RTUNI_ALPHA, /* U+00a0ac: YI SYLLABLE HMYRX*/
+                                           RTUNI_ALPHA, /* U+00a0ad: YI SYLLABLE HMYR*/
+                                           RTUNI_ALPHA, /* U+00a0ae: YI SYLLABLE MIT*/
+                                           RTUNI_ALPHA, /* U+00a0af: YI SYLLABLE MIX*/
+                                           RTUNI_ALPHA, /* U+00a0b0: YI SYLLABLE MI*/
+                                           RTUNI_ALPHA, /* U+00a0b1: YI SYLLABLE MIP*/
+                                           RTUNI_ALPHA, /* U+00a0b2: YI SYLLABLE MIEX*/
+                                           RTUNI_ALPHA, /* U+00a0b3: YI SYLLABLE MIE*/
+                                           RTUNI_ALPHA, /* U+00a0b4: YI SYLLABLE MIEP*/
+                                           RTUNI_ALPHA, /* U+00a0b5: YI SYLLABLE MAT*/
+                                           RTUNI_ALPHA, /* U+00a0b6: YI SYLLABLE MAX*/
+                                           RTUNI_ALPHA, /* U+00a0b7: YI SYLLABLE MA*/
+                                           RTUNI_ALPHA, /* U+00a0b8: YI SYLLABLE MAP*/
+                                           RTUNI_ALPHA, /* U+00a0b9: YI SYLLABLE MUOT*/
+                                           RTUNI_ALPHA, /* U+00a0ba: YI SYLLABLE MUOX*/
+                                           RTUNI_ALPHA, /* U+00a0bb: YI SYLLABLE MUO*/
+                                           RTUNI_ALPHA, /* U+00a0bc: YI SYLLABLE MUOP*/
+                                           RTUNI_ALPHA, /* U+00a0bd: YI SYLLABLE MOT*/
+                                           RTUNI_ALPHA, /* U+00a0be: YI SYLLABLE MOX*/
+                                           RTUNI_ALPHA, /* U+00a0bf: YI SYLLABLE MO*/
+                                           RTUNI_ALPHA, /* U+00a0c0: YI SYLLABLE MOP*/
+                                           RTUNI_ALPHA, /* U+00a0c1: YI SYLLABLE MEX*/
+                                           RTUNI_ALPHA, /* U+00a0c2: YI SYLLABLE ME*/
+                                           RTUNI_ALPHA, /* U+00a0c3: YI SYLLABLE MUT*/
+                                           RTUNI_ALPHA, /* U+00a0c4: YI SYLLABLE MUX*/
+                                           RTUNI_ALPHA, /* U+00a0c5: YI SYLLABLE MU*/
+                                           RTUNI_ALPHA, /* U+00a0c6: YI SYLLABLE MUP*/
+                                           RTUNI_ALPHA, /* U+00a0c7: YI SYLLABLE MURX*/
+                                           RTUNI_ALPHA, /* U+00a0c8: YI SYLLABLE MUR*/
+                                           RTUNI_ALPHA, /* U+00a0c9: YI SYLLABLE MYT*/
+                                           RTUNI_ALPHA, /* U+00a0ca: YI SYLLABLE MYX*/
+                                           RTUNI_ALPHA, /* U+00a0cb: YI SYLLABLE MY*/
+                                           RTUNI_ALPHA, /* U+00a0cc: YI SYLLABLE MYP*/
+                                           RTUNI_ALPHA, /* U+00a0cd: YI SYLLABLE FIT*/
+                                           RTUNI_ALPHA, /* U+00a0ce: YI SYLLABLE FIX*/
+                                           RTUNI_ALPHA, /* U+00a0cf: YI SYLLABLE FI*/
+                                           RTUNI_ALPHA, /* U+00a0d0: YI SYLLABLE FIP*/
+                                           RTUNI_ALPHA, /* U+00a0d1: YI SYLLABLE FAT*/
+                                           RTUNI_ALPHA, /* U+00a0d2: YI SYLLABLE FAX*/
+                                           RTUNI_ALPHA, /* U+00a0d3: YI SYLLABLE FA*/
+                                           RTUNI_ALPHA, /* U+00a0d4: YI SYLLABLE FAP*/
+                                           RTUNI_ALPHA, /* U+00a0d5: YI SYLLABLE FOX*/
+                                           RTUNI_ALPHA, /* U+00a0d6: YI SYLLABLE FO*/
+                                           RTUNI_ALPHA, /* U+00a0d7: YI SYLLABLE FOP*/
+                                           RTUNI_ALPHA, /* U+00a0d8: YI SYLLABLE FUT*/
+                                           RTUNI_ALPHA, /* U+00a0d9: YI SYLLABLE FUX*/
+                                           RTUNI_ALPHA, /* U+00a0da: YI SYLLABLE FU*/
+                                           RTUNI_ALPHA, /* U+00a0db: YI SYLLABLE FUP*/
+                                           RTUNI_ALPHA, /* U+00a0dc: YI SYLLABLE FURX*/
+                                           RTUNI_ALPHA, /* U+00a0dd: YI SYLLABLE FUR*/
+                                           RTUNI_ALPHA, /* U+00a0de: YI SYLLABLE FYT*/
+                                           RTUNI_ALPHA, /* U+00a0df: YI SYLLABLE FYX*/
+                                           RTUNI_ALPHA, /* U+00a0e0: YI SYLLABLE FY*/
+                                           RTUNI_ALPHA, /* U+00a0e1: YI SYLLABLE FYP*/
+                                           RTUNI_ALPHA, /* U+00a0e2: YI SYLLABLE VIT*/
+                                           RTUNI_ALPHA, /* U+00a0e3: YI SYLLABLE VIX*/
+                                           RTUNI_ALPHA, /* U+00a0e4: YI SYLLABLE VI*/
+                                           RTUNI_ALPHA, /* U+00a0e5: YI SYLLABLE VIP*/
+                                           RTUNI_ALPHA, /* U+00a0e6: YI SYLLABLE VIET*/
+                                           RTUNI_ALPHA, /* U+00a0e7: YI SYLLABLE VIEX*/
+                                           RTUNI_ALPHA, /* U+00a0e8: YI SYLLABLE VIE*/
+                                           RTUNI_ALPHA, /* U+00a0e9: YI SYLLABLE VIEP*/
+                                           RTUNI_ALPHA, /* U+00a0ea: YI SYLLABLE VAT*/
+                                           RTUNI_ALPHA, /* U+00a0eb: YI SYLLABLE VAX*/
+                                           RTUNI_ALPHA, /* U+00a0ec: YI SYLLABLE VA*/
+                                           RTUNI_ALPHA, /* U+00a0ed: YI SYLLABLE VAP*/
+                                           RTUNI_ALPHA, /* U+00a0ee: YI SYLLABLE VOT*/
+                                           RTUNI_ALPHA, /* U+00a0ef: YI SYLLABLE VOX*/
+                                           RTUNI_ALPHA, /* U+00a0f0: YI SYLLABLE VO*/
+                                           RTUNI_ALPHA, /* U+00a0f1: YI SYLLABLE VOP*/
+                                           RTUNI_ALPHA, /* U+00a0f2: YI SYLLABLE VEX*/
+                                           RTUNI_ALPHA, /* U+00a0f3: YI SYLLABLE VEP*/
+                                           RTUNI_ALPHA, /* U+00a0f4: YI SYLLABLE VUT*/
+                                           RTUNI_ALPHA, /* U+00a0f5: YI SYLLABLE VUX*/
+                                           RTUNI_ALPHA, /* U+00a0f6: YI SYLLABLE VU*/
+                                           RTUNI_ALPHA, /* U+00a0f7: YI SYLLABLE VUP*/
+                                           RTUNI_ALPHA, /* U+00a0f8: YI SYLLABLE VURX*/
+                                           RTUNI_ALPHA, /* U+00a0f9: YI SYLLABLE VUR*/
+                                           RTUNI_ALPHA, /* U+00a0fa: YI SYLLABLE VYT*/
+                                           RTUNI_ALPHA, /* U+00a0fb: YI SYLLABLE VYX*/
+                                           RTUNI_ALPHA, /* U+00a0fc: YI SYLLABLE VY*/
+                                           RTUNI_ALPHA, /* U+00a0fd: YI SYLLABLE VYP*/
+                                           RTUNI_ALPHA, /* U+00a0fe: YI SYLLABLE VYRX*/
+                                           RTUNI_ALPHA, /* U+00a0ff: YI SYLLABLE VYR*/
+                                           RTUNI_ALPHA, /* U+00a100: YI SYLLABLE DIT*/
+                                           RTUNI_ALPHA, /* U+00a101: YI SYLLABLE DIX*/
+                                           RTUNI_ALPHA, /* U+00a102: YI SYLLABLE DI*/
+                                           RTUNI_ALPHA, /* U+00a103: YI SYLLABLE DIP*/
+                                           RTUNI_ALPHA, /* U+00a104: YI SYLLABLE DIEX*/
+                                           RTUNI_ALPHA, /* U+00a105: YI SYLLABLE DIE*/
+                                           RTUNI_ALPHA, /* U+00a106: YI SYLLABLE DIEP*/
+                                           RTUNI_ALPHA, /* U+00a107: YI SYLLABLE DAT*/
+                                           RTUNI_ALPHA, /* U+00a108: YI SYLLABLE DAX*/
+                                           RTUNI_ALPHA, /* U+00a109: YI SYLLABLE DA*/
+                                           RTUNI_ALPHA, /* U+00a10a: YI SYLLABLE DAP*/
+                                           RTUNI_ALPHA, /* U+00a10b: YI SYLLABLE DUOX*/
+                                           RTUNI_ALPHA, /* U+00a10c: YI SYLLABLE DUO*/
+                                           RTUNI_ALPHA, /* U+00a10d: YI SYLLABLE DOT*/
+                                           RTUNI_ALPHA, /* U+00a10e: YI SYLLABLE DOX*/
+                                           RTUNI_ALPHA, /* U+00a10f: YI SYLLABLE DO*/
+                                           RTUNI_ALPHA, /* U+00a110: YI SYLLABLE DOP*/
+                                           RTUNI_ALPHA, /* U+00a111: YI SYLLABLE DEX*/
+                                           RTUNI_ALPHA, /* U+00a112: YI SYLLABLE DE*/
+                                           RTUNI_ALPHA, /* U+00a113: YI SYLLABLE DEP*/
+                                           RTUNI_ALPHA, /* U+00a114: YI SYLLABLE DUT*/
+                                           RTUNI_ALPHA, /* U+00a115: YI SYLLABLE DUX*/
+                                           RTUNI_ALPHA, /* U+00a116: YI SYLLABLE DU*/
+                                           RTUNI_ALPHA, /* U+00a117: YI SYLLABLE DUP*/
+                                           RTUNI_ALPHA, /* U+00a118: YI SYLLABLE DURX*/
+                                           RTUNI_ALPHA, /* U+00a119: YI SYLLABLE DUR*/
+                                           RTUNI_ALPHA, /* U+00a11a: YI SYLLABLE TIT*/
+                                           RTUNI_ALPHA, /* U+00a11b: YI SYLLABLE TIX*/
+                                           RTUNI_ALPHA, /* U+00a11c: YI SYLLABLE TI*/
+                                           RTUNI_ALPHA, /* U+00a11d: YI SYLLABLE TIP*/
+                                           RTUNI_ALPHA, /* U+00a11e: YI SYLLABLE TIEX*/
+                                           RTUNI_ALPHA, /* U+00a11f: YI SYLLABLE TIE*/
+                                           RTUNI_ALPHA, /* U+00a120: YI SYLLABLE TIEP*/
+                                           RTUNI_ALPHA, /* U+00a121: YI SYLLABLE TAT*/
+                                           RTUNI_ALPHA, /* U+00a122: YI SYLLABLE TAX*/
+                                           RTUNI_ALPHA, /* U+00a123: YI SYLLABLE TA*/
+                                           RTUNI_ALPHA, /* U+00a124: YI SYLLABLE TAP*/
+                                           RTUNI_ALPHA, /* U+00a125: YI SYLLABLE TUOT*/
+                                           RTUNI_ALPHA, /* U+00a126: YI SYLLABLE TUOX*/
+                                           RTUNI_ALPHA, /* U+00a127: YI SYLLABLE TUO*/
+                                           RTUNI_ALPHA, /* U+00a128: YI SYLLABLE TUOP*/
+                                           RTUNI_ALPHA, /* U+00a129: YI SYLLABLE TOT*/
+                                           RTUNI_ALPHA, /* U+00a12a: YI SYLLABLE TOX*/
+                                           RTUNI_ALPHA, /* U+00a12b: YI SYLLABLE TO*/
+                                           RTUNI_ALPHA, /* U+00a12c: YI SYLLABLE TOP*/
+                                           RTUNI_ALPHA, /* U+00a12d: YI SYLLABLE TEX*/
+                                           RTUNI_ALPHA, /* U+00a12e: YI SYLLABLE TE*/
+                                           RTUNI_ALPHA, /* U+00a12f: YI SYLLABLE TEP*/
+                                           RTUNI_ALPHA, /* U+00a130: YI SYLLABLE TUT*/
+                                           RTUNI_ALPHA, /* U+00a131: YI SYLLABLE TUX*/
+                                           RTUNI_ALPHA, /* U+00a132: YI SYLLABLE TU*/
+                                           RTUNI_ALPHA, /* U+00a133: YI SYLLABLE TUP*/
+                                           RTUNI_ALPHA, /* U+00a134: YI SYLLABLE TURX*/
+                                           RTUNI_ALPHA, /* U+00a135: YI SYLLABLE TUR*/
+                                           RTUNI_ALPHA, /* U+00a136: YI SYLLABLE DDIT*/
+                                           RTUNI_ALPHA, /* U+00a137: YI SYLLABLE DDIX*/
+                                           RTUNI_ALPHA, /* U+00a138: YI SYLLABLE DDI*/
+                                           RTUNI_ALPHA, /* U+00a139: YI SYLLABLE DDIP*/
+                                           RTUNI_ALPHA, /* U+00a13a: YI SYLLABLE DDIEX*/
+                                           RTUNI_ALPHA, /* U+00a13b: YI SYLLABLE DDIE*/
+                                           RTUNI_ALPHA, /* U+00a13c: YI SYLLABLE DDIEP*/
+                                           RTUNI_ALPHA, /* U+00a13d: YI SYLLABLE DDAT*/
+                                           RTUNI_ALPHA, /* U+00a13e: YI SYLLABLE DDAX*/
+                                           RTUNI_ALPHA, /* U+00a13f: YI SYLLABLE DDA*/
+                                           RTUNI_ALPHA, /* U+00a140: YI SYLLABLE DDAP*/
+                                           RTUNI_ALPHA, /* U+00a141: YI SYLLABLE DDUOX*/
+                                           RTUNI_ALPHA, /* U+00a142: YI SYLLABLE DDUO*/
+                                           RTUNI_ALPHA, /* U+00a143: YI SYLLABLE DDUOP*/
+                                           RTUNI_ALPHA, /* U+00a144: YI SYLLABLE DDOT*/
+                                           RTUNI_ALPHA, /* U+00a145: YI SYLLABLE DDOX*/
+                                           RTUNI_ALPHA, /* U+00a146: YI SYLLABLE DDO*/
+                                           RTUNI_ALPHA, /* U+00a147: YI SYLLABLE DDOP*/
+                                           RTUNI_ALPHA, /* U+00a148: YI SYLLABLE DDEX*/
+                                           RTUNI_ALPHA, /* U+00a149: YI SYLLABLE DDE*/
+                                           RTUNI_ALPHA, /* U+00a14a: YI SYLLABLE DDEP*/
+                                           RTUNI_ALPHA, /* U+00a14b: YI SYLLABLE DDUT*/
+                                           RTUNI_ALPHA, /* U+00a14c: YI SYLLABLE DDUX*/
+                                           RTUNI_ALPHA, /* U+00a14d: YI SYLLABLE DDU*/
+                                           RTUNI_ALPHA, /* U+00a14e: YI SYLLABLE DDUP*/
+                                           RTUNI_ALPHA, /* U+00a14f: YI SYLLABLE DDURX*/
+                                           RTUNI_ALPHA, /* U+00a150: YI SYLLABLE DDUR*/
+                                           RTUNI_ALPHA, /* U+00a151: YI SYLLABLE NDIT*/
+                                           RTUNI_ALPHA, /* U+00a152: YI SYLLABLE NDIX*/
+                                           RTUNI_ALPHA, /* U+00a153: YI SYLLABLE NDI*/
+                                           RTUNI_ALPHA, /* U+00a154: YI SYLLABLE NDIP*/
+                                           RTUNI_ALPHA, /* U+00a155: YI SYLLABLE NDIEX*/
+                                           RTUNI_ALPHA, /* U+00a156: YI SYLLABLE NDIE*/
+                                           RTUNI_ALPHA, /* U+00a157: YI SYLLABLE NDAT*/
+                                           RTUNI_ALPHA, /* U+00a158: YI SYLLABLE NDAX*/
+                                           RTUNI_ALPHA, /* U+00a159: YI SYLLABLE NDA*/
+                                           RTUNI_ALPHA, /* U+00a15a: YI SYLLABLE NDAP*/
+                                           RTUNI_ALPHA, /* U+00a15b: YI SYLLABLE NDOT*/
+                                           RTUNI_ALPHA, /* U+00a15c: YI SYLLABLE NDOX*/
+                                           RTUNI_ALPHA, /* U+00a15d: YI SYLLABLE NDO*/
+                                           RTUNI_ALPHA, /* U+00a15e: YI SYLLABLE NDOP*/
+                                           RTUNI_ALPHA, /* U+00a15f: YI SYLLABLE NDEX*/
+                                           RTUNI_ALPHA, /* U+00a160: YI SYLLABLE NDE*/
+                                           RTUNI_ALPHA, /* U+00a161: YI SYLLABLE NDEP*/
+                                           RTUNI_ALPHA, /* U+00a162: YI SYLLABLE NDUT*/
+                                           RTUNI_ALPHA, /* U+00a163: YI SYLLABLE NDUX*/
+                                           RTUNI_ALPHA, /* U+00a164: YI SYLLABLE NDU*/
+                                           RTUNI_ALPHA, /* U+00a165: YI SYLLABLE NDUP*/
+                                           RTUNI_ALPHA, /* U+00a166: YI SYLLABLE NDURX*/
+                                           RTUNI_ALPHA, /* U+00a167: YI SYLLABLE NDUR*/
+                                           RTUNI_ALPHA, /* U+00a168: YI SYLLABLE HNIT*/
+                                           RTUNI_ALPHA, /* U+00a169: YI SYLLABLE HNIX*/
+                                           RTUNI_ALPHA, /* U+00a16a: YI SYLLABLE HNI*/
+                                           RTUNI_ALPHA, /* U+00a16b: YI SYLLABLE HNIP*/
+                                           RTUNI_ALPHA, /* U+00a16c: YI SYLLABLE HNIET*/
+                                           RTUNI_ALPHA, /* U+00a16d: YI SYLLABLE HNIEX*/
+                                           RTUNI_ALPHA, /* U+00a16e: YI SYLLABLE HNIE*/
+                                           RTUNI_ALPHA, /* U+00a16f: YI SYLLABLE HNIEP*/
+                                           RTUNI_ALPHA, /* U+00a170: YI SYLLABLE HNAT*/
+                                           RTUNI_ALPHA, /* U+00a171: YI SYLLABLE HNAX*/
+                                           RTUNI_ALPHA, /* U+00a172: YI SYLLABLE HNA*/
+                                           RTUNI_ALPHA, /* U+00a173: YI SYLLABLE HNAP*/
+                                           RTUNI_ALPHA, /* U+00a174: YI SYLLABLE HNUOX*/
+                                           RTUNI_ALPHA, /* U+00a175: YI SYLLABLE HNUO*/
+                                           RTUNI_ALPHA, /* U+00a176: YI SYLLABLE HNOT*/
+                                           RTUNI_ALPHA, /* U+00a177: YI SYLLABLE HNOX*/
+                                           RTUNI_ALPHA, /* U+00a178: YI SYLLABLE HNOP*/
+                                           RTUNI_ALPHA, /* U+00a179: YI SYLLABLE HNEX*/
+                                           RTUNI_ALPHA, /* U+00a17a: YI SYLLABLE HNE*/
+                                           RTUNI_ALPHA, /* U+00a17b: YI SYLLABLE HNEP*/
+                                           RTUNI_ALPHA, /* U+00a17c: YI SYLLABLE HNUT*/
+                                           RTUNI_ALPHA, /* U+00a17d: YI SYLLABLE NIT*/
+                                           RTUNI_ALPHA, /* U+00a17e: YI SYLLABLE NIX*/
+                                           RTUNI_ALPHA, /* U+00a17f: YI SYLLABLE NI*/
+                                           RTUNI_ALPHA, /* U+00a180: YI SYLLABLE NIP*/
+                                           RTUNI_ALPHA, /* U+00a181: YI SYLLABLE NIEX*/
+                                           RTUNI_ALPHA, /* U+00a182: YI SYLLABLE NIE*/
+                                           RTUNI_ALPHA, /* U+00a183: YI SYLLABLE NIEP*/
+                                           RTUNI_ALPHA, /* U+00a184: YI SYLLABLE NAX*/
+                                           RTUNI_ALPHA, /* U+00a185: YI SYLLABLE NA*/
+                                           RTUNI_ALPHA, /* U+00a186: YI SYLLABLE NAP*/
+                                           RTUNI_ALPHA, /* U+00a187: YI SYLLABLE NUOX*/
+                                           RTUNI_ALPHA, /* U+00a188: YI SYLLABLE NUO*/
+                                           RTUNI_ALPHA, /* U+00a189: YI SYLLABLE NUOP*/
+                                           RTUNI_ALPHA, /* U+00a18a: YI SYLLABLE NOT*/
+                                           RTUNI_ALPHA, /* U+00a18b: YI SYLLABLE NOX*/
+                                           RTUNI_ALPHA, /* U+00a18c: YI SYLLABLE NO*/
+                                           RTUNI_ALPHA, /* U+00a18d: YI SYLLABLE NOP*/
+                                           RTUNI_ALPHA, /* U+00a18e: YI SYLLABLE NEX*/
+                                           RTUNI_ALPHA, /* U+00a18f: YI SYLLABLE NE*/
+                                           RTUNI_ALPHA, /* U+00a190: YI SYLLABLE NEP*/
+                                           RTUNI_ALPHA, /* U+00a191: YI SYLLABLE NUT*/
+                                           RTUNI_ALPHA, /* U+00a192: YI SYLLABLE NUX*/
+                                           RTUNI_ALPHA, /* U+00a193: YI SYLLABLE NU*/
+                                           RTUNI_ALPHA, /* U+00a194: YI SYLLABLE NUP*/
+                                           RTUNI_ALPHA, /* U+00a195: YI SYLLABLE NURX*/
+                                           RTUNI_ALPHA, /* U+00a196: YI SYLLABLE NUR*/
+                                           RTUNI_ALPHA, /* U+00a197: YI SYLLABLE HLIT*/
+                                           RTUNI_ALPHA, /* U+00a198: YI SYLLABLE HLIX*/
+                                           RTUNI_ALPHA, /* U+00a199: YI SYLLABLE HLI*/
+                                           RTUNI_ALPHA, /* U+00a19a: YI SYLLABLE HLIP*/
+                                           RTUNI_ALPHA, /* U+00a19b: YI SYLLABLE HLIEX*/
+                                           RTUNI_ALPHA, /* U+00a19c: YI SYLLABLE HLIE*/
+                                           RTUNI_ALPHA, /* U+00a19d: YI SYLLABLE HLIEP*/
+                                           RTUNI_ALPHA, /* U+00a19e: YI SYLLABLE HLAT*/
+                                           RTUNI_ALPHA, /* U+00a19f: YI SYLLABLE HLAX*/
+                                           RTUNI_ALPHA, /* U+00a1a0: YI SYLLABLE HLA*/
+                                           RTUNI_ALPHA, /* U+00a1a1: YI SYLLABLE HLAP*/
+                                           RTUNI_ALPHA, /* U+00a1a2: YI SYLLABLE HLUOX*/
+                                           RTUNI_ALPHA, /* U+00a1a3: YI SYLLABLE HLUO*/
+                                           RTUNI_ALPHA, /* U+00a1a4: YI SYLLABLE HLUOP*/
+                                           RTUNI_ALPHA, /* U+00a1a5: YI SYLLABLE HLOX*/
+                                           RTUNI_ALPHA, /* U+00a1a6: YI SYLLABLE HLO*/
+                                           RTUNI_ALPHA, /* U+00a1a7: YI SYLLABLE HLOP*/
+                                           RTUNI_ALPHA, /* U+00a1a8: YI SYLLABLE HLEX*/
+                                           RTUNI_ALPHA, /* U+00a1a9: YI SYLLABLE HLE*/
+                                           RTUNI_ALPHA, /* U+00a1aa: YI SYLLABLE HLEP*/
+                                           RTUNI_ALPHA, /* U+00a1ab: YI SYLLABLE HLUT*/
+                                           RTUNI_ALPHA, /* U+00a1ac: YI SYLLABLE HLUX*/
+                                           RTUNI_ALPHA, /* U+00a1ad: YI SYLLABLE HLU*/
+                                           RTUNI_ALPHA, /* U+00a1ae: YI SYLLABLE HLUP*/
+                                           RTUNI_ALPHA, /* U+00a1af: YI SYLLABLE HLURX*/
+                                           RTUNI_ALPHA, /* U+00a1b0: YI SYLLABLE HLUR*/
+                                           RTUNI_ALPHA, /* U+00a1b1: YI SYLLABLE HLYT*/
+                                           RTUNI_ALPHA, /* U+00a1b2: YI SYLLABLE HLYX*/
+                                           RTUNI_ALPHA, /* U+00a1b3: YI SYLLABLE HLY*/
+                                           RTUNI_ALPHA, /* U+00a1b4: YI SYLLABLE HLYP*/
+                                           RTUNI_ALPHA, /* U+00a1b5: YI SYLLABLE HLYRX*/
+                                           RTUNI_ALPHA, /* U+00a1b6: YI SYLLABLE HLYR*/
+                                           RTUNI_ALPHA, /* U+00a1b7: YI SYLLABLE LIT*/
+                                           RTUNI_ALPHA, /* U+00a1b8: YI SYLLABLE LIX*/
+                                           RTUNI_ALPHA, /* U+00a1b9: YI SYLLABLE LI*/
+                                           RTUNI_ALPHA, /* U+00a1ba: YI SYLLABLE LIP*/
+                                           RTUNI_ALPHA, /* U+00a1bb: YI SYLLABLE LIET*/
+                                           RTUNI_ALPHA, /* U+00a1bc: YI SYLLABLE LIEX*/
+                                           RTUNI_ALPHA, /* U+00a1bd: YI SYLLABLE LIE*/
+                                           RTUNI_ALPHA, /* U+00a1be: YI SYLLABLE LIEP*/
+                                           RTUNI_ALPHA, /* U+00a1bf: YI SYLLABLE LAT*/
+                                           RTUNI_ALPHA, /* U+00a1c0: YI SYLLABLE LAX*/
+                                           RTUNI_ALPHA, /* U+00a1c1: YI SYLLABLE LA*/
+                                           RTUNI_ALPHA, /* U+00a1c2: YI SYLLABLE LAP*/
+                                           RTUNI_ALPHA, /* U+00a1c3: YI SYLLABLE LUOT*/
+                                           RTUNI_ALPHA, /* U+00a1c4: YI SYLLABLE LUOX*/
+                                           RTUNI_ALPHA, /* U+00a1c5: YI SYLLABLE LUO*/
+                                           RTUNI_ALPHA, /* U+00a1c6: YI SYLLABLE LUOP*/
+                                           RTUNI_ALPHA, /* U+00a1c7: YI SYLLABLE LOT*/
+                                           RTUNI_ALPHA, /* U+00a1c8: YI SYLLABLE LOX*/
+                                           RTUNI_ALPHA, /* U+00a1c9: YI SYLLABLE LO*/
+                                           RTUNI_ALPHA, /* U+00a1ca: YI SYLLABLE LOP*/
+                                           RTUNI_ALPHA, /* U+00a1cb: YI SYLLABLE LEX*/
+                                           RTUNI_ALPHA, /* U+00a1cc: YI SYLLABLE LE*/
+                                           RTUNI_ALPHA, /* U+00a1cd: YI SYLLABLE LEP*/
+                                           RTUNI_ALPHA, /* U+00a1ce: YI SYLLABLE LUT*/
+                                           RTUNI_ALPHA, /* U+00a1cf: YI SYLLABLE LUX*/
+                                           RTUNI_ALPHA, /* U+00a1d0: YI SYLLABLE LU*/
+                                           RTUNI_ALPHA, /* U+00a1d1: YI SYLLABLE LUP*/
+                                           RTUNI_ALPHA, /* U+00a1d2: YI SYLLABLE LURX*/
+                                           RTUNI_ALPHA, /* U+00a1d3: YI SYLLABLE LUR*/
+                                           RTUNI_ALPHA, /* U+00a1d4: YI SYLLABLE LYT*/
+                                           RTUNI_ALPHA, /* U+00a1d5: YI SYLLABLE LYX*/
+                                           RTUNI_ALPHA, /* U+00a1d6: YI SYLLABLE LY*/
+                                           RTUNI_ALPHA, /* U+00a1d7: YI SYLLABLE LYP*/
+                                           RTUNI_ALPHA, /* U+00a1d8: YI SYLLABLE LYRX*/
+                                           RTUNI_ALPHA, /* U+00a1d9: YI SYLLABLE LYR*/
+                                           RTUNI_ALPHA, /* U+00a1da: YI SYLLABLE GIT*/
+                                           RTUNI_ALPHA, /* U+00a1db: YI SYLLABLE GIX*/
+                                           RTUNI_ALPHA, /* U+00a1dc: YI SYLLABLE GI*/
+                                           RTUNI_ALPHA, /* U+00a1dd: YI SYLLABLE GIP*/
+                                           RTUNI_ALPHA, /* U+00a1de: YI SYLLABLE GIET*/
+                                           RTUNI_ALPHA, /* U+00a1df: YI SYLLABLE GIEX*/
+                                           RTUNI_ALPHA, /* U+00a1e0: YI SYLLABLE GIE*/
+                                           RTUNI_ALPHA, /* U+00a1e1: YI SYLLABLE GIEP*/
+                                           RTUNI_ALPHA, /* U+00a1e2: YI SYLLABLE GAT*/
+                                           RTUNI_ALPHA, /* U+00a1e3: YI SYLLABLE GAX*/
+                                           RTUNI_ALPHA, /* U+00a1e4: YI SYLLABLE GA*/
+                                           RTUNI_ALPHA, /* U+00a1e5: YI SYLLABLE GAP*/
+                                           RTUNI_ALPHA, /* U+00a1e6: YI SYLLABLE GUOT*/
+                                           RTUNI_ALPHA, /* U+00a1e7: YI SYLLABLE GUOX*/
+                                           RTUNI_ALPHA, /* U+00a1e8: YI SYLLABLE GUO*/
+                                           RTUNI_ALPHA, /* U+00a1e9: YI SYLLABLE GUOP*/
+                                           RTUNI_ALPHA, /* U+00a1ea: YI SYLLABLE GOT*/
+                                           RTUNI_ALPHA, /* U+00a1eb: YI SYLLABLE GOX*/
+                                           RTUNI_ALPHA, /* U+00a1ec: YI SYLLABLE GO*/
+                                           RTUNI_ALPHA, /* U+00a1ed: YI SYLLABLE GOP*/
+                                           RTUNI_ALPHA, /* U+00a1ee: YI SYLLABLE GET*/
+                                           RTUNI_ALPHA, /* U+00a1ef: YI SYLLABLE GEX*/
+                                           RTUNI_ALPHA, /* U+00a1f0: YI SYLLABLE GE*/
+                                           RTUNI_ALPHA, /* U+00a1f1: YI SYLLABLE GEP*/
+                                           RTUNI_ALPHA, /* U+00a1f2: YI SYLLABLE GUT*/
+                                           RTUNI_ALPHA, /* U+00a1f3: YI SYLLABLE GUX*/
+                                           RTUNI_ALPHA, /* U+00a1f4: YI SYLLABLE GU*/
+                                           RTUNI_ALPHA, /* U+00a1f5: YI SYLLABLE GUP*/
+                                           RTUNI_ALPHA, /* U+00a1f6: YI SYLLABLE GURX*/
+                                           RTUNI_ALPHA, /* U+00a1f7: YI SYLLABLE GUR*/
+                                           RTUNI_ALPHA, /* U+00a1f8: YI SYLLABLE KIT*/
+                                           RTUNI_ALPHA, /* U+00a1f9: YI SYLLABLE KIX*/
+                                           RTUNI_ALPHA, /* U+00a1fa: YI SYLLABLE KI*/
+                                           RTUNI_ALPHA, /* U+00a1fb: YI SYLLABLE KIP*/
+                                           RTUNI_ALPHA, /* U+00a1fc: YI SYLLABLE KIEX*/
+                                           RTUNI_ALPHA, /* U+00a1fd: YI SYLLABLE KIE*/
+                                           RTUNI_ALPHA, /* U+00a1fe: YI SYLLABLE KIEP*/
+                                           RTUNI_ALPHA, /* U+00a1ff: YI SYLLABLE KAT*/
+                                           RTUNI_ALPHA, /* U+00a200: YI SYLLABLE KAX*/
+                                           RTUNI_ALPHA, /* U+00a201: YI SYLLABLE KA*/
+                                           RTUNI_ALPHA, /* U+00a202: YI SYLLABLE KAP*/
+                                           RTUNI_ALPHA, /* U+00a203: YI SYLLABLE KUOX*/
+                                           RTUNI_ALPHA, /* U+00a204: YI SYLLABLE KUO*/
+                                           RTUNI_ALPHA, /* U+00a205: YI SYLLABLE KUOP*/
+                                           RTUNI_ALPHA, /* U+00a206: YI SYLLABLE KOT*/
+                                           RTUNI_ALPHA, /* U+00a207: YI SYLLABLE KOX*/
+                                           RTUNI_ALPHA, /* U+00a208: YI SYLLABLE KO*/
+                                           RTUNI_ALPHA, /* U+00a209: YI SYLLABLE KOP*/
+                                           RTUNI_ALPHA, /* U+00a20a: YI SYLLABLE KET*/
+                                           RTUNI_ALPHA, /* U+00a20b: YI SYLLABLE KEX*/
+                                           RTUNI_ALPHA, /* U+00a20c: YI SYLLABLE KE*/
+                                           RTUNI_ALPHA, /* U+00a20d: YI SYLLABLE KEP*/
+                                           RTUNI_ALPHA, /* U+00a20e: YI SYLLABLE KUT*/
+                                           RTUNI_ALPHA, /* U+00a20f: YI SYLLABLE KUX*/
+                                           RTUNI_ALPHA, /* U+00a210: YI SYLLABLE KU*/
+                                           RTUNI_ALPHA, /* U+00a211: YI SYLLABLE KUP*/
+                                           RTUNI_ALPHA, /* U+00a212: YI SYLLABLE KURX*/
+                                           RTUNI_ALPHA, /* U+00a213: YI SYLLABLE KUR*/
+                                           RTUNI_ALPHA, /* U+00a214: YI SYLLABLE GGIT*/
+                                           RTUNI_ALPHA, /* U+00a215: YI SYLLABLE GGIX*/
+                                           RTUNI_ALPHA, /* U+00a216: YI SYLLABLE GGI*/
+                                           RTUNI_ALPHA, /* U+00a217: YI SYLLABLE GGIEX*/
+                                           RTUNI_ALPHA, /* U+00a218: YI SYLLABLE GGIE*/
+                                           RTUNI_ALPHA, /* U+00a219: YI SYLLABLE GGIEP*/
+                                           RTUNI_ALPHA, /* U+00a21a: YI SYLLABLE GGAT*/
+                                           RTUNI_ALPHA, /* U+00a21b: YI SYLLABLE GGAX*/
+                                           RTUNI_ALPHA, /* U+00a21c: YI SYLLABLE GGA*/
+                                           RTUNI_ALPHA, /* U+00a21d: YI SYLLABLE GGAP*/
+                                           RTUNI_ALPHA, /* U+00a21e: YI SYLLABLE GGUOT*/
+                                           RTUNI_ALPHA, /* U+00a21f: YI SYLLABLE GGUOX*/
+                                           RTUNI_ALPHA, /* U+00a220: YI SYLLABLE GGUO*/
+                                           RTUNI_ALPHA, /* U+00a221: YI SYLLABLE GGUOP*/
+                                           RTUNI_ALPHA, /* U+00a222: YI SYLLABLE GGOT*/
+                                           RTUNI_ALPHA, /* U+00a223: YI SYLLABLE GGOX*/
+                                           RTUNI_ALPHA, /* U+00a224: YI SYLLABLE GGO*/
+                                           RTUNI_ALPHA, /* U+00a225: YI SYLLABLE GGOP*/
+                                           RTUNI_ALPHA, /* U+00a226: YI SYLLABLE GGET*/
+                                           RTUNI_ALPHA, /* U+00a227: YI SYLLABLE GGEX*/
+                                           RTUNI_ALPHA, /* U+00a228: YI SYLLABLE GGE*/
+                                           RTUNI_ALPHA, /* U+00a229: YI SYLLABLE GGEP*/
+                                           RTUNI_ALPHA, /* U+00a22a: YI SYLLABLE GGUT*/
+                                           RTUNI_ALPHA, /* U+00a22b: YI SYLLABLE GGUX*/
+                                           RTUNI_ALPHA, /* U+00a22c: YI SYLLABLE GGU*/
+                                           RTUNI_ALPHA, /* U+00a22d: YI SYLLABLE GGUP*/
+                                           RTUNI_ALPHA, /* U+00a22e: YI SYLLABLE GGURX*/
+                                           RTUNI_ALPHA, /* U+00a22f: YI SYLLABLE GGUR*/
+                                           RTUNI_ALPHA, /* U+00a230: YI SYLLABLE MGIEX*/
+                                           RTUNI_ALPHA, /* U+00a231: YI SYLLABLE MGIE*/
+                                           RTUNI_ALPHA, /* U+00a232: YI SYLLABLE MGAT*/
+                                           RTUNI_ALPHA, /* U+00a233: YI SYLLABLE MGAX*/
+                                           RTUNI_ALPHA, /* U+00a234: YI SYLLABLE MGA*/
+                                           RTUNI_ALPHA, /* U+00a235: YI SYLLABLE MGAP*/
+                                           RTUNI_ALPHA, /* U+00a236: YI SYLLABLE MGUOX*/
+                                           RTUNI_ALPHA, /* U+00a237: YI SYLLABLE MGUO*/
+                                           RTUNI_ALPHA, /* U+00a238: YI SYLLABLE MGUOP*/
+                                           RTUNI_ALPHA, /* U+00a239: YI SYLLABLE MGOT*/
+                                           RTUNI_ALPHA, /* U+00a23a: YI SYLLABLE MGOX*/
+                                           RTUNI_ALPHA, /* U+00a23b: YI SYLLABLE MGO*/
+                                           RTUNI_ALPHA, /* U+00a23c: YI SYLLABLE MGOP*/
+                                           RTUNI_ALPHA, /* U+00a23d: YI SYLLABLE MGEX*/
+                                           RTUNI_ALPHA, /* U+00a23e: YI SYLLABLE MGE*/
+                                           RTUNI_ALPHA, /* U+00a23f: YI SYLLABLE MGEP*/
+                                           RTUNI_ALPHA, /* U+00a240: YI SYLLABLE MGUT*/
+                                           RTUNI_ALPHA, /* U+00a241: YI SYLLABLE MGUX*/
+                                           RTUNI_ALPHA, /* U+00a242: YI SYLLABLE MGU*/
+                                           RTUNI_ALPHA, /* U+00a243: YI SYLLABLE MGUP*/
+                                           RTUNI_ALPHA, /* U+00a244: YI SYLLABLE MGURX*/
+                                           RTUNI_ALPHA, /* U+00a245: YI SYLLABLE MGUR*/
+                                           RTUNI_ALPHA, /* U+00a246: YI SYLLABLE HXIT*/
+                                           RTUNI_ALPHA, /* U+00a247: YI SYLLABLE HXIX*/
+                                           RTUNI_ALPHA, /* U+00a248: YI SYLLABLE HXI*/
+                                           RTUNI_ALPHA, /* U+00a249: YI SYLLABLE HXIP*/
+                                           RTUNI_ALPHA, /* U+00a24a: YI SYLLABLE HXIET*/
+                                           RTUNI_ALPHA, /* U+00a24b: YI SYLLABLE HXIEX*/
+                                           RTUNI_ALPHA, /* U+00a24c: YI SYLLABLE HXIE*/
+                                           RTUNI_ALPHA, /* U+00a24d: YI SYLLABLE HXIEP*/
+                                           RTUNI_ALPHA, /* U+00a24e: YI SYLLABLE HXAT*/
+                                           RTUNI_ALPHA, /* U+00a24f: YI SYLLABLE HXAX*/
+                                           RTUNI_ALPHA, /* U+00a250: YI SYLLABLE HXA*/
+                                           RTUNI_ALPHA, /* U+00a251: YI SYLLABLE HXAP*/
+                                           RTUNI_ALPHA, /* U+00a252: YI SYLLABLE HXUOT*/
+                                           RTUNI_ALPHA, /* U+00a253: YI SYLLABLE HXUOX*/
+                                           RTUNI_ALPHA, /* U+00a254: YI SYLLABLE HXUO*/
+                                           RTUNI_ALPHA, /* U+00a255: YI SYLLABLE HXUOP*/
+                                           RTUNI_ALPHA, /* U+00a256: YI SYLLABLE HXOT*/
+                                           RTUNI_ALPHA, /* U+00a257: YI SYLLABLE HXOX*/
+                                           RTUNI_ALPHA, /* U+00a258: YI SYLLABLE HXO*/
+                                           RTUNI_ALPHA, /* U+00a259: YI SYLLABLE HXOP*/
+                                           RTUNI_ALPHA, /* U+00a25a: YI SYLLABLE HXEX*/
+                                           RTUNI_ALPHA, /* U+00a25b: YI SYLLABLE HXE*/
+                                           RTUNI_ALPHA, /* U+00a25c: YI SYLLABLE HXEP*/
+                                           RTUNI_ALPHA, /* U+00a25d: YI SYLLABLE NGIEX*/
+                                           RTUNI_ALPHA, /* U+00a25e: YI SYLLABLE NGIE*/
+                                           RTUNI_ALPHA, /* U+00a25f: YI SYLLABLE NGIEP*/
+                                           RTUNI_ALPHA, /* U+00a260: YI SYLLABLE NGAT*/
+                                           RTUNI_ALPHA, /* U+00a261: YI SYLLABLE NGAX*/
+                                           RTUNI_ALPHA, /* U+00a262: YI SYLLABLE NGA*/
+                                           RTUNI_ALPHA, /* U+00a263: YI SYLLABLE NGAP*/
+                                           RTUNI_ALPHA, /* U+00a264: YI SYLLABLE NGUOT*/
+                                           RTUNI_ALPHA, /* U+00a265: YI SYLLABLE NGUOX*/
+                                           RTUNI_ALPHA, /* U+00a266: YI SYLLABLE NGUO*/
+                                           RTUNI_ALPHA, /* U+00a267: YI SYLLABLE NGOT*/
+                                           RTUNI_ALPHA, /* U+00a268: YI SYLLABLE NGOX*/
+                                           RTUNI_ALPHA, /* U+00a269: YI SYLLABLE NGO*/
+                                           RTUNI_ALPHA, /* U+00a26a: YI SYLLABLE NGOP*/
+                                           RTUNI_ALPHA, /* U+00a26b: YI SYLLABLE NGEX*/
+                                           RTUNI_ALPHA, /* U+00a26c: YI SYLLABLE NGE*/
+                                           RTUNI_ALPHA, /* U+00a26d: YI SYLLABLE NGEP*/
+                                           RTUNI_ALPHA, /* U+00a26e: YI SYLLABLE HIT*/
+                                           RTUNI_ALPHA, /* U+00a26f: YI SYLLABLE HIEX*/
+                                           RTUNI_ALPHA, /* U+00a270: YI SYLLABLE HIE*/
+                                           RTUNI_ALPHA, /* U+00a271: YI SYLLABLE HAT*/
+                                           RTUNI_ALPHA, /* U+00a272: YI SYLLABLE HAX*/
+                                           RTUNI_ALPHA, /* U+00a273: YI SYLLABLE HA*/
+                                           RTUNI_ALPHA, /* U+00a274: YI SYLLABLE HAP*/
+                                           RTUNI_ALPHA, /* U+00a275: YI SYLLABLE HUOT*/
+                                           RTUNI_ALPHA, /* U+00a276: YI SYLLABLE HUOX*/
+                                           RTUNI_ALPHA, /* U+00a277: YI SYLLABLE HUO*/
+                                           RTUNI_ALPHA, /* U+00a278: YI SYLLABLE HUOP*/
+                                           RTUNI_ALPHA, /* U+00a279: YI SYLLABLE HOT*/
+                                           RTUNI_ALPHA, /* U+00a27a: YI SYLLABLE HOX*/
+                                           RTUNI_ALPHA, /* U+00a27b: YI SYLLABLE HO*/
+                                           RTUNI_ALPHA, /* U+00a27c: YI SYLLABLE HOP*/
+                                           RTUNI_ALPHA, /* U+00a27d: YI SYLLABLE HEX*/
+                                           RTUNI_ALPHA, /* U+00a27e: YI SYLLABLE HE*/
+                                           RTUNI_ALPHA, /* U+00a27f: YI SYLLABLE HEP*/
+                                           RTUNI_ALPHA, /* U+00a280: YI SYLLABLE WAT*/
+                                           RTUNI_ALPHA, /* U+00a281: YI SYLLABLE WAX*/
+                                           RTUNI_ALPHA, /* U+00a282: YI SYLLABLE WA*/
+                                           RTUNI_ALPHA, /* U+00a283: YI SYLLABLE WAP*/
+                                           RTUNI_ALPHA, /* U+00a284: YI SYLLABLE WUOX*/
+                                           RTUNI_ALPHA, /* U+00a285: YI SYLLABLE WUO*/
+                                           RTUNI_ALPHA, /* U+00a286: YI SYLLABLE WUOP*/
+                                           RTUNI_ALPHA, /* U+00a287: YI SYLLABLE WOX*/
+                                           RTUNI_ALPHA, /* U+00a288: YI SYLLABLE WO*/
+                                           RTUNI_ALPHA, /* U+00a289: YI SYLLABLE WOP*/
+                                           RTUNI_ALPHA, /* U+00a28a: YI SYLLABLE WEX*/
+                                           RTUNI_ALPHA, /* U+00a28b: YI SYLLABLE WE*/
+                                           RTUNI_ALPHA, /* U+00a28c: YI SYLLABLE WEP*/
+                                           RTUNI_ALPHA, /* U+00a28d: YI SYLLABLE ZIT*/
+                                           RTUNI_ALPHA, /* U+00a28e: YI SYLLABLE ZIX*/
+                                           RTUNI_ALPHA, /* U+00a28f: YI SYLLABLE ZI*/
+                                           RTUNI_ALPHA, /* U+00a290: YI SYLLABLE ZIP*/
+                                           RTUNI_ALPHA, /* U+00a291: YI SYLLABLE ZIEX*/
+                                           RTUNI_ALPHA, /* U+00a292: YI SYLLABLE ZIE*/
+                                           RTUNI_ALPHA, /* U+00a293: YI SYLLABLE ZIEP*/
+                                           RTUNI_ALPHA, /* U+00a294: YI SYLLABLE ZAT*/
+                                           RTUNI_ALPHA, /* U+00a295: YI SYLLABLE ZAX*/
+                                           RTUNI_ALPHA, /* U+00a296: YI SYLLABLE ZA*/
+                                           RTUNI_ALPHA, /* U+00a297: YI SYLLABLE ZAP*/
+                                           RTUNI_ALPHA, /* U+00a298: YI SYLLABLE ZUOX*/
+                                           RTUNI_ALPHA, /* U+00a299: YI SYLLABLE ZUO*/
+                                           RTUNI_ALPHA, /* U+00a29a: YI SYLLABLE ZUOP*/
+                                           RTUNI_ALPHA, /* U+00a29b: YI SYLLABLE ZOT*/
+                                           RTUNI_ALPHA, /* U+00a29c: YI SYLLABLE ZOX*/
+                                           RTUNI_ALPHA, /* U+00a29d: YI SYLLABLE ZO*/
+                                           RTUNI_ALPHA, /* U+00a29e: YI SYLLABLE ZOP*/
+                                           RTUNI_ALPHA, /* U+00a29f: YI SYLLABLE ZEX*/
+                                           RTUNI_ALPHA, /* U+00a2a0: YI SYLLABLE ZE*/
+                                           RTUNI_ALPHA, /* U+00a2a1: YI SYLLABLE ZEP*/
+                                           RTUNI_ALPHA, /* U+00a2a2: YI SYLLABLE ZUT*/
+                                           RTUNI_ALPHA, /* U+00a2a3: YI SYLLABLE ZUX*/
+                                           RTUNI_ALPHA, /* U+00a2a4: YI SYLLABLE ZU*/
+                                           RTUNI_ALPHA, /* U+00a2a5: YI SYLLABLE ZUP*/
+                                           RTUNI_ALPHA, /* U+00a2a6: YI SYLLABLE ZURX*/
+                                           RTUNI_ALPHA, /* U+00a2a7: YI SYLLABLE ZUR*/
+                                           RTUNI_ALPHA, /* U+00a2a8: YI SYLLABLE ZYT*/
+                                           RTUNI_ALPHA, /* U+00a2a9: YI SYLLABLE ZYX*/
+                                           RTUNI_ALPHA, /* U+00a2aa: YI SYLLABLE ZY*/
+                                           RTUNI_ALPHA, /* U+00a2ab: YI SYLLABLE ZYP*/
+                                           RTUNI_ALPHA, /* U+00a2ac: YI SYLLABLE ZYRX*/
+                                           RTUNI_ALPHA, /* U+00a2ad: YI SYLLABLE ZYR*/
+                                           RTUNI_ALPHA, /* U+00a2ae: YI SYLLABLE CIT*/
+                                           RTUNI_ALPHA, /* U+00a2af: YI SYLLABLE CIX*/
+                                           RTUNI_ALPHA, /* U+00a2b0: YI SYLLABLE CI*/
+                                           RTUNI_ALPHA, /* U+00a2b1: YI SYLLABLE CIP*/
+                                           RTUNI_ALPHA, /* U+00a2b2: YI SYLLABLE CIET*/
+                                           RTUNI_ALPHA, /* U+00a2b3: YI SYLLABLE CIEX*/
+                                           RTUNI_ALPHA, /* U+00a2b4: YI SYLLABLE CIE*/
+                                           RTUNI_ALPHA, /* U+00a2b5: YI SYLLABLE CIEP*/
+                                           RTUNI_ALPHA, /* U+00a2b6: YI SYLLABLE CAT*/
+                                           RTUNI_ALPHA, /* U+00a2b7: YI SYLLABLE CAX*/
+                                           RTUNI_ALPHA, /* U+00a2b8: YI SYLLABLE CA*/
+                                           RTUNI_ALPHA, /* U+00a2b9: YI SYLLABLE CAP*/
+                                           RTUNI_ALPHA, /* U+00a2ba: YI SYLLABLE CUOX*/
+                                           RTUNI_ALPHA, /* U+00a2bb: YI SYLLABLE CUO*/
+                                           RTUNI_ALPHA, /* U+00a2bc: YI SYLLABLE CUOP*/
+                                           RTUNI_ALPHA, /* U+00a2bd: YI SYLLABLE COT*/
+                                           RTUNI_ALPHA, /* U+00a2be: YI SYLLABLE COX*/
+                                           RTUNI_ALPHA, /* U+00a2bf: YI SYLLABLE CO*/
+                                           RTUNI_ALPHA, /* U+00a2c0: YI SYLLABLE COP*/
+                                           RTUNI_ALPHA, /* U+00a2c1: YI SYLLABLE CEX*/
+                                           RTUNI_ALPHA, /* U+00a2c2: YI SYLLABLE CE*/
+                                           RTUNI_ALPHA, /* U+00a2c3: YI SYLLABLE CEP*/
+                                           RTUNI_ALPHA, /* U+00a2c4: YI SYLLABLE CUT*/
+                                           RTUNI_ALPHA, /* U+00a2c5: YI SYLLABLE CUX*/
+                                           RTUNI_ALPHA, /* U+00a2c6: YI SYLLABLE CU*/
+                                           RTUNI_ALPHA, /* U+00a2c7: YI SYLLABLE CUP*/
+                                           RTUNI_ALPHA, /* U+00a2c8: YI SYLLABLE CURX*/
+                                           RTUNI_ALPHA, /* U+00a2c9: YI SYLLABLE CUR*/
+                                           RTUNI_ALPHA, /* U+00a2ca: YI SYLLABLE CYT*/
+                                           RTUNI_ALPHA, /* U+00a2cb: YI SYLLABLE CYX*/
+                                           RTUNI_ALPHA, /* U+00a2cc: YI SYLLABLE CY*/
+                                           RTUNI_ALPHA, /* U+00a2cd: YI SYLLABLE CYP*/
+                                           RTUNI_ALPHA, /* U+00a2ce: YI SYLLABLE CYRX*/
+                                           RTUNI_ALPHA, /* U+00a2cf: YI SYLLABLE CYR*/
+                                           RTUNI_ALPHA, /* U+00a2d0: YI SYLLABLE ZZIT*/
+                                           RTUNI_ALPHA, /* U+00a2d1: YI SYLLABLE ZZIX*/
+                                           RTUNI_ALPHA, /* U+00a2d2: YI SYLLABLE ZZI*/
+                                           RTUNI_ALPHA, /* U+00a2d3: YI SYLLABLE ZZIP*/
+                                           RTUNI_ALPHA, /* U+00a2d4: YI SYLLABLE ZZIET*/
+                                           RTUNI_ALPHA, /* U+00a2d5: YI SYLLABLE ZZIEX*/
+                                           RTUNI_ALPHA, /* U+00a2d6: YI SYLLABLE ZZIE*/
+                                           RTUNI_ALPHA, /* U+00a2d7: YI SYLLABLE ZZIEP*/
+                                           RTUNI_ALPHA, /* U+00a2d8: YI SYLLABLE ZZAT*/
+                                           RTUNI_ALPHA, /* U+00a2d9: YI SYLLABLE ZZAX*/
+                                           RTUNI_ALPHA, /* U+00a2da: YI SYLLABLE ZZA*/
+                                           RTUNI_ALPHA, /* U+00a2db: YI SYLLABLE ZZAP*/
+                                           RTUNI_ALPHA, /* U+00a2dc: YI SYLLABLE ZZOX*/
+                                           RTUNI_ALPHA, /* U+00a2dd: YI SYLLABLE ZZO*/
+                                           RTUNI_ALPHA, /* U+00a2de: YI SYLLABLE ZZOP*/
+                                           RTUNI_ALPHA, /* U+00a2df: YI SYLLABLE ZZEX*/
+                                           RTUNI_ALPHA, /* U+00a2e0: YI SYLLABLE ZZE*/
+                                           RTUNI_ALPHA, /* U+00a2e1: YI SYLLABLE ZZEP*/
+                                           RTUNI_ALPHA, /* U+00a2e2: YI SYLLABLE ZZUX*/
+                                           RTUNI_ALPHA, /* U+00a2e3: YI SYLLABLE ZZU*/
+                                           RTUNI_ALPHA, /* U+00a2e4: YI SYLLABLE ZZUP*/
+                                           RTUNI_ALPHA, /* U+00a2e5: YI SYLLABLE ZZURX*/
+                                           RTUNI_ALPHA, /* U+00a2e6: YI SYLLABLE ZZUR*/
+                                           RTUNI_ALPHA, /* U+00a2e7: YI SYLLABLE ZZYT*/
+                                           RTUNI_ALPHA, /* U+00a2e8: YI SYLLABLE ZZYX*/
+                                           RTUNI_ALPHA, /* U+00a2e9: YI SYLLABLE ZZY*/
+                                           RTUNI_ALPHA, /* U+00a2ea: YI SYLLABLE ZZYP*/
+                                           RTUNI_ALPHA, /* U+00a2eb: YI SYLLABLE ZZYRX*/
+                                           RTUNI_ALPHA, /* U+00a2ec: YI SYLLABLE ZZYR*/
+                                           RTUNI_ALPHA, /* U+00a2ed: YI SYLLABLE NZIT*/
+                                           RTUNI_ALPHA, /* U+00a2ee: YI SYLLABLE NZIX*/
+                                           RTUNI_ALPHA, /* U+00a2ef: YI SYLLABLE NZI*/
+                                           RTUNI_ALPHA, /* U+00a2f0: YI SYLLABLE NZIP*/
+                                           RTUNI_ALPHA, /* U+00a2f1: YI SYLLABLE NZIEX*/
+                                           RTUNI_ALPHA, /* U+00a2f2: YI SYLLABLE NZIE*/
+                                           RTUNI_ALPHA, /* U+00a2f3: YI SYLLABLE NZIEP*/
+                                           RTUNI_ALPHA, /* U+00a2f4: YI SYLLABLE NZAT*/
+                                           RTUNI_ALPHA, /* U+00a2f5: YI SYLLABLE NZAX*/
+                                           RTUNI_ALPHA, /* U+00a2f6: YI SYLLABLE NZA*/
+                                           RTUNI_ALPHA, /* U+00a2f7: YI SYLLABLE NZAP*/
+                                           RTUNI_ALPHA, /* U+00a2f8: YI SYLLABLE NZUOX*/
+                                           RTUNI_ALPHA, /* U+00a2f9: YI SYLLABLE NZUO*/
+                                           RTUNI_ALPHA, /* U+00a2fa: YI SYLLABLE NZOX*/
+                                           RTUNI_ALPHA, /* U+00a2fb: YI SYLLABLE NZOP*/
+                                           RTUNI_ALPHA, /* U+00a2fc: YI SYLLABLE NZEX*/
+                                           RTUNI_ALPHA, /* U+00a2fd: YI SYLLABLE NZE*/
+                                           RTUNI_ALPHA, /* U+00a2fe: YI SYLLABLE NZUX*/
+                                           RTUNI_ALPHA, /* U+00a2ff: YI SYLLABLE NZU*/
+                                           RTUNI_ALPHA, /* U+00a300: YI SYLLABLE NZUP*/
+                                           RTUNI_ALPHA, /* U+00a301: YI SYLLABLE NZURX*/
+                                           RTUNI_ALPHA, /* U+00a302: YI SYLLABLE NZUR*/
+                                           RTUNI_ALPHA, /* U+00a303: YI SYLLABLE NZYT*/
+                                           RTUNI_ALPHA, /* U+00a304: YI SYLLABLE NZYX*/
+                                           RTUNI_ALPHA, /* U+00a305: YI SYLLABLE NZY*/
+                                           RTUNI_ALPHA, /* U+00a306: YI SYLLABLE NZYP*/
+                                           RTUNI_ALPHA, /* U+00a307: YI SYLLABLE NZYRX*/
+                                           RTUNI_ALPHA, /* U+00a308: YI SYLLABLE NZYR*/
+                                           RTUNI_ALPHA, /* U+00a309: YI SYLLABLE SIT*/
+                                           RTUNI_ALPHA, /* U+00a30a: YI SYLLABLE SIX*/
+                                           RTUNI_ALPHA, /* U+00a30b: YI SYLLABLE SI*/
+                                           RTUNI_ALPHA, /* U+00a30c: YI SYLLABLE SIP*/
+                                           RTUNI_ALPHA, /* U+00a30d: YI SYLLABLE SIEX*/
+                                           RTUNI_ALPHA, /* U+00a30e: YI SYLLABLE SIE*/
+                                           RTUNI_ALPHA, /* U+00a30f: YI SYLLABLE SIEP*/
+                                           RTUNI_ALPHA, /* U+00a310: YI SYLLABLE SAT*/
+                                           RTUNI_ALPHA, /* U+00a311: YI SYLLABLE SAX*/
+                                           RTUNI_ALPHA, /* U+00a312: YI SYLLABLE SA*/
+                                           RTUNI_ALPHA, /* U+00a313: YI SYLLABLE SAP*/
+                                           RTUNI_ALPHA, /* U+00a314: YI SYLLABLE SUOX*/
+                                           RTUNI_ALPHA, /* U+00a315: YI SYLLABLE SUO*/
+                                           RTUNI_ALPHA, /* U+00a316: YI SYLLABLE SUOP*/
+                                           RTUNI_ALPHA, /* U+00a317: YI SYLLABLE SOT*/
+                                           RTUNI_ALPHA, /* U+00a318: YI SYLLABLE SOX*/
+                                           RTUNI_ALPHA, /* U+00a319: YI SYLLABLE SO*/
+                                           RTUNI_ALPHA, /* U+00a31a: YI SYLLABLE SOP*/
+                                           RTUNI_ALPHA, /* U+00a31b: YI SYLLABLE SEX*/
+                                           RTUNI_ALPHA, /* U+00a31c: YI SYLLABLE SE*/
+                                           RTUNI_ALPHA, /* U+00a31d: YI SYLLABLE SEP*/
+                                           RTUNI_ALPHA, /* U+00a31e: YI SYLLABLE SUT*/
+                                           RTUNI_ALPHA, /* U+00a31f: YI SYLLABLE SUX*/
+                                           RTUNI_ALPHA, /* U+00a320: YI SYLLABLE SU*/
+                                           RTUNI_ALPHA, /* U+00a321: YI SYLLABLE SUP*/
+                                           RTUNI_ALPHA, /* U+00a322: YI SYLLABLE SURX*/
+                                           RTUNI_ALPHA, /* U+00a323: YI SYLLABLE SUR*/
+                                           RTUNI_ALPHA, /* U+00a324: YI SYLLABLE SYT*/
+                                           RTUNI_ALPHA, /* U+00a325: YI SYLLABLE SYX*/
+                                           RTUNI_ALPHA, /* U+00a326: YI SYLLABLE SY*/
+                                           RTUNI_ALPHA, /* U+00a327: YI SYLLABLE SYP*/
+                                           RTUNI_ALPHA, /* U+00a328: YI SYLLABLE SYRX*/
+                                           RTUNI_ALPHA, /* U+00a329: YI SYLLABLE SYR*/
+                                           RTUNI_ALPHA, /* U+00a32a: YI SYLLABLE SSIT*/
+                                           RTUNI_ALPHA, /* U+00a32b: YI SYLLABLE SSIX*/
+                                           RTUNI_ALPHA, /* U+00a32c: YI SYLLABLE SSI*/
+                                           RTUNI_ALPHA, /* U+00a32d: YI SYLLABLE SSIP*/
+                                           RTUNI_ALPHA, /* U+00a32e: YI SYLLABLE SSIEX*/
+                                           RTUNI_ALPHA, /* U+00a32f: YI SYLLABLE SSIE*/
+                                           RTUNI_ALPHA, /* U+00a330: YI SYLLABLE SSIEP*/
+                                           RTUNI_ALPHA, /* U+00a331: YI SYLLABLE SSAT*/
+                                           RTUNI_ALPHA, /* U+00a332: YI SYLLABLE SSAX*/
+                                           RTUNI_ALPHA, /* U+00a333: YI SYLLABLE SSA*/
+                                           RTUNI_ALPHA, /* U+00a334: YI SYLLABLE SSAP*/
+                                           RTUNI_ALPHA, /* U+00a335: YI SYLLABLE SSOT*/
+                                           RTUNI_ALPHA, /* U+00a336: YI SYLLABLE SSOX*/
+                                           RTUNI_ALPHA, /* U+00a337: YI SYLLABLE SSO*/
+                                           RTUNI_ALPHA, /* U+00a338: YI SYLLABLE SSOP*/
+                                           RTUNI_ALPHA, /* U+00a339: YI SYLLABLE SSEX*/
+                                           RTUNI_ALPHA, /* U+00a33a: YI SYLLABLE SSE*/
+                                           RTUNI_ALPHA, /* U+00a33b: YI SYLLABLE SSEP*/
+                                           RTUNI_ALPHA, /* U+00a33c: YI SYLLABLE SSUT*/
+                                           RTUNI_ALPHA, /* U+00a33d: YI SYLLABLE SSUX*/
+                                           RTUNI_ALPHA, /* U+00a33e: YI SYLLABLE SSU*/
+                                           RTUNI_ALPHA, /* U+00a33f: YI SYLLABLE SSUP*/
+                                           RTUNI_ALPHA, /* U+00a340: YI SYLLABLE SSYT*/
+                                           RTUNI_ALPHA, /* U+00a341: YI SYLLABLE SSYX*/
+                                           RTUNI_ALPHA, /* U+00a342: YI SYLLABLE SSY*/
+                                           RTUNI_ALPHA, /* U+00a343: YI SYLLABLE SSYP*/
+                                           RTUNI_ALPHA, /* U+00a344: YI SYLLABLE SSYRX*/
+                                           RTUNI_ALPHA, /* U+00a345: YI SYLLABLE SSYR*/
+                                           RTUNI_ALPHA, /* U+00a346: YI SYLLABLE ZHAT*/
+                                           RTUNI_ALPHA, /* U+00a347: YI SYLLABLE ZHAX*/
+                                           RTUNI_ALPHA, /* U+00a348: YI SYLLABLE ZHA*/
+                                           RTUNI_ALPHA, /* U+00a349: YI SYLLABLE ZHAP*/
+                                           RTUNI_ALPHA, /* U+00a34a: YI SYLLABLE ZHUOX*/
+                                           RTUNI_ALPHA, /* U+00a34b: YI SYLLABLE ZHUO*/
+                                           RTUNI_ALPHA, /* U+00a34c: YI SYLLABLE ZHUOP*/
+                                           RTUNI_ALPHA, /* U+00a34d: YI SYLLABLE ZHOT*/
+                                           RTUNI_ALPHA, /* U+00a34e: YI SYLLABLE ZHOX*/
+                                           RTUNI_ALPHA, /* U+00a34f: YI SYLLABLE ZHO*/
+                                           RTUNI_ALPHA, /* U+00a350: YI SYLLABLE ZHOP*/
+                                           RTUNI_ALPHA, /* U+00a351: YI SYLLABLE ZHET*/
+                                           RTUNI_ALPHA, /* U+00a352: YI SYLLABLE ZHEX*/
+                                           RTUNI_ALPHA, /* U+00a353: YI SYLLABLE ZHE*/
+                                           RTUNI_ALPHA, /* U+00a354: YI SYLLABLE ZHEP*/
+                                           RTUNI_ALPHA, /* U+00a355: YI SYLLABLE ZHUT*/
+                                           RTUNI_ALPHA, /* U+00a356: YI SYLLABLE ZHUX*/
+                                           RTUNI_ALPHA, /* U+00a357: YI SYLLABLE ZHU*/
+                                           RTUNI_ALPHA, /* U+00a358: YI SYLLABLE ZHUP*/
+                                           RTUNI_ALPHA, /* U+00a359: YI SYLLABLE ZHURX*/
+                                           RTUNI_ALPHA, /* U+00a35a: YI SYLLABLE ZHUR*/
+                                           RTUNI_ALPHA, /* U+00a35b: YI SYLLABLE ZHYT*/
+                                           RTUNI_ALPHA, /* U+00a35c: YI SYLLABLE ZHYX*/
+                                           RTUNI_ALPHA, /* U+00a35d: YI SYLLABLE ZHY*/
+                                           RTUNI_ALPHA, /* U+00a35e: YI SYLLABLE ZHYP*/
+                                           RTUNI_ALPHA, /* U+00a35f: YI SYLLABLE ZHYRX*/
+                                           RTUNI_ALPHA, /* U+00a360: YI SYLLABLE ZHYR*/
+                                           RTUNI_ALPHA, /* U+00a361: YI SYLLABLE CHAT*/
+                                           RTUNI_ALPHA, /* U+00a362: YI SYLLABLE CHAX*/
+                                           RTUNI_ALPHA, /* U+00a363: YI SYLLABLE CHA*/
+                                           RTUNI_ALPHA, /* U+00a364: YI SYLLABLE CHAP*/
+                                           RTUNI_ALPHA, /* U+00a365: YI SYLLABLE CHUOT*/
+                                           RTUNI_ALPHA, /* U+00a366: YI SYLLABLE CHUOX*/
+                                           RTUNI_ALPHA, /* U+00a367: YI SYLLABLE CHUO*/
+                                           RTUNI_ALPHA, /* U+00a368: YI SYLLABLE CHUOP*/
+                                           RTUNI_ALPHA, /* U+00a369: YI SYLLABLE CHOT*/
+                                           RTUNI_ALPHA, /* U+00a36a: YI SYLLABLE CHOX*/
+                                           RTUNI_ALPHA, /* U+00a36b: YI SYLLABLE CHO*/
+                                           RTUNI_ALPHA, /* U+00a36c: YI SYLLABLE CHOP*/
+                                           RTUNI_ALPHA, /* U+00a36d: YI SYLLABLE CHET*/
+                                           RTUNI_ALPHA, /* U+00a36e: YI SYLLABLE CHEX*/
+                                           RTUNI_ALPHA, /* U+00a36f: YI SYLLABLE CHE*/
+                                           RTUNI_ALPHA, /* U+00a370: YI SYLLABLE CHEP*/
+                                           RTUNI_ALPHA, /* U+00a371: YI SYLLABLE CHUX*/
+                                           RTUNI_ALPHA, /* U+00a372: YI SYLLABLE CHU*/
+                                           RTUNI_ALPHA, /* U+00a373: YI SYLLABLE CHUP*/
+                                           RTUNI_ALPHA, /* U+00a374: YI SYLLABLE CHURX*/
+                                           RTUNI_ALPHA, /* U+00a375: YI SYLLABLE CHUR*/
+                                           RTUNI_ALPHA, /* U+00a376: YI SYLLABLE CHYT*/
+                                           RTUNI_ALPHA, /* U+00a377: YI SYLLABLE CHYX*/
+                                           RTUNI_ALPHA, /* U+00a378: YI SYLLABLE CHY*/
+                                           RTUNI_ALPHA, /* U+00a379: YI SYLLABLE CHYP*/
+                                           RTUNI_ALPHA, /* U+00a37a: YI SYLLABLE CHYRX*/
+                                           RTUNI_ALPHA, /* U+00a37b: YI SYLLABLE CHYR*/
+                                           RTUNI_ALPHA, /* U+00a37c: YI SYLLABLE RRAX*/
+                                           RTUNI_ALPHA, /* U+00a37d: YI SYLLABLE RRA*/
+                                           RTUNI_ALPHA, /* U+00a37e: YI SYLLABLE RRUOX*/
+                                           RTUNI_ALPHA, /* U+00a37f: YI SYLLABLE RRUO*/
+                                           RTUNI_ALPHA, /* U+00a380: YI SYLLABLE RROT*/
+                                           RTUNI_ALPHA, /* U+00a381: YI SYLLABLE RROX*/
+                                           RTUNI_ALPHA, /* U+00a382: YI SYLLABLE RRO*/
+                                           RTUNI_ALPHA, /* U+00a383: YI SYLLABLE RROP*/
+                                           RTUNI_ALPHA, /* U+00a384: YI SYLLABLE RRET*/
+                                           RTUNI_ALPHA, /* U+00a385: YI SYLLABLE RREX*/
+                                           RTUNI_ALPHA, /* U+00a386: YI SYLLABLE RRE*/
+                                           RTUNI_ALPHA, /* U+00a387: YI SYLLABLE RREP*/
+                                           RTUNI_ALPHA, /* U+00a388: YI SYLLABLE RRUT*/
+                                           RTUNI_ALPHA, /* U+00a389: YI SYLLABLE RRUX*/
+                                           RTUNI_ALPHA, /* U+00a38a: YI SYLLABLE RRU*/
+                                           RTUNI_ALPHA, /* U+00a38b: YI SYLLABLE RRUP*/
+                                           RTUNI_ALPHA, /* U+00a38c: YI SYLLABLE RRURX*/
+                                           RTUNI_ALPHA, /* U+00a38d: YI SYLLABLE RRUR*/
+                                           RTUNI_ALPHA, /* U+00a38e: YI SYLLABLE RRYT*/
+                                           RTUNI_ALPHA, /* U+00a38f: YI SYLLABLE RRYX*/
+                                           RTUNI_ALPHA, /* U+00a390: YI SYLLABLE RRY*/
+                                           RTUNI_ALPHA, /* U+00a391: YI SYLLABLE RRYP*/
+                                           RTUNI_ALPHA, /* U+00a392: YI SYLLABLE RRYRX*/
+                                           RTUNI_ALPHA, /* U+00a393: YI SYLLABLE RRYR*/
+                                           RTUNI_ALPHA, /* U+00a394: YI SYLLABLE NRAT*/
+                                           RTUNI_ALPHA, /* U+00a395: YI SYLLABLE NRAX*/
+                                           RTUNI_ALPHA, /* U+00a396: YI SYLLABLE NRA*/
+                                           RTUNI_ALPHA, /* U+00a397: YI SYLLABLE NRAP*/
+                                           RTUNI_ALPHA, /* U+00a398: YI SYLLABLE NROX*/
+                                           RTUNI_ALPHA, /* U+00a399: YI SYLLABLE NRO*/
+                                           RTUNI_ALPHA, /* U+00a39a: YI SYLLABLE NROP*/
+                                           RTUNI_ALPHA, /* U+00a39b: YI SYLLABLE NRET*/
+                                           RTUNI_ALPHA, /* U+00a39c: YI SYLLABLE NREX*/
+                                           RTUNI_ALPHA, /* U+00a39d: YI SYLLABLE NRE*/
+                                           RTUNI_ALPHA, /* U+00a39e: YI SYLLABLE NREP*/
+                                           RTUNI_ALPHA, /* U+00a39f: YI SYLLABLE NRUT*/
+                                           RTUNI_ALPHA, /* U+00a3a0: YI SYLLABLE NRUX*/
+                                           RTUNI_ALPHA, /* U+00a3a1: YI SYLLABLE NRU*/
+                                           RTUNI_ALPHA, /* U+00a3a2: YI SYLLABLE NRUP*/
+                                           RTUNI_ALPHA, /* U+00a3a3: YI SYLLABLE NRURX*/
+                                           RTUNI_ALPHA, /* U+00a3a4: YI SYLLABLE NRUR*/
+                                           RTUNI_ALPHA, /* U+00a3a5: YI SYLLABLE NRYT*/
+                                           RTUNI_ALPHA, /* U+00a3a6: YI SYLLABLE NRYX*/
+                                           RTUNI_ALPHA, /* U+00a3a7: YI SYLLABLE NRY*/
+                                           RTUNI_ALPHA, /* U+00a3a8: YI SYLLABLE NRYP*/
+                                           RTUNI_ALPHA, /* U+00a3a9: YI SYLLABLE NRYRX*/
+                                           RTUNI_ALPHA, /* U+00a3aa: YI SYLLABLE NRYR*/
+                                           RTUNI_ALPHA, /* U+00a3ab: YI SYLLABLE SHAT*/
+                                           RTUNI_ALPHA, /* U+00a3ac: YI SYLLABLE SHAX*/
+                                           RTUNI_ALPHA, /* U+00a3ad: YI SYLLABLE SHA*/
+                                           RTUNI_ALPHA, /* U+00a3ae: YI SYLLABLE SHAP*/
+                                           RTUNI_ALPHA, /* U+00a3af: YI SYLLABLE SHUOX*/
+                                           RTUNI_ALPHA, /* U+00a3b0: YI SYLLABLE SHUO*/
+                                           RTUNI_ALPHA, /* U+00a3b1: YI SYLLABLE SHUOP*/
+                                           RTUNI_ALPHA, /* U+00a3b2: YI SYLLABLE SHOT*/
+                                           RTUNI_ALPHA, /* U+00a3b3: YI SYLLABLE SHOX*/
+                                           RTUNI_ALPHA, /* U+00a3b4: YI SYLLABLE SHO*/
+                                           RTUNI_ALPHA, /* U+00a3b5: YI SYLLABLE SHOP*/
+                                           RTUNI_ALPHA, /* U+00a3b6: YI SYLLABLE SHET*/
+                                           RTUNI_ALPHA, /* U+00a3b7: YI SYLLABLE SHEX*/
+                                           RTUNI_ALPHA, /* U+00a3b8: YI SYLLABLE SHE*/
+                                           RTUNI_ALPHA, /* U+00a3b9: YI SYLLABLE SHEP*/
+                                           RTUNI_ALPHA, /* U+00a3ba: YI SYLLABLE SHUT*/
+                                           RTUNI_ALPHA, /* U+00a3bb: YI SYLLABLE SHUX*/
+                                           RTUNI_ALPHA, /* U+00a3bc: YI SYLLABLE SHU*/
+                                           RTUNI_ALPHA, /* U+00a3bd: YI SYLLABLE SHUP*/
+                                           RTUNI_ALPHA, /* U+00a3be: YI SYLLABLE SHURX*/
+                                           RTUNI_ALPHA, /* U+00a3bf: YI SYLLABLE SHUR*/
+                                           RTUNI_ALPHA, /* U+00a3c0: YI SYLLABLE SHYT*/
+                                           RTUNI_ALPHA, /* U+00a3c1: YI SYLLABLE SHYX*/
+                                           RTUNI_ALPHA, /* U+00a3c2: YI SYLLABLE SHY*/
+                                           RTUNI_ALPHA, /* U+00a3c3: YI SYLLABLE SHYP*/
+                                           RTUNI_ALPHA, /* U+00a3c4: YI SYLLABLE SHYRX*/
+                                           RTUNI_ALPHA, /* U+00a3c5: YI SYLLABLE SHYR*/
+                                           RTUNI_ALPHA, /* U+00a3c6: YI SYLLABLE RAT*/
+                                           RTUNI_ALPHA, /* U+00a3c7: YI SYLLABLE RAX*/
+                                           RTUNI_ALPHA, /* U+00a3c8: YI SYLLABLE RA*/
+                                           RTUNI_ALPHA, /* U+00a3c9: YI SYLLABLE RAP*/
+                                           RTUNI_ALPHA, /* U+00a3ca: YI SYLLABLE RUOX*/
+                                           RTUNI_ALPHA, /* U+00a3cb: YI SYLLABLE RUO*/
+                                           RTUNI_ALPHA, /* U+00a3cc: YI SYLLABLE RUOP*/
+                                           RTUNI_ALPHA, /* U+00a3cd: YI SYLLABLE ROT*/
+                                           RTUNI_ALPHA, /* U+00a3ce: YI SYLLABLE ROX*/
+                                           RTUNI_ALPHA, /* U+00a3cf: YI SYLLABLE RO*/
+                                           RTUNI_ALPHA, /* U+00a3d0: YI SYLLABLE ROP*/
+                                           RTUNI_ALPHA, /* U+00a3d1: YI SYLLABLE REX*/
+                                           RTUNI_ALPHA, /* U+00a3d2: YI SYLLABLE RE*/
+                                           RTUNI_ALPHA, /* U+00a3d3: YI SYLLABLE REP*/
+                                           RTUNI_ALPHA, /* U+00a3d4: YI SYLLABLE RUT*/
+                                           RTUNI_ALPHA, /* U+00a3d5: YI SYLLABLE RUX*/
+                                           RTUNI_ALPHA, /* U+00a3d6: YI SYLLABLE RU*/
+                                           RTUNI_ALPHA, /* U+00a3d7: YI SYLLABLE RUP*/
+                                           RTUNI_ALPHA, /* U+00a3d8: YI SYLLABLE RURX*/
+                                           RTUNI_ALPHA, /* U+00a3d9: YI SYLLABLE RUR*/
+                                           RTUNI_ALPHA, /* U+00a3da: YI SYLLABLE RYT*/
+                                           RTUNI_ALPHA, /* U+00a3db: YI SYLLABLE RYX*/
+                                           RTUNI_ALPHA, /* U+00a3dc: YI SYLLABLE RY*/
+                                           RTUNI_ALPHA, /* U+00a3dd: YI SYLLABLE RYP*/
+                                           RTUNI_ALPHA, /* U+00a3de: YI SYLLABLE RYRX*/
+                                           RTUNI_ALPHA, /* U+00a3df: YI SYLLABLE RYR*/
+                                           RTUNI_ALPHA, /* U+00a3e0: YI SYLLABLE JIT*/
+                                           RTUNI_ALPHA, /* U+00a3e1: YI SYLLABLE JIX*/
+                                           RTUNI_ALPHA, /* U+00a3e2: YI SYLLABLE JI*/
+                                           RTUNI_ALPHA, /* U+00a3e3: YI SYLLABLE JIP*/
+                                           RTUNI_ALPHA, /* U+00a3e4: YI SYLLABLE JIET*/
+                                           RTUNI_ALPHA, /* U+00a3e5: YI SYLLABLE JIEX*/
+                                           RTUNI_ALPHA, /* U+00a3e6: YI SYLLABLE JIE*/
+                                           RTUNI_ALPHA, /* U+00a3e7: YI SYLLABLE JIEP*/
+                                           RTUNI_ALPHA, /* U+00a3e8: YI SYLLABLE JUOT*/
+                                           RTUNI_ALPHA, /* U+00a3e9: YI SYLLABLE JUOX*/
+                                           RTUNI_ALPHA, /* U+00a3ea: YI SYLLABLE JUO*/
+                                           RTUNI_ALPHA, /* U+00a3eb: YI SYLLABLE JUOP*/
+                                           RTUNI_ALPHA, /* U+00a3ec: YI SYLLABLE JOT*/
+                                           RTUNI_ALPHA, /* U+00a3ed: YI SYLLABLE JOX*/
+                                           RTUNI_ALPHA, /* U+00a3ee: YI SYLLABLE JO*/
+                                           RTUNI_ALPHA, /* U+00a3ef: YI SYLLABLE JOP*/
+                                           RTUNI_ALPHA, /* U+00a3f0: YI SYLLABLE JUT*/
+                                           RTUNI_ALPHA, /* U+00a3f1: YI SYLLABLE JUX*/
+                                           RTUNI_ALPHA, /* U+00a3f2: YI SYLLABLE JU*/
+                                           RTUNI_ALPHA, /* U+00a3f3: YI SYLLABLE JUP*/
+                                           RTUNI_ALPHA, /* U+00a3f4: YI SYLLABLE JURX*/
+                                           RTUNI_ALPHA, /* U+00a3f5: YI SYLLABLE JUR*/
+                                           RTUNI_ALPHA, /* U+00a3f6: YI SYLLABLE JYT*/
+                                           RTUNI_ALPHA, /* U+00a3f7: YI SYLLABLE JYX*/
+                                           RTUNI_ALPHA, /* U+00a3f8: YI SYLLABLE JY*/
+                                           RTUNI_ALPHA, /* U+00a3f9: YI SYLLABLE JYP*/
+                                           RTUNI_ALPHA, /* U+00a3fa: YI SYLLABLE JYRX*/
+                                           RTUNI_ALPHA, /* U+00a3fb: YI SYLLABLE JYR*/
+                                           RTUNI_ALPHA, /* U+00a3fc: YI SYLLABLE QIT*/
+                                           RTUNI_ALPHA, /* U+00a3fd: YI SYLLABLE QIX*/
+                                           RTUNI_ALPHA, /* U+00a3fe: YI SYLLABLE QI*/
+                                           RTUNI_ALPHA, /* U+00a3ff: YI SYLLABLE QIP*/
+                                           RTUNI_ALPHA, /* U+00a400: YI SYLLABLE QIET*/
+                                           RTUNI_ALPHA, /* U+00a401: YI SYLLABLE QIEX*/
+                                           RTUNI_ALPHA, /* U+00a402: YI SYLLABLE QIE*/
+                                           RTUNI_ALPHA, /* U+00a403: YI SYLLABLE QIEP*/
+                                           RTUNI_ALPHA, /* U+00a404: YI SYLLABLE QUOT*/
+                                           RTUNI_ALPHA, /* U+00a405: YI SYLLABLE QUOX*/
+                                           RTUNI_ALPHA, /* U+00a406: YI SYLLABLE QUO*/
+                                           RTUNI_ALPHA, /* U+00a407: YI SYLLABLE QUOP*/
+                                           RTUNI_ALPHA, /* U+00a408: YI SYLLABLE QOT*/
+                                           RTUNI_ALPHA, /* U+00a409: YI SYLLABLE QOX*/
+                                           RTUNI_ALPHA, /* U+00a40a: YI SYLLABLE QO*/
+                                           RTUNI_ALPHA, /* U+00a40b: YI SYLLABLE QOP*/
+                                           RTUNI_ALPHA, /* U+00a40c: YI SYLLABLE QUT*/
+                                           RTUNI_ALPHA, /* U+00a40d: YI SYLLABLE QUX*/
+                                           RTUNI_ALPHA, /* U+00a40e: YI SYLLABLE QU*/
+                                           RTUNI_ALPHA, /* U+00a40f: YI SYLLABLE QUP*/
+                                           RTUNI_ALPHA, /* U+00a410: YI SYLLABLE QURX*/
+                                           RTUNI_ALPHA, /* U+00a411: YI SYLLABLE QUR*/
+                                           RTUNI_ALPHA, /* U+00a412: YI SYLLABLE QYT*/
+                                           RTUNI_ALPHA, /* U+00a413: YI SYLLABLE QYX*/
+                                           RTUNI_ALPHA, /* U+00a414: YI SYLLABLE QY*/
+                                           RTUNI_ALPHA, /* U+00a415: YI SYLLABLE QYP*/
+                                           RTUNI_ALPHA, /* U+00a416: YI SYLLABLE QYRX*/
+                                           RTUNI_ALPHA, /* U+00a417: YI SYLLABLE QYR*/
+                                           RTUNI_ALPHA, /* U+00a418: YI SYLLABLE JJIT*/
+                                           RTUNI_ALPHA, /* U+00a419: YI SYLLABLE JJIX*/
+                                           RTUNI_ALPHA, /* U+00a41a: YI SYLLABLE JJI*/
+                                           RTUNI_ALPHA, /* U+00a41b: YI SYLLABLE JJIP*/
+                                           RTUNI_ALPHA, /* U+00a41c: YI SYLLABLE JJIET*/
+                                           RTUNI_ALPHA, /* U+00a41d: YI SYLLABLE JJIEX*/
+                                           RTUNI_ALPHA, /* U+00a41e: YI SYLLABLE JJIE*/
+                                           RTUNI_ALPHA, /* U+00a41f: YI SYLLABLE JJIEP*/
+                                           RTUNI_ALPHA, /* U+00a420: YI SYLLABLE JJUOX*/
+                                           RTUNI_ALPHA, /* U+00a421: YI SYLLABLE JJUO*/
+                                           RTUNI_ALPHA, /* U+00a422: YI SYLLABLE JJUOP*/
+                                           RTUNI_ALPHA, /* U+00a423: YI SYLLABLE JJOT*/
+                                           RTUNI_ALPHA, /* U+00a424: YI SYLLABLE JJOX*/
+                                           RTUNI_ALPHA, /* U+00a425: YI SYLLABLE JJO*/
+                                           RTUNI_ALPHA, /* U+00a426: YI SYLLABLE JJOP*/
+                                           RTUNI_ALPHA, /* U+00a427: YI SYLLABLE JJUT*/
+                                           RTUNI_ALPHA, /* U+00a428: YI SYLLABLE JJUX*/
+                                           RTUNI_ALPHA, /* U+00a429: YI SYLLABLE JJU*/
+                                           RTUNI_ALPHA, /* U+00a42a: YI SYLLABLE JJUP*/
+                                           RTUNI_ALPHA, /* U+00a42b: YI SYLLABLE JJURX*/
+                                           RTUNI_ALPHA, /* U+00a42c: YI SYLLABLE JJUR*/
+                                           RTUNI_ALPHA, /* U+00a42d: YI SYLLABLE JJYT*/
+                                           RTUNI_ALPHA, /* U+00a42e: YI SYLLABLE JJYX*/
+                                           RTUNI_ALPHA, /* U+00a42f: YI SYLLABLE JJY*/
+                                           RTUNI_ALPHA, /* U+00a430: YI SYLLABLE JJYP*/
+                                           RTUNI_ALPHA, /* U+00a431: YI SYLLABLE NJIT*/
+                                           RTUNI_ALPHA, /* U+00a432: YI SYLLABLE NJIX*/
+                                           RTUNI_ALPHA, /* U+00a433: YI SYLLABLE NJI*/
+                                           RTUNI_ALPHA, /* U+00a434: YI SYLLABLE NJIP*/
+                                           RTUNI_ALPHA, /* U+00a435: YI SYLLABLE NJIET*/
+                                           RTUNI_ALPHA, /* U+00a436: YI SYLLABLE NJIEX*/
+                                           RTUNI_ALPHA, /* U+00a437: YI SYLLABLE NJIE*/
+                                           RTUNI_ALPHA, /* U+00a438: YI SYLLABLE NJIEP*/
+                                           RTUNI_ALPHA, /* U+00a439: YI SYLLABLE NJUOX*/
+                                           RTUNI_ALPHA, /* U+00a43a: YI SYLLABLE NJUO*/
+                                           RTUNI_ALPHA, /* U+00a43b: YI SYLLABLE NJOT*/
+                                           RTUNI_ALPHA, /* U+00a43c: YI SYLLABLE NJOX*/
+                                           RTUNI_ALPHA, /* U+00a43d: YI SYLLABLE NJO*/
+                                           RTUNI_ALPHA, /* U+00a43e: YI SYLLABLE NJOP*/
+                                           RTUNI_ALPHA, /* U+00a43f: YI SYLLABLE NJUX*/
+                                           RTUNI_ALPHA, /* U+00a440: YI SYLLABLE NJU*/
+                                           RTUNI_ALPHA, /* U+00a441: YI SYLLABLE NJUP*/
+                                           RTUNI_ALPHA, /* U+00a442: YI SYLLABLE NJURX*/
+                                           RTUNI_ALPHA, /* U+00a443: YI SYLLABLE NJUR*/
+                                           RTUNI_ALPHA, /* U+00a444: YI SYLLABLE NJYT*/
+                                           RTUNI_ALPHA, /* U+00a445: YI SYLLABLE NJYX*/
+                                           RTUNI_ALPHA, /* U+00a446: YI SYLLABLE NJY*/
+                                           RTUNI_ALPHA, /* U+00a447: YI SYLLABLE NJYP*/
+                                           RTUNI_ALPHA, /* U+00a448: YI SYLLABLE NJYRX*/
+                                           RTUNI_ALPHA, /* U+00a449: YI SYLLABLE NJYR*/
+                                           RTUNI_ALPHA, /* U+00a44a: YI SYLLABLE NYIT*/
+                                           RTUNI_ALPHA, /* U+00a44b: YI SYLLABLE NYIX*/
+                                           RTUNI_ALPHA, /* U+00a44c: YI SYLLABLE NYI*/
+                                           RTUNI_ALPHA, /* U+00a44d: YI SYLLABLE NYIP*/
+                                           RTUNI_ALPHA, /* U+00a44e: YI SYLLABLE NYIET*/
+                                           RTUNI_ALPHA, /* U+00a44f: YI SYLLABLE NYIEX*/
+                                           RTUNI_ALPHA, /* U+00a450: YI SYLLABLE NYIE*/
+                                           RTUNI_ALPHA, /* U+00a451: YI SYLLABLE NYIEP*/
+                                           RTUNI_ALPHA, /* U+00a452: YI SYLLABLE NYUOX*/
+                                           RTUNI_ALPHA, /* U+00a453: YI SYLLABLE NYUO*/
+                                           RTUNI_ALPHA, /* U+00a454: YI SYLLABLE NYUOP*/
+                                           RTUNI_ALPHA, /* U+00a455: YI SYLLABLE NYOT*/
+                                           RTUNI_ALPHA, /* U+00a456: YI SYLLABLE NYOX*/
+                                           RTUNI_ALPHA, /* U+00a457: YI SYLLABLE NYO*/
+                                           RTUNI_ALPHA, /* U+00a458: YI SYLLABLE NYOP*/
+                                           RTUNI_ALPHA, /* U+00a459: YI SYLLABLE NYUT*/
+                                           RTUNI_ALPHA, /* U+00a45a: YI SYLLABLE NYUX*/
+                                           RTUNI_ALPHA, /* U+00a45b: YI SYLLABLE NYU*/
+                                           RTUNI_ALPHA, /* U+00a45c: YI SYLLABLE NYUP*/
+                                           RTUNI_ALPHA, /* U+00a45d: YI SYLLABLE XIT*/
+                                           RTUNI_ALPHA, /* U+00a45e: YI SYLLABLE XIX*/
+                                           RTUNI_ALPHA, /* U+00a45f: YI SYLLABLE XI*/
+                                           RTUNI_ALPHA, /* U+00a460: YI SYLLABLE XIP*/
+                                           RTUNI_ALPHA, /* U+00a461: YI SYLLABLE XIET*/
+                                           RTUNI_ALPHA, /* U+00a462: YI SYLLABLE XIEX*/
+                                           RTUNI_ALPHA, /* U+00a463: YI SYLLABLE XIE*/
+                                           RTUNI_ALPHA, /* U+00a464: YI SYLLABLE XIEP*/
+                                           RTUNI_ALPHA, /* U+00a465: YI SYLLABLE XUOX*/
+                                           RTUNI_ALPHA, /* U+00a466: YI SYLLABLE XUO*/
+                                           RTUNI_ALPHA, /* U+00a467: YI SYLLABLE XOT*/
+                                           RTUNI_ALPHA, /* U+00a468: YI SYLLABLE XOX*/
+                                           RTUNI_ALPHA, /* U+00a469: YI SYLLABLE XO*/
+                                           RTUNI_ALPHA, /* U+00a46a: YI SYLLABLE XOP*/
+                                           RTUNI_ALPHA, /* U+00a46b: YI SYLLABLE XYT*/
+                                           RTUNI_ALPHA, /* U+00a46c: YI SYLLABLE XYX*/
+                                           RTUNI_ALPHA, /* U+00a46d: YI SYLLABLE XY*/
+                                           RTUNI_ALPHA, /* U+00a46e: YI SYLLABLE XYP*/
+                                           RTUNI_ALPHA, /* U+00a46f: YI SYLLABLE XYRX*/
+                                           RTUNI_ALPHA, /* U+00a470: YI SYLLABLE XYR*/
+                                           RTUNI_ALPHA, /* U+00a471: YI SYLLABLE YIT*/
+                                           RTUNI_ALPHA, /* U+00a472: YI SYLLABLE YIX*/
+                                           RTUNI_ALPHA, /* U+00a473: YI SYLLABLE YI*/
+                                           RTUNI_ALPHA, /* U+00a474: YI SYLLABLE YIP*/
+                                           RTUNI_ALPHA, /* U+00a475: YI SYLLABLE YIET*/
+                                           RTUNI_ALPHA, /* U+00a476: YI SYLLABLE YIEX*/
+                                           RTUNI_ALPHA, /* U+00a477: YI SYLLABLE YIE*/
+                                           RTUNI_ALPHA, /* U+00a478: YI SYLLABLE YIEP*/
+                                           RTUNI_ALPHA, /* U+00a479: YI SYLLABLE YUOT*/
+                                           RTUNI_ALPHA, /* U+00a47a: YI SYLLABLE YUOX*/
+                                           RTUNI_ALPHA, /* U+00a47b: YI SYLLABLE YUO*/
+                                           RTUNI_ALPHA, /* U+00a47c: YI SYLLABLE YUOP*/
+                                           RTUNI_ALPHA, /* U+00a47d: YI SYLLABLE YOT*/
+                                           RTUNI_ALPHA, /* U+00a47e: YI SYLLABLE YOX*/
+                                           RTUNI_ALPHA, /* U+00a47f: YI SYLLABLE YO*/
+                                           RTUNI_ALPHA, /* U+00a480: YI SYLLABLE YOP*/
+                                           RTUNI_ALPHA, /* U+00a481: YI SYLLABLE YUT*/
+                                           RTUNI_ALPHA, /* U+00a482: YI SYLLABLE YUX*/
+                                           RTUNI_ALPHA, /* U+00a483: YI SYLLABLE YU*/
+                                           RTUNI_ALPHA, /* U+00a484: YI SYLLABLE YUP*/
+                                           RTUNI_ALPHA, /* U+00a485: YI SYLLABLE YURX*/
+                                           RTUNI_ALPHA, /* U+00a486: YI SYLLABLE YUR*/
+                                           RTUNI_ALPHA, /* U+00a487: YI SYLLABLE YYT*/
+                                           RTUNI_ALPHA, /* U+00a488: YI SYLLABLE YYX*/
+                                           RTUNI_ALPHA, /* U+00a489: YI SYLLABLE YY*/
+                                           RTUNI_ALPHA, /* U+00a48a: YI SYLLABLE YYP*/
+                                           RTUNI_ALPHA, /* U+00a48b: YI SYLLABLE YYRX*/
+                                           RTUNI_ALPHA, /* U+00a48c: YI SYLLABLE YYR*/
+                                                     0, /* U+00a48d: */
+                                                     0, /* U+00a48e: */
+                                                     0, /* U+00a48f: */
+                                                     0, /* U+00a490: YI RADICAL QOT*/
+                                                     0, /* U+00a491: YI RADICAL LI*/
+                                                     0, /* U+00a492: YI RADICAL KIT*/
+                                                     0, /* U+00a493: YI RADICAL NYIP*/
+                                                     0, /* U+00a494: YI RADICAL CYP*/
+                                                     0, /* U+00a495: YI RADICAL SSI*/
+                                                     0, /* U+00a496: YI RADICAL GGOP*/
+                                                     0, /* U+00a497: YI RADICAL GEP*/
+                                                     0, /* U+00a498: YI RADICAL MI*/
+                                                     0, /* U+00a499: YI RADICAL HXIT*/
+                                                     0, /* U+00a49a: YI RADICAL LYR*/
+                                                     0, /* U+00a49b: YI RADICAL BBUT*/
+                                                     0, /* U+00a49c: YI RADICAL MOP*/
+                                                     0, /* U+00a49d: YI RADICAL YO*/
+                                                     0, /* U+00a49e: YI RADICAL PUT*/
+                                                     0, /* U+00a49f: YI RADICAL HXUO*/
+                                                     0, /* U+00a4a0: YI RADICAL TAT*/
+                                                     0, /* U+00a4a1: YI RADICAL GA*/
+                                                     0, /* U+00a4a2: YI RADICAL ZUP*/
+                                                     0, /* U+00a4a3: YI RADICAL CYT*/
+                                                     0, /* U+00a4a4: YI RADICAL DDUR*/
+                                                     0, /* U+00a4a5: YI RADICAL BUR*/
+                                                     0, /* U+00a4a6: YI RADICAL GGUO*/
+                                                     0, /* U+00a4a7: YI RADICAL NYOP*/
+                                                     0, /* U+00a4a8: YI RADICAL TU*/
+                                                     0, /* U+00a4a9: YI RADICAL OP*/
+                                                     0, /* U+00a4aa: YI RADICAL JJUT*/
+                                                     0, /* U+00a4ab: YI RADICAL ZOT*/
+                                                     0, /* U+00a4ac: YI RADICAL PYT*/
+                                                     0, /* U+00a4ad: YI RADICAL HMO*/
+                                                     0, /* U+00a4ae: YI RADICAL YIT*/
+                                                     0, /* U+00a4af: YI RADICAL VUR*/
+                                                     0, /* U+00a4b0: YI RADICAL SHY*/
+                                                     0, /* U+00a4b1: YI RADICAL VEP*/
+                                                     0, /* U+00a4b2: YI RADICAL ZA*/
+                                                     0, /* U+00a4b3: YI RADICAL JO*/
+                                                     0, /* U+00a4b4: YI RADICAL NZUP*/
+                                                     0, /* U+00a4b5: YI RADICAL JJY*/
+                                                     0, /* U+00a4b6: YI RADICAL GOT*/
+                                                     0, /* U+00a4b7: YI RADICAL JJIE*/
+                                                     0, /* U+00a4b8: YI RADICAL WO*/
+                                                     0, /* U+00a4b9: YI RADICAL DU*/
+                                                     0, /* U+00a4ba: YI RADICAL SHUR*/
+                                                     0, /* U+00a4bb: YI RADICAL LIE*/
+                                                     0, /* U+00a4bc: YI RADICAL CY*/
+                                                     0, /* U+00a4bd: YI RADICAL CUOP*/
+                                                     0, /* U+00a4be: YI RADICAL CIP*/
+                                                     0, /* U+00a4bf: YI RADICAL HXOP*/
+                                                     0, /* U+00a4c0: YI RADICAL SHAT*/
+                                                     0, /* U+00a4c1: YI RADICAL ZUR*/
+                                                     0, /* U+00a4c2: YI RADICAL SHOP*/
+                                                     0, /* U+00a4c3: YI RADICAL CHE*/
+                                                     0, /* U+00a4c4: YI RADICAL ZZIET*/
+                                                     0, /* U+00a4c5: YI RADICAL NBIE*/
+                                                     0, /* U+00a4c6: YI RADICAL KE*/
+                                                     0, /* U+00a4c7: */
+                                                     0, /* U+00a4c8: */
+                                                     0, /* U+00a4c9: */
+                                                     0, /* U+00a4ca: */
+                                                     0, /* U+00a4cb: */
+                                                     0, /* U+00a4cc: */
+                                                     0, /* U+00a4cd: */
+                                                     0, /* U+00a4ce: */
+                                                     0, /* U+00a4cf: */
+                                           RTUNI_ALPHA, /* U+00a4d0: LISU LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a4d1: LISU LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a4d2: LISU LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00a4d3: LISU LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a4d4: LISU LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a4d5: LISU LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00a4d6: LISU LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a4d7: LISU LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a4d8: LISU LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00a4d9: LISU LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00a4da: LISU LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a4db: LISU LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00a4dc: LISU LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+00a4dd: LISU LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+00a4de: LISU LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+00a4df: LISU LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a4e0: LISU LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a4e1: LISU LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a4e2: LISU LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a4e3: LISU LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+00a4e4: LISU LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+00a4e5: LISU LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a4e6: LISU LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00a4e7: LISU LETTER XA*/
+                                           RTUNI_ALPHA, /* U+00a4e8: LISU LETTER HHA*/
+                                           RTUNI_ALPHA, /* U+00a4e9: LISU LETTER FA*/
+                                           RTUNI_ALPHA, /* U+00a4ea: LISU LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a4eb: LISU LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00a4ec: LISU LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a4ed: LISU LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+00a4ee: LISU LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a4ef: LISU LETTER AE*/
+                                           RTUNI_ALPHA, /* U+00a4f0: LISU LETTER E*/
+                                           RTUNI_ALPHA, /* U+00a4f1: LISU LETTER EU*/
+                                           RTUNI_ALPHA, /* U+00a4f2: LISU LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a4f3: LISU LETTER O*/
+                                           RTUNI_ALPHA, /* U+00a4f4: LISU LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a4f5: LISU LETTER UE*/
+                                           RTUNI_ALPHA, /* U+00a4f6: LISU LETTER UH*/
+                                           RTUNI_ALPHA, /* U+00a4f7: LISU LETTER OE*/
+                                           RTUNI_ALPHA, /* U+00a4f8: LISU LETTER TONE MYA TI*/
+                                           RTUNI_ALPHA, /* U+00a4f9: LISU LETTER TONE NA PO*/
+                                           RTUNI_ALPHA, /* U+00a4fa: LISU LETTER TONE MYA CYA*/
+                                           RTUNI_ALPHA, /* U+00a4fb: LISU LETTER TONE MYA BO*/
+                                           RTUNI_ALPHA, /* U+00a4fc: LISU LETTER TONE MYA NA*/
+                                           RTUNI_ALPHA, /* U+00a4fd: LISU LETTER TONE MYA JEU*/
+                                                     0, /* U+00a4fe: LISU PUNCTUATION COMMA*/
+                                                     0, /* U+00a4ff: LISU PUNCTUATION FULL STOP*/
+                                           RTUNI_ALPHA, /* U+00a500: VAI SYLLABLE EE*/
+                                           RTUNI_ALPHA, /* U+00a501: VAI SYLLABLE EEN*/
+                                           RTUNI_ALPHA, /* U+00a502: VAI SYLLABLE HEE*/
+                                           RTUNI_ALPHA, /* U+00a503: VAI SYLLABLE WEE*/
+                                           RTUNI_ALPHA, /* U+00a504: VAI SYLLABLE WEEN*/
+                                           RTUNI_ALPHA, /* U+00a505: VAI SYLLABLE PEE*/
+                                           RTUNI_ALPHA, /* U+00a506: VAI SYLLABLE BHEE*/
+                                           RTUNI_ALPHA, /* U+00a507: VAI SYLLABLE BEE*/
+                                           RTUNI_ALPHA, /* U+00a508: VAI SYLLABLE MBEE*/
+                                           RTUNI_ALPHA, /* U+00a509: VAI SYLLABLE KPEE*/
+                                           RTUNI_ALPHA, /* U+00a50a: VAI SYLLABLE MGBEE*/
+                                           RTUNI_ALPHA, /* U+00a50b: VAI SYLLABLE GBEE*/
+                                           RTUNI_ALPHA, /* U+00a50c: VAI SYLLABLE FEE*/
+                                           RTUNI_ALPHA, /* U+00a50d: VAI SYLLABLE VEE*/
+                                           RTUNI_ALPHA, /* U+00a50e: VAI SYLLABLE TEE*/
+                                           RTUNI_ALPHA, /* U+00a50f: VAI SYLLABLE THEE*/
+                                           RTUNI_ALPHA, /* U+00a510: VAI SYLLABLE DHEE*/
+                                           RTUNI_ALPHA, /* U+00a511: VAI SYLLABLE DHHEE*/
+                                           RTUNI_ALPHA, /* U+00a512: VAI SYLLABLE LEE*/
+                                           RTUNI_ALPHA, /* U+00a513: VAI SYLLABLE REE*/
+                                           RTUNI_ALPHA, /* U+00a514: VAI SYLLABLE DEE*/
+                                           RTUNI_ALPHA, /* U+00a515: VAI SYLLABLE NDEE*/
+                                           RTUNI_ALPHA, /* U+00a516: VAI SYLLABLE SEE*/
+                                           RTUNI_ALPHA, /* U+00a517: VAI SYLLABLE SHEE*/
+                                           RTUNI_ALPHA, /* U+00a518: VAI SYLLABLE ZEE*/
+                                           RTUNI_ALPHA, /* U+00a519: VAI SYLLABLE ZHEE*/
+                                           RTUNI_ALPHA, /* U+00a51a: VAI SYLLABLE CEE*/
+                                           RTUNI_ALPHA, /* U+00a51b: VAI SYLLABLE JEE*/
+                                           RTUNI_ALPHA, /* U+00a51c: VAI SYLLABLE NJEE*/
+                                           RTUNI_ALPHA, /* U+00a51d: VAI SYLLABLE YEE*/
+                                           RTUNI_ALPHA, /* U+00a51e: VAI SYLLABLE KEE*/
+                                           RTUNI_ALPHA, /* U+00a51f: VAI SYLLABLE NGGEE*/
+                                           RTUNI_ALPHA, /* U+00a520: VAI SYLLABLE GEE*/
+                                           RTUNI_ALPHA, /* U+00a521: VAI SYLLABLE MEE*/
+                                           RTUNI_ALPHA, /* U+00a522: VAI SYLLABLE NEE*/
+                                           RTUNI_ALPHA, /* U+00a523: VAI SYLLABLE NYEE*/
+                                           RTUNI_ALPHA, /* U+00a524: VAI SYLLABLE I*/
+                                           RTUNI_ALPHA, /* U+00a525: VAI SYLLABLE IN*/
+                                           RTUNI_ALPHA, /* U+00a526: VAI SYLLABLE HI*/
+                                           RTUNI_ALPHA, /* U+00a527: VAI SYLLABLE HIN*/
+                                           RTUNI_ALPHA, /* U+00a528: VAI SYLLABLE WI*/
+                                           RTUNI_ALPHA, /* U+00a529: VAI SYLLABLE WIN*/
+                                           RTUNI_ALPHA, /* U+00a52a: VAI SYLLABLE PI*/
+                                           RTUNI_ALPHA, /* U+00a52b: VAI SYLLABLE BHI*/
+                                           RTUNI_ALPHA, /* U+00a52c: VAI SYLLABLE BI*/
+                                           RTUNI_ALPHA, /* U+00a52d: VAI SYLLABLE MBI*/
+                                           RTUNI_ALPHA, /* U+00a52e: VAI SYLLABLE KPI*/
+                                           RTUNI_ALPHA, /* U+00a52f: VAI SYLLABLE MGBI*/
+                                           RTUNI_ALPHA, /* U+00a530: VAI SYLLABLE GBI*/
+                                           RTUNI_ALPHA, /* U+00a531: VAI SYLLABLE FI*/
+                                           RTUNI_ALPHA, /* U+00a532: VAI SYLLABLE VI*/
+                                           RTUNI_ALPHA, /* U+00a533: VAI SYLLABLE TI*/
+                                           RTUNI_ALPHA, /* U+00a534: VAI SYLLABLE THI*/
+                                           RTUNI_ALPHA, /* U+00a535: VAI SYLLABLE DHI*/
+                                           RTUNI_ALPHA, /* U+00a536: VAI SYLLABLE DHHI*/
+                                           RTUNI_ALPHA, /* U+00a537: VAI SYLLABLE LI*/
+                                           RTUNI_ALPHA, /* U+00a538: VAI SYLLABLE RI*/
+                                           RTUNI_ALPHA, /* U+00a539: VAI SYLLABLE DI*/
+                                           RTUNI_ALPHA, /* U+00a53a: VAI SYLLABLE NDI*/
+                                           RTUNI_ALPHA, /* U+00a53b: VAI SYLLABLE SI*/
+                                           RTUNI_ALPHA, /* U+00a53c: VAI SYLLABLE SHI*/
+                                           RTUNI_ALPHA, /* U+00a53d: VAI SYLLABLE ZI*/
+                                           RTUNI_ALPHA, /* U+00a53e: VAI SYLLABLE ZHI*/
+                                           RTUNI_ALPHA, /* U+00a53f: VAI SYLLABLE CI*/
+                                           RTUNI_ALPHA, /* U+00a540: VAI SYLLABLE JI*/
+                                           RTUNI_ALPHA, /* U+00a541: VAI SYLLABLE NJI*/
+                                           RTUNI_ALPHA, /* U+00a542: VAI SYLLABLE YI*/
+                                           RTUNI_ALPHA, /* U+00a543: VAI SYLLABLE KI*/
+                                           RTUNI_ALPHA, /* U+00a544: VAI SYLLABLE NGGI*/
+                                           RTUNI_ALPHA, /* U+00a545: VAI SYLLABLE GI*/
+                                           RTUNI_ALPHA, /* U+00a546: VAI SYLLABLE MI*/
+                                           RTUNI_ALPHA, /* U+00a547: VAI SYLLABLE NI*/
+                                           RTUNI_ALPHA, /* U+00a548: VAI SYLLABLE NYI*/
+                                           RTUNI_ALPHA, /* U+00a549: VAI SYLLABLE A*/
+                                           RTUNI_ALPHA, /* U+00a54a: VAI SYLLABLE AN*/
+                                           RTUNI_ALPHA, /* U+00a54b: VAI SYLLABLE NGAN*/
+                                           RTUNI_ALPHA, /* U+00a54c: VAI SYLLABLE HA*/
+                                           RTUNI_ALPHA, /* U+00a54d: VAI SYLLABLE HAN*/
+                                           RTUNI_ALPHA, /* U+00a54e: VAI SYLLABLE WA*/
+                                           RTUNI_ALPHA, /* U+00a54f: VAI SYLLABLE WAN*/
+                                           RTUNI_ALPHA, /* U+00a550: VAI SYLLABLE PA*/
+                                           RTUNI_ALPHA, /* U+00a551: VAI SYLLABLE BHA*/
+                                           RTUNI_ALPHA, /* U+00a552: VAI SYLLABLE BA*/
+                                           RTUNI_ALPHA, /* U+00a553: VAI SYLLABLE MBA*/
+                                           RTUNI_ALPHA, /* U+00a554: VAI SYLLABLE KPA*/
+                                           RTUNI_ALPHA, /* U+00a555: VAI SYLLABLE KPAN*/
+                                           RTUNI_ALPHA, /* U+00a556: VAI SYLLABLE MGBA*/
+                                           RTUNI_ALPHA, /* U+00a557: VAI SYLLABLE GBA*/
+                                           RTUNI_ALPHA, /* U+00a558: VAI SYLLABLE FA*/
+                                           RTUNI_ALPHA, /* U+00a559: VAI SYLLABLE VA*/
+                                           RTUNI_ALPHA, /* U+00a55a: VAI SYLLABLE TA*/
+                                           RTUNI_ALPHA, /* U+00a55b: VAI SYLLABLE THA*/
+                                           RTUNI_ALPHA, /* U+00a55c: VAI SYLLABLE DHA*/
+                                           RTUNI_ALPHA, /* U+00a55d: VAI SYLLABLE DHHA*/
+                                           RTUNI_ALPHA, /* U+00a55e: VAI SYLLABLE LA*/
+                                           RTUNI_ALPHA, /* U+00a55f: VAI SYLLABLE RA*/
+                                           RTUNI_ALPHA, /* U+00a560: VAI SYLLABLE DA*/
+                                           RTUNI_ALPHA, /* U+00a561: VAI SYLLABLE NDA*/
+                                           RTUNI_ALPHA, /* U+00a562: VAI SYLLABLE SA*/
+                                           RTUNI_ALPHA, /* U+00a563: VAI SYLLABLE SHA*/
+                                           RTUNI_ALPHA, /* U+00a564: VAI SYLLABLE ZA*/
+                                           RTUNI_ALPHA, /* U+00a565: VAI SYLLABLE ZHA*/
+                                           RTUNI_ALPHA, /* U+00a566: VAI SYLLABLE CA*/
+                                           RTUNI_ALPHA, /* U+00a567: VAI SYLLABLE JA*/
+                                           RTUNI_ALPHA, /* U+00a568: VAI SYLLABLE NJA*/
+                                           RTUNI_ALPHA, /* U+00a569: VAI SYLLABLE YA*/
+                                           RTUNI_ALPHA, /* U+00a56a: VAI SYLLABLE KA*/
+                                           RTUNI_ALPHA, /* U+00a56b: VAI SYLLABLE KAN*/
+                                           RTUNI_ALPHA, /* U+00a56c: VAI SYLLABLE NGGA*/
+                                           RTUNI_ALPHA, /* U+00a56d: VAI SYLLABLE GA*/
+                                           RTUNI_ALPHA, /* U+00a56e: VAI SYLLABLE MA*/
+                                           RTUNI_ALPHA, /* U+00a56f: VAI SYLLABLE NA*/
+                                           RTUNI_ALPHA, /* U+00a570: VAI SYLLABLE NYA*/
+                                           RTUNI_ALPHA, /* U+00a571: VAI SYLLABLE OO*/
+                                           RTUNI_ALPHA, /* U+00a572: VAI SYLLABLE OON*/
+                                           RTUNI_ALPHA, /* U+00a573: VAI SYLLABLE HOO*/
+                                           RTUNI_ALPHA, /* U+00a574: VAI SYLLABLE WOO*/
+                                           RTUNI_ALPHA, /* U+00a575: VAI SYLLABLE WOON*/
+                                           RTUNI_ALPHA, /* U+00a576: VAI SYLLABLE POO*/
+                                           RTUNI_ALPHA, /* U+00a577: VAI SYLLABLE BHOO*/
+                                           RTUNI_ALPHA, /* U+00a578: VAI SYLLABLE BOO*/
+                                           RTUNI_ALPHA, /* U+00a579: VAI SYLLABLE MBOO*/
+                                           RTUNI_ALPHA, /* U+00a57a: VAI SYLLABLE KPOO*/
+                                           RTUNI_ALPHA, /* U+00a57b: VAI SYLLABLE MGBOO*/
+                                           RTUNI_ALPHA, /* U+00a57c: VAI SYLLABLE GBOO*/
+                                           RTUNI_ALPHA, /* U+00a57d: VAI SYLLABLE FOO*/
+                                           RTUNI_ALPHA, /* U+00a57e: VAI SYLLABLE VOO*/
+                                           RTUNI_ALPHA, /* U+00a57f: VAI SYLLABLE TOO*/
+                                           RTUNI_ALPHA, /* U+00a580: VAI SYLLABLE THOO*/
+                                           RTUNI_ALPHA, /* U+00a581: VAI SYLLABLE DHOO*/
+                                           RTUNI_ALPHA, /* U+00a582: VAI SYLLABLE DHHOO*/
+                                           RTUNI_ALPHA, /* U+00a583: VAI SYLLABLE LOO*/
+                                           RTUNI_ALPHA, /* U+00a584: VAI SYLLABLE ROO*/
+                                           RTUNI_ALPHA, /* U+00a585: VAI SYLLABLE DOO*/
+                                           RTUNI_ALPHA, /* U+00a586: VAI SYLLABLE NDOO*/
+                                           RTUNI_ALPHA, /* U+00a587: VAI SYLLABLE SOO*/
+                                           RTUNI_ALPHA, /* U+00a588: VAI SYLLABLE SHOO*/
+                                           RTUNI_ALPHA, /* U+00a589: VAI SYLLABLE ZOO*/
+                                           RTUNI_ALPHA, /* U+00a58a: VAI SYLLABLE ZHOO*/
+                                           RTUNI_ALPHA, /* U+00a58b: VAI SYLLABLE COO*/
+                                           RTUNI_ALPHA, /* U+00a58c: VAI SYLLABLE JOO*/
+                                           RTUNI_ALPHA, /* U+00a58d: VAI SYLLABLE NJOO*/
+                                           RTUNI_ALPHA, /* U+00a58e: VAI SYLLABLE YOO*/
+                                           RTUNI_ALPHA, /* U+00a58f: VAI SYLLABLE KOO*/
+                                           RTUNI_ALPHA, /* U+00a590: VAI SYLLABLE NGGOO*/
+                                           RTUNI_ALPHA, /* U+00a591: VAI SYLLABLE GOO*/
+                                           RTUNI_ALPHA, /* U+00a592: VAI SYLLABLE MOO*/
+                                           RTUNI_ALPHA, /* U+00a593: VAI SYLLABLE NOO*/
+                                           RTUNI_ALPHA, /* U+00a594: VAI SYLLABLE NYOO*/
+                                           RTUNI_ALPHA, /* U+00a595: VAI SYLLABLE U*/
+                                           RTUNI_ALPHA, /* U+00a596: VAI SYLLABLE UN*/
+                                           RTUNI_ALPHA, /* U+00a597: VAI SYLLABLE HU*/
+                                           RTUNI_ALPHA, /* U+00a598: VAI SYLLABLE HUN*/
+                                           RTUNI_ALPHA, /* U+00a599: VAI SYLLABLE WU*/
+                                           RTUNI_ALPHA, /* U+00a59a: VAI SYLLABLE WUN*/
+                                           RTUNI_ALPHA, /* U+00a59b: VAI SYLLABLE PU*/
+                                           RTUNI_ALPHA, /* U+00a59c: VAI SYLLABLE BHU*/
+                                           RTUNI_ALPHA, /* U+00a59d: VAI SYLLABLE BU*/
+                                           RTUNI_ALPHA, /* U+00a59e: VAI SYLLABLE MBU*/
+                                           RTUNI_ALPHA, /* U+00a59f: VAI SYLLABLE KPU*/
+                                           RTUNI_ALPHA, /* U+00a5a0: VAI SYLLABLE MGBU*/
+                                           RTUNI_ALPHA, /* U+00a5a1: VAI SYLLABLE GBU*/
+                                           RTUNI_ALPHA, /* U+00a5a2: VAI SYLLABLE FU*/
+                                           RTUNI_ALPHA, /* U+00a5a3: VAI SYLLABLE VU*/
+                                           RTUNI_ALPHA, /* U+00a5a4: VAI SYLLABLE TU*/
+                                           RTUNI_ALPHA, /* U+00a5a5: VAI SYLLABLE THU*/
+                                           RTUNI_ALPHA, /* U+00a5a6: VAI SYLLABLE DHU*/
+                                           RTUNI_ALPHA, /* U+00a5a7: VAI SYLLABLE DHHU*/
+                                           RTUNI_ALPHA, /* U+00a5a8: VAI SYLLABLE LU*/
+                                           RTUNI_ALPHA, /* U+00a5a9: VAI SYLLABLE RU*/
+                                           RTUNI_ALPHA, /* U+00a5aa: VAI SYLLABLE DU*/
+                                           RTUNI_ALPHA, /* U+00a5ab: VAI SYLLABLE NDU*/
+                                           RTUNI_ALPHA, /* U+00a5ac: VAI SYLLABLE SU*/
+                                           RTUNI_ALPHA, /* U+00a5ad: VAI SYLLABLE SHU*/
+                                           RTUNI_ALPHA, /* U+00a5ae: VAI SYLLABLE ZU*/
+                                           RTUNI_ALPHA, /* U+00a5af: VAI SYLLABLE ZHU*/
+                                           RTUNI_ALPHA, /* U+00a5b0: VAI SYLLABLE CU*/
+                                           RTUNI_ALPHA, /* U+00a5b1: VAI SYLLABLE JU*/
+                                           RTUNI_ALPHA, /* U+00a5b2: VAI SYLLABLE NJU*/
+                                           RTUNI_ALPHA, /* U+00a5b3: VAI SYLLABLE YU*/
+                                           RTUNI_ALPHA, /* U+00a5b4: VAI SYLLABLE KU*/
+                                           RTUNI_ALPHA, /* U+00a5b5: VAI SYLLABLE NGGU*/
+                                           RTUNI_ALPHA, /* U+00a5b6: VAI SYLLABLE GU*/
+                                           RTUNI_ALPHA, /* U+00a5b7: VAI SYLLABLE MU*/
+                                           RTUNI_ALPHA, /* U+00a5b8: VAI SYLLABLE NU*/
+                                           RTUNI_ALPHA, /* U+00a5b9: VAI SYLLABLE NYU*/
+                                           RTUNI_ALPHA, /* U+00a5ba: VAI SYLLABLE O*/
+                                           RTUNI_ALPHA, /* U+00a5bb: VAI SYLLABLE ON*/
+                                           RTUNI_ALPHA, /* U+00a5bc: VAI SYLLABLE NGON*/
+                                           RTUNI_ALPHA, /* U+00a5bd: VAI SYLLABLE HO*/
+                                           RTUNI_ALPHA, /* U+00a5be: VAI SYLLABLE HON*/
+                                           RTUNI_ALPHA, /* U+00a5bf: VAI SYLLABLE WO*/
+                                           RTUNI_ALPHA, /* U+00a5c0: VAI SYLLABLE WON*/
+                                           RTUNI_ALPHA, /* U+00a5c1: VAI SYLLABLE PO*/
+                                           RTUNI_ALPHA, /* U+00a5c2: VAI SYLLABLE BHO*/
+                                           RTUNI_ALPHA, /* U+00a5c3: VAI SYLLABLE BO*/
+                                           RTUNI_ALPHA, /* U+00a5c4: VAI SYLLABLE MBO*/
+                                           RTUNI_ALPHA, /* U+00a5c5: VAI SYLLABLE KPO*/
+                                           RTUNI_ALPHA, /* U+00a5c6: VAI SYLLABLE MGBO*/
+                                           RTUNI_ALPHA, /* U+00a5c7: VAI SYLLABLE GBO*/
+                                           RTUNI_ALPHA, /* U+00a5c8: VAI SYLLABLE GBON*/
+                                           RTUNI_ALPHA, /* U+00a5c9: VAI SYLLABLE FO*/
+                                           RTUNI_ALPHA, /* U+00a5ca: VAI SYLLABLE VO*/
+                                           RTUNI_ALPHA, /* U+00a5cb: VAI SYLLABLE TO*/
+                                           RTUNI_ALPHA, /* U+00a5cc: VAI SYLLABLE THO*/
+                                           RTUNI_ALPHA, /* U+00a5cd: VAI SYLLABLE DHO*/
+                                           RTUNI_ALPHA, /* U+00a5ce: VAI SYLLABLE DHHO*/
+                                           RTUNI_ALPHA, /* U+00a5cf: VAI SYLLABLE LO*/
+                                           RTUNI_ALPHA, /* U+00a5d0: VAI SYLLABLE RO*/
+                                           RTUNI_ALPHA, /* U+00a5d1: VAI SYLLABLE DO*/
+                                           RTUNI_ALPHA, /* U+00a5d2: VAI SYLLABLE NDO*/
+                                           RTUNI_ALPHA, /* U+00a5d3: VAI SYLLABLE SO*/
+                                           RTUNI_ALPHA, /* U+00a5d4: VAI SYLLABLE SHO*/
+                                           RTUNI_ALPHA, /* U+00a5d5: VAI SYLLABLE ZO*/
+                                           RTUNI_ALPHA, /* U+00a5d6: VAI SYLLABLE ZHO*/
+                                           RTUNI_ALPHA, /* U+00a5d7: VAI SYLLABLE CO*/
+                                           RTUNI_ALPHA, /* U+00a5d8: VAI SYLLABLE JO*/
+                                           RTUNI_ALPHA, /* U+00a5d9: VAI SYLLABLE NJO*/
+                                           RTUNI_ALPHA, /* U+00a5da: VAI SYLLABLE YO*/
+                                           RTUNI_ALPHA, /* U+00a5db: VAI SYLLABLE KO*/
+                                           RTUNI_ALPHA, /* U+00a5dc: VAI SYLLABLE NGGO*/
+                                           RTUNI_ALPHA, /* U+00a5dd: VAI SYLLABLE GO*/
+                                           RTUNI_ALPHA, /* U+00a5de: VAI SYLLABLE MO*/
+                                           RTUNI_ALPHA, /* U+00a5df: VAI SYLLABLE NO*/
+                                           RTUNI_ALPHA, /* U+00a5e0: VAI SYLLABLE NYO*/
+                                           RTUNI_ALPHA, /* U+00a5e1: VAI SYLLABLE E*/
+                                           RTUNI_ALPHA, /* U+00a5e2: VAI SYLLABLE EN*/
+                                           RTUNI_ALPHA, /* U+00a5e3: VAI SYLLABLE NGEN*/
+                                           RTUNI_ALPHA, /* U+00a5e4: VAI SYLLABLE HE*/
+                                           RTUNI_ALPHA, /* U+00a5e5: VAI SYLLABLE HEN*/
+                                           RTUNI_ALPHA, /* U+00a5e6: VAI SYLLABLE WE*/
+                                           RTUNI_ALPHA, /* U+00a5e7: VAI SYLLABLE WEN*/
+                                           RTUNI_ALPHA, /* U+00a5e8: VAI SYLLABLE PE*/
+                                           RTUNI_ALPHA, /* U+00a5e9: VAI SYLLABLE BHE*/
+                                           RTUNI_ALPHA, /* U+00a5ea: VAI SYLLABLE BE*/
+                                           RTUNI_ALPHA, /* U+00a5eb: VAI SYLLABLE MBE*/
+                                           RTUNI_ALPHA, /* U+00a5ec: VAI SYLLABLE KPE*/
+                                           RTUNI_ALPHA, /* U+00a5ed: VAI SYLLABLE KPEN*/
+                                           RTUNI_ALPHA, /* U+00a5ee: VAI SYLLABLE MGBE*/
+                                           RTUNI_ALPHA, /* U+00a5ef: VAI SYLLABLE GBE*/
+                                           RTUNI_ALPHA, /* U+00a5f0: VAI SYLLABLE GBEN*/
+                                           RTUNI_ALPHA, /* U+00a5f1: VAI SYLLABLE FE*/
+                                           RTUNI_ALPHA, /* U+00a5f2: VAI SYLLABLE VE*/
+                                           RTUNI_ALPHA, /* U+00a5f3: VAI SYLLABLE TE*/
+                                           RTUNI_ALPHA, /* U+00a5f4: VAI SYLLABLE THE*/
+                                           RTUNI_ALPHA, /* U+00a5f5: VAI SYLLABLE DHE*/
+                                           RTUNI_ALPHA, /* U+00a5f6: VAI SYLLABLE DHHE*/
+                                           RTUNI_ALPHA, /* U+00a5f7: VAI SYLLABLE LE*/
+                                           RTUNI_ALPHA, /* U+00a5f8: VAI SYLLABLE RE*/
+                                           RTUNI_ALPHA, /* U+00a5f9: VAI SYLLABLE DE*/
+                                           RTUNI_ALPHA, /* U+00a5fa: VAI SYLLABLE NDE*/
+                                           RTUNI_ALPHA, /* U+00a5fb: VAI SYLLABLE SE*/
+                                           RTUNI_ALPHA, /* U+00a5fc: VAI SYLLABLE SHE*/
+                                           RTUNI_ALPHA, /* U+00a5fd: VAI SYLLABLE ZE*/
+                                           RTUNI_ALPHA, /* U+00a5fe: VAI SYLLABLE ZHE*/
+                                           RTUNI_ALPHA, /* U+00a5ff: VAI SYLLABLE CE*/
+                                           RTUNI_ALPHA, /* U+00a600: VAI SYLLABLE JE*/
+                                           RTUNI_ALPHA, /* U+00a601: VAI SYLLABLE NJE*/
+                                           RTUNI_ALPHA, /* U+00a602: VAI SYLLABLE YE*/
+                                           RTUNI_ALPHA, /* U+00a603: VAI SYLLABLE KE*/
+                                           RTUNI_ALPHA, /* U+00a604: VAI SYLLABLE NGGE*/
+                                           RTUNI_ALPHA, /* U+00a605: VAI SYLLABLE NGGEN*/
+                                           RTUNI_ALPHA, /* U+00a606: VAI SYLLABLE GE*/
+                                           RTUNI_ALPHA, /* U+00a607: VAI SYLLABLE GEN*/
+                                           RTUNI_ALPHA, /* U+00a608: VAI SYLLABLE ME*/
+                                           RTUNI_ALPHA, /* U+00a609: VAI SYLLABLE NE*/
+                                           RTUNI_ALPHA, /* U+00a60a: VAI SYLLABLE NYE*/
+                                           RTUNI_ALPHA, /* U+00a60b: VAI SYLLABLE NG*/
+                                           RTUNI_ALPHA, /* U+00a60c: VAI SYLLABLE LENGTHENER*/
+                                                     0, /* U+00a60d: VAI COMMA*/
+                                                     0, /* U+00a60e: VAI FULL STOP*/
+                                                     0, /* U+00a60f: VAI QUESTION MARK*/
+                                           RTUNI_ALPHA, /* U+00a610: VAI SYLLABLE NDOLE FA*/
+                                           RTUNI_ALPHA, /* U+00a611: VAI SYLLABLE NDOLE KA*/
+                                           RTUNI_ALPHA, /* U+00a612: VAI SYLLABLE NDOLE SOO*/
+                                           RTUNI_ALPHA, /* U+00a613: VAI SYMBOL FEENG*/
+                                           RTUNI_ALPHA, /* U+00a614: VAI SYMBOL KEENG*/
+                                           RTUNI_ALPHA, /* U+00a615: VAI SYMBOL TING*/
+                                           RTUNI_ALPHA, /* U+00a616: VAI SYMBOL NII*/
+                                           RTUNI_ALPHA, /* U+00a617: VAI SYMBOL BANG*/
+                                           RTUNI_ALPHA, /* U+00a618: VAI SYMBOL FAA*/
+                                           RTUNI_ALPHA, /* U+00a619: VAI SYMBOL TAA*/
+                                           RTUNI_ALPHA, /* U+00a61a: VAI SYMBOL DANG*/
+                                           RTUNI_ALPHA, /* U+00a61b: VAI SYMBOL DOONG*/
+                                           RTUNI_ALPHA, /* U+00a61c: VAI SYMBOL KUNG*/
+                                           RTUNI_ALPHA, /* U+00a61d: VAI SYMBOL TONG*/
+                                           RTUNI_ALPHA, /* U+00a61e: VAI SYMBOL DO-O*/
+                                           RTUNI_ALPHA, /* U+00a61f: VAI SYMBOL JONG*/
+                                          RTUNI_DDIGIT, /* U+00a620: VAI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00a621: VAI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00a622: VAI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00a623: VAI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00a624: VAI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00a625: VAI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00a626: VAI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00a627: VAI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00a628: VAI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00a629: VAI DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+00a62a: VAI SYLLABLE NDOLE MA*/
+                                           RTUNI_ALPHA, /* U+00a62b: VAI SYLLABLE NDOLE DO*/
+                                                     0, /* U+00a62c: */
+                                                     0, /* U+00a62d: */
+                                                     0, /* U+00a62e: */
+                                                     0, /* U+00a62f: */
+                                                     0, /* U+00a630: */
+                                                     0, /* U+00a631: */
+                                                     0, /* U+00a632: */
+                                                     0, /* U+00a633: */
+                                                     0, /* U+00a634: */
+                                                     0, /* U+00a635: */
+                                                     0, /* U+00a636: */
+                                                     0, /* U+00a637: */
+                                                     0, /* U+00a638: */
+                                                     0, /* U+00a639: */
+                                                     0, /* U+00a63a: */
+                                                     0, /* U+00a63b: */
+                                                     0, /* U+00a63c: */
+                                                     0, /* U+00a63d: */
+                                                     0, /* U+00a63e: */
+                                                     0, /* U+00a63f: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a640: CYRILLIC CAPITAL LETTER ZEMLYA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+                                           RTUNI_ALPHA, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+                                                     0, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+                                                     0, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+                                                     0, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+                                                     0, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+                                                     0, /* U+00a673: SLAVONIC ASTERISK*/
+                                           RTUNI_ALPHA, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+                                           RTUNI_ALPHA, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+                                           RTUNI_ALPHA, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+                                           RTUNI_ALPHA, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+                                           RTUNI_ALPHA, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+                                           RTUNI_ALPHA, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+                                                     0, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+                                                     0, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+                                                     0, /* U+00a67e: CYRILLIC KAVYKA*/
+                                           RTUNI_ALPHA, /* U+00a67f: CYRILLIC PAYEROK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+                                                     0, /* U+00a698: */
+                                                     0, /* U+00a699: */
+                                                     0, /* U+00a69a: */
+                                                     0, /* U+00a69b: */
+                                                     0, /* U+00a69c: */
+                                                     0, /* U+00a69d: */
+                                                     0, /* U+00a69e: */
+                                           RTUNI_ALPHA, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+                                           RTUNI_ALPHA, /* U+00a6a0: BAMUM LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a6a1: BAMUM LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a6a2: BAMUM LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a6a3: BAMUM LETTER KU*/
+                                           RTUNI_ALPHA, /* U+00a6a4: BAMUM LETTER EE*/
+                                           RTUNI_ALPHA, /* U+00a6a5: BAMUM LETTER REE*/
+                                           RTUNI_ALPHA, /* U+00a6a6: BAMUM LETTER TAE*/
+                                           RTUNI_ALPHA, /* U+00a6a7: BAMUM LETTER O*/
+                                           RTUNI_ALPHA, /* U+00a6a8: BAMUM LETTER NYI*/
+                                           RTUNI_ALPHA, /* U+00a6a9: BAMUM LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a6aa: BAMUM LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a6ab: BAMUM LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a6ac: BAMUM LETTER RII*/
+                                           RTUNI_ALPHA, /* U+00a6ad: BAMUM LETTER RIEE*/
+                                           RTUNI_ALPHA, /* U+00a6ae: BAMUM LETTER LEEEE*/
+                                           RTUNI_ALPHA, /* U+00a6af: BAMUM LETTER MEEEE*/
+                                           RTUNI_ALPHA, /* U+00a6b0: BAMUM LETTER TAA*/
+                                           RTUNI_ALPHA, /* U+00a6b1: BAMUM LETTER NDAA*/
+                                           RTUNI_ALPHA, /* U+00a6b2: BAMUM LETTER NJAEM*/
+                                           RTUNI_ALPHA, /* U+00a6b3: BAMUM LETTER M*/
+                                           RTUNI_ALPHA, /* U+00a6b4: BAMUM LETTER SUU*/
+                                           RTUNI_ALPHA, /* U+00a6b5: BAMUM LETTER MU*/
+                                           RTUNI_ALPHA, /* U+00a6b6: BAMUM LETTER SHII*/
+                                           RTUNI_ALPHA, /* U+00a6b7: BAMUM LETTER SI*/
+                                           RTUNI_ALPHA, /* U+00a6b8: BAMUM LETTER SHEUX*/
+                                           RTUNI_ALPHA, /* U+00a6b9: BAMUM LETTER SEUX*/
+                                           RTUNI_ALPHA, /* U+00a6ba: BAMUM LETTER KYEE*/
+                                           RTUNI_ALPHA, /* U+00a6bb: BAMUM LETTER KET*/
+                                           RTUNI_ALPHA, /* U+00a6bc: BAMUM LETTER NUAE*/
+                                           RTUNI_ALPHA, /* U+00a6bd: BAMUM LETTER NU*/
+                                           RTUNI_ALPHA, /* U+00a6be: BAMUM LETTER NJUAE*/
+                                           RTUNI_ALPHA, /* U+00a6bf: BAMUM LETTER YOQ*/
+                                           RTUNI_ALPHA, /* U+00a6c0: BAMUM LETTER SHU*/
+                                           RTUNI_ALPHA, /* U+00a6c1: BAMUM LETTER YUQ*/
+                                           RTUNI_ALPHA, /* U+00a6c2: BAMUM LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a6c3: BAMUM LETTER NSHA*/
+                                           RTUNI_ALPHA, /* U+00a6c4: BAMUM LETTER KEUX*/
+                                           RTUNI_ALPHA, /* U+00a6c5: BAMUM LETTER PEUX*/
+                                           RTUNI_ALPHA, /* U+00a6c6: BAMUM LETTER NJEE*/
+                                           RTUNI_ALPHA, /* U+00a6c7: BAMUM LETTER NTEE*/
+                                           RTUNI_ALPHA, /* U+00a6c8: BAMUM LETTER PUE*/
+                                           RTUNI_ALPHA, /* U+00a6c9: BAMUM LETTER WUE*/
+                                           RTUNI_ALPHA, /* U+00a6ca: BAMUM LETTER PEE*/
+                                           RTUNI_ALPHA, /* U+00a6cb: BAMUM LETTER FEE*/
+                                           RTUNI_ALPHA, /* U+00a6cc: BAMUM LETTER RU*/
+                                           RTUNI_ALPHA, /* U+00a6cd: BAMUM LETTER LU*/
+                                           RTUNI_ALPHA, /* U+00a6ce: BAMUM LETTER MI*/
+                                           RTUNI_ALPHA, /* U+00a6cf: BAMUM LETTER NI*/
+                                           RTUNI_ALPHA, /* U+00a6d0: BAMUM LETTER REUX*/
+                                           RTUNI_ALPHA, /* U+00a6d1: BAMUM LETTER RAE*/
+                                           RTUNI_ALPHA, /* U+00a6d2: BAMUM LETTER KEN*/
+                                           RTUNI_ALPHA, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+                                           RTUNI_ALPHA, /* U+00a6d4: BAMUM LETTER NGGA*/
+                                           RTUNI_ALPHA, /* U+00a6d5: BAMUM LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a6d6: BAMUM LETTER SHO*/
+                                           RTUNI_ALPHA, /* U+00a6d7: BAMUM LETTER PUAE*/
+                                           RTUNI_ALPHA, /* U+00a6d8: BAMUM LETTER FU*/
+                                           RTUNI_ALPHA, /* U+00a6d9: BAMUM LETTER FOM*/
+                                           RTUNI_ALPHA, /* U+00a6da: BAMUM LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a6db: BAMUM LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a6dc: BAMUM LETTER LI*/
+                                           RTUNI_ALPHA, /* U+00a6dd: BAMUM LETTER PI*/
+                                           RTUNI_ALPHA, /* U+00a6de: BAMUM LETTER LOQ*/
+                                           RTUNI_ALPHA, /* U+00a6df: BAMUM LETTER KO*/
+                                           RTUNI_ALPHA, /* U+00a6e0: BAMUM LETTER MBEN*/
+                                           RTUNI_ALPHA, /* U+00a6e1: BAMUM LETTER REN*/
+                                           RTUNI_ALPHA, /* U+00a6e2: BAMUM LETTER MEN*/
+                                           RTUNI_ALPHA, /* U+00a6e3: BAMUM LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a6e4: BAMUM LETTER TI*/
+                                           RTUNI_ALPHA, /* U+00a6e5: BAMUM LETTER KI*/
+                                           RTUNI_ALPHA, /* U+00a6e6: BAMUM LETTER MO*/
+                                           RTUNI_ALPHA, /* U+00a6e7: BAMUM LETTER MBAA*/
+                                           RTUNI_ALPHA, /* U+00a6e8: BAMUM LETTER TET*/
+                                           RTUNI_ALPHA, /* U+00a6e9: BAMUM LETTER KPA*/
+                                           RTUNI_ALPHA, /* U+00a6ea: BAMUM LETTER TEN*/
+                                           RTUNI_ALPHA, /* U+00a6eb: BAMUM LETTER NTUU*/
+                                           RTUNI_ALPHA, /* U+00a6ec: BAMUM LETTER SAMBA*/
+                                           RTUNI_ALPHA, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+                                           RTUNI_ALPHA, /* U+00a6ee: BAMUM LETTER KOVUU*/
+                                           RTUNI_ALPHA, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+                                                     0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+                                                     0, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+                                                     0, /* U+00a6f2: BAMUM NJAEMLI*/
+                                                     0, /* U+00a6f3: BAMUM FULL STOP*/
+                                                     0, /* U+00a6f4: BAMUM COLON*/
+                                                     0, /* U+00a6f5: BAMUM COMMA*/
+                                                     0, /* U+00a6f6: BAMUM SEMICOLON*/
+                                                     0, /* U+00a6f7: BAMUM QUESTION MARK*/
+                                                     0, /* U+00a6f8: */
+                                                     0, /* U+00a6f9: */
+                                                     0, /* U+00a6fa: */
+                                                     0, /* U+00a6fb: */
+                                                     0, /* U+00a6fc: */
+                                                     0, /* U+00a6fd: */
+                                                     0, /* U+00a6fe: */
+                                                     0, /* U+00a6ff: */
+                                                     0, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+                                                     0, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+                                                     0, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+                                                     0, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+                                                     0, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+                                                     0, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+                                                     0, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+                                                     0, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+                                                     0, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+                                                     0, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+                                                     0, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+                                                     0, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+                                                     0, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+                                                     0, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+                                                     0, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+                                           RTUNI_ALPHA, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+                                           RTUNI_ALPHA, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+                                           RTUNI_ALPHA, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+                                           RTUNI_ALPHA, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+                                           RTUNI_ALPHA, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+                                           RTUNI_ALPHA, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+                                           RTUNI_ALPHA, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+                                           RTUNI_ALPHA, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+                                           RTUNI_ALPHA, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+                                                     0, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+                                                     0, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a727: LATIN SMALL LETTER HENG*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a729: LATIN SMALL LETTER TZ*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a732: LATIN CAPITAL LETTER AA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a733: LATIN SMALL LETTER AA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a734: LATIN CAPITAL LETTER AO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a735: LATIN SMALL LETTER AO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a736: LATIN CAPITAL LETTER AU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a737: LATIN SMALL LETTER AU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a738: LATIN CAPITAL LETTER AV*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a739: LATIN SMALL LETTER AV*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73d: LATIN SMALL LETTER AY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a74f: LATIN SMALL LETTER OO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a760: LATIN CAPITAL LETTER VY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a761: LATIN SMALL LETTER VY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a769: LATIN SMALL LETTER VEND*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76b: LATIN SMALL LETTER ET*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76d: LATIN SMALL LETTER IS*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a76f: LATIN SMALL LETTER CON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a770: MODIFIER LETTER US*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a771: LATIN SMALL LETTER DUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a772: LATIN SMALL LETTER LUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a773: LATIN SMALL LETTER MUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a774: LATIN SMALL LETTER NUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a775: LATIN SMALL LETTER RUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a777: LATIN SMALL LETTER TUM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a778: LATIN SMALL LETTER UM*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+                                           RTUNI_ALPHA, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+                                                     0, /* U+00a789: MODIFIER LETTER COLON*/
+                                                     0, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+                                                     0, /* U+00a78f: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+                                                     0, /* U+00a794: */
+                                                     0, /* U+00a795: */
+                                                     0, /* U+00a796: */
+                                                     0, /* U+00a797: */
+                                                     0, /* U+00a798: */
+                                                     0, /* U+00a799: */
+                                                     0, /* U+00a79a: */
+                                                     0, /* U+00a79b: */
+                                                     0, /* U+00a79c: */
+                                                     0, /* U+00a79d: */
+                                                     0, /* U+00a79e: */
+                                                     0, /* U+00a79f: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00a7aa: LATIN CAPITAL LETTER H WITH HOOK*/
+                                                     0, /* U+00a7ab: */
+                                                     0, /* U+00a7ac: */
+                                                     0, /* U+00a7ad: */
+                                                     0, /* U+00a7ae: */
+                                                     0, /* U+00a7af: */
+                                                     0, /* U+00a7b0: */
+                                                     0, /* U+00a7b1: */
+                                                     0, /* U+00a7b2: */
+                                                     0, /* U+00a7b3: */
+                                                     0, /* U+00a7b4: */
+                                                     0, /* U+00a7b5: */
+                                                     0, /* U+00a7b6: */
+                                                     0, /* U+00a7b7: */
+                                                     0, /* U+00a7b8: */
+                                                     0, /* U+00a7b9: */
+                                                     0, /* U+00a7ba: */
+                                                     0, /* U+00a7bb: */
+                                                     0, /* U+00a7bc: */
+                                                     0, /* U+00a7bd: */
+                                                     0, /* U+00a7be: */
+                                                     0, /* U+00a7bf: */
+                                                     0, /* U+00a7c0: */
+                                                     0, /* U+00a7c1: */
+                                                     0, /* U+00a7c2: */
+                                                     0, /* U+00a7c3: */
+                                                     0, /* U+00a7c4: */
+                                                     0, /* U+00a7c5: */
+                                                     0, /* U+00a7c6: */
+                                                     0, /* U+00a7c7: */
+                                                     0, /* U+00a7c8: */
+                                                     0, /* U+00a7c9: */
+                                                     0, /* U+00a7ca: */
+                                                     0, /* U+00a7cb: */
+                                                     0, /* U+00a7cc: */
+                                                     0, /* U+00a7cd: */
+                                                     0, /* U+00a7ce: */
+                                                     0, /* U+00a7cf: */
+                                                     0, /* U+00a7d0: */
+                                                     0, /* U+00a7d1: */
+                                                     0, /* U+00a7d2: */
+                                                     0, /* U+00a7d3: */
+                                                     0, /* U+00a7d4: */
+                                                     0, /* U+00a7d5: */
+                                                     0, /* U+00a7d6: */
+                                                     0, /* U+00a7d7: */
+                                                     0, /* U+00a7d8: */
+                                                     0, /* U+00a7d9: */
+                                                     0, /* U+00a7da: */
+                                                     0, /* U+00a7db: */
+                                                     0, /* U+00a7dc: */
+                                                     0, /* U+00a7dd: */
+                                                     0, /* U+00a7de: */
+                                                     0, /* U+00a7df: */
+                                                     0, /* U+00a7e0: */
+                                                     0, /* U+00a7e1: */
+                                                     0, /* U+00a7e2: */
+                                                     0, /* U+00a7e3: */
+                                                     0, /* U+00a7e4: */
+                                                     0, /* U+00a7e5: */
+                                                     0, /* U+00a7e6: */
+                                                     0, /* U+00a7e7: */
+                                                     0, /* U+00a7e8: */
+                                                     0, /* U+00a7e9: */
+                                                     0, /* U+00a7ea: */
+                                                     0, /* U+00a7eb: */
+                                                     0, /* U+00a7ec: */
+                                                     0, /* U+00a7ed: */
+                                                     0, /* U+00a7ee: */
+                                                     0, /* U+00a7ef: */
+                                                     0, /* U+00a7f0: */
+                                                     0, /* U+00a7f1: */
+                                                     0, /* U+00a7f2: */
+                                                     0, /* U+00a7f3: */
+                                                     0, /* U+00a7f4: */
+                                                     0, /* U+00a7f5: */
+                                                     0, /* U+00a7f6: */
+                                                     0, /* U+00a7f7: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7f8: MODIFIER LETTER CAPITAL H WITH STROKE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7f9: MODIFIER LETTER SMALL LIGATURE OE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00a7fa: LATIN LETTER SMALL CAPITAL TURNED M*/
+                                           RTUNI_ALPHA, /* U+00a7fb: LATIN EPIGRAPHIC LETTER REVERSED F*/
+                                           RTUNI_ALPHA, /* U+00a7fc: LATIN EPIGRAPHIC LETTER REVERSED P*/
+                                           RTUNI_ALPHA, /* U+00a7fd: LATIN EPIGRAPHIC LETTER INVERTED M*/
+                                           RTUNI_ALPHA, /* U+00a7fe: LATIN EPIGRAPHIC LETTER I LONGA*/
+                                           RTUNI_ALPHA, /* U+00a7ff: LATIN EPIGRAPHIC LETTER ARCHAIC M*/
+                                           RTUNI_ALPHA, /* U+00a800: SYLOTI NAGRI LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a801: SYLOTI NAGRI LETTER I*/
+                                                     0, /* U+00a802: SYLOTI NAGRI SIGN DVISVARA*/
+                                           RTUNI_ALPHA, /* U+00a803: SYLOTI NAGRI LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a804: SYLOTI NAGRI LETTER E*/
+                                           RTUNI_ALPHA, /* U+00a805: SYLOTI NAGRI LETTER O*/
+                                                     0, /* U+00a806: SYLOTI NAGRI SIGN HASANTA*/
+                                           RTUNI_ALPHA, /* U+00a807: SYLOTI NAGRI LETTER KO*/
+                                           RTUNI_ALPHA, /* U+00a808: SYLOTI NAGRI LETTER KHO*/
+                                           RTUNI_ALPHA, /* U+00a809: SYLOTI NAGRI LETTER GO*/
+                                           RTUNI_ALPHA, /* U+00a80a: SYLOTI NAGRI LETTER GHO*/
+                                                     0, /* U+00a80b: SYLOTI NAGRI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+00a80c: SYLOTI NAGRI LETTER CO*/
+                                           RTUNI_ALPHA, /* U+00a80d: SYLOTI NAGRI LETTER CHO*/
+                                           RTUNI_ALPHA, /* U+00a80e: SYLOTI NAGRI LETTER JO*/
+                                           RTUNI_ALPHA, /* U+00a80f: SYLOTI NAGRI LETTER JHO*/
+                                           RTUNI_ALPHA, /* U+00a810: SYLOTI NAGRI LETTER TTO*/
+                                           RTUNI_ALPHA, /* U+00a811: SYLOTI NAGRI LETTER TTHO*/
+                                           RTUNI_ALPHA, /* U+00a812: SYLOTI NAGRI LETTER DDO*/
+                                           RTUNI_ALPHA, /* U+00a813: SYLOTI NAGRI LETTER DDHO*/
+                                           RTUNI_ALPHA, /* U+00a814: SYLOTI NAGRI LETTER TO*/
+                                           RTUNI_ALPHA, /* U+00a815: SYLOTI NAGRI LETTER THO*/
+                                           RTUNI_ALPHA, /* U+00a816: SYLOTI NAGRI LETTER DO*/
+                                           RTUNI_ALPHA, /* U+00a817: SYLOTI NAGRI LETTER DHO*/
+                                           RTUNI_ALPHA, /* U+00a818: SYLOTI NAGRI LETTER NO*/
+                                           RTUNI_ALPHA, /* U+00a819: SYLOTI NAGRI LETTER PO*/
+                                           RTUNI_ALPHA, /* U+00a81a: SYLOTI NAGRI LETTER PHO*/
+                                           RTUNI_ALPHA, /* U+00a81b: SYLOTI NAGRI LETTER BO*/
+                                           RTUNI_ALPHA, /* U+00a81c: SYLOTI NAGRI LETTER BHO*/
+                                           RTUNI_ALPHA, /* U+00a81d: SYLOTI NAGRI LETTER MO*/
+                                           RTUNI_ALPHA, /* U+00a81e: SYLOTI NAGRI LETTER RO*/
+                                           RTUNI_ALPHA, /* U+00a81f: SYLOTI NAGRI LETTER LO*/
+                                           RTUNI_ALPHA, /* U+00a820: SYLOTI NAGRI LETTER RRO*/
+                                           RTUNI_ALPHA, /* U+00a821: SYLOTI NAGRI LETTER SO*/
+                                           RTUNI_ALPHA, /* U+00a822: SYLOTI NAGRI LETTER HO*/
+                                           RTUNI_ALPHA, /* U+00a823: SYLOTI NAGRI VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+00a824: SYLOTI NAGRI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00a825: SYLOTI NAGRI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+00a826: SYLOTI NAGRI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+00a827: SYLOTI NAGRI VOWEL SIGN OO*/
+                                                     0, /* U+00a828: SYLOTI NAGRI POETRY MARK-1*/
+                                                     0, /* U+00a829: SYLOTI NAGRI POETRY MARK-2*/
+                                                     0, /* U+00a82a: SYLOTI NAGRI POETRY MARK-3*/
+                                                     0, /* U+00a82b: SYLOTI NAGRI POETRY MARK-4*/
+                                                     0, /* U+00a82c: */
+                                                     0, /* U+00a82d: */
+                                                     0, /* U+00a82e: */
+                                                     0, /* U+00a82f: */
+                                                     0, /* U+00a830: NORTH INDIC FRACTION ONE QUARTER*/
+                                                     0, /* U+00a831: NORTH INDIC FRACTION ONE HALF*/
+                                                     0, /* U+00a832: NORTH INDIC FRACTION THREE QUARTERS*/
+                                                     0, /* U+00a833: NORTH INDIC FRACTION ONE SIXTEENTH*/
+                                                     0, /* U+00a834: NORTH INDIC FRACTION ONE EIGHTH*/
+                                                     0, /* U+00a835: NORTH INDIC FRACTION THREE SIXTEENTHS*/
+                                                     0, /* U+00a836: NORTH INDIC QUARTER MARK*/
+                                                     0, /* U+00a837: NORTH INDIC PLACEHOLDER MARK*/
+                                                     0, /* U+00a838: NORTH INDIC RUPEE MARK*/
+                                                     0, /* U+00a839: NORTH INDIC QUANTITY MARK*/
+                                                     0, /* U+00a83a: */
+                                                     0, /* U+00a83b: */
+                                                     0, /* U+00a83c: */
+                                                     0, /* U+00a83d: */
+                                                     0, /* U+00a83e: */
+                                                     0, /* U+00a83f: */
+                                           RTUNI_ALPHA, /* U+00a840: PHAGS-PA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a841: PHAGS-PA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00a842: PHAGS-PA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a843: PHAGS-PA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a844: PHAGS-PA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a845: PHAGS-PA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00a846: PHAGS-PA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00a847: PHAGS-PA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00a848: PHAGS-PA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a849: PHAGS-PA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00a84a: PHAGS-PA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a84b: PHAGS-PA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a84c: PHAGS-PA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a84d: PHAGS-PA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00a84e: PHAGS-PA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a84f: PHAGS-PA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a850: PHAGS-PA LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+00a851: PHAGS-PA LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+00a852: PHAGS-PA LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+00a853: PHAGS-PA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a854: PHAGS-PA LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+00a855: PHAGS-PA LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+00a856: PHAGS-PA LETTER SMALL A*/
+                                           RTUNI_ALPHA, /* U+00a857: PHAGS-PA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a858: PHAGS-PA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a859: PHAGS-PA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a85a: PHAGS-PA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00a85b: PHAGS-PA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a85c: PHAGS-PA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00a85d: PHAGS-PA LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a85e: PHAGS-PA LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a85f: PHAGS-PA LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a860: PHAGS-PA LETTER E*/
+                                           RTUNI_ALPHA, /* U+00a861: PHAGS-PA LETTER O*/
+                                           RTUNI_ALPHA, /* U+00a862: PHAGS-PA LETTER QA*/
+                                           RTUNI_ALPHA, /* U+00a863: PHAGS-PA LETTER XA*/
+                                           RTUNI_ALPHA, /* U+00a864: PHAGS-PA LETTER FA*/
+                                           RTUNI_ALPHA, /* U+00a865: PHAGS-PA LETTER GGA*/
+                                           RTUNI_ALPHA, /* U+00a866: PHAGS-PA LETTER EE*/
+                                           RTUNI_ALPHA, /* U+00a867: PHAGS-PA SUBJOINED LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a868: PHAGS-PA SUBJOINED LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a869: PHAGS-PA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+00a86a: PHAGS-PA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+00a86b: PHAGS-PA LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00a86c: PHAGS-PA LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+00a86d: PHAGS-PA LETTER ALTERNATE YA*/
+                                           RTUNI_ALPHA, /* U+00a86e: PHAGS-PA LETTER VOICELESS SHA*/
+                                           RTUNI_ALPHA, /* U+00a86f: PHAGS-PA LETTER VOICED HA*/
+                                           RTUNI_ALPHA, /* U+00a870: PHAGS-PA LETTER ASPIRATED FA*/
+                                           RTUNI_ALPHA, /* U+00a871: PHAGS-PA SUBJOINED LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a872: PHAGS-PA SUPERFIXED LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a873: PHAGS-PA LETTER CANDRABINDU*/
+                                                     0, /* U+00a874: PHAGS-PA SINGLE HEAD MARK*/
+                                                     0, /* U+00a875: PHAGS-PA DOUBLE HEAD MARK*/
+                                                     0, /* U+00a876: PHAGS-PA MARK SHAD*/
+                                                     0, /* U+00a877: PHAGS-PA MARK DOUBLE SHAD*/
+                                                     0, /* U+00a878: */
+                                                     0, /* U+00a879: */
+                                                     0, /* U+00a87a: */
+                                                     0, /* U+00a87b: */
+                                                     0, /* U+00a87c: */
+                                                     0, /* U+00a87d: */
+                                                     0, /* U+00a87e: */
+                                                     0, /* U+00a87f: */
+                                           RTUNI_ALPHA, /* U+00a880: SAURASHTRA SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+00a881: SAURASHTRA SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+00a882: SAURASHTRA LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a883: SAURASHTRA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+00a884: SAURASHTRA LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a885: SAURASHTRA LETTER II*/
+                                           RTUNI_ALPHA, /* U+00a886: SAURASHTRA LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a887: SAURASHTRA LETTER UU*/
+                                           RTUNI_ALPHA, /* U+00a888: SAURASHTRA LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+00a889: SAURASHTRA LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+00a88a: SAURASHTRA LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+00a88b: SAURASHTRA LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+00a88c: SAURASHTRA LETTER E*/
+                                           RTUNI_ALPHA, /* U+00a88d: SAURASHTRA LETTER EE*/
+                                           RTUNI_ALPHA, /* U+00a88e: SAURASHTRA LETTER AI*/
+                                           RTUNI_ALPHA, /* U+00a88f: SAURASHTRA LETTER O*/
+                                           RTUNI_ALPHA, /* U+00a890: SAURASHTRA LETTER OO*/
+                                           RTUNI_ALPHA, /* U+00a891: SAURASHTRA LETTER AU*/
+                                           RTUNI_ALPHA, /* U+00a892: SAURASHTRA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a893: SAURASHTRA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00a894: SAURASHTRA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a895: SAURASHTRA LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+00a896: SAURASHTRA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a897: SAURASHTRA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a898: SAURASHTRA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00a899: SAURASHTRA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00a89a: SAURASHTRA LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+00a89b: SAURASHTRA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00a89c: SAURASHTRA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+00a89d: SAURASHTRA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+00a89e: SAURASHTRA LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00a89f: SAURASHTRA LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+00a8a0: SAURASHTRA LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+00a8a1: SAURASHTRA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a8a2: SAURASHTRA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00a8a3: SAURASHTRA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a8a4: SAURASHTRA LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+00a8a5: SAURASHTRA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a8a6: SAURASHTRA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a8a7: SAURASHTRA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00a8a8: SAURASHTRA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a8a9: SAURASHTRA LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+00a8aa: SAURASHTRA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a8ab: SAURASHTRA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a8ac: SAURASHTRA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a8ad: SAURASHTRA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a8ae: SAURASHTRA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+00a8af: SAURASHTRA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00a8b0: SAURASHTRA LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+00a8b1: SAURASHTRA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a8b2: SAURASHTRA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00a8b3: SAURASHTRA LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+00a8b4: SAURASHTRA CONSONANT SIGN HAARU*/
+                                           RTUNI_ALPHA, /* U+00a8b5: SAURASHTRA VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+00a8b6: SAURASHTRA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00a8b7: SAURASHTRA VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+00a8b8: SAURASHTRA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+00a8b9: SAURASHTRA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+00a8ba: SAURASHTRA VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+00a8bb: SAURASHTRA VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+00a8bc: SAURASHTRA VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+00a8bd: SAURASHTRA VOWEL SIGN VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+00a8be: SAURASHTRA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+00a8bf: SAURASHTRA VOWEL SIGN EE*/
+                                           RTUNI_ALPHA, /* U+00a8c0: SAURASHTRA VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+00a8c1: SAURASHTRA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+00a8c2: SAURASHTRA VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+00a8c3: SAURASHTRA VOWEL SIGN AU*/
+                                                     0, /* U+00a8c4: SAURASHTRA SIGN VIRAMA*/
+                                                     0, /* U+00a8c5: */
+                                                     0, /* U+00a8c6: */
+                                                     0, /* U+00a8c7: */
+                                                     0, /* U+00a8c8: */
+                                                     0, /* U+00a8c9: */
+                                                     0, /* U+00a8ca: */
+                                                     0, /* U+00a8cb: */
+                                                     0, /* U+00a8cc: */
+                                                     0, /* U+00a8cd: */
+                                                     0, /* U+00a8ce: SAURASHTRA DANDA*/
+                                                     0, /* U+00a8cf: SAURASHTRA DOUBLE DANDA*/
+                                          RTUNI_DDIGIT, /* U+00a8d0: SAURASHTRA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00a8d1: SAURASHTRA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00a8d2: SAURASHTRA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00a8d3: SAURASHTRA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00a8d4: SAURASHTRA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00a8d5: SAURASHTRA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00a8d6: SAURASHTRA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00a8d7: SAURASHTRA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00a8d8: SAURASHTRA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00a8d9: SAURASHTRA DIGIT NINE*/
+                                                     0, /* U+00a8da: */
+                                                     0, /* U+00a8db: */
+                                                     0, /* U+00a8dc: */
+                                                     0, /* U+00a8dd: */
+                                                     0, /* U+00a8de: */
+                                                     0, /* U+00a8df: */
+                                                     0, /* U+00a8e0: COMBINING DEVANAGARI DIGIT ZERO*/
+                                                     0, /* U+00a8e1: COMBINING DEVANAGARI DIGIT ONE*/
+                                                     0, /* U+00a8e2: COMBINING DEVANAGARI DIGIT TWO*/
+                                                     0, /* U+00a8e3: COMBINING DEVANAGARI DIGIT THREE*/
+                                                     0, /* U+00a8e4: COMBINING DEVANAGARI DIGIT FOUR*/
+                                                     0, /* U+00a8e5: COMBINING DEVANAGARI DIGIT FIVE*/
+                                                     0, /* U+00a8e6: COMBINING DEVANAGARI DIGIT SIX*/
+                                                     0, /* U+00a8e7: COMBINING DEVANAGARI DIGIT SEVEN*/
+                                                     0, /* U+00a8e8: COMBINING DEVANAGARI DIGIT EIGHT*/
+                                                     0, /* U+00a8e9: COMBINING DEVANAGARI DIGIT NINE*/
+                                                     0, /* U+00a8ea: COMBINING DEVANAGARI LETTER A*/
+                                                     0, /* U+00a8eb: COMBINING DEVANAGARI LETTER U*/
+                                                     0, /* U+00a8ec: COMBINING DEVANAGARI LETTER KA*/
+                                                     0, /* U+00a8ed: COMBINING DEVANAGARI LETTER NA*/
+                                                     0, /* U+00a8ee: COMBINING DEVANAGARI LETTER PA*/
+                                                     0, /* U+00a8ef: COMBINING DEVANAGARI LETTER RA*/
+                                                     0, /* U+00a8f0: COMBINING DEVANAGARI LETTER VI*/
+                                                     0, /* U+00a8f1: COMBINING DEVANAGARI SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+00a8f2: DEVANAGARI SIGN SPACING CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+00a8f3: DEVANAGARI SIGN CANDRABINDU VIRAMA*/
+                                           RTUNI_ALPHA, /* U+00a8f4: DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA*/
+                                           RTUNI_ALPHA, /* U+00a8f5: DEVANAGARI SIGN CANDRABINDU TWO*/
+                                           RTUNI_ALPHA, /* U+00a8f6: DEVANAGARI SIGN CANDRABINDU THREE*/
+                                           RTUNI_ALPHA, /* U+00a8f7: DEVANAGARI SIGN CANDRABINDU AVAGRAHA*/
+                                                     0, /* U+00a8f8: DEVANAGARI SIGN PUSHPIKA*/
+                                                     0, /* U+00a8f9: DEVANAGARI GAP FILLER*/
+                                                     0, /* U+00a8fa: DEVANAGARI CARET*/
+                                           RTUNI_ALPHA, /* U+00a8fb: DEVANAGARI HEADSTROKE*/
+                                                     0, /* U+00a8fc: */
+                                                     0, /* U+00a8fd: */
+                                                     0, /* U+00a8fe: */
+                                                     0, /* U+00a8ff: */
+                                          RTUNI_DDIGIT, /* U+00a900: KAYAH LI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00a901: KAYAH LI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00a902: KAYAH LI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00a903: KAYAH LI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00a904: KAYAH LI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00a905: KAYAH LI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00a906: KAYAH LI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00a907: KAYAH LI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00a908: KAYAH LI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00a909: KAYAH LI DIGIT NINE*/
+                                           RTUNI_ALPHA, /* U+00a90a: KAYAH LI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a90b: KAYAH LI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00a90c: KAYAH LI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a90d: KAYAH LI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a90e: KAYAH LI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a90f: KAYAH LI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00a910: KAYAH LI LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+00a911: KAYAH LI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00a912: KAYAH LI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a913: KAYAH LI LETTER HTA*/
+                                           RTUNI_ALPHA, /* U+00a914: KAYAH LI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a915: KAYAH LI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a916: KAYAH LI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00a917: KAYAH LI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a918: KAYAH LI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a919: KAYAH LI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a91a: KAYAH LI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a91b: KAYAH LI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a91c: KAYAH LI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a91d: KAYAH LI LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a91e: KAYAH LI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00a91f: KAYAH LI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00a920: KAYAH LI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+00a921: KAYAH LI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a922: KAYAH LI LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a923: KAYAH LI LETTER OE*/
+                                           RTUNI_ALPHA, /* U+00a924: KAYAH LI LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a925: KAYAH LI LETTER OO*/
+                                           RTUNI_ALPHA, /* U+00a926: KAYAH LI VOWEL UE*/
+                                           RTUNI_ALPHA, /* U+00a927: KAYAH LI VOWEL E*/
+                                           RTUNI_ALPHA, /* U+00a928: KAYAH LI VOWEL U*/
+                                           RTUNI_ALPHA, /* U+00a929: KAYAH LI VOWEL EE*/
+                                           RTUNI_ALPHA, /* U+00a92a: KAYAH LI VOWEL O*/
+                                                     0, /* U+00a92b: KAYAH LI TONE PLOPHU*/
+                                                     0, /* U+00a92c: KAYAH LI TONE CALYA*/
+                                                     0, /* U+00a92d: KAYAH LI TONE CALYA PLOPHU*/
+                                                     0, /* U+00a92e: KAYAH LI SIGN CWI*/
+                                                     0, /* U+00a92f: KAYAH LI SIGN SHYA*/
+                                           RTUNI_ALPHA, /* U+00a930: REJANG LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a931: REJANG LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a932: REJANG LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a933: REJANG LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a934: REJANG LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a935: REJANG LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a936: REJANG LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a937: REJANG LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a938: REJANG LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a939: REJANG LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a93a: REJANG LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00a93b: REJANG LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00a93c: REJANG LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a93d: REJANG LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a93e: REJANG LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a93f: REJANG LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a940: REJANG LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a941: REJANG LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00a942: REJANG LETTER MBA*/
+                                           RTUNI_ALPHA, /* U+00a943: REJANG LETTER NGGA*/
+                                           RTUNI_ALPHA, /* U+00a944: REJANG LETTER NDA*/
+                                           RTUNI_ALPHA, /* U+00a945: REJANG LETTER NYJA*/
+                                           RTUNI_ALPHA, /* U+00a946: REJANG LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a947: REJANG VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00a948: REJANG VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+00a949: REJANG VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+00a94a: REJANG VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+00a94b: REJANG VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+00a94c: REJANG VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+00a94d: REJANG VOWEL SIGN EU*/
+                                           RTUNI_ALPHA, /* U+00a94e: REJANG VOWEL SIGN EA*/
+                                           RTUNI_ALPHA, /* U+00a94f: REJANG CONSONANT SIGN NG*/
+                                           RTUNI_ALPHA, /* U+00a950: REJANG CONSONANT SIGN N*/
+                                           RTUNI_ALPHA, /* U+00a951: REJANG CONSONANT SIGN R*/
+                                           RTUNI_ALPHA, /* U+00a952: REJANG CONSONANT SIGN H*/
+                                                     0, /* U+00a953: REJANG VIRAMA*/
+                                                     0, /* U+00a954: */
+                                                     0, /* U+00a955: */
+                                                     0, /* U+00a956: */
+                                                     0, /* U+00a957: */
+                                                     0, /* U+00a958: */
+                                                     0, /* U+00a959: */
+                                                     0, /* U+00a95a: */
+                                                     0, /* U+00a95b: */
+                                                     0, /* U+00a95c: */
+                                                     0, /* U+00a95d: */
+                                                     0, /* U+00a95e: */
+                                                     0, /* U+00a95f: REJANG SECTION MARK*/
+                                           RTUNI_ALPHA, /* U+00a960: HANGUL CHOSEONG TIKEUT-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00a961: HANGUL CHOSEONG TIKEUT-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00a962: HANGUL CHOSEONG TIKEUT-SIOS*/
+                                           RTUNI_ALPHA, /* U+00a963: HANGUL CHOSEONG TIKEUT-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00a964: HANGUL CHOSEONG RIEUL-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00a965: HANGUL CHOSEONG RIEUL-SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+00a966: HANGUL CHOSEONG RIEUL-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00a967: HANGUL CHOSEONG RIEUL-SSANGTIKEUT*/
+                                           RTUNI_ALPHA, /* U+00a968: HANGUL CHOSEONG RIEUL-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00a969: HANGUL CHOSEONG RIEUL-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00a96a: HANGUL CHOSEONG RIEUL-SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00a96b: HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+00a96c: HANGUL CHOSEONG RIEUL-SIOS*/
+                                           RTUNI_ALPHA, /* U+00a96d: HANGUL CHOSEONG RIEUL-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00a96e: HANGUL CHOSEONG RIEUL-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+00a96f: HANGUL CHOSEONG MIEUM-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00a970: HANGUL CHOSEONG MIEUM-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00a971: HANGUL CHOSEONG MIEUM-SIOS*/
+                                           RTUNI_ALPHA, /* U+00a972: HANGUL CHOSEONG PIEUP-SIOS-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00a973: HANGUL CHOSEONG PIEUP-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+00a974: HANGUL CHOSEONG PIEUP-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00a975: HANGUL CHOSEONG SSANGSIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00a976: HANGUL CHOSEONG IEUNG-RIEUL*/
+                                           RTUNI_ALPHA, /* U+00a977: HANGUL CHOSEONG IEUNG-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00a978: HANGUL CHOSEONG SSANGCIEUC-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00a979: HANGUL CHOSEONG SSANGTHIEUTH*/
+                                           RTUNI_ALPHA, /* U+00a97a: HANGUL CHOSEONG PHIEUPH-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00a97b: HANGUL CHOSEONG HIEUH-SIOS*/
+                                           RTUNI_ALPHA, /* U+00a97c: HANGUL CHOSEONG SSANGYEORINHIEUH*/
+                                                     0, /* U+00a97d: */
+                                                     0, /* U+00a97e: */
+                                                     0, /* U+00a97f: */
+                                           RTUNI_ALPHA, /* U+00a980: JAVANESE SIGN PANYANGGA*/
+                                           RTUNI_ALPHA, /* U+00a981: JAVANESE SIGN CECAK*/
+                                           RTUNI_ALPHA, /* U+00a982: JAVANESE SIGN LAYAR*/
+                                           RTUNI_ALPHA, /* U+00a983: JAVANESE SIGN WIGNYAN*/
+                                           RTUNI_ALPHA, /* U+00a984: JAVANESE LETTER A*/
+                                           RTUNI_ALPHA, /* U+00a985: JAVANESE LETTER I KAWI*/
+                                           RTUNI_ALPHA, /* U+00a986: JAVANESE LETTER I*/
+                                           RTUNI_ALPHA, /* U+00a987: JAVANESE LETTER II*/
+                                           RTUNI_ALPHA, /* U+00a988: JAVANESE LETTER U*/
+                                           RTUNI_ALPHA, /* U+00a989: JAVANESE LETTER PA CEREK*/
+                                           RTUNI_ALPHA, /* U+00a98a: JAVANESE LETTER NGA LELET*/
+                                           RTUNI_ALPHA, /* U+00a98b: JAVANESE LETTER NGA LELET RASWADI*/
+                                           RTUNI_ALPHA, /* U+00a98c: JAVANESE LETTER E*/
+                                           RTUNI_ALPHA, /* U+00a98d: JAVANESE LETTER AI*/
+                                           RTUNI_ALPHA, /* U+00a98e: JAVANESE LETTER O*/
+                                           RTUNI_ALPHA, /* U+00a98f: JAVANESE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00a990: JAVANESE LETTER KA SASAK*/
+                                           RTUNI_ALPHA, /* U+00a991: JAVANESE LETTER KA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a992: JAVANESE LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00a993: JAVANESE LETTER GA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a994: JAVANESE LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00a995: JAVANESE LETTER CA*/
+                                           RTUNI_ALPHA, /* U+00a996: JAVANESE LETTER CA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a997: JAVANESE LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00a998: JAVANESE LETTER NYA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a999: JAVANESE LETTER JA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+00a99a: JAVANESE LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00a99b: JAVANESE LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+00a99c: JAVANESE LETTER TTA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+00a99d: JAVANESE LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00a99e: JAVANESE LETTER DDA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+00a99f: JAVANESE LETTER NA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a9a0: JAVANESE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00a9a1: JAVANESE LETTER TA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a9a2: JAVANESE LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00a9a3: JAVANESE LETTER DA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+00a9a4: JAVANESE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00a9a5: JAVANESE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00a9a6: JAVANESE LETTER PA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a9a7: JAVANESE LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00a9a8: JAVANESE LETTER BA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a9a9: JAVANESE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00a9aa: JAVANESE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00a9ab: JAVANESE LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00a9ac: JAVANESE LETTER RA AGUNG*/
+                                           RTUNI_ALPHA, /* U+00a9ad: JAVANESE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00a9ae: JAVANESE LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00a9af: JAVANESE LETTER SA MURDA*/
+                                           RTUNI_ALPHA, /* U+00a9b0: JAVANESE LETTER SA MAHAPRANA*/
+                                           RTUNI_ALPHA, /* U+00a9b1: JAVANESE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00a9b2: JAVANESE LETTER HA*/
+                                                     0, /* U+00a9b3: JAVANESE SIGN CECAK TELU*/
+                                           RTUNI_ALPHA, /* U+00a9b4: JAVANESE VOWEL SIGN TARUNG*/
+                                           RTUNI_ALPHA, /* U+00a9b5: JAVANESE VOWEL SIGN TOLONG*/
+                                           RTUNI_ALPHA, /* U+00a9b6: JAVANESE VOWEL SIGN WULU*/
+                                           RTUNI_ALPHA, /* U+00a9b7: JAVANESE VOWEL SIGN WULU MELIK*/
+                                           RTUNI_ALPHA, /* U+00a9b8: JAVANESE VOWEL SIGN SUKU*/
+                                           RTUNI_ALPHA, /* U+00a9b9: JAVANESE VOWEL SIGN SUKU MENDUT*/
+                                           RTUNI_ALPHA, /* U+00a9ba: JAVANESE VOWEL SIGN TALING*/
+                                           RTUNI_ALPHA, /* U+00a9bb: JAVANESE VOWEL SIGN DIRGA MURE*/
+                                           RTUNI_ALPHA, /* U+00a9bc: JAVANESE VOWEL SIGN PEPET*/
+                                           RTUNI_ALPHA, /* U+00a9bd: JAVANESE CONSONANT SIGN KERET*/
+                                           RTUNI_ALPHA, /* U+00a9be: JAVANESE CONSONANT SIGN PENGKAL*/
+                                           RTUNI_ALPHA, /* U+00a9bf: JAVANESE CONSONANT SIGN CAKRA*/
+                                                     0, /* U+00a9c0: JAVANESE PANGKON*/
+                                                     0, /* U+00a9c1: JAVANESE LEFT RERENGGAN*/
+                                                     0, /* U+00a9c2: JAVANESE RIGHT RERENGGAN*/
+                                                     0, /* U+00a9c3: JAVANESE PADA ANDAP*/
+                                                     0, /* U+00a9c4: JAVANESE PADA MADYA*/
+                                                     0, /* U+00a9c5: JAVANESE PADA LUHUR*/
+                                                     0, /* U+00a9c6: JAVANESE PADA WINDU*/
+                                                     0, /* U+00a9c7: JAVANESE PADA PANGKAT*/
+                                                     0, /* U+00a9c8: JAVANESE PADA LINGSA*/
+                                                     0, /* U+00a9c9: JAVANESE PADA LUNGSI*/
+                                                     0, /* U+00a9ca: JAVANESE PADA ADEG*/
+                                                     0, /* U+00a9cb: JAVANESE PADA ADEG ADEG*/
+                                                     0, /* U+00a9cc: JAVANESE PADA PISELEH*/
+                                                     0, /* U+00a9cd: JAVANESE TURNED PADA PISELEH*/
+                                                     0, /* U+00a9ce: */
+                                           RTUNI_ALPHA, /* U+00a9cf: JAVANESE PANGRANGKEP*/
+                                          RTUNI_DDIGIT, /* U+00a9d0: JAVANESE DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00a9d1: JAVANESE DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00a9d2: JAVANESE DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00a9d3: JAVANESE DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00a9d4: JAVANESE DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00a9d5: JAVANESE DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00a9d6: JAVANESE DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00a9d7: JAVANESE DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00a9d8: JAVANESE DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00a9d9: JAVANESE DIGIT NINE*/
+                                                     0, /* U+00a9da: */
+                                                     0, /* U+00a9db: */
+                                                     0, /* U+00a9dc: */
+                                                     0, /* U+00a9dd: */
+                                                     0, /* U+00a9de: JAVANESE PADA TIRTA TUMETES*/
+                                                     0, /* U+00a9df: JAVANESE PADA ISEN-ISEN*/
+                                                     0, /* U+00a9e0: */
+                                                     0, /* U+00a9e1: */
+                                                     0, /* U+00a9e2: */
+                                                     0, /* U+00a9e3: */
+                                                     0, /* U+00a9e4: */
+                                                     0, /* U+00a9e5: */
+                                                     0, /* U+00a9e6: */
+                                                     0, /* U+00a9e7: */
+                                                     0, /* U+00a9e8: */
+                                                     0, /* U+00a9e9: */
+                                                     0, /* U+00a9ea: */
+                                                     0, /* U+00a9eb: */
+                                                     0, /* U+00a9ec: */
+                                                     0, /* U+00a9ed: */
+                                                     0, /* U+00a9ee: */
+                                                     0, /* U+00a9ef: */
+                                                     0, /* U+00a9f0: */
+                                                     0, /* U+00a9f1: */
+                                                     0, /* U+00a9f2: */
+                                                     0, /* U+00a9f3: */
+                                                     0, /* U+00a9f4: */
+                                                     0, /* U+00a9f5: */
+                                                     0, /* U+00a9f6: */
+                                                     0, /* U+00a9f7: */
+                                                     0, /* U+00a9f8: */
+                                                     0, /* U+00a9f9: */
+                                                     0, /* U+00a9fa: */
+                                                     0, /* U+00a9fb: */
+                                                     0, /* U+00a9fc: */
+                                                     0, /* U+00a9fd: */
+                                                     0, /* U+00a9fe: */
+                                                     0, /* U+00a9ff: */
+                                           RTUNI_ALPHA, /* U+00aa00: CHAM LETTER A*/
+                                           RTUNI_ALPHA, /* U+00aa01: CHAM LETTER I*/
+                                           RTUNI_ALPHA, /* U+00aa02: CHAM LETTER U*/
+                                           RTUNI_ALPHA, /* U+00aa03: CHAM LETTER E*/
+                                           RTUNI_ALPHA, /* U+00aa04: CHAM LETTER AI*/
+                                           RTUNI_ALPHA, /* U+00aa05: CHAM LETTER O*/
+                                           RTUNI_ALPHA, /* U+00aa06: CHAM LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00aa07: CHAM LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+00aa08: CHAM LETTER GA*/
+                                           RTUNI_ALPHA, /* U+00aa09: CHAM LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+00aa0a: CHAM LETTER NGUE*/
+                                           RTUNI_ALPHA, /* U+00aa0b: CHAM LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+00aa0c: CHAM LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00aa0d: CHAM LETTER CHHA*/
+                                           RTUNI_ALPHA, /* U+00aa0e: CHAM LETTER JA*/
+                                           RTUNI_ALPHA, /* U+00aa0f: CHAM LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+00aa10: CHAM LETTER NHUE*/
+                                           RTUNI_ALPHA, /* U+00aa11: CHAM LETTER NHA*/
+                                           RTUNI_ALPHA, /* U+00aa12: CHAM LETTER NHJA*/
+                                           RTUNI_ALPHA, /* U+00aa13: CHAM LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00aa14: CHAM LETTER THA*/
+                                           RTUNI_ALPHA, /* U+00aa15: CHAM LETTER DA*/
+                                           RTUNI_ALPHA, /* U+00aa16: CHAM LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+00aa17: CHAM LETTER NUE*/
+                                           RTUNI_ALPHA, /* U+00aa18: CHAM LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00aa19: CHAM LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00aa1a: CHAM LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00aa1b: CHAM LETTER PPA*/
+                                           RTUNI_ALPHA, /* U+00aa1c: CHAM LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+00aa1d: CHAM LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00aa1e: CHAM LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+00aa1f: CHAM LETTER MUE*/
+                                           RTUNI_ALPHA, /* U+00aa20: CHAM LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00aa21: CHAM LETTER BBA*/
+                                           RTUNI_ALPHA, /* U+00aa22: CHAM LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00aa23: CHAM LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00aa24: CHAM LETTER LA*/
+                                           RTUNI_ALPHA, /* U+00aa25: CHAM LETTER VA*/
+                                           RTUNI_ALPHA, /* U+00aa26: CHAM LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+00aa27: CHAM LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00aa28: CHAM LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00aa29: CHAM VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+00aa2a: CHAM VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+00aa2b: CHAM VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+00aa2c: CHAM VOWEL SIGN EI*/
+                                           RTUNI_ALPHA, /* U+00aa2d: CHAM VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+00aa2e: CHAM VOWEL SIGN OE*/
+                                           RTUNI_ALPHA, /* U+00aa2f: CHAM VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+00aa30: CHAM VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+00aa31: CHAM VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+00aa32: CHAM VOWEL SIGN UE*/
+                                           RTUNI_ALPHA, /* U+00aa33: CHAM CONSONANT SIGN YA*/
+                                           RTUNI_ALPHA, /* U+00aa34: CHAM CONSONANT SIGN RA*/
+                                           RTUNI_ALPHA, /* U+00aa35: CHAM CONSONANT SIGN LA*/
+                                           RTUNI_ALPHA, /* U+00aa36: CHAM CONSONANT SIGN WA*/
+                                                     0, /* U+00aa37: */
+                                                     0, /* U+00aa38: */
+                                                     0, /* U+00aa39: */
+                                                     0, /* U+00aa3a: */
+                                                     0, /* U+00aa3b: */
+                                                     0, /* U+00aa3c: */
+                                                     0, /* U+00aa3d: */
+                                                     0, /* U+00aa3e: */
+                                                     0, /* U+00aa3f: */
+                                           RTUNI_ALPHA, /* U+00aa40: CHAM LETTER FINAL K*/
+                                           RTUNI_ALPHA, /* U+00aa41: CHAM LETTER FINAL G*/
+                                           RTUNI_ALPHA, /* U+00aa42: CHAM LETTER FINAL NG*/
+                                           RTUNI_ALPHA, /* U+00aa43: CHAM CONSONANT SIGN FINAL NG*/
+                                           RTUNI_ALPHA, /* U+00aa44: CHAM LETTER FINAL CH*/
+                                           RTUNI_ALPHA, /* U+00aa45: CHAM LETTER FINAL T*/
+                                           RTUNI_ALPHA, /* U+00aa46: CHAM LETTER FINAL N*/
+                                           RTUNI_ALPHA, /* U+00aa47: CHAM LETTER FINAL P*/
+                                           RTUNI_ALPHA, /* U+00aa48: CHAM LETTER FINAL Y*/
+                                           RTUNI_ALPHA, /* U+00aa49: CHAM LETTER FINAL R*/
+                                           RTUNI_ALPHA, /* U+00aa4a: CHAM LETTER FINAL L*/
+                                           RTUNI_ALPHA, /* U+00aa4b: CHAM LETTER FINAL SS*/
+                                           RTUNI_ALPHA, /* U+00aa4c: CHAM CONSONANT SIGN FINAL M*/
+                                           RTUNI_ALPHA, /* U+00aa4d: CHAM CONSONANT SIGN FINAL H*/
+                                                     0, /* U+00aa4e: */
+                                                     0, /* U+00aa4f: */
+                                          RTUNI_DDIGIT, /* U+00aa50: CHAM DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00aa51: CHAM DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00aa52: CHAM DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00aa53: CHAM DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00aa54: CHAM DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00aa55: CHAM DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00aa56: CHAM DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00aa57: CHAM DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00aa58: CHAM DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00aa59: CHAM DIGIT NINE*/
+                                                     0, /* U+00aa5a: */
+                                                     0, /* U+00aa5b: */
+                                                     0, /* U+00aa5c: CHAM PUNCTUATION SPIRAL*/
+                                                     0, /* U+00aa5d: CHAM PUNCTUATION DANDA*/
+                                                     0, /* U+00aa5e: CHAM PUNCTUATION DOUBLE DANDA*/
+                                                     0, /* U+00aa5f: CHAM PUNCTUATION TRIPLE DANDA*/
+                                           RTUNI_ALPHA, /* U+00aa60: MYANMAR LETTER KHAMTI GA*/
+                                           RTUNI_ALPHA, /* U+00aa61: MYANMAR LETTER KHAMTI CA*/
+                                           RTUNI_ALPHA, /* U+00aa62: MYANMAR LETTER KHAMTI CHA*/
+                                           RTUNI_ALPHA, /* U+00aa63: MYANMAR LETTER KHAMTI JA*/
+                                           RTUNI_ALPHA, /* U+00aa64: MYANMAR LETTER KHAMTI JHA*/
+                                           RTUNI_ALPHA, /* U+00aa65: MYANMAR LETTER KHAMTI NYA*/
+                                           RTUNI_ALPHA, /* U+00aa66: MYANMAR LETTER KHAMTI TTA*/
+                                           RTUNI_ALPHA, /* U+00aa67: MYANMAR LETTER KHAMTI TTHA*/
+                                           RTUNI_ALPHA, /* U+00aa68: MYANMAR LETTER KHAMTI DDA*/
+                                           RTUNI_ALPHA, /* U+00aa69: MYANMAR LETTER KHAMTI DDHA*/
+                                           RTUNI_ALPHA, /* U+00aa6a: MYANMAR LETTER KHAMTI DHA*/
+                                           RTUNI_ALPHA, /* U+00aa6b: MYANMAR LETTER KHAMTI NA*/
+                                           RTUNI_ALPHA, /* U+00aa6c: MYANMAR LETTER KHAMTI SA*/
+                                           RTUNI_ALPHA, /* U+00aa6d: MYANMAR LETTER KHAMTI HA*/
+                                           RTUNI_ALPHA, /* U+00aa6e: MYANMAR LETTER KHAMTI HHA*/
+                                           RTUNI_ALPHA, /* U+00aa6f: MYANMAR LETTER KHAMTI FA*/
+                                           RTUNI_ALPHA, /* U+00aa70: MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION*/
+                                           RTUNI_ALPHA, /* U+00aa71: MYANMAR LETTER KHAMTI XA*/
+                                           RTUNI_ALPHA, /* U+00aa72: MYANMAR LETTER KHAMTI ZA*/
+                                           RTUNI_ALPHA, /* U+00aa73: MYANMAR LETTER KHAMTI RA*/
+                                           RTUNI_ALPHA, /* U+00aa74: MYANMAR LOGOGRAM KHAMTI OAY*/
+                                           RTUNI_ALPHA, /* U+00aa75: MYANMAR LOGOGRAM KHAMTI QN*/
+                                           RTUNI_ALPHA, /* U+00aa76: MYANMAR LOGOGRAM KHAMTI HM*/
+                                                     0, /* U+00aa77: MYANMAR SYMBOL AITON EXCLAMATION*/
+                                                     0, /* U+00aa78: MYANMAR SYMBOL AITON ONE*/
+                                                     0, /* U+00aa79: MYANMAR SYMBOL AITON TWO*/
+                                           RTUNI_ALPHA, /* U+00aa7a: MYANMAR LETTER AITON RA*/
+                                                     0, /* U+00aa7b: MYANMAR SIGN PAO KAREN TONE*/
+                                                     0, /* U+00aa7c: */
+                                                     0, /* U+00aa7d: */
+                                                     0, /* U+00aa7e: */
+                                                     0, /* U+00aa7f: */
+                                           RTUNI_ALPHA, /* U+00aa80: TAI VIET LETTER LOW KO*/
+                                           RTUNI_ALPHA, /* U+00aa81: TAI VIET LETTER HIGH KO*/
+                                           RTUNI_ALPHA, /* U+00aa82: TAI VIET LETTER LOW KHO*/
+                                           RTUNI_ALPHA, /* U+00aa83: TAI VIET LETTER HIGH KHO*/
+                                           RTUNI_ALPHA, /* U+00aa84: TAI VIET LETTER LOW KHHO*/
+                                           RTUNI_ALPHA, /* U+00aa85: TAI VIET LETTER HIGH KHHO*/
+                                           RTUNI_ALPHA, /* U+00aa86: TAI VIET LETTER LOW GO*/
+                                           RTUNI_ALPHA, /* U+00aa87: TAI VIET LETTER HIGH GO*/
+                                           RTUNI_ALPHA, /* U+00aa88: TAI VIET LETTER LOW NGO*/
+                                           RTUNI_ALPHA, /* U+00aa89: TAI VIET LETTER HIGH NGO*/
+                                           RTUNI_ALPHA, /* U+00aa8a: TAI VIET LETTER LOW CO*/
+                                           RTUNI_ALPHA, /* U+00aa8b: TAI VIET LETTER HIGH CO*/
+                                           RTUNI_ALPHA, /* U+00aa8c: TAI VIET LETTER LOW CHO*/
+                                           RTUNI_ALPHA, /* U+00aa8d: TAI VIET LETTER HIGH CHO*/
+                                           RTUNI_ALPHA, /* U+00aa8e: TAI VIET LETTER LOW SO*/
+                                           RTUNI_ALPHA, /* U+00aa8f: TAI VIET LETTER HIGH SO*/
+                                           RTUNI_ALPHA, /* U+00aa90: TAI VIET LETTER LOW NYO*/
+                                           RTUNI_ALPHA, /* U+00aa91: TAI VIET LETTER HIGH NYO*/
+                                           RTUNI_ALPHA, /* U+00aa92: TAI VIET LETTER LOW DO*/
+                                           RTUNI_ALPHA, /* U+00aa93: TAI VIET LETTER HIGH DO*/
+                                           RTUNI_ALPHA, /* U+00aa94: TAI VIET LETTER LOW TO*/
+                                           RTUNI_ALPHA, /* U+00aa95: TAI VIET LETTER HIGH TO*/
+                                           RTUNI_ALPHA, /* U+00aa96: TAI VIET LETTER LOW THO*/
+                                           RTUNI_ALPHA, /* U+00aa97: TAI VIET LETTER HIGH THO*/
+                                           RTUNI_ALPHA, /* U+00aa98: TAI VIET LETTER LOW NO*/
+                                           RTUNI_ALPHA, /* U+00aa99: TAI VIET LETTER HIGH NO*/
+                                           RTUNI_ALPHA, /* U+00aa9a: TAI VIET LETTER LOW BO*/
+                                           RTUNI_ALPHA, /* U+00aa9b: TAI VIET LETTER HIGH BO*/
+                                           RTUNI_ALPHA, /* U+00aa9c: TAI VIET LETTER LOW PO*/
+                                           RTUNI_ALPHA, /* U+00aa9d: TAI VIET LETTER HIGH PO*/
+                                           RTUNI_ALPHA, /* U+00aa9e: TAI VIET LETTER LOW PHO*/
+                                           RTUNI_ALPHA, /* U+00aa9f: TAI VIET LETTER HIGH PHO*/
+                                           RTUNI_ALPHA, /* U+00aaa0: TAI VIET LETTER LOW FO*/
+                                           RTUNI_ALPHA, /* U+00aaa1: TAI VIET LETTER HIGH FO*/
+                                           RTUNI_ALPHA, /* U+00aaa2: TAI VIET LETTER LOW MO*/
+                                           RTUNI_ALPHA, /* U+00aaa3: TAI VIET LETTER HIGH MO*/
+                                           RTUNI_ALPHA, /* U+00aaa4: TAI VIET LETTER LOW YO*/
+                                           RTUNI_ALPHA, /* U+00aaa5: TAI VIET LETTER HIGH YO*/
+                                           RTUNI_ALPHA, /* U+00aaa6: TAI VIET LETTER LOW RO*/
+                                           RTUNI_ALPHA, /* U+00aaa7: TAI VIET LETTER HIGH RO*/
+                                           RTUNI_ALPHA, /* U+00aaa8: TAI VIET LETTER LOW LO*/
+                                           RTUNI_ALPHA, /* U+00aaa9: TAI VIET LETTER HIGH LO*/
+                                           RTUNI_ALPHA, /* U+00aaaa: TAI VIET LETTER LOW VO*/
+                                           RTUNI_ALPHA, /* U+00aaab: TAI VIET LETTER HIGH VO*/
+                                           RTUNI_ALPHA, /* U+00aaac: TAI VIET LETTER LOW HO*/
+                                           RTUNI_ALPHA, /* U+00aaad: TAI VIET LETTER HIGH HO*/
+                                           RTUNI_ALPHA, /* U+00aaae: TAI VIET LETTER LOW O*/
+                                           RTUNI_ALPHA, /* U+00aaaf: TAI VIET LETTER HIGH O*/
+                                           RTUNI_ALPHA, /* U+00aab0: TAI VIET MAI KANG*/
+                                           RTUNI_ALPHA, /* U+00aab1: TAI VIET VOWEL AA*/
+                                           RTUNI_ALPHA, /* U+00aab2: TAI VIET VOWEL I*/
+                                           RTUNI_ALPHA, /* U+00aab3: TAI VIET VOWEL UE*/
+                                           RTUNI_ALPHA, /* U+00aab4: TAI VIET VOWEL U*/
+                                           RTUNI_ALPHA, /* U+00aab5: TAI VIET VOWEL E*/
+                                           RTUNI_ALPHA, /* U+00aab6: TAI VIET VOWEL O*/
+                                           RTUNI_ALPHA, /* U+00aab7: TAI VIET MAI KHIT*/
+                                           RTUNI_ALPHA, /* U+00aab8: TAI VIET VOWEL IA*/
+                                           RTUNI_ALPHA, /* U+00aab9: TAI VIET VOWEL UEA*/
+                                           RTUNI_ALPHA, /* U+00aaba: TAI VIET VOWEL UA*/
+                                           RTUNI_ALPHA, /* U+00aabb: TAI VIET VOWEL AUE*/
+                                           RTUNI_ALPHA, /* U+00aabc: TAI VIET VOWEL AY*/
+                                           RTUNI_ALPHA, /* U+00aabd: TAI VIET VOWEL AN*/
+                                           RTUNI_ALPHA, /* U+00aabe: TAI VIET VOWEL AM*/
+                                                     0, /* U+00aabf: TAI VIET TONE MAI EK*/
+                                           RTUNI_ALPHA, /* U+00aac0: TAI VIET TONE MAI NUENG*/
+                                                     0, /* U+00aac1: TAI VIET TONE MAI THO*/
+                                           RTUNI_ALPHA, /* U+00aac2: TAI VIET TONE MAI SONG*/
+                                                     0, /* U+00aac3: */
+                                                     0, /* U+00aac4: */
+                                                     0, /* U+00aac5: */
+                                                     0, /* U+00aac6: */
+                                                     0, /* U+00aac7: */
+                                                     0, /* U+00aac8: */
+                                                     0, /* U+00aac9: */
+                                                     0, /* U+00aaca: */
+                                                     0, /* U+00aacb: */
+                                                     0, /* U+00aacc: */
+                                                     0, /* U+00aacd: */
+                                                     0, /* U+00aace: */
+                                                     0, /* U+00aacf: */
+                                                     0, /* U+00aad0: */
+                                                     0, /* U+00aad1: */
+                                                     0, /* U+00aad2: */
+                                                     0, /* U+00aad3: */
+                                                     0, /* U+00aad4: */
+                                                     0, /* U+00aad5: */
+                                                     0, /* U+00aad6: */
+                                                     0, /* U+00aad7: */
+                                                     0, /* U+00aad8: */
+                                                     0, /* U+00aad9: */
+                                                     0, /* U+00aada: */
+                                           RTUNI_ALPHA, /* U+00aadb: TAI VIET SYMBOL KON*/
+                                           RTUNI_ALPHA, /* U+00aadc: TAI VIET SYMBOL NUENG*/
+                                           RTUNI_ALPHA, /* U+00aadd: TAI VIET SYMBOL SAM*/
+                                                     0, /* U+00aade: TAI VIET SYMBOL HO HOI*/
+                                                     0, /* U+00aadf: TAI VIET SYMBOL KOI KOI*/
+                                           RTUNI_ALPHA, /* U+00aae0: MEETEI MAYEK LETTER E*/
+                                           RTUNI_ALPHA, /* U+00aae1: MEETEI MAYEK LETTER O*/
+                                           RTUNI_ALPHA, /* U+00aae2: MEETEI MAYEK LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+00aae3: MEETEI MAYEK LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+00aae4: MEETEI MAYEK LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+00aae5: MEETEI MAYEK LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+00aae6: MEETEI MAYEK LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+00aae7: MEETEI MAYEK LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+00aae8: MEETEI MAYEK LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+00aae9: MEETEI MAYEK LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+00aaea: MEETEI MAYEK LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+00aaeb: MEETEI MAYEK VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+00aaec: MEETEI MAYEK VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+00aaed: MEETEI MAYEK VOWEL SIGN AAI*/
+                                           RTUNI_ALPHA, /* U+00aaee: MEETEI MAYEK VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+00aaef: MEETEI MAYEK VOWEL SIGN AAU*/
+                                                     0, /* U+00aaf0: MEETEI MAYEK CHEIKHAN*/
+                                                     0, /* U+00aaf1: MEETEI MAYEK AHANG KHUDAM*/
+                                           RTUNI_ALPHA, /* U+00aaf2: MEETEI MAYEK ANJI*/
+                                           RTUNI_ALPHA, /* U+00aaf3: MEETEI MAYEK SYLLABLE REPETITION MARK*/
+                                           RTUNI_ALPHA, /* U+00aaf4: MEETEI MAYEK WORD REPETITION MARK*/
+                                           RTUNI_ALPHA, /* U+00aaf5: MEETEI MAYEK VOWEL SIGN VISARGA*/
+                                                     0, /* U+00aaf6: MEETEI MAYEK VIRAMA*/
+                                                     0, /* U+00aaf7: */
+                                                     0, /* U+00aaf8: */
+                                                     0, /* U+00aaf9: */
+                                                     0, /* U+00aafa: */
+                                                     0, /* U+00aafb: */
+                                                     0, /* U+00aafc: */
+                                                     0, /* U+00aafd: */
+                                                     0, /* U+00aafe: */
+                                                     0, /* U+00aaff: */
+                                                     0, /* U+00ab00: */
+                                           RTUNI_ALPHA, /* U+00ab01: ETHIOPIC SYLLABLE TTHU*/
+                                           RTUNI_ALPHA, /* U+00ab02: ETHIOPIC SYLLABLE TTHI*/
+                                           RTUNI_ALPHA, /* U+00ab03: ETHIOPIC SYLLABLE TTHAA*/
+                                           RTUNI_ALPHA, /* U+00ab04: ETHIOPIC SYLLABLE TTHEE*/
+                                           RTUNI_ALPHA, /* U+00ab05: ETHIOPIC SYLLABLE TTHE*/
+                                           RTUNI_ALPHA, /* U+00ab06: ETHIOPIC SYLLABLE TTHO*/
+                                                     0, /* U+00ab07: */
+                                                     0, /* U+00ab08: */
+                                           RTUNI_ALPHA, /* U+00ab09: ETHIOPIC SYLLABLE DDHU*/
+                                           RTUNI_ALPHA, /* U+00ab0a: ETHIOPIC SYLLABLE DDHI*/
+                                           RTUNI_ALPHA, /* U+00ab0b: ETHIOPIC SYLLABLE DDHAA*/
+                                           RTUNI_ALPHA, /* U+00ab0c: ETHIOPIC SYLLABLE DDHEE*/
+                                           RTUNI_ALPHA, /* U+00ab0d: ETHIOPIC SYLLABLE DDHE*/
+                                           RTUNI_ALPHA, /* U+00ab0e: ETHIOPIC SYLLABLE DDHO*/
+                                                     0, /* U+00ab0f: */
+                                                     0, /* U+00ab10: */
+                                           RTUNI_ALPHA, /* U+00ab11: ETHIOPIC SYLLABLE DZU*/
+                                           RTUNI_ALPHA, /* U+00ab12: ETHIOPIC SYLLABLE DZI*/
+                                           RTUNI_ALPHA, /* U+00ab13: ETHIOPIC SYLLABLE DZAA*/
+                                           RTUNI_ALPHA, /* U+00ab14: ETHIOPIC SYLLABLE DZEE*/
+                                           RTUNI_ALPHA, /* U+00ab15: ETHIOPIC SYLLABLE DZE*/
+                                           RTUNI_ALPHA, /* U+00ab16: ETHIOPIC SYLLABLE DZO*/
+                                                     0, /* U+00ab17: */
+                                                     0, /* U+00ab18: */
+                                                     0, /* U+00ab19: */
+                                                     0, /* U+00ab1a: */
+                                                     0, /* U+00ab1b: */
+                                                     0, /* U+00ab1c: */
+                                                     0, /* U+00ab1d: */
+                                                     0, /* U+00ab1e: */
+                                                     0, /* U+00ab1f: */
+                                           RTUNI_ALPHA, /* U+00ab20: ETHIOPIC SYLLABLE CCHHA*/
+                                           RTUNI_ALPHA, /* U+00ab21: ETHIOPIC SYLLABLE CCHHU*/
+                                           RTUNI_ALPHA, /* U+00ab22: ETHIOPIC SYLLABLE CCHHI*/
+                                           RTUNI_ALPHA, /* U+00ab23: ETHIOPIC SYLLABLE CCHHAA*/
+                                           RTUNI_ALPHA, /* U+00ab24: ETHIOPIC SYLLABLE CCHHEE*/
+                                           RTUNI_ALPHA, /* U+00ab25: ETHIOPIC SYLLABLE CCHHE*/
+                                           RTUNI_ALPHA, /* U+00ab26: ETHIOPIC SYLLABLE CCHHO*/
+                                                     0, /* U+00ab27: */
+                                           RTUNI_ALPHA, /* U+00ab28: ETHIOPIC SYLLABLE BBA*/
+                                           RTUNI_ALPHA, /* U+00ab29: ETHIOPIC SYLLABLE BBU*/
+                                           RTUNI_ALPHA, /* U+00ab2a: ETHIOPIC SYLLABLE BBI*/
+                                           RTUNI_ALPHA, /* U+00ab2b: ETHIOPIC SYLLABLE BBAA*/
+                                           RTUNI_ALPHA, /* U+00ab2c: ETHIOPIC SYLLABLE BBEE*/
+                                           RTUNI_ALPHA, /* U+00ab2d: ETHIOPIC SYLLABLE BBE*/
+                                           RTUNI_ALPHA, /* U+00ab2e: ETHIOPIC SYLLABLE BBO*/
+                                                     0, /* U+00ab2f: */
+                                                     0, /* U+00ab30: */
+                                                     0, /* U+00ab31: */
+                                                     0, /* U+00ab32: */
+                                                     0, /* U+00ab33: */
+                                                     0, /* U+00ab34: */
+                                                     0, /* U+00ab35: */
+                                                     0, /* U+00ab36: */
+                                                     0, /* U+00ab37: */
+                                                     0, /* U+00ab38: */
+                                                     0, /* U+00ab39: */
+                                                     0, /* U+00ab3a: */
+                                                     0, /* U+00ab3b: */
+                                                     0, /* U+00ab3c: */
+                                                     0, /* U+00ab3d: */
+                                                     0, /* U+00ab3e: */
+                                                     0, /* U+00ab3f: */
+                                                     0, /* U+00ab40: */
+                                                     0, /* U+00ab41: */
+                                                     0, /* U+00ab42: */
+                                                     0, /* U+00ab43: */
+                                                     0, /* U+00ab44: */
+                                                     0, /* U+00ab45: */
+                                                     0, /* U+00ab46: */
+                                                     0, /* U+00ab47: */
+                                                     0, /* U+00ab48: */
+                                                     0, /* U+00ab49: */
+                                                     0, /* U+00ab4a: */
+                                                     0, /* U+00ab4b: */
+                                                     0, /* U+00ab4c: */
+                                                     0, /* U+00ab4d: */
+                                                     0, /* U+00ab4e: */
+                                                     0, /* U+00ab4f: */
+                                                     0, /* U+00ab50: */
+                                                     0, /* U+00ab51: */
+                                                     0, /* U+00ab52: */
+                                                     0, /* U+00ab53: */
+                                                     0, /* U+00ab54: */
+                                                     0, /* U+00ab55: */
+                                                     0, /* U+00ab56: */
+                                                     0, /* U+00ab57: */
+                                                     0, /* U+00ab58: */
+                                                     0, /* U+00ab59: */
+                                                     0, /* U+00ab5a: */
+                                                     0, /* U+00ab5b: */
+                                                     0, /* U+00ab5c: */
+                                                     0, /* U+00ab5d: */
+                                                     0, /* U+00ab5e: */
+                                                     0, /* U+00ab5f: */
+                                                     0, /* U+00ab60: */
+                                                     0, /* U+00ab61: */
+                                                     0, /* U+00ab62: */
+                                                     0, /* U+00ab63: */
+                                                     0, /* U+00ab64: */
+                                                     0, /* U+00ab65: */
+                                                     0, /* U+00ab66: */
+                                                     0, /* U+00ab67: */
+                                                     0, /* U+00ab68: */
+                                                     0, /* U+00ab69: */
+                                                     0, /* U+00ab6a: */
+                                                     0, /* U+00ab6b: */
+                                                     0, /* U+00ab6c: */
+                                                     0, /* U+00ab6d: */
+                                                     0, /* U+00ab6e: */
+                                                     0, /* U+00ab6f: */
+                                                     0, /* U+00ab70: */
+                                                     0, /* U+00ab71: */
+                                                     0, /* U+00ab72: */
+                                                     0, /* U+00ab73: */
+                                                     0, /* U+00ab74: */
+                                                     0, /* U+00ab75: */
+                                                     0, /* U+00ab76: */
+                                                     0, /* U+00ab77: */
+                                                     0, /* U+00ab78: */
+                                                     0, /* U+00ab79: */
+                                                     0, /* U+00ab7a: */
+                                                     0, /* U+00ab7b: */
+                                                     0, /* U+00ab7c: */
+                                                     0, /* U+00ab7d: */
+                                                     0, /* U+00ab7e: */
+                                                     0, /* U+00ab7f: */
+                                                     0, /* U+00ab80: */
+                                                     0, /* U+00ab81: */
+                                                     0, /* U+00ab82: */
+                                                     0, /* U+00ab83: */
+                                                     0, /* U+00ab84: */
+                                                     0, /* U+00ab85: */
+                                                     0, /* U+00ab86: */
+                                                     0, /* U+00ab87: */
+                                                     0, /* U+00ab88: */
+                                                     0, /* U+00ab89: */
+                                                     0, /* U+00ab8a: */
+                                                     0, /* U+00ab8b: */
+                                                     0, /* U+00ab8c: */
+                                                     0, /* U+00ab8d: */
+                                                     0, /* U+00ab8e: */
+                                                     0, /* U+00ab8f: */
+                                                     0, /* U+00ab90: */
+                                                     0, /* U+00ab91: */
+                                                     0, /* U+00ab92: */
+                                                     0, /* U+00ab93: */
+                                                     0, /* U+00ab94: */
+                                                     0, /* U+00ab95: */
+                                                     0, /* U+00ab96: */
+                                                     0, /* U+00ab97: */
+                                                     0, /* U+00ab98: */
+                                                     0, /* U+00ab99: */
+                                                     0, /* U+00ab9a: */
+                                                     0, /* U+00ab9b: */
+                                                     0, /* U+00ab9c: */
+                                                     0, /* U+00ab9d: */
+                                                     0, /* U+00ab9e: */
+                                                     0, /* U+00ab9f: */
+                                                     0, /* U+00aba0: */
+                                                     0, /* U+00aba1: */
+                                                     0, /* U+00aba2: */
+                                                     0, /* U+00aba3: */
+                                                     0, /* U+00aba4: */
+                                                     0, /* U+00aba5: */
+                                                     0, /* U+00aba6: */
+                                                     0, /* U+00aba7: */
+                                                     0, /* U+00aba8: */
+                                                     0, /* U+00aba9: */
+                                                     0, /* U+00abaa: */
+                                                     0, /* U+00abab: */
+                                                     0, /* U+00abac: */
+                                                     0, /* U+00abad: */
+                                                     0, /* U+00abae: */
+                                                     0, /* U+00abaf: */
+                                                     0, /* U+00abb0: */
+                                                     0, /* U+00abb1: */
+                                                     0, /* U+00abb2: */
+                                                     0, /* U+00abb3: */
+                                                     0, /* U+00abb4: */
+                                                     0, /* U+00abb5: */
+                                                     0, /* U+00abb6: */
+                                                     0, /* U+00abb7: */
+                                                     0, /* U+00abb8: */
+                                                     0, /* U+00abb9: */
+                                                     0, /* U+00abba: */
+                                                     0, /* U+00abbb: */
+                                                     0, /* U+00abbc: */
+                                                     0, /* U+00abbd: */
+                                                     0, /* U+00abbe: */
+                                                     0, /* U+00abbf: */
+                                           RTUNI_ALPHA, /* U+00abc0: MEETEI MAYEK LETTER KOK*/
+                                           RTUNI_ALPHA, /* U+00abc1: MEETEI MAYEK LETTER SAM*/
+                                           RTUNI_ALPHA, /* U+00abc2: MEETEI MAYEK LETTER LAI*/
+                                           RTUNI_ALPHA, /* U+00abc3: MEETEI MAYEK LETTER MIT*/
+                                           RTUNI_ALPHA, /* U+00abc4: MEETEI MAYEK LETTER PA*/
+                                           RTUNI_ALPHA, /* U+00abc5: MEETEI MAYEK LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00abc6: MEETEI MAYEK LETTER CHIL*/
+                                           RTUNI_ALPHA, /* U+00abc7: MEETEI MAYEK LETTER TIL*/
+                                           RTUNI_ALPHA, /* U+00abc8: MEETEI MAYEK LETTER KHOU*/
+                                           RTUNI_ALPHA, /* U+00abc9: MEETEI MAYEK LETTER NGOU*/
+                                           RTUNI_ALPHA, /* U+00abca: MEETEI MAYEK LETTER THOU*/
+                                           RTUNI_ALPHA, /* U+00abcb: MEETEI MAYEK LETTER WAI*/
+                                           RTUNI_ALPHA, /* U+00abcc: MEETEI MAYEK LETTER YANG*/
+                                           RTUNI_ALPHA, /* U+00abcd: MEETEI MAYEK LETTER HUK*/
+                                           RTUNI_ALPHA, /* U+00abce: MEETEI MAYEK LETTER UN*/
+                                           RTUNI_ALPHA, /* U+00abcf: MEETEI MAYEK LETTER I*/
+                                           RTUNI_ALPHA, /* U+00abd0: MEETEI MAYEK LETTER PHAM*/
+                                           RTUNI_ALPHA, /* U+00abd1: MEETEI MAYEK LETTER ATIYA*/
+                                           RTUNI_ALPHA, /* U+00abd2: MEETEI MAYEK LETTER GOK*/
+                                           RTUNI_ALPHA, /* U+00abd3: MEETEI MAYEK LETTER JHAM*/
+                                           RTUNI_ALPHA, /* U+00abd4: MEETEI MAYEK LETTER RAI*/
+                                           RTUNI_ALPHA, /* U+00abd5: MEETEI MAYEK LETTER BA*/
+                                           RTUNI_ALPHA, /* U+00abd6: MEETEI MAYEK LETTER JIL*/
+                                           RTUNI_ALPHA, /* U+00abd7: MEETEI MAYEK LETTER DIL*/
+                                           RTUNI_ALPHA, /* U+00abd8: MEETEI MAYEK LETTER GHOU*/
+                                           RTUNI_ALPHA, /* U+00abd9: MEETEI MAYEK LETTER DHOU*/
+                                           RTUNI_ALPHA, /* U+00abda: MEETEI MAYEK LETTER BHAM*/
+                                           RTUNI_ALPHA, /* U+00abdb: MEETEI MAYEK LETTER KOK LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abdc: MEETEI MAYEK LETTER LAI LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abdd: MEETEI MAYEK LETTER MIT LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abde: MEETEI MAYEK LETTER PA LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abdf: MEETEI MAYEK LETTER NA LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abe0: MEETEI MAYEK LETTER TIL LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abe1: MEETEI MAYEK LETTER NGOU LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abe2: MEETEI MAYEK LETTER I LONSUM*/
+                                           RTUNI_ALPHA, /* U+00abe3: MEETEI MAYEK VOWEL SIGN ONAP*/
+                                           RTUNI_ALPHA, /* U+00abe4: MEETEI MAYEK VOWEL SIGN INAP*/
+                                           RTUNI_ALPHA, /* U+00abe5: MEETEI MAYEK VOWEL SIGN ANAP*/
+                                           RTUNI_ALPHA, /* U+00abe6: MEETEI MAYEK VOWEL SIGN YENAP*/
+                                           RTUNI_ALPHA, /* U+00abe7: MEETEI MAYEK VOWEL SIGN SOUNAP*/
+                                           RTUNI_ALPHA, /* U+00abe8: MEETEI MAYEK VOWEL SIGN UNAP*/
+                                           RTUNI_ALPHA, /* U+00abe9: MEETEI MAYEK VOWEL SIGN CHEINAP*/
+                                           RTUNI_ALPHA, /* U+00abea: MEETEI MAYEK VOWEL SIGN NUNG*/
+                                                     0, /* U+00abeb: MEETEI MAYEK CHEIKHEI*/
+                                                     0, /* U+00abec: MEETEI MAYEK LUM IYEK*/
+                                                     0, /* U+00abed: MEETEI MAYEK APUN IYEK*/
+                                                     0, /* U+00abee: */
+                                                     0, /* U+00abef: */
+                                          RTUNI_DDIGIT, /* U+00abf0: MEETEI MAYEK DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+00abf1: MEETEI MAYEK DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+00abf2: MEETEI MAYEK DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+00abf3: MEETEI MAYEK DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+00abf4: MEETEI MAYEK DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+00abf5: MEETEI MAYEK DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+00abf6: MEETEI MAYEK DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+00abf7: MEETEI MAYEK DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+00abf8: MEETEI MAYEK DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+00abf9: MEETEI MAYEK DIGIT NINE*/
+                                                     0, /* U+00abfa: */
+                                                     0, /* U+00abfb: */
+                                                     0, /* U+00abfc: */
+                                                     0, /* U+00abfd: */
+                                                     0, /* U+00abfe: */
+                                                     0, /* U+00abff: */
+                                           RTUNI_ALPHA, /* U+00ac00: <Hangul Syllable, First>*/
+                                           RTUNI_ALPHA, /* U+00ac01: */
+                                           RTUNI_ALPHA, /* U+00ac02: */
+                                           RTUNI_ALPHA, /* U+00ac03: */
+                                           RTUNI_ALPHA, /* U+00ac04: */
+                                           RTUNI_ALPHA, /* U+00ac05: */
+                                           RTUNI_ALPHA, /* U+00ac06: */
+                                           RTUNI_ALPHA, /* U+00ac07: */
+                                           RTUNI_ALPHA, /* U+00ac08: */
+                                           RTUNI_ALPHA, /* U+00ac09: */
+                                           RTUNI_ALPHA, /* U+00ac0a: */
+                                           RTUNI_ALPHA, /* U+00ac0b: */
+                                           RTUNI_ALPHA, /* U+00ac0c: */
+                                           RTUNI_ALPHA, /* U+00ac0d: */
+                                           RTUNI_ALPHA, /* U+00ac0e: */
+                                           RTUNI_ALPHA, /* U+00ac0f: */
+                                           RTUNI_ALPHA, /* U+00ac10: */
+                                           RTUNI_ALPHA, /* U+00ac11: */
+                                           RTUNI_ALPHA, /* U+00ac12: */
+                                           RTUNI_ALPHA, /* U+00ac13: */
+                                           RTUNI_ALPHA, /* U+00ac14: */
+                                           RTUNI_ALPHA, /* U+00ac15: */
+                                           RTUNI_ALPHA, /* U+00ac16: */
+                                           RTUNI_ALPHA, /* U+00ac17: */
+                                           RTUNI_ALPHA, /* U+00ac18: */
+                                           RTUNI_ALPHA, /* U+00ac19: */
+                                           RTUNI_ALPHA, /* U+00ac1a: */
+                                           RTUNI_ALPHA, /* U+00ac1b: */
+                                           RTUNI_ALPHA, /* U+00ac1c: */
+                                           RTUNI_ALPHA, /* U+00ac1d: */
+                                           RTUNI_ALPHA, /* U+00ac1e: */
+                                           RTUNI_ALPHA, /* U+00ac1f: */
+                                           RTUNI_ALPHA, /* U+00ac20: */
+                                           RTUNI_ALPHA, /* U+00ac21: */
+                                           RTUNI_ALPHA, /* U+00ac22: */
+                                           RTUNI_ALPHA, /* U+00ac23: */
+                                           RTUNI_ALPHA, /* U+00ac24: */
+                                           RTUNI_ALPHA, /* U+00ac25: */
+                                           RTUNI_ALPHA, /* U+00ac26: */
+                                           RTUNI_ALPHA, /* U+00ac27: */
+                                           RTUNI_ALPHA, /* U+00ac28: */
+                                           RTUNI_ALPHA, /* U+00ac29: */
+                                           RTUNI_ALPHA, /* U+00ac2a: */
+                                           RTUNI_ALPHA, /* U+00ac2b: */
+                                           RTUNI_ALPHA, /* U+00ac2c: */
+                                           RTUNI_ALPHA, /* U+00ac2d: */
+                                           RTUNI_ALPHA, /* U+00ac2e: */
+                                           RTUNI_ALPHA, /* U+00ac2f: */
+                                           RTUNI_ALPHA, /* U+00ac30: */
+                                           RTUNI_ALPHA, /* U+00ac31: */
+                                           RTUNI_ALPHA, /* U+00ac32: */
+                                           RTUNI_ALPHA, /* U+00ac33: */
+                                           RTUNI_ALPHA, /* U+00ac34: */
+                                           RTUNI_ALPHA, /* U+00ac35: */
+                                           RTUNI_ALPHA, /* U+00ac36: */
+                                           RTUNI_ALPHA, /* U+00ac37: */
+                                           RTUNI_ALPHA, /* U+00ac38: */
+                                           RTUNI_ALPHA, /* U+00ac39: */
+                                           RTUNI_ALPHA, /* U+00ac3a: */
+                                           RTUNI_ALPHA, /* U+00ac3b: */
+                                           RTUNI_ALPHA, /* U+00ac3c: */
+                                           RTUNI_ALPHA, /* U+00ac3d: */
+                                           RTUNI_ALPHA, /* U+00ac3e: */
+                                           RTUNI_ALPHA, /* U+00ac3f: */
+                                           RTUNI_ALPHA, /* U+00ac40: */
+                                           RTUNI_ALPHA, /* U+00ac41: */
+                                           RTUNI_ALPHA, /* U+00ac42: */
+                                           RTUNI_ALPHA, /* U+00ac43: */
+                                           RTUNI_ALPHA, /* U+00ac44: */
+                                           RTUNI_ALPHA, /* U+00ac45: */
+                                           RTUNI_ALPHA, /* U+00ac46: */
+                                           RTUNI_ALPHA, /* U+00ac47: */
+                                           RTUNI_ALPHA, /* U+00ac48: */
+                                           RTUNI_ALPHA, /* U+00ac49: */
+                                           RTUNI_ALPHA, /* U+00ac4a: */
+                                           RTUNI_ALPHA, /* U+00ac4b: */
+                                           RTUNI_ALPHA, /* U+00ac4c: */
+                                           RTUNI_ALPHA, /* U+00ac4d: */
+                                           RTUNI_ALPHA, /* U+00ac4e: */
+                                           RTUNI_ALPHA, /* U+00ac4f: */
+                                           RTUNI_ALPHA, /* U+00ac50: */
+                                           RTUNI_ALPHA, /* U+00ac51: */
+                                           RTUNI_ALPHA, /* U+00ac52: */
+                                           RTUNI_ALPHA, /* U+00ac53: */
+                                           RTUNI_ALPHA, /* U+00ac54: */
+                                           RTUNI_ALPHA, /* U+00ac55: */
+                                           RTUNI_ALPHA, /* U+00ac56: */
+                                           RTUNI_ALPHA, /* U+00ac57: */
+                                           RTUNI_ALPHA, /* U+00ac58: */
+                                           RTUNI_ALPHA, /* U+00ac59: */
+                                           RTUNI_ALPHA, /* U+00ac5a: */
+                                           RTUNI_ALPHA, /* U+00ac5b: */
+                                           RTUNI_ALPHA, /* U+00ac5c: */
+                                           RTUNI_ALPHA, /* U+00ac5d: */
+                                           RTUNI_ALPHA, /* U+00ac5e: */
+                                           RTUNI_ALPHA, /* U+00ac5f: */
+                                           RTUNI_ALPHA, /* U+00ac60: */
+                                           RTUNI_ALPHA, /* U+00ac61: */
+                                           RTUNI_ALPHA, /* U+00ac62: */
+                                           RTUNI_ALPHA, /* U+00ac63: */
+                                           RTUNI_ALPHA, /* U+00ac64: */
+                                           RTUNI_ALPHA, /* U+00ac65: */
+                                           RTUNI_ALPHA, /* U+00ac66: */
+                                           RTUNI_ALPHA, /* U+00ac67: */
+                                           RTUNI_ALPHA, /* U+00ac68: */
+                                           RTUNI_ALPHA, /* U+00ac69: */
+                                           RTUNI_ALPHA, /* U+00ac6a: */
+                                           RTUNI_ALPHA, /* U+00ac6b: */
+                                           RTUNI_ALPHA, /* U+00ac6c: */
+                                           RTUNI_ALPHA, /* U+00ac6d: */
+                                           RTUNI_ALPHA, /* U+00ac6e: */
+                                           RTUNI_ALPHA, /* U+00ac6f: */
+                                           RTUNI_ALPHA, /* U+00ac70: */
+                                           RTUNI_ALPHA, /* U+00ac71: */
+                                           RTUNI_ALPHA, /* U+00ac72: */
+                                           RTUNI_ALPHA, /* U+00ac73: */
+                                           RTUNI_ALPHA, /* U+00ac74: */
+                                           RTUNI_ALPHA, /* U+00ac75: */
+                                           RTUNI_ALPHA, /* U+00ac76: */
+                                           RTUNI_ALPHA, /* U+00ac77: */
+                                           RTUNI_ALPHA, /* U+00ac78: */
+                                           RTUNI_ALPHA, /* U+00ac79: */
+                                           RTUNI_ALPHA, /* U+00ac7a: */
+                                           RTUNI_ALPHA, /* U+00ac7b: */
+                                           RTUNI_ALPHA, /* U+00ac7c: */
+                                           RTUNI_ALPHA, /* U+00ac7d: */
+                                           RTUNI_ALPHA, /* U+00ac7e: */
+                                           RTUNI_ALPHA, /* U+00ac7f: */
+                                           RTUNI_ALPHA, /* U+00ac80: */
+                                           RTUNI_ALPHA, /* U+00ac81: */
+                                           RTUNI_ALPHA, /* U+00ac82: */
+                                           RTUNI_ALPHA, /* U+00ac83: */
+                                           RTUNI_ALPHA, /* U+00ac84: */
+                                           RTUNI_ALPHA, /* U+00ac85: */
+                                           RTUNI_ALPHA, /* U+00ac86: */
+                                           RTUNI_ALPHA, /* U+00ac87: */
+                                           RTUNI_ALPHA, /* U+00ac88: */
+                                           RTUNI_ALPHA, /* U+00ac89: */
+                                           RTUNI_ALPHA, /* U+00ac8a: */
+                                           RTUNI_ALPHA, /* U+00ac8b: */
+                                           RTUNI_ALPHA, /* U+00ac8c: */
+                                           RTUNI_ALPHA, /* U+00ac8d: */
+                                           RTUNI_ALPHA, /* U+00ac8e: */
+                                           RTUNI_ALPHA, /* U+00ac8f: */
+                                           RTUNI_ALPHA, /* U+00ac90: */
+                                           RTUNI_ALPHA, /* U+00ac91: */
+                                           RTUNI_ALPHA, /* U+00ac92: */
+                                           RTUNI_ALPHA, /* U+00ac93: */
+                                           RTUNI_ALPHA, /* U+00ac94: */
+                                           RTUNI_ALPHA, /* U+00ac95: */
+                                           RTUNI_ALPHA, /* U+00ac96: */
+                                           RTUNI_ALPHA, /* U+00ac97: */
+                                           RTUNI_ALPHA, /* U+00ac98: */
+                                           RTUNI_ALPHA, /* U+00ac99: */
+                                           RTUNI_ALPHA, /* U+00ac9a: */
+                                           RTUNI_ALPHA, /* U+00ac9b: */
+                                           RTUNI_ALPHA, /* U+00ac9c: */
+                                           RTUNI_ALPHA, /* U+00ac9d: */
+                                           RTUNI_ALPHA, /* U+00ac9e: */
+                                           RTUNI_ALPHA, /* U+00ac9f: */
+                                           RTUNI_ALPHA, /* U+00aca0: */
+                                           RTUNI_ALPHA, /* U+00aca1: */
+                                           RTUNI_ALPHA, /* U+00aca2: */
+                                           RTUNI_ALPHA, /* U+00aca3: */
+                                           RTUNI_ALPHA, /* U+00aca4: */
+                                           RTUNI_ALPHA, /* U+00aca5: */
+                                           RTUNI_ALPHA, /* U+00aca6: */
+                                           RTUNI_ALPHA, /* U+00aca7: */
+                                           RTUNI_ALPHA, /* U+00aca8: */
+                                           RTUNI_ALPHA, /* U+00aca9: */
+                                           RTUNI_ALPHA, /* U+00acaa: */
+                                           RTUNI_ALPHA, /* U+00acab: */
+                                           RTUNI_ALPHA, /* U+00acac: */
+                                           RTUNI_ALPHA, /* U+00acad: */
+                                           RTUNI_ALPHA, /* U+00acae: */
+                                           RTUNI_ALPHA, /* U+00acaf: */
+                                           RTUNI_ALPHA, /* U+00acb0: */
+                                           RTUNI_ALPHA, /* U+00acb1: */
+                                           RTUNI_ALPHA, /* U+00acb2: */
+                                           RTUNI_ALPHA, /* U+00acb3: */
+                                           RTUNI_ALPHA, /* U+00acb4: */
+                                           RTUNI_ALPHA, /* U+00acb5: */
+                                           RTUNI_ALPHA, /* U+00acb6: */
+                                           RTUNI_ALPHA, /* U+00acb7: */
+                                           RTUNI_ALPHA, /* U+00acb8: */
+                                           RTUNI_ALPHA, /* U+00acb9: */
+                                           RTUNI_ALPHA, /* U+00acba: */
+                                           RTUNI_ALPHA, /* U+00acbb: */
+                                           RTUNI_ALPHA, /* U+00acbc: */
+                                           RTUNI_ALPHA, /* U+00acbd: */
+                                           RTUNI_ALPHA, /* U+00acbe: */
+                                           RTUNI_ALPHA, /* U+00acbf: */
+                                           RTUNI_ALPHA, /* U+00acc0: */
+                                           RTUNI_ALPHA, /* U+00acc1: */
+                                           RTUNI_ALPHA, /* U+00acc2: */
+                                           RTUNI_ALPHA, /* U+00acc3: */
+                                           RTUNI_ALPHA, /* U+00acc4: */
+                                           RTUNI_ALPHA, /* U+00acc5: */
+                                           RTUNI_ALPHA, /* U+00acc6: */
+                                           RTUNI_ALPHA, /* U+00acc7: */
+                                           RTUNI_ALPHA, /* U+00acc8: */
+                                           RTUNI_ALPHA, /* U+00acc9: */
+                                           RTUNI_ALPHA, /* U+00acca: */
+                                           RTUNI_ALPHA, /* U+00accb: */
+                                           RTUNI_ALPHA, /* U+00accc: */
+                                           RTUNI_ALPHA, /* U+00accd: */
+                                           RTUNI_ALPHA, /* U+00acce: */
+                                           RTUNI_ALPHA, /* U+00accf: */
+                                           RTUNI_ALPHA, /* U+00acd0: */
+                                           RTUNI_ALPHA, /* U+00acd1: */
+                                           RTUNI_ALPHA, /* U+00acd2: */
+                                           RTUNI_ALPHA, /* U+00acd3: */
+                                           RTUNI_ALPHA, /* U+00acd4: */
+                                           RTUNI_ALPHA, /* U+00acd5: */
+                                           RTUNI_ALPHA, /* U+00acd6: */
+                                           RTUNI_ALPHA, /* U+00acd7: */
+                                           RTUNI_ALPHA, /* U+00acd8: */
+                                           RTUNI_ALPHA, /* U+00acd9: */
+                                           RTUNI_ALPHA, /* U+00acda: */
+                                           RTUNI_ALPHA, /* U+00acdb: */
+                                           RTUNI_ALPHA, /* U+00acdc: */
+                                           RTUNI_ALPHA, /* U+00acdd: */
+                                           RTUNI_ALPHA, /* U+00acde: */
+                                           RTUNI_ALPHA, /* U+00acdf: */
+                                           RTUNI_ALPHA, /* U+00ace0: */
+                                           RTUNI_ALPHA, /* U+00ace1: */
+                                           RTUNI_ALPHA, /* U+00ace2: */
+                                           RTUNI_ALPHA, /* U+00ace3: */
+                                           RTUNI_ALPHA, /* U+00ace4: */
+                                           RTUNI_ALPHA, /* U+00ace5: */
+                                           RTUNI_ALPHA, /* U+00ace6: */
+                                           RTUNI_ALPHA, /* U+00ace7: */
+                                           RTUNI_ALPHA, /* U+00ace8: */
+                                           RTUNI_ALPHA, /* U+00ace9: */
+                                           RTUNI_ALPHA, /* U+00acea: */
+                                           RTUNI_ALPHA, /* U+00aceb: */
+                                           RTUNI_ALPHA, /* U+00acec: */
+                                           RTUNI_ALPHA, /* U+00aced: */
+                                           RTUNI_ALPHA, /* U+00acee: */
+                                           RTUNI_ALPHA, /* U+00acef: */
+                                           RTUNI_ALPHA, /* U+00acf0: */
+                                           RTUNI_ALPHA, /* U+00acf1: */
+                                           RTUNI_ALPHA, /* U+00acf2: */
+                                           RTUNI_ALPHA, /* U+00acf3: */
+                                           RTUNI_ALPHA, /* U+00acf4: */
+                                           RTUNI_ALPHA, /* U+00acf5: */
+                                           RTUNI_ALPHA, /* U+00acf6: */
+                                           RTUNI_ALPHA, /* U+00acf7: */
+                                           RTUNI_ALPHA, /* U+00acf8: */
+                                           RTUNI_ALPHA, /* U+00acf9: */
+                                           RTUNI_ALPHA, /* U+00acfa: */
+                                           RTUNI_ALPHA, /* U+00acfb: */
+                                           RTUNI_ALPHA, /* U+00acfc: */
+                                           RTUNI_ALPHA, /* U+00acfd: */
+                                           RTUNI_ALPHA, /* U+00acfe: */
+                                           RTUNI_ALPHA, /* U+00acff: */
+                                           RTUNI_ALPHA, /* U+00ad00: */
+                                           RTUNI_ALPHA, /* U+00ad01: */
+                                           RTUNI_ALPHA, /* U+00ad02: */
+                                           RTUNI_ALPHA, /* U+00ad03: */
+                                           RTUNI_ALPHA, /* U+00ad04: */
+                                           RTUNI_ALPHA, /* U+00ad05: */
+                                           RTUNI_ALPHA, /* U+00ad06: */
+                                           RTUNI_ALPHA, /* U+00ad07: */
+                                           RTUNI_ALPHA, /* U+00ad08: */
+                                           RTUNI_ALPHA, /* U+00ad09: */
+                                           RTUNI_ALPHA, /* U+00ad0a: */
+                                           RTUNI_ALPHA, /* U+00ad0b: */
+                                           RTUNI_ALPHA, /* U+00ad0c: */
+                                           RTUNI_ALPHA, /* U+00ad0d: */
+                                           RTUNI_ALPHA, /* U+00ad0e: */
+                                           RTUNI_ALPHA, /* U+00ad0f: */
+                                           RTUNI_ALPHA, /* U+00ad10: */
+                                           RTUNI_ALPHA, /* U+00ad11: */
+                                           RTUNI_ALPHA, /* U+00ad12: */
+                                           RTUNI_ALPHA, /* U+00ad13: */
+                                           RTUNI_ALPHA, /* U+00ad14: */
+                                           RTUNI_ALPHA, /* U+00ad15: */
+                                           RTUNI_ALPHA, /* U+00ad16: */
+                                           RTUNI_ALPHA, /* U+00ad17: */
+                                           RTUNI_ALPHA, /* U+00ad18: */
+                                           RTUNI_ALPHA, /* U+00ad19: */
+                                           RTUNI_ALPHA, /* U+00ad1a: */
+                                           RTUNI_ALPHA, /* U+00ad1b: */
+                                           RTUNI_ALPHA, /* U+00ad1c: */
+                                           RTUNI_ALPHA, /* U+00ad1d: */
+                                           RTUNI_ALPHA, /* U+00ad1e: */
+                                           RTUNI_ALPHA, /* U+00ad1f: */
+                                           RTUNI_ALPHA, /* U+00ad20: */
+                                           RTUNI_ALPHA, /* U+00ad21: */
+                                           RTUNI_ALPHA, /* U+00ad22: */
+                                           RTUNI_ALPHA, /* U+00ad23: */
+                                           RTUNI_ALPHA, /* U+00ad24: */
+                                           RTUNI_ALPHA, /* U+00ad25: */
+                                           RTUNI_ALPHA, /* U+00ad26: */
+                                           RTUNI_ALPHA, /* U+00ad27: */
+                                           RTUNI_ALPHA, /* U+00ad28: */
+                                           RTUNI_ALPHA, /* U+00ad29: */
+                                           RTUNI_ALPHA, /* U+00ad2a: */
+                                           RTUNI_ALPHA, /* U+00ad2b: */
+                                           RTUNI_ALPHA, /* U+00ad2c: */
+                                           RTUNI_ALPHA, /* U+00ad2d: */
+                                           RTUNI_ALPHA, /* U+00ad2e: */
+                                           RTUNI_ALPHA, /* U+00ad2f: */
+                                           RTUNI_ALPHA, /* U+00ad30: */
+                                           RTUNI_ALPHA, /* U+00ad31: */
+                                           RTUNI_ALPHA, /* U+00ad32: */
+                                           RTUNI_ALPHA, /* U+00ad33: */
+                                           RTUNI_ALPHA, /* U+00ad34: */
+                                           RTUNI_ALPHA, /* U+00ad35: */
+                                           RTUNI_ALPHA, /* U+00ad36: */
+                                           RTUNI_ALPHA, /* U+00ad37: */
+                                           RTUNI_ALPHA, /* U+00ad38: */
+                                           RTUNI_ALPHA, /* U+00ad39: */
+                                           RTUNI_ALPHA, /* U+00ad3a: */
+                                           RTUNI_ALPHA, /* U+00ad3b: */
+                                           RTUNI_ALPHA, /* U+00ad3c: */
+                                           RTUNI_ALPHA, /* U+00ad3d: */
+                                           RTUNI_ALPHA, /* U+00ad3e: */
+                                           RTUNI_ALPHA, /* U+00ad3f: */
+                                           RTUNI_ALPHA, /* U+00ad40: */
+                                           RTUNI_ALPHA, /* U+00ad41: */
+                                           RTUNI_ALPHA, /* U+00ad42: */
+                                           RTUNI_ALPHA, /* U+00ad43: */
+                                           RTUNI_ALPHA, /* U+00ad44: */
+                                           RTUNI_ALPHA, /* U+00ad45: */
+                                           RTUNI_ALPHA, /* U+00ad46: */
+                                           RTUNI_ALPHA, /* U+00ad47: */
+                                           RTUNI_ALPHA, /* U+00ad48: */
+                                           RTUNI_ALPHA, /* U+00ad49: */
+                                           RTUNI_ALPHA, /* U+00ad4a: */
+                                           RTUNI_ALPHA, /* U+00ad4b: */
+                                           RTUNI_ALPHA, /* U+00ad4c: */
+                                           RTUNI_ALPHA, /* U+00ad4d: */
+                                           RTUNI_ALPHA, /* U+00ad4e: */
+                                           RTUNI_ALPHA, /* U+00ad4f: */
+                                           RTUNI_ALPHA, /* U+00ad50: */
+                                           RTUNI_ALPHA, /* U+00ad51: */
+                                           RTUNI_ALPHA, /* U+00ad52: */
+                                           RTUNI_ALPHA, /* U+00ad53: */
+                                           RTUNI_ALPHA, /* U+00ad54: */
+                                           RTUNI_ALPHA, /* U+00ad55: */
+                                           RTUNI_ALPHA, /* U+00ad56: */
+                                           RTUNI_ALPHA, /* U+00ad57: */
+                                           RTUNI_ALPHA, /* U+00ad58: */
+                                           RTUNI_ALPHA, /* U+00ad59: */
+                                           RTUNI_ALPHA, /* U+00ad5a: */
+                                           RTUNI_ALPHA, /* U+00ad5b: */
+                                           RTUNI_ALPHA, /* U+00ad5c: */
+                                           RTUNI_ALPHA, /* U+00ad5d: */
+                                           RTUNI_ALPHA, /* U+00ad5e: */
+                                           RTUNI_ALPHA, /* U+00ad5f: */
+                                           RTUNI_ALPHA, /* U+00ad60: */
+                                           RTUNI_ALPHA, /* U+00ad61: */
+                                           RTUNI_ALPHA, /* U+00ad62: */
+                                           RTUNI_ALPHA, /* U+00ad63: */
+                                           RTUNI_ALPHA, /* U+00ad64: */
+                                           RTUNI_ALPHA, /* U+00ad65: */
+                                           RTUNI_ALPHA, /* U+00ad66: */
+                                           RTUNI_ALPHA, /* U+00ad67: */
+                                           RTUNI_ALPHA, /* U+00ad68: */
+                                           RTUNI_ALPHA, /* U+00ad69: */
+                                           RTUNI_ALPHA, /* U+00ad6a: */
+                                           RTUNI_ALPHA, /* U+00ad6b: */
+                                           RTUNI_ALPHA, /* U+00ad6c: */
+                                           RTUNI_ALPHA, /* U+00ad6d: */
+                                           RTUNI_ALPHA, /* U+00ad6e: */
+                                           RTUNI_ALPHA, /* U+00ad6f: */
+                                           RTUNI_ALPHA, /* U+00ad70: */
+                                           RTUNI_ALPHA, /* U+00ad71: */
+                                           RTUNI_ALPHA, /* U+00ad72: */
+                                           RTUNI_ALPHA, /* U+00ad73: */
+                                           RTUNI_ALPHA, /* U+00ad74: */
+                                           RTUNI_ALPHA, /* U+00ad75: */
+                                           RTUNI_ALPHA, /* U+00ad76: */
+                                           RTUNI_ALPHA, /* U+00ad77: */
+                                           RTUNI_ALPHA, /* U+00ad78: */
+                                           RTUNI_ALPHA, /* U+00ad79: */
+                                           RTUNI_ALPHA, /* U+00ad7a: */
+                                           RTUNI_ALPHA, /* U+00ad7b: */
+                                           RTUNI_ALPHA, /* U+00ad7c: */
+                                           RTUNI_ALPHA, /* U+00ad7d: */
+                                           RTUNI_ALPHA, /* U+00ad7e: */
+                                           RTUNI_ALPHA, /* U+00ad7f: */
+                                           RTUNI_ALPHA, /* U+00ad80: */
+                                           RTUNI_ALPHA, /* U+00ad81: */
+                                           RTUNI_ALPHA, /* U+00ad82: */
+                                           RTUNI_ALPHA, /* U+00ad83: */
+                                           RTUNI_ALPHA, /* U+00ad84: */
+                                           RTUNI_ALPHA, /* U+00ad85: */
+                                           RTUNI_ALPHA, /* U+00ad86: */
+                                           RTUNI_ALPHA, /* U+00ad87: */
+                                           RTUNI_ALPHA, /* U+00ad88: */
+                                           RTUNI_ALPHA, /* U+00ad89: */
+                                           RTUNI_ALPHA, /* U+00ad8a: */
+                                           RTUNI_ALPHA, /* U+00ad8b: */
+                                           RTUNI_ALPHA, /* U+00ad8c: */
+                                           RTUNI_ALPHA, /* U+00ad8d: */
+                                           RTUNI_ALPHA, /* U+00ad8e: */
+                                           RTUNI_ALPHA, /* U+00ad8f: */
+                                           RTUNI_ALPHA, /* U+00ad90: */
+                                           RTUNI_ALPHA, /* U+00ad91: */
+                                           RTUNI_ALPHA, /* U+00ad92: */
+                                           RTUNI_ALPHA, /* U+00ad93: */
+                                           RTUNI_ALPHA, /* U+00ad94: */
+                                           RTUNI_ALPHA, /* U+00ad95: */
+                                           RTUNI_ALPHA, /* U+00ad96: */
+                                           RTUNI_ALPHA, /* U+00ad97: */
+                                           RTUNI_ALPHA, /* U+00ad98: */
+                                           RTUNI_ALPHA, /* U+00ad99: */
+                                           RTUNI_ALPHA, /* U+00ad9a: */
+                                           RTUNI_ALPHA, /* U+00ad9b: */
+                                           RTUNI_ALPHA, /* U+00ad9c: */
+                                           RTUNI_ALPHA, /* U+00ad9d: */
+                                           RTUNI_ALPHA, /* U+00ad9e: */
+                                           RTUNI_ALPHA, /* U+00ad9f: */
+                                           RTUNI_ALPHA, /* U+00ada0: */
+                                           RTUNI_ALPHA, /* U+00ada1: */
+                                           RTUNI_ALPHA, /* U+00ada2: */
+                                           RTUNI_ALPHA, /* U+00ada3: */
+                                           RTUNI_ALPHA, /* U+00ada4: */
+                                           RTUNI_ALPHA, /* U+00ada5: */
+                                           RTUNI_ALPHA, /* U+00ada6: */
+                                           RTUNI_ALPHA, /* U+00ada7: */
+                                           RTUNI_ALPHA, /* U+00ada8: */
+                                           RTUNI_ALPHA, /* U+00ada9: */
+                                           RTUNI_ALPHA, /* U+00adaa: */
+                                           RTUNI_ALPHA, /* U+00adab: */
+                                           RTUNI_ALPHA, /* U+00adac: */
+                                           RTUNI_ALPHA, /* U+00adad: */
+                                           RTUNI_ALPHA, /* U+00adae: */
+                                           RTUNI_ALPHA, /* U+00adaf: */
+                                           RTUNI_ALPHA, /* U+00adb0: */
+                                           RTUNI_ALPHA, /* U+00adb1: */
+                                           RTUNI_ALPHA, /* U+00adb2: */
+                                           RTUNI_ALPHA, /* U+00adb3: */
+                                           RTUNI_ALPHA, /* U+00adb4: */
+                                           RTUNI_ALPHA, /* U+00adb5: */
+                                           RTUNI_ALPHA, /* U+00adb6: */
+                                           RTUNI_ALPHA, /* U+00adb7: */
+                                           RTUNI_ALPHA, /* U+00adb8: */
+                                           RTUNI_ALPHA, /* U+00adb9: */
+                                           RTUNI_ALPHA, /* U+00adba: */
+                                           RTUNI_ALPHA, /* U+00adbb: */
+                                           RTUNI_ALPHA, /* U+00adbc: */
+                                           RTUNI_ALPHA, /* U+00adbd: */
+                                           RTUNI_ALPHA, /* U+00adbe: */
+                                           RTUNI_ALPHA, /* U+00adbf: */
+                                           RTUNI_ALPHA, /* U+00adc0: */
+                                           RTUNI_ALPHA, /* U+00adc1: */
+                                           RTUNI_ALPHA, /* U+00adc2: */
+                                           RTUNI_ALPHA, /* U+00adc3: */
+                                           RTUNI_ALPHA, /* U+00adc4: */
+                                           RTUNI_ALPHA, /* U+00adc5: */
+                                           RTUNI_ALPHA, /* U+00adc6: */
+                                           RTUNI_ALPHA, /* U+00adc7: */
+                                           RTUNI_ALPHA, /* U+00adc8: */
+                                           RTUNI_ALPHA, /* U+00adc9: */
+                                           RTUNI_ALPHA, /* U+00adca: */
+                                           RTUNI_ALPHA, /* U+00adcb: */
+                                           RTUNI_ALPHA, /* U+00adcc: */
+                                           RTUNI_ALPHA, /* U+00adcd: */
+                                           RTUNI_ALPHA, /* U+00adce: */
+                                           RTUNI_ALPHA, /* U+00adcf: */
+                                           RTUNI_ALPHA, /* U+00add0: */
+                                           RTUNI_ALPHA, /* U+00add1: */
+                                           RTUNI_ALPHA, /* U+00add2: */
+                                           RTUNI_ALPHA, /* U+00add3: */
+                                           RTUNI_ALPHA, /* U+00add4: */
+                                           RTUNI_ALPHA, /* U+00add5: */
+                                           RTUNI_ALPHA, /* U+00add6: */
+                                           RTUNI_ALPHA, /* U+00add7: */
+                                           RTUNI_ALPHA, /* U+00add8: */
+                                           RTUNI_ALPHA, /* U+00add9: */
+                                           RTUNI_ALPHA, /* U+00adda: */
+                                           RTUNI_ALPHA, /* U+00addb: */
+                                           RTUNI_ALPHA, /* U+00addc: */
+                                           RTUNI_ALPHA, /* U+00addd: */
+                                           RTUNI_ALPHA, /* U+00adde: */
+                                           RTUNI_ALPHA, /* U+00addf: */
+                                           RTUNI_ALPHA, /* U+00ade0: */
+                                           RTUNI_ALPHA, /* U+00ade1: */
+                                           RTUNI_ALPHA, /* U+00ade2: */
+                                           RTUNI_ALPHA, /* U+00ade3: */
+                                           RTUNI_ALPHA, /* U+00ade4: */
+                                           RTUNI_ALPHA, /* U+00ade5: */
+                                           RTUNI_ALPHA, /* U+00ade6: */
+                                           RTUNI_ALPHA, /* U+00ade7: */
+                                           RTUNI_ALPHA, /* U+00ade8: */
+                                           RTUNI_ALPHA, /* U+00ade9: */
+                                           RTUNI_ALPHA, /* U+00adea: */
+                                           RTUNI_ALPHA, /* U+00adeb: */
+                                           RTUNI_ALPHA, /* U+00adec: */
+                                           RTUNI_ALPHA, /* U+00aded: */
+                                           RTUNI_ALPHA, /* U+00adee: */
+                                           RTUNI_ALPHA, /* U+00adef: */
+                                           RTUNI_ALPHA, /* U+00adf0: */
+                                           RTUNI_ALPHA, /* U+00adf1: */
+                                           RTUNI_ALPHA, /* U+00adf2: */
+                                           RTUNI_ALPHA, /* U+00adf3: */
+                                           RTUNI_ALPHA, /* U+00adf4: */
+                                           RTUNI_ALPHA, /* U+00adf5: */
+                                           RTUNI_ALPHA, /* U+00adf6: */
+                                           RTUNI_ALPHA, /* U+00adf7: */
+                                           RTUNI_ALPHA, /* U+00adf8: */
+                                           RTUNI_ALPHA, /* U+00adf9: */
+                                           RTUNI_ALPHA, /* U+00adfa: */
+                                           RTUNI_ALPHA, /* U+00adfb: */
+                                           RTUNI_ALPHA, /* U+00adfc: */
+                                           RTUNI_ALPHA, /* U+00adfd: */
+                                           RTUNI_ALPHA, /* U+00adfe: */
+                                           RTUNI_ALPHA, /* U+00adff: */
+                                           RTUNI_ALPHA, /* U+00ae00: */
+                                           RTUNI_ALPHA, /* U+00ae01: */
+                                           RTUNI_ALPHA, /* U+00ae02: */
+                                           RTUNI_ALPHA, /* U+00ae03: */
+                                           RTUNI_ALPHA, /* U+00ae04: */
+                                           RTUNI_ALPHA, /* U+00ae05: */
+                                           RTUNI_ALPHA, /* U+00ae06: */
+                                           RTUNI_ALPHA, /* U+00ae07: */
+                                           RTUNI_ALPHA, /* U+00ae08: */
+                                           RTUNI_ALPHA, /* U+00ae09: */
+                                           RTUNI_ALPHA, /* U+00ae0a: */
+                                           RTUNI_ALPHA, /* U+00ae0b: */
+                                           RTUNI_ALPHA, /* U+00ae0c: */
+                                           RTUNI_ALPHA, /* U+00ae0d: */
+                                           RTUNI_ALPHA, /* U+00ae0e: */
+                                           RTUNI_ALPHA, /* U+00ae0f: */
+                                           RTUNI_ALPHA, /* U+00ae10: */
+                                           RTUNI_ALPHA, /* U+00ae11: */
+                                           RTUNI_ALPHA, /* U+00ae12: */
+                                           RTUNI_ALPHA, /* U+00ae13: */
+                                           RTUNI_ALPHA, /* U+00ae14: */
+                                           RTUNI_ALPHA, /* U+00ae15: */
+                                           RTUNI_ALPHA, /* U+00ae16: */
+                                           RTUNI_ALPHA, /* U+00ae17: */
+                                           RTUNI_ALPHA, /* U+00ae18: */
+                                           RTUNI_ALPHA, /* U+00ae19: */
+                                           RTUNI_ALPHA, /* U+00ae1a: */
+                                           RTUNI_ALPHA, /* U+00ae1b: */
+                                           RTUNI_ALPHA, /* U+00ae1c: */
+                                           RTUNI_ALPHA, /* U+00ae1d: */
+                                           RTUNI_ALPHA, /* U+00ae1e: */
+                                           RTUNI_ALPHA, /* U+00ae1f: */
+                                           RTUNI_ALPHA, /* U+00ae20: */
+                                           RTUNI_ALPHA, /* U+00ae21: */
+                                           RTUNI_ALPHA, /* U+00ae22: */
+                                           RTUNI_ALPHA, /* U+00ae23: */
+                                           RTUNI_ALPHA, /* U+00ae24: */
+                                           RTUNI_ALPHA, /* U+00ae25: */
+                                           RTUNI_ALPHA, /* U+00ae26: */
+                                           RTUNI_ALPHA, /* U+00ae27: */
+                                           RTUNI_ALPHA, /* U+00ae28: */
+                                           RTUNI_ALPHA, /* U+00ae29: */
+                                           RTUNI_ALPHA, /* U+00ae2a: */
+                                           RTUNI_ALPHA, /* U+00ae2b: */
+                                           RTUNI_ALPHA, /* U+00ae2c: */
+                                           RTUNI_ALPHA, /* U+00ae2d: */
+                                           RTUNI_ALPHA, /* U+00ae2e: */
+                                           RTUNI_ALPHA, /* U+00ae2f: */
+                                           RTUNI_ALPHA, /* U+00ae30: */
+                                           RTUNI_ALPHA, /* U+00ae31: */
+                                           RTUNI_ALPHA, /* U+00ae32: */
+                                           RTUNI_ALPHA, /* U+00ae33: */
+                                           RTUNI_ALPHA, /* U+00ae34: */
+                                           RTUNI_ALPHA, /* U+00ae35: */
+                                           RTUNI_ALPHA, /* U+00ae36: */
+                                           RTUNI_ALPHA, /* U+00ae37: */
+                                           RTUNI_ALPHA, /* U+00ae38: */
+                                           RTUNI_ALPHA, /* U+00ae39: */
+                                           RTUNI_ALPHA, /* U+00ae3a: */
+                                           RTUNI_ALPHA, /* U+00ae3b: */
+                                           RTUNI_ALPHA, /* U+00ae3c: */
+                                           RTUNI_ALPHA, /* U+00ae3d: */
+                                           RTUNI_ALPHA, /* U+00ae3e: */
+                                           RTUNI_ALPHA, /* U+00ae3f: */
+                                           RTUNI_ALPHA, /* U+00ae40: */
+                                           RTUNI_ALPHA, /* U+00ae41: */
+                                           RTUNI_ALPHA, /* U+00ae42: */
+                                           RTUNI_ALPHA, /* U+00ae43: */
+                                           RTUNI_ALPHA, /* U+00ae44: */
+                                           RTUNI_ALPHA, /* U+00ae45: */
+                                           RTUNI_ALPHA, /* U+00ae46: */
+                                           RTUNI_ALPHA, /* U+00ae47: */
+                                           RTUNI_ALPHA, /* U+00ae48: */
+                                           RTUNI_ALPHA, /* U+00ae49: */
+                                           RTUNI_ALPHA, /* U+00ae4a: */
+                                           RTUNI_ALPHA, /* U+00ae4b: */
+                                           RTUNI_ALPHA, /* U+00ae4c: */
+                                           RTUNI_ALPHA, /* U+00ae4d: */
+                                           RTUNI_ALPHA, /* U+00ae4e: */
+                                           RTUNI_ALPHA, /* U+00ae4f: */
+                                           RTUNI_ALPHA, /* U+00ae50: */
+                                           RTUNI_ALPHA, /* U+00ae51: */
+                                           RTUNI_ALPHA, /* U+00ae52: */
+                                           RTUNI_ALPHA, /* U+00ae53: */
+                                           RTUNI_ALPHA, /* U+00ae54: */
+                                           RTUNI_ALPHA, /* U+00ae55: */
+                                           RTUNI_ALPHA, /* U+00ae56: */
+                                           RTUNI_ALPHA, /* U+00ae57: */
+                                           RTUNI_ALPHA, /* U+00ae58: */
+                                           RTUNI_ALPHA, /* U+00ae59: */
+                                           RTUNI_ALPHA, /* U+00ae5a: */
+                                           RTUNI_ALPHA, /* U+00ae5b: */
+                                           RTUNI_ALPHA, /* U+00ae5c: */
+                                           RTUNI_ALPHA, /* U+00ae5d: */
+                                           RTUNI_ALPHA, /* U+00ae5e: */
+                                           RTUNI_ALPHA, /* U+00ae5f: */
+                                           RTUNI_ALPHA, /* U+00ae60: */
+                                           RTUNI_ALPHA, /* U+00ae61: */
+                                           RTUNI_ALPHA, /* U+00ae62: */
+                                           RTUNI_ALPHA, /* U+00ae63: */
+                                           RTUNI_ALPHA, /* U+00ae64: */
+                                           RTUNI_ALPHA, /* U+00ae65: */
+                                           RTUNI_ALPHA, /* U+00ae66: */
+                                           RTUNI_ALPHA, /* U+00ae67: */
+                                           RTUNI_ALPHA, /* U+00ae68: */
+                                           RTUNI_ALPHA, /* U+00ae69: */
+                                           RTUNI_ALPHA, /* U+00ae6a: */
+                                           RTUNI_ALPHA, /* U+00ae6b: */
+                                           RTUNI_ALPHA, /* U+00ae6c: */
+                                           RTUNI_ALPHA, /* U+00ae6d: */
+                                           RTUNI_ALPHA, /* U+00ae6e: */
+                                           RTUNI_ALPHA, /* U+00ae6f: */
+                                           RTUNI_ALPHA, /* U+00ae70: */
+                                           RTUNI_ALPHA, /* U+00ae71: */
+                                           RTUNI_ALPHA, /* U+00ae72: */
+                                           RTUNI_ALPHA, /* U+00ae73: */
+                                           RTUNI_ALPHA, /* U+00ae74: */
+                                           RTUNI_ALPHA, /* U+00ae75: */
+                                           RTUNI_ALPHA, /* U+00ae76: */
+                                           RTUNI_ALPHA, /* U+00ae77: */
+                                           RTUNI_ALPHA, /* U+00ae78: */
+                                           RTUNI_ALPHA, /* U+00ae79: */
+                                           RTUNI_ALPHA, /* U+00ae7a: */
+                                           RTUNI_ALPHA, /* U+00ae7b: */
+                                           RTUNI_ALPHA, /* U+00ae7c: */
+                                           RTUNI_ALPHA, /* U+00ae7d: */
+                                           RTUNI_ALPHA, /* U+00ae7e: */
+                                           RTUNI_ALPHA, /* U+00ae7f: */
+                                           RTUNI_ALPHA, /* U+00ae80: */
+                                           RTUNI_ALPHA, /* U+00ae81: */
+                                           RTUNI_ALPHA, /* U+00ae82: */
+                                           RTUNI_ALPHA, /* U+00ae83: */
+                                           RTUNI_ALPHA, /* U+00ae84: */
+                                           RTUNI_ALPHA, /* U+00ae85: */
+                                           RTUNI_ALPHA, /* U+00ae86: */
+                                           RTUNI_ALPHA, /* U+00ae87: */
+                                           RTUNI_ALPHA, /* U+00ae88: */
+                                           RTUNI_ALPHA, /* U+00ae89: */
+                                           RTUNI_ALPHA, /* U+00ae8a: */
+                                           RTUNI_ALPHA, /* U+00ae8b: */
+                                           RTUNI_ALPHA, /* U+00ae8c: */
+                                           RTUNI_ALPHA, /* U+00ae8d: */
+                                           RTUNI_ALPHA, /* U+00ae8e: */
+                                           RTUNI_ALPHA, /* U+00ae8f: */
+                                           RTUNI_ALPHA, /* U+00ae90: */
+                                           RTUNI_ALPHA, /* U+00ae91: */
+                                           RTUNI_ALPHA, /* U+00ae92: */
+                                           RTUNI_ALPHA, /* U+00ae93: */
+                                           RTUNI_ALPHA, /* U+00ae94: */
+                                           RTUNI_ALPHA, /* U+00ae95: */
+                                           RTUNI_ALPHA, /* U+00ae96: */
+                                           RTUNI_ALPHA, /* U+00ae97: */
+                                           RTUNI_ALPHA, /* U+00ae98: */
+                                           RTUNI_ALPHA, /* U+00ae99: */
+                                           RTUNI_ALPHA, /* U+00ae9a: */
+                                           RTUNI_ALPHA, /* U+00ae9b: */
+                                           RTUNI_ALPHA, /* U+00ae9c: */
+                                           RTUNI_ALPHA, /* U+00ae9d: */
+                                           RTUNI_ALPHA, /* U+00ae9e: */
+                                           RTUNI_ALPHA, /* U+00ae9f: */
+                                           RTUNI_ALPHA, /* U+00aea0: */
+                                           RTUNI_ALPHA, /* U+00aea1: */
+                                           RTUNI_ALPHA, /* U+00aea2: */
+                                           RTUNI_ALPHA, /* U+00aea3: */
+                                           RTUNI_ALPHA, /* U+00aea4: */
+                                           RTUNI_ALPHA, /* U+00aea5: */
+                                           RTUNI_ALPHA, /* U+00aea6: */
+                                           RTUNI_ALPHA, /* U+00aea7: */
+                                           RTUNI_ALPHA, /* U+00aea8: */
+                                           RTUNI_ALPHA, /* U+00aea9: */
+                                           RTUNI_ALPHA, /* U+00aeaa: */
+                                           RTUNI_ALPHA, /* U+00aeab: */
+                                           RTUNI_ALPHA, /* U+00aeac: */
+                                           RTUNI_ALPHA, /* U+00aead: */
+                                           RTUNI_ALPHA, /* U+00aeae: */
+                                           RTUNI_ALPHA, /* U+00aeaf: */
+                                           RTUNI_ALPHA, /* U+00aeb0: */
+                                           RTUNI_ALPHA, /* U+00aeb1: */
+                                           RTUNI_ALPHA, /* U+00aeb2: */
+                                           RTUNI_ALPHA, /* U+00aeb3: */
+                                           RTUNI_ALPHA, /* U+00aeb4: */
+                                           RTUNI_ALPHA, /* U+00aeb5: */
+                                           RTUNI_ALPHA, /* U+00aeb6: */
+                                           RTUNI_ALPHA, /* U+00aeb7: */
+                                           RTUNI_ALPHA, /* U+00aeb8: */
+                                           RTUNI_ALPHA, /* U+00aeb9: */
+                                           RTUNI_ALPHA, /* U+00aeba: */
+                                           RTUNI_ALPHA, /* U+00aebb: */
+                                           RTUNI_ALPHA, /* U+00aebc: */
+                                           RTUNI_ALPHA, /* U+00aebd: */
+                                           RTUNI_ALPHA, /* U+00aebe: */
+                                           RTUNI_ALPHA, /* U+00aebf: */
+                                           RTUNI_ALPHA, /* U+00aec0: */
+                                           RTUNI_ALPHA, /* U+00aec1: */
+                                           RTUNI_ALPHA, /* U+00aec2: */
+                                           RTUNI_ALPHA, /* U+00aec3: */
+                                           RTUNI_ALPHA, /* U+00aec4: */
+                                           RTUNI_ALPHA, /* U+00aec5: */
+                                           RTUNI_ALPHA, /* U+00aec6: */
+                                           RTUNI_ALPHA, /* U+00aec7: */
+                                           RTUNI_ALPHA, /* U+00aec8: */
+                                           RTUNI_ALPHA, /* U+00aec9: */
+                                           RTUNI_ALPHA, /* U+00aeca: */
+                                           RTUNI_ALPHA, /* U+00aecb: */
+                                           RTUNI_ALPHA, /* U+00aecc: */
+                                           RTUNI_ALPHA, /* U+00aecd: */
+                                           RTUNI_ALPHA, /* U+00aece: */
+                                           RTUNI_ALPHA, /* U+00aecf: */
+                                           RTUNI_ALPHA, /* U+00aed0: */
+                                           RTUNI_ALPHA, /* U+00aed1: */
+                                           RTUNI_ALPHA, /* U+00aed2: */
+                                           RTUNI_ALPHA, /* U+00aed3: */
+                                           RTUNI_ALPHA, /* U+00aed4: */
+                                           RTUNI_ALPHA, /* U+00aed5: */
+                                           RTUNI_ALPHA, /* U+00aed6: */
+                                           RTUNI_ALPHA, /* U+00aed7: */
+                                           RTUNI_ALPHA, /* U+00aed8: */
+                                           RTUNI_ALPHA, /* U+00aed9: */
+                                           RTUNI_ALPHA, /* U+00aeda: */
+                                           RTUNI_ALPHA, /* U+00aedb: */
+                                           RTUNI_ALPHA, /* U+00aedc: */
+                                           RTUNI_ALPHA, /* U+00aedd: */
+                                           RTUNI_ALPHA, /* U+00aede: */
+                                           RTUNI_ALPHA, /* U+00aedf: */
+                                           RTUNI_ALPHA, /* U+00aee0: */
+                                           RTUNI_ALPHA, /* U+00aee1: */
+                                           RTUNI_ALPHA, /* U+00aee2: */
+                                           RTUNI_ALPHA, /* U+00aee3: */
+                                           RTUNI_ALPHA, /* U+00aee4: */
+                                           RTUNI_ALPHA, /* U+00aee5: */
+                                           RTUNI_ALPHA, /* U+00aee6: */
+                                           RTUNI_ALPHA, /* U+00aee7: */
+                                           RTUNI_ALPHA, /* U+00aee8: */
+                                           RTUNI_ALPHA, /* U+00aee9: */
+                                           RTUNI_ALPHA, /* U+00aeea: */
+                                           RTUNI_ALPHA, /* U+00aeeb: */
+                                           RTUNI_ALPHA, /* U+00aeec: */
+                                           RTUNI_ALPHA, /* U+00aeed: */
+                                           RTUNI_ALPHA, /* U+00aeee: */
+                                           RTUNI_ALPHA, /* U+00aeef: */
+                                           RTUNI_ALPHA, /* U+00aef0: */
+                                           RTUNI_ALPHA, /* U+00aef1: */
+                                           RTUNI_ALPHA, /* U+00aef2: */
+                                           RTUNI_ALPHA, /* U+00aef3: */
+                                           RTUNI_ALPHA, /* U+00aef4: */
+                                           RTUNI_ALPHA, /* U+00aef5: */
+                                           RTUNI_ALPHA, /* U+00aef6: */
+                                           RTUNI_ALPHA, /* U+00aef7: */
+                                           RTUNI_ALPHA, /* U+00aef8: */
+                                           RTUNI_ALPHA, /* U+00aef9: */
+                                           RTUNI_ALPHA, /* U+00aefa: */
+                                           RTUNI_ALPHA, /* U+00aefb: */
+                                           RTUNI_ALPHA, /* U+00aefc: */
+                                           RTUNI_ALPHA, /* U+00aefd: */
+                                           RTUNI_ALPHA, /* U+00aefe: */
+                                           RTUNI_ALPHA, /* U+00aeff: */
+                                           RTUNI_ALPHA, /* U+00af00: */
+                                           RTUNI_ALPHA, /* U+00af01: */
+                                           RTUNI_ALPHA, /* U+00af02: */
+                                           RTUNI_ALPHA, /* U+00af03: */
+                                           RTUNI_ALPHA, /* U+00af04: */
+                                           RTUNI_ALPHA, /* U+00af05: */
+                                           RTUNI_ALPHA, /* U+00af06: */
+                                           RTUNI_ALPHA, /* U+00af07: */
+                                           RTUNI_ALPHA, /* U+00af08: */
+                                           RTUNI_ALPHA, /* U+00af09: */
+                                           RTUNI_ALPHA, /* U+00af0a: */
+                                           RTUNI_ALPHA, /* U+00af0b: */
+                                           RTUNI_ALPHA, /* U+00af0c: */
+                                           RTUNI_ALPHA, /* U+00af0d: */
+                                           RTUNI_ALPHA, /* U+00af0e: */
+                                           RTUNI_ALPHA, /* U+00af0f: */
+                                           RTUNI_ALPHA, /* U+00af10: */
+                                           RTUNI_ALPHA, /* U+00af11: */
+                                           RTUNI_ALPHA, /* U+00af12: */
+                                           RTUNI_ALPHA, /* U+00af13: */
+                                           RTUNI_ALPHA, /* U+00af14: */
+                                           RTUNI_ALPHA, /* U+00af15: */
+                                           RTUNI_ALPHA, /* U+00af16: */
+                                           RTUNI_ALPHA, /* U+00af17: */
+                                           RTUNI_ALPHA, /* U+00af18: */
+                                           RTUNI_ALPHA, /* U+00af19: */
+                                           RTUNI_ALPHA, /* U+00af1a: */
+                                           RTUNI_ALPHA, /* U+00af1b: */
+                                           RTUNI_ALPHA, /* U+00af1c: */
+                                           RTUNI_ALPHA, /* U+00af1d: */
+                                           RTUNI_ALPHA, /* U+00af1e: */
+                                           RTUNI_ALPHA, /* U+00af1f: */
+                                           RTUNI_ALPHA, /* U+00af20: */
+                                           RTUNI_ALPHA, /* U+00af21: */
+                                           RTUNI_ALPHA, /* U+00af22: */
+                                           RTUNI_ALPHA, /* U+00af23: */
+                                           RTUNI_ALPHA, /* U+00af24: */
+                                           RTUNI_ALPHA, /* U+00af25: */
+                                           RTUNI_ALPHA, /* U+00af26: */
+                                           RTUNI_ALPHA, /* U+00af27: */
+                                           RTUNI_ALPHA, /* U+00af28: */
+                                           RTUNI_ALPHA, /* U+00af29: */
+                                           RTUNI_ALPHA, /* U+00af2a: */
+                                           RTUNI_ALPHA, /* U+00af2b: */
+                                           RTUNI_ALPHA, /* U+00af2c: */
+                                           RTUNI_ALPHA, /* U+00af2d: */
+                                           RTUNI_ALPHA, /* U+00af2e: */
+                                           RTUNI_ALPHA, /* U+00af2f: */
+                                           RTUNI_ALPHA, /* U+00af30: */
+                                           RTUNI_ALPHA, /* U+00af31: */
+                                           RTUNI_ALPHA, /* U+00af32: */
+                                           RTUNI_ALPHA, /* U+00af33: */
+                                           RTUNI_ALPHA, /* U+00af34: */
+                                           RTUNI_ALPHA, /* U+00af35: */
+                                           RTUNI_ALPHA, /* U+00af36: */
+                                           RTUNI_ALPHA, /* U+00af37: */
+                                           RTUNI_ALPHA, /* U+00af38: */
+                                           RTUNI_ALPHA, /* U+00af39: */
+                                           RTUNI_ALPHA, /* U+00af3a: */
+                                           RTUNI_ALPHA, /* U+00af3b: */
+                                           RTUNI_ALPHA, /* U+00af3c: */
+                                           RTUNI_ALPHA, /* U+00af3d: */
+                                           RTUNI_ALPHA, /* U+00af3e: */
+                                           RTUNI_ALPHA, /* U+00af3f: */
+                                           RTUNI_ALPHA, /* U+00af40: */
+                                           RTUNI_ALPHA, /* U+00af41: */
+                                           RTUNI_ALPHA, /* U+00af42: */
+                                           RTUNI_ALPHA, /* U+00af43: */
+                                           RTUNI_ALPHA, /* U+00af44: */
+                                           RTUNI_ALPHA, /* U+00af45: */
+                                           RTUNI_ALPHA, /* U+00af46: */
+                                           RTUNI_ALPHA, /* U+00af47: */
+                                           RTUNI_ALPHA, /* U+00af48: */
+                                           RTUNI_ALPHA, /* U+00af49: */
+                                           RTUNI_ALPHA, /* U+00af4a: */
+                                           RTUNI_ALPHA, /* U+00af4b: */
+                                           RTUNI_ALPHA, /* U+00af4c: */
+                                           RTUNI_ALPHA, /* U+00af4d: */
+                                           RTUNI_ALPHA, /* U+00af4e: */
+                                           RTUNI_ALPHA, /* U+00af4f: */
+                                           RTUNI_ALPHA, /* U+00af50: */
+                                           RTUNI_ALPHA, /* U+00af51: */
+                                           RTUNI_ALPHA, /* U+00af52: */
+                                           RTUNI_ALPHA, /* U+00af53: */
+                                           RTUNI_ALPHA, /* U+00af54: */
+                                           RTUNI_ALPHA, /* U+00af55: */
+                                           RTUNI_ALPHA, /* U+00af56: */
+                                           RTUNI_ALPHA, /* U+00af57: */
+                                           RTUNI_ALPHA, /* U+00af58: */
+                                           RTUNI_ALPHA, /* U+00af59: */
+                                           RTUNI_ALPHA, /* U+00af5a: */
+                                           RTUNI_ALPHA, /* U+00af5b: */
+                                           RTUNI_ALPHA, /* U+00af5c: */
+                                           RTUNI_ALPHA, /* U+00af5d: */
+                                           RTUNI_ALPHA, /* U+00af5e: */
+                                           RTUNI_ALPHA, /* U+00af5f: */
+                                           RTUNI_ALPHA, /* U+00af60: */
+                                           RTUNI_ALPHA, /* U+00af61: */
+                                           RTUNI_ALPHA, /* U+00af62: */
+                                           RTUNI_ALPHA, /* U+00af63: */
+                                           RTUNI_ALPHA, /* U+00af64: */
+                                           RTUNI_ALPHA, /* U+00af65: */
+                                           RTUNI_ALPHA, /* U+00af66: */
+                                           RTUNI_ALPHA, /* U+00af67: */
+                                           RTUNI_ALPHA, /* U+00af68: */
+                                           RTUNI_ALPHA, /* U+00af69: */
+                                           RTUNI_ALPHA, /* U+00af6a: */
+                                           RTUNI_ALPHA, /* U+00af6b: */
+                                           RTUNI_ALPHA, /* U+00af6c: */
+                                           RTUNI_ALPHA, /* U+00af6d: */
+                                           RTUNI_ALPHA, /* U+00af6e: */
+                                           RTUNI_ALPHA, /* U+00af6f: */
+                                           RTUNI_ALPHA, /* U+00af70: */
+                                           RTUNI_ALPHA, /* U+00af71: */
+                                           RTUNI_ALPHA, /* U+00af72: */
+                                           RTUNI_ALPHA, /* U+00af73: */
+                                           RTUNI_ALPHA, /* U+00af74: */
+                                           RTUNI_ALPHA, /* U+00af75: */
+                                           RTUNI_ALPHA, /* U+00af76: */
+                                           RTUNI_ALPHA, /* U+00af77: */
+                                           RTUNI_ALPHA, /* U+00af78: */
+                                           RTUNI_ALPHA, /* U+00af79: */
+                                           RTUNI_ALPHA, /* U+00af7a: */
+                                           RTUNI_ALPHA, /* U+00af7b: */
+                                           RTUNI_ALPHA, /* U+00af7c: */
+                                           RTUNI_ALPHA, /* U+00af7d: */
+                                           RTUNI_ALPHA, /* U+00af7e: */
+                                           RTUNI_ALPHA, /* U+00af7f: */
+                                           RTUNI_ALPHA, /* U+00af80: */
+                                           RTUNI_ALPHA, /* U+00af81: */
+                                           RTUNI_ALPHA, /* U+00af82: */
+                                           RTUNI_ALPHA, /* U+00af83: */
+                                           RTUNI_ALPHA, /* U+00af84: */
+                                           RTUNI_ALPHA, /* U+00af85: */
+                                           RTUNI_ALPHA, /* U+00af86: */
+                                           RTUNI_ALPHA, /* U+00af87: */
+                                           RTUNI_ALPHA, /* U+00af88: */
+                                           RTUNI_ALPHA, /* U+00af89: */
+                                           RTUNI_ALPHA, /* U+00af8a: */
+                                           RTUNI_ALPHA, /* U+00af8b: */
+                                           RTUNI_ALPHA, /* U+00af8c: */
+                                           RTUNI_ALPHA, /* U+00af8d: */
+                                           RTUNI_ALPHA, /* U+00af8e: */
+                                           RTUNI_ALPHA, /* U+00af8f: */
+                                           RTUNI_ALPHA, /* U+00af90: */
+                                           RTUNI_ALPHA, /* U+00af91: */
+                                           RTUNI_ALPHA, /* U+00af92: */
+                                           RTUNI_ALPHA, /* U+00af93: */
+                                           RTUNI_ALPHA, /* U+00af94: */
+                                           RTUNI_ALPHA, /* U+00af95: */
+                                           RTUNI_ALPHA, /* U+00af96: */
+                                           RTUNI_ALPHA, /* U+00af97: */
+                                           RTUNI_ALPHA, /* U+00af98: */
+                                           RTUNI_ALPHA, /* U+00af99: */
+                                           RTUNI_ALPHA, /* U+00af9a: */
+                                           RTUNI_ALPHA, /* U+00af9b: */
+                                           RTUNI_ALPHA, /* U+00af9c: */
+                                           RTUNI_ALPHA, /* U+00af9d: */
+                                           RTUNI_ALPHA, /* U+00af9e: */
+                                           RTUNI_ALPHA, /* U+00af9f: */
+                                           RTUNI_ALPHA, /* U+00afa0: */
+                                           RTUNI_ALPHA, /* U+00afa1: */
+                                           RTUNI_ALPHA, /* U+00afa2: */
+                                           RTUNI_ALPHA, /* U+00afa3: */
+                                           RTUNI_ALPHA, /* U+00afa4: */
+                                           RTUNI_ALPHA, /* U+00afa5: */
+                                           RTUNI_ALPHA, /* U+00afa6: */
+                                           RTUNI_ALPHA, /* U+00afa7: */
+                                           RTUNI_ALPHA, /* U+00afa8: */
+                                           RTUNI_ALPHA, /* U+00afa9: */
+                                           RTUNI_ALPHA, /* U+00afaa: */
+                                           RTUNI_ALPHA, /* U+00afab: */
+                                           RTUNI_ALPHA, /* U+00afac: */
+                                           RTUNI_ALPHA, /* U+00afad: */
+                                           RTUNI_ALPHA, /* U+00afae: */
+                                           RTUNI_ALPHA, /* U+00afaf: */
+                                           RTUNI_ALPHA, /* U+00afb0: */
+                                           RTUNI_ALPHA, /* U+00afb1: */
+                                           RTUNI_ALPHA, /* U+00afb2: */
+                                           RTUNI_ALPHA, /* U+00afb3: */
+                                           RTUNI_ALPHA, /* U+00afb4: */
+                                           RTUNI_ALPHA, /* U+00afb5: */
+                                           RTUNI_ALPHA, /* U+00afb6: */
+                                           RTUNI_ALPHA, /* U+00afb7: */
+                                           RTUNI_ALPHA, /* U+00afb8: */
+                                           RTUNI_ALPHA, /* U+00afb9: */
+                                           RTUNI_ALPHA, /* U+00afba: */
+                                           RTUNI_ALPHA, /* U+00afbb: */
+                                           RTUNI_ALPHA, /* U+00afbc: */
+                                           RTUNI_ALPHA, /* U+00afbd: */
+                                           RTUNI_ALPHA, /* U+00afbe: */
+                                           RTUNI_ALPHA, /* U+00afbf: */
+                                           RTUNI_ALPHA, /* U+00afc0: */
+                                           RTUNI_ALPHA, /* U+00afc1: */
+                                           RTUNI_ALPHA, /* U+00afc2: */
+                                           RTUNI_ALPHA, /* U+00afc3: */
+                                           RTUNI_ALPHA, /* U+00afc4: */
+                                           RTUNI_ALPHA, /* U+00afc5: */
+                                           RTUNI_ALPHA, /* U+00afc6: */
+                                           RTUNI_ALPHA, /* U+00afc7: */
+                                           RTUNI_ALPHA, /* U+00afc8: */
+                                           RTUNI_ALPHA, /* U+00afc9: */
+                                           RTUNI_ALPHA, /* U+00afca: */
+                                           RTUNI_ALPHA, /* U+00afcb: */
+                                           RTUNI_ALPHA, /* U+00afcc: */
+                                           RTUNI_ALPHA, /* U+00afcd: */
+                                           RTUNI_ALPHA, /* U+00afce: */
+                                           RTUNI_ALPHA, /* U+00afcf: */
+                                           RTUNI_ALPHA, /* U+00afd0: */
+                                           RTUNI_ALPHA, /* U+00afd1: */
+                                           RTUNI_ALPHA, /* U+00afd2: */
+                                           RTUNI_ALPHA, /* U+00afd3: */
+                                           RTUNI_ALPHA, /* U+00afd4: */
+                                           RTUNI_ALPHA, /* U+00afd5: */
+                                           RTUNI_ALPHA, /* U+00afd6: */
+                                           RTUNI_ALPHA, /* U+00afd7: */
+                                           RTUNI_ALPHA, /* U+00afd8: */
+                                           RTUNI_ALPHA, /* U+00afd9: */
+                                           RTUNI_ALPHA, /* U+00afda: */
+                                           RTUNI_ALPHA, /* U+00afdb: */
+                                           RTUNI_ALPHA, /* U+00afdc: */
+                                           RTUNI_ALPHA, /* U+00afdd: */
+                                           RTUNI_ALPHA, /* U+00afde: */
+                                           RTUNI_ALPHA, /* U+00afdf: */
+                                           RTUNI_ALPHA, /* U+00afe0: */
+                                           RTUNI_ALPHA, /* U+00afe1: */
+                                           RTUNI_ALPHA, /* U+00afe2: */
+                                           RTUNI_ALPHA, /* U+00afe3: */
+                                           RTUNI_ALPHA, /* U+00afe4: */
+                                           RTUNI_ALPHA, /* U+00afe5: */
+                                           RTUNI_ALPHA, /* U+00afe6: */
+                                           RTUNI_ALPHA, /* U+00afe7: */
+                                           RTUNI_ALPHA, /* U+00afe8: */
+                                           RTUNI_ALPHA, /* U+00afe9: */
+                                           RTUNI_ALPHA, /* U+00afea: */
+                                           RTUNI_ALPHA, /* U+00afeb: */
+                                           RTUNI_ALPHA, /* U+00afec: */
+                                           RTUNI_ALPHA, /* U+00afed: */
+                                           RTUNI_ALPHA, /* U+00afee: */
+                                           RTUNI_ALPHA, /* U+00afef: */
+                                           RTUNI_ALPHA, /* U+00aff0: */
+                                           RTUNI_ALPHA, /* U+00aff1: */
+                                           RTUNI_ALPHA, /* U+00aff2: */
+                                           RTUNI_ALPHA, /* U+00aff3: */
+                                           RTUNI_ALPHA, /* U+00aff4: */
+                                           RTUNI_ALPHA, /* U+00aff5: */
+                                           RTUNI_ALPHA, /* U+00aff6: */
+                                           RTUNI_ALPHA, /* U+00aff7: */
+                                           RTUNI_ALPHA, /* U+00aff8: */
+                                           RTUNI_ALPHA, /* U+00aff9: */
+                                           RTUNI_ALPHA, /* U+00affa: */
+                                           RTUNI_ALPHA, /* U+00affb: */
+                                           RTUNI_ALPHA, /* U+00affc: */
+                                           RTUNI_ALPHA, /* U+00affd: */
+                                           RTUNI_ALPHA, /* U+00affe: */
+                                           RTUNI_ALPHA, /* U+00afff: */
+                                           RTUNI_ALPHA, /* U+00b000: */
+                                           RTUNI_ALPHA, /* U+00b001: */
+                                           RTUNI_ALPHA, /* U+00b002: */
+                                           RTUNI_ALPHA, /* U+00b003: */
+                                           RTUNI_ALPHA, /* U+00b004: */
+                                           RTUNI_ALPHA, /* U+00b005: */
+                                           RTUNI_ALPHA, /* U+00b006: */
+                                           RTUNI_ALPHA, /* U+00b007: */
+                                           RTUNI_ALPHA, /* U+00b008: */
+                                           RTUNI_ALPHA, /* U+00b009: */
+                                           RTUNI_ALPHA, /* U+00b00a: */
+                                           RTUNI_ALPHA, /* U+00b00b: */
+                                           RTUNI_ALPHA, /* U+00b00c: */
+                                           RTUNI_ALPHA, /* U+00b00d: */
+                                           RTUNI_ALPHA, /* U+00b00e: */
+                                           RTUNI_ALPHA, /* U+00b00f: */
+                                           RTUNI_ALPHA, /* U+00b010: */
+                                           RTUNI_ALPHA, /* U+00b011: */
+                                           RTUNI_ALPHA, /* U+00b012: */
+                                           RTUNI_ALPHA, /* U+00b013: */
+                                           RTUNI_ALPHA, /* U+00b014: */
+                                           RTUNI_ALPHA, /* U+00b015: */
+                                           RTUNI_ALPHA, /* U+00b016: */
+                                           RTUNI_ALPHA, /* U+00b017: */
+                                           RTUNI_ALPHA, /* U+00b018: */
+                                           RTUNI_ALPHA, /* U+00b019: */
+                                           RTUNI_ALPHA, /* U+00b01a: */
+                                           RTUNI_ALPHA, /* U+00b01b: */
+                                           RTUNI_ALPHA, /* U+00b01c: */
+                                           RTUNI_ALPHA, /* U+00b01d: */
+                                           RTUNI_ALPHA, /* U+00b01e: */
+                                           RTUNI_ALPHA, /* U+00b01f: */
+                                           RTUNI_ALPHA, /* U+00b020: */
+                                           RTUNI_ALPHA, /* U+00b021: */
+                                           RTUNI_ALPHA, /* U+00b022: */
+                                           RTUNI_ALPHA, /* U+00b023: */
+                                           RTUNI_ALPHA, /* U+00b024: */
+                                           RTUNI_ALPHA, /* U+00b025: */
+                                           RTUNI_ALPHA, /* U+00b026: */
+                                           RTUNI_ALPHA, /* U+00b027: */
+                                           RTUNI_ALPHA, /* U+00b028: */
+                                           RTUNI_ALPHA, /* U+00b029: */
+                                           RTUNI_ALPHA, /* U+00b02a: */
+                                           RTUNI_ALPHA, /* U+00b02b: */
+                                           RTUNI_ALPHA, /* U+00b02c: */
+                                           RTUNI_ALPHA, /* U+00b02d: */
+                                           RTUNI_ALPHA, /* U+00b02e: */
+                                           RTUNI_ALPHA, /* U+00b02f: */
+                                           RTUNI_ALPHA, /* U+00b030: */
+                                           RTUNI_ALPHA, /* U+00b031: */
+                                           RTUNI_ALPHA, /* U+00b032: */
+                                           RTUNI_ALPHA, /* U+00b033: */
+                                           RTUNI_ALPHA, /* U+00b034: */
+                                           RTUNI_ALPHA, /* U+00b035: */
+                                           RTUNI_ALPHA, /* U+00b036: */
+                                           RTUNI_ALPHA, /* U+00b037: */
+                                           RTUNI_ALPHA, /* U+00b038: */
+                                           RTUNI_ALPHA, /* U+00b039: */
+                                           RTUNI_ALPHA, /* U+00b03a: */
+                                           RTUNI_ALPHA, /* U+00b03b: */
+                                           RTUNI_ALPHA, /* U+00b03c: */
+                                           RTUNI_ALPHA, /* U+00b03d: */
+                                           RTUNI_ALPHA, /* U+00b03e: */
+                                           RTUNI_ALPHA, /* U+00b03f: */
+                                           RTUNI_ALPHA, /* U+00b040: */
+                                           RTUNI_ALPHA, /* U+00b041: */
+                                           RTUNI_ALPHA, /* U+00b042: */
+                                           RTUNI_ALPHA, /* U+00b043: */
+                                           RTUNI_ALPHA, /* U+00b044: */
+                                           RTUNI_ALPHA, /* U+00b045: */
+                                           RTUNI_ALPHA, /* U+00b046: */
+                                           RTUNI_ALPHA, /* U+00b047: */
+                                           RTUNI_ALPHA, /* U+00b048: */
+                                           RTUNI_ALPHA, /* U+00b049: */
+                                           RTUNI_ALPHA, /* U+00b04a: */
+                                           RTUNI_ALPHA, /* U+00b04b: */
+                                           RTUNI_ALPHA, /* U+00b04c: */
+                                           RTUNI_ALPHA, /* U+00b04d: */
+                                           RTUNI_ALPHA, /* U+00b04e: */
+                                           RTUNI_ALPHA, /* U+00b04f: */
+                                           RTUNI_ALPHA, /* U+00b050: */
+                                           RTUNI_ALPHA, /* U+00b051: */
+                                           RTUNI_ALPHA, /* U+00b052: */
+                                           RTUNI_ALPHA, /* U+00b053: */
+                                           RTUNI_ALPHA, /* U+00b054: */
+                                           RTUNI_ALPHA, /* U+00b055: */
+                                           RTUNI_ALPHA, /* U+00b056: */
+                                           RTUNI_ALPHA, /* U+00b057: */
+                                           RTUNI_ALPHA, /* U+00b058: */
+                                           RTUNI_ALPHA, /* U+00b059: */
+                                           RTUNI_ALPHA, /* U+00b05a: */
+                                           RTUNI_ALPHA, /* U+00b05b: */
+                                           RTUNI_ALPHA, /* U+00b05c: */
+                                           RTUNI_ALPHA, /* U+00b05d: */
+                                           RTUNI_ALPHA, /* U+00b05e: */
+                                           RTUNI_ALPHA, /* U+00b05f: */
+                                           RTUNI_ALPHA, /* U+00b060: */
+                                           RTUNI_ALPHA, /* U+00b061: */
+                                           RTUNI_ALPHA, /* U+00b062: */
+                                           RTUNI_ALPHA, /* U+00b063: */
+                                           RTUNI_ALPHA, /* U+00b064: */
+                                           RTUNI_ALPHA, /* U+00b065: */
+                                           RTUNI_ALPHA, /* U+00b066: */
+                                           RTUNI_ALPHA, /* U+00b067: */
+                                           RTUNI_ALPHA, /* U+00b068: */
+                                           RTUNI_ALPHA, /* U+00b069: */
+                                           RTUNI_ALPHA, /* U+00b06a: */
+                                           RTUNI_ALPHA, /* U+00b06b: */
+                                           RTUNI_ALPHA, /* U+00b06c: */
+                                           RTUNI_ALPHA, /* U+00b06d: */
+                                           RTUNI_ALPHA, /* U+00b06e: */
+                                           RTUNI_ALPHA, /* U+00b06f: */
+                                           RTUNI_ALPHA, /* U+00b070: */
+                                           RTUNI_ALPHA, /* U+00b071: */
+                                           RTUNI_ALPHA, /* U+00b072: */
+                                           RTUNI_ALPHA, /* U+00b073: */
+                                           RTUNI_ALPHA, /* U+00b074: */
+                                           RTUNI_ALPHA, /* U+00b075: */
+                                           RTUNI_ALPHA, /* U+00b076: */
+                                           RTUNI_ALPHA, /* U+00b077: */
+                                           RTUNI_ALPHA, /* U+00b078: */
+                                           RTUNI_ALPHA, /* U+00b079: */
+                                           RTUNI_ALPHA, /* U+00b07a: */
+                                           RTUNI_ALPHA, /* U+00b07b: */
+                                           RTUNI_ALPHA, /* U+00b07c: */
+                                           RTUNI_ALPHA, /* U+00b07d: */
+                                           RTUNI_ALPHA, /* U+00b07e: */
+                                           RTUNI_ALPHA, /* U+00b07f: */
+                                           RTUNI_ALPHA, /* U+00b080: */
+                                           RTUNI_ALPHA, /* U+00b081: */
+                                           RTUNI_ALPHA, /* U+00b082: */
+                                           RTUNI_ALPHA, /* U+00b083: */
+                                           RTUNI_ALPHA, /* U+00b084: */
+                                           RTUNI_ALPHA, /* U+00b085: */
+                                           RTUNI_ALPHA, /* U+00b086: */
+                                           RTUNI_ALPHA, /* U+00b087: */
+                                           RTUNI_ALPHA, /* U+00b088: */
+                                           RTUNI_ALPHA, /* U+00b089: */
+                                           RTUNI_ALPHA, /* U+00b08a: */
+                                           RTUNI_ALPHA, /* U+00b08b: */
+                                           RTUNI_ALPHA, /* U+00b08c: */
+                                           RTUNI_ALPHA, /* U+00b08d: */
+                                           RTUNI_ALPHA, /* U+00b08e: */
+                                           RTUNI_ALPHA, /* U+00b08f: */
+                                           RTUNI_ALPHA, /* U+00b090: */
+                                           RTUNI_ALPHA, /* U+00b091: */
+                                           RTUNI_ALPHA, /* U+00b092: */
+                                           RTUNI_ALPHA, /* U+00b093: */
+                                           RTUNI_ALPHA, /* U+00b094: */
+                                           RTUNI_ALPHA, /* U+00b095: */
+                                           RTUNI_ALPHA, /* U+00b096: */
+                                           RTUNI_ALPHA, /* U+00b097: */
+                                           RTUNI_ALPHA, /* U+00b098: */
+                                           RTUNI_ALPHA, /* U+00b099: */
+                                           RTUNI_ALPHA, /* U+00b09a: */
+                                           RTUNI_ALPHA, /* U+00b09b: */
+                                           RTUNI_ALPHA, /* U+00b09c: */
+                                           RTUNI_ALPHA, /* U+00b09d: */
+                                           RTUNI_ALPHA, /* U+00b09e: */
+                                           RTUNI_ALPHA, /* U+00b09f: */
+                                           RTUNI_ALPHA, /* U+00b0a0: */
+                                           RTUNI_ALPHA, /* U+00b0a1: */
+                                           RTUNI_ALPHA, /* U+00b0a2: */
+                                           RTUNI_ALPHA, /* U+00b0a3: */
+                                           RTUNI_ALPHA, /* U+00b0a4: */
+                                           RTUNI_ALPHA, /* U+00b0a5: */
+                                           RTUNI_ALPHA, /* U+00b0a6: */
+                                           RTUNI_ALPHA, /* U+00b0a7: */
+                                           RTUNI_ALPHA, /* U+00b0a8: */
+                                           RTUNI_ALPHA, /* U+00b0a9: */
+                                           RTUNI_ALPHA, /* U+00b0aa: */
+                                           RTUNI_ALPHA, /* U+00b0ab: */
+                                           RTUNI_ALPHA, /* U+00b0ac: */
+                                           RTUNI_ALPHA, /* U+00b0ad: */
+                                           RTUNI_ALPHA, /* U+00b0ae: */
+                                           RTUNI_ALPHA, /* U+00b0af: */
+                                           RTUNI_ALPHA, /* U+00b0b0: */
+                                           RTUNI_ALPHA, /* U+00b0b1: */
+                                           RTUNI_ALPHA, /* U+00b0b2: */
+                                           RTUNI_ALPHA, /* U+00b0b3: */
+                                           RTUNI_ALPHA, /* U+00b0b4: */
+                                           RTUNI_ALPHA, /* U+00b0b5: */
+                                           RTUNI_ALPHA, /* U+00b0b6: */
+                                           RTUNI_ALPHA, /* U+00b0b7: */
+                                           RTUNI_ALPHA, /* U+00b0b8: */
+                                           RTUNI_ALPHA, /* U+00b0b9: */
+                                           RTUNI_ALPHA, /* U+00b0ba: */
+                                           RTUNI_ALPHA, /* U+00b0bb: */
+                                           RTUNI_ALPHA, /* U+00b0bc: */
+                                           RTUNI_ALPHA, /* U+00b0bd: */
+                                           RTUNI_ALPHA, /* U+00b0be: */
+                                           RTUNI_ALPHA, /* U+00b0bf: */
+                                           RTUNI_ALPHA, /* U+00b0c0: */
+                                           RTUNI_ALPHA, /* U+00b0c1: */
+                                           RTUNI_ALPHA, /* U+00b0c2: */
+                                           RTUNI_ALPHA, /* U+00b0c3: */
+                                           RTUNI_ALPHA, /* U+00b0c4: */
+                                           RTUNI_ALPHA, /* U+00b0c5: */
+                                           RTUNI_ALPHA, /* U+00b0c6: */
+                                           RTUNI_ALPHA, /* U+00b0c7: */
+                                           RTUNI_ALPHA, /* U+00b0c8: */
+                                           RTUNI_ALPHA, /* U+00b0c9: */
+                                           RTUNI_ALPHA, /* U+00b0ca: */
+                                           RTUNI_ALPHA, /* U+00b0cb: */
+                                           RTUNI_ALPHA, /* U+00b0cc: */
+                                           RTUNI_ALPHA, /* U+00b0cd: */
+                                           RTUNI_ALPHA, /* U+00b0ce: */
+                                           RTUNI_ALPHA, /* U+00b0cf: */
+                                           RTUNI_ALPHA, /* U+00b0d0: */
+                                           RTUNI_ALPHA, /* U+00b0d1: */
+                                           RTUNI_ALPHA, /* U+00b0d2: */
+                                           RTUNI_ALPHA, /* U+00b0d3: */
+                                           RTUNI_ALPHA, /* U+00b0d4: */
+                                           RTUNI_ALPHA, /* U+00b0d5: */
+                                           RTUNI_ALPHA, /* U+00b0d6: */
+                                           RTUNI_ALPHA, /* U+00b0d7: */
+                                           RTUNI_ALPHA, /* U+00b0d8: */
+                                           RTUNI_ALPHA, /* U+00b0d9: */
+                                           RTUNI_ALPHA, /* U+00b0da: */
+                                           RTUNI_ALPHA, /* U+00b0db: */
+                                           RTUNI_ALPHA, /* U+00b0dc: */
+                                           RTUNI_ALPHA, /* U+00b0dd: */
+                                           RTUNI_ALPHA, /* U+00b0de: */
+                                           RTUNI_ALPHA, /* U+00b0df: */
+                                           RTUNI_ALPHA, /* U+00b0e0: */
+                                           RTUNI_ALPHA, /* U+00b0e1: */
+                                           RTUNI_ALPHA, /* U+00b0e2: */
+                                           RTUNI_ALPHA, /* U+00b0e3: */
+                                           RTUNI_ALPHA, /* U+00b0e4: */
+                                           RTUNI_ALPHA, /* U+00b0e5: */
+                                           RTUNI_ALPHA, /* U+00b0e6: */
+                                           RTUNI_ALPHA, /* U+00b0e7: */
+                                           RTUNI_ALPHA, /* U+00b0e8: */
+                                           RTUNI_ALPHA, /* U+00b0e9: */
+                                           RTUNI_ALPHA, /* U+00b0ea: */
+                                           RTUNI_ALPHA, /* U+00b0eb: */
+                                           RTUNI_ALPHA, /* U+00b0ec: */
+                                           RTUNI_ALPHA, /* U+00b0ed: */
+                                           RTUNI_ALPHA, /* U+00b0ee: */
+                                           RTUNI_ALPHA, /* U+00b0ef: */
+                                           RTUNI_ALPHA, /* U+00b0f0: */
+                                           RTUNI_ALPHA, /* U+00b0f1: */
+                                           RTUNI_ALPHA, /* U+00b0f2: */
+                                           RTUNI_ALPHA, /* U+00b0f3: */
+                                           RTUNI_ALPHA, /* U+00b0f4: */
+                                           RTUNI_ALPHA, /* U+00b0f5: */
+                                           RTUNI_ALPHA, /* U+00b0f6: */
+                                           RTUNI_ALPHA, /* U+00b0f7: */
+                                           RTUNI_ALPHA, /* U+00b0f8: */
+                                           RTUNI_ALPHA, /* U+00b0f9: */
+                                           RTUNI_ALPHA, /* U+00b0fa: */
+                                           RTUNI_ALPHA, /* U+00b0fb: */
+                                           RTUNI_ALPHA, /* U+00b0fc: */
+                                           RTUNI_ALPHA, /* U+00b0fd: */
+                                           RTUNI_ALPHA, /* U+00b0fe: */
+                                           RTUNI_ALPHA, /* U+00b0ff: */
+                                           RTUNI_ALPHA, /* U+00b100: */
+                                           RTUNI_ALPHA, /* U+00b101: */
+                                           RTUNI_ALPHA, /* U+00b102: */
+                                           RTUNI_ALPHA, /* U+00b103: */
+                                           RTUNI_ALPHA, /* U+00b104: */
+                                           RTUNI_ALPHA, /* U+00b105: */
+                                           RTUNI_ALPHA, /* U+00b106: */
+                                           RTUNI_ALPHA, /* U+00b107: */
+                                           RTUNI_ALPHA, /* U+00b108: */
+                                           RTUNI_ALPHA, /* U+00b109: */
+                                           RTUNI_ALPHA, /* U+00b10a: */
+                                           RTUNI_ALPHA, /* U+00b10b: */
+                                           RTUNI_ALPHA, /* U+00b10c: */
+                                           RTUNI_ALPHA, /* U+00b10d: */
+                                           RTUNI_ALPHA, /* U+00b10e: */
+                                           RTUNI_ALPHA, /* U+00b10f: */
+                                           RTUNI_ALPHA, /* U+00b110: */
+                                           RTUNI_ALPHA, /* U+00b111: */
+                                           RTUNI_ALPHA, /* U+00b112: */
+                                           RTUNI_ALPHA, /* U+00b113: */
+                                           RTUNI_ALPHA, /* U+00b114: */
+                                           RTUNI_ALPHA, /* U+00b115: */
+                                           RTUNI_ALPHA, /* U+00b116: */
+                                           RTUNI_ALPHA, /* U+00b117: */
+                                           RTUNI_ALPHA, /* U+00b118: */
+                                           RTUNI_ALPHA, /* U+00b119: */
+                                           RTUNI_ALPHA, /* U+00b11a: */
+                                           RTUNI_ALPHA, /* U+00b11b: */
+                                           RTUNI_ALPHA, /* U+00b11c: */
+                                           RTUNI_ALPHA, /* U+00b11d: */
+                                           RTUNI_ALPHA, /* U+00b11e: */
+                                           RTUNI_ALPHA, /* U+00b11f: */
+                                           RTUNI_ALPHA, /* U+00b120: */
+                                           RTUNI_ALPHA, /* U+00b121: */
+                                           RTUNI_ALPHA, /* U+00b122: */
+                                           RTUNI_ALPHA, /* U+00b123: */
+                                           RTUNI_ALPHA, /* U+00b124: */
+                                           RTUNI_ALPHA, /* U+00b125: */
+                                           RTUNI_ALPHA, /* U+00b126: */
+                                           RTUNI_ALPHA, /* U+00b127: */
+                                           RTUNI_ALPHA, /* U+00b128: */
+                                           RTUNI_ALPHA, /* U+00b129: */
+                                           RTUNI_ALPHA, /* U+00b12a: */
+                                           RTUNI_ALPHA, /* U+00b12b: */
+                                           RTUNI_ALPHA, /* U+00b12c: */
+                                           RTUNI_ALPHA, /* U+00b12d: */
+                                           RTUNI_ALPHA, /* U+00b12e: */
+                                           RTUNI_ALPHA, /* U+00b12f: */
+                                           RTUNI_ALPHA, /* U+00b130: */
+                                           RTUNI_ALPHA, /* U+00b131: */
+                                           RTUNI_ALPHA, /* U+00b132: */
+                                           RTUNI_ALPHA, /* U+00b133: */
+                                           RTUNI_ALPHA, /* U+00b134: */
+                                           RTUNI_ALPHA, /* U+00b135: */
+                                           RTUNI_ALPHA, /* U+00b136: */
+                                           RTUNI_ALPHA, /* U+00b137: */
+                                           RTUNI_ALPHA, /* U+00b138: */
+                                           RTUNI_ALPHA, /* U+00b139: */
+                                           RTUNI_ALPHA, /* U+00b13a: */
+                                           RTUNI_ALPHA, /* U+00b13b: */
+                                           RTUNI_ALPHA, /* U+00b13c: */
+                                           RTUNI_ALPHA, /* U+00b13d: */
+                                           RTUNI_ALPHA, /* U+00b13e: */
+                                           RTUNI_ALPHA, /* U+00b13f: */
+                                           RTUNI_ALPHA, /* U+00b140: */
+                                           RTUNI_ALPHA, /* U+00b141: */
+                                           RTUNI_ALPHA, /* U+00b142: */
+                                           RTUNI_ALPHA, /* U+00b143: */
+                                           RTUNI_ALPHA, /* U+00b144: */
+                                           RTUNI_ALPHA, /* U+00b145: */
+                                           RTUNI_ALPHA, /* U+00b146: */
+                                           RTUNI_ALPHA, /* U+00b147: */
+                                           RTUNI_ALPHA, /* U+00b148: */
+                                           RTUNI_ALPHA, /* U+00b149: */
+                                           RTUNI_ALPHA, /* U+00b14a: */
+                                           RTUNI_ALPHA, /* U+00b14b: */
+                                           RTUNI_ALPHA, /* U+00b14c: */
+                                           RTUNI_ALPHA, /* U+00b14d: */
+                                           RTUNI_ALPHA, /* U+00b14e: */
+                                           RTUNI_ALPHA, /* U+00b14f: */
+                                           RTUNI_ALPHA, /* U+00b150: */
+                                           RTUNI_ALPHA, /* U+00b151: */
+                                           RTUNI_ALPHA, /* U+00b152: */
+                                           RTUNI_ALPHA, /* U+00b153: */
+                                           RTUNI_ALPHA, /* U+00b154: */
+                                           RTUNI_ALPHA, /* U+00b155: */
+                                           RTUNI_ALPHA, /* U+00b156: */
+                                           RTUNI_ALPHA, /* U+00b157: */
+                                           RTUNI_ALPHA, /* U+00b158: */
+                                           RTUNI_ALPHA, /* U+00b159: */
+                                           RTUNI_ALPHA, /* U+00b15a: */
+                                           RTUNI_ALPHA, /* U+00b15b: */
+                                           RTUNI_ALPHA, /* U+00b15c: */
+                                           RTUNI_ALPHA, /* U+00b15d: */
+                                           RTUNI_ALPHA, /* U+00b15e: */
+                                           RTUNI_ALPHA, /* U+00b15f: */
+                                           RTUNI_ALPHA, /* U+00b160: */
+                                           RTUNI_ALPHA, /* U+00b161: */
+                                           RTUNI_ALPHA, /* U+00b162: */
+                                           RTUNI_ALPHA, /* U+00b163: */
+                                           RTUNI_ALPHA, /* U+00b164: */
+                                           RTUNI_ALPHA, /* U+00b165: */
+                                           RTUNI_ALPHA, /* U+00b166: */
+                                           RTUNI_ALPHA, /* U+00b167: */
+                                           RTUNI_ALPHA, /* U+00b168: */
+                                           RTUNI_ALPHA, /* U+00b169: */
+                                           RTUNI_ALPHA, /* U+00b16a: */
+                                           RTUNI_ALPHA, /* U+00b16b: */
+                                           RTUNI_ALPHA, /* U+00b16c: */
+                                           RTUNI_ALPHA, /* U+00b16d: */
+                                           RTUNI_ALPHA, /* U+00b16e: */
+                                           RTUNI_ALPHA, /* U+00b16f: */
+                                           RTUNI_ALPHA, /* U+00b170: */
+                                           RTUNI_ALPHA, /* U+00b171: */
+                                           RTUNI_ALPHA, /* U+00b172: */
+                                           RTUNI_ALPHA, /* U+00b173: */
+                                           RTUNI_ALPHA, /* U+00b174: */
+                                           RTUNI_ALPHA, /* U+00b175: */
+                                           RTUNI_ALPHA, /* U+00b176: */
+                                           RTUNI_ALPHA, /* U+00b177: */
+                                           RTUNI_ALPHA, /* U+00b178: */
+                                           RTUNI_ALPHA, /* U+00b179: */
+                                           RTUNI_ALPHA, /* U+00b17a: */
+                                           RTUNI_ALPHA, /* U+00b17b: */
+                                           RTUNI_ALPHA, /* U+00b17c: */
+                                           RTUNI_ALPHA, /* U+00b17d: */
+                                           RTUNI_ALPHA, /* U+00b17e: */
+                                           RTUNI_ALPHA, /* U+00b17f: */
+                                           RTUNI_ALPHA, /* U+00b180: */
+                                           RTUNI_ALPHA, /* U+00b181: */
+                                           RTUNI_ALPHA, /* U+00b182: */
+                                           RTUNI_ALPHA, /* U+00b183: */
+                                           RTUNI_ALPHA, /* U+00b184: */
+                                           RTUNI_ALPHA, /* U+00b185: */
+                                           RTUNI_ALPHA, /* U+00b186: */
+                                           RTUNI_ALPHA, /* U+00b187: */
+                                           RTUNI_ALPHA, /* U+00b188: */
+                                           RTUNI_ALPHA, /* U+00b189: */
+                                           RTUNI_ALPHA, /* U+00b18a: */
+                                           RTUNI_ALPHA, /* U+00b18b: */
+                                           RTUNI_ALPHA, /* U+00b18c: */
+                                           RTUNI_ALPHA, /* U+00b18d: */
+                                           RTUNI_ALPHA, /* U+00b18e: */
+                                           RTUNI_ALPHA, /* U+00b18f: */
+                                           RTUNI_ALPHA, /* U+00b190: */
+                                           RTUNI_ALPHA, /* U+00b191: */
+                                           RTUNI_ALPHA, /* U+00b192: */
+                                           RTUNI_ALPHA, /* U+00b193: */
+                                           RTUNI_ALPHA, /* U+00b194: */
+                                           RTUNI_ALPHA, /* U+00b195: */
+                                           RTUNI_ALPHA, /* U+00b196: */
+                                           RTUNI_ALPHA, /* U+00b197: */
+                                           RTUNI_ALPHA, /* U+00b198: */
+                                           RTUNI_ALPHA, /* U+00b199: */
+                                           RTUNI_ALPHA, /* U+00b19a: */
+                                           RTUNI_ALPHA, /* U+00b19b: */
+                                           RTUNI_ALPHA, /* U+00b19c: */
+                                           RTUNI_ALPHA, /* U+00b19d: */
+                                           RTUNI_ALPHA, /* U+00b19e: */
+                                           RTUNI_ALPHA, /* U+00b19f: */
+                                           RTUNI_ALPHA, /* U+00b1a0: */
+                                           RTUNI_ALPHA, /* U+00b1a1: */
+                                           RTUNI_ALPHA, /* U+00b1a2: */
+                                           RTUNI_ALPHA, /* U+00b1a3: */
+                                           RTUNI_ALPHA, /* U+00b1a4: */
+                                           RTUNI_ALPHA, /* U+00b1a5: */
+                                           RTUNI_ALPHA, /* U+00b1a6: */
+                                           RTUNI_ALPHA, /* U+00b1a7: */
+                                           RTUNI_ALPHA, /* U+00b1a8: */
+                                           RTUNI_ALPHA, /* U+00b1a9: */
+                                           RTUNI_ALPHA, /* U+00b1aa: */
+                                           RTUNI_ALPHA, /* U+00b1ab: */
+                                           RTUNI_ALPHA, /* U+00b1ac: */
+                                           RTUNI_ALPHA, /* U+00b1ad: */
+                                           RTUNI_ALPHA, /* U+00b1ae: */
+                                           RTUNI_ALPHA, /* U+00b1af: */
+                                           RTUNI_ALPHA, /* U+00b1b0: */
+                                           RTUNI_ALPHA, /* U+00b1b1: */
+                                           RTUNI_ALPHA, /* U+00b1b2: */
+                                           RTUNI_ALPHA, /* U+00b1b3: */
+                                           RTUNI_ALPHA, /* U+00b1b4: */
+                                           RTUNI_ALPHA, /* U+00b1b5: */
+                                           RTUNI_ALPHA, /* U+00b1b6: */
+                                           RTUNI_ALPHA, /* U+00b1b7: */
+                                           RTUNI_ALPHA, /* U+00b1b8: */
+                                           RTUNI_ALPHA, /* U+00b1b9: */
+                                           RTUNI_ALPHA, /* U+00b1ba: */
+                                           RTUNI_ALPHA, /* U+00b1bb: */
+                                           RTUNI_ALPHA, /* U+00b1bc: */
+                                           RTUNI_ALPHA, /* U+00b1bd: */
+                                           RTUNI_ALPHA, /* U+00b1be: */
+                                           RTUNI_ALPHA, /* U+00b1bf: */
+                                           RTUNI_ALPHA, /* U+00b1c0: */
+                                           RTUNI_ALPHA, /* U+00b1c1: */
+                                           RTUNI_ALPHA, /* U+00b1c2: */
+                                           RTUNI_ALPHA, /* U+00b1c3: */
+                                           RTUNI_ALPHA, /* U+00b1c4: */
+                                           RTUNI_ALPHA, /* U+00b1c5: */
+                                           RTUNI_ALPHA, /* U+00b1c6: */
+                                           RTUNI_ALPHA, /* U+00b1c7: */
+                                           RTUNI_ALPHA, /* U+00b1c8: */
+                                           RTUNI_ALPHA, /* U+00b1c9: */
+                                           RTUNI_ALPHA, /* U+00b1ca: */
+                                           RTUNI_ALPHA, /* U+00b1cb: */
+                                           RTUNI_ALPHA, /* U+00b1cc: */
+                                           RTUNI_ALPHA, /* U+00b1cd: */
+                                           RTUNI_ALPHA, /* U+00b1ce: */
+                                           RTUNI_ALPHA, /* U+00b1cf: */
+                                           RTUNI_ALPHA, /* U+00b1d0: */
+                                           RTUNI_ALPHA, /* U+00b1d1: */
+                                           RTUNI_ALPHA, /* U+00b1d2: */
+                                           RTUNI_ALPHA, /* U+00b1d3: */
+                                           RTUNI_ALPHA, /* U+00b1d4: */
+                                           RTUNI_ALPHA, /* U+00b1d5: */
+                                           RTUNI_ALPHA, /* U+00b1d6: */
+                                           RTUNI_ALPHA, /* U+00b1d7: */
+                                           RTUNI_ALPHA, /* U+00b1d8: */
+                                           RTUNI_ALPHA, /* U+00b1d9: */
+                                           RTUNI_ALPHA, /* U+00b1da: */
+                                           RTUNI_ALPHA, /* U+00b1db: */
+                                           RTUNI_ALPHA, /* U+00b1dc: */
+                                           RTUNI_ALPHA, /* U+00b1dd: */
+                                           RTUNI_ALPHA, /* U+00b1de: */
+                                           RTUNI_ALPHA, /* U+00b1df: */
+                                           RTUNI_ALPHA, /* U+00b1e0: */
+                                           RTUNI_ALPHA, /* U+00b1e1: */
+                                           RTUNI_ALPHA, /* U+00b1e2: */
+                                           RTUNI_ALPHA, /* U+00b1e3: */
+                                           RTUNI_ALPHA, /* U+00b1e4: */
+                                           RTUNI_ALPHA, /* U+00b1e5: */
+                                           RTUNI_ALPHA, /* U+00b1e6: */
+                                           RTUNI_ALPHA, /* U+00b1e7: */
+                                           RTUNI_ALPHA, /* U+00b1e8: */
+                                           RTUNI_ALPHA, /* U+00b1e9: */
+                                           RTUNI_ALPHA, /* U+00b1ea: */
+                                           RTUNI_ALPHA, /* U+00b1eb: */
+                                           RTUNI_ALPHA, /* U+00b1ec: */
+                                           RTUNI_ALPHA, /* U+00b1ed: */
+                                           RTUNI_ALPHA, /* U+00b1ee: */
+                                           RTUNI_ALPHA, /* U+00b1ef: */
+                                           RTUNI_ALPHA, /* U+00b1f0: */
+                                           RTUNI_ALPHA, /* U+00b1f1: */
+                                           RTUNI_ALPHA, /* U+00b1f2: */
+                                           RTUNI_ALPHA, /* U+00b1f3: */
+                                           RTUNI_ALPHA, /* U+00b1f4: */
+                                           RTUNI_ALPHA, /* U+00b1f5: */
+                                           RTUNI_ALPHA, /* U+00b1f6: */
+                                           RTUNI_ALPHA, /* U+00b1f7: */
+                                           RTUNI_ALPHA, /* U+00b1f8: */
+                                           RTUNI_ALPHA, /* U+00b1f9: */
+                                           RTUNI_ALPHA, /* U+00b1fa: */
+                                           RTUNI_ALPHA, /* U+00b1fb: */
+                                           RTUNI_ALPHA, /* U+00b1fc: */
+                                           RTUNI_ALPHA, /* U+00b1fd: */
+                                           RTUNI_ALPHA, /* U+00b1fe: */
+                                           RTUNI_ALPHA, /* U+00b1ff: */
+                                           RTUNI_ALPHA, /* U+00b200: */
+                                           RTUNI_ALPHA, /* U+00b201: */
+                                           RTUNI_ALPHA, /* U+00b202: */
+                                           RTUNI_ALPHA, /* U+00b203: */
+                                           RTUNI_ALPHA, /* U+00b204: */
+                                           RTUNI_ALPHA, /* U+00b205: */
+                                           RTUNI_ALPHA, /* U+00b206: */
+                                           RTUNI_ALPHA, /* U+00b207: */
+                                           RTUNI_ALPHA, /* U+00b208: */
+                                           RTUNI_ALPHA, /* U+00b209: */
+                                           RTUNI_ALPHA, /* U+00b20a: */
+                                           RTUNI_ALPHA, /* U+00b20b: */
+                                           RTUNI_ALPHA, /* U+00b20c: */
+                                           RTUNI_ALPHA, /* U+00b20d: */
+                                           RTUNI_ALPHA, /* U+00b20e: */
+                                           RTUNI_ALPHA, /* U+00b20f: */
+                                           RTUNI_ALPHA, /* U+00b210: */
+                                           RTUNI_ALPHA, /* U+00b211: */
+                                           RTUNI_ALPHA, /* U+00b212: */
+                                           RTUNI_ALPHA, /* U+00b213: */
+                                           RTUNI_ALPHA, /* U+00b214: */
+                                           RTUNI_ALPHA, /* U+00b215: */
+                                           RTUNI_ALPHA, /* U+00b216: */
+                                           RTUNI_ALPHA, /* U+00b217: */
+                                           RTUNI_ALPHA, /* U+00b218: */
+                                           RTUNI_ALPHA, /* U+00b219: */
+                                           RTUNI_ALPHA, /* U+00b21a: */
+                                           RTUNI_ALPHA, /* U+00b21b: */
+                                           RTUNI_ALPHA, /* U+00b21c: */
+                                           RTUNI_ALPHA, /* U+00b21d: */
+                                           RTUNI_ALPHA, /* U+00b21e: */
+                                           RTUNI_ALPHA, /* U+00b21f: */
+                                           RTUNI_ALPHA, /* U+00b220: */
+                                           RTUNI_ALPHA, /* U+00b221: */
+                                           RTUNI_ALPHA, /* U+00b222: */
+                                           RTUNI_ALPHA, /* U+00b223: */
+                                           RTUNI_ALPHA, /* U+00b224: */
+                                           RTUNI_ALPHA, /* U+00b225: */
+                                           RTUNI_ALPHA, /* U+00b226: */
+                                           RTUNI_ALPHA, /* U+00b227: */
+                                           RTUNI_ALPHA, /* U+00b228: */
+                                           RTUNI_ALPHA, /* U+00b229: */
+                                           RTUNI_ALPHA, /* U+00b22a: */
+                                           RTUNI_ALPHA, /* U+00b22b: */
+                                           RTUNI_ALPHA, /* U+00b22c: */
+                                           RTUNI_ALPHA, /* U+00b22d: */
+                                           RTUNI_ALPHA, /* U+00b22e: */
+                                           RTUNI_ALPHA, /* U+00b22f: */
+                                           RTUNI_ALPHA, /* U+00b230: */
+                                           RTUNI_ALPHA, /* U+00b231: */
+                                           RTUNI_ALPHA, /* U+00b232: */
+                                           RTUNI_ALPHA, /* U+00b233: */
+                                           RTUNI_ALPHA, /* U+00b234: */
+                                           RTUNI_ALPHA, /* U+00b235: */
+                                           RTUNI_ALPHA, /* U+00b236: */
+                                           RTUNI_ALPHA, /* U+00b237: */
+                                           RTUNI_ALPHA, /* U+00b238: */
+                                           RTUNI_ALPHA, /* U+00b239: */
+                                           RTUNI_ALPHA, /* U+00b23a: */
+                                           RTUNI_ALPHA, /* U+00b23b: */
+                                           RTUNI_ALPHA, /* U+00b23c: */
+                                           RTUNI_ALPHA, /* U+00b23d: */
+                                           RTUNI_ALPHA, /* U+00b23e: */
+                                           RTUNI_ALPHA, /* U+00b23f: */
+                                           RTUNI_ALPHA, /* U+00b240: */
+                                           RTUNI_ALPHA, /* U+00b241: */
+                                           RTUNI_ALPHA, /* U+00b242: */
+                                           RTUNI_ALPHA, /* U+00b243: */
+                                           RTUNI_ALPHA, /* U+00b244: */
+                                           RTUNI_ALPHA, /* U+00b245: */
+                                           RTUNI_ALPHA, /* U+00b246: */
+                                           RTUNI_ALPHA, /* U+00b247: */
+                                           RTUNI_ALPHA, /* U+00b248: */
+                                           RTUNI_ALPHA, /* U+00b249: */
+                                           RTUNI_ALPHA, /* U+00b24a: */
+                                           RTUNI_ALPHA, /* U+00b24b: */
+                                           RTUNI_ALPHA, /* U+00b24c: */
+                                           RTUNI_ALPHA, /* U+00b24d: */
+                                           RTUNI_ALPHA, /* U+00b24e: */
+                                           RTUNI_ALPHA, /* U+00b24f: */
+                                           RTUNI_ALPHA, /* U+00b250: */
+                                           RTUNI_ALPHA, /* U+00b251: */
+                                           RTUNI_ALPHA, /* U+00b252: */
+                                           RTUNI_ALPHA, /* U+00b253: */
+                                           RTUNI_ALPHA, /* U+00b254: */
+                                           RTUNI_ALPHA, /* U+00b255: */
+                                           RTUNI_ALPHA, /* U+00b256: */
+                                           RTUNI_ALPHA, /* U+00b257: */
+                                           RTUNI_ALPHA, /* U+00b258: */
+                                           RTUNI_ALPHA, /* U+00b259: */
+                                           RTUNI_ALPHA, /* U+00b25a: */
+                                           RTUNI_ALPHA, /* U+00b25b: */
+                                           RTUNI_ALPHA, /* U+00b25c: */
+                                           RTUNI_ALPHA, /* U+00b25d: */
+                                           RTUNI_ALPHA, /* U+00b25e: */
+                                           RTUNI_ALPHA, /* U+00b25f: */
+                                           RTUNI_ALPHA, /* U+00b260: */
+                                           RTUNI_ALPHA, /* U+00b261: */
+                                           RTUNI_ALPHA, /* U+00b262: */
+                                           RTUNI_ALPHA, /* U+00b263: */
+                                           RTUNI_ALPHA, /* U+00b264: */
+                                           RTUNI_ALPHA, /* U+00b265: */
+                                           RTUNI_ALPHA, /* U+00b266: */
+                                           RTUNI_ALPHA, /* U+00b267: */
+                                           RTUNI_ALPHA, /* U+00b268: */
+                                           RTUNI_ALPHA, /* U+00b269: */
+                                           RTUNI_ALPHA, /* U+00b26a: */
+                                           RTUNI_ALPHA, /* U+00b26b: */
+                                           RTUNI_ALPHA, /* U+00b26c: */
+                                           RTUNI_ALPHA, /* U+00b26d: */
+                                           RTUNI_ALPHA, /* U+00b26e: */
+                                           RTUNI_ALPHA, /* U+00b26f: */
+                                           RTUNI_ALPHA, /* U+00b270: */
+                                           RTUNI_ALPHA, /* U+00b271: */
+                                           RTUNI_ALPHA, /* U+00b272: */
+                                           RTUNI_ALPHA, /* U+00b273: */
+                                           RTUNI_ALPHA, /* U+00b274: */
+                                           RTUNI_ALPHA, /* U+00b275: */
+                                           RTUNI_ALPHA, /* U+00b276: */
+                                           RTUNI_ALPHA, /* U+00b277: */
+                                           RTUNI_ALPHA, /* U+00b278: */
+                                           RTUNI_ALPHA, /* U+00b279: */
+                                           RTUNI_ALPHA, /* U+00b27a: */
+                                           RTUNI_ALPHA, /* U+00b27b: */
+                                           RTUNI_ALPHA, /* U+00b27c: */
+                                           RTUNI_ALPHA, /* U+00b27d: */
+                                           RTUNI_ALPHA, /* U+00b27e: */
+                                           RTUNI_ALPHA, /* U+00b27f: */
+                                           RTUNI_ALPHA, /* U+00b280: */
+                                           RTUNI_ALPHA, /* U+00b281: */
+                                           RTUNI_ALPHA, /* U+00b282: */
+                                           RTUNI_ALPHA, /* U+00b283: */
+                                           RTUNI_ALPHA, /* U+00b284: */
+                                           RTUNI_ALPHA, /* U+00b285: */
+                                           RTUNI_ALPHA, /* U+00b286: */
+                                           RTUNI_ALPHA, /* U+00b287: */
+                                           RTUNI_ALPHA, /* U+00b288: */
+                                           RTUNI_ALPHA, /* U+00b289: */
+                                           RTUNI_ALPHA, /* U+00b28a: */
+                                           RTUNI_ALPHA, /* U+00b28b: */
+                                           RTUNI_ALPHA, /* U+00b28c: */
+                                           RTUNI_ALPHA, /* U+00b28d: */
+                                           RTUNI_ALPHA, /* U+00b28e: */
+                                           RTUNI_ALPHA, /* U+00b28f: */
+                                           RTUNI_ALPHA, /* U+00b290: */
+                                           RTUNI_ALPHA, /* U+00b291: */
+                                           RTUNI_ALPHA, /* U+00b292: */
+                                           RTUNI_ALPHA, /* U+00b293: */
+                                           RTUNI_ALPHA, /* U+00b294: */
+                                           RTUNI_ALPHA, /* U+00b295: */
+                                           RTUNI_ALPHA, /* U+00b296: */
+                                           RTUNI_ALPHA, /* U+00b297: */
+                                           RTUNI_ALPHA, /* U+00b298: */
+                                           RTUNI_ALPHA, /* U+00b299: */
+                                           RTUNI_ALPHA, /* U+00b29a: */
+                                           RTUNI_ALPHA, /* U+00b29b: */
+                                           RTUNI_ALPHA, /* U+00b29c: */
+                                           RTUNI_ALPHA, /* U+00b29d: */
+                                           RTUNI_ALPHA, /* U+00b29e: */
+                                           RTUNI_ALPHA, /* U+00b29f: */
+                                           RTUNI_ALPHA, /* U+00b2a0: */
+                                           RTUNI_ALPHA, /* U+00b2a1: */
+                                           RTUNI_ALPHA, /* U+00b2a2: */
+                                           RTUNI_ALPHA, /* U+00b2a3: */
+                                           RTUNI_ALPHA, /* U+00b2a4: */
+                                           RTUNI_ALPHA, /* U+00b2a5: */
+                                           RTUNI_ALPHA, /* U+00b2a6: */
+                                           RTUNI_ALPHA, /* U+00b2a7: */
+                                           RTUNI_ALPHA, /* U+00b2a8: */
+                                           RTUNI_ALPHA, /* U+00b2a9: */
+                                           RTUNI_ALPHA, /* U+00b2aa: */
+                                           RTUNI_ALPHA, /* U+00b2ab: */
+                                           RTUNI_ALPHA, /* U+00b2ac: */
+                                           RTUNI_ALPHA, /* U+00b2ad: */
+                                           RTUNI_ALPHA, /* U+00b2ae: */
+                                           RTUNI_ALPHA, /* U+00b2af: */
+                                           RTUNI_ALPHA, /* U+00b2b0: */
+                                           RTUNI_ALPHA, /* U+00b2b1: */
+                                           RTUNI_ALPHA, /* U+00b2b2: */
+                                           RTUNI_ALPHA, /* U+00b2b3: */
+                                           RTUNI_ALPHA, /* U+00b2b4: */
+                                           RTUNI_ALPHA, /* U+00b2b5: */
+                                           RTUNI_ALPHA, /* U+00b2b6: */
+                                           RTUNI_ALPHA, /* U+00b2b7: */
+                                           RTUNI_ALPHA, /* U+00b2b8: */
+                                           RTUNI_ALPHA, /* U+00b2b9: */
+                                           RTUNI_ALPHA, /* U+00b2ba: */
+                                           RTUNI_ALPHA, /* U+00b2bb: */
+                                           RTUNI_ALPHA, /* U+00b2bc: */
+                                           RTUNI_ALPHA, /* U+00b2bd: */
+                                           RTUNI_ALPHA, /* U+00b2be: */
+                                           RTUNI_ALPHA, /* U+00b2bf: */
+                                           RTUNI_ALPHA, /* U+00b2c0: */
+                                           RTUNI_ALPHA, /* U+00b2c1: */
+                                           RTUNI_ALPHA, /* U+00b2c2: */
+                                           RTUNI_ALPHA, /* U+00b2c3: */
+                                           RTUNI_ALPHA, /* U+00b2c4: */
+                                           RTUNI_ALPHA, /* U+00b2c5: */
+                                           RTUNI_ALPHA, /* U+00b2c6: */
+                                           RTUNI_ALPHA, /* U+00b2c7: */
+                                           RTUNI_ALPHA, /* U+00b2c8: */
+                                           RTUNI_ALPHA, /* U+00b2c9: */
+                                           RTUNI_ALPHA, /* U+00b2ca: */
+                                           RTUNI_ALPHA, /* U+00b2cb: */
+                                           RTUNI_ALPHA, /* U+00b2cc: */
+                                           RTUNI_ALPHA, /* U+00b2cd: */
+                                           RTUNI_ALPHA, /* U+00b2ce: */
+                                           RTUNI_ALPHA, /* U+00b2cf: */
+                                           RTUNI_ALPHA, /* U+00b2d0: */
+                                           RTUNI_ALPHA, /* U+00b2d1: */
+                                           RTUNI_ALPHA, /* U+00b2d2: */
+                                           RTUNI_ALPHA, /* U+00b2d3: */
+                                           RTUNI_ALPHA, /* U+00b2d4: */
+                                           RTUNI_ALPHA, /* U+00b2d5: */
+                                           RTUNI_ALPHA, /* U+00b2d6: */
+                                           RTUNI_ALPHA, /* U+00b2d7: */
+                                           RTUNI_ALPHA, /* U+00b2d8: */
+                                           RTUNI_ALPHA, /* U+00b2d9: */
+                                           RTUNI_ALPHA, /* U+00b2da: */
+                                           RTUNI_ALPHA, /* U+00b2db: */
+                                           RTUNI_ALPHA, /* U+00b2dc: */
+                                           RTUNI_ALPHA, /* U+00b2dd: */
+                                           RTUNI_ALPHA, /* U+00b2de: */
+                                           RTUNI_ALPHA, /* U+00b2df: */
+                                           RTUNI_ALPHA, /* U+00b2e0: */
+                                           RTUNI_ALPHA, /* U+00b2e1: */
+                                           RTUNI_ALPHA, /* U+00b2e2: */
+                                           RTUNI_ALPHA, /* U+00b2e3: */
+                                           RTUNI_ALPHA, /* U+00b2e4: */
+                                           RTUNI_ALPHA, /* U+00b2e5: */
+                                           RTUNI_ALPHA, /* U+00b2e6: */
+                                           RTUNI_ALPHA, /* U+00b2e7: */
+                                           RTUNI_ALPHA, /* U+00b2e8: */
+                                           RTUNI_ALPHA, /* U+00b2e9: */
+                                           RTUNI_ALPHA, /* U+00b2ea: */
+                                           RTUNI_ALPHA, /* U+00b2eb: */
+                                           RTUNI_ALPHA, /* U+00b2ec: */
+                                           RTUNI_ALPHA, /* U+00b2ed: */
+                                           RTUNI_ALPHA, /* U+00b2ee: */
+                                           RTUNI_ALPHA, /* U+00b2ef: */
+                                           RTUNI_ALPHA, /* U+00b2f0: */
+                                           RTUNI_ALPHA, /* U+00b2f1: */
+                                           RTUNI_ALPHA, /* U+00b2f2: */
+                                           RTUNI_ALPHA, /* U+00b2f3: */
+                                           RTUNI_ALPHA, /* U+00b2f4: */
+                                           RTUNI_ALPHA, /* U+00b2f5: */
+                                           RTUNI_ALPHA, /* U+00b2f6: */
+                                           RTUNI_ALPHA, /* U+00b2f7: */
+                                           RTUNI_ALPHA, /* U+00b2f8: */
+                                           RTUNI_ALPHA, /* U+00b2f9: */
+                                           RTUNI_ALPHA, /* U+00b2fa: */
+                                           RTUNI_ALPHA, /* U+00b2fb: */
+                                           RTUNI_ALPHA, /* U+00b2fc: */
+                                           RTUNI_ALPHA, /* U+00b2fd: */
+                                           RTUNI_ALPHA, /* U+00b2fe: */
+                                           RTUNI_ALPHA, /* U+00b2ff: */
+                                           RTUNI_ALPHA, /* U+00b300: */
+                                           RTUNI_ALPHA, /* U+00b301: */
+                                           RTUNI_ALPHA, /* U+00b302: */
+                                           RTUNI_ALPHA, /* U+00b303: */
+                                           RTUNI_ALPHA, /* U+00b304: */
+                                           RTUNI_ALPHA, /* U+00b305: */
+                                           RTUNI_ALPHA, /* U+00b306: */
+                                           RTUNI_ALPHA, /* U+00b307: */
+                                           RTUNI_ALPHA, /* U+00b308: */
+                                           RTUNI_ALPHA, /* U+00b309: */
+                                           RTUNI_ALPHA, /* U+00b30a: */
+                                           RTUNI_ALPHA, /* U+00b30b: */
+                                           RTUNI_ALPHA, /* U+00b30c: */
+                                           RTUNI_ALPHA, /* U+00b30d: */
+                                           RTUNI_ALPHA, /* U+00b30e: */
+                                           RTUNI_ALPHA, /* U+00b30f: */
+                                           RTUNI_ALPHA, /* U+00b310: */
+                                           RTUNI_ALPHA, /* U+00b311: */
+                                           RTUNI_ALPHA, /* U+00b312: */
+                                           RTUNI_ALPHA, /* U+00b313: */
+                                           RTUNI_ALPHA, /* U+00b314: */
+                                           RTUNI_ALPHA, /* U+00b315: */
+                                           RTUNI_ALPHA, /* U+00b316: */
+                                           RTUNI_ALPHA, /* U+00b317: */
+                                           RTUNI_ALPHA, /* U+00b318: */
+                                           RTUNI_ALPHA, /* U+00b319: */
+                                           RTUNI_ALPHA, /* U+00b31a: */
+                                           RTUNI_ALPHA, /* U+00b31b: */
+                                           RTUNI_ALPHA, /* U+00b31c: */
+                                           RTUNI_ALPHA, /* U+00b31d: */
+                                           RTUNI_ALPHA, /* U+00b31e: */
+                                           RTUNI_ALPHA, /* U+00b31f: */
+                                           RTUNI_ALPHA, /* U+00b320: */
+                                           RTUNI_ALPHA, /* U+00b321: */
+                                           RTUNI_ALPHA, /* U+00b322: */
+                                           RTUNI_ALPHA, /* U+00b323: */
+                                           RTUNI_ALPHA, /* U+00b324: */
+                                           RTUNI_ALPHA, /* U+00b325: */
+                                           RTUNI_ALPHA, /* U+00b326: */
+                                           RTUNI_ALPHA, /* U+00b327: */
+                                           RTUNI_ALPHA, /* U+00b328: */
+                                           RTUNI_ALPHA, /* U+00b329: */
+                                           RTUNI_ALPHA, /* U+00b32a: */
+                                           RTUNI_ALPHA, /* U+00b32b: */
+                                           RTUNI_ALPHA, /* U+00b32c: */
+                                           RTUNI_ALPHA, /* U+00b32d: */
+                                           RTUNI_ALPHA, /* U+00b32e: */
+                                           RTUNI_ALPHA, /* U+00b32f: */
+                                           RTUNI_ALPHA, /* U+00b330: */
+                                           RTUNI_ALPHA, /* U+00b331: */
+                                           RTUNI_ALPHA, /* U+00b332: */
+                                           RTUNI_ALPHA, /* U+00b333: */
+                                           RTUNI_ALPHA, /* U+00b334: */
+                                           RTUNI_ALPHA, /* U+00b335: */
+                                           RTUNI_ALPHA, /* U+00b336: */
+                                           RTUNI_ALPHA, /* U+00b337: */
+                                           RTUNI_ALPHA, /* U+00b338: */
+                                           RTUNI_ALPHA, /* U+00b339: */
+                                           RTUNI_ALPHA, /* U+00b33a: */
+                                           RTUNI_ALPHA, /* U+00b33b: */
+                                           RTUNI_ALPHA, /* U+00b33c: */
+                                           RTUNI_ALPHA, /* U+00b33d: */
+                                           RTUNI_ALPHA, /* U+00b33e: */
+                                           RTUNI_ALPHA, /* U+00b33f: */
+                                           RTUNI_ALPHA, /* U+00b340: */
+                                           RTUNI_ALPHA, /* U+00b341: */
+                                           RTUNI_ALPHA, /* U+00b342: */
+                                           RTUNI_ALPHA, /* U+00b343: */
+                                           RTUNI_ALPHA, /* U+00b344: */
+                                           RTUNI_ALPHA, /* U+00b345: */
+                                           RTUNI_ALPHA, /* U+00b346: */
+                                           RTUNI_ALPHA, /* U+00b347: */
+                                           RTUNI_ALPHA, /* U+00b348: */
+                                           RTUNI_ALPHA, /* U+00b349: */
+                                           RTUNI_ALPHA, /* U+00b34a: */
+                                           RTUNI_ALPHA, /* U+00b34b: */
+                                           RTUNI_ALPHA, /* U+00b34c: */
+                                           RTUNI_ALPHA, /* U+00b34d: */
+                                           RTUNI_ALPHA, /* U+00b34e: */
+                                           RTUNI_ALPHA, /* U+00b34f: */
+                                           RTUNI_ALPHA, /* U+00b350: */
+                                           RTUNI_ALPHA, /* U+00b351: */
+                                           RTUNI_ALPHA, /* U+00b352: */
+                                           RTUNI_ALPHA, /* U+00b353: */
+                                           RTUNI_ALPHA, /* U+00b354: */
+                                           RTUNI_ALPHA, /* U+00b355: */
+                                           RTUNI_ALPHA, /* U+00b356: */
+                                           RTUNI_ALPHA, /* U+00b357: */
+                                           RTUNI_ALPHA, /* U+00b358: */
+                                           RTUNI_ALPHA, /* U+00b359: */
+                                           RTUNI_ALPHA, /* U+00b35a: */
+                                           RTUNI_ALPHA, /* U+00b35b: */
+                                           RTUNI_ALPHA, /* U+00b35c: */
+                                           RTUNI_ALPHA, /* U+00b35d: */
+                                           RTUNI_ALPHA, /* U+00b35e: */
+                                           RTUNI_ALPHA, /* U+00b35f: */
+                                           RTUNI_ALPHA, /* U+00b360: */
+                                           RTUNI_ALPHA, /* U+00b361: */
+                                           RTUNI_ALPHA, /* U+00b362: */
+                                           RTUNI_ALPHA, /* U+00b363: */
+                                           RTUNI_ALPHA, /* U+00b364: */
+                                           RTUNI_ALPHA, /* U+00b365: */
+                                           RTUNI_ALPHA, /* U+00b366: */
+                                           RTUNI_ALPHA, /* U+00b367: */
+                                           RTUNI_ALPHA, /* U+00b368: */
+                                           RTUNI_ALPHA, /* U+00b369: */
+                                           RTUNI_ALPHA, /* U+00b36a: */
+                                           RTUNI_ALPHA, /* U+00b36b: */
+                                           RTUNI_ALPHA, /* U+00b36c: */
+                                           RTUNI_ALPHA, /* U+00b36d: */
+                                           RTUNI_ALPHA, /* U+00b36e: */
+                                           RTUNI_ALPHA, /* U+00b36f: */
+                                           RTUNI_ALPHA, /* U+00b370: */
+                                           RTUNI_ALPHA, /* U+00b371: */
+                                           RTUNI_ALPHA, /* U+00b372: */
+                                           RTUNI_ALPHA, /* U+00b373: */
+                                           RTUNI_ALPHA, /* U+00b374: */
+                                           RTUNI_ALPHA, /* U+00b375: */
+                                           RTUNI_ALPHA, /* U+00b376: */
+                                           RTUNI_ALPHA, /* U+00b377: */
+                                           RTUNI_ALPHA, /* U+00b378: */
+                                           RTUNI_ALPHA, /* U+00b379: */
+                                           RTUNI_ALPHA, /* U+00b37a: */
+                                           RTUNI_ALPHA, /* U+00b37b: */
+                                           RTUNI_ALPHA, /* U+00b37c: */
+                                           RTUNI_ALPHA, /* U+00b37d: */
+                                           RTUNI_ALPHA, /* U+00b37e: */
+                                           RTUNI_ALPHA, /* U+00b37f: */
+                                           RTUNI_ALPHA, /* U+00b380: */
+                                           RTUNI_ALPHA, /* U+00b381: */
+                                           RTUNI_ALPHA, /* U+00b382: */
+                                           RTUNI_ALPHA, /* U+00b383: */
+                                           RTUNI_ALPHA, /* U+00b384: */
+                                           RTUNI_ALPHA, /* U+00b385: */
+                                           RTUNI_ALPHA, /* U+00b386: */
+                                           RTUNI_ALPHA, /* U+00b387: */
+                                           RTUNI_ALPHA, /* U+00b388: */
+                                           RTUNI_ALPHA, /* U+00b389: */
+                                           RTUNI_ALPHA, /* U+00b38a: */
+                                           RTUNI_ALPHA, /* U+00b38b: */
+                                           RTUNI_ALPHA, /* U+00b38c: */
+                                           RTUNI_ALPHA, /* U+00b38d: */
+                                           RTUNI_ALPHA, /* U+00b38e: */
+                                           RTUNI_ALPHA, /* U+00b38f: */
+                                           RTUNI_ALPHA, /* U+00b390: */
+                                           RTUNI_ALPHA, /* U+00b391: */
+                                           RTUNI_ALPHA, /* U+00b392: */
+                                           RTUNI_ALPHA, /* U+00b393: */
+                                           RTUNI_ALPHA, /* U+00b394: */
+                                           RTUNI_ALPHA, /* U+00b395: */
+                                           RTUNI_ALPHA, /* U+00b396: */
+                                           RTUNI_ALPHA, /* U+00b397: */
+                                           RTUNI_ALPHA, /* U+00b398: */
+                                           RTUNI_ALPHA, /* U+00b399: */
+                                           RTUNI_ALPHA, /* U+00b39a: */
+                                           RTUNI_ALPHA, /* U+00b39b: */
+                                           RTUNI_ALPHA, /* U+00b39c: */
+                                           RTUNI_ALPHA, /* U+00b39d: */
+                                           RTUNI_ALPHA, /* U+00b39e: */
+                                           RTUNI_ALPHA, /* U+00b39f: */
+                                           RTUNI_ALPHA, /* U+00b3a0: */
+                                           RTUNI_ALPHA, /* U+00b3a1: */
+                                           RTUNI_ALPHA, /* U+00b3a2: */
+                                           RTUNI_ALPHA, /* U+00b3a3: */
+                                           RTUNI_ALPHA, /* U+00b3a4: */
+                                           RTUNI_ALPHA, /* U+00b3a5: */
+                                           RTUNI_ALPHA, /* U+00b3a6: */
+                                           RTUNI_ALPHA, /* U+00b3a7: */
+                                           RTUNI_ALPHA, /* U+00b3a8: */
+                                           RTUNI_ALPHA, /* U+00b3a9: */
+                                           RTUNI_ALPHA, /* U+00b3aa: */
+                                           RTUNI_ALPHA, /* U+00b3ab: */
+                                           RTUNI_ALPHA, /* U+00b3ac: */
+                                           RTUNI_ALPHA, /* U+00b3ad: */
+                                           RTUNI_ALPHA, /* U+00b3ae: */
+                                           RTUNI_ALPHA, /* U+00b3af: */
+                                           RTUNI_ALPHA, /* U+00b3b0: */
+                                           RTUNI_ALPHA, /* U+00b3b1: */
+                                           RTUNI_ALPHA, /* U+00b3b2: */
+                                           RTUNI_ALPHA, /* U+00b3b3: */
+                                           RTUNI_ALPHA, /* U+00b3b4: */
+                                           RTUNI_ALPHA, /* U+00b3b5: */
+                                           RTUNI_ALPHA, /* U+00b3b6: */
+                                           RTUNI_ALPHA, /* U+00b3b7: */
+                                           RTUNI_ALPHA, /* U+00b3b8: */
+                                           RTUNI_ALPHA, /* U+00b3b9: */
+                                           RTUNI_ALPHA, /* U+00b3ba: */
+                                           RTUNI_ALPHA, /* U+00b3bb: */
+                                           RTUNI_ALPHA, /* U+00b3bc: */
+                                           RTUNI_ALPHA, /* U+00b3bd: */
+                                           RTUNI_ALPHA, /* U+00b3be: */
+                                           RTUNI_ALPHA, /* U+00b3bf: */
+                                           RTUNI_ALPHA, /* U+00b3c0: */
+                                           RTUNI_ALPHA, /* U+00b3c1: */
+                                           RTUNI_ALPHA, /* U+00b3c2: */
+                                           RTUNI_ALPHA, /* U+00b3c3: */
+                                           RTUNI_ALPHA, /* U+00b3c4: */
+                                           RTUNI_ALPHA, /* U+00b3c5: */
+                                           RTUNI_ALPHA, /* U+00b3c6: */
+                                           RTUNI_ALPHA, /* U+00b3c7: */
+                                           RTUNI_ALPHA, /* U+00b3c8: */
+                                           RTUNI_ALPHA, /* U+00b3c9: */
+                                           RTUNI_ALPHA, /* U+00b3ca: */
+                                           RTUNI_ALPHA, /* U+00b3cb: */
+                                           RTUNI_ALPHA, /* U+00b3cc: */
+                                           RTUNI_ALPHA, /* U+00b3cd: */
+                                           RTUNI_ALPHA, /* U+00b3ce: */
+                                           RTUNI_ALPHA, /* U+00b3cf: */
+                                           RTUNI_ALPHA, /* U+00b3d0: */
+                                           RTUNI_ALPHA, /* U+00b3d1: */
+                                           RTUNI_ALPHA, /* U+00b3d2: */
+                                           RTUNI_ALPHA, /* U+00b3d3: */
+                                           RTUNI_ALPHA, /* U+00b3d4: */
+                                           RTUNI_ALPHA, /* U+00b3d5: */
+                                           RTUNI_ALPHA, /* U+00b3d6: */
+                                           RTUNI_ALPHA, /* U+00b3d7: */
+                                           RTUNI_ALPHA, /* U+00b3d8: */
+                                           RTUNI_ALPHA, /* U+00b3d9: */
+                                           RTUNI_ALPHA, /* U+00b3da: */
+                                           RTUNI_ALPHA, /* U+00b3db: */
+                                           RTUNI_ALPHA, /* U+00b3dc: */
+                                           RTUNI_ALPHA, /* U+00b3dd: */
+                                           RTUNI_ALPHA, /* U+00b3de: */
+                                           RTUNI_ALPHA, /* U+00b3df: */
+                                           RTUNI_ALPHA, /* U+00b3e0: */
+                                           RTUNI_ALPHA, /* U+00b3e1: */
+                                           RTUNI_ALPHA, /* U+00b3e2: */
+                                           RTUNI_ALPHA, /* U+00b3e3: */
+                                           RTUNI_ALPHA, /* U+00b3e4: */
+                                           RTUNI_ALPHA, /* U+00b3e5: */
+                                           RTUNI_ALPHA, /* U+00b3e6: */
+                                           RTUNI_ALPHA, /* U+00b3e7: */
+                                           RTUNI_ALPHA, /* U+00b3e8: */
+                                           RTUNI_ALPHA, /* U+00b3e9: */
+                                           RTUNI_ALPHA, /* U+00b3ea: */
+                                           RTUNI_ALPHA, /* U+00b3eb: */
+                                           RTUNI_ALPHA, /* U+00b3ec: */
+                                           RTUNI_ALPHA, /* U+00b3ed: */
+                                           RTUNI_ALPHA, /* U+00b3ee: */
+                                           RTUNI_ALPHA, /* U+00b3ef: */
+                                           RTUNI_ALPHA, /* U+00b3f0: */
+                                           RTUNI_ALPHA, /* U+00b3f1: */
+                                           RTUNI_ALPHA, /* U+00b3f2: */
+                                           RTUNI_ALPHA, /* U+00b3f3: */
+                                           RTUNI_ALPHA, /* U+00b3f4: */
+                                           RTUNI_ALPHA, /* U+00b3f5: */
+                                           RTUNI_ALPHA, /* U+00b3f6: */
+                                           RTUNI_ALPHA, /* U+00b3f7: */
+                                           RTUNI_ALPHA, /* U+00b3f8: */
+                                           RTUNI_ALPHA, /* U+00b3f9: */
+                                           RTUNI_ALPHA, /* U+00b3fa: */
+                                           RTUNI_ALPHA, /* U+00b3fb: */
+                                           RTUNI_ALPHA, /* U+00b3fc: */
+                                           RTUNI_ALPHA, /* U+00b3fd: */
+                                           RTUNI_ALPHA, /* U+00b3fe: */
+                                           RTUNI_ALPHA, /* U+00b3ff: */
+                                           RTUNI_ALPHA, /* U+00b400: */
+                                           RTUNI_ALPHA, /* U+00b401: */
+                                           RTUNI_ALPHA, /* U+00b402: */
+                                           RTUNI_ALPHA, /* U+00b403: */
+                                           RTUNI_ALPHA, /* U+00b404: */
+                                           RTUNI_ALPHA, /* U+00b405: */
+                                           RTUNI_ALPHA, /* U+00b406: */
+                                           RTUNI_ALPHA, /* U+00b407: */
+                                           RTUNI_ALPHA, /* U+00b408: */
+                                           RTUNI_ALPHA, /* U+00b409: */
+                                           RTUNI_ALPHA, /* U+00b40a: */
+                                           RTUNI_ALPHA, /* U+00b40b: */
+                                           RTUNI_ALPHA, /* U+00b40c: */
+                                           RTUNI_ALPHA, /* U+00b40d: */
+                                           RTUNI_ALPHA, /* U+00b40e: */
+                                           RTUNI_ALPHA, /* U+00b40f: */
+                                           RTUNI_ALPHA, /* U+00b410: */
+                                           RTUNI_ALPHA, /* U+00b411: */
+                                           RTUNI_ALPHA, /* U+00b412: */
+                                           RTUNI_ALPHA, /* U+00b413: */
+                                           RTUNI_ALPHA, /* U+00b414: */
+                                           RTUNI_ALPHA, /* U+00b415: */
+                                           RTUNI_ALPHA, /* U+00b416: */
+                                           RTUNI_ALPHA, /* U+00b417: */
+                                           RTUNI_ALPHA, /* U+00b418: */
+                                           RTUNI_ALPHA, /* U+00b419: */
+                                           RTUNI_ALPHA, /* U+00b41a: */
+                                           RTUNI_ALPHA, /* U+00b41b: */
+                                           RTUNI_ALPHA, /* U+00b41c: */
+                                           RTUNI_ALPHA, /* U+00b41d: */
+                                           RTUNI_ALPHA, /* U+00b41e: */
+                                           RTUNI_ALPHA, /* U+00b41f: */
+                                           RTUNI_ALPHA, /* U+00b420: */
+                                           RTUNI_ALPHA, /* U+00b421: */
+                                           RTUNI_ALPHA, /* U+00b422: */
+                                           RTUNI_ALPHA, /* U+00b423: */
+                                           RTUNI_ALPHA, /* U+00b424: */
+                                           RTUNI_ALPHA, /* U+00b425: */
+                                           RTUNI_ALPHA, /* U+00b426: */
+                                           RTUNI_ALPHA, /* U+00b427: */
+                                           RTUNI_ALPHA, /* U+00b428: */
+                                           RTUNI_ALPHA, /* U+00b429: */
+                                           RTUNI_ALPHA, /* U+00b42a: */
+                                           RTUNI_ALPHA, /* U+00b42b: */
+                                           RTUNI_ALPHA, /* U+00b42c: */
+                                           RTUNI_ALPHA, /* U+00b42d: */
+                                           RTUNI_ALPHA, /* U+00b42e: */
+                                           RTUNI_ALPHA, /* U+00b42f: */
+                                           RTUNI_ALPHA, /* U+00b430: */
+                                           RTUNI_ALPHA, /* U+00b431: */
+                                           RTUNI_ALPHA, /* U+00b432: */
+                                           RTUNI_ALPHA, /* U+00b433: */
+                                           RTUNI_ALPHA, /* U+00b434: */
+                                           RTUNI_ALPHA, /* U+00b435: */
+                                           RTUNI_ALPHA, /* U+00b436: */
+                                           RTUNI_ALPHA, /* U+00b437: */
+                                           RTUNI_ALPHA, /* U+00b438: */
+                                           RTUNI_ALPHA, /* U+00b439: */
+                                           RTUNI_ALPHA, /* U+00b43a: */
+                                           RTUNI_ALPHA, /* U+00b43b: */
+                                           RTUNI_ALPHA, /* U+00b43c: */
+                                           RTUNI_ALPHA, /* U+00b43d: */
+                                           RTUNI_ALPHA, /* U+00b43e: */
+                                           RTUNI_ALPHA, /* U+00b43f: */
+                                           RTUNI_ALPHA, /* U+00b440: */
+                                           RTUNI_ALPHA, /* U+00b441: */
+                                           RTUNI_ALPHA, /* U+00b442: */
+                                           RTUNI_ALPHA, /* U+00b443: */
+                                           RTUNI_ALPHA, /* U+00b444: */
+                                           RTUNI_ALPHA, /* U+00b445: */
+                                           RTUNI_ALPHA, /* U+00b446: */
+                                           RTUNI_ALPHA, /* U+00b447: */
+                                           RTUNI_ALPHA, /* U+00b448: */
+                                           RTUNI_ALPHA, /* U+00b449: */
+                                           RTUNI_ALPHA, /* U+00b44a: */
+                                           RTUNI_ALPHA, /* U+00b44b: */
+                                           RTUNI_ALPHA, /* U+00b44c: */
+                                           RTUNI_ALPHA, /* U+00b44d: */
+                                           RTUNI_ALPHA, /* U+00b44e: */
+                                           RTUNI_ALPHA, /* U+00b44f: */
+                                           RTUNI_ALPHA, /* U+00b450: */
+                                           RTUNI_ALPHA, /* U+00b451: */
+                                           RTUNI_ALPHA, /* U+00b452: */
+                                           RTUNI_ALPHA, /* U+00b453: */
+                                           RTUNI_ALPHA, /* U+00b454: */
+                                           RTUNI_ALPHA, /* U+00b455: */
+                                           RTUNI_ALPHA, /* U+00b456: */
+                                           RTUNI_ALPHA, /* U+00b457: */
+                                           RTUNI_ALPHA, /* U+00b458: */
+                                           RTUNI_ALPHA, /* U+00b459: */
+                                           RTUNI_ALPHA, /* U+00b45a: */
+                                           RTUNI_ALPHA, /* U+00b45b: */
+                                           RTUNI_ALPHA, /* U+00b45c: */
+                                           RTUNI_ALPHA, /* U+00b45d: */
+                                           RTUNI_ALPHA, /* U+00b45e: */
+                                           RTUNI_ALPHA, /* U+00b45f: */
+                                           RTUNI_ALPHA, /* U+00b460: */
+                                           RTUNI_ALPHA, /* U+00b461: */
+                                           RTUNI_ALPHA, /* U+00b462: */
+                                           RTUNI_ALPHA, /* U+00b463: */
+                                           RTUNI_ALPHA, /* U+00b464: */
+                                           RTUNI_ALPHA, /* U+00b465: */
+                                           RTUNI_ALPHA, /* U+00b466: */
+                                           RTUNI_ALPHA, /* U+00b467: */
+                                           RTUNI_ALPHA, /* U+00b468: */
+                                           RTUNI_ALPHA, /* U+00b469: */
+                                           RTUNI_ALPHA, /* U+00b46a: */
+                                           RTUNI_ALPHA, /* U+00b46b: */
+                                           RTUNI_ALPHA, /* U+00b46c: */
+                                           RTUNI_ALPHA, /* U+00b46d: */
+                                           RTUNI_ALPHA, /* U+00b46e: */
+                                           RTUNI_ALPHA, /* U+00b46f: */
+                                           RTUNI_ALPHA, /* U+00b470: */
+                                           RTUNI_ALPHA, /* U+00b471: */
+                                           RTUNI_ALPHA, /* U+00b472: */
+                                           RTUNI_ALPHA, /* U+00b473: */
+                                           RTUNI_ALPHA, /* U+00b474: */
+                                           RTUNI_ALPHA, /* U+00b475: */
+                                           RTUNI_ALPHA, /* U+00b476: */
+                                           RTUNI_ALPHA, /* U+00b477: */
+                                           RTUNI_ALPHA, /* U+00b478: */
+                                           RTUNI_ALPHA, /* U+00b479: */
+                                           RTUNI_ALPHA, /* U+00b47a: */
+                                           RTUNI_ALPHA, /* U+00b47b: */
+                                           RTUNI_ALPHA, /* U+00b47c: */
+                                           RTUNI_ALPHA, /* U+00b47d: */
+                                           RTUNI_ALPHA, /* U+00b47e: */
+                                           RTUNI_ALPHA, /* U+00b47f: */
+                                           RTUNI_ALPHA, /* U+00b480: */
+                                           RTUNI_ALPHA, /* U+00b481: */
+                                           RTUNI_ALPHA, /* U+00b482: */
+                                           RTUNI_ALPHA, /* U+00b483: */
+                                           RTUNI_ALPHA, /* U+00b484: */
+                                           RTUNI_ALPHA, /* U+00b485: */
+                                           RTUNI_ALPHA, /* U+00b486: */
+                                           RTUNI_ALPHA, /* U+00b487: */
+                                           RTUNI_ALPHA, /* U+00b488: */
+                                           RTUNI_ALPHA, /* U+00b489: */
+                                           RTUNI_ALPHA, /* U+00b48a: */
+                                           RTUNI_ALPHA, /* U+00b48b: */
+                                           RTUNI_ALPHA, /* U+00b48c: */
+                                           RTUNI_ALPHA, /* U+00b48d: */
+                                           RTUNI_ALPHA, /* U+00b48e: */
+                                           RTUNI_ALPHA, /* U+00b48f: */
+                                           RTUNI_ALPHA, /* U+00b490: */
+                                           RTUNI_ALPHA, /* U+00b491: */
+                                           RTUNI_ALPHA, /* U+00b492: */
+                                           RTUNI_ALPHA, /* U+00b493: */
+                                           RTUNI_ALPHA, /* U+00b494: */
+                                           RTUNI_ALPHA, /* U+00b495: */
+                                           RTUNI_ALPHA, /* U+00b496: */
+                                           RTUNI_ALPHA, /* U+00b497: */
+                                           RTUNI_ALPHA, /* U+00b498: */
+                                           RTUNI_ALPHA, /* U+00b499: */
+                                           RTUNI_ALPHA, /* U+00b49a: */
+                                           RTUNI_ALPHA, /* U+00b49b: */
+                                           RTUNI_ALPHA, /* U+00b49c: */
+                                           RTUNI_ALPHA, /* U+00b49d: */
+                                           RTUNI_ALPHA, /* U+00b49e: */
+                                           RTUNI_ALPHA, /* U+00b49f: */
+                                           RTUNI_ALPHA, /* U+00b4a0: */
+                                           RTUNI_ALPHA, /* U+00b4a1: */
+                                           RTUNI_ALPHA, /* U+00b4a2: */
+                                           RTUNI_ALPHA, /* U+00b4a3: */
+                                           RTUNI_ALPHA, /* U+00b4a4: */
+                                           RTUNI_ALPHA, /* U+00b4a5: */
+                                           RTUNI_ALPHA, /* U+00b4a6: */
+                                           RTUNI_ALPHA, /* U+00b4a7: */
+                                           RTUNI_ALPHA, /* U+00b4a8: */
+                                           RTUNI_ALPHA, /* U+00b4a9: */
+                                           RTUNI_ALPHA, /* U+00b4aa: */
+                                           RTUNI_ALPHA, /* U+00b4ab: */
+                                           RTUNI_ALPHA, /* U+00b4ac: */
+                                           RTUNI_ALPHA, /* U+00b4ad: */
+                                           RTUNI_ALPHA, /* U+00b4ae: */
+                                           RTUNI_ALPHA, /* U+00b4af: */
+                                           RTUNI_ALPHA, /* U+00b4b0: */
+                                           RTUNI_ALPHA, /* U+00b4b1: */
+                                           RTUNI_ALPHA, /* U+00b4b2: */
+                                           RTUNI_ALPHA, /* U+00b4b3: */
+                                           RTUNI_ALPHA, /* U+00b4b4: */
+                                           RTUNI_ALPHA, /* U+00b4b5: */
+                                           RTUNI_ALPHA, /* U+00b4b6: */
+                                           RTUNI_ALPHA, /* U+00b4b7: */
+                                           RTUNI_ALPHA, /* U+00b4b8: */
+                                           RTUNI_ALPHA, /* U+00b4b9: */
+                                           RTUNI_ALPHA, /* U+00b4ba: */
+                                           RTUNI_ALPHA, /* U+00b4bb: */
+                                           RTUNI_ALPHA, /* U+00b4bc: */
+                                           RTUNI_ALPHA, /* U+00b4bd: */
+                                           RTUNI_ALPHA, /* U+00b4be: */
+                                           RTUNI_ALPHA, /* U+00b4bf: */
+                                           RTUNI_ALPHA, /* U+00b4c0: */
+                                           RTUNI_ALPHA, /* U+00b4c1: */
+                                           RTUNI_ALPHA, /* U+00b4c2: */
+                                           RTUNI_ALPHA, /* U+00b4c3: */
+                                           RTUNI_ALPHA, /* U+00b4c4: */
+                                           RTUNI_ALPHA, /* U+00b4c5: */
+                                           RTUNI_ALPHA, /* U+00b4c6: */
+                                           RTUNI_ALPHA, /* U+00b4c7: */
+                                           RTUNI_ALPHA, /* U+00b4c8: */
+                                           RTUNI_ALPHA, /* U+00b4c9: */
+                                           RTUNI_ALPHA, /* U+00b4ca: */
+                                           RTUNI_ALPHA, /* U+00b4cb: */
+                                           RTUNI_ALPHA, /* U+00b4cc: */
+                                           RTUNI_ALPHA, /* U+00b4cd: */
+                                           RTUNI_ALPHA, /* U+00b4ce: */
+                                           RTUNI_ALPHA, /* U+00b4cf: */
+                                           RTUNI_ALPHA, /* U+00b4d0: */
+                                           RTUNI_ALPHA, /* U+00b4d1: */
+                                           RTUNI_ALPHA, /* U+00b4d2: */
+                                           RTUNI_ALPHA, /* U+00b4d3: */
+                                           RTUNI_ALPHA, /* U+00b4d4: */
+                                           RTUNI_ALPHA, /* U+00b4d5: */
+                                           RTUNI_ALPHA, /* U+00b4d6: */
+                                           RTUNI_ALPHA, /* U+00b4d7: */
+                                           RTUNI_ALPHA, /* U+00b4d8: */
+                                           RTUNI_ALPHA, /* U+00b4d9: */
+                                           RTUNI_ALPHA, /* U+00b4da: */
+                                           RTUNI_ALPHA, /* U+00b4db: */
+                                           RTUNI_ALPHA, /* U+00b4dc: */
+                                           RTUNI_ALPHA, /* U+00b4dd: */
+                                           RTUNI_ALPHA, /* U+00b4de: */
+                                           RTUNI_ALPHA, /* U+00b4df: */
+                                           RTUNI_ALPHA, /* U+00b4e0: */
+                                           RTUNI_ALPHA, /* U+00b4e1: */
+                                           RTUNI_ALPHA, /* U+00b4e2: */
+                                           RTUNI_ALPHA, /* U+00b4e3: */
+                                           RTUNI_ALPHA, /* U+00b4e4: */
+                                           RTUNI_ALPHA, /* U+00b4e5: */
+                                           RTUNI_ALPHA, /* U+00b4e6: */
+                                           RTUNI_ALPHA, /* U+00b4e7: */
+                                           RTUNI_ALPHA, /* U+00b4e8: */
+                                           RTUNI_ALPHA, /* U+00b4e9: */
+                                           RTUNI_ALPHA, /* U+00b4ea: */
+                                           RTUNI_ALPHA, /* U+00b4eb: */
+                                           RTUNI_ALPHA, /* U+00b4ec: */
+                                           RTUNI_ALPHA, /* U+00b4ed: */
+                                           RTUNI_ALPHA, /* U+00b4ee: */
+                                           RTUNI_ALPHA, /* U+00b4ef: */
+                                           RTUNI_ALPHA, /* U+00b4f0: */
+                                           RTUNI_ALPHA, /* U+00b4f1: */
+                                           RTUNI_ALPHA, /* U+00b4f2: */
+                                           RTUNI_ALPHA, /* U+00b4f3: */
+                                           RTUNI_ALPHA, /* U+00b4f4: */
+                                           RTUNI_ALPHA, /* U+00b4f5: */
+                                           RTUNI_ALPHA, /* U+00b4f6: */
+                                           RTUNI_ALPHA, /* U+00b4f7: */
+                                           RTUNI_ALPHA, /* U+00b4f8: */
+                                           RTUNI_ALPHA, /* U+00b4f9: */
+                                           RTUNI_ALPHA, /* U+00b4fa: */
+                                           RTUNI_ALPHA, /* U+00b4fb: */
+                                           RTUNI_ALPHA, /* U+00b4fc: */
+                                           RTUNI_ALPHA, /* U+00b4fd: */
+                                           RTUNI_ALPHA, /* U+00b4fe: */
+                                           RTUNI_ALPHA, /* U+00b4ff: */
+                                           RTUNI_ALPHA, /* U+00b500: */
+                                           RTUNI_ALPHA, /* U+00b501: */
+                                           RTUNI_ALPHA, /* U+00b502: */
+                                           RTUNI_ALPHA, /* U+00b503: */
+                                           RTUNI_ALPHA, /* U+00b504: */
+                                           RTUNI_ALPHA, /* U+00b505: */
+                                           RTUNI_ALPHA, /* U+00b506: */
+                                           RTUNI_ALPHA, /* U+00b507: */
+                                           RTUNI_ALPHA, /* U+00b508: */
+                                           RTUNI_ALPHA, /* U+00b509: */
+                                           RTUNI_ALPHA, /* U+00b50a: */
+                                           RTUNI_ALPHA, /* U+00b50b: */
+                                           RTUNI_ALPHA, /* U+00b50c: */
+                                           RTUNI_ALPHA, /* U+00b50d: */
+                                           RTUNI_ALPHA, /* U+00b50e: */
+                                           RTUNI_ALPHA, /* U+00b50f: */
+                                           RTUNI_ALPHA, /* U+00b510: */
+                                           RTUNI_ALPHA, /* U+00b511: */
+                                           RTUNI_ALPHA, /* U+00b512: */
+                                           RTUNI_ALPHA, /* U+00b513: */
+                                           RTUNI_ALPHA, /* U+00b514: */
+                                           RTUNI_ALPHA, /* U+00b515: */
+                                           RTUNI_ALPHA, /* U+00b516: */
+                                           RTUNI_ALPHA, /* U+00b517: */
+                                           RTUNI_ALPHA, /* U+00b518: */
+                                           RTUNI_ALPHA, /* U+00b519: */
+                                           RTUNI_ALPHA, /* U+00b51a: */
+                                           RTUNI_ALPHA, /* U+00b51b: */
+                                           RTUNI_ALPHA, /* U+00b51c: */
+                                           RTUNI_ALPHA, /* U+00b51d: */
+                                           RTUNI_ALPHA, /* U+00b51e: */
+                                           RTUNI_ALPHA, /* U+00b51f: */
+                                           RTUNI_ALPHA, /* U+00b520: */
+                                           RTUNI_ALPHA, /* U+00b521: */
+                                           RTUNI_ALPHA, /* U+00b522: */
+                                           RTUNI_ALPHA, /* U+00b523: */
+                                           RTUNI_ALPHA, /* U+00b524: */
+                                           RTUNI_ALPHA, /* U+00b525: */
+                                           RTUNI_ALPHA, /* U+00b526: */
+                                           RTUNI_ALPHA, /* U+00b527: */
+                                           RTUNI_ALPHA, /* U+00b528: */
+                                           RTUNI_ALPHA, /* U+00b529: */
+                                           RTUNI_ALPHA, /* U+00b52a: */
+                                           RTUNI_ALPHA, /* U+00b52b: */
+                                           RTUNI_ALPHA, /* U+00b52c: */
+                                           RTUNI_ALPHA, /* U+00b52d: */
+                                           RTUNI_ALPHA, /* U+00b52e: */
+                                           RTUNI_ALPHA, /* U+00b52f: */
+                                           RTUNI_ALPHA, /* U+00b530: */
+                                           RTUNI_ALPHA, /* U+00b531: */
+                                           RTUNI_ALPHA, /* U+00b532: */
+                                           RTUNI_ALPHA, /* U+00b533: */
+                                           RTUNI_ALPHA, /* U+00b534: */
+                                           RTUNI_ALPHA, /* U+00b535: */
+                                           RTUNI_ALPHA, /* U+00b536: */
+                                           RTUNI_ALPHA, /* U+00b537: */
+                                           RTUNI_ALPHA, /* U+00b538: */
+                                           RTUNI_ALPHA, /* U+00b539: */
+                                           RTUNI_ALPHA, /* U+00b53a: */
+                                           RTUNI_ALPHA, /* U+00b53b: */
+                                           RTUNI_ALPHA, /* U+00b53c: */
+                                           RTUNI_ALPHA, /* U+00b53d: */
+                                           RTUNI_ALPHA, /* U+00b53e: */
+                                           RTUNI_ALPHA, /* U+00b53f: */
+                                           RTUNI_ALPHA, /* U+00b540: */
+                                           RTUNI_ALPHA, /* U+00b541: */
+                                           RTUNI_ALPHA, /* U+00b542: */
+                                           RTUNI_ALPHA, /* U+00b543: */
+                                           RTUNI_ALPHA, /* U+00b544: */
+                                           RTUNI_ALPHA, /* U+00b545: */
+                                           RTUNI_ALPHA, /* U+00b546: */
+                                           RTUNI_ALPHA, /* U+00b547: */
+                                           RTUNI_ALPHA, /* U+00b548: */
+                                           RTUNI_ALPHA, /* U+00b549: */
+                                           RTUNI_ALPHA, /* U+00b54a: */
+                                           RTUNI_ALPHA, /* U+00b54b: */
+                                           RTUNI_ALPHA, /* U+00b54c: */
+                                           RTUNI_ALPHA, /* U+00b54d: */
+                                           RTUNI_ALPHA, /* U+00b54e: */
+                                           RTUNI_ALPHA, /* U+00b54f: */
+                                           RTUNI_ALPHA, /* U+00b550: */
+                                           RTUNI_ALPHA, /* U+00b551: */
+                                           RTUNI_ALPHA, /* U+00b552: */
+                                           RTUNI_ALPHA, /* U+00b553: */
+                                           RTUNI_ALPHA, /* U+00b554: */
+                                           RTUNI_ALPHA, /* U+00b555: */
+                                           RTUNI_ALPHA, /* U+00b556: */
+                                           RTUNI_ALPHA, /* U+00b557: */
+                                           RTUNI_ALPHA, /* U+00b558: */
+                                           RTUNI_ALPHA, /* U+00b559: */
+                                           RTUNI_ALPHA, /* U+00b55a: */
+                                           RTUNI_ALPHA, /* U+00b55b: */
+                                           RTUNI_ALPHA, /* U+00b55c: */
+                                           RTUNI_ALPHA, /* U+00b55d: */
+                                           RTUNI_ALPHA, /* U+00b55e: */
+                                           RTUNI_ALPHA, /* U+00b55f: */
+                                           RTUNI_ALPHA, /* U+00b560: */
+                                           RTUNI_ALPHA, /* U+00b561: */
+                                           RTUNI_ALPHA, /* U+00b562: */
+                                           RTUNI_ALPHA, /* U+00b563: */
+                                           RTUNI_ALPHA, /* U+00b564: */
+                                           RTUNI_ALPHA, /* U+00b565: */
+                                           RTUNI_ALPHA, /* U+00b566: */
+                                           RTUNI_ALPHA, /* U+00b567: */
+                                           RTUNI_ALPHA, /* U+00b568: */
+                                           RTUNI_ALPHA, /* U+00b569: */
+                                           RTUNI_ALPHA, /* U+00b56a: */
+                                           RTUNI_ALPHA, /* U+00b56b: */
+                                           RTUNI_ALPHA, /* U+00b56c: */
+                                           RTUNI_ALPHA, /* U+00b56d: */
+                                           RTUNI_ALPHA, /* U+00b56e: */
+                                           RTUNI_ALPHA, /* U+00b56f: */
+                                           RTUNI_ALPHA, /* U+00b570: */
+                                           RTUNI_ALPHA, /* U+00b571: */
+                                           RTUNI_ALPHA, /* U+00b572: */
+                                           RTUNI_ALPHA, /* U+00b573: */
+                                           RTUNI_ALPHA, /* U+00b574: */
+                                           RTUNI_ALPHA, /* U+00b575: */
+                                           RTUNI_ALPHA, /* U+00b576: */
+                                           RTUNI_ALPHA, /* U+00b577: */
+                                           RTUNI_ALPHA, /* U+00b578: */
+                                           RTUNI_ALPHA, /* U+00b579: */
+                                           RTUNI_ALPHA, /* U+00b57a: */
+                                           RTUNI_ALPHA, /* U+00b57b: */
+                                           RTUNI_ALPHA, /* U+00b57c: */
+                                           RTUNI_ALPHA, /* U+00b57d: */
+                                           RTUNI_ALPHA, /* U+00b57e: */
+                                           RTUNI_ALPHA, /* U+00b57f: */
+                                           RTUNI_ALPHA, /* U+00b580: */
+                                           RTUNI_ALPHA, /* U+00b581: */
+                                           RTUNI_ALPHA, /* U+00b582: */
+                                           RTUNI_ALPHA, /* U+00b583: */
+                                           RTUNI_ALPHA, /* U+00b584: */
+                                           RTUNI_ALPHA, /* U+00b585: */
+                                           RTUNI_ALPHA, /* U+00b586: */
+                                           RTUNI_ALPHA, /* U+00b587: */
+                                           RTUNI_ALPHA, /* U+00b588: */
+                                           RTUNI_ALPHA, /* U+00b589: */
+                                           RTUNI_ALPHA, /* U+00b58a: */
+                                           RTUNI_ALPHA, /* U+00b58b: */
+                                           RTUNI_ALPHA, /* U+00b58c: */
+                                           RTUNI_ALPHA, /* U+00b58d: */
+                                           RTUNI_ALPHA, /* U+00b58e: */
+                                           RTUNI_ALPHA, /* U+00b58f: */
+                                           RTUNI_ALPHA, /* U+00b590: */
+                                           RTUNI_ALPHA, /* U+00b591: */
+                                           RTUNI_ALPHA, /* U+00b592: */
+                                           RTUNI_ALPHA, /* U+00b593: */
+                                           RTUNI_ALPHA, /* U+00b594: */
+                                           RTUNI_ALPHA, /* U+00b595: */
+                                           RTUNI_ALPHA, /* U+00b596: */
+                                           RTUNI_ALPHA, /* U+00b597: */
+                                           RTUNI_ALPHA, /* U+00b598: */
+                                           RTUNI_ALPHA, /* U+00b599: */
+                                           RTUNI_ALPHA, /* U+00b59a: */
+                                           RTUNI_ALPHA, /* U+00b59b: */
+                                           RTUNI_ALPHA, /* U+00b59c: */
+                                           RTUNI_ALPHA, /* U+00b59d: */
+                                           RTUNI_ALPHA, /* U+00b59e: */
+                                           RTUNI_ALPHA, /* U+00b59f: */
+                                           RTUNI_ALPHA, /* U+00b5a0: */
+                                           RTUNI_ALPHA, /* U+00b5a1: */
+                                           RTUNI_ALPHA, /* U+00b5a2: */
+                                           RTUNI_ALPHA, /* U+00b5a3: */
+                                           RTUNI_ALPHA, /* U+00b5a4: */
+                                           RTUNI_ALPHA, /* U+00b5a5: */
+                                           RTUNI_ALPHA, /* U+00b5a6: */
+                                           RTUNI_ALPHA, /* U+00b5a7: */
+                                           RTUNI_ALPHA, /* U+00b5a8: */
+                                           RTUNI_ALPHA, /* U+00b5a9: */
+                                           RTUNI_ALPHA, /* U+00b5aa: */
+                                           RTUNI_ALPHA, /* U+00b5ab: */
+                                           RTUNI_ALPHA, /* U+00b5ac: */
+                                           RTUNI_ALPHA, /* U+00b5ad: */
+                                           RTUNI_ALPHA, /* U+00b5ae: */
+                                           RTUNI_ALPHA, /* U+00b5af: */
+                                           RTUNI_ALPHA, /* U+00b5b0: */
+                                           RTUNI_ALPHA, /* U+00b5b1: */
+                                           RTUNI_ALPHA, /* U+00b5b2: */
+                                           RTUNI_ALPHA, /* U+00b5b3: */
+                                           RTUNI_ALPHA, /* U+00b5b4: */
+                                           RTUNI_ALPHA, /* U+00b5b5: */
+                                           RTUNI_ALPHA, /* U+00b5b6: */
+                                           RTUNI_ALPHA, /* U+00b5b7: */
+                                           RTUNI_ALPHA, /* U+00b5b8: */
+                                           RTUNI_ALPHA, /* U+00b5b9: */
+                                           RTUNI_ALPHA, /* U+00b5ba: */
+                                           RTUNI_ALPHA, /* U+00b5bb: */
+                                           RTUNI_ALPHA, /* U+00b5bc: */
+                                           RTUNI_ALPHA, /* U+00b5bd: */
+                                           RTUNI_ALPHA, /* U+00b5be: */
+                                           RTUNI_ALPHA, /* U+00b5bf: */
+                                           RTUNI_ALPHA, /* U+00b5c0: */
+                                           RTUNI_ALPHA, /* U+00b5c1: */
+                                           RTUNI_ALPHA, /* U+00b5c2: */
+                                           RTUNI_ALPHA, /* U+00b5c3: */
+                                           RTUNI_ALPHA, /* U+00b5c4: */
+                                           RTUNI_ALPHA, /* U+00b5c5: */
+                                           RTUNI_ALPHA, /* U+00b5c6: */
+                                           RTUNI_ALPHA, /* U+00b5c7: */
+                                           RTUNI_ALPHA, /* U+00b5c8: */
+                                           RTUNI_ALPHA, /* U+00b5c9: */
+                                           RTUNI_ALPHA, /* U+00b5ca: */
+                                           RTUNI_ALPHA, /* U+00b5cb: */
+                                           RTUNI_ALPHA, /* U+00b5cc: */
+                                           RTUNI_ALPHA, /* U+00b5cd: */
+                                           RTUNI_ALPHA, /* U+00b5ce: */
+                                           RTUNI_ALPHA, /* U+00b5cf: */
+                                           RTUNI_ALPHA, /* U+00b5d0: */
+                                           RTUNI_ALPHA, /* U+00b5d1: */
+                                           RTUNI_ALPHA, /* U+00b5d2: */
+                                           RTUNI_ALPHA, /* U+00b5d3: */
+                                           RTUNI_ALPHA, /* U+00b5d4: */
+                                           RTUNI_ALPHA, /* U+00b5d5: */
+                                           RTUNI_ALPHA, /* U+00b5d6: */
+                                           RTUNI_ALPHA, /* U+00b5d7: */
+                                           RTUNI_ALPHA, /* U+00b5d8: */
+                                           RTUNI_ALPHA, /* U+00b5d9: */
+                                           RTUNI_ALPHA, /* U+00b5da: */
+                                           RTUNI_ALPHA, /* U+00b5db: */
+                                           RTUNI_ALPHA, /* U+00b5dc: */
+                                           RTUNI_ALPHA, /* U+00b5dd: */
+                                           RTUNI_ALPHA, /* U+00b5de: */
+                                           RTUNI_ALPHA, /* U+00b5df: */
+                                           RTUNI_ALPHA, /* U+00b5e0: */
+                                           RTUNI_ALPHA, /* U+00b5e1: */
+                                           RTUNI_ALPHA, /* U+00b5e2: */
+                                           RTUNI_ALPHA, /* U+00b5e3: */
+                                           RTUNI_ALPHA, /* U+00b5e4: */
+                                           RTUNI_ALPHA, /* U+00b5e5: */
+                                           RTUNI_ALPHA, /* U+00b5e6: */
+                                           RTUNI_ALPHA, /* U+00b5e7: */
+                                           RTUNI_ALPHA, /* U+00b5e8: */
+                                           RTUNI_ALPHA, /* U+00b5e9: */
+                                           RTUNI_ALPHA, /* U+00b5ea: */
+                                           RTUNI_ALPHA, /* U+00b5eb: */
+                                           RTUNI_ALPHA, /* U+00b5ec: */
+                                           RTUNI_ALPHA, /* U+00b5ed: */
+                                           RTUNI_ALPHA, /* U+00b5ee: */
+                                           RTUNI_ALPHA, /* U+00b5ef: */
+                                           RTUNI_ALPHA, /* U+00b5f0: */
+                                           RTUNI_ALPHA, /* U+00b5f1: */
+                                           RTUNI_ALPHA, /* U+00b5f2: */
+                                           RTUNI_ALPHA, /* U+00b5f3: */
+                                           RTUNI_ALPHA, /* U+00b5f4: */
+                                           RTUNI_ALPHA, /* U+00b5f5: */
+                                           RTUNI_ALPHA, /* U+00b5f6: */
+                                           RTUNI_ALPHA, /* U+00b5f7: */
+                                           RTUNI_ALPHA, /* U+00b5f8: */
+                                           RTUNI_ALPHA, /* U+00b5f9: */
+                                           RTUNI_ALPHA, /* U+00b5fa: */
+                                           RTUNI_ALPHA, /* U+00b5fb: */
+                                           RTUNI_ALPHA, /* U+00b5fc: */
+                                           RTUNI_ALPHA, /* U+00b5fd: */
+                                           RTUNI_ALPHA, /* U+00b5fe: */
+                                           RTUNI_ALPHA, /* U+00b5ff: */
+                                           RTUNI_ALPHA, /* U+00b600: */
+                                           RTUNI_ALPHA, /* U+00b601: */
+                                           RTUNI_ALPHA, /* U+00b602: */
+                                           RTUNI_ALPHA, /* U+00b603: */
+                                           RTUNI_ALPHA, /* U+00b604: */
+                                           RTUNI_ALPHA, /* U+00b605: */
+                                           RTUNI_ALPHA, /* U+00b606: */
+                                           RTUNI_ALPHA, /* U+00b607: */
+                                           RTUNI_ALPHA, /* U+00b608: */
+                                           RTUNI_ALPHA, /* U+00b609: */
+                                           RTUNI_ALPHA, /* U+00b60a: */
+                                           RTUNI_ALPHA, /* U+00b60b: */
+                                           RTUNI_ALPHA, /* U+00b60c: */
+                                           RTUNI_ALPHA, /* U+00b60d: */
+                                           RTUNI_ALPHA, /* U+00b60e: */
+                                           RTUNI_ALPHA, /* U+00b60f: */
+                                           RTUNI_ALPHA, /* U+00b610: */
+                                           RTUNI_ALPHA, /* U+00b611: */
+                                           RTUNI_ALPHA, /* U+00b612: */
+                                           RTUNI_ALPHA, /* U+00b613: */
+                                           RTUNI_ALPHA, /* U+00b614: */
+                                           RTUNI_ALPHA, /* U+00b615: */
+                                           RTUNI_ALPHA, /* U+00b616: */
+                                           RTUNI_ALPHA, /* U+00b617: */
+                                           RTUNI_ALPHA, /* U+00b618: */
+                                           RTUNI_ALPHA, /* U+00b619: */
+                                           RTUNI_ALPHA, /* U+00b61a: */
+                                           RTUNI_ALPHA, /* U+00b61b: */
+                                           RTUNI_ALPHA, /* U+00b61c: */
+                                           RTUNI_ALPHA, /* U+00b61d: */
+                                           RTUNI_ALPHA, /* U+00b61e: */
+                                           RTUNI_ALPHA, /* U+00b61f: */
+                                           RTUNI_ALPHA, /* U+00b620: */
+                                           RTUNI_ALPHA, /* U+00b621: */
+                                           RTUNI_ALPHA, /* U+00b622: */
+                                           RTUNI_ALPHA, /* U+00b623: */
+                                           RTUNI_ALPHA, /* U+00b624: */
+                                           RTUNI_ALPHA, /* U+00b625: */
+                                           RTUNI_ALPHA, /* U+00b626: */
+                                           RTUNI_ALPHA, /* U+00b627: */
+                                           RTUNI_ALPHA, /* U+00b628: */
+                                           RTUNI_ALPHA, /* U+00b629: */
+                                           RTUNI_ALPHA, /* U+00b62a: */
+                                           RTUNI_ALPHA, /* U+00b62b: */
+                                           RTUNI_ALPHA, /* U+00b62c: */
+                                           RTUNI_ALPHA, /* U+00b62d: */
+                                           RTUNI_ALPHA, /* U+00b62e: */
+                                           RTUNI_ALPHA, /* U+00b62f: */
+                                           RTUNI_ALPHA, /* U+00b630: */
+                                           RTUNI_ALPHA, /* U+00b631: */
+                                           RTUNI_ALPHA, /* U+00b632: */
+                                           RTUNI_ALPHA, /* U+00b633: */
+                                           RTUNI_ALPHA, /* U+00b634: */
+                                           RTUNI_ALPHA, /* U+00b635: */
+                                           RTUNI_ALPHA, /* U+00b636: */
+                                           RTUNI_ALPHA, /* U+00b637: */
+                                           RTUNI_ALPHA, /* U+00b638: */
+                                           RTUNI_ALPHA, /* U+00b639: */
+                                           RTUNI_ALPHA, /* U+00b63a: */
+                                           RTUNI_ALPHA, /* U+00b63b: */
+                                           RTUNI_ALPHA, /* U+00b63c: */
+                                           RTUNI_ALPHA, /* U+00b63d: */
+                                           RTUNI_ALPHA, /* U+00b63e: */
+                                           RTUNI_ALPHA, /* U+00b63f: */
+                                           RTUNI_ALPHA, /* U+00b640: */
+                                           RTUNI_ALPHA, /* U+00b641: */
+                                           RTUNI_ALPHA, /* U+00b642: */
+                                           RTUNI_ALPHA, /* U+00b643: */
+                                           RTUNI_ALPHA, /* U+00b644: */
+                                           RTUNI_ALPHA, /* U+00b645: */
+                                           RTUNI_ALPHA, /* U+00b646: */
+                                           RTUNI_ALPHA, /* U+00b647: */
+                                           RTUNI_ALPHA, /* U+00b648: */
+                                           RTUNI_ALPHA, /* U+00b649: */
+                                           RTUNI_ALPHA, /* U+00b64a: */
+                                           RTUNI_ALPHA, /* U+00b64b: */
+                                           RTUNI_ALPHA, /* U+00b64c: */
+                                           RTUNI_ALPHA, /* U+00b64d: */
+                                           RTUNI_ALPHA, /* U+00b64e: */
+                                           RTUNI_ALPHA, /* U+00b64f: */
+                                           RTUNI_ALPHA, /* U+00b650: */
+                                           RTUNI_ALPHA, /* U+00b651: */
+                                           RTUNI_ALPHA, /* U+00b652: */
+                                           RTUNI_ALPHA, /* U+00b653: */
+                                           RTUNI_ALPHA, /* U+00b654: */
+                                           RTUNI_ALPHA, /* U+00b655: */
+                                           RTUNI_ALPHA, /* U+00b656: */
+                                           RTUNI_ALPHA, /* U+00b657: */
+                                           RTUNI_ALPHA, /* U+00b658: */
+                                           RTUNI_ALPHA, /* U+00b659: */
+                                           RTUNI_ALPHA, /* U+00b65a: */
+                                           RTUNI_ALPHA, /* U+00b65b: */
+                                           RTUNI_ALPHA, /* U+00b65c: */
+                                           RTUNI_ALPHA, /* U+00b65d: */
+                                           RTUNI_ALPHA, /* U+00b65e: */
+                                           RTUNI_ALPHA, /* U+00b65f: */
+                                           RTUNI_ALPHA, /* U+00b660: */
+                                           RTUNI_ALPHA, /* U+00b661: */
+                                           RTUNI_ALPHA, /* U+00b662: */
+                                           RTUNI_ALPHA, /* U+00b663: */
+                                           RTUNI_ALPHA, /* U+00b664: */
+                                           RTUNI_ALPHA, /* U+00b665: */
+                                           RTUNI_ALPHA, /* U+00b666: */
+                                           RTUNI_ALPHA, /* U+00b667: */
+                                           RTUNI_ALPHA, /* U+00b668: */
+                                           RTUNI_ALPHA, /* U+00b669: */
+                                           RTUNI_ALPHA, /* U+00b66a: */
+                                           RTUNI_ALPHA, /* U+00b66b: */
+                                           RTUNI_ALPHA, /* U+00b66c: */
+                                           RTUNI_ALPHA, /* U+00b66d: */
+                                           RTUNI_ALPHA, /* U+00b66e: */
+                                           RTUNI_ALPHA, /* U+00b66f: */
+                                           RTUNI_ALPHA, /* U+00b670: */
+                                           RTUNI_ALPHA, /* U+00b671: */
+                                           RTUNI_ALPHA, /* U+00b672: */
+                                           RTUNI_ALPHA, /* U+00b673: */
+                                           RTUNI_ALPHA, /* U+00b674: */
+                                           RTUNI_ALPHA, /* U+00b675: */
+                                           RTUNI_ALPHA, /* U+00b676: */
+                                           RTUNI_ALPHA, /* U+00b677: */
+                                           RTUNI_ALPHA, /* U+00b678: */
+                                           RTUNI_ALPHA, /* U+00b679: */
+                                           RTUNI_ALPHA, /* U+00b67a: */
+                                           RTUNI_ALPHA, /* U+00b67b: */
+                                           RTUNI_ALPHA, /* U+00b67c: */
+                                           RTUNI_ALPHA, /* U+00b67d: */
+                                           RTUNI_ALPHA, /* U+00b67e: */
+                                           RTUNI_ALPHA, /* U+00b67f: */
+                                           RTUNI_ALPHA, /* U+00b680: */
+                                           RTUNI_ALPHA, /* U+00b681: */
+                                           RTUNI_ALPHA, /* U+00b682: */
+                                           RTUNI_ALPHA, /* U+00b683: */
+                                           RTUNI_ALPHA, /* U+00b684: */
+                                           RTUNI_ALPHA, /* U+00b685: */
+                                           RTUNI_ALPHA, /* U+00b686: */
+                                           RTUNI_ALPHA, /* U+00b687: */
+                                           RTUNI_ALPHA, /* U+00b688: */
+                                           RTUNI_ALPHA, /* U+00b689: */
+                                           RTUNI_ALPHA, /* U+00b68a: */
+                                           RTUNI_ALPHA, /* U+00b68b: */
+                                           RTUNI_ALPHA, /* U+00b68c: */
+                                           RTUNI_ALPHA, /* U+00b68d: */
+                                           RTUNI_ALPHA, /* U+00b68e: */
+                                           RTUNI_ALPHA, /* U+00b68f: */
+                                           RTUNI_ALPHA, /* U+00b690: */
+                                           RTUNI_ALPHA, /* U+00b691: */
+                                           RTUNI_ALPHA, /* U+00b692: */
+                                           RTUNI_ALPHA, /* U+00b693: */
+                                           RTUNI_ALPHA, /* U+00b694: */
+                                           RTUNI_ALPHA, /* U+00b695: */
+                                           RTUNI_ALPHA, /* U+00b696: */
+                                           RTUNI_ALPHA, /* U+00b697: */
+                                           RTUNI_ALPHA, /* U+00b698: */
+                                           RTUNI_ALPHA, /* U+00b699: */
+                                           RTUNI_ALPHA, /* U+00b69a: */
+                                           RTUNI_ALPHA, /* U+00b69b: */
+                                           RTUNI_ALPHA, /* U+00b69c: */
+                                           RTUNI_ALPHA, /* U+00b69d: */
+                                           RTUNI_ALPHA, /* U+00b69e: */
+                                           RTUNI_ALPHA, /* U+00b69f: */
+                                           RTUNI_ALPHA, /* U+00b6a0: */
+                                           RTUNI_ALPHA, /* U+00b6a1: */
+                                           RTUNI_ALPHA, /* U+00b6a2: */
+                                           RTUNI_ALPHA, /* U+00b6a3: */
+                                           RTUNI_ALPHA, /* U+00b6a4: */
+                                           RTUNI_ALPHA, /* U+00b6a5: */
+                                           RTUNI_ALPHA, /* U+00b6a6: */
+                                           RTUNI_ALPHA, /* U+00b6a7: */
+                                           RTUNI_ALPHA, /* U+00b6a8: */
+                                           RTUNI_ALPHA, /* U+00b6a9: */
+                                           RTUNI_ALPHA, /* U+00b6aa: */
+                                           RTUNI_ALPHA, /* U+00b6ab: */
+                                           RTUNI_ALPHA, /* U+00b6ac: */
+                                           RTUNI_ALPHA, /* U+00b6ad: */
+                                           RTUNI_ALPHA, /* U+00b6ae: */
+                                           RTUNI_ALPHA, /* U+00b6af: */
+                                           RTUNI_ALPHA, /* U+00b6b0: */
+                                           RTUNI_ALPHA, /* U+00b6b1: */
+                                           RTUNI_ALPHA, /* U+00b6b2: */
+                                           RTUNI_ALPHA, /* U+00b6b3: */
+                                           RTUNI_ALPHA, /* U+00b6b4: */
+                                           RTUNI_ALPHA, /* U+00b6b5: */
+                                           RTUNI_ALPHA, /* U+00b6b6: */
+                                           RTUNI_ALPHA, /* U+00b6b7: */
+                                           RTUNI_ALPHA, /* U+00b6b8: */
+                                           RTUNI_ALPHA, /* U+00b6b9: */
+                                           RTUNI_ALPHA, /* U+00b6ba: */
+                                           RTUNI_ALPHA, /* U+00b6bb: */
+                                           RTUNI_ALPHA, /* U+00b6bc: */
+                                           RTUNI_ALPHA, /* U+00b6bd: */
+                                           RTUNI_ALPHA, /* U+00b6be: */
+                                           RTUNI_ALPHA, /* U+00b6bf: */
+                                           RTUNI_ALPHA, /* U+00b6c0: */
+                                           RTUNI_ALPHA, /* U+00b6c1: */
+                                           RTUNI_ALPHA, /* U+00b6c2: */
+                                           RTUNI_ALPHA, /* U+00b6c3: */
+                                           RTUNI_ALPHA, /* U+00b6c4: */
+                                           RTUNI_ALPHA, /* U+00b6c5: */
+                                           RTUNI_ALPHA, /* U+00b6c6: */
+                                           RTUNI_ALPHA, /* U+00b6c7: */
+                                           RTUNI_ALPHA, /* U+00b6c8: */
+                                           RTUNI_ALPHA, /* U+00b6c9: */
+                                           RTUNI_ALPHA, /* U+00b6ca: */
+                                           RTUNI_ALPHA, /* U+00b6cb: */
+                                           RTUNI_ALPHA, /* U+00b6cc: */
+                                           RTUNI_ALPHA, /* U+00b6cd: */
+                                           RTUNI_ALPHA, /* U+00b6ce: */
+                                           RTUNI_ALPHA, /* U+00b6cf: */
+                                           RTUNI_ALPHA, /* U+00b6d0: */
+                                           RTUNI_ALPHA, /* U+00b6d1: */
+                                           RTUNI_ALPHA, /* U+00b6d2: */
+                                           RTUNI_ALPHA, /* U+00b6d3: */
+                                           RTUNI_ALPHA, /* U+00b6d4: */
+                                           RTUNI_ALPHA, /* U+00b6d5: */
+                                           RTUNI_ALPHA, /* U+00b6d6: */
+                                           RTUNI_ALPHA, /* U+00b6d7: */
+                                           RTUNI_ALPHA, /* U+00b6d8: */
+                                           RTUNI_ALPHA, /* U+00b6d9: */
+                                           RTUNI_ALPHA, /* U+00b6da: */
+                                           RTUNI_ALPHA, /* U+00b6db: */
+                                           RTUNI_ALPHA, /* U+00b6dc: */
+                                           RTUNI_ALPHA, /* U+00b6dd: */
+                                           RTUNI_ALPHA, /* U+00b6de: */
+                                           RTUNI_ALPHA, /* U+00b6df: */
+                                           RTUNI_ALPHA, /* U+00b6e0: */
+                                           RTUNI_ALPHA, /* U+00b6e1: */
+                                           RTUNI_ALPHA, /* U+00b6e2: */
+                                           RTUNI_ALPHA, /* U+00b6e3: */
+                                           RTUNI_ALPHA, /* U+00b6e4: */
+                                           RTUNI_ALPHA, /* U+00b6e5: */
+                                           RTUNI_ALPHA, /* U+00b6e6: */
+                                           RTUNI_ALPHA, /* U+00b6e7: */
+                                           RTUNI_ALPHA, /* U+00b6e8: */
+                                           RTUNI_ALPHA, /* U+00b6e9: */
+                                           RTUNI_ALPHA, /* U+00b6ea: */
+                                           RTUNI_ALPHA, /* U+00b6eb: */
+                                           RTUNI_ALPHA, /* U+00b6ec: */
+                                           RTUNI_ALPHA, /* U+00b6ed: */
+                                           RTUNI_ALPHA, /* U+00b6ee: */
+                                           RTUNI_ALPHA, /* U+00b6ef: */
+                                           RTUNI_ALPHA, /* U+00b6f0: */
+                                           RTUNI_ALPHA, /* U+00b6f1: */
+                                           RTUNI_ALPHA, /* U+00b6f2: */
+                                           RTUNI_ALPHA, /* U+00b6f3: */
+                                           RTUNI_ALPHA, /* U+00b6f4: */
+                                           RTUNI_ALPHA, /* U+00b6f5: */
+                                           RTUNI_ALPHA, /* U+00b6f6: */
+                                           RTUNI_ALPHA, /* U+00b6f7: */
+                                           RTUNI_ALPHA, /* U+00b6f8: */
+                                           RTUNI_ALPHA, /* U+00b6f9: */
+                                           RTUNI_ALPHA, /* U+00b6fa: */
+                                           RTUNI_ALPHA, /* U+00b6fb: */
+                                           RTUNI_ALPHA, /* U+00b6fc: */
+                                           RTUNI_ALPHA, /* U+00b6fd: */
+                                           RTUNI_ALPHA, /* U+00b6fe: */
+                                           RTUNI_ALPHA, /* U+00b6ff: */
+                                           RTUNI_ALPHA, /* U+00b700: */
+                                           RTUNI_ALPHA, /* U+00b701: */
+                                           RTUNI_ALPHA, /* U+00b702: */
+                                           RTUNI_ALPHA, /* U+00b703: */
+                                           RTUNI_ALPHA, /* U+00b704: */
+                                           RTUNI_ALPHA, /* U+00b705: */
+                                           RTUNI_ALPHA, /* U+00b706: */
+                                           RTUNI_ALPHA, /* U+00b707: */
+                                           RTUNI_ALPHA, /* U+00b708: */
+                                           RTUNI_ALPHA, /* U+00b709: */
+                                           RTUNI_ALPHA, /* U+00b70a: */
+                                           RTUNI_ALPHA, /* U+00b70b: */
+                                           RTUNI_ALPHA, /* U+00b70c: */
+                                           RTUNI_ALPHA, /* U+00b70d: */
+                                           RTUNI_ALPHA, /* U+00b70e: */
+                                           RTUNI_ALPHA, /* U+00b70f: */
+                                           RTUNI_ALPHA, /* U+00b710: */
+                                           RTUNI_ALPHA, /* U+00b711: */
+                                           RTUNI_ALPHA, /* U+00b712: */
+                                           RTUNI_ALPHA, /* U+00b713: */
+                                           RTUNI_ALPHA, /* U+00b714: */
+                                           RTUNI_ALPHA, /* U+00b715: */
+                                           RTUNI_ALPHA, /* U+00b716: */
+                                           RTUNI_ALPHA, /* U+00b717: */
+                                           RTUNI_ALPHA, /* U+00b718: */
+                                           RTUNI_ALPHA, /* U+00b719: */
+                                           RTUNI_ALPHA, /* U+00b71a: */
+                                           RTUNI_ALPHA, /* U+00b71b: */
+                                           RTUNI_ALPHA, /* U+00b71c: */
+                                           RTUNI_ALPHA, /* U+00b71d: */
+                                           RTUNI_ALPHA, /* U+00b71e: */
+                                           RTUNI_ALPHA, /* U+00b71f: */
+                                           RTUNI_ALPHA, /* U+00b720: */
+                                           RTUNI_ALPHA, /* U+00b721: */
+                                           RTUNI_ALPHA, /* U+00b722: */
+                                           RTUNI_ALPHA, /* U+00b723: */
+                                           RTUNI_ALPHA, /* U+00b724: */
+                                           RTUNI_ALPHA, /* U+00b725: */
+                                           RTUNI_ALPHA, /* U+00b726: */
+                                           RTUNI_ALPHA, /* U+00b727: */
+                                           RTUNI_ALPHA, /* U+00b728: */
+                                           RTUNI_ALPHA, /* U+00b729: */
+                                           RTUNI_ALPHA, /* U+00b72a: */
+                                           RTUNI_ALPHA, /* U+00b72b: */
+                                           RTUNI_ALPHA, /* U+00b72c: */
+                                           RTUNI_ALPHA, /* U+00b72d: */
+                                           RTUNI_ALPHA, /* U+00b72e: */
+                                           RTUNI_ALPHA, /* U+00b72f: */
+                                           RTUNI_ALPHA, /* U+00b730: */
+                                           RTUNI_ALPHA, /* U+00b731: */
+                                           RTUNI_ALPHA, /* U+00b732: */
+                                           RTUNI_ALPHA, /* U+00b733: */
+                                           RTUNI_ALPHA, /* U+00b734: */
+                                           RTUNI_ALPHA, /* U+00b735: */
+                                           RTUNI_ALPHA, /* U+00b736: */
+                                           RTUNI_ALPHA, /* U+00b737: */
+                                           RTUNI_ALPHA, /* U+00b738: */
+                                           RTUNI_ALPHA, /* U+00b739: */
+                                           RTUNI_ALPHA, /* U+00b73a: */
+                                           RTUNI_ALPHA, /* U+00b73b: */
+                                           RTUNI_ALPHA, /* U+00b73c: */
+                                           RTUNI_ALPHA, /* U+00b73d: */
+                                           RTUNI_ALPHA, /* U+00b73e: */
+                                           RTUNI_ALPHA, /* U+00b73f: */
+                                           RTUNI_ALPHA, /* U+00b740: */
+                                           RTUNI_ALPHA, /* U+00b741: */
+                                           RTUNI_ALPHA, /* U+00b742: */
+                                           RTUNI_ALPHA, /* U+00b743: */
+                                           RTUNI_ALPHA, /* U+00b744: */
+                                           RTUNI_ALPHA, /* U+00b745: */
+                                           RTUNI_ALPHA, /* U+00b746: */
+                                           RTUNI_ALPHA, /* U+00b747: */
+                                           RTUNI_ALPHA, /* U+00b748: */
+                                           RTUNI_ALPHA, /* U+00b749: */
+                                           RTUNI_ALPHA, /* U+00b74a: */
+                                           RTUNI_ALPHA, /* U+00b74b: */
+                                           RTUNI_ALPHA, /* U+00b74c: */
+                                           RTUNI_ALPHA, /* U+00b74d: */
+                                           RTUNI_ALPHA, /* U+00b74e: */
+                                           RTUNI_ALPHA, /* U+00b74f: */
+                                           RTUNI_ALPHA, /* U+00b750: */
+                                           RTUNI_ALPHA, /* U+00b751: */
+                                           RTUNI_ALPHA, /* U+00b752: */
+                                           RTUNI_ALPHA, /* U+00b753: */
+                                           RTUNI_ALPHA, /* U+00b754: */
+                                           RTUNI_ALPHA, /* U+00b755: */
+                                           RTUNI_ALPHA, /* U+00b756: */
+                                           RTUNI_ALPHA, /* U+00b757: */
+                                           RTUNI_ALPHA, /* U+00b758: */
+                                           RTUNI_ALPHA, /* U+00b759: */
+                                           RTUNI_ALPHA, /* U+00b75a: */
+                                           RTUNI_ALPHA, /* U+00b75b: */
+                                           RTUNI_ALPHA, /* U+00b75c: */
+                                           RTUNI_ALPHA, /* U+00b75d: */
+                                           RTUNI_ALPHA, /* U+00b75e: */
+                                           RTUNI_ALPHA, /* U+00b75f: */
+                                           RTUNI_ALPHA, /* U+00b760: */
+                                           RTUNI_ALPHA, /* U+00b761: */
+                                           RTUNI_ALPHA, /* U+00b762: */
+                                           RTUNI_ALPHA, /* U+00b763: */
+                                           RTUNI_ALPHA, /* U+00b764: */
+                                           RTUNI_ALPHA, /* U+00b765: */
+                                           RTUNI_ALPHA, /* U+00b766: */
+                                           RTUNI_ALPHA, /* U+00b767: */
+                                           RTUNI_ALPHA, /* U+00b768: */
+                                           RTUNI_ALPHA, /* U+00b769: */
+                                           RTUNI_ALPHA, /* U+00b76a: */
+                                           RTUNI_ALPHA, /* U+00b76b: */
+                                           RTUNI_ALPHA, /* U+00b76c: */
+                                           RTUNI_ALPHA, /* U+00b76d: */
+                                           RTUNI_ALPHA, /* U+00b76e: */
+                                           RTUNI_ALPHA, /* U+00b76f: */
+                                           RTUNI_ALPHA, /* U+00b770: */
+                                           RTUNI_ALPHA, /* U+00b771: */
+                                           RTUNI_ALPHA, /* U+00b772: */
+                                           RTUNI_ALPHA, /* U+00b773: */
+                                           RTUNI_ALPHA, /* U+00b774: */
+                                           RTUNI_ALPHA, /* U+00b775: */
+                                           RTUNI_ALPHA, /* U+00b776: */
+                                           RTUNI_ALPHA, /* U+00b777: */
+                                           RTUNI_ALPHA, /* U+00b778: */
+                                           RTUNI_ALPHA, /* U+00b779: */
+                                           RTUNI_ALPHA, /* U+00b77a: */
+                                           RTUNI_ALPHA, /* U+00b77b: */
+                                           RTUNI_ALPHA, /* U+00b77c: */
+                                           RTUNI_ALPHA, /* U+00b77d: */
+                                           RTUNI_ALPHA, /* U+00b77e: */
+                                           RTUNI_ALPHA, /* U+00b77f: */
+                                           RTUNI_ALPHA, /* U+00b780: */
+                                           RTUNI_ALPHA, /* U+00b781: */
+                                           RTUNI_ALPHA, /* U+00b782: */
+                                           RTUNI_ALPHA, /* U+00b783: */
+                                           RTUNI_ALPHA, /* U+00b784: */
+                                           RTUNI_ALPHA, /* U+00b785: */
+                                           RTUNI_ALPHA, /* U+00b786: */
+                                           RTUNI_ALPHA, /* U+00b787: */
+                                           RTUNI_ALPHA, /* U+00b788: */
+                                           RTUNI_ALPHA, /* U+00b789: */
+                                           RTUNI_ALPHA, /* U+00b78a: */
+                                           RTUNI_ALPHA, /* U+00b78b: */
+                                           RTUNI_ALPHA, /* U+00b78c: */
+                                           RTUNI_ALPHA, /* U+00b78d: */
+                                           RTUNI_ALPHA, /* U+00b78e: */
+                                           RTUNI_ALPHA, /* U+00b78f: */
+                                           RTUNI_ALPHA, /* U+00b790: */
+                                           RTUNI_ALPHA, /* U+00b791: */
+                                           RTUNI_ALPHA, /* U+00b792: */
+                                           RTUNI_ALPHA, /* U+00b793: */
+                                           RTUNI_ALPHA, /* U+00b794: */
+                                           RTUNI_ALPHA, /* U+00b795: */
+                                           RTUNI_ALPHA, /* U+00b796: */
+                                           RTUNI_ALPHA, /* U+00b797: */
+                                           RTUNI_ALPHA, /* U+00b798: */
+                                           RTUNI_ALPHA, /* U+00b799: */
+                                           RTUNI_ALPHA, /* U+00b79a: */
+                                           RTUNI_ALPHA, /* U+00b79b: */
+                                           RTUNI_ALPHA, /* U+00b79c: */
+                                           RTUNI_ALPHA, /* U+00b79d: */
+                                           RTUNI_ALPHA, /* U+00b79e: */
+                                           RTUNI_ALPHA, /* U+00b79f: */
+                                           RTUNI_ALPHA, /* U+00b7a0: */
+                                           RTUNI_ALPHA, /* U+00b7a1: */
+                                           RTUNI_ALPHA, /* U+00b7a2: */
+                                           RTUNI_ALPHA, /* U+00b7a3: */
+                                           RTUNI_ALPHA, /* U+00b7a4: */
+                                           RTUNI_ALPHA, /* U+00b7a5: */
+                                           RTUNI_ALPHA, /* U+00b7a6: */
+                                           RTUNI_ALPHA, /* U+00b7a7: */
+                                           RTUNI_ALPHA, /* U+00b7a8: */
+                                           RTUNI_ALPHA, /* U+00b7a9: */
+                                           RTUNI_ALPHA, /* U+00b7aa: */
+                                           RTUNI_ALPHA, /* U+00b7ab: */
+                                           RTUNI_ALPHA, /* U+00b7ac: */
+                                           RTUNI_ALPHA, /* U+00b7ad: */
+                                           RTUNI_ALPHA, /* U+00b7ae: */
+                                           RTUNI_ALPHA, /* U+00b7af: */
+                                           RTUNI_ALPHA, /* U+00b7b0: */
+                                           RTUNI_ALPHA, /* U+00b7b1: */
+                                           RTUNI_ALPHA, /* U+00b7b2: */
+                                           RTUNI_ALPHA, /* U+00b7b3: */
+                                           RTUNI_ALPHA, /* U+00b7b4: */
+                                           RTUNI_ALPHA, /* U+00b7b5: */
+                                           RTUNI_ALPHA, /* U+00b7b6: */
+                                           RTUNI_ALPHA, /* U+00b7b7: */
+                                           RTUNI_ALPHA, /* U+00b7b8: */
+                                           RTUNI_ALPHA, /* U+00b7b9: */
+                                           RTUNI_ALPHA, /* U+00b7ba: */
+                                           RTUNI_ALPHA, /* U+00b7bb: */
+                                           RTUNI_ALPHA, /* U+00b7bc: */
+                                           RTUNI_ALPHA, /* U+00b7bd: */
+                                           RTUNI_ALPHA, /* U+00b7be: */
+                                           RTUNI_ALPHA, /* U+00b7bf: */
+                                           RTUNI_ALPHA, /* U+00b7c0: */
+                                           RTUNI_ALPHA, /* U+00b7c1: */
+                                           RTUNI_ALPHA, /* U+00b7c2: */
+                                           RTUNI_ALPHA, /* U+00b7c3: */
+                                           RTUNI_ALPHA, /* U+00b7c4: */
+                                           RTUNI_ALPHA, /* U+00b7c5: */
+                                           RTUNI_ALPHA, /* U+00b7c6: */
+                                           RTUNI_ALPHA, /* U+00b7c7: */
+                                           RTUNI_ALPHA, /* U+00b7c8: */
+                                           RTUNI_ALPHA, /* U+00b7c9: */
+                                           RTUNI_ALPHA, /* U+00b7ca: */
+                                           RTUNI_ALPHA, /* U+00b7cb: */
+                                           RTUNI_ALPHA, /* U+00b7cc: */
+                                           RTUNI_ALPHA, /* U+00b7cd: */
+                                           RTUNI_ALPHA, /* U+00b7ce: */
+                                           RTUNI_ALPHA, /* U+00b7cf: */
+                                           RTUNI_ALPHA, /* U+00b7d0: */
+                                           RTUNI_ALPHA, /* U+00b7d1: */
+                                           RTUNI_ALPHA, /* U+00b7d2: */
+                                           RTUNI_ALPHA, /* U+00b7d3: */
+                                           RTUNI_ALPHA, /* U+00b7d4: */
+                                           RTUNI_ALPHA, /* U+00b7d5: */
+                                           RTUNI_ALPHA, /* U+00b7d6: */
+                                           RTUNI_ALPHA, /* U+00b7d7: */
+                                           RTUNI_ALPHA, /* U+00b7d8: */
+                                           RTUNI_ALPHA, /* U+00b7d9: */
+                                           RTUNI_ALPHA, /* U+00b7da: */
+                                           RTUNI_ALPHA, /* U+00b7db: */
+                                           RTUNI_ALPHA, /* U+00b7dc: */
+                                           RTUNI_ALPHA, /* U+00b7dd: */
+                                           RTUNI_ALPHA, /* U+00b7de: */
+                                           RTUNI_ALPHA, /* U+00b7df: */
+                                           RTUNI_ALPHA, /* U+00b7e0: */
+                                           RTUNI_ALPHA, /* U+00b7e1: */
+                                           RTUNI_ALPHA, /* U+00b7e2: */
+                                           RTUNI_ALPHA, /* U+00b7e3: */
+                                           RTUNI_ALPHA, /* U+00b7e4: */
+                                           RTUNI_ALPHA, /* U+00b7e5: */
+                                           RTUNI_ALPHA, /* U+00b7e6: */
+                                           RTUNI_ALPHA, /* U+00b7e7: */
+                                           RTUNI_ALPHA, /* U+00b7e8: */
+                                           RTUNI_ALPHA, /* U+00b7e9: */
+                                           RTUNI_ALPHA, /* U+00b7ea: */
+                                           RTUNI_ALPHA, /* U+00b7eb: */
+                                           RTUNI_ALPHA, /* U+00b7ec: */
+                                           RTUNI_ALPHA, /* U+00b7ed: */
+                                           RTUNI_ALPHA, /* U+00b7ee: */
+                                           RTUNI_ALPHA, /* U+00b7ef: */
+                                           RTUNI_ALPHA, /* U+00b7f0: */
+                                           RTUNI_ALPHA, /* U+00b7f1: */
+                                           RTUNI_ALPHA, /* U+00b7f2: */
+                                           RTUNI_ALPHA, /* U+00b7f3: */
+                                           RTUNI_ALPHA, /* U+00b7f4: */
+                                           RTUNI_ALPHA, /* U+00b7f5: */
+                                           RTUNI_ALPHA, /* U+00b7f6: */
+                                           RTUNI_ALPHA, /* U+00b7f7: */
+                                           RTUNI_ALPHA, /* U+00b7f8: */
+                                           RTUNI_ALPHA, /* U+00b7f9: */
+                                           RTUNI_ALPHA, /* U+00b7fa: */
+                                           RTUNI_ALPHA, /* U+00b7fb: */
+                                           RTUNI_ALPHA, /* U+00b7fc: */
+                                           RTUNI_ALPHA, /* U+00b7fd: */
+                                           RTUNI_ALPHA, /* U+00b7fe: */
+                                           RTUNI_ALPHA, /* U+00b7ff: */
+                                           RTUNI_ALPHA, /* U+00b800: */
+                                           RTUNI_ALPHA, /* U+00b801: */
+                                           RTUNI_ALPHA, /* U+00b802: */
+                                           RTUNI_ALPHA, /* U+00b803: */
+                                           RTUNI_ALPHA, /* U+00b804: */
+                                           RTUNI_ALPHA, /* U+00b805: */
+                                           RTUNI_ALPHA, /* U+00b806: */
+                                           RTUNI_ALPHA, /* U+00b807: */
+                                           RTUNI_ALPHA, /* U+00b808: */
+                                           RTUNI_ALPHA, /* U+00b809: */
+                                           RTUNI_ALPHA, /* U+00b80a: */
+                                           RTUNI_ALPHA, /* U+00b80b: */
+                                           RTUNI_ALPHA, /* U+00b80c: */
+                                           RTUNI_ALPHA, /* U+00b80d: */
+                                           RTUNI_ALPHA, /* U+00b80e: */
+                                           RTUNI_ALPHA, /* U+00b80f: */
+                                           RTUNI_ALPHA, /* U+00b810: */
+                                           RTUNI_ALPHA, /* U+00b811: */
+                                           RTUNI_ALPHA, /* U+00b812: */
+                                           RTUNI_ALPHA, /* U+00b813: */
+                                           RTUNI_ALPHA, /* U+00b814: */
+                                           RTUNI_ALPHA, /* U+00b815: */
+                                           RTUNI_ALPHA, /* U+00b816: */
+                                           RTUNI_ALPHA, /* U+00b817: */
+                                           RTUNI_ALPHA, /* U+00b818: */
+                                           RTUNI_ALPHA, /* U+00b819: */
+                                           RTUNI_ALPHA, /* U+00b81a: */
+                                           RTUNI_ALPHA, /* U+00b81b: */
+                                           RTUNI_ALPHA, /* U+00b81c: */
+                                           RTUNI_ALPHA, /* U+00b81d: */
+                                           RTUNI_ALPHA, /* U+00b81e: */
+                                           RTUNI_ALPHA, /* U+00b81f: */
+                                           RTUNI_ALPHA, /* U+00b820: */
+                                           RTUNI_ALPHA, /* U+00b821: */
+                                           RTUNI_ALPHA, /* U+00b822: */
+                                           RTUNI_ALPHA, /* U+00b823: */
+                                           RTUNI_ALPHA, /* U+00b824: */
+                                           RTUNI_ALPHA, /* U+00b825: */
+                                           RTUNI_ALPHA, /* U+00b826: */
+                                           RTUNI_ALPHA, /* U+00b827: */
+                                           RTUNI_ALPHA, /* U+00b828: */
+                                           RTUNI_ALPHA, /* U+00b829: */
+                                           RTUNI_ALPHA, /* U+00b82a: */
+                                           RTUNI_ALPHA, /* U+00b82b: */
+                                           RTUNI_ALPHA, /* U+00b82c: */
+                                           RTUNI_ALPHA, /* U+00b82d: */
+                                           RTUNI_ALPHA, /* U+00b82e: */
+                                           RTUNI_ALPHA, /* U+00b82f: */
+                                           RTUNI_ALPHA, /* U+00b830: */
+                                           RTUNI_ALPHA, /* U+00b831: */
+                                           RTUNI_ALPHA, /* U+00b832: */
+                                           RTUNI_ALPHA, /* U+00b833: */
+                                           RTUNI_ALPHA, /* U+00b834: */
+                                           RTUNI_ALPHA, /* U+00b835: */
+                                           RTUNI_ALPHA, /* U+00b836: */
+                                           RTUNI_ALPHA, /* U+00b837: */
+                                           RTUNI_ALPHA, /* U+00b838: */
+                                           RTUNI_ALPHA, /* U+00b839: */
+                                           RTUNI_ALPHA, /* U+00b83a: */
+                                           RTUNI_ALPHA, /* U+00b83b: */
+                                           RTUNI_ALPHA, /* U+00b83c: */
+                                           RTUNI_ALPHA, /* U+00b83d: */
+                                           RTUNI_ALPHA, /* U+00b83e: */
+                                           RTUNI_ALPHA, /* U+00b83f: */
+                                           RTUNI_ALPHA, /* U+00b840: */
+                                           RTUNI_ALPHA, /* U+00b841: */
+                                           RTUNI_ALPHA, /* U+00b842: */
+                                           RTUNI_ALPHA, /* U+00b843: */
+                                           RTUNI_ALPHA, /* U+00b844: */
+                                           RTUNI_ALPHA, /* U+00b845: */
+                                           RTUNI_ALPHA, /* U+00b846: */
+                                           RTUNI_ALPHA, /* U+00b847: */
+                                           RTUNI_ALPHA, /* U+00b848: */
+                                           RTUNI_ALPHA, /* U+00b849: */
+                                           RTUNI_ALPHA, /* U+00b84a: */
+                                           RTUNI_ALPHA, /* U+00b84b: */
+                                           RTUNI_ALPHA, /* U+00b84c: */
+                                           RTUNI_ALPHA, /* U+00b84d: */
+                                           RTUNI_ALPHA, /* U+00b84e: */
+                                           RTUNI_ALPHA, /* U+00b84f: */
+                                           RTUNI_ALPHA, /* U+00b850: */
+                                           RTUNI_ALPHA, /* U+00b851: */
+                                           RTUNI_ALPHA, /* U+00b852: */
+                                           RTUNI_ALPHA, /* U+00b853: */
+                                           RTUNI_ALPHA, /* U+00b854: */
+                                           RTUNI_ALPHA, /* U+00b855: */
+                                           RTUNI_ALPHA, /* U+00b856: */
+                                           RTUNI_ALPHA, /* U+00b857: */
+                                           RTUNI_ALPHA, /* U+00b858: */
+                                           RTUNI_ALPHA, /* U+00b859: */
+                                           RTUNI_ALPHA, /* U+00b85a: */
+                                           RTUNI_ALPHA, /* U+00b85b: */
+                                           RTUNI_ALPHA, /* U+00b85c: */
+                                           RTUNI_ALPHA, /* U+00b85d: */
+                                           RTUNI_ALPHA, /* U+00b85e: */
+                                           RTUNI_ALPHA, /* U+00b85f: */
+                                           RTUNI_ALPHA, /* U+00b860: */
+                                           RTUNI_ALPHA, /* U+00b861: */
+                                           RTUNI_ALPHA, /* U+00b862: */
+                                           RTUNI_ALPHA, /* U+00b863: */
+                                           RTUNI_ALPHA, /* U+00b864: */
+                                           RTUNI_ALPHA, /* U+00b865: */
+                                           RTUNI_ALPHA, /* U+00b866: */
+                                           RTUNI_ALPHA, /* U+00b867: */
+                                           RTUNI_ALPHA, /* U+00b868: */
+                                           RTUNI_ALPHA, /* U+00b869: */
+                                           RTUNI_ALPHA, /* U+00b86a: */
+                                           RTUNI_ALPHA, /* U+00b86b: */
+                                           RTUNI_ALPHA, /* U+00b86c: */
+                                           RTUNI_ALPHA, /* U+00b86d: */
+                                           RTUNI_ALPHA, /* U+00b86e: */
+                                           RTUNI_ALPHA, /* U+00b86f: */
+                                           RTUNI_ALPHA, /* U+00b870: */
+                                           RTUNI_ALPHA, /* U+00b871: */
+                                           RTUNI_ALPHA, /* U+00b872: */
+                                           RTUNI_ALPHA, /* U+00b873: */
+                                           RTUNI_ALPHA, /* U+00b874: */
+                                           RTUNI_ALPHA, /* U+00b875: */
+                                           RTUNI_ALPHA, /* U+00b876: */
+                                           RTUNI_ALPHA, /* U+00b877: */
+                                           RTUNI_ALPHA, /* U+00b878: */
+                                           RTUNI_ALPHA, /* U+00b879: */
+                                           RTUNI_ALPHA, /* U+00b87a: */
+                                           RTUNI_ALPHA, /* U+00b87b: */
+                                           RTUNI_ALPHA, /* U+00b87c: */
+                                           RTUNI_ALPHA, /* U+00b87d: */
+                                           RTUNI_ALPHA, /* U+00b87e: */
+                                           RTUNI_ALPHA, /* U+00b87f: */
+                                           RTUNI_ALPHA, /* U+00b880: */
+                                           RTUNI_ALPHA, /* U+00b881: */
+                                           RTUNI_ALPHA, /* U+00b882: */
+                                           RTUNI_ALPHA, /* U+00b883: */
+                                           RTUNI_ALPHA, /* U+00b884: */
+                                           RTUNI_ALPHA, /* U+00b885: */
+                                           RTUNI_ALPHA, /* U+00b886: */
+                                           RTUNI_ALPHA, /* U+00b887: */
+                                           RTUNI_ALPHA, /* U+00b888: */
+                                           RTUNI_ALPHA, /* U+00b889: */
+                                           RTUNI_ALPHA, /* U+00b88a: */
+                                           RTUNI_ALPHA, /* U+00b88b: */
+                                           RTUNI_ALPHA, /* U+00b88c: */
+                                           RTUNI_ALPHA, /* U+00b88d: */
+                                           RTUNI_ALPHA, /* U+00b88e: */
+                                           RTUNI_ALPHA, /* U+00b88f: */
+                                           RTUNI_ALPHA, /* U+00b890: */
+                                           RTUNI_ALPHA, /* U+00b891: */
+                                           RTUNI_ALPHA, /* U+00b892: */
+                                           RTUNI_ALPHA, /* U+00b893: */
+                                           RTUNI_ALPHA, /* U+00b894: */
+                                           RTUNI_ALPHA, /* U+00b895: */
+                                           RTUNI_ALPHA, /* U+00b896: */
+                                           RTUNI_ALPHA, /* U+00b897: */
+                                           RTUNI_ALPHA, /* U+00b898: */
+                                           RTUNI_ALPHA, /* U+00b899: */
+                                           RTUNI_ALPHA, /* U+00b89a: */
+                                           RTUNI_ALPHA, /* U+00b89b: */
+                                           RTUNI_ALPHA, /* U+00b89c: */
+                                           RTUNI_ALPHA, /* U+00b89d: */
+                                           RTUNI_ALPHA, /* U+00b89e: */
+                                           RTUNI_ALPHA, /* U+00b89f: */
+                                           RTUNI_ALPHA, /* U+00b8a0: */
+                                           RTUNI_ALPHA, /* U+00b8a1: */
+                                           RTUNI_ALPHA, /* U+00b8a2: */
+                                           RTUNI_ALPHA, /* U+00b8a3: */
+                                           RTUNI_ALPHA, /* U+00b8a4: */
+                                           RTUNI_ALPHA, /* U+00b8a5: */
+                                           RTUNI_ALPHA, /* U+00b8a6: */
+                                           RTUNI_ALPHA, /* U+00b8a7: */
+                                           RTUNI_ALPHA, /* U+00b8a8: */
+                                           RTUNI_ALPHA, /* U+00b8a9: */
+                                           RTUNI_ALPHA, /* U+00b8aa: */
+                                           RTUNI_ALPHA, /* U+00b8ab: */
+                                           RTUNI_ALPHA, /* U+00b8ac: */
+                                           RTUNI_ALPHA, /* U+00b8ad: */
+                                           RTUNI_ALPHA, /* U+00b8ae: */
+                                           RTUNI_ALPHA, /* U+00b8af: */
+                                           RTUNI_ALPHA, /* U+00b8b0: */
+                                           RTUNI_ALPHA, /* U+00b8b1: */
+                                           RTUNI_ALPHA, /* U+00b8b2: */
+                                           RTUNI_ALPHA, /* U+00b8b3: */
+                                           RTUNI_ALPHA, /* U+00b8b4: */
+                                           RTUNI_ALPHA, /* U+00b8b5: */
+                                           RTUNI_ALPHA, /* U+00b8b6: */
+                                           RTUNI_ALPHA, /* U+00b8b7: */
+                                           RTUNI_ALPHA, /* U+00b8b8: */
+                                           RTUNI_ALPHA, /* U+00b8b9: */
+                                           RTUNI_ALPHA, /* U+00b8ba: */
+                                           RTUNI_ALPHA, /* U+00b8bb: */
+                                           RTUNI_ALPHA, /* U+00b8bc: */
+                                           RTUNI_ALPHA, /* U+00b8bd: */
+                                           RTUNI_ALPHA, /* U+00b8be: */
+                                           RTUNI_ALPHA, /* U+00b8bf: */
+                                           RTUNI_ALPHA, /* U+00b8c0: */
+                                           RTUNI_ALPHA, /* U+00b8c1: */
+                                           RTUNI_ALPHA, /* U+00b8c2: */
+                                           RTUNI_ALPHA, /* U+00b8c3: */
+                                           RTUNI_ALPHA, /* U+00b8c4: */
+                                           RTUNI_ALPHA, /* U+00b8c5: */
+                                           RTUNI_ALPHA, /* U+00b8c6: */
+                                           RTUNI_ALPHA, /* U+00b8c7: */
+                                           RTUNI_ALPHA, /* U+00b8c8: */
+                                           RTUNI_ALPHA, /* U+00b8c9: */
+                                           RTUNI_ALPHA, /* U+00b8ca: */
+                                           RTUNI_ALPHA, /* U+00b8cb: */
+                                           RTUNI_ALPHA, /* U+00b8cc: */
+                                           RTUNI_ALPHA, /* U+00b8cd: */
+                                           RTUNI_ALPHA, /* U+00b8ce: */
+                                           RTUNI_ALPHA, /* U+00b8cf: */
+                                           RTUNI_ALPHA, /* U+00b8d0: */
+                                           RTUNI_ALPHA, /* U+00b8d1: */
+                                           RTUNI_ALPHA, /* U+00b8d2: */
+                                           RTUNI_ALPHA, /* U+00b8d3: */
+                                           RTUNI_ALPHA, /* U+00b8d4: */
+                                           RTUNI_ALPHA, /* U+00b8d5: */
+                                           RTUNI_ALPHA, /* U+00b8d6: */
+                                           RTUNI_ALPHA, /* U+00b8d7: */
+                                           RTUNI_ALPHA, /* U+00b8d8: */
+                                           RTUNI_ALPHA, /* U+00b8d9: */
+                                           RTUNI_ALPHA, /* U+00b8da: */
+                                           RTUNI_ALPHA, /* U+00b8db: */
+                                           RTUNI_ALPHA, /* U+00b8dc: */
+                                           RTUNI_ALPHA, /* U+00b8dd: */
+                                           RTUNI_ALPHA, /* U+00b8de: */
+                                           RTUNI_ALPHA, /* U+00b8df: */
+                                           RTUNI_ALPHA, /* U+00b8e0: */
+                                           RTUNI_ALPHA, /* U+00b8e1: */
+                                           RTUNI_ALPHA, /* U+00b8e2: */
+                                           RTUNI_ALPHA, /* U+00b8e3: */
+                                           RTUNI_ALPHA, /* U+00b8e4: */
+                                           RTUNI_ALPHA, /* U+00b8e5: */
+                                           RTUNI_ALPHA, /* U+00b8e6: */
+                                           RTUNI_ALPHA, /* U+00b8e7: */
+                                           RTUNI_ALPHA, /* U+00b8e8: */
+                                           RTUNI_ALPHA, /* U+00b8e9: */
+                                           RTUNI_ALPHA, /* U+00b8ea: */
+                                           RTUNI_ALPHA, /* U+00b8eb: */
+                                           RTUNI_ALPHA, /* U+00b8ec: */
+                                           RTUNI_ALPHA, /* U+00b8ed: */
+                                           RTUNI_ALPHA, /* U+00b8ee: */
+                                           RTUNI_ALPHA, /* U+00b8ef: */
+                                           RTUNI_ALPHA, /* U+00b8f0: */
+                                           RTUNI_ALPHA, /* U+00b8f1: */
+                                           RTUNI_ALPHA, /* U+00b8f2: */
+                                           RTUNI_ALPHA, /* U+00b8f3: */
+                                           RTUNI_ALPHA, /* U+00b8f4: */
+                                           RTUNI_ALPHA, /* U+00b8f5: */
+                                           RTUNI_ALPHA, /* U+00b8f6: */
+                                           RTUNI_ALPHA, /* U+00b8f7: */
+                                           RTUNI_ALPHA, /* U+00b8f8: */
+                                           RTUNI_ALPHA, /* U+00b8f9: */
+                                           RTUNI_ALPHA, /* U+00b8fa: */
+                                           RTUNI_ALPHA, /* U+00b8fb: */
+                                           RTUNI_ALPHA, /* U+00b8fc: */
+                                           RTUNI_ALPHA, /* U+00b8fd: */
+                                           RTUNI_ALPHA, /* U+00b8fe: */
+                                           RTUNI_ALPHA, /* U+00b8ff: */
+                                           RTUNI_ALPHA, /* U+00b900: */
+                                           RTUNI_ALPHA, /* U+00b901: */
+                                           RTUNI_ALPHA, /* U+00b902: */
+                                           RTUNI_ALPHA, /* U+00b903: */
+                                           RTUNI_ALPHA, /* U+00b904: */
+                                           RTUNI_ALPHA, /* U+00b905: */
+                                           RTUNI_ALPHA, /* U+00b906: */
+                                           RTUNI_ALPHA, /* U+00b907: */
+                                           RTUNI_ALPHA, /* U+00b908: */
+                                           RTUNI_ALPHA, /* U+00b909: */
+                                           RTUNI_ALPHA, /* U+00b90a: */
+                                           RTUNI_ALPHA, /* U+00b90b: */
+                                           RTUNI_ALPHA, /* U+00b90c: */
+                                           RTUNI_ALPHA, /* U+00b90d: */
+                                           RTUNI_ALPHA, /* U+00b90e: */
+                                           RTUNI_ALPHA, /* U+00b90f: */
+                                           RTUNI_ALPHA, /* U+00b910: */
+                                           RTUNI_ALPHA, /* U+00b911: */
+                                           RTUNI_ALPHA, /* U+00b912: */
+                                           RTUNI_ALPHA, /* U+00b913: */
+                                           RTUNI_ALPHA, /* U+00b914: */
+                                           RTUNI_ALPHA, /* U+00b915: */
+                                           RTUNI_ALPHA, /* U+00b916: */
+                                           RTUNI_ALPHA, /* U+00b917: */
+                                           RTUNI_ALPHA, /* U+00b918: */
+                                           RTUNI_ALPHA, /* U+00b919: */
+                                           RTUNI_ALPHA, /* U+00b91a: */
+                                           RTUNI_ALPHA, /* U+00b91b: */
+                                           RTUNI_ALPHA, /* U+00b91c: */
+                                           RTUNI_ALPHA, /* U+00b91d: */
+                                           RTUNI_ALPHA, /* U+00b91e: */
+                                           RTUNI_ALPHA, /* U+00b91f: */
+                                           RTUNI_ALPHA, /* U+00b920: */
+                                           RTUNI_ALPHA, /* U+00b921: */
+                                           RTUNI_ALPHA, /* U+00b922: */
+                                           RTUNI_ALPHA, /* U+00b923: */
+                                           RTUNI_ALPHA, /* U+00b924: */
+                                           RTUNI_ALPHA, /* U+00b925: */
+                                           RTUNI_ALPHA, /* U+00b926: */
+                                           RTUNI_ALPHA, /* U+00b927: */
+                                           RTUNI_ALPHA, /* U+00b928: */
+                                           RTUNI_ALPHA, /* U+00b929: */
+                                           RTUNI_ALPHA, /* U+00b92a: */
+                                           RTUNI_ALPHA, /* U+00b92b: */
+                                           RTUNI_ALPHA, /* U+00b92c: */
+                                           RTUNI_ALPHA, /* U+00b92d: */
+                                           RTUNI_ALPHA, /* U+00b92e: */
+                                           RTUNI_ALPHA, /* U+00b92f: */
+                                           RTUNI_ALPHA, /* U+00b930: */
+                                           RTUNI_ALPHA, /* U+00b931: */
+                                           RTUNI_ALPHA, /* U+00b932: */
+                                           RTUNI_ALPHA, /* U+00b933: */
+                                           RTUNI_ALPHA, /* U+00b934: */
+                                           RTUNI_ALPHA, /* U+00b935: */
+                                           RTUNI_ALPHA, /* U+00b936: */
+                                           RTUNI_ALPHA, /* U+00b937: */
+                                           RTUNI_ALPHA, /* U+00b938: */
+                                           RTUNI_ALPHA, /* U+00b939: */
+                                           RTUNI_ALPHA, /* U+00b93a: */
+                                           RTUNI_ALPHA, /* U+00b93b: */
+                                           RTUNI_ALPHA, /* U+00b93c: */
+                                           RTUNI_ALPHA, /* U+00b93d: */
+                                           RTUNI_ALPHA, /* U+00b93e: */
+                                           RTUNI_ALPHA, /* U+00b93f: */
+                                           RTUNI_ALPHA, /* U+00b940: */
+                                           RTUNI_ALPHA, /* U+00b941: */
+                                           RTUNI_ALPHA, /* U+00b942: */
+                                           RTUNI_ALPHA, /* U+00b943: */
+                                           RTUNI_ALPHA, /* U+00b944: */
+                                           RTUNI_ALPHA, /* U+00b945: */
+                                           RTUNI_ALPHA, /* U+00b946: */
+                                           RTUNI_ALPHA, /* U+00b947: */
+                                           RTUNI_ALPHA, /* U+00b948: */
+                                           RTUNI_ALPHA, /* U+00b949: */
+                                           RTUNI_ALPHA, /* U+00b94a: */
+                                           RTUNI_ALPHA, /* U+00b94b: */
+                                           RTUNI_ALPHA, /* U+00b94c: */
+                                           RTUNI_ALPHA, /* U+00b94d: */
+                                           RTUNI_ALPHA, /* U+00b94e: */
+                                           RTUNI_ALPHA, /* U+00b94f: */
+                                           RTUNI_ALPHA, /* U+00b950: */
+                                           RTUNI_ALPHA, /* U+00b951: */
+                                           RTUNI_ALPHA, /* U+00b952: */
+                                           RTUNI_ALPHA, /* U+00b953: */
+                                           RTUNI_ALPHA, /* U+00b954: */
+                                           RTUNI_ALPHA, /* U+00b955: */
+                                           RTUNI_ALPHA, /* U+00b956: */
+                                           RTUNI_ALPHA, /* U+00b957: */
+                                           RTUNI_ALPHA, /* U+00b958: */
+                                           RTUNI_ALPHA, /* U+00b959: */
+                                           RTUNI_ALPHA, /* U+00b95a: */
+                                           RTUNI_ALPHA, /* U+00b95b: */
+                                           RTUNI_ALPHA, /* U+00b95c: */
+                                           RTUNI_ALPHA, /* U+00b95d: */
+                                           RTUNI_ALPHA, /* U+00b95e: */
+                                           RTUNI_ALPHA, /* U+00b95f: */
+                                           RTUNI_ALPHA, /* U+00b960: */
+                                           RTUNI_ALPHA, /* U+00b961: */
+                                           RTUNI_ALPHA, /* U+00b962: */
+                                           RTUNI_ALPHA, /* U+00b963: */
+                                           RTUNI_ALPHA, /* U+00b964: */
+                                           RTUNI_ALPHA, /* U+00b965: */
+                                           RTUNI_ALPHA, /* U+00b966: */
+                                           RTUNI_ALPHA, /* U+00b967: */
+                                           RTUNI_ALPHA, /* U+00b968: */
+                                           RTUNI_ALPHA, /* U+00b969: */
+                                           RTUNI_ALPHA, /* U+00b96a: */
+                                           RTUNI_ALPHA, /* U+00b96b: */
+                                           RTUNI_ALPHA, /* U+00b96c: */
+                                           RTUNI_ALPHA, /* U+00b96d: */
+                                           RTUNI_ALPHA, /* U+00b96e: */
+                                           RTUNI_ALPHA, /* U+00b96f: */
+                                           RTUNI_ALPHA, /* U+00b970: */
+                                           RTUNI_ALPHA, /* U+00b971: */
+                                           RTUNI_ALPHA, /* U+00b972: */
+                                           RTUNI_ALPHA, /* U+00b973: */
+                                           RTUNI_ALPHA, /* U+00b974: */
+                                           RTUNI_ALPHA, /* U+00b975: */
+                                           RTUNI_ALPHA, /* U+00b976: */
+                                           RTUNI_ALPHA, /* U+00b977: */
+                                           RTUNI_ALPHA, /* U+00b978: */
+                                           RTUNI_ALPHA, /* U+00b979: */
+                                           RTUNI_ALPHA, /* U+00b97a: */
+                                           RTUNI_ALPHA, /* U+00b97b: */
+                                           RTUNI_ALPHA, /* U+00b97c: */
+                                           RTUNI_ALPHA, /* U+00b97d: */
+                                           RTUNI_ALPHA, /* U+00b97e: */
+                                           RTUNI_ALPHA, /* U+00b97f: */
+                                           RTUNI_ALPHA, /* U+00b980: */
+                                           RTUNI_ALPHA, /* U+00b981: */
+                                           RTUNI_ALPHA, /* U+00b982: */
+                                           RTUNI_ALPHA, /* U+00b983: */
+                                           RTUNI_ALPHA, /* U+00b984: */
+                                           RTUNI_ALPHA, /* U+00b985: */
+                                           RTUNI_ALPHA, /* U+00b986: */
+                                           RTUNI_ALPHA, /* U+00b987: */
+                                           RTUNI_ALPHA, /* U+00b988: */
+                                           RTUNI_ALPHA, /* U+00b989: */
+                                           RTUNI_ALPHA, /* U+00b98a: */
+                                           RTUNI_ALPHA, /* U+00b98b: */
+                                           RTUNI_ALPHA, /* U+00b98c: */
+                                           RTUNI_ALPHA, /* U+00b98d: */
+                                           RTUNI_ALPHA, /* U+00b98e: */
+                                           RTUNI_ALPHA, /* U+00b98f: */
+                                           RTUNI_ALPHA, /* U+00b990: */
+                                           RTUNI_ALPHA, /* U+00b991: */
+                                           RTUNI_ALPHA, /* U+00b992: */
+                                           RTUNI_ALPHA, /* U+00b993: */
+                                           RTUNI_ALPHA, /* U+00b994: */
+                                           RTUNI_ALPHA, /* U+00b995: */
+                                           RTUNI_ALPHA, /* U+00b996: */
+                                           RTUNI_ALPHA, /* U+00b997: */
+                                           RTUNI_ALPHA, /* U+00b998: */
+                                           RTUNI_ALPHA, /* U+00b999: */
+                                           RTUNI_ALPHA, /* U+00b99a: */
+                                           RTUNI_ALPHA, /* U+00b99b: */
+                                           RTUNI_ALPHA, /* U+00b99c: */
+                                           RTUNI_ALPHA, /* U+00b99d: */
+                                           RTUNI_ALPHA, /* U+00b99e: */
+                                           RTUNI_ALPHA, /* U+00b99f: */
+                                           RTUNI_ALPHA, /* U+00b9a0: */
+                                           RTUNI_ALPHA, /* U+00b9a1: */
+                                           RTUNI_ALPHA, /* U+00b9a2: */
+                                           RTUNI_ALPHA, /* U+00b9a3: */
+                                           RTUNI_ALPHA, /* U+00b9a4: */
+                                           RTUNI_ALPHA, /* U+00b9a5: */
+                                           RTUNI_ALPHA, /* U+00b9a6: */
+                                           RTUNI_ALPHA, /* U+00b9a7: */
+                                           RTUNI_ALPHA, /* U+00b9a8: */
+                                           RTUNI_ALPHA, /* U+00b9a9: */
+                                           RTUNI_ALPHA, /* U+00b9aa: */
+                                           RTUNI_ALPHA, /* U+00b9ab: */
+                                           RTUNI_ALPHA, /* U+00b9ac: */
+                                           RTUNI_ALPHA, /* U+00b9ad: */
+                                           RTUNI_ALPHA, /* U+00b9ae: */
+                                           RTUNI_ALPHA, /* U+00b9af: */
+                                           RTUNI_ALPHA, /* U+00b9b0: */
+                                           RTUNI_ALPHA, /* U+00b9b1: */
+                                           RTUNI_ALPHA, /* U+00b9b2: */
+                                           RTUNI_ALPHA, /* U+00b9b3: */
+                                           RTUNI_ALPHA, /* U+00b9b4: */
+                                           RTUNI_ALPHA, /* U+00b9b5: */
+                                           RTUNI_ALPHA, /* U+00b9b6: */
+                                           RTUNI_ALPHA, /* U+00b9b7: */
+                                           RTUNI_ALPHA, /* U+00b9b8: */
+                                           RTUNI_ALPHA, /* U+00b9b9: */
+                                           RTUNI_ALPHA, /* U+00b9ba: */
+                                           RTUNI_ALPHA, /* U+00b9bb: */
+                                           RTUNI_ALPHA, /* U+00b9bc: */
+                                           RTUNI_ALPHA, /* U+00b9bd: */
+                                           RTUNI_ALPHA, /* U+00b9be: */
+                                           RTUNI_ALPHA, /* U+00b9bf: */
+                                           RTUNI_ALPHA, /* U+00b9c0: */
+                                           RTUNI_ALPHA, /* U+00b9c1: */
+                                           RTUNI_ALPHA, /* U+00b9c2: */
+                                           RTUNI_ALPHA, /* U+00b9c3: */
+                                           RTUNI_ALPHA, /* U+00b9c4: */
+                                           RTUNI_ALPHA, /* U+00b9c5: */
+                                           RTUNI_ALPHA, /* U+00b9c6: */
+                                           RTUNI_ALPHA, /* U+00b9c7: */
+                                           RTUNI_ALPHA, /* U+00b9c8: */
+                                           RTUNI_ALPHA, /* U+00b9c9: */
+                                           RTUNI_ALPHA, /* U+00b9ca: */
+                                           RTUNI_ALPHA, /* U+00b9cb: */
+                                           RTUNI_ALPHA, /* U+00b9cc: */
+                                           RTUNI_ALPHA, /* U+00b9cd: */
+                                           RTUNI_ALPHA, /* U+00b9ce: */
+                                           RTUNI_ALPHA, /* U+00b9cf: */
+                                           RTUNI_ALPHA, /* U+00b9d0: */
+                                           RTUNI_ALPHA, /* U+00b9d1: */
+                                           RTUNI_ALPHA, /* U+00b9d2: */
+                                           RTUNI_ALPHA, /* U+00b9d3: */
+                                           RTUNI_ALPHA, /* U+00b9d4: */
+                                           RTUNI_ALPHA, /* U+00b9d5: */
+                                           RTUNI_ALPHA, /* U+00b9d6: */
+                                           RTUNI_ALPHA, /* U+00b9d7: */
+                                           RTUNI_ALPHA, /* U+00b9d8: */
+                                           RTUNI_ALPHA, /* U+00b9d9: */
+                                           RTUNI_ALPHA, /* U+00b9da: */
+                                           RTUNI_ALPHA, /* U+00b9db: */
+                                           RTUNI_ALPHA, /* U+00b9dc: */
+                                           RTUNI_ALPHA, /* U+00b9dd: */
+                                           RTUNI_ALPHA, /* U+00b9de: */
+                                           RTUNI_ALPHA, /* U+00b9df: */
+                                           RTUNI_ALPHA, /* U+00b9e0: */
+                                           RTUNI_ALPHA, /* U+00b9e1: */
+                                           RTUNI_ALPHA, /* U+00b9e2: */
+                                           RTUNI_ALPHA, /* U+00b9e3: */
+                                           RTUNI_ALPHA, /* U+00b9e4: */
+                                           RTUNI_ALPHA, /* U+00b9e5: */
+                                           RTUNI_ALPHA, /* U+00b9e6: */
+                                           RTUNI_ALPHA, /* U+00b9e7: */
+                                           RTUNI_ALPHA, /* U+00b9e8: */
+                                           RTUNI_ALPHA, /* U+00b9e9: */
+                                           RTUNI_ALPHA, /* U+00b9ea: */
+                                           RTUNI_ALPHA, /* U+00b9eb: */
+                                           RTUNI_ALPHA, /* U+00b9ec: */
+                                           RTUNI_ALPHA, /* U+00b9ed: */
+                                           RTUNI_ALPHA, /* U+00b9ee: */
+                                           RTUNI_ALPHA, /* U+00b9ef: */
+                                           RTUNI_ALPHA, /* U+00b9f0: */
+                                           RTUNI_ALPHA, /* U+00b9f1: */
+                                           RTUNI_ALPHA, /* U+00b9f2: */
+                                           RTUNI_ALPHA, /* U+00b9f3: */
+                                           RTUNI_ALPHA, /* U+00b9f4: */
+                                           RTUNI_ALPHA, /* U+00b9f5: */
+                                           RTUNI_ALPHA, /* U+00b9f6: */
+                                           RTUNI_ALPHA, /* U+00b9f7: */
+                                           RTUNI_ALPHA, /* U+00b9f8: */
+                                           RTUNI_ALPHA, /* U+00b9f9: */
+                                           RTUNI_ALPHA, /* U+00b9fa: */
+                                           RTUNI_ALPHA, /* U+00b9fb: */
+                                           RTUNI_ALPHA, /* U+00b9fc: */
+                                           RTUNI_ALPHA, /* U+00b9fd: */
+                                           RTUNI_ALPHA, /* U+00b9fe: */
+                                           RTUNI_ALPHA, /* U+00b9ff: */
+                                           RTUNI_ALPHA, /* U+00ba00: */
+                                           RTUNI_ALPHA, /* U+00ba01: */
+                                           RTUNI_ALPHA, /* U+00ba02: */
+                                           RTUNI_ALPHA, /* U+00ba03: */
+                                           RTUNI_ALPHA, /* U+00ba04: */
+                                           RTUNI_ALPHA, /* U+00ba05: */
+                                           RTUNI_ALPHA, /* U+00ba06: */
+                                           RTUNI_ALPHA, /* U+00ba07: */
+                                           RTUNI_ALPHA, /* U+00ba08: */
+                                           RTUNI_ALPHA, /* U+00ba09: */
+                                           RTUNI_ALPHA, /* U+00ba0a: */
+                                           RTUNI_ALPHA, /* U+00ba0b: */
+                                           RTUNI_ALPHA, /* U+00ba0c: */
+                                           RTUNI_ALPHA, /* U+00ba0d: */
+                                           RTUNI_ALPHA, /* U+00ba0e: */
+                                           RTUNI_ALPHA, /* U+00ba0f: */
+                                           RTUNI_ALPHA, /* U+00ba10: */
+                                           RTUNI_ALPHA, /* U+00ba11: */
+                                           RTUNI_ALPHA, /* U+00ba12: */
+                                           RTUNI_ALPHA, /* U+00ba13: */
+                                           RTUNI_ALPHA, /* U+00ba14: */
+                                           RTUNI_ALPHA, /* U+00ba15: */
+                                           RTUNI_ALPHA, /* U+00ba16: */
+                                           RTUNI_ALPHA, /* U+00ba17: */
+                                           RTUNI_ALPHA, /* U+00ba18: */
+                                           RTUNI_ALPHA, /* U+00ba19: */
+                                           RTUNI_ALPHA, /* U+00ba1a: */
+                                           RTUNI_ALPHA, /* U+00ba1b: */
+                                           RTUNI_ALPHA, /* U+00ba1c: */
+                                           RTUNI_ALPHA, /* U+00ba1d: */
+                                           RTUNI_ALPHA, /* U+00ba1e: */
+                                           RTUNI_ALPHA, /* U+00ba1f: */
+                                           RTUNI_ALPHA, /* U+00ba20: */
+                                           RTUNI_ALPHA, /* U+00ba21: */
+                                           RTUNI_ALPHA, /* U+00ba22: */
+                                           RTUNI_ALPHA, /* U+00ba23: */
+                                           RTUNI_ALPHA, /* U+00ba24: */
+                                           RTUNI_ALPHA, /* U+00ba25: */
+                                           RTUNI_ALPHA, /* U+00ba26: */
+                                           RTUNI_ALPHA, /* U+00ba27: */
+                                           RTUNI_ALPHA, /* U+00ba28: */
+                                           RTUNI_ALPHA, /* U+00ba29: */
+                                           RTUNI_ALPHA, /* U+00ba2a: */
+                                           RTUNI_ALPHA, /* U+00ba2b: */
+                                           RTUNI_ALPHA, /* U+00ba2c: */
+                                           RTUNI_ALPHA, /* U+00ba2d: */
+                                           RTUNI_ALPHA, /* U+00ba2e: */
+                                           RTUNI_ALPHA, /* U+00ba2f: */
+                                           RTUNI_ALPHA, /* U+00ba30: */
+                                           RTUNI_ALPHA, /* U+00ba31: */
+                                           RTUNI_ALPHA, /* U+00ba32: */
+                                           RTUNI_ALPHA, /* U+00ba33: */
+                                           RTUNI_ALPHA, /* U+00ba34: */
+                                           RTUNI_ALPHA, /* U+00ba35: */
+                                           RTUNI_ALPHA, /* U+00ba36: */
+                                           RTUNI_ALPHA, /* U+00ba37: */
+                                           RTUNI_ALPHA, /* U+00ba38: */
+                                           RTUNI_ALPHA, /* U+00ba39: */
+                                           RTUNI_ALPHA, /* U+00ba3a: */
+                                           RTUNI_ALPHA, /* U+00ba3b: */
+                                           RTUNI_ALPHA, /* U+00ba3c: */
+                                           RTUNI_ALPHA, /* U+00ba3d: */
+                                           RTUNI_ALPHA, /* U+00ba3e: */
+                                           RTUNI_ALPHA, /* U+00ba3f: */
+                                           RTUNI_ALPHA, /* U+00ba40: */
+                                           RTUNI_ALPHA, /* U+00ba41: */
+                                           RTUNI_ALPHA, /* U+00ba42: */
+                                           RTUNI_ALPHA, /* U+00ba43: */
+                                           RTUNI_ALPHA, /* U+00ba44: */
+                                           RTUNI_ALPHA, /* U+00ba45: */
+                                           RTUNI_ALPHA, /* U+00ba46: */
+                                           RTUNI_ALPHA, /* U+00ba47: */
+                                           RTUNI_ALPHA, /* U+00ba48: */
+                                           RTUNI_ALPHA, /* U+00ba49: */
+                                           RTUNI_ALPHA, /* U+00ba4a: */
+                                           RTUNI_ALPHA, /* U+00ba4b: */
+                                           RTUNI_ALPHA, /* U+00ba4c: */
+                                           RTUNI_ALPHA, /* U+00ba4d: */
+                                           RTUNI_ALPHA, /* U+00ba4e: */
+                                           RTUNI_ALPHA, /* U+00ba4f: */
+                                           RTUNI_ALPHA, /* U+00ba50: */
+                                           RTUNI_ALPHA, /* U+00ba51: */
+                                           RTUNI_ALPHA, /* U+00ba52: */
+                                           RTUNI_ALPHA, /* U+00ba53: */
+                                           RTUNI_ALPHA, /* U+00ba54: */
+                                           RTUNI_ALPHA, /* U+00ba55: */
+                                           RTUNI_ALPHA, /* U+00ba56: */
+                                           RTUNI_ALPHA, /* U+00ba57: */
+                                           RTUNI_ALPHA, /* U+00ba58: */
+                                           RTUNI_ALPHA, /* U+00ba59: */
+                                           RTUNI_ALPHA, /* U+00ba5a: */
+                                           RTUNI_ALPHA, /* U+00ba5b: */
+                                           RTUNI_ALPHA, /* U+00ba5c: */
+                                           RTUNI_ALPHA, /* U+00ba5d: */
+                                           RTUNI_ALPHA, /* U+00ba5e: */
+                                           RTUNI_ALPHA, /* U+00ba5f: */
+                                           RTUNI_ALPHA, /* U+00ba60: */
+                                           RTUNI_ALPHA, /* U+00ba61: */
+                                           RTUNI_ALPHA, /* U+00ba62: */
+                                           RTUNI_ALPHA, /* U+00ba63: */
+                                           RTUNI_ALPHA, /* U+00ba64: */
+                                           RTUNI_ALPHA, /* U+00ba65: */
+                                           RTUNI_ALPHA, /* U+00ba66: */
+                                           RTUNI_ALPHA, /* U+00ba67: */
+                                           RTUNI_ALPHA, /* U+00ba68: */
+                                           RTUNI_ALPHA, /* U+00ba69: */
+                                           RTUNI_ALPHA, /* U+00ba6a: */
+                                           RTUNI_ALPHA, /* U+00ba6b: */
+                                           RTUNI_ALPHA, /* U+00ba6c: */
+                                           RTUNI_ALPHA, /* U+00ba6d: */
+                                           RTUNI_ALPHA, /* U+00ba6e: */
+                                           RTUNI_ALPHA, /* U+00ba6f: */
+                                           RTUNI_ALPHA, /* U+00ba70: */
+                                           RTUNI_ALPHA, /* U+00ba71: */
+                                           RTUNI_ALPHA, /* U+00ba72: */
+                                           RTUNI_ALPHA, /* U+00ba73: */
+                                           RTUNI_ALPHA, /* U+00ba74: */
+                                           RTUNI_ALPHA, /* U+00ba75: */
+                                           RTUNI_ALPHA, /* U+00ba76: */
+                                           RTUNI_ALPHA, /* U+00ba77: */
+                                           RTUNI_ALPHA, /* U+00ba78: */
+                                           RTUNI_ALPHA, /* U+00ba79: */
+                                           RTUNI_ALPHA, /* U+00ba7a: */
+                                           RTUNI_ALPHA, /* U+00ba7b: */
+                                           RTUNI_ALPHA, /* U+00ba7c: */
+                                           RTUNI_ALPHA, /* U+00ba7d: */
+                                           RTUNI_ALPHA, /* U+00ba7e: */
+                                           RTUNI_ALPHA, /* U+00ba7f: */
+                                           RTUNI_ALPHA, /* U+00ba80: */
+                                           RTUNI_ALPHA, /* U+00ba81: */
+                                           RTUNI_ALPHA, /* U+00ba82: */
+                                           RTUNI_ALPHA, /* U+00ba83: */
+                                           RTUNI_ALPHA, /* U+00ba84: */
+                                           RTUNI_ALPHA, /* U+00ba85: */
+                                           RTUNI_ALPHA, /* U+00ba86: */
+                                           RTUNI_ALPHA, /* U+00ba87: */
+                                           RTUNI_ALPHA, /* U+00ba88: */
+                                           RTUNI_ALPHA, /* U+00ba89: */
+                                           RTUNI_ALPHA, /* U+00ba8a: */
+                                           RTUNI_ALPHA, /* U+00ba8b: */
+                                           RTUNI_ALPHA, /* U+00ba8c: */
+                                           RTUNI_ALPHA, /* U+00ba8d: */
+                                           RTUNI_ALPHA, /* U+00ba8e: */
+                                           RTUNI_ALPHA, /* U+00ba8f: */
+                                           RTUNI_ALPHA, /* U+00ba90: */
+                                           RTUNI_ALPHA, /* U+00ba91: */
+                                           RTUNI_ALPHA, /* U+00ba92: */
+                                           RTUNI_ALPHA, /* U+00ba93: */
+                                           RTUNI_ALPHA, /* U+00ba94: */
+                                           RTUNI_ALPHA, /* U+00ba95: */
+                                           RTUNI_ALPHA, /* U+00ba96: */
+                                           RTUNI_ALPHA, /* U+00ba97: */
+                                           RTUNI_ALPHA, /* U+00ba98: */
+                                           RTUNI_ALPHA, /* U+00ba99: */
+                                           RTUNI_ALPHA, /* U+00ba9a: */
+                                           RTUNI_ALPHA, /* U+00ba9b: */
+                                           RTUNI_ALPHA, /* U+00ba9c: */
+                                           RTUNI_ALPHA, /* U+00ba9d: */
+                                           RTUNI_ALPHA, /* U+00ba9e: */
+                                           RTUNI_ALPHA, /* U+00ba9f: */
+                                           RTUNI_ALPHA, /* U+00baa0: */
+                                           RTUNI_ALPHA, /* U+00baa1: */
+                                           RTUNI_ALPHA, /* U+00baa2: */
+                                           RTUNI_ALPHA, /* U+00baa3: */
+                                           RTUNI_ALPHA, /* U+00baa4: */
+                                           RTUNI_ALPHA, /* U+00baa5: */
+                                           RTUNI_ALPHA, /* U+00baa6: */
+                                           RTUNI_ALPHA, /* U+00baa7: */
+                                           RTUNI_ALPHA, /* U+00baa8: */
+                                           RTUNI_ALPHA, /* U+00baa9: */
+                                           RTUNI_ALPHA, /* U+00baaa: */
+                                           RTUNI_ALPHA, /* U+00baab: */
+                                           RTUNI_ALPHA, /* U+00baac: */
+                                           RTUNI_ALPHA, /* U+00baad: */
+                                           RTUNI_ALPHA, /* U+00baae: */
+                                           RTUNI_ALPHA, /* U+00baaf: */
+                                           RTUNI_ALPHA, /* U+00bab0: */
+                                           RTUNI_ALPHA, /* U+00bab1: */
+                                           RTUNI_ALPHA, /* U+00bab2: */
+                                           RTUNI_ALPHA, /* U+00bab3: */
+                                           RTUNI_ALPHA, /* U+00bab4: */
+                                           RTUNI_ALPHA, /* U+00bab5: */
+                                           RTUNI_ALPHA, /* U+00bab6: */
+                                           RTUNI_ALPHA, /* U+00bab7: */
+                                           RTUNI_ALPHA, /* U+00bab8: */
+                                           RTUNI_ALPHA, /* U+00bab9: */
+                                           RTUNI_ALPHA, /* U+00baba: */
+                                           RTUNI_ALPHA, /* U+00babb: */
+                                           RTUNI_ALPHA, /* U+00babc: */
+                                           RTUNI_ALPHA, /* U+00babd: */
+                                           RTUNI_ALPHA, /* U+00babe: */
+                                           RTUNI_ALPHA, /* U+00babf: */
+                                           RTUNI_ALPHA, /* U+00bac0: */
+                                           RTUNI_ALPHA, /* U+00bac1: */
+                                           RTUNI_ALPHA, /* U+00bac2: */
+                                           RTUNI_ALPHA, /* U+00bac3: */
+                                           RTUNI_ALPHA, /* U+00bac4: */
+                                           RTUNI_ALPHA, /* U+00bac5: */
+                                           RTUNI_ALPHA, /* U+00bac6: */
+                                           RTUNI_ALPHA, /* U+00bac7: */
+                                           RTUNI_ALPHA, /* U+00bac8: */
+                                           RTUNI_ALPHA, /* U+00bac9: */
+                                           RTUNI_ALPHA, /* U+00baca: */
+                                           RTUNI_ALPHA, /* U+00bacb: */
+                                           RTUNI_ALPHA, /* U+00bacc: */
+                                           RTUNI_ALPHA, /* U+00bacd: */
+                                           RTUNI_ALPHA, /* U+00bace: */
+                                           RTUNI_ALPHA, /* U+00bacf: */
+                                           RTUNI_ALPHA, /* U+00bad0: */
+                                           RTUNI_ALPHA, /* U+00bad1: */
+                                           RTUNI_ALPHA, /* U+00bad2: */
+                                           RTUNI_ALPHA, /* U+00bad3: */
+                                           RTUNI_ALPHA, /* U+00bad4: */
+                                           RTUNI_ALPHA, /* U+00bad5: */
+                                           RTUNI_ALPHA, /* U+00bad6: */
+                                           RTUNI_ALPHA, /* U+00bad7: */
+                                           RTUNI_ALPHA, /* U+00bad8: */
+                                           RTUNI_ALPHA, /* U+00bad9: */
+                                           RTUNI_ALPHA, /* U+00bada: */
+                                           RTUNI_ALPHA, /* U+00badb: */
+                                           RTUNI_ALPHA, /* U+00badc: */
+                                           RTUNI_ALPHA, /* U+00badd: */
+                                           RTUNI_ALPHA, /* U+00bade: */
+                                           RTUNI_ALPHA, /* U+00badf: */
+                                           RTUNI_ALPHA, /* U+00bae0: */
+                                           RTUNI_ALPHA, /* U+00bae1: */
+                                           RTUNI_ALPHA, /* U+00bae2: */
+                                           RTUNI_ALPHA, /* U+00bae3: */
+                                           RTUNI_ALPHA, /* U+00bae4: */
+                                           RTUNI_ALPHA, /* U+00bae5: */
+                                           RTUNI_ALPHA, /* U+00bae6: */
+                                           RTUNI_ALPHA, /* U+00bae7: */
+                                           RTUNI_ALPHA, /* U+00bae8: */
+                                           RTUNI_ALPHA, /* U+00bae9: */
+                                           RTUNI_ALPHA, /* U+00baea: */
+                                           RTUNI_ALPHA, /* U+00baeb: */
+                                           RTUNI_ALPHA, /* U+00baec: */
+                                           RTUNI_ALPHA, /* U+00baed: */
+                                           RTUNI_ALPHA, /* U+00baee: */
+                                           RTUNI_ALPHA, /* U+00baef: */
+                                           RTUNI_ALPHA, /* U+00baf0: */
+                                           RTUNI_ALPHA, /* U+00baf1: */
+                                           RTUNI_ALPHA, /* U+00baf2: */
+                                           RTUNI_ALPHA, /* U+00baf3: */
+                                           RTUNI_ALPHA, /* U+00baf4: */
+                                           RTUNI_ALPHA, /* U+00baf5: */
+                                           RTUNI_ALPHA, /* U+00baf6: */
+                                           RTUNI_ALPHA, /* U+00baf7: */
+                                           RTUNI_ALPHA, /* U+00baf8: */
+                                           RTUNI_ALPHA, /* U+00baf9: */
+                                           RTUNI_ALPHA, /* U+00bafa: */
+                                           RTUNI_ALPHA, /* U+00bafb: */
+                                           RTUNI_ALPHA, /* U+00bafc: */
+                                           RTUNI_ALPHA, /* U+00bafd: */
+                                           RTUNI_ALPHA, /* U+00bafe: */
+                                           RTUNI_ALPHA, /* U+00baff: */
+                                           RTUNI_ALPHA, /* U+00bb00: */
+                                           RTUNI_ALPHA, /* U+00bb01: */
+                                           RTUNI_ALPHA, /* U+00bb02: */
+                                           RTUNI_ALPHA, /* U+00bb03: */
+                                           RTUNI_ALPHA, /* U+00bb04: */
+                                           RTUNI_ALPHA, /* U+00bb05: */
+                                           RTUNI_ALPHA, /* U+00bb06: */
+                                           RTUNI_ALPHA, /* U+00bb07: */
+                                           RTUNI_ALPHA, /* U+00bb08: */
+                                           RTUNI_ALPHA, /* U+00bb09: */
+                                           RTUNI_ALPHA, /* U+00bb0a: */
+                                           RTUNI_ALPHA, /* U+00bb0b: */
+                                           RTUNI_ALPHA, /* U+00bb0c: */
+                                           RTUNI_ALPHA, /* U+00bb0d: */
+                                           RTUNI_ALPHA, /* U+00bb0e: */
+                                           RTUNI_ALPHA, /* U+00bb0f: */
+                                           RTUNI_ALPHA, /* U+00bb10: */
+                                           RTUNI_ALPHA, /* U+00bb11: */
+                                           RTUNI_ALPHA, /* U+00bb12: */
+                                           RTUNI_ALPHA, /* U+00bb13: */
+                                           RTUNI_ALPHA, /* U+00bb14: */
+                                           RTUNI_ALPHA, /* U+00bb15: */
+                                           RTUNI_ALPHA, /* U+00bb16: */
+                                           RTUNI_ALPHA, /* U+00bb17: */
+                                           RTUNI_ALPHA, /* U+00bb18: */
+                                           RTUNI_ALPHA, /* U+00bb19: */
+                                           RTUNI_ALPHA, /* U+00bb1a: */
+                                           RTUNI_ALPHA, /* U+00bb1b: */
+                                           RTUNI_ALPHA, /* U+00bb1c: */
+                                           RTUNI_ALPHA, /* U+00bb1d: */
+                                           RTUNI_ALPHA, /* U+00bb1e: */
+                                           RTUNI_ALPHA, /* U+00bb1f: */
+                                           RTUNI_ALPHA, /* U+00bb20: */
+                                           RTUNI_ALPHA, /* U+00bb21: */
+                                           RTUNI_ALPHA, /* U+00bb22: */
+                                           RTUNI_ALPHA, /* U+00bb23: */
+                                           RTUNI_ALPHA, /* U+00bb24: */
+                                           RTUNI_ALPHA, /* U+00bb25: */
+                                           RTUNI_ALPHA, /* U+00bb26: */
+                                           RTUNI_ALPHA, /* U+00bb27: */
+                                           RTUNI_ALPHA, /* U+00bb28: */
+                                           RTUNI_ALPHA, /* U+00bb29: */
+                                           RTUNI_ALPHA, /* U+00bb2a: */
+                                           RTUNI_ALPHA, /* U+00bb2b: */
+                                           RTUNI_ALPHA, /* U+00bb2c: */
+                                           RTUNI_ALPHA, /* U+00bb2d: */
+                                           RTUNI_ALPHA, /* U+00bb2e: */
+                                           RTUNI_ALPHA, /* U+00bb2f: */
+                                           RTUNI_ALPHA, /* U+00bb30: */
+                                           RTUNI_ALPHA, /* U+00bb31: */
+                                           RTUNI_ALPHA, /* U+00bb32: */
+                                           RTUNI_ALPHA, /* U+00bb33: */
+                                           RTUNI_ALPHA, /* U+00bb34: */
+                                           RTUNI_ALPHA, /* U+00bb35: */
+                                           RTUNI_ALPHA, /* U+00bb36: */
+                                           RTUNI_ALPHA, /* U+00bb37: */
+                                           RTUNI_ALPHA, /* U+00bb38: */
+                                           RTUNI_ALPHA, /* U+00bb39: */
+                                           RTUNI_ALPHA, /* U+00bb3a: */
+                                           RTUNI_ALPHA, /* U+00bb3b: */
+                                           RTUNI_ALPHA, /* U+00bb3c: */
+                                           RTUNI_ALPHA, /* U+00bb3d: */
+                                           RTUNI_ALPHA, /* U+00bb3e: */
+                                           RTUNI_ALPHA, /* U+00bb3f: */
+                                           RTUNI_ALPHA, /* U+00bb40: */
+                                           RTUNI_ALPHA, /* U+00bb41: */
+                                           RTUNI_ALPHA, /* U+00bb42: */
+                                           RTUNI_ALPHA, /* U+00bb43: */
+                                           RTUNI_ALPHA, /* U+00bb44: */
+                                           RTUNI_ALPHA, /* U+00bb45: */
+                                           RTUNI_ALPHA, /* U+00bb46: */
+                                           RTUNI_ALPHA, /* U+00bb47: */
+                                           RTUNI_ALPHA, /* U+00bb48: */
+                                           RTUNI_ALPHA, /* U+00bb49: */
+                                           RTUNI_ALPHA, /* U+00bb4a: */
+                                           RTUNI_ALPHA, /* U+00bb4b: */
+                                           RTUNI_ALPHA, /* U+00bb4c: */
+                                           RTUNI_ALPHA, /* U+00bb4d: */
+                                           RTUNI_ALPHA, /* U+00bb4e: */
+                                           RTUNI_ALPHA, /* U+00bb4f: */
+                                           RTUNI_ALPHA, /* U+00bb50: */
+                                           RTUNI_ALPHA, /* U+00bb51: */
+                                           RTUNI_ALPHA, /* U+00bb52: */
+                                           RTUNI_ALPHA, /* U+00bb53: */
+                                           RTUNI_ALPHA, /* U+00bb54: */
+                                           RTUNI_ALPHA, /* U+00bb55: */
+                                           RTUNI_ALPHA, /* U+00bb56: */
+                                           RTUNI_ALPHA, /* U+00bb57: */
+                                           RTUNI_ALPHA, /* U+00bb58: */
+                                           RTUNI_ALPHA, /* U+00bb59: */
+                                           RTUNI_ALPHA, /* U+00bb5a: */
+                                           RTUNI_ALPHA, /* U+00bb5b: */
+                                           RTUNI_ALPHA, /* U+00bb5c: */
+                                           RTUNI_ALPHA, /* U+00bb5d: */
+                                           RTUNI_ALPHA, /* U+00bb5e: */
+                                           RTUNI_ALPHA, /* U+00bb5f: */
+                                           RTUNI_ALPHA, /* U+00bb60: */
+                                           RTUNI_ALPHA, /* U+00bb61: */
+                                           RTUNI_ALPHA, /* U+00bb62: */
+                                           RTUNI_ALPHA, /* U+00bb63: */
+                                           RTUNI_ALPHA, /* U+00bb64: */
+                                           RTUNI_ALPHA, /* U+00bb65: */
+                                           RTUNI_ALPHA, /* U+00bb66: */
+                                           RTUNI_ALPHA, /* U+00bb67: */
+                                           RTUNI_ALPHA, /* U+00bb68: */
+                                           RTUNI_ALPHA, /* U+00bb69: */
+                                           RTUNI_ALPHA, /* U+00bb6a: */
+                                           RTUNI_ALPHA, /* U+00bb6b: */
+                                           RTUNI_ALPHA, /* U+00bb6c: */
+                                           RTUNI_ALPHA, /* U+00bb6d: */
+                                           RTUNI_ALPHA, /* U+00bb6e: */
+                                           RTUNI_ALPHA, /* U+00bb6f: */
+                                           RTUNI_ALPHA, /* U+00bb70: */
+                                           RTUNI_ALPHA, /* U+00bb71: */
+                                           RTUNI_ALPHA, /* U+00bb72: */
+                                           RTUNI_ALPHA, /* U+00bb73: */
+                                           RTUNI_ALPHA, /* U+00bb74: */
+                                           RTUNI_ALPHA, /* U+00bb75: */
+                                           RTUNI_ALPHA, /* U+00bb76: */
+                                           RTUNI_ALPHA, /* U+00bb77: */
+                                           RTUNI_ALPHA, /* U+00bb78: */
+                                           RTUNI_ALPHA, /* U+00bb79: */
+                                           RTUNI_ALPHA, /* U+00bb7a: */
+                                           RTUNI_ALPHA, /* U+00bb7b: */
+                                           RTUNI_ALPHA, /* U+00bb7c: */
+                                           RTUNI_ALPHA, /* U+00bb7d: */
+                                           RTUNI_ALPHA, /* U+00bb7e: */
+                                           RTUNI_ALPHA, /* U+00bb7f: */
+                                           RTUNI_ALPHA, /* U+00bb80: */
+                                           RTUNI_ALPHA, /* U+00bb81: */
+                                           RTUNI_ALPHA, /* U+00bb82: */
+                                           RTUNI_ALPHA, /* U+00bb83: */
+                                           RTUNI_ALPHA, /* U+00bb84: */
+                                           RTUNI_ALPHA, /* U+00bb85: */
+                                           RTUNI_ALPHA, /* U+00bb86: */
+                                           RTUNI_ALPHA, /* U+00bb87: */
+                                           RTUNI_ALPHA, /* U+00bb88: */
+                                           RTUNI_ALPHA, /* U+00bb89: */
+                                           RTUNI_ALPHA, /* U+00bb8a: */
+                                           RTUNI_ALPHA, /* U+00bb8b: */
+                                           RTUNI_ALPHA, /* U+00bb8c: */
+                                           RTUNI_ALPHA, /* U+00bb8d: */
+                                           RTUNI_ALPHA, /* U+00bb8e: */
+                                           RTUNI_ALPHA, /* U+00bb8f: */
+                                           RTUNI_ALPHA, /* U+00bb90: */
+                                           RTUNI_ALPHA, /* U+00bb91: */
+                                           RTUNI_ALPHA, /* U+00bb92: */
+                                           RTUNI_ALPHA, /* U+00bb93: */
+                                           RTUNI_ALPHA, /* U+00bb94: */
+                                           RTUNI_ALPHA, /* U+00bb95: */
+                                           RTUNI_ALPHA, /* U+00bb96: */
+                                           RTUNI_ALPHA, /* U+00bb97: */
+                                           RTUNI_ALPHA, /* U+00bb98: */
+                                           RTUNI_ALPHA, /* U+00bb99: */
+                                           RTUNI_ALPHA, /* U+00bb9a: */
+                                           RTUNI_ALPHA, /* U+00bb9b: */
+                                           RTUNI_ALPHA, /* U+00bb9c: */
+                                           RTUNI_ALPHA, /* U+00bb9d: */
+                                           RTUNI_ALPHA, /* U+00bb9e: */
+                                           RTUNI_ALPHA, /* U+00bb9f: */
+                                           RTUNI_ALPHA, /* U+00bba0: */
+                                           RTUNI_ALPHA, /* U+00bba1: */
+                                           RTUNI_ALPHA, /* U+00bba2: */
+                                           RTUNI_ALPHA, /* U+00bba3: */
+                                           RTUNI_ALPHA, /* U+00bba4: */
+                                           RTUNI_ALPHA, /* U+00bba5: */
+                                           RTUNI_ALPHA, /* U+00bba6: */
+                                           RTUNI_ALPHA, /* U+00bba7: */
+                                           RTUNI_ALPHA, /* U+00bba8: */
+                                           RTUNI_ALPHA, /* U+00bba9: */
+                                           RTUNI_ALPHA, /* U+00bbaa: */
+                                           RTUNI_ALPHA, /* U+00bbab: */
+                                           RTUNI_ALPHA, /* U+00bbac: */
+                                           RTUNI_ALPHA, /* U+00bbad: */
+                                           RTUNI_ALPHA, /* U+00bbae: */
+                                           RTUNI_ALPHA, /* U+00bbaf: */
+                                           RTUNI_ALPHA, /* U+00bbb0: */
+                                           RTUNI_ALPHA, /* U+00bbb1: */
+                                           RTUNI_ALPHA, /* U+00bbb2: */
+                                           RTUNI_ALPHA, /* U+00bbb3: */
+                                           RTUNI_ALPHA, /* U+00bbb4: */
+                                           RTUNI_ALPHA, /* U+00bbb5: */
+                                           RTUNI_ALPHA, /* U+00bbb6: */
+                                           RTUNI_ALPHA, /* U+00bbb7: */
+                                           RTUNI_ALPHA, /* U+00bbb8: */
+                                           RTUNI_ALPHA, /* U+00bbb9: */
+                                           RTUNI_ALPHA, /* U+00bbba: */
+                                           RTUNI_ALPHA, /* U+00bbbb: */
+                                           RTUNI_ALPHA, /* U+00bbbc: */
+                                           RTUNI_ALPHA, /* U+00bbbd: */
+                                           RTUNI_ALPHA, /* U+00bbbe: */
+                                           RTUNI_ALPHA, /* U+00bbbf: */
+                                           RTUNI_ALPHA, /* U+00bbc0: */
+                                           RTUNI_ALPHA, /* U+00bbc1: */
+                                           RTUNI_ALPHA, /* U+00bbc2: */
+                                           RTUNI_ALPHA, /* U+00bbc3: */
+                                           RTUNI_ALPHA, /* U+00bbc4: */
+                                           RTUNI_ALPHA, /* U+00bbc5: */
+                                           RTUNI_ALPHA, /* U+00bbc6: */
+                                           RTUNI_ALPHA, /* U+00bbc7: */
+                                           RTUNI_ALPHA, /* U+00bbc8: */
+                                           RTUNI_ALPHA, /* U+00bbc9: */
+                                           RTUNI_ALPHA, /* U+00bbca: */
+                                           RTUNI_ALPHA, /* U+00bbcb: */
+                                           RTUNI_ALPHA, /* U+00bbcc: */
+                                           RTUNI_ALPHA, /* U+00bbcd: */
+                                           RTUNI_ALPHA, /* U+00bbce: */
+                                           RTUNI_ALPHA, /* U+00bbcf: */
+                                           RTUNI_ALPHA, /* U+00bbd0: */
+                                           RTUNI_ALPHA, /* U+00bbd1: */
+                                           RTUNI_ALPHA, /* U+00bbd2: */
+                                           RTUNI_ALPHA, /* U+00bbd3: */
+                                           RTUNI_ALPHA, /* U+00bbd4: */
+                                           RTUNI_ALPHA, /* U+00bbd5: */
+                                           RTUNI_ALPHA, /* U+00bbd6: */
+                                           RTUNI_ALPHA, /* U+00bbd7: */
+                                           RTUNI_ALPHA, /* U+00bbd8: */
+                                           RTUNI_ALPHA, /* U+00bbd9: */
+                                           RTUNI_ALPHA, /* U+00bbda: */
+                                           RTUNI_ALPHA, /* U+00bbdb: */
+                                           RTUNI_ALPHA, /* U+00bbdc: */
+                                           RTUNI_ALPHA, /* U+00bbdd: */
+                                           RTUNI_ALPHA, /* U+00bbde: */
+                                           RTUNI_ALPHA, /* U+00bbdf: */
+                                           RTUNI_ALPHA, /* U+00bbe0: */
+                                           RTUNI_ALPHA, /* U+00bbe1: */
+                                           RTUNI_ALPHA, /* U+00bbe2: */
+                                           RTUNI_ALPHA, /* U+00bbe3: */
+                                           RTUNI_ALPHA, /* U+00bbe4: */
+                                           RTUNI_ALPHA, /* U+00bbe5: */
+                                           RTUNI_ALPHA, /* U+00bbe6: */
+                                           RTUNI_ALPHA, /* U+00bbe7: */
+                                           RTUNI_ALPHA, /* U+00bbe8: */
+                                           RTUNI_ALPHA, /* U+00bbe9: */
+                                           RTUNI_ALPHA, /* U+00bbea: */
+                                           RTUNI_ALPHA, /* U+00bbeb: */
+                                           RTUNI_ALPHA, /* U+00bbec: */
+                                           RTUNI_ALPHA, /* U+00bbed: */
+                                           RTUNI_ALPHA, /* U+00bbee: */
+                                           RTUNI_ALPHA, /* U+00bbef: */
+                                           RTUNI_ALPHA, /* U+00bbf0: */
+                                           RTUNI_ALPHA, /* U+00bbf1: */
+                                           RTUNI_ALPHA, /* U+00bbf2: */
+                                           RTUNI_ALPHA, /* U+00bbf3: */
+                                           RTUNI_ALPHA, /* U+00bbf4: */
+                                           RTUNI_ALPHA, /* U+00bbf5: */
+                                           RTUNI_ALPHA, /* U+00bbf6: */
+                                           RTUNI_ALPHA, /* U+00bbf7: */
+                                           RTUNI_ALPHA, /* U+00bbf8: */
+                                           RTUNI_ALPHA, /* U+00bbf9: */
+                                           RTUNI_ALPHA, /* U+00bbfa: */
+                                           RTUNI_ALPHA, /* U+00bbfb: */
+                                           RTUNI_ALPHA, /* U+00bbfc: */
+                                           RTUNI_ALPHA, /* U+00bbfd: */
+                                           RTUNI_ALPHA, /* U+00bbfe: */
+                                           RTUNI_ALPHA, /* U+00bbff: */
+                                           RTUNI_ALPHA, /* U+00bc00: */
+                                           RTUNI_ALPHA, /* U+00bc01: */
+                                           RTUNI_ALPHA, /* U+00bc02: */
+                                           RTUNI_ALPHA, /* U+00bc03: */
+                                           RTUNI_ALPHA, /* U+00bc04: */
+                                           RTUNI_ALPHA, /* U+00bc05: */
+                                           RTUNI_ALPHA, /* U+00bc06: */
+                                           RTUNI_ALPHA, /* U+00bc07: */
+                                           RTUNI_ALPHA, /* U+00bc08: */
+                                           RTUNI_ALPHA, /* U+00bc09: */
+                                           RTUNI_ALPHA, /* U+00bc0a: */
+                                           RTUNI_ALPHA, /* U+00bc0b: */
+                                           RTUNI_ALPHA, /* U+00bc0c: */
+                                           RTUNI_ALPHA, /* U+00bc0d: */
+                                           RTUNI_ALPHA, /* U+00bc0e: */
+                                           RTUNI_ALPHA, /* U+00bc0f: */
+                                           RTUNI_ALPHA, /* U+00bc10: */
+                                           RTUNI_ALPHA, /* U+00bc11: */
+                                           RTUNI_ALPHA, /* U+00bc12: */
+                                           RTUNI_ALPHA, /* U+00bc13: */
+                                           RTUNI_ALPHA, /* U+00bc14: */
+                                           RTUNI_ALPHA, /* U+00bc15: */
+                                           RTUNI_ALPHA, /* U+00bc16: */
+                                           RTUNI_ALPHA, /* U+00bc17: */
+                                           RTUNI_ALPHA, /* U+00bc18: */
+                                           RTUNI_ALPHA, /* U+00bc19: */
+                                           RTUNI_ALPHA, /* U+00bc1a: */
+                                           RTUNI_ALPHA, /* U+00bc1b: */
+                                           RTUNI_ALPHA, /* U+00bc1c: */
+                                           RTUNI_ALPHA, /* U+00bc1d: */
+                                           RTUNI_ALPHA, /* U+00bc1e: */
+                                           RTUNI_ALPHA, /* U+00bc1f: */
+                                           RTUNI_ALPHA, /* U+00bc20: */
+                                           RTUNI_ALPHA, /* U+00bc21: */
+                                           RTUNI_ALPHA, /* U+00bc22: */
+                                           RTUNI_ALPHA, /* U+00bc23: */
+                                           RTUNI_ALPHA, /* U+00bc24: */
+                                           RTUNI_ALPHA, /* U+00bc25: */
+                                           RTUNI_ALPHA, /* U+00bc26: */
+                                           RTUNI_ALPHA, /* U+00bc27: */
+                                           RTUNI_ALPHA, /* U+00bc28: */
+                                           RTUNI_ALPHA, /* U+00bc29: */
+                                           RTUNI_ALPHA, /* U+00bc2a: */
+                                           RTUNI_ALPHA, /* U+00bc2b: */
+                                           RTUNI_ALPHA, /* U+00bc2c: */
+                                           RTUNI_ALPHA, /* U+00bc2d: */
+                                           RTUNI_ALPHA, /* U+00bc2e: */
+                                           RTUNI_ALPHA, /* U+00bc2f: */
+                                           RTUNI_ALPHA, /* U+00bc30: */
+                                           RTUNI_ALPHA, /* U+00bc31: */
+                                           RTUNI_ALPHA, /* U+00bc32: */
+                                           RTUNI_ALPHA, /* U+00bc33: */
+                                           RTUNI_ALPHA, /* U+00bc34: */
+                                           RTUNI_ALPHA, /* U+00bc35: */
+                                           RTUNI_ALPHA, /* U+00bc36: */
+                                           RTUNI_ALPHA, /* U+00bc37: */
+                                           RTUNI_ALPHA, /* U+00bc38: */
+                                           RTUNI_ALPHA, /* U+00bc39: */
+                                           RTUNI_ALPHA, /* U+00bc3a: */
+                                           RTUNI_ALPHA, /* U+00bc3b: */
+                                           RTUNI_ALPHA, /* U+00bc3c: */
+                                           RTUNI_ALPHA, /* U+00bc3d: */
+                                           RTUNI_ALPHA, /* U+00bc3e: */
+                                           RTUNI_ALPHA, /* U+00bc3f: */
+                                           RTUNI_ALPHA, /* U+00bc40: */
+                                           RTUNI_ALPHA, /* U+00bc41: */
+                                           RTUNI_ALPHA, /* U+00bc42: */
+                                           RTUNI_ALPHA, /* U+00bc43: */
+                                           RTUNI_ALPHA, /* U+00bc44: */
+                                           RTUNI_ALPHA, /* U+00bc45: */
+                                           RTUNI_ALPHA, /* U+00bc46: */
+                                           RTUNI_ALPHA, /* U+00bc47: */
+                                           RTUNI_ALPHA, /* U+00bc48: */
+                                           RTUNI_ALPHA, /* U+00bc49: */
+                                           RTUNI_ALPHA, /* U+00bc4a: */
+                                           RTUNI_ALPHA, /* U+00bc4b: */
+                                           RTUNI_ALPHA, /* U+00bc4c: */
+                                           RTUNI_ALPHA, /* U+00bc4d: */
+                                           RTUNI_ALPHA, /* U+00bc4e: */
+                                           RTUNI_ALPHA, /* U+00bc4f: */
+                                           RTUNI_ALPHA, /* U+00bc50: */
+                                           RTUNI_ALPHA, /* U+00bc51: */
+                                           RTUNI_ALPHA, /* U+00bc52: */
+                                           RTUNI_ALPHA, /* U+00bc53: */
+                                           RTUNI_ALPHA, /* U+00bc54: */
+                                           RTUNI_ALPHA, /* U+00bc55: */
+                                           RTUNI_ALPHA, /* U+00bc56: */
+                                           RTUNI_ALPHA, /* U+00bc57: */
+                                           RTUNI_ALPHA, /* U+00bc58: */
+                                           RTUNI_ALPHA, /* U+00bc59: */
+                                           RTUNI_ALPHA, /* U+00bc5a: */
+                                           RTUNI_ALPHA, /* U+00bc5b: */
+                                           RTUNI_ALPHA, /* U+00bc5c: */
+                                           RTUNI_ALPHA, /* U+00bc5d: */
+                                           RTUNI_ALPHA, /* U+00bc5e: */
+                                           RTUNI_ALPHA, /* U+00bc5f: */
+                                           RTUNI_ALPHA, /* U+00bc60: */
+                                           RTUNI_ALPHA, /* U+00bc61: */
+                                           RTUNI_ALPHA, /* U+00bc62: */
+                                           RTUNI_ALPHA, /* U+00bc63: */
+                                           RTUNI_ALPHA, /* U+00bc64: */
+                                           RTUNI_ALPHA, /* U+00bc65: */
+                                           RTUNI_ALPHA, /* U+00bc66: */
+                                           RTUNI_ALPHA, /* U+00bc67: */
+                                           RTUNI_ALPHA, /* U+00bc68: */
+                                           RTUNI_ALPHA, /* U+00bc69: */
+                                           RTUNI_ALPHA, /* U+00bc6a: */
+                                           RTUNI_ALPHA, /* U+00bc6b: */
+                                           RTUNI_ALPHA, /* U+00bc6c: */
+                                           RTUNI_ALPHA, /* U+00bc6d: */
+                                           RTUNI_ALPHA, /* U+00bc6e: */
+                                           RTUNI_ALPHA, /* U+00bc6f: */
+                                           RTUNI_ALPHA, /* U+00bc70: */
+                                           RTUNI_ALPHA, /* U+00bc71: */
+                                           RTUNI_ALPHA, /* U+00bc72: */
+                                           RTUNI_ALPHA, /* U+00bc73: */
+                                           RTUNI_ALPHA, /* U+00bc74: */
+                                           RTUNI_ALPHA, /* U+00bc75: */
+                                           RTUNI_ALPHA, /* U+00bc76: */
+                                           RTUNI_ALPHA, /* U+00bc77: */
+                                           RTUNI_ALPHA, /* U+00bc78: */
+                                           RTUNI_ALPHA, /* U+00bc79: */
+                                           RTUNI_ALPHA, /* U+00bc7a: */
+                                           RTUNI_ALPHA, /* U+00bc7b: */
+                                           RTUNI_ALPHA, /* U+00bc7c: */
+                                           RTUNI_ALPHA, /* U+00bc7d: */
+                                           RTUNI_ALPHA, /* U+00bc7e: */
+                                           RTUNI_ALPHA, /* U+00bc7f: */
+                                           RTUNI_ALPHA, /* U+00bc80: */
+                                           RTUNI_ALPHA, /* U+00bc81: */
+                                           RTUNI_ALPHA, /* U+00bc82: */
+                                           RTUNI_ALPHA, /* U+00bc83: */
+                                           RTUNI_ALPHA, /* U+00bc84: */
+                                           RTUNI_ALPHA, /* U+00bc85: */
+                                           RTUNI_ALPHA, /* U+00bc86: */
+                                           RTUNI_ALPHA, /* U+00bc87: */
+                                           RTUNI_ALPHA, /* U+00bc88: */
+                                           RTUNI_ALPHA, /* U+00bc89: */
+                                           RTUNI_ALPHA, /* U+00bc8a: */
+                                           RTUNI_ALPHA, /* U+00bc8b: */
+                                           RTUNI_ALPHA, /* U+00bc8c: */
+                                           RTUNI_ALPHA, /* U+00bc8d: */
+                                           RTUNI_ALPHA, /* U+00bc8e: */
+                                           RTUNI_ALPHA, /* U+00bc8f: */
+                                           RTUNI_ALPHA, /* U+00bc90: */
+                                           RTUNI_ALPHA, /* U+00bc91: */
+                                           RTUNI_ALPHA, /* U+00bc92: */
+                                           RTUNI_ALPHA, /* U+00bc93: */
+                                           RTUNI_ALPHA, /* U+00bc94: */
+                                           RTUNI_ALPHA, /* U+00bc95: */
+                                           RTUNI_ALPHA, /* U+00bc96: */
+                                           RTUNI_ALPHA, /* U+00bc97: */
+                                           RTUNI_ALPHA, /* U+00bc98: */
+                                           RTUNI_ALPHA, /* U+00bc99: */
+                                           RTUNI_ALPHA, /* U+00bc9a: */
+                                           RTUNI_ALPHA, /* U+00bc9b: */
+                                           RTUNI_ALPHA, /* U+00bc9c: */
+                                           RTUNI_ALPHA, /* U+00bc9d: */
+                                           RTUNI_ALPHA, /* U+00bc9e: */
+                                           RTUNI_ALPHA, /* U+00bc9f: */
+                                           RTUNI_ALPHA, /* U+00bca0: */
+                                           RTUNI_ALPHA, /* U+00bca1: */
+                                           RTUNI_ALPHA, /* U+00bca2: */
+                                           RTUNI_ALPHA, /* U+00bca3: */
+                                           RTUNI_ALPHA, /* U+00bca4: */
+                                           RTUNI_ALPHA, /* U+00bca5: */
+                                           RTUNI_ALPHA, /* U+00bca6: */
+                                           RTUNI_ALPHA, /* U+00bca7: */
+                                           RTUNI_ALPHA, /* U+00bca8: */
+                                           RTUNI_ALPHA, /* U+00bca9: */
+                                           RTUNI_ALPHA, /* U+00bcaa: */
+                                           RTUNI_ALPHA, /* U+00bcab: */
+                                           RTUNI_ALPHA, /* U+00bcac: */
+                                           RTUNI_ALPHA, /* U+00bcad: */
+                                           RTUNI_ALPHA, /* U+00bcae: */
+                                           RTUNI_ALPHA, /* U+00bcaf: */
+                                           RTUNI_ALPHA, /* U+00bcb0: */
+                                           RTUNI_ALPHA, /* U+00bcb1: */
+                                           RTUNI_ALPHA, /* U+00bcb2: */
+                                           RTUNI_ALPHA, /* U+00bcb3: */
+                                           RTUNI_ALPHA, /* U+00bcb4: */
+                                           RTUNI_ALPHA, /* U+00bcb5: */
+                                           RTUNI_ALPHA, /* U+00bcb6: */
+                                           RTUNI_ALPHA, /* U+00bcb7: */
+                                           RTUNI_ALPHA, /* U+00bcb8: */
+                                           RTUNI_ALPHA, /* U+00bcb9: */
+                                           RTUNI_ALPHA, /* U+00bcba: */
+                                           RTUNI_ALPHA, /* U+00bcbb: */
+                                           RTUNI_ALPHA, /* U+00bcbc: */
+                                           RTUNI_ALPHA, /* U+00bcbd: */
+                                           RTUNI_ALPHA, /* U+00bcbe: */
+                                           RTUNI_ALPHA, /* U+00bcbf: */
+                                           RTUNI_ALPHA, /* U+00bcc0: */
+                                           RTUNI_ALPHA, /* U+00bcc1: */
+                                           RTUNI_ALPHA, /* U+00bcc2: */
+                                           RTUNI_ALPHA, /* U+00bcc3: */
+                                           RTUNI_ALPHA, /* U+00bcc4: */
+                                           RTUNI_ALPHA, /* U+00bcc5: */
+                                           RTUNI_ALPHA, /* U+00bcc6: */
+                                           RTUNI_ALPHA, /* U+00bcc7: */
+                                           RTUNI_ALPHA, /* U+00bcc8: */
+                                           RTUNI_ALPHA, /* U+00bcc9: */
+                                           RTUNI_ALPHA, /* U+00bcca: */
+                                           RTUNI_ALPHA, /* U+00bccb: */
+                                           RTUNI_ALPHA, /* U+00bccc: */
+                                           RTUNI_ALPHA, /* U+00bccd: */
+                                           RTUNI_ALPHA, /* U+00bcce: */
+                                           RTUNI_ALPHA, /* U+00bccf: */
+                                           RTUNI_ALPHA, /* U+00bcd0: */
+                                           RTUNI_ALPHA, /* U+00bcd1: */
+                                           RTUNI_ALPHA, /* U+00bcd2: */
+                                           RTUNI_ALPHA, /* U+00bcd3: */
+                                           RTUNI_ALPHA, /* U+00bcd4: */
+                                           RTUNI_ALPHA, /* U+00bcd5: */
+                                           RTUNI_ALPHA, /* U+00bcd6: */
+                                           RTUNI_ALPHA, /* U+00bcd7: */
+                                           RTUNI_ALPHA, /* U+00bcd8: */
+                                           RTUNI_ALPHA, /* U+00bcd9: */
+                                           RTUNI_ALPHA, /* U+00bcda: */
+                                           RTUNI_ALPHA, /* U+00bcdb: */
+                                           RTUNI_ALPHA, /* U+00bcdc: */
+                                           RTUNI_ALPHA, /* U+00bcdd: */
+                                           RTUNI_ALPHA, /* U+00bcde: */
+                                           RTUNI_ALPHA, /* U+00bcdf: */
+                                           RTUNI_ALPHA, /* U+00bce0: */
+                                           RTUNI_ALPHA, /* U+00bce1: */
+                                           RTUNI_ALPHA, /* U+00bce2: */
+                                           RTUNI_ALPHA, /* U+00bce3: */
+                                           RTUNI_ALPHA, /* U+00bce4: */
+                                           RTUNI_ALPHA, /* U+00bce5: */
+                                           RTUNI_ALPHA, /* U+00bce6: */
+                                           RTUNI_ALPHA, /* U+00bce7: */
+                                           RTUNI_ALPHA, /* U+00bce8: */
+                                           RTUNI_ALPHA, /* U+00bce9: */
+                                           RTUNI_ALPHA, /* U+00bcea: */
+                                           RTUNI_ALPHA, /* U+00bceb: */
+                                           RTUNI_ALPHA, /* U+00bcec: */
+                                           RTUNI_ALPHA, /* U+00bced: */
+                                           RTUNI_ALPHA, /* U+00bcee: */
+                                           RTUNI_ALPHA, /* U+00bcef: */
+                                           RTUNI_ALPHA, /* U+00bcf0: */
+                                           RTUNI_ALPHA, /* U+00bcf1: */
+                                           RTUNI_ALPHA, /* U+00bcf2: */
+                                           RTUNI_ALPHA, /* U+00bcf3: */
+                                           RTUNI_ALPHA, /* U+00bcf4: */
+                                           RTUNI_ALPHA, /* U+00bcf5: */
+                                           RTUNI_ALPHA, /* U+00bcf6: */
+                                           RTUNI_ALPHA, /* U+00bcf7: */
+                                           RTUNI_ALPHA, /* U+00bcf8: */
+                                           RTUNI_ALPHA, /* U+00bcf9: */
+                                           RTUNI_ALPHA, /* U+00bcfa: */
+                                           RTUNI_ALPHA, /* U+00bcfb: */
+                                           RTUNI_ALPHA, /* U+00bcfc: */
+                                           RTUNI_ALPHA, /* U+00bcfd: */
+                                           RTUNI_ALPHA, /* U+00bcfe: */
+                                           RTUNI_ALPHA, /* U+00bcff: */
+                                           RTUNI_ALPHA, /* U+00bd00: */
+                                           RTUNI_ALPHA, /* U+00bd01: */
+                                           RTUNI_ALPHA, /* U+00bd02: */
+                                           RTUNI_ALPHA, /* U+00bd03: */
+                                           RTUNI_ALPHA, /* U+00bd04: */
+                                           RTUNI_ALPHA, /* U+00bd05: */
+                                           RTUNI_ALPHA, /* U+00bd06: */
+                                           RTUNI_ALPHA, /* U+00bd07: */
+                                           RTUNI_ALPHA, /* U+00bd08: */
+                                           RTUNI_ALPHA, /* U+00bd09: */
+                                           RTUNI_ALPHA, /* U+00bd0a: */
+                                           RTUNI_ALPHA, /* U+00bd0b: */
+                                           RTUNI_ALPHA, /* U+00bd0c: */
+                                           RTUNI_ALPHA, /* U+00bd0d: */
+                                           RTUNI_ALPHA, /* U+00bd0e: */
+                                           RTUNI_ALPHA, /* U+00bd0f: */
+                                           RTUNI_ALPHA, /* U+00bd10: */
+                                           RTUNI_ALPHA, /* U+00bd11: */
+                                           RTUNI_ALPHA, /* U+00bd12: */
+                                           RTUNI_ALPHA, /* U+00bd13: */
+                                           RTUNI_ALPHA, /* U+00bd14: */
+                                           RTUNI_ALPHA, /* U+00bd15: */
+                                           RTUNI_ALPHA, /* U+00bd16: */
+                                           RTUNI_ALPHA, /* U+00bd17: */
+                                           RTUNI_ALPHA, /* U+00bd18: */
+                                           RTUNI_ALPHA, /* U+00bd19: */
+                                           RTUNI_ALPHA, /* U+00bd1a: */
+                                           RTUNI_ALPHA, /* U+00bd1b: */
+                                           RTUNI_ALPHA, /* U+00bd1c: */
+                                           RTUNI_ALPHA, /* U+00bd1d: */
+                                           RTUNI_ALPHA, /* U+00bd1e: */
+                                           RTUNI_ALPHA, /* U+00bd1f: */
+                                           RTUNI_ALPHA, /* U+00bd20: */
+                                           RTUNI_ALPHA, /* U+00bd21: */
+                                           RTUNI_ALPHA, /* U+00bd22: */
+                                           RTUNI_ALPHA, /* U+00bd23: */
+                                           RTUNI_ALPHA, /* U+00bd24: */
+                                           RTUNI_ALPHA, /* U+00bd25: */
+                                           RTUNI_ALPHA, /* U+00bd26: */
+                                           RTUNI_ALPHA, /* U+00bd27: */
+                                           RTUNI_ALPHA, /* U+00bd28: */
+                                           RTUNI_ALPHA, /* U+00bd29: */
+                                           RTUNI_ALPHA, /* U+00bd2a: */
+                                           RTUNI_ALPHA, /* U+00bd2b: */
+                                           RTUNI_ALPHA, /* U+00bd2c: */
+                                           RTUNI_ALPHA, /* U+00bd2d: */
+                                           RTUNI_ALPHA, /* U+00bd2e: */
+                                           RTUNI_ALPHA, /* U+00bd2f: */
+                                           RTUNI_ALPHA, /* U+00bd30: */
+                                           RTUNI_ALPHA, /* U+00bd31: */
+                                           RTUNI_ALPHA, /* U+00bd32: */
+                                           RTUNI_ALPHA, /* U+00bd33: */
+                                           RTUNI_ALPHA, /* U+00bd34: */
+                                           RTUNI_ALPHA, /* U+00bd35: */
+                                           RTUNI_ALPHA, /* U+00bd36: */
+                                           RTUNI_ALPHA, /* U+00bd37: */
+                                           RTUNI_ALPHA, /* U+00bd38: */
+                                           RTUNI_ALPHA, /* U+00bd39: */
+                                           RTUNI_ALPHA, /* U+00bd3a: */
+                                           RTUNI_ALPHA, /* U+00bd3b: */
+                                           RTUNI_ALPHA, /* U+00bd3c: */
+                                           RTUNI_ALPHA, /* U+00bd3d: */
+                                           RTUNI_ALPHA, /* U+00bd3e: */
+                                           RTUNI_ALPHA, /* U+00bd3f: */
+                                           RTUNI_ALPHA, /* U+00bd40: */
+                                           RTUNI_ALPHA, /* U+00bd41: */
+                                           RTUNI_ALPHA, /* U+00bd42: */
+                                           RTUNI_ALPHA, /* U+00bd43: */
+                                           RTUNI_ALPHA, /* U+00bd44: */
+                                           RTUNI_ALPHA, /* U+00bd45: */
+                                           RTUNI_ALPHA, /* U+00bd46: */
+                                           RTUNI_ALPHA, /* U+00bd47: */
+                                           RTUNI_ALPHA, /* U+00bd48: */
+                                           RTUNI_ALPHA, /* U+00bd49: */
+                                           RTUNI_ALPHA, /* U+00bd4a: */
+                                           RTUNI_ALPHA, /* U+00bd4b: */
+                                           RTUNI_ALPHA, /* U+00bd4c: */
+                                           RTUNI_ALPHA, /* U+00bd4d: */
+                                           RTUNI_ALPHA, /* U+00bd4e: */
+                                           RTUNI_ALPHA, /* U+00bd4f: */
+                                           RTUNI_ALPHA, /* U+00bd50: */
+                                           RTUNI_ALPHA, /* U+00bd51: */
+                                           RTUNI_ALPHA, /* U+00bd52: */
+                                           RTUNI_ALPHA, /* U+00bd53: */
+                                           RTUNI_ALPHA, /* U+00bd54: */
+                                           RTUNI_ALPHA, /* U+00bd55: */
+                                           RTUNI_ALPHA, /* U+00bd56: */
+                                           RTUNI_ALPHA, /* U+00bd57: */
+                                           RTUNI_ALPHA, /* U+00bd58: */
+                                           RTUNI_ALPHA, /* U+00bd59: */
+                                           RTUNI_ALPHA, /* U+00bd5a: */
+                                           RTUNI_ALPHA, /* U+00bd5b: */
+                                           RTUNI_ALPHA, /* U+00bd5c: */
+                                           RTUNI_ALPHA, /* U+00bd5d: */
+                                           RTUNI_ALPHA, /* U+00bd5e: */
+                                           RTUNI_ALPHA, /* U+00bd5f: */
+                                           RTUNI_ALPHA, /* U+00bd60: */
+                                           RTUNI_ALPHA, /* U+00bd61: */
+                                           RTUNI_ALPHA, /* U+00bd62: */
+                                           RTUNI_ALPHA, /* U+00bd63: */
+                                           RTUNI_ALPHA, /* U+00bd64: */
+                                           RTUNI_ALPHA, /* U+00bd65: */
+                                           RTUNI_ALPHA, /* U+00bd66: */
+                                           RTUNI_ALPHA, /* U+00bd67: */
+                                           RTUNI_ALPHA, /* U+00bd68: */
+                                           RTUNI_ALPHA, /* U+00bd69: */
+                                           RTUNI_ALPHA, /* U+00bd6a: */
+                                           RTUNI_ALPHA, /* U+00bd6b: */
+                                           RTUNI_ALPHA, /* U+00bd6c: */
+                                           RTUNI_ALPHA, /* U+00bd6d: */
+                                           RTUNI_ALPHA, /* U+00bd6e: */
+                                           RTUNI_ALPHA, /* U+00bd6f: */
+                                           RTUNI_ALPHA, /* U+00bd70: */
+                                           RTUNI_ALPHA, /* U+00bd71: */
+                                           RTUNI_ALPHA, /* U+00bd72: */
+                                           RTUNI_ALPHA, /* U+00bd73: */
+                                           RTUNI_ALPHA, /* U+00bd74: */
+                                           RTUNI_ALPHA, /* U+00bd75: */
+                                           RTUNI_ALPHA, /* U+00bd76: */
+                                           RTUNI_ALPHA, /* U+00bd77: */
+                                           RTUNI_ALPHA, /* U+00bd78: */
+                                           RTUNI_ALPHA, /* U+00bd79: */
+                                           RTUNI_ALPHA, /* U+00bd7a: */
+                                           RTUNI_ALPHA, /* U+00bd7b: */
+                                           RTUNI_ALPHA, /* U+00bd7c: */
+                                           RTUNI_ALPHA, /* U+00bd7d: */
+                                           RTUNI_ALPHA, /* U+00bd7e: */
+                                           RTUNI_ALPHA, /* U+00bd7f: */
+                                           RTUNI_ALPHA, /* U+00bd80: */
+                                           RTUNI_ALPHA, /* U+00bd81: */
+                                           RTUNI_ALPHA, /* U+00bd82: */
+                                           RTUNI_ALPHA, /* U+00bd83: */
+                                           RTUNI_ALPHA, /* U+00bd84: */
+                                           RTUNI_ALPHA, /* U+00bd85: */
+                                           RTUNI_ALPHA, /* U+00bd86: */
+                                           RTUNI_ALPHA, /* U+00bd87: */
+                                           RTUNI_ALPHA, /* U+00bd88: */
+                                           RTUNI_ALPHA, /* U+00bd89: */
+                                           RTUNI_ALPHA, /* U+00bd8a: */
+                                           RTUNI_ALPHA, /* U+00bd8b: */
+                                           RTUNI_ALPHA, /* U+00bd8c: */
+                                           RTUNI_ALPHA, /* U+00bd8d: */
+                                           RTUNI_ALPHA, /* U+00bd8e: */
+                                           RTUNI_ALPHA, /* U+00bd8f: */
+                                           RTUNI_ALPHA, /* U+00bd90: */
+                                           RTUNI_ALPHA, /* U+00bd91: */
+                                           RTUNI_ALPHA, /* U+00bd92: */
+                                           RTUNI_ALPHA, /* U+00bd93: */
+                                           RTUNI_ALPHA, /* U+00bd94: */
+                                           RTUNI_ALPHA, /* U+00bd95: */
+                                           RTUNI_ALPHA, /* U+00bd96: */
+                                           RTUNI_ALPHA, /* U+00bd97: */
+                                           RTUNI_ALPHA, /* U+00bd98: */
+                                           RTUNI_ALPHA, /* U+00bd99: */
+                                           RTUNI_ALPHA, /* U+00bd9a: */
+                                           RTUNI_ALPHA, /* U+00bd9b: */
+                                           RTUNI_ALPHA, /* U+00bd9c: */
+                                           RTUNI_ALPHA, /* U+00bd9d: */
+                                           RTUNI_ALPHA, /* U+00bd9e: */
+                                           RTUNI_ALPHA, /* U+00bd9f: */
+                                           RTUNI_ALPHA, /* U+00bda0: */
+                                           RTUNI_ALPHA, /* U+00bda1: */
+                                           RTUNI_ALPHA, /* U+00bda2: */
+                                           RTUNI_ALPHA, /* U+00bda3: */
+                                           RTUNI_ALPHA, /* U+00bda4: */
+                                           RTUNI_ALPHA, /* U+00bda5: */
+                                           RTUNI_ALPHA, /* U+00bda6: */
+                                           RTUNI_ALPHA, /* U+00bda7: */
+                                           RTUNI_ALPHA, /* U+00bda8: */
+                                           RTUNI_ALPHA, /* U+00bda9: */
+                                           RTUNI_ALPHA, /* U+00bdaa: */
+                                           RTUNI_ALPHA, /* U+00bdab: */
+                                           RTUNI_ALPHA, /* U+00bdac: */
+                                           RTUNI_ALPHA, /* U+00bdad: */
+                                           RTUNI_ALPHA, /* U+00bdae: */
+                                           RTUNI_ALPHA, /* U+00bdaf: */
+                                           RTUNI_ALPHA, /* U+00bdb0: */
+                                           RTUNI_ALPHA, /* U+00bdb1: */
+                                           RTUNI_ALPHA, /* U+00bdb2: */
+                                           RTUNI_ALPHA, /* U+00bdb3: */
+                                           RTUNI_ALPHA, /* U+00bdb4: */
+                                           RTUNI_ALPHA, /* U+00bdb5: */
+                                           RTUNI_ALPHA, /* U+00bdb6: */
+                                           RTUNI_ALPHA, /* U+00bdb7: */
+                                           RTUNI_ALPHA, /* U+00bdb8: */
+                                           RTUNI_ALPHA, /* U+00bdb9: */
+                                           RTUNI_ALPHA, /* U+00bdba: */
+                                           RTUNI_ALPHA, /* U+00bdbb: */
+                                           RTUNI_ALPHA, /* U+00bdbc: */
+                                           RTUNI_ALPHA, /* U+00bdbd: */
+                                           RTUNI_ALPHA, /* U+00bdbe: */
+                                           RTUNI_ALPHA, /* U+00bdbf: */
+                                           RTUNI_ALPHA, /* U+00bdc0: */
+                                           RTUNI_ALPHA, /* U+00bdc1: */
+                                           RTUNI_ALPHA, /* U+00bdc2: */
+                                           RTUNI_ALPHA, /* U+00bdc3: */
+                                           RTUNI_ALPHA, /* U+00bdc4: */
+                                           RTUNI_ALPHA, /* U+00bdc5: */
+                                           RTUNI_ALPHA, /* U+00bdc6: */
+                                           RTUNI_ALPHA, /* U+00bdc7: */
+                                           RTUNI_ALPHA, /* U+00bdc8: */
+                                           RTUNI_ALPHA, /* U+00bdc9: */
+                                           RTUNI_ALPHA, /* U+00bdca: */
+                                           RTUNI_ALPHA, /* U+00bdcb: */
+                                           RTUNI_ALPHA, /* U+00bdcc: */
+                                           RTUNI_ALPHA, /* U+00bdcd: */
+                                           RTUNI_ALPHA, /* U+00bdce: */
+                                           RTUNI_ALPHA, /* U+00bdcf: */
+                                           RTUNI_ALPHA, /* U+00bdd0: */
+                                           RTUNI_ALPHA, /* U+00bdd1: */
+                                           RTUNI_ALPHA, /* U+00bdd2: */
+                                           RTUNI_ALPHA, /* U+00bdd3: */
+                                           RTUNI_ALPHA, /* U+00bdd4: */
+                                           RTUNI_ALPHA, /* U+00bdd5: */
+                                           RTUNI_ALPHA, /* U+00bdd6: */
+                                           RTUNI_ALPHA, /* U+00bdd7: */
+                                           RTUNI_ALPHA, /* U+00bdd8: */
+                                           RTUNI_ALPHA, /* U+00bdd9: */
+                                           RTUNI_ALPHA, /* U+00bdda: */
+                                           RTUNI_ALPHA, /* U+00bddb: */
+                                           RTUNI_ALPHA, /* U+00bddc: */
+                                           RTUNI_ALPHA, /* U+00bddd: */
+                                           RTUNI_ALPHA, /* U+00bdde: */
+                                           RTUNI_ALPHA, /* U+00bddf: */
+                                           RTUNI_ALPHA, /* U+00bde0: */
+                                           RTUNI_ALPHA, /* U+00bde1: */
+                                           RTUNI_ALPHA, /* U+00bde2: */
+                                           RTUNI_ALPHA, /* U+00bde3: */
+                                           RTUNI_ALPHA, /* U+00bde4: */
+                                           RTUNI_ALPHA, /* U+00bde5: */
+                                           RTUNI_ALPHA, /* U+00bde6: */
+                                           RTUNI_ALPHA, /* U+00bde7: */
+                                           RTUNI_ALPHA, /* U+00bde8: */
+                                           RTUNI_ALPHA, /* U+00bde9: */
+                                           RTUNI_ALPHA, /* U+00bdea: */
+                                           RTUNI_ALPHA, /* U+00bdeb: */
+                                           RTUNI_ALPHA, /* U+00bdec: */
+                                           RTUNI_ALPHA, /* U+00bded: */
+                                           RTUNI_ALPHA, /* U+00bdee: */
+                                           RTUNI_ALPHA, /* U+00bdef: */
+                                           RTUNI_ALPHA, /* U+00bdf0: */
+                                           RTUNI_ALPHA, /* U+00bdf1: */
+                                           RTUNI_ALPHA, /* U+00bdf2: */
+                                           RTUNI_ALPHA, /* U+00bdf3: */
+                                           RTUNI_ALPHA, /* U+00bdf4: */
+                                           RTUNI_ALPHA, /* U+00bdf5: */
+                                           RTUNI_ALPHA, /* U+00bdf6: */
+                                           RTUNI_ALPHA, /* U+00bdf7: */
+                                           RTUNI_ALPHA, /* U+00bdf8: */
+                                           RTUNI_ALPHA, /* U+00bdf9: */
+                                           RTUNI_ALPHA, /* U+00bdfa: */
+                                           RTUNI_ALPHA, /* U+00bdfb: */
+                                           RTUNI_ALPHA, /* U+00bdfc: */
+                                           RTUNI_ALPHA, /* U+00bdfd: */
+                                           RTUNI_ALPHA, /* U+00bdfe: */
+                                           RTUNI_ALPHA, /* U+00bdff: */
+                                           RTUNI_ALPHA, /* U+00be00: */
+                                           RTUNI_ALPHA, /* U+00be01: */
+                                           RTUNI_ALPHA, /* U+00be02: */
+                                           RTUNI_ALPHA, /* U+00be03: */
+                                           RTUNI_ALPHA, /* U+00be04: */
+                                           RTUNI_ALPHA, /* U+00be05: */
+                                           RTUNI_ALPHA, /* U+00be06: */
+                                           RTUNI_ALPHA, /* U+00be07: */
+                                           RTUNI_ALPHA, /* U+00be08: */
+                                           RTUNI_ALPHA, /* U+00be09: */
+                                           RTUNI_ALPHA, /* U+00be0a: */
+                                           RTUNI_ALPHA, /* U+00be0b: */
+                                           RTUNI_ALPHA, /* U+00be0c: */
+                                           RTUNI_ALPHA, /* U+00be0d: */
+                                           RTUNI_ALPHA, /* U+00be0e: */
+                                           RTUNI_ALPHA, /* U+00be0f: */
+                                           RTUNI_ALPHA, /* U+00be10: */
+                                           RTUNI_ALPHA, /* U+00be11: */
+                                           RTUNI_ALPHA, /* U+00be12: */
+                                           RTUNI_ALPHA, /* U+00be13: */
+                                           RTUNI_ALPHA, /* U+00be14: */
+                                           RTUNI_ALPHA, /* U+00be15: */
+                                           RTUNI_ALPHA, /* U+00be16: */
+                                           RTUNI_ALPHA, /* U+00be17: */
+                                           RTUNI_ALPHA, /* U+00be18: */
+                                           RTUNI_ALPHA, /* U+00be19: */
+                                           RTUNI_ALPHA, /* U+00be1a: */
+                                           RTUNI_ALPHA, /* U+00be1b: */
+                                           RTUNI_ALPHA, /* U+00be1c: */
+                                           RTUNI_ALPHA, /* U+00be1d: */
+                                           RTUNI_ALPHA, /* U+00be1e: */
+                                           RTUNI_ALPHA, /* U+00be1f: */
+                                           RTUNI_ALPHA, /* U+00be20: */
+                                           RTUNI_ALPHA, /* U+00be21: */
+                                           RTUNI_ALPHA, /* U+00be22: */
+                                           RTUNI_ALPHA, /* U+00be23: */
+                                           RTUNI_ALPHA, /* U+00be24: */
+                                           RTUNI_ALPHA, /* U+00be25: */
+                                           RTUNI_ALPHA, /* U+00be26: */
+                                           RTUNI_ALPHA, /* U+00be27: */
+                                           RTUNI_ALPHA, /* U+00be28: */
+                                           RTUNI_ALPHA, /* U+00be29: */
+                                           RTUNI_ALPHA, /* U+00be2a: */
+                                           RTUNI_ALPHA, /* U+00be2b: */
+                                           RTUNI_ALPHA, /* U+00be2c: */
+                                           RTUNI_ALPHA, /* U+00be2d: */
+                                           RTUNI_ALPHA, /* U+00be2e: */
+                                           RTUNI_ALPHA, /* U+00be2f: */
+                                           RTUNI_ALPHA, /* U+00be30: */
+                                           RTUNI_ALPHA, /* U+00be31: */
+                                           RTUNI_ALPHA, /* U+00be32: */
+                                           RTUNI_ALPHA, /* U+00be33: */
+                                           RTUNI_ALPHA, /* U+00be34: */
+                                           RTUNI_ALPHA, /* U+00be35: */
+                                           RTUNI_ALPHA, /* U+00be36: */
+                                           RTUNI_ALPHA, /* U+00be37: */
+                                           RTUNI_ALPHA, /* U+00be38: */
+                                           RTUNI_ALPHA, /* U+00be39: */
+                                           RTUNI_ALPHA, /* U+00be3a: */
+                                           RTUNI_ALPHA, /* U+00be3b: */
+                                           RTUNI_ALPHA, /* U+00be3c: */
+                                           RTUNI_ALPHA, /* U+00be3d: */
+                                           RTUNI_ALPHA, /* U+00be3e: */
+                                           RTUNI_ALPHA, /* U+00be3f: */
+                                           RTUNI_ALPHA, /* U+00be40: */
+                                           RTUNI_ALPHA, /* U+00be41: */
+                                           RTUNI_ALPHA, /* U+00be42: */
+                                           RTUNI_ALPHA, /* U+00be43: */
+                                           RTUNI_ALPHA, /* U+00be44: */
+                                           RTUNI_ALPHA, /* U+00be45: */
+                                           RTUNI_ALPHA, /* U+00be46: */
+                                           RTUNI_ALPHA, /* U+00be47: */
+                                           RTUNI_ALPHA, /* U+00be48: */
+                                           RTUNI_ALPHA, /* U+00be49: */
+                                           RTUNI_ALPHA, /* U+00be4a: */
+                                           RTUNI_ALPHA, /* U+00be4b: */
+                                           RTUNI_ALPHA, /* U+00be4c: */
+                                           RTUNI_ALPHA, /* U+00be4d: */
+                                           RTUNI_ALPHA, /* U+00be4e: */
+                                           RTUNI_ALPHA, /* U+00be4f: */
+                                           RTUNI_ALPHA, /* U+00be50: */
+                                           RTUNI_ALPHA, /* U+00be51: */
+                                           RTUNI_ALPHA, /* U+00be52: */
+                                           RTUNI_ALPHA, /* U+00be53: */
+                                           RTUNI_ALPHA, /* U+00be54: */
+                                           RTUNI_ALPHA, /* U+00be55: */
+                                           RTUNI_ALPHA, /* U+00be56: */
+                                           RTUNI_ALPHA, /* U+00be57: */
+                                           RTUNI_ALPHA, /* U+00be58: */
+                                           RTUNI_ALPHA, /* U+00be59: */
+                                           RTUNI_ALPHA, /* U+00be5a: */
+                                           RTUNI_ALPHA, /* U+00be5b: */
+                                           RTUNI_ALPHA, /* U+00be5c: */
+                                           RTUNI_ALPHA, /* U+00be5d: */
+                                           RTUNI_ALPHA, /* U+00be5e: */
+                                           RTUNI_ALPHA, /* U+00be5f: */
+                                           RTUNI_ALPHA, /* U+00be60: */
+                                           RTUNI_ALPHA, /* U+00be61: */
+                                           RTUNI_ALPHA, /* U+00be62: */
+                                           RTUNI_ALPHA, /* U+00be63: */
+                                           RTUNI_ALPHA, /* U+00be64: */
+                                           RTUNI_ALPHA, /* U+00be65: */
+                                           RTUNI_ALPHA, /* U+00be66: */
+                                           RTUNI_ALPHA, /* U+00be67: */
+                                           RTUNI_ALPHA, /* U+00be68: */
+                                           RTUNI_ALPHA, /* U+00be69: */
+                                           RTUNI_ALPHA, /* U+00be6a: */
+                                           RTUNI_ALPHA, /* U+00be6b: */
+                                           RTUNI_ALPHA, /* U+00be6c: */
+                                           RTUNI_ALPHA, /* U+00be6d: */
+                                           RTUNI_ALPHA, /* U+00be6e: */
+                                           RTUNI_ALPHA, /* U+00be6f: */
+                                           RTUNI_ALPHA, /* U+00be70: */
+                                           RTUNI_ALPHA, /* U+00be71: */
+                                           RTUNI_ALPHA, /* U+00be72: */
+                                           RTUNI_ALPHA, /* U+00be73: */
+                                           RTUNI_ALPHA, /* U+00be74: */
+                                           RTUNI_ALPHA, /* U+00be75: */
+                                           RTUNI_ALPHA, /* U+00be76: */
+                                           RTUNI_ALPHA, /* U+00be77: */
+                                           RTUNI_ALPHA, /* U+00be78: */
+                                           RTUNI_ALPHA, /* U+00be79: */
+                                           RTUNI_ALPHA, /* U+00be7a: */
+                                           RTUNI_ALPHA, /* U+00be7b: */
+                                           RTUNI_ALPHA, /* U+00be7c: */
+                                           RTUNI_ALPHA, /* U+00be7d: */
+                                           RTUNI_ALPHA, /* U+00be7e: */
+                                           RTUNI_ALPHA, /* U+00be7f: */
+                                           RTUNI_ALPHA, /* U+00be80: */
+                                           RTUNI_ALPHA, /* U+00be81: */
+                                           RTUNI_ALPHA, /* U+00be82: */
+                                           RTUNI_ALPHA, /* U+00be83: */
+                                           RTUNI_ALPHA, /* U+00be84: */
+                                           RTUNI_ALPHA, /* U+00be85: */
+                                           RTUNI_ALPHA, /* U+00be86: */
+                                           RTUNI_ALPHA, /* U+00be87: */
+                                           RTUNI_ALPHA, /* U+00be88: */
+                                           RTUNI_ALPHA, /* U+00be89: */
+                                           RTUNI_ALPHA, /* U+00be8a: */
+                                           RTUNI_ALPHA, /* U+00be8b: */
+                                           RTUNI_ALPHA, /* U+00be8c: */
+                                           RTUNI_ALPHA, /* U+00be8d: */
+                                           RTUNI_ALPHA, /* U+00be8e: */
+                                           RTUNI_ALPHA, /* U+00be8f: */
+                                           RTUNI_ALPHA, /* U+00be90: */
+                                           RTUNI_ALPHA, /* U+00be91: */
+                                           RTUNI_ALPHA, /* U+00be92: */
+                                           RTUNI_ALPHA, /* U+00be93: */
+                                           RTUNI_ALPHA, /* U+00be94: */
+                                           RTUNI_ALPHA, /* U+00be95: */
+                                           RTUNI_ALPHA, /* U+00be96: */
+                                           RTUNI_ALPHA, /* U+00be97: */
+                                           RTUNI_ALPHA, /* U+00be98: */
+                                           RTUNI_ALPHA, /* U+00be99: */
+                                           RTUNI_ALPHA, /* U+00be9a: */
+                                           RTUNI_ALPHA, /* U+00be9b: */
+                                           RTUNI_ALPHA, /* U+00be9c: */
+                                           RTUNI_ALPHA, /* U+00be9d: */
+                                           RTUNI_ALPHA, /* U+00be9e: */
+                                           RTUNI_ALPHA, /* U+00be9f: */
+                                           RTUNI_ALPHA, /* U+00bea0: */
+                                           RTUNI_ALPHA, /* U+00bea1: */
+                                           RTUNI_ALPHA, /* U+00bea2: */
+                                           RTUNI_ALPHA, /* U+00bea3: */
+                                           RTUNI_ALPHA, /* U+00bea4: */
+                                           RTUNI_ALPHA, /* U+00bea5: */
+                                           RTUNI_ALPHA, /* U+00bea6: */
+                                           RTUNI_ALPHA, /* U+00bea7: */
+                                           RTUNI_ALPHA, /* U+00bea8: */
+                                           RTUNI_ALPHA, /* U+00bea9: */
+                                           RTUNI_ALPHA, /* U+00beaa: */
+                                           RTUNI_ALPHA, /* U+00beab: */
+                                           RTUNI_ALPHA, /* U+00beac: */
+                                           RTUNI_ALPHA, /* U+00bead: */
+                                           RTUNI_ALPHA, /* U+00beae: */
+                                           RTUNI_ALPHA, /* U+00beaf: */
+                                           RTUNI_ALPHA, /* U+00beb0: */
+                                           RTUNI_ALPHA, /* U+00beb1: */
+                                           RTUNI_ALPHA, /* U+00beb2: */
+                                           RTUNI_ALPHA, /* U+00beb3: */
+                                           RTUNI_ALPHA, /* U+00beb4: */
+                                           RTUNI_ALPHA, /* U+00beb5: */
+                                           RTUNI_ALPHA, /* U+00beb6: */
+                                           RTUNI_ALPHA, /* U+00beb7: */
+                                           RTUNI_ALPHA, /* U+00beb8: */
+                                           RTUNI_ALPHA, /* U+00beb9: */
+                                           RTUNI_ALPHA, /* U+00beba: */
+                                           RTUNI_ALPHA, /* U+00bebb: */
+                                           RTUNI_ALPHA, /* U+00bebc: */
+                                           RTUNI_ALPHA, /* U+00bebd: */
+                                           RTUNI_ALPHA, /* U+00bebe: */
+                                           RTUNI_ALPHA, /* U+00bebf: */
+                                           RTUNI_ALPHA, /* U+00bec0: */
+                                           RTUNI_ALPHA, /* U+00bec1: */
+                                           RTUNI_ALPHA, /* U+00bec2: */
+                                           RTUNI_ALPHA, /* U+00bec3: */
+                                           RTUNI_ALPHA, /* U+00bec4: */
+                                           RTUNI_ALPHA, /* U+00bec5: */
+                                           RTUNI_ALPHA, /* U+00bec6: */
+                                           RTUNI_ALPHA, /* U+00bec7: */
+                                           RTUNI_ALPHA, /* U+00bec8: */
+                                           RTUNI_ALPHA, /* U+00bec9: */
+                                           RTUNI_ALPHA, /* U+00beca: */
+                                           RTUNI_ALPHA, /* U+00becb: */
+                                           RTUNI_ALPHA, /* U+00becc: */
+                                           RTUNI_ALPHA, /* U+00becd: */
+                                           RTUNI_ALPHA, /* U+00bece: */
+                                           RTUNI_ALPHA, /* U+00becf: */
+                                           RTUNI_ALPHA, /* U+00bed0: */
+                                           RTUNI_ALPHA, /* U+00bed1: */
+                                           RTUNI_ALPHA, /* U+00bed2: */
+                                           RTUNI_ALPHA, /* U+00bed3: */
+                                           RTUNI_ALPHA, /* U+00bed4: */
+                                           RTUNI_ALPHA, /* U+00bed5: */
+                                           RTUNI_ALPHA, /* U+00bed6: */
+                                           RTUNI_ALPHA, /* U+00bed7: */
+                                           RTUNI_ALPHA, /* U+00bed8: */
+                                           RTUNI_ALPHA, /* U+00bed9: */
+                                           RTUNI_ALPHA, /* U+00beda: */
+                                           RTUNI_ALPHA, /* U+00bedb: */
+                                           RTUNI_ALPHA, /* U+00bedc: */
+                                           RTUNI_ALPHA, /* U+00bedd: */
+                                           RTUNI_ALPHA, /* U+00bede: */
+                                           RTUNI_ALPHA, /* U+00bedf: */
+                                           RTUNI_ALPHA, /* U+00bee0: */
+                                           RTUNI_ALPHA, /* U+00bee1: */
+                                           RTUNI_ALPHA, /* U+00bee2: */
+                                           RTUNI_ALPHA, /* U+00bee3: */
+                                           RTUNI_ALPHA, /* U+00bee4: */
+                                           RTUNI_ALPHA, /* U+00bee5: */
+                                           RTUNI_ALPHA, /* U+00bee6: */
+                                           RTUNI_ALPHA, /* U+00bee7: */
+                                           RTUNI_ALPHA, /* U+00bee8: */
+                                           RTUNI_ALPHA, /* U+00bee9: */
+                                           RTUNI_ALPHA, /* U+00beea: */
+                                           RTUNI_ALPHA, /* U+00beeb: */
+                                           RTUNI_ALPHA, /* U+00beec: */
+                                           RTUNI_ALPHA, /* U+00beed: */
+                                           RTUNI_ALPHA, /* U+00beee: */
+                                           RTUNI_ALPHA, /* U+00beef: */
+                                           RTUNI_ALPHA, /* U+00bef0: */
+                                           RTUNI_ALPHA, /* U+00bef1: */
+                                           RTUNI_ALPHA, /* U+00bef2: */
+                                           RTUNI_ALPHA, /* U+00bef3: */
+                                           RTUNI_ALPHA, /* U+00bef4: */
+                                           RTUNI_ALPHA, /* U+00bef5: */
+                                           RTUNI_ALPHA, /* U+00bef6: */
+                                           RTUNI_ALPHA, /* U+00bef7: */
+                                           RTUNI_ALPHA, /* U+00bef8: */
+                                           RTUNI_ALPHA, /* U+00bef9: */
+                                           RTUNI_ALPHA, /* U+00befa: */
+                                           RTUNI_ALPHA, /* U+00befb: */
+                                           RTUNI_ALPHA, /* U+00befc: */
+                                           RTUNI_ALPHA, /* U+00befd: */
+                                           RTUNI_ALPHA, /* U+00befe: */
+                                           RTUNI_ALPHA, /* U+00beff: */
+                                           RTUNI_ALPHA, /* U+00bf00: */
+                                           RTUNI_ALPHA, /* U+00bf01: */
+                                           RTUNI_ALPHA, /* U+00bf02: */
+                                           RTUNI_ALPHA, /* U+00bf03: */
+                                           RTUNI_ALPHA, /* U+00bf04: */
+                                           RTUNI_ALPHA, /* U+00bf05: */
+                                           RTUNI_ALPHA, /* U+00bf06: */
+                                           RTUNI_ALPHA, /* U+00bf07: */
+                                           RTUNI_ALPHA, /* U+00bf08: */
+                                           RTUNI_ALPHA, /* U+00bf09: */
+                                           RTUNI_ALPHA, /* U+00bf0a: */
+                                           RTUNI_ALPHA, /* U+00bf0b: */
+                                           RTUNI_ALPHA, /* U+00bf0c: */
+                                           RTUNI_ALPHA, /* U+00bf0d: */
+                                           RTUNI_ALPHA, /* U+00bf0e: */
+                                           RTUNI_ALPHA, /* U+00bf0f: */
+                                           RTUNI_ALPHA, /* U+00bf10: */
+                                           RTUNI_ALPHA, /* U+00bf11: */
+                                           RTUNI_ALPHA, /* U+00bf12: */
+                                           RTUNI_ALPHA, /* U+00bf13: */
+                                           RTUNI_ALPHA, /* U+00bf14: */
+                                           RTUNI_ALPHA, /* U+00bf15: */
+                                           RTUNI_ALPHA, /* U+00bf16: */
+                                           RTUNI_ALPHA, /* U+00bf17: */
+                                           RTUNI_ALPHA, /* U+00bf18: */
+                                           RTUNI_ALPHA, /* U+00bf19: */
+                                           RTUNI_ALPHA, /* U+00bf1a: */
+                                           RTUNI_ALPHA, /* U+00bf1b: */
+                                           RTUNI_ALPHA, /* U+00bf1c: */
+                                           RTUNI_ALPHA, /* U+00bf1d: */
+                                           RTUNI_ALPHA, /* U+00bf1e: */
+                                           RTUNI_ALPHA, /* U+00bf1f: */
+                                           RTUNI_ALPHA, /* U+00bf20: */
+                                           RTUNI_ALPHA, /* U+00bf21: */
+                                           RTUNI_ALPHA, /* U+00bf22: */
+                                           RTUNI_ALPHA, /* U+00bf23: */
+                                           RTUNI_ALPHA, /* U+00bf24: */
+                                           RTUNI_ALPHA, /* U+00bf25: */
+                                           RTUNI_ALPHA, /* U+00bf26: */
+                                           RTUNI_ALPHA, /* U+00bf27: */
+                                           RTUNI_ALPHA, /* U+00bf28: */
+                                           RTUNI_ALPHA, /* U+00bf29: */
+                                           RTUNI_ALPHA, /* U+00bf2a: */
+                                           RTUNI_ALPHA, /* U+00bf2b: */
+                                           RTUNI_ALPHA, /* U+00bf2c: */
+                                           RTUNI_ALPHA, /* U+00bf2d: */
+                                           RTUNI_ALPHA, /* U+00bf2e: */
+                                           RTUNI_ALPHA, /* U+00bf2f: */
+                                           RTUNI_ALPHA, /* U+00bf30: */
+                                           RTUNI_ALPHA, /* U+00bf31: */
+                                           RTUNI_ALPHA, /* U+00bf32: */
+                                           RTUNI_ALPHA, /* U+00bf33: */
+                                           RTUNI_ALPHA, /* U+00bf34: */
+                                           RTUNI_ALPHA, /* U+00bf35: */
+                                           RTUNI_ALPHA, /* U+00bf36: */
+                                           RTUNI_ALPHA, /* U+00bf37: */
+                                           RTUNI_ALPHA, /* U+00bf38: */
+                                           RTUNI_ALPHA, /* U+00bf39: */
+                                           RTUNI_ALPHA, /* U+00bf3a: */
+                                           RTUNI_ALPHA, /* U+00bf3b: */
+                                           RTUNI_ALPHA, /* U+00bf3c: */
+                                           RTUNI_ALPHA, /* U+00bf3d: */
+                                           RTUNI_ALPHA, /* U+00bf3e: */
+                                           RTUNI_ALPHA, /* U+00bf3f: */
+                                           RTUNI_ALPHA, /* U+00bf40: */
+                                           RTUNI_ALPHA, /* U+00bf41: */
+                                           RTUNI_ALPHA, /* U+00bf42: */
+                                           RTUNI_ALPHA, /* U+00bf43: */
+                                           RTUNI_ALPHA, /* U+00bf44: */
+                                           RTUNI_ALPHA, /* U+00bf45: */
+                                           RTUNI_ALPHA, /* U+00bf46: */
+                                           RTUNI_ALPHA, /* U+00bf47: */
+                                           RTUNI_ALPHA, /* U+00bf48: */
+                                           RTUNI_ALPHA, /* U+00bf49: */
+                                           RTUNI_ALPHA, /* U+00bf4a: */
+                                           RTUNI_ALPHA, /* U+00bf4b: */
+                                           RTUNI_ALPHA, /* U+00bf4c: */
+                                           RTUNI_ALPHA, /* U+00bf4d: */
+                                           RTUNI_ALPHA, /* U+00bf4e: */
+                                           RTUNI_ALPHA, /* U+00bf4f: */
+                                           RTUNI_ALPHA, /* U+00bf50: */
+                                           RTUNI_ALPHA, /* U+00bf51: */
+                                           RTUNI_ALPHA, /* U+00bf52: */
+                                           RTUNI_ALPHA, /* U+00bf53: */
+                                           RTUNI_ALPHA, /* U+00bf54: */
+                                           RTUNI_ALPHA, /* U+00bf55: */
+                                           RTUNI_ALPHA, /* U+00bf56: */
+                                           RTUNI_ALPHA, /* U+00bf57: */
+                                           RTUNI_ALPHA, /* U+00bf58: */
+                                           RTUNI_ALPHA, /* U+00bf59: */
+                                           RTUNI_ALPHA, /* U+00bf5a: */
+                                           RTUNI_ALPHA, /* U+00bf5b: */
+                                           RTUNI_ALPHA, /* U+00bf5c: */
+                                           RTUNI_ALPHA, /* U+00bf5d: */
+                                           RTUNI_ALPHA, /* U+00bf5e: */
+                                           RTUNI_ALPHA, /* U+00bf5f: */
+                                           RTUNI_ALPHA, /* U+00bf60: */
+                                           RTUNI_ALPHA, /* U+00bf61: */
+                                           RTUNI_ALPHA, /* U+00bf62: */
+                                           RTUNI_ALPHA, /* U+00bf63: */
+                                           RTUNI_ALPHA, /* U+00bf64: */
+                                           RTUNI_ALPHA, /* U+00bf65: */
+                                           RTUNI_ALPHA, /* U+00bf66: */
+                                           RTUNI_ALPHA, /* U+00bf67: */
+                                           RTUNI_ALPHA, /* U+00bf68: */
+                                           RTUNI_ALPHA, /* U+00bf69: */
+                                           RTUNI_ALPHA, /* U+00bf6a: */
+                                           RTUNI_ALPHA, /* U+00bf6b: */
+                                           RTUNI_ALPHA, /* U+00bf6c: */
+                                           RTUNI_ALPHA, /* U+00bf6d: */
+                                           RTUNI_ALPHA, /* U+00bf6e: */
+                                           RTUNI_ALPHA, /* U+00bf6f: */
+                                           RTUNI_ALPHA, /* U+00bf70: */
+                                           RTUNI_ALPHA, /* U+00bf71: */
+                                           RTUNI_ALPHA, /* U+00bf72: */
+                                           RTUNI_ALPHA, /* U+00bf73: */
+                                           RTUNI_ALPHA, /* U+00bf74: */
+                                           RTUNI_ALPHA, /* U+00bf75: */
+                                           RTUNI_ALPHA, /* U+00bf76: */
+                                           RTUNI_ALPHA, /* U+00bf77: */
+                                           RTUNI_ALPHA, /* U+00bf78: */
+                                           RTUNI_ALPHA, /* U+00bf79: */
+                                           RTUNI_ALPHA, /* U+00bf7a: */
+                                           RTUNI_ALPHA, /* U+00bf7b: */
+                                           RTUNI_ALPHA, /* U+00bf7c: */
+                                           RTUNI_ALPHA, /* U+00bf7d: */
+                                           RTUNI_ALPHA, /* U+00bf7e: */
+                                           RTUNI_ALPHA, /* U+00bf7f: */
+                                           RTUNI_ALPHA, /* U+00bf80: */
+                                           RTUNI_ALPHA, /* U+00bf81: */
+                                           RTUNI_ALPHA, /* U+00bf82: */
+                                           RTUNI_ALPHA, /* U+00bf83: */
+                                           RTUNI_ALPHA, /* U+00bf84: */
+                                           RTUNI_ALPHA, /* U+00bf85: */
+                                           RTUNI_ALPHA, /* U+00bf86: */
+                                           RTUNI_ALPHA, /* U+00bf87: */
+                                           RTUNI_ALPHA, /* U+00bf88: */
+                                           RTUNI_ALPHA, /* U+00bf89: */
+                                           RTUNI_ALPHA, /* U+00bf8a: */
+                                           RTUNI_ALPHA, /* U+00bf8b: */
+                                           RTUNI_ALPHA, /* U+00bf8c: */
+                                           RTUNI_ALPHA, /* U+00bf8d: */
+                                           RTUNI_ALPHA, /* U+00bf8e: */
+                                           RTUNI_ALPHA, /* U+00bf8f: */
+                                           RTUNI_ALPHA, /* U+00bf90: */
+                                           RTUNI_ALPHA, /* U+00bf91: */
+                                           RTUNI_ALPHA, /* U+00bf92: */
+                                           RTUNI_ALPHA, /* U+00bf93: */
+                                           RTUNI_ALPHA, /* U+00bf94: */
+                                           RTUNI_ALPHA, /* U+00bf95: */
+                                           RTUNI_ALPHA, /* U+00bf96: */
+                                           RTUNI_ALPHA, /* U+00bf97: */
+                                           RTUNI_ALPHA, /* U+00bf98: */
+                                           RTUNI_ALPHA, /* U+00bf99: */
+                                           RTUNI_ALPHA, /* U+00bf9a: */
+                                           RTUNI_ALPHA, /* U+00bf9b: */
+                                           RTUNI_ALPHA, /* U+00bf9c: */
+                                           RTUNI_ALPHA, /* U+00bf9d: */
+                                           RTUNI_ALPHA, /* U+00bf9e: */
+                                           RTUNI_ALPHA, /* U+00bf9f: */
+                                           RTUNI_ALPHA, /* U+00bfa0: */
+                                           RTUNI_ALPHA, /* U+00bfa1: */
+                                           RTUNI_ALPHA, /* U+00bfa2: */
+                                           RTUNI_ALPHA, /* U+00bfa3: */
+                                           RTUNI_ALPHA, /* U+00bfa4: */
+                                           RTUNI_ALPHA, /* U+00bfa5: */
+                                           RTUNI_ALPHA, /* U+00bfa6: */
+                                           RTUNI_ALPHA, /* U+00bfa7: */
+                                           RTUNI_ALPHA, /* U+00bfa8: */
+                                           RTUNI_ALPHA, /* U+00bfa9: */
+                                           RTUNI_ALPHA, /* U+00bfaa: */
+                                           RTUNI_ALPHA, /* U+00bfab: */
+                                           RTUNI_ALPHA, /* U+00bfac: */
+                                           RTUNI_ALPHA, /* U+00bfad: */
+                                           RTUNI_ALPHA, /* U+00bfae: */
+                                           RTUNI_ALPHA, /* U+00bfaf: */
+                                           RTUNI_ALPHA, /* U+00bfb0: */
+                                           RTUNI_ALPHA, /* U+00bfb1: */
+                                           RTUNI_ALPHA, /* U+00bfb2: */
+                                           RTUNI_ALPHA, /* U+00bfb3: */
+                                           RTUNI_ALPHA, /* U+00bfb4: */
+                                           RTUNI_ALPHA, /* U+00bfb5: */
+                                           RTUNI_ALPHA, /* U+00bfb6: */
+                                           RTUNI_ALPHA, /* U+00bfb7: */
+                                           RTUNI_ALPHA, /* U+00bfb8: */
+                                           RTUNI_ALPHA, /* U+00bfb9: */
+                                           RTUNI_ALPHA, /* U+00bfba: */
+                                           RTUNI_ALPHA, /* U+00bfbb: */
+                                           RTUNI_ALPHA, /* U+00bfbc: */
+                                           RTUNI_ALPHA, /* U+00bfbd: */
+                                           RTUNI_ALPHA, /* U+00bfbe: */
+                                           RTUNI_ALPHA, /* U+00bfbf: */
+                                           RTUNI_ALPHA, /* U+00bfc0: */
+                                           RTUNI_ALPHA, /* U+00bfc1: */
+                                           RTUNI_ALPHA, /* U+00bfc2: */
+                                           RTUNI_ALPHA, /* U+00bfc3: */
+                                           RTUNI_ALPHA, /* U+00bfc4: */
+                                           RTUNI_ALPHA, /* U+00bfc5: */
+                                           RTUNI_ALPHA, /* U+00bfc6: */
+                                           RTUNI_ALPHA, /* U+00bfc7: */
+                                           RTUNI_ALPHA, /* U+00bfc8: */
+                                           RTUNI_ALPHA, /* U+00bfc9: */
+                                           RTUNI_ALPHA, /* U+00bfca: */
+                                           RTUNI_ALPHA, /* U+00bfcb: */
+                                           RTUNI_ALPHA, /* U+00bfcc: */
+                                           RTUNI_ALPHA, /* U+00bfcd: */
+                                           RTUNI_ALPHA, /* U+00bfce: */
+                                           RTUNI_ALPHA, /* U+00bfcf: */
+                                           RTUNI_ALPHA, /* U+00bfd0: */
+                                           RTUNI_ALPHA, /* U+00bfd1: */
+                                           RTUNI_ALPHA, /* U+00bfd2: */
+                                           RTUNI_ALPHA, /* U+00bfd3: */
+                                           RTUNI_ALPHA, /* U+00bfd4: */
+                                           RTUNI_ALPHA, /* U+00bfd5: */
+                                           RTUNI_ALPHA, /* U+00bfd6: */
+                                           RTUNI_ALPHA, /* U+00bfd7: */
+                                           RTUNI_ALPHA, /* U+00bfd8: */
+                                           RTUNI_ALPHA, /* U+00bfd9: */
+                                           RTUNI_ALPHA, /* U+00bfda: */
+                                           RTUNI_ALPHA, /* U+00bfdb: */
+                                           RTUNI_ALPHA, /* U+00bfdc: */
+                                           RTUNI_ALPHA, /* U+00bfdd: */
+                                           RTUNI_ALPHA, /* U+00bfde: */
+                                           RTUNI_ALPHA, /* U+00bfdf: */
+                                           RTUNI_ALPHA, /* U+00bfe0: */
+                                           RTUNI_ALPHA, /* U+00bfe1: */
+                                           RTUNI_ALPHA, /* U+00bfe2: */
+                                           RTUNI_ALPHA, /* U+00bfe3: */
+                                           RTUNI_ALPHA, /* U+00bfe4: */
+                                           RTUNI_ALPHA, /* U+00bfe5: */
+                                           RTUNI_ALPHA, /* U+00bfe6: */
+                                           RTUNI_ALPHA, /* U+00bfe7: */
+                                           RTUNI_ALPHA, /* U+00bfe8: */
+                                           RTUNI_ALPHA, /* U+00bfe9: */
+                                           RTUNI_ALPHA, /* U+00bfea: */
+                                           RTUNI_ALPHA, /* U+00bfeb: */
+                                           RTUNI_ALPHA, /* U+00bfec: */
+                                           RTUNI_ALPHA, /* U+00bfed: */
+                                           RTUNI_ALPHA, /* U+00bfee: */
+                                           RTUNI_ALPHA, /* U+00bfef: */
+                                           RTUNI_ALPHA, /* U+00bff0: */
+                                           RTUNI_ALPHA, /* U+00bff1: */
+                                           RTUNI_ALPHA, /* U+00bff2: */
+                                           RTUNI_ALPHA, /* U+00bff3: */
+                                           RTUNI_ALPHA, /* U+00bff4: */
+                                           RTUNI_ALPHA, /* U+00bff5: */
+                                           RTUNI_ALPHA, /* U+00bff6: */
+                                           RTUNI_ALPHA, /* U+00bff7: */
+                                           RTUNI_ALPHA, /* U+00bff8: */
+                                           RTUNI_ALPHA, /* U+00bff9: */
+                                           RTUNI_ALPHA, /* U+00bffa: */
+                                           RTUNI_ALPHA, /* U+00bffb: */
+                                           RTUNI_ALPHA, /* U+00bffc: */
+                                           RTUNI_ALPHA, /* U+00bffd: */
+                                           RTUNI_ALPHA, /* U+00bffe: */
+                                           RTUNI_ALPHA, /* U+00bfff: */
+                                           RTUNI_ALPHA, /* U+00c000: */
+                                           RTUNI_ALPHA, /* U+00c001: */
+                                           RTUNI_ALPHA, /* U+00c002: */
+                                           RTUNI_ALPHA, /* U+00c003: */
+                                           RTUNI_ALPHA, /* U+00c004: */
+                                           RTUNI_ALPHA, /* U+00c005: */
+                                           RTUNI_ALPHA, /* U+00c006: */
+                                           RTUNI_ALPHA, /* U+00c007: */
+                                           RTUNI_ALPHA, /* U+00c008: */
+                                           RTUNI_ALPHA, /* U+00c009: */
+                                           RTUNI_ALPHA, /* U+00c00a: */
+                                           RTUNI_ALPHA, /* U+00c00b: */
+                                           RTUNI_ALPHA, /* U+00c00c: */
+                                           RTUNI_ALPHA, /* U+00c00d: */
+                                           RTUNI_ALPHA, /* U+00c00e: */
+                                           RTUNI_ALPHA, /* U+00c00f: */
+                                           RTUNI_ALPHA, /* U+00c010: */
+                                           RTUNI_ALPHA, /* U+00c011: */
+                                           RTUNI_ALPHA, /* U+00c012: */
+                                           RTUNI_ALPHA, /* U+00c013: */
+                                           RTUNI_ALPHA, /* U+00c014: */
+                                           RTUNI_ALPHA, /* U+00c015: */
+                                           RTUNI_ALPHA, /* U+00c016: */
+                                           RTUNI_ALPHA, /* U+00c017: */
+                                           RTUNI_ALPHA, /* U+00c018: */
+                                           RTUNI_ALPHA, /* U+00c019: */
+                                           RTUNI_ALPHA, /* U+00c01a: */
+                                           RTUNI_ALPHA, /* U+00c01b: */
+                                           RTUNI_ALPHA, /* U+00c01c: */
+                                           RTUNI_ALPHA, /* U+00c01d: */
+                                           RTUNI_ALPHA, /* U+00c01e: */
+                                           RTUNI_ALPHA, /* U+00c01f: */
+                                           RTUNI_ALPHA, /* U+00c020: */
+                                           RTUNI_ALPHA, /* U+00c021: */
+                                           RTUNI_ALPHA, /* U+00c022: */
+                                           RTUNI_ALPHA, /* U+00c023: */
+                                           RTUNI_ALPHA, /* U+00c024: */
+                                           RTUNI_ALPHA, /* U+00c025: */
+                                           RTUNI_ALPHA, /* U+00c026: */
+                                           RTUNI_ALPHA, /* U+00c027: */
+                                           RTUNI_ALPHA, /* U+00c028: */
+                                           RTUNI_ALPHA, /* U+00c029: */
+                                           RTUNI_ALPHA, /* U+00c02a: */
+                                           RTUNI_ALPHA, /* U+00c02b: */
+                                           RTUNI_ALPHA, /* U+00c02c: */
+                                           RTUNI_ALPHA, /* U+00c02d: */
+                                           RTUNI_ALPHA, /* U+00c02e: */
+                                           RTUNI_ALPHA, /* U+00c02f: */
+                                           RTUNI_ALPHA, /* U+00c030: */
+                                           RTUNI_ALPHA, /* U+00c031: */
+                                           RTUNI_ALPHA, /* U+00c032: */
+                                           RTUNI_ALPHA, /* U+00c033: */
+                                           RTUNI_ALPHA, /* U+00c034: */
+                                           RTUNI_ALPHA, /* U+00c035: */
+                                           RTUNI_ALPHA, /* U+00c036: */
+                                           RTUNI_ALPHA, /* U+00c037: */
+                                           RTUNI_ALPHA, /* U+00c038: */
+                                           RTUNI_ALPHA, /* U+00c039: */
+                                           RTUNI_ALPHA, /* U+00c03a: */
+                                           RTUNI_ALPHA, /* U+00c03b: */
+                                           RTUNI_ALPHA, /* U+00c03c: */
+                                           RTUNI_ALPHA, /* U+00c03d: */
+                                           RTUNI_ALPHA, /* U+00c03e: */
+                                           RTUNI_ALPHA, /* U+00c03f: */
+                                           RTUNI_ALPHA, /* U+00c040: */
+                                           RTUNI_ALPHA, /* U+00c041: */
+                                           RTUNI_ALPHA, /* U+00c042: */
+                                           RTUNI_ALPHA, /* U+00c043: */
+                                           RTUNI_ALPHA, /* U+00c044: */
+                                           RTUNI_ALPHA, /* U+00c045: */
+                                           RTUNI_ALPHA, /* U+00c046: */
+                                           RTUNI_ALPHA, /* U+00c047: */
+                                           RTUNI_ALPHA, /* U+00c048: */
+                                           RTUNI_ALPHA, /* U+00c049: */
+                                           RTUNI_ALPHA, /* U+00c04a: */
+                                           RTUNI_ALPHA, /* U+00c04b: */
+                                           RTUNI_ALPHA, /* U+00c04c: */
+                                           RTUNI_ALPHA, /* U+00c04d: */
+                                           RTUNI_ALPHA, /* U+00c04e: */
+                                           RTUNI_ALPHA, /* U+00c04f: */
+                                           RTUNI_ALPHA, /* U+00c050: */
+                                           RTUNI_ALPHA, /* U+00c051: */
+                                           RTUNI_ALPHA, /* U+00c052: */
+                                           RTUNI_ALPHA, /* U+00c053: */
+                                           RTUNI_ALPHA, /* U+00c054: */
+                                           RTUNI_ALPHA, /* U+00c055: */
+                                           RTUNI_ALPHA, /* U+00c056: */
+                                           RTUNI_ALPHA, /* U+00c057: */
+                                           RTUNI_ALPHA, /* U+00c058: */
+                                           RTUNI_ALPHA, /* U+00c059: */
+                                           RTUNI_ALPHA, /* U+00c05a: */
+                                           RTUNI_ALPHA, /* U+00c05b: */
+                                           RTUNI_ALPHA, /* U+00c05c: */
+                                           RTUNI_ALPHA, /* U+00c05d: */
+                                           RTUNI_ALPHA, /* U+00c05e: */
+                                           RTUNI_ALPHA, /* U+00c05f: */
+                                           RTUNI_ALPHA, /* U+00c060: */
+                                           RTUNI_ALPHA, /* U+00c061: */
+                                           RTUNI_ALPHA, /* U+00c062: */
+                                           RTUNI_ALPHA, /* U+00c063: */
+                                           RTUNI_ALPHA, /* U+00c064: */
+                                           RTUNI_ALPHA, /* U+00c065: */
+                                           RTUNI_ALPHA, /* U+00c066: */
+                                           RTUNI_ALPHA, /* U+00c067: */
+                                           RTUNI_ALPHA, /* U+00c068: */
+                                           RTUNI_ALPHA, /* U+00c069: */
+                                           RTUNI_ALPHA, /* U+00c06a: */
+                                           RTUNI_ALPHA, /* U+00c06b: */
+                                           RTUNI_ALPHA, /* U+00c06c: */
+                                           RTUNI_ALPHA, /* U+00c06d: */
+                                           RTUNI_ALPHA, /* U+00c06e: */
+                                           RTUNI_ALPHA, /* U+00c06f: */
+                                           RTUNI_ALPHA, /* U+00c070: */
+                                           RTUNI_ALPHA, /* U+00c071: */
+                                           RTUNI_ALPHA, /* U+00c072: */
+                                           RTUNI_ALPHA, /* U+00c073: */
+                                           RTUNI_ALPHA, /* U+00c074: */
+                                           RTUNI_ALPHA, /* U+00c075: */
+                                           RTUNI_ALPHA, /* U+00c076: */
+                                           RTUNI_ALPHA, /* U+00c077: */
+                                           RTUNI_ALPHA, /* U+00c078: */
+                                           RTUNI_ALPHA, /* U+00c079: */
+                                           RTUNI_ALPHA, /* U+00c07a: */
+                                           RTUNI_ALPHA, /* U+00c07b: */
+                                           RTUNI_ALPHA, /* U+00c07c: */
+                                           RTUNI_ALPHA, /* U+00c07d: */
+                                           RTUNI_ALPHA, /* U+00c07e: */
+                                           RTUNI_ALPHA, /* U+00c07f: */
+                                           RTUNI_ALPHA, /* U+00c080: */
+                                           RTUNI_ALPHA, /* U+00c081: */
+                                           RTUNI_ALPHA, /* U+00c082: */
+                                           RTUNI_ALPHA, /* U+00c083: */
+                                           RTUNI_ALPHA, /* U+00c084: */
+                                           RTUNI_ALPHA, /* U+00c085: */
+                                           RTUNI_ALPHA, /* U+00c086: */
+                                           RTUNI_ALPHA, /* U+00c087: */
+                                           RTUNI_ALPHA, /* U+00c088: */
+                                           RTUNI_ALPHA, /* U+00c089: */
+                                           RTUNI_ALPHA, /* U+00c08a: */
+                                           RTUNI_ALPHA, /* U+00c08b: */
+                                           RTUNI_ALPHA, /* U+00c08c: */
+                                           RTUNI_ALPHA, /* U+00c08d: */
+                                           RTUNI_ALPHA, /* U+00c08e: */
+                                           RTUNI_ALPHA, /* U+00c08f: */
+                                           RTUNI_ALPHA, /* U+00c090: */
+                                           RTUNI_ALPHA, /* U+00c091: */
+                                           RTUNI_ALPHA, /* U+00c092: */
+                                           RTUNI_ALPHA, /* U+00c093: */
+                                           RTUNI_ALPHA, /* U+00c094: */
+                                           RTUNI_ALPHA, /* U+00c095: */
+                                           RTUNI_ALPHA, /* U+00c096: */
+                                           RTUNI_ALPHA, /* U+00c097: */
+                                           RTUNI_ALPHA, /* U+00c098: */
+                                           RTUNI_ALPHA, /* U+00c099: */
+                                           RTUNI_ALPHA, /* U+00c09a: */
+                                           RTUNI_ALPHA, /* U+00c09b: */
+                                           RTUNI_ALPHA, /* U+00c09c: */
+                                           RTUNI_ALPHA, /* U+00c09d: */
+                                           RTUNI_ALPHA, /* U+00c09e: */
+                                           RTUNI_ALPHA, /* U+00c09f: */
+                                           RTUNI_ALPHA, /* U+00c0a0: */
+                                           RTUNI_ALPHA, /* U+00c0a1: */
+                                           RTUNI_ALPHA, /* U+00c0a2: */
+                                           RTUNI_ALPHA, /* U+00c0a3: */
+                                           RTUNI_ALPHA, /* U+00c0a4: */
+                                           RTUNI_ALPHA, /* U+00c0a5: */
+                                           RTUNI_ALPHA, /* U+00c0a6: */
+                                           RTUNI_ALPHA, /* U+00c0a7: */
+                                           RTUNI_ALPHA, /* U+00c0a8: */
+                                           RTUNI_ALPHA, /* U+00c0a9: */
+                                           RTUNI_ALPHA, /* U+00c0aa: */
+                                           RTUNI_ALPHA, /* U+00c0ab: */
+                                           RTUNI_ALPHA, /* U+00c0ac: */
+                                           RTUNI_ALPHA, /* U+00c0ad: */
+                                           RTUNI_ALPHA, /* U+00c0ae: */
+                                           RTUNI_ALPHA, /* U+00c0af: */
+                                           RTUNI_ALPHA, /* U+00c0b0: */
+                                           RTUNI_ALPHA, /* U+00c0b1: */
+                                           RTUNI_ALPHA, /* U+00c0b2: */
+                                           RTUNI_ALPHA, /* U+00c0b3: */
+                                           RTUNI_ALPHA, /* U+00c0b4: */
+                                           RTUNI_ALPHA, /* U+00c0b5: */
+                                           RTUNI_ALPHA, /* U+00c0b6: */
+                                           RTUNI_ALPHA, /* U+00c0b7: */
+                                           RTUNI_ALPHA, /* U+00c0b8: */
+                                           RTUNI_ALPHA, /* U+00c0b9: */
+                                           RTUNI_ALPHA, /* U+00c0ba: */
+                                           RTUNI_ALPHA, /* U+00c0bb: */
+                                           RTUNI_ALPHA, /* U+00c0bc: */
+                                           RTUNI_ALPHA, /* U+00c0bd: */
+                                           RTUNI_ALPHA, /* U+00c0be: */
+                                           RTUNI_ALPHA, /* U+00c0bf: */
+                                           RTUNI_ALPHA, /* U+00c0c0: */
+                                           RTUNI_ALPHA, /* U+00c0c1: */
+                                           RTUNI_ALPHA, /* U+00c0c2: */
+                                           RTUNI_ALPHA, /* U+00c0c3: */
+                                           RTUNI_ALPHA, /* U+00c0c4: */
+                                           RTUNI_ALPHA, /* U+00c0c5: */
+                                           RTUNI_ALPHA, /* U+00c0c6: */
+                                           RTUNI_ALPHA, /* U+00c0c7: */
+                                           RTUNI_ALPHA, /* U+00c0c8: */
+                                           RTUNI_ALPHA, /* U+00c0c9: */
+                                           RTUNI_ALPHA, /* U+00c0ca: */
+                                           RTUNI_ALPHA, /* U+00c0cb: */
+                                           RTUNI_ALPHA, /* U+00c0cc: */
+                                           RTUNI_ALPHA, /* U+00c0cd: */
+                                           RTUNI_ALPHA, /* U+00c0ce: */
+                                           RTUNI_ALPHA, /* U+00c0cf: */
+                                           RTUNI_ALPHA, /* U+00c0d0: */
+                                           RTUNI_ALPHA, /* U+00c0d1: */
+                                           RTUNI_ALPHA, /* U+00c0d2: */
+                                           RTUNI_ALPHA, /* U+00c0d3: */
+                                           RTUNI_ALPHA, /* U+00c0d4: */
+                                           RTUNI_ALPHA, /* U+00c0d5: */
+                                           RTUNI_ALPHA, /* U+00c0d6: */
+                                           RTUNI_ALPHA, /* U+00c0d7: */
+                                           RTUNI_ALPHA, /* U+00c0d8: */
+                                           RTUNI_ALPHA, /* U+00c0d9: */
+                                           RTUNI_ALPHA, /* U+00c0da: */
+                                           RTUNI_ALPHA, /* U+00c0db: */
+                                           RTUNI_ALPHA, /* U+00c0dc: */
+                                           RTUNI_ALPHA, /* U+00c0dd: */
+                                           RTUNI_ALPHA, /* U+00c0de: */
+                                           RTUNI_ALPHA, /* U+00c0df: */
+                                           RTUNI_ALPHA, /* U+00c0e0: */
+                                           RTUNI_ALPHA, /* U+00c0e1: */
+                                           RTUNI_ALPHA, /* U+00c0e2: */
+                                           RTUNI_ALPHA, /* U+00c0e3: */
+                                           RTUNI_ALPHA, /* U+00c0e4: */
+                                           RTUNI_ALPHA, /* U+00c0e5: */
+                                           RTUNI_ALPHA, /* U+00c0e6: */
+                                           RTUNI_ALPHA, /* U+00c0e7: */
+                                           RTUNI_ALPHA, /* U+00c0e8: */
+                                           RTUNI_ALPHA, /* U+00c0e9: */
+                                           RTUNI_ALPHA, /* U+00c0ea: */
+                                           RTUNI_ALPHA, /* U+00c0eb: */
+                                           RTUNI_ALPHA, /* U+00c0ec: */
+                                           RTUNI_ALPHA, /* U+00c0ed: */
+                                           RTUNI_ALPHA, /* U+00c0ee: */
+                                           RTUNI_ALPHA, /* U+00c0ef: */
+                                           RTUNI_ALPHA, /* U+00c0f0: */
+                                           RTUNI_ALPHA, /* U+00c0f1: */
+                                           RTUNI_ALPHA, /* U+00c0f2: */
+                                           RTUNI_ALPHA, /* U+00c0f3: */
+                                           RTUNI_ALPHA, /* U+00c0f4: */
+                                           RTUNI_ALPHA, /* U+00c0f5: */
+                                           RTUNI_ALPHA, /* U+00c0f6: */
+                                           RTUNI_ALPHA, /* U+00c0f7: */
+                                           RTUNI_ALPHA, /* U+00c0f8: */
+                                           RTUNI_ALPHA, /* U+00c0f9: */
+                                           RTUNI_ALPHA, /* U+00c0fa: */
+                                           RTUNI_ALPHA, /* U+00c0fb: */
+                                           RTUNI_ALPHA, /* U+00c0fc: */
+                                           RTUNI_ALPHA, /* U+00c0fd: */
+                                           RTUNI_ALPHA, /* U+00c0fe: */
+                                           RTUNI_ALPHA, /* U+00c0ff: */
+                                           RTUNI_ALPHA, /* U+00c100: */
+                                           RTUNI_ALPHA, /* U+00c101: */
+                                           RTUNI_ALPHA, /* U+00c102: */
+                                           RTUNI_ALPHA, /* U+00c103: */
+                                           RTUNI_ALPHA, /* U+00c104: */
+                                           RTUNI_ALPHA, /* U+00c105: */
+                                           RTUNI_ALPHA, /* U+00c106: */
+                                           RTUNI_ALPHA, /* U+00c107: */
+                                           RTUNI_ALPHA, /* U+00c108: */
+                                           RTUNI_ALPHA, /* U+00c109: */
+                                           RTUNI_ALPHA, /* U+00c10a: */
+                                           RTUNI_ALPHA, /* U+00c10b: */
+                                           RTUNI_ALPHA, /* U+00c10c: */
+                                           RTUNI_ALPHA, /* U+00c10d: */
+                                           RTUNI_ALPHA, /* U+00c10e: */
+                                           RTUNI_ALPHA, /* U+00c10f: */
+                                           RTUNI_ALPHA, /* U+00c110: */
+                                           RTUNI_ALPHA, /* U+00c111: */
+                                           RTUNI_ALPHA, /* U+00c112: */
+                                           RTUNI_ALPHA, /* U+00c113: */
+                                           RTUNI_ALPHA, /* U+00c114: */
+                                           RTUNI_ALPHA, /* U+00c115: */
+                                           RTUNI_ALPHA, /* U+00c116: */
+                                           RTUNI_ALPHA, /* U+00c117: */
+                                           RTUNI_ALPHA, /* U+00c118: */
+                                           RTUNI_ALPHA, /* U+00c119: */
+                                           RTUNI_ALPHA, /* U+00c11a: */
+                                           RTUNI_ALPHA, /* U+00c11b: */
+                                           RTUNI_ALPHA, /* U+00c11c: */
+                                           RTUNI_ALPHA, /* U+00c11d: */
+                                           RTUNI_ALPHA, /* U+00c11e: */
+                                           RTUNI_ALPHA, /* U+00c11f: */
+                                           RTUNI_ALPHA, /* U+00c120: */
+                                           RTUNI_ALPHA, /* U+00c121: */
+                                           RTUNI_ALPHA, /* U+00c122: */
+                                           RTUNI_ALPHA, /* U+00c123: */
+                                           RTUNI_ALPHA, /* U+00c124: */
+                                           RTUNI_ALPHA, /* U+00c125: */
+                                           RTUNI_ALPHA, /* U+00c126: */
+                                           RTUNI_ALPHA, /* U+00c127: */
+                                           RTUNI_ALPHA, /* U+00c128: */
+                                           RTUNI_ALPHA, /* U+00c129: */
+                                           RTUNI_ALPHA, /* U+00c12a: */
+                                           RTUNI_ALPHA, /* U+00c12b: */
+                                           RTUNI_ALPHA, /* U+00c12c: */
+                                           RTUNI_ALPHA, /* U+00c12d: */
+                                           RTUNI_ALPHA, /* U+00c12e: */
+                                           RTUNI_ALPHA, /* U+00c12f: */
+                                           RTUNI_ALPHA, /* U+00c130: */
+                                           RTUNI_ALPHA, /* U+00c131: */
+                                           RTUNI_ALPHA, /* U+00c132: */
+                                           RTUNI_ALPHA, /* U+00c133: */
+                                           RTUNI_ALPHA, /* U+00c134: */
+                                           RTUNI_ALPHA, /* U+00c135: */
+                                           RTUNI_ALPHA, /* U+00c136: */
+                                           RTUNI_ALPHA, /* U+00c137: */
+                                           RTUNI_ALPHA, /* U+00c138: */
+                                           RTUNI_ALPHA, /* U+00c139: */
+                                           RTUNI_ALPHA, /* U+00c13a: */
+                                           RTUNI_ALPHA, /* U+00c13b: */
+                                           RTUNI_ALPHA, /* U+00c13c: */
+                                           RTUNI_ALPHA, /* U+00c13d: */
+                                           RTUNI_ALPHA, /* U+00c13e: */
+                                           RTUNI_ALPHA, /* U+00c13f: */
+                                           RTUNI_ALPHA, /* U+00c140: */
+                                           RTUNI_ALPHA, /* U+00c141: */
+                                           RTUNI_ALPHA, /* U+00c142: */
+                                           RTUNI_ALPHA, /* U+00c143: */
+                                           RTUNI_ALPHA, /* U+00c144: */
+                                           RTUNI_ALPHA, /* U+00c145: */
+                                           RTUNI_ALPHA, /* U+00c146: */
+                                           RTUNI_ALPHA, /* U+00c147: */
+                                           RTUNI_ALPHA, /* U+00c148: */
+                                           RTUNI_ALPHA, /* U+00c149: */
+                                           RTUNI_ALPHA, /* U+00c14a: */
+                                           RTUNI_ALPHA, /* U+00c14b: */
+                                           RTUNI_ALPHA, /* U+00c14c: */
+                                           RTUNI_ALPHA, /* U+00c14d: */
+                                           RTUNI_ALPHA, /* U+00c14e: */
+                                           RTUNI_ALPHA, /* U+00c14f: */
+                                           RTUNI_ALPHA, /* U+00c150: */
+                                           RTUNI_ALPHA, /* U+00c151: */
+                                           RTUNI_ALPHA, /* U+00c152: */
+                                           RTUNI_ALPHA, /* U+00c153: */
+                                           RTUNI_ALPHA, /* U+00c154: */
+                                           RTUNI_ALPHA, /* U+00c155: */
+                                           RTUNI_ALPHA, /* U+00c156: */
+                                           RTUNI_ALPHA, /* U+00c157: */
+                                           RTUNI_ALPHA, /* U+00c158: */
+                                           RTUNI_ALPHA, /* U+00c159: */
+                                           RTUNI_ALPHA, /* U+00c15a: */
+                                           RTUNI_ALPHA, /* U+00c15b: */
+                                           RTUNI_ALPHA, /* U+00c15c: */
+                                           RTUNI_ALPHA, /* U+00c15d: */
+                                           RTUNI_ALPHA, /* U+00c15e: */
+                                           RTUNI_ALPHA, /* U+00c15f: */
+                                           RTUNI_ALPHA, /* U+00c160: */
+                                           RTUNI_ALPHA, /* U+00c161: */
+                                           RTUNI_ALPHA, /* U+00c162: */
+                                           RTUNI_ALPHA, /* U+00c163: */
+                                           RTUNI_ALPHA, /* U+00c164: */
+                                           RTUNI_ALPHA, /* U+00c165: */
+                                           RTUNI_ALPHA, /* U+00c166: */
+                                           RTUNI_ALPHA, /* U+00c167: */
+                                           RTUNI_ALPHA, /* U+00c168: */
+                                           RTUNI_ALPHA, /* U+00c169: */
+                                           RTUNI_ALPHA, /* U+00c16a: */
+                                           RTUNI_ALPHA, /* U+00c16b: */
+                                           RTUNI_ALPHA, /* U+00c16c: */
+                                           RTUNI_ALPHA, /* U+00c16d: */
+                                           RTUNI_ALPHA, /* U+00c16e: */
+                                           RTUNI_ALPHA, /* U+00c16f: */
+                                           RTUNI_ALPHA, /* U+00c170: */
+                                           RTUNI_ALPHA, /* U+00c171: */
+                                           RTUNI_ALPHA, /* U+00c172: */
+                                           RTUNI_ALPHA, /* U+00c173: */
+                                           RTUNI_ALPHA, /* U+00c174: */
+                                           RTUNI_ALPHA, /* U+00c175: */
+                                           RTUNI_ALPHA, /* U+00c176: */
+                                           RTUNI_ALPHA, /* U+00c177: */
+                                           RTUNI_ALPHA, /* U+00c178: */
+                                           RTUNI_ALPHA, /* U+00c179: */
+                                           RTUNI_ALPHA, /* U+00c17a: */
+                                           RTUNI_ALPHA, /* U+00c17b: */
+                                           RTUNI_ALPHA, /* U+00c17c: */
+                                           RTUNI_ALPHA, /* U+00c17d: */
+                                           RTUNI_ALPHA, /* U+00c17e: */
+                                           RTUNI_ALPHA, /* U+00c17f: */
+                                           RTUNI_ALPHA, /* U+00c180: */
+                                           RTUNI_ALPHA, /* U+00c181: */
+                                           RTUNI_ALPHA, /* U+00c182: */
+                                           RTUNI_ALPHA, /* U+00c183: */
+                                           RTUNI_ALPHA, /* U+00c184: */
+                                           RTUNI_ALPHA, /* U+00c185: */
+                                           RTUNI_ALPHA, /* U+00c186: */
+                                           RTUNI_ALPHA, /* U+00c187: */
+                                           RTUNI_ALPHA, /* U+00c188: */
+                                           RTUNI_ALPHA, /* U+00c189: */
+                                           RTUNI_ALPHA, /* U+00c18a: */
+                                           RTUNI_ALPHA, /* U+00c18b: */
+                                           RTUNI_ALPHA, /* U+00c18c: */
+                                           RTUNI_ALPHA, /* U+00c18d: */
+                                           RTUNI_ALPHA, /* U+00c18e: */
+                                           RTUNI_ALPHA, /* U+00c18f: */
+                                           RTUNI_ALPHA, /* U+00c190: */
+                                           RTUNI_ALPHA, /* U+00c191: */
+                                           RTUNI_ALPHA, /* U+00c192: */
+                                           RTUNI_ALPHA, /* U+00c193: */
+                                           RTUNI_ALPHA, /* U+00c194: */
+                                           RTUNI_ALPHA, /* U+00c195: */
+                                           RTUNI_ALPHA, /* U+00c196: */
+                                           RTUNI_ALPHA, /* U+00c197: */
+                                           RTUNI_ALPHA, /* U+00c198: */
+                                           RTUNI_ALPHA, /* U+00c199: */
+                                           RTUNI_ALPHA, /* U+00c19a: */
+                                           RTUNI_ALPHA, /* U+00c19b: */
+                                           RTUNI_ALPHA, /* U+00c19c: */
+                                           RTUNI_ALPHA, /* U+00c19d: */
+                                           RTUNI_ALPHA, /* U+00c19e: */
+                                           RTUNI_ALPHA, /* U+00c19f: */
+                                           RTUNI_ALPHA, /* U+00c1a0: */
+                                           RTUNI_ALPHA, /* U+00c1a1: */
+                                           RTUNI_ALPHA, /* U+00c1a2: */
+                                           RTUNI_ALPHA, /* U+00c1a3: */
+                                           RTUNI_ALPHA, /* U+00c1a4: */
+                                           RTUNI_ALPHA, /* U+00c1a5: */
+                                           RTUNI_ALPHA, /* U+00c1a6: */
+                                           RTUNI_ALPHA, /* U+00c1a7: */
+                                           RTUNI_ALPHA, /* U+00c1a8: */
+                                           RTUNI_ALPHA, /* U+00c1a9: */
+                                           RTUNI_ALPHA, /* U+00c1aa: */
+                                           RTUNI_ALPHA, /* U+00c1ab: */
+                                           RTUNI_ALPHA, /* U+00c1ac: */
+                                           RTUNI_ALPHA, /* U+00c1ad: */
+                                           RTUNI_ALPHA, /* U+00c1ae: */
+                                           RTUNI_ALPHA, /* U+00c1af: */
+                                           RTUNI_ALPHA, /* U+00c1b0: */
+                                           RTUNI_ALPHA, /* U+00c1b1: */
+                                           RTUNI_ALPHA, /* U+00c1b2: */
+                                           RTUNI_ALPHA, /* U+00c1b3: */
+                                           RTUNI_ALPHA, /* U+00c1b4: */
+                                           RTUNI_ALPHA, /* U+00c1b5: */
+                                           RTUNI_ALPHA, /* U+00c1b6: */
+                                           RTUNI_ALPHA, /* U+00c1b7: */
+                                           RTUNI_ALPHA, /* U+00c1b8: */
+                                           RTUNI_ALPHA, /* U+00c1b9: */
+                                           RTUNI_ALPHA, /* U+00c1ba: */
+                                           RTUNI_ALPHA, /* U+00c1bb: */
+                                           RTUNI_ALPHA, /* U+00c1bc: */
+                                           RTUNI_ALPHA, /* U+00c1bd: */
+                                           RTUNI_ALPHA, /* U+00c1be: */
+                                           RTUNI_ALPHA, /* U+00c1bf: */
+                                           RTUNI_ALPHA, /* U+00c1c0: */
+                                           RTUNI_ALPHA, /* U+00c1c1: */
+                                           RTUNI_ALPHA, /* U+00c1c2: */
+                                           RTUNI_ALPHA, /* U+00c1c3: */
+                                           RTUNI_ALPHA, /* U+00c1c4: */
+                                           RTUNI_ALPHA, /* U+00c1c5: */
+                                           RTUNI_ALPHA, /* U+00c1c6: */
+                                           RTUNI_ALPHA, /* U+00c1c7: */
+                                           RTUNI_ALPHA, /* U+00c1c8: */
+                                           RTUNI_ALPHA, /* U+00c1c9: */
+                                           RTUNI_ALPHA, /* U+00c1ca: */
+                                           RTUNI_ALPHA, /* U+00c1cb: */
+                                           RTUNI_ALPHA, /* U+00c1cc: */
+                                           RTUNI_ALPHA, /* U+00c1cd: */
+                                           RTUNI_ALPHA, /* U+00c1ce: */
+                                           RTUNI_ALPHA, /* U+00c1cf: */
+                                           RTUNI_ALPHA, /* U+00c1d0: */
+                                           RTUNI_ALPHA, /* U+00c1d1: */
+                                           RTUNI_ALPHA, /* U+00c1d2: */
+                                           RTUNI_ALPHA, /* U+00c1d3: */
+                                           RTUNI_ALPHA, /* U+00c1d4: */
+                                           RTUNI_ALPHA, /* U+00c1d5: */
+                                           RTUNI_ALPHA, /* U+00c1d6: */
+                                           RTUNI_ALPHA, /* U+00c1d7: */
+                                           RTUNI_ALPHA, /* U+00c1d8: */
+                                           RTUNI_ALPHA, /* U+00c1d9: */
+                                           RTUNI_ALPHA, /* U+00c1da: */
+                                           RTUNI_ALPHA, /* U+00c1db: */
+                                           RTUNI_ALPHA, /* U+00c1dc: */
+                                           RTUNI_ALPHA, /* U+00c1dd: */
+                                           RTUNI_ALPHA, /* U+00c1de: */
+                                           RTUNI_ALPHA, /* U+00c1df: */
+                                           RTUNI_ALPHA, /* U+00c1e0: */
+                                           RTUNI_ALPHA, /* U+00c1e1: */
+                                           RTUNI_ALPHA, /* U+00c1e2: */
+                                           RTUNI_ALPHA, /* U+00c1e3: */
+                                           RTUNI_ALPHA, /* U+00c1e4: */
+                                           RTUNI_ALPHA, /* U+00c1e5: */
+                                           RTUNI_ALPHA, /* U+00c1e6: */
+                                           RTUNI_ALPHA, /* U+00c1e7: */
+                                           RTUNI_ALPHA, /* U+00c1e8: */
+                                           RTUNI_ALPHA, /* U+00c1e9: */
+                                           RTUNI_ALPHA, /* U+00c1ea: */
+                                           RTUNI_ALPHA, /* U+00c1eb: */
+                                           RTUNI_ALPHA, /* U+00c1ec: */
+                                           RTUNI_ALPHA, /* U+00c1ed: */
+                                           RTUNI_ALPHA, /* U+00c1ee: */
+                                           RTUNI_ALPHA, /* U+00c1ef: */
+                                           RTUNI_ALPHA, /* U+00c1f0: */
+                                           RTUNI_ALPHA, /* U+00c1f1: */
+                                           RTUNI_ALPHA, /* U+00c1f2: */
+                                           RTUNI_ALPHA, /* U+00c1f3: */
+                                           RTUNI_ALPHA, /* U+00c1f4: */
+                                           RTUNI_ALPHA, /* U+00c1f5: */
+                                           RTUNI_ALPHA, /* U+00c1f6: */
+                                           RTUNI_ALPHA, /* U+00c1f7: */
+                                           RTUNI_ALPHA, /* U+00c1f8: */
+                                           RTUNI_ALPHA, /* U+00c1f9: */
+                                           RTUNI_ALPHA, /* U+00c1fa: */
+                                           RTUNI_ALPHA, /* U+00c1fb: */
+                                           RTUNI_ALPHA, /* U+00c1fc: */
+                                           RTUNI_ALPHA, /* U+00c1fd: */
+                                           RTUNI_ALPHA, /* U+00c1fe: */
+                                           RTUNI_ALPHA, /* U+00c1ff: */
+                                           RTUNI_ALPHA, /* U+00c200: */
+                                           RTUNI_ALPHA, /* U+00c201: */
+                                           RTUNI_ALPHA, /* U+00c202: */
+                                           RTUNI_ALPHA, /* U+00c203: */
+                                           RTUNI_ALPHA, /* U+00c204: */
+                                           RTUNI_ALPHA, /* U+00c205: */
+                                           RTUNI_ALPHA, /* U+00c206: */
+                                           RTUNI_ALPHA, /* U+00c207: */
+                                           RTUNI_ALPHA, /* U+00c208: */
+                                           RTUNI_ALPHA, /* U+00c209: */
+                                           RTUNI_ALPHA, /* U+00c20a: */
+                                           RTUNI_ALPHA, /* U+00c20b: */
+                                           RTUNI_ALPHA, /* U+00c20c: */
+                                           RTUNI_ALPHA, /* U+00c20d: */
+                                           RTUNI_ALPHA, /* U+00c20e: */
+                                           RTUNI_ALPHA, /* U+00c20f: */
+                                           RTUNI_ALPHA, /* U+00c210: */
+                                           RTUNI_ALPHA, /* U+00c211: */
+                                           RTUNI_ALPHA, /* U+00c212: */
+                                           RTUNI_ALPHA, /* U+00c213: */
+                                           RTUNI_ALPHA, /* U+00c214: */
+                                           RTUNI_ALPHA, /* U+00c215: */
+                                           RTUNI_ALPHA, /* U+00c216: */
+                                           RTUNI_ALPHA, /* U+00c217: */
+                                           RTUNI_ALPHA, /* U+00c218: */
+                                           RTUNI_ALPHA, /* U+00c219: */
+                                           RTUNI_ALPHA, /* U+00c21a: */
+                                           RTUNI_ALPHA, /* U+00c21b: */
+                                           RTUNI_ALPHA, /* U+00c21c: */
+                                           RTUNI_ALPHA, /* U+00c21d: */
+                                           RTUNI_ALPHA, /* U+00c21e: */
+                                           RTUNI_ALPHA, /* U+00c21f: */
+                                           RTUNI_ALPHA, /* U+00c220: */
+                                           RTUNI_ALPHA, /* U+00c221: */
+                                           RTUNI_ALPHA, /* U+00c222: */
+                                           RTUNI_ALPHA, /* U+00c223: */
+                                           RTUNI_ALPHA, /* U+00c224: */
+                                           RTUNI_ALPHA, /* U+00c225: */
+                                           RTUNI_ALPHA, /* U+00c226: */
+                                           RTUNI_ALPHA, /* U+00c227: */
+                                           RTUNI_ALPHA, /* U+00c228: */
+                                           RTUNI_ALPHA, /* U+00c229: */
+                                           RTUNI_ALPHA, /* U+00c22a: */
+                                           RTUNI_ALPHA, /* U+00c22b: */
+                                           RTUNI_ALPHA, /* U+00c22c: */
+                                           RTUNI_ALPHA, /* U+00c22d: */
+                                           RTUNI_ALPHA, /* U+00c22e: */
+                                           RTUNI_ALPHA, /* U+00c22f: */
+                                           RTUNI_ALPHA, /* U+00c230: */
+                                           RTUNI_ALPHA, /* U+00c231: */
+                                           RTUNI_ALPHA, /* U+00c232: */
+                                           RTUNI_ALPHA, /* U+00c233: */
+                                           RTUNI_ALPHA, /* U+00c234: */
+                                           RTUNI_ALPHA, /* U+00c235: */
+                                           RTUNI_ALPHA, /* U+00c236: */
+                                           RTUNI_ALPHA, /* U+00c237: */
+                                           RTUNI_ALPHA, /* U+00c238: */
+                                           RTUNI_ALPHA, /* U+00c239: */
+                                           RTUNI_ALPHA, /* U+00c23a: */
+                                           RTUNI_ALPHA, /* U+00c23b: */
+                                           RTUNI_ALPHA, /* U+00c23c: */
+                                           RTUNI_ALPHA, /* U+00c23d: */
+                                           RTUNI_ALPHA, /* U+00c23e: */
+                                           RTUNI_ALPHA, /* U+00c23f: */
+                                           RTUNI_ALPHA, /* U+00c240: */
+                                           RTUNI_ALPHA, /* U+00c241: */
+                                           RTUNI_ALPHA, /* U+00c242: */
+                                           RTUNI_ALPHA, /* U+00c243: */
+                                           RTUNI_ALPHA, /* U+00c244: */
+                                           RTUNI_ALPHA, /* U+00c245: */
+                                           RTUNI_ALPHA, /* U+00c246: */
+                                           RTUNI_ALPHA, /* U+00c247: */
+                                           RTUNI_ALPHA, /* U+00c248: */
+                                           RTUNI_ALPHA, /* U+00c249: */
+                                           RTUNI_ALPHA, /* U+00c24a: */
+                                           RTUNI_ALPHA, /* U+00c24b: */
+                                           RTUNI_ALPHA, /* U+00c24c: */
+                                           RTUNI_ALPHA, /* U+00c24d: */
+                                           RTUNI_ALPHA, /* U+00c24e: */
+                                           RTUNI_ALPHA, /* U+00c24f: */
+                                           RTUNI_ALPHA, /* U+00c250: */
+                                           RTUNI_ALPHA, /* U+00c251: */
+                                           RTUNI_ALPHA, /* U+00c252: */
+                                           RTUNI_ALPHA, /* U+00c253: */
+                                           RTUNI_ALPHA, /* U+00c254: */
+                                           RTUNI_ALPHA, /* U+00c255: */
+                                           RTUNI_ALPHA, /* U+00c256: */
+                                           RTUNI_ALPHA, /* U+00c257: */
+                                           RTUNI_ALPHA, /* U+00c258: */
+                                           RTUNI_ALPHA, /* U+00c259: */
+                                           RTUNI_ALPHA, /* U+00c25a: */
+                                           RTUNI_ALPHA, /* U+00c25b: */
+                                           RTUNI_ALPHA, /* U+00c25c: */
+                                           RTUNI_ALPHA, /* U+00c25d: */
+                                           RTUNI_ALPHA, /* U+00c25e: */
+                                           RTUNI_ALPHA, /* U+00c25f: */
+                                           RTUNI_ALPHA, /* U+00c260: */
+                                           RTUNI_ALPHA, /* U+00c261: */
+                                           RTUNI_ALPHA, /* U+00c262: */
+                                           RTUNI_ALPHA, /* U+00c263: */
+                                           RTUNI_ALPHA, /* U+00c264: */
+                                           RTUNI_ALPHA, /* U+00c265: */
+                                           RTUNI_ALPHA, /* U+00c266: */
+                                           RTUNI_ALPHA, /* U+00c267: */
+                                           RTUNI_ALPHA, /* U+00c268: */
+                                           RTUNI_ALPHA, /* U+00c269: */
+                                           RTUNI_ALPHA, /* U+00c26a: */
+                                           RTUNI_ALPHA, /* U+00c26b: */
+                                           RTUNI_ALPHA, /* U+00c26c: */
+                                           RTUNI_ALPHA, /* U+00c26d: */
+                                           RTUNI_ALPHA, /* U+00c26e: */
+                                           RTUNI_ALPHA, /* U+00c26f: */
+                                           RTUNI_ALPHA, /* U+00c270: */
+                                           RTUNI_ALPHA, /* U+00c271: */
+                                           RTUNI_ALPHA, /* U+00c272: */
+                                           RTUNI_ALPHA, /* U+00c273: */
+                                           RTUNI_ALPHA, /* U+00c274: */
+                                           RTUNI_ALPHA, /* U+00c275: */
+                                           RTUNI_ALPHA, /* U+00c276: */
+                                           RTUNI_ALPHA, /* U+00c277: */
+                                           RTUNI_ALPHA, /* U+00c278: */
+                                           RTUNI_ALPHA, /* U+00c279: */
+                                           RTUNI_ALPHA, /* U+00c27a: */
+                                           RTUNI_ALPHA, /* U+00c27b: */
+                                           RTUNI_ALPHA, /* U+00c27c: */
+                                           RTUNI_ALPHA, /* U+00c27d: */
+                                           RTUNI_ALPHA, /* U+00c27e: */
+                                           RTUNI_ALPHA, /* U+00c27f: */
+                                           RTUNI_ALPHA, /* U+00c280: */
+                                           RTUNI_ALPHA, /* U+00c281: */
+                                           RTUNI_ALPHA, /* U+00c282: */
+                                           RTUNI_ALPHA, /* U+00c283: */
+                                           RTUNI_ALPHA, /* U+00c284: */
+                                           RTUNI_ALPHA, /* U+00c285: */
+                                           RTUNI_ALPHA, /* U+00c286: */
+                                           RTUNI_ALPHA, /* U+00c287: */
+                                           RTUNI_ALPHA, /* U+00c288: */
+                                           RTUNI_ALPHA, /* U+00c289: */
+                                           RTUNI_ALPHA, /* U+00c28a: */
+                                           RTUNI_ALPHA, /* U+00c28b: */
+                                           RTUNI_ALPHA, /* U+00c28c: */
+                                           RTUNI_ALPHA, /* U+00c28d: */
+                                           RTUNI_ALPHA, /* U+00c28e: */
+                                           RTUNI_ALPHA, /* U+00c28f: */
+                                           RTUNI_ALPHA, /* U+00c290: */
+                                           RTUNI_ALPHA, /* U+00c291: */
+                                           RTUNI_ALPHA, /* U+00c292: */
+                                           RTUNI_ALPHA, /* U+00c293: */
+                                           RTUNI_ALPHA, /* U+00c294: */
+                                           RTUNI_ALPHA, /* U+00c295: */
+                                           RTUNI_ALPHA, /* U+00c296: */
+                                           RTUNI_ALPHA, /* U+00c297: */
+                                           RTUNI_ALPHA, /* U+00c298: */
+                                           RTUNI_ALPHA, /* U+00c299: */
+                                           RTUNI_ALPHA, /* U+00c29a: */
+                                           RTUNI_ALPHA, /* U+00c29b: */
+                                           RTUNI_ALPHA, /* U+00c29c: */
+                                           RTUNI_ALPHA, /* U+00c29d: */
+                                           RTUNI_ALPHA, /* U+00c29e: */
+                                           RTUNI_ALPHA, /* U+00c29f: */
+                                           RTUNI_ALPHA, /* U+00c2a0: */
+                                           RTUNI_ALPHA, /* U+00c2a1: */
+                                           RTUNI_ALPHA, /* U+00c2a2: */
+                                           RTUNI_ALPHA, /* U+00c2a3: */
+                                           RTUNI_ALPHA, /* U+00c2a4: */
+                                           RTUNI_ALPHA, /* U+00c2a5: */
+                                           RTUNI_ALPHA, /* U+00c2a6: */
+                                           RTUNI_ALPHA, /* U+00c2a7: */
+                                           RTUNI_ALPHA, /* U+00c2a8: */
+                                           RTUNI_ALPHA, /* U+00c2a9: */
+                                           RTUNI_ALPHA, /* U+00c2aa: */
+                                           RTUNI_ALPHA, /* U+00c2ab: */
+                                           RTUNI_ALPHA, /* U+00c2ac: */
+                                           RTUNI_ALPHA, /* U+00c2ad: */
+                                           RTUNI_ALPHA, /* U+00c2ae: */
+                                           RTUNI_ALPHA, /* U+00c2af: */
+                                           RTUNI_ALPHA, /* U+00c2b0: */
+                                           RTUNI_ALPHA, /* U+00c2b1: */
+                                           RTUNI_ALPHA, /* U+00c2b2: */
+                                           RTUNI_ALPHA, /* U+00c2b3: */
+                                           RTUNI_ALPHA, /* U+00c2b4: */
+                                           RTUNI_ALPHA, /* U+00c2b5: */
+                                           RTUNI_ALPHA, /* U+00c2b6: */
+                                           RTUNI_ALPHA, /* U+00c2b7: */
+                                           RTUNI_ALPHA, /* U+00c2b8: */
+                                           RTUNI_ALPHA, /* U+00c2b9: */
+                                           RTUNI_ALPHA, /* U+00c2ba: */
+                                           RTUNI_ALPHA, /* U+00c2bb: */
+                                           RTUNI_ALPHA, /* U+00c2bc: */
+                                           RTUNI_ALPHA, /* U+00c2bd: */
+                                           RTUNI_ALPHA, /* U+00c2be: */
+                                           RTUNI_ALPHA, /* U+00c2bf: */
+                                           RTUNI_ALPHA, /* U+00c2c0: */
+                                           RTUNI_ALPHA, /* U+00c2c1: */
+                                           RTUNI_ALPHA, /* U+00c2c2: */
+                                           RTUNI_ALPHA, /* U+00c2c3: */
+                                           RTUNI_ALPHA, /* U+00c2c4: */
+                                           RTUNI_ALPHA, /* U+00c2c5: */
+                                           RTUNI_ALPHA, /* U+00c2c6: */
+                                           RTUNI_ALPHA, /* U+00c2c7: */
+                                           RTUNI_ALPHA, /* U+00c2c8: */
+                                           RTUNI_ALPHA, /* U+00c2c9: */
+                                           RTUNI_ALPHA, /* U+00c2ca: */
+                                           RTUNI_ALPHA, /* U+00c2cb: */
+                                           RTUNI_ALPHA, /* U+00c2cc: */
+                                           RTUNI_ALPHA, /* U+00c2cd: */
+                                           RTUNI_ALPHA, /* U+00c2ce: */
+                                           RTUNI_ALPHA, /* U+00c2cf: */
+                                           RTUNI_ALPHA, /* U+00c2d0: */
+                                           RTUNI_ALPHA, /* U+00c2d1: */
+                                           RTUNI_ALPHA, /* U+00c2d2: */
+                                           RTUNI_ALPHA, /* U+00c2d3: */
+                                           RTUNI_ALPHA, /* U+00c2d4: */
+                                           RTUNI_ALPHA, /* U+00c2d5: */
+                                           RTUNI_ALPHA, /* U+00c2d6: */
+                                           RTUNI_ALPHA, /* U+00c2d7: */
+                                           RTUNI_ALPHA, /* U+00c2d8: */
+                                           RTUNI_ALPHA, /* U+00c2d9: */
+                                           RTUNI_ALPHA, /* U+00c2da: */
+                                           RTUNI_ALPHA, /* U+00c2db: */
+                                           RTUNI_ALPHA, /* U+00c2dc: */
+                                           RTUNI_ALPHA, /* U+00c2dd: */
+                                           RTUNI_ALPHA, /* U+00c2de: */
+                                           RTUNI_ALPHA, /* U+00c2df: */
+                                           RTUNI_ALPHA, /* U+00c2e0: */
+                                           RTUNI_ALPHA, /* U+00c2e1: */
+                                           RTUNI_ALPHA, /* U+00c2e2: */
+                                           RTUNI_ALPHA, /* U+00c2e3: */
+                                           RTUNI_ALPHA, /* U+00c2e4: */
+                                           RTUNI_ALPHA, /* U+00c2e5: */
+                                           RTUNI_ALPHA, /* U+00c2e6: */
+                                           RTUNI_ALPHA, /* U+00c2e7: */
+                                           RTUNI_ALPHA, /* U+00c2e8: */
+                                           RTUNI_ALPHA, /* U+00c2e9: */
+                                           RTUNI_ALPHA, /* U+00c2ea: */
+                                           RTUNI_ALPHA, /* U+00c2eb: */
+                                           RTUNI_ALPHA, /* U+00c2ec: */
+                                           RTUNI_ALPHA, /* U+00c2ed: */
+                                           RTUNI_ALPHA, /* U+00c2ee: */
+                                           RTUNI_ALPHA, /* U+00c2ef: */
+                                           RTUNI_ALPHA, /* U+00c2f0: */
+                                           RTUNI_ALPHA, /* U+00c2f1: */
+                                           RTUNI_ALPHA, /* U+00c2f2: */
+                                           RTUNI_ALPHA, /* U+00c2f3: */
+                                           RTUNI_ALPHA, /* U+00c2f4: */
+                                           RTUNI_ALPHA, /* U+00c2f5: */
+                                           RTUNI_ALPHA, /* U+00c2f6: */
+                                           RTUNI_ALPHA, /* U+00c2f7: */
+                                           RTUNI_ALPHA, /* U+00c2f8: */
+                                           RTUNI_ALPHA, /* U+00c2f9: */
+                                           RTUNI_ALPHA, /* U+00c2fa: */
+                                           RTUNI_ALPHA, /* U+00c2fb: */
+                                           RTUNI_ALPHA, /* U+00c2fc: */
+                                           RTUNI_ALPHA, /* U+00c2fd: */
+                                           RTUNI_ALPHA, /* U+00c2fe: */
+                                           RTUNI_ALPHA, /* U+00c2ff: */
+                                           RTUNI_ALPHA, /* U+00c300: */
+                                           RTUNI_ALPHA, /* U+00c301: */
+                                           RTUNI_ALPHA, /* U+00c302: */
+                                           RTUNI_ALPHA, /* U+00c303: */
+                                           RTUNI_ALPHA, /* U+00c304: */
+                                           RTUNI_ALPHA, /* U+00c305: */
+                                           RTUNI_ALPHA, /* U+00c306: */
+                                           RTUNI_ALPHA, /* U+00c307: */
+                                           RTUNI_ALPHA, /* U+00c308: */
+                                           RTUNI_ALPHA, /* U+00c309: */
+                                           RTUNI_ALPHA, /* U+00c30a: */
+                                           RTUNI_ALPHA, /* U+00c30b: */
+                                           RTUNI_ALPHA, /* U+00c30c: */
+                                           RTUNI_ALPHA, /* U+00c30d: */
+                                           RTUNI_ALPHA, /* U+00c30e: */
+                                           RTUNI_ALPHA, /* U+00c30f: */
+                                           RTUNI_ALPHA, /* U+00c310: */
+                                           RTUNI_ALPHA, /* U+00c311: */
+                                           RTUNI_ALPHA, /* U+00c312: */
+                                           RTUNI_ALPHA, /* U+00c313: */
+                                           RTUNI_ALPHA, /* U+00c314: */
+                                           RTUNI_ALPHA, /* U+00c315: */
+                                           RTUNI_ALPHA, /* U+00c316: */
+                                           RTUNI_ALPHA, /* U+00c317: */
+                                           RTUNI_ALPHA, /* U+00c318: */
+                                           RTUNI_ALPHA, /* U+00c319: */
+                                           RTUNI_ALPHA, /* U+00c31a: */
+                                           RTUNI_ALPHA, /* U+00c31b: */
+                                           RTUNI_ALPHA, /* U+00c31c: */
+                                           RTUNI_ALPHA, /* U+00c31d: */
+                                           RTUNI_ALPHA, /* U+00c31e: */
+                                           RTUNI_ALPHA, /* U+00c31f: */
+                                           RTUNI_ALPHA, /* U+00c320: */
+                                           RTUNI_ALPHA, /* U+00c321: */
+                                           RTUNI_ALPHA, /* U+00c322: */
+                                           RTUNI_ALPHA, /* U+00c323: */
+                                           RTUNI_ALPHA, /* U+00c324: */
+                                           RTUNI_ALPHA, /* U+00c325: */
+                                           RTUNI_ALPHA, /* U+00c326: */
+                                           RTUNI_ALPHA, /* U+00c327: */
+                                           RTUNI_ALPHA, /* U+00c328: */
+                                           RTUNI_ALPHA, /* U+00c329: */
+                                           RTUNI_ALPHA, /* U+00c32a: */
+                                           RTUNI_ALPHA, /* U+00c32b: */
+                                           RTUNI_ALPHA, /* U+00c32c: */
+                                           RTUNI_ALPHA, /* U+00c32d: */
+                                           RTUNI_ALPHA, /* U+00c32e: */
+                                           RTUNI_ALPHA, /* U+00c32f: */
+                                           RTUNI_ALPHA, /* U+00c330: */
+                                           RTUNI_ALPHA, /* U+00c331: */
+                                           RTUNI_ALPHA, /* U+00c332: */
+                                           RTUNI_ALPHA, /* U+00c333: */
+                                           RTUNI_ALPHA, /* U+00c334: */
+                                           RTUNI_ALPHA, /* U+00c335: */
+                                           RTUNI_ALPHA, /* U+00c336: */
+                                           RTUNI_ALPHA, /* U+00c337: */
+                                           RTUNI_ALPHA, /* U+00c338: */
+                                           RTUNI_ALPHA, /* U+00c339: */
+                                           RTUNI_ALPHA, /* U+00c33a: */
+                                           RTUNI_ALPHA, /* U+00c33b: */
+                                           RTUNI_ALPHA, /* U+00c33c: */
+                                           RTUNI_ALPHA, /* U+00c33d: */
+                                           RTUNI_ALPHA, /* U+00c33e: */
+                                           RTUNI_ALPHA, /* U+00c33f: */
+                                           RTUNI_ALPHA, /* U+00c340: */
+                                           RTUNI_ALPHA, /* U+00c341: */
+                                           RTUNI_ALPHA, /* U+00c342: */
+                                           RTUNI_ALPHA, /* U+00c343: */
+                                           RTUNI_ALPHA, /* U+00c344: */
+                                           RTUNI_ALPHA, /* U+00c345: */
+                                           RTUNI_ALPHA, /* U+00c346: */
+                                           RTUNI_ALPHA, /* U+00c347: */
+                                           RTUNI_ALPHA, /* U+00c348: */
+                                           RTUNI_ALPHA, /* U+00c349: */
+                                           RTUNI_ALPHA, /* U+00c34a: */
+                                           RTUNI_ALPHA, /* U+00c34b: */
+                                           RTUNI_ALPHA, /* U+00c34c: */
+                                           RTUNI_ALPHA, /* U+00c34d: */
+                                           RTUNI_ALPHA, /* U+00c34e: */
+                                           RTUNI_ALPHA, /* U+00c34f: */
+                                           RTUNI_ALPHA, /* U+00c350: */
+                                           RTUNI_ALPHA, /* U+00c351: */
+                                           RTUNI_ALPHA, /* U+00c352: */
+                                           RTUNI_ALPHA, /* U+00c353: */
+                                           RTUNI_ALPHA, /* U+00c354: */
+                                           RTUNI_ALPHA, /* U+00c355: */
+                                           RTUNI_ALPHA, /* U+00c356: */
+                                           RTUNI_ALPHA, /* U+00c357: */
+                                           RTUNI_ALPHA, /* U+00c358: */
+                                           RTUNI_ALPHA, /* U+00c359: */
+                                           RTUNI_ALPHA, /* U+00c35a: */
+                                           RTUNI_ALPHA, /* U+00c35b: */
+                                           RTUNI_ALPHA, /* U+00c35c: */
+                                           RTUNI_ALPHA, /* U+00c35d: */
+                                           RTUNI_ALPHA, /* U+00c35e: */
+                                           RTUNI_ALPHA, /* U+00c35f: */
+                                           RTUNI_ALPHA, /* U+00c360: */
+                                           RTUNI_ALPHA, /* U+00c361: */
+                                           RTUNI_ALPHA, /* U+00c362: */
+                                           RTUNI_ALPHA, /* U+00c363: */
+                                           RTUNI_ALPHA, /* U+00c364: */
+                                           RTUNI_ALPHA, /* U+00c365: */
+                                           RTUNI_ALPHA, /* U+00c366: */
+                                           RTUNI_ALPHA, /* U+00c367: */
+                                           RTUNI_ALPHA, /* U+00c368: */
+                                           RTUNI_ALPHA, /* U+00c369: */
+                                           RTUNI_ALPHA, /* U+00c36a: */
+                                           RTUNI_ALPHA, /* U+00c36b: */
+                                           RTUNI_ALPHA, /* U+00c36c: */
+                                           RTUNI_ALPHA, /* U+00c36d: */
+                                           RTUNI_ALPHA, /* U+00c36e: */
+                                           RTUNI_ALPHA, /* U+00c36f: */
+                                           RTUNI_ALPHA, /* U+00c370: */
+                                           RTUNI_ALPHA, /* U+00c371: */
+                                           RTUNI_ALPHA, /* U+00c372: */
+                                           RTUNI_ALPHA, /* U+00c373: */
+                                           RTUNI_ALPHA, /* U+00c374: */
+                                           RTUNI_ALPHA, /* U+00c375: */
+                                           RTUNI_ALPHA, /* U+00c376: */
+                                           RTUNI_ALPHA, /* U+00c377: */
+                                           RTUNI_ALPHA, /* U+00c378: */
+                                           RTUNI_ALPHA, /* U+00c379: */
+                                           RTUNI_ALPHA, /* U+00c37a: */
+                                           RTUNI_ALPHA, /* U+00c37b: */
+                                           RTUNI_ALPHA, /* U+00c37c: */
+                                           RTUNI_ALPHA, /* U+00c37d: */
+                                           RTUNI_ALPHA, /* U+00c37e: */
+                                           RTUNI_ALPHA, /* U+00c37f: */
+                                           RTUNI_ALPHA, /* U+00c380: */
+                                           RTUNI_ALPHA, /* U+00c381: */
+                                           RTUNI_ALPHA, /* U+00c382: */
+                                           RTUNI_ALPHA, /* U+00c383: */
+                                           RTUNI_ALPHA, /* U+00c384: */
+                                           RTUNI_ALPHA, /* U+00c385: */
+                                           RTUNI_ALPHA, /* U+00c386: */
+                                           RTUNI_ALPHA, /* U+00c387: */
+                                           RTUNI_ALPHA, /* U+00c388: */
+                                           RTUNI_ALPHA, /* U+00c389: */
+                                           RTUNI_ALPHA, /* U+00c38a: */
+                                           RTUNI_ALPHA, /* U+00c38b: */
+                                           RTUNI_ALPHA, /* U+00c38c: */
+                                           RTUNI_ALPHA, /* U+00c38d: */
+                                           RTUNI_ALPHA, /* U+00c38e: */
+                                           RTUNI_ALPHA, /* U+00c38f: */
+                                           RTUNI_ALPHA, /* U+00c390: */
+                                           RTUNI_ALPHA, /* U+00c391: */
+                                           RTUNI_ALPHA, /* U+00c392: */
+                                           RTUNI_ALPHA, /* U+00c393: */
+                                           RTUNI_ALPHA, /* U+00c394: */
+                                           RTUNI_ALPHA, /* U+00c395: */
+                                           RTUNI_ALPHA, /* U+00c396: */
+                                           RTUNI_ALPHA, /* U+00c397: */
+                                           RTUNI_ALPHA, /* U+00c398: */
+                                           RTUNI_ALPHA, /* U+00c399: */
+                                           RTUNI_ALPHA, /* U+00c39a: */
+                                           RTUNI_ALPHA, /* U+00c39b: */
+                                           RTUNI_ALPHA, /* U+00c39c: */
+                                           RTUNI_ALPHA, /* U+00c39d: */
+                                           RTUNI_ALPHA, /* U+00c39e: */
+                                           RTUNI_ALPHA, /* U+00c39f: */
+                                           RTUNI_ALPHA, /* U+00c3a0: */
+                                           RTUNI_ALPHA, /* U+00c3a1: */
+                                           RTUNI_ALPHA, /* U+00c3a2: */
+                                           RTUNI_ALPHA, /* U+00c3a3: */
+                                           RTUNI_ALPHA, /* U+00c3a4: */
+                                           RTUNI_ALPHA, /* U+00c3a5: */
+                                           RTUNI_ALPHA, /* U+00c3a6: */
+                                           RTUNI_ALPHA, /* U+00c3a7: */
+                                           RTUNI_ALPHA, /* U+00c3a8: */
+                                           RTUNI_ALPHA, /* U+00c3a9: */
+                                           RTUNI_ALPHA, /* U+00c3aa: */
+                                           RTUNI_ALPHA, /* U+00c3ab: */
+                                           RTUNI_ALPHA, /* U+00c3ac: */
+                                           RTUNI_ALPHA, /* U+00c3ad: */
+                                           RTUNI_ALPHA, /* U+00c3ae: */
+                                           RTUNI_ALPHA, /* U+00c3af: */
+                                           RTUNI_ALPHA, /* U+00c3b0: */
+                                           RTUNI_ALPHA, /* U+00c3b1: */
+                                           RTUNI_ALPHA, /* U+00c3b2: */
+                                           RTUNI_ALPHA, /* U+00c3b3: */
+                                           RTUNI_ALPHA, /* U+00c3b4: */
+                                           RTUNI_ALPHA, /* U+00c3b5: */
+                                           RTUNI_ALPHA, /* U+00c3b6: */
+                                           RTUNI_ALPHA, /* U+00c3b7: */
+                                           RTUNI_ALPHA, /* U+00c3b8: */
+                                           RTUNI_ALPHA, /* U+00c3b9: */
+                                           RTUNI_ALPHA, /* U+00c3ba: */
+                                           RTUNI_ALPHA, /* U+00c3bb: */
+                                           RTUNI_ALPHA, /* U+00c3bc: */
+                                           RTUNI_ALPHA, /* U+00c3bd: */
+                                           RTUNI_ALPHA, /* U+00c3be: */
+                                           RTUNI_ALPHA, /* U+00c3bf: */
+                                           RTUNI_ALPHA, /* U+00c3c0: */
+                                           RTUNI_ALPHA, /* U+00c3c1: */
+                                           RTUNI_ALPHA, /* U+00c3c2: */
+                                           RTUNI_ALPHA, /* U+00c3c3: */
+                                           RTUNI_ALPHA, /* U+00c3c4: */
+                                           RTUNI_ALPHA, /* U+00c3c5: */
+                                           RTUNI_ALPHA, /* U+00c3c6: */
+                                           RTUNI_ALPHA, /* U+00c3c7: */
+                                           RTUNI_ALPHA, /* U+00c3c8: */
+                                           RTUNI_ALPHA, /* U+00c3c9: */
+                                           RTUNI_ALPHA, /* U+00c3ca: */
+                                           RTUNI_ALPHA, /* U+00c3cb: */
+                                           RTUNI_ALPHA, /* U+00c3cc: */
+                                           RTUNI_ALPHA, /* U+00c3cd: */
+                                           RTUNI_ALPHA, /* U+00c3ce: */
+                                           RTUNI_ALPHA, /* U+00c3cf: */
+                                           RTUNI_ALPHA, /* U+00c3d0: */
+                                           RTUNI_ALPHA, /* U+00c3d1: */
+                                           RTUNI_ALPHA, /* U+00c3d2: */
+                                           RTUNI_ALPHA, /* U+00c3d3: */
+                                           RTUNI_ALPHA, /* U+00c3d4: */
+                                           RTUNI_ALPHA, /* U+00c3d5: */
+                                           RTUNI_ALPHA, /* U+00c3d6: */
+                                           RTUNI_ALPHA, /* U+00c3d7: */
+                                           RTUNI_ALPHA, /* U+00c3d8: */
+                                           RTUNI_ALPHA, /* U+00c3d9: */
+                                           RTUNI_ALPHA, /* U+00c3da: */
+                                           RTUNI_ALPHA, /* U+00c3db: */
+                                           RTUNI_ALPHA, /* U+00c3dc: */
+                                           RTUNI_ALPHA, /* U+00c3dd: */
+                                           RTUNI_ALPHA, /* U+00c3de: */
+                                           RTUNI_ALPHA, /* U+00c3df: */
+                                           RTUNI_ALPHA, /* U+00c3e0: */
+                                           RTUNI_ALPHA, /* U+00c3e1: */
+                                           RTUNI_ALPHA, /* U+00c3e2: */
+                                           RTUNI_ALPHA, /* U+00c3e3: */
+                                           RTUNI_ALPHA, /* U+00c3e4: */
+                                           RTUNI_ALPHA, /* U+00c3e5: */
+                                           RTUNI_ALPHA, /* U+00c3e6: */
+                                           RTUNI_ALPHA, /* U+00c3e7: */
+                                           RTUNI_ALPHA, /* U+00c3e8: */
+                                           RTUNI_ALPHA, /* U+00c3e9: */
+                                           RTUNI_ALPHA, /* U+00c3ea: */
+                                           RTUNI_ALPHA, /* U+00c3eb: */
+                                           RTUNI_ALPHA, /* U+00c3ec: */
+                                           RTUNI_ALPHA, /* U+00c3ed: */
+                                           RTUNI_ALPHA, /* U+00c3ee: */
+                                           RTUNI_ALPHA, /* U+00c3ef: */
+                                           RTUNI_ALPHA, /* U+00c3f0: */
+                                           RTUNI_ALPHA, /* U+00c3f1: */
+                                           RTUNI_ALPHA, /* U+00c3f2: */
+                                           RTUNI_ALPHA, /* U+00c3f3: */
+                                           RTUNI_ALPHA, /* U+00c3f4: */
+                                           RTUNI_ALPHA, /* U+00c3f5: */
+                                           RTUNI_ALPHA, /* U+00c3f6: */
+                                           RTUNI_ALPHA, /* U+00c3f7: */
+                                           RTUNI_ALPHA, /* U+00c3f8: */
+                                           RTUNI_ALPHA, /* U+00c3f9: */
+                                           RTUNI_ALPHA, /* U+00c3fa: */
+                                           RTUNI_ALPHA, /* U+00c3fb: */
+                                           RTUNI_ALPHA, /* U+00c3fc: */
+                                           RTUNI_ALPHA, /* U+00c3fd: */
+                                           RTUNI_ALPHA, /* U+00c3fe: */
+                                           RTUNI_ALPHA, /* U+00c3ff: */
+                                           RTUNI_ALPHA, /* U+00c400: */
+                                           RTUNI_ALPHA, /* U+00c401: */
+                                           RTUNI_ALPHA, /* U+00c402: */
+                                           RTUNI_ALPHA, /* U+00c403: */
+                                           RTUNI_ALPHA, /* U+00c404: */
+                                           RTUNI_ALPHA, /* U+00c405: */
+                                           RTUNI_ALPHA, /* U+00c406: */
+                                           RTUNI_ALPHA, /* U+00c407: */
+                                           RTUNI_ALPHA, /* U+00c408: */
+                                           RTUNI_ALPHA, /* U+00c409: */
+                                           RTUNI_ALPHA, /* U+00c40a: */
+                                           RTUNI_ALPHA, /* U+00c40b: */
+                                           RTUNI_ALPHA, /* U+00c40c: */
+                                           RTUNI_ALPHA, /* U+00c40d: */
+                                           RTUNI_ALPHA, /* U+00c40e: */
+                                           RTUNI_ALPHA, /* U+00c40f: */
+                                           RTUNI_ALPHA, /* U+00c410: */
+                                           RTUNI_ALPHA, /* U+00c411: */
+                                           RTUNI_ALPHA, /* U+00c412: */
+                                           RTUNI_ALPHA, /* U+00c413: */
+                                           RTUNI_ALPHA, /* U+00c414: */
+                                           RTUNI_ALPHA, /* U+00c415: */
+                                           RTUNI_ALPHA, /* U+00c416: */
+                                           RTUNI_ALPHA, /* U+00c417: */
+                                           RTUNI_ALPHA, /* U+00c418: */
+                                           RTUNI_ALPHA, /* U+00c419: */
+                                           RTUNI_ALPHA, /* U+00c41a: */
+                                           RTUNI_ALPHA, /* U+00c41b: */
+                                           RTUNI_ALPHA, /* U+00c41c: */
+                                           RTUNI_ALPHA, /* U+00c41d: */
+                                           RTUNI_ALPHA, /* U+00c41e: */
+                                           RTUNI_ALPHA, /* U+00c41f: */
+                                           RTUNI_ALPHA, /* U+00c420: */
+                                           RTUNI_ALPHA, /* U+00c421: */
+                                           RTUNI_ALPHA, /* U+00c422: */
+                                           RTUNI_ALPHA, /* U+00c423: */
+                                           RTUNI_ALPHA, /* U+00c424: */
+                                           RTUNI_ALPHA, /* U+00c425: */
+                                           RTUNI_ALPHA, /* U+00c426: */
+                                           RTUNI_ALPHA, /* U+00c427: */
+                                           RTUNI_ALPHA, /* U+00c428: */
+                                           RTUNI_ALPHA, /* U+00c429: */
+                                           RTUNI_ALPHA, /* U+00c42a: */
+                                           RTUNI_ALPHA, /* U+00c42b: */
+                                           RTUNI_ALPHA, /* U+00c42c: */
+                                           RTUNI_ALPHA, /* U+00c42d: */
+                                           RTUNI_ALPHA, /* U+00c42e: */
+                                           RTUNI_ALPHA, /* U+00c42f: */
+                                           RTUNI_ALPHA, /* U+00c430: */
+                                           RTUNI_ALPHA, /* U+00c431: */
+                                           RTUNI_ALPHA, /* U+00c432: */
+                                           RTUNI_ALPHA, /* U+00c433: */
+                                           RTUNI_ALPHA, /* U+00c434: */
+                                           RTUNI_ALPHA, /* U+00c435: */
+                                           RTUNI_ALPHA, /* U+00c436: */
+                                           RTUNI_ALPHA, /* U+00c437: */
+                                           RTUNI_ALPHA, /* U+00c438: */
+                                           RTUNI_ALPHA, /* U+00c439: */
+                                           RTUNI_ALPHA, /* U+00c43a: */
+                                           RTUNI_ALPHA, /* U+00c43b: */
+                                           RTUNI_ALPHA, /* U+00c43c: */
+                                           RTUNI_ALPHA, /* U+00c43d: */
+                                           RTUNI_ALPHA, /* U+00c43e: */
+                                           RTUNI_ALPHA, /* U+00c43f: */
+                                           RTUNI_ALPHA, /* U+00c440: */
+                                           RTUNI_ALPHA, /* U+00c441: */
+                                           RTUNI_ALPHA, /* U+00c442: */
+                                           RTUNI_ALPHA, /* U+00c443: */
+                                           RTUNI_ALPHA, /* U+00c444: */
+                                           RTUNI_ALPHA, /* U+00c445: */
+                                           RTUNI_ALPHA, /* U+00c446: */
+                                           RTUNI_ALPHA, /* U+00c447: */
+                                           RTUNI_ALPHA, /* U+00c448: */
+                                           RTUNI_ALPHA, /* U+00c449: */
+                                           RTUNI_ALPHA, /* U+00c44a: */
+                                           RTUNI_ALPHA, /* U+00c44b: */
+                                           RTUNI_ALPHA, /* U+00c44c: */
+                                           RTUNI_ALPHA, /* U+00c44d: */
+                                           RTUNI_ALPHA, /* U+00c44e: */
+                                           RTUNI_ALPHA, /* U+00c44f: */
+                                           RTUNI_ALPHA, /* U+00c450: */
+                                           RTUNI_ALPHA, /* U+00c451: */
+                                           RTUNI_ALPHA, /* U+00c452: */
+                                           RTUNI_ALPHA, /* U+00c453: */
+                                           RTUNI_ALPHA, /* U+00c454: */
+                                           RTUNI_ALPHA, /* U+00c455: */
+                                           RTUNI_ALPHA, /* U+00c456: */
+                                           RTUNI_ALPHA, /* U+00c457: */
+                                           RTUNI_ALPHA, /* U+00c458: */
+                                           RTUNI_ALPHA, /* U+00c459: */
+                                           RTUNI_ALPHA, /* U+00c45a: */
+                                           RTUNI_ALPHA, /* U+00c45b: */
+                                           RTUNI_ALPHA, /* U+00c45c: */
+                                           RTUNI_ALPHA, /* U+00c45d: */
+                                           RTUNI_ALPHA, /* U+00c45e: */
+                                           RTUNI_ALPHA, /* U+00c45f: */
+                                           RTUNI_ALPHA, /* U+00c460: */
+                                           RTUNI_ALPHA, /* U+00c461: */
+                                           RTUNI_ALPHA, /* U+00c462: */
+                                           RTUNI_ALPHA, /* U+00c463: */
+                                           RTUNI_ALPHA, /* U+00c464: */
+                                           RTUNI_ALPHA, /* U+00c465: */
+                                           RTUNI_ALPHA, /* U+00c466: */
+                                           RTUNI_ALPHA, /* U+00c467: */
+                                           RTUNI_ALPHA, /* U+00c468: */
+                                           RTUNI_ALPHA, /* U+00c469: */
+                                           RTUNI_ALPHA, /* U+00c46a: */
+                                           RTUNI_ALPHA, /* U+00c46b: */
+                                           RTUNI_ALPHA, /* U+00c46c: */
+                                           RTUNI_ALPHA, /* U+00c46d: */
+                                           RTUNI_ALPHA, /* U+00c46e: */
+                                           RTUNI_ALPHA, /* U+00c46f: */
+                                           RTUNI_ALPHA, /* U+00c470: */
+                                           RTUNI_ALPHA, /* U+00c471: */
+                                           RTUNI_ALPHA, /* U+00c472: */
+                                           RTUNI_ALPHA, /* U+00c473: */
+                                           RTUNI_ALPHA, /* U+00c474: */
+                                           RTUNI_ALPHA, /* U+00c475: */
+                                           RTUNI_ALPHA, /* U+00c476: */
+                                           RTUNI_ALPHA, /* U+00c477: */
+                                           RTUNI_ALPHA, /* U+00c478: */
+                                           RTUNI_ALPHA, /* U+00c479: */
+                                           RTUNI_ALPHA, /* U+00c47a: */
+                                           RTUNI_ALPHA, /* U+00c47b: */
+                                           RTUNI_ALPHA, /* U+00c47c: */
+                                           RTUNI_ALPHA, /* U+00c47d: */
+                                           RTUNI_ALPHA, /* U+00c47e: */
+                                           RTUNI_ALPHA, /* U+00c47f: */
+                                           RTUNI_ALPHA, /* U+00c480: */
+                                           RTUNI_ALPHA, /* U+00c481: */
+                                           RTUNI_ALPHA, /* U+00c482: */
+                                           RTUNI_ALPHA, /* U+00c483: */
+                                           RTUNI_ALPHA, /* U+00c484: */
+                                           RTUNI_ALPHA, /* U+00c485: */
+                                           RTUNI_ALPHA, /* U+00c486: */
+                                           RTUNI_ALPHA, /* U+00c487: */
+                                           RTUNI_ALPHA, /* U+00c488: */
+                                           RTUNI_ALPHA, /* U+00c489: */
+                                           RTUNI_ALPHA, /* U+00c48a: */
+                                           RTUNI_ALPHA, /* U+00c48b: */
+                                           RTUNI_ALPHA, /* U+00c48c: */
+                                           RTUNI_ALPHA, /* U+00c48d: */
+                                           RTUNI_ALPHA, /* U+00c48e: */
+                                           RTUNI_ALPHA, /* U+00c48f: */
+                                           RTUNI_ALPHA, /* U+00c490: */
+                                           RTUNI_ALPHA, /* U+00c491: */
+                                           RTUNI_ALPHA, /* U+00c492: */
+                                           RTUNI_ALPHA, /* U+00c493: */
+                                           RTUNI_ALPHA, /* U+00c494: */
+                                           RTUNI_ALPHA, /* U+00c495: */
+                                           RTUNI_ALPHA, /* U+00c496: */
+                                           RTUNI_ALPHA, /* U+00c497: */
+                                           RTUNI_ALPHA, /* U+00c498: */
+                                           RTUNI_ALPHA, /* U+00c499: */
+                                           RTUNI_ALPHA, /* U+00c49a: */
+                                           RTUNI_ALPHA, /* U+00c49b: */
+                                           RTUNI_ALPHA, /* U+00c49c: */
+                                           RTUNI_ALPHA, /* U+00c49d: */
+                                           RTUNI_ALPHA, /* U+00c49e: */
+                                           RTUNI_ALPHA, /* U+00c49f: */
+                                           RTUNI_ALPHA, /* U+00c4a0: */
+                                           RTUNI_ALPHA, /* U+00c4a1: */
+                                           RTUNI_ALPHA, /* U+00c4a2: */
+                                           RTUNI_ALPHA, /* U+00c4a3: */
+                                           RTUNI_ALPHA, /* U+00c4a4: */
+                                           RTUNI_ALPHA, /* U+00c4a5: */
+                                           RTUNI_ALPHA, /* U+00c4a6: */
+                                           RTUNI_ALPHA, /* U+00c4a7: */
+                                           RTUNI_ALPHA, /* U+00c4a8: */
+                                           RTUNI_ALPHA, /* U+00c4a9: */
+                                           RTUNI_ALPHA, /* U+00c4aa: */
+                                           RTUNI_ALPHA, /* U+00c4ab: */
+                                           RTUNI_ALPHA, /* U+00c4ac: */
+                                           RTUNI_ALPHA, /* U+00c4ad: */
+                                           RTUNI_ALPHA, /* U+00c4ae: */
+                                           RTUNI_ALPHA, /* U+00c4af: */
+                                           RTUNI_ALPHA, /* U+00c4b0: */
+                                           RTUNI_ALPHA, /* U+00c4b1: */
+                                           RTUNI_ALPHA, /* U+00c4b2: */
+                                           RTUNI_ALPHA, /* U+00c4b3: */
+                                           RTUNI_ALPHA, /* U+00c4b4: */
+                                           RTUNI_ALPHA, /* U+00c4b5: */
+                                           RTUNI_ALPHA, /* U+00c4b6: */
+                                           RTUNI_ALPHA, /* U+00c4b7: */
+                                           RTUNI_ALPHA, /* U+00c4b8: */
+                                           RTUNI_ALPHA, /* U+00c4b9: */
+                                           RTUNI_ALPHA, /* U+00c4ba: */
+                                           RTUNI_ALPHA, /* U+00c4bb: */
+                                           RTUNI_ALPHA, /* U+00c4bc: */
+                                           RTUNI_ALPHA, /* U+00c4bd: */
+                                           RTUNI_ALPHA, /* U+00c4be: */
+                                           RTUNI_ALPHA, /* U+00c4bf: */
+                                           RTUNI_ALPHA, /* U+00c4c0: */
+                                           RTUNI_ALPHA, /* U+00c4c1: */
+                                           RTUNI_ALPHA, /* U+00c4c2: */
+                                           RTUNI_ALPHA, /* U+00c4c3: */
+                                           RTUNI_ALPHA, /* U+00c4c4: */
+                                           RTUNI_ALPHA, /* U+00c4c5: */
+                                           RTUNI_ALPHA, /* U+00c4c6: */
+                                           RTUNI_ALPHA, /* U+00c4c7: */
+                                           RTUNI_ALPHA, /* U+00c4c8: */
+                                           RTUNI_ALPHA, /* U+00c4c9: */
+                                           RTUNI_ALPHA, /* U+00c4ca: */
+                                           RTUNI_ALPHA, /* U+00c4cb: */
+                                           RTUNI_ALPHA, /* U+00c4cc: */
+                                           RTUNI_ALPHA, /* U+00c4cd: */
+                                           RTUNI_ALPHA, /* U+00c4ce: */
+                                           RTUNI_ALPHA, /* U+00c4cf: */
+                                           RTUNI_ALPHA, /* U+00c4d0: */
+                                           RTUNI_ALPHA, /* U+00c4d1: */
+                                           RTUNI_ALPHA, /* U+00c4d2: */
+                                           RTUNI_ALPHA, /* U+00c4d3: */
+                                           RTUNI_ALPHA, /* U+00c4d4: */
+                                           RTUNI_ALPHA, /* U+00c4d5: */
+                                           RTUNI_ALPHA, /* U+00c4d6: */
+                                           RTUNI_ALPHA, /* U+00c4d7: */
+                                           RTUNI_ALPHA, /* U+00c4d8: */
+                                           RTUNI_ALPHA, /* U+00c4d9: */
+                                           RTUNI_ALPHA, /* U+00c4da: */
+                                           RTUNI_ALPHA, /* U+00c4db: */
+                                           RTUNI_ALPHA, /* U+00c4dc: */
+                                           RTUNI_ALPHA, /* U+00c4dd: */
+                                           RTUNI_ALPHA, /* U+00c4de: */
+                                           RTUNI_ALPHA, /* U+00c4df: */
+                                           RTUNI_ALPHA, /* U+00c4e0: */
+                                           RTUNI_ALPHA, /* U+00c4e1: */
+                                           RTUNI_ALPHA, /* U+00c4e2: */
+                                           RTUNI_ALPHA, /* U+00c4e3: */
+                                           RTUNI_ALPHA, /* U+00c4e4: */
+                                           RTUNI_ALPHA, /* U+00c4e5: */
+                                           RTUNI_ALPHA, /* U+00c4e6: */
+                                           RTUNI_ALPHA, /* U+00c4e7: */
+                                           RTUNI_ALPHA, /* U+00c4e8: */
+                                           RTUNI_ALPHA, /* U+00c4e9: */
+                                           RTUNI_ALPHA, /* U+00c4ea: */
+                                           RTUNI_ALPHA, /* U+00c4eb: */
+                                           RTUNI_ALPHA, /* U+00c4ec: */
+                                           RTUNI_ALPHA, /* U+00c4ed: */
+                                           RTUNI_ALPHA, /* U+00c4ee: */
+                                           RTUNI_ALPHA, /* U+00c4ef: */
+                                           RTUNI_ALPHA, /* U+00c4f0: */
+                                           RTUNI_ALPHA, /* U+00c4f1: */
+                                           RTUNI_ALPHA, /* U+00c4f2: */
+                                           RTUNI_ALPHA, /* U+00c4f3: */
+                                           RTUNI_ALPHA, /* U+00c4f4: */
+                                           RTUNI_ALPHA, /* U+00c4f5: */
+                                           RTUNI_ALPHA, /* U+00c4f6: */
+                                           RTUNI_ALPHA, /* U+00c4f7: */
+                                           RTUNI_ALPHA, /* U+00c4f8: */
+                                           RTUNI_ALPHA, /* U+00c4f9: */
+                                           RTUNI_ALPHA, /* U+00c4fa: */
+                                           RTUNI_ALPHA, /* U+00c4fb: */
+                                           RTUNI_ALPHA, /* U+00c4fc: */
+                                           RTUNI_ALPHA, /* U+00c4fd: */
+                                           RTUNI_ALPHA, /* U+00c4fe: */
+                                           RTUNI_ALPHA, /* U+00c4ff: */
+                                           RTUNI_ALPHA, /* U+00c500: */
+                                           RTUNI_ALPHA, /* U+00c501: */
+                                           RTUNI_ALPHA, /* U+00c502: */
+                                           RTUNI_ALPHA, /* U+00c503: */
+                                           RTUNI_ALPHA, /* U+00c504: */
+                                           RTUNI_ALPHA, /* U+00c505: */
+                                           RTUNI_ALPHA, /* U+00c506: */
+                                           RTUNI_ALPHA, /* U+00c507: */
+                                           RTUNI_ALPHA, /* U+00c508: */
+                                           RTUNI_ALPHA, /* U+00c509: */
+                                           RTUNI_ALPHA, /* U+00c50a: */
+                                           RTUNI_ALPHA, /* U+00c50b: */
+                                           RTUNI_ALPHA, /* U+00c50c: */
+                                           RTUNI_ALPHA, /* U+00c50d: */
+                                           RTUNI_ALPHA, /* U+00c50e: */
+                                           RTUNI_ALPHA, /* U+00c50f: */
+                                           RTUNI_ALPHA, /* U+00c510: */
+                                           RTUNI_ALPHA, /* U+00c511: */
+                                           RTUNI_ALPHA, /* U+00c512: */
+                                           RTUNI_ALPHA, /* U+00c513: */
+                                           RTUNI_ALPHA, /* U+00c514: */
+                                           RTUNI_ALPHA, /* U+00c515: */
+                                           RTUNI_ALPHA, /* U+00c516: */
+                                           RTUNI_ALPHA, /* U+00c517: */
+                                           RTUNI_ALPHA, /* U+00c518: */
+                                           RTUNI_ALPHA, /* U+00c519: */
+                                           RTUNI_ALPHA, /* U+00c51a: */
+                                           RTUNI_ALPHA, /* U+00c51b: */
+                                           RTUNI_ALPHA, /* U+00c51c: */
+                                           RTUNI_ALPHA, /* U+00c51d: */
+                                           RTUNI_ALPHA, /* U+00c51e: */
+                                           RTUNI_ALPHA, /* U+00c51f: */
+                                           RTUNI_ALPHA, /* U+00c520: */
+                                           RTUNI_ALPHA, /* U+00c521: */
+                                           RTUNI_ALPHA, /* U+00c522: */
+                                           RTUNI_ALPHA, /* U+00c523: */
+                                           RTUNI_ALPHA, /* U+00c524: */
+                                           RTUNI_ALPHA, /* U+00c525: */
+                                           RTUNI_ALPHA, /* U+00c526: */
+                                           RTUNI_ALPHA, /* U+00c527: */
+                                           RTUNI_ALPHA, /* U+00c528: */
+                                           RTUNI_ALPHA, /* U+00c529: */
+                                           RTUNI_ALPHA, /* U+00c52a: */
+                                           RTUNI_ALPHA, /* U+00c52b: */
+                                           RTUNI_ALPHA, /* U+00c52c: */
+                                           RTUNI_ALPHA, /* U+00c52d: */
+                                           RTUNI_ALPHA, /* U+00c52e: */
+                                           RTUNI_ALPHA, /* U+00c52f: */
+                                           RTUNI_ALPHA, /* U+00c530: */
+                                           RTUNI_ALPHA, /* U+00c531: */
+                                           RTUNI_ALPHA, /* U+00c532: */
+                                           RTUNI_ALPHA, /* U+00c533: */
+                                           RTUNI_ALPHA, /* U+00c534: */
+                                           RTUNI_ALPHA, /* U+00c535: */
+                                           RTUNI_ALPHA, /* U+00c536: */
+                                           RTUNI_ALPHA, /* U+00c537: */
+                                           RTUNI_ALPHA, /* U+00c538: */
+                                           RTUNI_ALPHA, /* U+00c539: */
+                                           RTUNI_ALPHA, /* U+00c53a: */
+                                           RTUNI_ALPHA, /* U+00c53b: */
+                                           RTUNI_ALPHA, /* U+00c53c: */
+                                           RTUNI_ALPHA, /* U+00c53d: */
+                                           RTUNI_ALPHA, /* U+00c53e: */
+                                           RTUNI_ALPHA, /* U+00c53f: */
+                                           RTUNI_ALPHA, /* U+00c540: */
+                                           RTUNI_ALPHA, /* U+00c541: */
+                                           RTUNI_ALPHA, /* U+00c542: */
+                                           RTUNI_ALPHA, /* U+00c543: */
+                                           RTUNI_ALPHA, /* U+00c544: */
+                                           RTUNI_ALPHA, /* U+00c545: */
+                                           RTUNI_ALPHA, /* U+00c546: */
+                                           RTUNI_ALPHA, /* U+00c547: */
+                                           RTUNI_ALPHA, /* U+00c548: */
+                                           RTUNI_ALPHA, /* U+00c549: */
+                                           RTUNI_ALPHA, /* U+00c54a: */
+                                           RTUNI_ALPHA, /* U+00c54b: */
+                                           RTUNI_ALPHA, /* U+00c54c: */
+                                           RTUNI_ALPHA, /* U+00c54d: */
+                                           RTUNI_ALPHA, /* U+00c54e: */
+                                           RTUNI_ALPHA, /* U+00c54f: */
+                                           RTUNI_ALPHA, /* U+00c550: */
+                                           RTUNI_ALPHA, /* U+00c551: */
+                                           RTUNI_ALPHA, /* U+00c552: */
+                                           RTUNI_ALPHA, /* U+00c553: */
+                                           RTUNI_ALPHA, /* U+00c554: */
+                                           RTUNI_ALPHA, /* U+00c555: */
+                                           RTUNI_ALPHA, /* U+00c556: */
+                                           RTUNI_ALPHA, /* U+00c557: */
+                                           RTUNI_ALPHA, /* U+00c558: */
+                                           RTUNI_ALPHA, /* U+00c559: */
+                                           RTUNI_ALPHA, /* U+00c55a: */
+                                           RTUNI_ALPHA, /* U+00c55b: */
+                                           RTUNI_ALPHA, /* U+00c55c: */
+                                           RTUNI_ALPHA, /* U+00c55d: */
+                                           RTUNI_ALPHA, /* U+00c55e: */
+                                           RTUNI_ALPHA, /* U+00c55f: */
+                                           RTUNI_ALPHA, /* U+00c560: */
+                                           RTUNI_ALPHA, /* U+00c561: */
+                                           RTUNI_ALPHA, /* U+00c562: */
+                                           RTUNI_ALPHA, /* U+00c563: */
+                                           RTUNI_ALPHA, /* U+00c564: */
+                                           RTUNI_ALPHA, /* U+00c565: */
+                                           RTUNI_ALPHA, /* U+00c566: */
+                                           RTUNI_ALPHA, /* U+00c567: */
+                                           RTUNI_ALPHA, /* U+00c568: */
+                                           RTUNI_ALPHA, /* U+00c569: */
+                                           RTUNI_ALPHA, /* U+00c56a: */
+                                           RTUNI_ALPHA, /* U+00c56b: */
+                                           RTUNI_ALPHA, /* U+00c56c: */
+                                           RTUNI_ALPHA, /* U+00c56d: */
+                                           RTUNI_ALPHA, /* U+00c56e: */
+                                           RTUNI_ALPHA, /* U+00c56f: */
+                                           RTUNI_ALPHA, /* U+00c570: */
+                                           RTUNI_ALPHA, /* U+00c571: */
+                                           RTUNI_ALPHA, /* U+00c572: */
+                                           RTUNI_ALPHA, /* U+00c573: */
+                                           RTUNI_ALPHA, /* U+00c574: */
+                                           RTUNI_ALPHA, /* U+00c575: */
+                                           RTUNI_ALPHA, /* U+00c576: */
+                                           RTUNI_ALPHA, /* U+00c577: */
+                                           RTUNI_ALPHA, /* U+00c578: */
+                                           RTUNI_ALPHA, /* U+00c579: */
+                                           RTUNI_ALPHA, /* U+00c57a: */
+                                           RTUNI_ALPHA, /* U+00c57b: */
+                                           RTUNI_ALPHA, /* U+00c57c: */
+                                           RTUNI_ALPHA, /* U+00c57d: */
+                                           RTUNI_ALPHA, /* U+00c57e: */
+                                           RTUNI_ALPHA, /* U+00c57f: */
+                                           RTUNI_ALPHA, /* U+00c580: */
+                                           RTUNI_ALPHA, /* U+00c581: */
+                                           RTUNI_ALPHA, /* U+00c582: */
+                                           RTUNI_ALPHA, /* U+00c583: */
+                                           RTUNI_ALPHA, /* U+00c584: */
+                                           RTUNI_ALPHA, /* U+00c585: */
+                                           RTUNI_ALPHA, /* U+00c586: */
+                                           RTUNI_ALPHA, /* U+00c587: */
+                                           RTUNI_ALPHA, /* U+00c588: */
+                                           RTUNI_ALPHA, /* U+00c589: */
+                                           RTUNI_ALPHA, /* U+00c58a: */
+                                           RTUNI_ALPHA, /* U+00c58b: */
+                                           RTUNI_ALPHA, /* U+00c58c: */
+                                           RTUNI_ALPHA, /* U+00c58d: */
+                                           RTUNI_ALPHA, /* U+00c58e: */
+                                           RTUNI_ALPHA, /* U+00c58f: */
+                                           RTUNI_ALPHA, /* U+00c590: */
+                                           RTUNI_ALPHA, /* U+00c591: */
+                                           RTUNI_ALPHA, /* U+00c592: */
+                                           RTUNI_ALPHA, /* U+00c593: */
+                                           RTUNI_ALPHA, /* U+00c594: */
+                                           RTUNI_ALPHA, /* U+00c595: */
+                                           RTUNI_ALPHA, /* U+00c596: */
+                                           RTUNI_ALPHA, /* U+00c597: */
+                                           RTUNI_ALPHA, /* U+00c598: */
+                                           RTUNI_ALPHA, /* U+00c599: */
+                                           RTUNI_ALPHA, /* U+00c59a: */
+                                           RTUNI_ALPHA, /* U+00c59b: */
+                                           RTUNI_ALPHA, /* U+00c59c: */
+                                           RTUNI_ALPHA, /* U+00c59d: */
+                                           RTUNI_ALPHA, /* U+00c59e: */
+                                           RTUNI_ALPHA, /* U+00c59f: */
+                                           RTUNI_ALPHA, /* U+00c5a0: */
+                                           RTUNI_ALPHA, /* U+00c5a1: */
+                                           RTUNI_ALPHA, /* U+00c5a2: */
+                                           RTUNI_ALPHA, /* U+00c5a3: */
+                                           RTUNI_ALPHA, /* U+00c5a4: */
+                                           RTUNI_ALPHA, /* U+00c5a5: */
+                                           RTUNI_ALPHA, /* U+00c5a6: */
+                                           RTUNI_ALPHA, /* U+00c5a7: */
+                                           RTUNI_ALPHA, /* U+00c5a8: */
+                                           RTUNI_ALPHA, /* U+00c5a9: */
+                                           RTUNI_ALPHA, /* U+00c5aa: */
+                                           RTUNI_ALPHA, /* U+00c5ab: */
+                                           RTUNI_ALPHA, /* U+00c5ac: */
+                                           RTUNI_ALPHA, /* U+00c5ad: */
+                                           RTUNI_ALPHA, /* U+00c5ae: */
+                                           RTUNI_ALPHA, /* U+00c5af: */
+                                           RTUNI_ALPHA, /* U+00c5b0: */
+                                           RTUNI_ALPHA, /* U+00c5b1: */
+                                           RTUNI_ALPHA, /* U+00c5b2: */
+                                           RTUNI_ALPHA, /* U+00c5b3: */
+                                           RTUNI_ALPHA, /* U+00c5b4: */
+                                           RTUNI_ALPHA, /* U+00c5b5: */
+                                           RTUNI_ALPHA, /* U+00c5b6: */
+                                           RTUNI_ALPHA, /* U+00c5b7: */
+                                           RTUNI_ALPHA, /* U+00c5b8: */
+                                           RTUNI_ALPHA, /* U+00c5b9: */
+                                           RTUNI_ALPHA, /* U+00c5ba: */
+                                           RTUNI_ALPHA, /* U+00c5bb: */
+                                           RTUNI_ALPHA, /* U+00c5bc: */
+                                           RTUNI_ALPHA, /* U+00c5bd: */
+                                           RTUNI_ALPHA, /* U+00c5be: */
+                                           RTUNI_ALPHA, /* U+00c5bf: */
+                                           RTUNI_ALPHA, /* U+00c5c0: */
+                                           RTUNI_ALPHA, /* U+00c5c1: */
+                                           RTUNI_ALPHA, /* U+00c5c2: */
+                                           RTUNI_ALPHA, /* U+00c5c3: */
+                                           RTUNI_ALPHA, /* U+00c5c4: */
+                                           RTUNI_ALPHA, /* U+00c5c5: */
+                                           RTUNI_ALPHA, /* U+00c5c6: */
+                                           RTUNI_ALPHA, /* U+00c5c7: */
+                                           RTUNI_ALPHA, /* U+00c5c8: */
+                                           RTUNI_ALPHA, /* U+00c5c9: */
+                                           RTUNI_ALPHA, /* U+00c5ca: */
+                                           RTUNI_ALPHA, /* U+00c5cb: */
+                                           RTUNI_ALPHA, /* U+00c5cc: */
+                                           RTUNI_ALPHA, /* U+00c5cd: */
+                                           RTUNI_ALPHA, /* U+00c5ce: */
+                                           RTUNI_ALPHA, /* U+00c5cf: */
+                                           RTUNI_ALPHA, /* U+00c5d0: */
+                                           RTUNI_ALPHA, /* U+00c5d1: */
+                                           RTUNI_ALPHA, /* U+00c5d2: */
+                                           RTUNI_ALPHA, /* U+00c5d3: */
+                                           RTUNI_ALPHA, /* U+00c5d4: */
+                                           RTUNI_ALPHA, /* U+00c5d5: */
+                                           RTUNI_ALPHA, /* U+00c5d6: */
+                                           RTUNI_ALPHA, /* U+00c5d7: */
+                                           RTUNI_ALPHA, /* U+00c5d8: */
+                                           RTUNI_ALPHA, /* U+00c5d9: */
+                                           RTUNI_ALPHA, /* U+00c5da: */
+                                           RTUNI_ALPHA, /* U+00c5db: */
+                                           RTUNI_ALPHA, /* U+00c5dc: */
+                                           RTUNI_ALPHA, /* U+00c5dd: */
+                                           RTUNI_ALPHA, /* U+00c5de: */
+                                           RTUNI_ALPHA, /* U+00c5df: */
+                                           RTUNI_ALPHA, /* U+00c5e0: */
+                                           RTUNI_ALPHA, /* U+00c5e1: */
+                                           RTUNI_ALPHA, /* U+00c5e2: */
+                                           RTUNI_ALPHA, /* U+00c5e3: */
+                                           RTUNI_ALPHA, /* U+00c5e4: */
+                                           RTUNI_ALPHA, /* U+00c5e5: */
+                                           RTUNI_ALPHA, /* U+00c5e6: */
+                                           RTUNI_ALPHA, /* U+00c5e7: */
+                                           RTUNI_ALPHA, /* U+00c5e8: */
+                                           RTUNI_ALPHA, /* U+00c5e9: */
+                                           RTUNI_ALPHA, /* U+00c5ea: */
+                                           RTUNI_ALPHA, /* U+00c5eb: */
+                                           RTUNI_ALPHA, /* U+00c5ec: */
+                                           RTUNI_ALPHA, /* U+00c5ed: */
+                                           RTUNI_ALPHA, /* U+00c5ee: */
+                                           RTUNI_ALPHA, /* U+00c5ef: */
+                                           RTUNI_ALPHA, /* U+00c5f0: */
+                                           RTUNI_ALPHA, /* U+00c5f1: */
+                                           RTUNI_ALPHA, /* U+00c5f2: */
+                                           RTUNI_ALPHA, /* U+00c5f3: */
+                                           RTUNI_ALPHA, /* U+00c5f4: */
+                                           RTUNI_ALPHA, /* U+00c5f5: */
+                                           RTUNI_ALPHA, /* U+00c5f6: */
+                                           RTUNI_ALPHA, /* U+00c5f7: */
+                                           RTUNI_ALPHA, /* U+00c5f8: */
+                                           RTUNI_ALPHA, /* U+00c5f9: */
+                                           RTUNI_ALPHA, /* U+00c5fa: */
+                                           RTUNI_ALPHA, /* U+00c5fb: */
+                                           RTUNI_ALPHA, /* U+00c5fc: */
+                                           RTUNI_ALPHA, /* U+00c5fd: */
+                                           RTUNI_ALPHA, /* U+00c5fe: */
+                                           RTUNI_ALPHA, /* U+00c5ff: */
+                                           RTUNI_ALPHA, /* U+00c600: */
+                                           RTUNI_ALPHA, /* U+00c601: */
+                                           RTUNI_ALPHA, /* U+00c602: */
+                                           RTUNI_ALPHA, /* U+00c603: */
+                                           RTUNI_ALPHA, /* U+00c604: */
+                                           RTUNI_ALPHA, /* U+00c605: */
+                                           RTUNI_ALPHA, /* U+00c606: */
+                                           RTUNI_ALPHA, /* U+00c607: */
+                                           RTUNI_ALPHA, /* U+00c608: */
+                                           RTUNI_ALPHA, /* U+00c609: */
+                                           RTUNI_ALPHA, /* U+00c60a: */
+                                           RTUNI_ALPHA, /* U+00c60b: */
+                                           RTUNI_ALPHA, /* U+00c60c: */
+                                           RTUNI_ALPHA, /* U+00c60d: */
+                                           RTUNI_ALPHA, /* U+00c60e: */
+                                           RTUNI_ALPHA, /* U+00c60f: */
+                                           RTUNI_ALPHA, /* U+00c610: */
+                                           RTUNI_ALPHA, /* U+00c611: */
+                                           RTUNI_ALPHA, /* U+00c612: */
+                                           RTUNI_ALPHA, /* U+00c613: */
+                                           RTUNI_ALPHA, /* U+00c614: */
+                                           RTUNI_ALPHA, /* U+00c615: */
+                                           RTUNI_ALPHA, /* U+00c616: */
+                                           RTUNI_ALPHA, /* U+00c617: */
+                                           RTUNI_ALPHA, /* U+00c618: */
+                                           RTUNI_ALPHA, /* U+00c619: */
+                                           RTUNI_ALPHA, /* U+00c61a: */
+                                           RTUNI_ALPHA, /* U+00c61b: */
+                                           RTUNI_ALPHA, /* U+00c61c: */
+                                           RTUNI_ALPHA, /* U+00c61d: */
+                                           RTUNI_ALPHA, /* U+00c61e: */
+                                           RTUNI_ALPHA, /* U+00c61f: */
+                                           RTUNI_ALPHA, /* U+00c620: */
+                                           RTUNI_ALPHA, /* U+00c621: */
+                                           RTUNI_ALPHA, /* U+00c622: */
+                                           RTUNI_ALPHA, /* U+00c623: */
+                                           RTUNI_ALPHA, /* U+00c624: */
+                                           RTUNI_ALPHA, /* U+00c625: */
+                                           RTUNI_ALPHA, /* U+00c626: */
+                                           RTUNI_ALPHA, /* U+00c627: */
+                                           RTUNI_ALPHA, /* U+00c628: */
+                                           RTUNI_ALPHA, /* U+00c629: */
+                                           RTUNI_ALPHA, /* U+00c62a: */
+                                           RTUNI_ALPHA, /* U+00c62b: */
+                                           RTUNI_ALPHA, /* U+00c62c: */
+                                           RTUNI_ALPHA, /* U+00c62d: */
+                                           RTUNI_ALPHA, /* U+00c62e: */
+                                           RTUNI_ALPHA, /* U+00c62f: */
+                                           RTUNI_ALPHA, /* U+00c630: */
+                                           RTUNI_ALPHA, /* U+00c631: */
+                                           RTUNI_ALPHA, /* U+00c632: */
+                                           RTUNI_ALPHA, /* U+00c633: */
+                                           RTUNI_ALPHA, /* U+00c634: */
+                                           RTUNI_ALPHA, /* U+00c635: */
+                                           RTUNI_ALPHA, /* U+00c636: */
+                                           RTUNI_ALPHA, /* U+00c637: */
+                                           RTUNI_ALPHA, /* U+00c638: */
+                                           RTUNI_ALPHA, /* U+00c639: */
+                                           RTUNI_ALPHA, /* U+00c63a: */
+                                           RTUNI_ALPHA, /* U+00c63b: */
+                                           RTUNI_ALPHA, /* U+00c63c: */
+                                           RTUNI_ALPHA, /* U+00c63d: */
+                                           RTUNI_ALPHA, /* U+00c63e: */
+                                           RTUNI_ALPHA, /* U+00c63f: */
+                                           RTUNI_ALPHA, /* U+00c640: */
+                                           RTUNI_ALPHA, /* U+00c641: */
+                                           RTUNI_ALPHA, /* U+00c642: */
+                                           RTUNI_ALPHA, /* U+00c643: */
+                                           RTUNI_ALPHA, /* U+00c644: */
+                                           RTUNI_ALPHA, /* U+00c645: */
+                                           RTUNI_ALPHA, /* U+00c646: */
+                                           RTUNI_ALPHA, /* U+00c647: */
+                                           RTUNI_ALPHA, /* U+00c648: */
+                                           RTUNI_ALPHA, /* U+00c649: */
+                                           RTUNI_ALPHA, /* U+00c64a: */
+                                           RTUNI_ALPHA, /* U+00c64b: */
+                                           RTUNI_ALPHA, /* U+00c64c: */
+                                           RTUNI_ALPHA, /* U+00c64d: */
+                                           RTUNI_ALPHA, /* U+00c64e: */
+                                           RTUNI_ALPHA, /* U+00c64f: */
+                                           RTUNI_ALPHA, /* U+00c650: */
+                                           RTUNI_ALPHA, /* U+00c651: */
+                                           RTUNI_ALPHA, /* U+00c652: */
+                                           RTUNI_ALPHA, /* U+00c653: */
+                                           RTUNI_ALPHA, /* U+00c654: */
+                                           RTUNI_ALPHA, /* U+00c655: */
+                                           RTUNI_ALPHA, /* U+00c656: */
+                                           RTUNI_ALPHA, /* U+00c657: */
+                                           RTUNI_ALPHA, /* U+00c658: */
+                                           RTUNI_ALPHA, /* U+00c659: */
+                                           RTUNI_ALPHA, /* U+00c65a: */
+                                           RTUNI_ALPHA, /* U+00c65b: */
+                                           RTUNI_ALPHA, /* U+00c65c: */
+                                           RTUNI_ALPHA, /* U+00c65d: */
+                                           RTUNI_ALPHA, /* U+00c65e: */
+                                           RTUNI_ALPHA, /* U+00c65f: */
+                                           RTUNI_ALPHA, /* U+00c660: */
+                                           RTUNI_ALPHA, /* U+00c661: */
+                                           RTUNI_ALPHA, /* U+00c662: */
+                                           RTUNI_ALPHA, /* U+00c663: */
+                                           RTUNI_ALPHA, /* U+00c664: */
+                                           RTUNI_ALPHA, /* U+00c665: */
+                                           RTUNI_ALPHA, /* U+00c666: */
+                                           RTUNI_ALPHA, /* U+00c667: */
+                                           RTUNI_ALPHA, /* U+00c668: */
+                                           RTUNI_ALPHA, /* U+00c669: */
+                                           RTUNI_ALPHA, /* U+00c66a: */
+                                           RTUNI_ALPHA, /* U+00c66b: */
+                                           RTUNI_ALPHA, /* U+00c66c: */
+                                           RTUNI_ALPHA, /* U+00c66d: */
+                                           RTUNI_ALPHA, /* U+00c66e: */
+                                           RTUNI_ALPHA, /* U+00c66f: */
+                                           RTUNI_ALPHA, /* U+00c670: */
+                                           RTUNI_ALPHA, /* U+00c671: */
+                                           RTUNI_ALPHA, /* U+00c672: */
+                                           RTUNI_ALPHA, /* U+00c673: */
+                                           RTUNI_ALPHA, /* U+00c674: */
+                                           RTUNI_ALPHA, /* U+00c675: */
+                                           RTUNI_ALPHA, /* U+00c676: */
+                                           RTUNI_ALPHA, /* U+00c677: */
+                                           RTUNI_ALPHA, /* U+00c678: */
+                                           RTUNI_ALPHA, /* U+00c679: */
+                                           RTUNI_ALPHA, /* U+00c67a: */
+                                           RTUNI_ALPHA, /* U+00c67b: */
+                                           RTUNI_ALPHA, /* U+00c67c: */
+                                           RTUNI_ALPHA, /* U+00c67d: */
+                                           RTUNI_ALPHA, /* U+00c67e: */
+                                           RTUNI_ALPHA, /* U+00c67f: */
+                                           RTUNI_ALPHA, /* U+00c680: */
+                                           RTUNI_ALPHA, /* U+00c681: */
+                                           RTUNI_ALPHA, /* U+00c682: */
+                                           RTUNI_ALPHA, /* U+00c683: */
+                                           RTUNI_ALPHA, /* U+00c684: */
+                                           RTUNI_ALPHA, /* U+00c685: */
+                                           RTUNI_ALPHA, /* U+00c686: */
+                                           RTUNI_ALPHA, /* U+00c687: */
+                                           RTUNI_ALPHA, /* U+00c688: */
+                                           RTUNI_ALPHA, /* U+00c689: */
+                                           RTUNI_ALPHA, /* U+00c68a: */
+                                           RTUNI_ALPHA, /* U+00c68b: */
+                                           RTUNI_ALPHA, /* U+00c68c: */
+                                           RTUNI_ALPHA, /* U+00c68d: */
+                                           RTUNI_ALPHA, /* U+00c68e: */
+                                           RTUNI_ALPHA, /* U+00c68f: */
+                                           RTUNI_ALPHA, /* U+00c690: */
+                                           RTUNI_ALPHA, /* U+00c691: */
+                                           RTUNI_ALPHA, /* U+00c692: */
+                                           RTUNI_ALPHA, /* U+00c693: */
+                                           RTUNI_ALPHA, /* U+00c694: */
+                                           RTUNI_ALPHA, /* U+00c695: */
+                                           RTUNI_ALPHA, /* U+00c696: */
+                                           RTUNI_ALPHA, /* U+00c697: */
+                                           RTUNI_ALPHA, /* U+00c698: */
+                                           RTUNI_ALPHA, /* U+00c699: */
+                                           RTUNI_ALPHA, /* U+00c69a: */
+                                           RTUNI_ALPHA, /* U+00c69b: */
+                                           RTUNI_ALPHA, /* U+00c69c: */
+                                           RTUNI_ALPHA, /* U+00c69d: */
+                                           RTUNI_ALPHA, /* U+00c69e: */
+                                           RTUNI_ALPHA, /* U+00c69f: */
+                                           RTUNI_ALPHA, /* U+00c6a0: */
+                                           RTUNI_ALPHA, /* U+00c6a1: */
+                                           RTUNI_ALPHA, /* U+00c6a2: */
+                                           RTUNI_ALPHA, /* U+00c6a3: */
+                                           RTUNI_ALPHA, /* U+00c6a4: */
+                                           RTUNI_ALPHA, /* U+00c6a5: */
+                                           RTUNI_ALPHA, /* U+00c6a6: */
+                                           RTUNI_ALPHA, /* U+00c6a7: */
+                                           RTUNI_ALPHA, /* U+00c6a8: */
+                                           RTUNI_ALPHA, /* U+00c6a9: */
+                                           RTUNI_ALPHA, /* U+00c6aa: */
+                                           RTUNI_ALPHA, /* U+00c6ab: */
+                                           RTUNI_ALPHA, /* U+00c6ac: */
+                                           RTUNI_ALPHA, /* U+00c6ad: */
+                                           RTUNI_ALPHA, /* U+00c6ae: */
+                                           RTUNI_ALPHA, /* U+00c6af: */
+                                           RTUNI_ALPHA, /* U+00c6b0: */
+                                           RTUNI_ALPHA, /* U+00c6b1: */
+                                           RTUNI_ALPHA, /* U+00c6b2: */
+                                           RTUNI_ALPHA, /* U+00c6b3: */
+                                           RTUNI_ALPHA, /* U+00c6b4: */
+                                           RTUNI_ALPHA, /* U+00c6b5: */
+                                           RTUNI_ALPHA, /* U+00c6b6: */
+                                           RTUNI_ALPHA, /* U+00c6b7: */
+                                           RTUNI_ALPHA, /* U+00c6b8: */
+                                           RTUNI_ALPHA, /* U+00c6b9: */
+                                           RTUNI_ALPHA, /* U+00c6ba: */
+                                           RTUNI_ALPHA, /* U+00c6bb: */
+                                           RTUNI_ALPHA, /* U+00c6bc: */
+                                           RTUNI_ALPHA, /* U+00c6bd: */
+                                           RTUNI_ALPHA, /* U+00c6be: */
+                                           RTUNI_ALPHA, /* U+00c6bf: */
+                                           RTUNI_ALPHA, /* U+00c6c0: */
+                                           RTUNI_ALPHA, /* U+00c6c1: */
+                                           RTUNI_ALPHA, /* U+00c6c2: */
+                                           RTUNI_ALPHA, /* U+00c6c3: */
+                                           RTUNI_ALPHA, /* U+00c6c4: */
+                                           RTUNI_ALPHA, /* U+00c6c5: */
+                                           RTUNI_ALPHA, /* U+00c6c6: */
+                                           RTUNI_ALPHA, /* U+00c6c7: */
+                                           RTUNI_ALPHA, /* U+00c6c8: */
+                                           RTUNI_ALPHA, /* U+00c6c9: */
+                                           RTUNI_ALPHA, /* U+00c6ca: */
+                                           RTUNI_ALPHA, /* U+00c6cb: */
+                                           RTUNI_ALPHA, /* U+00c6cc: */
+                                           RTUNI_ALPHA, /* U+00c6cd: */
+                                           RTUNI_ALPHA, /* U+00c6ce: */
+                                           RTUNI_ALPHA, /* U+00c6cf: */
+                                           RTUNI_ALPHA, /* U+00c6d0: */
+                                           RTUNI_ALPHA, /* U+00c6d1: */
+                                           RTUNI_ALPHA, /* U+00c6d2: */
+                                           RTUNI_ALPHA, /* U+00c6d3: */
+                                           RTUNI_ALPHA, /* U+00c6d4: */
+                                           RTUNI_ALPHA, /* U+00c6d5: */
+                                           RTUNI_ALPHA, /* U+00c6d6: */
+                                           RTUNI_ALPHA, /* U+00c6d7: */
+                                           RTUNI_ALPHA, /* U+00c6d8: */
+                                           RTUNI_ALPHA, /* U+00c6d9: */
+                                           RTUNI_ALPHA, /* U+00c6da: */
+                                           RTUNI_ALPHA, /* U+00c6db: */
+                                           RTUNI_ALPHA, /* U+00c6dc: */
+                                           RTUNI_ALPHA, /* U+00c6dd: */
+                                           RTUNI_ALPHA, /* U+00c6de: */
+                                           RTUNI_ALPHA, /* U+00c6df: */
+                                           RTUNI_ALPHA, /* U+00c6e0: */
+                                           RTUNI_ALPHA, /* U+00c6e1: */
+                                           RTUNI_ALPHA, /* U+00c6e2: */
+                                           RTUNI_ALPHA, /* U+00c6e3: */
+                                           RTUNI_ALPHA, /* U+00c6e4: */
+                                           RTUNI_ALPHA, /* U+00c6e5: */
+                                           RTUNI_ALPHA, /* U+00c6e6: */
+                                           RTUNI_ALPHA, /* U+00c6e7: */
+                                           RTUNI_ALPHA, /* U+00c6e8: */
+                                           RTUNI_ALPHA, /* U+00c6e9: */
+                                           RTUNI_ALPHA, /* U+00c6ea: */
+                                           RTUNI_ALPHA, /* U+00c6eb: */
+                                           RTUNI_ALPHA, /* U+00c6ec: */
+                                           RTUNI_ALPHA, /* U+00c6ed: */
+                                           RTUNI_ALPHA, /* U+00c6ee: */
+                                           RTUNI_ALPHA, /* U+00c6ef: */
+                                           RTUNI_ALPHA, /* U+00c6f0: */
+                                           RTUNI_ALPHA, /* U+00c6f1: */
+                                           RTUNI_ALPHA, /* U+00c6f2: */
+                                           RTUNI_ALPHA, /* U+00c6f3: */
+                                           RTUNI_ALPHA, /* U+00c6f4: */
+                                           RTUNI_ALPHA, /* U+00c6f5: */
+                                           RTUNI_ALPHA, /* U+00c6f6: */
+                                           RTUNI_ALPHA, /* U+00c6f7: */
+                                           RTUNI_ALPHA, /* U+00c6f8: */
+                                           RTUNI_ALPHA, /* U+00c6f9: */
+                                           RTUNI_ALPHA, /* U+00c6fa: */
+                                           RTUNI_ALPHA, /* U+00c6fb: */
+                                           RTUNI_ALPHA, /* U+00c6fc: */
+                                           RTUNI_ALPHA, /* U+00c6fd: */
+                                           RTUNI_ALPHA, /* U+00c6fe: */
+                                           RTUNI_ALPHA, /* U+00c6ff: */
+                                           RTUNI_ALPHA, /* U+00c700: */
+                                           RTUNI_ALPHA, /* U+00c701: */
+                                           RTUNI_ALPHA, /* U+00c702: */
+                                           RTUNI_ALPHA, /* U+00c703: */
+                                           RTUNI_ALPHA, /* U+00c704: */
+                                           RTUNI_ALPHA, /* U+00c705: */
+                                           RTUNI_ALPHA, /* U+00c706: */
+                                           RTUNI_ALPHA, /* U+00c707: */
+                                           RTUNI_ALPHA, /* U+00c708: */
+                                           RTUNI_ALPHA, /* U+00c709: */
+                                           RTUNI_ALPHA, /* U+00c70a: */
+                                           RTUNI_ALPHA, /* U+00c70b: */
+                                           RTUNI_ALPHA, /* U+00c70c: */
+                                           RTUNI_ALPHA, /* U+00c70d: */
+                                           RTUNI_ALPHA, /* U+00c70e: */
+                                           RTUNI_ALPHA, /* U+00c70f: */
+                                           RTUNI_ALPHA, /* U+00c710: */
+                                           RTUNI_ALPHA, /* U+00c711: */
+                                           RTUNI_ALPHA, /* U+00c712: */
+                                           RTUNI_ALPHA, /* U+00c713: */
+                                           RTUNI_ALPHA, /* U+00c714: */
+                                           RTUNI_ALPHA, /* U+00c715: */
+                                           RTUNI_ALPHA, /* U+00c716: */
+                                           RTUNI_ALPHA, /* U+00c717: */
+                                           RTUNI_ALPHA, /* U+00c718: */
+                                           RTUNI_ALPHA, /* U+00c719: */
+                                           RTUNI_ALPHA, /* U+00c71a: */
+                                           RTUNI_ALPHA, /* U+00c71b: */
+                                           RTUNI_ALPHA, /* U+00c71c: */
+                                           RTUNI_ALPHA, /* U+00c71d: */
+                                           RTUNI_ALPHA, /* U+00c71e: */
+                                           RTUNI_ALPHA, /* U+00c71f: */
+                                           RTUNI_ALPHA, /* U+00c720: */
+                                           RTUNI_ALPHA, /* U+00c721: */
+                                           RTUNI_ALPHA, /* U+00c722: */
+                                           RTUNI_ALPHA, /* U+00c723: */
+                                           RTUNI_ALPHA, /* U+00c724: */
+                                           RTUNI_ALPHA, /* U+00c725: */
+                                           RTUNI_ALPHA, /* U+00c726: */
+                                           RTUNI_ALPHA, /* U+00c727: */
+                                           RTUNI_ALPHA, /* U+00c728: */
+                                           RTUNI_ALPHA, /* U+00c729: */
+                                           RTUNI_ALPHA, /* U+00c72a: */
+                                           RTUNI_ALPHA, /* U+00c72b: */
+                                           RTUNI_ALPHA, /* U+00c72c: */
+                                           RTUNI_ALPHA, /* U+00c72d: */
+                                           RTUNI_ALPHA, /* U+00c72e: */
+                                           RTUNI_ALPHA, /* U+00c72f: */
+                                           RTUNI_ALPHA, /* U+00c730: */
+                                           RTUNI_ALPHA, /* U+00c731: */
+                                           RTUNI_ALPHA, /* U+00c732: */
+                                           RTUNI_ALPHA, /* U+00c733: */
+                                           RTUNI_ALPHA, /* U+00c734: */
+                                           RTUNI_ALPHA, /* U+00c735: */
+                                           RTUNI_ALPHA, /* U+00c736: */
+                                           RTUNI_ALPHA, /* U+00c737: */
+                                           RTUNI_ALPHA, /* U+00c738: */
+                                           RTUNI_ALPHA, /* U+00c739: */
+                                           RTUNI_ALPHA, /* U+00c73a: */
+                                           RTUNI_ALPHA, /* U+00c73b: */
+                                           RTUNI_ALPHA, /* U+00c73c: */
+                                           RTUNI_ALPHA, /* U+00c73d: */
+                                           RTUNI_ALPHA, /* U+00c73e: */
+                                           RTUNI_ALPHA, /* U+00c73f: */
+                                           RTUNI_ALPHA, /* U+00c740: */
+                                           RTUNI_ALPHA, /* U+00c741: */
+                                           RTUNI_ALPHA, /* U+00c742: */
+                                           RTUNI_ALPHA, /* U+00c743: */
+                                           RTUNI_ALPHA, /* U+00c744: */
+                                           RTUNI_ALPHA, /* U+00c745: */
+                                           RTUNI_ALPHA, /* U+00c746: */
+                                           RTUNI_ALPHA, /* U+00c747: */
+                                           RTUNI_ALPHA, /* U+00c748: */
+                                           RTUNI_ALPHA, /* U+00c749: */
+                                           RTUNI_ALPHA, /* U+00c74a: */
+                                           RTUNI_ALPHA, /* U+00c74b: */
+                                           RTUNI_ALPHA, /* U+00c74c: */
+                                           RTUNI_ALPHA, /* U+00c74d: */
+                                           RTUNI_ALPHA, /* U+00c74e: */
+                                           RTUNI_ALPHA, /* U+00c74f: */
+                                           RTUNI_ALPHA, /* U+00c750: */
+                                           RTUNI_ALPHA, /* U+00c751: */
+                                           RTUNI_ALPHA, /* U+00c752: */
+                                           RTUNI_ALPHA, /* U+00c753: */
+                                           RTUNI_ALPHA, /* U+00c754: */
+                                           RTUNI_ALPHA, /* U+00c755: */
+                                           RTUNI_ALPHA, /* U+00c756: */
+                                           RTUNI_ALPHA, /* U+00c757: */
+                                           RTUNI_ALPHA, /* U+00c758: */
+                                           RTUNI_ALPHA, /* U+00c759: */
+                                           RTUNI_ALPHA, /* U+00c75a: */
+                                           RTUNI_ALPHA, /* U+00c75b: */
+                                           RTUNI_ALPHA, /* U+00c75c: */
+                                           RTUNI_ALPHA, /* U+00c75d: */
+                                           RTUNI_ALPHA, /* U+00c75e: */
+                                           RTUNI_ALPHA, /* U+00c75f: */
+                                           RTUNI_ALPHA, /* U+00c760: */
+                                           RTUNI_ALPHA, /* U+00c761: */
+                                           RTUNI_ALPHA, /* U+00c762: */
+                                           RTUNI_ALPHA, /* U+00c763: */
+                                           RTUNI_ALPHA, /* U+00c764: */
+                                           RTUNI_ALPHA, /* U+00c765: */
+                                           RTUNI_ALPHA, /* U+00c766: */
+                                           RTUNI_ALPHA, /* U+00c767: */
+                                           RTUNI_ALPHA, /* U+00c768: */
+                                           RTUNI_ALPHA, /* U+00c769: */
+                                           RTUNI_ALPHA, /* U+00c76a: */
+                                           RTUNI_ALPHA, /* U+00c76b: */
+                                           RTUNI_ALPHA, /* U+00c76c: */
+                                           RTUNI_ALPHA, /* U+00c76d: */
+                                           RTUNI_ALPHA, /* U+00c76e: */
+                                           RTUNI_ALPHA, /* U+00c76f: */
+                                           RTUNI_ALPHA, /* U+00c770: */
+                                           RTUNI_ALPHA, /* U+00c771: */
+                                           RTUNI_ALPHA, /* U+00c772: */
+                                           RTUNI_ALPHA, /* U+00c773: */
+                                           RTUNI_ALPHA, /* U+00c774: */
+                                           RTUNI_ALPHA, /* U+00c775: */
+                                           RTUNI_ALPHA, /* U+00c776: */
+                                           RTUNI_ALPHA, /* U+00c777: */
+                                           RTUNI_ALPHA, /* U+00c778: */
+                                           RTUNI_ALPHA, /* U+00c779: */
+                                           RTUNI_ALPHA, /* U+00c77a: */
+                                           RTUNI_ALPHA, /* U+00c77b: */
+                                           RTUNI_ALPHA, /* U+00c77c: */
+                                           RTUNI_ALPHA, /* U+00c77d: */
+                                           RTUNI_ALPHA, /* U+00c77e: */
+                                           RTUNI_ALPHA, /* U+00c77f: */
+                                           RTUNI_ALPHA, /* U+00c780: */
+                                           RTUNI_ALPHA, /* U+00c781: */
+                                           RTUNI_ALPHA, /* U+00c782: */
+                                           RTUNI_ALPHA, /* U+00c783: */
+                                           RTUNI_ALPHA, /* U+00c784: */
+                                           RTUNI_ALPHA, /* U+00c785: */
+                                           RTUNI_ALPHA, /* U+00c786: */
+                                           RTUNI_ALPHA, /* U+00c787: */
+                                           RTUNI_ALPHA, /* U+00c788: */
+                                           RTUNI_ALPHA, /* U+00c789: */
+                                           RTUNI_ALPHA, /* U+00c78a: */
+                                           RTUNI_ALPHA, /* U+00c78b: */
+                                           RTUNI_ALPHA, /* U+00c78c: */
+                                           RTUNI_ALPHA, /* U+00c78d: */
+                                           RTUNI_ALPHA, /* U+00c78e: */
+                                           RTUNI_ALPHA, /* U+00c78f: */
+                                           RTUNI_ALPHA, /* U+00c790: */
+                                           RTUNI_ALPHA, /* U+00c791: */
+                                           RTUNI_ALPHA, /* U+00c792: */
+                                           RTUNI_ALPHA, /* U+00c793: */
+                                           RTUNI_ALPHA, /* U+00c794: */
+                                           RTUNI_ALPHA, /* U+00c795: */
+                                           RTUNI_ALPHA, /* U+00c796: */
+                                           RTUNI_ALPHA, /* U+00c797: */
+                                           RTUNI_ALPHA, /* U+00c798: */
+                                           RTUNI_ALPHA, /* U+00c799: */
+                                           RTUNI_ALPHA, /* U+00c79a: */
+                                           RTUNI_ALPHA, /* U+00c79b: */
+                                           RTUNI_ALPHA, /* U+00c79c: */
+                                           RTUNI_ALPHA, /* U+00c79d: */
+                                           RTUNI_ALPHA, /* U+00c79e: */
+                                           RTUNI_ALPHA, /* U+00c79f: */
+                                           RTUNI_ALPHA, /* U+00c7a0: */
+                                           RTUNI_ALPHA, /* U+00c7a1: */
+                                           RTUNI_ALPHA, /* U+00c7a2: */
+                                           RTUNI_ALPHA, /* U+00c7a3: */
+                                           RTUNI_ALPHA, /* U+00c7a4: */
+                                           RTUNI_ALPHA, /* U+00c7a5: */
+                                           RTUNI_ALPHA, /* U+00c7a6: */
+                                           RTUNI_ALPHA, /* U+00c7a7: */
+                                           RTUNI_ALPHA, /* U+00c7a8: */
+                                           RTUNI_ALPHA, /* U+00c7a9: */
+                                           RTUNI_ALPHA, /* U+00c7aa: */
+                                           RTUNI_ALPHA, /* U+00c7ab: */
+                                           RTUNI_ALPHA, /* U+00c7ac: */
+                                           RTUNI_ALPHA, /* U+00c7ad: */
+                                           RTUNI_ALPHA, /* U+00c7ae: */
+                                           RTUNI_ALPHA, /* U+00c7af: */
+                                           RTUNI_ALPHA, /* U+00c7b0: */
+                                           RTUNI_ALPHA, /* U+00c7b1: */
+                                           RTUNI_ALPHA, /* U+00c7b2: */
+                                           RTUNI_ALPHA, /* U+00c7b3: */
+                                           RTUNI_ALPHA, /* U+00c7b4: */
+                                           RTUNI_ALPHA, /* U+00c7b5: */
+                                           RTUNI_ALPHA, /* U+00c7b6: */
+                                           RTUNI_ALPHA, /* U+00c7b7: */
+                                           RTUNI_ALPHA, /* U+00c7b8: */
+                                           RTUNI_ALPHA, /* U+00c7b9: */
+                                           RTUNI_ALPHA, /* U+00c7ba: */
+                                           RTUNI_ALPHA, /* U+00c7bb: */
+                                           RTUNI_ALPHA, /* U+00c7bc: */
+                                           RTUNI_ALPHA, /* U+00c7bd: */
+                                           RTUNI_ALPHA, /* U+00c7be: */
+                                           RTUNI_ALPHA, /* U+00c7bf: */
+                                           RTUNI_ALPHA, /* U+00c7c0: */
+                                           RTUNI_ALPHA, /* U+00c7c1: */
+                                           RTUNI_ALPHA, /* U+00c7c2: */
+                                           RTUNI_ALPHA, /* U+00c7c3: */
+                                           RTUNI_ALPHA, /* U+00c7c4: */
+                                           RTUNI_ALPHA, /* U+00c7c5: */
+                                           RTUNI_ALPHA, /* U+00c7c6: */
+                                           RTUNI_ALPHA, /* U+00c7c7: */
+                                           RTUNI_ALPHA, /* U+00c7c8: */
+                                           RTUNI_ALPHA, /* U+00c7c9: */
+                                           RTUNI_ALPHA, /* U+00c7ca: */
+                                           RTUNI_ALPHA, /* U+00c7cb: */
+                                           RTUNI_ALPHA, /* U+00c7cc: */
+                                           RTUNI_ALPHA, /* U+00c7cd: */
+                                           RTUNI_ALPHA, /* U+00c7ce: */
+                                           RTUNI_ALPHA, /* U+00c7cf: */
+                                           RTUNI_ALPHA, /* U+00c7d0: */
+                                           RTUNI_ALPHA, /* U+00c7d1: */
+                                           RTUNI_ALPHA, /* U+00c7d2: */
+                                           RTUNI_ALPHA, /* U+00c7d3: */
+                                           RTUNI_ALPHA, /* U+00c7d4: */
+                                           RTUNI_ALPHA, /* U+00c7d5: */
+                                           RTUNI_ALPHA, /* U+00c7d6: */
+                                           RTUNI_ALPHA, /* U+00c7d7: */
+                                           RTUNI_ALPHA, /* U+00c7d8: */
+                                           RTUNI_ALPHA, /* U+00c7d9: */
+                                           RTUNI_ALPHA, /* U+00c7da: */
+                                           RTUNI_ALPHA, /* U+00c7db: */
+                                           RTUNI_ALPHA, /* U+00c7dc: */
+                                           RTUNI_ALPHA, /* U+00c7dd: */
+                                           RTUNI_ALPHA, /* U+00c7de: */
+                                           RTUNI_ALPHA, /* U+00c7df: */
+                                           RTUNI_ALPHA, /* U+00c7e0: */
+                                           RTUNI_ALPHA, /* U+00c7e1: */
+                                           RTUNI_ALPHA, /* U+00c7e2: */
+                                           RTUNI_ALPHA, /* U+00c7e3: */
+                                           RTUNI_ALPHA, /* U+00c7e4: */
+                                           RTUNI_ALPHA, /* U+00c7e5: */
+                                           RTUNI_ALPHA, /* U+00c7e6: */
+                                           RTUNI_ALPHA, /* U+00c7e7: */
+                                           RTUNI_ALPHA, /* U+00c7e8: */
+                                           RTUNI_ALPHA, /* U+00c7e9: */
+                                           RTUNI_ALPHA, /* U+00c7ea: */
+                                           RTUNI_ALPHA, /* U+00c7eb: */
+                                           RTUNI_ALPHA, /* U+00c7ec: */
+                                           RTUNI_ALPHA, /* U+00c7ed: */
+                                           RTUNI_ALPHA, /* U+00c7ee: */
+                                           RTUNI_ALPHA, /* U+00c7ef: */
+                                           RTUNI_ALPHA, /* U+00c7f0: */
+                                           RTUNI_ALPHA, /* U+00c7f1: */
+                                           RTUNI_ALPHA, /* U+00c7f2: */
+                                           RTUNI_ALPHA, /* U+00c7f3: */
+                                           RTUNI_ALPHA, /* U+00c7f4: */
+                                           RTUNI_ALPHA, /* U+00c7f5: */
+                                           RTUNI_ALPHA, /* U+00c7f6: */
+                                           RTUNI_ALPHA, /* U+00c7f7: */
+                                           RTUNI_ALPHA, /* U+00c7f8: */
+                                           RTUNI_ALPHA, /* U+00c7f9: */
+                                           RTUNI_ALPHA, /* U+00c7fa: */
+                                           RTUNI_ALPHA, /* U+00c7fb: */
+                                           RTUNI_ALPHA, /* U+00c7fc: */
+                                           RTUNI_ALPHA, /* U+00c7fd: */
+                                           RTUNI_ALPHA, /* U+00c7fe: */
+                                           RTUNI_ALPHA, /* U+00c7ff: */
+                                           RTUNI_ALPHA, /* U+00c800: */
+                                           RTUNI_ALPHA, /* U+00c801: */
+                                           RTUNI_ALPHA, /* U+00c802: */
+                                           RTUNI_ALPHA, /* U+00c803: */
+                                           RTUNI_ALPHA, /* U+00c804: */
+                                           RTUNI_ALPHA, /* U+00c805: */
+                                           RTUNI_ALPHA, /* U+00c806: */
+                                           RTUNI_ALPHA, /* U+00c807: */
+                                           RTUNI_ALPHA, /* U+00c808: */
+                                           RTUNI_ALPHA, /* U+00c809: */
+                                           RTUNI_ALPHA, /* U+00c80a: */
+                                           RTUNI_ALPHA, /* U+00c80b: */
+                                           RTUNI_ALPHA, /* U+00c80c: */
+                                           RTUNI_ALPHA, /* U+00c80d: */
+                                           RTUNI_ALPHA, /* U+00c80e: */
+                                           RTUNI_ALPHA, /* U+00c80f: */
+                                           RTUNI_ALPHA, /* U+00c810: */
+                                           RTUNI_ALPHA, /* U+00c811: */
+                                           RTUNI_ALPHA, /* U+00c812: */
+                                           RTUNI_ALPHA, /* U+00c813: */
+                                           RTUNI_ALPHA, /* U+00c814: */
+                                           RTUNI_ALPHA, /* U+00c815: */
+                                           RTUNI_ALPHA, /* U+00c816: */
+                                           RTUNI_ALPHA, /* U+00c817: */
+                                           RTUNI_ALPHA, /* U+00c818: */
+                                           RTUNI_ALPHA, /* U+00c819: */
+                                           RTUNI_ALPHA, /* U+00c81a: */
+                                           RTUNI_ALPHA, /* U+00c81b: */
+                                           RTUNI_ALPHA, /* U+00c81c: */
+                                           RTUNI_ALPHA, /* U+00c81d: */
+                                           RTUNI_ALPHA, /* U+00c81e: */
+                                           RTUNI_ALPHA, /* U+00c81f: */
+                                           RTUNI_ALPHA, /* U+00c820: */
+                                           RTUNI_ALPHA, /* U+00c821: */
+                                           RTUNI_ALPHA, /* U+00c822: */
+                                           RTUNI_ALPHA, /* U+00c823: */
+                                           RTUNI_ALPHA, /* U+00c824: */
+                                           RTUNI_ALPHA, /* U+00c825: */
+                                           RTUNI_ALPHA, /* U+00c826: */
+                                           RTUNI_ALPHA, /* U+00c827: */
+                                           RTUNI_ALPHA, /* U+00c828: */
+                                           RTUNI_ALPHA, /* U+00c829: */
+                                           RTUNI_ALPHA, /* U+00c82a: */
+                                           RTUNI_ALPHA, /* U+00c82b: */
+                                           RTUNI_ALPHA, /* U+00c82c: */
+                                           RTUNI_ALPHA, /* U+00c82d: */
+                                           RTUNI_ALPHA, /* U+00c82e: */
+                                           RTUNI_ALPHA, /* U+00c82f: */
+                                           RTUNI_ALPHA, /* U+00c830: */
+                                           RTUNI_ALPHA, /* U+00c831: */
+                                           RTUNI_ALPHA, /* U+00c832: */
+                                           RTUNI_ALPHA, /* U+00c833: */
+                                           RTUNI_ALPHA, /* U+00c834: */
+                                           RTUNI_ALPHA, /* U+00c835: */
+                                           RTUNI_ALPHA, /* U+00c836: */
+                                           RTUNI_ALPHA, /* U+00c837: */
+                                           RTUNI_ALPHA, /* U+00c838: */
+                                           RTUNI_ALPHA, /* U+00c839: */
+                                           RTUNI_ALPHA, /* U+00c83a: */
+                                           RTUNI_ALPHA, /* U+00c83b: */
+                                           RTUNI_ALPHA, /* U+00c83c: */
+                                           RTUNI_ALPHA, /* U+00c83d: */
+                                           RTUNI_ALPHA, /* U+00c83e: */
+                                           RTUNI_ALPHA, /* U+00c83f: */
+                                           RTUNI_ALPHA, /* U+00c840: */
+                                           RTUNI_ALPHA, /* U+00c841: */
+                                           RTUNI_ALPHA, /* U+00c842: */
+                                           RTUNI_ALPHA, /* U+00c843: */
+                                           RTUNI_ALPHA, /* U+00c844: */
+                                           RTUNI_ALPHA, /* U+00c845: */
+                                           RTUNI_ALPHA, /* U+00c846: */
+                                           RTUNI_ALPHA, /* U+00c847: */
+                                           RTUNI_ALPHA, /* U+00c848: */
+                                           RTUNI_ALPHA, /* U+00c849: */
+                                           RTUNI_ALPHA, /* U+00c84a: */
+                                           RTUNI_ALPHA, /* U+00c84b: */
+                                           RTUNI_ALPHA, /* U+00c84c: */
+                                           RTUNI_ALPHA, /* U+00c84d: */
+                                           RTUNI_ALPHA, /* U+00c84e: */
+                                           RTUNI_ALPHA, /* U+00c84f: */
+                                           RTUNI_ALPHA, /* U+00c850: */
+                                           RTUNI_ALPHA, /* U+00c851: */
+                                           RTUNI_ALPHA, /* U+00c852: */
+                                           RTUNI_ALPHA, /* U+00c853: */
+                                           RTUNI_ALPHA, /* U+00c854: */
+                                           RTUNI_ALPHA, /* U+00c855: */
+                                           RTUNI_ALPHA, /* U+00c856: */
+                                           RTUNI_ALPHA, /* U+00c857: */
+                                           RTUNI_ALPHA, /* U+00c858: */
+                                           RTUNI_ALPHA, /* U+00c859: */
+                                           RTUNI_ALPHA, /* U+00c85a: */
+                                           RTUNI_ALPHA, /* U+00c85b: */
+                                           RTUNI_ALPHA, /* U+00c85c: */
+                                           RTUNI_ALPHA, /* U+00c85d: */
+                                           RTUNI_ALPHA, /* U+00c85e: */
+                                           RTUNI_ALPHA, /* U+00c85f: */
+                                           RTUNI_ALPHA, /* U+00c860: */
+                                           RTUNI_ALPHA, /* U+00c861: */
+                                           RTUNI_ALPHA, /* U+00c862: */
+                                           RTUNI_ALPHA, /* U+00c863: */
+                                           RTUNI_ALPHA, /* U+00c864: */
+                                           RTUNI_ALPHA, /* U+00c865: */
+                                           RTUNI_ALPHA, /* U+00c866: */
+                                           RTUNI_ALPHA, /* U+00c867: */
+                                           RTUNI_ALPHA, /* U+00c868: */
+                                           RTUNI_ALPHA, /* U+00c869: */
+                                           RTUNI_ALPHA, /* U+00c86a: */
+                                           RTUNI_ALPHA, /* U+00c86b: */
+                                           RTUNI_ALPHA, /* U+00c86c: */
+                                           RTUNI_ALPHA, /* U+00c86d: */
+                                           RTUNI_ALPHA, /* U+00c86e: */
+                                           RTUNI_ALPHA, /* U+00c86f: */
+                                           RTUNI_ALPHA, /* U+00c870: */
+                                           RTUNI_ALPHA, /* U+00c871: */
+                                           RTUNI_ALPHA, /* U+00c872: */
+                                           RTUNI_ALPHA, /* U+00c873: */
+                                           RTUNI_ALPHA, /* U+00c874: */
+                                           RTUNI_ALPHA, /* U+00c875: */
+                                           RTUNI_ALPHA, /* U+00c876: */
+                                           RTUNI_ALPHA, /* U+00c877: */
+                                           RTUNI_ALPHA, /* U+00c878: */
+                                           RTUNI_ALPHA, /* U+00c879: */
+                                           RTUNI_ALPHA, /* U+00c87a: */
+                                           RTUNI_ALPHA, /* U+00c87b: */
+                                           RTUNI_ALPHA, /* U+00c87c: */
+                                           RTUNI_ALPHA, /* U+00c87d: */
+                                           RTUNI_ALPHA, /* U+00c87e: */
+                                           RTUNI_ALPHA, /* U+00c87f: */
+                                           RTUNI_ALPHA, /* U+00c880: */
+                                           RTUNI_ALPHA, /* U+00c881: */
+                                           RTUNI_ALPHA, /* U+00c882: */
+                                           RTUNI_ALPHA, /* U+00c883: */
+                                           RTUNI_ALPHA, /* U+00c884: */
+                                           RTUNI_ALPHA, /* U+00c885: */
+                                           RTUNI_ALPHA, /* U+00c886: */
+                                           RTUNI_ALPHA, /* U+00c887: */
+                                           RTUNI_ALPHA, /* U+00c888: */
+                                           RTUNI_ALPHA, /* U+00c889: */
+                                           RTUNI_ALPHA, /* U+00c88a: */
+                                           RTUNI_ALPHA, /* U+00c88b: */
+                                           RTUNI_ALPHA, /* U+00c88c: */
+                                           RTUNI_ALPHA, /* U+00c88d: */
+                                           RTUNI_ALPHA, /* U+00c88e: */
+                                           RTUNI_ALPHA, /* U+00c88f: */
+                                           RTUNI_ALPHA, /* U+00c890: */
+                                           RTUNI_ALPHA, /* U+00c891: */
+                                           RTUNI_ALPHA, /* U+00c892: */
+                                           RTUNI_ALPHA, /* U+00c893: */
+                                           RTUNI_ALPHA, /* U+00c894: */
+                                           RTUNI_ALPHA, /* U+00c895: */
+                                           RTUNI_ALPHA, /* U+00c896: */
+                                           RTUNI_ALPHA, /* U+00c897: */
+                                           RTUNI_ALPHA, /* U+00c898: */
+                                           RTUNI_ALPHA, /* U+00c899: */
+                                           RTUNI_ALPHA, /* U+00c89a: */
+                                           RTUNI_ALPHA, /* U+00c89b: */
+                                           RTUNI_ALPHA, /* U+00c89c: */
+                                           RTUNI_ALPHA, /* U+00c89d: */
+                                           RTUNI_ALPHA, /* U+00c89e: */
+                                           RTUNI_ALPHA, /* U+00c89f: */
+                                           RTUNI_ALPHA, /* U+00c8a0: */
+                                           RTUNI_ALPHA, /* U+00c8a1: */
+                                           RTUNI_ALPHA, /* U+00c8a2: */
+                                           RTUNI_ALPHA, /* U+00c8a3: */
+                                           RTUNI_ALPHA, /* U+00c8a4: */
+                                           RTUNI_ALPHA, /* U+00c8a5: */
+                                           RTUNI_ALPHA, /* U+00c8a6: */
+                                           RTUNI_ALPHA, /* U+00c8a7: */
+                                           RTUNI_ALPHA, /* U+00c8a8: */
+                                           RTUNI_ALPHA, /* U+00c8a9: */
+                                           RTUNI_ALPHA, /* U+00c8aa: */
+                                           RTUNI_ALPHA, /* U+00c8ab: */
+                                           RTUNI_ALPHA, /* U+00c8ac: */
+                                           RTUNI_ALPHA, /* U+00c8ad: */
+                                           RTUNI_ALPHA, /* U+00c8ae: */
+                                           RTUNI_ALPHA, /* U+00c8af: */
+                                           RTUNI_ALPHA, /* U+00c8b0: */
+                                           RTUNI_ALPHA, /* U+00c8b1: */
+                                           RTUNI_ALPHA, /* U+00c8b2: */
+                                           RTUNI_ALPHA, /* U+00c8b3: */
+                                           RTUNI_ALPHA, /* U+00c8b4: */
+                                           RTUNI_ALPHA, /* U+00c8b5: */
+                                           RTUNI_ALPHA, /* U+00c8b6: */
+                                           RTUNI_ALPHA, /* U+00c8b7: */
+                                           RTUNI_ALPHA, /* U+00c8b8: */
+                                           RTUNI_ALPHA, /* U+00c8b9: */
+                                           RTUNI_ALPHA, /* U+00c8ba: */
+                                           RTUNI_ALPHA, /* U+00c8bb: */
+                                           RTUNI_ALPHA, /* U+00c8bc: */
+                                           RTUNI_ALPHA, /* U+00c8bd: */
+                                           RTUNI_ALPHA, /* U+00c8be: */
+                                           RTUNI_ALPHA, /* U+00c8bf: */
+                                           RTUNI_ALPHA, /* U+00c8c0: */
+                                           RTUNI_ALPHA, /* U+00c8c1: */
+                                           RTUNI_ALPHA, /* U+00c8c2: */
+                                           RTUNI_ALPHA, /* U+00c8c3: */
+                                           RTUNI_ALPHA, /* U+00c8c4: */
+                                           RTUNI_ALPHA, /* U+00c8c5: */
+                                           RTUNI_ALPHA, /* U+00c8c6: */
+                                           RTUNI_ALPHA, /* U+00c8c7: */
+                                           RTUNI_ALPHA, /* U+00c8c8: */
+                                           RTUNI_ALPHA, /* U+00c8c9: */
+                                           RTUNI_ALPHA, /* U+00c8ca: */
+                                           RTUNI_ALPHA, /* U+00c8cb: */
+                                           RTUNI_ALPHA, /* U+00c8cc: */
+                                           RTUNI_ALPHA, /* U+00c8cd: */
+                                           RTUNI_ALPHA, /* U+00c8ce: */
+                                           RTUNI_ALPHA, /* U+00c8cf: */
+                                           RTUNI_ALPHA, /* U+00c8d0: */
+                                           RTUNI_ALPHA, /* U+00c8d1: */
+                                           RTUNI_ALPHA, /* U+00c8d2: */
+                                           RTUNI_ALPHA, /* U+00c8d3: */
+                                           RTUNI_ALPHA, /* U+00c8d4: */
+                                           RTUNI_ALPHA, /* U+00c8d5: */
+                                           RTUNI_ALPHA, /* U+00c8d6: */
+                                           RTUNI_ALPHA, /* U+00c8d7: */
+                                           RTUNI_ALPHA, /* U+00c8d8: */
+                                           RTUNI_ALPHA, /* U+00c8d9: */
+                                           RTUNI_ALPHA, /* U+00c8da: */
+                                           RTUNI_ALPHA, /* U+00c8db: */
+                                           RTUNI_ALPHA, /* U+00c8dc: */
+                                           RTUNI_ALPHA, /* U+00c8dd: */
+                                           RTUNI_ALPHA, /* U+00c8de: */
+                                           RTUNI_ALPHA, /* U+00c8df: */
+                                           RTUNI_ALPHA, /* U+00c8e0: */
+                                           RTUNI_ALPHA, /* U+00c8e1: */
+                                           RTUNI_ALPHA, /* U+00c8e2: */
+                                           RTUNI_ALPHA, /* U+00c8e3: */
+                                           RTUNI_ALPHA, /* U+00c8e4: */
+                                           RTUNI_ALPHA, /* U+00c8e5: */
+                                           RTUNI_ALPHA, /* U+00c8e6: */
+                                           RTUNI_ALPHA, /* U+00c8e7: */
+                                           RTUNI_ALPHA, /* U+00c8e8: */
+                                           RTUNI_ALPHA, /* U+00c8e9: */
+                                           RTUNI_ALPHA, /* U+00c8ea: */
+                                           RTUNI_ALPHA, /* U+00c8eb: */
+                                           RTUNI_ALPHA, /* U+00c8ec: */
+                                           RTUNI_ALPHA, /* U+00c8ed: */
+                                           RTUNI_ALPHA, /* U+00c8ee: */
+                                           RTUNI_ALPHA, /* U+00c8ef: */
+                                           RTUNI_ALPHA, /* U+00c8f0: */
+                                           RTUNI_ALPHA, /* U+00c8f1: */
+                                           RTUNI_ALPHA, /* U+00c8f2: */
+                                           RTUNI_ALPHA, /* U+00c8f3: */
+                                           RTUNI_ALPHA, /* U+00c8f4: */
+                                           RTUNI_ALPHA, /* U+00c8f5: */
+                                           RTUNI_ALPHA, /* U+00c8f6: */
+                                           RTUNI_ALPHA, /* U+00c8f7: */
+                                           RTUNI_ALPHA, /* U+00c8f8: */
+                                           RTUNI_ALPHA, /* U+00c8f9: */
+                                           RTUNI_ALPHA, /* U+00c8fa: */
+                                           RTUNI_ALPHA, /* U+00c8fb: */
+                                           RTUNI_ALPHA, /* U+00c8fc: */
+                                           RTUNI_ALPHA, /* U+00c8fd: */
+                                           RTUNI_ALPHA, /* U+00c8fe: */
+                                           RTUNI_ALPHA, /* U+00c8ff: */
+                                           RTUNI_ALPHA, /* U+00c900: */
+                                           RTUNI_ALPHA, /* U+00c901: */
+                                           RTUNI_ALPHA, /* U+00c902: */
+                                           RTUNI_ALPHA, /* U+00c903: */
+                                           RTUNI_ALPHA, /* U+00c904: */
+                                           RTUNI_ALPHA, /* U+00c905: */
+                                           RTUNI_ALPHA, /* U+00c906: */
+                                           RTUNI_ALPHA, /* U+00c907: */
+                                           RTUNI_ALPHA, /* U+00c908: */
+                                           RTUNI_ALPHA, /* U+00c909: */
+                                           RTUNI_ALPHA, /* U+00c90a: */
+                                           RTUNI_ALPHA, /* U+00c90b: */
+                                           RTUNI_ALPHA, /* U+00c90c: */
+                                           RTUNI_ALPHA, /* U+00c90d: */
+                                           RTUNI_ALPHA, /* U+00c90e: */
+                                           RTUNI_ALPHA, /* U+00c90f: */
+                                           RTUNI_ALPHA, /* U+00c910: */
+                                           RTUNI_ALPHA, /* U+00c911: */
+                                           RTUNI_ALPHA, /* U+00c912: */
+                                           RTUNI_ALPHA, /* U+00c913: */
+                                           RTUNI_ALPHA, /* U+00c914: */
+                                           RTUNI_ALPHA, /* U+00c915: */
+                                           RTUNI_ALPHA, /* U+00c916: */
+                                           RTUNI_ALPHA, /* U+00c917: */
+                                           RTUNI_ALPHA, /* U+00c918: */
+                                           RTUNI_ALPHA, /* U+00c919: */
+                                           RTUNI_ALPHA, /* U+00c91a: */
+                                           RTUNI_ALPHA, /* U+00c91b: */
+                                           RTUNI_ALPHA, /* U+00c91c: */
+                                           RTUNI_ALPHA, /* U+00c91d: */
+                                           RTUNI_ALPHA, /* U+00c91e: */
+                                           RTUNI_ALPHA, /* U+00c91f: */
+                                           RTUNI_ALPHA, /* U+00c920: */
+                                           RTUNI_ALPHA, /* U+00c921: */
+                                           RTUNI_ALPHA, /* U+00c922: */
+                                           RTUNI_ALPHA, /* U+00c923: */
+                                           RTUNI_ALPHA, /* U+00c924: */
+                                           RTUNI_ALPHA, /* U+00c925: */
+                                           RTUNI_ALPHA, /* U+00c926: */
+                                           RTUNI_ALPHA, /* U+00c927: */
+                                           RTUNI_ALPHA, /* U+00c928: */
+                                           RTUNI_ALPHA, /* U+00c929: */
+                                           RTUNI_ALPHA, /* U+00c92a: */
+                                           RTUNI_ALPHA, /* U+00c92b: */
+                                           RTUNI_ALPHA, /* U+00c92c: */
+                                           RTUNI_ALPHA, /* U+00c92d: */
+                                           RTUNI_ALPHA, /* U+00c92e: */
+                                           RTUNI_ALPHA, /* U+00c92f: */
+                                           RTUNI_ALPHA, /* U+00c930: */
+                                           RTUNI_ALPHA, /* U+00c931: */
+                                           RTUNI_ALPHA, /* U+00c932: */
+                                           RTUNI_ALPHA, /* U+00c933: */
+                                           RTUNI_ALPHA, /* U+00c934: */
+                                           RTUNI_ALPHA, /* U+00c935: */
+                                           RTUNI_ALPHA, /* U+00c936: */
+                                           RTUNI_ALPHA, /* U+00c937: */
+                                           RTUNI_ALPHA, /* U+00c938: */
+                                           RTUNI_ALPHA, /* U+00c939: */
+                                           RTUNI_ALPHA, /* U+00c93a: */
+                                           RTUNI_ALPHA, /* U+00c93b: */
+                                           RTUNI_ALPHA, /* U+00c93c: */
+                                           RTUNI_ALPHA, /* U+00c93d: */
+                                           RTUNI_ALPHA, /* U+00c93e: */
+                                           RTUNI_ALPHA, /* U+00c93f: */
+                                           RTUNI_ALPHA, /* U+00c940: */
+                                           RTUNI_ALPHA, /* U+00c941: */
+                                           RTUNI_ALPHA, /* U+00c942: */
+                                           RTUNI_ALPHA, /* U+00c943: */
+                                           RTUNI_ALPHA, /* U+00c944: */
+                                           RTUNI_ALPHA, /* U+00c945: */
+                                           RTUNI_ALPHA, /* U+00c946: */
+                                           RTUNI_ALPHA, /* U+00c947: */
+                                           RTUNI_ALPHA, /* U+00c948: */
+                                           RTUNI_ALPHA, /* U+00c949: */
+                                           RTUNI_ALPHA, /* U+00c94a: */
+                                           RTUNI_ALPHA, /* U+00c94b: */
+                                           RTUNI_ALPHA, /* U+00c94c: */
+                                           RTUNI_ALPHA, /* U+00c94d: */
+                                           RTUNI_ALPHA, /* U+00c94e: */
+                                           RTUNI_ALPHA, /* U+00c94f: */
+                                           RTUNI_ALPHA, /* U+00c950: */
+                                           RTUNI_ALPHA, /* U+00c951: */
+                                           RTUNI_ALPHA, /* U+00c952: */
+                                           RTUNI_ALPHA, /* U+00c953: */
+                                           RTUNI_ALPHA, /* U+00c954: */
+                                           RTUNI_ALPHA, /* U+00c955: */
+                                           RTUNI_ALPHA, /* U+00c956: */
+                                           RTUNI_ALPHA, /* U+00c957: */
+                                           RTUNI_ALPHA, /* U+00c958: */
+                                           RTUNI_ALPHA, /* U+00c959: */
+                                           RTUNI_ALPHA, /* U+00c95a: */
+                                           RTUNI_ALPHA, /* U+00c95b: */
+                                           RTUNI_ALPHA, /* U+00c95c: */
+                                           RTUNI_ALPHA, /* U+00c95d: */
+                                           RTUNI_ALPHA, /* U+00c95e: */
+                                           RTUNI_ALPHA, /* U+00c95f: */
+                                           RTUNI_ALPHA, /* U+00c960: */
+                                           RTUNI_ALPHA, /* U+00c961: */
+                                           RTUNI_ALPHA, /* U+00c962: */
+                                           RTUNI_ALPHA, /* U+00c963: */
+                                           RTUNI_ALPHA, /* U+00c964: */
+                                           RTUNI_ALPHA, /* U+00c965: */
+                                           RTUNI_ALPHA, /* U+00c966: */
+                                           RTUNI_ALPHA, /* U+00c967: */
+                                           RTUNI_ALPHA, /* U+00c968: */
+                                           RTUNI_ALPHA, /* U+00c969: */
+                                           RTUNI_ALPHA, /* U+00c96a: */
+                                           RTUNI_ALPHA, /* U+00c96b: */
+                                           RTUNI_ALPHA, /* U+00c96c: */
+                                           RTUNI_ALPHA, /* U+00c96d: */
+                                           RTUNI_ALPHA, /* U+00c96e: */
+                                           RTUNI_ALPHA, /* U+00c96f: */
+                                           RTUNI_ALPHA, /* U+00c970: */
+                                           RTUNI_ALPHA, /* U+00c971: */
+                                           RTUNI_ALPHA, /* U+00c972: */
+                                           RTUNI_ALPHA, /* U+00c973: */
+                                           RTUNI_ALPHA, /* U+00c974: */
+                                           RTUNI_ALPHA, /* U+00c975: */
+                                           RTUNI_ALPHA, /* U+00c976: */
+                                           RTUNI_ALPHA, /* U+00c977: */
+                                           RTUNI_ALPHA, /* U+00c978: */
+                                           RTUNI_ALPHA, /* U+00c979: */
+                                           RTUNI_ALPHA, /* U+00c97a: */
+                                           RTUNI_ALPHA, /* U+00c97b: */
+                                           RTUNI_ALPHA, /* U+00c97c: */
+                                           RTUNI_ALPHA, /* U+00c97d: */
+                                           RTUNI_ALPHA, /* U+00c97e: */
+                                           RTUNI_ALPHA, /* U+00c97f: */
+                                           RTUNI_ALPHA, /* U+00c980: */
+                                           RTUNI_ALPHA, /* U+00c981: */
+                                           RTUNI_ALPHA, /* U+00c982: */
+                                           RTUNI_ALPHA, /* U+00c983: */
+                                           RTUNI_ALPHA, /* U+00c984: */
+                                           RTUNI_ALPHA, /* U+00c985: */
+                                           RTUNI_ALPHA, /* U+00c986: */
+                                           RTUNI_ALPHA, /* U+00c987: */
+                                           RTUNI_ALPHA, /* U+00c988: */
+                                           RTUNI_ALPHA, /* U+00c989: */
+                                           RTUNI_ALPHA, /* U+00c98a: */
+                                           RTUNI_ALPHA, /* U+00c98b: */
+                                           RTUNI_ALPHA, /* U+00c98c: */
+                                           RTUNI_ALPHA, /* U+00c98d: */
+                                           RTUNI_ALPHA, /* U+00c98e: */
+                                           RTUNI_ALPHA, /* U+00c98f: */
+                                           RTUNI_ALPHA, /* U+00c990: */
+                                           RTUNI_ALPHA, /* U+00c991: */
+                                           RTUNI_ALPHA, /* U+00c992: */
+                                           RTUNI_ALPHA, /* U+00c993: */
+                                           RTUNI_ALPHA, /* U+00c994: */
+                                           RTUNI_ALPHA, /* U+00c995: */
+                                           RTUNI_ALPHA, /* U+00c996: */
+                                           RTUNI_ALPHA, /* U+00c997: */
+                                           RTUNI_ALPHA, /* U+00c998: */
+                                           RTUNI_ALPHA, /* U+00c999: */
+                                           RTUNI_ALPHA, /* U+00c99a: */
+                                           RTUNI_ALPHA, /* U+00c99b: */
+                                           RTUNI_ALPHA, /* U+00c99c: */
+                                           RTUNI_ALPHA, /* U+00c99d: */
+                                           RTUNI_ALPHA, /* U+00c99e: */
+                                           RTUNI_ALPHA, /* U+00c99f: */
+                                           RTUNI_ALPHA, /* U+00c9a0: */
+                                           RTUNI_ALPHA, /* U+00c9a1: */
+                                           RTUNI_ALPHA, /* U+00c9a2: */
+                                           RTUNI_ALPHA, /* U+00c9a3: */
+                                           RTUNI_ALPHA, /* U+00c9a4: */
+                                           RTUNI_ALPHA, /* U+00c9a5: */
+                                           RTUNI_ALPHA, /* U+00c9a6: */
+                                           RTUNI_ALPHA, /* U+00c9a7: */
+                                           RTUNI_ALPHA, /* U+00c9a8: */
+                                           RTUNI_ALPHA, /* U+00c9a9: */
+                                           RTUNI_ALPHA, /* U+00c9aa: */
+                                           RTUNI_ALPHA, /* U+00c9ab: */
+                                           RTUNI_ALPHA, /* U+00c9ac: */
+                                           RTUNI_ALPHA, /* U+00c9ad: */
+                                           RTUNI_ALPHA, /* U+00c9ae: */
+                                           RTUNI_ALPHA, /* U+00c9af: */
+                                           RTUNI_ALPHA, /* U+00c9b0: */
+                                           RTUNI_ALPHA, /* U+00c9b1: */
+                                           RTUNI_ALPHA, /* U+00c9b2: */
+                                           RTUNI_ALPHA, /* U+00c9b3: */
+                                           RTUNI_ALPHA, /* U+00c9b4: */
+                                           RTUNI_ALPHA, /* U+00c9b5: */
+                                           RTUNI_ALPHA, /* U+00c9b6: */
+                                           RTUNI_ALPHA, /* U+00c9b7: */
+                                           RTUNI_ALPHA, /* U+00c9b8: */
+                                           RTUNI_ALPHA, /* U+00c9b9: */
+                                           RTUNI_ALPHA, /* U+00c9ba: */
+                                           RTUNI_ALPHA, /* U+00c9bb: */
+                                           RTUNI_ALPHA, /* U+00c9bc: */
+                                           RTUNI_ALPHA, /* U+00c9bd: */
+                                           RTUNI_ALPHA, /* U+00c9be: */
+                                           RTUNI_ALPHA, /* U+00c9bf: */
+                                           RTUNI_ALPHA, /* U+00c9c0: */
+                                           RTUNI_ALPHA, /* U+00c9c1: */
+                                           RTUNI_ALPHA, /* U+00c9c2: */
+                                           RTUNI_ALPHA, /* U+00c9c3: */
+                                           RTUNI_ALPHA, /* U+00c9c4: */
+                                           RTUNI_ALPHA, /* U+00c9c5: */
+                                           RTUNI_ALPHA, /* U+00c9c6: */
+                                           RTUNI_ALPHA, /* U+00c9c7: */
+                                           RTUNI_ALPHA, /* U+00c9c8: */
+                                           RTUNI_ALPHA, /* U+00c9c9: */
+                                           RTUNI_ALPHA, /* U+00c9ca: */
+                                           RTUNI_ALPHA, /* U+00c9cb: */
+                                           RTUNI_ALPHA, /* U+00c9cc: */
+                                           RTUNI_ALPHA, /* U+00c9cd: */
+                                           RTUNI_ALPHA, /* U+00c9ce: */
+                                           RTUNI_ALPHA, /* U+00c9cf: */
+                                           RTUNI_ALPHA, /* U+00c9d0: */
+                                           RTUNI_ALPHA, /* U+00c9d1: */
+                                           RTUNI_ALPHA, /* U+00c9d2: */
+                                           RTUNI_ALPHA, /* U+00c9d3: */
+                                           RTUNI_ALPHA, /* U+00c9d4: */
+                                           RTUNI_ALPHA, /* U+00c9d5: */
+                                           RTUNI_ALPHA, /* U+00c9d6: */
+                                           RTUNI_ALPHA, /* U+00c9d7: */
+                                           RTUNI_ALPHA, /* U+00c9d8: */
+                                           RTUNI_ALPHA, /* U+00c9d9: */
+                                           RTUNI_ALPHA, /* U+00c9da: */
+                                           RTUNI_ALPHA, /* U+00c9db: */
+                                           RTUNI_ALPHA, /* U+00c9dc: */
+                                           RTUNI_ALPHA, /* U+00c9dd: */
+                                           RTUNI_ALPHA, /* U+00c9de: */
+                                           RTUNI_ALPHA, /* U+00c9df: */
+                                           RTUNI_ALPHA, /* U+00c9e0: */
+                                           RTUNI_ALPHA, /* U+00c9e1: */
+                                           RTUNI_ALPHA, /* U+00c9e2: */
+                                           RTUNI_ALPHA, /* U+00c9e3: */
+                                           RTUNI_ALPHA, /* U+00c9e4: */
+                                           RTUNI_ALPHA, /* U+00c9e5: */
+                                           RTUNI_ALPHA, /* U+00c9e6: */
+                                           RTUNI_ALPHA, /* U+00c9e7: */
+                                           RTUNI_ALPHA, /* U+00c9e8: */
+                                           RTUNI_ALPHA, /* U+00c9e9: */
+                                           RTUNI_ALPHA, /* U+00c9ea: */
+                                           RTUNI_ALPHA, /* U+00c9eb: */
+                                           RTUNI_ALPHA, /* U+00c9ec: */
+                                           RTUNI_ALPHA, /* U+00c9ed: */
+                                           RTUNI_ALPHA, /* U+00c9ee: */
+                                           RTUNI_ALPHA, /* U+00c9ef: */
+                                           RTUNI_ALPHA, /* U+00c9f0: */
+                                           RTUNI_ALPHA, /* U+00c9f1: */
+                                           RTUNI_ALPHA, /* U+00c9f2: */
+                                           RTUNI_ALPHA, /* U+00c9f3: */
+                                           RTUNI_ALPHA, /* U+00c9f4: */
+                                           RTUNI_ALPHA, /* U+00c9f5: */
+                                           RTUNI_ALPHA, /* U+00c9f6: */
+                                           RTUNI_ALPHA, /* U+00c9f7: */
+                                           RTUNI_ALPHA, /* U+00c9f8: */
+                                           RTUNI_ALPHA, /* U+00c9f9: */
+                                           RTUNI_ALPHA, /* U+00c9fa: */
+                                           RTUNI_ALPHA, /* U+00c9fb: */
+                                           RTUNI_ALPHA, /* U+00c9fc: */
+                                           RTUNI_ALPHA, /* U+00c9fd: */
+                                           RTUNI_ALPHA, /* U+00c9fe: */
+                                           RTUNI_ALPHA, /* U+00c9ff: */
+                                           RTUNI_ALPHA, /* U+00ca00: */
+                                           RTUNI_ALPHA, /* U+00ca01: */
+                                           RTUNI_ALPHA, /* U+00ca02: */
+                                           RTUNI_ALPHA, /* U+00ca03: */
+                                           RTUNI_ALPHA, /* U+00ca04: */
+                                           RTUNI_ALPHA, /* U+00ca05: */
+                                           RTUNI_ALPHA, /* U+00ca06: */
+                                           RTUNI_ALPHA, /* U+00ca07: */
+                                           RTUNI_ALPHA, /* U+00ca08: */
+                                           RTUNI_ALPHA, /* U+00ca09: */
+                                           RTUNI_ALPHA, /* U+00ca0a: */
+                                           RTUNI_ALPHA, /* U+00ca0b: */
+                                           RTUNI_ALPHA, /* U+00ca0c: */
+                                           RTUNI_ALPHA, /* U+00ca0d: */
+                                           RTUNI_ALPHA, /* U+00ca0e: */
+                                           RTUNI_ALPHA, /* U+00ca0f: */
+                                           RTUNI_ALPHA, /* U+00ca10: */
+                                           RTUNI_ALPHA, /* U+00ca11: */
+                                           RTUNI_ALPHA, /* U+00ca12: */
+                                           RTUNI_ALPHA, /* U+00ca13: */
+                                           RTUNI_ALPHA, /* U+00ca14: */
+                                           RTUNI_ALPHA, /* U+00ca15: */
+                                           RTUNI_ALPHA, /* U+00ca16: */
+                                           RTUNI_ALPHA, /* U+00ca17: */
+                                           RTUNI_ALPHA, /* U+00ca18: */
+                                           RTUNI_ALPHA, /* U+00ca19: */
+                                           RTUNI_ALPHA, /* U+00ca1a: */
+                                           RTUNI_ALPHA, /* U+00ca1b: */
+                                           RTUNI_ALPHA, /* U+00ca1c: */
+                                           RTUNI_ALPHA, /* U+00ca1d: */
+                                           RTUNI_ALPHA, /* U+00ca1e: */
+                                           RTUNI_ALPHA, /* U+00ca1f: */
+                                           RTUNI_ALPHA, /* U+00ca20: */
+                                           RTUNI_ALPHA, /* U+00ca21: */
+                                           RTUNI_ALPHA, /* U+00ca22: */
+                                           RTUNI_ALPHA, /* U+00ca23: */
+                                           RTUNI_ALPHA, /* U+00ca24: */
+                                           RTUNI_ALPHA, /* U+00ca25: */
+                                           RTUNI_ALPHA, /* U+00ca26: */
+                                           RTUNI_ALPHA, /* U+00ca27: */
+                                           RTUNI_ALPHA, /* U+00ca28: */
+                                           RTUNI_ALPHA, /* U+00ca29: */
+                                           RTUNI_ALPHA, /* U+00ca2a: */
+                                           RTUNI_ALPHA, /* U+00ca2b: */
+                                           RTUNI_ALPHA, /* U+00ca2c: */
+                                           RTUNI_ALPHA, /* U+00ca2d: */
+                                           RTUNI_ALPHA, /* U+00ca2e: */
+                                           RTUNI_ALPHA, /* U+00ca2f: */
+                                           RTUNI_ALPHA, /* U+00ca30: */
+                                           RTUNI_ALPHA, /* U+00ca31: */
+                                           RTUNI_ALPHA, /* U+00ca32: */
+                                           RTUNI_ALPHA, /* U+00ca33: */
+                                           RTUNI_ALPHA, /* U+00ca34: */
+                                           RTUNI_ALPHA, /* U+00ca35: */
+                                           RTUNI_ALPHA, /* U+00ca36: */
+                                           RTUNI_ALPHA, /* U+00ca37: */
+                                           RTUNI_ALPHA, /* U+00ca38: */
+                                           RTUNI_ALPHA, /* U+00ca39: */
+                                           RTUNI_ALPHA, /* U+00ca3a: */
+                                           RTUNI_ALPHA, /* U+00ca3b: */
+                                           RTUNI_ALPHA, /* U+00ca3c: */
+                                           RTUNI_ALPHA, /* U+00ca3d: */
+                                           RTUNI_ALPHA, /* U+00ca3e: */
+                                           RTUNI_ALPHA, /* U+00ca3f: */
+                                           RTUNI_ALPHA, /* U+00ca40: */
+                                           RTUNI_ALPHA, /* U+00ca41: */
+                                           RTUNI_ALPHA, /* U+00ca42: */
+                                           RTUNI_ALPHA, /* U+00ca43: */
+                                           RTUNI_ALPHA, /* U+00ca44: */
+                                           RTUNI_ALPHA, /* U+00ca45: */
+                                           RTUNI_ALPHA, /* U+00ca46: */
+                                           RTUNI_ALPHA, /* U+00ca47: */
+                                           RTUNI_ALPHA, /* U+00ca48: */
+                                           RTUNI_ALPHA, /* U+00ca49: */
+                                           RTUNI_ALPHA, /* U+00ca4a: */
+                                           RTUNI_ALPHA, /* U+00ca4b: */
+                                           RTUNI_ALPHA, /* U+00ca4c: */
+                                           RTUNI_ALPHA, /* U+00ca4d: */
+                                           RTUNI_ALPHA, /* U+00ca4e: */
+                                           RTUNI_ALPHA, /* U+00ca4f: */
+                                           RTUNI_ALPHA, /* U+00ca50: */
+                                           RTUNI_ALPHA, /* U+00ca51: */
+                                           RTUNI_ALPHA, /* U+00ca52: */
+                                           RTUNI_ALPHA, /* U+00ca53: */
+                                           RTUNI_ALPHA, /* U+00ca54: */
+                                           RTUNI_ALPHA, /* U+00ca55: */
+                                           RTUNI_ALPHA, /* U+00ca56: */
+                                           RTUNI_ALPHA, /* U+00ca57: */
+                                           RTUNI_ALPHA, /* U+00ca58: */
+                                           RTUNI_ALPHA, /* U+00ca59: */
+                                           RTUNI_ALPHA, /* U+00ca5a: */
+                                           RTUNI_ALPHA, /* U+00ca5b: */
+                                           RTUNI_ALPHA, /* U+00ca5c: */
+                                           RTUNI_ALPHA, /* U+00ca5d: */
+                                           RTUNI_ALPHA, /* U+00ca5e: */
+                                           RTUNI_ALPHA, /* U+00ca5f: */
+                                           RTUNI_ALPHA, /* U+00ca60: */
+                                           RTUNI_ALPHA, /* U+00ca61: */
+                                           RTUNI_ALPHA, /* U+00ca62: */
+                                           RTUNI_ALPHA, /* U+00ca63: */
+                                           RTUNI_ALPHA, /* U+00ca64: */
+                                           RTUNI_ALPHA, /* U+00ca65: */
+                                           RTUNI_ALPHA, /* U+00ca66: */
+                                           RTUNI_ALPHA, /* U+00ca67: */
+                                           RTUNI_ALPHA, /* U+00ca68: */
+                                           RTUNI_ALPHA, /* U+00ca69: */
+                                           RTUNI_ALPHA, /* U+00ca6a: */
+                                           RTUNI_ALPHA, /* U+00ca6b: */
+                                           RTUNI_ALPHA, /* U+00ca6c: */
+                                           RTUNI_ALPHA, /* U+00ca6d: */
+                                           RTUNI_ALPHA, /* U+00ca6e: */
+                                           RTUNI_ALPHA, /* U+00ca6f: */
+                                           RTUNI_ALPHA, /* U+00ca70: */
+                                           RTUNI_ALPHA, /* U+00ca71: */
+                                           RTUNI_ALPHA, /* U+00ca72: */
+                                           RTUNI_ALPHA, /* U+00ca73: */
+                                           RTUNI_ALPHA, /* U+00ca74: */
+                                           RTUNI_ALPHA, /* U+00ca75: */
+                                           RTUNI_ALPHA, /* U+00ca76: */
+                                           RTUNI_ALPHA, /* U+00ca77: */
+                                           RTUNI_ALPHA, /* U+00ca78: */
+                                           RTUNI_ALPHA, /* U+00ca79: */
+                                           RTUNI_ALPHA, /* U+00ca7a: */
+                                           RTUNI_ALPHA, /* U+00ca7b: */
+                                           RTUNI_ALPHA, /* U+00ca7c: */
+                                           RTUNI_ALPHA, /* U+00ca7d: */
+                                           RTUNI_ALPHA, /* U+00ca7e: */
+                                           RTUNI_ALPHA, /* U+00ca7f: */
+                                           RTUNI_ALPHA, /* U+00ca80: */
+                                           RTUNI_ALPHA, /* U+00ca81: */
+                                           RTUNI_ALPHA, /* U+00ca82: */
+                                           RTUNI_ALPHA, /* U+00ca83: */
+                                           RTUNI_ALPHA, /* U+00ca84: */
+                                           RTUNI_ALPHA, /* U+00ca85: */
+                                           RTUNI_ALPHA, /* U+00ca86: */
+                                           RTUNI_ALPHA, /* U+00ca87: */
+                                           RTUNI_ALPHA, /* U+00ca88: */
+                                           RTUNI_ALPHA, /* U+00ca89: */
+                                           RTUNI_ALPHA, /* U+00ca8a: */
+                                           RTUNI_ALPHA, /* U+00ca8b: */
+                                           RTUNI_ALPHA, /* U+00ca8c: */
+                                           RTUNI_ALPHA, /* U+00ca8d: */
+                                           RTUNI_ALPHA, /* U+00ca8e: */
+                                           RTUNI_ALPHA, /* U+00ca8f: */
+                                           RTUNI_ALPHA, /* U+00ca90: */
+                                           RTUNI_ALPHA, /* U+00ca91: */
+                                           RTUNI_ALPHA, /* U+00ca92: */
+                                           RTUNI_ALPHA, /* U+00ca93: */
+                                           RTUNI_ALPHA, /* U+00ca94: */
+                                           RTUNI_ALPHA, /* U+00ca95: */
+                                           RTUNI_ALPHA, /* U+00ca96: */
+                                           RTUNI_ALPHA, /* U+00ca97: */
+                                           RTUNI_ALPHA, /* U+00ca98: */
+                                           RTUNI_ALPHA, /* U+00ca99: */
+                                           RTUNI_ALPHA, /* U+00ca9a: */
+                                           RTUNI_ALPHA, /* U+00ca9b: */
+                                           RTUNI_ALPHA, /* U+00ca9c: */
+                                           RTUNI_ALPHA, /* U+00ca9d: */
+                                           RTUNI_ALPHA, /* U+00ca9e: */
+                                           RTUNI_ALPHA, /* U+00ca9f: */
+                                           RTUNI_ALPHA, /* U+00caa0: */
+                                           RTUNI_ALPHA, /* U+00caa1: */
+                                           RTUNI_ALPHA, /* U+00caa2: */
+                                           RTUNI_ALPHA, /* U+00caa3: */
+                                           RTUNI_ALPHA, /* U+00caa4: */
+                                           RTUNI_ALPHA, /* U+00caa5: */
+                                           RTUNI_ALPHA, /* U+00caa6: */
+                                           RTUNI_ALPHA, /* U+00caa7: */
+                                           RTUNI_ALPHA, /* U+00caa8: */
+                                           RTUNI_ALPHA, /* U+00caa9: */
+                                           RTUNI_ALPHA, /* U+00caaa: */
+                                           RTUNI_ALPHA, /* U+00caab: */
+                                           RTUNI_ALPHA, /* U+00caac: */
+                                           RTUNI_ALPHA, /* U+00caad: */
+                                           RTUNI_ALPHA, /* U+00caae: */
+                                           RTUNI_ALPHA, /* U+00caaf: */
+                                           RTUNI_ALPHA, /* U+00cab0: */
+                                           RTUNI_ALPHA, /* U+00cab1: */
+                                           RTUNI_ALPHA, /* U+00cab2: */
+                                           RTUNI_ALPHA, /* U+00cab3: */
+                                           RTUNI_ALPHA, /* U+00cab4: */
+                                           RTUNI_ALPHA, /* U+00cab5: */
+                                           RTUNI_ALPHA, /* U+00cab6: */
+                                           RTUNI_ALPHA, /* U+00cab7: */
+                                           RTUNI_ALPHA, /* U+00cab8: */
+                                           RTUNI_ALPHA, /* U+00cab9: */
+                                           RTUNI_ALPHA, /* U+00caba: */
+                                           RTUNI_ALPHA, /* U+00cabb: */
+                                           RTUNI_ALPHA, /* U+00cabc: */
+                                           RTUNI_ALPHA, /* U+00cabd: */
+                                           RTUNI_ALPHA, /* U+00cabe: */
+                                           RTUNI_ALPHA, /* U+00cabf: */
+                                           RTUNI_ALPHA, /* U+00cac0: */
+                                           RTUNI_ALPHA, /* U+00cac1: */
+                                           RTUNI_ALPHA, /* U+00cac2: */
+                                           RTUNI_ALPHA, /* U+00cac3: */
+                                           RTUNI_ALPHA, /* U+00cac4: */
+                                           RTUNI_ALPHA, /* U+00cac5: */
+                                           RTUNI_ALPHA, /* U+00cac6: */
+                                           RTUNI_ALPHA, /* U+00cac7: */
+                                           RTUNI_ALPHA, /* U+00cac8: */
+                                           RTUNI_ALPHA, /* U+00cac9: */
+                                           RTUNI_ALPHA, /* U+00caca: */
+                                           RTUNI_ALPHA, /* U+00cacb: */
+                                           RTUNI_ALPHA, /* U+00cacc: */
+                                           RTUNI_ALPHA, /* U+00cacd: */
+                                           RTUNI_ALPHA, /* U+00cace: */
+                                           RTUNI_ALPHA, /* U+00cacf: */
+                                           RTUNI_ALPHA, /* U+00cad0: */
+                                           RTUNI_ALPHA, /* U+00cad1: */
+                                           RTUNI_ALPHA, /* U+00cad2: */
+                                           RTUNI_ALPHA, /* U+00cad3: */
+                                           RTUNI_ALPHA, /* U+00cad4: */
+                                           RTUNI_ALPHA, /* U+00cad5: */
+                                           RTUNI_ALPHA, /* U+00cad6: */
+                                           RTUNI_ALPHA, /* U+00cad7: */
+                                           RTUNI_ALPHA, /* U+00cad8: */
+                                           RTUNI_ALPHA, /* U+00cad9: */
+                                           RTUNI_ALPHA, /* U+00cada: */
+                                           RTUNI_ALPHA, /* U+00cadb: */
+                                           RTUNI_ALPHA, /* U+00cadc: */
+                                           RTUNI_ALPHA, /* U+00cadd: */
+                                           RTUNI_ALPHA, /* U+00cade: */
+                                           RTUNI_ALPHA, /* U+00cadf: */
+                                           RTUNI_ALPHA, /* U+00cae0: */
+                                           RTUNI_ALPHA, /* U+00cae1: */
+                                           RTUNI_ALPHA, /* U+00cae2: */
+                                           RTUNI_ALPHA, /* U+00cae3: */
+                                           RTUNI_ALPHA, /* U+00cae4: */
+                                           RTUNI_ALPHA, /* U+00cae5: */
+                                           RTUNI_ALPHA, /* U+00cae6: */
+                                           RTUNI_ALPHA, /* U+00cae7: */
+                                           RTUNI_ALPHA, /* U+00cae8: */
+                                           RTUNI_ALPHA, /* U+00cae9: */
+                                           RTUNI_ALPHA, /* U+00caea: */
+                                           RTUNI_ALPHA, /* U+00caeb: */
+                                           RTUNI_ALPHA, /* U+00caec: */
+                                           RTUNI_ALPHA, /* U+00caed: */
+                                           RTUNI_ALPHA, /* U+00caee: */
+                                           RTUNI_ALPHA, /* U+00caef: */
+                                           RTUNI_ALPHA, /* U+00caf0: */
+                                           RTUNI_ALPHA, /* U+00caf1: */
+                                           RTUNI_ALPHA, /* U+00caf2: */
+                                           RTUNI_ALPHA, /* U+00caf3: */
+                                           RTUNI_ALPHA, /* U+00caf4: */
+                                           RTUNI_ALPHA, /* U+00caf5: */
+                                           RTUNI_ALPHA, /* U+00caf6: */
+                                           RTUNI_ALPHA, /* U+00caf7: */
+                                           RTUNI_ALPHA, /* U+00caf8: */
+                                           RTUNI_ALPHA, /* U+00caf9: */
+                                           RTUNI_ALPHA, /* U+00cafa: */
+                                           RTUNI_ALPHA, /* U+00cafb: */
+                                           RTUNI_ALPHA, /* U+00cafc: */
+                                           RTUNI_ALPHA, /* U+00cafd: */
+                                           RTUNI_ALPHA, /* U+00cafe: */
+                                           RTUNI_ALPHA, /* U+00caff: */
+                                           RTUNI_ALPHA, /* U+00cb00: */
+                                           RTUNI_ALPHA, /* U+00cb01: */
+                                           RTUNI_ALPHA, /* U+00cb02: */
+                                           RTUNI_ALPHA, /* U+00cb03: */
+                                           RTUNI_ALPHA, /* U+00cb04: */
+                                           RTUNI_ALPHA, /* U+00cb05: */
+                                           RTUNI_ALPHA, /* U+00cb06: */
+                                           RTUNI_ALPHA, /* U+00cb07: */
+                                           RTUNI_ALPHA, /* U+00cb08: */
+                                           RTUNI_ALPHA, /* U+00cb09: */
+                                           RTUNI_ALPHA, /* U+00cb0a: */
+                                           RTUNI_ALPHA, /* U+00cb0b: */
+                                           RTUNI_ALPHA, /* U+00cb0c: */
+                                           RTUNI_ALPHA, /* U+00cb0d: */
+                                           RTUNI_ALPHA, /* U+00cb0e: */
+                                           RTUNI_ALPHA, /* U+00cb0f: */
+                                           RTUNI_ALPHA, /* U+00cb10: */
+                                           RTUNI_ALPHA, /* U+00cb11: */
+                                           RTUNI_ALPHA, /* U+00cb12: */
+                                           RTUNI_ALPHA, /* U+00cb13: */
+                                           RTUNI_ALPHA, /* U+00cb14: */
+                                           RTUNI_ALPHA, /* U+00cb15: */
+                                           RTUNI_ALPHA, /* U+00cb16: */
+                                           RTUNI_ALPHA, /* U+00cb17: */
+                                           RTUNI_ALPHA, /* U+00cb18: */
+                                           RTUNI_ALPHA, /* U+00cb19: */
+                                           RTUNI_ALPHA, /* U+00cb1a: */
+                                           RTUNI_ALPHA, /* U+00cb1b: */
+                                           RTUNI_ALPHA, /* U+00cb1c: */
+                                           RTUNI_ALPHA, /* U+00cb1d: */
+                                           RTUNI_ALPHA, /* U+00cb1e: */
+                                           RTUNI_ALPHA, /* U+00cb1f: */
+                                           RTUNI_ALPHA, /* U+00cb20: */
+                                           RTUNI_ALPHA, /* U+00cb21: */
+                                           RTUNI_ALPHA, /* U+00cb22: */
+                                           RTUNI_ALPHA, /* U+00cb23: */
+                                           RTUNI_ALPHA, /* U+00cb24: */
+                                           RTUNI_ALPHA, /* U+00cb25: */
+                                           RTUNI_ALPHA, /* U+00cb26: */
+                                           RTUNI_ALPHA, /* U+00cb27: */
+                                           RTUNI_ALPHA, /* U+00cb28: */
+                                           RTUNI_ALPHA, /* U+00cb29: */
+                                           RTUNI_ALPHA, /* U+00cb2a: */
+                                           RTUNI_ALPHA, /* U+00cb2b: */
+                                           RTUNI_ALPHA, /* U+00cb2c: */
+                                           RTUNI_ALPHA, /* U+00cb2d: */
+                                           RTUNI_ALPHA, /* U+00cb2e: */
+                                           RTUNI_ALPHA, /* U+00cb2f: */
+                                           RTUNI_ALPHA, /* U+00cb30: */
+                                           RTUNI_ALPHA, /* U+00cb31: */
+                                           RTUNI_ALPHA, /* U+00cb32: */
+                                           RTUNI_ALPHA, /* U+00cb33: */
+                                           RTUNI_ALPHA, /* U+00cb34: */
+                                           RTUNI_ALPHA, /* U+00cb35: */
+                                           RTUNI_ALPHA, /* U+00cb36: */
+                                           RTUNI_ALPHA, /* U+00cb37: */
+                                           RTUNI_ALPHA, /* U+00cb38: */
+                                           RTUNI_ALPHA, /* U+00cb39: */
+                                           RTUNI_ALPHA, /* U+00cb3a: */
+                                           RTUNI_ALPHA, /* U+00cb3b: */
+                                           RTUNI_ALPHA, /* U+00cb3c: */
+                                           RTUNI_ALPHA, /* U+00cb3d: */
+                                           RTUNI_ALPHA, /* U+00cb3e: */
+                                           RTUNI_ALPHA, /* U+00cb3f: */
+                                           RTUNI_ALPHA, /* U+00cb40: */
+                                           RTUNI_ALPHA, /* U+00cb41: */
+                                           RTUNI_ALPHA, /* U+00cb42: */
+                                           RTUNI_ALPHA, /* U+00cb43: */
+                                           RTUNI_ALPHA, /* U+00cb44: */
+                                           RTUNI_ALPHA, /* U+00cb45: */
+                                           RTUNI_ALPHA, /* U+00cb46: */
+                                           RTUNI_ALPHA, /* U+00cb47: */
+                                           RTUNI_ALPHA, /* U+00cb48: */
+                                           RTUNI_ALPHA, /* U+00cb49: */
+                                           RTUNI_ALPHA, /* U+00cb4a: */
+                                           RTUNI_ALPHA, /* U+00cb4b: */
+                                           RTUNI_ALPHA, /* U+00cb4c: */
+                                           RTUNI_ALPHA, /* U+00cb4d: */
+                                           RTUNI_ALPHA, /* U+00cb4e: */
+                                           RTUNI_ALPHA, /* U+00cb4f: */
+                                           RTUNI_ALPHA, /* U+00cb50: */
+                                           RTUNI_ALPHA, /* U+00cb51: */
+                                           RTUNI_ALPHA, /* U+00cb52: */
+                                           RTUNI_ALPHA, /* U+00cb53: */
+                                           RTUNI_ALPHA, /* U+00cb54: */
+                                           RTUNI_ALPHA, /* U+00cb55: */
+                                           RTUNI_ALPHA, /* U+00cb56: */
+                                           RTUNI_ALPHA, /* U+00cb57: */
+                                           RTUNI_ALPHA, /* U+00cb58: */
+                                           RTUNI_ALPHA, /* U+00cb59: */
+                                           RTUNI_ALPHA, /* U+00cb5a: */
+                                           RTUNI_ALPHA, /* U+00cb5b: */
+                                           RTUNI_ALPHA, /* U+00cb5c: */
+                                           RTUNI_ALPHA, /* U+00cb5d: */
+                                           RTUNI_ALPHA, /* U+00cb5e: */
+                                           RTUNI_ALPHA, /* U+00cb5f: */
+                                           RTUNI_ALPHA, /* U+00cb60: */
+                                           RTUNI_ALPHA, /* U+00cb61: */
+                                           RTUNI_ALPHA, /* U+00cb62: */
+                                           RTUNI_ALPHA, /* U+00cb63: */
+                                           RTUNI_ALPHA, /* U+00cb64: */
+                                           RTUNI_ALPHA, /* U+00cb65: */
+                                           RTUNI_ALPHA, /* U+00cb66: */
+                                           RTUNI_ALPHA, /* U+00cb67: */
+                                           RTUNI_ALPHA, /* U+00cb68: */
+                                           RTUNI_ALPHA, /* U+00cb69: */
+                                           RTUNI_ALPHA, /* U+00cb6a: */
+                                           RTUNI_ALPHA, /* U+00cb6b: */
+                                           RTUNI_ALPHA, /* U+00cb6c: */
+                                           RTUNI_ALPHA, /* U+00cb6d: */
+                                           RTUNI_ALPHA, /* U+00cb6e: */
+                                           RTUNI_ALPHA, /* U+00cb6f: */
+                                           RTUNI_ALPHA, /* U+00cb70: */
+                                           RTUNI_ALPHA, /* U+00cb71: */
+                                           RTUNI_ALPHA, /* U+00cb72: */
+                                           RTUNI_ALPHA, /* U+00cb73: */
+                                           RTUNI_ALPHA, /* U+00cb74: */
+                                           RTUNI_ALPHA, /* U+00cb75: */
+                                           RTUNI_ALPHA, /* U+00cb76: */
+                                           RTUNI_ALPHA, /* U+00cb77: */
+                                           RTUNI_ALPHA, /* U+00cb78: */
+                                           RTUNI_ALPHA, /* U+00cb79: */
+                                           RTUNI_ALPHA, /* U+00cb7a: */
+                                           RTUNI_ALPHA, /* U+00cb7b: */
+                                           RTUNI_ALPHA, /* U+00cb7c: */
+                                           RTUNI_ALPHA, /* U+00cb7d: */
+                                           RTUNI_ALPHA, /* U+00cb7e: */
+                                           RTUNI_ALPHA, /* U+00cb7f: */
+                                           RTUNI_ALPHA, /* U+00cb80: */
+                                           RTUNI_ALPHA, /* U+00cb81: */
+                                           RTUNI_ALPHA, /* U+00cb82: */
+                                           RTUNI_ALPHA, /* U+00cb83: */
+                                           RTUNI_ALPHA, /* U+00cb84: */
+                                           RTUNI_ALPHA, /* U+00cb85: */
+                                           RTUNI_ALPHA, /* U+00cb86: */
+                                           RTUNI_ALPHA, /* U+00cb87: */
+                                           RTUNI_ALPHA, /* U+00cb88: */
+                                           RTUNI_ALPHA, /* U+00cb89: */
+                                           RTUNI_ALPHA, /* U+00cb8a: */
+                                           RTUNI_ALPHA, /* U+00cb8b: */
+                                           RTUNI_ALPHA, /* U+00cb8c: */
+                                           RTUNI_ALPHA, /* U+00cb8d: */
+                                           RTUNI_ALPHA, /* U+00cb8e: */
+                                           RTUNI_ALPHA, /* U+00cb8f: */
+                                           RTUNI_ALPHA, /* U+00cb90: */
+                                           RTUNI_ALPHA, /* U+00cb91: */
+                                           RTUNI_ALPHA, /* U+00cb92: */
+                                           RTUNI_ALPHA, /* U+00cb93: */
+                                           RTUNI_ALPHA, /* U+00cb94: */
+                                           RTUNI_ALPHA, /* U+00cb95: */
+                                           RTUNI_ALPHA, /* U+00cb96: */
+                                           RTUNI_ALPHA, /* U+00cb97: */
+                                           RTUNI_ALPHA, /* U+00cb98: */
+                                           RTUNI_ALPHA, /* U+00cb99: */
+                                           RTUNI_ALPHA, /* U+00cb9a: */
+                                           RTUNI_ALPHA, /* U+00cb9b: */
+                                           RTUNI_ALPHA, /* U+00cb9c: */
+                                           RTUNI_ALPHA, /* U+00cb9d: */
+                                           RTUNI_ALPHA, /* U+00cb9e: */
+                                           RTUNI_ALPHA, /* U+00cb9f: */
+                                           RTUNI_ALPHA, /* U+00cba0: */
+                                           RTUNI_ALPHA, /* U+00cba1: */
+                                           RTUNI_ALPHA, /* U+00cba2: */
+                                           RTUNI_ALPHA, /* U+00cba3: */
+                                           RTUNI_ALPHA, /* U+00cba4: */
+                                           RTUNI_ALPHA, /* U+00cba5: */
+                                           RTUNI_ALPHA, /* U+00cba6: */
+                                           RTUNI_ALPHA, /* U+00cba7: */
+                                           RTUNI_ALPHA, /* U+00cba8: */
+                                           RTUNI_ALPHA, /* U+00cba9: */
+                                           RTUNI_ALPHA, /* U+00cbaa: */
+                                           RTUNI_ALPHA, /* U+00cbab: */
+                                           RTUNI_ALPHA, /* U+00cbac: */
+                                           RTUNI_ALPHA, /* U+00cbad: */
+                                           RTUNI_ALPHA, /* U+00cbae: */
+                                           RTUNI_ALPHA, /* U+00cbaf: */
+                                           RTUNI_ALPHA, /* U+00cbb0: */
+                                           RTUNI_ALPHA, /* U+00cbb1: */
+                                           RTUNI_ALPHA, /* U+00cbb2: */
+                                           RTUNI_ALPHA, /* U+00cbb3: */
+                                           RTUNI_ALPHA, /* U+00cbb4: */
+                                           RTUNI_ALPHA, /* U+00cbb5: */
+                                           RTUNI_ALPHA, /* U+00cbb6: */
+                                           RTUNI_ALPHA, /* U+00cbb7: */
+                                           RTUNI_ALPHA, /* U+00cbb8: */
+                                           RTUNI_ALPHA, /* U+00cbb9: */
+                                           RTUNI_ALPHA, /* U+00cbba: */
+                                           RTUNI_ALPHA, /* U+00cbbb: */
+                                           RTUNI_ALPHA, /* U+00cbbc: */
+                                           RTUNI_ALPHA, /* U+00cbbd: */
+                                           RTUNI_ALPHA, /* U+00cbbe: */
+                                           RTUNI_ALPHA, /* U+00cbbf: */
+                                           RTUNI_ALPHA, /* U+00cbc0: */
+                                           RTUNI_ALPHA, /* U+00cbc1: */
+                                           RTUNI_ALPHA, /* U+00cbc2: */
+                                           RTUNI_ALPHA, /* U+00cbc3: */
+                                           RTUNI_ALPHA, /* U+00cbc4: */
+                                           RTUNI_ALPHA, /* U+00cbc5: */
+                                           RTUNI_ALPHA, /* U+00cbc6: */
+                                           RTUNI_ALPHA, /* U+00cbc7: */
+                                           RTUNI_ALPHA, /* U+00cbc8: */
+                                           RTUNI_ALPHA, /* U+00cbc9: */
+                                           RTUNI_ALPHA, /* U+00cbca: */
+                                           RTUNI_ALPHA, /* U+00cbcb: */
+                                           RTUNI_ALPHA, /* U+00cbcc: */
+                                           RTUNI_ALPHA, /* U+00cbcd: */
+                                           RTUNI_ALPHA, /* U+00cbce: */
+                                           RTUNI_ALPHA, /* U+00cbcf: */
+                                           RTUNI_ALPHA, /* U+00cbd0: */
+                                           RTUNI_ALPHA, /* U+00cbd1: */
+                                           RTUNI_ALPHA, /* U+00cbd2: */
+                                           RTUNI_ALPHA, /* U+00cbd3: */
+                                           RTUNI_ALPHA, /* U+00cbd4: */
+                                           RTUNI_ALPHA, /* U+00cbd5: */
+                                           RTUNI_ALPHA, /* U+00cbd6: */
+                                           RTUNI_ALPHA, /* U+00cbd7: */
+                                           RTUNI_ALPHA, /* U+00cbd8: */
+                                           RTUNI_ALPHA, /* U+00cbd9: */
+                                           RTUNI_ALPHA, /* U+00cbda: */
+                                           RTUNI_ALPHA, /* U+00cbdb: */
+                                           RTUNI_ALPHA, /* U+00cbdc: */
+                                           RTUNI_ALPHA, /* U+00cbdd: */
+                                           RTUNI_ALPHA, /* U+00cbde: */
+                                           RTUNI_ALPHA, /* U+00cbdf: */
+                                           RTUNI_ALPHA, /* U+00cbe0: */
+                                           RTUNI_ALPHA, /* U+00cbe1: */
+                                           RTUNI_ALPHA, /* U+00cbe2: */
+                                           RTUNI_ALPHA, /* U+00cbe3: */
+                                           RTUNI_ALPHA, /* U+00cbe4: */
+                                           RTUNI_ALPHA, /* U+00cbe5: */
+                                           RTUNI_ALPHA, /* U+00cbe6: */
+                                           RTUNI_ALPHA, /* U+00cbe7: */
+                                           RTUNI_ALPHA, /* U+00cbe8: */
+                                           RTUNI_ALPHA, /* U+00cbe9: */
+                                           RTUNI_ALPHA, /* U+00cbea: */
+                                           RTUNI_ALPHA, /* U+00cbeb: */
+                                           RTUNI_ALPHA, /* U+00cbec: */
+                                           RTUNI_ALPHA, /* U+00cbed: */
+                                           RTUNI_ALPHA, /* U+00cbee: */
+                                           RTUNI_ALPHA, /* U+00cbef: */
+                                           RTUNI_ALPHA, /* U+00cbf0: */
+                                           RTUNI_ALPHA, /* U+00cbf1: */
+                                           RTUNI_ALPHA, /* U+00cbf2: */
+                                           RTUNI_ALPHA, /* U+00cbf3: */
+                                           RTUNI_ALPHA, /* U+00cbf4: */
+                                           RTUNI_ALPHA, /* U+00cbf5: */
+                                           RTUNI_ALPHA, /* U+00cbf6: */
+                                           RTUNI_ALPHA, /* U+00cbf7: */
+                                           RTUNI_ALPHA, /* U+00cbf8: */
+                                           RTUNI_ALPHA, /* U+00cbf9: */
+                                           RTUNI_ALPHA, /* U+00cbfa: */
+                                           RTUNI_ALPHA, /* U+00cbfb: */
+                                           RTUNI_ALPHA, /* U+00cbfc: */
+                                           RTUNI_ALPHA, /* U+00cbfd: */
+                                           RTUNI_ALPHA, /* U+00cbfe: */
+                                           RTUNI_ALPHA, /* U+00cbff: */
+                                           RTUNI_ALPHA, /* U+00cc00: */
+                                           RTUNI_ALPHA, /* U+00cc01: */
+                                           RTUNI_ALPHA, /* U+00cc02: */
+                                           RTUNI_ALPHA, /* U+00cc03: */
+                                           RTUNI_ALPHA, /* U+00cc04: */
+                                           RTUNI_ALPHA, /* U+00cc05: */
+                                           RTUNI_ALPHA, /* U+00cc06: */
+                                           RTUNI_ALPHA, /* U+00cc07: */
+                                           RTUNI_ALPHA, /* U+00cc08: */
+                                           RTUNI_ALPHA, /* U+00cc09: */
+                                           RTUNI_ALPHA, /* U+00cc0a: */
+                                           RTUNI_ALPHA, /* U+00cc0b: */
+                                           RTUNI_ALPHA, /* U+00cc0c: */
+                                           RTUNI_ALPHA, /* U+00cc0d: */
+                                           RTUNI_ALPHA, /* U+00cc0e: */
+                                           RTUNI_ALPHA, /* U+00cc0f: */
+                                           RTUNI_ALPHA, /* U+00cc10: */
+                                           RTUNI_ALPHA, /* U+00cc11: */
+                                           RTUNI_ALPHA, /* U+00cc12: */
+                                           RTUNI_ALPHA, /* U+00cc13: */
+                                           RTUNI_ALPHA, /* U+00cc14: */
+                                           RTUNI_ALPHA, /* U+00cc15: */
+                                           RTUNI_ALPHA, /* U+00cc16: */
+                                           RTUNI_ALPHA, /* U+00cc17: */
+                                           RTUNI_ALPHA, /* U+00cc18: */
+                                           RTUNI_ALPHA, /* U+00cc19: */
+                                           RTUNI_ALPHA, /* U+00cc1a: */
+                                           RTUNI_ALPHA, /* U+00cc1b: */
+                                           RTUNI_ALPHA, /* U+00cc1c: */
+                                           RTUNI_ALPHA, /* U+00cc1d: */
+                                           RTUNI_ALPHA, /* U+00cc1e: */
+                                           RTUNI_ALPHA, /* U+00cc1f: */
+                                           RTUNI_ALPHA, /* U+00cc20: */
+                                           RTUNI_ALPHA, /* U+00cc21: */
+                                           RTUNI_ALPHA, /* U+00cc22: */
+                                           RTUNI_ALPHA, /* U+00cc23: */
+                                           RTUNI_ALPHA, /* U+00cc24: */
+                                           RTUNI_ALPHA, /* U+00cc25: */
+                                           RTUNI_ALPHA, /* U+00cc26: */
+                                           RTUNI_ALPHA, /* U+00cc27: */
+                                           RTUNI_ALPHA, /* U+00cc28: */
+                                           RTUNI_ALPHA, /* U+00cc29: */
+                                           RTUNI_ALPHA, /* U+00cc2a: */
+                                           RTUNI_ALPHA, /* U+00cc2b: */
+                                           RTUNI_ALPHA, /* U+00cc2c: */
+                                           RTUNI_ALPHA, /* U+00cc2d: */
+                                           RTUNI_ALPHA, /* U+00cc2e: */
+                                           RTUNI_ALPHA, /* U+00cc2f: */
+                                           RTUNI_ALPHA, /* U+00cc30: */
+                                           RTUNI_ALPHA, /* U+00cc31: */
+                                           RTUNI_ALPHA, /* U+00cc32: */
+                                           RTUNI_ALPHA, /* U+00cc33: */
+                                           RTUNI_ALPHA, /* U+00cc34: */
+                                           RTUNI_ALPHA, /* U+00cc35: */
+                                           RTUNI_ALPHA, /* U+00cc36: */
+                                           RTUNI_ALPHA, /* U+00cc37: */
+                                           RTUNI_ALPHA, /* U+00cc38: */
+                                           RTUNI_ALPHA, /* U+00cc39: */
+                                           RTUNI_ALPHA, /* U+00cc3a: */
+                                           RTUNI_ALPHA, /* U+00cc3b: */
+                                           RTUNI_ALPHA, /* U+00cc3c: */
+                                           RTUNI_ALPHA, /* U+00cc3d: */
+                                           RTUNI_ALPHA, /* U+00cc3e: */
+                                           RTUNI_ALPHA, /* U+00cc3f: */
+                                           RTUNI_ALPHA, /* U+00cc40: */
+                                           RTUNI_ALPHA, /* U+00cc41: */
+                                           RTUNI_ALPHA, /* U+00cc42: */
+                                           RTUNI_ALPHA, /* U+00cc43: */
+                                           RTUNI_ALPHA, /* U+00cc44: */
+                                           RTUNI_ALPHA, /* U+00cc45: */
+                                           RTUNI_ALPHA, /* U+00cc46: */
+                                           RTUNI_ALPHA, /* U+00cc47: */
+                                           RTUNI_ALPHA, /* U+00cc48: */
+                                           RTUNI_ALPHA, /* U+00cc49: */
+                                           RTUNI_ALPHA, /* U+00cc4a: */
+                                           RTUNI_ALPHA, /* U+00cc4b: */
+                                           RTUNI_ALPHA, /* U+00cc4c: */
+                                           RTUNI_ALPHA, /* U+00cc4d: */
+                                           RTUNI_ALPHA, /* U+00cc4e: */
+                                           RTUNI_ALPHA, /* U+00cc4f: */
+                                           RTUNI_ALPHA, /* U+00cc50: */
+                                           RTUNI_ALPHA, /* U+00cc51: */
+                                           RTUNI_ALPHA, /* U+00cc52: */
+                                           RTUNI_ALPHA, /* U+00cc53: */
+                                           RTUNI_ALPHA, /* U+00cc54: */
+                                           RTUNI_ALPHA, /* U+00cc55: */
+                                           RTUNI_ALPHA, /* U+00cc56: */
+                                           RTUNI_ALPHA, /* U+00cc57: */
+                                           RTUNI_ALPHA, /* U+00cc58: */
+                                           RTUNI_ALPHA, /* U+00cc59: */
+                                           RTUNI_ALPHA, /* U+00cc5a: */
+                                           RTUNI_ALPHA, /* U+00cc5b: */
+                                           RTUNI_ALPHA, /* U+00cc5c: */
+                                           RTUNI_ALPHA, /* U+00cc5d: */
+                                           RTUNI_ALPHA, /* U+00cc5e: */
+                                           RTUNI_ALPHA, /* U+00cc5f: */
+                                           RTUNI_ALPHA, /* U+00cc60: */
+                                           RTUNI_ALPHA, /* U+00cc61: */
+                                           RTUNI_ALPHA, /* U+00cc62: */
+                                           RTUNI_ALPHA, /* U+00cc63: */
+                                           RTUNI_ALPHA, /* U+00cc64: */
+                                           RTUNI_ALPHA, /* U+00cc65: */
+                                           RTUNI_ALPHA, /* U+00cc66: */
+                                           RTUNI_ALPHA, /* U+00cc67: */
+                                           RTUNI_ALPHA, /* U+00cc68: */
+                                           RTUNI_ALPHA, /* U+00cc69: */
+                                           RTUNI_ALPHA, /* U+00cc6a: */
+                                           RTUNI_ALPHA, /* U+00cc6b: */
+                                           RTUNI_ALPHA, /* U+00cc6c: */
+                                           RTUNI_ALPHA, /* U+00cc6d: */
+                                           RTUNI_ALPHA, /* U+00cc6e: */
+                                           RTUNI_ALPHA, /* U+00cc6f: */
+                                           RTUNI_ALPHA, /* U+00cc70: */
+                                           RTUNI_ALPHA, /* U+00cc71: */
+                                           RTUNI_ALPHA, /* U+00cc72: */
+                                           RTUNI_ALPHA, /* U+00cc73: */
+                                           RTUNI_ALPHA, /* U+00cc74: */
+                                           RTUNI_ALPHA, /* U+00cc75: */
+                                           RTUNI_ALPHA, /* U+00cc76: */
+                                           RTUNI_ALPHA, /* U+00cc77: */
+                                           RTUNI_ALPHA, /* U+00cc78: */
+                                           RTUNI_ALPHA, /* U+00cc79: */
+                                           RTUNI_ALPHA, /* U+00cc7a: */
+                                           RTUNI_ALPHA, /* U+00cc7b: */
+                                           RTUNI_ALPHA, /* U+00cc7c: */
+                                           RTUNI_ALPHA, /* U+00cc7d: */
+                                           RTUNI_ALPHA, /* U+00cc7e: */
+                                           RTUNI_ALPHA, /* U+00cc7f: */
+                                           RTUNI_ALPHA, /* U+00cc80: */
+                                           RTUNI_ALPHA, /* U+00cc81: */
+                                           RTUNI_ALPHA, /* U+00cc82: */
+                                           RTUNI_ALPHA, /* U+00cc83: */
+                                           RTUNI_ALPHA, /* U+00cc84: */
+                                           RTUNI_ALPHA, /* U+00cc85: */
+                                           RTUNI_ALPHA, /* U+00cc86: */
+                                           RTUNI_ALPHA, /* U+00cc87: */
+                                           RTUNI_ALPHA, /* U+00cc88: */
+                                           RTUNI_ALPHA, /* U+00cc89: */
+                                           RTUNI_ALPHA, /* U+00cc8a: */
+                                           RTUNI_ALPHA, /* U+00cc8b: */
+                                           RTUNI_ALPHA, /* U+00cc8c: */
+                                           RTUNI_ALPHA, /* U+00cc8d: */
+                                           RTUNI_ALPHA, /* U+00cc8e: */
+                                           RTUNI_ALPHA, /* U+00cc8f: */
+                                           RTUNI_ALPHA, /* U+00cc90: */
+                                           RTUNI_ALPHA, /* U+00cc91: */
+                                           RTUNI_ALPHA, /* U+00cc92: */
+                                           RTUNI_ALPHA, /* U+00cc93: */
+                                           RTUNI_ALPHA, /* U+00cc94: */
+                                           RTUNI_ALPHA, /* U+00cc95: */
+                                           RTUNI_ALPHA, /* U+00cc96: */
+                                           RTUNI_ALPHA, /* U+00cc97: */
+                                           RTUNI_ALPHA, /* U+00cc98: */
+                                           RTUNI_ALPHA, /* U+00cc99: */
+                                           RTUNI_ALPHA, /* U+00cc9a: */
+                                           RTUNI_ALPHA, /* U+00cc9b: */
+                                           RTUNI_ALPHA, /* U+00cc9c: */
+                                           RTUNI_ALPHA, /* U+00cc9d: */
+                                           RTUNI_ALPHA, /* U+00cc9e: */
+                                           RTUNI_ALPHA, /* U+00cc9f: */
+                                           RTUNI_ALPHA, /* U+00cca0: */
+                                           RTUNI_ALPHA, /* U+00cca1: */
+                                           RTUNI_ALPHA, /* U+00cca2: */
+                                           RTUNI_ALPHA, /* U+00cca3: */
+                                           RTUNI_ALPHA, /* U+00cca4: */
+                                           RTUNI_ALPHA, /* U+00cca5: */
+                                           RTUNI_ALPHA, /* U+00cca6: */
+                                           RTUNI_ALPHA, /* U+00cca7: */
+                                           RTUNI_ALPHA, /* U+00cca8: */
+                                           RTUNI_ALPHA, /* U+00cca9: */
+                                           RTUNI_ALPHA, /* U+00ccaa: */
+                                           RTUNI_ALPHA, /* U+00ccab: */
+                                           RTUNI_ALPHA, /* U+00ccac: */
+                                           RTUNI_ALPHA, /* U+00ccad: */
+                                           RTUNI_ALPHA, /* U+00ccae: */
+                                           RTUNI_ALPHA, /* U+00ccaf: */
+                                           RTUNI_ALPHA, /* U+00ccb0: */
+                                           RTUNI_ALPHA, /* U+00ccb1: */
+                                           RTUNI_ALPHA, /* U+00ccb2: */
+                                           RTUNI_ALPHA, /* U+00ccb3: */
+                                           RTUNI_ALPHA, /* U+00ccb4: */
+                                           RTUNI_ALPHA, /* U+00ccb5: */
+                                           RTUNI_ALPHA, /* U+00ccb6: */
+                                           RTUNI_ALPHA, /* U+00ccb7: */
+                                           RTUNI_ALPHA, /* U+00ccb8: */
+                                           RTUNI_ALPHA, /* U+00ccb9: */
+                                           RTUNI_ALPHA, /* U+00ccba: */
+                                           RTUNI_ALPHA, /* U+00ccbb: */
+                                           RTUNI_ALPHA, /* U+00ccbc: */
+                                           RTUNI_ALPHA, /* U+00ccbd: */
+                                           RTUNI_ALPHA, /* U+00ccbe: */
+                                           RTUNI_ALPHA, /* U+00ccbf: */
+                                           RTUNI_ALPHA, /* U+00ccc0: */
+                                           RTUNI_ALPHA, /* U+00ccc1: */
+                                           RTUNI_ALPHA, /* U+00ccc2: */
+                                           RTUNI_ALPHA, /* U+00ccc3: */
+                                           RTUNI_ALPHA, /* U+00ccc4: */
+                                           RTUNI_ALPHA, /* U+00ccc5: */
+                                           RTUNI_ALPHA, /* U+00ccc6: */
+                                           RTUNI_ALPHA, /* U+00ccc7: */
+                                           RTUNI_ALPHA, /* U+00ccc8: */
+                                           RTUNI_ALPHA, /* U+00ccc9: */
+                                           RTUNI_ALPHA, /* U+00ccca: */
+                                           RTUNI_ALPHA, /* U+00cccb: */
+                                           RTUNI_ALPHA, /* U+00cccc: */
+                                           RTUNI_ALPHA, /* U+00cccd: */
+                                           RTUNI_ALPHA, /* U+00ccce: */
+                                           RTUNI_ALPHA, /* U+00cccf: */
+                                           RTUNI_ALPHA, /* U+00ccd0: */
+                                           RTUNI_ALPHA, /* U+00ccd1: */
+                                           RTUNI_ALPHA, /* U+00ccd2: */
+                                           RTUNI_ALPHA, /* U+00ccd3: */
+                                           RTUNI_ALPHA, /* U+00ccd4: */
+                                           RTUNI_ALPHA, /* U+00ccd5: */
+                                           RTUNI_ALPHA, /* U+00ccd6: */
+                                           RTUNI_ALPHA, /* U+00ccd7: */
+                                           RTUNI_ALPHA, /* U+00ccd8: */
+                                           RTUNI_ALPHA, /* U+00ccd9: */
+                                           RTUNI_ALPHA, /* U+00ccda: */
+                                           RTUNI_ALPHA, /* U+00ccdb: */
+                                           RTUNI_ALPHA, /* U+00ccdc: */
+                                           RTUNI_ALPHA, /* U+00ccdd: */
+                                           RTUNI_ALPHA, /* U+00ccde: */
+                                           RTUNI_ALPHA, /* U+00ccdf: */
+                                           RTUNI_ALPHA, /* U+00cce0: */
+                                           RTUNI_ALPHA, /* U+00cce1: */
+                                           RTUNI_ALPHA, /* U+00cce2: */
+                                           RTUNI_ALPHA, /* U+00cce3: */
+                                           RTUNI_ALPHA, /* U+00cce4: */
+                                           RTUNI_ALPHA, /* U+00cce5: */
+                                           RTUNI_ALPHA, /* U+00cce6: */
+                                           RTUNI_ALPHA, /* U+00cce7: */
+                                           RTUNI_ALPHA, /* U+00cce8: */
+                                           RTUNI_ALPHA, /* U+00cce9: */
+                                           RTUNI_ALPHA, /* U+00ccea: */
+                                           RTUNI_ALPHA, /* U+00cceb: */
+                                           RTUNI_ALPHA, /* U+00ccec: */
+                                           RTUNI_ALPHA, /* U+00cced: */
+                                           RTUNI_ALPHA, /* U+00ccee: */
+                                           RTUNI_ALPHA, /* U+00ccef: */
+                                           RTUNI_ALPHA, /* U+00ccf0: */
+                                           RTUNI_ALPHA, /* U+00ccf1: */
+                                           RTUNI_ALPHA, /* U+00ccf2: */
+                                           RTUNI_ALPHA, /* U+00ccf3: */
+                                           RTUNI_ALPHA, /* U+00ccf4: */
+                                           RTUNI_ALPHA, /* U+00ccf5: */
+                                           RTUNI_ALPHA, /* U+00ccf6: */
+                                           RTUNI_ALPHA, /* U+00ccf7: */
+                                           RTUNI_ALPHA, /* U+00ccf8: */
+                                           RTUNI_ALPHA, /* U+00ccf9: */
+                                           RTUNI_ALPHA, /* U+00ccfa: */
+                                           RTUNI_ALPHA, /* U+00ccfb: */
+                                           RTUNI_ALPHA, /* U+00ccfc: */
+                                           RTUNI_ALPHA, /* U+00ccfd: */
+                                           RTUNI_ALPHA, /* U+00ccfe: */
+                                           RTUNI_ALPHA, /* U+00ccff: */
+                                           RTUNI_ALPHA, /* U+00cd00: */
+                                           RTUNI_ALPHA, /* U+00cd01: */
+                                           RTUNI_ALPHA, /* U+00cd02: */
+                                           RTUNI_ALPHA, /* U+00cd03: */
+                                           RTUNI_ALPHA, /* U+00cd04: */
+                                           RTUNI_ALPHA, /* U+00cd05: */
+                                           RTUNI_ALPHA, /* U+00cd06: */
+                                           RTUNI_ALPHA, /* U+00cd07: */
+                                           RTUNI_ALPHA, /* U+00cd08: */
+                                           RTUNI_ALPHA, /* U+00cd09: */
+                                           RTUNI_ALPHA, /* U+00cd0a: */
+                                           RTUNI_ALPHA, /* U+00cd0b: */
+                                           RTUNI_ALPHA, /* U+00cd0c: */
+                                           RTUNI_ALPHA, /* U+00cd0d: */
+                                           RTUNI_ALPHA, /* U+00cd0e: */
+                                           RTUNI_ALPHA, /* U+00cd0f: */
+                                           RTUNI_ALPHA, /* U+00cd10: */
+                                           RTUNI_ALPHA, /* U+00cd11: */
+                                           RTUNI_ALPHA, /* U+00cd12: */
+                                           RTUNI_ALPHA, /* U+00cd13: */
+                                           RTUNI_ALPHA, /* U+00cd14: */
+                                           RTUNI_ALPHA, /* U+00cd15: */
+                                           RTUNI_ALPHA, /* U+00cd16: */
+                                           RTUNI_ALPHA, /* U+00cd17: */
+                                           RTUNI_ALPHA, /* U+00cd18: */
+                                           RTUNI_ALPHA, /* U+00cd19: */
+                                           RTUNI_ALPHA, /* U+00cd1a: */
+                                           RTUNI_ALPHA, /* U+00cd1b: */
+                                           RTUNI_ALPHA, /* U+00cd1c: */
+                                           RTUNI_ALPHA, /* U+00cd1d: */
+                                           RTUNI_ALPHA, /* U+00cd1e: */
+                                           RTUNI_ALPHA, /* U+00cd1f: */
+                                           RTUNI_ALPHA, /* U+00cd20: */
+                                           RTUNI_ALPHA, /* U+00cd21: */
+                                           RTUNI_ALPHA, /* U+00cd22: */
+                                           RTUNI_ALPHA, /* U+00cd23: */
+                                           RTUNI_ALPHA, /* U+00cd24: */
+                                           RTUNI_ALPHA, /* U+00cd25: */
+                                           RTUNI_ALPHA, /* U+00cd26: */
+                                           RTUNI_ALPHA, /* U+00cd27: */
+                                           RTUNI_ALPHA, /* U+00cd28: */
+                                           RTUNI_ALPHA, /* U+00cd29: */
+                                           RTUNI_ALPHA, /* U+00cd2a: */
+                                           RTUNI_ALPHA, /* U+00cd2b: */
+                                           RTUNI_ALPHA, /* U+00cd2c: */
+                                           RTUNI_ALPHA, /* U+00cd2d: */
+                                           RTUNI_ALPHA, /* U+00cd2e: */
+                                           RTUNI_ALPHA, /* U+00cd2f: */
+                                           RTUNI_ALPHA, /* U+00cd30: */
+                                           RTUNI_ALPHA, /* U+00cd31: */
+                                           RTUNI_ALPHA, /* U+00cd32: */
+                                           RTUNI_ALPHA, /* U+00cd33: */
+                                           RTUNI_ALPHA, /* U+00cd34: */
+                                           RTUNI_ALPHA, /* U+00cd35: */
+                                           RTUNI_ALPHA, /* U+00cd36: */
+                                           RTUNI_ALPHA, /* U+00cd37: */
+                                           RTUNI_ALPHA, /* U+00cd38: */
+                                           RTUNI_ALPHA, /* U+00cd39: */
+                                           RTUNI_ALPHA, /* U+00cd3a: */
+                                           RTUNI_ALPHA, /* U+00cd3b: */
+                                           RTUNI_ALPHA, /* U+00cd3c: */
+                                           RTUNI_ALPHA, /* U+00cd3d: */
+                                           RTUNI_ALPHA, /* U+00cd3e: */
+                                           RTUNI_ALPHA, /* U+00cd3f: */
+                                           RTUNI_ALPHA, /* U+00cd40: */
+                                           RTUNI_ALPHA, /* U+00cd41: */
+                                           RTUNI_ALPHA, /* U+00cd42: */
+                                           RTUNI_ALPHA, /* U+00cd43: */
+                                           RTUNI_ALPHA, /* U+00cd44: */
+                                           RTUNI_ALPHA, /* U+00cd45: */
+                                           RTUNI_ALPHA, /* U+00cd46: */
+                                           RTUNI_ALPHA, /* U+00cd47: */
+                                           RTUNI_ALPHA, /* U+00cd48: */
+                                           RTUNI_ALPHA, /* U+00cd49: */
+                                           RTUNI_ALPHA, /* U+00cd4a: */
+                                           RTUNI_ALPHA, /* U+00cd4b: */
+                                           RTUNI_ALPHA, /* U+00cd4c: */
+                                           RTUNI_ALPHA, /* U+00cd4d: */
+                                           RTUNI_ALPHA, /* U+00cd4e: */
+                                           RTUNI_ALPHA, /* U+00cd4f: */
+                                           RTUNI_ALPHA, /* U+00cd50: */
+                                           RTUNI_ALPHA, /* U+00cd51: */
+                                           RTUNI_ALPHA, /* U+00cd52: */
+                                           RTUNI_ALPHA, /* U+00cd53: */
+                                           RTUNI_ALPHA, /* U+00cd54: */
+                                           RTUNI_ALPHA, /* U+00cd55: */
+                                           RTUNI_ALPHA, /* U+00cd56: */
+                                           RTUNI_ALPHA, /* U+00cd57: */
+                                           RTUNI_ALPHA, /* U+00cd58: */
+                                           RTUNI_ALPHA, /* U+00cd59: */
+                                           RTUNI_ALPHA, /* U+00cd5a: */
+                                           RTUNI_ALPHA, /* U+00cd5b: */
+                                           RTUNI_ALPHA, /* U+00cd5c: */
+                                           RTUNI_ALPHA, /* U+00cd5d: */
+                                           RTUNI_ALPHA, /* U+00cd5e: */
+                                           RTUNI_ALPHA, /* U+00cd5f: */
+                                           RTUNI_ALPHA, /* U+00cd60: */
+                                           RTUNI_ALPHA, /* U+00cd61: */
+                                           RTUNI_ALPHA, /* U+00cd62: */
+                                           RTUNI_ALPHA, /* U+00cd63: */
+                                           RTUNI_ALPHA, /* U+00cd64: */
+                                           RTUNI_ALPHA, /* U+00cd65: */
+                                           RTUNI_ALPHA, /* U+00cd66: */
+                                           RTUNI_ALPHA, /* U+00cd67: */
+                                           RTUNI_ALPHA, /* U+00cd68: */
+                                           RTUNI_ALPHA, /* U+00cd69: */
+                                           RTUNI_ALPHA, /* U+00cd6a: */
+                                           RTUNI_ALPHA, /* U+00cd6b: */
+                                           RTUNI_ALPHA, /* U+00cd6c: */
+                                           RTUNI_ALPHA, /* U+00cd6d: */
+                                           RTUNI_ALPHA, /* U+00cd6e: */
+                                           RTUNI_ALPHA, /* U+00cd6f: */
+                                           RTUNI_ALPHA, /* U+00cd70: */
+                                           RTUNI_ALPHA, /* U+00cd71: */
+                                           RTUNI_ALPHA, /* U+00cd72: */
+                                           RTUNI_ALPHA, /* U+00cd73: */
+                                           RTUNI_ALPHA, /* U+00cd74: */
+                                           RTUNI_ALPHA, /* U+00cd75: */
+                                           RTUNI_ALPHA, /* U+00cd76: */
+                                           RTUNI_ALPHA, /* U+00cd77: */
+                                           RTUNI_ALPHA, /* U+00cd78: */
+                                           RTUNI_ALPHA, /* U+00cd79: */
+                                           RTUNI_ALPHA, /* U+00cd7a: */
+                                           RTUNI_ALPHA, /* U+00cd7b: */
+                                           RTUNI_ALPHA, /* U+00cd7c: */
+                                           RTUNI_ALPHA, /* U+00cd7d: */
+                                           RTUNI_ALPHA, /* U+00cd7e: */
+                                           RTUNI_ALPHA, /* U+00cd7f: */
+                                           RTUNI_ALPHA, /* U+00cd80: */
+                                           RTUNI_ALPHA, /* U+00cd81: */
+                                           RTUNI_ALPHA, /* U+00cd82: */
+                                           RTUNI_ALPHA, /* U+00cd83: */
+                                           RTUNI_ALPHA, /* U+00cd84: */
+                                           RTUNI_ALPHA, /* U+00cd85: */
+                                           RTUNI_ALPHA, /* U+00cd86: */
+                                           RTUNI_ALPHA, /* U+00cd87: */
+                                           RTUNI_ALPHA, /* U+00cd88: */
+                                           RTUNI_ALPHA, /* U+00cd89: */
+                                           RTUNI_ALPHA, /* U+00cd8a: */
+                                           RTUNI_ALPHA, /* U+00cd8b: */
+                                           RTUNI_ALPHA, /* U+00cd8c: */
+                                           RTUNI_ALPHA, /* U+00cd8d: */
+                                           RTUNI_ALPHA, /* U+00cd8e: */
+                                           RTUNI_ALPHA, /* U+00cd8f: */
+                                           RTUNI_ALPHA, /* U+00cd90: */
+                                           RTUNI_ALPHA, /* U+00cd91: */
+                                           RTUNI_ALPHA, /* U+00cd92: */
+                                           RTUNI_ALPHA, /* U+00cd93: */
+                                           RTUNI_ALPHA, /* U+00cd94: */
+                                           RTUNI_ALPHA, /* U+00cd95: */
+                                           RTUNI_ALPHA, /* U+00cd96: */
+                                           RTUNI_ALPHA, /* U+00cd97: */
+                                           RTUNI_ALPHA, /* U+00cd98: */
+                                           RTUNI_ALPHA, /* U+00cd99: */
+                                           RTUNI_ALPHA, /* U+00cd9a: */
+                                           RTUNI_ALPHA, /* U+00cd9b: */
+                                           RTUNI_ALPHA, /* U+00cd9c: */
+                                           RTUNI_ALPHA, /* U+00cd9d: */
+                                           RTUNI_ALPHA, /* U+00cd9e: */
+                                           RTUNI_ALPHA, /* U+00cd9f: */
+                                           RTUNI_ALPHA, /* U+00cda0: */
+                                           RTUNI_ALPHA, /* U+00cda1: */
+                                           RTUNI_ALPHA, /* U+00cda2: */
+                                           RTUNI_ALPHA, /* U+00cda3: */
+                                           RTUNI_ALPHA, /* U+00cda4: */
+                                           RTUNI_ALPHA, /* U+00cda5: */
+                                           RTUNI_ALPHA, /* U+00cda6: */
+                                           RTUNI_ALPHA, /* U+00cda7: */
+                                           RTUNI_ALPHA, /* U+00cda8: */
+                                           RTUNI_ALPHA, /* U+00cda9: */
+                                           RTUNI_ALPHA, /* U+00cdaa: */
+                                           RTUNI_ALPHA, /* U+00cdab: */
+                                           RTUNI_ALPHA, /* U+00cdac: */
+                                           RTUNI_ALPHA, /* U+00cdad: */
+                                           RTUNI_ALPHA, /* U+00cdae: */
+                                           RTUNI_ALPHA, /* U+00cdaf: */
+                                           RTUNI_ALPHA, /* U+00cdb0: */
+                                           RTUNI_ALPHA, /* U+00cdb1: */
+                                           RTUNI_ALPHA, /* U+00cdb2: */
+                                           RTUNI_ALPHA, /* U+00cdb3: */
+                                           RTUNI_ALPHA, /* U+00cdb4: */
+                                           RTUNI_ALPHA, /* U+00cdb5: */
+                                           RTUNI_ALPHA, /* U+00cdb6: */
+                                           RTUNI_ALPHA, /* U+00cdb7: */
+                                           RTUNI_ALPHA, /* U+00cdb8: */
+                                           RTUNI_ALPHA, /* U+00cdb9: */
+                                           RTUNI_ALPHA, /* U+00cdba: */
+                                           RTUNI_ALPHA, /* U+00cdbb: */
+                                           RTUNI_ALPHA, /* U+00cdbc: */
+                                           RTUNI_ALPHA, /* U+00cdbd: */
+                                           RTUNI_ALPHA, /* U+00cdbe: */
+                                           RTUNI_ALPHA, /* U+00cdbf: */
+                                           RTUNI_ALPHA, /* U+00cdc0: */
+                                           RTUNI_ALPHA, /* U+00cdc1: */
+                                           RTUNI_ALPHA, /* U+00cdc2: */
+                                           RTUNI_ALPHA, /* U+00cdc3: */
+                                           RTUNI_ALPHA, /* U+00cdc4: */
+                                           RTUNI_ALPHA, /* U+00cdc5: */
+                                           RTUNI_ALPHA, /* U+00cdc6: */
+                                           RTUNI_ALPHA, /* U+00cdc7: */
+                                           RTUNI_ALPHA, /* U+00cdc8: */
+                                           RTUNI_ALPHA, /* U+00cdc9: */
+                                           RTUNI_ALPHA, /* U+00cdca: */
+                                           RTUNI_ALPHA, /* U+00cdcb: */
+                                           RTUNI_ALPHA, /* U+00cdcc: */
+                                           RTUNI_ALPHA, /* U+00cdcd: */
+                                           RTUNI_ALPHA, /* U+00cdce: */
+                                           RTUNI_ALPHA, /* U+00cdcf: */
+                                           RTUNI_ALPHA, /* U+00cdd0: */
+                                           RTUNI_ALPHA, /* U+00cdd1: */
+                                           RTUNI_ALPHA, /* U+00cdd2: */
+                                           RTUNI_ALPHA, /* U+00cdd3: */
+                                           RTUNI_ALPHA, /* U+00cdd4: */
+                                           RTUNI_ALPHA, /* U+00cdd5: */
+                                           RTUNI_ALPHA, /* U+00cdd6: */
+                                           RTUNI_ALPHA, /* U+00cdd7: */
+                                           RTUNI_ALPHA, /* U+00cdd8: */
+                                           RTUNI_ALPHA, /* U+00cdd9: */
+                                           RTUNI_ALPHA, /* U+00cdda: */
+                                           RTUNI_ALPHA, /* U+00cddb: */
+                                           RTUNI_ALPHA, /* U+00cddc: */
+                                           RTUNI_ALPHA, /* U+00cddd: */
+                                           RTUNI_ALPHA, /* U+00cdde: */
+                                           RTUNI_ALPHA, /* U+00cddf: */
+                                           RTUNI_ALPHA, /* U+00cde0: */
+                                           RTUNI_ALPHA, /* U+00cde1: */
+                                           RTUNI_ALPHA, /* U+00cde2: */
+                                           RTUNI_ALPHA, /* U+00cde3: */
+                                           RTUNI_ALPHA, /* U+00cde4: */
+                                           RTUNI_ALPHA, /* U+00cde5: */
+                                           RTUNI_ALPHA, /* U+00cde6: */
+                                           RTUNI_ALPHA, /* U+00cde7: */
+                                           RTUNI_ALPHA, /* U+00cde8: */
+                                           RTUNI_ALPHA, /* U+00cde9: */
+                                           RTUNI_ALPHA, /* U+00cdea: */
+                                           RTUNI_ALPHA, /* U+00cdeb: */
+                                           RTUNI_ALPHA, /* U+00cdec: */
+                                           RTUNI_ALPHA, /* U+00cded: */
+                                           RTUNI_ALPHA, /* U+00cdee: */
+                                           RTUNI_ALPHA, /* U+00cdef: */
+                                           RTUNI_ALPHA, /* U+00cdf0: */
+                                           RTUNI_ALPHA, /* U+00cdf1: */
+                                           RTUNI_ALPHA, /* U+00cdf2: */
+                                           RTUNI_ALPHA, /* U+00cdf3: */
+                                           RTUNI_ALPHA, /* U+00cdf4: */
+                                           RTUNI_ALPHA, /* U+00cdf5: */
+                                           RTUNI_ALPHA, /* U+00cdf6: */
+                                           RTUNI_ALPHA, /* U+00cdf7: */
+                                           RTUNI_ALPHA, /* U+00cdf8: */
+                                           RTUNI_ALPHA, /* U+00cdf9: */
+                                           RTUNI_ALPHA, /* U+00cdfa: */
+                                           RTUNI_ALPHA, /* U+00cdfb: */
+                                           RTUNI_ALPHA, /* U+00cdfc: */
+                                           RTUNI_ALPHA, /* U+00cdfd: */
+                                           RTUNI_ALPHA, /* U+00cdfe: */
+                                           RTUNI_ALPHA, /* U+00cdff: */
+                                           RTUNI_ALPHA, /* U+00ce00: */
+                                           RTUNI_ALPHA, /* U+00ce01: */
+                                           RTUNI_ALPHA, /* U+00ce02: */
+                                           RTUNI_ALPHA, /* U+00ce03: */
+                                           RTUNI_ALPHA, /* U+00ce04: */
+                                           RTUNI_ALPHA, /* U+00ce05: */
+                                           RTUNI_ALPHA, /* U+00ce06: */
+                                           RTUNI_ALPHA, /* U+00ce07: */
+                                           RTUNI_ALPHA, /* U+00ce08: */
+                                           RTUNI_ALPHA, /* U+00ce09: */
+                                           RTUNI_ALPHA, /* U+00ce0a: */
+                                           RTUNI_ALPHA, /* U+00ce0b: */
+                                           RTUNI_ALPHA, /* U+00ce0c: */
+                                           RTUNI_ALPHA, /* U+00ce0d: */
+                                           RTUNI_ALPHA, /* U+00ce0e: */
+                                           RTUNI_ALPHA, /* U+00ce0f: */
+                                           RTUNI_ALPHA, /* U+00ce10: */
+                                           RTUNI_ALPHA, /* U+00ce11: */
+                                           RTUNI_ALPHA, /* U+00ce12: */
+                                           RTUNI_ALPHA, /* U+00ce13: */
+                                           RTUNI_ALPHA, /* U+00ce14: */
+                                           RTUNI_ALPHA, /* U+00ce15: */
+                                           RTUNI_ALPHA, /* U+00ce16: */
+                                           RTUNI_ALPHA, /* U+00ce17: */
+                                           RTUNI_ALPHA, /* U+00ce18: */
+                                           RTUNI_ALPHA, /* U+00ce19: */
+                                           RTUNI_ALPHA, /* U+00ce1a: */
+                                           RTUNI_ALPHA, /* U+00ce1b: */
+                                           RTUNI_ALPHA, /* U+00ce1c: */
+                                           RTUNI_ALPHA, /* U+00ce1d: */
+                                           RTUNI_ALPHA, /* U+00ce1e: */
+                                           RTUNI_ALPHA, /* U+00ce1f: */
+                                           RTUNI_ALPHA, /* U+00ce20: */
+                                           RTUNI_ALPHA, /* U+00ce21: */
+                                           RTUNI_ALPHA, /* U+00ce22: */
+                                           RTUNI_ALPHA, /* U+00ce23: */
+                                           RTUNI_ALPHA, /* U+00ce24: */
+                                           RTUNI_ALPHA, /* U+00ce25: */
+                                           RTUNI_ALPHA, /* U+00ce26: */
+                                           RTUNI_ALPHA, /* U+00ce27: */
+                                           RTUNI_ALPHA, /* U+00ce28: */
+                                           RTUNI_ALPHA, /* U+00ce29: */
+                                           RTUNI_ALPHA, /* U+00ce2a: */
+                                           RTUNI_ALPHA, /* U+00ce2b: */
+                                           RTUNI_ALPHA, /* U+00ce2c: */
+                                           RTUNI_ALPHA, /* U+00ce2d: */
+                                           RTUNI_ALPHA, /* U+00ce2e: */
+                                           RTUNI_ALPHA, /* U+00ce2f: */
+                                           RTUNI_ALPHA, /* U+00ce30: */
+                                           RTUNI_ALPHA, /* U+00ce31: */
+                                           RTUNI_ALPHA, /* U+00ce32: */
+                                           RTUNI_ALPHA, /* U+00ce33: */
+                                           RTUNI_ALPHA, /* U+00ce34: */
+                                           RTUNI_ALPHA, /* U+00ce35: */
+                                           RTUNI_ALPHA, /* U+00ce36: */
+                                           RTUNI_ALPHA, /* U+00ce37: */
+                                           RTUNI_ALPHA, /* U+00ce38: */
+                                           RTUNI_ALPHA, /* U+00ce39: */
+                                           RTUNI_ALPHA, /* U+00ce3a: */
+                                           RTUNI_ALPHA, /* U+00ce3b: */
+                                           RTUNI_ALPHA, /* U+00ce3c: */
+                                           RTUNI_ALPHA, /* U+00ce3d: */
+                                           RTUNI_ALPHA, /* U+00ce3e: */
+                                           RTUNI_ALPHA, /* U+00ce3f: */
+                                           RTUNI_ALPHA, /* U+00ce40: */
+                                           RTUNI_ALPHA, /* U+00ce41: */
+                                           RTUNI_ALPHA, /* U+00ce42: */
+                                           RTUNI_ALPHA, /* U+00ce43: */
+                                           RTUNI_ALPHA, /* U+00ce44: */
+                                           RTUNI_ALPHA, /* U+00ce45: */
+                                           RTUNI_ALPHA, /* U+00ce46: */
+                                           RTUNI_ALPHA, /* U+00ce47: */
+                                           RTUNI_ALPHA, /* U+00ce48: */
+                                           RTUNI_ALPHA, /* U+00ce49: */
+                                           RTUNI_ALPHA, /* U+00ce4a: */
+                                           RTUNI_ALPHA, /* U+00ce4b: */
+                                           RTUNI_ALPHA, /* U+00ce4c: */
+                                           RTUNI_ALPHA, /* U+00ce4d: */
+                                           RTUNI_ALPHA, /* U+00ce4e: */
+                                           RTUNI_ALPHA, /* U+00ce4f: */
+                                           RTUNI_ALPHA, /* U+00ce50: */
+                                           RTUNI_ALPHA, /* U+00ce51: */
+                                           RTUNI_ALPHA, /* U+00ce52: */
+                                           RTUNI_ALPHA, /* U+00ce53: */
+                                           RTUNI_ALPHA, /* U+00ce54: */
+                                           RTUNI_ALPHA, /* U+00ce55: */
+                                           RTUNI_ALPHA, /* U+00ce56: */
+                                           RTUNI_ALPHA, /* U+00ce57: */
+                                           RTUNI_ALPHA, /* U+00ce58: */
+                                           RTUNI_ALPHA, /* U+00ce59: */
+                                           RTUNI_ALPHA, /* U+00ce5a: */
+                                           RTUNI_ALPHA, /* U+00ce5b: */
+                                           RTUNI_ALPHA, /* U+00ce5c: */
+                                           RTUNI_ALPHA, /* U+00ce5d: */
+                                           RTUNI_ALPHA, /* U+00ce5e: */
+                                           RTUNI_ALPHA, /* U+00ce5f: */
+                                           RTUNI_ALPHA, /* U+00ce60: */
+                                           RTUNI_ALPHA, /* U+00ce61: */
+                                           RTUNI_ALPHA, /* U+00ce62: */
+                                           RTUNI_ALPHA, /* U+00ce63: */
+                                           RTUNI_ALPHA, /* U+00ce64: */
+                                           RTUNI_ALPHA, /* U+00ce65: */
+                                           RTUNI_ALPHA, /* U+00ce66: */
+                                           RTUNI_ALPHA, /* U+00ce67: */
+                                           RTUNI_ALPHA, /* U+00ce68: */
+                                           RTUNI_ALPHA, /* U+00ce69: */
+                                           RTUNI_ALPHA, /* U+00ce6a: */
+                                           RTUNI_ALPHA, /* U+00ce6b: */
+                                           RTUNI_ALPHA, /* U+00ce6c: */
+                                           RTUNI_ALPHA, /* U+00ce6d: */
+                                           RTUNI_ALPHA, /* U+00ce6e: */
+                                           RTUNI_ALPHA, /* U+00ce6f: */
+                                           RTUNI_ALPHA, /* U+00ce70: */
+                                           RTUNI_ALPHA, /* U+00ce71: */
+                                           RTUNI_ALPHA, /* U+00ce72: */
+                                           RTUNI_ALPHA, /* U+00ce73: */
+                                           RTUNI_ALPHA, /* U+00ce74: */
+                                           RTUNI_ALPHA, /* U+00ce75: */
+                                           RTUNI_ALPHA, /* U+00ce76: */
+                                           RTUNI_ALPHA, /* U+00ce77: */
+                                           RTUNI_ALPHA, /* U+00ce78: */
+                                           RTUNI_ALPHA, /* U+00ce79: */
+                                           RTUNI_ALPHA, /* U+00ce7a: */
+                                           RTUNI_ALPHA, /* U+00ce7b: */
+                                           RTUNI_ALPHA, /* U+00ce7c: */
+                                           RTUNI_ALPHA, /* U+00ce7d: */
+                                           RTUNI_ALPHA, /* U+00ce7e: */
+                                           RTUNI_ALPHA, /* U+00ce7f: */
+                                           RTUNI_ALPHA, /* U+00ce80: */
+                                           RTUNI_ALPHA, /* U+00ce81: */
+                                           RTUNI_ALPHA, /* U+00ce82: */
+                                           RTUNI_ALPHA, /* U+00ce83: */
+                                           RTUNI_ALPHA, /* U+00ce84: */
+                                           RTUNI_ALPHA, /* U+00ce85: */
+                                           RTUNI_ALPHA, /* U+00ce86: */
+                                           RTUNI_ALPHA, /* U+00ce87: */
+                                           RTUNI_ALPHA, /* U+00ce88: */
+                                           RTUNI_ALPHA, /* U+00ce89: */
+                                           RTUNI_ALPHA, /* U+00ce8a: */
+                                           RTUNI_ALPHA, /* U+00ce8b: */
+                                           RTUNI_ALPHA, /* U+00ce8c: */
+                                           RTUNI_ALPHA, /* U+00ce8d: */
+                                           RTUNI_ALPHA, /* U+00ce8e: */
+                                           RTUNI_ALPHA, /* U+00ce8f: */
+                                           RTUNI_ALPHA, /* U+00ce90: */
+                                           RTUNI_ALPHA, /* U+00ce91: */
+                                           RTUNI_ALPHA, /* U+00ce92: */
+                                           RTUNI_ALPHA, /* U+00ce93: */
+                                           RTUNI_ALPHA, /* U+00ce94: */
+                                           RTUNI_ALPHA, /* U+00ce95: */
+                                           RTUNI_ALPHA, /* U+00ce96: */
+                                           RTUNI_ALPHA, /* U+00ce97: */
+                                           RTUNI_ALPHA, /* U+00ce98: */
+                                           RTUNI_ALPHA, /* U+00ce99: */
+                                           RTUNI_ALPHA, /* U+00ce9a: */
+                                           RTUNI_ALPHA, /* U+00ce9b: */
+                                           RTUNI_ALPHA, /* U+00ce9c: */
+                                           RTUNI_ALPHA, /* U+00ce9d: */
+                                           RTUNI_ALPHA, /* U+00ce9e: */
+                                           RTUNI_ALPHA, /* U+00ce9f: */
+                                           RTUNI_ALPHA, /* U+00cea0: */
+                                           RTUNI_ALPHA, /* U+00cea1: */
+                                           RTUNI_ALPHA, /* U+00cea2: */
+                                           RTUNI_ALPHA, /* U+00cea3: */
+                                           RTUNI_ALPHA, /* U+00cea4: */
+                                           RTUNI_ALPHA, /* U+00cea5: */
+                                           RTUNI_ALPHA, /* U+00cea6: */
+                                           RTUNI_ALPHA, /* U+00cea7: */
+                                           RTUNI_ALPHA, /* U+00cea8: */
+                                           RTUNI_ALPHA, /* U+00cea9: */
+                                           RTUNI_ALPHA, /* U+00ceaa: */
+                                           RTUNI_ALPHA, /* U+00ceab: */
+                                           RTUNI_ALPHA, /* U+00ceac: */
+                                           RTUNI_ALPHA, /* U+00cead: */
+                                           RTUNI_ALPHA, /* U+00ceae: */
+                                           RTUNI_ALPHA, /* U+00ceaf: */
+                                           RTUNI_ALPHA, /* U+00ceb0: */
+                                           RTUNI_ALPHA, /* U+00ceb1: */
+                                           RTUNI_ALPHA, /* U+00ceb2: */
+                                           RTUNI_ALPHA, /* U+00ceb3: */
+                                           RTUNI_ALPHA, /* U+00ceb4: */
+                                           RTUNI_ALPHA, /* U+00ceb5: */
+                                           RTUNI_ALPHA, /* U+00ceb6: */
+                                           RTUNI_ALPHA, /* U+00ceb7: */
+                                           RTUNI_ALPHA, /* U+00ceb8: */
+                                           RTUNI_ALPHA, /* U+00ceb9: */
+                                           RTUNI_ALPHA, /* U+00ceba: */
+                                           RTUNI_ALPHA, /* U+00cebb: */
+                                           RTUNI_ALPHA, /* U+00cebc: */
+                                           RTUNI_ALPHA, /* U+00cebd: */
+                                           RTUNI_ALPHA, /* U+00cebe: */
+                                           RTUNI_ALPHA, /* U+00cebf: */
+                                           RTUNI_ALPHA, /* U+00cec0: */
+                                           RTUNI_ALPHA, /* U+00cec1: */
+                                           RTUNI_ALPHA, /* U+00cec2: */
+                                           RTUNI_ALPHA, /* U+00cec3: */
+                                           RTUNI_ALPHA, /* U+00cec4: */
+                                           RTUNI_ALPHA, /* U+00cec5: */
+                                           RTUNI_ALPHA, /* U+00cec6: */
+                                           RTUNI_ALPHA, /* U+00cec7: */
+                                           RTUNI_ALPHA, /* U+00cec8: */
+                                           RTUNI_ALPHA, /* U+00cec9: */
+                                           RTUNI_ALPHA, /* U+00ceca: */
+                                           RTUNI_ALPHA, /* U+00cecb: */
+                                           RTUNI_ALPHA, /* U+00cecc: */
+                                           RTUNI_ALPHA, /* U+00cecd: */
+                                           RTUNI_ALPHA, /* U+00cece: */
+                                           RTUNI_ALPHA, /* U+00cecf: */
+                                           RTUNI_ALPHA, /* U+00ced0: */
+                                           RTUNI_ALPHA, /* U+00ced1: */
+                                           RTUNI_ALPHA, /* U+00ced2: */
+                                           RTUNI_ALPHA, /* U+00ced3: */
+                                           RTUNI_ALPHA, /* U+00ced4: */
+                                           RTUNI_ALPHA, /* U+00ced5: */
+                                           RTUNI_ALPHA, /* U+00ced6: */
+                                           RTUNI_ALPHA, /* U+00ced7: */
+                                           RTUNI_ALPHA, /* U+00ced8: */
+                                           RTUNI_ALPHA, /* U+00ced9: */
+                                           RTUNI_ALPHA, /* U+00ceda: */
+                                           RTUNI_ALPHA, /* U+00cedb: */
+                                           RTUNI_ALPHA, /* U+00cedc: */
+                                           RTUNI_ALPHA, /* U+00cedd: */
+                                           RTUNI_ALPHA, /* U+00cede: */
+                                           RTUNI_ALPHA, /* U+00cedf: */
+                                           RTUNI_ALPHA, /* U+00cee0: */
+                                           RTUNI_ALPHA, /* U+00cee1: */
+                                           RTUNI_ALPHA, /* U+00cee2: */
+                                           RTUNI_ALPHA, /* U+00cee3: */
+                                           RTUNI_ALPHA, /* U+00cee4: */
+                                           RTUNI_ALPHA, /* U+00cee5: */
+                                           RTUNI_ALPHA, /* U+00cee6: */
+                                           RTUNI_ALPHA, /* U+00cee7: */
+                                           RTUNI_ALPHA, /* U+00cee8: */
+                                           RTUNI_ALPHA, /* U+00cee9: */
+                                           RTUNI_ALPHA, /* U+00ceea: */
+                                           RTUNI_ALPHA, /* U+00ceeb: */
+                                           RTUNI_ALPHA, /* U+00ceec: */
+                                           RTUNI_ALPHA, /* U+00ceed: */
+                                           RTUNI_ALPHA, /* U+00ceee: */
+                                           RTUNI_ALPHA, /* U+00ceef: */
+                                           RTUNI_ALPHA, /* U+00cef0: */
+                                           RTUNI_ALPHA, /* U+00cef1: */
+                                           RTUNI_ALPHA, /* U+00cef2: */
+                                           RTUNI_ALPHA, /* U+00cef3: */
+                                           RTUNI_ALPHA, /* U+00cef4: */
+                                           RTUNI_ALPHA, /* U+00cef5: */
+                                           RTUNI_ALPHA, /* U+00cef6: */
+                                           RTUNI_ALPHA, /* U+00cef7: */
+                                           RTUNI_ALPHA, /* U+00cef8: */
+                                           RTUNI_ALPHA, /* U+00cef9: */
+                                           RTUNI_ALPHA, /* U+00cefa: */
+                                           RTUNI_ALPHA, /* U+00cefb: */
+                                           RTUNI_ALPHA, /* U+00cefc: */
+                                           RTUNI_ALPHA, /* U+00cefd: */
+                                           RTUNI_ALPHA, /* U+00cefe: */
+                                           RTUNI_ALPHA, /* U+00ceff: */
+                                           RTUNI_ALPHA, /* U+00cf00: */
+                                           RTUNI_ALPHA, /* U+00cf01: */
+                                           RTUNI_ALPHA, /* U+00cf02: */
+                                           RTUNI_ALPHA, /* U+00cf03: */
+                                           RTUNI_ALPHA, /* U+00cf04: */
+                                           RTUNI_ALPHA, /* U+00cf05: */
+                                           RTUNI_ALPHA, /* U+00cf06: */
+                                           RTUNI_ALPHA, /* U+00cf07: */
+                                           RTUNI_ALPHA, /* U+00cf08: */
+                                           RTUNI_ALPHA, /* U+00cf09: */
+                                           RTUNI_ALPHA, /* U+00cf0a: */
+                                           RTUNI_ALPHA, /* U+00cf0b: */
+                                           RTUNI_ALPHA, /* U+00cf0c: */
+                                           RTUNI_ALPHA, /* U+00cf0d: */
+                                           RTUNI_ALPHA, /* U+00cf0e: */
+                                           RTUNI_ALPHA, /* U+00cf0f: */
+                                           RTUNI_ALPHA, /* U+00cf10: */
+                                           RTUNI_ALPHA, /* U+00cf11: */
+                                           RTUNI_ALPHA, /* U+00cf12: */
+                                           RTUNI_ALPHA, /* U+00cf13: */
+                                           RTUNI_ALPHA, /* U+00cf14: */
+                                           RTUNI_ALPHA, /* U+00cf15: */
+                                           RTUNI_ALPHA, /* U+00cf16: */
+                                           RTUNI_ALPHA, /* U+00cf17: */
+                                           RTUNI_ALPHA, /* U+00cf18: */
+                                           RTUNI_ALPHA, /* U+00cf19: */
+                                           RTUNI_ALPHA, /* U+00cf1a: */
+                                           RTUNI_ALPHA, /* U+00cf1b: */
+                                           RTUNI_ALPHA, /* U+00cf1c: */
+                                           RTUNI_ALPHA, /* U+00cf1d: */
+                                           RTUNI_ALPHA, /* U+00cf1e: */
+                                           RTUNI_ALPHA, /* U+00cf1f: */
+                                           RTUNI_ALPHA, /* U+00cf20: */
+                                           RTUNI_ALPHA, /* U+00cf21: */
+                                           RTUNI_ALPHA, /* U+00cf22: */
+                                           RTUNI_ALPHA, /* U+00cf23: */
+                                           RTUNI_ALPHA, /* U+00cf24: */
+                                           RTUNI_ALPHA, /* U+00cf25: */
+                                           RTUNI_ALPHA, /* U+00cf26: */
+                                           RTUNI_ALPHA, /* U+00cf27: */
+                                           RTUNI_ALPHA, /* U+00cf28: */
+                                           RTUNI_ALPHA, /* U+00cf29: */
+                                           RTUNI_ALPHA, /* U+00cf2a: */
+                                           RTUNI_ALPHA, /* U+00cf2b: */
+                                           RTUNI_ALPHA, /* U+00cf2c: */
+                                           RTUNI_ALPHA, /* U+00cf2d: */
+                                           RTUNI_ALPHA, /* U+00cf2e: */
+                                           RTUNI_ALPHA, /* U+00cf2f: */
+                                           RTUNI_ALPHA, /* U+00cf30: */
+                                           RTUNI_ALPHA, /* U+00cf31: */
+                                           RTUNI_ALPHA, /* U+00cf32: */
+                                           RTUNI_ALPHA, /* U+00cf33: */
+                                           RTUNI_ALPHA, /* U+00cf34: */
+                                           RTUNI_ALPHA, /* U+00cf35: */
+                                           RTUNI_ALPHA, /* U+00cf36: */
+                                           RTUNI_ALPHA, /* U+00cf37: */
+                                           RTUNI_ALPHA, /* U+00cf38: */
+                                           RTUNI_ALPHA, /* U+00cf39: */
+                                           RTUNI_ALPHA, /* U+00cf3a: */
+                                           RTUNI_ALPHA, /* U+00cf3b: */
+                                           RTUNI_ALPHA, /* U+00cf3c: */
+                                           RTUNI_ALPHA, /* U+00cf3d: */
+                                           RTUNI_ALPHA, /* U+00cf3e: */
+                                           RTUNI_ALPHA, /* U+00cf3f: */
+                                           RTUNI_ALPHA, /* U+00cf40: */
+                                           RTUNI_ALPHA, /* U+00cf41: */
+                                           RTUNI_ALPHA, /* U+00cf42: */
+                                           RTUNI_ALPHA, /* U+00cf43: */
+                                           RTUNI_ALPHA, /* U+00cf44: */
+                                           RTUNI_ALPHA, /* U+00cf45: */
+                                           RTUNI_ALPHA, /* U+00cf46: */
+                                           RTUNI_ALPHA, /* U+00cf47: */
+                                           RTUNI_ALPHA, /* U+00cf48: */
+                                           RTUNI_ALPHA, /* U+00cf49: */
+                                           RTUNI_ALPHA, /* U+00cf4a: */
+                                           RTUNI_ALPHA, /* U+00cf4b: */
+                                           RTUNI_ALPHA, /* U+00cf4c: */
+                                           RTUNI_ALPHA, /* U+00cf4d: */
+                                           RTUNI_ALPHA, /* U+00cf4e: */
+                                           RTUNI_ALPHA, /* U+00cf4f: */
+                                           RTUNI_ALPHA, /* U+00cf50: */
+                                           RTUNI_ALPHA, /* U+00cf51: */
+                                           RTUNI_ALPHA, /* U+00cf52: */
+                                           RTUNI_ALPHA, /* U+00cf53: */
+                                           RTUNI_ALPHA, /* U+00cf54: */
+                                           RTUNI_ALPHA, /* U+00cf55: */
+                                           RTUNI_ALPHA, /* U+00cf56: */
+                                           RTUNI_ALPHA, /* U+00cf57: */
+                                           RTUNI_ALPHA, /* U+00cf58: */
+                                           RTUNI_ALPHA, /* U+00cf59: */
+                                           RTUNI_ALPHA, /* U+00cf5a: */
+                                           RTUNI_ALPHA, /* U+00cf5b: */
+                                           RTUNI_ALPHA, /* U+00cf5c: */
+                                           RTUNI_ALPHA, /* U+00cf5d: */
+                                           RTUNI_ALPHA, /* U+00cf5e: */
+                                           RTUNI_ALPHA, /* U+00cf5f: */
+                                           RTUNI_ALPHA, /* U+00cf60: */
+                                           RTUNI_ALPHA, /* U+00cf61: */
+                                           RTUNI_ALPHA, /* U+00cf62: */
+                                           RTUNI_ALPHA, /* U+00cf63: */
+                                           RTUNI_ALPHA, /* U+00cf64: */
+                                           RTUNI_ALPHA, /* U+00cf65: */
+                                           RTUNI_ALPHA, /* U+00cf66: */
+                                           RTUNI_ALPHA, /* U+00cf67: */
+                                           RTUNI_ALPHA, /* U+00cf68: */
+                                           RTUNI_ALPHA, /* U+00cf69: */
+                                           RTUNI_ALPHA, /* U+00cf6a: */
+                                           RTUNI_ALPHA, /* U+00cf6b: */
+                                           RTUNI_ALPHA, /* U+00cf6c: */
+                                           RTUNI_ALPHA, /* U+00cf6d: */
+                                           RTUNI_ALPHA, /* U+00cf6e: */
+                                           RTUNI_ALPHA, /* U+00cf6f: */
+                                           RTUNI_ALPHA, /* U+00cf70: */
+                                           RTUNI_ALPHA, /* U+00cf71: */
+                                           RTUNI_ALPHA, /* U+00cf72: */
+                                           RTUNI_ALPHA, /* U+00cf73: */
+                                           RTUNI_ALPHA, /* U+00cf74: */
+                                           RTUNI_ALPHA, /* U+00cf75: */
+                                           RTUNI_ALPHA, /* U+00cf76: */
+                                           RTUNI_ALPHA, /* U+00cf77: */
+                                           RTUNI_ALPHA, /* U+00cf78: */
+                                           RTUNI_ALPHA, /* U+00cf79: */
+                                           RTUNI_ALPHA, /* U+00cf7a: */
+                                           RTUNI_ALPHA, /* U+00cf7b: */
+                                           RTUNI_ALPHA, /* U+00cf7c: */
+                                           RTUNI_ALPHA, /* U+00cf7d: */
+                                           RTUNI_ALPHA, /* U+00cf7e: */
+                                           RTUNI_ALPHA, /* U+00cf7f: */
+                                           RTUNI_ALPHA, /* U+00cf80: */
+                                           RTUNI_ALPHA, /* U+00cf81: */
+                                           RTUNI_ALPHA, /* U+00cf82: */
+                                           RTUNI_ALPHA, /* U+00cf83: */
+                                           RTUNI_ALPHA, /* U+00cf84: */
+                                           RTUNI_ALPHA, /* U+00cf85: */
+                                           RTUNI_ALPHA, /* U+00cf86: */
+                                           RTUNI_ALPHA, /* U+00cf87: */
+                                           RTUNI_ALPHA, /* U+00cf88: */
+                                           RTUNI_ALPHA, /* U+00cf89: */
+                                           RTUNI_ALPHA, /* U+00cf8a: */
+                                           RTUNI_ALPHA, /* U+00cf8b: */
+                                           RTUNI_ALPHA, /* U+00cf8c: */
+                                           RTUNI_ALPHA, /* U+00cf8d: */
+                                           RTUNI_ALPHA, /* U+00cf8e: */
+                                           RTUNI_ALPHA, /* U+00cf8f: */
+                                           RTUNI_ALPHA, /* U+00cf90: */
+                                           RTUNI_ALPHA, /* U+00cf91: */
+                                           RTUNI_ALPHA, /* U+00cf92: */
+                                           RTUNI_ALPHA, /* U+00cf93: */
+                                           RTUNI_ALPHA, /* U+00cf94: */
+                                           RTUNI_ALPHA, /* U+00cf95: */
+                                           RTUNI_ALPHA, /* U+00cf96: */
+                                           RTUNI_ALPHA, /* U+00cf97: */
+                                           RTUNI_ALPHA, /* U+00cf98: */
+                                           RTUNI_ALPHA, /* U+00cf99: */
+                                           RTUNI_ALPHA, /* U+00cf9a: */
+                                           RTUNI_ALPHA, /* U+00cf9b: */
+                                           RTUNI_ALPHA, /* U+00cf9c: */
+                                           RTUNI_ALPHA, /* U+00cf9d: */
+                                           RTUNI_ALPHA, /* U+00cf9e: */
+                                           RTUNI_ALPHA, /* U+00cf9f: */
+                                           RTUNI_ALPHA, /* U+00cfa0: */
+                                           RTUNI_ALPHA, /* U+00cfa1: */
+                                           RTUNI_ALPHA, /* U+00cfa2: */
+                                           RTUNI_ALPHA, /* U+00cfa3: */
+                                           RTUNI_ALPHA, /* U+00cfa4: */
+                                           RTUNI_ALPHA, /* U+00cfa5: */
+                                           RTUNI_ALPHA, /* U+00cfa6: */
+                                           RTUNI_ALPHA, /* U+00cfa7: */
+                                           RTUNI_ALPHA, /* U+00cfa8: */
+                                           RTUNI_ALPHA, /* U+00cfa9: */
+                                           RTUNI_ALPHA, /* U+00cfaa: */
+                                           RTUNI_ALPHA, /* U+00cfab: */
+                                           RTUNI_ALPHA, /* U+00cfac: */
+                                           RTUNI_ALPHA, /* U+00cfad: */
+                                           RTUNI_ALPHA, /* U+00cfae: */
+                                           RTUNI_ALPHA, /* U+00cfaf: */
+                                           RTUNI_ALPHA, /* U+00cfb0: */
+                                           RTUNI_ALPHA, /* U+00cfb1: */
+                                           RTUNI_ALPHA, /* U+00cfb2: */
+                                           RTUNI_ALPHA, /* U+00cfb3: */
+                                           RTUNI_ALPHA, /* U+00cfb4: */
+                                           RTUNI_ALPHA, /* U+00cfb5: */
+                                           RTUNI_ALPHA, /* U+00cfb6: */
+                                           RTUNI_ALPHA, /* U+00cfb7: */
+                                           RTUNI_ALPHA, /* U+00cfb8: */
+                                           RTUNI_ALPHA, /* U+00cfb9: */
+                                           RTUNI_ALPHA, /* U+00cfba: */
+                                           RTUNI_ALPHA, /* U+00cfbb: */
+                                           RTUNI_ALPHA, /* U+00cfbc: */
+                                           RTUNI_ALPHA, /* U+00cfbd: */
+                                           RTUNI_ALPHA, /* U+00cfbe: */
+                                           RTUNI_ALPHA, /* U+00cfbf: */
+                                           RTUNI_ALPHA, /* U+00cfc0: */
+                                           RTUNI_ALPHA, /* U+00cfc1: */
+                                           RTUNI_ALPHA, /* U+00cfc2: */
+                                           RTUNI_ALPHA, /* U+00cfc3: */
+                                           RTUNI_ALPHA, /* U+00cfc4: */
+                                           RTUNI_ALPHA, /* U+00cfc5: */
+                                           RTUNI_ALPHA, /* U+00cfc6: */
+                                           RTUNI_ALPHA, /* U+00cfc7: */
+                                           RTUNI_ALPHA, /* U+00cfc8: */
+                                           RTUNI_ALPHA, /* U+00cfc9: */
+                                           RTUNI_ALPHA, /* U+00cfca: */
+                                           RTUNI_ALPHA, /* U+00cfcb: */
+                                           RTUNI_ALPHA, /* U+00cfcc: */
+                                           RTUNI_ALPHA, /* U+00cfcd: */
+                                           RTUNI_ALPHA, /* U+00cfce: */
+                                           RTUNI_ALPHA, /* U+00cfcf: */
+                                           RTUNI_ALPHA, /* U+00cfd0: */
+                                           RTUNI_ALPHA, /* U+00cfd1: */
+                                           RTUNI_ALPHA, /* U+00cfd2: */
+                                           RTUNI_ALPHA, /* U+00cfd3: */
+                                           RTUNI_ALPHA, /* U+00cfd4: */
+                                           RTUNI_ALPHA, /* U+00cfd5: */
+                                           RTUNI_ALPHA, /* U+00cfd6: */
+                                           RTUNI_ALPHA, /* U+00cfd7: */
+                                           RTUNI_ALPHA, /* U+00cfd8: */
+                                           RTUNI_ALPHA, /* U+00cfd9: */
+                                           RTUNI_ALPHA, /* U+00cfda: */
+                                           RTUNI_ALPHA, /* U+00cfdb: */
+                                           RTUNI_ALPHA, /* U+00cfdc: */
+                                           RTUNI_ALPHA, /* U+00cfdd: */
+                                           RTUNI_ALPHA, /* U+00cfde: */
+                                           RTUNI_ALPHA, /* U+00cfdf: */
+                                           RTUNI_ALPHA, /* U+00cfe0: */
+                                           RTUNI_ALPHA, /* U+00cfe1: */
+                                           RTUNI_ALPHA, /* U+00cfe2: */
+                                           RTUNI_ALPHA, /* U+00cfe3: */
+                                           RTUNI_ALPHA, /* U+00cfe4: */
+                                           RTUNI_ALPHA, /* U+00cfe5: */
+                                           RTUNI_ALPHA, /* U+00cfe6: */
+                                           RTUNI_ALPHA, /* U+00cfe7: */
+                                           RTUNI_ALPHA, /* U+00cfe8: */
+                                           RTUNI_ALPHA, /* U+00cfe9: */
+                                           RTUNI_ALPHA, /* U+00cfea: */
+                                           RTUNI_ALPHA, /* U+00cfeb: */
+                                           RTUNI_ALPHA, /* U+00cfec: */
+                                           RTUNI_ALPHA, /* U+00cfed: */
+                                           RTUNI_ALPHA, /* U+00cfee: */
+                                           RTUNI_ALPHA, /* U+00cfef: */
+                                           RTUNI_ALPHA, /* U+00cff0: */
+                                           RTUNI_ALPHA, /* U+00cff1: */
+                                           RTUNI_ALPHA, /* U+00cff2: */
+                                           RTUNI_ALPHA, /* U+00cff3: */
+                                           RTUNI_ALPHA, /* U+00cff4: */
+                                           RTUNI_ALPHA, /* U+00cff5: */
+                                           RTUNI_ALPHA, /* U+00cff6: */
+                                           RTUNI_ALPHA, /* U+00cff7: */
+                                           RTUNI_ALPHA, /* U+00cff8: */
+                                           RTUNI_ALPHA, /* U+00cff9: */
+                                           RTUNI_ALPHA, /* U+00cffa: */
+                                           RTUNI_ALPHA, /* U+00cffb: */
+                                           RTUNI_ALPHA, /* U+00cffc: */
+                                           RTUNI_ALPHA, /* U+00cffd: */
+                                           RTUNI_ALPHA, /* U+00cffe: */
+                                           RTUNI_ALPHA, /* U+00cfff: */
+                                           RTUNI_ALPHA, /* U+00d000: */
+                                           RTUNI_ALPHA, /* U+00d001: */
+                                           RTUNI_ALPHA, /* U+00d002: */
+                                           RTUNI_ALPHA, /* U+00d003: */
+                                           RTUNI_ALPHA, /* U+00d004: */
+                                           RTUNI_ALPHA, /* U+00d005: */
+                                           RTUNI_ALPHA, /* U+00d006: */
+                                           RTUNI_ALPHA, /* U+00d007: */
+                                           RTUNI_ALPHA, /* U+00d008: */
+                                           RTUNI_ALPHA, /* U+00d009: */
+                                           RTUNI_ALPHA, /* U+00d00a: */
+                                           RTUNI_ALPHA, /* U+00d00b: */
+                                           RTUNI_ALPHA, /* U+00d00c: */
+                                           RTUNI_ALPHA, /* U+00d00d: */
+                                           RTUNI_ALPHA, /* U+00d00e: */
+                                           RTUNI_ALPHA, /* U+00d00f: */
+                                           RTUNI_ALPHA, /* U+00d010: */
+                                           RTUNI_ALPHA, /* U+00d011: */
+                                           RTUNI_ALPHA, /* U+00d012: */
+                                           RTUNI_ALPHA, /* U+00d013: */
+                                           RTUNI_ALPHA, /* U+00d014: */
+                                           RTUNI_ALPHA, /* U+00d015: */
+                                           RTUNI_ALPHA, /* U+00d016: */
+                                           RTUNI_ALPHA, /* U+00d017: */
+                                           RTUNI_ALPHA, /* U+00d018: */
+                                           RTUNI_ALPHA, /* U+00d019: */
+                                           RTUNI_ALPHA, /* U+00d01a: */
+                                           RTUNI_ALPHA, /* U+00d01b: */
+                                           RTUNI_ALPHA, /* U+00d01c: */
+                                           RTUNI_ALPHA, /* U+00d01d: */
+                                           RTUNI_ALPHA, /* U+00d01e: */
+                                           RTUNI_ALPHA, /* U+00d01f: */
+                                           RTUNI_ALPHA, /* U+00d020: */
+                                           RTUNI_ALPHA, /* U+00d021: */
+                                           RTUNI_ALPHA, /* U+00d022: */
+                                           RTUNI_ALPHA, /* U+00d023: */
+                                           RTUNI_ALPHA, /* U+00d024: */
+                                           RTUNI_ALPHA, /* U+00d025: */
+                                           RTUNI_ALPHA, /* U+00d026: */
+                                           RTUNI_ALPHA, /* U+00d027: */
+                                           RTUNI_ALPHA, /* U+00d028: */
+                                           RTUNI_ALPHA, /* U+00d029: */
+                                           RTUNI_ALPHA, /* U+00d02a: */
+                                           RTUNI_ALPHA, /* U+00d02b: */
+                                           RTUNI_ALPHA, /* U+00d02c: */
+                                           RTUNI_ALPHA, /* U+00d02d: */
+                                           RTUNI_ALPHA, /* U+00d02e: */
+                                           RTUNI_ALPHA, /* U+00d02f: */
+                                           RTUNI_ALPHA, /* U+00d030: */
+                                           RTUNI_ALPHA, /* U+00d031: */
+                                           RTUNI_ALPHA, /* U+00d032: */
+                                           RTUNI_ALPHA, /* U+00d033: */
+                                           RTUNI_ALPHA, /* U+00d034: */
+                                           RTUNI_ALPHA, /* U+00d035: */
+                                           RTUNI_ALPHA, /* U+00d036: */
+                                           RTUNI_ALPHA, /* U+00d037: */
+                                           RTUNI_ALPHA, /* U+00d038: */
+                                           RTUNI_ALPHA, /* U+00d039: */
+                                           RTUNI_ALPHA, /* U+00d03a: */
+                                           RTUNI_ALPHA, /* U+00d03b: */
+                                           RTUNI_ALPHA, /* U+00d03c: */
+                                           RTUNI_ALPHA, /* U+00d03d: */
+                                           RTUNI_ALPHA, /* U+00d03e: */
+                                           RTUNI_ALPHA, /* U+00d03f: */
+                                           RTUNI_ALPHA, /* U+00d040: */
+                                           RTUNI_ALPHA, /* U+00d041: */
+                                           RTUNI_ALPHA, /* U+00d042: */
+                                           RTUNI_ALPHA, /* U+00d043: */
+                                           RTUNI_ALPHA, /* U+00d044: */
+                                           RTUNI_ALPHA, /* U+00d045: */
+                                           RTUNI_ALPHA, /* U+00d046: */
+                                           RTUNI_ALPHA, /* U+00d047: */
+                                           RTUNI_ALPHA, /* U+00d048: */
+                                           RTUNI_ALPHA, /* U+00d049: */
+                                           RTUNI_ALPHA, /* U+00d04a: */
+                                           RTUNI_ALPHA, /* U+00d04b: */
+                                           RTUNI_ALPHA, /* U+00d04c: */
+                                           RTUNI_ALPHA, /* U+00d04d: */
+                                           RTUNI_ALPHA, /* U+00d04e: */
+                                           RTUNI_ALPHA, /* U+00d04f: */
+                                           RTUNI_ALPHA, /* U+00d050: */
+                                           RTUNI_ALPHA, /* U+00d051: */
+                                           RTUNI_ALPHA, /* U+00d052: */
+                                           RTUNI_ALPHA, /* U+00d053: */
+                                           RTUNI_ALPHA, /* U+00d054: */
+                                           RTUNI_ALPHA, /* U+00d055: */
+                                           RTUNI_ALPHA, /* U+00d056: */
+                                           RTUNI_ALPHA, /* U+00d057: */
+                                           RTUNI_ALPHA, /* U+00d058: */
+                                           RTUNI_ALPHA, /* U+00d059: */
+                                           RTUNI_ALPHA, /* U+00d05a: */
+                                           RTUNI_ALPHA, /* U+00d05b: */
+                                           RTUNI_ALPHA, /* U+00d05c: */
+                                           RTUNI_ALPHA, /* U+00d05d: */
+                                           RTUNI_ALPHA, /* U+00d05e: */
+                                           RTUNI_ALPHA, /* U+00d05f: */
+                                           RTUNI_ALPHA, /* U+00d060: */
+                                           RTUNI_ALPHA, /* U+00d061: */
+                                           RTUNI_ALPHA, /* U+00d062: */
+                                           RTUNI_ALPHA, /* U+00d063: */
+                                           RTUNI_ALPHA, /* U+00d064: */
+                                           RTUNI_ALPHA, /* U+00d065: */
+                                           RTUNI_ALPHA, /* U+00d066: */
+                                           RTUNI_ALPHA, /* U+00d067: */
+                                           RTUNI_ALPHA, /* U+00d068: */
+                                           RTUNI_ALPHA, /* U+00d069: */
+                                           RTUNI_ALPHA, /* U+00d06a: */
+                                           RTUNI_ALPHA, /* U+00d06b: */
+                                           RTUNI_ALPHA, /* U+00d06c: */
+                                           RTUNI_ALPHA, /* U+00d06d: */
+                                           RTUNI_ALPHA, /* U+00d06e: */
+                                           RTUNI_ALPHA, /* U+00d06f: */
+                                           RTUNI_ALPHA, /* U+00d070: */
+                                           RTUNI_ALPHA, /* U+00d071: */
+                                           RTUNI_ALPHA, /* U+00d072: */
+                                           RTUNI_ALPHA, /* U+00d073: */
+                                           RTUNI_ALPHA, /* U+00d074: */
+                                           RTUNI_ALPHA, /* U+00d075: */
+                                           RTUNI_ALPHA, /* U+00d076: */
+                                           RTUNI_ALPHA, /* U+00d077: */
+                                           RTUNI_ALPHA, /* U+00d078: */
+                                           RTUNI_ALPHA, /* U+00d079: */
+                                           RTUNI_ALPHA, /* U+00d07a: */
+                                           RTUNI_ALPHA, /* U+00d07b: */
+                                           RTUNI_ALPHA, /* U+00d07c: */
+                                           RTUNI_ALPHA, /* U+00d07d: */
+                                           RTUNI_ALPHA, /* U+00d07e: */
+                                           RTUNI_ALPHA, /* U+00d07f: */
+                                           RTUNI_ALPHA, /* U+00d080: */
+                                           RTUNI_ALPHA, /* U+00d081: */
+                                           RTUNI_ALPHA, /* U+00d082: */
+                                           RTUNI_ALPHA, /* U+00d083: */
+                                           RTUNI_ALPHA, /* U+00d084: */
+                                           RTUNI_ALPHA, /* U+00d085: */
+                                           RTUNI_ALPHA, /* U+00d086: */
+                                           RTUNI_ALPHA, /* U+00d087: */
+                                           RTUNI_ALPHA, /* U+00d088: */
+                                           RTUNI_ALPHA, /* U+00d089: */
+                                           RTUNI_ALPHA, /* U+00d08a: */
+                                           RTUNI_ALPHA, /* U+00d08b: */
+                                           RTUNI_ALPHA, /* U+00d08c: */
+                                           RTUNI_ALPHA, /* U+00d08d: */
+                                           RTUNI_ALPHA, /* U+00d08e: */
+                                           RTUNI_ALPHA, /* U+00d08f: */
+                                           RTUNI_ALPHA, /* U+00d090: */
+                                           RTUNI_ALPHA, /* U+00d091: */
+                                           RTUNI_ALPHA, /* U+00d092: */
+                                           RTUNI_ALPHA, /* U+00d093: */
+                                           RTUNI_ALPHA, /* U+00d094: */
+                                           RTUNI_ALPHA, /* U+00d095: */
+                                           RTUNI_ALPHA, /* U+00d096: */
+                                           RTUNI_ALPHA, /* U+00d097: */
+                                           RTUNI_ALPHA, /* U+00d098: */
+                                           RTUNI_ALPHA, /* U+00d099: */
+                                           RTUNI_ALPHA, /* U+00d09a: */
+                                           RTUNI_ALPHA, /* U+00d09b: */
+                                           RTUNI_ALPHA, /* U+00d09c: */
+                                           RTUNI_ALPHA, /* U+00d09d: */
+                                           RTUNI_ALPHA, /* U+00d09e: */
+                                           RTUNI_ALPHA, /* U+00d09f: */
+                                           RTUNI_ALPHA, /* U+00d0a0: */
+                                           RTUNI_ALPHA, /* U+00d0a1: */
+                                           RTUNI_ALPHA, /* U+00d0a2: */
+                                           RTUNI_ALPHA, /* U+00d0a3: */
+                                           RTUNI_ALPHA, /* U+00d0a4: */
+                                           RTUNI_ALPHA, /* U+00d0a5: */
+                                           RTUNI_ALPHA, /* U+00d0a6: */
+                                           RTUNI_ALPHA, /* U+00d0a7: */
+                                           RTUNI_ALPHA, /* U+00d0a8: */
+                                           RTUNI_ALPHA, /* U+00d0a9: */
+                                           RTUNI_ALPHA, /* U+00d0aa: */
+                                           RTUNI_ALPHA, /* U+00d0ab: */
+                                           RTUNI_ALPHA, /* U+00d0ac: */
+                                           RTUNI_ALPHA, /* U+00d0ad: */
+                                           RTUNI_ALPHA, /* U+00d0ae: */
+                                           RTUNI_ALPHA, /* U+00d0af: */
+                                           RTUNI_ALPHA, /* U+00d0b0: */
+                                           RTUNI_ALPHA, /* U+00d0b1: */
+                                           RTUNI_ALPHA, /* U+00d0b2: */
+                                           RTUNI_ALPHA, /* U+00d0b3: */
+                                           RTUNI_ALPHA, /* U+00d0b4: */
+                                           RTUNI_ALPHA, /* U+00d0b5: */
+                                           RTUNI_ALPHA, /* U+00d0b6: */
+                                           RTUNI_ALPHA, /* U+00d0b7: */
+                                           RTUNI_ALPHA, /* U+00d0b8: */
+                                           RTUNI_ALPHA, /* U+00d0b9: */
+                                           RTUNI_ALPHA, /* U+00d0ba: */
+                                           RTUNI_ALPHA, /* U+00d0bb: */
+                                           RTUNI_ALPHA, /* U+00d0bc: */
+                                           RTUNI_ALPHA, /* U+00d0bd: */
+                                           RTUNI_ALPHA, /* U+00d0be: */
+                                           RTUNI_ALPHA, /* U+00d0bf: */
+                                           RTUNI_ALPHA, /* U+00d0c0: */
+                                           RTUNI_ALPHA, /* U+00d0c1: */
+                                           RTUNI_ALPHA, /* U+00d0c2: */
+                                           RTUNI_ALPHA, /* U+00d0c3: */
+                                           RTUNI_ALPHA, /* U+00d0c4: */
+                                           RTUNI_ALPHA, /* U+00d0c5: */
+                                           RTUNI_ALPHA, /* U+00d0c6: */
+                                           RTUNI_ALPHA, /* U+00d0c7: */
+                                           RTUNI_ALPHA, /* U+00d0c8: */
+                                           RTUNI_ALPHA, /* U+00d0c9: */
+                                           RTUNI_ALPHA, /* U+00d0ca: */
+                                           RTUNI_ALPHA, /* U+00d0cb: */
+                                           RTUNI_ALPHA, /* U+00d0cc: */
+                                           RTUNI_ALPHA, /* U+00d0cd: */
+                                           RTUNI_ALPHA, /* U+00d0ce: */
+                                           RTUNI_ALPHA, /* U+00d0cf: */
+                                           RTUNI_ALPHA, /* U+00d0d0: */
+                                           RTUNI_ALPHA, /* U+00d0d1: */
+                                           RTUNI_ALPHA, /* U+00d0d2: */
+                                           RTUNI_ALPHA, /* U+00d0d3: */
+                                           RTUNI_ALPHA, /* U+00d0d4: */
+                                           RTUNI_ALPHA, /* U+00d0d5: */
+                                           RTUNI_ALPHA, /* U+00d0d6: */
+                                           RTUNI_ALPHA, /* U+00d0d7: */
+                                           RTUNI_ALPHA, /* U+00d0d8: */
+                                           RTUNI_ALPHA, /* U+00d0d9: */
+                                           RTUNI_ALPHA, /* U+00d0da: */
+                                           RTUNI_ALPHA, /* U+00d0db: */
+                                           RTUNI_ALPHA, /* U+00d0dc: */
+                                           RTUNI_ALPHA, /* U+00d0dd: */
+                                           RTUNI_ALPHA, /* U+00d0de: */
+                                           RTUNI_ALPHA, /* U+00d0df: */
+                                           RTUNI_ALPHA, /* U+00d0e0: */
+                                           RTUNI_ALPHA, /* U+00d0e1: */
+                                           RTUNI_ALPHA, /* U+00d0e2: */
+                                           RTUNI_ALPHA, /* U+00d0e3: */
+                                           RTUNI_ALPHA, /* U+00d0e4: */
+                                           RTUNI_ALPHA, /* U+00d0e5: */
+                                           RTUNI_ALPHA, /* U+00d0e6: */
+                                           RTUNI_ALPHA, /* U+00d0e7: */
+                                           RTUNI_ALPHA, /* U+00d0e8: */
+                                           RTUNI_ALPHA, /* U+00d0e9: */
+                                           RTUNI_ALPHA, /* U+00d0ea: */
+                                           RTUNI_ALPHA, /* U+00d0eb: */
+                                           RTUNI_ALPHA, /* U+00d0ec: */
+                                           RTUNI_ALPHA, /* U+00d0ed: */
+                                           RTUNI_ALPHA, /* U+00d0ee: */
+                                           RTUNI_ALPHA, /* U+00d0ef: */
+                                           RTUNI_ALPHA, /* U+00d0f0: */
+                                           RTUNI_ALPHA, /* U+00d0f1: */
+                                           RTUNI_ALPHA, /* U+00d0f2: */
+                                           RTUNI_ALPHA, /* U+00d0f3: */
+                                           RTUNI_ALPHA, /* U+00d0f4: */
+                                           RTUNI_ALPHA, /* U+00d0f5: */
+                                           RTUNI_ALPHA, /* U+00d0f6: */
+                                           RTUNI_ALPHA, /* U+00d0f7: */
+                                           RTUNI_ALPHA, /* U+00d0f8: */
+                                           RTUNI_ALPHA, /* U+00d0f9: */
+                                           RTUNI_ALPHA, /* U+00d0fa: */
+                                           RTUNI_ALPHA, /* U+00d0fb: */
+                                           RTUNI_ALPHA, /* U+00d0fc: */
+                                           RTUNI_ALPHA, /* U+00d0fd: */
+                                           RTUNI_ALPHA, /* U+00d0fe: */
+                                           RTUNI_ALPHA, /* U+00d0ff: */
+                                           RTUNI_ALPHA, /* U+00d100: */
+                                           RTUNI_ALPHA, /* U+00d101: */
+                                           RTUNI_ALPHA, /* U+00d102: */
+                                           RTUNI_ALPHA, /* U+00d103: */
+                                           RTUNI_ALPHA, /* U+00d104: */
+                                           RTUNI_ALPHA, /* U+00d105: */
+                                           RTUNI_ALPHA, /* U+00d106: */
+                                           RTUNI_ALPHA, /* U+00d107: */
+                                           RTUNI_ALPHA, /* U+00d108: */
+                                           RTUNI_ALPHA, /* U+00d109: */
+                                           RTUNI_ALPHA, /* U+00d10a: */
+                                           RTUNI_ALPHA, /* U+00d10b: */
+                                           RTUNI_ALPHA, /* U+00d10c: */
+                                           RTUNI_ALPHA, /* U+00d10d: */
+                                           RTUNI_ALPHA, /* U+00d10e: */
+                                           RTUNI_ALPHA, /* U+00d10f: */
+                                           RTUNI_ALPHA, /* U+00d110: */
+                                           RTUNI_ALPHA, /* U+00d111: */
+                                           RTUNI_ALPHA, /* U+00d112: */
+                                           RTUNI_ALPHA, /* U+00d113: */
+                                           RTUNI_ALPHA, /* U+00d114: */
+                                           RTUNI_ALPHA, /* U+00d115: */
+                                           RTUNI_ALPHA, /* U+00d116: */
+                                           RTUNI_ALPHA, /* U+00d117: */
+                                           RTUNI_ALPHA, /* U+00d118: */
+                                           RTUNI_ALPHA, /* U+00d119: */
+                                           RTUNI_ALPHA, /* U+00d11a: */
+                                           RTUNI_ALPHA, /* U+00d11b: */
+                                           RTUNI_ALPHA, /* U+00d11c: */
+                                           RTUNI_ALPHA, /* U+00d11d: */
+                                           RTUNI_ALPHA, /* U+00d11e: */
+                                           RTUNI_ALPHA, /* U+00d11f: */
+                                           RTUNI_ALPHA, /* U+00d120: */
+                                           RTUNI_ALPHA, /* U+00d121: */
+                                           RTUNI_ALPHA, /* U+00d122: */
+                                           RTUNI_ALPHA, /* U+00d123: */
+                                           RTUNI_ALPHA, /* U+00d124: */
+                                           RTUNI_ALPHA, /* U+00d125: */
+                                           RTUNI_ALPHA, /* U+00d126: */
+                                           RTUNI_ALPHA, /* U+00d127: */
+                                           RTUNI_ALPHA, /* U+00d128: */
+                                           RTUNI_ALPHA, /* U+00d129: */
+                                           RTUNI_ALPHA, /* U+00d12a: */
+                                           RTUNI_ALPHA, /* U+00d12b: */
+                                           RTUNI_ALPHA, /* U+00d12c: */
+                                           RTUNI_ALPHA, /* U+00d12d: */
+                                           RTUNI_ALPHA, /* U+00d12e: */
+                                           RTUNI_ALPHA, /* U+00d12f: */
+                                           RTUNI_ALPHA, /* U+00d130: */
+                                           RTUNI_ALPHA, /* U+00d131: */
+                                           RTUNI_ALPHA, /* U+00d132: */
+                                           RTUNI_ALPHA, /* U+00d133: */
+                                           RTUNI_ALPHA, /* U+00d134: */
+                                           RTUNI_ALPHA, /* U+00d135: */
+                                           RTUNI_ALPHA, /* U+00d136: */
+                                           RTUNI_ALPHA, /* U+00d137: */
+                                           RTUNI_ALPHA, /* U+00d138: */
+                                           RTUNI_ALPHA, /* U+00d139: */
+                                           RTUNI_ALPHA, /* U+00d13a: */
+                                           RTUNI_ALPHA, /* U+00d13b: */
+                                           RTUNI_ALPHA, /* U+00d13c: */
+                                           RTUNI_ALPHA, /* U+00d13d: */
+                                           RTUNI_ALPHA, /* U+00d13e: */
+                                           RTUNI_ALPHA, /* U+00d13f: */
+                                           RTUNI_ALPHA, /* U+00d140: */
+                                           RTUNI_ALPHA, /* U+00d141: */
+                                           RTUNI_ALPHA, /* U+00d142: */
+                                           RTUNI_ALPHA, /* U+00d143: */
+                                           RTUNI_ALPHA, /* U+00d144: */
+                                           RTUNI_ALPHA, /* U+00d145: */
+                                           RTUNI_ALPHA, /* U+00d146: */
+                                           RTUNI_ALPHA, /* U+00d147: */
+                                           RTUNI_ALPHA, /* U+00d148: */
+                                           RTUNI_ALPHA, /* U+00d149: */
+                                           RTUNI_ALPHA, /* U+00d14a: */
+                                           RTUNI_ALPHA, /* U+00d14b: */
+                                           RTUNI_ALPHA, /* U+00d14c: */
+                                           RTUNI_ALPHA, /* U+00d14d: */
+                                           RTUNI_ALPHA, /* U+00d14e: */
+                                           RTUNI_ALPHA, /* U+00d14f: */
+                                           RTUNI_ALPHA, /* U+00d150: */
+                                           RTUNI_ALPHA, /* U+00d151: */
+                                           RTUNI_ALPHA, /* U+00d152: */
+                                           RTUNI_ALPHA, /* U+00d153: */
+                                           RTUNI_ALPHA, /* U+00d154: */
+                                           RTUNI_ALPHA, /* U+00d155: */
+                                           RTUNI_ALPHA, /* U+00d156: */
+                                           RTUNI_ALPHA, /* U+00d157: */
+                                           RTUNI_ALPHA, /* U+00d158: */
+                                           RTUNI_ALPHA, /* U+00d159: */
+                                           RTUNI_ALPHA, /* U+00d15a: */
+                                           RTUNI_ALPHA, /* U+00d15b: */
+                                           RTUNI_ALPHA, /* U+00d15c: */
+                                           RTUNI_ALPHA, /* U+00d15d: */
+                                           RTUNI_ALPHA, /* U+00d15e: */
+                                           RTUNI_ALPHA, /* U+00d15f: */
+                                           RTUNI_ALPHA, /* U+00d160: */
+                                           RTUNI_ALPHA, /* U+00d161: */
+                                           RTUNI_ALPHA, /* U+00d162: */
+                                           RTUNI_ALPHA, /* U+00d163: */
+                                           RTUNI_ALPHA, /* U+00d164: */
+                                           RTUNI_ALPHA, /* U+00d165: */
+                                           RTUNI_ALPHA, /* U+00d166: */
+                                           RTUNI_ALPHA, /* U+00d167: */
+                                           RTUNI_ALPHA, /* U+00d168: */
+                                           RTUNI_ALPHA, /* U+00d169: */
+                                           RTUNI_ALPHA, /* U+00d16a: */
+                                           RTUNI_ALPHA, /* U+00d16b: */
+                                           RTUNI_ALPHA, /* U+00d16c: */
+                                           RTUNI_ALPHA, /* U+00d16d: */
+                                           RTUNI_ALPHA, /* U+00d16e: */
+                                           RTUNI_ALPHA, /* U+00d16f: */
+                                           RTUNI_ALPHA, /* U+00d170: */
+                                           RTUNI_ALPHA, /* U+00d171: */
+                                           RTUNI_ALPHA, /* U+00d172: */
+                                           RTUNI_ALPHA, /* U+00d173: */
+                                           RTUNI_ALPHA, /* U+00d174: */
+                                           RTUNI_ALPHA, /* U+00d175: */
+                                           RTUNI_ALPHA, /* U+00d176: */
+                                           RTUNI_ALPHA, /* U+00d177: */
+                                           RTUNI_ALPHA, /* U+00d178: */
+                                           RTUNI_ALPHA, /* U+00d179: */
+                                           RTUNI_ALPHA, /* U+00d17a: */
+                                           RTUNI_ALPHA, /* U+00d17b: */
+                                           RTUNI_ALPHA, /* U+00d17c: */
+                                           RTUNI_ALPHA, /* U+00d17d: */
+                                           RTUNI_ALPHA, /* U+00d17e: */
+                                           RTUNI_ALPHA, /* U+00d17f: */
+                                           RTUNI_ALPHA, /* U+00d180: */
+                                           RTUNI_ALPHA, /* U+00d181: */
+                                           RTUNI_ALPHA, /* U+00d182: */
+                                           RTUNI_ALPHA, /* U+00d183: */
+                                           RTUNI_ALPHA, /* U+00d184: */
+                                           RTUNI_ALPHA, /* U+00d185: */
+                                           RTUNI_ALPHA, /* U+00d186: */
+                                           RTUNI_ALPHA, /* U+00d187: */
+                                           RTUNI_ALPHA, /* U+00d188: */
+                                           RTUNI_ALPHA, /* U+00d189: */
+                                           RTUNI_ALPHA, /* U+00d18a: */
+                                           RTUNI_ALPHA, /* U+00d18b: */
+                                           RTUNI_ALPHA, /* U+00d18c: */
+                                           RTUNI_ALPHA, /* U+00d18d: */
+                                           RTUNI_ALPHA, /* U+00d18e: */
+                                           RTUNI_ALPHA, /* U+00d18f: */
+                                           RTUNI_ALPHA, /* U+00d190: */
+                                           RTUNI_ALPHA, /* U+00d191: */
+                                           RTUNI_ALPHA, /* U+00d192: */
+                                           RTUNI_ALPHA, /* U+00d193: */
+                                           RTUNI_ALPHA, /* U+00d194: */
+                                           RTUNI_ALPHA, /* U+00d195: */
+                                           RTUNI_ALPHA, /* U+00d196: */
+                                           RTUNI_ALPHA, /* U+00d197: */
+                                           RTUNI_ALPHA, /* U+00d198: */
+                                           RTUNI_ALPHA, /* U+00d199: */
+                                           RTUNI_ALPHA, /* U+00d19a: */
+                                           RTUNI_ALPHA, /* U+00d19b: */
+                                           RTUNI_ALPHA, /* U+00d19c: */
+                                           RTUNI_ALPHA, /* U+00d19d: */
+                                           RTUNI_ALPHA, /* U+00d19e: */
+                                           RTUNI_ALPHA, /* U+00d19f: */
+                                           RTUNI_ALPHA, /* U+00d1a0: */
+                                           RTUNI_ALPHA, /* U+00d1a1: */
+                                           RTUNI_ALPHA, /* U+00d1a2: */
+                                           RTUNI_ALPHA, /* U+00d1a3: */
+                                           RTUNI_ALPHA, /* U+00d1a4: */
+                                           RTUNI_ALPHA, /* U+00d1a5: */
+                                           RTUNI_ALPHA, /* U+00d1a6: */
+                                           RTUNI_ALPHA, /* U+00d1a7: */
+                                           RTUNI_ALPHA, /* U+00d1a8: */
+                                           RTUNI_ALPHA, /* U+00d1a9: */
+                                           RTUNI_ALPHA, /* U+00d1aa: */
+                                           RTUNI_ALPHA, /* U+00d1ab: */
+                                           RTUNI_ALPHA, /* U+00d1ac: */
+                                           RTUNI_ALPHA, /* U+00d1ad: */
+                                           RTUNI_ALPHA, /* U+00d1ae: */
+                                           RTUNI_ALPHA, /* U+00d1af: */
+                                           RTUNI_ALPHA, /* U+00d1b0: */
+                                           RTUNI_ALPHA, /* U+00d1b1: */
+                                           RTUNI_ALPHA, /* U+00d1b2: */
+                                           RTUNI_ALPHA, /* U+00d1b3: */
+                                           RTUNI_ALPHA, /* U+00d1b4: */
+                                           RTUNI_ALPHA, /* U+00d1b5: */
+                                           RTUNI_ALPHA, /* U+00d1b6: */
+                                           RTUNI_ALPHA, /* U+00d1b7: */
+                                           RTUNI_ALPHA, /* U+00d1b8: */
+                                           RTUNI_ALPHA, /* U+00d1b9: */
+                                           RTUNI_ALPHA, /* U+00d1ba: */
+                                           RTUNI_ALPHA, /* U+00d1bb: */
+                                           RTUNI_ALPHA, /* U+00d1bc: */
+                                           RTUNI_ALPHA, /* U+00d1bd: */
+                                           RTUNI_ALPHA, /* U+00d1be: */
+                                           RTUNI_ALPHA, /* U+00d1bf: */
+                                           RTUNI_ALPHA, /* U+00d1c0: */
+                                           RTUNI_ALPHA, /* U+00d1c1: */
+                                           RTUNI_ALPHA, /* U+00d1c2: */
+                                           RTUNI_ALPHA, /* U+00d1c3: */
+                                           RTUNI_ALPHA, /* U+00d1c4: */
+                                           RTUNI_ALPHA, /* U+00d1c5: */
+                                           RTUNI_ALPHA, /* U+00d1c6: */
+                                           RTUNI_ALPHA, /* U+00d1c7: */
+                                           RTUNI_ALPHA, /* U+00d1c8: */
+                                           RTUNI_ALPHA, /* U+00d1c9: */
+                                           RTUNI_ALPHA, /* U+00d1ca: */
+                                           RTUNI_ALPHA, /* U+00d1cb: */
+                                           RTUNI_ALPHA, /* U+00d1cc: */
+                                           RTUNI_ALPHA, /* U+00d1cd: */
+                                           RTUNI_ALPHA, /* U+00d1ce: */
+                                           RTUNI_ALPHA, /* U+00d1cf: */
+                                           RTUNI_ALPHA, /* U+00d1d0: */
+                                           RTUNI_ALPHA, /* U+00d1d1: */
+                                           RTUNI_ALPHA, /* U+00d1d2: */
+                                           RTUNI_ALPHA, /* U+00d1d3: */
+                                           RTUNI_ALPHA, /* U+00d1d4: */
+                                           RTUNI_ALPHA, /* U+00d1d5: */
+                                           RTUNI_ALPHA, /* U+00d1d6: */
+                                           RTUNI_ALPHA, /* U+00d1d7: */
+                                           RTUNI_ALPHA, /* U+00d1d8: */
+                                           RTUNI_ALPHA, /* U+00d1d9: */
+                                           RTUNI_ALPHA, /* U+00d1da: */
+                                           RTUNI_ALPHA, /* U+00d1db: */
+                                           RTUNI_ALPHA, /* U+00d1dc: */
+                                           RTUNI_ALPHA, /* U+00d1dd: */
+                                           RTUNI_ALPHA, /* U+00d1de: */
+                                           RTUNI_ALPHA, /* U+00d1df: */
+                                           RTUNI_ALPHA, /* U+00d1e0: */
+                                           RTUNI_ALPHA, /* U+00d1e1: */
+                                           RTUNI_ALPHA, /* U+00d1e2: */
+                                           RTUNI_ALPHA, /* U+00d1e3: */
+                                           RTUNI_ALPHA, /* U+00d1e4: */
+                                           RTUNI_ALPHA, /* U+00d1e5: */
+                                           RTUNI_ALPHA, /* U+00d1e6: */
+                                           RTUNI_ALPHA, /* U+00d1e7: */
+                                           RTUNI_ALPHA, /* U+00d1e8: */
+                                           RTUNI_ALPHA, /* U+00d1e9: */
+                                           RTUNI_ALPHA, /* U+00d1ea: */
+                                           RTUNI_ALPHA, /* U+00d1eb: */
+                                           RTUNI_ALPHA, /* U+00d1ec: */
+                                           RTUNI_ALPHA, /* U+00d1ed: */
+                                           RTUNI_ALPHA, /* U+00d1ee: */
+                                           RTUNI_ALPHA, /* U+00d1ef: */
+                                           RTUNI_ALPHA, /* U+00d1f0: */
+                                           RTUNI_ALPHA, /* U+00d1f1: */
+                                           RTUNI_ALPHA, /* U+00d1f2: */
+                                           RTUNI_ALPHA, /* U+00d1f3: */
+                                           RTUNI_ALPHA, /* U+00d1f4: */
+                                           RTUNI_ALPHA, /* U+00d1f5: */
+                                           RTUNI_ALPHA, /* U+00d1f6: */
+                                           RTUNI_ALPHA, /* U+00d1f7: */
+                                           RTUNI_ALPHA, /* U+00d1f8: */
+                                           RTUNI_ALPHA, /* U+00d1f9: */
+                                           RTUNI_ALPHA, /* U+00d1fa: */
+                                           RTUNI_ALPHA, /* U+00d1fb: */
+                                           RTUNI_ALPHA, /* U+00d1fc: */
+                                           RTUNI_ALPHA, /* U+00d1fd: */
+                                           RTUNI_ALPHA, /* U+00d1fe: */
+                                           RTUNI_ALPHA, /* U+00d1ff: */
+                                           RTUNI_ALPHA, /* U+00d200: */
+                                           RTUNI_ALPHA, /* U+00d201: */
+                                           RTUNI_ALPHA, /* U+00d202: */
+                                           RTUNI_ALPHA, /* U+00d203: */
+                                           RTUNI_ALPHA, /* U+00d204: */
+                                           RTUNI_ALPHA, /* U+00d205: */
+                                           RTUNI_ALPHA, /* U+00d206: */
+                                           RTUNI_ALPHA, /* U+00d207: */
+                                           RTUNI_ALPHA, /* U+00d208: */
+                                           RTUNI_ALPHA, /* U+00d209: */
+                                           RTUNI_ALPHA, /* U+00d20a: */
+                                           RTUNI_ALPHA, /* U+00d20b: */
+                                           RTUNI_ALPHA, /* U+00d20c: */
+                                           RTUNI_ALPHA, /* U+00d20d: */
+                                           RTUNI_ALPHA, /* U+00d20e: */
+                                           RTUNI_ALPHA, /* U+00d20f: */
+                                           RTUNI_ALPHA, /* U+00d210: */
+                                           RTUNI_ALPHA, /* U+00d211: */
+                                           RTUNI_ALPHA, /* U+00d212: */
+                                           RTUNI_ALPHA, /* U+00d213: */
+                                           RTUNI_ALPHA, /* U+00d214: */
+                                           RTUNI_ALPHA, /* U+00d215: */
+                                           RTUNI_ALPHA, /* U+00d216: */
+                                           RTUNI_ALPHA, /* U+00d217: */
+                                           RTUNI_ALPHA, /* U+00d218: */
+                                           RTUNI_ALPHA, /* U+00d219: */
+                                           RTUNI_ALPHA, /* U+00d21a: */
+                                           RTUNI_ALPHA, /* U+00d21b: */
+                                           RTUNI_ALPHA, /* U+00d21c: */
+                                           RTUNI_ALPHA, /* U+00d21d: */
+                                           RTUNI_ALPHA, /* U+00d21e: */
+                                           RTUNI_ALPHA, /* U+00d21f: */
+                                           RTUNI_ALPHA, /* U+00d220: */
+                                           RTUNI_ALPHA, /* U+00d221: */
+                                           RTUNI_ALPHA, /* U+00d222: */
+                                           RTUNI_ALPHA, /* U+00d223: */
+                                           RTUNI_ALPHA, /* U+00d224: */
+                                           RTUNI_ALPHA, /* U+00d225: */
+                                           RTUNI_ALPHA, /* U+00d226: */
+                                           RTUNI_ALPHA, /* U+00d227: */
+                                           RTUNI_ALPHA, /* U+00d228: */
+                                           RTUNI_ALPHA, /* U+00d229: */
+                                           RTUNI_ALPHA, /* U+00d22a: */
+                                           RTUNI_ALPHA, /* U+00d22b: */
+                                           RTUNI_ALPHA, /* U+00d22c: */
+                                           RTUNI_ALPHA, /* U+00d22d: */
+                                           RTUNI_ALPHA, /* U+00d22e: */
+                                           RTUNI_ALPHA, /* U+00d22f: */
+                                           RTUNI_ALPHA, /* U+00d230: */
+                                           RTUNI_ALPHA, /* U+00d231: */
+                                           RTUNI_ALPHA, /* U+00d232: */
+                                           RTUNI_ALPHA, /* U+00d233: */
+                                           RTUNI_ALPHA, /* U+00d234: */
+                                           RTUNI_ALPHA, /* U+00d235: */
+                                           RTUNI_ALPHA, /* U+00d236: */
+                                           RTUNI_ALPHA, /* U+00d237: */
+                                           RTUNI_ALPHA, /* U+00d238: */
+                                           RTUNI_ALPHA, /* U+00d239: */
+                                           RTUNI_ALPHA, /* U+00d23a: */
+                                           RTUNI_ALPHA, /* U+00d23b: */
+                                           RTUNI_ALPHA, /* U+00d23c: */
+                                           RTUNI_ALPHA, /* U+00d23d: */
+                                           RTUNI_ALPHA, /* U+00d23e: */
+                                           RTUNI_ALPHA, /* U+00d23f: */
+                                           RTUNI_ALPHA, /* U+00d240: */
+                                           RTUNI_ALPHA, /* U+00d241: */
+                                           RTUNI_ALPHA, /* U+00d242: */
+                                           RTUNI_ALPHA, /* U+00d243: */
+                                           RTUNI_ALPHA, /* U+00d244: */
+                                           RTUNI_ALPHA, /* U+00d245: */
+                                           RTUNI_ALPHA, /* U+00d246: */
+                                           RTUNI_ALPHA, /* U+00d247: */
+                                           RTUNI_ALPHA, /* U+00d248: */
+                                           RTUNI_ALPHA, /* U+00d249: */
+                                           RTUNI_ALPHA, /* U+00d24a: */
+                                           RTUNI_ALPHA, /* U+00d24b: */
+                                           RTUNI_ALPHA, /* U+00d24c: */
+                                           RTUNI_ALPHA, /* U+00d24d: */
+                                           RTUNI_ALPHA, /* U+00d24e: */
+                                           RTUNI_ALPHA, /* U+00d24f: */
+                                           RTUNI_ALPHA, /* U+00d250: */
+                                           RTUNI_ALPHA, /* U+00d251: */
+                                           RTUNI_ALPHA, /* U+00d252: */
+                                           RTUNI_ALPHA, /* U+00d253: */
+                                           RTUNI_ALPHA, /* U+00d254: */
+                                           RTUNI_ALPHA, /* U+00d255: */
+                                           RTUNI_ALPHA, /* U+00d256: */
+                                           RTUNI_ALPHA, /* U+00d257: */
+                                           RTUNI_ALPHA, /* U+00d258: */
+                                           RTUNI_ALPHA, /* U+00d259: */
+                                           RTUNI_ALPHA, /* U+00d25a: */
+                                           RTUNI_ALPHA, /* U+00d25b: */
+                                           RTUNI_ALPHA, /* U+00d25c: */
+                                           RTUNI_ALPHA, /* U+00d25d: */
+                                           RTUNI_ALPHA, /* U+00d25e: */
+                                           RTUNI_ALPHA, /* U+00d25f: */
+                                           RTUNI_ALPHA, /* U+00d260: */
+                                           RTUNI_ALPHA, /* U+00d261: */
+                                           RTUNI_ALPHA, /* U+00d262: */
+                                           RTUNI_ALPHA, /* U+00d263: */
+                                           RTUNI_ALPHA, /* U+00d264: */
+                                           RTUNI_ALPHA, /* U+00d265: */
+                                           RTUNI_ALPHA, /* U+00d266: */
+                                           RTUNI_ALPHA, /* U+00d267: */
+                                           RTUNI_ALPHA, /* U+00d268: */
+                                           RTUNI_ALPHA, /* U+00d269: */
+                                           RTUNI_ALPHA, /* U+00d26a: */
+                                           RTUNI_ALPHA, /* U+00d26b: */
+                                           RTUNI_ALPHA, /* U+00d26c: */
+                                           RTUNI_ALPHA, /* U+00d26d: */
+                                           RTUNI_ALPHA, /* U+00d26e: */
+                                           RTUNI_ALPHA, /* U+00d26f: */
+                                           RTUNI_ALPHA, /* U+00d270: */
+                                           RTUNI_ALPHA, /* U+00d271: */
+                                           RTUNI_ALPHA, /* U+00d272: */
+                                           RTUNI_ALPHA, /* U+00d273: */
+                                           RTUNI_ALPHA, /* U+00d274: */
+                                           RTUNI_ALPHA, /* U+00d275: */
+                                           RTUNI_ALPHA, /* U+00d276: */
+                                           RTUNI_ALPHA, /* U+00d277: */
+                                           RTUNI_ALPHA, /* U+00d278: */
+                                           RTUNI_ALPHA, /* U+00d279: */
+                                           RTUNI_ALPHA, /* U+00d27a: */
+                                           RTUNI_ALPHA, /* U+00d27b: */
+                                           RTUNI_ALPHA, /* U+00d27c: */
+                                           RTUNI_ALPHA, /* U+00d27d: */
+                                           RTUNI_ALPHA, /* U+00d27e: */
+                                           RTUNI_ALPHA, /* U+00d27f: */
+                                           RTUNI_ALPHA, /* U+00d280: */
+                                           RTUNI_ALPHA, /* U+00d281: */
+                                           RTUNI_ALPHA, /* U+00d282: */
+                                           RTUNI_ALPHA, /* U+00d283: */
+                                           RTUNI_ALPHA, /* U+00d284: */
+                                           RTUNI_ALPHA, /* U+00d285: */
+                                           RTUNI_ALPHA, /* U+00d286: */
+                                           RTUNI_ALPHA, /* U+00d287: */
+                                           RTUNI_ALPHA, /* U+00d288: */
+                                           RTUNI_ALPHA, /* U+00d289: */
+                                           RTUNI_ALPHA, /* U+00d28a: */
+                                           RTUNI_ALPHA, /* U+00d28b: */
+                                           RTUNI_ALPHA, /* U+00d28c: */
+                                           RTUNI_ALPHA, /* U+00d28d: */
+                                           RTUNI_ALPHA, /* U+00d28e: */
+                                           RTUNI_ALPHA, /* U+00d28f: */
+                                           RTUNI_ALPHA, /* U+00d290: */
+                                           RTUNI_ALPHA, /* U+00d291: */
+                                           RTUNI_ALPHA, /* U+00d292: */
+                                           RTUNI_ALPHA, /* U+00d293: */
+                                           RTUNI_ALPHA, /* U+00d294: */
+                                           RTUNI_ALPHA, /* U+00d295: */
+                                           RTUNI_ALPHA, /* U+00d296: */
+                                           RTUNI_ALPHA, /* U+00d297: */
+                                           RTUNI_ALPHA, /* U+00d298: */
+                                           RTUNI_ALPHA, /* U+00d299: */
+                                           RTUNI_ALPHA, /* U+00d29a: */
+                                           RTUNI_ALPHA, /* U+00d29b: */
+                                           RTUNI_ALPHA, /* U+00d29c: */
+                                           RTUNI_ALPHA, /* U+00d29d: */
+                                           RTUNI_ALPHA, /* U+00d29e: */
+                                           RTUNI_ALPHA, /* U+00d29f: */
+                                           RTUNI_ALPHA, /* U+00d2a0: */
+                                           RTUNI_ALPHA, /* U+00d2a1: */
+                                           RTUNI_ALPHA, /* U+00d2a2: */
+                                           RTUNI_ALPHA, /* U+00d2a3: */
+                                           RTUNI_ALPHA, /* U+00d2a4: */
+                                           RTUNI_ALPHA, /* U+00d2a5: */
+                                           RTUNI_ALPHA, /* U+00d2a6: */
+                                           RTUNI_ALPHA, /* U+00d2a7: */
+                                           RTUNI_ALPHA, /* U+00d2a8: */
+                                           RTUNI_ALPHA, /* U+00d2a9: */
+                                           RTUNI_ALPHA, /* U+00d2aa: */
+                                           RTUNI_ALPHA, /* U+00d2ab: */
+                                           RTUNI_ALPHA, /* U+00d2ac: */
+                                           RTUNI_ALPHA, /* U+00d2ad: */
+                                           RTUNI_ALPHA, /* U+00d2ae: */
+                                           RTUNI_ALPHA, /* U+00d2af: */
+                                           RTUNI_ALPHA, /* U+00d2b0: */
+                                           RTUNI_ALPHA, /* U+00d2b1: */
+                                           RTUNI_ALPHA, /* U+00d2b2: */
+                                           RTUNI_ALPHA, /* U+00d2b3: */
+                                           RTUNI_ALPHA, /* U+00d2b4: */
+                                           RTUNI_ALPHA, /* U+00d2b5: */
+                                           RTUNI_ALPHA, /* U+00d2b6: */
+                                           RTUNI_ALPHA, /* U+00d2b7: */
+                                           RTUNI_ALPHA, /* U+00d2b8: */
+                                           RTUNI_ALPHA, /* U+00d2b9: */
+                                           RTUNI_ALPHA, /* U+00d2ba: */
+                                           RTUNI_ALPHA, /* U+00d2bb: */
+                                           RTUNI_ALPHA, /* U+00d2bc: */
+                                           RTUNI_ALPHA, /* U+00d2bd: */
+                                           RTUNI_ALPHA, /* U+00d2be: */
+                                           RTUNI_ALPHA, /* U+00d2bf: */
+                                           RTUNI_ALPHA, /* U+00d2c0: */
+                                           RTUNI_ALPHA, /* U+00d2c1: */
+                                           RTUNI_ALPHA, /* U+00d2c2: */
+                                           RTUNI_ALPHA, /* U+00d2c3: */
+                                           RTUNI_ALPHA, /* U+00d2c4: */
+                                           RTUNI_ALPHA, /* U+00d2c5: */
+                                           RTUNI_ALPHA, /* U+00d2c6: */
+                                           RTUNI_ALPHA, /* U+00d2c7: */
+                                           RTUNI_ALPHA, /* U+00d2c8: */
+                                           RTUNI_ALPHA, /* U+00d2c9: */
+                                           RTUNI_ALPHA, /* U+00d2ca: */
+                                           RTUNI_ALPHA, /* U+00d2cb: */
+                                           RTUNI_ALPHA, /* U+00d2cc: */
+                                           RTUNI_ALPHA, /* U+00d2cd: */
+                                           RTUNI_ALPHA, /* U+00d2ce: */
+                                           RTUNI_ALPHA, /* U+00d2cf: */
+                                           RTUNI_ALPHA, /* U+00d2d0: */
+                                           RTUNI_ALPHA, /* U+00d2d1: */
+                                           RTUNI_ALPHA, /* U+00d2d2: */
+                                           RTUNI_ALPHA, /* U+00d2d3: */
+                                           RTUNI_ALPHA, /* U+00d2d4: */
+                                           RTUNI_ALPHA, /* U+00d2d5: */
+                                           RTUNI_ALPHA, /* U+00d2d6: */
+                                           RTUNI_ALPHA, /* U+00d2d7: */
+                                           RTUNI_ALPHA, /* U+00d2d8: */
+                                           RTUNI_ALPHA, /* U+00d2d9: */
+                                           RTUNI_ALPHA, /* U+00d2da: */
+                                           RTUNI_ALPHA, /* U+00d2db: */
+                                           RTUNI_ALPHA, /* U+00d2dc: */
+                                           RTUNI_ALPHA, /* U+00d2dd: */
+                                           RTUNI_ALPHA, /* U+00d2de: */
+                                           RTUNI_ALPHA, /* U+00d2df: */
+                                           RTUNI_ALPHA, /* U+00d2e0: */
+                                           RTUNI_ALPHA, /* U+00d2e1: */
+                                           RTUNI_ALPHA, /* U+00d2e2: */
+                                           RTUNI_ALPHA, /* U+00d2e3: */
+                                           RTUNI_ALPHA, /* U+00d2e4: */
+                                           RTUNI_ALPHA, /* U+00d2e5: */
+                                           RTUNI_ALPHA, /* U+00d2e6: */
+                                           RTUNI_ALPHA, /* U+00d2e7: */
+                                           RTUNI_ALPHA, /* U+00d2e8: */
+                                           RTUNI_ALPHA, /* U+00d2e9: */
+                                           RTUNI_ALPHA, /* U+00d2ea: */
+                                           RTUNI_ALPHA, /* U+00d2eb: */
+                                           RTUNI_ALPHA, /* U+00d2ec: */
+                                           RTUNI_ALPHA, /* U+00d2ed: */
+                                           RTUNI_ALPHA, /* U+00d2ee: */
+                                           RTUNI_ALPHA, /* U+00d2ef: */
+                                           RTUNI_ALPHA, /* U+00d2f0: */
+                                           RTUNI_ALPHA, /* U+00d2f1: */
+                                           RTUNI_ALPHA, /* U+00d2f2: */
+                                           RTUNI_ALPHA, /* U+00d2f3: */
+                                           RTUNI_ALPHA, /* U+00d2f4: */
+                                           RTUNI_ALPHA, /* U+00d2f5: */
+                                           RTUNI_ALPHA, /* U+00d2f6: */
+                                           RTUNI_ALPHA, /* U+00d2f7: */
+                                           RTUNI_ALPHA, /* U+00d2f8: */
+                                           RTUNI_ALPHA, /* U+00d2f9: */
+                                           RTUNI_ALPHA, /* U+00d2fa: */
+                                           RTUNI_ALPHA, /* U+00d2fb: */
+                                           RTUNI_ALPHA, /* U+00d2fc: */
+                                           RTUNI_ALPHA, /* U+00d2fd: */
+                                           RTUNI_ALPHA, /* U+00d2fe: */
+                                           RTUNI_ALPHA, /* U+00d2ff: */
+                                           RTUNI_ALPHA, /* U+00d300: */
+                                           RTUNI_ALPHA, /* U+00d301: */
+                                           RTUNI_ALPHA, /* U+00d302: */
+                                           RTUNI_ALPHA, /* U+00d303: */
+                                           RTUNI_ALPHA, /* U+00d304: */
+                                           RTUNI_ALPHA, /* U+00d305: */
+                                           RTUNI_ALPHA, /* U+00d306: */
+                                           RTUNI_ALPHA, /* U+00d307: */
+                                           RTUNI_ALPHA, /* U+00d308: */
+                                           RTUNI_ALPHA, /* U+00d309: */
+                                           RTUNI_ALPHA, /* U+00d30a: */
+                                           RTUNI_ALPHA, /* U+00d30b: */
+                                           RTUNI_ALPHA, /* U+00d30c: */
+                                           RTUNI_ALPHA, /* U+00d30d: */
+                                           RTUNI_ALPHA, /* U+00d30e: */
+                                           RTUNI_ALPHA, /* U+00d30f: */
+                                           RTUNI_ALPHA, /* U+00d310: */
+                                           RTUNI_ALPHA, /* U+00d311: */
+                                           RTUNI_ALPHA, /* U+00d312: */
+                                           RTUNI_ALPHA, /* U+00d313: */
+                                           RTUNI_ALPHA, /* U+00d314: */
+                                           RTUNI_ALPHA, /* U+00d315: */
+                                           RTUNI_ALPHA, /* U+00d316: */
+                                           RTUNI_ALPHA, /* U+00d317: */
+                                           RTUNI_ALPHA, /* U+00d318: */
+                                           RTUNI_ALPHA, /* U+00d319: */
+                                           RTUNI_ALPHA, /* U+00d31a: */
+                                           RTUNI_ALPHA, /* U+00d31b: */
+                                           RTUNI_ALPHA, /* U+00d31c: */
+                                           RTUNI_ALPHA, /* U+00d31d: */
+                                           RTUNI_ALPHA, /* U+00d31e: */
+                                           RTUNI_ALPHA, /* U+00d31f: */
+                                           RTUNI_ALPHA, /* U+00d320: */
+                                           RTUNI_ALPHA, /* U+00d321: */
+                                           RTUNI_ALPHA, /* U+00d322: */
+                                           RTUNI_ALPHA, /* U+00d323: */
+                                           RTUNI_ALPHA, /* U+00d324: */
+                                           RTUNI_ALPHA, /* U+00d325: */
+                                           RTUNI_ALPHA, /* U+00d326: */
+                                           RTUNI_ALPHA, /* U+00d327: */
+                                           RTUNI_ALPHA, /* U+00d328: */
+                                           RTUNI_ALPHA, /* U+00d329: */
+                                           RTUNI_ALPHA, /* U+00d32a: */
+                                           RTUNI_ALPHA, /* U+00d32b: */
+                                           RTUNI_ALPHA, /* U+00d32c: */
+                                           RTUNI_ALPHA, /* U+00d32d: */
+                                           RTUNI_ALPHA, /* U+00d32e: */
+                                           RTUNI_ALPHA, /* U+00d32f: */
+                                           RTUNI_ALPHA, /* U+00d330: */
+                                           RTUNI_ALPHA, /* U+00d331: */
+                                           RTUNI_ALPHA, /* U+00d332: */
+                                           RTUNI_ALPHA, /* U+00d333: */
+                                           RTUNI_ALPHA, /* U+00d334: */
+                                           RTUNI_ALPHA, /* U+00d335: */
+                                           RTUNI_ALPHA, /* U+00d336: */
+                                           RTUNI_ALPHA, /* U+00d337: */
+                                           RTUNI_ALPHA, /* U+00d338: */
+                                           RTUNI_ALPHA, /* U+00d339: */
+                                           RTUNI_ALPHA, /* U+00d33a: */
+                                           RTUNI_ALPHA, /* U+00d33b: */
+                                           RTUNI_ALPHA, /* U+00d33c: */
+                                           RTUNI_ALPHA, /* U+00d33d: */
+                                           RTUNI_ALPHA, /* U+00d33e: */
+                                           RTUNI_ALPHA, /* U+00d33f: */
+                                           RTUNI_ALPHA, /* U+00d340: */
+                                           RTUNI_ALPHA, /* U+00d341: */
+                                           RTUNI_ALPHA, /* U+00d342: */
+                                           RTUNI_ALPHA, /* U+00d343: */
+                                           RTUNI_ALPHA, /* U+00d344: */
+                                           RTUNI_ALPHA, /* U+00d345: */
+                                           RTUNI_ALPHA, /* U+00d346: */
+                                           RTUNI_ALPHA, /* U+00d347: */
+                                           RTUNI_ALPHA, /* U+00d348: */
+                                           RTUNI_ALPHA, /* U+00d349: */
+                                           RTUNI_ALPHA, /* U+00d34a: */
+                                           RTUNI_ALPHA, /* U+00d34b: */
+                                           RTUNI_ALPHA, /* U+00d34c: */
+                                           RTUNI_ALPHA, /* U+00d34d: */
+                                           RTUNI_ALPHA, /* U+00d34e: */
+                                           RTUNI_ALPHA, /* U+00d34f: */
+                                           RTUNI_ALPHA, /* U+00d350: */
+                                           RTUNI_ALPHA, /* U+00d351: */
+                                           RTUNI_ALPHA, /* U+00d352: */
+                                           RTUNI_ALPHA, /* U+00d353: */
+                                           RTUNI_ALPHA, /* U+00d354: */
+                                           RTUNI_ALPHA, /* U+00d355: */
+                                           RTUNI_ALPHA, /* U+00d356: */
+                                           RTUNI_ALPHA, /* U+00d357: */
+                                           RTUNI_ALPHA, /* U+00d358: */
+                                           RTUNI_ALPHA, /* U+00d359: */
+                                           RTUNI_ALPHA, /* U+00d35a: */
+                                           RTUNI_ALPHA, /* U+00d35b: */
+                                           RTUNI_ALPHA, /* U+00d35c: */
+                                           RTUNI_ALPHA, /* U+00d35d: */
+                                           RTUNI_ALPHA, /* U+00d35e: */
+                                           RTUNI_ALPHA, /* U+00d35f: */
+                                           RTUNI_ALPHA, /* U+00d360: */
+                                           RTUNI_ALPHA, /* U+00d361: */
+                                           RTUNI_ALPHA, /* U+00d362: */
+                                           RTUNI_ALPHA, /* U+00d363: */
+                                           RTUNI_ALPHA, /* U+00d364: */
+                                           RTUNI_ALPHA, /* U+00d365: */
+                                           RTUNI_ALPHA, /* U+00d366: */
+                                           RTUNI_ALPHA, /* U+00d367: */
+                                           RTUNI_ALPHA, /* U+00d368: */
+                                           RTUNI_ALPHA, /* U+00d369: */
+                                           RTUNI_ALPHA, /* U+00d36a: */
+                                           RTUNI_ALPHA, /* U+00d36b: */
+                                           RTUNI_ALPHA, /* U+00d36c: */
+                                           RTUNI_ALPHA, /* U+00d36d: */
+                                           RTUNI_ALPHA, /* U+00d36e: */
+                                           RTUNI_ALPHA, /* U+00d36f: */
+                                           RTUNI_ALPHA, /* U+00d370: */
+                                           RTUNI_ALPHA, /* U+00d371: */
+                                           RTUNI_ALPHA, /* U+00d372: */
+                                           RTUNI_ALPHA, /* U+00d373: */
+                                           RTUNI_ALPHA, /* U+00d374: */
+                                           RTUNI_ALPHA, /* U+00d375: */
+                                           RTUNI_ALPHA, /* U+00d376: */
+                                           RTUNI_ALPHA, /* U+00d377: */
+                                           RTUNI_ALPHA, /* U+00d378: */
+                                           RTUNI_ALPHA, /* U+00d379: */
+                                           RTUNI_ALPHA, /* U+00d37a: */
+                                           RTUNI_ALPHA, /* U+00d37b: */
+                                           RTUNI_ALPHA, /* U+00d37c: */
+                                           RTUNI_ALPHA, /* U+00d37d: */
+                                           RTUNI_ALPHA, /* U+00d37e: */
+                                           RTUNI_ALPHA, /* U+00d37f: */
+                                           RTUNI_ALPHA, /* U+00d380: */
+                                           RTUNI_ALPHA, /* U+00d381: */
+                                           RTUNI_ALPHA, /* U+00d382: */
+                                           RTUNI_ALPHA, /* U+00d383: */
+                                           RTUNI_ALPHA, /* U+00d384: */
+                                           RTUNI_ALPHA, /* U+00d385: */
+                                           RTUNI_ALPHA, /* U+00d386: */
+                                           RTUNI_ALPHA, /* U+00d387: */
+                                           RTUNI_ALPHA, /* U+00d388: */
+                                           RTUNI_ALPHA, /* U+00d389: */
+                                           RTUNI_ALPHA, /* U+00d38a: */
+                                           RTUNI_ALPHA, /* U+00d38b: */
+                                           RTUNI_ALPHA, /* U+00d38c: */
+                                           RTUNI_ALPHA, /* U+00d38d: */
+                                           RTUNI_ALPHA, /* U+00d38e: */
+                                           RTUNI_ALPHA, /* U+00d38f: */
+                                           RTUNI_ALPHA, /* U+00d390: */
+                                           RTUNI_ALPHA, /* U+00d391: */
+                                           RTUNI_ALPHA, /* U+00d392: */
+                                           RTUNI_ALPHA, /* U+00d393: */
+                                           RTUNI_ALPHA, /* U+00d394: */
+                                           RTUNI_ALPHA, /* U+00d395: */
+                                           RTUNI_ALPHA, /* U+00d396: */
+                                           RTUNI_ALPHA, /* U+00d397: */
+                                           RTUNI_ALPHA, /* U+00d398: */
+                                           RTUNI_ALPHA, /* U+00d399: */
+                                           RTUNI_ALPHA, /* U+00d39a: */
+                                           RTUNI_ALPHA, /* U+00d39b: */
+                                           RTUNI_ALPHA, /* U+00d39c: */
+                                           RTUNI_ALPHA, /* U+00d39d: */
+                                           RTUNI_ALPHA, /* U+00d39e: */
+                                           RTUNI_ALPHA, /* U+00d39f: */
+                                           RTUNI_ALPHA, /* U+00d3a0: */
+                                           RTUNI_ALPHA, /* U+00d3a1: */
+                                           RTUNI_ALPHA, /* U+00d3a2: */
+                                           RTUNI_ALPHA, /* U+00d3a3: */
+                                           RTUNI_ALPHA, /* U+00d3a4: */
+                                           RTUNI_ALPHA, /* U+00d3a5: */
+                                           RTUNI_ALPHA, /* U+00d3a6: */
+                                           RTUNI_ALPHA, /* U+00d3a7: */
+                                           RTUNI_ALPHA, /* U+00d3a8: */
+                                           RTUNI_ALPHA, /* U+00d3a9: */
+                                           RTUNI_ALPHA, /* U+00d3aa: */
+                                           RTUNI_ALPHA, /* U+00d3ab: */
+                                           RTUNI_ALPHA, /* U+00d3ac: */
+                                           RTUNI_ALPHA, /* U+00d3ad: */
+                                           RTUNI_ALPHA, /* U+00d3ae: */
+                                           RTUNI_ALPHA, /* U+00d3af: */
+                                           RTUNI_ALPHA, /* U+00d3b0: */
+                                           RTUNI_ALPHA, /* U+00d3b1: */
+                                           RTUNI_ALPHA, /* U+00d3b2: */
+                                           RTUNI_ALPHA, /* U+00d3b3: */
+                                           RTUNI_ALPHA, /* U+00d3b4: */
+                                           RTUNI_ALPHA, /* U+00d3b5: */
+                                           RTUNI_ALPHA, /* U+00d3b6: */
+                                           RTUNI_ALPHA, /* U+00d3b7: */
+                                           RTUNI_ALPHA, /* U+00d3b8: */
+                                           RTUNI_ALPHA, /* U+00d3b9: */
+                                           RTUNI_ALPHA, /* U+00d3ba: */
+                                           RTUNI_ALPHA, /* U+00d3bb: */
+                                           RTUNI_ALPHA, /* U+00d3bc: */
+                                           RTUNI_ALPHA, /* U+00d3bd: */
+                                           RTUNI_ALPHA, /* U+00d3be: */
+                                           RTUNI_ALPHA, /* U+00d3bf: */
+                                           RTUNI_ALPHA, /* U+00d3c0: */
+                                           RTUNI_ALPHA, /* U+00d3c1: */
+                                           RTUNI_ALPHA, /* U+00d3c2: */
+                                           RTUNI_ALPHA, /* U+00d3c3: */
+                                           RTUNI_ALPHA, /* U+00d3c4: */
+                                           RTUNI_ALPHA, /* U+00d3c5: */
+                                           RTUNI_ALPHA, /* U+00d3c6: */
+                                           RTUNI_ALPHA, /* U+00d3c7: */
+                                           RTUNI_ALPHA, /* U+00d3c8: */
+                                           RTUNI_ALPHA, /* U+00d3c9: */
+                                           RTUNI_ALPHA, /* U+00d3ca: */
+                                           RTUNI_ALPHA, /* U+00d3cb: */
+                                           RTUNI_ALPHA, /* U+00d3cc: */
+                                           RTUNI_ALPHA, /* U+00d3cd: */
+                                           RTUNI_ALPHA, /* U+00d3ce: */
+                                           RTUNI_ALPHA, /* U+00d3cf: */
+                                           RTUNI_ALPHA, /* U+00d3d0: */
+                                           RTUNI_ALPHA, /* U+00d3d1: */
+                                           RTUNI_ALPHA, /* U+00d3d2: */
+                                           RTUNI_ALPHA, /* U+00d3d3: */
+                                           RTUNI_ALPHA, /* U+00d3d4: */
+                                           RTUNI_ALPHA, /* U+00d3d5: */
+                                           RTUNI_ALPHA, /* U+00d3d6: */
+                                           RTUNI_ALPHA, /* U+00d3d7: */
+                                           RTUNI_ALPHA, /* U+00d3d8: */
+                                           RTUNI_ALPHA, /* U+00d3d9: */
+                                           RTUNI_ALPHA, /* U+00d3da: */
+                                           RTUNI_ALPHA, /* U+00d3db: */
+                                           RTUNI_ALPHA, /* U+00d3dc: */
+                                           RTUNI_ALPHA, /* U+00d3dd: */
+                                           RTUNI_ALPHA, /* U+00d3de: */
+                                           RTUNI_ALPHA, /* U+00d3df: */
+                                           RTUNI_ALPHA, /* U+00d3e0: */
+                                           RTUNI_ALPHA, /* U+00d3e1: */
+                                           RTUNI_ALPHA, /* U+00d3e2: */
+                                           RTUNI_ALPHA, /* U+00d3e3: */
+                                           RTUNI_ALPHA, /* U+00d3e4: */
+                                           RTUNI_ALPHA, /* U+00d3e5: */
+                                           RTUNI_ALPHA, /* U+00d3e6: */
+                                           RTUNI_ALPHA, /* U+00d3e7: */
+                                           RTUNI_ALPHA, /* U+00d3e8: */
+                                           RTUNI_ALPHA, /* U+00d3e9: */
+                                           RTUNI_ALPHA, /* U+00d3ea: */
+                                           RTUNI_ALPHA, /* U+00d3eb: */
+                                           RTUNI_ALPHA, /* U+00d3ec: */
+                                           RTUNI_ALPHA, /* U+00d3ed: */
+                                           RTUNI_ALPHA, /* U+00d3ee: */
+                                           RTUNI_ALPHA, /* U+00d3ef: */
+                                           RTUNI_ALPHA, /* U+00d3f0: */
+                                           RTUNI_ALPHA, /* U+00d3f1: */
+                                           RTUNI_ALPHA, /* U+00d3f2: */
+                                           RTUNI_ALPHA, /* U+00d3f3: */
+                                           RTUNI_ALPHA, /* U+00d3f4: */
+                                           RTUNI_ALPHA, /* U+00d3f5: */
+                                           RTUNI_ALPHA, /* U+00d3f6: */
+                                           RTUNI_ALPHA, /* U+00d3f7: */
+                                           RTUNI_ALPHA, /* U+00d3f8: */
+                                           RTUNI_ALPHA, /* U+00d3f9: */
+                                           RTUNI_ALPHA, /* U+00d3fa: */
+                                           RTUNI_ALPHA, /* U+00d3fb: */
+                                           RTUNI_ALPHA, /* U+00d3fc: */
+                                           RTUNI_ALPHA, /* U+00d3fd: */
+                                           RTUNI_ALPHA, /* U+00d3fe: */
+                                           RTUNI_ALPHA, /* U+00d3ff: */
+                                           RTUNI_ALPHA, /* U+00d400: */
+                                           RTUNI_ALPHA, /* U+00d401: */
+                                           RTUNI_ALPHA, /* U+00d402: */
+                                           RTUNI_ALPHA, /* U+00d403: */
+                                           RTUNI_ALPHA, /* U+00d404: */
+                                           RTUNI_ALPHA, /* U+00d405: */
+                                           RTUNI_ALPHA, /* U+00d406: */
+                                           RTUNI_ALPHA, /* U+00d407: */
+                                           RTUNI_ALPHA, /* U+00d408: */
+                                           RTUNI_ALPHA, /* U+00d409: */
+                                           RTUNI_ALPHA, /* U+00d40a: */
+                                           RTUNI_ALPHA, /* U+00d40b: */
+                                           RTUNI_ALPHA, /* U+00d40c: */
+                                           RTUNI_ALPHA, /* U+00d40d: */
+                                           RTUNI_ALPHA, /* U+00d40e: */
+                                           RTUNI_ALPHA, /* U+00d40f: */
+                                           RTUNI_ALPHA, /* U+00d410: */
+                                           RTUNI_ALPHA, /* U+00d411: */
+                                           RTUNI_ALPHA, /* U+00d412: */
+                                           RTUNI_ALPHA, /* U+00d413: */
+                                           RTUNI_ALPHA, /* U+00d414: */
+                                           RTUNI_ALPHA, /* U+00d415: */
+                                           RTUNI_ALPHA, /* U+00d416: */
+                                           RTUNI_ALPHA, /* U+00d417: */
+                                           RTUNI_ALPHA, /* U+00d418: */
+                                           RTUNI_ALPHA, /* U+00d419: */
+                                           RTUNI_ALPHA, /* U+00d41a: */
+                                           RTUNI_ALPHA, /* U+00d41b: */
+                                           RTUNI_ALPHA, /* U+00d41c: */
+                                           RTUNI_ALPHA, /* U+00d41d: */
+                                           RTUNI_ALPHA, /* U+00d41e: */
+                                           RTUNI_ALPHA, /* U+00d41f: */
+                                           RTUNI_ALPHA, /* U+00d420: */
+                                           RTUNI_ALPHA, /* U+00d421: */
+                                           RTUNI_ALPHA, /* U+00d422: */
+                                           RTUNI_ALPHA, /* U+00d423: */
+                                           RTUNI_ALPHA, /* U+00d424: */
+                                           RTUNI_ALPHA, /* U+00d425: */
+                                           RTUNI_ALPHA, /* U+00d426: */
+                                           RTUNI_ALPHA, /* U+00d427: */
+                                           RTUNI_ALPHA, /* U+00d428: */
+                                           RTUNI_ALPHA, /* U+00d429: */
+                                           RTUNI_ALPHA, /* U+00d42a: */
+                                           RTUNI_ALPHA, /* U+00d42b: */
+                                           RTUNI_ALPHA, /* U+00d42c: */
+                                           RTUNI_ALPHA, /* U+00d42d: */
+                                           RTUNI_ALPHA, /* U+00d42e: */
+                                           RTUNI_ALPHA, /* U+00d42f: */
+                                           RTUNI_ALPHA, /* U+00d430: */
+                                           RTUNI_ALPHA, /* U+00d431: */
+                                           RTUNI_ALPHA, /* U+00d432: */
+                                           RTUNI_ALPHA, /* U+00d433: */
+                                           RTUNI_ALPHA, /* U+00d434: */
+                                           RTUNI_ALPHA, /* U+00d435: */
+                                           RTUNI_ALPHA, /* U+00d436: */
+                                           RTUNI_ALPHA, /* U+00d437: */
+                                           RTUNI_ALPHA, /* U+00d438: */
+                                           RTUNI_ALPHA, /* U+00d439: */
+                                           RTUNI_ALPHA, /* U+00d43a: */
+                                           RTUNI_ALPHA, /* U+00d43b: */
+                                           RTUNI_ALPHA, /* U+00d43c: */
+                                           RTUNI_ALPHA, /* U+00d43d: */
+                                           RTUNI_ALPHA, /* U+00d43e: */
+                                           RTUNI_ALPHA, /* U+00d43f: */
+                                           RTUNI_ALPHA, /* U+00d440: */
+                                           RTUNI_ALPHA, /* U+00d441: */
+                                           RTUNI_ALPHA, /* U+00d442: */
+                                           RTUNI_ALPHA, /* U+00d443: */
+                                           RTUNI_ALPHA, /* U+00d444: */
+                                           RTUNI_ALPHA, /* U+00d445: */
+                                           RTUNI_ALPHA, /* U+00d446: */
+                                           RTUNI_ALPHA, /* U+00d447: */
+                                           RTUNI_ALPHA, /* U+00d448: */
+                                           RTUNI_ALPHA, /* U+00d449: */
+                                           RTUNI_ALPHA, /* U+00d44a: */
+                                           RTUNI_ALPHA, /* U+00d44b: */
+                                           RTUNI_ALPHA, /* U+00d44c: */
+                                           RTUNI_ALPHA, /* U+00d44d: */
+                                           RTUNI_ALPHA, /* U+00d44e: */
+                                           RTUNI_ALPHA, /* U+00d44f: */
+                                           RTUNI_ALPHA, /* U+00d450: */
+                                           RTUNI_ALPHA, /* U+00d451: */
+                                           RTUNI_ALPHA, /* U+00d452: */
+                                           RTUNI_ALPHA, /* U+00d453: */
+                                           RTUNI_ALPHA, /* U+00d454: */
+                                           RTUNI_ALPHA, /* U+00d455: */
+                                           RTUNI_ALPHA, /* U+00d456: */
+                                           RTUNI_ALPHA, /* U+00d457: */
+                                           RTUNI_ALPHA, /* U+00d458: */
+                                           RTUNI_ALPHA, /* U+00d459: */
+                                           RTUNI_ALPHA, /* U+00d45a: */
+                                           RTUNI_ALPHA, /* U+00d45b: */
+                                           RTUNI_ALPHA, /* U+00d45c: */
+                                           RTUNI_ALPHA, /* U+00d45d: */
+                                           RTUNI_ALPHA, /* U+00d45e: */
+                                           RTUNI_ALPHA, /* U+00d45f: */
+                                           RTUNI_ALPHA, /* U+00d460: */
+                                           RTUNI_ALPHA, /* U+00d461: */
+                                           RTUNI_ALPHA, /* U+00d462: */
+                                           RTUNI_ALPHA, /* U+00d463: */
+                                           RTUNI_ALPHA, /* U+00d464: */
+                                           RTUNI_ALPHA, /* U+00d465: */
+                                           RTUNI_ALPHA, /* U+00d466: */
+                                           RTUNI_ALPHA, /* U+00d467: */
+                                           RTUNI_ALPHA, /* U+00d468: */
+                                           RTUNI_ALPHA, /* U+00d469: */
+                                           RTUNI_ALPHA, /* U+00d46a: */
+                                           RTUNI_ALPHA, /* U+00d46b: */
+                                           RTUNI_ALPHA, /* U+00d46c: */
+                                           RTUNI_ALPHA, /* U+00d46d: */
+                                           RTUNI_ALPHA, /* U+00d46e: */
+                                           RTUNI_ALPHA, /* U+00d46f: */
+                                           RTUNI_ALPHA, /* U+00d470: */
+                                           RTUNI_ALPHA, /* U+00d471: */
+                                           RTUNI_ALPHA, /* U+00d472: */
+                                           RTUNI_ALPHA, /* U+00d473: */
+                                           RTUNI_ALPHA, /* U+00d474: */
+                                           RTUNI_ALPHA, /* U+00d475: */
+                                           RTUNI_ALPHA, /* U+00d476: */
+                                           RTUNI_ALPHA, /* U+00d477: */
+                                           RTUNI_ALPHA, /* U+00d478: */
+                                           RTUNI_ALPHA, /* U+00d479: */
+                                           RTUNI_ALPHA, /* U+00d47a: */
+                                           RTUNI_ALPHA, /* U+00d47b: */
+                                           RTUNI_ALPHA, /* U+00d47c: */
+                                           RTUNI_ALPHA, /* U+00d47d: */
+                                           RTUNI_ALPHA, /* U+00d47e: */
+                                           RTUNI_ALPHA, /* U+00d47f: */
+                                           RTUNI_ALPHA, /* U+00d480: */
+                                           RTUNI_ALPHA, /* U+00d481: */
+                                           RTUNI_ALPHA, /* U+00d482: */
+                                           RTUNI_ALPHA, /* U+00d483: */
+                                           RTUNI_ALPHA, /* U+00d484: */
+                                           RTUNI_ALPHA, /* U+00d485: */
+                                           RTUNI_ALPHA, /* U+00d486: */
+                                           RTUNI_ALPHA, /* U+00d487: */
+                                           RTUNI_ALPHA, /* U+00d488: */
+                                           RTUNI_ALPHA, /* U+00d489: */
+                                           RTUNI_ALPHA, /* U+00d48a: */
+                                           RTUNI_ALPHA, /* U+00d48b: */
+                                           RTUNI_ALPHA, /* U+00d48c: */
+                                           RTUNI_ALPHA, /* U+00d48d: */
+                                           RTUNI_ALPHA, /* U+00d48e: */
+                                           RTUNI_ALPHA, /* U+00d48f: */
+                                           RTUNI_ALPHA, /* U+00d490: */
+                                           RTUNI_ALPHA, /* U+00d491: */
+                                           RTUNI_ALPHA, /* U+00d492: */
+                                           RTUNI_ALPHA, /* U+00d493: */
+                                           RTUNI_ALPHA, /* U+00d494: */
+                                           RTUNI_ALPHA, /* U+00d495: */
+                                           RTUNI_ALPHA, /* U+00d496: */
+                                           RTUNI_ALPHA, /* U+00d497: */
+                                           RTUNI_ALPHA, /* U+00d498: */
+                                           RTUNI_ALPHA, /* U+00d499: */
+                                           RTUNI_ALPHA, /* U+00d49a: */
+                                           RTUNI_ALPHA, /* U+00d49b: */
+                                           RTUNI_ALPHA, /* U+00d49c: */
+                                           RTUNI_ALPHA, /* U+00d49d: */
+                                           RTUNI_ALPHA, /* U+00d49e: */
+                                           RTUNI_ALPHA, /* U+00d49f: */
+                                           RTUNI_ALPHA, /* U+00d4a0: */
+                                           RTUNI_ALPHA, /* U+00d4a1: */
+                                           RTUNI_ALPHA, /* U+00d4a2: */
+                                           RTUNI_ALPHA, /* U+00d4a3: */
+                                           RTUNI_ALPHA, /* U+00d4a4: */
+                                           RTUNI_ALPHA, /* U+00d4a5: */
+                                           RTUNI_ALPHA, /* U+00d4a6: */
+                                           RTUNI_ALPHA, /* U+00d4a7: */
+                                           RTUNI_ALPHA, /* U+00d4a8: */
+                                           RTUNI_ALPHA, /* U+00d4a9: */
+                                           RTUNI_ALPHA, /* U+00d4aa: */
+                                           RTUNI_ALPHA, /* U+00d4ab: */
+                                           RTUNI_ALPHA, /* U+00d4ac: */
+                                           RTUNI_ALPHA, /* U+00d4ad: */
+                                           RTUNI_ALPHA, /* U+00d4ae: */
+                                           RTUNI_ALPHA, /* U+00d4af: */
+                                           RTUNI_ALPHA, /* U+00d4b0: */
+                                           RTUNI_ALPHA, /* U+00d4b1: */
+                                           RTUNI_ALPHA, /* U+00d4b2: */
+                                           RTUNI_ALPHA, /* U+00d4b3: */
+                                           RTUNI_ALPHA, /* U+00d4b4: */
+                                           RTUNI_ALPHA, /* U+00d4b5: */
+                                           RTUNI_ALPHA, /* U+00d4b6: */
+                                           RTUNI_ALPHA, /* U+00d4b7: */
+                                           RTUNI_ALPHA, /* U+00d4b8: */
+                                           RTUNI_ALPHA, /* U+00d4b9: */
+                                           RTUNI_ALPHA, /* U+00d4ba: */
+                                           RTUNI_ALPHA, /* U+00d4bb: */
+                                           RTUNI_ALPHA, /* U+00d4bc: */
+                                           RTUNI_ALPHA, /* U+00d4bd: */
+                                           RTUNI_ALPHA, /* U+00d4be: */
+                                           RTUNI_ALPHA, /* U+00d4bf: */
+                                           RTUNI_ALPHA, /* U+00d4c0: */
+                                           RTUNI_ALPHA, /* U+00d4c1: */
+                                           RTUNI_ALPHA, /* U+00d4c2: */
+                                           RTUNI_ALPHA, /* U+00d4c3: */
+                                           RTUNI_ALPHA, /* U+00d4c4: */
+                                           RTUNI_ALPHA, /* U+00d4c5: */
+                                           RTUNI_ALPHA, /* U+00d4c6: */
+                                           RTUNI_ALPHA, /* U+00d4c7: */
+                                           RTUNI_ALPHA, /* U+00d4c8: */
+                                           RTUNI_ALPHA, /* U+00d4c9: */
+                                           RTUNI_ALPHA, /* U+00d4ca: */
+                                           RTUNI_ALPHA, /* U+00d4cb: */
+                                           RTUNI_ALPHA, /* U+00d4cc: */
+                                           RTUNI_ALPHA, /* U+00d4cd: */
+                                           RTUNI_ALPHA, /* U+00d4ce: */
+                                           RTUNI_ALPHA, /* U+00d4cf: */
+                                           RTUNI_ALPHA, /* U+00d4d0: */
+                                           RTUNI_ALPHA, /* U+00d4d1: */
+                                           RTUNI_ALPHA, /* U+00d4d2: */
+                                           RTUNI_ALPHA, /* U+00d4d3: */
+                                           RTUNI_ALPHA, /* U+00d4d4: */
+                                           RTUNI_ALPHA, /* U+00d4d5: */
+                                           RTUNI_ALPHA, /* U+00d4d6: */
+                                           RTUNI_ALPHA, /* U+00d4d7: */
+                                           RTUNI_ALPHA, /* U+00d4d8: */
+                                           RTUNI_ALPHA, /* U+00d4d9: */
+                                           RTUNI_ALPHA, /* U+00d4da: */
+                                           RTUNI_ALPHA, /* U+00d4db: */
+                                           RTUNI_ALPHA, /* U+00d4dc: */
+                                           RTUNI_ALPHA, /* U+00d4dd: */
+                                           RTUNI_ALPHA, /* U+00d4de: */
+                                           RTUNI_ALPHA, /* U+00d4df: */
+                                           RTUNI_ALPHA, /* U+00d4e0: */
+                                           RTUNI_ALPHA, /* U+00d4e1: */
+                                           RTUNI_ALPHA, /* U+00d4e2: */
+                                           RTUNI_ALPHA, /* U+00d4e3: */
+                                           RTUNI_ALPHA, /* U+00d4e4: */
+                                           RTUNI_ALPHA, /* U+00d4e5: */
+                                           RTUNI_ALPHA, /* U+00d4e6: */
+                                           RTUNI_ALPHA, /* U+00d4e7: */
+                                           RTUNI_ALPHA, /* U+00d4e8: */
+                                           RTUNI_ALPHA, /* U+00d4e9: */
+                                           RTUNI_ALPHA, /* U+00d4ea: */
+                                           RTUNI_ALPHA, /* U+00d4eb: */
+                                           RTUNI_ALPHA, /* U+00d4ec: */
+                                           RTUNI_ALPHA, /* U+00d4ed: */
+                                           RTUNI_ALPHA, /* U+00d4ee: */
+                                           RTUNI_ALPHA, /* U+00d4ef: */
+                                           RTUNI_ALPHA, /* U+00d4f0: */
+                                           RTUNI_ALPHA, /* U+00d4f1: */
+                                           RTUNI_ALPHA, /* U+00d4f2: */
+                                           RTUNI_ALPHA, /* U+00d4f3: */
+                                           RTUNI_ALPHA, /* U+00d4f4: */
+                                           RTUNI_ALPHA, /* U+00d4f5: */
+                                           RTUNI_ALPHA, /* U+00d4f6: */
+                                           RTUNI_ALPHA, /* U+00d4f7: */
+                                           RTUNI_ALPHA, /* U+00d4f8: */
+                                           RTUNI_ALPHA, /* U+00d4f9: */
+                                           RTUNI_ALPHA, /* U+00d4fa: */
+                                           RTUNI_ALPHA, /* U+00d4fb: */
+                                           RTUNI_ALPHA, /* U+00d4fc: */
+                                           RTUNI_ALPHA, /* U+00d4fd: */
+                                           RTUNI_ALPHA, /* U+00d4fe: */
+                                           RTUNI_ALPHA, /* U+00d4ff: */
+                                           RTUNI_ALPHA, /* U+00d500: */
+                                           RTUNI_ALPHA, /* U+00d501: */
+                                           RTUNI_ALPHA, /* U+00d502: */
+                                           RTUNI_ALPHA, /* U+00d503: */
+                                           RTUNI_ALPHA, /* U+00d504: */
+                                           RTUNI_ALPHA, /* U+00d505: */
+                                           RTUNI_ALPHA, /* U+00d506: */
+                                           RTUNI_ALPHA, /* U+00d507: */
+                                           RTUNI_ALPHA, /* U+00d508: */
+                                           RTUNI_ALPHA, /* U+00d509: */
+                                           RTUNI_ALPHA, /* U+00d50a: */
+                                           RTUNI_ALPHA, /* U+00d50b: */
+                                           RTUNI_ALPHA, /* U+00d50c: */
+                                           RTUNI_ALPHA, /* U+00d50d: */
+                                           RTUNI_ALPHA, /* U+00d50e: */
+                                           RTUNI_ALPHA, /* U+00d50f: */
+                                           RTUNI_ALPHA, /* U+00d510: */
+                                           RTUNI_ALPHA, /* U+00d511: */
+                                           RTUNI_ALPHA, /* U+00d512: */
+                                           RTUNI_ALPHA, /* U+00d513: */
+                                           RTUNI_ALPHA, /* U+00d514: */
+                                           RTUNI_ALPHA, /* U+00d515: */
+                                           RTUNI_ALPHA, /* U+00d516: */
+                                           RTUNI_ALPHA, /* U+00d517: */
+                                           RTUNI_ALPHA, /* U+00d518: */
+                                           RTUNI_ALPHA, /* U+00d519: */
+                                           RTUNI_ALPHA, /* U+00d51a: */
+                                           RTUNI_ALPHA, /* U+00d51b: */
+                                           RTUNI_ALPHA, /* U+00d51c: */
+                                           RTUNI_ALPHA, /* U+00d51d: */
+                                           RTUNI_ALPHA, /* U+00d51e: */
+                                           RTUNI_ALPHA, /* U+00d51f: */
+                                           RTUNI_ALPHA, /* U+00d520: */
+                                           RTUNI_ALPHA, /* U+00d521: */
+                                           RTUNI_ALPHA, /* U+00d522: */
+                                           RTUNI_ALPHA, /* U+00d523: */
+                                           RTUNI_ALPHA, /* U+00d524: */
+                                           RTUNI_ALPHA, /* U+00d525: */
+                                           RTUNI_ALPHA, /* U+00d526: */
+                                           RTUNI_ALPHA, /* U+00d527: */
+                                           RTUNI_ALPHA, /* U+00d528: */
+                                           RTUNI_ALPHA, /* U+00d529: */
+                                           RTUNI_ALPHA, /* U+00d52a: */
+                                           RTUNI_ALPHA, /* U+00d52b: */
+                                           RTUNI_ALPHA, /* U+00d52c: */
+                                           RTUNI_ALPHA, /* U+00d52d: */
+                                           RTUNI_ALPHA, /* U+00d52e: */
+                                           RTUNI_ALPHA, /* U+00d52f: */
+                                           RTUNI_ALPHA, /* U+00d530: */
+                                           RTUNI_ALPHA, /* U+00d531: */
+                                           RTUNI_ALPHA, /* U+00d532: */
+                                           RTUNI_ALPHA, /* U+00d533: */
+                                           RTUNI_ALPHA, /* U+00d534: */
+                                           RTUNI_ALPHA, /* U+00d535: */
+                                           RTUNI_ALPHA, /* U+00d536: */
+                                           RTUNI_ALPHA, /* U+00d537: */
+                                           RTUNI_ALPHA, /* U+00d538: */
+                                           RTUNI_ALPHA, /* U+00d539: */
+                                           RTUNI_ALPHA, /* U+00d53a: */
+                                           RTUNI_ALPHA, /* U+00d53b: */
+                                           RTUNI_ALPHA, /* U+00d53c: */
+                                           RTUNI_ALPHA, /* U+00d53d: */
+                                           RTUNI_ALPHA, /* U+00d53e: */
+                                           RTUNI_ALPHA, /* U+00d53f: */
+                                           RTUNI_ALPHA, /* U+00d540: */
+                                           RTUNI_ALPHA, /* U+00d541: */
+                                           RTUNI_ALPHA, /* U+00d542: */
+                                           RTUNI_ALPHA, /* U+00d543: */
+                                           RTUNI_ALPHA, /* U+00d544: */
+                                           RTUNI_ALPHA, /* U+00d545: */
+                                           RTUNI_ALPHA, /* U+00d546: */
+                                           RTUNI_ALPHA, /* U+00d547: */
+                                           RTUNI_ALPHA, /* U+00d548: */
+                                           RTUNI_ALPHA, /* U+00d549: */
+                                           RTUNI_ALPHA, /* U+00d54a: */
+                                           RTUNI_ALPHA, /* U+00d54b: */
+                                           RTUNI_ALPHA, /* U+00d54c: */
+                                           RTUNI_ALPHA, /* U+00d54d: */
+                                           RTUNI_ALPHA, /* U+00d54e: */
+                                           RTUNI_ALPHA, /* U+00d54f: */
+                                           RTUNI_ALPHA, /* U+00d550: */
+                                           RTUNI_ALPHA, /* U+00d551: */
+                                           RTUNI_ALPHA, /* U+00d552: */
+                                           RTUNI_ALPHA, /* U+00d553: */
+                                           RTUNI_ALPHA, /* U+00d554: */
+                                           RTUNI_ALPHA, /* U+00d555: */
+                                           RTUNI_ALPHA, /* U+00d556: */
+                                           RTUNI_ALPHA, /* U+00d557: */
+                                           RTUNI_ALPHA, /* U+00d558: */
+                                           RTUNI_ALPHA, /* U+00d559: */
+                                           RTUNI_ALPHA, /* U+00d55a: */
+                                           RTUNI_ALPHA, /* U+00d55b: */
+                                           RTUNI_ALPHA, /* U+00d55c: */
+                                           RTUNI_ALPHA, /* U+00d55d: */
+                                           RTUNI_ALPHA, /* U+00d55e: */
+                                           RTUNI_ALPHA, /* U+00d55f: */
+                                           RTUNI_ALPHA, /* U+00d560: */
+                                           RTUNI_ALPHA, /* U+00d561: */
+                                           RTUNI_ALPHA, /* U+00d562: */
+                                           RTUNI_ALPHA, /* U+00d563: */
+                                           RTUNI_ALPHA, /* U+00d564: */
+                                           RTUNI_ALPHA, /* U+00d565: */
+                                           RTUNI_ALPHA, /* U+00d566: */
+                                           RTUNI_ALPHA, /* U+00d567: */
+                                           RTUNI_ALPHA, /* U+00d568: */
+                                           RTUNI_ALPHA, /* U+00d569: */
+                                           RTUNI_ALPHA, /* U+00d56a: */
+                                           RTUNI_ALPHA, /* U+00d56b: */
+                                           RTUNI_ALPHA, /* U+00d56c: */
+                                           RTUNI_ALPHA, /* U+00d56d: */
+                                           RTUNI_ALPHA, /* U+00d56e: */
+                                           RTUNI_ALPHA, /* U+00d56f: */
+                                           RTUNI_ALPHA, /* U+00d570: */
+                                           RTUNI_ALPHA, /* U+00d571: */
+                                           RTUNI_ALPHA, /* U+00d572: */
+                                           RTUNI_ALPHA, /* U+00d573: */
+                                           RTUNI_ALPHA, /* U+00d574: */
+                                           RTUNI_ALPHA, /* U+00d575: */
+                                           RTUNI_ALPHA, /* U+00d576: */
+                                           RTUNI_ALPHA, /* U+00d577: */
+                                           RTUNI_ALPHA, /* U+00d578: */
+                                           RTUNI_ALPHA, /* U+00d579: */
+                                           RTUNI_ALPHA, /* U+00d57a: */
+                                           RTUNI_ALPHA, /* U+00d57b: */
+                                           RTUNI_ALPHA, /* U+00d57c: */
+                                           RTUNI_ALPHA, /* U+00d57d: */
+                                           RTUNI_ALPHA, /* U+00d57e: */
+                                           RTUNI_ALPHA, /* U+00d57f: */
+                                           RTUNI_ALPHA, /* U+00d580: */
+                                           RTUNI_ALPHA, /* U+00d581: */
+                                           RTUNI_ALPHA, /* U+00d582: */
+                                           RTUNI_ALPHA, /* U+00d583: */
+                                           RTUNI_ALPHA, /* U+00d584: */
+                                           RTUNI_ALPHA, /* U+00d585: */
+                                           RTUNI_ALPHA, /* U+00d586: */
+                                           RTUNI_ALPHA, /* U+00d587: */
+                                           RTUNI_ALPHA, /* U+00d588: */
+                                           RTUNI_ALPHA, /* U+00d589: */
+                                           RTUNI_ALPHA, /* U+00d58a: */
+                                           RTUNI_ALPHA, /* U+00d58b: */
+                                           RTUNI_ALPHA, /* U+00d58c: */
+                                           RTUNI_ALPHA, /* U+00d58d: */
+                                           RTUNI_ALPHA, /* U+00d58e: */
+                                           RTUNI_ALPHA, /* U+00d58f: */
+                                           RTUNI_ALPHA, /* U+00d590: */
+                                           RTUNI_ALPHA, /* U+00d591: */
+                                           RTUNI_ALPHA, /* U+00d592: */
+                                           RTUNI_ALPHA, /* U+00d593: */
+                                           RTUNI_ALPHA, /* U+00d594: */
+                                           RTUNI_ALPHA, /* U+00d595: */
+                                           RTUNI_ALPHA, /* U+00d596: */
+                                           RTUNI_ALPHA, /* U+00d597: */
+                                           RTUNI_ALPHA, /* U+00d598: */
+                                           RTUNI_ALPHA, /* U+00d599: */
+                                           RTUNI_ALPHA, /* U+00d59a: */
+                                           RTUNI_ALPHA, /* U+00d59b: */
+                                           RTUNI_ALPHA, /* U+00d59c: */
+                                           RTUNI_ALPHA, /* U+00d59d: */
+                                           RTUNI_ALPHA, /* U+00d59e: */
+                                           RTUNI_ALPHA, /* U+00d59f: */
+                                           RTUNI_ALPHA, /* U+00d5a0: */
+                                           RTUNI_ALPHA, /* U+00d5a1: */
+                                           RTUNI_ALPHA, /* U+00d5a2: */
+                                           RTUNI_ALPHA, /* U+00d5a3: */
+                                           RTUNI_ALPHA, /* U+00d5a4: */
+                                           RTUNI_ALPHA, /* U+00d5a5: */
+                                           RTUNI_ALPHA, /* U+00d5a6: */
+                                           RTUNI_ALPHA, /* U+00d5a7: */
+                                           RTUNI_ALPHA, /* U+00d5a8: */
+                                           RTUNI_ALPHA, /* U+00d5a9: */
+                                           RTUNI_ALPHA, /* U+00d5aa: */
+                                           RTUNI_ALPHA, /* U+00d5ab: */
+                                           RTUNI_ALPHA, /* U+00d5ac: */
+                                           RTUNI_ALPHA, /* U+00d5ad: */
+                                           RTUNI_ALPHA, /* U+00d5ae: */
+                                           RTUNI_ALPHA, /* U+00d5af: */
+                                           RTUNI_ALPHA, /* U+00d5b0: */
+                                           RTUNI_ALPHA, /* U+00d5b1: */
+                                           RTUNI_ALPHA, /* U+00d5b2: */
+                                           RTUNI_ALPHA, /* U+00d5b3: */
+                                           RTUNI_ALPHA, /* U+00d5b4: */
+                                           RTUNI_ALPHA, /* U+00d5b5: */
+                                           RTUNI_ALPHA, /* U+00d5b6: */
+                                           RTUNI_ALPHA, /* U+00d5b7: */
+                                           RTUNI_ALPHA, /* U+00d5b8: */
+                                           RTUNI_ALPHA, /* U+00d5b9: */
+                                           RTUNI_ALPHA, /* U+00d5ba: */
+                                           RTUNI_ALPHA, /* U+00d5bb: */
+                                           RTUNI_ALPHA, /* U+00d5bc: */
+                                           RTUNI_ALPHA, /* U+00d5bd: */
+                                           RTUNI_ALPHA, /* U+00d5be: */
+                                           RTUNI_ALPHA, /* U+00d5bf: */
+                                           RTUNI_ALPHA, /* U+00d5c0: */
+                                           RTUNI_ALPHA, /* U+00d5c1: */
+                                           RTUNI_ALPHA, /* U+00d5c2: */
+                                           RTUNI_ALPHA, /* U+00d5c3: */
+                                           RTUNI_ALPHA, /* U+00d5c4: */
+                                           RTUNI_ALPHA, /* U+00d5c5: */
+                                           RTUNI_ALPHA, /* U+00d5c6: */
+                                           RTUNI_ALPHA, /* U+00d5c7: */
+                                           RTUNI_ALPHA, /* U+00d5c8: */
+                                           RTUNI_ALPHA, /* U+00d5c9: */
+                                           RTUNI_ALPHA, /* U+00d5ca: */
+                                           RTUNI_ALPHA, /* U+00d5cb: */
+                                           RTUNI_ALPHA, /* U+00d5cc: */
+                                           RTUNI_ALPHA, /* U+00d5cd: */
+                                           RTUNI_ALPHA, /* U+00d5ce: */
+                                           RTUNI_ALPHA, /* U+00d5cf: */
+                                           RTUNI_ALPHA, /* U+00d5d0: */
+                                           RTUNI_ALPHA, /* U+00d5d1: */
+                                           RTUNI_ALPHA, /* U+00d5d2: */
+                                           RTUNI_ALPHA, /* U+00d5d3: */
+                                           RTUNI_ALPHA, /* U+00d5d4: */
+                                           RTUNI_ALPHA, /* U+00d5d5: */
+                                           RTUNI_ALPHA, /* U+00d5d6: */
+                                           RTUNI_ALPHA, /* U+00d5d7: */
+                                           RTUNI_ALPHA, /* U+00d5d8: */
+                                           RTUNI_ALPHA, /* U+00d5d9: */
+                                           RTUNI_ALPHA, /* U+00d5da: */
+                                           RTUNI_ALPHA, /* U+00d5db: */
+                                           RTUNI_ALPHA, /* U+00d5dc: */
+                                           RTUNI_ALPHA, /* U+00d5dd: */
+                                           RTUNI_ALPHA, /* U+00d5de: */
+                                           RTUNI_ALPHA, /* U+00d5df: */
+                                           RTUNI_ALPHA, /* U+00d5e0: */
+                                           RTUNI_ALPHA, /* U+00d5e1: */
+                                           RTUNI_ALPHA, /* U+00d5e2: */
+                                           RTUNI_ALPHA, /* U+00d5e3: */
+                                           RTUNI_ALPHA, /* U+00d5e4: */
+                                           RTUNI_ALPHA, /* U+00d5e5: */
+                                           RTUNI_ALPHA, /* U+00d5e6: */
+                                           RTUNI_ALPHA, /* U+00d5e7: */
+                                           RTUNI_ALPHA, /* U+00d5e8: */
+                                           RTUNI_ALPHA, /* U+00d5e9: */
+                                           RTUNI_ALPHA, /* U+00d5ea: */
+                                           RTUNI_ALPHA, /* U+00d5eb: */
+                                           RTUNI_ALPHA, /* U+00d5ec: */
+                                           RTUNI_ALPHA, /* U+00d5ed: */
+                                           RTUNI_ALPHA, /* U+00d5ee: */
+                                           RTUNI_ALPHA, /* U+00d5ef: */
+                                           RTUNI_ALPHA, /* U+00d5f0: */
+                                           RTUNI_ALPHA, /* U+00d5f1: */
+                                           RTUNI_ALPHA, /* U+00d5f2: */
+                                           RTUNI_ALPHA, /* U+00d5f3: */
+                                           RTUNI_ALPHA, /* U+00d5f4: */
+                                           RTUNI_ALPHA, /* U+00d5f5: */
+                                           RTUNI_ALPHA, /* U+00d5f6: */
+                                           RTUNI_ALPHA, /* U+00d5f7: */
+                                           RTUNI_ALPHA, /* U+00d5f8: */
+                                           RTUNI_ALPHA, /* U+00d5f9: */
+                                           RTUNI_ALPHA, /* U+00d5fa: */
+                                           RTUNI_ALPHA, /* U+00d5fb: */
+                                           RTUNI_ALPHA, /* U+00d5fc: */
+                                           RTUNI_ALPHA, /* U+00d5fd: */
+                                           RTUNI_ALPHA, /* U+00d5fe: */
+                                           RTUNI_ALPHA, /* U+00d5ff: */
+                                           RTUNI_ALPHA, /* U+00d600: */
+                                           RTUNI_ALPHA, /* U+00d601: */
+                                           RTUNI_ALPHA, /* U+00d602: */
+                                           RTUNI_ALPHA, /* U+00d603: */
+                                           RTUNI_ALPHA, /* U+00d604: */
+                                           RTUNI_ALPHA, /* U+00d605: */
+                                           RTUNI_ALPHA, /* U+00d606: */
+                                           RTUNI_ALPHA, /* U+00d607: */
+                                           RTUNI_ALPHA, /* U+00d608: */
+                                           RTUNI_ALPHA, /* U+00d609: */
+                                           RTUNI_ALPHA, /* U+00d60a: */
+                                           RTUNI_ALPHA, /* U+00d60b: */
+                                           RTUNI_ALPHA, /* U+00d60c: */
+                                           RTUNI_ALPHA, /* U+00d60d: */
+                                           RTUNI_ALPHA, /* U+00d60e: */
+                                           RTUNI_ALPHA, /* U+00d60f: */
+                                           RTUNI_ALPHA, /* U+00d610: */
+                                           RTUNI_ALPHA, /* U+00d611: */
+                                           RTUNI_ALPHA, /* U+00d612: */
+                                           RTUNI_ALPHA, /* U+00d613: */
+                                           RTUNI_ALPHA, /* U+00d614: */
+                                           RTUNI_ALPHA, /* U+00d615: */
+                                           RTUNI_ALPHA, /* U+00d616: */
+                                           RTUNI_ALPHA, /* U+00d617: */
+                                           RTUNI_ALPHA, /* U+00d618: */
+                                           RTUNI_ALPHA, /* U+00d619: */
+                                           RTUNI_ALPHA, /* U+00d61a: */
+                                           RTUNI_ALPHA, /* U+00d61b: */
+                                           RTUNI_ALPHA, /* U+00d61c: */
+                                           RTUNI_ALPHA, /* U+00d61d: */
+                                           RTUNI_ALPHA, /* U+00d61e: */
+                                           RTUNI_ALPHA, /* U+00d61f: */
+                                           RTUNI_ALPHA, /* U+00d620: */
+                                           RTUNI_ALPHA, /* U+00d621: */
+                                           RTUNI_ALPHA, /* U+00d622: */
+                                           RTUNI_ALPHA, /* U+00d623: */
+                                           RTUNI_ALPHA, /* U+00d624: */
+                                           RTUNI_ALPHA, /* U+00d625: */
+                                           RTUNI_ALPHA, /* U+00d626: */
+                                           RTUNI_ALPHA, /* U+00d627: */
+                                           RTUNI_ALPHA, /* U+00d628: */
+                                           RTUNI_ALPHA, /* U+00d629: */
+                                           RTUNI_ALPHA, /* U+00d62a: */
+                                           RTUNI_ALPHA, /* U+00d62b: */
+                                           RTUNI_ALPHA, /* U+00d62c: */
+                                           RTUNI_ALPHA, /* U+00d62d: */
+                                           RTUNI_ALPHA, /* U+00d62e: */
+                                           RTUNI_ALPHA, /* U+00d62f: */
+                                           RTUNI_ALPHA, /* U+00d630: */
+                                           RTUNI_ALPHA, /* U+00d631: */
+                                           RTUNI_ALPHA, /* U+00d632: */
+                                           RTUNI_ALPHA, /* U+00d633: */
+                                           RTUNI_ALPHA, /* U+00d634: */
+                                           RTUNI_ALPHA, /* U+00d635: */
+                                           RTUNI_ALPHA, /* U+00d636: */
+                                           RTUNI_ALPHA, /* U+00d637: */
+                                           RTUNI_ALPHA, /* U+00d638: */
+                                           RTUNI_ALPHA, /* U+00d639: */
+                                           RTUNI_ALPHA, /* U+00d63a: */
+                                           RTUNI_ALPHA, /* U+00d63b: */
+                                           RTUNI_ALPHA, /* U+00d63c: */
+                                           RTUNI_ALPHA, /* U+00d63d: */
+                                           RTUNI_ALPHA, /* U+00d63e: */
+                                           RTUNI_ALPHA, /* U+00d63f: */
+                                           RTUNI_ALPHA, /* U+00d640: */
+                                           RTUNI_ALPHA, /* U+00d641: */
+                                           RTUNI_ALPHA, /* U+00d642: */
+                                           RTUNI_ALPHA, /* U+00d643: */
+                                           RTUNI_ALPHA, /* U+00d644: */
+                                           RTUNI_ALPHA, /* U+00d645: */
+                                           RTUNI_ALPHA, /* U+00d646: */
+                                           RTUNI_ALPHA, /* U+00d647: */
+                                           RTUNI_ALPHA, /* U+00d648: */
+                                           RTUNI_ALPHA, /* U+00d649: */
+                                           RTUNI_ALPHA, /* U+00d64a: */
+                                           RTUNI_ALPHA, /* U+00d64b: */
+                                           RTUNI_ALPHA, /* U+00d64c: */
+                                           RTUNI_ALPHA, /* U+00d64d: */
+                                           RTUNI_ALPHA, /* U+00d64e: */
+                                           RTUNI_ALPHA, /* U+00d64f: */
+                                           RTUNI_ALPHA, /* U+00d650: */
+                                           RTUNI_ALPHA, /* U+00d651: */
+                                           RTUNI_ALPHA, /* U+00d652: */
+                                           RTUNI_ALPHA, /* U+00d653: */
+                                           RTUNI_ALPHA, /* U+00d654: */
+                                           RTUNI_ALPHA, /* U+00d655: */
+                                           RTUNI_ALPHA, /* U+00d656: */
+                                           RTUNI_ALPHA, /* U+00d657: */
+                                           RTUNI_ALPHA, /* U+00d658: */
+                                           RTUNI_ALPHA, /* U+00d659: */
+                                           RTUNI_ALPHA, /* U+00d65a: */
+                                           RTUNI_ALPHA, /* U+00d65b: */
+                                           RTUNI_ALPHA, /* U+00d65c: */
+                                           RTUNI_ALPHA, /* U+00d65d: */
+                                           RTUNI_ALPHA, /* U+00d65e: */
+                                           RTUNI_ALPHA, /* U+00d65f: */
+                                           RTUNI_ALPHA, /* U+00d660: */
+                                           RTUNI_ALPHA, /* U+00d661: */
+                                           RTUNI_ALPHA, /* U+00d662: */
+                                           RTUNI_ALPHA, /* U+00d663: */
+                                           RTUNI_ALPHA, /* U+00d664: */
+                                           RTUNI_ALPHA, /* U+00d665: */
+                                           RTUNI_ALPHA, /* U+00d666: */
+                                           RTUNI_ALPHA, /* U+00d667: */
+                                           RTUNI_ALPHA, /* U+00d668: */
+                                           RTUNI_ALPHA, /* U+00d669: */
+                                           RTUNI_ALPHA, /* U+00d66a: */
+                                           RTUNI_ALPHA, /* U+00d66b: */
+                                           RTUNI_ALPHA, /* U+00d66c: */
+                                           RTUNI_ALPHA, /* U+00d66d: */
+                                           RTUNI_ALPHA, /* U+00d66e: */
+                                           RTUNI_ALPHA, /* U+00d66f: */
+                                           RTUNI_ALPHA, /* U+00d670: */
+                                           RTUNI_ALPHA, /* U+00d671: */
+                                           RTUNI_ALPHA, /* U+00d672: */
+                                           RTUNI_ALPHA, /* U+00d673: */
+                                           RTUNI_ALPHA, /* U+00d674: */
+                                           RTUNI_ALPHA, /* U+00d675: */
+                                           RTUNI_ALPHA, /* U+00d676: */
+                                           RTUNI_ALPHA, /* U+00d677: */
+                                           RTUNI_ALPHA, /* U+00d678: */
+                                           RTUNI_ALPHA, /* U+00d679: */
+                                           RTUNI_ALPHA, /* U+00d67a: */
+                                           RTUNI_ALPHA, /* U+00d67b: */
+                                           RTUNI_ALPHA, /* U+00d67c: */
+                                           RTUNI_ALPHA, /* U+00d67d: */
+                                           RTUNI_ALPHA, /* U+00d67e: */
+                                           RTUNI_ALPHA, /* U+00d67f: */
+                                           RTUNI_ALPHA, /* U+00d680: */
+                                           RTUNI_ALPHA, /* U+00d681: */
+                                           RTUNI_ALPHA, /* U+00d682: */
+                                           RTUNI_ALPHA, /* U+00d683: */
+                                           RTUNI_ALPHA, /* U+00d684: */
+                                           RTUNI_ALPHA, /* U+00d685: */
+                                           RTUNI_ALPHA, /* U+00d686: */
+                                           RTUNI_ALPHA, /* U+00d687: */
+                                           RTUNI_ALPHA, /* U+00d688: */
+                                           RTUNI_ALPHA, /* U+00d689: */
+                                           RTUNI_ALPHA, /* U+00d68a: */
+                                           RTUNI_ALPHA, /* U+00d68b: */
+                                           RTUNI_ALPHA, /* U+00d68c: */
+                                           RTUNI_ALPHA, /* U+00d68d: */
+                                           RTUNI_ALPHA, /* U+00d68e: */
+                                           RTUNI_ALPHA, /* U+00d68f: */
+                                           RTUNI_ALPHA, /* U+00d690: */
+                                           RTUNI_ALPHA, /* U+00d691: */
+                                           RTUNI_ALPHA, /* U+00d692: */
+                                           RTUNI_ALPHA, /* U+00d693: */
+                                           RTUNI_ALPHA, /* U+00d694: */
+                                           RTUNI_ALPHA, /* U+00d695: */
+                                           RTUNI_ALPHA, /* U+00d696: */
+                                           RTUNI_ALPHA, /* U+00d697: */
+                                           RTUNI_ALPHA, /* U+00d698: */
+                                           RTUNI_ALPHA, /* U+00d699: */
+                                           RTUNI_ALPHA, /* U+00d69a: */
+                                           RTUNI_ALPHA, /* U+00d69b: */
+                                           RTUNI_ALPHA, /* U+00d69c: */
+                                           RTUNI_ALPHA, /* U+00d69d: */
+                                           RTUNI_ALPHA, /* U+00d69e: */
+                                           RTUNI_ALPHA, /* U+00d69f: */
+                                           RTUNI_ALPHA, /* U+00d6a0: */
+                                           RTUNI_ALPHA, /* U+00d6a1: */
+                                           RTUNI_ALPHA, /* U+00d6a2: */
+                                           RTUNI_ALPHA, /* U+00d6a3: */
+                                           RTUNI_ALPHA, /* U+00d6a4: */
+                                           RTUNI_ALPHA, /* U+00d6a5: */
+                                           RTUNI_ALPHA, /* U+00d6a6: */
+                                           RTUNI_ALPHA, /* U+00d6a7: */
+                                           RTUNI_ALPHA, /* U+00d6a8: */
+                                           RTUNI_ALPHA, /* U+00d6a9: */
+                                           RTUNI_ALPHA, /* U+00d6aa: */
+                                           RTUNI_ALPHA, /* U+00d6ab: */
+                                           RTUNI_ALPHA, /* U+00d6ac: */
+                                           RTUNI_ALPHA, /* U+00d6ad: */
+                                           RTUNI_ALPHA, /* U+00d6ae: */
+                                           RTUNI_ALPHA, /* U+00d6af: */
+                                           RTUNI_ALPHA, /* U+00d6b0: */
+                                           RTUNI_ALPHA, /* U+00d6b1: */
+                                           RTUNI_ALPHA, /* U+00d6b2: */
+                                           RTUNI_ALPHA, /* U+00d6b3: */
+                                           RTUNI_ALPHA, /* U+00d6b4: */
+                                           RTUNI_ALPHA, /* U+00d6b5: */
+                                           RTUNI_ALPHA, /* U+00d6b6: */
+                                           RTUNI_ALPHA, /* U+00d6b7: */
+                                           RTUNI_ALPHA, /* U+00d6b8: */
+                                           RTUNI_ALPHA, /* U+00d6b9: */
+                                           RTUNI_ALPHA, /* U+00d6ba: */
+                                           RTUNI_ALPHA, /* U+00d6bb: */
+                                           RTUNI_ALPHA, /* U+00d6bc: */
+                                           RTUNI_ALPHA, /* U+00d6bd: */
+                                           RTUNI_ALPHA, /* U+00d6be: */
+                                           RTUNI_ALPHA, /* U+00d6bf: */
+                                           RTUNI_ALPHA, /* U+00d6c0: */
+                                           RTUNI_ALPHA, /* U+00d6c1: */
+                                           RTUNI_ALPHA, /* U+00d6c2: */
+                                           RTUNI_ALPHA, /* U+00d6c3: */
+                                           RTUNI_ALPHA, /* U+00d6c4: */
+                                           RTUNI_ALPHA, /* U+00d6c5: */
+                                           RTUNI_ALPHA, /* U+00d6c6: */
+                                           RTUNI_ALPHA, /* U+00d6c7: */
+                                           RTUNI_ALPHA, /* U+00d6c8: */
+                                           RTUNI_ALPHA, /* U+00d6c9: */
+                                           RTUNI_ALPHA, /* U+00d6ca: */
+                                           RTUNI_ALPHA, /* U+00d6cb: */
+                                           RTUNI_ALPHA, /* U+00d6cc: */
+                                           RTUNI_ALPHA, /* U+00d6cd: */
+                                           RTUNI_ALPHA, /* U+00d6ce: */
+                                           RTUNI_ALPHA, /* U+00d6cf: */
+                                           RTUNI_ALPHA, /* U+00d6d0: */
+                                           RTUNI_ALPHA, /* U+00d6d1: */
+                                           RTUNI_ALPHA, /* U+00d6d2: */
+                                           RTUNI_ALPHA, /* U+00d6d3: */
+                                           RTUNI_ALPHA, /* U+00d6d4: */
+                                           RTUNI_ALPHA, /* U+00d6d5: */
+                                           RTUNI_ALPHA, /* U+00d6d6: */
+                                           RTUNI_ALPHA, /* U+00d6d7: */
+                                           RTUNI_ALPHA, /* U+00d6d8: */
+                                           RTUNI_ALPHA, /* U+00d6d9: */
+                                           RTUNI_ALPHA, /* U+00d6da: */
+                                           RTUNI_ALPHA, /* U+00d6db: */
+                                           RTUNI_ALPHA, /* U+00d6dc: */
+                                           RTUNI_ALPHA, /* U+00d6dd: */
+                                           RTUNI_ALPHA, /* U+00d6de: */
+                                           RTUNI_ALPHA, /* U+00d6df: */
+                                           RTUNI_ALPHA, /* U+00d6e0: */
+                                           RTUNI_ALPHA, /* U+00d6e1: */
+                                           RTUNI_ALPHA, /* U+00d6e2: */
+                                           RTUNI_ALPHA, /* U+00d6e3: */
+                                           RTUNI_ALPHA, /* U+00d6e4: */
+                                           RTUNI_ALPHA, /* U+00d6e5: */
+                                           RTUNI_ALPHA, /* U+00d6e6: */
+                                           RTUNI_ALPHA, /* U+00d6e7: */
+                                           RTUNI_ALPHA, /* U+00d6e8: */
+                                           RTUNI_ALPHA, /* U+00d6e9: */
+                                           RTUNI_ALPHA, /* U+00d6ea: */
+                                           RTUNI_ALPHA, /* U+00d6eb: */
+                                           RTUNI_ALPHA, /* U+00d6ec: */
+                                           RTUNI_ALPHA, /* U+00d6ed: */
+                                           RTUNI_ALPHA, /* U+00d6ee: */
+                                           RTUNI_ALPHA, /* U+00d6ef: */
+                                           RTUNI_ALPHA, /* U+00d6f0: */
+                                           RTUNI_ALPHA, /* U+00d6f1: */
+                                           RTUNI_ALPHA, /* U+00d6f2: */
+                                           RTUNI_ALPHA, /* U+00d6f3: */
+                                           RTUNI_ALPHA, /* U+00d6f4: */
+                                           RTUNI_ALPHA, /* U+00d6f5: */
+                                           RTUNI_ALPHA, /* U+00d6f6: */
+                                           RTUNI_ALPHA, /* U+00d6f7: */
+                                           RTUNI_ALPHA, /* U+00d6f8: */
+                                           RTUNI_ALPHA, /* U+00d6f9: */
+                                           RTUNI_ALPHA, /* U+00d6fa: */
+                                           RTUNI_ALPHA, /* U+00d6fb: */
+                                           RTUNI_ALPHA, /* U+00d6fc: */
+                                           RTUNI_ALPHA, /* U+00d6fd: */
+                                           RTUNI_ALPHA, /* U+00d6fe: */
+                                           RTUNI_ALPHA, /* U+00d6ff: */
+                                           RTUNI_ALPHA, /* U+00d700: */
+                                           RTUNI_ALPHA, /* U+00d701: */
+                                           RTUNI_ALPHA, /* U+00d702: */
+                                           RTUNI_ALPHA, /* U+00d703: */
+                                           RTUNI_ALPHA, /* U+00d704: */
+                                           RTUNI_ALPHA, /* U+00d705: */
+                                           RTUNI_ALPHA, /* U+00d706: */
+                                           RTUNI_ALPHA, /* U+00d707: */
+                                           RTUNI_ALPHA, /* U+00d708: */
+                                           RTUNI_ALPHA, /* U+00d709: */
+                                           RTUNI_ALPHA, /* U+00d70a: */
+                                           RTUNI_ALPHA, /* U+00d70b: */
+                                           RTUNI_ALPHA, /* U+00d70c: */
+                                           RTUNI_ALPHA, /* U+00d70d: */
+                                           RTUNI_ALPHA, /* U+00d70e: */
+                                           RTUNI_ALPHA, /* U+00d70f: */
+                                           RTUNI_ALPHA, /* U+00d710: */
+                                           RTUNI_ALPHA, /* U+00d711: */
+                                           RTUNI_ALPHA, /* U+00d712: */
+                                           RTUNI_ALPHA, /* U+00d713: */
+                                           RTUNI_ALPHA, /* U+00d714: */
+                                           RTUNI_ALPHA, /* U+00d715: */
+                                           RTUNI_ALPHA, /* U+00d716: */
+                                           RTUNI_ALPHA, /* U+00d717: */
+                                           RTUNI_ALPHA, /* U+00d718: */
+                                           RTUNI_ALPHA, /* U+00d719: */
+                                           RTUNI_ALPHA, /* U+00d71a: */
+                                           RTUNI_ALPHA, /* U+00d71b: */
+                                           RTUNI_ALPHA, /* U+00d71c: */
+                                           RTUNI_ALPHA, /* U+00d71d: */
+                                           RTUNI_ALPHA, /* U+00d71e: */
+                                           RTUNI_ALPHA, /* U+00d71f: */
+                                           RTUNI_ALPHA, /* U+00d720: */
+                                           RTUNI_ALPHA, /* U+00d721: */
+                                           RTUNI_ALPHA, /* U+00d722: */
+                                           RTUNI_ALPHA, /* U+00d723: */
+                                           RTUNI_ALPHA, /* U+00d724: */
+                                           RTUNI_ALPHA, /* U+00d725: */
+                                           RTUNI_ALPHA, /* U+00d726: */
+                                           RTUNI_ALPHA, /* U+00d727: */
+                                           RTUNI_ALPHA, /* U+00d728: */
+                                           RTUNI_ALPHA, /* U+00d729: */
+                                           RTUNI_ALPHA, /* U+00d72a: */
+                                           RTUNI_ALPHA, /* U+00d72b: */
+                                           RTUNI_ALPHA, /* U+00d72c: */
+                                           RTUNI_ALPHA, /* U+00d72d: */
+                                           RTUNI_ALPHA, /* U+00d72e: */
+                                           RTUNI_ALPHA, /* U+00d72f: */
+                                           RTUNI_ALPHA, /* U+00d730: */
+                                           RTUNI_ALPHA, /* U+00d731: */
+                                           RTUNI_ALPHA, /* U+00d732: */
+                                           RTUNI_ALPHA, /* U+00d733: */
+                                           RTUNI_ALPHA, /* U+00d734: */
+                                           RTUNI_ALPHA, /* U+00d735: */
+                                           RTUNI_ALPHA, /* U+00d736: */
+                                           RTUNI_ALPHA, /* U+00d737: */
+                                           RTUNI_ALPHA, /* U+00d738: */
+                                           RTUNI_ALPHA, /* U+00d739: */
+                                           RTUNI_ALPHA, /* U+00d73a: */
+                                           RTUNI_ALPHA, /* U+00d73b: */
+                                           RTUNI_ALPHA, /* U+00d73c: */
+                                           RTUNI_ALPHA, /* U+00d73d: */
+                                           RTUNI_ALPHA, /* U+00d73e: */
+                                           RTUNI_ALPHA, /* U+00d73f: */
+                                           RTUNI_ALPHA, /* U+00d740: */
+                                           RTUNI_ALPHA, /* U+00d741: */
+                                           RTUNI_ALPHA, /* U+00d742: */
+                                           RTUNI_ALPHA, /* U+00d743: */
+                                           RTUNI_ALPHA, /* U+00d744: */
+                                           RTUNI_ALPHA, /* U+00d745: */
+                                           RTUNI_ALPHA, /* U+00d746: */
+                                           RTUNI_ALPHA, /* U+00d747: */
+                                           RTUNI_ALPHA, /* U+00d748: */
+                                           RTUNI_ALPHA, /* U+00d749: */
+                                           RTUNI_ALPHA, /* U+00d74a: */
+                                           RTUNI_ALPHA, /* U+00d74b: */
+                                           RTUNI_ALPHA, /* U+00d74c: */
+                                           RTUNI_ALPHA, /* U+00d74d: */
+                                           RTUNI_ALPHA, /* U+00d74e: */
+                                           RTUNI_ALPHA, /* U+00d74f: */
+                                           RTUNI_ALPHA, /* U+00d750: */
+                                           RTUNI_ALPHA, /* U+00d751: */
+                                           RTUNI_ALPHA, /* U+00d752: */
+                                           RTUNI_ALPHA, /* U+00d753: */
+                                           RTUNI_ALPHA, /* U+00d754: */
+                                           RTUNI_ALPHA, /* U+00d755: */
+                                           RTUNI_ALPHA, /* U+00d756: */
+                                           RTUNI_ALPHA, /* U+00d757: */
+                                           RTUNI_ALPHA, /* U+00d758: */
+                                           RTUNI_ALPHA, /* U+00d759: */
+                                           RTUNI_ALPHA, /* U+00d75a: */
+                                           RTUNI_ALPHA, /* U+00d75b: */
+                                           RTUNI_ALPHA, /* U+00d75c: */
+                                           RTUNI_ALPHA, /* U+00d75d: */
+                                           RTUNI_ALPHA, /* U+00d75e: */
+                                           RTUNI_ALPHA, /* U+00d75f: */
+                                           RTUNI_ALPHA, /* U+00d760: */
+                                           RTUNI_ALPHA, /* U+00d761: */
+                                           RTUNI_ALPHA, /* U+00d762: */
+                                           RTUNI_ALPHA, /* U+00d763: */
+                                           RTUNI_ALPHA, /* U+00d764: */
+                                           RTUNI_ALPHA, /* U+00d765: */
+                                           RTUNI_ALPHA, /* U+00d766: */
+                                           RTUNI_ALPHA, /* U+00d767: */
+                                           RTUNI_ALPHA, /* U+00d768: */
+                                           RTUNI_ALPHA, /* U+00d769: */
+                                           RTUNI_ALPHA, /* U+00d76a: */
+                                           RTUNI_ALPHA, /* U+00d76b: */
+                                           RTUNI_ALPHA, /* U+00d76c: */
+                                           RTUNI_ALPHA, /* U+00d76d: */
+                                           RTUNI_ALPHA, /* U+00d76e: */
+                                           RTUNI_ALPHA, /* U+00d76f: */
+                                           RTUNI_ALPHA, /* U+00d770: */
+                                           RTUNI_ALPHA, /* U+00d771: */
+                                           RTUNI_ALPHA, /* U+00d772: */
+                                           RTUNI_ALPHA, /* U+00d773: */
+                                           RTUNI_ALPHA, /* U+00d774: */
+                                           RTUNI_ALPHA, /* U+00d775: */
+                                           RTUNI_ALPHA, /* U+00d776: */
+                                           RTUNI_ALPHA, /* U+00d777: */
+                                           RTUNI_ALPHA, /* U+00d778: */
+                                           RTUNI_ALPHA, /* U+00d779: */
+                                           RTUNI_ALPHA, /* U+00d77a: */
+                                           RTUNI_ALPHA, /* U+00d77b: */
+                                           RTUNI_ALPHA, /* U+00d77c: */
+                                           RTUNI_ALPHA, /* U+00d77d: */
+                                           RTUNI_ALPHA, /* U+00d77e: */
+                                           RTUNI_ALPHA, /* U+00d77f: */
+                                           RTUNI_ALPHA, /* U+00d780: */
+                                           RTUNI_ALPHA, /* U+00d781: */
+                                           RTUNI_ALPHA, /* U+00d782: */
+                                           RTUNI_ALPHA, /* U+00d783: */
+                                           RTUNI_ALPHA, /* U+00d784: */
+                                           RTUNI_ALPHA, /* U+00d785: */
+                                           RTUNI_ALPHA, /* U+00d786: */
+                                           RTUNI_ALPHA, /* U+00d787: */
+                                           RTUNI_ALPHA, /* U+00d788: */
+                                           RTUNI_ALPHA, /* U+00d789: */
+                                           RTUNI_ALPHA, /* U+00d78a: */
+                                           RTUNI_ALPHA, /* U+00d78b: */
+                                           RTUNI_ALPHA, /* U+00d78c: */
+                                           RTUNI_ALPHA, /* U+00d78d: */
+                                           RTUNI_ALPHA, /* U+00d78e: */
+                                           RTUNI_ALPHA, /* U+00d78f: */
+                                           RTUNI_ALPHA, /* U+00d790: */
+                                           RTUNI_ALPHA, /* U+00d791: */
+                                           RTUNI_ALPHA, /* U+00d792: */
+                                           RTUNI_ALPHA, /* U+00d793: */
+                                           RTUNI_ALPHA, /* U+00d794: */
+                                           RTUNI_ALPHA, /* U+00d795: */
+                                           RTUNI_ALPHA, /* U+00d796: */
+                                           RTUNI_ALPHA, /* U+00d797: */
+                                           RTUNI_ALPHA, /* U+00d798: */
+                                           RTUNI_ALPHA, /* U+00d799: */
+                                           RTUNI_ALPHA, /* U+00d79a: */
+                                           RTUNI_ALPHA, /* U+00d79b: */
+                                           RTUNI_ALPHA, /* U+00d79c: */
+                                           RTUNI_ALPHA, /* U+00d79d: */
+                                           RTUNI_ALPHA, /* U+00d79e: */
+                                           RTUNI_ALPHA, /* U+00d79f: */
+                                           RTUNI_ALPHA, /* U+00d7a0: */
+                                           RTUNI_ALPHA, /* U+00d7a1: */
+                                           RTUNI_ALPHA, /* U+00d7a2: */
+                                           RTUNI_ALPHA, /* U+00d7a3: <Hangul Syllable, Last>*/
+                                                     0, /* U+00d7a4: */
+                                                     0, /* U+00d7a5: */
+                                                     0, /* U+00d7a6: */
+                                                     0, /* U+00d7a7: */
+                                                     0, /* U+00d7a8: */
+                                                     0, /* U+00d7a9: */
+                                                     0, /* U+00d7aa: */
+                                                     0, /* U+00d7ab: */
+                                                     0, /* U+00d7ac: */
+                                                     0, /* U+00d7ad: */
+                                                     0, /* U+00d7ae: */
+                                                     0, /* U+00d7af: */
+                                           RTUNI_ALPHA, /* U+00d7b0: HANGUL JUNGSEONG O-YEO*/
+                                           RTUNI_ALPHA, /* U+00d7b1: HANGUL JUNGSEONG O-O-I*/
+                                           RTUNI_ALPHA, /* U+00d7b2: HANGUL JUNGSEONG YO-A*/
+                                           RTUNI_ALPHA, /* U+00d7b3: HANGUL JUNGSEONG YO-AE*/
+                                           RTUNI_ALPHA, /* U+00d7b4: HANGUL JUNGSEONG YO-EO*/
+                                           RTUNI_ALPHA, /* U+00d7b5: HANGUL JUNGSEONG U-YEO*/
+                                           RTUNI_ALPHA, /* U+00d7b6: HANGUL JUNGSEONG U-I-I*/
+                                           RTUNI_ALPHA, /* U+00d7b7: HANGUL JUNGSEONG YU-AE*/
+                                           RTUNI_ALPHA, /* U+00d7b8: HANGUL JUNGSEONG YU-O*/
+                                           RTUNI_ALPHA, /* U+00d7b9: HANGUL JUNGSEONG EU-A*/
+                                           RTUNI_ALPHA, /* U+00d7ba: HANGUL JUNGSEONG EU-EO*/
+                                           RTUNI_ALPHA, /* U+00d7bb: HANGUL JUNGSEONG EU-E*/
+                                           RTUNI_ALPHA, /* U+00d7bc: HANGUL JUNGSEONG EU-O*/
+                                           RTUNI_ALPHA, /* U+00d7bd: HANGUL JUNGSEONG I-YA-O*/
+                                           RTUNI_ALPHA, /* U+00d7be: HANGUL JUNGSEONG I-YAE*/
+                                           RTUNI_ALPHA, /* U+00d7bf: HANGUL JUNGSEONG I-YEO*/
+                                           RTUNI_ALPHA, /* U+00d7c0: HANGUL JUNGSEONG I-YE*/
+                                           RTUNI_ALPHA, /* U+00d7c1: HANGUL JUNGSEONG I-O-I*/
+                                           RTUNI_ALPHA, /* U+00d7c2: HANGUL JUNGSEONG I-YO*/
+                                           RTUNI_ALPHA, /* U+00d7c3: HANGUL JUNGSEONG I-YU*/
+                                           RTUNI_ALPHA, /* U+00d7c4: HANGUL JUNGSEONG I-I*/
+                                           RTUNI_ALPHA, /* U+00d7c5: HANGUL JUNGSEONG ARAEA-A*/
+                                           RTUNI_ALPHA, /* U+00d7c6: HANGUL JUNGSEONG ARAEA-E*/
+                                                     0, /* U+00d7c7: */
+                                                     0, /* U+00d7c8: */
+                                                     0, /* U+00d7c9: */
+                                                     0, /* U+00d7ca: */
+                                           RTUNI_ALPHA, /* U+00d7cb: HANGUL JONGSEONG NIEUN-RIEUL*/
+                                           RTUNI_ALPHA, /* U+00d7cc: HANGUL JONGSEONG NIEUN-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00d7cd: HANGUL JONGSEONG SSANGTIKEUT*/
+                                           RTUNI_ALPHA, /* U+00d7ce: HANGUL JONGSEONG SSANGTIKEUT-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7cf: HANGUL JONGSEONG TIKEUT-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7d0: HANGUL JONGSEONG TIKEUT-SIOS*/
+                                           RTUNI_ALPHA, /* U+00d7d1: HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00d7d2: HANGUL JONGSEONG TIKEUT-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00d7d3: HANGUL JONGSEONG TIKEUT-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00d7d4: HANGUL JONGSEONG TIKEUT-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00d7d5: HANGUL JONGSEONG RIEUL-SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+00d7d6: HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00d7d7: HANGUL JONGSEONG SSANGRIEUL-KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+00d7d8: HANGUL JONGSEONG RIEUL-MIEUM-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00d7d9: HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00d7da: HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00d7db: HANGUL JONGSEONG RIEUL-YESIEUNG*/
+                                           RTUNI_ALPHA, /* U+00d7dc: HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00d7dd: HANGUL JONGSEONG KAPYEOUNRIEUL*/
+                                           RTUNI_ALPHA, /* U+00d7de: HANGUL JONGSEONG MIEUM-NIEUN*/
+                                           RTUNI_ALPHA, /* U+00d7df: HANGUL JONGSEONG MIEUM-SSANGNIEUN*/
+                                           RTUNI_ALPHA, /* U+00d7e0: HANGUL JONGSEONG SSANGMIEUM*/
+                                           RTUNI_ALPHA, /* U+00d7e1: HANGUL JONGSEONG MIEUM-PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+00d7e2: HANGUL JONGSEONG MIEUM-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00d7e3: HANGUL JONGSEONG PIEUP-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00d7e4: HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00d7e5: HANGUL JONGSEONG PIEUP-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00d7e6: HANGUL JONGSEONG SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7e7: HANGUL JONGSEONG PIEUP-SIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00d7e8: HANGUL JONGSEONG PIEUP-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00d7e9: HANGUL JONGSEONG PIEUP-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00d7ea: HANGUL JONGSEONG SIOS-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00d7eb: HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7ec: HANGUL JONGSEONG SSANGSIOS-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00d7ed: HANGUL JONGSEONG SSANGSIOS-TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00d7ee: HANGUL JONGSEONG SIOS-PANSIOS*/
+                                           RTUNI_ALPHA, /* U+00d7ef: HANGUL JONGSEONG SIOS-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00d7f0: HANGUL JONGSEONG SIOS-CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00d7f1: HANGUL JONGSEONG SIOS-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00d7f2: HANGUL JONGSEONG SIOS-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00d7f3: HANGUL JONGSEONG PANSIOS-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7f4: HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7f5: HANGUL JONGSEONG YESIEUNG-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00d7f6: HANGUL JONGSEONG YESIEUNG-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00d7f7: HANGUL JONGSEONG CIEUC-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7f8: HANGUL JONGSEONG CIEUC-SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00d7f9: HANGUL JONGSEONG SSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+00d7fa: HANGUL JONGSEONG PHIEUPH-SIOS*/
+                                           RTUNI_ALPHA, /* U+00d7fb: HANGUL JONGSEONG PHIEUPH-THIEUTH*/
+};
+
+static const uint8_t g_afRTUniFlags0x00f900[] =
+{
+                                           RTUNI_ALPHA, /* U+00f900: CJK COMPATIBILITY IDEOGRAPH-F900*/
+                                           RTUNI_ALPHA, /* U+00f901: CJK COMPATIBILITY IDEOGRAPH-F901*/
+                                           RTUNI_ALPHA, /* U+00f902: CJK COMPATIBILITY IDEOGRAPH-F902*/
+                                           RTUNI_ALPHA, /* U+00f903: CJK COMPATIBILITY IDEOGRAPH-F903*/
+                                           RTUNI_ALPHA, /* U+00f904: CJK COMPATIBILITY IDEOGRAPH-F904*/
+                                           RTUNI_ALPHA, /* U+00f905: CJK COMPATIBILITY IDEOGRAPH-F905*/
+                                           RTUNI_ALPHA, /* U+00f906: CJK COMPATIBILITY IDEOGRAPH-F906*/
+                                           RTUNI_ALPHA, /* U+00f907: CJK COMPATIBILITY IDEOGRAPH-F907*/
+                                           RTUNI_ALPHA, /* U+00f908: CJK COMPATIBILITY IDEOGRAPH-F908*/
+                                           RTUNI_ALPHA, /* U+00f909: CJK COMPATIBILITY IDEOGRAPH-F909*/
+                                           RTUNI_ALPHA, /* U+00f90a: CJK COMPATIBILITY IDEOGRAPH-F90A*/
+                                           RTUNI_ALPHA, /* U+00f90b: CJK COMPATIBILITY IDEOGRAPH-F90B*/
+                                           RTUNI_ALPHA, /* U+00f90c: CJK COMPATIBILITY IDEOGRAPH-F90C*/
+                                           RTUNI_ALPHA, /* U+00f90d: CJK COMPATIBILITY IDEOGRAPH-F90D*/
+                                           RTUNI_ALPHA, /* U+00f90e: CJK COMPATIBILITY IDEOGRAPH-F90E*/
+                                           RTUNI_ALPHA, /* U+00f90f: CJK COMPATIBILITY IDEOGRAPH-F90F*/
+                                           RTUNI_ALPHA, /* U+00f910: CJK COMPATIBILITY IDEOGRAPH-F910*/
+                                           RTUNI_ALPHA, /* U+00f911: CJK COMPATIBILITY IDEOGRAPH-F911*/
+                                           RTUNI_ALPHA, /* U+00f912: CJK COMPATIBILITY IDEOGRAPH-F912*/
+                                           RTUNI_ALPHA, /* U+00f913: CJK COMPATIBILITY IDEOGRAPH-F913*/
+                                           RTUNI_ALPHA, /* U+00f914: CJK COMPATIBILITY IDEOGRAPH-F914*/
+                                           RTUNI_ALPHA, /* U+00f915: CJK COMPATIBILITY IDEOGRAPH-F915*/
+                                           RTUNI_ALPHA, /* U+00f916: CJK COMPATIBILITY IDEOGRAPH-F916*/
+                                           RTUNI_ALPHA, /* U+00f917: CJK COMPATIBILITY IDEOGRAPH-F917*/
+                                           RTUNI_ALPHA, /* U+00f918: CJK COMPATIBILITY IDEOGRAPH-F918*/
+                                           RTUNI_ALPHA, /* U+00f919: CJK COMPATIBILITY IDEOGRAPH-F919*/
+                                           RTUNI_ALPHA, /* U+00f91a: CJK COMPATIBILITY IDEOGRAPH-F91A*/
+                                           RTUNI_ALPHA, /* U+00f91b: CJK COMPATIBILITY IDEOGRAPH-F91B*/
+                                           RTUNI_ALPHA, /* U+00f91c: CJK COMPATIBILITY IDEOGRAPH-F91C*/
+                                           RTUNI_ALPHA, /* U+00f91d: CJK COMPATIBILITY IDEOGRAPH-F91D*/
+                                           RTUNI_ALPHA, /* U+00f91e: CJK COMPATIBILITY IDEOGRAPH-F91E*/
+                                           RTUNI_ALPHA, /* U+00f91f: CJK COMPATIBILITY IDEOGRAPH-F91F*/
+                                           RTUNI_ALPHA, /* U+00f920: CJK COMPATIBILITY IDEOGRAPH-F920*/
+                                           RTUNI_ALPHA, /* U+00f921: CJK COMPATIBILITY IDEOGRAPH-F921*/
+                                           RTUNI_ALPHA, /* U+00f922: CJK COMPATIBILITY IDEOGRAPH-F922*/
+                                           RTUNI_ALPHA, /* U+00f923: CJK COMPATIBILITY IDEOGRAPH-F923*/
+                                           RTUNI_ALPHA, /* U+00f924: CJK COMPATIBILITY IDEOGRAPH-F924*/
+                                           RTUNI_ALPHA, /* U+00f925: CJK COMPATIBILITY IDEOGRAPH-F925*/
+                                           RTUNI_ALPHA, /* U+00f926: CJK COMPATIBILITY IDEOGRAPH-F926*/
+                                           RTUNI_ALPHA, /* U+00f927: CJK COMPATIBILITY IDEOGRAPH-F927*/
+                                           RTUNI_ALPHA, /* U+00f928: CJK COMPATIBILITY IDEOGRAPH-F928*/
+                                           RTUNI_ALPHA, /* U+00f929: CJK COMPATIBILITY IDEOGRAPH-F929*/
+                                           RTUNI_ALPHA, /* U+00f92a: CJK COMPATIBILITY IDEOGRAPH-F92A*/
+                                           RTUNI_ALPHA, /* U+00f92b: CJK COMPATIBILITY IDEOGRAPH-F92B*/
+                                           RTUNI_ALPHA, /* U+00f92c: CJK COMPATIBILITY IDEOGRAPH-F92C*/
+                                           RTUNI_ALPHA, /* U+00f92d: CJK COMPATIBILITY IDEOGRAPH-F92D*/
+                                           RTUNI_ALPHA, /* U+00f92e: CJK COMPATIBILITY IDEOGRAPH-F92E*/
+                                           RTUNI_ALPHA, /* U+00f92f: CJK COMPATIBILITY IDEOGRAPH-F92F*/
+                                           RTUNI_ALPHA, /* U+00f930: CJK COMPATIBILITY IDEOGRAPH-F930*/
+                                           RTUNI_ALPHA, /* U+00f931: CJK COMPATIBILITY IDEOGRAPH-F931*/
+                                           RTUNI_ALPHA, /* U+00f932: CJK COMPATIBILITY IDEOGRAPH-F932*/
+                                           RTUNI_ALPHA, /* U+00f933: CJK COMPATIBILITY IDEOGRAPH-F933*/
+                                           RTUNI_ALPHA, /* U+00f934: CJK COMPATIBILITY IDEOGRAPH-F934*/
+                                           RTUNI_ALPHA, /* U+00f935: CJK COMPATIBILITY IDEOGRAPH-F935*/
+                                           RTUNI_ALPHA, /* U+00f936: CJK COMPATIBILITY IDEOGRAPH-F936*/
+                                           RTUNI_ALPHA, /* U+00f937: CJK COMPATIBILITY IDEOGRAPH-F937*/
+                                           RTUNI_ALPHA, /* U+00f938: CJK COMPATIBILITY IDEOGRAPH-F938*/
+                                           RTUNI_ALPHA, /* U+00f939: CJK COMPATIBILITY IDEOGRAPH-F939*/
+                                           RTUNI_ALPHA, /* U+00f93a: CJK COMPATIBILITY IDEOGRAPH-F93A*/
+                                           RTUNI_ALPHA, /* U+00f93b: CJK COMPATIBILITY IDEOGRAPH-F93B*/
+                                           RTUNI_ALPHA, /* U+00f93c: CJK COMPATIBILITY IDEOGRAPH-F93C*/
+                                           RTUNI_ALPHA, /* U+00f93d: CJK COMPATIBILITY IDEOGRAPH-F93D*/
+                                           RTUNI_ALPHA, /* U+00f93e: CJK COMPATIBILITY IDEOGRAPH-F93E*/
+                                           RTUNI_ALPHA, /* U+00f93f: CJK COMPATIBILITY IDEOGRAPH-F93F*/
+                                           RTUNI_ALPHA, /* U+00f940: CJK COMPATIBILITY IDEOGRAPH-F940*/
+                                           RTUNI_ALPHA, /* U+00f941: CJK COMPATIBILITY IDEOGRAPH-F941*/
+                                           RTUNI_ALPHA, /* U+00f942: CJK COMPATIBILITY IDEOGRAPH-F942*/
+                                           RTUNI_ALPHA, /* U+00f943: CJK COMPATIBILITY IDEOGRAPH-F943*/
+                                           RTUNI_ALPHA, /* U+00f944: CJK COMPATIBILITY IDEOGRAPH-F944*/
+                                           RTUNI_ALPHA, /* U+00f945: CJK COMPATIBILITY IDEOGRAPH-F945*/
+                                           RTUNI_ALPHA, /* U+00f946: CJK COMPATIBILITY IDEOGRAPH-F946*/
+                                           RTUNI_ALPHA, /* U+00f947: CJK COMPATIBILITY IDEOGRAPH-F947*/
+                                           RTUNI_ALPHA, /* U+00f948: CJK COMPATIBILITY IDEOGRAPH-F948*/
+                                           RTUNI_ALPHA, /* U+00f949: CJK COMPATIBILITY IDEOGRAPH-F949*/
+                                           RTUNI_ALPHA, /* U+00f94a: CJK COMPATIBILITY IDEOGRAPH-F94A*/
+                                           RTUNI_ALPHA, /* U+00f94b: CJK COMPATIBILITY IDEOGRAPH-F94B*/
+                                           RTUNI_ALPHA, /* U+00f94c: CJK COMPATIBILITY IDEOGRAPH-F94C*/
+                                           RTUNI_ALPHA, /* U+00f94d: CJK COMPATIBILITY IDEOGRAPH-F94D*/
+                                           RTUNI_ALPHA, /* U+00f94e: CJK COMPATIBILITY IDEOGRAPH-F94E*/
+                                           RTUNI_ALPHA, /* U+00f94f: CJK COMPATIBILITY IDEOGRAPH-F94F*/
+                                           RTUNI_ALPHA, /* U+00f950: CJK COMPATIBILITY IDEOGRAPH-F950*/
+                                           RTUNI_ALPHA, /* U+00f951: CJK COMPATIBILITY IDEOGRAPH-F951*/
+                                           RTUNI_ALPHA, /* U+00f952: CJK COMPATIBILITY IDEOGRAPH-F952*/
+                                           RTUNI_ALPHA, /* U+00f953: CJK COMPATIBILITY IDEOGRAPH-F953*/
+                                           RTUNI_ALPHA, /* U+00f954: CJK COMPATIBILITY IDEOGRAPH-F954*/
+                                           RTUNI_ALPHA, /* U+00f955: CJK COMPATIBILITY IDEOGRAPH-F955*/
+                                           RTUNI_ALPHA, /* U+00f956: CJK COMPATIBILITY IDEOGRAPH-F956*/
+                                           RTUNI_ALPHA, /* U+00f957: CJK COMPATIBILITY IDEOGRAPH-F957*/
+                                           RTUNI_ALPHA, /* U+00f958: CJK COMPATIBILITY IDEOGRAPH-F958*/
+                                           RTUNI_ALPHA, /* U+00f959: CJK COMPATIBILITY IDEOGRAPH-F959*/
+                                           RTUNI_ALPHA, /* U+00f95a: CJK COMPATIBILITY IDEOGRAPH-F95A*/
+                                           RTUNI_ALPHA, /* U+00f95b: CJK COMPATIBILITY IDEOGRAPH-F95B*/
+                                           RTUNI_ALPHA, /* U+00f95c: CJK COMPATIBILITY IDEOGRAPH-F95C*/
+                                           RTUNI_ALPHA, /* U+00f95d: CJK COMPATIBILITY IDEOGRAPH-F95D*/
+                                           RTUNI_ALPHA, /* U+00f95e: CJK COMPATIBILITY IDEOGRAPH-F95E*/
+                                           RTUNI_ALPHA, /* U+00f95f: CJK COMPATIBILITY IDEOGRAPH-F95F*/
+                                           RTUNI_ALPHA, /* U+00f960: CJK COMPATIBILITY IDEOGRAPH-F960*/
+                                           RTUNI_ALPHA, /* U+00f961: CJK COMPATIBILITY IDEOGRAPH-F961*/
+                                           RTUNI_ALPHA, /* U+00f962: CJK COMPATIBILITY IDEOGRAPH-F962*/
+                                           RTUNI_ALPHA, /* U+00f963: CJK COMPATIBILITY IDEOGRAPH-F963*/
+                                           RTUNI_ALPHA, /* U+00f964: CJK COMPATIBILITY IDEOGRAPH-F964*/
+                                           RTUNI_ALPHA, /* U+00f965: CJK COMPATIBILITY IDEOGRAPH-F965*/
+                                           RTUNI_ALPHA, /* U+00f966: CJK COMPATIBILITY IDEOGRAPH-F966*/
+                                           RTUNI_ALPHA, /* U+00f967: CJK COMPATIBILITY IDEOGRAPH-F967*/
+                                           RTUNI_ALPHA, /* U+00f968: CJK COMPATIBILITY IDEOGRAPH-F968*/
+                                           RTUNI_ALPHA, /* U+00f969: CJK COMPATIBILITY IDEOGRAPH-F969*/
+                                           RTUNI_ALPHA, /* U+00f96a: CJK COMPATIBILITY IDEOGRAPH-F96A*/
+                                           RTUNI_ALPHA, /* U+00f96b: CJK COMPATIBILITY IDEOGRAPH-F96B*/
+                                           RTUNI_ALPHA, /* U+00f96c: CJK COMPATIBILITY IDEOGRAPH-F96C*/
+                                           RTUNI_ALPHA, /* U+00f96d: CJK COMPATIBILITY IDEOGRAPH-F96D*/
+                                           RTUNI_ALPHA, /* U+00f96e: CJK COMPATIBILITY IDEOGRAPH-F96E*/
+                                           RTUNI_ALPHA, /* U+00f96f: CJK COMPATIBILITY IDEOGRAPH-F96F*/
+                                           RTUNI_ALPHA, /* U+00f970: CJK COMPATIBILITY IDEOGRAPH-F970*/
+                                           RTUNI_ALPHA, /* U+00f971: CJK COMPATIBILITY IDEOGRAPH-F971*/
+                                           RTUNI_ALPHA, /* U+00f972: CJK COMPATIBILITY IDEOGRAPH-F972*/
+                                           RTUNI_ALPHA, /* U+00f973: CJK COMPATIBILITY IDEOGRAPH-F973*/
+                                           RTUNI_ALPHA, /* U+00f974: CJK COMPATIBILITY IDEOGRAPH-F974*/
+                                           RTUNI_ALPHA, /* U+00f975: CJK COMPATIBILITY IDEOGRAPH-F975*/
+                                           RTUNI_ALPHA, /* U+00f976: CJK COMPATIBILITY IDEOGRAPH-F976*/
+                                           RTUNI_ALPHA, /* U+00f977: CJK COMPATIBILITY IDEOGRAPH-F977*/
+                                           RTUNI_ALPHA, /* U+00f978: CJK COMPATIBILITY IDEOGRAPH-F978*/
+                                           RTUNI_ALPHA, /* U+00f979: CJK COMPATIBILITY IDEOGRAPH-F979*/
+                                           RTUNI_ALPHA, /* U+00f97a: CJK COMPATIBILITY IDEOGRAPH-F97A*/
+                                           RTUNI_ALPHA, /* U+00f97b: CJK COMPATIBILITY IDEOGRAPH-F97B*/
+                                           RTUNI_ALPHA, /* U+00f97c: CJK COMPATIBILITY IDEOGRAPH-F97C*/
+                                           RTUNI_ALPHA, /* U+00f97d: CJK COMPATIBILITY IDEOGRAPH-F97D*/
+                                           RTUNI_ALPHA, /* U+00f97e: CJK COMPATIBILITY IDEOGRAPH-F97E*/
+                                           RTUNI_ALPHA, /* U+00f97f: CJK COMPATIBILITY IDEOGRAPH-F97F*/
+                                           RTUNI_ALPHA, /* U+00f980: CJK COMPATIBILITY IDEOGRAPH-F980*/
+                                           RTUNI_ALPHA, /* U+00f981: CJK COMPATIBILITY IDEOGRAPH-F981*/
+                                           RTUNI_ALPHA, /* U+00f982: CJK COMPATIBILITY IDEOGRAPH-F982*/
+                                           RTUNI_ALPHA, /* U+00f983: CJK COMPATIBILITY IDEOGRAPH-F983*/
+                                           RTUNI_ALPHA, /* U+00f984: CJK COMPATIBILITY IDEOGRAPH-F984*/
+                                           RTUNI_ALPHA, /* U+00f985: CJK COMPATIBILITY IDEOGRAPH-F985*/
+                                           RTUNI_ALPHA, /* U+00f986: CJK COMPATIBILITY IDEOGRAPH-F986*/
+                                           RTUNI_ALPHA, /* U+00f987: CJK COMPATIBILITY IDEOGRAPH-F987*/
+                                           RTUNI_ALPHA, /* U+00f988: CJK COMPATIBILITY IDEOGRAPH-F988*/
+                                           RTUNI_ALPHA, /* U+00f989: CJK COMPATIBILITY IDEOGRAPH-F989*/
+                                           RTUNI_ALPHA, /* U+00f98a: CJK COMPATIBILITY IDEOGRAPH-F98A*/
+                                           RTUNI_ALPHA, /* U+00f98b: CJK COMPATIBILITY IDEOGRAPH-F98B*/
+                                           RTUNI_ALPHA, /* U+00f98c: CJK COMPATIBILITY IDEOGRAPH-F98C*/
+                                           RTUNI_ALPHA, /* U+00f98d: CJK COMPATIBILITY IDEOGRAPH-F98D*/
+                                           RTUNI_ALPHA, /* U+00f98e: CJK COMPATIBILITY IDEOGRAPH-F98E*/
+                                           RTUNI_ALPHA, /* U+00f98f: CJK COMPATIBILITY IDEOGRAPH-F98F*/
+                                           RTUNI_ALPHA, /* U+00f990: CJK COMPATIBILITY IDEOGRAPH-F990*/
+                                           RTUNI_ALPHA, /* U+00f991: CJK COMPATIBILITY IDEOGRAPH-F991*/
+                                           RTUNI_ALPHA, /* U+00f992: CJK COMPATIBILITY IDEOGRAPH-F992*/
+                                           RTUNI_ALPHA, /* U+00f993: CJK COMPATIBILITY IDEOGRAPH-F993*/
+                                           RTUNI_ALPHA, /* U+00f994: CJK COMPATIBILITY IDEOGRAPH-F994*/
+                                           RTUNI_ALPHA, /* U+00f995: CJK COMPATIBILITY IDEOGRAPH-F995*/
+                                           RTUNI_ALPHA, /* U+00f996: CJK COMPATIBILITY IDEOGRAPH-F996*/
+                                           RTUNI_ALPHA, /* U+00f997: CJK COMPATIBILITY IDEOGRAPH-F997*/
+                                           RTUNI_ALPHA, /* U+00f998: CJK COMPATIBILITY IDEOGRAPH-F998*/
+                                           RTUNI_ALPHA, /* U+00f999: CJK COMPATIBILITY IDEOGRAPH-F999*/
+                                           RTUNI_ALPHA, /* U+00f99a: CJK COMPATIBILITY IDEOGRAPH-F99A*/
+                                           RTUNI_ALPHA, /* U+00f99b: CJK COMPATIBILITY IDEOGRAPH-F99B*/
+                                           RTUNI_ALPHA, /* U+00f99c: CJK COMPATIBILITY IDEOGRAPH-F99C*/
+                                           RTUNI_ALPHA, /* U+00f99d: CJK COMPATIBILITY IDEOGRAPH-F99D*/
+                                           RTUNI_ALPHA, /* U+00f99e: CJK COMPATIBILITY IDEOGRAPH-F99E*/
+                                           RTUNI_ALPHA, /* U+00f99f: CJK COMPATIBILITY IDEOGRAPH-F99F*/
+                                           RTUNI_ALPHA, /* U+00f9a0: CJK COMPATIBILITY IDEOGRAPH-F9A0*/
+                                           RTUNI_ALPHA, /* U+00f9a1: CJK COMPATIBILITY IDEOGRAPH-F9A1*/
+                                           RTUNI_ALPHA, /* U+00f9a2: CJK COMPATIBILITY IDEOGRAPH-F9A2*/
+                                           RTUNI_ALPHA, /* U+00f9a3: CJK COMPATIBILITY IDEOGRAPH-F9A3*/
+                                           RTUNI_ALPHA, /* U+00f9a4: CJK COMPATIBILITY IDEOGRAPH-F9A4*/
+                                           RTUNI_ALPHA, /* U+00f9a5: CJK COMPATIBILITY IDEOGRAPH-F9A5*/
+                                           RTUNI_ALPHA, /* U+00f9a6: CJK COMPATIBILITY IDEOGRAPH-F9A6*/
+                                           RTUNI_ALPHA, /* U+00f9a7: CJK COMPATIBILITY IDEOGRAPH-F9A7*/
+                                           RTUNI_ALPHA, /* U+00f9a8: CJK COMPATIBILITY IDEOGRAPH-F9A8*/
+                                           RTUNI_ALPHA, /* U+00f9a9: CJK COMPATIBILITY IDEOGRAPH-F9A9*/
+                                           RTUNI_ALPHA, /* U+00f9aa: CJK COMPATIBILITY IDEOGRAPH-F9AA*/
+                                           RTUNI_ALPHA, /* U+00f9ab: CJK COMPATIBILITY IDEOGRAPH-F9AB*/
+                                           RTUNI_ALPHA, /* U+00f9ac: CJK COMPATIBILITY IDEOGRAPH-F9AC*/
+                                           RTUNI_ALPHA, /* U+00f9ad: CJK COMPATIBILITY IDEOGRAPH-F9AD*/
+                                           RTUNI_ALPHA, /* U+00f9ae: CJK COMPATIBILITY IDEOGRAPH-F9AE*/
+                                           RTUNI_ALPHA, /* U+00f9af: CJK COMPATIBILITY IDEOGRAPH-F9AF*/
+                                           RTUNI_ALPHA, /* U+00f9b0: CJK COMPATIBILITY IDEOGRAPH-F9B0*/
+                                           RTUNI_ALPHA, /* U+00f9b1: CJK COMPATIBILITY IDEOGRAPH-F9B1*/
+                                           RTUNI_ALPHA, /* U+00f9b2: CJK COMPATIBILITY IDEOGRAPH-F9B2*/
+                                           RTUNI_ALPHA, /* U+00f9b3: CJK COMPATIBILITY IDEOGRAPH-F9B3*/
+                                           RTUNI_ALPHA, /* U+00f9b4: CJK COMPATIBILITY IDEOGRAPH-F9B4*/
+                                           RTUNI_ALPHA, /* U+00f9b5: CJK COMPATIBILITY IDEOGRAPH-F9B5*/
+                                           RTUNI_ALPHA, /* U+00f9b6: CJK COMPATIBILITY IDEOGRAPH-F9B6*/
+                                           RTUNI_ALPHA, /* U+00f9b7: CJK COMPATIBILITY IDEOGRAPH-F9B7*/
+                                           RTUNI_ALPHA, /* U+00f9b8: CJK COMPATIBILITY IDEOGRAPH-F9B8*/
+                                           RTUNI_ALPHA, /* U+00f9b9: CJK COMPATIBILITY IDEOGRAPH-F9B9*/
+                                           RTUNI_ALPHA, /* U+00f9ba: CJK COMPATIBILITY IDEOGRAPH-F9BA*/
+                                           RTUNI_ALPHA, /* U+00f9bb: CJK COMPATIBILITY IDEOGRAPH-F9BB*/
+                                           RTUNI_ALPHA, /* U+00f9bc: CJK COMPATIBILITY IDEOGRAPH-F9BC*/
+                                           RTUNI_ALPHA, /* U+00f9bd: CJK COMPATIBILITY IDEOGRAPH-F9BD*/
+                                           RTUNI_ALPHA, /* U+00f9be: CJK COMPATIBILITY IDEOGRAPH-F9BE*/
+                                           RTUNI_ALPHA, /* U+00f9bf: CJK COMPATIBILITY IDEOGRAPH-F9BF*/
+                                           RTUNI_ALPHA, /* U+00f9c0: CJK COMPATIBILITY IDEOGRAPH-F9C0*/
+                                           RTUNI_ALPHA, /* U+00f9c1: CJK COMPATIBILITY IDEOGRAPH-F9C1*/
+                                           RTUNI_ALPHA, /* U+00f9c2: CJK COMPATIBILITY IDEOGRAPH-F9C2*/
+                                           RTUNI_ALPHA, /* U+00f9c3: CJK COMPATIBILITY IDEOGRAPH-F9C3*/
+                                           RTUNI_ALPHA, /* U+00f9c4: CJK COMPATIBILITY IDEOGRAPH-F9C4*/
+                                           RTUNI_ALPHA, /* U+00f9c5: CJK COMPATIBILITY IDEOGRAPH-F9C5*/
+                                           RTUNI_ALPHA, /* U+00f9c6: CJK COMPATIBILITY IDEOGRAPH-F9C6*/
+                                           RTUNI_ALPHA, /* U+00f9c7: CJK COMPATIBILITY IDEOGRAPH-F9C7*/
+                                           RTUNI_ALPHA, /* U+00f9c8: CJK COMPATIBILITY IDEOGRAPH-F9C8*/
+                                           RTUNI_ALPHA, /* U+00f9c9: CJK COMPATIBILITY IDEOGRAPH-F9C9*/
+                                           RTUNI_ALPHA, /* U+00f9ca: CJK COMPATIBILITY IDEOGRAPH-F9CA*/
+                                           RTUNI_ALPHA, /* U+00f9cb: CJK COMPATIBILITY IDEOGRAPH-F9CB*/
+                                           RTUNI_ALPHA, /* U+00f9cc: CJK COMPATIBILITY IDEOGRAPH-F9CC*/
+                                           RTUNI_ALPHA, /* U+00f9cd: CJK COMPATIBILITY IDEOGRAPH-F9CD*/
+                                           RTUNI_ALPHA, /* U+00f9ce: CJK COMPATIBILITY IDEOGRAPH-F9CE*/
+                                           RTUNI_ALPHA, /* U+00f9cf: CJK COMPATIBILITY IDEOGRAPH-F9CF*/
+                                           RTUNI_ALPHA, /* U+00f9d0: CJK COMPATIBILITY IDEOGRAPH-F9D0*/
+                                           RTUNI_ALPHA, /* U+00f9d1: CJK COMPATIBILITY IDEOGRAPH-F9D1*/
+                                           RTUNI_ALPHA, /* U+00f9d2: CJK COMPATIBILITY IDEOGRAPH-F9D2*/
+                                           RTUNI_ALPHA, /* U+00f9d3: CJK COMPATIBILITY IDEOGRAPH-F9D3*/
+                                           RTUNI_ALPHA, /* U+00f9d4: CJK COMPATIBILITY IDEOGRAPH-F9D4*/
+                                           RTUNI_ALPHA, /* U+00f9d5: CJK COMPATIBILITY IDEOGRAPH-F9D5*/
+                                           RTUNI_ALPHA, /* U+00f9d6: CJK COMPATIBILITY IDEOGRAPH-F9D6*/
+                                           RTUNI_ALPHA, /* U+00f9d7: CJK COMPATIBILITY IDEOGRAPH-F9D7*/
+                                           RTUNI_ALPHA, /* U+00f9d8: CJK COMPATIBILITY IDEOGRAPH-F9D8*/
+                                           RTUNI_ALPHA, /* U+00f9d9: CJK COMPATIBILITY IDEOGRAPH-F9D9*/
+                                           RTUNI_ALPHA, /* U+00f9da: CJK COMPATIBILITY IDEOGRAPH-F9DA*/
+                                           RTUNI_ALPHA, /* U+00f9db: CJK COMPATIBILITY IDEOGRAPH-F9DB*/
+                                           RTUNI_ALPHA, /* U+00f9dc: CJK COMPATIBILITY IDEOGRAPH-F9DC*/
+                                           RTUNI_ALPHA, /* U+00f9dd: CJK COMPATIBILITY IDEOGRAPH-F9DD*/
+                                           RTUNI_ALPHA, /* U+00f9de: CJK COMPATIBILITY IDEOGRAPH-F9DE*/
+                                           RTUNI_ALPHA, /* U+00f9df: CJK COMPATIBILITY IDEOGRAPH-F9DF*/
+                                           RTUNI_ALPHA, /* U+00f9e0: CJK COMPATIBILITY IDEOGRAPH-F9E0*/
+                                           RTUNI_ALPHA, /* U+00f9e1: CJK COMPATIBILITY IDEOGRAPH-F9E1*/
+                                           RTUNI_ALPHA, /* U+00f9e2: CJK COMPATIBILITY IDEOGRAPH-F9E2*/
+                                           RTUNI_ALPHA, /* U+00f9e3: CJK COMPATIBILITY IDEOGRAPH-F9E3*/
+                                           RTUNI_ALPHA, /* U+00f9e4: CJK COMPATIBILITY IDEOGRAPH-F9E4*/
+                                           RTUNI_ALPHA, /* U+00f9e5: CJK COMPATIBILITY IDEOGRAPH-F9E5*/
+                                           RTUNI_ALPHA, /* U+00f9e6: CJK COMPATIBILITY IDEOGRAPH-F9E6*/
+                                           RTUNI_ALPHA, /* U+00f9e7: CJK COMPATIBILITY IDEOGRAPH-F9E7*/
+                                           RTUNI_ALPHA, /* U+00f9e8: CJK COMPATIBILITY IDEOGRAPH-F9E8*/
+                                           RTUNI_ALPHA, /* U+00f9e9: CJK COMPATIBILITY IDEOGRAPH-F9E9*/
+                                           RTUNI_ALPHA, /* U+00f9ea: CJK COMPATIBILITY IDEOGRAPH-F9EA*/
+                                           RTUNI_ALPHA, /* U+00f9eb: CJK COMPATIBILITY IDEOGRAPH-F9EB*/
+                                           RTUNI_ALPHA, /* U+00f9ec: CJK COMPATIBILITY IDEOGRAPH-F9EC*/
+                                           RTUNI_ALPHA, /* U+00f9ed: CJK COMPATIBILITY IDEOGRAPH-F9ED*/
+                                           RTUNI_ALPHA, /* U+00f9ee: CJK COMPATIBILITY IDEOGRAPH-F9EE*/
+                                           RTUNI_ALPHA, /* U+00f9ef: CJK COMPATIBILITY IDEOGRAPH-F9EF*/
+                                           RTUNI_ALPHA, /* U+00f9f0: CJK COMPATIBILITY IDEOGRAPH-F9F0*/
+                                           RTUNI_ALPHA, /* U+00f9f1: CJK COMPATIBILITY IDEOGRAPH-F9F1*/
+                                           RTUNI_ALPHA, /* U+00f9f2: CJK COMPATIBILITY IDEOGRAPH-F9F2*/
+                                           RTUNI_ALPHA, /* U+00f9f3: CJK COMPATIBILITY IDEOGRAPH-F9F3*/
+                                           RTUNI_ALPHA, /* U+00f9f4: CJK COMPATIBILITY IDEOGRAPH-F9F4*/
+                                           RTUNI_ALPHA, /* U+00f9f5: CJK COMPATIBILITY IDEOGRAPH-F9F5*/
+                                           RTUNI_ALPHA, /* U+00f9f6: CJK COMPATIBILITY IDEOGRAPH-F9F6*/
+                                           RTUNI_ALPHA, /* U+00f9f7: CJK COMPATIBILITY IDEOGRAPH-F9F7*/
+                                           RTUNI_ALPHA, /* U+00f9f8: CJK COMPATIBILITY IDEOGRAPH-F9F8*/
+                                           RTUNI_ALPHA, /* U+00f9f9: CJK COMPATIBILITY IDEOGRAPH-F9F9*/
+                                           RTUNI_ALPHA, /* U+00f9fa: CJK COMPATIBILITY IDEOGRAPH-F9FA*/
+                                           RTUNI_ALPHA, /* U+00f9fb: CJK COMPATIBILITY IDEOGRAPH-F9FB*/
+                                           RTUNI_ALPHA, /* U+00f9fc: CJK COMPATIBILITY IDEOGRAPH-F9FC*/
+                                           RTUNI_ALPHA, /* U+00f9fd: CJK COMPATIBILITY IDEOGRAPH-F9FD*/
+                                           RTUNI_ALPHA, /* U+00f9fe: CJK COMPATIBILITY IDEOGRAPH-F9FE*/
+                                           RTUNI_ALPHA, /* U+00f9ff: CJK COMPATIBILITY IDEOGRAPH-F9FF*/
+                                           RTUNI_ALPHA, /* U+00fa00: CJK COMPATIBILITY IDEOGRAPH-FA00*/
+                                           RTUNI_ALPHA, /* U+00fa01: CJK COMPATIBILITY IDEOGRAPH-FA01*/
+                                           RTUNI_ALPHA, /* U+00fa02: CJK COMPATIBILITY IDEOGRAPH-FA02*/
+                                           RTUNI_ALPHA, /* U+00fa03: CJK COMPATIBILITY IDEOGRAPH-FA03*/
+                                           RTUNI_ALPHA, /* U+00fa04: CJK COMPATIBILITY IDEOGRAPH-FA04*/
+                                           RTUNI_ALPHA, /* U+00fa05: CJK COMPATIBILITY IDEOGRAPH-FA05*/
+                                           RTUNI_ALPHA, /* U+00fa06: CJK COMPATIBILITY IDEOGRAPH-FA06*/
+                                           RTUNI_ALPHA, /* U+00fa07: CJK COMPATIBILITY IDEOGRAPH-FA07*/
+                                           RTUNI_ALPHA, /* U+00fa08: CJK COMPATIBILITY IDEOGRAPH-FA08*/
+                                           RTUNI_ALPHA, /* U+00fa09: CJK COMPATIBILITY IDEOGRAPH-FA09*/
+                                           RTUNI_ALPHA, /* U+00fa0a: CJK COMPATIBILITY IDEOGRAPH-FA0A*/
+                                           RTUNI_ALPHA, /* U+00fa0b: CJK COMPATIBILITY IDEOGRAPH-FA0B*/
+                                           RTUNI_ALPHA, /* U+00fa0c: CJK COMPATIBILITY IDEOGRAPH-FA0C*/
+                                           RTUNI_ALPHA, /* U+00fa0d: CJK COMPATIBILITY IDEOGRAPH-FA0D*/
+                                           RTUNI_ALPHA, /* U+00fa0e: CJK COMPATIBILITY IDEOGRAPH-FA0E*/
+                                           RTUNI_ALPHA, /* U+00fa0f: CJK COMPATIBILITY IDEOGRAPH-FA0F*/
+                                           RTUNI_ALPHA, /* U+00fa10: CJK COMPATIBILITY IDEOGRAPH-FA10*/
+                                           RTUNI_ALPHA, /* U+00fa11: CJK COMPATIBILITY IDEOGRAPH-FA11*/
+                                           RTUNI_ALPHA, /* U+00fa12: CJK COMPATIBILITY IDEOGRAPH-FA12*/
+                                           RTUNI_ALPHA, /* U+00fa13: CJK COMPATIBILITY IDEOGRAPH-FA13*/
+                                           RTUNI_ALPHA, /* U+00fa14: CJK COMPATIBILITY IDEOGRAPH-FA14*/
+                                           RTUNI_ALPHA, /* U+00fa15: CJK COMPATIBILITY IDEOGRAPH-FA15*/
+                                           RTUNI_ALPHA, /* U+00fa16: CJK COMPATIBILITY IDEOGRAPH-FA16*/
+                                           RTUNI_ALPHA, /* U+00fa17: CJK COMPATIBILITY IDEOGRAPH-FA17*/
+                                           RTUNI_ALPHA, /* U+00fa18: CJK COMPATIBILITY IDEOGRAPH-FA18*/
+                                           RTUNI_ALPHA, /* U+00fa19: CJK COMPATIBILITY IDEOGRAPH-FA19*/
+                                           RTUNI_ALPHA, /* U+00fa1a: CJK COMPATIBILITY IDEOGRAPH-FA1A*/
+                                           RTUNI_ALPHA, /* U+00fa1b: CJK COMPATIBILITY IDEOGRAPH-FA1B*/
+                                           RTUNI_ALPHA, /* U+00fa1c: CJK COMPATIBILITY IDEOGRAPH-FA1C*/
+                                           RTUNI_ALPHA, /* U+00fa1d: CJK COMPATIBILITY IDEOGRAPH-FA1D*/
+                                           RTUNI_ALPHA, /* U+00fa1e: CJK COMPATIBILITY IDEOGRAPH-FA1E*/
+                                           RTUNI_ALPHA, /* U+00fa1f: CJK COMPATIBILITY IDEOGRAPH-FA1F*/
+                                           RTUNI_ALPHA, /* U+00fa20: CJK COMPATIBILITY IDEOGRAPH-FA20*/
+                                           RTUNI_ALPHA, /* U+00fa21: CJK COMPATIBILITY IDEOGRAPH-FA21*/
+                                           RTUNI_ALPHA, /* U+00fa22: CJK COMPATIBILITY IDEOGRAPH-FA22*/
+                                           RTUNI_ALPHA, /* U+00fa23: CJK COMPATIBILITY IDEOGRAPH-FA23*/
+                                           RTUNI_ALPHA, /* U+00fa24: CJK COMPATIBILITY IDEOGRAPH-FA24*/
+                                           RTUNI_ALPHA, /* U+00fa25: CJK COMPATIBILITY IDEOGRAPH-FA25*/
+                                           RTUNI_ALPHA, /* U+00fa26: CJK COMPATIBILITY IDEOGRAPH-FA26*/
+                                           RTUNI_ALPHA, /* U+00fa27: CJK COMPATIBILITY IDEOGRAPH-FA27*/
+                                           RTUNI_ALPHA, /* U+00fa28: CJK COMPATIBILITY IDEOGRAPH-FA28*/
+                                           RTUNI_ALPHA, /* U+00fa29: CJK COMPATIBILITY IDEOGRAPH-FA29*/
+                                           RTUNI_ALPHA, /* U+00fa2a: CJK COMPATIBILITY IDEOGRAPH-FA2A*/
+                                           RTUNI_ALPHA, /* U+00fa2b: CJK COMPATIBILITY IDEOGRAPH-FA2B*/
+                                           RTUNI_ALPHA, /* U+00fa2c: CJK COMPATIBILITY IDEOGRAPH-FA2C*/
+                                           RTUNI_ALPHA, /* U+00fa2d: CJK COMPATIBILITY IDEOGRAPH-FA2D*/
+                                           RTUNI_ALPHA, /* U+00fa2e: CJK COMPATIBILITY IDEOGRAPH-FA2E*/
+                                           RTUNI_ALPHA, /* U+00fa2f: CJK COMPATIBILITY IDEOGRAPH-FA2F*/
+                                           RTUNI_ALPHA, /* U+00fa30: CJK COMPATIBILITY IDEOGRAPH-FA30*/
+                                           RTUNI_ALPHA, /* U+00fa31: CJK COMPATIBILITY IDEOGRAPH-FA31*/
+                                           RTUNI_ALPHA, /* U+00fa32: CJK COMPATIBILITY IDEOGRAPH-FA32*/
+                                           RTUNI_ALPHA, /* U+00fa33: CJK COMPATIBILITY IDEOGRAPH-FA33*/
+                                           RTUNI_ALPHA, /* U+00fa34: CJK COMPATIBILITY IDEOGRAPH-FA34*/
+                                           RTUNI_ALPHA, /* U+00fa35: CJK COMPATIBILITY IDEOGRAPH-FA35*/
+                                           RTUNI_ALPHA, /* U+00fa36: CJK COMPATIBILITY IDEOGRAPH-FA36*/
+                                           RTUNI_ALPHA, /* U+00fa37: CJK COMPATIBILITY IDEOGRAPH-FA37*/
+                                           RTUNI_ALPHA, /* U+00fa38: CJK COMPATIBILITY IDEOGRAPH-FA38*/
+                                           RTUNI_ALPHA, /* U+00fa39: CJK COMPATIBILITY IDEOGRAPH-FA39*/
+                                           RTUNI_ALPHA, /* U+00fa3a: CJK COMPATIBILITY IDEOGRAPH-FA3A*/
+                                           RTUNI_ALPHA, /* U+00fa3b: CJK COMPATIBILITY IDEOGRAPH-FA3B*/
+                                           RTUNI_ALPHA, /* U+00fa3c: CJK COMPATIBILITY IDEOGRAPH-FA3C*/
+                                           RTUNI_ALPHA, /* U+00fa3d: CJK COMPATIBILITY IDEOGRAPH-FA3D*/
+                                           RTUNI_ALPHA, /* U+00fa3e: CJK COMPATIBILITY IDEOGRAPH-FA3E*/
+                                           RTUNI_ALPHA, /* U+00fa3f: CJK COMPATIBILITY IDEOGRAPH-FA3F*/
+                                           RTUNI_ALPHA, /* U+00fa40: CJK COMPATIBILITY IDEOGRAPH-FA40*/
+                                           RTUNI_ALPHA, /* U+00fa41: CJK COMPATIBILITY IDEOGRAPH-FA41*/
+                                           RTUNI_ALPHA, /* U+00fa42: CJK COMPATIBILITY IDEOGRAPH-FA42*/
+                                           RTUNI_ALPHA, /* U+00fa43: CJK COMPATIBILITY IDEOGRAPH-FA43*/
+                                           RTUNI_ALPHA, /* U+00fa44: CJK COMPATIBILITY IDEOGRAPH-FA44*/
+                                           RTUNI_ALPHA, /* U+00fa45: CJK COMPATIBILITY IDEOGRAPH-FA45*/
+                                           RTUNI_ALPHA, /* U+00fa46: CJK COMPATIBILITY IDEOGRAPH-FA46*/
+                                           RTUNI_ALPHA, /* U+00fa47: CJK COMPATIBILITY IDEOGRAPH-FA47*/
+                                           RTUNI_ALPHA, /* U+00fa48: CJK COMPATIBILITY IDEOGRAPH-FA48*/
+                                           RTUNI_ALPHA, /* U+00fa49: CJK COMPATIBILITY IDEOGRAPH-FA49*/
+                                           RTUNI_ALPHA, /* U+00fa4a: CJK COMPATIBILITY IDEOGRAPH-FA4A*/
+                                           RTUNI_ALPHA, /* U+00fa4b: CJK COMPATIBILITY IDEOGRAPH-FA4B*/
+                                           RTUNI_ALPHA, /* U+00fa4c: CJK COMPATIBILITY IDEOGRAPH-FA4C*/
+                                           RTUNI_ALPHA, /* U+00fa4d: CJK COMPATIBILITY IDEOGRAPH-FA4D*/
+                                           RTUNI_ALPHA, /* U+00fa4e: CJK COMPATIBILITY IDEOGRAPH-FA4E*/
+                                           RTUNI_ALPHA, /* U+00fa4f: CJK COMPATIBILITY IDEOGRAPH-FA4F*/
+                                           RTUNI_ALPHA, /* U+00fa50: CJK COMPATIBILITY IDEOGRAPH-FA50*/
+                                           RTUNI_ALPHA, /* U+00fa51: CJK COMPATIBILITY IDEOGRAPH-FA51*/
+                                           RTUNI_ALPHA, /* U+00fa52: CJK COMPATIBILITY IDEOGRAPH-FA52*/
+                                           RTUNI_ALPHA, /* U+00fa53: CJK COMPATIBILITY IDEOGRAPH-FA53*/
+                                           RTUNI_ALPHA, /* U+00fa54: CJK COMPATIBILITY IDEOGRAPH-FA54*/
+                                           RTUNI_ALPHA, /* U+00fa55: CJK COMPATIBILITY IDEOGRAPH-FA55*/
+                                           RTUNI_ALPHA, /* U+00fa56: CJK COMPATIBILITY IDEOGRAPH-FA56*/
+                                           RTUNI_ALPHA, /* U+00fa57: CJK COMPATIBILITY IDEOGRAPH-FA57*/
+                                           RTUNI_ALPHA, /* U+00fa58: CJK COMPATIBILITY IDEOGRAPH-FA58*/
+                                           RTUNI_ALPHA, /* U+00fa59: CJK COMPATIBILITY IDEOGRAPH-FA59*/
+                                           RTUNI_ALPHA, /* U+00fa5a: CJK COMPATIBILITY IDEOGRAPH-FA5A*/
+                                           RTUNI_ALPHA, /* U+00fa5b: CJK COMPATIBILITY IDEOGRAPH-FA5B*/
+                                           RTUNI_ALPHA, /* U+00fa5c: CJK COMPATIBILITY IDEOGRAPH-FA5C*/
+                                           RTUNI_ALPHA, /* U+00fa5d: CJK COMPATIBILITY IDEOGRAPH-FA5D*/
+                                           RTUNI_ALPHA, /* U+00fa5e: CJK COMPATIBILITY IDEOGRAPH-FA5E*/
+                                           RTUNI_ALPHA, /* U+00fa5f: CJK COMPATIBILITY IDEOGRAPH-FA5F*/
+                                           RTUNI_ALPHA, /* U+00fa60: CJK COMPATIBILITY IDEOGRAPH-FA60*/
+                                           RTUNI_ALPHA, /* U+00fa61: CJK COMPATIBILITY IDEOGRAPH-FA61*/
+                                           RTUNI_ALPHA, /* U+00fa62: CJK COMPATIBILITY IDEOGRAPH-FA62*/
+                                           RTUNI_ALPHA, /* U+00fa63: CJK COMPATIBILITY IDEOGRAPH-FA63*/
+                                           RTUNI_ALPHA, /* U+00fa64: CJK COMPATIBILITY IDEOGRAPH-FA64*/
+                                           RTUNI_ALPHA, /* U+00fa65: CJK COMPATIBILITY IDEOGRAPH-FA65*/
+                                           RTUNI_ALPHA, /* U+00fa66: CJK COMPATIBILITY IDEOGRAPH-FA66*/
+                                           RTUNI_ALPHA, /* U+00fa67: CJK COMPATIBILITY IDEOGRAPH-FA67*/
+                                           RTUNI_ALPHA, /* U+00fa68: CJK COMPATIBILITY IDEOGRAPH-FA68*/
+                                           RTUNI_ALPHA, /* U+00fa69: CJK COMPATIBILITY IDEOGRAPH-FA69*/
+                                           RTUNI_ALPHA, /* U+00fa6a: CJK COMPATIBILITY IDEOGRAPH-FA6A*/
+                                           RTUNI_ALPHA, /* U+00fa6b: CJK COMPATIBILITY IDEOGRAPH-FA6B*/
+                                           RTUNI_ALPHA, /* U+00fa6c: CJK COMPATIBILITY IDEOGRAPH-FA6C*/
+                                           RTUNI_ALPHA, /* U+00fa6d: CJK COMPATIBILITY IDEOGRAPH-FA6D*/
+                                                     0, /* U+00fa6e: */
+                                                     0, /* U+00fa6f: */
+                                           RTUNI_ALPHA, /* U+00fa70: CJK COMPATIBILITY IDEOGRAPH-FA70*/
+                                           RTUNI_ALPHA, /* U+00fa71: CJK COMPATIBILITY IDEOGRAPH-FA71*/
+                                           RTUNI_ALPHA, /* U+00fa72: CJK COMPATIBILITY IDEOGRAPH-FA72*/
+                                           RTUNI_ALPHA, /* U+00fa73: CJK COMPATIBILITY IDEOGRAPH-FA73*/
+                                           RTUNI_ALPHA, /* U+00fa74: CJK COMPATIBILITY IDEOGRAPH-FA74*/
+                                           RTUNI_ALPHA, /* U+00fa75: CJK COMPATIBILITY IDEOGRAPH-FA75*/
+                                           RTUNI_ALPHA, /* U+00fa76: CJK COMPATIBILITY IDEOGRAPH-FA76*/
+                                           RTUNI_ALPHA, /* U+00fa77: CJK COMPATIBILITY IDEOGRAPH-FA77*/
+                                           RTUNI_ALPHA, /* U+00fa78: CJK COMPATIBILITY IDEOGRAPH-FA78*/
+                                           RTUNI_ALPHA, /* U+00fa79: CJK COMPATIBILITY IDEOGRAPH-FA79*/
+                                           RTUNI_ALPHA, /* U+00fa7a: CJK COMPATIBILITY IDEOGRAPH-FA7A*/
+                                           RTUNI_ALPHA, /* U+00fa7b: CJK COMPATIBILITY IDEOGRAPH-FA7B*/
+                                           RTUNI_ALPHA, /* U+00fa7c: CJK COMPATIBILITY IDEOGRAPH-FA7C*/
+                                           RTUNI_ALPHA, /* U+00fa7d: CJK COMPATIBILITY IDEOGRAPH-FA7D*/
+                                           RTUNI_ALPHA, /* U+00fa7e: CJK COMPATIBILITY IDEOGRAPH-FA7E*/
+                                           RTUNI_ALPHA, /* U+00fa7f: CJK COMPATIBILITY IDEOGRAPH-FA7F*/
+                                           RTUNI_ALPHA, /* U+00fa80: CJK COMPATIBILITY IDEOGRAPH-FA80*/
+                                           RTUNI_ALPHA, /* U+00fa81: CJK COMPATIBILITY IDEOGRAPH-FA81*/
+                                           RTUNI_ALPHA, /* U+00fa82: CJK COMPATIBILITY IDEOGRAPH-FA82*/
+                                           RTUNI_ALPHA, /* U+00fa83: CJK COMPATIBILITY IDEOGRAPH-FA83*/
+                                           RTUNI_ALPHA, /* U+00fa84: CJK COMPATIBILITY IDEOGRAPH-FA84*/
+                                           RTUNI_ALPHA, /* U+00fa85: CJK COMPATIBILITY IDEOGRAPH-FA85*/
+                                           RTUNI_ALPHA, /* U+00fa86: CJK COMPATIBILITY IDEOGRAPH-FA86*/
+                                           RTUNI_ALPHA, /* U+00fa87: CJK COMPATIBILITY IDEOGRAPH-FA87*/
+                                           RTUNI_ALPHA, /* U+00fa88: CJK COMPATIBILITY IDEOGRAPH-FA88*/
+                                           RTUNI_ALPHA, /* U+00fa89: CJK COMPATIBILITY IDEOGRAPH-FA89*/
+                                           RTUNI_ALPHA, /* U+00fa8a: CJK COMPATIBILITY IDEOGRAPH-FA8A*/
+                                           RTUNI_ALPHA, /* U+00fa8b: CJK COMPATIBILITY IDEOGRAPH-FA8B*/
+                                           RTUNI_ALPHA, /* U+00fa8c: CJK COMPATIBILITY IDEOGRAPH-FA8C*/
+                                           RTUNI_ALPHA, /* U+00fa8d: CJK COMPATIBILITY IDEOGRAPH-FA8D*/
+                                           RTUNI_ALPHA, /* U+00fa8e: CJK COMPATIBILITY IDEOGRAPH-FA8E*/
+                                           RTUNI_ALPHA, /* U+00fa8f: CJK COMPATIBILITY IDEOGRAPH-FA8F*/
+                                           RTUNI_ALPHA, /* U+00fa90: CJK COMPATIBILITY IDEOGRAPH-FA90*/
+                                           RTUNI_ALPHA, /* U+00fa91: CJK COMPATIBILITY IDEOGRAPH-FA91*/
+                                           RTUNI_ALPHA, /* U+00fa92: CJK COMPATIBILITY IDEOGRAPH-FA92*/
+                                           RTUNI_ALPHA, /* U+00fa93: CJK COMPATIBILITY IDEOGRAPH-FA93*/
+                                           RTUNI_ALPHA, /* U+00fa94: CJK COMPATIBILITY IDEOGRAPH-FA94*/
+                                           RTUNI_ALPHA, /* U+00fa95: CJK COMPATIBILITY IDEOGRAPH-FA95*/
+                                           RTUNI_ALPHA, /* U+00fa96: CJK COMPATIBILITY IDEOGRAPH-FA96*/
+                                           RTUNI_ALPHA, /* U+00fa97: CJK COMPATIBILITY IDEOGRAPH-FA97*/
+                                           RTUNI_ALPHA, /* U+00fa98: CJK COMPATIBILITY IDEOGRAPH-FA98*/
+                                           RTUNI_ALPHA, /* U+00fa99: CJK COMPATIBILITY IDEOGRAPH-FA99*/
+                                           RTUNI_ALPHA, /* U+00fa9a: CJK COMPATIBILITY IDEOGRAPH-FA9A*/
+                                           RTUNI_ALPHA, /* U+00fa9b: CJK COMPATIBILITY IDEOGRAPH-FA9B*/
+                                           RTUNI_ALPHA, /* U+00fa9c: CJK COMPATIBILITY IDEOGRAPH-FA9C*/
+                                           RTUNI_ALPHA, /* U+00fa9d: CJK COMPATIBILITY IDEOGRAPH-FA9D*/
+                                           RTUNI_ALPHA, /* U+00fa9e: CJK COMPATIBILITY IDEOGRAPH-FA9E*/
+                                           RTUNI_ALPHA, /* U+00fa9f: CJK COMPATIBILITY IDEOGRAPH-FA9F*/
+                                           RTUNI_ALPHA, /* U+00faa0: CJK COMPATIBILITY IDEOGRAPH-FAA0*/
+                                           RTUNI_ALPHA, /* U+00faa1: CJK COMPATIBILITY IDEOGRAPH-FAA1*/
+                                           RTUNI_ALPHA, /* U+00faa2: CJK COMPATIBILITY IDEOGRAPH-FAA2*/
+                                           RTUNI_ALPHA, /* U+00faa3: CJK COMPATIBILITY IDEOGRAPH-FAA3*/
+                                           RTUNI_ALPHA, /* U+00faa4: CJK COMPATIBILITY IDEOGRAPH-FAA4*/
+                                           RTUNI_ALPHA, /* U+00faa5: CJK COMPATIBILITY IDEOGRAPH-FAA5*/
+                                           RTUNI_ALPHA, /* U+00faa6: CJK COMPATIBILITY IDEOGRAPH-FAA6*/
+                                           RTUNI_ALPHA, /* U+00faa7: CJK COMPATIBILITY IDEOGRAPH-FAA7*/
+                                           RTUNI_ALPHA, /* U+00faa8: CJK COMPATIBILITY IDEOGRAPH-FAA8*/
+                                           RTUNI_ALPHA, /* U+00faa9: CJK COMPATIBILITY IDEOGRAPH-FAA9*/
+                                           RTUNI_ALPHA, /* U+00faaa: CJK COMPATIBILITY IDEOGRAPH-FAAA*/
+                                           RTUNI_ALPHA, /* U+00faab: CJK COMPATIBILITY IDEOGRAPH-FAAB*/
+                                           RTUNI_ALPHA, /* U+00faac: CJK COMPATIBILITY IDEOGRAPH-FAAC*/
+                                           RTUNI_ALPHA, /* U+00faad: CJK COMPATIBILITY IDEOGRAPH-FAAD*/
+                                           RTUNI_ALPHA, /* U+00faae: CJK COMPATIBILITY IDEOGRAPH-FAAE*/
+                                           RTUNI_ALPHA, /* U+00faaf: CJK COMPATIBILITY IDEOGRAPH-FAAF*/
+                                           RTUNI_ALPHA, /* U+00fab0: CJK COMPATIBILITY IDEOGRAPH-FAB0*/
+                                           RTUNI_ALPHA, /* U+00fab1: CJK COMPATIBILITY IDEOGRAPH-FAB1*/
+                                           RTUNI_ALPHA, /* U+00fab2: CJK COMPATIBILITY IDEOGRAPH-FAB2*/
+                                           RTUNI_ALPHA, /* U+00fab3: CJK COMPATIBILITY IDEOGRAPH-FAB3*/
+                                           RTUNI_ALPHA, /* U+00fab4: CJK COMPATIBILITY IDEOGRAPH-FAB4*/
+                                           RTUNI_ALPHA, /* U+00fab5: CJK COMPATIBILITY IDEOGRAPH-FAB5*/
+                                           RTUNI_ALPHA, /* U+00fab6: CJK COMPATIBILITY IDEOGRAPH-FAB6*/
+                                           RTUNI_ALPHA, /* U+00fab7: CJK COMPATIBILITY IDEOGRAPH-FAB7*/
+                                           RTUNI_ALPHA, /* U+00fab8: CJK COMPATIBILITY IDEOGRAPH-FAB8*/
+                                           RTUNI_ALPHA, /* U+00fab9: CJK COMPATIBILITY IDEOGRAPH-FAB9*/
+                                           RTUNI_ALPHA, /* U+00faba: CJK COMPATIBILITY IDEOGRAPH-FABA*/
+                                           RTUNI_ALPHA, /* U+00fabb: CJK COMPATIBILITY IDEOGRAPH-FABB*/
+                                           RTUNI_ALPHA, /* U+00fabc: CJK COMPATIBILITY IDEOGRAPH-FABC*/
+                                           RTUNI_ALPHA, /* U+00fabd: CJK COMPATIBILITY IDEOGRAPH-FABD*/
+                                           RTUNI_ALPHA, /* U+00fabe: CJK COMPATIBILITY IDEOGRAPH-FABE*/
+                                           RTUNI_ALPHA, /* U+00fabf: CJK COMPATIBILITY IDEOGRAPH-FABF*/
+                                           RTUNI_ALPHA, /* U+00fac0: CJK COMPATIBILITY IDEOGRAPH-FAC0*/
+                                           RTUNI_ALPHA, /* U+00fac1: CJK COMPATIBILITY IDEOGRAPH-FAC1*/
+                                           RTUNI_ALPHA, /* U+00fac2: CJK COMPATIBILITY IDEOGRAPH-FAC2*/
+                                           RTUNI_ALPHA, /* U+00fac3: CJK COMPATIBILITY IDEOGRAPH-FAC3*/
+                                           RTUNI_ALPHA, /* U+00fac4: CJK COMPATIBILITY IDEOGRAPH-FAC4*/
+                                           RTUNI_ALPHA, /* U+00fac5: CJK COMPATIBILITY IDEOGRAPH-FAC5*/
+                                           RTUNI_ALPHA, /* U+00fac6: CJK COMPATIBILITY IDEOGRAPH-FAC6*/
+                                           RTUNI_ALPHA, /* U+00fac7: CJK COMPATIBILITY IDEOGRAPH-FAC7*/
+                                           RTUNI_ALPHA, /* U+00fac8: CJK COMPATIBILITY IDEOGRAPH-FAC8*/
+                                           RTUNI_ALPHA, /* U+00fac9: CJK COMPATIBILITY IDEOGRAPH-FAC9*/
+                                           RTUNI_ALPHA, /* U+00faca: CJK COMPATIBILITY IDEOGRAPH-FACA*/
+                                           RTUNI_ALPHA, /* U+00facb: CJK COMPATIBILITY IDEOGRAPH-FACB*/
+                                           RTUNI_ALPHA, /* U+00facc: CJK COMPATIBILITY IDEOGRAPH-FACC*/
+                                           RTUNI_ALPHA, /* U+00facd: CJK COMPATIBILITY IDEOGRAPH-FACD*/
+                                           RTUNI_ALPHA, /* U+00face: CJK COMPATIBILITY IDEOGRAPH-FACE*/
+                                           RTUNI_ALPHA, /* U+00facf: CJK COMPATIBILITY IDEOGRAPH-FACF*/
+                                           RTUNI_ALPHA, /* U+00fad0: CJK COMPATIBILITY IDEOGRAPH-FAD0*/
+                                           RTUNI_ALPHA, /* U+00fad1: CJK COMPATIBILITY IDEOGRAPH-FAD1*/
+                                           RTUNI_ALPHA, /* U+00fad2: CJK COMPATIBILITY IDEOGRAPH-FAD2*/
+                                           RTUNI_ALPHA, /* U+00fad3: CJK COMPATIBILITY IDEOGRAPH-FAD3*/
+                                           RTUNI_ALPHA, /* U+00fad4: CJK COMPATIBILITY IDEOGRAPH-FAD4*/
+                                           RTUNI_ALPHA, /* U+00fad5: CJK COMPATIBILITY IDEOGRAPH-FAD5*/
+                                           RTUNI_ALPHA, /* U+00fad6: CJK COMPATIBILITY IDEOGRAPH-FAD6*/
+                                           RTUNI_ALPHA, /* U+00fad7: CJK COMPATIBILITY IDEOGRAPH-FAD7*/
+                                           RTUNI_ALPHA, /* U+00fad8: CJK COMPATIBILITY IDEOGRAPH-FAD8*/
+                                           RTUNI_ALPHA, /* U+00fad9: CJK COMPATIBILITY IDEOGRAPH-FAD9*/
+                                                     0, /* U+00fada: */
+                                                     0, /* U+00fadb: */
+                                                     0, /* U+00fadc: */
+                                                     0, /* U+00fadd: */
+                                                     0, /* U+00fade: */
+                                                     0, /* U+00fadf: */
+                                                     0, /* U+00fae0: */
+                                                     0, /* U+00fae1: */
+                                                     0, /* U+00fae2: */
+                                                     0, /* U+00fae3: */
+                                                     0, /* U+00fae4: */
+                                                     0, /* U+00fae5: */
+                                                     0, /* U+00fae6: */
+                                                     0, /* U+00fae7: */
+                                                     0, /* U+00fae8: */
+                                                     0, /* U+00fae9: */
+                                                     0, /* U+00faea: */
+                                                     0, /* U+00faeb: */
+                                                     0, /* U+00faec: */
+                                                     0, /* U+00faed: */
+                                                     0, /* U+00faee: */
+                                                     0, /* U+00faef: */
+                                                     0, /* U+00faf0: */
+                                                     0, /* U+00faf1: */
+                                                     0, /* U+00faf2: */
+                                                     0, /* U+00faf3: */
+                                                     0, /* U+00faf4: */
+                                                     0, /* U+00faf5: */
+                                                     0, /* U+00faf6: */
+                                                     0, /* U+00faf7: */
+                                                     0, /* U+00faf8: */
+                                                     0, /* U+00faf9: */
+                                                     0, /* U+00fafa: */
+                                                     0, /* U+00fafb: */
+                                                     0, /* U+00fafc: */
+                                                     0, /* U+00fafd: */
+                                                     0, /* U+00fafe: */
+                                                     0, /* U+00faff: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb00: LATIN SMALL LIGATURE FF*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb01: LATIN SMALL LIGATURE FI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb02: LATIN SMALL LIGATURE FL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb03: LATIN SMALL LIGATURE FFI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb04: LATIN SMALL LIGATURE FFL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb05: LATIN SMALL LIGATURE LONG S T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb06: LATIN SMALL LIGATURE ST*/
+                                                     0, /* U+00fb07: */
+                                                     0, /* U+00fb08: */
+                                                     0, /* U+00fb09: */
+                                                     0, /* U+00fb0a: */
+                                                     0, /* U+00fb0b: */
+                                                     0, /* U+00fb0c: */
+                                                     0, /* U+00fb0d: */
+                                                     0, /* U+00fb0e: */
+                                                     0, /* U+00fb0f: */
+                                                     0, /* U+00fb10: */
+                                                     0, /* U+00fb11: */
+                                                     0, /* U+00fb12: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb13: ARMENIAN SMALL LIGATURE MEN NOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb14: ARMENIAN SMALL LIGATURE MEN ECH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb15: ARMENIAN SMALL LIGATURE MEN INI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb16: ARMENIAN SMALL LIGATURE VEW NOW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb17: ARMENIAN SMALL LIGATURE MEN XEH*/
+                                                     0, /* U+00fb18: */
+                                                     0, /* U+00fb19: */
+                                                     0, /* U+00fb1a: */
+                                                     0, /* U+00fb1b: */
+                                                     0, /* U+00fb1c: */
+                                           RTUNI_ALPHA, /* U+00fb1d: HEBREW LETTER YOD WITH HIRIQ*/
+                                           RTUNI_ALPHA, /* U+00fb1e: HEBREW POINT JUDEO-SPANISH VARIKA*/
+                                           RTUNI_ALPHA, /* U+00fb1f: HEBREW LIGATURE YIDDISH YOD YOD PATAH*/
+                                           RTUNI_ALPHA, /* U+00fb20: HEBREW LETTER ALTERNATIVE AYIN*/
+                                           RTUNI_ALPHA, /* U+00fb21: HEBREW LETTER WIDE ALEF*/
+                                           RTUNI_ALPHA, /* U+00fb22: HEBREW LETTER WIDE DALET*/
+                                           RTUNI_ALPHA, /* U+00fb23: HEBREW LETTER WIDE HE*/
+                                           RTUNI_ALPHA, /* U+00fb24: HEBREW LETTER WIDE KAF*/
+                                           RTUNI_ALPHA, /* U+00fb25: HEBREW LETTER WIDE LAMED*/
+                                           RTUNI_ALPHA, /* U+00fb26: HEBREW LETTER WIDE FINAL MEM*/
+                                           RTUNI_ALPHA, /* U+00fb27: HEBREW LETTER WIDE RESH*/
+                                           RTUNI_ALPHA, /* U+00fb28: HEBREW LETTER WIDE TAV*/
+                                                     0, /* U+00fb29: HEBREW LETTER ALTERNATIVE PLUS SIGN*/
+                                           RTUNI_ALPHA, /* U+00fb2a: HEBREW LETTER SHIN WITH SHIN DOT*/
+                                           RTUNI_ALPHA, /* U+00fb2b: HEBREW LETTER SHIN WITH SIN DOT*/
+                                           RTUNI_ALPHA, /* U+00fb2c: HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT*/
+                                           RTUNI_ALPHA, /* U+00fb2d: HEBREW LETTER SHIN WITH DAGESH AND SIN DOT*/
+                                           RTUNI_ALPHA, /* U+00fb2e: HEBREW LETTER ALEF WITH PATAH*/
+                                           RTUNI_ALPHA, /* U+00fb2f: HEBREW LETTER ALEF WITH QAMATS*/
+                                           RTUNI_ALPHA, /* U+00fb30: HEBREW LETTER ALEF WITH MAPIQ*/
+                                           RTUNI_ALPHA, /* U+00fb31: HEBREW LETTER BET WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb32: HEBREW LETTER GIMEL WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb33: HEBREW LETTER DALET WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb34: HEBREW LETTER HE WITH MAPIQ*/
+                                           RTUNI_ALPHA, /* U+00fb35: HEBREW LETTER VAV WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb36: HEBREW LETTER ZAYIN WITH DAGESH*/
+                                                     0, /* U+00fb37: */
+                                           RTUNI_ALPHA, /* U+00fb38: HEBREW LETTER TET WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb39: HEBREW LETTER YOD WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb3a: HEBREW LETTER FINAL KAF WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb3b: HEBREW LETTER KAF WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb3c: HEBREW LETTER LAMED WITH DAGESH*/
+                                                     0, /* U+00fb3d: */
+                                           RTUNI_ALPHA, /* U+00fb3e: HEBREW LETTER MEM WITH DAGESH*/
+                                                     0, /* U+00fb3f: */
+                                           RTUNI_ALPHA, /* U+00fb40: HEBREW LETTER NUN WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb41: HEBREW LETTER SAMEKH WITH DAGESH*/
+                                                     0, /* U+00fb42: */
+                                           RTUNI_ALPHA, /* U+00fb43: HEBREW LETTER FINAL PE WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb44: HEBREW LETTER PE WITH DAGESH*/
+                                                     0, /* U+00fb45: */
+                                           RTUNI_ALPHA, /* U+00fb46: HEBREW LETTER TSADI WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb47: HEBREW LETTER QOF WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb48: HEBREW LETTER RESH WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb49: HEBREW LETTER SHIN WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb4a: HEBREW LETTER TAV WITH DAGESH*/
+                                           RTUNI_ALPHA, /* U+00fb4b: HEBREW LETTER VAV WITH HOLAM*/
+                                           RTUNI_ALPHA, /* U+00fb4c: HEBREW LETTER BET WITH RAFE*/
+                                           RTUNI_ALPHA, /* U+00fb4d: HEBREW LETTER KAF WITH RAFE*/
+                                           RTUNI_ALPHA, /* U+00fb4e: HEBREW LETTER PE WITH RAFE*/
+                                           RTUNI_ALPHA, /* U+00fb4f: HEBREW LIGATURE ALEF LAMED*/
+                                           RTUNI_ALPHA, /* U+00fb50: ARABIC LETTER ALEF WASLA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb51: ARABIC LETTER ALEF WASLA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb52: ARABIC LETTER BEEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb53: ARABIC LETTER BEEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb54: ARABIC LETTER BEEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb55: ARABIC LETTER BEEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb56: ARABIC LETTER PEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb57: ARABIC LETTER PEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb58: ARABIC LETTER PEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb59: ARABIC LETTER PEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5a: ARABIC LETTER BEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5b: ARABIC LETTER BEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5c: ARABIC LETTER BEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5d: ARABIC LETTER BEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5e: ARABIC LETTER TTEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb5f: ARABIC LETTER TTEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb60: ARABIC LETTER TTEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb61: ARABIC LETTER TTEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb62: ARABIC LETTER TEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb63: ARABIC LETTER TEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb64: ARABIC LETTER TEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb65: ARABIC LETTER TEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb66: ARABIC LETTER TTEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb67: ARABIC LETTER TTEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb68: ARABIC LETTER TTEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb69: ARABIC LETTER TTEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6a: ARABIC LETTER VEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6b: ARABIC LETTER VEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6c: ARABIC LETTER VEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6d: ARABIC LETTER VEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6e: ARABIC LETTER PEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb6f: ARABIC LETTER PEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb70: ARABIC LETTER PEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb71: ARABIC LETTER PEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb72: ARABIC LETTER DYEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb73: ARABIC LETTER DYEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb74: ARABIC LETTER DYEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb75: ARABIC LETTER DYEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb76: ARABIC LETTER NYEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb77: ARABIC LETTER NYEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb78: ARABIC LETTER NYEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb79: ARABIC LETTER NYEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7a: ARABIC LETTER TCHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7b: ARABIC LETTER TCHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7c: ARABIC LETTER TCHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7d: ARABIC LETTER TCHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7e: ARABIC LETTER TCHEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb7f: ARABIC LETTER TCHEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb80: ARABIC LETTER TCHEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb81: ARABIC LETTER TCHEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb82: ARABIC LETTER DDAHAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb83: ARABIC LETTER DDAHAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb84: ARABIC LETTER DAHAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb85: ARABIC LETTER DAHAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb86: ARABIC LETTER DUL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb87: ARABIC LETTER DUL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb88: ARABIC LETTER DDAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb89: ARABIC LETTER DDAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8a: ARABIC LETTER JEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8b: ARABIC LETTER JEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8c: ARABIC LETTER RREH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8d: ARABIC LETTER RREH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8e: ARABIC LETTER KEHEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb8f: ARABIC LETTER KEHEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb90: ARABIC LETTER KEHEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb91: ARABIC LETTER KEHEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb92: ARABIC LETTER GAF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb93: ARABIC LETTER GAF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb94: ARABIC LETTER GAF INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb95: ARABIC LETTER GAF MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb96: ARABIC LETTER GUEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb97: ARABIC LETTER GUEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb98: ARABIC LETTER GUEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb99: ARABIC LETTER GUEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9a: ARABIC LETTER NGOEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9b: ARABIC LETTER NGOEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9c: ARABIC LETTER NGOEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9d: ARABIC LETTER NGOEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9e: ARABIC LETTER NOON GHUNNA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fb9f: ARABIC LETTER NOON GHUNNA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba0: ARABIC LETTER RNOON ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fba1: ARABIC LETTER RNOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba2: ARABIC LETTER RNOON INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba3: ARABIC LETTER RNOON MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba4: ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fba5: ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba6: ARABIC LETTER HEH GOAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fba7: ARABIC LETTER HEH GOAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba8: ARABIC LETTER HEH GOAL INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fba9: ARABIC LETTER HEH GOAL MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbaa: ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbab: ARABIC LETTER HEH DOACHASHMEE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbac: ARABIC LETTER HEH DOACHASHMEE INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbad: ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbae: ARABIC LETTER YEH BARREE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbaf: ARABIC LETTER YEH BARREE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbb0: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbb1: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM*/
+                                                     0, /* U+00fbb2: ARABIC SYMBOL DOT ABOVE*/
+                                                     0, /* U+00fbb3: ARABIC SYMBOL DOT BELOW*/
+                                                     0, /* U+00fbb4: ARABIC SYMBOL TWO DOTS ABOVE*/
+                                                     0, /* U+00fbb5: ARABIC SYMBOL TWO DOTS BELOW*/
+                                                     0, /* U+00fbb6: ARABIC SYMBOL THREE DOTS ABOVE*/
+                                                     0, /* U+00fbb7: ARABIC SYMBOL THREE DOTS BELOW*/
+                                                     0, /* U+00fbb8: ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE*/
+                                                     0, /* U+00fbb9: ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW*/
+                                                     0, /* U+00fbba: ARABIC SYMBOL FOUR DOTS ABOVE*/
+                                                     0, /* U+00fbbb: ARABIC SYMBOL FOUR DOTS BELOW*/
+                                                     0, /* U+00fbbc: ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW*/
+                                                     0, /* U+00fbbd: ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE*/
+                                                     0, /* U+00fbbe: ARABIC SYMBOL TWO DOTS VERTICALLY BELOW*/
+                                                     0, /* U+00fbbf: ARABIC SYMBOL RING*/
+                                                     0, /* U+00fbc0: ARABIC SYMBOL SMALL TAH ABOVE*/
+                                                     0, /* U+00fbc1: ARABIC SYMBOL SMALL TAH BELOW*/
+                                                     0, /* U+00fbc2: */
+                                                     0, /* U+00fbc3: */
+                                                     0, /* U+00fbc4: */
+                                                     0, /* U+00fbc5: */
+                                                     0, /* U+00fbc6: */
+                                                     0, /* U+00fbc7: */
+                                                     0, /* U+00fbc8: */
+                                                     0, /* U+00fbc9: */
+                                                     0, /* U+00fbca: */
+                                                     0, /* U+00fbcb: */
+                                                     0, /* U+00fbcc: */
+                                                     0, /* U+00fbcd: */
+                                                     0, /* U+00fbce: */
+                                                     0, /* U+00fbcf: */
+                                                     0, /* U+00fbd0: */
+                                                     0, /* U+00fbd1: */
+                                                     0, /* U+00fbd2: */
+                                           RTUNI_ALPHA, /* U+00fbd3: ARABIC LETTER NG ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd4: ARABIC LETTER NG FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd5: ARABIC LETTER NG INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd6: ARABIC LETTER NG MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd7: ARABIC LETTER U ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd8: ARABIC LETTER U FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbd9: ARABIC LETTER OE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbda: ARABIC LETTER OE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbdb: ARABIC LETTER YU ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbdc: ARABIC LETTER YU FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbdd: ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbde: ARABIC LETTER VE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbdf: ARABIC LETTER VE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe0: ARABIC LETTER KIRGHIZ OE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe1: ARABIC LETTER KIRGHIZ OE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe2: ARABIC LETTER KIRGHIZ YU ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe3: ARABIC LETTER KIRGHIZ YU FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe4: ARABIC LETTER E ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe5: ARABIC LETTER E FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe6: ARABIC LETTER E INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe7: ARABIC LETTER E MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe8: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbe9: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbea: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbeb: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbec: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbed: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbee: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbef: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf1: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf2: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf3: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf4: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf5: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf6: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf7: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf8: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbf9: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbfa: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbfb: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbfc: ARABIC LETTER FARSI YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fbfd: ARABIC LETTER FARSI YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbfe: ARABIC LETTER FARSI YEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fbff: ARABIC LETTER FARSI YEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc00: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc01: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc02: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc03: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc04: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc05: ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc06: ARABIC LIGATURE BEH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc07: ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc08: ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc09: ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0a: ARABIC LIGATURE BEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0b: ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0c: ARABIC LIGATURE TEH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0d: ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0e: ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc0f: ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc10: ARABIC LIGATURE TEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc11: ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc12: ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc13: ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc14: ARABIC LIGATURE THEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc15: ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc16: ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc17: ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc18: ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc19: ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1a: ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1b: ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1c: ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1d: ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1e: ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc1f: ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc20: ARABIC LIGATURE SAD WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc21: ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc22: ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc23: ARABIC LIGATURE DAD WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc24: ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc25: ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc26: ARABIC LIGATURE TAH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc27: ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc28: ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc29: ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2a: ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2b: ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2c: ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2d: ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2e: ARABIC LIGATURE FEH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc2f: ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc30: ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc31: ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc32: ARABIC LIGATURE FEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc33: ARABIC LIGATURE QAF WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc34: ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc35: ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc36: ARABIC LIGATURE QAF WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc37: ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc38: ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc39: ARABIC LIGATURE KAF WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3a: ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3b: ARABIC LIGATURE KAF WITH LAM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3c: ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3d: ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3e: ARABIC LIGATURE KAF WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc3f: ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc40: ARABIC LIGATURE LAM WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc41: ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc42: ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc43: ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc44: ARABIC LIGATURE LAM WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc45: ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc46: ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc47: ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc48: ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc49: ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4a: ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4b: ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4c: ARABIC LIGATURE NOON WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4d: ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4e: ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc4f: ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc50: ARABIC LIGATURE NOON WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc51: ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc52: ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc53: ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc54: ARABIC LIGATURE HEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc55: ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc56: ARABIC LIGATURE YEH WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc57: ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc58: ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc59: ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5a: ARABIC LIGATURE YEH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5b: ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5c: ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5d: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5e: ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc5f: ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc60: ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc61: ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc62: ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc63: ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fc64: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc65: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc66: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc67: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc68: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc69: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6a: ARABIC LIGATURE BEH WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6b: ARABIC LIGATURE BEH WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6c: ARABIC LIGATURE BEH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6d: ARABIC LIGATURE BEH WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6e: ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc6f: ARABIC LIGATURE BEH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc70: ARABIC LIGATURE TEH WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc71: ARABIC LIGATURE TEH WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc72: ARABIC LIGATURE TEH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc73: ARABIC LIGATURE TEH WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc74: ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc75: ARABIC LIGATURE TEH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc76: ARABIC LIGATURE THEH WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc77: ARABIC LIGATURE THEH WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc78: ARABIC LIGATURE THEH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc79: ARABIC LIGATURE THEH WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7a: ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7b: ARABIC LIGATURE THEH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7c: ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7d: ARABIC LIGATURE FEH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7e: ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc7f: ARABIC LIGATURE QAF WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc80: ARABIC LIGATURE KAF WITH ALEF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc81: ARABIC LIGATURE KAF WITH LAM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc82: ARABIC LIGATURE KAF WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc83: ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc84: ARABIC LIGATURE KAF WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc85: ARABIC LIGATURE LAM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc86: ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc87: ARABIC LIGATURE LAM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc88: ARABIC LIGATURE MEEM WITH ALEF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc89: ARABIC LIGATURE MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8a: ARABIC LIGATURE NOON WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8b: ARABIC LIGATURE NOON WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8c: ARABIC LIGATURE NOON WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8d: ARABIC LIGATURE NOON WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8e: ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc8f: ARABIC LIGATURE NOON WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc90: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc91: ARABIC LIGATURE YEH WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc92: ARABIC LIGATURE YEH WITH ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc93: ARABIC LIGATURE YEH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc94: ARABIC LIGATURE YEH WITH NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc95: ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc96: ARABIC LIGATURE YEH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc97: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc98: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc99: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9a: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9b: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9c: ARABIC LIGATURE BEH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9d: ARABIC LIGATURE BEH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9e: ARABIC LIGATURE BEH WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fc9f: ARABIC LIGATURE BEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca0: ARABIC LIGATURE BEH WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca1: ARABIC LIGATURE TEH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca2: ARABIC LIGATURE TEH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca3: ARABIC LIGATURE TEH WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca4: ARABIC LIGATURE TEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca5: ARABIC LIGATURE TEH WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca6: ARABIC LIGATURE THEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca7: ARABIC LIGATURE JEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca8: ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fca9: ARABIC LIGATURE HAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcaa: ARABIC LIGATURE HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcab: ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcac: ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcad: ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcae: ARABIC LIGATURE SEEN WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcaf: ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb0: ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb1: ARABIC LIGATURE SAD WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb2: ARABIC LIGATURE SAD WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb3: ARABIC LIGATURE SAD WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb4: ARABIC LIGATURE DAD WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb5: ARABIC LIGATURE DAD WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb6: ARABIC LIGATURE DAD WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb7: ARABIC LIGATURE DAD WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb8: ARABIC LIGATURE TAH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcb9: ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcba: ARABIC LIGATURE AIN WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcbb: ARABIC LIGATURE AIN WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcbc: ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcbd: ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcbe: ARABIC LIGATURE FEH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcbf: ARABIC LIGATURE FEH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc0: ARABIC LIGATURE FEH WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc1: ARABIC LIGATURE FEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc2: ARABIC LIGATURE QAF WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc3: ARABIC LIGATURE QAF WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc4: ARABIC LIGATURE KAF WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc5: ARABIC LIGATURE KAF WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc6: ARABIC LIGATURE KAF WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc7: ARABIC LIGATURE KAF WITH LAM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc8: ARABIC LIGATURE KAF WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcc9: ARABIC LIGATURE LAM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcca: ARABIC LIGATURE LAM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fccb: ARABIC LIGATURE LAM WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fccc: ARABIC LIGATURE LAM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fccd: ARABIC LIGATURE LAM WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcce: ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fccf: ARABIC LIGATURE MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd0: ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd1: ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd2: ARABIC LIGATURE NOON WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd3: ARABIC LIGATURE NOON WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd4: ARABIC LIGATURE NOON WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd5: ARABIC LIGATURE NOON WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd6: ARABIC LIGATURE NOON WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd7: ARABIC LIGATURE HEH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd8: ARABIC LIGATURE HEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcd9: ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcda: ARABIC LIGATURE YEH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcdb: ARABIC LIGATURE YEH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcdc: ARABIC LIGATURE YEH WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcdd: ARABIC LIGATURE YEH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcde: ARABIC LIGATURE YEH WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcdf: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce1: ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce2: ARABIC LIGATURE BEH WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce3: ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce4: ARABIC LIGATURE TEH WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce5: ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce6: ARABIC LIGATURE THEH WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce7: ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce8: ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fce9: ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcea: ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fceb: ARABIC LIGATURE KAF WITH LAM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcec: ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fced: ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcee: ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcef: ARABIC LIGATURE NOON WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf0: ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf1: ARABIC LIGATURE YEH WITH HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf2: ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf3: ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf4: ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf5: ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf6: ARABIC LIGATURE TAH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf7: ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf8: ARABIC LIGATURE AIN WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcf9: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcfa: ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcfb: ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcfc: ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcfd: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcfe: ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fcff: ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd00: ARABIC LIGATURE HAH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd01: ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd02: ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd03: ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd04: ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd05: ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd06: ARABIC LIGATURE SAD WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd07: ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd08: ARABIC LIGATURE DAD WITH YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd09: ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0a: ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0b: ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0c: ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0d: ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0e: ARABIC LIGATURE SEEN WITH REH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd0f: ARABIC LIGATURE SAD WITH REH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd10: ARABIC LIGATURE DAD WITH REH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fd11: ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd12: ARABIC LIGATURE TAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd13: ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd14: ARABIC LIGATURE AIN WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd15: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd16: ARABIC LIGATURE GHAIN WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd17: ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd18: ARABIC LIGATURE SEEN WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd19: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1a: ARABIC LIGATURE SHEEN WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1b: ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1c: ARABIC LIGATURE HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1d: ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1e: ARABIC LIGATURE JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd1f: ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd20: ARABIC LIGATURE KHAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd21: ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd22: ARABIC LIGATURE SAD WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd23: ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd24: ARABIC LIGATURE DAD WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd25: ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd26: ARABIC LIGATURE SHEEN WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd27: ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd28: ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd29: ARABIC LIGATURE SHEEN WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2a: ARABIC LIGATURE SEEN WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2b: ARABIC LIGATURE SAD WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2c: ARABIC LIGATURE DAD WITH REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2d: ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2e: ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd2f: ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd30: ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd31: ARABIC LIGATURE SEEN WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd32: ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd33: ARABIC LIGATURE TAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd34: ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd35: ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd36: ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd37: ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd38: ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd39: ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd3a: ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd3b: ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd3c: ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd3d: ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM*/
+                                                     0, /* U+00fd3e: ORNATE LEFT PARENTHESIS*/
+                                                     0, /* U+00fd3f: ORNATE RIGHT PARENTHESIS*/
+                                                     0, /* U+00fd40: */
+                                                     0, /* U+00fd41: */
+                                                     0, /* U+00fd42: */
+                                                     0, /* U+00fd43: */
+                                                     0, /* U+00fd44: */
+                                                     0, /* U+00fd45: */
+                                                     0, /* U+00fd46: */
+                                                     0, /* U+00fd47: */
+                                                     0, /* U+00fd48: */
+                                                     0, /* U+00fd49: */
+                                                     0, /* U+00fd4a: */
+                                                     0, /* U+00fd4b: */
+                                                     0, /* U+00fd4c: */
+                                                     0, /* U+00fd4d: */
+                                                     0, /* U+00fd4e: */
+                                                     0, /* U+00fd4f: */
+                                           RTUNI_ALPHA, /* U+00fd50: ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd51: ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd52: ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd53: ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd54: ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd55: ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd56: ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd57: ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd58: ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd59: ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5a: ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5b: ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5c: ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5d: ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5e: ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd5f: ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd60: ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd61: ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd62: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd63: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd64: ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd65: ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd66: ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd67: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd68: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd69: ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6a: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6b: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6c: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6d: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6e: ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd6f: ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd70: ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd71: ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd72: ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd73: ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd74: ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd75: ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd76: ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd77: ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd78: ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd79: ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7a: ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7b: ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7c: ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7d: ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7e: ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd7f: ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd80: ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd81: ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd82: ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd83: ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd84: ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd85: ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd86: ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd87: ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd88: ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd89: ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8a: ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8b: ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8c: ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8d: ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8e: ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd8f: ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM*/
+                                                     0, /* U+00fd90: */
+                                                     0, /* U+00fd91: */
+                                           RTUNI_ALPHA, /* U+00fd92: ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd93: ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd94: ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd95: ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd96: ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd97: ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd98: ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd99: ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9a: ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9b: ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9c: ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9d: ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9e: ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fd9f: ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda0: ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda1: ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda2: ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda3: ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda4: ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda5: ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda6: ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda7: ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda8: ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fda9: ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdaa: ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdab: ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdac: ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdad: ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdae: ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdaf: ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb0: ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb1: ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb2: ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb3: ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb4: ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb5: ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb6: ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb7: ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb8: ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdb9: ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdba: ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdbb: ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdbc: ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdbd: ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdbe: ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdbf: ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc0: ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc1: ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc2: ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc3: ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc4: ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc5: ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc6: ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fdc7: ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM*/
+                                                     0, /* U+00fdc8: */
+                                                     0, /* U+00fdc9: */
+                                                     0, /* U+00fdca: */
+                                                     0, /* U+00fdcb: */
+                                                     0, /* U+00fdcc: */
+                                                     0, /* U+00fdcd: */
+                                                     0, /* U+00fdce: */
+                                                     0, /* U+00fdcf: */
+                                                     0, /* U+00fdd0: */
+                                                     0, /* U+00fdd1: */
+                                                     0, /* U+00fdd2: */
+                                                     0, /* U+00fdd3: */
+                                                     0, /* U+00fdd4: */
+                                                     0, /* U+00fdd5: */
+                                                     0, /* U+00fdd6: */
+                                                     0, /* U+00fdd7: */
+                                                     0, /* U+00fdd8: */
+                                                     0, /* U+00fdd9: */
+                                                     0, /* U+00fdda: */
+                                                     0, /* U+00fddb: */
+                                                     0, /* U+00fddc: */
+                                                     0, /* U+00fddd: */
+                                                     0, /* U+00fdde: */
+                                                     0, /* U+00fddf: */
+                                                     0, /* U+00fde0: */
+                                                     0, /* U+00fde1: */
+                                                     0, /* U+00fde2: */
+                                                     0, /* U+00fde3: */
+                                                     0, /* U+00fde4: */
+                                                     0, /* U+00fde5: */
+                                                     0, /* U+00fde6: */
+                                                     0, /* U+00fde7: */
+                                                     0, /* U+00fde8: */
+                                                     0, /* U+00fde9: */
+                                                     0, /* U+00fdea: */
+                                                     0, /* U+00fdeb: */
+                                                     0, /* U+00fdec: */
+                                                     0, /* U+00fded: */
+                                                     0, /* U+00fdee: */
+                                                     0, /* U+00fdef: */
+                                           RTUNI_ALPHA, /* U+00fdf0: ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf1: ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf2: ARABIC LIGATURE ALLAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf3: ARABIC LIGATURE AKBAR ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf4: ARABIC LIGATURE MOHAMMAD ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf5: ARABIC LIGATURE SALAM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf6: ARABIC LIGATURE RASOUL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf7: ARABIC LIGATURE ALAYHE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf8: ARABIC LIGATURE WASALLAM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdf9: ARABIC LIGATURE SALLA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fdfa: ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM*/
+                                           RTUNI_ALPHA, /* U+00fdfb: ARABIC LIGATURE JALLAJALALOUHOU*/
+                                                     0, /* U+00fdfc: RIAL SIGN*/
+                                                     0, /* U+00fdfd: ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM*/
+                                                     0, /* U+00fdfe: */
+                                                     0, /* U+00fdff: */
+                                                     0, /* U+00fe00: VARIATION SELECTOR-1*/
+                                                     0, /* U+00fe01: VARIATION SELECTOR-2*/
+                                                     0, /* U+00fe02: VARIATION SELECTOR-3*/
+                                                     0, /* U+00fe03: VARIATION SELECTOR-4*/
+                                                     0, /* U+00fe04: VARIATION SELECTOR-5*/
+                                                     0, /* U+00fe05: VARIATION SELECTOR-6*/
+                                                     0, /* U+00fe06: VARIATION SELECTOR-7*/
+                                                     0, /* U+00fe07: VARIATION SELECTOR-8*/
+                                                     0, /* U+00fe08: VARIATION SELECTOR-9*/
+                                                     0, /* U+00fe09: VARIATION SELECTOR-10*/
+                                                     0, /* U+00fe0a: VARIATION SELECTOR-11*/
+                                                     0, /* U+00fe0b: VARIATION SELECTOR-12*/
+                                                     0, /* U+00fe0c: VARIATION SELECTOR-13*/
+                                                     0, /* U+00fe0d: VARIATION SELECTOR-14*/
+                                                     0, /* U+00fe0e: VARIATION SELECTOR-15*/
+                                                     0, /* U+00fe0f: VARIATION SELECTOR-16*/
+                                                     0, /* U+00fe10: PRESENTATION FORM FOR VERTICAL COMMA*/
+                                                     0, /* U+00fe11: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA*/
+                                                     0, /* U+00fe12: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP*/
+                                                     0, /* U+00fe13: PRESENTATION FORM FOR VERTICAL COLON*/
+                                                     0, /* U+00fe14: PRESENTATION FORM FOR VERTICAL SEMICOLON*/
+                                                     0, /* U+00fe15: PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK*/
+                                                     0, /* U+00fe16: PRESENTATION FORM FOR VERTICAL QUESTION MARK*/
+                                                     0, /* U+00fe17: PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET*/
+                                                     0, /* U+00fe18: PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET*/
+                                                     0, /* U+00fe19: PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS*/
+                                                     0, /* U+00fe1a: */
+                                                     0, /* U+00fe1b: */
+                                                     0, /* U+00fe1c: */
+                                                     0, /* U+00fe1d: */
+                                                     0, /* U+00fe1e: */
+                                                     0, /* U+00fe1f: */
+                                                     0, /* U+00fe20: COMBINING LIGATURE LEFT HALF*/
+                                                     0, /* U+00fe21: COMBINING LIGATURE RIGHT HALF*/
+                                                     0, /* U+00fe22: COMBINING DOUBLE TILDE LEFT HALF*/
+                                                     0, /* U+00fe23: COMBINING DOUBLE TILDE RIGHT HALF*/
+                                                     0, /* U+00fe24: COMBINING MACRON LEFT HALF*/
+                                                     0, /* U+00fe25: COMBINING MACRON RIGHT HALF*/
+                                                     0, /* U+00fe26: COMBINING CONJOINING MACRON*/
+                                                     0, /* U+00fe27: */
+                                                     0, /* U+00fe28: */
+                                                     0, /* U+00fe29: */
+                                                     0, /* U+00fe2a: */
+                                                     0, /* U+00fe2b: */
+                                                     0, /* U+00fe2c: */
+                                                     0, /* U+00fe2d: */
+                                                     0, /* U+00fe2e: */
+                                                     0, /* U+00fe2f: */
+                                                     0, /* U+00fe30: PRESENTATION FORM FOR VERTICAL TWO DOT LEADER*/
+                                                     0, /* U+00fe31: PRESENTATION FORM FOR VERTICAL EM DASH*/
+                                                     0, /* U+00fe32: PRESENTATION FORM FOR VERTICAL EN DASH*/
+                                                     0, /* U+00fe33: PRESENTATION FORM FOR VERTICAL LOW LINE*/
+                                                     0, /* U+00fe34: PRESENTATION FORM FOR VERTICAL WAVY LOW LINE*/
+                                                     0, /* U+00fe35: PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS*/
+                                                     0, /* U+00fe36: PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS*/
+                                                     0, /* U+00fe37: PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET*/
+                                                     0, /* U+00fe38: PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET*/
+                                                     0, /* U+00fe39: PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+00fe3a: PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+00fe3b: PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET*/
+                                                     0, /* U+00fe3c: PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET*/
+                                                     0, /* U+00fe3d: PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+00fe3e: PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET*/
+                                                     0, /* U+00fe3f: PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET*/
+                                                     0, /* U+00fe40: PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET*/
+                                                     0, /* U+00fe41: PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/
+                                                     0, /* U+00fe42: PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/
+                                                     0, /* U+00fe43: PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/
+                                                     0, /* U+00fe44: PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/
+                                                     0, /* U+00fe45: SESAME DOT*/
+                                                     0, /* U+00fe46: WHITE SESAME DOT*/
+                                                     0, /* U+00fe47: PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET*/
+                                                     0, /* U+00fe48: PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET*/
+                                                     0, /* U+00fe49: DASHED OVERLINE*/
+                                                     0, /* U+00fe4a: CENTRELINE OVERLINE*/
+                                                     0, /* U+00fe4b: WAVY OVERLINE*/
+                                                     0, /* U+00fe4c: DOUBLE WAVY OVERLINE*/
+                                                     0, /* U+00fe4d: DASHED LOW LINE*/
+                                                     0, /* U+00fe4e: CENTRELINE LOW LINE*/
+                                                     0, /* U+00fe4f: WAVY LOW LINE*/
+                                                     0, /* U+00fe50: SMALL COMMA*/
+                                                     0, /* U+00fe51: SMALL IDEOGRAPHIC COMMA*/
+                                                     0, /* U+00fe52: SMALL FULL STOP*/
+                                                     0, /* U+00fe53: */
+                                                     0, /* U+00fe54: SMALL SEMICOLON*/
+                                                     0, /* U+00fe55: SMALL COLON*/
+                                                     0, /* U+00fe56: SMALL QUESTION MARK*/
+                                                     0, /* U+00fe57: SMALL EXCLAMATION MARK*/
+                                                     0, /* U+00fe58: SMALL EM DASH*/
+                                                     0, /* U+00fe59: SMALL LEFT PARENTHESIS*/
+                                                     0, /* U+00fe5a: SMALL RIGHT PARENTHESIS*/
+                                                     0, /* U+00fe5b: SMALL LEFT CURLY BRACKET*/
+                                                     0, /* U+00fe5c: SMALL RIGHT CURLY BRACKET*/
+                                                     0, /* U+00fe5d: SMALL LEFT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+00fe5e: SMALL RIGHT TORTOISE SHELL BRACKET*/
+                                                     0, /* U+00fe5f: SMALL NUMBER SIGN*/
+                                                     0, /* U+00fe60: SMALL AMPERSAND*/
+                                                     0, /* U+00fe61: SMALL ASTERISK*/
+                                                     0, /* U+00fe62: SMALL PLUS SIGN*/
+                                                     0, /* U+00fe63: SMALL HYPHEN-MINUS*/
+                                                     0, /* U+00fe64: SMALL LESS-THAN SIGN*/
+                                                     0, /* U+00fe65: SMALL GREATER-THAN SIGN*/
+                                                     0, /* U+00fe66: SMALL EQUALS SIGN*/
+                                                     0, /* U+00fe67: */
+                                                     0, /* U+00fe68: SMALL REVERSE SOLIDUS*/
+                                                     0, /* U+00fe69: SMALL DOLLAR SIGN*/
+                                                     0, /* U+00fe6a: SMALL PERCENT SIGN*/
+                                                     0, /* U+00fe6b: SMALL COMMERCIAL AT*/
+                                                     0, /* U+00fe6c: */
+                                                     0, /* U+00fe6d: */
+                                                     0, /* U+00fe6e: */
+                                                     0, /* U+00fe6f: */
+                                           RTUNI_ALPHA, /* U+00fe70: ARABIC FATHATAN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe71: ARABIC TATWEEL WITH FATHATAN ABOVE*/
+                                           RTUNI_ALPHA, /* U+00fe72: ARABIC DAMMATAN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe73: ARABIC TAIL FRAGMENT*/
+                                           RTUNI_ALPHA, /* U+00fe74: ARABIC KASRATAN ISOLATED FORM*/
+                                                     0, /* U+00fe75: */
+                                           RTUNI_ALPHA, /* U+00fe76: ARABIC FATHA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe77: ARABIC FATHA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe78: ARABIC DAMMA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe79: ARABIC DAMMA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7a: ARABIC KASRA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7b: ARABIC KASRA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7c: ARABIC SHADDA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7d: ARABIC SHADDA MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7e: ARABIC SUKUN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe7f: ARABIC SUKUN MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe80: ARABIC LETTER HAMZA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe81: ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe82: ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe83: ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe84: ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe85: ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe86: ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe87: ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe88: ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe89: ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8a: ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8b: ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8c: ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8d: ARABIC LETTER ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8e: ARABIC LETTER ALEF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe8f: ARABIC LETTER BEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe90: ARABIC LETTER BEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe91: ARABIC LETTER BEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe92: ARABIC LETTER BEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe93: ARABIC LETTER TEH MARBUTA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe94: ARABIC LETTER TEH MARBUTA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe95: ARABIC LETTER TEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe96: ARABIC LETTER TEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe97: ARABIC LETTER TEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe98: ARABIC LETTER TEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe99: ARABIC LETTER THEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9a: ARABIC LETTER THEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9b: ARABIC LETTER THEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9c: ARABIC LETTER THEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9d: ARABIC LETTER JEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9e: ARABIC LETTER JEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fe9f: ARABIC LETTER JEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea0: ARABIC LETTER JEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea1: ARABIC LETTER HAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fea2: ARABIC LETTER HAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea3: ARABIC LETTER HAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea4: ARABIC LETTER HAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea5: ARABIC LETTER KHAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fea6: ARABIC LETTER KHAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea7: ARABIC LETTER KHAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea8: ARABIC LETTER KHAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fea9: ARABIC LETTER DAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feaa: ARABIC LETTER DAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feab: ARABIC LETTER THAL ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feac: ARABIC LETTER THAL FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fead: ARABIC LETTER REH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feae: ARABIC LETTER REH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feaf: ARABIC LETTER ZAIN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feb0: ARABIC LETTER ZAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb1: ARABIC LETTER SEEN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feb2: ARABIC LETTER SEEN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb3: ARABIC LETTER SEEN INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb4: ARABIC LETTER SEEN MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb5: ARABIC LETTER SHEEN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feb6: ARABIC LETTER SHEEN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb7: ARABIC LETTER SHEEN INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb8: ARABIC LETTER SHEEN MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feb9: ARABIC LETTER SAD ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feba: ARABIC LETTER SAD FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00febb: ARABIC LETTER SAD INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00febc: ARABIC LETTER SAD MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00febd: ARABIC LETTER DAD ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00febe: ARABIC LETTER DAD FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00febf: ARABIC LETTER DAD INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec0: ARABIC LETTER DAD MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec1: ARABIC LETTER TAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fec2: ARABIC LETTER TAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec3: ARABIC LETTER TAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec4: ARABIC LETTER TAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec5: ARABIC LETTER ZAH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fec6: ARABIC LETTER ZAH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec7: ARABIC LETTER ZAH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec8: ARABIC LETTER ZAH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fec9: ARABIC LETTER AIN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feca: ARABIC LETTER AIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fecb: ARABIC LETTER AIN INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fecc: ARABIC LETTER AIN MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fecd: ARABIC LETTER GHAIN ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fece: ARABIC LETTER GHAIN FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fecf: ARABIC LETTER GHAIN INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed0: ARABIC LETTER GHAIN MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed1: ARABIC LETTER FEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fed2: ARABIC LETTER FEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed3: ARABIC LETTER FEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed4: ARABIC LETTER FEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed5: ARABIC LETTER QAF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fed6: ARABIC LETTER QAF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed7: ARABIC LETTER QAF INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed8: ARABIC LETTER QAF MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fed9: ARABIC LETTER KAF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feda: ARABIC LETTER KAF FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fedb: ARABIC LETTER KAF INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fedc: ARABIC LETTER KAF MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fedd: ARABIC LETTER LAM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fede: ARABIC LETTER LAM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fedf: ARABIC LETTER LAM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee0: ARABIC LETTER LAM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee1: ARABIC LETTER MEEM ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fee2: ARABIC LETTER MEEM FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee3: ARABIC LETTER MEEM INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee4: ARABIC LETTER MEEM MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee5: ARABIC LETTER NOON ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fee6: ARABIC LETTER NOON FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee7: ARABIC LETTER NOON INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee8: ARABIC LETTER NOON MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fee9: ARABIC LETTER HEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feea: ARABIC LETTER HEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feeb: ARABIC LETTER HEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feec: ARABIC LETTER HEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feed: ARABIC LETTER WAW ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00feee: ARABIC LETTER WAW FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00feef: ARABIC LETTER ALEF MAKSURA ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fef0: ARABIC LETTER ALEF MAKSURA FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef1: ARABIC LETTER YEH ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fef2: ARABIC LETTER YEH FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef3: ARABIC LETTER YEH INITIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef4: ARABIC LETTER YEH MEDIAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef5: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fef6: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef7: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fef8: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fef9: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fefa: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM*/
+                                           RTUNI_ALPHA, /* U+00fefb: ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM*/
+                                           RTUNI_ALPHA, /* U+00fefc: ARABIC LIGATURE LAM WITH ALEF FINAL FORM*/
+                                                     0, /* U+00fefd: */
+                                                     0, /* U+00fefe: */
+                                                     0, /* U+00feff: ZERO WIDTH NO-BREAK SPACE*/
+                                                     0, /* U+00ff00: */
+                                                     0, /* U+00ff01: FULLWIDTH EXCLAMATION MARK*/
+                                                     0, /* U+00ff02: FULLWIDTH QUOTATION MARK*/
+                                                     0, /* U+00ff03: FULLWIDTH NUMBER SIGN*/
+                                                     0, /* U+00ff04: FULLWIDTH DOLLAR SIGN*/
+                                                     0, /* U+00ff05: FULLWIDTH PERCENT SIGN*/
+                                                     0, /* U+00ff06: FULLWIDTH AMPERSAND*/
+                                                     0, /* U+00ff07: FULLWIDTH APOSTROPHE*/
+                                                     0, /* U+00ff08: FULLWIDTH LEFT PARENTHESIS*/
+                                                     0, /* U+00ff09: FULLWIDTH RIGHT PARENTHESIS*/
+                                                     0, /* U+00ff0a: FULLWIDTH ASTERISK*/
+                                                     0, /* U+00ff0b: FULLWIDTH PLUS SIGN*/
+                                                     0, /* U+00ff0c: FULLWIDTH COMMA*/
+                                                     0, /* U+00ff0d: FULLWIDTH HYPHEN-MINUS*/
+                                                     0, /* U+00ff0e: FULLWIDTH FULL STOP*/
+                                                     0, /* U+00ff0f: FULLWIDTH SOLIDUS*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff10: FULLWIDTH DIGIT ZERO*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff11: FULLWIDTH DIGIT ONE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff12: FULLWIDTH DIGIT TWO*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff13: FULLWIDTH DIGIT THREE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff14: FULLWIDTH DIGIT FOUR*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff15: FULLWIDTH DIGIT FIVE*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff16: FULLWIDTH DIGIT SIX*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff17: FULLWIDTH DIGIT SEVEN*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff18: FULLWIDTH DIGIT EIGHT*/
+                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff19: FULLWIDTH DIGIT NINE*/
+                                                     0, /* U+00ff1a: FULLWIDTH COLON*/
+                                                     0, /* U+00ff1b: FULLWIDTH SEMICOLON*/
+                                                     0, /* U+00ff1c: FULLWIDTH LESS-THAN SIGN*/
+                                                     0, /* U+00ff1d: FULLWIDTH EQUALS SIGN*/
+                                                     0, /* U+00ff1e: FULLWIDTH GREATER-THAN SIGN*/
+                                                     0, /* U+00ff1f: FULLWIDTH QUESTION MARK*/
+                                                     0, /* U+00ff20: FULLWIDTH COMMERCIAL AT*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
+                                                     0, /* U+00ff3b: FULLWIDTH LEFT SQUARE BRACKET*/
+                                                     0, /* U+00ff3c: FULLWIDTH REVERSE SOLIDUS*/
+                                                     0, /* U+00ff3d: FULLWIDTH RIGHT SQUARE BRACKET*/
+                                                     0, /* U+00ff3e: FULLWIDTH CIRCUMFLEX ACCENT*/
+                                                     0, /* U+00ff3f: FULLWIDTH LOW LINE*/
+                                                     0, /* U+00ff40: FULLWIDTH GRAVE ACCENT*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
+              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
+                                                     0, /* U+00ff5b: FULLWIDTH LEFT CURLY BRACKET*/
+                                                     0, /* U+00ff5c: FULLWIDTH VERTICAL LINE*/
+                                                     0, /* U+00ff5d: FULLWIDTH RIGHT CURLY BRACKET*/
+                                                     0, /* U+00ff5e: FULLWIDTH TILDE*/
+                                                     0, /* U+00ff5f: FULLWIDTH LEFT WHITE PARENTHESIS*/
+                                                     0, /* U+00ff60: FULLWIDTH RIGHT WHITE PARENTHESIS*/
+                                                     0, /* U+00ff61: HALFWIDTH IDEOGRAPHIC FULL STOP*/
+                                                     0, /* U+00ff62: HALFWIDTH LEFT CORNER BRACKET*/
+                                                     0, /* U+00ff63: HALFWIDTH RIGHT CORNER BRACKET*/
+                                                     0, /* U+00ff64: HALFWIDTH IDEOGRAPHIC COMMA*/
+                                                     0, /* U+00ff65: HALFWIDTH KATAKANA MIDDLE DOT*/
+                                           RTUNI_ALPHA, /* U+00ff66: HALFWIDTH KATAKANA LETTER WO*/
+                                           RTUNI_ALPHA, /* U+00ff67: HALFWIDTH KATAKANA LETTER SMALL A*/
+                                           RTUNI_ALPHA, /* U+00ff68: HALFWIDTH KATAKANA LETTER SMALL I*/
+                                           RTUNI_ALPHA, /* U+00ff69: HALFWIDTH KATAKANA LETTER SMALL U*/
+                                           RTUNI_ALPHA, /* U+00ff6a: HALFWIDTH KATAKANA LETTER SMALL E*/
+                                           RTUNI_ALPHA, /* U+00ff6b: HALFWIDTH KATAKANA LETTER SMALL O*/
+                                           RTUNI_ALPHA, /* U+00ff6c: HALFWIDTH KATAKANA LETTER SMALL YA*/
+                                           RTUNI_ALPHA, /* U+00ff6d: HALFWIDTH KATAKANA LETTER SMALL YU*/
+                                           RTUNI_ALPHA, /* U+00ff6e: HALFWIDTH KATAKANA LETTER SMALL YO*/
+                                           RTUNI_ALPHA, /* U+00ff6f: HALFWIDTH KATAKANA LETTER SMALL TU*/
+                                           RTUNI_ALPHA, /* U+00ff70: HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+00ff71: HALFWIDTH KATAKANA LETTER A*/
+                                           RTUNI_ALPHA, /* U+00ff72: HALFWIDTH KATAKANA LETTER I*/
+                                           RTUNI_ALPHA, /* U+00ff73: HALFWIDTH KATAKANA LETTER U*/
+                                           RTUNI_ALPHA, /* U+00ff74: HALFWIDTH KATAKANA LETTER E*/
+                                           RTUNI_ALPHA, /* U+00ff75: HALFWIDTH KATAKANA LETTER O*/
+                                           RTUNI_ALPHA, /* U+00ff76: HALFWIDTH KATAKANA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+00ff77: HALFWIDTH KATAKANA LETTER KI*/
+                                           RTUNI_ALPHA, /* U+00ff78: HALFWIDTH KATAKANA LETTER KU*/
+                                           RTUNI_ALPHA, /* U+00ff79: HALFWIDTH KATAKANA LETTER KE*/
+                                           RTUNI_ALPHA, /* U+00ff7a: HALFWIDTH KATAKANA LETTER KO*/
+                                           RTUNI_ALPHA, /* U+00ff7b: HALFWIDTH KATAKANA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+00ff7c: HALFWIDTH KATAKANA LETTER SI*/
+                                           RTUNI_ALPHA, /* U+00ff7d: HALFWIDTH KATAKANA LETTER SU*/
+                                           RTUNI_ALPHA, /* U+00ff7e: HALFWIDTH KATAKANA LETTER SE*/
+                                           RTUNI_ALPHA, /* U+00ff7f: HALFWIDTH KATAKANA LETTER SO*/
+                                           RTUNI_ALPHA, /* U+00ff80: HALFWIDTH KATAKANA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+00ff81: HALFWIDTH KATAKANA LETTER TI*/
+                                           RTUNI_ALPHA, /* U+00ff82: HALFWIDTH KATAKANA LETTER TU*/
+                                           RTUNI_ALPHA, /* U+00ff83: HALFWIDTH KATAKANA LETTER TE*/
+                                           RTUNI_ALPHA, /* U+00ff84: HALFWIDTH KATAKANA LETTER TO*/
+                                           RTUNI_ALPHA, /* U+00ff85: HALFWIDTH KATAKANA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+00ff86: HALFWIDTH KATAKANA LETTER NI*/
+                                           RTUNI_ALPHA, /* U+00ff87: HALFWIDTH KATAKANA LETTER NU*/
+                                           RTUNI_ALPHA, /* U+00ff88: HALFWIDTH KATAKANA LETTER NE*/
+                                           RTUNI_ALPHA, /* U+00ff89: HALFWIDTH KATAKANA LETTER NO*/
+                                           RTUNI_ALPHA, /* U+00ff8a: HALFWIDTH KATAKANA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+00ff8b: HALFWIDTH KATAKANA LETTER HI*/
+                                           RTUNI_ALPHA, /* U+00ff8c: HALFWIDTH KATAKANA LETTER HU*/
+                                           RTUNI_ALPHA, /* U+00ff8d: HALFWIDTH KATAKANA LETTER HE*/
+                                           RTUNI_ALPHA, /* U+00ff8e: HALFWIDTH KATAKANA LETTER HO*/
+                                           RTUNI_ALPHA, /* U+00ff8f: HALFWIDTH KATAKANA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+00ff90: HALFWIDTH KATAKANA LETTER MI*/
+                                           RTUNI_ALPHA, /* U+00ff91: HALFWIDTH KATAKANA LETTER MU*/
+                                           RTUNI_ALPHA, /* U+00ff92: HALFWIDTH KATAKANA LETTER ME*/
+                                           RTUNI_ALPHA, /* U+00ff93: HALFWIDTH KATAKANA LETTER MO*/
+                                           RTUNI_ALPHA, /* U+00ff94: HALFWIDTH KATAKANA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00ff95: HALFWIDTH KATAKANA LETTER YU*/
+                                           RTUNI_ALPHA, /* U+00ff96: HALFWIDTH KATAKANA LETTER YO*/
+                                           RTUNI_ALPHA, /* U+00ff97: HALFWIDTH KATAKANA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+00ff98: HALFWIDTH KATAKANA LETTER RI*/
+                                           RTUNI_ALPHA, /* U+00ff99: HALFWIDTH KATAKANA LETTER RU*/
+                                           RTUNI_ALPHA, /* U+00ff9a: HALFWIDTH KATAKANA LETTER RE*/
+                                           RTUNI_ALPHA, /* U+00ff9b: HALFWIDTH KATAKANA LETTER RO*/
+                                           RTUNI_ALPHA, /* U+00ff9c: HALFWIDTH KATAKANA LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00ff9d: HALFWIDTH KATAKANA LETTER N*/
+                                           RTUNI_ALPHA, /* U+00ff9e: HALFWIDTH KATAKANA VOICED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+00ff9f: HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK*/
+                                           RTUNI_ALPHA, /* U+00ffa0: HALFWIDTH HANGUL FILLER*/
+                                           RTUNI_ALPHA, /* U+00ffa1: HALFWIDTH HANGUL LETTER KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00ffa2: HALFWIDTH HANGUL LETTER SSANGKIYEOK*/
+                                           RTUNI_ALPHA, /* U+00ffa3: HALFWIDTH HANGUL LETTER KIYEOK-SIOS*/
+                                           RTUNI_ALPHA, /* U+00ffa4: HALFWIDTH HANGUL LETTER NIEUN*/
+                                           RTUNI_ALPHA, /* U+00ffa5: HALFWIDTH HANGUL LETTER NIEUN-CIEUC*/
+                                           RTUNI_ALPHA, /* U+00ffa6: HALFWIDTH HANGUL LETTER NIEUN-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00ffa7: HALFWIDTH HANGUL LETTER TIKEUT*/
+                                           RTUNI_ALPHA, /* U+00ffa8: HALFWIDTH HANGUL LETTER SSANGTIKEUT*/
+                                           RTUNI_ALPHA, /* U+00ffa9: HALFWIDTH HANGUL LETTER RIEUL*/
+                                           RTUNI_ALPHA, /* U+00ffaa: HALFWIDTH HANGUL LETTER RIEUL-KIYEOK*/
+                                           RTUNI_ALPHA, /* U+00ffab: HALFWIDTH HANGUL LETTER RIEUL-MIEUM*/
+                                           RTUNI_ALPHA, /* U+00ffac: HALFWIDTH HANGUL LETTER RIEUL-PIEUP*/
+                                           RTUNI_ALPHA, /* U+00ffad: HALFWIDTH HANGUL LETTER RIEUL-SIOS*/
+                                           RTUNI_ALPHA, /* U+00ffae: HALFWIDTH HANGUL LETTER RIEUL-THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00ffaf: HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00ffb0: HALFWIDTH HANGUL LETTER RIEUL-HIEUH*/
+                                           RTUNI_ALPHA, /* U+00ffb1: HALFWIDTH HANGUL LETTER MIEUM*/
+                                           RTUNI_ALPHA, /* U+00ffb2: HALFWIDTH HANGUL LETTER PIEUP*/
+                                           RTUNI_ALPHA, /* U+00ffb3: HALFWIDTH HANGUL LETTER SSANGPIEUP*/
+                                           RTUNI_ALPHA, /* U+00ffb4: HALFWIDTH HANGUL LETTER PIEUP-SIOS*/
+                                           RTUNI_ALPHA, /* U+00ffb5: HALFWIDTH HANGUL LETTER SIOS*/
+                                           RTUNI_ALPHA, /* U+00ffb6: HALFWIDTH HANGUL LETTER SSANGSIOS*/
+                                           RTUNI_ALPHA, /* U+00ffb7: HALFWIDTH HANGUL LETTER IEUNG*/
+                                           RTUNI_ALPHA, /* U+00ffb8: HALFWIDTH HANGUL LETTER CIEUC*/
+                                           RTUNI_ALPHA, /* U+00ffb9: HALFWIDTH HANGUL LETTER SSANGCIEUC*/
+                                           RTUNI_ALPHA, /* U+00ffba: HALFWIDTH HANGUL LETTER CHIEUCH*/
+                                           RTUNI_ALPHA, /* U+00ffbb: HALFWIDTH HANGUL LETTER KHIEUKH*/
+                                           RTUNI_ALPHA, /* U+00ffbc: HALFWIDTH HANGUL LETTER THIEUTH*/
+                                           RTUNI_ALPHA, /* U+00ffbd: HALFWIDTH HANGUL LETTER PHIEUPH*/
+                                           RTUNI_ALPHA, /* U+00ffbe: HALFWIDTH HANGUL LETTER HIEUH*/
+                                                     0, /* U+00ffbf: */
+                                                     0, /* U+00ffc0: */
+                                                     0, /* U+00ffc1: */
+                                           RTUNI_ALPHA, /* U+00ffc2: HALFWIDTH HANGUL LETTER A*/
+                                           RTUNI_ALPHA, /* U+00ffc3: HALFWIDTH HANGUL LETTER AE*/
+                                           RTUNI_ALPHA, /* U+00ffc4: HALFWIDTH HANGUL LETTER YA*/
+                                           RTUNI_ALPHA, /* U+00ffc5: HALFWIDTH HANGUL LETTER YAE*/
+                                           RTUNI_ALPHA, /* U+00ffc6: HALFWIDTH HANGUL LETTER EO*/
+                                           RTUNI_ALPHA, /* U+00ffc7: HALFWIDTH HANGUL LETTER E*/
+                                                     0, /* U+00ffc8: */
+                                                     0, /* U+00ffc9: */
+                                           RTUNI_ALPHA, /* U+00ffca: HALFWIDTH HANGUL LETTER YEO*/
+                                           RTUNI_ALPHA, /* U+00ffcb: HALFWIDTH HANGUL LETTER YE*/
+                                           RTUNI_ALPHA, /* U+00ffcc: HALFWIDTH HANGUL LETTER O*/
+                                           RTUNI_ALPHA, /* U+00ffcd: HALFWIDTH HANGUL LETTER WA*/
+                                           RTUNI_ALPHA, /* U+00ffce: HALFWIDTH HANGUL LETTER WAE*/
+                                           RTUNI_ALPHA, /* U+00ffcf: HALFWIDTH HANGUL LETTER OE*/
+                                                     0, /* U+00ffd0: */
+                                                     0, /* U+00ffd1: */
+                                           RTUNI_ALPHA, /* U+00ffd2: HALFWIDTH HANGUL LETTER YO*/
+                                           RTUNI_ALPHA, /* U+00ffd3: HALFWIDTH HANGUL LETTER U*/
+                                           RTUNI_ALPHA, /* U+00ffd4: HALFWIDTH HANGUL LETTER WEO*/
+                                           RTUNI_ALPHA, /* U+00ffd5: HALFWIDTH HANGUL LETTER WE*/
+                                           RTUNI_ALPHA, /* U+00ffd6: HALFWIDTH HANGUL LETTER WI*/
+                                           RTUNI_ALPHA, /* U+00ffd7: HALFWIDTH HANGUL LETTER YU*/
+                                                     0, /* U+00ffd8: */
+                                                     0, /* U+00ffd9: */
+                                           RTUNI_ALPHA, /* U+00ffda: HALFWIDTH HANGUL LETTER EU*/
+                                           RTUNI_ALPHA, /* U+00ffdb: HALFWIDTH HANGUL LETTER YI*/
+                                           RTUNI_ALPHA, /* U+00ffdc: HALFWIDTH HANGUL LETTER I*/
+                                                     0, /* U+00ffdd: */
+                                                     0, /* U+00ffde: */
+                                                     0, /* U+00ffdf: */
+                                                     0, /* U+00ffe0: FULLWIDTH CENT SIGN*/
+                                                     0, /* U+00ffe1: FULLWIDTH POUND SIGN*/
+                                                     0, /* U+00ffe2: FULLWIDTH NOT SIGN*/
+                                                     0, /* U+00ffe3: FULLWIDTH MACRON*/
+                                                     0, /* U+00ffe4: FULLWIDTH BROKEN BAR*/
+                                                     0, /* U+00ffe5: FULLWIDTH YEN SIGN*/
+                                                     0, /* U+00ffe6: FULLWIDTH WON SIGN*/
+                                                     0, /* U+00ffe7: */
+                                                     0, /* U+00ffe8: HALFWIDTH FORMS LIGHT VERTICAL*/
+                                                     0, /* U+00ffe9: HALFWIDTH LEFTWARDS ARROW*/
+                                                     0, /* U+00ffea: HALFWIDTH UPWARDS ARROW*/
+                                                     0, /* U+00ffeb: HALFWIDTH RIGHTWARDS ARROW*/
+                                                     0, /* U+00ffec: HALFWIDTH DOWNWARDS ARROW*/
+                                                     0, /* U+00ffed: HALFWIDTH BLACK SQUARE*/
+                                                     0, /* U+00ffee: HALFWIDTH WHITE CIRCLE*/
+                                                     0, /* U+00ffef: */
+                                                     0, /* U+00fff0: */
+                                                     0, /* U+00fff1: */
+                                                     0, /* U+00fff2: */
+                                                     0, /* U+00fff3: */
+                                                     0, /* U+00fff4: */
+                                                     0, /* U+00fff5: */
+                                                     0, /* U+00fff6: */
+                                                     0, /* U+00fff7: */
+                                                     0, /* U+00fff8: */
+                                                     0, /* U+00fff9: INTERLINEAR ANNOTATION ANCHOR*/
+                                                     0, /* U+00fffa: INTERLINEAR ANNOTATION SEPARATOR*/
+                                                     0, /* U+00fffb: INTERLINEAR ANNOTATION TERMINATOR*/
+                                                     0, /* U+00fffc: OBJECT REPLACEMENT CHARACTER*/
+                                                     0, /* U+00fffd: REPLACEMENT CHARACTER*/
+                                                     0, /* U+00fffe: */
+                                                     0, /* U+00ffff: */
+                                           RTUNI_ALPHA, /* U+010000: LINEAR B SYLLABLE B008 A*/
+                                           RTUNI_ALPHA, /* U+010001: LINEAR B SYLLABLE B038 E*/
+                                           RTUNI_ALPHA, /* U+010002: LINEAR B SYLLABLE B028 I*/
+                                           RTUNI_ALPHA, /* U+010003: LINEAR B SYLLABLE B061 O*/
+                                           RTUNI_ALPHA, /* U+010004: LINEAR B SYLLABLE B010 U*/
+                                           RTUNI_ALPHA, /* U+010005: LINEAR B SYLLABLE B001 DA*/
+                                           RTUNI_ALPHA, /* U+010006: LINEAR B SYLLABLE B045 DE*/
+                                           RTUNI_ALPHA, /* U+010007: LINEAR B SYLLABLE B007 DI*/
+                                           RTUNI_ALPHA, /* U+010008: LINEAR B SYLLABLE B014 DO*/
+                                           RTUNI_ALPHA, /* U+010009: LINEAR B SYLLABLE B051 DU*/
+                                           RTUNI_ALPHA, /* U+01000a: LINEAR B SYLLABLE B057 JA*/
+                                           RTUNI_ALPHA, /* U+01000b: LINEAR B SYLLABLE B046 JE*/
+                                                     0, /* U+01000c: */
+                                           RTUNI_ALPHA, /* U+01000d: LINEAR B SYLLABLE B036 JO*/
+                                           RTUNI_ALPHA, /* U+01000e: LINEAR B SYLLABLE B065 JU*/
+                                           RTUNI_ALPHA, /* U+01000f: LINEAR B SYLLABLE B077 KA*/
+                                           RTUNI_ALPHA, /* U+010010: LINEAR B SYLLABLE B044 KE*/
+                                           RTUNI_ALPHA, /* U+010011: LINEAR B SYLLABLE B067 KI*/
+                                           RTUNI_ALPHA, /* U+010012: LINEAR B SYLLABLE B070 KO*/
+                                           RTUNI_ALPHA, /* U+010013: LINEAR B SYLLABLE B081 KU*/
+                                           RTUNI_ALPHA, /* U+010014: LINEAR B SYLLABLE B080 MA*/
+                                           RTUNI_ALPHA, /* U+010015: LINEAR B SYLLABLE B013 ME*/
+                                           RTUNI_ALPHA, /* U+010016: LINEAR B SYLLABLE B073 MI*/
+                                           RTUNI_ALPHA, /* U+010017: LINEAR B SYLLABLE B015 MO*/
+                                           RTUNI_ALPHA, /* U+010018: LINEAR B SYLLABLE B023 MU*/
+                                           RTUNI_ALPHA, /* U+010019: LINEAR B SYLLABLE B006 NA*/
+                                           RTUNI_ALPHA, /* U+01001a: LINEAR B SYLLABLE B024 NE*/
+                                           RTUNI_ALPHA, /* U+01001b: LINEAR B SYLLABLE B030 NI*/
+                                           RTUNI_ALPHA, /* U+01001c: LINEAR B SYLLABLE B052 NO*/
+                                           RTUNI_ALPHA, /* U+01001d: LINEAR B SYLLABLE B055 NU*/
+                                           RTUNI_ALPHA, /* U+01001e: LINEAR B SYLLABLE B003 PA*/
+                                           RTUNI_ALPHA, /* U+01001f: LINEAR B SYLLABLE B072 PE*/
+                                           RTUNI_ALPHA, /* U+010020: LINEAR B SYLLABLE B039 PI*/
+                                           RTUNI_ALPHA, /* U+010021: LINEAR B SYLLABLE B011 PO*/
+                                           RTUNI_ALPHA, /* U+010022: LINEAR B SYLLABLE B050 PU*/
+                                           RTUNI_ALPHA, /* U+010023: LINEAR B SYLLABLE B016 QA*/
+                                           RTUNI_ALPHA, /* U+010024: LINEAR B SYLLABLE B078 QE*/
+                                           RTUNI_ALPHA, /* U+010025: LINEAR B SYLLABLE B021 QI*/
+                                           RTUNI_ALPHA, /* U+010026: LINEAR B SYLLABLE B032 QO*/
+                                                     0, /* U+010027: */
+                                           RTUNI_ALPHA, /* U+010028: LINEAR B SYLLABLE B060 RA*/
+                                           RTUNI_ALPHA, /* U+010029: LINEAR B SYLLABLE B027 RE*/
+                                           RTUNI_ALPHA, /* U+01002a: LINEAR B SYLLABLE B053 RI*/
+                                           RTUNI_ALPHA, /* U+01002b: LINEAR B SYLLABLE B002 RO*/
+                                           RTUNI_ALPHA, /* U+01002c: LINEAR B SYLLABLE B026 RU*/
+                                           RTUNI_ALPHA, /* U+01002d: LINEAR B SYLLABLE B031 SA*/
+                                           RTUNI_ALPHA, /* U+01002e: LINEAR B SYLLABLE B009 SE*/
+                                           RTUNI_ALPHA, /* U+01002f: LINEAR B SYLLABLE B041 SI*/
+                                           RTUNI_ALPHA, /* U+010030: LINEAR B SYLLABLE B012 SO*/
+                                           RTUNI_ALPHA, /* U+010031: LINEAR B SYLLABLE B058 SU*/
+                                           RTUNI_ALPHA, /* U+010032: LINEAR B SYLLABLE B059 TA*/
+                                           RTUNI_ALPHA, /* U+010033: LINEAR B SYLLABLE B004 TE*/
+                                           RTUNI_ALPHA, /* U+010034: LINEAR B SYLLABLE B037 TI*/
+                                           RTUNI_ALPHA, /* U+010035: LINEAR B SYLLABLE B005 TO*/
+                                           RTUNI_ALPHA, /* U+010036: LINEAR B SYLLABLE B069 TU*/
+                                           RTUNI_ALPHA, /* U+010037: LINEAR B SYLLABLE B054 WA*/
+                                           RTUNI_ALPHA, /* U+010038: LINEAR B SYLLABLE B075 WE*/
+                                           RTUNI_ALPHA, /* U+010039: LINEAR B SYLLABLE B040 WI*/
+                                           RTUNI_ALPHA, /* U+01003a: LINEAR B SYLLABLE B042 WO*/
+                                                     0, /* U+01003b: */
+                                           RTUNI_ALPHA, /* U+01003c: LINEAR B SYLLABLE B017 ZA*/
+                                           RTUNI_ALPHA, /* U+01003d: LINEAR B SYLLABLE B074 ZE*/
+                                                     0, /* U+01003e: */
+                                           RTUNI_ALPHA, /* U+01003f: LINEAR B SYLLABLE B020 ZO*/
+                                           RTUNI_ALPHA, /* U+010040: LINEAR B SYLLABLE B025 A2*/
+                                           RTUNI_ALPHA, /* U+010041: LINEAR B SYLLABLE B043 A3*/
+                                           RTUNI_ALPHA, /* U+010042: LINEAR B SYLLABLE B085 AU*/
+                                           RTUNI_ALPHA, /* U+010043: LINEAR B SYLLABLE B071 DWE*/
+                                           RTUNI_ALPHA, /* U+010044: LINEAR B SYLLABLE B090 DWO*/
+                                           RTUNI_ALPHA, /* U+010045: LINEAR B SYLLABLE B048 NWA*/
+                                           RTUNI_ALPHA, /* U+010046: LINEAR B SYLLABLE B029 PU2*/
+                                           RTUNI_ALPHA, /* U+010047: LINEAR B SYLLABLE B062 PTE*/
+                                           RTUNI_ALPHA, /* U+010048: LINEAR B SYLLABLE B076 RA2*/
+                                           RTUNI_ALPHA, /* U+010049: LINEAR B SYLLABLE B033 RA3*/
+                                           RTUNI_ALPHA, /* U+01004a: LINEAR B SYLLABLE B068 RO2*/
+                                           RTUNI_ALPHA, /* U+01004b: LINEAR B SYLLABLE B066 TA2*/
+                                           RTUNI_ALPHA, /* U+01004c: LINEAR B SYLLABLE B087 TWE*/
+                                           RTUNI_ALPHA, /* U+01004d: LINEAR B SYLLABLE B091 TWO*/
+                                                     0, /* U+01004e: */
+                                                     0, /* U+01004f: */
+                                           RTUNI_ALPHA, /* U+010050: LINEAR B SYMBOL B018*/
+                                           RTUNI_ALPHA, /* U+010051: LINEAR B SYMBOL B019*/
+                                           RTUNI_ALPHA, /* U+010052: LINEAR B SYMBOL B022*/
+                                           RTUNI_ALPHA, /* U+010053: LINEAR B SYMBOL B034*/
+                                           RTUNI_ALPHA, /* U+010054: LINEAR B SYMBOL B047*/
+                                           RTUNI_ALPHA, /* U+010055: LINEAR B SYMBOL B049*/
+                                           RTUNI_ALPHA, /* U+010056: LINEAR B SYMBOL B056*/
+                                           RTUNI_ALPHA, /* U+010057: LINEAR B SYMBOL B063*/
+                                           RTUNI_ALPHA, /* U+010058: LINEAR B SYMBOL B064*/
+                                           RTUNI_ALPHA, /* U+010059: LINEAR B SYMBOL B079*/
+                                           RTUNI_ALPHA, /* U+01005a: LINEAR B SYMBOL B082*/
+                                           RTUNI_ALPHA, /* U+01005b: LINEAR B SYMBOL B083*/
+                                           RTUNI_ALPHA, /* U+01005c: LINEAR B SYMBOL B086*/
+                                           RTUNI_ALPHA, /* U+01005d: LINEAR B SYMBOL B089*/
+                                                     0, /* U+01005e: */
+                                                     0, /* U+01005f: */
+                                                     0, /* U+010060: */
+                                                     0, /* U+010061: */
+                                                     0, /* U+010062: */
+                                                     0, /* U+010063: */
+                                                     0, /* U+010064: */
+                                                     0, /* U+010065: */
+                                                     0, /* U+010066: */
+                                                     0, /* U+010067: */
+                                                     0, /* U+010068: */
+                                                     0, /* U+010069: */
+                                                     0, /* U+01006a: */
+                                                     0, /* U+01006b: */
+                                                     0, /* U+01006c: */
+                                                     0, /* U+01006d: */
+                                                     0, /* U+01006e: */
+                                                     0, /* U+01006f: */
+                                                     0, /* U+010070: */
+                                                     0, /* U+010071: */
+                                                     0, /* U+010072: */
+                                                     0, /* U+010073: */
+                                                     0, /* U+010074: */
+                                                     0, /* U+010075: */
+                                                     0, /* U+010076: */
+                                                     0, /* U+010077: */
+                                                     0, /* U+010078: */
+                                                     0, /* U+010079: */
+                                                     0, /* U+01007a: */
+                                                     0, /* U+01007b: */
+                                                     0, /* U+01007c: */
+                                                     0, /* U+01007d: */
+                                                     0, /* U+01007e: */
+                                                     0, /* U+01007f: */
+                                           RTUNI_ALPHA, /* U+010080: LINEAR B IDEOGRAM B100 MAN*/
+                                           RTUNI_ALPHA, /* U+010081: LINEAR B IDEOGRAM B102 WOMAN*/
+                                           RTUNI_ALPHA, /* U+010082: LINEAR B IDEOGRAM B104 DEER*/
+                                           RTUNI_ALPHA, /* U+010083: LINEAR B IDEOGRAM B105 EQUID*/
+                                           RTUNI_ALPHA, /* U+010084: LINEAR B IDEOGRAM B105F MARE*/
+                                           RTUNI_ALPHA, /* U+010085: LINEAR B IDEOGRAM B105M STALLION*/
+                                           RTUNI_ALPHA, /* U+010086: LINEAR B IDEOGRAM B106F EWE*/
+                                           RTUNI_ALPHA, /* U+010087: LINEAR B IDEOGRAM B106M RAM*/
+                                           RTUNI_ALPHA, /* U+010088: LINEAR B IDEOGRAM B107F SHE-GOAT*/
+                                           RTUNI_ALPHA, /* U+010089: LINEAR B IDEOGRAM B107M HE-GOAT*/
+                                           RTUNI_ALPHA, /* U+01008a: LINEAR B IDEOGRAM B108F SOW*/
+                                           RTUNI_ALPHA, /* U+01008b: LINEAR B IDEOGRAM B108M BOAR*/
+                                           RTUNI_ALPHA, /* U+01008c: LINEAR B IDEOGRAM B109F COW*/
+                                           RTUNI_ALPHA, /* U+01008d: LINEAR B IDEOGRAM B109M BULL*/
+                                           RTUNI_ALPHA, /* U+01008e: LINEAR B IDEOGRAM B120 WHEAT*/
+                                           RTUNI_ALPHA, /* U+01008f: LINEAR B IDEOGRAM B121 BARLEY*/
+                                           RTUNI_ALPHA, /* U+010090: LINEAR B IDEOGRAM B122 OLIVE*/
+                                           RTUNI_ALPHA, /* U+010091: LINEAR B IDEOGRAM B123 SPICE*/
+                                           RTUNI_ALPHA, /* U+010092: LINEAR B IDEOGRAM B125 CYPERUS*/
+                                           RTUNI_ALPHA, /* U+010093: LINEAR B MONOGRAM B127 KAPO*/
+                                           RTUNI_ALPHA, /* U+010094: LINEAR B MONOGRAM B128 KANAKO*/
+                                           RTUNI_ALPHA, /* U+010095: LINEAR B IDEOGRAM B130 OIL*/
+                                           RTUNI_ALPHA, /* U+010096: LINEAR B IDEOGRAM B131 WINE*/
+                                           RTUNI_ALPHA, /* U+010097: LINEAR B IDEOGRAM B132*/
+                                           RTUNI_ALPHA, /* U+010098: LINEAR B MONOGRAM B133 AREPA*/
+                                           RTUNI_ALPHA, /* U+010099: LINEAR B MONOGRAM B135 MERI*/
+                                           RTUNI_ALPHA, /* U+01009a: LINEAR B IDEOGRAM B140 BRONZE*/
+                                           RTUNI_ALPHA, /* U+01009b: LINEAR B IDEOGRAM B141 GOLD*/
+                                           RTUNI_ALPHA, /* U+01009c: LINEAR B IDEOGRAM B142*/
+                                           RTUNI_ALPHA, /* U+01009d: LINEAR B IDEOGRAM B145 WOOL*/
+                                           RTUNI_ALPHA, /* U+01009e: LINEAR B IDEOGRAM B146*/
+                                           RTUNI_ALPHA, /* U+01009f: LINEAR B IDEOGRAM B150*/
+                                           RTUNI_ALPHA, /* U+0100a0: LINEAR B IDEOGRAM B151 HORN*/
+                                           RTUNI_ALPHA, /* U+0100a1: LINEAR B IDEOGRAM B152*/
+                                           RTUNI_ALPHA, /* U+0100a2: LINEAR B IDEOGRAM B153*/
+                                           RTUNI_ALPHA, /* U+0100a3: LINEAR B IDEOGRAM B154*/
+                                           RTUNI_ALPHA, /* U+0100a4: LINEAR B MONOGRAM B156 TURO2*/
+                                           RTUNI_ALPHA, /* U+0100a5: LINEAR B IDEOGRAM B157*/
+                                           RTUNI_ALPHA, /* U+0100a6: LINEAR B IDEOGRAM B158*/
+                                           RTUNI_ALPHA, /* U+0100a7: LINEAR B IDEOGRAM B159 CLOTH*/
+                                           RTUNI_ALPHA, /* U+0100a8: LINEAR B IDEOGRAM B160*/
+                                           RTUNI_ALPHA, /* U+0100a9: LINEAR B IDEOGRAM B161*/
+                                           RTUNI_ALPHA, /* U+0100aa: LINEAR B IDEOGRAM B162 GARMENT*/
+                                           RTUNI_ALPHA, /* U+0100ab: LINEAR B IDEOGRAM B163 ARMOUR*/
+                                           RTUNI_ALPHA, /* U+0100ac: LINEAR B IDEOGRAM B164*/
+                                           RTUNI_ALPHA, /* U+0100ad: LINEAR B IDEOGRAM B165*/
+                                           RTUNI_ALPHA, /* U+0100ae: LINEAR B IDEOGRAM B166*/
+                                           RTUNI_ALPHA, /* U+0100af: LINEAR B IDEOGRAM B167*/
+                                           RTUNI_ALPHA, /* U+0100b0: LINEAR B IDEOGRAM B168*/
+                                           RTUNI_ALPHA, /* U+0100b1: LINEAR B IDEOGRAM B169*/
+                                           RTUNI_ALPHA, /* U+0100b2: LINEAR B IDEOGRAM B170*/
+                                           RTUNI_ALPHA, /* U+0100b3: LINEAR B IDEOGRAM B171*/
+                                           RTUNI_ALPHA, /* U+0100b4: LINEAR B IDEOGRAM B172*/
+                                           RTUNI_ALPHA, /* U+0100b5: LINEAR B IDEOGRAM B173 MONTH*/
+                                           RTUNI_ALPHA, /* U+0100b6: LINEAR B IDEOGRAM B174*/
+                                           RTUNI_ALPHA, /* U+0100b7: LINEAR B IDEOGRAM B176 TREE*/
+                                           RTUNI_ALPHA, /* U+0100b8: LINEAR B IDEOGRAM B177*/
+                                           RTUNI_ALPHA, /* U+0100b9: LINEAR B IDEOGRAM B178*/
+                                           RTUNI_ALPHA, /* U+0100ba: LINEAR B IDEOGRAM B179*/
+                                           RTUNI_ALPHA, /* U+0100bb: LINEAR B IDEOGRAM B180*/
+                                           RTUNI_ALPHA, /* U+0100bc: LINEAR B IDEOGRAM B181*/
+                                           RTUNI_ALPHA, /* U+0100bd: LINEAR B IDEOGRAM B182*/
+                                           RTUNI_ALPHA, /* U+0100be: LINEAR B IDEOGRAM B183*/
+                                           RTUNI_ALPHA, /* U+0100bf: LINEAR B IDEOGRAM B184*/
+                                           RTUNI_ALPHA, /* U+0100c0: LINEAR B IDEOGRAM B185*/
+                                           RTUNI_ALPHA, /* U+0100c1: LINEAR B IDEOGRAM B189*/
+                                           RTUNI_ALPHA, /* U+0100c2: LINEAR B IDEOGRAM B190*/
+                                           RTUNI_ALPHA, /* U+0100c3: LINEAR B IDEOGRAM B191 HELMET*/
+                                           RTUNI_ALPHA, /* U+0100c4: LINEAR B IDEOGRAM B220 FOOTSTOOL*/
+                                           RTUNI_ALPHA, /* U+0100c5: LINEAR B IDEOGRAM B225 BATHTUB*/
+                                           RTUNI_ALPHA, /* U+0100c6: LINEAR B IDEOGRAM B230 SPEAR*/
+                                           RTUNI_ALPHA, /* U+0100c7: LINEAR B IDEOGRAM B231 ARROW*/
+                                           RTUNI_ALPHA, /* U+0100c8: LINEAR B IDEOGRAM B232*/
+                                           RTUNI_ALPHA, /* U+0100c9: LINEAR B IDEOGRAM B233 SWORD*/
+                                           RTUNI_ALPHA, /* U+0100ca: LINEAR B IDEOGRAM B234*/
+                                           RTUNI_ALPHA, /* U+0100cb: LINEAR B IDEOGRAM B236*/
+                                           RTUNI_ALPHA, /* U+0100cc: LINEAR B IDEOGRAM B240 WHEELED CHARIOT*/
+                                           RTUNI_ALPHA, /* U+0100cd: LINEAR B IDEOGRAM B241 CHARIOT*/
+                                           RTUNI_ALPHA, /* U+0100ce: LINEAR B IDEOGRAM B242 CHARIOT FRAME*/
+                                           RTUNI_ALPHA, /* U+0100cf: LINEAR B IDEOGRAM B243 WHEEL*/
+                                           RTUNI_ALPHA, /* U+0100d0: LINEAR B IDEOGRAM B245*/
+                                           RTUNI_ALPHA, /* U+0100d1: LINEAR B IDEOGRAM B246*/
+                                           RTUNI_ALPHA, /* U+0100d2: LINEAR B MONOGRAM B247 DIPTE*/
+                                           RTUNI_ALPHA, /* U+0100d3: LINEAR B IDEOGRAM B248*/
+                                           RTUNI_ALPHA, /* U+0100d4: LINEAR B IDEOGRAM B249*/
+                                           RTUNI_ALPHA, /* U+0100d5: LINEAR B IDEOGRAM B251*/
+                                           RTUNI_ALPHA, /* U+0100d6: LINEAR B IDEOGRAM B252*/
+                                           RTUNI_ALPHA, /* U+0100d7: LINEAR B IDEOGRAM B253*/
+                                           RTUNI_ALPHA, /* U+0100d8: LINEAR B IDEOGRAM B254 DART*/
+                                           RTUNI_ALPHA, /* U+0100d9: LINEAR B IDEOGRAM B255*/
+                                           RTUNI_ALPHA, /* U+0100da: LINEAR B IDEOGRAM B256*/
+                                           RTUNI_ALPHA, /* U+0100db: LINEAR B IDEOGRAM B257*/
+                                           RTUNI_ALPHA, /* U+0100dc: LINEAR B IDEOGRAM B258*/
+                                           RTUNI_ALPHA, /* U+0100dd: LINEAR B IDEOGRAM B259*/
+                                           RTUNI_ALPHA, /* U+0100de: LINEAR B IDEOGRAM VESSEL B155*/
+                                           RTUNI_ALPHA, /* U+0100df: LINEAR B IDEOGRAM VESSEL B200*/
+                                           RTUNI_ALPHA, /* U+0100e0: LINEAR B IDEOGRAM VESSEL B201*/
+                                           RTUNI_ALPHA, /* U+0100e1: LINEAR B IDEOGRAM VESSEL B202*/
+                                           RTUNI_ALPHA, /* U+0100e2: LINEAR B IDEOGRAM VESSEL B203*/
+                                           RTUNI_ALPHA, /* U+0100e3: LINEAR B IDEOGRAM VESSEL B204*/
+                                           RTUNI_ALPHA, /* U+0100e4: LINEAR B IDEOGRAM VESSEL B205*/
+                                           RTUNI_ALPHA, /* U+0100e5: LINEAR B IDEOGRAM VESSEL B206*/
+                                           RTUNI_ALPHA, /* U+0100e6: LINEAR B IDEOGRAM VESSEL B207*/
+                                           RTUNI_ALPHA, /* U+0100e7: LINEAR B IDEOGRAM VESSEL B208*/
+                                           RTUNI_ALPHA, /* U+0100e8: LINEAR B IDEOGRAM VESSEL B209*/
+                                           RTUNI_ALPHA, /* U+0100e9: LINEAR B IDEOGRAM VESSEL B210*/
+                                           RTUNI_ALPHA, /* U+0100ea: LINEAR B IDEOGRAM VESSEL B211*/
+                                           RTUNI_ALPHA, /* U+0100eb: LINEAR B IDEOGRAM VESSEL B212*/
+                                           RTUNI_ALPHA, /* U+0100ec: LINEAR B IDEOGRAM VESSEL B213*/
+                                           RTUNI_ALPHA, /* U+0100ed: LINEAR B IDEOGRAM VESSEL B214*/
+                                           RTUNI_ALPHA, /* U+0100ee: LINEAR B IDEOGRAM VESSEL B215*/
+                                           RTUNI_ALPHA, /* U+0100ef: LINEAR B IDEOGRAM VESSEL B216*/
+                                           RTUNI_ALPHA, /* U+0100f0: LINEAR B IDEOGRAM VESSEL B217*/
+                                           RTUNI_ALPHA, /* U+0100f1: LINEAR B IDEOGRAM VESSEL B218*/
+                                           RTUNI_ALPHA, /* U+0100f2: LINEAR B IDEOGRAM VESSEL B219*/
+                                           RTUNI_ALPHA, /* U+0100f3: LINEAR B IDEOGRAM VESSEL B221*/
+                                           RTUNI_ALPHA, /* U+0100f4: LINEAR B IDEOGRAM VESSEL B222*/
+                                           RTUNI_ALPHA, /* U+0100f5: LINEAR B IDEOGRAM VESSEL B226*/
+                                           RTUNI_ALPHA, /* U+0100f6: LINEAR B IDEOGRAM VESSEL B227*/
+                                           RTUNI_ALPHA, /* U+0100f7: LINEAR B IDEOGRAM VESSEL B228*/
+                                           RTUNI_ALPHA, /* U+0100f8: LINEAR B IDEOGRAM VESSEL B229*/
+                                           RTUNI_ALPHA, /* U+0100f9: LINEAR B IDEOGRAM VESSEL B250*/
+                                           RTUNI_ALPHA, /* U+0100fa: LINEAR B IDEOGRAM VESSEL B305*/
+                                                     0, /* U+0100fb: */
+                                                     0, /* U+0100fc: */
+                                                     0, /* U+0100fd: */
+                                                     0, /* U+0100fe: */
+                                                     0, /* U+0100ff: */
+                                                     0, /* U+010100: AEGEAN WORD SEPARATOR LINE*/
+                                                     0, /* U+010101: AEGEAN WORD SEPARATOR DOT*/
+                                                     0, /* U+010102: AEGEAN CHECK MARK*/
+                                                     0, /* U+010103: */
+                                                     0, /* U+010104: */
+                                                     0, /* U+010105: */
+                                                     0, /* U+010106: */
+                                                     0, /* U+010107: AEGEAN NUMBER ONE*/
+                                                     0, /* U+010108: AEGEAN NUMBER TWO*/
+                                                     0, /* U+010109: AEGEAN NUMBER THREE*/
+                                                     0, /* U+01010a: AEGEAN NUMBER FOUR*/
+                                                     0, /* U+01010b: AEGEAN NUMBER FIVE*/
+                                                     0, /* U+01010c: AEGEAN NUMBER SIX*/
+                                                     0, /* U+01010d: AEGEAN NUMBER SEVEN*/
+                                                     0, /* U+01010e: AEGEAN NUMBER EIGHT*/
+                                                     0, /* U+01010f: AEGEAN NUMBER NINE*/
+                                                     0, /* U+010110: AEGEAN NUMBER TEN*/
+                                                     0, /* U+010111: AEGEAN NUMBER TWENTY*/
+                                                     0, /* U+010112: AEGEAN NUMBER THIRTY*/
+                                                     0, /* U+010113: AEGEAN NUMBER FORTY*/
+                                                     0, /* U+010114: AEGEAN NUMBER FIFTY*/
+                                                     0, /* U+010115: AEGEAN NUMBER SIXTY*/
+                                                     0, /* U+010116: AEGEAN NUMBER SEVENTY*/
+                                                     0, /* U+010117: AEGEAN NUMBER EIGHTY*/
+                                                     0, /* U+010118: AEGEAN NUMBER NINETY*/
+                                                     0, /* U+010119: AEGEAN NUMBER ONE HUNDRED*/
+                                                     0, /* U+01011a: AEGEAN NUMBER TWO HUNDRED*/
+                                                     0, /* U+01011b: AEGEAN NUMBER THREE HUNDRED*/
+                                                     0, /* U+01011c: AEGEAN NUMBER FOUR HUNDRED*/
+                                                     0, /* U+01011d: AEGEAN NUMBER FIVE HUNDRED*/
+                                                     0, /* U+01011e: AEGEAN NUMBER SIX HUNDRED*/
+                                                     0, /* U+01011f: AEGEAN NUMBER SEVEN HUNDRED*/
+                                                     0, /* U+010120: AEGEAN NUMBER EIGHT HUNDRED*/
+                                                     0, /* U+010121: AEGEAN NUMBER NINE HUNDRED*/
+                                                     0, /* U+010122: AEGEAN NUMBER ONE THOUSAND*/
+                                                     0, /* U+010123: AEGEAN NUMBER TWO THOUSAND*/
+                                                     0, /* U+010124: AEGEAN NUMBER THREE THOUSAND*/
+                                                     0, /* U+010125: AEGEAN NUMBER FOUR THOUSAND*/
+                                                     0, /* U+010126: AEGEAN NUMBER FIVE THOUSAND*/
+                                                     0, /* U+010127: AEGEAN NUMBER SIX THOUSAND*/
+                                                     0, /* U+010128: AEGEAN NUMBER SEVEN THOUSAND*/
+                                                     0, /* U+010129: AEGEAN NUMBER EIGHT THOUSAND*/
+                                                     0, /* U+01012a: AEGEAN NUMBER NINE THOUSAND*/
+                                                     0, /* U+01012b: AEGEAN NUMBER TEN THOUSAND*/
+                                                     0, /* U+01012c: AEGEAN NUMBER TWENTY THOUSAND*/
+                                                     0, /* U+01012d: AEGEAN NUMBER THIRTY THOUSAND*/
+                                                     0, /* U+01012e: AEGEAN NUMBER FORTY THOUSAND*/
+                                                     0, /* U+01012f: AEGEAN NUMBER FIFTY THOUSAND*/
+                                                     0, /* U+010130: AEGEAN NUMBER SIXTY THOUSAND*/
+                                                     0, /* U+010131: AEGEAN NUMBER SEVENTY THOUSAND*/
+                                                     0, /* U+010132: AEGEAN NUMBER EIGHTY THOUSAND*/
+                                                     0, /* U+010133: AEGEAN NUMBER NINETY THOUSAND*/
+                                                     0, /* U+010134: */
+                                                     0, /* U+010135: */
+                                                     0, /* U+010136: */
+                                                     0, /* U+010137: AEGEAN WEIGHT BASE UNIT*/
+                                                     0, /* U+010138: AEGEAN WEIGHT FIRST SUBUNIT*/
+                                                     0, /* U+010139: AEGEAN WEIGHT SECOND SUBUNIT*/
+                                                     0, /* U+01013a: AEGEAN WEIGHT THIRD SUBUNIT*/
+                                                     0, /* U+01013b: AEGEAN WEIGHT FOURTH SUBUNIT*/
+                                                     0, /* U+01013c: AEGEAN DRY MEASURE FIRST SUBUNIT*/
+                                                     0, /* U+01013d: AEGEAN LIQUID MEASURE FIRST SUBUNIT*/
+                                                     0, /* U+01013e: AEGEAN MEASURE SECOND SUBUNIT*/
+                                                     0, /* U+01013f: AEGEAN MEASURE THIRD SUBUNIT*/
+                                           RTUNI_ALPHA, /* U+010140: GREEK ACROPHONIC ATTIC ONE QUARTER*/
+                                           RTUNI_ALPHA, /* U+010141: GREEK ACROPHONIC ATTIC ONE HALF*/
+                                           RTUNI_ALPHA, /* U+010142: GREEK ACROPHONIC ATTIC ONE DRACHMA*/
+                                           RTUNI_ALPHA, /* U+010143: GREEK ACROPHONIC ATTIC FIVE*/
+                                           RTUNI_ALPHA, /* U+010144: GREEK ACROPHONIC ATTIC FIFTY*/
+                                           RTUNI_ALPHA, /* U+010145: GREEK ACROPHONIC ATTIC FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+010146: GREEK ACROPHONIC ATTIC FIVE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+010147: GREEK ACROPHONIC ATTIC FIFTY THOUSAND*/
+                                           RTUNI_ALPHA, /* U+010148: GREEK ACROPHONIC ATTIC FIVE TALENTS*/
+                                           RTUNI_ALPHA, /* U+010149: GREEK ACROPHONIC ATTIC TEN TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014a: GREEK ACROPHONIC ATTIC FIFTY TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014b: GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014c: GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014d: GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014e: GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS*/
+                                           RTUNI_ALPHA, /* U+01014f: GREEK ACROPHONIC ATTIC FIVE STATERS*/
+                                           RTUNI_ALPHA, /* U+010150: GREEK ACROPHONIC ATTIC TEN STATERS*/
+                                           RTUNI_ALPHA, /* U+010151: GREEK ACROPHONIC ATTIC FIFTY STATERS*/
+                                           RTUNI_ALPHA, /* U+010152: GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS*/
+                                           RTUNI_ALPHA, /* U+010153: GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS*/
+                                           RTUNI_ALPHA, /* U+010154: GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS*/
+                                           RTUNI_ALPHA, /* U+010155: GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS*/
+                                           RTUNI_ALPHA, /* U+010156: GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS*/
+                                           RTUNI_ALPHA, /* U+010157: GREEK ACROPHONIC ATTIC TEN MNAS*/
+                                           RTUNI_ALPHA, /* U+010158: GREEK ACROPHONIC HERAEUM ONE PLETHRON*/
+                                           RTUNI_ALPHA, /* U+010159: GREEK ACROPHONIC THESPIAN ONE*/
+                                           RTUNI_ALPHA, /* U+01015a: GREEK ACROPHONIC HERMIONIAN ONE*/
+                                           RTUNI_ALPHA, /* U+01015b: GREEK ACROPHONIC EPIDAUREAN TWO*/
+                                           RTUNI_ALPHA, /* U+01015c: GREEK ACROPHONIC THESPIAN TWO*/
+                                           RTUNI_ALPHA, /* U+01015d: GREEK ACROPHONIC CYRENAIC TWO DRACHMAS*/
+                                           RTUNI_ALPHA, /* U+01015e: GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS*/
+                                           RTUNI_ALPHA, /* U+01015f: GREEK ACROPHONIC TROEZENIAN FIVE*/
+                                           RTUNI_ALPHA, /* U+010160: GREEK ACROPHONIC TROEZENIAN TEN*/
+                                           RTUNI_ALPHA, /* U+010161: GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM*/
+                                           RTUNI_ALPHA, /* U+010162: GREEK ACROPHONIC HERMIONIAN TEN*/
+                                           RTUNI_ALPHA, /* U+010163: GREEK ACROPHONIC MESSENIAN TEN*/
+                                           RTUNI_ALPHA, /* U+010164: GREEK ACROPHONIC THESPIAN TEN*/
+                                           RTUNI_ALPHA, /* U+010165: GREEK ACROPHONIC THESPIAN THIRTY*/
+                                           RTUNI_ALPHA, /* U+010166: GREEK ACROPHONIC TROEZENIAN FIFTY*/
+                                           RTUNI_ALPHA, /* U+010167: GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM*/
+                                           RTUNI_ALPHA, /* U+010168: GREEK ACROPHONIC HERMIONIAN FIFTY*/
+                                           RTUNI_ALPHA, /* U+010169: GREEK ACROPHONIC THESPIAN FIFTY*/
+                                           RTUNI_ALPHA, /* U+01016a: GREEK ACROPHONIC THESPIAN ONE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+01016b: GREEK ACROPHONIC THESPIAN THREE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+01016c: GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+01016d: GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+01016e: GREEK ACROPHONIC THESPIAN FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+01016f: GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+010170: GREEK ACROPHONIC NAXIAN FIVE HUNDRED*/
+                                           RTUNI_ALPHA, /* U+010171: GREEK ACROPHONIC THESPIAN ONE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+010172: GREEK ACROPHONIC THESPIAN FIVE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+010173: GREEK ACROPHONIC DELPHIC FIVE MNAS*/
+                                           RTUNI_ALPHA, /* U+010174: GREEK ACROPHONIC STRATIAN FIFTY MNAS*/
+                                                     0, /* U+010175: GREEK ONE HALF SIGN*/
+                                                     0, /* U+010176: GREEK ONE HALF SIGN ALTERNATE FORM*/
+                                                     0, /* U+010177: GREEK TWO THIRDS SIGN*/
+                                                     0, /* U+010178: GREEK THREE QUARTERS SIGN*/
+                                                     0, /* U+010179: GREEK YEAR SIGN*/
+                                                     0, /* U+01017a: GREEK TALENT SIGN*/
+                                                     0, /* U+01017b: GREEK DRACHMA SIGN*/
+                                                     0, /* U+01017c: GREEK OBOL SIGN*/
+                                                     0, /* U+01017d: GREEK TWO OBOLS SIGN*/
+                                                     0, /* U+01017e: GREEK THREE OBOLS SIGN*/
+                                                     0, /* U+01017f: GREEK FOUR OBOLS SIGN*/
+                                                     0, /* U+010180: GREEK FIVE OBOLS SIGN*/
+                                                     0, /* U+010181: GREEK METRETES SIGN*/
+                                                     0, /* U+010182: GREEK KYATHOS BASE SIGN*/
+                                                     0, /* U+010183: GREEK LITRA SIGN*/
+                                                     0, /* U+010184: GREEK OUNKIA SIGN*/
+                                                     0, /* U+010185: GREEK XESTES SIGN*/
+                                                     0, /* U+010186: GREEK ARTABE SIGN*/
+                                                     0, /* U+010187: GREEK AROURA SIGN*/
+                                                     0, /* U+010188: GREEK GRAMMA SIGN*/
+                                                     0, /* U+010189: GREEK TRYBLION BASE SIGN*/
+                                                     0, /* U+01018a: GREEK ZERO SIGN*/
+                                                     0, /* U+01018b: */
+                                                     0, /* U+01018c: */
+                                                     0, /* U+01018d: */
+                                                     0, /* U+01018e: */
+                                                     0, /* U+01018f: */
+                                                     0, /* U+010190: ROMAN SEXTANS SIGN*/
+                                                     0, /* U+010191: ROMAN UNCIA SIGN*/
+                                                     0, /* U+010192: ROMAN SEMUNCIA SIGN*/
+                                                     0, /* U+010193: ROMAN SEXTULA SIGN*/
+                                                     0, /* U+010194: ROMAN DIMIDIA SEXTULA SIGN*/
+                                                     0, /* U+010195: ROMAN SILIQUA SIGN*/
+                                                     0, /* U+010196: ROMAN DENARIUS SIGN*/
+                                                     0, /* U+010197: ROMAN QUINARIUS SIGN*/
+                                                     0, /* U+010198: ROMAN SESTERTIUS SIGN*/
+                                                     0, /* U+010199: ROMAN DUPONDIUS SIGN*/
+                                                     0, /* U+01019a: ROMAN AS SIGN*/
+                                                     0, /* U+01019b: ROMAN CENTURIAL SIGN*/
+                                                     0, /* U+01019c: */
+                                                     0, /* U+01019d: */
+                                                     0, /* U+01019e: */
+                                                     0, /* U+01019f: */
+                                                     0, /* U+0101a0: */
+                                                     0, /* U+0101a1: */
+                                                     0, /* U+0101a2: */
+                                                     0, /* U+0101a3: */
+                                                     0, /* U+0101a4: */
+                                                     0, /* U+0101a5: */
+                                                     0, /* U+0101a6: */
+                                                     0, /* U+0101a7: */
+                                                     0, /* U+0101a8: */
+                                                     0, /* U+0101a9: */
+                                                     0, /* U+0101aa: */
+                                                     0, /* U+0101ab: */
+                                                     0, /* U+0101ac: */
+                                                     0, /* U+0101ad: */
+                                                     0, /* U+0101ae: */
+                                                     0, /* U+0101af: */
+                                                     0, /* U+0101b0: */
+                                                     0, /* U+0101b1: */
+                                                     0, /* U+0101b2: */
+                                                     0, /* U+0101b3: */
+                                                     0, /* U+0101b4: */
+                                                     0, /* U+0101b5: */
+                                                     0, /* U+0101b6: */
+                                                     0, /* U+0101b7: */
+                                                     0, /* U+0101b8: */
+                                                     0, /* U+0101b9: */
+                                                     0, /* U+0101ba: */
+                                                     0, /* U+0101bb: */
+                                                     0, /* U+0101bc: */
+                                                     0, /* U+0101bd: */
+                                                     0, /* U+0101be: */
+                                                     0, /* U+0101bf: */
+                                                     0, /* U+0101c0: */
+                                                     0, /* U+0101c1: */
+                                                     0, /* U+0101c2: */
+                                                     0, /* U+0101c3: */
+                                                     0, /* U+0101c4: */
+                                                     0, /* U+0101c5: */
+                                                     0, /* U+0101c6: */
+                                                     0, /* U+0101c7: */
+                                                     0, /* U+0101c8: */
+                                                     0, /* U+0101c9: */
+                                                     0, /* U+0101ca: */
+                                                     0, /* U+0101cb: */
+                                                     0, /* U+0101cc: */
+                                                     0, /* U+0101cd: */
+                                                     0, /* U+0101ce: */
+                                                     0, /* U+0101cf: */
+                                                     0, /* U+0101d0: PHAISTOS DISC SIGN PEDESTRIAN*/
+                                                     0, /* U+0101d1: PHAISTOS DISC SIGN PLUMED HEAD*/
+                                                     0, /* U+0101d2: PHAISTOS DISC SIGN TATTOOED HEAD*/
+                                                     0, /* U+0101d3: PHAISTOS DISC SIGN CAPTIVE*/
+                                                     0, /* U+0101d4: PHAISTOS DISC SIGN CHILD*/
+                                                     0, /* U+0101d5: PHAISTOS DISC SIGN WOMAN*/
+                                                     0, /* U+0101d6: PHAISTOS DISC SIGN HELMET*/
+                                                     0, /* U+0101d7: PHAISTOS DISC SIGN GAUNTLET*/
+                                                     0, /* U+0101d8: PHAISTOS DISC SIGN TIARA*/
+                                                     0, /* U+0101d9: PHAISTOS DISC SIGN ARROW*/
+                                                     0, /* U+0101da: PHAISTOS DISC SIGN BOW*/
+                                                     0, /* U+0101db: PHAISTOS DISC SIGN SHIELD*/
+                                                     0, /* U+0101dc: PHAISTOS DISC SIGN CLUB*/
+                                                     0, /* U+0101dd: PHAISTOS DISC SIGN MANACLES*/
+                                                     0, /* U+0101de: PHAISTOS DISC SIGN MATTOCK*/
+                                                     0, /* U+0101df: PHAISTOS DISC SIGN SAW*/
+                                                     0, /* U+0101e0: PHAISTOS DISC SIGN LID*/
+                                                     0, /* U+0101e1: PHAISTOS DISC SIGN BOOMERANG*/
+                                                     0, /* U+0101e2: PHAISTOS DISC SIGN CARPENTRY PLANE*/
+                                                     0, /* U+0101e3: PHAISTOS DISC SIGN DOLIUM*/
+                                                     0, /* U+0101e4: PHAISTOS DISC SIGN COMB*/
+                                                     0, /* U+0101e5: PHAISTOS DISC SIGN SLING*/
+                                                     0, /* U+0101e6: PHAISTOS DISC SIGN COLUMN*/
+                                                     0, /* U+0101e7: PHAISTOS DISC SIGN BEEHIVE*/
+                                                     0, /* U+0101e8: PHAISTOS DISC SIGN SHIP*/
+                                                     0, /* U+0101e9: PHAISTOS DISC SIGN HORN*/
+                                                     0, /* U+0101ea: PHAISTOS DISC SIGN HIDE*/
+                                                     0, /* U+0101eb: PHAISTOS DISC SIGN BULLS LEG*/
+                                                     0, /* U+0101ec: PHAISTOS DISC SIGN CAT*/
+                                                     0, /* U+0101ed: PHAISTOS DISC SIGN RAM*/
+                                                     0, /* U+0101ee: PHAISTOS DISC SIGN EAGLE*/
+                                                     0, /* U+0101ef: PHAISTOS DISC SIGN DOVE*/
+                                                     0, /* U+0101f0: PHAISTOS DISC SIGN TUNNY*/
+                                                     0, /* U+0101f1: PHAISTOS DISC SIGN BEE*/
+                                                     0, /* U+0101f2: PHAISTOS DISC SIGN PLANE TREE*/
+                                                     0, /* U+0101f3: PHAISTOS DISC SIGN VINE*/
+                                                     0, /* U+0101f4: PHAISTOS DISC SIGN PAPYRUS*/
+                                                     0, /* U+0101f5: PHAISTOS DISC SIGN ROSETTE*/
+                                                     0, /* U+0101f6: PHAISTOS DISC SIGN LILY*/
+                                                     0, /* U+0101f7: PHAISTOS DISC SIGN OX BACK*/
+                                                     0, /* U+0101f8: PHAISTOS DISC SIGN FLUTE*/
+                                                     0, /* U+0101f9: PHAISTOS DISC SIGN GRATER*/
+                                                     0, /* U+0101fa: PHAISTOS DISC SIGN STRAINER*/
+                                                     0, /* U+0101fb: PHAISTOS DISC SIGN SMALL AXE*/
+                                                     0, /* U+0101fc: PHAISTOS DISC SIGN WAVY BAND*/
+                                                     0, /* U+0101fd: PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE*/
+                                                     0, /* U+0101fe: */
+                                                     0, /* U+0101ff: */
+                                                     0, /* U+010200: */
+                                                     0, /* U+010201: */
+                                                     0, /* U+010202: */
+                                                     0, /* U+010203: */
+                                                     0, /* U+010204: */
+                                                     0, /* U+010205: */
+                                                     0, /* U+010206: */
+                                                     0, /* U+010207: */
+                                                     0, /* U+010208: */
+                                                     0, /* U+010209: */
+                                                     0, /* U+01020a: */
+                                                     0, /* U+01020b: */
+                                                     0, /* U+01020c: */
+                                                     0, /* U+01020d: */
+                                                     0, /* U+01020e: */
+                                                     0, /* U+01020f: */
+                                                     0, /* U+010210: */
+                                                     0, /* U+010211: */
+                                                     0, /* U+010212: */
+                                                     0, /* U+010213: */
+                                                     0, /* U+010214: */
+                                                     0, /* U+010215: */
+                                                     0, /* U+010216: */
+                                                     0, /* U+010217: */
+                                                     0, /* U+010218: */
+                                                     0, /* U+010219: */
+                                                     0, /* U+01021a: */
+                                                     0, /* U+01021b: */
+                                                     0, /* U+01021c: */
+                                                     0, /* U+01021d: */
+                                                     0, /* U+01021e: */
+                                                     0, /* U+01021f: */
+                                                     0, /* U+010220: */
+                                                     0, /* U+010221: */
+                                                     0, /* U+010222: */
+                                                     0, /* U+010223: */
+                                                     0, /* U+010224: */
+                                                     0, /* U+010225: */
+                                                     0, /* U+010226: */
+                                                     0, /* U+010227: */
+                                                     0, /* U+010228: */
+                                                     0, /* U+010229: */
+                                                     0, /* U+01022a: */
+                                                     0, /* U+01022b: */
+                                                     0, /* U+01022c: */
+                                                     0, /* U+01022d: */
+                                                     0, /* U+01022e: */
+                                                     0, /* U+01022f: */
+                                                     0, /* U+010230: */
+                                                     0, /* U+010231: */
+                                                     0, /* U+010232: */
+                                                     0, /* U+010233: */
+                                                     0, /* U+010234: */
+                                                     0, /* U+010235: */
+                                                     0, /* U+010236: */
+                                                     0, /* U+010237: */
+                                                     0, /* U+010238: */
+                                                     0, /* U+010239: */
+                                                     0, /* U+01023a: */
+                                                     0, /* U+01023b: */
+                                                     0, /* U+01023c: */
+                                                     0, /* U+01023d: */
+                                                     0, /* U+01023e: */
+                                                     0, /* U+01023f: */
+                                                     0, /* U+010240: */
+                                                     0, /* U+010241: */
+                                                     0, /* U+010242: */
+                                                     0, /* U+010243: */
+                                                     0, /* U+010244: */
+                                                     0, /* U+010245: */
+                                                     0, /* U+010246: */
+                                                     0, /* U+010247: */
+                                                     0, /* U+010248: */
+                                                     0, /* U+010249: */
+                                                     0, /* U+01024a: */
+                                                     0, /* U+01024b: */
+                                                     0, /* U+01024c: */
+                                                     0, /* U+01024d: */
+                                                     0, /* U+01024e: */
+                                                     0, /* U+01024f: */
+                                                     0, /* U+010250: */
+                                                     0, /* U+010251: */
+                                                     0, /* U+010252: */
+                                                     0, /* U+010253: */
+                                                     0, /* U+010254: */
+                                                     0, /* U+010255: */
+                                                     0, /* U+010256: */
+                                                     0, /* U+010257: */
+                                                     0, /* U+010258: */
+                                                     0, /* U+010259: */
+                                                     0, /* U+01025a: */
+                                                     0, /* U+01025b: */
+                                                     0, /* U+01025c: */
+                                                     0, /* U+01025d: */
+                                                     0, /* U+01025e: */
+                                                     0, /* U+01025f: */
+                                                     0, /* U+010260: */
+                                                     0, /* U+010261: */
+                                                     0, /* U+010262: */
+                                                     0, /* U+010263: */
+                                                     0, /* U+010264: */
+                                                     0, /* U+010265: */
+                                                     0, /* U+010266: */
+                                                     0, /* U+010267: */
+                                                     0, /* U+010268: */
+                                                     0, /* U+010269: */
+                                                     0, /* U+01026a: */
+                                                     0, /* U+01026b: */
+                                                     0, /* U+01026c: */
+                                                     0, /* U+01026d: */
+                                                     0, /* U+01026e: */
+                                                     0, /* U+01026f: */
+                                                     0, /* U+010270: */
+                                                     0, /* U+010271: */
+                                                     0, /* U+010272: */
+                                                     0, /* U+010273: */
+                                                     0, /* U+010274: */
+                                                     0, /* U+010275: */
+                                                     0, /* U+010276: */
+                                                     0, /* U+010277: */
+                                                     0, /* U+010278: */
+                                                     0, /* U+010279: */
+                                                     0, /* U+01027a: */
+                                                     0, /* U+01027b: */
+                                                     0, /* U+01027c: */
+                                                     0, /* U+01027d: */
+                                                     0, /* U+01027e: */
+                                                     0, /* U+01027f: */
+                                           RTUNI_ALPHA, /* U+010280: LYCIAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+010281: LYCIAN LETTER E*/
+                                           RTUNI_ALPHA, /* U+010282: LYCIAN LETTER B*/
+                                           RTUNI_ALPHA, /* U+010283: LYCIAN LETTER BH*/
+                                           RTUNI_ALPHA, /* U+010284: LYCIAN LETTER G*/
+                                           RTUNI_ALPHA, /* U+010285: LYCIAN LETTER D*/
+                                           RTUNI_ALPHA, /* U+010286: LYCIAN LETTER I*/
+                                           RTUNI_ALPHA, /* U+010287: LYCIAN LETTER W*/
+                                           RTUNI_ALPHA, /* U+010288: LYCIAN LETTER Z*/
+                                           RTUNI_ALPHA, /* U+010289: LYCIAN LETTER TH*/
+                                           RTUNI_ALPHA, /* U+01028a: LYCIAN LETTER J*/
+                                           RTUNI_ALPHA, /* U+01028b: LYCIAN LETTER K*/
+                                           RTUNI_ALPHA, /* U+01028c: LYCIAN LETTER Q*/
+                                           RTUNI_ALPHA, /* U+01028d: LYCIAN LETTER L*/
+                                           RTUNI_ALPHA, /* U+01028e: LYCIAN LETTER M*/
+                                           RTUNI_ALPHA, /* U+01028f: LYCIAN LETTER N*/
+                                           RTUNI_ALPHA, /* U+010290: LYCIAN LETTER MM*/
+                                           RTUNI_ALPHA, /* U+010291: LYCIAN LETTER NN*/
+                                           RTUNI_ALPHA, /* U+010292: LYCIAN LETTER U*/
+                                           RTUNI_ALPHA, /* U+010293: LYCIAN LETTER P*/
+                                           RTUNI_ALPHA, /* U+010294: LYCIAN LETTER KK*/
+                                           RTUNI_ALPHA, /* U+010295: LYCIAN LETTER R*/
+                                           RTUNI_ALPHA, /* U+010296: LYCIAN LETTER S*/
+                                           RTUNI_ALPHA, /* U+010297: LYCIAN LETTER T*/
+                                           RTUNI_ALPHA, /* U+010298: LYCIAN LETTER TT*/
+                                           RTUNI_ALPHA, /* U+010299: LYCIAN LETTER AN*/
+                                           RTUNI_ALPHA, /* U+01029a: LYCIAN LETTER EN*/
+                                           RTUNI_ALPHA, /* U+01029b: LYCIAN LETTER H*/
+                                           RTUNI_ALPHA, /* U+01029c: LYCIAN LETTER X*/
+                                                     0, /* U+01029d: */
+                                                     0, /* U+01029e: */
+                                                     0, /* U+01029f: */
+                                           RTUNI_ALPHA, /* U+0102a0: CARIAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+0102a1: CARIAN LETTER P2*/
+                                           RTUNI_ALPHA, /* U+0102a2: CARIAN LETTER D*/
+                                           RTUNI_ALPHA, /* U+0102a3: CARIAN LETTER L*/
+                                           RTUNI_ALPHA, /* U+0102a4: CARIAN LETTER UUU*/
+                                           RTUNI_ALPHA, /* U+0102a5: CARIAN LETTER R*/
+                                           RTUNI_ALPHA, /* U+0102a6: CARIAN LETTER LD*/
+                                           RTUNI_ALPHA, /* U+0102a7: CARIAN LETTER A2*/
+                                           RTUNI_ALPHA, /* U+0102a8: CARIAN LETTER Q*/
+                                           RTUNI_ALPHA, /* U+0102a9: CARIAN LETTER B*/
+                                           RTUNI_ALPHA, /* U+0102aa: CARIAN LETTER M*/
+                                           RTUNI_ALPHA, /* U+0102ab: CARIAN LETTER O*/
+                                           RTUNI_ALPHA, /* U+0102ac: CARIAN LETTER D2*/
+                                           RTUNI_ALPHA, /* U+0102ad: CARIAN LETTER T*/
+                                           RTUNI_ALPHA, /* U+0102ae: CARIAN LETTER SH*/
+                                           RTUNI_ALPHA, /* U+0102af: CARIAN LETTER SH2*/
+                                           RTUNI_ALPHA, /* U+0102b0: CARIAN LETTER S*/
+                                           RTUNI_ALPHA, /* U+0102b1: CARIAN LETTER C-18*/
+                                           RTUNI_ALPHA, /* U+0102b2: CARIAN LETTER U*/
+                                           RTUNI_ALPHA, /* U+0102b3: CARIAN LETTER NN*/
+                                           RTUNI_ALPHA, /* U+0102b4: CARIAN LETTER X*/
+                                           RTUNI_ALPHA, /* U+0102b5: CARIAN LETTER N*/
+                                           RTUNI_ALPHA, /* U+0102b6: CARIAN LETTER TT2*/
+                                           RTUNI_ALPHA, /* U+0102b7: CARIAN LETTER P*/
+                                           RTUNI_ALPHA, /* U+0102b8: CARIAN LETTER SS*/
+                                           RTUNI_ALPHA, /* U+0102b9: CARIAN LETTER I*/
+                                           RTUNI_ALPHA, /* U+0102ba: CARIAN LETTER E*/
+                                           RTUNI_ALPHA, /* U+0102bb: CARIAN LETTER UUUU*/
+                                           RTUNI_ALPHA, /* U+0102bc: CARIAN LETTER K*/
+                                           RTUNI_ALPHA, /* U+0102bd: CARIAN LETTER K2*/
+                                           RTUNI_ALPHA, /* U+0102be: CARIAN LETTER ND*/
+                                           RTUNI_ALPHA, /* U+0102bf: CARIAN LETTER UU*/
+                                           RTUNI_ALPHA, /* U+0102c0: CARIAN LETTER G*/
+                                           RTUNI_ALPHA, /* U+0102c1: CARIAN LETTER G2*/
+                                           RTUNI_ALPHA, /* U+0102c2: CARIAN LETTER ST*/
+                                           RTUNI_ALPHA, /* U+0102c3: CARIAN LETTER ST2*/
+                                           RTUNI_ALPHA, /* U+0102c4: CARIAN LETTER NG*/
+                                           RTUNI_ALPHA, /* U+0102c5: CARIAN LETTER II*/
+                                           RTUNI_ALPHA, /* U+0102c6: CARIAN LETTER C-39*/
+                                           RTUNI_ALPHA, /* U+0102c7: CARIAN LETTER TT*/
+                                           RTUNI_ALPHA, /* U+0102c8: CARIAN LETTER UUU2*/
+                                           RTUNI_ALPHA, /* U+0102c9: CARIAN LETTER RR*/
+                                           RTUNI_ALPHA, /* U+0102ca: CARIAN LETTER MB*/
+                                           RTUNI_ALPHA, /* U+0102cb: CARIAN LETTER MB2*/
+                                           RTUNI_ALPHA, /* U+0102cc: CARIAN LETTER MB3*/
+                                           RTUNI_ALPHA, /* U+0102cd: CARIAN LETTER MB4*/
+                                           RTUNI_ALPHA, /* U+0102ce: CARIAN LETTER LD2*/
+                                           RTUNI_ALPHA, /* U+0102cf: CARIAN LETTER E2*/
+                                           RTUNI_ALPHA, /* U+0102d0: CARIAN LETTER UUU3*/
+                                                     0, /* U+0102d1: */
+                                                     0, /* U+0102d2: */
+                                                     0, /* U+0102d3: */
+                                                     0, /* U+0102d4: */
+                                                     0, /* U+0102d5: */
+                                                     0, /* U+0102d6: */
+                                                     0, /* U+0102d7: */
+                                                     0, /* U+0102d8: */
+                                                     0, /* U+0102d9: */
+                                                     0, /* U+0102da: */
+                                                     0, /* U+0102db: */
+                                                     0, /* U+0102dc: */
+                                                     0, /* U+0102dd: */
+                                                     0, /* U+0102de: */
+                                                     0, /* U+0102df: */
+                                                     0, /* U+0102e0: */
+                                                     0, /* U+0102e1: */
+                                                     0, /* U+0102e2: */
+                                                     0, /* U+0102e3: */
+                                                     0, /* U+0102e4: */
+                                                     0, /* U+0102e5: */
+                                                     0, /* U+0102e6: */
+                                                     0, /* U+0102e7: */
+                                                     0, /* U+0102e8: */
+                                                     0, /* U+0102e9: */
+                                                     0, /* U+0102ea: */
+                                                     0, /* U+0102eb: */
+                                                     0, /* U+0102ec: */
+                                                     0, /* U+0102ed: */
+                                                     0, /* U+0102ee: */
+                                                     0, /* U+0102ef: */
+                                                     0, /* U+0102f0: */
+                                                     0, /* U+0102f1: */
+                                                     0, /* U+0102f2: */
+                                                     0, /* U+0102f3: */
+                                                     0, /* U+0102f4: */
+                                                     0, /* U+0102f5: */
+                                                     0, /* U+0102f6: */
+                                                     0, /* U+0102f7: */
+                                                     0, /* U+0102f8: */
+                                                     0, /* U+0102f9: */
+                                                     0, /* U+0102fa: */
+                                                     0, /* U+0102fb: */
+                                                     0, /* U+0102fc: */
+                                                     0, /* U+0102fd: */
+                                                     0, /* U+0102fe: */
+                                                     0, /* U+0102ff: */
+                                           RTUNI_ALPHA, /* U+010300: OLD ITALIC LETTER A*/
+                                           RTUNI_ALPHA, /* U+010301: OLD ITALIC LETTER BE*/
+                                           RTUNI_ALPHA, /* U+010302: OLD ITALIC LETTER KE*/
+                                           RTUNI_ALPHA, /* U+010303: OLD ITALIC LETTER DE*/
+                                           RTUNI_ALPHA, /* U+010304: OLD ITALIC LETTER E*/
+                                           RTUNI_ALPHA, /* U+010305: OLD ITALIC LETTER VE*/
+                                           RTUNI_ALPHA, /* U+010306: OLD ITALIC LETTER ZE*/
+                                           RTUNI_ALPHA, /* U+010307: OLD ITALIC LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010308: OLD ITALIC LETTER THE*/
+                                           RTUNI_ALPHA, /* U+010309: OLD ITALIC LETTER I*/
+                                           RTUNI_ALPHA, /* U+01030a: OLD ITALIC LETTER KA*/
+                                           RTUNI_ALPHA, /* U+01030b: OLD ITALIC LETTER EL*/
+                                           RTUNI_ALPHA, /* U+01030c: OLD ITALIC LETTER EM*/
+                                           RTUNI_ALPHA, /* U+01030d: OLD ITALIC LETTER EN*/
+                                           RTUNI_ALPHA, /* U+01030e: OLD ITALIC LETTER ESH*/
+                                           RTUNI_ALPHA, /* U+01030f: OLD ITALIC LETTER O*/
+                                           RTUNI_ALPHA, /* U+010310: OLD ITALIC LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010311: OLD ITALIC LETTER SHE*/
+                                           RTUNI_ALPHA, /* U+010312: OLD ITALIC LETTER KU*/
+                                           RTUNI_ALPHA, /* U+010313: OLD ITALIC LETTER ER*/
+                                           RTUNI_ALPHA, /* U+010314: OLD ITALIC LETTER ES*/
+                                           RTUNI_ALPHA, /* U+010315: OLD ITALIC LETTER TE*/
+                                           RTUNI_ALPHA, /* U+010316: OLD ITALIC LETTER U*/
+                                           RTUNI_ALPHA, /* U+010317: OLD ITALIC LETTER EKS*/
+                                           RTUNI_ALPHA, /* U+010318: OLD ITALIC LETTER PHE*/
+                                           RTUNI_ALPHA, /* U+010319: OLD ITALIC LETTER KHE*/
+                                           RTUNI_ALPHA, /* U+01031a: OLD ITALIC LETTER EF*/
+                                           RTUNI_ALPHA, /* U+01031b: OLD ITALIC LETTER ERS*/
+                                           RTUNI_ALPHA, /* U+01031c: OLD ITALIC LETTER CHE*/
+                                           RTUNI_ALPHA, /* U+01031d: OLD ITALIC LETTER II*/
+                                           RTUNI_ALPHA, /* U+01031e: OLD ITALIC LETTER UU*/
+                                                     0, /* U+01031f: */
+                                                     0, /* U+010320: OLD ITALIC NUMERAL ONE*/
+                                                     0, /* U+010321: OLD ITALIC NUMERAL FIVE*/
+                                                     0, /* U+010322: OLD ITALIC NUMERAL TEN*/
+                                                     0, /* U+010323: OLD ITALIC NUMERAL FIFTY*/
+                                                     0, /* U+010324: */
+                                                     0, /* U+010325: */
+                                                     0, /* U+010326: */
+                                                     0, /* U+010327: */
+                                                     0, /* U+010328: */
+                                                     0, /* U+010329: */
+                                                     0, /* U+01032a: */
+                                                     0, /* U+01032b: */
+                                                     0, /* U+01032c: */
+                                                     0, /* U+01032d: */
+                                                     0, /* U+01032e: */
+                                                     0, /* U+01032f: */
+                                           RTUNI_ALPHA, /* U+010330: GOTHIC LETTER AHSA*/
+                                           RTUNI_ALPHA, /* U+010331: GOTHIC LETTER BAIRKAN*/
+                                           RTUNI_ALPHA, /* U+010332: GOTHIC LETTER GIBA*/
+                                           RTUNI_ALPHA, /* U+010333: GOTHIC LETTER DAGS*/
+                                           RTUNI_ALPHA, /* U+010334: GOTHIC LETTER AIHVUS*/
+                                           RTUNI_ALPHA, /* U+010335: GOTHIC LETTER QAIRTHRA*/
+                                           RTUNI_ALPHA, /* U+010336: GOTHIC LETTER IUJA*/
+                                           RTUNI_ALPHA, /* U+010337: GOTHIC LETTER HAGL*/
+                                           RTUNI_ALPHA, /* U+010338: GOTHIC LETTER THIUTH*/
+                                           RTUNI_ALPHA, /* U+010339: GOTHIC LETTER EIS*/
+                                           RTUNI_ALPHA, /* U+01033a: GOTHIC LETTER KUSMA*/
+                                           RTUNI_ALPHA, /* U+01033b: GOTHIC LETTER LAGUS*/
+                                           RTUNI_ALPHA, /* U+01033c: GOTHIC LETTER MANNA*/
+                                           RTUNI_ALPHA, /* U+01033d: GOTHIC LETTER NAUTHS*/
+                                           RTUNI_ALPHA, /* U+01033e: GOTHIC LETTER JER*/
+                                           RTUNI_ALPHA, /* U+01033f: GOTHIC LETTER URUS*/
+                                           RTUNI_ALPHA, /* U+010340: GOTHIC LETTER PAIRTHRA*/
+                                           RTUNI_ALPHA, /* U+010341: GOTHIC LETTER NINETY*/
+                                           RTUNI_ALPHA, /* U+010342: GOTHIC LETTER RAIDA*/
+                                           RTUNI_ALPHA, /* U+010343: GOTHIC LETTER SAUIL*/
+                                           RTUNI_ALPHA, /* U+010344: GOTHIC LETTER TEIWS*/
+                                           RTUNI_ALPHA, /* U+010345: GOTHIC LETTER WINJA*/
+                                           RTUNI_ALPHA, /* U+010346: GOTHIC LETTER FAIHU*/
+                                           RTUNI_ALPHA, /* U+010347: GOTHIC LETTER IGGWS*/
+                                           RTUNI_ALPHA, /* U+010348: GOTHIC LETTER HWAIR*/
+                                           RTUNI_ALPHA, /* U+010349: GOTHIC LETTER OTHAL*/
+                                           RTUNI_ALPHA, /* U+01034a: GOTHIC LETTER NINE HUNDRED*/
+                                                     0, /* U+01034b: */
+                                                     0, /* U+01034c: */
+                                                     0, /* U+01034d: */
+                                                     0, /* U+01034e: */
+                                                     0, /* U+01034f: */
+                                                     0, /* U+010350: */
+                                                     0, /* U+010351: */
+                                                     0, /* U+010352: */
+                                                     0, /* U+010353: */
+                                                     0, /* U+010354: */
+                                                     0, /* U+010355: */
+                                                     0, /* U+010356: */
+                                                     0, /* U+010357: */
+                                                     0, /* U+010358: */
+                                                     0, /* U+010359: */
+                                                     0, /* U+01035a: */
+                                                     0, /* U+01035b: */
+                                                     0, /* U+01035c: */
+                                                     0, /* U+01035d: */
+                                                     0, /* U+01035e: */
+                                                     0, /* U+01035f: */
+                                                     0, /* U+010360: */
+                                                     0, /* U+010361: */
+                                                     0, /* U+010362: */
+                                                     0, /* U+010363: */
+                                                     0, /* U+010364: */
+                                                     0, /* U+010365: */
+                                                     0, /* U+010366: */
+                                                     0, /* U+010367: */
+                                                     0, /* U+010368: */
+                                                     0, /* U+010369: */
+                                                     0, /* U+01036a: */
+                                                     0, /* U+01036b: */
+                                                     0, /* U+01036c: */
+                                                     0, /* U+01036d: */
+                                                     0, /* U+01036e: */
+                                                     0, /* U+01036f: */
+                                                     0, /* U+010370: */
+                                                     0, /* U+010371: */
+                                                     0, /* U+010372: */
+                                                     0, /* U+010373: */
+                                                     0, /* U+010374: */
+                                                     0, /* U+010375: */
+                                                     0, /* U+010376: */
+                                                     0, /* U+010377: */
+                                                     0, /* U+010378: */
+                                                     0, /* U+010379: */
+                                                     0, /* U+01037a: */
+                                                     0, /* U+01037b: */
+                                                     0, /* U+01037c: */
+                                                     0, /* U+01037d: */
+                                                     0, /* U+01037e: */
+                                                     0, /* U+01037f: */
+                                           RTUNI_ALPHA, /* U+010380: UGARITIC LETTER ALPA*/
+                                           RTUNI_ALPHA, /* U+010381: UGARITIC LETTER BETA*/
+                                           RTUNI_ALPHA, /* U+010382: UGARITIC LETTER GAMLA*/
+                                           RTUNI_ALPHA, /* U+010383: UGARITIC LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+010384: UGARITIC LETTER DELTA*/
+                                           RTUNI_ALPHA, /* U+010385: UGARITIC LETTER HO*/
+                                           RTUNI_ALPHA, /* U+010386: UGARITIC LETTER WO*/
+                                           RTUNI_ALPHA, /* U+010387: UGARITIC LETTER ZETA*/
+                                           RTUNI_ALPHA, /* U+010388: UGARITIC LETTER HOTA*/
+                                           RTUNI_ALPHA, /* U+010389: UGARITIC LETTER TET*/
+                                           RTUNI_ALPHA, /* U+01038a: UGARITIC LETTER YOD*/
+                                           RTUNI_ALPHA, /* U+01038b: UGARITIC LETTER KAF*/
+                                           RTUNI_ALPHA, /* U+01038c: UGARITIC LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+01038d: UGARITIC LETTER LAMDA*/
+                                           RTUNI_ALPHA, /* U+01038e: UGARITIC LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+01038f: UGARITIC LETTER DHAL*/
+                                           RTUNI_ALPHA, /* U+010390: UGARITIC LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+010391: UGARITIC LETTER ZU*/
+                                           RTUNI_ALPHA, /* U+010392: UGARITIC LETTER SAMKA*/
+                                           RTUNI_ALPHA, /* U+010393: UGARITIC LETTER AIN*/
+                                           RTUNI_ALPHA, /* U+010394: UGARITIC LETTER PU*/
+                                           RTUNI_ALPHA, /* U+010395: UGARITIC LETTER SADE*/
+                                           RTUNI_ALPHA, /* U+010396: UGARITIC LETTER QOPA*/
+                                           RTUNI_ALPHA, /* U+010397: UGARITIC LETTER RASHA*/
+                                           RTUNI_ALPHA, /* U+010398: UGARITIC LETTER THANNA*/
+                                           RTUNI_ALPHA, /* U+010399: UGARITIC LETTER GHAIN*/
+                                           RTUNI_ALPHA, /* U+01039a: UGARITIC LETTER TO*/
+                                           RTUNI_ALPHA, /* U+01039b: UGARITIC LETTER I*/
+                                           RTUNI_ALPHA, /* U+01039c: UGARITIC LETTER U*/
+                                           RTUNI_ALPHA, /* U+01039d: UGARITIC LETTER SSU*/
+                                                     0, /* U+01039e: */
+                                                     0, /* U+01039f: UGARITIC WORD DIVIDER*/
+                                           RTUNI_ALPHA, /* U+0103a0: OLD PERSIAN SIGN A*/
+                                           RTUNI_ALPHA, /* U+0103a1: OLD PERSIAN SIGN I*/
+                                           RTUNI_ALPHA, /* U+0103a2: OLD PERSIAN SIGN U*/
+                                           RTUNI_ALPHA, /* U+0103a3: OLD PERSIAN SIGN KA*/
+                                           RTUNI_ALPHA, /* U+0103a4: OLD PERSIAN SIGN KU*/
+                                           RTUNI_ALPHA, /* U+0103a5: OLD PERSIAN SIGN GA*/
+                                           RTUNI_ALPHA, /* U+0103a6: OLD PERSIAN SIGN GU*/
+                                           RTUNI_ALPHA, /* U+0103a7: OLD PERSIAN SIGN XA*/
+                                           RTUNI_ALPHA, /* U+0103a8: OLD PERSIAN SIGN CA*/
+                                           RTUNI_ALPHA, /* U+0103a9: OLD PERSIAN SIGN JA*/
+                                           RTUNI_ALPHA, /* U+0103aa: OLD PERSIAN SIGN JI*/
+                                           RTUNI_ALPHA, /* U+0103ab: OLD PERSIAN SIGN TA*/
+                                           RTUNI_ALPHA, /* U+0103ac: OLD PERSIAN SIGN TU*/
+                                           RTUNI_ALPHA, /* U+0103ad: OLD PERSIAN SIGN DA*/
+                                           RTUNI_ALPHA, /* U+0103ae: OLD PERSIAN SIGN DI*/
+                                           RTUNI_ALPHA, /* U+0103af: OLD PERSIAN SIGN DU*/
+                                           RTUNI_ALPHA, /* U+0103b0: OLD PERSIAN SIGN THA*/
+                                           RTUNI_ALPHA, /* U+0103b1: OLD PERSIAN SIGN PA*/
+                                           RTUNI_ALPHA, /* U+0103b2: OLD PERSIAN SIGN BA*/
+                                           RTUNI_ALPHA, /* U+0103b3: OLD PERSIAN SIGN FA*/
+                                           RTUNI_ALPHA, /* U+0103b4: OLD PERSIAN SIGN NA*/
+                                           RTUNI_ALPHA, /* U+0103b5: OLD PERSIAN SIGN NU*/
+                                           RTUNI_ALPHA, /* U+0103b6: OLD PERSIAN SIGN MA*/
+                                           RTUNI_ALPHA, /* U+0103b7: OLD PERSIAN SIGN MI*/
+                                           RTUNI_ALPHA, /* U+0103b8: OLD PERSIAN SIGN MU*/
+                                           RTUNI_ALPHA, /* U+0103b9: OLD PERSIAN SIGN YA*/
+                                           RTUNI_ALPHA, /* U+0103ba: OLD PERSIAN SIGN VA*/
+                                           RTUNI_ALPHA, /* U+0103bb: OLD PERSIAN SIGN VI*/
+                                           RTUNI_ALPHA, /* U+0103bc: OLD PERSIAN SIGN RA*/
+                                           RTUNI_ALPHA, /* U+0103bd: OLD PERSIAN SIGN RU*/
+                                           RTUNI_ALPHA, /* U+0103be: OLD PERSIAN SIGN LA*/
+                                           RTUNI_ALPHA, /* U+0103bf: OLD PERSIAN SIGN SA*/
+                                           RTUNI_ALPHA, /* U+0103c0: OLD PERSIAN SIGN ZA*/
+                                           RTUNI_ALPHA, /* U+0103c1: OLD PERSIAN SIGN SHA*/
+                                           RTUNI_ALPHA, /* U+0103c2: OLD PERSIAN SIGN SSA*/
+                                           RTUNI_ALPHA, /* U+0103c3: OLD PERSIAN SIGN HA*/
+                                                     0, /* U+0103c4: */
+                                                     0, /* U+0103c5: */
+                                                     0, /* U+0103c6: */
+                                                     0, /* U+0103c7: */
+                                           RTUNI_ALPHA, /* U+0103c8: OLD PERSIAN SIGN AURAMAZDAA*/
+                                           RTUNI_ALPHA, /* U+0103c9: OLD PERSIAN SIGN AURAMAZDAA-2*/
+                                           RTUNI_ALPHA, /* U+0103ca: OLD PERSIAN SIGN AURAMAZDAAHA*/
+                                           RTUNI_ALPHA, /* U+0103cb: OLD PERSIAN SIGN XSHAAYATHIYA*/
+                                           RTUNI_ALPHA, /* U+0103cc: OLD PERSIAN SIGN DAHYAAUSH*/
+                                           RTUNI_ALPHA, /* U+0103cd: OLD PERSIAN SIGN DAHYAAUSH-2*/
+                                           RTUNI_ALPHA, /* U+0103ce: OLD PERSIAN SIGN BAGA*/
+                                           RTUNI_ALPHA, /* U+0103cf: OLD PERSIAN SIGN BUUMISH*/
+                                                     0, /* U+0103d0: OLD PERSIAN WORD DIVIDER*/
+                                           RTUNI_ALPHA, /* U+0103d1: OLD PERSIAN NUMBER ONE*/
+                                           RTUNI_ALPHA, /* U+0103d2: OLD PERSIAN NUMBER TWO*/
+                                           RTUNI_ALPHA, /* U+0103d3: OLD PERSIAN NUMBER TEN*/
+                                           RTUNI_ALPHA, /* U+0103d4: OLD PERSIAN NUMBER TWENTY*/
+                                           RTUNI_ALPHA, /* U+0103d5: OLD PERSIAN NUMBER HUNDRED*/
+                                                     0, /* U+0103d6: */
+                                                     0, /* U+0103d7: */
+                                                     0, /* U+0103d8: */
+                                                     0, /* U+0103d9: */
+                                                     0, /* U+0103da: */
+                                                     0, /* U+0103db: */
+                                                     0, /* U+0103dc: */
+                                                     0, /* U+0103dd: */
+                                                     0, /* U+0103de: */
+                                                     0, /* U+0103df: */
+                                                     0, /* U+0103e0: */
+                                                     0, /* U+0103e1: */
+                                                     0, /* U+0103e2: */
+                                                     0, /* U+0103e3: */
+                                                     0, /* U+0103e4: */
+                                                     0, /* U+0103e5: */
+                                                     0, /* U+0103e6: */
+                                                     0, /* U+0103e7: */
+                                                     0, /* U+0103e8: */
+                                                     0, /* U+0103e9: */
+                                                     0, /* U+0103ea: */
+                                                     0, /* U+0103eb: */
+                                                     0, /* U+0103ec: */
+                                                     0, /* U+0103ed: */
+                                                     0, /* U+0103ee: */
+                                                     0, /* U+0103ef: */
+                                                     0, /* U+0103f0: */
+                                                     0, /* U+0103f1: */
+                                                     0, /* U+0103f2: */
+                                                     0, /* U+0103f3: */
+                                                     0, /* U+0103f4: */
+                                                     0, /* U+0103f5: */
+                                                     0, /* U+0103f6: */
+                                                     0, /* U+0103f7: */
+                                                     0, /* U+0103f8: */
+                                                     0, /* U+0103f9: */
+                                                     0, /* U+0103fa: */
+                                                     0, /* U+0103fb: */
+                                                     0, /* U+0103fc: */
+                                                     0, /* U+0103fd: */
+                                                     0, /* U+0103fe: */
+                                                     0, /* U+0103ff: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010400: DESERET CAPITAL LETTER LONG I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010401: DESERET CAPITAL LETTER LONG E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010402: DESERET CAPITAL LETTER LONG A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010404: DESERET CAPITAL LETTER LONG O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040c: DESERET CAPITAL LETTER AY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040d: DESERET CAPITAL LETTER OW*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040e: DESERET CAPITAL LETTER WU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040f: DESERET CAPITAL LETTER YEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010410: DESERET CAPITAL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010411: DESERET CAPITAL LETTER PEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010412: DESERET CAPITAL LETTER BEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010413: DESERET CAPITAL LETTER TEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010414: DESERET CAPITAL LETTER DEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010415: DESERET CAPITAL LETTER CHEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010416: DESERET CAPITAL LETTER JEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010417: DESERET CAPITAL LETTER KAY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010418: DESERET CAPITAL LETTER GAY*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010419: DESERET CAPITAL LETTER EF*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041a: DESERET CAPITAL LETTER VEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041b: DESERET CAPITAL LETTER ETH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041c: DESERET CAPITAL LETTER THEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041d: DESERET CAPITAL LETTER ES*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041f: DESERET CAPITAL LETTER ESH*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010421: DESERET CAPITAL LETTER ER*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010422: DESERET CAPITAL LETTER EL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010423: DESERET CAPITAL LETTER EM*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010424: DESERET CAPITAL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010425: DESERET CAPITAL LETTER ENG*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010426: DESERET CAPITAL LETTER OI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010427: DESERET CAPITAL LETTER EW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010428: DESERET SMALL LETTER LONG I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010429: DESERET SMALL LETTER LONG E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042a: DESERET SMALL LETTER LONG A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042b: DESERET SMALL LETTER LONG AH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042c: DESERET SMALL LETTER LONG O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042d: DESERET SMALL LETTER LONG OO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042e: DESERET SMALL LETTER SHORT I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042f: DESERET SMALL LETTER SHORT E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010430: DESERET SMALL LETTER SHORT A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010431: DESERET SMALL LETTER SHORT AH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010432: DESERET SMALL LETTER SHORT O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010433: DESERET SMALL LETTER SHORT OO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010434: DESERET SMALL LETTER AY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010435: DESERET SMALL LETTER OW*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010436: DESERET SMALL LETTER WU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010437: DESERET SMALL LETTER YEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010438: DESERET SMALL LETTER H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010439: DESERET SMALL LETTER PEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043a: DESERET SMALL LETTER BEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043b: DESERET SMALL LETTER TEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043c: DESERET SMALL LETTER DEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043d: DESERET SMALL LETTER CHEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043e: DESERET SMALL LETTER JEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043f: DESERET SMALL LETTER KAY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010440: DESERET SMALL LETTER GAY*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010441: DESERET SMALL LETTER EF*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010442: DESERET SMALL LETTER VEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010443: DESERET SMALL LETTER ETH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010444: DESERET SMALL LETTER THEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010445: DESERET SMALL LETTER ES*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010446: DESERET SMALL LETTER ZEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010447: DESERET SMALL LETTER ESH*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010448: DESERET SMALL LETTER ZHEE*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010449: DESERET SMALL LETTER ER*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044a: DESERET SMALL LETTER EL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044b: DESERET SMALL LETTER EM*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044c: DESERET SMALL LETTER EN*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044d: DESERET SMALL LETTER ENG*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044e: DESERET SMALL LETTER OI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044f: DESERET SMALL LETTER EW*/
+                                           RTUNI_ALPHA, /* U+010450: SHAVIAN LETTER PEEP*/
+                                           RTUNI_ALPHA, /* U+010451: SHAVIAN LETTER TOT*/
+                                           RTUNI_ALPHA, /* U+010452: SHAVIAN LETTER KICK*/
+                                           RTUNI_ALPHA, /* U+010453: SHAVIAN LETTER FEE*/
+                                           RTUNI_ALPHA, /* U+010454: SHAVIAN LETTER THIGH*/
+                                           RTUNI_ALPHA, /* U+010455: SHAVIAN LETTER SO*/
+                                           RTUNI_ALPHA, /* U+010456: SHAVIAN LETTER SURE*/
+                                           RTUNI_ALPHA, /* U+010457: SHAVIAN LETTER CHURCH*/
+                                           RTUNI_ALPHA, /* U+010458: SHAVIAN LETTER YEA*/
+                                           RTUNI_ALPHA, /* U+010459: SHAVIAN LETTER HUNG*/
+                                           RTUNI_ALPHA, /* U+01045a: SHAVIAN LETTER BIB*/
+                                           RTUNI_ALPHA, /* U+01045b: SHAVIAN LETTER DEAD*/
+                                           RTUNI_ALPHA, /* U+01045c: SHAVIAN LETTER GAG*/
+                                           RTUNI_ALPHA, /* U+01045d: SHAVIAN LETTER VOW*/
+                                           RTUNI_ALPHA, /* U+01045e: SHAVIAN LETTER THEY*/
+                                           RTUNI_ALPHA, /* U+01045f: SHAVIAN LETTER ZOO*/
+                                           RTUNI_ALPHA, /* U+010460: SHAVIAN LETTER MEASURE*/
+                                           RTUNI_ALPHA, /* U+010461: SHAVIAN LETTER JUDGE*/
+                                           RTUNI_ALPHA, /* U+010462: SHAVIAN LETTER WOE*/
+                                           RTUNI_ALPHA, /* U+010463: SHAVIAN LETTER HA-HA*/
+                                           RTUNI_ALPHA, /* U+010464: SHAVIAN LETTER LOLL*/
+                                           RTUNI_ALPHA, /* U+010465: SHAVIAN LETTER MIME*/
+                                           RTUNI_ALPHA, /* U+010466: SHAVIAN LETTER IF*/
+                                           RTUNI_ALPHA, /* U+010467: SHAVIAN LETTER EGG*/
+                                           RTUNI_ALPHA, /* U+010468: SHAVIAN LETTER ASH*/
+                                           RTUNI_ALPHA, /* U+010469: SHAVIAN LETTER ADO*/
+                                           RTUNI_ALPHA, /* U+01046a: SHAVIAN LETTER ON*/
+                                           RTUNI_ALPHA, /* U+01046b: SHAVIAN LETTER WOOL*/
+                                           RTUNI_ALPHA, /* U+01046c: SHAVIAN LETTER OUT*/
+                                           RTUNI_ALPHA, /* U+01046d: SHAVIAN LETTER AH*/
+                                           RTUNI_ALPHA, /* U+01046e: SHAVIAN LETTER ROAR*/
+                                           RTUNI_ALPHA, /* U+01046f: SHAVIAN LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+010470: SHAVIAN LETTER EAT*/
+                                           RTUNI_ALPHA, /* U+010471: SHAVIAN LETTER AGE*/
+                                           RTUNI_ALPHA, /* U+010472: SHAVIAN LETTER ICE*/
+                                           RTUNI_ALPHA, /* U+010473: SHAVIAN LETTER UP*/
+                                           RTUNI_ALPHA, /* U+010474: SHAVIAN LETTER OAK*/
+                                           RTUNI_ALPHA, /* U+010475: SHAVIAN LETTER OOZE*/
+                                           RTUNI_ALPHA, /* U+010476: SHAVIAN LETTER OIL*/
+                                           RTUNI_ALPHA, /* U+010477: SHAVIAN LETTER AWE*/
+                                           RTUNI_ALPHA, /* U+010478: SHAVIAN LETTER ARE*/
+                                           RTUNI_ALPHA, /* U+010479: SHAVIAN LETTER OR*/
+                                           RTUNI_ALPHA, /* U+01047a: SHAVIAN LETTER AIR*/
+                                           RTUNI_ALPHA, /* U+01047b: SHAVIAN LETTER ERR*/
+                                           RTUNI_ALPHA, /* U+01047c: SHAVIAN LETTER ARRAY*/
+                                           RTUNI_ALPHA, /* U+01047d: SHAVIAN LETTER EAR*/
+                                           RTUNI_ALPHA, /* U+01047e: SHAVIAN LETTER IAN*/
+                                           RTUNI_ALPHA, /* U+01047f: SHAVIAN LETTER YEW*/
+                                           RTUNI_ALPHA, /* U+010480: OSMANYA LETTER ALEF*/
+                                           RTUNI_ALPHA, /* U+010481: OSMANYA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+010482: OSMANYA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+010483: OSMANYA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+010484: OSMANYA LETTER XA*/
+                                           RTUNI_ALPHA, /* U+010485: OSMANYA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+010486: OSMANYA LETTER DEEL*/
+                                           RTUNI_ALPHA, /* U+010487: OSMANYA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+010488: OSMANYA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+010489: OSMANYA LETTER SHIIN*/
+                                           RTUNI_ALPHA, /* U+01048a: OSMANYA LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+01048b: OSMANYA LETTER CAYN*/
+                                           RTUNI_ALPHA, /* U+01048c: OSMANYA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+01048d: OSMANYA LETTER FA*/
+                                           RTUNI_ALPHA, /* U+01048e: OSMANYA LETTER QAAF*/
+                                           RTUNI_ALPHA, /* U+01048f: OSMANYA LETTER KAAF*/
+                                           RTUNI_ALPHA, /* U+010490: OSMANYA LETTER LAAN*/
+                                           RTUNI_ALPHA, /* U+010491: OSMANYA LETTER MIIN*/
+                                           RTUNI_ALPHA, /* U+010492: OSMANYA LETTER NUUN*/
+                                           RTUNI_ALPHA, /* U+010493: OSMANYA LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+010494: OSMANYA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+010495: OSMANYA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+010496: OSMANYA LETTER A*/
+                                           RTUNI_ALPHA, /* U+010497: OSMANYA LETTER E*/
+                                           RTUNI_ALPHA, /* U+010498: OSMANYA LETTER I*/
+                                           RTUNI_ALPHA, /* U+010499: OSMANYA LETTER O*/
+                                           RTUNI_ALPHA, /* U+01049a: OSMANYA LETTER U*/
+                                           RTUNI_ALPHA, /* U+01049b: OSMANYA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+01049c: OSMANYA LETTER EE*/
+                                           RTUNI_ALPHA, /* U+01049d: OSMANYA LETTER OO*/
+                                                     0, /* U+01049e: */
+                                                     0, /* U+01049f: */
+                                          RTUNI_DDIGIT, /* U+0104a0: OSMANYA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0104a1: OSMANYA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0104a2: OSMANYA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0104a3: OSMANYA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0104a4: OSMANYA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0104a5: OSMANYA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0104a6: OSMANYA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0104a7: OSMANYA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0104a8: OSMANYA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0104a9: OSMANYA DIGIT NINE*/
+                                                     0, /* U+0104aa: */
+                                                     0, /* U+0104ab: */
+                                                     0, /* U+0104ac: */
+                                                     0, /* U+0104ad: */
+                                                     0, /* U+0104ae: */
+                                                     0, /* U+0104af: */
+                                                     0, /* U+0104b0: */
+                                                     0, /* U+0104b1: */
+                                                     0, /* U+0104b2: */
+                                                     0, /* U+0104b3: */
+                                                     0, /* U+0104b4: */
+                                                     0, /* U+0104b5: */
+                                                     0, /* U+0104b6: */
+                                                     0, /* U+0104b7: */
+                                                     0, /* U+0104b8: */
+                                                     0, /* U+0104b9: */
+                                                     0, /* U+0104ba: */
+                                                     0, /* U+0104bb: */
+                                                     0, /* U+0104bc: */
+                                                     0, /* U+0104bd: */
+                                                     0, /* U+0104be: */
+                                                     0, /* U+0104bf: */
+                                                     0, /* U+0104c0: */
+                                                     0, /* U+0104c1: */
+                                                     0, /* U+0104c2: */
+                                                     0, /* U+0104c3: */
+                                                     0, /* U+0104c4: */
+                                                     0, /* U+0104c5: */
+                                                     0, /* U+0104c6: */
+                                                     0, /* U+0104c7: */
+                                                     0, /* U+0104c8: */
+                                                     0, /* U+0104c9: */
+                                                     0, /* U+0104ca: */
+                                                     0, /* U+0104cb: */
+                                                     0, /* U+0104cc: */
+                                                     0, /* U+0104cd: */
+                                                     0, /* U+0104ce: */
+                                                     0, /* U+0104cf: */
+                                                     0, /* U+0104d0: */
+                                                     0, /* U+0104d1: */
+                                                     0, /* U+0104d2: */
+                                                     0, /* U+0104d3: */
+                                                     0, /* U+0104d4: */
+                                                     0, /* U+0104d5: */
+                                                     0, /* U+0104d6: */
+                                                     0, /* U+0104d7: */
+                                                     0, /* U+0104d8: */
+                                                     0, /* U+0104d9: */
+                                                     0, /* U+0104da: */
+                                                     0, /* U+0104db: */
+                                                     0, /* U+0104dc: */
+                                                     0, /* U+0104dd: */
+                                                     0, /* U+0104de: */
+                                                     0, /* U+0104df: */
+                                                     0, /* U+0104e0: */
+                                                     0, /* U+0104e1: */
+                                                     0, /* U+0104e2: */
+                                                     0, /* U+0104e3: */
+                                                     0, /* U+0104e4: */
+                                                     0, /* U+0104e5: */
+                                                     0, /* U+0104e6: */
+                                                     0, /* U+0104e7: */
+                                                     0, /* U+0104e8: */
+                                                     0, /* U+0104e9: */
+                                                     0, /* U+0104ea: */
+                                                     0, /* U+0104eb: */
+                                                     0, /* U+0104ec: */
+                                                     0, /* U+0104ed: */
+                                                     0, /* U+0104ee: */
+                                                     0, /* U+0104ef: */
+                                                     0, /* U+0104f0: */
+                                                     0, /* U+0104f1: */
+                                                     0, /* U+0104f2: */
+                                                     0, /* U+0104f3: */
+                                                     0, /* U+0104f4: */
+                                                     0, /* U+0104f5: */
+                                                     0, /* U+0104f6: */
+                                                     0, /* U+0104f7: */
+                                                     0, /* U+0104f8: */
+                                                     0, /* U+0104f9: */
+                                                     0, /* U+0104fa: */
+                                                     0, /* U+0104fb: */
+                                                     0, /* U+0104fc: */
+                                                     0, /* U+0104fd: */
+                                                     0, /* U+0104fe: */
+                                                     0, /* U+0104ff: */
+                                                     0, /* U+010500: */
+                                                     0, /* U+010501: */
+                                                     0, /* U+010502: */
+                                                     0, /* U+010503: */
+                                                     0, /* U+010504: */
+                                                     0, /* U+010505: */
+                                                     0, /* U+010506: */
+                                                     0, /* U+010507: */
+                                                     0, /* U+010508: */
+                                                     0, /* U+010509: */
+                                                     0, /* U+01050a: */
+                                                     0, /* U+01050b: */
+                                                     0, /* U+01050c: */
+                                                     0, /* U+01050d: */
+                                                     0, /* U+01050e: */
+                                                     0, /* U+01050f: */
+                                                     0, /* U+010510: */
+                                                     0, /* U+010511: */
+                                                     0, /* U+010512: */
+                                                     0, /* U+010513: */
+                                                     0, /* U+010514: */
+                                                     0, /* U+010515: */
+                                                     0, /* U+010516: */
+                                                     0, /* U+010517: */
+                                                     0, /* U+010518: */
+                                                     0, /* U+010519: */
+                                                     0, /* U+01051a: */
+                                                     0, /* U+01051b: */
+                                                     0, /* U+01051c: */
+                                                     0, /* U+01051d: */
+                                                     0, /* U+01051e: */
+                                                     0, /* U+01051f: */
+                                                     0, /* U+010520: */
+                                                     0, /* U+010521: */
+                                                     0, /* U+010522: */
+                                                     0, /* U+010523: */
+                                                     0, /* U+010524: */
+                                                     0, /* U+010525: */
+                                                     0, /* U+010526: */
+                                                     0, /* U+010527: */
+                                                     0, /* U+010528: */
+                                                     0, /* U+010529: */
+                                                     0, /* U+01052a: */
+                                                     0, /* U+01052b: */
+                                                     0, /* U+01052c: */
+                                                     0, /* U+01052d: */
+                                                     0, /* U+01052e: */
+                                                     0, /* U+01052f: */
+                                                     0, /* U+010530: */
+                                                     0, /* U+010531: */
+                                                     0, /* U+010532: */
+                                                     0, /* U+010533: */
+                                                     0, /* U+010534: */
+                                                     0, /* U+010535: */
+                                                     0, /* U+010536: */
+                                                     0, /* U+010537: */
+                                                     0, /* U+010538: */
+                                                     0, /* U+010539: */
+                                                     0, /* U+01053a: */
+                                                     0, /* U+01053b: */
+                                                     0, /* U+01053c: */
+                                                     0, /* U+01053d: */
+                                                     0, /* U+01053e: */
+                                                     0, /* U+01053f: */
+                                                     0, /* U+010540: */
+                                                     0, /* U+010541: */
+                                                     0, /* U+010542: */
+                                                     0, /* U+010543: */
+                                                     0, /* U+010544: */
+                                                     0, /* U+010545: */
+                                                     0, /* U+010546: */
+                                                     0, /* U+010547: */
+                                                     0, /* U+010548: */
+                                                     0, /* U+010549: */
+                                                     0, /* U+01054a: */
+                                                     0, /* U+01054b: */
+                                                     0, /* U+01054c: */
+                                                     0, /* U+01054d: */
+                                                     0, /* U+01054e: */
+                                                     0, /* U+01054f: */
+                                                     0, /* U+010550: */
+                                                     0, /* U+010551: */
+                                                     0, /* U+010552: */
+                                                     0, /* U+010553: */
+                                                     0, /* U+010554: */
+                                                     0, /* U+010555: */
+                                                     0, /* U+010556: */
+                                                     0, /* U+010557: */
+                                                     0, /* U+010558: */
+                                                     0, /* U+010559: */
+                                                     0, /* U+01055a: */
+                                                     0, /* U+01055b: */
+                                                     0, /* U+01055c: */
+                                                     0, /* U+01055d: */
+                                                     0, /* U+01055e: */
+                                                     0, /* U+01055f: */
+                                                     0, /* U+010560: */
+                                                     0, /* U+010561: */
+                                                     0, /* U+010562: */
+                                                     0, /* U+010563: */
+                                                     0, /* U+010564: */
+                                                     0, /* U+010565: */
+                                                     0, /* U+010566: */
+                                                     0, /* U+010567: */
+                                                     0, /* U+010568: */
+                                                     0, /* U+010569: */
+                                                     0, /* U+01056a: */
+                                                     0, /* U+01056b: */
+                                                     0, /* U+01056c: */
+                                                     0, /* U+01056d: */
+                                                     0, /* U+01056e: */
+                                                     0, /* U+01056f: */
+                                                     0, /* U+010570: */
+                                                     0, /* U+010571: */
+                                                     0, /* U+010572: */
+                                                     0, /* U+010573: */
+                                                     0, /* U+010574: */
+                                                     0, /* U+010575: */
+                                                     0, /* U+010576: */
+                                                     0, /* U+010577: */
+                                                     0, /* U+010578: */
+                                                     0, /* U+010579: */
+                                                     0, /* U+01057a: */
+                                                     0, /* U+01057b: */
+                                                     0, /* U+01057c: */
+                                                     0, /* U+01057d: */
+                                                     0, /* U+01057e: */
+                                                     0, /* U+01057f: */
+                                                     0, /* U+010580: */
+                                                     0, /* U+010581: */
+                                                     0, /* U+010582: */
+                                                     0, /* U+010583: */
+                                                     0, /* U+010584: */
+                                                     0, /* U+010585: */
+                                                     0, /* U+010586: */
+                                                     0, /* U+010587: */
+                                                     0, /* U+010588: */
+                                                     0, /* U+010589: */
+                                                     0, /* U+01058a: */
+                                                     0, /* U+01058b: */
+                                                     0, /* U+01058c: */
+                                                     0, /* U+01058d: */
+                                                     0, /* U+01058e: */
+                                                     0, /* U+01058f: */
+                                                     0, /* U+010590: */
+                                                     0, /* U+010591: */
+                                                     0, /* U+010592: */
+                                                     0, /* U+010593: */
+                                                     0, /* U+010594: */
+                                                     0, /* U+010595: */
+                                                     0, /* U+010596: */
+                                                     0, /* U+010597: */
+                                                     0, /* U+010598: */
+                                                     0, /* U+010599: */
+                                                     0, /* U+01059a: */
+                                                     0, /* U+01059b: */
+                                                     0, /* U+01059c: */
+                                                     0, /* U+01059d: */
+                                                     0, /* U+01059e: */
+                                                     0, /* U+01059f: */
+                                                     0, /* U+0105a0: */
+                                                     0, /* U+0105a1: */
+                                                     0, /* U+0105a2: */
+                                                     0, /* U+0105a3: */
+                                                     0, /* U+0105a4: */
+                                                     0, /* U+0105a5: */
+                                                     0, /* U+0105a6: */
+                                                     0, /* U+0105a7: */
+                                                     0, /* U+0105a8: */
+                                                     0, /* U+0105a9: */
+                                                     0, /* U+0105aa: */
+                                                     0, /* U+0105ab: */
+                                                     0, /* U+0105ac: */
+                                                     0, /* U+0105ad: */
+                                                     0, /* U+0105ae: */
+                                                     0, /* U+0105af: */
+                                                     0, /* U+0105b0: */
+                                                     0, /* U+0105b1: */
+                                                     0, /* U+0105b2: */
+                                                     0, /* U+0105b3: */
+                                                     0, /* U+0105b4: */
+                                                     0, /* U+0105b5: */
+                                                     0, /* U+0105b6: */
+                                                     0, /* U+0105b7: */
+                                                     0, /* U+0105b8: */
+                                                     0, /* U+0105b9: */
+                                                     0, /* U+0105ba: */
+                                                     0, /* U+0105bb: */
+                                                     0, /* U+0105bc: */
+                                                     0, /* U+0105bd: */
+                                                     0, /* U+0105be: */
+                                                     0, /* U+0105bf: */
+                                                     0, /* U+0105c0: */
+                                                     0, /* U+0105c1: */
+                                                     0, /* U+0105c2: */
+                                                     0, /* U+0105c3: */
+                                                     0, /* U+0105c4: */
+                                                     0, /* U+0105c5: */
+                                                     0, /* U+0105c6: */
+                                                     0, /* U+0105c7: */
+                                                     0, /* U+0105c8: */
+                                                     0, /* U+0105c9: */
+                                                     0, /* U+0105ca: */
+                                                     0, /* U+0105cb: */
+                                                     0, /* U+0105cc: */
+                                                     0, /* U+0105cd: */
+                                                     0, /* U+0105ce: */
+                                                     0, /* U+0105cf: */
+                                                     0, /* U+0105d0: */
+                                                     0, /* U+0105d1: */
+                                                     0, /* U+0105d2: */
+                                                     0, /* U+0105d3: */
+                                                     0, /* U+0105d4: */
+                                                     0, /* U+0105d5: */
+                                                     0, /* U+0105d6: */
+                                                     0, /* U+0105d7: */
+                                                     0, /* U+0105d8: */
+                                                     0, /* U+0105d9: */
+                                                     0, /* U+0105da: */
+                                                     0, /* U+0105db: */
+                                                     0, /* U+0105dc: */
+                                                     0, /* U+0105dd: */
+                                                     0, /* U+0105de: */
+                                                     0, /* U+0105df: */
+                                                     0, /* U+0105e0: */
+                                                     0, /* U+0105e1: */
+                                                     0, /* U+0105e2: */
+                                                     0, /* U+0105e3: */
+                                                     0, /* U+0105e4: */
+                                                     0, /* U+0105e5: */
+                                                     0, /* U+0105e6: */
+                                                     0, /* U+0105e7: */
+                                                     0, /* U+0105e8: */
+                                                     0, /* U+0105e9: */
+                                                     0, /* U+0105ea: */
+                                                     0, /* U+0105eb: */
+                                                     0, /* U+0105ec: */
+                                                     0, /* U+0105ed: */
+                                                     0, /* U+0105ee: */
+                                                     0, /* U+0105ef: */
+                                                     0, /* U+0105f0: */
+                                                     0, /* U+0105f1: */
+                                                     0, /* U+0105f2: */
+                                                     0, /* U+0105f3: */
+                                                     0, /* U+0105f4: */
+                                                     0, /* U+0105f5: */
+                                                     0, /* U+0105f6: */
+                                                     0, /* U+0105f7: */
+                                                     0, /* U+0105f8: */
+                                                     0, /* U+0105f9: */
+                                                     0, /* U+0105fa: */
+                                                     0, /* U+0105fb: */
+                                                     0, /* U+0105fc: */
+                                                     0, /* U+0105fd: */
+                                                     0, /* U+0105fe: */
+                                                     0, /* U+0105ff: */
+                                                     0, /* U+010600: */
+                                                     0, /* U+010601: */
+                                                     0, /* U+010602: */
+                                                     0, /* U+010603: */
+                                                     0, /* U+010604: */
+                                                     0, /* U+010605: */
+                                                     0, /* U+010606: */
+                                                     0, /* U+010607: */
+                                                     0, /* U+010608: */
+                                                     0, /* U+010609: */
+                                                     0, /* U+01060a: */
+                                                     0, /* U+01060b: */
+                                                     0, /* U+01060c: */
+                                                     0, /* U+01060d: */
+                                                     0, /* U+01060e: */
+                                                     0, /* U+01060f: */
+                                                     0, /* U+010610: */
+                                                     0, /* U+010611: */
+                                                     0, /* U+010612: */
+                                                     0, /* U+010613: */
+                                                     0, /* U+010614: */
+                                                     0, /* U+010615: */
+                                                     0, /* U+010616: */
+                                                     0, /* U+010617: */
+                                                     0, /* U+010618: */
+                                                     0, /* U+010619: */
+                                                     0, /* U+01061a: */
+                                                     0, /* U+01061b: */
+                                                     0, /* U+01061c: */
+                                                     0, /* U+01061d: */
+                                                     0, /* U+01061e: */
+                                                     0, /* U+01061f: */
+                                                     0, /* U+010620: */
+                                                     0, /* U+010621: */
+                                                     0, /* U+010622: */
+                                                     0, /* U+010623: */
+                                                     0, /* U+010624: */
+                                                     0, /* U+010625: */
+                                                     0, /* U+010626: */
+                                                     0, /* U+010627: */
+                                                     0, /* U+010628: */
+                                                     0, /* U+010629: */
+                                                     0, /* U+01062a: */
+                                                     0, /* U+01062b: */
+                                                     0, /* U+01062c: */
+                                                     0, /* U+01062d: */
+                                                     0, /* U+01062e: */
+                                                     0, /* U+01062f: */
+                                                     0, /* U+010630: */
+                                                     0, /* U+010631: */
+                                                     0, /* U+010632: */
+                                                     0, /* U+010633: */
+                                                     0, /* U+010634: */
+                                                     0, /* U+010635: */
+                                                     0, /* U+010636: */
+                                                     0, /* U+010637: */
+                                                     0, /* U+010638: */
+                                                     0, /* U+010639: */
+                                                     0, /* U+01063a: */
+                                                     0, /* U+01063b: */
+                                                     0, /* U+01063c: */
+                                                     0, /* U+01063d: */
+                                                     0, /* U+01063e: */
+                                                     0, /* U+01063f: */
+                                                     0, /* U+010640: */
+                                                     0, /* U+010641: */
+                                                     0, /* U+010642: */
+                                                     0, /* U+010643: */
+                                                     0, /* U+010644: */
+                                                     0, /* U+010645: */
+                                                     0, /* U+010646: */
+                                                     0, /* U+010647: */
+                                                     0, /* U+010648: */
+                                                     0, /* U+010649: */
+                                                     0, /* U+01064a: */
+                                                     0, /* U+01064b: */
+                                                     0, /* U+01064c: */
+                                                     0, /* U+01064d: */
+                                                     0, /* U+01064e: */
+                                                     0, /* U+01064f: */
+                                                     0, /* U+010650: */
+                                                     0, /* U+010651: */
+                                                     0, /* U+010652: */
+                                                     0, /* U+010653: */
+                                                     0, /* U+010654: */
+                                                     0, /* U+010655: */
+                                                     0, /* U+010656: */
+                                                     0, /* U+010657: */
+                                                     0, /* U+010658: */
+                                                     0, /* U+010659: */
+                                                     0, /* U+01065a: */
+                                                     0, /* U+01065b: */
+                                                     0, /* U+01065c: */
+                                                     0, /* U+01065d: */
+                                                     0, /* U+01065e: */
+                                                     0, /* U+01065f: */
+                                                     0, /* U+010660: */
+                                                     0, /* U+010661: */
+                                                     0, /* U+010662: */
+                                                     0, /* U+010663: */
+                                                     0, /* U+010664: */
+                                                     0, /* U+010665: */
+                                                     0, /* U+010666: */
+                                                     0, /* U+010667: */
+                                                     0, /* U+010668: */
+                                                     0, /* U+010669: */
+                                                     0, /* U+01066a: */
+                                                     0, /* U+01066b: */
+                                                     0, /* U+01066c: */
+                                                     0, /* U+01066d: */
+                                                     0, /* U+01066e: */
+                                                     0, /* U+01066f: */
+                                                     0, /* U+010670: */
+                                                     0, /* U+010671: */
+                                                     0, /* U+010672: */
+                                                     0, /* U+010673: */
+                                                     0, /* U+010674: */
+                                                     0, /* U+010675: */
+                                                     0, /* U+010676: */
+                                                     0, /* U+010677: */
+                                                     0, /* U+010678: */
+                                                     0, /* U+010679: */
+                                                     0, /* U+01067a: */
+                                                     0, /* U+01067b: */
+                                                     0, /* U+01067c: */
+                                                     0, /* U+01067d: */
+                                                     0, /* U+01067e: */
+                                                     0, /* U+01067f: */
+                                                     0, /* U+010680: */
+                                                     0, /* U+010681: */
+                                                     0, /* U+010682: */
+                                                     0, /* U+010683: */
+                                                     0, /* U+010684: */
+                                                     0, /* U+010685: */
+                                                     0, /* U+010686: */
+                                                     0, /* U+010687: */
+                                                     0, /* U+010688: */
+                                                     0, /* U+010689: */
+                                                     0, /* U+01068a: */
+                                                     0, /* U+01068b: */
+                                                     0, /* U+01068c: */
+                                                     0, /* U+01068d: */
+                                                     0, /* U+01068e: */
+                                                     0, /* U+01068f: */
+                                                     0, /* U+010690: */
+                                                     0, /* U+010691: */
+                                                     0, /* U+010692: */
+                                                     0, /* U+010693: */
+                                                     0, /* U+010694: */
+                                                     0, /* U+010695: */
+                                                     0, /* U+010696: */
+                                                     0, /* U+010697: */
+                                                     0, /* U+010698: */
+                                                     0, /* U+010699: */
+                                                     0, /* U+01069a: */
+                                                     0, /* U+01069b: */
+                                                     0, /* U+01069c: */
+                                                     0, /* U+01069d: */
+                                                     0, /* U+01069e: */
+                                                     0, /* U+01069f: */
+                                                     0, /* U+0106a0: */
+                                                     0, /* U+0106a1: */
+                                                     0, /* U+0106a2: */
+                                                     0, /* U+0106a3: */
+                                                     0, /* U+0106a4: */
+                                                     0, /* U+0106a5: */
+                                                     0, /* U+0106a6: */
+                                                     0, /* U+0106a7: */
+                                                     0, /* U+0106a8: */
+                                                     0, /* U+0106a9: */
+                                                     0, /* U+0106aa: */
+                                                     0, /* U+0106ab: */
+                                                     0, /* U+0106ac: */
+                                                     0, /* U+0106ad: */
+                                                     0, /* U+0106ae: */
+                                                     0, /* U+0106af: */
+                                                     0, /* U+0106b0: */
+                                                     0, /* U+0106b1: */
+                                                     0, /* U+0106b2: */
+                                                     0, /* U+0106b3: */
+                                                     0, /* U+0106b4: */
+                                                     0, /* U+0106b5: */
+                                                     0, /* U+0106b6: */
+                                                     0, /* U+0106b7: */
+                                                     0, /* U+0106b8: */
+                                                     0, /* U+0106b9: */
+                                                     0, /* U+0106ba: */
+                                                     0, /* U+0106bb: */
+                                                     0, /* U+0106bc: */
+                                                     0, /* U+0106bd: */
+                                                     0, /* U+0106be: */
+                                                     0, /* U+0106bf: */
+                                                     0, /* U+0106c0: */
+                                                     0, /* U+0106c1: */
+                                                     0, /* U+0106c2: */
+                                                     0, /* U+0106c3: */
+                                                     0, /* U+0106c4: */
+                                                     0, /* U+0106c5: */
+                                                     0, /* U+0106c6: */
+                                                     0, /* U+0106c7: */
+                                                     0, /* U+0106c8: */
+                                                     0, /* U+0106c9: */
+                                                     0, /* U+0106ca: */
+                                                     0, /* U+0106cb: */
+                                                     0, /* U+0106cc: */
+                                                     0, /* U+0106cd: */
+                                                     0, /* U+0106ce: */
+                                                     0, /* U+0106cf: */
+                                                     0, /* U+0106d0: */
+                                                     0, /* U+0106d1: */
+                                                     0, /* U+0106d2: */
+                                                     0, /* U+0106d3: */
+                                                     0, /* U+0106d4: */
+                                                     0, /* U+0106d5: */
+                                                     0, /* U+0106d6: */
+                                                     0, /* U+0106d7: */
+                                                     0, /* U+0106d8: */
+                                                     0, /* U+0106d9: */
+                                                     0, /* U+0106da: */
+                                                     0, /* U+0106db: */
+                                                     0, /* U+0106dc: */
+                                                     0, /* U+0106dd: */
+                                                     0, /* U+0106de: */
+                                                     0, /* U+0106df: */
+                                                     0, /* U+0106e0: */
+                                                     0, /* U+0106e1: */
+                                                     0, /* U+0106e2: */
+                                                     0, /* U+0106e3: */
+                                                     0, /* U+0106e4: */
+                                                     0, /* U+0106e5: */
+                                                     0, /* U+0106e6: */
+                                                     0, /* U+0106e7: */
+                                                     0, /* U+0106e8: */
+                                                     0, /* U+0106e9: */
+                                                     0, /* U+0106ea: */
+                                                     0, /* U+0106eb: */
+                                                     0, /* U+0106ec: */
+                                                     0, /* U+0106ed: */
+                                                     0, /* U+0106ee: */
+                                                     0, /* U+0106ef: */
+                                                     0, /* U+0106f0: */
+                                                     0, /* U+0106f1: */
+                                                     0, /* U+0106f2: */
+                                                     0, /* U+0106f3: */
+                                                     0, /* U+0106f4: */
+                                                     0, /* U+0106f5: */
+                                                     0, /* U+0106f6: */
+                                                     0, /* U+0106f7: */
+                                                     0, /* U+0106f8: */
+                                                     0, /* U+0106f9: */
+                                                     0, /* U+0106fa: */
+                                                     0, /* U+0106fb: */
+                                                     0, /* U+0106fc: */
+                                                     0, /* U+0106fd: */
+                                                     0, /* U+0106fe: */
+                                                     0, /* U+0106ff: */
+                                                     0, /* U+010700: */
+                                                     0, /* U+010701: */
+                                                     0, /* U+010702: */
+                                                     0, /* U+010703: */
+                                                     0, /* U+010704: */
+                                                     0, /* U+010705: */
+                                                     0, /* U+010706: */
+                                                     0, /* U+010707: */
+                                                     0, /* U+010708: */
+                                                     0, /* U+010709: */
+                                                     0, /* U+01070a: */
+                                                     0, /* U+01070b: */
+                                                     0, /* U+01070c: */
+                                                     0, /* U+01070d: */
+                                                     0, /* U+01070e: */
+                                                     0, /* U+01070f: */
+                                                     0, /* U+010710: */
+                                                     0, /* U+010711: */
+                                                     0, /* U+010712: */
+                                                     0, /* U+010713: */
+                                                     0, /* U+010714: */
+                                                     0, /* U+010715: */
+                                                     0, /* U+010716: */
+                                                     0, /* U+010717: */
+                                                     0, /* U+010718: */
+                                                     0, /* U+010719: */
+                                                     0, /* U+01071a: */
+                                                     0, /* U+01071b: */
+                                                     0, /* U+01071c: */
+                                                     0, /* U+01071d: */
+                                                     0, /* U+01071e: */
+                                                     0, /* U+01071f: */
+                                                     0, /* U+010720: */
+                                                     0, /* U+010721: */
+                                                     0, /* U+010722: */
+                                                     0, /* U+010723: */
+                                                     0, /* U+010724: */
+                                                     0, /* U+010725: */
+                                                     0, /* U+010726: */
+                                                     0, /* U+010727: */
+                                                     0, /* U+010728: */
+                                                     0, /* U+010729: */
+                                                     0, /* U+01072a: */
+                                                     0, /* U+01072b: */
+                                                     0, /* U+01072c: */
+                                                     0, /* U+01072d: */
+                                                     0, /* U+01072e: */
+                                                     0, /* U+01072f: */
+                                                     0, /* U+010730: */
+                                                     0, /* U+010731: */
+                                                     0, /* U+010732: */
+                                                     0, /* U+010733: */
+                                                     0, /* U+010734: */
+                                                     0, /* U+010735: */
+                                                     0, /* U+010736: */
+                                                     0, /* U+010737: */
+                                                     0, /* U+010738: */
+                                                     0, /* U+010739: */
+                                                     0, /* U+01073a: */
+                                                     0, /* U+01073b: */
+                                                     0, /* U+01073c: */
+                                                     0, /* U+01073d: */
+                                                     0, /* U+01073e: */
+                                                     0, /* U+01073f: */
+                                                     0, /* U+010740: */
+                                                     0, /* U+010741: */
+                                                     0, /* U+010742: */
+                                                     0, /* U+010743: */
+                                                     0, /* U+010744: */
+                                                     0, /* U+010745: */
+                                                     0, /* U+010746: */
+                                                     0, /* U+010747: */
+                                                     0, /* U+010748: */
+                                                     0, /* U+010749: */
+                                                     0, /* U+01074a: */
+                                                     0, /* U+01074b: */
+                                                     0, /* U+01074c: */
+                                                     0, /* U+01074d: */
+                                                     0, /* U+01074e: */
+                                                     0, /* U+01074f: */
+                                                     0, /* U+010750: */
+                                                     0, /* U+010751: */
+                                                     0, /* U+010752: */
+                                                     0, /* U+010753: */
+                                                     0, /* U+010754: */
+                                                     0, /* U+010755: */
+                                                     0, /* U+010756: */
+                                                     0, /* U+010757: */
+                                                     0, /* U+010758: */
+                                                     0, /* U+010759: */
+                                                     0, /* U+01075a: */
+                                                     0, /* U+01075b: */
+                                                     0, /* U+01075c: */
+                                                     0, /* U+01075d: */
+                                                     0, /* U+01075e: */
+                                                     0, /* U+01075f: */
+                                                     0, /* U+010760: */
+                                                     0, /* U+010761: */
+                                                     0, /* U+010762: */
+                                                     0, /* U+010763: */
+                                                     0, /* U+010764: */
+                                                     0, /* U+010765: */
+                                                     0, /* U+010766: */
+                                                     0, /* U+010767: */
+                                                     0, /* U+010768: */
+                                                     0, /* U+010769: */
+                                                     0, /* U+01076a: */
+                                                     0, /* U+01076b: */
+                                                     0, /* U+01076c: */
+                                                     0, /* U+01076d: */
+                                                     0, /* U+01076e: */
+                                                     0, /* U+01076f: */
+                                                     0, /* U+010770: */
+                                                     0, /* U+010771: */
+                                                     0, /* U+010772: */
+                                                     0, /* U+010773: */
+                                                     0, /* U+010774: */
+                                                     0, /* U+010775: */
+                                                     0, /* U+010776: */
+                                                     0, /* U+010777: */
+                                                     0, /* U+010778: */
+                                                     0, /* U+010779: */
+                                                     0, /* U+01077a: */
+                                                     0, /* U+01077b: */
+                                                     0, /* U+01077c: */
+                                                     0, /* U+01077d: */
+                                                     0, /* U+01077e: */
+                                                     0, /* U+01077f: */
+                                                     0, /* U+010780: */
+                                                     0, /* U+010781: */
+                                                     0, /* U+010782: */
+                                                     0, /* U+010783: */
+                                                     0, /* U+010784: */
+                                                     0, /* U+010785: */
+                                                     0, /* U+010786: */
+                                                     0, /* U+010787: */
+                                                     0, /* U+010788: */
+                                                     0, /* U+010789: */
+                                                     0, /* U+01078a: */
+                                                     0, /* U+01078b: */
+                                                     0, /* U+01078c: */
+                                                     0, /* U+01078d: */
+                                                     0, /* U+01078e: */
+                                                     0, /* U+01078f: */
+                                                     0, /* U+010790: */
+                                                     0, /* U+010791: */
+                                                     0, /* U+010792: */
+                                                     0, /* U+010793: */
+                                                     0, /* U+010794: */
+                                                     0, /* U+010795: */
+                                                     0, /* U+010796: */
+                                                     0, /* U+010797: */
+                                                     0, /* U+010798: */
+                                                     0, /* U+010799: */
+                                                     0, /* U+01079a: */
+                                                     0, /* U+01079b: */
+                                                     0, /* U+01079c: */
+                                                     0, /* U+01079d: */
+                                                     0, /* U+01079e: */
+                                                     0, /* U+01079f: */
+                                                     0, /* U+0107a0: */
+                                                     0, /* U+0107a1: */
+                                                     0, /* U+0107a2: */
+                                                     0, /* U+0107a3: */
+                                                     0, /* U+0107a4: */
+                                                     0, /* U+0107a5: */
+                                                     0, /* U+0107a6: */
+                                                     0, /* U+0107a7: */
+                                                     0, /* U+0107a8: */
+                                                     0, /* U+0107a9: */
+                                                     0, /* U+0107aa: */
+                                                     0, /* U+0107ab: */
+                                                     0, /* U+0107ac: */
+                                                     0, /* U+0107ad: */
+                                                     0, /* U+0107ae: */
+                                                     0, /* U+0107af: */
+                                                     0, /* U+0107b0: */
+                                                     0, /* U+0107b1: */
+                                                     0, /* U+0107b2: */
+                                                     0, /* U+0107b3: */
+                                                     0, /* U+0107b4: */
+                                                     0, /* U+0107b5: */
+                                                     0, /* U+0107b6: */
+                                                     0, /* U+0107b7: */
+                                                     0, /* U+0107b8: */
+                                                     0, /* U+0107b9: */
+                                                     0, /* U+0107ba: */
+                                                     0, /* U+0107bb: */
+                                                     0, /* U+0107bc: */
+                                                     0, /* U+0107bd: */
+                                                     0, /* U+0107be: */
+                                                     0, /* U+0107bf: */
+                                                     0, /* U+0107c0: */
+                                                     0, /* U+0107c1: */
+                                                     0, /* U+0107c2: */
+                                                     0, /* U+0107c3: */
+                                                     0, /* U+0107c4: */
+                                                     0, /* U+0107c5: */
+                                                     0, /* U+0107c6: */
+                                                     0, /* U+0107c7: */
+                                                     0, /* U+0107c8: */
+                                                     0, /* U+0107c9: */
+                                                     0, /* U+0107ca: */
+                                                     0, /* U+0107cb: */
+                                                     0, /* U+0107cc: */
+                                                     0, /* U+0107cd: */
+                                                     0, /* U+0107ce: */
+                                                     0, /* U+0107cf: */
+                                                     0, /* U+0107d0: */
+                                                     0, /* U+0107d1: */
+                                                     0, /* U+0107d2: */
+                                                     0, /* U+0107d3: */
+                                                     0, /* U+0107d4: */
+                                                     0, /* U+0107d5: */
+                                                     0, /* U+0107d6: */
+                                                     0, /* U+0107d7: */
+                                                     0, /* U+0107d8: */
+                                                     0, /* U+0107d9: */
+                                                     0, /* U+0107da: */
+                                                     0, /* U+0107db: */
+                                                     0, /* U+0107dc: */
+                                                     0, /* U+0107dd: */
+                                                     0, /* U+0107de: */
+                                                     0, /* U+0107df: */
+                                                     0, /* U+0107e0: */
+                                                     0, /* U+0107e1: */
+                                                     0, /* U+0107e2: */
+                                                     0, /* U+0107e3: */
+                                                     0, /* U+0107e4: */
+                                                     0, /* U+0107e5: */
+                                                     0, /* U+0107e6: */
+                                                     0, /* U+0107e7: */
+                                                     0, /* U+0107e8: */
+                                                     0, /* U+0107e9: */
+                                                     0, /* U+0107ea: */
+                                                     0, /* U+0107eb: */
+                                                     0, /* U+0107ec: */
+                                                     0, /* U+0107ed: */
+                                                     0, /* U+0107ee: */
+                                                     0, /* U+0107ef: */
+                                                     0, /* U+0107f0: */
+                                                     0, /* U+0107f1: */
+                                                     0, /* U+0107f2: */
+                                                     0, /* U+0107f3: */
+                                                     0, /* U+0107f4: */
+                                                     0, /* U+0107f5: */
+                                                     0, /* U+0107f6: */
+                                                     0, /* U+0107f7: */
+                                                     0, /* U+0107f8: */
+                                                     0, /* U+0107f9: */
+                                                     0, /* U+0107fa: */
+                                                     0, /* U+0107fb: */
+                                                     0, /* U+0107fc: */
+                                                     0, /* U+0107fd: */
+                                                     0, /* U+0107fe: */
+                                                     0, /* U+0107ff: */
+                                           RTUNI_ALPHA, /* U+010800: CYPRIOT SYLLABLE A*/
+                                           RTUNI_ALPHA, /* U+010801: CYPRIOT SYLLABLE E*/
+                                           RTUNI_ALPHA, /* U+010802: CYPRIOT SYLLABLE I*/
+                                           RTUNI_ALPHA, /* U+010803: CYPRIOT SYLLABLE O*/
+                                           RTUNI_ALPHA, /* U+010804: CYPRIOT SYLLABLE U*/
+                                           RTUNI_ALPHA, /* U+010805: CYPRIOT SYLLABLE JA*/
+                                                     0, /* U+010806: */
+                                                     0, /* U+010807: */
+                                           RTUNI_ALPHA, /* U+010808: CYPRIOT SYLLABLE JO*/
+                                                     0, /* U+010809: */
+                                           RTUNI_ALPHA, /* U+01080a: CYPRIOT SYLLABLE KA*/
+                                           RTUNI_ALPHA, /* U+01080b: CYPRIOT SYLLABLE KE*/
+                                           RTUNI_ALPHA, /* U+01080c: CYPRIOT SYLLABLE KI*/
+                                           RTUNI_ALPHA, /* U+01080d: CYPRIOT SYLLABLE KO*/
+                                           RTUNI_ALPHA, /* U+01080e: CYPRIOT SYLLABLE KU*/
+                                           RTUNI_ALPHA, /* U+01080f: CYPRIOT SYLLABLE LA*/
+                                           RTUNI_ALPHA, /* U+010810: CYPRIOT SYLLABLE LE*/
+                                           RTUNI_ALPHA, /* U+010811: CYPRIOT SYLLABLE LI*/
+                                           RTUNI_ALPHA, /* U+010812: CYPRIOT SYLLABLE LO*/
+                                           RTUNI_ALPHA, /* U+010813: CYPRIOT SYLLABLE LU*/
+                                           RTUNI_ALPHA, /* U+010814: CYPRIOT SYLLABLE MA*/
+                                           RTUNI_ALPHA, /* U+010815: CYPRIOT SYLLABLE ME*/
+                                           RTUNI_ALPHA, /* U+010816: CYPRIOT SYLLABLE MI*/
+                                           RTUNI_ALPHA, /* U+010817: CYPRIOT SYLLABLE MO*/
+                                           RTUNI_ALPHA, /* U+010818: CYPRIOT SYLLABLE MU*/
+                                           RTUNI_ALPHA, /* U+010819: CYPRIOT SYLLABLE NA*/
+                                           RTUNI_ALPHA, /* U+01081a: CYPRIOT SYLLABLE NE*/
+                                           RTUNI_ALPHA, /* U+01081b: CYPRIOT SYLLABLE NI*/
+                                           RTUNI_ALPHA, /* U+01081c: CYPRIOT SYLLABLE NO*/
+                                           RTUNI_ALPHA, /* U+01081d: CYPRIOT SYLLABLE NU*/
+                                           RTUNI_ALPHA, /* U+01081e: CYPRIOT SYLLABLE PA*/
+                                           RTUNI_ALPHA, /* U+01081f: CYPRIOT SYLLABLE PE*/
+                                           RTUNI_ALPHA, /* U+010820: CYPRIOT SYLLABLE PI*/
+                                           RTUNI_ALPHA, /* U+010821: CYPRIOT SYLLABLE PO*/
+                                           RTUNI_ALPHA, /* U+010822: CYPRIOT SYLLABLE PU*/
+                                           RTUNI_ALPHA, /* U+010823: CYPRIOT SYLLABLE RA*/
+                                           RTUNI_ALPHA, /* U+010824: CYPRIOT SYLLABLE RE*/
+                                           RTUNI_ALPHA, /* U+010825: CYPRIOT SYLLABLE RI*/
+                                           RTUNI_ALPHA, /* U+010826: CYPRIOT SYLLABLE RO*/
+                                           RTUNI_ALPHA, /* U+010827: CYPRIOT SYLLABLE RU*/
+                                           RTUNI_ALPHA, /* U+010828: CYPRIOT SYLLABLE SA*/
+                                           RTUNI_ALPHA, /* U+010829: CYPRIOT SYLLABLE SE*/
+                                           RTUNI_ALPHA, /* U+01082a: CYPRIOT SYLLABLE SI*/
+                                           RTUNI_ALPHA, /* U+01082b: CYPRIOT SYLLABLE SO*/
+                                           RTUNI_ALPHA, /* U+01082c: CYPRIOT SYLLABLE SU*/
+                                           RTUNI_ALPHA, /* U+01082d: CYPRIOT SYLLABLE TA*/
+                                           RTUNI_ALPHA, /* U+01082e: CYPRIOT SYLLABLE TE*/
+                                           RTUNI_ALPHA, /* U+01082f: CYPRIOT SYLLABLE TI*/
+                                           RTUNI_ALPHA, /* U+010830: CYPRIOT SYLLABLE TO*/
+                                           RTUNI_ALPHA, /* U+010831: CYPRIOT SYLLABLE TU*/
+                                           RTUNI_ALPHA, /* U+010832: CYPRIOT SYLLABLE WA*/
+                                           RTUNI_ALPHA, /* U+010833: CYPRIOT SYLLABLE WE*/
+                                           RTUNI_ALPHA, /* U+010834: CYPRIOT SYLLABLE WI*/
+                                           RTUNI_ALPHA, /* U+010835: CYPRIOT SYLLABLE WO*/
+                                                     0, /* U+010836: */
+                                           RTUNI_ALPHA, /* U+010837: CYPRIOT SYLLABLE XA*/
+                                           RTUNI_ALPHA, /* U+010838: CYPRIOT SYLLABLE XE*/
+                                                     0, /* U+010839: */
+                                                     0, /* U+01083a: */
+                                                     0, /* U+01083b: */
+                                           RTUNI_ALPHA, /* U+01083c: CYPRIOT SYLLABLE ZA*/
+                                                     0, /* U+01083d: */
+                                                     0, /* U+01083e: */
+                                           RTUNI_ALPHA, /* U+01083f: CYPRIOT SYLLABLE ZO*/
+                                           RTUNI_ALPHA, /* U+010840: IMPERIAL ARAMAIC LETTER ALEPH*/
+                                           RTUNI_ALPHA, /* U+010841: IMPERIAL ARAMAIC LETTER BETH*/
+                                           RTUNI_ALPHA, /* U+010842: IMPERIAL ARAMAIC LETTER GIMEL*/
+                                           RTUNI_ALPHA, /* U+010843: IMPERIAL ARAMAIC LETTER DALETH*/
+                                           RTUNI_ALPHA, /* U+010844: IMPERIAL ARAMAIC LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010845: IMPERIAL ARAMAIC LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+010846: IMPERIAL ARAMAIC LETTER ZAYIN*/
+                                           RTUNI_ALPHA, /* U+010847: IMPERIAL ARAMAIC LETTER HETH*/
+                                           RTUNI_ALPHA, /* U+010848: IMPERIAL ARAMAIC LETTER TETH*/
+                                           RTUNI_ALPHA, /* U+010849: IMPERIAL ARAMAIC LETTER YODH*/
+                                           RTUNI_ALPHA, /* U+01084a: IMPERIAL ARAMAIC LETTER KAPH*/
+                                           RTUNI_ALPHA, /* U+01084b: IMPERIAL ARAMAIC LETTER LAMEDH*/
+                                           RTUNI_ALPHA, /* U+01084c: IMPERIAL ARAMAIC LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+01084d: IMPERIAL ARAMAIC LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+01084e: IMPERIAL ARAMAIC LETTER SAMEKH*/
+                                           RTUNI_ALPHA, /* U+01084f: IMPERIAL ARAMAIC LETTER AYIN*/
+                                           RTUNI_ALPHA, /* U+010850: IMPERIAL ARAMAIC LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010851: IMPERIAL ARAMAIC LETTER SADHE*/
+                                           RTUNI_ALPHA, /* U+010852: IMPERIAL ARAMAIC LETTER QOPH*/
+                                           RTUNI_ALPHA, /* U+010853: IMPERIAL ARAMAIC LETTER RESH*/
+                                           RTUNI_ALPHA, /* U+010854: IMPERIAL ARAMAIC LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+010855: IMPERIAL ARAMAIC LETTER TAW*/
+                                                     0, /* U+010856: */
+                                                     0, /* U+010857: IMPERIAL ARAMAIC SECTION SIGN*/
+                                                     0, /* U+010858: IMPERIAL ARAMAIC NUMBER ONE*/
+                                                     0, /* U+010859: IMPERIAL ARAMAIC NUMBER TWO*/
+                                                     0, /* U+01085a: IMPERIAL ARAMAIC NUMBER THREE*/
+                                                     0, /* U+01085b: IMPERIAL ARAMAIC NUMBER TEN*/
+                                                     0, /* U+01085c: IMPERIAL ARAMAIC NUMBER TWENTY*/
+                                                     0, /* U+01085d: IMPERIAL ARAMAIC NUMBER ONE HUNDRED*/
+                                                     0, /* U+01085e: IMPERIAL ARAMAIC NUMBER ONE THOUSAND*/
+                                                     0, /* U+01085f: IMPERIAL ARAMAIC NUMBER TEN THOUSAND*/
+                                                     0, /* U+010860: */
+                                                     0, /* U+010861: */
+                                                     0, /* U+010862: */
+                                                     0, /* U+010863: */
+                                                     0, /* U+010864: */
+                                                     0, /* U+010865: */
+                                                     0, /* U+010866: */
+                                                     0, /* U+010867: */
+                                                     0, /* U+010868: */
+                                                     0, /* U+010869: */
+                                                     0, /* U+01086a: */
+                                                     0, /* U+01086b: */
+                                                     0, /* U+01086c: */
+                                                     0, /* U+01086d: */
+                                                     0, /* U+01086e: */
+                                                     0, /* U+01086f: */
+                                                     0, /* U+010870: */
+                                                     0, /* U+010871: */
+                                                     0, /* U+010872: */
+                                                     0, /* U+010873: */
+                                                     0, /* U+010874: */
+                                                     0, /* U+010875: */
+                                                     0, /* U+010876: */
+                                                     0, /* U+010877: */
+                                                     0, /* U+010878: */
+                                                     0, /* U+010879: */
+                                                     0, /* U+01087a: */
+                                                     0, /* U+01087b: */
+                                                     0, /* U+01087c: */
+                                                     0, /* U+01087d: */
+                                                     0, /* U+01087e: */
+                                                     0, /* U+01087f: */
+                                                     0, /* U+010880: */
+                                                     0, /* U+010881: */
+                                                     0, /* U+010882: */
+                                                     0, /* U+010883: */
+                                                     0, /* U+010884: */
+                                                     0, /* U+010885: */
+                                                     0, /* U+010886: */
+                                                     0, /* U+010887: */
+                                                     0, /* U+010888: */
+                                                     0, /* U+010889: */
+                                                     0, /* U+01088a: */
+                                                     0, /* U+01088b: */
+                                                     0, /* U+01088c: */
+                                                     0, /* U+01088d: */
+                                                     0, /* U+01088e: */
+                                                     0, /* U+01088f: */
+                                                     0, /* U+010890: */
+                                                     0, /* U+010891: */
+                                                     0, /* U+010892: */
+                                                     0, /* U+010893: */
+                                                     0, /* U+010894: */
+                                                     0, /* U+010895: */
+                                                     0, /* U+010896: */
+                                                     0, /* U+010897: */
+                                                     0, /* U+010898: */
+                                                     0, /* U+010899: */
+                                                     0, /* U+01089a: */
+                                                     0, /* U+01089b: */
+                                                     0, /* U+01089c: */
+                                                     0, /* U+01089d: */
+                                                     0, /* U+01089e: */
+                                                     0, /* U+01089f: */
+                                                     0, /* U+0108a0: */
+                                                     0, /* U+0108a1: */
+                                                     0, /* U+0108a2: */
+                                                     0, /* U+0108a3: */
+                                                     0, /* U+0108a4: */
+                                                     0, /* U+0108a5: */
+                                                     0, /* U+0108a6: */
+                                                     0, /* U+0108a7: */
+                                                     0, /* U+0108a8: */
+                                                     0, /* U+0108a9: */
+                                                     0, /* U+0108aa: */
+                                                     0, /* U+0108ab: */
+                                                     0, /* U+0108ac: */
+                                                     0, /* U+0108ad: */
+                                                     0, /* U+0108ae: */
+                                                     0, /* U+0108af: */
+                                                     0, /* U+0108b0: */
+                                                     0, /* U+0108b1: */
+                                                     0, /* U+0108b2: */
+                                                     0, /* U+0108b3: */
+                                                     0, /* U+0108b4: */
+                                                     0, /* U+0108b5: */
+                                                     0, /* U+0108b6: */
+                                                     0, /* U+0108b7: */
+                                                     0, /* U+0108b8: */
+                                                     0, /* U+0108b9: */
+                                                     0, /* U+0108ba: */
+                                                     0, /* U+0108bb: */
+                                                     0, /* U+0108bc: */
+                                                     0, /* U+0108bd: */
+                                                     0, /* U+0108be: */
+                                                     0, /* U+0108bf: */
+                                                     0, /* U+0108c0: */
+                                                     0, /* U+0108c1: */
+                                                     0, /* U+0108c2: */
+                                                     0, /* U+0108c3: */
+                                                     0, /* U+0108c4: */
+                                                     0, /* U+0108c5: */
+                                                     0, /* U+0108c6: */
+                                                     0, /* U+0108c7: */
+                                                     0, /* U+0108c8: */
+                                                     0, /* U+0108c9: */
+                                                     0, /* U+0108ca: */
+                                                     0, /* U+0108cb: */
+                                                     0, /* U+0108cc: */
+                                                     0, /* U+0108cd: */
+                                                     0, /* U+0108ce: */
+                                                     0, /* U+0108cf: */
+                                                     0, /* U+0108d0: */
+                                                     0, /* U+0108d1: */
+                                                     0, /* U+0108d2: */
+                                                     0, /* U+0108d3: */
+                                                     0, /* U+0108d4: */
+                                                     0, /* U+0108d5: */
+                                                     0, /* U+0108d6: */
+                                                     0, /* U+0108d7: */
+                                                     0, /* U+0108d8: */
+                                                     0, /* U+0108d9: */
+                                                     0, /* U+0108da: */
+                                                     0, /* U+0108db: */
+                                                     0, /* U+0108dc: */
+                                                     0, /* U+0108dd: */
+                                                     0, /* U+0108de: */
+                                                     0, /* U+0108df: */
+                                                     0, /* U+0108e0: */
+                                                     0, /* U+0108e1: */
+                                                     0, /* U+0108e2: */
+                                                     0, /* U+0108e3: */
+                                                     0, /* U+0108e4: */
+                                                     0, /* U+0108e5: */
+                                                     0, /* U+0108e6: */
+                                                     0, /* U+0108e7: */
+                                                     0, /* U+0108e8: */
+                                                     0, /* U+0108e9: */
+                                                     0, /* U+0108ea: */
+                                                     0, /* U+0108eb: */
+                                                     0, /* U+0108ec: */
+                                                     0, /* U+0108ed: */
+                                                     0, /* U+0108ee: */
+                                                     0, /* U+0108ef: */
+                                                     0, /* U+0108f0: */
+                                                     0, /* U+0108f1: */
+                                                     0, /* U+0108f2: */
+                                                     0, /* U+0108f3: */
+                                                     0, /* U+0108f4: */
+                                                     0, /* U+0108f5: */
+                                                     0, /* U+0108f6: */
+                                                     0, /* U+0108f7: */
+                                                     0, /* U+0108f8: */
+                                                     0, /* U+0108f9: */
+                                                     0, /* U+0108fa: */
+                                                     0, /* U+0108fb: */
+                                                     0, /* U+0108fc: */
+                                                     0, /* U+0108fd: */
+                                                     0, /* U+0108fe: */
+                                                     0, /* U+0108ff: */
+                                           RTUNI_ALPHA, /* U+010900: PHOENICIAN LETTER ALF*/
+                                           RTUNI_ALPHA, /* U+010901: PHOENICIAN LETTER BET*/
+                                           RTUNI_ALPHA, /* U+010902: PHOENICIAN LETTER GAML*/
+                                           RTUNI_ALPHA, /* U+010903: PHOENICIAN LETTER DELT*/
+                                           RTUNI_ALPHA, /* U+010904: PHOENICIAN LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010905: PHOENICIAN LETTER WAU*/
+                                           RTUNI_ALPHA, /* U+010906: PHOENICIAN LETTER ZAI*/
+                                           RTUNI_ALPHA, /* U+010907: PHOENICIAN LETTER HET*/
+                                           RTUNI_ALPHA, /* U+010908: PHOENICIAN LETTER TET*/
+                                           RTUNI_ALPHA, /* U+010909: PHOENICIAN LETTER YOD*/
+                                           RTUNI_ALPHA, /* U+01090a: PHOENICIAN LETTER KAF*/
+                                           RTUNI_ALPHA, /* U+01090b: PHOENICIAN LETTER LAMD*/
+                                           RTUNI_ALPHA, /* U+01090c: PHOENICIAN LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+01090d: PHOENICIAN LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+01090e: PHOENICIAN LETTER SEMK*/
+                                           RTUNI_ALPHA, /* U+01090f: PHOENICIAN LETTER AIN*/
+                                           RTUNI_ALPHA, /* U+010910: PHOENICIAN LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010911: PHOENICIAN LETTER SADE*/
+                                           RTUNI_ALPHA, /* U+010912: PHOENICIAN LETTER QOF*/
+                                           RTUNI_ALPHA, /* U+010913: PHOENICIAN LETTER ROSH*/
+                                           RTUNI_ALPHA, /* U+010914: PHOENICIAN LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+010915: PHOENICIAN LETTER TAU*/
+                                                     0, /* U+010916: PHOENICIAN NUMBER ONE*/
+                                                     0, /* U+010917: PHOENICIAN NUMBER TEN*/
+                                                     0, /* U+010918: PHOENICIAN NUMBER TWENTY*/
+                                                     0, /* U+010919: PHOENICIAN NUMBER ONE HUNDRED*/
+                                                     0, /* U+01091a: PHOENICIAN NUMBER TWO*/
+                                                     0, /* U+01091b: PHOENICIAN NUMBER THREE*/
+                                                     0, /* U+01091c: */
+                                                     0, /* U+01091d: */
+                                                     0, /* U+01091e: */
+                                                     0, /* U+01091f: PHOENICIAN WORD SEPARATOR*/
+                                           RTUNI_ALPHA, /* U+010920: LYDIAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+010921: LYDIAN LETTER B*/
+                                           RTUNI_ALPHA, /* U+010922: LYDIAN LETTER G*/
+                                           RTUNI_ALPHA, /* U+010923: LYDIAN LETTER D*/
+                                           RTUNI_ALPHA, /* U+010924: LYDIAN LETTER E*/
+                                           RTUNI_ALPHA, /* U+010925: LYDIAN LETTER V*/
+                                           RTUNI_ALPHA, /* U+010926: LYDIAN LETTER I*/
+                                           RTUNI_ALPHA, /* U+010927: LYDIAN LETTER Y*/
+                                           RTUNI_ALPHA, /* U+010928: LYDIAN LETTER K*/
+                                           RTUNI_ALPHA, /* U+010929: LYDIAN LETTER L*/
+                                           RTUNI_ALPHA, /* U+01092a: LYDIAN LETTER M*/
+                                           RTUNI_ALPHA, /* U+01092b: LYDIAN LETTER N*/
+                                           RTUNI_ALPHA, /* U+01092c: LYDIAN LETTER O*/
+                                           RTUNI_ALPHA, /* U+01092d: LYDIAN LETTER R*/
+                                           RTUNI_ALPHA, /* U+01092e: LYDIAN LETTER SS*/
+                                           RTUNI_ALPHA, /* U+01092f: LYDIAN LETTER T*/
+                                           RTUNI_ALPHA, /* U+010930: LYDIAN LETTER U*/
+                                           RTUNI_ALPHA, /* U+010931: LYDIAN LETTER F*/
+                                           RTUNI_ALPHA, /* U+010932: LYDIAN LETTER Q*/
+                                           RTUNI_ALPHA, /* U+010933: LYDIAN LETTER S*/
+                                           RTUNI_ALPHA, /* U+010934: LYDIAN LETTER TT*/
+                                           RTUNI_ALPHA, /* U+010935: LYDIAN LETTER AN*/
+                                           RTUNI_ALPHA, /* U+010936: LYDIAN LETTER EN*/
+                                           RTUNI_ALPHA, /* U+010937: LYDIAN LETTER LY*/
+                                           RTUNI_ALPHA, /* U+010938: LYDIAN LETTER NN*/
+                                           RTUNI_ALPHA, /* U+010939: LYDIAN LETTER C*/
+                                                     0, /* U+01093a: */
+                                                     0, /* U+01093b: */
+                                                     0, /* U+01093c: */
+                                                     0, /* U+01093d: */
+                                                     0, /* U+01093e: */
+                                                     0, /* U+01093f: LYDIAN TRIANGULAR MARK*/
+                                                     0, /* U+010940: */
+                                                     0, /* U+010941: */
+                                                     0, /* U+010942: */
+                                                     0, /* U+010943: */
+                                                     0, /* U+010944: */
+                                                     0, /* U+010945: */
+                                                     0, /* U+010946: */
+                                                     0, /* U+010947: */
+                                                     0, /* U+010948: */
+                                                     0, /* U+010949: */
+                                                     0, /* U+01094a: */
+                                                     0, /* U+01094b: */
+                                                     0, /* U+01094c: */
+                                                     0, /* U+01094d: */
+                                                     0, /* U+01094e: */
+                                                     0, /* U+01094f: */
+                                                     0, /* U+010950: */
+                                                     0, /* U+010951: */
+                                                     0, /* U+010952: */
+                                                     0, /* U+010953: */
+                                                     0, /* U+010954: */
+                                                     0, /* U+010955: */
+                                                     0, /* U+010956: */
+                                                     0, /* U+010957: */
+                                                     0, /* U+010958: */
+                                                     0, /* U+010959: */
+                                                     0, /* U+01095a: */
+                                                     0, /* U+01095b: */
+                                                     0, /* U+01095c: */
+                                                     0, /* U+01095d: */
+                                                     0, /* U+01095e: */
+                                                     0, /* U+01095f: */
+                                                     0, /* U+010960: */
+                                                     0, /* U+010961: */
+                                                     0, /* U+010962: */
+                                                     0, /* U+010963: */
+                                                     0, /* U+010964: */
+                                                     0, /* U+010965: */
+                                                     0, /* U+010966: */
+                                                     0, /* U+010967: */
+                                                     0, /* U+010968: */
+                                                     0, /* U+010969: */
+                                                     0, /* U+01096a: */
+                                                     0, /* U+01096b: */
+                                                     0, /* U+01096c: */
+                                                     0, /* U+01096d: */
+                                                     0, /* U+01096e: */
+                                                     0, /* U+01096f: */
+                                                     0, /* U+010970: */
+                                                     0, /* U+010971: */
+                                                     0, /* U+010972: */
+                                                     0, /* U+010973: */
+                                                     0, /* U+010974: */
+                                                     0, /* U+010975: */
+                                                     0, /* U+010976: */
+                                                     0, /* U+010977: */
+                                                     0, /* U+010978: */
+                                                     0, /* U+010979: */
+                                                     0, /* U+01097a: */
+                                                     0, /* U+01097b: */
+                                                     0, /* U+01097c: */
+                                                     0, /* U+01097d: */
+                                                     0, /* U+01097e: */
+                                                     0, /* U+01097f: */
+                                           RTUNI_ALPHA, /* U+010980: MEROITIC HIEROGLYPHIC LETTER A*/
+                                           RTUNI_ALPHA, /* U+010981: MEROITIC HIEROGLYPHIC LETTER E*/
+                                           RTUNI_ALPHA, /* U+010982: MEROITIC HIEROGLYPHIC LETTER I*/
+                                           RTUNI_ALPHA, /* U+010983: MEROITIC HIEROGLYPHIC LETTER O*/
+                                           RTUNI_ALPHA, /* U+010984: MEROITIC HIEROGLYPHIC LETTER YA*/
+                                           RTUNI_ALPHA, /* U+010985: MEROITIC HIEROGLYPHIC LETTER WA*/
+                                           RTUNI_ALPHA, /* U+010986: MEROITIC HIEROGLYPHIC LETTER BA*/
+                                           RTUNI_ALPHA, /* U+010987: MEROITIC HIEROGLYPHIC LETTER BA-2*/
+                                           RTUNI_ALPHA, /* U+010988: MEROITIC HIEROGLYPHIC LETTER PA*/
+                                           RTUNI_ALPHA, /* U+010989: MEROITIC HIEROGLYPHIC LETTER MA*/
+                                           RTUNI_ALPHA, /* U+01098a: MEROITIC HIEROGLYPHIC LETTER NA*/
+                                           RTUNI_ALPHA, /* U+01098b: MEROITIC HIEROGLYPHIC LETTER NA-2*/
+                                           RTUNI_ALPHA, /* U+01098c: MEROITIC HIEROGLYPHIC LETTER NE*/
+                                           RTUNI_ALPHA, /* U+01098d: MEROITIC HIEROGLYPHIC LETTER NE-2*/
+                                           RTUNI_ALPHA, /* U+01098e: MEROITIC HIEROGLYPHIC LETTER RA*/
+                                           RTUNI_ALPHA, /* U+01098f: MEROITIC HIEROGLYPHIC LETTER RA-2*/
+                                           RTUNI_ALPHA, /* U+010990: MEROITIC HIEROGLYPHIC LETTER LA*/
+                                           RTUNI_ALPHA, /* U+010991: MEROITIC HIEROGLYPHIC LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+010992: MEROITIC HIEROGLYPHIC LETTER HHA*/
+                                           RTUNI_ALPHA, /* U+010993: MEROITIC HIEROGLYPHIC LETTER SA*/
+                                           RTUNI_ALPHA, /* U+010994: MEROITIC HIEROGLYPHIC LETTER SA-2*/
+                                           RTUNI_ALPHA, /* U+010995: MEROITIC HIEROGLYPHIC LETTER SE*/
+                                           RTUNI_ALPHA, /* U+010996: MEROITIC HIEROGLYPHIC LETTER KA*/
+                                           RTUNI_ALPHA, /* U+010997: MEROITIC HIEROGLYPHIC LETTER QA*/
+                                           RTUNI_ALPHA, /* U+010998: MEROITIC HIEROGLYPHIC LETTER TA*/
+                                           RTUNI_ALPHA, /* U+010999: MEROITIC HIEROGLYPHIC LETTER TA-2*/
+                                           RTUNI_ALPHA, /* U+01099a: MEROITIC HIEROGLYPHIC LETTER TE*/
+                                           RTUNI_ALPHA, /* U+01099b: MEROITIC HIEROGLYPHIC LETTER TE-2*/
+                                           RTUNI_ALPHA, /* U+01099c: MEROITIC HIEROGLYPHIC LETTER TO*/
+                                           RTUNI_ALPHA, /* U+01099d: MEROITIC HIEROGLYPHIC LETTER DA*/
+                                           RTUNI_ALPHA, /* U+01099e: MEROITIC HIEROGLYPHIC SYMBOL VIDJ*/
+                                           RTUNI_ALPHA, /* U+01099f: MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2*/
+                                           RTUNI_ALPHA, /* U+0109a0: MEROITIC CURSIVE LETTER A*/
+                                           RTUNI_ALPHA, /* U+0109a1: MEROITIC CURSIVE LETTER E*/
+                                           RTUNI_ALPHA, /* U+0109a2: MEROITIC CURSIVE LETTER I*/
+                                           RTUNI_ALPHA, /* U+0109a3: MEROITIC CURSIVE LETTER O*/
+                                           RTUNI_ALPHA, /* U+0109a4: MEROITIC CURSIVE LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0109a5: MEROITIC CURSIVE LETTER WA*/
+                                           RTUNI_ALPHA, /* U+0109a6: MEROITIC CURSIVE LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0109a7: MEROITIC CURSIVE LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0109a8: MEROITIC CURSIVE LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0109a9: MEROITIC CURSIVE LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0109aa: MEROITIC CURSIVE LETTER NE*/
+                                           RTUNI_ALPHA, /* U+0109ab: MEROITIC CURSIVE LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0109ac: MEROITIC CURSIVE LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0109ad: MEROITIC CURSIVE LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+0109ae: MEROITIC CURSIVE LETTER HHA*/
+                                           RTUNI_ALPHA, /* U+0109af: MEROITIC CURSIVE LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0109b0: MEROITIC CURSIVE LETTER ARCHAIC SA*/
+                                           RTUNI_ALPHA, /* U+0109b1: MEROITIC CURSIVE LETTER SE*/
+                                           RTUNI_ALPHA, /* U+0109b2: MEROITIC CURSIVE LETTER KA*/
+                                           RTUNI_ALPHA, /* U+0109b3: MEROITIC CURSIVE LETTER QA*/
+                                           RTUNI_ALPHA, /* U+0109b4: MEROITIC CURSIVE LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0109b5: MEROITIC CURSIVE LETTER TE*/
+                                           RTUNI_ALPHA, /* U+0109b6: MEROITIC CURSIVE LETTER TO*/
+                                           RTUNI_ALPHA, /* U+0109b7: MEROITIC CURSIVE LETTER DA*/
+                                                     0, /* U+0109b8: */
+                                                     0, /* U+0109b9: */
+                                                     0, /* U+0109ba: */
+                                                     0, /* U+0109bb: */
+                                                     0, /* U+0109bc: */
+                                                     0, /* U+0109bd: */
+                                           RTUNI_ALPHA, /* U+0109be: MEROITIC CURSIVE LOGOGRAM RMT*/
+                                           RTUNI_ALPHA, /* U+0109bf: MEROITIC CURSIVE LOGOGRAM IMN*/
+                                                     0, /* U+0109c0: */
+                                                     0, /* U+0109c1: */
+                                                     0, /* U+0109c2: */
+                                                     0, /* U+0109c3: */
+                                                     0, /* U+0109c4: */
+                                                     0, /* U+0109c5: */
+                                                     0, /* U+0109c6: */
+                                                     0, /* U+0109c7: */
+                                                     0, /* U+0109c8: */
+                                                     0, /* U+0109c9: */
+                                                     0, /* U+0109ca: */
+                                                     0, /* U+0109cb: */
+                                                     0, /* U+0109cc: */
+                                                     0, /* U+0109cd: */
+                                                     0, /* U+0109ce: */
+                                                     0, /* U+0109cf: */
+                                                     0, /* U+0109d0: */
+                                                     0, /* U+0109d1: */
+                                                     0, /* U+0109d2: */
+                                                     0, /* U+0109d3: */
+                                                     0, /* U+0109d4: */
+                                                     0, /* U+0109d5: */
+                                                     0, /* U+0109d6: */
+                                                     0, /* U+0109d7: */
+                                                     0, /* U+0109d8: */
+                                                     0, /* U+0109d9: */
+                                                     0, /* U+0109da: */
+                                                     0, /* U+0109db: */
+                                                     0, /* U+0109dc: */
+                                                     0, /* U+0109dd: */
+                                                     0, /* U+0109de: */
+                                                     0, /* U+0109df: */
+                                                     0, /* U+0109e0: */
+                                                     0, /* U+0109e1: */
+                                                     0, /* U+0109e2: */
+                                                     0, /* U+0109e3: */
+                                                     0, /* U+0109e4: */
+                                                     0, /* U+0109e5: */
+                                                     0, /* U+0109e6: */
+                                                     0, /* U+0109e7: */
+                                                     0, /* U+0109e8: */
+                                                     0, /* U+0109e9: */
+                                                     0, /* U+0109ea: */
+                                                     0, /* U+0109eb: */
+                                                     0, /* U+0109ec: */
+                                                     0, /* U+0109ed: */
+                                                     0, /* U+0109ee: */
+                                                     0, /* U+0109ef: */
+                                                     0, /* U+0109f0: */
+                                                     0, /* U+0109f1: */
+                                                     0, /* U+0109f2: */
+                                                     0, /* U+0109f3: */
+                                                     0, /* U+0109f4: */
+                                                     0, /* U+0109f5: */
+                                                     0, /* U+0109f6: */
+                                                     0, /* U+0109f7: */
+                                                     0, /* U+0109f8: */
+                                                     0, /* U+0109f9: */
+                                                     0, /* U+0109fa: */
+                                                     0, /* U+0109fb: */
+                                                     0, /* U+0109fc: */
+                                                     0, /* U+0109fd: */
+                                                     0, /* U+0109fe: */
+                                                     0, /* U+0109ff: */
+                                           RTUNI_ALPHA, /* U+010a00: KHAROSHTHI LETTER A*/
+                                           RTUNI_ALPHA, /* U+010a01: KHAROSHTHI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+010a02: KHAROSHTHI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+010a03: KHAROSHTHI VOWEL SIGN VOCALIC R*/
+                                                     0, /* U+010a04: */
+                                           RTUNI_ALPHA, /* U+010a05: KHAROSHTHI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+010a06: KHAROSHTHI VOWEL SIGN O*/
+                                                     0, /* U+010a07: */
+                                                     0, /* U+010a08: */
+                                                     0, /* U+010a09: */
+                                                     0, /* U+010a0a: */
+                                                     0, /* U+010a0b: */
+                                           RTUNI_ALPHA, /* U+010a0c: KHAROSHTHI VOWEL LENGTH MARK*/
+                                           RTUNI_ALPHA, /* U+010a0d: KHAROSHTHI SIGN DOUBLE RING BELOW*/
+                                           RTUNI_ALPHA, /* U+010a0e: KHAROSHTHI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+010a0f: KHAROSHTHI SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+010a10: KHAROSHTHI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+010a11: KHAROSHTHI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+010a12: KHAROSHTHI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+010a13: KHAROSHTHI LETTER GHA*/
+                                                     0, /* U+010a14: */
+                                           RTUNI_ALPHA, /* U+010a15: KHAROSHTHI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+010a16: KHAROSHTHI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+010a17: KHAROSHTHI LETTER JA*/
+                                                     0, /* U+010a18: */
+                                           RTUNI_ALPHA, /* U+010a19: KHAROSHTHI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+010a1a: KHAROSHTHI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+010a1b: KHAROSHTHI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+010a1c: KHAROSHTHI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+010a1d: KHAROSHTHI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+010a1e: KHAROSHTHI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+010a1f: KHAROSHTHI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+010a20: KHAROSHTHI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+010a21: KHAROSHTHI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+010a22: KHAROSHTHI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+010a23: KHAROSHTHI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+010a24: KHAROSHTHI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+010a25: KHAROSHTHI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+010a26: KHAROSHTHI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+010a27: KHAROSHTHI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+010a28: KHAROSHTHI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+010a29: KHAROSHTHI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+010a2a: KHAROSHTHI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+010a2b: KHAROSHTHI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+010a2c: KHAROSHTHI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+010a2d: KHAROSHTHI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+010a2e: KHAROSHTHI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+010a2f: KHAROSHTHI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+010a30: KHAROSHTHI LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+010a31: KHAROSHTHI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+010a32: KHAROSHTHI LETTER KKA*/
+                                           RTUNI_ALPHA, /* U+010a33: KHAROSHTHI LETTER TTTHA*/
+                                                     0, /* U+010a34: */
+                                                     0, /* U+010a35: */
+                                                     0, /* U+010a36: */
+                                                     0, /* U+010a37: */
+                                                     0, /* U+010a38: KHAROSHTHI SIGN BAR ABOVE*/
+                                                     0, /* U+010a39: KHAROSHTHI SIGN CAUDA*/
+                                                     0, /* U+010a3a: KHAROSHTHI SIGN DOT BELOW*/
+                                                     0, /* U+010a3b: */
+                                                     0, /* U+010a3c: */
+                                                     0, /* U+010a3d: */
+                                                     0, /* U+010a3e: */
+                                                     0, /* U+010a3f: KHAROSHTHI VIRAMA*/
+                                                     0, /* U+010a40: KHAROSHTHI DIGIT ONE*/
+                                                     0, /* U+010a41: KHAROSHTHI DIGIT TWO*/
+                                                     0, /* U+010a42: KHAROSHTHI DIGIT THREE*/
+                                                     0, /* U+010a43: KHAROSHTHI DIGIT FOUR*/
+                                                     0, /* U+010a44: KHAROSHTHI NUMBER TEN*/
+                                                     0, /* U+010a45: KHAROSHTHI NUMBER TWENTY*/
+                                                     0, /* U+010a46: KHAROSHTHI NUMBER ONE HUNDRED*/
+                                                     0, /* U+010a47: KHAROSHTHI NUMBER ONE THOUSAND*/
+                                                     0, /* U+010a48: */
+                                                     0, /* U+010a49: */
+                                                     0, /* U+010a4a: */
+                                                     0, /* U+010a4b: */
+                                                     0, /* U+010a4c: */
+                                                     0, /* U+010a4d: */
+                                                     0, /* U+010a4e: */
+                                                     0, /* U+010a4f: */
+                                                     0, /* U+010a50: KHAROSHTHI PUNCTUATION DOT*/
+                                                     0, /* U+010a51: KHAROSHTHI PUNCTUATION SMALL CIRCLE*/
+                                                     0, /* U+010a52: KHAROSHTHI PUNCTUATION CIRCLE*/
+                                                     0, /* U+010a53: KHAROSHTHI PUNCTUATION CRESCENT BAR*/
+                                                     0, /* U+010a54: KHAROSHTHI PUNCTUATION MANGALAM*/
+                                                     0, /* U+010a55: KHAROSHTHI PUNCTUATION LOTUS*/
+                                                     0, /* U+010a56: KHAROSHTHI PUNCTUATION DANDA*/
+                                                     0, /* U+010a57: KHAROSHTHI PUNCTUATION DOUBLE DANDA*/
+                                                     0, /* U+010a58: KHAROSHTHI PUNCTUATION LINES*/
+                                                     0, /* U+010a59: */
+                                                     0, /* U+010a5a: */
+                                                     0, /* U+010a5b: */
+                                                     0, /* U+010a5c: */
+                                                     0, /* U+010a5d: */
+                                                     0, /* U+010a5e: */
+                                                     0, /* U+010a5f: */
+                                           RTUNI_ALPHA, /* U+010a60: OLD SOUTH ARABIAN LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010a61: OLD SOUTH ARABIAN LETTER LAMEDH*/
+                                           RTUNI_ALPHA, /* U+010a62: OLD SOUTH ARABIAN LETTER HETH*/
+                                           RTUNI_ALPHA, /* U+010a63: OLD SOUTH ARABIAN LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+010a64: OLD SOUTH ARABIAN LETTER QOPH*/
+                                           RTUNI_ALPHA, /* U+010a65: OLD SOUTH ARABIAN LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+010a66: OLD SOUTH ARABIAN LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+010a67: OLD SOUTH ARABIAN LETTER RESH*/
+                                           RTUNI_ALPHA, /* U+010a68: OLD SOUTH ARABIAN LETTER BETH*/
+                                           RTUNI_ALPHA, /* U+010a69: OLD SOUTH ARABIAN LETTER TAW*/
+                                           RTUNI_ALPHA, /* U+010a6a: OLD SOUTH ARABIAN LETTER SAT*/
+                                           RTUNI_ALPHA, /* U+010a6b: OLD SOUTH ARABIAN LETTER KAPH*/
+                                           RTUNI_ALPHA, /* U+010a6c: OLD SOUTH ARABIAN LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+010a6d: OLD SOUTH ARABIAN LETTER KHETH*/
+                                           RTUNI_ALPHA, /* U+010a6e: OLD SOUTH ARABIAN LETTER SADHE*/
+                                           RTUNI_ALPHA, /* U+010a6f: OLD SOUTH ARABIAN LETTER SAMEKH*/
+                                           RTUNI_ALPHA, /* U+010a70: OLD SOUTH ARABIAN LETTER FE*/
+                                           RTUNI_ALPHA, /* U+010a71: OLD SOUTH ARABIAN LETTER ALEF*/
+                                           RTUNI_ALPHA, /* U+010a72: OLD SOUTH ARABIAN LETTER AYN*/
+                                           RTUNI_ALPHA, /* U+010a73: OLD SOUTH ARABIAN LETTER DHADHE*/
+                                           RTUNI_ALPHA, /* U+010a74: OLD SOUTH ARABIAN LETTER GIMEL*/
+                                           RTUNI_ALPHA, /* U+010a75: OLD SOUTH ARABIAN LETTER DALETH*/
+                                           RTUNI_ALPHA, /* U+010a76: OLD SOUTH ARABIAN LETTER GHAYN*/
+                                           RTUNI_ALPHA, /* U+010a77: OLD SOUTH ARABIAN LETTER TETH*/
+                                           RTUNI_ALPHA, /* U+010a78: OLD SOUTH ARABIAN LETTER ZAYN*/
+                                           RTUNI_ALPHA, /* U+010a79: OLD SOUTH ARABIAN LETTER DHALETH*/
+                                           RTUNI_ALPHA, /* U+010a7a: OLD SOUTH ARABIAN LETTER YODH*/
+                                           RTUNI_ALPHA, /* U+010a7b: OLD SOUTH ARABIAN LETTER THAW*/
+                                           RTUNI_ALPHA, /* U+010a7c: OLD SOUTH ARABIAN LETTER THETH*/
+                                                     0, /* U+010a7d: OLD SOUTH ARABIAN NUMBER ONE*/
+                                                     0, /* U+010a7e: OLD SOUTH ARABIAN NUMBER FIFTY*/
+                                                     0, /* U+010a7f: OLD SOUTH ARABIAN NUMERIC INDICATOR*/
+                                                     0, /* U+010a80: */
+                                                     0, /* U+010a81: */
+                                                     0, /* U+010a82: */
+                                                     0, /* U+010a83: */
+                                                     0, /* U+010a84: */
+                                                     0, /* U+010a85: */
+                                                     0, /* U+010a86: */
+                                                     0, /* U+010a87: */
+                                                     0, /* U+010a88: */
+                                                     0, /* U+010a89: */
+                                                     0, /* U+010a8a: */
+                                                     0, /* U+010a8b: */
+                                                     0, /* U+010a8c: */
+                                                     0, /* U+010a8d: */
+                                                     0, /* U+010a8e: */
+                                                     0, /* U+010a8f: */
+                                                     0, /* U+010a90: */
+                                                     0, /* U+010a91: */
+                                                     0, /* U+010a92: */
+                                                     0, /* U+010a93: */
+                                                     0, /* U+010a94: */
+                                                     0, /* U+010a95: */
+                                                     0, /* U+010a96: */
+                                                     0, /* U+010a97: */
+                                                     0, /* U+010a98: */
+                                                     0, /* U+010a99: */
+                                                     0, /* U+010a9a: */
+                                                     0, /* U+010a9b: */
+                                                     0, /* U+010a9c: */
+                                                     0, /* U+010a9d: */
+                                                     0, /* U+010a9e: */
+                                                     0, /* U+010a9f: */
+                                                     0, /* U+010aa0: */
+                                                     0, /* U+010aa1: */
+                                                     0, /* U+010aa2: */
+                                                     0, /* U+010aa3: */
+                                                     0, /* U+010aa4: */
+                                                     0, /* U+010aa5: */
+                                                     0, /* U+010aa6: */
+                                                     0, /* U+010aa7: */
+                                                     0, /* U+010aa8: */
+                                                     0, /* U+010aa9: */
+                                                     0, /* U+010aaa: */
+                                                     0, /* U+010aab: */
+                                                     0, /* U+010aac: */
+                                                     0, /* U+010aad: */
+                                                     0, /* U+010aae: */
+                                                     0, /* U+010aaf: */
+                                                     0, /* U+010ab0: */
+                                                     0, /* U+010ab1: */
+                                                     0, /* U+010ab2: */
+                                                     0, /* U+010ab3: */
+                                                     0, /* U+010ab4: */
+                                                     0, /* U+010ab5: */
+                                                     0, /* U+010ab6: */
+                                                     0, /* U+010ab7: */
+                                                     0, /* U+010ab8: */
+                                                     0, /* U+010ab9: */
+                                                     0, /* U+010aba: */
+                                                     0, /* U+010abb: */
+                                                     0, /* U+010abc: */
+                                                     0, /* U+010abd: */
+                                                     0, /* U+010abe: */
+                                                     0, /* U+010abf: */
+                                                     0, /* U+010ac0: */
+                                                     0, /* U+010ac1: */
+                                                     0, /* U+010ac2: */
+                                                     0, /* U+010ac3: */
+                                                     0, /* U+010ac4: */
+                                                     0, /* U+010ac5: */
+                                                     0, /* U+010ac6: */
+                                                     0, /* U+010ac7: */
+                                                     0, /* U+010ac8: */
+                                                     0, /* U+010ac9: */
+                                                     0, /* U+010aca: */
+                                                     0, /* U+010acb: */
+                                                     0, /* U+010acc: */
+                                                     0, /* U+010acd: */
+                                                     0, /* U+010ace: */
+                                                     0, /* U+010acf: */
+                                                     0, /* U+010ad0: */
+                                                     0, /* U+010ad1: */
+                                                     0, /* U+010ad2: */
+                                                     0, /* U+010ad3: */
+                                                     0, /* U+010ad4: */
+                                                     0, /* U+010ad5: */
+                                                     0, /* U+010ad6: */
+                                                     0, /* U+010ad7: */
+                                                     0, /* U+010ad8: */
+                                                     0, /* U+010ad9: */
+                                                     0, /* U+010ada: */
+                                                     0, /* U+010adb: */
+                                                     0, /* U+010adc: */
+                                                     0, /* U+010add: */
+                                                     0, /* U+010ade: */
+                                                     0, /* U+010adf: */
+                                                     0, /* U+010ae0: */
+                                                     0, /* U+010ae1: */
+                                                     0, /* U+010ae2: */
+                                                     0, /* U+010ae3: */
+                                                     0, /* U+010ae4: */
+                                                     0, /* U+010ae5: */
+                                                     0, /* U+010ae6: */
+                                                     0, /* U+010ae7: */
+                                                     0, /* U+010ae8: */
+                                                     0, /* U+010ae9: */
+                                                     0, /* U+010aea: */
+                                                     0, /* U+010aeb: */
+                                                     0, /* U+010aec: */
+                                                     0, /* U+010aed: */
+                                                     0, /* U+010aee: */
+                                                     0, /* U+010aef: */
+                                                     0, /* U+010af0: */
+                                                     0, /* U+010af1: */
+                                                     0, /* U+010af2: */
+                                                     0, /* U+010af3: */
+                                                     0, /* U+010af4: */
+                                                     0, /* U+010af5: */
+                                                     0, /* U+010af6: */
+                                                     0, /* U+010af7: */
+                                                     0, /* U+010af8: */
+                                                     0, /* U+010af9: */
+                                                     0, /* U+010afa: */
+                                                     0, /* U+010afb: */
+                                                     0, /* U+010afc: */
+                                                     0, /* U+010afd: */
+                                                     0, /* U+010afe: */
+                                                     0, /* U+010aff: */
+                                           RTUNI_ALPHA, /* U+010b00: AVESTAN LETTER A*/
+                                           RTUNI_ALPHA, /* U+010b01: AVESTAN LETTER AA*/
+                                           RTUNI_ALPHA, /* U+010b02: AVESTAN LETTER AO*/
+                                           RTUNI_ALPHA, /* U+010b03: AVESTAN LETTER AAO*/
+                                           RTUNI_ALPHA, /* U+010b04: AVESTAN LETTER AN*/
+                                           RTUNI_ALPHA, /* U+010b05: AVESTAN LETTER AAN*/
+                                           RTUNI_ALPHA, /* U+010b06: AVESTAN LETTER AE*/
+                                           RTUNI_ALPHA, /* U+010b07: AVESTAN LETTER AEE*/
+                                           RTUNI_ALPHA, /* U+010b08: AVESTAN LETTER E*/
+                                           RTUNI_ALPHA, /* U+010b09: AVESTAN LETTER EE*/
+                                           RTUNI_ALPHA, /* U+010b0a: AVESTAN LETTER O*/
+                                           RTUNI_ALPHA, /* U+010b0b: AVESTAN LETTER OO*/
+                                           RTUNI_ALPHA, /* U+010b0c: AVESTAN LETTER I*/
+                                           RTUNI_ALPHA, /* U+010b0d: AVESTAN LETTER II*/
+                                           RTUNI_ALPHA, /* U+010b0e: AVESTAN LETTER U*/
+                                           RTUNI_ALPHA, /* U+010b0f: AVESTAN LETTER UU*/
+                                           RTUNI_ALPHA, /* U+010b10: AVESTAN LETTER KE*/
+                                           RTUNI_ALPHA, /* U+010b11: AVESTAN LETTER XE*/
+                                           RTUNI_ALPHA, /* U+010b12: AVESTAN LETTER XYE*/
+                                           RTUNI_ALPHA, /* U+010b13: AVESTAN LETTER XVE*/
+                                           RTUNI_ALPHA, /* U+010b14: AVESTAN LETTER GE*/
+                                           RTUNI_ALPHA, /* U+010b15: AVESTAN LETTER GGE*/
+                                           RTUNI_ALPHA, /* U+010b16: AVESTAN LETTER GHE*/
+                                           RTUNI_ALPHA, /* U+010b17: AVESTAN LETTER CE*/
+                                           RTUNI_ALPHA, /* U+010b18: AVESTAN LETTER JE*/
+                                           RTUNI_ALPHA, /* U+010b19: AVESTAN LETTER TE*/
+                                           RTUNI_ALPHA, /* U+010b1a: AVESTAN LETTER THE*/
+                                           RTUNI_ALPHA, /* U+010b1b: AVESTAN LETTER DE*/
+                                           RTUNI_ALPHA, /* U+010b1c: AVESTAN LETTER DHE*/
+                                           RTUNI_ALPHA, /* U+010b1d: AVESTAN LETTER TTE*/
+                                           RTUNI_ALPHA, /* U+010b1e: AVESTAN LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010b1f: AVESTAN LETTER FE*/
+                                           RTUNI_ALPHA, /* U+010b20: AVESTAN LETTER BE*/
+                                           RTUNI_ALPHA, /* U+010b21: AVESTAN LETTER BHE*/
+                                           RTUNI_ALPHA, /* U+010b22: AVESTAN LETTER NGE*/
+                                           RTUNI_ALPHA, /* U+010b23: AVESTAN LETTER NGYE*/
+                                           RTUNI_ALPHA, /* U+010b24: AVESTAN LETTER NGVE*/
+                                           RTUNI_ALPHA, /* U+010b25: AVESTAN LETTER NE*/
+                                           RTUNI_ALPHA, /* U+010b26: AVESTAN LETTER NYE*/
+                                           RTUNI_ALPHA, /* U+010b27: AVESTAN LETTER NNE*/
+                                           RTUNI_ALPHA, /* U+010b28: AVESTAN LETTER ME*/
+                                           RTUNI_ALPHA, /* U+010b29: AVESTAN LETTER HME*/
+                                           RTUNI_ALPHA, /* U+010b2a: AVESTAN LETTER YYE*/
+                                           RTUNI_ALPHA, /* U+010b2b: AVESTAN LETTER YE*/
+                                           RTUNI_ALPHA, /* U+010b2c: AVESTAN LETTER VE*/
+                                           RTUNI_ALPHA, /* U+010b2d: AVESTAN LETTER RE*/
+                                           RTUNI_ALPHA, /* U+010b2e: AVESTAN LETTER LE*/
+                                           RTUNI_ALPHA, /* U+010b2f: AVESTAN LETTER SE*/
+                                           RTUNI_ALPHA, /* U+010b30: AVESTAN LETTER ZE*/
+                                           RTUNI_ALPHA, /* U+010b31: AVESTAN LETTER SHE*/
+                                           RTUNI_ALPHA, /* U+010b32: AVESTAN LETTER ZHE*/
+                                           RTUNI_ALPHA, /* U+010b33: AVESTAN LETTER SHYE*/
+                                           RTUNI_ALPHA, /* U+010b34: AVESTAN LETTER SSHE*/
+                                           RTUNI_ALPHA, /* U+010b35: AVESTAN LETTER HE*/
+                                                     0, /* U+010b36: */
+                                                     0, /* U+010b37: */
+                                                     0, /* U+010b38: */
+                                                     0, /* U+010b39: AVESTAN ABBREVIATION MARK*/
+                                                     0, /* U+010b3a: TINY TWO DOTS OVER ONE DOT PUNCTUATION*/
+                                                     0, /* U+010b3b: SMALL TWO DOTS OVER ONE DOT PUNCTUATION*/
+                                                     0, /* U+010b3c: LARGE TWO DOTS OVER ONE DOT PUNCTUATION*/
+                                                     0, /* U+010b3d: LARGE ONE DOT OVER TWO DOTS PUNCTUATION*/
+                                                     0, /* U+010b3e: LARGE TWO RINGS OVER ONE RING PUNCTUATION*/
+                                                     0, /* U+010b3f: LARGE ONE RING OVER TWO RINGS PUNCTUATION*/
+                                           RTUNI_ALPHA, /* U+010b40: INSCRIPTIONAL PARTHIAN LETTER ALEPH*/
+                                           RTUNI_ALPHA, /* U+010b41: INSCRIPTIONAL PARTHIAN LETTER BETH*/
+                                           RTUNI_ALPHA, /* U+010b42: INSCRIPTIONAL PARTHIAN LETTER GIMEL*/
+                                           RTUNI_ALPHA, /* U+010b43: INSCRIPTIONAL PARTHIAN LETTER DALETH*/
+                                           RTUNI_ALPHA, /* U+010b44: INSCRIPTIONAL PARTHIAN LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010b45: INSCRIPTIONAL PARTHIAN LETTER WAW*/
+                                           RTUNI_ALPHA, /* U+010b46: INSCRIPTIONAL PARTHIAN LETTER ZAYIN*/
+                                           RTUNI_ALPHA, /* U+010b47: INSCRIPTIONAL PARTHIAN LETTER HETH*/
+                                           RTUNI_ALPHA, /* U+010b48: INSCRIPTIONAL PARTHIAN LETTER TETH*/
+                                           RTUNI_ALPHA, /* U+010b49: INSCRIPTIONAL PARTHIAN LETTER YODH*/
+                                           RTUNI_ALPHA, /* U+010b4a: INSCRIPTIONAL PARTHIAN LETTER KAPH*/
+                                           RTUNI_ALPHA, /* U+010b4b: INSCRIPTIONAL PARTHIAN LETTER LAMEDH*/
+                                           RTUNI_ALPHA, /* U+010b4c: INSCRIPTIONAL PARTHIAN LETTER MEM*/
+                                           RTUNI_ALPHA, /* U+010b4d: INSCRIPTIONAL PARTHIAN LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+010b4e: INSCRIPTIONAL PARTHIAN LETTER SAMEKH*/
+                                           RTUNI_ALPHA, /* U+010b4f: INSCRIPTIONAL PARTHIAN LETTER AYIN*/
+                                           RTUNI_ALPHA, /* U+010b50: INSCRIPTIONAL PARTHIAN LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010b51: INSCRIPTIONAL PARTHIAN LETTER SADHE*/
+                                           RTUNI_ALPHA, /* U+010b52: INSCRIPTIONAL PARTHIAN LETTER QOPH*/
+                                           RTUNI_ALPHA, /* U+010b53: INSCRIPTIONAL PARTHIAN LETTER RESH*/
+                                           RTUNI_ALPHA, /* U+010b54: INSCRIPTIONAL PARTHIAN LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+010b55: INSCRIPTIONAL PARTHIAN LETTER TAW*/
+                                                     0, /* U+010b56: */
+                                                     0, /* U+010b57: */
+                                                     0, /* U+010b58: INSCRIPTIONAL PARTHIAN NUMBER ONE*/
+                                                     0, /* U+010b59: INSCRIPTIONAL PARTHIAN NUMBER TWO*/
+                                                     0, /* U+010b5a: INSCRIPTIONAL PARTHIAN NUMBER THREE*/
+                                                     0, /* U+010b5b: INSCRIPTIONAL PARTHIAN NUMBER FOUR*/
+                                                     0, /* U+010b5c: INSCRIPTIONAL PARTHIAN NUMBER TEN*/
+                                                     0, /* U+010b5d: INSCRIPTIONAL PARTHIAN NUMBER TWENTY*/
+                                                     0, /* U+010b5e: INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED*/
+                                                     0, /* U+010b5f: INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND*/
+                                           RTUNI_ALPHA, /* U+010b60: INSCRIPTIONAL PAHLAVI LETTER ALEPH*/
+                                           RTUNI_ALPHA, /* U+010b61: INSCRIPTIONAL PAHLAVI LETTER BETH*/
+                                           RTUNI_ALPHA, /* U+010b62: INSCRIPTIONAL PAHLAVI LETTER GIMEL*/
+                                           RTUNI_ALPHA, /* U+010b63: INSCRIPTIONAL PAHLAVI LETTER DALETH*/
+                                           RTUNI_ALPHA, /* U+010b64: INSCRIPTIONAL PAHLAVI LETTER HE*/
+                                           RTUNI_ALPHA, /* U+010b65: INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH*/
+                                           RTUNI_ALPHA, /* U+010b66: INSCRIPTIONAL PAHLAVI LETTER ZAYIN*/
+                                           RTUNI_ALPHA, /* U+010b67: INSCRIPTIONAL PAHLAVI LETTER HETH*/
+                                           RTUNI_ALPHA, /* U+010b68: INSCRIPTIONAL PAHLAVI LETTER TETH*/
+                                           RTUNI_ALPHA, /* U+010b69: INSCRIPTIONAL PAHLAVI LETTER YODH*/
+                                           RTUNI_ALPHA, /* U+010b6a: INSCRIPTIONAL PAHLAVI LETTER KAPH*/
+                                           RTUNI_ALPHA, /* U+010b6b: INSCRIPTIONAL PAHLAVI LETTER LAMEDH*/
+                                           RTUNI_ALPHA, /* U+010b6c: INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH*/
+                                           RTUNI_ALPHA, /* U+010b6d: INSCRIPTIONAL PAHLAVI LETTER NUN*/
+                                           RTUNI_ALPHA, /* U+010b6e: INSCRIPTIONAL PAHLAVI LETTER SAMEKH*/
+                                           RTUNI_ALPHA, /* U+010b6f: INSCRIPTIONAL PAHLAVI LETTER PE*/
+                                           RTUNI_ALPHA, /* U+010b70: INSCRIPTIONAL PAHLAVI LETTER SADHE*/
+                                           RTUNI_ALPHA, /* U+010b71: INSCRIPTIONAL PAHLAVI LETTER SHIN*/
+                                           RTUNI_ALPHA, /* U+010b72: INSCRIPTIONAL PAHLAVI LETTER TAW*/
+                                                     0, /* U+010b73: */
+                                                     0, /* U+010b74: */
+                                                     0, /* U+010b75: */
+                                                     0, /* U+010b76: */
+                                                     0, /* U+010b77: */
+                                                     0, /* U+010b78: INSCRIPTIONAL PAHLAVI NUMBER ONE*/
+                                                     0, /* U+010b79: INSCRIPTIONAL PAHLAVI NUMBER TWO*/
+                                                     0, /* U+010b7a: INSCRIPTIONAL PAHLAVI NUMBER THREE*/
+                                                     0, /* U+010b7b: INSCRIPTIONAL PAHLAVI NUMBER FOUR*/
+                                                     0, /* U+010b7c: INSCRIPTIONAL PAHLAVI NUMBER TEN*/
+                                                     0, /* U+010b7d: INSCRIPTIONAL PAHLAVI NUMBER TWENTY*/
+                                                     0, /* U+010b7e: INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED*/
+                                                     0, /* U+010b7f: INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND*/
+                                                     0, /* U+010b80: */
+                                                     0, /* U+010b81: */
+                                                     0, /* U+010b82: */
+                                                     0, /* U+010b83: */
+                                                     0, /* U+010b84: */
+                                                     0, /* U+010b85: */
+                                                     0, /* U+010b86: */
+                                                     0, /* U+010b87: */
+                                                     0, /* U+010b88: */
+                                                     0, /* U+010b89: */
+                                                     0, /* U+010b8a: */
+                                                     0, /* U+010b8b: */
+                                                     0, /* U+010b8c: */
+                                                     0, /* U+010b8d: */
+                                                     0, /* U+010b8e: */
+                                                     0, /* U+010b8f: */
+                                                     0, /* U+010b90: */
+                                                     0, /* U+010b91: */
+                                                     0, /* U+010b92: */
+                                                     0, /* U+010b93: */
+                                                     0, /* U+010b94: */
+                                                     0, /* U+010b95: */
+                                                     0, /* U+010b96: */
+                                                     0, /* U+010b97: */
+                                                     0, /* U+010b98: */
+                                                     0, /* U+010b99: */
+                                                     0, /* U+010b9a: */
+                                                     0, /* U+010b9b: */
+                                                     0, /* U+010b9c: */
+                                                     0, /* U+010b9d: */
+                                                     0, /* U+010b9e: */
+                                                     0, /* U+010b9f: */
+                                                     0, /* U+010ba0: */
+                                                     0, /* U+010ba1: */
+                                                     0, /* U+010ba2: */
+                                                     0, /* U+010ba3: */
+                                                     0, /* U+010ba4: */
+                                                     0, /* U+010ba5: */
+                                                     0, /* U+010ba6: */
+                                                     0, /* U+010ba7: */
+                                                     0, /* U+010ba8: */
+                                                     0, /* U+010ba9: */
+                                                     0, /* U+010baa: */
+                                                     0, /* U+010bab: */
+                                                     0, /* U+010bac: */
+                                                     0, /* U+010bad: */
+                                                     0, /* U+010bae: */
+                                                     0, /* U+010baf: */
+                                                     0, /* U+010bb0: */
+                                                     0, /* U+010bb1: */
+                                                     0, /* U+010bb2: */
+                                                     0, /* U+010bb3: */
+                                                     0, /* U+010bb4: */
+                                                     0, /* U+010bb5: */
+                                                     0, /* U+010bb6: */
+                                                     0, /* U+010bb7: */
+                                                     0, /* U+010bb8: */
+                                                     0, /* U+010bb9: */
+                                                     0, /* U+010bba: */
+                                                     0, /* U+010bbb: */
+                                                     0, /* U+010bbc: */
+                                                     0, /* U+010bbd: */
+                                                     0, /* U+010bbe: */
+                                                     0, /* U+010bbf: */
+                                                     0, /* U+010bc0: */
+                                                     0, /* U+010bc1: */
+                                                     0, /* U+010bc2: */
+                                                     0, /* U+010bc3: */
+                                                     0, /* U+010bc4: */
+                                                     0, /* U+010bc5: */
+                                                     0, /* U+010bc6: */
+                                                     0, /* U+010bc7: */
+                                                     0, /* U+010bc8: */
+                                                     0, /* U+010bc9: */
+                                                     0, /* U+010bca: */
+                                                     0, /* U+010bcb: */
+                                                     0, /* U+010bcc: */
+                                                     0, /* U+010bcd: */
+                                                     0, /* U+010bce: */
+                                                     0, /* U+010bcf: */
+                                                     0, /* U+010bd0: */
+                                                     0, /* U+010bd1: */
+                                                     0, /* U+010bd2: */
+                                                     0, /* U+010bd3: */
+                                                     0, /* U+010bd4: */
+                                                     0, /* U+010bd5: */
+                                                     0, /* U+010bd6: */
+                                                     0, /* U+010bd7: */
+                                                     0, /* U+010bd8: */
+                                                     0, /* U+010bd9: */
+                                                     0, /* U+010bda: */
+                                                     0, /* U+010bdb: */
+                                                     0, /* U+010bdc: */
+                                                     0, /* U+010bdd: */
+                                                     0, /* U+010bde: */
+                                                     0, /* U+010bdf: */
+                                                     0, /* U+010be0: */
+                                                     0, /* U+010be1: */
+                                                     0, /* U+010be2: */
+                                                     0, /* U+010be3: */
+                                                     0, /* U+010be4: */
+                                                     0, /* U+010be5: */
+                                                     0, /* U+010be6: */
+                                                     0, /* U+010be7: */
+                                                     0, /* U+010be8: */
+                                                     0, /* U+010be9: */
+                                                     0, /* U+010bea: */
+                                                     0, /* U+010beb: */
+                                                     0, /* U+010bec: */
+                                                     0, /* U+010bed: */
+                                                     0, /* U+010bee: */
+                                                     0, /* U+010bef: */
+                                                     0, /* U+010bf0: */
+                                                     0, /* U+010bf1: */
+                                                     0, /* U+010bf2: */
+                                                     0, /* U+010bf3: */
+                                                     0, /* U+010bf4: */
+                                                     0, /* U+010bf5: */
+                                                     0, /* U+010bf6: */
+                                                     0, /* U+010bf7: */
+                                                     0, /* U+010bf8: */
+                                                     0, /* U+010bf9: */
+                                                     0, /* U+010bfa: */
+                                                     0, /* U+010bfb: */
+                                                     0, /* U+010bfc: */
+                                                     0, /* U+010bfd: */
+                                                     0, /* U+010bfe: */
+                                                     0, /* U+010bff: */
+                                           RTUNI_ALPHA, /* U+010c00: OLD TURKIC LETTER ORKHON A*/
+                                           RTUNI_ALPHA, /* U+010c01: OLD TURKIC LETTER YENISEI A*/
+                                           RTUNI_ALPHA, /* U+010c02: OLD TURKIC LETTER YENISEI AE*/
+                                           RTUNI_ALPHA, /* U+010c03: OLD TURKIC LETTER ORKHON I*/
+                                           RTUNI_ALPHA, /* U+010c04: OLD TURKIC LETTER YENISEI I*/
+                                           RTUNI_ALPHA, /* U+010c05: OLD TURKIC LETTER YENISEI E*/
+                                           RTUNI_ALPHA, /* U+010c06: OLD TURKIC LETTER ORKHON O*/
+                                           RTUNI_ALPHA, /* U+010c07: OLD TURKIC LETTER ORKHON OE*/
+                                           RTUNI_ALPHA, /* U+010c08: OLD TURKIC LETTER YENISEI OE*/
+                                           RTUNI_ALPHA, /* U+010c09: OLD TURKIC LETTER ORKHON AB*/
+                                           RTUNI_ALPHA, /* U+010c0a: OLD TURKIC LETTER YENISEI AB*/
+                                           RTUNI_ALPHA, /* U+010c0b: OLD TURKIC LETTER ORKHON AEB*/
+                                           RTUNI_ALPHA, /* U+010c0c: OLD TURKIC LETTER YENISEI AEB*/
+                                           RTUNI_ALPHA, /* U+010c0d: OLD TURKIC LETTER ORKHON AG*/
+                                           RTUNI_ALPHA, /* U+010c0e: OLD TURKIC LETTER YENISEI AG*/
+                                           RTUNI_ALPHA, /* U+010c0f: OLD TURKIC LETTER ORKHON AEG*/
+                                           RTUNI_ALPHA, /* U+010c10: OLD TURKIC LETTER YENISEI AEG*/
+                                           RTUNI_ALPHA, /* U+010c11: OLD TURKIC LETTER ORKHON AD*/
+                                           RTUNI_ALPHA, /* U+010c12: OLD TURKIC LETTER YENISEI AD*/
+                                           RTUNI_ALPHA, /* U+010c13: OLD TURKIC LETTER ORKHON AED*/
+                                           RTUNI_ALPHA, /* U+010c14: OLD TURKIC LETTER ORKHON EZ*/
+                                           RTUNI_ALPHA, /* U+010c15: OLD TURKIC LETTER YENISEI EZ*/
+                                           RTUNI_ALPHA, /* U+010c16: OLD TURKIC LETTER ORKHON AY*/
+                                           RTUNI_ALPHA, /* U+010c17: OLD TURKIC LETTER YENISEI AY*/
+                                           RTUNI_ALPHA, /* U+010c18: OLD TURKIC LETTER ORKHON AEY*/
+                                           RTUNI_ALPHA, /* U+010c19: OLD TURKIC LETTER YENISEI AEY*/
+                                           RTUNI_ALPHA, /* U+010c1a: OLD TURKIC LETTER ORKHON AEK*/
+                                           RTUNI_ALPHA, /* U+010c1b: OLD TURKIC LETTER YENISEI AEK*/
+                                           RTUNI_ALPHA, /* U+010c1c: OLD TURKIC LETTER ORKHON OEK*/
+                                           RTUNI_ALPHA, /* U+010c1d: OLD TURKIC LETTER YENISEI OEK*/
+                                           RTUNI_ALPHA, /* U+010c1e: OLD TURKIC LETTER ORKHON AL*/
+                                           RTUNI_ALPHA, /* U+010c1f: OLD TURKIC LETTER YENISEI AL*/
+                                           RTUNI_ALPHA, /* U+010c20: OLD TURKIC LETTER ORKHON AEL*/
+                                           RTUNI_ALPHA, /* U+010c21: OLD TURKIC LETTER ORKHON ELT*/
+                                           RTUNI_ALPHA, /* U+010c22: OLD TURKIC LETTER ORKHON EM*/
+                                           RTUNI_ALPHA, /* U+010c23: OLD TURKIC LETTER ORKHON AN*/
+                                           RTUNI_ALPHA, /* U+010c24: OLD TURKIC LETTER ORKHON AEN*/
+                                           RTUNI_ALPHA, /* U+010c25: OLD TURKIC LETTER YENISEI AEN*/
+                                           RTUNI_ALPHA, /* U+010c26: OLD TURKIC LETTER ORKHON ENT*/
+                                           RTUNI_ALPHA, /* U+010c27: OLD TURKIC LETTER YENISEI ENT*/
+                                           RTUNI_ALPHA, /* U+010c28: OLD TURKIC LETTER ORKHON ENC*/
+                                           RTUNI_ALPHA, /* U+010c29: OLD TURKIC LETTER YENISEI ENC*/
+                                           RTUNI_ALPHA, /* U+010c2a: OLD TURKIC LETTER ORKHON ENY*/
+                                           RTUNI_ALPHA, /* U+010c2b: OLD TURKIC LETTER YENISEI ENY*/
+                                           RTUNI_ALPHA, /* U+010c2c: OLD TURKIC LETTER YENISEI ANG*/
+                                           RTUNI_ALPHA, /* U+010c2d: OLD TURKIC LETTER ORKHON ENG*/
+                                           RTUNI_ALPHA, /* U+010c2e: OLD TURKIC LETTER YENISEI AENG*/
+                                           RTUNI_ALPHA, /* U+010c2f: OLD TURKIC LETTER ORKHON EP*/
+                                           RTUNI_ALPHA, /* U+010c30: OLD TURKIC LETTER ORKHON OP*/
+                                           RTUNI_ALPHA, /* U+010c31: OLD TURKIC LETTER ORKHON IC*/
+                                           RTUNI_ALPHA, /* U+010c32: OLD TURKIC LETTER ORKHON EC*/
+                                           RTUNI_ALPHA, /* U+010c33: OLD TURKIC LETTER YENISEI EC*/
+                                           RTUNI_ALPHA, /* U+010c34: OLD TURKIC LETTER ORKHON AQ*/
+                                           RTUNI_ALPHA, /* U+010c35: OLD TURKIC LETTER YENISEI AQ*/
+                                           RTUNI_ALPHA, /* U+010c36: OLD TURKIC LETTER ORKHON IQ*/
+                                           RTUNI_ALPHA, /* U+010c37: OLD TURKIC LETTER YENISEI IQ*/
+                                           RTUNI_ALPHA, /* U+010c38: OLD TURKIC LETTER ORKHON OQ*/
+                                           RTUNI_ALPHA, /* U+010c39: OLD TURKIC LETTER YENISEI OQ*/
+                                           RTUNI_ALPHA, /* U+010c3a: OLD TURKIC LETTER ORKHON AR*/
+                                           RTUNI_ALPHA, /* U+010c3b: OLD TURKIC LETTER YENISEI AR*/
+                                           RTUNI_ALPHA, /* U+010c3c: OLD TURKIC LETTER ORKHON AER*/
+                                           RTUNI_ALPHA, /* U+010c3d: OLD TURKIC LETTER ORKHON AS*/
+                                           RTUNI_ALPHA, /* U+010c3e: OLD TURKIC LETTER ORKHON AES*/
+                                           RTUNI_ALPHA, /* U+010c3f: OLD TURKIC LETTER ORKHON ASH*/
+                                           RTUNI_ALPHA, /* U+010c40: OLD TURKIC LETTER YENISEI ASH*/
+                                           RTUNI_ALPHA, /* U+010c41: OLD TURKIC LETTER ORKHON ESH*/
+                                           RTUNI_ALPHA, /* U+010c42: OLD TURKIC LETTER YENISEI ESH*/
+                                           RTUNI_ALPHA, /* U+010c43: OLD TURKIC LETTER ORKHON AT*/
+                                           RTUNI_ALPHA, /* U+010c44: OLD TURKIC LETTER YENISEI AT*/
+                                           RTUNI_ALPHA, /* U+010c45: OLD TURKIC LETTER ORKHON AET*/
+                                           RTUNI_ALPHA, /* U+010c46: OLD TURKIC LETTER YENISEI AET*/
+                                           RTUNI_ALPHA, /* U+010c47: OLD TURKIC LETTER ORKHON OT*/
+                                           RTUNI_ALPHA, /* U+010c48: OLD TURKIC LETTER ORKHON BASH*/
+                                                     0, /* U+010c49: */
+                                                     0, /* U+010c4a: */
+                                                     0, /* U+010c4b: */
+                                                     0, /* U+010c4c: */
+                                                     0, /* U+010c4d: */
+                                                     0, /* U+010c4e: */
+                                                     0, /* U+010c4f: */
+                                                     0, /* U+010c50: */
+                                                     0, /* U+010c51: */
+                                                     0, /* U+010c52: */
+                                                     0, /* U+010c53: */
+                                                     0, /* U+010c54: */
+                                                     0, /* U+010c55: */
+                                                     0, /* U+010c56: */
+                                                     0, /* U+010c57: */
+                                                     0, /* U+010c58: */
+                                                     0, /* U+010c59: */
+                                                     0, /* U+010c5a: */
+                                                     0, /* U+010c5b: */
+                                                     0, /* U+010c5c: */
+                                                     0, /* U+010c5d: */
+                                                     0, /* U+010c5e: */
+                                                     0, /* U+010c5f: */
+                                                     0, /* U+010c60: */
+                                                     0, /* U+010c61: */
+                                                     0, /* U+010c62: */
+                                                     0, /* U+010c63: */
+                                                     0, /* U+010c64: */
+                                                     0, /* U+010c65: */
+                                                     0, /* U+010c66: */
+                                                     0, /* U+010c67: */
+                                                     0, /* U+010c68: */
+                                                     0, /* U+010c69: */
+                                                     0, /* U+010c6a: */
+                                                     0, /* U+010c6b: */
+                                                     0, /* U+010c6c: */
+                                                     0, /* U+010c6d: */
+                                                     0, /* U+010c6e: */
+                                                     0, /* U+010c6f: */
+                                                     0, /* U+010c70: */
+                                                     0, /* U+010c71: */
+                                                     0, /* U+010c72: */
+                                                     0, /* U+010c73: */
+                                                     0, /* U+010c74: */
+                                                     0, /* U+010c75: */
+                                                     0, /* U+010c76: */
+                                                     0, /* U+010c77: */
+                                                     0, /* U+010c78: */
+                                                     0, /* U+010c79: */
+                                                     0, /* U+010c7a: */
+                                                     0, /* U+010c7b: */
+                                                     0, /* U+010c7c: */
+                                                     0, /* U+010c7d: */
+                                                     0, /* U+010c7e: */
+                                                     0, /* U+010c7f: */
+                                                     0, /* U+010c80: */
+                                                     0, /* U+010c81: */
+                                                     0, /* U+010c82: */
+                                                     0, /* U+010c83: */
+                                                     0, /* U+010c84: */
+                                                     0, /* U+010c85: */
+                                                     0, /* U+010c86: */
+                                                     0, /* U+010c87: */
+                                                     0, /* U+010c88: */
+                                                     0, /* U+010c89: */
+                                                     0, /* U+010c8a: */
+                                                     0, /* U+010c8b: */
+                                                     0, /* U+010c8c: */
+                                                     0, /* U+010c8d: */
+                                                     0, /* U+010c8e: */
+                                                     0, /* U+010c8f: */
+                                                     0, /* U+010c90: */
+                                                     0, /* U+010c91: */
+                                                     0, /* U+010c92: */
+                                                     0, /* U+010c93: */
+                                                     0, /* U+010c94: */
+                                                     0, /* U+010c95: */
+                                                     0, /* U+010c96: */
+                                                     0, /* U+010c97: */
+                                                     0, /* U+010c98: */
+                                                     0, /* U+010c99: */
+                                                     0, /* U+010c9a: */
+                                                     0, /* U+010c9b: */
+                                                     0, /* U+010c9c: */
+                                                     0, /* U+010c9d: */
+                                                     0, /* U+010c9e: */
+                                                     0, /* U+010c9f: */
+                                                     0, /* U+010ca0: */
+                                                     0, /* U+010ca1: */
+                                                     0, /* U+010ca2: */
+                                                     0, /* U+010ca3: */
+                                                     0, /* U+010ca4: */
+                                                     0, /* U+010ca5: */
+                                                     0, /* U+010ca6: */
+                                                     0, /* U+010ca7: */
+                                                     0, /* U+010ca8: */
+                                                     0, /* U+010ca9: */
+                                                     0, /* U+010caa: */
+                                                     0, /* U+010cab: */
+                                                     0, /* U+010cac: */
+                                                     0, /* U+010cad: */
+                                                     0, /* U+010cae: */
+                                                     0, /* U+010caf: */
+                                                     0, /* U+010cb0: */
+                                                     0, /* U+010cb1: */
+                                                     0, /* U+010cb2: */
+                                                     0, /* U+010cb3: */
+                                                     0, /* U+010cb4: */
+                                                     0, /* U+010cb5: */
+                                                     0, /* U+010cb6: */
+                                                     0, /* U+010cb7: */
+                                                     0, /* U+010cb8: */
+                                                     0, /* U+010cb9: */
+                                                     0, /* U+010cba: */
+                                                     0, /* U+010cbb: */
+                                                     0, /* U+010cbc: */
+                                                     0, /* U+010cbd: */
+                                                     0, /* U+010cbe: */
+                                                     0, /* U+010cbf: */
+                                                     0, /* U+010cc0: */
+                                                     0, /* U+010cc1: */
+                                                     0, /* U+010cc2: */
+                                                     0, /* U+010cc3: */
+                                                     0, /* U+010cc4: */
+                                                     0, /* U+010cc5: */
+                                                     0, /* U+010cc6: */
+                                                     0, /* U+010cc7: */
+                                                     0, /* U+010cc8: */
+                                                     0, /* U+010cc9: */
+                                                     0, /* U+010cca: */
+                                                     0, /* U+010ccb: */
+                                                     0, /* U+010ccc: */
+                                                     0, /* U+010ccd: */
+                                                     0, /* U+010cce: */
+                                                     0, /* U+010ccf: */
+                                                     0, /* U+010cd0: */
+                                                     0, /* U+010cd1: */
+                                                     0, /* U+010cd2: */
+                                                     0, /* U+010cd3: */
+                                                     0, /* U+010cd4: */
+                                                     0, /* U+010cd5: */
+                                                     0, /* U+010cd6: */
+                                                     0, /* U+010cd7: */
+                                                     0, /* U+010cd8: */
+                                                     0, /* U+010cd9: */
+                                                     0, /* U+010cda: */
+                                                     0, /* U+010cdb: */
+                                                     0, /* U+010cdc: */
+                                                     0, /* U+010cdd: */
+                                                     0, /* U+010cde: */
+                                                     0, /* U+010cdf: */
+                                                     0, /* U+010ce0: */
+                                                     0, /* U+010ce1: */
+                                                     0, /* U+010ce2: */
+                                                     0, /* U+010ce3: */
+                                                     0, /* U+010ce4: */
+                                                     0, /* U+010ce5: */
+                                                     0, /* U+010ce6: */
+                                                     0, /* U+010ce7: */
+                                                     0, /* U+010ce8: */
+                                                     0, /* U+010ce9: */
+                                                     0, /* U+010cea: */
+                                                     0, /* U+010ceb: */
+                                                     0, /* U+010cec: */
+                                                     0, /* U+010ced: */
+                                                     0, /* U+010cee: */
+                                                     0, /* U+010cef: */
+                                                     0, /* U+010cf0: */
+                                                     0, /* U+010cf1: */
+                                                     0, /* U+010cf2: */
+                                                     0, /* U+010cf3: */
+                                                     0, /* U+010cf4: */
+                                                     0, /* U+010cf5: */
+                                                     0, /* U+010cf6: */
+                                                     0, /* U+010cf7: */
+                                                     0, /* U+010cf8: */
+                                                     0, /* U+010cf9: */
+                                                     0, /* U+010cfa: */
+                                                     0, /* U+010cfb: */
+                                                     0, /* U+010cfc: */
+                                                     0, /* U+010cfd: */
+                                                     0, /* U+010cfe: */
+                                                     0, /* U+010cff: */
+                                                     0, /* U+010d00: */
+                                                     0, /* U+010d01: */
+                                                     0, /* U+010d02: */
+                                                     0, /* U+010d03: */
+                                                     0, /* U+010d04: */
+                                                     0, /* U+010d05: */
+                                                     0, /* U+010d06: */
+                                                     0, /* U+010d07: */
+                                                     0, /* U+010d08: */
+                                                     0, /* U+010d09: */
+                                                     0, /* U+010d0a: */
+                                                     0, /* U+010d0b: */
+                                                     0, /* U+010d0c: */
+                                                     0, /* U+010d0d: */
+                                                     0, /* U+010d0e: */
+                                                     0, /* U+010d0f: */
+                                                     0, /* U+010d10: */
+                                                     0, /* U+010d11: */
+                                                     0, /* U+010d12: */
+                                                     0, /* U+010d13: */
+                                                     0, /* U+010d14: */
+                                                     0, /* U+010d15: */
+                                                     0, /* U+010d16: */
+                                                     0, /* U+010d17: */
+                                                     0, /* U+010d18: */
+                                                     0, /* U+010d19: */
+                                                     0, /* U+010d1a: */
+                                                     0, /* U+010d1b: */
+                                                     0, /* U+010d1c: */
+                                                     0, /* U+010d1d: */
+                                                     0, /* U+010d1e: */
+                                                     0, /* U+010d1f: */
+                                                     0, /* U+010d20: */
+                                                     0, /* U+010d21: */
+                                                     0, /* U+010d22: */
+                                                     0, /* U+010d23: */
+                                                     0, /* U+010d24: */
+                                                     0, /* U+010d25: */
+                                                     0, /* U+010d26: */
+                                                     0, /* U+010d27: */
+                                                     0, /* U+010d28: */
+                                                     0, /* U+010d29: */
+                                                     0, /* U+010d2a: */
+                                                     0, /* U+010d2b: */
+                                                     0, /* U+010d2c: */
+                                                     0, /* U+010d2d: */
+                                                     0, /* U+010d2e: */
+                                                     0, /* U+010d2f: */
+                                                     0, /* U+010d30: */
+                                                     0, /* U+010d31: */
+                                                     0, /* U+010d32: */
+                                                     0, /* U+010d33: */
+                                                     0, /* U+010d34: */
+                                                     0, /* U+010d35: */
+                                                     0, /* U+010d36: */
+                                                     0, /* U+010d37: */
+                                                     0, /* U+010d38: */
+                                                     0, /* U+010d39: */
+                                                     0, /* U+010d3a: */
+                                                     0, /* U+010d3b: */
+                                                     0, /* U+010d3c: */
+                                                     0, /* U+010d3d: */
+                                                     0, /* U+010d3e: */
+                                                     0, /* U+010d3f: */
+                                                     0, /* U+010d40: */
+                                                     0, /* U+010d41: */
+                                                     0, /* U+010d42: */
+                                                     0, /* U+010d43: */
+                                                     0, /* U+010d44: */
+                                                     0, /* U+010d45: */
+                                                     0, /* U+010d46: */
+                                                     0, /* U+010d47: */
+                                                     0, /* U+010d48: */
+                                                     0, /* U+010d49: */
+                                                     0, /* U+010d4a: */
+                                                     0, /* U+010d4b: */
+                                                     0, /* U+010d4c: */
+                                                     0, /* U+010d4d: */
+                                                     0, /* U+010d4e: */
+                                                     0, /* U+010d4f: */
+                                                     0, /* U+010d50: */
+                                                     0, /* U+010d51: */
+                                                     0, /* U+010d52: */
+                                                     0, /* U+010d53: */
+                                                     0, /* U+010d54: */
+                                                     0, /* U+010d55: */
+                                                     0, /* U+010d56: */
+                                                     0, /* U+010d57: */
+                                                     0, /* U+010d58: */
+                                                     0, /* U+010d59: */
+                                                     0, /* U+010d5a: */
+                                                     0, /* U+010d5b: */
+                                                     0, /* U+010d5c: */
+                                                     0, /* U+010d5d: */
+                                                     0, /* U+010d5e: */
+                                                     0, /* U+010d5f: */
+                                                     0, /* U+010d60: */
+                                                     0, /* U+010d61: */
+                                                     0, /* U+010d62: */
+                                                     0, /* U+010d63: */
+                                                     0, /* U+010d64: */
+                                                     0, /* U+010d65: */
+                                                     0, /* U+010d66: */
+                                                     0, /* U+010d67: */
+                                                     0, /* U+010d68: */
+                                                     0, /* U+010d69: */
+                                                     0, /* U+010d6a: */
+                                                     0, /* U+010d6b: */
+                                                     0, /* U+010d6c: */
+                                                     0, /* U+010d6d: */
+                                                     0, /* U+010d6e: */
+                                                     0, /* U+010d6f: */
+                                                     0, /* U+010d70: */
+                                                     0, /* U+010d71: */
+                                                     0, /* U+010d72: */
+                                                     0, /* U+010d73: */
+                                                     0, /* U+010d74: */
+                                                     0, /* U+010d75: */
+                                                     0, /* U+010d76: */
+                                                     0, /* U+010d77: */
+                                                     0, /* U+010d78: */
+                                                     0, /* U+010d79: */
+                                                     0, /* U+010d7a: */
+                                                     0, /* U+010d7b: */
+                                                     0, /* U+010d7c: */
+                                                     0, /* U+010d7d: */
+                                                     0, /* U+010d7e: */
+                                                     0, /* U+010d7f: */
+                                                     0, /* U+010d80: */
+                                                     0, /* U+010d81: */
+                                                     0, /* U+010d82: */
+                                                     0, /* U+010d83: */
+                                                     0, /* U+010d84: */
+                                                     0, /* U+010d85: */
+                                                     0, /* U+010d86: */
+                                                     0, /* U+010d87: */
+                                                     0, /* U+010d88: */
+                                                     0, /* U+010d89: */
+                                                     0, /* U+010d8a: */
+                                                     0, /* U+010d8b: */
+                                                     0, /* U+010d8c: */
+                                                     0, /* U+010d8d: */
+                                                     0, /* U+010d8e: */
+                                                     0, /* U+010d8f: */
+                                                     0, /* U+010d90: */
+                                                     0, /* U+010d91: */
+                                                     0, /* U+010d92: */
+                                                     0, /* U+010d93: */
+                                                     0, /* U+010d94: */
+                                                     0, /* U+010d95: */
+                                                     0, /* U+010d96: */
+                                                     0, /* U+010d97: */
+                                                     0, /* U+010d98: */
+                                                     0, /* U+010d99: */
+                                                     0, /* U+010d9a: */
+                                                     0, /* U+010d9b: */
+                                                     0, /* U+010d9c: */
+                                                     0, /* U+010d9d: */
+                                                     0, /* U+010d9e: */
+                                                     0, /* U+010d9f: */
+                                                     0, /* U+010da0: */
+                                                     0, /* U+010da1: */
+                                                     0, /* U+010da2: */
+                                                     0, /* U+010da3: */
+                                                     0, /* U+010da4: */
+                                                     0, /* U+010da5: */
+                                                     0, /* U+010da6: */
+                                                     0, /* U+010da7: */
+                                                     0, /* U+010da8: */
+                                                     0, /* U+010da9: */
+                                                     0, /* U+010daa: */
+                                                     0, /* U+010dab: */
+                                                     0, /* U+010dac: */
+                                                     0, /* U+010dad: */
+                                                     0, /* U+010dae: */
+                                                     0, /* U+010daf: */
+                                                     0, /* U+010db0: */
+                                                     0, /* U+010db1: */
+                                                     0, /* U+010db2: */
+                                                     0, /* U+010db3: */
+                                                     0, /* U+010db4: */
+                                                     0, /* U+010db5: */
+                                                     0, /* U+010db6: */
+                                                     0, /* U+010db7: */
+                                                     0, /* U+010db8: */
+                                                     0, /* U+010db9: */
+                                                     0, /* U+010dba: */
+                                                     0, /* U+010dbb: */
+                                                     0, /* U+010dbc: */
+                                                     0, /* U+010dbd: */
+                                                     0, /* U+010dbe: */
+                                                     0, /* U+010dbf: */
+                                                     0, /* U+010dc0: */
+                                                     0, /* U+010dc1: */
+                                                     0, /* U+010dc2: */
+                                                     0, /* U+010dc3: */
+                                                     0, /* U+010dc4: */
+                                                     0, /* U+010dc5: */
+                                                     0, /* U+010dc6: */
+                                                     0, /* U+010dc7: */
+                                                     0, /* U+010dc8: */
+                                                     0, /* U+010dc9: */
+                                                     0, /* U+010dca: */
+                                                     0, /* U+010dcb: */
+                                                     0, /* U+010dcc: */
+                                                     0, /* U+010dcd: */
+                                                     0, /* U+010dce: */
+                                                     0, /* U+010dcf: */
+                                                     0, /* U+010dd0: */
+                                                     0, /* U+010dd1: */
+                                                     0, /* U+010dd2: */
+                                                     0, /* U+010dd3: */
+                                                     0, /* U+010dd4: */
+                                                     0, /* U+010dd5: */
+                                                     0, /* U+010dd6: */
+                                                     0, /* U+010dd7: */
+                                                     0, /* U+010dd8: */
+                                                     0, /* U+010dd9: */
+                                                     0, /* U+010dda: */
+                                                     0, /* U+010ddb: */
+                                                     0, /* U+010ddc: */
+                                                     0, /* U+010ddd: */
+                                                     0, /* U+010dde: */
+                                                     0, /* U+010ddf: */
+                                                     0, /* U+010de0: */
+                                                     0, /* U+010de1: */
+                                                     0, /* U+010de2: */
+                                                     0, /* U+010de3: */
+                                                     0, /* U+010de4: */
+                                                     0, /* U+010de5: */
+                                                     0, /* U+010de6: */
+                                                     0, /* U+010de7: */
+                                                     0, /* U+010de8: */
+                                                     0, /* U+010de9: */
+                                                     0, /* U+010dea: */
+                                                     0, /* U+010deb: */
+                                                     0, /* U+010dec: */
+                                                     0, /* U+010ded: */
+                                                     0, /* U+010dee: */
+                                                     0, /* U+010def: */
+                                                     0, /* U+010df0: */
+                                                     0, /* U+010df1: */
+                                                     0, /* U+010df2: */
+                                                     0, /* U+010df3: */
+                                                     0, /* U+010df4: */
+                                                     0, /* U+010df5: */
+                                                     0, /* U+010df6: */
+                                                     0, /* U+010df7: */
+                                                     0, /* U+010df8: */
+                                                     0, /* U+010df9: */
+                                                     0, /* U+010dfa: */
+                                                     0, /* U+010dfb: */
+                                                     0, /* U+010dfc: */
+                                                     0, /* U+010dfd: */
+                                                     0, /* U+010dfe: */
+                                                     0, /* U+010dff: */
+                                                     0, /* U+010e00: */
+                                                     0, /* U+010e01: */
+                                                     0, /* U+010e02: */
+                                                     0, /* U+010e03: */
+                                                     0, /* U+010e04: */
+                                                     0, /* U+010e05: */
+                                                     0, /* U+010e06: */
+                                                     0, /* U+010e07: */
+                                                     0, /* U+010e08: */
+                                                     0, /* U+010e09: */
+                                                     0, /* U+010e0a: */
+                                                     0, /* U+010e0b: */
+                                                     0, /* U+010e0c: */
+                                                     0, /* U+010e0d: */
+                                                     0, /* U+010e0e: */
+                                                     0, /* U+010e0f: */
+                                                     0, /* U+010e10: */
+                                                     0, /* U+010e11: */
+                                                     0, /* U+010e12: */
+                                                     0, /* U+010e13: */
+                                                     0, /* U+010e14: */
+                                                     0, /* U+010e15: */
+                                                     0, /* U+010e16: */
+                                                     0, /* U+010e17: */
+                                                     0, /* U+010e18: */
+                                                     0, /* U+010e19: */
+                                                     0, /* U+010e1a: */
+                                                     0, /* U+010e1b: */
+                                                     0, /* U+010e1c: */
+                                                     0, /* U+010e1d: */
+                                                     0, /* U+010e1e: */
+                                                     0, /* U+010e1f: */
+                                                     0, /* U+010e20: */
+                                                     0, /* U+010e21: */
+                                                     0, /* U+010e22: */
+                                                     0, /* U+010e23: */
+                                                     0, /* U+010e24: */
+                                                     0, /* U+010e25: */
+                                                     0, /* U+010e26: */
+                                                     0, /* U+010e27: */
+                                                     0, /* U+010e28: */
+                                                     0, /* U+010e29: */
+                                                     0, /* U+010e2a: */
+                                                     0, /* U+010e2b: */
+                                                     0, /* U+010e2c: */
+                                                     0, /* U+010e2d: */
+                                                     0, /* U+010e2e: */
+                                                     0, /* U+010e2f: */
+                                                     0, /* U+010e30: */
+                                                     0, /* U+010e31: */
+                                                     0, /* U+010e32: */
+                                                     0, /* U+010e33: */
+                                                     0, /* U+010e34: */
+                                                     0, /* U+010e35: */
+                                                     0, /* U+010e36: */
+                                                     0, /* U+010e37: */
+                                                     0, /* U+010e38: */
+                                                     0, /* U+010e39: */
+                                                     0, /* U+010e3a: */
+                                                     0, /* U+010e3b: */
+                                                     0, /* U+010e3c: */
+                                                     0, /* U+010e3d: */
+                                                     0, /* U+010e3e: */
+                                                     0, /* U+010e3f: */
+                                                     0, /* U+010e40: */
+                                                     0, /* U+010e41: */
+                                                     0, /* U+010e42: */
+                                                     0, /* U+010e43: */
+                                                     0, /* U+010e44: */
+                                                     0, /* U+010e45: */
+                                                     0, /* U+010e46: */
+                                                     0, /* U+010e47: */
+                                                     0, /* U+010e48: */
+                                                     0, /* U+010e49: */
+                                                     0, /* U+010e4a: */
+                                                     0, /* U+010e4b: */
+                                                     0, /* U+010e4c: */
+                                                     0, /* U+010e4d: */
+                                                     0, /* U+010e4e: */
+                                                     0, /* U+010e4f: */
+                                                     0, /* U+010e50: */
+                                                     0, /* U+010e51: */
+                                                     0, /* U+010e52: */
+                                                     0, /* U+010e53: */
+                                                     0, /* U+010e54: */
+                                                     0, /* U+010e55: */
+                                                     0, /* U+010e56: */
+                                                     0, /* U+010e57: */
+                                                     0, /* U+010e58: */
+                                                     0, /* U+010e59: */
+                                                     0, /* U+010e5a: */
+                                                     0, /* U+010e5b: */
+                                                     0, /* U+010e5c: */
+                                                     0, /* U+010e5d: */
+                                                     0, /* U+010e5e: */
+                                                     0, /* U+010e5f: */
+                                                     0, /* U+010e60: RUMI DIGIT ONE*/
+                                                     0, /* U+010e61: RUMI DIGIT TWO*/
+                                                     0, /* U+010e62: RUMI DIGIT THREE*/
+                                                     0, /* U+010e63: RUMI DIGIT FOUR*/
+                                                     0, /* U+010e64: RUMI DIGIT FIVE*/
+                                                     0, /* U+010e65: RUMI DIGIT SIX*/
+                                                     0, /* U+010e66: RUMI DIGIT SEVEN*/
+                                                     0, /* U+010e67: RUMI DIGIT EIGHT*/
+                                                     0, /* U+010e68: RUMI DIGIT NINE*/
+                                                     0, /* U+010e69: RUMI NUMBER TEN*/
+                                                     0, /* U+010e6a: RUMI NUMBER TWENTY*/
+                                                     0, /* U+010e6b: RUMI NUMBER THIRTY*/
+                                                     0, /* U+010e6c: RUMI NUMBER FORTY*/
+                                                     0, /* U+010e6d: RUMI NUMBER FIFTY*/
+                                                     0, /* U+010e6e: RUMI NUMBER SIXTY*/
+                                                     0, /* U+010e6f: RUMI NUMBER SEVENTY*/
+                                                     0, /* U+010e70: RUMI NUMBER EIGHTY*/
+                                                     0, /* U+010e71: RUMI NUMBER NINETY*/
+                                                     0, /* U+010e72: RUMI NUMBER ONE HUNDRED*/
+                                                     0, /* U+010e73: RUMI NUMBER TWO HUNDRED*/
+                                                     0, /* U+010e74: RUMI NUMBER THREE HUNDRED*/
+                                                     0, /* U+010e75: RUMI NUMBER FOUR HUNDRED*/
+                                                     0, /* U+010e76: RUMI NUMBER FIVE HUNDRED*/
+                                                     0, /* U+010e77: RUMI NUMBER SIX HUNDRED*/
+                                                     0, /* U+010e78: RUMI NUMBER SEVEN HUNDRED*/
+                                                     0, /* U+010e79: RUMI NUMBER EIGHT HUNDRED*/
+                                                     0, /* U+010e7a: RUMI NUMBER NINE HUNDRED*/
+                                                     0, /* U+010e7b: RUMI FRACTION ONE HALF*/
+                                                     0, /* U+010e7c: RUMI FRACTION ONE QUARTER*/
+                                                     0, /* U+010e7d: RUMI FRACTION ONE THIRD*/
+                                                     0, /* U+010e7e: RUMI FRACTION TWO THIRDS*/
+                                                     0, /* U+010e7f: */
+                                                     0, /* U+010e80: */
+                                                     0, /* U+010e81: */
+                                                     0, /* U+010e82: */
+                                                     0, /* U+010e83: */
+                                                     0, /* U+010e84: */
+                                                     0, /* U+010e85: */
+                                                     0, /* U+010e86: */
+                                                     0, /* U+010e87: */
+                                                     0, /* U+010e88: */
+                                                     0, /* U+010e89: */
+                                                     0, /* U+010e8a: */
+                                                     0, /* U+010e8b: */
+                                                     0, /* U+010e8c: */
+                                                     0, /* U+010e8d: */
+                                                     0, /* U+010e8e: */
+                                                     0, /* U+010e8f: */
+                                                     0, /* U+010e90: */
+                                                     0, /* U+010e91: */
+                                                     0, /* U+010e92: */
+                                                     0, /* U+010e93: */
+                                                     0, /* U+010e94: */
+                                                     0, /* U+010e95: */
+                                                     0, /* U+010e96: */
+                                                     0, /* U+010e97: */
+                                                     0, /* U+010e98: */
+                                                     0, /* U+010e99: */
+                                                     0, /* U+010e9a: */
+                                                     0, /* U+010e9b: */
+                                                     0, /* U+010e9c: */
+                                                     0, /* U+010e9d: */
+                                                     0, /* U+010e9e: */
+                                                     0, /* U+010e9f: */
+                                                     0, /* U+010ea0: */
+                                                     0, /* U+010ea1: */
+                                                     0, /* U+010ea2: */
+                                                     0, /* U+010ea3: */
+                                                     0, /* U+010ea4: */
+                                                     0, /* U+010ea5: */
+                                                     0, /* U+010ea6: */
+                                                     0, /* U+010ea7: */
+                                                     0, /* U+010ea8: */
+                                                     0, /* U+010ea9: */
+                                                     0, /* U+010eaa: */
+                                                     0, /* U+010eab: */
+                                                     0, /* U+010eac: */
+                                                     0, /* U+010ead: */
+                                                     0, /* U+010eae: */
+                                                     0, /* U+010eaf: */
+                                                     0, /* U+010eb0: */
+                                                     0, /* U+010eb1: */
+                                                     0, /* U+010eb2: */
+                                                     0, /* U+010eb3: */
+                                                     0, /* U+010eb4: */
+                                                     0, /* U+010eb5: */
+                                                     0, /* U+010eb6: */
+                                                     0, /* U+010eb7: */
+                                                     0, /* U+010eb8: */
+                                                     0, /* U+010eb9: */
+                                                     0, /* U+010eba: */
+                                                     0, /* U+010ebb: */
+                                                     0, /* U+010ebc: */
+                                                     0, /* U+010ebd: */
+                                                     0, /* U+010ebe: */
+                                                     0, /* U+010ebf: */
+                                                     0, /* U+010ec0: */
+                                                     0, /* U+010ec1: */
+                                                     0, /* U+010ec2: */
+                                                     0, /* U+010ec3: */
+                                                     0, /* U+010ec4: */
+                                                     0, /* U+010ec5: */
+                                                     0, /* U+010ec6: */
+                                                     0, /* U+010ec7: */
+                                                     0, /* U+010ec8: */
+                                                     0, /* U+010ec9: */
+                                                     0, /* U+010eca: */
+                                                     0, /* U+010ecb: */
+                                                     0, /* U+010ecc: */
+                                                     0, /* U+010ecd: */
+                                                     0, /* U+010ece: */
+                                                     0, /* U+010ecf: */
+                                                     0, /* U+010ed0: */
+                                                     0, /* U+010ed1: */
+                                                     0, /* U+010ed2: */
+                                                     0, /* U+010ed3: */
+                                                     0, /* U+010ed4: */
+                                                     0, /* U+010ed5: */
+                                                     0, /* U+010ed6: */
+                                                     0, /* U+010ed7: */
+                                                     0, /* U+010ed8: */
+                                                     0, /* U+010ed9: */
+                                                     0, /* U+010eda: */
+                                                     0, /* U+010edb: */
+                                                     0, /* U+010edc: */
+                                                     0, /* U+010edd: */
+                                                     0, /* U+010ede: */
+                                                     0, /* U+010edf: */
+                                                     0, /* U+010ee0: */
+                                                     0, /* U+010ee1: */
+                                                     0, /* U+010ee2: */
+                                                     0, /* U+010ee3: */
+                                                     0, /* U+010ee4: */
+                                                     0, /* U+010ee5: */
+                                                     0, /* U+010ee6: */
+                                                     0, /* U+010ee7: */
+                                                     0, /* U+010ee8: */
+                                                     0, /* U+010ee9: */
+                                                     0, /* U+010eea: */
+                                                     0, /* U+010eeb: */
+                                                     0, /* U+010eec: */
+                                                     0, /* U+010eed: */
+                                                     0, /* U+010eee: */
+                                                     0, /* U+010eef: */
+                                                     0, /* U+010ef0: */
+                                                     0, /* U+010ef1: */
+                                                     0, /* U+010ef2: */
+                                                     0, /* U+010ef3: */
+                                                     0, /* U+010ef4: */
+                                                     0, /* U+010ef5: */
+                                                     0, /* U+010ef6: */
+                                                     0, /* U+010ef7: */
+                                                     0, /* U+010ef8: */
+                                                     0, /* U+010ef9: */
+                                                     0, /* U+010efa: */
+                                                     0, /* U+010efb: */
+                                                     0, /* U+010efc: */
+                                                     0, /* U+010efd: */
+                                                     0, /* U+010efe: */
+                                                     0, /* U+010eff: */
+                                                     0, /* U+010f00: */
+                                                     0, /* U+010f01: */
+                                                     0, /* U+010f02: */
+                                                     0, /* U+010f03: */
+                                                     0, /* U+010f04: */
+                                                     0, /* U+010f05: */
+                                                     0, /* U+010f06: */
+                                                     0, /* U+010f07: */
+                                                     0, /* U+010f08: */
+                                                     0, /* U+010f09: */
+                                                     0, /* U+010f0a: */
+                                                     0, /* U+010f0b: */
+                                                     0, /* U+010f0c: */
+                                                     0, /* U+010f0d: */
+                                                     0, /* U+010f0e: */
+                                                     0, /* U+010f0f: */
+                                                     0, /* U+010f10: */
+                                                     0, /* U+010f11: */
+                                                     0, /* U+010f12: */
+                                                     0, /* U+010f13: */
+                                                     0, /* U+010f14: */
+                                                     0, /* U+010f15: */
+                                                     0, /* U+010f16: */
+                                                     0, /* U+010f17: */
+                                                     0, /* U+010f18: */
+                                                     0, /* U+010f19: */
+                                                     0, /* U+010f1a: */
+                                                     0, /* U+010f1b: */
+                                                     0, /* U+010f1c: */
+                                                     0, /* U+010f1d: */
+                                                     0, /* U+010f1e: */
+                                                     0, /* U+010f1f: */
+                                                     0, /* U+010f20: */
+                                                     0, /* U+010f21: */
+                                                     0, /* U+010f22: */
+                                                     0, /* U+010f23: */
+                                                     0, /* U+010f24: */
+                                                     0, /* U+010f25: */
+                                                     0, /* U+010f26: */
+                                                     0, /* U+010f27: */
+                                                     0, /* U+010f28: */
+                                                     0, /* U+010f29: */
+                                                     0, /* U+010f2a: */
+                                                     0, /* U+010f2b: */
+                                                     0, /* U+010f2c: */
+                                                     0, /* U+010f2d: */
+                                                     0, /* U+010f2e: */
+                                                     0, /* U+010f2f: */
+                                                     0, /* U+010f30: */
+                                                     0, /* U+010f31: */
+                                                     0, /* U+010f32: */
+                                                     0, /* U+010f33: */
+                                                     0, /* U+010f34: */
+                                                     0, /* U+010f35: */
+                                                     0, /* U+010f36: */
+                                                     0, /* U+010f37: */
+                                                     0, /* U+010f38: */
+                                                     0, /* U+010f39: */
+                                                     0, /* U+010f3a: */
+                                                     0, /* U+010f3b: */
+                                                     0, /* U+010f3c: */
+                                                     0, /* U+010f3d: */
+                                                     0, /* U+010f3e: */
+                                                     0, /* U+010f3f: */
+                                                     0, /* U+010f40: */
+                                                     0, /* U+010f41: */
+                                                     0, /* U+010f42: */
+                                                     0, /* U+010f43: */
+                                                     0, /* U+010f44: */
+                                                     0, /* U+010f45: */
+                                                     0, /* U+010f46: */
+                                                     0, /* U+010f47: */
+                                                     0, /* U+010f48: */
+                                                     0, /* U+010f49: */
+                                                     0, /* U+010f4a: */
+                                                     0, /* U+010f4b: */
+                                                     0, /* U+010f4c: */
+                                                     0, /* U+010f4d: */
+                                                     0, /* U+010f4e: */
+                                                     0, /* U+010f4f: */
+                                                     0, /* U+010f50: */
+                                                     0, /* U+010f51: */
+                                                     0, /* U+010f52: */
+                                                     0, /* U+010f53: */
+                                                     0, /* U+010f54: */
+                                                     0, /* U+010f55: */
+                                                     0, /* U+010f56: */
+                                                     0, /* U+010f57: */
+                                                     0, /* U+010f58: */
+                                                     0, /* U+010f59: */
+                                                     0, /* U+010f5a: */
+                                                     0, /* U+010f5b: */
+                                                     0, /* U+010f5c: */
+                                                     0, /* U+010f5d: */
+                                                     0, /* U+010f5e: */
+                                                     0, /* U+010f5f: */
+                                                     0, /* U+010f60: */
+                                                     0, /* U+010f61: */
+                                                     0, /* U+010f62: */
+                                                     0, /* U+010f63: */
+                                                     0, /* U+010f64: */
+                                                     0, /* U+010f65: */
+                                                     0, /* U+010f66: */
+                                                     0, /* U+010f67: */
+                                                     0, /* U+010f68: */
+                                                     0, /* U+010f69: */
+                                                     0, /* U+010f6a: */
+                                                     0, /* U+010f6b: */
+                                                     0, /* U+010f6c: */
+                                                     0, /* U+010f6d: */
+                                                     0, /* U+010f6e: */
+                                                     0, /* U+010f6f: */
+                                                     0, /* U+010f70: */
+                                                     0, /* U+010f71: */
+                                                     0, /* U+010f72: */
+                                                     0, /* U+010f73: */
+                                                     0, /* U+010f74: */
+                                                     0, /* U+010f75: */
+                                                     0, /* U+010f76: */
+                                                     0, /* U+010f77: */
+                                                     0, /* U+010f78: */
+                                                     0, /* U+010f79: */
+                                                     0, /* U+010f7a: */
+                                                     0, /* U+010f7b: */
+                                                     0, /* U+010f7c: */
+                                                     0, /* U+010f7d: */
+                                                     0, /* U+010f7e: */
+                                                     0, /* U+010f7f: */
+                                                     0, /* U+010f80: */
+                                                     0, /* U+010f81: */
+                                                     0, /* U+010f82: */
+                                                     0, /* U+010f83: */
+                                                     0, /* U+010f84: */
+                                                     0, /* U+010f85: */
+                                                     0, /* U+010f86: */
+                                                     0, /* U+010f87: */
+                                                     0, /* U+010f88: */
+                                                     0, /* U+010f89: */
+                                                     0, /* U+010f8a: */
+                                                     0, /* U+010f8b: */
+                                                     0, /* U+010f8c: */
+                                                     0, /* U+010f8d: */
+                                                     0, /* U+010f8e: */
+                                                     0, /* U+010f8f: */
+                                                     0, /* U+010f90: */
+                                                     0, /* U+010f91: */
+                                                     0, /* U+010f92: */
+                                                     0, /* U+010f93: */
+                                                     0, /* U+010f94: */
+                                                     0, /* U+010f95: */
+                                                     0, /* U+010f96: */
+                                                     0, /* U+010f97: */
+                                                     0, /* U+010f98: */
+                                                     0, /* U+010f99: */
+                                                     0, /* U+010f9a: */
+                                                     0, /* U+010f9b: */
+                                                     0, /* U+010f9c: */
+                                                     0, /* U+010f9d: */
+                                                     0, /* U+010f9e: */
+                                                     0, /* U+010f9f: */
+                                                     0, /* U+010fa0: */
+                                                     0, /* U+010fa1: */
+                                                     0, /* U+010fa2: */
+                                                     0, /* U+010fa3: */
+                                                     0, /* U+010fa4: */
+                                                     0, /* U+010fa5: */
+                                                     0, /* U+010fa6: */
+                                                     0, /* U+010fa7: */
+                                                     0, /* U+010fa8: */
+                                                     0, /* U+010fa9: */
+                                                     0, /* U+010faa: */
+                                                     0, /* U+010fab: */
+                                                     0, /* U+010fac: */
+                                                     0, /* U+010fad: */
+                                                     0, /* U+010fae: */
+                                                     0, /* U+010faf: */
+                                                     0, /* U+010fb0: */
+                                                     0, /* U+010fb1: */
+                                                     0, /* U+010fb2: */
+                                                     0, /* U+010fb3: */
+                                                     0, /* U+010fb4: */
+                                                     0, /* U+010fb5: */
+                                                     0, /* U+010fb6: */
+                                                     0, /* U+010fb7: */
+                                                     0, /* U+010fb8: */
+                                                     0, /* U+010fb9: */
+                                                     0, /* U+010fba: */
+                                                     0, /* U+010fbb: */
+                                                     0, /* U+010fbc: */
+                                                     0, /* U+010fbd: */
+                                                     0, /* U+010fbe: */
+                                                     0, /* U+010fbf: */
+                                                     0, /* U+010fc0: */
+                                                     0, /* U+010fc1: */
+                                                     0, /* U+010fc2: */
+                                                     0, /* U+010fc3: */
+                                                     0, /* U+010fc4: */
+                                                     0, /* U+010fc5: */
+                                                     0, /* U+010fc6: */
+                                                     0, /* U+010fc7: */
+                                                     0, /* U+010fc8: */
+                                                     0, /* U+010fc9: */
+                                                     0, /* U+010fca: */
+                                                     0, /* U+010fcb: */
+                                                     0, /* U+010fcc: */
+                                                     0, /* U+010fcd: */
+                                                     0, /* U+010fce: */
+                                                     0, /* U+010fcf: */
+                                                     0, /* U+010fd0: */
+                                                     0, /* U+010fd1: */
+                                                     0, /* U+010fd2: */
+                                                     0, /* U+010fd3: */
+                                                     0, /* U+010fd4: */
+                                                     0, /* U+010fd5: */
+                                                     0, /* U+010fd6: */
+                                                     0, /* U+010fd7: */
+                                                     0, /* U+010fd8: */
+                                                     0, /* U+010fd9: */
+                                                     0, /* U+010fda: */
+                                                     0, /* U+010fdb: */
+                                                     0, /* U+010fdc: */
+                                                     0, /* U+010fdd: */
+                                                     0, /* U+010fde: */
+                                                     0, /* U+010fdf: */
+                                                     0, /* U+010fe0: */
+                                                     0, /* U+010fe1: */
+                                                     0, /* U+010fe2: */
+                                                     0, /* U+010fe3: */
+                                                     0, /* U+010fe4: */
+                                                     0, /* U+010fe5: */
+                                                     0, /* U+010fe6: */
+                                                     0, /* U+010fe7: */
+                                                     0, /* U+010fe8: */
+                                                     0, /* U+010fe9: */
+                                                     0, /* U+010fea: */
+                                                     0, /* U+010feb: */
+                                                     0, /* U+010fec: */
+                                                     0, /* U+010fed: */
+                                                     0, /* U+010fee: */
+                                                     0, /* U+010fef: */
+                                                     0, /* U+010ff0: */
+                                                     0, /* U+010ff1: */
+                                                     0, /* U+010ff2: */
+                                                     0, /* U+010ff3: */
+                                                     0, /* U+010ff4: */
+                                                     0, /* U+010ff5: */
+                                                     0, /* U+010ff6: */
+                                                     0, /* U+010ff7: */
+                                                     0, /* U+010ff8: */
+                                                     0, /* U+010ff9: */
+                                                     0, /* U+010ffa: */
+                                                     0, /* U+010ffb: */
+                                                     0, /* U+010ffc: */
+                                                     0, /* U+010ffd: */
+                                                     0, /* U+010ffe: */
+                                                     0, /* U+010fff: */
+                                           RTUNI_ALPHA, /* U+011000: BRAHMI SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+011001: BRAHMI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+011002: BRAHMI SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+011003: BRAHMI SIGN JIHVAMULIYA*/
+                                           RTUNI_ALPHA, /* U+011004: BRAHMI SIGN UPADHMANIYA*/
+                                           RTUNI_ALPHA, /* U+011005: BRAHMI LETTER A*/
+                                           RTUNI_ALPHA, /* U+011006: BRAHMI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+011007: BRAHMI LETTER I*/
+                                           RTUNI_ALPHA, /* U+011008: BRAHMI LETTER II*/
+                                           RTUNI_ALPHA, /* U+011009: BRAHMI LETTER U*/
+                                           RTUNI_ALPHA, /* U+01100a: BRAHMI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+01100b: BRAHMI LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+01100c: BRAHMI LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+01100d: BRAHMI LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+01100e: BRAHMI LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+01100f: BRAHMI LETTER E*/
+                                           RTUNI_ALPHA, /* U+011010: BRAHMI LETTER AI*/
+                                           RTUNI_ALPHA, /* U+011011: BRAHMI LETTER O*/
+                                           RTUNI_ALPHA, /* U+011012: BRAHMI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+011013: BRAHMI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+011014: BRAHMI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+011015: BRAHMI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+011016: BRAHMI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+011017: BRAHMI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+011018: BRAHMI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+011019: BRAHMI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+01101a: BRAHMI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+01101b: BRAHMI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+01101c: BRAHMI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+01101d: BRAHMI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+01101e: BRAHMI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+01101f: BRAHMI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+011020: BRAHMI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+011021: BRAHMI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+011022: BRAHMI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+011023: BRAHMI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+011024: BRAHMI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+011025: BRAHMI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+011026: BRAHMI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+011027: BRAHMI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+011028: BRAHMI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+011029: BRAHMI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+01102a: BRAHMI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+01102b: BRAHMI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+01102c: BRAHMI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+01102d: BRAHMI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+01102e: BRAHMI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+01102f: BRAHMI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+011030: BRAHMI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+011031: BRAHMI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+011032: BRAHMI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+011033: BRAHMI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+011034: BRAHMI LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+011035: BRAHMI LETTER OLD TAMIL LLLA*/
+                                           RTUNI_ALPHA, /* U+011036: BRAHMI LETTER OLD TAMIL RRA*/
+                                           RTUNI_ALPHA, /* U+011037: BRAHMI LETTER OLD TAMIL NNNA*/
+                                           RTUNI_ALPHA, /* U+011038: BRAHMI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+011039: BRAHMI VOWEL SIGN BHATTIPROLU AA*/
+                                           RTUNI_ALPHA, /* U+01103a: BRAHMI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+01103b: BRAHMI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+01103c: BRAHMI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+01103d: BRAHMI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+01103e: BRAHMI VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+01103f: BRAHMI VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+011040: BRAHMI VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+011041: BRAHMI VOWEL SIGN VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+011042: BRAHMI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+011043: BRAHMI VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+011044: BRAHMI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+011045: BRAHMI VOWEL SIGN AU*/
+                                                     0, /* U+011046: BRAHMI VIRAMA*/
+                                                     0, /* U+011047: BRAHMI DANDA*/
+                                                     0, /* U+011048: BRAHMI DOUBLE DANDA*/
+                                                     0, /* U+011049: BRAHMI PUNCTUATION DOT*/
+                                                     0, /* U+01104a: BRAHMI PUNCTUATION DOUBLE DOT*/
+                                                     0, /* U+01104b: BRAHMI PUNCTUATION LINE*/
+                                                     0, /* U+01104c: BRAHMI PUNCTUATION CRESCENT BAR*/
+                                                     0, /* U+01104d: BRAHMI PUNCTUATION LOTUS*/
+                                                     0, /* U+01104e: */
+                                                     0, /* U+01104f: */
+                                                     0, /* U+011050: */
+                                                     0, /* U+011051: */
+                                                     0, /* U+011052: BRAHMI NUMBER ONE*/
+                                                     0, /* U+011053: BRAHMI NUMBER TWO*/
+                                                     0, /* U+011054: BRAHMI NUMBER THREE*/
+                                                     0, /* U+011055: BRAHMI NUMBER FOUR*/
+                                                     0, /* U+011056: BRAHMI NUMBER FIVE*/
+                                                     0, /* U+011057: BRAHMI NUMBER SIX*/
+                                                     0, /* U+011058: BRAHMI NUMBER SEVEN*/
+                                                     0, /* U+011059: BRAHMI NUMBER EIGHT*/
+                                                     0, /* U+01105a: BRAHMI NUMBER NINE*/
+                                                     0, /* U+01105b: BRAHMI NUMBER TEN*/
+                                                     0, /* U+01105c: BRAHMI NUMBER TWENTY*/
+                                                     0, /* U+01105d: BRAHMI NUMBER THIRTY*/
+                                                     0, /* U+01105e: BRAHMI NUMBER FORTY*/
+                                                     0, /* U+01105f: BRAHMI NUMBER FIFTY*/
+                                                     0, /* U+011060: BRAHMI NUMBER SIXTY*/
+                                                     0, /* U+011061: BRAHMI NUMBER SEVENTY*/
+                                                     0, /* U+011062: BRAHMI NUMBER EIGHTY*/
+                                                     0, /* U+011063: BRAHMI NUMBER NINETY*/
+                                                     0, /* U+011064: BRAHMI NUMBER ONE HUNDRED*/
+                                                     0, /* U+011065: BRAHMI NUMBER ONE THOUSAND*/
+                                          RTUNI_DDIGIT, /* U+011066: BRAHMI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+011067: BRAHMI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+011068: BRAHMI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+011069: BRAHMI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01106a: BRAHMI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01106b: BRAHMI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01106c: BRAHMI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01106d: BRAHMI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01106e: BRAHMI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01106f: BRAHMI DIGIT NINE*/
+                                                     0, /* U+011070: */
+                                                     0, /* U+011071: */
+                                                     0, /* U+011072: */
+                                                     0, /* U+011073: */
+                                                     0, /* U+011074: */
+                                                     0, /* U+011075: */
+                                                     0, /* U+011076: */
+                                                     0, /* U+011077: */
+                                                     0, /* U+011078: */
+                                                     0, /* U+011079: */
+                                                     0, /* U+01107a: */
+                                                     0, /* U+01107b: */
+                                                     0, /* U+01107c: */
+                                                     0, /* U+01107d: */
+                                                     0, /* U+01107e: */
+                                                     0, /* U+01107f: */
+                                                     0, /* U+011080: KAITHI SIGN CANDRABINDU*/
+                                                     0, /* U+011081: KAITHI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+011082: KAITHI SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+011083: KAITHI LETTER A*/
+                                           RTUNI_ALPHA, /* U+011084: KAITHI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+011085: KAITHI LETTER I*/
+                                           RTUNI_ALPHA, /* U+011086: KAITHI LETTER II*/
+                                           RTUNI_ALPHA, /* U+011087: KAITHI LETTER U*/
+                                           RTUNI_ALPHA, /* U+011088: KAITHI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+011089: KAITHI LETTER E*/
+                                           RTUNI_ALPHA, /* U+01108a: KAITHI LETTER AI*/
+                                           RTUNI_ALPHA, /* U+01108b: KAITHI LETTER O*/
+                                           RTUNI_ALPHA, /* U+01108c: KAITHI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+01108d: KAITHI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+01108e: KAITHI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+01108f: KAITHI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+011090: KAITHI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+011091: KAITHI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+011092: KAITHI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+011093: KAITHI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+011094: KAITHI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+011095: KAITHI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+011096: KAITHI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+011097: KAITHI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+011098: KAITHI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+011099: KAITHI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+01109a: KAITHI LETTER DDDHA*/
+                                           RTUNI_ALPHA, /* U+01109b: KAITHI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+01109c: KAITHI LETTER RHA*/
+                                           RTUNI_ALPHA, /* U+01109d: KAITHI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+01109e: KAITHI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+01109f: KAITHI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+0110a0: KAITHI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0110a1: KAITHI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+0110a2: KAITHI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0110a3: KAITHI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0110a4: KAITHI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+0110a5: KAITHI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0110a6: KAITHI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+0110a7: KAITHI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0110a8: KAITHI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0110a9: KAITHI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0110aa: KAITHI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0110ab: KAITHI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+0110ac: KAITHI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+0110ad: KAITHI LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+0110ae: KAITHI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0110af: KAITHI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0110b0: KAITHI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0110b1: KAITHI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+0110b2: KAITHI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0110b3: KAITHI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0110b4: KAITHI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0110b5: KAITHI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0110b6: KAITHI VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+0110b7: KAITHI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+0110b8: KAITHI VOWEL SIGN AU*/
+                                                     0, /* U+0110b9: KAITHI SIGN VIRAMA*/
+                                                     0, /* U+0110ba: KAITHI SIGN NUKTA*/
+                                                     0, /* U+0110bb: KAITHI ABBREVIATION SIGN*/
+                                                     0, /* U+0110bc: KAITHI ENUMERATION SIGN*/
+                                                     0, /* U+0110bd: KAITHI NUMBER SIGN*/
+                                                     0, /* U+0110be: KAITHI SECTION MARK*/
+                                                     0, /* U+0110bf: KAITHI DOUBLE SECTION MARK*/
+                                                     0, /* U+0110c0: KAITHI DANDA*/
+                                                     0, /* U+0110c1: KAITHI DOUBLE DANDA*/
+                                                     0, /* U+0110c2: */
+                                                     0, /* U+0110c3: */
+                                                     0, /* U+0110c4: */
+                                                     0, /* U+0110c5: */
+                                                     0, /* U+0110c6: */
+                                                     0, /* U+0110c7: */
+                                                     0, /* U+0110c8: */
+                                                     0, /* U+0110c9: */
+                                                     0, /* U+0110ca: */
+                                                     0, /* U+0110cb: */
+                                                     0, /* U+0110cc: */
+                                                     0, /* U+0110cd: */
+                                                     0, /* U+0110ce: */
+                                                     0, /* U+0110cf: */
+                                           RTUNI_ALPHA, /* U+0110d0: SORA SOMPENG LETTER SAH*/
+                                           RTUNI_ALPHA, /* U+0110d1: SORA SOMPENG LETTER TAH*/
+                                           RTUNI_ALPHA, /* U+0110d2: SORA SOMPENG LETTER BAH*/
+                                           RTUNI_ALPHA, /* U+0110d3: SORA SOMPENG LETTER CAH*/
+                                           RTUNI_ALPHA, /* U+0110d4: SORA SOMPENG LETTER DAH*/
+                                           RTUNI_ALPHA, /* U+0110d5: SORA SOMPENG LETTER GAH*/
+                                           RTUNI_ALPHA, /* U+0110d6: SORA SOMPENG LETTER MAH*/
+                                           RTUNI_ALPHA, /* U+0110d7: SORA SOMPENG LETTER NGAH*/
+                                           RTUNI_ALPHA, /* U+0110d8: SORA SOMPENG LETTER LAH*/
+                                           RTUNI_ALPHA, /* U+0110d9: SORA SOMPENG LETTER NAH*/
+                                           RTUNI_ALPHA, /* U+0110da: SORA SOMPENG LETTER VAH*/
+                                           RTUNI_ALPHA, /* U+0110db: SORA SOMPENG LETTER PAH*/
+                                           RTUNI_ALPHA, /* U+0110dc: SORA SOMPENG LETTER YAH*/
+                                           RTUNI_ALPHA, /* U+0110dd: SORA SOMPENG LETTER RAH*/
+                                           RTUNI_ALPHA, /* U+0110de: SORA SOMPENG LETTER HAH*/
+                                           RTUNI_ALPHA, /* U+0110df: SORA SOMPENG LETTER KAH*/
+                                           RTUNI_ALPHA, /* U+0110e0: SORA SOMPENG LETTER JAH*/
+                                           RTUNI_ALPHA, /* U+0110e1: SORA SOMPENG LETTER NYAH*/
+                                           RTUNI_ALPHA, /* U+0110e2: SORA SOMPENG LETTER AH*/
+                                           RTUNI_ALPHA, /* U+0110e3: SORA SOMPENG LETTER EEH*/
+                                           RTUNI_ALPHA, /* U+0110e4: SORA SOMPENG LETTER IH*/
+                                           RTUNI_ALPHA, /* U+0110e5: SORA SOMPENG LETTER UH*/
+                                           RTUNI_ALPHA, /* U+0110e6: SORA SOMPENG LETTER OH*/
+                                           RTUNI_ALPHA, /* U+0110e7: SORA SOMPENG LETTER EH*/
+                                           RTUNI_ALPHA, /* U+0110e8: SORA SOMPENG LETTER MAE*/
+                                                     0, /* U+0110e9: */
+                                                     0, /* U+0110ea: */
+                                                     0, /* U+0110eb: */
+                                                     0, /* U+0110ec: */
+                                                     0, /* U+0110ed: */
+                                                     0, /* U+0110ee: */
+                                                     0, /* U+0110ef: */
+                                          RTUNI_DDIGIT, /* U+0110f0: SORA SOMPENG DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0110f1: SORA SOMPENG DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0110f2: SORA SOMPENG DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0110f3: SORA SOMPENG DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0110f4: SORA SOMPENG DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0110f5: SORA SOMPENG DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0110f6: SORA SOMPENG DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0110f7: SORA SOMPENG DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0110f8: SORA SOMPENG DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0110f9: SORA SOMPENG DIGIT NINE*/
+                                                     0, /* U+0110fa: */
+                                                     0, /* U+0110fb: */
+                                                     0, /* U+0110fc: */
+                                                     0, /* U+0110fd: */
+                                                     0, /* U+0110fe: */
+                                                     0, /* U+0110ff: */
+                                           RTUNI_ALPHA, /* U+011100: CHAKMA SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+011101: CHAKMA SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+011102: CHAKMA SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+011103: CHAKMA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+011104: CHAKMA LETTER I*/
+                                           RTUNI_ALPHA, /* U+011105: CHAKMA LETTER U*/
+                                           RTUNI_ALPHA, /* U+011106: CHAKMA LETTER E*/
+                                           RTUNI_ALPHA, /* U+011107: CHAKMA LETTER KAA*/
+                                           RTUNI_ALPHA, /* U+011108: CHAKMA LETTER KHAA*/
+                                           RTUNI_ALPHA, /* U+011109: CHAKMA LETTER GAA*/
+                                           RTUNI_ALPHA, /* U+01110a: CHAKMA LETTER GHAA*/
+                                           RTUNI_ALPHA, /* U+01110b: CHAKMA LETTER NGAA*/
+                                           RTUNI_ALPHA, /* U+01110c: CHAKMA LETTER CAA*/
+                                           RTUNI_ALPHA, /* U+01110d: CHAKMA LETTER CHAA*/
+                                           RTUNI_ALPHA, /* U+01110e: CHAKMA LETTER JAA*/
+                                           RTUNI_ALPHA, /* U+01110f: CHAKMA LETTER JHAA*/
+                                           RTUNI_ALPHA, /* U+011110: CHAKMA LETTER NYAA*/
+                                           RTUNI_ALPHA, /* U+011111: CHAKMA LETTER TTAA*/
+                                           RTUNI_ALPHA, /* U+011112: CHAKMA LETTER TTHAA*/
+                                           RTUNI_ALPHA, /* U+011113: CHAKMA LETTER DDAA*/
+                                           RTUNI_ALPHA, /* U+011114: CHAKMA LETTER DDHAA*/
+                                           RTUNI_ALPHA, /* U+011115: CHAKMA LETTER NNAA*/
+                                           RTUNI_ALPHA, /* U+011116: CHAKMA LETTER TAA*/
+                                           RTUNI_ALPHA, /* U+011117: CHAKMA LETTER THAA*/
+                                           RTUNI_ALPHA, /* U+011118: CHAKMA LETTER DAA*/
+                                           RTUNI_ALPHA, /* U+011119: CHAKMA LETTER DHAA*/
+                                           RTUNI_ALPHA, /* U+01111a: CHAKMA LETTER NAA*/
+                                           RTUNI_ALPHA, /* U+01111b: CHAKMA LETTER PAA*/
+                                           RTUNI_ALPHA, /* U+01111c: CHAKMA LETTER PHAA*/
+                                           RTUNI_ALPHA, /* U+01111d: CHAKMA LETTER BAA*/
+                                           RTUNI_ALPHA, /* U+01111e: CHAKMA LETTER BHAA*/
+                                           RTUNI_ALPHA, /* U+01111f: CHAKMA LETTER MAA*/
+                                           RTUNI_ALPHA, /* U+011120: CHAKMA LETTER YYAA*/
+                                           RTUNI_ALPHA, /* U+011121: CHAKMA LETTER YAA*/
+                                           RTUNI_ALPHA, /* U+011122: CHAKMA LETTER RAA*/
+                                           RTUNI_ALPHA, /* U+011123: CHAKMA LETTER LAA*/
+                                           RTUNI_ALPHA, /* U+011124: CHAKMA LETTER WAA*/
+                                           RTUNI_ALPHA, /* U+011125: CHAKMA LETTER SAA*/
+                                           RTUNI_ALPHA, /* U+011126: CHAKMA LETTER HAA*/
+                                           RTUNI_ALPHA, /* U+011127: CHAKMA VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+011128: CHAKMA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+011129: CHAKMA VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+01112a: CHAKMA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+01112b: CHAKMA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+01112c: CHAKMA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+01112d: CHAKMA VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+01112e: CHAKMA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+01112f: CHAKMA VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+011130: CHAKMA VOWEL SIGN OI*/
+                                           RTUNI_ALPHA, /* U+011131: CHAKMA O MARK*/
+                                           RTUNI_ALPHA, /* U+011132: CHAKMA AU MARK*/
+                                                     0, /* U+011133: CHAKMA VIRAMA*/
+                                                     0, /* U+011134: CHAKMA MAAYYAA*/
+                                                     0, /* U+011135: */
+                                          RTUNI_DDIGIT, /* U+011136: CHAKMA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+011137: CHAKMA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+011138: CHAKMA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+011139: CHAKMA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01113a: CHAKMA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01113b: CHAKMA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01113c: CHAKMA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01113d: CHAKMA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01113e: CHAKMA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01113f: CHAKMA DIGIT NINE*/
+                                                     0, /* U+011140: CHAKMA SECTION MARK*/
+                                                     0, /* U+011141: CHAKMA DANDA*/
+                                                     0, /* U+011142: CHAKMA DOUBLE DANDA*/
+                                                     0, /* U+011143: CHAKMA QUESTION MARK*/
+                                                     0, /* U+011144: */
+                                                     0, /* U+011145: */
+                                                     0, /* U+011146: */
+                                                     0, /* U+011147: */
+                                                     0, /* U+011148: */
+                                                     0, /* U+011149: */
+                                                     0, /* U+01114a: */
+                                                     0, /* U+01114b: */
+                                                     0, /* U+01114c: */
+                                                     0, /* U+01114d: */
+                                                     0, /* U+01114e: */
+                                                     0, /* U+01114f: */
+                                                     0, /* U+011150: */
+                                                     0, /* U+011151: */
+                                                     0, /* U+011152: */
+                                                     0, /* U+011153: */
+                                                     0, /* U+011154: */
+                                                     0, /* U+011155: */
+                                                     0, /* U+011156: */
+                                                     0, /* U+011157: */
+                                                     0, /* U+011158: */
+                                                     0, /* U+011159: */
+                                                     0, /* U+01115a: */
+                                                     0, /* U+01115b: */
+                                                     0, /* U+01115c: */
+                                                     0, /* U+01115d: */
+                                                     0, /* U+01115e: */
+                                                     0, /* U+01115f: */
+                                                     0, /* U+011160: */
+                                                     0, /* U+011161: */
+                                                     0, /* U+011162: */
+                                                     0, /* U+011163: */
+                                                     0, /* U+011164: */
+                                                     0, /* U+011165: */
+                                                     0, /* U+011166: */
+                                                     0, /* U+011167: */
+                                                     0, /* U+011168: */
+                                                     0, /* U+011169: */
+                                                     0, /* U+01116a: */
+                                                     0, /* U+01116b: */
+                                                     0, /* U+01116c: */
+                                                     0, /* U+01116d: */
+                                                     0, /* U+01116e: */
+                                                     0, /* U+01116f: */
+                                                     0, /* U+011170: */
+                                                     0, /* U+011171: */
+                                                     0, /* U+011172: */
+                                                     0, /* U+011173: */
+                                                     0, /* U+011174: */
+                                                     0, /* U+011175: */
+                                                     0, /* U+011176: */
+                                                     0, /* U+011177: */
+                                                     0, /* U+011178: */
+                                                     0, /* U+011179: */
+                                                     0, /* U+01117a: */
+                                                     0, /* U+01117b: */
+                                                     0, /* U+01117c: */
+                                                     0, /* U+01117d: */
+                                                     0, /* U+01117e: */
+                                                     0, /* U+01117f: */
+                                           RTUNI_ALPHA, /* U+011180: SHARADA SIGN CANDRABINDU*/
+                                           RTUNI_ALPHA, /* U+011181: SHARADA SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+011182: SHARADA SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+011183: SHARADA LETTER A*/
+                                           RTUNI_ALPHA, /* U+011184: SHARADA LETTER AA*/
+                                           RTUNI_ALPHA, /* U+011185: SHARADA LETTER I*/
+                                           RTUNI_ALPHA, /* U+011186: SHARADA LETTER II*/
+                                           RTUNI_ALPHA, /* U+011187: SHARADA LETTER U*/
+                                           RTUNI_ALPHA, /* U+011188: SHARADA LETTER UU*/
+                                           RTUNI_ALPHA, /* U+011189: SHARADA LETTER VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+01118a: SHARADA LETTER VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+01118b: SHARADA LETTER VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+01118c: SHARADA LETTER VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+01118d: SHARADA LETTER E*/
+                                           RTUNI_ALPHA, /* U+01118e: SHARADA LETTER AI*/
+                                           RTUNI_ALPHA, /* U+01118f: SHARADA LETTER O*/
+                                           RTUNI_ALPHA, /* U+011190: SHARADA LETTER AU*/
+                                           RTUNI_ALPHA, /* U+011191: SHARADA LETTER KA*/
+                                           RTUNI_ALPHA, /* U+011192: SHARADA LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+011193: SHARADA LETTER GA*/
+                                           RTUNI_ALPHA, /* U+011194: SHARADA LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+011195: SHARADA LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+011196: SHARADA LETTER CA*/
+                                           RTUNI_ALPHA, /* U+011197: SHARADA LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+011198: SHARADA LETTER JA*/
+                                           RTUNI_ALPHA, /* U+011199: SHARADA LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+01119a: SHARADA LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+01119b: SHARADA LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+01119c: SHARADA LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+01119d: SHARADA LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+01119e: SHARADA LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+01119f: SHARADA LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+0111a0: SHARADA LETTER TA*/
+                                           RTUNI_ALPHA, /* U+0111a1: SHARADA LETTER THA*/
+                                           RTUNI_ALPHA, /* U+0111a2: SHARADA LETTER DA*/
+                                           RTUNI_ALPHA, /* U+0111a3: SHARADA LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+0111a4: SHARADA LETTER NA*/
+                                           RTUNI_ALPHA, /* U+0111a5: SHARADA LETTER PA*/
+                                           RTUNI_ALPHA, /* U+0111a6: SHARADA LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+0111a7: SHARADA LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0111a8: SHARADA LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+0111a9: SHARADA LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0111aa: SHARADA LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0111ab: SHARADA LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0111ac: SHARADA LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0111ad: SHARADA LETTER LLA*/
+                                           RTUNI_ALPHA, /* U+0111ae: SHARADA LETTER VA*/
+                                           RTUNI_ALPHA, /* U+0111af: SHARADA LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+0111b0: SHARADA LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+0111b1: SHARADA LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0111b2: SHARADA LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0111b3: SHARADA VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0111b4: SHARADA VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+0111b5: SHARADA VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0111b6: SHARADA VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0111b7: SHARADA VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0111b8: SHARADA VOWEL SIGN VOCALIC R*/
+                                           RTUNI_ALPHA, /* U+0111b9: SHARADA VOWEL SIGN VOCALIC RR*/
+                                           RTUNI_ALPHA, /* U+0111ba: SHARADA VOWEL SIGN VOCALIC L*/
+                                           RTUNI_ALPHA, /* U+0111bb: SHARADA VOWEL SIGN VOCALIC LL*/
+                                           RTUNI_ALPHA, /* U+0111bc: SHARADA VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0111bd: SHARADA VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+0111be: SHARADA VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+0111bf: SHARADA VOWEL SIGN AU*/
+                                                     0, /* U+0111c0: SHARADA SIGN VIRAMA*/
+                                           RTUNI_ALPHA, /* U+0111c1: SHARADA SIGN AVAGRAHA*/
+                                           RTUNI_ALPHA, /* U+0111c2: SHARADA SIGN JIHVAMULIYA*/
+                                           RTUNI_ALPHA, /* U+0111c3: SHARADA SIGN UPADHMANIYA*/
+                                           RTUNI_ALPHA, /* U+0111c4: SHARADA OM*/
+                                                     0, /* U+0111c5: SHARADA DANDA*/
+                                                     0, /* U+0111c6: SHARADA DOUBLE DANDA*/
+                                                     0, /* U+0111c7: SHARADA ABBREVIATION SIGN*/
+                                                     0, /* U+0111c8: SHARADA SEPARATOR*/
+                                                     0, /* U+0111c9: */
+                                                     0, /* U+0111ca: */
+                                                     0, /* U+0111cb: */
+                                                     0, /* U+0111cc: */
+                                                     0, /* U+0111cd: */
+                                                     0, /* U+0111ce: */
+                                                     0, /* U+0111cf: */
+                                          RTUNI_DDIGIT, /* U+0111d0: SHARADA DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0111d1: SHARADA DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0111d2: SHARADA DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0111d3: SHARADA DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0111d4: SHARADA DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0111d5: SHARADA DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0111d6: SHARADA DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0111d7: SHARADA DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0111d8: SHARADA DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0111d9: SHARADA DIGIT NINE*/
+                                                     0, /* U+0111da: */
+                                                     0, /* U+0111db: */
+                                                     0, /* U+0111dc: */
+                                                     0, /* U+0111dd: */
+                                                     0, /* U+0111de: */
+                                                     0, /* U+0111df: */
+                                                     0, /* U+0111e0: */
+                                                     0, /* U+0111e1: */
+                                                     0, /* U+0111e2: */
+                                                     0, /* U+0111e3: */
+                                                     0, /* U+0111e4: */
+                                                     0, /* U+0111e5: */
+                                                     0, /* U+0111e6: */
+                                                     0, /* U+0111e7: */
+                                                     0, /* U+0111e8: */
+                                                     0, /* U+0111e9: */
+                                                     0, /* U+0111ea: */
+                                                     0, /* U+0111eb: */
+                                                     0, /* U+0111ec: */
+                                                     0, /* U+0111ed: */
+                                                     0, /* U+0111ee: */
+                                                     0, /* U+0111ef: */
+                                                     0, /* U+0111f0: */
+                                                     0, /* U+0111f1: */
+                                                     0, /* U+0111f2: */
+                                                     0, /* U+0111f3: */
+                                                     0, /* U+0111f4: */
+                                                     0, /* U+0111f5: */
+                                                     0, /* U+0111f6: */
+                                                     0, /* U+0111f7: */
+                                                     0, /* U+0111f8: */
+                                                     0, /* U+0111f9: */
+                                                     0, /* U+0111fa: */
+                                                     0, /* U+0111fb: */
+                                                     0, /* U+0111fc: */
+                                                     0, /* U+0111fd: */
+                                                     0, /* U+0111fe: */
+                                                     0, /* U+0111ff: */
+                                                     0, /* U+011200: */
+                                                     0, /* U+011201: */
+                                                     0, /* U+011202: */
+                                                     0, /* U+011203: */
+                                                     0, /* U+011204: */
+                                                     0, /* U+011205: */
+                                                     0, /* U+011206: */
+                                                     0, /* U+011207: */
+                                                     0, /* U+011208: */
+                                                     0, /* U+011209: */
+                                                     0, /* U+01120a: */
+                                                     0, /* U+01120b: */
+                                                     0, /* U+01120c: */
+                                                     0, /* U+01120d: */
+                                                     0, /* U+01120e: */
+                                                     0, /* U+01120f: */
+                                                     0, /* U+011210: */
+                                                     0, /* U+011211: */
+                                                     0, /* U+011212: */
+                                                     0, /* U+011213: */
+                                                     0, /* U+011214: */
+                                                     0, /* U+011215: */
+                                                     0, /* U+011216: */
+                                                     0, /* U+011217: */
+                                                     0, /* U+011218: */
+                                                     0, /* U+011219: */
+                                                     0, /* U+01121a: */
+                                                     0, /* U+01121b: */
+                                                     0, /* U+01121c: */
+                                                     0, /* U+01121d: */
+                                                     0, /* U+01121e: */
+                                                     0, /* U+01121f: */
+                                                     0, /* U+011220: */
+                                                     0, /* U+011221: */
+                                                     0, /* U+011222: */
+                                                     0, /* U+011223: */
+                                                     0, /* U+011224: */
+                                                     0, /* U+011225: */
+                                                     0, /* U+011226: */
+                                                     0, /* U+011227: */
+                                                     0, /* U+011228: */
+                                                     0, /* U+011229: */
+                                                     0, /* U+01122a: */
+                                                     0, /* U+01122b: */
+                                                     0, /* U+01122c: */
+                                                     0, /* U+01122d: */
+                                                     0, /* U+01122e: */
+                                                     0, /* U+01122f: */
+                                                     0, /* U+011230: */
+                                                     0, /* U+011231: */
+                                                     0, /* U+011232: */
+                                                     0, /* U+011233: */
+                                                     0, /* U+011234: */
+                                                     0, /* U+011235: */
+                                                     0, /* U+011236: */
+                                                     0, /* U+011237: */
+                                                     0, /* U+011238: */
+                                                     0, /* U+011239: */
+                                                     0, /* U+01123a: */
+                                                     0, /* U+01123b: */
+                                                     0, /* U+01123c: */
+                                                     0, /* U+01123d: */
+                                                     0, /* U+01123e: */
+                                                     0, /* U+01123f: */
+                                                     0, /* U+011240: */
+                                                     0, /* U+011241: */
+                                                     0, /* U+011242: */
+                                                     0, /* U+011243: */
+                                                     0, /* U+011244: */
+                                                     0, /* U+011245: */
+                                                     0, /* U+011246: */
+                                                     0, /* U+011247: */
+                                                     0, /* U+011248: */
+                                                     0, /* U+011249: */
+                                                     0, /* U+01124a: */
+                                                     0, /* U+01124b: */
+                                                     0, /* U+01124c: */
+                                                     0, /* U+01124d: */
+                                                     0, /* U+01124e: */
+                                                     0, /* U+01124f: */
+                                                     0, /* U+011250: */
+                                                     0, /* U+011251: */
+                                                     0, /* U+011252: */
+                                                     0, /* U+011253: */
+                                                     0, /* U+011254: */
+                                                     0, /* U+011255: */
+                                                     0, /* U+011256: */
+                                                     0, /* U+011257: */
+                                                     0, /* U+011258: */
+                                                     0, /* U+011259: */
+                                                     0, /* U+01125a: */
+                                                     0, /* U+01125b: */
+                                                     0, /* U+01125c: */
+                                                     0, /* U+01125d: */
+                                                     0, /* U+01125e: */
+                                                     0, /* U+01125f: */
+                                                     0, /* U+011260: */
+                                                     0, /* U+011261: */
+                                                     0, /* U+011262: */
+                                                     0, /* U+011263: */
+                                                     0, /* U+011264: */
+                                                     0, /* U+011265: */
+                                                     0, /* U+011266: */
+                                                     0, /* U+011267: */
+                                                     0, /* U+011268: */
+                                                     0, /* U+011269: */
+                                                     0, /* U+01126a: */
+                                                     0, /* U+01126b: */
+                                                     0, /* U+01126c: */
+                                                     0, /* U+01126d: */
+                                                     0, /* U+01126e: */
+                                                     0, /* U+01126f: */
+                                                     0, /* U+011270: */
+                                                     0, /* U+011271: */
+                                                     0, /* U+011272: */
+                                                     0, /* U+011273: */
+                                                     0, /* U+011274: */
+                                                     0, /* U+011275: */
+                                                     0, /* U+011276: */
+                                                     0, /* U+011277: */
+                                                     0, /* U+011278: */
+                                                     0, /* U+011279: */
+                                                     0, /* U+01127a: */
+                                                     0, /* U+01127b: */
+                                                     0, /* U+01127c: */
+                                                     0, /* U+01127d: */
+                                                     0, /* U+01127e: */
+                                                     0, /* U+01127f: */
+                                                     0, /* U+011280: */
+                                                     0, /* U+011281: */
+                                                     0, /* U+011282: */
+                                                     0, /* U+011283: */
+                                                     0, /* U+011284: */
+                                                     0, /* U+011285: */
+                                                     0, /* U+011286: */
+                                                     0, /* U+011287: */
+                                                     0, /* U+011288: */
+                                                     0, /* U+011289: */
+                                                     0, /* U+01128a: */
+                                                     0, /* U+01128b: */
+                                                     0, /* U+01128c: */
+                                                     0, /* U+01128d: */
+                                                     0, /* U+01128e: */
+                                                     0, /* U+01128f: */
+                                                     0, /* U+011290: */
+                                                     0, /* U+011291: */
+                                                     0, /* U+011292: */
+                                                     0, /* U+011293: */
+                                                     0, /* U+011294: */
+                                                     0, /* U+011295: */
+                                                     0, /* U+011296: */
+                                                     0, /* U+011297: */
+                                                     0, /* U+011298: */
+                                                     0, /* U+011299: */
+                                                     0, /* U+01129a: */
+                                                     0, /* U+01129b: */
+                                                     0, /* U+01129c: */
+                                                     0, /* U+01129d: */
+                                                     0, /* U+01129e: */
+                                                     0, /* U+01129f: */
+                                                     0, /* U+0112a0: */
+                                                     0, /* U+0112a1: */
+                                                     0, /* U+0112a2: */
+                                                     0, /* U+0112a3: */
+                                                     0, /* U+0112a4: */
+                                                     0, /* U+0112a5: */
+                                                     0, /* U+0112a6: */
+                                                     0, /* U+0112a7: */
+                                                     0, /* U+0112a8: */
+                                                     0, /* U+0112a9: */
+                                                     0, /* U+0112aa: */
+                                                     0, /* U+0112ab: */
+                                                     0, /* U+0112ac: */
+                                                     0, /* U+0112ad: */
+                                                     0, /* U+0112ae: */
+                                                     0, /* U+0112af: */
+                                                     0, /* U+0112b0: */
+                                                     0, /* U+0112b1: */
+                                                     0, /* U+0112b2: */
+                                                     0, /* U+0112b3: */
+                                                     0, /* U+0112b4: */
+                                                     0, /* U+0112b5: */
+                                                     0, /* U+0112b6: */
+                                                     0, /* U+0112b7: */
+                                                     0, /* U+0112b8: */
+                                                     0, /* U+0112b9: */
+                                                     0, /* U+0112ba: */
+                                                     0, /* U+0112bb: */
+                                                     0, /* U+0112bc: */
+                                                     0, /* U+0112bd: */
+                                                     0, /* U+0112be: */
+                                                     0, /* U+0112bf: */
+                                                     0, /* U+0112c0: */
+                                                     0, /* U+0112c1: */
+                                                     0, /* U+0112c2: */
+                                                     0, /* U+0112c3: */
+                                                     0, /* U+0112c4: */
+                                                     0, /* U+0112c5: */
+                                                     0, /* U+0112c6: */
+                                                     0, /* U+0112c7: */
+                                                     0, /* U+0112c8: */
+                                                     0, /* U+0112c9: */
+                                                     0, /* U+0112ca: */
+                                                     0, /* U+0112cb: */
+                                                     0, /* U+0112cc: */
+                                                     0, /* U+0112cd: */
+                                                     0, /* U+0112ce: */
+                                                     0, /* U+0112cf: */
+                                                     0, /* U+0112d0: */
+                                                     0, /* U+0112d1: */
+                                                     0, /* U+0112d2: */
+                                                     0, /* U+0112d3: */
+                                                     0, /* U+0112d4: */
+                                                     0, /* U+0112d5: */
+                                                     0, /* U+0112d6: */
+                                                     0, /* U+0112d7: */
+                                                     0, /* U+0112d8: */
+                                                     0, /* U+0112d9: */
+                                                     0, /* U+0112da: */
+                                                     0, /* U+0112db: */
+                                                     0, /* U+0112dc: */
+                                                     0, /* U+0112dd: */
+                                                     0, /* U+0112de: */
+                                                     0, /* U+0112df: */
+                                                     0, /* U+0112e0: */
+                                                     0, /* U+0112e1: */
+                                                     0, /* U+0112e2: */
+                                                     0, /* U+0112e3: */
+                                                     0, /* U+0112e4: */
+                                                     0, /* U+0112e5: */
+                                                     0, /* U+0112e6: */
+                                                     0, /* U+0112e7: */
+                                                     0, /* U+0112e8: */
+                                                     0, /* U+0112e9: */
+                                                     0, /* U+0112ea: */
+                                                     0, /* U+0112eb: */
+                                                     0, /* U+0112ec: */
+                                                     0, /* U+0112ed: */
+                                                     0, /* U+0112ee: */
+                                                     0, /* U+0112ef: */
+                                                     0, /* U+0112f0: */
+                                                     0, /* U+0112f1: */
+                                                     0, /* U+0112f2: */
+                                                     0, /* U+0112f3: */
+                                                     0, /* U+0112f4: */
+                                                     0, /* U+0112f5: */
+                                                     0, /* U+0112f6: */
+                                                     0, /* U+0112f7: */
+                                                     0, /* U+0112f8: */
+                                                     0, /* U+0112f9: */
+                                                     0, /* U+0112fa: */
+                                                     0, /* U+0112fb: */
+                                                     0, /* U+0112fc: */
+                                                     0, /* U+0112fd: */
+                                                     0, /* U+0112fe: */
+                                                     0, /* U+0112ff: */
+                                                     0, /* U+011300: */
+                                                     0, /* U+011301: */
+                                                     0, /* U+011302: */
+                                                     0, /* U+011303: */
+                                                     0, /* U+011304: */
+                                                     0, /* U+011305: */
+                                                     0, /* U+011306: */
+                                                     0, /* U+011307: */
+                                                     0, /* U+011308: */
+                                                     0, /* U+011309: */
+                                                     0, /* U+01130a: */
+                                                     0, /* U+01130b: */
+                                                     0, /* U+01130c: */
+                                                     0, /* U+01130d: */
+                                                     0, /* U+01130e: */
+                                                     0, /* U+01130f: */
+                                                     0, /* U+011310: */
+                                                     0, /* U+011311: */
+                                                     0, /* U+011312: */
+                                                     0, /* U+011313: */
+                                                     0, /* U+011314: */
+                                                     0, /* U+011315: */
+                                                     0, /* U+011316: */
+                                                     0, /* U+011317: */
+                                                     0, /* U+011318: */
+                                                     0, /* U+011319: */
+                                                     0, /* U+01131a: */
+                                                     0, /* U+01131b: */
+                                                     0, /* U+01131c: */
+                                                     0, /* U+01131d: */
+                                                     0, /* U+01131e: */
+                                                     0, /* U+01131f: */
+                                                     0, /* U+011320: */
+                                                     0, /* U+011321: */
+                                                     0, /* U+011322: */
+                                                     0, /* U+011323: */
+                                                     0, /* U+011324: */
+                                                     0, /* U+011325: */
+                                                     0, /* U+011326: */
+                                                     0, /* U+011327: */
+                                                     0, /* U+011328: */
+                                                     0, /* U+011329: */
+                                                     0, /* U+01132a: */
+                                                     0, /* U+01132b: */
+                                                     0, /* U+01132c: */
+                                                     0, /* U+01132d: */
+                                                     0, /* U+01132e: */
+                                                     0, /* U+01132f: */
+                                                     0, /* U+011330: */
+                                                     0, /* U+011331: */
+                                                     0, /* U+011332: */
+                                                     0, /* U+011333: */
+                                                     0, /* U+011334: */
+                                                     0, /* U+011335: */
+                                                     0, /* U+011336: */
+                                                     0, /* U+011337: */
+                                                     0, /* U+011338: */
+                                                     0, /* U+011339: */
+                                                     0, /* U+01133a: */
+                                                     0, /* U+01133b: */
+                                                     0, /* U+01133c: */
+                                                     0, /* U+01133d: */
+                                                     0, /* U+01133e: */
+                                                     0, /* U+01133f: */
+                                                     0, /* U+011340: */
+                                                     0, /* U+011341: */
+                                                     0, /* U+011342: */
+                                                     0, /* U+011343: */
+                                                     0, /* U+011344: */
+                                                     0, /* U+011345: */
+                                                     0, /* U+011346: */
+                                                     0, /* U+011347: */
+                                                     0, /* U+011348: */
+                                                     0, /* U+011349: */
+                                                     0, /* U+01134a: */
+                                                     0, /* U+01134b: */
+                                                     0, /* U+01134c: */
+                                                     0, /* U+01134d: */
+                                                     0, /* U+01134e: */
+                                                     0, /* U+01134f: */
+                                                     0, /* U+011350: */
+                                                     0, /* U+011351: */
+                                                     0, /* U+011352: */
+                                                     0, /* U+011353: */
+                                                     0, /* U+011354: */
+                                                     0, /* U+011355: */
+                                                     0, /* U+011356: */
+                                                     0, /* U+011357: */
+                                                     0, /* U+011358: */
+                                                     0, /* U+011359: */
+                                                     0, /* U+01135a: */
+                                                     0, /* U+01135b: */
+                                                     0, /* U+01135c: */
+                                                     0, /* U+01135d: */
+                                                     0, /* U+01135e: */
+                                                     0, /* U+01135f: */
+                                                     0, /* U+011360: */
+                                                     0, /* U+011361: */
+                                                     0, /* U+011362: */
+                                                     0, /* U+011363: */
+                                                     0, /* U+011364: */
+                                                     0, /* U+011365: */
+                                                     0, /* U+011366: */
+                                                     0, /* U+011367: */
+                                                     0, /* U+011368: */
+                                                     0, /* U+011369: */
+                                                     0, /* U+01136a: */
+                                                     0, /* U+01136b: */
+                                                     0, /* U+01136c: */
+                                                     0, /* U+01136d: */
+                                                     0, /* U+01136e: */
+                                                     0, /* U+01136f: */
+                                                     0, /* U+011370: */
+                                                     0, /* U+011371: */
+                                                     0, /* U+011372: */
+                                                     0, /* U+011373: */
+                                                     0, /* U+011374: */
+                                                     0, /* U+011375: */
+                                                     0, /* U+011376: */
+                                                     0, /* U+011377: */
+                                                     0, /* U+011378: */
+                                                     0, /* U+011379: */
+                                                     0, /* U+01137a: */
+                                                     0, /* U+01137b: */
+                                                     0, /* U+01137c: */
+                                                     0, /* U+01137d: */
+                                                     0, /* U+01137e: */
+                                                     0, /* U+01137f: */
+                                                     0, /* U+011380: */
+                                                     0, /* U+011381: */
+                                                     0, /* U+011382: */
+                                                     0, /* U+011383: */
+                                                     0, /* U+011384: */
+                                                     0, /* U+011385: */
+                                                     0, /* U+011386: */
+                                                     0, /* U+011387: */
+                                                     0, /* U+011388: */
+                                                     0, /* U+011389: */
+                                                     0, /* U+01138a: */
+                                                     0, /* U+01138b: */
+                                                     0, /* U+01138c: */
+                                                     0, /* U+01138d: */
+                                                     0, /* U+01138e: */
+                                                     0, /* U+01138f: */
+                                                     0, /* U+011390: */
+                                                     0, /* U+011391: */
+                                                     0, /* U+011392: */
+                                                     0, /* U+011393: */
+                                                     0, /* U+011394: */
+                                                     0, /* U+011395: */
+                                                     0, /* U+011396: */
+                                                     0, /* U+011397: */
+                                                     0, /* U+011398: */
+                                                     0, /* U+011399: */
+                                                     0, /* U+01139a: */
+                                                     0, /* U+01139b: */
+                                                     0, /* U+01139c: */
+                                                     0, /* U+01139d: */
+                                                     0, /* U+01139e: */
+                                                     0, /* U+01139f: */
+                                                     0, /* U+0113a0: */
+                                                     0, /* U+0113a1: */
+                                                     0, /* U+0113a2: */
+                                                     0, /* U+0113a3: */
+                                                     0, /* U+0113a4: */
+                                                     0, /* U+0113a5: */
+                                                     0, /* U+0113a6: */
+                                                     0, /* U+0113a7: */
+                                                     0, /* U+0113a8: */
+                                                     0, /* U+0113a9: */
+                                                     0, /* U+0113aa: */
+                                                     0, /* U+0113ab: */
+                                                     0, /* U+0113ac: */
+                                                     0, /* U+0113ad: */
+                                                     0, /* U+0113ae: */
+                                                     0, /* U+0113af: */
+                                                     0, /* U+0113b0: */
+                                                     0, /* U+0113b1: */
+                                                     0, /* U+0113b2: */
+                                                     0, /* U+0113b3: */
+                                                     0, /* U+0113b4: */
+                                                     0, /* U+0113b5: */
+                                                     0, /* U+0113b6: */
+                                                     0, /* U+0113b7: */
+                                                     0, /* U+0113b8: */
+                                                     0, /* U+0113b9: */
+                                                     0, /* U+0113ba: */
+                                                     0, /* U+0113bb: */
+                                                     0, /* U+0113bc: */
+                                                     0, /* U+0113bd: */
+                                                     0, /* U+0113be: */
+                                                     0, /* U+0113bf: */
+                                                     0, /* U+0113c0: */
+                                                     0, /* U+0113c1: */
+                                                     0, /* U+0113c2: */
+                                                     0, /* U+0113c3: */
+                                                     0, /* U+0113c4: */
+                                                     0, /* U+0113c5: */
+                                                     0, /* U+0113c6: */
+                                                     0, /* U+0113c7: */
+                                                     0, /* U+0113c8: */
+                                                     0, /* U+0113c9: */
+                                                     0, /* U+0113ca: */
+                                                     0, /* U+0113cb: */
+                                                     0, /* U+0113cc: */
+                                                     0, /* U+0113cd: */
+                                                     0, /* U+0113ce: */
+                                                     0, /* U+0113cf: */
+                                                     0, /* U+0113d0: */
+                                                     0, /* U+0113d1: */
+                                                     0, /* U+0113d2: */
+                                                     0, /* U+0113d3: */
+                                                     0, /* U+0113d4: */
+                                                     0, /* U+0113d5: */
+                                                     0, /* U+0113d6: */
+                                                     0, /* U+0113d7: */
+                                                     0, /* U+0113d8: */
+                                                     0, /* U+0113d9: */
+                                                     0, /* U+0113da: */
+                                                     0, /* U+0113db: */
+                                                     0, /* U+0113dc: */
+                                                     0, /* U+0113dd: */
+                                                     0, /* U+0113de: */
+                                                     0, /* U+0113df: */
+                                                     0, /* U+0113e0: */
+                                                     0, /* U+0113e1: */
+                                                     0, /* U+0113e2: */
+                                                     0, /* U+0113e3: */
+                                                     0, /* U+0113e4: */
+                                                     0, /* U+0113e5: */
+                                                     0, /* U+0113e6: */
+                                                     0, /* U+0113e7: */
+                                                     0, /* U+0113e8: */
+                                                     0, /* U+0113e9: */
+                                                     0, /* U+0113ea: */
+                                                     0, /* U+0113eb: */
+                                                     0, /* U+0113ec: */
+                                                     0, /* U+0113ed: */
+                                                     0, /* U+0113ee: */
+                                                     0, /* U+0113ef: */
+                                                     0, /* U+0113f0: */
+                                                     0, /* U+0113f1: */
+                                                     0, /* U+0113f2: */
+                                                     0, /* U+0113f3: */
+                                                     0, /* U+0113f4: */
+                                                     0, /* U+0113f5: */
+                                                     0, /* U+0113f6: */
+                                                     0, /* U+0113f7: */
+                                                     0, /* U+0113f8: */
+                                                     0, /* U+0113f9: */
+                                                     0, /* U+0113fa: */
+                                                     0, /* U+0113fb: */
+                                                     0, /* U+0113fc: */
+                                                     0, /* U+0113fd: */
+                                                     0, /* U+0113fe: */
+                                                     0, /* U+0113ff: */
+                                                     0, /* U+011400: */
+                                                     0, /* U+011401: */
+                                                     0, /* U+011402: */
+                                                     0, /* U+011403: */
+                                                     0, /* U+011404: */
+                                                     0, /* U+011405: */
+                                                     0, /* U+011406: */
+                                                     0, /* U+011407: */
+                                                     0, /* U+011408: */
+                                                     0, /* U+011409: */
+                                                     0, /* U+01140a: */
+                                                     0, /* U+01140b: */
+                                                     0, /* U+01140c: */
+                                                     0, /* U+01140d: */
+                                                     0, /* U+01140e: */
+                                                     0, /* U+01140f: */
+                                                     0, /* U+011410: */
+                                                     0, /* U+011411: */
+                                                     0, /* U+011412: */
+                                                     0, /* U+011413: */
+                                                     0, /* U+011414: */
+                                                     0, /* U+011415: */
+                                                     0, /* U+011416: */
+                                                     0, /* U+011417: */
+                                                     0, /* U+011418: */
+                                                     0, /* U+011419: */
+                                                     0, /* U+01141a: */
+                                                     0, /* U+01141b: */
+                                                     0, /* U+01141c: */
+                                                     0, /* U+01141d: */
+                                                     0, /* U+01141e: */
+                                                     0, /* U+01141f: */
+                                                     0, /* U+011420: */
+                                                     0, /* U+011421: */
+                                                     0, /* U+011422: */
+                                                     0, /* U+011423: */
+                                                     0, /* U+011424: */
+                                                     0, /* U+011425: */
+                                                     0, /* U+011426: */
+                                                     0, /* U+011427: */
+                                                     0, /* U+011428: */
+                                                     0, /* U+011429: */
+                                                     0, /* U+01142a: */
+                                                     0, /* U+01142b: */
+                                                     0, /* U+01142c: */
+                                                     0, /* U+01142d: */
+                                                     0, /* U+01142e: */
+                                                     0, /* U+01142f: */
+                                                     0, /* U+011430: */
+                                                     0, /* U+011431: */
+                                                     0, /* U+011432: */
+                                                     0, /* U+011433: */
+                                                     0, /* U+011434: */
+                                                     0, /* U+011435: */
+                                                     0, /* U+011436: */
+                                                     0, /* U+011437: */
+                                                     0, /* U+011438: */
+                                                     0, /* U+011439: */
+                                                     0, /* U+01143a: */
+                                                     0, /* U+01143b: */
+                                                     0, /* U+01143c: */
+                                                     0, /* U+01143d: */
+                                                     0, /* U+01143e: */
+                                                     0, /* U+01143f: */
+                                                     0, /* U+011440: */
+                                                     0, /* U+011441: */
+                                                     0, /* U+011442: */
+                                                     0, /* U+011443: */
+                                                     0, /* U+011444: */
+                                                     0, /* U+011445: */
+                                                     0, /* U+011446: */
+                                                     0, /* U+011447: */
+                                                     0, /* U+011448: */
+                                                     0, /* U+011449: */
+                                                     0, /* U+01144a: */
+                                                     0, /* U+01144b: */
+                                                     0, /* U+01144c: */
+                                                     0, /* U+01144d: */
+                                                     0, /* U+01144e: */
+                                                     0, /* U+01144f: */
+                                                     0, /* U+011450: */
+                                                     0, /* U+011451: */
+                                                     0, /* U+011452: */
+                                                     0, /* U+011453: */
+                                                     0, /* U+011454: */
+                                                     0, /* U+011455: */
+                                                     0, /* U+011456: */
+                                                     0, /* U+011457: */
+                                                     0, /* U+011458: */
+                                                     0, /* U+011459: */
+                                                     0, /* U+01145a: */
+                                                     0, /* U+01145b: */
+                                                     0, /* U+01145c: */
+                                                     0, /* U+01145d: */
+                                                     0, /* U+01145e: */
+                                                     0, /* U+01145f: */
+                                                     0, /* U+011460: */
+                                                     0, /* U+011461: */
+                                                     0, /* U+011462: */
+                                                     0, /* U+011463: */
+                                                     0, /* U+011464: */
+                                                     0, /* U+011465: */
+                                                     0, /* U+011466: */
+                                                     0, /* U+011467: */
+                                                     0, /* U+011468: */
+                                                     0, /* U+011469: */
+                                                     0, /* U+01146a: */
+                                                     0, /* U+01146b: */
+                                                     0, /* U+01146c: */
+                                                     0, /* U+01146d: */
+                                                     0, /* U+01146e: */
+                                                     0, /* U+01146f: */
+                                                     0, /* U+011470: */
+                                                     0, /* U+011471: */
+                                                     0, /* U+011472: */
+                                                     0, /* U+011473: */
+                                                     0, /* U+011474: */
+                                                     0, /* U+011475: */
+                                                     0, /* U+011476: */
+                                                     0, /* U+011477: */
+                                                     0, /* U+011478: */
+                                                     0, /* U+011479: */
+                                                     0, /* U+01147a: */
+                                                     0, /* U+01147b: */
+                                                     0, /* U+01147c: */
+                                                     0, /* U+01147d: */
+                                                     0, /* U+01147e: */
+                                                     0, /* U+01147f: */
+                                                     0, /* U+011480: */
+                                                     0, /* U+011481: */
+                                                     0, /* U+011482: */
+                                                     0, /* U+011483: */
+                                                     0, /* U+011484: */
+                                                     0, /* U+011485: */
+                                                     0, /* U+011486: */
+                                                     0, /* U+011487: */
+                                                     0, /* U+011488: */
+                                                     0, /* U+011489: */
+                                                     0, /* U+01148a: */
+                                                     0, /* U+01148b: */
+                                                     0, /* U+01148c: */
+                                                     0, /* U+01148d: */
+                                                     0, /* U+01148e: */
+                                                     0, /* U+01148f: */
+                                                     0, /* U+011490: */
+                                                     0, /* U+011491: */
+                                                     0, /* U+011492: */
+                                                     0, /* U+011493: */
+                                                     0, /* U+011494: */
+                                                     0, /* U+011495: */
+                                                     0, /* U+011496: */
+                                                     0, /* U+011497: */
+                                                     0, /* U+011498: */
+                                                     0, /* U+011499: */
+                                                     0, /* U+01149a: */
+                                                     0, /* U+01149b: */
+                                                     0, /* U+01149c: */
+                                                     0, /* U+01149d: */
+                                                     0, /* U+01149e: */
+                                                     0, /* U+01149f: */
+                                                     0, /* U+0114a0: */
+                                                     0, /* U+0114a1: */
+                                                     0, /* U+0114a2: */
+                                                     0, /* U+0114a3: */
+                                                     0, /* U+0114a4: */
+                                                     0, /* U+0114a5: */
+                                                     0, /* U+0114a6: */
+                                                     0, /* U+0114a7: */
+                                                     0, /* U+0114a8: */
+                                                     0, /* U+0114a9: */
+                                                     0, /* U+0114aa: */
+                                                     0, /* U+0114ab: */
+                                                     0, /* U+0114ac: */
+                                                     0, /* U+0114ad: */
+                                                     0, /* U+0114ae: */
+                                                     0, /* U+0114af: */
+                                                     0, /* U+0114b0: */
+                                                     0, /* U+0114b1: */
+                                                     0, /* U+0114b2: */
+                                                     0, /* U+0114b3: */
+                                                     0, /* U+0114b4: */
+                                                     0, /* U+0114b5: */
+                                                     0, /* U+0114b6: */
+                                                     0, /* U+0114b7: */
+                                                     0, /* U+0114b8: */
+                                                     0, /* U+0114b9: */
+                                                     0, /* U+0114ba: */
+                                                     0, /* U+0114bb: */
+                                                     0, /* U+0114bc: */
+                                                     0, /* U+0114bd: */
+                                                     0, /* U+0114be: */
+                                                     0, /* U+0114bf: */
+                                                     0, /* U+0114c0: */
+                                                     0, /* U+0114c1: */
+                                                     0, /* U+0114c2: */
+                                                     0, /* U+0114c3: */
+                                                     0, /* U+0114c4: */
+                                                     0, /* U+0114c5: */
+                                                     0, /* U+0114c6: */
+                                                     0, /* U+0114c7: */
+                                                     0, /* U+0114c8: */
+                                                     0, /* U+0114c9: */
+                                                     0, /* U+0114ca: */
+                                                     0, /* U+0114cb: */
+                                                     0, /* U+0114cc: */
+                                                     0, /* U+0114cd: */
+                                                     0, /* U+0114ce: */
+                                                     0, /* U+0114cf: */
+                                                     0, /* U+0114d0: */
+                                                     0, /* U+0114d1: */
+                                                     0, /* U+0114d2: */
+                                                     0, /* U+0114d3: */
+                                                     0, /* U+0114d4: */
+                                                     0, /* U+0114d5: */
+                                                     0, /* U+0114d6: */
+                                                     0, /* U+0114d7: */
+                                                     0, /* U+0114d8: */
+                                                     0, /* U+0114d9: */
+                                                     0, /* U+0114da: */
+                                                     0, /* U+0114db: */
+                                                     0, /* U+0114dc: */
+                                                     0, /* U+0114dd: */
+                                                     0, /* U+0114de: */
+                                                     0, /* U+0114df: */
+                                                     0, /* U+0114e0: */
+                                                     0, /* U+0114e1: */
+                                                     0, /* U+0114e2: */
+                                                     0, /* U+0114e3: */
+                                                     0, /* U+0114e4: */
+                                                     0, /* U+0114e5: */
+                                                     0, /* U+0114e6: */
+                                                     0, /* U+0114e7: */
+                                                     0, /* U+0114e8: */
+                                                     0, /* U+0114e9: */
+                                                     0, /* U+0114ea: */
+                                                     0, /* U+0114eb: */
+                                                     0, /* U+0114ec: */
+                                                     0, /* U+0114ed: */
+                                                     0, /* U+0114ee: */
+                                                     0, /* U+0114ef: */
+                                                     0, /* U+0114f0: */
+                                                     0, /* U+0114f1: */
+                                                     0, /* U+0114f2: */
+                                                     0, /* U+0114f3: */
+                                                     0, /* U+0114f4: */
+                                                     0, /* U+0114f5: */
+                                                     0, /* U+0114f6: */
+                                                     0, /* U+0114f7: */
+                                                     0, /* U+0114f8: */
+                                                     0, /* U+0114f9: */
+                                                     0, /* U+0114fa: */
+                                                     0, /* U+0114fb: */
+                                                     0, /* U+0114fc: */
+                                                     0, /* U+0114fd: */
+                                                     0, /* U+0114fe: */
+                                                     0, /* U+0114ff: */
+                                                     0, /* U+011500: */
+                                                     0, /* U+011501: */
+                                                     0, /* U+011502: */
+                                                     0, /* U+011503: */
+                                                     0, /* U+011504: */
+                                                     0, /* U+011505: */
+                                                     0, /* U+011506: */
+                                                     0, /* U+011507: */
+                                                     0, /* U+011508: */
+                                                     0, /* U+011509: */
+                                                     0, /* U+01150a: */
+                                                     0, /* U+01150b: */
+                                                     0, /* U+01150c: */
+                                                     0, /* U+01150d: */
+                                                     0, /* U+01150e: */
+                                                     0, /* U+01150f: */
+                                                     0, /* U+011510: */
+                                                     0, /* U+011511: */
+                                                     0, /* U+011512: */
+                                                     0, /* U+011513: */
+                                                     0, /* U+011514: */
+                                                     0, /* U+011515: */
+                                                     0, /* U+011516: */
+                                                     0, /* U+011517: */
+                                                     0, /* U+011518: */
+                                                     0, /* U+011519: */
+                                                     0, /* U+01151a: */
+                                                     0, /* U+01151b: */
+                                                     0, /* U+01151c: */
+                                                     0, /* U+01151d: */
+                                                     0, /* U+01151e: */
+                                                     0, /* U+01151f: */
+                                                     0, /* U+011520: */
+                                                     0, /* U+011521: */
+                                                     0, /* U+011522: */
+                                                     0, /* U+011523: */
+                                                     0, /* U+011524: */
+                                                     0, /* U+011525: */
+                                                     0, /* U+011526: */
+                                                     0, /* U+011527: */
+                                                     0, /* U+011528: */
+                                                     0, /* U+011529: */
+                                                     0, /* U+01152a: */
+                                                     0, /* U+01152b: */
+                                                     0, /* U+01152c: */
+                                                     0, /* U+01152d: */
+                                                     0, /* U+01152e: */
+                                                     0, /* U+01152f: */
+                                                     0, /* U+011530: */
+                                                     0, /* U+011531: */
+                                                     0, /* U+011532: */
+                                                     0, /* U+011533: */
+                                                     0, /* U+011534: */
+                                                     0, /* U+011535: */
+                                                     0, /* U+011536: */
+                                                     0, /* U+011537: */
+                                                     0, /* U+011538: */
+                                                     0, /* U+011539: */
+                                                     0, /* U+01153a: */
+                                                     0, /* U+01153b: */
+                                                     0, /* U+01153c: */
+                                                     0, /* U+01153d: */
+                                                     0, /* U+01153e: */
+                                                     0, /* U+01153f: */
+                                                     0, /* U+011540: */
+                                                     0, /* U+011541: */
+                                                     0, /* U+011542: */
+                                                     0, /* U+011543: */
+                                                     0, /* U+011544: */
+                                                     0, /* U+011545: */
+                                                     0, /* U+011546: */
+                                                     0, /* U+011547: */
+                                                     0, /* U+011548: */
+                                                     0, /* U+011549: */
+                                                     0, /* U+01154a: */
+                                                     0, /* U+01154b: */
+                                                     0, /* U+01154c: */
+                                                     0, /* U+01154d: */
+                                                     0, /* U+01154e: */
+                                                     0, /* U+01154f: */
+                                                     0, /* U+011550: */
+                                                     0, /* U+011551: */
+                                                     0, /* U+011552: */
+                                                     0, /* U+011553: */
+                                                     0, /* U+011554: */
+                                                     0, /* U+011555: */
+                                                     0, /* U+011556: */
+                                                     0, /* U+011557: */
+                                                     0, /* U+011558: */
+                                                     0, /* U+011559: */
+                                                     0, /* U+01155a: */
+                                                     0, /* U+01155b: */
+                                                     0, /* U+01155c: */
+                                                     0, /* U+01155d: */
+                                                     0, /* U+01155e: */
+                                                     0, /* U+01155f: */
+                                                     0, /* U+011560: */
+                                                     0, /* U+011561: */
+                                                     0, /* U+011562: */
+                                                     0, /* U+011563: */
+                                                     0, /* U+011564: */
+                                                     0, /* U+011565: */
+                                                     0, /* U+011566: */
+                                                     0, /* U+011567: */
+                                                     0, /* U+011568: */
+                                                     0, /* U+011569: */
+                                                     0, /* U+01156a: */
+                                                     0, /* U+01156b: */
+                                                     0, /* U+01156c: */
+                                                     0, /* U+01156d: */
+                                                     0, /* U+01156e: */
+                                                     0, /* U+01156f: */
+                                                     0, /* U+011570: */
+                                                     0, /* U+011571: */
+                                                     0, /* U+011572: */
+                                                     0, /* U+011573: */
+                                                     0, /* U+011574: */
+                                                     0, /* U+011575: */
+                                                     0, /* U+011576: */
+                                                     0, /* U+011577: */
+                                                     0, /* U+011578: */
+                                                     0, /* U+011579: */
+                                                     0, /* U+01157a: */
+                                                     0, /* U+01157b: */
+                                                     0, /* U+01157c: */
+                                                     0, /* U+01157d: */
+                                                     0, /* U+01157e: */
+                                                     0, /* U+01157f: */
+                                                     0, /* U+011580: */
+                                                     0, /* U+011581: */
+                                                     0, /* U+011582: */
+                                                     0, /* U+011583: */
+                                                     0, /* U+011584: */
+                                                     0, /* U+011585: */
+                                                     0, /* U+011586: */
+                                                     0, /* U+011587: */
+                                                     0, /* U+011588: */
+                                                     0, /* U+011589: */
+                                                     0, /* U+01158a: */
+                                                     0, /* U+01158b: */
+                                                     0, /* U+01158c: */
+                                                     0, /* U+01158d: */
+                                                     0, /* U+01158e: */
+                                                     0, /* U+01158f: */
+                                                     0, /* U+011590: */
+                                                     0, /* U+011591: */
+                                                     0, /* U+011592: */
+                                                     0, /* U+011593: */
+                                                     0, /* U+011594: */
+                                                     0, /* U+011595: */
+                                                     0, /* U+011596: */
+                                                     0, /* U+011597: */
+                                                     0, /* U+011598: */
+                                                     0, /* U+011599: */
+                                                     0, /* U+01159a: */
+                                                     0, /* U+01159b: */
+                                                     0, /* U+01159c: */
+                                                     0, /* U+01159d: */
+                                                     0, /* U+01159e: */
+                                                     0, /* U+01159f: */
+                                                     0, /* U+0115a0: */
+                                                     0, /* U+0115a1: */
+                                                     0, /* U+0115a2: */
+                                                     0, /* U+0115a3: */
+                                                     0, /* U+0115a4: */
+                                                     0, /* U+0115a5: */
+                                                     0, /* U+0115a6: */
+                                                     0, /* U+0115a7: */
+                                                     0, /* U+0115a8: */
+                                                     0, /* U+0115a9: */
+                                                     0, /* U+0115aa: */
+                                                     0, /* U+0115ab: */
+                                                     0, /* U+0115ac: */
+                                                     0, /* U+0115ad: */
+                                                     0, /* U+0115ae: */
+                                                     0, /* U+0115af: */
+                                                     0, /* U+0115b0: */
+                                                     0, /* U+0115b1: */
+                                                     0, /* U+0115b2: */
+                                                     0, /* U+0115b3: */
+                                                     0, /* U+0115b4: */
+                                                     0, /* U+0115b5: */
+                                                     0, /* U+0115b6: */
+                                                     0, /* U+0115b7: */
+                                                     0, /* U+0115b8: */
+                                                     0, /* U+0115b9: */
+                                                     0, /* U+0115ba: */
+                                                     0, /* U+0115bb: */
+                                                     0, /* U+0115bc: */
+                                                     0, /* U+0115bd: */
+                                                     0, /* U+0115be: */
+                                                     0, /* U+0115bf: */
+                                                     0, /* U+0115c0: */
+                                                     0, /* U+0115c1: */
+                                                     0, /* U+0115c2: */
+                                                     0, /* U+0115c3: */
+                                                     0, /* U+0115c4: */
+                                                     0, /* U+0115c5: */
+                                                     0, /* U+0115c6: */
+                                                     0, /* U+0115c7: */
+                                                     0, /* U+0115c8: */
+                                                     0, /* U+0115c9: */
+                                                     0, /* U+0115ca: */
+                                                     0, /* U+0115cb: */
+                                                     0, /* U+0115cc: */
+                                                     0, /* U+0115cd: */
+                                                     0, /* U+0115ce: */
+                                                     0, /* U+0115cf: */
+                                                     0, /* U+0115d0: */
+                                                     0, /* U+0115d1: */
+                                                     0, /* U+0115d2: */
+                                                     0, /* U+0115d3: */
+                                                     0, /* U+0115d4: */
+                                                     0, /* U+0115d5: */
+                                                     0, /* U+0115d6: */
+                                                     0, /* U+0115d7: */
+                                                     0, /* U+0115d8: */
+                                                     0, /* U+0115d9: */
+                                                     0, /* U+0115da: */
+                                                     0, /* U+0115db: */
+                                                     0, /* U+0115dc: */
+                                                     0, /* U+0115dd: */
+                                                     0, /* U+0115de: */
+                                                     0, /* U+0115df: */
+                                                     0, /* U+0115e0: */
+                                                     0, /* U+0115e1: */
+                                                     0, /* U+0115e2: */
+                                                     0, /* U+0115e3: */
+                                                     0, /* U+0115e4: */
+                                                     0, /* U+0115e5: */
+                                                     0, /* U+0115e6: */
+                                                     0, /* U+0115e7: */
+                                                     0, /* U+0115e8: */
+                                                     0, /* U+0115e9: */
+                                                     0, /* U+0115ea: */
+                                                     0, /* U+0115eb: */
+                                                     0, /* U+0115ec: */
+                                                     0, /* U+0115ed: */
+                                                     0, /* U+0115ee: */
+                                                     0, /* U+0115ef: */
+                                                     0, /* U+0115f0: */
+                                                     0, /* U+0115f1: */
+                                                     0, /* U+0115f2: */
+                                                     0, /* U+0115f3: */
+                                                     0, /* U+0115f4: */
+                                                     0, /* U+0115f5: */
+                                                     0, /* U+0115f6: */
+                                                     0, /* U+0115f7: */
+                                                     0, /* U+0115f8: */
+                                                     0, /* U+0115f9: */
+                                                     0, /* U+0115fa: */
+                                                     0, /* U+0115fb: */
+                                                     0, /* U+0115fc: */
+                                                     0, /* U+0115fd: */
+                                                     0, /* U+0115fe: */
+                                                     0, /* U+0115ff: */
+                                                     0, /* U+011600: */
+                                                     0, /* U+011601: */
+                                                     0, /* U+011602: */
+                                                     0, /* U+011603: */
+                                                     0, /* U+011604: */
+                                                     0, /* U+011605: */
+                                                     0, /* U+011606: */
+                                                     0, /* U+011607: */
+                                                     0, /* U+011608: */
+                                                     0, /* U+011609: */
+                                                     0, /* U+01160a: */
+                                                     0, /* U+01160b: */
+                                                     0, /* U+01160c: */
+                                                     0, /* U+01160d: */
+                                                     0, /* U+01160e: */
+                                                     0, /* U+01160f: */
+                                                     0, /* U+011610: */
+                                                     0, /* U+011611: */
+                                                     0, /* U+011612: */
+                                                     0, /* U+011613: */
+                                                     0, /* U+011614: */
+                                                     0, /* U+011615: */
+                                                     0, /* U+011616: */
+                                                     0, /* U+011617: */
+                                                     0, /* U+011618: */
+                                                     0, /* U+011619: */
+                                                     0, /* U+01161a: */
+                                                     0, /* U+01161b: */
+                                                     0, /* U+01161c: */
+                                                     0, /* U+01161d: */
+                                                     0, /* U+01161e: */
+                                                     0, /* U+01161f: */
+                                                     0, /* U+011620: */
+                                                     0, /* U+011621: */
+                                                     0, /* U+011622: */
+                                                     0, /* U+011623: */
+                                                     0, /* U+011624: */
+                                                     0, /* U+011625: */
+                                                     0, /* U+011626: */
+                                                     0, /* U+011627: */
+                                                     0, /* U+011628: */
+                                                     0, /* U+011629: */
+                                                     0, /* U+01162a: */
+                                                     0, /* U+01162b: */
+                                                     0, /* U+01162c: */
+                                                     0, /* U+01162d: */
+                                                     0, /* U+01162e: */
+                                                     0, /* U+01162f: */
+                                                     0, /* U+011630: */
+                                                     0, /* U+011631: */
+                                                     0, /* U+011632: */
+                                                     0, /* U+011633: */
+                                                     0, /* U+011634: */
+                                                     0, /* U+011635: */
+                                                     0, /* U+011636: */
+                                                     0, /* U+011637: */
+                                                     0, /* U+011638: */
+                                                     0, /* U+011639: */
+                                                     0, /* U+01163a: */
+                                                     0, /* U+01163b: */
+                                                     0, /* U+01163c: */
+                                                     0, /* U+01163d: */
+                                                     0, /* U+01163e: */
+                                                     0, /* U+01163f: */
+                                                     0, /* U+011640: */
+                                                     0, /* U+011641: */
+                                                     0, /* U+011642: */
+                                                     0, /* U+011643: */
+                                                     0, /* U+011644: */
+                                                     0, /* U+011645: */
+                                                     0, /* U+011646: */
+                                                     0, /* U+011647: */
+                                                     0, /* U+011648: */
+                                                     0, /* U+011649: */
+                                                     0, /* U+01164a: */
+                                                     0, /* U+01164b: */
+                                                     0, /* U+01164c: */
+                                                     0, /* U+01164d: */
+                                                     0, /* U+01164e: */
+                                                     0, /* U+01164f: */
+                                                     0, /* U+011650: */
+                                                     0, /* U+011651: */
+                                                     0, /* U+011652: */
+                                                     0, /* U+011653: */
+                                                     0, /* U+011654: */
+                                                     0, /* U+011655: */
+                                                     0, /* U+011656: */
+                                                     0, /* U+011657: */
+                                                     0, /* U+011658: */
+                                                     0, /* U+011659: */
+                                                     0, /* U+01165a: */
+                                                     0, /* U+01165b: */
+                                                     0, /* U+01165c: */
+                                                     0, /* U+01165d: */
+                                                     0, /* U+01165e: */
+                                                     0, /* U+01165f: */
+                                                     0, /* U+011660: */
+                                                     0, /* U+011661: */
+                                                     0, /* U+011662: */
+                                                     0, /* U+011663: */
+                                                     0, /* U+011664: */
+                                                     0, /* U+011665: */
+                                                     0, /* U+011666: */
+                                                     0, /* U+011667: */
+                                                     0, /* U+011668: */
+                                                     0, /* U+011669: */
+                                                     0, /* U+01166a: */
+                                                     0, /* U+01166b: */
+                                                     0, /* U+01166c: */
+                                                     0, /* U+01166d: */
+                                                     0, /* U+01166e: */
+                                                     0, /* U+01166f: */
+                                                     0, /* U+011670: */
+                                                     0, /* U+011671: */
+                                                     0, /* U+011672: */
+                                                     0, /* U+011673: */
+                                                     0, /* U+011674: */
+                                                     0, /* U+011675: */
+                                                     0, /* U+011676: */
+                                                     0, /* U+011677: */
+                                                     0, /* U+011678: */
+                                                     0, /* U+011679: */
+                                                     0, /* U+01167a: */
+                                                     0, /* U+01167b: */
+                                                     0, /* U+01167c: */
+                                                     0, /* U+01167d: */
+                                                     0, /* U+01167e: */
+                                                     0, /* U+01167f: */
+                                           RTUNI_ALPHA, /* U+011680: TAKRI LETTER A*/
+                                           RTUNI_ALPHA, /* U+011681: TAKRI LETTER AA*/
+                                           RTUNI_ALPHA, /* U+011682: TAKRI LETTER I*/
+                                           RTUNI_ALPHA, /* U+011683: TAKRI LETTER II*/
+                                           RTUNI_ALPHA, /* U+011684: TAKRI LETTER U*/
+                                           RTUNI_ALPHA, /* U+011685: TAKRI LETTER UU*/
+                                           RTUNI_ALPHA, /* U+011686: TAKRI LETTER E*/
+                                           RTUNI_ALPHA, /* U+011687: TAKRI LETTER AI*/
+                                           RTUNI_ALPHA, /* U+011688: TAKRI LETTER O*/
+                                           RTUNI_ALPHA, /* U+011689: TAKRI LETTER AU*/
+                                           RTUNI_ALPHA, /* U+01168a: TAKRI LETTER KA*/
+                                           RTUNI_ALPHA, /* U+01168b: TAKRI LETTER KHA*/
+                                           RTUNI_ALPHA, /* U+01168c: TAKRI LETTER GA*/
+                                           RTUNI_ALPHA, /* U+01168d: TAKRI LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+01168e: TAKRI LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+01168f: TAKRI LETTER CA*/
+                                           RTUNI_ALPHA, /* U+011690: TAKRI LETTER CHA*/
+                                           RTUNI_ALPHA, /* U+011691: TAKRI LETTER JA*/
+                                           RTUNI_ALPHA, /* U+011692: TAKRI LETTER JHA*/
+                                           RTUNI_ALPHA, /* U+011693: TAKRI LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+011694: TAKRI LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+011695: TAKRI LETTER TTHA*/
+                                           RTUNI_ALPHA, /* U+011696: TAKRI LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+011697: TAKRI LETTER DDHA*/
+                                           RTUNI_ALPHA, /* U+011698: TAKRI LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+011699: TAKRI LETTER TA*/
+                                           RTUNI_ALPHA, /* U+01169a: TAKRI LETTER THA*/
+                                           RTUNI_ALPHA, /* U+01169b: TAKRI LETTER DA*/
+                                           RTUNI_ALPHA, /* U+01169c: TAKRI LETTER DHA*/
+                                           RTUNI_ALPHA, /* U+01169d: TAKRI LETTER NA*/
+                                           RTUNI_ALPHA, /* U+01169e: TAKRI LETTER PA*/
+                                           RTUNI_ALPHA, /* U+01169f: TAKRI LETTER PHA*/
+                                           RTUNI_ALPHA, /* U+0116a0: TAKRI LETTER BA*/
+                                           RTUNI_ALPHA, /* U+0116a1: TAKRI LETTER BHA*/
+                                           RTUNI_ALPHA, /* U+0116a2: TAKRI LETTER MA*/
+                                           RTUNI_ALPHA, /* U+0116a3: TAKRI LETTER YA*/
+                                           RTUNI_ALPHA, /* U+0116a4: TAKRI LETTER RA*/
+                                           RTUNI_ALPHA, /* U+0116a5: TAKRI LETTER LA*/
+                                           RTUNI_ALPHA, /* U+0116a6: TAKRI LETTER VA*/
+                                           RTUNI_ALPHA, /* U+0116a7: TAKRI LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+0116a8: TAKRI LETTER SA*/
+                                           RTUNI_ALPHA, /* U+0116a9: TAKRI LETTER HA*/
+                                           RTUNI_ALPHA, /* U+0116aa: TAKRI LETTER RRA*/
+                                           RTUNI_ALPHA, /* U+0116ab: TAKRI SIGN ANUSVARA*/
+                                           RTUNI_ALPHA, /* U+0116ac: TAKRI SIGN VISARGA*/
+                                           RTUNI_ALPHA, /* U+0116ad: TAKRI VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+0116ae: TAKRI VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+0116af: TAKRI VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+0116b0: TAKRI VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+0116b1: TAKRI VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+0116b2: TAKRI VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+0116b3: TAKRI VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+0116b4: TAKRI VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+0116b5: TAKRI VOWEL SIGN AU*/
+                                                     0, /* U+0116b6: TAKRI SIGN VIRAMA*/
+                                                     0, /* U+0116b7: TAKRI SIGN NUKTA*/
+                                                     0, /* U+0116b8: */
+                                                     0, /* U+0116b9: */
+                                                     0, /* U+0116ba: */
+                                                     0, /* U+0116bb: */
+                                                     0, /* U+0116bc: */
+                                                     0, /* U+0116bd: */
+                                                     0, /* U+0116be: */
+                                                     0, /* U+0116bf: */
+                                          RTUNI_DDIGIT, /* U+0116c0: TAKRI DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+0116c1: TAKRI DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+0116c2: TAKRI DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+0116c3: TAKRI DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+0116c4: TAKRI DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+0116c5: TAKRI DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+0116c6: TAKRI DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+0116c7: TAKRI DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+0116c8: TAKRI DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+0116c9: TAKRI DIGIT NINE*/
+                                                     0, /* U+0116ca: */
+                                                     0, /* U+0116cb: */
+                                                     0, /* U+0116cc: */
+                                                     0, /* U+0116cd: */
+                                                     0, /* U+0116ce: */
+                                                     0, /* U+0116cf: */
+                                                     0, /* U+0116d0: */
+                                                     0, /* U+0116d1: */
+                                                     0, /* U+0116d2: */
+                                                     0, /* U+0116d3: */
+                                                     0, /* U+0116d4: */
+                                                     0, /* U+0116d5: */
+                                                     0, /* U+0116d6: */
+                                                     0, /* U+0116d7: */
+                                                     0, /* U+0116d8: */
+                                                     0, /* U+0116d9: */
+                                                     0, /* U+0116da: */
+                                                     0, /* U+0116db: */
+                                                     0, /* U+0116dc: */
+                                                     0, /* U+0116dd: */
+                                                     0, /* U+0116de: */
+                                                     0, /* U+0116df: */
+                                                     0, /* U+0116e0: */
+                                                     0, /* U+0116e1: */
+                                                     0, /* U+0116e2: */
+                                                     0, /* U+0116e3: */
+                                                     0, /* U+0116e4: */
+                                                     0, /* U+0116e5: */
+                                                     0, /* U+0116e6: */
+                                                     0, /* U+0116e7: */
+                                                     0, /* U+0116e8: */
+                                                     0, /* U+0116e9: */
+                                                     0, /* U+0116ea: */
+                                                     0, /* U+0116eb: */
+                                                     0, /* U+0116ec: */
+                                                     0, /* U+0116ed: */
+                                                     0, /* U+0116ee: */
+                                                     0, /* U+0116ef: */
+                                                     0, /* U+0116f0: */
+                                                     0, /* U+0116f1: */
+                                                     0, /* U+0116f2: */
+                                                     0, /* U+0116f3: */
+                                                     0, /* U+0116f4: */
+                                                     0, /* U+0116f5: */
+                                                     0, /* U+0116f6: */
+                                                     0, /* U+0116f7: */
+                                                     0, /* U+0116f8: */
+                                                     0, /* U+0116f9: */
+                                                     0, /* U+0116fa: */
+                                                     0, /* U+0116fb: */
+                                                     0, /* U+0116fc: */
+                                                     0, /* U+0116fd: */
+                                                     0, /* U+0116fe: */
+                                                     0, /* U+0116ff: */
+                                                     0, /* U+011700: */
+                                                     0, /* U+011701: */
+                                                     0, /* U+011702: */
+                                                     0, /* U+011703: */
+                                                     0, /* U+011704: */
+                                                     0, /* U+011705: */
+                                                     0, /* U+011706: */
+                                                     0, /* U+011707: */
+                                                     0, /* U+011708: */
+                                                     0, /* U+011709: */
+                                                     0, /* U+01170a: */
+                                                     0, /* U+01170b: */
+                                                     0, /* U+01170c: */
+                                                     0, /* U+01170d: */
+                                                     0, /* U+01170e: */
+                                                     0, /* U+01170f: */
+                                                     0, /* U+011710: */
+                                                     0, /* U+011711: */
+                                                     0, /* U+011712: */
+                                                     0, /* U+011713: */
+                                                     0, /* U+011714: */
+                                                     0, /* U+011715: */
+                                                     0, /* U+011716: */
+                                                     0, /* U+011717: */
+                                                     0, /* U+011718: */
+                                                     0, /* U+011719: */
+                                                     0, /* U+01171a: */
+                                                     0, /* U+01171b: */
+                                                     0, /* U+01171c: */
+                                                     0, /* U+01171d: */
+                                                     0, /* U+01171e: */
+                                                     0, /* U+01171f: */
+                                                     0, /* U+011720: */
+                                                     0, /* U+011721: */
+                                                     0, /* U+011722: */
+                                                     0, /* U+011723: */
+                                                     0, /* U+011724: */
+                                                     0, /* U+011725: */
+                                                     0, /* U+011726: */
+                                                     0, /* U+011727: */
+                                                     0, /* U+011728: */
+                                                     0, /* U+011729: */
+                                                     0, /* U+01172a: */
+                                                     0, /* U+01172b: */
+                                                     0, /* U+01172c: */
+                                                     0, /* U+01172d: */
+                                                     0, /* U+01172e: */
+                                                     0, /* U+01172f: */
+                                                     0, /* U+011730: */
+                                                     0, /* U+011731: */
+                                                     0, /* U+011732: */
+                                                     0, /* U+011733: */
+                                                     0, /* U+011734: */
+                                                     0, /* U+011735: */
+                                                     0, /* U+011736: */
+                                                     0, /* U+011737: */
+                                                     0, /* U+011738: */
+                                                     0, /* U+011739: */
+                                                     0, /* U+01173a: */
+                                                     0, /* U+01173b: */
+                                                     0, /* U+01173c: */
+                                                     0, /* U+01173d: */
+                                                     0, /* U+01173e: */
+                                                     0, /* U+01173f: */
+                                                     0, /* U+011740: */
+                                                     0, /* U+011741: */
+                                                     0, /* U+011742: */
+                                                     0, /* U+011743: */
+                                                     0, /* U+011744: */
+                                                     0, /* U+011745: */
+                                                     0, /* U+011746: */
+                                                     0, /* U+011747: */
+                                                     0, /* U+011748: */
+                                                     0, /* U+011749: */
+                                                     0, /* U+01174a: */
+                                                     0, /* U+01174b: */
+                                                     0, /* U+01174c: */
+                                                     0, /* U+01174d: */
+                                                     0, /* U+01174e: */
+                                                     0, /* U+01174f: */
+                                                     0, /* U+011750: */
+                                                     0, /* U+011751: */
+                                                     0, /* U+011752: */
+                                                     0, /* U+011753: */
+                                                     0, /* U+011754: */
+                                                     0, /* U+011755: */
+                                                     0, /* U+011756: */
+                                                     0, /* U+011757: */
+                                                     0, /* U+011758: */
+                                                     0, /* U+011759: */
+                                                     0, /* U+01175a: */
+                                                     0, /* U+01175b: */
+                                                     0, /* U+01175c: */
+                                                     0, /* U+01175d: */
+                                                     0, /* U+01175e: */
+                                                     0, /* U+01175f: */
+                                                     0, /* U+011760: */
+                                                     0, /* U+011761: */
+                                                     0, /* U+011762: */
+                                                     0, /* U+011763: */
+                                                     0, /* U+011764: */
+                                                     0, /* U+011765: */
+                                                     0, /* U+011766: */
+                                                     0, /* U+011767: */
+                                                     0, /* U+011768: */
+                                                     0, /* U+011769: */
+                                                     0, /* U+01176a: */
+                                                     0, /* U+01176b: */
+                                                     0, /* U+01176c: */
+                                                     0, /* U+01176d: */
+                                                     0, /* U+01176e: */
+                                                     0, /* U+01176f: */
+                                                     0, /* U+011770: */
+                                                     0, /* U+011771: */
+                                                     0, /* U+011772: */
+                                                     0, /* U+011773: */
+                                                     0, /* U+011774: */
+                                                     0, /* U+011775: */
+                                                     0, /* U+011776: */
+                                                     0, /* U+011777: */
+                                                     0, /* U+011778: */
+                                                     0, /* U+011779: */
+                                                     0, /* U+01177a: */
+                                                     0, /* U+01177b: */
+                                                     0, /* U+01177c: */
+                                                     0, /* U+01177d: */
+                                                     0, /* U+01177e: */
+                                                     0, /* U+01177f: */
+                                                     0, /* U+011780: */
+                                                     0, /* U+011781: */
+                                                     0, /* U+011782: */
+                                                     0, /* U+011783: */
+                                                     0, /* U+011784: */
+                                                     0, /* U+011785: */
+                                                     0, /* U+011786: */
+                                                     0, /* U+011787: */
+                                                     0, /* U+011788: */
+                                                     0, /* U+011789: */
+                                                     0, /* U+01178a: */
+                                                     0, /* U+01178b: */
+                                                     0, /* U+01178c: */
+                                                     0, /* U+01178d: */
+                                                     0, /* U+01178e: */
+                                                     0, /* U+01178f: */
+                                                     0, /* U+011790: */
+                                                     0, /* U+011791: */
+                                                     0, /* U+011792: */
+                                                     0, /* U+011793: */
+                                                     0, /* U+011794: */
+                                                     0, /* U+011795: */
+                                                     0, /* U+011796: */
+                                                     0, /* U+011797: */
+                                                     0, /* U+011798: */
+                                                     0, /* U+011799: */
+                                                     0, /* U+01179a: */
+                                                     0, /* U+01179b: */
+                                                     0, /* U+01179c: */
+                                                     0, /* U+01179d: */
+                                                     0, /* U+01179e: */
+                                                     0, /* U+01179f: */
+                                                     0, /* U+0117a0: */
+                                                     0, /* U+0117a1: */
+                                                     0, /* U+0117a2: */
+                                                     0, /* U+0117a3: */
+                                                     0, /* U+0117a4: */
+                                                     0, /* U+0117a5: */
+                                                     0, /* U+0117a6: */
+                                                     0, /* U+0117a7: */
+                                                     0, /* U+0117a8: */
+                                                     0, /* U+0117a9: */
+                                                     0, /* U+0117aa: */
+                                                     0, /* U+0117ab: */
+                                                     0, /* U+0117ac: */
+                                                     0, /* U+0117ad: */
+                                                     0, /* U+0117ae: */
+                                                     0, /* U+0117af: */
+                                                     0, /* U+0117b0: */
+                                                     0, /* U+0117b1: */
+                                                     0, /* U+0117b2: */
+                                                     0, /* U+0117b3: */
+                                                     0, /* U+0117b4: */
+                                                     0, /* U+0117b5: */
+                                                     0, /* U+0117b6: */
+                                                     0, /* U+0117b7: */
+                                                     0, /* U+0117b8: */
+                                                     0, /* U+0117b9: */
+                                                     0, /* U+0117ba: */
+                                                     0, /* U+0117bb: */
+                                                     0, /* U+0117bc: */
+                                                     0, /* U+0117bd: */
+                                                     0, /* U+0117be: */
+                                                     0, /* U+0117bf: */
+                                                     0, /* U+0117c0: */
+                                                     0, /* U+0117c1: */
+                                                     0, /* U+0117c2: */
+                                                     0, /* U+0117c3: */
+                                                     0, /* U+0117c4: */
+                                                     0, /* U+0117c5: */
+                                                     0, /* U+0117c6: */
+                                                     0, /* U+0117c7: */
+                                                     0, /* U+0117c8: */
+                                                     0, /* U+0117c9: */
+                                                     0, /* U+0117ca: */
+                                                     0, /* U+0117cb: */
+                                                     0, /* U+0117cc: */
+                                                     0, /* U+0117cd: */
+                                                     0, /* U+0117ce: */
+                                                     0, /* U+0117cf: */
+                                                     0, /* U+0117d0: */
+                                                     0, /* U+0117d1: */
+                                                     0, /* U+0117d2: */
+                                                     0, /* U+0117d3: */
+                                                     0, /* U+0117d4: */
+                                                     0, /* U+0117d5: */
+                                                     0, /* U+0117d6: */
+                                                     0, /* U+0117d7: */
+                                                     0, /* U+0117d8: */
+                                                     0, /* U+0117d9: */
+                                                     0, /* U+0117da: */
+                                                     0, /* U+0117db: */
+                                                     0, /* U+0117dc: */
+                                                     0, /* U+0117dd: */
+                                                     0, /* U+0117de: */
+                                                     0, /* U+0117df: */
+                                                     0, /* U+0117e0: */
+                                                     0, /* U+0117e1: */
+                                                     0, /* U+0117e2: */
+                                                     0, /* U+0117e3: */
+                                                     0, /* U+0117e4: */
+                                                     0, /* U+0117e5: */
+                                                     0, /* U+0117e6: */
+                                                     0, /* U+0117e7: */
+                                                     0, /* U+0117e8: */
+                                                     0, /* U+0117e9: */
+                                                     0, /* U+0117ea: */
+                                                     0, /* U+0117eb: */
+                                                     0, /* U+0117ec: */
+                                                     0, /* U+0117ed: */
+                                                     0, /* U+0117ee: */
+                                                     0, /* U+0117ef: */
+                                                     0, /* U+0117f0: */
+                                                     0, /* U+0117f1: */
+                                                     0, /* U+0117f2: */
+                                                     0, /* U+0117f3: */
+                                                     0, /* U+0117f4: */
+                                                     0, /* U+0117f5: */
+                                                     0, /* U+0117f6: */
+                                                     0, /* U+0117f7: */
+                                                     0, /* U+0117f8: */
+                                                     0, /* U+0117f9: */
+                                                     0, /* U+0117fa: */
+                                                     0, /* U+0117fb: */
+                                                     0, /* U+0117fc: */
+                                                     0, /* U+0117fd: */
+                                                     0, /* U+0117fe: */
+                                                     0, /* U+0117ff: */
+                                                     0, /* U+011800: */
+                                                     0, /* U+011801: */
+                                                     0, /* U+011802: */
+                                                     0, /* U+011803: */
+                                                     0, /* U+011804: */
+                                                     0, /* U+011805: */
+                                                     0, /* U+011806: */
+                                                     0, /* U+011807: */
+                                                     0, /* U+011808: */
+                                                     0, /* U+011809: */
+                                                     0, /* U+01180a: */
+                                                     0, /* U+01180b: */
+                                                     0, /* U+01180c: */
+                                                     0, /* U+01180d: */
+                                                     0, /* U+01180e: */
+                                                     0, /* U+01180f: */
+                                                     0, /* U+011810: */
+                                                     0, /* U+011811: */
+                                                     0, /* U+011812: */
+                                                     0, /* U+011813: */
+                                                     0, /* U+011814: */
+                                                     0, /* U+011815: */
+                                                     0, /* U+011816: */
+                                                     0, /* U+011817: */
+                                                     0, /* U+011818: */
+                                                     0, /* U+011819: */
+                                                     0, /* U+01181a: */
+                                                     0, /* U+01181b: */
+                                                     0, /* U+01181c: */
+                                                     0, /* U+01181d: */
+                                                     0, /* U+01181e: */
+                                                     0, /* U+01181f: */
+                                                     0, /* U+011820: */
+                                                     0, /* U+011821: */
+                                                     0, /* U+011822: */
+                                                     0, /* U+011823: */
+                                                     0, /* U+011824: */
+                                                     0, /* U+011825: */
+                                                     0, /* U+011826: */
+                                                     0, /* U+011827: */
+                                                     0, /* U+011828: */
+                                                     0, /* U+011829: */
+                                                     0, /* U+01182a: */
+                                                     0, /* U+01182b: */
+                                                     0, /* U+01182c: */
+                                                     0, /* U+01182d: */
+                                                     0, /* U+01182e: */
+                                                     0, /* U+01182f: */
+                                                     0, /* U+011830: */
+                                                     0, /* U+011831: */
+                                                     0, /* U+011832: */
+                                                     0, /* U+011833: */
+                                                     0, /* U+011834: */
+                                                     0, /* U+011835: */
+                                                     0, /* U+011836: */
+                                                     0, /* U+011837: */
+                                                     0, /* U+011838: */
+                                                     0, /* U+011839: */
+                                                     0, /* U+01183a: */
+                                                     0, /* U+01183b: */
+                                                     0, /* U+01183c: */
+                                                     0, /* U+01183d: */
+                                                     0, /* U+01183e: */
+                                                     0, /* U+01183f: */
+                                                     0, /* U+011840: */
+                                                     0, /* U+011841: */
+                                                     0, /* U+011842: */
+                                                     0, /* U+011843: */
+                                                     0, /* U+011844: */
+                                                     0, /* U+011845: */
+                                                     0, /* U+011846: */
+                                                     0, /* U+011847: */
+                                                     0, /* U+011848: */
+                                                     0, /* U+011849: */
+                                                     0, /* U+01184a: */
+                                                     0, /* U+01184b: */
+                                                     0, /* U+01184c: */
+                                                     0, /* U+01184d: */
+                                                     0, /* U+01184e: */
+                                                     0, /* U+01184f: */
+                                                     0, /* U+011850: */
+                                                     0, /* U+011851: */
+                                                     0, /* U+011852: */
+                                                     0, /* U+011853: */
+                                                     0, /* U+011854: */
+                                                     0, /* U+011855: */
+                                                     0, /* U+011856: */
+                                                     0, /* U+011857: */
+                                                     0, /* U+011858: */
+                                                     0, /* U+011859: */
+                                                     0, /* U+01185a: */
+                                                     0, /* U+01185b: */
+                                                     0, /* U+01185c: */
+                                                     0, /* U+01185d: */
+                                                     0, /* U+01185e: */
+                                                     0, /* U+01185f: */
+                                                     0, /* U+011860: */
+                                                     0, /* U+011861: */
+                                                     0, /* U+011862: */
+                                                     0, /* U+011863: */
+                                                     0, /* U+011864: */
+                                                     0, /* U+011865: */
+                                                     0, /* U+011866: */
+                                                     0, /* U+011867: */
+                                                     0, /* U+011868: */
+                                                     0, /* U+011869: */
+                                                     0, /* U+01186a: */
+                                                     0, /* U+01186b: */
+                                                     0, /* U+01186c: */
+                                                     0, /* U+01186d: */
+                                                     0, /* U+01186e: */
+                                                     0, /* U+01186f: */
+                                                     0, /* U+011870: */
+                                                     0, /* U+011871: */
+                                                     0, /* U+011872: */
+                                                     0, /* U+011873: */
+                                                     0, /* U+011874: */
+                                                     0, /* U+011875: */
+                                                     0, /* U+011876: */
+                                                     0, /* U+011877: */
+                                                     0, /* U+011878: */
+                                                     0, /* U+011879: */
+                                                     0, /* U+01187a: */
+                                                     0, /* U+01187b: */
+                                                     0, /* U+01187c: */
+                                                     0, /* U+01187d: */
+                                                     0, /* U+01187e: */
+                                                     0, /* U+01187f: */
+                                                     0, /* U+011880: */
+                                                     0, /* U+011881: */
+                                                     0, /* U+011882: */
+                                                     0, /* U+011883: */
+                                                     0, /* U+011884: */
+                                                     0, /* U+011885: */
+                                                     0, /* U+011886: */
+                                                     0, /* U+011887: */
+                                                     0, /* U+011888: */
+                                                     0, /* U+011889: */
+                                                     0, /* U+01188a: */
+                                                     0, /* U+01188b: */
+                                                     0, /* U+01188c: */
+                                                     0, /* U+01188d: */
+                                                     0, /* U+01188e: */
+                                                     0, /* U+01188f: */
+                                                     0, /* U+011890: */
+                                                     0, /* U+011891: */
+                                                     0, /* U+011892: */
+                                                     0, /* U+011893: */
+                                                     0, /* U+011894: */
+                                                     0, /* U+011895: */
+                                                     0, /* U+011896: */
+                                                     0, /* U+011897: */
+                                                     0, /* U+011898: */
+                                                     0, /* U+011899: */
+                                                     0, /* U+01189a: */
+                                                     0, /* U+01189b: */
+                                                     0, /* U+01189c: */
+                                                     0, /* U+01189d: */
+                                                     0, /* U+01189e: */
+                                                     0, /* U+01189f: */
+                                                     0, /* U+0118a0: */
+                                                     0, /* U+0118a1: */
+                                                     0, /* U+0118a2: */
+                                                     0, /* U+0118a3: */
+                                                     0, /* U+0118a4: */
+                                                     0, /* U+0118a5: */
+                                                     0, /* U+0118a6: */
+                                                     0, /* U+0118a7: */
+                                                     0, /* U+0118a8: */
+                                                     0, /* U+0118a9: */
+                                                     0, /* U+0118aa: */
+                                                     0, /* U+0118ab: */
+                                                     0, /* U+0118ac: */
+                                                     0, /* U+0118ad: */
+                                                     0, /* U+0118ae: */
+                                                     0, /* U+0118af: */
+                                                     0, /* U+0118b0: */
+                                                     0, /* U+0118b1: */
+                                                     0, /* U+0118b2: */
+                                                     0, /* U+0118b3: */
+                                                     0, /* U+0118b4: */
+                                                     0, /* U+0118b5: */
+                                                     0, /* U+0118b6: */
+                                                     0, /* U+0118b7: */
+                                                     0, /* U+0118b8: */
+                                                     0, /* U+0118b9: */
+                                                     0, /* U+0118ba: */
+                                                     0, /* U+0118bb: */
+                                                     0, /* U+0118bc: */
+                                                     0, /* U+0118bd: */
+                                                     0, /* U+0118be: */
+                                                     0, /* U+0118bf: */
+                                                     0, /* U+0118c0: */
+                                                     0, /* U+0118c1: */
+                                                     0, /* U+0118c2: */
+                                                     0, /* U+0118c3: */
+                                                     0, /* U+0118c4: */
+                                                     0, /* U+0118c5: */
+                                                     0, /* U+0118c6: */
+                                                     0, /* U+0118c7: */
+                                                     0, /* U+0118c8: */
+                                                     0, /* U+0118c9: */
+                                                     0, /* U+0118ca: */
+                                                     0, /* U+0118cb: */
+                                                     0, /* U+0118cc: */
+                                                     0, /* U+0118cd: */
+                                                     0, /* U+0118ce: */
+                                                     0, /* U+0118cf: */
+                                                     0, /* U+0118d0: */
+                                                     0, /* U+0118d1: */
+                                                     0, /* U+0118d2: */
+                                                     0, /* U+0118d3: */
+                                                     0, /* U+0118d4: */
+                                                     0, /* U+0118d5: */
+                                                     0, /* U+0118d6: */
+                                                     0, /* U+0118d7: */
+                                                     0, /* U+0118d8: */
+                                                     0, /* U+0118d9: */
+                                                     0, /* U+0118da: */
+                                                     0, /* U+0118db: */
+                                                     0, /* U+0118dc: */
+                                                     0, /* U+0118dd: */
+                                                     0, /* U+0118de: */
+                                                     0, /* U+0118df: */
+                                                     0, /* U+0118e0: */
+                                                     0, /* U+0118e1: */
+                                                     0, /* U+0118e2: */
+                                                     0, /* U+0118e3: */
+                                                     0, /* U+0118e4: */
+                                                     0, /* U+0118e5: */
+                                                     0, /* U+0118e6: */
+                                                     0, /* U+0118e7: */
+                                                     0, /* U+0118e8: */
+                                                     0, /* U+0118e9: */
+                                                     0, /* U+0118ea: */
+                                                     0, /* U+0118eb: */
+                                                     0, /* U+0118ec: */
+                                                     0, /* U+0118ed: */
+                                                     0, /* U+0118ee: */
+                                                     0, /* U+0118ef: */
+                                                     0, /* U+0118f0: */
+                                                     0, /* U+0118f1: */
+                                                     0, /* U+0118f2: */
+                                                     0, /* U+0118f3: */
+                                                     0, /* U+0118f4: */
+                                                     0, /* U+0118f5: */
+                                                     0, /* U+0118f6: */
+                                                     0, /* U+0118f7: */
+                                                     0, /* U+0118f8: */
+                                                     0, /* U+0118f9: */
+                                                     0, /* U+0118fa: */
+                                                     0, /* U+0118fb: */
+                                                     0, /* U+0118fc: */
+                                                     0, /* U+0118fd: */
+                                                     0, /* U+0118fe: */
+                                                     0, /* U+0118ff: */
+                                                     0, /* U+011900: */
+                                                     0, /* U+011901: */
+                                                     0, /* U+011902: */
+                                                     0, /* U+011903: */
+                                                     0, /* U+011904: */
+                                                     0, /* U+011905: */
+                                                     0, /* U+011906: */
+                                                     0, /* U+011907: */
+                                                     0, /* U+011908: */
+                                                     0, /* U+011909: */
+                                                     0, /* U+01190a: */
+                                                     0, /* U+01190b: */
+                                                     0, /* U+01190c: */
+                                                     0, /* U+01190d: */
+                                                     0, /* U+01190e: */
+                                                     0, /* U+01190f: */
+                                                     0, /* U+011910: */
+                                                     0, /* U+011911: */
+                                                     0, /* U+011912: */
+                                                     0, /* U+011913: */
+                                                     0, /* U+011914: */
+                                                     0, /* U+011915: */
+                                                     0, /* U+011916: */
+                                                     0, /* U+011917: */
+                                                     0, /* U+011918: */
+                                                     0, /* U+011919: */
+                                                     0, /* U+01191a: */
+                                                     0, /* U+01191b: */
+                                                     0, /* U+01191c: */
+                                                     0, /* U+01191d: */
+                                                     0, /* U+01191e: */
+                                                     0, /* U+01191f: */
+                                                     0, /* U+011920: */
+                                                     0, /* U+011921: */
+                                                     0, /* U+011922: */
+                                                     0, /* U+011923: */
+                                                     0, /* U+011924: */
+                                                     0, /* U+011925: */
+                                                     0, /* U+011926: */
+                                                     0, /* U+011927: */
+                                                     0, /* U+011928: */
+                                                     0, /* U+011929: */
+                                                     0, /* U+01192a: */
+                                                     0, /* U+01192b: */
+                                                     0, /* U+01192c: */
+                                                     0, /* U+01192d: */
+                                                     0, /* U+01192e: */
+                                                     0, /* U+01192f: */
+                                                     0, /* U+011930: */
+                                                     0, /* U+011931: */
+                                                     0, /* U+011932: */
+                                                     0, /* U+011933: */
+                                                     0, /* U+011934: */
+                                                     0, /* U+011935: */
+                                                     0, /* U+011936: */
+                                                     0, /* U+011937: */
+                                                     0, /* U+011938: */
+                                                     0, /* U+011939: */
+                                                     0, /* U+01193a: */
+                                                     0, /* U+01193b: */
+                                                     0, /* U+01193c: */
+                                                     0, /* U+01193d: */
+                                                     0, /* U+01193e: */
+                                                     0, /* U+01193f: */
+                                                     0, /* U+011940: */
+                                                     0, /* U+011941: */
+                                                     0, /* U+011942: */
+                                                     0, /* U+011943: */
+                                                     0, /* U+011944: */
+                                                     0, /* U+011945: */
+                                                     0, /* U+011946: */
+                                                     0, /* U+011947: */
+                                                     0, /* U+011948: */
+                                                     0, /* U+011949: */
+                                                     0, /* U+01194a: */
+                                                     0, /* U+01194b: */
+                                                     0, /* U+01194c: */
+                                                     0, /* U+01194d: */
+                                                     0, /* U+01194e: */
+                                                     0, /* U+01194f: */
+                                                     0, /* U+011950: */
+                                                     0, /* U+011951: */
+                                                     0, /* U+011952: */
+                                                     0, /* U+011953: */
+                                                     0, /* U+011954: */
+                                                     0, /* U+011955: */
+                                                     0, /* U+011956: */
+                                                     0, /* U+011957: */
+                                                     0, /* U+011958: */
+                                                     0, /* U+011959: */
+                                                     0, /* U+01195a: */
+                                                     0, /* U+01195b: */
+                                                     0, /* U+01195c: */
+                                                     0, /* U+01195d: */
+                                                     0, /* U+01195e: */
+                                                     0, /* U+01195f: */
+                                                     0, /* U+011960: */
+                                                     0, /* U+011961: */
+                                                     0, /* U+011962: */
+                                                     0, /* U+011963: */
+                                                     0, /* U+011964: */
+                                                     0, /* U+011965: */
+                                                     0, /* U+011966: */
+                                                     0, /* U+011967: */
+                                                     0, /* U+011968: */
+                                                     0, /* U+011969: */
+                                                     0, /* U+01196a: */
+                                                     0, /* U+01196b: */
+                                                     0, /* U+01196c: */
+                                                     0, /* U+01196d: */
+                                                     0, /* U+01196e: */
+                                                     0, /* U+01196f: */
+                                                     0, /* U+011970: */
+                                                     0, /* U+011971: */
+                                                     0, /* U+011972: */
+                                                     0, /* U+011973: */
+                                                     0, /* U+011974: */
+                                                     0, /* U+011975: */
+                                                     0, /* U+011976: */
+                                                     0, /* U+011977: */
+                                                     0, /* U+011978: */
+                                                     0, /* U+011979: */
+                                                     0, /* U+01197a: */
+                                                     0, /* U+01197b: */
+                                                     0, /* U+01197c: */
+                                                     0, /* U+01197d: */
+                                                     0, /* U+01197e: */
+                                                     0, /* U+01197f: */
+                                                     0, /* U+011980: */
+                                                     0, /* U+011981: */
+                                                     0, /* U+011982: */
+                                                     0, /* U+011983: */
+                                                     0, /* U+011984: */
+                                                     0, /* U+011985: */
+                                                     0, /* U+011986: */
+                                                     0, /* U+011987: */
+                                                     0, /* U+011988: */
+                                                     0, /* U+011989: */
+                                                     0, /* U+01198a: */
+                                                     0, /* U+01198b: */
+                                                     0, /* U+01198c: */
+                                                     0, /* U+01198d: */
+                                                     0, /* U+01198e: */
+                                                     0, /* U+01198f: */
+                                                     0, /* U+011990: */
+                                                     0, /* U+011991: */
+                                                     0, /* U+011992: */
+                                                     0, /* U+011993: */
+                                                     0, /* U+011994: */
+                                                     0, /* U+011995: */
+                                                     0, /* U+011996: */
+                                                     0, /* U+011997: */
+                                                     0, /* U+011998: */
+                                                     0, /* U+011999: */
+                                                     0, /* U+01199a: */
+                                                     0, /* U+01199b: */
+                                                     0, /* U+01199c: */
+                                                     0, /* U+01199d: */
+                                                     0, /* U+01199e: */
+                                                     0, /* U+01199f: */
+                                                     0, /* U+0119a0: */
+                                                     0, /* U+0119a1: */
+                                                     0, /* U+0119a2: */
+                                                     0, /* U+0119a3: */
+                                                     0, /* U+0119a4: */
+                                                     0, /* U+0119a5: */
+                                                     0, /* U+0119a6: */
+                                                     0, /* U+0119a7: */
+                                                     0, /* U+0119a8: */
+                                                     0, /* U+0119a9: */
+                                                     0, /* U+0119aa: */
+                                                     0, /* U+0119ab: */
+                                                     0, /* U+0119ac: */
+                                                     0, /* U+0119ad: */
+                                                     0, /* U+0119ae: */
+                                                     0, /* U+0119af: */
+                                                     0, /* U+0119b0: */
+                                                     0, /* U+0119b1: */
+                                                     0, /* U+0119b2: */
+                                                     0, /* U+0119b3: */
+                                                     0, /* U+0119b4: */
+                                                     0, /* U+0119b5: */
+                                                     0, /* U+0119b6: */
+                                                     0, /* U+0119b7: */
+                                                     0, /* U+0119b8: */
+                                                     0, /* U+0119b9: */
+                                                     0, /* U+0119ba: */
+                                                     0, /* U+0119bb: */
+                                                     0, /* U+0119bc: */
+                                                     0, /* U+0119bd: */
+                                                     0, /* U+0119be: */
+                                                     0, /* U+0119bf: */
+                                                     0, /* U+0119c0: */
+                                                     0, /* U+0119c1: */
+                                                     0, /* U+0119c2: */
+                                                     0, /* U+0119c3: */
+                                                     0, /* U+0119c4: */
+                                                     0, /* U+0119c5: */
+                                                     0, /* U+0119c6: */
+                                                     0, /* U+0119c7: */
+                                                     0, /* U+0119c8: */
+                                                     0, /* U+0119c9: */
+                                                     0, /* U+0119ca: */
+                                                     0, /* U+0119cb: */
+                                                     0, /* U+0119cc: */
+                                                     0, /* U+0119cd: */
+                                                     0, /* U+0119ce: */
+                                                     0, /* U+0119cf: */
+                                                     0, /* U+0119d0: */
+                                                     0, /* U+0119d1: */
+                                                     0, /* U+0119d2: */
+                                                     0, /* U+0119d3: */
+                                                     0, /* U+0119d4: */
+                                                     0, /* U+0119d5: */
+                                                     0, /* U+0119d6: */
+                                                     0, /* U+0119d7: */
+                                                     0, /* U+0119d8: */
+                                                     0, /* U+0119d9: */
+                                                     0, /* U+0119da: */
+                                                     0, /* U+0119db: */
+                                                     0, /* U+0119dc: */
+                                                     0, /* U+0119dd: */
+                                                     0, /* U+0119de: */
+                                                     0, /* U+0119df: */
+                                                     0, /* U+0119e0: */
+                                                     0, /* U+0119e1: */
+                                                     0, /* U+0119e2: */
+                                                     0, /* U+0119e3: */
+                                                     0, /* U+0119e4: */
+                                                     0, /* U+0119e5: */
+                                                     0, /* U+0119e6: */
+                                                     0, /* U+0119e7: */
+                                                     0, /* U+0119e8: */
+                                                     0, /* U+0119e9: */
+                                                     0, /* U+0119ea: */
+                                                     0, /* U+0119eb: */
+                                                     0, /* U+0119ec: */
+                                                     0, /* U+0119ed: */
+                                                     0, /* U+0119ee: */
+                                                     0, /* U+0119ef: */
+                                                     0, /* U+0119f0: */
+                                                     0, /* U+0119f1: */
+                                                     0, /* U+0119f2: */
+                                                     0, /* U+0119f3: */
+                                                     0, /* U+0119f4: */
+                                                     0, /* U+0119f5: */
+                                                     0, /* U+0119f6: */
+                                                     0, /* U+0119f7: */
+                                                     0, /* U+0119f8: */
+                                                     0, /* U+0119f9: */
+                                                     0, /* U+0119fa: */
+                                                     0, /* U+0119fb: */
+                                                     0, /* U+0119fc: */
+                                                     0, /* U+0119fd: */
+                                                     0, /* U+0119fe: */
+                                                     0, /* U+0119ff: */
+                                                     0, /* U+011a00: */
+                                                     0, /* U+011a01: */
+                                                     0, /* U+011a02: */
+                                                     0, /* U+011a03: */
+                                                     0, /* U+011a04: */
+                                                     0, /* U+011a05: */
+                                                     0, /* U+011a06: */
+                                                     0, /* U+011a07: */
+                                                     0, /* U+011a08: */
+                                                     0, /* U+011a09: */
+                                                     0, /* U+011a0a: */
+                                                     0, /* U+011a0b: */
+                                                     0, /* U+011a0c: */
+                                                     0, /* U+011a0d: */
+                                                     0, /* U+011a0e: */
+                                                     0, /* U+011a0f: */
+                                                     0, /* U+011a10: */
+                                                     0, /* U+011a11: */
+                                                     0, /* U+011a12: */
+                                                     0, /* U+011a13: */
+                                                     0, /* U+011a14: */
+                                                     0, /* U+011a15: */
+                                                     0, /* U+011a16: */
+                                                     0, /* U+011a17: */
+                                                     0, /* U+011a18: */
+                                                     0, /* U+011a19: */
+                                                     0, /* U+011a1a: */
+                                                     0, /* U+011a1b: */
+                                                     0, /* U+011a1c: */
+                                                     0, /* U+011a1d: */
+                                                     0, /* U+011a1e: */
+                                                     0, /* U+011a1f: */
+                                                     0, /* U+011a20: */
+                                                     0, /* U+011a21: */
+                                                     0, /* U+011a22: */
+                                                     0, /* U+011a23: */
+                                                     0, /* U+011a24: */
+                                                     0, /* U+011a25: */
+                                                     0, /* U+011a26: */
+                                                     0, /* U+011a27: */
+                                                     0, /* U+011a28: */
+                                                     0, /* U+011a29: */
+                                                     0, /* U+011a2a: */
+                                                     0, /* U+011a2b: */
+                                                     0, /* U+011a2c: */
+                                                     0, /* U+011a2d: */
+                                                     0, /* U+011a2e: */
+                                                     0, /* U+011a2f: */
+                                                     0, /* U+011a30: */
+                                                     0, /* U+011a31: */
+                                                     0, /* U+011a32: */
+                                                     0, /* U+011a33: */
+                                                     0, /* U+011a34: */
+                                                     0, /* U+011a35: */
+                                                     0, /* U+011a36: */
+                                                     0, /* U+011a37: */
+                                                     0, /* U+011a38: */
+                                                     0, /* U+011a39: */
+                                                     0, /* U+011a3a: */
+                                                     0, /* U+011a3b: */
+                                                     0, /* U+011a3c: */
+                                                     0, /* U+011a3d: */
+                                                     0, /* U+011a3e: */
+                                                     0, /* U+011a3f: */
+                                                     0, /* U+011a40: */
+                                                     0, /* U+011a41: */
+                                                     0, /* U+011a42: */
+                                                     0, /* U+011a43: */
+                                                     0, /* U+011a44: */
+                                                     0, /* U+011a45: */
+                                                     0, /* U+011a46: */
+                                                     0, /* U+011a47: */
+                                                     0, /* U+011a48: */
+                                                     0, /* U+011a49: */
+                                                     0, /* U+011a4a: */
+                                                     0, /* U+011a4b: */
+                                                     0, /* U+011a4c: */
+                                                     0, /* U+011a4d: */
+                                                     0, /* U+011a4e: */
+                                                     0, /* U+011a4f: */
+                                                     0, /* U+011a50: */
+                                                     0, /* U+011a51: */
+                                                     0, /* U+011a52: */
+                                                     0, /* U+011a53: */
+                                                     0, /* U+011a54: */
+                                                     0, /* U+011a55: */
+                                                     0, /* U+011a56: */
+                                                     0, /* U+011a57: */
+                                                     0, /* U+011a58: */
+                                                     0, /* U+011a59: */
+                                                     0, /* U+011a5a: */
+                                                     0, /* U+011a5b: */
+                                                     0, /* U+011a5c: */
+                                                     0, /* U+011a5d: */
+                                                     0, /* U+011a5e: */
+                                                     0, /* U+011a5f: */
+                                                     0, /* U+011a60: */
+                                                     0, /* U+011a61: */
+                                                     0, /* U+011a62: */
+                                                     0, /* U+011a63: */
+                                                     0, /* U+011a64: */
+                                                     0, /* U+011a65: */
+                                                     0, /* U+011a66: */
+                                                     0, /* U+011a67: */
+                                                     0, /* U+011a68: */
+                                                     0, /* U+011a69: */
+                                                     0, /* U+011a6a: */
+                                                     0, /* U+011a6b: */
+                                                     0, /* U+011a6c: */
+                                                     0, /* U+011a6d: */
+                                                     0, /* U+011a6e: */
+                                                     0, /* U+011a6f: */
+                                                     0, /* U+011a70: */
+                                                     0, /* U+011a71: */
+                                                     0, /* U+011a72: */
+                                                     0, /* U+011a73: */
+                                                     0, /* U+011a74: */
+                                                     0, /* U+011a75: */
+                                                     0, /* U+011a76: */
+                                                     0, /* U+011a77: */
+                                                     0, /* U+011a78: */
+                                                     0, /* U+011a79: */
+                                                     0, /* U+011a7a: */
+                                                     0, /* U+011a7b: */
+                                                     0, /* U+011a7c: */
+                                                     0, /* U+011a7d: */
+                                                     0, /* U+011a7e: */
+                                                     0, /* U+011a7f: */
+                                                     0, /* U+011a80: */
+                                                     0, /* U+011a81: */
+                                                     0, /* U+011a82: */
+                                                     0, /* U+011a83: */
+                                                     0, /* U+011a84: */
+                                                     0, /* U+011a85: */
+                                                     0, /* U+011a86: */
+                                                     0, /* U+011a87: */
+                                                     0, /* U+011a88: */
+                                                     0, /* U+011a89: */
+                                                     0, /* U+011a8a: */
+                                                     0, /* U+011a8b: */
+                                                     0, /* U+011a8c: */
+                                                     0, /* U+011a8d: */
+                                                     0, /* U+011a8e: */
+                                                     0, /* U+011a8f: */
+                                                     0, /* U+011a90: */
+                                                     0, /* U+011a91: */
+                                                     0, /* U+011a92: */
+                                                     0, /* U+011a93: */
+                                                     0, /* U+011a94: */
+                                                     0, /* U+011a95: */
+                                                     0, /* U+011a96: */
+                                                     0, /* U+011a97: */
+                                                     0, /* U+011a98: */
+                                                     0, /* U+011a99: */
+                                                     0, /* U+011a9a: */
+                                                     0, /* U+011a9b: */
+                                                     0, /* U+011a9c: */
+                                                     0, /* U+011a9d: */
+                                                     0, /* U+011a9e: */
+                                                     0, /* U+011a9f: */
+                                                     0, /* U+011aa0: */
+                                                     0, /* U+011aa1: */
+                                                     0, /* U+011aa2: */
+                                                     0, /* U+011aa3: */
+                                                     0, /* U+011aa4: */
+                                                     0, /* U+011aa5: */
+                                                     0, /* U+011aa6: */
+                                                     0, /* U+011aa7: */
+                                                     0, /* U+011aa8: */
+                                                     0, /* U+011aa9: */
+                                                     0, /* U+011aaa: */
+                                                     0, /* U+011aab: */
+                                                     0, /* U+011aac: */
+                                                     0, /* U+011aad: */
+                                                     0, /* U+011aae: */
+                                                     0, /* U+011aaf: */
+                                                     0, /* U+011ab0: */
+                                                     0, /* U+011ab1: */
+                                                     0, /* U+011ab2: */
+                                                     0, /* U+011ab3: */
+                                                     0, /* U+011ab4: */
+                                                     0, /* U+011ab5: */
+                                                     0, /* U+011ab6: */
+                                                     0, /* U+011ab7: */
+                                                     0, /* U+011ab8: */
+                                                     0, /* U+011ab9: */
+                                                     0, /* U+011aba: */
+                                                     0, /* U+011abb: */
+                                                     0, /* U+011abc: */
+                                                     0, /* U+011abd: */
+                                                     0, /* U+011abe: */
+                                                     0, /* U+011abf: */
+                                                     0, /* U+011ac0: */
+                                                     0, /* U+011ac1: */
+                                                     0, /* U+011ac2: */
+                                                     0, /* U+011ac3: */
+                                                     0, /* U+011ac4: */
+                                                     0, /* U+011ac5: */
+                                                     0, /* U+011ac6: */
+                                                     0, /* U+011ac7: */
+                                                     0, /* U+011ac8: */
+                                                     0, /* U+011ac9: */
+                                                     0, /* U+011aca: */
+                                                     0, /* U+011acb: */
+                                                     0, /* U+011acc: */
+                                                     0, /* U+011acd: */
+                                                     0, /* U+011ace: */
+                                                     0, /* U+011acf: */
+                                                     0, /* U+011ad0: */
+                                                     0, /* U+011ad1: */
+                                                     0, /* U+011ad2: */
+                                                     0, /* U+011ad3: */
+                                                     0, /* U+011ad4: */
+                                                     0, /* U+011ad5: */
+                                                     0, /* U+011ad6: */
+                                                     0, /* U+011ad7: */
+                                                     0, /* U+011ad8: */
+                                                     0, /* U+011ad9: */
+                                                     0, /* U+011ada: */
+                                                     0, /* U+011adb: */
+                                                     0, /* U+011adc: */
+                                                     0, /* U+011add: */
+                                                     0, /* U+011ade: */
+                                                     0, /* U+011adf: */
+                                                     0, /* U+011ae0: */
+                                                     0, /* U+011ae1: */
+                                                     0, /* U+011ae2: */
+                                                     0, /* U+011ae3: */
+                                                     0, /* U+011ae4: */
+                                                     0, /* U+011ae5: */
+                                                     0, /* U+011ae6: */
+                                                     0, /* U+011ae7: */
+                                                     0, /* U+011ae8: */
+                                                     0, /* U+011ae9: */
+                                                     0, /* U+011aea: */
+                                                     0, /* U+011aeb: */
+                                                     0, /* U+011aec: */
+                                                     0, /* U+011aed: */
+                                                     0, /* U+011aee: */
+                                                     0, /* U+011aef: */
+                                                     0, /* U+011af0: */
+                                                     0, /* U+011af1: */
+                                                     0, /* U+011af2: */
+                                                     0, /* U+011af3: */
+                                                     0, /* U+011af4: */
+                                                     0, /* U+011af5: */
+                                                     0, /* U+011af6: */
+                                                     0, /* U+011af7: */
+                                                     0, /* U+011af8: */
+                                                     0, /* U+011af9: */
+                                                     0, /* U+011afa: */
+                                                     0, /* U+011afb: */
+                                                     0, /* U+011afc: */
+                                                     0, /* U+011afd: */
+                                                     0, /* U+011afe: */
+                                                     0, /* U+011aff: */
+                                                     0, /* U+011b00: */
+                                                     0, /* U+011b01: */
+                                                     0, /* U+011b02: */
+                                                     0, /* U+011b03: */
+                                                     0, /* U+011b04: */
+                                                     0, /* U+011b05: */
+                                                     0, /* U+011b06: */
+                                                     0, /* U+011b07: */
+                                                     0, /* U+011b08: */
+                                                     0, /* U+011b09: */
+                                                     0, /* U+011b0a: */
+                                                     0, /* U+011b0b: */
+                                                     0, /* U+011b0c: */
+                                                     0, /* U+011b0d: */
+                                                     0, /* U+011b0e: */
+                                                     0, /* U+011b0f: */
+                                                     0, /* U+011b10: */
+                                                     0, /* U+011b11: */
+                                                     0, /* U+011b12: */
+                                                     0, /* U+011b13: */
+                                                     0, /* U+011b14: */
+                                                     0, /* U+011b15: */
+                                                     0, /* U+011b16: */
+                                                     0, /* U+011b17: */
+                                                     0, /* U+011b18: */
+                                                     0, /* U+011b19: */
+                                                     0, /* U+011b1a: */
+                                                     0, /* U+011b1b: */
+                                                     0, /* U+011b1c: */
+                                                     0, /* U+011b1d: */
+                                                     0, /* U+011b1e: */
+                                                     0, /* U+011b1f: */
+                                                     0, /* U+011b20: */
+                                                     0, /* U+011b21: */
+                                                     0, /* U+011b22: */
+                                                     0, /* U+011b23: */
+                                                     0, /* U+011b24: */
+                                                     0, /* U+011b25: */
+                                                     0, /* U+011b26: */
+                                                     0, /* U+011b27: */
+                                                     0, /* U+011b28: */
+                                                     0, /* U+011b29: */
+                                                     0, /* U+011b2a: */
+                                                     0, /* U+011b2b: */
+                                                     0, /* U+011b2c: */
+                                                     0, /* U+011b2d: */
+                                                     0, /* U+011b2e: */
+                                                     0, /* U+011b2f: */
+                                                     0, /* U+011b30: */
+                                                     0, /* U+011b31: */
+                                                     0, /* U+011b32: */
+                                                     0, /* U+011b33: */
+                                                     0, /* U+011b34: */
+                                                     0, /* U+011b35: */
+                                                     0, /* U+011b36: */
+                                                     0, /* U+011b37: */
+                                                     0, /* U+011b38: */
+                                                     0, /* U+011b39: */
+                                                     0, /* U+011b3a: */
+                                                     0, /* U+011b3b: */
+                                                     0, /* U+011b3c: */
+                                                     0, /* U+011b3d: */
+                                                     0, /* U+011b3e: */
+                                                     0, /* U+011b3f: */
+                                                     0, /* U+011b40: */
+                                                     0, /* U+011b41: */
+                                                     0, /* U+011b42: */
+                                                     0, /* U+011b43: */
+                                                     0, /* U+011b44: */
+                                                     0, /* U+011b45: */
+                                                     0, /* U+011b46: */
+                                                     0, /* U+011b47: */
+                                                     0, /* U+011b48: */
+                                                     0, /* U+011b49: */
+                                                     0, /* U+011b4a: */
+                                                     0, /* U+011b4b: */
+                                                     0, /* U+011b4c: */
+                                                     0, /* U+011b4d: */
+                                                     0, /* U+011b4e: */
+                                                     0, /* U+011b4f: */
+                                                     0, /* U+011b50: */
+                                                     0, /* U+011b51: */
+                                                     0, /* U+011b52: */
+                                                     0, /* U+011b53: */
+                                                     0, /* U+011b54: */
+                                                     0, /* U+011b55: */
+                                                     0, /* U+011b56: */
+                                                     0, /* U+011b57: */
+                                                     0, /* U+011b58: */
+                                                     0, /* U+011b59: */
+                                                     0, /* U+011b5a: */
+                                                     0, /* U+011b5b: */
+                                                     0, /* U+011b5c: */
+                                                     0, /* U+011b5d: */
+                                                     0, /* U+011b5e: */
+                                                     0, /* U+011b5f: */
+                                                     0, /* U+011b60: */
+                                                     0, /* U+011b61: */
+                                                     0, /* U+011b62: */
+                                                     0, /* U+011b63: */
+                                                     0, /* U+011b64: */
+                                                     0, /* U+011b65: */
+                                                     0, /* U+011b66: */
+                                                     0, /* U+011b67: */
+                                                     0, /* U+011b68: */
+                                                     0, /* U+011b69: */
+                                                     0, /* U+011b6a: */
+                                                     0, /* U+011b6b: */
+                                                     0, /* U+011b6c: */
+                                                     0, /* U+011b6d: */
+                                                     0, /* U+011b6e: */
+                                                     0, /* U+011b6f: */
+                                                     0, /* U+011b70: */
+                                                     0, /* U+011b71: */
+                                                     0, /* U+011b72: */
+                                                     0, /* U+011b73: */
+                                                     0, /* U+011b74: */
+                                                     0, /* U+011b75: */
+                                                     0, /* U+011b76: */
+                                                     0, /* U+011b77: */
+                                                     0, /* U+011b78: */
+                                                     0, /* U+011b79: */
+                                                     0, /* U+011b7a: */
+                                                     0, /* U+011b7b: */
+                                                     0, /* U+011b7c: */
+                                                     0, /* U+011b7d: */
+                                                     0, /* U+011b7e: */
+                                                     0, /* U+011b7f: */
+                                                     0, /* U+011b80: */
+                                                     0, /* U+011b81: */
+                                                     0, /* U+011b82: */
+                                                     0, /* U+011b83: */
+                                                     0, /* U+011b84: */
+                                                     0, /* U+011b85: */
+                                                     0, /* U+011b86: */
+                                                     0, /* U+011b87: */
+                                                     0, /* U+011b88: */
+                                                     0, /* U+011b89: */
+                                                     0, /* U+011b8a: */
+                                                     0, /* U+011b8b: */
+                                                     0, /* U+011b8c: */
+                                                     0, /* U+011b8d: */
+                                                     0, /* U+011b8e: */
+                                                     0, /* U+011b8f: */
+                                                     0, /* U+011b90: */
+                                                     0, /* U+011b91: */
+                                                     0, /* U+011b92: */
+                                                     0, /* U+011b93: */
+                                                     0, /* U+011b94: */
+                                                     0, /* U+011b95: */
+                                                     0, /* U+011b96: */
+                                                     0, /* U+011b97: */
+                                                     0, /* U+011b98: */
+                                                     0, /* U+011b99: */
+                                                     0, /* U+011b9a: */
+                                                     0, /* U+011b9b: */
+                                                     0, /* U+011b9c: */
+                                                     0, /* U+011b9d: */
+                                                     0, /* U+011b9e: */
+                                                     0, /* U+011b9f: */
+                                                     0, /* U+011ba0: */
+                                                     0, /* U+011ba1: */
+                                                     0, /* U+011ba2: */
+                                                     0, /* U+011ba3: */
+                                                     0, /* U+011ba4: */
+                                                     0, /* U+011ba5: */
+                                                     0, /* U+011ba6: */
+                                                     0, /* U+011ba7: */
+                                                     0, /* U+011ba8: */
+                                                     0, /* U+011ba9: */
+                                                     0, /* U+011baa: */
+                                                     0, /* U+011bab: */
+                                                     0, /* U+011bac: */
+                                                     0, /* U+011bad: */
+                                                     0, /* U+011bae: */
+                                                     0, /* U+011baf: */
+                                                     0, /* U+011bb0: */
+                                                     0, /* U+011bb1: */
+                                                     0, /* U+011bb2: */
+                                                     0, /* U+011bb3: */
+                                                     0, /* U+011bb4: */
+                                                     0, /* U+011bb5: */
+                                                     0, /* U+011bb6: */
+                                                     0, /* U+011bb7: */
+                                                     0, /* U+011bb8: */
+                                                     0, /* U+011bb9: */
+                                                     0, /* U+011bba: */
+                                                     0, /* U+011bbb: */
+                                                     0, /* U+011bbc: */
+                                                     0, /* U+011bbd: */
+                                                     0, /* U+011bbe: */
+                                                     0, /* U+011bbf: */
+                                                     0, /* U+011bc0: */
+                                                     0, /* U+011bc1: */
+                                                     0, /* U+011bc2: */
+                                                     0, /* U+011bc3: */
+                                                     0, /* U+011bc4: */
+                                                     0, /* U+011bc5: */
+                                                     0, /* U+011bc6: */
+                                                     0, /* U+011bc7: */
+                                                     0, /* U+011bc8: */
+                                                     0, /* U+011bc9: */
+                                                     0, /* U+011bca: */
+                                                     0, /* U+011bcb: */
+                                                     0, /* U+011bcc: */
+                                                     0, /* U+011bcd: */
+                                                     0, /* U+011bce: */
+                                                     0, /* U+011bcf: */
+                                                     0, /* U+011bd0: */
+                                                     0, /* U+011bd1: */
+                                                     0, /* U+011bd2: */
+                                                     0, /* U+011bd3: */
+                                                     0, /* U+011bd4: */
+                                                     0, /* U+011bd5: */
+                                                     0, /* U+011bd6: */
+                                                     0, /* U+011bd7: */
+                                                     0, /* U+011bd8: */
+                                                     0, /* U+011bd9: */
+                                                     0, /* U+011bda: */
+                                                     0, /* U+011bdb: */
+                                                     0, /* U+011bdc: */
+                                                     0, /* U+011bdd: */
+                                                     0, /* U+011bde: */
+                                                     0, /* U+011bdf: */
+                                                     0, /* U+011be0: */
+                                                     0, /* U+011be1: */
+                                                     0, /* U+011be2: */
+                                                     0, /* U+011be3: */
+                                                     0, /* U+011be4: */
+                                                     0, /* U+011be5: */
+                                                     0, /* U+011be6: */
+                                                     0, /* U+011be7: */
+                                                     0, /* U+011be8: */
+                                                     0, /* U+011be9: */
+                                                     0, /* U+011bea: */
+                                                     0, /* U+011beb: */
+                                                     0, /* U+011bec: */
+                                                     0, /* U+011bed: */
+                                                     0, /* U+011bee: */
+                                                     0, /* U+011bef: */
+                                                     0, /* U+011bf0: */
+                                                     0, /* U+011bf1: */
+                                                     0, /* U+011bf2: */
+                                                     0, /* U+011bf3: */
+                                                     0, /* U+011bf4: */
+                                                     0, /* U+011bf5: */
+                                                     0, /* U+011bf6: */
+                                                     0, /* U+011bf7: */
+                                                     0, /* U+011bf8: */
+                                                     0, /* U+011bf9: */
+                                                     0, /* U+011bfa: */
+                                                     0, /* U+011bfb: */
+                                                     0, /* U+011bfc: */
+                                                     0, /* U+011bfd: */
+                                                     0, /* U+011bfe: */
+                                                     0, /* U+011bff: */
+                                                     0, /* U+011c00: */
+                                                     0, /* U+011c01: */
+                                                     0, /* U+011c02: */
+                                                     0, /* U+011c03: */
+                                                     0, /* U+011c04: */
+                                                     0, /* U+011c05: */
+                                                     0, /* U+011c06: */
+                                                     0, /* U+011c07: */
+                                                     0, /* U+011c08: */
+                                                     0, /* U+011c09: */
+                                                     0, /* U+011c0a: */
+                                                     0, /* U+011c0b: */
+                                                     0, /* U+011c0c: */
+                                                     0, /* U+011c0d: */
+                                                     0, /* U+011c0e: */
+                                                     0, /* U+011c0f: */
+                                                     0, /* U+011c10: */
+                                                     0, /* U+011c11: */
+                                                     0, /* U+011c12: */
+                                                     0, /* U+011c13: */
+                                                     0, /* U+011c14: */
+                                                     0, /* U+011c15: */
+                                                     0, /* U+011c16: */
+                                                     0, /* U+011c17: */
+                                                     0, /* U+011c18: */
+                                                     0, /* U+011c19: */
+                                                     0, /* U+011c1a: */
+                                                     0, /* U+011c1b: */
+                                                     0, /* U+011c1c: */
+                                                     0, /* U+011c1d: */
+                                                     0, /* U+011c1e: */
+                                                     0, /* U+011c1f: */
+                                                     0, /* U+011c20: */
+                                                     0, /* U+011c21: */
+                                                     0, /* U+011c22: */
+                                                     0, /* U+011c23: */
+                                                     0, /* U+011c24: */
+                                                     0, /* U+011c25: */
+                                                     0, /* U+011c26: */
+                                                     0, /* U+011c27: */
+                                                     0, /* U+011c28: */
+                                                     0, /* U+011c29: */
+                                                     0, /* U+011c2a: */
+                                                     0, /* U+011c2b: */
+                                                     0, /* U+011c2c: */
+                                                     0, /* U+011c2d: */
+                                                     0, /* U+011c2e: */
+                                                     0, /* U+011c2f: */
+                                                     0, /* U+011c30: */
+                                                     0, /* U+011c31: */
+                                                     0, /* U+011c32: */
+                                                     0, /* U+011c33: */
+                                                     0, /* U+011c34: */
+                                                     0, /* U+011c35: */
+                                                     0, /* U+011c36: */
+                                                     0, /* U+011c37: */
+                                                     0, /* U+011c38: */
+                                                     0, /* U+011c39: */
+                                                     0, /* U+011c3a: */
+                                                     0, /* U+011c3b: */
+                                                     0, /* U+011c3c: */
+                                                     0, /* U+011c3d: */
+                                                     0, /* U+011c3e: */
+                                                     0, /* U+011c3f: */
+                                                     0, /* U+011c40: */
+                                                     0, /* U+011c41: */
+                                                     0, /* U+011c42: */
+                                                     0, /* U+011c43: */
+                                                     0, /* U+011c44: */
+                                                     0, /* U+011c45: */
+                                                     0, /* U+011c46: */
+                                                     0, /* U+011c47: */
+                                                     0, /* U+011c48: */
+                                                     0, /* U+011c49: */
+                                                     0, /* U+011c4a: */
+                                                     0, /* U+011c4b: */
+                                                     0, /* U+011c4c: */
+                                                     0, /* U+011c4d: */
+                                                     0, /* U+011c4e: */
+                                                     0, /* U+011c4f: */
+                                                     0, /* U+011c50: */
+                                                     0, /* U+011c51: */
+                                                     0, /* U+011c52: */
+                                                     0, /* U+011c53: */
+                                                     0, /* U+011c54: */
+                                                     0, /* U+011c55: */
+                                                     0, /* U+011c56: */
+                                                     0, /* U+011c57: */
+                                                     0, /* U+011c58: */
+                                                     0, /* U+011c59: */
+                                                     0, /* U+011c5a: */
+                                                     0, /* U+011c5b: */
+                                                     0, /* U+011c5c: */
+                                                     0, /* U+011c5d: */
+                                                     0, /* U+011c5e: */
+                                                     0, /* U+011c5f: */
+                                                     0, /* U+011c60: */
+                                                     0, /* U+011c61: */
+                                                     0, /* U+011c62: */
+                                                     0, /* U+011c63: */
+                                                     0, /* U+011c64: */
+                                                     0, /* U+011c65: */
+                                                     0, /* U+011c66: */
+                                                     0, /* U+011c67: */
+                                                     0, /* U+011c68: */
+                                                     0, /* U+011c69: */
+                                                     0, /* U+011c6a: */
+                                                     0, /* U+011c6b: */
+                                                     0, /* U+011c6c: */
+                                                     0, /* U+011c6d: */
+                                                     0, /* U+011c6e: */
+                                                     0, /* U+011c6f: */
+                                                     0, /* U+011c70: */
+                                                     0, /* U+011c71: */
+                                                     0, /* U+011c72: */
+                                                     0, /* U+011c73: */
+                                                     0, /* U+011c74: */
+                                                     0, /* U+011c75: */
+                                                     0, /* U+011c76: */
+                                                     0, /* U+011c77: */
+                                                     0, /* U+011c78: */
+                                                     0, /* U+011c79: */
+                                                     0, /* U+011c7a: */
+                                                     0, /* U+011c7b: */
+                                                     0, /* U+011c7c: */
+                                                     0, /* U+011c7d: */
+                                                     0, /* U+011c7e: */
+                                                     0, /* U+011c7f: */
+                                                     0, /* U+011c80: */
+                                                     0, /* U+011c81: */
+                                                     0, /* U+011c82: */
+                                                     0, /* U+011c83: */
+                                                     0, /* U+011c84: */
+                                                     0, /* U+011c85: */
+                                                     0, /* U+011c86: */
+                                                     0, /* U+011c87: */
+                                                     0, /* U+011c88: */
+                                                     0, /* U+011c89: */
+                                                     0, /* U+011c8a: */
+                                                     0, /* U+011c8b: */
+                                                     0, /* U+011c8c: */
+                                                     0, /* U+011c8d: */
+                                                     0, /* U+011c8e: */
+                                                     0, /* U+011c8f: */
+                                                     0, /* U+011c90: */
+                                                     0, /* U+011c91: */
+                                                     0, /* U+011c92: */
+                                                     0, /* U+011c93: */
+                                                     0, /* U+011c94: */
+                                                     0, /* U+011c95: */
+                                                     0, /* U+011c96: */
+                                                     0, /* U+011c97: */
+                                                     0, /* U+011c98: */
+                                                     0, /* U+011c99: */
+                                                     0, /* U+011c9a: */
+                                                     0, /* U+011c9b: */
+                                                     0, /* U+011c9c: */
+                                                     0, /* U+011c9d: */
+                                                     0, /* U+011c9e: */
+                                                     0, /* U+011c9f: */
+                                                     0, /* U+011ca0: */
+                                                     0, /* U+011ca1: */
+                                                     0, /* U+011ca2: */
+                                                     0, /* U+011ca3: */
+                                                     0, /* U+011ca4: */
+                                                     0, /* U+011ca5: */
+                                                     0, /* U+011ca6: */
+                                                     0, /* U+011ca7: */
+                                                     0, /* U+011ca8: */
+                                                     0, /* U+011ca9: */
+                                                     0, /* U+011caa: */
+                                                     0, /* U+011cab: */
+                                                     0, /* U+011cac: */
+                                                     0, /* U+011cad: */
+                                                     0, /* U+011cae: */
+                                                     0, /* U+011caf: */
+                                                     0, /* U+011cb0: */
+                                                     0, /* U+011cb1: */
+                                                     0, /* U+011cb2: */
+                                                     0, /* U+011cb3: */
+                                                     0, /* U+011cb4: */
+                                                     0, /* U+011cb5: */
+                                                     0, /* U+011cb6: */
+                                                     0, /* U+011cb7: */
+                                                     0, /* U+011cb8: */
+                                                     0, /* U+011cb9: */
+                                                     0, /* U+011cba: */
+                                                     0, /* U+011cbb: */
+                                                     0, /* U+011cbc: */
+                                                     0, /* U+011cbd: */
+                                                     0, /* U+011cbe: */
+                                                     0, /* U+011cbf: */
+                                                     0, /* U+011cc0: */
+                                                     0, /* U+011cc1: */
+                                                     0, /* U+011cc2: */
+                                                     0, /* U+011cc3: */
+                                                     0, /* U+011cc4: */
+                                                     0, /* U+011cc5: */
+                                                     0, /* U+011cc6: */
+                                                     0, /* U+011cc7: */
+                                                     0, /* U+011cc8: */
+                                                     0, /* U+011cc9: */
+                                                     0, /* U+011cca: */
+                                                     0, /* U+011ccb: */
+                                                     0, /* U+011ccc: */
+                                                     0, /* U+011ccd: */
+                                                     0, /* U+011cce: */
+                                                     0, /* U+011ccf: */
+                                                     0, /* U+011cd0: */
+                                                     0, /* U+011cd1: */
+                                                     0, /* U+011cd2: */
+                                                     0, /* U+011cd3: */
+                                                     0, /* U+011cd4: */
+                                                     0, /* U+011cd5: */
+                                                     0, /* U+011cd6: */
+                                                     0, /* U+011cd7: */
+                                                     0, /* U+011cd8: */
+                                                     0, /* U+011cd9: */
+                                                     0, /* U+011cda: */
+                                                     0, /* U+011cdb: */
+                                                     0, /* U+011cdc: */
+                                                     0, /* U+011cdd: */
+                                                     0, /* U+011cde: */
+                                                     0, /* U+011cdf: */
+                                                     0, /* U+011ce0: */
+                                                     0, /* U+011ce1: */
+                                                     0, /* U+011ce2: */
+                                                     0, /* U+011ce3: */
+                                                     0, /* U+011ce4: */
+                                                     0, /* U+011ce5: */
+                                                     0, /* U+011ce6: */
+                                                     0, /* U+011ce7: */
+                                                     0, /* U+011ce8: */
+                                                     0, /* U+011ce9: */
+                                                     0, /* U+011cea: */
+                                                     0, /* U+011ceb: */
+                                                     0, /* U+011cec: */
+                                                     0, /* U+011ced: */
+                                                     0, /* U+011cee: */
+                                                     0, /* U+011cef: */
+                                                     0, /* U+011cf0: */
+                                                     0, /* U+011cf1: */
+                                                     0, /* U+011cf2: */
+                                                     0, /* U+011cf3: */
+                                                     0, /* U+011cf4: */
+                                                     0, /* U+011cf5: */
+                                                     0, /* U+011cf6: */
+                                                     0, /* U+011cf7: */
+                                                     0, /* U+011cf8: */
+                                                     0, /* U+011cf9: */
+                                                     0, /* U+011cfa: */
+                                                     0, /* U+011cfb: */
+                                                     0, /* U+011cfc: */
+                                                     0, /* U+011cfd: */
+                                                     0, /* U+011cfe: */
+                                                     0, /* U+011cff: */
+                                                     0, /* U+011d00: */
+                                                     0, /* U+011d01: */
+                                                     0, /* U+011d02: */
+                                                     0, /* U+011d03: */
+                                                     0, /* U+011d04: */
+                                                     0, /* U+011d05: */
+                                                     0, /* U+011d06: */
+                                                     0, /* U+011d07: */
+                                                     0, /* U+011d08: */
+                                                     0, /* U+011d09: */
+                                                     0, /* U+011d0a: */
+                                                     0, /* U+011d0b: */
+                                                     0, /* U+011d0c: */
+                                                     0, /* U+011d0d: */
+                                                     0, /* U+011d0e: */
+                                                     0, /* U+011d0f: */
+                                                     0, /* U+011d10: */
+                                                     0, /* U+011d11: */
+                                                     0, /* U+011d12: */
+                                                     0, /* U+011d13: */
+                                                     0, /* U+011d14: */
+                                                     0, /* U+011d15: */
+                                                     0, /* U+011d16: */
+                                                     0, /* U+011d17: */
+                                                     0, /* U+011d18: */
+                                                     0, /* U+011d19: */
+                                                     0, /* U+011d1a: */
+                                                     0, /* U+011d1b: */
+                                                     0, /* U+011d1c: */
+                                                     0, /* U+011d1d: */
+                                                     0, /* U+011d1e: */
+                                                     0, /* U+011d1f: */
+                                                     0, /* U+011d20: */
+                                                     0, /* U+011d21: */
+                                                     0, /* U+011d22: */
+                                                     0, /* U+011d23: */
+                                                     0, /* U+011d24: */
+                                                     0, /* U+011d25: */
+                                                     0, /* U+011d26: */
+                                                     0, /* U+011d27: */
+                                                     0, /* U+011d28: */
+                                                     0, /* U+011d29: */
+                                                     0, /* U+011d2a: */
+                                                     0, /* U+011d2b: */
+                                                     0, /* U+011d2c: */
+                                                     0, /* U+011d2d: */
+                                                     0, /* U+011d2e: */
+                                                     0, /* U+011d2f: */
+                                                     0, /* U+011d30: */
+                                                     0, /* U+011d31: */
+                                                     0, /* U+011d32: */
+                                                     0, /* U+011d33: */
+                                                     0, /* U+011d34: */
+                                                     0, /* U+011d35: */
+                                                     0, /* U+011d36: */
+                                                     0, /* U+011d37: */
+                                                     0, /* U+011d38: */
+                                                     0, /* U+011d39: */
+                                                     0, /* U+011d3a: */
+                                                     0, /* U+011d3b: */
+                                                     0, /* U+011d3c: */
+                                                     0, /* U+011d3d: */
+                                                     0, /* U+011d3e: */
+                                                     0, /* U+011d3f: */
+                                                     0, /* U+011d40: */
+                                                     0, /* U+011d41: */
+                                                     0, /* U+011d42: */
+                                                     0, /* U+011d43: */
+                                                     0, /* U+011d44: */
+                                                     0, /* U+011d45: */
+                                                     0, /* U+011d46: */
+                                                     0, /* U+011d47: */
+                                                     0, /* U+011d48: */
+                                                     0, /* U+011d49: */
+                                                     0, /* U+011d4a: */
+                                                     0, /* U+011d4b: */
+                                                     0, /* U+011d4c: */
+                                                     0, /* U+011d4d: */
+                                                     0, /* U+011d4e: */
+                                                     0, /* U+011d4f: */
+                                                     0, /* U+011d50: */
+                                                     0, /* U+011d51: */
+                                                     0, /* U+011d52: */
+                                                     0, /* U+011d53: */
+                                                     0, /* U+011d54: */
+                                                     0, /* U+011d55: */
+                                                     0, /* U+011d56: */
+                                                     0, /* U+011d57: */
+                                                     0, /* U+011d58: */
+                                                     0, /* U+011d59: */
+                                                     0, /* U+011d5a: */
+                                                     0, /* U+011d5b: */
+                                                     0, /* U+011d5c: */
+                                                     0, /* U+011d5d: */
+                                                     0, /* U+011d5e: */
+                                                     0, /* U+011d5f: */
+                                                     0, /* U+011d60: */
+                                                     0, /* U+011d61: */
+                                                     0, /* U+011d62: */
+                                                     0, /* U+011d63: */
+                                                     0, /* U+011d64: */
+                                                     0, /* U+011d65: */
+                                                     0, /* U+011d66: */
+                                                     0, /* U+011d67: */
+                                                     0, /* U+011d68: */
+                                                     0, /* U+011d69: */
+                                                     0, /* U+011d6a: */
+                                                     0, /* U+011d6b: */
+                                                     0, /* U+011d6c: */
+                                                     0, /* U+011d6d: */
+                                                     0, /* U+011d6e: */
+                                                     0, /* U+011d6f: */
+                                                     0, /* U+011d70: */
+                                                     0, /* U+011d71: */
+                                                     0, /* U+011d72: */
+                                                     0, /* U+011d73: */
+                                                     0, /* U+011d74: */
+                                                     0, /* U+011d75: */
+                                                     0, /* U+011d76: */
+                                                     0, /* U+011d77: */
+                                                     0, /* U+011d78: */
+                                                     0, /* U+011d79: */
+                                                     0, /* U+011d7a: */
+                                                     0, /* U+011d7b: */
+                                                     0, /* U+011d7c: */
+                                                     0, /* U+011d7d: */
+                                                     0, /* U+011d7e: */
+                                                     0, /* U+011d7f: */
+                                                     0, /* U+011d80: */
+                                                     0, /* U+011d81: */
+                                                     0, /* U+011d82: */
+                                                     0, /* U+011d83: */
+                                                     0, /* U+011d84: */
+                                                     0, /* U+011d85: */
+                                                     0, /* U+011d86: */
+                                                     0, /* U+011d87: */
+                                                     0, /* U+011d88: */
+                                                     0, /* U+011d89: */
+                                                     0, /* U+011d8a: */
+                                                     0, /* U+011d8b: */
+                                                     0, /* U+011d8c: */
+                                                     0, /* U+011d8d: */
+                                                     0, /* U+011d8e: */
+                                                     0, /* U+011d8f: */
+                                                     0, /* U+011d90: */
+                                                     0, /* U+011d91: */
+                                                     0, /* U+011d92: */
+                                                     0, /* U+011d93: */
+                                                     0, /* U+011d94: */
+                                                     0, /* U+011d95: */
+                                                     0, /* U+011d96: */
+                                                     0, /* U+011d97: */
+                                                     0, /* U+011d98: */
+                                                     0, /* U+011d99: */
+                                                     0, /* U+011d9a: */
+                                                     0, /* U+011d9b: */
+                                                     0, /* U+011d9c: */
+                                                     0, /* U+011d9d: */
+                                                     0, /* U+011d9e: */
+                                                     0, /* U+011d9f: */
+                                                     0, /* U+011da0: */
+                                                     0, /* U+011da1: */
+                                                     0, /* U+011da2: */
+                                                     0, /* U+011da3: */
+                                                     0, /* U+011da4: */
+                                                     0, /* U+011da5: */
+                                                     0, /* U+011da6: */
+                                                     0, /* U+011da7: */
+                                                     0, /* U+011da8: */
+                                                     0, /* U+011da9: */
+                                                     0, /* U+011daa: */
+                                                     0, /* U+011dab: */
+                                                     0, /* U+011dac: */
+                                                     0, /* U+011dad: */
+                                                     0, /* U+011dae: */
+                                                     0, /* U+011daf: */
+                                                     0, /* U+011db0: */
+                                                     0, /* U+011db1: */
+                                                     0, /* U+011db2: */
+                                                     0, /* U+011db3: */
+                                                     0, /* U+011db4: */
+                                                     0, /* U+011db5: */
+                                                     0, /* U+011db6: */
+                                                     0, /* U+011db7: */
+                                                     0, /* U+011db8: */
+                                                     0, /* U+011db9: */
+                                                     0, /* U+011dba: */
+                                                     0, /* U+011dbb: */
+                                                     0, /* U+011dbc: */
+                                                     0, /* U+011dbd: */
+                                                     0, /* U+011dbe: */
+                                                     0, /* U+011dbf: */
+                                                     0, /* U+011dc0: */
+                                                     0, /* U+011dc1: */
+                                                     0, /* U+011dc2: */
+                                                     0, /* U+011dc3: */
+                                                     0, /* U+011dc4: */
+                                                     0, /* U+011dc5: */
+                                                     0, /* U+011dc6: */
+                                                     0, /* U+011dc7: */
+                                                     0, /* U+011dc8: */
+                                                     0, /* U+011dc9: */
+                                                     0, /* U+011dca: */
+                                                     0, /* U+011dcb: */
+                                                     0, /* U+011dcc: */
+                                                     0, /* U+011dcd: */
+                                                     0, /* U+011dce: */
+                                                     0, /* U+011dcf: */
+                                                     0, /* U+011dd0: */
+                                                     0, /* U+011dd1: */
+                                                     0, /* U+011dd2: */
+                                                     0, /* U+011dd3: */
+                                                     0, /* U+011dd4: */
+                                                     0, /* U+011dd5: */
+                                                     0, /* U+011dd6: */
+                                                     0, /* U+011dd7: */
+                                                     0, /* U+011dd8: */
+                                                     0, /* U+011dd9: */
+                                                     0, /* U+011dda: */
+                                                     0, /* U+011ddb: */
+                                                     0, /* U+011ddc: */
+                                                     0, /* U+011ddd: */
+                                                     0, /* U+011dde: */
+                                                     0, /* U+011ddf: */
+                                                     0, /* U+011de0: */
+                                                     0, /* U+011de1: */
+                                                     0, /* U+011de2: */
+                                                     0, /* U+011de3: */
+                                                     0, /* U+011de4: */
+                                                     0, /* U+011de5: */
+                                                     0, /* U+011de6: */
+                                                     0, /* U+011de7: */
+                                                     0, /* U+011de8: */
+                                                     0, /* U+011de9: */
+                                                     0, /* U+011dea: */
+                                                     0, /* U+011deb: */
+                                                     0, /* U+011dec: */
+                                                     0, /* U+011ded: */
+                                                     0, /* U+011dee: */
+                                                     0, /* U+011def: */
+                                                     0, /* U+011df0: */
+                                                     0, /* U+011df1: */
+                                                     0, /* U+011df2: */
+                                                     0, /* U+011df3: */
+                                                     0, /* U+011df4: */
+                                                     0, /* U+011df5: */
+                                                     0, /* U+011df6: */
+                                                     0, /* U+011df7: */
+                                                     0, /* U+011df8: */
+                                                     0, /* U+011df9: */
+                                                     0, /* U+011dfa: */
+                                                     0, /* U+011dfb: */
+                                                     0, /* U+011dfc: */
+                                                     0, /* U+011dfd: */
+                                                     0, /* U+011dfe: */
+                                                     0, /* U+011dff: */
+                                                     0, /* U+011e00: */
+                                                     0, /* U+011e01: */
+                                                     0, /* U+011e02: */
+                                                     0, /* U+011e03: */
+                                                     0, /* U+011e04: */
+                                                     0, /* U+011e05: */
+                                                     0, /* U+011e06: */
+                                                     0, /* U+011e07: */
+                                                     0, /* U+011e08: */
+                                                     0, /* U+011e09: */
+                                                     0, /* U+011e0a: */
+                                                     0, /* U+011e0b: */
+                                                     0, /* U+011e0c: */
+                                                     0, /* U+011e0d: */
+                                                     0, /* U+011e0e: */
+                                                     0, /* U+011e0f: */
+                                                     0, /* U+011e10: */
+                                                     0, /* U+011e11: */
+                                                     0, /* U+011e12: */
+                                                     0, /* U+011e13: */
+                                                     0, /* U+011e14: */
+                                                     0, /* U+011e15: */
+                                                     0, /* U+011e16: */
+                                                     0, /* U+011e17: */
+                                                     0, /* U+011e18: */
+                                                     0, /* U+011e19: */
+                                                     0, /* U+011e1a: */
+                                                     0, /* U+011e1b: */
+                                                     0, /* U+011e1c: */
+                                                     0, /* U+011e1d: */
+                                                     0, /* U+011e1e: */
+                                                     0, /* U+011e1f: */
+                                                     0, /* U+011e20: */
+                                                     0, /* U+011e21: */
+                                                     0, /* U+011e22: */
+                                                     0, /* U+011e23: */
+                                                     0, /* U+011e24: */
+                                                     0, /* U+011e25: */
+                                                     0, /* U+011e26: */
+                                                     0, /* U+011e27: */
+                                                     0, /* U+011e28: */
+                                                     0, /* U+011e29: */
+                                                     0, /* U+011e2a: */
+                                                     0, /* U+011e2b: */
+                                                     0, /* U+011e2c: */
+                                                     0, /* U+011e2d: */
+                                                     0, /* U+011e2e: */
+                                                     0, /* U+011e2f: */
+                                                     0, /* U+011e30: */
+                                                     0, /* U+011e31: */
+                                                     0, /* U+011e32: */
+                                                     0, /* U+011e33: */
+                                                     0, /* U+011e34: */
+                                                     0, /* U+011e35: */
+                                                     0, /* U+011e36: */
+                                                     0, /* U+011e37: */
+                                                     0, /* U+011e38: */
+                                                     0, /* U+011e39: */
+                                                     0, /* U+011e3a: */
+                                                     0, /* U+011e3b: */
+                                                     0, /* U+011e3c: */
+                                                     0, /* U+011e3d: */
+                                                     0, /* U+011e3e: */
+                                                     0, /* U+011e3f: */
+                                                     0, /* U+011e40: */
+                                                     0, /* U+011e41: */
+                                                     0, /* U+011e42: */
+                                                     0, /* U+011e43: */
+                                                     0, /* U+011e44: */
+                                                     0, /* U+011e45: */
+                                                     0, /* U+011e46: */
+                                                     0, /* U+011e47: */
+                                                     0, /* U+011e48: */
+                                                     0, /* U+011e49: */
+                                                     0, /* U+011e4a: */
+                                                     0, /* U+011e4b: */
+                                                     0, /* U+011e4c: */
+                                                     0, /* U+011e4d: */
+                                                     0, /* U+011e4e: */
+                                                     0, /* U+011e4f: */
+                                                     0, /* U+011e50: */
+                                                     0, /* U+011e51: */
+                                                     0, /* U+011e52: */
+                                                     0, /* U+011e53: */
+                                                     0, /* U+011e54: */
+                                                     0, /* U+011e55: */
+                                                     0, /* U+011e56: */
+                                                     0, /* U+011e57: */
+                                                     0, /* U+011e58: */
+                                                     0, /* U+011e59: */
+                                                     0, /* U+011e5a: */
+                                                     0, /* U+011e5b: */
+                                                     0, /* U+011e5c: */
+                                                     0, /* U+011e5d: */
+                                                     0, /* U+011e5e: */
+                                                     0, /* U+011e5f: */
+                                                     0, /* U+011e60: */
+                                                     0, /* U+011e61: */
+                                                     0, /* U+011e62: */
+                                                     0, /* U+011e63: */
+                                                     0, /* U+011e64: */
+                                                     0, /* U+011e65: */
+                                                     0, /* U+011e66: */
+                                                     0, /* U+011e67: */
+                                                     0, /* U+011e68: */
+                                                     0, /* U+011e69: */
+                                                     0, /* U+011e6a: */
+                                                     0, /* U+011e6b: */
+                                                     0, /* U+011e6c: */
+                                                     0, /* U+011e6d: */
+                                                     0, /* U+011e6e: */
+                                                     0, /* U+011e6f: */
+                                                     0, /* U+011e70: */
+                                                     0, /* U+011e71: */
+                                                     0, /* U+011e72: */
+                                                     0, /* U+011e73: */
+                                                     0, /* U+011e74: */
+                                                     0, /* U+011e75: */
+                                                     0, /* U+011e76: */
+                                                     0, /* U+011e77: */
+                                                     0, /* U+011e78: */
+                                                     0, /* U+011e79: */
+                                                     0, /* U+011e7a: */
+                                                     0, /* U+011e7b: */
+                                                     0, /* U+011e7c: */
+                                                     0, /* U+011e7d: */
+                                                     0, /* U+011e7e: */
+                                                     0, /* U+011e7f: */
+                                                     0, /* U+011e80: */
+                                                     0, /* U+011e81: */
+                                                     0, /* U+011e82: */
+                                                     0, /* U+011e83: */
+                                                     0, /* U+011e84: */
+                                                     0, /* U+011e85: */
+                                                     0, /* U+011e86: */
+                                                     0, /* U+011e87: */
+                                                     0, /* U+011e88: */
+                                                     0, /* U+011e89: */
+                                                     0, /* U+011e8a: */
+                                                     0, /* U+011e8b: */
+                                                     0, /* U+011e8c: */
+                                                     0, /* U+011e8d: */
+                                                     0, /* U+011e8e: */
+                                                     0, /* U+011e8f: */
+                                                     0, /* U+011e90: */
+                                                     0, /* U+011e91: */
+                                                     0, /* U+011e92: */
+                                                     0, /* U+011e93: */
+                                                     0, /* U+011e94: */
+                                                     0, /* U+011e95: */
+                                                     0, /* U+011e96: */
+                                                     0, /* U+011e97: */
+                                                     0, /* U+011e98: */
+                                                     0, /* U+011e99: */
+                                                     0, /* U+011e9a: */
+                                                     0, /* U+011e9b: */
+                                                     0, /* U+011e9c: */
+                                                     0, /* U+011e9d: */
+                                                     0, /* U+011e9e: */
+                                                     0, /* U+011e9f: */
+                                                     0, /* U+011ea0: */
+                                                     0, /* U+011ea1: */
+                                                     0, /* U+011ea2: */
+                                                     0, /* U+011ea3: */
+                                                     0, /* U+011ea4: */
+                                                     0, /* U+011ea5: */
+                                                     0, /* U+011ea6: */
+                                                     0, /* U+011ea7: */
+                                                     0, /* U+011ea8: */
+                                                     0, /* U+011ea9: */
+                                                     0, /* U+011eaa: */
+                                                     0, /* U+011eab: */
+                                                     0, /* U+011eac: */
+                                                     0, /* U+011ead: */
+                                                     0, /* U+011eae: */
+                                                     0, /* U+011eaf: */
+                                                     0, /* U+011eb0: */
+                                                     0, /* U+011eb1: */
+                                                     0, /* U+011eb2: */
+                                                     0, /* U+011eb3: */
+                                                     0, /* U+011eb4: */
+                                                     0, /* U+011eb5: */
+                                                     0, /* U+011eb6: */
+                                                     0, /* U+011eb7: */
+                                                     0, /* U+011eb8: */
+                                                     0, /* U+011eb9: */
+                                                     0, /* U+011eba: */
+                                                     0, /* U+011ebb: */
+                                                     0, /* U+011ebc: */
+                                                     0, /* U+011ebd: */
+                                                     0, /* U+011ebe: */
+                                                     0, /* U+011ebf: */
+                                                     0, /* U+011ec0: */
+                                                     0, /* U+011ec1: */
+                                                     0, /* U+011ec2: */
+                                                     0, /* U+011ec3: */
+                                                     0, /* U+011ec4: */
+                                                     0, /* U+011ec5: */
+                                                     0, /* U+011ec6: */
+                                                     0, /* U+011ec7: */
+                                                     0, /* U+011ec8: */
+                                                     0, /* U+011ec9: */
+                                                     0, /* U+011eca: */
+                                                     0, /* U+011ecb: */
+                                                     0, /* U+011ecc: */
+                                                     0, /* U+011ecd: */
+                                                     0, /* U+011ece: */
+                                                     0, /* U+011ecf: */
+                                                     0, /* U+011ed0: */
+                                                     0, /* U+011ed1: */
+                                                     0, /* U+011ed2: */
+                                                     0, /* U+011ed3: */
+                                                     0, /* U+011ed4: */
+                                                     0, /* U+011ed5: */
+                                                     0, /* U+011ed6: */
+                                                     0, /* U+011ed7: */
+                                                     0, /* U+011ed8: */
+                                                     0, /* U+011ed9: */
+                                                     0, /* U+011eda: */
+                                                     0, /* U+011edb: */
+                                                     0, /* U+011edc: */
+                                                     0, /* U+011edd: */
+                                                     0, /* U+011ede: */
+                                                     0, /* U+011edf: */
+                                                     0, /* U+011ee0: */
+                                                     0, /* U+011ee1: */
+                                                     0, /* U+011ee2: */
+                                                     0, /* U+011ee3: */
+                                                     0, /* U+011ee4: */
+                                                     0, /* U+011ee5: */
+                                                     0, /* U+011ee6: */
+                                                     0, /* U+011ee7: */
+                                                     0, /* U+011ee8: */
+                                                     0, /* U+011ee9: */
+                                                     0, /* U+011eea: */
+                                                     0, /* U+011eeb: */
+                                                     0, /* U+011eec: */
+                                                     0, /* U+011eed: */
+                                                     0, /* U+011eee: */
+                                                     0, /* U+011eef: */
+                                                     0, /* U+011ef0: */
+                                                     0, /* U+011ef1: */
+                                                     0, /* U+011ef2: */
+                                                     0, /* U+011ef3: */
+                                                     0, /* U+011ef4: */
+                                                     0, /* U+011ef5: */
+                                                     0, /* U+011ef6: */
+                                                     0, /* U+011ef7: */
+                                                     0, /* U+011ef8: */
+                                                     0, /* U+011ef9: */
+                                                     0, /* U+011efa: */
+                                                     0, /* U+011efb: */
+                                                     0, /* U+011efc: */
+                                                     0, /* U+011efd: */
+                                                     0, /* U+011efe: */
+                                                     0, /* U+011eff: */
+                                                     0, /* U+011f00: */
+                                                     0, /* U+011f01: */
+                                                     0, /* U+011f02: */
+                                                     0, /* U+011f03: */
+                                                     0, /* U+011f04: */
+                                                     0, /* U+011f05: */
+                                                     0, /* U+011f06: */
+                                                     0, /* U+011f07: */
+                                                     0, /* U+011f08: */
+                                                     0, /* U+011f09: */
+                                                     0, /* U+011f0a: */
+                                                     0, /* U+011f0b: */
+                                                     0, /* U+011f0c: */
+                                                     0, /* U+011f0d: */
+                                                     0, /* U+011f0e: */
+                                                     0, /* U+011f0f: */
+                                                     0, /* U+011f10: */
+                                                     0, /* U+011f11: */
+                                                     0, /* U+011f12: */
+                                                     0, /* U+011f13: */
+                                                     0, /* U+011f14: */
+                                                     0, /* U+011f15: */
+                                                     0, /* U+011f16: */
+                                                     0, /* U+011f17: */
+                                                     0, /* U+011f18: */
+                                                     0, /* U+011f19: */
+                                                     0, /* U+011f1a: */
+                                                     0, /* U+011f1b: */
+                                                     0, /* U+011f1c: */
+                                                     0, /* U+011f1d: */
+                                                     0, /* U+011f1e: */
+                                                     0, /* U+011f1f: */
+                                                     0, /* U+011f20: */
+                                                     0, /* U+011f21: */
+                                                     0, /* U+011f22: */
+                                                     0, /* U+011f23: */
+                                                     0, /* U+011f24: */
+                                                     0, /* U+011f25: */
+                                                     0, /* U+011f26: */
+                                                     0, /* U+011f27: */
+                                                     0, /* U+011f28: */
+                                                     0, /* U+011f29: */
+                                                     0, /* U+011f2a: */
+                                                     0, /* U+011f2b: */
+                                                     0, /* U+011f2c: */
+                                                     0, /* U+011f2d: */
+                                                     0, /* U+011f2e: */
+                                                     0, /* U+011f2f: */
+                                                     0, /* U+011f30: */
+                                                     0, /* U+011f31: */
+                                                     0, /* U+011f32: */
+                                                     0, /* U+011f33: */
+                                                     0, /* U+011f34: */
+                                                     0, /* U+011f35: */
+                                                     0, /* U+011f36: */
+                                                     0, /* U+011f37: */
+                                                     0, /* U+011f38: */
+                                                     0, /* U+011f39: */
+                                                     0, /* U+011f3a: */
+                                                     0, /* U+011f3b: */
+                                                     0, /* U+011f3c: */
+                                                     0, /* U+011f3d: */
+                                                     0, /* U+011f3e: */
+                                                     0, /* U+011f3f: */
+                                                     0, /* U+011f40: */
+                                                     0, /* U+011f41: */
+                                                     0, /* U+011f42: */
+                                                     0, /* U+011f43: */
+                                                     0, /* U+011f44: */
+                                                     0, /* U+011f45: */
+                                                     0, /* U+011f46: */
+                                                     0, /* U+011f47: */
+                                                     0, /* U+011f48: */
+                                                     0, /* U+011f49: */
+                                                     0, /* U+011f4a: */
+                                                     0, /* U+011f4b: */
+                                                     0, /* U+011f4c: */
+                                                     0, /* U+011f4d: */
+                                                     0, /* U+011f4e: */
+                                                     0, /* U+011f4f: */
+                                                     0, /* U+011f50: */
+                                                     0, /* U+011f51: */
+                                                     0, /* U+011f52: */
+                                                     0, /* U+011f53: */
+                                                     0, /* U+011f54: */
+                                                     0, /* U+011f55: */
+                                                     0, /* U+011f56: */
+                                                     0, /* U+011f57: */
+                                                     0, /* U+011f58: */
+                                                     0, /* U+011f59: */
+                                                     0, /* U+011f5a: */
+                                                     0, /* U+011f5b: */
+                                                     0, /* U+011f5c: */
+                                                     0, /* U+011f5d: */
+                                                     0, /* U+011f5e: */
+                                                     0, /* U+011f5f: */
+                                                     0, /* U+011f60: */
+                                                     0, /* U+011f61: */
+                                                     0, /* U+011f62: */
+                                                     0, /* U+011f63: */
+                                                     0, /* U+011f64: */
+                                                     0, /* U+011f65: */
+                                                     0, /* U+011f66: */
+                                                     0, /* U+011f67: */
+                                                     0, /* U+011f68: */
+                                                     0, /* U+011f69: */
+                                                     0, /* U+011f6a: */
+                                                     0, /* U+011f6b: */
+                                                     0, /* U+011f6c: */
+                                                     0, /* U+011f6d: */
+                                                     0, /* U+011f6e: */
+                                                     0, /* U+011f6f: */
+                                                     0, /* U+011f70: */
+                                                     0, /* U+011f71: */
+                                                     0, /* U+011f72: */
+                                                     0, /* U+011f73: */
+                                                     0, /* U+011f74: */
+                                                     0, /* U+011f75: */
+                                                     0, /* U+011f76: */
+                                                     0, /* U+011f77: */
+                                                     0, /* U+011f78: */
+                                                     0, /* U+011f79: */
+                                                     0, /* U+011f7a: */
+                                                     0, /* U+011f7b: */
+                                                     0, /* U+011f7c: */
+                                                     0, /* U+011f7d: */
+                                                     0, /* U+011f7e: */
+                                                     0, /* U+011f7f: */
+                                                     0, /* U+011f80: */
+                                                     0, /* U+011f81: */
+                                                     0, /* U+011f82: */
+                                                     0, /* U+011f83: */
+                                                     0, /* U+011f84: */
+                                                     0, /* U+011f85: */
+                                                     0, /* U+011f86: */
+                                                     0, /* U+011f87: */
+                                                     0, /* U+011f88: */
+                                                     0, /* U+011f89: */
+                                                     0, /* U+011f8a: */
+                                                     0, /* U+011f8b: */
+                                                     0, /* U+011f8c: */
+                                                     0, /* U+011f8d: */
+                                                     0, /* U+011f8e: */
+                                                     0, /* U+011f8f: */
+                                                     0, /* U+011f90: */
+                                                     0, /* U+011f91: */
+                                                     0, /* U+011f92: */
+                                                     0, /* U+011f93: */
+                                                     0, /* U+011f94: */
+                                                     0, /* U+011f95: */
+                                                     0, /* U+011f96: */
+                                                     0, /* U+011f97: */
+                                                     0, /* U+011f98: */
+                                                     0, /* U+011f99: */
+                                                     0, /* U+011f9a: */
+                                                     0, /* U+011f9b: */
+                                                     0, /* U+011f9c: */
+                                                     0, /* U+011f9d: */
+                                                     0, /* U+011f9e: */
+                                                     0, /* U+011f9f: */
+                                                     0, /* U+011fa0: */
+                                                     0, /* U+011fa1: */
+                                                     0, /* U+011fa2: */
+                                                     0, /* U+011fa3: */
+                                                     0, /* U+011fa4: */
+                                                     0, /* U+011fa5: */
+                                                     0, /* U+011fa6: */
+                                                     0, /* U+011fa7: */
+                                                     0, /* U+011fa8: */
+                                                     0, /* U+011fa9: */
+                                                     0, /* U+011faa: */
+                                                     0, /* U+011fab: */
+                                                     0, /* U+011fac: */
+                                                     0, /* U+011fad: */
+                                                     0, /* U+011fae: */
+                                                     0, /* U+011faf: */
+                                                     0, /* U+011fb0: */
+                                                     0, /* U+011fb1: */
+                                                     0, /* U+011fb2: */
+                                                     0, /* U+011fb3: */
+                                                     0, /* U+011fb4: */
+                                                     0, /* U+011fb5: */
+                                                     0, /* U+011fb6: */
+                                                     0, /* U+011fb7: */
+                                                     0, /* U+011fb8: */
+                                                     0, /* U+011fb9: */
+                                                     0, /* U+011fba: */
+                                                     0, /* U+011fbb: */
+                                                     0, /* U+011fbc: */
+                                                     0, /* U+011fbd: */
+                                                     0, /* U+011fbe: */
+                                                     0, /* U+011fbf: */
+                                                     0, /* U+011fc0: */
+                                                     0, /* U+011fc1: */
+                                                     0, /* U+011fc2: */
+                                                     0, /* U+011fc3: */
+                                                     0, /* U+011fc4: */
+                                                     0, /* U+011fc5: */
+                                                     0, /* U+011fc6: */
+                                                     0, /* U+011fc7: */
+                                                     0, /* U+011fc8: */
+                                                     0, /* U+011fc9: */
+                                                     0, /* U+011fca: */
+                                                     0, /* U+011fcb: */
+                                                     0, /* U+011fcc: */
+                                                     0, /* U+011fcd: */
+                                                     0, /* U+011fce: */
+                                                     0, /* U+011fcf: */
+                                                     0, /* U+011fd0: */
+                                                     0, /* U+011fd1: */
+                                                     0, /* U+011fd2: */
+                                                     0, /* U+011fd3: */
+                                                     0, /* U+011fd4: */
+                                                     0, /* U+011fd5: */
+                                                     0, /* U+011fd6: */
+                                                     0, /* U+011fd7: */
+                                                     0, /* U+011fd8: */
+                                                     0, /* U+011fd9: */
+                                                     0, /* U+011fda: */
+                                                     0, /* U+011fdb: */
+                                                     0, /* U+011fdc: */
+                                                     0, /* U+011fdd: */
+                                                     0, /* U+011fde: */
+                                                     0, /* U+011fdf: */
+                                                     0, /* U+011fe0: */
+                                                     0, /* U+011fe1: */
+                                                     0, /* U+011fe2: */
+                                                     0, /* U+011fe3: */
+                                                     0, /* U+011fe4: */
+                                                     0, /* U+011fe5: */
+                                                     0, /* U+011fe6: */
+                                                     0, /* U+011fe7: */
+                                                     0, /* U+011fe8: */
+                                                     0, /* U+011fe9: */
+                                                     0, /* U+011fea: */
+                                                     0, /* U+011feb: */
+                                                     0, /* U+011fec: */
+                                                     0, /* U+011fed: */
+                                                     0, /* U+011fee: */
+                                                     0, /* U+011fef: */
+                                                     0, /* U+011ff0: */
+                                                     0, /* U+011ff1: */
+                                                     0, /* U+011ff2: */
+                                                     0, /* U+011ff3: */
+                                                     0, /* U+011ff4: */
+                                                     0, /* U+011ff5: */
+                                                     0, /* U+011ff6: */
+                                                     0, /* U+011ff7: */
+                                                     0, /* U+011ff8: */
+                                                     0, /* U+011ff9: */
+                                                     0, /* U+011ffa: */
+                                                     0, /* U+011ffb: */
+                                                     0, /* U+011ffc: */
+                                                     0, /* U+011ffd: */
+                                                     0, /* U+011ffe: */
+                                                     0, /* U+011fff: */
+                                           RTUNI_ALPHA, /* U+012000: CUNEIFORM SIGN A*/
+                                           RTUNI_ALPHA, /* U+012001: CUNEIFORM SIGN A TIMES A*/
+                                           RTUNI_ALPHA, /* U+012002: CUNEIFORM SIGN A TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012003: CUNEIFORM SIGN A TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012004: CUNEIFORM SIGN A TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012005: CUNEIFORM SIGN A TIMES IGI*/
+                                           RTUNI_ALPHA, /* U+012006: CUNEIFORM SIGN A TIMES LAGAR GUNU*/
+                                           RTUNI_ALPHA, /* U+012007: CUNEIFORM SIGN A TIMES MUSH*/
+                                           RTUNI_ALPHA, /* U+012008: CUNEIFORM SIGN A TIMES SAG*/
+                                           RTUNI_ALPHA, /* U+012009: CUNEIFORM SIGN A2*/
+                                           RTUNI_ALPHA, /* U+01200a: CUNEIFORM SIGN AB*/
+                                           RTUNI_ALPHA, /* U+01200b: CUNEIFORM SIGN AB TIMES ASH2*/
+                                           RTUNI_ALPHA, /* U+01200c: CUNEIFORM SIGN AB TIMES DUN3 GUNU*/
+                                           RTUNI_ALPHA, /* U+01200d: CUNEIFORM SIGN AB TIMES GAL*/
+                                           RTUNI_ALPHA, /* U+01200e: CUNEIFORM SIGN AB TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+01200f: CUNEIFORM SIGN AB TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012010: CUNEIFORM SIGN AB TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+012011: CUNEIFORM SIGN AB TIMES IMIN*/
+                                           RTUNI_ALPHA, /* U+012012: CUNEIFORM SIGN AB TIMES LAGAB*/
+                                           RTUNI_ALPHA, /* U+012013: CUNEIFORM SIGN AB TIMES SHESH*/
+                                           RTUNI_ALPHA, /* U+012014: CUNEIFORM SIGN AB TIMES U PLUS U PLUS U*/
+                                           RTUNI_ALPHA, /* U+012015: CUNEIFORM SIGN AB GUNU*/
+                                           RTUNI_ALPHA, /* U+012016: CUNEIFORM SIGN AB2*/
+                                           RTUNI_ALPHA, /* U+012017: CUNEIFORM SIGN AB2 TIMES BALAG*/
+                                           RTUNI_ALPHA, /* U+012018: CUNEIFORM SIGN AB2 TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012019: CUNEIFORM SIGN AB2 TIMES ME PLUS EN*/
+                                           RTUNI_ALPHA, /* U+01201a: CUNEIFORM SIGN AB2 TIMES SHA3*/
+                                           RTUNI_ALPHA, /* U+01201b: CUNEIFORM SIGN AB2 TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+01201c: CUNEIFORM SIGN AD*/
+                                           RTUNI_ALPHA, /* U+01201d: CUNEIFORM SIGN AK*/
+                                           RTUNI_ALPHA, /* U+01201e: CUNEIFORM SIGN AK TIMES ERIN2*/
+                                           RTUNI_ALPHA, /* U+01201f: CUNEIFORM SIGN AK TIMES SHITA PLUS GISH*/
+                                           RTUNI_ALPHA, /* U+012020: CUNEIFORM SIGN AL*/
+                                           RTUNI_ALPHA, /* U+012021: CUNEIFORM SIGN AL TIMES AL*/
+                                           RTUNI_ALPHA, /* U+012022: CUNEIFORM SIGN AL TIMES DIM2*/
+                                           RTUNI_ALPHA, /* U+012023: CUNEIFORM SIGN AL TIMES GISH*/
+                                           RTUNI_ALPHA, /* U+012024: CUNEIFORM SIGN AL TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012025: CUNEIFORM SIGN AL TIMES KAD3*/
+                                           RTUNI_ALPHA, /* U+012026: CUNEIFORM SIGN AL TIMES KI*/
+                                           RTUNI_ALPHA, /* U+012027: CUNEIFORM SIGN AL TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012028: CUNEIFORM SIGN AL TIMES USH*/
+                                           RTUNI_ALPHA, /* U+012029: CUNEIFORM SIGN ALAN*/
+                                           RTUNI_ALPHA, /* U+01202a: CUNEIFORM SIGN ALEPH*/
+                                           RTUNI_ALPHA, /* U+01202b: CUNEIFORM SIGN AMAR*/
+                                           RTUNI_ALPHA, /* U+01202c: CUNEIFORM SIGN AMAR TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+01202d: CUNEIFORM SIGN AN*/
+                                           RTUNI_ALPHA, /* U+01202e: CUNEIFORM SIGN AN OVER AN*/
+                                           RTUNI_ALPHA, /* U+01202f: CUNEIFORM SIGN AN THREE TIMES*/
+                                           RTUNI_ALPHA, /* U+012030: CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA*/
+                                           RTUNI_ALPHA, /* U+012031: CUNEIFORM SIGN AN PLUS NAGA SQUARED*/
+                                           RTUNI_ALPHA, /* U+012032: CUNEIFORM SIGN ANSHE*/
+                                           RTUNI_ALPHA, /* U+012033: CUNEIFORM SIGN APIN*/
+                                           RTUNI_ALPHA, /* U+012034: CUNEIFORM SIGN ARAD*/
+                                           RTUNI_ALPHA, /* U+012035: CUNEIFORM SIGN ARAD TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012036: CUNEIFORM SIGN ARKAB*/
+                                           RTUNI_ALPHA, /* U+012037: CUNEIFORM SIGN ASAL2*/
+                                           RTUNI_ALPHA, /* U+012038: CUNEIFORM SIGN ASH*/
+                                           RTUNI_ALPHA, /* U+012039: CUNEIFORM SIGN ASH ZIDA TENU*/
+                                           RTUNI_ALPHA, /* U+01203a: CUNEIFORM SIGN ASH KABA TENU*/
+                                           RTUNI_ALPHA, /* U+01203b: CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP*/
+                                           RTUNI_ALPHA, /* U+01203c: CUNEIFORM SIGN ASH OVER ASH OVER ASH*/
+                                           RTUNI_ALPHA, /* U+01203d: CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH*/
+                                           RTUNI_ALPHA, /* U+01203e: CUNEIFORM SIGN ASH2*/
+                                           RTUNI_ALPHA, /* U+01203f: CUNEIFORM SIGN ASHGAB*/
+                                           RTUNI_ALPHA, /* U+012040: CUNEIFORM SIGN BA*/
+                                           RTUNI_ALPHA, /* U+012041: CUNEIFORM SIGN BAD*/
+                                           RTUNI_ALPHA, /* U+012042: CUNEIFORM SIGN BAG3*/
+                                           RTUNI_ALPHA, /* U+012043: CUNEIFORM SIGN BAHAR2*/
+                                           RTUNI_ALPHA, /* U+012044: CUNEIFORM SIGN BAL*/
+                                           RTUNI_ALPHA, /* U+012045: CUNEIFORM SIGN BAL OVER BAL*/
+                                           RTUNI_ALPHA, /* U+012046: CUNEIFORM SIGN BALAG*/
+                                           RTUNI_ALPHA, /* U+012047: CUNEIFORM SIGN BAR*/
+                                           RTUNI_ALPHA, /* U+012048: CUNEIFORM SIGN BARA2*/
+                                           RTUNI_ALPHA, /* U+012049: CUNEIFORM SIGN BI*/
+                                           RTUNI_ALPHA, /* U+01204a: CUNEIFORM SIGN BI TIMES A*/
+                                           RTUNI_ALPHA, /* U+01204b: CUNEIFORM SIGN BI TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+01204c: CUNEIFORM SIGN BI TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+01204d: CUNEIFORM SIGN BU*/
+                                           RTUNI_ALPHA, /* U+01204e: CUNEIFORM SIGN BU OVER BU AB*/
+                                           RTUNI_ALPHA, /* U+01204f: CUNEIFORM SIGN BU OVER BU UN*/
+                                           RTUNI_ALPHA, /* U+012050: CUNEIFORM SIGN BU CROSSING BU*/
+                                           RTUNI_ALPHA, /* U+012051: CUNEIFORM SIGN BULUG*/
+                                           RTUNI_ALPHA, /* U+012052: CUNEIFORM SIGN BULUG OVER BULUG*/
+                                           RTUNI_ALPHA, /* U+012053: CUNEIFORM SIGN BUR*/
+                                           RTUNI_ALPHA, /* U+012054: CUNEIFORM SIGN BUR2*/
+                                           RTUNI_ALPHA, /* U+012055: CUNEIFORM SIGN DA*/
+                                           RTUNI_ALPHA, /* U+012056: CUNEIFORM SIGN DAG*/
+                                           RTUNI_ALPHA, /* U+012057: CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH*/
+                                           RTUNI_ALPHA, /* U+012058: CUNEIFORM SIGN DAG KISIM5 TIMES AMAR*/
+                                           RTUNI_ALPHA, /* U+012059: CUNEIFORM SIGN DAG KISIM5 TIMES BALAG*/
+                                           RTUNI_ALPHA, /* U+01205a: CUNEIFORM SIGN DAG KISIM5 TIMES BI*/
+                                           RTUNI_ALPHA, /* U+01205b: CUNEIFORM SIGN DAG KISIM5 TIMES GA*/
+                                           RTUNI_ALPHA, /* U+01205c: CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH*/
+                                           RTUNI_ALPHA, /* U+01205d: CUNEIFORM SIGN DAG KISIM5 TIMES GI*/
+                                           RTUNI_ALPHA, /* U+01205e: CUNEIFORM SIGN DAG KISIM5 TIMES GIR2*/
+                                           RTUNI_ALPHA, /* U+01205f: CUNEIFORM SIGN DAG KISIM5 TIMES GUD*/
+                                           RTUNI_ALPHA, /* U+012060: CUNEIFORM SIGN DAG KISIM5 TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012061: CUNEIFORM SIGN DAG KISIM5 TIMES IR*/
+                                           RTUNI_ALPHA, /* U+012062: CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU*/
+                                           RTUNI_ALPHA, /* U+012063: CUNEIFORM SIGN DAG KISIM5 TIMES KAK*/
+                                           RTUNI_ALPHA, /* U+012064: CUNEIFORM SIGN DAG KISIM5 TIMES LA*/
+                                           RTUNI_ALPHA, /* U+012065: CUNEIFORM SIGN DAG KISIM5 TIMES LU*/
+                                           RTUNI_ALPHA, /* U+012066: CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2*/
+                                           RTUNI_ALPHA, /* U+012067: CUNEIFORM SIGN DAG KISIM5 TIMES LUM*/
+                                           RTUNI_ALPHA, /* U+012068: CUNEIFORM SIGN DAG KISIM5 TIMES NE*/
+                                           RTUNI_ALPHA, /* U+012069: CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP*/
+                                           RTUNI_ALPHA, /* U+01206a: CUNEIFORM SIGN DAG KISIM5 TIMES SI*/
+                                           RTUNI_ALPHA, /* U+01206b: CUNEIFORM SIGN DAG KISIM5 TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+01206c: CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2*/
+                                           RTUNI_ALPHA, /* U+01206d: CUNEIFORM SIGN DAG KISIM5 TIMES USH*/
+                                           RTUNI_ALPHA, /* U+01206e: CUNEIFORM SIGN DAM*/
+                                           RTUNI_ALPHA, /* U+01206f: CUNEIFORM SIGN DAR*/
+                                           RTUNI_ALPHA, /* U+012070: CUNEIFORM SIGN DARA3*/
+                                           RTUNI_ALPHA, /* U+012071: CUNEIFORM SIGN DARA4*/
+                                           RTUNI_ALPHA, /* U+012072: CUNEIFORM SIGN DI*/
+                                           RTUNI_ALPHA, /* U+012073: CUNEIFORM SIGN DIB*/
+                                           RTUNI_ALPHA, /* U+012074: CUNEIFORM SIGN DIM*/
+                                           RTUNI_ALPHA, /* U+012075: CUNEIFORM SIGN DIM TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012076: CUNEIFORM SIGN DIM2*/
+                                           RTUNI_ALPHA, /* U+012077: CUNEIFORM SIGN DIN*/
+                                           RTUNI_ALPHA, /* U+012078: CUNEIFORM SIGN DIN KASKAL U GUNU DISH*/
+                                           RTUNI_ALPHA, /* U+012079: CUNEIFORM SIGN DISH*/
+                                           RTUNI_ALPHA, /* U+01207a: CUNEIFORM SIGN DU*/
+                                           RTUNI_ALPHA, /* U+01207b: CUNEIFORM SIGN DU OVER DU*/
+                                           RTUNI_ALPHA, /* U+01207c: CUNEIFORM SIGN DU GUNU*/
+                                           RTUNI_ALPHA, /* U+01207d: CUNEIFORM SIGN DU SHESHIG*/
+                                           RTUNI_ALPHA, /* U+01207e: CUNEIFORM SIGN DUB*/
+                                           RTUNI_ALPHA, /* U+01207f: CUNEIFORM SIGN DUB TIMES ESH2*/
+                                           RTUNI_ALPHA, /* U+012080: CUNEIFORM SIGN DUB2*/
+                                           RTUNI_ALPHA, /* U+012081: CUNEIFORM SIGN DUG*/
+                                           RTUNI_ALPHA, /* U+012082: CUNEIFORM SIGN DUGUD*/
+                                           RTUNI_ALPHA, /* U+012083: CUNEIFORM SIGN DUH*/
+                                           RTUNI_ALPHA, /* U+012084: CUNEIFORM SIGN DUN*/
+                                           RTUNI_ALPHA, /* U+012085: CUNEIFORM SIGN DUN3*/
+                                           RTUNI_ALPHA, /* U+012086: CUNEIFORM SIGN DUN3 GUNU*/
+                                           RTUNI_ALPHA, /* U+012087: CUNEIFORM SIGN DUN3 GUNU GUNU*/
+                                           RTUNI_ALPHA, /* U+012088: CUNEIFORM SIGN DUN4*/
+                                           RTUNI_ALPHA, /* U+012089: CUNEIFORM SIGN DUR2*/
+                                           RTUNI_ALPHA, /* U+01208a: CUNEIFORM SIGN E*/
+                                           RTUNI_ALPHA, /* U+01208b: CUNEIFORM SIGN E TIMES PAP*/
+                                           RTUNI_ALPHA, /* U+01208c: CUNEIFORM SIGN E OVER E NUN OVER NUN*/
+                                           RTUNI_ALPHA, /* U+01208d: CUNEIFORM SIGN E2*/
+                                           RTUNI_ALPHA, /* U+01208e: CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA*/
+                                           RTUNI_ALPHA, /* U+01208f: CUNEIFORM SIGN E2 TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+012090: CUNEIFORM SIGN E2 TIMES MI*/
+                                           RTUNI_ALPHA, /* U+012091: CUNEIFORM SIGN E2 TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+012092: CUNEIFORM SIGN E2 TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012093: CUNEIFORM SIGN E2 TIMES U*/
+                                           RTUNI_ALPHA, /* U+012094: CUNEIFORM SIGN EDIN*/
+                                           RTUNI_ALPHA, /* U+012095: CUNEIFORM SIGN EGIR*/
+                                           RTUNI_ALPHA, /* U+012096: CUNEIFORM SIGN EL*/
+                                           RTUNI_ALPHA, /* U+012097: CUNEIFORM SIGN EN*/
+                                           RTUNI_ALPHA, /* U+012098: CUNEIFORM SIGN EN TIMES GAN2*/
+                                           RTUNI_ALPHA, /* U+012099: CUNEIFORM SIGN EN TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+01209a: CUNEIFORM SIGN EN TIMES ME*/
+                                           RTUNI_ALPHA, /* U+01209b: CUNEIFORM SIGN EN CROSSING EN*/
+                                           RTUNI_ALPHA, /* U+01209c: CUNEIFORM SIGN EN OPPOSING EN*/
+                                           RTUNI_ALPHA, /* U+01209d: CUNEIFORM SIGN EN SQUARED*/
+                                           RTUNI_ALPHA, /* U+01209e: CUNEIFORM SIGN EREN*/
+                                           RTUNI_ALPHA, /* U+01209f: CUNEIFORM SIGN ERIN2*/
+                                           RTUNI_ALPHA, /* U+0120a0: CUNEIFORM SIGN ESH2*/
+                                           RTUNI_ALPHA, /* U+0120a1: CUNEIFORM SIGN EZEN*/
+                                           RTUNI_ALPHA, /* U+0120a2: CUNEIFORM SIGN EZEN TIMES A*/
+                                           RTUNI_ALPHA, /* U+0120a3: CUNEIFORM SIGN EZEN TIMES A PLUS LAL*/
+                                           RTUNI_ALPHA, /* U+0120a4: CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL*/
+                                           RTUNI_ALPHA, /* U+0120a5: CUNEIFORM SIGN EZEN TIMES AN*/
+                                           RTUNI_ALPHA, /* U+0120a6: CUNEIFORM SIGN EZEN TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0120a7: CUNEIFORM SIGN EZEN TIMES DUN3 GUNU*/
+                                           RTUNI_ALPHA, /* U+0120a8: CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU*/
+                                           RTUNI_ALPHA, /* U+0120a9: CUNEIFORM SIGN EZEN TIMES HA*/
+                                           RTUNI_ALPHA, /* U+0120aa: CUNEIFORM SIGN EZEN TIMES HA GUNU*/
+                                           RTUNI_ALPHA, /* U+0120ab: CUNEIFORM SIGN EZEN TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+0120ac: CUNEIFORM SIGN EZEN TIMES KASKAL*/
+                                           RTUNI_ALPHA, /* U+0120ad: CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED*/
+                                           RTUNI_ALPHA, /* U+0120ae: CUNEIFORM SIGN EZEN TIMES KU3*/
+                                           RTUNI_ALPHA, /* U+0120af: CUNEIFORM SIGN EZEN TIMES LA*/
+                                           RTUNI_ALPHA, /* U+0120b0: CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL*/
+                                           RTUNI_ALPHA, /* U+0120b1: CUNEIFORM SIGN EZEN TIMES LI*/
+                                           RTUNI_ALPHA, /* U+0120b2: CUNEIFORM SIGN EZEN TIMES LU*/
+                                           RTUNI_ALPHA, /* U+0120b3: CUNEIFORM SIGN EZEN TIMES U2*/
+                                           RTUNI_ALPHA, /* U+0120b4: CUNEIFORM SIGN EZEN TIMES UD*/
+                                           RTUNI_ALPHA, /* U+0120b5: CUNEIFORM SIGN GA*/
+                                           RTUNI_ALPHA, /* U+0120b6: CUNEIFORM SIGN GA GUNU*/
+                                           RTUNI_ALPHA, /* U+0120b7: CUNEIFORM SIGN GA2*/
+                                           RTUNI_ALPHA, /* U+0120b8: CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA*/
+                                           RTUNI_ALPHA, /* U+0120b9: CUNEIFORM SIGN GA2 TIMES A PLUS HA*/
+                                           RTUNI_ALPHA, /* U+0120ba: CUNEIFORM SIGN GA2 TIMES A PLUS IGI*/
+                                           RTUNI_ALPHA, /* U+0120bb: CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB*/
+                                           RTUNI_ALPHA, /* U+0120bc: CUNEIFORM SIGN GA2 TIMES AN*/
+                                           RTUNI_ALPHA, /* U+0120bd: CUNEIFORM SIGN GA2 TIMES ASH*/
+                                           RTUNI_ALPHA, /* U+0120be: CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL*/
+                                           RTUNI_ALPHA, /* U+0120bf: CUNEIFORM SIGN GA2 TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0120c0: CUNEIFORM SIGN GA2 TIMES BAR PLUS RA*/
+                                           RTUNI_ALPHA, /* U+0120c1: CUNEIFORM SIGN GA2 TIMES BUR*/
+                                           RTUNI_ALPHA, /* U+0120c2: CUNEIFORM SIGN GA2 TIMES BUR PLUS RA*/
+                                           RTUNI_ALPHA, /* U+0120c3: CUNEIFORM SIGN GA2 TIMES DA*/
+                                           RTUNI_ALPHA, /* U+0120c4: CUNEIFORM SIGN GA2 TIMES DI*/
+                                           RTUNI_ALPHA, /* U+0120c5: CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+0120c6: CUNEIFORM SIGN GA2 TIMES DUB*/
+                                           RTUNI_ALPHA, /* U+0120c7: CUNEIFORM SIGN GA2 TIMES EL*/
+                                           RTUNI_ALPHA, /* U+0120c8: CUNEIFORM SIGN GA2 TIMES EL PLUS LA*/
+                                           RTUNI_ALPHA, /* U+0120c9: CUNEIFORM SIGN GA2 TIMES EN*/
+                                           RTUNI_ALPHA, /* U+0120ca: CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+0120cb: CUNEIFORM SIGN GA2 TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+0120cc: CUNEIFORM SIGN GA2 TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+0120cd: CUNEIFORM SIGN GA2 TIMES GI*/
+                                           RTUNI_ALPHA, /* U+0120ce: CUNEIFORM SIGN GA2 TIMES GI4*/
+                                           RTUNI_ALPHA, /* U+0120cf: CUNEIFORM SIGN GA2 TIMES GI4 PLUS A*/
+                                           RTUNI_ALPHA, /* U+0120d0: CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU*/
+                                           RTUNI_ALPHA, /* U+0120d1: CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2*/
+                                           RTUNI_ALPHA, /* U+0120d2: CUNEIFORM SIGN GA2 TIMES HAL*/
+                                           RTUNI_ALPHA, /* U+0120d3: CUNEIFORM SIGN GA2 TIMES HAL PLUS LA*/
+                                           RTUNI_ALPHA, /* U+0120d4: CUNEIFORM SIGN GA2 TIMES HI PLUS LI*/
+                                           RTUNI_ALPHA, /* U+0120d5: CUNEIFORM SIGN GA2 TIMES HUB2*/
+                                           RTUNI_ALPHA, /* U+0120d6: CUNEIFORM SIGN GA2 TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+0120d7: CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+0120d8: CUNEIFORM SIGN GA2 TIMES KAK*/
+                                           RTUNI_ALPHA, /* U+0120d9: CUNEIFORM SIGN GA2 TIMES KASKAL*/
+                                           RTUNI_ALPHA, /* U+0120da: CUNEIFORM SIGN GA2 TIMES KID*/
+                                           RTUNI_ALPHA, /* U+0120db: CUNEIFORM SIGN GA2 TIMES KID PLUS LAL*/
+                                           RTUNI_ALPHA, /* U+0120dc: CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN*/
+                                           RTUNI_ALPHA, /* U+0120dd: CUNEIFORM SIGN GA2 TIMES LA*/
+                                           RTUNI_ALPHA, /* U+0120de: CUNEIFORM SIGN GA2 TIMES ME PLUS EN*/
+                                           RTUNI_ALPHA, /* U+0120df: CUNEIFORM SIGN GA2 TIMES MI*/
+                                           RTUNI_ALPHA, /* U+0120e0: CUNEIFORM SIGN GA2 TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+0120e1: CUNEIFORM SIGN GA2 TIMES NUN OVER NUN*/
+                                           RTUNI_ALPHA, /* U+0120e2: CUNEIFORM SIGN GA2 TIMES PA*/
+                                           RTUNI_ALPHA, /* U+0120e3: CUNEIFORM SIGN GA2 TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+0120e4: CUNEIFORM SIGN GA2 TIMES SAR*/
+                                           RTUNI_ALPHA, /* U+0120e5: CUNEIFORM SIGN GA2 TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+0120e6: CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR*/
+                                           RTUNI_ALPHA, /* U+0120e7: CUNEIFORM SIGN GA2 TIMES SHID*/
+                                           RTUNI_ALPHA, /* U+0120e8: CUNEIFORM SIGN GA2 TIMES SUM*/
+                                           RTUNI_ALPHA, /* U+0120e9: CUNEIFORM SIGN GA2 TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+0120ea: CUNEIFORM SIGN GA2 TIMES U*/
+                                           RTUNI_ALPHA, /* U+0120eb: CUNEIFORM SIGN GA2 TIMES UD*/
+                                           RTUNI_ALPHA, /* U+0120ec: CUNEIFORM SIGN GA2 TIMES UD PLUS DU*/
+                                           RTUNI_ALPHA, /* U+0120ed: CUNEIFORM SIGN GA2 OVER GA2*/
+                                           RTUNI_ALPHA, /* U+0120ee: CUNEIFORM SIGN GABA*/
+                                           RTUNI_ALPHA, /* U+0120ef: CUNEIFORM SIGN GABA CROSSING GABA*/
+                                           RTUNI_ALPHA, /* U+0120f0: CUNEIFORM SIGN GAD*/
+                                           RTUNI_ALPHA, /* U+0120f1: CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+0120f2: CUNEIFORM SIGN GAL*/
+                                           RTUNI_ALPHA, /* U+0120f3: CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+0120f4: CUNEIFORM SIGN GALAM*/
+                                           RTUNI_ALPHA, /* U+0120f5: CUNEIFORM SIGN GAM*/
+                                           RTUNI_ALPHA, /* U+0120f6: CUNEIFORM SIGN GAN*/
+                                           RTUNI_ALPHA, /* U+0120f7: CUNEIFORM SIGN GAN2*/
+                                           RTUNI_ALPHA, /* U+0120f8: CUNEIFORM SIGN GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+0120f9: CUNEIFORM SIGN GAN2 OVER GAN2*/
+                                           RTUNI_ALPHA, /* U+0120fa: CUNEIFORM SIGN GAN2 CROSSING GAN2*/
+                                           RTUNI_ALPHA, /* U+0120fb: CUNEIFORM SIGN GAR*/
+                                           RTUNI_ALPHA, /* U+0120fc: CUNEIFORM SIGN GAR3*/
+                                           RTUNI_ALPHA, /* U+0120fd: CUNEIFORM SIGN GASHAN*/
+                                           RTUNI_ALPHA, /* U+0120fe: CUNEIFORM SIGN GESHTIN*/
+                                           RTUNI_ALPHA, /* U+0120ff: CUNEIFORM SIGN GESHTIN TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012100: CUNEIFORM SIGN GI*/
+                                           RTUNI_ALPHA, /* U+012101: CUNEIFORM SIGN GI TIMES E*/
+                                           RTUNI_ALPHA, /* U+012102: CUNEIFORM SIGN GI TIMES U*/
+                                           RTUNI_ALPHA, /* U+012103: CUNEIFORM SIGN GI CROSSING GI*/
+                                           RTUNI_ALPHA, /* U+012104: CUNEIFORM SIGN GI4*/
+                                           RTUNI_ALPHA, /* U+012105: CUNEIFORM SIGN GI4 OVER GI4*/
+                                           RTUNI_ALPHA, /* U+012106: CUNEIFORM SIGN GI4 CROSSING GI4*/
+                                           RTUNI_ALPHA, /* U+012107: CUNEIFORM SIGN GIDIM*/
+                                           RTUNI_ALPHA, /* U+012108: CUNEIFORM SIGN GIR2*/
+                                           RTUNI_ALPHA, /* U+012109: CUNEIFORM SIGN GIR2 GUNU*/
+                                           RTUNI_ALPHA, /* U+01210a: CUNEIFORM SIGN GIR3*/
+                                           RTUNI_ALPHA, /* U+01210b: CUNEIFORM SIGN GIR3 TIMES A PLUS IGI*/
+                                           RTUNI_ALPHA, /* U+01210c: CUNEIFORM SIGN GIR3 TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+01210d: CUNEIFORM SIGN GIR3 TIMES IGI*/
+                                           RTUNI_ALPHA, /* U+01210e: CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI*/
+                                           RTUNI_ALPHA, /* U+01210f: CUNEIFORM SIGN GIR3 TIMES PA*/
+                                           RTUNI_ALPHA, /* U+012110: CUNEIFORM SIGN GISAL*/
+                                           RTUNI_ALPHA, /* U+012111: CUNEIFORM SIGN GISH*/
+                                           RTUNI_ALPHA, /* U+012112: CUNEIFORM SIGN GISH CROSSING GISH*/
+                                           RTUNI_ALPHA, /* U+012113: CUNEIFORM SIGN GISH TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012114: CUNEIFORM SIGN GISH TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+012115: CUNEIFORM SIGN GISH TENU*/
+                                           RTUNI_ALPHA, /* U+012116: CUNEIFORM SIGN GU*/
+                                           RTUNI_ALPHA, /* U+012117: CUNEIFORM SIGN GU CROSSING GU*/
+                                           RTUNI_ALPHA, /* U+012118: CUNEIFORM SIGN GU2*/
+                                           RTUNI_ALPHA, /* U+012119: CUNEIFORM SIGN GU2 TIMES KAK*/
+                                           RTUNI_ALPHA, /* U+01211a: CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+01211b: CUNEIFORM SIGN GU2 TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+01211c: CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2*/
+                                           RTUNI_ALPHA, /* U+01211d: CUNEIFORM SIGN GU2 GUNU*/
+                                           RTUNI_ALPHA, /* U+01211e: CUNEIFORM SIGN GUD*/
+                                           RTUNI_ALPHA, /* U+01211f: CUNEIFORM SIGN GUD TIMES A PLUS KUR*/
+                                           RTUNI_ALPHA, /* U+012120: CUNEIFORM SIGN GUD TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012121: CUNEIFORM SIGN GUD OVER GUD LUGAL*/
+                                           RTUNI_ALPHA, /* U+012122: CUNEIFORM SIGN GUL*/
+                                           RTUNI_ALPHA, /* U+012123: CUNEIFORM SIGN GUM*/
+                                           RTUNI_ALPHA, /* U+012124: CUNEIFORM SIGN GUM TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012125: CUNEIFORM SIGN GUR*/
+                                           RTUNI_ALPHA, /* U+012126: CUNEIFORM SIGN GUR7*/
+                                           RTUNI_ALPHA, /* U+012127: CUNEIFORM SIGN GURUN*/
+                                           RTUNI_ALPHA, /* U+012128: CUNEIFORM SIGN GURUSH*/
+                                           RTUNI_ALPHA, /* U+012129: CUNEIFORM SIGN HA*/
+                                           RTUNI_ALPHA, /* U+01212a: CUNEIFORM SIGN HA TENU*/
+                                           RTUNI_ALPHA, /* U+01212b: CUNEIFORM SIGN HA GUNU*/
+                                           RTUNI_ALPHA, /* U+01212c: CUNEIFORM SIGN HAL*/
+                                           RTUNI_ALPHA, /* U+01212d: CUNEIFORM SIGN HI*/
+                                           RTUNI_ALPHA, /* U+01212e: CUNEIFORM SIGN HI TIMES ASH*/
+                                           RTUNI_ALPHA, /* U+01212f: CUNEIFORM SIGN HI TIMES ASH2*/
+                                           RTUNI_ALPHA, /* U+012130: CUNEIFORM SIGN HI TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012131: CUNEIFORM SIGN HI TIMES DISH*/
+                                           RTUNI_ALPHA, /* U+012132: CUNEIFORM SIGN HI TIMES GAD*/
+                                           RTUNI_ALPHA, /* U+012133: CUNEIFORM SIGN HI TIMES KIN*/
+                                           RTUNI_ALPHA, /* U+012134: CUNEIFORM SIGN HI TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+012135: CUNEIFORM SIGN HI TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012136: CUNEIFORM SIGN HI TIMES U*/
+                                           RTUNI_ALPHA, /* U+012137: CUNEIFORM SIGN HU*/
+                                           RTUNI_ALPHA, /* U+012138: CUNEIFORM SIGN HUB2*/
+                                           RTUNI_ALPHA, /* U+012139: CUNEIFORM SIGN HUB2 TIMES AN*/
+                                           RTUNI_ALPHA, /* U+01213a: CUNEIFORM SIGN HUB2 TIMES HAL*/
+                                           RTUNI_ALPHA, /* U+01213b: CUNEIFORM SIGN HUB2 TIMES KASKAL*/
+                                           RTUNI_ALPHA, /* U+01213c: CUNEIFORM SIGN HUB2 TIMES LISH*/
+                                           RTUNI_ALPHA, /* U+01213d: CUNEIFORM SIGN HUB2 TIMES UD*/
+                                           RTUNI_ALPHA, /* U+01213e: CUNEIFORM SIGN HUL2*/
+                                           RTUNI_ALPHA, /* U+01213f: CUNEIFORM SIGN I*/
+                                           RTUNI_ALPHA, /* U+012140: CUNEIFORM SIGN I A*/
+                                           RTUNI_ALPHA, /* U+012141: CUNEIFORM SIGN IB*/
+                                           RTUNI_ALPHA, /* U+012142: CUNEIFORM SIGN IDIM*/
+                                           RTUNI_ALPHA, /* U+012143: CUNEIFORM SIGN IDIM OVER IDIM BUR*/
+                                           RTUNI_ALPHA, /* U+012144: CUNEIFORM SIGN IDIM OVER IDIM SQUARED*/
+                                           RTUNI_ALPHA, /* U+012145: CUNEIFORM SIGN IG*/
+                                           RTUNI_ALPHA, /* U+012146: CUNEIFORM SIGN IGI*/
+                                           RTUNI_ALPHA, /* U+012147: CUNEIFORM SIGN IGI DIB*/
+                                           RTUNI_ALPHA, /* U+012148: CUNEIFORM SIGN IGI RI*/
+                                           RTUNI_ALPHA, /* U+012149: CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD*/
+                                           RTUNI_ALPHA, /* U+01214a: CUNEIFORM SIGN IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+01214b: CUNEIFORM SIGN IL*/
+                                           RTUNI_ALPHA, /* U+01214c: CUNEIFORM SIGN IL TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+01214d: CUNEIFORM SIGN IL2*/
+                                           RTUNI_ALPHA, /* U+01214e: CUNEIFORM SIGN IM*/
+                                           RTUNI_ALPHA, /* U+01214f: CUNEIFORM SIGN IM TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+012150: CUNEIFORM SIGN IM CROSSING IM*/
+                                           RTUNI_ALPHA, /* U+012151: CUNEIFORM SIGN IM OPPOSING IM*/
+                                           RTUNI_ALPHA, /* U+012152: CUNEIFORM SIGN IM SQUARED*/
+                                           RTUNI_ALPHA, /* U+012153: CUNEIFORM SIGN IMIN*/
+                                           RTUNI_ALPHA, /* U+012154: CUNEIFORM SIGN IN*/
+                                           RTUNI_ALPHA, /* U+012155: CUNEIFORM SIGN IR*/
+                                           RTUNI_ALPHA, /* U+012156: CUNEIFORM SIGN ISH*/
+                                           RTUNI_ALPHA, /* U+012157: CUNEIFORM SIGN KA*/
+                                           RTUNI_ALPHA, /* U+012158: CUNEIFORM SIGN KA TIMES A*/
+                                           RTUNI_ALPHA, /* U+012159: CUNEIFORM SIGN KA TIMES AD*/
+                                           RTUNI_ALPHA, /* U+01215a: CUNEIFORM SIGN KA TIMES AD PLUS KU3*/
+                                           RTUNI_ALPHA, /* U+01215b: CUNEIFORM SIGN KA TIMES ASH2*/
+                                           RTUNI_ALPHA, /* U+01215c: CUNEIFORM SIGN KA TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+01215d: CUNEIFORM SIGN KA TIMES BALAG*/
+                                           RTUNI_ALPHA, /* U+01215e: CUNEIFORM SIGN KA TIMES BAR*/
+                                           RTUNI_ALPHA, /* U+01215f: CUNEIFORM SIGN KA TIMES BI*/
+                                           RTUNI_ALPHA, /* U+012160: CUNEIFORM SIGN KA TIMES ERIN2*/
+                                           RTUNI_ALPHA, /* U+012161: CUNEIFORM SIGN KA TIMES ESH2*/
+                                           RTUNI_ALPHA, /* U+012162: CUNEIFORM SIGN KA TIMES GA*/
+                                           RTUNI_ALPHA, /* U+012163: CUNEIFORM SIGN KA TIMES GAL*/
+                                           RTUNI_ALPHA, /* U+012164: CUNEIFORM SIGN KA TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012165: CUNEIFORM SIGN KA TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+012166: CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A*/
+                                           RTUNI_ALPHA, /* U+012167: CUNEIFORM SIGN KA TIMES GI*/
+                                           RTUNI_ALPHA, /* U+012168: CUNEIFORM SIGN KA TIMES GIR2*/
+                                           RTUNI_ALPHA, /* U+012169: CUNEIFORM SIGN KA TIMES GISH PLUS SAR*/
+                                           RTUNI_ALPHA, /* U+01216a: CUNEIFORM SIGN KA TIMES GISH CROSSING GISH*/
+                                           RTUNI_ALPHA, /* U+01216b: CUNEIFORM SIGN KA TIMES GU*/
+                                           RTUNI_ALPHA, /* U+01216c: CUNEIFORM SIGN KA TIMES GUR7*/
+                                           RTUNI_ALPHA, /* U+01216d: CUNEIFORM SIGN KA TIMES IGI*/
+                                           RTUNI_ALPHA, /* U+01216e: CUNEIFORM SIGN KA TIMES IM*/
+                                           RTUNI_ALPHA, /* U+01216f: CUNEIFORM SIGN KA TIMES KAK*/
+                                           RTUNI_ALPHA, /* U+012170: CUNEIFORM SIGN KA TIMES KI*/
+                                           RTUNI_ALPHA, /* U+012171: CUNEIFORM SIGN KA TIMES KID*/
+                                           RTUNI_ALPHA, /* U+012172: CUNEIFORM SIGN KA TIMES LI*/
+                                           RTUNI_ALPHA, /* U+012173: CUNEIFORM SIGN KA TIMES LU*/
+                                           RTUNI_ALPHA, /* U+012174: CUNEIFORM SIGN KA TIMES ME*/
+                                           RTUNI_ALPHA, /* U+012175: CUNEIFORM SIGN KA TIMES ME PLUS DU*/
+                                           RTUNI_ALPHA, /* U+012176: CUNEIFORM SIGN KA TIMES ME PLUS GI*/
+                                           RTUNI_ALPHA, /* U+012177: CUNEIFORM SIGN KA TIMES ME PLUS TE*/
+                                           RTUNI_ALPHA, /* U+012178: CUNEIFORM SIGN KA TIMES MI*/
+                                           RTUNI_ALPHA, /* U+012179: CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ*/
+                                           RTUNI_ALPHA, /* U+01217a: CUNEIFORM SIGN KA TIMES NE*/
+                                           RTUNI_ALPHA, /* U+01217b: CUNEIFORM SIGN KA TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+01217c: CUNEIFORM SIGN KA TIMES PI*/
+                                           RTUNI_ALPHA, /* U+01217d: CUNEIFORM SIGN KA TIMES RU*/
+                                           RTUNI_ALPHA, /* U+01217e: CUNEIFORM SIGN KA TIMES SA*/
+                                           RTUNI_ALPHA, /* U+01217f: CUNEIFORM SIGN KA TIMES SAR*/
+                                           RTUNI_ALPHA, /* U+012180: CUNEIFORM SIGN KA TIMES SHA*/
+                                           RTUNI_ALPHA, /* U+012181: CUNEIFORM SIGN KA TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+012182: CUNEIFORM SIGN KA TIMES SHID*/
+                                           RTUNI_ALPHA, /* U+012183: CUNEIFORM SIGN KA TIMES SHU*/
+                                           RTUNI_ALPHA, /* U+012184: CUNEIFORM SIGN KA TIMES SIG*/
+                                           RTUNI_ALPHA, /* U+012185: CUNEIFORM SIGN KA TIMES SUHUR*/
+                                           RTUNI_ALPHA, /* U+012186: CUNEIFORM SIGN KA TIMES TAR*/
+                                           RTUNI_ALPHA, /* U+012187: CUNEIFORM SIGN KA TIMES U*/
+                                           RTUNI_ALPHA, /* U+012188: CUNEIFORM SIGN KA TIMES U2*/
+                                           RTUNI_ALPHA, /* U+012189: CUNEIFORM SIGN KA TIMES UD*/
+                                           RTUNI_ALPHA, /* U+01218a: CUNEIFORM SIGN KA TIMES UMUM TIMES PA*/
+                                           RTUNI_ALPHA, /* U+01218b: CUNEIFORM SIGN KA TIMES USH*/
+                                           RTUNI_ALPHA, /* U+01218c: CUNEIFORM SIGN KA TIMES ZI*/
+                                           RTUNI_ALPHA, /* U+01218d: CUNEIFORM SIGN KA2*/
+                                           RTUNI_ALPHA, /* U+01218e: CUNEIFORM SIGN KA2 CROSSING KA2*/
+                                           RTUNI_ALPHA, /* U+01218f: CUNEIFORM SIGN KAB*/
+                                           RTUNI_ALPHA, /* U+012190: CUNEIFORM SIGN KAD2*/
+                                           RTUNI_ALPHA, /* U+012191: CUNEIFORM SIGN KAD3*/
+                                           RTUNI_ALPHA, /* U+012192: CUNEIFORM SIGN KAD4*/
+                                           RTUNI_ALPHA, /* U+012193: CUNEIFORM SIGN KAD5*/
+                                           RTUNI_ALPHA, /* U+012194: CUNEIFORM SIGN KAD5 OVER KAD5*/
+                                           RTUNI_ALPHA, /* U+012195: CUNEIFORM SIGN KAK*/
+                                           RTUNI_ALPHA, /* U+012196: CUNEIFORM SIGN KAK TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+012197: CUNEIFORM SIGN KAL*/
+                                           RTUNI_ALPHA, /* U+012198: CUNEIFORM SIGN KAL TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012199: CUNEIFORM SIGN KAL CROSSING KAL*/
+                                           RTUNI_ALPHA, /* U+01219a: CUNEIFORM SIGN KAM2*/
+                                           RTUNI_ALPHA, /* U+01219b: CUNEIFORM SIGN KAM4*/
+                                           RTUNI_ALPHA, /* U+01219c: CUNEIFORM SIGN KASKAL*/
+                                           RTUNI_ALPHA, /* U+01219d: CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U*/
+                                           RTUNI_ALPHA, /* U+01219e: CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U*/
+                                           RTUNI_ALPHA, /* U+01219f: CUNEIFORM SIGN KESH2*/
+                                           RTUNI_ALPHA, /* U+0121a0: CUNEIFORM SIGN KI*/
+                                           RTUNI_ALPHA, /* U+0121a1: CUNEIFORM SIGN KI TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0121a2: CUNEIFORM SIGN KI TIMES U*/
+                                           RTUNI_ALPHA, /* U+0121a3: CUNEIFORM SIGN KI TIMES UD*/
+                                           RTUNI_ALPHA, /* U+0121a4: CUNEIFORM SIGN KID*/
+                                           RTUNI_ALPHA, /* U+0121a5: CUNEIFORM SIGN KIN*/
+                                           RTUNI_ALPHA, /* U+0121a6: CUNEIFORM SIGN KISAL*/
+                                           RTUNI_ALPHA, /* U+0121a7: CUNEIFORM SIGN KISH*/
+                                           RTUNI_ALPHA, /* U+0121a8: CUNEIFORM SIGN KISIM5*/
+                                           RTUNI_ALPHA, /* U+0121a9: CUNEIFORM SIGN KISIM5 OVER KISIM5*/
+                                           RTUNI_ALPHA, /* U+0121aa: CUNEIFORM SIGN KU*/
+                                           RTUNI_ALPHA, /* U+0121ab: CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2*/
+                                           RTUNI_ALPHA, /* U+0121ac: CUNEIFORM SIGN KU3*/
+                                           RTUNI_ALPHA, /* U+0121ad: CUNEIFORM SIGN KU4*/
+                                           RTUNI_ALPHA, /* U+0121ae: CUNEIFORM SIGN KU4 VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+0121af: CUNEIFORM SIGN KU7*/
+                                           RTUNI_ALPHA, /* U+0121b0: CUNEIFORM SIGN KUL*/
+                                           RTUNI_ALPHA, /* U+0121b1: CUNEIFORM SIGN KUL GUNU*/
+                                           RTUNI_ALPHA, /* U+0121b2: CUNEIFORM SIGN KUN*/
+                                           RTUNI_ALPHA, /* U+0121b3: CUNEIFORM SIGN KUR*/
+                                           RTUNI_ALPHA, /* U+0121b4: CUNEIFORM SIGN KUR OPPOSING KUR*/
+                                           RTUNI_ALPHA, /* U+0121b5: CUNEIFORM SIGN KUSHU2*/
+                                           RTUNI_ALPHA, /* U+0121b6: CUNEIFORM SIGN KWU318*/
+                                           RTUNI_ALPHA, /* U+0121b7: CUNEIFORM SIGN LA*/
+                                           RTUNI_ALPHA, /* U+0121b8: CUNEIFORM SIGN LAGAB*/
+                                           RTUNI_ALPHA, /* U+0121b9: CUNEIFORM SIGN LAGAB TIMES A*/
+                                           RTUNI_ALPHA, /* U+0121ba: CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA*/
+                                           RTUNI_ALPHA, /* U+0121bb: CUNEIFORM SIGN LAGAB TIMES A PLUS GAR*/
+                                           RTUNI_ALPHA, /* U+0121bc: CUNEIFORM SIGN LAGAB TIMES A PLUS LAL*/
+                                           RTUNI_ALPHA, /* U+0121bd: CUNEIFORM SIGN LAGAB TIMES AL*/
+                                           RTUNI_ALPHA, /* U+0121be: CUNEIFORM SIGN LAGAB TIMES AN*/
+                                           RTUNI_ALPHA, /* U+0121bf: CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU*/
+                                           RTUNI_ALPHA, /* U+0121c0: CUNEIFORM SIGN LAGAB TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0121c1: CUNEIFORM SIGN LAGAB TIMES BI*/
+                                           RTUNI_ALPHA, /* U+0121c2: CUNEIFORM SIGN LAGAB TIMES DAR*/
+                                           RTUNI_ALPHA, /* U+0121c3: CUNEIFORM SIGN LAGAB TIMES EN*/
+                                           RTUNI_ALPHA, /* U+0121c4: CUNEIFORM SIGN LAGAB TIMES GA*/
+                                           RTUNI_ALPHA, /* U+0121c5: CUNEIFORM SIGN LAGAB TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+0121c6: CUNEIFORM SIGN LAGAB TIMES GUD*/
+                                           RTUNI_ALPHA, /* U+0121c7: CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD*/
+                                           RTUNI_ALPHA, /* U+0121c8: CUNEIFORM SIGN LAGAB TIMES HA*/
+                                           RTUNI_ALPHA, /* U+0121c9: CUNEIFORM SIGN LAGAB TIMES HAL*/
+                                           RTUNI_ALPHA, /* U+0121ca: CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+0121cb: CUNEIFORM SIGN LAGAB TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+0121cc: CUNEIFORM SIGN LAGAB TIMES IM*/
+                                           RTUNI_ALPHA, /* U+0121cd: CUNEIFORM SIGN LAGAB TIMES IM PLUS HA*/
+                                           RTUNI_ALPHA, /* U+0121ce: CUNEIFORM SIGN LAGAB TIMES IM PLUS LU*/
+                                           RTUNI_ALPHA, /* U+0121cf: CUNEIFORM SIGN LAGAB TIMES KI*/
+                                           RTUNI_ALPHA, /* U+0121d0: CUNEIFORM SIGN LAGAB TIMES KIN*/
+                                           RTUNI_ALPHA, /* U+0121d1: CUNEIFORM SIGN LAGAB TIMES KU3*/
+                                           RTUNI_ALPHA, /* U+0121d2: CUNEIFORM SIGN LAGAB TIMES KUL*/
+                                           RTUNI_ALPHA, /* U+0121d3: CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A*/
+                                           RTUNI_ALPHA, /* U+0121d4: CUNEIFORM SIGN LAGAB TIMES LAGAB*/
+                                           RTUNI_ALPHA, /* U+0121d5: CUNEIFORM SIGN LAGAB TIMES LISH*/
+                                           RTUNI_ALPHA, /* U+0121d6: CUNEIFORM SIGN LAGAB TIMES LU*/
+                                           RTUNI_ALPHA, /* U+0121d7: CUNEIFORM SIGN LAGAB TIMES LUL*/
+                                           RTUNI_ALPHA, /* U+0121d8: CUNEIFORM SIGN LAGAB TIMES ME*/
+                                           RTUNI_ALPHA, /* U+0121d9: CUNEIFORM SIGN LAGAB TIMES ME PLUS EN*/
+                                           RTUNI_ALPHA, /* U+0121da: CUNEIFORM SIGN LAGAB TIMES MUSH*/
+                                           RTUNI_ALPHA, /* U+0121db: CUNEIFORM SIGN LAGAB TIMES NE*/
+                                           RTUNI_ALPHA, /* U+0121dc: CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM*/
+                                           RTUNI_ALPHA, /* U+0121dd: CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2*/
+                                           RTUNI_ALPHA, /* U+0121de: CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU*/
+                                           RTUNI_ALPHA, /* U+0121df: CUNEIFORM SIGN LAGAB TIMES SHU2*/
+                                           RTUNI_ALPHA, /* U+0121e0: CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2*/
+                                           RTUNI_ALPHA, /* U+0121e1: CUNEIFORM SIGN LAGAB TIMES SUM*/
+                                           RTUNI_ALPHA, /* U+0121e2: CUNEIFORM SIGN LAGAB TIMES TAG*/
+                                           RTUNI_ALPHA, /* U+0121e3: CUNEIFORM SIGN LAGAB TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+0121e4: CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA*/
+                                           RTUNI_ALPHA, /* U+0121e5: CUNEIFORM SIGN LAGAB TIMES U*/
+                                           RTUNI_ALPHA, /* U+0121e6: CUNEIFORM SIGN LAGAB TIMES U PLUS A*/
+                                           RTUNI_ALPHA, /* U+0121e7: CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U*/
+                                           RTUNI_ALPHA, /* U+0121e8: CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+0121e9: CUNEIFORM SIGN LAGAB TIMES UD*/
+                                           RTUNI_ALPHA, /* U+0121ea: CUNEIFORM SIGN LAGAB TIMES USH*/
+                                           RTUNI_ALPHA, /* U+0121eb: CUNEIFORM SIGN LAGAB SQUARED*/
+                                           RTUNI_ALPHA, /* U+0121ec: CUNEIFORM SIGN LAGAR*/
+                                           RTUNI_ALPHA, /* U+0121ed: CUNEIFORM SIGN LAGAR TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+0121ee: CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM*/
+                                           RTUNI_ALPHA, /* U+0121ef: CUNEIFORM SIGN LAGAR GUNU*/
+                                           RTUNI_ALPHA, /* U+0121f0: CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE*/
+                                           RTUNI_ALPHA, /* U+0121f1: CUNEIFORM SIGN LAHSHU*/
+                                           RTUNI_ALPHA, /* U+0121f2: CUNEIFORM SIGN LAL*/
+                                           RTUNI_ALPHA, /* U+0121f3: CUNEIFORM SIGN LAL TIMES LAL*/
+                                           RTUNI_ALPHA, /* U+0121f4: CUNEIFORM SIGN LAM*/
+                                           RTUNI_ALPHA, /* U+0121f5: CUNEIFORM SIGN LAM TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+0121f6: CUNEIFORM SIGN LAM TIMES KUR PLUS RU*/
+                                           RTUNI_ALPHA, /* U+0121f7: CUNEIFORM SIGN LI*/
+                                           RTUNI_ALPHA, /* U+0121f8: CUNEIFORM SIGN LIL*/
+                                           RTUNI_ALPHA, /* U+0121f9: CUNEIFORM SIGN LIMMU2*/
+                                           RTUNI_ALPHA, /* U+0121fa: CUNEIFORM SIGN LISH*/
+                                           RTUNI_ALPHA, /* U+0121fb: CUNEIFORM SIGN LU*/
+                                           RTUNI_ALPHA, /* U+0121fc: CUNEIFORM SIGN LU TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0121fd: CUNEIFORM SIGN LU2*/
+                                           RTUNI_ALPHA, /* U+0121fe: CUNEIFORM SIGN LU2 TIMES AL*/
+                                           RTUNI_ALPHA, /* U+0121ff: CUNEIFORM SIGN LU2 TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012200: CUNEIFORM SIGN LU2 TIMES ESH2*/
+                                           RTUNI_ALPHA, /* U+012201: CUNEIFORM SIGN LU2 TIMES ESH2 TENU*/
+                                           RTUNI_ALPHA, /* U+012202: CUNEIFORM SIGN LU2 TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012203: CUNEIFORM SIGN LU2 TIMES HI TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012204: CUNEIFORM SIGN LU2 TIMES IM*/
+                                           RTUNI_ALPHA, /* U+012205: CUNEIFORM SIGN LU2 TIMES KAD2*/
+                                           RTUNI_ALPHA, /* U+012206: CUNEIFORM SIGN LU2 TIMES KAD3*/
+                                           RTUNI_ALPHA, /* U+012207: CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+012208: CUNEIFORM SIGN LU2 TIMES KI*/
+                                           RTUNI_ALPHA, /* U+012209: CUNEIFORM SIGN LU2 TIMES LA PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+01220a: CUNEIFORM SIGN LU2 TIMES LAGAB*/
+                                           RTUNI_ALPHA, /* U+01220b: CUNEIFORM SIGN LU2 TIMES ME PLUS EN*/
+                                           RTUNI_ALPHA, /* U+01220c: CUNEIFORM SIGN LU2 TIMES NE*/
+                                           RTUNI_ALPHA, /* U+01220d: CUNEIFORM SIGN LU2 TIMES NU*/
+                                           RTUNI_ALPHA, /* U+01220e: CUNEIFORM SIGN LU2 TIMES SI PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+01220f: CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU*/
+                                           RTUNI_ALPHA, /* U+012210: CUNEIFORM SIGN LU2 TIMES TUG2*/
+                                           RTUNI_ALPHA, /* U+012211: CUNEIFORM SIGN LU2 TENU*/
+                                           RTUNI_ALPHA, /* U+012212: CUNEIFORM SIGN LU2 CROSSING LU2*/
+                                           RTUNI_ALPHA, /* U+012213: CUNEIFORM SIGN LU2 OPPOSING LU2*/
+                                           RTUNI_ALPHA, /* U+012214: CUNEIFORM SIGN LU2 SQUARED*/
+                                           RTUNI_ALPHA, /* U+012215: CUNEIFORM SIGN LU2 SHESHIG*/
+                                           RTUNI_ALPHA, /* U+012216: CUNEIFORM SIGN LU3*/
+                                           RTUNI_ALPHA, /* U+012217: CUNEIFORM SIGN LUGAL*/
+                                           RTUNI_ALPHA, /* U+012218: CUNEIFORM SIGN LUGAL OVER LUGAL*/
+                                           RTUNI_ALPHA, /* U+012219: CUNEIFORM SIGN LUGAL OPPOSING LUGAL*/
+                                           RTUNI_ALPHA, /* U+01221a: CUNEIFORM SIGN LUGAL SHESHIG*/
+                                           RTUNI_ALPHA, /* U+01221b: CUNEIFORM SIGN LUH*/
+                                           RTUNI_ALPHA, /* U+01221c: CUNEIFORM SIGN LUL*/
+                                           RTUNI_ALPHA, /* U+01221d: CUNEIFORM SIGN LUM*/
+                                           RTUNI_ALPHA, /* U+01221e: CUNEIFORM SIGN LUM OVER LUM*/
+                                           RTUNI_ALPHA, /* U+01221f: CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+012220: CUNEIFORM SIGN MA*/
+                                           RTUNI_ALPHA, /* U+012221: CUNEIFORM SIGN MA TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+012222: CUNEIFORM SIGN MA GUNU*/
+                                           RTUNI_ALPHA, /* U+012223: CUNEIFORM SIGN MA2*/
+                                           RTUNI_ALPHA, /* U+012224: CUNEIFORM SIGN MAH*/
+                                           RTUNI_ALPHA, /* U+012225: CUNEIFORM SIGN MAR*/
+                                           RTUNI_ALPHA, /* U+012226: CUNEIFORM SIGN MASH*/
+                                           RTUNI_ALPHA, /* U+012227: CUNEIFORM SIGN MASH2*/
+                                           RTUNI_ALPHA, /* U+012228: CUNEIFORM SIGN ME*/
+                                           RTUNI_ALPHA, /* U+012229: CUNEIFORM SIGN MES*/
+                                           RTUNI_ALPHA, /* U+01222a: CUNEIFORM SIGN MI*/
+                                           RTUNI_ALPHA, /* U+01222b: CUNEIFORM SIGN MIN*/
+                                           RTUNI_ALPHA, /* U+01222c: CUNEIFORM SIGN MU*/
+                                           RTUNI_ALPHA, /* U+01222d: CUNEIFORM SIGN MU OVER MU*/
+                                           RTUNI_ALPHA, /* U+01222e: CUNEIFORM SIGN MUG*/
+                                           RTUNI_ALPHA, /* U+01222f: CUNEIFORM SIGN MUG GUNU*/
+                                           RTUNI_ALPHA, /* U+012230: CUNEIFORM SIGN MUNSUB*/
+                                           RTUNI_ALPHA, /* U+012231: CUNEIFORM SIGN MURGU2*/
+                                           RTUNI_ALPHA, /* U+012232: CUNEIFORM SIGN MUSH*/
+                                           RTUNI_ALPHA, /* U+012233: CUNEIFORM SIGN MUSH TIMES A*/
+                                           RTUNI_ALPHA, /* U+012234: CUNEIFORM SIGN MUSH TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012235: CUNEIFORM SIGN MUSH TIMES ZA*/
+                                           RTUNI_ALPHA, /* U+012236: CUNEIFORM SIGN MUSH OVER MUSH*/
+                                           RTUNI_ALPHA, /* U+012237: CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA*/
+                                           RTUNI_ALPHA, /* U+012238: CUNEIFORM SIGN MUSH CROSSING MUSH*/
+                                           RTUNI_ALPHA, /* U+012239: CUNEIFORM SIGN MUSH3*/
+                                           RTUNI_ALPHA, /* U+01223a: CUNEIFORM SIGN MUSH3 TIMES A*/
+                                           RTUNI_ALPHA, /* U+01223b: CUNEIFORM SIGN MUSH3 TIMES A PLUS DI*/
+                                           RTUNI_ALPHA, /* U+01223c: CUNEIFORM SIGN MUSH3 TIMES DI*/
+                                           RTUNI_ALPHA, /* U+01223d: CUNEIFORM SIGN MUSH3 GUNU*/
+                                           RTUNI_ALPHA, /* U+01223e: CUNEIFORM SIGN NA*/
+                                           RTUNI_ALPHA, /* U+01223f: CUNEIFORM SIGN NA2*/
+                                           RTUNI_ALPHA, /* U+012240: CUNEIFORM SIGN NAGA*/
+                                           RTUNI_ALPHA, /* U+012241: CUNEIFORM SIGN NAGA INVERTED*/
+                                           RTUNI_ALPHA, /* U+012242: CUNEIFORM SIGN NAGA TIMES SHU TENU*/
+                                           RTUNI_ALPHA, /* U+012243: CUNEIFORM SIGN NAGA OPPOSING NAGA*/
+                                           RTUNI_ALPHA, /* U+012244: CUNEIFORM SIGN NAGAR*/
+                                           RTUNI_ALPHA, /* U+012245: CUNEIFORM SIGN NAM NUTILLU*/
+                                           RTUNI_ALPHA, /* U+012246: CUNEIFORM SIGN NAM*/
+                                           RTUNI_ALPHA, /* U+012247: CUNEIFORM SIGN NAM2*/
+                                           RTUNI_ALPHA, /* U+012248: CUNEIFORM SIGN NE*/
+                                           RTUNI_ALPHA, /* U+012249: CUNEIFORM SIGN NE TIMES A*/
+                                           RTUNI_ALPHA, /* U+01224a: CUNEIFORM SIGN NE TIMES UD*/
+                                           RTUNI_ALPHA, /* U+01224b: CUNEIFORM SIGN NE SHESHIG*/
+                                           RTUNI_ALPHA, /* U+01224c: CUNEIFORM SIGN NI*/
+                                           RTUNI_ALPHA, /* U+01224d: CUNEIFORM SIGN NI TIMES E*/
+                                           RTUNI_ALPHA, /* U+01224e: CUNEIFORM SIGN NI2*/
+                                           RTUNI_ALPHA, /* U+01224f: CUNEIFORM SIGN NIM*/
+                                           RTUNI_ALPHA, /* U+012250: CUNEIFORM SIGN NIM TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012251: CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012252: CUNEIFORM SIGN NINDA2*/
+                                           RTUNI_ALPHA, /* U+012253: CUNEIFORM SIGN NINDA2 TIMES AN*/
+                                           RTUNI_ALPHA, /* U+012254: CUNEIFORM SIGN NINDA2 TIMES ASH*/
+                                           RTUNI_ALPHA, /* U+012255: CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+012256: CUNEIFORM SIGN NINDA2 TIMES GUD*/
+                                           RTUNI_ALPHA, /* U+012257: CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+012258: CUNEIFORM SIGN NINDA2 TIMES NE*/
+                                           RTUNI_ALPHA, /* U+012259: CUNEIFORM SIGN NINDA2 TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+01225a: CUNEIFORM SIGN NINDA2 TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+01225b: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN*/
+                                           RTUNI_ALPHA, /* U+01225c: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+01225d: CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+01225e: CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+01225f: CUNEIFORM SIGN NINDA2 TIMES USH*/
+                                           RTUNI_ALPHA, /* U+012260: CUNEIFORM SIGN NISAG*/
+                                           RTUNI_ALPHA, /* U+012261: CUNEIFORM SIGN NU*/
+                                           RTUNI_ALPHA, /* U+012262: CUNEIFORM SIGN NU11*/
+                                           RTUNI_ALPHA, /* U+012263: CUNEIFORM SIGN NUN*/
+                                           RTUNI_ALPHA, /* U+012264: CUNEIFORM SIGN NUN LAGAR TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+012265: CUNEIFORM SIGN NUN LAGAR TIMES MASH*/
+                                           RTUNI_ALPHA, /* U+012266: CUNEIFORM SIGN NUN LAGAR TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+012267: CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+012268: CUNEIFORM SIGN NUN LAGAR TIMES USH*/
+                                           RTUNI_ALPHA, /* U+012269: CUNEIFORM SIGN NUN TENU*/
+                                           RTUNI_ALPHA, /* U+01226a: CUNEIFORM SIGN NUN OVER NUN*/
+                                           RTUNI_ALPHA, /* U+01226b: CUNEIFORM SIGN NUN CROSSING NUN*/
+                                           RTUNI_ALPHA, /* U+01226c: CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR*/
+                                           RTUNI_ALPHA, /* U+01226d: CUNEIFORM SIGN NUNUZ*/
+                                           RTUNI_ALPHA, /* U+01226e: CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB*/
+                                           RTUNI_ALPHA, /* U+01226f: CUNEIFORM SIGN NUNUZ AB2 TIMES BI*/
+                                           RTUNI_ALPHA, /* U+012270: CUNEIFORM SIGN NUNUZ AB2 TIMES DUG*/
+                                           RTUNI_ALPHA, /* U+012271: CUNEIFORM SIGN NUNUZ AB2 TIMES GUD*/
+                                           RTUNI_ALPHA, /* U+012272: CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+012273: CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3*/
+                                           RTUNI_ALPHA, /* U+012274: CUNEIFORM SIGN NUNUZ AB2 TIMES LA*/
+                                           RTUNI_ALPHA, /* U+012275: CUNEIFORM SIGN NUNUZ AB2 TIMES NE*/
+                                           RTUNI_ALPHA, /* U+012276: CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3*/
+                                           RTUNI_ALPHA, /* U+012277: CUNEIFORM SIGN NUNUZ AB2 TIMES U2*/
+                                           RTUNI_ALPHA, /* U+012278: CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI*/
+                                           RTUNI_ALPHA, /* U+012279: CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U*/
+                                           RTUNI_ALPHA, /* U+01227a: CUNEIFORM SIGN PA*/
+                                           RTUNI_ALPHA, /* U+01227b: CUNEIFORM SIGN PAD*/
+                                           RTUNI_ALPHA, /* U+01227c: CUNEIFORM SIGN PAN*/
+                                           RTUNI_ALPHA, /* U+01227d: CUNEIFORM SIGN PAP*/
+                                           RTUNI_ALPHA, /* U+01227e: CUNEIFORM SIGN PESH2*/
+                                           RTUNI_ALPHA, /* U+01227f: CUNEIFORM SIGN PI*/
+                                           RTUNI_ALPHA, /* U+012280: CUNEIFORM SIGN PI TIMES A*/
+                                           RTUNI_ALPHA, /* U+012281: CUNEIFORM SIGN PI TIMES AB*/
+                                           RTUNI_ALPHA, /* U+012282: CUNEIFORM SIGN PI TIMES BI*/
+                                           RTUNI_ALPHA, /* U+012283: CUNEIFORM SIGN PI TIMES BU*/
+                                           RTUNI_ALPHA, /* U+012284: CUNEIFORM SIGN PI TIMES E*/
+                                           RTUNI_ALPHA, /* U+012285: CUNEIFORM SIGN PI TIMES I*/
+                                           RTUNI_ALPHA, /* U+012286: CUNEIFORM SIGN PI TIMES IB*/
+                                           RTUNI_ALPHA, /* U+012287: CUNEIFORM SIGN PI TIMES U*/
+                                           RTUNI_ALPHA, /* U+012288: CUNEIFORM SIGN PI TIMES U2*/
+                                           RTUNI_ALPHA, /* U+012289: CUNEIFORM SIGN PI CROSSING PI*/
+                                           RTUNI_ALPHA, /* U+01228a: CUNEIFORM SIGN PIRIG*/
+                                           RTUNI_ALPHA, /* U+01228b: CUNEIFORM SIGN PIRIG TIMES KAL*/
+                                           RTUNI_ALPHA, /* U+01228c: CUNEIFORM SIGN PIRIG TIMES UD*/
+                                           RTUNI_ALPHA, /* U+01228d: CUNEIFORM SIGN PIRIG TIMES ZA*/
+                                           RTUNI_ALPHA, /* U+01228e: CUNEIFORM SIGN PIRIG OPPOSING PIRIG*/
+                                           RTUNI_ALPHA, /* U+01228f: CUNEIFORM SIGN RA*/
+                                           RTUNI_ALPHA, /* U+012290: CUNEIFORM SIGN RAB*/
+                                           RTUNI_ALPHA, /* U+012291: CUNEIFORM SIGN RI*/
+                                           RTUNI_ALPHA, /* U+012292: CUNEIFORM SIGN RU*/
+                                           RTUNI_ALPHA, /* U+012293: CUNEIFORM SIGN SA*/
+                                           RTUNI_ALPHA, /* U+012294: CUNEIFORM SIGN SAG NUTILLU*/
+                                           RTUNI_ALPHA, /* U+012295: CUNEIFORM SIGN SAG*/
+                                           RTUNI_ALPHA, /* U+012296: CUNEIFORM SIGN SAG TIMES A*/
+                                           RTUNI_ALPHA, /* U+012297: CUNEIFORM SIGN SAG TIMES DU*/
+                                           RTUNI_ALPHA, /* U+012298: CUNEIFORM SIGN SAG TIMES DUB*/
+                                           RTUNI_ALPHA, /* U+012299: CUNEIFORM SIGN SAG TIMES HA*/
+                                           RTUNI_ALPHA, /* U+01229a: CUNEIFORM SIGN SAG TIMES KAK*/
+                                           RTUNI_ALPHA, /* U+01229b: CUNEIFORM SIGN SAG TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+01229c: CUNEIFORM SIGN SAG TIMES LUM*/
+                                           RTUNI_ALPHA, /* U+01229d: CUNEIFORM SIGN SAG TIMES MI*/
+                                           RTUNI_ALPHA, /* U+01229e: CUNEIFORM SIGN SAG TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+01229f: CUNEIFORM SIGN SAG TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+0122a0: CUNEIFORM SIGN SAG TIMES SHID*/
+                                           RTUNI_ALPHA, /* U+0122a1: CUNEIFORM SIGN SAG TIMES TAB*/
+                                           RTUNI_ALPHA, /* U+0122a2: CUNEIFORM SIGN SAG TIMES U2*/
+                                           RTUNI_ALPHA, /* U+0122a3: CUNEIFORM SIGN SAG TIMES UB*/
+                                           RTUNI_ALPHA, /* U+0122a4: CUNEIFORM SIGN SAG TIMES UM*/
+                                           RTUNI_ALPHA, /* U+0122a5: CUNEIFORM SIGN SAG TIMES UR*/
+                                           RTUNI_ALPHA, /* U+0122a6: CUNEIFORM SIGN SAG TIMES USH*/
+                                           RTUNI_ALPHA, /* U+0122a7: CUNEIFORM SIGN SAG OVER SAG*/
+                                           RTUNI_ALPHA, /* U+0122a8: CUNEIFORM SIGN SAG GUNU*/
+                                           RTUNI_ALPHA, /* U+0122a9: CUNEIFORM SIGN SAL*/
+                                           RTUNI_ALPHA, /* U+0122aa: CUNEIFORM SIGN SAL LAGAB TIMES ASH2*/
+                                           RTUNI_ALPHA, /* U+0122ab: CUNEIFORM SIGN SANGA2*/
+                                           RTUNI_ALPHA, /* U+0122ac: CUNEIFORM SIGN SAR*/
+                                           RTUNI_ALPHA, /* U+0122ad: CUNEIFORM SIGN SHA*/
+                                           RTUNI_ALPHA, /* U+0122ae: CUNEIFORM SIGN SHA3*/
+                                           RTUNI_ALPHA, /* U+0122af: CUNEIFORM SIGN SHA3 TIMES A*/
+                                           RTUNI_ALPHA, /* U+0122b0: CUNEIFORM SIGN SHA3 TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+0122b1: CUNEIFORM SIGN SHA3 TIMES GISH*/
+                                           RTUNI_ALPHA, /* U+0122b2: CUNEIFORM SIGN SHA3 TIMES NE*/
+                                           RTUNI_ALPHA, /* U+0122b3: CUNEIFORM SIGN SHA3 TIMES SHU2*/
+                                           RTUNI_ALPHA, /* U+0122b4: CUNEIFORM SIGN SHA3 TIMES TUR*/
+                                           RTUNI_ALPHA, /* U+0122b5: CUNEIFORM SIGN SHA3 TIMES U*/
+                                           RTUNI_ALPHA, /* U+0122b6: CUNEIFORM SIGN SHA3 TIMES U PLUS A*/
+                                           RTUNI_ALPHA, /* U+0122b7: CUNEIFORM SIGN SHA6*/
+                                           RTUNI_ALPHA, /* U+0122b8: CUNEIFORM SIGN SHAB6*/
+                                           RTUNI_ALPHA, /* U+0122b9: CUNEIFORM SIGN SHAR2*/
+                                           RTUNI_ALPHA, /* U+0122ba: CUNEIFORM SIGN SHE*/
+                                           RTUNI_ALPHA, /* U+0122bb: CUNEIFORM SIGN SHE HU*/
+                                           RTUNI_ALPHA, /* U+0122bc: CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+0122bd: CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+0122be: CUNEIFORM SIGN SHEG9*/
+                                           RTUNI_ALPHA, /* U+0122bf: CUNEIFORM SIGN SHEN*/
+                                           RTUNI_ALPHA, /* U+0122c0: CUNEIFORM SIGN SHESH*/
+                                           RTUNI_ALPHA, /* U+0122c1: CUNEIFORM SIGN SHESH2*/
+                                           RTUNI_ALPHA, /* U+0122c2: CUNEIFORM SIGN SHESHLAM*/
+                                           RTUNI_ALPHA, /* U+0122c3: CUNEIFORM SIGN SHID*/
+                                           RTUNI_ALPHA, /* U+0122c4: CUNEIFORM SIGN SHID TIMES A*/
+                                           RTUNI_ALPHA, /* U+0122c5: CUNEIFORM SIGN SHID TIMES IM*/
+                                           RTUNI_ALPHA, /* U+0122c6: CUNEIFORM SIGN SHIM*/
+                                           RTUNI_ALPHA, /* U+0122c7: CUNEIFORM SIGN SHIM TIMES A*/
+                                           RTUNI_ALPHA, /* U+0122c8: CUNEIFORM SIGN SHIM TIMES BAL*/
+                                           RTUNI_ALPHA, /* U+0122c9: CUNEIFORM SIGN SHIM TIMES BULUG*/
+                                           RTUNI_ALPHA, /* U+0122ca: CUNEIFORM SIGN SHIM TIMES DIN*/
+                                           RTUNI_ALPHA, /* U+0122cb: CUNEIFORM SIGN SHIM TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+0122cc: CUNEIFORM SIGN SHIM TIMES IGI*/
+                                           RTUNI_ALPHA, /* U+0122cd: CUNEIFORM SIGN SHIM TIMES IGI GUNU*/
+                                           RTUNI_ALPHA, /* U+0122ce: CUNEIFORM SIGN SHIM TIMES KUSHU2*/
+                                           RTUNI_ALPHA, /* U+0122cf: CUNEIFORM SIGN SHIM TIMES LUL*/
+                                           RTUNI_ALPHA, /* U+0122d0: CUNEIFORM SIGN SHIM TIMES MUG*/
+                                           RTUNI_ALPHA, /* U+0122d1: CUNEIFORM SIGN SHIM TIMES SAL*/
+                                           RTUNI_ALPHA, /* U+0122d2: CUNEIFORM SIGN SHINIG*/
+                                           RTUNI_ALPHA, /* U+0122d3: CUNEIFORM SIGN SHIR*/
+                                           RTUNI_ALPHA, /* U+0122d4: CUNEIFORM SIGN SHIR TENU*/
+                                           RTUNI_ALPHA, /* U+0122d5: CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR*/
+                                           RTUNI_ALPHA, /* U+0122d6: CUNEIFORM SIGN SHITA*/
+                                           RTUNI_ALPHA, /* U+0122d7: CUNEIFORM SIGN SHU*/
+                                           RTUNI_ALPHA, /* U+0122d8: CUNEIFORM SIGN SHU OVER INVERTED SHU*/
+                                           RTUNI_ALPHA, /* U+0122d9: CUNEIFORM SIGN SHU2*/
+                                           RTUNI_ALPHA, /* U+0122da: CUNEIFORM SIGN SHUBUR*/
+                                           RTUNI_ALPHA, /* U+0122db: CUNEIFORM SIGN SI*/
+                                           RTUNI_ALPHA, /* U+0122dc: CUNEIFORM SIGN SI GUNU*/
+                                           RTUNI_ALPHA, /* U+0122dd: CUNEIFORM SIGN SIG*/
+                                           RTUNI_ALPHA, /* U+0122de: CUNEIFORM SIGN SIG4*/
+                                           RTUNI_ALPHA, /* U+0122df: CUNEIFORM SIGN SIG4 OVER SIG4 SHU2*/
+                                           RTUNI_ALPHA, /* U+0122e0: CUNEIFORM SIGN SIK2*/
+                                           RTUNI_ALPHA, /* U+0122e1: CUNEIFORM SIGN SILA3*/
+                                           RTUNI_ALPHA, /* U+0122e2: CUNEIFORM SIGN SU*/
+                                           RTUNI_ALPHA, /* U+0122e3: CUNEIFORM SIGN SU OVER SU*/
+                                           RTUNI_ALPHA, /* U+0122e4: CUNEIFORM SIGN SUD*/
+                                           RTUNI_ALPHA, /* U+0122e5: CUNEIFORM SIGN SUD2*/
+                                           RTUNI_ALPHA, /* U+0122e6: CUNEIFORM SIGN SUHUR*/
+                                           RTUNI_ALPHA, /* U+0122e7: CUNEIFORM SIGN SUM*/
+                                           RTUNI_ALPHA, /* U+0122e8: CUNEIFORM SIGN SUMASH*/
+                                           RTUNI_ALPHA, /* U+0122e9: CUNEIFORM SIGN SUR*/
+                                           RTUNI_ALPHA, /* U+0122ea: CUNEIFORM SIGN SUR9*/
+                                           RTUNI_ALPHA, /* U+0122eb: CUNEIFORM SIGN TA*/
+                                           RTUNI_ALPHA, /* U+0122ec: CUNEIFORM SIGN TA ASTERISK*/
+                                           RTUNI_ALPHA, /* U+0122ed: CUNEIFORM SIGN TA TIMES HI*/
+                                           RTUNI_ALPHA, /* U+0122ee: CUNEIFORM SIGN TA TIMES MI*/
+                                           RTUNI_ALPHA, /* U+0122ef: CUNEIFORM SIGN TA GUNU*/
+                                           RTUNI_ALPHA, /* U+0122f0: CUNEIFORM SIGN TAB*/
+                                           RTUNI_ALPHA, /* U+0122f1: CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH*/
+                                           RTUNI_ALPHA, /* U+0122f2: CUNEIFORM SIGN TAB SQUARED*/
+                                           RTUNI_ALPHA, /* U+0122f3: CUNEIFORM SIGN TAG*/
+                                           RTUNI_ALPHA, /* U+0122f4: CUNEIFORM SIGN TAG TIMES BI*/
+                                           RTUNI_ALPHA, /* U+0122f5: CUNEIFORM SIGN TAG TIMES GUD*/
+                                           RTUNI_ALPHA, /* U+0122f6: CUNEIFORM SIGN TAG TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+0122f7: CUNEIFORM SIGN TAG TIMES SHU*/
+                                           RTUNI_ALPHA, /* U+0122f8: CUNEIFORM SIGN TAG TIMES TUG2*/
+                                           RTUNI_ALPHA, /* U+0122f9: CUNEIFORM SIGN TAG TIMES UD*/
+                                           RTUNI_ALPHA, /* U+0122fa: CUNEIFORM SIGN TAK4*/
+                                           RTUNI_ALPHA, /* U+0122fb: CUNEIFORM SIGN TAR*/
+                                           RTUNI_ALPHA, /* U+0122fc: CUNEIFORM SIGN TE*/
+                                           RTUNI_ALPHA, /* U+0122fd: CUNEIFORM SIGN TE GUNU*/
+                                           RTUNI_ALPHA, /* U+0122fe: CUNEIFORM SIGN TI*/
+                                           RTUNI_ALPHA, /* U+0122ff: CUNEIFORM SIGN TI TENU*/
+                                           RTUNI_ALPHA, /* U+012300: CUNEIFORM SIGN TIL*/
+                                           RTUNI_ALPHA, /* U+012301: CUNEIFORM SIGN TIR*/
+                                           RTUNI_ALPHA, /* U+012302: CUNEIFORM SIGN TIR TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+012303: CUNEIFORM SIGN TIR OVER TIR*/
+                                           RTUNI_ALPHA, /* U+012304: CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+012305: CUNEIFORM SIGN TU*/
+                                           RTUNI_ALPHA, /* U+012306: CUNEIFORM SIGN TUG2*/
+                                           RTUNI_ALPHA, /* U+012307: CUNEIFORM SIGN TUK*/
+                                           RTUNI_ALPHA, /* U+012308: CUNEIFORM SIGN TUM*/
+                                           RTUNI_ALPHA, /* U+012309: CUNEIFORM SIGN TUR*/
+                                           RTUNI_ALPHA, /* U+01230a: CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA*/
+                                           RTUNI_ALPHA, /* U+01230b: CUNEIFORM SIGN U*/
+                                           RTUNI_ALPHA, /* U+01230c: CUNEIFORM SIGN U GUD*/
+                                           RTUNI_ALPHA, /* U+01230d: CUNEIFORM SIGN U U U*/
+                                           RTUNI_ALPHA, /* U+01230e: CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR*/
+                                           RTUNI_ALPHA, /* U+01230f: CUNEIFORM SIGN U OVER U SUR OVER SUR*/
+                                           RTUNI_ALPHA, /* U+012310: CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED*/
+                                           RTUNI_ALPHA, /* U+012311: CUNEIFORM SIGN U2*/
+                                           RTUNI_ALPHA, /* U+012312: CUNEIFORM SIGN UB*/
+                                           RTUNI_ALPHA, /* U+012313: CUNEIFORM SIGN UD*/
+                                           RTUNI_ALPHA, /* U+012314: CUNEIFORM SIGN UD KUSHU2*/
+                                           RTUNI_ALPHA, /* U+012315: CUNEIFORM SIGN UD TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+012316: CUNEIFORM SIGN UD TIMES MI*/
+                                           RTUNI_ALPHA, /* U+012317: CUNEIFORM SIGN UD TIMES U PLUS U PLUS U*/
+                                           RTUNI_ALPHA, /* U+012318: CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU*/
+                                           RTUNI_ALPHA, /* U+012319: CUNEIFORM SIGN UD GUNU*/
+                                           RTUNI_ALPHA, /* U+01231a: CUNEIFORM SIGN UD SHESHIG*/
+                                           RTUNI_ALPHA, /* U+01231b: CUNEIFORM SIGN UD SHESHIG TIMES BAD*/
+                                           RTUNI_ALPHA, /* U+01231c: CUNEIFORM SIGN UDUG*/
+                                           RTUNI_ALPHA, /* U+01231d: CUNEIFORM SIGN UM*/
+                                           RTUNI_ALPHA, /* U+01231e: CUNEIFORM SIGN UM TIMES LAGAB*/
+                                           RTUNI_ALPHA, /* U+01231f: CUNEIFORM SIGN UM TIMES ME PLUS DA*/
+                                           RTUNI_ALPHA, /* U+012320: CUNEIFORM SIGN UM TIMES SHA3*/
+                                           RTUNI_ALPHA, /* U+012321: CUNEIFORM SIGN UM TIMES U*/
+                                           RTUNI_ALPHA, /* U+012322: CUNEIFORM SIGN UMBIN*/
+                                           RTUNI_ALPHA, /* U+012323: CUNEIFORM SIGN UMUM*/
+                                           RTUNI_ALPHA, /* U+012324: CUNEIFORM SIGN UMUM TIMES KASKAL*/
+                                           RTUNI_ALPHA, /* U+012325: CUNEIFORM SIGN UMUM TIMES PA*/
+                                           RTUNI_ALPHA, /* U+012326: CUNEIFORM SIGN UN*/
+                                           RTUNI_ALPHA, /* U+012327: CUNEIFORM SIGN UN GUNU*/
+                                           RTUNI_ALPHA, /* U+012328: CUNEIFORM SIGN UR*/
+                                           RTUNI_ALPHA, /* U+012329: CUNEIFORM SIGN UR CROSSING UR*/
+                                           RTUNI_ALPHA, /* U+01232a: CUNEIFORM SIGN UR SHESHIG*/
+                                           RTUNI_ALPHA, /* U+01232b: CUNEIFORM SIGN UR2*/
+                                           RTUNI_ALPHA, /* U+01232c: CUNEIFORM SIGN UR2 TIMES A PLUS HA*/
+                                           RTUNI_ALPHA, /* U+01232d: CUNEIFORM SIGN UR2 TIMES A PLUS NA*/
+                                           RTUNI_ALPHA, /* U+01232e: CUNEIFORM SIGN UR2 TIMES AL*/
+                                           RTUNI_ALPHA, /* U+01232f: CUNEIFORM SIGN UR2 TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012330: CUNEIFORM SIGN UR2 TIMES NUN*/
+                                           RTUNI_ALPHA, /* U+012331: CUNEIFORM SIGN UR2 TIMES U2*/
+                                           RTUNI_ALPHA, /* U+012332: CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH*/
+                                           RTUNI_ALPHA, /* U+012333: CUNEIFORM SIGN UR2 TIMES U2 PLUS BI*/
+                                           RTUNI_ALPHA, /* U+012334: CUNEIFORM SIGN UR4*/
+                                           RTUNI_ALPHA, /* U+012335: CUNEIFORM SIGN URI*/
+                                           RTUNI_ALPHA, /* U+012336: CUNEIFORM SIGN URI3*/
+                                           RTUNI_ALPHA, /* U+012337: CUNEIFORM SIGN URU*/
+                                           RTUNI_ALPHA, /* U+012338: CUNEIFORM SIGN URU TIMES A*/
+                                           RTUNI_ALPHA, /* U+012339: CUNEIFORM SIGN URU TIMES ASHGAB*/
+                                           RTUNI_ALPHA, /* U+01233a: CUNEIFORM SIGN URU TIMES BAR*/
+                                           RTUNI_ALPHA, /* U+01233b: CUNEIFORM SIGN URU TIMES DUN*/
+                                           RTUNI_ALPHA, /* U+01233c: CUNEIFORM SIGN URU TIMES GA*/
+                                           RTUNI_ALPHA, /* U+01233d: CUNEIFORM SIGN URU TIMES GAL*/
+                                           RTUNI_ALPHA, /* U+01233e: CUNEIFORM SIGN URU TIMES GAN2 TENU*/
+                                           RTUNI_ALPHA, /* U+01233f: CUNEIFORM SIGN URU TIMES GAR*/
+                                           RTUNI_ALPHA, /* U+012340: CUNEIFORM SIGN URU TIMES GU*/
+                                           RTUNI_ALPHA, /* U+012341: CUNEIFORM SIGN URU TIMES HA*/
+                                           RTUNI_ALPHA, /* U+012342: CUNEIFORM SIGN URU TIMES IGI*/
+                                           RTUNI_ALPHA, /* U+012343: CUNEIFORM SIGN URU TIMES IM*/
+                                           RTUNI_ALPHA, /* U+012344: CUNEIFORM SIGN URU TIMES ISH*/
+                                           RTUNI_ALPHA, /* U+012345: CUNEIFORM SIGN URU TIMES KI*/
+                                           RTUNI_ALPHA, /* U+012346: CUNEIFORM SIGN URU TIMES LUM*/
+                                           RTUNI_ALPHA, /* U+012347: CUNEIFORM SIGN URU TIMES MIN*/
+                                           RTUNI_ALPHA, /* U+012348: CUNEIFORM SIGN URU TIMES PA*/
+                                           RTUNI_ALPHA, /* U+012349: CUNEIFORM SIGN URU TIMES SHE*/
+                                           RTUNI_ALPHA, /* U+01234a: CUNEIFORM SIGN URU TIMES SIG4*/
+                                           RTUNI_ALPHA, /* U+01234b: CUNEIFORM SIGN URU TIMES TU*/
+                                           RTUNI_ALPHA, /* U+01234c: CUNEIFORM SIGN URU TIMES U PLUS GUD*/
+                                           RTUNI_ALPHA, /* U+01234d: CUNEIFORM SIGN URU TIMES UD*/
+                                           RTUNI_ALPHA, /* U+01234e: CUNEIFORM SIGN URU TIMES URUDA*/
+                                           RTUNI_ALPHA, /* U+01234f: CUNEIFORM SIGN URUDA*/
+                                           RTUNI_ALPHA, /* U+012350: CUNEIFORM SIGN URUDA TIMES U*/
+                                           RTUNI_ALPHA, /* U+012351: CUNEIFORM SIGN USH*/
+                                           RTUNI_ALPHA, /* U+012352: CUNEIFORM SIGN USH TIMES A*/
+                                           RTUNI_ALPHA, /* U+012353: CUNEIFORM SIGN USH TIMES KU*/
+                                           RTUNI_ALPHA, /* U+012354: CUNEIFORM SIGN USH TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012355: CUNEIFORM SIGN USH TIMES TAK4*/
+                                           RTUNI_ALPHA, /* U+012356: CUNEIFORM SIGN USHX*/
+                                           RTUNI_ALPHA, /* U+012357: CUNEIFORM SIGN USH2*/
+                                           RTUNI_ALPHA, /* U+012358: CUNEIFORM SIGN USHUMX*/
+                                           RTUNI_ALPHA, /* U+012359: CUNEIFORM SIGN UTUKI*/
+                                           RTUNI_ALPHA, /* U+01235a: CUNEIFORM SIGN UZ3*/
+                                           RTUNI_ALPHA, /* U+01235b: CUNEIFORM SIGN UZ3 TIMES KASKAL*/
+                                           RTUNI_ALPHA, /* U+01235c: CUNEIFORM SIGN UZU*/
+                                           RTUNI_ALPHA, /* U+01235d: CUNEIFORM SIGN ZA*/
+                                           RTUNI_ALPHA, /* U+01235e: CUNEIFORM SIGN ZA TENU*/
+                                           RTUNI_ALPHA, /* U+01235f: CUNEIFORM SIGN ZA SQUARED TIMES KUR*/
+                                           RTUNI_ALPHA, /* U+012360: CUNEIFORM SIGN ZAG*/
+                                           RTUNI_ALPHA, /* U+012361: CUNEIFORM SIGN ZAMX*/
+                                           RTUNI_ALPHA, /* U+012362: CUNEIFORM SIGN ZE2*/
+                                           RTUNI_ALPHA, /* U+012363: CUNEIFORM SIGN ZI*/
+                                           RTUNI_ALPHA, /* U+012364: CUNEIFORM SIGN ZI OVER ZI*/
+                                           RTUNI_ALPHA, /* U+012365: CUNEIFORM SIGN ZI3*/
+                                           RTUNI_ALPHA, /* U+012366: CUNEIFORM SIGN ZIB*/
+                                           RTUNI_ALPHA, /* U+012367: CUNEIFORM SIGN ZIB KABA TENU*/
+                                           RTUNI_ALPHA, /* U+012368: CUNEIFORM SIGN ZIG*/
+                                           RTUNI_ALPHA, /* U+012369: CUNEIFORM SIGN ZIZ2*/
+                                           RTUNI_ALPHA, /* U+01236a: CUNEIFORM SIGN ZU*/
+                                           RTUNI_ALPHA, /* U+01236b: CUNEIFORM SIGN ZU5*/
+                                           RTUNI_ALPHA, /* U+01236c: CUNEIFORM SIGN ZU5 TIMES A*/
+                                           RTUNI_ALPHA, /* U+01236d: CUNEIFORM SIGN ZUBUR*/
+                                           RTUNI_ALPHA, /* U+01236e: CUNEIFORM SIGN ZUM*/
+                                                     0, /* U+01236f: */
+                                                     0, /* U+012370: */
+                                                     0, /* U+012371: */
+                                                     0, /* U+012372: */
+                                                     0, /* U+012373: */
+                                                     0, /* U+012374: */
+                                                     0, /* U+012375: */
+                                                     0, /* U+012376: */
+                                                     0, /* U+012377: */
+                                                     0, /* U+012378: */
+                                                     0, /* U+012379: */
+                                                     0, /* U+01237a: */
+                                                     0, /* U+01237b: */
+                                                     0, /* U+01237c: */
+                                                     0, /* U+01237d: */
+                                                     0, /* U+01237e: */
+                                                     0, /* U+01237f: */
+                                                     0, /* U+012380: */
+                                                     0, /* U+012381: */
+                                                     0, /* U+012382: */
+                                                     0, /* U+012383: */
+                                                     0, /* U+012384: */
+                                                     0, /* U+012385: */
+                                                     0, /* U+012386: */
+                                                     0, /* U+012387: */
+                                                     0, /* U+012388: */
+                                                     0, /* U+012389: */
+                                                     0, /* U+01238a: */
+                                                     0, /* U+01238b: */
+                                                     0, /* U+01238c: */
+                                                     0, /* U+01238d: */
+                                                     0, /* U+01238e: */
+                                                     0, /* U+01238f: */
+                                                     0, /* U+012390: */
+                                                     0, /* U+012391: */
+                                                     0, /* U+012392: */
+                                                     0, /* U+012393: */
+                                                     0, /* U+012394: */
+                                                     0, /* U+012395: */
+                                                     0, /* U+012396: */
+                                                     0, /* U+012397: */
+                                                     0, /* U+012398: */
+                                                     0, /* U+012399: */
+                                                     0, /* U+01239a: */
+                                                     0, /* U+01239b: */
+                                                     0, /* U+01239c: */
+                                                     0, /* U+01239d: */
+                                                     0, /* U+01239e: */
+                                                     0, /* U+01239f: */
+                                                     0, /* U+0123a0: */
+                                                     0, /* U+0123a1: */
+                                                     0, /* U+0123a2: */
+                                                     0, /* U+0123a3: */
+                                                     0, /* U+0123a4: */
+                                                     0, /* U+0123a5: */
+                                                     0, /* U+0123a6: */
+                                                     0, /* U+0123a7: */
+                                                     0, /* U+0123a8: */
+                                                     0, /* U+0123a9: */
+                                                     0, /* U+0123aa: */
+                                                     0, /* U+0123ab: */
+                                                     0, /* U+0123ac: */
+                                                     0, /* U+0123ad: */
+                                                     0, /* U+0123ae: */
+                                                     0, /* U+0123af: */
+                                                     0, /* U+0123b0: */
+                                                     0, /* U+0123b1: */
+                                                     0, /* U+0123b2: */
+                                                     0, /* U+0123b3: */
+                                                     0, /* U+0123b4: */
+                                                     0, /* U+0123b5: */
+                                                     0, /* U+0123b6: */
+                                                     0, /* U+0123b7: */
+                                                     0, /* U+0123b8: */
+                                                     0, /* U+0123b9: */
+                                                     0, /* U+0123ba: */
+                                                     0, /* U+0123bb: */
+                                                     0, /* U+0123bc: */
+                                                     0, /* U+0123bd: */
+                                                     0, /* U+0123be: */
+                                                     0, /* U+0123bf: */
+                                                     0, /* U+0123c0: */
+                                                     0, /* U+0123c1: */
+                                                     0, /* U+0123c2: */
+                                                     0, /* U+0123c3: */
+                                                     0, /* U+0123c4: */
+                                                     0, /* U+0123c5: */
+                                                     0, /* U+0123c6: */
+                                                     0, /* U+0123c7: */
+                                                     0, /* U+0123c8: */
+                                                     0, /* U+0123c9: */
+                                                     0, /* U+0123ca: */
+                                                     0, /* U+0123cb: */
+                                                     0, /* U+0123cc: */
+                                                     0, /* U+0123cd: */
+                                                     0, /* U+0123ce: */
+                                                     0, /* U+0123cf: */
+                                                     0, /* U+0123d0: */
+                                                     0, /* U+0123d1: */
+                                                     0, /* U+0123d2: */
+                                                     0, /* U+0123d3: */
+                                                     0, /* U+0123d4: */
+                                                     0, /* U+0123d5: */
+                                                     0, /* U+0123d6: */
+                                                     0, /* U+0123d7: */
+                                                     0, /* U+0123d8: */
+                                                     0, /* U+0123d9: */
+                                                     0, /* U+0123da: */
+                                                     0, /* U+0123db: */
+                                                     0, /* U+0123dc: */
+                                                     0, /* U+0123dd: */
+                                                     0, /* U+0123de: */
+                                                     0, /* U+0123df: */
+                                                     0, /* U+0123e0: */
+                                                     0, /* U+0123e1: */
+                                                     0, /* U+0123e2: */
+                                                     0, /* U+0123e3: */
+                                                     0, /* U+0123e4: */
+                                                     0, /* U+0123e5: */
+                                                     0, /* U+0123e6: */
+                                                     0, /* U+0123e7: */
+                                                     0, /* U+0123e8: */
+                                                     0, /* U+0123e9: */
+                                                     0, /* U+0123ea: */
+                                                     0, /* U+0123eb: */
+                                                     0, /* U+0123ec: */
+                                                     0, /* U+0123ed: */
+                                                     0, /* U+0123ee: */
+                                                     0, /* U+0123ef: */
+                                                     0, /* U+0123f0: */
+                                                     0, /* U+0123f1: */
+                                                     0, /* U+0123f2: */
+                                                     0, /* U+0123f3: */
+                                                     0, /* U+0123f4: */
+                                                     0, /* U+0123f5: */
+                                                     0, /* U+0123f6: */
+                                                     0, /* U+0123f7: */
+                                                     0, /* U+0123f8: */
+                                                     0, /* U+0123f9: */
+                                                     0, /* U+0123fa: */
+                                                     0, /* U+0123fb: */
+                                                     0, /* U+0123fc: */
+                                                     0, /* U+0123fd: */
+                                                     0, /* U+0123fe: */
+                                                     0, /* U+0123ff: */
+                                           RTUNI_ALPHA, /* U+012400: CUNEIFORM NUMERIC SIGN TWO ASH*/
+                                           RTUNI_ALPHA, /* U+012401: CUNEIFORM NUMERIC SIGN THREE ASH*/
+                                           RTUNI_ALPHA, /* U+012402: CUNEIFORM NUMERIC SIGN FOUR ASH*/
+                                           RTUNI_ALPHA, /* U+012403: CUNEIFORM NUMERIC SIGN FIVE ASH*/
+                                           RTUNI_ALPHA, /* U+012404: CUNEIFORM NUMERIC SIGN SIX ASH*/
+                                           RTUNI_ALPHA, /* U+012405: CUNEIFORM NUMERIC SIGN SEVEN ASH*/
+                                           RTUNI_ALPHA, /* U+012406: CUNEIFORM NUMERIC SIGN EIGHT ASH*/
+                                           RTUNI_ALPHA, /* U+012407: CUNEIFORM NUMERIC SIGN NINE ASH*/
+                                           RTUNI_ALPHA, /* U+012408: CUNEIFORM NUMERIC SIGN THREE DISH*/
+                                           RTUNI_ALPHA, /* U+012409: CUNEIFORM NUMERIC SIGN FOUR DISH*/
+                                           RTUNI_ALPHA, /* U+01240a: CUNEIFORM NUMERIC SIGN FIVE DISH*/
+                                           RTUNI_ALPHA, /* U+01240b: CUNEIFORM NUMERIC SIGN SIX DISH*/
+                                           RTUNI_ALPHA, /* U+01240c: CUNEIFORM NUMERIC SIGN SEVEN DISH*/
+                                           RTUNI_ALPHA, /* U+01240d: CUNEIFORM NUMERIC SIGN EIGHT DISH*/
+                                           RTUNI_ALPHA, /* U+01240e: CUNEIFORM NUMERIC SIGN NINE DISH*/
+                                           RTUNI_ALPHA, /* U+01240f: CUNEIFORM NUMERIC SIGN FOUR U*/
+                                           RTUNI_ALPHA, /* U+012410: CUNEIFORM NUMERIC SIGN FIVE U*/
+                                           RTUNI_ALPHA, /* U+012411: CUNEIFORM NUMERIC SIGN SIX U*/
+                                           RTUNI_ALPHA, /* U+012412: CUNEIFORM NUMERIC SIGN SEVEN U*/
+                                           RTUNI_ALPHA, /* U+012413: CUNEIFORM NUMERIC SIGN EIGHT U*/
+                                           RTUNI_ALPHA, /* U+012414: CUNEIFORM NUMERIC SIGN NINE U*/
+                                           RTUNI_ALPHA, /* U+012415: CUNEIFORM NUMERIC SIGN ONE GESH2*/
+                                           RTUNI_ALPHA, /* U+012416: CUNEIFORM NUMERIC SIGN TWO GESH2*/
+                                           RTUNI_ALPHA, /* U+012417: CUNEIFORM NUMERIC SIGN THREE GESH2*/
+                                           RTUNI_ALPHA, /* U+012418: CUNEIFORM NUMERIC SIGN FOUR GESH2*/
+                                           RTUNI_ALPHA, /* U+012419: CUNEIFORM NUMERIC SIGN FIVE GESH2*/
+                                           RTUNI_ALPHA, /* U+01241a: CUNEIFORM NUMERIC SIGN SIX GESH2*/
+                                           RTUNI_ALPHA, /* U+01241b: CUNEIFORM NUMERIC SIGN SEVEN GESH2*/
+                                           RTUNI_ALPHA, /* U+01241c: CUNEIFORM NUMERIC SIGN EIGHT GESH2*/
+                                           RTUNI_ALPHA, /* U+01241d: CUNEIFORM NUMERIC SIGN NINE GESH2*/
+                                           RTUNI_ALPHA, /* U+01241e: CUNEIFORM NUMERIC SIGN ONE GESHU*/
+                                           RTUNI_ALPHA, /* U+01241f: CUNEIFORM NUMERIC SIGN TWO GESHU*/
+                                           RTUNI_ALPHA, /* U+012420: CUNEIFORM NUMERIC SIGN THREE GESHU*/
+                                           RTUNI_ALPHA, /* U+012421: CUNEIFORM NUMERIC SIGN FOUR GESHU*/
+                                           RTUNI_ALPHA, /* U+012422: CUNEIFORM NUMERIC SIGN FIVE GESHU*/
+                                           RTUNI_ALPHA, /* U+012423: CUNEIFORM NUMERIC SIGN TWO SHAR2*/
+                                           RTUNI_ALPHA, /* U+012424: CUNEIFORM NUMERIC SIGN THREE SHAR2*/
+                                           RTUNI_ALPHA, /* U+012425: CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+012426: CUNEIFORM NUMERIC SIGN FOUR SHAR2*/
+                                           RTUNI_ALPHA, /* U+012427: CUNEIFORM NUMERIC SIGN FIVE SHAR2*/
+                                           RTUNI_ALPHA, /* U+012428: CUNEIFORM NUMERIC SIGN SIX SHAR2*/
+                                           RTUNI_ALPHA, /* U+012429: CUNEIFORM NUMERIC SIGN SEVEN SHAR2*/
+                                           RTUNI_ALPHA, /* U+01242a: CUNEIFORM NUMERIC SIGN EIGHT SHAR2*/
+                                           RTUNI_ALPHA, /* U+01242b: CUNEIFORM NUMERIC SIGN NINE SHAR2*/
+                                           RTUNI_ALPHA, /* U+01242c: CUNEIFORM NUMERIC SIGN ONE SHARU*/
+                                           RTUNI_ALPHA, /* U+01242d: CUNEIFORM NUMERIC SIGN TWO SHARU*/
+                                           RTUNI_ALPHA, /* U+01242e: CUNEIFORM NUMERIC SIGN THREE SHARU*/
+                                           RTUNI_ALPHA, /* U+01242f: CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+012430: CUNEIFORM NUMERIC SIGN FOUR SHARU*/
+                                           RTUNI_ALPHA, /* U+012431: CUNEIFORM NUMERIC SIGN FIVE SHARU*/
+                                           RTUNI_ALPHA, /* U+012432: CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH*/
+                                           RTUNI_ALPHA, /* U+012433: CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN*/
+                                           RTUNI_ALPHA, /* U+012434: CUNEIFORM NUMERIC SIGN ONE BURU*/
+                                           RTUNI_ALPHA, /* U+012435: CUNEIFORM NUMERIC SIGN TWO BURU*/
+                                           RTUNI_ALPHA, /* U+012436: CUNEIFORM NUMERIC SIGN THREE BURU*/
+                                           RTUNI_ALPHA, /* U+012437: CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+012438: CUNEIFORM NUMERIC SIGN FOUR BURU*/
+                                           RTUNI_ALPHA, /* U+012439: CUNEIFORM NUMERIC SIGN FIVE BURU*/
+                                           RTUNI_ALPHA, /* U+01243a: CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16*/
+                                           RTUNI_ALPHA, /* U+01243b: CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21*/
+                                           RTUNI_ALPHA, /* U+01243c: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU*/
+                                           RTUNI_ALPHA, /* U+01243d: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4*/
+                                           RTUNI_ALPHA, /* U+01243e: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A*/
+                                           RTUNI_ALPHA, /* U+01243f: CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B*/
+                                           RTUNI_ALPHA, /* U+012440: CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9*/
+                                           RTUNI_ALPHA, /* U+012441: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3*/
+                                           RTUNI_ALPHA, /* U+012442: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A*/
+                                           RTUNI_ALPHA, /* U+012443: CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B*/
+                                           RTUNI_ALPHA, /* U+012444: CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU*/
+                                           RTUNI_ALPHA, /* U+012445: CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3*/
+                                           RTUNI_ALPHA, /* U+012446: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU*/
+                                           RTUNI_ALPHA, /* U+012447: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3*/
+                                           RTUNI_ALPHA, /* U+012448: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4*/
+                                           RTUNI_ALPHA, /* U+012449: CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A*/
+                                           RTUNI_ALPHA, /* U+01244a: CUNEIFORM NUMERIC SIGN TWO ASH TENU*/
+                                           RTUNI_ALPHA, /* U+01244b: CUNEIFORM NUMERIC SIGN THREE ASH TENU*/
+                                           RTUNI_ALPHA, /* U+01244c: CUNEIFORM NUMERIC SIGN FOUR ASH TENU*/
+                                           RTUNI_ALPHA, /* U+01244d: CUNEIFORM NUMERIC SIGN FIVE ASH TENU*/
+                                           RTUNI_ALPHA, /* U+01244e: CUNEIFORM NUMERIC SIGN SIX ASH TENU*/
+                                           RTUNI_ALPHA, /* U+01244f: CUNEIFORM NUMERIC SIGN ONE BAN2*/
+                                           RTUNI_ALPHA, /* U+012450: CUNEIFORM NUMERIC SIGN TWO BAN2*/
+                                           RTUNI_ALPHA, /* U+012451: CUNEIFORM NUMERIC SIGN THREE BAN2*/
+                                           RTUNI_ALPHA, /* U+012452: CUNEIFORM NUMERIC SIGN FOUR BAN2*/
+                                           RTUNI_ALPHA, /* U+012453: CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+012454: CUNEIFORM NUMERIC SIGN FIVE BAN2*/
+                                           RTUNI_ALPHA, /* U+012455: CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM*/
+                                           RTUNI_ALPHA, /* U+012456: CUNEIFORM NUMERIC SIGN NIGIDAMIN*/
+                                           RTUNI_ALPHA, /* U+012457: CUNEIFORM NUMERIC SIGN NIGIDAESH*/
+                                           RTUNI_ALPHA, /* U+012458: CUNEIFORM NUMERIC SIGN ONE ESHE3*/
+                                           RTUNI_ALPHA, /* U+012459: CUNEIFORM NUMERIC SIGN TWO ESHE3*/
+                                           RTUNI_ALPHA, /* U+01245a: CUNEIFORM NUMERIC SIGN ONE THIRD DISH*/
+                                           RTUNI_ALPHA, /* U+01245b: CUNEIFORM NUMERIC SIGN TWO THIRDS DISH*/
+                                           RTUNI_ALPHA, /* U+01245c: CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH*/
+                                           RTUNI_ALPHA, /* U+01245d: CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A*/
+                                           RTUNI_ALPHA, /* U+01245e: CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A*/
+                                           RTUNI_ALPHA, /* U+01245f: CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH*/
+                                           RTUNI_ALPHA, /* U+012460: CUNEIFORM NUMERIC SIGN ONE QUARTER ASH*/
+                                           RTUNI_ALPHA, /* U+012461: CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH*/
+                                           RTUNI_ALPHA, /* U+012462: CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER*/
+                                                     0, /* U+012463: */
+                                                     0, /* U+012464: */
+                                                     0, /* U+012465: */
+                                                     0, /* U+012466: */
+                                                     0, /* U+012467: */
+                                                     0, /* U+012468: */
+                                                     0, /* U+012469: */
+                                                     0, /* U+01246a: */
+                                                     0, /* U+01246b: */
+                                                     0, /* U+01246c: */
+                                                     0, /* U+01246d: */
+                                                     0, /* U+01246e: */
+                                                     0, /* U+01246f: */
+                                                     0, /* U+012470: CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER*/
+                                                     0, /* U+012471: CUNEIFORM PUNCTUATION SIGN VERTICAL COLON*/
+                                                     0, /* U+012472: CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON*/
+                                                     0, /* U+012473: CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON*/
+                                                     0, /* U+012474: */
+                                                     0, /* U+012475: */
+                                                     0, /* U+012476: */
+                                                     0, /* U+012477: */
+                                                     0, /* U+012478: */
+                                                     0, /* U+012479: */
+                                                     0, /* U+01247a: */
+                                                     0, /* U+01247b: */
+                                                     0, /* U+01247c: */
+                                                     0, /* U+01247d: */
+                                                     0, /* U+01247e: */
+                                                     0, /* U+01247f: */
+                                                     0, /* U+012480: */
+                                                     0, /* U+012481: */
+                                                     0, /* U+012482: */
+                                                     0, /* U+012483: */
+                                                     0, /* U+012484: */
+                                                     0, /* U+012485: */
+                                                     0, /* U+012486: */
+                                                     0, /* U+012487: */
+                                                     0, /* U+012488: */
+                                                     0, /* U+012489: */
+                                                     0, /* U+01248a: */
+                                                     0, /* U+01248b: */
+                                                     0, /* U+01248c: */
+                                                     0, /* U+01248d: */
+                                                     0, /* U+01248e: */
+                                                     0, /* U+01248f: */
+                                                     0, /* U+012490: */
+                                                     0, /* U+012491: */
+                                                     0, /* U+012492: */
+                                                     0, /* U+012493: */
+                                                     0, /* U+012494: */
+                                                     0, /* U+012495: */
+                                                     0, /* U+012496: */
+                                                     0, /* U+012497: */
+                                                     0, /* U+012498: */
+                                                     0, /* U+012499: */
+                                                     0, /* U+01249a: */
+                                                     0, /* U+01249b: */
+                                                     0, /* U+01249c: */
+                                                     0, /* U+01249d: */
+                                                     0, /* U+01249e: */
+                                                     0, /* U+01249f: */
+                                                     0, /* U+0124a0: */
+                                                     0, /* U+0124a1: */
+                                                     0, /* U+0124a2: */
+                                                     0, /* U+0124a3: */
+                                                     0, /* U+0124a4: */
+                                                     0, /* U+0124a5: */
+                                                     0, /* U+0124a6: */
+                                                     0, /* U+0124a7: */
+                                                     0, /* U+0124a8: */
+                                                     0, /* U+0124a9: */
+                                                     0, /* U+0124aa: */
+                                                     0, /* U+0124ab: */
+                                                     0, /* U+0124ac: */
+                                                     0, /* U+0124ad: */
+                                                     0, /* U+0124ae: */
+                                                     0, /* U+0124af: */
+                                                     0, /* U+0124b0: */
+                                                     0, /* U+0124b1: */
+                                                     0, /* U+0124b2: */
+                                                     0, /* U+0124b3: */
+                                                     0, /* U+0124b4: */
+                                                     0, /* U+0124b5: */
+                                                     0, /* U+0124b6: */
+                                                     0, /* U+0124b7: */
+                                                     0, /* U+0124b8: */
+                                                     0, /* U+0124b9: */
+                                                     0, /* U+0124ba: */
+                                                     0, /* U+0124bb: */
+                                                     0, /* U+0124bc: */
+                                                     0, /* U+0124bd: */
+                                                     0, /* U+0124be: */
+                                                     0, /* U+0124bf: */
+                                                     0, /* U+0124c0: */
+                                                     0, /* U+0124c1: */
+                                                     0, /* U+0124c2: */
+                                                     0, /* U+0124c3: */
+                                                     0, /* U+0124c4: */
+                                                     0, /* U+0124c5: */
+                                                     0, /* U+0124c6: */
+                                                     0, /* U+0124c7: */
+                                                     0, /* U+0124c8: */
+                                                     0, /* U+0124c9: */
+                                                     0, /* U+0124ca: */
+                                                     0, /* U+0124cb: */
+                                                     0, /* U+0124cc: */
+                                                     0, /* U+0124cd: */
+                                                     0, /* U+0124ce: */
+                                                     0, /* U+0124cf: */
+                                                     0, /* U+0124d0: */
+                                                     0, /* U+0124d1: */
+                                                     0, /* U+0124d2: */
+                                                     0, /* U+0124d3: */
+                                                     0, /* U+0124d4: */
+                                                     0, /* U+0124d5: */
+                                                     0, /* U+0124d6: */
+                                                     0, /* U+0124d7: */
+                                                     0, /* U+0124d8: */
+                                                     0, /* U+0124d9: */
+                                                     0, /* U+0124da: */
+                                                     0, /* U+0124db: */
+                                                     0, /* U+0124dc: */
+                                                     0, /* U+0124dd: */
+                                                     0, /* U+0124de: */
+                                                     0, /* U+0124df: */
+                                                     0, /* U+0124e0: */
+                                                     0, /* U+0124e1: */
+                                                     0, /* U+0124e2: */
+                                                     0, /* U+0124e3: */
+                                                     0, /* U+0124e4: */
+                                                     0, /* U+0124e5: */
+                                                     0, /* U+0124e6: */
+                                                     0, /* U+0124e7: */
+                                                     0, /* U+0124e8: */
+                                                     0, /* U+0124e9: */
+                                                     0, /* U+0124ea: */
+                                                     0, /* U+0124eb: */
+                                                     0, /* U+0124ec: */
+                                                     0, /* U+0124ed: */
+                                                     0, /* U+0124ee: */
+                                                     0, /* U+0124ef: */
+                                                     0, /* U+0124f0: */
+                                                     0, /* U+0124f1: */
+                                                     0, /* U+0124f2: */
+                                                     0, /* U+0124f3: */
+                                                     0, /* U+0124f4: */
+                                                     0, /* U+0124f5: */
+                                                     0, /* U+0124f6: */
+                                                     0, /* U+0124f7: */
+                                                     0, /* U+0124f8: */
+                                                     0, /* U+0124f9: */
+                                                     0, /* U+0124fa: */
+                                                     0, /* U+0124fb: */
+                                                     0, /* U+0124fc: */
+                                                     0, /* U+0124fd: */
+                                                     0, /* U+0124fe: */
+                                                     0, /* U+0124ff: */
+                                                     0, /* U+012500: */
+                                                     0, /* U+012501: */
+                                                     0, /* U+012502: */
+                                                     0, /* U+012503: */
+                                                     0, /* U+012504: */
+                                                     0, /* U+012505: */
+                                                     0, /* U+012506: */
+                                                     0, /* U+012507: */
+                                                     0, /* U+012508: */
+                                                     0, /* U+012509: */
+                                                     0, /* U+01250a: */
+                                                     0, /* U+01250b: */
+                                                     0, /* U+01250c: */
+                                                     0, /* U+01250d: */
+                                                     0, /* U+01250e: */
+                                                     0, /* U+01250f: */
+                                                     0, /* U+012510: */
+                                                     0, /* U+012511: */
+                                                     0, /* U+012512: */
+                                                     0, /* U+012513: */
+                                                     0, /* U+012514: */
+                                                     0, /* U+012515: */
+                                                     0, /* U+012516: */
+                                                     0, /* U+012517: */
+                                                     0, /* U+012518: */
+                                                     0, /* U+012519: */
+                                                     0, /* U+01251a: */
+                                                     0, /* U+01251b: */
+                                                     0, /* U+01251c: */
+                                                     0, /* U+01251d: */
+                                                     0, /* U+01251e: */
+                                                     0, /* U+01251f: */
+                                                     0, /* U+012520: */
+                                                     0, /* U+012521: */
+                                                     0, /* U+012522: */
+                                                     0, /* U+012523: */
+                                                     0, /* U+012524: */
+                                                     0, /* U+012525: */
+                                                     0, /* U+012526: */
+                                                     0, /* U+012527: */
+                                                     0, /* U+012528: */
+                                                     0, /* U+012529: */
+                                                     0, /* U+01252a: */
+                                                     0, /* U+01252b: */
+                                                     0, /* U+01252c: */
+                                                     0, /* U+01252d: */
+                                                     0, /* U+01252e: */
+                                                     0, /* U+01252f: */
+                                                     0, /* U+012530: */
+                                                     0, /* U+012531: */
+                                                     0, /* U+012532: */
+                                                     0, /* U+012533: */
+                                                     0, /* U+012534: */
+                                                     0, /* U+012535: */
+                                                     0, /* U+012536: */
+                                                     0, /* U+012537: */
+                                                     0, /* U+012538: */
+                                                     0, /* U+012539: */
+                                                     0, /* U+01253a: */
+                                                     0, /* U+01253b: */
+                                                     0, /* U+01253c: */
+                                                     0, /* U+01253d: */
+                                                     0, /* U+01253e: */
+                                                     0, /* U+01253f: */
+                                                     0, /* U+012540: */
+                                                     0, /* U+012541: */
+                                                     0, /* U+012542: */
+                                                     0, /* U+012543: */
+                                                     0, /* U+012544: */
+                                                     0, /* U+012545: */
+                                                     0, /* U+012546: */
+                                                     0, /* U+012547: */
+                                                     0, /* U+012548: */
+                                                     0, /* U+012549: */
+                                                     0, /* U+01254a: */
+                                                     0, /* U+01254b: */
+                                                     0, /* U+01254c: */
+                                                     0, /* U+01254d: */
+                                                     0, /* U+01254e: */
+                                                     0, /* U+01254f: */
+                                                     0, /* U+012550: */
+                                                     0, /* U+012551: */
+                                                     0, /* U+012552: */
+                                                     0, /* U+012553: */
+                                                     0, /* U+012554: */
+                                                     0, /* U+012555: */
+                                                     0, /* U+012556: */
+                                                     0, /* U+012557: */
+                                                     0, /* U+012558: */
+                                                     0, /* U+012559: */
+                                                     0, /* U+01255a: */
+                                                     0, /* U+01255b: */
+                                                     0, /* U+01255c: */
+                                                     0, /* U+01255d: */
+                                                     0, /* U+01255e: */
+                                                     0, /* U+01255f: */
+                                                     0, /* U+012560: */
+                                                     0, /* U+012561: */
+                                                     0, /* U+012562: */
+                                                     0, /* U+012563: */
+                                                     0, /* U+012564: */
+                                                     0, /* U+012565: */
+                                                     0, /* U+012566: */
+                                                     0, /* U+012567: */
+                                                     0, /* U+012568: */
+                                                     0, /* U+012569: */
+                                                     0, /* U+01256a: */
+                                                     0, /* U+01256b: */
+                                                     0, /* U+01256c: */
+                                                     0, /* U+01256d: */
+                                                     0, /* U+01256e: */
+                                                     0, /* U+01256f: */
+                                                     0, /* U+012570: */
+                                                     0, /* U+012571: */
+                                                     0, /* U+012572: */
+                                                     0, /* U+012573: */
+                                                     0, /* U+012574: */
+                                                     0, /* U+012575: */
+                                                     0, /* U+012576: */
+                                                     0, /* U+012577: */
+                                                     0, /* U+012578: */
+                                                     0, /* U+012579: */
+                                                     0, /* U+01257a: */
+                                                     0, /* U+01257b: */
+                                                     0, /* U+01257c: */
+                                                     0, /* U+01257d: */
+                                                     0, /* U+01257e: */
+                                                     0, /* U+01257f: */
+                                                     0, /* U+012580: */
+                                                     0, /* U+012581: */
+                                                     0, /* U+012582: */
+                                                     0, /* U+012583: */
+                                                     0, /* U+012584: */
+                                                     0, /* U+012585: */
+                                                     0, /* U+012586: */
+                                                     0, /* U+012587: */
+                                                     0, /* U+012588: */
+                                                     0, /* U+012589: */
+                                                     0, /* U+01258a: */
+                                                     0, /* U+01258b: */
+                                                     0, /* U+01258c: */
+                                                     0, /* U+01258d: */
+                                                     0, /* U+01258e: */
+                                                     0, /* U+01258f: */
+                                                     0, /* U+012590: */
+                                                     0, /* U+012591: */
+                                                     0, /* U+012592: */
+                                                     0, /* U+012593: */
+                                                     0, /* U+012594: */
+                                                     0, /* U+012595: */
+                                                     0, /* U+012596: */
+                                                     0, /* U+012597: */
+                                                     0, /* U+012598: */
+                                                     0, /* U+012599: */
+                                                     0, /* U+01259a: */
+                                                     0, /* U+01259b: */
+                                                     0, /* U+01259c: */
+                                                     0, /* U+01259d: */
+                                                     0, /* U+01259e: */
+                                                     0, /* U+01259f: */
+                                                     0, /* U+0125a0: */
+                                                     0, /* U+0125a1: */
+                                                     0, /* U+0125a2: */
+                                                     0, /* U+0125a3: */
+                                                     0, /* U+0125a4: */
+                                                     0, /* U+0125a5: */
+                                                     0, /* U+0125a6: */
+                                                     0, /* U+0125a7: */
+                                                     0, /* U+0125a8: */
+                                                     0, /* U+0125a9: */
+                                                     0, /* U+0125aa: */
+                                                     0, /* U+0125ab: */
+                                                     0, /* U+0125ac: */
+                                                     0, /* U+0125ad: */
+                                                     0, /* U+0125ae: */
+                                                     0, /* U+0125af: */
+                                                     0, /* U+0125b0: */
+                                                     0, /* U+0125b1: */
+                                                     0, /* U+0125b2: */
+                                                     0, /* U+0125b3: */
+                                                     0, /* U+0125b4: */
+                                                     0, /* U+0125b5: */
+                                                     0, /* U+0125b6: */
+                                                     0, /* U+0125b7: */
+                                                     0, /* U+0125b8: */
+                                                     0, /* U+0125b9: */
+                                                     0, /* U+0125ba: */
+                                                     0, /* U+0125bb: */
+                                                     0, /* U+0125bc: */
+                                                     0, /* U+0125bd: */
+                                                     0, /* U+0125be: */
+                                                     0, /* U+0125bf: */
+                                                     0, /* U+0125c0: */
+                                                     0, /* U+0125c1: */
+                                                     0, /* U+0125c2: */
+                                                     0, /* U+0125c3: */
+                                                     0, /* U+0125c4: */
+                                                     0, /* U+0125c5: */
+                                                     0, /* U+0125c6: */
+                                                     0, /* U+0125c7: */
+                                                     0, /* U+0125c8: */
+                                                     0, /* U+0125c9: */
+                                                     0, /* U+0125ca: */
+                                                     0, /* U+0125cb: */
+                                                     0, /* U+0125cc: */
+                                                     0, /* U+0125cd: */
+                                                     0, /* U+0125ce: */
+                                                     0, /* U+0125cf: */
+                                                     0, /* U+0125d0: */
+                                                     0, /* U+0125d1: */
+                                                     0, /* U+0125d2: */
+                                                     0, /* U+0125d3: */
+                                                     0, /* U+0125d4: */
+                                                     0, /* U+0125d5: */
+                                                     0, /* U+0125d6: */
+                                                     0, /* U+0125d7: */
+                                                     0, /* U+0125d8: */
+                                                     0, /* U+0125d9: */
+                                                     0, /* U+0125da: */
+                                                     0, /* U+0125db: */
+                                                     0, /* U+0125dc: */
+                                                     0, /* U+0125dd: */
+                                                     0, /* U+0125de: */
+                                                     0, /* U+0125df: */
+                                                     0, /* U+0125e0: */
+                                                     0, /* U+0125e1: */
+                                                     0, /* U+0125e2: */
+                                                     0, /* U+0125e3: */
+                                                     0, /* U+0125e4: */
+                                                     0, /* U+0125e5: */
+                                                     0, /* U+0125e6: */
+                                                     0, /* U+0125e7: */
+                                                     0, /* U+0125e8: */
+                                                     0, /* U+0125e9: */
+                                                     0, /* U+0125ea: */
+                                                     0, /* U+0125eb: */
+                                                     0, /* U+0125ec: */
+                                                     0, /* U+0125ed: */
+                                                     0, /* U+0125ee: */
+                                                     0, /* U+0125ef: */
+                                                     0, /* U+0125f0: */
+                                                     0, /* U+0125f1: */
+                                                     0, /* U+0125f2: */
+                                                     0, /* U+0125f3: */
+                                                     0, /* U+0125f4: */
+                                                     0, /* U+0125f5: */
+                                                     0, /* U+0125f6: */
+                                                     0, /* U+0125f7: */
+                                                     0, /* U+0125f8: */
+                                                     0, /* U+0125f9: */
+                                                     0, /* U+0125fa: */
+                                                     0, /* U+0125fb: */
+                                                     0, /* U+0125fc: */
+                                                     0, /* U+0125fd: */
+                                                     0, /* U+0125fe: */
+                                                     0, /* U+0125ff: */
+                                                     0, /* U+012600: */
+                                                     0, /* U+012601: */
+                                                     0, /* U+012602: */
+                                                     0, /* U+012603: */
+                                                     0, /* U+012604: */
+                                                     0, /* U+012605: */
+                                                     0, /* U+012606: */
+                                                     0, /* U+012607: */
+                                                     0, /* U+012608: */
+                                                     0, /* U+012609: */
+                                                     0, /* U+01260a: */
+                                                     0, /* U+01260b: */
+                                                     0, /* U+01260c: */
+                                                     0, /* U+01260d: */
+                                                     0, /* U+01260e: */
+                                                     0, /* U+01260f: */
+                                                     0, /* U+012610: */
+                                                     0, /* U+012611: */
+                                                     0, /* U+012612: */
+                                                     0, /* U+012613: */
+                                                     0, /* U+012614: */
+                                                     0, /* U+012615: */
+                                                     0, /* U+012616: */
+                                                     0, /* U+012617: */
+                                                     0, /* U+012618: */
+                                                     0, /* U+012619: */
+                                                     0, /* U+01261a: */
+                                                     0, /* U+01261b: */
+                                                     0, /* U+01261c: */
+                                                     0, /* U+01261d: */
+                                                     0, /* U+01261e: */
+                                                     0, /* U+01261f: */
+                                                     0, /* U+012620: */
+                                                     0, /* U+012621: */
+                                                     0, /* U+012622: */
+                                                     0, /* U+012623: */
+                                                     0, /* U+012624: */
+                                                     0, /* U+012625: */
+                                                     0, /* U+012626: */
+                                                     0, /* U+012627: */
+                                                     0, /* U+012628: */
+                                                     0, /* U+012629: */
+                                                     0, /* U+01262a: */
+                                                     0, /* U+01262b: */
+                                                     0, /* U+01262c: */
+                                                     0, /* U+01262d: */
+                                                     0, /* U+01262e: */
+                                                     0, /* U+01262f: */
+                                                     0, /* U+012630: */
+                                                     0, /* U+012631: */
+                                                     0, /* U+012632: */
+                                                     0, /* U+012633: */
+                                                     0, /* U+012634: */
+                                                     0, /* U+012635: */
+                                                     0, /* U+012636: */
+                                                     0, /* U+012637: */
+                                                     0, /* U+012638: */
+                                                     0, /* U+012639: */
+                                                     0, /* U+01263a: */
+                                                     0, /* U+01263b: */
+                                                     0, /* U+01263c: */
+                                                     0, /* U+01263d: */
+                                                     0, /* U+01263e: */
+                                                     0, /* U+01263f: */
+                                                     0, /* U+012640: */
+                                                     0, /* U+012641: */
+                                                     0, /* U+012642: */
+                                                     0, /* U+012643: */
+                                                     0, /* U+012644: */
+                                                     0, /* U+012645: */
+                                                     0, /* U+012646: */
+                                                     0, /* U+012647: */
+                                                     0, /* U+012648: */
+                                                     0, /* U+012649: */
+                                                     0, /* U+01264a: */
+                                                     0, /* U+01264b: */
+                                                     0, /* U+01264c: */
+                                                     0, /* U+01264d: */
+                                                     0, /* U+01264e: */
+                                                     0, /* U+01264f: */
+                                                     0, /* U+012650: */
+                                                     0, /* U+012651: */
+                                                     0, /* U+012652: */
+                                                     0, /* U+012653: */
+                                                     0, /* U+012654: */
+                                                     0, /* U+012655: */
+                                                     0, /* U+012656: */
+                                                     0, /* U+012657: */
+                                                     0, /* U+012658: */
+                                                     0, /* U+012659: */
+                                                     0, /* U+01265a: */
+                                                     0, /* U+01265b: */
+                                                     0, /* U+01265c: */
+                                                     0, /* U+01265d: */
+                                                     0, /* U+01265e: */
+                                                     0, /* U+01265f: */
+                                                     0, /* U+012660: */
+                                                     0, /* U+012661: */
+                                                     0, /* U+012662: */
+                                                     0, /* U+012663: */
+                                                     0, /* U+012664: */
+                                                     0, /* U+012665: */
+                                                     0, /* U+012666: */
+                                                     0, /* U+012667: */
+                                                     0, /* U+012668: */
+                                                     0, /* U+012669: */
+                                                     0, /* U+01266a: */
+                                                     0, /* U+01266b: */
+                                                     0, /* U+01266c: */
+                                                     0, /* U+01266d: */
+                                                     0, /* U+01266e: */
+                                                     0, /* U+01266f: */
+                                                     0, /* U+012670: */
+                                                     0, /* U+012671: */
+                                                     0, /* U+012672: */
+                                                     0, /* U+012673: */
+                                                     0, /* U+012674: */
+                                                     0, /* U+012675: */
+                                                     0, /* U+012676: */
+                                                     0, /* U+012677: */
+                                                     0, /* U+012678: */
+                                                     0, /* U+012679: */
+                                                     0, /* U+01267a: */
+                                                     0, /* U+01267b: */
+                                                     0, /* U+01267c: */
+                                                     0, /* U+01267d: */
+                                                     0, /* U+01267e: */
+                                                     0, /* U+01267f: */
+                                                     0, /* U+012680: */
+                                                     0, /* U+012681: */
+                                                     0, /* U+012682: */
+                                                     0, /* U+012683: */
+                                                     0, /* U+012684: */
+                                                     0, /* U+012685: */
+                                                     0, /* U+012686: */
+                                                     0, /* U+012687: */
+                                                     0, /* U+012688: */
+                                                     0, /* U+012689: */
+                                                     0, /* U+01268a: */
+                                                     0, /* U+01268b: */
+                                                     0, /* U+01268c: */
+                                                     0, /* U+01268d: */
+                                                     0, /* U+01268e: */
+                                                     0, /* U+01268f: */
+                                                     0, /* U+012690: */
+                                                     0, /* U+012691: */
+                                                     0, /* U+012692: */
+                                                     0, /* U+012693: */
+                                                     0, /* U+012694: */
+                                                     0, /* U+012695: */
+                                                     0, /* U+012696: */
+                                                     0, /* U+012697: */
+                                                     0, /* U+012698: */
+                                                     0, /* U+012699: */
+                                                     0, /* U+01269a: */
+                                                     0, /* U+01269b: */
+                                                     0, /* U+01269c: */
+                                                     0, /* U+01269d: */
+                                                     0, /* U+01269e: */
+                                                     0, /* U+01269f: */
+                                                     0, /* U+0126a0: */
+                                                     0, /* U+0126a1: */
+                                                     0, /* U+0126a2: */
+                                                     0, /* U+0126a3: */
+                                                     0, /* U+0126a4: */
+                                                     0, /* U+0126a5: */
+                                                     0, /* U+0126a6: */
+                                                     0, /* U+0126a7: */
+                                                     0, /* U+0126a8: */
+                                                     0, /* U+0126a9: */
+                                                     0, /* U+0126aa: */
+                                                     0, /* U+0126ab: */
+                                                     0, /* U+0126ac: */
+                                                     0, /* U+0126ad: */
+                                                     0, /* U+0126ae: */
+                                                     0, /* U+0126af: */
+                                                     0, /* U+0126b0: */
+                                                     0, /* U+0126b1: */
+                                                     0, /* U+0126b2: */
+                                                     0, /* U+0126b3: */
+                                                     0, /* U+0126b4: */
+                                                     0, /* U+0126b5: */
+                                                     0, /* U+0126b6: */
+                                                     0, /* U+0126b7: */
+                                                     0, /* U+0126b8: */
+                                                     0, /* U+0126b9: */
+                                                     0, /* U+0126ba: */
+                                                     0, /* U+0126bb: */
+                                                     0, /* U+0126bc: */
+                                                     0, /* U+0126bd: */
+                                                     0, /* U+0126be: */
+                                                     0, /* U+0126bf: */
+                                                     0, /* U+0126c0: */
+                                                     0, /* U+0126c1: */
+                                                     0, /* U+0126c2: */
+                                                     0, /* U+0126c3: */
+                                                     0, /* U+0126c4: */
+                                                     0, /* U+0126c5: */
+                                                     0, /* U+0126c6: */
+                                                     0, /* U+0126c7: */
+                                                     0, /* U+0126c8: */
+                                                     0, /* U+0126c9: */
+                                                     0, /* U+0126ca: */
+                                                     0, /* U+0126cb: */
+                                                     0, /* U+0126cc: */
+                                                     0, /* U+0126cd: */
+                                                     0, /* U+0126ce: */
+                                                     0, /* U+0126cf: */
+                                                     0, /* U+0126d0: */
+                                                     0, /* U+0126d1: */
+                                                     0, /* U+0126d2: */
+                                                     0, /* U+0126d3: */
+                                                     0, /* U+0126d4: */
+                                                     0, /* U+0126d5: */
+                                                     0, /* U+0126d6: */
+                                                     0, /* U+0126d7: */
+                                                     0, /* U+0126d8: */
+                                                     0, /* U+0126d9: */
+                                                     0, /* U+0126da: */
+                                                     0, /* U+0126db: */
+                                                     0, /* U+0126dc: */
+                                                     0, /* U+0126dd: */
+                                                     0, /* U+0126de: */
+                                                     0, /* U+0126df: */
+                                                     0, /* U+0126e0: */
+                                                     0, /* U+0126e1: */
+                                                     0, /* U+0126e2: */
+                                                     0, /* U+0126e3: */
+                                                     0, /* U+0126e4: */
+                                                     0, /* U+0126e5: */
+                                                     0, /* U+0126e6: */
+                                                     0, /* U+0126e7: */
+                                                     0, /* U+0126e8: */
+                                                     0, /* U+0126e9: */
+                                                     0, /* U+0126ea: */
+                                                     0, /* U+0126eb: */
+                                                     0, /* U+0126ec: */
+                                                     0, /* U+0126ed: */
+                                                     0, /* U+0126ee: */
+                                                     0, /* U+0126ef: */
+                                                     0, /* U+0126f0: */
+                                                     0, /* U+0126f1: */
+                                                     0, /* U+0126f2: */
+                                                     0, /* U+0126f3: */
+                                                     0, /* U+0126f4: */
+                                                     0, /* U+0126f5: */
+                                                     0, /* U+0126f6: */
+                                                     0, /* U+0126f7: */
+                                                     0, /* U+0126f8: */
+                                                     0, /* U+0126f9: */
+                                                     0, /* U+0126fa: */
+                                                     0, /* U+0126fb: */
+                                                     0, /* U+0126fc: */
+                                                     0, /* U+0126fd: */
+                                                     0, /* U+0126fe: */
+                                                     0, /* U+0126ff: */
+                                                     0, /* U+012700: */
+                                                     0, /* U+012701: */
+                                                     0, /* U+012702: */
+                                                     0, /* U+012703: */
+                                                     0, /* U+012704: */
+                                                     0, /* U+012705: */
+                                                     0, /* U+012706: */
+                                                     0, /* U+012707: */
+                                                     0, /* U+012708: */
+                                                     0, /* U+012709: */
+                                                     0, /* U+01270a: */
+                                                     0, /* U+01270b: */
+                                                     0, /* U+01270c: */
+                                                     0, /* U+01270d: */
+                                                     0, /* U+01270e: */
+                                                     0, /* U+01270f: */
+                                                     0, /* U+012710: */
+                                                     0, /* U+012711: */
+                                                     0, /* U+012712: */
+                                                     0, /* U+012713: */
+                                                     0, /* U+012714: */
+                                                     0, /* U+012715: */
+                                                     0, /* U+012716: */
+                                                     0, /* U+012717: */
+                                                     0, /* U+012718: */
+                                                     0, /* U+012719: */
+                                                     0, /* U+01271a: */
+                                                     0, /* U+01271b: */
+                                                     0, /* U+01271c: */
+                                                     0, /* U+01271d: */
+                                                     0, /* U+01271e: */
+                                                     0, /* U+01271f: */
+                                                     0, /* U+012720: */
+                                                     0, /* U+012721: */
+                                                     0, /* U+012722: */
+                                                     0, /* U+012723: */
+                                                     0, /* U+012724: */
+                                                     0, /* U+012725: */
+                                                     0, /* U+012726: */
+                                                     0, /* U+012727: */
+                                                     0, /* U+012728: */
+                                                     0, /* U+012729: */
+                                                     0, /* U+01272a: */
+                                                     0, /* U+01272b: */
+                                                     0, /* U+01272c: */
+                                                     0, /* U+01272d: */
+                                                     0, /* U+01272e: */
+                                                     0, /* U+01272f: */
+                                                     0, /* U+012730: */
+                                                     0, /* U+012731: */
+                                                     0, /* U+012732: */
+                                                     0, /* U+012733: */
+                                                     0, /* U+012734: */
+                                                     0, /* U+012735: */
+                                                     0, /* U+012736: */
+                                                     0, /* U+012737: */
+                                                     0, /* U+012738: */
+                                                     0, /* U+012739: */
+                                                     0, /* U+01273a: */
+                                                     0, /* U+01273b: */
+                                                     0, /* U+01273c: */
+                                                     0, /* U+01273d: */
+                                                     0, /* U+01273e: */
+                                                     0, /* U+01273f: */
+                                                     0, /* U+012740: */
+                                                     0, /* U+012741: */
+                                                     0, /* U+012742: */
+                                                     0, /* U+012743: */
+                                                     0, /* U+012744: */
+                                                     0, /* U+012745: */
+                                                     0, /* U+012746: */
+                                                     0, /* U+012747: */
+                                                     0, /* U+012748: */
+                                                     0, /* U+012749: */
+                                                     0, /* U+01274a: */
+                                                     0, /* U+01274b: */
+                                                     0, /* U+01274c: */
+                                                     0, /* U+01274d: */
+                                                     0, /* U+01274e: */
+                                                     0, /* U+01274f: */
+                                                     0, /* U+012750: */
+                                                     0, /* U+012751: */
+                                                     0, /* U+012752: */
+                                                     0, /* U+012753: */
+                                                     0, /* U+012754: */
+                                                     0, /* U+012755: */
+                                                     0, /* U+012756: */
+                                                     0, /* U+012757: */
+                                                     0, /* U+012758: */
+                                                     0, /* U+012759: */
+                                                     0, /* U+01275a: */
+                                                     0, /* U+01275b: */
+                                                     0, /* U+01275c: */
+                                                     0, /* U+01275d: */
+                                                     0, /* U+01275e: */
+                                                     0, /* U+01275f: */
+                                                     0, /* U+012760: */
+                                                     0, /* U+012761: */
+                                                     0, /* U+012762: */
+                                                     0, /* U+012763: */
+                                                     0, /* U+012764: */
+                                                     0, /* U+012765: */
+                                                     0, /* U+012766: */
+                                                     0, /* U+012767: */
+                                                     0, /* U+012768: */
+                                                     0, /* U+012769: */
+                                                     0, /* U+01276a: */
+                                                     0, /* U+01276b: */
+                                                     0, /* U+01276c: */
+                                                     0, /* U+01276d: */
+                                                     0, /* U+01276e: */
+                                                     0, /* U+01276f: */
+                                                     0, /* U+012770: */
+                                                     0, /* U+012771: */
+                                                     0, /* U+012772: */
+                                                     0, /* U+012773: */
+                                                     0, /* U+012774: */
+                                                     0, /* U+012775: */
+                                                     0, /* U+012776: */
+                                                     0, /* U+012777: */
+                                                     0, /* U+012778: */
+                                                     0, /* U+012779: */
+                                                     0, /* U+01277a: */
+                                                     0, /* U+01277b: */
+                                                     0, /* U+01277c: */
+                                                     0, /* U+01277d: */
+                                                     0, /* U+01277e: */
+                                                     0, /* U+01277f: */
+                                                     0, /* U+012780: */
+                                                     0, /* U+012781: */
+                                                     0, /* U+012782: */
+                                                     0, /* U+012783: */
+                                                     0, /* U+012784: */
+                                                     0, /* U+012785: */
+                                                     0, /* U+012786: */
+                                                     0, /* U+012787: */
+                                                     0, /* U+012788: */
+                                                     0, /* U+012789: */
+                                                     0, /* U+01278a: */
+                                                     0, /* U+01278b: */
+                                                     0, /* U+01278c: */
+                                                     0, /* U+01278d: */
+                                                     0, /* U+01278e: */
+                                                     0, /* U+01278f: */
+                                                     0, /* U+012790: */
+                                                     0, /* U+012791: */
+                                                     0, /* U+012792: */
+                                                     0, /* U+012793: */
+                                                     0, /* U+012794: */
+                                                     0, /* U+012795: */
+                                                     0, /* U+012796: */
+                                                     0, /* U+012797: */
+                                                     0, /* U+012798: */
+                                                     0, /* U+012799: */
+                                                     0, /* U+01279a: */
+                                                     0, /* U+01279b: */
+                                                     0, /* U+01279c: */
+                                                     0, /* U+01279d: */
+                                                     0, /* U+01279e: */
+                                                     0, /* U+01279f: */
+                                                     0, /* U+0127a0: */
+                                                     0, /* U+0127a1: */
+                                                     0, /* U+0127a2: */
+                                                     0, /* U+0127a3: */
+                                                     0, /* U+0127a4: */
+                                                     0, /* U+0127a5: */
+                                                     0, /* U+0127a6: */
+                                                     0, /* U+0127a7: */
+                                                     0, /* U+0127a8: */
+                                                     0, /* U+0127a9: */
+                                                     0, /* U+0127aa: */
+                                                     0, /* U+0127ab: */
+                                                     0, /* U+0127ac: */
+                                                     0, /* U+0127ad: */
+                                                     0, /* U+0127ae: */
+                                                     0, /* U+0127af: */
+                                                     0, /* U+0127b0: */
+                                                     0, /* U+0127b1: */
+                                                     0, /* U+0127b2: */
+                                                     0, /* U+0127b3: */
+                                                     0, /* U+0127b4: */
+                                                     0, /* U+0127b5: */
+                                                     0, /* U+0127b6: */
+                                                     0, /* U+0127b7: */
+                                                     0, /* U+0127b8: */
+                                                     0, /* U+0127b9: */
+                                                     0, /* U+0127ba: */
+                                                     0, /* U+0127bb: */
+                                                     0, /* U+0127bc: */
+                                                     0, /* U+0127bd: */
+                                                     0, /* U+0127be: */
+                                                     0, /* U+0127bf: */
+                                                     0, /* U+0127c0: */
+                                                     0, /* U+0127c1: */
+                                                     0, /* U+0127c2: */
+                                                     0, /* U+0127c3: */
+                                                     0, /* U+0127c4: */
+                                                     0, /* U+0127c5: */
+                                                     0, /* U+0127c6: */
+                                                     0, /* U+0127c7: */
+                                                     0, /* U+0127c8: */
+                                                     0, /* U+0127c9: */
+                                                     0, /* U+0127ca: */
+                                                     0, /* U+0127cb: */
+                                                     0, /* U+0127cc: */
+                                                     0, /* U+0127cd: */
+                                                     0, /* U+0127ce: */
+                                                     0, /* U+0127cf: */
+                                                     0, /* U+0127d0: */
+                                                     0, /* U+0127d1: */
+                                                     0, /* U+0127d2: */
+                                                     0, /* U+0127d3: */
+                                                     0, /* U+0127d4: */
+                                                     0, /* U+0127d5: */
+                                                     0, /* U+0127d6: */
+                                                     0, /* U+0127d7: */
+                                                     0, /* U+0127d8: */
+                                                     0, /* U+0127d9: */
+                                                     0, /* U+0127da: */
+                                                     0, /* U+0127db: */
+                                                     0, /* U+0127dc: */
+                                                     0, /* U+0127dd: */
+                                                     0, /* U+0127de: */
+                                                     0, /* U+0127df: */
+                                                     0, /* U+0127e0: */
+                                                     0, /* U+0127e1: */
+                                                     0, /* U+0127e2: */
+                                                     0, /* U+0127e3: */
+                                                     0, /* U+0127e4: */
+                                                     0, /* U+0127e5: */
+                                                     0, /* U+0127e6: */
+                                                     0, /* U+0127e7: */
+                                                     0, /* U+0127e8: */
+                                                     0, /* U+0127e9: */
+                                                     0, /* U+0127ea: */
+                                                     0, /* U+0127eb: */
+                                                     0, /* U+0127ec: */
+                                                     0, /* U+0127ed: */
+                                                     0, /* U+0127ee: */
+                                                     0, /* U+0127ef: */
+                                                     0, /* U+0127f0: */
+                                                     0, /* U+0127f1: */
+                                                     0, /* U+0127f2: */
+                                                     0, /* U+0127f3: */
+                                                     0, /* U+0127f4: */
+                                                     0, /* U+0127f5: */
+                                                     0, /* U+0127f6: */
+                                                     0, /* U+0127f7: */
+                                                     0, /* U+0127f8: */
+                                                     0, /* U+0127f9: */
+                                                     0, /* U+0127fa: */
+                                                     0, /* U+0127fb: */
+                                                     0, /* U+0127fc: */
+                                                     0, /* U+0127fd: */
+                                                     0, /* U+0127fe: */
+                                                     0, /* U+0127ff: */
+                                                     0, /* U+012800: */
+                                                     0, /* U+012801: */
+                                                     0, /* U+012802: */
+                                                     0, /* U+012803: */
+                                                     0, /* U+012804: */
+                                                     0, /* U+012805: */
+                                                     0, /* U+012806: */
+                                                     0, /* U+012807: */
+                                                     0, /* U+012808: */
+                                                     0, /* U+012809: */
+                                                     0, /* U+01280a: */
+                                                     0, /* U+01280b: */
+                                                     0, /* U+01280c: */
+                                                     0, /* U+01280d: */
+                                                     0, /* U+01280e: */
+                                                     0, /* U+01280f: */
+                                                     0, /* U+012810: */
+                                                     0, /* U+012811: */
+                                                     0, /* U+012812: */
+                                                     0, /* U+012813: */
+                                                     0, /* U+012814: */
+                                                     0, /* U+012815: */
+                                                     0, /* U+012816: */
+                                                     0, /* U+012817: */
+                                                     0, /* U+012818: */
+                                                     0, /* U+012819: */
+                                                     0, /* U+01281a: */
+                                                     0, /* U+01281b: */
+                                                     0, /* U+01281c: */
+                                                     0, /* U+01281d: */
+                                                     0, /* U+01281e: */
+                                                     0, /* U+01281f: */
+                                                     0, /* U+012820: */
+                                                     0, /* U+012821: */
+                                                     0, /* U+012822: */
+                                                     0, /* U+012823: */
+                                                     0, /* U+012824: */
+                                                     0, /* U+012825: */
+                                                     0, /* U+012826: */
+                                                     0, /* U+012827: */
+                                                     0, /* U+012828: */
+                                                     0, /* U+012829: */
+                                                     0, /* U+01282a: */
+                                                     0, /* U+01282b: */
+                                                     0, /* U+01282c: */
+                                                     0, /* U+01282d: */
+                                                     0, /* U+01282e: */
+                                                     0, /* U+01282f: */
+                                                     0, /* U+012830: */
+                                                     0, /* U+012831: */
+                                                     0, /* U+012832: */
+                                                     0, /* U+012833: */
+                                                     0, /* U+012834: */
+                                                     0, /* U+012835: */
+                                                     0, /* U+012836: */
+                                                     0, /* U+012837: */
+                                                     0, /* U+012838: */
+                                                     0, /* U+012839: */
+                                                     0, /* U+01283a: */
+                                                     0, /* U+01283b: */
+                                                     0, /* U+01283c: */
+                                                     0, /* U+01283d: */
+                                                     0, /* U+01283e: */
+                                                     0, /* U+01283f: */
+                                                     0, /* U+012840: */
+                                                     0, /* U+012841: */
+                                                     0, /* U+012842: */
+                                                     0, /* U+012843: */
+                                                     0, /* U+012844: */
+                                                     0, /* U+012845: */
+                                                     0, /* U+012846: */
+                                                     0, /* U+012847: */
+                                                     0, /* U+012848: */
+                                                     0, /* U+012849: */
+                                                     0, /* U+01284a: */
+                                                     0, /* U+01284b: */
+                                                     0, /* U+01284c: */
+                                                     0, /* U+01284d: */
+                                                     0, /* U+01284e: */
+                                                     0, /* U+01284f: */
+                                                     0, /* U+012850: */
+                                                     0, /* U+012851: */
+                                                     0, /* U+012852: */
+                                                     0, /* U+012853: */
+                                                     0, /* U+012854: */
+                                                     0, /* U+012855: */
+                                                     0, /* U+012856: */
+                                                     0, /* U+012857: */
+                                                     0, /* U+012858: */
+                                                     0, /* U+012859: */
+                                                     0, /* U+01285a: */
+                                                     0, /* U+01285b: */
+                                                     0, /* U+01285c: */
+                                                     0, /* U+01285d: */
+                                                     0, /* U+01285e: */
+                                                     0, /* U+01285f: */
+                                                     0, /* U+012860: */
+                                                     0, /* U+012861: */
+                                                     0, /* U+012862: */
+                                                     0, /* U+012863: */
+                                                     0, /* U+012864: */
+                                                     0, /* U+012865: */
+                                                     0, /* U+012866: */
+                                                     0, /* U+012867: */
+                                                     0, /* U+012868: */
+                                                     0, /* U+012869: */
+                                                     0, /* U+01286a: */
+                                                     0, /* U+01286b: */
+                                                     0, /* U+01286c: */
+                                                     0, /* U+01286d: */
+                                                     0, /* U+01286e: */
+                                                     0, /* U+01286f: */
+                                                     0, /* U+012870: */
+                                                     0, /* U+012871: */
+                                                     0, /* U+012872: */
+                                                     0, /* U+012873: */
+                                                     0, /* U+012874: */
+                                                     0, /* U+012875: */
+                                                     0, /* U+012876: */
+                                                     0, /* U+012877: */
+                                                     0, /* U+012878: */
+                                                     0, /* U+012879: */
+                                                     0, /* U+01287a: */
+                                                     0, /* U+01287b: */
+                                                     0, /* U+01287c: */
+                                                     0, /* U+01287d: */
+                                                     0, /* U+01287e: */
+                                                     0, /* U+01287f: */
+                                                     0, /* U+012880: */
+                                                     0, /* U+012881: */
+                                                     0, /* U+012882: */
+                                                     0, /* U+012883: */
+                                                     0, /* U+012884: */
+                                                     0, /* U+012885: */
+                                                     0, /* U+012886: */
+                                                     0, /* U+012887: */
+                                                     0, /* U+012888: */
+                                                     0, /* U+012889: */
+                                                     0, /* U+01288a: */
+                                                     0, /* U+01288b: */
+                                                     0, /* U+01288c: */
+                                                     0, /* U+01288d: */
+                                                     0, /* U+01288e: */
+                                                     0, /* U+01288f: */
+                                                     0, /* U+012890: */
+                                                     0, /* U+012891: */
+                                                     0, /* U+012892: */
+                                                     0, /* U+012893: */
+                                                     0, /* U+012894: */
+                                                     0, /* U+012895: */
+                                                     0, /* U+012896: */
+                                                     0, /* U+012897: */
+                                                     0, /* U+012898: */
+                                                     0, /* U+012899: */
+                                                     0, /* U+01289a: */
+                                                     0, /* U+01289b: */
+                                                     0, /* U+01289c: */
+                                                     0, /* U+01289d: */
+                                                     0, /* U+01289e: */
+                                                     0, /* U+01289f: */
+                                                     0, /* U+0128a0: */
+                                                     0, /* U+0128a1: */
+                                                     0, /* U+0128a2: */
+                                                     0, /* U+0128a3: */
+                                                     0, /* U+0128a4: */
+                                                     0, /* U+0128a5: */
+                                                     0, /* U+0128a6: */
+                                                     0, /* U+0128a7: */
+                                                     0, /* U+0128a8: */
+                                                     0, /* U+0128a9: */
+                                                     0, /* U+0128aa: */
+                                                     0, /* U+0128ab: */
+                                                     0, /* U+0128ac: */
+                                                     0, /* U+0128ad: */
+                                                     0, /* U+0128ae: */
+                                                     0, /* U+0128af: */
+                                                     0, /* U+0128b0: */
+                                                     0, /* U+0128b1: */
+                                                     0, /* U+0128b2: */
+                                                     0, /* U+0128b3: */
+                                                     0, /* U+0128b4: */
+                                                     0, /* U+0128b5: */
+                                                     0, /* U+0128b6: */
+                                                     0, /* U+0128b7: */
+                                                     0, /* U+0128b8: */
+                                                     0, /* U+0128b9: */
+                                                     0, /* U+0128ba: */
+                                                     0, /* U+0128bb: */
+                                                     0, /* U+0128bc: */
+                                                     0, /* U+0128bd: */
+                                                     0, /* U+0128be: */
+                                                     0, /* U+0128bf: */
+                                                     0, /* U+0128c0: */
+                                                     0, /* U+0128c1: */
+                                                     0, /* U+0128c2: */
+                                                     0, /* U+0128c3: */
+                                                     0, /* U+0128c4: */
+                                                     0, /* U+0128c5: */
+                                                     0, /* U+0128c6: */
+                                                     0, /* U+0128c7: */
+                                                     0, /* U+0128c8: */
+                                                     0, /* U+0128c9: */
+                                                     0, /* U+0128ca: */
+                                                     0, /* U+0128cb: */
+                                                     0, /* U+0128cc: */
+                                                     0, /* U+0128cd: */
+                                                     0, /* U+0128ce: */
+                                                     0, /* U+0128cf: */
+                                                     0, /* U+0128d0: */
+                                                     0, /* U+0128d1: */
+                                                     0, /* U+0128d2: */
+                                                     0, /* U+0128d3: */
+                                                     0, /* U+0128d4: */
+                                                     0, /* U+0128d5: */
+                                                     0, /* U+0128d6: */
+                                                     0, /* U+0128d7: */
+                                                     0, /* U+0128d8: */
+                                                     0, /* U+0128d9: */
+                                                     0, /* U+0128da: */
+                                                     0, /* U+0128db: */
+                                                     0, /* U+0128dc: */
+                                                     0, /* U+0128dd: */
+                                                     0, /* U+0128de: */
+                                                     0, /* U+0128df: */
+                                                     0, /* U+0128e0: */
+                                                     0, /* U+0128e1: */
+                                                     0, /* U+0128e2: */
+                                                     0, /* U+0128e3: */
+                                                     0, /* U+0128e4: */
+                                                     0, /* U+0128e5: */
+                                                     0, /* U+0128e6: */
+                                                     0, /* U+0128e7: */
+                                                     0, /* U+0128e8: */
+                                                     0, /* U+0128e9: */
+                                                     0, /* U+0128ea: */
+                                                     0, /* U+0128eb: */
+                                                     0, /* U+0128ec: */
+                                                     0, /* U+0128ed: */
+                                                     0, /* U+0128ee: */
+                                                     0, /* U+0128ef: */
+                                                     0, /* U+0128f0: */
+                                                     0, /* U+0128f1: */
+                                                     0, /* U+0128f2: */
+                                                     0, /* U+0128f3: */
+                                                     0, /* U+0128f4: */
+                                                     0, /* U+0128f5: */
+                                                     0, /* U+0128f6: */
+                                                     0, /* U+0128f7: */
+                                                     0, /* U+0128f8: */
+                                                     0, /* U+0128f9: */
+                                                     0, /* U+0128fa: */
+                                                     0, /* U+0128fb: */
+                                                     0, /* U+0128fc: */
+                                                     0, /* U+0128fd: */
+                                                     0, /* U+0128fe: */
+                                                     0, /* U+0128ff: */
+                                                     0, /* U+012900: */
+                                                     0, /* U+012901: */
+                                                     0, /* U+012902: */
+                                                     0, /* U+012903: */
+                                                     0, /* U+012904: */
+                                                     0, /* U+012905: */
+                                                     0, /* U+012906: */
+                                                     0, /* U+012907: */
+                                                     0, /* U+012908: */
+                                                     0, /* U+012909: */
+                                                     0, /* U+01290a: */
+                                                     0, /* U+01290b: */
+                                                     0, /* U+01290c: */
+                                                     0, /* U+01290d: */
+                                                     0, /* U+01290e: */
+                                                     0, /* U+01290f: */
+                                                     0, /* U+012910: */
+                                                     0, /* U+012911: */
+                                                     0, /* U+012912: */
+                                                     0, /* U+012913: */
+                                                     0, /* U+012914: */
+                                                     0, /* U+012915: */
+                                                     0, /* U+012916: */
+                                                     0, /* U+012917: */
+                                                     0, /* U+012918: */
+                                                     0, /* U+012919: */
+                                                     0, /* U+01291a: */
+                                                     0, /* U+01291b: */
+                                                     0, /* U+01291c: */
+                                                     0, /* U+01291d: */
+                                                     0, /* U+01291e: */
+                                                     0, /* U+01291f: */
+                                                     0, /* U+012920: */
+                                                     0, /* U+012921: */
+                                                     0, /* U+012922: */
+                                                     0, /* U+012923: */
+                                                     0, /* U+012924: */
+                                                     0, /* U+012925: */
+                                                     0, /* U+012926: */
+                                                     0, /* U+012927: */
+                                                     0, /* U+012928: */
+                                                     0, /* U+012929: */
+                                                     0, /* U+01292a: */
+                                                     0, /* U+01292b: */
+                                                     0, /* U+01292c: */
+                                                     0, /* U+01292d: */
+                                                     0, /* U+01292e: */
+                                                     0, /* U+01292f: */
+                                                     0, /* U+012930: */
+                                                     0, /* U+012931: */
+                                                     0, /* U+012932: */
+                                                     0, /* U+012933: */
+                                                     0, /* U+012934: */
+                                                     0, /* U+012935: */
+                                                     0, /* U+012936: */
+                                                     0, /* U+012937: */
+                                                     0, /* U+012938: */
+                                                     0, /* U+012939: */
+                                                     0, /* U+01293a: */
+                                                     0, /* U+01293b: */
+                                                     0, /* U+01293c: */
+                                                     0, /* U+01293d: */
+                                                     0, /* U+01293e: */
+                                                     0, /* U+01293f: */
+                                                     0, /* U+012940: */
+                                                     0, /* U+012941: */
+                                                     0, /* U+012942: */
+                                                     0, /* U+012943: */
+                                                     0, /* U+012944: */
+                                                     0, /* U+012945: */
+                                                     0, /* U+012946: */
+                                                     0, /* U+012947: */
+                                                     0, /* U+012948: */
+                                                     0, /* U+012949: */
+                                                     0, /* U+01294a: */
+                                                     0, /* U+01294b: */
+                                                     0, /* U+01294c: */
+                                                     0, /* U+01294d: */
+                                                     0, /* U+01294e: */
+                                                     0, /* U+01294f: */
+                                                     0, /* U+012950: */
+                                                     0, /* U+012951: */
+                                                     0, /* U+012952: */
+                                                     0, /* U+012953: */
+                                                     0, /* U+012954: */
+                                                     0, /* U+012955: */
+                                                     0, /* U+012956: */
+                                                     0, /* U+012957: */
+                                                     0, /* U+012958: */
+                                                     0, /* U+012959: */
+                                                     0, /* U+01295a: */
+                                                     0, /* U+01295b: */
+                                                     0, /* U+01295c: */
+                                                     0, /* U+01295d: */
+                                                     0, /* U+01295e: */
+                                                     0, /* U+01295f: */
+                                                     0, /* U+012960: */
+                                                     0, /* U+012961: */
+                                                     0, /* U+012962: */
+                                                     0, /* U+012963: */
+                                                     0, /* U+012964: */
+                                                     0, /* U+012965: */
+                                                     0, /* U+012966: */
+                                                     0, /* U+012967: */
+                                                     0, /* U+012968: */
+                                                     0, /* U+012969: */
+                                                     0, /* U+01296a: */
+                                                     0, /* U+01296b: */
+                                                     0, /* U+01296c: */
+                                                     0, /* U+01296d: */
+                                                     0, /* U+01296e: */
+                                                     0, /* U+01296f: */
+                                                     0, /* U+012970: */
+                                                     0, /* U+012971: */
+                                                     0, /* U+012972: */
+                                                     0, /* U+012973: */
+                                                     0, /* U+012974: */
+                                                     0, /* U+012975: */
+                                                     0, /* U+012976: */
+                                                     0, /* U+012977: */
+                                                     0, /* U+012978: */
+                                                     0, /* U+012979: */
+                                                     0, /* U+01297a: */
+                                                     0, /* U+01297b: */
+                                                     0, /* U+01297c: */
+                                                     0, /* U+01297d: */
+                                                     0, /* U+01297e: */
+                                                     0, /* U+01297f: */
+                                                     0, /* U+012980: */
+                                                     0, /* U+012981: */
+                                                     0, /* U+012982: */
+                                                     0, /* U+012983: */
+                                                     0, /* U+012984: */
+                                                     0, /* U+012985: */
+                                                     0, /* U+012986: */
+                                                     0, /* U+012987: */
+                                                     0, /* U+012988: */
+                                                     0, /* U+012989: */
+                                                     0, /* U+01298a: */
+                                                     0, /* U+01298b: */
+                                                     0, /* U+01298c: */
+                                                     0, /* U+01298d: */
+                                                     0, /* U+01298e: */
+                                                     0, /* U+01298f: */
+                                                     0, /* U+012990: */
+                                                     0, /* U+012991: */
+                                                     0, /* U+012992: */
+                                                     0, /* U+012993: */
+                                                     0, /* U+012994: */
+                                                     0, /* U+012995: */
+                                                     0, /* U+012996: */
+                                                     0, /* U+012997: */
+                                                     0, /* U+012998: */
+                                                     0, /* U+012999: */
+                                                     0, /* U+01299a: */
+                                                     0, /* U+01299b: */
+                                                     0, /* U+01299c: */
+                                                     0, /* U+01299d: */
+                                                     0, /* U+01299e: */
+                                                     0, /* U+01299f: */
+                                                     0, /* U+0129a0: */
+                                                     0, /* U+0129a1: */
+                                                     0, /* U+0129a2: */
+                                                     0, /* U+0129a3: */
+                                                     0, /* U+0129a4: */
+                                                     0, /* U+0129a5: */
+                                                     0, /* U+0129a6: */
+                                                     0, /* U+0129a7: */
+                                                     0, /* U+0129a8: */
+                                                     0, /* U+0129a9: */
+                                                     0, /* U+0129aa: */
+                                                     0, /* U+0129ab: */
+                                                     0, /* U+0129ac: */
+                                                     0, /* U+0129ad: */
+                                                     0, /* U+0129ae: */
+                                                     0, /* U+0129af: */
+                                                     0, /* U+0129b0: */
+                                                     0, /* U+0129b1: */
+                                                     0, /* U+0129b2: */
+                                                     0, /* U+0129b3: */
+                                                     0, /* U+0129b4: */
+                                                     0, /* U+0129b5: */
+                                                     0, /* U+0129b6: */
+                                                     0, /* U+0129b7: */
+                                                     0, /* U+0129b8: */
+                                                     0, /* U+0129b9: */
+                                                     0, /* U+0129ba: */
+                                                     0, /* U+0129bb: */
+                                                     0, /* U+0129bc: */
+                                                     0, /* U+0129bd: */
+                                                     0, /* U+0129be: */
+                                                     0, /* U+0129bf: */
+                                                     0, /* U+0129c0: */
+                                                     0, /* U+0129c1: */
+                                                     0, /* U+0129c2: */
+                                                     0, /* U+0129c3: */
+                                                     0, /* U+0129c4: */
+                                                     0, /* U+0129c5: */
+                                                     0, /* U+0129c6: */
+                                                     0, /* U+0129c7: */
+                                                     0, /* U+0129c8: */
+                                                     0, /* U+0129c9: */
+                                                     0, /* U+0129ca: */
+                                                     0, /* U+0129cb: */
+                                                     0, /* U+0129cc: */
+                                                     0, /* U+0129cd: */
+                                                     0, /* U+0129ce: */
+                                                     0, /* U+0129cf: */
+                                                     0, /* U+0129d0: */
+                                                     0, /* U+0129d1: */
+                                                     0, /* U+0129d2: */
+                                                     0, /* U+0129d3: */
+                                                     0, /* U+0129d4: */
+                                                     0, /* U+0129d5: */
+                                                     0, /* U+0129d6: */
+                                                     0, /* U+0129d7: */
+                                                     0, /* U+0129d8: */
+                                                     0, /* U+0129d9: */
+                                                     0, /* U+0129da: */
+                                                     0, /* U+0129db: */
+                                                     0, /* U+0129dc: */
+                                                     0, /* U+0129dd: */
+                                                     0, /* U+0129de: */
+                                                     0, /* U+0129df: */
+                                                     0, /* U+0129e0: */
+                                                     0, /* U+0129e1: */
+                                                     0, /* U+0129e2: */
+                                                     0, /* U+0129e3: */
+                                                     0, /* U+0129e4: */
+                                                     0, /* U+0129e5: */
+                                                     0, /* U+0129e6: */
+                                                     0, /* U+0129e7: */
+                                                     0, /* U+0129e8: */
+                                                     0, /* U+0129e9: */
+                                                     0, /* U+0129ea: */
+                                                     0, /* U+0129eb: */
+                                                     0, /* U+0129ec: */
+                                                     0, /* U+0129ed: */
+                                                     0, /* U+0129ee: */
+                                                     0, /* U+0129ef: */
+                                                     0, /* U+0129f0: */
+                                                     0, /* U+0129f1: */
+                                                     0, /* U+0129f2: */
+                                                     0, /* U+0129f3: */
+                                                     0, /* U+0129f4: */
+                                                     0, /* U+0129f5: */
+                                                     0, /* U+0129f6: */
+                                                     0, /* U+0129f7: */
+                                                     0, /* U+0129f8: */
+                                                     0, /* U+0129f9: */
+                                                     0, /* U+0129fa: */
+                                                     0, /* U+0129fb: */
+                                                     0, /* U+0129fc: */
+                                                     0, /* U+0129fd: */
+                                                     0, /* U+0129fe: */
+                                                     0, /* U+0129ff: */
+                                                     0, /* U+012a00: */
+                                                     0, /* U+012a01: */
+                                                     0, /* U+012a02: */
+                                                     0, /* U+012a03: */
+                                                     0, /* U+012a04: */
+                                                     0, /* U+012a05: */
+                                                     0, /* U+012a06: */
+                                                     0, /* U+012a07: */
+                                                     0, /* U+012a08: */
+                                                     0, /* U+012a09: */
+                                                     0, /* U+012a0a: */
+                                                     0, /* U+012a0b: */
+                                                     0, /* U+012a0c: */
+                                                     0, /* U+012a0d: */
+                                                     0, /* U+012a0e: */
+                                                     0, /* U+012a0f: */
+                                                     0, /* U+012a10: */
+                                                     0, /* U+012a11: */
+                                                     0, /* U+012a12: */
+                                                     0, /* U+012a13: */
+                                                     0, /* U+012a14: */
+                                                     0, /* U+012a15: */
+                                                     0, /* U+012a16: */
+                                                     0, /* U+012a17: */
+                                                     0, /* U+012a18: */
+                                                     0, /* U+012a19: */
+                                                     0, /* U+012a1a: */
+                                                     0, /* U+012a1b: */
+                                                     0, /* U+012a1c: */
+                                                     0, /* U+012a1d: */
+                                                     0, /* U+012a1e: */
+                                                     0, /* U+012a1f: */
+                                                     0, /* U+012a20: */
+                                                     0, /* U+012a21: */
+                                                     0, /* U+012a22: */
+                                                     0, /* U+012a23: */
+                                                     0, /* U+012a24: */
+                                                     0, /* U+012a25: */
+                                                     0, /* U+012a26: */
+                                                     0, /* U+012a27: */
+                                                     0, /* U+012a28: */
+                                                     0, /* U+012a29: */
+                                                     0, /* U+012a2a: */
+                                                     0, /* U+012a2b: */
+                                                     0, /* U+012a2c: */
+                                                     0, /* U+012a2d: */
+                                                     0, /* U+012a2e: */
+                                                     0, /* U+012a2f: */
+                                                     0, /* U+012a30: */
+                                                     0, /* U+012a31: */
+                                                     0, /* U+012a32: */
+                                                     0, /* U+012a33: */
+                                                     0, /* U+012a34: */
+                                                     0, /* U+012a35: */
+                                                     0, /* U+012a36: */
+                                                     0, /* U+012a37: */
+                                                     0, /* U+012a38: */
+                                                     0, /* U+012a39: */
+                                                     0, /* U+012a3a: */
+                                                     0, /* U+012a3b: */
+                                                     0, /* U+012a3c: */
+                                                     0, /* U+012a3d: */
+                                                     0, /* U+012a3e: */
+                                                     0, /* U+012a3f: */
+                                                     0, /* U+012a40: */
+                                                     0, /* U+012a41: */
+                                                     0, /* U+012a42: */
+                                                     0, /* U+012a43: */
+                                                     0, /* U+012a44: */
+                                                     0, /* U+012a45: */
+                                                     0, /* U+012a46: */
+                                                     0, /* U+012a47: */
+                                                     0, /* U+012a48: */
+                                                     0, /* U+012a49: */
+                                                     0, /* U+012a4a: */
+                                                     0, /* U+012a4b: */
+                                                     0, /* U+012a4c: */
+                                                     0, /* U+012a4d: */
+                                                     0, /* U+012a4e: */
+                                                     0, /* U+012a4f: */
+                                                     0, /* U+012a50: */
+                                                     0, /* U+012a51: */
+                                                     0, /* U+012a52: */
+                                                     0, /* U+012a53: */
+                                                     0, /* U+012a54: */
+                                                     0, /* U+012a55: */
+                                                     0, /* U+012a56: */
+                                                     0, /* U+012a57: */
+                                                     0, /* U+012a58: */
+                                                     0, /* U+012a59: */
+                                                     0, /* U+012a5a: */
+                                                     0, /* U+012a5b: */
+                                                     0, /* U+012a5c: */
+                                                     0, /* U+012a5d: */
+                                                     0, /* U+012a5e: */
+                                                     0, /* U+012a5f: */
+                                                     0, /* U+012a60: */
+                                                     0, /* U+012a61: */
+                                                     0, /* U+012a62: */
+                                                     0, /* U+012a63: */
+                                                     0, /* U+012a64: */
+                                                     0, /* U+012a65: */
+                                                     0, /* U+012a66: */
+                                                     0, /* U+012a67: */
+                                                     0, /* U+012a68: */
+                                                     0, /* U+012a69: */
+                                                     0, /* U+012a6a: */
+                                                     0, /* U+012a6b: */
+                                                     0, /* U+012a6c: */
+                                                     0, /* U+012a6d: */
+                                                     0, /* U+012a6e: */
+                                                     0, /* U+012a6f: */
+                                                     0, /* U+012a70: */
+                                                     0, /* U+012a71: */
+                                                     0, /* U+012a72: */
+                                                     0, /* U+012a73: */
+                                                     0, /* U+012a74: */
+                                                     0, /* U+012a75: */
+                                                     0, /* U+012a76: */
+                                                     0, /* U+012a77: */
+                                                     0, /* U+012a78: */
+                                                     0, /* U+012a79: */
+                                                     0, /* U+012a7a: */
+                                                     0, /* U+012a7b: */
+                                                     0, /* U+012a7c: */
+                                                     0, /* U+012a7d: */
+                                                     0, /* U+012a7e: */
+                                                     0, /* U+012a7f: */
+                                                     0, /* U+012a80: */
+                                                     0, /* U+012a81: */
+                                                     0, /* U+012a82: */
+                                                     0, /* U+012a83: */
+                                                     0, /* U+012a84: */
+                                                     0, /* U+012a85: */
+                                                     0, /* U+012a86: */
+                                                     0, /* U+012a87: */
+                                                     0, /* U+012a88: */
+                                                     0, /* U+012a89: */
+                                                     0, /* U+012a8a: */
+                                                     0, /* U+012a8b: */
+                                                     0, /* U+012a8c: */
+                                                     0, /* U+012a8d: */
+                                                     0, /* U+012a8e: */
+                                                     0, /* U+012a8f: */
+                                                     0, /* U+012a90: */
+                                                     0, /* U+012a91: */
+                                                     0, /* U+012a92: */
+                                                     0, /* U+012a93: */
+                                                     0, /* U+012a94: */
+                                                     0, /* U+012a95: */
+                                                     0, /* U+012a96: */
+                                                     0, /* U+012a97: */
+                                                     0, /* U+012a98: */
+                                                     0, /* U+012a99: */
+                                                     0, /* U+012a9a: */
+                                                     0, /* U+012a9b: */
+                                                     0, /* U+012a9c: */
+                                                     0, /* U+012a9d: */
+                                                     0, /* U+012a9e: */
+                                                     0, /* U+012a9f: */
+                                                     0, /* U+012aa0: */
+                                                     0, /* U+012aa1: */
+                                                     0, /* U+012aa2: */
+                                                     0, /* U+012aa3: */
+                                                     0, /* U+012aa4: */
+                                                     0, /* U+012aa5: */
+                                                     0, /* U+012aa6: */
+                                                     0, /* U+012aa7: */
+                                                     0, /* U+012aa8: */
+                                                     0, /* U+012aa9: */
+                                                     0, /* U+012aaa: */
+                                                     0, /* U+012aab: */
+                                                     0, /* U+012aac: */
+                                                     0, /* U+012aad: */
+                                                     0, /* U+012aae: */
+                                                     0, /* U+012aaf: */
+                                                     0, /* U+012ab0: */
+                                                     0, /* U+012ab1: */
+                                                     0, /* U+012ab2: */
+                                                     0, /* U+012ab3: */
+                                                     0, /* U+012ab4: */
+                                                     0, /* U+012ab5: */
+                                                     0, /* U+012ab6: */
+                                                     0, /* U+012ab7: */
+                                                     0, /* U+012ab8: */
+                                                     0, /* U+012ab9: */
+                                                     0, /* U+012aba: */
+                                                     0, /* U+012abb: */
+                                                     0, /* U+012abc: */
+                                                     0, /* U+012abd: */
+                                                     0, /* U+012abe: */
+                                                     0, /* U+012abf: */
+                                                     0, /* U+012ac0: */
+                                                     0, /* U+012ac1: */
+                                                     0, /* U+012ac2: */
+                                                     0, /* U+012ac3: */
+                                                     0, /* U+012ac4: */
+                                                     0, /* U+012ac5: */
+                                                     0, /* U+012ac6: */
+                                                     0, /* U+012ac7: */
+                                                     0, /* U+012ac8: */
+                                                     0, /* U+012ac9: */
+                                                     0, /* U+012aca: */
+                                                     0, /* U+012acb: */
+                                                     0, /* U+012acc: */
+                                                     0, /* U+012acd: */
+                                                     0, /* U+012ace: */
+                                                     0, /* U+012acf: */
+                                                     0, /* U+012ad0: */
+                                                     0, /* U+012ad1: */
+                                                     0, /* U+012ad2: */
+                                                     0, /* U+012ad3: */
+                                                     0, /* U+012ad4: */
+                                                     0, /* U+012ad5: */
+                                                     0, /* U+012ad6: */
+                                                     0, /* U+012ad7: */
+                                                     0, /* U+012ad8: */
+                                                     0, /* U+012ad9: */
+                                                     0, /* U+012ada: */
+                                                     0, /* U+012adb: */
+                                                     0, /* U+012adc: */
+                                                     0, /* U+012add: */
+                                                     0, /* U+012ade: */
+                                                     0, /* U+012adf: */
+                                                     0, /* U+012ae0: */
+                                                     0, /* U+012ae1: */
+                                                     0, /* U+012ae2: */
+                                                     0, /* U+012ae3: */
+                                                     0, /* U+012ae4: */
+                                                     0, /* U+012ae5: */
+                                                     0, /* U+012ae6: */
+                                                     0, /* U+012ae7: */
+                                                     0, /* U+012ae8: */
+                                                     0, /* U+012ae9: */
+                                                     0, /* U+012aea: */
+                                                     0, /* U+012aeb: */
+                                                     0, /* U+012aec: */
+                                                     0, /* U+012aed: */
+                                                     0, /* U+012aee: */
+                                                     0, /* U+012aef: */
+                                                     0, /* U+012af0: */
+                                                     0, /* U+012af1: */
+                                                     0, /* U+012af2: */
+                                                     0, /* U+012af3: */
+                                                     0, /* U+012af4: */
+                                                     0, /* U+012af5: */
+                                                     0, /* U+012af6: */
+                                                     0, /* U+012af7: */
+                                                     0, /* U+012af8: */
+                                                     0, /* U+012af9: */
+                                                     0, /* U+012afa: */
+                                                     0, /* U+012afb: */
+                                                     0, /* U+012afc: */
+                                                     0, /* U+012afd: */
+                                                     0, /* U+012afe: */
+                                                     0, /* U+012aff: */
+                                                     0, /* U+012b00: */
+                                                     0, /* U+012b01: */
+                                                     0, /* U+012b02: */
+                                                     0, /* U+012b03: */
+                                                     0, /* U+012b04: */
+                                                     0, /* U+012b05: */
+                                                     0, /* U+012b06: */
+                                                     0, /* U+012b07: */
+                                                     0, /* U+012b08: */
+                                                     0, /* U+012b09: */
+                                                     0, /* U+012b0a: */
+                                                     0, /* U+012b0b: */
+                                                     0, /* U+012b0c: */
+                                                     0, /* U+012b0d: */
+                                                     0, /* U+012b0e: */
+                                                     0, /* U+012b0f: */
+                                                     0, /* U+012b10: */
+                                                     0, /* U+012b11: */
+                                                     0, /* U+012b12: */
+                                                     0, /* U+012b13: */
+                                                     0, /* U+012b14: */
+                                                     0, /* U+012b15: */
+                                                     0, /* U+012b16: */
+                                                     0, /* U+012b17: */
+                                                     0, /* U+012b18: */
+                                                     0, /* U+012b19: */
+                                                     0, /* U+012b1a: */
+                                                     0, /* U+012b1b: */
+                                                     0, /* U+012b1c: */
+                                                     0, /* U+012b1d: */
+                                                     0, /* U+012b1e: */
+                                                     0, /* U+012b1f: */
+                                                     0, /* U+012b20: */
+                                                     0, /* U+012b21: */
+                                                     0, /* U+012b22: */
+                                                     0, /* U+012b23: */
+                                                     0, /* U+012b24: */
+                                                     0, /* U+012b25: */
+                                                     0, /* U+012b26: */
+                                                     0, /* U+012b27: */
+                                                     0, /* U+012b28: */
+                                                     0, /* U+012b29: */
+                                                     0, /* U+012b2a: */
+                                                     0, /* U+012b2b: */
+                                                     0, /* U+012b2c: */
+                                                     0, /* U+012b2d: */
+                                                     0, /* U+012b2e: */
+                                                     0, /* U+012b2f: */
+                                                     0, /* U+012b30: */
+                                                     0, /* U+012b31: */
+                                                     0, /* U+012b32: */
+                                                     0, /* U+012b33: */
+                                                     0, /* U+012b34: */
+                                                     0, /* U+012b35: */
+                                                     0, /* U+012b36: */
+                                                     0, /* U+012b37: */
+                                                     0, /* U+012b38: */
+                                                     0, /* U+012b39: */
+                                                     0, /* U+012b3a: */
+                                                     0, /* U+012b3b: */
+                                                     0, /* U+012b3c: */
+                                                     0, /* U+012b3d: */
+                                                     0, /* U+012b3e: */
+                                                     0, /* U+012b3f: */
+                                                     0, /* U+012b40: */
+                                                     0, /* U+012b41: */
+                                                     0, /* U+012b42: */
+                                                     0, /* U+012b43: */
+                                                     0, /* U+012b44: */
+                                                     0, /* U+012b45: */
+                                                     0, /* U+012b46: */
+                                                     0, /* U+012b47: */
+                                                     0, /* U+012b48: */
+                                                     0, /* U+012b49: */
+                                                     0, /* U+012b4a: */
+                                                     0, /* U+012b4b: */
+                                                     0, /* U+012b4c: */
+                                                     0, /* U+012b4d: */
+                                                     0, /* U+012b4e: */
+                                                     0, /* U+012b4f: */
+                                                     0, /* U+012b50: */
+                                                     0, /* U+012b51: */
+                                                     0, /* U+012b52: */
+                                                     0, /* U+012b53: */
+                                                     0, /* U+012b54: */
+                                                     0, /* U+012b55: */
+                                                     0, /* U+012b56: */
+                                                     0, /* U+012b57: */
+                                                     0, /* U+012b58: */
+                                                     0, /* U+012b59: */
+                                                     0, /* U+012b5a: */
+                                                     0, /* U+012b5b: */
+                                                     0, /* U+012b5c: */
+                                                     0, /* U+012b5d: */
+                                                     0, /* U+012b5e: */
+                                                     0, /* U+012b5f: */
+                                                     0, /* U+012b60: */
+                                                     0, /* U+012b61: */
+                                                     0, /* U+012b62: */
+                                                     0, /* U+012b63: */
+                                                     0, /* U+012b64: */
+                                                     0, /* U+012b65: */
+                                                     0, /* U+012b66: */
+                                                     0, /* U+012b67: */
+                                                     0, /* U+012b68: */
+                                                     0, /* U+012b69: */
+                                                     0, /* U+012b6a: */
+                                                     0, /* U+012b6b: */
+                                                     0, /* U+012b6c: */
+                                                     0, /* U+012b6d: */
+                                                     0, /* U+012b6e: */
+                                                     0, /* U+012b6f: */
+                                                     0, /* U+012b70: */
+                                                     0, /* U+012b71: */
+                                                     0, /* U+012b72: */
+                                                     0, /* U+012b73: */
+                                                     0, /* U+012b74: */
+                                                     0, /* U+012b75: */
+                                                     0, /* U+012b76: */
+                                                     0, /* U+012b77: */
+                                                     0, /* U+012b78: */
+                                                     0, /* U+012b79: */
+                                                     0, /* U+012b7a: */
+                                                     0, /* U+012b7b: */
+                                                     0, /* U+012b7c: */
+                                                     0, /* U+012b7d: */
+                                                     0, /* U+012b7e: */
+                                                     0, /* U+012b7f: */
+                                                     0, /* U+012b80: */
+                                                     0, /* U+012b81: */
+                                                     0, /* U+012b82: */
+                                                     0, /* U+012b83: */
+                                                     0, /* U+012b84: */
+                                                     0, /* U+012b85: */
+                                                     0, /* U+012b86: */
+                                                     0, /* U+012b87: */
+                                                     0, /* U+012b88: */
+                                                     0, /* U+012b89: */
+                                                     0, /* U+012b8a: */
+                                                     0, /* U+012b8b: */
+                                                     0, /* U+012b8c: */
+                                                     0, /* U+012b8d: */
+                                                     0, /* U+012b8e: */
+                                                     0, /* U+012b8f: */
+                                                     0, /* U+012b90: */
+                                                     0, /* U+012b91: */
+                                                     0, /* U+012b92: */
+                                                     0, /* U+012b93: */
+                                                     0, /* U+012b94: */
+                                                     0, /* U+012b95: */
+                                                     0, /* U+012b96: */
+                                                     0, /* U+012b97: */
+                                                     0, /* U+012b98: */
+                                                     0, /* U+012b99: */
+                                                     0, /* U+012b9a: */
+                                                     0, /* U+012b9b: */
+                                                     0, /* U+012b9c: */
+                                                     0, /* U+012b9d: */
+                                                     0, /* U+012b9e: */
+                                                     0, /* U+012b9f: */
+                                                     0, /* U+012ba0: */
+                                                     0, /* U+012ba1: */
+                                                     0, /* U+012ba2: */
+                                                     0, /* U+012ba3: */
+                                                     0, /* U+012ba4: */
+                                                     0, /* U+012ba5: */
+                                                     0, /* U+012ba6: */
+                                                     0, /* U+012ba7: */
+                                                     0, /* U+012ba8: */
+                                                     0, /* U+012ba9: */
+                                                     0, /* U+012baa: */
+                                                     0, /* U+012bab: */
+                                                     0, /* U+012bac: */
+                                                     0, /* U+012bad: */
+                                                     0, /* U+012bae: */
+                                                     0, /* U+012baf: */
+                                                     0, /* U+012bb0: */
+                                                     0, /* U+012bb1: */
+                                                     0, /* U+012bb2: */
+                                                     0, /* U+012bb3: */
+                                                     0, /* U+012bb4: */
+                                                     0, /* U+012bb5: */
+                                                     0, /* U+012bb6: */
+                                                     0, /* U+012bb7: */
+                                                     0, /* U+012bb8: */
+                                                     0, /* U+012bb9: */
+                                                     0, /* U+012bba: */
+                                                     0, /* U+012bbb: */
+                                                     0, /* U+012bbc: */
+                                                     0, /* U+012bbd: */
+                                                     0, /* U+012bbe: */
+                                                     0, /* U+012bbf: */
+                                                     0, /* U+012bc0: */
+                                                     0, /* U+012bc1: */
+                                                     0, /* U+012bc2: */
+                                                     0, /* U+012bc3: */
+                                                     0, /* U+012bc4: */
+                                                     0, /* U+012bc5: */
+                                                     0, /* U+012bc6: */
+                                                     0, /* U+012bc7: */
+                                                     0, /* U+012bc8: */
+                                                     0, /* U+012bc9: */
+                                                     0, /* U+012bca: */
+                                                     0, /* U+012bcb: */
+                                                     0, /* U+012bcc: */
+                                                     0, /* U+012bcd: */
+                                                     0, /* U+012bce: */
+                                                     0, /* U+012bcf: */
+                                                     0, /* U+012bd0: */
+                                                     0, /* U+012bd1: */
+                                                     0, /* U+012bd2: */
+                                                     0, /* U+012bd3: */
+                                                     0, /* U+012bd4: */
+                                                     0, /* U+012bd5: */
+                                                     0, /* U+012bd6: */
+                                                     0, /* U+012bd7: */
+                                                     0, /* U+012bd8: */
+                                                     0, /* U+012bd9: */
+                                                     0, /* U+012bda: */
+                                                     0, /* U+012bdb: */
+                                                     0, /* U+012bdc: */
+                                                     0, /* U+012bdd: */
+                                                     0, /* U+012bde: */
+                                                     0, /* U+012bdf: */
+                                                     0, /* U+012be0: */
+                                                     0, /* U+012be1: */
+                                                     0, /* U+012be2: */
+                                                     0, /* U+012be3: */
+                                                     0, /* U+012be4: */
+                                                     0, /* U+012be5: */
+                                                     0, /* U+012be6: */
+                                                     0, /* U+012be7: */
+                                                     0, /* U+012be8: */
+                                                     0, /* U+012be9: */
+                                                     0, /* U+012bea: */
+                                                     0, /* U+012beb: */
+                                                     0, /* U+012bec: */
+                                                     0, /* U+012bed: */
+                                                     0, /* U+012bee: */
+                                                     0, /* U+012bef: */
+                                                     0, /* U+012bf0: */
+                                                     0, /* U+012bf1: */
+                                                     0, /* U+012bf2: */
+                                                     0, /* U+012bf3: */
+                                                     0, /* U+012bf4: */
+                                                     0, /* U+012bf5: */
+                                                     0, /* U+012bf6: */
+                                                     0, /* U+012bf7: */
+                                                     0, /* U+012bf8: */
+                                                     0, /* U+012bf9: */
+                                                     0, /* U+012bfa: */
+                                                     0, /* U+012bfb: */
+                                                     0, /* U+012bfc: */
+                                                     0, /* U+012bfd: */
+                                                     0, /* U+012bfe: */
+                                                     0, /* U+012bff: */
+                                                     0, /* U+012c00: */
+                                                     0, /* U+012c01: */
+                                                     0, /* U+012c02: */
+                                                     0, /* U+012c03: */
+                                                     0, /* U+012c04: */
+                                                     0, /* U+012c05: */
+                                                     0, /* U+012c06: */
+                                                     0, /* U+012c07: */
+                                                     0, /* U+012c08: */
+                                                     0, /* U+012c09: */
+                                                     0, /* U+012c0a: */
+                                                     0, /* U+012c0b: */
+                                                     0, /* U+012c0c: */
+                                                     0, /* U+012c0d: */
+                                                     0, /* U+012c0e: */
+                                                     0, /* U+012c0f: */
+                                                     0, /* U+012c10: */
+                                                     0, /* U+012c11: */
+                                                     0, /* U+012c12: */
+                                                     0, /* U+012c13: */
+                                                     0, /* U+012c14: */
+                                                     0, /* U+012c15: */
+                                                     0, /* U+012c16: */
+                                                     0, /* U+012c17: */
+                                                     0, /* U+012c18: */
+                                                     0, /* U+012c19: */
+                                                     0, /* U+012c1a: */
+                                                     0, /* U+012c1b: */
+                                                     0, /* U+012c1c: */
+                                                     0, /* U+012c1d: */
+                                                     0, /* U+012c1e: */
+                                                     0, /* U+012c1f: */
+                                                     0, /* U+012c20: */
+                                                     0, /* U+012c21: */
+                                                     0, /* U+012c22: */
+                                                     0, /* U+012c23: */
+                                                     0, /* U+012c24: */
+                                                     0, /* U+012c25: */
+                                                     0, /* U+012c26: */
+                                                     0, /* U+012c27: */
+                                                     0, /* U+012c28: */
+                                                     0, /* U+012c29: */
+                                                     0, /* U+012c2a: */
+                                                     0, /* U+012c2b: */
+                                                     0, /* U+012c2c: */
+                                                     0, /* U+012c2d: */
+                                                     0, /* U+012c2e: */
+                                                     0, /* U+012c2f: */
+                                                     0, /* U+012c30: */
+                                                     0, /* U+012c31: */
+                                                     0, /* U+012c32: */
+                                                     0, /* U+012c33: */
+                                                     0, /* U+012c34: */
+                                                     0, /* U+012c35: */
+                                                     0, /* U+012c36: */
+                                                     0, /* U+012c37: */
+                                                     0, /* U+012c38: */
+                                                     0, /* U+012c39: */
+                                                     0, /* U+012c3a: */
+                                                     0, /* U+012c3b: */
+                                                     0, /* U+012c3c: */
+                                                     0, /* U+012c3d: */
+                                                     0, /* U+012c3e: */
+                                                     0, /* U+012c3f: */
+                                                     0, /* U+012c40: */
+                                                     0, /* U+012c41: */
+                                                     0, /* U+012c42: */
+                                                     0, /* U+012c43: */
+                                                     0, /* U+012c44: */
+                                                     0, /* U+012c45: */
+                                                     0, /* U+012c46: */
+                                                     0, /* U+012c47: */
+                                                     0, /* U+012c48: */
+                                                     0, /* U+012c49: */
+                                                     0, /* U+012c4a: */
+                                                     0, /* U+012c4b: */
+                                                     0, /* U+012c4c: */
+                                                     0, /* U+012c4d: */
+                                                     0, /* U+012c4e: */
+                                                     0, /* U+012c4f: */
+                                                     0, /* U+012c50: */
+                                                     0, /* U+012c51: */
+                                                     0, /* U+012c52: */
+                                                     0, /* U+012c53: */
+                                                     0, /* U+012c54: */
+                                                     0, /* U+012c55: */
+                                                     0, /* U+012c56: */
+                                                     0, /* U+012c57: */
+                                                     0, /* U+012c58: */
+                                                     0, /* U+012c59: */
+                                                     0, /* U+012c5a: */
+                                                     0, /* U+012c5b: */
+                                                     0, /* U+012c5c: */
+                                                     0, /* U+012c5d: */
+                                                     0, /* U+012c5e: */
+                                                     0, /* U+012c5f: */
+                                                     0, /* U+012c60: */
+                                                     0, /* U+012c61: */
+                                                     0, /* U+012c62: */
+                                                     0, /* U+012c63: */
+                                                     0, /* U+012c64: */
+                                                     0, /* U+012c65: */
+                                                     0, /* U+012c66: */
+                                                     0, /* U+012c67: */
+                                                     0, /* U+012c68: */
+                                                     0, /* U+012c69: */
+                                                     0, /* U+012c6a: */
+                                                     0, /* U+012c6b: */
+                                                     0, /* U+012c6c: */
+                                                     0, /* U+012c6d: */
+                                                     0, /* U+012c6e: */
+                                                     0, /* U+012c6f: */
+                                                     0, /* U+012c70: */
+                                                     0, /* U+012c71: */
+                                                     0, /* U+012c72: */
+                                                     0, /* U+012c73: */
+                                                     0, /* U+012c74: */
+                                                     0, /* U+012c75: */
+                                                     0, /* U+012c76: */
+                                                     0, /* U+012c77: */
+                                                     0, /* U+012c78: */
+                                                     0, /* U+012c79: */
+                                                     0, /* U+012c7a: */
+                                                     0, /* U+012c7b: */
+                                                     0, /* U+012c7c: */
+                                                     0, /* U+012c7d: */
+                                                     0, /* U+012c7e: */
+                                                     0, /* U+012c7f: */
+                                                     0, /* U+012c80: */
+                                                     0, /* U+012c81: */
+                                                     0, /* U+012c82: */
+                                                     0, /* U+012c83: */
+                                                     0, /* U+012c84: */
+                                                     0, /* U+012c85: */
+                                                     0, /* U+012c86: */
+                                                     0, /* U+012c87: */
+                                                     0, /* U+012c88: */
+                                                     0, /* U+012c89: */
+                                                     0, /* U+012c8a: */
+                                                     0, /* U+012c8b: */
+                                                     0, /* U+012c8c: */
+                                                     0, /* U+012c8d: */
+                                                     0, /* U+012c8e: */
+                                                     0, /* U+012c8f: */
+                                                     0, /* U+012c90: */
+                                                     0, /* U+012c91: */
+                                                     0, /* U+012c92: */
+                                                     0, /* U+012c93: */
+                                                     0, /* U+012c94: */
+                                                     0, /* U+012c95: */
+                                                     0, /* U+012c96: */
+                                                     0, /* U+012c97: */
+                                                     0, /* U+012c98: */
+                                                     0, /* U+012c99: */
+                                                     0, /* U+012c9a: */
+                                                     0, /* U+012c9b: */
+                                                     0, /* U+012c9c: */
+                                                     0, /* U+012c9d: */
+                                                     0, /* U+012c9e: */
+                                                     0, /* U+012c9f: */
+                                                     0, /* U+012ca0: */
+                                                     0, /* U+012ca1: */
+                                                     0, /* U+012ca2: */
+                                                     0, /* U+012ca3: */
+                                                     0, /* U+012ca4: */
+                                                     0, /* U+012ca5: */
+                                                     0, /* U+012ca6: */
+                                                     0, /* U+012ca7: */
+                                                     0, /* U+012ca8: */
+                                                     0, /* U+012ca9: */
+                                                     0, /* U+012caa: */
+                                                     0, /* U+012cab: */
+                                                     0, /* U+012cac: */
+                                                     0, /* U+012cad: */
+                                                     0, /* U+012cae: */
+                                                     0, /* U+012caf: */
+                                                     0, /* U+012cb0: */
+                                                     0, /* U+012cb1: */
+                                                     0, /* U+012cb2: */
+                                                     0, /* U+012cb3: */
+                                                     0, /* U+012cb4: */
+                                                     0, /* U+012cb5: */
+                                                     0, /* U+012cb6: */
+                                                     0, /* U+012cb7: */
+                                                     0, /* U+012cb8: */
+                                                     0, /* U+012cb9: */
+                                                     0, /* U+012cba: */
+                                                     0, /* U+012cbb: */
+                                                     0, /* U+012cbc: */
+                                                     0, /* U+012cbd: */
+                                                     0, /* U+012cbe: */
+                                                     0, /* U+012cbf: */
+                                                     0, /* U+012cc0: */
+                                                     0, /* U+012cc1: */
+                                                     0, /* U+012cc2: */
+                                                     0, /* U+012cc3: */
+                                                     0, /* U+012cc4: */
+                                                     0, /* U+012cc5: */
+                                                     0, /* U+012cc6: */
+                                                     0, /* U+012cc7: */
+                                                     0, /* U+012cc8: */
+                                                     0, /* U+012cc9: */
+                                                     0, /* U+012cca: */
+                                                     0, /* U+012ccb: */
+                                                     0, /* U+012ccc: */
+                                                     0, /* U+012ccd: */
+                                                     0, /* U+012cce: */
+                                                     0, /* U+012ccf: */
+                                                     0, /* U+012cd0: */
+                                                     0, /* U+012cd1: */
+                                                     0, /* U+012cd2: */
+                                                     0, /* U+012cd3: */
+                                                     0, /* U+012cd4: */
+                                                     0, /* U+012cd5: */
+                                                     0, /* U+012cd6: */
+                                                     0, /* U+012cd7: */
+                                                     0, /* U+012cd8: */
+                                                     0, /* U+012cd9: */
+                                                     0, /* U+012cda: */
+                                                     0, /* U+012cdb: */
+                                                     0, /* U+012cdc: */
+                                                     0, /* U+012cdd: */
+                                                     0, /* U+012cde: */
+                                                     0, /* U+012cdf: */
+                                                     0, /* U+012ce0: */
+                                                     0, /* U+012ce1: */
+                                                     0, /* U+012ce2: */
+                                                     0, /* U+012ce3: */
+                                                     0, /* U+012ce4: */
+                                                     0, /* U+012ce5: */
+                                                     0, /* U+012ce6: */
+                                                     0, /* U+012ce7: */
+                                                     0, /* U+012ce8: */
+                                                     0, /* U+012ce9: */
+                                                     0, /* U+012cea: */
+                                                     0, /* U+012ceb: */
+                                                     0, /* U+012cec: */
+                                                     0, /* U+012ced: */
+                                                     0, /* U+012cee: */
+                                                     0, /* U+012cef: */
+                                                     0, /* U+012cf0: */
+                                                     0, /* U+012cf1: */
+                                                     0, /* U+012cf2: */
+                                                     0, /* U+012cf3: */
+                                                     0, /* U+012cf4: */
+                                                     0, /* U+012cf5: */
+                                                     0, /* U+012cf6: */
+                                                     0, /* U+012cf7: */
+                                                     0, /* U+012cf8: */
+                                                     0, /* U+012cf9: */
+                                                     0, /* U+012cfa: */
+                                                     0, /* U+012cfb: */
+                                                     0, /* U+012cfc: */
+                                                     0, /* U+012cfd: */
+                                                     0, /* U+012cfe: */
+                                                     0, /* U+012cff: */
+                                                     0, /* U+012d00: */
+                                                     0, /* U+012d01: */
+                                                     0, /* U+012d02: */
+                                                     0, /* U+012d03: */
+                                                     0, /* U+012d04: */
+                                                     0, /* U+012d05: */
+                                                     0, /* U+012d06: */
+                                                     0, /* U+012d07: */
+                                                     0, /* U+012d08: */
+                                                     0, /* U+012d09: */
+                                                     0, /* U+012d0a: */
+                                                     0, /* U+012d0b: */
+                                                     0, /* U+012d0c: */
+                                                     0, /* U+012d0d: */
+                                                     0, /* U+012d0e: */
+                                                     0, /* U+012d0f: */
+                                                     0, /* U+012d10: */
+                                                     0, /* U+012d11: */
+                                                     0, /* U+012d12: */
+                                                     0, /* U+012d13: */
+                                                     0, /* U+012d14: */
+                                                     0, /* U+012d15: */
+                                                     0, /* U+012d16: */
+                                                     0, /* U+012d17: */
+                                                     0, /* U+012d18: */
+                                                     0, /* U+012d19: */
+                                                     0, /* U+012d1a: */
+                                                     0, /* U+012d1b: */
+                                                     0, /* U+012d1c: */
+                                                     0, /* U+012d1d: */
+                                                     0, /* U+012d1e: */
+                                                     0, /* U+012d1f: */
+                                                     0, /* U+012d20: */
+                                                     0, /* U+012d21: */
+                                                     0, /* U+012d22: */
+                                                     0, /* U+012d23: */
+                                                     0, /* U+012d24: */
+                                                     0, /* U+012d25: */
+                                                     0, /* U+012d26: */
+                                                     0, /* U+012d27: */
+                                                     0, /* U+012d28: */
+                                                     0, /* U+012d29: */
+                                                     0, /* U+012d2a: */
+                                                     0, /* U+012d2b: */
+                                                     0, /* U+012d2c: */
+                                                     0, /* U+012d2d: */
+                                                     0, /* U+012d2e: */
+                                                     0, /* U+012d2f: */
+                                                     0, /* U+012d30: */
+                                                     0, /* U+012d31: */
+                                                     0, /* U+012d32: */
+                                                     0, /* U+012d33: */
+                                                     0, /* U+012d34: */
+                                                     0, /* U+012d35: */
+                                                     0, /* U+012d36: */
+                                                     0, /* U+012d37: */
+                                                     0, /* U+012d38: */
+                                                     0, /* U+012d39: */
+                                                     0, /* U+012d3a: */
+                                                     0, /* U+012d3b: */
+                                                     0, /* U+012d3c: */
+                                                     0, /* U+012d3d: */
+                                                     0, /* U+012d3e: */
+                                                     0, /* U+012d3f: */
+                                                     0, /* U+012d40: */
+                                                     0, /* U+012d41: */
+                                                     0, /* U+012d42: */
+                                                     0, /* U+012d43: */
+                                                     0, /* U+012d44: */
+                                                     0, /* U+012d45: */
+                                                     0, /* U+012d46: */
+                                                     0, /* U+012d47: */
+                                                     0, /* U+012d48: */
+                                                     0, /* U+012d49: */
+                                                     0, /* U+012d4a: */
+                                                     0, /* U+012d4b: */
+                                                     0, /* U+012d4c: */
+                                                     0, /* U+012d4d: */
+                                                     0, /* U+012d4e: */
+                                                     0, /* U+012d4f: */
+                                                     0, /* U+012d50: */
+                                                     0, /* U+012d51: */
+                                                     0, /* U+012d52: */
+                                                     0, /* U+012d53: */
+                                                     0, /* U+012d54: */
+                                                     0, /* U+012d55: */
+                                                     0, /* U+012d56: */
+                                                     0, /* U+012d57: */
+                                                     0, /* U+012d58: */
+                                                     0, /* U+012d59: */
+                                                     0, /* U+012d5a: */
+                                                     0, /* U+012d5b: */
+                                                     0, /* U+012d5c: */
+                                                     0, /* U+012d5d: */
+                                                     0, /* U+012d5e: */
+                                                     0, /* U+012d5f: */
+                                                     0, /* U+012d60: */
+                                                     0, /* U+012d61: */
+                                                     0, /* U+012d62: */
+                                                     0, /* U+012d63: */
+                                                     0, /* U+012d64: */
+                                                     0, /* U+012d65: */
+                                                     0, /* U+012d66: */
+                                                     0, /* U+012d67: */
+                                                     0, /* U+012d68: */
+                                                     0, /* U+012d69: */
+                                                     0, /* U+012d6a: */
+                                                     0, /* U+012d6b: */
+                                                     0, /* U+012d6c: */
+                                                     0, /* U+012d6d: */
+                                                     0, /* U+012d6e: */
+                                                     0, /* U+012d6f: */
+                                                     0, /* U+012d70: */
+                                                     0, /* U+012d71: */
+                                                     0, /* U+012d72: */
+                                                     0, /* U+012d73: */
+                                                     0, /* U+012d74: */
+                                                     0, /* U+012d75: */
+                                                     0, /* U+012d76: */
+                                                     0, /* U+012d77: */
+                                                     0, /* U+012d78: */
+                                                     0, /* U+012d79: */
+                                                     0, /* U+012d7a: */
+                                                     0, /* U+012d7b: */
+                                                     0, /* U+012d7c: */
+                                                     0, /* U+012d7d: */
+                                                     0, /* U+012d7e: */
+                                                     0, /* U+012d7f: */
+                                                     0, /* U+012d80: */
+                                                     0, /* U+012d81: */
+                                                     0, /* U+012d82: */
+                                                     0, /* U+012d83: */
+                                                     0, /* U+012d84: */
+                                                     0, /* U+012d85: */
+                                                     0, /* U+012d86: */
+                                                     0, /* U+012d87: */
+                                                     0, /* U+012d88: */
+                                                     0, /* U+012d89: */
+                                                     0, /* U+012d8a: */
+                                                     0, /* U+012d8b: */
+                                                     0, /* U+012d8c: */
+                                                     0, /* U+012d8d: */
+                                                     0, /* U+012d8e: */
+                                                     0, /* U+012d8f: */
+                                                     0, /* U+012d90: */
+                                                     0, /* U+012d91: */
+                                                     0, /* U+012d92: */
+                                                     0, /* U+012d93: */
+                                                     0, /* U+012d94: */
+                                                     0, /* U+012d95: */
+                                                     0, /* U+012d96: */
+                                                     0, /* U+012d97: */
+                                                     0, /* U+012d98: */
+                                                     0, /* U+012d99: */
+                                                     0, /* U+012d9a: */
+                                                     0, /* U+012d9b: */
+                                                     0, /* U+012d9c: */
+                                                     0, /* U+012d9d: */
+                                                     0, /* U+012d9e: */
+                                                     0, /* U+012d9f: */
+                                                     0, /* U+012da0: */
+                                                     0, /* U+012da1: */
+                                                     0, /* U+012da2: */
+                                                     0, /* U+012da3: */
+                                                     0, /* U+012da4: */
+                                                     0, /* U+012da5: */
+                                                     0, /* U+012da6: */
+                                                     0, /* U+012da7: */
+                                                     0, /* U+012da8: */
+                                                     0, /* U+012da9: */
+                                                     0, /* U+012daa: */
+                                                     0, /* U+012dab: */
+                                                     0, /* U+012dac: */
+                                                     0, /* U+012dad: */
+                                                     0, /* U+012dae: */
+                                                     0, /* U+012daf: */
+                                                     0, /* U+012db0: */
+                                                     0, /* U+012db1: */
+                                                     0, /* U+012db2: */
+                                                     0, /* U+012db3: */
+                                                     0, /* U+012db4: */
+                                                     0, /* U+012db5: */
+                                                     0, /* U+012db6: */
+                                                     0, /* U+012db7: */
+                                                     0, /* U+012db8: */
+                                                     0, /* U+012db9: */
+                                                     0, /* U+012dba: */
+                                                     0, /* U+012dbb: */
+                                                     0, /* U+012dbc: */
+                                                     0, /* U+012dbd: */
+                                                     0, /* U+012dbe: */
+                                                     0, /* U+012dbf: */
+                                                     0, /* U+012dc0: */
+                                                     0, /* U+012dc1: */
+                                                     0, /* U+012dc2: */
+                                                     0, /* U+012dc3: */
+                                                     0, /* U+012dc4: */
+                                                     0, /* U+012dc5: */
+                                                     0, /* U+012dc6: */
+                                                     0, /* U+012dc7: */
+                                                     0, /* U+012dc8: */
+                                                     0, /* U+012dc9: */
+                                                     0, /* U+012dca: */
+                                                     0, /* U+012dcb: */
+                                                     0, /* U+012dcc: */
+                                                     0, /* U+012dcd: */
+                                                     0, /* U+012dce: */
+                                                     0, /* U+012dcf: */
+                                                     0, /* U+012dd0: */
+                                                     0, /* U+012dd1: */
+                                                     0, /* U+012dd2: */
+                                                     0, /* U+012dd3: */
+                                                     0, /* U+012dd4: */
+                                                     0, /* U+012dd5: */
+                                                     0, /* U+012dd6: */
+                                                     0, /* U+012dd7: */
+                                                     0, /* U+012dd8: */
+                                                     0, /* U+012dd9: */
+                                                     0, /* U+012dda: */
+                                                     0, /* U+012ddb: */
+                                                     0, /* U+012ddc: */
+                                                     0, /* U+012ddd: */
+                                                     0, /* U+012dde: */
+                                                     0, /* U+012ddf: */
+                                                     0, /* U+012de0: */
+                                                     0, /* U+012de1: */
+                                                     0, /* U+012de2: */
+                                                     0, /* U+012de3: */
+                                                     0, /* U+012de4: */
+                                                     0, /* U+012de5: */
+                                                     0, /* U+012de6: */
+                                                     0, /* U+012de7: */
+                                                     0, /* U+012de8: */
+                                                     0, /* U+012de9: */
+                                                     0, /* U+012dea: */
+                                                     0, /* U+012deb: */
+                                                     0, /* U+012dec: */
+                                                     0, /* U+012ded: */
+                                                     0, /* U+012dee: */
+                                                     0, /* U+012def: */
+                                                     0, /* U+012df0: */
+                                                     0, /* U+012df1: */
+                                                     0, /* U+012df2: */
+                                                     0, /* U+012df3: */
+                                                     0, /* U+012df4: */
+                                                     0, /* U+012df5: */
+                                                     0, /* U+012df6: */
+                                                     0, /* U+012df7: */
+                                                     0, /* U+012df8: */
+                                                     0, /* U+012df9: */
+                                                     0, /* U+012dfa: */
+                                                     0, /* U+012dfb: */
+                                                     0, /* U+012dfc: */
+                                                     0, /* U+012dfd: */
+                                                     0, /* U+012dfe: */
+                                                     0, /* U+012dff: */
+                                                     0, /* U+012e00: */
+                                                     0, /* U+012e01: */
+                                                     0, /* U+012e02: */
+                                                     0, /* U+012e03: */
+                                                     0, /* U+012e04: */
+                                                     0, /* U+012e05: */
+                                                     0, /* U+012e06: */
+                                                     0, /* U+012e07: */
+                                                     0, /* U+012e08: */
+                                                     0, /* U+012e09: */
+                                                     0, /* U+012e0a: */
+                                                     0, /* U+012e0b: */
+                                                     0, /* U+012e0c: */
+                                                     0, /* U+012e0d: */
+                                                     0, /* U+012e0e: */
+                                                     0, /* U+012e0f: */
+                                                     0, /* U+012e10: */
+                                                     0, /* U+012e11: */
+                                                     0, /* U+012e12: */
+                                                     0, /* U+012e13: */
+                                                     0, /* U+012e14: */
+                                                     0, /* U+012e15: */
+                                                     0, /* U+012e16: */
+                                                     0, /* U+012e17: */
+                                                     0, /* U+012e18: */
+                                                     0, /* U+012e19: */
+                                                     0, /* U+012e1a: */
+                                                     0, /* U+012e1b: */
+                                                     0, /* U+012e1c: */
+                                                     0, /* U+012e1d: */
+                                                     0, /* U+012e1e: */
+                                                     0, /* U+012e1f: */
+                                                     0, /* U+012e20: */
+                                                     0, /* U+012e21: */
+                                                     0, /* U+012e22: */
+                                                     0, /* U+012e23: */
+                                                     0, /* U+012e24: */
+                                                     0, /* U+012e25: */
+                                                     0, /* U+012e26: */
+                                                     0, /* U+012e27: */
+                                                     0, /* U+012e28: */
+                                                     0, /* U+012e29: */
+                                                     0, /* U+012e2a: */
+                                                     0, /* U+012e2b: */
+                                                     0, /* U+012e2c: */
+                                                     0, /* U+012e2d: */
+                                                     0, /* U+012e2e: */
+                                                     0, /* U+012e2f: */
+                                                     0, /* U+012e30: */
+                                                     0, /* U+012e31: */
+                                                     0, /* U+012e32: */
+                                                     0, /* U+012e33: */
+                                                     0, /* U+012e34: */
+                                                     0, /* U+012e35: */
+                                                     0, /* U+012e36: */
+                                                     0, /* U+012e37: */
+                                                     0, /* U+012e38: */
+                                                     0, /* U+012e39: */
+                                                     0, /* U+012e3a: */
+                                                     0, /* U+012e3b: */
+                                                     0, /* U+012e3c: */
+                                                     0, /* U+012e3d: */
+                                                     0, /* U+012e3e: */
+                                                     0, /* U+012e3f: */
+                                                     0, /* U+012e40: */
+                                                     0, /* U+012e41: */
+                                                     0, /* U+012e42: */
+                                                     0, /* U+012e43: */
+                                                     0, /* U+012e44: */
+                                                     0, /* U+012e45: */
+                                                     0, /* U+012e46: */
+                                                     0, /* U+012e47: */
+                                                     0, /* U+012e48: */
+                                                     0, /* U+012e49: */
+                                                     0, /* U+012e4a: */
+                                                     0, /* U+012e4b: */
+                                                     0, /* U+012e4c: */
+                                                     0, /* U+012e4d: */
+                                                     0, /* U+012e4e: */
+                                                     0, /* U+012e4f: */
+                                                     0, /* U+012e50: */
+                                                     0, /* U+012e51: */
+                                                     0, /* U+012e52: */
+                                                     0, /* U+012e53: */
+                                                     0, /* U+012e54: */
+                                                     0, /* U+012e55: */
+                                                     0, /* U+012e56: */
+                                                     0, /* U+012e57: */
+                                                     0, /* U+012e58: */
+                                                     0, /* U+012e59: */
+                                                     0, /* U+012e5a: */
+                                                     0, /* U+012e5b: */
+                                                     0, /* U+012e5c: */
+                                                     0, /* U+012e5d: */
+                                                     0, /* U+012e5e: */
+                                                     0, /* U+012e5f: */
+                                                     0, /* U+012e60: */
+                                                     0, /* U+012e61: */
+                                                     0, /* U+012e62: */
+                                                     0, /* U+012e63: */
+                                                     0, /* U+012e64: */
+                                                     0, /* U+012e65: */
+                                                     0, /* U+012e66: */
+                                                     0, /* U+012e67: */
+                                                     0, /* U+012e68: */
+                                                     0, /* U+012e69: */
+                                                     0, /* U+012e6a: */
+                                                     0, /* U+012e6b: */
+                                                     0, /* U+012e6c: */
+                                                     0, /* U+012e6d: */
+                                                     0, /* U+012e6e: */
+                                                     0, /* U+012e6f: */
+                                                     0, /* U+012e70: */
+                                                     0, /* U+012e71: */
+                                                     0, /* U+012e72: */
+                                                     0, /* U+012e73: */
+                                                     0, /* U+012e74: */
+                                                     0, /* U+012e75: */
+                                                     0, /* U+012e76: */
+                                                     0, /* U+012e77: */
+                                                     0, /* U+012e78: */
+                                                     0, /* U+012e79: */
+                                                     0, /* U+012e7a: */
+                                                     0, /* U+012e7b: */
+                                                     0, /* U+012e7c: */
+                                                     0, /* U+012e7d: */
+                                                     0, /* U+012e7e: */
+                                                     0, /* U+012e7f: */
+                                                     0, /* U+012e80: */
+                                                     0, /* U+012e81: */
+                                                     0, /* U+012e82: */
+                                                     0, /* U+012e83: */
+                                                     0, /* U+012e84: */
+                                                     0, /* U+012e85: */
+                                                     0, /* U+012e86: */
+                                                     0, /* U+012e87: */
+                                                     0, /* U+012e88: */
+                                                     0, /* U+012e89: */
+                                                     0, /* U+012e8a: */
+                                                     0, /* U+012e8b: */
+                                                     0, /* U+012e8c: */
+                                                     0, /* U+012e8d: */
+                                                     0, /* U+012e8e: */
+                                                     0, /* U+012e8f: */
+                                                     0, /* U+012e90: */
+                                                     0, /* U+012e91: */
+                                                     0, /* U+012e92: */
+                                                     0, /* U+012e93: */
+                                                     0, /* U+012e94: */
+                                                     0, /* U+012e95: */
+                                                     0, /* U+012e96: */
+                                                     0, /* U+012e97: */
+                                                     0, /* U+012e98: */
+                                                     0, /* U+012e99: */
+                                                     0, /* U+012e9a: */
+                                                     0, /* U+012e9b: */
+                                                     0, /* U+012e9c: */
+                                                     0, /* U+012e9d: */
+                                                     0, /* U+012e9e: */
+                                                     0, /* U+012e9f: */
+                                                     0, /* U+012ea0: */
+                                                     0, /* U+012ea1: */
+                                                     0, /* U+012ea2: */
+                                                     0, /* U+012ea3: */
+                                                     0, /* U+012ea4: */
+                                                     0, /* U+012ea5: */
+                                                     0, /* U+012ea6: */
+                                                     0, /* U+012ea7: */
+                                                     0, /* U+012ea8: */
+                                                     0, /* U+012ea9: */
+                                                     0, /* U+012eaa: */
+                                                     0, /* U+012eab: */
+                                                     0, /* U+012eac: */
+                                                     0, /* U+012ead: */
+                                                     0, /* U+012eae: */
+                                                     0, /* U+012eaf: */
+                                                     0, /* U+012eb0: */
+                                                     0, /* U+012eb1: */
+                                                     0, /* U+012eb2: */
+                                                     0, /* U+012eb3: */
+                                                     0, /* U+012eb4: */
+                                                     0, /* U+012eb5: */
+                                                     0, /* U+012eb6: */
+                                                     0, /* U+012eb7: */
+                                                     0, /* U+012eb8: */
+                                                     0, /* U+012eb9: */
+                                                     0, /* U+012eba: */
+                                                     0, /* U+012ebb: */
+                                                     0, /* U+012ebc: */
+                                                     0, /* U+012ebd: */
+                                                     0, /* U+012ebe: */
+                                                     0, /* U+012ebf: */
+                                                     0, /* U+012ec0: */
+                                                     0, /* U+012ec1: */
+                                                     0, /* U+012ec2: */
+                                                     0, /* U+012ec3: */
+                                                     0, /* U+012ec4: */
+                                                     0, /* U+012ec5: */
+                                                     0, /* U+012ec6: */
+                                                     0, /* U+012ec7: */
+                                                     0, /* U+012ec8: */
+                                                     0, /* U+012ec9: */
+                                                     0, /* U+012eca: */
+                                                     0, /* U+012ecb: */
+                                                     0, /* U+012ecc: */
+                                                     0, /* U+012ecd: */
+                                                     0, /* U+012ece: */
+                                                     0, /* U+012ecf: */
+                                                     0, /* U+012ed0: */
+                                                     0, /* U+012ed1: */
+                                                     0, /* U+012ed2: */
+                                                     0, /* U+012ed3: */
+                                                     0, /* U+012ed4: */
+                                                     0, /* U+012ed5: */
+                                                     0, /* U+012ed6: */
+                                                     0, /* U+012ed7: */
+                                                     0, /* U+012ed8: */
+                                                     0, /* U+012ed9: */
+                                                     0, /* U+012eda: */
+                                                     0, /* U+012edb: */
+                                                     0, /* U+012edc: */
+                                                     0, /* U+012edd: */
+                                                     0, /* U+012ede: */
+                                                     0, /* U+012edf: */
+                                                     0, /* U+012ee0: */
+                                                     0, /* U+012ee1: */
+                                                     0, /* U+012ee2: */
+                                                     0, /* U+012ee3: */
+                                                     0, /* U+012ee4: */
+                                                     0, /* U+012ee5: */
+                                                     0, /* U+012ee6: */
+                                                     0, /* U+012ee7: */
+                                                     0, /* U+012ee8: */
+                                                     0, /* U+012ee9: */
+                                                     0, /* U+012eea: */
+                                                     0, /* U+012eeb: */
+                                                     0, /* U+012eec: */
+                                                     0, /* U+012eed: */
+                                                     0, /* U+012eee: */
+                                                     0, /* U+012eef: */
+                                                     0, /* U+012ef0: */
+                                                     0, /* U+012ef1: */
+                                                     0, /* U+012ef2: */
+                                                     0, /* U+012ef3: */
+                                                     0, /* U+012ef4: */
+                                                     0, /* U+012ef5: */
+                                                     0, /* U+012ef6: */
+                                                     0, /* U+012ef7: */
+                                                     0, /* U+012ef8: */
+                                                     0, /* U+012ef9: */
+                                                     0, /* U+012efa: */
+                                                     0, /* U+012efb: */
+                                                     0, /* U+012efc: */
+                                                     0, /* U+012efd: */
+                                                     0, /* U+012efe: */
+                                                     0, /* U+012eff: */
+                                                     0, /* U+012f00: */
+                                                     0, /* U+012f01: */
+                                                     0, /* U+012f02: */
+                                                     0, /* U+012f03: */
+                                                     0, /* U+012f04: */
+                                                     0, /* U+012f05: */
+                                                     0, /* U+012f06: */
+                                                     0, /* U+012f07: */
+                                                     0, /* U+012f08: */
+                                                     0, /* U+012f09: */
+                                                     0, /* U+012f0a: */
+                                                     0, /* U+012f0b: */
+                                                     0, /* U+012f0c: */
+                                                     0, /* U+012f0d: */
+                                                     0, /* U+012f0e: */
+                                                     0, /* U+012f0f: */
+                                                     0, /* U+012f10: */
+                                                     0, /* U+012f11: */
+                                                     0, /* U+012f12: */
+                                                     0, /* U+012f13: */
+                                                     0, /* U+012f14: */
+                                                     0, /* U+012f15: */
+                                                     0, /* U+012f16: */
+                                                     0, /* U+012f17: */
+                                                     0, /* U+012f18: */
+                                                     0, /* U+012f19: */
+                                                     0, /* U+012f1a: */
+                                                     0, /* U+012f1b: */
+                                                     0, /* U+012f1c: */
+                                                     0, /* U+012f1d: */
+                                                     0, /* U+012f1e: */
+                                                     0, /* U+012f1f: */
+                                                     0, /* U+012f20: */
+                                                     0, /* U+012f21: */
+                                                     0, /* U+012f22: */
+                                                     0, /* U+012f23: */
+                                                     0, /* U+012f24: */
+                                                     0, /* U+012f25: */
+                                                     0, /* U+012f26: */
+                                                     0, /* U+012f27: */
+                                                     0, /* U+012f28: */
+                                                     0, /* U+012f29: */
+                                                     0, /* U+012f2a: */
+                                                     0, /* U+012f2b: */
+                                                     0, /* U+012f2c: */
+                                                     0, /* U+012f2d: */
+                                                     0, /* U+012f2e: */
+                                                     0, /* U+012f2f: */
+                                                     0, /* U+012f30: */
+                                                     0, /* U+012f31: */
+                                                     0, /* U+012f32: */
+                                                     0, /* U+012f33: */
+                                                     0, /* U+012f34: */
+                                                     0, /* U+012f35: */
+                                                     0, /* U+012f36: */
+                                                     0, /* U+012f37: */
+                                                     0, /* U+012f38: */
+                                                     0, /* U+012f39: */
+                                                     0, /* U+012f3a: */
+                                                     0, /* U+012f3b: */
+                                                     0, /* U+012f3c: */
+                                                     0, /* U+012f3d: */
+                                                     0, /* U+012f3e: */
+                                                     0, /* U+012f3f: */
+                                                     0, /* U+012f40: */
+                                                     0, /* U+012f41: */
+                                                     0, /* U+012f42: */
+                                                     0, /* U+012f43: */
+                                                     0, /* U+012f44: */
+                                                     0, /* U+012f45: */
+                                                     0, /* U+012f46: */
+                                                     0, /* U+012f47: */
+                                                     0, /* U+012f48: */
+                                                     0, /* U+012f49: */
+                                                     0, /* U+012f4a: */
+                                                     0, /* U+012f4b: */
+                                                     0, /* U+012f4c: */
+                                                     0, /* U+012f4d: */
+                                                     0, /* U+012f4e: */
+                                                     0, /* U+012f4f: */
+                                                     0, /* U+012f50: */
+                                                     0, /* U+012f51: */
+                                                     0, /* U+012f52: */
+                                                     0, /* U+012f53: */
+                                                     0, /* U+012f54: */
+                                                     0, /* U+012f55: */
+                                                     0, /* U+012f56: */
+                                                     0, /* U+012f57: */
+                                                     0, /* U+012f58: */
+                                                     0, /* U+012f59: */
+                                                     0, /* U+012f5a: */
+                                                     0, /* U+012f5b: */
+                                                     0, /* U+012f5c: */
+                                                     0, /* U+012f5d: */
+                                                     0, /* U+012f5e: */
+                                                     0, /* U+012f5f: */
+                                                     0, /* U+012f60: */
+                                                     0, /* U+012f61: */
+                                                     0, /* U+012f62: */
+                                                     0, /* U+012f63: */
+                                                     0, /* U+012f64: */
+                                                     0, /* U+012f65: */
+                                                     0, /* U+012f66: */
+                                                     0, /* U+012f67: */
+                                                     0, /* U+012f68: */
+                                                     0, /* U+012f69: */
+                                                     0, /* U+012f6a: */
+                                                     0, /* U+012f6b: */
+                                                     0, /* U+012f6c: */
+                                                     0, /* U+012f6d: */
+                                                     0, /* U+012f6e: */
+                                                     0, /* U+012f6f: */
+                                                     0, /* U+012f70: */
+                                                     0, /* U+012f71: */
+                                                     0, /* U+012f72: */
+                                                     0, /* U+012f73: */
+                                                     0, /* U+012f74: */
+                                                     0, /* U+012f75: */
+                                                     0, /* U+012f76: */
+                                                     0, /* U+012f77: */
+                                                     0, /* U+012f78: */
+                                                     0, /* U+012f79: */
+                                                     0, /* U+012f7a: */
+                                                     0, /* U+012f7b: */
+                                                     0, /* U+012f7c: */
+                                                     0, /* U+012f7d: */
+                                                     0, /* U+012f7e: */
+                                                     0, /* U+012f7f: */
+                                                     0, /* U+012f80: */
+                                                     0, /* U+012f81: */
+                                                     0, /* U+012f82: */
+                                                     0, /* U+012f83: */
+                                                     0, /* U+012f84: */
+                                                     0, /* U+012f85: */
+                                                     0, /* U+012f86: */
+                                                     0, /* U+012f87: */
+                                                     0, /* U+012f88: */
+                                                     0, /* U+012f89: */
+                                                     0, /* U+012f8a: */
+                                                     0, /* U+012f8b: */
+                                                     0, /* U+012f8c: */
+                                                     0, /* U+012f8d: */
+                                                     0, /* U+012f8e: */
+                                                     0, /* U+012f8f: */
+                                                     0, /* U+012f90: */
+                                                     0, /* U+012f91: */
+                                                     0, /* U+012f92: */
+                                                     0, /* U+012f93: */
+                                                     0, /* U+012f94: */
+                                                     0, /* U+012f95: */
+                                                     0, /* U+012f96: */
+                                                     0, /* U+012f97: */
+                                                     0, /* U+012f98: */
+                                                     0, /* U+012f99: */
+                                                     0, /* U+012f9a: */
+                                                     0, /* U+012f9b: */
+                                                     0, /* U+012f9c: */
+                                                     0, /* U+012f9d: */
+                                                     0, /* U+012f9e: */
+                                                     0, /* U+012f9f: */
+                                                     0, /* U+012fa0: */
+                                                     0, /* U+012fa1: */
+                                                     0, /* U+012fa2: */
+                                                     0, /* U+012fa3: */
+                                                     0, /* U+012fa4: */
+                                                     0, /* U+012fa5: */
+                                                     0, /* U+012fa6: */
+                                                     0, /* U+012fa7: */
+                                                     0, /* U+012fa8: */
+                                                     0, /* U+012fa9: */
+                                                     0, /* U+012faa: */
+                                                     0, /* U+012fab: */
+                                                     0, /* U+012fac: */
+                                                     0, /* U+012fad: */
+                                                     0, /* U+012fae: */
+                                                     0, /* U+012faf: */
+                                                     0, /* U+012fb0: */
+                                                     0, /* U+012fb1: */
+                                                     0, /* U+012fb2: */
+                                                     0, /* U+012fb3: */
+                                                     0, /* U+012fb4: */
+                                                     0, /* U+012fb5: */
+                                                     0, /* U+012fb6: */
+                                                     0, /* U+012fb7: */
+                                                     0, /* U+012fb8: */
+                                                     0, /* U+012fb9: */
+                                                     0, /* U+012fba: */
+                                                     0, /* U+012fbb: */
+                                                     0, /* U+012fbc: */
+                                                     0, /* U+012fbd: */
+                                                     0, /* U+012fbe: */
+                                                     0, /* U+012fbf: */
+                                                     0, /* U+012fc0: */
+                                                     0, /* U+012fc1: */
+                                                     0, /* U+012fc2: */
+                                                     0, /* U+012fc3: */
+                                                     0, /* U+012fc4: */
+                                                     0, /* U+012fc5: */
+                                                     0, /* U+012fc6: */
+                                                     0, /* U+012fc7: */
+                                                     0, /* U+012fc8: */
+                                                     0, /* U+012fc9: */
+                                                     0, /* U+012fca: */
+                                                     0, /* U+012fcb: */
+                                                     0, /* U+012fcc: */
+                                                     0, /* U+012fcd: */
+                                                     0, /* U+012fce: */
+                                                     0, /* U+012fcf: */
+                                                     0, /* U+012fd0: */
+                                                     0, /* U+012fd1: */
+                                                     0, /* U+012fd2: */
+                                                     0, /* U+012fd3: */
+                                                     0, /* U+012fd4: */
+                                                     0, /* U+012fd5: */
+                                                     0, /* U+012fd6: */
+                                                     0, /* U+012fd7: */
+                                                     0, /* U+012fd8: */
+                                                     0, /* U+012fd9: */
+                                                     0, /* U+012fda: */
+                                                     0, /* U+012fdb: */
+                                                     0, /* U+012fdc: */
+                                                     0, /* U+012fdd: */
+                                                     0, /* U+012fde: */
+                                                     0, /* U+012fdf: */
+                                                     0, /* U+012fe0: */
+                                                     0, /* U+012fe1: */
+                                                     0, /* U+012fe2: */
+                                                     0, /* U+012fe3: */
+                                                     0, /* U+012fe4: */
+                                                     0, /* U+012fe5: */
+                                                     0, /* U+012fe6: */
+                                                     0, /* U+012fe7: */
+                                                     0, /* U+012fe8: */
+                                                     0, /* U+012fe9: */
+                                                     0, /* U+012fea: */
+                                                     0, /* U+012feb: */
+                                                     0, /* U+012fec: */
+                                                     0, /* U+012fed: */
+                                                     0, /* U+012fee: */
+                                                     0, /* U+012fef: */
+                                                     0, /* U+012ff0: */
+                                                     0, /* U+012ff1: */
+                                                     0, /* U+012ff2: */
+                                                     0, /* U+012ff3: */
+                                                     0, /* U+012ff4: */
+                                                     0, /* U+012ff5: */
+                                                     0, /* U+012ff6: */
+                                                     0, /* U+012ff7: */
+                                                     0, /* U+012ff8: */
+                                                     0, /* U+012ff9: */
+                                                     0, /* U+012ffa: */
+                                                     0, /* U+012ffb: */
+                                                     0, /* U+012ffc: */
+                                                     0, /* U+012ffd: */
+                                                     0, /* U+012ffe: */
+                                                     0, /* U+012fff: */
+                                           RTUNI_ALPHA, /* U+013000: EGYPTIAN HIEROGLYPH A001*/
+                                           RTUNI_ALPHA, /* U+013001: EGYPTIAN HIEROGLYPH A002*/
+                                           RTUNI_ALPHA, /* U+013002: EGYPTIAN HIEROGLYPH A003*/
+                                           RTUNI_ALPHA, /* U+013003: EGYPTIAN HIEROGLYPH A004*/
+                                           RTUNI_ALPHA, /* U+013004: EGYPTIAN HIEROGLYPH A005*/
+                                           RTUNI_ALPHA, /* U+013005: EGYPTIAN HIEROGLYPH A005A*/
+                                           RTUNI_ALPHA, /* U+013006: EGYPTIAN HIEROGLYPH A006*/
+                                           RTUNI_ALPHA, /* U+013007: EGYPTIAN HIEROGLYPH A006A*/
+                                           RTUNI_ALPHA, /* U+013008: EGYPTIAN HIEROGLYPH A006B*/
+                                           RTUNI_ALPHA, /* U+013009: EGYPTIAN HIEROGLYPH A007*/
+                                           RTUNI_ALPHA, /* U+01300a: EGYPTIAN HIEROGLYPH A008*/
+                                           RTUNI_ALPHA, /* U+01300b: EGYPTIAN HIEROGLYPH A009*/
+                                           RTUNI_ALPHA, /* U+01300c: EGYPTIAN HIEROGLYPH A010*/
+                                           RTUNI_ALPHA, /* U+01300d: EGYPTIAN HIEROGLYPH A011*/
+                                           RTUNI_ALPHA, /* U+01300e: EGYPTIAN HIEROGLYPH A012*/
+                                           RTUNI_ALPHA, /* U+01300f: EGYPTIAN HIEROGLYPH A013*/
+                                           RTUNI_ALPHA, /* U+013010: EGYPTIAN HIEROGLYPH A014*/
+                                           RTUNI_ALPHA, /* U+013011: EGYPTIAN HIEROGLYPH A014A*/
+                                           RTUNI_ALPHA, /* U+013012: EGYPTIAN HIEROGLYPH A015*/
+                                           RTUNI_ALPHA, /* U+013013: EGYPTIAN HIEROGLYPH A016*/
+                                           RTUNI_ALPHA, /* U+013014: EGYPTIAN HIEROGLYPH A017*/
+                                           RTUNI_ALPHA, /* U+013015: EGYPTIAN HIEROGLYPH A017A*/
+                                           RTUNI_ALPHA, /* U+013016: EGYPTIAN HIEROGLYPH A018*/
+                                           RTUNI_ALPHA, /* U+013017: EGYPTIAN HIEROGLYPH A019*/
+                                           RTUNI_ALPHA, /* U+013018: EGYPTIAN HIEROGLYPH A020*/
+                                           RTUNI_ALPHA, /* U+013019: EGYPTIAN HIEROGLYPH A021*/
+                                           RTUNI_ALPHA, /* U+01301a: EGYPTIAN HIEROGLYPH A022*/
+                                           RTUNI_ALPHA, /* U+01301b: EGYPTIAN HIEROGLYPH A023*/
+                                           RTUNI_ALPHA, /* U+01301c: EGYPTIAN HIEROGLYPH A024*/
+                                           RTUNI_ALPHA, /* U+01301d: EGYPTIAN HIEROGLYPH A025*/
+                                           RTUNI_ALPHA, /* U+01301e: EGYPTIAN HIEROGLYPH A026*/
+                                           RTUNI_ALPHA, /* U+01301f: EGYPTIAN HIEROGLYPH A027*/
+                                           RTUNI_ALPHA, /* U+013020: EGYPTIAN HIEROGLYPH A028*/
+                                           RTUNI_ALPHA, /* U+013021: EGYPTIAN HIEROGLYPH A029*/
+                                           RTUNI_ALPHA, /* U+013022: EGYPTIAN HIEROGLYPH A030*/
+                                           RTUNI_ALPHA, /* U+013023: EGYPTIAN HIEROGLYPH A031*/
+                                           RTUNI_ALPHA, /* U+013024: EGYPTIAN HIEROGLYPH A032*/
+                                           RTUNI_ALPHA, /* U+013025: EGYPTIAN HIEROGLYPH A032A*/
+                                           RTUNI_ALPHA, /* U+013026: EGYPTIAN HIEROGLYPH A033*/
+                                           RTUNI_ALPHA, /* U+013027: EGYPTIAN HIEROGLYPH A034*/
+                                           RTUNI_ALPHA, /* U+013028: EGYPTIAN HIEROGLYPH A035*/
+                                           RTUNI_ALPHA, /* U+013029: EGYPTIAN HIEROGLYPH A036*/
+                                           RTUNI_ALPHA, /* U+01302a: EGYPTIAN HIEROGLYPH A037*/
+                                           RTUNI_ALPHA, /* U+01302b: EGYPTIAN HIEROGLYPH A038*/
+                                           RTUNI_ALPHA, /* U+01302c: EGYPTIAN HIEROGLYPH A039*/
+                                           RTUNI_ALPHA, /* U+01302d: EGYPTIAN HIEROGLYPH A040*/
+                                           RTUNI_ALPHA, /* U+01302e: EGYPTIAN HIEROGLYPH A040A*/
+                                           RTUNI_ALPHA, /* U+01302f: EGYPTIAN HIEROGLYPH A041*/
+                                           RTUNI_ALPHA, /* U+013030: EGYPTIAN HIEROGLYPH A042*/
+                                           RTUNI_ALPHA, /* U+013031: EGYPTIAN HIEROGLYPH A042A*/
+                                           RTUNI_ALPHA, /* U+013032: EGYPTIAN HIEROGLYPH A043*/
+                                           RTUNI_ALPHA, /* U+013033: EGYPTIAN HIEROGLYPH A043A*/
+                                           RTUNI_ALPHA, /* U+013034: EGYPTIAN HIEROGLYPH A044*/
+                                           RTUNI_ALPHA, /* U+013035: EGYPTIAN HIEROGLYPH A045*/
+                                           RTUNI_ALPHA, /* U+013036: EGYPTIAN HIEROGLYPH A045A*/
+                                           RTUNI_ALPHA, /* U+013037: EGYPTIAN HIEROGLYPH A046*/
+                                           RTUNI_ALPHA, /* U+013038: EGYPTIAN HIEROGLYPH A047*/
+                                           RTUNI_ALPHA, /* U+013039: EGYPTIAN HIEROGLYPH A048*/
+                                           RTUNI_ALPHA, /* U+01303a: EGYPTIAN HIEROGLYPH A049*/
+                                           RTUNI_ALPHA, /* U+01303b: EGYPTIAN HIEROGLYPH A050*/
+                                           RTUNI_ALPHA, /* U+01303c: EGYPTIAN HIEROGLYPH A051*/
+                                           RTUNI_ALPHA, /* U+01303d: EGYPTIAN HIEROGLYPH A052*/
+                                           RTUNI_ALPHA, /* U+01303e: EGYPTIAN HIEROGLYPH A053*/
+                                           RTUNI_ALPHA, /* U+01303f: EGYPTIAN HIEROGLYPH A054*/
+                                           RTUNI_ALPHA, /* U+013040: EGYPTIAN HIEROGLYPH A055*/
+                                           RTUNI_ALPHA, /* U+013041: EGYPTIAN HIEROGLYPH A056*/
+                                           RTUNI_ALPHA, /* U+013042: EGYPTIAN HIEROGLYPH A057*/
+                                           RTUNI_ALPHA, /* U+013043: EGYPTIAN HIEROGLYPH A058*/
+                                           RTUNI_ALPHA, /* U+013044: EGYPTIAN HIEROGLYPH A059*/
+                                           RTUNI_ALPHA, /* U+013045: EGYPTIAN HIEROGLYPH A060*/
+                                           RTUNI_ALPHA, /* U+013046: EGYPTIAN HIEROGLYPH A061*/
+                                           RTUNI_ALPHA, /* U+013047: EGYPTIAN HIEROGLYPH A062*/
+                                           RTUNI_ALPHA, /* U+013048: EGYPTIAN HIEROGLYPH A063*/
+                                           RTUNI_ALPHA, /* U+013049: EGYPTIAN HIEROGLYPH A064*/
+                                           RTUNI_ALPHA, /* U+01304a: EGYPTIAN HIEROGLYPH A065*/
+                                           RTUNI_ALPHA, /* U+01304b: EGYPTIAN HIEROGLYPH A066*/
+                                           RTUNI_ALPHA, /* U+01304c: EGYPTIAN HIEROGLYPH A067*/
+                                           RTUNI_ALPHA, /* U+01304d: EGYPTIAN HIEROGLYPH A068*/
+                                           RTUNI_ALPHA, /* U+01304e: EGYPTIAN HIEROGLYPH A069*/
+                                           RTUNI_ALPHA, /* U+01304f: EGYPTIAN HIEROGLYPH A070*/
+                                           RTUNI_ALPHA, /* U+013050: EGYPTIAN HIEROGLYPH B001*/
+                                           RTUNI_ALPHA, /* U+013051: EGYPTIAN HIEROGLYPH B002*/
+                                           RTUNI_ALPHA, /* U+013052: EGYPTIAN HIEROGLYPH B003*/
+                                           RTUNI_ALPHA, /* U+013053: EGYPTIAN HIEROGLYPH B004*/
+                                           RTUNI_ALPHA, /* U+013054: EGYPTIAN HIEROGLYPH B005*/
+                                           RTUNI_ALPHA, /* U+013055: EGYPTIAN HIEROGLYPH B005A*/
+                                           RTUNI_ALPHA, /* U+013056: EGYPTIAN HIEROGLYPH B006*/
+                                           RTUNI_ALPHA, /* U+013057: EGYPTIAN HIEROGLYPH B007*/
+                                           RTUNI_ALPHA, /* U+013058: EGYPTIAN HIEROGLYPH B008*/
+                                           RTUNI_ALPHA, /* U+013059: EGYPTIAN HIEROGLYPH B009*/
+                                           RTUNI_ALPHA, /* U+01305a: EGYPTIAN HIEROGLYPH C001*/
+                                           RTUNI_ALPHA, /* U+01305b: EGYPTIAN HIEROGLYPH C002*/
+                                           RTUNI_ALPHA, /* U+01305c: EGYPTIAN HIEROGLYPH C002A*/
+                                           RTUNI_ALPHA, /* U+01305d: EGYPTIAN HIEROGLYPH C002B*/
+                                           RTUNI_ALPHA, /* U+01305e: EGYPTIAN HIEROGLYPH C002C*/
+                                           RTUNI_ALPHA, /* U+01305f: EGYPTIAN HIEROGLYPH C003*/
+                                           RTUNI_ALPHA, /* U+013060: EGYPTIAN HIEROGLYPH C004*/
+                                           RTUNI_ALPHA, /* U+013061: EGYPTIAN HIEROGLYPH C005*/
+                                           RTUNI_ALPHA, /* U+013062: EGYPTIAN HIEROGLYPH C006*/
+                                           RTUNI_ALPHA, /* U+013063: EGYPTIAN HIEROGLYPH C007*/
+                                           RTUNI_ALPHA, /* U+013064: EGYPTIAN HIEROGLYPH C008*/
+                                           RTUNI_ALPHA, /* U+013065: EGYPTIAN HIEROGLYPH C009*/
+                                           RTUNI_ALPHA, /* U+013066: EGYPTIAN HIEROGLYPH C010*/
+                                           RTUNI_ALPHA, /* U+013067: EGYPTIAN HIEROGLYPH C010A*/
+                                           RTUNI_ALPHA, /* U+013068: EGYPTIAN HIEROGLYPH C011*/
+                                           RTUNI_ALPHA, /* U+013069: EGYPTIAN HIEROGLYPH C012*/
+                                           RTUNI_ALPHA, /* U+01306a: EGYPTIAN HIEROGLYPH C013*/
+                                           RTUNI_ALPHA, /* U+01306b: EGYPTIAN HIEROGLYPH C014*/
+                                           RTUNI_ALPHA, /* U+01306c: EGYPTIAN HIEROGLYPH C015*/
+                                           RTUNI_ALPHA, /* U+01306d: EGYPTIAN HIEROGLYPH C016*/
+                                           RTUNI_ALPHA, /* U+01306e: EGYPTIAN HIEROGLYPH C017*/
+                                           RTUNI_ALPHA, /* U+01306f: EGYPTIAN HIEROGLYPH C018*/
+                                           RTUNI_ALPHA, /* U+013070: EGYPTIAN HIEROGLYPH C019*/
+                                           RTUNI_ALPHA, /* U+013071: EGYPTIAN HIEROGLYPH C020*/
+                                           RTUNI_ALPHA, /* U+013072: EGYPTIAN HIEROGLYPH C021*/
+                                           RTUNI_ALPHA, /* U+013073: EGYPTIAN HIEROGLYPH C022*/
+                                           RTUNI_ALPHA, /* U+013074: EGYPTIAN HIEROGLYPH C023*/
+                                           RTUNI_ALPHA, /* U+013075: EGYPTIAN HIEROGLYPH C024*/
+                                           RTUNI_ALPHA, /* U+013076: EGYPTIAN HIEROGLYPH D001*/
+                                           RTUNI_ALPHA, /* U+013077: EGYPTIAN HIEROGLYPH D002*/
+                                           RTUNI_ALPHA, /* U+013078: EGYPTIAN HIEROGLYPH D003*/
+                                           RTUNI_ALPHA, /* U+013079: EGYPTIAN HIEROGLYPH D004*/
+                                           RTUNI_ALPHA, /* U+01307a: EGYPTIAN HIEROGLYPH D005*/
+                                           RTUNI_ALPHA, /* U+01307b: EGYPTIAN HIEROGLYPH D006*/
+                                           RTUNI_ALPHA, /* U+01307c: EGYPTIAN HIEROGLYPH D007*/
+                                           RTUNI_ALPHA, /* U+01307d: EGYPTIAN HIEROGLYPH D008*/
+                                           RTUNI_ALPHA, /* U+01307e: EGYPTIAN HIEROGLYPH D008A*/
+                                           RTUNI_ALPHA, /* U+01307f: EGYPTIAN HIEROGLYPH D009*/
+                                           RTUNI_ALPHA, /* U+013080: EGYPTIAN HIEROGLYPH D010*/
+                                           RTUNI_ALPHA, /* U+013081: EGYPTIAN HIEROGLYPH D011*/
+                                           RTUNI_ALPHA, /* U+013082: EGYPTIAN HIEROGLYPH D012*/
+                                           RTUNI_ALPHA, /* U+013083: EGYPTIAN HIEROGLYPH D013*/
+                                           RTUNI_ALPHA, /* U+013084: EGYPTIAN HIEROGLYPH D014*/
+                                           RTUNI_ALPHA, /* U+013085: EGYPTIAN HIEROGLYPH D015*/
+                                           RTUNI_ALPHA, /* U+013086: EGYPTIAN HIEROGLYPH D016*/
+                                           RTUNI_ALPHA, /* U+013087: EGYPTIAN HIEROGLYPH D017*/
+                                           RTUNI_ALPHA, /* U+013088: EGYPTIAN HIEROGLYPH D018*/
+                                           RTUNI_ALPHA, /* U+013089: EGYPTIAN HIEROGLYPH D019*/
+                                           RTUNI_ALPHA, /* U+01308a: EGYPTIAN HIEROGLYPH D020*/
+                                           RTUNI_ALPHA, /* U+01308b: EGYPTIAN HIEROGLYPH D021*/
+                                           RTUNI_ALPHA, /* U+01308c: EGYPTIAN HIEROGLYPH D022*/
+                                           RTUNI_ALPHA, /* U+01308d: EGYPTIAN HIEROGLYPH D023*/
+                                           RTUNI_ALPHA, /* U+01308e: EGYPTIAN HIEROGLYPH D024*/
+                                           RTUNI_ALPHA, /* U+01308f: EGYPTIAN HIEROGLYPH D025*/
+                                           RTUNI_ALPHA, /* U+013090: EGYPTIAN HIEROGLYPH D026*/
+                                           RTUNI_ALPHA, /* U+013091: EGYPTIAN HIEROGLYPH D027*/
+                                           RTUNI_ALPHA, /* U+013092: EGYPTIAN HIEROGLYPH D027A*/
+                                           RTUNI_ALPHA, /* U+013093: EGYPTIAN HIEROGLYPH D028*/
+                                           RTUNI_ALPHA, /* U+013094: EGYPTIAN HIEROGLYPH D029*/
+                                           RTUNI_ALPHA, /* U+013095: EGYPTIAN HIEROGLYPH D030*/
+                                           RTUNI_ALPHA, /* U+013096: EGYPTIAN HIEROGLYPH D031*/
+                                           RTUNI_ALPHA, /* U+013097: EGYPTIAN HIEROGLYPH D031A*/
+                                           RTUNI_ALPHA, /* U+013098: EGYPTIAN HIEROGLYPH D032*/
+                                           RTUNI_ALPHA, /* U+013099: EGYPTIAN HIEROGLYPH D033*/
+                                           RTUNI_ALPHA, /* U+01309a: EGYPTIAN HIEROGLYPH D034*/
+                                           RTUNI_ALPHA, /* U+01309b: EGYPTIAN HIEROGLYPH D034A*/
+                                           RTUNI_ALPHA, /* U+01309c: EGYPTIAN HIEROGLYPH D035*/
+                                           RTUNI_ALPHA, /* U+01309d: EGYPTIAN HIEROGLYPH D036*/
+                                           RTUNI_ALPHA, /* U+01309e: EGYPTIAN HIEROGLYPH D037*/
+                                           RTUNI_ALPHA, /* U+01309f: EGYPTIAN HIEROGLYPH D038*/
+                                           RTUNI_ALPHA, /* U+0130a0: EGYPTIAN HIEROGLYPH D039*/
+                                           RTUNI_ALPHA, /* U+0130a1: EGYPTIAN HIEROGLYPH D040*/
+                                           RTUNI_ALPHA, /* U+0130a2: EGYPTIAN HIEROGLYPH D041*/
+                                           RTUNI_ALPHA, /* U+0130a3: EGYPTIAN HIEROGLYPH D042*/
+                                           RTUNI_ALPHA, /* U+0130a4: EGYPTIAN HIEROGLYPH D043*/
+                                           RTUNI_ALPHA, /* U+0130a5: EGYPTIAN HIEROGLYPH D044*/
+                                           RTUNI_ALPHA, /* U+0130a6: EGYPTIAN HIEROGLYPH D045*/
+                                           RTUNI_ALPHA, /* U+0130a7: EGYPTIAN HIEROGLYPH D046*/
+                                           RTUNI_ALPHA, /* U+0130a8: EGYPTIAN HIEROGLYPH D046A*/
+                                           RTUNI_ALPHA, /* U+0130a9: EGYPTIAN HIEROGLYPH D047*/
+                                           RTUNI_ALPHA, /* U+0130aa: EGYPTIAN HIEROGLYPH D048*/
+                                           RTUNI_ALPHA, /* U+0130ab: EGYPTIAN HIEROGLYPH D048A*/
+                                           RTUNI_ALPHA, /* U+0130ac: EGYPTIAN HIEROGLYPH D049*/
+                                           RTUNI_ALPHA, /* U+0130ad: EGYPTIAN HIEROGLYPH D050*/
+                                           RTUNI_ALPHA, /* U+0130ae: EGYPTIAN HIEROGLYPH D050A*/
+                                           RTUNI_ALPHA, /* U+0130af: EGYPTIAN HIEROGLYPH D050B*/
+                                           RTUNI_ALPHA, /* U+0130b0: EGYPTIAN HIEROGLYPH D050C*/
+                                           RTUNI_ALPHA, /* U+0130b1: EGYPTIAN HIEROGLYPH D050D*/
+                                           RTUNI_ALPHA, /* U+0130b2: EGYPTIAN HIEROGLYPH D050E*/
+                                           RTUNI_ALPHA, /* U+0130b3: EGYPTIAN HIEROGLYPH D050F*/
+                                           RTUNI_ALPHA, /* U+0130b4: EGYPTIAN HIEROGLYPH D050G*/
+                                           RTUNI_ALPHA, /* U+0130b5: EGYPTIAN HIEROGLYPH D050H*/
+                                           RTUNI_ALPHA, /* U+0130b6: EGYPTIAN HIEROGLYPH D050I*/
+                                           RTUNI_ALPHA, /* U+0130b7: EGYPTIAN HIEROGLYPH D051*/
+                                           RTUNI_ALPHA, /* U+0130b8: EGYPTIAN HIEROGLYPH D052*/
+                                           RTUNI_ALPHA, /* U+0130b9: EGYPTIAN HIEROGLYPH D052A*/
+                                           RTUNI_ALPHA, /* U+0130ba: EGYPTIAN HIEROGLYPH D053*/
+                                           RTUNI_ALPHA, /* U+0130bb: EGYPTIAN HIEROGLYPH D054*/
+                                           RTUNI_ALPHA, /* U+0130bc: EGYPTIAN HIEROGLYPH D054A*/
+                                           RTUNI_ALPHA, /* U+0130bd: EGYPTIAN HIEROGLYPH D055*/
+                                           RTUNI_ALPHA, /* U+0130be: EGYPTIAN HIEROGLYPH D056*/
+                                           RTUNI_ALPHA, /* U+0130bf: EGYPTIAN HIEROGLYPH D057*/
+                                           RTUNI_ALPHA, /* U+0130c0: EGYPTIAN HIEROGLYPH D058*/
+                                           RTUNI_ALPHA, /* U+0130c1: EGYPTIAN HIEROGLYPH D059*/
+                                           RTUNI_ALPHA, /* U+0130c2: EGYPTIAN HIEROGLYPH D060*/
+                                           RTUNI_ALPHA, /* U+0130c3: EGYPTIAN HIEROGLYPH D061*/
+                                           RTUNI_ALPHA, /* U+0130c4: EGYPTIAN HIEROGLYPH D062*/
+                                           RTUNI_ALPHA, /* U+0130c5: EGYPTIAN HIEROGLYPH D063*/
+                                           RTUNI_ALPHA, /* U+0130c6: EGYPTIAN HIEROGLYPH D064*/
+                                           RTUNI_ALPHA, /* U+0130c7: EGYPTIAN HIEROGLYPH D065*/
+                                           RTUNI_ALPHA, /* U+0130c8: EGYPTIAN HIEROGLYPH D066*/
+                                           RTUNI_ALPHA, /* U+0130c9: EGYPTIAN HIEROGLYPH D067*/
+                                           RTUNI_ALPHA, /* U+0130ca: EGYPTIAN HIEROGLYPH D067A*/
+                                           RTUNI_ALPHA, /* U+0130cb: EGYPTIAN HIEROGLYPH D067B*/
+                                           RTUNI_ALPHA, /* U+0130cc: EGYPTIAN HIEROGLYPH D067C*/
+                                           RTUNI_ALPHA, /* U+0130cd: EGYPTIAN HIEROGLYPH D067D*/
+                                           RTUNI_ALPHA, /* U+0130ce: EGYPTIAN HIEROGLYPH D067E*/
+                                           RTUNI_ALPHA, /* U+0130cf: EGYPTIAN HIEROGLYPH D067F*/
+                                           RTUNI_ALPHA, /* U+0130d0: EGYPTIAN HIEROGLYPH D067G*/
+                                           RTUNI_ALPHA, /* U+0130d1: EGYPTIAN HIEROGLYPH D067H*/
+                                           RTUNI_ALPHA, /* U+0130d2: EGYPTIAN HIEROGLYPH E001*/
+                                           RTUNI_ALPHA, /* U+0130d3: EGYPTIAN HIEROGLYPH E002*/
+                                           RTUNI_ALPHA, /* U+0130d4: EGYPTIAN HIEROGLYPH E003*/
+                                           RTUNI_ALPHA, /* U+0130d5: EGYPTIAN HIEROGLYPH E004*/
+                                           RTUNI_ALPHA, /* U+0130d6: EGYPTIAN HIEROGLYPH E005*/
+                                           RTUNI_ALPHA, /* U+0130d7: EGYPTIAN HIEROGLYPH E006*/
+                                           RTUNI_ALPHA, /* U+0130d8: EGYPTIAN HIEROGLYPH E007*/
+                                           RTUNI_ALPHA, /* U+0130d9: EGYPTIAN HIEROGLYPH E008*/
+                                           RTUNI_ALPHA, /* U+0130da: EGYPTIAN HIEROGLYPH E008A*/
+                                           RTUNI_ALPHA, /* U+0130db: EGYPTIAN HIEROGLYPH E009*/
+                                           RTUNI_ALPHA, /* U+0130dc: EGYPTIAN HIEROGLYPH E009A*/
+                                           RTUNI_ALPHA, /* U+0130dd: EGYPTIAN HIEROGLYPH E010*/
+                                           RTUNI_ALPHA, /* U+0130de: EGYPTIAN HIEROGLYPH E011*/
+                                           RTUNI_ALPHA, /* U+0130df: EGYPTIAN HIEROGLYPH E012*/
+                                           RTUNI_ALPHA, /* U+0130e0: EGYPTIAN HIEROGLYPH E013*/
+                                           RTUNI_ALPHA, /* U+0130e1: EGYPTIAN HIEROGLYPH E014*/
+                                           RTUNI_ALPHA, /* U+0130e2: EGYPTIAN HIEROGLYPH E015*/
+                                           RTUNI_ALPHA, /* U+0130e3: EGYPTIAN HIEROGLYPH E016*/
+                                           RTUNI_ALPHA, /* U+0130e4: EGYPTIAN HIEROGLYPH E016A*/
+                                           RTUNI_ALPHA, /* U+0130e5: EGYPTIAN HIEROGLYPH E017*/
+                                           RTUNI_ALPHA, /* U+0130e6: EGYPTIAN HIEROGLYPH E017A*/
+                                           RTUNI_ALPHA, /* U+0130e7: EGYPTIAN HIEROGLYPH E018*/
+                                           RTUNI_ALPHA, /* U+0130e8: EGYPTIAN HIEROGLYPH E019*/
+                                           RTUNI_ALPHA, /* U+0130e9: EGYPTIAN HIEROGLYPH E020*/
+                                           RTUNI_ALPHA, /* U+0130ea: EGYPTIAN HIEROGLYPH E020A*/
+                                           RTUNI_ALPHA, /* U+0130eb: EGYPTIAN HIEROGLYPH E021*/
+                                           RTUNI_ALPHA, /* U+0130ec: EGYPTIAN HIEROGLYPH E022*/
+                                           RTUNI_ALPHA, /* U+0130ed: EGYPTIAN HIEROGLYPH E023*/
+                                           RTUNI_ALPHA, /* U+0130ee: EGYPTIAN HIEROGLYPH E024*/
+                                           RTUNI_ALPHA, /* U+0130ef: EGYPTIAN HIEROGLYPH E025*/
+                                           RTUNI_ALPHA, /* U+0130f0: EGYPTIAN HIEROGLYPH E026*/
+                                           RTUNI_ALPHA, /* U+0130f1: EGYPTIAN HIEROGLYPH E027*/
+                                           RTUNI_ALPHA, /* U+0130f2: EGYPTIAN HIEROGLYPH E028*/
+                                           RTUNI_ALPHA, /* U+0130f3: EGYPTIAN HIEROGLYPH E028A*/
+                                           RTUNI_ALPHA, /* U+0130f4: EGYPTIAN HIEROGLYPH E029*/
+                                           RTUNI_ALPHA, /* U+0130f5: EGYPTIAN HIEROGLYPH E030*/
+                                           RTUNI_ALPHA, /* U+0130f6: EGYPTIAN HIEROGLYPH E031*/
+                                           RTUNI_ALPHA, /* U+0130f7: EGYPTIAN HIEROGLYPH E032*/
+                                           RTUNI_ALPHA, /* U+0130f8: EGYPTIAN HIEROGLYPH E033*/
+                                           RTUNI_ALPHA, /* U+0130f9: EGYPTIAN HIEROGLYPH E034*/
+                                           RTUNI_ALPHA, /* U+0130fa: EGYPTIAN HIEROGLYPH E034A*/
+                                           RTUNI_ALPHA, /* U+0130fb: EGYPTIAN HIEROGLYPH E036*/
+                                           RTUNI_ALPHA, /* U+0130fc: EGYPTIAN HIEROGLYPH E037*/
+                                           RTUNI_ALPHA, /* U+0130fd: EGYPTIAN HIEROGLYPH E038*/
+                                           RTUNI_ALPHA, /* U+0130fe: EGYPTIAN HIEROGLYPH F001*/
+                                           RTUNI_ALPHA, /* U+0130ff: EGYPTIAN HIEROGLYPH F001A*/
+                                           RTUNI_ALPHA, /* U+013100: EGYPTIAN HIEROGLYPH F002*/
+                                           RTUNI_ALPHA, /* U+013101: EGYPTIAN HIEROGLYPH F003*/
+                                           RTUNI_ALPHA, /* U+013102: EGYPTIAN HIEROGLYPH F004*/
+                                           RTUNI_ALPHA, /* U+013103: EGYPTIAN HIEROGLYPH F005*/
+                                           RTUNI_ALPHA, /* U+013104: EGYPTIAN HIEROGLYPH F006*/
+                                           RTUNI_ALPHA, /* U+013105: EGYPTIAN HIEROGLYPH F007*/
+                                           RTUNI_ALPHA, /* U+013106: EGYPTIAN HIEROGLYPH F008*/
+                                           RTUNI_ALPHA, /* U+013107: EGYPTIAN HIEROGLYPH F009*/
+                                           RTUNI_ALPHA, /* U+013108: EGYPTIAN HIEROGLYPH F010*/
+                                           RTUNI_ALPHA, /* U+013109: EGYPTIAN HIEROGLYPH F011*/
+                                           RTUNI_ALPHA, /* U+01310a: EGYPTIAN HIEROGLYPH F012*/
+                                           RTUNI_ALPHA, /* U+01310b: EGYPTIAN HIEROGLYPH F013*/
+                                           RTUNI_ALPHA, /* U+01310c: EGYPTIAN HIEROGLYPH F013A*/
+                                           RTUNI_ALPHA, /* U+01310d: EGYPTIAN HIEROGLYPH F014*/
+                                           RTUNI_ALPHA, /* U+01310e: EGYPTIAN HIEROGLYPH F015*/
+                                           RTUNI_ALPHA, /* U+01310f: EGYPTIAN HIEROGLYPH F016*/
+                                           RTUNI_ALPHA, /* U+013110: EGYPTIAN HIEROGLYPH F017*/
+                                           RTUNI_ALPHA, /* U+013111: EGYPTIAN HIEROGLYPH F018*/
+                                           RTUNI_ALPHA, /* U+013112: EGYPTIAN HIEROGLYPH F019*/
+                                           RTUNI_ALPHA, /* U+013113: EGYPTIAN HIEROGLYPH F020*/
+                                           RTUNI_ALPHA, /* U+013114: EGYPTIAN HIEROGLYPH F021*/
+                                           RTUNI_ALPHA, /* U+013115: EGYPTIAN HIEROGLYPH F021A*/
+                                           RTUNI_ALPHA, /* U+013116: EGYPTIAN HIEROGLYPH F022*/
+                                           RTUNI_ALPHA, /* U+013117: EGYPTIAN HIEROGLYPH F023*/
+                                           RTUNI_ALPHA, /* U+013118: EGYPTIAN HIEROGLYPH F024*/
+                                           RTUNI_ALPHA, /* U+013119: EGYPTIAN HIEROGLYPH F025*/
+                                           RTUNI_ALPHA, /* U+01311a: EGYPTIAN HIEROGLYPH F026*/
+                                           RTUNI_ALPHA, /* U+01311b: EGYPTIAN HIEROGLYPH F027*/
+                                           RTUNI_ALPHA, /* U+01311c: EGYPTIAN HIEROGLYPH F028*/
+                                           RTUNI_ALPHA, /* U+01311d: EGYPTIAN HIEROGLYPH F029*/
+                                           RTUNI_ALPHA, /* U+01311e: EGYPTIAN HIEROGLYPH F030*/
+                                           RTUNI_ALPHA, /* U+01311f: EGYPTIAN HIEROGLYPH F031*/
+                                           RTUNI_ALPHA, /* U+013120: EGYPTIAN HIEROGLYPH F031A*/
+                                           RTUNI_ALPHA, /* U+013121: EGYPTIAN HIEROGLYPH F032*/
+                                           RTUNI_ALPHA, /* U+013122: EGYPTIAN HIEROGLYPH F033*/
+                                           RTUNI_ALPHA, /* U+013123: EGYPTIAN HIEROGLYPH F034*/
+                                           RTUNI_ALPHA, /* U+013124: EGYPTIAN HIEROGLYPH F035*/
+                                           RTUNI_ALPHA, /* U+013125: EGYPTIAN HIEROGLYPH F036*/
+                                           RTUNI_ALPHA, /* U+013126: EGYPTIAN HIEROGLYPH F037*/
+                                           RTUNI_ALPHA, /* U+013127: EGYPTIAN HIEROGLYPH F037A*/
+                                           RTUNI_ALPHA, /* U+013128: EGYPTIAN HIEROGLYPH F038*/
+                                           RTUNI_ALPHA, /* U+013129: EGYPTIAN HIEROGLYPH F038A*/
+                                           RTUNI_ALPHA, /* U+01312a: EGYPTIAN HIEROGLYPH F039*/
+                                           RTUNI_ALPHA, /* U+01312b: EGYPTIAN HIEROGLYPH F040*/
+                                           RTUNI_ALPHA, /* U+01312c: EGYPTIAN HIEROGLYPH F041*/
+                                           RTUNI_ALPHA, /* U+01312d: EGYPTIAN HIEROGLYPH F042*/
+                                           RTUNI_ALPHA, /* U+01312e: EGYPTIAN HIEROGLYPH F043*/
+                                           RTUNI_ALPHA, /* U+01312f: EGYPTIAN HIEROGLYPH F044*/
+                                           RTUNI_ALPHA, /* U+013130: EGYPTIAN HIEROGLYPH F045*/
+                                           RTUNI_ALPHA, /* U+013131: EGYPTIAN HIEROGLYPH F045A*/
+                                           RTUNI_ALPHA, /* U+013132: EGYPTIAN HIEROGLYPH F046*/
+                                           RTUNI_ALPHA, /* U+013133: EGYPTIAN HIEROGLYPH F046A*/
+                                           RTUNI_ALPHA, /* U+013134: EGYPTIAN HIEROGLYPH F047*/
+                                           RTUNI_ALPHA, /* U+013135: EGYPTIAN HIEROGLYPH F047A*/
+                                           RTUNI_ALPHA, /* U+013136: EGYPTIAN HIEROGLYPH F048*/
+                                           RTUNI_ALPHA, /* U+013137: EGYPTIAN HIEROGLYPH F049*/
+                                           RTUNI_ALPHA, /* U+013138: EGYPTIAN HIEROGLYPH F050*/
+                                           RTUNI_ALPHA, /* U+013139: EGYPTIAN HIEROGLYPH F051*/
+                                           RTUNI_ALPHA, /* U+01313a: EGYPTIAN HIEROGLYPH F051A*/
+                                           RTUNI_ALPHA, /* U+01313b: EGYPTIAN HIEROGLYPH F051B*/
+                                           RTUNI_ALPHA, /* U+01313c: EGYPTIAN HIEROGLYPH F051C*/
+                                           RTUNI_ALPHA, /* U+01313d: EGYPTIAN HIEROGLYPH F052*/
+                                           RTUNI_ALPHA, /* U+01313e: EGYPTIAN HIEROGLYPH F053*/
+                                           RTUNI_ALPHA, /* U+01313f: EGYPTIAN HIEROGLYPH G001*/
+                                           RTUNI_ALPHA, /* U+013140: EGYPTIAN HIEROGLYPH G002*/
+                                           RTUNI_ALPHA, /* U+013141: EGYPTIAN HIEROGLYPH G003*/
+                                           RTUNI_ALPHA, /* U+013142: EGYPTIAN HIEROGLYPH G004*/
+                                           RTUNI_ALPHA, /* U+013143: EGYPTIAN HIEROGLYPH G005*/
+                                           RTUNI_ALPHA, /* U+013144: EGYPTIAN HIEROGLYPH G006*/
+                                           RTUNI_ALPHA, /* U+013145: EGYPTIAN HIEROGLYPH G006A*/
+                                           RTUNI_ALPHA, /* U+013146: EGYPTIAN HIEROGLYPH G007*/
+                                           RTUNI_ALPHA, /* U+013147: EGYPTIAN HIEROGLYPH G007A*/
+                                           RTUNI_ALPHA, /* U+013148: EGYPTIAN HIEROGLYPH G007B*/
+                                           RTUNI_ALPHA, /* U+013149: EGYPTIAN HIEROGLYPH G008*/
+                                           RTUNI_ALPHA, /* U+01314a: EGYPTIAN HIEROGLYPH G009*/
+                                           RTUNI_ALPHA, /* U+01314b: EGYPTIAN HIEROGLYPH G010*/
+                                           RTUNI_ALPHA, /* U+01314c: EGYPTIAN HIEROGLYPH G011*/
+                                           RTUNI_ALPHA, /* U+01314d: EGYPTIAN HIEROGLYPH G011A*/
+                                           RTUNI_ALPHA, /* U+01314e: EGYPTIAN HIEROGLYPH G012*/
+                                           RTUNI_ALPHA, /* U+01314f: EGYPTIAN HIEROGLYPH G013*/
+                                           RTUNI_ALPHA, /* U+013150: EGYPTIAN HIEROGLYPH G014*/
+                                           RTUNI_ALPHA, /* U+013151: EGYPTIAN HIEROGLYPH G015*/
+                                           RTUNI_ALPHA, /* U+013152: EGYPTIAN HIEROGLYPH G016*/
+                                           RTUNI_ALPHA, /* U+013153: EGYPTIAN HIEROGLYPH G017*/
+                                           RTUNI_ALPHA, /* U+013154: EGYPTIAN HIEROGLYPH G018*/
+                                           RTUNI_ALPHA, /* U+013155: EGYPTIAN HIEROGLYPH G019*/
+                                           RTUNI_ALPHA, /* U+013156: EGYPTIAN HIEROGLYPH G020*/
+                                           RTUNI_ALPHA, /* U+013157: EGYPTIAN HIEROGLYPH G020A*/
+                                           RTUNI_ALPHA, /* U+013158: EGYPTIAN HIEROGLYPH G021*/
+                                           RTUNI_ALPHA, /* U+013159: EGYPTIAN HIEROGLYPH G022*/
+                                           RTUNI_ALPHA, /* U+01315a: EGYPTIAN HIEROGLYPH G023*/
+                                           RTUNI_ALPHA, /* U+01315b: EGYPTIAN HIEROGLYPH G024*/
+                                           RTUNI_ALPHA, /* U+01315c: EGYPTIAN HIEROGLYPH G025*/
+                                           RTUNI_ALPHA, /* U+01315d: EGYPTIAN HIEROGLYPH G026*/
+                                           RTUNI_ALPHA, /* U+01315e: EGYPTIAN HIEROGLYPH G026A*/
+                                           RTUNI_ALPHA, /* U+01315f: EGYPTIAN HIEROGLYPH G027*/
+                                           RTUNI_ALPHA, /* U+013160: EGYPTIAN HIEROGLYPH G028*/
+                                           RTUNI_ALPHA, /* U+013161: EGYPTIAN HIEROGLYPH G029*/
+                                           RTUNI_ALPHA, /* U+013162: EGYPTIAN HIEROGLYPH G030*/
+                                           RTUNI_ALPHA, /* U+013163: EGYPTIAN HIEROGLYPH G031*/
+                                           RTUNI_ALPHA, /* U+013164: EGYPTIAN HIEROGLYPH G032*/
+                                           RTUNI_ALPHA, /* U+013165: EGYPTIAN HIEROGLYPH G033*/
+                                           RTUNI_ALPHA, /* U+013166: EGYPTIAN HIEROGLYPH G034*/
+                                           RTUNI_ALPHA, /* U+013167: EGYPTIAN HIEROGLYPH G035*/
+                                           RTUNI_ALPHA, /* U+013168: EGYPTIAN HIEROGLYPH G036*/
+                                           RTUNI_ALPHA, /* U+013169: EGYPTIAN HIEROGLYPH G036A*/
+                                           RTUNI_ALPHA, /* U+01316a: EGYPTIAN HIEROGLYPH G037*/
+                                           RTUNI_ALPHA, /* U+01316b: EGYPTIAN HIEROGLYPH G037A*/
+                                           RTUNI_ALPHA, /* U+01316c: EGYPTIAN HIEROGLYPH G038*/
+                                           RTUNI_ALPHA, /* U+01316d: EGYPTIAN HIEROGLYPH G039*/
+                                           RTUNI_ALPHA, /* U+01316e: EGYPTIAN HIEROGLYPH G040*/
+                                           RTUNI_ALPHA, /* U+01316f: EGYPTIAN HIEROGLYPH G041*/
+                                           RTUNI_ALPHA, /* U+013170: EGYPTIAN HIEROGLYPH G042*/
+                                           RTUNI_ALPHA, /* U+013171: EGYPTIAN HIEROGLYPH G043*/
+                                           RTUNI_ALPHA, /* U+013172: EGYPTIAN HIEROGLYPH G043A*/
+                                           RTUNI_ALPHA, /* U+013173: EGYPTIAN HIEROGLYPH G044*/
+                                           RTUNI_ALPHA, /* U+013174: EGYPTIAN HIEROGLYPH G045*/
+                                           RTUNI_ALPHA, /* U+013175: EGYPTIAN HIEROGLYPH G045A*/
+                                           RTUNI_ALPHA, /* U+013176: EGYPTIAN HIEROGLYPH G046*/
+                                           RTUNI_ALPHA, /* U+013177: EGYPTIAN HIEROGLYPH G047*/
+                                           RTUNI_ALPHA, /* U+013178: EGYPTIAN HIEROGLYPH G048*/
+                                           RTUNI_ALPHA, /* U+013179: EGYPTIAN HIEROGLYPH G049*/
+                                           RTUNI_ALPHA, /* U+01317a: EGYPTIAN HIEROGLYPH G050*/
+                                           RTUNI_ALPHA, /* U+01317b: EGYPTIAN HIEROGLYPH G051*/
+                                           RTUNI_ALPHA, /* U+01317c: EGYPTIAN HIEROGLYPH G052*/
+                                           RTUNI_ALPHA, /* U+01317d: EGYPTIAN HIEROGLYPH G053*/
+                                           RTUNI_ALPHA, /* U+01317e: EGYPTIAN HIEROGLYPH G054*/
+                                           RTUNI_ALPHA, /* U+01317f: EGYPTIAN HIEROGLYPH H001*/
+                                           RTUNI_ALPHA, /* U+013180: EGYPTIAN HIEROGLYPH H002*/
+                                           RTUNI_ALPHA, /* U+013181: EGYPTIAN HIEROGLYPH H003*/
+                                           RTUNI_ALPHA, /* U+013182: EGYPTIAN HIEROGLYPH H004*/
+                                           RTUNI_ALPHA, /* U+013183: EGYPTIAN HIEROGLYPH H005*/
+                                           RTUNI_ALPHA, /* U+013184: EGYPTIAN HIEROGLYPH H006*/
+                                           RTUNI_ALPHA, /* U+013185: EGYPTIAN HIEROGLYPH H006A*/
+                                           RTUNI_ALPHA, /* U+013186: EGYPTIAN HIEROGLYPH H007*/
+                                           RTUNI_ALPHA, /* U+013187: EGYPTIAN HIEROGLYPH H008*/
+                                           RTUNI_ALPHA, /* U+013188: EGYPTIAN HIEROGLYPH I001*/
+                                           RTUNI_ALPHA, /* U+013189: EGYPTIAN HIEROGLYPH I002*/
+                                           RTUNI_ALPHA, /* U+01318a: EGYPTIAN HIEROGLYPH I003*/
+                                           RTUNI_ALPHA, /* U+01318b: EGYPTIAN HIEROGLYPH I004*/
+                                           RTUNI_ALPHA, /* U+01318c: EGYPTIAN HIEROGLYPH I005*/
+                                           RTUNI_ALPHA, /* U+01318d: EGYPTIAN HIEROGLYPH I005A*/
+                                           RTUNI_ALPHA, /* U+01318e: EGYPTIAN HIEROGLYPH I006*/
+                                           RTUNI_ALPHA, /* U+01318f: EGYPTIAN HIEROGLYPH I007*/
+                                           RTUNI_ALPHA, /* U+013190: EGYPTIAN HIEROGLYPH I008*/
+                                           RTUNI_ALPHA, /* U+013191: EGYPTIAN HIEROGLYPH I009*/
+                                           RTUNI_ALPHA, /* U+013192: EGYPTIAN HIEROGLYPH I009A*/
+                                           RTUNI_ALPHA, /* U+013193: EGYPTIAN HIEROGLYPH I010*/
+                                           RTUNI_ALPHA, /* U+013194: EGYPTIAN HIEROGLYPH I010A*/
+                                           RTUNI_ALPHA, /* U+013195: EGYPTIAN HIEROGLYPH I011*/
+                                           RTUNI_ALPHA, /* U+013196: EGYPTIAN HIEROGLYPH I011A*/
+                                           RTUNI_ALPHA, /* U+013197: EGYPTIAN HIEROGLYPH I012*/
+                                           RTUNI_ALPHA, /* U+013198: EGYPTIAN HIEROGLYPH I013*/
+                                           RTUNI_ALPHA, /* U+013199: EGYPTIAN HIEROGLYPH I014*/
+                                           RTUNI_ALPHA, /* U+01319a: EGYPTIAN HIEROGLYPH I015*/
+                                           RTUNI_ALPHA, /* U+01319b: EGYPTIAN HIEROGLYPH K001*/
+                                           RTUNI_ALPHA, /* U+01319c: EGYPTIAN HIEROGLYPH K002*/
+                                           RTUNI_ALPHA, /* U+01319d: EGYPTIAN HIEROGLYPH K003*/
+                                           RTUNI_ALPHA, /* U+01319e: EGYPTIAN HIEROGLYPH K004*/
+                                           RTUNI_ALPHA, /* U+01319f: EGYPTIAN HIEROGLYPH K005*/
+                                           RTUNI_ALPHA, /* U+0131a0: EGYPTIAN HIEROGLYPH K006*/
+                                           RTUNI_ALPHA, /* U+0131a1: EGYPTIAN HIEROGLYPH K007*/
+                                           RTUNI_ALPHA, /* U+0131a2: EGYPTIAN HIEROGLYPH K008*/
+                                           RTUNI_ALPHA, /* U+0131a3: EGYPTIAN HIEROGLYPH L001*/
+                                           RTUNI_ALPHA, /* U+0131a4: EGYPTIAN HIEROGLYPH L002*/
+                                           RTUNI_ALPHA, /* U+0131a5: EGYPTIAN HIEROGLYPH L002A*/
+                                           RTUNI_ALPHA, /* U+0131a6: EGYPTIAN HIEROGLYPH L003*/
+                                           RTUNI_ALPHA, /* U+0131a7: EGYPTIAN HIEROGLYPH L004*/
+                                           RTUNI_ALPHA, /* U+0131a8: EGYPTIAN HIEROGLYPH L005*/
+                                           RTUNI_ALPHA, /* U+0131a9: EGYPTIAN HIEROGLYPH L006*/
+                                           RTUNI_ALPHA, /* U+0131aa: EGYPTIAN HIEROGLYPH L006A*/
+                                           RTUNI_ALPHA, /* U+0131ab: EGYPTIAN HIEROGLYPH L007*/
+                                           RTUNI_ALPHA, /* U+0131ac: EGYPTIAN HIEROGLYPH L008*/
+                                           RTUNI_ALPHA, /* U+0131ad: EGYPTIAN HIEROGLYPH M001*/
+                                           RTUNI_ALPHA, /* U+0131ae: EGYPTIAN HIEROGLYPH M001A*/
+                                           RTUNI_ALPHA, /* U+0131af: EGYPTIAN HIEROGLYPH M001B*/
+                                           RTUNI_ALPHA, /* U+0131b0: EGYPTIAN HIEROGLYPH M002*/
+                                           RTUNI_ALPHA, /* U+0131b1: EGYPTIAN HIEROGLYPH M003*/
+                                           RTUNI_ALPHA, /* U+0131b2: EGYPTIAN HIEROGLYPH M003A*/
+                                           RTUNI_ALPHA, /* U+0131b3: EGYPTIAN HIEROGLYPH M004*/
+                                           RTUNI_ALPHA, /* U+0131b4: EGYPTIAN HIEROGLYPH M005*/
+                                           RTUNI_ALPHA, /* U+0131b5: EGYPTIAN HIEROGLYPH M006*/
+                                           RTUNI_ALPHA, /* U+0131b6: EGYPTIAN HIEROGLYPH M007*/
+                                           RTUNI_ALPHA, /* U+0131b7: EGYPTIAN HIEROGLYPH M008*/
+                                           RTUNI_ALPHA, /* U+0131b8: EGYPTIAN HIEROGLYPH M009*/
+                                           RTUNI_ALPHA, /* U+0131b9: EGYPTIAN HIEROGLYPH M010*/
+                                           RTUNI_ALPHA, /* U+0131ba: EGYPTIAN HIEROGLYPH M010A*/
+                                           RTUNI_ALPHA, /* U+0131bb: EGYPTIAN HIEROGLYPH M011*/
+                                           RTUNI_ALPHA, /* U+0131bc: EGYPTIAN HIEROGLYPH M012*/
+                                           RTUNI_ALPHA, /* U+0131bd: EGYPTIAN HIEROGLYPH M012A*/
+                                           RTUNI_ALPHA, /* U+0131be: EGYPTIAN HIEROGLYPH M012B*/
+                                           RTUNI_ALPHA, /* U+0131bf: EGYPTIAN HIEROGLYPH M012C*/
+                                           RTUNI_ALPHA, /* U+0131c0: EGYPTIAN HIEROGLYPH M012D*/
+                                           RTUNI_ALPHA, /* U+0131c1: EGYPTIAN HIEROGLYPH M012E*/
+                                           RTUNI_ALPHA, /* U+0131c2: EGYPTIAN HIEROGLYPH M012F*/
+                                           RTUNI_ALPHA, /* U+0131c3: EGYPTIAN HIEROGLYPH M012G*/
+                                           RTUNI_ALPHA, /* U+0131c4: EGYPTIAN HIEROGLYPH M012H*/
+                                           RTUNI_ALPHA, /* U+0131c5: EGYPTIAN HIEROGLYPH M013*/
+                                           RTUNI_ALPHA, /* U+0131c6: EGYPTIAN HIEROGLYPH M014*/
+                                           RTUNI_ALPHA, /* U+0131c7: EGYPTIAN HIEROGLYPH M015*/
+                                           RTUNI_ALPHA, /* U+0131c8: EGYPTIAN HIEROGLYPH M015A*/
+                                           RTUNI_ALPHA, /* U+0131c9: EGYPTIAN HIEROGLYPH M016*/
+                                           RTUNI_ALPHA, /* U+0131ca: EGYPTIAN HIEROGLYPH M016A*/
+                                           RTUNI_ALPHA, /* U+0131cb: EGYPTIAN HIEROGLYPH M017*/
+                                           RTUNI_ALPHA, /* U+0131cc: EGYPTIAN HIEROGLYPH M017A*/
+                                           RTUNI_ALPHA, /* U+0131cd: EGYPTIAN HIEROGLYPH M018*/
+                                           RTUNI_ALPHA, /* U+0131ce: EGYPTIAN HIEROGLYPH M019*/
+                                           RTUNI_ALPHA, /* U+0131cf: EGYPTIAN HIEROGLYPH M020*/
+                                           RTUNI_ALPHA, /* U+0131d0: EGYPTIAN HIEROGLYPH M021*/
+                                           RTUNI_ALPHA, /* U+0131d1: EGYPTIAN HIEROGLYPH M022*/
+                                           RTUNI_ALPHA, /* U+0131d2: EGYPTIAN HIEROGLYPH M022A*/
+                                           RTUNI_ALPHA, /* U+0131d3: EGYPTIAN HIEROGLYPH M023*/
+                                           RTUNI_ALPHA, /* U+0131d4: EGYPTIAN HIEROGLYPH M024*/
+                                           RTUNI_ALPHA, /* U+0131d5: EGYPTIAN HIEROGLYPH M024A*/
+                                           RTUNI_ALPHA, /* U+0131d6: EGYPTIAN HIEROGLYPH M025*/
+                                           RTUNI_ALPHA, /* U+0131d7: EGYPTIAN HIEROGLYPH M026*/
+                                           RTUNI_ALPHA, /* U+0131d8: EGYPTIAN HIEROGLYPH M027*/
+                                           RTUNI_ALPHA, /* U+0131d9: EGYPTIAN HIEROGLYPH M028*/
+                                           RTUNI_ALPHA, /* U+0131da: EGYPTIAN HIEROGLYPH M028A*/
+                                           RTUNI_ALPHA, /* U+0131db: EGYPTIAN HIEROGLYPH M029*/
+                                           RTUNI_ALPHA, /* U+0131dc: EGYPTIAN HIEROGLYPH M030*/
+                                           RTUNI_ALPHA, /* U+0131dd: EGYPTIAN HIEROGLYPH M031*/
+                                           RTUNI_ALPHA, /* U+0131de: EGYPTIAN HIEROGLYPH M031A*/
+                                           RTUNI_ALPHA, /* U+0131df: EGYPTIAN HIEROGLYPH M032*/
+                                           RTUNI_ALPHA, /* U+0131e0: EGYPTIAN HIEROGLYPH M033*/
+                                           RTUNI_ALPHA, /* U+0131e1: EGYPTIAN HIEROGLYPH M033A*/
+                                           RTUNI_ALPHA, /* U+0131e2: EGYPTIAN HIEROGLYPH M033B*/
+                                           RTUNI_ALPHA, /* U+0131e3: EGYPTIAN HIEROGLYPH M034*/
+                                           RTUNI_ALPHA, /* U+0131e4: EGYPTIAN HIEROGLYPH M035*/
+                                           RTUNI_ALPHA, /* U+0131e5: EGYPTIAN HIEROGLYPH M036*/
+                                           RTUNI_ALPHA, /* U+0131e6: EGYPTIAN HIEROGLYPH M037*/
+                                           RTUNI_ALPHA, /* U+0131e7: EGYPTIAN HIEROGLYPH M038*/
+                                           RTUNI_ALPHA, /* U+0131e8: EGYPTIAN HIEROGLYPH M039*/
+                                           RTUNI_ALPHA, /* U+0131e9: EGYPTIAN HIEROGLYPH M040*/
+                                           RTUNI_ALPHA, /* U+0131ea: EGYPTIAN HIEROGLYPH M040A*/
+                                           RTUNI_ALPHA, /* U+0131eb: EGYPTIAN HIEROGLYPH M041*/
+                                           RTUNI_ALPHA, /* U+0131ec: EGYPTIAN HIEROGLYPH M042*/
+                                           RTUNI_ALPHA, /* U+0131ed: EGYPTIAN HIEROGLYPH M043*/
+                                           RTUNI_ALPHA, /* U+0131ee: EGYPTIAN HIEROGLYPH M044*/
+                                           RTUNI_ALPHA, /* U+0131ef: EGYPTIAN HIEROGLYPH N001*/
+                                           RTUNI_ALPHA, /* U+0131f0: EGYPTIAN HIEROGLYPH N002*/
+                                           RTUNI_ALPHA, /* U+0131f1: EGYPTIAN HIEROGLYPH N003*/
+                                           RTUNI_ALPHA, /* U+0131f2: EGYPTIAN HIEROGLYPH N004*/
+                                           RTUNI_ALPHA, /* U+0131f3: EGYPTIAN HIEROGLYPH N005*/
+                                           RTUNI_ALPHA, /* U+0131f4: EGYPTIAN HIEROGLYPH N006*/
+                                           RTUNI_ALPHA, /* U+0131f5: EGYPTIAN HIEROGLYPH N007*/
+                                           RTUNI_ALPHA, /* U+0131f6: EGYPTIAN HIEROGLYPH N008*/
+                                           RTUNI_ALPHA, /* U+0131f7: EGYPTIAN HIEROGLYPH N009*/
+                                           RTUNI_ALPHA, /* U+0131f8: EGYPTIAN HIEROGLYPH N010*/
+                                           RTUNI_ALPHA, /* U+0131f9: EGYPTIAN HIEROGLYPH N011*/
+                                           RTUNI_ALPHA, /* U+0131fa: EGYPTIAN HIEROGLYPH N012*/
+                                           RTUNI_ALPHA, /* U+0131fb: EGYPTIAN HIEROGLYPH N013*/
+                                           RTUNI_ALPHA, /* U+0131fc: EGYPTIAN HIEROGLYPH N014*/
+                                           RTUNI_ALPHA, /* U+0131fd: EGYPTIAN HIEROGLYPH N015*/
+                                           RTUNI_ALPHA, /* U+0131fe: EGYPTIAN HIEROGLYPH N016*/
+                                           RTUNI_ALPHA, /* U+0131ff: EGYPTIAN HIEROGLYPH N017*/
+                                           RTUNI_ALPHA, /* U+013200: EGYPTIAN HIEROGLYPH N018*/
+                                           RTUNI_ALPHA, /* U+013201: EGYPTIAN HIEROGLYPH N018A*/
+                                           RTUNI_ALPHA, /* U+013202: EGYPTIAN HIEROGLYPH N018B*/
+                                           RTUNI_ALPHA, /* U+013203: EGYPTIAN HIEROGLYPH N019*/
+                                           RTUNI_ALPHA, /* U+013204: EGYPTIAN HIEROGLYPH N020*/
+                                           RTUNI_ALPHA, /* U+013205: EGYPTIAN HIEROGLYPH N021*/
+                                           RTUNI_ALPHA, /* U+013206: EGYPTIAN HIEROGLYPH N022*/
+                                           RTUNI_ALPHA, /* U+013207: EGYPTIAN HIEROGLYPH N023*/
+                                           RTUNI_ALPHA, /* U+013208: EGYPTIAN HIEROGLYPH N024*/
+                                           RTUNI_ALPHA, /* U+013209: EGYPTIAN HIEROGLYPH N025*/
+                                           RTUNI_ALPHA, /* U+01320a: EGYPTIAN HIEROGLYPH N025A*/
+                                           RTUNI_ALPHA, /* U+01320b: EGYPTIAN HIEROGLYPH N026*/
+                                           RTUNI_ALPHA, /* U+01320c: EGYPTIAN HIEROGLYPH N027*/
+                                           RTUNI_ALPHA, /* U+01320d: EGYPTIAN HIEROGLYPH N028*/
+                                           RTUNI_ALPHA, /* U+01320e: EGYPTIAN HIEROGLYPH N029*/
+                                           RTUNI_ALPHA, /* U+01320f: EGYPTIAN HIEROGLYPH N030*/
+                                           RTUNI_ALPHA, /* U+013210: EGYPTIAN HIEROGLYPH N031*/
+                                           RTUNI_ALPHA, /* U+013211: EGYPTIAN HIEROGLYPH N032*/
+                                           RTUNI_ALPHA, /* U+013212: EGYPTIAN HIEROGLYPH N033*/
+                                           RTUNI_ALPHA, /* U+013213: EGYPTIAN HIEROGLYPH N033A*/
+                                           RTUNI_ALPHA, /* U+013214: EGYPTIAN HIEROGLYPH N034*/
+                                           RTUNI_ALPHA, /* U+013215: EGYPTIAN HIEROGLYPH N034A*/
+                                           RTUNI_ALPHA, /* U+013216: EGYPTIAN HIEROGLYPH N035*/
+                                           RTUNI_ALPHA, /* U+013217: EGYPTIAN HIEROGLYPH N035A*/
+                                           RTUNI_ALPHA, /* U+013218: EGYPTIAN HIEROGLYPH N036*/
+                                           RTUNI_ALPHA, /* U+013219: EGYPTIAN HIEROGLYPH N037*/
+                                           RTUNI_ALPHA, /* U+01321a: EGYPTIAN HIEROGLYPH N037A*/
+                                           RTUNI_ALPHA, /* U+01321b: EGYPTIAN HIEROGLYPH N038*/
+                                           RTUNI_ALPHA, /* U+01321c: EGYPTIAN HIEROGLYPH N039*/
+                                           RTUNI_ALPHA, /* U+01321d: EGYPTIAN HIEROGLYPH N040*/
+                                           RTUNI_ALPHA, /* U+01321e: EGYPTIAN HIEROGLYPH N041*/
+                                           RTUNI_ALPHA, /* U+01321f: EGYPTIAN HIEROGLYPH N042*/
+                                           RTUNI_ALPHA, /* U+013220: EGYPTIAN HIEROGLYPH NL001*/
+                                           RTUNI_ALPHA, /* U+013221: EGYPTIAN HIEROGLYPH NL002*/
+                                           RTUNI_ALPHA, /* U+013222: EGYPTIAN HIEROGLYPH NL003*/
+                                           RTUNI_ALPHA, /* U+013223: EGYPTIAN HIEROGLYPH NL004*/
+                                           RTUNI_ALPHA, /* U+013224: EGYPTIAN HIEROGLYPH NL005*/
+                                           RTUNI_ALPHA, /* U+013225: EGYPTIAN HIEROGLYPH NL005A*/
+                                           RTUNI_ALPHA, /* U+013226: EGYPTIAN HIEROGLYPH NL006*/
+                                           RTUNI_ALPHA, /* U+013227: EGYPTIAN HIEROGLYPH NL007*/
+                                           RTUNI_ALPHA, /* U+013228: EGYPTIAN HIEROGLYPH NL008*/
+                                           RTUNI_ALPHA, /* U+013229: EGYPTIAN HIEROGLYPH NL009*/
+                                           RTUNI_ALPHA, /* U+01322a: EGYPTIAN HIEROGLYPH NL010*/
+                                           RTUNI_ALPHA, /* U+01322b: EGYPTIAN HIEROGLYPH NL011*/
+                                           RTUNI_ALPHA, /* U+01322c: EGYPTIAN HIEROGLYPH NL012*/
+                                           RTUNI_ALPHA, /* U+01322d: EGYPTIAN HIEROGLYPH NL013*/
+                                           RTUNI_ALPHA, /* U+01322e: EGYPTIAN HIEROGLYPH NL014*/
+                                           RTUNI_ALPHA, /* U+01322f: EGYPTIAN HIEROGLYPH NL015*/
+                                           RTUNI_ALPHA, /* U+013230: EGYPTIAN HIEROGLYPH NL016*/
+                                           RTUNI_ALPHA, /* U+013231: EGYPTIAN HIEROGLYPH NL017*/
+                                           RTUNI_ALPHA, /* U+013232: EGYPTIAN HIEROGLYPH NL017A*/
+                                           RTUNI_ALPHA, /* U+013233: EGYPTIAN HIEROGLYPH NL018*/
+                                           RTUNI_ALPHA, /* U+013234: EGYPTIAN HIEROGLYPH NL019*/
+                                           RTUNI_ALPHA, /* U+013235: EGYPTIAN HIEROGLYPH NL020*/
+                                           RTUNI_ALPHA, /* U+013236: EGYPTIAN HIEROGLYPH NU001*/
+                                           RTUNI_ALPHA, /* U+013237: EGYPTIAN HIEROGLYPH NU002*/
+                                           RTUNI_ALPHA, /* U+013238: EGYPTIAN HIEROGLYPH NU003*/
+                                           RTUNI_ALPHA, /* U+013239: EGYPTIAN HIEROGLYPH NU004*/
+                                           RTUNI_ALPHA, /* U+01323a: EGYPTIAN HIEROGLYPH NU005*/
+                                           RTUNI_ALPHA, /* U+01323b: EGYPTIAN HIEROGLYPH NU006*/
+                                           RTUNI_ALPHA, /* U+01323c: EGYPTIAN HIEROGLYPH NU007*/
+                                           RTUNI_ALPHA, /* U+01323d: EGYPTIAN HIEROGLYPH NU008*/
+                                           RTUNI_ALPHA, /* U+01323e: EGYPTIAN HIEROGLYPH NU009*/
+                                           RTUNI_ALPHA, /* U+01323f: EGYPTIAN HIEROGLYPH NU010*/
+                                           RTUNI_ALPHA, /* U+013240: EGYPTIAN HIEROGLYPH NU010A*/
+                                           RTUNI_ALPHA, /* U+013241: EGYPTIAN HIEROGLYPH NU011*/
+                                           RTUNI_ALPHA, /* U+013242: EGYPTIAN HIEROGLYPH NU011A*/
+                                           RTUNI_ALPHA, /* U+013243: EGYPTIAN HIEROGLYPH NU012*/
+                                           RTUNI_ALPHA, /* U+013244: EGYPTIAN HIEROGLYPH NU013*/
+                                           RTUNI_ALPHA, /* U+013245: EGYPTIAN HIEROGLYPH NU014*/
+                                           RTUNI_ALPHA, /* U+013246: EGYPTIAN HIEROGLYPH NU015*/
+                                           RTUNI_ALPHA, /* U+013247: EGYPTIAN HIEROGLYPH NU016*/
+                                           RTUNI_ALPHA, /* U+013248: EGYPTIAN HIEROGLYPH NU017*/
+                                           RTUNI_ALPHA, /* U+013249: EGYPTIAN HIEROGLYPH NU018*/
+                                           RTUNI_ALPHA, /* U+01324a: EGYPTIAN HIEROGLYPH NU018A*/
+                                           RTUNI_ALPHA, /* U+01324b: EGYPTIAN HIEROGLYPH NU019*/
+                                           RTUNI_ALPHA, /* U+01324c: EGYPTIAN HIEROGLYPH NU020*/
+                                           RTUNI_ALPHA, /* U+01324d: EGYPTIAN HIEROGLYPH NU021*/
+                                           RTUNI_ALPHA, /* U+01324e: EGYPTIAN HIEROGLYPH NU022*/
+                                           RTUNI_ALPHA, /* U+01324f: EGYPTIAN HIEROGLYPH NU022A*/
+                                           RTUNI_ALPHA, /* U+013250: EGYPTIAN HIEROGLYPH O001*/
+                                           RTUNI_ALPHA, /* U+013251: EGYPTIAN HIEROGLYPH O001A*/
+                                           RTUNI_ALPHA, /* U+013252: EGYPTIAN HIEROGLYPH O002*/
+                                           RTUNI_ALPHA, /* U+013253: EGYPTIAN HIEROGLYPH O003*/
+                                           RTUNI_ALPHA, /* U+013254: EGYPTIAN HIEROGLYPH O004*/
+                                           RTUNI_ALPHA, /* U+013255: EGYPTIAN HIEROGLYPH O005*/
+                                           RTUNI_ALPHA, /* U+013256: EGYPTIAN HIEROGLYPH O005A*/
+                                           RTUNI_ALPHA, /* U+013257: EGYPTIAN HIEROGLYPH O006*/
+                                           RTUNI_ALPHA, /* U+013258: EGYPTIAN HIEROGLYPH O006A*/
+                                           RTUNI_ALPHA, /* U+013259: EGYPTIAN HIEROGLYPH O006B*/
+                                           RTUNI_ALPHA, /* U+01325a: EGYPTIAN HIEROGLYPH O006C*/
+                                           RTUNI_ALPHA, /* U+01325b: EGYPTIAN HIEROGLYPH O006D*/
+                                           RTUNI_ALPHA, /* U+01325c: EGYPTIAN HIEROGLYPH O006E*/
+                                           RTUNI_ALPHA, /* U+01325d: EGYPTIAN HIEROGLYPH O006F*/
+                                           RTUNI_ALPHA, /* U+01325e: EGYPTIAN HIEROGLYPH O007*/
+                                           RTUNI_ALPHA, /* U+01325f: EGYPTIAN HIEROGLYPH O008*/
+                                           RTUNI_ALPHA, /* U+013260: EGYPTIAN HIEROGLYPH O009*/
+                                           RTUNI_ALPHA, /* U+013261: EGYPTIAN HIEROGLYPH O010*/
+                                           RTUNI_ALPHA, /* U+013262: EGYPTIAN HIEROGLYPH O010A*/
+                                           RTUNI_ALPHA, /* U+013263: EGYPTIAN HIEROGLYPH O010B*/
+                                           RTUNI_ALPHA, /* U+013264: EGYPTIAN HIEROGLYPH O010C*/
+                                           RTUNI_ALPHA, /* U+013265: EGYPTIAN HIEROGLYPH O011*/
+                                           RTUNI_ALPHA, /* U+013266: EGYPTIAN HIEROGLYPH O012*/
+                                           RTUNI_ALPHA, /* U+013267: EGYPTIAN HIEROGLYPH O013*/
+                                           RTUNI_ALPHA, /* U+013268: EGYPTIAN HIEROGLYPH O014*/
+                                           RTUNI_ALPHA, /* U+013269: EGYPTIAN HIEROGLYPH O015*/
+                                           RTUNI_ALPHA, /* U+01326a: EGYPTIAN HIEROGLYPH O016*/
+                                           RTUNI_ALPHA, /* U+01326b: EGYPTIAN HIEROGLYPH O017*/
+                                           RTUNI_ALPHA, /* U+01326c: EGYPTIAN HIEROGLYPH O018*/
+                                           RTUNI_ALPHA, /* U+01326d: EGYPTIAN HIEROGLYPH O019*/
+                                           RTUNI_ALPHA, /* U+01326e: EGYPTIAN HIEROGLYPH O019A*/
+                                           RTUNI_ALPHA, /* U+01326f: EGYPTIAN HIEROGLYPH O020*/
+                                           RTUNI_ALPHA, /* U+013270: EGYPTIAN HIEROGLYPH O020A*/
+                                           RTUNI_ALPHA, /* U+013271: EGYPTIAN HIEROGLYPH O021*/
+                                           RTUNI_ALPHA, /* U+013272: EGYPTIAN HIEROGLYPH O022*/
+                                           RTUNI_ALPHA, /* U+013273: EGYPTIAN HIEROGLYPH O023*/
+                                           RTUNI_ALPHA, /* U+013274: EGYPTIAN HIEROGLYPH O024*/
+                                           RTUNI_ALPHA, /* U+013275: EGYPTIAN HIEROGLYPH O024A*/
+                                           RTUNI_ALPHA, /* U+013276: EGYPTIAN HIEROGLYPH O025*/
+                                           RTUNI_ALPHA, /* U+013277: EGYPTIAN HIEROGLYPH O025A*/
+                                           RTUNI_ALPHA, /* U+013278: EGYPTIAN HIEROGLYPH O026*/
+                                           RTUNI_ALPHA, /* U+013279: EGYPTIAN HIEROGLYPH O027*/
+                                           RTUNI_ALPHA, /* U+01327a: EGYPTIAN HIEROGLYPH O028*/
+                                           RTUNI_ALPHA, /* U+01327b: EGYPTIAN HIEROGLYPH O029*/
+                                           RTUNI_ALPHA, /* U+01327c: EGYPTIAN HIEROGLYPH O029A*/
+                                           RTUNI_ALPHA, /* U+01327d: EGYPTIAN HIEROGLYPH O030*/
+                                           RTUNI_ALPHA, /* U+01327e: EGYPTIAN HIEROGLYPH O030A*/
+                                           RTUNI_ALPHA, /* U+01327f: EGYPTIAN HIEROGLYPH O031*/
+                                           RTUNI_ALPHA, /* U+013280: EGYPTIAN HIEROGLYPH O032*/
+                                           RTUNI_ALPHA, /* U+013281: EGYPTIAN HIEROGLYPH O033*/
+                                           RTUNI_ALPHA, /* U+013282: EGYPTIAN HIEROGLYPH O033A*/
+                                           RTUNI_ALPHA, /* U+013283: EGYPTIAN HIEROGLYPH O034*/
+                                           RTUNI_ALPHA, /* U+013284: EGYPTIAN HIEROGLYPH O035*/
+                                           RTUNI_ALPHA, /* U+013285: EGYPTIAN HIEROGLYPH O036*/
+                                           RTUNI_ALPHA, /* U+013286: EGYPTIAN HIEROGLYPH O036A*/
+                                           RTUNI_ALPHA, /* U+013287: EGYPTIAN HIEROGLYPH O036B*/
+                                           RTUNI_ALPHA, /* U+013288: EGYPTIAN HIEROGLYPH O036C*/
+                                           RTUNI_ALPHA, /* U+013289: EGYPTIAN HIEROGLYPH O036D*/
+                                           RTUNI_ALPHA, /* U+01328a: EGYPTIAN HIEROGLYPH O037*/
+                                           RTUNI_ALPHA, /* U+01328b: EGYPTIAN HIEROGLYPH O038*/
+                                           RTUNI_ALPHA, /* U+01328c: EGYPTIAN HIEROGLYPH O039*/
+                                           RTUNI_ALPHA, /* U+01328d: EGYPTIAN HIEROGLYPH O040*/
+                                           RTUNI_ALPHA, /* U+01328e: EGYPTIAN HIEROGLYPH O041*/
+                                           RTUNI_ALPHA, /* U+01328f: EGYPTIAN HIEROGLYPH O042*/
+                                           RTUNI_ALPHA, /* U+013290: EGYPTIAN HIEROGLYPH O043*/
+                                           RTUNI_ALPHA, /* U+013291: EGYPTIAN HIEROGLYPH O044*/
+                                           RTUNI_ALPHA, /* U+013292: EGYPTIAN HIEROGLYPH O045*/
+                                           RTUNI_ALPHA, /* U+013293: EGYPTIAN HIEROGLYPH O046*/
+                                           RTUNI_ALPHA, /* U+013294: EGYPTIAN HIEROGLYPH O047*/
+                                           RTUNI_ALPHA, /* U+013295: EGYPTIAN HIEROGLYPH O048*/
+                                           RTUNI_ALPHA, /* U+013296: EGYPTIAN HIEROGLYPH O049*/
+                                           RTUNI_ALPHA, /* U+013297: EGYPTIAN HIEROGLYPH O050*/
+                                           RTUNI_ALPHA, /* U+013298: EGYPTIAN HIEROGLYPH O050A*/
+                                           RTUNI_ALPHA, /* U+013299: EGYPTIAN HIEROGLYPH O050B*/
+                                           RTUNI_ALPHA, /* U+01329a: EGYPTIAN HIEROGLYPH O051*/
+                                           RTUNI_ALPHA, /* U+01329b: EGYPTIAN HIEROGLYPH P001*/
+                                           RTUNI_ALPHA, /* U+01329c: EGYPTIAN HIEROGLYPH P001A*/
+                                           RTUNI_ALPHA, /* U+01329d: EGYPTIAN HIEROGLYPH P002*/
+                                           RTUNI_ALPHA, /* U+01329e: EGYPTIAN HIEROGLYPH P003*/
+                                           RTUNI_ALPHA, /* U+01329f: EGYPTIAN HIEROGLYPH P003A*/
+                                           RTUNI_ALPHA, /* U+0132a0: EGYPTIAN HIEROGLYPH P004*/
+                                           RTUNI_ALPHA, /* U+0132a1: EGYPTIAN HIEROGLYPH P005*/
+                                           RTUNI_ALPHA, /* U+0132a2: EGYPTIAN HIEROGLYPH P006*/
+                                           RTUNI_ALPHA, /* U+0132a3: EGYPTIAN HIEROGLYPH P007*/
+                                           RTUNI_ALPHA, /* U+0132a4: EGYPTIAN HIEROGLYPH P008*/
+                                           RTUNI_ALPHA, /* U+0132a5: EGYPTIAN HIEROGLYPH P009*/
+                                           RTUNI_ALPHA, /* U+0132a6: EGYPTIAN HIEROGLYPH P010*/
+                                           RTUNI_ALPHA, /* U+0132a7: EGYPTIAN HIEROGLYPH P011*/
+                                           RTUNI_ALPHA, /* U+0132a8: EGYPTIAN HIEROGLYPH Q001*/
+                                           RTUNI_ALPHA, /* U+0132a9: EGYPTIAN HIEROGLYPH Q002*/
+                                           RTUNI_ALPHA, /* U+0132aa: EGYPTIAN HIEROGLYPH Q003*/
+                                           RTUNI_ALPHA, /* U+0132ab: EGYPTIAN HIEROGLYPH Q004*/
+                                           RTUNI_ALPHA, /* U+0132ac: EGYPTIAN HIEROGLYPH Q005*/
+                                           RTUNI_ALPHA, /* U+0132ad: EGYPTIAN HIEROGLYPH Q006*/
+                                           RTUNI_ALPHA, /* U+0132ae: EGYPTIAN HIEROGLYPH Q007*/
+                                           RTUNI_ALPHA, /* U+0132af: EGYPTIAN HIEROGLYPH R001*/
+                                           RTUNI_ALPHA, /* U+0132b0: EGYPTIAN HIEROGLYPH R002*/
+                                           RTUNI_ALPHA, /* U+0132b1: EGYPTIAN HIEROGLYPH R002A*/
+                                           RTUNI_ALPHA, /* U+0132b2: EGYPTIAN HIEROGLYPH R003*/
+                                           RTUNI_ALPHA, /* U+0132b3: EGYPTIAN HIEROGLYPH R003A*/
+                                           RTUNI_ALPHA, /* U+0132b4: EGYPTIAN HIEROGLYPH R003B*/
+                                           RTUNI_ALPHA, /* U+0132b5: EGYPTIAN HIEROGLYPH R004*/
+                                           RTUNI_ALPHA, /* U+0132b6: EGYPTIAN HIEROGLYPH R005*/
+                                           RTUNI_ALPHA, /* U+0132b7: EGYPTIAN HIEROGLYPH R006*/
+                                           RTUNI_ALPHA, /* U+0132b8: EGYPTIAN HIEROGLYPH R007*/
+                                           RTUNI_ALPHA, /* U+0132b9: EGYPTIAN HIEROGLYPH R008*/
+                                           RTUNI_ALPHA, /* U+0132ba: EGYPTIAN HIEROGLYPH R009*/
+                                           RTUNI_ALPHA, /* U+0132bb: EGYPTIAN HIEROGLYPH R010*/
+                                           RTUNI_ALPHA, /* U+0132bc: EGYPTIAN HIEROGLYPH R010A*/
+                                           RTUNI_ALPHA, /* U+0132bd: EGYPTIAN HIEROGLYPH R011*/
+                                           RTUNI_ALPHA, /* U+0132be: EGYPTIAN HIEROGLYPH R012*/
+                                           RTUNI_ALPHA, /* U+0132bf: EGYPTIAN HIEROGLYPH R013*/
+                                           RTUNI_ALPHA, /* U+0132c0: EGYPTIAN HIEROGLYPH R014*/
+                                           RTUNI_ALPHA, /* U+0132c1: EGYPTIAN HIEROGLYPH R015*/
+                                           RTUNI_ALPHA, /* U+0132c2: EGYPTIAN HIEROGLYPH R016*/
+                                           RTUNI_ALPHA, /* U+0132c3: EGYPTIAN HIEROGLYPH R016A*/
+                                           RTUNI_ALPHA, /* U+0132c4: EGYPTIAN HIEROGLYPH R017*/
+                                           RTUNI_ALPHA, /* U+0132c5: EGYPTIAN HIEROGLYPH R018*/
+                                           RTUNI_ALPHA, /* U+0132c6: EGYPTIAN HIEROGLYPH R019*/
+                                           RTUNI_ALPHA, /* U+0132c7: EGYPTIAN HIEROGLYPH R020*/
+                                           RTUNI_ALPHA, /* U+0132c8: EGYPTIAN HIEROGLYPH R021*/
+                                           RTUNI_ALPHA, /* U+0132c9: EGYPTIAN HIEROGLYPH R022*/
+                                           RTUNI_ALPHA, /* U+0132ca: EGYPTIAN HIEROGLYPH R023*/
+                                           RTUNI_ALPHA, /* U+0132cb: EGYPTIAN HIEROGLYPH R024*/
+                                           RTUNI_ALPHA, /* U+0132cc: EGYPTIAN HIEROGLYPH R025*/
+                                           RTUNI_ALPHA, /* U+0132cd: EGYPTIAN HIEROGLYPH R026*/
+                                           RTUNI_ALPHA, /* U+0132ce: EGYPTIAN HIEROGLYPH R027*/
+                                           RTUNI_ALPHA, /* U+0132cf: EGYPTIAN HIEROGLYPH R028*/
+                                           RTUNI_ALPHA, /* U+0132d0: EGYPTIAN HIEROGLYPH R029*/
+                                           RTUNI_ALPHA, /* U+0132d1: EGYPTIAN HIEROGLYPH S001*/
+                                           RTUNI_ALPHA, /* U+0132d2: EGYPTIAN HIEROGLYPH S002*/
+                                           RTUNI_ALPHA, /* U+0132d3: EGYPTIAN HIEROGLYPH S002A*/
+                                           RTUNI_ALPHA, /* U+0132d4: EGYPTIAN HIEROGLYPH S003*/
+                                           RTUNI_ALPHA, /* U+0132d5: EGYPTIAN HIEROGLYPH S004*/
+                                           RTUNI_ALPHA, /* U+0132d6: EGYPTIAN HIEROGLYPH S005*/
+                                           RTUNI_ALPHA, /* U+0132d7: EGYPTIAN HIEROGLYPH S006*/
+                                           RTUNI_ALPHA, /* U+0132d8: EGYPTIAN HIEROGLYPH S006A*/
+                                           RTUNI_ALPHA, /* U+0132d9: EGYPTIAN HIEROGLYPH S007*/
+                                           RTUNI_ALPHA, /* U+0132da: EGYPTIAN HIEROGLYPH S008*/
+                                           RTUNI_ALPHA, /* U+0132db: EGYPTIAN HIEROGLYPH S009*/
+                                           RTUNI_ALPHA, /* U+0132dc: EGYPTIAN HIEROGLYPH S010*/
+                                           RTUNI_ALPHA, /* U+0132dd: EGYPTIAN HIEROGLYPH S011*/
+                                           RTUNI_ALPHA, /* U+0132de: EGYPTIAN HIEROGLYPH S012*/
+                                           RTUNI_ALPHA, /* U+0132df: EGYPTIAN HIEROGLYPH S013*/
+                                           RTUNI_ALPHA, /* U+0132e0: EGYPTIAN HIEROGLYPH S014*/
+                                           RTUNI_ALPHA, /* U+0132e1: EGYPTIAN HIEROGLYPH S014A*/
+                                           RTUNI_ALPHA, /* U+0132e2: EGYPTIAN HIEROGLYPH S014B*/
+                                           RTUNI_ALPHA, /* U+0132e3: EGYPTIAN HIEROGLYPH S015*/
+                                           RTUNI_ALPHA, /* U+0132e4: EGYPTIAN HIEROGLYPH S016*/
+                                           RTUNI_ALPHA, /* U+0132e5: EGYPTIAN HIEROGLYPH S017*/
+                                           RTUNI_ALPHA, /* U+0132e6: EGYPTIAN HIEROGLYPH S017A*/
+                                           RTUNI_ALPHA, /* U+0132e7: EGYPTIAN HIEROGLYPH S018*/
+                                           RTUNI_ALPHA, /* U+0132e8: EGYPTIAN HIEROGLYPH S019*/
+                                           RTUNI_ALPHA, /* U+0132e9: EGYPTIAN HIEROGLYPH S020*/
+                                           RTUNI_ALPHA, /* U+0132ea: EGYPTIAN HIEROGLYPH S021*/
+                                           RTUNI_ALPHA, /* U+0132eb: EGYPTIAN HIEROGLYPH S022*/
+                                           RTUNI_ALPHA, /* U+0132ec: EGYPTIAN HIEROGLYPH S023*/
+                                           RTUNI_ALPHA, /* U+0132ed: EGYPTIAN HIEROGLYPH S024*/
+                                           RTUNI_ALPHA, /* U+0132ee: EGYPTIAN HIEROGLYPH S025*/
+                                           RTUNI_ALPHA, /* U+0132ef: EGYPTIAN HIEROGLYPH S026*/
+                                           RTUNI_ALPHA, /* U+0132f0: EGYPTIAN HIEROGLYPH S026A*/
+                                           RTUNI_ALPHA, /* U+0132f1: EGYPTIAN HIEROGLYPH S026B*/
+                                           RTUNI_ALPHA, /* U+0132f2: EGYPTIAN HIEROGLYPH S027*/
+                                           RTUNI_ALPHA, /* U+0132f3: EGYPTIAN HIEROGLYPH S028*/
+                                           RTUNI_ALPHA, /* U+0132f4: EGYPTIAN HIEROGLYPH S029*/
+                                           RTUNI_ALPHA, /* U+0132f5: EGYPTIAN HIEROGLYPH S030*/
+                                           RTUNI_ALPHA, /* U+0132f6: EGYPTIAN HIEROGLYPH S031*/
+                                           RTUNI_ALPHA, /* U+0132f7: EGYPTIAN HIEROGLYPH S032*/
+                                           RTUNI_ALPHA, /* U+0132f8: EGYPTIAN HIEROGLYPH S033*/
+                                           RTUNI_ALPHA, /* U+0132f9: EGYPTIAN HIEROGLYPH S034*/
+                                           RTUNI_ALPHA, /* U+0132fa: EGYPTIAN HIEROGLYPH S035*/
+                                           RTUNI_ALPHA, /* U+0132fb: EGYPTIAN HIEROGLYPH S035A*/
+                                           RTUNI_ALPHA, /* U+0132fc: EGYPTIAN HIEROGLYPH S036*/
+                                           RTUNI_ALPHA, /* U+0132fd: EGYPTIAN HIEROGLYPH S037*/
+                                           RTUNI_ALPHA, /* U+0132fe: EGYPTIAN HIEROGLYPH S038*/
+                                           RTUNI_ALPHA, /* U+0132ff: EGYPTIAN HIEROGLYPH S039*/
+                                           RTUNI_ALPHA, /* U+013300: EGYPTIAN HIEROGLYPH S040*/
+                                           RTUNI_ALPHA, /* U+013301: EGYPTIAN HIEROGLYPH S041*/
+                                           RTUNI_ALPHA, /* U+013302: EGYPTIAN HIEROGLYPH S042*/
+                                           RTUNI_ALPHA, /* U+013303: EGYPTIAN HIEROGLYPH S043*/
+                                           RTUNI_ALPHA, /* U+013304: EGYPTIAN HIEROGLYPH S044*/
+                                           RTUNI_ALPHA, /* U+013305: EGYPTIAN HIEROGLYPH S045*/
+                                           RTUNI_ALPHA, /* U+013306: EGYPTIAN HIEROGLYPH S046*/
+                                           RTUNI_ALPHA, /* U+013307: EGYPTIAN HIEROGLYPH T001*/
+                                           RTUNI_ALPHA, /* U+013308: EGYPTIAN HIEROGLYPH T002*/
+                                           RTUNI_ALPHA, /* U+013309: EGYPTIAN HIEROGLYPH T003*/
+                                           RTUNI_ALPHA, /* U+01330a: EGYPTIAN HIEROGLYPH T003A*/
+                                           RTUNI_ALPHA, /* U+01330b: EGYPTIAN HIEROGLYPH T004*/
+                                           RTUNI_ALPHA, /* U+01330c: EGYPTIAN HIEROGLYPH T005*/
+                                           RTUNI_ALPHA, /* U+01330d: EGYPTIAN HIEROGLYPH T006*/
+                                           RTUNI_ALPHA, /* U+01330e: EGYPTIAN HIEROGLYPH T007*/
+                                           RTUNI_ALPHA, /* U+01330f: EGYPTIAN HIEROGLYPH T007A*/
+                                           RTUNI_ALPHA, /* U+013310: EGYPTIAN HIEROGLYPH T008*/
+                                           RTUNI_ALPHA, /* U+013311: EGYPTIAN HIEROGLYPH T008A*/
+                                           RTUNI_ALPHA, /* U+013312: EGYPTIAN HIEROGLYPH T009*/
+                                           RTUNI_ALPHA, /* U+013313: EGYPTIAN HIEROGLYPH T009A*/
+                                           RTUNI_ALPHA, /* U+013314: EGYPTIAN HIEROGLYPH T010*/
+                                           RTUNI_ALPHA, /* U+013315: EGYPTIAN HIEROGLYPH T011*/
+                                           RTUNI_ALPHA, /* U+013316: EGYPTIAN HIEROGLYPH T011A*/
+                                           RTUNI_ALPHA, /* U+013317: EGYPTIAN HIEROGLYPH T012*/
+                                           RTUNI_ALPHA, /* U+013318: EGYPTIAN HIEROGLYPH T013*/
+                                           RTUNI_ALPHA, /* U+013319: EGYPTIAN HIEROGLYPH T014*/
+                                           RTUNI_ALPHA, /* U+01331a: EGYPTIAN HIEROGLYPH T015*/
+                                           RTUNI_ALPHA, /* U+01331b: EGYPTIAN HIEROGLYPH T016*/
+                                           RTUNI_ALPHA, /* U+01331c: EGYPTIAN HIEROGLYPH T016A*/
+                                           RTUNI_ALPHA, /* U+01331d: EGYPTIAN HIEROGLYPH T017*/
+                                           RTUNI_ALPHA, /* U+01331e: EGYPTIAN HIEROGLYPH T018*/
+                                           RTUNI_ALPHA, /* U+01331f: EGYPTIAN HIEROGLYPH T019*/
+                                           RTUNI_ALPHA, /* U+013320: EGYPTIAN HIEROGLYPH T020*/
+                                           RTUNI_ALPHA, /* U+013321: EGYPTIAN HIEROGLYPH T021*/
+                                           RTUNI_ALPHA, /* U+013322: EGYPTIAN HIEROGLYPH T022*/
+                                           RTUNI_ALPHA, /* U+013323: EGYPTIAN HIEROGLYPH T023*/
+                                           RTUNI_ALPHA, /* U+013324: EGYPTIAN HIEROGLYPH T024*/
+                                           RTUNI_ALPHA, /* U+013325: EGYPTIAN HIEROGLYPH T025*/
+                                           RTUNI_ALPHA, /* U+013326: EGYPTIAN HIEROGLYPH T026*/
+                                           RTUNI_ALPHA, /* U+013327: EGYPTIAN HIEROGLYPH T027*/
+                                           RTUNI_ALPHA, /* U+013328: EGYPTIAN HIEROGLYPH T028*/
+                                           RTUNI_ALPHA, /* U+013329: EGYPTIAN HIEROGLYPH T029*/
+                                           RTUNI_ALPHA, /* U+01332a: EGYPTIAN HIEROGLYPH T030*/
+                                           RTUNI_ALPHA, /* U+01332b: EGYPTIAN HIEROGLYPH T031*/
+                                           RTUNI_ALPHA, /* U+01332c: EGYPTIAN HIEROGLYPH T032*/
+                                           RTUNI_ALPHA, /* U+01332d: EGYPTIAN HIEROGLYPH T032A*/
+                                           RTUNI_ALPHA, /* U+01332e: EGYPTIAN HIEROGLYPH T033*/
+                                           RTUNI_ALPHA, /* U+01332f: EGYPTIAN HIEROGLYPH T033A*/
+                                           RTUNI_ALPHA, /* U+013330: EGYPTIAN HIEROGLYPH T034*/
+                                           RTUNI_ALPHA, /* U+013331: EGYPTIAN HIEROGLYPH T035*/
+                                           RTUNI_ALPHA, /* U+013332: EGYPTIAN HIEROGLYPH T036*/
+                                           RTUNI_ALPHA, /* U+013333: EGYPTIAN HIEROGLYPH U001*/
+                                           RTUNI_ALPHA, /* U+013334: EGYPTIAN HIEROGLYPH U002*/
+                                           RTUNI_ALPHA, /* U+013335: EGYPTIAN HIEROGLYPH U003*/
+                                           RTUNI_ALPHA, /* U+013336: EGYPTIAN HIEROGLYPH U004*/
+                                           RTUNI_ALPHA, /* U+013337: EGYPTIAN HIEROGLYPH U005*/
+                                           RTUNI_ALPHA, /* U+013338: EGYPTIAN HIEROGLYPH U006*/
+                                           RTUNI_ALPHA, /* U+013339: EGYPTIAN HIEROGLYPH U006A*/
+                                           RTUNI_ALPHA, /* U+01333a: EGYPTIAN HIEROGLYPH U006B*/
+                                           RTUNI_ALPHA, /* U+01333b: EGYPTIAN HIEROGLYPH U007*/
+                                           RTUNI_ALPHA, /* U+01333c: EGYPTIAN HIEROGLYPH U008*/
+                                           RTUNI_ALPHA, /* U+01333d: EGYPTIAN HIEROGLYPH U009*/
+                                           RTUNI_ALPHA, /* U+01333e: EGYPTIAN HIEROGLYPH U010*/
+                                           RTUNI_ALPHA, /* U+01333f: EGYPTIAN HIEROGLYPH U011*/
+                                           RTUNI_ALPHA, /* U+013340: EGYPTIAN HIEROGLYPH U012*/
+                                           RTUNI_ALPHA, /* U+013341: EGYPTIAN HIEROGLYPH U013*/
+                                           RTUNI_ALPHA, /* U+013342: EGYPTIAN HIEROGLYPH U014*/
+                                           RTUNI_ALPHA, /* U+013343: EGYPTIAN HIEROGLYPH U015*/
+                                           RTUNI_ALPHA, /* U+013344: EGYPTIAN HIEROGLYPH U016*/
+                                           RTUNI_ALPHA, /* U+013345: EGYPTIAN HIEROGLYPH U017*/
+                                           RTUNI_ALPHA, /* U+013346: EGYPTIAN HIEROGLYPH U018*/
+                                           RTUNI_ALPHA, /* U+013347: EGYPTIAN HIEROGLYPH U019*/
+                                           RTUNI_ALPHA, /* U+013348: EGYPTIAN HIEROGLYPH U020*/
+                                           RTUNI_ALPHA, /* U+013349: EGYPTIAN HIEROGLYPH U021*/
+                                           RTUNI_ALPHA, /* U+01334a: EGYPTIAN HIEROGLYPH U022*/
+                                           RTUNI_ALPHA, /* U+01334b: EGYPTIAN HIEROGLYPH U023*/
+                                           RTUNI_ALPHA, /* U+01334c: EGYPTIAN HIEROGLYPH U023A*/
+                                           RTUNI_ALPHA, /* U+01334d: EGYPTIAN HIEROGLYPH U024*/
+                                           RTUNI_ALPHA, /* U+01334e: EGYPTIAN HIEROGLYPH U025*/
+                                           RTUNI_ALPHA, /* U+01334f: EGYPTIAN HIEROGLYPH U026*/
+                                           RTUNI_ALPHA, /* U+013350: EGYPTIAN HIEROGLYPH U027*/
+                                           RTUNI_ALPHA, /* U+013351: EGYPTIAN HIEROGLYPH U028*/
+                                           RTUNI_ALPHA, /* U+013352: EGYPTIAN HIEROGLYPH U029*/
+                                           RTUNI_ALPHA, /* U+013353: EGYPTIAN HIEROGLYPH U029A*/
+                                           RTUNI_ALPHA, /* U+013354: EGYPTIAN HIEROGLYPH U030*/
+                                           RTUNI_ALPHA, /* U+013355: EGYPTIAN HIEROGLYPH U031*/
+                                           RTUNI_ALPHA, /* U+013356: EGYPTIAN HIEROGLYPH U032*/
+                                           RTUNI_ALPHA, /* U+013357: EGYPTIAN HIEROGLYPH U032A*/
+                                           RTUNI_ALPHA, /* U+013358: EGYPTIAN HIEROGLYPH U033*/
+                                           RTUNI_ALPHA, /* U+013359: EGYPTIAN HIEROGLYPH U034*/
+                                           RTUNI_ALPHA, /* U+01335a: EGYPTIAN HIEROGLYPH U035*/
+                                           RTUNI_ALPHA, /* U+01335b: EGYPTIAN HIEROGLYPH U036*/
+                                           RTUNI_ALPHA, /* U+01335c: EGYPTIAN HIEROGLYPH U037*/
+                                           RTUNI_ALPHA, /* U+01335d: EGYPTIAN HIEROGLYPH U038*/
+                                           RTUNI_ALPHA, /* U+01335e: EGYPTIAN HIEROGLYPH U039*/
+                                           RTUNI_ALPHA, /* U+01335f: EGYPTIAN HIEROGLYPH U040*/
+                                           RTUNI_ALPHA, /* U+013360: EGYPTIAN HIEROGLYPH U041*/
+                                           RTUNI_ALPHA, /* U+013361: EGYPTIAN HIEROGLYPH U042*/
+                                           RTUNI_ALPHA, /* U+013362: EGYPTIAN HIEROGLYPH V001*/
+                                           RTUNI_ALPHA, /* U+013363: EGYPTIAN HIEROGLYPH V001A*/
+                                           RTUNI_ALPHA, /* U+013364: EGYPTIAN HIEROGLYPH V001B*/
+                                           RTUNI_ALPHA, /* U+013365: EGYPTIAN HIEROGLYPH V001C*/
+                                           RTUNI_ALPHA, /* U+013366: EGYPTIAN HIEROGLYPH V001D*/
+                                           RTUNI_ALPHA, /* U+013367: EGYPTIAN HIEROGLYPH V001E*/
+                                           RTUNI_ALPHA, /* U+013368: EGYPTIAN HIEROGLYPH V001F*/
+                                           RTUNI_ALPHA, /* U+013369: EGYPTIAN HIEROGLYPH V001G*/
+                                           RTUNI_ALPHA, /* U+01336a: EGYPTIAN HIEROGLYPH V001H*/
+                                           RTUNI_ALPHA, /* U+01336b: EGYPTIAN HIEROGLYPH V001I*/
+                                           RTUNI_ALPHA, /* U+01336c: EGYPTIAN HIEROGLYPH V002*/
+                                           RTUNI_ALPHA, /* U+01336d: EGYPTIAN HIEROGLYPH V002A*/
+                                           RTUNI_ALPHA, /* U+01336e: EGYPTIAN HIEROGLYPH V003*/
+                                           RTUNI_ALPHA, /* U+01336f: EGYPTIAN HIEROGLYPH V004*/
+                                           RTUNI_ALPHA, /* U+013370: EGYPTIAN HIEROGLYPH V005*/
+                                           RTUNI_ALPHA, /* U+013371: EGYPTIAN HIEROGLYPH V006*/
+                                           RTUNI_ALPHA, /* U+013372: EGYPTIAN HIEROGLYPH V007*/
+                                           RTUNI_ALPHA, /* U+013373: EGYPTIAN HIEROGLYPH V007A*/
+                                           RTUNI_ALPHA, /* U+013374: EGYPTIAN HIEROGLYPH V007B*/
+                                           RTUNI_ALPHA, /* U+013375: EGYPTIAN HIEROGLYPH V008*/
+                                           RTUNI_ALPHA, /* U+013376: EGYPTIAN HIEROGLYPH V009*/
+                                           RTUNI_ALPHA, /* U+013377: EGYPTIAN HIEROGLYPH V010*/
+                                           RTUNI_ALPHA, /* U+013378: EGYPTIAN HIEROGLYPH V011*/
+                                           RTUNI_ALPHA, /* U+013379: EGYPTIAN HIEROGLYPH V011A*/
+                                           RTUNI_ALPHA, /* U+01337a: EGYPTIAN HIEROGLYPH V011B*/
+                                           RTUNI_ALPHA, /* U+01337b: EGYPTIAN HIEROGLYPH V011C*/
+                                           RTUNI_ALPHA, /* U+01337c: EGYPTIAN HIEROGLYPH V012*/
+                                           RTUNI_ALPHA, /* U+01337d: EGYPTIAN HIEROGLYPH V012A*/
+                                           RTUNI_ALPHA, /* U+01337e: EGYPTIAN HIEROGLYPH V012B*/
+                                           RTUNI_ALPHA, /* U+01337f: EGYPTIAN HIEROGLYPH V013*/
+                                           RTUNI_ALPHA, /* U+013380: EGYPTIAN HIEROGLYPH V014*/
+                                           RTUNI_ALPHA, /* U+013381: EGYPTIAN HIEROGLYPH V015*/
+                                           RTUNI_ALPHA, /* U+013382: EGYPTIAN HIEROGLYPH V016*/
+                                           RTUNI_ALPHA, /* U+013383: EGYPTIAN HIEROGLYPH V017*/
+                                           RTUNI_ALPHA, /* U+013384: EGYPTIAN HIEROGLYPH V018*/
+                                           RTUNI_ALPHA, /* U+013385: EGYPTIAN HIEROGLYPH V019*/
+                                           RTUNI_ALPHA, /* U+013386: EGYPTIAN HIEROGLYPH V020*/
+                                           RTUNI_ALPHA, /* U+013387: EGYPTIAN HIEROGLYPH V020A*/
+                                           RTUNI_ALPHA, /* U+013388: EGYPTIAN HIEROGLYPH V020B*/
+                                           RTUNI_ALPHA, /* U+013389: EGYPTIAN HIEROGLYPH V020C*/
+                                           RTUNI_ALPHA, /* U+01338a: EGYPTIAN HIEROGLYPH V020D*/
+                                           RTUNI_ALPHA, /* U+01338b: EGYPTIAN HIEROGLYPH V020E*/
+                                           RTUNI_ALPHA, /* U+01338c: EGYPTIAN HIEROGLYPH V020F*/
+                                           RTUNI_ALPHA, /* U+01338d: EGYPTIAN HIEROGLYPH V020G*/
+                                           RTUNI_ALPHA, /* U+01338e: EGYPTIAN HIEROGLYPH V020H*/
+                                           RTUNI_ALPHA, /* U+01338f: EGYPTIAN HIEROGLYPH V020I*/
+                                           RTUNI_ALPHA, /* U+013390: EGYPTIAN HIEROGLYPH V020J*/
+                                           RTUNI_ALPHA, /* U+013391: EGYPTIAN HIEROGLYPH V020K*/
+                                           RTUNI_ALPHA, /* U+013392: EGYPTIAN HIEROGLYPH V020L*/
+                                           RTUNI_ALPHA, /* U+013393: EGYPTIAN HIEROGLYPH V021*/
+                                           RTUNI_ALPHA, /* U+013394: EGYPTIAN HIEROGLYPH V022*/
+                                           RTUNI_ALPHA, /* U+013395: EGYPTIAN HIEROGLYPH V023*/
+                                           RTUNI_ALPHA, /* U+013396: EGYPTIAN HIEROGLYPH V023A*/
+                                           RTUNI_ALPHA, /* U+013397: EGYPTIAN HIEROGLYPH V024*/
+                                           RTUNI_ALPHA, /* U+013398: EGYPTIAN HIEROGLYPH V025*/
+                                           RTUNI_ALPHA, /* U+013399: EGYPTIAN HIEROGLYPH V026*/
+                                           RTUNI_ALPHA, /* U+01339a: EGYPTIAN HIEROGLYPH V027*/
+                                           RTUNI_ALPHA, /* U+01339b: EGYPTIAN HIEROGLYPH V028*/
+                                           RTUNI_ALPHA, /* U+01339c: EGYPTIAN HIEROGLYPH V028A*/
+                                           RTUNI_ALPHA, /* U+01339d: EGYPTIAN HIEROGLYPH V029*/
+                                           RTUNI_ALPHA, /* U+01339e: EGYPTIAN HIEROGLYPH V029A*/
+                                           RTUNI_ALPHA, /* U+01339f: EGYPTIAN HIEROGLYPH V030*/
+                                           RTUNI_ALPHA, /* U+0133a0: EGYPTIAN HIEROGLYPH V030A*/
+                                           RTUNI_ALPHA, /* U+0133a1: EGYPTIAN HIEROGLYPH V031*/
+                                           RTUNI_ALPHA, /* U+0133a2: EGYPTIAN HIEROGLYPH V031A*/
+                                           RTUNI_ALPHA, /* U+0133a3: EGYPTIAN HIEROGLYPH V032*/
+                                           RTUNI_ALPHA, /* U+0133a4: EGYPTIAN HIEROGLYPH V033*/
+                                           RTUNI_ALPHA, /* U+0133a5: EGYPTIAN HIEROGLYPH V033A*/
+                                           RTUNI_ALPHA, /* U+0133a6: EGYPTIAN HIEROGLYPH V034*/
+                                           RTUNI_ALPHA, /* U+0133a7: EGYPTIAN HIEROGLYPH V035*/
+                                           RTUNI_ALPHA, /* U+0133a8: EGYPTIAN HIEROGLYPH V036*/
+                                           RTUNI_ALPHA, /* U+0133a9: EGYPTIAN HIEROGLYPH V037*/
+                                           RTUNI_ALPHA, /* U+0133aa: EGYPTIAN HIEROGLYPH V037A*/
+                                           RTUNI_ALPHA, /* U+0133ab: EGYPTIAN HIEROGLYPH V038*/
+                                           RTUNI_ALPHA, /* U+0133ac: EGYPTIAN HIEROGLYPH V039*/
+                                           RTUNI_ALPHA, /* U+0133ad: EGYPTIAN HIEROGLYPH V040*/
+                                           RTUNI_ALPHA, /* U+0133ae: EGYPTIAN HIEROGLYPH V040A*/
+                                           RTUNI_ALPHA, /* U+0133af: EGYPTIAN HIEROGLYPH W001*/
+                                           RTUNI_ALPHA, /* U+0133b0: EGYPTIAN HIEROGLYPH W002*/
+                                           RTUNI_ALPHA, /* U+0133b1: EGYPTIAN HIEROGLYPH W003*/
+                                           RTUNI_ALPHA, /* U+0133b2: EGYPTIAN HIEROGLYPH W003A*/
+                                           RTUNI_ALPHA, /* U+0133b3: EGYPTIAN HIEROGLYPH W004*/
+                                           RTUNI_ALPHA, /* U+0133b4: EGYPTIAN HIEROGLYPH W005*/
+                                           RTUNI_ALPHA, /* U+0133b5: EGYPTIAN HIEROGLYPH W006*/
+                                           RTUNI_ALPHA, /* U+0133b6: EGYPTIAN HIEROGLYPH W007*/
+                                           RTUNI_ALPHA, /* U+0133b7: EGYPTIAN HIEROGLYPH W008*/
+                                           RTUNI_ALPHA, /* U+0133b8: EGYPTIAN HIEROGLYPH W009*/
+                                           RTUNI_ALPHA, /* U+0133b9: EGYPTIAN HIEROGLYPH W009A*/
+                                           RTUNI_ALPHA, /* U+0133ba: EGYPTIAN HIEROGLYPH W010*/
+                                           RTUNI_ALPHA, /* U+0133bb: EGYPTIAN HIEROGLYPH W010A*/
+                                           RTUNI_ALPHA, /* U+0133bc: EGYPTIAN HIEROGLYPH W011*/
+                                           RTUNI_ALPHA, /* U+0133bd: EGYPTIAN HIEROGLYPH W012*/
+                                           RTUNI_ALPHA, /* U+0133be: EGYPTIAN HIEROGLYPH W013*/
+                                           RTUNI_ALPHA, /* U+0133bf: EGYPTIAN HIEROGLYPH W014*/
+                                           RTUNI_ALPHA, /* U+0133c0: EGYPTIAN HIEROGLYPH W014A*/
+                                           RTUNI_ALPHA, /* U+0133c1: EGYPTIAN HIEROGLYPH W015*/
+                                           RTUNI_ALPHA, /* U+0133c2: EGYPTIAN HIEROGLYPH W016*/
+                                           RTUNI_ALPHA, /* U+0133c3: EGYPTIAN HIEROGLYPH W017*/
+                                           RTUNI_ALPHA, /* U+0133c4: EGYPTIAN HIEROGLYPH W017A*/
+                                           RTUNI_ALPHA, /* U+0133c5: EGYPTIAN HIEROGLYPH W018*/
+                                           RTUNI_ALPHA, /* U+0133c6: EGYPTIAN HIEROGLYPH W018A*/
+                                           RTUNI_ALPHA, /* U+0133c7: EGYPTIAN HIEROGLYPH W019*/
+                                           RTUNI_ALPHA, /* U+0133c8: EGYPTIAN HIEROGLYPH W020*/
+                                           RTUNI_ALPHA, /* U+0133c9: EGYPTIAN HIEROGLYPH W021*/
+                                           RTUNI_ALPHA, /* U+0133ca: EGYPTIAN HIEROGLYPH W022*/
+                                           RTUNI_ALPHA, /* U+0133cb: EGYPTIAN HIEROGLYPH W023*/
+                                           RTUNI_ALPHA, /* U+0133cc: EGYPTIAN HIEROGLYPH W024*/
+                                           RTUNI_ALPHA, /* U+0133cd: EGYPTIAN HIEROGLYPH W024A*/
+                                           RTUNI_ALPHA, /* U+0133ce: EGYPTIAN HIEROGLYPH W025*/
+                                           RTUNI_ALPHA, /* U+0133cf: EGYPTIAN HIEROGLYPH X001*/
+                                           RTUNI_ALPHA, /* U+0133d0: EGYPTIAN HIEROGLYPH X002*/
+                                           RTUNI_ALPHA, /* U+0133d1: EGYPTIAN HIEROGLYPH X003*/
+                                           RTUNI_ALPHA, /* U+0133d2: EGYPTIAN HIEROGLYPH X004*/
+                                           RTUNI_ALPHA, /* U+0133d3: EGYPTIAN HIEROGLYPH X004A*/
+                                           RTUNI_ALPHA, /* U+0133d4: EGYPTIAN HIEROGLYPH X004B*/
+                                           RTUNI_ALPHA, /* U+0133d5: EGYPTIAN HIEROGLYPH X005*/
+                                           RTUNI_ALPHA, /* U+0133d6: EGYPTIAN HIEROGLYPH X006*/
+                                           RTUNI_ALPHA, /* U+0133d7: EGYPTIAN HIEROGLYPH X006A*/
+                                           RTUNI_ALPHA, /* U+0133d8: EGYPTIAN HIEROGLYPH X007*/
+                                           RTUNI_ALPHA, /* U+0133d9: EGYPTIAN HIEROGLYPH X008*/
+                                           RTUNI_ALPHA, /* U+0133da: EGYPTIAN HIEROGLYPH X008A*/
+                                           RTUNI_ALPHA, /* U+0133db: EGYPTIAN HIEROGLYPH Y001*/
+                                           RTUNI_ALPHA, /* U+0133dc: EGYPTIAN HIEROGLYPH Y001A*/
+                                           RTUNI_ALPHA, /* U+0133dd: EGYPTIAN HIEROGLYPH Y002*/
+                                           RTUNI_ALPHA, /* U+0133de: EGYPTIAN HIEROGLYPH Y003*/
+                                           RTUNI_ALPHA, /* U+0133df: EGYPTIAN HIEROGLYPH Y004*/
+                                           RTUNI_ALPHA, /* U+0133e0: EGYPTIAN HIEROGLYPH Y005*/
+                                           RTUNI_ALPHA, /* U+0133e1: EGYPTIAN HIEROGLYPH Y006*/
+                                           RTUNI_ALPHA, /* U+0133e2: EGYPTIAN HIEROGLYPH Y007*/
+                                           RTUNI_ALPHA, /* U+0133e3: EGYPTIAN HIEROGLYPH Y008*/
+                                           RTUNI_ALPHA, /* U+0133e4: EGYPTIAN HIEROGLYPH Z001*/
+                                           RTUNI_ALPHA, /* U+0133e5: EGYPTIAN HIEROGLYPH Z002*/
+                                           RTUNI_ALPHA, /* U+0133e6: EGYPTIAN HIEROGLYPH Z002A*/
+                                           RTUNI_ALPHA, /* U+0133e7: EGYPTIAN HIEROGLYPH Z002B*/
+                                           RTUNI_ALPHA, /* U+0133e8: EGYPTIAN HIEROGLYPH Z002C*/
+                                           RTUNI_ALPHA, /* U+0133e9: EGYPTIAN HIEROGLYPH Z002D*/
+                                           RTUNI_ALPHA, /* U+0133ea: EGYPTIAN HIEROGLYPH Z003*/
+                                           RTUNI_ALPHA, /* U+0133eb: EGYPTIAN HIEROGLYPH Z003A*/
+                                           RTUNI_ALPHA, /* U+0133ec: EGYPTIAN HIEROGLYPH Z003B*/
+                                           RTUNI_ALPHA, /* U+0133ed: EGYPTIAN HIEROGLYPH Z004*/
+                                           RTUNI_ALPHA, /* U+0133ee: EGYPTIAN HIEROGLYPH Z004A*/
+                                           RTUNI_ALPHA, /* U+0133ef: EGYPTIAN HIEROGLYPH Z005*/
+                                           RTUNI_ALPHA, /* U+0133f0: EGYPTIAN HIEROGLYPH Z005A*/
+                                           RTUNI_ALPHA, /* U+0133f1: EGYPTIAN HIEROGLYPH Z006*/
+                                           RTUNI_ALPHA, /* U+0133f2: EGYPTIAN HIEROGLYPH Z007*/
+                                           RTUNI_ALPHA, /* U+0133f3: EGYPTIAN HIEROGLYPH Z008*/
+                                           RTUNI_ALPHA, /* U+0133f4: EGYPTIAN HIEROGLYPH Z009*/
+                                           RTUNI_ALPHA, /* U+0133f5: EGYPTIAN HIEROGLYPH Z010*/
+                                           RTUNI_ALPHA, /* U+0133f6: EGYPTIAN HIEROGLYPH Z011*/
+                                           RTUNI_ALPHA, /* U+0133f7: EGYPTIAN HIEROGLYPH Z012*/
+                                           RTUNI_ALPHA, /* U+0133f8: EGYPTIAN HIEROGLYPH Z013*/
+                                           RTUNI_ALPHA, /* U+0133f9: EGYPTIAN HIEROGLYPH Z014*/
+                                           RTUNI_ALPHA, /* U+0133fa: EGYPTIAN HIEROGLYPH Z015*/
+                                           RTUNI_ALPHA, /* U+0133fb: EGYPTIAN HIEROGLYPH Z015A*/
+                                           RTUNI_ALPHA, /* U+0133fc: EGYPTIAN HIEROGLYPH Z015B*/
+                                           RTUNI_ALPHA, /* U+0133fd: EGYPTIAN HIEROGLYPH Z015C*/
+                                           RTUNI_ALPHA, /* U+0133fe: EGYPTIAN HIEROGLYPH Z015D*/
+                                           RTUNI_ALPHA, /* U+0133ff: EGYPTIAN HIEROGLYPH Z015E*/
+                                           RTUNI_ALPHA, /* U+013400: EGYPTIAN HIEROGLYPH Z015F*/
+                                           RTUNI_ALPHA, /* U+013401: EGYPTIAN HIEROGLYPH Z015G*/
+                                           RTUNI_ALPHA, /* U+013402: EGYPTIAN HIEROGLYPH Z015H*/
+                                           RTUNI_ALPHA, /* U+013403: EGYPTIAN HIEROGLYPH Z015I*/
+                                           RTUNI_ALPHA, /* U+013404: EGYPTIAN HIEROGLYPH Z016*/
+                                           RTUNI_ALPHA, /* U+013405: EGYPTIAN HIEROGLYPH Z016A*/
+                                           RTUNI_ALPHA, /* U+013406: EGYPTIAN HIEROGLYPH Z016B*/
+                                           RTUNI_ALPHA, /* U+013407: EGYPTIAN HIEROGLYPH Z016C*/
+                                           RTUNI_ALPHA, /* U+013408: EGYPTIAN HIEROGLYPH Z016D*/
+                                           RTUNI_ALPHA, /* U+013409: EGYPTIAN HIEROGLYPH Z016E*/
+                                           RTUNI_ALPHA, /* U+01340a: EGYPTIAN HIEROGLYPH Z016F*/
+                                           RTUNI_ALPHA, /* U+01340b: EGYPTIAN HIEROGLYPH Z016G*/
+                                           RTUNI_ALPHA, /* U+01340c: EGYPTIAN HIEROGLYPH Z016H*/
+                                           RTUNI_ALPHA, /* U+01340d: EGYPTIAN HIEROGLYPH AA001*/
+                                           RTUNI_ALPHA, /* U+01340e: EGYPTIAN HIEROGLYPH AA002*/
+                                           RTUNI_ALPHA, /* U+01340f: EGYPTIAN HIEROGLYPH AA003*/
+                                           RTUNI_ALPHA, /* U+013410: EGYPTIAN HIEROGLYPH AA004*/
+                                           RTUNI_ALPHA, /* U+013411: EGYPTIAN HIEROGLYPH AA005*/
+                                           RTUNI_ALPHA, /* U+013412: EGYPTIAN HIEROGLYPH AA006*/
+                                           RTUNI_ALPHA, /* U+013413: EGYPTIAN HIEROGLYPH AA007*/
+                                           RTUNI_ALPHA, /* U+013414: EGYPTIAN HIEROGLYPH AA007A*/
+                                           RTUNI_ALPHA, /* U+013415: EGYPTIAN HIEROGLYPH AA007B*/
+                                           RTUNI_ALPHA, /* U+013416: EGYPTIAN HIEROGLYPH AA008*/
+                                           RTUNI_ALPHA, /* U+013417: EGYPTIAN HIEROGLYPH AA009*/
+                                           RTUNI_ALPHA, /* U+013418: EGYPTIAN HIEROGLYPH AA010*/
+                                           RTUNI_ALPHA, /* U+013419: EGYPTIAN HIEROGLYPH AA011*/
+                                           RTUNI_ALPHA, /* U+01341a: EGYPTIAN HIEROGLYPH AA012*/
+                                           RTUNI_ALPHA, /* U+01341b: EGYPTIAN HIEROGLYPH AA013*/
+                                           RTUNI_ALPHA, /* U+01341c: EGYPTIAN HIEROGLYPH AA014*/
+                                           RTUNI_ALPHA, /* U+01341d: EGYPTIAN HIEROGLYPH AA015*/
+                                           RTUNI_ALPHA, /* U+01341e: EGYPTIAN HIEROGLYPH AA016*/
+                                           RTUNI_ALPHA, /* U+01341f: EGYPTIAN HIEROGLYPH AA017*/
+                                           RTUNI_ALPHA, /* U+013420: EGYPTIAN HIEROGLYPH AA018*/
+                                           RTUNI_ALPHA, /* U+013421: EGYPTIAN HIEROGLYPH AA019*/
+                                           RTUNI_ALPHA, /* U+013422: EGYPTIAN HIEROGLYPH AA020*/
+                                           RTUNI_ALPHA, /* U+013423: EGYPTIAN HIEROGLYPH AA021*/
+                                           RTUNI_ALPHA, /* U+013424: EGYPTIAN HIEROGLYPH AA022*/
+                                           RTUNI_ALPHA, /* U+013425: EGYPTIAN HIEROGLYPH AA023*/
+                                           RTUNI_ALPHA, /* U+013426: EGYPTIAN HIEROGLYPH AA024*/
+                                           RTUNI_ALPHA, /* U+013427: EGYPTIAN HIEROGLYPH AA025*/
+                                           RTUNI_ALPHA, /* U+013428: EGYPTIAN HIEROGLYPH AA026*/
+                                           RTUNI_ALPHA, /* U+013429: EGYPTIAN HIEROGLYPH AA027*/
+                                           RTUNI_ALPHA, /* U+01342a: EGYPTIAN HIEROGLYPH AA028*/
+                                           RTUNI_ALPHA, /* U+01342b: EGYPTIAN HIEROGLYPH AA029*/
+                                           RTUNI_ALPHA, /* U+01342c: EGYPTIAN HIEROGLYPH AA030*/
+                                           RTUNI_ALPHA, /* U+01342d: EGYPTIAN HIEROGLYPH AA031*/
+                                           RTUNI_ALPHA, /* U+01342e: EGYPTIAN HIEROGLYPH AA032*/
+};
+
+static const uint8_t g_afRTUniFlags0x016800[] =
+{
+                                           RTUNI_ALPHA, /* U+016800: BAMUM LETTER PHASE-A NGKUE MFON*/
+                                           RTUNI_ALPHA, /* U+016801: BAMUM LETTER PHASE-A GBIEE FON*/
+                                           RTUNI_ALPHA, /* U+016802: BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE*/
+                                           RTUNI_ALPHA, /* U+016803: BAMUM LETTER PHASE-A PON MFON PIPAEMBA*/
+                                           RTUNI_ALPHA, /* U+016804: BAMUM LETTER PHASE-A NAA MFON*/
+                                           RTUNI_ALPHA, /* U+016805: BAMUM LETTER PHASE-A SHUENSHUET*/
+                                           RTUNI_ALPHA, /* U+016806: BAMUM LETTER PHASE-A TITA MFON*/
+                                           RTUNI_ALPHA, /* U+016807: BAMUM LETTER PHASE-A NZA MFON*/
+                                           RTUNI_ALPHA, /* U+016808: BAMUM LETTER PHASE-A SHINDA PA NJI*/
+                                           RTUNI_ALPHA, /* U+016809: BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE*/
+                                           RTUNI_ALPHA, /* U+01680a: BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA*/
+                                           RTUNI_ALPHA, /* U+01680b: BAMUM LETTER PHASE-A MAEMBGBIEE*/
+                                           RTUNI_ALPHA, /* U+01680c: BAMUM LETTER PHASE-A TU MAEMBA*/
+                                           RTUNI_ALPHA, /* U+01680d: BAMUM LETTER PHASE-A NGANGU*/
+                                           RTUNI_ALPHA, /* U+01680e: BAMUM LETTER PHASE-A MAEMVEUX*/
+                                           RTUNI_ALPHA, /* U+01680f: BAMUM LETTER PHASE-A MANSUAE*/
+                                           RTUNI_ALPHA, /* U+016810: BAMUM LETTER PHASE-A MVEUAENGAM*/
+                                           RTUNI_ALPHA, /* U+016811: BAMUM LETTER PHASE-A SEUNYAM*/
+                                           RTUNI_ALPHA, /* U+016812: BAMUM LETTER PHASE-A NTOQPEN*/
+                                           RTUNI_ALPHA, /* U+016813: BAMUM LETTER PHASE-A KEUKEUTNDA*/
+                                           RTUNI_ALPHA, /* U+016814: BAMUM LETTER PHASE-A NKINDI*/
+                                           RTUNI_ALPHA, /* U+016815: BAMUM LETTER PHASE-A SUU*/
+                                           RTUNI_ALPHA, /* U+016816: BAMUM LETTER PHASE-A NGKUENZEUM*/
+                                           RTUNI_ALPHA, /* U+016817: BAMUM LETTER PHASE-A LAPAQ*/
+                                           RTUNI_ALPHA, /* U+016818: BAMUM LETTER PHASE-A LET KUT*/
+                                           RTUNI_ALPHA, /* U+016819: BAMUM LETTER PHASE-A NTAP MFAA*/
+                                           RTUNI_ALPHA, /* U+01681a: BAMUM LETTER PHASE-A MAEKEUP*/
+                                           RTUNI_ALPHA, /* U+01681b: BAMUM LETTER PHASE-A PASHAE*/
+                                           RTUNI_ALPHA, /* U+01681c: BAMUM LETTER PHASE-A GHEUAERAE*/
+                                           RTUNI_ALPHA, /* U+01681d: BAMUM LETTER PHASE-A PAMSHAE*/
+                                           RTUNI_ALPHA, /* U+01681e: BAMUM LETTER PHASE-A MON NGGEUAET*/
+                                           RTUNI_ALPHA, /* U+01681f: BAMUM LETTER PHASE-A NZUN MEUT*/
+                                           RTUNI_ALPHA, /* U+016820: BAMUM LETTER PHASE-A U YUQ NAE*/
+                                           RTUNI_ALPHA, /* U+016821: BAMUM LETTER PHASE-A GHEUAEGHEUAE*/
+                                           RTUNI_ALPHA, /* U+016822: BAMUM LETTER PHASE-A NTAP NTAA*/
+                                           RTUNI_ALPHA, /* U+016823: BAMUM LETTER PHASE-A SISA*/
+                                           RTUNI_ALPHA, /* U+016824: BAMUM LETTER PHASE-A MGBASA*/
+                                           RTUNI_ALPHA, /* U+016825: BAMUM LETTER PHASE-A MEUNJOMNDEUQ*/
+                                           RTUNI_ALPHA, /* U+016826: BAMUM LETTER PHASE-A MOOMPUQ*/
+                                           RTUNI_ALPHA, /* U+016827: BAMUM LETTER PHASE-A KAFA*/
+                                           RTUNI_ALPHA, /* U+016828: BAMUM LETTER PHASE-A PA LEERAEWA*/
+                                           RTUNI_ALPHA, /* U+016829: BAMUM LETTER PHASE-A NDA LEERAEWA*/
+                                           RTUNI_ALPHA, /* U+01682a: BAMUM LETTER PHASE-A PET*/
+                                           RTUNI_ALPHA, /* U+01682b: BAMUM LETTER PHASE-A MAEMKPEN*/
+                                           RTUNI_ALPHA, /* U+01682c: BAMUM LETTER PHASE-A NIKA*/
+                                           RTUNI_ALPHA, /* U+01682d: BAMUM LETTER PHASE-A PUP*/
+                                           RTUNI_ALPHA, /* U+01682e: BAMUM LETTER PHASE-A TUAEP*/
+                                           RTUNI_ALPHA, /* U+01682f: BAMUM LETTER PHASE-A LUAEP*/
+                                           RTUNI_ALPHA, /* U+016830: BAMUM LETTER PHASE-A SONJAM*/
+                                           RTUNI_ALPHA, /* U+016831: BAMUM LETTER PHASE-A TEUTEUWEN*/
+                                           RTUNI_ALPHA, /* U+016832: BAMUM LETTER PHASE-A MAENYI*/
+                                           RTUNI_ALPHA, /* U+016833: BAMUM LETTER PHASE-A KET*/
+                                           RTUNI_ALPHA, /* U+016834: BAMUM LETTER PHASE-A NDAANGGEUAET*/
+                                           RTUNI_ALPHA, /* U+016835: BAMUM LETTER PHASE-A KUOQ*/
+                                           RTUNI_ALPHA, /* U+016836: BAMUM LETTER PHASE-A MOOMEUT*/
+                                           RTUNI_ALPHA, /* U+016837: BAMUM LETTER PHASE-A SHUM*/
+                                           RTUNI_ALPHA, /* U+016838: BAMUM LETTER PHASE-A LOMMAE*/
+                                           RTUNI_ALPHA, /* U+016839: BAMUM LETTER PHASE-A FIRI*/
+                                           RTUNI_ALPHA, /* U+01683a: BAMUM LETTER PHASE-A ROM*/
+                                           RTUNI_ALPHA, /* U+01683b: BAMUM LETTER PHASE-A KPOQ*/
+                                           RTUNI_ALPHA, /* U+01683c: BAMUM LETTER PHASE-A SOQ*/
+                                           RTUNI_ALPHA, /* U+01683d: BAMUM LETTER PHASE-A MAP PIEET*/
+                                           RTUNI_ALPHA, /* U+01683e: BAMUM LETTER PHASE-A SHIRAE*/
+                                           RTUNI_ALPHA, /* U+01683f: BAMUM LETTER PHASE-A NTAP*/
+                                           RTUNI_ALPHA, /* U+016840: BAMUM LETTER PHASE-A SHOQ NSHUT YUM*/
+                                           RTUNI_ALPHA, /* U+016841: BAMUM LETTER PHASE-A NYIT MONGKEUAEQ*/
+                                           RTUNI_ALPHA, /* U+016842: BAMUM LETTER PHASE-A PAARAE*/
+                                           RTUNI_ALPHA, /* U+016843: BAMUM LETTER PHASE-A NKAARAE*/
+                                           RTUNI_ALPHA, /* U+016844: BAMUM LETTER PHASE-A UNKNOWN*/
+                                           RTUNI_ALPHA, /* U+016845: BAMUM LETTER PHASE-A NGGEN*/
+                                           RTUNI_ALPHA, /* U+016846: BAMUM LETTER PHASE-A MAESI*/
+                                           RTUNI_ALPHA, /* U+016847: BAMUM LETTER PHASE-A NJAM*/
+                                           RTUNI_ALPHA, /* U+016848: BAMUM LETTER PHASE-A MBANYI*/
+                                           RTUNI_ALPHA, /* U+016849: BAMUM LETTER PHASE-A NYET*/
+                                           RTUNI_ALPHA, /* U+01684a: BAMUM LETTER PHASE-A TEUAEN*/
+                                           RTUNI_ALPHA, /* U+01684b: BAMUM LETTER PHASE-A SOT*/
+                                           RTUNI_ALPHA, /* U+01684c: BAMUM LETTER PHASE-A PAAM*/
+                                           RTUNI_ALPHA, /* U+01684d: BAMUM LETTER PHASE-A NSHIEE*/
+                                           RTUNI_ALPHA, /* U+01684e: BAMUM LETTER PHASE-A MAEM*/
+                                           RTUNI_ALPHA, /* U+01684f: BAMUM LETTER PHASE-A NYI*/
+                                           RTUNI_ALPHA, /* U+016850: BAMUM LETTER PHASE-A KAQ*/
+                                           RTUNI_ALPHA, /* U+016851: BAMUM LETTER PHASE-A NSHA*/
+                                           RTUNI_ALPHA, /* U+016852: BAMUM LETTER PHASE-A VEE*/
+                                           RTUNI_ALPHA, /* U+016853: BAMUM LETTER PHASE-A LU*/
+                                           RTUNI_ALPHA, /* U+016854: BAMUM LETTER PHASE-A NEN*/
+                                           RTUNI_ALPHA, /* U+016855: BAMUM LETTER PHASE-A NAQ*/
+                                           RTUNI_ALPHA, /* U+016856: BAMUM LETTER PHASE-A MBAQ*/
+                                           RTUNI_ALPHA, /* U+016857: BAMUM LETTER PHASE-B NSHUET*/
+                                           RTUNI_ALPHA, /* U+016858: BAMUM LETTER PHASE-B TU MAEMGBIEE*/
+                                           RTUNI_ALPHA, /* U+016859: BAMUM LETTER PHASE-B SIEE*/
+                                           RTUNI_ALPHA, /* U+01685a: BAMUM LETTER PHASE-B SET TU*/
+                                           RTUNI_ALPHA, /* U+01685b: BAMUM LETTER PHASE-B LOM NTEUM*/
+                                           RTUNI_ALPHA, /* U+01685c: BAMUM LETTER PHASE-B MBA MAELEE*/
+                                           RTUNI_ALPHA, /* U+01685d: BAMUM LETTER PHASE-B KIEEM*/
+                                           RTUNI_ALPHA, /* U+01685e: BAMUM LETTER PHASE-B YEURAE*/
+                                           RTUNI_ALPHA, /* U+01685f: BAMUM LETTER PHASE-B MBAARAE*/
+                                           RTUNI_ALPHA, /* U+016860: BAMUM LETTER PHASE-B KAM*/
+                                           RTUNI_ALPHA, /* U+016861: BAMUM LETTER PHASE-B PEESHI*/
+                                           RTUNI_ALPHA, /* U+016862: BAMUM LETTER PHASE-B YAFU LEERAEWA*/
+                                           RTUNI_ALPHA, /* U+016863: BAMUM LETTER PHASE-B LAM NSHUT NYAM*/
+                                           RTUNI_ALPHA, /* U+016864: BAMUM LETTER PHASE-B NTIEE SHEUOQ*/
+                                           RTUNI_ALPHA, /* U+016865: BAMUM LETTER PHASE-B NDU NJAA*/
+                                           RTUNI_ALPHA, /* U+016866: BAMUM LETTER PHASE-B GHEUGHEUAEM*/
+                                           RTUNI_ALPHA, /* U+016867: BAMUM LETTER PHASE-B PIT*/
+                                           RTUNI_ALPHA, /* U+016868: BAMUM LETTER PHASE-B TU NSIEE*/
+                                           RTUNI_ALPHA, /* U+016869: BAMUM LETTER PHASE-B SHET NJAQ*/
+                                           RTUNI_ALPHA, /* U+01686a: BAMUM LETTER PHASE-B SHEUAEQTU*/
+                                           RTUNI_ALPHA, /* U+01686b: BAMUM LETTER PHASE-B MFON TEUAEQ*/
+                                           RTUNI_ALPHA, /* U+01686c: BAMUM LETTER PHASE-B MBIT MBAAKET*/
+                                           RTUNI_ALPHA, /* U+01686d: BAMUM LETTER PHASE-B NYI NTEUM*/
+                                           RTUNI_ALPHA, /* U+01686e: BAMUM LETTER PHASE-B KEUPUQ*/
+                                           RTUNI_ALPHA, /* U+01686f: BAMUM LETTER PHASE-B GHEUGHEN*/
+                                           RTUNI_ALPHA, /* U+016870: BAMUM LETTER PHASE-B KEUYEUX*/
+                                           RTUNI_ALPHA, /* U+016871: BAMUM LETTER PHASE-B LAANAE*/
+                                           RTUNI_ALPHA, /* U+016872: BAMUM LETTER PHASE-B PARUM*/
+                                           RTUNI_ALPHA, /* U+016873: BAMUM LETTER PHASE-B VEUM*/
+                                           RTUNI_ALPHA, /* U+016874: BAMUM LETTER PHASE-B NGKINDI MVOP*/
+                                           RTUNI_ALPHA, /* U+016875: BAMUM LETTER PHASE-B NGGEU MBU*/
+                                           RTUNI_ALPHA, /* U+016876: BAMUM LETTER PHASE-B WUAET*/
+                                           RTUNI_ALPHA, /* U+016877: BAMUM LETTER PHASE-B SAKEUAE*/
+                                           RTUNI_ALPHA, /* U+016878: BAMUM LETTER PHASE-B TAAM*/
+                                           RTUNI_ALPHA, /* U+016879: BAMUM LETTER PHASE-B MEUQ*/
+                                           RTUNI_ALPHA, /* U+01687a: BAMUM LETTER PHASE-B NGGUOQ*/
+                                           RTUNI_ALPHA, /* U+01687b: BAMUM LETTER PHASE-B NGGUOQ LARGE*/
+                                           RTUNI_ALPHA, /* U+01687c: BAMUM LETTER PHASE-B MFIYAQ*/
+                                           RTUNI_ALPHA, /* U+01687d: BAMUM LETTER PHASE-B SUE*/
+                                           RTUNI_ALPHA, /* U+01687e: BAMUM LETTER PHASE-B MBEURI*/
+                                           RTUNI_ALPHA, /* U+01687f: BAMUM LETTER PHASE-B MONTIEEN*/
+                                           RTUNI_ALPHA, /* U+016880: BAMUM LETTER PHASE-B NYAEMAE*/
+                                           RTUNI_ALPHA, /* U+016881: BAMUM LETTER PHASE-B PUNGAAM*/
+                                           RTUNI_ALPHA, /* U+016882: BAMUM LETTER PHASE-B MEUT NGGEET*/
+                                           RTUNI_ALPHA, /* U+016883: BAMUM LETTER PHASE-B FEUX*/
+                                           RTUNI_ALPHA, /* U+016884: BAMUM LETTER PHASE-B MBUOQ*/
+                                           RTUNI_ALPHA, /* U+016885: BAMUM LETTER PHASE-B FEE*/
+                                           RTUNI_ALPHA, /* U+016886: BAMUM LETTER PHASE-B KEUAEM*/
+                                           RTUNI_ALPHA, /* U+016887: BAMUM LETTER PHASE-B MA NJEUAENA*/
+                                           RTUNI_ALPHA, /* U+016888: BAMUM LETTER PHASE-B MA NJUQA*/
+                                           RTUNI_ALPHA, /* U+016889: BAMUM LETTER PHASE-B LET*/
+                                           RTUNI_ALPHA, /* U+01688a: BAMUM LETTER PHASE-B NGGAAM*/
+                                           RTUNI_ALPHA, /* U+01688b: BAMUM LETTER PHASE-B NSEN*/
+                                           RTUNI_ALPHA, /* U+01688c: BAMUM LETTER PHASE-B MA*/
+                                           RTUNI_ALPHA, /* U+01688d: BAMUM LETTER PHASE-B KIQ*/
+                                           RTUNI_ALPHA, /* U+01688e: BAMUM LETTER PHASE-B NGOM*/
+                                           RTUNI_ALPHA, /* U+01688f: BAMUM LETTER PHASE-C NGKUE MAEMBA*/
+                                           RTUNI_ALPHA, /* U+016890: BAMUM LETTER PHASE-C NZA*/
+                                           RTUNI_ALPHA, /* U+016891: BAMUM LETTER PHASE-C YUM*/
+                                           RTUNI_ALPHA, /* U+016892: BAMUM LETTER PHASE-C WANGKUOQ*/
+                                           RTUNI_ALPHA, /* U+016893: BAMUM LETTER PHASE-C NGGEN*/
+                                           RTUNI_ALPHA, /* U+016894: BAMUM LETTER PHASE-C NDEUAEREE*/
+                                           RTUNI_ALPHA, /* U+016895: BAMUM LETTER PHASE-C NGKAQ*/
+                                           RTUNI_ALPHA, /* U+016896: BAMUM LETTER PHASE-C GHARAE*/
+                                           RTUNI_ALPHA, /* U+016897: BAMUM LETTER PHASE-C MBEEKEET*/
+                                           RTUNI_ALPHA, /* U+016898: BAMUM LETTER PHASE-C GBAYI*/
+                                           RTUNI_ALPHA, /* U+016899: BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN*/
+                                           RTUNI_ALPHA, /* U+01689a: BAMUM LETTER PHASE-C NTU MBIT*/
+                                           RTUNI_ALPHA, /* U+01689b: BAMUM LETTER PHASE-C MBEUM*/
+                                           RTUNI_ALPHA, /* U+01689c: BAMUM LETTER PHASE-C PIRIEEN*/
+                                           RTUNI_ALPHA, /* U+01689d: BAMUM LETTER PHASE-C NDOMBU*/
+                                           RTUNI_ALPHA, /* U+01689e: BAMUM LETTER PHASE-C MBAA CABBAGE-TREE*/
+                                           RTUNI_ALPHA, /* U+01689f: BAMUM LETTER PHASE-C KEUSHEUAEP*/
+                                           RTUNI_ALPHA, /* U+0168a0: BAMUM LETTER PHASE-C GHAP*/
+                                           RTUNI_ALPHA, /* U+0168a1: BAMUM LETTER PHASE-C KEUKAQ*/
+                                           RTUNI_ALPHA, /* U+0168a2: BAMUM LETTER PHASE-C YU MUOMAE*/
+                                           RTUNI_ALPHA, /* U+0168a3: BAMUM LETTER PHASE-C NZEUM*/
+                                           RTUNI_ALPHA, /* U+0168a4: BAMUM LETTER PHASE-C MBUE*/
+                                           RTUNI_ALPHA, /* U+0168a5: BAMUM LETTER PHASE-C NSEUAEN*/
+                                           RTUNI_ALPHA, /* U+0168a6: BAMUM LETTER PHASE-C MBIT*/
+                                           RTUNI_ALPHA, /* U+0168a7: BAMUM LETTER PHASE-C YEUQ*/
+                                           RTUNI_ALPHA, /* U+0168a8: BAMUM LETTER PHASE-C KPARAQ*/
+                                           RTUNI_ALPHA, /* U+0168a9: BAMUM LETTER PHASE-C KAA*/
+                                           RTUNI_ALPHA, /* U+0168aa: BAMUM LETTER PHASE-C SEUX*/
+                                           RTUNI_ALPHA, /* U+0168ab: BAMUM LETTER PHASE-C NDIDA*/
+                                           RTUNI_ALPHA, /* U+0168ac: BAMUM LETTER PHASE-C TAASHAE*/
+                                           RTUNI_ALPHA, /* U+0168ad: BAMUM LETTER PHASE-C NJUEQ*/
+                                           RTUNI_ALPHA, /* U+0168ae: BAMUM LETTER PHASE-C TITA YUE*/
+                                           RTUNI_ALPHA, /* U+0168af: BAMUM LETTER PHASE-C SUAET*/
+                                           RTUNI_ALPHA, /* U+0168b0: BAMUM LETTER PHASE-C NGGUAEN NYAM*/
+                                           RTUNI_ALPHA, /* U+0168b1: BAMUM LETTER PHASE-C VEUX*/
+                                           RTUNI_ALPHA, /* U+0168b2: BAMUM LETTER PHASE-C NANSANAQ*/
+                                           RTUNI_ALPHA, /* U+0168b3: BAMUM LETTER PHASE-C MA KEUAERI*/
+                                           RTUNI_ALPHA, /* U+0168b4: BAMUM LETTER PHASE-C NTAA*/
+                                           RTUNI_ALPHA, /* U+0168b5: BAMUM LETTER PHASE-C NGGUON*/
+                                           RTUNI_ALPHA, /* U+0168b6: BAMUM LETTER PHASE-C LAP*/
+                                           RTUNI_ALPHA, /* U+0168b7: BAMUM LETTER PHASE-C MBIRIEEN*/
+                                           RTUNI_ALPHA, /* U+0168b8: BAMUM LETTER PHASE-C MGBASAQ*/
+                                           RTUNI_ALPHA, /* U+0168b9: BAMUM LETTER PHASE-C NTEUNGBA*/
+                                           RTUNI_ALPHA, /* U+0168ba: BAMUM LETTER PHASE-C TEUTEUX*/
+                                           RTUNI_ALPHA, /* U+0168bb: BAMUM LETTER PHASE-C NGGUM*/
+                                           RTUNI_ALPHA, /* U+0168bc: BAMUM LETTER PHASE-C FUE*/
+                                           RTUNI_ALPHA, /* U+0168bd: BAMUM LETTER PHASE-C NDEUT*/
+                                           RTUNI_ALPHA, /* U+0168be: BAMUM LETTER PHASE-C NSA*/
+                                           RTUNI_ALPHA, /* U+0168bf: BAMUM LETTER PHASE-C NSHAQ*/
+                                           RTUNI_ALPHA, /* U+0168c0: BAMUM LETTER PHASE-C BUNG*/
+                                           RTUNI_ALPHA, /* U+0168c1: BAMUM LETTER PHASE-C VEUAEPEN*/
+                                           RTUNI_ALPHA, /* U+0168c2: BAMUM LETTER PHASE-C MBERAE*/
+                                           RTUNI_ALPHA, /* U+0168c3: BAMUM LETTER PHASE-C RU*/
+                                           RTUNI_ALPHA, /* U+0168c4: BAMUM LETTER PHASE-C NJAEM*/
+                                           RTUNI_ALPHA, /* U+0168c5: BAMUM LETTER PHASE-C LAM*/
+                                           RTUNI_ALPHA, /* U+0168c6: BAMUM LETTER PHASE-C TITUAEP*/
+                                           RTUNI_ALPHA, /* U+0168c7: BAMUM LETTER PHASE-C NSUOT NGOM*/
+                                           RTUNI_ALPHA, /* U+0168c8: BAMUM LETTER PHASE-C NJEEEE*/
+                                           RTUNI_ALPHA, /* U+0168c9: BAMUM LETTER PHASE-C KET*/
+                                           RTUNI_ALPHA, /* U+0168ca: BAMUM LETTER PHASE-C NGGU*/
+                                           RTUNI_ALPHA, /* U+0168cb: BAMUM LETTER PHASE-C MAESI*/
+                                           RTUNI_ALPHA, /* U+0168cc: BAMUM LETTER PHASE-C MBUAEM*/
+                                           RTUNI_ALPHA, /* U+0168cd: BAMUM LETTER PHASE-C LU*/
+                                           RTUNI_ALPHA, /* U+0168ce: BAMUM LETTER PHASE-C KUT*/
+                                           RTUNI_ALPHA, /* U+0168cf: BAMUM LETTER PHASE-C NJAM*/
+                                           RTUNI_ALPHA, /* U+0168d0: BAMUM LETTER PHASE-C NGOM*/
+                                           RTUNI_ALPHA, /* U+0168d1: BAMUM LETTER PHASE-C WUP*/
+                                           RTUNI_ALPHA, /* U+0168d2: BAMUM LETTER PHASE-C NGGUEET*/
+                                           RTUNI_ALPHA, /* U+0168d3: BAMUM LETTER PHASE-C NSOM*/
+                                           RTUNI_ALPHA, /* U+0168d4: BAMUM LETTER PHASE-C NTEN*/
+                                           RTUNI_ALPHA, /* U+0168d5: BAMUM LETTER PHASE-C KUOP NKAARAE*/
+                                           RTUNI_ALPHA, /* U+0168d6: BAMUM LETTER PHASE-C NSUN*/
+                                           RTUNI_ALPHA, /* U+0168d7: BAMUM LETTER PHASE-C NDAM*/
+                                           RTUNI_ALPHA, /* U+0168d8: BAMUM LETTER PHASE-C MA NSIEE*/
+                                           RTUNI_ALPHA, /* U+0168d9: BAMUM LETTER PHASE-C YAA*/
+                                           RTUNI_ALPHA, /* U+0168da: BAMUM LETTER PHASE-C NDAP*/
+                                           RTUNI_ALPHA, /* U+0168db: BAMUM LETTER PHASE-C SHUEQ*/
+                                           RTUNI_ALPHA, /* U+0168dc: BAMUM LETTER PHASE-C SETFON*/
+                                           RTUNI_ALPHA, /* U+0168dd: BAMUM LETTER PHASE-C MBI*/
+                                           RTUNI_ALPHA, /* U+0168de: BAMUM LETTER PHASE-C MAEMBA*/
+                                           RTUNI_ALPHA, /* U+0168df: BAMUM LETTER PHASE-C MBANYI*/
+                                           RTUNI_ALPHA, /* U+0168e0: BAMUM LETTER PHASE-C KEUSEUX*/
+                                           RTUNI_ALPHA, /* U+0168e1: BAMUM LETTER PHASE-C MBEUX*/
+                                           RTUNI_ALPHA, /* U+0168e2: BAMUM LETTER PHASE-C KEUM*/
+                                           RTUNI_ALPHA, /* U+0168e3: BAMUM LETTER PHASE-C MBAA PICKET*/
+                                           RTUNI_ALPHA, /* U+0168e4: BAMUM LETTER PHASE-C YUWOQ*/
+                                           RTUNI_ALPHA, /* U+0168e5: BAMUM LETTER PHASE-C NJEUX*/
+                                           RTUNI_ALPHA, /* U+0168e6: BAMUM LETTER PHASE-C MIEE*/
+                                           RTUNI_ALPHA, /* U+0168e7: BAMUM LETTER PHASE-C MUAE*/
+                                           RTUNI_ALPHA, /* U+0168e8: BAMUM LETTER PHASE-C SHIQ*/
+                                           RTUNI_ALPHA, /* U+0168e9: BAMUM LETTER PHASE-C KEN LAW*/
+                                           RTUNI_ALPHA, /* U+0168ea: BAMUM LETTER PHASE-C KEN FATIGUE*/
+                                           RTUNI_ALPHA, /* U+0168eb: BAMUM LETTER PHASE-C NGAQ*/
+                                           RTUNI_ALPHA, /* U+0168ec: BAMUM LETTER PHASE-C NAQ*/
+                                           RTUNI_ALPHA, /* U+0168ed: BAMUM LETTER PHASE-C LIQ*/
+                                           RTUNI_ALPHA, /* U+0168ee: BAMUM LETTER PHASE-C PIN*/
+                                           RTUNI_ALPHA, /* U+0168ef: BAMUM LETTER PHASE-C PEN*/
+                                           RTUNI_ALPHA, /* U+0168f0: BAMUM LETTER PHASE-C TET*/
+                                           RTUNI_ALPHA, /* U+0168f1: BAMUM LETTER PHASE-D MBUO*/
+                                           RTUNI_ALPHA, /* U+0168f2: BAMUM LETTER PHASE-D WAP*/
+                                           RTUNI_ALPHA, /* U+0168f3: BAMUM LETTER PHASE-D NJI*/
+                                           RTUNI_ALPHA, /* U+0168f4: BAMUM LETTER PHASE-D MFON*/
+                                           RTUNI_ALPHA, /* U+0168f5: BAMUM LETTER PHASE-D NJIEE*/
+                                           RTUNI_ALPHA, /* U+0168f6: BAMUM LETTER PHASE-D LIEE*/
+                                           RTUNI_ALPHA, /* U+0168f7: BAMUM LETTER PHASE-D NJEUT*/
+                                           RTUNI_ALPHA, /* U+0168f8: BAMUM LETTER PHASE-D NSHEE*/
+                                           RTUNI_ALPHA, /* U+0168f9: BAMUM LETTER PHASE-D NGGAAMAE*/
+                                           RTUNI_ALPHA, /* U+0168fa: BAMUM LETTER PHASE-D NYAM*/
+                                           RTUNI_ALPHA, /* U+0168fb: BAMUM LETTER PHASE-D WUAEN*/
+                                           RTUNI_ALPHA, /* U+0168fc: BAMUM LETTER PHASE-D NGKUN*/
+                                           RTUNI_ALPHA, /* U+0168fd: BAMUM LETTER PHASE-D SHEE*/
+                                           RTUNI_ALPHA, /* U+0168fe: BAMUM LETTER PHASE-D NGKAP*/
+                                           RTUNI_ALPHA, /* U+0168ff: BAMUM LETTER PHASE-D KEUAETMEUN*/
+                                           RTUNI_ALPHA, /* U+016900: BAMUM LETTER PHASE-D TEUT*/
+                                           RTUNI_ALPHA, /* U+016901: BAMUM LETTER PHASE-D SHEUAE*/
+                                           RTUNI_ALPHA, /* U+016902: BAMUM LETTER PHASE-D NJAP*/
+                                           RTUNI_ALPHA, /* U+016903: BAMUM LETTER PHASE-D SUE*/
+                                           RTUNI_ALPHA, /* U+016904: BAMUM LETTER PHASE-D KET*/
+                                           RTUNI_ALPHA, /* U+016905: BAMUM LETTER PHASE-D YAEMMAE*/
+                                           RTUNI_ALPHA, /* U+016906: BAMUM LETTER PHASE-D KUOM*/
+                                           RTUNI_ALPHA, /* U+016907: BAMUM LETTER PHASE-D SAP*/
+                                           RTUNI_ALPHA, /* U+016908: BAMUM LETTER PHASE-D MFEUT*/
+                                           RTUNI_ALPHA, /* U+016909: BAMUM LETTER PHASE-D NDEUX*/
+                                           RTUNI_ALPHA, /* U+01690a: BAMUM LETTER PHASE-D MALEERI*/
+                                           RTUNI_ALPHA, /* U+01690b: BAMUM LETTER PHASE-D MEUT*/
+                                           RTUNI_ALPHA, /* U+01690c: BAMUM LETTER PHASE-D SEUAEQ*/
+                                           RTUNI_ALPHA, /* U+01690d: BAMUM LETTER PHASE-D YEN*/
+                                           RTUNI_ALPHA, /* U+01690e: BAMUM LETTER PHASE-D NJEUAEM*/
+                                           RTUNI_ALPHA, /* U+01690f: BAMUM LETTER PHASE-D KEUOT MBUAE*/
+                                           RTUNI_ALPHA, /* U+016910: BAMUM LETTER PHASE-D NGKEURI*/
+                                           RTUNI_ALPHA, /* U+016911: BAMUM LETTER PHASE-D TU*/
+                                           RTUNI_ALPHA, /* U+016912: BAMUM LETTER PHASE-D GHAA*/
+                                           RTUNI_ALPHA, /* U+016913: BAMUM LETTER PHASE-D NGKYEE*/
+                                           RTUNI_ALPHA, /* U+016914: BAMUM LETTER PHASE-D FEUFEUAET*/
+                                           RTUNI_ALPHA, /* U+016915: BAMUM LETTER PHASE-D NDEE*/
+                                           RTUNI_ALPHA, /* U+016916: BAMUM LETTER PHASE-D MGBOFUM*/
+                                           RTUNI_ALPHA, /* U+016917: BAMUM LETTER PHASE-D LEUAEP*/
+                                           RTUNI_ALPHA, /* U+016918: BAMUM LETTER PHASE-D NDON*/
+                                           RTUNI_ALPHA, /* U+016919: BAMUM LETTER PHASE-D MONI*/
+                                           RTUNI_ALPHA, /* U+01691a: BAMUM LETTER PHASE-D MGBEUN*/
+                                           RTUNI_ALPHA, /* U+01691b: BAMUM LETTER PHASE-D PUUT*/
+                                           RTUNI_ALPHA, /* U+01691c: BAMUM LETTER PHASE-D MGBIEE*/
+                                           RTUNI_ALPHA, /* U+01691d: BAMUM LETTER PHASE-D MFO*/
+                                           RTUNI_ALPHA, /* U+01691e: BAMUM LETTER PHASE-D LUM*/
+                                           RTUNI_ALPHA, /* U+01691f: BAMUM LETTER PHASE-D NSIEEP*/
+                                           RTUNI_ALPHA, /* U+016920: BAMUM LETTER PHASE-D MBAA*/
+                                           RTUNI_ALPHA, /* U+016921: BAMUM LETTER PHASE-D KWAET*/
+                                           RTUNI_ALPHA, /* U+016922: BAMUM LETTER PHASE-D NYET*/
+                                           RTUNI_ALPHA, /* U+016923: BAMUM LETTER PHASE-D TEUAEN*/
+                                           RTUNI_ALPHA, /* U+016924: BAMUM LETTER PHASE-D SOT*/
+                                           RTUNI_ALPHA, /* U+016925: BAMUM LETTER PHASE-D YUWOQ*/
+                                           RTUNI_ALPHA, /* U+016926: BAMUM LETTER PHASE-D KEUM*/
+                                           RTUNI_ALPHA, /* U+016927: BAMUM LETTER PHASE-D RAEM*/
+                                           RTUNI_ALPHA, /* U+016928: BAMUM LETTER PHASE-D TEEEE*/
+                                           RTUNI_ALPHA, /* U+016929: BAMUM LETTER PHASE-D NGKEUAEQ*/
+                                           RTUNI_ALPHA, /* U+01692a: BAMUM LETTER PHASE-D MFEUAE*/
+                                           RTUNI_ALPHA, /* U+01692b: BAMUM LETTER PHASE-D NSIEET*/
+                                           RTUNI_ALPHA, /* U+01692c: BAMUM LETTER PHASE-D KEUP*/
+                                           RTUNI_ALPHA, /* U+01692d: BAMUM LETTER PHASE-D PIP*/
+                                           RTUNI_ALPHA, /* U+01692e: BAMUM LETTER PHASE-D PEUTAE*/
+                                           RTUNI_ALPHA, /* U+01692f: BAMUM LETTER PHASE-D NYUE*/
+                                           RTUNI_ALPHA, /* U+016930: BAMUM LETTER PHASE-D LET*/
+                                           RTUNI_ALPHA, /* U+016931: BAMUM LETTER PHASE-D NGGAAM*/
+                                           RTUNI_ALPHA, /* U+016932: BAMUM LETTER PHASE-D MFIEE*/
+                                           RTUNI_ALPHA, /* U+016933: BAMUM LETTER PHASE-D NGGWAEN*/
+                                           RTUNI_ALPHA, /* U+016934: BAMUM LETTER PHASE-D YUOM*/
+                                           RTUNI_ALPHA, /* U+016935: BAMUM LETTER PHASE-D PAP*/
+                                           RTUNI_ALPHA, /* U+016936: BAMUM LETTER PHASE-D YUOP*/
+                                           RTUNI_ALPHA, /* U+016937: BAMUM LETTER PHASE-D NDAM*/
+                                           RTUNI_ALPHA, /* U+016938: BAMUM LETTER PHASE-D NTEUM*/
+                                           RTUNI_ALPHA, /* U+016939: BAMUM LETTER PHASE-D SUAE*/
+                                           RTUNI_ALPHA, /* U+01693a: BAMUM LETTER PHASE-D KUN*/
+                                           RTUNI_ALPHA, /* U+01693b: BAMUM LETTER PHASE-D NGGEUX*/
+                                           RTUNI_ALPHA, /* U+01693c: BAMUM LETTER PHASE-D NGKIEE*/
+                                           RTUNI_ALPHA, /* U+01693d: BAMUM LETTER PHASE-D TUOT*/
+                                           RTUNI_ALPHA, /* U+01693e: BAMUM LETTER PHASE-D MEUN*/
+                                           RTUNI_ALPHA, /* U+01693f: BAMUM LETTER PHASE-D KUQ*/
+                                           RTUNI_ALPHA, /* U+016940: BAMUM LETTER PHASE-D NSUM*/
+                                           RTUNI_ALPHA, /* U+016941: BAMUM LETTER PHASE-D TEUN*/
+                                           RTUNI_ALPHA, /* U+016942: BAMUM LETTER PHASE-D MAENJET*/
+                                           RTUNI_ALPHA, /* U+016943: BAMUM LETTER PHASE-D NGGAP*/
+                                           RTUNI_ALPHA, /* U+016944: BAMUM LETTER PHASE-D LEUM*/
+                                           RTUNI_ALPHA, /* U+016945: BAMUM LETTER PHASE-D NGGUOM*/
+                                           RTUNI_ALPHA, /* U+016946: BAMUM LETTER PHASE-D NSHUT*/
+                                           RTUNI_ALPHA, /* U+016947: BAMUM LETTER PHASE-D NJUEQ*/
+                                           RTUNI_ALPHA, /* U+016948: BAMUM LETTER PHASE-D GHEUAE*/
+                                           RTUNI_ALPHA, /* U+016949: BAMUM LETTER PHASE-D KU*/
+                                           RTUNI_ALPHA, /* U+01694a: BAMUM LETTER PHASE-D REN OLD*/
+                                           RTUNI_ALPHA, /* U+01694b: BAMUM LETTER PHASE-D TAE*/
+                                           RTUNI_ALPHA, /* U+01694c: BAMUM LETTER PHASE-D TOQ*/
+                                           RTUNI_ALPHA, /* U+01694d: BAMUM LETTER PHASE-D NYI*/
+                                           RTUNI_ALPHA, /* U+01694e: BAMUM LETTER PHASE-D RII*/
+                                           RTUNI_ALPHA, /* U+01694f: BAMUM LETTER PHASE-D LEEEE*/
+                                           RTUNI_ALPHA, /* U+016950: BAMUM LETTER PHASE-D MEEEE*/
+                                           RTUNI_ALPHA, /* U+016951: BAMUM LETTER PHASE-D M*/
+                                           RTUNI_ALPHA, /* U+016952: BAMUM LETTER PHASE-D SUU*/
+                                           RTUNI_ALPHA, /* U+016953: BAMUM LETTER PHASE-D MU*/
+                                           RTUNI_ALPHA, /* U+016954: BAMUM LETTER PHASE-D SHII*/
+                                           RTUNI_ALPHA, /* U+016955: BAMUM LETTER PHASE-D SHEUX*/
+                                           RTUNI_ALPHA, /* U+016956: BAMUM LETTER PHASE-D KYEE*/
+                                           RTUNI_ALPHA, /* U+016957: BAMUM LETTER PHASE-D NU*/
+                                           RTUNI_ALPHA, /* U+016958: BAMUM LETTER PHASE-D SHU*/
+                                           RTUNI_ALPHA, /* U+016959: BAMUM LETTER PHASE-D NTEE*/
+                                           RTUNI_ALPHA, /* U+01695a: BAMUM LETTER PHASE-D PEE*/
+                                           RTUNI_ALPHA, /* U+01695b: BAMUM LETTER PHASE-D NI*/
+                                           RTUNI_ALPHA, /* U+01695c: BAMUM LETTER PHASE-D SHOQ*/
+                                           RTUNI_ALPHA, /* U+01695d: BAMUM LETTER PHASE-D PUQ*/
+                                           RTUNI_ALPHA, /* U+01695e: BAMUM LETTER PHASE-D MVOP*/
+                                           RTUNI_ALPHA, /* U+01695f: BAMUM LETTER PHASE-D LOQ*/
+                                           RTUNI_ALPHA, /* U+016960: BAMUM LETTER PHASE-D REN MUCH*/
+                                           RTUNI_ALPHA, /* U+016961: BAMUM LETTER PHASE-D TI*/
+                                           RTUNI_ALPHA, /* U+016962: BAMUM LETTER PHASE-D NTUU*/
+                                           RTUNI_ALPHA, /* U+016963: BAMUM LETTER PHASE-D MBAA SEVEN*/
+                                           RTUNI_ALPHA, /* U+016964: BAMUM LETTER PHASE-D SAQ*/
+                                           RTUNI_ALPHA, /* U+016965: BAMUM LETTER PHASE-D FAA*/
+                                           RTUNI_ALPHA, /* U+016966: BAMUM LETTER PHASE-E NDAP*/
+                                           RTUNI_ALPHA, /* U+016967: BAMUM LETTER PHASE-E TOON*/
+                                           RTUNI_ALPHA, /* U+016968: BAMUM LETTER PHASE-E MBEUM*/
+                                           RTUNI_ALPHA, /* U+016969: BAMUM LETTER PHASE-E LAP*/
+                                           RTUNI_ALPHA, /* U+01696a: BAMUM LETTER PHASE-E VOM*/
+                                           RTUNI_ALPHA, /* U+01696b: BAMUM LETTER PHASE-E LOON*/
+                                           RTUNI_ALPHA, /* U+01696c: BAMUM LETTER PHASE-E PAA*/
+                                           RTUNI_ALPHA, /* U+01696d: BAMUM LETTER PHASE-E SOM*/
+                                           RTUNI_ALPHA, /* U+01696e: BAMUM LETTER PHASE-E RAQ*/
+                                           RTUNI_ALPHA, /* U+01696f: BAMUM LETTER PHASE-E NSHUOP*/
+                                           RTUNI_ALPHA, /* U+016970: BAMUM LETTER PHASE-E NDUN*/
+                                           RTUNI_ALPHA, /* U+016971: BAMUM LETTER PHASE-E PUAE*/
+                                           RTUNI_ALPHA, /* U+016972: BAMUM LETTER PHASE-E TAM*/
+                                           RTUNI_ALPHA, /* U+016973: BAMUM LETTER PHASE-E NGKA*/
+                                           RTUNI_ALPHA, /* U+016974: BAMUM LETTER PHASE-E KPEUX*/
+                                           RTUNI_ALPHA, /* U+016975: BAMUM LETTER PHASE-E WUO*/
+                                           RTUNI_ALPHA, /* U+016976: BAMUM LETTER PHASE-E SEE*/
+                                           RTUNI_ALPHA, /* U+016977: BAMUM LETTER PHASE-E NGGEUAET*/
+                                           RTUNI_ALPHA, /* U+016978: BAMUM LETTER PHASE-E PAAM*/
+                                           RTUNI_ALPHA, /* U+016979: BAMUM LETTER PHASE-E TOO*/
+                                           RTUNI_ALPHA, /* U+01697a: BAMUM LETTER PHASE-E KUOP*/
+                                           RTUNI_ALPHA, /* U+01697b: BAMUM LETTER PHASE-E LOM*/
+                                           RTUNI_ALPHA, /* U+01697c: BAMUM LETTER PHASE-E NSHIEE*/
+                                           RTUNI_ALPHA, /* U+01697d: BAMUM LETTER PHASE-E NGOP*/
+                                           RTUNI_ALPHA, /* U+01697e: BAMUM LETTER PHASE-E MAEM*/
+                                           RTUNI_ALPHA, /* U+01697f: BAMUM LETTER PHASE-E NGKEUX*/
+                                           RTUNI_ALPHA, /* U+016980: BAMUM LETTER PHASE-E NGOQ*/
+                                           RTUNI_ALPHA, /* U+016981: BAMUM LETTER PHASE-E NSHUE*/
+                                           RTUNI_ALPHA, /* U+016982: BAMUM LETTER PHASE-E RIMGBA*/
+                                           RTUNI_ALPHA, /* U+016983: BAMUM LETTER PHASE-E NJEUX*/
+                                           RTUNI_ALPHA, /* U+016984: BAMUM LETTER PHASE-E PEEM*/
+                                           RTUNI_ALPHA, /* U+016985: BAMUM LETTER PHASE-E SAA*/
+                                           RTUNI_ALPHA, /* U+016986: BAMUM LETTER PHASE-E NGGURAE*/
+                                           RTUNI_ALPHA, /* U+016987: BAMUM LETTER PHASE-E MGBA*/
+                                           RTUNI_ALPHA, /* U+016988: BAMUM LETTER PHASE-E GHEUX*/
+                                           RTUNI_ALPHA, /* U+016989: BAMUM LETTER PHASE-E NGKEUAEM*/
+                                           RTUNI_ALPHA, /* U+01698a: BAMUM LETTER PHASE-E NJAEMLI*/
+                                           RTUNI_ALPHA, /* U+01698b: BAMUM LETTER PHASE-E MAP*/
+                                           RTUNI_ALPHA, /* U+01698c: BAMUM LETTER PHASE-E LOOT*/
+                                           RTUNI_ALPHA, /* U+01698d: BAMUM LETTER PHASE-E NGGEEEE*/
+                                           RTUNI_ALPHA, /* U+01698e: BAMUM LETTER PHASE-E NDIQ*/
+                                           RTUNI_ALPHA, /* U+01698f: BAMUM LETTER PHASE-E TAEN NTEUM*/
+                                           RTUNI_ALPHA, /* U+016990: BAMUM LETTER PHASE-E SET*/
+                                           RTUNI_ALPHA, /* U+016991: BAMUM LETTER PHASE-E PUM*/
+                                           RTUNI_ALPHA, /* U+016992: BAMUM LETTER PHASE-E NDAA SOFTNESS*/
+                                           RTUNI_ALPHA, /* U+016993: BAMUM LETTER PHASE-E NGGUAESHAE NYAM*/
+                                           RTUNI_ALPHA, /* U+016994: BAMUM LETTER PHASE-E YIEE*/
+                                           RTUNI_ALPHA, /* U+016995: BAMUM LETTER PHASE-E GHEUN*/
+                                           RTUNI_ALPHA, /* U+016996: BAMUM LETTER PHASE-E TUAE*/
+                                           RTUNI_ALPHA, /* U+016997: BAMUM LETTER PHASE-E YEUAE*/
+                                           RTUNI_ALPHA, /* U+016998: BAMUM LETTER PHASE-E PO*/
+                                           RTUNI_ALPHA, /* U+016999: BAMUM LETTER PHASE-E TUMAE*/
+                                           RTUNI_ALPHA, /* U+01699a: BAMUM LETTER PHASE-E KEUAE*/
+                                           RTUNI_ALPHA, /* U+01699b: BAMUM LETTER PHASE-E SUAEN*/
+                                           RTUNI_ALPHA, /* U+01699c: BAMUM LETTER PHASE-E TEUAEQ*/
+                                           RTUNI_ALPHA, /* U+01699d: BAMUM LETTER PHASE-E VEUAE*/
+                                           RTUNI_ALPHA, /* U+01699e: BAMUM LETTER PHASE-E WEUX*/
+                                           RTUNI_ALPHA, /* U+01699f: BAMUM LETTER PHASE-E LAAM*/
+                                           RTUNI_ALPHA, /* U+0169a0: BAMUM LETTER PHASE-E PU*/
+                                           RTUNI_ALPHA, /* U+0169a1: BAMUM LETTER PHASE-E TAAQ*/
+                                           RTUNI_ALPHA, /* U+0169a2: BAMUM LETTER PHASE-E GHAAMAE*/
+                                           RTUNI_ALPHA, /* U+0169a3: BAMUM LETTER PHASE-E NGEUREUT*/
+                                           RTUNI_ALPHA, /* U+0169a4: BAMUM LETTER PHASE-E SHEUAEQ*/
+                                           RTUNI_ALPHA, /* U+0169a5: BAMUM LETTER PHASE-E MGBEN*/
+                                           RTUNI_ALPHA, /* U+0169a6: BAMUM LETTER PHASE-E MBEE*/
+                                           RTUNI_ALPHA, /* U+0169a7: BAMUM LETTER PHASE-E NZAQ*/
+                                           RTUNI_ALPHA, /* U+0169a8: BAMUM LETTER PHASE-E NKOM*/
+                                           RTUNI_ALPHA, /* U+0169a9: BAMUM LETTER PHASE-E GBET*/
+                                           RTUNI_ALPHA, /* U+0169aa: BAMUM LETTER PHASE-E TUM*/
+                                           RTUNI_ALPHA, /* U+0169ab: BAMUM LETTER PHASE-E KUET*/
+                                           RTUNI_ALPHA, /* U+0169ac: BAMUM LETTER PHASE-E YAP*/
+                                           RTUNI_ALPHA, /* U+0169ad: BAMUM LETTER PHASE-E NYI CLEAVER*/
+                                           RTUNI_ALPHA, /* U+0169ae: BAMUM LETTER PHASE-E YIT*/
+                                           RTUNI_ALPHA, /* U+0169af: BAMUM LETTER PHASE-E MFEUQ*/
+                                           RTUNI_ALPHA, /* U+0169b0: BAMUM LETTER PHASE-E NDIAQ*/
+                                           RTUNI_ALPHA, /* U+0169b1: BAMUM LETTER PHASE-E PIEEQ*/
+                                           RTUNI_ALPHA, /* U+0169b2: BAMUM LETTER PHASE-E YUEQ*/
+                                           RTUNI_ALPHA, /* U+0169b3: BAMUM LETTER PHASE-E LEUAEM*/
+                                           RTUNI_ALPHA, /* U+0169b4: BAMUM LETTER PHASE-E FUE*/
+                                           RTUNI_ALPHA, /* U+0169b5: BAMUM LETTER PHASE-E GBEUX*/
+                                           RTUNI_ALPHA, /* U+0169b6: BAMUM LETTER PHASE-E NGKUP*/
+                                           RTUNI_ALPHA, /* U+0169b7: BAMUM LETTER PHASE-E KET*/
+                                           RTUNI_ALPHA, /* U+0169b8: BAMUM LETTER PHASE-E MAE*/
+                                           RTUNI_ALPHA, /* U+0169b9: BAMUM LETTER PHASE-E NGKAAMI*/
+                                           RTUNI_ALPHA, /* U+0169ba: BAMUM LETTER PHASE-E GHET*/
+                                           RTUNI_ALPHA, /* U+0169bb: BAMUM LETTER PHASE-E FA*/
+                                           RTUNI_ALPHA, /* U+0169bc: BAMUM LETTER PHASE-E NTUM*/
+                                           RTUNI_ALPHA, /* U+0169bd: BAMUM LETTER PHASE-E PEUT*/
+                                           RTUNI_ALPHA, /* U+0169be: BAMUM LETTER PHASE-E YEUM*/
+                                           RTUNI_ALPHA, /* U+0169bf: BAMUM LETTER PHASE-E NGGEUAE*/
+                                           RTUNI_ALPHA, /* U+0169c0: BAMUM LETTER PHASE-E NYI BETWEEN*/
+                                           RTUNI_ALPHA, /* U+0169c1: BAMUM LETTER PHASE-E NZUQ*/
+                                           RTUNI_ALPHA, /* U+0169c2: BAMUM LETTER PHASE-E POON*/
+                                           RTUNI_ALPHA, /* U+0169c3: BAMUM LETTER PHASE-E MIEE*/
+                                           RTUNI_ALPHA, /* U+0169c4: BAMUM LETTER PHASE-E FUET*/
+                                           RTUNI_ALPHA, /* U+0169c5: BAMUM LETTER PHASE-E NAE*/
+                                           RTUNI_ALPHA, /* U+0169c6: BAMUM LETTER PHASE-E MUAE*/
+                                           RTUNI_ALPHA, /* U+0169c7: BAMUM LETTER PHASE-E GHEUAE*/
+                                           RTUNI_ALPHA, /* U+0169c8: BAMUM LETTER PHASE-E FU I*/
+                                           RTUNI_ALPHA, /* U+0169c9: BAMUM LETTER PHASE-E MVI*/
+                                           RTUNI_ALPHA, /* U+0169ca: BAMUM LETTER PHASE-E PUAQ*/
+                                           RTUNI_ALPHA, /* U+0169cb: BAMUM LETTER PHASE-E NGKUM*/
+                                           RTUNI_ALPHA, /* U+0169cc: BAMUM LETTER PHASE-E KUT*/
+                                           RTUNI_ALPHA, /* U+0169cd: BAMUM LETTER PHASE-E PIET*/
+                                           RTUNI_ALPHA, /* U+0169ce: BAMUM LETTER PHASE-E NTAP*/
+                                           RTUNI_ALPHA, /* U+0169cf: BAMUM LETTER PHASE-E YEUAET*/
+                                           RTUNI_ALPHA, /* U+0169d0: BAMUM LETTER PHASE-E NGGUP*/
+                                           RTUNI_ALPHA, /* U+0169d1: BAMUM LETTER PHASE-E PA PEOPLE*/
+                                           RTUNI_ALPHA, /* U+0169d2: BAMUM LETTER PHASE-E FU CALL*/
+                                           RTUNI_ALPHA, /* U+0169d3: BAMUM LETTER PHASE-E FOM*/
+                                           RTUNI_ALPHA, /* U+0169d4: BAMUM LETTER PHASE-E NJEE*/
+                                           RTUNI_ALPHA, /* U+0169d5: BAMUM LETTER PHASE-E A*/
+                                           RTUNI_ALPHA, /* U+0169d6: BAMUM LETTER PHASE-E TOQ*/
+                                           RTUNI_ALPHA, /* U+0169d7: BAMUM LETTER PHASE-E O*/
+                                           RTUNI_ALPHA, /* U+0169d8: BAMUM LETTER PHASE-E I*/
+                                           RTUNI_ALPHA, /* U+0169d9: BAMUM LETTER PHASE-E LAQ*/
+                                           RTUNI_ALPHA, /* U+0169da: BAMUM LETTER PHASE-E PA PLURAL*/
+                                           RTUNI_ALPHA, /* U+0169db: BAMUM LETTER PHASE-E TAA*/
+                                           RTUNI_ALPHA, /* U+0169dc: BAMUM LETTER PHASE-E TAQ*/
+                                           RTUNI_ALPHA, /* U+0169dd: BAMUM LETTER PHASE-E NDAA MY HOUSE*/
+                                           RTUNI_ALPHA, /* U+0169de: BAMUM LETTER PHASE-E SHIQ*/
+                                           RTUNI_ALPHA, /* U+0169df: BAMUM LETTER PHASE-E YEUX*/
+                                           RTUNI_ALPHA, /* U+0169e0: BAMUM LETTER PHASE-E NGUAE*/
+                                           RTUNI_ALPHA, /* U+0169e1: BAMUM LETTER PHASE-E YUAEN*/
+                                           RTUNI_ALPHA, /* U+0169e2: BAMUM LETTER PHASE-E YOQ SWIMMING*/
+                                           RTUNI_ALPHA, /* U+0169e3: BAMUM LETTER PHASE-E YOQ COVER*/
+                                           RTUNI_ALPHA, /* U+0169e4: BAMUM LETTER PHASE-E YUQ*/
+                                           RTUNI_ALPHA, /* U+0169e5: BAMUM LETTER PHASE-E YUN*/
+                                           RTUNI_ALPHA, /* U+0169e6: BAMUM LETTER PHASE-E KEUX*/
+                                           RTUNI_ALPHA, /* U+0169e7: BAMUM LETTER PHASE-E PEUX*/
+                                           RTUNI_ALPHA, /* U+0169e8: BAMUM LETTER PHASE-E NJEE EPOCH*/
+                                           RTUNI_ALPHA, /* U+0169e9: BAMUM LETTER PHASE-E PUE*/
+                                           RTUNI_ALPHA, /* U+0169ea: BAMUM LETTER PHASE-E WUE*/
+                                           RTUNI_ALPHA, /* U+0169eb: BAMUM LETTER PHASE-E FEE*/
+                                           RTUNI_ALPHA, /* U+0169ec: BAMUM LETTER PHASE-E VEE*/
+                                           RTUNI_ALPHA, /* U+0169ed: BAMUM LETTER PHASE-E LU*/
+                                           RTUNI_ALPHA, /* U+0169ee: BAMUM LETTER PHASE-E MI*/
+                                           RTUNI_ALPHA, /* U+0169ef: BAMUM LETTER PHASE-E REUX*/
+                                           RTUNI_ALPHA, /* U+0169f0: BAMUM LETTER PHASE-E RAE*/
+                                           RTUNI_ALPHA, /* U+0169f1: BAMUM LETTER PHASE-E NGUAET*/
+                                           RTUNI_ALPHA, /* U+0169f2: BAMUM LETTER PHASE-E NGA*/
+                                           RTUNI_ALPHA, /* U+0169f3: BAMUM LETTER PHASE-E SHO*/
+                                           RTUNI_ALPHA, /* U+0169f4: BAMUM LETTER PHASE-E SHOQ*/
+                                           RTUNI_ALPHA, /* U+0169f5: BAMUM LETTER PHASE-E FU REMEDY*/
+                                           RTUNI_ALPHA, /* U+0169f6: BAMUM LETTER PHASE-E NA*/
+                                           RTUNI_ALPHA, /* U+0169f7: BAMUM LETTER PHASE-E PI*/
+                                           RTUNI_ALPHA, /* U+0169f8: BAMUM LETTER PHASE-E LOQ*/
+                                           RTUNI_ALPHA, /* U+0169f9: BAMUM LETTER PHASE-E KO*/
+                                           RTUNI_ALPHA, /* U+0169fa: BAMUM LETTER PHASE-E MEN*/
+                                           RTUNI_ALPHA, /* U+0169fb: BAMUM LETTER PHASE-E MA*/
+                                           RTUNI_ALPHA, /* U+0169fc: BAMUM LETTER PHASE-E MAQ*/
+                                           RTUNI_ALPHA, /* U+0169fd: BAMUM LETTER PHASE-E TEU*/
+                                           RTUNI_ALPHA, /* U+0169fe: BAMUM LETTER PHASE-E KI*/
+                                           RTUNI_ALPHA, /* U+0169ff: BAMUM LETTER PHASE-E MON*/
+                                           RTUNI_ALPHA, /* U+016a00: BAMUM LETTER PHASE-E TEN*/
+                                           RTUNI_ALPHA, /* U+016a01: BAMUM LETTER PHASE-E FAQ*/
+                                           RTUNI_ALPHA, /* U+016a02: BAMUM LETTER PHASE-E GHOM*/
+                                           RTUNI_ALPHA, /* U+016a03: BAMUM LETTER PHASE-F KA*/
+                                           RTUNI_ALPHA, /* U+016a04: BAMUM LETTER PHASE-F U*/
+                                           RTUNI_ALPHA, /* U+016a05: BAMUM LETTER PHASE-F KU*/
+                                           RTUNI_ALPHA, /* U+016a06: BAMUM LETTER PHASE-F EE*/
+                                           RTUNI_ALPHA, /* U+016a07: BAMUM LETTER PHASE-F REE*/
+                                           RTUNI_ALPHA, /* U+016a08: BAMUM LETTER PHASE-F TAE*/
+                                           RTUNI_ALPHA, /* U+016a09: BAMUM LETTER PHASE-F NYI*/
+                                           RTUNI_ALPHA, /* U+016a0a: BAMUM LETTER PHASE-F LA*/
+                                           RTUNI_ALPHA, /* U+016a0b: BAMUM LETTER PHASE-F RII*/
+                                           RTUNI_ALPHA, /* U+016a0c: BAMUM LETTER PHASE-F RIEE*/
+                                           RTUNI_ALPHA, /* U+016a0d: BAMUM LETTER PHASE-F MEEEE*/
+                                           RTUNI_ALPHA, /* U+016a0e: BAMUM LETTER PHASE-F TAA*/
+                                           RTUNI_ALPHA, /* U+016a0f: BAMUM LETTER PHASE-F NDAA*/
+                                           RTUNI_ALPHA, /* U+016a10: BAMUM LETTER PHASE-F NJAEM*/
+                                           RTUNI_ALPHA, /* U+016a11: BAMUM LETTER PHASE-F M*/
+                                           RTUNI_ALPHA, /* U+016a12: BAMUM LETTER PHASE-F SUU*/
+                                           RTUNI_ALPHA, /* U+016a13: BAMUM LETTER PHASE-F SHII*/
+                                           RTUNI_ALPHA, /* U+016a14: BAMUM LETTER PHASE-F SI*/
+                                           RTUNI_ALPHA, /* U+016a15: BAMUM LETTER PHASE-F SEUX*/
+                                           RTUNI_ALPHA, /* U+016a16: BAMUM LETTER PHASE-F KYEE*/
+                                           RTUNI_ALPHA, /* U+016a17: BAMUM LETTER PHASE-F KET*/
+                                           RTUNI_ALPHA, /* U+016a18: BAMUM LETTER PHASE-F NUAE*/
+                                           RTUNI_ALPHA, /* U+016a19: BAMUM LETTER PHASE-F NU*/
+                                           RTUNI_ALPHA, /* U+016a1a: BAMUM LETTER PHASE-F NJUAE*/
+                                           RTUNI_ALPHA, /* U+016a1b: BAMUM LETTER PHASE-F YOQ*/
+                                           RTUNI_ALPHA, /* U+016a1c: BAMUM LETTER PHASE-F SHU*/
+                                           RTUNI_ALPHA, /* U+016a1d: BAMUM LETTER PHASE-F YA*/
+                                           RTUNI_ALPHA, /* U+016a1e: BAMUM LETTER PHASE-F NSHA*/
+                                           RTUNI_ALPHA, /* U+016a1f: BAMUM LETTER PHASE-F PEUX*/
+                                           RTUNI_ALPHA, /* U+016a20: BAMUM LETTER PHASE-F NTEE*/
+                                           RTUNI_ALPHA, /* U+016a21: BAMUM LETTER PHASE-F WUE*/
+                                           RTUNI_ALPHA, /* U+016a22: BAMUM LETTER PHASE-F PEE*/
+                                           RTUNI_ALPHA, /* U+016a23: BAMUM LETTER PHASE-F RU*/
+                                           RTUNI_ALPHA, /* U+016a24: BAMUM LETTER PHASE-F NI*/
+                                           RTUNI_ALPHA, /* U+016a25: BAMUM LETTER PHASE-F REUX*/
+                                           RTUNI_ALPHA, /* U+016a26: BAMUM LETTER PHASE-F KEN*/
+                                           RTUNI_ALPHA, /* U+016a27: BAMUM LETTER PHASE-F NGKWAEN*/
+                                           RTUNI_ALPHA, /* U+016a28: BAMUM LETTER PHASE-F NGGA*/
+                                           RTUNI_ALPHA, /* U+016a29: BAMUM LETTER PHASE-F SHO*/
+                                           RTUNI_ALPHA, /* U+016a2a: BAMUM LETTER PHASE-F PUAE*/
+                                           RTUNI_ALPHA, /* U+016a2b: BAMUM LETTER PHASE-F FOM*/
+                                           RTUNI_ALPHA, /* U+016a2c: BAMUM LETTER PHASE-F WA*/
+                                           RTUNI_ALPHA, /* U+016a2d: BAMUM LETTER PHASE-F LI*/
+                                           RTUNI_ALPHA, /* U+016a2e: BAMUM LETTER PHASE-F LOQ*/
+                                           RTUNI_ALPHA, /* U+016a2f: BAMUM LETTER PHASE-F KO*/
+                                           RTUNI_ALPHA, /* U+016a30: BAMUM LETTER PHASE-F MBEN*/
+                                           RTUNI_ALPHA, /* U+016a31: BAMUM LETTER PHASE-F REN*/
+                                           RTUNI_ALPHA, /* U+016a32: BAMUM LETTER PHASE-F MA*/
+                                           RTUNI_ALPHA, /* U+016a33: BAMUM LETTER PHASE-F MO*/
+                                           RTUNI_ALPHA, /* U+016a34: BAMUM LETTER PHASE-F MBAA*/
+                                           RTUNI_ALPHA, /* U+016a35: BAMUM LETTER PHASE-F TET*/
+                                           RTUNI_ALPHA, /* U+016a36: BAMUM LETTER PHASE-F KPA*/
+                                           RTUNI_ALPHA, /* U+016a37: BAMUM LETTER PHASE-F SAMBA*/
+                                           RTUNI_ALPHA, /* U+016a38: BAMUM LETTER PHASE-F VUEQ*/
+                                                     0, /* U+016a39: */
+                                                     0, /* U+016a3a: */
+                                                     0, /* U+016a3b: */
+                                                     0, /* U+016a3c: */
+                                                     0, /* U+016a3d: */
+                                                     0, /* U+016a3e: */
+                                                     0, /* U+016a3f: */
+                                                     0, /* U+016a40: */
+                                                     0, /* U+016a41: */
+                                                     0, /* U+016a42: */
+                                                     0, /* U+016a43: */
+                                                     0, /* U+016a44: */
+                                                     0, /* U+016a45: */
+                                                     0, /* U+016a46: */
+                                                     0, /* U+016a47: */
+                                                     0, /* U+016a48: */
+                                                     0, /* U+016a49: */
+                                                     0, /* U+016a4a: */
+                                                     0, /* U+016a4b: */
+                                                     0, /* U+016a4c: */
+                                                     0, /* U+016a4d: */
+                                                     0, /* U+016a4e: */
+                                                     0, /* U+016a4f: */
+                                                     0, /* U+016a50: */
+                                                     0, /* U+016a51: */
+                                                     0, /* U+016a52: */
+                                                     0, /* U+016a53: */
+                                                     0, /* U+016a54: */
+                                                     0, /* U+016a55: */
+                                                     0, /* U+016a56: */
+                                                     0, /* U+016a57: */
+                                                     0, /* U+016a58: */
+                                                     0, /* U+016a59: */
+                                                     0, /* U+016a5a: */
+                                                     0, /* U+016a5b: */
+                                                     0, /* U+016a5c: */
+                                                     0, /* U+016a5d: */
+                                                     0, /* U+016a5e: */
+                                                     0, /* U+016a5f: */
+                                                     0, /* U+016a60: */
+                                                     0, /* U+016a61: */
+                                                     0, /* U+016a62: */
+                                                     0, /* U+016a63: */
+                                                     0, /* U+016a64: */
+                                                     0, /* U+016a65: */
+                                                     0, /* U+016a66: */
+                                                     0, /* U+016a67: */
+                                                     0, /* U+016a68: */
+                                                     0, /* U+016a69: */
+                                                     0, /* U+016a6a: */
+                                                     0, /* U+016a6b: */
+                                                     0, /* U+016a6c: */
+                                                     0, /* U+016a6d: */
+                                                     0, /* U+016a6e: */
+                                                     0, /* U+016a6f: */
+                                                     0, /* U+016a70: */
+                                                     0, /* U+016a71: */
+                                                     0, /* U+016a72: */
+                                                     0, /* U+016a73: */
+                                                     0, /* U+016a74: */
+                                                     0, /* U+016a75: */
+                                                     0, /* U+016a76: */
+                                                     0, /* U+016a77: */
+                                                     0, /* U+016a78: */
+                                                     0, /* U+016a79: */
+                                                     0, /* U+016a7a: */
+                                                     0, /* U+016a7b: */
+                                                     0, /* U+016a7c: */
+                                                     0, /* U+016a7d: */
+                                                     0, /* U+016a7e: */
+                                                     0, /* U+016a7f: */
+                                                     0, /* U+016a80: */
+                                                     0, /* U+016a81: */
+                                                     0, /* U+016a82: */
+                                                     0, /* U+016a83: */
+                                                     0, /* U+016a84: */
+                                                     0, /* U+016a85: */
+                                                     0, /* U+016a86: */
+                                                     0, /* U+016a87: */
+                                                     0, /* U+016a88: */
+                                                     0, /* U+016a89: */
+                                                     0, /* U+016a8a: */
+                                                     0, /* U+016a8b: */
+                                                     0, /* U+016a8c: */
+                                                     0, /* U+016a8d: */
+                                                     0, /* U+016a8e: */
+                                                     0, /* U+016a8f: */
+                                                     0, /* U+016a90: */
+                                                     0, /* U+016a91: */
+                                                     0, /* U+016a92: */
+                                                     0, /* U+016a93: */
+                                                     0, /* U+016a94: */
+                                                     0, /* U+016a95: */
+                                                     0, /* U+016a96: */
+                                                     0, /* U+016a97: */
+                                                     0, /* U+016a98: */
+                                                     0, /* U+016a99: */
+                                                     0, /* U+016a9a: */
+                                                     0, /* U+016a9b: */
+                                                     0, /* U+016a9c: */
+                                                     0, /* U+016a9d: */
+                                                     0, /* U+016a9e: */
+                                                     0, /* U+016a9f: */
+                                                     0, /* U+016aa0: */
+                                                     0, /* U+016aa1: */
+                                                     0, /* U+016aa2: */
+                                                     0, /* U+016aa3: */
+                                                     0, /* U+016aa4: */
+                                                     0, /* U+016aa5: */
+                                                     0, /* U+016aa6: */
+                                                     0, /* U+016aa7: */
+                                                     0, /* U+016aa8: */
+                                                     0, /* U+016aa9: */
+                                                     0, /* U+016aaa: */
+                                                     0, /* U+016aab: */
+                                                     0, /* U+016aac: */
+                                                     0, /* U+016aad: */
+                                                     0, /* U+016aae: */
+                                                     0, /* U+016aaf: */
+                                                     0, /* U+016ab0: */
+                                                     0, /* U+016ab1: */
+                                                     0, /* U+016ab2: */
+                                                     0, /* U+016ab3: */
+                                                     0, /* U+016ab4: */
+                                                     0, /* U+016ab5: */
+                                                     0, /* U+016ab6: */
+                                                     0, /* U+016ab7: */
+                                                     0, /* U+016ab8: */
+                                                     0, /* U+016ab9: */
+                                                     0, /* U+016aba: */
+                                                     0, /* U+016abb: */
+                                                     0, /* U+016abc: */
+                                                     0, /* U+016abd: */
+                                                     0, /* U+016abe: */
+                                                     0, /* U+016abf: */
+                                                     0, /* U+016ac0: */
+                                                     0, /* U+016ac1: */
+                                                     0, /* U+016ac2: */
+                                                     0, /* U+016ac3: */
+                                                     0, /* U+016ac4: */
+                                                     0, /* U+016ac5: */
+                                                     0, /* U+016ac6: */
+                                                     0, /* U+016ac7: */
+                                                     0, /* U+016ac8: */
+                                                     0, /* U+016ac9: */
+                                                     0, /* U+016aca: */
+                                                     0, /* U+016acb: */
+                                                     0, /* U+016acc: */
+                                                     0, /* U+016acd: */
+                                                     0, /* U+016ace: */
+                                                     0, /* U+016acf: */
+                                                     0, /* U+016ad0: */
+                                                     0, /* U+016ad1: */
+                                                     0, /* U+016ad2: */
+                                                     0, /* U+016ad3: */
+                                                     0, /* U+016ad4: */
+                                                     0, /* U+016ad5: */
+                                                     0, /* U+016ad6: */
+                                                     0, /* U+016ad7: */
+                                                     0, /* U+016ad8: */
+                                                     0, /* U+016ad9: */
+                                                     0, /* U+016ada: */
+                                                     0, /* U+016adb: */
+                                                     0, /* U+016adc: */
+                                                     0, /* U+016add: */
+                                                     0, /* U+016ade: */
+                                                     0, /* U+016adf: */
+                                                     0, /* U+016ae0: */
+                                                     0, /* U+016ae1: */
+                                                     0, /* U+016ae2: */
+                                                     0, /* U+016ae3: */
+                                                     0, /* U+016ae4: */
+                                                     0, /* U+016ae5: */
+                                                     0, /* U+016ae6: */
+                                                     0, /* U+016ae7: */
+                                                     0, /* U+016ae8: */
+                                                     0, /* U+016ae9: */
+                                                     0, /* U+016aea: */
+                                                     0, /* U+016aeb: */
+                                                     0, /* U+016aec: */
+                                                     0, /* U+016aed: */
+                                                     0, /* U+016aee: */
+                                                     0, /* U+016aef: */
+                                                     0, /* U+016af0: */
+                                                     0, /* U+016af1: */
+                                                     0, /* U+016af2: */
+                                                     0, /* U+016af3: */
+                                                     0, /* U+016af4: */
+                                                     0, /* U+016af5: */
+                                                     0, /* U+016af6: */
+                                                     0, /* U+016af7: */
+                                                     0, /* U+016af8: */
+                                                     0, /* U+016af9: */
+                                                     0, /* U+016afa: */
+                                                     0, /* U+016afb: */
+                                                     0, /* U+016afc: */
+                                                     0, /* U+016afd: */
+                                                     0, /* U+016afe: */
+                                                     0, /* U+016aff: */
+                                                     0, /* U+016b00: */
+                                                     0, /* U+016b01: */
+                                                     0, /* U+016b02: */
+                                                     0, /* U+016b03: */
+                                                     0, /* U+016b04: */
+                                                     0, /* U+016b05: */
+                                                     0, /* U+016b06: */
+                                                     0, /* U+016b07: */
+                                                     0, /* U+016b08: */
+                                                     0, /* U+016b09: */
+                                                     0, /* U+016b0a: */
+                                                     0, /* U+016b0b: */
+                                                     0, /* U+016b0c: */
+                                                     0, /* U+016b0d: */
+                                                     0, /* U+016b0e: */
+                                                     0, /* U+016b0f: */
+                                                     0, /* U+016b10: */
+                                                     0, /* U+016b11: */
+                                                     0, /* U+016b12: */
+                                                     0, /* U+016b13: */
+                                                     0, /* U+016b14: */
+                                                     0, /* U+016b15: */
+                                                     0, /* U+016b16: */
+                                                     0, /* U+016b17: */
+                                                     0, /* U+016b18: */
+                                                     0, /* U+016b19: */
+                                                     0, /* U+016b1a: */
+                                                     0, /* U+016b1b: */
+                                                     0, /* U+016b1c: */
+                                                     0, /* U+016b1d: */
+                                                     0, /* U+016b1e: */
+                                                     0, /* U+016b1f: */
+                                                     0, /* U+016b20: */
+                                                     0, /* U+016b21: */
+                                                     0, /* U+016b22: */
+                                                     0, /* U+016b23: */
+                                                     0, /* U+016b24: */
+                                                     0, /* U+016b25: */
+                                                     0, /* U+016b26: */
+                                                     0, /* U+016b27: */
+                                                     0, /* U+016b28: */
+                                                     0, /* U+016b29: */
+                                                     0, /* U+016b2a: */
+                                                     0, /* U+016b2b: */
+                                                     0, /* U+016b2c: */
+                                                     0, /* U+016b2d: */
+                                                     0, /* U+016b2e: */
+                                                     0, /* U+016b2f: */
+                                                     0, /* U+016b30: */
+                                                     0, /* U+016b31: */
+                                                     0, /* U+016b32: */
+                                                     0, /* U+016b33: */
+                                                     0, /* U+016b34: */
+                                                     0, /* U+016b35: */
+                                                     0, /* U+016b36: */
+                                                     0, /* U+016b37: */
+                                                     0, /* U+016b38: */
+                                                     0, /* U+016b39: */
+                                                     0, /* U+016b3a: */
+                                                     0, /* U+016b3b: */
+                                                     0, /* U+016b3c: */
+                                                     0, /* U+016b3d: */
+                                                     0, /* U+016b3e: */
+                                                     0, /* U+016b3f: */
+                                                     0, /* U+016b40: */
+                                                     0, /* U+016b41: */
+                                                     0, /* U+016b42: */
+                                                     0, /* U+016b43: */
+                                                     0, /* U+016b44: */
+                                                     0, /* U+016b45: */
+                                                     0, /* U+016b46: */
+                                                     0, /* U+016b47: */
+                                                     0, /* U+016b48: */
+                                                     0, /* U+016b49: */
+                                                     0, /* U+016b4a: */
+                                                     0, /* U+016b4b: */
+                                                     0, /* U+016b4c: */
+                                                     0, /* U+016b4d: */
+                                                     0, /* U+016b4e: */
+                                                     0, /* U+016b4f: */
+                                                     0, /* U+016b50: */
+                                                     0, /* U+016b51: */
+                                                     0, /* U+016b52: */
+                                                     0, /* U+016b53: */
+                                                     0, /* U+016b54: */
+                                                     0, /* U+016b55: */
+                                                     0, /* U+016b56: */
+                                                     0, /* U+016b57: */
+                                                     0, /* U+016b58: */
+                                                     0, /* U+016b59: */
+                                                     0, /* U+016b5a: */
+                                                     0, /* U+016b5b: */
+                                                     0, /* U+016b5c: */
+                                                     0, /* U+016b5d: */
+                                                     0, /* U+016b5e: */
+                                                     0, /* U+016b5f: */
+                                                     0, /* U+016b60: */
+                                                     0, /* U+016b61: */
+                                                     0, /* U+016b62: */
+                                                     0, /* U+016b63: */
+                                                     0, /* U+016b64: */
+                                                     0, /* U+016b65: */
+                                                     0, /* U+016b66: */
+                                                     0, /* U+016b67: */
+                                                     0, /* U+016b68: */
+                                                     0, /* U+016b69: */
+                                                     0, /* U+016b6a: */
+                                                     0, /* U+016b6b: */
+                                                     0, /* U+016b6c: */
+                                                     0, /* U+016b6d: */
+                                                     0, /* U+016b6e: */
+                                                     0, /* U+016b6f: */
+                                                     0, /* U+016b70: */
+                                                     0, /* U+016b71: */
+                                                     0, /* U+016b72: */
+                                                     0, /* U+016b73: */
+                                                     0, /* U+016b74: */
+                                                     0, /* U+016b75: */
+                                                     0, /* U+016b76: */
+                                                     0, /* U+016b77: */
+                                                     0, /* U+016b78: */
+                                                     0, /* U+016b79: */
+                                                     0, /* U+016b7a: */
+                                                     0, /* U+016b7b: */
+                                                     0, /* U+016b7c: */
+                                                     0, /* U+016b7d: */
+                                                     0, /* U+016b7e: */
+                                                     0, /* U+016b7f: */
+                                                     0, /* U+016b80: */
+                                                     0, /* U+016b81: */
+                                                     0, /* U+016b82: */
+                                                     0, /* U+016b83: */
+                                                     0, /* U+016b84: */
+                                                     0, /* U+016b85: */
+                                                     0, /* U+016b86: */
+                                                     0, /* U+016b87: */
+                                                     0, /* U+016b88: */
+                                                     0, /* U+016b89: */
+                                                     0, /* U+016b8a: */
+                                                     0, /* U+016b8b: */
+                                                     0, /* U+016b8c: */
+                                                     0, /* U+016b8d: */
+                                                     0, /* U+016b8e: */
+                                                     0, /* U+016b8f: */
+                                                     0, /* U+016b90: */
+                                                     0, /* U+016b91: */
+                                                     0, /* U+016b92: */
+                                                     0, /* U+016b93: */
+                                                     0, /* U+016b94: */
+                                                     0, /* U+016b95: */
+                                                     0, /* U+016b96: */
+                                                     0, /* U+016b97: */
+                                                     0, /* U+016b98: */
+                                                     0, /* U+016b99: */
+                                                     0, /* U+016b9a: */
+                                                     0, /* U+016b9b: */
+                                                     0, /* U+016b9c: */
+                                                     0, /* U+016b9d: */
+                                                     0, /* U+016b9e: */
+                                                     0, /* U+016b9f: */
+                                                     0, /* U+016ba0: */
+                                                     0, /* U+016ba1: */
+                                                     0, /* U+016ba2: */
+                                                     0, /* U+016ba3: */
+                                                     0, /* U+016ba4: */
+                                                     0, /* U+016ba5: */
+                                                     0, /* U+016ba6: */
+                                                     0, /* U+016ba7: */
+                                                     0, /* U+016ba8: */
+                                                     0, /* U+016ba9: */
+                                                     0, /* U+016baa: */
+                                                     0, /* U+016bab: */
+                                                     0, /* U+016bac: */
+                                                     0, /* U+016bad: */
+                                                     0, /* U+016bae: */
+                                                     0, /* U+016baf: */
+                                                     0, /* U+016bb0: */
+                                                     0, /* U+016bb1: */
+                                                     0, /* U+016bb2: */
+                                                     0, /* U+016bb3: */
+                                                     0, /* U+016bb4: */
+                                                     0, /* U+016bb5: */
+                                                     0, /* U+016bb6: */
+                                                     0, /* U+016bb7: */
+                                                     0, /* U+016bb8: */
+                                                     0, /* U+016bb9: */
+                                                     0, /* U+016bba: */
+                                                     0, /* U+016bbb: */
+                                                     0, /* U+016bbc: */
+                                                     0, /* U+016bbd: */
+                                                     0, /* U+016bbe: */
+                                                     0, /* U+016bbf: */
+                                                     0, /* U+016bc0: */
+                                                     0, /* U+016bc1: */
+                                                     0, /* U+016bc2: */
+                                                     0, /* U+016bc3: */
+                                                     0, /* U+016bc4: */
+                                                     0, /* U+016bc5: */
+                                                     0, /* U+016bc6: */
+                                                     0, /* U+016bc7: */
+                                                     0, /* U+016bc8: */
+                                                     0, /* U+016bc9: */
+                                                     0, /* U+016bca: */
+                                                     0, /* U+016bcb: */
+                                                     0, /* U+016bcc: */
+                                                     0, /* U+016bcd: */
+                                                     0, /* U+016bce: */
+                                                     0, /* U+016bcf: */
+                                                     0, /* U+016bd0: */
+                                                     0, /* U+016bd1: */
+                                                     0, /* U+016bd2: */
+                                                     0, /* U+016bd3: */
+                                                     0, /* U+016bd4: */
+                                                     0, /* U+016bd5: */
+                                                     0, /* U+016bd6: */
+                                                     0, /* U+016bd7: */
+                                                     0, /* U+016bd8: */
+                                                     0, /* U+016bd9: */
+                                                     0, /* U+016bda: */
+                                                     0, /* U+016bdb: */
+                                                     0, /* U+016bdc: */
+                                                     0, /* U+016bdd: */
+                                                     0, /* U+016bde: */
+                                                     0, /* U+016bdf: */
+                                                     0, /* U+016be0: */
+                                                     0, /* U+016be1: */
+                                                     0, /* U+016be2: */
+                                                     0, /* U+016be3: */
+                                                     0, /* U+016be4: */
+                                                     0, /* U+016be5: */
+                                                     0, /* U+016be6: */
+                                                     0, /* U+016be7: */
+                                                     0, /* U+016be8: */
+                                                     0, /* U+016be9: */
+                                                     0, /* U+016bea: */
+                                                     0, /* U+016beb: */
+                                                     0, /* U+016bec: */
+                                                     0, /* U+016bed: */
+                                                     0, /* U+016bee: */
+                                                     0, /* U+016bef: */
+                                                     0, /* U+016bf0: */
+                                                     0, /* U+016bf1: */
+                                                     0, /* U+016bf2: */
+                                                     0, /* U+016bf3: */
+                                                     0, /* U+016bf4: */
+                                                     0, /* U+016bf5: */
+                                                     0, /* U+016bf6: */
+                                                     0, /* U+016bf7: */
+                                                     0, /* U+016bf8: */
+                                                     0, /* U+016bf9: */
+                                                     0, /* U+016bfa: */
+                                                     0, /* U+016bfb: */
+                                                     0, /* U+016bfc: */
+                                                     0, /* U+016bfd: */
+                                                     0, /* U+016bfe: */
+                                                     0, /* U+016bff: */
+                                                     0, /* U+016c00: */
+                                                     0, /* U+016c01: */
+                                                     0, /* U+016c02: */
+                                                     0, /* U+016c03: */
+                                                     0, /* U+016c04: */
+                                                     0, /* U+016c05: */
+                                                     0, /* U+016c06: */
+                                                     0, /* U+016c07: */
+                                                     0, /* U+016c08: */
+                                                     0, /* U+016c09: */
+                                                     0, /* U+016c0a: */
+                                                     0, /* U+016c0b: */
+                                                     0, /* U+016c0c: */
+                                                     0, /* U+016c0d: */
+                                                     0, /* U+016c0e: */
+                                                     0, /* U+016c0f: */
+                                                     0, /* U+016c10: */
+                                                     0, /* U+016c11: */
+                                                     0, /* U+016c12: */
+                                                     0, /* U+016c13: */
+                                                     0, /* U+016c14: */
+                                                     0, /* U+016c15: */
+                                                     0, /* U+016c16: */
+                                                     0, /* U+016c17: */
+                                                     0, /* U+016c18: */
+                                                     0, /* U+016c19: */
+                                                     0, /* U+016c1a: */
+                                                     0, /* U+016c1b: */
+                                                     0, /* U+016c1c: */
+                                                     0, /* U+016c1d: */
+                                                     0, /* U+016c1e: */
+                                                     0, /* U+016c1f: */
+                                                     0, /* U+016c20: */
+                                                     0, /* U+016c21: */
+                                                     0, /* U+016c22: */
+                                                     0, /* U+016c23: */
+                                                     0, /* U+016c24: */
+                                                     0, /* U+016c25: */
+                                                     0, /* U+016c26: */
+                                                     0, /* U+016c27: */
+                                                     0, /* U+016c28: */
+                                                     0, /* U+016c29: */
+                                                     0, /* U+016c2a: */
+                                                     0, /* U+016c2b: */
+                                                     0, /* U+016c2c: */
+                                                     0, /* U+016c2d: */
+                                                     0, /* U+016c2e: */
+                                                     0, /* U+016c2f: */
+                                                     0, /* U+016c30: */
+                                                     0, /* U+016c31: */
+                                                     0, /* U+016c32: */
+                                                     0, /* U+016c33: */
+                                                     0, /* U+016c34: */
+                                                     0, /* U+016c35: */
+                                                     0, /* U+016c36: */
+                                                     0, /* U+016c37: */
+                                                     0, /* U+016c38: */
+                                                     0, /* U+016c39: */
+                                                     0, /* U+016c3a: */
+                                                     0, /* U+016c3b: */
+                                                     0, /* U+016c3c: */
+                                                     0, /* U+016c3d: */
+                                                     0, /* U+016c3e: */
+                                                     0, /* U+016c3f: */
+                                                     0, /* U+016c40: */
+                                                     0, /* U+016c41: */
+                                                     0, /* U+016c42: */
+                                                     0, /* U+016c43: */
+                                                     0, /* U+016c44: */
+                                                     0, /* U+016c45: */
+                                                     0, /* U+016c46: */
+                                                     0, /* U+016c47: */
+                                                     0, /* U+016c48: */
+                                                     0, /* U+016c49: */
+                                                     0, /* U+016c4a: */
+                                                     0, /* U+016c4b: */
+                                                     0, /* U+016c4c: */
+                                                     0, /* U+016c4d: */
+                                                     0, /* U+016c4e: */
+                                                     0, /* U+016c4f: */
+                                                     0, /* U+016c50: */
+                                                     0, /* U+016c51: */
+                                                     0, /* U+016c52: */
+                                                     0, /* U+016c53: */
+                                                     0, /* U+016c54: */
+                                                     0, /* U+016c55: */
+                                                     0, /* U+016c56: */
+                                                     0, /* U+016c57: */
+                                                     0, /* U+016c58: */
+                                                     0, /* U+016c59: */
+                                                     0, /* U+016c5a: */
+                                                     0, /* U+016c5b: */
+                                                     0, /* U+016c5c: */
+                                                     0, /* U+016c5d: */
+                                                     0, /* U+016c5e: */
+                                                     0, /* U+016c5f: */
+                                                     0, /* U+016c60: */
+                                                     0, /* U+016c61: */
+                                                     0, /* U+016c62: */
+                                                     0, /* U+016c63: */
+                                                     0, /* U+016c64: */
+                                                     0, /* U+016c65: */
+                                                     0, /* U+016c66: */
+                                                     0, /* U+016c67: */
+                                                     0, /* U+016c68: */
+                                                     0, /* U+016c69: */
+                                                     0, /* U+016c6a: */
+                                                     0, /* U+016c6b: */
+                                                     0, /* U+016c6c: */
+                                                     0, /* U+016c6d: */
+                                                     0, /* U+016c6e: */
+                                                     0, /* U+016c6f: */
+                                                     0, /* U+016c70: */
+                                                     0, /* U+016c71: */
+                                                     0, /* U+016c72: */
+                                                     0, /* U+016c73: */
+                                                     0, /* U+016c74: */
+                                                     0, /* U+016c75: */
+                                                     0, /* U+016c76: */
+                                                     0, /* U+016c77: */
+                                                     0, /* U+016c78: */
+                                                     0, /* U+016c79: */
+                                                     0, /* U+016c7a: */
+                                                     0, /* U+016c7b: */
+                                                     0, /* U+016c7c: */
+                                                     0, /* U+016c7d: */
+                                                     0, /* U+016c7e: */
+                                                     0, /* U+016c7f: */
+                                                     0, /* U+016c80: */
+                                                     0, /* U+016c81: */
+                                                     0, /* U+016c82: */
+                                                     0, /* U+016c83: */
+                                                     0, /* U+016c84: */
+                                                     0, /* U+016c85: */
+                                                     0, /* U+016c86: */
+                                                     0, /* U+016c87: */
+                                                     0, /* U+016c88: */
+                                                     0, /* U+016c89: */
+                                                     0, /* U+016c8a: */
+                                                     0, /* U+016c8b: */
+                                                     0, /* U+016c8c: */
+                                                     0, /* U+016c8d: */
+                                                     0, /* U+016c8e: */
+                                                     0, /* U+016c8f: */
+                                                     0, /* U+016c90: */
+                                                     0, /* U+016c91: */
+                                                     0, /* U+016c92: */
+                                                     0, /* U+016c93: */
+                                                     0, /* U+016c94: */
+                                                     0, /* U+016c95: */
+                                                     0, /* U+016c96: */
+                                                     0, /* U+016c97: */
+                                                     0, /* U+016c98: */
+                                                     0, /* U+016c99: */
+                                                     0, /* U+016c9a: */
+                                                     0, /* U+016c9b: */
+                                                     0, /* U+016c9c: */
+                                                     0, /* U+016c9d: */
+                                                     0, /* U+016c9e: */
+                                                     0, /* U+016c9f: */
+                                                     0, /* U+016ca0: */
+                                                     0, /* U+016ca1: */
+                                                     0, /* U+016ca2: */
+                                                     0, /* U+016ca3: */
+                                                     0, /* U+016ca4: */
+                                                     0, /* U+016ca5: */
+                                                     0, /* U+016ca6: */
+                                                     0, /* U+016ca7: */
+                                                     0, /* U+016ca8: */
+                                                     0, /* U+016ca9: */
+                                                     0, /* U+016caa: */
+                                                     0, /* U+016cab: */
+                                                     0, /* U+016cac: */
+                                                     0, /* U+016cad: */
+                                                     0, /* U+016cae: */
+                                                     0, /* U+016caf: */
+                                                     0, /* U+016cb0: */
+                                                     0, /* U+016cb1: */
+                                                     0, /* U+016cb2: */
+                                                     0, /* U+016cb3: */
+                                                     0, /* U+016cb4: */
+                                                     0, /* U+016cb5: */
+                                                     0, /* U+016cb6: */
+                                                     0, /* U+016cb7: */
+                                                     0, /* U+016cb8: */
+                                                     0, /* U+016cb9: */
+                                                     0, /* U+016cba: */
+                                                     0, /* U+016cbb: */
+                                                     0, /* U+016cbc: */
+                                                     0, /* U+016cbd: */
+                                                     0, /* U+016cbe: */
+                                                     0, /* U+016cbf: */
+                                                     0, /* U+016cc0: */
+                                                     0, /* U+016cc1: */
+                                                     0, /* U+016cc2: */
+                                                     0, /* U+016cc3: */
+                                                     0, /* U+016cc4: */
+                                                     0, /* U+016cc5: */
+                                                     0, /* U+016cc6: */
+                                                     0, /* U+016cc7: */
+                                                     0, /* U+016cc8: */
+                                                     0, /* U+016cc9: */
+                                                     0, /* U+016cca: */
+                                                     0, /* U+016ccb: */
+                                                     0, /* U+016ccc: */
+                                                     0, /* U+016ccd: */
+                                                     0, /* U+016cce: */
+                                                     0, /* U+016ccf: */
+                                                     0, /* U+016cd0: */
+                                                     0, /* U+016cd1: */
+                                                     0, /* U+016cd2: */
+                                                     0, /* U+016cd3: */
+                                                     0, /* U+016cd4: */
+                                                     0, /* U+016cd5: */
+                                                     0, /* U+016cd6: */
+                                                     0, /* U+016cd7: */
+                                                     0, /* U+016cd8: */
+                                                     0, /* U+016cd9: */
+                                                     0, /* U+016cda: */
+                                                     0, /* U+016cdb: */
+                                                     0, /* U+016cdc: */
+                                                     0, /* U+016cdd: */
+                                                     0, /* U+016cde: */
+                                                     0, /* U+016cdf: */
+                                                     0, /* U+016ce0: */
+                                                     0, /* U+016ce1: */
+                                                     0, /* U+016ce2: */
+                                                     0, /* U+016ce3: */
+                                                     0, /* U+016ce4: */
+                                                     0, /* U+016ce5: */
+                                                     0, /* U+016ce6: */
+                                                     0, /* U+016ce7: */
+                                                     0, /* U+016ce8: */
+                                                     0, /* U+016ce9: */
+                                                     0, /* U+016cea: */
+                                                     0, /* U+016ceb: */
+                                                     0, /* U+016cec: */
+                                                     0, /* U+016ced: */
+                                                     0, /* U+016cee: */
+                                                     0, /* U+016cef: */
+                                                     0, /* U+016cf0: */
+                                                     0, /* U+016cf1: */
+                                                     0, /* U+016cf2: */
+                                                     0, /* U+016cf3: */
+                                                     0, /* U+016cf4: */
+                                                     0, /* U+016cf5: */
+                                                     0, /* U+016cf6: */
+                                                     0, /* U+016cf7: */
+                                                     0, /* U+016cf8: */
+                                                     0, /* U+016cf9: */
+                                                     0, /* U+016cfa: */
+                                                     0, /* U+016cfb: */
+                                                     0, /* U+016cfc: */
+                                                     0, /* U+016cfd: */
+                                                     0, /* U+016cfe: */
+                                                     0, /* U+016cff: */
+                                                     0, /* U+016d00: */
+                                                     0, /* U+016d01: */
+                                                     0, /* U+016d02: */
+                                                     0, /* U+016d03: */
+                                                     0, /* U+016d04: */
+                                                     0, /* U+016d05: */
+                                                     0, /* U+016d06: */
+                                                     0, /* U+016d07: */
+                                                     0, /* U+016d08: */
+                                                     0, /* U+016d09: */
+                                                     0, /* U+016d0a: */
+                                                     0, /* U+016d0b: */
+                                                     0, /* U+016d0c: */
+                                                     0, /* U+016d0d: */
+                                                     0, /* U+016d0e: */
+                                                     0, /* U+016d0f: */
+                                                     0, /* U+016d10: */
+                                                     0, /* U+016d11: */
+                                                     0, /* U+016d12: */
+                                                     0, /* U+016d13: */
+                                                     0, /* U+016d14: */
+                                                     0, /* U+016d15: */
+                                                     0, /* U+016d16: */
+                                                     0, /* U+016d17: */
+                                                     0, /* U+016d18: */
+                                                     0, /* U+016d19: */
+                                                     0, /* U+016d1a: */
+                                                     0, /* U+016d1b: */
+                                                     0, /* U+016d1c: */
+                                                     0, /* U+016d1d: */
+                                                     0, /* U+016d1e: */
+                                                     0, /* U+016d1f: */
+                                                     0, /* U+016d20: */
+                                                     0, /* U+016d21: */
+                                                     0, /* U+016d22: */
+                                                     0, /* U+016d23: */
+                                                     0, /* U+016d24: */
+                                                     0, /* U+016d25: */
+                                                     0, /* U+016d26: */
+                                                     0, /* U+016d27: */
+                                                     0, /* U+016d28: */
+                                                     0, /* U+016d29: */
+                                                     0, /* U+016d2a: */
+                                                     0, /* U+016d2b: */
+                                                     0, /* U+016d2c: */
+                                                     0, /* U+016d2d: */
+                                                     0, /* U+016d2e: */
+                                                     0, /* U+016d2f: */
+                                                     0, /* U+016d30: */
+                                                     0, /* U+016d31: */
+                                                     0, /* U+016d32: */
+                                                     0, /* U+016d33: */
+                                                     0, /* U+016d34: */
+                                                     0, /* U+016d35: */
+                                                     0, /* U+016d36: */
+                                                     0, /* U+016d37: */
+                                                     0, /* U+016d38: */
+                                                     0, /* U+016d39: */
+                                                     0, /* U+016d3a: */
+                                                     0, /* U+016d3b: */
+                                                     0, /* U+016d3c: */
+                                                     0, /* U+016d3d: */
+                                                     0, /* U+016d3e: */
+                                                     0, /* U+016d3f: */
+                                                     0, /* U+016d40: */
+                                                     0, /* U+016d41: */
+                                                     0, /* U+016d42: */
+                                                     0, /* U+016d43: */
+                                                     0, /* U+016d44: */
+                                                     0, /* U+016d45: */
+                                                     0, /* U+016d46: */
+                                                     0, /* U+016d47: */
+                                                     0, /* U+016d48: */
+                                                     0, /* U+016d49: */
+                                                     0, /* U+016d4a: */
+                                                     0, /* U+016d4b: */
+                                                     0, /* U+016d4c: */
+                                                     0, /* U+016d4d: */
+                                                     0, /* U+016d4e: */
+                                                     0, /* U+016d4f: */
+                                                     0, /* U+016d50: */
+                                                     0, /* U+016d51: */
+                                                     0, /* U+016d52: */
+                                                     0, /* U+016d53: */
+                                                     0, /* U+016d54: */
+                                                     0, /* U+016d55: */
+                                                     0, /* U+016d56: */
+                                                     0, /* U+016d57: */
+                                                     0, /* U+016d58: */
+                                                     0, /* U+016d59: */
+                                                     0, /* U+016d5a: */
+                                                     0, /* U+016d5b: */
+                                                     0, /* U+016d5c: */
+                                                     0, /* U+016d5d: */
+                                                     0, /* U+016d5e: */
+                                                     0, /* U+016d5f: */
+                                                     0, /* U+016d60: */
+                                                     0, /* U+016d61: */
+                                                     0, /* U+016d62: */
+                                                     0, /* U+016d63: */
+                                                     0, /* U+016d64: */
+                                                     0, /* U+016d65: */
+                                                     0, /* U+016d66: */
+                                                     0, /* U+016d67: */
+                                                     0, /* U+016d68: */
+                                                     0, /* U+016d69: */
+                                                     0, /* U+016d6a: */
+                                                     0, /* U+016d6b: */
+                                                     0, /* U+016d6c: */
+                                                     0, /* U+016d6d: */
+                                                     0, /* U+016d6e: */
+                                                     0, /* U+016d6f: */
+                                                     0, /* U+016d70: */
+                                                     0, /* U+016d71: */
+                                                     0, /* U+016d72: */
+                                                     0, /* U+016d73: */
+                                                     0, /* U+016d74: */
+                                                     0, /* U+016d75: */
+                                                     0, /* U+016d76: */
+                                                     0, /* U+016d77: */
+                                                     0, /* U+016d78: */
+                                                     0, /* U+016d79: */
+                                                     0, /* U+016d7a: */
+                                                     0, /* U+016d7b: */
+                                                     0, /* U+016d7c: */
+                                                     0, /* U+016d7d: */
+                                                     0, /* U+016d7e: */
+                                                     0, /* U+016d7f: */
+                                                     0, /* U+016d80: */
+                                                     0, /* U+016d81: */
+                                                     0, /* U+016d82: */
+                                                     0, /* U+016d83: */
+                                                     0, /* U+016d84: */
+                                                     0, /* U+016d85: */
+                                                     0, /* U+016d86: */
+                                                     0, /* U+016d87: */
+                                                     0, /* U+016d88: */
+                                                     0, /* U+016d89: */
+                                                     0, /* U+016d8a: */
+                                                     0, /* U+016d8b: */
+                                                     0, /* U+016d8c: */
+                                                     0, /* U+016d8d: */
+                                                     0, /* U+016d8e: */
+                                                     0, /* U+016d8f: */
+                                                     0, /* U+016d90: */
+                                                     0, /* U+016d91: */
+                                                     0, /* U+016d92: */
+                                                     0, /* U+016d93: */
+                                                     0, /* U+016d94: */
+                                                     0, /* U+016d95: */
+                                                     0, /* U+016d96: */
+                                                     0, /* U+016d97: */
+                                                     0, /* U+016d98: */
+                                                     0, /* U+016d99: */
+                                                     0, /* U+016d9a: */
+                                                     0, /* U+016d9b: */
+                                                     0, /* U+016d9c: */
+                                                     0, /* U+016d9d: */
+                                                     0, /* U+016d9e: */
+                                                     0, /* U+016d9f: */
+                                                     0, /* U+016da0: */
+                                                     0, /* U+016da1: */
+                                                     0, /* U+016da2: */
+                                                     0, /* U+016da3: */
+                                                     0, /* U+016da4: */
+                                                     0, /* U+016da5: */
+                                                     0, /* U+016da6: */
+                                                     0, /* U+016da7: */
+                                                     0, /* U+016da8: */
+                                                     0, /* U+016da9: */
+                                                     0, /* U+016daa: */
+                                                     0, /* U+016dab: */
+                                                     0, /* U+016dac: */
+                                                     0, /* U+016dad: */
+                                                     0, /* U+016dae: */
+                                                     0, /* U+016daf: */
+                                                     0, /* U+016db0: */
+                                                     0, /* U+016db1: */
+                                                     0, /* U+016db2: */
+                                                     0, /* U+016db3: */
+                                                     0, /* U+016db4: */
+                                                     0, /* U+016db5: */
+                                                     0, /* U+016db6: */
+                                                     0, /* U+016db7: */
+                                                     0, /* U+016db8: */
+                                                     0, /* U+016db9: */
+                                                     0, /* U+016dba: */
+                                                     0, /* U+016dbb: */
+                                                     0, /* U+016dbc: */
+                                                     0, /* U+016dbd: */
+                                                     0, /* U+016dbe: */
+                                                     0, /* U+016dbf: */
+                                                     0, /* U+016dc0: */
+                                                     0, /* U+016dc1: */
+                                                     0, /* U+016dc2: */
+                                                     0, /* U+016dc3: */
+                                                     0, /* U+016dc4: */
+                                                     0, /* U+016dc5: */
+                                                     0, /* U+016dc6: */
+                                                     0, /* U+016dc7: */
+                                                     0, /* U+016dc8: */
+                                                     0, /* U+016dc9: */
+                                                     0, /* U+016dca: */
+                                                     0, /* U+016dcb: */
+                                                     0, /* U+016dcc: */
+                                                     0, /* U+016dcd: */
+                                                     0, /* U+016dce: */
+                                                     0, /* U+016dcf: */
+                                                     0, /* U+016dd0: */
+                                                     0, /* U+016dd1: */
+                                                     0, /* U+016dd2: */
+                                                     0, /* U+016dd3: */
+                                                     0, /* U+016dd4: */
+                                                     0, /* U+016dd5: */
+                                                     0, /* U+016dd6: */
+                                                     0, /* U+016dd7: */
+                                                     0, /* U+016dd8: */
+                                                     0, /* U+016dd9: */
+                                                     0, /* U+016dda: */
+                                                     0, /* U+016ddb: */
+                                                     0, /* U+016ddc: */
+                                                     0, /* U+016ddd: */
+                                                     0, /* U+016dde: */
+                                                     0, /* U+016ddf: */
+                                                     0, /* U+016de0: */
+                                                     0, /* U+016de1: */
+                                                     0, /* U+016de2: */
+                                                     0, /* U+016de3: */
+                                                     0, /* U+016de4: */
+                                                     0, /* U+016de5: */
+                                                     0, /* U+016de6: */
+                                                     0, /* U+016de7: */
+                                                     0, /* U+016de8: */
+                                                     0, /* U+016de9: */
+                                                     0, /* U+016dea: */
+                                                     0, /* U+016deb: */
+                                                     0, /* U+016dec: */
+                                                     0, /* U+016ded: */
+                                                     0, /* U+016dee: */
+                                                     0, /* U+016def: */
+                                                     0, /* U+016df0: */
+                                                     0, /* U+016df1: */
+                                                     0, /* U+016df2: */
+                                                     0, /* U+016df3: */
+                                                     0, /* U+016df4: */
+                                                     0, /* U+016df5: */
+                                                     0, /* U+016df6: */
+                                                     0, /* U+016df7: */
+                                                     0, /* U+016df8: */
+                                                     0, /* U+016df9: */
+                                                     0, /* U+016dfa: */
+                                                     0, /* U+016dfb: */
+                                                     0, /* U+016dfc: */
+                                                     0, /* U+016dfd: */
+                                                     0, /* U+016dfe: */
+                                                     0, /* U+016dff: */
+                                                     0, /* U+016e00: */
+                                                     0, /* U+016e01: */
+                                                     0, /* U+016e02: */
+                                                     0, /* U+016e03: */
+                                                     0, /* U+016e04: */
+                                                     0, /* U+016e05: */
+                                                     0, /* U+016e06: */
+                                                     0, /* U+016e07: */
+                                                     0, /* U+016e08: */
+                                                     0, /* U+016e09: */
+                                                     0, /* U+016e0a: */
+                                                     0, /* U+016e0b: */
+                                                     0, /* U+016e0c: */
+                                                     0, /* U+016e0d: */
+                                                     0, /* U+016e0e: */
+                                                     0, /* U+016e0f: */
+                                                     0, /* U+016e10: */
+                                                     0, /* U+016e11: */
+                                                     0, /* U+016e12: */
+                                                     0, /* U+016e13: */
+                                                     0, /* U+016e14: */
+                                                     0, /* U+016e15: */
+                                                     0, /* U+016e16: */
+                                                     0, /* U+016e17: */
+                                                     0, /* U+016e18: */
+                                                     0, /* U+016e19: */
+                                                     0, /* U+016e1a: */
+                                                     0, /* U+016e1b: */
+                                                     0, /* U+016e1c: */
+                                                     0, /* U+016e1d: */
+                                                     0, /* U+016e1e: */
+                                                     0, /* U+016e1f: */
+                                                     0, /* U+016e20: */
+                                                     0, /* U+016e21: */
+                                                     0, /* U+016e22: */
+                                                     0, /* U+016e23: */
+                                                     0, /* U+016e24: */
+                                                     0, /* U+016e25: */
+                                                     0, /* U+016e26: */
+                                                     0, /* U+016e27: */
+                                                     0, /* U+016e28: */
+                                                     0, /* U+016e29: */
+                                                     0, /* U+016e2a: */
+                                                     0, /* U+016e2b: */
+                                                     0, /* U+016e2c: */
+                                                     0, /* U+016e2d: */
+                                                     0, /* U+016e2e: */
+                                                     0, /* U+016e2f: */
+                                                     0, /* U+016e30: */
+                                                     0, /* U+016e31: */
+                                                     0, /* U+016e32: */
+                                                     0, /* U+016e33: */
+                                                     0, /* U+016e34: */
+                                                     0, /* U+016e35: */
+                                                     0, /* U+016e36: */
+                                                     0, /* U+016e37: */
+                                                     0, /* U+016e38: */
+                                                     0, /* U+016e39: */
+                                                     0, /* U+016e3a: */
+                                                     0, /* U+016e3b: */
+                                                     0, /* U+016e3c: */
+                                                     0, /* U+016e3d: */
+                                                     0, /* U+016e3e: */
+                                                     0, /* U+016e3f: */
+                                                     0, /* U+016e40: */
+                                                     0, /* U+016e41: */
+                                                     0, /* U+016e42: */
+                                                     0, /* U+016e43: */
+                                                     0, /* U+016e44: */
+                                                     0, /* U+016e45: */
+                                                     0, /* U+016e46: */
+                                                     0, /* U+016e47: */
+                                                     0, /* U+016e48: */
+                                                     0, /* U+016e49: */
+                                                     0, /* U+016e4a: */
+                                                     0, /* U+016e4b: */
+                                                     0, /* U+016e4c: */
+                                                     0, /* U+016e4d: */
+                                                     0, /* U+016e4e: */
+                                                     0, /* U+016e4f: */
+                                                     0, /* U+016e50: */
+                                                     0, /* U+016e51: */
+                                                     0, /* U+016e52: */
+                                                     0, /* U+016e53: */
+                                                     0, /* U+016e54: */
+                                                     0, /* U+016e55: */
+                                                     0, /* U+016e56: */
+                                                     0, /* U+016e57: */
+                                                     0, /* U+016e58: */
+                                                     0, /* U+016e59: */
+                                                     0, /* U+016e5a: */
+                                                     0, /* U+016e5b: */
+                                                     0, /* U+016e5c: */
+                                                     0, /* U+016e5d: */
+                                                     0, /* U+016e5e: */
+                                                     0, /* U+016e5f: */
+                                                     0, /* U+016e60: */
+                                                     0, /* U+016e61: */
+                                                     0, /* U+016e62: */
+                                                     0, /* U+016e63: */
+                                                     0, /* U+016e64: */
+                                                     0, /* U+016e65: */
+                                                     0, /* U+016e66: */
+                                                     0, /* U+016e67: */
+                                                     0, /* U+016e68: */
+                                                     0, /* U+016e69: */
+                                                     0, /* U+016e6a: */
+                                                     0, /* U+016e6b: */
+                                                     0, /* U+016e6c: */
+                                                     0, /* U+016e6d: */
+                                                     0, /* U+016e6e: */
+                                                     0, /* U+016e6f: */
+                                                     0, /* U+016e70: */
+                                                     0, /* U+016e71: */
+                                                     0, /* U+016e72: */
+                                                     0, /* U+016e73: */
+                                                     0, /* U+016e74: */
+                                                     0, /* U+016e75: */
+                                                     0, /* U+016e76: */
+                                                     0, /* U+016e77: */
+                                                     0, /* U+016e78: */
+                                                     0, /* U+016e79: */
+                                                     0, /* U+016e7a: */
+                                                     0, /* U+016e7b: */
+                                                     0, /* U+016e7c: */
+                                                     0, /* U+016e7d: */
+                                                     0, /* U+016e7e: */
+                                                     0, /* U+016e7f: */
+                                                     0, /* U+016e80: */
+                                                     0, /* U+016e81: */
+                                                     0, /* U+016e82: */
+                                                     0, /* U+016e83: */
+                                                     0, /* U+016e84: */
+                                                     0, /* U+016e85: */
+                                                     0, /* U+016e86: */
+                                                     0, /* U+016e87: */
+                                                     0, /* U+016e88: */
+                                                     0, /* U+016e89: */
+                                                     0, /* U+016e8a: */
+                                                     0, /* U+016e8b: */
+                                                     0, /* U+016e8c: */
+                                                     0, /* U+016e8d: */
+                                                     0, /* U+016e8e: */
+                                                     0, /* U+016e8f: */
+                                                     0, /* U+016e90: */
+                                                     0, /* U+016e91: */
+                                                     0, /* U+016e92: */
+                                                     0, /* U+016e93: */
+                                                     0, /* U+016e94: */
+                                                     0, /* U+016e95: */
+                                                     0, /* U+016e96: */
+                                                     0, /* U+016e97: */
+                                                     0, /* U+016e98: */
+                                                     0, /* U+016e99: */
+                                                     0, /* U+016e9a: */
+                                                     0, /* U+016e9b: */
+                                                     0, /* U+016e9c: */
+                                                     0, /* U+016e9d: */
+                                                     0, /* U+016e9e: */
+                                                     0, /* U+016e9f: */
+                                                     0, /* U+016ea0: */
+                                                     0, /* U+016ea1: */
+                                                     0, /* U+016ea2: */
+                                                     0, /* U+016ea3: */
+                                                     0, /* U+016ea4: */
+                                                     0, /* U+016ea5: */
+                                                     0, /* U+016ea6: */
+                                                     0, /* U+016ea7: */
+                                                     0, /* U+016ea8: */
+                                                     0, /* U+016ea9: */
+                                                     0, /* U+016eaa: */
+                                                     0, /* U+016eab: */
+                                                     0, /* U+016eac: */
+                                                     0, /* U+016ead: */
+                                                     0, /* U+016eae: */
+                                                     0, /* U+016eaf: */
+                                                     0, /* U+016eb0: */
+                                                     0, /* U+016eb1: */
+                                                     0, /* U+016eb2: */
+                                                     0, /* U+016eb3: */
+                                                     0, /* U+016eb4: */
+                                                     0, /* U+016eb5: */
+                                                     0, /* U+016eb6: */
+                                                     0, /* U+016eb7: */
+                                                     0, /* U+016eb8: */
+                                                     0, /* U+016eb9: */
+                                                     0, /* U+016eba: */
+                                                     0, /* U+016ebb: */
+                                                     0, /* U+016ebc: */
+                                                     0, /* U+016ebd: */
+                                                     0, /* U+016ebe: */
+                                                     0, /* U+016ebf: */
+                                                     0, /* U+016ec0: */
+                                                     0, /* U+016ec1: */
+                                                     0, /* U+016ec2: */
+                                                     0, /* U+016ec3: */
+                                                     0, /* U+016ec4: */
+                                                     0, /* U+016ec5: */
+                                                     0, /* U+016ec6: */
+                                                     0, /* U+016ec7: */
+                                                     0, /* U+016ec8: */
+                                                     0, /* U+016ec9: */
+                                                     0, /* U+016eca: */
+                                                     0, /* U+016ecb: */
+                                                     0, /* U+016ecc: */
+                                                     0, /* U+016ecd: */
+                                                     0, /* U+016ece: */
+                                                     0, /* U+016ecf: */
+                                                     0, /* U+016ed0: */
+                                                     0, /* U+016ed1: */
+                                                     0, /* U+016ed2: */
+                                                     0, /* U+016ed3: */
+                                                     0, /* U+016ed4: */
+                                                     0, /* U+016ed5: */
+                                                     0, /* U+016ed6: */
+                                                     0, /* U+016ed7: */
+                                                     0, /* U+016ed8: */
+                                                     0, /* U+016ed9: */
+                                                     0, /* U+016eda: */
+                                                     0, /* U+016edb: */
+                                                     0, /* U+016edc: */
+                                                     0, /* U+016edd: */
+                                                     0, /* U+016ede: */
+                                                     0, /* U+016edf: */
+                                                     0, /* U+016ee0: */
+                                                     0, /* U+016ee1: */
+                                                     0, /* U+016ee2: */
+                                                     0, /* U+016ee3: */
+                                                     0, /* U+016ee4: */
+                                                     0, /* U+016ee5: */
+                                                     0, /* U+016ee6: */
+                                                     0, /* U+016ee7: */
+                                                     0, /* U+016ee8: */
+                                                     0, /* U+016ee9: */
+                                                     0, /* U+016eea: */
+                                                     0, /* U+016eeb: */
+                                                     0, /* U+016eec: */
+                                                     0, /* U+016eed: */
+                                                     0, /* U+016eee: */
+                                                     0, /* U+016eef: */
+                                                     0, /* U+016ef0: */
+                                                     0, /* U+016ef1: */
+                                                     0, /* U+016ef2: */
+                                                     0, /* U+016ef3: */
+                                                     0, /* U+016ef4: */
+                                                     0, /* U+016ef5: */
+                                                     0, /* U+016ef6: */
+                                                     0, /* U+016ef7: */
+                                                     0, /* U+016ef8: */
+                                                     0, /* U+016ef9: */
+                                                     0, /* U+016efa: */
+                                                     0, /* U+016efb: */
+                                                     0, /* U+016efc: */
+                                                     0, /* U+016efd: */
+                                                     0, /* U+016efe: */
+                                                     0, /* U+016eff: */
+                                           RTUNI_ALPHA, /* U+016f00: MIAO LETTER PA*/
+                                           RTUNI_ALPHA, /* U+016f01: MIAO LETTER BA*/
+                                           RTUNI_ALPHA, /* U+016f02: MIAO LETTER YI PA*/
+                                           RTUNI_ALPHA, /* U+016f03: MIAO LETTER PLA*/
+                                           RTUNI_ALPHA, /* U+016f04: MIAO LETTER MA*/
+                                           RTUNI_ALPHA, /* U+016f05: MIAO LETTER MHA*/
+                                           RTUNI_ALPHA, /* U+016f06: MIAO LETTER ARCHAIC MA*/
+                                           RTUNI_ALPHA, /* U+016f07: MIAO LETTER FA*/
+                                           RTUNI_ALPHA, /* U+016f08: MIAO LETTER VA*/
+                                           RTUNI_ALPHA, /* U+016f09: MIAO LETTER VFA*/
+                                           RTUNI_ALPHA, /* U+016f0a: MIAO LETTER TA*/
+                                           RTUNI_ALPHA, /* U+016f0b: MIAO LETTER DA*/
+                                           RTUNI_ALPHA, /* U+016f0c: MIAO LETTER YI TTA*/
+                                           RTUNI_ALPHA, /* U+016f0d: MIAO LETTER YI TA*/
+                                           RTUNI_ALPHA, /* U+016f0e: MIAO LETTER TTA*/
+                                           RTUNI_ALPHA, /* U+016f0f: MIAO LETTER DDA*/
+                                           RTUNI_ALPHA, /* U+016f10: MIAO LETTER NA*/
+                                           RTUNI_ALPHA, /* U+016f11: MIAO LETTER NHA*/
+                                           RTUNI_ALPHA, /* U+016f12: MIAO LETTER YI NNA*/
+                                           RTUNI_ALPHA, /* U+016f13: MIAO LETTER ARCHAIC NA*/
+                                           RTUNI_ALPHA, /* U+016f14: MIAO LETTER NNA*/
+                                           RTUNI_ALPHA, /* U+016f15: MIAO LETTER NNHA*/
+                                           RTUNI_ALPHA, /* U+016f16: MIAO LETTER LA*/
+                                           RTUNI_ALPHA, /* U+016f17: MIAO LETTER LYA*/
+                                           RTUNI_ALPHA, /* U+016f18: MIAO LETTER LHA*/
+                                           RTUNI_ALPHA, /* U+016f19: MIAO LETTER LHYA*/
+                                           RTUNI_ALPHA, /* U+016f1a: MIAO LETTER TLHA*/
+                                           RTUNI_ALPHA, /* U+016f1b: MIAO LETTER DLHA*/
+                                           RTUNI_ALPHA, /* U+016f1c: MIAO LETTER TLHYA*/
+                                           RTUNI_ALPHA, /* U+016f1d: MIAO LETTER DLHYA*/
+                                           RTUNI_ALPHA, /* U+016f1e: MIAO LETTER KA*/
+                                           RTUNI_ALPHA, /* U+016f1f: MIAO LETTER GA*/
+                                           RTUNI_ALPHA, /* U+016f20: MIAO LETTER YI KA*/
+                                           RTUNI_ALPHA, /* U+016f21: MIAO LETTER QA*/
+                                           RTUNI_ALPHA, /* U+016f22: MIAO LETTER QGA*/
+                                           RTUNI_ALPHA, /* U+016f23: MIAO LETTER NGA*/
+                                           RTUNI_ALPHA, /* U+016f24: MIAO LETTER NGHA*/
+                                           RTUNI_ALPHA, /* U+016f25: MIAO LETTER ARCHAIC NGA*/
+                                           RTUNI_ALPHA, /* U+016f26: MIAO LETTER HA*/
+                                           RTUNI_ALPHA, /* U+016f27: MIAO LETTER XA*/
+                                           RTUNI_ALPHA, /* U+016f28: MIAO LETTER GHA*/
+                                           RTUNI_ALPHA, /* U+016f29: MIAO LETTER GHHA*/
+                                           RTUNI_ALPHA, /* U+016f2a: MIAO LETTER TSSA*/
+                                           RTUNI_ALPHA, /* U+016f2b: MIAO LETTER DZZA*/
+                                           RTUNI_ALPHA, /* U+016f2c: MIAO LETTER NYA*/
+                                           RTUNI_ALPHA, /* U+016f2d: MIAO LETTER NYHA*/
+                                           RTUNI_ALPHA, /* U+016f2e: MIAO LETTER TSHA*/
+                                           RTUNI_ALPHA, /* U+016f2f: MIAO LETTER DZHA*/
+                                           RTUNI_ALPHA, /* U+016f30: MIAO LETTER YI TSHA*/
+                                           RTUNI_ALPHA, /* U+016f31: MIAO LETTER YI DZHA*/
+                                           RTUNI_ALPHA, /* U+016f32: MIAO LETTER REFORMED TSHA*/
+                                           RTUNI_ALPHA, /* U+016f33: MIAO LETTER SHA*/
+                                           RTUNI_ALPHA, /* U+016f34: MIAO LETTER SSA*/
+                                           RTUNI_ALPHA, /* U+016f35: MIAO LETTER ZHA*/
+                                           RTUNI_ALPHA, /* U+016f36: MIAO LETTER ZSHA*/
+                                           RTUNI_ALPHA, /* U+016f37: MIAO LETTER TSA*/
+                                           RTUNI_ALPHA, /* U+016f38: MIAO LETTER DZA*/
+                                           RTUNI_ALPHA, /* U+016f39: MIAO LETTER YI TSA*/
+                                           RTUNI_ALPHA, /* U+016f3a: MIAO LETTER SA*/
+                                           RTUNI_ALPHA, /* U+016f3b: MIAO LETTER ZA*/
+                                           RTUNI_ALPHA, /* U+016f3c: MIAO LETTER ZSA*/
+                                           RTUNI_ALPHA, /* U+016f3d: MIAO LETTER ZZA*/
+                                           RTUNI_ALPHA, /* U+016f3e: MIAO LETTER ZZSA*/
+                                           RTUNI_ALPHA, /* U+016f3f: MIAO LETTER ARCHAIC ZZA*/
+                                           RTUNI_ALPHA, /* U+016f40: MIAO LETTER ZZYA*/
+                                           RTUNI_ALPHA, /* U+016f41: MIAO LETTER ZZSYA*/
+                                           RTUNI_ALPHA, /* U+016f42: MIAO LETTER WA*/
+                                           RTUNI_ALPHA, /* U+016f43: MIAO LETTER AH*/
+                                           RTUNI_ALPHA, /* U+016f44: MIAO LETTER HHA*/
+                                                     0, /* U+016f45: */
+                                                     0, /* U+016f46: */
+                                                     0, /* U+016f47: */
+                                                     0, /* U+016f48: */
+                                                     0, /* U+016f49: */
+                                                     0, /* U+016f4a: */
+                                                     0, /* U+016f4b: */
+                                                     0, /* U+016f4c: */
+                                                     0, /* U+016f4d: */
+                                                     0, /* U+016f4e: */
+                                                     0, /* U+016f4f: */
+                                           RTUNI_ALPHA, /* U+016f50: MIAO LETTER NASALIZATION*/
+                                           RTUNI_ALPHA, /* U+016f51: MIAO SIGN ASPIRATION*/
+                                           RTUNI_ALPHA, /* U+016f52: MIAO SIGN REFORMED VOICING*/
+                                           RTUNI_ALPHA, /* U+016f53: MIAO SIGN REFORMED ASPIRATION*/
+                                           RTUNI_ALPHA, /* U+016f54: MIAO VOWEL SIGN A*/
+                                           RTUNI_ALPHA, /* U+016f55: MIAO VOWEL SIGN AA*/
+                                           RTUNI_ALPHA, /* U+016f56: MIAO VOWEL SIGN AHH*/
+                                           RTUNI_ALPHA, /* U+016f57: MIAO VOWEL SIGN AN*/
+                                           RTUNI_ALPHA, /* U+016f58: MIAO VOWEL SIGN ANG*/
+                                           RTUNI_ALPHA, /* U+016f59: MIAO VOWEL SIGN O*/
+                                           RTUNI_ALPHA, /* U+016f5a: MIAO VOWEL SIGN OO*/
+                                           RTUNI_ALPHA, /* U+016f5b: MIAO VOWEL SIGN WO*/
+                                           RTUNI_ALPHA, /* U+016f5c: MIAO VOWEL SIGN W*/
+                                           RTUNI_ALPHA, /* U+016f5d: MIAO VOWEL SIGN E*/
+                                           RTUNI_ALPHA, /* U+016f5e: MIAO VOWEL SIGN EN*/
+                                           RTUNI_ALPHA, /* U+016f5f: MIAO VOWEL SIGN ENG*/
+                                           RTUNI_ALPHA, /* U+016f60: MIAO VOWEL SIGN OEY*/
+                                           RTUNI_ALPHA, /* U+016f61: MIAO VOWEL SIGN I*/
+                                           RTUNI_ALPHA, /* U+016f62: MIAO VOWEL SIGN IA*/
+                                           RTUNI_ALPHA, /* U+016f63: MIAO VOWEL SIGN IAN*/
+                                           RTUNI_ALPHA, /* U+016f64: MIAO VOWEL SIGN IANG*/
+                                           RTUNI_ALPHA, /* U+016f65: MIAO VOWEL SIGN IO*/
+                                           RTUNI_ALPHA, /* U+016f66: MIAO VOWEL SIGN IE*/
+                                           RTUNI_ALPHA, /* U+016f67: MIAO VOWEL SIGN II*/
+                                           RTUNI_ALPHA, /* U+016f68: MIAO VOWEL SIGN IU*/
+                                           RTUNI_ALPHA, /* U+016f69: MIAO VOWEL SIGN ING*/
+                                           RTUNI_ALPHA, /* U+016f6a: MIAO VOWEL SIGN U*/
+                                           RTUNI_ALPHA, /* U+016f6b: MIAO VOWEL SIGN UA*/
+                                           RTUNI_ALPHA, /* U+016f6c: MIAO VOWEL SIGN UAN*/
+                                           RTUNI_ALPHA, /* U+016f6d: MIAO VOWEL SIGN UANG*/
+                                           RTUNI_ALPHA, /* U+016f6e: MIAO VOWEL SIGN UU*/
+                                           RTUNI_ALPHA, /* U+016f6f: MIAO VOWEL SIGN UEI*/
+                                           RTUNI_ALPHA, /* U+016f70: MIAO VOWEL SIGN UNG*/
+                                           RTUNI_ALPHA, /* U+016f71: MIAO VOWEL SIGN Y*/
+                                           RTUNI_ALPHA, /* U+016f72: MIAO VOWEL SIGN YI*/
+                                           RTUNI_ALPHA, /* U+016f73: MIAO VOWEL SIGN AE*/
+                                           RTUNI_ALPHA, /* U+016f74: MIAO VOWEL SIGN AEE*/
+                                           RTUNI_ALPHA, /* U+016f75: MIAO VOWEL SIGN ERR*/
+                                           RTUNI_ALPHA, /* U+016f76: MIAO VOWEL SIGN ROUNDED ERR*/
+                                           RTUNI_ALPHA, /* U+016f77: MIAO VOWEL SIGN ER*/
+                                           RTUNI_ALPHA, /* U+016f78: MIAO VOWEL SIGN ROUNDED ER*/
+                                           RTUNI_ALPHA, /* U+016f79: MIAO VOWEL SIGN AI*/
+                                           RTUNI_ALPHA, /* U+016f7a: MIAO VOWEL SIGN EI*/
+                                           RTUNI_ALPHA, /* U+016f7b: MIAO VOWEL SIGN AU*/
+                                           RTUNI_ALPHA, /* U+016f7c: MIAO VOWEL SIGN OU*/
+                                           RTUNI_ALPHA, /* U+016f7d: MIAO VOWEL SIGN N*/
+                                           RTUNI_ALPHA, /* U+016f7e: MIAO VOWEL SIGN NG*/
+                                                     0, /* U+016f7f: */
+                                                     0, /* U+016f80: */
+                                                     0, /* U+016f81: */
+                                                     0, /* U+016f82: */
+                                                     0, /* U+016f83: */
+                                                     0, /* U+016f84: */
+                                                     0, /* U+016f85: */
+                                                     0, /* U+016f86: */
+                                                     0, /* U+016f87: */
+                                                     0, /* U+016f88: */
+                                                     0, /* U+016f89: */
+                                                     0, /* U+016f8a: */
+                                                     0, /* U+016f8b: */
+                                                     0, /* U+016f8c: */
+                                                     0, /* U+016f8d: */
+                                                     0, /* U+016f8e: */
+                                                     0, /* U+016f8f: MIAO TONE RIGHT*/
+                                                     0, /* U+016f90: MIAO TONE TOP RIGHT*/
+                                                     0, /* U+016f91: MIAO TONE ABOVE*/
+                                                     0, /* U+016f92: MIAO TONE BELOW*/
+                                           RTUNI_ALPHA, /* U+016f93: MIAO LETTER TONE-2*/
+                                           RTUNI_ALPHA, /* U+016f94: MIAO LETTER TONE-3*/
+                                           RTUNI_ALPHA, /* U+016f95: MIAO LETTER TONE-4*/
+                                           RTUNI_ALPHA, /* U+016f96: MIAO LETTER TONE-5*/
+                                           RTUNI_ALPHA, /* U+016f97: MIAO LETTER TONE-6*/
+                                           RTUNI_ALPHA, /* U+016f98: MIAO LETTER TONE-7*/
+                                           RTUNI_ALPHA, /* U+016f99: MIAO LETTER TONE-8*/
+                                           RTUNI_ALPHA, /* U+016f9a: MIAO LETTER REFORMED TONE-1*/
+                                           RTUNI_ALPHA, /* U+016f9b: MIAO LETTER REFORMED TONE-2*/
+                                           RTUNI_ALPHA, /* U+016f9c: MIAO LETTER REFORMED TONE-4*/
+                                           RTUNI_ALPHA, /* U+016f9d: MIAO LETTER REFORMED TONE-5*/
+                                           RTUNI_ALPHA, /* U+016f9e: MIAO LETTER REFORMED TONE-6*/
+                                           RTUNI_ALPHA, /* U+016f9f: MIAO LETTER REFORMED TONE-8*/
+};
+
+static const uint8_t g_afRTUniFlags0x01b000[] =
+{
+                                           RTUNI_ALPHA, /* U+01b000: KATAKANA LETTER ARCHAIC E*/
+                                           RTUNI_ALPHA, /* U+01b001: HIRAGANA LETTER ARCHAIC YE*/
+};
+
+static const uint8_t g_afRTUniFlags0x01d400[] =
+{
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d400: MATHEMATICAL BOLD CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d401: MATHEMATICAL BOLD CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d402: MATHEMATICAL BOLD CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d403: MATHEMATICAL BOLD CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d404: MATHEMATICAL BOLD CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d405: MATHEMATICAL BOLD CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d406: MATHEMATICAL BOLD CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d407: MATHEMATICAL BOLD CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d408: MATHEMATICAL BOLD CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d409: MATHEMATICAL BOLD CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40a: MATHEMATICAL BOLD CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40b: MATHEMATICAL BOLD CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40c: MATHEMATICAL BOLD CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40d: MATHEMATICAL BOLD CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40e: MATHEMATICAL BOLD CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40f: MATHEMATICAL BOLD CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d410: MATHEMATICAL BOLD CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d411: MATHEMATICAL BOLD CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d412: MATHEMATICAL BOLD CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d413: MATHEMATICAL BOLD CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d414: MATHEMATICAL BOLD CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d415: MATHEMATICAL BOLD CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d416: MATHEMATICAL BOLD CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d417: MATHEMATICAL BOLD CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d418: MATHEMATICAL BOLD CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d419: MATHEMATICAL BOLD CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41a: MATHEMATICAL BOLD SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41b: MATHEMATICAL BOLD SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41c: MATHEMATICAL BOLD SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41d: MATHEMATICAL BOLD SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41e: MATHEMATICAL BOLD SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41f: MATHEMATICAL BOLD SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d420: MATHEMATICAL BOLD SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d421: MATHEMATICAL BOLD SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d422: MATHEMATICAL BOLD SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d423: MATHEMATICAL BOLD SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d424: MATHEMATICAL BOLD SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d425: MATHEMATICAL BOLD SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d426: MATHEMATICAL BOLD SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d427: MATHEMATICAL BOLD SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d428: MATHEMATICAL BOLD SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d429: MATHEMATICAL BOLD SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42a: MATHEMATICAL BOLD SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42b: MATHEMATICAL BOLD SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42c: MATHEMATICAL BOLD SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42d: MATHEMATICAL BOLD SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42e: MATHEMATICAL BOLD SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42f: MATHEMATICAL BOLD SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d430: MATHEMATICAL BOLD SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d431: MATHEMATICAL BOLD SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d432: MATHEMATICAL BOLD SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d433: MATHEMATICAL BOLD SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d434: MATHEMATICAL ITALIC CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d435: MATHEMATICAL ITALIC CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d436: MATHEMATICAL ITALIC CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d437: MATHEMATICAL ITALIC CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d438: MATHEMATICAL ITALIC CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d439: MATHEMATICAL ITALIC CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43a: MATHEMATICAL ITALIC CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43b: MATHEMATICAL ITALIC CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43c: MATHEMATICAL ITALIC CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43d: MATHEMATICAL ITALIC CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43e: MATHEMATICAL ITALIC CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43f: MATHEMATICAL ITALIC CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d440: MATHEMATICAL ITALIC CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d441: MATHEMATICAL ITALIC CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d442: MATHEMATICAL ITALIC CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d443: MATHEMATICAL ITALIC CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d444: MATHEMATICAL ITALIC CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d445: MATHEMATICAL ITALIC CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d446: MATHEMATICAL ITALIC CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d447: MATHEMATICAL ITALIC CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d448: MATHEMATICAL ITALIC CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d449: MATHEMATICAL ITALIC CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44a: MATHEMATICAL ITALIC CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44b: MATHEMATICAL ITALIC CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44c: MATHEMATICAL ITALIC CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44d: MATHEMATICAL ITALIC CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44e: MATHEMATICAL ITALIC SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44f: MATHEMATICAL ITALIC SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d450: MATHEMATICAL ITALIC SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d451: MATHEMATICAL ITALIC SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d452: MATHEMATICAL ITALIC SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d453: MATHEMATICAL ITALIC SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d454: MATHEMATICAL ITALIC SMALL G*/
+                                                     0, /* U+01d455: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d456: MATHEMATICAL ITALIC SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d457: MATHEMATICAL ITALIC SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d458: MATHEMATICAL ITALIC SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d459: MATHEMATICAL ITALIC SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45a: MATHEMATICAL ITALIC SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45b: MATHEMATICAL ITALIC SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45c: MATHEMATICAL ITALIC SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45d: MATHEMATICAL ITALIC SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45e: MATHEMATICAL ITALIC SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45f: MATHEMATICAL ITALIC SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d460: MATHEMATICAL ITALIC SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d461: MATHEMATICAL ITALIC SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d462: MATHEMATICAL ITALIC SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d463: MATHEMATICAL ITALIC SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d464: MATHEMATICAL ITALIC SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d465: MATHEMATICAL ITALIC SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d466: MATHEMATICAL ITALIC SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d467: MATHEMATICAL ITALIC SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d468: MATHEMATICAL BOLD ITALIC CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d469: MATHEMATICAL BOLD ITALIC CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46a: MATHEMATICAL BOLD ITALIC CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46b: MATHEMATICAL BOLD ITALIC CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46c: MATHEMATICAL BOLD ITALIC CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46d: MATHEMATICAL BOLD ITALIC CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46e: MATHEMATICAL BOLD ITALIC CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46f: MATHEMATICAL BOLD ITALIC CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d470: MATHEMATICAL BOLD ITALIC CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d471: MATHEMATICAL BOLD ITALIC CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d472: MATHEMATICAL BOLD ITALIC CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d473: MATHEMATICAL BOLD ITALIC CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d474: MATHEMATICAL BOLD ITALIC CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d475: MATHEMATICAL BOLD ITALIC CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d476: MATHEMATICAL BOLD ITALIC CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d477: MATHEMATICAL BOLD ITALIC CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d478: MATHEMATICAL BOLD ITALIC CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d479: MATHEMATICAL BOLD ITALIC CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47a: MATHEMATICAL BOLD ITALIC CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47b: MATHEMATICAL BOLD ITALIC CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47c: MATHEMATICAL BOLD ITALIC CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47d: MATHEMATICAL BOLD ITALIC CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47e: MATHEMATICAL BOLD ITALIC CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47f: MATHEMATICAL BOLD ITALIC CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d480: MATHEMATICAL BOLD ITALIC CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d481: MATHEMATICAL BOLD ITALIC CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d482: MATHEMATICAL BOLD ITALIC SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d483: MATHEMATICAL BOLD ITALIC SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d484: MATHEMATICAL BOLD ITALIC SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d485: MATHEMATICAL BOLD ITALIC SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d486: MATHEMATICAL BOLD ITALIC SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d487: MATHEMATICAL BOLD ITALIC SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d488: MATHEMATICAL BOLD ITALIC SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d489: MATHEMATICAL BOLD ITALIC SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48a: MATHEMATICAL BOLD ITALIC SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48b: MATHEMATICAL BOLD ITALIC SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48c: MATHEMATICAL BOLD ITALIC SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48d: MATHEMATICAL BOLD ITALIC SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48e: MATHEMATICAL BOLD ITALIC SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48f: MATHEMATICAL BOLD ITALIC SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d490: MATHEMATICAL BOLD ITALIC SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d491: MATHEMATICAL BOLD ITALIC SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d492: MATHEMATICAL BOLD ITALIC SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d493: MATHEMATICAL BOLD ITALIC SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d494: MATHEMATICAL BOLD ITALIC SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d495: MATHEMATICAL BOLD ITALIC SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d496: MATHEMATICAL BOLD ITALIC SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d497: MATHEMATICAL BOLD ITALIC SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d498: MATHEMATICAL BOLD ITALIC SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d499: MATHEMATICAL BOLD ITALIC SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49a: MATHEMATICAL BOLD ITALIC SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49b: MATHEMATICAL BOLD ITALIC SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49c: MATHEMATICAL SCRIPT CAPITAL A*/
+                                                     0, /* U+01d49d: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49e: MATHEMATICAL SCRIPT CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49f: MATHEMATICAL SCRIPT CAPITAL D*/
+                                                     0, /* U+01d4a0: */
+                                                     0, /* U+01d4a1: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a2: MATHEMATICAL SCRIPT CAPITAL G*/
+                                                     0, /* U+01d4a3: */
+                                                     0, /* U+01d4a4: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a5: MATHEMATICAL SCRIPT CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a6: MATHEMATICAL SCRIPT CAPITAL K*/
+                                                     0, /* U+01d4a7: */
+                                                     0, /* U+01d4a8: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a9: MATHEMATICAL SCRIPT CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4aa: MATHEMATICAL SCRIPT CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ab: MATHEMATICAL SCRIPT CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ac: MATHEMATICAL SCRIPT CAPITAL Q*/
+                                                     0, /* U+01d4ad: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ae: MATHEMATICAL SCRIPT CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4af: MATHEMATICAL SCRIPT CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b0: MATHEMATICAL SCRIPT CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b1: MATHEMATICAL SCRIPT CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b2: MATHEMATICAL SCRIPT CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b3: MATHEMATICAL SCRIPT CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b4: MATHEMATICAL SCRIPT CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b5: MATHEMATICAL SCRIPT CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b6: MATHEMATICAL SCRIPT SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b7: MATHEMATICAL SCRIPT SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b8: MATHEMATICAL SCRIPT SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b9: MATHEMATICAL SCRIPT SMALL D*/
+                                                     0, /* U+01d4ba: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bb: MATHEMATICAL SCRIPT SMALL F*/
+                                                     0, /* U+01d4bc: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bd: MATHEMATICAL SCRIPT SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4be: MATHEMATICAL SCRIPT SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bf: MATHEMATICAL SCRIPT SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c0: MATHEMATICAL SCRIPT SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c1: MATHEMATICAL SCRIPT SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c2: MATHEMATICAL SCRIPT SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c3: MATHEMATICAL SCRIPT SMALL N*/
+                                                     0, /* U+01d4c4: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c5: MATHEMATICAL SCRIPT SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c6: MATHEMATICAL SCRIPT SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c7: MATHEMATICAL SCRIPT SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c8: MATHEMATICAL SCRIPT SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c9: MATHEMATICAL SCRIPT SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ca: MATHEMATICAL SCRIPT SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cb: MATHEMATICAL SCRIPT SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cc: MATHEMATICAL SCRIPT SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cd: MATHEMATICAL SCRIPT SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ce: MATHEMATICAL SCRIPT SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cf: MATHEMATICAL SCRIPT SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d0: MATHEMATICAL BOLD SCRIPT CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d1: MATHEMATICAL BOLD SCRIPT CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d2: MATHEMATICAL BOLD SCRIPT CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d3: MATHEMATICAL BOLD SCRIPT CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d4: MATHEMATICAL BOLD SCRIPT CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d5: MATHEMATICAL BOLD SCRIPT CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d6: MATHEMATICAL BOLD SCRIPT CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d7: MATHEMATICAL BOLD SCRIPT CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d8: MATHEMATICAL BOLD SCRIPT CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d9: MATHEMATICAL BOLD SCRIPT CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4da: MATHEMATICAL BOLD SCRIPT CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4db: MATHEMATICAL BOLD SCRIPT CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dc: MATHEMATICAL BOLD SCRIPT CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dd: MATHEMATICAL BOLD SCRIPT CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4de: MATHEMATICAL BOLD SCRIPT CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4df: MATHEMATICAL BOLD SCRIPT CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e0: MATHEMATICAL BOLD SCRIPT CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e1: MATHEMATICAL BOLD SCRIPT CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e2: MATHEMATICAL BOLD SCRIPT CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e3: MATHEMATICAL BOLD SCRIPT CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e4: MATHEMATICAL BOLD SCRIPT CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e5: MATHEMATICAL BOLD SCRIPT CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e6: MATHEMATICAL BOLD SCRIPT CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e7: MATHEMATICAL BOLD SCRIPT CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e8: MATHEMATICAL BOLD SCRIPT CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e9: MATHEMATICAL BOLD SCRIPT CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ea: MATHEMATICAL BOLD SCRIPT SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4eb: MATHEMATICAL BOLD SCRIPT SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ec: MATHEMATICAL BOLD SCRIPT SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ed: MATHEMATICAL BOLD SCRIPT SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ee: MATHEMATICAL BOLD SCRIPT SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ef: MATHEMATICAL BOLD SCRIPT SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f0: MATHEMATICAL BOLD SCRIPT SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f1: MATHEMATICAL BOLD SCRIPT SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f2: MATHEMATICAL BOLD SCRIPT SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f3: MATHEMATICAL BOLD SCRIPT SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f4: MATHEMATICAL BOLD SCRIPT SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f5: MATHEMATICAL BOLD SCRIPT SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f6: MATHEMATICAL BOLD SCRIPT SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f7: MATHEMATICAL BOLD SCRIPT SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f8: MATHEMATICAL BOLD SCRIPT SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f9: MATHEMATICAL BOLD SCRIPT SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fa: MATHEMATICAL BOLD SCRIPT SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fb: MATHEMATICAL BOLD SCRIPT SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fc: MATHEMATICAL BOLD SCRIPT SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fd: MATHEMATICAL BOLD SCRIPT SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fe: MATHEMATICAL BOLD SCRIPT SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ff: MATHEMATICAL BOLD SCRIPT SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d500: MATHEMATICAL BOLD SCRIPT SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d501: MATHEMATICAL BOLD SCRIPT SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d502: MATHEMATICAL BOLD SCRIPT SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d503: MATHEMATICAL BOLD SCRIPT SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d504: MATHEMATICAL FRAKTUR CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d505: MATHEMATICAL FRAKTUR CAPITAL B*/
+                                                     0, /* U+01d506: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d507: MATHEMATICAL FRAKTUR CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d508: MATHEMATICAL FRAKTUR CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d509: MATHEMATICAL FRAKTUR CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50a: MATHEMATICAL FRAKTUR CAPITAL G*/
+                                                     0, /* U+01d50b: */
+                                                     0, /* U+01d50c: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50d: MATHEMATICAL FRAKTUR CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50e: MATHEMATICAL FRAKTUR CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50f: MATHEMATICAL FRAKTUR CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d510: MATHEMATICAL FRAKTUR CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d511: MATHEMATICAL FRAKTUR CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d512: MATHEMATICAL FRAKTUR CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d513: MATHEMATICAL FRAKTUR CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d514: MATHEMATICAL FRAKTUR CAPITAL Q*/
+                                                     0, /* U+01d515: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d516: MATHEMATICAL FRAKTUR CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d517: MATHEMATICAL FRAKTUR CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d518: MATHEMATICAL FRAKTUR CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d519: MATHEMATICAL FRAKTUR CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51a: MATHEMATICAL FRAKTUR CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51b: MATHEMATICAL FRAKTUR CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51c: MATHEMATICAL FRAKTUR CAPITAL Y*/
+                                                     0, /* U+01d51d: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51e: MATHEMATICAL FRAKTUR SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51f: MATHEMATICAL FRAKTUR SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d520: MATHEMATICAL FRAKTUR SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d521: MATHEMATICAL FRAKTUR SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d522: MATHEMATICAL FRAKTUR SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d523: MATHEMATICAL FRAKTUR SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d524: MATHEMATICAL FRAKTUR SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d525: MATHEMATICAL FRAKTUR SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d526: MATHEMATICAL FRAKTUR SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d527: MATHEMATICAL FRAKTUR SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d528: MATHEMATICAL FRAKTUR SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d529: MATHEMATICAL FRAKTUR SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52a: MATHEMATICAL FRAKTUR SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52b: MATHEMATICAL FRAKTUR SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52c: MATHEMATICAL FRAKTUR SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52d: MATHEMATICAL FRAKTUR SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52e: MATHEMATICAL FRAKTUR SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52f: MATHEMATICAL FRAKTUR SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d530: MATHEMATICAL FRAKTUR SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d531: MATHEMATICAL FRAKTUR SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d532: MATHEMATICAL FRAKTUR SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d533: MATHEMATICAL FRAKTUR SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d534: MATHEMATICAL FRAKTUR SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d535: MATHEMATICAL FRAKTUR SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d536: MATHEMATICAL FRAKTUR SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d537: MATHEMATICAL FRAKTUR SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d538: MATHEMATICAL DOUBLE-STRUCK CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d539: MATHEMATICAL DOUBLE-STRUCK CAPITAL B*/
+                                                     0, /* U+01d53a: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53b: MATHEMATICAL DOUBLE-STRUCK CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53c: MATHEMATICAL DOUBLE-STRUCK CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53d: MATHEMATICAL DOUBLE-STRUCK CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53e: MATHEMATICAL DOUBLE-STRUCK CAPITAL G*/
+                                                     0, /* U+01d53f: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d540: MATHEMATICAL DOUBLE-STRUCK CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d541: MATHEMATICAL DOUBLE-STRUCK CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d542: MATHEMATICAL DOUBLE-STRUCK CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d543: MATHEMATICAL DOUBLE-STRUCK CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d544: MATHEMATICAL DOUBLE-STRUCK CAPITAL M*/
+                                                     0, /* U+01d545: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d546: MATHEMATICAL DOUBLE-STRUCK CAPITAL O*/
+                                                     0, /* U+01d547: */
+                                                     0, /* U+01d548: */
+                                                     0, /* U+01d549: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54a: MATHEMATICAL DOUBLE-STRUCK CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54b: MATHEMATICAL DOUBLE-STRUCK CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54c: MATHEMATICAL DOUBLE-STRUCK CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54d: MATHEMATICAL DOUBLE-STRUCK CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54e: MATHEMATICAL DOUBLE-STRUCK CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54f: MATHEMATICAL DOUBLE-STRUCK CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d550: MATHEMATICAL DOUBLE-STRUCK CAPITAL Y*/
+                                                     0, /* U+01d551: */
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d552: MATHEMATICAL DOUBLE-STRUCK SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d553: MATHEMATICAL DOUBLE-STRUCK SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d554: MATHEMATICAL DOUBLE-STRUCK SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d555: MATHEMATICAL DOUBLE-STRUCK SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d556: MATHEMATICAL DOUBLE-STRUCK SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d557: MATHEMATICAL DOUBLE-STRUCK SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d558: MATHEMATICAL DOUBLE-STRUCK SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d559: MATHEMATICAL DOUBLE-STRUCK SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55a: MATHEMATICAL DOUBLE-STRUCK SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55b: MATHEMATICAL DOUBLE-STRUCK SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55c: MATHEMATICAL DOUBLE-STRUCK SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55d: MATHEMATICAL DOUBLE-STRUCK SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55e: MATHEMATICAL DOUBLE-STRUCK SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55f: MATHEMATICAL DOUBLE-STRUCK SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d560: MATHEMATICAL DOUBLE-STRUCK SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d561: MATHEMATICAL DOUBLE-STRUCK SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d562: MATHEMATICAL DOUBLE-STRUCK SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d563: MATHEMATICAL DOUBLE-STRUCK SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d564: MATHEMATICAL DOUBLE-STRUCK SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d565: MATHEMATICAL DOUBLE-STRUCK SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d566: MATHEMATICAL DOUBLE-STRUCK SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d567: MATHEMATICAL DOUBLE-STRUCK SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d568: MATHEMATICAL DOUBLE-STRUCK SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d569: MATHEMATICAL DOUBLE-STRUCK SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56a: MATHEMATICAL DOUBLE-STRUCK SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56b: MATHEMATICAL DOUBLE-STRUCK SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56c: MATHEMATICAL BOLD FRAKTUR CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56d: MATHEMATICAL BOLD FRAKTUR CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56e: MATHEMATICAL BOLD FRAKTUR CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56f: MATHEMATICAL BOLD FRAKTUR CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d570: MATHEMATICAL BOLD FRAKTUR CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d571: MATHEMATICAL BOLD FRAKTUR CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d572: MATHEMATICAL BOLD FRAKTUR CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d573: MATHEMATICAL BOLD FRAKTUR CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d574: MATHEMATICAL BOLD FRAKTUR CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d575: MATHEMATICAL BOLD FRAKTUR CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d576: MATHEMATICAL BOLD FRAKTUR CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d577: MATHEMATICAL BOLD FRAKTUR CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d578: MATHEMATICAL BOLD FRAKTUR CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d579: MATHEMATICAL BOLD FRAKTUR CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57a: MATHEMATICAL BOLD FRAKTUR CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57b: MATHEMATICAL BOLD FRAKTUR CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57c: MATHEMATICAL BOLD FRAKTUR CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57d: MATHEMATICAL BOLD FRAKTUR CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57e: MATHEMATICAL BOLD FRAKTUR CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57f: MATHEMATICAL BOLD FRAKTUR CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d580: MATHEMATICAL BOLD FRAKTUR CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d581: MATHEMATICAL BOLD FRAKTUR CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d582: MATHEMATICAL BOLD FRAKTUR CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d583: MATHEMATICAL BOLD FRAKTUR CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d584: MATHEMATICAL BOLD FRAKTUR CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d585: MATHEMATICAL BOLD FRAKTUR CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d586: MATHEMATICAL BOLD FRAKTUR SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d587: MATHEMATICAL BOLD FRAKTUR SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d588: MATHEMATICAL BOLD FRAKTUR SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d589: MATHEMATICAL BOLD FRAKTUR SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58a: MATHEMATICAL BOLD FRAKTUR SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58b: MATHEMATICAL BOLD FRAKTUR SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58c: MATHEMATICAL BOLD FRAKTUR SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58d: MATHEMATICAL BOLD FRAKTUR SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58e: MATHEMATICAL BOLD FRAKTUR SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58f: MATHEMATICAL BOLD FRAKTUR SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d590: MATHEMATICAL BOLD FRAKTUR SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d591: MATHEMATICAL BOLD FRAKTUR SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d592: MATHEMATICAL BOLD FRAKTUR SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d593: MATHEMATICAL BOLD FRAKTUR SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d594: MATHEMATICAL BOLD FRAKTUR SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d595: MATHEMATICAL BOLD FRAKTUR SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d596: MATHEMATICAL BOLD FRAKTUR SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d597: MATHEMATICAL BOLD FRAKTUR SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d598: MATHEMATICAL BOLD FRAKTUR SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d599: MATHEMATICAL BOLD FRAKTUR SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59a: MATHEMATICAL BOLD FRAKTUR SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59b: MATHEMATICAL BOLD FRAKTUR SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59c: MATHEMATICAL BOLD FRAKTUR SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59d: MATHEMATICAL BOLD FRAKTUR SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59e: MATHEMATICAL BOLD FRAKTUR SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59f: MATHEMATICAL BOLD FRAKTUR SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a0: MATHEMATICAL SANS-SERIF CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a1: MATHEMATICAL SANS-SERIF CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a2: MATHEMATICAL SANS-SERIF CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a3: MATHEMATICAL SANS-SERIF CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a4: MATHEMATICAL SANS-SERIF CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a5: MATHEMATICAL SANS-SERIF CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a6: MATHEMATICAL SANS-SERIF CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a7: MATHEMATICAL SANS-SERIF CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a8: MATHEMATICAL SANS-SERIF CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a9: MATHEMATICAL SANS-SERIF CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5aa: MATHEMATICAL SANS-SERIF CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ab: MATHEMATICAL SANS-SERIF CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ac: MATHEMATICAL SANS-SERIF CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ad: MATHEMATICAL SANS-SERIF CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ae: MATHEMATICAL SANS-SERIF CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5af: MATHEMATICAL SANS-SERIF CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b0: MATHEMATICAL SANS-SERIF CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b1: MATHEMATICAL SANS-SERIF CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b2: MATHEMATICAL SANS-SERIF CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b3: MATHEMATICAL SANS-SERIF CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b4: MATHEMATICAL SANS-SERIF CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b5: MATHEMATICAL SANS-SERIF CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b6: MATHEMATICAL SANS-SERIF CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b7: MATHEMATICAL SANS-SERIF CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b8: MATHEMATICAL SANS-SERIF CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b9: MATHEMATICAL SANS-SERIF CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ba: MATHEMATICAL SANS-SERIF SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bb: MATHEMATICAL SANS-SERIF SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bc: MATHEMATICAL SANS-SERIF SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bd: MATHEMATICAL SANS-SERIF SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5be: MATHEMATICAL SANS-SERIF SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bf: MATHEMATICAL SANS-SERIF SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c0: MATHEMATICAL SANS-SERIF SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c1: MATHEMATICAL SANS-SERIF SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c2: MATHEMATICAL SANS-SERIF SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c3: MATHEMATICAL SANS-SERIF SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c4: MATHEMATICAL SANS-SERIF SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c5: MATHEMATICAL SANS-SERIF SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c6: MATHEMATICAL SANS-SERIF SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c7: MATHEMATICAL SANS-SERIF SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c8: MATHEMATICAL SANS-SERIF SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c9: MATHEMATICAL SANS-SERIF SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ca: MATHEMATICAL SANS-SERIF SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cb: MATHEMATICAL SANS-SERIF SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cc: MATHEMATICAL SANS-SERIF SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cd: MATHEMATICAL SANS-SERIF SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ce: MATHEMATICAL SANS-SERIF SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cf: MATHEMATICAL SANS-SERIF SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d0: MATHEMATICAL SANS-SERIF SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d1: MATHEMATICAL SANS-SERIF SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d2: MATHEMATICAL SANS-SERIF SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d3: MATHEMATICAL SANS-SERIF SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d4: MATHEMATICAL SANS-SERIF BOLD CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d5: MATHEMATICAL SANS-SERIF BOLD CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d6: MATHEMATICAL SANS-SERIF BOLD CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d7: MATHEMATICAL SANS-SERIF BOLD CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d8: MATHEMATICAL SANS-SERIF BOLD CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d9: MATHEMATICAL SANS-SERIF BOLD CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5da: MATHEMATICAL SANS-SERIF BOLD CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5db: MATHEMATICAL SANS-SERIF BOLD CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dc: MATHEMATICAL SANS-SERIF BOLD CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dd: MATHEMATICAL SANS-SERIF BOLD CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5de: MATHEMATICAL SANS-SERIF BOLD CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5df: MATHEMATICAL SANS-SERIF BOLD CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e0: MATHEMATICAL SANS-SERIF BOLD CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e1: MATHEMATICAL SANS-SERIF BOLD CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e2: MATHEMATICAL SANS-SERIF BOLD CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e3: MATHEMATICAL SANS-SERIF BOLD CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e4: MATHEMATICAL SANS-SERIF BOLD CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e5: MATHEMATICAL SANS-SERIF BOLD CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e6: MATHEMATICAL SANS-SERIF BOLD CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e7: MATHEMATICAL SANS-SERIF BOLD CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e8: MATHEMATICAL SANS-SERIF BOLD CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e9: MATHEMATICAL SANS-SERIF BOLD CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ea: MATHEMATICAL SANS-SERIF BOLD CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5eb: MATHEMATICAL SANS-SERIF BOLD CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ec: MATHEMATICAL SANS-SERIF BOLD CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ed: MATHEMATICAL SANS-SERIF BOLD CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ee: MATHEMATICAL SANS-SERIF BOLD SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ef: MATHEMATICAL SANS-SERIF BOLD SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f0: MATHEMATICAL SANS-SERIF BOLD SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f1: MATHEMATICAL SANS-SERIF BOLD SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f2: MATHEMATICAL SANS-SERIF BOLD SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f3: MATHEMATICAL SANS-SERIF BOLD SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f4: MATHEMATICAL SANS-SERIF BOLD SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f5: MATHEMATICAL SANS-SERIF BOLD SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f6: MATHEMATICAL SANS-SERIF BOLD SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f7: MATHEMATICAL SANS-SERIF BOLD SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f8: MATHEMATICAL SANS-SERIF BOLD SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f9: MATHEMATICAL SANS-SERIF BOLD SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fa: MATHEMATICAL SANS-SERIF BOLD SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fb: MATHEMATICAL SANS-SERIF BOLD SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fc: MATHEMATICAL SANS-SERIF BOLD SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fd: MATHEMATICAL SANS-SERIF BOLD SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fe: MATHEMATICAL SANS-SERIF BOLD SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ff: MATHEMATICAL SANS-SERIF BOLD SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d600: MATHEMATICAL SANS-SERIF BOLD SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d601: MATHEMATICAL SANS-SERIF BOLD SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d602: MATHEMATICAL SANS-SERIF BOLD SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d603: MATHEMATICAL SANS-SERIF BOLD SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d604: MATHEMATICAL SANS-SERIF BOLD SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d605: MATHEMATICAL SANS-SERIF BOLD SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d606: MATHEMATICAL SANS-SERIF BOLD SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d607: MATHEMATICAL SANS-SERIF BOLD SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d608: MATHEMATICAL SANS-SERIF ITALIC CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d609: MATHEMATICAL SANS-SERIF ITALIC CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d610: MATHEMATICAL SANS-SERIF ITALIC CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d611: MATHEMATICAL SANS-SERIF ITALIC CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d612: MATHEMATICAL SANS-SERIF ITALIC CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d613: MATHEMATICAL SANS-SERIF ITALIC CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d614: MATHEMATICAL SANS-SERIF ITALIC CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d615: MATHEMATICAL SANS-SERIF ITALIC CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d616: MATHEMATICAL SANS-SERIF ITALIC CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d617: MATHEMATICAL SANS-SERIF ITALIC CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d618: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d619: MATHEMATICAL SANS-SERIF ITALIC CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d620: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d621: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d622: MATHEMATICAL SANS-SERIF ITALIC SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d623: MATHEMATICAL SANS-SERIF ITALIC SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d624: MATHEMATICAL SANS-SERIF ITALIC SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d625: MATHEMATICAL SANS-SERIF ITALIC SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d626: MATHEMATICAL SANS-SERIF ITALIC SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d627: MATHEMATICAL SANS-SERIF ITALIC SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d628: MATHEMATICAL SANS-SERIF ITALIC SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d629: MATHEMATICAL SANS-SERIF ITALIC SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62a: MATHEMATICAL SANS-SERIF ITALIC SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62b: MATHEMATICAL SANS-SERIF ITALIC SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62c: MATHEMATICAL SANS-SERIF ITALIC SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62d: MATHEMATICAL SANS-SERIF ITALIC SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62e: MATHEMATICAL SANS-SERIF ITALIC SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62f: MATHEMATICAL SANS-SERIF ITALIC SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d630: MATHEMATICAL SANS-SERIF ITALIC SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d631: MATHEMATICAL SANS-SERIF ITALIC SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d632: MATHEMATICAL SANS-SERIF ITALIC SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d633: MATHEMATICAL SANS-SERIF ITALIC SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d634: MATHEMATICAL SANS-SERIF ITALIC SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d635: MATHEMATICAL SANS-SERIF ITALIC SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d636: MATHEMATICAL SANS-SERIF ITALIC SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d637: MATHEMATICAL SANS-SERIF ITALIC SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d638: MATHEMATICAL SANS-SERIF ITALIC SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d639: MATHEMATICAL SANS-SERIF ITALIC SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63a: MATHEMATICAL SANS-SERIF ITALIC SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63b: MATHEMATICAL SANS-SERIF ITALIC SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d640: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d641: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d642: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d643: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d644: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d645: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d646: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d647: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d648: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d649: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d650: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d651: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d652: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d653: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d654: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d655: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d656: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d657: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d658: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d659: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d660: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d661: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d662: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d663: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d664: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d665: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d666: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d667: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d668: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d669: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d670: MATHEMATICAL MONOSPACE CAPITAL A*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d671: MATHEMATICAL MONOSPACE CAPITAL B*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d672: MATHEMATICAL MONOSPACE CAPITAL C*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d673: MATHEMATICAL MONOSPACE CAPITAL D*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d674: MATHEMATICAL MONOSPACE CAPITAL E*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d675: MATHEMATICAL MONOSPACE CAPITAL F*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d676: MATHEMATICAL MONOSPACE CAPITAL G*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d677: MATHEMATICAL MONOSPACE CAPITAL H*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d678: MATHEMATICAL MONOSPACE CAPITAL I*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d679: MATHEMATICAL MONOSPACE CAPITAL J*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67a: MATHEMATICAL MONOSPACE CAPITAL K*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67b: MATHEMATICAL MONOSPACE CAPITAL L*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67c: MATHEMATICAL MONOSPACE CAPITAL M*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67d: MATHEMATICAL MONOSPACE CAPITAL N*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67e: MATHEMATICAL MONOSPACE CAPITAL O*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67f: MATHEMATICAL MONOSPACE CAPITAL P*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d680: MATHEMATICAL MONOSPACE CAPITAL Q*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d681: MATHEMATICAL MONOSPACE CAPITAL R*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d682: MATHEMATICAL MONOSPACE CAPITAL S*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d683: MATHEMATICAL MONOSPACE CAPITAL T*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d684: MATHEMATICAL MONOSPACE CAPITAL U*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d685: MATHEMATICAL MONOSPACE CAPITAL V*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d686: MATHEMATICAL MONOSPACE CAPITAL W*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d687: MATHEMATICAL MONOSPACE CAPITAL X*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d688: MATHEMATICAL MONOSPACE CAPITAL Y*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d689: MATHEMATICAL MONOSPACE CAPITAL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68a: MATHEMATICAL MONOSPACE SMALL A*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68b: MATHEMATICAL MONOSPACE SMALL B*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68c: MATHEMATICAL MONOSPACE SMALL C*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68d: MATHEMATICAL MONOSPACE SMALL D*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68e: MATHEMATICAL MONOSPACE SMALL E*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68f: MATHEMATICAL MONOSPACE SMALL F*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d690: MATHEMATICAL MONOSPACE SMALL G*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d691: MATHEMATICAL MONOSPACE SMALL H*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d692: MATHEMATICAL MONOSPACE SMALL I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d693: MATHEMATICAL MONOSPACE SMALL J*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d694: MATHEMATICAL MONOSPACE SMALL K*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d695: MATHEMATICAL MONOSPACE SMALL L*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d696: MATHEMATICAL MONOSPACE SMALL M*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d697: MATHEMATICAL MONOSPACE SMALL N*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d698: MATHEMATICAL MONOSPACE SMALL O*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d699: MATHEMATICAL MONOSPACE SMALL P*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69a: MATHEMATICAL MONOSPACE SMALL Q*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69b: MATHEMATICAL MONOSPACE SMALL R*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69c: MATHEMATICAL MONOSPACE SMALL S*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69d: MATHEMATICAL MONOSPACE SMALL T*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69e: MATHEMATICAL MONOSPACE SMALL U*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69f: MATHEMATICAL MONOSPACE SMALL V*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a0: MATHEMATICAL MONOSPACE SMALL W*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a1: MATHEMATICAL MONOSPACE SMALL X*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a2: MATHEMATICAL MONOSPACE SMALL Y*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a3: MATHEMATICAL MONOSPACE SMALL Z*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a4: MATHEMATICAL ITALIC SMALL DOTLESS I*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a5: MATHEMATICAL ITALIC SMALL DOTLESS J*/
+                                                     0, /* U+01d6a6: */
+                                                     0, /* U+01d6a7: */
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a8: MATHEMATICAL BOLD CAPITAL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a9: MATHEMATICAL BOLD CAPITAL BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6aa: MATHEMATICAL BOLD CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ab: MATHEMATICAL BOLD CAPITAL DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ac: MATHEMATICAL BOLD CAPITAL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ad: MATHEMATICAL BOLD CAPITAL ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ae: MATHEMATICAL BOLD CAPITAL ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6af: MATHEMATICAL BOLD CAPITAL THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b0: MATHEMATICAL BOLD CAPITAL IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b1: MATHEMATICAL BOLD CAPITAL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b2: MATHEMATICAL BOLD CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b3: MATHEMATICAL BOLD CAPITAL MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b4: MATHEMATICAL BOLD CAPITAL NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b5: MATHEMATICAL BOLD CAPITAL XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b6: MATHEMATICAL BOLD CAPITAL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b7: MATHEMATICAL BOLD CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b8: MATHEMATICAL BOLD CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b9: MATHEMATICAL BOLD CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ba: MATHEMATICAL BOLD CAPITAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bb: MATHEMATICAL BOLD CAPITAL TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bc: MATHEMATICAL BOLD CAPITAL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bd: MATHEMATICAL BOLD CAPITAL PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6be: MATHEMATICAL BOLD CAPITAL CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bf: MATHEMATICAL BOLD CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6c0: MATHEMATICAL BOLD CAPITAL OMEGA*/
+                                                     0, /* U+01d6c1: MATHEMATICAL BOLD NABLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c2: MATHEMATICAL BOLD SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c3: MATHEMATICAL BOLD SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c4: MATHEMATICAL BOLD SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c5: MATHEMATICAL BOLD SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c6: MATHEMATICAL BOLD SMALL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c7: MATHEMATICAL BOLD SMALL ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c8: MATHEMATICAL BOLD SMALL ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c9: MATHEMATICAL BOLD SMALL THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ca: MATHEMATICAL BOLD SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cb: MATHEMATICAL BOLD SMALL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cc: MATHEMATICAL BOLD SMALL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cd: MATHEMATICAL BOLD SMALL MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ce: MATHEMATICAL BOLD SMALL NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cf: MATHEMATICAL BOLD SMALL XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d0: MATHEMATICAL BOLD SMALL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d1: MATHEMATICAL BOLD SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d2: MATHEMATICAL BOLD SMALL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d3: MATHEMATICAL BOLD SMALL FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d4: MATHEMATICAL BOLD SMALL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d5: MATHEMATICAL BOLD SMALL TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d6: MATHEMATICAL BOLD SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d7: MATHEMATICAL BOLD SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d8: MATHEMATICAL BOLD SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d9: MATHEMATICAL BOLD SMALL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6da: MATHEMATICAL BOLD SMALL OMEGA*/
+                                                     0, /* U+01d6db: MATHEMATICAL BOLD PARTIAL DIFFERENTIAL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dc: MATHEMATICAL BOLD EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dd: MATHEMATICAL BOLD THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6de: MATHEMATICAL BOLD KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6df: MATHEMATICAL BOLD PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e0: MATHEMATICAL BOLD RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e1: MATHEMATICAL BOLD PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e2: MATHEMATICAL ITALIC CAPITAL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e3: MATHEMATICAL ITALIC CAPITAL BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e4: MATHEMATICAL ITALIC CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e5: MATHEMATICAL ITALIC CAPITAL DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e6: MATHEMATICAL ITALIC CAPITAL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e7: MATHEMATICAL ITALIC CAPITAL ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e8: MATHEMATICAL ITALIC CAPITAL ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e9: MATHEMATICAL ITALIC CAPITAL THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ea: MATHEMATICAL ITALIC CAPITAL IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6eb: MATHEMATICAL ITALIC CAPITAL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ec: MATHEMATICAL ITALIC CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ed: MATHEMATICAL ITALIC CAPITAL MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ee: MATHEMATICAL ITALIC CAPITAL NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ef: MATHEMATICAL ITALIC CAPITAL XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f0: MATHEMATICAL ITALIC CAPITAL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f1: MATHEMATICAL ITALIC CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f2: MATHEMATICAL ITALIC CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f3: MATHEMATICAL ITALIC CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f4: MATHEMATICAL ITALIC CAPITAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f5: MATHEMATICAL ITALIC CAPITAL TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f6: MATHEMATICAL ITALIC CAPITAL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f7: MATHEMATICAL ITALIC CAPITAL PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f8: MATHEMATICAL ITALIC CAPITAL CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f9: MATHEMATICAL ITALIC CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6fa: MATHEMATICAL ITALIC CAPITAL OMEGA*/
+                                                     0, /* U+01d6fb: MATHEMATICAL ITALIC NABLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fc: MATHEMATICAL ITALIC SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fd: MATHEMATICAL ITALIC SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fe: MATHEMATICAL ITALIC SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ff: MATHEMATICAL ITALIC SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d700: MATHEMATICAL ITALIC SMALL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d701: MATHEMATICAL ITALIC SMALL ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d702: MATHEMATICAL ITALIC SMALL ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d703: MATHEMATICAL ITALIC SMALL THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d704: MATHEMATICAL ITALIC SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d705: MATHEMATICAL ITALIC SMALL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d706: MATHEMATICAL ITALIC SMALL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d707: MATHEMATICAL ITALIC SMALL MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d708: MATHEMATICAL ITALIC SMALL NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d709: MATHEMATICAL ITALIC SMALL XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70a: MATHEMATICAL ITALIC SMALL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70b: MATHEMATICAL ITALIC SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70c: MATHEMATICAL ITALIC SMALL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70d: MATHEMATICAL ITALIC SMALL FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70e: MATHEMATICAL ITALIC SMALL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70f: MATHEMATICAL ITALIC SMALL TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d710: MATHEMATICAL ITALIC SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d711: MATHEMATICAL ITALIC SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d712: MATHEMATICAL ITALIC SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d713: MATHEMATICAL ITALIC SMALL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d714: MATHEMATICAL ITALIC SMALL OMEGA*/
+                                                     0, /* U+01d715: MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d716: MATHEMATICAL ITALIC EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d717: MATHEMATICAL ITALIC THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d718: MATHEMATICAL ITALIC KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d719: MATHEMATICAL ITALIC PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71a: MATHEMATICAL ITALIC RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71b: MATHEMATICAL ITALIC PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71c: MATHEMATICAL BOLD ITALIC CAPITAL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71d: MATHEMATICAL BOLD ITALIC CAPITAL BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71e: MATHEMATICAL BOLD ITALIC CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71f: MATHEMATICAL BOLD ITALIC CAPITAL DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d720: MATHEMATICAL BOLD ITALIC CAPITAL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d721: MATHEMATICAL BOLD ITALIC CAPITAL ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d722: MATHEMATICAL BOLD ITALIC CAPITAL ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d723: MATHEMATICAL BOLD ITALIC CAPITAL THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d724: MATHEMATICAL BOLD ITALIC CAPITAL IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d725: MATHEMATICAL BOLD ITALIC CAPITAL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d726: MATHEMATICAL BOLD ITALIC CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d727: MATHEMATICAL BOLD ITALIC CAPITAL MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d728: MATHEMATICAL BOLD ITALIC CAPITAL NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d729: MATHEMATICAL BOLD ITALIC CAPITAL XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72a: MATHEMATICAL BOLD ITALIC CAPITAL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72b: MATHEMATICAL BOLD ITALIC CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72c: MATHEMATICAL BOLD ITALIC CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72d: MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72e: MATHEMATICAL BOLD ITALIC CAPITAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72f: MATHEMATICAL BOLD ITALIC CAPITAL TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d730: MATHEMATICAL BOLD ITALIC CAPITAL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d731: MATHEMATICAL BOLD ITALIC CAPITAL PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d732: MATHEMATICAL BOLD ITALIC CAPITAL CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d733: MATHEMATICAL BOLD ITALIC CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d734: MATHEMATICAL BOLD ITALIC CAPITAL OMEGA*/
+                                                     0, /* U+01d735: MATHEMATICAL BOLD ITALIC NABLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d736: MATHEMATICAL BOLD ITALIC SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d737: MATHEMATICAL BOLD ITALIC SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d738: MATHEMATICAL BOLD ITALIC SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d739: MATHEMATICAL BOLD ITALIC SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73a: MATHEMATICAL BOLD ITALIC SMALL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73b: MATHEMATICAL BOLD ITALIC SMALL ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73c: MATHEMATICAL BOLD ITALIC SMALL ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73d: MATHEMATICAL BOLD ITALIC SMALL THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73e: MATHEMATICAL BOLD ITALIC SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73f: MATHEMATICAL BOLD ITALIC SMALL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d740: MATHEMATICAL BOLD ITALIC SMALL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d741: MATHEMATICAL BOLD ITALIC SMALL MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d742: MATHEMATICAL BOLD ITALIC SMALL NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d743: MATHEMATICAL BOLD ITALIC SMALL XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d744: MATHEMATICAL BOLD ITALIC SMALL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d745: MATHEMATICAL BOLD ITALIC SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d746: MATHEMATICAL BOLD ITALIC SMALL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d747: MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d748: MATHEMATICAL BOLD ITALIC SMALL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d749: MATHEMATICAL BOLD ITALIC SMALL TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74a: MATHEMATICAL BOLD ITALIC SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74b: MATHEMATICAL BOLD ITALIC SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74c: MATHEMATICAL BOLD ITALIC SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74d: MATHEMATICAL BOLD ITALIC SMALL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74e: MATHEMATICAL BOLD ITALIC SMALL OMEGA*/
+                                                     0, /* U+01d74f: MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d750: MATHEMATICAL BOLD ITALIC EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d751: MATHEMATICAL BOLD ITALIC THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d752: MATHEMATICAL BOLD ITALIC KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d753: MATHEMATICAL BOLD ITALIC PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d754: MATHEMATICAL BOLD ITALIC RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d755: MATHEMATICAL BOLD ITALIC PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d756: MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d757: MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d758: MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d759: MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75a: MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75b: MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75c: MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75d: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75e: MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75f: MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d760: MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d761: MATHEMATICAL SANS-SERIF BOLD CAPITAL MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d762: MATHEMATICAL SANS-SERIF BOLD CAPITAL NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d763: MATHEMATICAL SANS-SERIF BOLD CAPITAL XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d764: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d765: MATHEMATICAL SANS-SERIF BOLD CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d766: MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d767: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d768: MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d769: MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76a: MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76b: MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76c: MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76d: MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76e: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA*/
+                                                     0, /* U+01d76f: MATHEMATICAL SANS-SERIF BOLD NABLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d770: MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d771: MATHEMATICAL SANS-SERIF BOLD SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d772: MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d773: MATHEMATICAL SANS-SERIF BOLD SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d774: MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d775: MATHEMATICAL SANS-SERIF BOLD SMALL ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d776: MATHEMATICAL SANS-SERIF BOLD SMALL ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d777: MATHEMATICAL SANS-SERIF BOLD SMALL THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d778: MATHEMATICAL SANS-SERIF BOLD SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d779: MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77a: MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77b: MATHEMATICAL SANS-SERIF BOLD SMALL MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77c: MATHEMATICAL SANS-SERIF BOLD SMALL NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77d: MATHEMATICAL SANS-SERIF BOLD SMALL XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77e: MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77f: MATHEMATICAL SANS-SERIF BOLD SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d780: MATHEMATICAL SANS-SERIF BOLD SMALL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d781: MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d782: MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d783: MATHEMATICAL SANS-SERIF BOLD SMALL TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d784: MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d785: MATHEMATICAL SANS-SERIF BOLD SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d786: MATHEMATICAL SANS-SERIF BOLD SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d787: MATHEMATICAL SANS-SERIF BOLD SMALL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d788: MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA*/
+                                                     0, /* U+01d789: MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78a: MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78b: MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78c: MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78d: MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78e: MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78f: MATHEMATICAL SANS-SERIF BOLD PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d790: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d791: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d792: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d793: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d794: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d795: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d796: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d797: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d798: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d799: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a0: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a1: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a2: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a3: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a4: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a5: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a6: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a7: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a8: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA*/
+                                                     0, /* U+01d7a9: MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7aa: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ab: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ac: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ad: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ae: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7af: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b3: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b4: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b5: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b6: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b7: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b8: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b9: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ba: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bb: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bc: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bd: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7be: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bf: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA*/
+                                                     0, /* U+01d7c3: MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c4: MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c5: MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c6: MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c7: MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c8: MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c9: MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL*/
+                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7ca: MATHEMATICAL BOLD CAPITAL DIGAMMA*/
+                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7cb: MATHEMATICAL BOLD SMALL DIGAMMA*/
+                                                     0, /* U+01d7cc: */
+                                                     0, /* U+01d7cd: */
+                                          RTUNI_DDIGIT, /* U+01d7ce: MATHEMATICAL BOLD DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+01d7cf: MATHEMATICAL BOLD DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+01d7d0: MATHEMATICAL BOLD DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+01d7d1: MATHEMATICAL BOLD DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01d7d2: MATHEMATICAL BOLD DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01d7d3: MATHEMATICAL BOLD DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01d7d4: MATHEMATICAL BOLD DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01d7d5: MATHEMATICAL BOLD DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01d7d6: MATHEMATICAL BOLD DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01d7d7: MATHEMATICAL BOLD DIGIT NINE*/
+                                          RTUNI_DDIGIT, /* U+01d7d8: MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+01d7d9: MATHEMATICAL DOUBLE-STRUCK DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+01d7da: MATHEMATICAL DOUBLE-STRUCK DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+01d7db: MATHEMATICAL DOUBLE-STRUCK DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01d7dc: MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01d7dd: MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01d7de: MATHEMATICAL DOUBLE-STRUCK DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01d7df: MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01d7e0: MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01d7e1: MATHEMATICAL DOUBLE-STRUCK DIGIT NINE*/
+                                          RTUNI_DDIGIT, /* U+01d7e2: MATHEMATICAL SANS-SERIF DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+01d7e3: MATHEMATICAL SANS-SERIF DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+01d7e4: MATHEMATICAL SANS-SERIF DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+01d7e5: MATHEMATICAL SANS-SERIF DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01d7e6: MATHEMATICAL SANS-SERIF DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01d7e7: MATHEMATICAL SANS-SERIF DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01d7e8: MATHEMATICAL SANS-SERIF DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01d7e9: MATHEMATICAL SANS-SERIF DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01d7ea: MATHEMATICAL SANS-SERIF DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01d7eb: MATHEMATICAL SANS-SERIF DIGIT NINE*/
+                                          RTUNI_DDIGIT, /* U+01d7ec: MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+01d7ed: MATHEMATICAL SANS-SERIF BOLD DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+01d7ee: MATHEMATICAL SANS-SERIF BOLD DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+01d7ef: MATHEMATICAL SANS-SERIF BOLD DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01d7f0: MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01d7f1: MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01d7f2: MATHEMATICAL SANS-SERIF BOLD DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01d7f3: MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01d7f4: MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01d7f5: MATHEMATICAL SANS-SERIF BOLD DIGIT NINE*/
+                                          RTUNI_DDIGIT, /* U+01d7f6: MATHEMATICAL MONOSPACE DIGIT ZERO*/
+                                          RTUNI_DDIGIT, /* U+01d7f7: MATHEMATICAL MONOSPACE DIGIT ONE*/
+                                          RTUNI_DDIGIT, /* U+01d7f8: MATHEMATICAL MONOSPACE DIGIT TWO*/
+                                          RTUNI_DDIGIT, /* U+01d7f9: MATHEMATICAL MONOSPACE DIGIT THREE*/
+                                          RTUNI_DDIGIT, /* U+01d7fa: MATHEMATICAL MONOSPACE DIGIT FOUR*/
+                                          RTUNI_DDIGIT, /* U+01d7fb: MATHEMATICAL MONOSPACE DIGIT FIVE*/
+                                          RTUNI_DDIGIT, /* U+01d7fc: MATHEMATICAL MONOSPACE DIGIT SIX*/
+                                          RTUNI_DDIGIT, /* U+01d7fd: MATHEMATICAL MONOSPACE DIGIT SEVEN*/
+                                          RTUNI_DDIGIT, /* U+01d7fe: MATHEMATICAL MONOSPACE DIGIT EIGHT*/
+                                          RTUNI_DDIGIT, /* U+01d7ff: MATHEMATICAL MONOSPACE DIGIT NINE*/
+};
+
+static const uint8_t g_afRTUniFlags0x01ee00[] =
+{
+                                           RTUNI_ALPHA, /* U+01ee00: ARABIC MATHEMATICAL ALEF*/
+                                           RTUNI_ALPHA, /* U+01ee01: ARABIC MATHEMATICAL BEH*/
+                                           RTUNI_ALPHA, /* U+01ee02: ARABIC MATHEMATICAL JEEM*/
+                                           RTUNI_ALPHA, /* U+01ee03: ARABIC MATHEMATICAL DAL*/
+                                                     0, /* U+01ee04: */
+                                           RTUNI_ALPHA, /* U+01ee05: ARABIC MATHEMATICAL WAW*/
+                                           RTUNI_ALPHA, /* U+01ee06: ARABIC MATHEMATICAL ZAIN*/
+                                           RTUNI_ALPHA, /* U+01ee07: ARABIC MATHEMATICAL HAH*/
+                                           RTUNI_ALPHA, /* U+01ee08: ARABIC MATHEMATICAL TAH*/
+                                           RTUNI_ALPHA, /* U+01ee09: ARABIC MATHEMATICAL YEH*/
+                                           RTUNI_ALPHA, /* U+01ee0a: ARABIC MATHEMATICAL KAF*/
+                                           RTUNI_ALPHA, /* U+01ee0b: ARABIC MATHEMATICAL LAM*/
+                                           RTUNI_ALPHA, /* U+01ee0c: ARABIC MATHEMATICAL MEEM*/
+                                           RTUNI_ALPHA, /* U+01ee0d: ARABIC MATHEMATICAL NOON*/
+                                           RTUNI_ALPHA, /* U+01ee0e: ARABIC MATHEMATICAL SEEN*/
+                                           RTUNI_ALPHA, /* U+01ee0f: ARABIC MATHEMATICAL AIN*/
+                                           RTUNI_ALPHA, /* U+01ee10: ARABIC MATHEMATICAL FEH*/
+                                           RTUNI_ALPHA, /* U+01ee11: ARABIC MATHEMATICAL SAD*/
+                                           RTUNI_ALPHA, /* U+01ee12: ARABIC MATHEMATICAL QAF*/
+                                           RTUNI_ALPHA, /* U+01ee13: ARABIC MATHEMATICAL REH*/
+                                           RTUNI_ALPHA, /* U+01ee14: ARABIC MATHEMATICAL SHEEN*/
+                                           RTUNI_ALPHA, /* U+01ee15: ARABIC MATHEMATICAL TEH*/
+                                           RTUNI_ALPHA, /* U+01ee16: ARABIC MATHEMATICAL THEH*/
+                                           RTUNI_ALPHA, /* U+01ee17: ARABIC MATHEMATICAL KHAH*/
+                                           RTUNI_ALPHA, /* U+01ee18: ARABIC MATHEMATICAL THAL*/
+                                           RTUNI_ALPHA, /* U+01ee19: ARABIC MATHEMATICAL DAD*/
+                                           RTUNI_ALPHA, /* U+01ee1a: ARABIC MATHEMATICAL ZAH*/
+                                           RTUNI_ALPHA, /* U+01ee1b: ARABIC MATHEMATICAL GHAIN*/
+                                           RTUNI_ALPHA, /* U+01ee1c: ARABIC MATHEMATICAL DOTLESS BEH*/
+                                           RTUNI_ALPHA, /* U+01ee1d: ARABIC MATHEMATICAL DOTLESS NOON*/
+                                           RTUNI_ALPHA, /* U+01ee1e: ARABIC MATHEMATICAL DOTLESS FEH*/
+                                           RTUNI_ALPHA, /* U+01ee1f: ARABIC MATHEMATICAL DOTLESS QAF*/
+                                                     0, /* U+01ee20: */
+                                           RTUNI_ALPHA, /* U+01ee21: ARABIC MATHEMATICAL INITIAL BEH*/
+                                           RTUNI_ALPHA, /* U+01ee22: ARABIC MATHEMATICAL INITIAL JEEM*/
+                                                     0, /* U+01ee23: */
+                                           RTUNI_ALPHA, /* U+01ee24: ARABIC MATHEMATICAL INITIAL HEH*/
+                                                     0, /* U+01ee25: */
+                                                     0, /* U+01ee26: */
+                                           RTUNI_ALPHA, /* U+01ee27: ARABIC MATHEMATICAL INITIAL HAH*/
+                                                     0, /* U+01ee28: */
+                                           RTUNI_ALPHA, /* U+01ee29: ARABIC MATHEMATICAL INITIAL YEH*/
+                                           RTUNI_ALPHA, /* U+01ee2a: ARABIC MATHEMATICAL INITIAL KAF*/
+                                           RTUNI_ALPHA, /* U+01ee2b: ARABIC MATHEMATICAL INITIAL LAM*/
+                                           RTUNI_ALPHA, /* U+01ee2c: ARABIC MATHEMATICAL INITIAL MEEM*/
+                                           RTUNI_ALPHA, /* U+01ee2d: ARABIC MATHEMATICAL INITIAL NOON*/
+                                           RTUNI_ALPHA, /* U+01ee2e: ARABIC MATHEMATICAL INITIAL SEEN*/
+                                           RTUNI_ALPHA, /* U+01ee2f: ARABIC MATHEMATICAL INITIAL AIN*/
+                                           RTUNI_ALPHA, /* U+01ee30: ARABIC MATHEMATICAL INITIAL FEH*/
+                                           RTUNI_ALPHA, /* U+01ee31: ARABIC MATHEMATICAL INITIAL SAD*/
+                                           RTUNI_ALPHA, /* U+01ee32: ARABIC MATHEMATICAL INITIAL QAF*/
+                                                     0, /* U+01ee33: */
+                                           RTUNI_ALPHA, /* U+01ee34: ARABIC MATHEMATICAL INITIAL SHEEN*/
+                                           RTUNI_ALPHA, /* U+01ee35: ARABIC MATHEMATICAL INITIAL TEH*/
+                                           RTUNI_ALPHA, /* U+01ee36: ARABIC MATHEMATICAL INITIAL THEH*/
+                                           RTUNI_ALPHA, /* U+01ee37: ARABIC MATHEMATICAL INITIAL KHAH*/
+                                                     0, /* U+01ee38: */
+                                           RTUNI_ALPHA, /* U+01ee39: ARABIC MATHEMATICAL INITIAL DAD*/
+                                                     0, /* U+01ee3a: */
+                                           RTUNI_ALPHA, /* U+01ee3b: ARABIC MATHEMATICAL INITIAL GHAIN*/
+                                                     0, /* U+01ee3c: */
+                                                     0, /* U+01ee3d: */
+                                                     0, /* U+01ee3e: */
+                                                     0, /* U+01ee3f: */
+                                                     0, /* U+01ee40: */
+                                                     0, /* U+01ee41: */
+                                           RTUNI_ALPHA, /* U+01ee42: ARABIC MATHEMATICAL TAILED JEEM*/
+                                                     0, /* U+01ee43: */
+                                                     0, /* U+01ee44: */
+                                                     0, /* U+01ee45: */
+                                                     0, /* U+01ee46: */
+                                           RTUNI_ALPHA, /* U+01ee47: ARABIC MATHEMATICAL TAILED HAH*/
+                                                     0, /* U+01ee48: */
+                                           RTUNI_ALPHA, /* U+01ee49: ARABIC MATHEMATICAL TAILED YEH*/
+                                                     0, /* U+01ee4a: */
+                                           RTUNI_ALPHA, /* U+01ee4b: ARABIC MATHEMATICAL TAILED LAM*/
+                                                     0, /* U+01ee4c: */
+                                           RTUNI_ALPHA, /* U+01ee4d: ARABIC MATHEMATICAL TAILED NOON*/
+                                           RTUNI_ALPHA, /* U+01ee4e: ARABIC MATHEMATICAL TAILED SEEN*/
+                                           RTUNI_ALPHA, /* U+01ee4f: ARABIC MATHEMATICAL TAILED AIN*/
+                                                     0, /* U+01ee50: */
+                                           RTUNI_ALPHA, /* U+01ee51: ARABIC MATHEMATICAL TAILED SAD*/
+                                           RTUNI_ALPHA, /* U+01ee52: ARABIC MATHEMATICAL TAILED QAF*/
+                                                     0, /* U+01ee53: */
+                                           RTUNI_ALPHA, /* U+01ee54: ARABIC MATHEMATICAL TAILED SHEEN*/
+                                                     0, /* U+01ee55: */
+                                                     0, /* U+01ee56: */
+                                           RTUNI_ALPHA, /* U+01ee57: ARABIC MATHEMATICAL TAILED KHAH*/
+                                                     0, /* U+01ee58: */
+                                           RTUNI_ALPHA, /* U+01ee59: ARABIC MATHEMATICAL TAILED DAD*/
+                                                     0, /* U+01ee5a: */
+                                           RTUNI_ALPHA, /* U+01ee5b: ARABIC MATHEMATICAL TAILED GHAIN*/
+                                                     0, /* U+01ee5c: */
+                                           RTUNI_ALPHA, /* U+01ee5d: ARABIC MATHEMATICAL TAILED DOTLESS NOON*/
+                                                     0, /* U+01ee5e: */
+                                           RTUNI_ALPHA, /* U+01ee5f: ARABIC MATHEMATICAL TAILED DOTLESS QAF*/
+                                                     0, /* U+01ee60: */
+                                           RTUNI_ALPHA, /* U+01ee61: ARABIC MATHEMATICAL STRETCHED BEH*/
+                                           RTUNI_ALPHA, /* U+01ee62: ARABIC MATHEMATICAL STRETCHED JEEM*/
+                                                     0, /* U+01ee63: */
+                                           RTUNI_ALPHA, /* U+01ee64: ARABIC MATHEMATICAL STRETCHED HEH*/
+                                                     0, /* U+01ee65: */
+                                                     0, /* U+01ee66: */
+                                           RTUNI_ALPHA, /* U+01ee67: ARABIC MATHEMATICAL STRETCHED HAH*/
+                                           RTUNI_ALPHA, /* U+01ee68: ARABIC MATHEMATICAL STRETCHED TAH*/
+                                           RTUNI_ALPHA, /* U+01ee69: ARABIC MATHEMATICAL STRETCHED YEH*/
+                                           RTUNI_ALPHA, /* U+01ee6a: ARABIC MATHEMATICAL STRETCHED KAF*/
+                                                     0, /* U+01ee6b: */
+                                           RTUNI_ALPHA, /* U+01ee6c: ARABIC MATHEMATICAL STRETCHED MEEM*/
+                                           RTUNI_ALPHA, /* U+01ee6d: ARABIC MATHEMATICAL STRETCHED NOON*/
+                                           RTUNI_ALPHA, /* U+01ee6e: ARABIC MATHEMATICAL STRETCHED SEEN*/
+                                           RTUNI_ALPHA, /* U+01ee6f: ARABIC MATHEMATICAL STRETCHED AIN*/
+                                           RTUNI_ALPHA, /* U+01ee70: ARABIC MATHEMATICAL STRETCHED FEH*/
+                                           RTUNI_ALPHA, /* U+01ee71: ARABIC MATHEMATICAL STRETCHED SAD*/
+                                           RTUNI_ALPHA, /* U+01ee72: ARABIC MATHEMATICAL STRETCHED QAF*/
+                                                     0, /* U+01ee73: */
+                                           RTUNI_ALPHA, /* U+01ee74: ARABIC MATHEMATICAL STRETCHED SHEEN*/
+                                           RTUNI_ALPHA, /* U+01ee75: ARABIC MATHEMATICAL STRETCHED TEH*/
+                                           RTUNI_ALPHA, /* U+01ee76: ARABIC MATHEMATICAL STRETCHED THEH*/
+                                           RTUNI_ALPHA, /* U+01ee77: ARABIC MATHEMATICAL STRETCHED KHAH*/
+                                                     0, /* U+01ee78: */
+                                           RTUNI_ALPHA, /* U+01ee79: ARABIC MATHEMATICAL STRETCHED DAD*/
+                                           RTUNI_ALPHA, /* U+01ee7a: ARABIC MATHEMATICAL STRETCHED ZAH*/
+                                           RTUNI_ALPHA, /* U+01ee7b: ARABIC MATHEMATICAL STRETCHED GHAIN*/
+                                           RTUNI_ALPHA, /* U+01ee7c: ARABIC MATHEMATICAL STRETCHED DOTLESS BEH*/
+                                                     0, /* U+01ee7d: */
+                                           RTUNI_ALPHA, /* U+01ee7e: ARABIC MATHEMATICAL STRETCHED DOTLESS FEH*/
+                                                     0, /* U+01ee7f: */
+                                           RTUNI_ALPHA, /* U+01ee80: ARABIC MATHEMATICAL LOOPED ALEF*/
+                                           RTUNI_ALPHA, /* U+01ee81: ARABIC MATHEMATICAL LOOPED BEH*/
+                                           RTUNI_ALPHA, /* U+01ee82: ARABIC MATHEMATICAL LOOPED JEEM*/
+                                           RTUNI_ALPHA, /* U+01ee83: ARABIC MATHEMATICAL LOOPED DAL*/
+                                           RTUNI_ALPHA, /* U+01ee84: ARABIC MATHEMATICAL LOOPED HEH*/
+                                           RTUNI_ALPHA, /* U+01ee85: ARABIC MATHEMATICAL LOOPED WAW*/
+                                           RTUNI_ALPHA, /* U+01ee86: ARABIC MATHEMATICAL LOOPED ZAIN*/
+                                           RTUNI_ALPHA, /* U+01ee87: ARABIC MATHEMATICAL LOOPED HAH*/
+                                           RTUNI_ALPHA, /* U+01ee88: ARABIC MATHEMATICAL LOOPED TAH*/
+                                           RTUNI_ALPHA, /* U+01ee89: ARABIC MATHEMATICAL LOOPED YEH*/
+                                                     0, /* U+01ee8a: */
+                                           RTUNI_ALPHA, /* U+01ee8b: ARABIC MATHEMATICAL LOOPED LAM*/
+                                           RTUNI_ALPHA, /* U+01ee8c: ARABIC MATHEMATICAL LOOPED MEEM*/
+                                           RTUNI_ALPHA, /* U+01ee8d: ARABIC MATHEMATICAL LOOPED NOON*/
+                                           RTUNI_ALPHA, /* U+01ee8e: ARABIC MATHEMATICAL LOOPED SEEN*/
+                                           RTUNI_ALPHA, /* U+01ee8f: ARABIC MATHEMATICAL LOOPED AIN*/
+                                           RTUNI_ALPHA, /* U+01ee90: ARABIC MATHEMATICAL LOOPED FEH*/
+                                           RTUNI_ALPHA, /* U+01ee91: ARABIC MATHEMATICAL LOOPED SAD*/
+                                           RTUNI_ALPHA, /* U+01ee92: ARABIC MATHEMATICAL LOOPED QAF*/
+                                           RTUNI_ALPHA, /* U+01ee93: ARABIC MATHEMATICAL LOOPED REH*/
+                                           RTUNI_ALPHA, /* U+01ee94: ARABIC MATHEMATICAL LOOPED SHEEN*/
+                                           RTUNI_ALPHA, /* U+01ee95: ARABIC MATHEMATICAL LOOPED TEH*/
+                                           RTUNI_ALPHA, /* U+01ee96: ARABIC MATHEMATICAL LOOPED THEH*/
+                                           RTUNI_ALPHA, /* U+01ee97: ARABIC MATHEMATICAL LOOPED KHAH*/
+                                           RTUNI_ALPHA, /* U+01ee98: ARABIC MATHEMATICAL LOOPED THAL*/
+                                           RTUNI_ALPHA, /* U+01ee99: ARABIC MATHEMATICAL LOOPED DAD*/
+                                           RTUNI_ALPHA, /* U+01ee9a: ARABIC MATHEMATICAL LOOPED ZAH*/
+                                           RTUNI_ALPHA, /* U+01ee9b: ARABIC MATHEMATICAL LOOPED GHAIN*/
+                                                     0, /* U+01ee9c: */
+                                                     0, /* U+01ee9d: */
+                                                     0, /* U+01ee9e: */
+                                                     0, /* U+01ee9f: */
+                                                     0, /* U+01eea0: */
+                                           RTUNI_ALPHA, /* U+01eea1: ARABIC MATHEMATICAL DOUBLE-STRUCK BEH*/
+                                           RTUNI_ALPHA, /* U+01eea2: ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM*/
+                                           RTUNI_ALPHA, /* U+01eea3: ARABIC MATHEMATICAL DOUBLE-STRUCK DAL*/
+                                                     0, /* U+01eea4: */
+                                           RTUNI_ALPHA, /* U+01eea5: ARABIC MATHEMATICAL DOUBLE-STRUCK WAW*/
+                                           RTUNI_ALPHA, /* U+01eea6: ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN*/
+                                           RTUNI_ALPHA, /* U+01eea7: ARABIC MATHEMATICAL DOUBLE-STRUCK HAH*/
+                                           RTUNI_ALPHA, /* U+01eea8: ARABIC MATHEMATICAL DOUBLE-STRUCK TAH*/
+                                           RTUNI_ALPHA, /* U+01eea9: ARABIC MATHEMATICAL DOUBLE-STRUCK YEH*/
+                                                     0, /* U+01eeaa: */
+                                           RTUNI_ALPHA, /* U+01eeab: ARABIC MATHEMATICAL DOUBLE-STRUCK LAM*/
+                                           RTUNI_ALPHA, /* U+01eeac: ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM*/
+                                           RTUNI_ALPHA, /* U+01eead: ARABIC MATHEMATICAL DOUBLE-STRUCK NOON*/
+                                           RTUNI_ALPHA, /* U+01eeae: ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN*/
+                                           RTUNI_ALPHA, /* U+01eeaf: ARABIC MATHEMATICAL DOUBLE-STRUCK AIN*/
+                                           RTUNI_ALPHA, /* U+01eeb0: ARABIC MATHEMATICAL DOUBLE-STRUCK FEH*/
+                                           RTUNI_ALPHA, /* U+01eeb1: ARABIC MATHEMATICAL DOUBLE-STRUCK SAD*/
+                                           RTUNI_ALPHA, /* U+01eeb2: ARABIC MATHEMATICAL DOUBLE-STRUCK QAF*/
+                                           RTUNI_ALPHA, /* U+01eeb3: ARABIC MATHEMATICAL DOUBLE-STRUCK REH*/
+                                           RTUNI_ALPHA, /* U+01eeb4: ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN*/
+                                           RTUNI_ALPHA, /* U+01eeb5: ARABIC MATHEMATICAL DOUBLE-STRUCK TEH*/
+                                           RTUNI_ALPHA, /* U+01eeb6: ARABIC MATHEMATICAL DOUBLE-STRUCK THEH*/
+                                           RTUNI_ALPHA, /* U+01eeb7: ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH*/
+                                           RTUNI_ALPHA, /* U+01eeb8: ARABIC MATHEMATICAL DOUBLE-STRUCK THAL*/
+                                           RTUNI_ALPHA, /* U+01eeb9: ARABIC MATHEMATICAL DOUBLE-STRUCK DAD*/
+                                           RTUNI_ALPHA, /* U+01eeba: ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH*/
+                                           RTUNI_ALPHA, /* U+01eebb: ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN*/
+};
+
+static const uint8_t g_afRTUniFlags0x020000[] =
+{
+                                           RTUNI_ALPHA, /* U+020000: <CJK Ideograph Extension B, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02a6d6[] =
+{
+                                           RTUNI_ALPHA, /* U+02a6d6: <CJK Ideograph Extension B, Last>*/
+                                                     0, /* U+02a6d7: */
+                                                     0, /* U+02a6d8: */
+                                                     0, /* U+02a6d9: */
+                                                     0, /* U+02a6da: */
+                                                     0, /* U+02a6db: */
+                                                     0, /* U+02a6dc: */
+                                                     0, /* U+02a6dd: */
+                                                     0, /* U+02a6de: */
+                                                     0, /* U+02a6df: */
+                                                     0, /* U+02a6e0: */
+                                                     0, /* U+02a6e1: */
+                                                     0, /* U+02a6e2: */
+                                                     0, /* U+02a6e3: */
+                                                     0, /* U+02a6e4: */
+                                                     0, /* U+02a6e5: */
+                                                     0, /* U+02a6e6: */
+                                                     0, /* U+02a6e7: */
+                                                     0, /* U+02a6e8: */
+                                                     0, /* U+02a6e9: */
+                                                     0, /* U+02a6ea: */
+                                                     0, /* U+02a6eb: */
+                                                     0, /* U+02a6ec: */
+                                                     0, /* U+02a6ed: */
+                                                     0, /* U+02a6ee: */
+                                                     0, /* U+02a6ef: */
+                                                     0, /* U+02a6f0: */
+                                                     0, /* U+02a6f1: */
+                                                     0, /* U+02a6f2: */
+                                                     0, /* U+02a6f3: */
+                                                     0, /* U+02a6f4: */
+                                                     0, /* U+02a6f5: */
+                                                     0, /* U+02a6f6: */
+                                                     0, /* U+02a6f7: */
+                                                     0, /* U+02a6f8: */
+                                                     0, /* U+02a6f9: */
+                                                     0, /* U+02a6fa: */
+                                                     0, /* U+02a6fb: */
+                                                     0, /* U+02a6fc: */
+                                                     0, /* U+02a6fd: */
+                                                     0, /* U+02a6fe: */
+                                                     0, /* U+02a6ff: */
+                                           RTUNI_ALPHA, /* U+02a700: <CJK Ideograph Extension C, First>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02b734[] =
+{
+                                           RTUNI_ALPHA, /* U+02b734: <CJK Ideograph Extension C, Last>*/
+                                                     0, /* U+02b735: */
+                                                     0, /* U+02b736: */
+                                                     0, /* U+02b737: */
+                                                     0, /* U+02b738: */
+                                                     0, /* U+02b739: */
+                                                     0, /* U+02b73a: */
+                                                     0, /* U+02b73b: */
+                                                     0, /* U+02b73c: */
+                                                     0, /* U+02b73d: */
+                                                     0, /* U+02b73e: */
+                                                     0, /* U+02b73f: */
+                                           RTUNI_ALPHA, /* U+02b740: <CJK Ideograph Extension D, First>*/
+                                           RTUNI_ALPHA, /* U+02b741: */
+                                           RTUNI_ALPHA, /* U+02b742: */
+                                           RTUNI_ALPHA, /* U+02b743: */
+                                           RTUNI_ALPHA, /* U+02b744: */
+                                           RTUNI_ALPHA, /* U+02b745: */
+                                           RTUNI_ALPHA, /* U+02b746: */
+                                           RTUNI_ALPHA, /* U+02b747: */
+                                           RTUNI_ALPHA, /* U+02b748: */
+                                           RTUNI_ALPHA, /* U+02b749: */
+                                           RTUNI_ALPHA, /* U+02b74a: */
+                                           RTUNI_ALPHA, /* U+02b74b: */
+                                           RTUNI_ALPHA, /* U+02b74c: */
+                                           RTUNI_ALPHA, /* U+02b74d: */
+                                           RTUNI_ALPHA, /* U+02b74e: */
+                                           RTUNI_ALPHA, /* U+02b74f: */
+                                           RTUNI_ALPHA, /* U+02b750: */
+                                           RTUNI_ALPHA, /* U+02b751: */
+                                           RTUNI_ALPHA, /* U+02b752: */
+                                           RTUNI_ALPHA, /* U+02b753: */
+                                           RTUNI_ALPHA, /* U+02b754: */
+                                           RTUNI_ALPHA, /* U+02b755: */
+                                           RTUNI_ALPHA, /* U+02b756: */
+                                           RTUNI_ALPHA, /* U+02b757: */
+                                           RTUNI_ALPHA, /* U+02b758: */
+                                           RTUNI_ALPHA, /* U+02b759: */
+                                           RTUNI_ALPHA, /* U+02b75a: */
+                                           RTUNI_ALPHA, /* U+02b75b: */
+                                           RTUNI_ALPHA, /* U+02b75c: */
+                                           RTUNI_ALPHA, /* U+02b75d: */
+                                           RTUNI_ALPHA, /* U+02b75e: */
+                                           RTUNI_ALPHA, /* U+02b75f: */
+                                           RTUNI_ALPHA, /* U+02b760: */
+                                           RTUNI_ALPHA, /* U+02b761: */
+                                           RTUNI_ALPHA, /* U+02b762: */
+                                           RTUNI_ALPHA, /* U+02b763: */
+                                           RTUNI_ALPHA, /* U+02b764: */
+                                           RTUNI_ALPHA, /* U+02b765: */
+                                           RTUNI_ALPHA, /* U+02b766: */
+                                           RTUNI_ALPHA, /* U+02b767: */
+                                           RTUNI_ALPHA, /* U+02b768: */
+                                           RTUNI_ALPHA, /* U+02b769: */
+                                           RTUNI_ALPHA, /* U+02b76a: */
+                                           RTUNI_ALPHA, /* U+02b76b: */
+                                           RTUNI_ALPHA, /* U+02b76c: */
+                                           RTUNI_ALPHA, /* U+02b76d: */
+                                           RTUNI_ALPHA, /* U+02b76e: */
+                                           RTUNI_ALPHA, /* U+02b76f: */
+                                           RTUNI_ALPHA, /* U+02b770: */
+                                           RTUNI_ALPHA, /* U+02b771: */
+                                           RTUNI_ALPHA, /* U+02b772: */
+                                           RTUNI_ALPHA, /* U+02b773: */
+                                           RTUNI_ALPHA, /* U+02b774: */
+                                           RTUNI_ALPHA, /* U+02b775: */
+                                           RTUNI_ALPHA, /* U+02b776: */
+                                           RTUNI_ALPHA, /* U+02b777: */
+                                           RTUNI_ALPHA, /* U+02b778: */
+                                           RTUNI_ALPHA, /* U+02b779: */
+                                           RTUNI_ALPHA, /* U+02b77a: */
+                                           RTUNI_ALPHA, /* U+02b77b: */
+                                           RTUNI_ALPHA, /* U+02b77c: */
+                                           RTUNI_ALPHA, /* U+02b77d: */
+                                           RTUNI_ALPHA, /* U+02b77e: */
+                                           RTUNI_ALPHA, /* U+02b77f: */
+                                           RTUNI_ALPHA, /* U+02b780: */
+                                           RTUNI_ALPHA, /* U+02b781: */
+                                           RTUNI_ALPHA, /* U+02b782: */
+                                           RTUNI_ALPHA, /* U+02b783: */
+                                           RTUNI_ALPHA, /* U+02b784: */
+                                           RTUNI_ALPHA, /* U+02b785: */
+                                           RTUNI_ALPHA, /* U+02b786: */
+                                           RTUNI_ALPHA, /* U+02b787: */
+                                           RTUNI_ALPHA, /* U+02b788: */
+                                           RTUNI_ALPHA, /* U+02b789: */
+                                           RTUNI_ALPHA, /* U+02b78a: */
+                                           RTUNI_ALPHA, /* U+02b78b: */
+                                           RTUNI_ALPHA, /* U+02b78c: */
+                                           RTUNI_ALPHA, /* U+02b78d: */
+                                           RTUNI_ALPHA, /* U+02b78e: */
+                                           RTUNI_ALPHA, /* U+02b78f: */
+                                           RTUNI_ALPHA, /* U+02b790: */
+                                           RTUNI_ALPHA, /* U+02b791: */
+                                           RTUNI_ALPHA, /* U+02b792: */
+                                           RTUNI_ALPHA, /* U+02b793: */
+                                           RTUNI_ALPHA, /* U+02b794: */
+                                           RTUNI_ALPHA, /* U+02b795: */
+                                           RTUNI_ALPHA, /* U+02b796: */
+                                           RTUNI_ALPHA, /* U+02b797: */
+                                           RTUNI_ALPHA, /* U+02b798: */
+                                           RTUNI_ALPHA, /* U+02b799: */
+                                           RTUNI_ALPHA, /* U+02b79a: */
+                                           RTUNI_ALPHA, /* U+02b79b: */
+                                           RTUNI_ALPHA, /* U+02b79c: */
+                                           RTUNI_ALPHA, /* U+02b79d: */
+                                           RTUNI_ALPHA, /* U+02b79e: */
+                                           RTUNI_ALPHA, /* U+02b79f: */
+                                           RTUNI_ALPHA, /* U+02b7a0: */
+                                           RTUNI_ALPHA, /* U+02b7a1: */
+                                           RTUNI_ALPHA, /* U+02b7a2: */
+                                           RTUNI_ALPHA, /* U+02b7a3: */
+                                           RTUNI_ALPHA, /* U+02b7a4: */
+                                           RTUNI_ALPHA, /* U+02b7a5: */
+                                           RTUNI_ALPHA, /* U+02b7a6: */
+                                           RTUNI_ALPHA, /* U+02b7a7: */
+                                           RTUNI_ALPHA, /* U+02b7a8: */
+                                           RTUNI_ALPHA, /* U+02b7a9: */
+                                           RTUNI_ALPHA, /* U+02b7aa: */
+                                           RTUNI_ALPHA, /* U+02b7ab: */
+                                           RTUNI_ALPHA, /* U+02b7ac: */
+                                           RTUNI_ALPHA, /* U+02b7ad: */
+                                           RTUNI_ALPHA, /* U+02b7ae: */
+                                           RTUNI_ALPHA, /* U+02b7af: */
+                                           RTUNI_ALPHA, /* U+02b7b0: */
+                                           RTUNI_ALPHA, /* U+02b7b1: */
+                                           RTUNI_ALPHA, /* U+02b7b2: */
+                                           RTUNI_ALPHA, /* U+02b7b3: */
+                                           RTUNI_ALPHA, /* U+02b7b4: */
+                                           RTUNI_ALPHA, /* U+02b7b5: */
+                                           RTUNI_ALPHA, /* U+02b7b6: */
+                                           RTUNI_ALPHA, /* U+02b7b7: */
+                                           RTUNI_ALPHA, /* U+02b7b8: */
+                                           RTUNI_ALPHA, /* U+02b7b9: */
+                                           RTUNI_ALPHA, /* U+02b7ba: */
+                                           RTUNI_ALPHA, /* U+02b7bb: */
+                                           RTUNI_ALPHA, /* U+02b7bc: */
+                                           RTUNI_ALPHA, /* U+02b7bd: */
+                                           RTUNI_ALPHA, /* U+02b7be: */
+                                           RTUNI_ALPHA, /* U+02b7bf: */
+                                           RTUNI_ALPHA, /* U+02b7c0: */
+                                           RTUNI_ALPHA, /* U+02b7c1: */
+                                           RTUNI_ALPHA, /* U+02b7c2: */
+                                           RTUNI_ALPHA, /* U+02b7c3: */
+                                           RTUNI_ALPHA, /* U+02b7c4: */
+                                           RTUNI_ALPHA, /* U+02b7c5: */
+                                           RTUNI_ALPHA, /* U+02b7c6: */
+                                           RTUNI_ALPHA, /* U+02b7c7: */
+                                           RTUNI_ALPHA, /* U+02b7c8: */
+                                           RTUNI_ALPHA, /* U+02b7c9: */
+                                           RTUNI_ALPHA, /* U+02b7ca: */
+                                           RTUNI_ALPHA, /* U+02b7cb: */
+                                           RTUNI_ALPHA, /* U+02b7cc: */
+                                           RTUNI_ALPHA, /* U+02b7cd: */
+                                           RTUNI_ALPHA, /* U+02b7ce: */
+                                           RTUNI_ALPHA, /* U+02b7cf: */
+                                           RTUNI_ALPHA, /* U+02b7d0: */
+                                           RTUNI_ALPHA, /* U+02b7d1: */
+                                           RTUNI_ALPHA, /* U+02b7d2: */
+                                           RTUNI_ALPHA, /* U+02b7d3: */
+                                           RTUNI_ALPHA, /* U+02b7d4: */
+                                           RTUNI_ALPHA, /* U+02b7d5: */
+                                           RTUNI_ALPHA, /* U+02b7d6: */
+                                           RTUNI_ALPHA, /* U+02b7d7: */
+                                           RTUNI_ALPHA, /* U+02b7d8: */
+                                           RTUNI_ALPHA, /* U+02b7d9: */
+                                           RTUNI_ALPHA, /* U+02b7da: */
+                                           RTUNI_ALPHA, /* U+02b7db: */
+                                           RTUNI_ALPHA, /* U+02b7dc: */
+                                           RTUNI_ALPHA, /* U+02b7dd: */
+                                           RTUNI_ALPHA, /* U+02b7de: */
+                                           RTUNI_ALPHA, /* U+02b7df: */
+                                           RTUNI_ALPHA, /* U+02b7e0: */
+                                           RTUNI_ALPHA, /* U+02b7e1: */
+                                           RTUNI_ALPHA, /* U+02b7e2: */
+                                           RTUNI_ALPHA, /* U+02b7e3: */
+                                           RTUNI_ALPHA, /* U+02b7e4: */
+                                           RTUNI_ALPHA, /* U+02b7e5: */
+                                           RTUNI_ALPHA, /* U+02b7e6: */
+                                           RTUNI_ALPHA, /* U+02b7e7: */
+                                           RTUNI_ALPHA, /* U+02b7e8: */
+                                           RTUNI_ALPHA, /* U+02b7e9: */
+                                           RTUNI_ALPHA, /* U+02b7ea: */
+                                           RTUNI_ALPHA, /* U+02b7eb: */
+                                           RTUNI_ALPHA, /* U+02b7ec: */
+                                           RTUNI_ALPHA, /* U+02b7ed: */
+                                           RTUNI_ALPHA, /* U+02b7ee: */
+                                           RTUNI_ALPHA, /* U+02b7ef: */
+                                           RTUNI_ALPHA, /* U+02b7f0: */
+                                           RTUNI_ALPHA, /* U+02b7f1: */
+                                           RTUNI_ALPHA, /* U+02b7f2: */
+                                           RTUNI_ALPHA, /* U+02b7f3: */
+                                           RTUNI_ALPHA, /* U+02b7f4: */
+                                           RTUNI_ALPHA, /* U+02b7f5: */
+                                           RTUNI_ALPHA, /* U+02b7f6: */
+                                           RTUNI_ALPHA, /* U+02b7f7: */
+                                           RTUNI_ALPHA, /* U+02b7f8: */
+                                           RTUNI_ALPHA, /* U+02b7f9: */
+                                           RTUNI_ALPHA, /* U+02b7fa: */
+                                           RTUNI_ALPHA, /* U+02b7fb: */
+                                           RTUNI_ALPHA, /* U+02b7fc: */
+                                           RTUNI_ALPHA, /* U+02b7fd: */
+                                           RTUNI_ALPHA, /* U+02b7fe: */
+                                           RTUNI_ALPHA, /* U+02b7ff: */
+                                           RTUNI_ALPHA, /* U+02b800: */
+                                           RTUNI_ALPHA, /* U+02b801: */
+                                           RTUNI_ALPHA, /* U+02b802: */
+                                           RTUNI_ALPHA, /* U+02b803: */
+                                           RTUNI_ALPHA, /* U+02b804: */
+                                           RTUNI_ALPHA, /* U+02b805: */
+                                           RTUNI_ALPHA, /* U+02b806: */
+                                           RTUNI_ALPHA, /* U+02b807: */
+                                           RTUNI_ALPHA, /* U+02b808: */
+                                           RTUNI_ALPHA, /* U+02b809: */
+                                           RTUNI_ALPHA, /* U+02b80a: */
+                                           RTUNI_ALPHA, /* U+02b80b: */
+                                           RTUNI_ALPHA, /* U+02b80c: */
+                                           RTUNI_ALPHA, /* U+02b80d: */
+                                           RTUNI_ALPHA, /* U+02b80e: */
+                                           RTUNI_ALPHA, /* U+02b80f: */
+                                           RTUNI_ALPHA, /* U+02b810: */
+                                           RTUNI_ALPHA, /* U+02b811: */
+                                           RTUNI_ALPHA, /* U+02b812: */
+                                           RTUNI_ALPHA, /* U+02b813: */
+                                           RTUNI_ALPHA, /* U+02b814: */
+                                           RTUNI_ALPHA, /* U+02b815: */
+                                           RTUNI_ALPHA, /* U+02b816: */
+                                           RTUNI_ALPHA, /* U+02b817: */
+                                           RTUNI_ALPHA, /* U+02b818: */
+                                           RTUNI_ALPHA, /* U+02b819: */
+                                           RTUNI_ALPHA, /* U+02b81a: */
+                                           RTUNI_ALPHA, /* U+02b81b: */
+                                           RTUNI_ALPHA, /* U+02b81c: */
+                                           RTUNI_ALPHA, /* U+02b81d: <CJK Ideograph Extension D, Last>*/
+};
+
+static const uint8_t g_afRTUniFlags0x02f800[] =
+{
+                                           RTUNI_ALPHA, /* U+02f800: CJK COMPATIBILITY IDEOGRAPH-2F800*/
+                                           RTUNI_ALPHA, /* U+02f801: CJK COMPATIBILITY IDEOGRAPH-2F801*/
+                                           RTUNI_ALPHA, /* U+02f802: CJK COMPATIBILITY IDEOGRAPH-2F802*/
+                                           RTUNI_ALPHA, /* U+02f803: CJK COMPATIBILITY IDEOGRAPH-2F803*/
+                                           RTUNI_ALPHA, /* U+02f804: CJK COMPATIBILITY IDEOGRAPH-2F804*/
+                                           RTUNI_ALPHA, /* U+02f805: CJK COMPATIBILITY IDEOGRAPH-2F805*/
+                                           RTUNI_ALPHA, /* U+02f806: CJK COMPATIBILITY IDEOGRAPH-2F806*/
+                                           RTUNI_ALPHA, /* U+02f807: CJK COMPATIBILITY IDEOGRAPH-2F807*/
+                                           RTUNI_ALPHA, /* U+02f808: CJK COMPATIBILITY IDEOGRAPH-2F808*/
+                                           RTUNI_ALPHA, /* U+02f809: CJK COMPATIBILITY IDEOGRAPH-2F809*/
+                                           RTUNI_ALPHA, /* U+02f80a: CJK COMPATIBILITY IDEOGRAPH-2F80A*/
+                                           RTUNI_ALPHA, /* U+02f80b: CJK COMPATIBILITY IDEOGRAPH-2F80B*/
+                                           RTUNI_ALPHA, /* U+02f80c: CJK COMPATIBILITY IDEOGRAPH-2F80C*/
+                                           RTUNI_ALPHA, /* U+02f80d: CJK COMPATIBILITY IDEOGRAPH-2F80D*/
+                                           RTUNI_ALPHA, /* U+02f80e: CJK COMPATIBILITY IDEOGRAPH-2F80E*/
+                                           RTUNI_ALPHA, /* U+02f80f: CJK COMPATIBILITY IDEOGRAPH-2F80F*/
+                                           RTUNI_ALPHA, /* U+02f810: CJK COMPATIBILITY IDEOGRAPH-2F810*/
+                                           RTUNI_ALPHA, /* U+02f811: CJK COMPATIBILITY IDEOGRAPH-2F811*/
+                                           RTUNI_ALPHA, /* U+02f812: CJK COMPATIBILITY IDEOGRAPH-2F812*/
+                                           RTUNI_ALPHA, /* U+02f813: CJK COMPATIBILITY IDEOGRAPH-2F813*/
+                                           RTUNI_ALPHA, /* U+02f814: CJK COMPATIBILITY IDEOGRAPH-2F814*/
+                                           RTUNI_ALPHA, /* U+02f815: CJK COMPATIBILITY IDEOGRAPH-2F815*/
+                                           RTUNI_ALPHA, /* U+02f816: CJK COMPATIBILITY IDEOGRAPH-2F816*/
+                                           RTUNI_ALPHA, /* U+02f817: CJK COMPATIBILITY IDEOGRAPH-2F817*/
+                                           RTUNI_ALPHA, /* U+02f818: CJK COMPATIBILITY IDEOGRAPH-2F818*/
+                                           RTUNI_ALPHA, /* U+02f819: CJK COMPATIBILITY IDEOGRAPH-2F819*/
+                                           RTUNI_ALPHA, /* U+02f81a: CJK COMPATIBILITY IDEOGRAPH-2F81A*/
+                                           RTUNI_ALPHA, /* U+02f81b: CJK COMPATIBILITY IDEOGRAPH-2F81B*/
+                                           RTUNI_ALPHA, /* U+02f81c: CJK COMPATIBILITY IDEOGRAPH-2F81C*/
+                                           RTUNI_ALPHA, /* U+02f81d: CJK COMPATIBILITY IDEOGRAPH-2F81D*/
+                                           RTUNI_ALPHA, /* U+02f81e: CJK COMPATIBILITY IDEOGRAPH-2F81E*/
+                                           RTUNI_ALPHA, /* U+02f81f: CJK COMPATIBILITY IDEOGRAPH-2F81F*/
+                                           RTUNI_ALPHA, /* U+02f820: CJK COMPATIBILITY IDEOGRAPH-2F820*/
+                                           RTUNI_ALPHA, /* U+02f821: CJK COMPATIBILITY IDEOGRAPH-2F821*/
+                                           RTUNI_ALPHA, /* U+02f822: CJK COMPATIBILITY IDEOGRAPH-2F822*/
+                                           RTUNI_ALPHA, /* U+02f823: CJK COMPATIBILITY IDEOGRAPH-2F823*/
+                                           RTUNI_ALPHA, /* U+02f824: CJK COMPATIBILITY IDEOGRAPH-2F824*/
+                                           RTUNI_ALPHA, /* U+02f825: CJK COMPATIBILITY IDEOGRAPH-2F825*/
+                                           RTUNI_ALPHA, /* U+02f826: CJK COMPATIBILITY IDEOGRAPH-2F826*/
+                                           RTUNI_ALPHA, /* U+02f827: CJK COMPATIBILITY IDEOGRAPH-2F827*/
+                                           RTUNI_ALPHA, /* U+02f828: CJK COMPATIBILITY IDEOGRAPH-2F828*/
+                                           RTUNI_ALPHA, /* U+02f829: CJK COMPATIBILITY IDEOGRAPH-2F829*/
+                                           RTUNI_ALPHA, /* U+02f82a: CJK COMPATIBILITY IDEOGRAPH-2F82A*/
+                                           RTUNI_ALPHA, /* U+02f82b: CJK COMPATIBILITY IDEOGRAPH-2F82B*/
+                                           RTUNI_ALPHA, /* U+02f82c: CJK COMPATIBILITY IDEOGRAPH-2F82C*/
+                                           RTUNI_ALPHA, /* U+02f82d: CJK COMPATIBILITY IDEOGRAPH-2F82D*/
+                                           RTUNI_ALPHA, /* U+02f82e: CJK COMPATIBILITY IDEOGRAPH-2F82E*/
+                                           RTUNI_ALPHA, /* U+02f82f: CJK COMPATIBILITY IDEOGRAPH-2F82F*/
+                                           RTUNI_ALPHA, /* U+02f830: CJK COMPATIBILITY IDEOGRAPH-2F830*/
+                                           RTUNI_ALPHA, /* U+02f831: CJK COMPATIBILITY IDEOGRAPH-2F831*/
+                                           RTUNI_ALPHA, /* U+02f832: CJK COMPATIBILITY IDEOGRAPH-2F832*/
+                                           RTUNI_ALPHA, /* U+02f833: CJK COMPATIBILITY IDEOGRAPH-2F833*/
+                                           RTUNI_ALPHA, /* U+02f834: CJK COMPATIBILITY IDEOGRAPH-2F834*/
+                                           RTUNI_ALPHA, /* U+02f835: CJK COMPATIBILITY IDEOGRAPH-2F835*/
+                                           RTUNI_ALPHA, /* U+02f836: CJK COMPATIBILITY IDEOGRAPH-2F836*/
+                                           RTUNI_ALPHA, /* U+02f837: CJK COMPATIBILITY IDEOGRAPH-2F837*/
+                                           RTUNI_ALPHA, /* U+02f838: CJK COMPATIBILITY IDEOGRAPH-2F838*/
+                                           RTUNI_ALPHA, /* U+02f839: CJK COMPATIBILITY IDEOGRAPH-2F839*/
+                                           RTUNI_ALPHA, /* U+02f83a: CJK COMPATIBILITY IDEOGRAPH-2F83A*/
+                                           RTUNI_ALPHA, /* U+02f83b: CJK COMPATIBILITY IDEOGRAPH-2F83B*/
+                                           RTUNI_ALPHA, /* U+02f83c: CJK COMPATIBILITY IDEOGRAPH-2F83C*/
+                                           RTUNI_ALPHA, /* U+02f83d: CJK COMPATIBILITY IDEOGRAPH-2F83D*/
+                                           RTUNI_ALPHA, /* U+02f83e: CJK COMPATIBILITY IDEOGRAPH-2F83E*/
+                                           RTUNI_ALPHA, /* U+02f83f: CJK COMPATIBILITY IDEOGRAPH-2F83F*/
+                                           RTUNI_ALPHA, /* U+02f840: CJK COMPATIBILITY IDEOGRAPH-2F840*/
+                                           RTUNI_ALPHA, /* U+02f841: CJK COMPATIBILITY IDEOGRAPH-2F841*/
+                                           RTUNI_ALPHA, /* U+02f842: CJK COMPATIBILITY IDEOGRAPH-2F842*/
+                                           RTUNI_ALPHA, /* U+02f843: CJK COMPATIBILITY IDEOGRAPH-2F843*/
+                                           RTUNI_ALPHA, /* U+02f844: CJK COMPATIBILITY IDEOGRAPH-2F844*/
+                                           RTUNI_ALPHA, /* U+02f845: CJK COMPATIBILITY IDEOGRAPH-2F845*/
+                                           RTUNI_ALPHA, /* U+02f846: CJK COMPATIBILITY IDEOGRAPH-2F846*/
+                                           RTUNI_ALPHA, /* U+02f847: CJK COMPATIBILITY IDEOGRAPH-2F847*/
+                                           RTUNI_ALPHA, /* U+02f848: CJK COMPATIBILITY IDEOGRAPH-2F848*/
+                                           RTUNI_ALPHA, /* U+02f849: CJK COMPATIBILITY IDEOGRAPH-2F849*/
+                                           RTUNI_ALPHA, /* U+02f84a: CJK COMPATIBILITY IDEOGRAPH-2F84A*/
+                                           RTUNI_ALPHA, /* U+02f84b: CJK COMPATIBILITY IDEOGRAPH-2F84B*/
+                                           RTUNI_ALPHA, /* U+02f84c: CJK COMPATIBILITY IDEOGRAPH-2F84C*/
+                                           RTUNI_ALPHA, /* U+02f84d: CJK COMPATIBILITY IDEOGRAPH-2F84D*/
+                                           RTUNI_ALPHA, /* U+02f84e: CJK COMPATIBILITY IDEOGRAPH-2F84E*/
+                                           RTUNI_ALPHA, /* U+02f84f: CJK COMPATIBILITY IDEOGRAPH-2F84F*/
+                                           RTUNI_ALPHA, /* U+02f850: CJK COMPATIBILITY IDEOGRAPH-2F850*/
+                                           RTUNI_ALPHA, /* U+02f851: CJK COMPATIBILITY IDEOGRAPH-2F851*/
+                                           RTUNI_ALPHA, /* U+02f852: CJK COMPATIBILITY IDEOGRAPH-2F852*/
+                                           RTUNI_ALPHA, /* U+02f853: CJK COMPATIBILITY IDEOGRAPH-2F853*/
+                                           RTUNI_ALPHA, /* U+02f854: CJK COMPATIBILITY IDEOGRAPH-2F854*/
+                                           RTUNI_ALPHA, /* U+02f855: CJK COMPATIBILITY IDEOGRAPH-2F855*/
+                                           RTUNI_ALPHA, /* U+02f856: CJK COMPATIBILITY IDEOGRAPH-2F856*/
+                                           RTUNI_ALPHA, /* U+02f857: CJK COMPATIBILITY IDEOGRAPH-2F857*/
+                                           RTUNI_ALPHA, /* U+02f858: CJK COMPATIBILITY IDEOGRAPH-2F858*/
+                                           RTUNI_ALPHA, /* U+02f859: CJK COMPATIBILITY IDEOGRAPH-2F859*/
+                                           RTUNI_ALPHA, /* U+02f85a: CJK COMPATIBILITY IDEOGRAPH-2F85A*/
+                                           RTUNI_ALPHA, /* U+02f85b: CJK COMPATIBILITY IDEOGRAPH-2F85B*/
+                                           RTUNI_ALPHA, /* U+02f85c: CJK COMPATIBILITY IDEOGRAPH-2F85C*/
+                                           RTUNI_ALPHA, /* U+02f85d: CJK COMPATIBILITY IDEOGRAPH-2F85D*/
+                                           RTUNI_ALPHA, /* U+02f85e: CJK COMPATIBILITY IDEOGRAPH-2F85E*/
+                                           RTUNI_ALPHA, /* U+02f85f: CJK COMPATIBILITY IDEOGRAPH-2F85F*/
+                                           RTUNI_ALPHA, /* U+02f860: CJK COMPATIBILITY IDEOGRAPH-2F860*/
+                                           RTUNI_ALPHA, /* U+02f861: CJK COMPATIBILITY IDEOGRAPH-2F861*/
+                                           RTUNI_ALPHA, /* U+02f862: CJK COMPATIBILITY IDEOGRAPH-2F862*/
+                                           RTUNI_ALPHA, /* U+02f863: CJK COMPATIBILITY IDEOGRAPH-2F863*/
+                                           RTUNI_ALPHA, /* U+02f864: CJK COMPATIBILITY IDEOGRAPH-2F864*/
+                                           RTUNI_ALPHA, /* U+02f865: CJK COMPATIBILITY IDEOGRAPH-2F865*/
+                                           RTUNI_ALPHA, /* U+02f866: CJK COMPATIBILITY IDEOGRAPH-2F866*/
+                                           RTUNI_ALPHA, /* U+02f867: CJK COMPATIBILITY IDEOGRAPH-2F867*/
+                                           RTUNI_ALPHA, /* U+02f868: CJK COMPATIBILITY IDEOGRAPH-2F868*/
+                                           RTUNI_ALPHA, /* U+02f869: CJK COMPATIBILITY IDEOGRAPH-2F869*/
+                                           RTUNI_ALPHA, /* U+02f86a: CJK COMPATIBILITY IDEOGRAPH-2F86A*/
+                                           RTUNI_ALPHA, /* U+02f86b: CJK COMPATIBILITY IDEOGRAPH-2F86B*/
+                                           RTUNI_ALPHA, /* U+02f86c: CJK COMPATIBILITY IDEOGRAPH-2F86C*/
+                                           RTUNI_ALPHA, /* U+02f86d: CJK COMPATIBILITY IDEOGRAPH-2F86D*/
+                                           RTUNI_ALPHA, /* U+02f86e: CJK COMPATIBILITY IDEOGRAPH-2F86E*/
+                                           RTUNI_ALPHA, /* U+02f86f: CJK COMPATIBILITY IDEOGRAPH-2F86F*/
+                                           RTUNI_ALPHA, /* U+02f870: CJK COMPATIBILITY IDEOGRAPH-2F870*/
+                                           RTUNI_ALPHA, /* U+02f871: CJK COMPATIBILITY IDEOGRAPH-2F871*/
+                                           RTUNI_ALPHA, /* U+02f872: CJK COMPATIBILITY IDEOGRAPH-2F872*/
+                                           RTUNI_ALPHA, /* U+02f873: CJK COMPATIBILITY IDEOGRAPH-2F873*/
+                                           RTUNI_ALPHA, /* U+02f874: CJK COMPATIBILITY IDEOGRAPH-2F874*/
+                                           RTUNI_ALPHA, /* U+02f875: CJK COMPATIBILITY IDEOGRAPH-2F875*/
+                                           RTUNI_ALPHA, /* U+02f876: CJK COMPATIBILITY IDEOGRAPH-2F876*/
+                                           RTUNI_ALPHA, /* U+02f877: CJK COMPATIBILITY IDEOGRAPH-2F877*/
+                                           RTUNI_ALPHA, /* U+02f878: CJK COMPATIBILITY IDEOGRAPH-2F878*/
+                                           RTUNI_ALPHA, /* U+02f879: CJK COMPATIBILITY IDEOGRAPH-2F879*/
+                                           RTUNI_ALPHA, /* U+02f87a: CJK COMPATIBILITY IDEOGRAPH-2F87A*/
+                                           RTUNI_ALPHA, /* U+02f87b: CJK COMPATIBILITY IDEOGRAPH-2F87B*/
+                                           RTUNI_ALPHA, /* U+02f87c: CJK COMPATIBILITY IDEOGRAPH-2F87C*/
+                                           RTUNI_ALPHA, /* U+02f87d: CJK COMPATIBILITY IDEOGRAPH-2F87D*/
+                                           RTUNI_ALPHA, /* U+02f87e: CJK COMPATIBILITY IDEOGRAPH-2F87E*/
+                                           RTUNI_ALPHA, /* U+02f87f: CJK COMPATIBILITY IDEOGRAPH-2F87F*/
+                                           RTUNI_ALPHA, /* U+02f880: CJK COMPATIBILITY IDEOGRAPH-2F880*/
+                                           RTUNI_ALPHA, /* U+02f881: CJK COMPATIBILITY IDEOGRAPH-2F881*/
+                                           RTUNI_ALPHA, /* U+02f882: CJK COMPATIBILITY IDEOGRAPH-2F882*/
+                                           RTUNI_ALPHA, /* U+02f883: CJK COMPATIBILITY IDEOGRAPH-2F883*/
+                                           RTUNI_ALPHA, /* U+02f884: CJK COMPATIBILITY IDEOGRAPH-2F884*/
+                                           RTUNI_ALPHA, /* U+02f885: CJK COMPATIBILITY IDEOGRAPH-2F885*/
+                                           RTUNI_ALPHA, /* U+02f886: CJK COMPATIBILITY IDEOGRAPH-2F886*/
+                                           RTUNI_ALPHA, /* U+02f887: CJK COMPATIBILITY IDEOGRAPH-2F887*/
+                                           RTUNI_ALPHA, /* U+02f888: CJK COMPATIBILITY IDEOGRAPH-2F888*/
+                                           RTUNI_ALPHA, /* U+02f889: CJK COMPATIBILITY IDEOGRAPH-2F889*/
+                                           RTUNI_ALPHA, /* U+02f88a: CJK COMPATIBILITY IDEOGRAPH-2F88A*/
+                                           RTUNI_ALPHA, /* U+02f88b: CJK COMPATIBILITY IDEOGRAPH-2F88B*/
+                                           RTUNI_ALPHA, /* U+02f88c: CJK COMPATIBILITY IDEOGRAPH-2F88C*/
+                                           RTUNI_ALPHA, /* U+02f88d: CJK COMPATIBILITY IDEOGRAPH-2F88D*/
+                                           RTUNI_ALPHA, /* U+02f88e: CJK COMPATIBILITY IDEOGRAPH-2F88E*/
+                                           RTUNI_ALPHA, /* U+02f88f: CJK COMPATIBILITY IDEOGRAPH-2F88F*/
+                                           RTUNI_ALPHA, /* U+02f890: CJK COMPATIBILITY IDEOGRAPH-2F890*/
+                                           RTUNI_ALPHA, /* U+02f891: CJK COMPATIBILITY IDEOGRAPH-2F891*/
+                                           RTUNI_ALPHA, /* U+02f892: CJK COMPATIBILITY IDEOGRAPH-2F892*/
+                                           RTUNI_ALPHA, /* U+02f893: CJK COMPATIBILITY IDEOGRAPH-2F893*/
+                                           RTUNI_ALPHA, /* U+02f894: CJK COMPATIBILITY IDEOGRAPH-2F894*/
+                                           RTUNI_ALPHA, /* U+02f895: CJK COMPATIBILITY IDEOGRAPH-2F895*/
+                                           RTUNI_ALPHA, /* U+02f896: CJK COMPATIBILITY IDEOGRAPH-2F896*/
+                                           RTUNI_ALPHA, /* U+02f897: CJK COMPATIBILITY IDEOGRAPH-2F897*/
+                                           RTUNI_ALPHA, /* U+02f898: CJK COMPATIBILITY IDEOGRAPH-2F898*/
+                                           RTUNI_ALPHA, /* U+02f899: CJK COMPATIBILITY IDEOGRAPH-2F899*/
+                                           RTUNI_ALPHA, /* U+02f89a: CJK COMPATIBILITY IDEOGRAPH-2F89A*/
+                                           RTUNI_ALPHA, /* U+02f89b: CJK COMPATIBILITY IDEOGRAPH-2F89B*/
+                                           RTUNI_ALPHA, /* U+02f89c: CJK COMPATIBILITY IDEOGRAPH-2F89C*/
+                                           RTUNI_ALPHA, /* U+02f89d: CJK COMPATIBILITY IDEOGRAPH-2F89D*/
+                                           RTUNI_ALPHA, /* U+02f89e: CJK COMPATIBILITY IDEOGRAPH-2F89E*/
+                                           RTUNI_ALPHA, /* U+02f89f: CJK COMPATIBILITY IDEOGRAPH-2F89F*/
+                                           RTUNI_ALPHA, /* U+02f8a0: CJK COMPATIBILITY IDEOGRAPH-2F8A0*/
+                                           RTUNI_ALPHA, /* U+02f8a1: CJK COMPATIBILITY IDEOGRAPH-2F8A1*/
+                                           RTUNI_ALPHA, /* U+02f8a2: CJK COMPATIBILITY IDEOGRAPH-2F8A2*/
+                                           RTUNI_ALPHA, /* U+02f8a3: CJK COMPATIBILITY IDEOGRAPH-2F8A3*/
+                                           RTUNI_ALPHA, /* U+02f8a4: CJK COMPATIBILITY IDEOGRAPH-2F8A4*/
+                                           RTUNI_ALPHA, /* U+02f8a5: CJK COMPATIBILITY IDEOGRAPH-2F8A5*/
+                                           RTUNI_ALPHA, /* U+02f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6*/
+                                           RTUNI_ALPHA, /* U+02f8a7: CJK COMPATIBILITY IDEOGRAPH-2F8A7*/
+                                           RTUNI_ALPHA, /* U+02f8a8: CJK COMPATIBILITY IDEOGRAPH-2F8A8*/
+                                           RTUNI_ALPHA, /* U+02f8a9: CJK COMPATIBILITY IDEOGRAPH-2F8A9*/
+                                           RTUNI_ALPHA, /* U+02f8aa: CJK COMPATIBILITY IDEOGRAPH-2F8AA*/
+                                           RTUNI_ALPHA, /* U+02f8ab: CJK COMPATIBILITY IDEOGRAPH-2F8AB*/
+                                           RTUNI_ALPHA, /* U+02f8ac: CJK COMPATIBILITY IDEOGRAPH-2F8AC*/
+                                           RTUNI_ALPHA, /* U+02f8ad: CJK COMPATIBILITY IDEOGRAPH-2F8AD*/
+                                           RTUNI_ALPHA, /* U+02f8ae: CJK COMPATIBILITY IDEOGRAPH-2F8AE*/
+                                           RTUNI_ALPHA, /* U+02f8af: CJK COMPATIBILITY IDEOGRAPH-2F8AF*/
+                                           RTUNI_ALPHA, /* U+02f8b0: CJK COMPATIBILITY IDEOGRAPH-2F8B0*/
+                                           RTUNI_ALPHA, /* U+02f8b1: CJK COMPATIBILITY IDEOGRAPH-2F8B1*/
+                                           RTUNI_ALPHA, /* U+02f8b2: CJK COMPATIBILITY IDEOGRAPH-2F8B2*/
+                                           RTUNI_ALPHA, /* U+02f8b3: CJK COMPATIBILITY IDEOGRAPH-2F8B3*/
+                                           RTUNI_ALPHA, /* U+02f8b4: CJK COMPATIBILITY IDEOGRAPH-2F8B4*/
+                                           RTUNI_ALPHA, /* U+02f8b5: CJK COMPATIBILITY IDEOGRAPH-2F8B5*/
+                                           RTUNI_ALPHA, /* U+02f8b6: CJK COMPATIBILITY IDEOGRAPH-2F8B6*/
+                                           RTUNI_ALPHA, /* U+02f8b7: CJK COMPATIBILITY IDEOGRAPH-2F8B7*/
+                                           RTUNI_ALPHA, /* U+02f8b8: CJK COMPATIBILITY IDEOGRAPH-2F8B8*/
+                                           RTUNI_ALPHA, /* U+02f8b9: CJK COMPATIBILITY IDEOGRAPH-2F8B9*/
+                                           RTUNI_ALPHA, /* U+02f8ba: CJK COMPATIBILITY IDEOGRAPH-2F8BA*/
+                                           RTUNI_ALPHA, /* U+02f8bb: CJK COMPATIBILITY IDEOGRAPH-2F8BB*/
+                                           RTUNI_ALPHA, /* U+02f8bc: CJK COMPATIBILITY IDEOGRAPH-2F8BC*/
+                                           RTUNI_ALPHA, /* U+02f8bd: CJK COMPATIBILITY IDEOGRAPH-2F8BD*/
+                                           RTUNI_ALPHA, /* U+02f8be: CJK COMPATIBILITY IDEOGRAPH-2F8BE*/
+                                           RTUNI_ALPHA, /* U+02f8bf: CJK COMPATIBILITY IDEOGRAPH-2F8BF*/
+                                           RTUNI_ALPHA, /* U+02f8c0: CJK COMPATIBILITY IDEOGRAPH-2F8C0*/
+                                           RTUNI_ALPHA, /* U+02f8c1: CJK COMPATIBILITY IDEOGRAPH-2F8C1*/
+                                           RTUNI_ALPHA, /* U+02f8c2: CJK COMPATIBILITY IDEOGRAPH-2F8C2*/
+                                           RTUNI_ALPHA, /* U+02f8c3: CJK COMPATIBILITY IDEOGRAPH-2F8C3*/
+                                           RTUNI_ALPHA, /* U+02f8c4: CJK COMPATIBILITY IDEOGRAPH-2F8C4*/
+                                           RTUNI_ALPHA, /* U+02f8c5: CJK COMPATIBILITY IDEOGRAPH-2F8C5*/
+                                           RTUNI_ALPHA, /* U+02f8c6: CJK COMPATIBILITY IDEOGRAPH-2F8C6*/
+                                           RTUNI_ALPHA, /* U+02f8c7: CJK COMPATIBILITY IDEOGRAPH-2F8C7*/
+                                           RTUNI_ALPHA, /* U+02f8c8: CJK COMPATIBILITY IDEOGRAPH-2F8C8*/
+                                           RTUNI_ALPHA, /* U+02f8c9: CJK COMPATIBILITY IDEOGRAPH-2F8C9*/
+                                           RTUNI_ALPHA, /* U+02f8ca: CJK COMPATIBILITY IDEOGRAPH-2F8CA*/
+                                           RTUNI_ALPHA, /* U+02f8cb: CJK COMPATIBILITY IDEOGRAPH-2F8CB*/
+                                           RTUNI_ALPHA, /* U+02f8cc: CJK COMPATIBILITY IDEOGRAPH-2F8CC*/
+                                           RTUNI_ALPHA, /* U+02f8cd: CJK COMPATIBILITY IDEOGRAPH-2F8CD*/
+                                           RTUNI_ALPHA, /* U+02f8ce: CJK COMPATIBILITY IDEOGRAPH-2F8CE*/
+                                           RTUNI_ALPHA, /* U+02f8cf: CJK COMPATIBILITY IDEOGRAPH-2F8CF*/
+                                           RTUNI_ALPHA, /* U+02f8d0: CJK COMPATIBILITY IDEOGRAPH-2F8D0*/
+                                           RTUNI_ALPHA, /* U+02f8d1: CJK COMPATIBILITY IDEOGRAPH-2F8D1*/
+                                           RTUNI_ALPHA, /* U+02f8d2: CJK COMPATIBILITY IDEOGRAPH-2F8D2*/
+                                           RTUNI_ALPHA, /* U+02f8d3: CJK COMPATIBILITY IDEOGRAPH-2F8D3*/
+                                           RTUNI_ALPHA, /* U+02f8d4: CJK COMPATIBILITY IDEOGRAPH-2F8D4*/
+                                           RTUNI_ALPHA, /* U+02f8d5: CJK COMPATIBILITY IDEOGRAPH-2F8D5*/
+                                           RTUNI_ALPHA, /* U+02f8d6: CJK COMPATIBILITY IDEOGRAPH-2F8D6*/
+                                           RTUNI_ALPHA, /* U+02f8d7: CJK COMPATIBILITY IDEOGRAPH-2F8D7*/
+                                           RTUNI_ALPHA, /* U+02f8d8: CJK COMPATIBILITY IDEOGRAPH-2F8D8*/
+                                           RTUNI_ALPHA, /* U+02f8d9: CJK COMPATIBILITY IDEOGRAPH-2F8D9*/
+                                           RTUNI_ALPHA, /* U+02f8da: CJK COMPATIBILITY IDEOGRAPH-2F8DA*/
+                                           RTUNI_ALPHA, /* U+02f8db: CJK COMPATIBILITY IDEOGRAPH-2F8DB*/
+                                           RTUNI_ALPHA, /* U+02f8dc: CJK COMPATIBILITY IDEOGRAPH-2F8DC*/
+                                           RTUNI_ALPHA, /* U+02f8dd: CJK COMPATIBILITY IDEOGRAPH-2F8DD*/
+                                           RTUNI_ALPHA, /* U+02f8de: CJK COMPATIBILITY IDEOGRAPH-2F8DE*/
+                                           RTUNI_ALPHA, /* U+02f8df: CJK COMPATIBILITY IDEOGRAPH-2F8DF*/
+                                           RTUNI_ALPHA, /* U+02f8e0: CJK COMPATIBILITY IDEOGRAPH-2F8E0*/
+                                           RTUNI_ALPHA, /* U+02f8e1: CJK COMPATIBILITY IDEOGRAPH-2F8E1*/
+                                           RTUNI_ALPHA, /* U+02f8e2: CJK COMPATIBILITY IDEOGRAPH-2F8E2*/
+                                           RTUNI_ALPHA, /* U+02f8e3: CJK COMPATIBILITY IDEOGRAPH-2F8E3*/
+                                           RTUNI_ALPHA, /* U+02f8e4: CJK COMPATIBILITY IDEOGRAPH-2F8E4*/
+                                           RTUNI_ALPHA, /* U+02f8e5: CJK COMPATIBILITY IDEOGRAPH-2F8E5*/
+                                           RTUNI_ALPHA, /* U+02f8e6: CJK COMPATIBILITY IDEOGRAPH-2F8E6*/
+                                           RTUNI_ALPHA, /* U+02f8e7: CJK COMPATIBILITY IDEOGRAPH-2F8E7*/
+                                           RTUNI_ALPHA, /* U+02f8e8: CJK COMPATIBILITY IDEOGRAPH-2F8E8*/
+                                           RTUNI_ALPHA, /* U+02f8e9: CJK COMPATIBILITY IDEOGRAPH-2F8E9*/
+                                           RTUNI_ALPHA, /* U+02f8ea: CJK COMPATIBILITY IDEOGRAPH-2F8EA*/
+                                           RTUNI_ALPHA, /* U+02f8eb: CJK COMPATIBILITY IDEOGRAPH-2F8EB*/
+                                           RTUNI_ALPHA, /* U+02f8ec: CJK COMPATIBILITY IDEOGRAPH-2F8EC*/
+                                           RTUNI_ALPHA, /* U+02f8ed: CJK COMPATIBILITY IDEOGRAPH-2F8ED*/
+                                           RTUNI_ALPHA, /* U+02f8ee: CJK COMPATIBILITY IDEOGRAPH-2F8EE*/
+                                           RTUNI_ALPHA, /* U+02f8ef: CJK COMPATIBILITY IDEOGRAPH-2F8EF*/
+                                           RTUNI_ALPHA, /* U+02f8f0: CJK COMPATIBILITY IDEOGRAPH-2F8F0*/
+                                           RTUNI_ALPHA, /* U+02f8f1: CJK COMPATIBILITY IDEOGRAPH-2F8F1*/
+                                           RTUNI_ALPHA, /* U+02f8f2: CJK COMPATIBILITY IDEOGRAPH-2F8F2*/
+                                           RTUNI_ALPHA, /* U+02f8f3: CJK COMPATIBILITY IDEOGRAPH-2F8F3*/
+                                           RTUNI_ALPHA, /* U+02f8f4: CJK COMPATIBILITY IDEOGRAPH-2F8F4*/
+                                           RTUNI_ALPHA, /* U+02f8f5: CJK COMPATIBILITY IDEOGRAPH-2F8F5*/
+                                           RTUNI_ALPHA, /* U+02f8f6: CJK COMPATIBILITY IDEOGRAPH-2F8F6*/
+                                           RTUNI_ALPHA, /* U+02f8f7: CJK COMPATIBILITY IDEOGRAPH-2F8F7*/
+                                           RTUNI_ALPHA, /* U+02f8f8: CJK COMPATIBILITY IDEOGRAPH-2F8F8*/
+                                           RTUNI_ALPHA, /* U+02f8f9: CJK COMPATIBILITY IDEOGRAPH-2F8F9*/
+                                           RTUNI_ALPHA, /* U+02f8fa: CJK COMPATIBILITY IDEOGRAPH-2F8FA*/
+                                           RTUNI_ALPHA, /* U+02f8fb: CJK COMPATIBILITY IDEOGRAPH-2F8FB*/
+                                           RTUNI_ALPHA, /* U+02f8fc: CJK COMPATIBILITY IDEOGRAPH-2F8FC*/
+                                           RTUNI_ALPHA, /* U+02f8fd: CJK COMPATIBILITY IDEOGRAPH-2F8FD*/
+                                           RTUNI_ALPHA, /* U+02f8fe: CJK COMPATIBILITY IDEOGRAPH-2F8FE*/
+                                           RTUNI_ALPHA, /* U+02f8ff: CJK COMPATIBILITY IDEOGRAPH-2F8FF*/
+                                           RTUNI_ALPHA, /* U+02f900: CJK COMPATIBILITY IDEOGRAPH-2F900*/
+                                           RTUNI_ALPHA, /* U+02f901: CJK COMPATIBILITY IDEOGRAPH-2F901*/
+                                           RTUNI_ALPHA, /* U+02f902: CJK COMPATIBILITY IDEOGRAPH-2F902*/
+                                           RTUNI_ALPHA, /* U+02f903: CJK COMPATIBILITY IDEOGRAPH-2F903*/
+                                           RTUNI_ALPHA, /* U+02f904: CJK COMPATIBILITY IDEOGRAPH-2F904*/
+                                           RTUNI_ALPHA, /* U+02f905: CJK COMPATIBILITY IDEOGRAPH-2F905*/
+                                           RTUNI_ALPHA, /* U+02f906: CJK COMPATIBILITY IDEOGRAPH-2F906*/
+                                           RTUNI_ALPHA, /* U+02f907: CJK COMPATIBILITY IDEOGRAPH-2F907*/
+                                           RTUNI_ALPHA, /* U+02f908: CJK COMPATIBILITY IDEOGRAPH-2F908*/
+                                           RTUNI_ALPHA, /* U+02f909: CJK COMPATIBILITY IDEOGRAPH-2F909*/
+                                           RTUNI_ALPHA, /* U+02f90a: CJK COMPATIBILITY IDEOGRAPH-2F90A*/
+                                           RTUNI_ALPHA, /* U+02f90b: CJK COMPATIBILITY IDEOGRAPH-2F90B*/
+                                           RTUNI_ALPHA, /* U+02f90c: CJK COMPATIBILITY IDEOGRAPH-2F90C*/
+                                           RTUNI_ALPHA, /* U+02f90d: CJK COMPATIBILITY IDEOGRAPH-2F90D*/
+                                           RTUNI_ALPHA, /* U+02f90e: CJK COMPATIBILITY IDEOGRAPH-2F90E*/
+                                           RTUNI_ALPHA, /* U+02f90f: CJK COMPATIBILITY IDEOGRAPH-2F90F*/
+                                           RTUNI_ALPHA, /* U+02f910: CJK COMPATIBILITY IDEOGRAPH-2F910*/
+                                           RTUNI_ALPHA, /* U+02f911: CJK COMPATIBILITY IDEOGRAPH-2F911*/
+                                           RTUNI_ALPHA, /* U+02f912: CJK COMPATIBILITY IDEOGRAPH-2F912*/
+                                           RTUNI_ALPHA, /* U+02f913: CJK COMPATIBILITY IDEOGRAPH-2F913*/
+                                           RTUNI_ALPHA, /* U+02f914: CJK COMPATIBILITY IDEOGRAPH-2F914*/
+                                           RTUNI_ALPHA, /* U+02f915: CJK COMPATIBILITY IDEOGRAPH-2F915*/
+                                           RTUNI_ALPHA, /* U+02f916: CJK COMPATIBILITY IDEOGRAPH-2F916*/
+                                           RTUNI_ALPHA, /* U+02f917: CJK COMPATIBILITY IDEOGRAPH-2F917*/
+                                           RTUNI_ALPHA, /* U+02f918: CJK COMPATIBILITY IDEOGRAPH-2F918*/
+                                           RTUNI_ALPHA, /* U+02f919: CJK COMPATIBILITY IDEOGRAPH-2F919*/
+                                           RTUNI_ALPHA, /* U+02f91a: CJK COMPATIBILITY IDEOGRAPH-2F91A*/
+                                           RTUNI_ALPHA, /* U+02f91b: CJK COMPATIBILITY IDEOGRAPH-2F91B*/
+                                           RTUNI_ALPHA, /* U+02f91c: CJK COMPATIBILITY IDEOGRAPH-2F91C*/
+                                           RTUNI_ALPHA, /* U+02f91d: CJK COMPATIBILITY IDEOGRAPH-2F91D*/
+                                           RTUNI_ALPHA, /* U+02f91e: CJK COMPATIBILITY IDEOGRAPH-2F91E*/
+                                           RTUNI_ALPHA, /* U+02f91f: CJK COMPATIBILITY IDEOGRAPH-2F91F*/
+                                           RTUNI_ALPHA, /* U+02f920: CJK COMPATIBILITY IDEOGRAPH-2F920*/
+                                           RTUNI_ALPHA, /* U+02f921: CJK COMPATIBILITY IDEOGRAPH-2F921*/
+                                           RTUNI_ALPHA, /* U+02f922: CJK COMPATIBILITY IDEOGRAPH-2F922*/
+                                           RTUNI_ALPHA, /* U+02f923: CJK COMPATIBILITY IDEOGRAPH-2F923*/
+                                           RTUNI_ALPHA, /* U+02f924: CJK COMPATIBILITY IDEOGRAPH-2F924*/
+                                           RTUNI_ALPHA, /* U+02f925: CJK COMPATIBILITY IDEOGRAPH-2F925*/
+                                           RTUNI_ALPHA, /* U+02f926: CJK COMPATIBILITY IDEOGRAPH-2F926*/
+                                           RTUNI_ALPHA, /* U+02f927: CJK COMPATIBILITY IDEOGRAPH-2F927*/
+                                           RTUNI_ALPHA, /* U+02f928: CJK COMPATIBILITY IDEOGRAPH-2F928*/
+                                           RTUNI_ALPHA, /* U+02f929: CJK COMPATIBILITY IDEOGRAPH-2F929*/
+                                           RTUNI_ALPHA, /* U+02f92a: CJK COMPATIBILITY IDEOGRAPH-2F92A*/
+                                           RTUNI_ALPHA, /* U+02f92b: CJK COMPATIBILITY IDEOGRAPH-2F92B*/
+                                           RTUNI_ALPHA, /* U+02f92c: CJK COMPATIBILITY IDEOGRAPH-2F92C*/
+                                           RTUNI_ALPHA, /* U+02f92d: CJK COMPATIBILITY IDEOGRAPH-2F92D*/
+                                           RTUNI_ALPHA, /* U+02f92e: CJK COMPATIBILITY IDEOGRAPH-2F92E*/
+                                           RTUNI_ALPHA, /* U+02f92f: CJK COMPATIBILITY IDEOGRAPH-2F92F*/
+                                           RTUNI_ALPHA, /* U+02f930: CJK COMPATIBILITY IDEOGRAPH-2F930*/
+                                           RTUNI_ALPHA, /* U+02f931: CJK COMPATIBILITY IDEOGRAPH-2F931*/
+                                           RTUNI_ALPHA, /* U+02f932: CJK COMPATIBILITY IDEOGRAPH-2F932*/
+                                           RTUNI_ALPHA, /* U+02f933: CJK COMPATIBILITY IDEOGRAPH-2F933*/
+                                           RTUNI_ALPHA, /* U+02f934: CJK COMPATIBILITY IDEOGRAPH-2F934*/
+                                           RTUNI_ALPHA, /* U+02f935: CJK COMPATIBILITY IDEOGRAPH-2F935*/
+                                           RTUNI_ALPHA, /* U+02f936: CJK COMPATIBILITY IDEOGRAPH-2F936*/
+                                           RTUNI_ALPHA, /* U+02f937: CJK COMPATIBILITY IDEOGRAPH-2F937*/
+                                           RTUNI_ALPHA, /* U+02f938: CJK COMPATIBILITY IDEOGRAPH-2F938*/
+                                           RTUNI_ALPHA, /* U+02f939: CJK COMPATIBILITY IDEOGRAPH-2F939*/
+                                           RTUNI_ALPHA, /* U+02f93a: CJK COMPATIBILITY IDEOGRAPH-2F93A*/
+                                           RTUNI_ALPHA, /* U+02f93b: CJK COMPATIBILITY IDEOGRAPH-2F93B*/
+                                           RTUNI_ALPHA, /* U+02f93c: CJK COMPATIBILITY IDEOGRAPH-2F93C*/
+                                           RTUNI_ALPHA, /* U+02f93d: CJK COMPATIBILITY IDEOGRAPH-2F93D*/
+                                           RTUNI_ALPHA, /* U+02f93e: CJK COMPATIBILITY IDEOGRAPH-2F93E*/
+                                           RTUNI_ALPHA, /* U+02f93f: CJK COMPATIBILITY IDEOGRAPH-2F93F*/
+                                           RTUNI_ALPHA, /* U+02f940: CJK COMPATIBILITY IDEOGRAPH-2F940*/
+                                           RTUNI_ALPHA, /* U+02f941: CJK COMPATIBILITY IDEOGRAPH-2F941*/
+                                           RTUNI_ALPHA, /* U+02f942: CJK COMPATIBILITY IDEOGRAPH-2F942*/
+                                           RTUNI_ALPHA, /* U+02f943: CJK COMPATIBILITY IDEOGRAPH-2F943*/
+                                           RTUNI_ALPHA, /* U+02f944: CJK COMPATIBILITY IDEOGRAPH-2F944*/
+                                           RTUNI_ALPHA, /* U+02f945: CJK COMPATIBILITY IDEOGRAPH-2F945*/
+                                           RTUNI_ALPHA, /* U+02f946: CJK COMPATIBILITY IDEOGRAPH-2F946*/
+                                           RTUNI_ALPHA, /* U+02f947: CJK COMPATIBILITY IDEOGRAPH-2F947*/
+                                           RTUNI_ALPHA, /* U+02f948: CJK COMPATIBILITY IDEOGRAPH-2F948*/
+                                           RTUNI_ALPHA, /* U+02f949: CJK COMPATIBILITY IDEOGRAPH-2F949*/
+                                           RTUNI_ALPHA, /* U+02f94a: CJK COMPATIBILITY IDEOGRAPH-2F94A*/
+                                           RTUNI_ALPHA, /* U+02f94b: CJK COMPATIBILITY IDEOGRAPH-2F94B*/
+                                           RTUNI_ALPHA, /* U+02f94c: CJK COMPATIBILITY IDEOGRAPH-2F94C*/
+                                           RTUNI_ALPHA, /* U+02f94d: CJK COMPATIBILITY IDEOGRAPH-2F94D*/
+                                           RTUNI_ALPHA, /* U+02f94e: CJK COMPATIBILITY IDEOGRAPH-2F94E*/
+                                           RTUNI_ALPHA, /* U+02f94f: CJK COMPATIBILITY IDEOGRAPH-2F94F*/
+                                           RTUNI_ALPHA, /* U+02f950: CJK COMPATIBILITY IDEOGRAPH-2F950*/
+                                           RTUNI_ALPHA, /* U+02f951: CJK COMPATIBILITY IDEOGRAPH-2F951*/
+                                           RTUNI_ALPHA, /* U+02f952: CJK COMPATIBILITY IDEOGRAPH-2F952*/
+                                           RTUNI_ALPHA, /* U+02f953: CJK COMPATIBILITY IDEOGRAPH-2F953*/
+                                           RTUNI_ALPHA, /* U+02f954: CJK COMPATIBILITY IDEOGRAPH-2F954*/
+                                           RTUNI_ALPHA, /* U+02f955: CJK COMPATIBILITY IDEOGRAPH-2F955*/
+                                           RTUNI_ALPHA, /* U+02f956: CJK COMPATIBILITY IDEOGRAPH-2F956*/
+                                           RTUNI_ALPHA, /* U+02f957: CJK COMPATIBILITY IDEOGRAPH-2F957*/
+                                           RTUNI_ALPHA, /* U+02f958: CJK COMPATIBILITY IDEOGRAPH-2F958*/
+                                           RTUNI_ALPHA, /* U+02f959: CJK COMPATIBILITY IDEOGRAPH-2F959*/
+                                           RTUNI_ALPHA, /* U+02f95a: CJK COMPATIBILITY IDEOGRAPH-2F95A*/
+                                           RTUNI_ALPHA, /* U+02f95b: CJK COMPATIBILITY IDEOGRAPH-2F95B*/
+                                           RTUNI_ALPHA, /* U+02f95c: CJK COMPATIBILITY IDEOGRAPH-2F95C*/
+                                           RTUNI_ALPHA, /* U+02f95d: CJK COMPATIBILITY IDEOGRAPH-2F95D*/
+                                           RTUNI_ALPHA, /* U+02f95e: CJK COMPATIBILITY IDEOGRAPH-2F95E*/
+                                           RTUNI_ALPHA, /* U+02f95f: CJK COMPATIBILITY IDEOGRAPH-2F95F*/
+                                           RTUNI_ALPHA, /* U+02f960: CJK COMPATIBILITY IDEOGRAPH-2F960*/
+                                           RTUNI_ALPHA, /* U+02f961: CJK COMPATIBILITY IDEOGRAPH-2F961*/
+                                           RTUNI_ALPHA, /* U+02f962: CJK COMPATIBILITY IDEOGRAPH-2F962*/
+                                           RTUNI_ALPHA, /* U+02f963: CJK COMPATIBILITY IDEOGRAPH-2F963*/
+                                           RTUNI_ALPHA, /* U+02f964: CJK COMPATIBILITY IDEOGRAPH-2F964*/
+                                           RTUNI_ALPHA, /* U+02f965: CJK COMPATIBILITY IDEOGRAPH-2F965*/
+                                           RTUNI_ALPHA, /* U+02f966: CJK COMPATIBILITY IDEOGRAPH-2F966*/
+                                           RTUNI_ALPHA, /* U+02f967: CJK COMPATIBILITY IDEOGRAPH-2F967*/
+                                           RTUNI_ALPHA, /* U+02f968: CJK COMPATIBILITY IDEOGRAPH-2F968*/
+                                           RTUNI_ALPHA, /* U+02f969: CJK COMPATIBILITY IDEOGRAPH-2F969*/
+                                           RTUNI_ALPHA, /* U+02f96a: CJK COMPATIBILITY IDEOGRAPH-2F96A*/
+                                           RTUNI_ALPHA, /* U+02f96b: CJK COMPATIBILITY IDEOGRAPH-2F96B*/
+                                           RTUNI_ALPHA, /* U+02f96c: CJK COMPATIBILITY IDEOGRAPH-2F96C*/
+                                           RTUNI_ALPHA, /* U+02f96d: CJK COMPATIBILITY IDEOGRAPH-2F96D*/
+                                           RTUNI_ALPHA, /* U+02f96e: CJK COMPATIBILITY IDEOGRAPH-2F96E*/
+                                           RTUNI_ALPHA, /* U+02f96f: CJK COMPATIBILITY IDEOGRAPH-2F96F*/
+                                           RTUNI_ALPHA, /* U+02f970: CJK COMPATIBILITY IDEOGRAPH-2F970*/
+                                           RTUNI_ALPHA, /* U+02f971: CJK COMPATIBILITY IDEOGRAPH-2F971*/
+                                           RTUNI_ALPHA, /* U+02f972: CJK COMPATIBILITY IDEOGRAPH-2F972*/
+                                           RTUNI_ALPHA, /* U+02f973: CJK COMPATIBILITY IDEOGRAPH-2F973*/
+                                           RTUNI_ALPHA, /* U+02f974: CJK COMPATIBILITY IDEOGRAPH-2F974*/
+                                           RTUNI_ALPHA, /* U+02f975: CJK COMPATIBILITY IDEOGRAPH-2F975*/
+                                           RTUNI_ALPHA, /* U+02f976: CJK COMPATIBILITY IDEOGRAPH-2F976*/
+                                           RTUNI_ALPHA, /* U+02f977: CJK COMPATIBILITY IDEOGRAPH-2F977*/
+                                           RTUNI_ALPHA, /* U+02f978: CJK COMPATIBILITY IDEOGRAPH-2F978*/
+                                           RTUNI_ALPHA, /* U+02f979: CJK COMPATIBILITY IDEOGRAPH-2F979*/
+                                           RTUNI_ALPHA, /* U+02f97a: CJK COMPATIBILITY IDEOGRAPH-2F97A*/
+                                           RTUNI_ALPHA, /* U+02f97b: CJK COMPATIBILITY IDEOGRAPH-2F97B*/
+                                           RTUNI_ALPHA, /* U+02f97c: CJK COMPATIBILITY IDEOGRAPH-2F97C*/
+                                           RTUNI_ALPHA, /* U+02f97d: CJK COMPATIBILITY IDEOGRAPH-2F97D*/
+                                           RTUNI_ALPHA, /* U+02f97e: CJK COMPATIBILITY IDEOGRAPH-2F97E*/
+                                           RTUNI_ALPHA, /* U+02f97f: CJK COMPATIBILITY IDEOGRAPH-2F97F*/
+                                           RTUNI_ALPHA, /* U+02f980: CJK COMPATIBILITY IDEOGRAPH-2F980*/
+                                           RTUNI_ALPHA, /* U+02f981: CJK COMPATIBILITY IDEOGRAPH-2F981*/
+                                           RTUNI_ALPHA, /* U+02f982: CJK COMPATIBILITY IDEOGRAPH-2F982*/
+                                           RTUNI_ALPHA, /* U+02f983: CJK COMPATIBILITY IDEOGRAPH-2F983*/
+                                           RTUNI_ALPHA, /* U+02f984: CJK COMPATIBILITY IDEOGRAPH-2F984*/
+                                           RTUNI_ALPHA, /* U+02f985: CJK COMPATIBILITY IDEOGRAPH-2F985*/
+                                           RTUNI_ALPHA, /* U+02f986: CJK COMPATIBILITY IDEOGRAPH-2F986*/
+                                           RTUNI_ALPHA, /* U+02f987: CJK COMPATIBILITY IDEOGRAPH-2F987*/
+                                           RTUNI_ALPHA, /* U+02f988: CJK COMPATIBILITY IDEOGRAPH-2F988*/
+                                           RTUNI_ALPHA, /* U+02f989: CJK COMPATIBILITY IDEOGRAPH-2F989*/
+                                           RTUNI_ALPHA, /* U+02f98a: CJK COMPATIBILITY IDEOGRAPH-2F98A*/
+                                           RTUNI_ALPHA, /* U+02f98b: CJK COMPATIBILITY IDEOGRAPH-2F98B*/
+                                           RTUNI_ALPHA, /* U+02f98c: CJK COMPATIBILITY IDEOGRAPH-2F98C*/
+                                           RTUNI_ALPHA, /* U+02f98d: CJK COMPATIBILITY IDEOGRAPH-2F98D*/
+                                           RTUNI_ALPHA, /* U+02f98e: CJK COMPATIBILITY IDEOGRAPH-2F98E*/
+                                           RTUNI_ALPHA, /* U+02f98f: CJK COMPATIBILITY IDEOGRAPH-2F98F*/
+                                           RTUNI_ALPHA, /* U+02f990: CJK COMPATIBILITY IDEOGRAPH-2F990*/
+                                           RTUNI_ALPHA, /* U+02f991: CJK COMPATIBILITY IDEOGRAPH-2F991*/
+                                           RTUNI_ALPHA, /* U+02f992: CJK COMPATIBILITY IDEOGRAPH-2F992*/
+                                           RTUNI_ALPHA, /* U+02f993: CJK COMPATIBILITY IDEOGRAPH-2F993*/
+                                           RTUNI_ALPHA, /* U+02f994: CJK COMPATIBILITY IDEOGRAPH-2F994*/
+                                           RTUNI_ALPHA, /* U+02f995: CJK COMPATIBILITY IDEOGRAPH-2F995*/
+                                           RTUNI_ALPHA, /* U+02f996: CJK COMPATIBILITY IDEOGRAPH-2F996*/
+                                           RTUNI_ALPHA, /* U+02f997: CJK COMPATIBILITY IDEOGRAPH-2F997*/
+                                           RTUNI_ALPHA, /* U+02f998: CJK COMPATIBILITY IDEOGRAPH-2F998*/
+                                           RTUNI_ALPHA, /* U+02f999: CJK COMPATIBILITY IDEOGRAPH-2F999*/
+                                           RTUNI_ALPHA, /* U+02f99a: CJK COMPATIBILITY IDEOGRAPH-2F99A*/
+                                           RTUNI_ALPHA, /* U+02f99b: CJK COMPATIBILITY IDEOGRAPH-2F99B*/
+                                           RTUNI_ALPHA, /* U+02f99c: CJK COMPATIBILITY IDEOGRAPH-2F99C*/
+                                           RTUNI_ALPHA, /* U+02f99d: CJK COMPATIBILITY IDEOGRAPH-2F99D*/
+                                           RTUNI_ALPHA, /* U+02f99e: CJK COMPATIBILITY IDEOGRAPH-2F99E*/
+                                           RTUNI_ALPHA, /* U+02f99f: CJK COMPATIBILITY IDEOGRAPH-2F99F*/
+                                           RTUNI_ALPHA, /* U+02f9a0: CJK COMPATIBILITY IDEOGRAPH-2F9A0*/
+                                           RTUNI_ALPHA, /* U+02f9a1: CJK COMPATIBILITY IDEOGRAPH-2F9A1*/
+                                           RTUNI_ALPHA, /* U+02f9a2: CJK COMPATIBILITY IDEOGRAPH-2F9A2*/
+                                           RTUNI_ALPHA, /* U+02f9a3: CJK COMPATIBILITY IDEOGRAPH-2F9A3*/
+                                           RTUNI_ALPHA, /* U+02f9a4: CJK COMPATIBILITY IDEOGRAPH-2F9A4*/
+                                           RTUNI_ALPHA, /* U+02f9a5: CJK COMPATIBILITY IDEOGRAPH-2F9A5*/
+                                           RTUNI_ALPHA, /* U+02f9a6: CJK COMPATIBILITY IDEOGRAPH-2F9A6*/
+                                           RTUNI_ALPHA, /* U+02f9a7: CJK COMPATIBILITY IDEOGRAPH-2F9A7*/
+                                           RTUNI_ALPHA, /* U+02f9a8: CJK COMPATIBILITY IDEOGRAPH-2F9A8*/
+                                           RTUNI_ALPHA, /* U+02f9a9: CJK COMPATIBILITY IDEOGRAPH-2F9A9*/
+                                           RTUNI_ALPHA, /* U+02f9aa: CJK COMPATIBILITY IDEOGRAPH-2F9AA*/
+                                           RTUNI_ALPHA, /* U+02f9ab: CJK COMPATIBILITY IDEOGRAPH-2F9AB*/
+                                           RTUNI_ALPHA, /* U+02f9ac: CJK COMPATIBILITY IDEOGRAPH-2F9AC*/
+                                           RTUNI_ALPHA, /* U+02f9ad: CJK COMPATIBILITY IDEOGRAPH-2F9AD*/
+                                           RTUNI_ALPHA, /* U+02f9ae: CJK COMPATIBILITY IDEOGRAPH-2F9AE*/
+                                           RTUNI_ALPHA, /* U+02f9af: CJK COMPATIBILITY IDEOGRAPH-2F9AF*/
+                                           RTUNI_ALPHA, /* U+02f9b0: CJK COMPATIBILITY IDEOGRAPH-2F9B0*/
+                                           RTUNI_ALPHA, /* U+02f9b1: CJK COMPATIBILITY IDEOGRAPH-2F9B1*/
+                                           RTUNI_ALPHA, /* U+02f9b2: CJK COMPATIBILITY IDEOGRAPH-2F9B2*/
+                                           RTUNI_ALPHA, /* U+02f9b3: CJK COMPATIBILITY IDEOGRAPH-2F9B3*/
+                                           RTUNI_ALPHA, /* U+02f9b4: CJK COMPATIBILITY IDEOGRAPH-2F9B4*/
+                                           RTUNI_ALPHA, /* U+02f9b5: CJK COMPATIBILITY IDEOGRAPH-2F9B5*/
+                                           RTUNI_ALPHA, /* U+02f9b6: CJK COMPATIBILITY IDEOGRAPH-2F9B6*/
+                                           RTUNI_ALPHA, /* U+02f9b7: CJK COMPATIBILITY IDEOGRAPH-2F9B7*/
+                                           RTUNI_ALPHA, /* U+02f9b8: CJK COMPATIBILITY IDEOGRAPH-2F9B8*/
+                                           RTUNI_ALPHA, /* U+02f9b9: CJK COMPATIBILITY IDEOGRAPH-2F9B9*/
+                                           RTUNI_ALPHA, /* U+02f9ba: CJK COMPATIBILITY IDEOGRAPH-2F9BA*/
+                                           RTUNI_ALPHA, /* U+02f9bb: CJK COMPATIBILITY IDEOGRAPH-2F9BB*/
+                                           RTUNI_ALPHA, /* U+02f9bc: CJK COMPATIBILITY IDEOGRAPH-2F9BC*/
+                                           RTUNI_ALPHA, /* U+02f9bd: CJK COMPATIBILITY IDEOGRAPH-2F9BD*/
+                                           RTUNI_ALPHA, /* U+02f9be: CJK COMPATIBILITY IDEOGRAPH-2F9BE*/
+                                           RTUNI_ALPHA, /* U+02f9bf: CJK COMPATIBILITY IDEOGRAPH-2F9BF*/
+                                           RTUNI_ALPHA, /* U+02f9c0: CJK COMPATIBILITY IDEOGRAPH-2F9C0*/
+                                           RTUNI_ALPHA, /* U+02f9c1: CJK COMPATIBILITY IDEOGRAPH-2F9C1*/
+                                           RTUNI_ALPHA, /* U+02f9c2: CJK COMPATIBILITY IDEOGRAPH-2F9C2*/
+                                           RTUNI_ALPHA, /* U+02f9c3: CJK COMPATIBILITY IDEOGRAPH-2F9C3*/
+                                           RTUNI_ALPHA, /* U+02f9c4: CJK COMPATIBILITY IDEOGRAPH-2F9C4*/
+                                           RTUNI_ALPHA, /* U+02f9c5: CJK COMPATIBILITY IDEOGRAPH-2F9C5*/
+                                           RTUNI_ALPHA, /* U+02f9c6: CJK COMPATIBILITY IDEOGRAPH-2F9C6*/
+                                           RTUNI_ALPHA, /* U+02f9c7: CJK COMPATIBILITY IDEOGRAPH-2F9C7*/
+                                           RTUNI_ALPHA, /* U+02f9c8: CJK COMPATIBILITY IDEOGRAPH-2F9C8*/
+                                           RTUNI_ALPHA, /* U+02f9c9: CJK COMPATIBILITY IDEOGRAPH-2F9C9*/
+                                           RTUNI_ALPHA, /* U+02f9ca: CJK COMPATIBILITY IDEOGRAPH-2F9CA*/
+                                           RTUNI_ALPHA, /* U+02f9cb: CJK COMPATIBILITY IDEOGRAPH-2F9CB*/
+                                           RTUNI_ALPHA, /* U+02f9cc: CJK COMPATIBILITY IDEOGRAPH-2F9CC*/
+                                           RTUNI_ALPHA, /* U+02f9cd: CJK COMPATIBILITY IDEOGRAPH-2F9CD*/
+                                           RTUNI_ALPHA, /* U+02f9ce: CJK COMPATIBILITY IDEOGRAPH-2F9CE*/
+                                           RTUNI_ALPHA, /* U+02f9cf: CJK COMPATIBILITY IDEOGRAPH-2F9CF*/
+                                           RTUNI_ALPHA, /* U+02f9d0: CJK COMPATIBILITY IDEOGRAPH-2F9D0*/
+                                           RTUNI_ALPHA, /* U+02f9d1: CJK COMPATIBILITY IDEOGRAPH-2F9D1*/
+                                           RTUNI_ALPHA, /* U+02f9d2: CJK COMPATIBILITY IDEOGRAPH-2F9D2*/
+                                           RTUNI_ALPHA, /* U+02f9d3: CJK COMPATIBILITY IDEOGRAPH-2F9D3*/
+                                           RTUNI_ALPHA, /* U+02f9d4: CJK COMPATIBILITY IDEOGRAPH-2F9D4*/
+                                           RTUNI_ALPHA, /* U+02f9d5: CJK COMPATIBILITY IDEOGRAPH-2F9D5*/
+                                           RTUNI_ALPHA, /* U+02f9d6: CJK COMPATIBILITY IDEOGRAPH-2F9D6*/
+                                           RTUNI_ALPHA, /* U+02f9d7: CJK COMPATIBILITY IDEOGRAPH-2F9D7*/
+                                           RTUNI_ALPHA, /* U+02f9d8: CJK COMPATIBILITY IDEOGRAPH-2F9D8*/
+                                           RTUNI_ALPHA, /* U+02f9d9: CJK COMPATIBILITY IDEOGRAPH-2F9D9*/
+                                           RTUNI_ALPHA, /* U+02f9da: CJK COMPATIBILITY IDEOGRAPH-2F9DA*/
+                                           RTUNI_ALPHA, /* U+02f9db: CJK COMPATIBILITY IDEOGRAPH-2F9DB*/
+                                           RTUNI_ALPHA, /* U+02f9dc: CJK COMPATIBILITY IDEOGRAPH-2F9DC*/
+                                           RTUNI_ALPHA, /* U+02f9dd: CJK COMPATIBILITY IDEOGRAPH-2F9DD*/
+                                           RTUNI_ALPHA, /* U+02f9de: CJK COMPATIBILITY IDEOGRAPH-2F9DE*/
+                                           RTUNI_ALPHA, /* U+02f9df: CJK COMPATIBILITY IDEOGRAPH-2F9DF*/
+                                           RTUNI_ALPHA, /* U+02f9e0: CJK COMPATIBILITY IDEOGRAPH-2F9E0*/
+                                           RTUNI_ALPHA, /* U+02f9e1: CJK COMPATIBILITY IDEOGRAPH-2F9E1*/
+                                           RTUNI_ALPHA, /* U+02f9e2: CJK COMPATIBILITY IDEOGRAPH-2F9E2*/
+                                           RTUNI_ALPHA, /* U+02f9e3: CJK COMPATIBILITY IDEOGRAPH-2F9E3*/
+                                           RTUNI_ALPHA, /* U+02f9e4: CJK COMPATIBILITY IDEOGRAPH-2F9E4*/
+                                           RTUNI_ALPHA, /* U+02f9e5: CJK COMPATIBILITY IDEOGRAPH-2F9E5*/
+                                           RTUNI_ALPHA, /* U+02f9e6: CJK COMPATIBILITY IDEOGRAPH-2F9E6*/
+                                           RTUNI_ALPHA, /* U+02f9e7: CJK COMPATIBILITY IDEOGRAPH-2F9E7*/
+                                           RTUNI_ALPHA, /* U+02f9e8: CJK COMPATIBILITY IDEOGRAPH-2F9E8*/
+                                           RTUNI_ALPHA, /* U+02f9e9: CJK COMPATIBILITY IDEOGRAPH-2F9E9*/
+                                           RTUNI_ALPHA, /* U+02f9ea: CJK COMPATIBILITY IDEOGRAPH-2F9EA*/
+                                           RTUNI_ALPHA, /* U+02f9eb: CJK COMPATIBILITY IDEOGRAPH-2F9EB*/
+                                           RTUNI_ALPHA, /* U+02f9ec: CJK COMPATIBILITY IDEOGRAPH-2F9EC*/
+                                           RTUNI_ALPHA, /* U+02f9ed: CJK COMPATIBILITY IDEOGRAPH-2F9ED*/
+                                           RTUNI_ALPHA, /* U+02f9ee: CJK COMPATIBILITY IDEOGRAPH-2F9EE*/
+                                           RTUNI_ALPHA, /* U+02f9ef: CJK COMPATIBILITY IDEOGRAPH-2F9EF*/
+                                           RTUNI_ALPHA, /* U+02f9f0: CJK COMPATIBILITY IDEOGRAPH-2F9F0*/
+                                           RTUNI_ALPHA, /* U+02f9f1: CJK COMPATIBILITY IDEOGRAPH-2F9F1*/
+                                           RTUNI_ALPHA, /* U+02f9f2: CJK COMPATIBILITY IDEOGRAPH-2F9F2*/
+                                           RTUNI_ALPHA, /* U+02f9f3: CJK COMPATIBILITY IDEOGRAPH-2F9F3*/
+                                           RTUNI_ALPHA, /* U+02f9f4: CJK COMPATIBILITY IDEOGRAPH-2F9F4*/
+                                           RTUNI_ALPHA, /* U+02f9f5: CJK COMPATIBILITY IDEOGRAPH-2F9F5*/
+                                           RTUNI_ALPHA, /* U+02f9f6: CJK COMPATIBILITY IDEOGRAPH-2F9F6*/
+                                           RTUNI_ALPHA, /* U+02f9f7: CJK COMPATIBILITY IDEOGRAPH-2F9F7*/
+                                           RTUNI_ALPHA, /* U+02f9f8: CJK COMPATIBILITY IDEOGRAPH-2F9F8*/
+                                           RTUNI_ALPHA, /* U+02f9f9: CJK COMPATIBILITY IDEOGRAPH-2F9F9*/
+                                           RTUNI_ALPHA, /* U+02f9fa: CJK COMPATIBILITY IDEOGRAPH-2F9FA*/
+                                           RTUNI_ALPHA, /* U+02f9fb: CJK COMPATIBILITY IDEOGRAPH-2F9FB*/
+                                           RTUNI_ALPHA, /* U+02f9fc: CJK COMPATIBILITY IDEOGRAPH-2F9FC*/
+                                           RTUNI_ALPHA, /* U+02f9fd: CJK COMPATIBILITY IDEOGRAPH-2F9FD*/
+                                           RTUNI_ALPHA, /* U+02f9fe: CJK COMPATIBILITY IDEOGRAPH-2F9FE*/
+                                           RTUNI_ALPHA, /* U+02f9ff: CJK COMPATIBILITY IDEOGRAPH-2F9FF*/
+                                           RTUNI_ALPHA, /* U+02fa00: CJK COMPATIBILITY IDEOGRAPH-2FA00*/
+                                           RTUNI_ALPHA, /* U+02fa01: CJK COMPATIBILITY IDEOGRAPH-2FA01*/
+                                           RTUNI_ALPHA, /* U+02fa02: CJK COMPATIBILITY IDEOGRAPH-2FA02*/
+                                           RTUNI_ALPHA, /* U+02fa03: CJK COMPATIBILITY IDEOGRAPH-2FA03*/
+                                           RTUNI_ALPHA, /* U+02fa04: CJK COMPATIBILITY IDEOGRAPH-2FA04*/
+                                           RTUNI_ALPHA, /* U+02fa05: CJK COMPATIBILITY IDEOGRAPH-2FA05*/
+                                           RTUNI_ALPHA, /* U+02fa06: CJK COMPATIBILITY IDEOGRAPH-2FA06*/
+                                           RTUNI_ALPHA, /* U+02fa07: CJK COMPATIBILITY IDEOGRAPH-2FA07*/
+                                           RTUNI_ALPHA, /* U+02fa08: CJK COMPATIBILITY IDEOGRAPH-2FA08*/
+                                           RTUNI_ALPHA, /* U+02fa09: CJK COMPATIBILITY IDEOGRAPH-2FA09*/
+                                           RTUNI_ALPHA, /* U+02fa0a: CJK COMPATIBILITY IDEOGRAPH-2FA0A*/
+                                           RTUNI_ALPHA, /* U+02fa0b: CJK COMPATIBILITY IDEOGRAPH-2FA0B*/
+                                           RTUNI_ALPHA, /* U+02fa0c: CJK COMPATIBILITY IDEOGRAPH-2FA0C*/
+                                           RTUNI_ALPHA, /* U+02fa0d: CJK COMPATIBILITY IDEOGRAPH-2FA0D*/
+                                           RTUNI_ALPHA, /* U+02fa0e: CJK COMPATIBILITY IDEOGRAPH-2FA0E*/
+                                           RTUNI_ALPHA, /* U+02fa0f: CJK COMPATIBILITY IDEOGRAPH-2FA0F*/
+                                           RTUNI_ALPHA, /* U+02fa10: CJK COMPATIBILITY IDEOGRAPH-2FA10*/
+                                           RTUNI_ALPHA, /* U+02fa11: CJK COMPATIBILITY IDEOGRAPH-2FA11*/
+                                           RTUNI_ALPHA, /* U+02fa12: CJK COMPATIBILITY IDEOGRAPH-2FA12*/
+                                           RTUNI_ALPHA, /* U+02fa13: CJK COMPATIBILITY IDEOGRAPH-2FA13*/
+                                           RTUNI_ALPHA, /* U+02fa14: CJK COMPATIBILITY IDEOGRAPH-2FA14*/
+                                           RTUNI_ALPHA, /* U+02fa15: CJK COMPATIBILITY IDEOGRAPH-2FA15*/
+                                           RTUNI_ALPHA, /* U+02fa16: CJK COMPATIBILITY IDEOGRAPH-2FA16*/
+                                           RTUNI_ALPHA, /* U+02fa17: CJK COMPATIBILITY IDEOGRAPH-2FA17*/
+                                           RTUNI_ALPHA, /* U+02fa18: CJK COMPATIBILITY IDEOGRAPH-2FA18*/
+                                           RTUNI_ALPHA, /* U+02fa19: CJK COMPATIBILITY IDEOGRAPH-2FA19*/
+                                           RTUNI_ALPHA, /* U+02fa1a: CJK COMPATIBILITY IDEOGRAPH-2FA1A*/
+                                           RTUNI_ALPHA, /* U+02fa1b: CJK COMPATIBILITY IDEOGRAPH-2FA1B*/
+                                           RTUNI_ALPHA, /* U+02fa1c: CJK COMPATIBILITY IDEOGRAPH-2FA1C*/
+                                           RTUNI_ALPHA, /* U+02fa1d: CJK COMPATIBILITY IDEOGRAPH-2FA1D*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNIFLAGSRANGE) g_aRTUniFlagsRanges[] =
+{
+    { 0x000000, 0x003401, &g_afRTUniFlags0x000000[0] },
+    { 0x004db5, 0x004e01, &g_afRTUniFlags0x004db5[0] },
+    { 0x009fcc, 0x00d7fc, &g_afRTUniFlags0x009fcc[0] },
+    { 0x00f900, 0x01342f, &g_afRTUniFlags0x00f900[0] },
+    { 0x016800, 0x016fa0, &g_afRTUniFlags0x016800[0] },
+    { 0x01b000, 0x01b002, &g_afRTUniFlags0x01b000[0] },
+    { 0x01d400, 0x01d800, &g_afRTUniFlags0x01d400[0] },
+    { 0x01ee00, 0x01eebc, &g_afRTUniFlags0x01ee00[0] },
+    { 0x020000, 0x020001, &g_afRTUniFlags0x020000[0] },
+    { 0x02a6d6, 0x02a701, &g_afRTUniFlags0x02a6d6[0] },
+    { 0x02b734, 0x02b81e, &g_afRTUniFlags0x02b734[0] },
+    { 0x02f800, 0x02fa1e, &g_afRTUniFlags0x02f800[0] },
+    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata-lower.cpp b/src/VBox/Runtime/common/string/unidata-lower.cpp
new file mode 100644
index 0000000..085295b
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-lower.cpp
@@ -0,0 +1,3902 @@
+/* $Id: unidata-lower.cpp $ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const RTUNICP g_afRTUniLower0x000000[] =
+{
+    0x00, /* U+000000: <control>*/
+    0x01, /* U+000001: <control>*/
+    0x02, /* U+000002: <control>*/
+    0x03, /* U+000003: <control>*/
+    0x04, /* U+000004: <control>*/
+    0x05, /* U+000005: <control>*/
+    0x06, /* U+000006: <control>*/
+    0x07, /* U+000007: <control>*/
+    0x08, /* U+000008: <control>*/
+    0x09, /* U+000009: <control>*/
+    0x0a, /* U+00000a: <control>*/
+    0x0b, /* U+00000b: <control>*/
+    0x0c, /* U+00000c: <control>*/
+    0x0d, /* U+00000d: <control>*/
+    0x0e, /* U+00000e: <control>*/
+    0x0f, /* U+00000f: <control>*/
+    0x10, /* U+000010: <control>*/
+    0x11, /* U+000011: <control>*/
+    0x12, /* U+000012: <control>*/
+    0x13, /* U+000013: <control>*/
+    0x14, /* U+000014: <control>*/
+    0x15, /* U+000015: <control>*/
+    0x16, /* U+000016: <control>*/
+    0x17, /* U+000017: <control>*/
+    0x18, /* U+000018: <control>*/
+    0x19, /* U+000019: <control>*/
+    0x1a, /* U+00001a: <control>*/
+    0x1b, /* U+00001b: <control>*/
+    0x1c, /* U+00001c: <control>*/
+    0x1d, /* U+00001d: <control>*/
+    0x1e, /* U+00001e: <control>*/
+    0x1f, /* U+00001f: <control>*/
+    0x20, /* U+000020: SPACE*/
+    0x21, /* U+000021: EXCLAMATION MARK*/
+    0x22, /* U+000022: QUOTATION MARK*/
+    0x23, /* U+000023: NUMBER SIGN*/
+    0x24, /* U+000024: DOLLAR SIGN*/
+    0x25, /* U+000025: PERCENT SIGN*/
+    0x26, /* U+000026: AMPERSAND*/
+    0x27, /* U+000027: APOSTROPHE*/
+    0x28, /* U+000028: LEFT PARENTHESIS*/
+    0x29, /* U+000029: RIGHT PARENTHESIS*/
+    0x2a, /* U+00002a: ASTERISK*/
+    0x2b, /* U+00002b: PLUS SIGN*/
+    0x2c, /* U+00002c: COMMA*/
+    0x2d, /* U+00002d: HYPHEN-MINUS*/
+    0x2e, /* U+00002e: FULL STOP*/
+    0x2f, /* U+00002f: SOLIDUS*/
+    0x30, /* U+000030: DIGIT ZERO*/
+    0x31, /* U+000031: DIGIT ONE*/
+    0x32, /* U+000032: DIGIT TWO*/
+    0x33, /* U+000033: DIGIT THREE*/
+    0x34, /* U+000034: DIGIT FOUR*/
+    0x35, /* U+000035: DIGIT FIVE*/
+    0x36, /* U+000036: DIGIT SIX*/
+    0x37, /* U+000037: DIGIT SEVEN*/
+    0x38, /* U+000038: DIGIT EIGHT*/
+    0x39, /* U+000039: DIGIT NINE*/
+    0x3a, /* U+00003a: COLON*/
+    0x3b, /* U+00003b: SEMICOLON*/
+    0x3c, /* U+00003c: LESS-THAN SIGN*/
+    0x3d, /* U+00003d: EQUALS SIGN*/
+    0x3e, /* U+00003e: GREATER-THAN SIGN*/
+    0x3f, /* U+00003f: QUESTION MARK*/
+    0x40, /* U+000040: COMMERCIAL AT*/
+    0x61, /* U+000041: LATIN CAPITAL LETTER A*/
+    0x62, /* U+000042: LATIN CAPITAL LETTER B*/
+    0x63, /* U+000043: LATIN CAPITAL LETTER C*/
+    0x64, /* U+000044: LATIN CAPITAL LETTER D*/
+    0x65, /* U+000045: LATIN CAPITAL LETTER E*/
+    0x66, /* U+000046: LATIN CAPITAL LETTER F*/
+    0x67, /* U+000047: LATIN CAPITAL LETTER G*/
+    0x68, /* U+000048: LATIN CAPITAL LETTER H*/
+    0x69, /* U+000049: LATIN CAPITAL LETTER I*/
+    0x6a, /* U+00004a: LATIN CAPITAL LETTER J*/
+    0x6b, /* U+00004b: LATIN CAPITAL LETTER K*/
+    0x6c, /* U+00004c: LATIN CAPITAL LETTER L*/
+    0x6d, /* U+00004d: LATIN CAPITAL LETTER M*/
+    0x6e, /* U+00004e: LATIN CAPITAL LETTER N*/
+    0x6f, /* U+00004f: LATIN CAPITAL LETTER O*/
+    0x70, /* U+000050: LATIN CAPITAL LETTER P*/
+    0x71, /* U+000051: LATIN CAPITAL LETTER Q*/
+    0x72, /* U+000052: LATIN CAPITAL LETTER R*/
+    0x73, /* U+000053: LATIN CAPITAL LETTER S*/
+    0x74, /* U+000054: LATIN CAPITAL LETTER T*/
+    0x75, /* U+000055: LATIN CAPITAL LETTER U*/
+    0x76, /* U+000056: LATIN CAPITAL LETTER V*/
+    0x77, /* U+000057: LATIN CAPITAL LETTER W*/
+    0x78, /* U+000058: LATIN CAPITAL LETTER X*/
+    0x79, /* U+000059: LATIN CAPITAL LETTER Y*/
+    0x7a, /* U+00005a: LATIN CAPITAL LETTER Z*/
+    0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
+    0x5c, /* U+00005c: REVERSE SOLIDUS*/
+    0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
+    0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
+    0x5f, /* U+00005f: LOW LINE*/
+    0x60, /* U+000060: GRAVE ACCENT*/
+    0x61, /* U+000061: LATIN SMALL LETTER A*/
+    0x62, /* U+000062: LATIN SMALL LETTER B*/
+    0x63, /* U+000063: LATIN SMALL LETTER C*/
+    0x64, /* U+000064: LATIN SMALL LETTER D*/
+    0x65, /* U+000065: LATIN SMALL LETTER E*/
+    0x66, /* U+000066: LATIN SMALL LETTER F*/
+    0x67, /* U+000067: LATIN SMALL LETTER G*/
+    0x68, /* U+000068: LATIN SMALL LETTER H*/
+    0x69, /* U+000069: LATIN SMALL LETTER I*/
+    0x6a, /* U+00006a: LATIN SMALL LETTER J*/
+    0x6b, /* U+00006b: LATIN SMALL LETTER K*/
+    0x6c, /* U+00006c: LATIN SMALL LETTER L*/
+    0x6d, /* U+00006d: LATIN SMALL LETTER M*/
+    0x6e, /* U+00006e: LATIN SMALL LETTER N*/
+    0x6f, /* U+00006f: LATIN SMALL LETTER O*/
+    0x70, /* U+000070: LATIN SMALL LETTER P*/
+    0x71, /* U+000071: LATIN SMALL LETTER Q*/
+    0x72, /* U+000072: LATIN SMALL LETTER R*/
+    0x73, /* U+000073: LATIN SMALL LETTER S*/
+    0x74, /* U+000074: LATIN SMALL LETTER T*/
+    0x75, /* U+000075: LATIN SMALL LETTER U*/
+    0x76, /* U+000076: LATIN SMALL LETTER V*/
+    0x77, /* U+000077: LATIN SMALL LETTER W*/
+    0x78, /* U+000078: LATIN SMALL LETTER X*/
+    0x79, /* U+000079: LATIN SMALL LETTER Y*/
+    0x7a, /* U+00007a: LATIN SMALL LETTER Z*/
+    0x7b, /* U+00007b: LEFT CURLY BRACKET*/
+    0x7c, /* U+00007c: VERTICAL LINE*/
+    0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
+    0x7e, /* U+00007e: TILDE*/
+    0x7f, /* U+00007f: <control>*/
+    0x80, /* U+000080: <control>*/
+    0x81, /* U+000081: <control>*/
+    0x82, /* U+000082: <control>*/
+    0x83, /* U+000083: <control>*/
+    0x84, /* U+000084: <control>*/
+    0x85, /* U+000085: <control>*/
+    0x86, /* U+000086: <control>*/
+    0x87, /* U+000087: <control>*/
+    0x88, /* U+000088: <control>*/
+    0x89, /* U+000089: <control>*/
+    0x8a, /* U+00008a: <control>*/
+    0x8b, /* U+00008b: <control>*/
+    0x8c, /* U+00008c: <control>*/
+    0x8d, /* U+00008d: <control>*/
+    0x8e, /* U+00008e: <control>*/
+    0x8f, /* U+00008f: <control>*/
+    0x90, /* U+000090: <control>*/
+    0x91, /* U+000091: <control>*/
+    0x92, /* U+000092: <control>*/
+    0x93, /* U+000093: <control>*/
+    0x94, /* U+000094: <control>*/
+    0x95, /* U+000095: <control>*/
+    0x96, /* U+000096: <control>*/
+    0x97, /* U+000097: <control>*/
+    0x98, /* U+000098: <control>*/
+    0x99, /* U+000099: <control>*/
+    0x9a, /* U+00009a: <control>*/
+    0x9b, /* U+00009b: <control>*/
+    0x9c, /* U+00009c: <control>*/
+    0x9d, /* U+00009d: <control>*/
+    0x9e, /* U+00009e: <control>*/
+    0x9f, /* U+00009f: <control>*/
+    0xa0, /* U+0000a0: NO-BREAK SPACE*/
+    0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+    0xa2, /* U+0000a2: CENT SIGN*/
+    0xa3, /* U+0000a3: POUND SIGN*/
+    0xa4, /* U+0000a4: CURRENCY SIGN*/
+    0xa5, /* U+0000a5: YEN SIGN*/
+    0xa6, /* U+0000a6: BROKEN BAR*/
+    0xa7, /* U+0000a7: SECTION SIGN*/
+    0xa8, /* U+0000a8: DIAERESIS*/
+    0xa9, /* U+0000a9: COPYRIGHT SIGN*/
+    0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+    0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+    0xac, /* U+0000ac: NOT SIGN*/
+    0xad, /* U+0000ad: SOFT HYPHEN*/
+    0xae, /* U+0000ae: REGISTERED SIGN*/
+    0xaf, /* U+0000af: MACRON*/
+    0xb0, /* U+0000b0: DEGREE SIGN*/
+    0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
+    0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
+    0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
+    0xb4, /* U+0000b4: ACUTE ACCENT*/
+    0xb5, /* U+0000b5: MICRO SIGN*/
+    0xb6, /* U+0000b6: PILCROW SIGN*/
+    0xb7, /* U+0000b7: MIDDLE DOT*/
+    0xb8, /* U+0000b8: CEDILLA*/
+    0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
+    0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+    0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+    0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+    0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+    0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+    0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
+    0xe0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+    0xe1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+    0xe2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+    0xe3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+    0xe4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+    0xe5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+    0xe6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+    0xe7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+    0xe8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+    0xe9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+    0xea, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+    0xeb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+    0xec, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+    0xed, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+    0xee, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+    0xef, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+    0xf0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+    0xf1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+    0xf2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+    0xf3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+    0xf4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+    0xf5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+    0xf6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+    0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
+    0xf8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+    0xf9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+    0xfa, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+    0xfb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+    0xfc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+    0xfd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+    0xfe, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+    0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+    0xe0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+    0xe1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+    0xe2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+    0xe3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+    0xe4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+    0xe5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+    0xe6, /* U+0000e6: LATIN SMALL LETTER AE*/
+    0xe7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+    0xe8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+    0xe9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+    0xea, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+    0xeb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+    0xec, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+    0xed, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+    0xee, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+    0xef, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+    0xf0, /* U+0000f0: LATIN SMALL LETTER ETH*/
+    0xf1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+    0xf2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+    0xf3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+    0xf4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+    0xf5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+    0xf6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+    0xf7, /* U+0000f7: DIVISION SIGN*/
+    0xf8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+    0xf9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+    0xfa, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+    0xfb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+    0xfc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+    0xfd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+    0xfe, /* U+0000fe: LATIN SMALL LETTER THORN*/
+    0xff, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+    0x101, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+    0x101, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+    0x103, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+    0x103, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+    0x105, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+    0x105, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+    0x107, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+    0x107, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+    0x109, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+    0x109, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+    0x10b, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+    0x10b, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+    0x10d, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+    0x10d, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+    0x10f, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+    0x10f, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+    0x111, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+    0x111, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+    0x113, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+    0x113, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+    0x115, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+    0x115, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+    0x117, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+    0x117, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+    0x119, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+    0x119, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+    0x11b, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+    0x11b, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+    0x11d, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+    0x11d, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+    0x11f, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+    0x11f, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+    0x121, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+    0x121, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+    0x123, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+    0x123, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+    0x125, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+    0x125, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+    0x127, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+    0x127, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+    0x129, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+    0x129, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+    0x12b, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+    0x12b, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+    0x12d, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+    0x12d, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+    0x12f, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+    0x12f, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+    0x69, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+    0x131, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+    0x133, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+    0x133, /* U+000133: LATIN SMALL LIGATURE IJ*/
+    0x135, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+    0x135, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+    0x137, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+    0x137, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+    0x138, /* U+000138: LATIN SMALL LETTER KRA*/
+    0x13a, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+    0x13a, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+    0x13c, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+    0x13c, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+    0x13e, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+    0x13e, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+    0x140, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+    0x140, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+    0x142, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+    0x142, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+    0x144, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+    0x144, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+    0x146, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+    0x146, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+    0x148, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+    0x148, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+    0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+    0x14b, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+    0x14b, /* U+00014b: LATIN SMALL LETTER ENG*/
+    0x14d, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+    0x14d, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+    0x14f, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+    0x14f, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+    0x151, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+    0x151, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+    0x153, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+    0x153, /* U+000153: LATIN SMALL LIGATURE OE*/
+    0x155, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+    0x155, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+    0x157, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+    0x157, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+    0x159, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+    0x159, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+    0x15b, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+    0x15b, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+    0x15d, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+    0x15d, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+    0x15f, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+    0x15f, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+    0x161, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+    0x161, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+    0x163, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+    0x163, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+    0x165, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+    0x165, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+    0x167, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+    0x167, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+    0x169, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+    0x169, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+    0x16b, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+    0x16b, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+    0x16d, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+    0x16d, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+    0x16f, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+    0x16f, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+    0x171, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+    0x171, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+    0x173, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+    0x173, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+    0x175, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+    0x175, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+    0x177, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+    0x177, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+    0xff, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+    0x17a, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+    0x17a, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+    0x17c, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+    0x17c, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+    0x17e, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+    0x17e, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+    0x17f, /* U+00017f: LATIN SMALL LETTER LONG S*/
+    0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+    0x253, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+    0x183, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+    0x183, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+    0x185, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+    0x185, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+    0x254, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+    0x188, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+    0x188, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+    0x256, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+    0x257, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+    0x18c, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+    0x18c, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+    0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+    0x1dd, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+    0x259, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+    0x25b, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+    0x192, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+    0x192, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+    0x260, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+    0x263, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+    0x195, /* U+000195: LATIN SMALL LETTER HV*/
+    0x269, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+    0x268, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+    0x199, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+    0x199, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+    0x19a, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+    0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+    0x26f, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+    0x272, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+    0x19e, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+    0x275, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+    0x1a1, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+    0x1a1, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+    0x1a3, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+    0x1a3, /* U+0001a3: LATIN SMALL LETTER OI*/
+    0x1a5, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+    0x1a5, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+    0x280, /* U+0001a6: LATIN LETTER YR*/
+    0x1a8, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+    0x1a8, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+    0x283, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+    0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+    0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+    0x1ad, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+    0x1ad, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+    0x288, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+    0x1b0, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+    0x1b0, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+    0x28a, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+    0x28b, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+    0x1b4, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+    0x1b4, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+    0x1b6, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+    0x1b6, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+    0x292, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+    0x1b9, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+    0x1b9, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+    0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+    0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+    0x1bd, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+    0x1bd, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+    0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+    0x1bf, /* U+0001bf: LATIN LETTER WYNN*/
+    0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+    0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+    0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+    0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+    0x1c6, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+    0x1c6, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+    0x1c6, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+    0x1c9, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+    0x1c9, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+    0x1c9, /* U+0001c9: LATIN SMALL LETTER LJ*/
+    0x1cc, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+    0x1cc, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+    0x1cc, /* U+0001cc: LATIN SMALL LETTER NJ*/
+    0x1ce, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+    0x1ce, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+    0x1d0, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+    0x1d0, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+    0x1d2, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+    0x1d2, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+    0x1d4, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+    0x1d4, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+    0x1d6, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+    0x1d6, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+    0x1d8, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+    0x1d8, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+    0x1da, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+    0x1da, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+    0x1dc, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+    0x1dc, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+    0x1dd, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+    0x1df, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+    0x1df, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+    0x1e1, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+    0x1e1, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+    0x1e3, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+    0x1e3, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+    0x1e5, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+    0x1e5, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+    0x1e7, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+    0x1e7, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+    0x1e9, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+    0x1e9, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+    0x1eb, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+    0x1eb, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+    0x1ed, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+    0x1ed, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+    0x1ef, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+    0x1ef, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+    0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+    0x1f3, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+    0x1f3, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+    0x1f3, /* U+0001f3: LATIN SMALL LETTER DZ*/
+    0x1f5, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+    0x1f5, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+    0x195, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+    0x1bf, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+    0x1f9, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+    0x1f9, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+    0x1fb, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+    0x1fb, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+    0x1fd, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+    0x1fd, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+    0x1ff, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+    0x1ff, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+    0x201, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+    0x201, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+    0x203, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+    0x203, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+    0x205, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+    0x205, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+    0x207, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+    0x207, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+    0x209, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+    0x209, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+    0x20b, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+    0x20b, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+    0x20d, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+    0x20d, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+    0x20f, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+    0x20f, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+    0x211, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+    0x211, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+    0x213, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+    0x213, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+    0x215, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+    0x215, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+    0x217, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+    0x217, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+    0x219, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+    0x219, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+    0x21b, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+    0x21b, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+    0x21d, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+    0x21d, /* U+00021d: LATIN SMALL LETTER YOGH*/
+    0x21f, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+    0x21f, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+    0x19e, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+    0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+    0x223, /* U+000222: LATIN CAPITAL LETTER OU*/
+    0x223, /* U+000223: LATIN SMALL LETTER OU*/
+    0x225, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+    0x225, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+    0x227, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+    0x227, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+    0x229, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+    0x229, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+    0x22b, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+    0x22b, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+    0x22d, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+    0x22d, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+    0x22f, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+    0x22f, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+    0x231, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+    0x231, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+    0x233, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+    0x233, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+    0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+    0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+    0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+    0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+    0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+    0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+    0x2c65, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+    0x23c, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+    0x23c, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+    0x19a, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+    0x2c66, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+    0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+    0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+    0x242, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+    0x242, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+    0x180, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+    0x289, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+    0x28c, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+    0x247, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+    0x247, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+    0x249, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+    0x249, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+    0x24b, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+    0x24b, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+    0x24d, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+    0x24d, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+    0x24f, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+    0x24f, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+    0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
+    0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
+    0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+    0x253, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+    0x254, /* U+000254: LATIN SMALL LETTER OPEN O*/
+    0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+    0x256, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+    0x257, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+    0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+    0x259, /* U+000259: LATIN SMALL LETTER SCHWA*/
+    0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+    0x25b, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+    0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+    0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+    0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+    0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+    0x260, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+    0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+    0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+    0x263, /* U+000263: LATIN SMALL LETTER GAMMA*/
+    0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+    0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
+    0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+    0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+    0x268, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+    0x269, /* U+000269: LATIN SMALL LETTER IOTA*/
+    0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+    0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+    0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+    0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+    0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
+    0x26f, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+    0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+    0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+    0x272, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+    0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+    0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+    0x275, /* U+000275: LATIN SMALL LETTER BARRED O*/
+    0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+    0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+    0x278, /* U+000278: LATIN SMALL LETTER PHI*/
+    0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
+    0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+    0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+    0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+    0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+    0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+    0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+    0x280, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+    0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+    0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+    0x283, /* U+000283: LATIN SMALL LETTER ESH*/
+    0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+    0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+    0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+    0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
+    0x288, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+    0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
+    0x28a, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+    0x28b, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+    0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+    0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+    0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+    0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+    0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+    0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+    0x292, /* U+000292: LATIN SMALL LETTER EZH*/
+    0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+    0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+    0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+    0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+    0x297, /* U+000297: LATIN LETTER STRETCHED C*/
+    0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+    0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+    0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+    0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+    0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+    0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+    0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+    0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+    0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+    0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+    0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+    0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+    0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+    0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+    0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+    0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+    0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+    0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+    0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+    0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+    0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+    0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+    0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+    0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+    0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
+    0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+    0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
+    0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
+    0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+    0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+    0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+    0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
+    0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+    0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
+    0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+    0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+    0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+    0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+    0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+    0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+    0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+    0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+    0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+    0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+    0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+    0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+    0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+    0x2c7, /* U+0002c7: CARON*/
+    0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+    0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
+    0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+    0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+    0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+    0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+    0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+    0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+    0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+    0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+    0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+    0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+    0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
+    0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+    0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+    0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+    0x2d8, /* U+0002d8: BREVE*/
+    0x2d9, /* U+0002d9: DOT ABOVE*/
+    0x2da, /* U+0002da: RING ABOVE*/
+    0x2db, /* U+0002db: OGONEK*/
+    0x2dc, /* U+0002dc: SMALL TILDE*/
+    0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+    0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+    0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+    0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+    0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
+    0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
+    0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
+    0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+    0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+    0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+    0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+    0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+    0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+    0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+    0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+    0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
+    0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+    0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+    0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+    0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+    0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+    0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+    0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
+    0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+    0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+    0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+    0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+    0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+    0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+    0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+    0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+    0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+    0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
+    0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+    0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+    0x300, /* U+000300: COMBINING GRAVE ACCENT*/
+    0x301, /* U+000301: COMBINING ACUTE ACCENT*/
+    0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+    0x303, /* U+000303: COMBINING TILDE*/
+    0x304, /* U+000304: COMBINING MACRON*/
+    0x305, /* U+000305: COMBINING OVERLINE*/
+    0x306, /* U+000306: COMBINING BREVE*/
+    0x307, /* U+000307: COMBINING DOT ABOVE*/
+    0x308, /* U+000308: COMBINING DIAERESIS*/
+    0x309, /* U+000309: COMBINING HOOK ABOVE*/
+    0x30a, /* U+00030a: COMBINING RING ABOVE*/
+    0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+    0x30c, /* U+00030c: COMBINING CARON*/
+    0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+    0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+    0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+    0x310, /* U+000310: COMBINING CANDRABINDU*/
+    0x311, /* U+000311: COMBINING INVERTED BREVE*/
+    0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+    0x313, /* U+000313: COMBINING COMMA ABOVE*/
+    0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+    0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+    0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+    0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+    0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
+    0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
+    0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+    0x31b, /* U+00031b: COMBINING HORN*/
+    0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+    0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
+    0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
+    0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+    0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
+    0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+    0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+    0x323, /* U+000323: COMBINING DOT BELOW*/
+    0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
+    0x325, /* U+000325: COMBINING RING BELOW*/
+    0x326, /* U+000326: COMBINING COMMA BELOW*/
+    0x327, /* U+000327: COMBINING CEDILLA*/
+    0x328, /* U+000328: COMBINING OGONEK*/
+    0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+    0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
+    0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+    0x32c, /* U+00032c: COMBINING CARON BELOW*/
+    0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+    0x32e, /* U+00032e: COMBINING BREVE BELOW*/
+    0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+    0x330, /* U+000330: COMBINING TILDE BELOW*/
+    0x331, /* U+000331: COMBINING MACRON BELOW*/
+    0x332, /* U+000332: COMBINING LOW LINE*/
+    0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
+    0x334, /* U+000334: COMBINING TILDE OVERLAY*/
+    0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+    0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+    0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+    0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+    0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+    0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+    0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
+    0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
+    0x33d, /* U+00033d: COMBINING X ABOVE*/
+    0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
+    0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+    0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
+    0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
+    0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
+    0x343, /* U+000343: COMBINING GREEK KORONIS*/
+    0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+    0x345, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+    0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
+    0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+    0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+    0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+    0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+    0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+    0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+    0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+    0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+    0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
+    0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+    0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+    0x352, /* U+000352: COMBINING FERMATA*/
+    0x353, /* U+000353: COMBINING X BELOW*/
+    0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+    0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+    0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+    0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+    0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+    0x359, /* U+000359: COMBINING ASTERISK BELOW*/
+    0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+    0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+    0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+    0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
+    0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
+    0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+    0x360, /* U+000360: COMBINING DOUBLE TILDE*/
+    0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+    0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+    0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+    0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+    0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+    0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+    0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+    0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+    0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+    0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+    0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+    0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+    0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+    0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+    0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+    0x371, /* U+000370: GREEK CAPITAL LETTER HETA*/
+    0x371, /* U+000371: GREEK SMALL LETTER HETA*/
+    0x373, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+    0x373, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+    0x374, /* U+000374: GREEK NUMERAL SIGN*/
+    0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+    0x377, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+    0x377, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+    0x378, /* U+000378: */
+    0x379, /* U+000379: */
+    0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
+    0x37b, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+    0x37c, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+    0x37d, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+    0x37e, /* U+00037e: GREEK QUESTION MARK*/
+    0x37f, /* U+00037f: */
+    0x380, /* U+000380: */
+    0x381, /* U+000381: */
+    0x382, /* U+000382: */
+    0x383, /* U+000383: */
+    0x384, /* U+000384: GREEK TONOS*/
+    0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
+    0x3ac, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+    0x387, /* U+000387: GREEK ANO TELEIA*/
+    0x3ad, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+    0x3ae, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+    0x3af, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+    0x38b, /* U+00038b: */
+    0x3cc, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+    0x38d, /* U+00038d: */
+    0x3cd, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+    0x3ce, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+    0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+    0x3b1, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+    0x3b2, /* U+000392: GREEK CAPITAL LETTER BETA*/
+    0x3b3, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+    0x3b4, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+    0x3b5, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+    0x3b6, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+    0x3b7, /* U+000397: GREEK CAPITAL LETTER ETA*/
+    0x3b8, /* U+000398: GREEK CAPITAL LETTER THETA*/
+    0x3b9, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+    0x3ba, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+    0x3bb, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+    0x3bc, /* U+00039c: GREEK CAPITAL LETTER MU*/
+    0x3bd, /* U+00039d: GREEK CAPITAL LETTER NU*/
+    0x3be, /* U+00039e: GREEK CAPITAL LETTER XI*/
+    0x3bf, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+    0x3c0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+    0x3c1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+    0x3a2, /* U+0003a2: */
+    0x3c3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+    0x3c4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+    0x3c5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+    0x3c6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+    0x3c7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+    0x3c8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+    0x3c9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+    0x3ca, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+    0x3cb, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+    0x3ac, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+    0x3ad, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+    0x3ae, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+    0x3af, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+    0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+    0x3b1, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+    0x3b2, /* U+0003b2: GREEK SMALL LETTER BETA*/
+    0x3b3, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+    0x3b4, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+    0x3b5, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+    0x3b6, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+    0x3b7, /* U+0003b7: GREEK SMALL LETTER ETA*/
+    0x3b8, /* U+0003b8: GREEK SMALL LETTER THETA*/
+    0x3b9, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+    0x3ba, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+    0x3bb, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+    0x3bc, /* U+0003bc: GREEK SMALL LETTER MU*/
+    0x3bd, /* U+0003bd: GREEK SMALL LETTER NU*/
+    0x3be, /* U+0003be: GREEK SMALL LETTER XI*/
+    0x3bf, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+    0x3c0, /* U+0003c0: GREEK SMALL LETTER PI*/
+    0x3c1, /* U+0003c1: GREEK SMALL LETTER RHO*/
+    0x3c2, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+    0x3c3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+    0x3c4, /* U+0003c4: GREEK SMALL LETTER TAU*/
+    0x3c5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+    0x3c6, /* U+0003c6: GREEK SMALL LETTER PHI*/
+    0x3c7, /* U+0003c7: GREEK SMALL LETTER CHI*/
+    0x3c8, /* U+0003c8: GREEK SMALL LETTER PSI*/
+    0x3c9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+    0x3ca, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+    0x3cb, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+    0x3cc, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+    0x3cd, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+    0x3ce, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+    0x3d7, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+    0x3d0, /* U+0003d0: GREEK BETA SYMBOL*/
+    0x3d1, /* U+0003d1: GREEK THETA SYMBOL*/
+    0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+    0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+    0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+    0x3d5, /* U+0003d5: GREEK PHI SYMBOL*/
+    0x3d6, /* U+0003d6: GREEK PI SYMBOL*/
+    0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
+    0x3d9, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+    0x3d9, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+    0x3db, /* U+0003da: GREEK LETTER STIGMA*/
+    0x3db, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+    0x3dd, /* U+0003dc: GREEK LETTER DIGAMMA*/
+    0x3dd, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+    0x3df, /* U+0003de: GREEK LETTER KOPPA*/
+    0x3df, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+    0x3e1, /* U+0003e0: GREEK LETTER SAMPI*/
+    0x3e1, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+    0x3e3, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+    0x3e3, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+    0x3e5, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+    0x3e5, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+    0x3e7, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+    0x3e7, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+    0x3e9, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+    0x3e9, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+    0x3eb, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+    0x3eb, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+    0x3ed, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+    0x3ed, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+    0x3ef, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+    0x3ef, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+    0x3f0, /* U+0003f0: GREEK KAPPA SYMBOL*/
+    0x3f1, /* U+0003f1: GREEK RHO SYMBOL*/
+    0x3f2, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+    0x3f3, /* U+0003f3: GREEK LETTER YOT*/
+    0x3b8, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+    0x3f5, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+    0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+    0x3f8, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+    0x3f8, /* U+0003f8: GREEK SMALL LETTER SHO*/
+    0x3f2, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+    0x3fb, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+    0x3fb, /* U+0003fb: GREEK SMALL LETTER SAN*/
+    0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+    0x37b, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+    0x37c, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+    0x37d, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+    0x450, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+    0x451, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+    0x452, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+    0x453, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+    0x454, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+    0x455, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+    0x456, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+    0x457, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+    0x458, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+    0x459, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+    0x45a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+    0x45b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+    0x45c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+    0x45d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+    0x45e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+    0x45f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+    0x430, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+    0x431, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+    0x432, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+    0x433, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+    0x434, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+    0x435, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+    0x436, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+    0x437, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+    0x438, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+    0x439, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+    0x43a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+    0x43b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+    0x43c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+    0x43d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+    0x43e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+    0x43f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+    0x440, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+    0x441, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+    0x442, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+    0x443, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+    0x444, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+    0x445, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+    0x446, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+    0x447, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+    0x448, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+    0x449, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+    0x44a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+    0x44b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+    0x44c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+    0x44d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+    0x44e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+    0x44f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+    0x430, /* U+000430: CYRILLIC SMALL LETTER A*/
+    0x431, /* U+000431: CYRILLIC SMALL LETTER BE*/
+    0x432, /* U+000432: CYRILLIC SMALL LETTER VE*/
+    0x433, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+    0x434, /* U+000434: CYRILLIC SMALL LETTER DE*/
+    0x435, /* U+000435: CYRILLIC SMALL LETTER IE*/
+    0x436, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+    0x437, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+    0x438, /* U+000438: CYRILLIC SMALL LETTER I*/
+    0x439, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+    0x43a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+    0x43b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+    0x43c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+    0x43d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+    0x43e, /* U+00043e: CYRILLIC SMALL LETTER O*/
+    0x43f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+    0x440, /* U+000440: CYRILLIC SMALL LETTER ER*/
+    0x441, /* U+000441: CYRILLIC SMALL LETTER ES*/
+    0x442, /* U+000442: CYRILLIC SMALL LETTER TE*/
+    0x443, /* U+000443: CYRILLIC SMALL LETTER U*/
+    0x444, /* U+000444: CYRILLIC SMALL LETTER EF*/
+    0x445, /* U+000445: CYRILLIC SMALL LETTER HA*/
+    0x446, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+    0x447, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+    0x448, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+    0x449, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+    0x44a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+    0x44b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+    0x44c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+    0x44d, /* U+00044d: CYRILLIC SMALL LETTER E*/
+    0x44e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+    0x44f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+    0x450, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+    0x451, /* U+000451: CYRILLIC SMALL LETTER IO*/
+    0x452, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+    0x453, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+    0x454, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+    0x455, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+    0x456, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+    0x457, /* U+000457: CYRILLIC SMALL LETTER YI*/
+    0x458, /* U+000458: CYRILLIC SMALL LETTER JE*/
+    0x459, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+    0x45a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+    0x45b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+    0x45c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+    0x45d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+    0x45e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+    0x45f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+    0x461, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+    0x461, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+    0x463, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+    0x463, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+    0x465, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+    0x465, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+    0x467, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+    0x467, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+    0x469, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+    0x469, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+    0x46b, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+    0x46b, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+    0x46d, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+    0x46d, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+    0x46f, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+    0x46f, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+    0x471, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+    0x471, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+    0x473, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+    0x473, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+    0x475, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+    0x475, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+    0x477, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+    0x477, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+    0x479, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+    0x479, /* U+000479: CYRILLIC SMALL LETTER UK*/
+    0x47b, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+    0x47b, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+    0x47d, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+    0x47d, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+    0x47f, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+    0x47f, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+    0x481, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+    0x481, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+    0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+    0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
+    0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+    0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+    0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+    0x487, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+    0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+    0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+    0x48b, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+    0x48b, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+    0x48d, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+    0x48d, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+    0x48f, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+    0x48f, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+    0x491, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+    0x491, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+    0x493, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+    0x493, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+    0x495, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+    0x495, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+    0x497, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+    0x497, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+    0x499, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+    0x499, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+    0x49b, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+    0x49b, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+    0x49d, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+    0x49d, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+    0x49f, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+    0x49f, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+    0x4a1, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+    0x4a1, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+    0x4a3, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+    0x4a3, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+    0x4a5, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+    0x4a5, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+    0x4a7, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+    0x4a7, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+    0x4a9, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+    0x4a9, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+    0x4ab, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+    0x4ab, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+    0x4ad, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+    0x4ad, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+    0x4af, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+    0x4af, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+    0x4b1, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+    0x4b1, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+    0x4b3, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+    0x4b3, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+    0x4b5, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+    0x4b5, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+    0x4b7, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+    0x4b7, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+    0x4b9, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+    0x4b9, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+    0x4bb, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+    0x4bb, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+    0x4bd, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+    0x4bd, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+    0x4bf, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+    0x4bf, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+    0x4cf, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+    0x4c2, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+    0x4c2, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+    0x4c4, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+    0x4c4, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+    0x4c6, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+    0x4c6, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+    0x4c8, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+    0x4c8, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+    0x4ca, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+    0x4ca, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+    0x4cc, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+    0x4cc, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+    0x4ce, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+    0x4ce, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+    0x4cf, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+    0x4d1, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+    0x4d1, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+    0x4d3, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+    0x4d3, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+    0x4d5, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+    0x4d5, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+    0x4d7, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+    0x4d7, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+    0x4d9, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+    0x4d9, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+    0x4db, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+    0x4db, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+    0x4dd, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+    0x4dd, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+    0x4df, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+    0x4df, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+    0x4e1, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+    0x4e1, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+    0x4e3, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+    0x4e3, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+    0x4e5, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+    0x4e5, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+    0x4e7, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+    0x4e7, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+    0x4e9, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+    0x4e9, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+    0x4eb, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+    0x4eb, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+    0x4ed, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+    0x4ed, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+    0x4ef, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+    0x4ef, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+    0x4f1, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+    0x4f1, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+    0x4f3, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+    0x4f3, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+    0x4f5, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+    0x4f5, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+    0x4f7, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+    0x4f7, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+    0x4f9, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+    0x4f9, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+    0x4fb, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+    0x4fb, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+    0x4fd, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+    0x4fd, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+    0x4ff, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+    0x4ff, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+    0x501, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+    0x501, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+    0x503, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+    0x503, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+    0x505, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+    0x505, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+    0x507, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+    0x507, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+    0x509, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+    0x509, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+    0x50b, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+    0x50b, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+    0x50d, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+    0x50d, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+    0x50f, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+    0x50f, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+    0x511, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+    0x511, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+    0x513, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+    0x513, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+    0x515, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+    0x515, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+    0x517, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+    0x517, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+    0x519, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+    0x519, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+    0x51b, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+    0x51b, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+    0x51d, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+    0x51d, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+    0x51f, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+    0x51f, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+    0x521, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+    0x521, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+    0x523, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+    0x523, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+    0x525, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+    0x525, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+    0x527, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+    0x527, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+    0x528, /* U+000528: */
+    0x529, /* U+000529: */
+    0x52a, /* U+00052a: */
+    0x52b, /* U+00052b: */
+    0x52c, /* U+00052c: */
+    0x52d, /* U+00052d: */
+    0x52e, /* U+00052e: */
+    0x52f, /* U+00052f: */
+    0x530, /* U+000530: */
+    0x561, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+    0x562, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+    0x563, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+    0x564, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+    0x565, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+    0x566, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+    0x567, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+    0x568, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+    0x569, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+    0x56a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+    0x56b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+    0x56c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+    0x56d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+    0x56e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+    0x56f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+    0x570, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+    0x571, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+    0x572, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+    0x573, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+    0x574, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+    0x575, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+    0x576, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+    0x577, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+    0x578, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+    0x579, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+    0x57a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+    0x57b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+    0x57c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+    0x57d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+    0x57e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+    0x57f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+    0x580, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+    0x581, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+    0x582, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+    0x583, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+    0x584, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+    0x585, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+    0x586, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+};
+
+static const RTUNICP g_afRTUniLower0x0010a0[] =
+{
+    0x2d00, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
+    0x2d01, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
+    0x2d02, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
+    0x2d03, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
+    0x2d04, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
+    0x2d05, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
+    0x2d06, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
+    0x2d07, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
+    0x2d08, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
+    0x2d09, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
+    0x2d0a, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
+    0x2d0b, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
+    0x2d0c, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
+    0x2d0d, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
+    0x2d0e, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
+    0x2d0f, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
+    0x2d10, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
+    0x2d11, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
+    0x2d12, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
+    0x2d13, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
+    0x2d14, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
+    0x2d15, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
+    0x2d16, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
+    0x2d17, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
+    0x2d18, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
+    0x2d19, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
+    0x2d1a, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
+    0x2d1b, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
+    0x2d1c, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
+    0x2d1d, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
+    0x2d1e, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
+    0x2d1f, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
+    0x2d20, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
+    0x2d21, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
+    0x2d22, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
+    0x2d23, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
+    0x2d24, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
+    0x2d25, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
+    0x10c6, /* U+0010c6: */
+    0x2d27, /* U+0010c7: GEORGIAN CAPITAL LETTER YN*/
+    0x10c8, /* U+0010c8: */
+    0x10c9, /* U+0010c9: */
+    0x10ca, /* U+0010ca: */
+    0x10cb, /* U+0010cb: */
+    0x10cc, /* U+0010cc: */
+    0x2d2d, /* U+0010cd: GEORGIAN CAPITAL LETTER AEN*/
+};
+
+static const RTUNICP g_afRTUniLower0x001e00[] =
+{
+    0x1e01, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+    0x1e01, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+    0x1e03, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+    0x1e03, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+    0x1e05, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+    0x1e05, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+    0x1e07, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+    0x1e07, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+    0x1e09, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+    0x1e09, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+    0x1e0b, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+    0x1e0b, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+    0x1e0d, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+    0x1e0d, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+    0x1e0f, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+    0x1e0f, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+    0x1e11, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+    0x1e11, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+    0x1e13, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+    0x1e13, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+    0x1e15, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+    0x1e15, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+    0x1e17, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+    0x1e17, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+    0x1e19, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+    0x1e19, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+    0x1e1b, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+    0x1e1b, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+    0x1e1d, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+    0x1e1d, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+    0x1e1f, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+    0x1e1f, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+    0x1e21, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+    0x1e21, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+    0x1e23, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+    0x1e23, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+    0x1e25, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+    0x1e25, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+    0x1e27, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+    0x1e27, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+    0x1e29, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+    0x1e29, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+    0x1e2b, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+    0x1e2b, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+    0x1e2d, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+    0x1e2d, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+    0x1e2f, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+    0x1e2f, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+    0x1e31, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+    0x1e31, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+    0x1e33, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+    0x1e33, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+    0x1e35, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+    0x1e35, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+    0x1e37, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+    0x1e37, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+    0x1e39, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+    0x1e39, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+    0x1e3b, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+    0x1e3b, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+    0x1e3d, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+    0x1e3d, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+    0x1e3f, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+    0x1e3f, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+    0x1e41, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+    0x1e41, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+    0x1e43, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+    0x1e43, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+    0x1e45, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+    0x1e45, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+    0x1e47, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+    0x1e47, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+    0x1e49, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+    0x1e49, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+    0x1e4b, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+    0x1e4b, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+    0x1e4d, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+    0x1e4d, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+    0x1e4f, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+    0x1e4f, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+    0x1e51, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+    0x1e51, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+    0x1e53, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+    0x1e53, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+    0x1e55, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+    0x1e55, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+    0x1e57, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+    0x1e57, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+    0x1e59, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+    0x1e59, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+    0x1e5b, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+    0x1e5b, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+    0x1e5d, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+    0x1e5d, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+    0x1e5f, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+    0x1e5f, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+    0x1e61, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+    0x1e61, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+    0x1e63, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+    0x1e63, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+    0x1e65, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+    0x1e65, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+    0x1e67, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+    0x1e67, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+    0x1e69, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+    0x1e69, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+    0x1e6b, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+    0x1e6b, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+    0x1e6d, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+    0x1e6d, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+    0x1e6f, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+    0x1e6f, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+    0x1e71, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+    0x1e71, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+    0x1e73, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+    0x1e73, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+    0x1e75, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+    0x1e75, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+    0x1e77, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+    0x1e77, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+    0x1e79, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+    0x1e79, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+    0x1e7b, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+    0x1e7b, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+    0x1e7d, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+    0x1e7d, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+    0x1e7f, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+    0x1e7f, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+    0x1e81, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+    0x1e81, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+    0x1e83, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+    0x1e83, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+    0x1e85, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+    0x1e85, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+    0x1e87, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+    0x1e87, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+    0x1e89, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+    0x1e89, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+    0x1e8b, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+    0x1e8b, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+    0x1e8d, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+    0x1e8d, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+    0x1e8f, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+    0x1e8f, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+    0x1e91, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+    0x1e91, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+    0x1e93, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+    0x1e93, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+    0x1e95, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+    0x1e95, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+    0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+    0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+    0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+    0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+    0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+    0x1e9b, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+    0x1e9c, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+    0x1e9d, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+    0xdf, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+    0x1e9f, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+    0x1ea1, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+    0x1ea1, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+    0x1ea3, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+    0x1ea3, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+    0x1ea5, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+    0x1ea5, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+    0x1ea7, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+    0x1ea7, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+    0x1ea9, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ea9, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1eab, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+    0x1eab, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+    0x1ead, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ead, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1eaf, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+    0x1eaf, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+    0x1eb1, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+    0x1eb1, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+    0x1eb3, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+    0x1eb3, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+    0x1eb5, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+    0x1eb5, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+    0x1eb7, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+    0x1eb7, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+    0x1eb9, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+    0x1eb9, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+    0x1ebb, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+    0x1ebb, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+    0x1ebd, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+    0x1ebd, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+    0x1ebf, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+    0x1ebf, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+    0x1ec1, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+    0x1ec1, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+    0x1ec3, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ec3, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ec5, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+    0x1ec5, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+    0x1ec7, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ec7, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ec9, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+    0x1ec9, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+    0x1ecb, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+    0x1ecb, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+    0x1ecd, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+    0x1ecd, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+    0x1ecf, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+    0x1ecf, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+    0x1ed1, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+    0x1ed1, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+    0x1ed3, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+    0x1ed3, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+    0x1ed5, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ed5, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ed7, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+    0x1ed7, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+    0x1ed9, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ed9, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1edb, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+    0x1edb, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+    0x1edd, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+    0x1edd, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+    0x1edf, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+    0x1edf, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+    0x1ee1, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+    0x1ee1, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+    0x1ee3, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+    0x1ee3, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+    0x1ee5, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+    0x1ee5, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+    0x1ee7, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+    0x1ee7, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+    0x1ee9, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+    0x1ee9, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+    0x1eeb, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+    0x1eeb, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+    0x1eed, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+    0x1eed, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+    0x1eef, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+    0x1eef, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+    0x1ef1, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+    0x1ef1, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+    0x1ef3, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+    0x1ef3, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+    0x1ef5, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+    0x1ef5, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+    0x1ef7, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+    0x1ef7, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+    0x1ef9, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+    0x1ef9, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+    0x1efb, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+    0x1efb, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+    0x1efd, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+    0x1efd, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+    0x1eff, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+    0x1eff, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+    0x1f00, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+    0x1f01, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+    0x1f02, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+    0x1f03, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+    0x1f04, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+    0x1f05, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+    0x1f06, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+    0x1f07, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+    0x1f00, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+    0x1f01, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+    0x1f02, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+    0x1f03, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+    0x1f04, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+    0x1f05, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+    0x1f06, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+    0x1f07, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+    0x1f10, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+    0x1f11, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+    0x1f12, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+    0x1f13, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+    0x1f14, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+    0x1f15, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+    0x1f16, /* U+001f16: */
+    0x1f17, /* U+001f17: */
+    0x1f10, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+    0x1f11, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+    0x1f12, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+    0x1f13, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+    0x1f14, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+    0x1f15, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+    0x1f1e, /* U+001f1e: */
+    0x1f1f, /* U+001f1f: */
+    0x1f20, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+    0x1f21, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+    0x1f22, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+    0x1f23, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+    0x1f24, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+    0x1f25, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+    0x1f26, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+    0x1f27, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+    0x1f20, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+    0x1f21, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+    0x1f22, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+    0x1f23, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+    0x1f24, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+    0x1f25, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+    0x1f26, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+    0x1f27, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+    0x1f30, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+    0x1f31, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+    0x1f32, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+    0x1f33, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+    0x1f34, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+    0x1f35, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+    0x1f36, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+    0x1f37, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+    0x1f30, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+    0x1f31, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+    0x1f32, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+    0x1f33, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+    0x1f34, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+    0x1f35, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+    0x1f36, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+    0x1f37, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+    0x1f40, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+    0x1f41, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+    0x1f42, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+    0x1f43, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+    0x1f44, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+    0x1f45, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+    0x1f46, /* U+001f46: */
+    0x1f47, /* U+001f47: */
+    0x1f40, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+    0x1f41, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+    0x1f42, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+    0x1f43, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+    0x1f44, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+    0x1f45, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+    0x1f4e, /* U+001f4e: */
+    0x1f4f, /* U+001f4f: */
+    0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+    0x1f51, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+    0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+    0x1f53, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+    0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+    0x1f55, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+    0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+    0x1f57, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+    0x1f58, /* U+001f58: */
+    0x1f51, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+    0x1f5a, /* U+001f5a: */
+    0x1f53, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+    0x1f5c, /* U+001f5c: */
+    0x1f55, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+    0x1f5e, /* U+001f5e: */
+    0x1f57, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+    0x1f60, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+    0x1f61, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+    0x1f62, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+    0x1f63, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+    0x1f64, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+    0x1f65, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+    0x1f66, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+    0x1f67, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+    0x1f60, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+    0x1f61, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+    0x1f62, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+    0x1f63, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+    0x1f64, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+    0x1f65, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+    0x1f66, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+    0x1f67, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+    0x1f70, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+    0x1f71, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+    0x1f72, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+    0x1f73, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+    0x1f74, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+    0x1f75, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+    0x1f76, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+    0x1f77, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+    0x1f78, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+    0x1f79, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+    0x1f7a, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+    0x1f7b, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+    0x1f7c, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+    0x1f7d, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+    0x1f7e, /* U+001f7e: */
+    0x1f7f, /* U+001f7f: */
+    0x1f80, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1f81, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1f82, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1f83, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1f84, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1f85, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1f86, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f87, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f80, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1f81, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1f82, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1f83, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1f84, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1f85, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1f86, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f87, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f90, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1f91, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1f92, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1f93, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1f94, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1f95, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1f96, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f97, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f90, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1f91, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1f92, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1f93, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1f94, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1f95, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1f96, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f97, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1fa0, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1fa1, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1fa2, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1fa3, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1fa4, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1fa5, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1fa6, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fa7, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fa0, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1fa1, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1fa2, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1fa3, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1fa4, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1fa5, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1fa6, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1fa7, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1fb0, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+    0x1fb1, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+    0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1fb3, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+    0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1fb5, /* U+001fb5: */
+    0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+    0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fb0, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+    0x1fb1, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+    0x1f70, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+    0x1f71, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+    0x1fb3, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+    0x1fbd, /* U+001fbd: GREEK KORONIS*/
+    0x1fbe, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+    0x1fbf, /* U+001fbf: GREEK PSILI*/
+    0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
+    0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+    0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1fc3, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+    0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1fc5, /* U+001fc5: */
+    0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+    0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f72, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+    0x1f73, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+    0x1f74, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+    0x1f75, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+    0x1fc3, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+    0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
+    0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
+    0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+    0x1fd0, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+    0x1fd1, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+    0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+    0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+    0x1fd4, /* U+001fd4: */
+    0x1fd5, /* U+001fd5: */
+    0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+    0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+    0x1fd0, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+    0x1fd1, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+    0x1f76, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+    0x1f77, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+    0x1fdc, /* U+001fdc: */
+    0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
+    0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
+    0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+    0x1fe0, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+    0x1fe1, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+    0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+    0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+    0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+    0x1fe5, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+    0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+    0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+    0x1fe0, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+    0x1fe1, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+    0x1f7a, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+    0x1f7b, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+    0x1fe5, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+    0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+    0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+    0x1fef, /* U+001fef: GREEK VARIA*/
+    0x1ff0, /* U+001ff0: */
+    0x1ff1, /* U+001ff1: */
+    0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1ff3, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+    0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1ff5, /* U+001ff5: */
+    0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+    0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f78, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+    0x1f79, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+    0x1f7c, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+    0x1f7d, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+    0x1ff3, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+    0x1ffd, /* U+001ffd: GREEK OXIA*/
+    0x1ffe, /* U+001ffe: GREEK DASIA*/
+    0x1fff, /* U+001fff: */
+    0x2000, /* U+002000: EN QUAD*/
+    0x2001, /* U+002001: EM QUAD*/
+    0x2002, /* U+002002: EN SPACE*/
+    0x2003, /* U+002003: EM SPACE*/
+    0x2004, /* U+002004: THREE-PER-EM SPACE*/
+    0x2005, /* U+002005: FOUR-PER-EM SPACE*/
+    0x2006, /* U+002006: SIX-PER-EM SPACE*/
+    0x2007, /* U+002007: FIGURE SPACE*/
+    0x2008, /* U+002008: PUNCTUATION SPACE*/
+    0x2009, /* U+002009: THIN SPACE*/
+    0x200a, /* U+00200a: HAIR SPACE*/
+    0x200b, /* U+00200b: ZERO WIDTH SPACE*/
+    0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
+    0x200d, /* U+00200d: ZERO WIDTH JOINER*/
+    0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
+    0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
+    0x2010, /* U+002010: HYPHEN*/
+    0x2011, /* U+002011: NON-BREAKING HYPHEN*/
+    0x2012, /* U+002012: FIGURE DASH*/
+    0x2013, /* U+002013: EN DASH*/
+    0x2014, /* U+002014: EM DASH*/
+    0x2015, /* U+002015: HORIZONTAL BAR*/
+    0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
+    0x2017, /* U+002017: DOUBLE LOW LINE*/
+    0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+    0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+    0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+    0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+    0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+    0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+    0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+    0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+    0x2020, /* U+002020: DAGGER*/
+    0x2021, /* U+002021: DOUBLE DAGGER*/
+    0x2022, /* U+002022: BULLET*/
+    0x2023, /* U+002023: TRIANGULAR BULLET*/
+    0x2024, /* U+002024: ONE DOT LEADER*/
+    0x2025, /* U+002025: TWO DOT LEADER*/
+    0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
+    0x2027, /* U+002027: HYPHENATION POINT*/
+    0x2028, /* U+002028: LINE SEPARATOR*/
+    0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
+    0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+    0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+    0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+    0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+    0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+    0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
+    0x2030, /* U+002030: PER MILLE SIGN*/
+    0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
+    0x2032, /* U+002032: PRIME*/
+    0x2033, /* U+002033: DOUBLE PRIME*/
+    0x2034, /* U+002034: TRIPLE PRIME*/
+    0x2035, /* U+002035: REVERSED PRIME*/
+    0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
+    0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
+    0x2038, /* U+002038: CARET*/
+    0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+    0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+    0x203b, /* U+00203b: REFERENCE MARK*/
+    0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+    0x203d, /* U+00203d: INTERROBANG*/
+    0x203e, /* U+00203e: OVERLINE*/
+    0x203f, /* U+00203f: UNDERTIE*/
+    0x2040, /* U+002040: CHARACTER TIE*/
+    0x2041, /* U+002041: CARET INSERTION POINT*/
+    0x2042, /* U+002042: ASTERISM*/
+    0x2043, /* U+002043: HYPHEN BULLET*/
+    0x2044, /* U+002044: FRACTION SLASH*/
+    0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+    0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+    0x2047, /* U+002047: DOUBLE QUESTION MARK*/
+    0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
+    0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
+    0x204a, /* U+00204a: TIRONIAN SIGN ET*/
+    0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
+    0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
+    0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+    0x204e, /* U+00204e: LOW ASTERISK*/
+    0x204f, /* U+00204f: REVERSED SEMICOLON*/
+    0x2050, /* U+002050: CLOSE UP*/
+    0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+    0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
+    0x2053, /* U+002053: SWUNG DASH*/
+    0x2054, /* U+002054: INVERTED UNDERTIE*/
+    0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
+    0x2056, /* U+002056: THREE DOT PUNCTUATION*/
+    0x2057, /* U+002057: QUADRUPLE PRIME*/
+    0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
+    0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
+    0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
+    0x205b, /* U+00205b: FOUR DOT MARK*/
+    0x205c, /* U+00205c: DOTTED CROSS*/
+    0x205d, /* U+00205d: TRICOLON*/
+    0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
+    0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+    0x2060, /* U+002060: WORD JOINER*/
+    0x2061, /* U+002061: FUNCTION APPLICATION*/
+    0x2062, /* U+002062: INVISIBLE TIMES*/
+    0x2063, /* U+002063: INVISIBLE SEPARATOR*/
+    0x2064, /* U+002064: INVISIBLE PLUS*/
+    0x2065, /* U+002065: */
+    0x2066, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+    0x2067, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+    0x2068, /* U+002068: FIRST STRONG ISOLATE*/
+    0x2069, /* U+002069: POP DIRECTIONAL ISOLATE*/
+    0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+    0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+    0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+    0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+    0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
+    0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
+    0x2070, /* U+002070: SUPERSCRIPT ZERO*/
+    0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+    0x2072, /* U+002072: */
+    0x2073, /* U+002073: */
+    0x2074, /* U+002074: SUPERSCRIPT FOUR*/
+    0x2075, /* U+002075: SUPERSCRIPT FIVE*/
+    0x2076, /* U+002076: SUPERSCRIPT SIX*/
+    0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
+    0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
+    0x2079, /* U+002079: SUPERSCRIPT NINE*/
+    0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+    0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
+    0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+    0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+    0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+    0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+    0x2080, /* U+002080: SUBSCRIPT ZERO*/
+    0x2081, /* U+002081: SUBSCRIPT ONE*/
+    0x2082, /* U+002082: SUBSCRIPT TWO*/
+    0x2083, /* U+002083: SUBSCRIPT THREE*/
+    0x2084, /* U+002084: SUBSCRIPT FOUR*/
+    0x2085, /* U+002085: SUBSCRIPT FIVE*/
+    0x2086, /* U+002086: SUBSCRIPT SIX*/
+    0x2087, /* U+002087: SUBSCRIPT SEVEN*/
+    0x2088, /* U+002088: SUBSCRIPT EIGHT*/
+    0x2089, /* U+002089: SUBSCRIPT NINE*/
+    0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+    0x208b, /* U+00208b: SUBSCRIPT MINUS*/
+    0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+    0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+    0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+    0x208f, /* U+00208f: */
+    0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+    0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+    0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+    0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+    0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+    0x2095, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+    0x2096, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+    0x2097, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+    0x2098, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+    0x2099, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+    0x209a, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+    0x209b, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+    0x209c, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+    0x209d, /* U+00209d: */
+    0x209e, /* U+00209e: */
+    0x209f, /* U+00209f: */
+    0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
+    0x20a1, /* U+0020a1: COLON SIGN*/
+    0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
+    0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
+    0x20a4, /* U+0020a4: LIRA SIGN*/
+    0x20a5, /* U+0020a5: MILL SIGN*/
+    0x20a6, /* U+0020a6: NAIRA SIGN*/
+    0x20a7, /* U+0020a7: PESETA SIGN*/
+    0x20a8, /* U+0020a8: RUPEE SIGN*/
+    0x20a9, /* U+0020a9: WON SIGN*/
+    0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
+    0x20ab, /* U+0020ab: DONG SIGN*/
+    0x20ac, /* U+0020ac: EURO SIGN*/
+    0x20ad, /* U+0020ad: KIP SIGN*/
+    0x20ae, /* U+0020ae: TUGRIK SIGN*/
+    0x20af, /* U+0020af: DRACHMA SIGN*/
+    0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
+    0x20b1, /* U+0020b1: PESO SIGN*/
+    0x20b2, /* U+0020b2: GUARANI SIGN*/
+    0x20b3, /* U+0020b3: AUSTRAL SIGN*/
+    0x20b4, /* U+0020b4: HRYVNIA SIGN*/
+    0x20b5, /* U+0020b5: CEDI SIGN*/
+    0x20b6, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+    0x20b7, /* U+0020b7: SPESMILO SIGN*/
+    0x20b8, /* U+0020b8: TENGE SIGN*/
+    0x20b9, /* U+0020b9: INDIAN RUPEE SIGN*/
+    0x20ba, /* U+0020ba: TURKISH LIRA SIGN*/
+    0x20bb, /* U+0020bb: */
+    0x20bc, /* U+0020bc: */
+    0x20bd, /* U+0020bd: */
+    0x20be, /* U+0020be: */
+    0x20bf, /* U+0020bf: */
+    0x20c0, /* U+0020c0: */
+    0x20c1, /* U+0020c1: */
+    0x20c2, /* U+0020c2: */
+    0x20c3, /* U+0020c3: */
+    0x20c4, /* U+0020c4: */
+    0x20c5, /* U+0020c5: */
+    0x20c6, /* U+0020c6: */
+    0x20c7, /* U+0020c7: */
+    0x20c8, /* U+0020c8: */
+    0x20c9, /* U+0020c9: */
+    0x20ca, /* U+0020ca: */
+    0x20cb, /* U+0020cb: */
+    0x20cc, /* U+0020cc: */
+    0x20cd, /* U+0020cd: */
+    0x20ce, /* U+0020ce: */
+    0x20cf, /* U+0020cf: */
+    0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+    0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+    0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+    0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+    0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+    0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+    0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+    0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+    0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
+    0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+    0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+    0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+    0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+    0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+    0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+    0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+    0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+    0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+    0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+    0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+    0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+    0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+    0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+    0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+    0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+    0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+    0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+    0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+    0x20ec, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x20ed, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x20ee, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+    0x20ef, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+    0x20f0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+    0x20f1, /* U+0020f1: */
+    0x20f2, /* U+0020f2: */
+    0x20f3, /* U+0020f3: */
+    0x20f4, /* U+0020f4: */
+    0x20f5, /* U+0020f5: */
+    0x20f6, /* U+0020f6: */
+    0x20f7, /* U+0020f7: */
+    0x20f8, /* U+0020f8: */
+    0x20f9, /* U+0020f9: */
+    0x20fa, /* U+0020fa: */
+    0x20fb, /* U+0020fb: */
+    0x20fc, /* U+0020fc: */
+    0x20fd, /* U+0020fd: */
+    0x20fe, /* U+0020fe: */
+    0x20ff, /* U+0020ff: */
+    0x2100, /* U+002100: ACCOUNT OF*/
+    0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
+    0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+    0x2103, /* U+002103: DEGREE CELSIUS*/
+    0x2104, /* U+002104: CENTRE LINE SYMBOL*/
+    0x2105, /* U+002105: CARE OF*/
+    0x2106, /* U+002106: CADA UNA*/
+    0x2107, /* U+002107: EULER CONSTANT*/
+    0x2108, /* U+002108: SCRUPLE*/
+    0x2109, /* U+002109: DEGREE FAHRENHEIT*/
+    0x210a, /* U+00210a: SCRIPT SMALL G*/
+    0x210b, /* U+00210b: SCRIPT CAPITAL H*/
+    0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
+    0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+    0x210e, /* U+00210e: PLANCK CONSTANT*/
+    0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+    0x2110, /* U+002110: SCRIPT CAPITAL I*/
+    0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
+    0x2112, /* U+002112: SCRIPT CAPITAL L*/
+    0x2113, /* U+002113: SCRIPT SMALL L*/
+    0x2114, /* U+002114: L B BAR SYMBOL*/
+    0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+    0x2116, /* U+002116: NUMERO SIGN*/
+    0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
+    0x2118, /* U+002118: SCRIPT CAPITAL P*/
+    0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+    0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+    0x211b, /* U+00211b: SCRIPT CAPITAL R*/
+    0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
+    0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+    0x211e, /* U+00211e: PRESCRIPTION TAKE*/
+    0x211f, /* U+00211f: RESPONSE*/
+    0x2120, /* U+002120: SERVICE MARK*/
+    0x2121, /* U+002121: TELEPHONE SIGN*/
+    0x2122, /* U+002122: TRADE MARK SIGN*/
+    0x2123, /* U+002123: VERSICLE*/
+    0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+    0x2125, /* U+002125: OUNCE SIGN*/
+    0x3c9, /* U+002126: OHM SIGN*/
+    0x2127, /* U+002127: INVERTED OHM SIGN*/
+    0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
+    0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+    0x6b, /* U+00212a: KELVIN SIGN*/
+    0xe5, /* U+00212b: ANGSTROM SIGN*/
+    0x212c, /* U+00212c: SCRIPT CAPITAL B*/
+    0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
+    0x212e, /* U+00212e: ESTIMATED SYMBOL*/
+    0x212f, /* U+00212f: SCRIPT SMALL E*/
+    0x2130, /* U+002130: SCRIPT CAPITAL E*/
+    0x2131, /* U+002131: SCRIPT CAPITAL F*/
+    0x214e, /* U+002132: TURNED CAPITAL F*/
+    0x2133, /* U+002133: SCRIPT CAPITAL M*/
+    0x2134, /* U+002134: SCRIPT SMALL O*/
+    0x2135, /* U+002135: ALEF SYMBOL*/
+    0x2136, /* U+002136: BET SYMBOL*/
+    0x2137, /* U+002137: GIMEL SYMBOL*/
+    0x2138, /* U+002138: DALET SYMBOL*/
+    0x2139, /* U+002139: INFORMATION SOURCE*/
+    0x213a, /* U+00213a: ROTATED CAPITAL Q*/
+    0x213b, /* U+00213b: FACSIMILE SIGN*/
+    0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+    0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+    0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+    0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+    0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+    0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+    0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+    0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+    0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+    0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+    0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+    0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+    0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+    0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+    0x214a, /* U+00214a: PROPERTY LINE*/
+    0x214b, /* U+00214b: TURNED AMPERSAND*/
+    0x214c, /* U+00214c: PER SIGN*/
+    0x214d, /* U+00214d: AKTIESELSKAB*/
+    0x214e, /* U+00214e: TURNED SMALL F*/
+    0x214f, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+    0x2150, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+    0x2151, /* U+002151: VULGAR FRACTION ONE NINTH*/
+    0x2152, /* U+002152: VULGAR FRACTION ONE TENTH*/
+    0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
+    0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+    0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+    0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+    0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+    0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+    0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+    0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+    0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+    0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+    0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+    0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+    0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
+    0x2170, /* U+002160: ROMAN NUMERAL ONE*/
+    0x2171, /* U+002161: ROMAN NUMERAL TWO*/
+    0x2172, /* U+002162: ROMAN NUMERAL THREE*/
+    0x2173, /* U+002163: ROMAN NUMERAL FOUR*/
+    0x2174, /* U+002164: ROMAN NUMERAL FIVE*/
+    0x2175, /* U+002165: ROMAN NUMERAL SIX*/
+    0x2176, /* U+002166: ROMAN NUMERAL SEVEN*/
+    0x2177, /* U+002167: ROMAN NUMERAL EIGHT*/
+    0x2178, /* U+002168: ROMAN NUMERAL NINE*/
+    0x2179, /* U+002169: ROMAN NUMERAL TEN*/
+    0x217a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+    0x217b, /* U+00216b: ROMAN NUMERAL TWELVE*/
+    0x217c, /* U+00216c: ROMAN NUMERAL FIFTY*/
+    0x217d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+    0x217e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+    0x217f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+    0x2170, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+    0x2171, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+    0x2172, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+    0x2173, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+    0x2174, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+    0x2175, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+    0x2176, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+    0x2177, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+    0x2178, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+    0x2179, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+    0x217a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+    0x217b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+    0x217c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+    0x217d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+    0x217e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+    0x217f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+    0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+    0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+    0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+    0x2184, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+    0x2184, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+    0x2185, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+    0x2186, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+    0x2187, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+    0x2188, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+    0x2189, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+    0x218a, /* U+00218a: */
+    0x218b, /* U+00218b: */
+    0x218c, /* U+00218c: */
+    0x218d, /* U+00218d: */
+    0x218e, /* U+00218e: */
+    0x218f, /* U+00218f: */
+    0x2190, /* U+002190: LEFTWARDS ARROW*/
+    0x2191, /* U+002191: UPWARDS ARROW*/
+    0x2192, /* U+002192: RIGHTWARDS ARROW*/
+    0x2193, /* U+002193: DOWNWARDS ARROW*/
+    0x2194, /* U+002194: LEFT RIGHT ARROW*/
+    0x2195, /* U+002195: UP DOWN ARROW*/
+    0x2196, /* U+002196: NORTH WEST ARROW*/
+    0x2197, /* U+002197: NORTH EAST ARROW*/
+    0x2198, /* U+002198: SOUTH EAST ARROW*/
+    0x2199, /* U+002199: SOUTH WEST ARROW*/
+    0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+    0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+    0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
+    0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+    0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+    0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+    0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+    0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+    0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+    0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+    0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+    0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+    0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+    0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+    0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+    0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+    0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+    0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+    0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+    0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+    0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+    0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+    0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+    0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+    0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+    0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+    0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+    0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+    0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+    0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+    0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+    0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+    0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+    0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+    0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+    0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+    0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+    0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+    0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+    0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+    0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+    0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+    0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+    0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+    0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+    0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+    0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+    0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+    0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+    0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+    0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+    0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+    0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+    0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+    0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+    0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+    0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+    0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+    0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+    0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+    0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+    0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+    0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+    0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+    0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+    0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+    0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+    0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+    0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+    0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
+    0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+    0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+    0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+    0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+    0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+    0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
+    0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+    0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+    0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+    0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+    0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+    0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+    0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+    0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+    0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+    0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+    0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+    0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
+    0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+    0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+    0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+    0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+    0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+    0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+    0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+    0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+    0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+    0x2200, /* U+002200: FOR ALL*/
+    0x2201, /* U+002201: COMPLEMENT*/
+    0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
+    0x2203, /* U+002203: THERE EXISTS*/
+    0x2204, /* U+002204: THERE DOES NOT EXIST*/
+    0x2205, /* U+002205: EMPTY SET*/
+    0x2206, /* U+002206: INCREMENT*/
+    0x2207, /* U+002207: NABLA*/
+    0x2208, /* U+002208: ELEMENT OF*/
+    0x2209, /* U+002209: NOT AN ELEMENT OF*/
+    0x220a, /* U+00220a: SMALL ELEMENT OF*/
+    0x220b, /* U+00220b: CONTAINS AS MEMBER*/
+    0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+    0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+    0x220e, /* U+00220e: END OF PROOF*/
+    0x220f, /* U+00220f: N-ARY PRODUCT*/
+    0x2210, /* U+002210: N-ARY COPRODUCT*/
+    0x2211, /* U+002211: N-ARY SUMMATION*/
+    0x2212, /* U+002212: MINUS SIGN*/
+    0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
+    0x2214, /* U+002214: DOT PLUS*/
+    0x2215, /* U+002215: DIVISION SLASH*/
+    0x2216, /* U+002216: SET MINUS*/
+    0x2217, /* U+002217: ASTERISK OPERATOR*/
+    0x2218, /* U+002218: RING OPERATOR*/
+    0x2219, /* U+002219: BULLET OPERATOR*/
+    0x221a, /* U+00221a: SQUARE ROOT*/
+    0x221b, /* U+00221b: CUBE ROOT*/
+    0x221c, /* U+00221c: FOURTH ROOT*/
+    0x221d, /* U+00221d: PROPORTIONAL TO*/
+    0x221e, /* U+00221e: INFINITY*/
+    0x221f, /* U+00221f: RIGHT ANGLE*/
+    0x2220, /* U+002220: ANGLE*/
+    0x2221, /* U+002221: MEASURED ANGLE*/
+    0x2222, /* U+002222: SPHERICAL ANGLE*/
+    0x2223, /* U+002223: DIVIDES*/
+    0x2224, /* U+002224: DOES NOT DIVIDE*/
+    0x2225, /* U+002225: PARALLEL TO*/
+    0x2226, /* U+002226: NOT PARALLEL TO*/
+    0x2227, /* U+002227: LOGICAL AND*/
+    0x2228, /* U+002228: LOGICAL OR*/
+    0x2229, /* U+002229: INTERSECTION*/
+    0x222a, /* U+00222a: UNION*/
+    0x222b, /* U+00222b: INTEGRAL*/
+    0x222c, /* U+00222c: DOUBLE INTEGRAL*/
+    0x222d, /* U+00222d: TRIPLE INTEGRAL*/
+    0x222e, /* U+00222e: CONTOUR INTEGRAL*/
+    0x222f, /* U+00222f: SURFACE INTEGRAL*/
+    0x2230, /* U+002230: VOLUME INTEGRAL*/
+    0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
+    0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+    0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+    0x2234, /* U+002234: THEREFORE*/
+    0x2235, /* U+002235: BECAUSE*/
+    0x2236, /* U+002236: RATIO*/
+    0x2237, /* U+002237: PROPORTION*/
+    0x2238, /* U+002238: DOT MINUS*/
+    0x2239, /* U+002239: EXCESS*/
+    0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
+    0x223b, /* U+00223b: HOMOTHETIC*/
+    0x223c, /* U+00223c: TILDE OPERATOR*/
+    0x223d, /* U+00223d: REVERSED TILDE*/
+    0x223e, /* U+00223e: INVERTED LAZY S*/
+    0x223f, /* U+00223f: SINE WAVE*/
+    0x2240, /* U+002240: WREATH PRODUCT*/
+    0x2241, /* U+002241: NOT TILDE*/
+    0x2242, /* U+002242: MINUS TILDE*/
+    0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+    0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+    0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
+    0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+    0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+    0x2248, /* U+002248: ALMOST EQUAL TO*/
+    0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
+    0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+    0x224b, /* U+00224b: TRIPLE TILDE*/
+    0x224c, /* U+00224c: ALL EQUAL TO*/
+    0x224d, /* U+00224d: EQUIVALENT TO*/
+    0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+    0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
+    0x2250, /* U+002250: APPROACHES THE LIMIT*/
+    0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
+    0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+    0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+    0x2254, /* U+002254: COLON EQUALS*/
+    0x2255, /* U+002255: EQUALS COLON*/
+    0x2256, /* U+002256: RING IN EQUAL TO*/
+    0x2257, /* U+002257: RING EQUAL TO*/
+    0x2258, /* U+002258: CORRESPONDS TO*/
+    0x2259, /* U+002259: ESTIMATES*/
+    0x225a, /* U+00225a: EQUIANGULAR TO*/
+    0x225b, /* U+00225b: STAR EQUALS*/
+    0x225c, /* U+00225c: DELTA EQUAL TO*/
+    0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
+    0x225e, /* U+00225e: MEASURED BY*/
+    0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
+    0x2260, /* U+002260: NOT EQUAL TO*/
+    0x2261, /* U+002261: IDENTICAL TO*/
+    0x2262, /* U+002262: NOT IDENTICAL TO*/
+    0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
+    0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
+    0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
+    0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
+    0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+    0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+    0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+    0x226a, /* U+00226a: MUCH LESS-THAN*/
+    0x226b, /* U+00226b: MUCH GREATER-THAN*/
+    0x226c, /* U+00226c: BETWEEN*/
+    0x226d, /* U+00226d: NOT EQUIVALENT TO*/
+    0x226e, /* U+00226e: NOT LESS-THAN*/
+    0x226f, /* U+00226f: NOT GREATER-THAN*/
+    0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+    0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+    0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+    0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+    0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+    0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+    0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
+    0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
+    0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+    0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+    0x227a, /* U+00227a: PRECEDES*/
+    0x227b, /* U+00227b: SUCCEEDS*/
+    0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
+    0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+    0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+    0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+    0x2280, /* U+002280: DOES NOT PRECEDE*/
+    0x2281, /* U+002281: DOES NOT SUCCEED*/
+    0x2282, /* U+002282: SUBSET OF*/
+    0x2283, /* U+002283: SUPERSET OF*/
+    0x2284, /* U+002284: NOT A SUBSET OF*/
+    0x2285, /* U+002285: NOT A SUPERSET OF*/
+    0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
+    0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
+    0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+    0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+    0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+    0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+    0x228c, /* U+00228c: MULTISET*/
+    0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
+    0x228e, /* U+00228e: MULTISET UNION*/
+    0x228f, /* U+00228f: SQUARE IMAGE OF*/
+    0x2290, /* U+002290: SQUARE ORIGINAL OF*/
+    0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+    0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+    0x2293, /* U+002293: SQUARE CAP*/
+    0x2294, /* U+002294: SQUARE CUP*/
+    0x2295, /* U+002295: CIRCLED PLUS*/
+    0x2296, /* U+002296: CIRCLED MINUS*/
+    0x2297, /* U+002297: CIRCLED TIMES*/
+    0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
+    0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
+    0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
+    0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+    0x229c, /* U+00229c: CIRCLED EQUALS*/
+    0x229d, /* U+00229d: CIRCLED DASH*/
+    0x229e, /* U+00229e: SQUARED PLUS*/
+    0x229f, /* U+00229f: SQUARED MINUS*/
+    0x22a0, /* U+0022a0: SQUARED TIMES*/
+    0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
+    0x22a2, /* U+0022a2: RIGHT TACK*/
+    0x22a3, /* U+0022a3: LEFT TACK*/
+    0x22a4, /* U+0022a4: DOWN TACK*/
+    0x22a5, /* U+0022a5: UP TACK*/
+    0x22a6, /* U+0022a6: ASSERTION*/
+    0x22a7, /* U+0022a7: MODELS*/
+    0x22a8, /* U+0022a8: TRUE*/
+    0x22a9, /* U+0022a9: FORCES*/
+    0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+    0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+    0x22ac, /* U+0022ac: DOES NOT PROVE*/
+    0x22ad, /* U+0022ad: NOT TRUE*/
+    0x22ae, /* U+0022ae: DOES NOT FORCE*/
+    0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+    0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
+    0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+    0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
+    0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+    0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+    0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+    0x22b6, /* U+0022b6: ORIGINAL OF*/
+    0x22b7, /* U+0022b7: IMAGE OF*/
+    0x22b8, /* U+0022b8: MULTIMAP*/
+    0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+    0x22ba, /* U+0022ba: INTERCALATE*/
+    0x22bb, /* U+0022bb: XOR*/
+    0x22bc, /* U+0022bc: NAND*/
+    0x22bd, /* U+0022bd: NOR*/
+    0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
+    0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
+    0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
+    0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
+    0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
+    0x22c3, /* U+0022c3: N-ARY UNION*/
+    0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
+    0x22c5, /* U+0022c5: DOT OPERATOR*/
+    0x22c6, /* U+0022c6: STAR OPERATOR*/
+    0x22c7, /* U+0022c7: DIVISION TIMES*/
+    0x22c8, /* U+0022c8: BOWTIE*/
+    0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+    0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+    0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+    0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+    0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
+    0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
+    0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
+    0x22d0, /* U+0022d0: DOUBLE SUBSET*/
+    0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
+    0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
+    0x22d3, /* U+0022d3: DOUBLE UNION*/
+    0x22d4, /* U+0022d4: PITCHFORK*/
+    0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
+    0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
+    0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
+    0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
+    0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
+    0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+    0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+    0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+    0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+    0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
+    0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+    0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+    0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+    0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+    0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+    0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+    0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+    0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+    0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+    0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+    0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+    0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+    0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+    0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+    0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+    0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
+    0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+    0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+    0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+    0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+    0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+    0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+    0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+    0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+    0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+    0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+    0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
+    0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+    0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+    0x2300, /* U+002300: DIAMETER SIGN*/
+    0x2301, /* U+002301: ELECTRIC ARROW*/
+    0x2302, /* U+002302: HOUSE*/
+    0x2303, /* U+002303: UP ARROWHEAD*/
+    0x2304, /* U+002304: DOWN ARROWHEAD*/
+    0x2305, /* U+002305: PROJECTIVE*/
+    0x2306, /* U+002306: PERSPECTIVE*/
+    0x2307, /* U+002307: WAVY LINE*/
+    0x2308, /* U+002308: LEFT CEILING*/
+    0x2309, /* U+002309: RIGHT CEILING*/
+    0x230a, /* U+00230a: LEFT FLOOR*/
+    0x230b, /* U+00230b: RIGHT FLOOR*/
+    0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
+    0x230d, /* U+00230d: BOTTOM LEFT CROP*/
+    0x230e, /* U+00230e: TOP RIGHT CROP*/
+    0x230f, /* U+00230f: TOP LEFT CROP*/
+    0x2310, /* U+002310: REVERSED NOT SIGN*/
+    0x2311, /* U+002311: SQUARE LOZENGE*/
+    0x2312, /* U+002312: ARC*/
+    0x2313, /* U+002313: SEGMENT*/
+    0x2314, /* U+002314: SECTOR*/
+    0x2315, /* U+002315: TELEPHONE RECORDER*/
+    0x2316, /* U+002316: POSITION INDICATOR*/
+    0x2317, /* U+002317: VIEWDATA SQUARE*/
+    0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
+    0x2319, /* U+002319: TURNED NOT SIGN*/
+    0x231a, /* U+00231a: WATCH*/
+    0x231b, /* U+00231b: HOURGLASS*/
+    0x231c, /* U+00231c: TOP LEFT CORNER*/
+    0x231d, /* U+00231d: TOP RIGHT CORNER*/
+    0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
+    0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
+    0x2320, /* U+002320: TOP HALF INTEGRAL*/
+    0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
+    0x2322, /* U+002322: FROWN*/
+    0x2323, /* U+002323: SMILE*/
+    0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+    0x2325, /* U+002325: OPTION KEY*/
+    0x2326, /* U+002326: ERASE TO THE RIGHT*/
+    0x2327, /* U+002327: X IN A RECTANGLE BOX*/
+    0x2328, /* U+002328: KEYBOARD*/
+    0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+    0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+    0x232b, /* U+00232b: ERASE TO THE LEFT*/
+    0x232c, /* U+00232c: BENZENE RING*/
+    0x232d, /* U+00232d: CYLINDRICITY*/
+    0x232e, /* U+00232e: ALL AROUND-PROFILE*/
+    0x232f, /* U+00232f: SYMMETRY*/
+    0x2330, /* U+002330: TOTAL RUNOUT*/
+    0x2331, /* U+002331: DIMENSION ORIGIN*/
+    0x2332, /* U+002332: CONICAL TAPER*/
+    0x2333, /* U+002333: SLOPE*/
+    0x2334, /* U+002334: COUNTERBORE*/
+    0x2335, /* U+002335: COUNTERSINK*/
+    0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+    0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+    0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+    0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+    0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+    0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+    0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+    0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+    0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+    0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+    0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+    0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+    0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+    0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+    0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+    0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+    0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+    0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+    0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+    0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+    0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+    0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+    0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+    0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+    0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+    0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+    0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+    0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+    0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+    0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+    0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+    0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+    0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+    0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+    0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+    0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+    0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+    0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+    0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+    0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+    0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+    0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+    0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+    0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+    0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+    0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+    0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+    0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+    0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+    0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+    0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+    0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+    0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+    0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+    0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+    0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+    0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+    0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+    0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+    0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+    0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+    0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+    0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+    0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+    0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+    0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+    0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+    0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+    0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+    0x237b, /* U+00237b: NOT CHECK MARK*/
+    0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+    0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
+    0x237e, /* U+00237e: BELL SYMBOL*/
+    0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+    0x2380, /* U+002380: INSERTION SYMBOL*/
+    0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+    0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+    0x2383, /* U+002383: EMPHASIS SYMBOL*/
+    0x2384, /* U+002384: COMPOSITION SYMBOL*/
+    0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+    0x2386, /* U+002386: ENTER SYMBOL*/
+    0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+    0x2388, /* U+002388: HELM SYMBOL*/
+    0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+    0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+    0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+    0x238c, /* U+00238c: UNDO SYMBOL*/
+    0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
+    0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
+    0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+    0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+    0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+    0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+    0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+    0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+    0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+    0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+    0x2397, /* U+002397: PREVIOUS PAGE*/
+    0x2398, /* U+002398: NEXT PAGE*/
+    0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
+    0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
+    0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+    0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+    0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+    0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+    0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+    0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+    0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+    0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+    0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+    0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+    0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+    0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+    0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+    0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+    0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+    0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
+    0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+    0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+    0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+    0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
+    0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+    0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+    0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+    0x23b2, /* U+0023b2: SUMMATION TOP*/
+    0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
+    0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
+    0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+    0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+    0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+    0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+    0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+    0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+    0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+    0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+    0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+    0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+    0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+    0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+    0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+    0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+    0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+    0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+    0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+    0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+    0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+    0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+    0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+    0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+    0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+    0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+    0x23cd, /* U+0023cd: SQUARE FOOT*/
+    0x23ce, /* U+0023ce: RETURN SYMBOL*/
+    0x23cf, /* U+0023cf: EJECT SYMBOL*/
+    0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+    0x23d1, /* U+0023d1: METRICAL BREVE*/
+    0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
+    0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
+    0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+    0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+    0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+    0x23d7, /* U+0023d7: METRICAL TRISEME*/
+    0x23d8, /* U+0023d8: METRICAL TETRASEME*/
+    0x23d9, /* U+0023d9: METRICAL PENTASEME*/
+    0x23da, /* U+0023da: EARTH GROUND*/
+    0x23db, /* U+0023db: FUSE*/
+    0x23dc, /* U+0023dc: TOP PARENTHESIS*/
+    0x23dd, /* U+0023dd: BOTTOM PARENTHESIS*/
+    0x23de, /* U+0023de: TOP CURLY BRACKET*/
+    0x23df, /* U+0023df: BOTTOM CURLY BRACKET*/
+    0x23e0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+    0x23e1, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+    0x23e2, /* U+0023e2: WHITE TRAPEZIUM*/
+    0x23e3, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+    0x23e4, /* U+0023e4: STRAIGHTNESS*/
+    0x23e5, /* U+0023e5: FLATNESS*/
+    0x23e6, /* U+0023e6: AC CURRENT*/
+    0x23e7, /* U+0023e7: ELECTRICAL INTERSECTION*/
+    0x23e8, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+    0x23e9, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+    0x23ea, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+    0x23eb, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+    0x23ec, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+    0x23ed, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+    0x23ee, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+    0x23ef, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+    0x23f0, /* U+0023f0: ALARM CLOCK*/
+    0x23f1, /* U+0023f1: STOPWATCH*/
+    0x23f2, /* U+0023f2: TIMER CLOCK*/
+    0x23f3, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+    0x23f4, /* U+0023f4: */
+    0x23f5, /* U+0023f5: */
+    0x23f6, /* U+0023f6: */
+    0x23f7, /* U+0023f7: */
+    0x23f8, /* U+0023f8: */
+    0x23f9, /* U+0023f9: */
+    0x23fa, /* U+0023fa: */
+    0x23fb, /* U+0023fb: */
+    0x23fc, /* U+0023fc: */
+    0x23fd, /* U+0023fd: */
+    0x23fe, /* U+0023fe: */
+    0x23ff, /* U+0023ff: */
+    0x2400, /* U+002400: SYMBOL FOR NULL*/
+    0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
+    0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
+    0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
+    0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+    0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
+    0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+    0x2407, /* U+002407: SYMBOL FOR BELL*/
+    0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
+    0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+    0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
+    0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+    0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
+    0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+    0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+    0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
+    0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+    0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+    0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+    0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+    0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+    0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+    0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+    0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+    0x2418, /* U+002418: SYMBOL FOR CANCEL*/
+    0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+    0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+    0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
+    0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+    0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+    0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+    0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+    0x2420, /* U+002420: SYMBOL FOR SPACE*/
+    0x2421, /* U+002421: SYMBOL FOR DELETE*/
+    0x2422, /* U+002422: BLANK SYMBOL*/
+    0x2423, /* U+002423: OPEN BOX*/
+    0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
+    0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+    0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+    0x2427, /* U+002427: */
+    0x2428, /* U+002428: */
+    0x2429, /* U+002429: */
+    0x242a, /* U+00242a: */
+    0x242b, /* U+00242b: */
+    0x242c, /* U+00242c: */
+    0x242d, /* U+00242d: */
+    0x242e, /* U+00242e: */
+    0x242f, /* U+00242f: */
+    0x2430, /* U+002430: */
+    0x2431, /* U+002431: */
+    0x2432, /* U+002432: */
+    0x2433, /* U+002433: */
+    0x2434, /* U+002434: */
+    0x2435, /* U+002435: */
+    0x2436, /* U+002436: */
+    0x2437, /* U+002437: */
+    0x2438, /* U+002438: */
+    0x2439, /* U+002439: */
+    0x243a, /* U+00243a: */
+    0x243b, /* U+00243b: */
+    0x243c, /* U+00243c: */
+    0x243d, /* U+00243d: */
+    0x243e, /* U+00243e: */
+    0x243f, /* U+00243f: */
+    0x2440, /* U+002440: OCR HOOK*/
+    0x2441, /* U+002441: OCR CHAIR*/
+    0x2442, /* U+002442: OCR FORK*/
+    0x2443, /* U+002443: OCR INVERTED FORK*/
+    0x2444, /* U+002444: OCR BELT BUCKLE*/
+    0x2445, /* U+002445: OCR BOW TIE*/
+    0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+    0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
+    0x2448, /* U+002448: OCR DASH*/
+    0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+    0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
+    0x244b, /* U+00244b: */
+    0x244c, /* U+00244c: */
+    0x244d, /* U+00244d: */
+    0x244e, /* U+00244e: */
+    0x244f, /* U+00244f: */
+    0x2450, /* U+002450: */
+    0x2451, /* U+002451: */
+    0x2452, /* U+002452: */
+    0x2453, /* U+002453: */
+    0x2454, /* U+002454: */
+    0x2455, /* U+002455: */
+    0x2456, /* U+002456: */
+    0x2457, /* U+002457: */
+    0x2458, /* U+002458: */
+    0x2459, /* U+002459: */
+    0x245a, /* U+00245a: */
+    0x245b, /* U+00245b: */
+    0x245c, /* U+00245c: */
+    0x245d, /* U+00245d: */
+    0x245e, /* U+00245e: */
+    0x245f, /* U+00245f: */
+    0x2460, /* U+002460: CIRCLED DIGIT ONE*/
+    0x2461, /* U+002461: CIRCLED DIGIT TWO*/
+    0x2462, /* U+002462: CIRCLED DIGIT THREE*/
+    0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
+    0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
+    0x2465, /* U+002465: CIRCLED DIGIT SIX*/
+    0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
+    0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
+    0x2468, /* U+002468: CIRCLED DIGIT NINE*/
+    0x2469, /* U+002469: CIRCLED NUMBER TEN*/
+    0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+    0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
+    0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+    0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+    0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+    0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+    0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+    0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+    0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
+    0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
+    0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
+    0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
+    0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
+    0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+    0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+    0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
+    0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+    0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+    0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+    0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+    0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+    0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+    0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+    0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+    0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+    0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+    0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+    0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+    0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+    0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+    0x2488, /* U+002488: DIGIT ONE FULL STOP*/
+    0x2489, /* U+002489: DIGIT TWO FULL STOP*/
+    0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
+    0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
+    0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
+    0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
+    0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
+    0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
+    0x2490, /* U+002490: DIGIT NINE FULL STOP*/
+    0x2491, /* U+002491: NUMBER TEN FULL STOP*/
+    0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
+    0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
+    0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+    0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+    0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+    0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+    0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+    0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+    0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+    0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
+    0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+    0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+    0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+    0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+    0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+    0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+    0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+    0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+    0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+    0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+    0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+    0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+    0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+    0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+    0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+    0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+    0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+    0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+    0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+    0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+    0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+    0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+    0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+    0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+    0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+    0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+    0x24d0, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+    0x24d1, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+    0x24d2, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+    0x24d3, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+    0x24d4, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+    0x24d5, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+    0x24d6, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+    0x24d7, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+    0x24d8, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+    0x24d9, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+    0x24da, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+    0x24db, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+    0x24dc, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+    0x24dd, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+    0x24de, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+    0x24df, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+    0x24e0, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+    0x24e1, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+    0x24e2, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+    0x24e3, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+    0x24e4, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+    0x24e5, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+    0x24e6, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+    0x24e7, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+    0x24e8, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+    0x24e9, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniLower0x002c00[] =
+{
+    0x2c30, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
+    0x2c31, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
+    0x2c32, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
+    0x2c33, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
+    0x2c34, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
+    0x2c35, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
+    0x2c36, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
+    0x2c37, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
+    0x2c38, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
+    0x2c39, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
+    0x2c3a, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
+    0x2c3b, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
+    0x2c3c, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
+    0x2c3d, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
+    0x2c3e, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
+    0x2c3f, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
+    0x2c40, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
+    0x2c41, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
+    0x2c42, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
+    0x2c43, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
+    0x2c44, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
+    0x2c45, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
+    0x2c46, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
+    0x2c47, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
+    0x2c48, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
+    0x2c49, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
+    0x2c4a, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
+    0x2c4b, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
+    0x2c4c, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
+    0x2c4d, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
+    0x2c4e, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
+    0x2c4f, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
+    0x2c50, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
+    0x2c51, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
+    0x2c52, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
+    0x2c53, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
+    0x2c54, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
+    0x2c55, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
+    0x2c56, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
+    0x2c57, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
+    0x2c58, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
+    0x2c59, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
+    0x2c5a, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
+    0x2c5b, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
+    0x2c5c, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
+    0x2c5d, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
+    0x2c5e, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
+    0x2c2f, /* U+002c2f: */
+    0x2c30, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+    0x2c31, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+    0x2c32, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+    0x2c33, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+    0x2c34, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+    0x2c35, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+    0x2c36, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+    0x2c37, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+    0x2c38, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+    0x2c39, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+    0x2c3a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+    0x2c3b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+    0x2c3c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+    0x2c3d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+    0x2c3e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+    0x2c3f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+    0x2c40, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+    0x2c41, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+    0x2c42, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+    0x2c43, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+    0x2c44, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+    0x2c45, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+    0x2c46, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+    0x2c47, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+    0x2c48, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+    0x2c49, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+    0x2c4a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+    0x2c4b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+    0x2c4c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+    0x2c4d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+    0x2c4e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+    0x2c4f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+    0x2c50, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+    0x2c51, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+    0x2c52, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+    0x2c53, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+    0x2c54, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+    0x2c55, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+    0x2c56, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+    0x2c57, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+    0x2c58, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+    0x2c59, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+    0x2c5a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+    0x2c5b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+    0x2c5c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+    0x2c5d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+    0x2c5e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+    0x2c5f, /* U+002c5f: */
+    0x2c61, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+    0x2c61, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+    0x26b, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+    0x1d7d, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+    0x27d, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+    0x2c65, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+    0x2c66, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+    0x2c68, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+    0x2c68, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+    0x2c6a, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+    0x2c6a, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+    0x2c6c, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+    0x2c6c, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+    0x251, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+    0x271, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+    0x250, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+    0x252, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+    0x2c71, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+    0x2c73, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+    0x2c73, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+    0x2c74, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+    0x2c76, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+    0x2c76, /* U+002c76: LATIN SMALL LETTER HALF H*/
+    0x2c77, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+    0x2c78, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+    0x2c79, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+    0x2c7a, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+    0x2c7b, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+    0x2c7c, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+    0x2c7d, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+    0x23f, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+    0x240, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+    0x2c81, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+    0x2c81, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+    0x2c83, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+    0x2c83, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+    0x2c85, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+    0x2c85, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+    0x2c87, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+    0x2c87, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+    0x2c89, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+    0x2c89, /* U+002c89: COPTIC SMALL LETTER EIE*/
+    0x2c8b, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+    0x2c8b, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+    0x2c8d, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+    0x2c8d, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+    0x2c8f, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+    0x2c8f, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+    0x2c91, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+    0x2c91, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+    0x2c93, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+    0x2c93, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+    0x2c95, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+    0x2c95, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+    0x2c97, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+    0x2c97, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+    0x2c99, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+    0x2c99, /* U+002c99: COPTIC SMALL LETTER MI*/
+    0x2c9b, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+    0x2c9b, /* U+002c9b: COPTIC SMALL LETTER NI*/
+    0x2c9d, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+    0x2c9d, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+    0x2c9f, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+    0x2c9f, /* U+002c9f: COPTIC SMALL LETTER O*/
+    0x2ca1, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+    0x2ca1, /* U+002ca1: COPTIC SMALL LETTER PI*/
+    0x2ca3, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+    0x2ca3, /* U+002ca3: COPTIC SMALL LETTER RO*/
+    0x2ca5, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+    0x2ca5, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+    0x2ca7, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+    0x2ca7, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+    0x2ca9, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+    0x2ca9, /* U+002ca9: COPTIC SMALL LETTER UA*/
+    0x2cab, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+    0x2cab, /* U+002cab: COPTIC SMALL LETTER FI*/
+    0x2cad, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+    0x2cad, /* U+002cad: COPTIC SMALL LETTER KHI*/
+    0x2caf, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+    0x2caf, /* U+002caf: COPTIC SMALL LETTER PSI*/
+    0x2cb1, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+    0x2cb1, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+    0x2cb3, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+    0x2cb3, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+    0x2cb5, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+    0x2cb5, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+    0x2cb7, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+    0x2cb7, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+    0x2cb9, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+    0x2cb9, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+    0x2cbb, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+    0x2cbb, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+    0x2cbd, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+    0x2cbd, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+    0x2cbf, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+    0x2cbf, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+    0x2cc1, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+    0x2cc1, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+    0x2cc3, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+    0x2cc3, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+    0x2cc5, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+    0x2cc5, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+    0x2cc7, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+    0x2cc7, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+    0x2cc9, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+    0x2cc9, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+    0x2ccb, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+    0x2ccb, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+    0x2ccd, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+    0x2ccd, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+    0x2ccf, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+    0x2ccf, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+    0x2cd1, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+    0x2cd1, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+    0x2cd3, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+    0x2cd3, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+    0x2cd5, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+    0x2cd5, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+    0x2cd7, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+    0x2cd7, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+    0x2cd9, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+    0x2cd9, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+    0x2cdb, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+    0x2cdb, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+    0x2cdd, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+    0x2cdd, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+    0x2cdf, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+    0x2cdf, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+    0x2ce1, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+    0x2ce1, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+    0x2ce3, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+    0x2ce3, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+    0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
+    0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
+    0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
+    0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+    0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+    0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+    0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+    0x2cec, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+    0x2cec, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+    0x2cee, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+    0x2cee, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+    0x2cef, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+    0x2cf0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+    0x2cf1, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+    0x2cf3, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+};
+
+static const RTUNICP g_afRTUniLower0x00a640[] =
+{
+    0xa641, /* U+00a640: CYRILLIC CAPITAL LETTER ZEMLYA*/
+    0xa641, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+    0xa643, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+    0xa643, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+    0xa645, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+    0xa645, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+    0xa647, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+    0xa647, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+    0xa649, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+    0xa649, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+    0xa64b, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+    0xa64b, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+    0xa64d, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+    0xa64d, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+    0xa64f, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+    0xa64f, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+    0xa651, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+    0xa651, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+    0xa653, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+    0xa653, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+    0xa655, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+    0xa655, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+    0xa657, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+    0xa657, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+    0xa659, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+    0xa659, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+    0xa65b, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+    0xa65b, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+    0xa65d, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+    0xa65d, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+    0xa65f, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+    0xa65f, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+    0xa661, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+    0xa661, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+    0xa663, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+    0xa663, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+    0xa665, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+    0xa665, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+    0xa667, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+    0xa667, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+    0xa669, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+    0xa669, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+    0xa66b, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+    0xa66b, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+    0xa66d, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+    0xa66d, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+    0xa66e, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+    0xa66f, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+    0xa670, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+    0xa671, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+    0xa672, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+    0xa673, /* U+00a673: SLAVONIC ASTERISK*/
+    0xa674, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+    0xa675, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+    0xa676, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+    0xa677, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+    0xa678, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+    0xa679, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+    0xa67a, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+    0xa67b, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+    0xa67c, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+    0xa67d, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+    0xa67e, /* U+00a67e: CYRILLIC KAVYKA*/
+    0xa67f, /* U+00a67f: CYRILLIC PAYEROK*/
+    0xa681, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+    0xa681, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+    0xa683, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+    0xa683, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+    0xa685, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+    0xa685, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+    0xa687, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+    0xa687, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+    0xa689, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+    0xa689, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+    0xa68b, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+    0xa68b, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+    0xa68d, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+    0xa68d, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+    0xa68f, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+    0xa68f, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+    0xa691, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+    0xa691, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+    0xa693, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+    0xa693, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+    0xa695, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+    0xa695, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+    0xa697, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+    0xa697, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+    0xa698, /* U+00a698: */
+    0xa699, /* U+00a699: */
+    0xa69a, /* U+00a69a: */
+    0xa69b, /* U+00a69b: */
+    0xa69c, /* U+00a69c: */
+    0xa69d, /* U+00a69d: */
+    0xa69e, /* U+00a69e: */
+    0xa69f, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+    0xa6a0, /* U+00a6a0: BAMUM LETTER A*/
+    0xa6a1, /* U+00a6a1: BAMUM LETTER KA*/
+    0xa6a2, /* U+00a6a2: BAMUM LETTER U*/
+    0xa6a3, /* U+00a6a3: BAMUM LETTER KU*/
+    0xa6a4, /* U+00a6a4: BAMUM LETTER EE*/
+    0xa6a5, /* U+00a6a5: BAMUM LETTER REE*/
+    0xa6a6, /* U+00a6a6: BAMUM LETTER TAE*/
+    0xa6a7, /* U+00a6a7: BAMUM LETTER O*/
+    0xa6a8, /* U+00a6a8: BAMUM LETTER NYI*/
+    0xa6a9, /* U+00a6a9: BAMUM LETTER I*/
+    0xa6aa, /* U+00a6aa: BAMUM LETTER LA*/
+    0xa6ab, /* U+00a6ab: BAMUM LETTER PA*/
+    0xa6ac, /* U+00a6ac: BAMUM LETTER RII*/
+    0xa6ad, /* U+00a6ad: BAMUM LETTER RIEE*/
+    0xa6ae, /* U+00a6ae: BAMUM LETTER LEEEE*/
+    0xa6af, /* U+00a6af: BAMUM LETTER MEEEE*/
+    0xa6b0, /* U+00a6b0: BAMUM LETTER TAA*/
+    0xa6b1, /* U+00a6b1: BAMUM LETTER NDAA*/
+    0xa6b2, /* U+00a6b2: BAMUM LETTER NJAEM*/
+    0xa6b3, /* U+00a6b3: BAMUM LETTER M*/
+    0xa6b4, /* U+00a6b4: BAMUM LETTER SUU*/
+    0xa6b5, /* U+00a6b5: BAMUM LETTER MU*/
+    0xa6b6, /* U+00a6b6: BAMUM LETTER SHII*/
+    0xa6b7, /* U+00a6b7: BAMUM LETTER SI*/
+    0xa6b8, /* U+00a6b8: BAMUM LETTER SHEUX*/
+    0xa6b9, /* U+00a6b9: BAMUM LETTER SEUX*/
+    0xa6ba, /* U+00a6ba: BAMUM LETTER KYEE*/
+    0xa6bb, /* U+00a6bb: BAMUM LETTER KET*/
+    0xa6bc, /* U+00a6bc: BAMUM LETTER NUAE*/
+    0xa6bd, /* U+00a6bd: BAMUM LETTER NU*/
+    0xa6be, /* U+00a6be: BAMUM LETTER NJUAE*/
+    0xa6bf, /* U+00a6bf: BAMUM LETTER YOQ*/
+    0xa6c0, /* U+00a6c0: BAMUM LETTER SHU*/
+    0xa6c1, /* U+00a6c1: BAMUM LETTER YUQ*/
+    0xa6c2, /* U+00a6c2: BAMUM LETTER YA*/
+    0xa6c3, /* U+00a6c3: BAMUM LETTER NSHA*/
+    0xa6c4, /* U+00a6c4: BAMUM LETTER KEUX*/
+    0xa6c5, /* U+00a6c5: BAMUM LETTER PEUX*/
+    0xa6c6, /* U+00a6c6: BAMUM LETTER NJEE*/
+    0xa6c7, /* U+00a6c7: BAMUM LETTER NTEE*/
+    0xa6c8, /* U+00a6c8: BAMUM LETTER PUE*/
+    0xa6c9, /* U+00a6c9: BAMUM LETTER WUE*/
+    0xa6ca, /* U+00a6ca: BAMUM LETTER PEE*/
+    0xa6cb, /* U+00a6cb: BAMUM LETTER FEE*/
+    0xa6cc, /* U+00a6cc: BAMUM LETTER RU*/
+    0xa6cd, /* U+00a6cd: BAMUM LETTER LU*/
+    0xa6ce, /* U+00a6ce: BAMUM LETTER MI*/
+    0xa6cf, /* U+00a6cf: BAMUM LETTER NI*/
+    0xa6d0, /* U+00a6d0: BAMUM LETTER REUX*/
+    0xa6d1, /* U+00a6d1: BAMUM LETTER RAE*/
+    0xa6d2, /* U+00a6d2: BAMUM LETTER KEN*/
+    0xa6d3, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+    0xa6d4, /* U+00a6d4: BAMUM LETTER NGGA*/
+    0xa6d5, /* U+00a6d5: BAMUM LETTER NGA*/
+    0xa6d6, /* U+00a6d6: BAMUM LETTER SHO*/
+    0xa6d7, /* U+00a6d7: BAMUM LETTER PUAE*/
+    0xa6d8, /* U+00a6d8: BAMUM LETTER FU*/
+    0xa6d9, /* U+00a6d9: BAMUM LETTER FOM*/
+    0xa6da, /* U+00a6da: BAMUM LETTER WA*/
+    0xa6db, /* U+00a6db: BAMUM LETTER NA*/
+    0xa6dc, /* U+00a6dc: BAMUM LETTER LI*/
+    0xa6dd, /* U+00a6dd: BAMUM LETTER PI*/
+    0xa6de, /* U+00a6de: BAMUM LETTER LOQ*/
+    0xa6df, /* U+00a6df: BAMUM LETTER KO*/
+    0xa6e0, /* U+00a6e0: BAMUM LETTER MBEN*/
+    0xa6e1, /* U+00a6e1: BAMUM LETTER REN*/
+    0xa6e2, /* U+00a6e2: BAMUM LETTER MEN*/
+    0xa6e3, /* U+00a6e3: BAMUM LETTER MA*/
+    0xa6e4, /* U+00a6e4: BAMUM LETTER TI*/
+    0xa6e5, /* U+00a6e5: BAMUM LETTER KI*/
+    0xa6e6, /* U+00a6e6: BAMUM LETTER MO*/
+    0xa6e7, /* U+00a6e7: BAMUM LETTER MBAA*/
+    0xa6e8, /* U+00a6e8: BAMUM LETTER TET*/
+    0xa6e9, /* U+00a6e9: BAMUM LETTER KPA*/
+    0xa6ea, /* U+00a6ea: BAMUM LETTER TEN*/
+    0xa6eb, /* U+00a6eb: BAMUM LETTER NTUU*/
+    0xa6ec, /* U+00a6ec: BAMUM LETTER SAMBA*/
+    0xa6ed, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+    0xa6ee, /* U+00a6ee: BAMUM LETTER KOVUU*/
+    0xa6ef, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+    0xa6f0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+    0xa6f1, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+    0xa6f2, /* U+00a6f2: BAMUM NJAEMLI*/
+    0xa6f3, /* U+00a6f3: BAMUM FULL STOP*/
+    0xa6f4, /* U+00a6f4: BAMUM COLON*/
+    0xa6f5, /* U+00a6f5: BAMUM COMMA*/
+    0xa6f6, /* U+00a6f6: BAMUM SEMICOLON*/
+    0xa6f7, /* U+00a6f7: BAMUM QUESTION MARK*/
+    0xa6f8, /* U+00a6f8: */
+    0xa6f9, /* U+00a6f9: */
+    0xa6fa, /* U+00a6fa: */
+    0xa6fb, /* U+00a6fb: */
+    0xa6fc, /* U+00a6fc: */
+    0xa6fd, /* U+00a6fd: */
+    0xa6fe, /* U+00a6fe: */
+    0xa6ff, /* U+00a6ff: */
+    0xa700, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+    0xa701, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+    0xa702, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+    0xa703, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+    0xa704, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+    0xa705, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+    0xa706, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+    0xa707, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+    0xa708, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+    0xa709, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+    0xa70a, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+    0xa70b, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+    0xa70c, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+    0xa70d, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+    0xa70e, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+    0xa70f, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+    0xa710, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+    0xa711, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+    0xa712, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+    0xa713, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+    0xa714, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+    0xa715, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+    0xa716, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+    0xa717, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+    0xa718, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+    0xa719, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+    0xa71a, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+    0xa71b, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+    0xa71c, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+    0xa71d, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+    0xa71e, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+    0xa71f, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+    0xa720, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+    0xa721, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+    0xa723, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+    0xa723, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+    0xa725, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+    0xa725, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+    0xa727, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+    0xa727, /* U+00a727: LATIN SMALL LETTER HENG*/
+    0xa729, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+    0xa729, /* U+00a729: LATIN SMALL LETTER TZ*/
+    0xa72b, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+    0xa72b, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+    0xa72d, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+    0xa72d, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+    0xa72f, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+    0xa72f, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+    0xa730, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+    0xa731, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+    0xa733, /* U+00a732: LATIN CAPITAL LETTER AA*/
+    0xa733, /* U+00a733: LATIN SMALL LETTER AA*/
+    0xa735, /* U+00a734: LATIN CAPITAL LETTER AO*/
+    0xa735, /* U+00a735: LATIN SMALL LETTER AO*/
+    0xa737, /* U+00a736: LATIN CAPITAL LETTER AU*/
+    0xa737, /* U+00a737: LATIN SMALL LETTER AU*/
+    0xa739, /* U+00a738: LATIN CAPITAL LETTER AV*/
+    0xa739, /* U+00a739: LATIN SMALL LETTER AV*/
+    0xa73b, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+    0xa73b, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+    0xa73d, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+    0xa73d, /* U+00a73d: LATIN SMALL LETTER AY*/
+    0xa73f, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+    0xa73f, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+    0xa741, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+    0xa741, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+    0xa743, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+    0xa743, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+    0xa745, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+    0xa745, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+    0xa747, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+    0xa747, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+    0xa749, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+    0xa749, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+    0xa74b, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+    0xa74b, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+    0xa74d, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+    0xa74d, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+    0xa74f, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+    0xa74f, /* U+00a74f: LATIN SMALL LETTER OO*/
+    0xa751, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+    0xa751, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+    0xa753, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+    0xa753, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+    0xa755, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+    0xa755, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+    0xa757, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+    0xa757, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+    0xa759, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+    0xa759, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+    0xa75b, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+    0xa75b, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+    0xa75d, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+    0xa75d, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+    0xa75f, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+    0xa75f, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+    0xa761, /* U+00a760: LATIN CAPITAL LETTER VY*/
+    0xa761, /* U+00a761: LATIN SMALL LETTER VY*/
+    0xa763, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+    0xa763, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+    0xa765, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+    0xa765, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+    0xa767, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+    0xa767, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+    0xa769, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+    0xa769, /* U+00a769: LATIN SMALL LETTER VEND*/
+    0xa76b, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+    0xa76b, /* U+00a76b: LATIN SMALL LETTER ET*/
+    0xa76d, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+    0xa76d, /* U+00a76d: LATIN SMALL LETTER IS*/
+    0xa76f, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+    0xa76f, /* U+00a76f: LATIN SMALL LETTER CON*/
+    0xa770, /* U+00a770: MODIFIER LETTER US*/
+    0xa771, /* U+00a771: LATIN SMALL LETTER DUM*/
+    0xa772, /* U+00a772: LATIN SMALL LETTER LUM*/
+    0xa773, /* U+00a773: LATIN SMALL LETTER MUM*/
+    0xa774, /* U+00a774: LATIN SMALL LETTER NUM*/
+    0xa775, /* U+00a775: LATIN SMALL LETTER RUM*/
+    0xa776, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+    0xa777, /* U+00a777: LATIN SMALL LETTER TUM*/
+    0xa778, /* U+00a778: LATIN SMALL LETTER UM*/
+    0xa77a, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+    0xa77a, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+    0xa77c, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+    0xa77c, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+    0x1d79, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+    0xa77f, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+    0xa77f, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+    0xa781, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+    0xa781, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+    0xa783, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+    0xa783, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+    0xa785, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+    0xa785, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+    0xa787, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+    0xa787, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+    0xa788, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+    0xa789, /* U+00a789: MODIFIER LETTER COLON*/
+    0xa78a, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+    0xa78c, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+    0xa78c, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+    0x265, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+    0xa78e, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+    0xa78f, /* U+00a78f: */
+    0xa791, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+    0xa791, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+    0xa793, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+    0xa793, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+    0xa794, /* U+00a794: */
+    0xa795, /* U+00a795: */
+    0xa796, /* U+00a796: */
+    0xa797, /* U+00a797: */
+    0xa798, /* U+00a798: */
+    0xa799, /* U+00a799: */
+    0xa79a, /* U+00a79a: */
+    0xa79b, /* U+00a79b: */
+    0xa79c, /* U+00a79c: */
+    0xa79d, /* U+00a79d: */
+    0xa79e, /* U+00a79e: */
+    0xa79f, /* U+00a79f: */
+    0xa7a1, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+    0xa7a1, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+    0xa7a3, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+    0xa7a3, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+    0xa7a5, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+    0xa7a5, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+    0xa7a7, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+    0xa7a7, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+    0xa7a9, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+    0xa7a9, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+    0x266, /* U+00a7aa: LATIN CAPITAL LETTER H WITH HOOK*/
+};
+
+static const RTUNICP g_afRTUniLower0x00ff21[] =
+{
+    0xff41, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
+    0xff42, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
+    0xff43, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
+    0xff44, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
+    0xff45, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
+    0xff46, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
+    0xff47, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
+    0xff48, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
+    0xff49, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
+    0xff4a, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
+    0xff4b, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
+    0xff4c, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
+    0xff4d, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
+    0xff4e, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
+    0xff4f, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
+    0xff50, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
+    0xff51, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
+    0xff52, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
+    0xff53, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
+    0xff54, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
+    0xff55, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
+    0xff56, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
+    0xff57, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
+    0xff58, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
+    0xff59, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
+    0xff5a, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniLower0x010400[] =
+{
+    0x10428, /* U+010400: DESERET CAPITAL LETTER LONG I*/
+    0x10429, /* U+010401: DESERET CAPITAL LETTER LONG E*/
+    0x1042a, /* U+010402: DESERET CAPITAL LETTER LONG A*/
+    0x1042b, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
+    0x1042c, /* U+010404: DESERET CAPITAL LETTER LONG O*/
+    0x1042d, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
+    0x1042e, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
+    0x1042f, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
+    0x10430, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
+    0x10431, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
+    0x10432, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
+    0x10433, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
+    0x10434, /* U+01040c: DESERET CAPITAL LETTER AY*/
+    0x10435, /* U+01040d: DESERET CAPITAL LETTER OW*/
+    0x10436, /* U+01040e: DESERET CAPITAL LETTER WU*/
+    0x10437, /* U+01040f: DESERET CAPITAL LETTER YEE*/
+    0x10438, /* U+010410: DESERET CAPITAL LETTER H*/
+    0x10439, /* U+010411: DESERET CAPITAL LETTER PEE*/
+    0x1043a, /* U+010412: DESERET CAPITAL LETTER BEE*/
+    0x1043b, /* U+010413: DESERET CAPITAL LETTER TEE*/
+    0x1043c, /* U+010414: DESERET CAPITAL LETTER DEE*/
+    0x1043d, /* U+010415: DESERET CAPITAL LETTER CHEE*/
+    0x1043e, /* U+010416: DESERET CAPITAL LETTER JEE*/
+    0x1043f, /* U+010417: DESERET CAPITAL LETTER KAY*/
+    0x10440, /* U+010418: DESERET CAPITAL LETTER GAY*/
+    0x10441, /* U+010419: DESERET CAPITAL LETTER EF*/
+    0x10442, /* U+01041a: DESERET CAPITAL LETTER VEE*/
+    0x10443, /* U+01041b: DESERET CAPITAL LETTER ETH*/
+    0x10444, /* U+01041c: DESERET CAPITAL LETTER THEE*/
+    0x10445, /* U+01041d: DESERET CAPITAL LETTER ES*/
+    0x10446, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
+    0x10447, /* U+01041f: DESERET CAPITAL LETTER ESH*/
+    0x10448, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
+    0x10449, /* U+010421: DESERET CAPITAL LETTER ER*/
+    0x1044a, /* U+010422: DESERET CAPITAL LETTER EL*/
+    0x1044b, /* U+010423: DESERET CAPITAL LETTER EM*/
+    0x1044c, /* U+010424: DESERET CAPITAL LETTER EN*/
+    0x1044d, /* U+010425: DESERET CAPITAL LETTER ENG*/
+    0x1044e, /* U+010426: DESERET CAPITAL LETTER OI*/
+    0x1044f, /* U+010427: DESERET CAPITAL LETTER EW*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniLowerRanges[] =
+{
+    { 0x000000, 0x000557, &g_afRTUniLower0x000000[0] },
+    { 0x0010a0, 0x0010ce, &g_afRTUniLower0x0010a0[0] },
+    { 0x001e00, 0x0024d0, &g_afRTUniLower0x001e00[0] },
+    { 0x002c00, 0x002cf3, &g_afRTUniLower0x002c00[0] },
+    { 0x00a640, 0x00a7ab, &g_afRTUniLower0x00a640[0] },
+    { 0x00ff21, 0x00ff3b, &g_afRTUniLower0x00ff21[0] },
+    { 0x010400, 0x010428, &g_afRTUniLower0x010400[0] },
+    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata-upper.cpp b/src/VBox/Runtime/common/string/unidata-upper.cpp
new file mode 100644
index 0000000..916bd41
--- /dev/null
+++ b/src/VBox/Runtime/common/string/unidata-upper.cpp
@@ -0,0 +1,4069 @@
+/* $Id: unidata-upper.cpp $ */
+/** @file
+ * IPRT - Unicode Tables.
+ *
+ * Automatically Generated from d:\src\unicode\6.3.0\
+ * by ..\..\..\..\..\out\win.amd64\debug\obj\uniread\uniread.exe (May 22 2014 19:07:40)
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/uni.h>
+
+static const RTUNICP g_afRTUniUpper0x000000[] =
+{
+    0x00, /* U+000000: <control>*/
+    0x01, /* U+000001: <control>*/
+    0x02, /* U+000002: <control>*/
+    0x03, /* U+000003: <control>*/
+    0x04, /* U+000004: <control>*/
+    0x05, /* U+000005: <control>*/
+    0x06, /* U+000006: <control>*/
+    0x07, /* U+000007: <control>*/
+    0x08, /* U+000008: <control>*/
+    0x09, /* U+000009: <control>*/
+    0x0a, /* U+00000a: <control>*/
+    0x0b, /* U+00000b: <control>*/
+    0x0c, /* U+00000c: <control>*/
+    0x0d, /* U+00000d: <control>*/
+    0x0e, /* U+00000e: <control>*/
+    0x0f, /* U+00000f: <control>*/
+    0x10, /* U+000010: <control>*/
+    0x11, /* U+000011: <control>*/
+    0x12, /* U+000012: <control>*/
+    0x13, /* U+000013: <control>*/
+    0x14, /* U+000014: <control>*/
+    0x15, /* U+000015: <control>*/
+    0x16, /* U+000016: <control>*/
+    0x17, /* U+000017: <control>*/
+    0x18, /* U+000018: <control>*/
+    0x19, /* U+000019: <control>*/
+    0x1a, /* U+00001a: <control>*/
+    0x1b, /* U+00001b: <control>*/
+    0x1c, /* U+00001c: <control>*/
+    0x1d, /* U+00001d: <control>*/
+    0x1e, /* U+00001e: <control>*/
+    0x1f, /* U+00001f: <control>*/
+    0x20, /* U+000020: SPACE*/
+    0x21, /* U+000021: EXCLAMATION MARK*/
+    0x22, /* U+000022: QUOTATION MARK*/
+    0x23, /* U+000023: NUMBER SIGN*/
+    0x24, /* U+000024: DOLLAR SIGN*/
+    0x25, /* U+000025: PERCENT SIGN*/
+    0x26, /* U+000026: AMPERSAND*/
+    0x27, /* U+000027: APOSTROPHE*/
+    0x28, /* U+000028: LEFT PARENTHESIS*/
+    0x29, /* U+000029: RIGHT PARENTHESIS*/
+    0x2a, /* U+00002a: ASTERISK*/
+    0x2b, /* U+00002b: PLUS SIGN*/
+    0x2c, /* U+00002c: COMMA*/
+    0x2d, /* U+00002d: HYPHEN-MINUS*/
+    0x2e, /* U+00002e: FULL STOP*/
+    0x2f, /* U+00002f: SOLIDUS*/
+    0x30, /* U+000030: DIGIT ZERO*/
+    0x31, /* U+000031: DIGIT ONE*/
+    0x32, /* U+000032: DIGIT TWO*/
+    0x33, /* U+000033: DIGIT THREE*/
+    0x34, /* U+000034: DIGIT FOUR*/
+    0x35, /* U+000035: DIGIT FIVE*/
+    0x36, /* U+000036: DIGIT SIX*/
+    0x37, /* U+000037: DIGIT SEVEN*/
+    0x38, /* U+000038: DIGIT EIGHT*/
+    0x39, /* U+000039: DIGIT NINE*/
+    0x3a, /* U+00003a: COLON*/
+    0x3b, /* U+00003b: SEMICOLON*/
+    0x3c, /* U+00003c: LESS-THAN SIGN*/
+    0x3d, /* U+00003d: EQUALS SIGN*/
+    0x3e, /* U+00003e: GREATER-THAN SIGN*/
+    0x3f, /* U+00003f: QUESTION MARK*/
+    0x40, /* U+000040: COMMERCIAL AT*/
+    0x41, /* U+000041: LATIN CAPITAL LETTER A*/
+    0x42, /* U+000042: LATIN CAPITAL LETTER B*/
+    0x43, /* U+000043: LATIN CAPITAL LETTER C*/
+    0x44, /* U+000044: LATIN CAPITAL LETTER D*/
+    0x45, /* U+000045: LATIN CAPITAL LETTER E*/
+    0x46, /* U+000046: LATIN CAPITAL LETTER F*/
+    0x47, /* U+000047: LATIN CAPITAL LETTER G*/
+    0x48, /* U+000048: LATIN CAPITAL LETTER H*/
+    0x49, /* U+000049: LATIN CAPITAL LETTER I*/
+    0x4a, /* U+00004a: LATIN CAPITAL LETTER J*/
+    0x4b, /* U+00004b: LATIN CAPITAL LETTER K*/
+    0x4c, /* U+00004c: LATIN CAPITAL LETTER L*/
+    0x4d, /* U+00004d: LATIN CAPITAL LETTER M*/
+    0x4e, /* U+00004e: LATIN CAPITAL LETTER N*/
+    0x4f, /* U+00004f: LATIN CAPITAL LETTER O*/
+    0x50, /* U+000050: LATIN CAPITAL LETTER P*/
+    0x51, /* U+000051: LATIN CAPITAL LETTER Q*/
+    0x52, /* U+000052: LATIN CAPITAL LETTER R*/
+    0x53, /* U+000053: LATIN CAPITAL LETTER S*/
+    0x54, /* U+000054: LATIN CAPITAL LETTER T*/
+    0x55, /* U+000055: LATIN CAPITAL LETTER U*/
+    0x56, /* U+000056: LATIN CAPITAL LETTER V*/
+    0x57, /* U+000057: LATIN CAPITAL LETTER W*/
+    0x58, /* U+000058: LATIN CAPITAL LETTER X*/
+    0x59, /* U+000059: LATIN CAPITAL LETTER Y*/
+    0x5a, /* U+00005a: LATIN CAPITAL LETTER Z*/
+    0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
+    0x5c, /* U+00005c: REVERSE SOLIDUS*/
+    0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
+    0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
+    0x5f, /* U+00005f: LOW LINE*/
+    0x60, /* U+000060: GRAVE ACCENT*/
+    0x41, /* U+000061: LATIN SMALL LETTER A*/
+    0x42, /* U+000062: LATIN SMALL LETTER B*/
+    0x43, /* U+000063: LATIN SMALL LETTER C*/
+    0x44, /* U+000064: LATIN SMALL LETTER D*/
+    0x45, /* U+000065: LATIN SMALL LETTER E*/
+    0x46, /* U+000066: LATIN SMALL LETTER F*/
+    0x47, /* U+000067: LATIN SMALL LETTER G*/
+    0x48, /* U+000068: LATIN SMALL LETTER H*/
+    0x49, /* U+000069: LATIN SMALL LETTER I*/
+    0x4a, /* U+00006a: LATIN SMALL LETTER J*/
+    0x4b, /* U+00006b: LATIN SMALL LETTER K*/
+    0x4c, /* U+00006c: LATIN SMALL LETTER L*/
+    0x4d, /* U+00006d: LATIN SMALL LETTER M*/
+    0x4e, /* U+00006e: LATIN SMALL LETTER N*/
+    0x4f, /* U+00006f: LATIN SMALL LETTER O*/
+    0x50, /* U+000070: LATIN SMALL LETTER P*/
+    0x51, /* U+000071: LATIN SMALL LETTER Q*/
+    0x52, /* U+000072: LATIN SMALL LETTER R*/
+    0x53, /* U+000073: LATIN SMALL LETTER S*/
+    0x54, /* U+000074: LATIN SMALL LETTER T*/
+    0x55, /* U+000075: LATIN SMALL LETTER U*/
+    0x56, /* U+000076: LATIN SMALL LETTER V*/
+    0x57, /* U+000077: LATIN SMALL LETTER W*/
+    0x58, /* U+000078: LATIN SMALL LETTER X*/
+    0x59, /* U+000079: LATIN SMALL LETTER Y*/
+    0x5a, /* U+00007a: LATIN SMALL LETTER Z*/
+    0x7b, /* U+00007b: LEFT CURLY BRACKET*/
+    0x7c, /* U+00007c: VERTICAL LINE*/
+    0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
+    0x7e, /* U+00007e: TILDE*/
+    0x7f, /* U+00007f: <control>*/
+    0x80, /* U+000080: <control>*/
+    0x81, /* U+000081: <control>*/
+    0x82, /* U+000082: <control>*/
+    0x83, /* U+000083: <control>*/
+    0x84, /* U+000084: <control>*/
+    0x85, /* U+000085: <control>*/
+    0x86, /* U+000086: <control>*/
+    0x87, /* U+000087: <control>*/
+    0x88, /* U+000088: <control>*/
+    0x89, /* U+000089: <control>*/
+    0x8a, /* U+00008a: <control>*/
+    0x8b, /* U+00008b: <control>*/
+    0x8c, /* U+00008c: <control>*/
+    0x8d, /* U+00008d: <control>*/
+    0x8e, /* U+00008e: <control>*/
+    0x8f, /* U+00008f: <control>*/
+    0x90, /* U+000090: <control>*/
+    0x91, /* U+000091: <control>*/
+    0x92, /* U+000092: <control>*/
+    0x93, /* U+000093: <control>*/
+    0x94, /* U+000094: <control>*/
+    0x95, /* U+000095: <control>*/
+    0x96, /* U+000096: <control>*/
+    0x97, /* U+000097: <control>*/
+    0x98, /* U+000098: <control>*/
+    0x99, /* U+000099: <control>*/
+    0x9a, /* U+00009a: <control>*/
+    0x9b, /* U+00009b: <control>*/
+    0x9c, /* U+00009c: <control>*/
+    0x9d, /* U+00009d: <control>*/
+    0x9e, /* U+00009e: <control>*/
+    0x9f, /* U+00009f: <control>*/
+    0xa0, /* U+0000a0: NO-BREAK SPACE*/
+    0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
+    0xa2, /* U+0000a2: CENT SIGN*/
+    0xa3, /* U+0000a3: POUND SIGN*/
+    0xa4, /* U+0000a4: CURRENCY SIGN*/
+    0xa5, /* U+0000a5: YEN SIGN*/
+    0xa6, /* U+0000a6: BROKEN BAR*/
+    0xa7, /* U+0000a7: SECTION SIGN*/
+    0xa8, /* U+0000a8: DIAERESIS*/
+    0xa9, /* U+0000a9: COPYRIGHT SIGN*/
+    0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
+    0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+    0xac, /* U+0000ac: NOT SIGN*/
+    0xad, /* U+0000ad: SOFT HYPHEN*/
+    0xae, /* U+0000ae: REGISTERED SIGN*/
+    0xaf, /* U+0000af: MACRON*/
+    0xb0, /* U+0000b0: DEGREE SIGN*/
+    0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
+    0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
+    0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
+    0xb4, /* U+0000b4: ACUTE ACCENT*/
+    0x39c, /* U+0000b5: MICRO SIGN*/
+    0xb6, /* U+0000b6: PILCROW SIGN*/
+    0xb7, /* U+0000b7: MIDDLE DOT*/
+    0xb8, /* U+0000b8: CEDILLA*/
+    0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
+    0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
+    0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
+    0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
+    0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
+    0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
+    0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
+    0xc0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
+    0xc1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
+    0xc2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
+    0xc3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
+    0xc4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
+    0xc5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
+    0xc6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
+    0xc7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
+    0xc8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
+    0xc9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
+    0xca, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
+    0xcb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
+    0xcc, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
+    0xcd, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
+    0xce, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
+    0xcf, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
+    0xd0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
+    0xd1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
+    0xd2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
+    0xd3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
+    0xd4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
+    0xd5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
+    0xd6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
+    0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
+    0xd8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
+    0xd9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
+    0xda, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
+    0xdb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
+    0xdc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
+    0xdd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
+    0xde, /* U+0000de: LATIN CAPITAL LETTER THORN*/
+    0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
+    0xc0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
+    0xc1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
+    0xc2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
+    0xc3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
+    0xc4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
+    0xc5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
+    0xc6, /* U+0000e6: LATIN SMALL LETTER AE*/
+    0xc7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
+    0xc8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
+    0xc9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
+    0xca, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
+    0xcb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
+    0xcc, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
+    0xcd, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
+    0xce, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
+    0xcf, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
+    0xd0, /* U+0000f0: LATIN SMALL LETTER ETH*/
+    0xd1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
+    0xd2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
+    0xd3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
+    0xd4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
+    0xd5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
+    0xd6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
+    0xf7, /* U+0000f7: DIVISION SIGN*/
+    0xd8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
+    0xd9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
+    0xda, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
+    0xdb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
+    0xdc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
+    0xdd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
+    0xde, /* U+0000fe: LATIN SMALL LETTER THORN*/
+    0x178, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
+    0x100, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
+    0x100, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
+    0x102, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
+    0x102, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
+    0x104, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
+    0x104, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
+    0x106, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
+    0x106, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
+    0x108, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
+    0x108, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
+    0x10a, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
+    0x10a, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
+    0x10c, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
+    0x10c, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
+    0x10e, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
+    0x10e, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
+    0x110, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
+    0x110, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
+    0x112, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
+    0x112, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
+    0x114, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
+    0x114, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
+    0x116, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
+    0x116, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
+    0x118, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
+    0x118, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
+    0x11a, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
+    0x11a, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
+    0x11c, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
+    0x11c, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
+    0x11e, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
+    0x11e, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
+    0x120, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
+    0x120, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
+    0x122, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
+    0x122, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
+    0x124, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
+    0x124, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
+    0x126, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
+    0x126, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
+    0x128, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
+    0x128, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
+    0x12a, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
+    0x12a, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
+    0x12c, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
+    0x12c, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
+    0x12e, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
+    0x12e, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
+    0x130, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
+    0x49, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
+    0x132, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
+    0x132, /* U+000133: LATIN SMALL LIGATURE IJ*/
+    0x134, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
+    0x134, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
+    0x136, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
+    0x136, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
+    0x138, /* U+000138: LATIN SMALL LETTER KRA*/
+    0x139, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
+    0x139, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
+    0x13b, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
+    0x13b, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
+    0x13d, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
+    0x13d, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
+    0x13f, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
+    0x13f, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
+    0x141, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
+    0x141, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
+    0x143, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
+    0x143, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
+    0x145, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
+    0x145, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
+    0x147, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
+    0x147, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
+    0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
+    0x14a, /* U+00014a: LATIN CAPITAL LETTER ENG*/
+    0x14a, /* U+00014b: LATIN SMALL LETTER ENG*/
+    0x14c, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
+    0x14c, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
+    0x14e, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
+    0x14e, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
+    0x150, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
+    0x150, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
+    0x152, /* U+000152: LATIN CAPITAL LIGATURE OE*/
+    0x152, /* U+000153: LATIN SMALL LIGATURE OE*/
+    0x154, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
+    0x154, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
+    0x156, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
+    0x156, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
+    0x158, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
+    0x158, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
+    0x15a, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
+    0x15a, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
+    0x15c, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
+    0x15c, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
+    0x15e, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
+    0x15e, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
+    0x160, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
+    0x160, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
+    0x162, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
+    0x162, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
+    0x164, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
+    0x164, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
+    0x166, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
+    0x166, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
+    0x168, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
+    0x168, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
+    0x16a, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
+    0x16a, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
+    0x16c, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
+    0x16c, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
+    0x16e, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
+    0x16e, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
+    0x170, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
+    0x170, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
+    0x172, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
+    0x172, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
+    0x174, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
+    0x174, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
+    0x176, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
+    0x176, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
+    0x178, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
+    0x179, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
+    0x179, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
+    0x17b, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
+    0x17b, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
+    0x17d, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
+    0x17d, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
+    0x53, /* U+00017f: LATIN SMALL LETTER LONG S*/
+    0x243, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
+    0x181, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
+    0x182, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
+    0x182, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
+    0x184, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
+    0x184, /* U+000185: LATIN SMALL LETTER TONE SIX*/
+    0x186, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
+    0x187, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
+    0x187, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
+    0x189, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
+    0x18a, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
+    0x18b, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
+    0x18b, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
+    0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
+    0x18e, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
+    0x18f, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
+    0x190, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
+    0x191, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
+    0x191, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
+    0x193, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
+    0x194, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
+    0x1f6, /* U+000195: LATIN SMALL LETTER HV*/
+    0x196, /* U+000196: LATIN CAPITAL LETTER IOTA*/
+    0x197, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
+    0x198, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
+    0x198, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
+    0x23d, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
+    0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
+    0x19c, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
+    0x19d, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
+    0x220, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
+    0x19f, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
+    0x1a0, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
+    0x1a0, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
+    0x1a2, /* U+0001a2: LATIN CAPITAL LETTER OI*/
+    0x1a2, /* U+0001a3: LATIN SMALL LETTER OI*/
+    0x1a4, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
+    0x1a4, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
+    0x1a6, /* U+0001a6: LATIN LETTER YR*/
+    0x1a7, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
+    0x1a7, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
+    0x1a9, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
+    0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
+    0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
+    0x1ac, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
+    0x1ac, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
+    0x1ae, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
+    0x1af, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
+    0x1af, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
+    0x1b1, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
+    0x1b2, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
+    0x1b3, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
+    0x1b3, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
+    0x1b5, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
+    0x1b5, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
+    0x1b7, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
+    0x1b8, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
+    0x1b8, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
+    0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
+    0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
+    0x1bc, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
+    0x1bc, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
+    0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
+    0x1f7, /* U+0001bf: LATIN LETTER WYNN*/
+    0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
+    0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
+    0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
+    0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
+    0x1c4, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
+    0x1c4, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
+    0x1c4, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
+    0x1c7, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
+    0x1c7, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
+    0x1c7, /* U+0001c9: LATIN SMALL LETTER LJ*/
+    0x1ca, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
+    0x1ca, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
+    0x1ca, /* U+0001cc: LATIN SMALL LETTER NJ*/
+    0x1cd, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
+    0x1cd, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
+    0x1cf, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
+    0x1cf, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
+    0x1d1, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
+    0x1d1, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
+    0x1d3, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
+    0x1d3, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
+    0x1d5, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
+    0x1d5, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
+    0x1d7, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
+    0x1d7, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
+    0x1d9, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
+    0x1d9, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
+    0x1db, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
+    0x1db, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
+    0x18e, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
+    0x1de, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
+    0x1de, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
+    0x1e0, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
+    0x1e0, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
+    0x1e2, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
+    0x1e2, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
+    0x1e4, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
+    0x1e4, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
+    0x1e6, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
+    0x1e6, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
+    0x1e8, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
+    0x1e8, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
+    0x1ea, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
+    0x1ea, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
+    0x1ec, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
+    0x1ec, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
+    0x1ee, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
+    0x1ee, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
+    0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
+    0x1f1, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
+    0x1f1, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
+    0x1f1, /* U+0001f3: LATIN SMALL LETTER DZ*/
+    0x1f4, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
+    0x1f4, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
+    0x1f6, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
+    0x1f7, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
+    0x1f8, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
+    0x1f8, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
+    0x1fa, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
+    0x1fa, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
+    0x1fc, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
+    0x1fc, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
+    0x1fe, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
+    0x1fe, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
+    0x200, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
+    0x200, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
+    0x202, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
+    0x202, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
+    0x204, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
+    0x204, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
+    0x206, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
+    0x206, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
+    0x208, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
+    0x208, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
+    0x20a, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
+    0x20a, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
+    0x20c, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
+    0x20c, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
+    0x20e, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
+    0x20e, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
+    0x210, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
+    0x210, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
+    0x212, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
+    0x212, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
+    0x214, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
+    0x214, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
+    0x216, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
+    0x216, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
+    0x218, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
+    0x218, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
+    0x21a, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
+    0x21a, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
+    0x21c, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
+    0x21c, /* U+00021d: LATIN SMALL LETTER YOGH*/
+    0x21e, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
+    0x21e, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
+    0x220, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
+    0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
+    0x222, /* U+000222: LATIN CAPITAL LETTER OU*/
+    0x222, /* U+000223: LATIN SMALL LETTER OU*/
+    0x224, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
+    0x224, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
+    0x226, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
+    0x226, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
+    0x228, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
+    0x228, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
+    0x22a, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
+    0x22a, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
+    0x22c, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
+    0x22c, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
+    0x22e, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
+    0x22e, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
+    0x230, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
+    0x230, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
+    0x232, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
+    0x232, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
+    0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
+    0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
+    0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
+    0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
+    0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
+    0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
+    0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
+    0x23b, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
+    0x23b, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
+    0x23d, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
+    0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
+    0x2c7e, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
+    0x2c7f, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
+    0x241, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
+    0x241, /* U+000242: LATIN SMALL LETTER GLOTTAL STOP*/
+    0x243, /* U+000243: LATIN CAPITAL LETTER B WITH STROKE*/
+    0x244, /* U+000244: LATIN CAPITAL LETTER U BAR*/
+    0x245, /* U+000245: LATIN CAPITAL LETTER TURNED V*/
+    0x246, /* U+000246: LATIN CAPITAL LETTER E WITH STROKE*/
+    0x246, /* U+000247: LATIN SMALL LETTER E WITH STROKE*/
+    0x248, /* U+000248: LATIN CAPITAL LETTER J WITH STROKE*/
+    0x248, /* U+000249: LATIN SMALL LETTER J WITH STROKE*/
+    0x24a, /* U+00024a: LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL*/
+    0x24a, /* U+00024b: LATIN SMALL LETTER Q WITH HOOK TAIL*/
+    0x24c, /* U+00024c: LATIN CAPITAL LETTER R WITH STROKE*/
+    0x24c, /* U+00024d: LATIN SMALL LETTER R WITH STROKE*/
+    0x24e, /* U+00024e: LATIN CAPITAL LETTER Y WITH STROKE*/
+    0x24e, /* U+00024f: LATIN SMALL LETTER Y WITH STROKE*/
+    0x2c6f, /* U+000250: LATIN SMALL LETTER TURNED A*/
+    0x2c6d, /* U+000251: LATIN SMALL LETTER ALPHA*/
+    0x2c70, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
+    0x181, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
+    0x186, /* U+000254: LATIN SMALL LETTER OPEN O*/
+    0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
+    0x189, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
+    0x18a, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
+    0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
+    0x18f, /* U+000259: LATIN SMALL LETTER SCHWA*/
+    0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
+    0x190, /* U+00025b: LATIN SMALL LETTER OPEN E*/
+    0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
+    0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
+    0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
+    0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
+    0x193, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
+    0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
+    0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
+    0x194, /* U+000263: LATIN SMALL LETTER GAMMA*/
+    0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
+    0xa78d, /* U+000265: LATIN SMALL LETTER TURNED H*/
+    0xa7aa, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
+    0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
+    0x197, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
+    0x196, /* U+000269: LATIN SMALL LETTER IOTA*/
+    0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
+    0x2c62, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
+    0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
+    0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
+    0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
+    0x19c, /* U+00026f: LATIN SMALL LETTER TURNED M*/
+    0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
+    0x2c6e, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
+    0x19d, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
+    0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
+    0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
+    0x19f, /* U+000275: LATIN SMALL LETTER BARRED O*/
+    0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
+    0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
+    0x278, /* U+000278: LATIN SMALL LETTER PHI*/
+    0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
+    0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
+    0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
+    0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
+    0x2c64, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
+    0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
+    0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
+    0x1a6, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
+    0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
+    0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
+    0x1a9, /* U+000283: LATIN SMALL LETTER ESH*/
+    0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
+    0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
+    0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
+    0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
+    0x1ae, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
+    0x244, /* U+000289: LATIN SMALL LETTER U BAR*/
+    0x1b1, /* U+00028a: LATIN SMALL LETTER UPSILON*/
+    0x1b2, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
+    0x245, /* U+00028c: LATIN SMALL LETTER TURNED V*/
+    0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
+    0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
+    0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
+    0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
+    0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
+    0x1b7, /* U+000292: LATIN SMALL LETTER EZH*/
+    0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
+    0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
+    0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
+    0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
+    0x297, /* U+000297: LATIN LETTER STRETCHED C*/
+    0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
+    0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
+    0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
+    0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
+    0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
+    0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
+    0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
+    0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
+    0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
+    0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
+    0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
+    0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
+    0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
+    0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
+    0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
+    0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
+    0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
+    0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
+    0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
+    0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
+    0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
+    0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
+    0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
+    0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
+    0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
+    0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
+    0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
+    0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
+    0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
+    0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
+    0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
+    0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
+    0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
+    0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
+    0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
+    0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
+    0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
+    0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
+    0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
+    0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
+    0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
+    0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
+    0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
+    0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
+    0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
+    0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
+    0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
+    0x2c7, /* U+0002c7: CARON*/
+    0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
+    0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
+    0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
+    0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
+    0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
+    0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
+    0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
+    0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
+    0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
+    0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
+    0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
+    0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
+    0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
+    0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
+    0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
+    0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
+    0x2d8, /* U+0002d8: BREVE*/
+    0x2d9, /* U+0002d9: DOT ABOVE*/
+    0x2da, /* U+0002da: RING ABOVE*/
+    0x2db, /* U+0002db: OGONEK*/
+    0x2dc, /* U+0002dc: SMALL TILDE*/
+    0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
+    0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
+    0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
+    0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
+    0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
+    0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
+    0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
+    0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
+    0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
+    0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
+    0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
+    0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
+    0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
+    0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
+    0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
+    0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
+    0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
+    0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
+    0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
+    0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
+    0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
+    0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
+    0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
+    0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
+    0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
+    0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
+    0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
+    0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
+    0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
+    0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
+    0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
+    0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
+    0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
+    0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
+    0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
+    0x300, /* U+000300: COMBINING GRAVE ACCENT*/
+    0x301, /* U+000301: COMBINING ACUTE ACCENT*/
+    0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
+    0x303, /* U+000303: COMBINING TILDE*/
+    0x304, /* U+000304: COMBINING MACRON*/
+    0x305, /* U+000305: COMBINING OVERLINE*/
+    0x306, /* U+000306: COMBINING BREVE*/
+    0x307, /* U+000307: COMBINING DOT ABOVE*/
+    0x308, /* U+000308: COMBINING DIAERESIS*/
+    0x309, /* U+000309: COMBINING HOOK ABOVE*/
+    0x30a, /* U+00030a: COMBINING RING ABOVE*/
+    0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
+    0x30c, /* U+00030c: COMBINING CARON*/
+    0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
+    0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
+    0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
+    0x310, /* U+000310: COMBINING CANDRABINDU*/
+    0x311, /* U+000311: COMBINING INVERTED BREVE*/
+    0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
+    0x313, /* U+000313: COMBINING COMMA ABOVE*/
+    0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
+    0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
+    0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
+    0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
+    0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
+    0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
+    0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
+    0x31b, /* U+00031b: COMBINING HORN*/
+    0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
+    0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
+    0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
+    0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
+    0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
+    0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
+    0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
+    0x323, /* U+000323: COMBINING DOT BELOW*/
+    0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
+    0x325, /* U+000325: COMBINING RING BELOW*/
+    0x326, /* U+000326: COMBINING COMMA BELOW*/
+    0x327, /* U+000327: COMBINING CEDILLA*/
+    0x328, /* U+000328: COMBINING OGONEK*/
+    0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
+    0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
+    0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
+    0x32c, /* U+00032c: COMBINING CARON BELOW*/
+    0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
+    0x32e, /* U+00032e: COMBINING BREVE BELOW*/
+    0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
+    0x330, /* U+000330: COMBINING TILDE BELOW*/
+    0x331, /* U+000331: COMBINING MACRON BELOW*/
+    0x332, /* U+000332: COMBINING LOW LINE*/
+    0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
+    0x334, /* U+000334: COMBINING TILDE OVERLAY*/
+    0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
+    0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
+    0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
+    0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
+    0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
+    0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
+    0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
+    0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
+    0x33d, /* U+00033d: COMBINING X ABOVE*/
+    0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
+    0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
+    0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
+    0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
+    0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
+    0x343, /* U+000343: COMBINING GREEK KORONIS*/
+    0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
+    0x399, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
+    0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
+    0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
+    0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
+    0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
+    0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
+    0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
+    0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
+    0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
+    0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
+    0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
+    0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
+    0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
+    0x352, /* U+000352: COMBINING FERMATA*/
+    0x353, /* U+000353: COMBINING X BELOW*/
+    0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
+    0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
+    0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
+    0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
+    0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
+    0x359, /* U+000359: COMBINING ASTERISK BELOW*/
+    0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
+    0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
+    0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
+    0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
+    0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
+    0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
+    0x360, /* U+000360: COMBINING DOUBLE TILDE*/
+    0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
+    0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
+    0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
+    0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
+    0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
+    0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
+    0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
+    0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
+    0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
+    0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
+    0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
+    0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
+    0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
+    0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
+    0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
+    0x370, /* U+000370: GREEK CAPITAL LETTER HETA*/
+    0x370, /* U+000371: GREEK SMALL LETTER HETA*/
+    0x372, /* U+000372: GREEK CAPITAL LETTER ARCHAIC SAMPI*/
+    0x372, /* U+000373: GREEK SMALL LETTER ARCHAIC SAMPI*/
+    0x374, /* U+000374: GREEK NUMERAL SIGN*/
+    0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
+    0x376, /* U+000376: GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA*/
+    0x376, /* U+000377: GREEK SMALL LETTER PAMPHYLIAN DIGAMMA*/
+    0x378, /* U+000378: */
+    0x379, /* U+000379: */
+    0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
+    0x3fd, /* U+00037b: GREEK SMALL REVERSED LUNATE SIGMA SYMBOL*/
+    0x3fe, /* U+00037c: GREEK SMALL DOTTED LUNATE SIGMA SYMBOL*/
+    0x3ff, /* U+00037d: GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+    0x37e, /* U+00037e: GREEK QUESTION MARK*/
+    0x37f, /* U+00037f: */
+    0x380, /* U+000380: */
+    0x381, /* U+000381: */
+    0x382, /* U+000382: */
+    0x383, /* U+000383: */
+    0x384, /* U+000384: GREEK TONOS*/
+    0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
+    0x386, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
+    0x387, /* U+000387: GREEK ANO TELEIA*/
+    0x388, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
+    0x389, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
+    0x38a, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
+    0x38b, /* U+00038b: */
+    0x38c, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
+    0x38d, /* U+00038d: */
+    0x38e, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
+    0x38f, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
+    0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
+    0x391, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
+    0x392, /* U+000392: GREEK CAPITAL LETTER BETA*/
+    0x393, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
+    0x394, /* U+000394: GREEK CAPITAL LETTER DELTA*/
+    0x395, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
+    0x396, /* U+000396: GREEK CAPITAL LETTER ZETA*/
+    0x397, /* U+000397: GREEK CAPITAL LETTER ETA*/
+    0x398, /* U+000398: GREEK CAPITAL LETTER THETA*/
+    0x399, /* U+000399: GREEK CAPITAL LETTER IOTA*/
+    0x39a, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
+    0x39b, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
+    0x39c, /* U+00039c: GREEK CAPITAL LETTER MU*/
+    0x39d, /* U+00039d: GREEK CAPITAL LETTER NU*/
+    0x39e, /* U+00039e: GREEK CAPITAL LETTER XI*/
+    0x39f, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
+    0x3a0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
+    0x3a1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
+    0x3a2, /* U+0003a2: */
+    0x3a3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
+    0x3a4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
+    0x3a5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
+    0x3a6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
+    0x3a7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
+    0x3a8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
+    0x3a9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
+    0x3aa, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
+    0x3ab, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
+    0x386, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
+    0x388, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
+    0x389, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
+    0x38a, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
+    0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
+    0x391, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
+    0x392, /* U+0003b2: GREEK SMALL LETTER BETA*/
+    0x393, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
+    0x394, /* U+0003b4: GREEK SMALL LETTER DELTA*/
+    0x395, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
+    0x396, /* U+0003b6: GREEK SMALL LETTER ZETA*/
+    0x397, /* U+0003b7: GREEK SMALL LETTER ETA*/
+    0x398, /* U+0003b8: GREEK SMALL LETTER THETA*/
+    0x399, /* U+0003b9: GREEK SMALL LETTER IOTA*/
+    0x39a, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
+    0x39b, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
+    0x39c, /* U+0003bc: GREEK SMALL LETTER MU*/
+    0x39d, /* U+0003bd: GREEK SMALL LETTER NU*/
+    0x39e, /* U+0003be: GREEK SMALL LETTER XI*/
+    0x39f, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
+    0x3a0, /* U+0003c0: GREEK SMALL LETTER PI*/
+    0x3a1, /* U+0003c1: GREEK SMALL LETTER RHO*/
+    0x3a3, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
+    0x3a3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
+    0x3a4, /* U+0003c4: GREEK SMALL LETTER TAU*/
+    0x3a5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
+    0x3a6, /* U+0003c6: GREEK SMALL LETTER PHI*/
+    0x3a7, /* U+0003c7: GREEK SMALL LETTER CHI*/
+    0x3a8, /* U+0003c8: GREEK SMALL LETTER PSI*/
+    0x3a9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
+    0x3aa, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
+    0x3ab, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
+    0x38c, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
+    0x38e, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
+    0x38f, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
+    0x3cf, /* U+0003cf: GREEK CAPITAL KAI SYMBOL*/
+    0x392, /* U+0003d0: GREEK BETA SYMBOL*/
+    0x398, /* U+0003d1: GREEK THETA SYMBOL*/
+    0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
+    0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
+    0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
+    0x3a6, /* U+0003d5: GREEK PHI SYMBOL*/
+    0x3a0, /* U+0003d6: GREEK PI SYMBOL*/
+    0x3cf, /* U+0003d7: GREEK KAI SYMBOL*/
+    0x3d8, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
+    0x3d8, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
+    0x3da, /* U+0003da: GREEK LETTER STIGMA*/
+    0x3da, /* U+0003db: GREEK SMALL LETTER STIGMA*/
+    0x3dc, /* U+0003dc: GREEK LETTER DIGAMMA*/
+    0x3dc, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
+    0x3de, /* U+0003de: GREEK LETTER KOPPA*/
+    0x3de, /* U+0003df: GREEK SMALL LETTER KOPPA*/
+    0x3e0, /* U+0003e0: GREEK LETTER SAMPI*/
+    0x3e0, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
+    0x3e2, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
+    0x3e2, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
+    0x3e4, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
+    0x3e4, /* U+0003e5: COPTIC SMALL LETTER FEI*/
+    0x3e6, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
+    0x3e6, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
+    0x3e8, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
+    0x3e8, /* U+0003e9: COPTIC SMALL LETTER HORI*/
+    0x3ea, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
+    0x3ea, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
+    0x3ec, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
+    0x3ec, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
+    0x3ee, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
+    0x3ee, /* U+0003ef: COPTIC SMALL LETTER DEI*/
+    0x39a, /* U+0003f0: GREEK KAPPA SYMBOL*/
+    0x3a1, /* U+0003f1: GREEK RHO SYMBOL*/
+    0x3f9, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
+    0x3f3, /* U+0003f3: GREEK LETTER YOT*/
+    0x3f4, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
+    0x395, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
+    0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
+    0x3f7, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
+    0x3f7, /* U+0003f8: GREEK SMALL LETTER SHO*/
+    0x3f9, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
+    0x3fa, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
+    0x3fa, /* U+0003fb: GREEK SMALL LETTER SAN*/
+    0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
+    0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
+    0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
+    0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
+    0x400, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
+    0x401, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
+    0x402, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
+    0x403, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
+    0x404, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
+    0x405, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
+    0x406, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
+    0x407, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
+    0x408, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
+    0x409, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
+    0x40a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
+    0x40b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
+    0x40c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
+    0x40d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
+    0x40e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
+    0x40f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
+    0x410, /* U+000410: CYRILLIC CAPITAL LETTER A*/
+    0x411, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
+    0x412, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
+    0x413, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
+    0x414, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
+    0x415, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
+    0x416, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
+    0x417, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
+    0x418, /* U+000418: CYRILLIC CAPITAL LETTER I*/
+    0x419, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
+    0x41a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
+    0x41b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
+    0x41c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
+    0x41d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
+    0x41e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
+    0x41f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
+    0x420, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
+    0x421, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
+    0x422, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
+    0x423, /* U+000423: CYRILLIC CAPITAL LETTER U*/
+    0x424, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
+    0x425, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
+    0x426, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
+    0x427, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
+    0x428, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
+    0x429, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
+    0x42a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
+    0x42b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
+    0x42c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
+    0x42d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
+    0x42e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
+    0x42f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
+    0x410, /* U+000430: CYRILLIC SMALL LETTER A*/
+    0x411, /* U+000431: CYRILLIC SMALL LETTER BE*/
+    0x412, /* U+000432: CYRILLIC SMALL LETTER VE*/
+    0x413, /* U+000433: CYRILLIC SMALL LETTER GHE*/
+    0x414, /* U+000434: CYRILLIC SMALL LETTER DE*/
+    0x415, /* U+000435: CYRILLIC SMALL LETTER IE*/
+    0x416, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
+    0x417, /* U+000437: CYRILLIC SMALL LETTER ZE*/
+    0x418, /* U+000438: CYRILLIC SMALL LETTER I*/
+    0x419, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
+    0x41a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
+    0x41b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
+    0x41c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
+    0x41d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
+    0x41e, /* U+00043e: CYRILLIC SMALL LETTER O*/
+    0x41f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
+    0x420, /* U+000440: CYRILLIC SMALL LETTER ER*/
+    0x421, /* U+000441: CYRILLIC SMALL LETTER ES*/
+    0x422, /* U+000442: CYRILLIC SMALL LETTER TE*/
+    0x423, /* U+000443: CYRILLIC SMALL LETTER U*/
+    0x424, /* U+000444: CYRILLIC SMALL LETTER EF*/
+    0x425, /* U+000445: CYRILLIC SMALL LETTER HA*/
+    0x426, /* U+000446: CYRILLIC SMALL LETTER TSE*/
+    0x427, /* U+000447: CYRILLIC SMALL LETTER CHE*/
+    0x428, /* U+000448: CYRILLIC SMALL LETTER SHA*/
+    0x429, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
+    0x42a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
+    0x42b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
+    0x42c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
+    0x42d, /* U+00044d: CYRILLIC SMALL LETTER E*/
+    0x42e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
+    0x42f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
+    0x400, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
+    0x401, /* U+000451: CYRILLIC SMALL LETTER IO*/
+    0x402, /* U+000452: CYRILLIC SMALL LETTER DJE*/
+    0x403, /* U+000453: CYRILLIC SMALL LETTER GJE*/
+    0x404, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
+    0x405, /* U+000455: CYRILLIC SMALL LETTER DZE*/
+    0x406, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
+    0x407, /* U+000457: CYRILLIC SMALL LETTER YI*/
+    0x408, /* U+000458: CYRILLIC SMALL LETTER JE*/
+    0x409, /* U+000459: CYRILLIC SMALL LETTER LJE*/
+    0x40a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
+    0x40b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
+    0x40c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
+    0x40d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
+    0x40e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
+    0x40f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
+    0x460, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
+    0x460, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
+    0x462, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
+    0x462, /* U+000463: CYRILLIC SMALL LETTER YAT*/
+    0x464, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
+    0x464, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
+    0x466, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
+    0x466, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
+    0x468, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
+    0x468, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
+    0x46a, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
+    0x46a, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
+    0x46c, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
+    0x46c, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
+    0x46e, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
+    0x46e, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
+    0x470, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
+    0x470, /* U+000471: CYRILLIC SMALL LETTER PSI*/
+    0x472, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
+    0x472, /* U+000473: CYRILLIC SMALL LETTER FITA*/
+    0x474, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
+    0x474, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
+    0x476, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+    0x476, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
+    0x478, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
+    0x478, /* U+000479: CYRILLIC SMALL LETTER UK*/
+    0x47a, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
+    0x47a, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
+    0x47c, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
+    0x47c, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
+    0x47e, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
+    0x47e, /* U+00047f: CYRILLIC SMALL LETTER OT*/
+    0x480, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
+    0x480, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
+    0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
+    0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
+    0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
+    0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
+    0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
+    0x487, /* U+000487: COMBINING CYRILLIC POKRYTIE*/
+    0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
+    0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
+    0x48a, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
+    0x48a, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
+    0x48c, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
+    0x48c, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
+    0x48e, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
+    0x48e, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
+    0x490, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
+    0x490, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
+    0x492, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
+    0x492, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
+    0x494, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
+    0x494, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
+    0x496, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
+    0x496, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
+    0x498, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
+    0x498, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
+    0x49a, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
+    0x49a, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
+    0x49c, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
+    0x49c, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
+    0x49e, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
+    0x49e, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
+    0x4a0, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
+    0x4a0, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
+    0x4a2, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
+    0x4a2, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
+    0x4a4, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
+    0x4a4, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
+    0x4a6, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
+    0x4a6, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
+    0x4a8, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
+    0x4a8, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
+    0x4aa, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
+    0x4aa, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
+    0x4ac, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
+    0x4ac, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
+    0x4ae, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
+    0x4ae, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
+    0x4b0, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
+    0x4b0, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
+    0x4b2, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
+    0x4b2, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
+    0x4b4, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
+    0x4b4, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
+    0x4b6, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
+    0x4b6, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
+    0x4b8, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
+    0x4b8, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
+    0x4ba, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
+    0x4ba, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
+    0x4bc, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
+    0x4bc, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
+    0x4be, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
+    0x4be, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
+    0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
+    0x4c1, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
+    0x4c1, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
+    0x4c3, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
+    0x4c3, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
+    0x4c5, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
+    0x4c5, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
+    0x4c7, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
+    0x4c7, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
+    0x4c9, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
+    0x4c9, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
+    0x4cb, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
+    0x4cb, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
+    0x4cd, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
+    0x4cd, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
+    0x4c0, /* U+0004cf: CYRILLIC SMALL LETTER PALOCHKA*/
+    0x4d0, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
+    0x4d0, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
+    0x4d2, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
+    0x4d2, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
+    0x4d4, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
+    0x4d4, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
+    0x4d6, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
+    0x4d6, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
+    0x4d8, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
+    0x4d8, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
+    0x4da, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
+    0x4da, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
+    0x4dc, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
+    0x4dc, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
+    0x4de, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
+    0x4de, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
+    0x4e0, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
+    0x4e0, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
+    0x4e2, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
+    0x4e2, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
+    0x4e4, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
+    0x4e4, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
+    0x4e6, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
+    0x4e6, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
+    0x4e8, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
+    0x4e8, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
+    0x4ea, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
+    0x4ea, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
+    0x4ec, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
+    0x4ec, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
+    0x4ee, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
+    0x4ee, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
+    0x4f0, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
+    0x4f0, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
+    0x4f2, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
+    0x4f2, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
+    0x4f4, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
+    0x4f4, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
+    0x4f6, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
+    0x4f6, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
+    0x4f8, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
+    0x4f8, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
+    0x4fa, /* U+0004fa: CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK*/
+    0x4fa, /* U+0004fb: CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK*/
+    0x4fc, /* U+0004fc: CYRILLIC CAPITAL LETTER HA WITH HOOK*/
+    0x4fc, /* U+0004fd: CYRILLIC SMALL LETTER HA WITH HOOK*/
+    0x4fe, /* U+0004fe: CYRILLIC CAPITAL LETTER HA WITH STROKE*/
+    0x4fe, /* U+0004ff: CYRILLIC SMALL LETTER HA WITH STROKE*/
+    0x500, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
+    0x500, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
+    0x502, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
+    0x502, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
+    0x504, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
+    0x504, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
+    0x506, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
+    0x506, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
+    0x508, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
+    0x508, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
+    0x50a, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
+    0x50a, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
+    0x50c, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
+    0x50c, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
+    0x50e, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
+    0x50e, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
+    0x510, /* U+000510: CYRILLIC CAPITAL LETTER REVERSED ZE*/
+    0x510, /* U+000511: CYRILLIC SMALL LETTER REVERSED ZE*/
+    0x512, /* U+000512: CYRILLIC CAPITAL LETTER EL WITH HOOK*/
+    0x512, /* U+000513: CYRILLIC SMALL LETTER EL WITH HOOK*/
+    0x514, /* U+000514: CYRILLIC CAPITAL LETTER LHA*/
+    0x514, /* U+000515: CYRILLIC SMALL LETTER LHA*/
+    0x516, /* U+000516: CYRILLIC CAPITAL LETTER RHA*/
+    0x516, /* U+000517: CYRILLIC SMALL LETTER RHA*/
+    0x518, /* U+000518: CYRILLIC CAPITAL LETTER YAE*/
+    0x518, /* U+000519: CYRILLIC SMALL LETTER YAE*/
+    0x51a, /* U+00051a: CYRILLIC CAPITAL LETTER QA*/
+    0x51a, /* U+00051b: CYRILLIC SMALL LETTER QA*/
+    0x51c, /* U+00051c: CYRILLIC CAPITAL LETTER WE*/
+    0x51c, /* U+00051d: CYRILLIC SMALL LETTER WE*/
+    0x51e, /* U+00051e: CYRILLIC CAPITAL LETTER ALEUT KA*/
+    0x51e, /* U+00051f: CYRILLIC SMALL LETTER ALEUT KA*/
+    0x520, /* U+000520: CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK*/
+    0x520, /* U+000521: CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK*/
+    0x522, /* U+000522: CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK*/
+    0x522, /* U+000523: CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK*/
+    0x524, /* U+000524: CYRILLIC CAPITAL LETTER PE WITH DESCENDER*/
+    0x524, /* U+000525: CYRILLIC SMALL LETTER PE WITH DESCENDER*/
+    0x526, /* U+000526: CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER*/
+    0x526, /* U+000527: CYRILLIC SMALL LETTER SHHA WITH DESCENDER*/
+    0x528, /* U+000528: */
+    0x529, /* U+000529: */
+    0x52a, /* U+00052a: */
+    0x52b, /* U+00052b: */
+    0x52c, /* U+00052c: */
+    0x52d, /* U+00052d: */
+    0x52e, /* U+00052e: */
+    0x52f, /* U+00052f: */
+    0x530, /* U+000530: */
+    0x531, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
+    0x532, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
+    0x533, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
+    0x534, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
+    0x535, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
+    0x536, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
+    0x537, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
+    0x538, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
+    0x539, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
+    0x53a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
+    0x53b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
+    0x53c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
+    0x53d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
+    0x53e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
+    0x53f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
+    0x540, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
+    0x541, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
+    0x542, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
+    0x543, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
+    0x544, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
+    0x545, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
+    0x546, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
+    0x547, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
+    0x548, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
+    0x549, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
+    0x54a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
+    0x54b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
+    0x54c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
+    0x54d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
+    0x54e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
+    0x54f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
+    0x550, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
+    0x551, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
+    0x552, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
+    0x553, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
+    0x554, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
+    0x555, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
+    0x556, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
+    0x557, /* U+000557: */
+    0x558, /* U+000558: */
+    0x559, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
+    0x55a, /* U+00055a: ARMENIAN APOSTROPHE*/
+    0x55b, /* U+00055b: ARMENIAN EMPHASIS MARK*/
+    0x55c, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
+    0x55d, /* U+00055d: ARMENIAN COMMA*/
+    0x55e, /* U+00055e: ARMENIAN QUESTION MARK*/
+    0x55f, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
+    0x560, /* U+000560: */
+    0x531, /* U+000561: ARMENIAN SMALL LETTER AYB*/
+    0x532, /* U+000562: ARMENIAN SMALL LETTER BEN*/
+    0x533, /* U+000563: ARMENIAN SMALL LETTER GIM*/
+    0x534, /* U+000564: ARMENIAN SMALL LETTER DA*/
+    0x535, /* U+000565: ARMENIAN SMALL LETTER ECH*/
+    0x536, /* U+000566: ARMENIAN SMALL LETTER ZA*/
+    0x537, /* U+000567: ARMENIAN SMALL LETTER EH*/
+    0x538, /* U+000568: ARMENIAN SMALL LETTER ET*/
+    0x539, /* U+000569: ARMENIAN SMALL LETTER TO*/
+    0x53a, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
+    0x53b, /* U+00056b: ARMENIAN SMALL LETTER INI*/
+    0x53c, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
+    0x53d, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
+    0x53e, /* U+00056e: ARMENIAN SMALL LETTER CA*/
+    0x53f, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
+    0x540, /* U+000570: ARMENIAN SMALL LETTER HO*/
+    0x541, /* U+000571: ARMENIAN SMALL LETTER JA*/
+    0x542, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
+    0x543, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
+    0x544, /* U+000574: ARMENIAN SMALL LETTER MEN*/
+    0x545, /* U+000575: ARMENIAN SMALL LETTER YI*/
+    0x546, /* U+000576: ARMENIAN SMALL LETTER NOW*/
+    0x547, /* U+000577: ARMENIAN SMALL LETTER SHA*/
+    0x548, /* U+000578: ARMENIAN SMALL LETTER VO*/
+    0x549, /* U+000579: ARMENIAN SMALL LETTER CHA*/
+    0x54a, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
+    0x54b, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
+    0x54c, /* U+00057c: ARMENIAN SMALL LETTER RA*/
+    0x54d, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
+    0x54e, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
+    0x54f, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
+    0x550, /* U+000580: ARMENIAN SMALL LETTER REH*/
+    0x551, /* U+000581: ARMENIAN SMALL LETTER CO*/
+    0x552, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
+    0x553, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
+    0x554, /* U+000584: ARMENIAN SMALL LETTER KEH*/
+    0x555, /* U+000585: ARMENIAN SMALL LETTER OH*/
+    0x556, /* U+000586: ARMENIAN SMALL LETTER FEH*/
+};
+
+static const RTUNICP g_afRTUniUpper0x001d79[] =
+{
+    0xa77d, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
+    0x1d7a, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
+    0x1d7b, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
+    0x1d7c, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
+    0x2c63, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
+    0x1d7e, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
+    0x1d7f, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
+    0x1d80, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
+    0x1d81, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
+    0x1d82, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
+    0x1d83, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
+    0x1d84, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
+    0x1d85, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
+    0x1d86, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
+    0x1d87, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
+    0x1d88, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
+    0x1d89, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
+    0x1d8a, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
+    0x1d8b, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
+    0x1d8c, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
+    0x1d8d, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
+    0x1d8e, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
+    0x1d8f, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
+    0x1d90, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
+    0x1d91, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
+    0x1d92, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
+    0x1d93, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
+    0x1d94, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
+    0x1d95, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
+    0x1d96, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
+    0x1d97, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
+    0x1d98, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
+    0x1d99, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
+    0x1d9a, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
+    0x1d9b, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
+    0x1d9c, /* U+001d9c: MODIFIER LETTER SMALL C*/
+    0x1d9d, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
+    0x1d9e, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
+    0x1d9f, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
+    0x1da0, /* U+001da0: MODIFIER LETTER SMALL F*/
+    0x1da1, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
+    0x1da2, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
+    0x1da3, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
+    0x1da4, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
+    0x1da5, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
+    0x1da6, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
+    0x1da7, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
+    0x1da8, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
+    0x1da9, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
+    0x1daa, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
+    0x1dab, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
+    0x1dac, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
+    0x1dad, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
+    0x1dae, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
+    0x1daf, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
+    0x1db0, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
+    0x1db1, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
+    0x1db2, /* U+001db2: MODIFIER LETTER SMALL PHI*/
+    0x1db3, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
+    0x1db4, /* U+001db4: MODIFIER LETTER SMALL ESH*/
+    0x1db5, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
+    0x1db6, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
+    0x1db7, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
+    0x1db8, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
+    0x1db9, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
+    0x1dba, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
+    0x1dbb, /* U+001dbb: MODIFIER LETTER SMALL Z*/
+    0x1dbc, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
+    0x1dbd, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
+    0x1dbe, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
+    0x1dbf, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
+    0x1dc0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
+    0x1dc1, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
+    0x1dc2, /* U+001dc2: COMBINING SNAKE BELOW*/
+    0x1dc3, /* U+001dc3: COMBINING SUSPENSION MARK*/
+    0x1dc4, /* U+001dc4: COMBINING MACRON-ACUTE*/
+    0x1dc5, /* U+001dc5: COMBINING GRAVE-MACRON*/
+    0x1dc6, /* U+001dc6: COMBINING MACRON-GRAVE*/
+    0x1dc7, /* U+001dc7: COMBINING ACUTE-MACRON*/
+    0x1dc8, /* U+001dc8: COMBINING GRAVE-ACUTE-GRAVE*/
+    0x1dc9, /* U+001dc9: COMBINING ACUTE-GRAVE-ACUTE*/
+    0x1dca, /* U+001dca: COMBINING LATIN SMALL LETTER R BELOW*/
+    0x1dcb, /* U+001dcb: COMBINING BREVE-MACRON*/
+    0x1dcc, /* U+001dcc: COMBINING MACRON-BREVE*/
+    0x1dcd, /* U+001dcd: COMBINING DOUBLE CIRCUMFLEX ABOVE*/
+    0x1dce, /* U+001dce: COMBINING OGONEK ABOVE*/
+    0x1dcf, /* U+001dcf: COMBINING ZIGZAG BELOW*/
+    0x1dd0, /* U+001dd0: COMBINING IS BELOW*/
+    0x1dd1, /* U+001dd1: COMBINING UR ABOVE*/
+    0x1dd2, /* U+001dd2: COMBINING US ABOVE*/
+    0x1dd3, /* U+001dd3: COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE*/
+    0x1dd4, /* U+001dd4: COMBINING LATIN SMALL LETTER AE*/
+    0x1dd5, /* U+001dd5: COMBINING LATIN SMALL LETTER AO*/
+    0x1dd6, /* U+001dd6: COMBINING LATIN SMALL LETTER AV*/
+    0x1dd7, /* U+001dd7: COMBINING LATIN SMALL LETTER C CEDILLA*/
+    0x1dd8, /* U+001dd8: COMBINING LATIN SMALL LETTER INSULAR D*/
+    0x1dd9, /* U+001dd9: COMBINING LATIN SMALL LETTER ETH*/
+    0x1dda, /* U+001dda: COMBINING LATIN SMALL LETTER G*/
+    0x1ddb, /* U+001ddb: COMBINING LATIN LETTER SMALL CAPITAL G*/
+    0x1ddc, /* U+001ddc: COMBINING LATIN SMALL LETTER K*/
+    0x1ddd, /* U+001ddd: COMBINING LATIN SMALL LETTER L*/
+    0x1dde, /* U+001dde: COMBINING LATIN LETTER SMALL CAPITAL L*/
+    0x1ddf, /* U+001ddf: COMBINING LATIN LETTER SMALL CAPITAL M*/
+    0x1de0, /* U+001de0: COMBINING LATIN SMALL LETTER N*/
+    0x1de1, /* U+001de1: COMBINING LATIN LETTER SMALL CAPITAL N*/
+    0x1de2, /* U+001de2: COMBINING LATIN LETTER SMALL CAPITAL R*/
+    0x1de3, /* U+001de3: COMBINING LATIN SMALL LETTER R ROTUNDA*/
+    0x1de4, /* U+001de4: COMBINING LATIN SMALL LETTER S*/
+    0x1de5, /* U+001de5: COMBINING LATIN SMALL LETTER LONG S*/
+    0x1de6, /* U+001de6: COMBINING LATIN SMALL LETTER Z*/
+    0x1de7, /* U+001de7: */
+    0x1de8, /* U+001de8: */
+    0x1de9, /* U+001de9: */
+    0x1dea, /* U+001dea: */
+    0x1deb, /* U+001deb: */
+    0x1dec, /* U+001dec: */
+    0x1ded, /* U+001ded: */
+    0x1dee, /* U+001dee: */
+    0x1def, /* U+001def: */
+    0x1df0, /* U+001df0: */
+    0x1df1, /* U+001df1: */
+    0x1df2, /* U+001df2: */
+    0x1df3, /* U+001df3: */
+    0x1df4, /* U+001df4: */
+    0x1df5, /* U+001df5: */
+    0x1df6, /* U+001df6: */
+    0x1df7, /* U+001df7: */
+    0x1df8, /* U+001df8: */
+    0x1df9, /* U+001df9: */
+    0x1dfa, /* U+001dfa: */
+    0x1dfb, /* U+001dfb: */
+    0x1dfc, /* U+001dfc: COMBINING DOUBLE INVERTED BREVE BELOW*/
+    0x1dfd, /* U+001dfd: COMBINING ALMOST EQUAL TO BELOW*/
+    0x1dfe, /* U+001dfe: COMBINING LEFT ARROWHEAD ABOVE*/
+    0x1dff, /* U+001dff: COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW*/
+    0x1e00, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
+    0x1e00, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
+    0x1e02, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
+    0x1e02, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
+    0x1e04, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
+    0x1e04, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
+    0x1e06, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
+    0x1e06, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
+    0x1e08, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
+    0x1e08, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
+    0x1e0a, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
+    0x1e0a, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
+    0x1e0c, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
+    0x1e0c, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
+    0x1e0e, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
+    0x1e0e, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
+    0x1e10, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
+    0x1e10, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
+    0x1e12, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
+    0x1e12, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
+    0x1e14, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
+    0x1e14, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
+    0x1e16, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
+    0x1e16, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
+    0x1e18, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
+    0x1e18, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
+    0x1e1a, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
+    0x1e1a, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
+    0x1e1c, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
+    0x1e1c, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
+    0x1e1e, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
+    0x1e1e, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
+    0x1e20, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
+    0x1e20, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
+    0x1e22, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
+    0x1e22, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
+    0x1e24, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
+    0x1e24, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
+    0x1e26, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
+    0x1e26, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
+    0x1e28, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
+    0x1e28, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
+    0x1e2a, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
+    0x1e2a, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
+    0x1e2c, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
+    0x1e2c, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
+    0x1e2e, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
+    0x1e2e, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
+    0x1e30, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
+    0x1e30, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
+    0x1e32, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
+    0x1e32, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
+    0x1e34, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
+    0x1e34, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
+    0x1e36, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
+    0x1e36, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
+    0x1e38, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
+    0x1e38, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
+    0x1e3a, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
+    0x1e3a, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
+    0x1e3c, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
+    0x1e3c, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
+    0x1e3e, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
+    0x1e3e, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
+    0x1e40, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
+    0x1e40, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
+    0x1e42, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
+    0x1e42, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
+    0x1e44, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
+    0x1e44, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
+    0x1e46, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
+    0x1e46, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
+    0x1e48, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
+    0x1e48, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
+    0x1e4a, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
+    0x1e4a, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
+    0x1e4c, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
+    0x1e4c, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
+    0x1e4e, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
+    0x1e4e, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
+    0x1e50, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
+    0x1e50, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
+    0x1e52, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
+    0x1e52, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
+    0x1e54, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
+    0x1e54, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
+    0x1e56, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
+    0x1e56, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
+    0x1e58, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
+    0x1e58, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
+    0x1e5a, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
+    0x1e5a, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
+    0x1e5c, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
+    0x1e5c, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
+    0x1e5e, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
+    0x1e5e, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
+    0x1e60, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
+    0x1e60, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
+    0x1e62, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
+    0x1e62, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
+    0x1e64, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
+    0x1e64, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
+    0x1e66, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
+    0x1e66, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
+    0x1e68, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+    0x1e68, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
+    0x1e6a, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
+    0x1e6a, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
+    0x1e6c, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
+    0x1e6c, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
+    0x1e6e, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
+    0x1e6e, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
+    0x1e70, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
+    0x1e70, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
+    0x1e72, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
+    0x1e72, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
+    0x1e74, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
+    0x1e74, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
+    0x1e76, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
+    0x1e76, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
+    0x1e78, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
+    0x1e78, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
+    0x1e7a, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
+    0x1e7a, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
+    0x1e7c, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
+    0x1e7c, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
+    0x1e7e, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
+    0x1e7e, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
+    0x1e80, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
+    0x1e80, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
+    0x1e82, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
+    0x1e82, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
+    0x1e84, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
+    0x1e84, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
+    0x1e86, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
+    0x1e86, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
+    0x1e88, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
+    0x1e88, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
+    0x1e8a, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
+    0x1e8a, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
+    0x1e8c, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
+    0x1e8c, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
+    0x1e8e, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
+    0x1e8e, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
+    0x1e90, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
+    0x1e90, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
+    0x1e92, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
+    0x1e92, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
+    0x1e94, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
+    0x1e94, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
+    0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
+    0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
+    0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
+    0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
+    0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
+    0x1e60, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
+    0x1e9c, /* U+001e9c: LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE*/
+    0x1e9d, /* U+001e9d: LATIN SMALL LETTER LONG S WITH HIGH STROKE*/
+    0x1e9e, /* U+001e9e: LATIN CAPITAL LETTER SHARP S*/
+    0x1e9f, /* U+001e9f: LATIN SMALL LETTER DELTA*/
+    0x1ea0, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
+    0x1ea0, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
+    0x1ea2, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
+    0x1ea2, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
+    0x1ea4, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+    0x1ea4, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
+    0x1ea6, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+    0x1ea6, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
+    0x1ea8, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ea8, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1eaa, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
+    0x1eaa, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
+    0x1eac, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1eac, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1eae, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
+    0x1eae, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
+    0x1eb0, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
+    0x1eb0, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
+    0x1eb2, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
+    0x1eb2, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
+    0x1eb4, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
+    0x1eb4, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
+    0x1eb6, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
+    0x1eb6, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
+    0x1eb8, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
+    0x1eb8, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
+    0x1eba, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
+    0x1eba, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
+    0x1ebc, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
+    0x1ebc, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
+    0x1ebe, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+    0x1ebe, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
+    0x1ec0, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+    0x1ec0, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
+    0x1ec2, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ec2, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ec4, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
+    0x1ec4, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
+    0x1ec6, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ec6, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ec8, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
+    0x1ec8, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
+    0x1eca, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
+    0x1eca, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
+    0x1ecc, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
+    0x1ecc, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
+    0x1ece, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
+    0x1ece, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
+    0x1ed0, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+    0x1ed0, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
+    0x1ed2, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+    0x1ed2, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
+    0x1ed4, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ed4, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
+    0x1ed6, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
+    0x1ed6, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
+    0x1ed8, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1ed8, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
+    0x1eda, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
+    0x1eda, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
+    0x1edc, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
+    0x1edc, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
+    0x1ede, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
+    0x1ede, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
+    0x1ee0, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
+    0x1ee0, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
+    0x1ee2, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
+    0x1ee2, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
+    0x1ee4, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
+    0x1ee4, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
+    0x1ee6, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
+    0x1ee6, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
+    0x1ee8, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
+    0x1ee8, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
+    0x1eea, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
+    0x1eea, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
+    0x1eec, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
+    0x1eec, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
+    0x1eee, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
+    0x1eee, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
+    0x1ef0, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
+    0x1ef0, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
+    0x1ef2, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
+    0x1ef2, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
+    0x1ef4, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
+    0x1ef4, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
+    0x1ef6, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
+    0x1ef6, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
+    0x1ef8, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
+    0x1ef8, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
+    0x1efa, /* U+001efa: LATIN CAPITAL LETTER MIDDLE-WELSH LL*/
+    0x1efa, /* U+001efb: LATIN SMALL LETTER MIDDLE-WELSH LL*/
+    0x1efc, /* U+001efc: LATIN CAPITAL LETTER MIDDLE-WELSH V*/
+    0x1efc, /* U+001efd: LATIN SMALL LETTER MIDDLE-WELSH V*/
+    0x1efe, /* U+001efe: LATIN CAPITAL LETTER Y WITH LOOP*/
+    0x1efe, /* U+001eff: LATIN SMALL LETTER Y WITH LOOP*/
+    0x1f08, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
+    0x1f09, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
+    0x1f0a, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
+    0x1f0b, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
+    0x1f0c, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
+    0x1f0d, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
+    0x1f0e, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+    0x1f0f, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+    0x1f08, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
+    0x1f09, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
+    0x1f0a, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
+    0x1f0b, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
+    0x1f0c, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
+    0x1f0d, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
+    0x1f0e, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
+    0x1f0f, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
+    0x1f18, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
+    0x1f19, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
+    0x1f1a, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
+    0x1f1b, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
+    0x1f1c, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
+    0x1f1d, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
+    0x1f16, /* U+001f16: */
+    0x1f17, /* U+001f17: */
+    0x1f18, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
+    0x1f19, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
+    0x1f1a, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
+    0x1f1b, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
+    0x1f1c, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
+    0x1f1d, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
+    0x1f1e, /* U+001f1e: */
+    0x1f1f, /* U+001f1f: */
+    0x1f28, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
+    0x1f29, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
+    0x1f2a, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
+    0x1f2b, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
+    0x1f2c, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
+    0x1f2d, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
+    0x1f2e, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
+    0x1f2f, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
+    0x1f28, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
+    0x1f29, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
+    0x1f2a, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
+    0x1f2b, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
+    0x1f2c, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
+    0x1f2d, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
+    0x1f2e, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
+    0x1f2f, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
+    0x1f38, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
+    0x1f39, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
+    0x1f3a, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
+    0x1f3b, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
+    0x1f3c, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
+    0x1f3d, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
+    0x1f3e, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+    0x1f3f, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+    0x1f38, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
+    0x1f39, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
+    0x1f3a, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
+    0x1f3b, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
+    0x1f3c, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
+    0x1f3d, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
+    0x1f3e, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
+    0x1f3f, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
+    0x1f48, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
+    0x1f49, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
+    0x1f4a, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
+    0x1f4b, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
+    0x1f4c, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
+    0x1f4d, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
+    0x1f46, /* U+001f46: */
+    0x1f47, /* U+001f47: */
+    0x1f48, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
+    0x1f49, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
+    0x1f4a, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
+    0x1f4b, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
+    0x1f4c, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
+    0x1f4d, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
+    0x1f4e, /* U+001f4e: */
+    0x1f4f, /* U+001f4f: */
+    0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
+    0x1f59, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
+    0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
+    0x1f5b, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
+    0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
+    0x1f5d, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
+    0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
+    0x1f5f, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+    0x1f58, /* U+001f58: */
+    0x1f59, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
+    0x1f5a, /* U+001f5a: */
+    0x1f5b, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
+    0x1f5c, /* U+001f5c: */
+    0x1f5d, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
+    0x1f5e, /* U+001f5e: */
+    0x1f5f, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
+    0x1f68, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
+    0x1f69, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
+    0x1f6a, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
+    0x1f6b, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
+    0x1f6c, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
+    0x1f6d, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
+    0x1f6e, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+    0x1f6f, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+    0x1f68, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
+    0x1f69, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
+    0x1f6a, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
+    0x1f6b, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
+    0x1f6c, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
+    0x1f6d, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
+    0x1f6e, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
+    0x1f6f, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
+    0x1fba, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
+    0x1fbb, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
+    0x1fc8, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
+    0x1fc9, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
+    0x1fca, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
+    0x1fcb, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
+    0x1fda, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
+    0x1fdb, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
+    0x1ff8, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
+    0x1ff9, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
+    0x1fea, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
+    0x1feb, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
+    0x1ffa, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
+    0x1ffb, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
+    0x1f7e, /* U+001f7e: */
+    0x1f7f, /* U+001f7f: */
+    0x1f88, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1f89, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1f8a, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1f8b, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1f8c, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1f8d, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1f8e, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f8f, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f88, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1f89, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1f8a, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1f8b, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1f8c, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1f8d, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1f8e, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f8f, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f98, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1f99, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1f9a, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1f9b, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1f9c, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1f9d, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1f9e, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f9f, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1f98, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1f99, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1f9a, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1f9b, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1f9c, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1f9d, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1f9e, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1f9f, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1fa8, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
+    0x1fa9, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
+    0x1faa, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
+    0x1fab, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
+    0x1fac, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
+    0x1fad, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
+    0x1fae, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1faf, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fa8, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
+    0x1fa9, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
+    0x1faa, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
+    0x1fab, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
+    0x1fac, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
+    0x1fad, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
+    0x1fae, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1faf, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
+    0x1fb8, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
+    0x1fb9, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
+    0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1fbc, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
+    0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1fb5, /* U+001fb5: */
+    0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
+    0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fb8, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
+    0x1fb9, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
+    0x1fba, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
+    0x1fbb, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
+    0x1fbc, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
+    0x1fbd, /* U+001fbd: GREEK KORONIS*/
+    0x399, /* U+001fbe: GREEK PROSGEGRAMMENI*/
+    0x1fbf, /* U+001fbf: GREEK PSILI*/
+    0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
+    0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
+    0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1fcc, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
+    0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1fc5, /* U+001fc5: */
+    0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
+    0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1fc8, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
+    0x1fc9, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
+    0x1fca, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
+    0x1fcb, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
+    0x1fcc, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
+    0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
+    0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
+    0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
+    0x1fd8, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
+    0x1fd9, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
+    0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
+    0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
+    0x1fd4, /* U+001fd4: */
+    0x1fd5, /* U+001fd5: */
+    0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
+    0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
+    0x1fd8, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
+    0x1fd9, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
+    0x1fda, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
+    0x1fdb, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
+    0x1fdc, /* U+001fdc: */
+    0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
+    0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
+    0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
+    0x1fe8, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
+    0x1fe9, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
+    0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
+    0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
+    0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
+    0x1fec, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
+    0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
+    0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
+    0x1fe8, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
+    0x1fe9, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
+    0x1fea, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
+    0x1feb, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
+    0x1fec, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
+    0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
+    0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
+    0x1fef, /* U+001fef: GREEK VARIA*/
+    0x1ff0, /* U+001ff0: */
+    0x1ff1, /* U+001ff1: */
+    0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
+    0x1ffc, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
+    0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
+    0x1ff5, /* U+001ff5: */
+    0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
+    0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
+    0x1ff8, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
+    0x1ff9, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
+    0x1ffa, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
+    0x1ffb, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
+    0x1ffc, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
+    0x1ffd, /* U+001ffd: GREEK OXIA*/
+    0x1ffe, /* U+001ffe: GREEK DASIA*/
+    0x1fff, /* U+001fff: */
+    0x2000, /* U+002000: EN QUAD*/
+    0x2001, /* U+002001: EM QUAD*/
+    0x2002, /* U+002002: EN SPACE*/
+    0x2003, /* U+002003: EM SPACE*/
+    0x2004, /* U+002004: THREE-PER-EM SPACE*/
+    0x2005, /* U+002005: FOUR-PER-EM SPACE*/
+    0x2006, /* U+002006: SIX-PER-EM SPACE*/
+    0x2007, /* U+002007: FIGURE SPACE*/
+    0x2008, /* U+002008: PUNCTUATION SPACE*/
+    0x2009, /* U+002009: THIN SPACE*/
+    0x200a, /* U+00200a: HAIR SPACE*/
+    0x200b, /* U+00200b: ZERO WIDTH SPACE*/
+    0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
+    0x200d, /* U+00200d: ZERO WIDTH JOINER*/
+    0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
+    0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
+    0x2010, /* U+002010: HYPHEN*/
+    0x2011, /* U+002011: NON-BREAKING HYPHEN*/
+    0x2012, /* U+002012: FIGURE DASH*/
+    0x2013, /* U+002013: EN DASH*/
+    0x2014, /* U+002014: EM DASH*/
+    0x2015, /* U+002015: HORIZONTAL BAR*/
+    0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
+    0x2017, /* U+002017: DOUBLE LOW LINE*/
+    0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
+    0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
+    0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
+    0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
+    0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
+    0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
+    0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
+    0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
+    0x2020, /* U+002020: DAGGER*/
+    0x2021, /* U+002021: DOUBLE DAGGER*/
+    0x2022, /* U+002022: BULLET*/
+    0x2023, /* U+002023: TRIANGULAR BULLET*/
+    0x2024, /* U+002024: ONE DOT LEADER*/
+    0x2025, /* U+002025: TWO DOT LEADER*/
+    0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
+    0x2027, /* U+002027: HYPHENATION POINT*/
+    0x2028, /* U+002028: LINE SEPARATOR*/
+    0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
+    0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
+    0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
+    0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
+    0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
+    0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
+    0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
+    0x2030, /* U+002030: PER MILLE SIGN*/
+    0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
+    0x2032, /* U+002032: PRIME*/
+    0x2033, /* U+002033: DOUBLE PRIME*/
+    0x2034, /* U+002034: TRIPLE PRIME*/
+    0x2035, /* U+002035: REVERSED PRIME*/
+    0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
+    0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
+    0x2038, /* U+002038: CARET*/
+    0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
+    0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
+    0x203b, /* U+00203b: REFERENCE MARK*/
+    0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
+    0x203d, /* U+00203d: INTERROBANG*/
+    0x203e, /* U+00203e: OVERLINE*/
+    0x203f, /* U+00203f: UNDERTIE*/
+    0x2040, /* U+002040: CHARACTER TIE*/
+    0x2041, /* U+002041: CARET INSERTION POINT*/
+    0x2042, /* U+002042: ASTERISM*/
+    0x2043, /* U+002043: HYPHEN BULLET*/
+    0x2044, /* U+002044: FRACTION SLASH*/
+    0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
+    0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
+    0x2047, /* U+002047: DOUBLE QUESTION MARK*/
+    0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
+    0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
+    0x204a, /* U+00204a: TIRONIAN SIGN ET*/
+    0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
+    0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
+    0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
+    0x204e, /* U+00204e: LOW ASTERISK*/
+    0x204f, /* U+00204f: REVERSED SEMICOLON*/
+    0x2050, /* U+002050: CLOSE UP*/
+    0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
+    0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
+    0x2053, /* U+002053: SWUNG DASH*/
+    0x2054, /* U+002054: INVERTED UNDERTIE*/
+    0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
+    0x2056, /* U+002056: THREE DOT PUNCTUATION*/
+    0x2057, /* U+002057: QUADRUPLE PRIME*/
+    0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
+    0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
+    0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
+    0x205b, /* U+00205b: FOUR DOT MARK*/
+    0x205c, /* U+00205c: DOTTED CROSS*/
+    0x205d, /* U+00205d: TRICOLON*/
+    0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
+    0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
+    0x2060, /* U+002060: WORD JOINER*/
+    0x2061, /* U+002061: FUNCTION APPLICATION*/
+    0x2062, /* U+002062: INVISIBLE TIMES*/
+    0x2063, /* U+002063: INVISIBLE SEPARATOR*/
+    0x2064, /* U+002064: INVISIBLE PLUS*/
+    0x2065, /* U+002065: */
+    0x2066, /* U+002066: LEFT-TO-RIGHT ISOLATE*/
+    0x2067, /* U+002067: RIGHT-TO-LEFT ISOLATE*/
+    0x2068, /* U+002068: FIRST STRONG ISOLATE*/
+    0x2069, /* U+002069: POP DIRECTIONAL ISOLATE*/
+    0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
+    0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
+    0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
+    0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
+    0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
+    0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
+    0x2070, /* U+002070: SUPERSCRIPT ZERO*/
+    0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
+    0x2072, /* U+002072: */
+    0x2073, /* U+002073: */
+    0x2074, /* U+002074: SUPERSCRIPT FOUR*/
+    0x2075, /* U+002075: SUPERSCRIPT FIVE*/
+    0x2076, /* U+002076: SUPERSCRIPT SIX*/
+    0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
+    0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
+    0x2079, /* U+002079: SUPERSCRIPT NINE*/
+    0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
+    0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
+    0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
+    0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
+    0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
+    0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
+    0x2080, /* U+002080: SUBSCRIPT ZERO*/
+    0x2081, /* U+002081: SUBSCRIPT ONE*/
+    0x2082, /* U+002082: SUBSCRIPT TWO*/
+    0x2083, /* U+002083: SUBSCRIPT THREE*/
+    0x2084, /* U+002084: SUBSCRIPT FOUR*/
+    0x2085, /* U+002085: SUBSCRIPT FIVE*/
+    0x2086, /* U+002086: SUBSCRIPT SIX*/
+    0x2087, /* U+002087: SUBSCRIPT SEVEN*/
+    0x2088, /* U+002088: SUBSCRIPT EIGHT*/
+    0x2089, /* U+002089: SUBSCRIPT NINE*/
+    0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
+    0x208b, /* U+00208b: SUBSCRIPT MINUS*/
+    0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
+    0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
+    0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
+    0x208f, /* U+00208f: */
+    0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
+    0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
+    0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
+    0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
+    0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
+    0x2095, /* U+002095: LATIN SUBSCRIPT SMALL LETTER H*/
+    0x2096, /* U+002096: LATIN SUBSCRIPT SMALL LETTER K*/
+    0x2097, /* U+002097: LATIN SUBSCRIPT SMALL LETTER L*/
+    0x2098, /* U+002098: LATIN SUBSCRIPT SMALL LETTER M*/
+    0x2099, /* U+002099: LATIN SUBSCRIPT SMALL LETTER N*/
+    0x209a, /* U+00209a: LATIN SUBSCRIPT SMALL LETTER P*/
+    0x209b, /* U+00209b: LATIN SUBSCRIPT SMALL LETTER S*/
+    0x209c, /* U+00209c: LATIN SUBSCRIPT SMALL LETTER T*/
+    0x209d, /* U+00209d: */
+    0x209e, /* U+00209e: */
+    0x209f, /* U+00209f: */
+    0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
+    0x20a1, /* U+0020a1: COLON SIGN*/
+    0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
+    0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
+    0x20a4, /* U+0020a4: LIRA SIGN*/
+    0x20a5, /* U+0020a5: MILL SIGN*/
+    0x20a6, /* U+0020a6: NAIRA SIGN*/
+    0x20a7, /* U+0020a7: PESETA SIGN*/
+    0x20a8, /* U+0020a8: RUPEE SIGN*/
+    0x20a9, /* U+0020a9: WON SIGN*/
+    0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
+    0x20ab, /* U+0020ab: DONG SIGN*/
+    0x20ac, /* U+0020ac: EURO SIGN*/
+    0x20ad, /* U+0020ad: KIP SIGN*/
+    0x20ae, /* U+0020ae: TUGRIK SIGN*/
+    0x20af, /* U+0020af: DRACHMA SIGN*/
+    0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
+    0x20b1, /* U+0020b1: PESO SIGN*/
+    0x20b2, /* U+0020b2: GUARANI SIGN*/
+    0x20b3, /* U+0020b3: AUSTRAL SIGN*/
+    0x20b4, /* U+0020b4: HRYVNIA SIGN*/
+    0x20b5, /* U+0020b5: CEDI SIGN*/
+    0x20b6, /* U+0020b6: LIVRE TOURNOIS SIGN*/
+    0x20b7, /* U+0020b7: SPESMILO SIGN*/
+    0x20b8, /* U+0020b8: TENGE SIGN*/
+    0x20b9, /* U+0020b9: INDIAN RUPEE SIGN*/
+    0x20ba, /* U+0020ba: TURKISH LIRA SIGN*/
+    0x20bb, /* U+0020bb: */
+    0x20bc, /* U+0020bc: */
+    0x20bd, /* U+0020bd: */
+    0x20be, /* U+0020be: */
+    0x20bf, /* U+0020bf: */
+    0x20c0, /* U+0020c0: */
+    0x20c1, /* U+0020c1: */
+    0x20c2, /* U+0020c2: */
+    0x20c3, /* U+0020c3: */
+    0x20c4, /* U+0020c4: */
+    0x20c5, /* U+0020c5: */
+    0x20c6, /* U+0020c6: */
+    0x20c7, /* U+0020c7: */
+    0x20c8, /* U+0020c8: */
+    0x20c9, /* U+0020c9: */
+    0x20ca, /* U+0020ca: */
+    0x20cb, /* U+0020cb: */
+    0x20cc, /* U+0020cc: */
+    0x20cd, /* U+0020cd: */
+    0x20ce, /* U+0020ce: */
+    0x20cf, /* U+0020cf: */
+    0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
+    0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
+    0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
+    0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
+    0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
+    0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
+    0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
+    0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
+    0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
+    0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
+    0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
+    0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
+    0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
+    0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
+    0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
+    0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
+    0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
+    0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
+    0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
+    0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
+    0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
+    0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
+    0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
+    0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
+    0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
+    0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
+    0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
+    0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
+    0x20ec, /* U+0020ec: COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x20ed, /* U+0020ed: COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x20ee, /* U+0020ee: COMBINING LEFT ARROW BELOW*/
+    0x20ef, /* U+0020ef: COMBINING RIGHT ARROW BELOW*/
+    0x20f0, /* U+0020f0: COMBINING ASTERISK ABOVE*/
+    0x20f1, /* U+0020f1: */
+    0x20f2, /* U+0020f2: */
+    0x20f3, /* U+0020f3: */
+    0x20f4, /* U+0020f4: */
+    0x20f5, /* U+0020f5: */
+    0x20f6, /* U+0020f6: */
+    0x20f7, /* U+0020f7: */
+    0x20f8, /* U+0020f8: */
+    0x20f9, /* U+0020f9: */
+    0x20fa, /* U+0020fa: */
+    0x20fb, /* U+0020fb: */
+    0x20fc, /* U+0020fc: */
+    0x20fd, /* U+0020fd: */
+    0x20fe, /* U+0020fe: */
+    0x20ff, /* U+0020ff: */
+    0x2100, /* U+002100: ACCOUNT OF*/
+    0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
+    0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
+    0x2103, /* U+002103: DEGREE CELSIUS*/
+    0x2104, /* U+002104: CENTRE LINE SYMBOL*/
+    0x2105, /* U+002105: CARE OF*/
+    0x2106, /* U+002106: CADA UNA*/
+    0x2107, /* U+002107: EULER CONSTANT*/
+    0x2108, /* U+002108: SCRUPLE*/
+    0x2109, /* U+002109: DEGREE FAHRENHEIT*/
+    0x210a, /* U+00210a: SCRIPT SMALL G*/
+    0x210b, /* U+00210b: SCRIPT CAPITAL H*/
+    0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
+    0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
+    0x210e, /* U+00210e: PLANCK CONSTANT*/
+    0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
+    0x2110, /* U+002110: SCRIPT CAPITAL I*/
+    0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
+    0x2112, /* U+002112: SCRIPT CAPITAL L*/
+    0x2113, /* U+002113: SCRIPT SMALL L*/
+    0x2114, /* U+002114: L B BAR SYMBOL*/
+    0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
+    0x2116, /* U+002116: NUMERO SIGN*/
+    0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
+    0x2118, /* U+002118: SCRIPT CAPITAL P*/
+    0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
+    0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
+    0x211b, /* U+00211b: SCRIPT CAPITAL R*/
+    0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
+    0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
+    0x211e, /* U+00211e: PRESCRIPTION TAKE*/
+    0x211f, /* U+00211f: RESPONSE*/
+    0x2120, /* U+002120: SERVICE MARK*/
+    0x2121, /* U+002121: TELEPHONE SIGN*/
+    0x2122, /* U+002122: TRADE MARK SIGN*/
+    0x2123, /* U+002123: VERSICLE*/
+    0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
+    0x2125, /* U+002125: OUNCE SIGN*/
+    0x2126, /* U+002126: OHM SIGN*/
+    0x2127, /* U+002127: INVERTED OHM SIGN*/
+    0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
+    0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
+    0x212a, /* U+00212a: KELVIN SIGN*/
+    0x212b, /* U+00212b: ANGSTROM SIGN*/
+    0x212c, /* U+00212c: SCRIPT CAPITAL B*/
+    0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
+    0x212e, /* U+00212e: ESTIMATED SYMBOL*/
+    0x212f, /* U+00212f: SCRIPT SMALL E*/
+    0x2130, /* U+002130: SCRIPT CAPITAL E*/
+    0x2131, /* U+002131: SCRIPT CAPITAL F*/
+    0x2132, /* U+002132: TURNED CAPITAL F*/
+    0x2133, /* U+002133: SCRIPT CAPITAL M*/
+    0x2134, /* U+002134: SCRIPT SMALL O*/
+    0x2135, /* U+002135: ALEF SYMBOL*/
+    0x2136, /* U+002136: BET SYMBOL*/
+    0x2137, /* U+002137: GIMEL SYMBOL*/
+    0x2138, /* U+002138: DALET SYMBOL*/
+    0x2139, /* U+002139: INFORMATION SOURCE*/
+    0x213a, /* U+00213a: ROTATED CAPITAL Q*/
+    0x213b, /* U+00213b: FACSIMILE SIGN*/
+    0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
+    0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
+    0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
+    0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
+    0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
+    0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
+    0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
+    0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
+    0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
+    0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
+    0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
+    0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
+    0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
+    0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
+    0x214a, /* U+00214a: PROPERTY LINE*/
+    0x214b, /* U+00214b: TURNED AMPERSAND*/
+    0x214c, /* U+00214c: PER SIGN*/
+    0x214d, /* U+00214d: AKTIESELSKAB*/
+    0x2132, /* U+00214e: TURNED SMALL F*/
+    0x214f, /* U+00214f: SYMBOL FOR SAMARITAN SOURCE*/
+    0x2150, /* U+002150: VULGAR FRACTION ONE SEVENTH*/
+    0x2151, /* U+002151: VULGAR FRACTION ONE NINTH*/
+    0x2152, /* U+002152: VULGAR FRACTION ONE TENTH*/
+    0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
+    0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
+    0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
+    0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
+    0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
+    0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
+    0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
+    0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
+    0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
+    0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
+    0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
+    0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
+    0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
+    0x2160, /* U+002160: ROMAN NUMERAL ONE*/
+    0x2161, /* U+002161: ROMAN NUMERAL TWO*/
+    0x2162, /* U+002162: ROMAN NUMERAL THREE*/
+    0x2163, /* U+002163: ROMAN NUMERAL FOUR*/
+    0x2164, /* U+002164: ROMAN NUMERAL FIVE*/
+    0x2165, /* U+002165: ROMAN NUMERAL SIX*/
+    0x2166, /* U+002166: ROMAN NUMERAL SEVEN*/
+    0x2167, /* U+002167: ROMAN NUMERAL EIGHT*/
+    0x2168, /* U+002168: ROMAN NUMERAL NINE*/
+    0x2169, /* U+002169: ROMAN NUMERAL TEN*/
+    0x216a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
+    0x216b, /* U+00216b: ROMAN NUMERAL TWELVE*/
+    0x216c, /* U+00216c: ROMAN NUMERAL FIFTY*/
+    0x216d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
+    0x216e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
+    0x216f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
+    0x2160, /* U+002170: SMALL ROMAN NUMERAL ONE*/
+    0x2161, /* U+002171: SMALL ROMAN NUMERAL TWO*/
+    0x2162, /* U+002172: SMALL ROMAN NUMERAL THREE*/
+    0x2163, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
+    0x2164, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
+    0x2165, /* U+002175: SMALL ROMAN NUMERAL SIX*/
+    0x2166, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
+    0x2167, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
+    0x2168, /* U+002178: SMALL ROMAN NUMERAL NINE*/
+    0x2169, /* U+002179: SMALL ROMAN NUMERAL TEN*/
+    0x216a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
+    0x216b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
+    0x216c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
+    0x216d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
+    0x216e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
+    0x216f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
+    0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
+    0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
+    0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
+    0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
+    0x2183, /* U+002184: LATIN SMALL LETTER REVERSED C*/
+    0x2185, /* U+002185: ROMAN NUMERAL SIX LATE FORM*/
+    0x2186, /* U+002186: ROMAN NUMERAL FIFTY EARLY FORM*/
+    0x2187, /* U+002187: ROMAN NUMERAL FIFTY THOUSAND*/
+    0x2188, /* U+002188: ROMAN NUMERAL ONE HUNDRED THOUSAND*/
+    0x2189, /* U+002189: VULGAR FRACTION ZERO THIRDS*/
+    0x218a, /* U+00218a: */
+    0x218b, /* U+00218b: */
+    0x218c, /* U+00218c: */
+    0x218d, /* U+00218d: */
+    0x218e, /* U+00218e: */
+    0x218f, /* U+00218f: */
+    0x2190, /* U+002190: LEFTWARDS ARROW*/
+    0x2191, /* U+002191: UPWARDS ARROW*/
+    0x2192, /* U+002192: RIGHTWARDS ARROW*/
+    0x2193, /* U+002193: DOWNWARDS ARROW*/
+    0x2194, /* U+002194: LEFT RIGHT ARROW*/
+    0x2195, /* U+002195: UP DOWN ARROW*/
+    0x2196, /* U+002196: NORTH WEST ARROW*/
+    0x2197, /* U+002197: NORTH EAST ARROW*/
+    0x2198, /* U+002198: SOUTH EAST ARROW*/
+    0x2199, /* U+002199: SOUTH WEST ARROW*/
+    0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
+    0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
+    0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
+    0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
+    0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
+    0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
+    0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
+    0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
+    0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
+    0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
+    0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
+    0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
+    0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
+    0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
+    0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
+    0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
+    0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
+    0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
+    0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
+    0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
+    0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
+    0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
+    0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
+    0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
+    0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
+    0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
+    0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
+    0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
+    0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
+    0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
+    0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
+    0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
+    0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
+    0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
+    0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
+    0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
+    0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
+    0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
+    0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
+    0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
+    0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
+    0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
+    0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
+    0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
+    0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
+    0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
+    0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
+    0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
+    0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
+    0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
+    0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
+    0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
+    0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
+    0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
+    0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
+    0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
+    0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
+    0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
+    0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
+    0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
+    0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
+    0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
+    0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
+    0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
+    0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
+    0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
+    0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
+    0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
+    0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
+    0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
+    0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
+    0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
+    0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
+    0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
+    0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
+    0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
+    0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
+    0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
+    0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
+    0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
+    0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
+    0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
+    0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
+    0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
+    0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
+    0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
+    0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
+    0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
+    0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
+    0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
+    0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
+    0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
+    0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
+    0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
+    0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
+    0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
+    0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
+    0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
+    0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
+    0x2200, /* U+002200: FOR ALL*/
+    0x2201, /* U+002201: COMPLEMENT*/
+    0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
+    0x2203, /* U+002203: THERE EXISTS*/
+    0x2204, /* U+002204: THERE DOES NOT EXIST*/
+    0x2205, /* U+002205: EMPTY SET*/
+    0x2206, /* U+002206: INCREMENT*/
+    0x2207, /* U+002207: NABLA*/
+    0x2208, /* U+002208: ELEMENT OF*/
+    0x2209, /* U+002209: NOT AN ELEMENT OF*/
+    0x220a, /* U+00220a: SMALL ELEMENT OF*/
+    0x220b, /* U+00220b: CONTAINS AS MEMBER*/
+    0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
+    0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
+    0x220e, /* U+00220e: END OF PROOF*/
+    0x220f, /* U+00220f: N-ARY PRODUCT*/
+    0x2210, /* U+002210: N-ARY COPRODUCT*/
+    0x2211, /* U+002211: N-ARY SUMMATION*/
+    0x2212, /* U+002212: MINUS SIGN*/
+    0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
+    0x2214, /* U+002214: DOT PLUS*/
+    0x2215, /* U+002215: DIVISION SLASH*/
+    0x2216, /* U+002216: SET MINUS*/
+    0x2217, /* U+002217: ASTERISK OPERATOR*/
+    0x2218, /* U+002218: RING OPERATOR*/
+    0x2219, /* U+002219: BULLET OPERATOR*/
+    0x221a, /* U+00221a: SQUARE ROOT*/
+    0x221b, /* U+00221b: CUBE ROOT*/
+    0x221c, /* U+00221c: FOURTH ROOT*/
+    0x221d, /* U+00221d: PROPORTIONAL TO*/
+    0x221e, /* U+00221e: INFINITY*/
+    0x221f, /* U+00221f: RIGHT ANGLE*/
+    0x2220, /* U+002220: ANGLE*/
+    0x2221, /* U+002221: MEASURED ANGLE*/
+    0x2222, /* U+002222: SPHERICAL ANGLE*/
+    0x2223, /* U+002223: DIVIDES*/
+    0x2224, /* U+002224: DOES NOT DIVIDE*/
+    0x2225, /* U+002225: PARALLEL TO*/
+    0x2226, /* U+002226: NOT PARALLEL TO*/
+    0x2227, /* U+002227: LOGICAL AND*/
+    0x2228, /* U+002228: LOGICAL OR*/
+    0x2229, /* U+002229: INTERSECTION*/
+    0x222a, /* U+00222a: UNION*/
+    0x222b, /* U+00222b: INTEGRAL*/
+    0x222c, /* U+00222c: DOUBLE INTEGRAL*/
+    0x222d, /* U+00222d: TRIPLE INTEGRAL*/
+    0x222e, /* U+00222e: CONTOUR INTEGRAL*/
+    0x222f, /* U+00222f: SURFACE INTEGRAL*/
+    0x2230, /* U+002230: VOLUME INTEGRAL*/
+    0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
+    0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
+    0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
+    0x2234, /* U+002234: THEREFORE*/
+    0x2235, /* U+002235: BECAUSE*/
+    0x2236, /* U+002236: RATIO*/
+    0x2237, /* U+002237: PROPORTION*/
+    0x2238, /* U+002238: DOT MINUS*/
+    0x2239, /* U+002239: EXCESS*/
+    0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
+    0x223b, /* U+00223b: HOMOTHETIC*/
+    0x223c, /* U+00223c: TILDE OPERATOR*/
+    0x223d, /* U+00223d: REVERSED TILDE*/
+    0x223e, /* U+00223e: INVERTED LAZY S*/
+    0x223f, /* U+00223f: SINE WAVE*/
+    0x2240, /* U+002240: WREATH PRODUCT*/
+    0x2241, /* U+002241: NOT TILDE*/
+    0x2242, /* U+002242: MINUS TILDE*/
+    0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
+    0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
+    0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
+    0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
+    0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
+    0x2248, /* U+002248: ALMOST EQUAL TO*/
+    0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
+    0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
+    0x224b, /* U+00224b: TRIPLE TILDE*/
+    0x224c, /* U+00224c: ALL EQUAL TO*/
+    0x224d, /* U+00224d: EQUIVALENT TO*/
+    0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
+    0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
+    0x2250, /* U+002250: APPROACHES THE LIMIT*/
+    0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
+    0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
+    0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
+    0x2254, /* U+002254: COLON EQUALS*/
+    0x2255, /* U+002255: EQUALS COLON*/
+    0x2256, /* U+002256: RING IN EQUAL TO*/
+    0x2257, /* U+002257: RING EQUAL TO*/
+    0x2258, /* U+002258: CORRESPONDS TO*/
+    0x2259, /* U+002259: ESTIMATES*/
+    0x225a, /* U+00225a: EQUIANGULAR TO*/
+    0x225b, /* U+00225b: STAR EQUALS*/
+    0x225c, /* U+00225c: DELTA EQUAL TO*/
+    0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
+    0x225e, /* U+00225e: MEASURED BY*/
+    0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
+    0x2260, /* U+002260: NOT EQUAL TO*/
+    0x2261, /* U+002261: IDENTICAL TO*/
+    0x2262, /* U+002262: NOT IDENTICAL TO*/
+    0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
+    0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
+    0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
+    0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
+    0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
+    0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
+    0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
+    0x226a, /* U+00226a: MUCH LESS-THAN*/
+    0x226b, /* U+00226b: MUCH GREATER-THAN*/
+    0x226c, /* U+00226c: BETWEEN*/
+    0x226d, /* U+00226d: NOT EQUIVALENT TO*/
+    0x226e, /* U+00226e: NOT LESS-THAN*/
+    0x226f, /* U+00226f: NOT GREATER-THAN*/
+    0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
+    0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
+    0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
+    0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
+    0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
+    0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
+    0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
+    0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
+    0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
+    0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
+    0x227a, /* U+00227a: PRECEDES*/
+    0x227b, /* U+00227b: SUCCEEDS*/
+    0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
+    0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
+    0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
+    0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
+    0x2280, /* U+002280: DOES NOT PRECEDE*/
+    0x2281, /* U+002281: DOES NOT SUCCEED*/
+    0x2282, /* U+002282: SUBSET OF*/
+    0x2283, /* U+002283: SUPERSET OF*/
+    0x2284, /* U+002284: NOT A SUBSET OF*/
+    0x2285, /* U+002285: NOT A SUPERSET OF*/
+    0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
+    0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
+    0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
+    0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
+    0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
+    0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
+    0x228c, /* U+00228c: MULTISET*/
+    0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
+    0x228e, /* U+00228e: MULTISET UNION*/
+    0x228f, /* U+00228f: SQUARE IMAGE OF*/
+    0x2290, /* U+002290: SQUARE ORIGINAL OF*/
+    0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
+    0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
+    0x2293, /* U+002293: SQUARE CAP*/
+    0x2294, /* U+002294: SQUARE CUP*/
+    0x2295, /* U+002295: CIRCLED PLUS*/
+    0x2296, /* U+002296: CIRCLED MINUS*/
+    0x2297, /* U+002297: CIRCLED TIMES*/
+    0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
+    0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
+    0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
+    0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
+    0x229c, /* U+00229c: CIRCLED EQUALS*/
+    0x229d, /* U+00229d: CIRCLED DASH*/
+    0x229e, /* U+00229e: SQUARED PLUS*/
+    0x229f, /* U+00229f: SQUARED MINUS*/
+    0x22a0, /* U+0022a0: SQUARED TIMES*/
+    0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
+    0x22a2, /* U+0022a2: RIGHT TACK*/
+    0x22a3, /* U+0022a3: LEFT TACK*/
+    0x22a4, /* U+0022a4: DOWN TACK*/
+    0x22a5, /* U+0022a5: UP TACK*/
+    0x22a6, /* U+0022a6: ASSERTION*/
+    0x22a7, /* U+0022a7: MODELS*/
+    0x22a8, /* U+0022a8: TRUE*/
+    0x22a9, /* U+0022a9: FORCES*/
+    0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
+    0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+    0x22ac, /* U+0022ac: DOES NOT PROVE*/
+    0x22ad, /* U+0022ad: NOT TRUE*/
+    0x22ae, /* U+0022ae: DOES NOT FORCE*/
+    0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
+    0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
+    0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
+    0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
+    0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
+    0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
+    0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
+    0x22b6, /* U+0022b6: ORIGINAL OF*/
+    0x22b7, /* U+0022b7: IMAGE OF*/
+    0x22b8, /* U+0022b8: MULTIMAP*/
+    0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
+    0x22ba, /* U+0022ba: INTERCALATE*/
+    0x22bb, /* U+0022bb: XOR*/
+    0x22bc, /* U+0022bc: NAND*/
+    0x22bd, /* U+0022bd: NOR*/
+    0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
+    0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
+    0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
+    0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
+    0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
+    0x22c3, /* U+0022c3: N-ARY UNION*/
+    0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
+    0x22c5, /* U+0022c5: DOT OPERATOR*/
+    0x22c6, /* U+0022c6: STAR OPERATOR*/
+    0x22c7, /* U+0022c7: DIVISION TIMES*/
+    0x22c8, /* U+0022c8: BOWTIE*/
+    0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+    0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
+    0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
+    0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
+    0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
+    0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
+    0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
+    0x22d0, /* U+0022d0: DOUBLE SUBSET*/
+    0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
+    0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
+    0x22d3, /* U+0022d3: DOUBLE UNION*/
+    0x22d4, /* U+0022d4: PITCHFORK*/
+    0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
+    0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
+    0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
+    0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
+    0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
+    0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
+    0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
+    0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
+    0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
+    0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
+    0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
+    0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
+    0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
+    0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
+    0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
+    0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
+    0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
+    0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
+    0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
+    0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
+    0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
+    0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
+    0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
+    0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
+    0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
+    0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
+    0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
+    0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
+    0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
+    0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
+    0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
+    0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
+    0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
+    0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
+    0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
+    0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
+    0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
+    0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
+    0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
+    0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
+    0x2300, /* U+002300: DIAMETER SIGN*/
+    0x2301, /* U+002301: ELECTRIC ARROW*/
+    0x2302, /* U+002302: HOUSE*/
+    0x2303, /* U+002303: UP ARROWHEAD*/
+    0x2304, /* U+002304: DOWN ARROWHEAD*/
+    0x2305, /* U+002305: PROJECTIVE*/
+    0x2306, /* U+002306: PERSPECTIVE*/
+    0x2307, /* U+002307: WAVY LINE*/
+    0x2308, /* U+002308: LEFT CEILING*/
+    0x2309, /* U+002309: RIGHT CEILING*/
+    0x230a, /* U+00230a: LEFT FLOOR*/
+    0x230b, /* U+00230b: RIGHT FLOOR*/
+    0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
+    0x230d, /* U+00230d: BOTTOM LEFT CROP*/
+    0x230e, /* U+00230e: TOP RIGHT CROP*/
+    0x230f, /* U+00230f: TOP LEFT CROP*/
+    0x2310, /* U+002310: REVERSED NOT SIGN*/
+    0x2311, /* U+002311: SQUARE LOZENGE*/
+    0x2312, /* U+002312: ARC*/
+    0x2313, /* U+002313: SEGMENT*/
+    0x2314, /* U+002314: SECTOR*/
+    0x2315, /* U+002315: TELEPHONE RECORDER*/
+    0x2316, /* U+002316: POSITION INDICATOR*/
+    0x2317, /* U+002317: VIEWDATA SQUARE*/
+    0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
+    0x2319, /* U+002319: TURNED NOT SIGN*/
+    0x231a, /* U+00231a: WATCH*/
+    0x231b, /* U+00231b: HOURGLASS*/
+    0x231c, /* U+00231c: TOP LEFT CORNER*/
+    0x231d, /* U+00231d: TOP RIGHT CORNER*/
+    0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
+    0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
+    0x2320, /* U+002320: TOP HALF INTEGRAL*/
+    0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
+    0x2322, /* U+002322: FROWN*/
+    0x2323, /* U+002323: SMILE*/
+    0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
+    0x2325, /* U+002325: OPTION KEY*/
+    0x2326, /* U+002326: ERASE TO THE RIGHT*/
+    0x2327, /* U+002327: X IN A RECTANGLE BOX*/
+    0x2328, /* U+002328: KEYBOARD*/
+    0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
+    0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
+    0x232b, /* U+00232b: ERASE TO THE LEFT*/
+    0x232c, /* U+00232c: BENZENE RING*/
+    0x232d, /* U+00232d: CYLINDRICITY*/
+    0x232e, /* U+00232e: ALL AROUND-PROFILE*/
+    0x232f, /* U+00232f: SYMMETRY*/
+    0x2330, /* U+002330: TOTAL RUNOUT*/
+    0x2331, /* U+002331: DIMENSION ORIGIN*/
+    0x2332, /* U+002332: CONICAL TAPER*/
+    0x2333, /* U+002333: SLOPE*/
+    0x2334, /* U+002334: COUNTERBORE*/
+    0x2335, /* U+002335: COUNTERSINK*/
+    0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
+    0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
+    0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
+    0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
+    0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
+    0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
+    0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
+    0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
+    0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
+    0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
+    0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
+    0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
+    0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
+    0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
+    0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
+    0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
+    0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
+    0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
+    0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
+    0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
+    0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
+    0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
+    0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
+    0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
+    0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
+    0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
+    0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
+    0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
+    0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
+    0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
+    0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
+    0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
+    0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
+    0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
+    0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
+    0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
+    0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
+    0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
+    0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
+    0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
+    0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
+    0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
+    0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
+    0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
+    0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
+    0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
+    0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
+    0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
+    0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
+    0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
+    0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
+    0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
+    0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
+    0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
+    0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
+    0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
+    0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
+    0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
+    0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
+    0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
+    0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
+    0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
+    0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
+    0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
+    0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
+    0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
+    0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
+    0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
+    0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
+    0x237b, /* U+00237b: NOT CHECK MARK*/
+    0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
+    0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
+    0x237e, /* U+00237e: BELL SYMBOL*/
+    0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
+    0x2380, /* U+002380: INSERTION SYMBOL*/
+    0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
+    0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
+    0x2383, /* U+002383: EMPHASIS SYMBOL*/
+    0x2384, /* U+002384: COMPOSITION SYMBOL*/
+    0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
+    0x2386, /* U+002386: ENTER SYMBOL*/
+    0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
+    0x2388, /* U+002388: HELM SYMBOL*/
+    0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
+    0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
+    0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
+    0x238c, /* U+00238c: UNDO SYMBOL*/
+    0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
+    0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
+    0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
+    0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
+    0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
+    0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
+    0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
+    0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
+    0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
+    0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
+    0x2397, /* U+002397: PREVIOUS PAGE*/
+    0x2398, /* U+002398: NEXT PAGE*/
+    0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
+    0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
+    0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
+    0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
+    0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
+    0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
+    0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
+    0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
+    0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
+    0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
+    0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
+    0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
+    0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
+    0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
+    0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
+    0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
+    0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
+    0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
+    0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
+    0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
+    0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
+    0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
+    0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
+    0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
+    0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
+    0x23b2, /* U+0023b2: SUMMATION TOP*/
+    0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
+    0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
+    0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
+    0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
+    0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
+    0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
+    0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
+    0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
+    0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
+    0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
+    0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
+    0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
+    0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
+    0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
+    0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
+    0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
+    0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
+    0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
+    0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
+    0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
+    0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
+    0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
+    0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
+    0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
+    0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
+    0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
+    0x23cd, /* U+0023cd: SQUARE FOOT*/
+    0x23ce, /* U+0023ce: RETURN SYMBOL*/
+    0x23cf, /* U+0023cf: EJECT SYMBOL*/
+    0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
+    0x23d1, /* U+0023d1: METRICAL BREVE*/
+    0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
+    0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
+    0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
+    0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
+    0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
+    0x23d7, /* U+0023d7: METRICAL TRISEME*/
+    0x23d8, /* U+0023d8: METRICAL TETRASEME*/
+    0x23d9, /* U+0023d9: METRICAL PENTASEME*/
+    0x23da, /* U+0023da: EARTH GROUND*/
+    0x23db, /* U+0023db: FUSE*/
+    0x23dc, /* U+0023dc: TOP PARENTHESIS*/
+    0x23dd, /* U+0023dd: BOTTOM PARENTHESIS*/
+    0x23de, /* U+0023de: TOP CURLY BRACKET*/
+    0x23df, /* U+0023df: BOTTOM CURLY BRACKET*/
+    0x23e0, /* U+0023e0: TOP TORTOISE SHELL BRACKET*/
+    0x23e1, /* U+0023e1: BOTTOM TORTOISE SHELL BRACKET*/
+    0x23e2, /* U+0023e2: WHITE TRAPEZIUM*/
+    0x23e3, /* U+0023e3: BENZENE RING WITH CIRCLE*/
+    0x23e4, /* U+0023e4: STRAIGHTNESS*/
+    0x23e5, /* U+0023e5: FLATNESS*/
+    0x23e6, /* U+0023e6: AC CURRENT*/
+    0x23e7, /* U+0023e7: ELECTRICAL INTERSECTION*/
+    0x23e8, /* U+0023e8: DECIMAL EXPONENT SYMBOL*/
+    0x23e9, /* U+0023e9: BLACK RIGHT-POINTING DOUBLE TRIANGLE*/
+    0x23ea, /* U+0023ea: BLACK LEFT-POINTING DOUBLE TRIANGLE*/
+    0x23eb, /* U+0023eb: BLACK UP-POINTING DOUBLE TRIANGLE*/
+    0x23ec, /* U+0023ec: BLACK DOWN-POINTING DOUBLE TRIANGLE*/
+    0x23ed, /* U+0023ed: BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+    0x23ee, /* U+0023ee: BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR*/
+    0x23ef, /* U+0023ef: BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR*/
+    0x23f0, /* U+0023f0: ALARM CLOCK*/
+    0x23f1, /* U+0023f1: STOPWATCH*/
+    0x23f2, /* U+0023f2: TIMER CLOCK*/
+    0x23f3, /* U+0023f3: HOURGLASS WITH FLOWING SAND*/
+    0x23f4, /* U+0023f4: */
+    0x23f5, /* U+0023f5: */
+    0x23f6, /* U+0023f6: */
+    0x23f7, /* U+0023f7: */
+    0x23f8, /* U+0023f8: */
+    0x23f9, /* U+0023f9: */
+    0x23fa, /* U+0023fa: */
+    0x23fb, /* U+0023fb: */
+    0x23fc, /* U+0023fc: */
+    0x23fd, /* U+0023fd: */
+    0x23fe, /* U+0023fe: */
+    0x23ff, /* U+0023ff: */
+    0x2400, /* U+002400: SYMBOL FOR NULL*/
+    0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
+    0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
+    0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
+    0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
+    0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
+    0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
+    0x2407, /* U+002407: SYMBOL FOR BELL*/
+    0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
+    0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
+    0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
+    0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
+    0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
+    0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
+    0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
+    0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
+    0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
+    0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
+    0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
+    0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
+    0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
+    0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
+    0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
+    0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
+    0x2418, /* U+002418: SYMBOL FOR CANCEL*/
+    0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
+    0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
+    0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
+    0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
+    0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
+    0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
+    0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
+    0x2420, /* U+002420: SYMBOL FOR SPACE*/
+    0x2421, /* U+002421: SYMBOL FOR DELETE*/
+    0x2422, /* U+002422: BLANK SYMBOL*/
+    0x2423, /* U+002423: OPEN BOX*/
+    0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
+    0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
+    0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
+    0x2427, /* U+002427: */
+    0x2428, /* U+002428: */
+    0x2429, /* U+002429: */
+    0x242a, /* U+00242a: */
+    0x242b, /* U+00242b: */
+    0x242c, /* U+00242c: */
+    0x242d, /* U+00242d: */
+    0x242e, /* U+00242e: */
+    0x242f, /* U+00242f: */
+    0x2430, /* U+002430: */
+    0x2431, /* U+002431: */
+    0x2432, /* U+002432: */
+    0x2433, /* U+002433: */
+    0x2434, /* U+002434: */
+    0x2435, /* U+002435: */
+    0x2436, /* U+002436: */
+    0x2437, /* U+002437: */
+    0x2438, /* U+002438: */
+    0x2439, /* U+002439: */
+    0x243a, /* U+00243a: */
+    0x243b, /* U+00243b: */
+    0x243c, /* U+00243c: */
+    0x243d, /* U+00243d: */
+    0x243e, /* U+00243e: */
+    0x243f, /* U+00243f: */
+    0x2440, /* U+002440: OCR HOOK*/
+    0x2441, /* U+002441: OCR CHAIR*/
+    0x2442, /* U+002442: OCR FORK*/
+    0x2443, /* U+002443: OCR INVERTED FORK*/
+    0x2444, /* U+002444: OCR BELT BUCKLE*/
+    0x2445, /* U+002445: OCR BOW TIE*/
+    0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
+    0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
+    0x2448, /* U+002448: OCR DASH*/
+    0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
+    0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
+    0x244b, /* U+00244b: */
+    0x244c, /* U+00244c: */
+    0x244d, /* U+00244d: */
+    0x244e, /* U+00244e: */
+    0x244f, /* U+00244f: */
+    0x2450, /* U+002450: */
+    0x2451, /* U+002451: */
+    0x2452, /* U+002452: */
+    0x2453, /* U+002453: */
+    0x2454, /* U+002454: */
+    0x2455, /* U+002455: */
+    0x2456, /* U+002456: */
+    0x2457, /* U+002457: */
+    0x2458, /* U+002458: */
+    0x2459, /* U+002459: */
+    0x245a, /* U+00245a: */
+    0x245b, /* U+00245b: */
+    0x245c, /* U+00245c: */
+    0x245d, /* U+00245d: */
+    0x245e, /* U+00245e: */
+    0x245f, /* U+00245f: */
+    0x2460, /* U+002460: CIRCLED DIGIT ONE*/
+    0x2461, /* U+002461: CIRCLED DIGIT TWO*/
+    0x2462, /* U+002462: CIRCLED DIGIT THREE*/
+    0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
+    0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
+    0x2465, /* U+002465: CIRCLED DIGIT SIX*/
+    0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
+    0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
+    0x2468, /* U+002468: CIRCLED DIGIT NINE*/
+    0x2469, /* U+002469: CIRCLED NUMBER TEN*/
+    0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
+    0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
+    0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
+    0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
+    0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
+    0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
+    0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
+    0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
+    0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
+    0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
+    0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
+    0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
+    0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
+    0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
+    0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
+    0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
+    0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
+    0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
+    0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
+    0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
+    0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
+    0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
+    0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
+    0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
+    0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
+    0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
+    0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
+    0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
+    0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
+    0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
+    0x2488, /* U+002488: DIGIT ONE FULL STOP*/
+    0x2489, /* U+002489: DIGIT TWO FULL STOP*/
+    0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
+    0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
+    0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
+    0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
+    0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
+    0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
+    0x2490, /* U+002490: DIGIT NINE FULL STOP*/
+    0x2491, /* U+002491: NUMBER TEN FULL STOP*/
+    0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
+    0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
+    0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
+    0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
+    0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
+    0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
+    0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
+    0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
+    0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
+    0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
+    0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
+    0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
+    0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
+    0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
+    0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
+    0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
+    0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
+    0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
+    0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
+    0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
+    0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
+    0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
+    0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
+    0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
+    0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
+    0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
+    0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
+    0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
+    0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
+    0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
+    0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
+    0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
+    0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
+    0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
+    0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
+    0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
+    0x24b6, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
+    0x24b7, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
+    0x24b8, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
+    0x24b9, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
+    0x24ba, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
+    0x24bb, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
+    0x24bc, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
+    0x24bd, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
+    0x24be, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
+    0x24bf, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
+    0x24c0, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
+    0x24c1, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
+    0x24c2, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
+    0x24c3, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
+    0x24c4, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
+    0x24c5, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
+    0x24c6, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
+    0x24c7, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
+    0x24c8, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
+    0x24c9, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
+    0x24ca, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
+    0x24cb, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
+    0x24cc, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
+    0x24cd, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
+    0x24ce, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
+    0x24cf, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
+    0x24b6, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
+    0x24b7, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
+    0x24b8, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
+    0x24b9, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
+    0x24ba, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
+    0x24bb, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
+    0x24bc, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
+    0x24bd, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
+    0x24be, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
+    0x24bf, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
+    0x24c0, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
+    0x24c1, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
+    0x24c2, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
+    0x24c3, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
+    0x24c4, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
+    0x24c5, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
+    0x24c6, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
+    0x24c7, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
+    0x24c8, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
+    0x24c9, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
+    0x24ca, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
+    0x24cb, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
+    0x24cc, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
+    0x24cd, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
+    0x24ce, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
+    0x24cf, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniUpper0x002c30[] =
+{
+    0x2c00, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
+    0x2c01, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
+    0x2c02, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
+    0x2c03, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
+    0x2c04, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
+    0x2c05, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
+    0x2c06, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
+    0x2c07, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
+    0x2c08, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
+    0x2c09, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
+    0x2c0a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
+    0x2c0b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
+    0x2c0c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
+    0x2c0d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
+    0x2c0e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
+    0x2c0f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
+    0x2c10, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
+    0x2c11, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
+    0x2c12, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
+    0x2c13, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
+    0x2c14, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
+    0x2c15, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
+    0x2c16, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
+    0x2c17, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
+    0x2c18, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
+    0x2c19, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
+    0x2c1a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
+    0x2c1b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
+    0x2c1c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
+    0x2c1d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
+    0x2c1e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
+    0x2c1f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
+    0x2c20, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
+    0x2c21, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
+    0x2c22, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
+    0x2c23, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
+    0x2c24, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
+    0x2c25, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
+    0x2c26, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
+    0x2c27, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
+    0x2c28, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
+    0x2c29, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
+    0x2c2a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
+    0x2c2b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
+    0x2c2c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
+    0x2c2d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
+    0x2c2e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
+    0x2c5f, /* U+002c5f: */
+    0x2c60, /* U+002c60: LATIN CAPITAL LETTER L WITH DOUBLE BAR*/
+    0x2c60, /* U+002c61: LATIN SMALL LETTER L WITH DOUBLE BAR*/
+    0x2c62, /* U+002c62: LATIN CAPITAL LETTER L WITH MIDDLE TILDE*/
+    0x2c63, /* U+002c63: LATIN CAPITAL LETTER P WITH STROKE*/
+    0x2c64, /* U+002c64: LATIN CAPITAL LETTER R WITH TAIL*/
+    0x23a, /* U+002c65: LATIN SMALL LETTER A WITH STROKE*/
+    0x23e, /* U+002c66: LATIN SMALL LETTER T WITH DIAGONAL STROKE*/
+    0x2c67, /* U+002c67: LATIN CAPITAL LETTER H WITH DESCENDER*/
+    0x2c67, /* U+002c68: LATIN SMALL LETTER H WITH DESCENDER*/
+    0x2c69, /* U+002c69: LATIN CAPITAL LETTER K WITH DESCENDER*/
+    0x2c69, /* U+002c6a: LATIN SMALL LETTER K WITH DESCENDER*/
+    0x2c6b, /* U+002c6b: LATIN CAPITAL LETTER Z WITH DESCENDER*/
+    0x2c6b, /* U+002c6c: LATIN SMALL LETTER Z WITH DESCENDER*/
+    0x2c6d, /* U+002c6d: LATIN CAPITAL LETTER ALPHA*/
+    0x2c6e, /* U+002c6e: LATIN CAPITAL LETTER M WITH HOOK*/
+    0x2c6f, /* U+002c6f: LATIN CAPITAL LETTER TURNED A*/
+    0x2c70, /* U+002c70: LATIN CAPITAL LETTER TURNED ALPHA*/
+    0x2c71, /* U+002c71: LATIN SMALL LETTER V WITH RIGHT HOOK*/
+    0x2c72, /* U+002c72: LATIN CAPITAL LETTER W WITH HOOK*/
+    0x2c72, /* U+002c73: LATIN SMALL LETTER W WITH HOOK*/
+    0x2c74, /* U+002c74: LATIN SMALL LETTER V WITH CURL*/
+    0x2c75, /* U+002c75: LATIN CAPITAL LETTER HALF H*/
+    0x2c75, /* U+002c76: LATIN SMALL LETTER HALF H*/
+    0x2c77, /* U+002c77: LATIN SMALL LETTER TAILLESS PHI*/
+    0x2c78, /* U+002c78: LATIN SMALL LETTER E WITH NOTCH*/
+    0x2c79, /* U+002c79: LATIN SMALL LETTER TURNED R WITH TAIL*/
+    0x2c7a, /* U+002c7a: LATIN SMALL LETTER O WITH LOW RING INSIDE*/
+    0x2c7b, /* U+002c7b: LATIN LETTER SMALL CAPITAL TURNED E*/
+    0x2c7c, /* U+002c7c: LATIN SUBSCRIPT SMALL LETTER J*/
+    0x2c7d, /* U+002c7d: MODIFIER LETTER CAPITAL V*/
+    0x2c7e, /* U+002c7e: LATIN CAPITAL LETTER S WITH SWASH TAIL*/
+    0x2c7f, /* U+002c7f: LATIN CAPITAL LETTER Z WITH SWASH TAIL*/
+    0x2c80, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
+    0x2c80, /* U+002c81: COPTIC SMALL LETTER ALFA*/
+    0x2c82, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
+    0x2c82, /* U+002c83: COPTIC SMALL LETTER VIDA*/
+    0x2c84, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
+    0x2c84, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
+    0x2c86, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
+    0x2c86, /* U+002c87: COPTIC SMALL LETTER DALDA*/
+    0x2c88, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
+    0x2c88, /* U+002c89: COPTIC SMALL LETTER EIE*/
+    0x2c8a, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
+    0x2c8a, /* U+002c8b: COPTIC SMALL LETTER SOU*/
+    0x2c8c, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
+    0x2c8c, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
+    0x2c8e, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
+    0x2c8e, /* U+002c8f: COPTIC SMALL LETTER HATE*/
+    0x2c90, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
+    0x2c90, /* U+002c91: COPTIC SMALL LETTER THETHE*/
+    0x2c92, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
+    0x2c92, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
+    0x2c94, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
+    0x2c94, /* U+002c95: COPTIC SMALL LETTER KAPA*/
+    0x2c96, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
+    0x2c96, /* U+002c97: COPTIC SMALL LETTER LAULA*/
+    0x2c98, /* U+002c98: COPTIC CAPITAL LETTER MI*/
+    0x2c98, /* U+002c99: COPTIC SMALL LETTER MI*/
+    0x2c9a, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
+    0x2c9a, /* U+002c9b: COPTIC SMALL LETTER NI*/
+    0x2c9c, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
+    0x2c9c, /* U+002c9d: COPTIC SMALL LETTER KSI*/
+    0x2c9e, /* U+002c9e: COPTIC CAPITAL LETTER O*/
+    0x2c9e, /* U+002c9f: COPTIC SMALL LETTER O*/
+    0x2ca0, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
+    0x2ca0, /* U+002ca1: COPTIC SMALL LETTER PI*/
+    0x2ca2, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
+    0x2ca2, /* U+002ca3: COPTIC SMALL LETTER RO*/
+    0x2ca4, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
+    0x2ca4, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
+    0x2ca6, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
+    0x2ca6, /* U+002ca7: COPTIC SMALL LETTER TAU*/
+    0x2ca8, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
+    0x2ca8, /* U+002ca9: COPTIC SMALL LETTER UA*/
+    0x2caa, /* U+002caa: COPTIC CAPITAL LETTER FI*/
+    0x2caa, /* U+002cab: COPTIC SMALL LETTER FI*/
+    0x2cac, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
+    0x2cac, /* U+002cad: COPTIC SMALL LETTER KHI*/
+    0x2cae, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
+    0x2cae, /* U+002caf: COPTIC SMALL LETTER PSI*/
+    0x2cb0, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
+    0x2cb0, /* U+002cb1: COPTIC SMALL LETTER OOU*/
+    0x2cb2, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
+    0x2cb2, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
+    0x2cb4, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
+    0x2cb4, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
+    0x2cb6, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
+    0x2cb6, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
+    0x2cb8, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
+    0x2cb8, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
+    0x2cba, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
+    0x2cba, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
+    0x2cbc, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
+    0x2cbc, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
+    0x2cbe, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
+    0x2cbe, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
+    0x2cc0, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
+    0x2cc0, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
+    0x2cc2, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
+    0x2cc2, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
+    0x2cc4, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
+    0x2cc4, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
+    0x2cc6, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
+    0x2cc6, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
+    0x2cc8, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
+    0x2cc8, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
+    0x2cca, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
+    0x2cca, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
+    0x2ccc, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
+    0x2ccc, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
+    0x2cce, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
+    0x2cce, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
+    0x2cd0, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
+    0x2cd0, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
+    0x2cd2, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
+    0x2cd2, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
+    0x2cd4, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
+    0x2cd4, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
+    0x2cd6, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
+    0x2cd6, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
+    0x2cd8, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
+    0x2cd8, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
+    0x2cda, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
+    0x2cda, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
+    0x2cdc, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
+    0x2cdc, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
+    0x2cde, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
+    0x2cde, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
+    0x2ce0, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
+    0x2ce0, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
+    0x2ce2, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
+    0x2ce2, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
+    0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
+    0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
+    0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
+    0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
+    0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
+    0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
+    0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
+    0x2ceb, /* U+002ceb: COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI*/
+    0x2ceb, /* U+002cec: COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI*/
+    0x2ced, /* U+002ced: COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA*/
+    0x2ced, /* U+002cee: COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA*/
+    0x2cef, /* U+002cef: COPTIC COMBINING NI ABOVE*/
+    0x2cf0, /* U+002cf0: COPTIC COMBINING SPIRITUS ASPER*/
+    0x2cf1, /* U+002cf1: COPTIC COMBINING SPIRITUS LENIS*/
+    0x2cf2, /* U+002cf2: COPTIC CAPITAL LETTER BOHAIRIC KHEI*/
+    0x2cf2, /* U+002cf3: COPTIC SMALL LETTER BOHAIRIC KHEI*/
+    0x2cf4, /* U+002cf4: */
+    0x2cf5, /* U+002cf5: */
+    0x2cf6, /* U+002cf6: */
+    0x2cf7, /* U+002cf7: */
+    0x2cf8, /* U+002cf8: */
+    0x2cf9, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
+    0x2cfa, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
+    0x2cfb, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
+    0x2cfc, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
+    0x2cfd, /* U+002cfd: COPTIC FRACTION ONE HALF*/
+    0x2cfe, /* U+002cfe: COPTIC FULL STOP*/
+    0x2cff, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
+    0x10a0, /* U+002d00: GEORGIAN SMALL LETTER AN*/
+    0x10a1, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
+    0x10a2, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
+    0x10a3, /* U+002d03: GEORGIAN SMALL LETTER DON*/
+    0x10a4, /* U+002d04: GEORGIAN SMALL LETTER EN*/
+    0x10a5, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
+    0x10a6, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
+    0x10a7, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
+    0x10a8, /* U+002d08: GEORGIAN SMALL LETTER IN*/
+    0x10a9, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
+    0x10aa, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
+    0x10ab, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
+    0x10ac, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
+    0x10ad, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
+    0x10ae, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
+    0x10af, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
+    0x10b0, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
+    0x10b1, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
+    0x10b2, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
+    0x10b3, /* U+002d13: GEORGIAN SMALL LETTER UN*/
+    0x10b4, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
+    0x10b5, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
+    0x10b6, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
+    0x10b7, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
+    0x10b8, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
+    0x10b9, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
+    0x10ba, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
+    0x10bb, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
+    0x10bc, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
+    0x10bd, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
+    0x10be, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
+    0x10bf, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
+    0x10c0, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
+    0x10c1, /* U+002d21: GEORGIAN SMALL LETTER HE*/
+    0x10c2, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
+    0x10c3, /* U+002d23: GEORGIAN SMALL LETTER WE*/
+    0x10c4, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
+    0x10c5, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
+    0x2d26, /* U+002d26: */
+    0x10c7, /* U+002d27: GEORGIAN SMALL LETTER YN*/
+    0x2d28, /* U+002d28: */
+    0x2d29, /* U+002d29: */
+    0x2d2a, /* U+002d2a: */
+    0x2d2b, /* U+002d2b: */
+    0x2d2c, /* U+002d2c: */
+    0x10cd, /* U+002d2d: GEORGIAN SMALL LETTER AEN*/
+};
+
+static const RTUNICP g_afRTUniUpper0x00a641[] =
+{
+    0xa640, /* U+00a641: CYRILLIC SMALL LETTER ZEMLYA*/
+    0xa642, /* U+00a642: CYRILLIC CAPITAL LETTER DZELO*/
+    0xa642, /* U+00a643: CYRILLIC SMALL LETTER DZELO*/
+    0xa644, /* U+00a644: CYRILLIC CAPITAL LETTER REVERSED DZE*/
+    0xa644, /* U+00a645: CYRILLIC SMALL LETTER REVERSED DZE*/
+    0xa646, /* U+00a646: CYRILLIC CAPITAL LETTER IOTA*/
+    0xa646, /* U+00a647: CYRILLIC SMALL LETTER IOTA*/
+    0xa648, /* U+00a648: CYRILLIC CAPITAL LETTER DJERV*/
+    0xa648, /* U+00a649: CYRILLIC SMALL LETTER DJERV*/
+    0xa64a, /* U+00a64a: CYRILLIC CAPITAL LETTER MONOGRAPH UK*/
+    0xa64a, /* U+00a64b: CYRILLIC SMALL LETTER MONOGRAPH UK*/
+    0xa64c, /* U+00a64c: CYRILLIC CAPITAL LETTER BROAD OMEGA*/
+    0xa64c, /* U+00a64d: CYRILLIC SMALL LETTER BROAD OMEGA*/
+    0xa64e, /* U+00a64e: CYRILLIC CAPITAL LETTER NEUTRAL YER*/
+    0xa64e, /* U+00a64f: CYRILLIC SMALL LETTER NEUTRAL YER*/
+    0xa650, /* U+00a650: CYRILLIC CAPITAL LETTER YERU WITH BACK YER*/
+    0xa650, /* U+00a651: CYRILLIC SMALL LETTER YERU WITH BACK YER*/
+    0xa652, /* U+00a652: CYRILLIC CAPITAL LETTER IOTIFIED YAT*/
+    0xa652, /* U+00a653: CYRILLIC SMALL LETTER IOTIFIED YAT*/
+    0xa654, /* U+00a654: CYRILLIC CAPITAL LETTER REVERSED YU*/
+    0xa654, /* U+00a655: CYRILLIC SMALL LETTER REVERSED YU*/
+    0xa656, /* U+00a656: CYRILLIC CAPITAL LETTER IOTIFIED A*/
+    0xa656, /* U+00a657: CYRILLIC SMALL LETTER IOTIFIED A*/
+    0xa658, /* U+00a658: CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS*/
+    0xa658, /* U+00a659: CYRILLIC SMALL LETTER CLOSED LITTLE YUS*/
+    0xa65a, /* U+00a65a: CYRILLIC CAPITAL LETTER BLENDED YUS*/
+    0xa65a, /* U+00a65b: CYRILLIC SMALL LETTER BLENDED YUS*/
+    0xa65c, /* U+00a65c: CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS*/
+    0xa65c, /* U+00a65d: CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS*/
+    0xa65e, /* U+00a65e: CYRILLIC CAPITAL LETTER YN*/
+    0xa65e, /* U+00a65f: CYRILLIC SMALL LETTER YN*/
+    0xa660, /* U+00a660: CYRILLIC CAPITAL LETTER REVERSED TSE*/
+    0xa660, /* U+00a661: CYRILLIC SMALL LETTER REVERSED TSE*/
+    0xa662, /* U+00a662: CYRILLIC CAPITAL LETTER SOFT DE*/
+    0xa662, /* U+00a663: CYRILLIC SMALL LETTER SOFT DE*/
+    0xa664, /* U+00a664: CYRILLIC CAPITAL LETTER SOFT EL*/
+    0xa664, /* U+00a665: CYRILLIC SMALL LETTER SOFT EL*/
+    0xa666, /* U+00a666: CYRILLIC CAPITAL LETTER SOFT EM*/
+    0xa666, /* U+00a667: CYRILLIC SMALL LETTER SOFT EM*/
+    0xa668, /* U+00a668: CYRILLIC CAPITAL LETTER MONOCULAR O*/
+    0xa668, /* U+00a669: CYRILLIC SMALL LETTER MONOCULAR O*/
+    0xa66a, /* U+00a66a: CYRILLIC CAPITAL LETTER BINOCULAR O*/
+    0xa66a, /* U+00a66b: CYRILLIC SMALL LETTER BINOCULAR O*/
+    0xa66c, /* U+00a66c: CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O*/
+    0xa66c, /* U+00a66d: CYRILLIC SMALL LETTER DOUBLE MONOCULAR O*/
+    0xa66e, /* U+00a66e: CYRILLIC LETTER MULTIOCULAR O*/
+    0xa66f, /* U+00a66f: COMBINING CYRILLIC VZMET*/
+    0xa670, /* U+00a670: COMBINING CYRILLIC TEN MILLIONS SIGN*/
+    0xa671, /* U+00a671: COMBINING CYRILLIC HUNDRED MILLIONS SIGN*/
+    0xa672, /* U+00a672: COMBINING CYRILLIC THOUSAND MILLIONS SIGN*/
+    0xa673, /* U+00a673: SLAVONIC ASTERISK*/
+    0xa674, /* U+00a674: COMBINING CYRILLIC LETTER UKRAINIAN IE*/
+    0xa675, /* U+00a675: COMBINING CYRILLIC LETTER I*/
+    0xa676, /* U+00a676: COMBINING CYRILLIC LETTER YI*/
+    0xa677, /* U+00a677: COMBINING CYRILLIC LETTER U*/
+    0xa678, /* U+00a678: COMBINING CYRILLIC LETTER HARD SIGN*/
+    0xa679, /* U+00a679: COMBINING CYRILLIC LETTER YERU*/
+    0xa67a, /* U+00a67a: COMBINING CYRILLIC LETTER SOFT SIGN*/
+    0xa67b, /* U+00a67b: COMBINING CYRILLIC LETTER OMEGA*/
+    0xa67c, /* U+00a67c: COMBINING CYRILLIC KAVYKA*/
+    0xa67d, /* U+00a67d: COMBINING CYRILLIC PAYEROK*/
+    0xa67e, /* U+00a67e: CYRILLIC KAVYKA*/
+    0xa67f, /* U+00a67f: CYRILLIC PAYEROK*/
+    0xa680, /* U+00a680: CYRILLIC CAPITAL LETTER DWE*/
+    0xa680, /* U+00a681: CYRILLIC SMALL LETTER DWE*/
+    0xa682, /* U+00a682: CYRILLIC CAPITAL LETTER DZWE*/
+    0xa682, /* U+00a683: CYRILLIC SMALL LETTER DZWE*/
+    0xa684, /* U+00a684: CYRILLIC CAPITAL LETTER ZHWE*/
+    0xa684, /* U+00a685: CYRILLIC SMALL LETTER ZHWE*/
+    0xa686, /* U+00a686: CYRILLIC CAPITAL LETTER CCHE*/
+    0xa686, /* U+00a687: CYRILLIC SMALL LETTER CCHE*/
+    0xa688, /* U+00a688: CYRILLIC CAPITAL LETTER DZZE*/
+    0xa688, /* U+00a689: CYRILLIC SMALL LETTER DZZE*/
+    0xa68a, /* U+00a68a: CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK*/
+    0xa68a, /* U+00a68b: CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK*/
+    0xa68c, /* U+00a68c: CYRILLIC CAPITAL LETTER TWE*/
+    0xa68c, /* U+00a68d: CYRILLIC SMALL LETTER TWE*/
+    0xa68e, /* U+00a68e: CYRILLIC CAPITAL LETTER TSWE*/
+    0xa68e, /* U+00a68f: CYRILLIC SMALL LETTER TSWE*/
+    0xa690, /* U+00a690: CYRILLIC CAPITAL LETTER TSSE*/
+    0xa690, /* U+00a691: CYRILLIC SMALL LETTER TSSE*/
+    0xa692, /* U+00a692: CYRILLIC CAPITAL LETTER TCHE*/
+    0xa692, /* U+00a693: CYRILLIC SMALL LETTER TCHE*/
+    0xa694, /* U+00a694: CYRILLIC CAPITAL LETTER HWE*/
+    0xa694, /* U+00a695: CYRILLIC SMALL LETTER HWE*/
+    0xa696, /* U+00a696: CYRILLIC CAPITAL LETTER SHWE*/
+    0xa696, /* U+00a697: CYRILLIC SMALL LETTER SHWE*/
+    0xa698, /* U+00a698: */
+    0xa699, /* U+00a699: */
+    0xa69a, /* U+00a69a: */
+    0xa69b, /* U+00a69b: */
+    0xa69c, /* U+00a69c: */
+    0xa69d, /* U+00a69d: */
+    0xa69e, /* U+00a69e: */
+    0xa69f, /* U+00a69f: COMBINING CYRILLIC LETTER IOTIFIED E*/
+    0xa6a0, /* U+00a6a0: BAMUM LETTER A*/
+    0xa6a1, /* U+00a6a1: BAMUM LETTER KA*/
+    0xa6a2, /* U+00a6a2: BAMUM LETTER U*/
+    0xa6a3, /* U+00a6a3: BAMUM LETTER KU*/
+    0xa6a4, /* U+00a6a4: BAMUM LETTER EE*/
+    0xa6a5, /* U+00a6a5: BAMUM LETTER REE*/
+    0xa6a6, /* U+00a6a6: BAMUM LETTER TAE*/
+    0xa6a7, /* U+00a6a7: BAMUM LETTER O*/
+    0xa6a8, /* U+00a6a8: BAMUM LETTER NYI*/
+    0xa6a9, /* U+00a6a9: BAMUM LETTER I*/
+    0xa6aa, /* U+00a6aa: BAMUM LETTER LA*/
+    0xa6ab, /* U+00a6ab: BAMUM LETTER PA*/
+    0xa6ac, /* U+00a6ac: BAMUM LETTER RII*/
+    0xa6ad, /* U+00a6ad: BAMUM LETTER RIEE*/
+    0xa6ae, /* U+00a6ae: BAMUM LETTER LEEEE*/
+    0xa6af, /* U+00a6af: BAMUM LETTER MEEEE*/
+    0xa6b0, /* U+00a6b0: BAMUM LETTER TAA*/
+    0xa6b1, /* U+00a6b1: BAMUM LETTER NDAA*/
+    0xa6b2, /* U+00a6b2: BAMUM LETTER NJAEM*/
+    0xa6b3, /* U+00a6b3: BAMUM LETTER M*/
+    0xa6b4, /* U+00a6b4: BAMUM LETTER SUU*/
+    0xa6b5, /* U+00a6b5: BAMUM LETTER MU*/
+    0xa6b6, /* U+00a6b6: BAMUM LETTER SHII*/
+    0xa6b7, /* U+00a6b7: BAMUM LETTER SI*/
+    0xa6b8, /* U+00a6b8: BAMUM LETTER SHEUX*/
+    0xa6b9, /* U+00a6b9: BAMUM LETTER SEUX*/
+    0xa6ba, /* U+00a6ba: BAMUM LETTER KYEE*/
+    0xa6bb, /* U+00a6bb: BAMUM LETTER KET*/
+    0xa6bc, /* U+00a6bc: BAMUM LETTER NUAE*/
+    0xa6bd, /* U+00a6bd: BAMUM LETTER NU*/
+    0xa6be, /* U+00a6be: BAMUM LETTER NJUAE*/
+    0xa6bf, /* U+00a6bf: BAMUM LETTER YOQ*/
+    0xa6c0, /* U+00a6c0: BAMUM LETTER SHU*/
+    0xa6c1, /* U+00a6c1: BAMUM LETTER YUQ*/
+    0xa6c2, /* U+00a6c2: BAMUM LETTER YA*/
+    0xa6c3, /* U+00a6c3: BAMUM LETTER NSHA*/
+    0xa6c4, /* U+00a6c4: BAMUM LETTER KEUX*/
+    0xa6c5, /* U+00a6c5: BAMUM LETTER PEUX*/
+    0xa6c6, /* U+00a6c6: BAMUM LETTER NJEE*/
+    0xa6c7, /* U+00a6c7: BAMUM LETTER NTEE*/
+    0xa6c8, /* U+00a6c8: BAMUM LETTER PUE*/
+    0xa6c9, /* U+00a6c9: BAMUM LETTER WUE*/
+    0xa6ca, /* U+00a6ca: BAMUM LETTER PEE*/
+    0xa6cb, /* U+00a6cb: BAMUM LETTER FEE*/
+    0xa6cc, /* U+00a6cc: BAMUM LETTER RU*/
+    0xa6cd, /* U+00a6cd: BAMUM LETTER LU*/
+    0xa6ce, /* U+00a6ce: BAMUM LETTER MI*/
+    0xa6cf, /* U+00a6cf: BAMUM LETTER NI*/
+    0xa6d0, /* U+00a6d0: BAMUM LETTER REUX*/
+    0xa6d1, /* U+00a6d1: BAMUM LETTER RAE*/
+    0xa6d2, /* U+00a6d2: BAMUM LETTER KEN*/
+    0xa6d3, /* U+00a6d3: BAMUM LETTER NGKWAEN*/
+    0xa6d4, /* U+00a6d4: BAMUM LETTER NGGA*/
+    0xa6d5, /* U+00a6d5: BAMUM LETTER NGA*/
+    0xa6d6, /* U+00a6d6: BAMUM LETTER SHO*/
+    0xa6d7, /* U+00a6d7: BAMUM LETTER PUAE*/
+    0xa6d8, /* U+00a6d8: BAMUM LETTER FU*/
+    0xa6d9, /* U+00a6d9: BAMUM LETTER FOM*/
+    0xa6da, /* U+00a6da: BAMUM LETTER WA*/
+    0xa6db, /* U+00a6db: BAMUM LETTER NA*/
+    0xa6dc, /* U+00a6dc: BAMUM LETTER LI*/
+    0xa6dd, /* U+00a6dd: BAMUM LETTER PI*/
+    0xa6de, /* U+00a6de: BAMUM LETTER LOQ*/
+    0xa6df, /* U+00a6df: BAMUM LETTER KO*/
+    0xa6e0, /* U+00a6e0: BAMUM LETTER MBEN*/
+    0xa6e1, /* U+00a6e1: BAMUM LETTER REN*/
+    0xa6e2, /* U+00a6e2: BAMUM LETTER MEN*/
+    0xa6e3, /* U+00a6e3: BAMUM LETTER MA*/
+    0xa6e4, /* U+00a6e4: BAMUM LETTER TI*/
+    0xa6e5, /* U+00a6e5: BAMUM LETTER KI*/
+    0xa6e6, /* U+00a6e6: BAMUM LETTER MO*/
+    0xa6e7, /* U+00a6e7: BAMUM LETTER MBAA*/
+    0xa6e8, /* U+00a6e8: BAMUM LETTER TET*/
+    0xa6e9, /* U+00a6e9: BAMUM LETTER KPA*/
+    0xa6ea, /* U+00a6ea: BAMUM LETTER TEN*/
+    0xa6eb, /* U+00a6eb: BAMUM LETTER NTUU*/
+    0xa6ec, /* U+00a6ec: BAMUM LETTER SAMBA*/
+    0xa6ed, /* U+00a6ed: BAMUM LETTER FAAMAE*/
+    0xa6ee, /* U+00a6ee: BAMUM LETTER KOVUU*/
+    0xa6ef, /* U+00a6ef: BAMUM LETTER KOGHOM*/
+    0xa6f0, /* U+00a6f0: BAMUM COMBINING MARK KOQNDON*/
+    0xa6f1, /* U+00a6f1: BAMUM COMBINING MARK TUKWENTIS*/
+    0xa6f2, /* U+00a6f2: BAMUM NJAEMLI*/
+    0xa6f3, /* U+00a6f3: BAMUM FULL STOP*/
+    0xa6f4, /* U+00a6f4: BAMUM COLON*/
+    0xa6f5, /* U+00a6f5: BAMUM COMMA*/
+    0xa6f6, /* U+00a6f6: BAMUM SEMICOLON*/
+    0xa6f7, /* U+00a6f7: BAMUM QUESTION MARK*/
+    0xa6f8, /* U+00a6f8: */
+    0xa6f9, /* U+00a6f9: */
+    0xa6fa, /* U+00a6fa: */
+    0xa6fb, /* U+00a6fb: */
+    0xa6fc, /* U+00a6fc: */
+    0xa6fd, /* U+00a6fd: */
+    0xa6fe, /* U+00a6fe: */
+    0xa6ff, /* U+00a6ff: */
+    0xa700, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
+    0xa701, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
+    0xa702, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
+    0xa703, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
+    0xa704, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
+    0xa705, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
+    0xa706, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
+    0xa707, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
+    0xa708, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
+    0xa709, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
+    0xa70a, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
+    0xa70b, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
+    0xa70c, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
+    0xa70d, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
+    0xa70e, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
+    0xa70f, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
+    0xa710, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
+    0xa711, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
+    0xa712, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
+    0xa713, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
+    0xa714, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
+    0xa715, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
+    0xa716, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
+    0xa717, /* U+00a717: MODIFIER LETTER DOT VERTICAL BAR*/
+    0xa718, /* U+00a718: MODIFIER LETTER DOT SLASH*/
+    0xa719, /* U+00a719: MODIFIER LETTER DOT HORIZONTAL BAR*/
+    0xa71a, /* U+00a71a: MODIFIER LETTER LOWER RIGHT CORNER ANGLE*/
+    0xa71b, /* U+00a71b: MODIFIER LETTER RAISED UP ARROW*/
+    0xa71c, /* U+00a71c: MODIFIER LETTER RAISED DOWN ARROW*/
+    0xa71d, /* U+00a71d: MODIFIER LETTER RAISED EXCLAMATION MARK*/
+    0xa71e, /* U+00a71e: MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK*/
+    0xa71f, /* U+00a71f: MODIFIER LETTER LOW INVERTED EXCLAMATION MARK*/
+    0xa720, /* U+00a720: MODIFIER LETTER STRESS AND HIGH TONE*/
+    0xa721, /* U+00a721: MODIFIER LETTER STRESS AND LOW TONE*/
+    0xa722, /* U+00a722: LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF*/
+    0xa722, /* U+00a723: LATIN SMALL LETTER EGYPTOLOGICAL ALEF*/
+    0xa724, /* U+00a724: LATIN CAPITAL LETTER EGYPTOLOGICAL AIN*/
+    0xa724, /* U+00a725: LATIN SMALL LETTER EGYPTOLOGICAL AIN*/
+    0xa726, /* U+00a726: LATIN CAPITAL LETTER HENG*/
+    0xa726, /* U+00a727: LATIN SMALL LETTER HENG*/
+    0xa728, /* U+00a728: LATIN CAPITAL LETTER TZ*/
+    0xa728, /* U+00a729: LATIN SMALL LETTER TZ*/
+    0xa72a, /* U+00a72a: LATIN CAPITAL LETTER TRESILLO*/
+    0xa72a, /* U+00a72b: LATIN SMALL LETTER TRESILLO*/
+    0xa72c, /* U+00a72c: LATIN CAPITAL LETTER CUATRILLO*/
+    0xa72c, /* U+00a72d: LATIN SMALL LETTER CUATRILLO*/
+    0xa72e, /* U+00a72e: LATIN CAPITAL LETTER CUATRILLO WITH COMMA*/
+    0xa72e, /* U+00a72f: LATIN SMALL LETTER CUATRILLO WITH COMMA*/
+    0xa730, /* U+00a730: LATIN LETTER SMALL CAPITAL F*/
+    0xa731, /* U+00a731: LATIN LETTER SMALL CAPITAL S*/
+    0xa732, /* U+00a732: LATIN CAPITAL LETTER AA*/
+    0xa732, /* U+00a733: LATIN SMALL LETTER AA*/
+    0xa734, /* U+00a734: LATIN CAPITAL LETTER AO*/
+    0xa734, /* U+00a735: LATIN SMALL LETTER AO*/
+    0xa736, /* U+00a736: LATIN CAPITAL LETTER AU*/
+    0xa736, /* U+00a737: LATIN SMALL LETTER AU*/
+    0xa738, /* U+00a738: LATIN CAPITAL LETTER AV*/
+    0xa738, /* U+00a739: LATIN SMALL LETTER AV*/
+    0xa73a, /* U+00a73a: LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR*/
+    0xa73a, /* U+00a73b: LATIN SMALL LETTER AV WITH HORIZONTAL BAR*/
+    0xa73c, /* U+00a73c: LATIN CAPITAL LETTER AY*/
+    0xa73c, /* U+00a73d: LATIN SMALL LETTER AY*/
+    0xa73e, /* U+00a73e: LATIN CAPITAL LETTER REVERSED C WITH DOT*/
+    0xa73e, /* U+00a73f: LATIN SMALL LETTER REVERSED C WITH DOT*/
+    0xa740, /* U+00a740: LATIN CAPITAL LETTER K WITH STROKE*/
+    0xa740, /* U+00a741: LATIN SMALL LETTER K WITH STROKE*/
+    0xa742, /* U+00a742: LATIN CAPITAL LETTER K WITH DIAGONAL STROKE*/
+    0xa742, /* U+00a743: LATIN SMALL LETTER K WITH DIAGONAL STROKE*/
+    0xa744, /* U+00a744: LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+    0xa744, /* U+00a745: LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE*/
+    0xa746, /* U+00a746: LATIN CAPITAL LETTER BROKEN L*/
+    0xa746, /* U+00a747: LATIN SMALL LETTER BROKEN L*/
+    0xa748, /* U+00a748: LATIN CAPITAL LETTER L WITH HIGH STROKE*/
+    0xa748, /* U+00a749: LATIN SMALL LETTER L WITH HIGH STROKE*/
+    0xa74a, /* U+00a74a: LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY*/
+    0xa74a, /* U+00a74b: LATIN SMALL LETTER O WITH LONG STROKE OVERLAY*/
+    0xa74c, /* U+00a74c: LATIN CAPITAL LETTER O WITH LOOP*/
+    0xa74c, /* U+00a74d: LATIN SMALL LETTER O WITH LOOP*/
+    0xa74e, /* U+00a74e: LATIN CAPITAL LETTER OO*/
+    0xa74e, /* U+00a74f: LATIN SMALL LETTER OO*/
+    0xa750, /* U+00a750: LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER*/
+    0xa750, /* U+00a751: LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER*/
+    0xa752, /* U+00a752: LATIN CAPITAL LETTER P WITH FLOURISH*/
+    0xa752, /* U+00a753: LATIN SMALL LETTER P WITH FLOURISH*/
+    0xa754, /* U+00a754: LATIN CAPITAL LETTER P WITH SQUIRREL TAIL*/
+    0xa754, /* U+00a755: LATIN SMALL LETTER P WITH SQUIRREL TAIL*/
+    0xa756, /* U+00a756: LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER*/
+    0xa756, /* U+00a757: LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER*/
+    0xa758, /* U+00a758: LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE*/
+    0xa758, /* U+00a759: LATIN SMALL LETTER Q WITH DIAGONAL STROKE*/
+    0xa75a, /* U+00a75a: LATIN CAPITAL LETTER R ROTUNDA*/
+    0xa75a, /* U+00a75b: LATIN SMALL LETTER R ROTUNDA*/
+    0xa75c, /* U+00a75c: LATIN CAPITAL LETTER RUM ROTUNDA*/
+    0xa75c, /* U+00a75d: LATIN SMALL LETTER RUM ROTUNDA*/
+    0xa75e, /* U+00a75e: LATIN CAPITAL LETTER V WITH DIAGONAL STROKE*/
+    0xa75e, /* U+00a75f: LATIN SMALL LETTER V WITH DIAGONAL STROKE*/
+    0xa760, /* U+00a760: LATIN CAPITAL LETTER VY*/
+    0xa760, /* U+00a761: LATIN SMALL LETTER VY*/
+    0xa762, /* U+00a762: LATIN CAPITAL LETTER VISIGOTHIC Z*/
+    0xa762, /* U+00a763: LATIN SMALL LETTER VISIGOTHIC Z*/
+    0xa764, /* U+00a764: LATIN CAPITAL LETTER THORN WITH STROKE*/
+    0xa764, /* U+00a765: LATIN SMALL LETTER THORN WITH STROKE*/
+    0xa766, /* U+00a766: LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+    0xa766, /* U+00a767: LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER*/
+    0xa768, /* U+00a768: LATIN CAPITAL LETTER VEND*/
+    0xa768, /* U+00a769: LATIN SMALL LETTER VEND*/
+    0xa76a, /* U+00a76a: LATIN CAPITAL LETTER ET*/
+    0xa76a, /* U+00a76b: LATIN SMALL LETTER ET*/
+    0xa76c, /* U+00a76c: LATIN CAPITAL LETTER IS*/
+    0xa76c, /* U+00a76d: LATIN SMALL LETTER IS*/
+    0xa76e, /* U+00a76e: LATIN CAPITAL LETTER CON*/
+    0xa76e, /* U+00a76f: LATIN SMALL LETTER CON*/
+    0xa770, /* U+00a770: MODIFIER LETTER US*/
+    0xa771, /* U+00a771: LATIN SMALL LETTER DUM*/
+    0xa772, /* U+00a772: LATIN SMALL LETTER LUM*/
+    0xa773, /* U+00a773: LATIN SMALL LETTER MUM*/
+    0xa774, /* U+00a774: LATIN SMALL LETTER NUM*/
+    0xa775, /* U+00a775: LATIN SMALL LETTER RUM*/
+    0xa776, /* U+00a776: LATIN LETTER SMALL CAPITAL RUM*/
+    0xa777, /* U+00a777: LATIN SMALL LETTER TUM*/
+    0xa778, /* U+00a778: LATIN SMALL LETTER UM*/
+    0xa779, /* U+00a779: LATIN CAPITAL LETTER INSULAR D*/
+    0xa779, /* U+00a77a: LATIN SMALL LETTER INSULAR D*/
+    0xa77b, /* U+00a77b: LATIN CAPITAL LETTER INSULAR F*/
+    0xa77b, /* U+00a77c: LATIN SMALL LETTER INSULAR F*/
+    0xa77d, /* U+00a77d: LATIN CAPITAL LETTER INSULAR G*/
+    0xa77e, /* U+00a77e: LATIN CAPITAL LETTER TURNED INSULAR G*/
+    0xa77e, /* U+00a77f: LATIN SMALL LETTER TURNED INSULAR G*/
+    0xa780, /* U+00a780: LATIN CAPITAL LETTER TURNED L*/
+    0xa780, /* U+00a781: LATIN SMALL LETTER TURNED L*/
+    0xa782, /* U+00a782: LATIN CAPITAL LETTER INSULAR R*/
+    0xa782, /* U+00a783: LATIN SMALL LETTER INSULAR R*/
+    0xa784, /* U+00a784: LATIN CAPITAL LETTER INSULAR S*/
+    0xa784, /* U+00a785: LATIN SMALL LETTER INSULAR S*/
+    0xa786, /* U+00a786: LATIN CAPITAL LETTER INSULAR T*/
+    0xa786, /* U+00a787: LATIN SMALL LETTER INSULAR T*/
+    0xa788, /* U+00a788: MODIFIER LETTER LOW CIRCUMFLEX ACCENT*/
+    0xa789, /* U+00a789: MODIFIER LETTER COLON*/
+    0xa78a, /* U+00a78a: MODIFIER LETTER SHORT EQUALS SIGN*/
+    0xa78b, /* U+00a78b: LATIN CAPITAL LETTER SALTILLO*/
+    0xa78b, /* U+00a78c: LATIN SMALL LETTER SALTILLO*/
+    0xa78d, /* U+00a78d: LATIN CAPITAL LETTER TURNED H*/
+    0xa78e, /* U+00a78e: LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT*/
+    0xa78f, /* U+00a78f: */
+    0xa790, /* U+00a790: LATIN CAPITAL LETTER N WITH DESCENDER*/
+    0xa790, /* U+00a791: LATIN SMALL LETTER N WITH DESCENDER*/
+    0xa792, /* U+00a792: LATIN CAPITAL LETTER C WITH BAR*/
+    0xa792, /* U+00a793: LATIN SMALL LETTER C WITH BAR*/
+    0xa794, /* U+00a794: */
+    0xa795, /* U+00a795: */
+    0xa796, /* U+00a796: */
+    0xa797, /* U+00a797: */
+    0xa798, /* U+00a798: */
+    0xa799, /* U+00a799: */
+    0xa79a, /* U+00a79a: */
+    0xa79b, /* U+00a79b: */
+    0xa79c, /* U+00a79c: */
+    0xa79d, /* U+00a79d: */
+    0xa79e, /* U+00a79e: */
+    0xa79f, /* U+00a79f: */
+    0xa7a0, /* U+00a7a0: LATIN CAPITAL LETTER G WITH OBLIQUE STROKE*/
+    0xa7a0, /* U+00a7a1: LATIN SMALL LETTER G WITH OBLIQUE STROKE*/
+    0xa7a2, /* U+00a7a2: LATIN CAPITAL LETTER K WITH OBLIQUE STROKE*/
+    0xa7a2, /* U+00a7a3: LATIN SMALL LETTER K WITH OBLIQUE STROKE*/
+    0xa7a4, /* U+00a7a4: LATIN CAPITAL LETTER N WITH OBLIQUE STROKE*/
+    0xa7a4, /* U+00a7a5: LATIN SMALL LETTER N WITH OBLIQUE STROKE*/
+    0xa7a6, /* U+00a7a6: LATIN CAPITAL LETTER R WITH OBLIQUE STROKE*/
+    0xa7a6, /* U+00a7a7: LATIN SMALL LETTER R WITH OBLIQUE STROKE*/
+    0xa7a8, /* U+00a7a8: LATIN CAPITAL LETTER S WITH OBLIQUE STROKE*/
+    0xa7a8, /* U+00a7a9: LATIN SMALL LETTER S WITH OBLIQUE STROKE*/
+};
+
+static const RTUNICP g_afRTUniUpper0x00ff41[] =
+{
+    0xff21, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
+    0xff22, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
+    0xff23, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
+    0xff24, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
+    0xff25, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
+    0xff26, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
+    0xff27, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
+    0xff28, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
+    0xff29, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
+    0xff2a, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
+    0xff2b, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
+    0xff2c, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
+    0xff2d, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
+    0xff2e, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
+    0xff2f, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
+    0xff30, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
+    0xff31, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
+    0xff32, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
+    0xff33, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
+    0xff34, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
+    0xff35, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
+    0xff36, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
+    0xff37, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
+    0xff38, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
+    0xff39, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
+    0xff3a, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
+};
+
+static const RTUNICP g_afRTUniUpper0x010428[] =
+{
+    0x10400, /* U+010428: DESERET SMALL LETTER LONG I*/
+    0x10401, /* U+010429: DESERET SMALL LETTER LONG E*/
+    0x10402, /* U+01042a: DESERET SMALL LETTER LONG A*/
+    0x10403, /* U+01042b: DESERET SMALL LETTER LONG AH*/
+    0x10404, /* U+01042c: DESERET SMALL LETTER LONG O*/
+    0x10405, /* U+01042d: DESERET SMALL LETTER LONG OO*/
+    0x10406, /* U+01042e: DESERET SMALL LETTER SHORT I*/
+    0x10407, /* U+01042f: DESERET SMALL LETTER SHORT E*/
+    0x10408, /* U+010430: DESERET SMALL LETTER SHORT A*/
+    0x10409, /* U+010431: DESERET SMALL LETTER SHORT AH*/
+    0x1040a, /* U+010432: DESERET SMALL LETTER SHORT O*/
+    0x1040b, /* U+010433: DESERET SMALL LETTER SHORT OO*/
+    0x1040c, /* U+010434: DESERET SMALL LETTER AY*/
+    0x1040d, /* U+010435: DESERET SMALL LETTER OW*/
+    0x1040e, /* U+010436: DESERET SMALL LETTER WU*/
+    0x1040f, /* U+010437: DESERET SMALL LETTER YEE*/
+    0x10410, /* U+010438: DESERET SMALL LETTER H*/
+    0x10411, /* U+010439: DESERET SMALL LETTER PEE*/
+    0x10412, /* U+01043a: DESERET SMALL LETTER BEE*/
+    0x10413, /* U+01043b: DESERET SMALL LETTER TEE*/
+    0x10414, /* U+01043c: DESERET SMALL LETTER DEE*/
+    0x10415, /* U+01043d: DESERET SMALL LETTER CHEE*/
+    0x10416, /* U+01043e: DESERET SMALL LETTER JEE*/
+    0x10417, /* U+01043f: DESERET SMALL LETTER KAY*/
+    0x10418, /* U+010440: DESERET SMALL LETTER GAY*/
+    0x10419, /* U+010441: DESERET SMALL LETTER EF*/
+    0x1041a, /* U+010442: DESERET SMALL LETTER VEE*/
+    0x1041b, /* U+010443: DESERET SMALL LETTER ETH*/
+    0x1041c, /* U+010444: DESERET SMALL LETTER THEE*/
+    0x1041d, /* U+010445: DESERET SMALL LETTER ES*/
+    0x1041e, /* U+010446: DESERET SMALL LETTER ZEE*/
+    0x1041f, /* U+010447: DESERET SMALL LETTER ESH*/
+    0x10420, /* U+010448: DESERET SMALL LETTER ZHEE*/
+    0x10421, /* U+010449: DESERET SMALL LETTER ER*/
+    0x10422, /* U+01044a: DESERET SMALL LETTER EL*/
+    0x10423, /* U+01044b: DESERET SMALL LETTER EM*/
+    0x10424, /* U+01044c: DESERET SMALL LETTER EN*/
+    0x10425, /* U+01044d: DESERET SMALL LETTER ENG*/
+    0x10426, /* U+01044e: DESERET SMALL LETTER OI*/
+    0x10427, /* U+01044f: DESERET SMALL LETTER EW*/
+};
+
+
+RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniUpperRanges[] =
+{
+    { 0x000000, 0x000587, &g_afRTUniUpper0x000000[0] },
+    { 0x001d79, 0x0024ea, &g_afRTUniUpper0x001d79[0] },
+    { 0x002c30, 0x002d2e, &g_afRTUniUpper0x002c30[0] },
+    { 0x00a641, 0x00a7aa, &g_afRTUniUpper0x00a641[0] },
+    { 0x00ff41, 0x00ff5b, &g_afRTUniUpper0x00ff41[0] },
+    { 0x010428, 0x010450, &g_afRTUniUpper0x010428[0] },
+    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
+};
+
+
diff --git a/src/VBox/Runtime/common/string/unidata.cpp b/src/VBox/Runtime/common/string/unidata.cpp
deleted file mode 100644
index aa2679e..0000000
--- a/src/VBox/Runtime/common/string/unidata.cpp
+++ /dev/null
@@ -1,29592 +0,0 @@
-/* $Id: unidata.cpp $ */
-/** @file
- * IPRT - Unicode Tables
- *
- *      Automatically Generated by G:/coding/vbox/tree/out/win32/debug/obj/src/VBox/Runtime/uniread/uniread.exe (Jan 30 2006 04:37:06)
- */
-
-/*
- * Copyright (C) 2006-2010 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-#include <iprt/uni.h>
-
-static const uint8_t g_afRTUniFlags0x000000[] =
-{
-                                                     0, /* U+000000: <control>*/
-                                                     0, /* U+000001: <control>*/
-                                                     0, /* U+000002: <control>*/
-                                                     0, /* U+000003: <control>*/
-                                                     0, /* U+000004: <control>*/
-                                                     0, /* U+000005: <control>*/
-                                                     0, /* U+000006: <control>*/
-                                                     0, /* U+000007: <control>*/
-                                                     0, /* U+000008: <control>*/
-                                          RTUNI_WSPACE, /* U+000009: <control>*/
-                                          RTUNI_WSPACE, /* U+00000a: <control>*/
-                                          RTUNI_WSPACE, /* U+00000b: <control>*/
-                                          RTUNI_WSPACE, /* U+00000c: <control>*/
-                                          RTUNI_WSPACE, /* U+00000d: <control>*/
-                                                     0, /* U+00000e: <control>*/
-                                                     0, /* U+00000f: <control>*/
-                                                     0, /* U+000010: <control>*/
-                                                     0, /* U+000011: <control>*/
-                                                     0, /* U+000012: <control>*/
-                                                     0, /* U+000013: <control>*/
-                                                     0, /* U+000014: <control>*/
-                                                     0, /* U+000015: <control>*/
-                                                     0, /* U+000016: <control>*/
-                                                     0, /* U+000017: <control>*/
-                                                     0, /* U+000018: <control>*/
-                                                     0, /* U+000019: <control>*/
-                                                     0, /* U+00001a: <control>*/
-                                                     0, /* U+00001b: <control>*/
-                                                     0, /* U+00001c: <control>*/
-                                                     0, /* U+00001d: <control>*/
-                                                     0, /* U+00001e: <control>*/
-                                                     0, /* U+00001f: <control>*/
-                                          RTUNI_WSPACE, /* U+000020: SPACE*/
-                                                     0, /* U+000021: EXCLAMATION MARK*/
-                                                     0, /* U+000022: QUOTATION MARK*/
-                                                     0, /* U+000023: NUMBER SIGN*/
-                                                     0, /* U+000024: DOLLAR SIGN*/
-                                                     0, /* U+000025: PERCENT SIGN*/
-                                                     0, /* U+000026: AMPERSAND*/
-                                                     0, /* U+000027: APOSTROPHE*/
-                                                     0, /* U+000028: LEFT PARENTHESIS*/
-                                                     0, /* U+000029: RIGHT PARENTHESIS*/
-                                                     0, /* U+00002a: ASTERISK*/
-                                                     0, /* U+00002b: PLUS SIGN*/
-                                                     0, /* U+00002c: COMMA*/
-                                                     0, /* U+00002d: HYPHEN-MINUS*/
-                                                     0, /* U+00002e: FULL STOP*/
-                                                     0, /* U+00002f: SOLIDUS*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000030: DIGIT ZERO*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000031: DIGIT ONE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000032: DIGIT TWO*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000033: DIGIT THREE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000034: DIGIT FOUR*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000035: DIGIT FIVE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000036: DIGIT SIX*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000037: DIGIT SEVEN*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000038: DIGIT EIGHT*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+000039: DIGIT NINE*/
-                                                     0, /* U+00003a: COLON*/
-                                                     0, /* U+00003b: SEMICOLON*/
-                                                     0, /* U+00003c: LESS-THAN SIGN*/
-                                                     0, /* U+00003d: EQUALS SIGN*/
-                                                     0, /* U+00003e: GREATER-THAN SIGN*/
-                                                     0, /* U+00003f: QUESTION MARK*/
-                                                     0, /* U+000040: COMMERCIAL AT*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000041: LATIN CAPITAL LETTER A*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000042: LATIN CAPITAL LETTER B*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000043: LATIN CAPITAL LETTER C*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000044: LATIN CAPITAL LETTER D*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000045: LATIN CAPITAL LETTER E*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+000046: LATIN CAPITAL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000047: LATIN CAPITAL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000048: LATIN CAPITAL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000049: LATIN CAPITAL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004a: LATIN CAPITAL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004b: LATIN CAPITAL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004c: LATIN CAPITAL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004d: LATIN CAPITAL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004e: LATIN CAPITAL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00004f: LATIN CAPITAL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000050: LATIN CAPITAL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000051: LATIN CAPITAL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000052: LATIN CAPITAL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000053: LATIN CAPITAL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000054: LATIN CAPITAL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000055: LATIN CAPITAL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000056: LATIN CAPITAL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000057: LATIN CAPITAL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000058: LATIN CAPITAL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000059: LATIN CAPITAL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00005a: LATIN CAPITAL LETTER Z*/
-                                                     0, /* U+00005b: LEFT SQUARE BRACKET*/
-                                                     0, /* U+00005c: REVERSE SOLIDUS*/
-                                                     0, /* U+00005d: RIGHT SQUARE BRACKET*/
-                                                     0, /* U+00005e: CIRCUMFLEX ACCENT*/
-                                                     0, /* U+00005f: LOW LINE*/
-                                                     0, /* U+000060: GRAVE ACCENT*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000061: LATIN SMALL LETTER A*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000062: LATIN SMALL LETTER B*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000063: LATIN SMALL LETTER C*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000064: LATIN SMALL LETTER D*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000065: LATIN SMALL LETTER E*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+000066: LATIN SMALL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000067: LATIN SMALL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000068: LATIN SMALL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000069: LATIN SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006a: LATIN SMALL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006b: LATIN SMALL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006c: LATIN SMALL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006d: LATIN SMALL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006e: LATIN SMALL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00006f: LATIN SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000070: LATIN SMALL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000071: LATIN SMALL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000072: LATIN SMALL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000073: LATIN SMALL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000074: LATIN SMALL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000075: LATIN SMALL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000076: LATIN SMALL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000077: LATIN SMALL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000078: LATIN SMALL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000079: LATIN SMALL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00007a: LATIN SMALL LETTER Z*/
-                                                     0, /* U+00007b: LEFT CURLY BRACKET*/
-                                                     0, /* U+00007c: VERTICAL LINE*/
-                                                     0, /* U+00007d: RIGHT CURLY BRACKET*/
-                                                     0, /* U+00007e: TILDE*/
-                                                     0, /* U+00007f: <control>*/
-                                                     0, /* U+000080: <control>*/
-                                                     0, /* U+000081: <control>*/
-                                                     0, /* U+000082: <control>*/
-                                                     0, /* U+000083: <control>*/
-                                                     0, /* U+000084: <control>*/
-                                          RTUNI_WSPACE, /* U+000085: <control>*/
-                                                     0, /* U+000086: <control>*/
-                                                     0, /* U+000087: <control>*/
-                                                     0, /* U+000088: <control>*/
-                                                     0, /* U+000089: <control>*/
-                                                     0, /* U+00008a: <control>*/
-                                                     0, /* U+00008b: <control>*/
-                                                     0, /* U+00008c: <control>*/
-                                                     0, /* U+00008d: <control>*/
-                                                     0, /* U+00008e: <control>*/
-                                                     0, /* U+00008f: <control>*/
-                                                     0, /* U+000090: <control>*/
-                                                     0, /* U+000091: <control>*/
-                                                     0, /* U+000092: <control>*/
-                                                     0, /* U+000093: <control>*/
-                                                     0, /* U+000094: <control>*/
-                                                     0, /* U+000095: <control>*/
-                                                     0, /* U+000096: <control>*/
-                                                     0, /* U+000097: <control>*/
-                                                     0, /* U+000098: <control>*/
-                                                     0, /* U+000099: <control>*/
-                                                     0, /* U+00009a: <control>*/
-                                                     0, /* U+00009b: <control>*/
-                                                     0, /* U+00009c: <control>*/
-                                                     0, /* U+00009d: <control>*/
-                                                     0, /* U+00009e: <control>*/
-                                                     0, /* U+00009f: <control>*/
-                                          RTUNI_WSPACE, /* U+0000a0: NO-BREAK SPACE*/
-                                                     0, /* U+0000a1: INVERTED EXCLAMATION MARK*/
-                                                     0, /* U+0000a2: CENT SIGN*/
-                                                     0, /* U+0000a3: POUND SIGN*/
-                                                     0, /* U+0000a4: CURRENCY SIGN*/
-                                                     0, /* U+0000a5: YEN SIGN*/
-                                                     0, /* U+0000a6: BROKEN BAR*/
-                                                     0, /* U+0000a7: SECTION SIGN*/
-                                                     0, /* U+0000a8: DIAERESIS*/
-                                                     0, /* U+0000a9: COPYRIGHT SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
-                                                     0, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-                                                     0, /* U+0000ac: NOT SIGN*/
-                                                     0, /* U+0000ad: SOFT HYPHEN*/
-                                                     0, /* U+0000ae: REGISTERED SIGN*/
-                                                     0, /* U+0000af: MACRON*/
-                                                     0, /* U+0000b0: DEGREE SIGN*/
-                                                     0, /* U+0000b1: PLUS-MINUS SIGN*/
-                                                     0, /* U+0000b2: SUPERSCRIPT TWO*/
-                                                     0, /* U+0000b3: SUPERSCRIPT THREE*/
-                                                     0, /* U+0000b4: ACUTE ACCENT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000b5: MICRO SIGN*/
-                                                     0, /* U+0000b6: PILCROW SIGN*/
-                                                     0, /* U+0000b7: MIDDLE DOT*/
-                                                     0, /* U+0000b8: CEDILLA*/
-                                                     0, /* U+0000b9: SUPERSCRIPT ONE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
-                                                     0, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-                                                     0, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
-                                                     0, /* U+0000bd: VULGAR FRACTION ONE HALF*/
-                                                     0, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
-                                                     0, /* U+0000bf: INVERTED QUESTION MARK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c6: LATIN CAPITAL LETTER AE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
-                                                     0, /* U+0000d7: MULTIPLICATION SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0000de: LATIN CAPITAL LETTER THORN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000df: LATIN SMALL LETTER SHARP S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e6: LATIN SMALL LETTER AE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f0: LATIN SMALL LETTER ETH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
-                                                     0, /* U+0000f7: DIVISION SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000fe: LATIN SMALL LETTER THORN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000133: LATIN SMALL LIGATURE IJ*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000138: LATIN SMALL LETTER KRA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014a: LATIN CAPITAL LETTER ENG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014b: LATIN SMALL LETTER ENG*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000152: LATIN CAPITAL LIGATURE OE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000153: LATIN SMALL LIGATURE OE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00017f: LATIN SMALL LETTER LONG S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000185: LATIN SMALL LETTER TONE SIX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000195: LATIN SMALL LETTER HV*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000196: LATIN CAPITAL LETTER IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a2: LATIN CAPITAL LETTER OI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a3: LATIN SMALL LETTER OI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a6: LATIN LETTER YR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
-                                           RTUNI_ALPHA, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001bf: LATIN LETTER WYNN*/
-                                           RTUNI_ALPHA, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
-                                           RTUNI_ALPHA, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
-                                           RTUNI_ALPHA, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
-                                           RTUNI_ALPHA, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
-                                           RTUNI_ALPHA, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
-                                           RTUNI_ALPHA, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001c9: LATIN SMALL LETTER LJ*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
-                                           RTUNI_ALPHA, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001cc: LATIN SMALL LETTER NJ*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
-                                           RTUNI_ALPHA, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f3: LATIN SMALL LETTER DZ*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021d: LATIN SMALL LETTER YOGH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000222: LATIN CAPITAL LETTER OU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000223: LATIN SMALL LETTER OU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
-                                                     0, /* U+000242: */
-                                                     0, /* U+000243: */
-                                                     0, /* U+000244: */
-                                                     0, /* U+000245: */
-                                                     0, /* U+000246: */
-                                                     0, /* U+000247: */
-                                                     0, /* U+000248: */
-                                                     0, /* U+000249: */
-                                                     0, /* U+00024a: */
-                                                     0, /* U+00024b: */
-                                                     0, /* U+00024c: */
-                                                     0, /* U+00024d: */
-                                                     0, /* U+00024e: */
-                                                     0, /* U+00024f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000250: LATIN SMALL LETTER TURNED A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000251: LATIN SMALL LETTER ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000254: LATIN SMALL LETTER OPEN O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000258: LATIN SMALL LETTER REVERSED E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000259: LATIN SMALL LETTER SCHWA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025b: LATIN SMALL LETTER OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000263: LATIN SMALL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000265: LATIN SMALL LETTER TURNED H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000269: LATIN SMALL LETTER IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026e: LATIN SMALL LETTER LEZH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00026f: LATIN SMALL LETTER TURNED M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000275: LATIN SMALL LETTER BARRED O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000278: LATIN SMALL LETTER PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000279: LATIN SMALL LETTER TURNED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000283: LATIN SMALL LETTER ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000287: LATIN SMALL LETTER TURNED T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000289: LATIN SMALL LETTER U BAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028a: LATIN SMALL LETTER UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028c: LATIN SMALL LETTER TURNED V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028d: LATIN SMALL LETTER TURNED W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000292: LATIN SMALL LETTER EZH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000294: LATIN LETTER GLOTTAL STOP*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000297: LATIN LETTER STRETCHED C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000298: LATIN LETTER BILABIAL CLICK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029e: LATIN SMALL LETTER TURNED K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b0: MODIFIER LETTER SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b2: MODIFIER LETTER SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b3: MODIFIER LETTER SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b7: MODIFIER LETTER SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002b8: MODIFIER LETTER SMALL Y*/
-                                           RTUNI_ALPHA, /* U+0002b9: MODIFIER LETTER PRIME*/
-                                           RTUNI_ALPHA, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
-                                           RTUNI_ALPHA, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
-                                           RTUNI_ALPHA, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
-                                           RTUNI_ALPHA, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
-                                           RTUNI_ALPHA, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
-                                           RTUNI_ALPHA, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
-                                                     0, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
-                                                     0, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
-                                                     0, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
-                                                     0, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
-                                           RTUNI_ALPHA, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
-                                           RTUNI_ALPHA, /* U+0002c7: CARON*/
-                                           RTUNI_ALPHA, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
-                                           RTUNI_ALPHA, /* U+0002c9: MODIFIER LETTER MACRON*/
-                                           RTUNI_ALPHA, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
-                                           RTUNI_ALPHA, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
-                                           RTUNI_ALPHA, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
-                                           RTUNI_ALPHA, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
-                                           RTUNI_ALPHA, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
-                                           RTUNI_ALPHA, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
-                                           RTUNI_ALPHA, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
-                                           RTUNI_ALPHA, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
-                                                     0, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
-                                                     0, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
-                                                     0, /* U+0002d4: MODIFIER LETTER UP TACK*/
-                                                     0, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
-                                                     0, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
-                                                     0, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
-                                                     0, /* U+0002d8: BREVE*/
-                                                     0, /* U+0002d9: DOT ABOVE*/
-                                                     0, /* U+0002da: RING ABOVE*/
-                                                     0, /* U+0002db: OGONEK*/
-                                                     0, /* U+0002dc: SMALL TILDE*/
-                                                     0, /* U+0002dd: DOUBLE ACUTE ACCENT*/
-                                                     0, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
-                                                     0, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e1: MODIFIER LETTER SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e2: MODIFIER LETTER SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e3: MODIFIER LETTER SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
-                                                     0, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
-                                                     0, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
-                                                     0, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
-                                                     0, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
-                                                     0, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
-                                                     0, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
-                                                     0, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
-                                                     0, /* U+0002ec: MODIFIER LETTER VOICING*/
-                                                     0, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
-                                           RTUNI_ALPHA, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
-                                                     0, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
-                                                     0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
-                                                     0, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
-                                                     0, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
-                                                     0, /* U+0002f3: MODIFIER LETTER LOW RING*/
-                                                     0, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
-                                                     0, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
-                                                     0, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
-                                                     0, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
-                                                     0, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
-                                                     0, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
-                                                     0, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
-                                                     0, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
-                                                     0, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
-                                                     0, /* U+0002fd: MODIFIER LETTER SHELF*/
-                                                     0, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
-                                                     0, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
-                                                     0, /* U+000300: COMBINING GRAVE ACCENT*/
-                                                     0, /* U+000301: COMBINING ACUTE ACCENT*/
-                                                     0, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
-                                                     0, /* U+000303: COMBINING TILDE*/
-                                                     0, /* U+000304: COMBINING MACRON*/
-                                                     0, /* U+000305: COMBINING OVERLINE*/
-                                                     0, /* U+000306: COMBINING BREVE*/
-                                                     0, /* U+000307: COMBINING DOT ABOVE*/
-                                                     0, /* U+000308: COMBINING DIAERESIS*/
-                                                     0, /* U+000309: COMBINING HOOK ABOVE*/
-                                                     0, /* U+00030a: COMBINING RING ABOVE*/
-                                                     0, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
-                                                     0, /* U+00030c: COMBINING CARON*/
-                                                     0, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
-                                                     0, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
-                                                     0, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
-                                                     0, /* U+000310: COMBINING CANDRABINDU*/
-                                                     0, /* U+000311: COMBINING INVERTED BREVE*/
-                                                     0, /* U+000312: COMBINING TURNED COMMA ABOVE*/
-                                                     0, /* U+000313: COMBINING COMMA ABOVE*/
-                                                     0, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
-                                                     0, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
-                                                     0, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
-                                                     0, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
-                                                     0, /* U+000318: COMBINING LEFT TACK BELOW*/
-                                                     0, /* U+000319: COMBINING RIGHT TACK BELOW*/
-                                                     0, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
-                                                     0, /* U+00031b: COMBINING HORN*/
-                                                     0, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
-                                                     0, /* U+00031d: COMBINING UP TACK BELOW*/
-                                                     0, /* U+00031e: COMBINING DOWN TACK BELOW*/
-                                                     0, /* U+00031f: COMBINING PLUS SIGN BELOW*/
-                                                     0, /* U+000320: COMBINING MINUS SIGN BELOW*/
-                                                     0, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
-                                                     0, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
-                                                     0, /* U+000323: COMBINING DOT BELOW*/
-                                                     0, /* U+000324: COMBINING DIAERESIS BELOW*/
-                                                     0, /* U+000325: COMBINING RING BELOW*/
-                                                     0, /* U+000326: COMBINING COMMA BELOW*/
-                                                     0, /* U+000327: COMBINING CEDILLA*/
-                                                     0, /* U+000328: COMBINING OGONEK*/
-                                                     0, /* U+000329: COMBINING VERTICAL LINE BELOW*/
-                                                     0, /* U+00032a: COMBINING BRIDGE BELOW*/
-                                                     0, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
-                                                     0, /* U+00032c: COMBINING CARON BELOW*/
-                                                     0, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
-                                                     0, /* U+00032e: COMBINING BREVE BELOW*/
-                                                     0, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
-                                                     0, /* U+000330: COMBINING TILDE BELOW*/
-                                                     0, /* U+000331: COMBINING MACRON BELOW*/
-                                                     0, /* U+000332: COMBINING LOW LINE*/
-                                                     0, /* U+000333: COMBINING DOUBLE LOW LINE*/
-                                                     0, /* U+000334: COMBINING TILDE OVERLAY*/
-                                                     0, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
-                                                     0, /* U+000336: COMBINING LONG STROKE OVERLAY*/
-                                                     0, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
-                                                     0, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
-                                                     0, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
-                                                     0, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
-                                                     0, /* U+00033b: COMBINING SQUARE BELOW*/
-                                                     0, /* U+00033c: COMBINING SEAGULL BELOW*/
-                                                     0, /* U+00033d: COMBINING X ABOVE*/
-                                                     0, /* U+00033e: COMBINING VERTICAL TILDE*/
-                                                     0, /* U+00033f: COMBINING DOUBLE OVERLINE*/
-                                                     0, /* U+000340: COMBINING GRAVE TONE MARK*/
-                                                     0, /* U+000341: COMBINING ACUTE TONE MARK*/
-                                                     0, /* U+000342: COMBINING GREEK PERISPOMENI*/
-                                                     0, /* U+000343: COMBINING GREEK KORONIS*/
-                                                     0, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
-                                                     0, /* U+000346: COMBINING BRIDGE ABOVE*/
-                                                     0, /* U+000347: COMBINING EQUALS SIGN BELOW*/
-                                                     0, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
-                                                     0, /* U+000349: COMBINING LEFT ANGLE BELOW*/
-                                                     0, /* U+00034a: COMBINING NOT TILDE ABOVE*/
-                                                     0, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
-                                                     0, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
-                                                     0, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
-                                                     0, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
-                                                     0, /* U+00034f: COMBINING GRAPHEME JOINER*/
-                                                     0, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
-                                                     0, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
-                                                     0, /* U+000352: COMBINING FERMATA*/
-                                                     0, /* U+000353: COMBINING X BELOW*/
-                                                     0, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
-                                                     0, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
-                                                     0, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
-                                                     0, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
-                                                     0, /* U+000358: COMBINING DOT ABOVE RIGHT*/
-                                                     0, /* U+000359: COMBINING ASTERISK BELOW*/
-                                                     0, /* U+00035a: COMBINING DOUBLE RING BELOW*/
-                                                     0, /* U+00035b: COMBINING ZIGZAG ABOVE*/
-                                                     0, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
-                                                     0, /* U+00035d: COMBINING DOUBLE BREVE*/
-                                                     0, /* U+00035e: COMBINING DOUBLE MACRON*/
-                                                     0, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
-                                                     0, /* U+000360: COMBINING DOUBLE TILDE*/
-                                                     0, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
-                                                     0, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
-                                                     0, /* U+000363: COMBINING LATIN SMALL LETTER A*/
-                                                     0, /* U+000364: COMBINING LATIN SMALL LETTER E*/
-                                                     0, /* U+000365: COMBINING LATIN SMALL LETTER I*/
-                                                     0, /* U+000366: COMBINING LATIN SMALL LETTER O*/
-                                                     0, /* U+000367: COMBINING LATIN SMALL LETTER U*/
-                                                     0, /* U+000368: COMBINING LATIN SMALL LETTER C*/
-                                                     0, /* U+000369: COMBINING LATIN SMALL LETTER D*/
-                                                     0, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
-                                                     0, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
-                                                     0, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
-                                                     0, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
-                                                     0, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
-                                                     0, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
-                                                     0, /* U+000370: */
-                                                     0, /* U+000371: */
-                                                     0, /* U+000372: */
-                                                     0, /* U+000373: */
-                                                     0, /* U+000374: GREEK NUMERAL SIGN*/
-                                                     0, /* U+000375: GREEK LOWER NUMERAL SIGN*/
-                                                     0, /* U+000376: */
-                                                     0, /* U+000377: */
-                                                     0, /* U+000378: */
-                                                     0, /* U+000379: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00037a: GREEK YPOGEGRAMMENI*/
-                                                     0, /* U+00037b: */
-                                                     0, /* U+00037c: */
-                                                     0, /* U+00037d: */
-                                                     0, /* U+00037e: GREEK QUESTION MARK*/
-                                                     0, /* U+00037f: */
-                                                     0, /* U+000380: */
-                                                     0, /* U+000381: */
-                                                     0, /* U+000382: */
-                                                     0, /* U+000383: */
-                                                     0, /* U+000384: GREEK TONOS*/
-                                                     0, /* U+000385: GREEK DIALYTIKA TONOS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
-                                                     0, /* U+000387: GREEK ANO TELEIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
-                                                     0, /* U+00038b: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
-                                                     0, /* U+00038d: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000392: GREEK CAPITAL LETTER BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000394: GREEK CAPITAL LETTER DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000396: GREEK CAPITAL LETTER ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000397: GREEK CAPITAL LETTER ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000398: GREEK CAPITAL LETTER THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000399: GREEK CAPITAL LETTER IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039c: GREEK CAPITAL LETTER MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039d: GREEK CAPITAL LETTER NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039e: GREEK CAPITAL LETTER XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a0: GREEK CAPITAL LETTER PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
-                                                     0, /* U+0003a2: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b2: GREEK SMALL LETTER BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b4: GREEK SMALL LETTER DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b6: GREEK SMALL LETTER ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b7: GREEK SMALL LETTER ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b8: GREEK SMALL LETTER THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003b9: GREEK SMALL LETTER IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bc: GREEK SMALL LETTER MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bd: GREEK SMALL LETTER NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003be: GREEK SMALL LETTER XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c0: GREEK SMALL LETTER PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c1: GREEK SMALL LETTER RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c4: GREEK SMALL LETTER TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c6: GREEK SMALL LETTER PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c7: GREEK SMALL LETTER CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c8: GREEK SMALL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
-                                                     0, /* U+0003cf: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d0: GREEK BETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d1: GREEK THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d5: GREEK PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d6: GREEK PI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d7: GREEK KAI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003da: GREEK LETTER STIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003db: GREEK SMALL LETTER STIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003dc: GREEK LETTER DIGAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003de: GREEK LETTER KOPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003df: GREEK SMALL LETTER KOPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e0: GREEK LETTER SAMPI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e5: COPTIC SMALL LETTER FEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003e9: COPTIC SMALL LETTER HORI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003ef: COPTIC SMALL LETTER DEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f0: GREEK KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f1: GREEK RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f3: GREEK LETTER YOT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
-                                                     0, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003f8: GREEK SMALL LETTER SHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fb: GREEK SMALL LETTER SAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000410: CYRILLIC CAPITAL LETTER A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000418: CYRILLIC CAPITAL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000423: CYRILLIC CAPITAL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000430: CYRILLIC SMALL LETTER A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000431: CYRILLIC SMALL LETTER BE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000432: CYRILLIC SMALL LETTER VE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000433: CYRILLIC SMALL LETTER GHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000434: CYRILLIC SMALL LETTER DE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000435: CYRILLIC SMALL LETTER IE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000437: CYRILLIC SMALL LETTER ZE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000438: CYRILLIC SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043a: CYRILLIC SMALL LETTER KA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043b: CYRILLIC SMALL LETTER EL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043c: CYRILLIC SMALL LETTER EM*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043d: CYRILLIC SMALL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043e: CYRILLIC SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00043f: CYRILLIC SMALL LETTER PE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000440: CYRILLIC SMALL LETTER ER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000441: CYRILLIC SMALL LETTER ES*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000442: CYRILLIC SMALL LETTER TE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000443: CYRILLIC SMALL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000444: CYRILLIC SMALL LETTER EF*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000445: CYRILLIC SMALL LETTER HA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000446: CYRILLIC SMALL LETTER TSE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000447: CYRILLIC SMALL LETTER CHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000448: CYRILLIC SMALL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044d: CYRILLIC SMALL LETTER E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044e: CYRILLIC SMALL LETTER YU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00044f: CYRILLIC SMALL LETTER YA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000451: CYRILLIC SMALL LETTER IO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000452: CYRILLIC SMALL LETTER DJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000453: CYRILLIC SMALL LETTER GJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000455: CYRILLIC SMALL LETTER DZE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000457: CYRILLIC SMALL LETTER YI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000458: CYRILLIC SMALL LETTER JE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000459: CYRILLIC SMALL LETTER LJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000463: CYRILLIC SMALL LETTER YAT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000471: CYRILLIC SMALL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000473: CYRILLIC SMALL LETTER FITA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000479: CYRILLIC SMALL LETTER UK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00047f: CYRILLIC SMALL LETTER OT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
-                                                     0, /* U+000482: CYRILLIC THOUSANDS SIGN*/
-                                                     0, /* U+000483: COMBINING CYRILLIC TITLO*/
-                                                     0, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
-                                                     0, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
-                                                     0, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
-                                                     0, /* U+000487: */
-                                                     0, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
-                                                     0, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
-                                                     0, /* U+0004cf: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
-                                                     0, /* U+0004fa: */
-                                                     0, /* U+0004fb: */
-                                                     0, /* U+0004fc: */
-                                                     0, /* U+0004fd: */
-                                                     0, /* U+0004fe: */
-                                                     0, /* U+0004ff: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
-                                                     0, /* U+000510: */
-                                                     0, /* U+000511: */
-                                                     0, /* U+000512: */
-                                                     0, /* U+000513: */
-                                                     0, /* U+000514: */
-                                                     0, /* U+000515: */
-                                                     0, /* U+000516: */
-                                                     0, /* U+000517: */
-                                                     0, /* U+000518: */
-                                                     0, /* U+000519: */
-                                                     0, /* U+00051a: */
-                                                     0, /* U+00051b: */
-                                                     0, /* U+00051c: */
-                                                     0, /* U+00051d: */
-                                                     0, /* U+00051e: */
-                                                     0, /* U+00051f: */
-                                                     0, /* U+000520: */
-                                                     0, /* U+000521: */
-                                                     0, /* U+000522: */
-                                                     0, /* U+000523: */
-                                                     0, /* U+000524: */
-                                                     0, /* U+000525: */
-                                                     0, /* U+000526: */
-                                                     0, /* U+000527: */
-                                                     0, /* U+000528: */
-                                                     0, /* U+000529: */
-                                                     0, /* U+00052a: */
-                                                     0, /* U+00052b: */
-                                                     0, /* U+00052c: */
-                                                     0, /* U+00052d: */
-                                                     0, /* U+00052e: */
-                                                     0, /* U+00052f: */
-                                                     0, /* U+000530: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
-                                                     0, /* U+000557: */
-                                                     0, /* U+000558: */
-                                           RTUNI_ALPHA, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
-                                                     0, /* U+00055a: ARMENIAN APOSTROPHE*/
-                                                     0, /* U+00055b: ARMENIAN EMPHASIS MARK*/
-                                                     0, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
-                                                     0, /* U+00055d: ARMENIAN COMMA*/
-                                                     0, /* U+00055e: ARMENIAN QUESTION MARK*/
-                                                     0, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
-                                                     0, /* U+000560: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000561: ARMENIAN SMALL LETTER AYB*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000562: ARMENIAN SMALL LETTER BEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000563: ARMENIAN SMALL LETTER GIM*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000564: ARMENIAN SMALL LETTER DA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000565: ARMENIAN SMALL LETTER ECH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000566: ARMENIAN SMALL LETTER ZA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000567: ARMENIAN SMALL LETTER EH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000568: ARMENIAN SMALL LETTER ET*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000569: ARMENIAN SMALL LETTER TO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056b: ARMENIAN SMALL LETTER INI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056e: ARMENIAN SMALL LETTER CA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000570: ARMENIAN SMALL LETTER HO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000571: ARMENIAN SMALL LETTER JA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000574: ARMENIAN SMALL LETTER MEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000575: ARMENIAN SMALL LETTER YI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000576: ARMENIAN SMALL LETTER NOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000577: ARMENIAN SMALL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000578: ARMENIAN SMALL LETTER VO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000579: ARMENIAN SMALL LETTER CHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057c: ARMENIAN SMALL LETTER RA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000580: ARMENIAN SMALL LETTER REH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000581: ARMENIAN SMALL LETTER CO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000584: ARMENIAN SMALL LETTER KEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000585: ARMENIAN SMALL LETTER OH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000586: ARMENIAN SMALL LETTER FEH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+000587: ARMENIAN SMALL LIGATURE ECH YIWN*/
-                                                     0, /* U+000588: */
-                                                     0, /* U+000589: ARMENIAN FULL STOP*/
-                                                     0, /* U+00058a: ARMENIAN HYPHEN*/
-                                                     0, /* U+00058b: */
-                                                     0, /* U+00058c: */
-                                                     0, /* U+00058d: */
-                                                     0, /* U+00058e: */
-                                                     0, /* U+00058f: */
-                                                     0, /* U+000590: */
-                                                     0, /* U+000591: HEBREW ACCENT ETNAHTA*/
-                                                     0, /* U+000592: HEBREW ACCENT SEGOL*/
-                                                     0, /* U+000593: HEBREW ACCENT SHALSHELET*/
-                                                     0, /* U+000594: HEBREW ACCENT ZAQEF QATAN*/
-                                                     0, /* U+000595: HEBREW ACCENT ZAQEF GADOL*/
-                                                     0, /* U+000596: HEBREW ACCENT TIPEHA*/
-                                                     0, /* U+000597: HEBREW ACCENT REVIA*/
-                                                     0, /* U+000598: HEBREW ACCENT ZARQA*/
-                                                     0, /* U+000599: HEBREW ACCENT PASHTA*/
-                                                     0, /* U+00059a: HEBREW ACCENT YETIV*/
-                                                     0, /* U+00059b: HEBREW ACCENT TEVIR*/
-                                                     0, /* U+00059c: HEBREW ACCENT GERESH*/
-                                                     0, /* U+00059d: HEBREW ACCENT GERESH MUQDAM*/
-                                                     0, /* U+00059e: HEBREW ACCENT GERSHAYIM*/
-                                                     0, /* U+00059f: HEBREW ACCENT QARNEY PARA*/
-                                                     0, /* U+0005a0: HEBREW ACCENT TELISHA GEDOLA*/
-                                                     0, /* U+0005a1: HEBREW ACCENT PAZER*/
-                                                     0, /* U+0005a2: HEBREW ACCENT ATNAH HAFUKH*/
-                                                     0, /* U+0005a3: HEBREW ACCENT MUNAH*/
-                                                     0, /* U+0005a4: HEBREW ACCENT MAHAPAKH*/
-                                                     0, /* U+0005a5: HEBREW ACCENT MERKHA*/
-                                                     0, /* U+0005a6: HEBREW ACCENT MERKHA KEFULA*/
-                                                     0, /* U+0005a7: HEBREW ACCENT DARGA*/
-                                                     0, /* U+0005a8: HEBREW ACCENT QADMA*/
-                                                     0, /* U+0005a9: HEBREW ACCENT TELISHA QETANA*/
-                                                     0, /* U+0005aa: HEBREW ACCENT YERAH BEN YOMO*/
-                                                     0, /* U+0005ab: HEBREW ACCENT OLE*/
-                                                     0, /* U+0005ac: HEBREW ACCENT ILUY*/
-                                                     0, /* U+0005ad: HEBREW ACCENT DEHI*/
-                                                     0, /* U+0005ae: HEBREW ACCENT ZINOR*/
-                                                     0, /* U+0005af: HEBREW MARK MASORA CIRCLE*/
-                                           RTUNI_ALPHA, /* U+0005b0: HEBREW POINT SHEVA*/
-                                           RTUNI_ALPHA, /* U+0005b1: HEBREW POINT HATAF SEGOL*/
-                                           RTUNI_ALPHA, /* U+0005b2: HEBREW POINT HATAF PATAH*/
-                                           RTUNI_ALPHA, /* U+0005b3: HEBREW POINT HATAF QAMATS*/
-                                           RTUNI_ALPHA, /* U+0005b4: HEBREW POINT HIRIQ*/
-                                           RTUNI_ALPHA, /* U+0005b5: HEBREW POINT TSERE*/
-                                           RTUNI_ALPHA, /* U+0005b6: HEBREW POINT SEGOL*/
-                                           RTUNI_ALPHA, /* U+0005b7: HEBREW POINT PATAH*/
-                                           RTUNI_ALPHA, /* U+0005b8: HEBREW POINT QAMATS*/
-                                           RTUNI_ALPHA, /* U+0005b9: HEBREW POINT HOLAM*/
-                                                     0, /* U+0005ba: */
-                                           RTUNI_ALPHA, /* U+0005bb: HEBREW POINT QUBUTS*/
-                                           RTUNI_ALPHA, /* U+0005bc: HEBREW POINT DAGESH OR MAPIQ*/
-                                           RTUNI_ALPHA, /* U+0005bd: HEBREW POINT METEG*/
-                                                     0, /* U+0005be: HEBREW PUNCTUATION MAQAF*/
-                                           RTUNI_ALPHA, /* U+0005bf: HEBREW POINT RAFE*/
-                                                     0, /* U+0005c0: HEBREW PUNCTUATION PASEQ*/
-                                           RTUNI_ALPHA, /* U+0005c1: HEBREW POINT SHIN DOT*/
-                                           RTUNI_ALPHA, /* U+0005c2: HEBREW POINT SIN DOT*/
-                                                     0, /* U+0005c3: HEBREW PUNCTUATION SOF PASUQ*/
-                                           RTUNI_ALPHA, /* U+0005c4: HEBREW MARK UPPER DOT*/
-                                           RTUNI_ALPHA, /* U+0005c5: HEBREW MARK LOWER DOT*/
-                                                     0, /* U+0005c6: HEBREW PUNCTUATION NUN HAFUKHA*/
-                                           RTUNI_ALPHA, /* U+0005c7: HEBREW POINT QAMATS QATAN*/
-                                                     0, /* U+0005c8: */
-                                                     0, /* U+0005c9: */
-                                                     0, /* U+0005ca: */
-                                                     0, /* U+0005cb: */
-                                                     0, /* U+0005cc: */
-                                                     0, /* U+0005cd: */
-                                                     0, /* U+0005ce: */
-                                                     0, /* U+0005cf: */
-                                           RTUNI_ALPHA, /* U+0005d0: HEBREW LETTER ALEF*/
-                                           RTUNI_ALPHA, /* U+0005d1: HEBREW LETTER BET*/
-                                           RTUNI_ALPHA, /* U+0005d2: HEBREW LETTER GIMEL*/
-                                           RTUNI_ALPHA, /* U+0005d3: HEBREW LETTER DALET*/
-                                           RTUNI_ALPHA, /* U+0005d4: HEBREW LETTER HE*/
-                                           RTUNI_ALPHA, /* U+0005d5: HEBREW LETTER VAV*/
-                                           RTUNI_ALPHA, /* U+0005d6: HEBREW LETTER ZAYIN*/
-                                           RTUNI_ALPHA, /* U+0005d7: HEBREW LETTER HET*/
-                                           RTUNI_ALPHA, /* U+0005d8: HEBREW LETTER TET*/
-                                           RTUNI_ALPHA, /* U+0005d9: HEBREW LETTER YOD*/
-                                           RTUNI_ALPHA, /* U+0005da: HEBREW LETTER FINAL KAF*/
-                                           RTUNI_ALPHA, /* U+0005db: HEBREW LETTER KAF*/
-                                           RTUNI_ALPHA, /* U+0005dc: HEBREW LETTER LAMED*/
-                                           RTUNI_ALPHA, /* U+0005dd: HEBREW LETTER FINAL MEM*/
-                                           RTUNI_ALPHA, /* U+0005de: HEBREW LETTER MEM*/
-                                           RTUNI_ALPHA, /* U+0005df: HEBREW LETTER FINAL NUN*/
-                                           RTUNI_ALPHA, /* U+0005e0: HEBREW LETTER NUN*/
-                                           RTUNI_ALPHA, /* U+0005e1: HEBREW LETTER SAMEKH*/
-                                           RTUNI_ALPHA, /* U+0005e2: HEBREW LETTER AYIN*/
-                                           RTUNI_ALPHA, /* U+0005e3: HEBREW LETTER FINAL PE*/
-                                           RTUNI_ALPHA, /* U+0005e4: HEBREW LETTER PE*/
-                                           RTUNI_ALPHA, /* U+0005e5: HEBREW LETTER FINAL TSADI*/
-                                           RTUNI_ALPHA, /* U+0005e6: HEBREW LETTER TSADI*/
-                                           RTUNI_ALPHA, /* U+0005e7: HEBREW LETTER QOF*/
-                                           RTUNI_ALPHA, /* U+0005e8: HEBREW LETTER RESH*/
-                                           RTUNI_ALPHA, /* U+0005e9: HEBREW LETTER SHIN*/
-                                           RTUNI_ALPHA, /* U+0005ea: HEBREW LETTER TAV*/
-                                                     0, /* U+0005eb: */
-                                                     0, /* U+0005ec: */
-                                                     0, /* U+0005ed: */
-                                                     0, /* U+0005ee: */
-                                                     0, /* U+0005ef: */
-                                           RTUNI_ALPHA, /* U+0005f0: HEBREW LIGATURE YIDDISH DOUBLE VAV*/
-                                           RTUNI_ALPHA, /* U+0005f1: HEBREW LIGATURE YIDDISH VAV YOD*/
-                                           RTUNI_ALPHA, /* U+0005f2: HEBREW LIGATURE YIDDISH DOUBLE YOD*/
-                                                     0, /* U+0005f3: HEBREW PUNCTUATION GERESH*/
-                                                     0, /* U+0005f4: HEBREW PUNCTUATION GERSHAYIM*/
-                                                     0, /* U+0005f5: */
-                                                     0, /* U+0005f6: */
-                                                     0, /* U+0005f7: */
-                                                     0, /* U+0005f8: */
-                                                     0, /* U+0005f9: */
-                                                     0, /* U+0005fa: */
-                                                     0, /* U+0005fb: */
-                                                     0, /* U+0005fc: */
-                                                     0, /* U+0005fd: */
-                                                     0, /* U+0005fe: */
-                                                     0, /* U+0005ff: */
-                                                     0, /* U+000600: ARABIC NUMBER SIGN*/
-                                                     0, /* U+000601: ARABIC SIGN SANAH*/
-                                                     0, /* U+000602: ARABIC FOOTNOTE MARKER*/
-                                                     0, /* U+000603: ARABIC SIGN SAFHA*/
-                                                     0, /* U+000604: */
-                                                     0, /* U+000605: */
-                                                     0, /* U+000606: */
-                                                     0, /* U+000607: */
-                                                     0, /* U+000608: */
-                                                     0, /* U+000609: */
-                                                     0, /* U+00060a: */
-                                                     0, /* U+00060b: AFGHANI SIGN*/
-                                                     0, /* U+00060c: ARABIC COMMA*/
-                                                     0, /* U+00060d: ARABIC DATE SEPARATOR*/
-                                                     0, /* U+00060e: ARABIC POETIC VERSE SIGN*/
-                                                     0, /* U+00060f: ARABIC SIGN MISRA*/
-                                           RTUNI_ALPHA, /* U+000610: ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM*/
-                                           RTUNI_ALPHA, /* U+000611: ARABIC SIGN ALAYHE ASSALLAM*/
-                                           RTUNI_ALPHA, /* U+000612: ARABIC SIGN RAHMATULLAH ALAYHE*/
-                                           RTUNI_ALPHA, /* U+000613: ARABIC SIGN RADI ALLAHOU ANHU*/
-                                           RTUNI_ALPHA, /* U+000614: ARABIC SIGN TAKHALLUS*/
-                                           RTUNI_ALPHA, /* U+000615: ARABIC SMALL HIGH TAH*/
-                                                     0, /* U+000616: */
-                                                     0, /* U+000617: */
-                                                     0, /* U+000618: */
-                                                     0, /* U+000619: */
-                                                     0, /* U+00061a: */
-                                                     0, /* U+00061b: ARABIC SEMICOLON*/
-                                                     0, /* U+00061c: */
-                                                     0, /* U+00061d: */
-                                                     0, /* U+00061e: ARABIC TRIPLE DOT PUNCTUATION MARK*/
-                                                     0, /* U+00061f: ARABIC QUESTION MARK*/
-                                                     0, /* U+000620: */
-                                           RTUNI_ALPHA, /* U+000621: ARABIC LETTER HAMZA*/
-                                           RTUNI_ALPHA, /* U+000622: ARABIC LETTER ALEF WITH MADDA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000623: ARABIC LETTER ALEF WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000624: ARABIC LETTER WAW WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000625: ARABIC LETTER ALEF WITH HAMZA BELOW*/
-                                           RTUNI_ALPHA, /* U+000626: ARABIC LETTER YEH WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000627: ARABIC LETTER ALEF*/
-                                           RTUNI_ALPHA, /* U+000628: ARABIC LETTER BEH*/
-                                           RTUNI_ALPHA, /* U+000629: ARABIC LETTER TEH MARBUTA*/
-                                           RTUNI_ALPHA, /* U+00062a: ARABIC LETTER TEH*/
-                                           RTUNI_ALPHA, /* U+00062b: ARABIC LETTER THEH*/
-                                           RTUNI_ALPHA, /* U+00062c: ARABIC LETTER JEEM*/
-                                           RTUNI_ALPHA, /* U+00062d: ARABIC LETTER HAH*/
-                                           RTUNI_ALPHA, /* U+00062e: ARABIC LETTER KHAH*/
-                                           RTUNI_ALPHA, /* U+00062f: ARABIC LETTER DAL*/
-                                           RTUNI_ALPHA, /* U+000630: ARABIC LETTER THAL*/
-                                           RTUNI_ALPHA, /* U+000631: ARABIC LETTER REH*/
-                                           RTUNI_ALPHA, /* U+000632: ARABIC LETTER ZAIN*/
-                                           RTUNI_ALPHA, /* U+000633: ARABIC LETTER SEEN*/
-                                           RTUNI_ALPHA, /* U+000634: ARABIC LETTER SHEEN*/
-                                           RTUNI_ALPHA, /* U+000635: ARABIC LETTER SAD*/
-                                           RTUNI_ALPHA, /* U+000636: ARABIC LETTER DAD*/
-                                           RTUNI_ALPHA, /* U+000637: ARABIC LETTER TAH*/
-                                           RTUNI_ALPHA, /* U+000638: ARABIC LETTER ZAH*/
-                                           RTUNI_ALPHA, /* U+000639: ARABIC LETTER AIN*/
-                                           RTUNI_ALPHA, /* U+00063a: ARABIC LETTER GHAIN*/
-                                                     0, /* U+00063b: */
-                                                     0, /* U+00063c: */
-                                                     0, /* U+00063d: */
-                                                     0, /* U+00063e: */
-                                                     0, /* U+00063f: */
-                                           RTUNI_ALPHA, /* U+000640: ARABIC TATWEEL*/
-                                           RTUNI_ALPHA, /* U+000641: ARABIC LETTER FEH*/
-                                           RTUNI_ALPHA, /* U+000642: ARABIC LETTER QAF*/
-                                           RTUNI_ALPHA, /* U+000643: ARABIC LETTER KAF*/
-                                           RTUNI_ALPHA, /* U+000644: ARABIC LETTER LAM*/
-                                           RTUNI_ALPHA, /* U+000645: ARABIC LETTER MEEM*/
-                                           RTUNI_ALPHA, /* U+000646: ARABIC LETTER NOON*/
-                                           RTUNI_ALPHA, /* U+000647: ARABIC LETTER HEH*/
-                                           RTUNI_ALPHA, /* U+000648: ARABIC LETTER WAW*/
-                                           RTUNI_ALPHA, /* U+000649: ARABIC LETTER ALEF MAKSURA*/
-                                           RTUNI_ALPHA, /* U+00064a: ARABIC LETTER YEH*/
-                                           RTUNI_ALPHA, /* U+00064b: ARABIC FATHATAN*/
-                                           RTUNI_ALPHA, /* U+00064c: ARABIC DAMMATAN*/
-                                           RTUNI_ALPHA, /* U+00064d: ARABIC KASRATAN*/
-                                           RTUNI_ALPHA, /* U+00064e: ARABIC FATHA*/
-                                           RTUNI_ALPHA, /* U+00064f: ARABIC DAMMA*/
-                                           RTUNI_ALPHA, /* U+000650: ARABIC KASRA*/
-                                           RTUNI_ALPHA, /* U+000651: ARABIC SHADDA*/
-                                           RTUNI_ALPHA, /* U+000652: ARABIC SUKUN*/
-                                           RTUNI_ALPHA, /* U+000653: ARABIC MADDAH ABOVE*/
-                                           RTUNI_ALPHA, /* U+000654: ARABIC HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000655: ARABIC HAMZA BELOW*/
-                                           RTUNI_ALPHA, /* U+000656: ARABIC SUBSCRIPT ALEF*/
-                                           RTUNI_ALPHA, /* U+000657: ARABIC INVERTED DAMMA*/
-                                                     0, /* U+000658: ARABIC MARK NOON GHUNNA*/
-                                           RTUNI_ALPHA, /* U+000659: ARABIC ZWARAKAY*/
-                                           RTUNI_ALPHA, /* U+00065a: ARABIC VOWEL SIGN SMALL V ABOVE*/
-                                           RTUNI_ALPHA, /* U+00065b: ARABIC VOWEL SIGN INVERTED SMALL V ABOVE*/
-                                           RTUNI_ALPHA, /* U+00065c: ARABIC VOWEL SIGN DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+00065d: ARABIC REVERSED DAMMA*/
-                                           RTUNI_ALPHA, /* U+00065e: ARABIC FATHA WITH TWO DOTS*/
-                                                     0, /* U+00065f: */
-                                          RTUNI_DDIGIT, /* U+000660: ARABIC-INDIC DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000661: ARABIC-INDIC DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000662: ARABIC-INDIC DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000663: ARABIC-INDIC DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000664: ARABIC-INDIC DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000665: ARABIC-INDIC DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000666: ARABIC-INDIC DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000667: ARABIC-INDIC DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000668: ARABIC-INDIC DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000669: ARABIC-INDIC DIGIT NINE*/
-                                                     0, /* U+00066a: ARABIC PERCENT SIGN*/
-                                                     0, /* U+00066b: ARABIC DECIMAL SEPARATOR*/
-                                                     0, /* U+00066c: ARABIC THOUSANDS SEPARATOR*/
-                                                     0, /* U+00066d: ARABIC FIVE POINTED STAR*/
-                                           RTUNI_ALPHA, /* U+00066e: ARABIC LETTER DOTLESS BEH*/
-                                           RTUNI_ALPHA, /* U+00066f: ARABIC LETTER DOTLESS QAF*/
-                                           RTUNI_ALPHA, /* U+000670: ARABIC LETTER SUPERSCRIPT ALEF*/
-                                           RTUNI_ALPHA, /* U+000671: ARABIC LETTER ALEF WASLA*/
-                                           RTUNI_ALPHA, /* U+000672: ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000673: ARABIC LETTER ALEF WITH WAVY HAMZA BELOW*/
-                                           RTUNI_ALPHA, /* U+000674: ARABIC LETTER HIGH HAMZA*/
-                                           RTUNI_ALPHA, /* U+000675: ARABIC LETTER HIGH HAMZA ALEF*/
-                                           RTUNI_ALPHA, /* U+000676: ARABIC LETTER HIGH HAMZA WAW*/
-                                           RTUNI_ALPHA, /* U+000677: ARABIC LETTER U WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000678: ARABIC LETTER HIGH HAMZA YEH*/
-                                           RTUNI_ALPHA, /* U+000679: ARABIC LETTER TTEH*/
-                                           RTUNI_ALPHA, /* U+00067a: ARABIC LETTER TTEHEH*/
-                                           RTUNI_ALPHA, /* U+00067b: ARABIC LETTER BEEH*/
-                                           RTUNI_ALPHA, /* U+00067c: ARABIC LETTER TEH WITH RING*/
-                                           RTUNI_ALPHA, /* U+00067d: ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS*/
-                                           RTUNI_ALPHA, /* U+00067e: ARABIC LETTER PEH*/
-                                           RTUNI_ALPHA, /* U+00067f: ARABIC LETTER TEHEH*/
-                                           RTUNI_ALPHA, /* U+000680: ARABIC LETTER BEHEH*/
-                                           RTUNI_ALPHA, /* U+000681: ARABIC LETTER HAH WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000682: ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE*/
-                                           RTUNI_ALPHA, /* U+000683: ARABIC LETTER NYEH*/
-                                           RTUNI_ALPHA, /* U+000684: ARABIC LETTER DYEH*/
-                                           RTUNI_ALPHA, /* U+000685: ARABIC LETTER HAH WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000686: ARABIC LETTER TCHEH*/
-                                           RTUNI_ALPHA, /* U+000687: ARABIC LETTER TCHEHEH*/
-                                           RTUNI_ALPHA, /* U+000688: ARABIC LETTER DDAL*/
-                                           RTUNI_ALPHA, /* U+000689: ARABIC LETTER DAL WITH RING*/
-                                           RTUNI_ALPHA, /* U+00068a: ARABIC LETTER DAL WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+00068b: ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH*/
-                                           RTUNI_ALPHA, /* U+00068c: ARABIC LETTER DAHAL*/
-                                           RTUNI_ALPHA, /* U+00068d: ARABIC LETTER DDAHAL*/
-                                           RTUNI_ALPHA, /* U+00068e: ARABIC LETTER DUL*/
-                                           RTUNI_ALPHA, /* U+00068f: ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS*/
-                                           RTUNI_ALPHA, /* U+000690: ARABIC LETTER DAL WITH FOUR DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000691: ARABIC LETTER RREH*/
-                                           RTUNI_ALPHA, /* U+000692: ARABIC LETTER REH WITH SMALL V*/
-                                           RTUNI_ALPHA, /* U+000693: ARABIC LETTER REH WITH RING*/
-                                           RTUNI_ALPHA, /* U+000694: ARABIC LETTER REH WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+000695: ARABIC LETTER REH WITH SMALL V BELOW*/
-                                           RTUNI_ALPHA, /* U+000696: ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+000697: ARABIC LETTER REH WITH TWO DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000698: ARABIC LETTER JEH*/
-                                           RTUNI_ALPHA, /* U+000699: ARABIC LETTER REH WITH FOUR DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00069a: ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+00069b: ARABIC LETTER SEEN WITH THREE DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+00069c: ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00069d: ARABIC LETTER SAD WITH TWO DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+00069e: ARABIC LETTER SAD WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00069f: ARABIC LETTER TAH WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006a0: ARABIC LETTER AIN WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006a1: ARABIC LETTER DOTLESS FEH*/
-                                           RTUNI_ALPHA, /* U+0006a2: ARABIC LETTER FEH WITH DOT MOVED BELOW*/
-                                           RTUNI_ALPHA, /* U+0006a3: ARABIC LETTER FEH WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+0006a4: ARABIC LETTER VEH*/
-                                           RTUNI_ALPHA, /* U+0006a5: ARABIC LETTER FEH WITH THREE DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+0006a6: ARABIC LETTER PEHEH*/
-                                           RTUNI_ALPHA, /* U+0006a7: ARABIC LETTER QAF WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006a8: ARABIC LETTER QAF WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006a9: ARABIC LETTER KEHEH*/
-                                           RTUNI_ALPHA, /* U+0006aa: ARABIC LETTER SWASH KAF*/
-                                           RTUNI_ALPHA, /* U+0006ab: ARABIC LETTER KAF WITH RING*/
-                                           RTUNI_ALPHA, /* U+0006ac: ARABIC LETTER KAF WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006ad: ARABIC LETTER NG*/
-                                           RTUNI_ALPHA, /* U+0006ae: ARABIC LETTER KAF WITH THREE DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+0006af: ARABIC LETTER GAF*/
-                                           RTUNI_ALPHA, /* U+0006b0: ARABIC LETTER GAF WITH RING*/
-                                           RTUNI_ALPHA, /* U+0006b1: ARABIC LETTER NGOEH*/
-                                           RTUNI_ALPHA, /* U+0006b2: ARABIC LETTER GAF WITH TWO DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+0006b3: ARABIC LETTER GUEH*/
-                                           RTUNI_ALPHA, /* U+0006b4: ARABIC LETTER GAF WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006b5: ARABIC LETTER LAM WITH SMALL V*/
-                                           RTUNI_ALPHA, /* U+0006b6: ARABIC LETTER LAM WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006b7: ARABIC LETTER LAM WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006b8: ARABIC LETTER LAM WITH THREE DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+0006b9: ARABIC LETTER NOON WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+0006ba: ARABIC LETTER NOON GHUNNA*/
-                                           RTUNI_ALPHA, /* U+0006bb: ARABIC LETTER RNOON*/
-                                           RTUNI_ALPHA, /* U+0006bc: ARABIC LETTER NOON WITH RING*/
-                                           RTUNI_ALPHA, /* U+0006bd: ARABIC LETTER NOON WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006be: ARABIC LETTER HEH DOACHASHMEE*/
-                                           RTUNI_ALPHA, /* U+0006bf: ARABIC LETTER TCHEH WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006c0: ARABIC LETTER HEH WITH YEH ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006c1: ARABIC LETTER HEH GOAL*/
-                                           RTUNI_ALPHA, /* U+0006c2: ARABIC LETTER HEH GOAL WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006c3: ARABIC LETTER TEH MARBUTA GOAL*/
-                                           RTUNI_ALPHA, /* U+0006c4: ARABIC LETTER WAW WITH RING*/
-                                           RTUNI_ALPHA, /* U+0006c5: ARABIC LETTER KIRGHIZ OE*/
-                                           RTUNI_ALPHA, /* U+0006c6: ARABIC LETTER OE*/
-                                           RTUNI_ALPHA, /* U+0006c7: ARABIC LETTER U*/
-                                           RTUNI_ALPHA, /* U+0006c8: ARABIC LETTER YU*/
-                                           RTUNI_ALPHA, /* U+0006c9: ARABIC LETTER KIRGHIZ YU*/
-                                           RTUNI_ALPHA, /* U+0006ca: ARABIC LETTER WAW WITH TWO DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006cb: ARABIC LETTER VE*/
-                                           RTUNI_ALPHA, /* U+0006cc: ARABIC LETTER FARSI YEH*/
-                                           RTUNI_ALPHA, /* U+0006cd: ARABIC LETTER YEH WITH TAIL*/
-                                           RTUNI_ALPHA, /* U+0006ce: ARABIC LETTER YEH WITH SMALL V*/
-                                           RTUNI_ALPHA, /* U+0006cf: ARABIC LETTER WAW WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+0006d0: ARABIC LETTER E*/
-                                           RTUNI_ALPHA, /* U+0006d1: ARABIC LETTER YEH WITH THREE DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+0006d2: ARABIC LETTER YEH BARREE*/
-                                           RTUNI_ALPHA, /* U+0006d3: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE*/
-                                                     0, /* U+0006d4: ARABIC FULL STOP*/
-                                           RTUNI_ALPHA, /* U+0006d5: ARABIC LETTER AE*/
-                                           RTUNI_ALPHA, /* U+0006d6: ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA*/
-                                           RTUNI_ALPHA, /* U+0006d7: ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA*/
-                                           RTUNI_ALPHA, /* U+0006d8: ARABIC SMALL HIGH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+0006d9: ARABIC SMALL HIGH LAM ALEF*/
-                                           RTUNI_ALPHA, /* U+0006da: ARABIC SMALL HIGH JEEM*/
-                                           RTUNI_ALPHA, /* U+0006db: ARABIC SMALL HIGH THREE DOTS*/
-                                           RTUNI_ALPHA, /* U+0006dc: ARABIC SMALL HIGH SEEN*/
-                                                     0, /* U+0006dd: ARABIC END OF AYAH*/
-                                                     0, /* U+0006de: ARABIC START OF RUB EL HIZB*/
-                                                     0, /* U+0006df: ARABIC SMALL HIGH ROUNDED ZERO*/
-                                                     0, /* U+0006e0: ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO*/
-                                           RTUNI_ALPHA, /* U+0006e1: ARABIC SMALL HIGH DOTLESS HEAD OF KHAH*/
-                                           RTUNI_ALPHA, /* U+0006e2: ARABIC SMALL HIGH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+0006e3: ARABIC SMALL LOW SEEN*/
-                                           RTUNI_ALPHA, /* U+0006e4: ARABIC SMALL HIGH MADDA*/
-                                           RTUNI_ALPHA, /* U+0006e5: ARABIC SMALL WAW*/
-                                           RTUNI_ALPHA, /* U+0006e6: ARABIC SMALL YEH*/
-                                           RTUNI_ALPHA, /* U+0006e7: ARABIC SMALL HIGH YEH*/
-                                           RTUNI_ALPHA, /* U+0006e8: ARABIC SMALL HIGH NOON*/
-                                                     0, /* U+0006e9: ARABIC PLACE OF SAJDAH*/
-                                                     0, /* U+0006ea: ARABIC EMPTY CENTRE LOW STOP*/
-                                                     0, /* U+0006eb: ARABIC EMPTY CENTRE HIGH STOP*/
-                                                     0, /* U+0006ec: ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE*/
-                                           RTUNI_ALPHA, /* U+0006ed: ARABIC SMALL LOW MEEM*/
-                                           RTUNI_ALPHA, /* U+0006ee: ARABIC LETTER DAL WITH INVERTED V*/
-                                           RTUNI_ALPHA, /* U+0006ef: ARABIC LETTER REH WITH INVERTED V*/
-                                          RTUNI_DDIGIT, /* U+0006f0: EXTENDED ARABIC-INDIC DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+0006f1: EXTENDED ARABIC-INDIC DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+0006f2: EXTENDED ARABIC-INDIC DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+0006f3: EXTENDED ARABIC-INDIC DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+0006f4: EXTENDED ARABIC-INDIC DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+0006f5: EXTENDED ARABIC-INDIC DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+0006f6: EXTENDED ARABIC-INDIC DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+0006f7: EXTENDED ARABIC-INDIC DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+0006f8: EXTENDED ARABIC-INDIC DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+0006f9: EXTENDED ARABIC-INDIC DIGIT NINE*/
-                                           RTUNI_ALPHA, /* U+0006fa: ARABIC LETTER SHEEN WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+0006fb: ARABIC LETTER DAD WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+0006fc: ARABIC LETTER GHAIN WITH DOT BELOW*/
-                                                     0, /* U+0006fd: ARABIC SIGN SINDHI AMPERSAND*/
-                                                     0, /* U+0006fe: ARABIC SIGN SINDHI POSTPOSITION MEN*/
-                                           RTUNI_ALPHA, /* U+0006ff: ARABIC LETTER HEH WITH INVERTED V*/
-                                                     0, /* U+000700: SYRIAC END OF PARAGRAPH*/
-                                                     0, /* U+000701: SYRIAC SUPRALINEAR FULL STOP*/
-                                                     0, /* U+000702: SYRIAC SUBLINEAR FULL STOP*/
-                                                     0, /* U+000703: SYRIAC SUPRALINEAR COLON*/
-                                                     0, /* U+000704: SYRIAC SUBLINEAR COLON*/
-                                                     0, /* U+000705: SYRIAC HORIZONTAL COLON*/
-                                                     0, /* U+000706: SYRIAC COLON SKEWED LEFT*/
-                                                     0, /* U+000707: SYRIAC COLON SKEWED RIGHT*/
-                                                     0, /* U+000708: SYRIAC SUPRALINEAR COLON SKEWED LEFT*/
-                                                     0, /* U+000709: SYRIAC SUBLINEAR COLON SKEWED RIGHT*/
-                                                     0, /* U+00070a: SYRIAC CONTRACTION*/
-                                                     0, /* U+00070b: SYRIAC HARKLEAN OBELUS*/
-                                                     0, /* U+00070c: SYRIAC HARKLEAN METOBELUS*/
-                                                     0, /* U+00070d: SYRIAC HARKLEAN ASTERISCUS*/
-                                                     0, /* U+00070e: */
-                                                     0, /* U+00070f: SYRIAC ABBREVIATION MARK*/
-                                           RTUNI_ALPHA, /* U+000710: SYRIAC LETTER ALAPH*/
-                                           RTUNI_ALPHA, /* U+000711: SYRIAC LETTER SUPERSCRIPT ALAPH*/
-                                           RTUNI_ALPHA, /* U+000712: SYRIAC LETTER BETH*/
-                                           RTUNI_ALPHA, /* U+000713: SYRIAC LETTER GAMAL*/
-                                           RTUNI_ALPHA, /* U+000714: SYRIAC LETTER GAMAL GARSHUNI*/
-                                           RTUNI_ALPHA, /* U+000715: SYRIAC LETTER DALATH*/
-                                           RTUNI_ALPHA, /* U+000716: SYRIAC LETTER DOTLESS DALATH RISH*/
-                                           RTUNI_ALPHA, /* U+000717: SYRIAC LETTER HE*/
-                                           RTUNI_ALPHA, /* U+000718: SYRIAC LETTER WAW*/
-                                           RTUNI_ALPHA, /* U+000719: SYRIAC LETTER ZAIN*/
-                                           RTUNI_ALPHA, /* U+00071a: SYRIAC LETTER HETH*/
-                                           RTUNI_ALPHA, /* U+00071b: SYRIAC LETTER TETH*/
-                                           RTUNI_ALPHA, /* U+00071c: SYRIAC LETTER TETH GARSHUNI*/
-                                           RTUNI_ALPHA, /* U+00071d: SYRIAC LETTER YUDH*/
-                                           RTUNI_ALPHA, /* U+00071e: SYRIAC LETTER YUDH HE*/
-                                           RTUNI_ALPHA, /* U+00071f: SYRIAC LETTER KAPH*/
-                                           RTUNI_ALPHA, /* U+000720: SYRIAC LETTER LAMADH*/
-                                           RTUNI_ALPHA, /* U+000721: SYRIAC LETTER MIM*/
-                                           RTUNI_ALPHA, /* U+000722: SYRIAC LETTER NUN*/
-                                           RTUNI_ALPHA, /* U+000723: SYRIAC LETTER SEMKATH*/
-                                           RTUNI_ALPHA, /* U+000724: SYRIAC LETTER FINAL SEMKATH*/
-                                           RTUNI_ALPHA, /* U+000725: SYRIAC LETTER E*/
-                                           RTUNI_ALPHA, /* U+000726: SYRIAC LETTER PE*/
-                                           RTUNI_ALPHA, /* U+000727: SYRIAC LETTER REVERSED PE*/
-                                           RTUNI_ALPHA, /* U+000728: SYRIAC LETTER SADHE*/
-                                           RTUNI_ALPHA, /* U+000729: SYRIAC LETTER QAPH*/
-                                           RTUNI_ALPHA, /* U+00072a: SYRIAC LETTER RISH*/
-                                           RTUNI_ALPHA, /* U+00072b: SYRIAC LETTER SHIN*/
-                                           RTUNI_ALPHA, /* U+00072c: SYRIAC LETTER TAW*/
-                                           RTUNI_ALPHA, /* U+00072d: SYRIAC LETTER PERSIAN BHETH*/
-                                           RTUNI_ALPHA, /* U+00072e: SYRIAC LETTER PERSIAN GHAMAL*/
-                                           RTUNI_ALPHA, /* U+00072f: SYRIAC LETTER PERSIAN DHALATH*/
-                                           RTUNI_ALPHA, /* U+000730: SYRIAC PTHAHA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000731: SYRIAC PTHAHA BELOW*/
-                                           RTUNI_ALPHA, /* U+000732: SYRIAC PTHAHA DOTTED*/
-                                           RTUNI_ALPHA, /* U+000733: SYRIAC ZQAPHA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000734: SYRIAC ZQAPHA BELOW*/
-                                           RTUNI_ALPHA, /* U+000735: SYRIAC ZQAPHA DOTTED*/
-                                           RTUNI_ALPHA, /* U+000736: SYRIAC RBASA ABOVE*/
-                                           RTUNI_ALPHA, /* U+000737: SYRIAC RBASA BELOW*/
-                                           RTUNI_ALPHA, /* U+000738: SYRIAC DOTTED ZLAMA HORIZONTAL*/
-                                           RTUNI_ALPHA, /* U+000739: SYRIAC DOTTED ZLAMA ANGULAR*/
-                                           RTUNI_ALPHA, /* U+00073a: SYRIAC HBASA ABOVE*/
-                                           RTUNI_ALPHA, /* U+00073b: SYRIAC HBASA BELOW*/
-                                           RTUNI_ALPHA, /* U+00073c: SYRIAC HBASA-ESASA DOTTED*/
-                                           RTUNI_ALPHA, /* U+00073d: SYRIAC ESASA ABOVE*/
-                                           RTUNI_ALPHA, /* U+00073e: SYRIAC ESASA BELOW*/
-                                           RTUNI_ALPHA, /* U+00073f: SYRIAC RWAHA*/
-                                                     0, /* U+000740: SYRIAC FEMININE DOT*/
-                                                     0, /* U+000741: SYRIAC QUSHSHAYA*/
-                                                     0, /* U+000742: SYRIAC RUKKAKHA*/
-                                                     0, /* U+000743: SYRIAC TWO VERTICAL DOTS ABOVE*/
-                                                     0, /* U+000744: SYRIAC TWO VERTICAL DOTS BELOW*/
-                                                     0, /* U+000745: SYRIAC THREE DOTS ABOVE*/
-                                                     0, /* U+000746: SYRIAC THREE DOTS BELOW*/
-                                                     0, /* U+000747: SYRIAC OBLIQUE LINE ABOVE*/
-                                                     0, /* U+000748: SYRIAC OBLIQUE LINE BELOW*/
-                                                     0, /* U+000749: SYRIAC MUSIC*/
-                                                     0, /* U+00074a: SYRIAC BARREKH*/
-                                                     0, /* U+00074b: */
-                                                     0, /* U+00074c: */
-                                           RTUNI_ALPHA, /* U+00074d: SYRIAC LETTER SOGDIAN ZHAIN*/
-                                           RTUNI_ALPHA, /* U+00074e: SYRIAC LETTER SOGDIAN KHAPH*/
-                                           RTUNI_ALPHA, /* U+00074f: SYRIAC LETTER SOGDIAN FE*/
-                                           RTUNI_ALPHA, /* U+000750: ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW*/
-                                           RTUNI_ALPHA, /* U+000751: ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000752: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW*/
-                                           RTUNI_ALPHA, /* U+000753: ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000754: ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+000755: ARABIC LETTER BEH WITH INVERTED SMALL V BELOW*/
-                                           RTUNI_ALPHA, /* U+000756: ARABIC LETTER BEH WITH SMALL V*/
-                                           RTUNI_ALPHA, /* U+000757: ARABIC LETTER HAH WITH TWO DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000758: ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW*/
-                                           RTUNI_ALPHA, /* U+000759: ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH*/
-                                           RTUNI_ALPHA, /* U+00075a: ARABIC LETTER DAL WITH INVERTED SMALL V BELOW*/
-                                           RTUNI_ALPHA, /* U+00075b: ARABIC LETTER REH WITH STROKE*/
-                                           RTUNI_ALPHA, /* U+00075c: ARABIC LETTER SEEN WITH FOUR DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00075d: ARABIC LETTER AIN WITH TWO DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00075e: ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE*/
-                                           RTUNI_ALPHA, /* U+00075f: ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE*/
-                                           RTUNI_ALPHA, /* U+000760: ARABIC LETTER FEH WITH TWO DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+000761: ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW*/
-                                           RTUNI_ALPHA, /* U+000762: ARABIC LETTER KEHEH WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+000763: ARABIC LETTER KEHEH WITH THREE DOTS ABOVE*/
-                                           RTUNI_ALPHA, /* U+000764: ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW*/
-                                           RTUNI_ALPHA, /* U+000765: ARABIC LETTER MEEM WITH DOT ABOVE*/
-                                           RTUNI_ALPHA, /* U+000766: ARABIC LETTER MEEM WITH DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+000767: ARABIC LETTER NOON WITH TWO DOTS BELOW*/
-                                           RTUNI_ALPHA, /* U+000768: ARABIC LETTER NOON WITH SMALL TAH*/
-                                           RTUNI_ALPHA, /* U+000769: ARABIC LETTER NOON WITH SMALL V*/
-                                           RTUNI_ALPHA, /* U+00076a: ARABIC LETTER LAM WITH BAR*/
-                                           RTUNI_ALPHA, /* U+00076b: ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE*/
-                                           RTUNI_ALPHA, /* U+00076c: ARABIC LETTER REH WITH HAMZA ABOVE*/
-                                           RTUNI_ALPHA, /* U+00076d: ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE*/
-                                                     0, /* U+00076e: */
-                                                     0, /* U+00076f: */
-                                                     0, /* U+000770: */
-                                                     0, /* U+000771: */
-                                                     0, /* U+000772: */
-                                                     0, /* U+000773: */
-                                                     0, /* U+000774: */
-                                                     0, /* U+000775: */
-                                                     0, /* U+000776: */
-                                                     0, /* U+000777: */
-                                                     0, /* U+000778: */
-                                                     0, /* U+000779: */
-                                                     0, /* U+00077a: */
-                                                     0, /* U+00077b: */
-                                                     0, /* U+00077c: */
-                                                     0, /* U+00077d: */
-                                                     0, /* U+00077e: */
-                                                     0, /* U+00077f: */
-                                           RTUNI_ALPHA, /* U+000780: THAANA LETTER HAA*/
-                                           RTUNI_ALPHA, /* U+000781: THAANA LETTER SHAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000782: THAANA LETTER NOONU*/
-                                           RTUNI_ALPHA, /* U+000783: THAANA LETTER RAA*/
-                                           RTUNI_ALPHA, /* U+000784: THAANA LETTER BAA*/
-                                           RTUNI_ALPHA, /* U+000785: THAANA LETTER LHAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000786: THAANA LETTER KAAFU*/
-                                           RTUNI_ALPHA, /* U+000787: THAANA LETTER ALIFU*/
-                                           RTUNI_ALPHA, /* U+000788: THAANA LETTER VAAVU*/
-                                           RTUNI_ALPHA, /* U+000789: THAANA LETTER MEEMU*/
-                                           RTUNI_ALPHA, /* U+00078a: THAANA LETTER FAAFU*/
-                                           RTUNI_ALPHA, /* U+00078b: THAANA LETTER DHAALU*/
-                                           RTUNI_ALPHA, /* U+00078c: THAANA LETTER THAA*/
-                                           RTUNI_ALPHA, /* U+00078d: THAANA LETTER LAAMU*/
-                                           RTUNI_ALPHA, /* U+00078e: THAANA LETTER GAAFU*/
-                                           RTUNI_ALPHA, /* U+00078f: THAANA LETTER GNAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000790: THAANA LETTER SEENU*/
-                                           RTUNI_ALPHA, /* U+000791: THAANA LETTER DAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000792: THAANA LETTER ZAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000793: THAANA LETTER TAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000794: THAANA LETTER YAA*/
-                                           RTUNI_ALPHA, /* U+000795: THAANA LETTER PAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000796: THAANA LETTER JAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000797: THAANA LETTER CHAVIYANI*/
-                                           RTUNI_ALPHA, /* U+000798: THAANA LETTER TTAA*/
-                                           RTUNI_ALPHA, /* U+000799: THAANA LETTER HHAA*/
-                                           RTUNI_ALPHA, /* U+00079a: THAANA LETTER KHAA*/
-                                           RTUNI_ALPHA, /* U+00079b: THAANA LETTER THAALU*/
-                                           RTUNI_ALPHA, /* U+00079c: THAANA LETTER ZAA*/
-                                           RTUNI_ALPHA, /* U+00079d: THAANA LETTER SHEENU*/
-                                           RTUNI_ALPHA, /* U+00079e: THAANA LETTER SAADHU*/
-                                           RTUNI_ALPHA, /* U+00079f: THAANA LETTER DAADHU*/
-                                           RTUNI_ALPHA, /* U+0007a0: THAANA LETTER TO*/
-                                           RTUNI_ALPHA, /* U+0007a1: THAANA LETTER ZO*/
-                                           RTUNI_ALPHA, /* U+0007a2: THAANA LETTER AINU*/
-                                           RTUNI_ALPHA, /* U+0007a3: THAANA LETTER GHAINU*/
-                                           RTUNI_ALPHA, /* U+0007a4: THAANA LETTER QAAFU*/
-                                           RTUNI_ALPHA, /* U+0007a5: THAANA LETTER WAAVU*/
-                                           RTUNI_ALPHA, /* U+0007a6: THAANA ABAFILI*/
-                                           RTUNI_ALPHA, /* U+0007a7: THAANA AABAAFILI*/
-                                           RTUNI_ALPHA, /* U+0007a8: THAANA IBIFILI*/
-                                           RTUNI_ALPHA, /* U+0007a9: THAANA EEBEEFILI*/
-                                           RTUNI_ALPHA, /* U+0007aa: THAANA UBUFILI*/
-                                           RTUNI_ALPHA, /* U+0007ab: THAANA OOBOOFILI*/
-                                           RTUNI_ALPHA, /* U+0007ac: THAANA EBEFILI*/
-                                           RTUNI_ALPHA, /* U+0007ad: THAANA EYBEYFILI*/
-                                           RTUNI_ALPHA, /* U+0007ae: THAANA OBOFILI*/
-                                           RTUNI_ALPHA, /* U+0007af: THAANA OABOAFILI*/
-                                           RTUNI_ALPHA, /* U+0007b0: THAANA SUKUN*/
-                                           RTUNI_ALPHA, /* U+0007b1: THAANA LETTER NAA*/
-                                                     0, /* U+0007b2: */
-                                                     0, /* U+0007b3: */
-                                                     0, /* U+0007b4: */
-                                                     0, /* U+0007b5: */
-                                                     0, /* U+0007b6: */
-                                                     0, /* U+0007b7: */
-                                                     0, /* U+0007b8: */
-                                                     0, /* U+0007b9: */
-                                                     0, /* U+0007ba: */
-                                                     0, /* U+0007bb: */
-                                                     0, /* U+0007bc: */
-                                                     0, /* U+0007bd: */
-                                                     0, /* U+0007be: */
-                                                     0, /* U+0007bf: */
-                                                     0, /* U+0007c0: */
-                                                     0, /* U+0007c1: */
-                                                     0, /* U+0007c2: */
-                                                     0, /* U+0007c3: */
-                                                     0, /* U+0007c4: */
-                                                     0, /* U+0007c5: */
-                                                     0, /* U+0007c6: */
-                                                     0, /* U+0007c7: */
-                                                     0, /* U+0007c8: */
-                                                     0, /* U+0007c9: */
-                                                     0, /* U+0007ca: */
-                                                     0, /* U+0007cb: */
-                                                     0, /* U+0007cc: */
-                                                     0, /* U+0007cd: */
-                                                     0, /* U+0007ce: */
-                                                     0, /* U+0007cf: */
-                                                     0, /* U+0007d0: */
-                                                     0, /* U+0007d1: */
-                                                     0, /* U+0007d2: */
-                                                     0, /* U+0007d3: */
-                                                     0, /* U+0007d4: */
-                                                     0, /* U+0007d5: */
-                                                     0, /* U+0007d6: */
-                                                     0, /* U+0007d7: */
-                                                     0, /* U+0007d8: */
-                                                     0, /* U+0007d9: */
-                                                     0, /* U+0007da: */
-                                                     0, /* U+0007db: */
-                                                     0, /* U+0007dc: */
-                                                     0, /* U+0007dd: */
-                                                     0, /* U+0007de: */
-                                                     0, /* U+0007df: */
-                                                     0, /* U+0007e0: */
-                                                     0, /* U+0007e1: */
-                                                     0, /* U+0007e2: */
-                                                     0, /* U+0007e3: */
-                                                     0, /* U+0007e4: */
-                                                     0, /* U+0007e5: */
-                                                     0, /* U+0007e6: */
-                                                     0, /* U+0007e7: */
-                                                     0, /* U+0007e8: */
-                                                     0, /* U+0007e9: */
-                                                     0, /* U+0007ea: */
-                                                     0, /* U+0007eb: */
-                                                     0, /* U+0007ec: */
-                                                     0, /* U+0007ed: */
-                                                     0, /* U+0007ee: */
-                                                     0, /* U+0007ef: */
-                                                     0, /* U+0007f0: */
-                                                     0, /* U+0007f1: */
-                                                     0, /* U+0007f2: */
-                                                     0, /* U+0007f3: */
-                                                     0, /* U+0007f4: */
-                                                     0, /* U+0007f5: */
-                                                     0, /* U+0007f6: */
-                                                     0, /* U+0007f7: */
-                                                     0, /* U+0007f8: */
-                                                     0, /* U+0007f9: */
-                                                     0, /* U+0007fa: */
-                                                     0, /* U+0007fb: */
-                                                     0, /* U+0007fc: */
-                                                     0, /* U+0007fd: */
-                                                     0, /* U+0007fe: */
-                                                     0, /* U+0007ff: */
-                                                     0, /* U+000800: */
-                                                     0, /* U+000801: */
-                                                     0, /* U+000802: */
-                                                     0, /* U+000803: */
-                                                     0, /* U+000804: */
-                                                     0, /* U+000805: */
-                                                     0, /* U+000806: */
-                                                     0, /* U+000807: */
-                                                     0, /* U+000808: */
-                                                     0, /* U+000809: */
-                                                     0, /* U+00080a: */
-                                                     0, /* U+00080b: */
-                                                     0, /* U+00080c: */
-                                                     0, /* U+00080d: */
-                                                     0, /* U+00080e: */
-                                                     0, /* U+00080f: */
-                                                     0, /* U+000810: */
-                                                     0, /* U+000811: */
-                                                     0, /* U+000812: */
-                                                     0, /* U+000813: */
-                                                     0, /* U+000814: */
-                                                     0, /* U+000815: */
-                                                     0, /* U+000816: */
-                                                     0, /* U+000817: */
-                                                     0, /* U+000818: */
-                                                     0, /* U+000819: */
-                                                     0, /* U+00081a: */
-                                                     0, /* U+00081b: */
-                                                     0, /* U+00081c: */
-                                                     0, /* U+00081d: */
-                                                     0, /* U+00081e: */
-                                                     0, /* U+00081f: */
-                                                     0, /* U+000820: */
-                                                     0, /* U+000821: */
-                                                     0, /* U+000822: */
-                                                     0, /* U+000823: */
-                                                     0, /* U+000824: */
-                                                     0, /* U+000825: */
-                                                     0, /* U+000826: */
-                                                     0, /* U+000827: */
-                                                     0, /* U+000828: */
-                                                     0, /* U+000829: */
-                                                     0, /* U+00082a: */
-                                                     0, /* U+00082b: */
-                                                     0, /* U+00082c: */
-                                                     0, /* U+00082d: */
-                                                     0, /* U+00082e: */
-                                                     0, /* U+00082f: */
-                                                     0, /* U+000830: */
-                                                     0, /* U+000831: */
-                                                     0, /* U+000832: */
-                                                     0, /* U+000833: */
-                                                     0, /* U+000834: */
-                                                     0, /* U+000835: */
-                                                     0, /* U+000836: */
-                                                     0, /* U+000837: */
-                                                     0, /* U+000838: */
-                                                     0, /* U+000839: */
-                                                     0, /* U+00083a: */
-                                                     0, /* U+00083b: */
-                                                     0, /* U+00083c: */
-                                                     0, /* U+00083d: */
-                                                     0, /* U+00083e: */
-                                                     0, /* U+00083f: */
-                                                     0, /* U+000840: */
-                                                     0, /* U+000841: */
-                                                     0, /* U+000842: */
-                                                     0, /* U+000843: */
-                                                     0, /* U+000844: */
-                                                     0, /* U+000845: */
-                                                     0, /* U+000846: */
-                                                     0, /* U+000847: */
-                                                     0, /* U+000848: */
-                                                     0, /* U+000849: */
-                                                     0, /* U+00084a: */
-                                                     0, /* U+00084b: */
-                                                     0, /* U+00084c: */
-                                                     0, /* U+00084d: */
-                                                     0, /* U+00084e: */
-                                                     0, /* U+00084f: */
-                                                     0, /* U+000850: */
-                                                     0, /* U+000851: */
-                                                     0, /* U+000852: */
-                                                     0, /* U+000853: */
-                                                     0, /* U+000854: */
-                                                     0, /* U+000855: */
-                                                     0, /* U+000856: */
-                                                     0, /* U+000857: */
-                                                     0, /* U+000858: */
-                                                     0, /* U+000859: */
-                                                     0, /* U+00085a: */
-                                                     0, /* U+00085b: */
-                                                     0, /* U+00085c: */
-                                                     0, /* U+00085d: */
-                                                     0, /* U+00085e: */
-                                                     0, /* U+00085f: */
-                                                     0, /* U+000860: */
-                                                     0, /* U+000861: */
-                                                     0, /* U+000862: */
-                                                     0, /* U+000863: */
-                                                     0, /* U+000864: */
-                                                     0, /* U+000865: */
-                                                     0, /* U+000866: */
-                                                     0, /* U+000867: */
-                                                     0, /* U+000868: */
-                                                     0, /* U+000869: */
-                                                     0, /* U+00086a: */
-                                                     0, /* U+00086b: */
-                                                     0, /* U+00086c: */
-                                                     0, /* U+00086d: */
-                                                     0, /* U+00086e: */
-                                                     0, /* U+00086f: */
-                                                     0, /* U+000870: */
-                                                     0, /* U+000871: */
-                                                     0, /* U+000872: */
-                                                     0, /* U+000873: */
-                                                     0, /* U+000874: */
-                                                     0, /* U+000875: */
-                                                     0, /* U+000876: */
-                                                     0, /* U+000877: */
-                                                     0, /* U+000878: */
-                                                     0, /* U+000879: */
-                                                     0, /* U+00087a: */
-                                                     0, /* U+00087b: */
-                                                     0, /* U+00087c: */
-                                                     0, /* U+00087d: */
-                                                     0, /* U+00087e: */
-                                                     0, /* U+00087f: */
-                                                     0, /* U+000880: */
-                                                     0, /* U+000881: */
-                                                     0, /* U+000882: */
-                                                     0, /* U+000883: */
-                                                     0, /* U+000884: */
-                                                     0, /* U+000885: */
-                                                     0, /* U+000886: */
-                                                     0, /* U+000887: */
-                                                     0, /* U+000888: */
-                                                     0, /* U+000889: */
-                                                     0, /* U+00088a: */
-                                                     0, /* U+00088b: */
-                                                     0, /* U+00088c: */
-                                                     0, /* U+00088d: */
-                                                     0, /* U+00088e: */
-                                                     0, /* U+00088f: */
-                                                     0, /* U+000890: */
-                                                     0, /* U+000891: */
-                                                     0, /* U+000892: */
-                                                     0, /* U+000893: */
-                                                     0, /* U+000894: */
-                                                     0, /* U+000895: */
-                                                     0, /* U+000896: */
-                                                     0, /* U+000897: */
-                                                     0, /* U+000898: */
-                                                     0, /* U+000899: */
-                                                     0, /* U+00089a: */
-                                                     0, /* U+00089b: */
-                                                     0, /* U+00089c: */
-                                                     0, /* U+00089d: */
-                                                     0, /* U+00089e: */
-                                                     0, /* U+00089f: */
-                                                     0, /* U+0008a0: */
-                                                     0, /* U+0008a1: */
-                                                     0, /* U+0008a2: */
-                                                     0, /* U+0008a3: */
-                                                     0, /* U+0008a4: */
-                                                     0, /* U+0008a5: */
-                                                     0, /* U+0008a6: */
-                                                     0, /* U+0008a7: */
-                                                     0, /* U+0008a8: */
-                                                     0, /* U+0008a9: */
-                                                     0, /* U+0008aa: */
-                                                     0, /* U+0008ab: */
-                                                     0, /* U+0008ac: */
-                                                     0, /* U+0008ad: */
-                                                     0, /* U+0008ae: */
-                                                     0, /* U+0008af: */
-                                                     0, /* U+0008b0: */
-                                                     0, /* U+0008b1: */
-                                                     0, /* U+0008b2: */
-                                                     0, /* U+0008b3: */
-                                                     0, /* U+0008b4: */
-                                                     0, /* U+0008b5: */
-                                                     0, /* U+0008b6: */
-                                                     0, /* U+0008b7: */
-                                                     0, /* U+0008b8: */
-                                                     0, /* U+0008b9: */
-                                                     0, /* U+0008ba: */
-                                                     0, /* U+0008bb: */
-                                                     0, /* U+0008bc: */
-                                                     0, /* U+0008bd: */
-                                                     0, /* U+0008be: */
-                                                     0, /* U+0008bf: */
-                                                     0, /* U+0008c0: */
-                                                     0, /* U+0008c1: */
-                                                     0, /* U+0008c2: */
-                                                     0, /* U+0008c3: */
-                                                     0, /* U+0008c4: */
-                                                     0, /* U+0008c5: */
-                                                     0, /* U+0008c6: */
-                                                     0, /* U+0008c7: */
-                                                     0, /* U+0008c8: */
-                                                     0, /* U+0008c9: */
-                                                     0, /* U+0008ca: */
-                                                     0, /* U+0008cb: */
-                                                     0, /* U+0008cc: */
-                                                     0, /* U+0008cd: */
-                                                     0, /* U+0008ce: */
-                                                     0, /* U+0008cf: */
-                                                     0, /* U+0008d0: */
-                                                     0, /* U+0008d1: */
-                                                     0, /* U+0008d2: */
-                                                     0, /* U+0008d3: */
-                                                     0, /* U+0008d4: */
-                                                     0, /* U+0008d5: */
-                                                     0, /* U+0008d6: */
-                                                     0, /* U+0008d7: */
-                                                     0, /* U+0008d8: */
-                                                     0, /* U+0008d9: */
-                                                     0, /* U+0008da: */
-                                                     0, /* U+0008db: */
-                                                     0, /* U+0008dc: */
-                                                     0, /* U+0008dd: */
-                                                     0, /* U+0008de: */
-                                                     0, /* U+0008df: */
-                                                     0, /* U+0008e0: */
-                                                     0, /* U+0008e1: */
-                                                     0, /* U+0008e2: */
-                                                     0, /* U+0008e3: */
-                                                     0, /* U+0008e4: */
-                                                     0, /* U+0008e5: */
-                                                     0, /* U+0008e6: */
-                                                     0, /* U+0008e7: */
-                                                     0, /* U+0008e8: */
-                                                     0, /* U+0008e9: */
-                                                     0, /* U+0008ea: */
-                                                     0, /* U+0008eb: */
-                                                     0, /* U+0008ec: */
-                                                     0, /* U+0008ed: */
-                                                     0, /* U+0008ee: */
-                                                     0, /* U+0008ef: */
-                                                     0, /* U+0008f0: */
-                                                     0, /* U+0008f1: */
-                                                     0, /* U+0008f2: */
-                                                     0, /* U+0008f3: */
-                                                     0, /* U+0008f4: */
-                                                     0, /* U+0008f5: */
-                                                     0, /* U+0008f6: */
-                                                     0, /* U+0008f7: */
-                                                     0, /* U+0008f8: */
-                                                     0, /* U+0008f9: */
-                                                     0, /* U+0008fa: */
-                                                     0, /* U+0008fb: */
-                                                     0, /* U+0008fc: */
-                                                     0, /* U+0008fd: */
-                                                     0, /* U+0008fe: */
-                                                     0, /* U+0008ff: */
-                                                     0, /* U+000900: */
-                                           RTUNI_ALPHA, /* U+000901: DEVANAGARI SIGN CANDRABINDU*/
-                                           RTUNI_ALPHA, /* U+000902: DEVANAGARI SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000903: DEVANAGARI SIGN VISARGA*/
-                                           RTUNI_ALPHA, /* U+000904: DEVANAGARI LETTER SHORT A*/
-                                           RTUNI_ALPHA, /* U+000905: DEVANAGARI LETTER A*/
-                                           RTUNI_ALPHA, /* U+000906: DEVANAGARI LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000907: DEVANAGARI LETTER I*/
-                                           RTUNI_ALPHA, /* U+000908: DEVANAGARI LETTER II*/
-                                           RTUNI_ALPHA, /* U+000909: DEVANAGARI LETTER U*/
-                                           RTUNI_ALPHA, /* U+00090a: DEVANAGARI LETTER UU*/
-                                           RTUNI_ALPHA, /* U+00090b: DEVANAGARI LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+00090c: DEVANAGARI LETTER VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+00090d: DEVANAGARI LETTER CANDRA E*/
-                                           RTUNI_ALPHA, /* U+00090e: DEVANAGARI LETTER SHORT E*/
-                                           RTUNI_ALPHA, /* U+00090f: DEVANAGARI LETTER E*/
-                                           RTUNI_ALPHA, /* U+000910: DEVANAGARI LETTER AI*/
-                                           RTUNI_ALPHA, /* U+000911: DEVANAGARI LETTER CANDRA O*/
-                                           RTUNI_ALPHA, /* U+000912: DEVANAGARI LETTER SHORT O*/
-                                           RTUNI_ALPHA, /* U+000913: DEVANAGARI LETTER O*/
-                                           RTUNI_ALPHA, /* U+000914: DEVANAGARI LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000915: DEVANAGARI LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000916: DEVANAGARI LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000917: DEVANAGARI LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000918: DEVANAGARI LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000919: DEVANAGARI LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+00091a: DEVANAGARI LETTER CA*/
-                                           RTUNI_ALPHA, /* U+00091b: DEVANAGARI LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+00091c: DEVANAGARI LETTER JA*/
-                                           RTUNI_ALPHA, /* U+00091d: DEVANAGARI LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+00091e: DEVANAGARI LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+00091f: DEVANAGARI LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000920: DEVANAGARI LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000921: DEVANAGARI LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000922: DEVANAGARI LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000923: DEVANAGARI LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000924: DEVANAGARI LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000925: DEVANAGARI LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000926: DEVANAGARI LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000927: DEVANAGARI LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000928: DEVANAGARI LETTER NA*/
-                                           RTUNI_ALPHA, /* U+000929: DEVANAGARI LETTER NNNA*/
-                                           RTUNI_ALPHA, /* U+00092a: DEVANAGARI LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00092b: DEVANAGARI LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+00092c: DEVANAGARI LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00092d: DEVANAGARI LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+00092e: DEVANAGARI LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00092f: DEVANAGARI LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000930: DEVANAGARI LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000931: DEVANAGARI LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000932: DEVANAGARI LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000933: DEVANAGARI LETTER LLA*/
-                                           RTUNI_ALPHA, /* U+000934: DEVANAGARI LETTER LLLA*/
-                                           RTUNI_ALPHA, /* U+000935: DEVANAGARI LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000936: DEVANAGARI LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000937: DEVANAGARI LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000938: DEVANAGARI LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000939: DEVANAGARI LETTER HA*/
-                                                     0, /* U+00093a: */
-                                                     0, /* U+00093b: */
-                                                     0, /* U+00093c: DEVANAGARI SIGN NUKTA*/
-                                           RTUNI_ALPHA, /* U+00093d: DEVANAGARI SIGN AVAGRAHA*/
-                                           RTUNI_ALPHA, /* U+00093e: DEVANAGARI VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+00093f: DEVANAGARI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000940: DEVANAGARI VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000941: DEVANAGARI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000942: DEVANAGARI VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000943: DEVANAGARI VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000944: DEVANAGARI VOWEL SIGN VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000945: DEVANAGARI VOWEL SIGN CANDRA E*/
-                                           RTUNI_ALPHA, /* U+000946: DEVANAGARI VOWEL SIGN SHORT E*/
-                                           RTUNI_ALPHA, /* U+000947: DEVANAGARI VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000948: DEVANAGARI VOWEL SIGN AI*/
-                                           RTUNI_ALPHA, /* U+000949: DEVANAGARI VOWEL SIGN CANDRA O*/
-                                           RTUNI_ALPHA, /* U+00094a: DEVANAGARI VOWEL SIGN SHORT O*/
-                                           RTUNI_ALPHA, /* U+00094b: DEVANAGARI VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+00094c: DEVANAGARI VOWEL SIGN AU*/
-                                                     0, /* U+00094d: DEVANAGARI SIGN VIRAMA*/
-                                                     0, /* U+00094e: */
-                                                     0, /* U+00094f: */
-                                           RTUNI_ALPHA, /* U+000950: DEVANAGARI OM*/
-                                                     0, /* U+000951: DEVANAGARI STRESS SIGN UDATTA*/
-                                                     0, /* U+000952: DEVANAGARI STRESS SIGN ANUDATTA*/
-                                                     0, /* U+000953: DEVANAGARI GRAVE ACCENT*/
-                                                     0, /* U+000954: DEVANAGARI ACUTE ACCENT*/
-                                                     0, /* U+000955: */
-                                                     0, /* U+000956: */
-                                                     0, /* U+000957: */
-                                           RTUNI_ALPHA, /* U+000958: DEVANAGARI LETTER QA*/
-                                           RTUNI_ALPHA, /* U+000959: DEVANAGARI LETTER KHHA*/
-                                           RTUNI_ALPHA, /* U+00095a: DEVANAGARI LETTER GHHA*/
-                                           RTUNI_ALPHA, /* U+00095b: DEVANAGARI LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+00095c: DEVANAGARI LETTER DDDHA*/
-                                           RTUNI_ALPHA, /* U+00095d: DEVANAGARI LETTER RHA*/
-                                           RTUNI_ALPHA, /* U+00095e: DEVANAGARI LETTER FA*/
-                                           RTUNI_ALPHA, /* U+00095f: DEVANAGARI LETTER YYA*/
-                                           RTUNI_ALPHA, /* U+000960: DEVANAGARI LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000961: DEVANAGARI LETTER VOCALIC LL*/
-                                           RTUNI_ALPHA, /* U+000962: DEVANAGARI VOWEL SIGN VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+000963: DEVANAGARI VOWEL SIGN VOCALIC LL*/
-                                                     0, /* U+000964: DEVANAGARI DANDA*/
-                                                     0, /* U+000965: DEVANAGARI DOUBLE DANDA*/
-                                          RTUNI_DDIGIT, /* U+000966: DEVANAGARI DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000967: DEVANAGARI DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000968: DEVANAGARI DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000969: DEVANAGARI DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+00096a: DEVANAGARI DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+00096b: DEVANAGARI DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+00096c: DEVANAGARI DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+00096d: DEVANAGARI DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+00096e: DEVANAGARI DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+00096f: DEVANAGARI DIGIT NINE*/
-                                                     0, /* U+000970: DEVANAGARI ABBREVIATION SIGN*/
-                                                     0, /* U+000971: */
-                                                     0, /* U+000972: */
-                                                     0, /* U+000973: */
-                                                     0, /* U+000974: */
-                                                     0, /* U+000975: */
-                                                     0, /* U+000976: */
-                                                     0, /* U+000977: */
-                                                     0, /* U+000978: */
-                                                     0, /* U+000979: */
-                                                     0, /* U+00097a: */
-                                                     0, /* U+00097b: */
-                                                     0, /* U+00097c: */
-                                           RTUNI_ALPHA, /* U+00097d: DEVANAGARI LETTER GLOTTAL STOP*/
-                                                     0, /* U+00097e: */
-                                                     0, /* U+00097f: */
-                                                     0, /* U+000980: */
-                                           RTUNI_ALPHA, /* U+000981: BENGALI SIGN CANDRABINDU*/
-                                           RTUNI_ALPHA, /* U+000982: BENGALI SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000983: BENGALI SIGN VISARGA*/
-                                                     0, /* U+000984: */
-                                           RTUNI_ALPHA, /* U+000985: BENGALI LETTER A*/
-                                           RTUNI_ALPHA, /* U+000986: BENGALI LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000987: BENGALI LETTER I*/
-                                           RTUNI_ALPHA, /* U+000988: BENGALI LETTER II*/
-                                           RTUNI_ALPHA, /* U+000989: BENGALI LETTER U*/
-                                           RTUNI_ALPHA, /* U+00098a: BENGALI LETTER UU*/
-                                           RTUNI_ALPHA, /* U+00098b: BENGALI LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+00098c: BENGALI LETTER VOCALIC L*/
-                                                     0, /* U+00098d: */
-                                                     0, /* U+00098e: */
-                                           RTUNI_ALPHA, /* U+00098f: BENGALI LETTER E*/
-                                           RTUNI_ALPHA, /* U+000990: BENGALI LETTER AI*/
-                                                     0, /* U+000991: */
-                                                     0, /* U+000992: */
-                                           RTUNI_ALPHA, /* U+000993: BENGALI LETTER O*/
-                                           RTUNI_ALPHA, /* U+000994: BENGALI LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000995: BENGALI LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000996: BENGALI LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000997: BENGALI LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000998: BENGALI LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000999: BENGALI LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+00099a: BENGALI LETTER CA*/
-                                           RTUNI_ALPHA, /* U+00099b: BENGALI LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+00099c: BENGALI LETTER JA*/
-                                           RTUNI_ALPHA, /* U+00099d: BENGALI LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+00099e: BENGALI LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+00099f: BENGALI LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+0009a0: BENGALI LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+0009a1: BENGALI LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+0009a2: BENGALI LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+0009a3: BENGALI LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+0009a4: BENGALI LETTER TA*/
-                                           RTUNI_ALPHA, /* U+0009a5: BENGALI LETTER THA*/
-                                           RTUNI_ALPHA, /* U+0009a6: BENGALI LETTER DA*/
-                                           RTUNI_ALPHA, /* U+0009a7: BENGALI LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+0009a8: BENGALI LETTER NA*/
-                                                     0, /* U+0009a9: */
-                                           RTUNI_ALPHA, /* U+0009aa: BENGALI LETTER PA*/
-                                           RTUNI_ALPHA, /* U+0009ab: BENGALI LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+0009ac: BENGALI LETTER BA*/
-                                           RTUNI_ALPHA, /* U+0009ad: BENGALI LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+0009ae: BENGALI LETTER MA*/
-                                           RTUNI_ALPHA, /* U+0009af: BENGALI LETTER YA*/
-                                           RTUNI_ALPHA, /* U+0009b0: BENGALI LETTER RA*/
-                                                     0, /* U+0009b1: */
-                                           RTUNI_ALPHA, /* U+0009b2: BENGALI LETTER LA*/
-                                                     0, /* U+0009b3: */
-                                                     0, /* U+0009b4: */
-                                                     0, /* U+0009b5: */
-                                           RTUNI_ALPHA, /* U+0009b6: BENGALI LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+0009b7: BENGALI LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+0009b8: BENGALI LETTER SA*/
-                                           RTUNI_ALPHA, /* U+0009b9: BENGALI LETTER HA*/
-                                                     0, /* U+0009ba: */
-                                                     0, /* U+0009bb: */
-                                                     0, /* U+0009bc: BENGALI SIGN NUKTA*/
-                                           RTUNI_ALPHA, /* U+0009bd: BENGALI SIGN AVAGRAHA*/
-                                           RTUNI_ALPHA, /* U+0009be: BENGALI VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+0009bf: BENGALI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+0009c0: BENGALI VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+0009c1: BENGALI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+0009c2: BENGALI VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+0009c3: BENGALI VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+0009c4: BENGALI VOWEL SIGN VOCALIC RR*/
-                                                     0, /* U+0009c5: */
-                                                     0, /* U+0009c6: */
-                                           RTUNI_ALPHA, /* U+0009c7: BENGALI VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+0009c8: BENGALI VOWEL SIGN AI*/
-                                                     0, /* U+0009c9: */
-                                                     0, /* U+0009ca: */
-                                           RTUNI_ALPHA, /* U+0009cb: BENGALI VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+0009cc: BENGALI VOWEL SIGN AU*/
-                                                     0, /* U+0009cd: BENGALI SIGN VIRAMA*/
-                                           RTUNI_ALPHA, /* U+0009ce: BENGALI LETTER KHANDA TA*/
-                                                     0, /* U+0009cf: */
-                                                     0, /* U+0009d0: */
-                                                     0, /* U+0009d1: */
-                                                     0, /* U+0009d2: */
-                                                     0, /* U+0009d3: */
-                                                     0, /* U+0009d4: */
-                                                     0, /* U+0009d5: */
-                                                     0, /* U+0009d6: */
-                                           RTUNI_ALPHA, /* U+0009d7: BENGALI AU LENGTH MARK*/
-                                                     0, /* U+0009d8: */
-                                                     0, /* U+0009d9: */
-                                                     0, /* U+0009da: */
-                                                     0, /* U+0009db: */
-                                           RTUNI_ALPHA, /* U+0009dc: BENGALI LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+0009dd: BENGALI LETTER RHA*/
-                                                     0, /* U+0009de: */
-                                           RTUNI_ALPHA, /* U+0009df: BENGALI LETTER YYA*/
-                                           RTUNI_ALPHA, /* U+0009e0: BENGALI LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+0009e1: BENGALI LETTER VOCALIC LL*/
-                                           RTUNI_ALPHA, /* U+0009e2: BENGALI VOWEL SIGN VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+0009e3: BENGALI VOWEL SIGN VOCALIC LL*/
-                                                     0, /* U+0009e4: */
-                                                     0, /* U+0009e5: */
-                                          RTUNI_DDIGIT, /* U+0009e6: BENGALI DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+0009e7: BENGALI DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+0009e8: BENGALI DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+0009e9: BENGALI DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+0009ea: BENGALI DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+0009eb: BENGALI DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+0009ec: BENGALI DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+0009ed: BENGALI DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+0009ee: BENGALI DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+0009ef: BENGALI DIGIT NINE*/
-                                           RTUNI_ALPHA, /* U+0009f0: BENGALI LETTER RA WITH MIDDLE DIAGONAL*/
-                                           RTUNI_ALPHA, /* U+0009f1: BENGALI LETTER RA WITH LOWER DIAGONAL*/
-                                                     0, /* U+0009f2: BENGALI RUPEE MARK*/
-                                                     0, /* U+0009f3: BENGALI RUPEE SIGN*/
-                                                     0, /* U+0009f4: BENGALI CURRENCY NUMERATOR ONE*/
-                                                     0, /* U+0009f5: BENGALI CURRENCY NUMERATOR TWO*/
-                                                     0, /* U+0009f6: BENGALI CURRENCY NUMERATOR THREE*/
-                                                     0, /* U+0009f7: BENGALI CURRENCY NUMERATOR FOUR*/
-                                                     0, /* U+0009f8: BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR*/
-                                                     0, /* U+0009f9: BENGALI CURRENCY DENOMINATOR SIXTEEN*/
-                                                     0, /* U+0009fa: BENGALI ISSHAR*/
-                                                     0, /* U+0009fb: */
-                                                     0, /* U+0009fc: */
-                                                     0, /* U+0009fd: */
-                                                     0, /* U+0009fe: */
-                                                     0, /* U+0009ff: */
-                                                     0, /* U+000a00: */
-                                           RTUNI_ALPHA, /* U+000a01: GURMUKHI SIGN ADAK BINDI*/
-                                           RTUNI_ALPHA, /* U+000a02: GURMUKHI SIGN BINDI*/
-                                           RTUNI_ALPHA, /* U+000a03: GURMUKHI SIGN VISARGA*/
-                                                     0, /* U+000a04: */
-                                           RTUNI_ALPHA, /* U+000a05: GURMUKHI LETTER A*/
-                                           RTUNI_ALPHA, /* U+000a06: GURMUKHI LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000a07: GURMUKHI LETTER I*/
-                                           RTUNI_ALPHA, /* U+000a08: GURMUKHI LETTER II*/
-                                           RTUNI_ALPHA, /* U+000a09: GURMUKHI LETTER U*/
-                                           RTUNI_ALPHA, /* U+000a0a: GURMUKHI LETTER UU*/
-                                                     0, /* U+000a0b: */
-                                                     0, /* U+000a0c: */
-                                                     0, /* U+000a0d: */
-                                                     0, /* U+000a0e: */
-                                           RTUNI_ALPHA, /* U+000a0f: GURMUKHI LETTER EE*/
-                                           RTUNI_ALPHA, /* U+000a10: GURMUKHI LETTER AI*/
-                                                     0, /* U+000a11: */
-                                                     0, /* U+000a12: */
-                                           RTUNI_ALPHA, /* U+000a13: GURMUKHI LETTER OO*/
-                                           RTUNI_ALPHA, /* U+000a14: GURMUKHI LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000a15: GURMUKHI LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000a16: GURMUKHI LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000a17: GURMUKHI LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000a18: GURMUKHI LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000a19: GURMUKHI LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000a1a: GURMUKHI LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000a1b: GURMUKHI LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000a1c: GURMUKHI LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000a1d: GURMUKHI LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000a1e: GURMUKHI LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000a1f: GURMUKHI LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000a20: GURMUKHI LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000a21: GURMUKHI LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000a22: GURMUKHI LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000a23: GURMUKHI LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000a24: GURMUKHI LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000a25: GURMUKHI LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000a26: GURMUKHI LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000a27: GURMUKHI LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000a28: GURMUKHI LETTER NA*/
-                                                     0, /* U+000a29: */
-                                           RTUNI_ALPHA, /* U+000a2a: GURMUKHI LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000a2b: GURMUKHI LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000a2c: GURMUKHI LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000a2d: GURMUKHI LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000a2e: GURMUKHI LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000a2f: GURMUKHI LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000a30: GURMUKHI LETTER RA*/
-                                                     0, /* U+000a31: */
-                                           RTUNI_ALPHA, /* U+000a32: GURMUKHI LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000a33: GURMUKHI LETTER LLA*/
-                                                     0, /* U+000a34: */
-                                           RTUNI_ALPHA, /* U+000a35: GURMUKHI LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000a36: GURMUKHI LETTER SHA*/
-                                                     0, /* U+000a37: */
-                                           RTUNI_ALPHA, /* U+000a38: GURMUKHI LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000a39: GURMUKHI LETTER HA*/
-                                                     0, /* U+000a3a: */
-                                                     0, /* U+000a3b: */
-                                                     0, /* U+000a3c: GURMUKHI SIGN NUKTA*/
-                                                     0, /* U+000a3d: */
-                                           RTUNI_ALPHA, /* U+000a3e: GURMUKHI VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000a3f: GURMUKHI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000a40: GURMUKHI VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000a41: GURMUKHI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000a42: GURMUKHI VOWEL SIGN UU*/
-                                                     0, /* U+000a43: */
-                                                     0, /* U+000a44: */
-                                                     0, /* U+000a45: */
-                                                     0, /* U+000a46: */
-                                           RTUNI_ALPHA, /* U+000a47: GURMUKHI VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000a48: GURMUKHI VOWEL SIGN AI*/
-                                                     0, /* U+000a49: */
-                                                     0, /* U+000a4a: */
-                                           RTUNI_ALPHA, /* U+000a4b: GURMUKHI VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000a4c: GURMUKHI VOWEL SIGN AU*/
-                                                     0, /* U+000a4d: GURMUKHI SIGN VIRAMA*/
-                                                     0, /* U+000a4e: */
-                                                     0, /* U+000a4f: */
-                                                     0, /* U+000a50: */
-                                                     0, /* U+000a51: */
-                                                     0, /* U+000a52: */
-                                                     0, /* U+000a53: */
-                                                     0, /* U+000a54: */
-                                                     0, /* U+000a55: */
-                                                     0, /* U+000a56: */
-                                                     0, /* U+000a57: */
-                                                     0, /* U+000a58: */
-                                           RTUNI_ALPHA, /* U+000a59: GURMUKHI LETTER KHHA*/
-                                           RTUNI_ALPHA, /* U+000a5a: GURMUKHI LETTER GHHA*/
-                                           RTUNI_ALPHA, /* U+000a5b: GURMUKHI LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+000a5c: GURMUKHI LETTER RRA*/
-                                                     0, /* U+000a5d: */
-                                           RTUNI_ALPHA, /* U+000a5e: GURMUKHI LETTER FA*/
-                                                     0, /* U+000a5f: */
-                                                     0, /* U+000a60: */
-                                                     0, /* U+000a61: */
-                                                     0, /* U+000a62: */
-                                                     0, /* U+000a63: */
-                                                     0, /* U+000a64: */
-                                                     0, /* U+000a65: */
-                                          RTUNI_DDIGIT, /* U+000a66: GURMUKHI DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000a67: GURMUKHI DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000a68: GURMUKHI DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000a69: GURMUKHI DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000a6a: GURMUKHI DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000a6b: GURMUKHI DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000a6c: GURMUKHI DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000a6d: GURMUKHI DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000a6e: GURMUKHI DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000a6f: GURMUKHI DIGIT NINE*/
-                                           RTUNI_ALPHA, /* U+000a70: GURMUKHI TIPPI*/
-                                           RTUNI_ALPHA, /* U+000a71: GURMUKHI ADDAK*/
-                                           RTUNI_ALPHA, /* U+000a72: GURMUKHI IRI*/
-                                           RTUNI_ALPHA, /* U+000a73: GURMUKHI URA*/
-                                           RTUNI_ALPHA, /* U+000a74: GURMUKHI EK ONKAR*/
-                                                     0, /* U+000a75: */
-                                                     0, /* U+000a76: */
-                                                     0, /* U+000a77: */
-                                                     0, /* U+000a78: */
-                                                     0, /* U+000a79: */
-                                                     0, /* U+000a7a: */
-                                                     0, /* U+000a7b: */
-                                                     0, /* U+000a7c: */
-                                                     0, /* U+000a7d: */
-                                                     0, /* U+000a7e: */
-                                                     0, /* U+000a7f: */
-                                                     0, /* U+000a80: */
-                                           RTUNI_ALPHA, /* U+000a81: GUJARATI SIGN CANDRABINDU*/
-                                           RTUNI_ALPHA, /* U+000a82: GUJARATI SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000a83: GUJARATI SIGN VISARGA*/
-                                                     0, /* U+000a84: */
-                                           RTUNI_ALPHA, /* U+000a85: GUJARATI LETTER A*/
-                                           RTUNI_ALPHA, /* U+000a86: GUJARATI LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000a87: GUJARATI LETTER I*/
-                                           RTUNI_ALPHA, /* U+000a88: GUJARATI LETTER II*/
-                                           RTUNI_ALPHA, /* U+000a89: GUJARATI LETTER U*/
-                                           RTUNI_ALPHA, /* U+000a8a: GUJARATI LETTER UU*/
-                                           RTUNI_ALPHA, /* U+000a8b: GUJARATI LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000a8c: GUJARATI LETTER VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+000a8d: GUJARATI VOWEL CANDRA E*/
-                                                     0, /* U+000a8e: */
-                                           RTUNI_ALPHA, /* U+000a8f: GUJARATI LETTER E*/
-                                           RTUNI_ALPHA, /* U+000a90: GUJARATI LETTER AI*/
-                                           RTUNI_ALPHA, /* U+000a91: GUJARATI VOWEL CANDRA O*/
-                                                     0, /* U+000a92: */
-                                           RTUNI_ALPHA, /* U+000a93: GUJARATI LETTER O*/
-                                           RTUNI_ALPHA, /* U+000a94: GUJARATI LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000a95: GUJARATI LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000a96: GUJARATI LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000a97: GUJARATI LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000a98: GUJARATI LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000a99: GUJARATI LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000a9a: GUJARATI LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000a9b: GUJARATI LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000a9c: GUJARATI LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000a9d: GUJARATI LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000a9e: GUJARATI LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000a9f: GUJARATI LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000aa0: GUJARATI LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000aa1: GUJARATI LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000aa2: GUJARATI LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000aa3: GUJARATI LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000aa4: GUJARATI LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000aa5: GUJARATI LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000aa6: GUJARATI LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000aa7: GUJARATI LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000aa8: GUJARATI LETTER NA*/
-                                                     0, /* U+000aa9: */
-                                           RTUNI_ALPHA, /* U+000aaa: GUJARATI LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000aab: GUJARATI LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000aac: GUJARATI LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000aad: GUJARATI LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000aae: GUJARATI LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000aaf: GUJARATI LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000ab0: GUJARATI LETTER RA*/
-                                                     0, /* U+000ab1: */
-                                           RTUNI_ALPHA, /* U+000ab2: GUJARATI LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000ab3: GUJARATI LETTER LLA*/
-                                                     0, /* U+000ab4: */
-                                           RTUNI_ALPHA, /* U+000ab5: GUJARATI LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000ab6: GUJARATI LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000ab7: GUJARATI LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000ab8: GUJARATI LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000ab9: GUJARATI LETTER HA*/
-                                                     0, /* U+000aba: */
-                                                     0, /* U+000abb: */
-                                                     0, /* U+000abc: GUJARATI SIGN NUKTA*/
-                                           RTUNI_ALPHA, /* U+000abd: GUJARATI SIGN AVAGRAHA*/
-                                           RTUNI_ALPHA, /* U+000abe: GUJARATI VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000abf: GUJARATI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000ac0: GUJARATI VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000ac1: GUJARATI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000ac2: GUJARATI VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000ac3: GUJARATI VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000ac4: GUJARATI VOWEL SIGN VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000ac5: GUJARATI VOWEL SIGN CANDRA E*/
-                                                     0, /* U+000ac6: */
-                                           RTUNI_ALPHA, /* U+000ac7: GUJARATI VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000ac8: GUJARATI VOWEL SIGN AI*/
-                                           RTUNI_ALPHA, /* U+000ac9: GUJARATI VOWEL SIGN CANDRA O*/
-                                                     0, /* U+000aca: */
-                                           RTUNI_ALPHA, /* U+000acb: GUJARATI VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000acc: GUJARATI VOWEL SIGN AU*/
-                                                     0, /* U+000acd: GUJARATI SIGN VIRAMA*/
-                                                     0, /* U+000ace: */
-                                                     0, /* U+000acf: */
-                                           RTUNI_ALPHA, /* U+000ad0: GUJARATI OM*/
-                                                     0, /* U+000ad1: */
-                                                     0, /* U+000ad2: */
-                                                     0, /* U+000ad3: */
-                                                     0, /* U+000ad4: */
-                                                     0, /* U+000ad5: */
-                                                     0, /* U+000ad6: */
-                                                     0, /* U+000ad7: */
-                                                     0, /* U+000ad8: */
-                                                     0, /* U+000ad9: */
-                                                     0, /* U+000ada: */
-                                                     0, /* U+000adb: */
-                                                     0, /* U+000adc: */
-                                                     0, /* U+000add: */
-                                                     0, /* U+000ade: */
-                                                     0, /* U+000adf: */
-                                           RTUNI_ALPHA, /* U+000ae0: GUJARATI LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000ae1: GUJARATI LETTER VOCALIC LL*/
-                                           RTUNI_ALPHA, /* U+000ae2: GUJARATI VOWEL SIGN VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+000ae3: GUJARATI VOWEL SIGN VOCALIC LL*/
-                                                     0, /* U+000ae4: */
-                                                     0, /* U+000ae5: */
-                                          RTUNI_DDIGIT, /* U+000ae6: GUJARATI DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000ae7: GUJARATI DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000ae8: GUJARATI DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000ae9: GUJARATI DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000aea: GUJARATI DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000aeb: GUJARATI DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000aec: GUJARATI DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000aed: GUJARATI DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000aee: GUJARATI DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000aef: GUJARATI DIGIT NINE*/
-                                                     0, /* U+000af0: */
-                                                     0, /* U+000af1: GUJARATI RUPEE SIGN*/
-                                                     0, /* U+000af2: */
-                                                     0, /* U+000af3: */
-                                                     0, /* U+000af4: */
-                                                     0, /* U+000af5: */
-                                                     0, /* U+000af6: */
-                                                     0, /* U+000af7: */
-                                                     0, /* U+000af8: */
-                                                     0, /* U+000af9: */
-                                                     0, /* U+000afa: */
-                                                     0, /* U+000afb: */
-                                                     0, /* U+000afc: */
-                                                     0, /* U+000afd: */
-                                                     0, /* U+000afe: */
-                                                     0, /* U+000aff: */
-                                                     0, /* U+000b00: */
-                                           RTUNI_ALPHA, /* U+000b01: ORIYA SIGN CANDRABINDU*/
-                                           RTUNI_ALPHA, /* U+000b02: ORIYA SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000b03: ORIYA SIGN VISARGA*/
-                                                     0, /* U+000b04: */
-                                           RTUNI_ALPHA, /* U+000b05: ORIYA LETTER A*/
-                                           RTUNI_ALPHA, /* U+000b06: ORIYA LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000b07: ORIYA LETTER I*/
-                                           RTUNI_ALPHA, /* U+000b08: ORIYA LETTER II*/
-                                           RTUNI_ALPHA, /* U+000b09: ORIYA LETTER U*/
-                                           RTUNI_ALPHA, /* U+000b0a: ORIYA LETTER UU*/
-                                           RTUNI_ALPHA, /* U+000b0b: ORIYA LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000b0c: ORIYA LETTER VOCALIC L*/
-                                                     0, /* U+000b0d: */
-                                                     0, /* U+000b0e: */
-                                           RTUNI_ALPHA, /* U+000b0f: ORIYA LETTER E*/
-                                           RTUNI_ALPHA, /* U+000b10: ORIYA LETTER AI*/
-                                                     0, /* U+000b11: */
-                                                     0, /* U+000b12: */
-                                           RTUNI_ALPHA, /* U+000b13: ORIYA LETTER O*/
-                                           RTUNI_ALPHA, /* U+000b14: ORIYA LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000b15: ORIYA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000b16: ORIYA LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000b17: ORIYA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000b18: ORIYA LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000b19: ORIYA LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000b1a: ORIYA LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000b1b: ORIYA LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000b1c: ORIYA LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000b1d: ORIYA LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000b1e: ORIYA LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000b1f: ORIYA LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000b20: ORIYA LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000b21: ORIYA LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000b22: ORIYA LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000b23: ORIYA LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000b24: ORIYA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000b25: ORIYA LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000b26: ORIYA LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000b27: ORIYA LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000b28: ORIYA LETTER NA*/
-                                                     0, /* U+000b29: */
-                                           RTUNI_ALPHA, /* U+000b2a: ORIYA LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000b2b: ORIYA LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000b2c: ORIYA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000b2d: ORIYA LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000b2e: ORIYA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000b2f: ORIYA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000b30: ORIYA LETTER RA*/
-                                                     0, /* U+000b31: */
-                                           RTUNI_ALPHA, /* U+000b32: ORIYA LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000b33: ORIYA LETTER LLA*/
-                                                     0, /* U+000b34: */
-                                           RTUNI_ALPHA, /* U+000b35: ORIYA LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000b36: ORIYA LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000b37: ORIYA LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000b38: ORIYA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000b39: ORIYA LETTER HA*/
-                                                     0, /* U+000b3a: */
-                                                     0, /* U+000b3b: */
-                                                     0, /* U+000b3c: ORIYA SIGN NUKTA*/
-                                           RTUNI_ALPHA, /* U+000b3d: ORIYA SIGN AVAGRAHA*/
-                                           RTUNI_ALPHA, /* U+000b3e: ORIYA VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000b3f: ORIYA VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000b40: ORIYA VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000b41: ORIYA VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000b42: ORIYA VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000b43: ORIYA VOWEL SIGN VOCALIC R*/
-                                                     0, /* U+000b44: */
-                                                     0, /* U+000b45: */
-                                                     0, /* U+000b46: */
-                                           RTUNI_ALPHA, /* U+000b47: ORIYA VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000b48: ORIYA VOWEL SIGN AI*/
-                                                     0, /* U+000b49: */
-                                                     0, /* U+000b4a: */
-                                           RTUNI_ALPHA, /* U+000b4b: ORIYA VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000b4c: ORIYA VOWEL SIGN AU*/
-                                                     0, /* U+000b4d: ORIYA SIGN VIRAMA*/
-                                                     0, /* U+000b4e: */
-                                                     0, /* U+000b4f: */
-                                                     0, /* U+000b50: */
-                                                     0, /* U+000b51: */
-                                                     0, /* U+000b52: */
-                                                     0, /* U+000b53: */
-                                                     0, /* U+000b54: */
-                                                     0, /* U+000b55: */
-                                           RTUNI_ALPHA, /* U+000b56: ORIYA AI LENGTH MARK*/
-                                           RTUNI_ALPHA, /* U+000b57: ORIYA AU LENGTH MARK*/
-                                                     0, /* U+000b58: */
-                                                     0, /* U+000b59: */
-                                                     0, /* U+000b5a: */
-                                                     0, /* U+000b5b: */
-                                           RTUNI_ALPHA, /* U+000b5c: ORIYA LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000b5d: ORIYA LETTER RHA*/
-                                                     0, /* U+000b5e: */
-                                           RTUNI_ALPHA, /* U+000b5f: ORIYA LETTER YYA*/
-                                           RTUNI_ALPHA, /* U+000b60: ORIYA LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000b61: ORIYA LETTER VOCALIC LL*/
-                                                     0, /* U+000b62: */
-                                                     0, /* U+000b63: */
-                                                     0, /* U+000b64: */
-                                                     0, /* U+000b65: */
-                                          RTUNI_DDIGIT, /* U+000b66: ORIYA DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000b67: ORIYA DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000b68: ORIYA DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000b69: ORIYA DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000b6a: ORIYA DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000b6b: ORIYA DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000b6c: ORIYA DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000b6d: ORIYA DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000b6e: ORIYA DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000b6f: ORIYA DIGIT NINE*/
-                                                     0, /* U+000b70: ORIYA ISSHAR*/
-                                           RTUNI_ALPHA, /* U+000b71: ORIYA LETTER WA*/
-                                                     0, /* U+000b72: */
-                                                     0, /* U+000b73: */
-                                                     0, /* U+000b74: */
-                                                     0, /* U+000b75: */
-                                                     0, /* U+000b76: */
-                                                     0, /* U+000b77: */
-                                                     0, /* U+000b78: */
-                                                     0, /* U+000b79: */
-                                                     0, /* U+000b7a: */
-                                                     0, /* U+000b7b: */
-                                                     0, /* U+000b7c: */
-                                                     0, /* U+000b7d: */
-                                                     0, /* U+000b7e: */
-                                                     0, /* U+000b7f: */
-                                                     0, /* U+000b80: */
-                                                     0, /* U+000b81: */
-                                           RTUNI_ALPHA, /* U+000b82: TAMIL SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000b83: TAMIL SIGN VISARGA*/
-                                                     0, /* U+000b84: */
-                                           RTUNI_ALPHA, /* U+000b85: TAMIL LETTER A*/
-                                           RTUNI_ALPHA, /* U+000b86: TAMIL LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000b87: TAMIL LETTER I*/
-                                           RTUNI_ALPHA, /* U+000b88: TAMIL LETTER II*/
-                                           RTUNI_ALPHA, /* U+000b89: TAMIL LETTER U*/
-                                           RTUNI_ALPHA, /* U+000b8a: TAMIL LETTER UU*/
-                                                     0, /* U+000b8b: */
-                                                     0, /* U+000b8c: */
-                                                     0, /* U+000b8d: */
-                                           RTUNI_ALPHA, /* U+000b8e: TAMIL LETTER E*/
-                                           RTUNI_ALPHA, /* U+000b8f: TAMIL LETTER EE*/
-                                           RTUNI_ALPHA, /* U+000b90: TAMIL LETTER AI*/
-                                                     0, /* U+000b91: */
-                                           RTUNI_ALPHA, /* U+000b92: TAMIL LETTER O*/
-                                           RTUNI_ALPHA, /* U+000b93: TAMIL LETTER OO*/
-                                           RTUNI_ALPHA, /* U+000b94: TAMIL LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000b95: TAMIL LETTER KA*/
-                                                     0, /* U+000b96: */
-                                                     0, /* U+000b97: */
-                                                     0, /* U+000b98: */
-                                           RTUNI_ALPHA, /* U+000b99: TAMIL LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000b9a: TAMIL LETTER CA*/
-                                                     0, /* U+000b9b: */
-                                           RTUNI_ALPHA, /* U+000b9c: TAMIL LETTER JA*/
-                                                     0, /* U+000b9d: */
-                                           RTUNI_ALPHA, /* U+000b9e: TAMIL LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000b9f: TAMIL LETTER TTA*/
-                                                     0, /* U+000ba0: */
-                                                     0, /* U+000ba1: */
-                                                     0, /* U+000ba2: */
-                                           RTUNI_ALPHA, /* U+000ba3: TAMIL LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000ba4: TAMIL LETTER TA*/
-                                                     0, /* U+000ba5: */
-                                                     0, /* U+000ba6: */
-                                                     0, /* U+000ba7: */
-                                           RTUNI_ALPHA, /* U+000ba8: TAMIL LETTER NA*/
-                                           RTUNI_ALPHA, /* U+000ba9: TAMIL LETTER NNNA*/
-                                           RTUNI_ALPHA, /* U+000baa: TAMIL LETTER PA*/
-                                                     0, /* U+000bab: */
-                                                     0, /* U+000bac: */
-                                                     0, /* U+000bad: */
-                                           RTUNI_ALPHA, /* U+000bae: TAMIL LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000baf: TAMIL LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000bb0: TAMIL LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000bb1: TAMIL LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000bb2: TAMIL LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000bb3: TAMIL LETTER LLA*/
-                                           RTUNI_ALPHA, /* U+000bb4: TAMIL LETTER LLLA*/
-                                           RTUNI_ALPHA, /* U+000bb5: TAMIL LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000bb6: TAMIL LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000bb7: TAMIL LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000bb8: TAMIL LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000bb9: TAMIL LETTER HA*/
-                                                     0, /* U+000bba: */
-                                                     0, /* U+000bbb: */
-                                                     0, /* U+000bbc: */
-                                                     0, /* U+000bbd: */
-                                           RTUNI_ALPHA, /* U+000bbe: TAMIL VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000bbf: TAMIL VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000bc0: TAMIL VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000bc1: TAMIL VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000bc2: TAMIL VOWEL SIGN UU*/
-                                                     0, /* U+000bc3: */
-                                                     0, /* U+000bc4: */
-                                                     0, /* U+000bc5: */
-                                           RTUNI_ALPHA, /* U+000bc6: TAMIL VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000bc7: TAMIL VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000bc8: TAMIL VOWEL SIGN AI*/
-                                                     0, /* U+000bc9: */
-                                           RTUNI_ALPHA, /* U+000bca: TAMIL VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000bcb: TAMIL VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000bcc: TAMIL VOWEL SIGN AU*/
-                                                     0, /* U+000bcd: TAMIL SIGN VIRAMA*/
-                                                     0, /* U+000bce: */
-                                                     0, /* U+000bcf: */
-                                                     0, /* U+000bd0: */
-                                                     0, /* U+000bd1: */
-                                                     0, /* U+000bd2: */
-                                                     0, /* U+000bd3: */
-                                                     0, /* U+000bd4: */
-                                                     0, /* U+000bd5: */
-                                                     0, /* U+000bd6: */
-                                           RTUNI_ALPHA, /* U+000bd7: TAMIL AU LENGTH MARK*/
-                                                     0, /* U+000bd8: */
-                                                     0, /* U+000bd9: */
-                                                     0, /* U+000bda: */
-                                                     0, /* U+000bdb: */
-                                                     0, /* U+000bdc: */
-                                                     0, /* U+000bdd: */
-                                                     0, /* U+000bde: */
-                                                     0, /* U+000bdf: */
-                                                     0, /* U+000be0: */
-                                                     0, /* U+000be1: */
-                                                     0, /* U+000be2: */
-                                                     0, /* U+000be3: */
-                                                     0, /* U+000be4: */
-                                                     0, /* U+000be5: */
-                                          RTUNI_DDIGIT, /* U+000be6: TAMIL DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000be7: TAMIL DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000be8: TAMIL DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000be9: TAMIL DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000bea: TAMIL DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000beb: TAMIL DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000bec: TAMIL DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000bed: TAMIL DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000bee: TAMIL DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000bef: TAMIL DIGIT NINE*/
-                                                     0, /* U+000bf0: TAMIL NUMBER TEN*/
-                                                     0, /* U+000bf1: TAMIL NUMBER ONE HUNDRED*/
-                                                     0, /* U+000bf2: TAMIL NUMBER ONE THOUSAND*/
-                                                     0, /* U+000bf3: TAMIL DAY SIGN*/
-                                                     0, /* U+000bf4: TAMIL MONTH SIGN*/
-                                                     0, /* U+000bf5: TAMIL YEAR SIGN*/
-                                                     0, /* U+000bf6: TAMIL DEBIT SIGN*/
-                                                     0, /* U+000bf7: TAMIL CREDIT SIGN*/
-                                                     0, /* U+000bf8: TAMIL AS ABOVE SIGN*/
-                                                     0, /* U+000bf9: TAMIL RUPEE SIGN*/
-                                                     0, /* U+000bfa: TAMIL NUMBER SIGN*/
-                                                     0, /* U+000bfb: */
-                                                     0, /* U+000bfc: */
-                                                     0, /* U+000bfd: */
-                                                     0, /* U+000bfe: */
-                                                     0, /* U+000bff: */
-                                                     0, /* U+000c00: */
-                                           RTUNI_ALPHA, /* U+000c01: TELUGU SIGN CANDRABINDU*/
-                                           RTUNI_ALPHA, /* U+000c02: TELUGU SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000c03: TELUGU SIGN VISARGA*/
-                                                     0, /* U+000c04: */
-                                           RTUNI_ALPHA, /* U+000c05: TELUGU LETTER A*/
-                                           RTUNI_ALPHA, /* U+000c06: TELUGU LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000c07: TELUGU LETTER I*/
-                                           RTUNI_ALPHA, /* U+000c08: TELUGU LETTER II*/
-                                           RTUNI_ALPHA, /* U+000c09: TELUGU LETTER U*/
-                                           RTUNI_ALPHA, /* U+000c0a: TELUGU LETTER UU*/
-                                           RTUNI_ALPHA, /* U+000c0b: TELUGU LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000c0c: TELUGU LETTER VOCALIC L*/
-                                                     0, /* U+000c0d: */
-                                           RTUNI_ALPHA, /* U+000c0e: TELUGU LETTER E*/
-                                           RTUNI_ALPHA, /* U+000c0f: TELUGU LETTER EE*/
-                                           RTUNI_ALPHA, /* U+000c10: TELUGU LETTER AI*/
-                                                     0, /* U+000c11: */
-                                           RTUNI_ALPHA, /* U+000c12: TELUGU LETTER O*/
-                                           RTUNI_ALPHA, /* U+000c13: TELUGU LETTER OO*/
-                                           RTUNI_ALPHA, /* U+000c14: TELUGU LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000c15: TELUGU LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000c16: TELUGU LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000c17: TELUGU LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000c18: TELUGU LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000c19: TELUGU LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000c1a: TELUGU LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000c1b: TELUGU LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000c1c: TELUGU LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000c1d: TELUGU LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000c1e: TELUGU LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000c1f: TELUGU LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000c20: TELUGU LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000c21: TELUGU LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000c22: TELUGU LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000c23: TELUGU LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000c24: TELUGU LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000c25: TELUGU LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000c26: TELUGU LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000c27: TELUGU LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000c28: TELUGU LETTER NA*/
-                                                     0, /* U+000c29: */
-                                           RTUNI_ALPHA, /* U+000c2a: TELUGU LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000c2b: TELUGU LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000c2c: TELUGU LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000c2d: TELUGU LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000c2e: TELUGU LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000c2f: TELUGU LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000c30: TELUGU LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000c31: TELUGU LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000c32: TELUGU LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000c33: TELUGU LETTER LLA*/
-                                                     0, /* U+000c34: */
-                                           RTUNI_ALPHA, /* U+000c35: TELUGU LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000c36: TELUGU LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000c37: TELUGU LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000c38: TELUGU LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000c39: TELUGU LETTER HA*/
-                                                     0, /* U+000c3a: */
-                                                     0, /* U+000c3b: */
-                                                     0, /* U+000c3c: */
-                                                     0, /* U+000c3d: */
-                                           RTUNI_ALPHA, /* U+000c3e: TELUGU VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000c3f: TELUGU VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000c40: TELUGU VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000c41: TELUGU VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000c42: TELUGU VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000c43: TELUGU VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000c44: TELUGU VOWEL SIGN VOCALIC RR*/
-                                                     0, /* U+000c45: */
-                                           RTUNI_ALPHA, /* U+000c46: TELUGU VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000c47: TELUGU VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000c48: TELUGU VOWEL SIGN AI*/
-                                                     0, /* U+000c49: */
-                                           RTUNI_ALPHA, /* U+000c4a: TELUGU VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000c4b: TELUGU VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000c4c: TELUGU VOWEL SIGN AU*/
-                                                     0, /* U+000c4d: TELUGU SIGN VIRAMA*/
-                                                     0, /* U+000c4e: */
-                                                     0, /* U+000c4f: */
-                                                     0, /* U+000c50: */
-                                                     0, /* U+000c51: */
-                                                     0, /* U+000c52: */
-                                                     0, /* U+000c53: */
-                                                     0, /* U+000c54: */
-                                           RTUNI_ALPHA, /* U+000c55: TELUGU LENGTH MARK*/
-                                           RTUNI_ALPHA, /* U+000c56: TELUGU AI LENGTH MARK*/
-                                                     0, /* U+000c57: */
-                                                     0, /* U+000c58: */
-                                                     0, /* U+000c59: */
-                                                     0, /* U+000c5a: */
-                                                     0, /* U+000c5b: */
-                                                     0, /* U+000c5c: */
-                                                     0, /* U+000c5d: */
-                                                     0, /* U+000c5e: */
-                                                     0, /* U+000c5f: */
-                                           RTUNI_ALPHA, /* U+000c60: TELUGU LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000c61: TELUGU LETTER VOCALIC LL*/
-                                                     0, /* U+000c62: */
-                                                     0, /* U+000c63: */
-                                                     0, /* U+000c64: */
-                                                     0, /* U+000c65: */
-                                          RTUNI_DDIGIT, /* U+000c66: TELUGU DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000c67: TELUGU DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000c68: TELUGU DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000c69: TELUGU DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000c6a: TELUGU DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000c6b: TELUGU DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000c6c: TELUGU DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000c6d: TELUGU DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000c6e: TELUGU DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000c6f: TELUGU DIGIT NINE*/
-                                                     0, /* U+000c70: */
-                                                     0, /* U+000c71: */
-                                                     0, /* U+000c72: */
-                                                     0, /* U+000c73: */
-                                                     0, /* U+000c74: */
-                                                     0, /* U+000c75: */
-                                                     0, /* U+000c76: */
-                                                     0, /* U+000c77: */
-                                                     0, /* U+000c78: */
-                                                     0, /* U+000c79: */
-                                                     0, /* U+000c7a: */
-                                                     0, /* U+000c7b: */
-                                                     0, /* U+000c7c: */
-                                                     0, /* U+000c7d: */
-                                                     0, /* U+000c7e: */
-                                                     0, /* U+000c7f: */
-                                                     0, /* U+000c80: */
-                                                     0, /* U+000c81: */
-                                           RTUNI_ALPHA, /* U+000c82: KANNADA SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000c83: KANNADA SIGN VISARGA*/
-                                                     0, /* U+000c84: */
-                                           RTUNI_ALPHA, /* U+000c85: KANNADA LETTER A*/
-                                           RTUNI_ALPHA, /* U+000c86: KANNADA LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000c87: KANNADA LETTER I*/
-                                           RTUNI_ALPHA, /* U+000c88: KANNADA LETTER II*/
-                                           RTUNI_ALPHA, /* U+000c89: KANNADA LETTER U*/
-                                           RTUNI_ALPHA, /* U+000c8a: KANNADA LETTER UU*/
-                                           RTUNI_ALPHA, /* U+000c8b: KANNADA LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000c8c: KANNADA LETTER VOCALIC L*/
-                                                     0, /* U+000c8d: */
-                                           RTUNI_ALPHA, /* U+000c8e: KANNADA LETTER E*/
-                                           RTUNI_ALPHA, /* U+000c8f: KANNADA LETTER EE*/
-                                           RTUNI_ALPHA, /* U+000c90: KANNADA LETTER AI*/
-                                                     0, /* U+000c91: */
-                                           RTUNI_ALPHA, /* U+000c92: KANNADA LETTER O*/
-                                           RTUNI_ALPHA, /* U+000c93: KANNADA LETTER OO*/
-                                           RTUNI_ALPHA, /* U+000c94: KANNADA LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000c95: KANNADA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000c96: KANNADA LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000c97: KANNADA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000c98: KANNADA LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000c99: KANNADA LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000c9a: KANNADA LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000c9b: KANNADA LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000c9c: KANNADA LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000c9d: KANNADA LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000c9e: KANNADA LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000c9f: KANNADA LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000ca0: KANNADA LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000ca1: KANNADA LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000ca2: KANNADA LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000ca3: KANNADA LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000ca4: KANNADA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000ca5: KANNADA LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000ca6: KANNADA LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000ca7: KANNADA LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000ca8: KANNADA LETTER NA*/
-                                                     0, /* U+000ca9: */
-                                           RTUNI_ALPHA, /* U+000caa: KANNADA LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000cab: KANNADA LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000cac: KANNADA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000cad: KANNADA LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000cae: KANNADA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000caf: KANNADA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000cb0: KANNADA LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000cb1: KANNADA LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000cb2: KANNADA LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000cb3: KANNADA LETTER LLA*/
-                                                     0, /* U+000cb4: */
-                                           RTUNI_ALPHA, /* U+000cb5: KANNADA LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000cb6: KANNADA LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000cb7: KANNADA LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000cb8: KANNADA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000cb9: KANNADA LETTER HA*/
-                                                     0, /* U+000cba: */
-                                                     0, /* U+000cbb: */
-                                                     0, /* U+000cbc: KANNADA SIGN NUKTA*/
-                                           RTUNI_ALPHA, /* U+000cbd: KANNADA SIGN AVAGRAHA*/
-                                           RTUNI_ALPHA, /* U+000cbe: KANNADA VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000cbf: KANNADA VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000cc0: KANNADA VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000cc1: KANNADA VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000cc2: KANNADA VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000cc3: KANNADA VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000cc4: KANNADA VOWEL SIGN VOCALIC RR*/
-                                                     0, /* U+000cc5: */
-                                           RTUNI_ALPHA, /* U+000cc6: KANNADA VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000cc7: KANNADA VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000cc8: KANNADA VOWEL SIGN AI*/
-                                                     0, /* U+000cc9: */
-                                           RTUNI_ALPHA, /* U+000cca: KANNADA VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000ccb: KANNADA VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000ccc: KANNADA VOWEL SIGN AU*/
-                                                     0, /* U+000ccd: KANNADA SIGN VIRAMA*/
-                                                     0, /* U+000cce: */
-                                                     0, /* U+000ccf: */
-                                                     0, /* U+000cd0: */
-                                                     0, /* U+000cd1: */
-                                                     0, /* U+000cd2: */
-                                                     0, /* U+000cd3: */
-                                                     0, /* U+000cd4: */
-                                           RTUNI_ALPHA, /* U+000cd5: KANNADA LENGTH MARK*/
-                                           RTUNI_ALPHA, /* U+000cd6: KANNADA AI LENGTH MARK*/
-                                                     0, /* U+000cd7: */
-                                                     0, /* U+000cd8: */
-                                                     0, /* U+000cd9: */
-                                                     0, /* U+000cda: */
-                                                     0, /* U+000cdb: */
-                                                     0, /* U+000cdc: */
-                                                     0, /* U+000cdd: */
-                                           RTUNI_ALPHA, /* U+000cde: KANNADA LETTER FA*/
-                                                     0, /* U+000cdf: */
-                                           RTUNI_ALPHA, /* U+000ce0: KANNADA LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000ce1: KANNADA LETTER VOCALIC LL*/
-                                                     0, /* U+000ce2: */
-                                                     0, /* U+000ce3: */
-                                                     0, /* U+000ce4: */
-                                                     0, /* U+000ce5: */
-                                          RTUNI_DDIGIT, /* U+000ce6: KANNADA DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000ce7: KANNADA DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000ce8: KANNADA DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000ce9: KANNADA DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000cea: KANNADA DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000ceb: KANNADA DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000cec: KANNADA DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000ced: KANNADA DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000cee: KANNADA DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000cef: KANNADA DIGIT NINE*/
-                                                     0, /* U+000cf0: */
-                                                     0, /* U+000cf1: */
-                                                     0, /* U+000cf2: */
-                                                     0, /* U+000cf3: */
-                                                     0, /* U+000cf4: */
-                                                     0, /* U+000cf5: */
-                                                     0, /* U+000cf6: */
-                                                     0, /* U+000cf7: */
-                                                     0, /* U+000cf8: */
-                                                     0, /* U+000cf9: */
-                                                     0, /* U+000cfa: */
-                                                     0, /* U+000cfb: */
-                                                     0, /* U+000cfc: */
-                                                     0, /* U+000cfd: */
-                                                     0, /* U+000cfe: */
-                                                     0, /* U+000cff: */
-                                                     0, /* U+000d00: */
-                                                     0, /* U+000d01: */
-                                           RTUNI_ALPHA, /* U+000d02: MALAYALAM SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+000d03: MALAYALAM SIGN VISARGA*/
-                                                     0, /* U+000d04: */
-                                           RTUNI_ALPHA, /* U+000d05: MALAYALAM LETTER A*/
-                                           RTUNI_ALPHA, /* U+000d06: MALAYALAM LETTER AA*/
-                                           RTUNI_ALPHA, /* U+000d07: MALAYALAM LETTER I*/
-                                           RTUNI_ALPHA, /* U+000d08: MALAYALAM LETTER II*/
-                                           RTUNI_ALPHA, /* U+000d09: MALAYALAM LETTER U*/
-                                           RTUNI_ALPHA, /* U+000d0a: MALAYALAM LETTER UU*/
-                                           RTUNI_ALPHA, /* U+000d0b: MALAYALAM LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000d0c: MALAYALAM LETTER VOCALIC L*/
-                                                     0, /* U+000d0d: */
-                                           RTUNI_ALPHA, /* U+000d0e: MALAYALAM LETTER E*/
-                                           RTUNI_ALPHA, /* U+000d0f: MALAYALAM LETTER EE*/
-                                           RTUNI_ALPHA, /* U+000d10: MALAYALAM LETTER AI*/
-                                                     0, /* U+000d11: */
-                                           RTUNI_ALPHA, /* U+000d12: MALAYALAM LETTER O*/
-                                           RTUNI_ALPHA, /* U+000d13: MALAYALAM LETTER OO*/
-                                           RTUNI_ALPHA, /* U+000d14: MALAYALAM LETTER AU*/
-                                           RTUNI_ALPHA, /* U+000d15: MALAYALAM LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000d16: MALAYALAM LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000d17: MALAYALAM LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000d18: MALAYALAM LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000d19: MALAYALAM LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000d1a: MALAYALAM LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000d1b: MALAYALAM LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000d1c: MALAYALAM LETTER JA*/
-                                           RTUNI_ALPHA, /* U+000d1d: MALAYALAM LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+000d1e: MALAYALAM LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000d1f: MALAYALAM LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000d20: MALAYALAM LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000d21: MALAYALAM LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000d22: MALAYALAM LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000d23: MALAYALAM LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000d24: MALAYALAM LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000d25: MALAYALAM LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000d26: MALAYALAM LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000d27: MALAYALAM LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000d28: MALAYALAM LETTER NA*/
-                                                     0, /* U+000d29: */
-                                           RTUNI_ALPHA, /* U+000d2a: MALAYALAM LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000d2b: MALAYALAM LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000d2c: MALAYALAM LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000d2d: MALAYALAM LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000d2e: MALAYALAM LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000d2f: MALAYALAM LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000d30: MALAYALAM LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000d31: MALAYALAM LETTER RRA*/
-                                           RTUNI_ALPHA, /* U+000d32: MALAYALAM LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000d33: MALAYALAM LETTER LLA*/
-                                           RTUNI_ALPHA, /* U+000d34: MALAYALAM LETTER LLLA*/
-                                           RTUNI_ALPHA, /* U+000d35: MALAYALAM LETTER VA*/
-                                           RTUNI_ALPHA, /* U+000d36: MALAYALAM LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000d37: MALAYALAM LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000d38: MALAYALAM LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000d39: MALAYALAM LETTER HA*/
-                                                     0, /* U+000d3a: */
-                                                     0, /* U+000d3b: */
-                                                     0, /* U+000d3c: */
-                                                     0, /* U+000d3d: */
-                                           RTUNI_ALPHA, /* U+000d3e: MALAYALAM VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000d3f: MALAYALAM VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000d40: MALAYALAM VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000d41: MALAYALAM VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000d42: MALAYALAM VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000d43: MALAYALAM VOWEL SIGN VOCALIC R*/
-                                                     0, /* U+000d44: */
-                                                     0, /* U+000d45: */
-                                           RTUNI_ALPHA, /* U+000d46: MALAYALAM VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000d47: MALAYALAM VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000d48: MALAYALAM VOWEL SIGN AI*/
-                                                     0, /* U+000d49: */
-                                           RTUNI_ALPHA, /* U+000d4a: MALAYALAM VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000d4b: MALAYALAM VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000d4c: MALAYALAM VOWEL SIGN AU*/
-                                                     0, /* U+000d4d: MALAYALAM SIGN VIRAMA*/
-                                                     0, /* U+000d4e: */
-                                                     0, /* U+000d4f: */
-                                                     0, /* U+000d50: */
-                                                     0, /* U+000d51: */
-                                                     0, /* U+000d52: */
-                                                     0, /* U+000d53: */
-                                                     0, /* U+000d54: */
-                                                     0, /* U+000d55: */
-                                                     0, /* U+000d56: */
-                                           RTUNI_ALPHA, /* U+000d57: MALAYALAM AU LENGTH MARK*/
-                                                     0, /* U+000d58: */
-                                                     0, /* U+000d59: */
-                                                     0, /* U+000d5a: */
-                                                     0, /* U+000d5b: */
-                                                     0, /* U+000d5c: */
-                                                     0, /* U+000d5d: */
-                                                     0, /* U+000d5e: */
-                                                     0, /* U+000d5f: */
-                                           RTUNI_ALPHA, /* U+000d60: MALAYALAM LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000d61: MALAYALAM LETTER VOCALIC LL*/
-                                                     0, /* U+000d62: */
-                                                     0, /* U+000d63: */
-                                                     0, /* U+000d64: */
-                                                     0, /* U+000d65: */
-                                          RTUNI_DDIGIT, /* U+000d66: MALAYALAM DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000d67: MALAYALAM DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000d68: MALAYALAM DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000d69: MALAYALAM DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000d6a: MALAYALAM DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000d6b: MALAYALAM DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000d6c: MALAYALAM DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000d6d: MALAYALAM DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000d6e: MALAYALAM DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000d6f: MALAYALAM DIGIT NINE*/
-                                                     0, /* U+000d70: */
-                                                     0, /* U+000d71: */
-                                                     0, /* U+000d72: */
-                                                     0, /* U+000d73: */
-                                                     0, /* U+000d74: */
-                                                     0, /* U+000d75: */
-                                                     0, /* U+000d76: */
-                                                     0, /* U+000d77: */
-                                                     0, /* U+000d78: */
-                                                     0, /* U+000d79: */
-                                                     0, /* U+000d7a: */
-                                                     0, /* U+000d7b: */
-                                                     0, /* U+000d7c: */
-                                                     0, /* U+000d7d: */
-                                                     0, /* U+000d7e: */
-                                                     0, /* U+000d7f: */
-                                                     0, /* U+000d80: */
-                                                     0, /* U+000d81: */
-                                           RTUNI_ALPHA, /* U+000d82: SINHALA SIGN ANUSVARAYA*/
-                                           RTUNI_ALPHA, /* U+000d83: SINHALA SIGN VISARGAYA*/
-                                                     0, /* U+000d84: */
-                                           RTUNI_ALPHA, /* U+000d85: SINHALA LETTER AYANNA*/
-                                           RTUNI_ALPHA, /* U+000d86: SINHALA LETTER AAYANNA*/
-                                           RTUNI_ALPHA, /* U+000d87: SINHALA LETTER AEYANNA*/
-                                           RTUNI_ALPHA, /* U+000d88: SINHALA LETTER AEEYANNA*/
-                                           RTUNI_ALPHA, /* U+000d89: SINHALA LETTER IYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8a: SINHALA LETTER IIYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8b: SINHALA LETTER UYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8c: SINHALA LETTER UUYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8d: SINHALA LETTER IRUYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8e: SINHALA LETTER IRUUYANNA*/
-                                           RTUNI_ALPHA, /* U+000d8f: SINHALA LETTER ILUYANNA*/
-                                           RTUNI_ALPHA, /* U+000d90: SINHALA LETTER ILUUYANNA*/
-                                           RTUNI_ALPHA, /* U+000d91: SINHALA LETTER EYANNA*/
-                                           RTUNI_ALPHA, /* U+000d92: SINHALA LETTER EEYANNA*/
-                                           RTUNI_ALPHA, /* U+000d93: SINHALA LETTER AIYANNA*/
-                                           RTUNI_ALPHA, /* U+000d94: SINHALA LETTER OYANNA*/
-                                           RTUNI_ALPHA, /* U+000d95: SINHALA LETTER OOYANNA*/
-                                           RTUNI_ALPHA, /* U+000d96: SINHALA LETTER AUYANNA*/
-                                                     0, /* U+000d97: */
-                                                     0, /* U+000d98: */
-                                                     0, /* U+000d99: */
-                                           RTUNI_ALPHA, /* U+000d9a: SINHALA LETTER ALPAPRAANA KAYANNA*/
-                                           RTUNI_ALPHA, /* U+000d9b: SINHALA LETTER MAHAAPRAANA KAYANNA*/
-                                           RTUNI_ALPHA, /* U+000d9c: SINHALA LETTER ALPAPRAANA GAYANNA*/
-                                           RTUNI_ALPHA, /* U+000d9d: SINHALA LETTER MAHAAPRAANA GAYANNA*/
-                                           RTUNI_ALPHA, /* U+000d9e: SINHALA LETTER KANTAJA NAASIKYAYA*/
-                                           RTUNI_ALPHA, /* U+000d9f: SINHALA LETTER SANYAKA GAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da0: SINHALA LETTER ALPAPRAANA CAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da1: SINHALA LETTER MAHAAPRAANA CAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da2: SINHALA LETTER ALPAPRAANA JAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da3: SINHALA LETTER MAHAAPRAANA JAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da4: SINHALA LETTER TAALUJA NAASIKYAYA*/
-                                           RTUNI_ALPHA, /* U+000da5: SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA*/
-                                           RTUNI_ALPHA, /* U+000da6: SINHALA LETTER SANYAKA JAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da7: SINHALA LETTER ALPAPRAANA TTAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da8: SINHALA LETTER MAHAAPRAANA TTAYANNA*/
-                                           RTUNI_ALPHA, /* U+000da9: SINHALA LETTER ALPAPRAANA DDAYANNA*/
-                                           RTUNI_ALPHA, /* U+000daa: SINHALA LETTER MAHAAPRAANA DDAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dab: SINHALA LETTER MUURDHAJA NAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dac: SINHALA LETTER SANYAKA DDAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dad: SINHALA LETTER ALPAPRAANA TAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dae: SINHALA LETTER MAHAAPRAANA TAYANNA*/
-                                           RTUNI_ALPHA, /* U+000daf: SINHALA LETTER ALPAPRAANA DAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db0: SINHALA LETTER MAHAAPRAANA DAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db1: SINHALA LETTER DANTAJA NAYANNA*/
-                                                     0, /* U+000db2: */
-                                           RTUNI_ALPHA, /* U+000db3: SINHALA LETTER SANYAKA DAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db4: SINHALA LETTER ALPAPRAANA PAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db5: SINHALA LETTER MAHAAPRAANA PAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db6: SINHALA LETTER ALPAPRAANA BAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db7: SINHALA LETTER MAHAAPRAANA BAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db8: SINHALA LETTER MAYANNA*/
-                                           RTUNI_ALPHA, /* U+000db9: SINHALA LETTER AMBA BAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dba: SINHALA LETTER YAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dbb: SINHALA LETTER RAYANNA*/
-                                                     0, /* U+000dbc: */
-                                           RTUNI_ALPHA, /* U+000dbd: SINHALA LETTER DANTAJA LAYANNA*/
-                                                     0, /* U+000dbe: */
-                                                     0, /* U+000dbf: */
-                                           RTUNI_ALPHA, /* U+000dc0: SINHALA LETTER VAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc1: SINHALA LETTER TAALUJA SAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc2: SINHALA LETTER MUURDHAJA SAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc3: SINHALA LETTER DANTAJA SAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc4: SINHALA LETTER HAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc5: SINHALA LETTER MUURDHAJA LAYANNA*/
-                                           RTUNI_ALPHA, /* U+000dc6: SINHALA LETTER FAYANNA*/
-                                                     0, /* U+000dc7: */
-                                                     0, /* U+000dc8: */
-                                                     0, /* U+000dc9: */
-                                                     0, /* U+000dca: SINHALA SIGN AL-LAKUNA*/
-                                                     0, /* U+000dcb: */
-                                                     0, /* U+000dcc: */
-                                                     0, /* U+000dcd: */
-                                                     0, /* U+000dce: */
-                                           RTUNI_ALPHA, /* U+000dcf: SINHALA VOWEL SIGN AELA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd0: SINHALA VOWEL SIGN KETTI AEDA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd1: SINHALA VOWEL SIGN DIGA AEDA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd2: SINHALA VOWEL SIGN KETTI IS-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd3: SINHALA VOWEL SIGN DIGA IS-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd4: SINHALA VOWEL SIGN KETTI PAA-PILLA*/
-                                                     0, /* U+000dd5: */
-                                           RTUNI_ALPHA, /* U+000dd6: SINHALA VOWEL SIGN DIGA PAA-PILLA*/
-                                                     0, /* U+000dd7: */
-                                           RTUNI_ALPHA, /* U+000dd8: SINHALA VOWEL SIGN GAETTA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dd9: SINHALA VOWEL SIGN KOMBUVA*/
-                                           RTUNI_ALPHA, /* U+000dda: SINHALA VOWEL SIGN DIGA KOMBUVA*/
-                                           RTUNI_ALPHA, /* U+000ddb: SINHALA VOWEL SIGN KOMBU DEKA*/
-                                           RTUNI_ALPHA, /* U+000ddc: SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000ddd: SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000dde: SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA*/
-                                           RTUNI_ALPHA, /* U+000ddf: SINHALA VOWEL SIGN GAYANUKITTA*/
-                                                     0, /* U+000de0: */
-                                                     0, /* U+000de1: */
-                                                     0, /* U+000de2: */
-                                                     0, /* U+000de3: */
-                                                     0, /* U+000de4: */
-                                                     0, /* U+000de5: */
-                                                     0, /* U+000de6: */
-                                                     0, /* U+000de7: */
-                                                     0, /* U+000de8: */
-                                                     0, /* U+000de9: */
-                                                     0, /* U+000dea: */
-                                                     0, /* U+000deb: */
-                                                     0, /* U+000dec: */
-                                                     0, /* U+000ded: */
-                                                     0, /* U+000dee: */
-                                                     0, /* U+000def: */
-                                                     0, /* U+000df0: */
-                                                     0, /* U+000df1: */
-                                           RTUNI_ALPHA, /* U+000df2: SINHALA VOWEL SIGN DIGA GAETTA-PILLA*/
-                                           RTUNI_ALPHA, /* U+000df3: SINHALA VOWEL SIGN DIGA GAYANUKITTA*/
-                                                     0, /* U+000df4: SINHALA PUNCTUATION KUNDDALIYA*/
-                                                     0, /* U+000df5: */
-                                                     0, /* U+000df6: */
-                                                     0, /* U+000df7: */
-                                                     0, /* U+000df8: */
-                                                     0, /* U+000df9: */
-                                                     0, /* U+000dfa: */
-                                                     0, /* U+000dfb: */
-                                                     0, /* U+000dfc: */
-                                                     0, /* U+000dfd: */
-                                                     0, /* U+000dfe: */
-                                                     0, /* U+000dff: */
-                                                     0, /* U+000e00: */
-                                           RTUNI_ALPHA, /* U+000e01: THAI CHARACTER KO KAI*/
-                                           RTUNI_ALPHA, /* U+000e02: THAI CHARACTER KHO KHAI*/
-                                           RTUNI_ALPHA, /* U+000e03: THAI CHARACTER KHO KHUAT*/
-                                           RTUNI_ALPHA, /* U+000e04: THAI CHARACTER KHO KHWAI*/
-                                           RTUNI_ALPHA, /* U+000e05: THAI CHARACTER KHO KHON*/
-                                           RTUNI_ALPHA, /* U+000e06: THAI CHARACTER KHO RAKHANG*/
-                                           RTUNI_ALPHA, /* U+000e07: THAI CHARACTER NGO NGU*/
-                                           RTUNI_ALPHA, /* U+000e08: THAI CHARACTER CHO CHAN*/
-                                           RTUNI_ALPHA, /* U+000e09: THAI CHARACTER CHO CHING*/
-                                           RTUNI_ALPHA, /* U+000e0a: THAI CHARACTER CHO CHANG*/
-                                           RTUNI_ALPHA, /* U+000e0b: THAI CHARACTER SO SO*/
-                                           RTUNI_ALPHA, /* U+000e0c: THAI CHARACTER CHO CHOE*/
-                                           RTUNI_ALPHA, /* U+000e0d: THAI CHARACTER YO YING*/
-                                           RTUNI_ALPHA, /* U+000e0e: THAI CHARACTER DO CHADA*/
-                                           RTUNI_ALPHA, /* U+000e0f: THAI CHARACTER TO PATAK*/
-                                           RTUNI_ALPHA, /* U+000e10: THAI CHARACTER THO THAN*/
-                                           RTUNI_ALPHA, /* U+000e11: THAI CHARACTER THO NANGMONTHO*/
-                                           RTUNI_ALPHA, /* U+000e12: THAI CHARACTER THO PHUTHAO*/
-                                           RTUNI_ALPHA, /* U+000e13: THAI CHARACTER NO NEN*/
-                                           RTUNI_ALPHA, /* U+000e14: THAI CHARACTER DO DEK*/
-                                           RTUNI_ALPHA, /* U+000e15: THAI CHARACTER TO TAO*/
-                                           RTUNI_ALPHA, /* U+000e16: THAI CHARACTER THO THUNG*/
-                                           RTUNI_ALPHA, /* U+000e17: THAI CHARACTER THO THAHAN*/
-                                           RTUNI_ALPHA, /* U+000e18: THAI CHARACTER THO THONG*/
-                                           RTUNI_ALPHA, /* U+000e19: THAI CHARACTER NO NU*/
-                                           RTUNI_ALPHA, /* U+000e1a: THAI CHARACTER BO BAIMAI*/
-                                           RTUNI_ALPHA, /* U+000e1b: THAI CHARACTER PO PLA*/
-                                           RTUNI_ALPHA, /* U+000e1c: THAI CHARACTER PHO PHUNG*/
-                                           RTUNI_ALPHA, /* U+000e1d: THAI CHARACTER FO FA*/
-                                           RTUNI_ALPHA, /* U+000e1e: THAI CHARACTER PHO PHAN*/
-                                           RTUNI_ALPHA, /* U+000e1f: THAI CHARACTER FO FAN*/
-                                           RTUNI_ALPHA, /* U+000e20: THAI CHARACTER PHO SAMPHAO*/
-                                           RTUNI_ALPHA, /* U+000e21: THAI CHARACTER MO MA*/
-                                           RTUNI_ALPHA, /* U+000e22: THAI CHARACTER YO YAK*/
-                                           RTUNI_ALPHA, /* U+000e23: THAI CHARACTER RO RUA*/
-                                           RTUNI_ALPHA, /* U+000e24: THAI CHARACTER RU*/
-                                           RTUNI_ALPHA, /* U+000e25: THAI CHARACTER LO LING*/
-                                           RTUNI_ALPHA, /* U+000e26: THAI CHARACTER LU*/
-                                           RTUNI_ALPHA, /* U+000e27: THAI CHARACTER WO WAEN*/
-                                           RTUNI_ALPHA, /* U+000e28: THAI CHARACTER SO SALA*/
-                                           RTUNI_ALPHA, /* U+000e29: THAI CHARACTER SO RUSI*/
-                                           RTUNI_ALPHA, /* U+000e2a: THAI CHARACTER SO SUA*/
-                                           RTUNI_ALPHA, /* U+000e2b: THAI CHARACTER HO HIP*/
-                                           RTUNI_ALPHA, /* U+000e2c: THAI CHARACTER LO CHULA*/
-                                           RTUNI_ALPHA, /* U+000e2d: THAI CHARACTER O ANG*/
-                                           RTUNI_ALPHA, /* U+000e2e: THAI CHARACTER HO NOKHUK*/
-                                           RTUNI_ALPHA, /* U+000e2f: THAI CHARACTER PAIYANNOI*/
-                                           RTUNI_ALPHA, /* U+000e30: THAI CHARACTER SARA A*/
-                                           RTUNI_ALPHA, /* U+000e31: THAI CHARACTER MAI HAN-AKAT*/
-                                           RTUNI_ALPHA, /* U+000e32: THAI CHARACTER SARA AA*/
-                                           RTUNI_ALPHA, /* U+000e33: THAI CHARACTER SARA AM*/
-                                           RTUNI_ALPHA, /* U+000e34: THAI CHARACTER SARA I*/
-                                           RTUNI_ALPHA, /* U+000e35: THAI CHARACTER SARA II*/
-                                           RTUNI_ALPHA, /* U+000e36: THAI CHARACTER SARA UE*/
-                                           RTUNI_ALPHA, /* U+000e37: THAI CHARACTER SARA UEE*/
-                                           RTUNI_ALPHA, /* U+000e38: THAI CHARACTER SARA U*/
-                                           RTUNI_ALPHA, /* U+000e39: THAI CHARACTER SARA UU*/
-                                           RTUNI_ALPHA, /* U+000e3a: THAI CHARACTER PHINTHU*/
-                                                     0, /* U+000e3b: */
-                                                     0, /* U+000e3c: */
-                                                     0, /* U+000e3d: */
-                                                     0, /* U+000e3e: */
-                                                     0, /* U+000e3f: THAI CURRENCY SYMBOL BAHT*/
-                                           RTUNI_ALPHA, /* U+000e40: THAI CHARACTER SARA E*/
-                                           RTUNI_ALPHA, /* U+000e41: THAI CHARACTER SARA AE*/
-                                           RTUNI_ALPHA, /* U+000e42: THAI CHARACTER SARA O*/
-                                           RTUNI_ALPHA, /* U+000e43: THAI CHARACTER SARA AI MAIMUAN*/
-                                           RTUNI_ALPHA, /* U+000e44: THAI CHARACTER SARA AI MAIMALAI*/
-                                           RTUNI_ALPHA, /* U+000e45: THAI CHARACTER LAKKHANGYAO*/
-                                           RTUNI_ALPHA, /* U+000e46: THAI CHARACTER MAIYAMOK*/
-                                                     0, /* U+000e47: THAI CHARACTER MAITAIKHU*/
-                                                     0, /* U+000e48: THAI CHARACTER MAI EK*/
-                                                     0, /* U+000e49: THAI CHARACTER MAI THO*/
-                                                     0, /* U+000e4a: THAI CHARACTER MAI TRI*/
-                                                     0, /* U+000e4b: THAI CHARACTER MAI CHATTAWA*/
-                                                     0, /* U+000e4c: THAI CHARACTER THANTHAKHAT*/
-                                           RTUNI_ALPHA, /* U+000e4d: THAI CHARACTER NIKHAHIT*/
-                                                     0, /* U+000e4e: THAI CHARACTER YAMAKKAN*/
-                                                     0, /* U+000e4f: THAI CHARACTER FONGMAN*/
-                                          RTUNI_DDIGIT, /* U+000e50: THAI DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000e51: THAI DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000e52: THAI DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000e53: THAI DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000e54: THAI DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000e55: THAI DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000e56: THAI DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000e57: THAI DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000e58: THAI DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000e59: THAI DIGIT NINE*/
-                                                     0, /* U+000e5a: THAI CHARACTER ANGKHANKHU*/
-                                                     0, /* U+000e5b: THAI CHARACTER KHOMUT*/
-                                                     0, /* U+000e5c: */
-                                                     0, /* U+000e5d: */
-                                                     0, /* U+000e5e: */
-                                                     0, /* U+000e5f: */
-                                                     0, /* U+000e60: */
-                                                     0, /* U+000e61: */
-                                                     0, /* U+000e62: */
-                                                     0, /* U+000e63: */
-                                                     0, /* U+000e64: */
-                                                     0, /* U+000e65: */
-                                                     0, /* U+000e66: */
-                                                     0, /* U+000e67: */
-                                                     0, /* U+000e68: */
-                                                     0, /* U+000e69: */
-                                                     0, /* U+000e6a: */
-                                                     0, /* U+000e6b: */
-                                                     0, /* U+000e6c: */
-                                                     0, /* U+000e6d: */
-                                                     0, /* U+000e6e: */
-                                                     0, /* U+000e6f: */
-                                                     0, /* U+000e70: */
-                                                     0, /* U+000e71: */
-                                                     0, /* U+000e72: */
-                                                     0, /* U+000e73: */
-                                                     0, /* U+000e74: */
-                                                     0, /* U+000e75: */
-                                                     0, /* U+000e76: */
-                                                     0, /* U+000e77: */
-                                                     0, /* U+000e78: */
-                                                     0, /* U+000e79: */
-                                                     0, /* U+000e7a: */
-                                                     0, /* U+000e7b: */
-                                                     0, /* U+000e7c: */
-                                                     0, /* U+000e7d: */
-                                                     0, /* U+000e7e: */
-                                                     0, /* U+000e7f: */
-                                                     0, /* U+000e80: */
-                                           RTUNI_ALPHA, /* U+000e81: LAO LETTER KO*/
-                                           RTUNI_ALPHA, /* U+000e82: LAO LETTER KHO SUNG*/
-                                                     0, /* U+000e83: */
-                                           RTUNI_ALPHA, /* U+000e84: LAO LETTER KHO TAM*/
-                                                     0, /* U+000e85: */
-                                                     0, /* U+000e86: */
-                                           RTUNI_ALPHA, /* U+000e87: LAO LETTER NGO*/
-                                           RTUNI_ALPHA, /* U+000e88: LAO LETTER CO*/
-                                                     0, /* U+000e89: */
-                                           RTUNI_ALPHA, /* U+000e8a: LAO LETTER SO TAM*/
-                                                     0, /* U+000e8b: */
-                                                     0, /* U+000e8c: */
-                                           RTUNI_ALPHA, /* U+000e8d: LAO LETTER NYO*/
-                                                     0, /* U+000e8e: */
-                                                     0, /* U+000e8f: */
-                                                     0, /* U+000e90: */
-                                                     0, /* U+000e91: */
-                                                     0, /* U+000e92: */
-                                                     0, /* U+000e93: */
-                                           RTUNI_ALPHA, /* U+000e94: LAO LETTER DO*/
-                                           RTUNI_ALPHA, /* U+000e95: LAO LETTER TO*/
-                                           RTUNI_ALPHA, /* U+000e96: LAO LETTER THO SUNG*/
-                                           RTUNI_ALPHA, /* U+000e97: LAO LETTER THO TAM*/
-                                                     0, /* U+000e98: */
-                                           RTUNI_ALPHA, /* U+000e99: LAO LETTER NO*/
-                                           RTUNI_ALPHA, /* U+000e9a: LAO LETTER BO*/
-                                           RTUNI_ALPHA, /* U+000e9b: LAO LETTER PO*/
-                                           RTUNI_ALPHA, /* U+000e9c: LAO LETTER PHO SUNG*/
-                                           RTUNI_ALPHA, /* U+000e9d: LAO LETTER FO TAM*/
-                                           RTUNI_ALPHA, /* U+000e9e: LAO LETTER PHO TAM*/
-                                           RTUNI_ALPHA, /* U+000e9f: LAO LETTER FO SUNG*/
-                                                     0, /* U+000ea0: */
-                                           RTUNI_ALPHA, /* U+000ea1: LAO LETTER MO*/
-                                           RTUNI_ALPHA, /* U+000ea2: LAO LETTER YO*/
-                                           RTUNI_ALPHA, /* U+000ea3: LAO LETTER LO LING*/
-                                                     0, /* U+000ea4: */
-                                           RTUNI_ALPHA, /* U+000ea5: LAO LETTER LO LOOT*/
-                                                     0, /* U+000ea6: */
-                                           RTUNI_ALPHA, /* U+000ea7: LAO LETTER WO*/
-                                                     0, /* U+000ea8: */
-                                                     0, /* U+000ea9: */
-                                           RTUNI_ALPHA, /* U+000eaa: LAO LETTER SO SUNG*/
-                                           RTUNI_ALPHA, /* U+000eab: LAO LETTER HO SUNG*/
-                                                     0, /* U+000eac: */
-                                           RTUNI_ALPHA, /* U+000ead: LAO LETTER O*/
-                                           RTUNI_ALPHA, /* U+000eae: LAO LETTER HO TAM*/
-                                           RTUNI_ALPHA, /* U+000eaf: LAO ELLIPSIS*/
-                                           RTUNI_ALPHA, /* U+000eb0: LAO VOWEL SIGN A*/
-                                           RTUNI_ALPHA, /* U+000eb1: LAO VOWEL SIGN MAI KAN*/
-                                           RTUNI_ALPHA, /* U+000eb2: LAO VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000eb3: LAO VOWEL SIGN AM*/
-                                           RTUNI_ALPHA, /* U+000eb4: LAO VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000eb5: LAO VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000eb6: LAO VOWEL SIGN Y*/
-                                           RTUNI_ALPHA, /* U+000eb7: LAO VOWEL SIGN YY*/
-                                           RTUNI_ALPHA, /* U+000eb8: LAO VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000eb9: LAO VOWEL SIGN UU*/
-                                                     0, /* U+000eba: */
-                                           RTUNI_ALPHA, /* U+000ebb: LAO VOWEL SIGN MAI KON*/
-                                           RTUNI_ALPHA, /* U+000ebc: LAO SEMIVOWEL SIGN LO*/
-                                           RTUNI_ALPHA, /* U+000ebd: LAO SEMIVOWEL SIGN NYO*/
-                                                     0, /* U+000ebe: */
-                                                     0, /* U+000ebf: */
-                                           RTUNI_ALPHA, /* U+000ec0: LAO VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000ec1: LAO VOWEL SIGN EI*/
-                                           RTUNI_ALPHA, /* U+000ec2: LAO VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000ec3: LAO VOWEL SIGN AY*/
-                                           RTUNI_ALPHA, /* U+000ec4: LAO VOWEL SIGN AI*/
-                                                     0, /* U+000ec5: */
-                                           RTUNI_ALPHA, /* U+000ec6: LAO KO LA*/
-                                                     0, /* U+000ec7: */
-                                                     0, /* U+000ec8: LAO TONE MAI EK*/
-                                                     0, /* U+000ec9: LAO TONE MAI THO*/
-                                                     0, /* U+000eca: LAO TONE MAI TI*/
-                                                     0, /* U+000ecb: LAO TONE MAI CATAWA*/
-                                                     0, /* U+000ecc: LAO CANCELLATION MARK*/
-                                           RTUNI_ALPHA, /* U+000ecd: LAO NIGGAHITA*/
-                                                     0, /* U+000ece: */
-                                                     0, /* U+000ecf: */
-                                          RTUNI_DDIGIT, /* U+000ed0: LAO DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000ed1: LAO DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000ed2: LAO DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000ed3: LAO DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000ed4: LAO DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000ed5: LAO DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000ed6: LAO DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000ed7: LAO DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000ed8: LAO DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000ed9: LAO DIGIT NINE*/
-                                                     0, /* U+000eda: */
-                                                     0, /* U+000edb: */
-                                           RTUNI_ALPHA, /* U+000edc: LAO HO NO*/
-                                           RTUNI_ALPHA, /* U+000edd: LAO HO MO*/
-                                                     0, /* U+000ede: */
-                                                     0, /* U+000edf: */
-                                                     0, /* U+000ee0: */
-                                                     0, /* U+000ee1: */
-                                                     0, /* U+000ee2: */
-                                                     0, /* U+000ee3: */
-                                                     0, /* U+000ee4: */
-                                                     0, /* U+000ee5: */
-                                                     0, /* U+000ee6: */
-                                                     0, /* U+000ee7: */
-                                                     0, /* U+000ee8: */
-                                                     0, /* U+000ee9: */
-                                                     0, /* U+000eea: */
-                                                     0, /* U+000eeb: */
-                                                     0, /* U+000eec: */
-                                                     0, /* U+000eed: */
-                                                     0, /* U+000eee: */
-                                                     0, /* U+000eef: */
-                                                     0, /* U+000ef0: */
-                                                     0, /* U+000ef1: */
-                                                     0, /* U+000ef2: */
-                                                     0, /* U+000ef3: */
-                                                     0, /* U+000ef4: */
-                                                     0, /* U+000ef5: */
-                                                     0, /* U+000ef6: */
-                                                     0, /* U+000ef7: */
-                                                     0, /* U+000ef8: */
-                                                     0, /* U+000ef9: */
-                                                     0, /* U+000efa: */
-                                                     0, /* U+000efb: */
-                                                     0, /* U+000efc: */
-                                                     0, /* U+000efd: */
-                                                     0, /* U+000efe: */
-                                                     0, /* U+000eff: */
-                                           RTUNI_ALPHA, /* U+000f00: TIBETAN SYLLABLE OM*/
-                                                     0, /* U+000f01: TIBETAN MARK GTER YIG MGO TRUNCATED A*/
-                                                     0, /* U+000f02: TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA*/
-                                                     0, /* U+000f03: TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA*/
-                                                     0, /* U+000f04: TIBETAN MARK INITIAL YIG MGO MDUN MA*/
-                                                     0, /* U+000f05: TIBETAN MARK CLOSING YIG MGO SGAB MA*/
-                                                     0, /* U+000f06: TIBETAN MARK CARET YIG MGO PHUR SHAD MA*/
-                                                     0, /* U+000f07: TIBETAN MARK YIG MGO TSHEG SHAD MA*/
-                                                     0, /* U+000f08: TIBETAN MARK SBRUL SHAD*/
-                                                     0, /* U+000f09: TIBETAN MARK BSKUR YIG MGO*/
-                                                     0, /* U+000f0a: TIBETAN MARK BKA- SHOG YIG MGO*/
-                                                     0, /* U+000f0b: TIBETAN MARK INTERSYLLABIC TSHEG*/
-                                                     0, /* U+000f0c: TIBETAN MARK DELIMITER TSHEG BSTAR*/
-                                                     0, /* U+000f0d: TIBETAN MARK SHAD*/
-                                                     0, /* U+000f0e: TIBETAN MARK NYIS SHAD*/
-                                                     0, /* U+000f0f: TIBETAN MARK TSHEG SHAD*/
-                                                     0, /* U+000f10: TIBETAN MARK NYIS TSHEG SHAD*/
-                                                     0, /* U+000f11: TIBETAN MARK RIN CHEN SPUNGS SHAD*/
-                                                     0, /* U+000f12: TIBETAN MARK RGYA GRAM SHAD*/
-                                                     0, /* U+000f13: TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN*/
-                                                     0, /* U+000f14: TIBETAN MARK GTER TSHEG*/
-                                                     0, /* U+000f15: TIBETAN LOGOTYPE SIGN CHAD RTAGS*/
-                                                     0, /* U+000f16: TIBETAN LOGOTYPE SIGN LHAG RTAGS*/
-                                                     0, /* U+000f17: TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS*/
-                                                     0, /* U+000f18: TIBETAN ASTROLOGICAL SIGN -KHYUD PA*/
-                                                     0, /* U+000f19: TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS*/
-                                                     0, /* U+000f1a: TIBETAN SIGN RDEL DKAR GCIG*/
-                                                     0, /* U+000f1b: TIBETAN SIGN RDEL DKAR GNYIS*/
-                                                     0, /* U+000f1c: TIBETAN SIGN RDEL DKAR GSUM*/
-                                                     0, /* U+000f1d: TIBETAN SIGN RDEL NAG GCIG*/
-                                                     0, /* U+000f1e: TIBETAN SIGN RDEL NAG GNYIS*/
-                                                     0, /* U+000f1f: TIBETAN SIGN RDEL DKAR RDEL NAG*/
-                                          RTUNI_DDIGIT, /* U+000f20: TIBETAN DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+000f21: TIBETAN DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+000f22: TIBETAN DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+000f23: TIBETAN DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+000f24: TIBETAN DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+000f25: TIBETAN DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+000f26: TIBETAN DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+000f27: TIBETAN DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+000f28: TIBETAN DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+000f29: TIBETAN DIGIT NINE*/
-                                                     0, /* U+000f2a: TIBETAN DIGIT HALF ONE*/
-                                                     0, /* U+000f2b: TIBETAN DIGIT HALF TWO*/
-                                                     0, /* U+000f2c: TIBETAN DIGIT HALF THREE*/
-                                                     0, /* U+000f2d: TIBETAN DIGIT HALF FOUR*/
-                                                     0, /* U+000f2e: TIBETAN DIGIT HALF FIVE*/
-                                                     0, /* U+000f2f: TIBETAN DIGIT HALF SIX*/
-                                                     0, /* U+000f30: TIBETAN DIGIT HALF SEVEN*/
-                                                     0, /* U+000f31: TIBETAN DIGIT HALF EIGHT*/
-                                                     0, /* U+000f32: TIBETAN DIGIT HALF NINE*/
-                                                     0, /* U+000f33: TIBETAN DIGIT HALF ZERO*/
-                                                     0, /* U+000f34: TIBETAN MARK BSDUS RTAGS*/
-                                                     0, /* U+000f35: TIBETAN MARK NGAS BZUNG NYI ZLA*/
-                                                     0, /* U+000f36: TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN*/
-                                                     0, /* U+000f37: TIBETAN MARK NGAS BZUNG SGOR RTAGS*/
-                                                     0, /* U+000f38: TIBETAN MARK CHE MGO*/
-                                                     0, /* U+000f39: TIBETAN MARK TSA -PHRU*/
-                                                     0, /* U+000f3a: TIBETAN MARK GUG RTAGS GYON*/
-                                                     0, /* U+000f3b: TIBETAN MARK GUG RTAGS GYAS*/
-                                                     0, /* U+000f3c: TIBETAN MARK ANG KHANG GYON*/
-                                                     0, /* U+000f3d: TIBETAN MARK ANG KHANG GYAS*/
-                                                     0, /* U+000f3e: TIBETAN SIGN YAR TSHES*/
-                                                     0, /* U+000f3f: TIBETAN SIGN MAR TSHES*/
-                                           RTUNI_ALPHA, /* U+000f40: TIBETAN LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000f41: TIBETAN LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000f42: TIBETAN LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000f43: TIBETAN LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000f44: TIBETAN LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000f45: TIBETAN LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000f46: TIBETAN LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000f47: TIBETAN LETTER JA*/
-                                                     0, /* U+000f48: */
-                                           RTUNI_ALPHA, /* U+000f49: TIBETAN LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000f4a: TIBETAN LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000f4b: TIBETAN LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000f4c: TIBETAN LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000f4d: TIBETAN LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000f4e: TIBETAN LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000f4f: TIBETAN LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000f50: TIBETAN LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000f51: TIBETAN LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000f52: TIBETAN LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000f53: TIBETAN LETTER NA*/
-                                           RTUNI_ALPHA, /* U+000f54: TIBETAN LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000f55: TIBETAN LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000f56: TIBETAN LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000f57: TIBETAN LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000f58: TIBETAN LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000f59: TIBETAN LETTER TSA*/
-                                           RTUNI_ALPHA, /* U+000f5a: TIBETAN LETTER TSHA*/
-                                           RTUNI_ALPHA, /* U+000f5b: TIBETAN LETTER DZA*/
-                                           RTUNI_ALPHA, /* U+000f5c: TIBETAN LETTER DZHA*/
-                                           RTUNI_ALPHA, /* U+000f5d: TIBETAN LETTER WA*/
-                                           RTUNI_ALPHA, /* U+000f5e: TIBETAN LETTER ZHA*/
-                                           RTUNI_ALPHA, /* U+000f5f: TIBETAN LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+000f60: TIBETAN LETTER -A*/
-                                           RTUNI_ALPHA, /* U+000f61: TIBETAN LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000f62: TIBETAN LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000f63: TIBETAN LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000f64: TIBETAN LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000f65: TIBETAN LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000f66: TIBETAN LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000f67: TIBETAN LETTER HA*/
-                                           RTUNI_ALPHA, /* U+000f68: TIBETAN LETTER A*/
-                                           RTUNI_ALPHA, /* U+000f69: TIBETAN LETTER KSSA*/
-                                           RTUNI_ALPHA, /* U+000f6a: TIBETAN LETTER FIXED-FORM RA*/
-                                                     0, /* U+000f6b: */
-                                                     0, /* U+000f6c: */
-                                                     0, /* U+000f6d: */
-                                                     0, /* U+000f6e: */
-                                                     0, /* U+000f6f: */
-                                                     0, /* U+000f70: */
-                                           RTUNI_ALPHA, /* U+000f71: TIBETAN VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+000f72: TIBETAN VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+000f73: TIBETAN VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+000f74: TIBETAN VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+000f75: TIBETAN VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+000f76: TIBETAN VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+000f77: TIBETAN VOWEL SIGN VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+000f78: TIBETAN VOWEL SIGN VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+000f79: TIBETAN VOWEL SIGN VOCALIC LL*/
-                                           RTUNI_ALPHA, /* U+000f7a: TIBETAN VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+000f7b: TIBETAN VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+000f7c: TIBETAN VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+000f7d: TIBETAN VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+000f7e: TIBETAN SIGN RJES SU NGA RO*/
-                                           RTUNI_ALPHA, /* U+000f7f: TIBETAN SIGN RNAM BCAD*/
-                                           RTUNI_ALPHA, /* U+000f80: TIBETAN VOWEL SIGN REVERSED I*/
-                                           RTUNI_ALPHA, /* U+000f81: TIBETAN VOWEL SIGN REVERSED II*/
-                                                     0, /* U+000f82: TIBETAN SIGN NYI ZLA NAA DA*/
-                                                     0, /* U+000f83: TIBETAN SIGN SNA LDAN*/
-                                                     0, /* U+000f84: TIBETAN MARK HALANTA*/
-                                                     0, /* U+000f85: TIBETAN MARK PALUTA*/
-                                                     0, /* U+000f86: TIBETAN SIGN LCI RTAGS*/
-                                                     0, /* U+000f87: TIBETAN SIGN YANG RTAGS*/
-                                           RTUNI_ALPHA, /* U+000f88: TIBETAN SIGN LCE TSA CAN*/
-                                           RTUNI_ALPHA, /* U+000f89: TIBETAN SIGN MCHU CAN*/
-                                           RTUNI_ALPHA, /* U+000f8a: TIBETAN SIGN GRU CAN RGYINGS*/
-                                           RTUNI_ALPHA, /* U+000f8b: TIBETAN SIGN GRU MED RGYINGS*/
-                                                     0, /* U+000f8c: */
-                                                     0, /* U+000f8d: */
-                                                     0, /* U+000f8e: */
-                                                     0, /* U+000f8f: */
-                                           RTUNI_ALPHA, /* U+000f90: TIBETAN SUBJOINED LETTER KA*/
-                                           RTUNI_ALPHA, /* U+000f91: TIBETAN SUBJOINED LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+000f92: TIBETAN SUBJOINED LETTER GA*/
-                                           RTUNI_ALPHA, /* U+000f93: TIBETAN SUBJOINED LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+000f94: TIBETAN SUBJOINED LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+000f95: TIBETAN SUBJOINED LETTER CA*/
-                                           RTUNI_ALPHA, /* U+000f96: TIBETAN SUBJOINED LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+000f97: TIBETAN SUBJOINED LETTER JA*/
-                                                     0, /* U+000f98: */
-                                           RTUNI_ALPHA, /* U+000f99: TIBETAN SUBJOINED LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+000f9a: TIBETAN SUBJOINED LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+000f9b: TIBETAN SUBJOINED LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+000f9c: TIBETAN SUBJOINED LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+000f9d: TIBETAN SUBJOINED LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+000f9e: TIBETAN SUBJOINED LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+000f9f: TIBETAN SUBJOINED LETTER TA*/
-                                           RTUNI_ALPHA, /* U+000fa0: TIBETAN SUBJOINED LETTER THA*/
-                                           RTUNI_ALPHA, /* U+000fa1: TIBETAN SUBJOINED LETTER DA*/
-                                           RTUNI_ALPHA, /* U+000fa2: TIBETAN SUBJOINED LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+000fa3: TIBETAN SUBJOINED LETTER NA*/
-                                           RTUNI_ALPHA, /* U+000fa4: TIBETAN SUBJOINED LETTER PA*/
-                                           RTUNI_ALPHA, /* U+000fa5: TIBETAN SUBJOINED LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+000fa6: TIBETAN SUBJOINED LETTER BA*/
-                                           RTUNI_ALPHA, /* U+000fa7: TIBETAN SUBJOINED LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+000fa8: TIBETAN SUBJOINED LETTER MA*/
-                                           RTUNI_ALPHA, /* U+000fa9: TIBETAN SUBJOINED LETTER TSA*/
-                                           RTUNI_ALPHA, /* U+000faa: TIBETAN SUBJOINED LETTER TSHA*/
-                                           RTUNI_ALPHA, /* U+000fab: TIBETAN SUBJOINED LETTER DZA*/
-                                           RTUNI_ALPHA, /* U+000fac: TIBETAN SUBJOINED LETTER DZHA*/
-                                           RTUNI_ALPHA, /* U+000fad: TIBETAN SUBJOINED LETTER WA*/
-                                           RTUNI_ALPHA, /* U+000fae: TIBETAN SUBJOINED LETTER ZHA*/
-                                           RTUNI_ALPHA, /* U+000faf: TIBETAN SUBJOINED LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+000fb0: TIBETAN SUBJOINED LETTER -A*/
-                                           RTUNI_ALPHA, /* U+000fb1: TIBETAN SUBJOINED LETTER YA*/
-                                           RTUNI_ALPHA, /* U+000fb2: TIBETAN SUBJOINED LETTER RA*/
-                                           RTUNI_ALPHA, /* U+000fb3: TIBETAN SUBJOINED LETTER LA*/
-                                           RTUNI_ALPHA, /* U+000fb4: TIBETAN SUBJOINED LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+000fb5: TIBETAN SUBJOINED LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+000fb6: TIBETAN SUBJOINED LETTER SA*/
-                                           RTUNI_ALPHA, /* U+000fb7: TIBETAN SUBJOINED LETTER HA*/
-                                           RTUNI_ALPHA, /* U+000fb8: TIBETAN SUBJOINED LETTER A*/
-                                           RTUNI_ALPHA, /* U+000fb9: TIBETAN SUBJOINED LETTER KSSA*/
-                                           RTUNI_ALPHA, /* U+000fba: TIBETAN SUBJOINED LETTER FIXED-FORM WA*/
-                                           RTUNI_ALPHA, /* U+000fbb: TIBETAN SUBJOINED LETTER FIXED-FORM YA*/
-                                           RTUNI_ALPHA, /* U+000fbc: TIBETAN SUBJOINED LETTER FIXED-FORM RA*/
-                                                     0, /* U+000fbd: */
-                                                     0, /* U+000fbe: TIBETAN KU RU KHA*/
-                                                     0, /* U+000fbf: TIBETAN KU RU KHA BZHI MIG CAN*/
-                                                     0, /* U+000fc0: TIBETAN CANTILLATION SIGN HEAVY BEAT*/
-                                                     0, /* U+000fc1: TIBETAN CANTILLATION SIGN LIGHT BEAT*/
-                                                     0, /* U+000fc2: TIBETAN CANTILLATION SIGN CANG TE-U*/
-                                                     0, /* U+000fc3: TIBETAN CANTILLATION SIGN SBUB -CHAL*/
-                                                     0, /* U+000fc4: TIBETAN SYMBOL DRIL BU*/
-                                                     0, /* U+000fc5: TIBETAN SYMBOL RDO RJE*/
-                                                     0, /* U+000fc6: TIBETAN SYMBOL PADMA GDAN*/
-                                                     0, /* U+000fc7: TIBETAN SYMBOL RDO RJE RGYA GRAM*/
-                                                     0, /* U+000fc8: TIBETAN SYMBOL PHUR PA*/
-                                                     0, /* U+000fc9: TIBETAN SYMBOL NOR BU*/
-                                                     0, /* U+000fca: TIBETAN SYMBOL NOR BU NYIS -KHYIL*/
-                                                     0, /* U+000fcb: TIBETAN SYMBOL NOR BU GSUM -KHYIL*/
-                                                     0, /* U+000fcc: TIBETAN SYMBOL NOR BU BZHI -KHYIL*/
-                                                     0, /* U+000fcd: */
-                                                     0, /* U+000fce: */
-                                                     0, /* U+000fcf: TIBETAN SIGN RDEL NAG GSUM*/
-                                                     0, /* U+000fd0: TIBETAN MARK BSKA- SHOG GI MGO RGYAN*/
-                                                     0, /* U+000fd1: TIBETAN MARK MNYAM YIG GI MGO RGYAN*/
-                                                     0, /* U+000fd2: */
-                                                     0, /* U+000fd3: */
-                                                     0, /* U+000fd4: */
-                                                     0, /* U+000fd5: */
-                                                     0, /* U+000fd6: */
-                                                     0, /* U+000fd7: */
-                                                     0, /* U+000fd8: */
-                                                     0, /* U+000fd9: */
-                                                     0, /* U+000fda: */
-                                                     0, /* U+000fdb: */
-                                                     0, /* U+000fdc: */
-                                                     0, /* U+000fdd: */
-                                                     0, /* U+000fde: */
-                                                     0, /* U+000fdf: */
-                                                     0, /* U+000fe0: */
-                                                     0, /* U+000fe1: */
-                                                     0, /* U+000fe2: */
-                                                     0, /* U+000fe3: */
-                                                     0, /* U+000fe4: */
-                                                     0, /* U+000fe5: */
-                                                     0, /* U+000fe6: */
-                                                     0, /* U+000fe7: */
-                                                     0, /* U+000fe8: */
-                                                     0, /* U+000fe9: */
-                                                     0, /* U+000fea: */
-                                                     0, /* U+000feb: */
-                                                     0, /* U+000fec: */
-                                                     0, /* U+000fed: */
-                                                     0, /* U+000fee: */
-                                                     0, /* U+000fef: */
-                                                     0, /* U+000ff0: */
-                                                     0, /* U+000ff1: */
-                                                     0, /* U+000ff2: */
-                                                     0, /* U+000ff3: */
-                                                     0, /* U+000ff4: */
-                                                     0, /* U+000ff5: */
-                                                     0, /* U+000ff6: */
-                                                     0, /* U+000ff7: */
-                                                     0, /* U+000ff8: */
-                                                     0, /* U+000ff9: */
-                                                     0, /* U+000ffa: */
-                                                     0, /* U+000ffb: */
-                                                     0, /* U+000ffc: */
-                                                     0, /* U+000ffd: */
-                                                     0, /* U+000ffe: */
-                                                     0, /* U+000fff: */
-                                           RTUNI_ALPHA, /* U+001000: MYANMAR LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001001: MYANMAR LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+001002: MYANMAR LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001003: MYANMAR LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+001004: MYANMAR LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001005: MYANMAR LETTER CA*/
-                                           RTUNI_ALPHA, /* U+001006: MYANMAR LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+001007: MYANMAR LETTER JA*/
-                                           RTUNI_ALPHA, /* U+001008: MYANMAR LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+001009: MYANMAR LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+00100a: MYANMAR LETTER NNYA*/
-                                           RTUNI_ALPHA, /* U+00100b: MYANMAR LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+00100c: MYANMAR LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+00100d: MYANMAR LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+00100e: MYANMAR LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+00100f: MYANMAR LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+001010: MYANMAR LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001011: MYANMAR LETTER THA*/
-                                           RTUNI_ALPHA, /* U+001012: MYANMAR LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001013: MYANMAR LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+001014: MYANMAR LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001015: MYANMAR LETTER PA*/
-                                           RTUNI_ALPHA, /* U+001016: MYANMAR LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+001017: MYANMAR LETTER BA*/
-                                           RTUNI_ALPHA, /* U+001018: MYANMAR LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+001019: MYANMAR LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00101a: MYANMAR LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00101b: MYANMAR LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00101c: MYANMAR LETTER LA*/
-                                           RTUNI_ALPHA, /* U+00101d: MYANMAR LETTER WA*/
-                                           RTUNI_ALPHA, /* U+00101e: MYANMAR LETTER SA*/
-                                           RTUNI_ALPHA, /* U+00101f: MYANMAR LETTER HA*/
-                                           RTUNI_ALPHA, /* U+001020: MYANMAR LETTER LLA*/
-                                           RTUNI_ALPHA, /* U+001021: MYANMAR LETTER A*/
-                                                     0, /* U+001022: */
-                                           RTUNI_ALPHA, /* U+001023: MYANMAR LETTER I*/
-                                           RTUNI_ALPHA, /* U+001024: MYANMAR LETTER II*/
-                                           RTUNI_ALPHA, /* U+001025: MYANMAR LETTER U*/
-                                           RTUNI_ALPHA, /* U+001026: MYANMAR LETTER UU*/
-                                           RTUNI_ALPHA, /* U+001027: MYANMAR LETTER E*/
-                                                     0, /* U+001028: */
-                                           RTUNI_ALPHA, /* U+001029: MYANMAR LETTER O*/
-                                           RTUNI_ALPHA, /* U+00102a: MYANMAR LETTER AU*/
-                                                     0, /* U+00102b: */
-                                           RTUNI_ALPHA, /* U+00102c: MYANMAR VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+00102d: MYANMAR VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+00102e: MYANMAR VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+00102f: MYANMAR VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+001030: MYANMAR VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+001031: MYANMAR VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+001032: MYANMAR VOWEL SIGN AI*/
-                                                     0, /* U+001033: */
-                                                     0, /* U+001034: */
-                                                     0, /* U+001035: */
-                                           RTUNI_ALPHA, /* U+001036: MYANMAR SIGN ANUSVARA*/
-                                                     0, /* U+001037: MYANMAR SIGN DOT BELOW*/
-                                           RTUNI_ALPHA, /* U+001038: MYANMAR SIGN VISARGA*/
-                                                     0, /* U+001039: MYANMAR SIGN VIRAMA*/
-                                                     0, /* U+00103a: */
-                                                     0, /* U+00103b: */
-                                                     0, /* U+00103c: */
-                                                     0, /* U+00103d: */
-                                                     0, /* U+00103e: */
-                                                     0, /* U+00103f: */
-                                          RTUNI_DDIGIT, /* U+001040: MYANMAR DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+001041: MYANMAR DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+001042: MYANMAR DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+001043: MYANMAR DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+001044: MYANMAR DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+001045: MYANMAR DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+001046: MYANMAR DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+001047: MYANMAR DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+001048: MYANMAR DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+001049: MYANMAR DIGIT NINE*/
-                                                     0, /* U+00104a: MYANMAR SIGN LITTLE SECTION*/
-                                                     0, /* U+00104b: MYANMAR SIGN SECTION*/
-                                                     0, /* U+00104c: MYANMAR SYMBOL LOCATIVE*/
-                                                     0, /* U+00104d: MYANMAR SYMBOL COMPLETED*/
-                                                     0, /* U+00104e: MYANMAR SYMBOL AFOREMENTIONED*/
-                                                     0, /* U+00104f: MYANMAR SYMBOL GENITIVE*/
-                                           RTUNI_ALPHA, /* U+001050: MYANMAR LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+001051: MYANMAR LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+001052: MYANMAR LETTER VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+001053: MYANMAR LETTER VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+001054: MYANMAR LETTER VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+001055: MYANMAR LETTER VOCALIC LL*/
-                                           RTUNI_ALPHA, /* U+001056: MYANMAR VOWEL SIGN VOCALIC R*/
-                                           RTUNI_ALPHA, /* U+001057: MYANMAR VOWEL SIGN VOCALIC RR*/
-                                           RTUNI_ALPHA, /* U+001058: MYANMAR VOWEL SIGN VOCALIC L*/
-                                           RTUNI_ALPHA, /* U+001059: MYANMAR VOWEL SIGN VOCALIC LL*/
-                                                     0, /* U+00105a: */
-                                                     0, /* U+00105b: */
-                                                     0, /* U+00105c: */
-                                                     0, /* U+00105d: */
-                                                     0, /* U+00105e: */
-                                                     0, /* U+00105f: */
-                                                     0, /* U+001060: */
-                                                     0, /* U+001061: */
-                                                     0, /* U+001062: */
-                                                     0, /* U+001063: */
-                                                     0, /* U+001064: */
-                                                     0, /* U+001065: */
-                                                     0, /* U+001066: */
-                                                     0, /* U+001067: */
-                                                     0, /* U+001068: */
-                                                     0, /* U+001069: */
-                                                     0, /* U+00106a: */
-                                                     0, /* U+00106b: */
-                                                     0, /* U+00106c: */
-                                                     0, /* U+00106d: */
-                                                     0, /* U+00106e: */
-                                                     0, /* U+00106f: */
-                                                     0, /* U+001070: */
-                                                     0, /* U+001071: */
-                                                     0, /* U+001072: */
-                                                     0, /* U+001073: */
-                                                     0, /* U+001074: */
-                                                     0, /* U+001075: */
-                                                     0, /* U+001076: */
-                                                     0, /* U+001077: */
-                                                     0, /* U+001078: */
-                                                     0, /* U+001079: */
-                                                     0, /* U+00107a: */
-                                                     0, /* U+00107b: */
-                                                     0, /* U+00107c: */
-                                                     0, /* U+00107d: */
-                                                     0, /* U+00107e: */
-                                                     0, /* U+00107f: */
-                                                     0, /* U+001080: */
-                                                     0, /* U+001081: */
-                                                     0, /* U+001082: */
-                                                     0, /* U+001083: */
-                                                     0, /* U+001084: */
-                                                     0, /* U+001085: */
-                                                     0, /* U+001086: */
-                                                     0, /* U+001087: */
-                                                     0, /* U+001088: */
-                                                     0, /* U+001089: */
-                                                     0, /* U+00108a: */
-                                                     0, /* U+00108b: */
-                                                     0, /* U+00108c: */
-                                                     0, /* U+00108d: */
-                                                     0, /* U+00108e: */
-                                                     0, /* U+00108f: */
-                                                     0, /* U+001090: */
-                                                     0, /* U+001091: */
-                                                     0, /* U+001092: */
-                                                     0, /* U+001093: */
-                                                     0, /* U+001094: */
-                                                     0, /* U+001095: */
-                                                     0, /* U+001096: */
-                                                     0, /* U+001097: */
-                                                     0, /* U+001098: */
-                                                     0, /* U+001099: */
-                                                     0, /* U+00109a: */
-                                                     0, /* U+00109b: */
-                                                     0, /* U+00109c: */
-                                                     0, /* U+00109d: */
-                                                     0, /* U+00109e: */
-                                                     0, /* U+00109f: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
-                                                     0, /* U+0010c6: */
-                                                     0, /* U+0010c7: */
-                                                     0, /* U+0010c8: */
-                                                     0, /* U+0010c9: */
-                                                     0, /* U+0010ca: */
-                                                     0, /* U+0010cb: */
-                                                     0, /* U+0010cc: */
-                                                     0, /* U+0010cd: */
-                                                     0, /* U+0010ce: */
-                                                     0, /* U+0010cf: */
-                                           RTUNI_ALPHA, /* U+0010d0: GEORGIAN LETTER AN*/
-                                           RTUNI_ALPHA, /* U+0010d1: GEORGIAN LETTER BAN*/
-                                           RTUNI_ALPHA, /* U+0010d2: GEORGIAN LETTER GAN*/
-                                           RTUNI_ALPHA, /* U+0010d3: GEORGIAN LETTER DON*/
-                                           RTUNI_ALPHA, /* U+0010d4: GEORGIAN LETTER EN*/
-                                           RTUNI_ALPHA, /* U+0010d5: GEORGIAN LETTER VIN*/
-                                           RTUNI_ALPHA, /* U+0010d6: GEORGIAN LETTER ZEN*/
-                                           RTUNI_ALPHA, /* U+0010d7: GEORGIAN LETTER TAN*/
-                                           RTUNI_ALPHA, /* U+0010d8: GEORGIAN LETTER IN*/
-                                           RTUNI_ALPHA, /* U+0010d9: GEORGIAN LETTER KAN*/
-                                           RTUNI_ALPHA, /* U+0010da: GEORGIAN LETTER LAS*/
-                                           RTUNI_ALPHA, /* U+0010db: GEORGIAN LETTER MAN*/
-                                           RTUNI_ALPHA, /* U+0010dc: GEORGIAN LETTER NAR*/
-                                           RTUNI_ALPHA, /* U+0010dd: GEORGIAN LETTER ON*/
-                                           RTUNI_ALPHA, /* U+0010de: GEORGIAN LETTER PAR*/
-                                           RTUNI_ALPHA, /* U+0010df: GEORGIAN LETTER ZHAR*/
-                                           RTUNI_ALPHA, /* U+0010e0: GEORGIAN LETTER RAE*/
-                                           RTUNI_ALPHA, /* U+0010e1: GEORGIAN LETTER SAN*/
-                                           RTUNI_ALPHA, /* U+0010e2: GEORGIAN LETTER TAR*/
-                                           RTUNI_ALPHA, /* U+0010e3: GEORGIAN LETTER UN*/
-                                           RTUNI_ALPHA, /* U+0010e4: GEORGIAN LETTER PHAR*/
-                                           RTUNI_ALPHA, /* U+0010e5: GEORGIAN LETTER KHAR*/
-                                           RTUNI_ALPHA, /* U+0010e6: GEORGIAN LETTER GHAN*/
-                                           RTUNI_ALPHA, /* U+0010e7: GEORGIAN LETTER QAR*/
-                                           RTUNI_ALPHA, /* U+0010e8: GEORGIAN LETTER SHIN*/
-                                           RTUNI_ALPHA, /* U+0010e9: GEORGIAN LETTER CHIN*/
-                                           RTUNI_ALPHA, /* U+0010ea: GEORGIAN LETTER CAN*/
-                                           RTUNI_ALPHA, /* U+0010eb: GEORGIAN LETTER JIL*/
-                                           RTUNI_ALPHA, /* U+0010ec: GEORGIAN LETTER CIL*/
-                                           RTUNI_ALPHA, /* U+0010ed: GEORGIAN LETTER CHAR*/
-                                           RTUNI_ALPHA, /* U+0010ee: GEORGIAN LETTER XAN*/
-                                           RTUNI_ALPHA, /* U+0010ef: GEORGIAN LETTER JHAN*/
-                                           RTUNI_ALPHA, /* U+0010f0: GEORGIAN LETTER HAE*/
-                                           RTUNI_ALPHA, /* U+0010f1: GEORGIAN LETTER HE*/
-                                           RTUNI_ALPHA, /* U+0010f2: GEORGIAN LETTER HIE*/
-                                           RTUNI_ALPHA, /* U+0010f3: GEORGIAN LETTER WE*/
-                                           RTUNI_ALPHA, /* U+0010f4: GEORGIAN LETTER HAR*/
-                                           RTUNI_ALPHA, /* U+0010f5: GEORGIAN LETTER HOE*/
-                                           RTUNI_ALPHA, /* U+0010f6: GEORGIAN LETTER FI*/
-                                           RTUNI_ALPHA, /* U+0010f7: GEORGIAN LETTER YN*/
-                                           RTUNI_ALPHA, /* U+0010f8: GEORGIAN LETTER ELIFI*/
-                                           RTUNI_ALPHA, /* U+0010f9: GEORGIAN LETTER TURNED GAN*/
-                                           RTUNI_ALPHA, /* U+0010fa: GEORGIAN LETTER AIN*/
-                                                     0, /* U+0010fb: GEORGIAN PARAGRAPH SEPARATOR*/
-                                           RTUNI_ALPHA, /* U+0010fc: MODIFIER LETTER GEORGIAN NAR*/
-                                                     0, /* U+0010fd: */
-                                                     0, /* U+0010fe: */
-                                                     0, /* U+0010ff: */
-                                           RTUNI_ALPHA, /* U+001100: HANGUL CHOSEONG KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001101: HANGUL CHOSEONG SSANGKIYEOK*/
-                                           RTUNI_ALPHA, /* U+001102: HANGUL CHOSEONG NIEUN*/
-                                           RTUNI_ALPHA, /* U+001103: HANGUL CHOSEONG TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001104: HANGUL CHOSEONG SSANGTIKEUT*/
-                                           RTUNI_ALPHA, /* U+001105: HANGUL CHOSEONG RIEUL*/
-                                           RTUNI_ALPHA, /* U+001106: HANGUL CHOSEONG MIEUM*/
-                                           RTUNI_ALPHA, /* U+001107: HANGUL CHOSEONG PIEUP*/
-                                           RTUNI_ALPHA, /* U+001108: HANGUL CHOSEONG SSANGPIEUP*/
-                                           RTUNI_ALPHA, /* U+001109: HANGUL CHOSEONG SIOS*/
-                                           RTUNI_ALPHA, /* U+00110a: HANGUL CHOSEONG SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+00110b: HANGUL CHOSEONG IEUNG*/
-                                           RTUNI_ALPHA, /* U+00110c: HANGUL CHOSEONG CIEUC*/
-                                           RTUNI_ALPHA, /* U+00110d: HANGUL CHOSEONG SSANGCIEUC*/
-                                           RTUNI_ALPHA, /* U+00110e: HANGUL CHOSEONG CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+00110f: HANGUL CHOSEONG KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+001110: HANGUL CHOSEONG THIEUTH*/
-                                           RTUNI_ALPHA, /* U+001111: HANGUL CHOSEONG PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+001112: HANGUL CHOSEONG HIEUH*/
-                                           RTUNI_ALPHA, /* U+001113: HANGUL CHOSEONG NIEUN-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001114: HANGUL CHOSEONG SSANGNIEUN*/
-                                           RTUNI_ALPHA, /* U+001115: HANGUL CHOSEONG NIEUN-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001116: HANGUL CHOSEONG NIEUN-PIEUP*/
-                                           RTUNI_ALPHA, /* U+001117: HANGUL CHOSEONG TIKEUT-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001118: HANGUL CHOSEONG RIEUL-NIEUN*/
-                                           RTUNI_ALPHA, /* U+001119: HANGUL CHOSEONG SSANGRIEUL*/
-                                           RTUNI_ALPHA, /* U+00111a: HANGUL CHOSEONG RIEUL-HIEUH*/
-                                           RTUNI_ALPHA, /* U+00111b: HANGUL CHOSEONG KAPYEOUNRIEUL*/
-                                           RTUNI_ALPHA, /* U+00111c: HANGUL CHOSEONG MIEUM-PIEUP*/
-                                           RTUNI_ALPHA, /* U+00111d: HANGUL CHOSEONG KAPYEOUNMIEUM*/
-                                           RTUNI_ALPHA, /* U+00111e: HANGUL CHOSEONG PIEUP-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00111f: HANGUL CHOSEONG PIEUP-NIEUN*/
-                                           RTUNI_ALPHA, /* U+001120: HANGUL CHOSEONG PIEUP-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001121: HANGUL CHOSEONG PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+001122: HANGUL CHOSEONG PIEUP-SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001123: HANGUL CHOSEONG PIEUP-SIOS-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001124: HANGUL CHOSEONG PIEUP-SIOS-PIEUP*/
-                                           RTUNI_ALPHA, /* U+001125: HANGUL CHOSEONG PIEUP-SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+001126: HANGUL CHOSEONG PIEUP-SIOS-CIEUC*/
-                                           RTUNI_ALPHA, /* U+001127: HANGUL CHOSEONG PIEUP-CIEUC*/
-                                           RTUNI_ALPHA, /* U+001128: HANGUL CHOSEONG PIEUP-CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+001129: HANGUL CHOSEONG PIEUP-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00112a: HANGUL CHOSEONG PIEUP-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00112b: HANGUL CHOSEONG KAPYEOUNPIEUP*/
-                                           RTUNI_ALPHA, /* U+00112c: HANGUL CHOSEONG KAPYEOUNSSANGPIEUP*/
-                                           RTUNI_ALPHA, /* U+00112d: HANGUL CHOSEONG SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00112e: HANGUL CHOSEONG SIOS-NIEUN*/
-                                           RTUNI_ALPHA, /* U+00112f: HANGUL CHOSEONG SIOS-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001130: HANGUL CHOSEONG SIOS-RIEUL*/
-                                           RTUNI_ALPHA, /* U+001131: HANGUL CHOSEONG SIOS-MIEUM*/
-                                           RTUNI_ALPHA, /* U+001132: HANGUL CHOSEONG SIOS-PIEUP*/
-                                           RTUNI_ALPHA, /* U+001133: HANGUL CHOSEONG SIOS-PIEUP-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001134: HANGUL CHOSEONG SIOS-SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+001135: HANGUL CHOSEONG SIOS-IEUNG*/
-                                           RTUNI_ALPHA, /* U+001136: HANGUL CHOSEONG SIOS-CIEUC*/
-                                           RTUNI_ALPHA, /* U+001137: HANGUL CHOSEONG SIOS-CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+001138: HANGUL CHOSEONG SIOS-KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+001139: HANGUL CHOSEONG SIOS-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00113a: HANGUL CHOSEONG SIOS-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00113b: HANGUL CHOSEONG SIOS-HIEUH*/
-                                           RTUNI_ALPHA, /* U+00113c: HANGUL CHOSEONG CHITUEUMSIOS*/
-                                           RTUNI_ALPHA, /* U+00113d: HANGUL CHOSEONG CHITUEUMSSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+00113e: HANGUL CHOSEONG CEONGCHIEUMSIOS*/
-                                           RTUNI_ALPHA, /* U+00113f: HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+001140: HANGUL CHOSEONG PANSIOS*/
-                                           RTUNI_ALPHA, /* U+001141: HANGUL CHOSEONG IEUNG-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+001142: HANGUL CHOSEONG IEUNG-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+001143: HANGUL CHOSEONG IEUNG-MIEUM*/
-                                           RTUNI_ALPHA, /* U+001144: HANGUL CHOSEONG IEUNG-PIEUP*/
-                                           RTUNI_ALPHA, /* U+001145: HANGUL CHOSEONG IEUNG-SIOS*/
-                                           RTUNI_ALPHA, /* U+001146: HANGUL CHOSEONG IEUNG-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+001147: HANGUL CHOSEONG SSANGIEUNG*/
-                                           RTUNI_ALPHA, /* U+001148: HANGUL CHOSEONG IEUNG-CIEUC*/
-                                           RTUNI_ALPHA, /* U+001149: HANGUL CHOSEONG IEUNG-CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+00114a: HANGUL CHOSEONG IEUNG-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00114b: HANGUL CHOSEONG IEUNG-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00114c: HANGUL CHOSEONG YESIEUNG*/
-                                           RTUNI_ALPHA, /* U+00114d: HANGUL CHOSEONG CIEUC-IEUNG*/
-                                           RTUNI_ALPHA, /* U+00114e: HANGUL CHOSEONG CHITUEUMCIEUC*/
-                                           RTUNI_ALPHA, /* U+00114f: HANGUL CHOSEONG CHITUEUMSSANGCIEUC*/
-                                           RTUNI_ALPHA, /* U+001150: HANGUL CHOSEONG CEONGCHIEUMCIEUC*/
-                                           RTUNI_ALPHA, /* U+001151: HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC*/
-                                           RTUNI_ALPHA, /* U+001152: HANGUL CHOSEONG CHIEUCH-KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+001153: HANGUL CHOSEONG CHIEUCH-HIEUH*/
-                                           RTUNI_ALPHA, /* U+001154: HANGUL CHOSEONG CHITUEUMCHIEUCH*/
-                                           RTUNI_ALPHA, /* U+001155: HANGUL CHOSEONG CEONGCHIEUMCHIEUCH*/
-                                           RTUNI_ALPHA, /* U+001156: HANGUL CHOSEONG PHIEUPH-PIEUP*/
-                                           RTUNI_ALPHA, /* U+001157: HANGUL CHOSEONG KAPYEOUNPHIEUPH*/
-                                           RTUNI_ALPHA, /* U+001158: HANGUL CHOSEONG SSANGHIEUH*/
-                                           RTUNI_ALPHA, /* U+001159: HANGUL CHOSEONG YEORINHIEUH*/
-                                                     0, /* U+00115a: */
-                                                     0, /* U+00115b: */
-                                                     0, /* U+00115c: */
-                                                     0, /* U+00115d: */
-                                                     0, /* U+00115e: */
-                                           RTUNI_ALPHA, /* U+00115f: HANGUL CHOSEONG FILLER*/
-                                           RTUNI_ALPHA, /* U+001160: HANGUL JUNGSEONG FILLER*/
-                                           RTUNI_ALPHA, /* U+001161: HANGUL JUNGSEONG A*/
-                                           RTUNI_ALPHA, /* U+001162: HANGUL JUNGSEONG AE*/
-                                           RTUNI_ALPHA, /* U+001163: HANGUL JUNGSEONG YA*/
-                                           RTUNI_ALPHA, /* U+001164: HANGUL JUNGSEONG YAE*/
-                                           RTUNI_ALPHA, /* U+001165: HANGUL JUNGSEONG EO*/
-                                           RTUNI_ALPHA, /* U+001166: HANGUL JUNGSEONG E*/
-                                           RTUNI_ALPHA, /* U+001167: HANGUL JUNGSEONG YEO*/
-                                           RTUNI_ALPHA, /* U+001168: HANGUL JUNGSEONG YE*/
-                                           RTUNI_ALPHA, /* U+001169: HANGUL JUNGSEONG O*/
-                                           RTUNI_ALPHA, /* U+00116a: HANGUL JUNGSEONG WA*/
-                                           RTUNI_ALPHA, /* U+00116b: HANGUL JUNGSEONG WAE*/
-                                           RTUNI_ALPHA, /* U+00116c: HANGUL JUNGSEONG OE*/
-                                           RTUNI_ALPHA, /* U+00116d: HANGUL JUNGSEONG YO*/
-                                           RTUNI_ALPHA, /* U+00116e: HANGUL JUNGSEONG U*/
-                                           RTUNI_ALPHA, /* U+00116f: HANGUL JUNGSEONG WEO*/
-                                           RTUNI_ALPHA, /* U+001170: HANGUL JUNGSEONG WE*/
-                                           RTUNI_ALPHA, /* U+001171: HANGUL JUNGSEONG WI*/
-                                           RTUNI_ALPHA, /* U+001172: HANGUL JUNGSEONG YU*/
-                                           RTUNI_ALPHA, /* U+001173: HANGUL JUNGSEONG EU*/
-                                           RTUNI_ALPHA, /* U+001174: HANGUL JUNGSEONG YI*/
-                                           RTUNI_ALPHA, /* U+001175: HANGUL JUNGSEONG I*/
-                                           RTUNI_ALPHA, /* U+001176: HANGUL JUNGSEONG A-O*/
-                                           RTUNI_ALPHA, /* U+001177: HANGUL JUNGSEONG A-U*/
-                                           RTUNI_ALPHA, /* U+001178: HANGUL JUNGSEONG YA-O*/
-                                           RTUNI_ALPHA, /* U+001179: HANGUL JUNGSEONG YA-YO*/
-                                           RTUNI_ALPHA, /* U+00117a: HANGUL JUNGSEONG EO-O*/
-                                           RTUNI_ALPHA, /* U+00117b: HANGUL JUNGSEONG EO-U*/
-                                           RTUNI_ALPHA, /* U+00117c: HANGUL JUNGSEONG EO-EU*/
-                                           RTUNI_ALPHA, /* U+00117d: HANGUL JUNGSEONG YEO-O*/
-                                           RTUNI_ALPHA, /* U+00117e: HANGUL JUNGSEONG YEO-U*/
-                                           RTUNI_ALPHA, /* U+00117f: HANGUL JUNGSEONG O-EO*/
-                                           RTUNI_ALPHA, /* U+001180: HANGUL JUNGSEONG O-E*/
-                                           RTUNI_ALPHA, /* U+001181: HANGUL JUNGSEONG O-YE*/
-                                           RTUNI_ALPHA, /* U+001182: HANGUL JUNGSEONG O-O*/
-                                           RTUNI_ALPHA, /* U+001183: HANGUL JUNGSEONG O-U*/
-                                           RTUNI_ALPHA, /* U+001184: HANGUL JUNGSEONG YO-YA*/
-                                           RTUNI_ALPHA, /* U+001185: HANGUL JUNGSEONG YO-YAE*/
-                                           RTUNI_ALPHA, /* U+001186: HANGUL JUNGSEONG YO-YEO*/
-                                           RTUNI_ALPHA, /* U+001187: HANGUL JUNGSEONG YO-O*/
-                                           RTUNI_ALPHA, /* U+001188: HANGUL JUNGSEONG YO-I*/
-                                           RTUNI_ALPHA, /* U+001189: HANGUL JUNGSEONG U-A*/
-                                           RTUNI_ALPHA, /* U+00118a: HANGUL JUNGSEONG U-AE*/
-                                           RTUNI_ALPHA, /* U+00118b: HANGUL JUNGSEONG U-EO-EU*/
-                                           RTUNI_ALPHA, /* U+00118c: HANGUL JUNGSEONG U-YE*/
-                                           RTUNI_ALPHA, /* U+00118d: HANGUL JUNGSEONG U-U*/
-                                           RTUNI_ALPHA, /* U+00118e: HANGUL JUNGSEONG YU-A*/
-                                           RTUNI_ALPHA, /* U+00118f: HANGUL JUNGSEONG YU-EO*/
-                                           RTUNI_ALPHA, /* U+001190: HANGUL JUNGSEONG YU-E*/
-                                           RTUNI_ALPHA, /* U+001191: HANGUL JUNGSEONG YU-YEO*/
-                                           RTUNI_ALPHA, /* U+001192: HANGUL JUNGSEONG YU-YE*/
-                                           RTUNI_ALPHA, /* U+001193: HANGUL JUNGSEONG YU-U*/
-                                           RTUNI_ALPHA, /* U+001194: HANGUL JUNGSEONG YU-I*/
-                                           RTUNI_ALPHA, /* U+001195: HANGUL JUNGSEONG EU-U*/
-                                           RTUNI_ALPHA, /* U+001196: HANGUL JUNGSEONG EU-EU*/
-                                           RTUNI_ALPHA, /* U+001197: HANGUL JUNGSEONG YI-U*/
-                                           RTUNI_ALPHA, /* U+001198: HANGUL JUNGSEONG I-A*/
-                                           RTUNI_ALPHA, /* U+001199: HANGUL JUNGSEONG I-YA*/
-                                           RTUNI_ALPHA, /* U+00119a: HANGUL JUNGSEONG I-O*/
-                                           RTUNI_ALPHA, /* U+00119b: HANGUL JUNGSEONG I-U*/
-                                           RTUNI_ALPHA, /* U+00119c: HANGUL JUNGSEONG I-EU*/
-                                           RTUNI_ALPHA, /* U+00119d: HANGUL JUNGSEONG I-ARAEA*/
-                                           RTUNI_ALPHA, /* U+00119e: HANGUL JUNGSEONG ARAEA*/
-                                           RTUNI_ALPHA, /* U+00119f: HANGUL JUNGSEONG ARAEA-EO*/
-                                           RTUNI_ALPHA, /* U+0011a0: HANGUL JUNGSEONG ARAEA-U*/
-                                           RTUNI_ALPHA, /* U+0011a1: HANGUL JUNGSEONG ARAEA-I*/
-                                           RTUNI_ALPHA, /* U+0011a2: HANGUL JUNGSEONG SSANGARAEA*/
-                                                     0, /* U+0011a3: */
-                                                     0, /* U+0011a4: */
-                                                     0, /* U+0011a5: */
-                                                     0, /* U+0011a6: */
-                                                     0, /* U+0011a7: */
-                                           RTUNI_ALPHA, /* U+0011a8: HANGUL JONGSEONG KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011a9: HANGUL JONGSEONG SSANGKIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011aa: HANGUL JONGSEONG KIYEOK-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011ab: HANGUL JONGSEONG NIEUN*/
-                                           RTUNI_ALPHA, /* U+0011ac: HANGUL JONGSEONG NIEUN-CIEUC*/
-                                           RTUNI_ALPHA, /* U+0011ad: HANGUL JONGSEONG NIEUN-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011ae: HANGUL JONGSEONG TIKEUT*/
-                                           RTUNI_ALPHA, /* U+0011af: HANGUL JONGSEONG RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011b0: HANGUL JONGSEONG RIEUL-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011b1: HANGUL JONGSEONG RIEUL-MIEUM*/
-                                           RTUNI_ALPHA, /* U+0011b2: HANGUL JONGSEONG RIEUL-PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011b3: HANGUL JONGSEONG RIEUL-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011b4: HANGUL JONGSEONG RIEUL-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+0011b5: HANGUL JONGSEONG RIEUL-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+0011b6: HANGUL JONGSEONG RIEUL-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011b7: HANGUL JONGSEONG MIEUM*/
-                                           RTUNI_ALPHA, /* U+0011b8: HANGUL JONGSEONG PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011b9: HANGUL JONGSEONG PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011ba: HANGUL JONGSEONG SIOS*/
-                                           RTUNI_ALPHA, /* U+0011bb: HANGUL JONGSEONG SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+0011bc: HANGUL JONGSEONG IEUNG*/
-                                           RTUNI_ALPHA, /* U+0011bd: HANGUL JONGSEONG CIEUC*/
-                                           RTUNI_ALPHA, /* U+0011be: HANGUL JONGSEONG CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+0011bf: HANGUL JONGSEONG KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+0011c0: HANGUL JONGSEONG THIEUTH*/
-                                           RTUNI_ALPHA, /* U+0011c1: HANGUL JONGSEONG PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+0011c2: HANGUL JONGSEONG HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011c3: HANGUL JONGSEONG KIYEOK-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011c4: HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011c5: HANGUL JONGSEONG NIEUN-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011c6: HANGUL JONGSEONG NIEUN-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+0011c7: HANGUL JONGSEONG NIEUN-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011c8: HANGUL JONGSEONG NIEUN-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+0011c9: HANGUL JONGSEONG NIEUN-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+0011ca: HANGUL JONGSEONG TIKEUT-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011cb: HANGUL JONGSEONG TIKEUT-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011cc: HANGUL JONGSEONG RIEUL-KIYEOK-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011cd: HANGUL JONGSEONG RIEUL-NIEUN*/
-                                           RTUNI_ALPHA, /* U+0011ce: HANGUL JONGSEONG RIEUL-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+0011cf: HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011d0: HANGUL JONGSEONG SSANGRIEUL*/
-                                           RTUNI_ALPHA, /* U+0011d1: HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011d2: HANGUL JONGSEONG RIEUL-MIEUM-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011d3: HANGUL JONGSEONG RIEUL-PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011d4: HANGUL JONGSEONG RIEUL-PIEUP-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011d5: HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP*/
-                                           RTUNI_ALPHA, /* U+0011d6: HANGUL JONGSEONG RIEUL-SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+0011d7: HANGUL JONGSEONG RIEUL-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+0011d8: HANGUL JONGSEONG RIEUL-KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+0011d9: HANGUL JONGSEONG RIEUL-YEORINHIEUH*/
-                                           RTUNI_ALPHA, /* U+0011da: HANGUL JONGSEONG MIEUM-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011db: HANGUL JONGSEONG MIEUM-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011dc: HANGUL JONGSEONG MIEUM-PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011dd: HANGUL JONGSEONG MIEUM-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011de: HANGUL JONGSEONG MIEUM-SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+0011df: HANGUL JONGSEONG MIEUM-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+0011e0: HANGUL JONGSEONG MIEUM-CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+0011e1: HANGUL JONGSEONG MIEUM-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011e2: HANGUL JONGSEONG KAPYEOUNMIEUM*/
-                                           RTUNI_ALPHA, /* U+0011e3: HANGUL JONGSEONG PIEUP-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011e4: HANGUL JONGSEONG PIEUP-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+0011e5: HANGUL JONGSEONG PIEUP-HIEUH*/
-                                           RTUNI_ALPHA, /* U+0011e6: HANGUL JONGSEONG KAPYEOUNPIEUP*/
-                                           RTUNI_ALPHA, /* U+0011e7: HANGUL JONGSEONG SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011e8: HANGUL JONGSEONG SIOS-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+0011e9: HANGUL JONGSEONG SIOS-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011ea: HANGUL JONGSEONG SIOS-PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011eb: HANGUL JONGSEONG PANSIOS*/
-                                           RTUNI_ALPHA, /* U+0011ec: HANGUL JONGSEONG IEUNG-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011ed: HANGUL JONGSEONG IEUNG-SSANGKIYEOK*/
-                                           RTUNI_ALPHA, /* U+0011ee: HANGUL JONGSEONG SSANGIEUNG*/
-                                           RTUNI_ALPHA, /* U+0011ef: HANGUL JONGSEONG IEUNG-KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+0011f0: HANGUL JONGSEONG YESIEUNG*/
-                                           RTUNI_ALPHA, /* U+0011f1: HANGUL JONGSEONG YESIEUNG-SIOS*/
-                                           RTUNI_ALPHA, /* U+0011f2: HANGUL JONGSEONG YESIEUNG-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+0011f3: HANGUL JONGSEONG PHIEUPH-PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011f4: HANGUL JONGSEONG KAPYEOUNPHIEUPH*/
-                                           RTUNI_ALPHA, /* U+0011f5: HANGUL JONGSEONG HIEUH-NIEUN*/
-                                           RTUNI_ALPHA, /* U+0011f6: HANGUL JONGSEONG HIEUH-RIEUL*/
-                                           RTUNI_ALPHA, /* U+0011f7: HANGUL JONGSEONG HIEUH-MIEUM*/
-                                           RTUNI_ALPHA, /* U+0011f8: HANGUL JONGSEONG HIEUH-PIEUP*/
-                                           RTUNI_ALPHA, /* U+0011f9: HANGUL JONGSEONG YEORINHIEUH*/
-                                                     0, /* U+0011fa: */
-                                                     0, /* U+0011fb: */
-                                                     0, /* U+0011fc: */
-                                                     0, /* U+0011fd: */
-                                                     0, /* U+0011fe: */
-                                                     0, /* U+0011ff: */
-                                           RTUNI_ALPHA, /* U+001200: ETHIOPIC SYLLABLE HA*/
-                                           RTUNI_ALPHA, /* U+001201: ETHIOPIC SYLLABLE HU*/
-                                           RTUNI_ALPHA, /* U+001202: ETHIOPIC SYLLABLE HI*/
-                                           RTUNI_ALPHA, /* U+001203: ETHIOPIC SYLLABLE HAA*/
-                                           RTUNI_ALPHA, /* U+001204: ETHIOPIC SYLLABLE HEE*/
-                                           RTUNI_ALPHA, /* U+001205: ETHIOPIC SYLLABLE HE*/
-                                           RTUNI_ALPHA, /* U+001206: ETHIOPIC SYLLABLE HO*/
-                                           RTUNI_ALPHA, /* U+001207: ETHIOPIC SYLLABLE HOA*/
-                                           RTUNI_ALPHA, /* U+001208: ETHIOPIC SYLLABLE LA*/
-                                           RTUNI_ALPHA, /* U+001209: ETHIOPIC SYLLABLE LU*/
-                                           RTUNI_ALPHA, /* U+00120a: ETHIOPIC SYLLABLE LI*/
-                                           RTUNI_ALPHA, /* U+00120b: ETHIOPIC SYLLABLE LAA*/
-                                           RTUNI_ALPHA, /* U+00120c: ETHIOPIC SYLLABLE LEE*/
-                                           RTUNI_ALPHA, /* U+00120d: ETHIOPIC SYLLABLE LE*/
-                                           RTUNI_ALPHA, /* U+00120e: ETHIOPIC SYLLABLE LO*/
-                                           RTUNI_ALPHA, /* U+00120f: ETHIOPIC SYLLABLE LWA*/
-                                           RTUNI_ALPHA, /* U+001210: ETHIOPIC SYLLABLE HHA*/
-                                           RTUNI_ALPHA, /* U+001211: ETHIOPIC SYLLABLE HHU*/
-                                           RTUNI_ALPHA, /* U+001212: ETHIOPIC SYLLABLE HHI*/
-                                           RTUNI_ALPHA, /* U+001213: ETHIOPIC SYLLABLE HHAA*/
-                                           RTUNI_ALPHA, /* U+001214: ETHIOPIC SYLLABLE HHEE*/
-                                           RTUNI_ALPHA, /* U+001215: ETHIOPIC SYLLABLE HHE*/
-                                           RTUNI_ALPHA, /* U+001216: ETHIOPIC SYLLABLE HHO*/
-                                           RTUNI_ALPHA, /* U+001217: ETHIOPIC SYLLABLE HHWA*/
-                                           RTUNI_ALPHA, /* U+001218: ETHIOPIC SYLLABLE MA*/
-                                           RTUNI_ALPHA, /* U+001219: ETHIOPIC SYLLABLE MU*/
-                                           RTUNI_ALPHA, /* U+00121a: ETHIOPIC SYLLABLE MI*/
-                                           RTUNI_ALPHA, /* U+00121b: ETHIOPIC SYLLABLE MAA*/
-                                           RTUNI_ALPHA, /* U+00121c: ETHIOPIC SYLLABLE MEE*/
-                                           RTUNI_ALPHA, /* U+00121d: ETHIOPIC SYLLABLE ME*/
-                                           RTUNI_ALPHA, /* U+00121e: ETHIOPIC SYLLABLE MO*/
-                                           RTUNI_ALPHA, /* U+00121f: ETHIOPIC SYLLABLE MWA*/
-                                           RTUNI_ALPHA, /* U+001220: ETHIOPIC SYLLABLE SZA*/
-                                           RTUNI_ALPHA, /* U+001221: ETHIOPIC SYLLABLE SZU*/
-                                           RTUNI_ALPHA, /* U+001222: ETHIOPIC SYLLABLE SZI*/
-                                           RTUNI_ALPHA, /* U+001223: ETHIOPIC SYLLABLE SZAA*/
-                                           RTUNI_ALPHA, /* U+001224: ETHIOPIC SYLLABLE SZEE*/
-                                           RTUNI_ALPHA, /* U+001225: ETHIOPIC SYLLABLE SZE*/
-                                           RTUNI_ALPHA, /* U+001226: ETHIOPIC SYLLABLE SZO*/
-                                           RTUNI_ALPHA, /* U+001227: ETHIOPIC SYLLABLE SZWA*/
-                                           RTUNI_ALPHA, /* U+001228: ETHIOPIC SYLLABLE RA*/
-                                           RTUNI_ALPHA, /* U+001229: ETHIOPIC SYLLABLE RU*/
-                                           RTUNI_ALPHA, /* U+00122a: ETHIOPIC SYLLABLE RI*/
-                                           RTUNI_ALPHA, /* U+00122b: ETHIOPIC SYLLABLE RAA*/
-                                           RTUNI_ALPHA, /* U+00122c: ETHIOPIC SYLLABLE REE*/
-                                           RTUNI_ALPHA, /* U+00122d: ETHIOPIC SYLLABLE RE*/
-                                           RTUNI_ALPHA, /* U+00122e: ETHIOPIC SYLLABLE RO*/
-                                           RTUNI_ALPHA, /* U+00122f: ETHIOPIC SYLLABLE RWA*/
-                                           RTUNI_ALPHA, /* U+001230: ETHIOPIC SYLLABLE SA*/
-                                           RTUNI_ALPHA, /* U+001231: ETHIOPIC SYLLABLE SU*/
-                                           RTUNI_ALPHA, /* U+001232: ETHIOPIC SYLLABLE SI*/
-                                           RTUNI_ALPHA, /* U+001233: ETHIOPIC SYLLABLE SAA*/
-                                           RTUNI_ALPHA, /* U+001234: ETHIOPIC SYLLABLE SEE*/
-                                           RTUNI_ALPHA, /* U+001235: ETHIOPIC SYLLABLE SE*/
-                                           RTUNI_ALPHA, /* U+001236: ETHIOPIC SYLLABLE SO*/
-                                           RTUNI_ALPHA, /* U+001237: ETHIOPIC SYLLABLE SWA*/
-                                           RTUNI_ALPHA, /* U+001238: ETHIOPIC SYLLABLE SHA*/
-                                           RTUNI_ALPHA, /* U+001239: ETHIOPIC SYLLABLE SHU*/
-                                           RTUNI_ALPHA, /* U+00123a: ETHIOPIC SYLLABLE SHI*/
-                                           RTUNI_ALPHA, /* U+00123b: ETHIOPIC SYLLABLE SHAA*/
-                                           RTUNI_ALPHA, /* U+00123c: ETHIOPIC SYLLABLE SHEE*/
-                                           RTUNI_ALPHA, /* U+00123d: ETHIOPIC SYLLABLE SHE*/
-                                           RTUNI_ALPHA, /* U+00123e: ETHIOPIC SYLLABLE SHO*/
-                                           RTUNI_ALPHA, /* U+00123f: ETHIOPIC SYLLABLE SHWA*/
-                                           RTUNI_ALPHA, /* U+001240: ETHIOPIC SYLLABLE QA*/
-                                           RTUNI_ALPHA, /* U+001241: ETHIOPIC SYLLABLE QU*/
-                                           RTUNI_ALPHA, /* U+001242: ETHIOPIC SYLLABLE QI*/
-                                           RTUNI_ALPHA, /* U+001243: ETHIOPIC SYLLABLE QAA*/
-                                           RTUNI_ALPHA, /* U+001244: ETHIOPIC SYLLABLE QEE*/
-                                           RTUNI_ALPHA, /* U+001245: ETHIOPIC SYLLABLE QE*/
-                                           RTUNI_ALPHA, /* U+001246: ETHIOPIC SYLLABLE QO*/
-                                           RTUNI_ALPHA, /* U+001247: ETHIOPIC SYLLABLE QOA*/
-                                           RTUNI_ALPHA, /* U+001248: ETHIOPIC SYLLABLE QWA*/
-                                                     0, /* U+001249: */
-                                           RTUNI_ALPHA, /* U+00124a: ETHIOPIC SYLLABLE QWI*/
-                                           RTUNI_ALPHA, /* U+00124b: ETHIOPIC SYLLABLE QWAA*/
-                                           RTUNI_ALPHA, /* U+00124c: ETHIOPIC SYLLABLE QWEE*/
-                                           RTUNI_ALPHA, /* U+00124d: ETHIOPIC SYLLABLE QWE*/
-                                                     0, /* U+00124e: */
-                                                     0, /* U+00124f: */
-                                           RTUNI_ALPHA, /* U+001250: ETHIOPIC SYLLABLE QHA*/
-                                           RTUNI_ALPHA, /* U+001251: ETHIOPIC SYLLABLE QHU*/
-                                           RTUNI_ALPHA, /* U+001252: ETHIOPIC SYLLABLE QHI*/
-                                           RTUNI_ALPHA, /* U+001253: ETHIOPIC SYLLABLE QHAA*/
-                                           RTUNI_ALPHA, /* U+001254: ETHIOPIC SYLLABLE QHEE*/
-                                           RTUNI_ALPHA, /* U+001255: ETHIOPIC SYLLABLE QHE*/
-                                           RTUNI_ALPHA, /* U+001256: ETHIOPIC SYLLABLE QHO*/
-                                                     0, /* U+001257: */
-                                           RTUNI_ALPHA, /* U+001258: ETHIOPIC SYLLABLE QHWA*/
-                                                     0, /* U+001259: */
-                                           RTUNI_ALPHA, /* U+00125a: ETHIOPIC SYLLABLE QHWI*/
-                                           RTUNI_ALPHA, /* U+00125b: ETHIOPIC SYLLABLE QHWAA*/
-                                           RTUNI_ALPHA, /* U+00125c: ETHIOPIC SYLLABLE QHWEE*/
-                                           RTUNI_ALPHA, /* U+00125d: ETHIOPIC SYLLABLE QHWE*/
-                                                     0, /* U+00125e: */
-                                                     0, /* U+00125f: */
-                                           RTUNI_ALPHA, /* U+001260: ETHIOPIC SYLLABLE BA*/
-                                           RTUNI_ALPHA, /* U+001261: ETHIOPIC SYLLABLE BU*/
-                                           RTUNI_ALPHA, /* U+001262: ETHIOPIC SYLLABLE BI*/
-                                           RTUNI_ALPHA, /* U+001263: ETHIOPIC SYLLABLE BAA*/
-                                           RTUNI_ALPHA, /* U+001264: ETHIOPIC SYLLABLE BEE*/
-                                           RTUNI_ALPHA, /* U+001265: ETHIOPIC SYLLABLE BE*/
-                                           RTUNI_ALPHA, /* U+001266: ETHIOPIC SYLLABLE BO*/
-                                           RTUNI_ALPHA, /* U+001267: ETHIOPIC SYLLABLE BWA*/
-                                           RTUNI_ALPHA, /* U+001268: ETHIOPIC SYLLABLE VA*/
-                                           RTUNI_ALPHA, /* U+001269: ETHIOPIC SYLLABLE VU*/
-                                           RTUNI_ALPHA, /* U+00126a: ETHIOPIC SYLLABLE VI*/
-                                           RTUNI_ALPHA, /* U+00126b: ETHIOPIC SYLLABLE VAA*/
-                                           RTUNI_ALPHA, /* U+00126c: ETHIOPIC SYLLABLE VEE*/
-                                           RTUNI_ALPHA, /* U+00126d: ETHIOPIC SYLLABLE VE*/
-                                           RTUNI_ALPHA, /* U+00126e: ETHIOPIC SYLLABLE VO*/
-                                           RTUNI_ALPHA, /* U+00126f: ETHIOPIC SYLLABLE VWA*/
-                                           RTUNI_ALPHA, /* U+001270: ETHIOPIC SYLLABLE TA*/
-                                           RTUNI_ALPHA, /* U+001271: ETHIOPIC SYLLABLE TU*/
-                                           RTUNI_ALPHA, /* U+001272: ETHIOPIC SYLLABLE TI*/
-                                           RTUNI_ALPHA, /* U+001273: ETHIOPIC SYLLABLE TAA*/
-                                           RTUNI_ALPHA, /* U+001274: ETHIOPIC SYLLABLE TEE*/
-                                           RTUNI_ALPHA, /* U+001275: ETHIOPIC SYLLABLE TE*/
-                                           RTUNI_ALPHA, /* U+001276: ETHIOPIC SYLLABLE TO*/
-                                           RTUNI_ALPHA, /* U+001277: ETHIOPIC SYLLABLE TWA*/
-                                           RTUNI_ALPHA, /* U+001278: ETHIOPIC SYLLABLE CA*/
-                                           RTUNI_ALPHA, /* U+001279: ETHIOPIC SYLLABLE CU*/
-                                           RTUNI_ALPHA, /* U+00127a: ETHIOPIC SYLLABLE CI*/
-                                           RTUNI_ALPHA, /* U+00127b: ETHIOPIC SYLLABLE CAA*/
-                                           RTUNI_ALPHA, /* U+00127c: ETHIOPIC SYLLABLE CEE*/
-                                           RTUNI_ALPHA, /* U+00127d: ETHIOPIC SYLLABLE CE*/
-                                           RTUNI_ALPHA, /* U+00127e: ETHIOPIC SYLLABLE CO*/
-                                           RTUNI_ALPHA, /* U+00127f: ETHIOPIC SYLLABLE CWA*/
-                                           RTUNI_ALPHA, /* U+001280: ETHIOPIC SYLLABLE XA*/
-                                           RTUNI_ALPHA, /* U+001281: ETHIOPIC SYLLABLE XU*/
-                                           RTUNI_ALPHA, /* U+001282: ETHIOPIC SYLLABLE XI*/
-                                           RTUNI_ALPHA, /* U+001283: ETHIOPIC SYLLABLE XAA*/
-                                           RTUNI_ALPHA, /* U+001284: ETHIOPIC SYLLABLE XEE*/
-                                           RTUNI_ALPHA, /* U+001285: ETHIOPIC SYLLABLE XE*/
-                                           RTUNI_ALPHA, /* U+001286: ETHIOPIC SYLLABLE XO*/
-                                           RTUNI_ALPHA, /* U+001287: ETHIOPIC SYLLABLE XOA*/
-                                           RTUNI_ALPHA, /* U+001288: ETHIOPIC SYLLABLE XWA*/
-                                                     0, /* U+001289: */
-                                           RTUNI_ALPHA, /* U+00128a: ETHIOPIC SYLLABLE XWI*/
-                                           RTUNI_ALPHA, /* U+00128b: ETHIOPIC SYLLABLE XWAA*/
-                                           RTUNI_ALPHA, /* U+00128c: ETHIOPIC SYLLABLE XWEE*/
-                                           RTUNI_ALPHA, /* U+00128d: ETHIOPIC SYLLABLE XWE*/
-                                                     0, /* U+00128e: */
-                                                     0, /* U+00128f: */
-                                           RTUNI_ALPHA, /* U+001290: ETHIOPIC SYLLABLE NA*/
-                                           RTUNI_ALPHA, /* U+001291: ETHIOPIC SYLLABLE NU*/
-                                           RTUNI_ALPHA, /* U+001292: ETHIOPIC SYLLABLE NI*/
-                                           RTUNI_ALPHA, /* U+001293: ETHIOPIC SYLLABLE NAA*/
-                                           RTUNI_ALPHA, /* U+001294: ETHIOPIC SYLLABLE NEE*/
-                                           RTUNI_ALPHA, /* U+001295: ETHIOPIC SYLLABLE NE*/
-                                           RTUNI_ALPHA, /* U+001296: ETHIOPIC SYLLABLE NO*/
-                                           RTUNI_ALPHA, /* U+001297: ETHIOPIC SYLLABLE NWA*/
-                                           RTUNI_ALPHA, /* U+001298: ETHIOPIC SYLLABLE NYA*/
-                                           RTUNI_ALPHA, /* U+001299: ETHIOPIC SYLLABLE NYU*/
-                                           RTUNI_ALPHA, /* U+00129a: ETHIOPIC SYLLABLE NYI*/
-                                           RTUNI_ALPHA, /* U+00129b: ETHIOPIC SYLLABLE NYAA*/
-                                           RTUNI_ALPHA, /* U+00129c: ETHIOPIC SYLLABLE NYEE*/
-                                           RTUNI_ALPHA, /* U+00129d: ETHIOPIC SYLLABLE NYE*/
-                                           RTUNI_ALPHA, /* U+00129e: ETHIOPIC SYLLABLE NYO*/
-                                           RTUNI_ALPHA, /* U+00129f: ETHIOPIC SYLLABLE NYWA*/
-                                           RTUNI_ALPHA, /* U+0012a0: ETHIOPIC SYLLABLE GLOTTAL A*/
-                                           RTUNI_ALPHA, /* U+0012a1: ETHIOPIC SYLLABLE GLOTTAL U*/
-                                           RTUNI_ALPHA, /* U+0012a2: ETHIOPIC SYLLABLE GLOTTAL I*/
-                                           RTUNI_ALPHA, /* U+0012a3: ETHIOPIC SYLLABLE GLOTTAL AA*/
-                                           RTUNI_ALPHA, /* U+0012a4: ETHIOPIC SYLLABLE GLOTTAL EE*/
-                                           RTUNI_ALPHA, /* U+0012a5: ETHIOPIC SYLLABLE GLOTTAL E*/
-                                           RTUNI_ALPHA, /* U+0012a6: ETHIOPIC SYLLABLE GLOTTAL O*/
-                                           RTUNI_ALPHA, /* U+0012a7: ETHIOPIC SYLLABLE GLOTTAL WA*/
-                                           RTUNI_ALPHA, /* U+0012a8: ETHIOPIC SYLLABLE KA*/
-                                           RTUNI_ALPHA, /* U+0012a9: ETHIOPIC SYLLABLE KU*/
-                                           RTUNI_ALPHA, /* U+0012aa: ETHIOPIC SYLLABLE KI*/
-                                           RTUNI_ALPHA, /* U+0012ab: ETHIOPIC SYLLABLE KAA*/
-                                           RTUNI_ALPHA, /* U+0012ac: ETHIOPIC SYLLABLE KEE*/
-                                           RTUNI_ALPHA, /* U+0012ad: ETHIOPIC SYLLABLE KE*/
-                                           RTUNI_ALPHA, /* U+0012ae: ETHIOPIC SYLLABLE KO*/
-                                           RTUNI_ALPHA, /* U+0012af: ETHIOPIC SYLLABLE KOA*/
-                                           RTUNI_ALPHA, /* U+0012b0: ETHIOPIC SYLLABLE KWA*/
-                                                     0, /* U+0012b1: */
-                                           RTUNI_ALPHA, /* U+0012b2: ETHIOPIC SYLLABLE KWI*/
-                                           RTUNI_ALPHA, /* U+0012b3: ETHIOPIC SYLLABLE KWAA*/
-                                           RTUNI_ALPHA, /* U+0012b4: ETHIOPIC SYLLABLE KWEE*/
-                                           RTUNI_ALPHA, /* U+0012b5: ETHIOPIC SYLLABLE KWE*/
-                                                     0, /* U+0012b6: */
-                                                     0, /* U+0012b7: */
-                                           RTUNI_ALPHA, /* U+0012b8: ETHIOPIC SYLLABLE KXA*/
-                                           RTUNI_ALPHA, /* U+0012b9: ETHIOPIC SYLLABLE KXU*/
-                                           RTUNI_ALPHA, /* U+0012ba: ETHIOPIC SYLLABLE KXI*/
-                                           RTUNI_ALPHA, /* U+0012bb: ETHIOPIC SYLLABLE KXAA*/
-                                           RTUNI_ALPHA, /* U+0012bc: ETHIOPIC SYLLABLE KXEE*/
-                                           RTUNI_ALPHA, /* U+0012bd: ETHIOPIC SYLLABLE KXE*/
-                                           RTUNI_ALPHA, /* U+0012be: ETHIOPIC SYLLABLE KXO*/
-                                                     0, /* U+0012bf: */
-                                           RTUNI_ALPHA, /* U+0012c0: ETHIOPIC SYLLABLE KXWA*/
-                                                     0, /* U+0012c1: */
-                                           RTUNI_ALPHA, /* U+0012c2: ETHIOPIC SYLLABLE KXWI*/
-                                           RTUNI_ALPHA, /* U+0012c3: ETHIOPIC SYLLABLE KXWAA*/
-                                           RTUNI_ALPHA, /* U+0012c4: ETHIOPIC SYLLABLE KXWEE*/
-                                           RTUNI_ALPHA, /* U+0012c5: ETHIOPIC SYLLABLE KXWE*/
-                                                     0, /* U+0012c6: */
-                                                     0, /* U+0012c7: */
-                                           RTUNI_ALPHA, /* U+0012c8: ETHIOPIC SYLLABLE WA*/
-                                           RTUNI_ALPHA, /* U+0012c9: ETHIOPIC SYLLABLE WU*/
-                                           RTUNI_ALPHA, /* U+0012ca: ETHIOPIC SYLLABLE WI*/
-                                           RTUNI_ALPHA, /* U+0012cb: ETHIOPIC SYLLABLE WAA*/
-                                           RTUNI_ALPHA, /* U+0012cc: ETHIOPIC SYLLABLE WEE*/
-                                           RTUNI_ALPHA, /* U+0012cd: ETHIOPIC SYLLABLE WE*/
-                                           RTUNI_ALPHA, /* U+0012ce: ETHIOPIC SYLLABLE WO*/
-                                           RTUNI_ALPHA, /* U+0012cf: ETHIOPIC SYLLABLE WOA*/
-                                           RTUNI_ALPHA, /* U+0012d0: ETHIOPIC SYLLABLE PHARYNGEAL A*/
-                                           RTUNI_ALPHA, /* U+0012d1: ETHIOPIC SYLLABLE PHARYNGEAL U*/
-                                           RTUNI_ALPHA, /* U+0012d2: ETHIOPIC SYLLABLE PHARYNGEAL I*/
-                                           RTUNI_ALPHA, /* U+0012d3: ETHIOPIC SYLLABLE PHARYNGEAL AA*/
-                                           RTUNI_ALPHA, /* U+0012d4: ETHIOPIC SYLLABLE PHARYNGEAL EE*/
-                                           RTUNI_ALPHA, /* U+0012d5: ETHIOPIC SYLLABLE PHARYNGEAL E*/
-                                           RTUNI_ALPHA, /* U+0012d6: ETHIOPIC SYLLABLE PHARYNGEAL O*/
-                                                     0, /* U+0012d7: */
-                                           RTUNI_ALPHA, /* U+0012d8: ETHIOPIC SYLLABLE ZA*/
-                                           RTUNI_ALPHA, /* U+0012d9: ETHIOPIC SYLLABLE ZU*/
-                                           RTUNI_ALPHA, /* U+0012da: ETHIOPIC SYLLABLE ZI*/
-                                           RTUNI_ALPHA, /* U+0012db: ETHIOPIC SYLLABLE ZAA*/
-                                           RTUNI_ALPHA, /* U+0012dc: ETHIOPIC SYLLABLE ZEE*/
-                                           RTUNI_ALPHA, /* U+0012dd: ETHIOPIC SYLLABLE ZE*/
-                                           RTUNI_ALPHA, /* U+0012de: ETHIOPIC SYLLABLE ZO*/
-                                           RTUNI_ALPHA, /* U+0012df: ETHIOPIC SYLLABLE ZWA*/
-                                           RTUNI_ALPHA, /* U+0012e0: ETHIOPIC SYLLABLE ZHA*/
-                                           RTUNI_ALPHA, /* U+0012e1: ETHIOPIC SYLLABLE ZHU*/
-                                           RTUNI_ALPHA, /* U+0012e2: ETHIOPIC SYLLABLE ZHI*/
-                                           RTUNI_ALPHA, /* U+0012e3: ETHIOPIC SYLLABLE ZHAA*/
-                                           RTUNI_ALPHA, /* U+0012e4: ETHIOPIC SYLLABLE ZHEE*/
-                                           RTUNI_ALPHA, /* U+0012e5: ETHIOPIC SYLLABLE ZHE*/
-                                           RTUNI_ALPHA, /* U+0012e6: ETHIOPIC SYLLABLE ZHO*/
-                                           RTUNI_ALPHA, /* U+0012e7: ETHIOPIC SYLLABLE ZHWA*/
-                                           RTUNI_ALPHA, /* U+0012e8: ETHIOPIC SYLLABLE YA*/
-                                           RTUNI_ALPHA, /* U+0012e9: ETHIOPIC SYLLABLE YU*/
-                                           RTUNI_ALPHA, /* U+0012ea: ETHIOPIC SYLLABLE YI*/
-                                           RTUNI_ALPHA, /* U+0012eb: ETHIOPIC SYLLABLE YAA*/
-                                           RTUNI_ALPHA, /* U+0012ec: ETHIOPIC SYLLABLE YEE*/
-                                           RTUNI_ALPHA, /* U+0012ed: ETHIOPIC SYLLABLE YE*/
-                                           RTUNI_ALPHA, /* U+0012ee: ETHIOPIC SYLLABLE YO*/
-                                           RTUNI_ALPHA, /* U+0012ef: ETHIOPIC SYLLABLE YOA*/
-                                           RTUNI_ALPHA, /* U+0012f0: ETHIOPIC SYLLABLE DA*/
-                                           RTUNI_ALPHA, /* U+0012f1: ETHIOPIC SYLLABLE DU*/
-                                           RTUNI_ALPHA, /* U+0012f2: ETHIOPIC SYLLABLE DI*/
-                                           RTUNI_ALPHA, /* U+0012f3: ETHIOPIC SYLLABLE DAA*/
-                                           RTUNI_ALPHA, /* U+0012f4: ETHIOPIC SYLLABLE DEE*/
-                                           RTUNI_ALPHA, /* U+0012f5: ETHIOPIC SYLLABLE DE*/
-                                           RTUNI_ALPHA, /* U+0012f6: ETHIOPIC SYLLABLE DO*/
-                                           RTUNI_ALPHA, /* U+0012f7: ETHIOPIC SYLLABLE DWA*/
-                                           RTUNI_ALPHA, /* U+0012f8: ETHIOPIC SYLLABLE DDA*/
-                                           RTUNI_ALPHA, /* U+0012f9: ETHIOPIC SYLLABLE DDU*/
-                                           RTUNI_ALPHA, /* U+0012fa: ETHIOPIC SYLLABLE DDI*/
-                                           RTUNI_ALPHA, /* U+0012fb: ETHIOPIC SYLLABLE DDAA*/
-                                           RTUNI_ALPHA, /* U+0012fc: ETHIOPIC SYLLABLE DDEE*/
-                                           RTUNI_ALPHA, /* U+0012fd: ETHIOPIC SYLLABLE DDE*/
-                                           RTUNI_ALPHA, /* U+0012fe: ETHIOPIC SYLLABLE DDO*/
-                                           RTUNI_ALPHA, /* U+0012ff: ETHIOPIC SYLLABLE DDWA*/
-                                           RTUNI_ALPHA, /* U+001300: ETHIOPIC SYLLABLE JA*/
-                                           RTUNI_ALPHA, /* U+001301: ETHIOPIC SYLLABLE JU*/
-                                           RTUNI_ALPHA, /* U+001302: ETHIOPIC SYLLABLE JI*/
-                                           RTUNI_ALPHA, /* U+001303: ETHIOPIC SYLLABLE JAA*/
-                                           RTUNI_ALPHA, /* U+001304: ETHIOPIC SYLLABLE JEE*/
-                                           RTUNI_ALPHA, /* U+001305: ETHIOPIC SYLLABLE JE*/
-                                           RTUNI_ALPHA, /* U+001306: ETHIOPIC SYLLABLE JO*/
-                                           RTUNI_ALPHA, /* U+001307: ETHIOPIC SYLLABLE JWA*/
-                                           RTUNI_ALPHA, /* U+001308: ETHIOPIC SYLLABLE GA*/
-                                           RTUNI_ALPHA, /* U+001309: ETHIOPIC SYLLABLE GU*/
-                                           RTUNI_ALPHA, /* U+00130a: ETHIOPIC SYLLABLE GI*/
-                                           RTUNI_ALPHA, /* U+00130b: ETHIOPIC SYLLABLE GAA*/
-                                           RTUNI_ALPHA, /* U+00130c: ETHIOPIC SYLLABLE GEE*/
-                                           RTUNI_ALPHA, /* U+00130d: ETHIOPIC SYLLABLE GE*/
-                                           RTUNI_ALPHA, /* U+00130e: ETHIOPIC SYLLABLE GO*/
-                                           RTUNI_ALPHA, /* U+00130f: ETHIOPIC SYLLABLE GOA*/
-                                           RTUNI_ALPHA, /* U+001310: ETHIOPIC SYLLABLE GWA*/
-                                                     0, /* U+001311: */
-                                           RTUNI_ALPHA, /* U+001312: ETHIOPIC SYLLABLE GWI*/
-                                           RTUNI_ALPHA, /* U+001313: ETHIOPIC SYLLABLE GWAA*/
-                                           RTUNI_ALPHA, /* U+001314: ETHIOPIC SYLLABLE GWEE*/
-                                           RTUNI_ALPHA, /* U+001315: ETHIOPIC SYLLABLE GWE*/
-                                                     0, /* U+001316: */
-                                                     0, /* U+001317: */
-                                           RTUNI_ALPHA, /* U+001318: ETHIOPIC SYLLABLE GGA*/
-                                           RTUNI_ALPHA, /* U+001319: ETHIOPIC SYLLABLE GGU*/
-                                           RTUNI_ALPHA, /* U+00131a: ETHIOPIC SYLLABLE GGI*/
-                                           RTUNI_ALPHA, /* U+00131b: ETHIOPIC SYLLABLE GGAA*/
-                                           RTUNI_ALPHA, /* U+00131c: ETHIOPIC SYLLABLE GGEE*/
-                                           RTUNI_ALPHA, /* U+00131d: ETHIOPIC SYLLABLE GGE*/
-                                           RTUNI_ALPHA, /* U+00131e: ETHIOPIC SYLLABLE GGO*/
-                                           RTUNI_ALPHA, /* U+00131f: ETHIOPIC SYLLABLE GGWAA*/
-                                           RTUNI_ALPHA, /* U+001320: ETHIOPIC SYLLABLE THA*/
-                                           RTUNI_ALPHA, /* U+001321: ETHIOPIC SYLLABLE THU*/
-                                           RTUNI_ALPHA, /* U+001322: ETHIOPIC SYLLABLE THI*/
-                                           RTUNI_ALPHA, /* U+001323: ETHIOPIC SYLLABLE THAA*/
-                                           RTUNI_ALPHA, /* U+001324: ETHIOPIC SYLLABLE THEE*/
-                                           RTUNI_ALPHA, /* U+001325: ETHIOPIC SYLLABLE THE*/
-                                           RTUNI_ALPHA, /* U+001326: ETHIOPIC SYLLABLE THO*/
-                                           RTUNI_ALPHA, /* U+001327: ETHIOPIC SYLLABLE THWA*/
-                                           RTUNI_ALPHA, /* U+001328: ETHIOPIC SYLLABLE CHA*/
-                                           RTUNI_ALPHA, /* U+001329: ETHIOPIC SYLLABLE CHU*/
-                                           RTUNI_ALPHA, /* U+00132a: ETHIOPIC SYLLABLE CHI*/
-                                           RTUNI_ALPHA, /* U+00132b: ETHIOPIC SYLLABLE CHAA*/
-                                           RTUNI_ALPHA, /* U+00132c: ETHIOPIC SYLLABLE CHEE*/
-                                           RTUNI_ALPHA, /* U+00132d: ETHIOPIC SYLLABLE CHE*/
-                                           RTUNI_ALPHA, /* U+00132e: ETHIOPIC SYLLABLE CHO*/
-                                           RTUNI_ALPHA, /* U+00132f: ETHIOPIC SYLLABLE CHWA*/
-                                           RTUNI_ALPHA, /* U+001330: ETHIOPIC SYLLABLE PHA*/
-                                           RTUNI_ALPHA, /* U+001331: ETHIOPIC SYLLABLE PHU*/
-                                           RTUNI_ALPHA, /* U+001332: ETHIOPIC SYLLABLE PHI*/
-                                           RTUNI_ALPHA, /* U+001333: ETHIOPIC SYLLABLE PHAA*/
-                                           RTUNI_ALPHA, /* U+001334: ETHIOPIC SYLLABLE PHEE*/
-                                           RTUNI_ALPHA, /* U+001335: ETHIOPIC SYLLABLE PHE*/
-                                           RTUNI_ALPHA, /* U+001336: ETHIOPIC SYLLABLE PHO*/
-                                           RTUNI_ALPHA, /* U+001337: ETHIOPIC SYLLABLE PHWA*/
-                                           RTUNI_ALPHA, /* U+001338: ETHIOPIC SYLLABLE TSA*/
-                                           RTUNI_ALPHA, /* U+001339: ETHIOPIC SYLLABLE TSU*/
-                                           RTUNI_ALPHA, /* U+00133a: ETHIOPIC SYLLABLE TSI*/
-                                           RTUNI_ALPHA, /* U+00133b: ETHIOPIC SYLLABLE TSAA*/
-                                           RTUNI_ALPHA, /* U+00133c: ETHIOPIC SYLLABLE TSEE*/
-                                           RTUNI_ALPHA, /* U+00133d: ETHIOPIC SYLLABLE TSE*/
-                                           RTUNI_ALPHA, /* U+00133e: ETHIOPIC SYLLABLE TSO*/
-                                           RTUNI_ALPHA, /* U+00133f: ETHIOPIC SYLLABLE TSWA*/
-                                           RTUNI_ALPHA, /* U+001340: ETHIOPIC SYLLABLE TZA*/
-                                           RTUNI_ALPHA, /* U+001341: ETHIOPIC SYLLABLE TZU*/
-                                           RTUNI_ALPHA, /* U+001342: ETHIOPIC SYLLABLE TZI*/
-                                           RTUNI_ALPHA, /* U+001343: ETHIOPIC SYLLABLE TZAA*/
-                                           RTUNI_ALPHA, /* U+001344: ETHIOPIC SYLLABLE TZEE*/
-                                           RTUNI_ALPHA, /* U+001345: ETHIOPIC SYLLABLE TZE*/
-                                           RTUNI_ALPHA, /* U+001346: ETHIOPIC SYLLABLE TZO*/
-                                           RTUNI_ALPHA, /* U+001347: ETHIOPIC SYLLABLE TZOA*/
-                                           RTUNI_ALPHA, /* U+001348: ETHIOPIC SYLLABLE FA*/
-                                           RTUNI_ALPHA, /* U+001349: ETHIOPIC SYLLABLE FU*/
-                                           RTUNI_ALPHA, /* U+00134a: ETHIOPIC SYLLABLE FI*/
-                                           RTUNI_ALPHA, /* U+00134b: ETHIOPIC SYLLABLE FAA*/
-                                           RTUNI_ALPHA, /* U+00134c: ETHIOPIC SYLLABLE FEE*/
-                                           RTUNI_ALPHA, /* U+00134d: ETHIOPIC SYLLABLE FE*/
-                                           RTUNI_ALPHA, /* U+00134e: ETHIOPIC SYLLABLE FO*/
-                                           RTUNI_ALPHA, /* U+00134f: ETHIOPIC SYLLABLE FWA*/
-                                           RTUNI_ALPHA, /* U+001350: ETHIOPIC SYLLABLE PA*/
-                                           RTUNI_ALPHA, /* U+001351: ETHIOPIC SYLLABLE PU*/
-                                           RTUNI_ALPHA, /* U+001352: ETHIOPIC SYLLABLE PI*/
-                                           RTUNI_ALPHA, /* U+001353: ETHIOPIC SYLLABLE PAA*/
-                                           RTUNI_ALPHA, /* U+001354: ETHIOPIC SYLLABLE PEE*/
-                                           RTUNI_ALPHA, /* U+001355: ETHIOPIC SYLLABLE PE*/
-                                           RTUNI_ALPHA, /* U+001356: ETHIOPIC SYLLABLE PO*/
-                                           RTUNI_ALPHA, /* U+001357: ETHIOPIC SYLLABLE PWA*/
-                                           RTUNI_ALPHA, /* U+001358: ETHIOPIC SYLLABLE RYA*/
-                                           RTUNI_ALPHA, /* U+001359: ETHIOPIC SYLLABLE MYA*/
-                                           RTUNI_ALPHA, /* U+00135a: ETHIOPIC SYLLABLE FYA*/
-                                                     0, /* U+00135b: */
-                                                     0, /* U+00135c: */
-                                                     0, /* U+00135d: */
-                                                     0, /* U+00135e: */
-                                           RTUNI_ALPHA, /* U+00135f: ETHIOPIC COMBINING GEMINATION MARK*/
-                                                     0, /* U+001360: ETHIOPIC SECTION MARK*/
-                                                     0, /* U+001361: ETHIOPIC WORDSPACE*/
-                                                     0, /* U+001362: ETHIOPIC FULL STOP*/
-                                                     0, /* U+001363: ETHIOPIC COMMA*/
-                                                     0, /* U+001364: ETHIOPIC SEMICOLON*/
-                                                     0, /* U+001365: ETHIOPIC COLON*/
-                                                     0, /* U+001366: ETHIOPIC PREFACE COLON*/
-                                                     0, /* U+001367: ETHIOPIC QUESTION MARK*/
-                                                     0, /* U+001368: ETHIOPIC PARAGRAPH SEPARATOR*/
-                                                     0, /* U+001369: ETHIOPIC DIGIT ONE*/
-                                                     0, /* U+00136a: ETHIOPIC DIGIT TWO*/
-                                                     0, /* U+00136b: ETHIOPIC DIGIT THREE*/
-                                                     0, /* U+00136c: ETHIOPIC DIGIT FOUR*/
-                                                     0, /* U+00136d: ETHIOPIC DIGIT FIVE*/
-                                                     0, /* U+00136e: ETHIOPIC DIGIT SIX*/
-                                                     0, /* U+00136f: ETHIOPIC DIGIT SEVEN*/
-                                                     0, /* U+001370: ETHIOPIC DIGIT EIGHT*/
-                                                     0, /* U+001371: ETHIOPIC DIGIT NINE*/
-                                                     0, /* U+001372: ETHIOPIC NUMBER TEN*/
-                                                     0, /* U+001373: ETHIOPIC NUMBER TWENTY*/
-                                                     0, /* U+001374: ETHIOPIC NUMBER THIRTY*/
-                                                     0, /* U+001375: ETHIOPIC NUMBER FORTY*/
-                                                     0, /* U+001376: ETHIOPIC NUMBER FIFTY*/
-                                                     0, /* U+001377: ETHIOPIC NUMBER SIXTY*/
-                                                     0, /* U+001378: ETHIOPIC NUMBER SEVENTY*/
-                                                     0, /* U+001379: ETHIOPIC NUMBER EIGHTY*/
-                                                     0, /* U+00137a: ETHIOPIC NUMBER NINETY*/
-                                                     0, /* U+00137b: ETHIOPIC NUMBER HUNDRED*/
-                                                     0, /* U+00137c: ETHIOPIC NUMBER TEN THOUSAND*/
-                                                     0, /* U+00137d: */
-                                                     0, /* U+00137e: */
-                                                     0, /* U+00137f: */
-                                           RTUNI_ALPHA, /* U+001380: ETHIOPIC SYLLABLE SEBATBEIT MWA*/
-                                           RTUNI_ALPHA, /* U+001381: ETHIOPIC SYLLABLE MWI*/
-                                           RTUNI_ALPHA, /* U+001382: ETHIOPIC SYLLABLE MWEE*/
-                                           RTUNI_ALPHA, /* U+001383: ETHIOPIC SYLLABLE MWE*/
-                                           RTUNI_ALPHA, /* U+001384: ETHIOPIC SYLLABLE SEBATBEIT BWA*/
-                                           RTUNI_ALPHA, /* U+001385: ETHIOPIC SYLLABLE BWI*/
-                                           RTUNI_ALPHA, /* U+001386: ETHIOPIC SYLLABLE BWEE*/
-                                           RTUNI_ALPHA, /* U+001387: ETHIOPIC SYLLABLE BWE*/
-                                           RTUNI_ALPHA, /* U+001388: ETHIOPIC SYLLABLE SEBATBEIT FWA*/
-                                           RTUNI_ALPHA, /* U+001389: ETHIOPIC SYLLABLE FWI*/
-                                           RTUNI_ALPHA, /* U+00138a: ETHIOPIC SYLLABLE FWEE*/
-                                           RTUNI_ALPHA, /* U+00138b: ETHIOPIC SYLLABLE FWE*/
-                                           RTUNI_ALPHA, /* U+00138c: ETHIOPIC SYLLABLE SEBATBEIT PWA*/
-                                           RTUNI_ALPHA, /* U+00138d: ETHIOPIC SYLLABLE PWI*/
-                                           RTUNI_ALPHA, /* U+00138e: ETHIOPIC SYLLABLE PWEE*/
-                                           RTUNI_ALPHA, /* U+00138f: ETHIOPIC SYLLABLE PWE*/
-                                                     0, /* U+001390: ETHIOPIC TONAL MARK YIZET*/
-                                                     0, /* U+001391: ETHIOPIC TONAL MARK DERET*/
-                                                     0, /* U+001392: ETHIOPIC TONAL MARK RIKRIK*/
-                                                     0, /* U+001393: ETHIOPIC TONAL MARK SHORT RIKRIK*/
-                                                     0, /* U+001394: ETHIOPIC TONAL MARK DIFAT*/
-                                                     0, /* U+001395: ETHIOPIC TONAL MARK KENAT*/
-                                                     0, /* U+001396: ETHIOPIC TONAL MARK CHIRET*/
-                                                     0, /* U+001397: ETHIOPIC TONAL MARK HIDET*/
-                                                     0, /* U+001398: ETHIOPIC TONAL MARK DERET-HIDET*/
-                                                     0, /* U+001399: ETHIOPIC TONAL MARK KURT*/
-                                                     0, /* U+00139a: */
-                                                     0, /* U+00139b: */
-                                                     0, /* U+00139c: */
-                                                     0, /* U+00139d: */
-                                                     0, /* U+00139e: */
-                                                     0, /* U+00139f: */
-                                           RTUNI_ALPHA, /* U+0013a0: CHEROKEE LETTER A*/
-                                           RTUNI_ALPHA, /* U+0013a1: CHEROKEE LETTER E*/
-                                           RTUNI_ALPHA, /* U+0013a2: CHEROKEE LETTER I*/
-                                           RTUNI_ALPHA, /* U+0013a3: CHEROKEE LETTER O*/
-                                           RTUNI_ALPHA, /* U+0013a4: CHEROKEE LETTER U*/
-                                           RTUNI_ALPHA, /* U+0013a5: CHEROKEE LETTER V*/
-                                           RTUNI_ALPHA, /* U+0013a6: CHEROKEE LETTER GA*/
-                                           RTUNI_ALPHA, /* U+0013a7: CHEROKEE LETTER KA*/
-                                           RTUNI_ALPHA, /* U+0013a8: CHEROKEE LETTER GE*/
-                                           RTUNI_ALPHA, /* U+0013a9: CHEROKEE LETTER GI*/
-                                           RTUNI_ALPHA, /* U+0013aa: CHEROKEE LETTER GO*/
-                                           RTUNI_ALPHA, /* U+0013ab: CHEROKEE LETTER GU*/
-                                           RTUNI_ALPHA, /* U+0013ac: CHEROKEE LETTER GV*/
-                                           RTUNI_ALPHA, /* U+0013ad: CHEROKEE LETTER HA*/
-                                           RTUNI_ALPHA, /* U+0013ae: CHEROKEE LETTER HE*/
-                                           RTUNI_ALPHA, /* U+0013af: CHEROKEE LETTER HI*/
-                                           RTUNI_ALPHA, /* U+0013b0: CHEROKEE LETTER HO*/
-                                           RTUNI_ALPHA, /* U+0013b1: CHEROKEE LETTER HU*/
-                                           RTUNI_ALPHA, /* U+0013b2: CHEROKEE LETTER HV*/
-                                           RTUNI_ALPHA, /* U+0013b3: CHEROKEE LETTER LA*/
-                                           RTUNI_ALPHA, /* U+0013b4: CHEROKEE LETTER LE*/
-                                           RTUNI_ALPHA, /* U+0013b5: CHEROKEE LETTER LI*/
-                                           RTUNI_ALPHA, /* U+0013b6: CHEROKEE LETTER LO*/
-                                           RTUNI_ALPHA, /* U+0013b7: CHEROKEE LETTER LU*/
-                                           RTUNI_ALPHA, /* U+0013b8: CHEROKEE LETTER LV*/
-                                           RTUNI_ALPHA, /* U+0013b9: CHEROKEE LETTER MA*/
-                                           RTUNI_ALPHA, /* U+0013ba: CHEROKEE LETTER ME*/
-                                           RTUNI_ALPHA, /* U+0013bb: CHEROKEE LETTER MI*/
-                                           RTUNI_ALPHA, /* U+0013bc: CHEROKEE LETTER MO*/
-                                           RTUNI_ALPHA, /* U+0013bd: CHEROKEE LETTER MU*/
-                                           RTUNI_ALPHA, /* U+0013be: CHEROKEE LETTER NA*/
-                                           RTUNI_ALPHA, /* U+0013bf: CHEROKEE LETTER HNA*/
-                                           RTUNI_ALPHA, /* U+0013c0: CHEROKEE LETTER NAH*/
-                                           RTUNI_ALPHA, /* U+0013c1: CHEROKEE LETTER NE*/
-                                           RTUNI_ALPHA, /* U+0013c2: CHEROKEE LETTER NI*/
-                                           RTUNI_ALPHA, /* U+0013c3: CHEROKEE LETTER NO*/
-                                           RTUNI_ALPHA, /* U+0013c4: CHEROKEE LETTER NU*/
-                                           RTUNI_ALPHA, /* U+0013c5: CHEROKEE LETTER NV*/
-                                           RTUNI_ALPHA, /* U+0013c6: CHEROKEE LETTER QUA*/
-                                           RTUNI_ALPHA, /* U+0013c7: CHEROKEE LETTER QUE*/
-                                           RTUNI_ALPHA, /* U+0013c8: CHEROKEE LETTER QUI*/
-                                           RTUNI_ALPHA, /* U+0013c9: CHEROKEE LETTER QUO*/
-                                           RTUNI_ALPHA, /* U+0013ca: CHEROKEE LETTER QUU*/
-                                           RTUNI_ALPHA, /* U+0013cb: CHEROKEE LETTER QUV*/
-                                           RTUNI_ALPHA, /* U+0013cc: CHEROKEE LETTER SA*/
-                                           RTUNI_ALPHA, /* U+0013cd: CHEROKEE LETTER S*/
-                                           RTUNI_ALPHA, /* U+0013ce: CHEROKEE LETTER SE*/
-                                           RTUNI_ALPHA, /* U+0013cf: CHEROKEE LETTER SI*/
-                                           RTUNI_ALPHA, /* U+0013d0: CHEROKEE LETTER SO*/
-                                           RTUNI_ALPHA, /* U+0013d1: CHEROKEE LETTER SU*/
-                                           RTUNI_ALPHA, /* U+0013d2: CHEROKEE LETTER SV*/
-                                           RTUNI_ALPHA, /* U+0013d3: CHEROKEE LETTER DA*/
-                                           RTUNI_ALPHA, /* U+0013d4: CHEROKEE LETTER TA*/
-                                           RTUNI_ALPHA, /* U+0013d5: CHEROKEE LETTER DE*/
-                                           RTUNI_ALPHA, /* U+0013d6: CHEROKEE LETTER TE*/
-                                           RTUNI_ALPHA, /* U+0013d7: CHEROKEE LETTER DI*/
-                                           RTUNI_ALPHA, /* U+0013d8: CHEROKEE LETTER TI*/
-                                           RTUNI_ALPHA, /* U+0013d9: CHEROKEE LETTER DO*/
-                                           RTUNI_ALPHA, /* U+0013da: CHEROKEE LETTER DU*/
-                                           RTUNI_ALPHA, /* U+0013db: CHEROKEE LETTER DV*/
-                                           RTUNI_ALPHA, /* U+0013dc: CHEROKEE LETTER DLA*/
-                                           RTUNI_ALPHA, /* U+0013dd: CHEROKEE LETTER TLA*/
-                                           RTUNI_ALPHA, /* U+0013de: CHEROKEE LETTER TLE*/
-                                           RTUNI_ALPHA, /* U+0013df: CHEROKEE LETTER TLI*/
-                                           RTUNI_ALPHA, /* U+0013e0: CHEROKEE LETTER TLO*/
-                                           RTUNI_ALPHA, /* U+0013e1: CHEROKEE LETTER TLU*/
-                                           RTUNI_ALPHA, /* U+0013e2: CHEROKEE LETTER TLV*/
-                                           RTUNI_ALPHA, /* U+0013e3: CHEROKEE LETTER TSA*/
-                                           RTUNI_ALPHA, /* U+0013e4: CHEROKEE LETTER TSE*/
-                                           RTUNI_ALPHA, /* U+0013e5: CHEROKEE LETTER TSI*/
-                                           RTUNI_ALPHA, /* U+0013e6: CHEROKEE LETTER TSO*/
-                                           RTUNI_ALPHA, /* U+0013e7: CHEROKEE LETTER TSU*/
-                                           RTUNI_ALPHA, /* U+0013e8: CHEROKEE LETTER TSV*/
-                                           RTUNI_ALPHA, /* U+0013e9: CHEROKEE LETTER WA*/
-                                           RTUNI_ALPHA, /* U+0013ea: CHEROKEE LETTER WE*/
-                                           RTUNI_ALPHA, /* U+0013eb: CHEROKEE LETTER WI*/
-                                           RTUNI_ALPHA, /* U+0013ec: CHEROKEE LETTER WO*/
-                                           RTUNI_ALPHA, /* U+0013ed: CHEROKEE LETTER WU*/
-                                           RTUNI_ALPHA, /* U+0013ee: CHEROKEE LETTER WV*/
-                                           RTUNI_ALPHA, /* U+0013ef: CHEROKEE LETTER YA*/
-                                           RTUNI_ALPHA, /* U+0013f0: CHEROKEE LETTER YE*/
-                                           RTUNI_ALPHA, /* U+0013f1: CHEROKEE LETTER YI*/
-                                           RTUNI_ALPHA, /* U+0013f2: CHEROKEE LETTER YO*/
-                                           RTUNI_ALPHA, /* U+0013f3: CHEROKEE LETTER YU*/
-                                           RTUNI_ALPHA, /* U+0013f4: CHEROKEE LETTER YV*/
-                                                     0, /* U+0013f5: */
-                                                     0, /* U+0013f6: */
-                                                     0, /* U+0013f7: */
-                                                     0, /* U+0013f8: */
-                                                     0, /* U+0013f9: */
-                                                     0, /* U+0013fa: */
-                                                     0, /* U+0013fb: */
-                                                     0, /* U+0013fc: */
-                                                     0, /* U+0013fd: */
-                                                     0, /* U+0013fe: */
-                                                     0, /* U+0013ff: */
-                                                     0, /* U+001400: */
-                                           RTUNI_ALPHA, /* U+001401: CANADIAN SYLLABICS E*/
-                                           RTUNI_ALPHA, /* U+001402: CANADIAN SYLLABICS AAI*/
-                                           RTUNI_ALPHA, /* U+001403: CANADIAN SYLLABICS I*/
-                                           RTUNI_ALPHA, /* U+001404: CANADIAN SYLLABICS II*/
-                                           RTUNI_ALPHA, /* U+001405: CANADIAN SYLLABICS O*/
-                                           RTUNI_ALPHA, /* U+001406: CANADIAN SYLLABICS OO*/
-                                           RTUNI_ALPHA, /* U+001407: CANADIAN SYLLABICS Y-CREE OO*/
-                                           RTUNI_ALPHA, /* U+001408: CANADIAN SYLLABICS CARRIER EE*/
-                                           RTUNI_ALPHA, /* U+001409: CANADIAN SYLLABICS CARRIER I*/
-                                           RTUNI_ALPHA, /* U+00140a: CANADIAN SYLLABICS A*/
-                                           RTUNI_ALPHA, /* U+00140b: CANADIAN SYLLABICS AA*/
-                                           RTUNI_ALPHA, /* U+00140c: CANADIAN SYLLABICS WE*/
-                                           RTUNI_ALPHA, /* U+00140d: CANADIAN SYLLABICS WEST-CREE WE*/
-                                           RTUNI_ALPHA, /* U+00140e: CANADIAN SYLLABICS WI*/
-                                           RTUNI_ALPHA, /* U+00140f: CANADIAN SYLLABICS WEST-CREE WI*/
-                                           RTUNI_ALPHA, /* U+001410: CANADIAN SYLLABICS WII*/
-                                           RTUNI_ALPHA, /* U+001411: CANADIAN SYLLABICS WEST-CREE WII*/
-                                           RTUNI_ALPHA, /* U+001412: CANADIAN SYLLABICS WO*/
-                                           RTUNI_ALPHA, /* U+001413: CANADIAN SYLLABICS WEST-CREE WO*/
-                                           RTUNI_ALPHA, /* U+001414: CANADIAN SYLLABICS WOO*/
-                                           RTUNI_ALPHA, /* U+001415: CANADIAN SYLLABICS WEST-CREE WOO*/
-                                           RTUNI_ALPHA, /* U+001416: CANADIAN SYLLABICS NASKAPI WOO*/
-                                           RTUNI_ALPHA, /* U+001417: CANADIAN SYLLABICS WA*/
-                                           RTUNI_ALPHA, /* U+001418: CANADIAN SYLLABICS WEST-CREE WA*/
-                                           RTUNI_ALPHA, /* U+001419: CANADIAN SYLLABICS WAA*/
-                                           RTUNI_ALPHA, /* U+00141a: CANADIAN SYLLABICS WEST-CREE WAA*/
-                                           RTUNI_ALPHA, /* U+00141b: CANADIAN SYLLABICS NASKAPI WAA*/
-                                           RTUNI_ALPHA, /* U+00141c: CANADIAN SYLLABICS AI*/
-                                           RTUNI_ALPHA, /* U+00141d: CANADIAN SYLLABICS Y-CREE W*/
-                                           RTUNI_ALPHA, /* U+00141e: CANADIAN SYLLABICS GLOTTAL STOP*/
-                                           RTUNI_ALPHA, /* U+00141f: CANADIAN SYLLABICS FINAL ACUTE*/
-                                           RTUNI_ALPHA, /* U+001420: CANADIAN SYLLABICS FINAL GRAVE*/
-                                           RTUNI_ALPHA, /* U+001421: CANADIAN SYLLABICS FINAL BOTTOM HALF RING*/
-                                           RTUNI_ALPHA, /* U+001422: CANADIAN SYLLABICS FINAL TOP HALF RING*/
-                                           RTUNI_ALPHA, /* U+001423: CANADIAN SYLLABICS FINAL RIGHT HALF RING*/
-                                           RTUNI_ALPHA, /* U+001424: CANADIAN SYLLABICS FINAL RING*/
-                                           RTUNI_ALPHA, /* U+001425: CANADIAN SYLLABICS FINAL DOUBLE ACUTE*/
-                                           RTUNI_ALPHA, /* U+001426: CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES*/
-                                           RTUNI_ALPHA, /* U+001427: CANADIAN SYLLABICS FINAL MIDDLE DOT*/
-                                           RTUNI_ALPHA, /* U+001428: CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE*/
-                                           RTUNI_ALPHA, /* U+001429: CANADIAN SYLLABICS FINAL PLUS*/
-                                           RTUNI_ALPHA, /* U+00142a: CANADIAN SYLLABICS FINAL DOWN TACK*/
-                                           RTUNI_ALPHA, /* U+00142b: CANADIAN SYLLABICS EN*/
-                                           RTUNI_ALPHA, /* U+00142c: CANADIAN SYLLABICS IN*/
-                                           RTUNI_ALPHA, /* U+00142d: CANADIAN SYLLABICS ON*/
-                                           RTUNI_ALPHA, /* U+00142e: CANADIAN SYLLABICS AN*/
-                                           RTUNI_ALPHA, /* U+00142f: CANADIAN SYLLABICS PE*/
-                                           RTUNI_ALPHA, /* U+001430: CANADIAN SYLLABICS PAAI*/
-                                           RTUNI_ALPHA, /* U+001431: CANADIAN SYLLABICS PI*/
-                                           RTUNI_ALPHA, /* U+001432: CANADIAN SYLLABICS PII*/
-                                           RTUNI_ALPHA, /* U+001433: CANADIAN SYLLABICS PO*/
-                                           RTUNI_ALPHA, /* U+001434: CANADIAN SYLLABICS POO*/
-                                           RTUNI_ALPHA, /* U+001435: CANADIAN SYLLABICS Y-CREE POO*/
-                                           RTUNI_ALPHA, /* U+001436: CANADIAN SYLLABICS CARRIER HEE*/
-                                           RTUNI_ALPHA, /* U+001437: CANADIAN SYLLABICS CARRIER HI*/
-                                           RTUNI_ALPHA, /* U+001438: CANADIAN SYLLABICS PA*/
-                                           RTUNI_ALPHA, /* U+001439: CANADIAN SYLLABICS PAA*/
-                                           RTUNI_ALPHA, /* U+00143a: CANADIAN SYLLABICS PWE*/
-                                           RTUNI_ALPHA, /* U+00143b: CANADIAN SYLLABICS WEST-CREE PWE*/
-                                           RTUNI_ALPHA, /* U+00143c: CANADIAN SYLLABICS PWI*/
-                                           RTUNI_ALPHA, /* U+00143d: CANADIAN SYLLABICS WEST-CREE PWI*/
-                                           RTUNI_ALPHA, /* U+00143e: CANADIAN SYLLABICS PWII*/
-                                           RTUNI_ALPHA, /* U+00143f: CANADIAN SYLLABICS WEST-CREE PWII*/
-                                           RTUNI_ALPHA, /* U+001440: CANADIAN SYLLABICS PWO*/
-                                           RTUNI_ALPHA, /* U+001441: CANADIAN SYLLABICS WEST-CREE PWO*/
-                                           RTUNI_ALPHA, /* U+001442: CANADIAN SYLLABICS PWOO*/
-                                           RTUNI_ALPHA, /* U+001443: CANADIAN SYLLABICS WEST-CREE PWOO*/
-                                           RTUNI_ALPHA, /* U+001444: CANADIAN SYLLABICS PWA*/
-                                           RTUNI_ALPHA, /* U+001445: CANADIAN SYLLABICS WEST-CREE PWA*/
-                                           RTUNI_ALPHA, /* U+001446: CANADIAN SYLLABICS PWAA*/
-                                           RTUNI_ALPHA, /* U+001447: CANADIAN SYLLABICS WEST-CREE PWAA*/
-                                           RTUNI_ALPHA, /* U+001448: CANADIAN SYLLABICS Y-CREE PWAA*/
-                                           RTUNI_ALPHA, /* U+001449: CANADIAN SYLLABICS P*/
-                                           RTUNI_ALPHA, /* U+00144a: CANADIAN SYLLABICS WEST-CREE P*/
-                                           RTUNI_ALPHA, /* U+00144b: CANADIAN SYLLABICS CARRIER H*/
-                                           RTUNI_ALPHA, /* U+00144c: CANADIAN SYLLABICS TE*/
-                                           RTUNI_ALPHA, /* U+00144d: CANADIAN SYLLABICS TAAI*/
-                                           RTUNI_ALPHA, /* U+00144e: CANADIAN SYLLABICS TI*/
-                                           RTUNI_ALPHA, /* U+00144f: CANADIAN SYLLABICS TII*/
-                                           RTUNI_ALPHA, /* U+001450: CANADIAN SYLLABICS TO*/
-                                           RTUNI_ALPHA, /* U+001451: CANADIAN SYLLABICS TOO*/
-                                           RTUNI_ALPHA, /* U+001452: CANADIAN SYLLABICS Y-CREE TOO*/
-                                           RTUNI_ALPHA, /* U+001453: CANADIAN SYLLABICS CARRIER DEE*/
-                                           RTUNI_ALPHA, /* U+001454: CANADIAN SYLLABICS CARRIER DI*/
-                                           RTUNI_ALPHA, /* U+001455: CANADIAN SYLLABICS TA*/
-                                           RTUNI_ALPHA, /* U+001456: CANADIAN SYLLABICS TAA*/
-                                           RTUNI_ALPHA, /* U+001457: CANADIAN SYLLABICS TWE*/
-                                           RTUNI_ALPHA, /* U+001458: CANADIAN SYLLABICS WEST-CREE TWE*/
-                                           RTUNI_ALPHA, /* U+001459: CANADIAN SYLLABICS TWI*/
-                                           RTUNI_ALPHA, /* U+00145a: CANADIAN SYLLABICS WEST-CREE TWI*/
-                                           RTUNI_ALPHA, /* U+00145b: CANADIAN SYLLABICS TWII*/
-                                           RTUNI_ALPHA, /* U+00145c: CANADIAN SYLLABICS WEST-CREE TWII*/
-                                           RTUNI_ALPHA, /* U+00145d: CANADIAN SYLLABICS TWO*/
-                                           RTUNI_ALPHA, /* U+00145e: CANADIAN SYLLABICS WEST-CREE TWO*/
-                                           RTUNI_ALPHA, /* U+00145f: CANADIAN SYLLABICS TWOO*/
-                                           RTUNI_ALPHA, /* U+001460: CANADIAN SYLLABICS WEST-CREE TWOO*/
-                                           RTUNI_ALPHA, /* U+001461: CANADIAN SYLLABICS TWA*/
-                                           RTUNI_ALPHA, /* U+001462: CANADIAN SYLLABICS WEST-CREE TWA*/
-                                           RTUNI_ALPHA, /* U+001463: CANADIAN SYLLABICS TWAA*/
-                                           RTUNI_ALPHA, /* U+001464: CANADIAN SYLLABICS WEST-CREE TWAA*/
-                                           RTUNI_ALPHA, /* U+001465: CANADIAN SYLLABICS NASKAPI TWAA*/
-                                           RTUNI_ALPHA, /* U+001466: CANADIAN SYLLABICS T*/
-                                           RTUNI_ALPHA, /* U+001467: CANADIAN SYLLABICS TTE*/
-                                           RTUNI_ALPHA, /* U+001468: CANADIAN SYLLABICS TTI*/
-                                           RTUNI_ALPHA, /* U+001469: CANADIAN SYLLABICS TTO*/
-                                           RTUNI_ALPHA, /* U+00146a: CANADIAN SYLLABICS TTA*/
-                                           RTUNI_ALPHA, /* U+00146b: CANADIAN SYLLABICS KE*/
-                                           RTUNI_ALPHA, /* U+00146c: CANADIAN SYLLABICS KAAI*/
-                                           RTUNI_ALPHA, /* U+00146d: CANADIAN SYLLABICS KI*/
-                                           RTUNI_ALPHA, /* U+00146e: CANADIAN SYLLABICS KII*/
-                                           RTUNI_ALPHA, /* U+00146f: CANADIAN SYLLABICS KO*/
-                                           RTUNI_ALPHA, /* U+001470: CANADIAN SYLLABICS KOO*/
-                                           RTUNI_ALPHA, /* U+001471: CANADIAN SYLLABICS Y-CREE KOO*/
-                                           RTUNI_ALPHA, /* U+001472: CANADIAN SYLLABICS KA*/
-                                           RTUNI_ALPHA, /* U+001473: CANADIAN SYLLABICS KAA*/
-                                           RTUNI_ALPHA, /* U+001474: CANADIAN SYLLABICS KWE*/
-                                           RTUNI_ALPHA, /* U+001475: CANADIAN SYLLABICS WEST-CREE KWE*/
-                                           RTUNI_ALPHA, /* U+001476: CANADIAN SYLLABICS KWI*/
-                                           RTUNI_ALPHA, /* U+001477: CANADIAN SYLLABICS WEST-CREE KWI*/
-                                           RTUNI_ALPHA, /* U+001478: CANADIAN SYLLABICS KWII*/
-                                           RTUNI_ALPHA, /* U+001479: CANADIAN SYLLABICS WEST-CREE KWII*/
-                                           RTUNI_ALPHA, /* U+00147a: CANADIAN SYLLABICS KWO*/
-                                           RTUNI_ALPHA, /* U+00147b: CANADIAN SYLLABICS WEST-CREE KWO*/
-                                           RTUNI_ALPHA, /* U+00147c: CANADIAN SYLLABICS KWOO*/
-                                           RTUNI_ALPHA, /* U+00147d: CANADIAN SYLLABICS WEST-CREE KWOO*/
-                                           RTUNI_ALPHA, /* U+00147e: CANADIAN SYLLABICS KWA*/
-                                           RTUNI_ALPHA, /* U+00147f: CANADIAN SYLLABICS WEST-CREE KWA*/
-                                           RTUNI_ALPHA, /* U+001480: CANADIAN SYLLABICS KWAA*/
-                                           RTUNI_ALPHA, /* U+001481: CANADIAN SYLLABICS WEST-CREE KWAA*/
-                                           RTUNI_ALPHA, /* U+001482: CANADIAN SYLLABICS NASKAPI KWAA*/
-                                           RTUNI_ALPHA, /* U+001483: CANADIAN SYLLABICS K*/
-                                           RTUNI_ALPHA, /* U+001484: CANADIAN SYLLABICS KW*/
-                                           RTUNI_ALPHA, /* U+001485: CANADIAN SYLLABICS SOUTH-SLAVEY KEH*/
-                                           RTUNI_ALPHA, /* U+001486: CANADIAN SYLLABICS SOUTH-SLAVEY KIH*/
-                                           RTUNI_ALPHA, /* U+001487: CANADIAN SYLLABICS SOUTH-SLAVEY KOH*/
-                                           RTUNI_ALPHA, /* U+001488: CANADIAN SYLLABICS SOUTH-SLAVEY KAH*/
-                                           RTUNI_ALPHA, /* U+001489: CANADIAN SYLLABICS CE*/
-                                           RTUNI_ALPHA, /* U+00148a: CANADIAN SYLLABICS CAAI*/
-                                           RTUNI_ALPHA, /* U+00148b: CANADIAN SYLLABICS CI*/
-                                           RTUNI_ALPHA, /* U+00148c: CANADIAN SYLLABICS CII*/
-                                           RTUNI_ALPHA, /* U+00148d: CANADIAN SYLLABICS CO*/
-                                           RTUNI_ALPHA, /* U+00148e: CANADIAN SYLLABICS COO*/
-                                           RTUNI_ALPHA, /* U+00148f: CANADIAN SYLLABICS Y-CREE COO*/
-                                           RTUNI_ALPHA, /* U+001490: CANADIAN SYLLABICS CA*/
-                                           RTUNI_ALPHA, /* U+001491: CANADIAN SYLLABICS CAA*/
-                                           RTUNI_ALPHA, /* U+001492: CANADIAN SYLLABICS CWE*/
-                                           RTUNI_ALPHA, /* U+001493: CANADIAN SYLLABICS WEST-CREE CWE*/
-                                           RTUNI_ALPHA, /* U+001494: CANADIAN SYLLABICS CWI*/
-                                           RTUNI_ALPHA, /* U+001495: CANADIAN SYLLABICS WEST-CREE CWI*/
-                                           RTUNI_ALPHA, /* U+001496: CANADIAN SYLLABICS CWII*/
-                                           RTUNI_ALPHA, /* U+001497: CANADIAN SYLLABICS WEST-CREE CWII*/
-                                           RTUNI_ALPHA, /* U+001498: CANADIAN SYLLABICS CWO*/
-                                           RTUNI_ALPHA, /* U+001499: CANADIAN SYLLABICS WEST-CREE CWO*/
-                                           RTUNI_ALPHA, /* U+00149a: CANADIAN SYLLABICS CWOO*/
-                                           RTUNI_ALPHA, /* U+00149b: CANADIAN SYLLABICS WEST-CREE CWOO*/
-                                           RTUNI_ALPHA, /* U+00149c: CANADIAN SYLLABICS CWA*/
-                                           RTUNI_ALPHA, /* U+00149d: CANADIAN SYLLABICS WEST-CREE CWA*/
-                                           RTUNI_ALPHA, /* U+00149e: CANADIAN SYLLABICS CWAA*/
-                                           RTUNI_ALPHA, /* U+00149f: CANADIAN SYLLABICS WEST-CREE CWAA*/
-                                           RTUNI_ALPHA, /* U+0014a0: CANADIAN SYLLABICS NASKAPI CWAA*/
-                                           RTUNI_ALPHA, /* U+0014a1: CANADIAN SYLLABICS C*/
-                                           RTUNI_ALPHA, /* U+0014a2: CANADIAN SYLLABICS SAYISI TH*/
-                                           RTUNI_ALPHA, /* U+0014a3: CANADIAN SYLLABICS ME*/
-                                           RTUNI_ALPHA, /* U+0014a4: CANADIAN SYLLABICS MAAI*/
-                                           RTUNI_ALPHA, /* U+0014a5: CANADIAN SYLLABICS MI*/
-                                           RTUNI_ALPHA, /* U+0014a6: CANADIAN SYLLABICS MII*/
-                                           RTUNI_ALPHA, /* U+0014a7: CANADIAN SYLLABICS MO*/
-                                           RTUNI_ALPHA, /* U+0014a8: CANADIAN SYLLABICS MOO*/
-                                           RTUNI_ALPHA, /* U+0014a9: CANADIAN SYLLABICS Y-CREE MOO*/
-                                           RTUNI_ALPHA, /* U+0014aa: CANADIAN SYLLABICS MA*/
-                                           RTUNI_ALPHA, /* U+0014ab: CANADIAN SYLLABICS MAA*/
-                                           RTUNI_ALPHA, /* U+0014ac: CANADIAN SYLLABICS MWE*/
-                                           RTUNI_ALPHA, /* U+0014ad: CANADIAN SYLLABICS WEST-CREE MWE*/
-                                           RTUNI_ALPHA, /* U+0014ae: CANADIAN SYLLABICS MWI*/
-                                           RTUNI_ALPHA, /* U+0014af: CANADIAN SYLLABICS WEST-CREE MWI*/
-                                           RTUNI_ALPHA, /* U+0014b0: CANADIAN SYLLABICS MWII*/
-                                           RTUNI_ALPHA, /* U+0014b1: CANADIAN SYLLABICS WEST-CREE MWII*/
-                                           RTUNI_ALPHA, /* U+0014b2: CANADIAN SYLLABICS MWO*/
-                                           RTUNI_ALPHA, /* U+0014b3: CANADIAN SYLLABICS WEST-CREE MWO*/
-                                           RTUNI_ALPHA, /* U+0014b4: CANADIAN SYLLABICS MWOO*/
-                                           RTUNI_ALPHA, /* U+0014b5: CANADIAN SYLLABICS WEST-CREE MWOO*/
-                                           RTUNI_ALPHA, /* U+0014b6: CANADIAN SYLLABICS MWA*/
-                                           RTUNI_ALPHA, /* U+0014b7: CANADIAN SYLLABICS WEST-CREE MWA*/
-                                           RTUNI_ALPHA, /* U+0014b8: CANADIAN SYLLABICS MWAA*/
-                                           RTUNI_ALPHA, /* U+0014b9: CANADIAN SYLLABICS WEST-CREE MWAA*/
-                                           RTUNI_ALPHA, /* U+0014ba: CANADIAN SYLLABICS NASKAPI MWAA*/
-                                           RTUNI_ALPHA, /* U+0014bb: CANADIAN SYLLABICS M*/
-                                           RTUNI_ALPHA, /* U+0014bc: CANADIAN SYLLABICS WEST-CREE M*/
-                                           RTUNI_ALPHA, /* U+0014bd: CANADIAN SYLLABICS MH*/
-                                           RTUNI_ALPHA, /* U+0014be: CANADIAN SYLLABICS ATHAPASCAN M*/
-                                           RTUNI_ALPHA, /* U+0014bf: CANADIAN SYLLABICS SAYISI M*/
-                                           RTUNI_ALPHA, /* U+0014c0: CANADIAN SYLLABICS NE*/
-                                           RTUNI_ALPHA, /* U+0014c1: CANADIAN SYLLABICS NAAI*/
-                                           RTUNI_ALPHA, /* U+0014c2: CANADIAN SYLLABICS NI*/
-                                           RTUNI_ALPHA, /* U+0014c3: CANADIAN SYLLABICS NII*/
-                                           RTUNI_ALPHA, /* U+0014c4: CANADIAN SYLLABICS NO*/
-                                           RTUNI_ALPHA, /* U+0014c5: CANADIAN SYLLABICS NOO*/
-                                           RTUNI_ALPHA, /* U+0014c6: CANADIAN SYLLABICS Y-CREE NOO*/
-                                           RTUNI_ALPHA, /* U+0014c7: CANADIAN SYLLABICS NA*/
-                                           RTUNI_ALPHA, /* U+0014c8: CANADIAN SYLLABICS NAA*/
-                                           RTUNI_ALPHA, /* U+0014c9: CANADIAN SYLLABICS NWE*/
-                                           RTUNI_ALPHA, /* U+0014ca: CANADIAN SYLLABICS WEST-CREE NWE*/
-                                           RTUNI_ALPHA, /* U+0014cb: CANADIAN SYLLABICS NWA*/
-                                           RTUNI_ALPHA, /* U+0014cc: CANADIAN SYLLABICS WEST-CREE NWA*/
-                                           RTUNI_ALPHA, /* U+0014cd: CANADIAN SYLLABICS NWAA*/
-                                           RTUNI_ALPHA, /* U+0014ce: CANADIAN SYLLABICS WEST-CREE NWAA*/
-                                           RTUNI_ALPHA, /* U+0014cf: CANADIAN SYLLABICS NASKAPI NWAA*/
-                                           RTUNI_ALPHA, /* U+0014d0: CANADIAN SYLLABICS N*/
-                                           RTUNI_ALPHA, /* U+0014d1: CANADIAN SYLLABICS CARRIER NG*/
-                                           RTUNI_ALPHA, /* U+0014d2: CANADIAN SYLLABICS NH*/
-                                           RTUNI_ALPHA, /* U+0014d3: CANADIAN SYLLABICS LE*/
-                                           RTUNI_ALPHA, /* U+0014d4: CANADIAN SYLLABICS LAAI*/
-                                           RTUNI_ALPHA, /* U+0014d5: CANADIAN SYLLABICS LI*/
-                                           RTUNI_ALPHA, /* U+0014d6: CANADIAN SYLLABICS LII*/
-                                           RTUNI_ALPHA, /* U+0014d7: CANADIAN SYLLABICS LO*/
-                                           RTUNI_ALPHA, /* U+0014d8: CANADIAN SYLLABICS LOO*/
-                                           RTUNI_ALPHA, /* U+0014d9: CANADIAN SYLLABICS Y-CREE LOO*/
-                                           RTUNI_ALPHA, /* U+0014da: CANADIAN SYLLABICS LA*/
-                                           RTUNI_ALPHA, /* U+0014db: CANADIAN SYLLABICS LAA*/
-                                           RTUNI_ALPHA, /* U+0014dc: CANADIAN SYLLABICS LWE*/
-                                           RTUNI_ALPHA, /* U+0014dd: CANADIAN SYLLABICS WEST-CREE LWE*/
-                                           RTUNI_ALPHA, /* U+0014de: CANADIAN SYLLABICS LWI*/
-                                           RTUNI_ALPHA, /* U+0014df: CANADIAN SYLLABICS WEST-CREE LWI*/
-                                           RTUNI_ALPHA, /* U+0014e0: CANADIAN SYLLABICS LWII*/
-                                           RTUNI_ALPHA, /* U+0014e1: CANADIAN SYLLABICS WEST-CREE LWII*/
-                                           RTUNI_ALPHA, /* U+0014e2: CANADIAN SYLLABICS LWO*/
-                                           RTUNI_ALPHA, /* U+0014e3: CANADIAN SYLLABICS WEST-CREE LWO*/
-                                           RTUNI_ALPHA, /* U+0014e4: CANADIAN SYLLABICS LWOO*/
-                                           RTUNI_ALPHA, /* U+0014e5: CANADIAN SYLLABICS WEST-CREE LWOO*/
-                                           RTUNI_ALPHA, /* U+0014e6: CANADIAN SYLLABICS LWA*/
-                                           RTUNI_ALPHA, /* U+0014e7: CANADIAN SYLLABICS WEST-CREE LWA*/
-                                           RTUNI_ALPHA, /* U+0014e8: CANADIAN SYLLABICS LWAA*/
-                                           RTUNI_ALPHA, /* U+0014e9: CANADIAN SYLLABICS WEST-CREE LWAA*/
-                                           RTUNI_ALPHA, /* U+0014ea: CANADIAN SYLLABICS L*/
-                                           RTUNI_ALPHA, /* U+0014eb: CANADIAN SYLLABICS WEST-CREE L*/
-                                           RTUNI_ALPHA, /* U+0014ec: CANADIAN SYLLABICS MEDIAL L*/
-                                           RTUNI_ALPHA, /* U+0014ed: CANADIAN SYLLABICS SE*/
-                                           RTUNI_ALPHA, /* U+0014ee: CANADIAN SYLLABICS SAAI*/
-                                           RTUNI_ALPHA, /* U+0014ef: CANADIAN SYLLABICS SI*/
-                                           RTUNI_ALPHA, /* U+0014f0: CANADIAN SYLLABICS SII*/
-                                           RTUNI_ALPHA, /* U+0014f1: CANADIAN SYLLABICS SO*/
-                                           RTUNI_ALPHA, /* U+0014f2: CANADIAN SYLLABICS SOO*/
-                                           RTUNI_ALPHA, /* U+0014f3: CANADIAN SYLLABICS Y-CREE SOO*/
-                                           RTUNI_ALPHA, /* U+0014f4: CANADIAN SYLLABICS SA*/
-                                           RTUNI_ALPHA, /* U+0014f5: CANADIAN SYLLABICS SAA*/
-                                           RTUNI_ALPHA, /* U+0014f6: CANADIAN SYLLABICS SWE*/
-                                           RTUNI_ALPHA, /* U+0014f7: CANADIAN SYLLABICS WEST-CREE SWE*/
-                                           RTUNI_ALPHA, /* U+0014f8: CANADIAN SYLLABICS SWI*/
-                                           RTUNI_ALPHA, /* U+0014f9: CANADIAN SYLLABICS WEST-CREE SWI*/
-                                           RTUNI_ALPHA, /* U+0014fa: CANADIAN SYLLABICS SWII*/
-                                           RTUNI_ALPHA, /* U+0014fb: CANADIAN SYLLABICS WEST-CREE SWII*/
-                                           RTUNI_ALPHA, /* U+0014fc: CANADIAN SYLLABICS SWO*/
-                                           RTUNI_ALPHA, /* U+0014fd: CANADIAN SYLLABICS WEST-CREE SWO*/
-                                           RTUNI_ALPHA, /* U+0014fe: CANADIAN SYLLABICS SWOO*/
-                                           RTUNI_ALPHA, /* U+0014ff: CANADIAN SYLLABICS WEST-CREE SWOO*/
-                                           RTUNI_ALPHA, /* U+001500: CANADIAN SYLLABICS SWA*/
-                                           RTUNI_ALPHA, /* U+001501: CANADIAN SYLLABICS WEST-CREE SWA*/
-                                           RTUNI_ALPHA, /* U+001502: CANADIAN SYLLABICS SWAA*/
-                                           RTUNI_ALPHA, /* U+001503: CANADIAN SYLLABICS WEST-CREE SWAA*/
-                                           RTUNI_ALPHA, /* U+001504: CANADIAN SYLLABICS NASKAPI SWAA*/
-                                           RTUNI_ALPHA, /* U+001505: CANADIAN SYLLABICS S*/
-                                           RTUNI_ALPHA, /* U+001506: CANADIAN SYLLABICS ATHAPASCAN S*/
-                                           RTUNI_ALPHA, /* U+001507: CANADIAN SYLLABICS SW*/
-                                           RTUNI_ALPHA, /* U+001508: CANADIAN SYLLABICS BLACKFOOT S*/
-                                           RTUNI_ALPHA, /* U+001509: CANADIAN SYLLABICS MOOSE-CREE SK*/
-                                           RTUNI_ALPHA, /* U+00150a: CANADIAN SYLLABICS NASKAPI SKW*/
-                                           RTUNI_ALPHA, /* U+00150b: CANADIAN SYLLABICS NASKAPI S-W*/
-                                           RTUNI_ALPHA, /* U+00150c: CANADIAN SYLLABICS NASKAPI SPWA*/
-                                           RTUNI_ALPHA, /* U+00150d: CANADIAN SYLLABICS NASKAPI STWA*/
-                                           RTUNI_ALPHA, /* U+00150e: CANADIAN SYLLABICS NASKAPI SKWA*/
-                                           RTUNI_ALPHA, /* U+00150f: CANADIAN SYLLABICS NASKAPI SCWA*/
-                                           RTUNI_ALPHA, /* U+001510: CANADIAN SYLLABICS SHE*/
-                                           RTUNI_ALPHA, /* U+001511: CANADIAN SYLLABICS SHI*/
-                                           RTUNI_ALPHA, /* U+001512: CANADIAN SYLLABICS SHII*/
-                                           RTUNI_ALPHA, /* U+001513: CANADIAN SYLLABICS SHO*/
-                                           RTUNI_ALPHA, /* U+001514: CANADIAN SYLLABICS SHOO*/
-                                           RTUNI_ALPHA, /* U+001515: CANADIAN SYLLABICS SHA*/
-                                           RTUNI_ALPHA, /* U+001516: CANADIAN SYLLABICS SHAA*/
-                                           RTUNI_ALPHA, /* U+001517: CANADIAN SYLLABICS SHWE*/
-                                           RTUNI_ALPHA, /* U+001518: CANADIAN SYLLABICS WEST-CREE SHWE*/
-                                           RTUNI_ALPHA, /* U+001519: CANADIAN SYLLABICS SHWI*/
-                                           RTUNI_ALPHA, /* U+00151a: CANADIAN SYLLABICS WEST-CREE SHWI*/
-                                           RTUNI_ALPHA, /* U+00151b: CANADIAN SYLLABICS SHWII*/
-                                           RTUNI_ALPHA, /* U+00151c: CANADIAN SYLLABICS WEST-CREE SHWII*/
-                                           RTUNI_ALPHA, /* U+00151d: CANADIAN SYLLABICS SHWO*/
-                                           RTUNI_ALPHA, /* U+00151e: CANADIAN SYLLABICS WEST-CREE SHWO*/
-                                           RTUNI_ALPHA, /* U+00151f: CANADIAN SYLLABICS SHWOO*/
-                                           RTUNI_ALPHA, /* U+001520: CANADIAN SYLLABICS WEST-CREE SHWOO*/
-                                           RTUNI_ALPHA, /* U+001521: CANADIAN SYLLABICS SHWA*/
-                                           RTUNI_ALPHA, /* U+001522: CANADIAN SYLLABICS WEST-CREE SHWA*/
-                                           RTUNI_ALPHA, /* U+001523: CANADIAN SYLLABICS SHWAA*/
-                                           RTUNI_ALPHA, /* U+001524: CANADIAN SYLLABICS WEST-CREE SHWAA*/
-                                           RTUNI_ALPHA, /* U+001525: CANADIAN SYLLABICS SH*/
-                                           RTUNI_ALPHA, /* U+001526: CANADIAN SYLLABICS YE*/
-                                           RTUNI_ALPHA, /* U+001527: CANADIAN SYLLABICS YAAI*/
-                                           RTUNI_ALPHA, /* U+001528: CANADIAN SYLLABICS YI*/
-                                           RTUNI_ALPHA, /* U+001529: CANADIAN SYLLABICS YII*/
-                                           RTUNI_ALPHA, /* U+00152a: CANADIAN SYLLABICS YO*/
-                                           RTUNI_ALPHA, /* U+00152b: CANADIAN SYLLABICS YOO*/
-                                           RTUNI_ALPHA, /* U+00152c: CANADIAN SYLLABICS Y-CREE YOO*/
-                                           RTUNI_ALPHA, /* U+00152d: CANADIAN SYLLABICS YA*/
-                                           RTUNI_ALPHA, /* U+00152e: CANADIAN SYLLABICS YAA*/
-                                           RTUNI_ALPHA, /* U+00152f: CANADIAN SYLLABICS YWE*/
-                                           RTUNI_ALPHA, /* U+001530: CANADIAN SYLLABICS WEST-CREE YWE*/
-                                           RTUNI_ALPHA, /* U+001531: CANADIAN SYLLABICS YWI*/
-                                           RTUNI_ALPHA, /* U+001532: CANADIAN SYLLABICS WEST-CREE YWI*/
-                                           RTUNI_ALPHA, /* U+001533: CANADIAN SYLLABICS YWII*/
-                                           RTUNI_ALPHA, /* U+001534: CANADIAN SYLLABICS WEST-CREE YWII*/
-                                           RTUNI_ALPHA, /* U+001535: CANADIAN SYLLABICS YWO*/
-                                           RTUNI_ALPHA, /* U+001536: CANADIAN SYLLABICS WEST-CREE YWO*/
-                                           RTUNI_ALPHA, /* U+001537: CANADIAN SYLLABICS YWOO*/
-                                           RTUNI_ALPHA, /* U+001538: CANADIAN SYLLABICS WEST-CREE YWOO*/
-                                           RTUNI_ALPHA, /* U+001539: CANADIAN SYLLABICS YWA*/
-                                           RTUNI_ALPHA, /* U+00153a: CANADIAN SYLLABICS WEST-CREE YWA*/
-                                           RTUNI_ALPHA, /* U+00153b: CANADIAN SYLLABICS YWAA*/
-                                           RTUNI_ALPHA, /* U+00153c: CANADIAN SYLLABICS WEST-CREE YWAA*/
-                                           RTUNI_ALPHA, /* U+00153d: CANADIAN SYLLABICS NASKAPI YWAA*/
-                                           RTUNI_ALPHA, /* U+00153e: CANADIAN SYLLABICS Y*/
-                                           RTUNI_ALPHA, /* U+00153f: CANADIAN SYLLABICS BIBLE-CREE Y*/
-                                           RTUNI_ALPHA, /* U+001540: CANADIAN SYLLABICS WEST-CREE Y*/
-                                           RTUNI_ALPHA, /* U+001541: CANADIAN SYLLABICS SAYISI YI*/
-                                           RTUNI_ALPHA, /* U+001542: CANADIAN SYLLABICS RE*/
-                                           RTUNI_ALPHA, /* U+001543: CANADIAN SYLLABICS R-CREE RE*/
-                                           RTUNI_ALPHA, /* U+001544: CANADIAN SYLLABICS WEST-CREE LE*/
-                                           RTUNI_ALPHA, /* U+001545: CANADIAN SYLLABICS RAAI*/
-                                           RTUNI_ALPHA, /* U+001546: CANADIAN SYLLABICS RI*/
-                                           RTUNI_ALPHA, /* U+001547: CANADIAN SYLLABICS RII*/
-                                           RTUNI_ALPHA, /* U+001548: CANADIAN SYLLABICS RO*/
-                                           RTUNI_ALPHA, /* U+001549: CANADIAN SYLLABICS ROO*/
-                                           RTUNI_ALPHA, /* U+00154a: CANADIAN SYLLABICS WEST-CREE LO*/
-                                           RTUNI_ALPHA, /* U+00154b: CANADIAN SYLLABICS RA*/
-                                           RTUNI_ALPHA, /* U+00154c: CANADIAN SYLLABICS RAA*/
-                                           RTUNI_ALPHA, /* U+00154d: CANADIAN SYLLABICS WEST-CREE LA*/
-                                           RTUNI_ALPHA, /* U+00154e: CANADIAN SYLLABICS RWAA*/
-                                           RTUNI_ALPHA, /* U+00154f: CANADIAN SYLLABICS WEST-CREE RWAA*/
-                                           RTUNI_ALPHA, /* U+001550: CANADIAN SYLLABICS R*/
-                                           RTUNI_ALPHA, /* U+001551: CANADIAN SYLLABICS WEST-CREE R*/
-                                           RTUNI_ALPHA, /* U+001552: CANADIAN SYLLABICS MEDIAL R*/
-                                           RTUNI_ALPHA, /* U+001553: CANADIAN SYLLABICS FE*/
-                                           RTUNI_ALPHA, /* U+001554: CANADIAN SYLLABICS FAAI*/
-                                           RTUNI_ALPHA, /* U+001555: CANADIAN SYLLABICS FI*/
-                                           RTUNI_ALPHA, /* U+001556: CANADIAN SYLLABICS FII*/
-                                           RTUNI_ALPHA, /* U+001557: CANADIAN SYLLABICS FO*/
-                                           RTUNI_ALPHA, /* U+001558: CANADIAN SYLLABICS FOO*/
-                                           RTUNI_ALPHA, /* U+001559: CANADIAN SYLLABICS FA*/
-                                           RTUNI_ALPHA, /* U+00155a: CANADIAN SYLLABICS FAA*/
-                                           RTUNI_ALPHA, /* U+00155b: CANADIAN SYLLABICS FWAA*/
-                                           RTUNI_ALPHA, /* U+00155c: CANADIAN SYLLABICS WEST-CREE FWAA*/
-                                           RTUNI_ALPHA, /* U+00155d: CANADIAN SYLLABICS F*/
-                                           RTUNI_ALPHA, /* U+00155e: CANADIAN SYLLABICS THE*/
-                                           RTUNI_ALPHA, /* U+00155f: CANADIAN SYLLABICS N-CREE THE*/
-                                           RTUNI_ALPHA, /* U+001560: CANADIAN SYLLABICS THI*/
-                                           RTUNI_ALPHA, /* U+001561: CANADIAN SYLLABICS N-CREE THI*/
-                                           RTUNI_ALPHA, /* U+001562: CANADIAN SYLLABICS THII*/
-                                           RTUNI_ALPHA, /* U+001563: CANADIAN SYLLABICS N-CREE THII*/
-                                           RTUNI_ALPHA, /* U+001564: CANADIAN SYLLABICS THO*/
-                                           RTUNI_ALPHA, /* U+001565: CANADIAN SYLLABICS THOO*/
-                                           RTUNI_ALPHA, /* U+001566: CANADIAN SYLLABICS THA*/
-                                           RTUNI_ALPHA, /* U+001567: CANADIAN SYLLABICS THAA*/
-                                           RTUNI_ALPHA, /* U+001568: CANADIAN SYLLABICS THWAA*/
-                                           RTUNI_ALPHA, /* U+001569: CANADIAN SYLLABICS WEST-CREE THWAA*/
-                                           RTUNI_ALPHA, /* U+00156a: CANADIAN SYLLABICS TH*/
-                                           RTUNI_ALPHA, /* U+00156b: CANADIAN SYLLABICS TTHE*/
-                                           RTUNI_ALPHA, /* U+00156c: CANADIAN SYLLABICS TTHI*/
-                                           RTUNI_ALPHA, /* U+00156d: CANADIAN SYLLABICS TTHO*/
-                                           RTUNI_ALPHA, /* U+00156e: CANADIAN SYLLABICS TTHA*/
-                                           RTUNI_ALPHA, /* U+00156f: CANADIAN SYLLABICS TTH*/
-                                           RTUNI_ALPHA, /* U+001570: CANADIAN SYLLABICS TYE*/
-                                           RTUNI_ALPHA, /* U+001571: CANADIAN SYLLABICS TYI*/
-                                           RTUNI_ALPHA, /* U+001572: CANADIAN SYLLABICS TYO*/
-                                           RTUNI_ALPHA, /* U+001573: CANADIAN SYLLABICS TYA*/
-                                           RTUNI_ALPHA, /* U+001574: CANADIAN SYLLABICS NUNAVIK HE*/
-                                           RTUNI_ALPHA, /* U+001575: CANADIAN SYLLABICS NUNAVIK HI*/
-                                           RTUNI_ALPHA, /* U+001576: CANADIAN SYLLABICS NUNAVIK HII*/
-                                           RTUNI_ALPHA, /* U+001577: CANADIAN SYLLABICS NUNAVIK HO*/
-                                           RTUNI_ALPHA, /* U+001578: CANADIAN SYLLABICS NUNAVIK HOO*/
-                                           RTUNI_ALPHA, /* U+001579: CANADIAN SYLLABICS NUNAVIK HA*/
-                                           RTUNI_ALPHA, /* U+00157a: CANADIAN SYLLABICS NUNAVIK HAA*/
-                                           RTUNI_ALPHA, /* U+00157b: CANADIAN SYLLABICS NUNAVIK H*/
-                                           RTUNI_ALPHA, /* U+00157c: CANADIAN SYLLABICS NUNAVUT H*/
-                                           RTUNI_ALPHA, /* U+00157d: CANADIAN SYLLABICS HK*/
-                                           RTUNI_ALPHA, /* U+00157e: CANADIAN SYLLABICS QAAI*/
-                                           RTUNI_ALPHA, /* U+00157f: CANADIAN SYLLABICS QI*/
-                                           RTUNI_ALPHA, /* U+001580: CANADIAN SYLLABICS QII*/
-                                           RTUNI_ALPHA, /* U+001581: CANADIAN SYLLABICS QO*/
-                                           RTUNI_ALPHA, /* U+001582: CANADIAN SYLLABICS QOO*/
-                                           RTUNI_ALPHA, /* U+001583: CANADIAN SYLLABICS QA*/
-                                           RTUNI_ALPHA, /* U+001584: CANADIAN SYLLABICS QAA*/
-                                           RTUNI_ALPHA, /* U+001585: CANADIAN SYLLABICS Q*/
-                                           RTUNI_ALPHA, /* U+001586: CANADIAN SYLLABICS TLHE*/
-                                           RTUNI_ALPHA, /* U+001587: CANADIAN SYLLABICS TLHI*/
-                                           RTUNI_ALPHA, /* U+001588: CANADIAN SYLLABICS TLHO*/
-                                           RTUNI_ALPHA, /* U+001589: CANADIAN SYLLABICS TLHA*/
-                                           RTUNI_ALPHA, /* U+00158a: CANADIAN SYLLABICS WEST-CREE RE*/
-                                           RTUNI_ALPHA, /* U+00158b: CANADIAN SYLLABICS WEST-CREE RI*/
-                                           RTUNI_ALPHA, /* U+00158c: CANADIAN SYLLABICS WEST-CREE RO*/
-                                           RTUNI_ALPHA, /* U+00158d: CANADIAN SYLLABICS WEST-CREE RA*/
-                                           RTUNI_ALPHA, /* U+00158e: CANADIAN SYLLABICS NGAAI*/
-                                           RTUNI_ALPHA, /* U+00158f: CANADIAN SYLLABICS NGI*/
-                                           RTUNI_ALPHA, /* U+001590: CANADIAN SYLLABICS NGII*/
-                                           RTUNI_ALPHA, /* U+001591: CANADIAN SYLLABICS NGO*/
-                                           RTUNI_ALPHA, /* U+001592: CANADIAN SYLLABICS NGOO*/
-                                           RTUNI_ALPHA, /* U+001593: CANADIAN SYLLABICS NGA*/
-                                           RTUNI_ALPHA, /* U+001594: CANADIAN SYLLABICS NGAA*/
-                                           RTUNI_ALPHA, /* U+001595: CANADIAN SYLLABICS NG*/
-                                           RTUNI_ALPHA, /* U+001596: CANADIAN SYLLABICS NNG*/
-                                           RTUNI_ALPHA, /* U+001597: CANADIAN SYLLABICS SAYISI SHE*/
-                                           RTUNI_ALPHA, /* U+001598: CANADIAN SYLLABICS SAYISI SHI*/
-                                           RTUNI_ALPHA, /* U+001599: CANADIAN SYLLABICS SAYISI SHO*/
-                                           RTUNI_ALPHA, /* U+00159a: CANADIAN SYLLABICS SAYISI SHA*/
-                                           RTUNI_ALPHA, /* U+00159b: CANADIAN SYLLABICS WOODS-CREE THE*/
-                                           RTUNI_ALPHA, /* U+00159c: CANADIAN SYLLABICS WOODS-CREE THI*/
-                                           RTUNI_ALPHA, /* U+00159d: CANADIAN SYLLABICS WOODS-CREE THO*/
-                                           RTUNI_ALPHA, /* U+00159e: CANADIAN SYLLABICS WOODS-CREE THA*/
-                                           RTUNI_ALPHA, /* U+00159f: CANADIAN SYLLABICS WOODS-CREE TH*/
-                                           RTUNI_ALPHA, /* U+0015a0: CANADIAN SYLLABICS LHI*/
-                                           RTUNI_ALPHA, /* U+0015a1: CANADIAN SYLLABICS LHII*/
-                                           RTUNI_ALPHA, /* U+0015a2: CANADIAN SYLLABICS LHO*/
-                                           RTUNI_ALPHA, /* U+0015a3: CANADIAN SYLLABICS LHOO*/
-                                           RTUNI_ALPHA, /* U+0015a4: CANADIAN SYLLABICS LHA*/
-                                           RTUNI_ALPHA, /* U+0015a5: CANADIAN SYLLABICS LHAA*/
-                                           RTUNI_ALPHA, /* U+0015a6: CANADIAN SYLLABICS LH*/
-                                           RTUNI_ALPHA, /* U+0015a7: CANADIAN SYLLABICS TH-CREE THE*/
-                                           RTUNI_ALPHA, /* U+0015a8: CANADIAN SYLLABICS TH-CREE THI*/
-                                           RTUNI_ALPHA, /* U+0015a9: CANADIAN SYLLABICS TH-CREE THII*/
-                                           RTUNI_ALPHA, /* U+0015aa: CANADIAN SYLLABICS TH-CREE THO*/
-                                           RTUNI_ALPHA, /* U+0015ab: CANADIAN SYLLABICS TH-CREE THOO*/
-                                           RTUNI_ALPHA, /* U+0015ac: CANADIAN SYLLABICS TH-CREE THA*/
-                                           RTUNI_ALPHA, /* U+0015ad: CANADIAN SYLLABICS TH-CREE THAA*/
-                                           RTUNI_ALPHA, /* U+0015ae: CANADIAN SYLLABICS TH-CREE TH*/
-                                           RTUNI_ALPHA, /* U+0015af: CANADIAN SYLLABICS AIVILIK B*/
-                                           RTUNI_ALPHA, /* U+0015b0: CANADIAN SYLLABICS BLACKFOOT E*/
-                                           RTUNI_ALPHA, /* U+0015b1: CANADIAN SYLLABICS BLACKFOOT I*/
-                                           RTUNI_ALPHA, /* U+0015b2: CANADIAN SYLLABICS BLACKFOOT O*/
-                                           RTUNI_ALPHA, /* U+0015b3: CANADIAN SYLLABICS BLACKFOOT A*/
-                                           RTUNI_ALPHA, /* U+0015b4: CANADIAN SYLLABICS BLACKFOOT WE*/
-                                           RTUNI_ALPHA, /* U+0015b5: CANADIAN SYLLABICS BLACKFOOT WI*/
-                                           RTUNI_ALPHA, /* U+0015b6: CANADIAN SYLLABICS BLACKFOOT WO*/
-                                           RTUNI_ALPHA, /* U+0015b7: CANADIAN SYLLABICS BLACKFOOT WA*/
-                                           RTUNI_ALPHA, /* U+0015b8: CANADIAN SYLLABICS BLACKFOOT NE*/
-                                           RTUNI_ALPHA, /* U+0015b9: CANADIAN SYLLABICS BLACKFOOT NI*/
-                                           RTUNI_ALPHA, /* U+0015ba: CANADIAN SYLLABICS BLACKFOOT NO*/
-                                           RTUNI_ALPHA, /* U+0015bb: CANADIAN SYLLABICS BLACKFOOT NA*/
-                                           RTUNI_ALPHA, /* U+0015bc: CANADIAN SYLLABICS BLACKFOOT KE*/
-                                           RTUNI_ALPHA, /* U+0015bd: CANADIAN SYLLABICS BLACKFOOT KI*/
-                                           RTUNI_ALPHA, /* U+0015be: CANADIAN SYLLABICS BLACKFOOT KO*/
-                                           RTUNI_ALPHA, /* U+0015bf: CANADIAN SYLLABICS BLACKFOOT KA*/
-                                           RTUNI_ALPHA, /* U+0015c0: CANADIAN SYLLABICS SAYISI HE*/
-                                           RTUNI_ALPHA, /* U+0015c1: CANADIAN SYLLABICS SAYISI HI*/
-                                           RTUNI_ALPHA, /* U+0015c2: CANADIAN SYLLABICS SAYISI HO*/
-                                           RTUNI_ALPHA, /* U+0015c3: CANADIAN SYLLABICS SAYISI HA*/
-                                           RTUNI_ALPHA, /* U+0015c4: CANADIAN SYLLABICS CARRIER GHU*/
-                                           RTUNI_ALPHA, /* U+0015c5: CANADIAN SYLLABICS CARRIER GHO*/
-                                           RTUNI_ALPHA, /* U+0015c6: CANADIAN SYLLABICS CARRIER GHE*/
-                                           RTUNI_ALPHA, /* U+0015c7: CANADIAN SYLLABICS CARRIER GHEE*/
-                                           RTUNI_ALPHA, /* U+0015c8: CANADIAN SYLLABICS CARRIER GHI*/
-                                           RTUNI_ALPHA, /* U+0015c9: CANADIAN SYLLABICS CARRIER GHA*/
-                                           RTUNI_ALPHA, /* U+0015ca: CANADIAN SYLLABICS CARRIER RU*/
-                                           RTUNI_ALPHA, /* U+0015cb: CANADIAN SYLLABICS CARRIER RO*/
-                                           RTUNI_ALPHA, /* U+0015cc: CANADIAN SYLLABICS CARRIER RE*/
-                                           RTUNI_ALPHA, /* U+0015cd: CANADIAN SYLLABICS CARRIER REE*/
-                                           RTUNI_ALPHA, /* U+0015ce: CANADIAN SYLLABICS CARRIER RI*/
-                                           RTUNI_ALPHA, /* U+0015cf: CANADIAN SYLLABICS CARRIER RA*/
-                                           RTUNI_ALPHA, /* U+0015d0: CANADIAN SYLLABICS CARRIER WU*/
-                                           RTUNI_ALPHA, /* U+0015d1: CANADIAN SYLLABICS CARRIER WO*/
-                                           RTUNI_ALPHA, /* U+0015d2: CANADIAN SYLLABICS CARRIER WE*/
-                                           RTUNI_ALPHA, /* U+0015d3: CANADIAN SYLLABICS CARRIER WEE*/
-                                           RTUNI_ALPHA, /* U+0015d4: CANADIAN SYLLABICS CARRIER WI*/
-                                           RTUNI_ALPHA, /* U+0015d5: CANADIAN SYLLABICS CARRIER WA*/
-                                           RTUNI_ALPHA, /* U+0015d6: CANADIAN SYLLABICS CARRIER HWU*/
-                                           RTUNI_ALPHA, /* U+0015d7: CANADIAN SYLLABICS CARRIER HWO*/
-                                           RTUNI_ALPHA, /* U+0015d8: CANADIAN SYLLABICS CARRIER HWE*/
-                                           RTUNI_ALPHA, /* U+0015d9: CANADIAN SYLLABICS CARRIER HWEE*/
-                                           RTUNI_ALPHA, /* U+0015da: CANADIAN SYLLABICS CARRIER HWI*/
-                                           RTUNI_ALPHA, /* U+0015db: CANADIAN SYLLABICS CARRIER HWA*/
-                                           RTUNI_ALPHA, /* U+0015dc: CANADIAN SYLLABICS CARRIER THU*/
-                                           RTUNI_ALPHA, /* U+0015dd: CANADIAN SYLLABICS CARRIER THO*/
-                                           RTUNI_ALPHA, /* U+0015de: CANADIAN SYLLABICS CARRIER THE*/
-                                           RTUNI_ALPHA, /* U+0015df: CANADIAN SYLLABICS CARRIER THEE*/
-                                           RTUNI_ALPHA, /* U+0015e0: CANADIAN SYLLABICS CARRIER THI*/
-                                           RTUNI_ALPHA, /* U+0015e1: CANADIAN SYLLABICS CARRIER THA*/
-                                           RTUNI_ALPHA, /* U+0015e2: CANADIAN SYLLABICS CARRIER TTU*/
-                                           RTUNI_ALPHA, /* U+0015e3: CANADIAN SYLLABICS CARRIER TTO*/
-                                           RTUNI_ALPHA, /* U+0015e4: CANADIAN SYLLABICS CARRIER TTE*/
-                                           RTUNI_ALPHA, /* U+0015e5: CANADIAN SYLLABICS CARRIER TTEE*/
-                                           RTUNI_ALPHA, /* U+0015e6: CANADIAN SYLLABICS CARRIER TTI*/
-                                           RTUNI_ALPHA, /* U+0015e7: CANADIAN SYLLABICS CARRIER TTA*/
-                                           RTUNI_ALPHA, /* U+0015e8: CANADIAN SYLLABICS CARRIER PU*/
-                                           RTUNI_ALPHA, /* U+0015e9: CANADIAN SYLLABICS CARRIER PO*/
-                                           RTUNI_ALPHA, /* U+0015ea: CANADIAN SYLLABICS CARRIER PE*/
-                                           RTUNI_ALPHA, /* U+0015eb: CANADIAN SYLLABICS CARRIER PEE*/
-                                           RTUNI_ALPHA, /* U+0015ec: CANADIAN SYLLABICS CARRIER PI*/
-                                           RTUNI_ALPHA, /* U+0015ed: CANADIAN SYLLABICS CARRIER PA*/
-                                           RTUNI_ALPHA, /* U+0015ee: CANADIAN SYLLABICS CARRIER P*/
-                                           RTUNI_ALPHA, /* U+0015ef: CANADIAN SYLLABICS CARRIER GU*/
-                                           RTUNI_ALPHA, /* U+0015f0: CANADIAN SYLLABICS CARRIER GO*/
-                                           RTUNI_ALPHA, /* U+0015f1: CANADIAN SYLLABICS CARRIER GE*/
-                                           RTUNI_ALPHA, /* U+0015f2: CANADIAN SYLLABICS CARRIER GEE*/
-                                           RTUNI_ALPHA, /* U+0015f3: CANADIAN SYLLABICS CARRIER GI*/
-                                           RTUNI_ALPHA, /* U+0015f4: CANADIAN SYLLABICS CARRIER GA*/
-                                           RTUNI_ALPHA, /* U+0015f5: CANADIAN SYLLABICS CARRIER KHU*/
-                                           RTUNI_ALPHA, /* U+0015f6: CANADIAN SYLLABICS CARRIER KHO*/
-                                           RTUNI_ALPHA, /* U+0015f7: CANADIAN SYLLABICS CARRIER KHE*/
-                                           RTUNI_ALPHA, /* U+0015f8: CANADIAN SYLLABICS CARRIER KHEE*/
-                                           RTUNI_ALPHA, /* U+0015f9: CANADIAN SYLLABICS CARRIER KHI*/
-                                           RTUNI_ALPHA, /* U+0015fa: CANADIAN SYLLABICS CARRIER KHA*/
-                                           RTUNI_ALPHA, /* U+0015fb: CANADIAN SYLLABICS CARRIER KKU*/
-                                           RTUNI_ALPHA, /* U+0015fc: CANADIAN SYLLABICS CARRIER KKO*/
-                                           RTUNI_ALPHA, /* U+0015fd: CANADIAN SYLLABICS CARRIER KKE*/
-                                           RTUNI_ALPHA, /* U+0015fe: CANADIAN SYLLABICS CARRIER KKEE*/
-                                           RTUNI_ALPHA, /* U+0015ff: CANADIAN SYLLABICS CARRIER KKI*/
-                                           RTUNI_ALPHA, /* U+001600: CANADIAN SYLLABICS CARRIER KKA*/
-                                           RTUNI_ALPHA, /* U+001601: CANADIAN SYLLABICS CARRIER KK*/
-                                           RTUNI_ALPHA, /* U+001602: CANADIAN SYLLABICS CARRIER NU*/
-                                           RTUNI_ALPHA, /* U+001603: CANADIAN SYLLABICS CARRIER NO*/
-                                           RTUNI_ALPHA, /* U+001604: CANADIAN SYLLABICS CARRIER NE*/
-                                           RTUNI_ALPHA, /* U+001605: CANADIAN SYLLABICS CARRIER NEE*/
-                                           RTUNI_ALPHA, /* U+001606: CANADIAN SYLLABICS CARRIER NI*/
-                                           RTUNI_ALPHA, /* U+001607: CANADIAN SYLLABICS CARRIER NA*/
-                                           RTUNI_ALPHA, /* U+001608: CANADIAN SYLLABICS CARRIER MU*/
-                                           RTUNI_ALPHA, /* U+001609: CANADIAN SYLLABICS CARRIER MO*/
-                                           RTUNI_ALPHA, /* U+00160a: CANADIAN SYLLABICS CARRIER ME*/
-                                           RTUNI_ALPHA, /* U+00160b: CANADIAN SYLLABICS CARRIER MEE*/
-                                           RTUNI_ALPHA, /* U+00160c: CANADIAN SYLLABICS CARRIER MI*/
-                                           RTUNI_ALPHA, /* U+00160d: CANADIAN SYLLABICS CARRIER MA*/
-                                           RTUNI_ALPHA, /* U+00160e: CANADIAN SYLLABICS CARRIER YU*/
-                                           RTUNI_ALPHA, /* U+00160f: CANADIAN SYLLABICS CARRIER YO*/
-                                           RTUNI_ALPHA, /* U+001610: CANADIAN SYLLABICS CARRIER YE*/
-                                           RTUNI_ALPHA, /* U+001611: CANADIAN SYLLABICS CARRIER YEE*/
-                                           RTUNI_ALPHA, /* U+001612: CANADIAN SYLLABICS CARRIER YI*/
-                                           RTUNI_ALPHA, /* U+001613: CANADIAN SYLLABICS CARRIER YA*/
-                                           RTUNI_ALPHA, /* U+001614: CANADIAN SYLLABICS CARRIER JU*/
-                                           RTUNI_ALPHA, /* U+001615: CANADIAN SYLLABICS SAYISI JU*/
-                                           RTUNI_ALPHA, /* U+001616: CANADIAN SYLLABICS CARRIER JO*/
-                                           RTUNI_ALPHA, /* U+001617: CANADIAN SYLLABICS CARRIER JE*/
-                                           RTUNI_ALPHA, /* U+001618: CANADIAN SYLLABICS CARRIER JEE*/
-                                           RTUNI_ALPHA, /* U+001619: CANADIAN SYLLABICS CARRIER JI*/
-                                           RTUNI_ALPHA, /* U+00161a: CANADIAN SYLLABICS SAYISI JI*/
-                                           RTUNI_ALPHA, /* U+00161b: CANADIAN SYLLABICS CARRIER JA*/
-                                           RTUNI_ALPHA, /* U+00161c: CANADIAN SYLLABICS CARRIER JJU*/
-                                           RTUNI_ALPHA, /* U+00161d: CANADIAN SYLLABICS CARRIER JJO*/
-                                           RTUNI_ALPHA, /* U+00161e: CANADIAN SYLLABICS CARRIER JJE*/
-                                           RTUNI_ALPHA, /* U+00161f: CANADIAN SYLLABICS CARRIER JJEE*/
-                                           RTUNI_ALPHA, /* U+001620: CANADIAN SYLLABICS CARRIER JJI*/
-                                           RTUNI_ALPHA, /* U+001621: CANADIAN SYLLABICS CARRIER JJA*/
-                                           RTUNI_ALPHA, /* U+001622: CANADIAN SYLLABICS CARRIER LU*/
-                                           RTUNI_ALPHA, /* U+001623: CANADIAN SYLLABICS CARRIER LO*/
-                                           RTUNI_ALPHA, /* U+001624: CANADIAN SYLLABICS CARRIER LE*/
-                                           RTUNI_ALPHA, /* U+001625: CANADIAN SYLLABICS CARRIER LEE*/
-                                           RTUNI_ALPHA, /* U+001626: CANADIAN SYLLABICS CARRIER LI*/
-                                           RTUNI_ALPHA, /* U+001627: CANADIAN SYLLABICS CARRIER LA*/
-                                           RTUNI_ALPHA, /* U+001628: CANADIAN SYLLABICS CARRIER DLU*/
-                                           RTUNI_ALPHA, /* U+001629: CANADIAN SYLLABICS CARRIER DLO*/
-                                           RTUNI_ALPHA, /* U+00162a: CANADIAN SYLLABICS CARRIER DLE*/
-                                           RTUNI_ALPHA, /* U+00162b: CANADIAN SYLLABICS CARRIER DLEE*/
-                                           RTUNI_ALPHA, /* U+00162c: CANADIAN SYLLABICS CARRIER DLI*/
-                                           RTUNI_ALPHA, /* U+00162d: CANADIAN SYLLABICS CARRIER DLA*/
-                                           RTUNI_ALPHA, /* U+00162e: CANADIAN SYLLABICS CARRIER LHU*/
-                                           RTUNI_ALPHA, /* U+00162f: CANADIAN SYLLABICS CARRIER LHO*/
-                                           RTUNI_ALPHA, /* U+001630: CANADIAN SYLLABICS CARRIER LHE*/
-                                           RTUNI_ALPHA, /* U+001631: CANADIAN SYLLABICS CARRIER LHEE*/
-                                           RTUNI_ALPHA, /* U+001632: CANADIAN SYLLABICS CARRIER LHI*/
-                                           RTUNI_ALPHA, /* U+001633: CANADIAN SYLLABICS CARRIER LHA*/
-                                           RTUNI_ALPHA, /* U+001634: CANADIAN SYLLABICS CARRIER TLHU*/
-                                           RTUNI_ALPHA, /* U+001635: CANADIAN SYLLABICS CARRIER TLHO*/
-                                           RTUNI_ALPHA, /* U+001636: CANADIAN SYLLABICS CARRIER TLHE*/
-                                           RTUNI_ALPHA, /* U+001637: CANADIAN SYLLABICS CARRIER TLHEE*/
-                                           RTUNI_ALPHA, /* U+001638: CANADIAN SYLLABICS CARRIER TLHI*/
-                                           RTUNI_ALPHA, /* U+001639: CANADIAN SYLLABICS CARRIER TLHA*/
-                                           RTUNI_ALPHA, /* U+00163a: CANADIAN SYLLABICS CARRIER TLU*/
-                                           RTUNI_ALPHA, /* U+00163b: CANADIAN SYLLABICS CARRIER TLO*/
-                                           RTUNI_ALPHA, /* U+00163c: CANADIAN SYLLABICS CARRIER TLE*/
-                                           RTUNI_ALPHA, /* U+00163d: CANADIAN SYLLABICS CARRIER TLEE*/
-                                           RTUNI_ALPHA, /* U+00163e: CANADIAN SYLLABICS CARRIER TLI*/
-                                           RTUNI_ALPHA, /* U+00163f: CANADIAN SYLLABICS CARRIER TLA*/
-                                           RTUNI_ALPHA, /* U+001640: CANADIAN SYLLABICS CARRIER ZU*/
-                                           RTUNI_ALPHA, /* U+001641: CANADIAN SYLLABICS CARRIER ZO*/
-                                           RTUNI_ALPHA, /* U+001642: CANADIAN SYLLABICS CARRIER ZE*/
-                                           RTUNI_ALPHA, /* U+001643: CANADIAN SYLLABICS CARRIER ZEE*/
-                                           RTUNI_ALPHA, /* U+001644: CANADIAN SYLLABICS CARRIER ZI*/
-                                           RTUNI_ALPHA, /* U+001645: CANADIAN SYLLABICS CARRIER ZA*/
-                                           RTUNI_ALPHA, /* U+001646: CANADIAN SYLLABICS CARRIER Z*/
-                                           RTUNI_ALPHA, /* U+001647: CANADIAN SYLLABICS CARRIER INITIAL Z*/
-                                           RTUNI_ALPHA, /* U+001648: CANADIAN SYLLABICS CARRIER DZU*/
-                                           RTUNI_ALPHA, /* U+001649: CANADIAN SYLLABICS CARRIER DZO*/
-                                           RTUNI_ALPHA, /* U+00164a: CANADIAN SYLLABICS CARRIER DZE*/
-                                           RTUNI_ALPHA, /* U+00164b: CANADIAN SYLLABICS CARRIER DZEE*/
-                                           RTUNI_ALPHA, /* U+00164c: CANADIAN SYLLABICS CARRIER DZI*/
-                                           RTUNI_ALPHA, /* U+00164d: CANADIAN SYLLABICS CARRIER DZA*/
-                                           RTUNI_ALPHA, /* U+00164e: CANADIAN SYLLABICS CARRIER SU*/
-                                           RTUNI_ALPHA, /* U+00164f: CANADIAN SYLLABICS CARRIER SO*/
-                                           RTUNI_ALPHA, /* U+001650: CANADIAN SYLLABICS CARRIER SE*/
-                                           RTUNI_ALPHA, /* U+001651: CANADIAN SYLLABICS CARRIER SEE*/
-                                           RTUNI_ALPHA, /* U+001652: CANADIAN SYLLABICS CARRIER SI*/
-                                           RTUNI_ALPHA, /* U+001653: CANADIAN SYLLABICS CARRIER SA*/
-                                           RTUNI_ALPHA, /* U+001654: CANADIAN SYLLABICS CARRIER SHU*/
-                                           RTUNI_ALPHA, /* U+001655: CANADIAN SYLLABICS CARRIER SHO*/
-                                           RTUNI_ALPHA, /* U+001656: CANADIAN SYLLABICS CARRIER SHE*/
-                                           RTUNI_ALPHA, /* U+001657: CANADIAN SYLLABICS CARRIER SHEE*/
-                                           RTUNI_ALPHA, /* U+001658: CANADIAN SYLLABICS CARRIER SHI*/
-                                           RTUNI_ALPHA, /* U+001659: CANADIAN SYLLABICS CARRIER SHA*/
-                                           RTUNI_ALPHA, /* U+00165a: CANADIAN SYLLABICS CARRIER SH*/
-                                           RTUNI_ALPHA, /* U+00165b: CANADIAN SYLLABICS CARRIER TSU*/
-                                           RTUNI_ALPHA, /* U+00165c: CANADIAN SYLLABICS CARRIER TSO*/
-                                           RTUNI_ALPHA, /* U+00165d: CANADIAN SYLLABICS CARRIER TSE*/
-                                           RTUNI_ALPHA, /* U+00165e: CANADIAN SYLLABICS CARRIER TSEE*/
-                                           RTUNI_ALPHA, /* U+00165f: CANADIAN SYLLABICS CARRIER TSI*/
-                                           RTUNI_ALPHA, /* U+001660: CANADIAN SYLLABICS CARRIER TSA*/
-                                           RTUNI_ALPHA, /* U+001661: CANADIAN SYLLABICS CARRIER CHU*/
-                                           RTUNI_ALPHA, /* U+001662: CANADIAN SYLLABICS CARRIER CHO*/
-                                           RTUNI_ALPHA, /* U+001663: CANADIAN SYLLABICS CARRIER CHE*/
-                                           RTUNI_ALPHA, /* U+001664: CANADIAN SYLLABICS CARRIER CHEE*/
-                                           RTUNI_ALPHA, /* U+001665: CANADIAN SYLLABICS CARRIER CHI*/
-                                           RTUNI_ALPHA, /* U+001666: CANADIAN SYLLABICS CARRIER CHA*/
-                                           RTUNI_ALPHA, /* U+001667: CANADIAN SYLLABICS CARRIER TTSU*/
-                                           RTUNI_ALPHA, /* U+001668: CANADIAN SYLLABICS CARRIER TTSO*/
-                                           RTUNI_ALPHA, /* U+001669: CANADIAN SYLLABICS CARRIER TTSE*/
-                                           RTUNI_ALPHA, /* U+00166a: CANADIAN SYLLABICS CARRIER TTSEE*/
-                                           RTUNI_ALPHA, /* U+00166b: CANADIAN SYLLABICS CARRIER TTSI*/
-                                           RTUNI_ALPHA, /* U+00166c: CANADIAN SYLLABICS CARRIER TTSA*/
-                                                     0, /* U+00166d: CANADIAN SYLLABICS CHI SIGN*/
-                                                     0, /* U+00166e: CANADIAN SYLLABICS FULL STOP*/
-                                           RTUNI_ALPHA, /* U+00166f: CANADIAN SYLLABICS QAI*/
-                                           RTUNI_ALPHA, /* U+001670: CANADIAN SYLLABICS NGAI*/
-                                           RTUNI_ALPHA, /* U+001671: CANADIAN SYLLABICS NNGI*/
-                                           RTUNI_ALPHA, /* U+001672: CANADIAN SYLLABICS NNGII*/
-                                           RTUNI_ALPHA, /* U+001673: CANADIAN SYLLABICS NNGO*/
-                                           RTUNI_ALPHA, /* U+001674: CANADIAN SYLLABICS NNGOO*/
-                                           RTUNI_ALPHA, /* U+001675: CANADIAN SYLLABICS NNGA*/
-                                           RTUNI_ALPHA, /* U+001676: CANADIAN SYLLABICS NNGAA*/
-                                                     0, /* U+001677: */
-                                                     0, /* U+001678: */
-                                                     0, /* U+001679: */
-                                                     0, /* U+00167a: */
-                                                     0, /* U+00167b: */
-                                                     0, /* U+00167c: */
-                                                     0, /* U+00167d: */
-                                                     0, /* U+00167e: */
-                                                     0, /* U+00167f: */
-                                          RTUNI_WSPACE, /* U+001680: OGHAM SPACE MARK*/
-                                           RTUNI_ALPHA, /* U+001681: OGHAM LETTER BEITH*/
-                                           RTUNI_ALPHA, /* U+001682: OGHAM LETTER LUIS*/
-                                           RTUNI_ALPHA, /* U+001683: OGHAM LETTER FEARN*/
-                                           RTUNI_ALPHA, /* U+001684: OGHAM LETTER SAIL*/
-                                           RTUNI_ALPHA, /* U+001685: OGHAM LETTER NION*/
-                                           RTUNI_ALPHA, /* U+001686: OGHAM LETTER UATH*/
-                                           RTUNI_ALPHA, /* U+001687: OGHAM LETTER DAIR*/
-                                           RTUNI_ALPHA, /* U+001688: OGHAM LETTER TINNE*/
-                                           RTUNI_ALPHA, /* U+001689: OGHAM LETTER COLL*/
-                                           RTUNI_ALPHA, /* U+00168a: OGHAM LETTER CEIRT*/
-                                           RTUNI_ALPHA, /* U+00168b: OGHAM LETTER MUIN*/
-                                           RTUNI_ALPHA, /* U+00168c: OGHAM LETTER GORT*/
-                                           RTUNI_ALPHA, /* U+00168d: OGHAM LETTER NGEADAL*/
-                                           RTUNI_ALPHA, /* U+00168e: OGHAM LETTER STRAIF*/
-                                           RTUNI_ALPHA, /* U+00168f: OGHAM LETTER RUIS*/
-                                           RTUNI_ALPHA, /* U+001690: OGHAM LETTER AILM*/
-                                           RTUNI_ALPHA, /* U+001691: OGHAM LETTER ONN*/
-                                           RTUNI_ALPHA, /* U+001692: OGHAM LETTER UR*/
-                                           RTUNI_ALPHA, /* U+001693: OGHAM LETTER EADHADH*/
-                                           RTUNI_ALPHA, /* U+001694: OGHAM LETTER IODHADH*/
-                                           RTUNI_ALPHA, /* U+001695: OGHAM LETTER EABHADH*/
-                                           RTUNI_ALPHA, /* U+001696: OGHAM LETTER OR*/
-                                           RTUNI_ALPHA, /* U+001697: OGHAM LETTER UILLEANN*/
-                                           RTUNI_ALPHA, /* U+001698: OGHAM LETTER IFIN*/
-                                           RTUNI_ALPHA, /* U+001699: OGHAM LETTER EAMHANCHOLL*/
-                                           RTUNI_ALPHA, /* U+00169a: OGHAM LETTER PEITH*/
-                                                     0, /* U+00169b: OGHAM FEATHER MARK*/
-                                                     0, /* U+00169c: OGHAM REVERSED FEATHER MARK*/
-                                                     0, /* U+00169d: */
-                                                     0, /* U+00169e: */
-                                                     0, /* U+00169f: */
-                                           RTUNI_ALPHA, /* U+0016a0: RUNIC LETTER FEHU FEOH FE F*/
-                                           RTUNI_ALPHA, /* U+0016a1: RUNIC LETTER V*/
-                                           RTUNI_ALPHA, /* U+0016a2: RUNIC LETTER URUZ UR U*/
-                                           RTUNI_ALPHA, /* U+0016a3: RUNIC LETTER YR*/
-                                           RTUNI_ALPHA, /* U+0016a4: RUNIC LETTER Y*/
-                                           RTUNI_ALPHA, /* U+0016a5: RUNIC LETTER W*/
-                                           RTUNI_ALPHA, /* U+0016a6: RUNIC LETTER THURISAZ THURS THORN*/
-                                           RTUNI_ALPHA, /* U+0016a7: RUNIC LETTER ETH*/
-                                           RTUNI_ALPHA, /* U+0016a8: RUNIC LETTER ANSUZ A*/
-                                           RTUNI_ALPHA, /* U+0016a9: RUNIC LETTER OS O*/
-                                           RTUNI_ALPHA, /* U+0016aa: RUNIC LETTER AC A*/
-                                           RTUNI_ALPHA, /* U+0016ab: RUNIC LETTER AESC*/
-                                           RTUNI_ALPHA, /* U+0016ac: RUNIC LETTER LONG-BRANCH-OSS O*/
-                                           RTUNI_ALPHA, /* U+0016ad: RUNIC LETTER SHORT-TWIG-OSS O*/
-                                           RTUNI_ALPHA, /* U+0016ae: RUNIC LETTER O*/
-                                           RTUNI_ALPHA, /* U+0016af: RUNIC LETTER OE*/
-                                           RTUNI_ALPHA, /* U+0016b0: RUNIC LETTER ON*/
-                                           RTUNI_ALPHA, /* U+0016b1: RUNIC LETTER RAIDO RAD REID R*/
-                                           RTUNI_ALPHA, /* U+0016b2: RUNIC LETTER KAUNA*/
-                                           RTUNI_ALPHA, /* U+0016b3: RUNIC LETTER CEN*/
-                                           RTUNI_ALPHA, /* U+0016b4: RUNIC LETTER KAUN K*/
-                                           RTUNI_ALPHA, /* U+0016b5: RUNIC LETTER G*/
-                                           RTUNI_ALPHA, /* U+0016b6: RUNIC LETTER ENG*/
-                                           RTUNI_ALPHA, /* U+0016b7: RUNIC LETTER GEBO GYFU G*/
-                                           RTUNI_ALPHA, /* U+0016b8: RUNIC LETTER GAR*/
-                                           RTUNI_ALPHA, /* U+0016b9: RUNIC LETTER WUNJO WYNN W*/
-                                           RTUNI_ALPHA, /* U+0016ba: RUNIC LETTER HAGLAZ H*/
-                                           RTUNI_ALPHA, /* U+0016bb: RUNIC LETTER HAEGL H*/
-                                           RTUNI_ALPHA, /* U+0016bc: RUNIC LETTER LONG-BRANCH-HAGALL H*/
-                                           RTUNI_ALPHA, /* U+0016bd: RUNIC LETTER SHORT-TWIG-HAGALL H*/
-                                           RTUNI_ALPHA, /* U+0016be: RUNIC LETTER NAUDIZ NYD NAUD N*/
-                                           RTUNI_ALPHA, /* U+0016bf: RUNIC LETTER SHORT-TWIG-NAUD N*/
-                                           RTUNI_ALPHA, /* U+0016c0: RUNIC LETTER DOTTED-N*/
-                                           RTUNI_ALPHA, /* U+0016c1: RUNIC LETTER ISAZ IS ISS I*/
-                                           RTUNI_ALPHA, /* U+0016c2: RUNIC LETTER E*/
-                                           RTUNI_ALPHA, /* U+0016c3: RUNIC LETTER JERAN J*/
-                                           RTUNI_ALPHA, /* U+0016c4: RUNIC LETTER GER*/
-                                           RTUNI_ALPHA, /* U+0016c5: RUNIC LETTER LONG-BRANCH-AR AE*/
-                                           RTUNI_ALPHA, /* U+0016c6: RUNIC LETTER SHORT-TWIG-AR A*/
-                                           RTUNI_ALPHA, /* U+0016c7: RUNIC LETTER IWAZ EOH*/
-                                           RTUNI_ALPHA, /* U+0016c8: RUNIC LETTER PERTHO PEORTH P*/
-                                           RTUNI_ALPHA, /* U+0016c9: RUNIC LETTER ALGIZ EOLHX*/
-                                           RTUNI_ALPHA, /* U+0016ca: RUNIC LETTER SOWILO S*/
-                                           RTUNI_ALPHA, /* U+0016cb: RUNIC LETTER SIGEL LONG-BRANCH-SOL S*/
-                                           RTUNI_ALPHA, /* U+0016cc: RUNIC LETTER SHORT-TWIG-SOL S*/
-                                           RTUNI_ALPHA, /* U+0016cd: RUNIC LETTER C*/
-                                           RTUNI_ALPHA, /* U+0016ce: RUNIC LETTER Z*/
-                                           RTUNI_ALPHA, /* U+0016cf: RUNIC LETTER TIWAZ TIR TYR T*/
-                                           RTUNI_ALPHA, /* U+0016d0: RUNIC LETTER SHORT-TWIG-TYR T*/
-                                           RTUNI_ALPHA, /* U+0016d1: RUNIC LETTER D*/
-                                           RTUNI_ALPHA, /* U+0016d2: RUNIC LETTER BERKANAN BEORC BJARKAN B*/
-                                           RTUNI_ALPHA, /* U+0016d3: RUNIC LETTER SHORT-TWIG-BJARKAN B*/
-                                           RTUNI_ALPHA, /* U+0016d4: RUNIC LETTER DOTTED-P*/
-                                           RTUNI_ALPHA, /* U+0016d5: RUNIC LETTER OPEN-P*/
-                                           RTUNI_ALPHA, /* U+0016d6: RUNIC LETTER EHWAZ EH E*/
-                                           RTUNI_ALPHA, /* U+0016d7: RUNIC LETTER MANNAZ MAN M*/
-                                           RTUNI_ALPHA, /* U+0016d8: RUNIC LETTER LONG-BRANCH-MADR M*/
-                                           RTUNI_ALPHA, /* U+0016d9: RUNIC LETTER SHORT-TWIG-MADR M*/
-                                           RTUNI_ALPHA, /* U+0016da: RUNIC LETTER LAUKAZ LAGU LOGR L*/
-                                           RTUNI_ALPHA, /* U+0016db: RUNIC LETTER DOTTED-L*/
-                                           RTUNI_ALPHA, /* U+0016dc: RUNIC LETTER INGWAZ*/
-                                           RTUNI_ALPHA, /* U+0016dd: RUNIC LETTER ING*/
-                                           RTUNI_ALPHA, /* U+0016de: RUNIC LETTER DAGAZ DAEG D*/
-                                           RTUNI_ALPHA, /* U+0016df: RUNIC LETTER OTHALAN ETHEL O*/
-                                           RTUNI_ALPHA, /* U+0016e0: RUNIC LETTER EAR*/
-                                           RTUNI_ALPHA, /* U+0016e1: RUNIC LETTER IOR*/
-                                           RTUNI_ALPHA, /* U+0016e2: RUNIC LETTER CWEORTH*/
-                                           RTUNI_ALPHA, /* U+0016e3: RUNIC LETTER CALC*/
-                                           RTUNI_ALPHA, /* U+0016e4: RUNIC LETTER CEALC*/
-                                           RTUNI_ALPHA, /* U+0016e5: RUNIC LETTER STAN*/
-                                           RTUNI_ALPHA, /* U+0016e6: RUNIC LETTER LONG-BRANCH-YR*/
-                                           RTUNI_ALPHA, /* U+0016e7: RUNIC LETTER SHORT-TWIG-YR*/
-                                           RTUNI_ALPHA, /* U+0016e8: RUNIC LETTER ICELANDIC-YR*/
-                                           RTUNI_ALPHA, /* U+0016e9: RUNIC LETTER Q*/
-                                           RTUNI_ALPHA, /* U+0016ea: RUNIC LETTER X*/
-                                                     0, /* U+0016eb: RUNIC SINGLE PUNCTUATION*/
-                                                     0, /* U+0016ec: RUNIC MULTIPLE PUNCTUATION*/
-                                                     0, /* U+0016ed: RUNIC CROSS PUNCTUATION*/
-                                           RTUNI_ALPHA, /* U+0016ee: RUNIC ARLAUG SYMBOL*/
-                                           RTUNI_ALPHA, /* U+0016ef: RUNIC TVIMADUR SYMBOL*/
-                                           RTUNI_ALPHA, /* U+0016f0: RUNIC BELGTHOR SYMBOL*/
-                                                     0, /* U+0016f1: */
-                                                     0, /* U+0016f2: */
-                                                     0, /* U+0016f3: */
-                                                     0, /* U+0016f4: */
-                                                     0, /* U+0016f5: */
-                                                     0, /* U+0016f6: */
-                                                     0, /* U+0016f7: */
-                                                     0, /* U+0016f8: */
-                                                     0, /* U+0016f9: */
-                                                     0, /* U+0016fa: */
-                                                     0, /* U+0016fb: */
-                                                     0, /* U+0016fc: */
-                                                     0, /* U+0016fd: */
-                                                     0, /* U+0016fe: */
-                                                     0, /* U+0016ff: */
-                                           RTUNI_ALPHA, /* U+001700: TAGALOG LETTER A*/
-                                           RTUNI_ALPHA, /* U+001701: TAGALOG LETTER I*/
-                                           RTUNI_ALPHA, /* U+001702: TAGALOG LETTER U*/
-                                           RTUNI_ALPHA, /* U+001703: TAGALOG LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001704: TAGALOG LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001705: TAGALOG LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001706: TAGALOG LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001707: TAGALOG LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001708: TAGALOG LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001709: TAGALOG LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00170a: TAGALOG LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00170b: TAGALOG LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00170c: TAGALOG LETTER YA*/
-                                                     0, /* U+00170d: */
-                                           RTUNI_ALPHA, /* U+00170e: TAGALOG LETTER LA*/
-                                           RTUNI_ALPHA, /* U+00170f: TAGALOG LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001710: TAGALOG LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001711: TAGALOG LETTER HA*/
-                                           RTUNI_ALPHA, /* U+001712: TAGALOG VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001713: TAGALOG VOWEL SIGN U*/
-                                                     0, /* U+001714: TAGALOG SIGN VIRAMA*/
-                                                     0, /* U+001715: */
-                                                     0, /* U+001716: */
-                                                     0, /* U+001717: */
-                                                     0, /* U+001718: */
-                                                     0, /* U+001719: */
-                                                     0, /* U+00171a: */
-                                                     0, /* U+00171b: */
-                                                     0, /* U+00171c: */
-                                                     0, /* U+00171d: */
-                                                     0, /* U+00171e: */
-                                                     0, /* U+00171f: */
-                                           RTUNI_ALPHA, /* U+001720: HANUNOO LETTER A*/
-                                           RTUNI_ALPHA, /* U+001721: HANUNOO LETTER I*/
-                                           RTUNI_ALPHA, /* U+001722: HANUNOO LETTER U*/
-                                           RTUNI_ALPHA, /* U+001723: HANUNOO LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001724: HANUNOO LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001725: HANUNOO LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001726: HANUNOO LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001727: HANUNOO LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001728: HANUNOO LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001729: HANUNOO LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00172a: HANUNOO LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00172b: HANUNOO LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00172c: HANUNOO LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00172d: HANUNOO LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00172e: HANUNOO LETTER LA*/
-                                           RTUNI_ALPHA, /* U+00172f: HANUNOO LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001730: HANUNOO LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001731: HANUNOO LETTER HA*/
-                                           RTUNI_ALPHA, /* U+001732: HANUNOO VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001733: HANUNOO VOWEL SIGN U*/
-                                                     0, /* U+001734: HANUNOO SIGN PAMUDPOD*/
-                                                     0, /* U+001735: PHILIPPINE SINGLE PUNCTUATION*/
-                                                     0, /* U+001736: PHILIPPINE DOUBLE PUNCTUATION*/
-                                                     0, /* U+001737: */
-                                                     0, /* U+001738: */
-                                                     0, /* U+001739: */
-                                                     0, /* U+00173a: */
-                                                     0, /* U+00173b: */
-                                                     0, /* U+00173c: */
-                                                     0, /* U+00173d: */
-                                                     0, /* U+00173e: */
-                                                     0, /* U+00173f: */
-                                           RTUNI_ALPHA, /* U+001740: BUHID LETTER A*/
-                                           RTUNI_ALPHA, /* U+001741: BUHID LETTER I*/
-                                           RTUNI_ALPHA, /* U+001742: BUHID LETTER U*/
-                                           RTUNI_ALPHA, /* U+001743: BUHID LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001744: BUHID LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001745: BUHID LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001746: BUHID LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001747: BUHID LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001748: BUHID LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001749: BUHID LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00174a: BUHID LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00174b: BUHID LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00174c: BUHID LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00174d: BUHID LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00174e: BUHID LETTER LA*/
-                                           RTUNI_ALPHA, /* U+00174f: BUHID LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001750: BUHID LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001751: BUHID LETTER HA*/
-                                           RTUNI_ALPHA, /* U+001752: BUHID VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001753: BUHID VOWEL SIGN U*/
-                                                     0, /* U+001754: */
-                                                     0, /* U+001755: */
-                                                     0, /* U+001756: */
-                                                     0, /* U+001757: */
-                                                     0, /* U+001758: */
-                                                     0, /* U+001759: */
-                                                     0, /* U+00175a: */
-                                                     0, /* U+00175b: */
-                                                     0, /* U+00175c: */
-                                                     0, /* U+00175d: */
-                                                     0, /* U+00175e: */
-                                                     0, /* U+00175f: */
-                                           RTUNI_ALPHA, /* U+001760: TAGBANWA LETTER A*/
-                                           RTUNI_ALPHA, /* U+001761: TAGBANWA LETTER I*/
-                                           RTUNI_ALPHA, /* U+001762: TAGBANWA LETTER U*/
-                                           RTUNI_ALPHA, /* U+001763: TAGBANWA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001764: TAGBANWA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001765: TAGBANWA LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001766: TAGBANWA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001767: TAGBANWA LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001768: TAGBANWA LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001769: TAGBANWA LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00176a: TAGBANWA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00176b: TAGBANWA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00176c: TAGBANWA LETTER YA*/
-                                                     0, /* U+00176d: */
-                                           RTUNI_ALPHA, /* U+00176e: TAGBANWA LETTER LA*/
-                                           RTUNI_ALPHA, /* U+00176f: TAGBANWA LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001770: TAGBANWA LETTER SA*/
-                                                     0, /* U+001771: */
-                                           RTUNI_ALPHA, /* U+001772: TAGBANWA VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001773: TAGBANWA VOWEL SIGN U*/
-                                                     0, /* U+001774: */
-                                                     0, /* U+001775: */
-                                                     0, /* U+001776: */
-                                                     0, /* U+001777: */
-                                                     0, /* U+001778: */
-                                                     0, /* U+001779: */
-                                                     0, /* U+00177a: */
-                                                     0, /* U+00177b: */
-                                                     0, /* U+00177c: */
-                                                     0, /* U+00177d: */
-                                                     0, /* U+00177e: */
-                                                     0, /* U+00177f: */
-                                           RTUNI_ALPHA, /* U+001780: KHMER LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001781: KHMER LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+001782: KHMER LETTER KO*/
-                                           RTUNI_ALPHA, /* U+001783: KHMER LETTER KHO*/
-                                           RTUNI_ALPHA, /* U+001784: KHMER LETTER NGO*/
-                                           RTUNI_ALPHA, /* U+001785: KHMER LETTER CA*/
-                                           RTUNI_ALPHA, /* U+001786: KHMER LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+001787: KHMER LETTER CO*/
-                                           RTUNI_ALPHA, /* U+001788: KHMER LETTER CHO*/
-                                           RTUNI_ALPHA, /* U+001789: KHMER LETTER NYO*/
-                                           RTUNI_ALPHA, /* U+00178a: KHMER LETTER DA*/
-                                           RTUNI_ALPHA, /* U+00178b: KHMER LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+00178c: KHMER LETTER DO*/
-                                           RTUNI_ALPHA, /* U+00178d: KHMER LETTER TTHO*/
-                                           RTUNI_ALPHA, /* U+00178e: KHMER LETTER NNO*/
-                                           RTUNI_ALPHA, /* U+00178f: KHMER LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001790: KHMER LETTER THA*/
-                                           RTUNI_ALPHA, /* U+001791: KHMER LETTER TO*/
-                                           RTUNI_ALPHA, /* U+001792: KHMER LETTER THO*/
-                                           RTUNI_ALPHA, /* U+001793: KHMER LETTER NO*/
-                                           RTUNI_ALPHA, /* U+001794: KHMER LETTER BA*/
-                                           RTUNI_ALPHA, /* U+001795: KHMER LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+001796: KHMER LETTER PO*/
-                                           RTUNI_ALPHA, /* U+001797: KHMER LETTER PHO*/
-                                           RTUNI_ALPHA, /* U+001798: KHMER LETTER MO*/
-                                           RTUNI_ALPHA, /* U+001799: KHMER LETTER YO*/
-                                           RTUNI_ALPHA, /* U+00179a: KHMER LETTER RO*/
-                                           RTUNI_ALPHA, /* U+00179b: KHMER LETTER LO*/
-                                           RTUNI_ALPHA, /* U+00179c: KHMER LETTER VO*/
-                                           RTUNI_ALPHA, /* U+00179d: KHMER LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+00179e: KHMER LETTER SSO*/
-                                           RTUNI_ALPHA, /* U+00179f: KHMER LETTER SA*/
-                                           RTUNI_ALPHA, /* U+0017a0: KHMER LETTER HA*/
-                                           RTUNI_ALPHA, /* U+0017a1: KHMER LETTER LA*/
-                                           RTUNI_ALPHA, /* U+0017a2: KHMER LETTER QA*/
-                                           RTUNI_ALPHA, /* U+0017a3: KHMER INDEPENDENT VOWEL QAQ*/
-                                           RTUNI_ALPHA, /* U+0017a4: KHMER INDEPENDENT VOWEL QAA*/
-                                           RTUNI_ALPHA, /* U+0017a5: KHMER INDEPENDENT VOWEL QI*/
-                                           RTUNI_ALPHA, /* U+0017a6: KHMER INDEPENDENT VOWEL QII*/
-                                           RTUNI_ALPHA, /* U+0017a7: KHMER INDEPENDENT VOWEL QU*/
-                                           RTUNI_ALPHA, /* U+0017a8: KHMER INDEPENDENT VOWEL QUK*/
-                                           RTUNI_ALPHA, /* U+0017a9: KHMER INDEPENDENT VOWEL QUU*/
-                                           RTUNI_ALPHA, /* U+0017aa: KHMER INDEPENDENT VOWEL QUUV*/
-                                           RTUNI_ALPHA, /* U+0017ab: KHMER INDEPENDENT VOWEL RY*/
-                                           RTUNI_ALPHA, /* U+0017ac: KHMER INDEPENDENT VOWEL RYY*/
-                                           RTUNI_ALPHA, /* U+0017ad: KHMER INDEPENDENT VOWEL LY*/
-                                           RTUNI_ALPHA, /* U+0017ae: KHMER INDEPENDENT VOWEL LYY*/
-                                           RTUNI_ALPHA, /* U+0017af: KHMER INDEPENDENT VOWEL QE*/
-                                           RTUNI_ALPHA, /* U+0017b0: KHMER INDEPENDENT VOWEL QAI*/
-                                           RTUNI_ALPHA, /* U+0017b1: KHMER INDEPENDENT VOWEL QOO TYPE ONE*/
-                                           RTUNI_ALPHA, /* U+0017b2: KHMER INDEPENDENT VOWEL QOO TYPE TWO*/
-                                           RTUNI_ALPHA, /* U+0017b3: KHMER INDEPENDENT VOWEL QAU*/
-                                                     0, /* U+0017b4: KHMER VOWEL INHERENT AQ*/
-                                                     0, /* U+0017b5: KHMER VOWEL INHERENT AA*/
-                                           RTUNI_ALPHA, /* U+0017b6: KHMER VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+0017b7: KHMER VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+0017b8: KHMER VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+0017b9: KHMER VOWEL SIGN Y*/
-                                           RTUNI_ALPHA, /* U+0017ba: KHMER VOWEL SIGN YY*/
-                                           RTUNI_ALPHA, /* U+0017bb: KHMER VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+0017bc: KHMER VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+0017bd: KHMER VOWEL SIGN UA*/
-                                           RTUNI_ALPHA, /* U+0017be: KHMER VOWEL SIGN OE*/
-                                           RTUNI_ALPHA, /* U+0017bf: KHMER VOWEL SIGN YA*/
-                                           RTUNI_ALPHA, /* U+0017c0: KHMER VOWEL SIGN IE*/
-                                           RTUNI_ALPHA, /* U+0017c1: KHMER VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+0017c2: KHMER VOWEL SIGN AE*/
-                                           RTUNI_ALPHA, /* U+0017c3: KHMER VOWEL SIGN AI*/
-                                           RTUNI_ALPHA, /* U+0017c4: KHMER VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+0017c5: KHMER VOWEL SIGN AU*/
-                                           RTUNI_ALPHA, /* U+0017c6: KHMER SIGN NIKAHIT*/
-                                           RTUNI_ALPHA, /* U+0017c7: KHMER SIGN REAHMUK*/
-                                           RTUNI_ALPHA, /* U+0017c8: KHMER SIGN YUUKALEAPINTU*/
-                                                     0, /* U+0017c9: KHMER SIGN MUUSIKATOAN*/
-                                                     0, /* U+0017ca: KHMER SIGN TRIISAP*/
-                                                     0, /* U+0017cb: KHMER SIGN BANTOC*/
-                                                     0, /* U+0017cc: KHMER SIGN ROBAT*/
-                                                     0, /* U+0017cd: KHMER SIGN TOANDAKHIAT*/
-                                                     0, /* U+0017ce: KHMER SIGN KAKABAT*/
-                                                     0, /* U+0017cf: KHMER SIGN AHSDA*/
-                                                     0, /* U+0017d0: KHMER SIGN SAMYOK SANNYA*/
-                                                     0, /* U+0017d1: KHMER SIGN VIRIAM*/
-                                                     0, /* U+0017d2: KHMER SIGN COENG*/
-                                                     0, /* U+0017d3: KHMER SIGN BATHAMASAT*/
-                                                     0, /* U+0017d4: KHMER SIGN KHAN*/
-                                                     0, /* U+0017d5: KHMER SIGN BARIYOOSAN*/
-                                                     0, /* U+0017d6: KHMER SIGN CAMNUC PII KUUH*/
-                                           RTUNI_ALPHA, /* U+0017d7: KHMER SIGN LEK TOO*/
-                                                     0, /* U+0017d8: KHMER SIGN BEYYAL*/
-                                                     0, /* U+0017d9: KHMER SIGN PHNAEK MUAN*/
-                                                     0, /* U+0017da: KHMER SIGN KOOMUUT*/
-                                                     0, /* U+0017db: KHMER CURRENCY SYMBOL RIEL*/
-                                           RTUNI_ALPHA, /* U+0017dc: KHMER SIGN AVAKRAHASANYA*/
-                                                     0, /* U+0017dd: KHMER SIGN ATTHACAN*/
-                                                     0, /* U+0017de: */
-                                                     0, /* U+0017df: */
-                                          RTUNI_DDIGIT, /* U+0017e0: KHMER DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+0017e1: KHMER DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+0017e2: KHMER DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+0017e3: KHMER DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+0017e4: KHMER DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+0017e5: KHMER DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+0017e6: KHMER DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+0017e7: KHMER DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+0017e8: KHMER DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+0017e9: KHMER DIGIT NINE*/
-                                                     0, /* U+0017ea: */
-                                                     0, /* U+0017eb: */
-                                                     0, /* U+0017ec: */
-                                                     0, /* U+0017ed: */
-                                                     0, /* U+0017ee: */
-                                                     0, /* U+0017ef: */
-                                                     0, /* U+0017f0: KHMER SYMBOL LEK ATTAK SON*/
-                                                     0, /* U+0017f1: KHMER SYMBOL LEK ATTAK MUOY*/
-                                                     0, /* U+0017f2: KHMER SYMBOL LEK ATTAK PII*/
-                                                     0, /* U+0017f3: KHMER SYMBOL LEK ATTAK BEI*/
-                                                     0, /* U+0017f4: KHMER SYMBOL LEK ATTAK BUON*/
-                                                     0, /* U+0017f5: KHMER SYMBOL LEK ATTAK PRAM*/
-                                                     0, /* U+0017f6: KHMER SYMBOL LEK ATTAK PRAM-MUOY*/
-                                                     0, /* U+0017f7: KHMER SYMBOL LEK ATTAK PRAM-PII*/
-                                                     0, /* U+0017f8: KHMER SYMBOL LEK ATTAK PRAM-BEI*/
-                                                     0, /* U+0017f9: KHMER SYMBOL LEK ATTAK PRAM-BUON*/
-                                                     0, /* U+0017fa: */
-                                                     0, /* U+0017fb: */
-                                                     0, /* U+0017fc: */
-                                                     0, /* U+0017fd: */
-                                                     0, /* U+0017fe: */
-                                                     0, /* U+0017ff: */
-                                                     0, /* U+001800: MONGOLIAN BIRGA*/
-                                                     0, /* U+001801: MONGOLIAN ELLIPSIS*/
-                                                     0, /* U+001802: MONGOLIAN COMMA*/
-                                                     0, /* U+001803: MONGOLIAN FULL STOP*/
-                                                     0, /* U+001804: MONGOLIAN COLON*/
-                                                     0, /* U+001805: MONGOLIAN FOUR DOTS*/
-                                                     0, /* U+001806: MONGOLIAN TODO SOFT HYPHEN*/
-                                                     0, /* U+001807: MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER*/
-                                                     0, /* U+001808: MONGOLIAN MANCHU COMMA*/
-                                                     0, /* U+001809: MONGOLIAN MANCHU FULL STOP*/
-                                                     0, /* U+00180a: MONGOLIAN NIRUGU*/
-                                                     0, /* U+00180b: MONGOLIAN FREE VARIATION SELECTOR ONE*/
-                                                     0, /* U+00180c: MONGOLIAN FREE VARIATION SELECTOR TWO*/
-                                                     0, /* U+00180d: MONGOLIAN FREE VARIATION SELECTOR THREE*/
-                                          RTUNI_WSPACE, /* U+00180e: MONGOLIAN VOWEL SEPARATOR*/
-                                                     0, /* U+00180f: */
-                                          RTUNI_DDIGIT, /* U+001810: MONGOLIAN DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+001811: MONGOLIAN DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+001812: MONGOLIAN DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+001813: MONGOLIAN DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+001814: MONGOLIAN DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+001815: MONGOLIAN DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+001816: MONGOLIAN DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+001817: MONGOLIAN DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+001818: MONGOLIAN DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+001819: MONGOLIAN DIGIT NINE*/
-                                                     0, /* U+00181a: */
-                                                     0, /* U+00181b: */
-                                                     0, /* U+00181c: */
-                                                     0, /* U+00181d: */
-                                                     0, /* U+00181e: */
-                                                     0, /* U+00181f: */
-                                           RTUNI_ALPHA, /* U+001820: MONGOLIAN LETTER A*/
-                                           RTUNI_ALPHA, /* U+001821: MONGOLIAN LETTER E*/
-                                           RTUNI_ALPHA, /* U+001822: MONGOLIAN LETTER I*/
-                                           RTUNI_ALPHA, /* U+001823: MONGOLIAN LETTER O*/
-                                           RTUNI_ALPHA, /* U+001824: MONGOLIAN LETTER U*/
-                                           RTUNI_ALPHA, /* U+001825: MONGOLIAN LETTER OE*/
-                                           RTUNI_ALPHA, /* U+001826: MONGOLIAN LETTER UE*/
-                                           RTUNI_ALPHA, /* U+001827: MONGOLIAN LETTER EE*/
-                                           RTUNI_ALPHA, /* U+001828: MONGOLIAN LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001829: MONGOLIAN LETTER ANG*/
-                                           RTUNI_ALPHA, /* U+00182a: MONGOLIAN LETTER BA*/
-                                           RTUNI_ALPHA, /* U+00182b: MONGOLIAN LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00182c: MONGOLIAN LETTER QA*/
-                                           RTUNI_ALPHA, /* U+00182d: MONGOLIAN LETTER GA*/
-                                           RTUNI_ALPHA, /* U+00182e: MONGOLIAN LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00182f: MONGOLIAN LETTER LA*/
-                                           RTUNI_ALPHA, /* U+001830: MONGOLIAN LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001831: MONGOLIAN LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+001832: MONGOLIAN LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001833: MONGOLIAN LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001834: MONGOLIAN LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+001835: MONGOLIAN LETTER JA*/
-                                           RTUNI_ALPHA, /* U+001836: MONGOLIAN LETTER YA*/
-                                           RTUNI_ALPHA, /* U+001837: MONGOLIAN LETTER RA*/
-                                           RTUNI_ALPHA, /* U+001838: MONGOLIAN LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001839: MONGOLIAN LETTER FA*/
-                                           RTUNI_ALPHA, /* U+00183a: MONGOLIAN LETTER KA*/
-                                           RTUNI_ALPHA, /* U+00183b: MONGOLIAN LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+00183c: MONGOLIAN LETTER TSA*/
-                                           RTUNI_ALPHA, /* U+00183d: MONGOLIAN LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+00183e: MONGOLIAN LETTER HAA*/
-                                           RTUNI_ALPHA, /* U+00183f: MONGOLIAN LETTER ZRA*/
-                                           RTUNI_ALPHA, /* U+001840: MONGOLIAN LETTER LHA*/
-                                           RTUNI_ALPHA, /* U+001841: MONGOLIAN LETTER ZHI*/
-                                           RTUNI_ALPHA, /* U+001842: MONGOLIAN LETTER CHI*/
-                                           RTUNI_ALPHA, /* U+001843: MONGOLIAN LETTER TODO LONG VOWEL SIGN*/
-                                           RTUNI_ALPHA, /* U+001844: MONGOLIAN LETTER TODO E*/
-                                           RTUNI_ALPHA, /* U+001845: MONGOLIAN LETTER TODO I*/
-                                           RTUNI_ALPHA, /* U+001846: MONGOLIAN LETTER TODO O*/
-                                           RTUNI_ALPHA, /* U+001847: MONGOLIAN LETTER TODO U*/
-                                           RTUNI_ALPHA, /* U+001848: MONGOLIAN LETTER TODO OE*/
-                                           RTUNI_ALPHA, /* U+001849: MONGOLIAN LETTER TODO UE*/
-                                           RTUNI_ALPHA, /* U+00184a: MONGOLIAN LETTER TODO ANG*/
-                                           RTUNI_ALPHA, /* U+00184b: MONGOLIAN LETTER TODO BA*/
-                                           RTUNI_ALPHA, /* U+00184c: MONGOLIAN LETTER TODO PA*/
-                                           RTUNI_ALPHA, /* U+00184d: MONGOLIAN LETTER TODO QA*/
-                                           RTUNI_ALPHA, /* U+00184e: MONGOLIAN LETTER TODO GA*/
-                                           RTUNI_ALPHA, /* U+00184f: MONGOLIAN LETTER TODO MA*/
-                                           RTUNI_ALPHA, /* U+001850: MONGOLIAN LETTER TODO TA*/
-                                           RTUNI_ALPHA, /* U+001851: MONGOLIAN LETTER TODO DA*/
-                                           RTUNI_ALPHA, /* U+001852: MONGOLIAN LETTER TODO CHA*/
-                                           RTUNI_ALPHA, /* U+001853: MONGOLIAN LETTER TODO JA*/
-                                           RTUNI_ALPHA, /* U+001854: MONGOLIAN LETTER TODO TSA*/
-                                           RTUNI_ALPHA, /* U+001855: MONGOLIAN LETTER TODO YA*/
-                                           RTUNI_ALPHA, /* U+001856: MONGOLIAN LETTER TODO WA*/
-                                           RTUNI_ALPHA, /* U+001857: MONGOLIAN LETTER TODO KA*/
-                                           RTUNI_ALPHA, /* U+001858: MONGOLIAN LETTER TODO GAA*/
-                                           RTUNI_ALPHA, /* U+001859: MONGOLIAN LETTER TODO HAA*/
-                                           RTUNI_ALPHA, /* U+00185a: MONGOLIAN LETTER TODO JIA*/
-                                           RTUNI_ALPHA, /* U+00185b: MONGOLIAN LETTER TODO NIA*/
-                                           RTUNI_ALPHA, /* U+00185c: MONGOLIAN LETTER TODO DZA*/
-                                           RTUNI_ALPHA, /* U+00185d: MONGOLIAN LETTER SIBE E*/
-                                           RTUNI_ALPHA, /* U+00185e: MONGOLIAN LETTER SIBE I*/
-                                           RTUNI_ALPHA, /* U+00185f: MONGOLIAN LETTER SIBE IY*/
-                                           RTUNI_ALPHA, /* U+001860: MONGOLIAN LETTER SIBE UE*/
-                                           RTUNI_ALPHA, /* U+001861: MONGOLIAN LETTER SIBE U*/
-                                           RTUNI_ALPHA, /* U+001862: MONGOLIAN LETTER SIBE ANG*/
-                                           RTUNI_ALPHA, /* U+001863: MONGOLIAN LETTER SIBE KA*/
-                                           RTUNI_ALPHA, /* U+001864: MONGOLIAN LETTER SIBE GA*/
-                                           RTUNI_ALPHA, /* U+001865: MONGOLIAN LETTER SIBE HA*/
-                                           RTUNI_ALPHA, /* U+001866: MONGOLIAN LETTER SIBE PA*/
-                                           RTUNI_ALPHA, /* U+001867: MONGOLIAN LETTER SIBE SHA*/
-                                           RTUNI_ALPHA, /* U+001868: MONGOLIAN LETTER SIBE TA*/
-                                           RTUNI_ALPHA, /* U+001869: MONGOLIAN LETTER SIBE DA*/
-                                           RTUNI_ALPHA, /* U+00186a: MONGOLIAN LETTER SIBE JA*/
-                                           RTUNI_ALPHA, /* U+00186b: MONGOLIAN LETTER SIBE FA*/
-                                           RTUNI_ALPHA, /* U+00186c: MONGOLIAN LETTER SIBE GAA*/
-                                           RTUNI_ALPHA, /* U+00186d: MONGOLIAN LETTER SIBE HAA*/
-                                           RTUNI_ALPHA, /* U+00186e: MONGOLIAN LETTER SIBE TSA*/
-                                           RTUNI_ALPHA, /* U+00186f: MONGOLIAN LETTER SIBE ZA*/
-                                           RTUNI_ALPHA, /* U+001870: MONGOLIAN LETTER SIBE RAA*/
-                                           RTUNI_ALPHA, /* U+001871: MONGOLIAN LETTER SIBE CHA*/
-                                           RTUNI_ALPHA, /* U+001872: MONGOLIAN LETTER SIBE ZHA*/
-                                           RTUNI_ALPHA, /* U+001873: MONGOLIAN LETTER MANCHU I*/
-                                           RTUNI_ALPHA, /* U+001874: MONGOLIAN LETTER MANCHU KA*/
-                                           RTUNI_ALPHA, /* U+001875: MONGOLIAN LETTER MANCHU RA*/
-                                           RTUNI_ALPHA, /* U+001876: MONGOLIAN LETTER MANCHU FA*/
-                                           RTUNI_ALPHA, /* U+001877: MONGOLIAN LETTER MANCHU ZHA*/
-                                                     0, /* U+001878: */
-                                                     0, /* U+001879: */
-                                                     0, /* U+00187a: */
-                                                     0, /* U+00187b: */
-                                                     0, /* U+00187c: */
-                                                     0, /* U+00187d: */
-                                                     0, /* U+00187e: */
-                                                     0, /* U+00187f: */
-                                           RTUNI_ALPHA, /* U+001880: MONGOLIAN LETTER ALI GALI ANUSVARA ONE*/
-                                           RTUNI_ALPHA, /* U+001881: MONGOLIAN LETTER ALI GALI VISARGA ONE*/
-                                           RTUNI_ALPHA, /* U+001882: MONGOLIAN LETTER ALI GALI DAMARU*/
-                                           RTUNI_ALPHA, /* U+001883: MONGOLIAN LETTER ALI GALI UBADAMA*/
-                                           RTUNI_ALPHA, /* U+001884: MONGOLIAN LETTER ALI GALI INVERTED UBADAMA*/
-                                           RTUNI_ALPHA, /* U+001885: MONGOLIAN LETTER ALI GALI BALUDA*/
-                                           RTUNI_ALPHA, /* U+001886: MONGOLIAN LETTER ALI GALI THREE BALUDA*/
-                                           RTUNI_ALPHA, /* U+001887: MONGOLIAN LETTER ALI GALI A*/
-                                           RTUNI_ALPHA, /* U+001888: MONGOLIAN LETTER ALI GALI I*/
-                                           RTUNI_ALPHA, /* U+001889: MONGOLIAN LETTER ALI GALI KA*/
-                                           RTUNI_ALPHA, /* U+00188a: MONGOLIAN LETTER ALI GALI NGA*/
-                                           RTUNI_ALPHA, /* U+00188b: MONGOLIAN LETTER ALI GALI CA*/
-                                           RTUNI_ALPHA, /* U+00188c: MONGOLIAN LETTER ALI GALI TTA*/
-                                           RTUNI_ALPHA, /* U+00188d: MONGOLIAN LETTER ALI GALI TTHA*/
-                                           RTUNI_ALPHA, /* U+00188e: MONGOLIAN LETTER ALI GALI DDA*/
-                                           RTUNI_ALPHA, /* U+00188f: MONGOLIAN LETTER ALI GALI NNA*/
-                                           RTUNI_ALPHA, /* U+001890: MONGOLIAN LETTER ALI GALI TA*/
-                                           RTUNI_ALPHA, /* U+001891: MONGOLIAN LETTER ALI GALI DA*/
-                                           RTUNI_ALPHA, /* U+001892: MONGOLIAN LETTER ALI GALI PA*/
-                                           RTUNI_ALPHA, /* U+001893: MONGOLIAN LETTER ALI GALI PHA*/
-                                           RTUNI_ALPHA, /* U+001894: MONGOLIAN LETTER ALI GALI SSA*/
-                                           RTUNI_ALPHA, /* U+001895: MONGOLIAN LETTER ALI GALI ZHA*/
-                                           RTUNI_ALPHA, /* U+001896: MONGOLIAN LETTER ALI GALI ZA*/
-                                           RTUNI_ALPHA, /* U+001897: MONGOLIAN LETTER ALI GALI AH*/
-                                           RTUNI_ALPHA, /* U+001898: MONGOLIAN LETTER TODO ALI GALI TA*/
-                                           RTUNI_ALPHA, /* U+001899: MONGOLIAN LETTER TODO ALI GALI ZHA*/
-                                           RTUNI_ALPHA, /* U+00189a: MONGOLIAN LETTER MANCHU ALI GALI GHA*/
-                                           RTUNI_ALPHA, /* U+00189b: MONGOLIAN LETTER MANCHU ALI GALI NGA*/
-                                           RTUNI_ALPHA, /* U+00189c: MONGOLIAN LETTER MANCHU ALI GALI CA*/
-                                           RTUNI_ALPHA, /* U+00189d: MONGOLIAN LETTER MANCHU ALI GALI JHA*/
-                                           RTUNI_ALPHA, /* U+00189e: MONGOLIAN LETTER MANCHU ALI GALI TTA*/
-                                           RTUNI_ALPHA, /* U+00189f: MONGOLIAN LETTER MANCHU ALI GALI DDHA*/
-                                           RTUNI_ALPHA, /* U+0018a0: MONGOLIAN LETTER MANCHU ALI GALI TA*/
-                                           RTUNI_ALPHA, /* U+0018a1: MONGOLIAN LETTER MANCHU ALI GALI DHA*/
-                                           RTUNI_ALPHA, /* U+0018a2: MONGOLIAN LETTER MANCHU ALI GALI SSA*/
-                                           RTUNI_ALPHA, /* U+0018a3: MONGOLIAN LETTER MANCHU ALI GALI CYA*/
-                                           RTUNI_ALPHA, /* U+0018a4: MONGOLIAN LETTER MANCHU ALI GALI ZHA*/
-                                           RTUNI_ALPHA, /* U+0018a5: MONGOLIAN LETTER MANCHU ALI GALI ZA*/
-                                           RTUNI_ALPHA, /* U+0018a6: MONGOLIAN LETTER ALI GALI HALF U*/
-                                           RTUNI_ALPHA, /* U+0018a7: MONGOLIAN LETTER ALI GALI HALF YA*/
-                                           RTUNI_ALPHA, /* U+0018a8: MONGOLIAN LETTER MANCHU ALI GALI BHA*/
-                                           RTUNI_ALPHA, /* U+0018a9: MONGOLIAN LETTER ALI GALI DAGALGA*/
-                                                     0, /* U+0018aa: */
-                                                     0, /* U+0018ab: */
-                                                     0, /* U+0018ac: */
-                                                     0, /* U+0018ad: */
-                                                     0, /* U+0018ae: */
-                                                     0, /* U+0018af: */
-                                                     0, /* U+0018b0: */
-                                                     0, /* U+0018b1: */
-                                                     0, /* U+0018b2: */
-                                                     0, /* U+0018b3: */
-                                                     0, /* U+0018b4: */
-                                                     0, /* U+0018b5: */
-                                                     0, /* U+0018b6: */
-                                                     0, /* U+0018b7: */
-                                                     0, /* U+0018b8: */
-                                                     0, /* U+0018b9: */
-                                                     0, /* U+0018ba: */
-                                                     0, /* U+0018bb: */
-                                                     0, /* U+0018bc: */
-                                                     0, /* U+0018bd: */
-                                                     0, /* U+0018be: */
-                                                     0, /* U+0018bf: */
-                                                     0, /* U+0018c0: */
-                                                     0, /* U+0018c1: */
-                                                     0, /* U+0018c2: */
-                                                     0, /* U+0018c3: */
-                                                     0, /* U+0018c4: */
-                                                     0, /* U+0018c5: */
-                                                     0, /* U+0018c6: */
-                                                     0, /* U+0018c7: */
-                                                     0, /* U+0018c8: */
-                                                     0, /* U+0018c9: */
-                                                     0, /* U+0018ca: */
-                                                     0, /* U+0018cb: */
-                                                     0, /* U+0018cc: */
-                                                     0, /* U+0018cd: */
-                                                     0, /* U+0018ce: */
-                                                     0, /* U+0018cf: */
-                                                     0, /* U+0018d0: */
-                                                     0, /* U+0018d1: */
-                                                     0, /* U+0018d2: */
-                                                     0, /* U+0018d3: */
-                                                     0, /* U+0018d4: */
-                                                     0, /* U+0018d5: */
-                                                     0, /* U+0018d6: */
-                                                     0, /* U+0018d7: */
-                                                     0, /* U+0018d8: */
-                                                     0, /* U+0018d9: */
-                                                     0, /* U+0018da: */
-                                                     0, /* U+0018db: */
-                                                     0, /* U+0018dc: */
-                                                     0, /* U+0018dd: */
-                                                     0, /* U+0018de: */
-                                                     0, /* U+0018df: */
-                                                     0, /* U+0018e0: */
-                                                     0, /* U+0018e1: */
-                                                     0, /* U+0018e2: */
-                                                     0, /* U+0018e3: */
-                                                     0, /* U+0018e4: */
-                                                     0, /* U+0018e5: */
-                                                     0, /* U+0018e6: */
-                                                     0, /* U+0018e7: */
-                                                     0, /* U+0018e8: */
-                                                     0, /* U+0018e9: */
-                                                     0, /* U+0018ea: */
-                                                     0, /* U+0018eb: */
-                                                     0, /* U+0018ec: */
-                                                     0, /* U+0018ed: */
-                                                     0, /* U+0018ee: */
-                                                     0, /* U+0018ef: */
-                                                     0, /* U+0018f0: */
-                                                     0, /* U+0018f1: */
-                                                     0, /* U+0018f2: */
-                                                     0, /* U+0018f3: */
-                                                     0, /* U+0018f4: */
-                                                     0, /* U+0018f5: */
-                                                     0, /* U+0018f6: */
-                                                     0, /* U+0018f7: */
-                                                     0, /* U+0018f8: */
-                                                     0, /* U+0018f9: */
-                                                     0, /* U+0018fa: */
-                                                     0, /* U+0018fb: */
-                                                     0, /* U+0018fc: */
-                                                     0, /* U+0018fd: */
-                                                     0, /* U+0018fe: */
-                                                     0, /* U+0018ff: */
-                                           RTUNI_ALPHA, /* U+001900: LIMBU VOWEL-CARRIER LETTER*/
-                                           RTUNI_ALPHA, /* U+001901: LIMBU LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001902: LIMBU LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+001903: LIMBU LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001904: LIMBU LETTER GHA*/
-                                           RTUNI_ALPHA, /* U+001905: LIMBU LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001906: LIMBU LETTER CA*/
-                                           RTUNI_ALPHA, /* U+001907: LIMBU LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+001908: LIMBU LETTER JA*/
-                                           RTUNI_ALPHA, /* U+001909: LIMBU LETTER JHA*/
-                                           RTUNI_ALPHA, /* U+00190a: LIMBU LETTER YAN*/
-                                           RTUNI_ALPHA, /* U+00190b: LIMBU LETTER TA*/
-                                           RTUNI_ALPHA, /* U+00190c: LIMBU LETTER THA*/
-                                           RTUNI_ALPHA, /* U+00190d: LIMBU LETTER DA*/
-                                           RTUNI_ALPHA, /* U+00190e: LIMBU LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+00190f: LIMBU LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001910: LIMBU LETTER PA*/
-                                           RTUNI_ALPHA, /* U+001911: LIMBU LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+001912: LIMBU LETTER BA*/
-                                           RTUNI_ALPHA, /* U+001913: LIMBU LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+001914: LIMBU LETTER MA*/
-                                           RTUNI_ALPHA, /* U+001915: LIMBU LETTER YA*/
-                                           RTUNI_ALPHA, /* U+001916: LIMBU LETTER RA*/
-                                           RTUNI_ALPHA, /* U+001917: LIMBU LETTER LA*/
-                                           RTUNI_ALPHA, /* U+001918: LIMBU LETTER WA*/
-                                           RTUNI_ALPHA, /* U+001919: LIMBU LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+00191a: LIMBU LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+00191b: LIMBU LETTER SA*/
-                                           RTUNI_ALPHA, /* U+00191c: LIMBU LETTER HA*/
-                                                     0, /* U+00191d: */
-                                                     0, /* U+00191e: */
-                                                     0, /* U+00191f: */
-                                           RTUNI_ALPHA, /* U+001920: LIMBU VOWEL SIGN A*/
-                                           RTUNI_ALPHA, /* U+001921: LIMBU VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001922: LIMBU VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+001923: LIMBU VOWEL SIGN EE*/
-                                           RTUNI_ALPHA, /* U+001924: LIMBU VOWEL SIGN AI*/
-                                           RTUNI_ALPHA, /* U+001925: LIMBU VOWEL SIGN OO*/
-                                           RTUNI_ALPHA, /* U+001926: LIMBU VOWEL SIGN AU*/
-                                           RTUNI_ALPHA, /* U+001927: LIMBU VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+001928: LIMBU VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+001929: LIMBU SUBJOINED LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00192a: LIMBU SUBJOINED LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00192b: LIMBU SUBJOINED LETTER WA*/
-                                                     0, /* U+00192c: */
-                                                     0, /* U+00192d: */
-                                                     0, /* U+00192e: */
-                                                     0, /* U+00192f: */
-                                           RTUNI_ALPHA, /* U+001930: LIMBU SMALL LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001931: LIMBU SMALL LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001932: LIMBU SMALL LETTER ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+001933: LIMBU SMALL LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001934: LIMBU SMALL LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001935: LIMBU SMALL LETTER PA*/
-                                           RTUNI_ALPHA, /* U+001936: LIMBU SMALL LETTER MA*/
-                                           RTUNI_ALPHA, /* U+001937: LIMBU SMALL LETTER RA*/
-                                           RTUNI_ALPHA, /* U+001938: LIMBU SMALL LETTER LA*/
-                                                     0, /* U+001939: LIMBU SIGN MUKPHRENG*/
-                                                     0, /* U+00193a: LIMBU SIGN KEMPHRENG*/
-                                                     0, /* U+00193b: LIMBU SIGN SA-I*/
-                                                     0, /* U+00193c: */
-                                                     0, /* U+00193d: */
-                                                     0, /* U+00193e: */
-                                                     0, /* U+00193f: */
-                                                     0, /* U+001940: LIMBU SIGN LOO*/
-                                                     0, /* U+001941: */
-                                                     0, /* U+001942: */
-                                                     0, /* U+001943: */
-                                                     0, /* U+001944: LIMBU EXCLAMATION MARK*/
-                                                     0, /* U+001945: LIMBU QUESTION MARK*/
-                                          RTUNI_DDIGIT, /* U+001946: LIMBU DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+001947: LIMBU DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+001948: LIMBU DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+001949: LIMBU DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+00194a: LIMBU DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+00194b: LIMBU DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+00194c: LIMBU DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+00194d: LIMBU DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+00194e: LIMBU DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+00194f: LIMBU DIGIT NINE*/
-                                           RTUNI_ALPHA, /* U+001950: TAI LE LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001951: TAI LE LETTER XA*/
-                                           RTUNI_ALPHA, /* U+001952: TAI LE LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001953: TAI LE LETTER TSA*/
-                                           RTUNI_ALPHA, /* U+001954: TAI LE LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001955: TAI LE LETTER YA*/
-                                           RTUNI_ALPHA, /* U+001956: TAI LE LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001957: TAI LE LETTER THA*/
-                                           RTUNI_ALPHA, /* U+001958: TAI LE LETTER LA*/
-                                           RTUNI_ALPHA, /* U+001959: TAI LE LETTER PA*/
-                                           RTUNI_ALPHA, /* U+00195a: TAI LE LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+00195b: TAI LE LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00195c: TAI LE LETTER FA*/
-                                           RTUNI_ALPHA, /* U+00195d: TAI LE LETTER VA*/
-                                           RTUNI_ALPHA, /* U+00195e: TAI LE LETTER HA*/
-                                           RTUNI_ALPHA, /* U+00195f: TAI LE LETTER QA*/
-                                           RTUNI_ALPHA, /* U+001960: TAI LE LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+001961: TAI LE LETTER TSHA*/
-                                           RTUNI_ALPHA, /* U+001962: TAI LE LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001963: TAI LE LETTER A*/
-                                           RTUNI_ALPHA, /* U+001964: TAI LE LETTER I*/
-                                           RTUNI_ALPHA, /* U+001965: TAI LE LETTER EE*/
-                                           RTUNI_ALPHA, /* U+001966: TAI LE LETTER EH*/
-                                           RTUNI_ALPHA, /* U+001967: TAI LE LETTER U*/
-                                           RTUNI_ALPHA, /* U+001968: TAI LE LETTER OO*/
-                                           RTUNI_ALPHA, /* U+001969: TAI LE LETTER O*/
-                                           RTUNI_ALPHA, /* U+00196a: TAI LE LETTER UE*/
-                                           RTUNI_ALPHA, /* U+00196b: TAI LE LETTER E*/
-                                           RTUNI_ALPHA, /* U+00196c: TAI LE LETTER AUE*/
-                                           RTUNI_ALPHA, /* U+00196d: TAI LE LETTER AI*/
-                                                     0, /* U+00196e: */
-                                                     0, /* U+00196f: */
-                                           RTUNI_ALPHA, /* U+001970: TAI LE LETTER TONE-2*/
-                                           RTUNI_ALPHA, /* U+001971: TAI LE LETTER TONE-3*/
-                                           RTUNI_ALPHA, /* U+001972: TAI LE LETTER TONE-4*/
-                                           RTUNI_ALPHA, /* U+001973: TAI LE LETTER TONE-5*/
-                                           RTUNI_ALPHA, /* U+001974: TAI LE LETTER TONE-6*/
-                                                     0, /* U+001975: */
-                                                     0, /* U+001976: */
-                                                     0, /* U+001977: */
-                                                     0, /* U+001978: */
-                                                     0, /* U+001979: */
-                                                     0, /* U+00197a: */
-                                                     0, /* U+00197b: */
-                                                     0, /* U+00197c: */
-                                                     0, /* U+00197d: */
-                                                     0, /* U+00197e: */
-                                                     0, /* U+00197f: */
-                                           RTUNI_ALPHA, /* U+001980: NEW TAI LUE LETTER HIGH QA*/
-                                           RTUNI_ALPHA, /* U+001981: NEW TAI LUE LETTER LOW QA*/
-                                           RTUNI_ALPHA, /* U+001982: NEW TAI LUE LETTER HIGH KA*/
-                                           RTUNI_ALPHA, /* U+001983: NEW TAI LUE LETTER HIGH XA*/
-                                           RTUNI_ALPHA, /* U+001984: NEW TAI LUE LETTER HIGH NGA*/
-                                           RTUNI_ALPHA, /* U+001985: NEW TAI LUE LETTER LOW KA*/
-                                           RTUNI_ALPHA, /* U+001986: NEW TAI LUE LETTER LOW XA*/
-                                           RTUNI_ALPHA, /* U+001987: NEW TAI LUE LETTER LOW NGA*/
-                                           RTUNI_ALPHA, /* U+001988: NEW TAI LUE LETTER HIGH TSA*/
-                                           RTUNI_ALPHA, /* U+001989: NEW TAI LUE LETTER HIGH SA*/
-                                           RTUNI_ALPHA, /* U+00198a: NEW TAI LUE LETTER HIGH YA*/
-                                           RTUNI_ALPHA, /* U+00198b: NEW TAI LUE LETTER LOW TSA*/
-                                           RTUNI_ALPHA, /* U+00198c: NEW TAI LUE LETTER LOW SA*/
-                                           RTUNI_ALPHA, /* U+00198d: NEW TAI LUE LETTER LOW YA*/
-                                           RTUNI_ALPHA, /* U+00198e: NEW TAI LUE LETTER HIGH TA*/
-                                           RTUNI_ALPHA, /* U+00198f: NEW TAI LUE LETTER HIGH THA*/
-                                           RTUNI_ALPHA, /* U+001990: NEW TAI LUE LETTER HIGH NA*/
-                                           RTUNI_ALPHA, /* U+001991: NEW TAI LUE LETTER LOW TA*/
-                                           RTUNI_ALPHA, /* U+001992: NEW TAI LUE LETTER LOW THA*/
-                                           RTUNI_ALPHA, /* U+001993: NEW TAI LUE LETTER LOW NA*/
-                                           RTUNI_ALPHA, /* U+001994: NEW TAI LUE LETTER HIGH PA*/
-                                           RTUNI_ALPHA, /* U+001995: NEW TAI LUE LETTER HIGH PHA*/
-                                           RTUNI_ALPHA, /* U+001996: NEW TAI LUE LETTER HIGH MA*/
-                                           RTUNI_ALPHA, /* U+001997: NEW TAI LUE LETTER LOW PA*/
-                                           RTUNI_ALPHA, /* U+001998: NEW TAI LUE LETTER LOW PHA*/
-                                           RTUNI_ALPHA, /* U+001999: NEW TAI LUE LETTER LOW MA*/
-                                           RTUNI_ALPHA, /* U+00199a: NEW TAI LUE LETTER HIGH FA*/
-                                           RTUNI_ALPHA, /* U+00199b: NEW TAI LUE LETTER HIGH VA*/
-                                           RTUNI_ALPHA, /* U+00199c: NEW TAI LUE LETTER HIGH LA*/
-                                           RTUNI_ALPHA, /* U+00199d: NEW TAI LUE LETTER LOW FA*/
-                                           RTUNI_ALPHA, /* U+00199e: NEW TAI LUE LETTER LOW VA*/
-                                           RTUNI_ALPHA, /* U+00199f: NEW TAI LUE LETTER LOW LA*/
-                                           RTUNI_ALPHA, /* U+0019a0: NEW TAI LUE LETTER HIGH HA*/
-                                           RTUNI_ALPHA, /* U+0019a1: NEW TAI LUE LETTER HIGH DA*/
-                                           RTUNI_ALPHA, /* U+0019a2: NEW TAI LUE LETTER HIGH BA*/
-                                           RTUNI_ALPHA, /* U+0019a3: NEW TAI LUE LETTER LOW HA*/
-                                           RTUNI_ALPHA, /* U+0019a4: NEW TAI LUE LETTER LOW DA*/
-                                           RTUNI_ALPHA, /* U+0019a5: NEW TAI LUE LETTER LOW BA*/
-                                           RTUNI_ALPHA, /* U+0019a6: NEW TAI LUE LETTER HIGH KVA*/
-                                           RTUNI_ALPHA, /* U+0019a7: NEW TAI LUE LETTER HIGH XVA*/
-                                           RTUNI_ALPHA, /* U+0019a8: NEW TAI LUE LETTER LOW KVA*/
-                                           RTUNI_ALPHA, /* U+0019a9: NEW TAI LUE LETTER LOW XVA*/
-                                                     0, /* U+0019aa: */
-                                                     0, /* U+0019ab: */
-                                                     0, /* U+0019ac: */
-                                                     0, /* U+0019ad: */
-                                                     0, /* U+0019ae: */
-                                                     0, /* U+0019af: */
-                                           RTUNI_ALPHA, /* U+0019b0: NEW TAI LUE VOWEL SIGN VOWEL SHORTENER*/
-                                           RTUNI_ALPHA, /* U+0019b1: NEW TAI LUE VOWEL SIGN AA*/
-                                           RTUNI_ALPHA, /* U+0019b2: NEW TAI LUE VOWEL SIGN II*/
-                                           RTUNI_ALPHA, /* U+0019b3: NEW TAI LUE VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+0019b4: NEW TAI LUE VOWEL SIGN UU*/
-                                           RTUNI_ALPHA, /* U+0019b5: NEW TAI LUE VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+0019b6: NEW TAI LUE VOWEL SIGN AE*/
-                                           RTUNI_ALPHA, /* U+0019b7: NEW TAI LUE VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+0019b8: NEW TAI LUE VOWEL SIGN OA*/
-                                           RTUNI_ALPHA, /* U+0019b9: NEW TAI LUE VOWEL SIGN UE*/
-                                           RTUNI_ALPHA, /* U+0019ba: NEW TAI LUE VOWEL SIGN AY*/
-                                           RTUNI_ALPHA, /* U+0019bb: NEW TAI LUE VOWEL SIGN AAY*/
-                                           RTUNI_ALPHA, /* U+0019bc: NEW TAI LUE VOWEL SIGN UY*/
-                                           RTUNI_ALPHA, /* U+0019bd: NEW TAI LUE VOWEL SIGN OY*/
-                                           RTUNI_ALPHA, /* U+0019be: NEW TAI LUE VOWEL SIGN OAY*/
-                                           RTUNI_ALPHA, /* U+0019bf: NEW TAI LUE VOWEL SIGN UEY*/
-                                           RTUNI_ALPHA, /* U+0019c0: NEW TAI LUE VOWEL SIGN IY*/
-                                           RTUNI_ALPHA, /* U+0019c1: NEW TAI LUE LETTER FINAL V*/
-                                           RTUNI_ALPHA, /* U+0019c2: NEW TAI LUE LETTER FINAL NG*/
-                                           RTUNI_ALPHA, /* U+0019c3: NEW TAI LUE LETTER FINAL N*/
-                                           RTUNI_ALPHA, /* U+0019c4: NEW TAI LUE LETTER FINAL M*/
-                                           RTUNI_ALPHA, /* U+0019c5: NEW TAI LUE LETTER FINAL K*/
-                                           RTUNI_ALPHA, /* U+0019c6: NEW TAI LUE LETTER FINAL D*/
-                                           RTUNI_ALPHA, /* U+0019c7: NEW TAI LUE LETTER FINAL B*/
-                                           RTUNI_ALPHA, /* U+0019c8: NEW TAI LUE TONE MARK-1*/
-                                           RTUNI_ALPHA, /* U+0019c9: NEW TAI LUE TONE MARK-2*/
-                                                     0, /* U+0019ca: */
-                                                     0, /* U+0019cb: */
-                                                     0, /* U+0019cc: */
-                                                     0, /* U+0019cd: */
-                                                     0, /* U+0019ce: */
-                                                     0, /* U+0019cf: */
-                                          RTUNI_DDIGIT, /* U+0019d0: NEW TAI LUE DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+0019d1: NEW TAI LUE DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+0019d2: NEW TAI LUE DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+0019d3: NEW TAI LUE DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+0019d4: NEW TAI LUE DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+0019d5: NEW TAI LUE DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+0019d6: NEW TAI LUE DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+0019d7: NEW TAI LUE DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+0019d8: NEW TAI LUE DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+0019d9: NEW TAI LUE DIGIT NINE*/
-                                                     0, /* U+0019da: */
-                                                     0, /* U+0019db: */
-                                                     0, /* U+0019dc: */
-                                                     0, /* U+0019dd: */
-                                                     0, /* U+0019de: NEW TAI LUE SIGN LAE*/
-                                                     0, /* U+0019df: NEW TAI LUE SIGN LAEV*/
-                                                     0, /* U+0019e0: KHMER SYMBOL PATHAMASAT*/
-                                                     0, /* U+0019e1: KHMER SYMBOL MUOY KOET*/
-                                                     0, /* U+0019e2: KHMER SYMBOL PII KOET*/
-                                                     0, /* U+0019e3: KHMER SYMBOL BEI KOET*/
-                                                     0, /* U+0019e4: KHMER SYMBOL BUON KOET*/
-                                                     0, /* U+0019e5: KHMER SYMBOL PRAM KOET*/
-                                                     0, /* U+0019e6: KHMER SYMBOL PRAM-MUOY KOET*/
-                                                     0, /* U+0019e7: KHMER SYMBOL PRAM-PII KOET*/
-                                                     0, /* U+0019e8: KHMER SYMBOL PRAM-BEI KOET*/
-                                                     0, /* U+0019e9: KHMER SYMBOL PRAM-BUON KOET*/
-                                                     0, /* U+0019ea: KHMER SYMBOL DAP KOET*/
-                                                     0, /* U+0019eb: KHMER SYMBOL DAP-MUOY KOET*/
-                                                     0, /* U+0019ec: KHMER SYMBOL DAP-PII KOET*/
-                                                     0, /* U+0019ed: KHMER SYMBOL DAP-BEI KOET*/
-                                                     0, /* U+0019ee: KHMER SYMBOL DAP-BUON KOET*/
-                                                     0, /* U+0019ef: KHMER SYMBOL DAP-PRAM KOET*/
-                                                     0, /* U+0019f0: KHMER SYMBOL TUTEYASAT*/
-                                                     0, /* U+0019f1: KHMER SYMBOL MUOY ROC*/
-                                                     0, /* U+0019f2: KHMER SYMBOL PII ROC*/
-                                                     0, /* U+0019f3: KHMER SYMBOL BEI ROC*/
-                                                     0, /* U+0019f4: KHMER SYMBOL BUON ROC*/
-                                                     0, /* U+0019f5: KHMER SYMBOL PRAM ROC*/
-                                                     0, /* U+0019f6: KHMER SYMBOL PRAM-MUOY ROC*/
-                                                     0, /* U+0019f7: KHMER SYMBOL PRAM-PII ROC*/
-                                                     0, /* U+0019f8: KHMER SYMBOL PRAM-BEI ROC*/
-                                                     0, /* U+0019f9: KHMER SYMBOL PRAM-BUON ROC*/
-                                                     0, /* U+0019fa: KHMER SYMBOL DAP ROC*/
-                                                     0, /* U+0019fb: KHMER SYMBOL DAP-MUOY ROC*/
-                                                     0, /* U+0019fc: KHMER SYMBOL DAP-PII ROC*/
-                                                     0, /* U+0019fd: KHMER SYMBOL DAP-BEI ROC*/
-                                                     0, /* U+0019fe: KHMER SYMBOL DAP-BUON ROC*/
-                                                     0, /* U+0019ff: KHMER SYMBOL DAP-PRAM ROC*/
-                                           RTUNI_ALPHA, /* U+001a00: BUGINESE LETTER KA*/
-                                           RTUNI_ALPHA, /* U+001a01: BUGINESE LETTER GA*/
-                                           RTUNI_ALPHA, /* U+001a02: BUGINESE LETTER NGA*/
-                                           RTUNI_ALPHA, /* U+001a03: BUGINESE LETTER NGKA*/
-                                           RTUNI_ALPHA, /* U+001a04: BUGINESE LETTER PA*/
-                                           RTUNI_ALPHA, /* U+001a05: BUGINESE LETTER BA*/
-                                           RTUNI_ALPHA, /* U+001a06: BUGINESE LETTER MA*/
-                                           RTUNI_ALPHA, /* U+001a07: BUGINESE LETTER MPA*/
-                                           RTUNI_ALPHA, /* U+001a08: BUGINESE LETTER TA*/
-                                           RTUNI_ALPHA, /* U+001a09: BUGINESE LETTER DA*/
-                                           RTUNI_ALPHA, /* U+001a0a: BUGINESE LETTER NA*/
-                                           RTUNI_ALPHA, /* U+001a0b: BUGINESE LETTER NRA*/
-                                           RTUNI_ALPHA, /* U+001a0c: BUGINESE LETTER CA*/
-                                           RTUNI_ALPHA, /* U+001a0d: BUGINESE LETTER JA*/
-                                           RTUNI_ALPHA, /* U+001a0e: BUGINESE LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+001a0f: BUGINESE LETTER NYCA*/
-                                           RTUNI_ALPHA, /* U+001a10: BUGINESE LETTER YA*/
-                                           RTUNI_ALPHA, /* U+001a11: BUGINESE LETTER RA*/
-                                           RTUNI_ALPHA, /* U+001a12: BUGINESE LETTER LA*/
-                                           RTUNI_ALPHA, /* U+001a13: BUGINESE LETTER VA*/
-                                           RTUNI_ALPHA, /* U+001a14: BUGINESE LETTER SA*/
-                                           RTUNI_ALPHA, /* U+001a15: BUGINESE LETTER A*/
-                                           RTUNI_ALPHA, /* U+001a16: BUGINESE LETTER HA*/
-                                           RTUNI_ALPHA, /* U+001a17: BUGINESE VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+001a18: BUGINESE VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+001a19: BUGINESE VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+001a1a: BUGINESE VOWEL SIGN O*/
-                                           RTUNI_ALPHA, /* U+001a1b: BUGINESE VOWEL SIGN AE*/
-                                                     0, /* U+001a1c: */
-                                                     0, /* U+001a1d: */
-                                                     0, /* U+001a1e: BUGINESE PALLAWA*/
-                                                     0, /* U+001a1f: BUGINESE END OF SECTION*/
-                                                     0, /* U+001a20: */
-                                                     0, /* U+001a21: */
-                                                     0, /* U+001a22: */
-                                                     0, /* U+001a23: */
-                                                     0, /* U+001a24: */
-                                                     0, /* U+001a25: */
-                                                     0, /* U+001a26: */
-                                                     0, /* U+001a27: */
-                                                     0, /* U+001a28: */
-                                                     0, /* U+001a29: */
-                                                     0, /* U+001a2a: */
-                                                     0, /* U+001a2b: */
-                                                     0, /* U+001a2c: */
-                                                     0, /* U+001a2d: */
-                                                     0, /* U+001a2e: */
-                                                     0, /* U+001a2f: */
-                                                     0, /* U+001a30: */
-                                                     0, /* U+001a31: */
-                                                     0, /* U+001a32: */
-                                                     0, /* U+001a33: */
-                                                     0, /* U+001a34: */
-                                                     0, /* U+001a35: */
-                                                     0, /* U+001a36: */
-                                                     0, /* U+001a37: */
-                                                     0, /* U+001a38: */
-                                                     0, /* U+001a39: */
-                                                     0, /* U+001a3a: */
-                                                     0, /* U+001a3b: */
-                                                     0, /* U+001a3c: */
-                                                     0, /* U+001a3d: */
-                                                     0, /* U+001a3e: */
-                                                     0, /* U+001a3f: */
-                                                     0, /* U+001a40: */
-                                                     0, /* U+001a41: */
-                                                     0, /* U+001a42: */
-                                                     0, /* U+001a43: */
-                                                     0, /* U+001a44: */
-                                                     0, /* U+001a45: */
-                                                     0, /* U+001a46: */
-                                                     0, /* U+001a47: */
-                                                     0, /* U+001a48: */
-                                                     0, /* U+001a49: */
-                                                     0, /* U+001a4a: */
-                                                     0, /* U+001a4b: */
-                                                     0, /* U+001a4c: */
-                                                     0, /* U+001a4d: */
-                                                     0, /* U+001a4e: */
-                                                     0, /* U+001a4f: */
-                                                     0, /* U+001a50: */
-                                                     0, /* U+001a51: */
-                                                     0, /* U+001a52: */
-                                                     0, /* U+001a53: */
-                                                     0, /* U+001a54: */
-                                                     0, /* U+001a55: */
-                                                     0, /* U+001a56: */
-                                                     0, /* U+001a57: */
-                                                     0, /* U+001a58: */
-                                                     0, /* U+001a59: */
-                                                     0, /* U+001a5a: */
-                                                     0, /* U+001a5b: */
-                                                     0, /* U+001a5c: */
-                                                     0, /* U+001a5d: */
-                                                     0, /* U+001a5e: */
-                                                     0, /* U+001a5f: */
-                                                     0, /* U+001a60: */
-                                                     0, /* U+001a61: */
-                                                     0, /* U+001a62: */
-                                                     0, /* U+001a63: */
-                                                     0, /* U+001a64: */
-                                                     0, /* U+001a65: */
-                                                     0, /* U+001a66: */
-                                                     0, /* U+001a67: */
-                                                     0, /* U+001a68: */
-                                                     0, /* U+001a69: */
-                                                     0, /* U+001a6a: */
-                                                     0, /* U+001a6b: */
-                                                     0, /* U+001a6c: */
-                                                     0, /* U+001a6d: */
-                                                     0, /* U+001a6e: */
-                                                     0, /* U+001a6f: */
-                                                     0, /* U+001a70: */
-                                                     0, /* U+001a71: */
-                                                     0, /* U+001a72: */
-                                                     0, /* U+001a73: */
-                                                     0, /* U+001a74: */
-                                                     0, /* U+001a75: */
-                                                     0, /* U+001a76: */
-                                                     0, /* U+001a77: */
-                                                     0, /* U+001a78: */
-                                                     0, /* U+001a79: */
-                                                     0, /* U+001a7a: */
-                                                     0, /* U+001a7b: */
-                                                     0, /* U+001a7c: */
-                                                     0, /* U+001a7d: */
-                                                     0, /* U+001a7e: */
-                                                     0, /* U+001a7f: */
-                                                     0, /* U+001a80: */
-                                                     0, /* U+001a81: */
-                                                     0, /* U+001a82: */
-                                                     0, /* U+001a83: */
-                                                     0, /* U+001a84: */
-                                                     0, /* U+001a85: */
-                                                     0, /* U+001a86: */
-                                                     0, /* U+001a87: */
-                                                     0, /* U+001a88: */
-                                                     0, /* U+001a89: */
-                                                     0, /* U+001a8a: */
-                                                     0, /* U+001a8b: */
-                                                     0, /* U+001a8c: */
-                                                     0, /* U+001a8d: */
-                                                     0, /* U+001a8e: */
-                                                     0, /* U+001a8f: */
-                                                     0, /* U+001a90: */
-                                                     0, /* U+001a91: */
-                                                     0, /* U+001a92: */
-                                                     0, /* U+001a93: */
-                                                     0, /* U+001a94: */
-                                                     0, /* U+001a95: */
-                                                     0, /* U+001a96: */
-                                                     0, /* U+001a97: */
-                                                     0, /* U+001a98: */
-                                                     0, /* U+001a99: */
-                                                     0, /* U+001a9a: */
-                                                     0, /* U+001a9b: */
-                                                     0, /* U+001a9c: */
-                                                     0, /* U+001a9d: */
-                                                     0, /* U+001a9e: */
-                                                     0, /* U+001a9f: */
-                                                     0, /* U+001aa0: */
-                                                     0, /* U+001aa1: */
-                                                     0, /* U+001aa2: */
-                                                     0, /* U+001aa3: */
-                                                     0, /* U+001aa4: */
-                                                     0, /* U+001aa5: */
-                                                     0, /* U+001aa6: */
-                                                     0, /* U+001aa7: */
-                                                     0, /* U+001aa8: */
-                                                     0, /* U+001aa9: */
-                                                     0, /* U+001aaa: */
-                                                     0, /* U+001aab: */
-                                                     0, /* U+001aac: */
-                                                     0, /* U+001aad: */
-                                                     0, /* U+001aae: */
-                                                     0, /* U+001aaf: */
-                                                     0, /* U+001ab0: */
-                                                     0, /* U+001ab1: */
-                                                     0, /* U+001ab2: */
-                                                     0, /* U+001ab3: */
-                                                     0, /* U+001ab4: */
-                                                     0, /* U+001ab5: */
-                                                     0, /* U+001ab6: */
-                                                     0, /* U+001ab7: */
-                                                     0, /* U+001ab8: */
-                                                     0, /* U+001ab9: */
-                                                     0, /* U+001aba: */
-                                                     0, /* U+001abb: */
-                                                     0, /* U+001abc: */
-                                                     0, /* U+001abd: */
-                                                     0, /* U+001abe: */
-                                                     0, /* U+001abf: */
-                                                     0, /* U+001ac0: */
-                                                     0, /* U+001ac1: */
-                                                     0, /* U+001ac2: */
-                                                     0, /* U+001ac3: */
-                                                     0, /* U+001ac4: */
-                                                     0, /* U+001ac5: */
-                                                     0, /* U+001ac6: */
-                                                     0, /* U+001ac7: */
-                                                     0, /* U+001ac8: */
-                                                     0, /* U+001ac9: */
-                                                     0, /* U+001aca: */
-                                                     0, /* U+001acb: */
-                                                     0, /* U+001acc: */
-                                                     0, /* U+001acd: */
-                                                     0, /* U+001ace: */
-                                                     0, /* U+001acf: */
-                                                     0, /* U+001ad0: */
-                                                     0, /* U+001ad1: */
-                                                     0, /* U+001ad2: */
-                                                     0, /* U+001ad3: */
-                                                     0, /* U+001ad4: */
-                                                     0, /* U+001ad5: */
-                                                     0, /* U+001ad6: */
-                                                     0, /* U+001ad7: */
-                                                     0, /* U+001ad8: */
-                                                     0, /* U+001ad9: */
-                                                     0, /* U+001ada: */
-                                                     0, /* U+001adb: */
-                                                     0, /* U+001adc: */
-                                                     0, /* U+001add: */
-                                                     0, /* U+001ade: */
-                                                     0, /* U+001adf: */
-                                                     0, /* U+001ae0: */
-                                                     0, /* U+001ae1: */
-                                                     0, /* U+001ae2: */
-                                                     0, /* U+001ae3: */
-                                                     0, /* U+001ae4: */
-                                                     0, /* U+001ae5: */
-                                                     0, /* U+001ae6: */
-                                                     0, /* U+001ae7: */
-                                                     0, /* U+001ae8: */
-                                                     0, /* U+001ae9: */
-                                                     0, /* U+001aea: */
-                                                     0, /* U+001aeb: */
-                                                     0, /* U+001aec: */
-                                                     0, /* U+001aed: */
-                                                     0, /* U+001aee: */
-                                                     0, /* U+001aef: */
-                                                     0, /* U+001af0: */
-                                                     0, /* U+001af1: */
-                                                     0, /* U+001af2: */
-                                                     0, /* U+001af3: */
-                                                     0, /* U+001af4: */
-                                                     0, /* U+001af5: */
-                                                     0, /* U+001af6: */
-                                                     0, /* U+001af7: */
-                                                     0, /* U+001af8: */
-                                                     0, /* U+001af9: */
-                                                     0, /* U+001afa: */
-                                                     0, /* U+001afb: */
-                                                     0, /* U+001afc: */
-                                                     0, /* U+001afd: */
-                                                     0, /* U+001afe: */
-                                                     0, /* U+001aff: */
-                                                     0, /* U+001b00: */
-                                                     0, /* U+001b01: */
-                                                     0, /* U+001b02: */
-                                                     0, /* U+001b03: */
-                                                     0, /* U+001b04: */
-                                                     0, /* U+001b05: */
-                                                     0, /* U+001b06: */
-                                                     0, /* U+001b07: */
-                                                     0, /* U+001b08: */
-                                                     0, /* U+001b09: */
-                                                     0, /* U+001b0a: */
-                                                     0, /* U+001b0b: */
-                                                     0, /* U+001b0c: */
-                                                     0, /* U+001b0d: */
-                                                     0, /* U+001b0e: */
-                                                     0, /* U+001b0f: */
-                                                     0, /* U+001b10: */
-                                                     0, /* U+001b11: */
-                                                     0, /* U+001b12: */
-                                                     0, /* U+001b13: */
-                                                     0, /* U+001b14: */
-                                                     0, /* U+001b15: */
-                                                     0, /* U+001b16: */
-                                                     0, /* U+001b17: */
-                                                     0, /* U+001b18: */
-                                                     0, /* U+001b19: */
-                                                     0, /* U+001b1a: */
-                                                     0, /* U+001b1b: */
-                                                     0, /* U+001b1c: */
-                                                     0, /* U+001b1d: */
-                                                     0, /* U+001b1e: */
-                                                     0, /* U+001b1f: */
-                                                     0, /* U+001b20: */
-                                                     0, /* U+001b21: */
-                                                     0, /* U+001b22: */
-                                                     0, /* U+001b23: */
-                                                     0, /* U+001b24: */
-                                                     0, /* U+001b25: */
-                                                     0, /* U+001b26: */
-                                                     0, /* U+001b27: */
-                                                     0, /* U+001b28: */
-                                                     0, /* U+001b29: */
-                                                     0, /* U+001b2a: */
-                                                     0, /* U+001b2b: */
-                                                     0, /* U+001b2c: */
-                                                     0, /* U+001b2d: */
-                                                     0, /* U+001b2e: */
-                                                     0, /* U+001b2f: */
-                                                     0, /* U+001b30: */
-                                                     0, /* U+001b31: */
-                                                     0, /* U+001b32: */
-                                                     0, /* U+001b33: */
-                                                     0, /* U+001b34: */
-                                                     0, /* U+001b35: */
-                                                     0, /* U+001b36: */
-                                                     0, /* U+001b37: */
-                                                     0, /* U+001b38: */
-                                                     0, /* U+001b39: */
-                                                     0, /* U+001b3a: */
-                                                     0, /* U+001b3b: */
-                                                     0, /* U+001b3c: */
-                                                     0, /* U+001b3d: */
-                                                     0, /* U+001b3e: */
-                                                     0, /* U+001b3f: */
-                                                     0, /* U+001b40: */
-                                                     0, /* U+001b41: */
-                                                     0, /* U+001b42: */
-                                                     0, /* U+001b43: */
-                                                     0, /* U+001b44: */
-                                                     0, /* U+001b45: */
-                                                     0, /* U+001b46: */
-                                                     0, /* U+001b47: */
-                                                     0, /* U+001b48: */
-                                                     0, /* U+001b49: */
-                                                     0, /* U+001b4a: */
-                                                     0, /* U+001b4b: */
-                                                     0, /* U+001b4c: */
-                                                     0, /* U+001b4d: */
-                                                     0, /* U+001b4e: */
-                                                     0, /* U+001b4f: */
-                                                     0, /* U+001b50: */
-                                                     0, /* U+001b51: */
-                                                     0, /* U+001b52: */
-                                                     0, /* U+001b53: */
-                                                     0, /* U+001b54: */
-                                                     0, /* U+001b55: */
-                                                     0, /* U+001b56: */
-                                                     0, /* U+001b57: */
-                                                     0, /* U+001b58: */
-                                                     0, /* U+001b59: */
-                                                     0, /* U+001b5a: */
-                                                     0, /* U+001b5b: */
-                                                     0, /* U+001b5c: */
-                                                     0, /* U+001b5d: */
-                                                     0, /* U+001b5e: */
-                                                     0, /* U+001b5f: */
-                                                     0, /* U+001b60: */
-                                                     0, /* U+001b61: */
-                                                     0, /* U+001b62: */
-                                                     0, /* U+001b63: */
-                                                     0, /* U+001b64: */
-                                                     0, /* U+001b65: */
-                                                     0, /* U+001b66: */
-                                                     0, /* U+001b67: */
-                                                     0, /* U+001b68: */
-                                                     0, /* U+001b69: */
-                                                     0, /* U+001b6a: */
-                                                     0, /* U+001b6b: */
-                                                     0, /* U+001b6c: */
-                                                     0, /* U+001b6d: */
-                                                     0, /* U+001b6e: */
-                                                     0, /* U+001b6f: */
-                                                     0, /* U+001b70: */
-                                                     0, /* U+001b71: */
-                                                     0, /* U+001b72: */
-                                                     0, /* U+001b73: */
-                                                     0, /* U+001b74: */
-                                                     0, /* U+001b75: */
-                                                     0, /* U+001b76: */
-                                                     0, /* U+001b77: */
-                                                     0, /* U+001b78: */
-                                                     0, /* U+001b79: */
-                                                     0, /* U+001b7a: */
-                                                     0, /* U+001b7b: */
-                                                     0, /* U+001b7c: */
-                                                     0, /* U+001b7d: */
-                                                     0, /* U+001b7e: */
-                                                     0, /* U+001b7f: */
-                                                     0, /* U+001b80: */
-                                                     0, /* U+001b81: */
-                                                     0, /* U+001b82: */
-                                                     0, /* U+001b83: */
-                                                     0, /* U+001b84: */
-                                                     0, /* U+001b85: */
-                                                     0, /* U+001b86: */
-                                                     0, /* U+001b87: */
-                                                     0, /* U+001b88: */
-                                                     0, /* U+001b89: */
-                                                     0, /* U+001b8a: */
-                                                     0, /* U+001b8b: */
-                                                     0, /* U+001b8c: */
-                                                     0, /* U+001b8d: */
-                                                     0, /* U+001b8e: */
-                                                     0, /* U+001b8f: */
-                                                     0, /* U+001b90: */
-                                                     0, /* U+001b91: */
-                                                     0, /* U+001b92: */
-                                                     0, /* U+001b93: */
-                                                     0, /* U+001b94: */
-                                                     0, /* U+001b95: */
-                                                     0, /* U+001b96: */
-                                                     0, /* U+001b97: */
-                                                     0, /* U+001b98: */
-                                                     0, /* U+001b99: */
-                                                     0, /* U+001b9a: */
-                                                     0, /* U+001b9b: */
-                                                     0, /* U+001b9c: */
-                                                     0, /* U+001b9d: */
-                                                     0, /* U+001b9e: */
-                                                     0, /* U+001b9f: */
-                                                     0, /* U+001ba0: */
-                                                     0, /* U+001ba1: */
-                                                     0, /* U+001ba2: */
-                                                     0, /* U+001ba3: */
-                                                     0, /* U+001ba4: */
-                                                     0, /* U+001ba5: */
-                                                     0, /* U+001ba6: */
-                                                     0, /* U+001ba7: */
-                                                     0, /* U+001ba8: */
-                                                     0, /* U+001ba9: */
-                                                     0, /* U+001baa: */
-                                                     0, /* U+001bab: */
-                                                     0, /* U+001bac: */
-                                                     0, /* U+001bad: */
-                                                     0, /* U+001bae: */
-                                                     0, /* U+001baf: */
-                                                     0, /* U+001bb0: */
-                                                     0, /* U+001bb1: */
-                                                     0, /* U+001bb2: */
-                                                     0, /* U+001bb3: */
-                                                     0, /* U+001bb4: */
-                                                     0, /* U+001bb5: */
-                                                     0, /* U+001bb6: */
-                                                     0, /* U+001bb7: */
-                                                     0, /* U+001bb8: */
-                                                     0, /* U+001bb9: */
-                                                     0, /* U+001bba: */
-                                                     0, /* U+001bbb: */
-                                                     0, /* U+001bbc: */
-                                                     0, /* U+001bbd: */
-                                                     0, /* U+001bbe: */
-                                                     0, /* U+001bbf: */
-                                                     0, /* U+001bc0: */
-                                                     0, /* U+001bc1: */
-                                                     0, /* U+001bc2: */
-                                                     0, /* U+001bc3: */
-                                                     0, /* U+001bc4: */
-                                                     0, /* U+001bc5: */
-                                                     0, /* U+001bc6: */
-                                                     0, /* U+001bc7: */
-                                                     0, /* U+001bc8: */
-                                                     0, /* U+001bc9: */
-                                                     0, /* U+001bca: */
-                                                     0, /* U+001bcb: */
-                                                     0, /* U+001bcc: */
-                                                     0, /* U+001bcd: */
-                                                     0, /* U+001bce: */
-                                                     0, /* U+001bcf: */
-                                                     0, /* U+001bd0: */
-                                                     0, /* U+001bd1: */
-                                                     0, /* U+001bd2: */
-                                                     0, /* U+001bd3: */
-                                                     0, /* U+001bd4: */
-                                                     0, /* U+001bd5: */
-                                                     0, /* U+001bd6: */
-                                                     0, /* U+001bd7: */
-                                                     0, /* U+001bd8: */
-                                                     0, /* U+001bd9: */
-                                                     0, /* U+001bda: */
-                                                     0, /* U+001bdb: */
-                                                     0, /* U+001bdc: */
-                                                     0, /* U+001bdd: */
-                                                     0, /* U+001bde: */
-                                                     0, /* U+001bdf: */
-                                                     0, /* U+001be0: */
-                                                     0, /* U+001be1: */
-                                                     0, /* U+001be2: */
-                                                     0, /* U+001be3: */
-                                                     0, /* U+001be4: */
-                                                     0, /* U+001be5: */
-                                                     0, /* U+001be6: */
-                                                     0, /* U+001be7: */
-                                                     0, /* U+001be8: */
-                                                     0, /* U+001be9: */
-                                                     0, /* U+001bea: */
-                                                     0, /* U+001beb: */
-                                                     0, /* U+001bec: */
-                                                     0, /* U+001bed: */
-                                                     0, /* U+001bee: */
-                                                     0, /* U+001bef: */
-                                                     0, /* U+001bf0: */
-                                                     0, /* U+001bf1: */
-                                                     0, /* U+001bf2: */
-                                                     0, /* U+001bf3: */
-                                                     0, /* U+001bf4: */
-                                                     0, /* U+001bf5: */
-                                                     0, /* U+001bf6: */
-                                                     0, /* U+001bf7: */
-                                                     0, /* U+001bf8: */
-                                                     0, /* U+001bf9: */
-                                                     0, /* U+001bfa: */
-                                                     0, /* U+001bfb: */
-                                                     0, /* U+001bfc: */
-                                                     0, /* U+001bfd: */
-                                                     0, /* U+001bfe: */
-                                                     0, /* U+001bff: */
-                                                     0, /* U+001c00: */
-                                                     0, /* U+001c01: */
-                                                     0, /* U+001c02: */
-                                                     0, /* U+001c03: */
-                                                     0, /* U+001c04: */
-                                                     0, /* U+001c05: */
-                                                     0, /* U+001c06: */
-                                                     0, /* U+001c07: */
-                                                     0, /* U+001c08: */
-                                                     0, /* U+001c09: */
-                                                     0, /* U+001c0a: */
-                                                     0, /* U+001c0b: */
-                                                     0, /* U+001c0c: */
-                                                     0, /* U+001c0d: */
-                                                     0, /* U+001c0e: */
-                                                     0, /* U+001c0f: */
-                                                     0, /* U+001c10: */
-                                                     0, /* U+001c11: */
-                                                     0, /* U+001c12: */
-                                                     0, /* U+001c13: */
-                                                     0, /* U+001c14: */
-                                                     0, /* U+001c15: */
-                                                     0, /* U+001c16: */
-                                                     0, /* U+001c17: */
-                                                     0, /* U+001c18: */
-                                                     0, /* U+001c19: */
-                                                     0, /* U+001c1a: */
-                                                     0, /* U+001c1b: */
-                                                     0, /* U+001c1c: */
-                                                     0, /* U+001c1d: */
-                                                     0, /* U+001c1e: */
-                                                     0, /* U+001c1f: */
-                                                     0, /* U+001c20: */
-                                                     0, /* U+001c21: */
-                                                     0, /* U+001c22: */
-                                                     0, /* U+001c23: */
-                                                     0, /* U+001c24: */
-                                                     0, /* U+001c25: */
-                                                     0, /* U+001c26: */
-                                                     0, /* U+001c27: */
-                                                     0, /* U+001c28: */
-                                                     0, /* U+001c29: */
-                                                     0, /* U+001c2a: */
-                                                     0, /* U+001c2b: */
-                                                     0, /* U+001c2c: */
-                                                     0, /* U+001c2d: */
-                                                     0, /* U+001c2e: */
-                                                     0, /* U+001c2f: */
-                                                     0, /* U+001c30: */
-                                                     0, /* U+001c31: */
-                                                     0, /* U+001c32: */
-                                                     0, /* U+001c33: */
-                                                     0, /* U+001c34: */
-                                                     0, /* U+001c35: */
-                                                     0, /* U+001c36: */
-                                                     0, /* U+001c37: */
-                                                     0, /* U+001c38: */
-                                                     0, /* U+001c39: */
-                                                     0, /* U+001c3a: */
-                                                     0, /* U+001c3b: */
-                                                     0, /* U+001c3c: */
-                                                     0, /* U+001c3d: */
-                                                     0, /* U+001c3e: */
-                                                     0, /* U+001c3f: */
-                                                     0, /* U+001c40: */
-                                                     0, /* U+001c41: */
-                                                     0, /* U+001c42: */
-                                                     0, /* U+001c43: */
-                                                     0, /* U+001c44: */
-                                                     0, /* U+001c45: */
-                                                     0, /* U+001c46: */
-                                                     0, /* U+001c47: */
-                                                     0, /* U+001c48: */
-                                                     0, /* U+001c49: */
-                                                     0, /* U+001c4a: */
-                                                     0, /* U+001c4b: */
-                                                     0, /* U+001c4c: */
-                                                     0, /* U+001c4d: */
-                                                     0, /* U+001c4e: */
-                                                     0, /* U+001c4f: */
-                                                     0, /* U+001c50: */
-                                                     0, /* U+001c51: */
-                                                     0, /* U+001c52: */
-                                                     0, /* U+001c53: */
-                                                     0, /* U+001c54: */
-                                                     0, /* U+001c55: */
-                                                     0, /* U+001c56: */
-                                                     0, /* U+001c57: */
-                                                     0, /* U+001c58: */
-                                                     0, /* U+001c59: */
-                                                     0, /* U+001c5a: */
-                                                     0, /* U+001c5b: */
-                                                     0, /* U+001c5c: */
-                                                     0, /* U+001c5d: */
-                                                     0, /* U+001c5e: */
-                                                     0, /* U+001c5f: */
-                                                     0, /* U+001c60: */
-                                                     0, /* U+001c61: */
-                                                     0, /* U+001c62: */
-                                                     0, /* U+001c63: */
-                                                     0, /* U+001c64: */
-                                                     0, /* U+001c65: */
-                                                     0, /* U+001c66: */
-                                                     0, /* U+001c67: */
-                                                     0, /* U+001c68: */
-                                                     0, /* U+001c69: */
-                                                     0, /* U+001c6a: */
-                                                     0, /* U+001c6b: */
-                                                     0, /* U+001c6c: */
-                                                     0, /* U+001c6d: */
-                                                     0, /* U+001c6e: */
-                                                     0, /* U+001c6f: */
-                                                     0, /* U+001c70: */
-                                                     0, /* U+001c71: */
-                                                     0, /* U+001c72: */
-                                                     0, /* U+001c73: */
-                                                     0, /* U+001c74: */
-                                                     0, /* U+001c75: */
-                                                     0, /* U+001c76: */
-                                                     0, /* U+001c77: */
-                                                     0, /* U+001c78: */
-                                                     0, /* U+001c79: */
-                                                     0, /* U+001c7a: */
-                                                     0, /* U+001c7b: */
-                                                     0, /* U+001c7c: */
-                                                     0, /* U+001c7d: */
-                                                     0, /* U+001c7e: */
-                                                     0, /* U+001c7f: */
-                                                     0, /* U+001c80: */
-                                                     0, /* U+001c81: */
-                                                     0, /* U+001c82: */
-                                                     0, /* U+001c83: */
-                                                     0, /* U+001c84: */
-                                                     0, /* U+001c85: */
-                                                     0, /* U+001c86: */
-                                                     0, /* U+001c87: */
-                                                     0, /* U+001c88: */
-                                                     0, /* U+001c89: */
-                                                     0, /* U+001c8a: */
-                                                     0, /* U+001c8b: */
-                                                     0, /* U+001c8c: */
-                                                     0, /* U+001c8d: */
-                                                     0, /* U+001c8e: */
-                                                     0, /* U+001c8f: */
-                                                     0, /* U+001c90: */
-                                                     0, /* U+001c91: */
-                                                     0, /* U+001c92: */
-                                                     0, /* U+001c93: */
-                                                     0, /* U+001c94: */
-                                                     0, /* U+001c95: */
-                                                     0, /* U+001c96: */
-                                                     0, /* U+001c97: */
-                                                     0, /* U+001c98: */
-                                                     0, /* U+001c99: */
-                                                     0, /* U+001c9a: */
-                                                     0, /* U+001c9b: */
-                                                     0, /* U+001c9c: */
-                                                     0, /* U+001c9d: */
-                                                     0, /* U+001c9e: */
-                                                     0, /* U+001c9f: */
-                                                     0, /* U+001ca0: */
-                                                     0, /* U+001ca1: */
-                                                     0, /* U+001ca2: */
-                                                     0, /* U+001ca3: */
-                                                     0, /* U+001ca4: */
-                                                     0, /* U+001ca5: */
-                                                     0, /* U+001ca6: */
-                                                     0, /* U+001ca7: */
-                                                     0, /* U+001ca8: */
-                                                     0, /* U+001ca9: */
-                                                     0, /* U+001caa: */
-                                                     0, /* U+001cab: */
-                                                     0, /* U+001cac: */
-                                                     0, /* U+001cad: */
-                                                     0, /* U+001cae: */
-                                                     0, /* U+001caf: */
-                                                     0, /* U+001cb0: */
-                                                     0, /* U+001cb1: */
-                                                     0, /* U+001cb2: */
-                                                     0, /* U+001cb3: */
-                                                     0, /* U+001cb4: */
-                                                     0, /* U+001cb5: */
-                                                     0, /* U+001cb6: */
-                                                     0, /* U+001cb7: */
-                                                     0, /* U+001cb8: */
-                                                     0, /* U+001cb9: */
-                                                     0, /* U+001cba: */
-                                                     0, /* U+001cbb: */
-                                                     0, /* U+001cbc: */
-                                                     0, /* U+001cbd: */
-                                                     0, /* U+001cbe: */
-                                                     0, /* U+001cbf: */
-                                                     0, /* U+001cc0: */
-                                                     0, /* U+001cc1: */
-                                                     0, /* U+001cc2: */
-                                                     0, /* U+001cc3: */
-                                                     0, /* U+001cc4: */
-                                                     0, /* U+001cc5: */
-                                                     0, /* U+001cc6: */
-                                                     0, /* U+001cc7: */
-                                                     0, /* U+001cc8: */
-                                                     0, /* U+001cc9: */
-                                                     0, /* U+001cca: */
-                                                     0, /* U+001ccb: */
-                                                     0, /* U+001ccc: */
-                                                     0, /* U+001ccd: */
-                                                     0, /* U+001cce: */
-                                                     0, /* U+001ccf: */
-                                                     0, /* U+001cd0: */
-                                                     0, /* U+001cd1: */
-                                                     0, /* U+001cd2: */
-                                                     0, /* U+001cd3: */
-                                                     0, /* U+001cd4: */
-                                                     0, /* U+001cd5: */
-                                                     0, /* U+001cd6: */
-                                                     0, /* U+001cd7: */
-                                                     0, /* U+001cd8: */
-                                                     0, /* U+001cd9: */
-                                                     0, /* U+001cda: */
-                                                     0, /* U+001cdb: */
-                                                     0, /* U+001cdc: */
-                                                     0, /* U+001cdd: */
-                                                     0, /* U+001cde: */
-                                                     0, /* U+001cdf: */
-                                                     0, /* U+001ce0: */
-                                                     0, /* U+001ce1: */
-                                                     0, /* U+001ce2: */
-                                                     0, /* U+001ce3: */
-                                                     0, /* U+001ce4: */
-                                                     0, /* U+001ce5: */
-                                                     0, /* U+001ce6: */
-                                                     0, /* U+001ce7: */
-                                                     0, /* U+001ce8: */
-                                                     0, /* U+001ce9: */
-                                                     0, /* U+001cea: */
-                                                     0, /* U+001ceb: */
-                                                     0, /* U+001cec: */
-                                                     0, /* U+001ced: */
-                                                     0, /* U+001cee: */
-                                                     0, /* U+001cef: */
-                                                     0, /* U+001cf0: */
-                                                     0, /* U+001cf1: */
-                                                     0, /* U+001cf2: */
-                                                     0, /* U+001cf3: */
-                                                     0, /* U+001cf4: */
-                                                     0, /* U+001cf5: */
-                                                     0, /* U+001cf6: */
-                                                     0, /* U+001cf7: */
-                                                     0, /* U+001cf8: */
-                                                     0, /* U+001cf9: */
-                                                     0, /* U+001cfa: */
-                                                     0, /* U+001cfb: */
-                                                     0, /* U+001cfc: */
-                                                     0, /* U+001cfd: */
-                                                     0, /* U+001cfe: */
-                                                     0, /* U+001cff: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d00: LATIN LETTER SMALL CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d01: LATIN LETTER SMALL CAPITAL AE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d02: LATIN SMALL LETTER TURNED AE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d03: LATIN LETTER SMALL CAPITAL BARRED B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d04: LATIN LETTER SMALL CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d05: LATIN LETTER SMALL CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d06: LATIN LETTER SMALL CAPITAL ETH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d07: LATIN LETTER SMALL CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d08: LATIN SMALL LETTER TURNED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d09: LATIN SMALL LETTER TURNED I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0a: LATIN LETTER SMALL CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0b: LATIN LETTER SMALL CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0c: LATIN LETTER SMALL CAPITAL L WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0d: LATIN LETTER SMALL CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0e: LATIN LETTER SMALL CAPITAL REVERSED N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d0f: LATIN LETTER SMALL CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d10: LATIN LETTER SMALL CAPITAL OPEN O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d11: LATIN SMALL LETTER SIDEWAYS O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d12: LATIN SMALL LETTER SIDEWAYS OPEN O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d13: LATIN SMALL LETTER SIDEWAYS O WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d14: LATIN SMALL LETTER TURNED OE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d15: LATIN LETTER SMALL CAPITAL OU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d16: LATIN SMALL LETTER TOP HALF O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d17: LATIN SMALL LETTER BOTTOM HALF O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d18: LATIN LETTER SMALL CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d19: LATIN LETTER SMALL CAPITAL REVERSED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1a: LATIN LETTER SMALL CAPITAL TURNED R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1b: LATIN LETTER SMALL CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1c: LATIN LETTER SMALL CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1d: LATIN SMALL LETTER SIDEWAYS U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1e: LATIN SMALL LETTER SIDEWAYS DIAERESIZED U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d1f: LATIN SMALL LETTER SIDEWAYS TURNED M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d20: LATIN LETTER SMALL CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d21: LATIN LETTER SMALL CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d22: LATIN LETTER SMALL CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d23: LATIN LETTER SMALL CAPITAL EZH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d24: LATIN LETTER VOICED LARYNGEAL SPIRANT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d25: LATIN LETTER AIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d26: GREEK LETTER SMALL CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d27: GREEK LETTER SMALL CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d28: GREEK LETTER SMALL CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d29: GREEK LETTER SMALL CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2a: GREEK LETTER SMALL CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2b: CYRILLIC LETTER SMALL CAPITAL EL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2c: MODIFIER LETTER CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2d: MODIFIER LETTER CAPITAL AE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2e: MODIFIER LETTER CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d2f: MODIFIER LETTER CAPITAL BARRED B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d30: MODIFIER LETTER CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d31: MODIFIER LETTER CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d32: MODIFIER LETTER CAPITAL REVERSED E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d33: MODIFIER LETTER CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d34: MODIFIER LETTER CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d35: MODIFIER LETTER CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d36: MODIFIER LETTER CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d37: MODIFIER LETTER CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d38: MODIFIER LETTER CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d39: MODIFIER LETTER CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3a: MODIFIER LETTER CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3b: MODIFIER LETTER CAPITAL REVERSED N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3c: MODIFIER LETTER CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3d: MODIFIER LETTER CAPITAL OU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3e: MODIFIER LETTER CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d3f: MODIFIER LETTER CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d40: MODIFIER LETTER CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d41: MODIFIER LETTER CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d42: MODIFIER LETTER CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d43: MODIFIER LETTER SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d44: MODIFIER LETTER SMALL TURNED A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d45: MODIFIER LETTER SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d46: MODIFIER LETTER SMALL TURNED AE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d47: MODIFIER LETTER SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d48: MODIFIER LETTER SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d49: MODIFIER LETTER SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4a: MODIFIER LETTER SMALL SCHWA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4b: MODIFIER LETTER SMALL OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4c: MODIFIER LETTER SMALL TURNED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4d: MODIFIER LETTER SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4e: MODIFIER LETTER SMALL TURNED I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d4f: MODIFIER LETTER SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d50: MODIFIER LETTER SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d51: MODIFIER LETTER SMALL ENG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d52: MODIFIER LETTER SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d53: MODIFIER LETTER SMALL OPEN O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d54: MODIFIER LETTER SMALL TOP HALF O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d55: MODIFIER LETTER SMALL BOTTOM HALF O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d56: MODIFIER LETTER SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d57: MODIFIER LETTER SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d58: MODIFIER LETTER SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d59: MODIFIER LETTER SMALL SIDEWAYS U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5a: MODIFIER LETTER SMALL TURNED M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5b: MODIFIER LETTER SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5c: MODIFIER LETTER SMALL AIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5d: MODIFIER LETTER SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5e: MODIFIER LETTER SMALL GREEK GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d5f: MODIFIER LETTER SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d60: MODIFIER LETTER SMALL GREEK PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d61: MODIFIER LETTER SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d62: LATIN SUBSCRIPT SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d63: LATIN SUBSCRIPT SMALL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d64: LATIN SUBSCRIPT SMALL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d65: LATIN SUBSCRIPT SMALL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d66: GREEK SUBSCRIPT SMALL LETTER BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d67: GREEK SUBSCRIPT SMALL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d68: GREEK SUBSCRIPT SMALL LETTER RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d69: GREEK SUBSCRIPT SMALL LETTER PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6a: GREEK SUBSCRIPT SMALL LETTER CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6b: LATIN SMALL LETTER UE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6c: LATIN SMALL LETTER B WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6d: LATIN SMALL LETTER D WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6e: LATIN SMALL LETTER F WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d6f: LATIN SMALL LETTER M WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d70: LATIN SMALL LETTER N WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d71: LATIN SMALL LETTER P WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d72: LATIN SMALL LETTER R WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d73: LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d74: LATIN SMALL LETTER S WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d75: LATIN SMALL LETTER T WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d76: LATIN SMALL LETTER Z WITH MIDDLE TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d77: LATIN SMALL LETTER TURNED G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d78: MODIFIER LETTER CYRILLIC EN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d79: LATIN SMALL LETTER INSULAR G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7a: LATIN SMALL LETTER TH WITH STRIKETHROUGH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7b: LATIN SMALL CAPITAL LETTER I WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7c: LATIN SMALL LETTER IOTA WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7d: LATIN SMALL LETTER P WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7e: LATIN SMALL CAPITAL LETTER U WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d7f: LATIN SMALL LETTER UPSILON WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d80: LATIN SMALL LETTER B WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d81: LATIN SMALL LETTER D WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d82: LATIN SMALL LETTER F WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d83: LATIN SMALL LETTER G WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d84: LATIN SMALL LETTER K WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d85: LATIN SMALL LETTER L WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d86: LATIN SMALL LETTER M WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d87: LATIN SMALL LETTER N WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d88: LATIN SMALL LETTER P WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d89: LATIN SMALL LETTER R WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8a: LATIN SMALL LETTER S WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8b: LATIN SMALL LETTER ESH WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8c: LATIN SMALL LETTER V WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8d: LATIN SMALL LETTER X WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8e: LATIN SMALL LETTER Z WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d8f: LATIN SMALL LETTER A WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d90: LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d91: LATIN SMALL LETTER D WITH HOOK AND TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d92: LATIN SMALL LETTER E WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d93: LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d94: LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d95: LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d96: LATIN SMALL LETTER I WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d97: LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d98: LATIN SMALL LETTER ESH WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d99: LATIN SMALL LETTER U WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9a: LATIN SMALL LETTER EZH WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9b: MODIFIER LETTER SMALL TURNED ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9c: MODIFIER LETTER SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9d: MODIFIER LETTER SMALL C WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9e: MODIFIER LETTER SMALL ETH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001d9f: MODIFIER LETTER SMALL REVERSED OPEN E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da0: MODIFIER LETTER SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da1: MODIFIER LETTER SMALL DOTLESS J WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da2: MODIFIER LETTER SMALL SCRIPT G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da3: MODIFIER LETTER SMALL TURNED H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da4: MODIFIER LETTER SMALL I WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da5: MODIFIER LETTER SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da6: MODIFIER LETTER SMALL CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da7: MODIFIER LETTER SMALL CAPITAL I WITH STROKE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da8: MODIFIER LETTER SMALL J WITH CROSSED-TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001da9: MODIFIER LETTER SMALL L WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001daa: MODIFIER LETTER SMALL L WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dab: MODIFIER LETTER SMALL CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dac: MODIFIER LETTER SMALL M WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dad: MODIFIER LETTER SMALL TURNED M WITH LONG LEG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dae: MODIFIER LETTER SMALL N WITH LEFT HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001daf: MODIFIER LETTER SMALL N WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db0: MODIFIER LETTER SMALL CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db1: MODIFIER LETTER SMALL BARRED O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db2: MODIFIER LETTER SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db3: MODIFIER LETTER SMALL S WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db4: MODIFIER LETTER SMALL ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db5: MODIFIER LETTER SMALL T WITH PALATAL HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db6: MODIFIER LETTER SMALL U BAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db7: MODIFIER LETTER SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db8: MODIFIER LETTER SMALL CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001db9: MODIFIER LETTER SMALL V WITH HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dba: MODIFIER LETTER SMALL TURNED V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbb: MODIFIER LETTER SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbc: MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbd: MODIFIER LETTER SMALL Z WITH CURL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbe: MODIFIER LETTER SMALL EZH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001dbf: MODIFIER LETTER SMALL THETA*/
-                                                     0, /* U+001dc0: COMBINING DOTTED GRAVE ACCENT*/
-                                                     0, /* U+001dc1: COMBINING DOTTED ACUTE ACCENT*/
-                                                     0, /* U+001dc2: COMBINING SNAKE BELOW*/
-                                                     0, /* U+001dc3: COMBINING SUSPENSION MARK*/
-                                                     0, /* U+001dc4: */
-                                                     0, /* U+001dc5: */
-                                                     0, /* U+001dc6: */
-                                                     0, /* U+001dc7: */
-                                                     0, /* U+001dc8: */
-                                                     0, /* U+001dc9: */
-                                                     0, /* U+001dca: */
-                                                     0, /* U+001dcb: */
-                                                     0, /* U+001dcc: */
-                                                     0, /* U+001dcd: */
-                                                     0, /* U+001dce: */
-                                                     0, /* U+001dcf: */
-                                                     0, /* U+001dd0: */
-                                                     0, /* U+001dd1: */
-                                                     0, /* U+001dd2: */
-                                                     0, /* U+001dd3: */
-                                                     0, /* U+001dd4: */
-                                                     0, /* U+001dd5: */
-                                                     0, /* U+001dd6: */
-                                                     0, /* U+001dd7: */
-                                                     0, /* U+001dd8: */
-                                                     0, /* U+001dd9: */
-                                                     0, /* U+001dda: */
-                                                     0, /* U+001ddb: */
-                                                     0, /* U+001ddc: */
-                                                     0, /* U+001ddd: */
-                                                     0, /* U+001dde: */
-                                                     0, /* U+001ddf: */
-                                                     0, /* U+001de0: */
-                                                     0, /* U+001de1: */
-                                                     0, /* U+001de2: */
-                                                     0, /* U+001de3: */
-                                                     0, /* U+001de4: */
-                                                     0, /* U+001de5: */
-                                                     0, /* U+001de6: */
-                                                     0, /* U+001de7: */
-                                                     0, /* U+001de8: */
-                                                     0, /* U+001de9: */
-                                                     0, /* U+001dea: */
-                                                     0, /* U+001deb: */
-                                                     0, /* U+001dec: */
-                                                     0, /* U+001ded: */
-                                                     0, /* U+001dee: */
-                                                     0, /* U+001def: */
-                                                     0, /* U+001df0: */
-                                                     0, /* U+001df1: */
-                                                     0, /* U+001df2: */
-                                                     0, /* U+001df3: */
-                                                     0, /* U+001df4: */
-                                                     0, /* U+001df5: */
-                                                     0, /* U+001df6: */
-                                                     0, /* U+001df7: */
-                                                     0, /* U+001df8: */
-                                                     0, /* U+001df9: */
-                                                     0, /* U+001dfa: */
-                                                     0, /* U+001dfb: */
-                                                     0, /* U+001dfc: */
-                                                     0, /* U+001dfd: */
-                                                     0, /* U+001dfe: */
-                                                     0, /* U+001dff: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
-                                                     0, /* U+001e9c: */
-                                                     0, /* U+001e9d: */
-                                                     0, /* U+001e9e: */
-                                                     0, /* U+001e9f: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
-                                                     0, /* U+001efa: */
-                                                     0, /* U+001efb: */
-                                                     0, /* U+001efc: */
-                                                     0, /* U+001efd: */
-                                                     0, /* U+001efe: */
-                                                     0, /* U+001eff: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
-                                                     0, /* U+001f16: */
-                                                     0, /* U+001f17: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
-                                                     0, /* U+001f1e: */
-                                                     0, /* U+001f1f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
-                                                     0, /* U+001f46: */
-                                                     0, /* U+001f47: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
-                                                     0, /* U+001f4e: */
-                                                     0, /* U+001f4f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-                                                     0, /* U+001f58: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
-                                                     0, /* U+001f5a: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
-                                                     0, /* U+001f5c: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
-                                                     0, /* U+001f5e: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
-                                                     0, /* U+001f7e: */
-                                                     0, /* U+001f7f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-                                           RTUNI_ALPHA, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
-                                                     0, /* U+001fb5: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
-                                           RTUNI_ALPHA, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
-                                                     0, /* U+001fbd: GREEK KORONIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fbe: GREEK PROSGEGRAMMENI*/
-                                                     0, /* U+001fbf: GREEK PSILI*/
-                                                     0, /* U+001fc0: GREEK PERISPOMENI*/
-                                                     0, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
-                                                     0, /* U+001fc5: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
-                                           RTUNI_ALPHA, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
-                                                     0, /* U+001fcd: GREEK PSILI AND VARIA*/
-                                                     0, /* U+001fce: GREEK PSILI AND OXIA*/
-                                                     0, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
-                                                     0, /* U+001fd4: */
-                                                     0, /* U+001fd5: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
-                                                     0, /* U+001fdc: */
-                                                     0, /* U+001fdd: GREEK DASIA AND VARIA*/
-                                                     0, /* U+001fde: GREEK DASIA AND OXIA*/
-                                                     0, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
-                                                     0, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
-                                                     0, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
-                                                     0, /* U+001fef: GREEK VARIA*/
-                                                     0, /* U+001ff0: */
-                                                     0, /* U+001ff1: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
-                                                     0, /* U+001ff5: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
-                                           RTUNI_ALPHA, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
-                                                     0, /* U+001ffd: GREEK OXIA*/
-                                                     0, /* U+001ffe: GREEK DASIA*/
-                                                     0, /* U+001fff: */
-                                          RTUNI_WSPACE, /* U+002000: EN QUAD*/
-                                          RTUNI_WSPACE, /* U+002001: EM QUAD*/
-                                          RTUNI_WSPACE, /* U+002002: EN SPACE*/
-                                          RTUNI_WSPACE, /* U+002003: EM SPACE*/
-                                          RTUNI_WSPACE, /* U+002004: THREE-PER-EM SPACE*/
-                                          RTUNI_WSPACE, /* U+002005: FOUR-PER-EM SPACE*/
-                                          RTUNI_WSPACE, /* U+002006: SIX-PER-EM SPACE*/
-                                          RTUNI_WSPACE, /* U+002007: FIGURE SPACE*/
-                                          RTUNI_WSPACE, /* U+002008: PUNCTUATION SPACE*/
-                                          RTUNI_WSPACE, /* U+002009: THIN SPACE*/
-                                          RTUNI_WSPACE, /* U+00200a: HAIR SPACE*/
-                                                     0, /* U+00200b: ZERO WIDTH SPACE*/
-                                                     0, /* U+00200c: ZERO WIDTH NON-JOINER*/
-                                                     0, /* U+00200d: ZERO WIDTH JOINER*/
-                                                     0, /* U+00200e: LEFT-TO-RIGHT MARK*/
-                                                     0, /* U+00200f: RIGHT-TO-LEFT MARK*/
-                                                     0, /* U+002010: HYPHEN*/
-                                                     0, /* U+002011: NON-BREAKING HYPHEN*/
-                                                     0, /* U+002012: FIGURE DASH*/
-                                                     0, /* U+002013: EN DASH*/
-                                                     0, /* U+002014: EM DASH*/
-                                                     0, /* U+002015: HORIZONTAL BAR*/
-                                                     0, /* U+002016: DOUBLE VERTICAL LINE*/
-                                                     0, /* U+002017: DOUBLE LOW LINE*/
-                                                     0, /* U+002018: LEFT SINGLE QUOTATION MARK*/
-                                                     0, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
-                                                     0, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
-                                                     0, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
-                                                     0, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
-                                                     0, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
-                                                     0, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
-                                                     0, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
-                                                     0, /* U+002020: DAGGER*/
-                                                     0, /* U+002021: DOUBLE DAGGER*/
-                                                     0, /* U+002022: BULLET*/
-                                                     0, /* U+002023: TRIANGULAR BULLET*/
-                                                     0, /* U+002024: ONE DOT LEADER*/
-                                                     0, /* U+002025: TWO DOT LEADER*/
-                                                     0, /* U+002026: HORIZONTAL ELLIPSIS*/
-                                                     0, /* U+002027: HYPHENATION POINT*/
-                                          RTUNI_WSPACE, /* U+002028: LINE SEPARATOR*/
-                                          RTUNI_WSPACE, /* U+002029: PARAGRAPH SEPARATOR*/
-                                                     0, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
-                                                     0, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
-                                                     0, /* U+00202c: POP DIRECTIONAL FORMATTING*/
-                                                     0, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
-                                                     0, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
-                                          RTUNI_WSPACE, /* U+00202f: NARROW NO-BREAK SPACE*/
-                                                     0, /* U+002030: PER MILLE SIGN*/
-                                                     0, /* U+002031: PER TEN THOUSAND SIGN*/
-                                                     0, /* U+002032: PRIME*/
-                                                     0, /* U+002033: DOUBLE PRIME*/
-                                                     0, /* U+002034: TRIPLE PRIME*/
-                                                     0, /* U+002035: REVERSED PRIME*/
-                                                     0, /* U+002036: REVERSED DOUBLE PRIME*/
-                                                     0, /* U+002037: REVERSED TRIPLE PRIME*/
-                                                     0, /* U+002038: CARET*/
-                                                     0, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
-                                                     0, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
-                                                     0, /* U+00203b: REFERENCE MARK*/
-                                                     0, /* U+00203c: DOUBLE EXCLAMATION MARK*/
-                                                     0, /* U+00203d: INTERROBANG*/
-                                                     0, /* U+00203e: OVERLINE*/
-                                                     0, /* U+00203f: UNDERTIE*/
-                                                     0, /* U+002040: CHARACTER TIE*/
-                                                     0, /* U+002041: CARET INSERTION POINT*/
-                                                     0, /* U+002042: ASTERISM*/
-                                                     0, /* U+002043: HYPHEN BULLET*/
-                                                     0, /* U+002044: FRACTION SLASH*/
-                                                     0, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
-                                                     0, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
-                                                     0, /* U+002047: DOUBLE QUESTION MARK*/
-                                                     0, /* U+002048: QUESTION EXCLAMATION MARK*/
-                                                     0, /* U+002049: EXCLAMATION QUESTION MARK*/
-                                                     0, /* U+00204a: TIRONIAN SIGN ET*/
-                                                     0, /* U+00204b: REVERSED PILCROW SIGN*/
-                                                     0, /* U+00204c: BLACK LEFTWARDS BULLET*/
-                                                     0, /* U+00204d: BLACK RIGHTWARDS BULLET*/
-                                                     0, /* U+00204e: LOW ASTERISK*/
-                                                     0, /* U+00204f: REVERSED SEMICOLON*/
-                                                     0, /* U+002050: CLOSE UP*/
-                                                     0, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
-                                                     0, /* U+002052: COMMERCIAL MINUS SIGN*/
-                                                     0, /* U+002053: SWUNG DASH*/
-                                                     0, /* U+002054: INVERTED UNDERTIE*/
-                                                     0, /* U+002055: FLOWER PUNCTUATION MARK*/
-                                                     0, /* U+002056: THREE DOT PUNCTUATION*/
-                                                     0, /* U+002057: QUADRUPLE PRIME*/
-                                                     0, /* U+002058: FOUR DOT PUNCTUATION*/
-                                                     0, /* U+002059: FIVE DOT PUNCTUATION*/
-                                                     0, /* U+00205a: TWO DOT PUNCTUATION*/
-                                                     0, /* U+00205b: FOUR DOT MARK*/
-                                                     0, /* U+00205c: DOTTED CROSS*/
-                                                     0, /* U+00205d: TRICOLON*/
-                                                     0, /* U+00205e: VERTICAL FOUR DOTS*/
-                                          RTUNI_WSPACE, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
-                                                     0, /* U+002060: WORD JOINER*/
-                                                     0, /* U+002061: FUNCTION APPLICATION*/
-                                                     0, /* U+002062: INVISIBLE TIMES*/
-                                                     0, /* U+002063: INVISIBLE SEPARATOR*/
-                                                     0, /* U+002064: */
-                                                     0, /* U+002065: */
-                                                     0, /* U+002066: */
-                                                     0, /* U+002067: */
-                                                     0, /* U+002068: */
-                                                     0, /* U+002069: */
-                                                     0, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
-                                                     0, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
-                                                     0, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
-                                                     0, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
-                                                     0, /* U+00206e: NATIONAL DIGIT SHAPES*/
-                                                     0, /* U+00206f: NOMINAL DIGIT SHAPES*/
-                                                     0, /* U+002070: SUPERSCRIPT ZERO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
-                                                     0, /* U+002072: */
-                                                     0, /* U+002073: */
-                                                     0, /* U+002074: SUPERSCRIPT FOUR*/
-                                                     0, /* U+002075: SUPERSCRIPT FIVE*/
-                                                     0, /* U+002076: SUPERSCRIPT SIX*/
-                                                     0, /* U+002077: SUPERSCRIPT SEVEN*/
-                                                     0, /* U+002078: SUPERSCRIPT EIGHT*/
-                                                     0, /* U+002079: SUPERSCRIPT NINE*/
-                                                     0, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
-                                                     0, /* U+00207b: SUPERSCRIPT MINUS*/
-                                                     0, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
-                                                     0, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
-                                                     0, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
-                                                     0, /* U+002080: SUBSCRIPT ZERO*/
-                                                     0, /* U+002081: SUBSCRIPT ONE*/
-                                                     0, /* U+002082: SUBSCRIPT TWO*/
-                                                     0, /* U+002083: SUBSCRIPT THREE*/
-                                                     0, /* U+002084: SUBSCRIPT FOUR*/
-                                                     0, /* U+002085: SUBSCRIPT FIVE*/
-                                                     0, /* U+002086: SUBSCRIPT SIX*/
-                                                     0, /* U+002087: SUBSCRIPT SEVEN*/
-                                                     0, /* U+002088: SUBSCRIPT EIGHT*/
-                                                     0, /* U+002089: SUBSCRIPT NINE*/
-                                                     0, /* U+00208a: SUBSCRIPT PLUS SIGN*/
-                                                     0, /* U+00208b: SUBSCRIPT MINUS*/
-                                                     0, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
-                                                     0, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
-                                                     0, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
-                                                     0, /* U+00208f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
-                                                     0, /* U+002095: */
-                                                     0, /* U+002096: */
-                                                     0, /* U+002097: */
-                                                     0, /* U+002098: */
-                                                     0, /* U+002099: */
-                                                     0, /* U+00209a: */
-                                                     0, /* U+00209b: */
-                                                     0, /* U+00209c: */
-                                                     0, /* U+00209d: */
-                                                     0, /* U+00209e: */
-                                                     0, /* U+00209f: */
-                                                     0, /* U+0020a0: EURO-CURRENCY SIGN*/
-                                                     0, /* U+0020a1: COLON SIGN*/
-                                                     0, /* U+0020a2: CRUZEIRO SIGN*/
-                                                     0, /* U+0020a3: FRENCH FRANC SIGN*/
-                                                     0, /* U+0020a4: LIRA SIGN*/
-                                                     0, /* U+0020a5: MILL SIGN*/
-                                                     0, /* U+0020a6: NAIRA SIGN*/
-                                                     0, /* U+0020a7: PESETA SIGN*/
-                                                     0, /* U+0020a8: RUPEE SIGN*/
-                                                     0, /* U+0020a9: WON SIGN*/
-                                                     0, /* U+0020aa: NEW SHEQEL SIGN*/
-                                                     0, /* U+0020ab: DONG SIGN*/
-                                                     0, /* U+0020ac: EURO SIGN*/
-                                                     0, /* U+0020ad: KIP SIGN*/
-                                                     0, /* U+0020ae: TUGRIK SIGN*/
-                                                     0, /* U+0020af: DRACHMA SIGN*/
-                                                     0, /* U+0020b0: GERMAN PENNY SIGN*/
-                                                     0, /* U+0020b1: PESO SIGN*/
-                                                     0, /* U+0020b2: GUARANI SIGN*/
-                                                     0, /* U+0020b3: AUSTRAL SIGN*/
-                                                     0, /* U+0020b4: HRYVNIA SIGN*/
-                                                     0, /* U+0020b5: CEDI SIGN*/
-                                                     0, /* U+0020b6: */
-                                                     0, /* U+0020b7: */
-                                                     0, /* U+0020b8: */
-                                                     0, /* U+0020b9: */
-                                                     0, /* U+0020ba: */
-                                                     0, /* U+0020bb: */
-                                                     0, /* U+0020bc: */
-                                                     0, /* U+0020bd: */
-                                                     0, /* U+0020be: */
-                                                     0, /* U+0020bf: */
-                                                     0, /* U+0020c0: */
-                                                     0, /* U+0020c1: */
-                                                     0, /* U+0020c2: */
-                                                     0, /* U+0020c3: */
-                                                     0, /* U+0020c4: */
-                                                     0, /* U+0020c5: */
-                                                     0, /* U+0020c6: */
-                                                     0, /* U+0020c7: */
-                                                     0, /* U+0020c8: */
-                                                     0, /* U+0020c9: */
-                                                     0, /* U+0020ca: */
-                                                     0, /* U+0020cb: */
-                                                     0, /* U+0020cc: */
-                                                     0, /* U+0020cd: */
-                                                     0, /* U+0020ce: */
-                                                     0, /* U+0020cf: */
-                                                     0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
-                                                     0, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
-                                                     0, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
-                                                     0, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
-                                                     0, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
-                                                     0, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
-                                                     0, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
-                                                     0, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
-                                                     0, /* U+0020d8: COMBINING RING OVERLAY*/
-                                                     0, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
-                                                     0, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
-                                                     0, /* U+0020db: COMBINING THREE DOTS ABOVE*/
-                                                     0, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
-                                                     0, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
-                                                     0, /* U+0020de: COMBINING ENCLOSING SQUARE*/
-                                                     0, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
-                                                     0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
-                                                     0, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
-                                                     0, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
-                                                     0, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
-                                                     0, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
-                                                     0, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
-                                                     0, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
-                                                     0, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
-                                                     0, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
-                                                     0, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
-                                                     0, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
-                                                     0, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
-                                                     0, /* U+0020ec: */
-                                                     0, /* U+0020ed: */
-                                                     0, /* U+0020ee: */
-                                                     0, /* U+0020ef: */
-                                                     0, /* U+0020f0: */
-                                                     0, /* U+0020f1: */
-                                                     0, /* U+0020f2: */
-                                                     0, /* U+0020f3: */
-                                                     0, /* U+0020f4: */
-                                                     0, /* U+0020f5: */
-                                                     0, /* U+0020f6: */
-                                                     0, /* U+0020f7: */
-                                                     0, /* U+0020f8: */
-                                                     0, /* U+0020f9: */
-                                                     0, /* U+0020fa: */
-                                                     0, /* U+0020fb: */
-                                                     0, /* U+0020fc: */
-                                                     0, /* U+0020fd: */
-                                                     0, /* U+0020fe: */
-                                                     0, /* U+0020ff: */
-                                                     0, /* U+002100: ACCOUNT OF*/
-                                                     0, /* U+002101: ADDRESSED TO THE SUBJECT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
-                                                     0, /* U+002103: DEGREE CELSIUS*/
-                                                     0, /* U+002104: CENTRE LINE SYMBOL*/
-                                                     0, /* U+002105: CARE OF*/
-                                                     0, /* U+002106: CADA UNA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002107: EULER CONSTANT*/
-                                                     0, /* U+002108: SCRUPLE*/
-                                                     0, /* U+002109: DEGREE FAHRENHEIT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210a: SCRIPT SMALL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210b: SCRIPT CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210c: BLACK-LETTER CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210e: PLANCK CONSTANT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002110: SCRIPT CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002111: BLACK-LETTER CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002112: SCRIPT CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002113: SCRIPT SMALL L*/
-                                                     0, /* U+002114: L B BAR SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
-                                                     0, /* U+002116: NUMERO SIGN*/
-                                                     0, /* U+002117: SOUND RECORDING COPYRIGHT*/
-                                                     0, /* U+002118: SCRIPT CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211b: SCRIPT CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211c: BLACK-LETTER CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
-                                                     0, /* U+00211e: PRESCRIPTION TAKE*/
-                                                     0, /* U+00211f: RESPONSE*/
-                                                     0, /* U+002120: SERVICE MARK*/
-                                                     0, /* U+002121: TELEPHONE SIGN*/
-                                                     0, /* U+002122: TRADE MARK SIGN*/
-                                                     0, /* U+002123: VERSICLE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
-                                                     0, /* U+002125: OUNCE SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002126: OHM SIGN*/
-                                                     0, /* U+002127: INVERTED OHM SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002128: BLACK-LETTER CAPITAL Z*/
-                                                     0, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212a: KELVIN SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212b: ANGSTROM SIGN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212c: SCRIPT CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00212d: BLACK-LETTER CAPITAL C*/
-                                                     0, /* U+00212e: ESTIMATED SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00212f: SCRIPT SMALL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002130: SCRIPT CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002131: SCRIPT CAPITAL F*/
-                                                     0, /* U+002132: TURNED CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002133: SCRIPT CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002134: SCRIPT SMALL O*/
-                                           RTUNI_ALPHA, /* U+002135: ALEF SYMBOL*/
-                                           RTUNI_ALPHA, /* U+002136: BET SYMBOL*/
-                                           RTUNI_ALPHA, /* U+002137: GIMEL SYMBOL*/
-                                           RTUNI_ALPHA, /* U+002138: DALET SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002139: INFORMATION SOURCE*/
-                                                     0, /* U+00213a: ROTATED CAPITAL Q*/
-                                                     0, /* U+00213b: FACSIMILE SIGN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
-                                                     0, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
-                                                     0, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
-                                                     0, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
-                                                     0, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
-                                                     0, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
-                                                     0, /* U+00214a: PROPERTY LINE*/
-                                                     0, /* U+00214b: TURNED AMPERSAND*/
-                                                     0, /* U+00214c: PER SIGN*/
-                                                     0, /* U+00214d: */
-                                                     0, /* U+00214e: */
-                                                     0, /* U+00214f: */
-                                                     0, /* U+002150: */
-                                                     0, /* U+002151: */
-                                                     0, /* U+002152: */
-                                                     0, /* U+002153: VULGAR FRACTION ONE THIRD*/
-                                                     0, /* U+002154: VULGAR FRACTION TWO THIRDS*/
-                                                     0, /* U+002155: VULGAR FRACTION ONE FIFTH*/
-                                                     0, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
-                                                     0, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
-                                                     0, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
-                                                     0, /* U+002159: VULGAR FRACTION ONE SIXTH*/
-                                                     0, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
-                                                     0, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
-                                                     0, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
-                                                     0, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
-                                                     0, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
-                                                     0, /* U+00215f: FRACTION NUMERATOR ONE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002160: ROMAN NUMERAL ONE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002161: ROMAN NUMERAL TWO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002162: ROMAN NUMERAL THREE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002163: ROMAN NUMERAL FOUR*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002164: ROMAN NUMERAL FIVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002165: ROMAN NUMERAL SIX*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002166: ROMAN NUMERAL SEVEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002167: ROMAN NUMERAL EIGHT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002168: ROMAN NUMERAL NINE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002169: ROMAN NUMERAL TEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216a: ROMAN NUMERAL ELEVEN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216b: ROMAN NUMERAL TWELVE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216c: ROMAN NUMERAL FIFTY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002170: SMALL ROMAN NUMERAL ONE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002171: SMALL ROMAN NUMERAL TWO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002172: SMALL ROMAN NUMERAL THREE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002175: SMALL ROMAN NUMERAL SIX*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002178: SMALL ROMAN NUMERAL NINE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002179: SMALL ROMAN NUMERAL TEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
-                                           RTUNI_ALPHA, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
-                                           RTUNI_ALPHA, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
-                                           RTUNI_ALPHA, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
-                                           RTUNI_ALPHA, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
-                                                     0, /* U+002184: */
-                                                     0, /* U+002185: */
-                                                     0, /* U+002186: */
-                                                     0, /* U+002187: */
-                                                     0, /* U+002188: */
-                                                     0, /* U+002189: */
-                                                     0, /* U+00218a: */
-                                                     0, /* U+00218b: */
-                                                     0, /* U+00218c: */
-                                                     0, /* U+00218d: */
-                                                     0, /* U+00218e: */
-                                                     0, /* U+00218f: */
-                                                     0, /* U+002190: LEFTWARDS ARROW*/
-                                                     0, /* U+002191: UPWARDS ARROW*/
-                                                     0, /* U+002192: RIGHTWARDS ARROW*/
-                                                     0, /* U+002193: DOWNWARDS ARROW*/
-                                                     0, /* U+002194: LEFT RIGHT ARROW*/
-                                                     0, /* U+002195: UP DOWN ARROW*/
-                                                     0, /* U+002196: NORTH WEST ARROW*/
-                                                     0, /* U+002197: NORTH EAST ARROW*/
-                                                     0, /* U+002198: SOUTH EAST ARROW*/
-                                                     0, /* U+002199: SOUTH WEST ARROW*/
-                                                     0, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
-                                                     0, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
-                                                     0, /* U+00219c: LEFTWARDS WAVE ARROW*/
-                                                     0, /* U+00219d: RIGHTWARDS WAVE ARROW*/
-                                                     0, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
-                                                     0, /* U+00219f: UPWARDS TWO HEADED ARROW*/
-                                                     0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
-                                                     0, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
-                                                     0, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
-                                                     0, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
-                                                     0, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
-                                                     0, /* U+0021a5: UPWARDS ARROW FROM BAR*/
-                                                     0, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
-                                                     0, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
-                                                     0, /* U+0021a8: UP DOWN ARROW WITH BASE*/
-                                                     0, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
-                                                     0, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
-                                                     0, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
-                                                     0, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
-                                                     0, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
-                                                     0, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
-                                                     0, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
-                                                     0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
-                                                     0, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
-                                                     0, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
-                                                     0, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
-                                                     0, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
-                                                     0, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
-                                                     0, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
-                                                     0, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
-                                                     0, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
-                                                     0, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
-                                                     0, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
-                                                     0, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
-                                                     0, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
-                                                     0, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
-                                                     0, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
-                                                     0, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
-                                                     0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
-                                                     0, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
-                                                     0, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
-                                                     0, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
-                                                     0, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
-                                                     0, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
-                                                     0, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
-                                                     0, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
-                                                     0, /* U+0021c8: UPWARDS PAIRED ARROWS*/
-                                                     0, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
-                                                     0, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
-                                                     0, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
-                                                     0, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
-                                                     0, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
-                                                     0, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
-                                                     0, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
-                                                     0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
-                                                     0, /* U+0021d1: UPWARDS DOUBLE ARROW*/
-                                                     0, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
-                                                     0, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
-                                                     0, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
-                                                     0, /* U+0021d5: UP DOWN DOUBLE ARROW*/
-                                                     0, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
-                                                     0, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
-                                                     0, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
-                                                     0, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
-                                                     0, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
-                                                     0, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
-                                                     0, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
-                                                     0, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
-                                                     0, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
-                                                     0, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
-                                                     0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
-                                                     0, /* U+0021e1: UPWARDS DASHED ARROW*/
-                                                     0, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
-                                                     0, /* U+0021e3: DOWNWARDS DASHED ARROW*/
-                                                     0, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
-                                                     0, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
-                                                     0, /* U+0021e6: LEFTWARDS WHITE ARROW*/
-                                                     0, /* U+0021e7: UPWARDS WHITE ARROW*/
-                                                     0, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
-                                                     0, /* U+0021e9: DOWNWARDS WHITE ARROW*/
-                                                     0, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
-                                                     0, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
-                                                     0, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
-                                                     0, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
-                                                     0, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
-                                                     0, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
-                                                     0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
-                                                     0, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
-                                                     0, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
-                                                     0, /* U+0021f3: UP DOWN WHITE ARROW*/
-                                                     0, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
-                                                     0, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
-                                                     0, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
-                                                     0, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
-                                                     0, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
-                                                     0, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
-                                                     0, /* U+002200: FOR ALL*/
-                                                     0, /* U+002201: COMPLEMENT*/
-                                                     0, /* U+002202: PARTIAL DIFFERENTIAL*/
-                                                     0, /* U+002203: THERE EXISTS*/
-                                                     0, /* U+002204: THERE DOES NOT EXIST*/
-                                                     0, /* U+002205: EMPTY SET*/
-                                                     0, /* U+002206: INCREMENT*/
-                                                     0, /* U+002207: NABLA*/
-                                                     0, /* U+002208: ELEMENT OF*/
-                                                     0, /* U+002209: NOT AN ELEMENT OF*/
-                                                     0, /* U+00220a: SMALL ELEMENT OF*/
-                                                     0, /* U+00220b: CONTAINS AS MEMBER*/
-                                                     0, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
-                                                     0, /* U+00220d: SMALL CONTAINS AS MEMBER*/
-                                                     0, /* U+00220e: END OF PROOF*/
-                                                     0, /* U+00220f: N-ARY PRODUCT*/
-                                                     0, /* U+002210: N-ARY COPRODUCT*/
-                                                     0, /* U+002211: N-ARY SUMMATION*/
-                                                     0, /* U+002212: MINUS SIGN*/
-                                                     0, /* U+002213: MINUS-OR-PLUS SIGN*/
-                                                     0, /* U+002214: DOT PLUS*/
-                                                     0, /* U+002215: DIVISION SLASH*/
-                                                     0, /* U+002216: SET MINUS*/
-                                                     0, /* U+002217: ASTERISK OPERATOR*/
-                                                     0, /* U+002218: RING OPERATOR*/
-                                                     0, /* U+002219: BULLET OPERATOR*/
-                                                     0, /* U+00221a: SQUARE ROOT*/
-                                                     0, /* U+00221b: CUBE ROOT*/
-                                                     0, /* U+00221c: FOURTH ROOT*/
-                                                     0, /* U+00221d: PROPORTIONAL TO*/
-                                                     0, /* U+00221e: INFINITY*/
-                                                     0, /* U+00221f: RIGHT ANGLE*/
-                                                     0, /* U+002220: ANGLE*/
-                                                     0, /* U+002221: MEASURED ANGLE*/
-                                                     0, /* U+002222: SPHERICAL ANGLE*/
-                                                     0, /* U+002223: DIVIDES*/
-                                                     0, /* U+002224: DOES NOT DIVIDE*/
-                                                     0, /* U+002225: PARALLEL TO*/
-                                                     0, /* U+002226: NOT PARALLEL TO*/
-                                                     0, /* U+002227: LOGICAL AND*/
-                                                     0, /* U+002228: LOGICAL OR*/
-                                                     0, /* U+002229: INTERSECTION*/
-                                                     0, /* U+00222a: UNION*/
-                                                     0, /* U+00222b: INTEGRAL*/
-                                                     0, /* U+00222c: DOUBLE INTEGRAL*/
-                                                     0, /* U+00222d: TRIPLE INTEGRAL*/
-                                                     0, /* U+00222e: CONTOUR INTEGRAL*/
-                                                     0, /* U+00222f: SURFACE INTEGRAL*/
-                                                     0, /* U+002230: VOLUME INTEGRAL*/
-                                                     0, /* U+002231: CLOCKWISE INTEGRAL*/
-                                                     0, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
-                                                     0, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
-                                                     0, /* U+002234: THEREFORE*/
-                                                     0, /* U+002235: BECAUSE*/
-                                                     0, /* U+002236: RATIO*/
-                                                     0, /* U+002237: PROPORTION*/
-                                                     0, /* U+002238: DOT MINUS*/
-                                                     0, /* U+002239: EXCESS*/
-                                                     0, /* U+00223a: GEOMETRIC PROPORTION*/
-                                                     0, /* U+00223b: HOMOTHETIC*/
-                                                     0, /* U+00223c: TILDE OPERATOR*/
-                                                     0, /* U+00223d: REVERSED TILDE*/
-                                                     0, /* U+00223e: INVERTED LAZY S*/
-                                                     0, /* U+00223f: SINE WAVE*/
-                                                     0, /* U+002240: WREATH PRODUCT*/
-                                                     0, /* U+002241: NOT TILDE*/
-                                                     0, /* U+002242: MINUS TILDE*/
-                                                     0, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
-                                                     0, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
-                                                     0, /* U+002245: APPROXIMATELY EQUAL TO*/
-                                                     0, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
-                                                     0, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
-                                                     0, /* U+002248: ALMOST EQUAL TO*/
-                                                     0, /* U+002249: NOT ALMOST EQUAL TO*/
-                                                     0, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
-                                                     0, /* U+00224b: TRIPLE TILDE*/
-                                                     0, /* U+00224c: ALL EQUAL TO*/
-                                                     0, /* U+00224d: EQUIVALENT TO*/
-                                                     0, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
-                                                     0, /* U+00224f: DIFFERENCE BETWEEN*/
-                                                     0, /* U+002250: APPROACHES THE LIMIT*/
-                                                     0, /* U+002251: GEOMETRICALLY EQUAL TO*/
-                                                     0, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
-                                                     0, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
-                                                     0, /* U+002254: COLON EQUALS*/
-                                                     0, /* U+002255: EQUALS COLON*/
-                                                     0, /* U+002256: RING IN EQUAL TO*/
-                                                     0, /* U+002257: RING EQUAL TO*/
-                                                     0, /* U+002258: CORRESPONDS TO*/
-                                                     0, /* U+002259: ESTIMATES*/
-                                                     0, /* U+00225a: EQUIANGULAR TO*/
-                                                     0, /* U+00225b: STAR EQUALS*/
-                                                     0, /* U+00225c: DELTA EQUAL TO*/
-                                                     0, /* U+00225d: EQUAL TO BY DEFINITION*/
-                                                     0, /* U+00225e: MEASURED BY*/
-                                                     0, /* U+00225f: QUESTIONED EQUAL TO*/
-                                                     0, /* U+002260: NOT EQUAL TO*/
-                                                     0, /* U+002261: IDENTICAL TO*/
-                                                     0, /* U+002262: NOT IDENTICAL TO*/
-                                                     0, /* U+002263: STRICTLY EQUIVALENT TO*/
-                                                     0, /* U+002264: LESS-THAN OR EQUAL TO*/
-                                                     0, /* U+002265: GREATER-THAN OR EQUAL TO*/
-                                                     0, /* U+002266: LESS-THAN OVER EQUAL TO*/
-                                                     0, /* U+002267: GREATER-THAN OVER EQUAL TO*/
-                                                     0, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
-                                                     0, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
-                                                     0, /* U+00226a: MUCH LESS-THAN*/
-                                                     0, /* U+00226b: MUCH GREATER-THAN*/
-                                                     0, /* U+00226c: BETWEEN*/
-                                                     0, /* U+00226d: NOT EQUIVALENT TO*/
-                                                     0, /* U+00226e: NOT LESS-THAN*/
-                                                     0, /* U+00226f: NOT GREATER-THAN*/
-                                                     0, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
-                                                     0, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
-                                                     0, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
-                                                     0, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
-                                                     0, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
-                                                     0, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
-                                                     0, /* U+002276: LESS-THAN OR GREATER-THAN*/
-                                                     0, /* U+002277: GREATER-THAN OR LESS-THAN*/
-                                                     0, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
-                                                     0, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
-                                                     0, /* U+00227a: PRECEDES*/
-                                                     0, /* U+00227b: SUCCEEDS*/
-                                                     0, /* U+00227c: PRECEDES OR EQUAL TO*/
-                                                     0, /* U+00227d: SUCCEEDS OR EQUAL TO*/
-                                                     0, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
-                                                     0, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
-                                                     0, /* U+002280: DOES NOT PRECEDE*/
-                                                     0, /* U+002281: DOES NOT SUCCEED*/
-                                                     0, /* U+002282: SUBSET OF*/
-                                                     0, /* U+002283: SUPERSET OF*/
-                                                     0, /* U+002284: NOT A SUBSET OF*/
-                                                     0, /* U+002285: NOT A SUPERSET OF*/
-                                                     0, /* U+002286: SUBSET OF OR EQUAL TO*/
-                                                     0, /* U+002287: SUPERSET OF OR EQUAL TO*/
-                                                     0, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
-                                                     0, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
-                                                     0, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
-                                                     0, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
-                                                     0, /* U+00228c: MULTISET*/
-                                                     0, /* U+00228d: MULTISET MULTIPLICATION*/
-                                                     0, /* U+00228e: MULTISET UNION*/
-                                                     0, /* U+00228f: SQUARE IMAGE OF*/
-                                                     0, /* U+002290: SQUARE ORIGINAL OF*/
-                                                     0, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
-                                                     0, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
-                                                     0, /* U+002293: SQUARE CAP*/
-                                                     0, /* U+002294: SQUARE CUP*/
-                                                     0, /* U+002295: CIRCLED PLUS*/
-                                                     0, /* U+002296: CIRCLED MINUS*/
-                                                     0, /* U+002297: CIRCLED TIMES*/
-                                                     0, /* U+002298: CIRCLED DIVISION SLASH*/
-                                                     0, /* U+002299: CIRCLED DOT OPERATOR*/
-                                                     0, /* U+00229a: CIRCLED RING OPERATOR*/
-                                                     0, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
-                                                     0, /* U+00229c: CIRCLED EQUALS*/
-                                                     0, /* U+00229d: CIRCLED DASH*/
-                                                     0, /* U+00229e: SQUARED PLUS*/
-                                                     0, /* U+00229f: SQUARED MINUS*/
-                                                     0, /* U+0022a0: SQUARED TIMES*/
-                                                     0, /* U+0022a1: SQUARED DOT OPERATOR*/
-                                                     0, /* U+0022a2: RIGHT TACK*/
-                                                     0, /* U+0022a3: LEFT TACK*/
-                                                     0, /* U+0022a4: DOWN TACK*/
-                                                     0, /* U+0022a5: UP TACK*/
-                                                     0, /* U+0022a6: ASSERTION*/
-                                                     0, /* U+0022a7: MODELS*/
-                                                     0, /* U+0022a8: TRUE*/
-                                                     0, /* U+0022a9: FORCES*/
-                                                     0, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
-                                                     0, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-                                                     0, /* U+0022ac: DOES NOT PROVE*/
-                                                     0, /* U+0022ad: NOT TRUE*/
-                                                     0, /* U+0022ae: DOES NOT FORCE*/
-                                                     0, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-                                                     0, /* U+0022b0: PRECEDES UNDER RELATION*/
-                                                     0, /* U+0022b1: SUCCEEDS UNDER RELATION*/
-                                                     0, /* U+0022b2: NORMAL SUBGROUP OF*/
-                                                     0, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
-                                                     0, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
-                                                     0, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
-                                                     0, /* U+0022b6: ORIGINAL OF*/
-                                                     0, /* U+0022b7: IMAGE OF*/
-                                                     0, /* U+0022b8: MULTIMAP*/
-                                                     0, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
-                                                     0, /* U+0022ba: INTERCALATE*/
-                                                     0, /* U+0022bb: XOR*/
-                                                     0, /* U+0022bc: NAND*/
-                                                     0, /* U+0022bd: NOR*/
-                                                     0, /* U+0022be: RIGHT ANGLE WITH ARC*/
-                                                     0, /* U+0022bf: RIGHT TRIANGLE*/
-                                                     0, /* U+0022c0: N-ARY LOGICAL AND*/
-                                                     0, /* U+0022c1: N-ARY LOGICAL OR*/
-                                                     0, /* U+0022c2: N-ARY INTERSECTION*/
-                                                     0, /* U+0022c3: N-ARY UNION*/
-                                                     0, /* U+0022c4: DIAMOND OPERATOR*/
-                                                     0, /* U+0022c5: DOT OPERATOR*/
-                                                     0, /* U+0022c6: STAR OPERATOR*/
-                                                     0, /* U+0022c7: DIVISION TIMES*/
-                                                     0, /* U+0022c8: BOWTIE*/
-                                                     0, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-                                                     0, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-                                                     0, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
-                                                     0, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
-                                                     0, /* U+0022cd: REVERSED TILDE EQUALS*/
-                                                     0, /* U+0022ce: CURLY LOGICAL OR*/
-                                                     0, /* U+0022cf: CURLY LOGICAL AND*/
-                                                     0, /* U+0022d0: DOUBLE SUBSET*/
-                                                     0, /* U+0022d1: DOUBLE SUPERSET*/
-                                                     0, /* U+0022d2: DOUBLE INTERSECTION*/
-                                                     0, /* U+0022d3: DOUBLE UNION*/
-                                                     0, /* U+0022d4: PITCHFORK*/
-                                                     0, /* U+0022d5: EQUAL AND PARALLEL TO*/
-                                                     0, /* U+0022d6: LESS-THAN WITH DOT*/
-                                                     0, /* U+0022d7: GREATER-THAN WITH DOT*/
-                                                     0, /* U+0022d8: VERY MUCH LESS-THAN*/
-                                                     0, /* U+0022d9: VERY MUCH GREATER-THAN*/
-                                                     0, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
-                                                     0, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
-                                                     0, /* U+0022dc: EQUAL TO OR LESS-THAN*/
-                                                     0, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
-                                                     0, /* U+0022de: EQUAL TO OR PRECEDES*/
-                                                     0, /* U+0022df: EQUAL TO OR SUCCEEDS*/
-                                                     0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
-                                                     0, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
-                                                     0, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
-                                                     0, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
-                                                     0, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
-                                                     0, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
-                                                     0, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
-                                                     0, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
-                                                     0, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
-                                                     0, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
-                                                     0, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
-                                                     0, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
-                                                     0, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
-                                                     0, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
-                                                     0, /* U+0022ee: VERTICAL ELLIPSIS*/
-                                                     0, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
-                                                     0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
-                                                     0, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
-                                                     0, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
-                                                     0, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-                                                     0, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-                                                     0, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
-                                                     0, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
-                                                     0, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
-                                                     0, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
-                                                     0, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
-                                                     0, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
-                                                     0, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-                                                     0, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-                                                     0, /* U+0022fd: CONTAINS WITH OVERBAR*/
-                                                     0, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
-                                                     0, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
-                                                     0, /* U+002300: DIAMETER SIGN*/
-                                                     0, /* U+002301: ELECTRIC ARROW*/
-                                                     0, /* U+002302: HOUSE*/
-                                                     0, /* U+002303: UP ARROWHEAD*/
-                                                     0, /* U+002304: DOWN ARROWHEAD*/
-                                                     0, /* U+002305: PROJECTIVE*/
-                                                     0, /* U+002306: PERSPECTIVE*/
-                                                     0, /* U+002307: WAVY LINE*/
-                                                     0, /* U+002308: LEFT CEILING*/
-                                                     0, /* U+002309: RIGHT CEILING*/
-                                                     0, /* U+00230a: LEFT FLOOR*/
-                                                     0, /* U+00230b: RIGHT FLOOR*/
-                                                     0, /* U+00230c: BOTTOM RIGHT CROP*/
-                                                     0, /* U+00230d: BOTTOM LEFT CROP*/
-                                                     0, /* U+00230e: TOP RIGHT CROP*/
-                                                     0, /* U+00230f: TOP LEFT CROP*/
-                                                     0, /* U+002310: REVERSED NOT SIGN*/
-                                                     0, /* U+002311: SQUARE LOZENGE*/
-                                                     0, /* U+002312: ARC*/
-                                                     0, /* U+002313: SEGMENT*/
-                                                     0, /* U+002314: SECTOR*/
-                                                     0, /* U+002315: TELEPHONE RECORDER*/
-                                                     0, /* U+002316: POSITION INDICATOR*/
-                                                     0, /* U+002317: VIEWDATA SQUARE*/
-                                                     0, /* U+002318: PLACE OF INTEREST SIGN*/
-                                                     0, /* U+002319: TURNED NOT SIGN*/
-                                                     0, /* U+00231a: WATCH*/
-                                                     0, /* U+00231b: HOURGLASS*/
-                                                     0, /* U+00231c: TOP LEFT CORNER*/
-                                                     0, /* U+00231d: TOP RIGHT CORNER*/
-                                                     0, /* U+00231e: BOTTOM LEFT CORNER*/
-                                                     0, /* U+00231f: BOTTOM RIGHT CORNER*/
-                                                     0, /* U+002320: TOP HALF INTEGRAL*/
-                                                     0, /* U+002321: BOTTOM HALF INTEGRAL*/
-                                                     0, /* U+002322: FROWN*/
-                                                     0, /* U+002323: SMILE*/
-                                                     0, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
-                                                     0, /* U+002325: OPTION KEY*/
-                                                     0, /* U+002326: ERASE TO THE RIGHT*/
-                                                     0, /* U+002327: X IN A RECTANGLE BOX*/
-                                                     0, /* U+002328: KEYBOARD*/
-                                                     0, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
-                                                     0, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
-                                                     0, /* U+00232b: ERASE TO THE LEFT*/
-                                                     0, /* U+00232c: BENZENE RING*/
-                                                     0, /* U+00232d: CYLINDRICITY*/
-                                                     0, /* U+00232e: ALL AROUND-PROFILE*/
-                                                     0, /* U+00232f: SYMMETRY*/
-                                                     0, /* U+002330: TOTAL RUNOUT*/
-                                                     0, /* U+002331: DIMENSION ORIGIN*/
-                                                     0, /* U+002332: CONICAL TAPER*/
-                                                     0, /* U+002333: SLOPE*/
-                                                     0, /* U+002334: COUNTERBORE*/
-                                                     0, /* U+002335: COUNTERSINK*/
-                                                     0, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
-                                                     0, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
-                                                     0, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
-                                                     0, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
-                                                     0, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
-                                                     0, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
-                                                     0, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
-                                                     0, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
-                                                     0, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
-                                                     0, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
-                                                     0, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
-                                                     0, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
-                                                     0, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
-                                                     0, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
-                                                     0, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
-                                                     0, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
-                                                     0, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
-                                                     0, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
-                                                     0, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
-                                                     0, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
-                                                     0, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
-                                                     0, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
-                                                     0, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
-                                                     0, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
-                                                     0, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
-                                                     0, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
-                                                     0, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
-                                                     0, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
-                                                     0, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
-                                                     0, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
-                                                     0, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
-                                                     0, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
-                                                     0, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
-                                                     0, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
-                                                     0, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
-                                                     0, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
-                                                     0, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
-                                                     0, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
-                                                     0, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
-                                                     0, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
-                                                     0, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
-                                                     0, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
-                                                     0, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
-                                                     0, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
-                                                     0, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
-                                                     0, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
-                                                     0, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
-                                                     0, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
-                                                     0, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
-                                                     0, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
-                                                     0, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
-                                                     0, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
-                                                     0, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
-                                                     0, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
-                                                     0, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
-                                                     0, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
-                                                     0, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
-                                                     0, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
-                                                     0, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
-                                                     0, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
-                                                     0, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
-                                                     0, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
-                                                     0, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
-                                                     0, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
-                                                     0, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
-                                                     0, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
-                                                     0, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
-                                                     0, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
-                                                     0, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
-                                                     0, /* U+00237b: NOT CHECK MARK*/
-                                                     0, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
-                                                     0, /* U+00237d: SHOULDERED OPEN BOX*/
-                                                     0, /* U+00237e: BELL SYMBOL*/
-                                                     0, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
-                                                     0, /* U+002380: INSERTION SYMBOL*/
-                                                     0, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
-                                                     0, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
-                                                     0, /* U+002383: EMPHASIS SYMBOL*/
-                                                     0, /* U+002384: COMPOSITION SYMBOL*/
-                                                     0, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
-                                                     0, /* U+002386: ENTER SYMBOL*/
-                                                     0, /* U+002387: ALTERNATIVE KEY SYMBOL*/
-                                                     0, /* U+002388: HELM SYMBOL*/
-                                                     0, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
-                                                     0, /* U+00238a: CIRCLED TRIANGLE DOWN*/
-                                                     0, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
-                                                     0, /* U+00238c: UNDO SYMBOL*/
-                                                     0, /* U+00238d: MONOSTABLE SYMBOL*/
-                                                     0, /* U+00238e: HYSTERESIS SYMBOL*/
-                                                     0, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
-                                                     0, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
-                                                     0, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
-                                                     0, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
-                                                     0, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
-                                                     0, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
-                                                     0, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
-                                                     0, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
-                                                     0, /* U+002397: PREVIOUS PAGE*/
-                                                     0, /* U+002398: NEXT PAGE*/
-                                                     0, /* U+002399: PRINT SCREEN SYMBOL*/
-                                                     0, /* U+00239a: CLEAR SCREEN SYMBOL*/
-                                                     0, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
-                                                     0, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
-                                                     0, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
-                                                     0, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
-                                                     0, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
-                                                     0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
-                                                     0, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
-                                                     0, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
-                                                     0, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
-                                                     0, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
-                                                     0, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
-                                                     0, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
-                                                     0, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
-                                                     0, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
-                                                     0, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
-                                                     0, /* U+0023aa: CURLY BRACKET EXTENSION*/
-                                                     0, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
-                                                     0, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
-                                                     0, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
-                                                     0, /* U+0023ae: INTEGRAL EXTENSION*/
-                                                     0, /* U+0023af: HORIZONTAL LINE EXTENSION*/
-                                                     0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
-                                                     0, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
-                                                     0, /* U+0023b2: SUMMATION TOP*/
-                                                     0, /* U+0023b3: SUMMATION BOTTOM*/
-                                                     0, /* U+0023b4: TOP SQUARE BRACKET*/
-                                                     0, /* U+0023b5: BOTTOM SQUARE BRACKET*/
-                                                     0, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
-                                                     0, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
-                                                     0, /* U+0023b8: LEFT VERTICAL BOX LINE*/
-                                                     0, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
-                                                     0, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
-                                                     0, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
-                                                     0, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
-                                                     0, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
-                                                     0, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
-                                                     0, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
-                                                     0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
-                                                     0, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
-                                                     0, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
-                                                     0, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
-                                                     0, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
-                                                     0, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
-                                                     0, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
-                                                     0, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
-                                                     0, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
-                                                     0, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
-                                                     0, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
-                                                     0, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
-                                                     0, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
-                                                     0, /* U+0023cd: SQUARE FOOT*/
-                                                     0, /* U+0023ce: RETURN SYMBOL*/
-                                                     0, /* U+0023cf: EJECT SYMBOL*/
-                                                     0, /* U+0023d0: VERTICAL LINE EXTENSION*/
-                                                     0, /* U+0023d1: METRICAL BREVE*/
-                                                     0, /* U+0023d2: METRICAL LONG OVER SHORT*/
-                                                     0, /* U+0023d3: METRICAL SHORT OVER LONG*/
-                                                     0, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
-                                                     0, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
-                                                     0, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
-                                                     0, /* U+0023d7: METRICAL TRISEME*/
-                                                     0, /* U+0023d8: METRICAL TETRASEME*/
-                                                     0, /* U+0023d9: METRICAL PENTASEME*/
-                                                     0, /* U+0023da: EARTH GROUND*/
-                                                     0, /* U+0023db: FUSE*/
-                                                     0, /* U+0023dc: */
-                                                     0, /* U+0023dd: */
-                                                     0, /* U+0023de: */
-                                                     0, /* U+0023df: */
-                                                     0, /* U+0023e0: */
-                                                     0, /* U+0023e1: */
-                                                     0, /* U+0023e2: */
-                                                     0, /* U+0023e3: */
-                                                     0, /* U+0023e4: */
-                                                     0, /* U+0023e5: */
-                                                     0, /* U+0023e6: */
-                                                     0, /* U+0023e7: */
-                                                     0, /* U+0023e8: */
-                                                     0, /* U+0023e9: */
-                                                     0, /* U+0023ea: */
-                                                     0, /* U+0023eb: */
-                                                     0, /* U+0023ec: */
-                                                     0, /* U+0023ed: */
-                                                     0, /* U+0023ee: */
-                                                     0, /* U+0023ef: */
-                                                     0, /* U+0023f0: */
-                                                     0, /* U+0023f1: */
-                                                     0, /* U+0023f2: */
-                                                     0, /* U+0023f3: */
-                                                     0, /* U+0023f4: */
-                                                     0, /* U+0023f5: */
-                                                     0, /* U+0023f6: */
-                                                     0, /* U+0023f7: */
-                                                     0, /* U+0023f8: */
-                                                     0, /* U+0023f9: */
-                                                     0, /* U+0023fa: */
-                                                     0, /* U+0023fb: */
-                                                     0, /* U+0023fc: */
-                                                     0, /* U+0023fd: */
-                                                     0, /* U+0023fe: */
-                                                     0, /* U+0023ff: */
-                                                     0, /* U+002400: SYMBOL FOR NULL*/
-                                                     0, /* U+002401: SYMBOL FOR START OF HEADING*/
-                                                     0, /* U+002402: SYMBOL FOR START OF TEXT*/
-                                                     0, /* U+002403: SYMBOL FOR END OF TEXT*/
-                                                     0, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
-                                                     0, /* U+002405: SYMBOL FOR ENQUIRY*/
-                                                     0, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
-                                                     0, /* U+002407: SYMBOL FOR BELL*/
-                                                     0, /* U+002408: SYMBOL FOR BACKSPACE*/
-                                                     0, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
-                                                     0, /* U+00240a: SYMBOL FOR LINE FEED*/
-                                                     0, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
-                                                     0, /* U+00240c: SYMBOL FOR FORM FEED*/
-                                                     0, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
-                                                     0, /* U+00240e: SYMBOL FOR SHIFT OUT*/
-                                                     0, /* U+00240f: SYMBOL FOR SHIFT IN*/
-                                                     0, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
-                                                     0, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
-                                                     0, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
-                                                     0, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
-                                                     0, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
-                                                     0, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
-                                                     0, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
-                                                     0, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
-                                                     0, /* U+002418: SYMBOL FOR CANCEL*/
-                                                     0, /* U+002419: SYMBOL FOR END OF MEDIUM*/
-                                                     0, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
-                                                     0, /* U+00241b: SYMBOL FOR ESCAPE*/
-                                                     0, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
-                                                     0, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
-                                                     0, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
-                                                     0, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
-                                                     0, /* U+002420: SYMBOL FOR SPACE*/
-                                                     0, /* U+002421: SYMBOL FOR DELETE*/
-                                                     0, /* U+002422: BLANK SYMBOL*/
-                                                     0, /* U+002423: OPEN BOX*/
-                                                     0, /* U+002424: SYMBOL FOR NEWLINE*/
-                                                     0, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
-                                                     0, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
-                                                     0, /* U+002427: */
-                                                     0, /* U+002428: */
-                                                     0, /* U+002429: */
-                                                     0, /* U+00242a: */
-                                                     0, /* U+00242b: */
-                                                     0, /* U+00242c: */
-                                                     0, /* U+00242d: */
-                                                     0, /* U+00242e: */
-                                                     0, /* U+00242f: */
-                                                     0, /* U+002430: */
-                                                     0, /* U+002431: */
-                                                     0, /* U+002432: */
-                                                     0, /* U+002433: */
-                                                     0, /* U+002434: */
-                                                     0, /* U+002435: */
-                                                     0, /* U+002436: */
-                                                     0, /* U+002437: */
-                                                     0, /* U+002438: */
-                                                     0, /* U+002439: */
-                                                     0, /* U+00243a: */
-                                                     0, /* U+00243b: */
-                                                     0, /* U+00243c: */
-                                                     0, /* U+00243d: */
-                                                     0, /* U+00243e: */
-                                                     0, /* U+00243f: */
-                                                     0, /* U+002440: OCR HOOK*/
-                                                     0, /* U+002441: OCR CHAIR*/
-                                                     0, /* U+002442: OCR FORK*/
-                                                     0, /* U+002443: OCR INVERTED FORK*/
-                                                     0, /* U+002444: OCR BELT BUCKLE*/
-                                                     0, /* U+002445: OCR BOW TIE*/
-                                                     0, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
-                                                     0, /* U+002447: OCR AMOUNT OF CHECK*/
-                                                     0, /* U+002448: OCR DASH*/
-                                                     0, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
-                                                     0, /* U+00244a: OCR DOUBLE BACKSLASH*/
-                                                     0, /* U+00244b: */
-                                                     0, /* U+00244c: */
-                                                     0, /* U+00244d: */
-                                                     0, /* U+00244e: */
-                                                     0, /* U+00244f: */
-                                                     0, /* U+002450: */
-                                                     0, /* U+002451: */
-                                                     0, /* U+002452: */
-                                                     0, /* U+002453: */
-                                                     0, /* U+002454: */
-                                                     0, /* U+002455: */
-                                                     0, /* U+002456: */
-                                                     0, /* U+002457: */
-                                                     0, /* U+002458: */
-                                                     0, /* U+002459: */
-                                                     0, /* U+00245a: */
-                                                     0, /* U+00245b: */
-                                                     0, /* U+00245c: */
-                                                     0, /* U+00245d: */
-                                                     0, /* U+00245e: */
-                                                     0, /* U+00245f: */
-                                                     0, /* U+002460: CIRCLED DIGIT ONE*/
-                                                     0, /* U+002461: CIRCLED DIGIT TWO*/
-                                                     0, /* U+002462: CIRCLED DIGIT THREE*/
-                                                     0, /* U+002463: CIRCLED DIGIT FOUR*/
-                                                     0, /* U+002464: CIRCLED DIGIT FIVE*/
-                                                     0, /* U+002465: CIRCLED DIGIT SIX*/
-                                                     0, /* U+002466: CIRCLED DIGIT SEVEN*/
-                                                     0, /* U+002467: CIRCLED DIGIT EIGHT*/
-                                                     0, /* U+002468: CIRCLED DIGIT NINE*/
-                                                     0, /* U+002469: CIRCLED NUMBER TEN*/
-                                                     0, /* U+00246a: CIRCLED NUMBER ELEVEN*/
-                                                     0, /* U+00246b: CIRCLED NUMBER TWELVE*/
-                                                     0, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
-                                                     0, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
-                                                     0, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
-                                                     0, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
-                                                     0, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
-                                                     0, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
-                                                     0, /* U+002472: CIRCLED NUMBER NINETEEN*/
-                                                     0, /* U+002473: CIRCLED NUMBER TWENTY*/
-                                                     0, /* U+002474: PARENTHESIZED DIGIT ONE*/
-                                                     0, /* U+002475: PARENTHESIZED DIGIT TWO*/
-                                                     0, /* U+002476: PARENTHESIZED DIGIT THREE*/
-                                                     0, /* U+002477: PARENTHESIZED DIGIT FOUR*/
-                                                     0, /* U+002478: PARENTHESIZED DIGIT FIVE*/
-                                                     0, /* U+002479: PARENTHESIZED DIGIT SIX*/
-                                                     0, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
-                                                     0, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
-                                                     0, /* U+00247c: PARENTHESIZED DIGIT NINE*/
-                                                     0, /* U+00247d: PARENTHESIZED NUMBER TEN*/
-                                                     0, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
-                                                     0, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
-                                                     0, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
-                                                     0, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
-                                                     0, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
-                                                     0, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
-                                                     0, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
-                                                     0, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
-                                                     0, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
-                                                     0, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
-                                                     0, /* U+002488: DIGIT ONE FULL STOP*/
-                                                     0, /* U+002489: DIGIT TWO FULL STOP*/
-                                                     0, /* U+00248a: DIGIT THREE FULL STOP*/
-                                                     0, /* U+00248b: DIGIT FOUR FULL STOP*/
-                                                     0, /* U+00248c: DIGIT FIVE FULL STOP*/
-                                                     0, /* U+00248d: DIGIT SIX FULL STOP*/
-                                                     0, /* U+00248e: DIGIT SEVEN FULL STOP*/
-                                                     0, /* U+00248f: DIGIT EIGHT FULL STOP*/
-                                                     0, /* U+002490: DIGIT NINE FULL STOP*/
-                                                     0, /* U+002491: NUMBER TEN FULL STOP*/
-                                                     0, /* U+002492: NUMBER ELEVEN FULL STOP*/
-                                                     0, /* U+002493: NUMBER TWELVE FULL STOP*/
-                                                     0, /* U+002494: NUMBER THIRTEEN FULL STOP*/
-                                                     0, /* U+002495: NUMBER FOURTEEN FULL STOP*/
-                                                     0, /* U+002496: NUMBER FIFTEEN FULL STOP*/
-                                                     0, /* U+002497: NUMBER SIXTEEN FULL STOP*/
-                                                     0, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
-                                                     0, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
-                                                     0, /* U+00249a: NUMBER NINETEEN FULL STOP*/
-                                                     0, /* U+00249b: NUMBER TWENTY FULL STOP*/
-                                                     0, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
-                                                     0, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
-                                                     0, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
-                                                     0, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
-                                                     0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
-                                                     0, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
-                                                     0, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
-                                                     0, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
-                                                     0, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
-                                                     0, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
-                                                     0, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
-                                                     0, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
-                                                     0, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
-                                                     0, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
-                                                     0, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
-                                                     0, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
-                                                     0, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
-                                                     0, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
-                                                     0, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
-                                                     0, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
-                                                     0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
-                                                     0, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
-                                                     0, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
-                                                     0, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
-                                                     0, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
-                                                     0, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
-                                                     0, /* U+0024ea: CIRCLED DIGIT ZERO*/
-                                                     0, /* U+0024eb: NEGATIVE CIRCLED NUMBER ELEVEN*/
-                                                     0, /* U+0024ec: NEGATIVE CIRCLED NUMBER TWELVE*/
-                                                     0, /* U+0024ed: NEGATIVE CIRCLED NUMBER THIRTEEN*/
-                                                     0, /* U+0024ee: NEGATIVE CIRCLED NUMBER FOURTEEN*/
-                                                     0, /* U+0024ef: NEGATIVE CIRCLED NUMBER FIFTEEN*/
-                                                     0, /* U+0024f0: NEGATIVE CIRCLED NUMBER SIXTEEN*/
-                                                     0, /* U+0024f1: NEGATIVE CIRCLED NUMBER SEVENTEEN*/
-                                                     0, /* U+0024f2: NEGATIVE CIRCLED NUMBER EIGHTEEN*/
-                                                     0, /* U+0024f3: NEGATIVE CIRCLED NUMBER NINETEEN*/
-                                                     0, /* U+0024f4: NEGATIVE CIRCLED NUMBER TWENTY*/
-                                                     0, /* U+0024f5: DOUBLE CIRCLED DIGIT ONE*/
-                                                     0, /* U+0024f6: DOUBLE CIRCLED DIGIT TWO*/
-                                                     0, /* U+0024f7: DOUBLE CIRCLED DIGIT THREE*/
-                                                     0, /* U+0024f8: DOUBLE CIRCLED DIGIT FOUR*/
-                                                     0, /* U+0024f9: DOUBLE CIRCLED DIGIT FIVE*/
-                                                     0, /* U+0024fa: DOUBLE CIRCLED DIGIT SIX*/
-                                                     0, /* U+0024fb: DOUBLE CIRCLED DIGIT SEVEN*/
-                                                     0, /* U+0024fc: DOUBLE CIRCLED DIGIT EIGHT*/
-                                                     0, /* U+0024fd: DOUBLE CIRCLED DIGIT NINE*/
-                                                     0, /* U+0024fe: DOUBLE CIRCLED NUMBER TEN*/
-                                                     0, /* U+0024ff: NEGATIVE CIRCLED DIGIT ZERO*/
-                                                     0, /* U+002500: BOX DRAWINGS LIGHT HORIZONTAL*/
-                                                     0, /* U+002501: BOX DRAWINGS HEAVY HORIZONTAL*/
-                                                     0, /* U+002502: BOX DRAWINGS LIGHT VERTICAL*/
-                                                     0, /* U+002503: BOX DRAWINGS HEAVY VERTICAL*/
-                                                     0, /* U+002504: BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL*/
-                                                     0, /* U+002505: BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL*/
-                                                     0, /* U+002506: BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL*/
-                                                     0, /* U+002507: BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL*/
-                                                     0, /* U+002508: BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL*/
-                                                     0, /* U+002509: BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL*/
-                                                     0, /* U+00250a: BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL*/
-                                                     0, /* U+00250b: BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL*/
-                                                     0, /* U+00250c: BOX DRAWINGS LIGHT DOWN AND RIGHT*/
-                                                     0, /* U+00250d: BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY*/
-                                                     0, /* U+00250e: BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT*/
-                                                     0, /* U+00250f: BOX DRAWINGS HEAVY DOWN AND RIGHT*/
-                                                     0, /* U+002510: BOX DRAWINGS LIGHT DOWN AND LEFT*/
-                                                     0, /* U+002511: BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY*/
-                                                     0, /* U+002512: BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT*/
-                                                     0, /* U+002513: BOX DRAWINGS HEAVY DOWN AND LEFT*/
-                                                     0, /* U+002514: BOX DRAWINGS LIGHT UP AND RIGHT*/
-                                                     0, /* U+002515: BOX DRAWINGS UP LIGHT AND RIGHT HEAVY*/
-                                                     0, /* U+002516: BOX DRAWINGS UP HEAVY AND RIGHT LIGHT*/
-                                                     0, /* U+002517: BOX DRAWINGS HEAVY UP AND RIGHT*/
-                                                     0, /* U+002518: BOX DRAWINGS LIGHT UP AND LEFT*/
-                                                     0, /* U+002519: BOX DRAWINGS UP LIGHT AND LEFT HEAVY*/
-                                                     0, /* U+00251a: BOX DRAWINGS UP HEAVY AND LEFT LIGHT*/
-                                                     0, /* U+00251b: BOX DRAWINGS HEAVY UP AND LEFT*/
-                                                     0, /* U+00251c: BOX DRAWINGS LIGHT VERTICAL AND RIGHT*/
-                                                     0, /* U+00251d: BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY*/
-                                                     0, /* U+00251e: BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT*/
-                                                     0, /* U+00251f: BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT*/
-                                                     0, /* U+002520: BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT*/
-                                                     0, /* U+002521: BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY*/
-                                                     0, /* U+002522: BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY*/
-                                                     0, /* U+002523: BOX DRAWINGS HEAVY VERTICAL AND RIGHT*/
-                                                     0, /* U+002524: BOX DRAWINGS LIGHT VERTICAL AND LEFT*/
-                                                     0, /* U+002525: BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY*/
-                                                     0, /* U+002526: BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT*/
-                                                     0, /* U+002527: BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT*/
-                                                     0, /* U+002528: BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT*/
-                                                     0, /* U+002529: BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY*/
-                                                     0, /* U+00252a: BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY*/
-                                                     0, /* U+00252b: BOX DRAWINGS HEAVY VERTICAL AND LEFT*/
-                                                     0, /* U+00252c: BOX DRAWINGS LIGHT DOWN AND HORIZONTAL*/
-                                                     0, /* U+00252d: BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT*/
-                                                     0, /* U+00252e: BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT*/
-                                                     0, /* U+00252f: BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY*/
-                                                     0, /* U+002530: BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT*/
-                                                     0, /* U+002531: BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY*/
-                                                     0, /* U+002532: BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY*/
-                                                     0, /* U+002533: BOX DRAWINGS HEAVY DOWN AND HORIZONTAL*/
-                                                     0, /* U+002534: BOX DRAWINGS LIGHT UP AND HORIZONTAL*/
-                                                     0, /* U+002535: BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT*/
-                                                     0, /* U+002536: BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT*/
-                                                     0, /* U+002537: BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY*/
-                                                     0, /* U+002538: BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT*/
-                                                     0, /* U+002539: BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY*/
-                                                     0, /* U+00253a: BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY*/
-                                                     0, /* U+00253b: BOX DRAWINGS HEAVY UP AND HORIZONTAL*/
-                                                     0, /* U+00253c: BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL*/
-                                                     0, /* U+00253d: BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT*/
-                                                     0, /* U+00253e: BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT*/
-                                                     0, /* U+00253f: BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY*/
-                                                     0, /* U+002540: BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT*/
-                                                     0, /* U+002541: BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT*/
-                                                     0, /* U+002542: BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT*/
-                                                     0, /* U+002543: BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT*/
-                                                     0, /* U+002544: BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT*/
-                                                     0, /* U+002545: BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT*/
-                                                     0, /* U+002546: BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT*/
-                                                     0, /* U+002547: BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY*/
-                                                     0, /* U+002548: BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY*/
-                                                     0, /* U+002549: BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY*/
-                                                     0, /* U+00254a: BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY*/
-                                                     0, /* U+00254b: BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL*/
-                                                     0, /* U+00254c: BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL*/
-                                                     0, /* U+00254d: BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL*/
-                                                     0, /* U+00254e: BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL*/
-                                                     0, /* U+00254f: BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL*/
-                                                     0, /* U+002550: BOX DRAWINGS DOUBLE HORIZONTAL*/
-                                                     0, /* U+002551: BOX DRAWINGS DOUBLE VERTICAL*/
-                                                     0, /* U+002552: BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE*/
-                                                     0, /* U+002553: BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE*/
-                                                     0, /* U+002554: BOX DRAWINGS DOUBLE DOWN AND RIGHT*/
-                                                     0, /* U+002555: BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE*/
-                                                     0, /* U+002556: BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE*/
-                                                     0, /* U+002557: BOX DRAWINGS DOUBLE DOWN AND LEFT*/
-                                                     0, /* U+002558: BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE*/
-                                                     0, /* U+002559: BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE*/
-                                                     0, /* U+00255a: BOX DRAWINGS DOUBLE UP AND RIGHT*/
-                                                     0, /* U+00255b: BOX DRAWINGS UP SINGLE AND LEFT DOUBLE*/
-                                                     0, /* U+00255c: BOX DRAWINGS UP DOUBLE AND LEFT SINGLE*/
-                                                     0, /* U+00255d: BOX DRAWINGS DOUBLE UP AND LEFT*/
-                                                     0, /* U+00255e: BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE*/
-                                                     0, /* U+00255f: BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE*/
-                                                     0, /* U+002560: BOX DRAWINGS DOUBLE VERTICAL AND RIGHT*/
-                                                     0, /* U+002561: BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE*/
-                                                     0, /* U+002562: BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE*/
-                                                     0, /* U+002563: BOX DRAWINGS DOUBLE VERTICAL AND LEFT*/
-                                                     0, /* U+002564: BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE*/
-                                                     0, /* U+002565: BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE*/
-                                                     0, /* U+002566: BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL*/
-                                                     0, /* U+002567: BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE*/
-                                                     0, /* U+002568: BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE*/
-                                                     0, /* U+002569: BOX DRAWINGS DOUBLE UP AND HORIZONTAL*/
-                                                     0, /* U+00256a: BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE*/
-                                                     0, /* U+00256b: BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE*/
-                                                     0, /* U+00256c: BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL*/
-                                                     0, /* U+00256d: BOX DRAWINGS LIGHT ARC DOWN AND RIGHT*/
-                                                     0, /* U+00256e: BOX DRAWINGS LIGHT ARC DOWN AND LEFT*/
-                                                     0, /* U+00256f: BOX DRAWINGS LIGHT ARC UP AND LEFT*/
-                                                     0, /* U+002570: BOX DRAWINGS LIGHT ARC UP AND RIGHT*/
-                                                     0, /* U+002571: BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT*/
-                                                     0, /* U+002572: BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT*/
-                                                     0, /* U+002573: BOX DRAWINGS LIGHT DIAGONAL CROSS*/
-                                                     0, /* U+002574: BOX DRAWINGS LIGHT LEFT*/
-                                                     0, /* U+002575: BOX DRAWINGS LIGHT UP*/
-                                                     0, /* U+002576: BOX DRAWINGS LIGHT RIGHT*/
-                                                     0, /* U+002577: BOX DRAWINGS LIGHT DOWN*/
-                                                     0, /* U+002578: BOX DRAWINGS HEAVY LEFT*/
-                                                     0, /* U+002579: BOX DRAWINGS HEAVY UP*/
-                                                     0, /* U+00257a: BOX DRAWINGS HEAVY RIGHT*/
-                                                     0, /* U+00257b: BOX DRAWINGS HEAVY DOWN*/
-                                                     0, /* U+00257c: BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT*/
-                                                     0, /* U+00257d: BOX DRAWINGS LIGHT UP AND HEAVY DOWN*/
-                                                     0, /* U+00257e: BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT*/
-                                                     0, /* U+00257f: BOX DRAWINGS HEAVY UP AND LIGHT DOWN*/
-                                                     0, /* U+002580: UPPER HALF BLOCK*/
-                                                     0, /* U+002581: LOWER ONE EIGHTH BLOCK*/
-                                                     0, /* U+002582: LOWER ONE QUARTER BLOCK*/
-                                                     0, /* U+002583: LOWER THREE EIGHTHS BLOCK*/
-                                                     0, /* U+002584: LOWER HALF BLOCK*/
-                                                     0, /* U+002585: LOWER FIVE EIGHTHS BLOCK*/
-                                                     0, /* U+002586: LOWER THREE QUARTERS BLOCK*/
-                                                     0, /* U+002587: LOWER SEVEN EIGHTHS BLOCK*/
-                                                     0, /* U+002588: FULL BLOCK*/
-                                                     0, /* U+002589: LEFT SEVEN EIGHTHS BLOCK*/
-                                                     0, /* U+00258a: LEFT THREE QUARTERS BLOCK*/
-                                                     0, /* U+00258b: LEFT FIVE EIGHTHS BLOCK*/
-                                                     0, /* U+00258c: LEFT HALF BLOCK*/
-                                                     0, /* U+00258d: LEFT THREE EIGHTHS BLOCK*/
-                                                     0, /* U+00258e: LEFT ONE QUARTER BLOCK*/
-                                                     0, /* U+00258f: LEFT ONE EIGHTH BLOCK*/
-                                                     0, /* U+002590: RIGHT HALF BLOCK*/
-                                                     0, /* U+002591: LIGHT SHADE*/
-                                                     0, /* U+002592: MEDIUM SHADE*/
-                                                     0, /* U+002593: DARK SHADE*/
-                                                     0, /* U+002594: UPPER ONE EIGHTH BLOCK*/
-                                                     0, /* U+002595: RIGHT ONE EIGHTH BLOCK*/
-                                                     0, /* U+002596: QUADRANT LOWER LEFT*/
-                                                     0, /* U+002597: QUADRANT LOWER RIGHT*/
-                                                     0, /* U+002598: QUADRANT UPPER LEFT*/
-                                                     0, /* U+002599: QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT*/
-                                                     0, /* U+00259a: QUADRANT UPPER LEFT AND LOWER RIGHT*/
-                                                     0, /* U+00259b: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT*/
-                                                     0, /* U+00259c: QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT*/
-                                                     0, /* U+00259d: QUADRANT UPPER RIGHT*/
-                                                     0, /* U+00259e: QUADRANT UPPER RIGHT AND LOWER LEFT*/
-                                                     0, /* U+00259f: QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT*/
-                                                     0, /* U+0025a0: BLACK SQUARE*/
-                                                     0, /* U+0025a1: WHITE SQUARE*/
-                                                     0, /* U+0025a2: WHITE SQUARE WITH ROUNDED CORNERS*/
-                                                     0, /* U+0025a3: WHITE SQUARE CONTAINING BLACK SMALL SQUARE*/
-                                                     0, /* U+0025a4: SQUARE WITH HORIZONTAL FILL*/
-                                                     0, /* U+0025a5: SQUARE WITH VERTICAL FILL*/
-                                                     0, /* U+0025a6: SQUARE WITH ORTHOGONAL CROSSHATCH FILL*/
-                                                     0, /* U+0025a7: SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL*/
-                                                     0, /* U+0025a8: SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL*/
-                                                     0, /* U+0025a9: SQUARE WITH DIAGONAL CROSSHATCH FILL*/
-                                                     0, /* U+0025aa: BLACK SMALL SQUARE*/
-                                                     0, /* U+0025ab: WHITE SMALL SQUARE*/
-                                                     0, /* U+0025ac: BLACK RECTANGLE*/
-                                                     0, /* U+0025ad: WHITE RECTANGLE*/
-                                                     0, /* U+0025ae: BLACK VERTICAL RECTANGLE*/
-                                                     0, /* U+0025af: WHITE VERTICAL RECTANGLE*/
-                                                     0, /* U+0025b0: BLACK PARALLELOGRAM*/
-                                                     0, /* U+0025b1: WHITE PARALLELOGRAM*/
-                                                     0, /* U+0025b2: BLACK UP-POINTING TRIANGLE*/
-                                                     0, /* U+0025b3: WHITE UP-POINTING TRIANGLE*/
-                                                     0, /* U+0025b4: BLACK UP-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025b5: WHITE UP-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025b6: BLACK RIGHT-POINTING TRIANGLE*/
-                                                     0, /* U+0025b7: WHITE RIGHT-POINTING TRIANGLE*/
-                                                     0, /* U+0025b8: BLACK RIGHT-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025b9: WHITE RIGHT-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025ba: BLACK RIGHT-POINTING POINTER*/
-                                                     0, /* U+0025bb: WHITE RIGHT-POINTING POINTER*/
-                                                     0, /* U+0025bc: BLACK DOWN-POINTING TRIANGLE*/
-                                                     0, /* U+0025bd: WHITE DOWN-POINTING TRIANGLE*/
-                                                     0, /* U+0025be: BLACK DOWN-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025bf: WHITE DOWN-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025c0: BLACK LEFT-POINTING TRIANGLE*/
-                                                     0, /* U+0025c1: WHITE LEFT-POINTING TRIANGLE*/
-                                                     0, /* U+0025c2: BLACK LEFT-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025c3: WHITE LEFT-POINTING SMALL TRIANGLE*/
-                                                     0, /* U+0025c4: BLACK LEFT-POINTING POINTER*/
-                                                     0, /* U+0025c5: WHITE LEFT-POINTING POINTER*/
-                                                     0, /* U+0025c6: BLACK DIAMOND*/
-                                                     0, /* U+0025c7: WHITE DIAMOND*/
-                                                     0, /* U+0025c8: WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND*/
-                                                     0, /* U+0025c9: FISHEYE*/
-                                                     0, /* U+0025ca: LOZENGE*/
-                                                     0, /* U+0025cb: WHITE CIRCLE*/
-                                                     0, /* U+0025cc: DOTTED CIRCLE*/
-                                                     0, /* U+0025cd: CIRCLE WITH VERTICAL FILL*/
-                                                     0, /* U+0025ce: BULLSEYE*/
-                                                     0, /* U+0025cf: BLACK CIRCLE*/
-                                                     0, /* U+0025d0: CIRCLE WITH LEFT HALF BLACK*/
-                                                     0, /* U+0025d1: CIRCLE WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0025d2: CIRCLE WITH LOWER HALF BLACK*/
-                                                     0, /* U+0025d3: CIRCLE WITH UPPER HALF BLACK*/
-                                                     0, /* U+0025d4: CIRCLE WITH UPPER RIGHT QUADRANT BLACK*/
-                                                     0, /* U+0025d5: CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK*/
-                                                     0, /* U+0025d6: LEFT HALF BLACK CIRCLE*/
-                                                     0, /* U+0025d7: RIGHT HALF BLACK CIRCLE*/
-                                                     0, /* U+0025d8: INVERSE BULLET*/
-                                                     0, /* U+0025d9: INVERSE WHITE CIRCLE*/
-                                                     0, /* U+0025da: UPPER HALF INVERSE WHITE CIRCLE*/
-                                                     0, /* U+0025db: LOWER HALF INVERSE WHITE CIRCLE*/
-                                                     0, /* U+0025dc: UPPER LEFT QUADRANT CIRCULAR ARC*/
-                                                     0, /* U+0025dd: UPPER RIGHT QUADRANT CIRCULAR ARC*/
-                                                     0, /* U+0025de: LOWER RIGHT QUADRANT CIRCULAR ARC*/
-                                                     0, /* U+0025df: LOWER LEFT QUADRANT CIRCULAR ARC*/
-                                                     0, /* U+0025e0: UPPER HALF CIRCLE*/
-                                                     0, /* U+0025e1: LOWER HALF CIRCLE*/
-                                                     0, /* U+0025e2: BLACK LOWER RIGHT TRIANGLE*/
-                                                     0, /* U+0025e3: BLACK LOWER LEFT TRIANGLE*/
-                                                     0, /* U+0025e4: BLACK UPPER LEFT TRIANGLE*/
-                                                     0, /* U+0025e5: BLACK UPPER RIGHT TRIANGLE*/
-                                                     0, /* U+0025e6: WHITE BULLET*/
-                                                     0, /* U+0025e7: SQUARE WITH LEFT HALF BLACK*/
-                                                     0, /* U+0025e8: SQUARE WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0025e9: SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK*/
-                                                     0, /* U+0025ea: SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK*/
-                                                     0, /* U+0025eb: WHITE SQUARE WITH VERTICAL BISECTING LINE*/
-                                                     0, /* U+0025ec: WHITE UP-POINTING TRIANGLE WITH DOT*/
-                                                     0, /* U+0025ed: UP-POINTING TRIANGLE WITH LEFT HALF BLACK*/
-                                                     0, /* U+0025ee: UP-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0025ef: LARGE CIRCLE*/
-                                                     0, /* U+0025f0: WHITE SQUARE WITH UPPER LEFT QUADRANT*/
-                                                     0, /* U+0025f1: WHITE SQUARE WITH LOWER LEFT QUADRANT*/
-                                                     0, /* U+0025f2: WHITE SQUARE WITH LOWER RIGHT QUADRANT*/
-                                                     0, /* U+0025f3: WHITE SQUARE WITH UPPER RIGHT QUADRANT*/
-                                                     0, /* U+0025f4: WHITE CIRCLE WITH UPPER LEFT QUADRANT*/
-                                                     0, /* U+0025f5: WHITE CIRCLE WITH LOWER LEFT QUADRANT*/
-                                                     0, /* U+0025f6: WHITE CIRCLE WITH LOWER RIGHT QUADRANT*/
-                                                     0, /* U+0025f7: WHITE CIRCLE WITH UPPER RIGHT QUADRANT*/
-                                                     0, /* U+0025f8: UPPER LEFT TRIANGLE*/
-                                                     0, /* U+0025f9: UPPER RIGHT TRIANGLE*/
-                                                     0, /* U+0025fa: LOWER LEFT TRIANGLE*/
-                                                     0, /* U+0025fb: WHITE MEDIUM SQUARE*/
-                                                     0, /* U+0025fc: BLACK MEDIUM SQUARE*/
-                                                     0, /* U+0025fd: WHITE MEDIUM SMALL SQUARE*/
-                                                     0, /* U+0025fe: BLACK MEDIUM SMALL SQUARE*/
-                                                     0, /* U+0025ff: LOWER RIGHT TRIANGLE*/
-                                                     0, /* U+002600: BLACK SUN WITH RAYS*/
-                                                     0, /* U+002601: CLOUD*/
-                                                     0, /* U+002602: UMBRELLA*/
-                                                     0, /* U+002603: SNOWMAN*/
-                                                     0, /* U+002604: COMET*/
-                                                     0, /* U+002605: BLACK STAR*/
-                                                     0, /* U+002606: WHITE STAR*/
-                                                     0, /* U+002607: LIGHTNING*/
-                                                     0, /* U+002608: THUNDERSTORM*/
-                                                     0, /* U+002609: SUN*/
-                                                     0, /* U+00260a: ASCENDING NODE*/
-                                                     0, /* U+00260b: DESCENDING NODE*/
-                                                     0, /* U+00260c: CONJUNCTION*/
-                                                     0, /* U+00260d: OPPOSITION*/
-                                                     0, /* U+00260e: BLACK TELEPHONE*/
-                                                     0, /* U+00260f: WHITE TELEPHONE*/
-                                                     0, /* U+002610: BALLOT BOX*/
-                                                     0, /* U+002611: BALLOT BOX WITH CHECK*/
-                                                     0, /* U+002612: BALLOT BOX WITH X*/
-                                                     0, /* U+002613: SALTIRE*/
-                                                     0, /* U+002614: UMBRELLA WITH RAIN DROPS*/
-                                                     0, /* U+002615: HOT BEVERAGE*/
-                                                     0, /* U+002616: WHITE SHOGI PIECE*/
-                                                     0, /* U+002617: BLACK SHOGI PIECE*/
-                                                     0, /* U+002618: SHAMROCK*/
-                                                     0, /* U+002619: REVERSED ROTATED FLORAL HEART BULLET*/
-                                                     0, /* U+00261a: BLACK LEFT POINTING INDEX*/
-                                                     0, /* U+00261b: BLACK RIGHT POINTING INDEX*/
-                                                     0, /* U+00261c: WHITE LEFT POINTING INDEX*/
-                                                     0, /* U+00261d: WHITE UP POINTING INDEX*/
-                                                     0, /* U+00261e: WHITE RIGHT POINTING INDEX*/
-                                                     0, /* U+00261f: WHITE DOWN POINTING INDEX*/
-                                                     0, /* U+002620: SKULL AND CROSSBONES*/
-                                                     0, /* U+002621: CAUTION SIGN*/
-                                                     0, /* U+002622: RADIOACTIVE SIGN*/
-                                                     0, /* U+002623: BIOHAZARD SIGN*/
-                                                     0, /* U+002624: CADUCEUS*/
-                                                     0, /* U+002625: ANKH*/
-                                                     0, /* U+002626: ORTHODOX CROSS*/
-                                                     0, /* U+002627: CHI RHO*/
-                                                     0, /* U+002628: CROSS OF LORRAINE*/
-                                                     0, /* U+002629: CROSS OF JERUSALEM*/
-                                                     0, /* U+00262a: STAR AND CRESCENT*/
-                                                     0, /* U+00262b: FARSI SYMBOL*/
-                                                     0, /* U+00262c: ADI SHAKTI*/
-                                                     0, /* U+00262d: HAMMER AND SICKLE*/
-                                                     0, /* U+00262e: PEACE SYMBOL*/
-                                                     0, /* U+00262f: YIN YANG*/
-                                                     0, /* U+002630: TRIGRAM FOR HEAVEN*/
-                                                     0, /* U+002631: TRIGRAM FOR LAKE*/
-                                                     0, /* U+002632: TRIGRAM FOR FIRE*/
-                                                     0, /* U+002633: TRIGRAM FOR THUNDER*/
-                                                     0, /* U+002634: TRIGRAM FOR WIND*/
-                                                     0, /* U+002635: TRIGRAM FOR WATER*/
-                                                     0, /* U+002636: TRIGRAM FOR MOUNTAIN*/
-                                                     0, /* U+002637: TRIGRAM FOR EARTH*/
-                                                     0, /* U+002638: WHEEL OF DHARMA*/
-                                                     0, /* U+002639: WHITE FROWNING FACE*/
-                                                     0, /* U+00263a: WHITE SMILING FACE*/
-                                                     0, /* U+00263b: BLACK SMILING FACE*/
-                                                     0, /* U+00263c: WHITE SUN WITH RAYS*/
-                                                     0, /* U+00263d: FIRST QUARTER MOON*/
-                                                     0, /* U+00263e: LAST QUARTER MOON*/
-                                                     0, /* U+00263f: MERCURY*/
-                                                     0, /* U+002640: FEMALE SIGN*/
-                                                     0, /* U+002641: EARTH*/
-                                                     0, /* U+002642: MALE SIGN*/
-                                                     0, /* U+002643: JUPITER*/
-                                                     0, /* U+002644: SATURN*/
-                                                     0, /* U+002645: URANUS*/
-                                                     0, /* U+002646: NEPTUNE*/
-                                                     0, /* U+002647: PLUTO*/
-                                                     0, /* U+002648: ARIES*/
-                                                     0, /* U+002649: TAURUS*/
-                                                     0, /* U+00264a: GEMINI*/
-                                                     0, /* U+00264b: CANCER*/
-                                                     0, /* U+00264c: LEO*/
-                                                     0, /* U+00264d: VIRGO*/
-                                                     0, /* U+00264e: LIBRA*/
-                                                     0, /* U+00264f: SCORPIUS*/
-                                                     0, /* U+002650: SAGITTARIUS*/
-                                                     0, /* U+002651: CAPRICORN*/
-                                                     0, /* U+002652: AQUARIUS*/
-                                                     0, /* U+002653: PISCES*/
-                                                     0, /* U+002654: WHITE CHESS KING*/
-                                                     0, /* U+002655: WHITE CHESS QUEEN*/
-                                                     0, /* U+002656: WHITE CHESS ROOK*/
-                                                     0, /* U+002657: WHITE CHESS BISHOP*/
-                                                     0, /* U+002658: WHITE CHESS KNIGHT*/
-                                                     0, /* U+002659: WHITE CHESS PAWN*/
-                                                     0, /* U+00265a: BLACK CHESS KING*/
-                                                     0, /* U+00265b: BLACK CHESS QUEEN*/
-                                                     0, /* U+00265c: BLACK CHESS ROOK*/
-                                                     0, /* U+00265d: BLACK CHESS BISHOP*/
-                                                     0, /* U+00265e: BLACK CHESS KNIGHT*/
-                                                     0, /* U+00265f: BLACK CHESS PAWN*/
-                                                     0, /* U+002660: BLACK SPADE SUIT*/
-                                                     0, /* U+002661: WHITE HEART SUIT*/
-                                                     0, /* U+002662: WHITE DIAMOND SUIT*/
-                                                     0, /* U+002663: BLACK CLUB SUIT*/
-                                                     0, /* U+002664: WHITE SPADE SUIT*/
-                                                     0, /* U+002665: BLACK HEART SUIT*/
-                                                     0, /* U+002666: BLACK DIAMOND SUIT*/
-                                                     0, /* U+002667: WHITE CLUB SUIT*/
-                                                     0, /* U+002668: HOT SPRINGS*/
-                                                     0, /* U+002669: QUARTER NOTE*/
-                                                     0, /* U+00266a: EIGHTH NOTE*/
-                                                     0, /* U+00266b: BEAMED EIGHTH NOTES*/
-                                                     0, /* U+00266c: BEAMED SIXTEENTH NOTES*/
-                                                     0, /* U+00266d: MUSIC FLAT SIGN*/
-                                                     0, /* U+00266e: MUSIC NATURAL SIGN*/
-                                                     0, /* U+00266f: MUSIC SHARP SIGN*/
-                                                     0, /* U+002670: WEST SYRIAC CROSS*/
-                                                     0, /* U+002671: EAST SYRIAC CROSS*/
-                                                     0, /* U+002672: UNIVERSAL RECYCLING SYMBOL*/
-                                                     0, /* U+002673: RECYCLING SYMBOL FOR TYPE-1 PLASTICS*/
-                                                     0, /* U+002674: RECYCLING SYMBOL FOR TYPE-2 PLASTICS*/
-                                                     0, /* U+002675: RECYCLING SYMBOL FOR TYPE-3 PLASTICS*/
-                                                     0, /* U+002676: RECYCLING SYMBOL FOR TYPE-4 PLASTICS*/
-                                                     0, /* U+002677: RECYCLING SYMBOL FOR TYPE-5 PLASTICS*/
-                                                     0, /* U+002678: RECYCLING SYMBOL FOR TYPE-6 PLASTICS*/
-                                                     0, /* U+002679: RECYCLING SYMBOL FOR TYPE-7 PLASTICS*/
-                                                     0, /* U+00267a: RECYCLING SYMBOL FOR GENERIC MATERIALS*/
-                                                     0, /* U+00267b: BLACK UNIVERSAL RECYCLING SYMBOL*/
-                                                     0, /* U+00267c: RECYCLED PAPER SYMBOL*/
-                                                     0, /* U+00267d: PARTIALLY-RECYCLED PAPER SYMBOL*/
-                                                     0, /* U+00267e: PERMANENT PAPER SIGN*/
-                                                     0, /* U+00267f: WHEELCHAIR SYMBOL*/
-                                                     0, /* U+002680: DIE FACE-1*/
-                                                     0, /* U+002681: DIE FACE-2*/
-                                                     0, /* U+002682: DIE FACE-3*/
-                                                     0, /* U+002683: DIE FACE-4*/
-                                                     0, /* U+002684: DIE FACE-5*/
-                                                     0, /* U+002685: DIE FACE-6*/
-                                                     0, /* U+002686: WHITE CIRCLE WITH DOT RIGHT*/
-                                                     0, /* U+002687: WHITE CIRCLE WITH TWO DOTS*/
-                                                     0, /* U+002688: BLACK CIRCLE WITH WHITE DOT RIGHT*/
-                                                     0, /* U+002689: BLACK CIRCLE WITH TWO WHITE DOTS*/
-                                                     0, /* U+00268a: MONOGRAM FOR YANG*/
-                                                     0, /* U+00268b: MONOGRAM FOR YIN*/
-                                                     0, /* U+00268c: DIGRAM FOR GREATER YANG*/
-                                                     0, /* U+00268d: DIGRAM FOR LESSER YIN*/
-                                                     0, /* U+00268e: DIGRAM FOR LESSER YANG*/
-                                                     0, /* U+00268f: DIGRAM FOR GREATER YIN*/
-                                                     0, /* U+002690: WHITE FLAG*/
-                                                     0, /* U+002691: BLACK FLAG*/
-                                                     0, /* U+002692: HAMMER AND PICK*/
-                                                     0, /* U+002693: ANCHOR*/
-                                                     0, /* U+002694: CROSSED SWORDS*/
-                                                     0, /* U+002695: STAFF OF AESCULAPIUS*/
-                                                     0, /* U+002696: SCALES*/
-                                                     0, /* U+002697: ALEMBIC*/
-                                                     0, /* U+002698: FLOWER*/
-                                                     0, /* U+002699: GEAR*/
-                                                     0, /* U+00269a: STAFF OF HERMES*/
-                                                     0, /* U+00269b: ATOM SYMBOL*/
-                                                     0, /* U+00269c: FLEUR-DE-LIS*/
-                                                     0, /* U+00269d: */
-                                                     0, /* U+00269e: */
-                                                     0, /* U+00269f: */
-                                                     0, /* U+0026a0: WARNING SIGN*/
-                                                     0, /* U+0026a1: HIGH VOLTAGE SIGN*/
-                                                     0, /* U+0026a2: DOUBLED FEMALE SIGN*/
-                                                     0, /* U+0026a3: DOUBLED MALE SIGN*/
-                                                     0, /* U+0026a4: INTERLOCKED FEMALE AND MALE SIGN*/
-                                                     0, /* U+0026a5: MALE AND FEMALE SIGN*/
-                                                     0, /* U+0026a6: MALE WITH STROKE SIGN*/
-                                                     0, /* U+0026a7: MALE WITH STROKE AND MALE AND FEMALE SIGN*/
-                                                     0, /* U+0026a8: VERTICAL MALE WITH STROKE SIGN*/
-                                                     0, /* U+0026a9: HORIZONTAL MALE WITH STROKE SIGN*/
-                                                     0, /* U+0026aa: MEDIUM WHITE CIRCLE*/
-                                                     0, /* U+0026ab: MEDIUM BLACK CIRCLE*/
-                                                     0, /* U+0026ac: MEDIUM SMALL WHITE CIRCLE*/
-                                                     0, /* U+0026ad: MARRIAGE SYMBOL*/
-                                                     0, /* U+0026ae: DIVORCE SYMBOL*/
-                                                     0, /* U+0026af: UNMARRIED PARTNERSHIP SYMBOL*/
-                                                     0, /* U+0026b0: COFFIN*/
-                                                     0, /* U+0026b1: FUNERAL URN*/
-                                                     0, /* U+0026b2: */
-                                                     0, /* U+0026b3: */
-                                                     0, /* U+0026b4: */
-                                                     0, /* U+0026b5: */
-                                                     0, /* U+0026b6: */
-                                                     0, /* U+0026b7: */
-                                                     0, /* U+0026b8: */
-                                                     0, /* U+0026b9: */
-                                                     0, /* U+0026ba: */
-                                                     0, /* U+0026bb: */
-                                                     0, /* U+0026bc: */
-                                                     0, /* U+0026bd: */
-                                                     0, /* U+0026be: */
-                                                     0, /* U+0026bf: */
-                                                     0, /* U+0026c0: */
-                                                     0, /* U+0026c1: */
-                                                     0, /* U+0026c2: */
-                                                     0, /* U+0026c3: */
-                                                     0, /* U+0026c4: */
-                                                     0, /* U+0026c5: */
-                                                     0, /* U+0026c6: */
-                                                     0, /* U+0026c7: */
-                                                     0, /* U+0026c8: */
-                                                     0, /* U+0026c9: */
-                                                     0, /* U+0026ca: */
-                                                     0, /* U+0026cb: */
-                                                     0, /* U+0026cc: */
-                                                     0, /* U+0026cd: */
-                                                     0, /* U+0026ce: */
-                                                     0, /* U+0026cf: */
-                                                     0, /* U+0026d0: */
-                                                     0, /* U+0026d1: */
-                                                     0, /* U+0026d2: */
-                                                     0, /* U+0026d3: */
-                                                     0, /* U+0026d4: */
-                                                     0, /* U+0026d5: */
-                                                     0, /* U+0026d6: */
-                                                     0, /* U+0026d7: */
-                                                     0, /* U+0026d8: */
-                                                     0, /* U+0026d9: */
-                                                     0, /* U+0026da: */
-                                                     0, /* U+0026db: */
-                                                     0, /* U+0026dc: */
-                                                     0, /* U+0026dd: */
-                                                     0, /* U+0026de: */
-                                                     0, /* U+0026df: */
-                                                     0, /* U+0026e0: */
-                                                     0, /* U+0026e1: */
-                                                     0, /* U+0026e2: */
-                                                     0, /* U+0026e3: */
-                                                     0, /* U+0026e4: */
-                                                     0, /* U+0026e5: */
-                                                     0, /* U+0026e6: */
-                                                     0, /* U+0026e7: */
-                                                     0, /* U+0026e8: */
-                                                     0, /* U+0026e9: */
-                                                     0, /* U+0026ea: */
-                                                     0, /* U+0026eb: */
-                                                     0, /* U+0026ec: */
-                                                     0, /* U+0026ed: */
-                                                     0, /* U+0026ee: */
-                                                     0, /* U+0026ef: */
-                                                     0, /* U+0026f0: */
-                                                     0, /* U+0026f1: */
-                                                     0, /* U+0026f2: */
-                                                     0, /* U+0026f3: */
-                                                     0, /* U+0026f4: */
-                                                     0, /* U+0026f5: */
-                                                     0, /* U+0026f6: */
-                                                     0, /* U+0026f7: */
-                                                     0, /* U+0026f8: */
-                                                     0, /* U+0026f9: */
-                                                     0, /* U+0026fa: */
-                                                     0, /* U+0026fb: */
-                                                     0, /* U+0026fc: */
-                                                     0, /* U+0026fd: */
-                                                     0, /* U+0026fe: */
-                                                     0, /* U+0026ff: */
-                                                     0, /* U+002700: */
-                                                     0, /* U+002701: UPPER BLADE SCISSORS*/
-                                                     0, /* U+002702: BLACK SCISSORS*/
-                                                     0, /* U+002703: LOWER BLADE SCISSORS*/
-                                                     0, /* U+002704: WHITE SCISSORS*/
-                                                     0, /* U+002705: */
-                                                     0, /* U+002706: TELEPHONE LOCATION SIGN*/
-                                                     0, /* U+002707: TAPE DRIVE*/
-                                                     0, /* U+002708: AIRPLANE*/
-                                                     0, /* U+002709: ENVELOPE*/
-                                                     0, /* U+00270a: */
-                                                     0, /* U+00270b: */
-                                                     0, /* U+00270c: VICTORY HAND*/
-                                                     0, /* U+00270d: WRITING HAND*/
-                                                     0, /* U+00270e: LOWER RIGHT PENCIL*/
-                                                     0, /* U+00270f: PENCIL*/
-                                                     0, /* U+002710: UPPER RIGHT PENCIL*/
-                                                     0, /* U+002711: WHITE NIB*/
-                                                     0, /* U+002712: BLACK NIB*/
-                                                     0, /* U+002713: CHECK MARK*/
-                                                     0, /* U+002714: HEAVY CHECK MARK*/
-                                                     0, /* U+002715: MULTIPLICATION X*/
-                                                     0, /* U+002716: HEAVY MULTIPLICATION X*/
-                                                     0, /* U+002717: BALLOT X*/
-                                                     0, /* U+002718: HEAVY BALLOT X*/
-                                                     0, /* U+002719: OUTLINED GREEK CROSS*/
-                                                     0, /* U+00271a: HEAVY GREEK CROSS*/
-                                                     0, /* U+00271b: OPEN CENTRE CROSS*/
-                                                     0, /* U+00271c: HEAVY OPEN CENTRE CROSS*/
-                                                     0, /* U+00271d: LATIN CROSS*/
-                                                     0, /* U+00271e: SHADOWED WHITE LATIN CROSS*/
-                                                     0, /* U+00271f: OUTLINED LATIN CROSS*/
-                                                     0, /* U+002720: MALTESE CROSS*/
-                                                     0, /* U+002721: STAR OF DAVID*/
-                                                     0, /* U+002722: FOUR TEARDROP-SPOKED ASTERISK*/
-                                                     0, /* U+002723: FOUR BALLOON-SPOKED ASTERISK*/
-                                                     0, /* U+002724: HEAVY FOUR BALLOON-SPOKED ASTERISK*/
-                                                     0, /* U+002725: FOUR CLUB-SPOKED ASTERISK*/
-                                                     0, /* U+002726: BLACK FOUR POINTED STAR*/
-                                                     0, /* U+002727: WHITE FOUR POINTED STAR*/
-                                                     0, /* U+002728: */
-                                                     0, /* U+002729: STRESS OUTLINED WHITE STAR*/
-                                                     0, /* U+00272a: CIRCLED WHITE STAR*/
-                                                     0, /* U+00272b: OPEN CENTRE BLACK STAR*/
-                                                     0, /* U+00272c: BLACK CENTRE WHITE STAR*/
-                                                     0, /* U+00272d: OUTLINED BLACK STAR*/
-                                                     0, /* U+00272e: HEAVY OUTLINED BLACK STAR*/
-                                                     0, /* U+00272f: PINWHEEL STAR*/
-                                                     0, /* U+002730: SHADOWED WHITE STAR*/
-                                                     0, /* U+002731: HEAVY ASTERISK*/
-                                                     0, /* U+002732: OPEN CENTRE ASTERISK*/
-                                                     0, /* U+002733: EIGHT SPOKED ASTERISK*/
-                                                     0, /* U+002734: EIGHT POINTED BLACK STAR*/
-                                                     0, /* U+002735: EIGHT POINTED PINWHEEL STAR*/
-                                                     0, /* U+002736: SIX POINTED BLACK STAR*/
-                                                     0, /* U+002737: EIGHT POINTED RECTILINEAR BLACK STAR*/
-                                                     0, /* U+002738: HEAVY EIGHT POINTED RECTILINEAR BLACK STAR*/
-                                                     0, /* U+002739: TWELVE POINTED BLACK STAR*/
-                                                     0, /* U+00273a: SIXTEEN POINTED ASTERISK*/
-                                                     0, /* U+00273b: TEARDROP-SPOKED ASTERISK*/
-                                                     0, /* U+00273c: OPEN CENTRE TEARDROP-SPOKED ASTERISK*/
-                                                     0, /* U+00273d: HEAVY TEARDROP-SPOKED ASTERISK*/
-                                                     0, /* U+00273e: SIX PETALLED BLACK AND WHITE FLORETTE*/
-                                                     0, /* U+00273f: BLACK FLORETTE*/
-                                                     0, /* U+002740: WHITE FLORETTE*/
-                                                     0, /* U+002741: EIGHT PETALLED OUTLINED BLACK FLORETTE*/
-                                                     0, /* U+002742: CIRCLED OPEN CENTRE EIGHT POINTED STAR*/
-                                                     0, /* U+002743: HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK*/
-                                                     0, /* U+002744: SNOWFLAKE*/
-                                                     0, /* U+002745: TIGHT TRIFOLIATE SNOWFLAKE*/
-                                                     0, /* U+002746: HEAVY CHEVRON SNOWFLAKE*/
-                                                     0, /* U+002747: SPARKLE*/
-                                                     0, /* U+002748: HEAVY SPARKLE*/
-                                                     0, /* U+002749: BALLOON-SPOKED ASTERISK*/
-                                                     0, /* U+00274a: EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
-                                                     0, /* U+00274b: HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK*/
-                                                     0, /* U+00274c: */
-                                                     0, /* U+00274d: SHADOWED WHITE CIRCLE*/
-                                                     0, /* U+00274e: */
-                                                     0, /* U+00274f: LOWER RIGHT DROP-SHADOWED WHITE SQUARE*/
-                                                     0, /* U+002750: UPPER RIGHT DROP-SHADOWED WHITE SQUARE*/
-                                                     0, /* U+002751: LOWER RIGHT SHADOWED WHITE SQUARE*/
-                                                     0, /* U+002752: UPPER RIGHT SHADOWED WHITE SQUARE*/
-                                                     0, /* U+002753: */
-                                                     0, /* U+002754: */
-                                                     0, /* U+002755: */
-                                                     0, /* U+002756: BLACK DIAMOND MINUS WHITE X*/
-                                                     0, /* U+002757: */
-                                                     0, /* U+002758: LIGHT VERTICAL BAR*/
-                                                     0, /* U+002759: MEDIUM VERTICAL BAR*/
-                                                     0, /* U+00275a: HEAVY VERTICAL BAR*/
-                                                     0, /* U+00275b: HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+00275c: HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+00275d: HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+00275e: HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+00275f: */
-                                                     0, /* U+002760: */
-                                                     0, /* U+002761: CURVED STEM PARAGRAPH SIGN ORNAMENT*/
-                                                     0, /* U+002762: HEAVY EXCLAMATION MARK ORNAMENT*/
-                                                     0, /* U+002763: HEAVY HEART EXCLAMATION MARK ORNAMENT*/
-                                                     0, /* U+002764: HEAVY BLACK HEART*/
-                                                     0, /* U+002765: ROTATED HEAVY BLACK HEART BULLET*/
-                                                     0, /* U+002766: FLORAL HEART*/
-                                                     0, /* U+002767: ROTATED FLORAL HEART BULLET*/
-                                                     0, /* U+002768: MEDIUM LEFT PARENTHESIS ORNAMENT*/
-                                                     0, /* U+002769: MEDIUM RIGHT PARENTHESIS ORNAMENT*/
-                                                     0, /* U+00276a: MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT*/
-                                                     0, /* U+00276b: MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT*/
-                                                     0, /* U+00276c: MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT*/
-                                                     0, /* U+00276d: MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
-                                                     0, /* U+00276e: HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+00276f: HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT*/
-                                                     0, /* U+002770: HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT*/
-                                                     0, /* U+002771: HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT*/
-                                                     0, /* U+002772: LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT*/
-                                                     0, /* U+002773: LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT*/
-                                                     0, /* U+002774: MEDIUM LEFT CURLY BRACKET ORNAMENT*/
-                                                     0, /* U+002775: MEDIUM RIGHT CURLY BRACKET ORNAMENT*/
-                                                     0, /* U+002776: DINGBAT NEGATIVE CIRCLED DIGIT ONE*/
-                                                     0, /* U+002777: DINGBAT NEGATIVE CIRCLED DIGIT TWO*/
-                                                     0, /* U+002778: DINGBAT NEGATIVE CIRCLED DIGIT THREE*/
-                                                     0, /* U+002779: DINGBAT NEGATIVE CIRCLED DIGIT FOUR*/
-                                                     0, /* U+00277a: DINGBAT NEGATIVE CIRCLED DIGIT FIVE*/
-                                                     0, /* U+00277b: DINGBAT NEGATIVE CIRCLED DIGIT SIX*/
-                                                     0, /* U+00277c: DINGBAT NEGATIVE CIRCLED DIGIT SEVEN*/
-                                                     0, /* U+00277d: DINGBAT NEGATIVE CIRCLED DIGIT EIGHT*/
-                                                     0, /* U+00277e: DINGBAT NEGATIVE CIRCLED DIGIT NINE*/
-                                                     0, /* U+00277f: DINGBAT NEGATIVE CIRCLED NUMBER TEN*/
-                                                     0, /* U+002780: DINGBAT CIRCLED SANS-SERIF DIGIT ONE*/
-                                                     0, /* U+002781: DINGBAT CIRCLED SANS-SERIF DIGIT TWO*/
-                                                     0, /* U+002782: DINGBAT CIRCLED SANS-SERIF DIGIT THREE*/
-                                                     0, /* U+002783: DINGBAT CIRCLED SANS-SERIF DIGIT FOUR*/
-                                                     0, /* U+002784: DINGBAT CIRCLED SANS-SERIF DIGIT FIVE*/
-                                                     0, /* U+002785: DINGBAT CIRCLED SANS-SERIF DIGIT SIX*/
-                                                     0, /* U+002786: DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN*/
-                                                     0, /* U+002787: DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT*/
-                                                     0, /* U+002788: DINGBAT CIRCLED SANS-SERIF DIGIT NINE*/
-                                                     0, /* U+002789: DINGBAT CIRCLED SANS-SERIF NUMBER TEN*/
-                                                     0, /* U+00278a: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE*/
-                                                     0, /* U+00278b: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO*/
-                                                     0, /* U+00278c: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE*/
-                                                     0, /* U+00278d: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR*/
-                                                     0, /* U+00278e: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE*/
-                                                     0, /* U+00278f: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX*/
-                                                     0, /* U+002790: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN*/
-                                                     0, /* U+002791: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT*/
-                                                     0, /* U+002792: DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE*/
-                                                     0, /* U+002793: DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN*/
-                                                     0, /* U+002794: HEAVY WIDE-HEADED RIGHTWARDS ARROW*/
-                                                     0, /* U+002795: */
-                                                     0, /* U+002796: */
-                                                     0, /* U+002797: */
-                                                     0, /* U+002798: HEAVY SOUTH EAST ARROW*/
-                                                     0, /* U+002799: HEAVY RIGHTWARDS ARROW*/
-                                                     0, /* U+00279a: HEAVY NORTH EAST ARROW*/
-                                                     0, /* U+00279b: DRAFTING POINT RIGHTWARDS ARROW*/
-                                                     0, /* U+00279c: HEAVY ROUND-TIPPED RIGHTWARDS ARROW*/
-                                                     0, /* U+00279d: TRIANGLE-HEADED RIGHTWARDS ARROW*/
-                                                     0, /* U+00279e: HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW*/
-                                                     0, /* U+00279f: DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a0: HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a1: BLACK RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a2: THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD*/
-                                                     0, /* U+0027a3: THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD*/
-                                                     0, /* U+0027a4: BLACK RIGHTWARDS ARROWHEAD*/
-                                                     0, /* U+0027a5: HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a6: HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a7: SQUAT BLACK RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a8: HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW*/
-                                                     0, /* U+0027a9: RIGHT-SHADED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027aa: LEFT-SHADED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027ab: BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027ac: FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027ad: HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027ae: HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027af: NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b0: */
-                                                     0, /* U+0027b1: NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b2: CIRCLED HEAVY WHITE RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b3: WHITE-FEATHERED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b4: BLACK-FEATHERED SOUTH EAST ARROW*/
-                                                     0, /* U+0027b5: BLACK-FEATHERED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b6: BLACK-FEATHERED NORTH EAST ARROW*/
-                                                     0, /* U+0027b7: HEAVY BLACK-FEATHERED SOUTH EAST ARROW*/
-                                                     0, /* U+0027b8: HEAVY BLACK-FEATHERED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027b9: HEAVY BLACK-FEATHERED NORTH EAST ARROW*/
-                                                     0, /* U+0027ba: TEARDROP-BARBED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027bb: HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027bc: WEDGE-TAILED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027bd: HEAVY WEDGE-TAILED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027be: OPEN-OUTLINED RIGHTWARDS ARROW*/
-                                                     0, /* U+0027bf: */
-                                                     0, /* U+0027c0: THREE DIMENSIONAL ANGLE*/
-                                                     0, /* U+0027c1: WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE*/
-                                                     0, /* U+0027c2: PERPENDICULAR*/
-                                                     0, /* U+0027c3: OPEN SUBSET*/
-                                                     0, /* U+0027c4: OPEN SUPERSET*/
-                                                     0, /* U+0027c5: LEFT S-SHAPED BAG DELIMITER*/
-                                                     0, /* U+0027c6: RIGHT S-SHAPED BAG DELIMITER*/
-                                                     0, /* U+0027c7: */
-                                                     0, /* U+0027c8: */
-                                                     0, /* U+0027c9: */
-                                                     0, /* U+0027ca: */
-                                                     0, /* U+0027cb: */
-                                                     0, /* U+0027cc: */
-                                                     0, /* U+0027cd: */
-                                                     0, /* U+0027ce: */
-                                                     0, /* U+0027cf: */
-                                                     0, /* U+0027d0: WHITE DIAMOND WITH CENTRED DOT*/
-                                                     0, /* U+0027d1: AND WITH DOT*/
-                                                     0, /* U+0027d2: ELEMENT OF OPENING UPWARDS*/
-                                                     0, /* U+0027d3: LOWER RIGHT CORNER WITH DOT*/
-                                                     0, /* U+0027d4: UPPER LEFT CORNER WITH DOT*/
-                                                     0, /* U+0027d5: LEFT OUTER JOIN*/
-                                                     0, /* U+0027d6: RIGHT OUTER JOIN*/
-                                                     0, /* U+0027d7: FULL OUTER JOIN*/
-                                                     0, /* U+0027d8: LARGE UP TACK*/
-                                                     0, /* U+0027d9: LARGE DOWN TACK*/
-                                                     0, /* U+0027da: LEFT AND RIGHT DOUBLE TURNSTILE*/
-                                                     0, /* U+0027db: LEFT AND RIGHT TACK*/
-                                                     0, /* U+0027dc: LEFT MULTIMAP*/
-                                                     0, /* U+0027dd: LONG RIGHT TACK*/
-                                                     0, /* U+0027de: LONG LEFT TACK*/
-                                                     0, /* U+0027df: UP TACK WITH CIRCLE ABOVE*/
-                                                     0, /* U+0027e0: LOZENGE DIVIDED BY HORIZONTAL RULE*/
-                                                     0, /* U+0027e1: WHITE CONCAVE-SIDED DIAMOND*/
-                                                     0, /* U+0027e2: WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK*/
-                                                     0, /* U+0027e3: WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK*/
-                                                     0, /* U+0027e4: WHITE SQUARE WITH LEFTWARDS TICK*/
-                                                     0, /* U+0027e5: WHITE SQUARE WITH RIGHTWARDS TICK*/
-                                                     0, /* U+0027e6: MATHEMATICAL LEFT WHITE SQUARE BRACKET*/
-                                                     0, /* U+0027e7: MATHEMATICAL RIGHT WHITE SQUARE BRACKET*/
-                                                     0, /* U+0027e8: MATHEMATICAL LEFT ANGLE BRACKET*/
-                                                     0, /* U+0027e9: MATHEMATICAL RIGHT ANGLE BRACKET*/
-                                                     0, /* U+0027ea: MATHEMATICAL LEFT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+0027eb: MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+0027ec: */
-                                                     0, /* U+0027ed: */
-                                                     0, /* U+0027ee: */
-                                                     0, /* U+0027ef: */
-                                                     0, /* U+0027f0: UPWARDS QUADRUPLE ARROW*/
-                                                     0, /* U+0027f1: DOWNWARDS QUADRUPLE ARROW*/
-                                                     0, /* U+0027f2: ANTICLOCKWISE GAPPED CIRCLE ARROW*/
-                                                     0, /* U+0027f3: CLOCKWISE GAPPED CIRCLE ARROW*/
-                                                     0, /* U+0027f4: RIGHT ARROW WITH CIRCLED PLUS*/
-                                                     0, /* U+0027f5: LONG LEFTWARDS ARROW*/
-                                                     0, /* U+0027f6: LONG RIGHTWARDS ARROW*/
-                                                     0, /* U+0027f7: LONG LEFT RIGHT ARROW*/
-                                                     0, /* U+0027f8: LONG LEFTWARDS DOUBLE ARROW*/
-                                                     0, /* U+0027f9: LONG RIGHTWARDS DOUBLE ARROW*/
-                                                     0, /* U+0027fa: LONG LEFT RIGHT DOUBLE ARROW*/
-                                                     0, /* U+0027fb: LONG LEFTWARDS ARROW FROM BAR*/
-                                                     0, /* U+0027fc: LONG RIGHTWARDS ARROW FROM BAR*/
-                                                     0, /* U+0027fd: LONG LEFTWARDS DOUBLE ARROW FROM BAR*/
-                                                     0, /* U+0027fe: LONG RIGHTWARDS DOUBLE ARROW FROM BAR*/
-                                                     0, /* U+0027ff: LONG RIGHTWARDS SQUIGGLE ARROW*/
-                                                     0, /* U+002800: BRAILLE PATTERN BLANK*/
-                                                     0, /* U+002801: BRAILLE PATTERN DOTS-1*/
-                                                     0, /* U+002802: BRAILLE PATTERN DOTS-2*/
-                                                     0, /* U+002803: BRAILLE PATTERN DOTS-12*/
-                                                     0, /* U+002804: BRAILLE PATTERN DOTS-3*/
-                                                     0, /* U+002805: BRAILLE PATTERN DOTS-13*/
-                                                     0, /* U+002806: BRAILLE PATTERN DOTS-23*/
-                                                     0, /* U+002807: BRAILLE PATTERN DOTS-123*/
-                                                     0, /* U+002808: BRAILLE PATTERN DOTS-4*/
-                                                     0, /* U+002809: BRAILLE PATTERN DOTS-14*/
-                                                     0, /* U+00280a: BRAILLE PATTERN DOTS-24*/
-                                                     0, /* U+00280b: BRAILLE PATTERN DOTS-124*/
-                                                     0, /* U+00280c: BRAILLE PATTERN DOTS-34*/
-                                                     0, /* U+00280d: BRAILLE PATTERN DOTS-134*/
-                                                     0, /* U+00280e: BRAILLE PATTERN DOTS-234*/
-                                                     0, /* U+00280f: BRAILLE PATTERN DOTS-1234*/
-                                                     0, /* U+002810: BRAILLE PATTERN DOTS-5*/
-                                                     0, /* U+002811: BRAILLE PATTERN DOTS-15*/
-                                                     0, /* U+002812: BRAILLE PATTERN DOTS-25*/
-                                                     0, /* U+002813: BRAILLE PATTERN DOTS-125*/
-                                                     0, /* U+002814: BRAILLE PATTERN DOTS-35*/
-                                                     0, /* U+002815: BRAILLE PATTERN DOTS-135*/
-                                                     0, /* U+002816: BRAILLE PATTERN DOTS-235*/
-                                                     0, /* U+002817: BRAILLE PATTERN DOTS-1235*/
-                                                     0, /* U+002818: BRAILLE PATTERN DOTS-45*/
-                                                     0, /* U+002819: BRAILLE PATTERN DOTS-145*/
-                                                     0, /* U+00281a: BRAILLE PATTERN DOTS-245*/
-                                                     0, /* U+00281b: BRAILLE PATTERN DOTS-1245*/
-                                                     0, /* U+00281c: BRAILLE PATTERN DOTS-345*/
-                                                     0, /* U+00281d: BRAILLE PATTERN DOTS-1345*/
-                                                     0, /* U+00281e: BRAILLE PATTERN DOTS-2345*/
-                                                     0, /* U+00281f: BRAILLE PATTERN DOTS-12345*/
-                                                     0, /* U+002820: BRAILLE PATTERN DOTS-6*/
-                                                     0, /* U+002821: BRAILLE PATTERN DOTS-16*/
-                                                     0, /* U+002822: BRAILLE PATTERN DOTS-26*/
-                                                     0, /* U+002823: BRAILLE PATTERN DOTS-126*/
-                                                     0, /* U+002824: BRAILLE PATTERN DOTS-36*/
-                                                     0, /* U+002825: BRAILLE PATTERN DOTS-136*/
-                                                     0, /* U+002826: BRAILLE PATTERN DOTS-236*/
-                                                     0, /* U+002827: BRAILLE PATTERN DOTS-1236*/
-                                                     0, /* U+002828: BRAILLE PATTERN DOTS-46*/
-                                                     0, /* U+002829: BRAILLE PATTERN DOTS-146*/
-                                                     0, /* U+00282a: BRAILLE PATTERN DOTS-246*/
-                                                     0, /* U+00282b: BRAILLE PATTERN DOTS-1246*/
-                                                     0, /* U+00282c: BRAILLE PATTERN DOTS-346*/
-                                                     0, /* U+00282d: BRAILLE PATTERN DOTS-1346*/
-                                                     0, /* U+00282e: BRAILLE PATTERN DOTS-2346*/
-                                                     0, /* U+00282f: BRAILLE PATTERN DOTS-12346*/
-                                                     0, /* U+002830: BRAILLE PATTERN DOTS-56*/
-                                                     0, /* U+002831: BRAILLE PATTERN DOTS-156*/
-                                                     0, /* U+002832: BRAILLE PATTERN DOTS-256*/
-                                                     0, /* U+002833: BRAILLE PATTERN DOTS-1256*/
-                                                     0, /* U+002834: BRAILLE PATTERN DOTS-356*/
-                                                     0, /* U+002835: BRAILLE PATTERN DOTS-1356*/
-                                                     0, /* U+002836: BRAILLE PATTERN DOTS-2356*/
-                                                     0, /* U+002837: BRAILLE PATTERN DOTS-12356*/
-                                                     0, /* U+002838: BRAILLE PATTERN DOTS-456*/
-                                                     0, /* U+002839: BRAILLE PATTERN DOTS-1456*/
-                                                     0, /* U+00283a: BRAILLE PATTERN DOTS-2456*/
-                                                     0, /* U+00283b: BRAILLE PATTERN DOTS-12456*/
-                                                     0, /* U+00283c: BRAILLE PATTERN DOTS-3456*/
-                                                     0, /* U+00283d: BRAILLE PATTERN DOTS-13456*/
-                                                     0, /* U+00283e: BRAILLE PATTERN DOTS-23456*/
-                                                     0, /* U+00283f: BRAILLE PATTERN DOTS-123456*/
-                                                     0, /* U+002840: BRAILLE PATTERN DOTS-7*/
-                                                     0, /* U+002841: BRAILLE PATTERN DOTS-17*/
-                                                     0, /* U+002842: BRAILLE PATTERN DOTS-27*/
-                                                     0, /* U+002843: BRAILLE PATTERN DOTS-127*/
-                                                     0, /* U+002844: BRAILLE PATTERN DOTS-37*/
-                                                     0, /* U+002845: BRAILLE PATTERN DOTS-137*/
-                                                     0, /* U+002846: BRAILLE PATTERN DOTS-237*/
-                                                     0, /* U+002847: BRAILLE PATTERN DOTS-1237*/
-                                                     0, /* U+002848: BRAILLE PATTERN DOTS-47*/
-                                                     0, /* U+002849: BRAILLE PATTERN DOTS-147*/
-                                                     0, /* U+00284a: BRAILLE PATTERN DOTS-247*/
-                                                     0, /* U+00284b: BRAILLE PATTERN DOTS-1247*/
-                                                     0, /* U+00284c: BRAILLE PATTERN DOTS-347*/
-                                                     0, /* U+00284d: BRAILLE PATTERN DOTS-1347*/
-                                                     0, /* U+00284e: BRAILLE PATTERN DOTS-2347*/
-                                                     0, /* U+00284f: BRAILLE PATTERN DOTS-12347*/
-                                                     0, /* U+002850: BRAILLE PATTERN DOTS-57*/
-                                                     0, /* U+002851: BRAILLE PATTERN DOTS-157*/
-                                                     0, /* U+002852: BRAILLE PATTERN DOTS-257*/
-                                                     0, /* U+002853: BRAILLE PATTERN DOTS-1257*/
-                                                     0, /* U+002854: BRAILLE PATTERN DOTS-357*/
-                                                     0, /* U+002855: BRAILLE PATTERN DOTS-1357*/
-                                                     0, /* U+002856: BRAILLE PATTERN DOTS-2357*/
-                                                     0, /* U+002857: BRAILLE PATTERN DOTS-12357*/
-                                                     0, /* U+002858: BRAILLE PATTERN DOTS-457*/
-                                                     0, /* U+002859: BRAILLE PATTERN DOTS-1457*/
-                                                     0, /* U+00285a: BRAILLE PATTERN DOTS-2457*/
-                                                     0, /* U+00285b: BRAILLE PATTERN DOTS-12457*/
-                                                     0, /* U+00285c: BRAILLE PATTERN DOTS-3457*/
-                                                     0, /* U+00285d: BRAILLE PATTERN DOTS-13457*/
-                                                     0, /* U+00285e: BRAILLE PATTERN DOTS-23457*/
-                                                     0, /* U+00285f: BRAILLE PATTERN DOTS-123457*/
-                                                     0, /* U+002860: BRAILLE PATTERN DOTS-67*/
-                                                     0, /* U+002861: BRAILLE PATTERN DOTS-167*/
-                                                     0, /* U+002862: BRAILLE PATTERN DOTS-267*/
-                                                     0, /* U+002863: BRAILLE PATTERN DOTS-1267*/
-                                                     0, /* U+002864: BRAILLE PATTERN DOTS-367*/
-                                                     0, /* U+002865: BRAILLE PATTERN DOTS-1367*/
-                                                     0, /* U+002866: BRAILLE PATTERN DOTS-2367*/
-                                                     0, /* U+002867: BRAILLE PATTERN DOTS-12367*/
-                                                     0, /* U+002868: BRAILLE PATTERN DOTS-467*/
-                                                     0, /* U+002869: BRAILLE PATTERN DOTS-1467*/
-                                                     0, /* U+00286a: BRAILLE PATTERN DOTS-2467*/
-                                                     0, /* U+00286b: BRAILLE PATTERN DOTS-12467*/
-                                                     0, /* U+00286c: BRAILLE PATTERN DOTS-3467*/
-                                                     0, /* U+00286d: BRAILLE PATTERN DOTS-13467*/
-                                                     0, /* U+00286e: BRAILLE PATTERN DOTS-23467*/
-                                                     0, /* U+00286f: BRAILLE PATTERN DOTS-123467*/
-                                                     0, /* U+002870: BRAILLE PATTERN DOTS-567*/
-                                                     0, /* U+002871: BRAILLE PATTERN DOTS-1567*/
-                                                     0, /* U+002872: BRAILLE PATTERN DOTS-2567*/
-                                                     0, /* U+002873: BRAILLE PATTERN DOTS-12567*/
-                                                     0, /* U+002874: BRAILLE PATTERN DOTS-3567*/
-                                                     0, /* U+002875: BRAILLE PATTERN DOTS-13567*/
-                                                     0, /* U+002876: BRAILLE PATTERN DOTS-23567*/
-                                                     0, /* U+002877: BRAILLE PATTERN DOTS-123567*/
-                                                     0, /* U+002878: BRAILLE PATTERN DOTS-4567*/
-                                                     0, /* U+002879: BRAILLE PATTERN DOTS-14567*/
-                                                     0, /* U+00287a: BRAILLE PATTERN DOTS-24567*/
-                                                     0, /* U+00287b: BRAILLE PATTERN DOTS-124567*/
-                                                     0, /* U+00287c: BRAILLE PATTERN DOTS-34567*/
-                                                     0, /* U+00287d: BRAILLE PATTERN DOTS-134567*/
-                                                     0, /* U+00287e: BRAILLE PATTERN DOTS-234567*/
-                                                     0, /* U+00287f: BRAILLE PATTERN DOTS-1234567*/
-                                                     0, /* U+002880: BRAILLE PATTERN DOTS-8*/
-                                                     0, /* U+002881: BRAILLE PATTERN DOTS-18*/
-                                                     0, /* U+002882: BRAILLE PATTERN DOTS-28*/
-                                                     0, /* U+002883: BRAILLE PATTERN DOTS-128*/
-                                                     0, /* U+002884: BRAILLE PATTERN DOTS-38*/
-                                                     0, /* U+002885: BRAILLE PATTERN DOTS-138*/
-                                                     0, /* U+002886: BRAILLE PATTERN DOTS-238*/
-                                                     0, /* U+002887: BRAILLE PATTERN DOTS-1238*/
-                                                     0, /* U+002888: BRAILLE PATTERN DOTS-48*/
-                                                     0, /* U+002889: BRAILLE PATTERN DOTS-148*/
-                                                     0, /* U+00288a: BRAILLE PATTERN DOTS-248*/
-                                                     0, /* U+00288b: BRAILLE PATTERN DOTS-1248*/
-                                                     0, /* U+00288c: BRAILLE PATTERN DOTS-348*/
-                                                     0, /* U+00288d: BRAILLE PATTERN DOTS-1348*/
-                                                     0, /* U+00288e: BRAILLE PATTERN DOTS-2348*/
-                                                     0, /* U+00288f: BRAILLE PATTERN DOTS-12348*/
-                                                     0, /* U+002890: BRAILLE PATTERN DOTS-58*/
-                                                     0, /* U+002891: BRAILLE PATTERN DOTS-158*/
-                                                     0, /* U+002892: BRAILLE PATTERN DOTS-258*/
-                                                     0, /* U+002893: BRAILLE PATTERN DOTS-1258*/
-                                                     0, /* U+002894: BRAILLE PATTERN DOTS-358*/
-                                                     0, /* U+002895: BRAILLE PATTERN DOTS-1358*/
-                                                     0, /* U+002896: BRAILLE PATTERN DOTS-2358*/
-                                                     0, /* U+002897: BRAILLE PATTERN DOTS-12358*/
-                                                     0, /* U+002898: BRAILLE PATTERN DOTS-458*/
-                                                     0, /* U+002899: BRAILLE PATTERN DOTS-1458*/
-                                                     0, /* U+00289a: BRAILLE PATTERN DOTS-2458*/
-                                                     0, /* U+00289b: BRAILLE PATTERN DOTS-12458*/
-                                                     0, /* U+00289c: BRAILLE PATTERN DOTS-3458*/
-                                                     0, /* U+00289d: BRAILLE PATTERN DOTS-13458*/
-                                                     0, /* U+00289e: BRAILLE PATTERN DOTS-23458*/
-                                                     0, /* U+00289f: BRAILLE PATTERN DOTS-123458*/
-                                                     0, /* U+0028a0: BRAILLE PATTERN DOTS-68*/
-                                                     0, /* U+0028a1: BRAILLE PATTERN DOTS-168*/
-                                                     0, /* U+0028a2: BRAILLE PATTERN DOTS-268*/
-                                                     0, /* U+0028a3: BRAILLE PATTERN DOTS-1268*/
-                                                     0, /* U+0028a4: BRAILLE PATTERN DOTS-368*/
-                                                     0, /* U+0028a5: BRAILLE PATTERN DOTS-1368*/
-                                                     0, /* U+0028a6: BRAILLE PATTERN DOTS-2368*/
-                                                     0, /* U+0028a7: BRAILLE PATTERN DOTS-12368*/
-                                                     0, /* U+0028a8: BRAILLE PATTERN DOTS-468*/
-                                                     0, /* U+0028a9: BRAILLE PATTERN DOTS-1468*/
-                                                     0, /* U+0028aa: BRAILLE PATTERN DOTS-2468*/
-                                                     0, /* U+0028ab: BRAILLE PATTERN DOTS-12468*/
-                                                     0, /* U+0028ac: BRAILLE PATTERN DOTS-3468*/
-                                                     0, /* U+0028ad: BRAILLE PATTERN DOTS-13468*/
-                                                     0, /* U+0028ae: BRAILLE PATTERN DOTS-23468*/
-                                                     0, /* U+0028af: BRAILLE PATTERN DOTS-123468*/
-                                                     0, /* U+0028b0: BRAILLE PATTERN DOTS-568*/
-                                                     0, /* U+0028b1: BRAILLE PATTERN DOTS-1568*/
-                                                     0, /* U+0028b2: BRAILLE PATTERN DOTS-2568*/
-                                                     0, /* U+0028b3: BRAILLE PATTERN DOTS-12568*/
-                                                     0, /* U+0028b4: BRAILLE PATTERN DOTS-3568*/
-                                                     0, /* U+0028b5: BRAILLE PATTERN DOTS-13568*/
-                                                     0, /* U+0028b6: BRAILLE PATTERN DOTS-23568*/
-                                                     0, /* U+0028b7: BRAILLE PATTERN DOTS-123568*/
-                                                     0, /* U+0028b8: BRAILLE PATTERN DOTS-4568*/
-                                                     0, /* U+0028b9: BRAILLE PATTERN DOTS-14568*/
-                                                     0, /* U+0028ba: BRAILLE PATTERN DOTS-24568*/
-                                                     0, /* U+0028bb: BRAILLE PATTERN DOTS-124568*/
-                                                     0, /* U+0028bc: BRAILLE PATTERN DOTS-34568*/
-                                                     0, /* U+0028bd: BRAILLE PATTERN DOTS-134568*/
-                                                     0, /* U+0028be: BRAILLE PATTERN DOTS-234568*/
-                                                     0, /* U+0028bf: BRAILLE PATTERN DOTS-1234568*/
-                                                     0, /* U+0028c0: BRAILLE PATTERN DOTS-78*/
-                                                     0, /* U+0028c1: BRAILLE PATTERN DOTS-178*/
-                                                     0, /* U+0028c2: BRAILLE PATTERN DOTS-278*/
-                                                     0, /* U+0028c3: BRAILLE PATTERN DOTS-1278*/
-                                                     0, /* U+0028c4: BRAILLE PATTERN DOTS-378*/
-                                                     0, /* U+0028c5: BRAILLE PATTERN DOTS-1378*/
-                                                     0, /* U+0028c6: BRAILLE PATTERN DOTS-2378*/
-                                                     0, /* U+0028c7: BRAILLE PATTERN DOTS-12378*/
-                                                     0, /* U+0028c8: BRAILLE PATTERN DOTS-478*/
-                                                     0, /* U+0028c9: BRAILLE PATTERN DOTS-1478*/
-                                                     0, /* U+0028ca: BRAILLE PATTERN DOTS-2478*/
-                                                     0, /* U+0028cb: BRAILLE PATTERN DOTS-12478*/
-                                                     0, /* U+0028cc: BRAILLE PATTERN DOTS-3478*/
-                                                     0, /* U+0028cd: BRAILLE PATTERN DOTS-13478*/
-                                                     0, /* U+0028ce: BRAILLE PATTERN DOTS-23478*/
-                                                     0, /* U+0028cf: BRAILLE PATTERN DOTS-123478*/
-                                                     0, /* U+0028d0: BRAILLE PATTERN DOTS-578*/
-                                                     0, /* U+0028d1: BRAILLE PATTERN DOTS-1578*/
-                                                     0, /* U+0028d2: BRAILLE PATTERN DOTS-2578*/
-                                                     0, /* U+0028d3: BRAILLE PATTERN DOTS-12578*/
-                                                     0, /* U+0028d4: BRAILLE PATTERN DOTS-3578*/
-                                                     0, /* U+0028d5: BRAILLE PATTERN DOTS-13578*/
-                                                     0, /* U+0028d6: BRAILLE PATTERN DOTS-23578*/
-                                                     0, /* U+0028d7: BRAILLE PATTERN DOTS-123578*/
-                                                     0, /* U+0028d8: BRAILLE PATTERN DOTS-4578*/
-                                                     0, /* U+0028d9: BRAILLE PATTERN DOTS-14578*/
-                                                     0, /* U+0028da: BRAILLE PATTERN DOTS-24578*/
-                                                     0, /* U+0028db: BRAILLE PATTERN DOTS-124578*/
-                                                     0, /* U+0028dc: BRAILLE PATTERN DOTS-34578*/
-                                                     0, /* U+0028dd: BRAILLE PATTERN DOTS-134578*/
-                                                     0, /* U+0028de: BRAILLE PATTERN DOTS-234578*/
-                                                     0, /* U+0028df: BRAILLE PATTERN DOTS-1234578*/
-                                                     0, /* U+0028e0: BRAILLE PATTERN DOTS-678*/
-                                                     0, /* U+0028e1: BRAILLE PATTERN DOTS-1678*/
-                                                     0, /* U+0028e2: BRAILLE PATTERN DOTS-2678*/
-                                                     0, /* U+0028e3: BRAILLE PATTERN DOTS-12678*/
-                                                     0, /* U+0028e4: BRAILLE PATTERN DOTS-3678*/
-                                                     0, /* U+0028e5: BRAILLE PATTERN DOTS-13678*/
-                                                     0, /* U+0028e6: BRAILLE PATTERN DOTS-23678*/
-                                                     0, /* U+0028e7: BRAILLE PATTERN DOTS-123678*/
-                                                     0, /* U+0028e8: BRAILLE PATTERN DOTS-4678*/
-                                                     0, /* U+0028e9: BRAILLE PATTERN DOTS-14678*/
-                                                     0, /* U+0028ea: BRAILLE PATTERN DOTS-24678*/
-                                                     0, /* U+0028eb: BRAILLE PATTERN DOTS-124678*/
-                                                     0, /* U+0028ec: BRAILLE PATTERN DOTS-34678*/
-                                                     0, /* U+0028ed: BRAILLE PATTERN DOTS-134678*/
-                                                     0, /* U+0028ee: BRAILLE PATTERN DOTS-234678*/
-                                                     0, /* U+0028ef: BRAILLE PATTERN DOTS-1234678*/
-                                                     0, /* U+0028f0: BRAILLE PATTERN DOTS-5678*/
-                                                     0, /* U+0028f1: BRAILLE PATTERN DOTS-15678*/
-                                                     0, /* U+0028f2: BRAILLE PATTERN DOTS-25678*/
-                                                     0, /* U+0028f3: BRAILLE PATTERN DOTS-125678*/
-                                                     0, /* U+0028f4: BRAILLE PATTERN DOTS-35678*/
-                                                     0, /* U+0028f5: BRAILLE PATTERN DOTS-135678*/
-                                                     0, /* U+0028f6: BRAILLE PATTERN DOTS-235678*/
-                                                     0, /* U+0028f7: BRAILLE PATTERN DOTS-1235678*/
-                                                     0, /* U+0028f8: BRAILLE PATTERN DOTS-45678*/
-                                                     0, /* U+0028f9: BRAILLE PATTERN DOTS-145678*/
-                                                     0, /* U+0028fa: BRAILLE PATTERN DOTS-245678*/
-                                                     0, /* U+0028fb: BRAILLE PATTERN DOTS-1245678*/
-                                                     0, /* U+0028fc: BRAILLE PATTERN DOTS-345678*/
-                                                     0, /* U+0028fd: BRAILLE PATTERN DOTS-1345678*/
-                                                     0, /* U+0028fe: BRAILLE PATTERN DOTS-2345678*/
-                                                     0, /* U+0028ff: BRAILLE PATTERN DOTS-12345678*/
-                                                     0, /* U+002900: RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+002901: RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+002902: LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+002903: RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+002904: LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE*/
-                                                     0, /* U+002905: RIGHTWARDS TWO-HEADED ARROW FROM BAR*/
-                                                     0, /* U+002906: LEFTWARDS DOUBLE ARROW FROM BAR*/
-                                                     0, /* U+002907: RIGHTWARDS DOUBLE ARROW FROM BAR*/
-                                                     0, /* U+002908: DOWNWARDS ARROW WITH HORIZONTAL STROKE*/
-                                                     0, /* U+002909: UPWARDS ARROW WITH HORIZONTAL STROKE*/
-                                                     0, /* U+00290a: UPWARDS TRIPLE ARROW*/
-                                                     0, /* U+00290b: DOWNWARDS TRIPLE ARROW*/
-                                                     0, /* U+00290c: LEFTWARDS DOUBLE DASH ARROW*/
-                                                     0, /* U+00290d: RIGHTWARDS DOUBLE DASH ARROW*/
-                                                     0, /* U+00290e: LEFTWARDS TRIPLE DASH ARROW*/
-                                                     0, /* U+00290f: RIGHTWARDS TRIPLE DASH ARROW*/
-                                                     0, /* U+002910: RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW*/
-                                                     0, /* U+002911: RIGHTWARDS ARROW WITH DOTTED STEM*/
-                                                     0, /* U+002912: UPWARDS ARROW TO BAR*/
-                                                     0, /* U+002913: DOWNWARDS ARROW TO BAR*/
-                                                     0, /* U+002914: RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE*/
-                                                     0, /* U+002915: RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+002916: RIGHTWARDS TWO-HEADED ARROW WITH TAIL*/
-                                                     0, /* U+002917: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE*/
-                                                     0, /* U+002918: RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+002919: LEFTWARDS ARROW-TAIL*/
-                                                     0, /* U+00291a: RIGHTWARDS ARROW-TAIL*/
-                                                     0, /* U+00291b: LEFTWARDS DOUBLE ARROW-TAIL*/
-                                                     0, /* U+00291c: RIGHTWARDS DOUBLE ARROW-TAIL*/
-                                                     0, /* U+00291d: LEFTWARDS ARROW TO BLACK DIAMOND*/
-                                                     0, /* U+00291e: RIGHTWARDS ARROW TO BLACK DIAMOND*/
-                                                     0, /* U+00291f: LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
-                                                     0, /* U+002920: RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND*/
-                                                     0, /* U+002921: NORTH WEST AND SOUTH EAST ARROW*/
-                                                     0, /* U+002922: NORTH EAST AND SOUTH WEST ARROW*/
-                                                     0, /* U+002923: NORTH WEST ARROW WITH HOOK*/
-                                                     0, /* U+002924: NORTH EAST ARROW WITH HOOK*/
-                                                     0, /* U+002925: SOUTH EAST ARROW WITH HOOK*/
-                                                     0, /* U+002926: SOUTH WEST ARROW WITH HOOK*/
-                                                     0, /* U+002927: NORTH WEST ARROW AND NORTH EAST ARROW*/
-                                                     0, /* U+002928: NORTH EAST ARROW AND SOUTH EAST ARROW*/
-                                                     0, /* U+002929: SOUTH EAST ARROW AND SOUTH WEST ARROW*/
-                                                     0, /* U+00292a: SOUTH WEST ARROW AND NORTH WEST ARROW*/
-                                                     0, /* U+00292b: RISING DIAGONAL CROSSING FALLING DIAGONAL*/
-                                                     0, /* U+00292c: FALLING DIAGONAL CROSSING RISING DIAGONAL*/
-                                                     0, /* U+00292d: SOUTH EAST ARROW CROSSING NORTH EAST ARROW*/
-                                                     0, /* U+00292e: NORTH EAST ARROW CROSSING SOUTH EAST ARROW*/
-                                                     0, /* U+00292f: FALLING DIAGONAL CROSSING NORTH EAST ARROW*/
-                                                     0, /* U+002930: RISING DIAGONAL CROSSING SOUTH EAST ARROW*/
-                                                     0, /* U+002931: NORTH EAST ARROW CROSSING NORTH WEST ARROW*/
-                                                     0, /* U+002932: NORTH WEST ARROW CROSSING NORTH EAST ARROW*/
-                                                     0, /* U+002933: WAVE ARROW POINTING DIRECTLY RIGHT*/
-                                                     0, /* U+002934: ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS*/
-                                                     0, /* U+002935: ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS*/
-                                                     0, /* U+002936: ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS*/
-                                                     0, /* U+002937: ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS*/
-                                                     0, /* U+002938: RIGHT-SIDE ARC CLOCKWISE ARROW*/
-                                                     0, /* U+002939: LEFT-SIDE ARC ANTICLOCKWISE ARROW*/
-                                                     0, /* U+00293a: TOP ARC ANTICLOCKWISE ARROW*/
-                                                     0, /* U+00293b: BOTTOM ARC ANTICLOCKWISE ARROW*/
-                                                     0, /* U+00293c: TOP ARC CLOCKWISE ARROW WITH MINUS*/
-                                                     0, /* U+00293d: TOP ARC ANTICLOCKWISE ARROW WITH PLUS*/
-                                                     0, /* U+00293e: LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW*/
-                                                     0, /* U+00293f: LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW*/
-                                                     0, /* U+002940: ANTICLOCKWISE CLOSED CIRCLE ARROW*/
-                                                     0, /* U+002941: CLOCKWISE CLOSED CIRCLE ARROW*/
-                                                     0, /* U+002942: RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW*/
-                                                     0, /* U+002943: LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW*/
-                                                     0, /* U+002944: SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW*/
-                                                     0, /* U+002945: RIGHTWARDS ARROW WITH PLUS BELOW*/
-                                                     0, /* U+002946: LEFTWARDS ARROW WITH PLUS BELOW*/
-                                                     0, /* U+002947: RIGHTWARDS ARROW THROUGH X*/
-                                                     0, /* U+002948: LEFT RIGHT ARROW THROUGH SMALL CIRCLE*/
-                                                     0, /* U+002949: UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE*/
-                                                     0, /* U+00294a: LEFT BARB UP RIGHT BARB DOWN HARPOON*/
-                                                     0, /* U+00294b: LEFT BARB DOWN RIGHT BARB UP HARPOON*/
-                                                     0, /* U+00294c: UP BARB RIGHT DOWN BARB LEFT HARPOON*/
-                                                     0, /* U+00294d: UP BARB LEFT DOWN BARB RIGHT HARPOON*/
-                                                     0, /* U+00294e: LEFT BARB UP RIGHT BARB UP HARPOON*/
-                                                     0, /* U+00294f: UP BARB RIGHT DOWN BARB RIGHT HARPOON*/
-                                                     0, /* U+002950: LEFT BARB DOWN RIGHT BARB DOWN HARPOON*/
-                                                     0, /* U+002951: UP BARB LEFT DOWN BARB LEFT HARPOON*/
-                                                     0, /* U+002952: LEFTWARDS HARPOON WITH BARB UP TO BAR*/
-                                                     0, /* U+002953: RIGHTWARDS HARPOON WITH BARB UP TO BAR*/
-                                                     0, /* U+002954: UPWARDS HARPOON WITH BARB RIGHT TO BAR*/
-                                                     0, /* U+002955: DOWNWARDS HARPOON WITH BARB RIGHT TO BAR*/
-                                                     0, /* U+002956: LEFTWARDS HARPOON WITH BARB DOWN TO BAR*/
-                                                     0, /* U+002957: RIGHTWARDS HARPOON WITH BARB DOWN TO BAR*/
-                                                     0, /* U+002958: UPWARDS HARPOON WITH BARB LEFT TO BAR*/
-                                                     0, /* U+002959: DOWNWARDS HARPOON WITH BARB LEFT TO BAR*/
-                                                     0, /* U+00295a: LEFTWARDS HARPOON WITH BARB UP FROM BAR*/
-                                                     0, /* U+00295b: RIGHTWARDS HARPOON WITH BARB UP FROM BAR*/
-                                                     0, /* U+00295c: UPWARDS HARPOON WITH BARB RIGHT FROM BAR*/
-                                                     0, /* U+00295d: DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR*/
-                                                     0, /* U+00295e: LEFTWARDS HARPOON WITH BARB DOWN FROM BAR*/
-                                                     0, /* U+00295f: RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR*/
-                                                     0, /* U+002960: UPWARDS HARPOON WITH BARB LEFT FROM BAR*/
-                                                     0, /* U+002961: DOWNWARDS HARPOON WITH BARB LEFT FROM BAR*/
-                                                     0, /* U+002962: LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
-                                                     0, /* U+002963: UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
-                                                     0, /* U+002964: RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
-                                                     0, /* U+002965: DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
-                                                     0, /* U+002966: LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP*/
-                                                     0, /* U+002967: LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN*/
-                                                     0, /* U+002968: RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP*/
-                                                     0, /* U+002969: RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN*/
-                                                     0, /* U+00296a: LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
-                                                     0, /* U+00296b: LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
-                                                     0, /* U+00296c: RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH*/
-                                                     0, /* U+00296d: RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH*/
-                                                     0, /* U+00296e: UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT*/
-                                                     0, /* U+00296f: DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT*/
-                                                     0, /* U+002970: RIGHT DOUBLE ARROW WITH ROUNDED HEAD*/
-                                                     0, /* U+002971: EQUALS SIGN ABOVE RIGHTWARDS ARROW*/
-                                                     0, /* U+002972: TILDE OPERATOR ABOVE RIGHTWARDS ARROW*/
-                                                     0, /* U+002973: LEFTWARDS ARROW ABOVE TILDE OPERATOR*/
-                                                     0, /* U+002974: RIGHTWARDS ARROW ABOVE TILDE OPERATOR*/
-                                                     0, /* U+002975: RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO*/
-                                                     0, /* U+002976: LESS-THAN ABOVE LEFTWARDS ARROW*/
-                                                     0, /* U+002977: LEFTWARDS ARROW THROUGH LESS-THAN*/
-                                                     0, /* U+002978: GREATER-THAN ABOVE RIGHTWARDS ARROW*/
-                                                     0, /* U+002979: SUBSET ABOVE RIGHTWARDS ARROW*/
-                                                     0, /* U+00297a: LEFTWARDS ARROW THROUGH SUBSET*/
-                                                     0, /* U+00297b: SUPERSET ABOVE LEFTWARDS ARROW*/
-                                                     0, /* U+00297c: LEFT FISH TAIL*/
-                                                     0, /* U+00297d: RIGHT FISH TAIL*/
-                                                     0, /* U+00297e: UP FISH TAIL*/
-                                                     0, /* U+00297f: DOWN FISH TAIL*/
-                                                     0, /* U+002980: TRIPLE VERTICAL BAR DELIMITER*/
-                                                     0, /* U+002981: Z NOTATION SPOT*/
-                                                     0, /* U+002982: Z NOTATION TYPE COLON*/
-                                                     0, /* U+002983: LEFT WHITE CURLY BRACKET*/
-                                                     0, /* U+002984: RIGHT WHITE CURLY BRACKET*/
-                                                     0, /* U+002985: LEFT WHITE PARENTHESIS*/
-                                                     0, /* U+002986: RIGHT WHITE PARENTHESIS*/
-                                                     0, /* U+002987: Z NOTATION LEFT IMAGE BRACKET*/
-                                                     0, /* U+002988: Z NOTATION RIGHT IMAGE BRACKET*/
-                                                     0, /* U+002989: Z NOTATION LEFT BINDING BRACKET*/
-                                                     0, /* U+00298a: Z NOTATION RIGHT BINDING BRACKET*/
-                                                     0, /* U+00298b: LEFT SQUARE BRACKET WITH UNDERBAR*/
-                                                     0, /* U+00298c: RIGHT SQUARE BRACKET WITH UNDERBAR*/
-                                                     0, /* U+00298d: LEFT SQUARE BRACKET WITH TICK IN TOP CORNER*/
-                                                     0, /* U+00298e: RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
-                                                     0, /* U+00298f: LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER*/
-                                                     0, /* U+002990: RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER*/
-                                                     0, /* U+002991: LEFT ANGLE BRACKET WITH DOT*/
-                                                     0, /* U+002992: RIGHT ANGLE BRACKET WITH DOT*/
-                                                     0, /* U+002993: LEFT ARC LESS-THAN BRACKET*/
-                                                     0, /* U+002994: RIGHT ARC GREATER-THAN BRACKET*/
-                                                     0, /* U+002995: DOUBLE LEFT ARC GREATER-THAN BRACKET*/
-                                                     0, /* U+002996: DOUBLE RIGHT ARC LESS-THAN BRACKET*/
-                                                     0, /* U+002997: LEFT BLACK TORTOISE SHELL BRACKET*/
-                                                     0, /* U+002998: RIGHT BLACK TORTOISE SHELL BRACKET*/
-                                                     0, /* U+002999: DOTTED FENCE*/
-                                                     0, /* U+00299a: VERTICAL ZIGZAG LINE*/
-                                                     0, /* U+00299b: MEASURED ANGLE OPENING LEFT*/
-                                                     0, /* U+00299c: RIGHT ANGLE VARIANT WITH SQUARE*/
-                                                     0, /* U+00299d: MEASURED RIGHT ANGLE WITH DOT*/
-                                                     0, /* U+00299e: ANGLE WITH S INSIDE*/
-                                                     0, /* U+00299f: ACUTE ANGLE*/
-                                                     0, /* U+0029a0: SPHERICAL ANGLE OPENING LEFT*/
-                                                     0, /* U+0029a1: SPHERICAL ANGLE OPENING UP*/
-                                                     0, /* U+0029a2: TURNED ANGLE*/
-                                                     0, /* U+0029a3: REVERSED ANGLE*/
-                                                     0, /* U+0029a4: ANGLE WITH UNDERBAR*/
-                                                     0, /* U+0029a5: REVERSED ANGLE WITH UNDERBAR*/
-                                                     0, /* U+0029a6: OBLIQUE ANGLE OPENING UP*/
-                                                     0, /* U+0029a7: OBLIQUE ANGLE OPENING DOWN*/
-                                                     0, /* U+0029a8: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT*/
-                                                     0, /* U+0029a9: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT*/
-                                                     0, /* U+0029aa: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT*/
-                                                     0, /* U+0029ab: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT*/
-                                                     0, /* U+0029ac: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP*/
-                                                     0, /* U+0029ad: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP*/
-                                                     0, /* U+0029ae: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN*/
-                                                     0, /* U+0029af: MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN*/
-                                                     0, /* U+0029b0: REVERSED EMPTY SET*/
-                                                     0, /* U+0029b1: EMPTY SET WITH OVERBAR*/
-                                                     0, /* U+0029b2: EMPTY SET WITH SMALL CIRCLE ABOVE*/
-                                                     0, /* U+0029b3: EMPTY SET WITH RIGHT ARROW ABOVE*/
-                                                     0, /* U+0029b4: EMPTY SET WITH LEFT ARROW ABOVE*/
-                                                     0, /* U+0029b5: CIRCLE WITH HORIZONTAL BAR*/
-                                                     0, /* U+0029b6: CIRCLED VERTICAL BAR*/
-                                                     0, /* U+0029b7: CIRCLED PARALLEL*/
-                                                     0, /* U+0029b8: CIRCLED REVERSE SOLIDUS*/
-                                                     0, /* U+0029b9: CIRCLED PERPENDICULAR*/
-                                                     0, /* U+0029ba: CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR*/
-                                                     0, /* U+0029bb: CIRCLE WITH SUPERIMPOSED X*/
-                                                     0, /* U+0029bc: CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN*/
-                                                     0, /* U+0029bd: UP ARROW THROUGH CIRCLE*/
-                                                     0, /* U+0029be: CIRCLED WHITE BULLET*/
-                                                     0, /* U+0029bf: CIRCLED BULLET*/
-                                                     0, /* U+0029c0: CIRCLED LESS-THAN*/
-                                                     0, /* U+0029c1: CIRCLED GREATER-THAN*/
-                                                     0, /* U+0029c2: CIRCLE WITH SMALL CIRCLE TO THE RIGHT*/
-                                                     0, /* U+0029c3: CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT*/
-                                                     0, /* U+0029c4: SQUARED RISING DIAGONAL SLASH*/
-                                                     0, /* U+0029c5: SQUARED FALLING DIAGONAL SLASH*/
-                                                     0, /* U+0029c6: SQUARED ASTERISK*/
-                                                     0, /* U+0029c7: SQUARED SMALL CIRCLE*/
-                                                     0, /* U+0029c8: SQUARED SQUARE*/
-                                                     0, /* U+0029c9: TWO JOINED SQUARES*/
-                                                     0, /* U+0029ca: TRIANGLE WITH DOT ABOVE*/
-                                                     0, /* U+0029cb: TRIANGLE WITH UNDERBAR*/
-                                                     0, /* U+0029cc: S IN TRIANGLE*/
-                                                     0, /* U+0029cd: TRIANGLE WITH SERIFS AT BOTTOM*/
-                                                     0, /* U+0029ce: RIGHT TRIANGLE ABOVE LEFT TRIANGLE*/
-                                                     0, /* U+0029cf: LEFT TRIANGLE BESIDE VERTICAL BAR*/
-                                                     0, /* U+0029d0: VERTICAL BAR BESIDE RIGHT TRIANGLE*/
-                                                     0, /* U+0029d1: BOWTIE WITH LEFT HALF BLACK*/
-                                                     0, /* U+0029d2: BOWTIE WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0029d3: BLACK BOWTIE*/
-                                                     0, /* U+0029d4: TIMES WITH LEFT HALF BLACK*/
-                                                     0, /* U+0029d5: TIMES WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0029d6: WHITE HOURGLASS*/
-                                                     0, /* U+0029d7: BLACK HOURGLASS*/
-                                                     0, /* U+0029d8: LEFT WIGGLY FENCE*/
-                                                     0, /* U+0029d9: RIGHT WIGGLY FENCE*/
-                                                     0, /* U+0029da: LEFT DOUBLE WIGGLY FENCE*/
-                                                     0, /* U+0029db: RIGHT DOUBLE WIGGLY FENCE*/
-                                                     0, /* U+0029dc: INCOMPLETE INFINITY*/
-                                                     0, /* U+0029dd: TIE OVER INFINITY*/
-                                                     0, /* U+0029de: INFINITY NEGATED WITH VERTICAL BAR*/
-                                                     0, /* U+0029df: DOUBLE-ENDED MULTIMAP*/
-                                                     0, /* U+0029e0: SQUARE WITH CONTOURED OUTLINE*/
-                                                     0, /* U+0029e1: INCREASES AS*/
-                                                     0, /* U+0029e2: SHUFFLE PRODUCT*/
-                                                     0, /* U+0029e3: EQUALS SIGN AND SLANTED PARALLEL*/
-                                                     0, /* U+0029e4: EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE*/
-                                                     0, /* U+0029e5: IDENTICAL TO AND SLANTED PARALLEL*/
-                                                     0, /* U+0029e6: GLEICH STARK*/
-                                                     0, /* U+0029e7: THERMODYNAMIC*/
-                                                     0, /* U+0029e8: DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK*/
-                                                     0, /* U+0029e9: DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK*/
-                                                     0, /* U+0029ea: BLACK DIAMOND WITH DOWN ARROW*/
-                                                     0, /* U+0029eb: BLACK LOZENGE*/
-                                                     0, /* U+0029ec: WHITE CIRCLE WITH DOWN ARROW*/
-                                                     0, /* U+0029ed: BLACK CIRCLE WITH DOWN ARROW*/
-                                                     0, /* U+0029ee: ERROR-BARRED WHITE SQUARE*/
-                                                     0, /* U+0029ef: ERROR-BARRED BLACK SQUARE*/
-                                                     0, /* U+0029f0: ERROR-BARRED WHITE DIAMOND*/
-                                                     0, /* U+0029f1: ERROR-BARRED BLACK DIAMOND*/
-                                                     0, /* U+0029f2: ERROR-BARRED WHITE CIRCLE*/
-                                                     0, /* U+0029f3: ERROR-BARRED BLACK CIRCLE*/
-                                                     0, /* U+0029f4: RULE-DELAYED*/
-                                                     0, /* U+0029f5: REVERSE SOLIDUS OPERATOR*/
-                                                     0, /* U+0029f6: SOLIDUS WITH OVERBAR*/
-                                                     0, /* U+0029f7: REVERSE SOLIDUS WITH HORIZONTAL STROKE*/
-                                                     0, /* U+0029f8: BIG SOLIDUS*/
-                                                     0, /* U+0029f9: BIG REVERSE SOLIDUS*/
-                                                     0, /* U+0029fa: DOUBLE PLUS*/
-                                                     0, /* U+0029fb: TRIPLE PLUS*/
-                                                     0, /* U+0029fc: LEFT-POINTING CURVED ANGLE BRACKET*/
-                                                     0, /* U+0029fd: RIGHT-POINTING CURVED ANGLE BRACKET*/
-                                                     0, /* U+0029fe: TINY*/
-                                                     0, /* U+0029ff: MINY*/
-                                                     0, /* U+002a00: N-ARY CIRCLED DOT OPERATOR*/
-                                                     0, /* U+002a01: N-ARY CIRCLED PLUS OPERATOR*/
-                                                     0, /* U+002a02: N-ARY CIRCLED TIMES OPERATOR*/
-                                                     0, /* U+002a03: N-ARY UNION OPERATOR WITH DOT*/
-                                                     0, /* U+002a04: N-ARY UNION OPERATOR WITH PLUS*/
-                                                     0, /* U+002a05: N-ARY SQUARE INTERSECTION OPERATOR*/
-                                                     0, /* U+002a06: N-ARY SQUARE UNION OPERATOR*/
-                                                     0, /* U+002a07: TWO LOGICAL AND OPERATOR*/
-                                                     0, /* U+002a08: TWO LOGICAL OR OPERATOR*/
-                                                     0, /* U+002a09: N-ARY TIMES OPERATOR*/
-                                                     0, /* U+002a0a: MODULO TWO SUM*/
-                                                     0, /* U+002a0b: SUMMATION WITH INTEGRAL*/
-                                                     0, /* U+002a0c: QUADRUPLE INTEGRAL OPERATOR*/
-                                                     0, /* U+002a0d: FINITE PART INTEGRAL*/
-                                                     0, /* U+002a0e: INTEGRAL WITH DOUBLE STROKE*/
-                                                     0, /* U+002a0f: INTEGRAL AVERAGE WITH SLASH*/
-                                                     0, /* U+002a10: CIRCULATION FUNCTION*/
-                                                     0, /* U+002a11: ANTICLOCKWISE INTEGRATION*/
-                                                     0, /* U+002a12: LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE*/
-                                                     0, /* U+002a13: LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE*/
-                                                     0, /* U+002a14: LINE INTEGRATION NOT INCLUDING THE POLE*/
-                                                     0, /* U+002a15: INTEGRAL AROUND A POINT OPERATOR*/
-                                                     0, /* U+002a16: QUATERNION INTEGRAL OPERATOR*/
-                                                     0, /* U+002a17: INTEGRAL WITH LEFTWARDS ARROW WITH HOOK*/
-                                                     0, /* U+002a18: INTEGRAL WITH TIMES SIGN*/
-                                                     0, /* U+002a19: INTEGRAL WITH INTERSECTION*/
-                                                     0, /* U+002a1a: INTEGRAL WITH UNION*/
-                                                     0, /* U+002a1b: INTEGRAL WITH OVERBAR*/
-                                                     0, /* U+002a1c: INTEGRAL WITH UNDERBAR*/
-                                                     0, /* U+002a1d: JOIN*/
-                                                     0, /* U+002a1e: LARGE LEFT TRIANGLE OPERATOR*/
-                                                     0, /* U+002a1f: Z NOTATION SCHEMA COMPOSITION*/
-                                                     0, /* U+002a20: Z NOTATION SCHEMA PIPING*/
-                                                     0, /* U+002a21: Z NOTATION SCHEMA PROJECTION*/
-                                                     0, /* U+002a22: PLUS SIGN WITH SMALL CIRCLE ABOVE*/
-                                                     0, /* U+002a23: PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE*/
-                                                     0, /* U+002a24: PLUS SIGN WITH TILDE ABOVE*/
-                                                     0, /* U+002a25: PLUS SIGN WITH DOT BELOW*/
-                                                     0, /* U+002a26: PLUS SIGN WITH TILDE BELOW*/
-                                                     0, /* U+002a27: PLUS SIGN WITH SUBSCRIPT TWO*/
-                                                     0, /* U+002a28: PLUS SIGN WITH BLACK TRIANGLE*/
-                                                     0, /* U+002a29: MINUS SIGN WITH COMMA ABOVE*/
-                                                     0, /* U+002a2a: MINUS SIGN WITH DOT BELOW*/
-                                                     0, /* U+002a2b: MINUS SIGN WITH FALLING DOTS*/
-                                                     0, /* U+002a2c: MINUS SIGN WITH RISING DOTS*/
-                                                     0, /* U+002a2d: PLUS SIGN IN LEFT HALF CIRCLE*/
-                                                     0, /* U+002a2e: PLUS SIGN IN RIGHT HALF CIRCLE*/
-                                                     0, /* U+002a2f: VECTOR OR CROSS PRODUCT*/
-                                                     0, /* U+002a30: MULTIPLICATION SIGN WITH DOT ABOVE*/
-                                                     0, /* U+002a31: MULTIPLICATION SIGN WITH UNDERBAR*/
-                                                     0, /* U+002a32: SEMIDIRECT PRODUCT WITH BOTTOM CLOSED*/
-                                                     0, /* U+002a33: SMASH PRODUCT*/
-                                                     0, /* U+002a34: MULTIPLICATION SIGN IN LEFT HALF CIRCLE*/
-                                                     0, /* U+002a35: MULTIPLICATION SIGN IN RIGHT HALF CIRCLE*/
-                                                     0, /* U+002a36: CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT*/
-                                                     0, /* U+002a37: MULTIPLICATION SIGN IN DOUBLE CIRCLE*/
-                                                     0, /* U+002a38: CIRCLED DIVISION SIGN*/
-                                                     0, /* U+002a39: PLUS SIGN IN TRIANGLE*/
-                                                     0, /* U+002a3a: MINUS SIGN IN TRIANGLE*/
-                                                     0, /* U+002a3b: MULTIPLICATION SIGN IN TRIANGLE*/
-                                                     0, /* U+002a3c: INTERIOR PRODUCT*/
-                                                     0, /* U+002a3d: RIGHTHAND INTERIOR PRODUCT*/
-                                                     0, /* U+002a3e: Z NOTATION RELATIONAL COMPOSITION*/
-                                                     0, /* U+002a3f: AMALGAMATION OR COPRODUCT*/
-                                                     0, /* U+002a40: INTERSECTION WITH DOT*/
-                                                     0, /* U+002a41: UNION WITH MINUS SIGN*/
-                                                     0, /* U+002a42: UNION WITH OVERBAR*/
-                                                     0, /* U+002a43: INTERSECTION WITH OVERBAR*/
-                                                     0, /* U+002a44: INTERSECTION WITH LOGICAL AND*/
-                                                     0, /* U+002a45: UNION WITH LOGICAL OR*/
-                                                     0, /* U+002a46: UNION ABOVE INTERSECTION*/
-                                                     0, /* U+002a47: INTERSECTION ABOVE UNION*/
-                                                     0, /* U+002a48: UNION ABOVE BAR ABOVE INTERSECTION*/
-                                                     0, /* U+002a49: INTERSECTION ABOVE BAR ABOVE UNION*/
-                                                     0, /* U+002a4a: UNION BESIDE AND JOINED WITH UNION*/
-                                                     0, /* U+002a4b: INTERSECTION BESIDE AND JOINED WITH INTERSECTION*/
-                                                     0, /* U+002a4c: CLOSED UNION WITH SERIFS*/
-                                                     0, /* U+002a4d: CLOSED INTERSECTION WITH SERIFS*/
-                                                     0, /* U+002a4e: DOUBLE SQUARE INTERSECTION*/
-                                                     0, /* U+002a4f: DOUBLE SQUARE UNION*/
-                                                     0, /* U+002a50: CLOSED UNION WITH SERIFS AND SMASH PRODUCT*/
-                                                     0, /* U+002a51: LOGICAL AND WITH DOT ABOVE*/
-                                                     0, /* U+002a52: LOGICAL OR WITH DOT ABOVE*/
-                                                     0, /* U+002a53: DOUBLE LOGICAL AND*/
-                                                     0, /* U+002a54: DOUBLE LOGICAL OR*/
-                                                     0, /* U+002a55: TWO INTERSECTING LOGICAL AND*/
-                                                     0, /* U+002a56: TWO INTERSECTING LOGICAL OR*/
-                                                     0, /* U+002a57: SLOPING LARGE OR*/
-                                                     0, /* U+002a58: SLOPING LARGE AND*/
-                                                     0, /* U+002a59: LOGICAL OR OVERLAPPING LOGICAL AND*/
-                                                     0, /* U+002a5a: LOGICAL AND WITH MIDDLE STEM*/
-                                                     0, /* U+002a5b: LOGICAL OR WITH MIDDLE STEM*/
-                                                     0, /* U+002a5c: LOGICAL AND WITH HORIZONTAL DASH*/
-                                                     0, /* U+002a5d: LOGICAL OR WITH HORIZONTAL DASH*/
-                                                     0, /* U+002a5e: LOGICAL AND WITH DOUBLE OVERBAR*/
-                                                     0, /* U+002a5f: LOGICAL AND WITH UNDERBAR*/
-                                                     0, /* U+002a60: LOGICAL AND WITH DOUBLE UNDERBAR*/
-                                                     0, /* U+002a61: SMALL VEE WITH UNDERBAR*/
-                                                     0, /* U+002a62: LOGICAL OR WITH DOUBLE OVERBAR*/
-                                                     0, /* U+002a63: LOGICAL OR WITH DOUBLE UNDERBAR*/
-                                                     0, /* U+002a64: Z NOTATION DOMAIN ANTIRESTRICTION*/
-                                                     0, /* U+002a65: Z NOTATION RANGE ANTIRESTRICTION*/
-                                                     0, /* U+002a66: EQUALS SIGN WITH DOT BELOW*/
-                                                     0, /* U+002a67: IDENTICAL WITH DOT ABOVE*/
-                                                     0, /* U+002a68: TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE*/
-                                                     0, /* U+002a69: TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE*/
-                                                     0, /* U+002a6a: TILDE OPERATOR WITH DOT ABOVE*/
-                                                     0, /* U+002a6b: TILDE OPERATOR WITH RISING DOTS*/
-                                                     0, /* U+002a6c: SIMILAR MINUS SIMILAR*/
-                                                     0, /* U+002a6d: CONGRUENT WITH DOT ABOVE*/
-                                                     0, /* U+002a6e: EQUALS WITH ASTERISK*/
-                                                     0, /* U+002a6f: ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT*/
-                                                     0, /* U+002a70: APPROXIMATELY EQUAL OR EQUAL TO*/
-                                                     0, /* U+002a71: EQUALS SIGN ABOVE PLUS SIGN*/
-                                                     0, /* U+002a72: PLUS SIGN ABOVE EQUALS SIGN*/
-                                                     0, /* U+002a73: EQUALS SIGN ABOVE TILDE OPERATOR*/
-                                                     0, /* U+002a74: DOUBLE COLON EQUAL*/
-                                                     0, /* U+002a75: TWO CONSECUTIVE EQUALS SIGNS*/
-                                                     0, /* U+002a76: THREE CONSECUTIVE EQUALS SIGNS*/
-                                                     0, /* U+002a77: EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW*/
-                                                     0, /* U+002a78: EQUIVALENT WITH FOUR DOTS ABOVE*/
-                                                     0, /* U+002a79: LESS-THAN WITH CIRCLE INSIDE*/
-                                                     0, /* U+002a7a: GREATER-THAN WITH CIRCLE INSIDE*/
-                                                     0, /* U+002a7b: LESS-THAN WITH QUESTION MARK ABOVE*/
-                                                     0, /* U+002a7c: GREATER-THAN WITH QUESTION MARK ABOVE*/
-                                                     0, /* U+002a7d: LESS-THAN OR SLANTED EQUAL TO*/
-                                                     0, /* U+002a7e: GREATER-THAN OR SLANTED EQUAL TO*/
-                                                     0, /* U+002a7f: LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
-                                                     0, /* U+002a80: GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE*/
-                                                     0, /* U+002a81: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
-                                                     0, /* U+002a82: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE*/
-                                                     0, /* U+002a83: LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT*/
-                                                     0, /* U+002a84: GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT*/
-                                                     0, /* U+002a85: LESS-THAN OR APPROXIMATE*/
-                                                     0, /* U+002a86: GREATER-THAN OR APPROXIMATE*/
-                                                     0, /* U+002a87: LESS-THAN AND SINGLE-LINE NOT EQUAL TO*/
-                                                     0, /* U+002a88: GREATER-THAN AND SINGLE-LINE NOT EQUAL TO*/
-                                                     0, /* U+002a89: LESS-THAN AND NOT APPROXIMATE*/
-                                                     0, /* U+002a8a: GREATER-THAN AND NOT APPROXIMATE*/
-                                                     0, /* U+002a8b: LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN*/
-                                                     0, /* U+002a8c: GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN*/
-                                                     0, /* U+002a8d: LESS-THAN ABOVE SIMILAR OR EQUAL*/
-                                                     0, /* U+002a8e: GREATER-THAN ABOVE SIMILAR OR EQUAL*/
-                                                     0, /* U+002a8f: LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN*/
-                                                     0, /* U+002a90: GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN*/
-                                                     0, /* U+002a91: LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL*/
-                                                     0, /* U+002a92: GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL*/
-                                                     0, /* U+002a93: LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL*/
-                                                     0, /* U+002a94: GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL*/
-                                                     0, /* U+002a95: SLANTED EQUAL TO OR LESS-THAN*/
-                                                     0, /* U+002a96: SLANTED EQUAL TO OR GREATER-THAN*/
-                                                     0, /* U+002a97: SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE*/
-                                                     0, /* U+002a98: SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE*/
-                                                     0, /* U+002a99: DOUBLE-LINE EQUAL TO OR LESS-THAN*/
-                                                     0, /* U+002a9a: DOUBLE-LINE EQUAL TO OR GREATER-THAN*/
-                                                     0, /* U+002a9b: DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN*/
-                                                     0, /* U+002a9c: DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN*/
-                                                     0, /* U+002a9d: SIMILAR OR LESS-THAN*/
-                                                     0, /* U+002a9e: SIMILAR OR GREATER-THAN*/
-                                                     0, /* U+002a9f: SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN*/
-                                                     0, /* U+002aa0: SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN*/
-                                                     0, /* U+002aa1: DOUBLE NESTED LESS-THAN*/
-                                                     0, /* U+002aa2: DOUBLE NESTED GREATER-THAN*/
-                                                     0, /* U+002aa3: DOUBLE NESTED LESS-THAN WITH UNDERBAR*/
-                                                     0, /* U+002aa4: GREATER-THAN OVERLAPPING LESS-THAN*/
-                                                     0, /* U+002aa5: GREATER-THAN BESIDE LESS-THAN*/
-                                                     0, /* U+002aa6: LESS-THAN CLOSED BY CURVE*/
-                                                     0, /* U+002aa7: GREATER-THAN CLOSED BY CURVE*/
-                                                     0, /* U+002aa8: LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
-                                                     0, /* U+002aa9: GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL*/
-                                                     0, /* U+002aaa: SMALLER THAN*/
-                                                     0, /* U+002aab: LARGER THAN*/
-                                                     0, /* U+002aac: SMALLER THAN OR EQUAL TO*/
-                                                     0, /* U+002aad: LARGER THAN OR EQUAL TO*/
-                                                     0, /* U+002aae: EQUALS SIGN WITH BUMPY ABOVE*/
-                                                     0, /* U+002aaf: PRECEDES ABOVE SINGLE-LINE EQUALS SIGN*/
-                                                     0, /* U+002ab0: SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN*/
-                                                     0, /* U+002ab1: PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO*/
-                                                     0, /* U+002ab2: SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO*/
-                                                     0, /* U+002ab3: PRECEDES ABOVE EQUALS SIGN*/
-                                                     0, /* U+002ab4: SUCCEEDS ABOVE EQUALS SIGN*/
-                                                     0, /* U+002ab5: PRECEDES ABOVE NOT EQUAL TO*/
-                                                     0, /* U+002ab6: SUCCEEDS ABOVE NOT EQUAL TO*/
-                                                     0, /* U+002ab7: PRECEDES ABOVE ALMOST EQUAL TO*/
-                                                     0, /* U+002ab8: SUCCEEDS ABOVE ALMOST EQUAL TO*/
-                                                     0, /* U+002ab9: PRECEDES ABOVE NOT ALMOST EQUAL TO*/
-                                                     0, /* U+002aba: SUCCEEDS ABOVE NOT ALMOST EQUAL TO*/
-                                                     0, /* U+002abb: DOUBLE PRECEDES*/
-                                                     0, /* U+002abc: DOUBLE SUCCEEDS*/
-                                                     0, /* U+002abd: SUBSET WITH DOT*/
-                                                     0, /* U+002abe: SUPERSET WITH DOT*/
-                                                     0, /* U+002abf: SUBSET WITH PLUS SIGN BELOW*/
-                                                     0, /* U+002ac0: SUPERSET WITH PLUS SIGN BELOW*/
-                                                     0, /* U+002ac1: SUBSET WITH MULTIPLICATION SIGN BELOW*/
-                                                     0, /* U+002ac2: SUPERSET WITH MULTIPLICATION SIGN BELOW*/
-                                                     0, /* U+002ac3: SUBSET OF OR EQUAL TO WITH DOT ABOVE*/
-                                                     0, /* U+002ac4: SUPERSET OF OR EQUAL TO WITH DOT ABOVE*/
-                                                     0, /* U+002ac5: SUBSET OF ABOVE EQUALS SIGN*/
-                                                     0, /* U+002ac6: SUPERSET OF ABOVE EQUALS SIGN*/
-                                                     0, /* U+002ac7: SUBSET OF ABOVE TILDE OPERATOR*/
-                                                     0, /* U+002ac8: SUPERSET OF ABOVE TILDE OPERATOR*/
-                                                     0, /* U+002ac9: SUBSET OF ABOVE ALMOST EQUAL TO*/
-                                                     0, /* U+002aca: SUPERSET OF ABOVE ALMOST EQUAL TO*/
-                                                     0, /* U+002acb: SUBSET OF ABOVE NOT EQUAL TO*/
-                                                     0, /* U+002acc: SUPERSET OF ABOVE NOT EQUAL TO*/
-                                                     0, /* U+002acd: SQUARE LEFT OPEN BOX OPERATOR*/
-                                                     0, /* U+002ace: SQUARE RIGHT OPEN BOX OPERATOR*/
-                                                     0, /* U+002acf: CLOSED SUBSET*/
-                                                     0, /* U+002ad0: CLOSED SUPERSET*/
-                                                     0, /* U+002ad1: CLOSED SUBSET OR EQUAL TO*/
-                                                     0, /* U+002ad2: CLOSED SUPERSET OR EQUAL TO*/
-                                                     0, /* U+002ad3: SUBSET ABOVE SUPERSET*/
-                                                     0, /* U+002ad4: SUPERSET ABOVE SUBSET*/
-                                                     0, /* U+002ad5: SUBSET ABOVE SUBSET*/
-                                                     0, /* U+002ad6: SUPERSET ABOVE SUPERSET*/
-                                                     0, /* U+002ad7: SUPERSET BESIDE SUBSET*/
-                                                     0, /* U+002ad8: SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET*/
-                                                     0, /* U+002ad9: ELEMENT OF OPENING DOWNWARDS*/
-                                                     0, /* U+002ada: PITCHFORK WITH TEE TOP*/
-                                                     0, /* U+002adb: TRANSVERSAL INTERSECTION*/
-                                                     0, /* U+002adc: FORKING*/
-                                                     0, /* U+002add: NONFORKING*/
-                                                     0, /* U+002ade: SHORT LEFT TACK*/
-                                                     0, /* U+002adf: SHORT DOWN TACK*/
-                                                     0, /* U+002ae0: SHORT UP TACK*/
-                                                     0, /* U+002ae1: PERPENDICULAR WITH S*/
-                                                     0, /* U+002ae2: VERTICAL BAR TRIPLE RIGHT TURNSTILE*/
-                                                     0, /* U+002ae3: DOUBLE VERTICAL BAR LEFT TURNSTILE*/
-                                                     0, /* U+002ae4: VERTICAL BAR DOUBLE LEFT TURNSTILE*/
-                                                     0, /* U+002ae5: DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE*/
-                                                     0, /* U+002ae6: LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL*/
-                                                     0, /* U+002ae7: SHORT DOWN TACK WITH OVERBAR*/
-                                                     0, /* U+002ae8: SHORT UP TACK WITH UNDERBAR*/
-                                                     0, /* U+002ae9: SHORT UP TACK ABOVE SHORT DOWN TACK*/
-                                                     0, /* U+002aea: DOUBLE DOWN TACK*/
-                                                     0, /* U+002aeb: DOUBLE UP TACK*/
-                                                     0, /* U+002aec: DOUBLE STROKE NOT SIGN*/
-                                                     0, /* U+002aed: REVERSED DOUBLE STROKE NOT SIGN*/
-                                                     0, /* U+002aee: DOES NOT DIVIDE WITH REVERSED NEGATION SLASH*/
-                                                     0, /* U+002aef: VERTICAL LINE WITH CIRCLE ABOVE*/
-                                                     0, /* U+002af0: VERTICAL LINE WITH CIRCLE BELOW*/
-                                                     0, /* U+002af1: DOWN TACK WITH CIRCLE BELOW*/
-                                                     0, /* U+002af2: PARALLEL WITH HORIZONTAL STROKE*/
-                                                     0, /* U+002af3: PARALLEL WITH TILDE OPERATOR*/
-                                                     0, /* U+002af4: TRIPLE VERTICAL BAR BINARY RELATION*/
-                                                     0, /* U+002af5: TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE*/
-                                                     0, /* U+002af6: TRIPLE COLON OPERATOR*/
-                                                     0, /* U+002af7: TRIPLE NESTED LESS-THAN*/
-                                                     0, /* U+002af8: TRIPLE NESTED GREATER-THAN*/
-                                                     0, /* U+002af9: DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO*/
-                                                     0, /* U+002afa: DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO*/
-                                                     0, /* U+002afb: TRIPLE SOLIDUS BINARY RELATION*/
-                                                     0, /* U+002afc: LARGE TRIPLE VERTICAL BAR OPERATOR*/
-                                                     0, /* U+002afd: DOUBLE SOLIDUS OPERATOR*/
-                                                     0, /* U+002afe: WHITE VERTICAL BAR*/
-                                                     0, /* U+002aff: N-ARY WHITE VERTICAL BAR*/
-                                                     0, /* U+002b00: NORTH EAST WHITE ARROW*/
-                                                     0, /* U+002b01: NORTH WEST WHITE ARROW*/
-                                                     0, /* U+002b02: SOUTH EAST WHITE ARROW*/
-                                                     0, /* U+002b03: SOUTH WEST WHITE ARROW*/
-                                                     0, /* U+002b04: LEFT RIGHT WHITE ARROW*/
-                                                     0, /* U+002b05: LEFTWARDS BLACK ARROW*/
-                                                     0, /* U+002b06: UPWARDS BLACK ARROW*/
-                                                     0, /* U+002b07: DOWNWARDS BLACK ARROW*/
-                                                     0, /* U+002b08: NORTH EAST BLACK ARROW*/
-                                                     0, /* U+002b09: NORTH WEST BLACK ARROW*/
-                                                     0, /* U+002b0a: SOUTH EAST BLACK ARROW*/
-                                                     0, /* U+002b0b: SOUTH WEST BLACK ARROW*/
-                                                     0, /* U+002b0c: LEFT RIGHT BLACK ARROW*/
-                                                     0, /* U+002b0d: UP DOWN BLACK ARROW*/
-                                                     0, /* U+002b0e: RIGHTWARDS ARROW WITH TIP DOWNWARDS*/
-                                                     0, /* U+002b0f: RIGHTWARDS ARROW WITH TIP UPWARDS*/
-                                                     0, /* U+002b10: LEFTWARDS ARROW WITH TIP DOWNWARDS*/
-                                                     0, /* U+002b11: LEFTWARDS ARROW WITH TIP UPWARDS*/
-                                                     0, /* U+002b12: SQUARE WITH TOP HALF BLACK*/
-                                                     0, /* U+002b13: SQUARE WITH BOTTOM HALF BLACK*/
-                                                     0, /* U+002b14: */
-                                                     0, /* U+002b15: */
-                                                     0, /* U+002b16: */
-                                                     0, /* U+002b17: */
-                                                     0, /* U+002b18: */
-                                                     0, /* U+002b19: */
-                                                     0, /* U+002b1a: */
-                                                     0, /* U+002b1b: */
-                                                     0, /* U+002b1c: */
-                                                     0, /* U+002b1d: */
-                                                     0, /* U+002b1e: */
-                                                     0, /* U+002b1f: */
-                                                     0, /* U+002b20: */
-                                                     0, /* U+002b21: */
-                                                     0, /* U+002b22: */
-                                                     0, /* U+002b23: */
-                                                     0, /* U+002b24: */
-                                                     0, /* U+002b25: */
-                                                     0, /* U+002b26: */
-                                                     0, /* U+002b27: */
-                                                     0, /* U+002b28: */
-                                                     0, /* U+002b29: */
-                                                     0, /* U+002b2a: */
-                                                     0, /* U+002b2b: */
-                                                     0, /* U+002b2c: */
-                                                     0, /* U+002b2d: */
-                                                     0, /* U+002b2e: */
-                                                     0, /* U+002b2f: */
-                                                     0, /* U+002b30: */
-                                                     0, /* U+002b31: */
-                                                     0, /* U+002b32: */
-                                                     0, /* U+002b33: */
-                                                     0, /* U+002b34: */
-                                                     0, /* U+002b35: */
-                                                     0, /* U+002b36: */
-                                                     0, /* U+002b37: */
-                                                     0, /* U+002b38: */
-                                                     0, /* U+002b39: */
-                                                     0, /* U+002b3a: */
-                                                     0, /* U+002b3b: */
-                                                     0, /* U+002b3c: */
-                                                     0, /* U+002b3d: */
-                                                     0, /* U+002b3e: */
-                                                     0, /* U+002b3f: */
-                                                     0, /* U+002b40: */
-                                                     0, /* U+002b41: */
-                                                     0, /* U+002b42: */
-                                                     0, /* U+002b43: */
-                                                     0, /* U+002b44: */
-                                                     0, /* U+002b45: */
-                                                     0, /* U+002b46: */
-                                                     0, /* U+002b47: */
-                                                     0, /* U+002b48: */
-                                                     0, /* U+002b49: */
-                                                     0, /* U+002b4a: */
-                                                     0, /* U+002b4b: */
-                                                     0, /* U+002b4c: */
-                                                     0, /* U+002b4d: */
-                                                     0, /* U+002b4e: */
-                                                     0, /* U+002b4f: */
-                                                     0, /* U+002b50: */
-                                                     0, /* U+002b51: */
-                                                     0, /* U+002b52: */
-                                                     0, /* U+002b53: */
-                                                     0, /* U+002b54: */
-                                                     0, /* U+002b55: */
-                                                     0, /* U+002b56: */
-                                                     0, /* U+002b57: */
-                                                     0, /* U+002b58: */
-                                                     0, /* U+002b59: */
-                                                     0, /* U+002b5a: */
-                                                     0, /* U+002b5b: */
-                                                     0, /* U+002b5c: */
-                                                     0, /* U+002b5d: */
-                                                     0, /* U+002b5e: */
-                                                     0, /* U+002b5f: */
-                                                     0, /* U+002b60: */
-                                                     0, /* U+002b61: */
-                                                     0, /* U+002b62: */
-                                                     0, /* U+002b63: */
-                                                     0, /* U+002b64: */
-                                                     0, /* U+002b65: */
-                                                     0, /* U+002b66: */
-                                                     0, /* U+002b67: */
-                                                     0, /* U+002b68: */
-                                                     0, /* U+002b69: */
-                                                     0, /* U+002b6a: */
-                                                     0, /* U+002b6b: */
-                                                     0, /* U+002b6c: */
-                                                     0, /* U+002b6d: */
-                                                     0, /* U+002b6e: */
-                                                     0, /* U+002b6f: */
-                                                     0, /* U+002b70: */
-                                                     0, /* U+002b71: */
-                                                     0, /* U+002b72: */
-                                                     0, /* U+002b73: */
-                                                     0, /* U+002b74: */
-                                                     0, /* U+002b75: */
-                                                     0, /* U+002b76: */
-                                                     0, /* U+002b77: */
-                                                     0, /* U+002b78: */
-                                                     0, /* U+002b79: */
-                                                     0, /* U+002b7a: */
-                                                     0, /* U+002b7b: */
-                                                     0, /* U+002b7c: */
-                                                     0, /* U+002b7d: */
-                                                     0, /* U+002b7e: */
-                                                     0, /* U+002b7f: */
-                                                     0, /* U+002b80: */
-                                                     0, /* U+002b81: */
-                                                     0, /* U+002b82: */
-                                                     0, /* U+002b83: */
-                                                     0, /* U+002b84: */
-                                                     0, /* U+002b85: */
-                                                     0, /* U+002b86: */
-                                                     0, /* U+002b87: */
-                                                     0, /* U+002b88: */
-                                                     0, /* U+002b89: */
-                                                     0, /* U+002b8a: */
-                                                     0, /* U+002b8b: */
-                                                     0, /* U+002b8c: */
-                                                     0, /* U+002b8d: */
-                                                     0, /* U+002b8e: */
-                                                     0, /* U+002b8f: */
-                                                     0, /* U+002b90: */
-                                                     0, /* U+002b91: */
-                                                     0, /* U+002b92: */
-                                                     0, /* U+002b93: */
-                                                     0, /* U+002b94: */
-                                                     0, /* U+002b95: */
-                                                     0, /* U+002b96: */
-                                                     0, /* U+002b97: */
-                                                     0, /* U+002b98: */
-                                                     0, /* U+002b99: */
-                                                     0, /* U+002b9a: */
-                                                     0, /* U+002b9b: */
-                                                     0, /* U+002b9c: */
-                                                     0, /* U+002b9d: */
-                                                     0, /* U+002b9e: */
-                                                     0, /* U+002b9f: */
-                                                     0, /* U+002ba0: */
-                                                     0, /* U+002ba1: */
-                                                     0, /* U+002ba2: */
-                                                     0, /* U+002ba3: */
-                                                     0, /* U+002ba4: */
-                                                     0, /* U+002ba5: */
-                                                     0, /* U+002ba6: */
-                                                     0, /* U+002ba7: */
-                                                     0, /* U+002ba8: */
-                                                     0, /* U+002ba9: */
-                                                     0, /* U+002baa: */
-                                                     0, /* U+002bab: */
-                                                     0, /* U+002bac: */
-                                                     0, /* U+002bad: */
-                                                     0, /* U+002bae: */
-                                                     0, /* U+002baf: */
-                                                     0, /* U+002bb0: */
-                                                     0, /* U+002bb1: */
-                                                     0, /* U+002bb2: */
-                                                     0, /* U+002bb3: */
-                                                     0, /* U+002bb4: */
-                                                     0, /* U+002bb5: */
-                                                     0, /* U+002bb6: */
-                                                     0, /* U+002bb7: */
-                                                     0, /* U+002bb8: */
-                                                     0, /* U+002bb9: */
-                                                     0, /* U+002bba: */
-                                                     0, /* U+002bbb: */
-                                                     0, /* U+002bbc: */
-                                                     0, /* U+002bbd: */
-                                                     0, /* U+002bbe: */
-                                                     0, /* U+002bbf: */
-                                                     0, /* U+002bc0: */
-                                                     0, /* U+002bc1: */
-                                                     0, /* U+002bc2: */
-                                                     0, /* U+002bc3: */
-                                                     0, /* U+002bc4: */
-                                                     0, /* U+002bc5: */
-                                                     0, /* U+002bc6: */
-                                                     0, /* U+002bc7: */
-                                                     0, /* U+002bc8: */
-                                                     0, /* U+002bc9: */
-                                                     0, /* U+002bca: */
-                                                     0, /* U+002bcb: */
-                                                     0, /* U+002bcc: */
-                                                     0, /* U+002bcd: */
-                                                     0, /* U+002bce: */
-                                                     0, /* U+002bcf: */
-                                                     0, /* U+002bd0: */
-                                                     0, /* U+002bd1: */
-                                                     0, /* U+002bd2: */
-                                                     0, /* U+002bd3: */
-                                                     0, /* U+002bd4: */
-                                                     0, /* U+002bd5: */
-                                                     0, /* U+002bd6: */
-                                                     0, /* U+002bd7: */
-                                                     0, /* U+002bd8: */
-                                                     0, /* U+002bd9: */
-                                                     0, /* U+002bda: */
-                                                     0, /* U+002bdb: */
-                                                     0, /* U+002bdc: */
-                                                     0, /* U+002bdd: */
-                                                     0, /* U+002bde: */
-                                                     0, /* U+002bdf: */
-                                                     0, /* U+002be0: */
-                                                     0, /* U+002be1: */
-                                                     0, /* U+002be2: */
-                                                     0, /* U+002be3: */
-                                                     0, /* U+002be4: */
-                                                     0, /* U+002be5: */
-                                                     0, /* U+002be6: */
-                                                     0, /* U+002be7: */
-                                                     0, /* U+002be8: */
-                                                     0, /* U+002be9: */
-                                                     0, /* U+002bea: */
-                                                     0, /* U+002beb: */
-                                                     0, /* U+002bec: */
-                                                     0, /* U+002bed: */
-                                                     0, /* U+002bee: */
-                                                     0, /* U+002bef: */
-                                                     0, /* U+002bf0: */
-                                                     0, /* U+002bf1: */
-                                                     0, /* U+002bf2: */
-                                                     0, /* U+002bf3: */
-                                                     0, /* U+002bf4: */
-                                                     0, /* U+002bf5: */
-                                                     0, /* U+002bf6: */
-                                                     0, /* U+002bf7: */
-                                                     0, /* U+002bf8: */
-                                                     0, /* U+002bf9: */
-                                                     0, /* U+002bfa: */
-                                                     0, /* U+002bfb: */
-                                                     0, /* U+002bfc: */
-                                                     0, /* U+002bfd: */
-                                                     0, /* U+002bfe: */
-                                                     0, /* U+002bff: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
-                                                     0, /* U+002c2f: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
-                                                     0, /* U+002c5f: */
-                                                     0, /* U+002c60: */
-                                                     0, /* U+002c61: */
-                                                     0, /* U+002c62: */
-                                                     0, /* U+002c63: */
-                                                     0, /* U+002c64: */
-                                                     0, /* U+002c65: */
-                                                     0, /* U+002c66: */
-                                                     0, /* U+002c67: */
-                                                     0, /* U+002c68: */
-                                                     0, /* U+002c69: */
-                                                     0, /* U+002c6a: */
-                                                     0, /* U+002c6b: */
-                                                     0, /* U+002c6c: */
-                                                     0, /* U+002c6d: */
-                                                     0, /* U+002c6e: */
-                                                     0, /* U+002c6f: */
-                                                     0, /* U+002c70: */
-                                                     0, /* U+002c71: */
-                                                     0, /* U+002c72: */
-                                                     0, /* U+002c73: */
-                                                     0, /* U+002c74: */
-                                                     0, /* U+002c75: */
-                                                     0, /* U+002c76: */
-                                                     0, /* U+002c77: */
-                                                     0, /* U+002c78: */
-                                                     0, /* U+002c79: */
-                                                     0, /* U+002c7a: */
-                                                     0, /* U+002c7b: */
-                                                     0, /* U+002c7c: */
-                                                     0, /* U+002c7d: */
-                                                     0, /* U+002c7e: */
-                                                     0, /* U+002c7f: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c81: COPTIC SMALL LETTER ALFA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c83: COPTIC SMALL LETTER VIDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c87: COPTIC SMALL LETTER DALDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c89: COPTIC SMALL LETTER EIE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8b: COPTIC SMALL LETTER SOU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c8f: COPTIC SMALL LETTER HATE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c91: COPTIC SMALL LETTER THETHE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c95: COPTIC SMALL LETTER KAPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c97: COPTIC SMALL LETTER LAULA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c98: COPTIC CAPITAL LETTER MI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c99: COPTIC SMALL LETTER MI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9b: COPTIC SMALL LETTER NI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9d: COPTIC SMALL LETTER KSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002c9e: COPTIC CAPITAL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002c9f: COPTIC SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca1: COPTIC SMALL LETTER PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca3: COPTIC SMALL LETTER RO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca7: COPTIC SMALL LETTER TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ca9: COPTIC SMALL LETTER UA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002caa: COPTIC CAPITAL LETTER FI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cab: COPTIC SMALL LETTER FI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cad: COPTIC SMALL LETTER KHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002caf: COPTIC SMALL LETTER PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb1: COPTIC SMALL LETTER OOU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002ce4: COPTIC SYMBOL KAI*/
-                                                     0, /* U+002ce5: COPTIC SYMBOL MI RO*/
-                                                     0, /* U+002ce6: COPTIC SYMBOL PI RO*/
-                                                     0, /* U+002ce7: COPTIC SYMBOL STAUROS*/
-                                                     0, /* U+002ce8: COPTIC SYMBOL TAU RO*/
-                                                     0, /* U+002ce9: COPTIC SYMBOL KHI RO*/
-                                                     0, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
-                                                     0, /* U+002ceb: */
-                                                     0, /* U+002cec: */
-                                                     0, /* U+002ced: */
-                                                     0, /* U+002cee: */
-                                                     0, /* U+002cef: */
-                                                     0, /* U+002cf0: */
-                                                     0, /* U+002cf1: */
-                                                     0, /* U+002cf2: */
-                                                     0, /* U+002cf3: */
-                                                     0, /* U+002cf4: */
-                                                     0, /* U+002cf5: */
-                                                     0, /* U+002cf6: */
-                                                     0, /* U+002cf7: */
-                                                     0, /* U+002cf8: */
-                                                     0, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
-                                                     0, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
-                                                     0, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
-                                                     0, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
-                                                     0, /* U+002cfd: COPTIC FRACTION ONE HALF*/
-                                                     0, /* U+002cfe: COPTIC FULL STOP*/
-                                                     0, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d00: GEORGIAN SMALL LETTER AN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d03: GEORGIAN SMALL LETTER DON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d04: GEORGIAN SMALL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d08: GEORGIAN SMALL LETTER IN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d13: GEORGIAN SMALL LETTER UN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d21: GEORGIAN SMALL LETTER HE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d23: GEORGIAN SMALL LETTER WE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
-                                                     0, /* U+002d26: */
-                                                     0, /* U+002d27: */
-                                                     0, /* U+002d28: */
-                                                     0, /* U+002d29: */
-                                                     0, /* U+002d2a: */
-                                                     0, /* U+002d2b: */
-                                                     0, /* U+002d2c: */
-                                                     0, /* U+002d2d: */
-                                                     0, /* U+002d2e: */
-                                                     0, /* U+002d2f: */
-                                           RTUNI_ALPHA, /* U+002d30: TIFINAGH LETTER YA*/
-                                           RTUNI_ALPHA, /* U+002d31: TIFINAGH LETTER YAB*/
-                                           RTUNI_ALPHA, /* U+002d32: TIFINAGH LETTER YABH*/
-                                           RTUNI_ALPHA, /* U+002d33: TIFINAGH LETTER YAG*/
-                                           RTUNI_ALPHA, /* U+002d34: TIFINAGH LETTER YAGHH*/
-                                           RTUNI_ALPHA, /* U+002d35: TIFINAGH LETTER BERBER ACADEMY YAJ*/
-                                           RTUNI_ALPHA, /* U+002d36: TIFINAGH LETTER YAJ*/
-                                           RTUNI_ALPHA, /* U+002d37: TIFINAGH LETTER YAD*/
-                                           RTUNI_ALPHA, /* U+002d38: TIFINAGH LETTER YADH*/
-                                           RTUNI_ALPHA, /* U+002d39: TIFINAGH LETTER YADD*/
-                                           RTUNI_ALPHA, /* U+002d3a: TIFINAGH LETTER YADDH*/
-                                           RTUNI_ALPHA, /* U+002d3b: TIFINAGH LETTER YEY*/
-                                           RTUNI_ALPHA, /* U+002d3c: TIFINAGH LETTER YAF*/
-                                           RTUNI_ALPHA, /* U+002d3d: TIFINAGH LETTER YAK*/
-                                           RTUNI_ALPHA, /* U+002d3e: TIFINAGH LETTER TUAREG YAK*/
-                                           RTUNI_ALPHA, /* U+002d3f: TIFINAGH LETTER YAKHH*/
-                                           RTUNI_ALPHA, /* U+002d40: TIFINAGH LETTER YAH*/
-                                           RTUNI_ALPHA, /* U+002d41: TIFINAGH LETTER BERBER ACADEMY YAH*/
-                                           RTUNI_ALPHA, /* U+002d42: TIFINAGH LETTER TUAREG YAH*/
-                                           RTUNI_ALPHA, /* U+002d43: TIFINAGH LETTER YAHH*/
-                                           RTUNI_ALPHA, /* U+002d44: TIFINAGH LETTER YAA*/
-                                           RTUNI_ALPHA, /* U+002d45: TIFINAGH LETTER YAKH*/
-                                           RTUNI_ALPHA, /* U+002d46: TIFINAGH LETTER TUAREG YAKH*/
-                                           RTUNI_ALPHA, /* U+002d47: TIFINAGH LETTER YAQ*/
-                                           RTUNI_ALPHA, /* U+002d48: TIFINAGH LETTER TUAREG YAQ*/
-                                           RTUNI_ALPHA, /* U+002d49: TIFINAGH LETTER YI*/
-                                           RTUNI_ALPHA, /* U+002d4a: TIFINAGH LETTER YAZH*/
-                                           RTUNI_ALPHA, /* U+002d4b: TIFINAGH LETTER AHAGGAR YAZH*/
-                                           RTUNI_ALPHA, /* U+002d4c: TIFINAGH LETTER TUAREG YAZH*/
-                                           RTUNI_ALPHA, /* U+002d4d: TIFINAGH LETTER YAL*/
-                                           RTUNI_ALPHA, /* U+002d4e: TIFINAGH LETTER YAM*/
-                                           RTUNI_ALPHA, /* U+002d4f: TIFINAGH LETTER YAN*/
-                                           RTUNI_ALPHA, /* U+002d50: TIFINAGH LETTER TUAREG YAGN*/
-                                           RTUNI_ALPHA, /* U+002d51: TIFINAGH LETTER TUAREG YANG*/
-                                           RTUNI_ALPHA, /* U+002d52: TIFINAGH LETTER YAP*/
-                                           RTUNI_ALPHA, /* U+002d53: TIFINAGH LETTER YU*/
-                                           RTUNI_ALPHA, /* U+002d54: TIFINAGH LETTER YAR*/
-                                           RTUNI_ALPHA, /* U+002d55: TIFINAGH LETTER YARR*/
-                                           RTUNI_ALPHA, /* U+002d56: TIFINAGH LETTER YAGH*/
-                                           RTUNI_ALPHA, /* U+002d57: TIFINAGH LETTER TUAREG YAGH*/
-                                           RTUNI_ALPHA, /* U+002d58: TIFINAGH LETTER AYER YAGH*/
-                                           RTUNI_ALPHA, /* U+002d59: TIFINAGH LETTER YAS*/
-                                           RTUNI_ALPHA, /* U+002d5a: TIFINAGH LETTER YASS*/
-                                           RTUNI_ALPHA, /* U+002d5b: TIFINAGH LETTER YASH*/
-                                           RTUNI_ALPHA, /* U+002d5c: TIFINAGH LETTER YAT*/
-                                           RTUNI_ALPHA, /* U+002d5d: TIFINAGH LETTER YATH*/
-                                           RTUNI_ALPHA, /* U+002d5e: TIFINAGH LETTER YACH*/
-                                           RTUNI_ALPHA, /* U+002d5f: TIFINAGH LETTER YATT*/
-                                           RTUNI_ALPHA, /* U+002d60: TIFINAGH LETTER YAV*/
-                                           RTUNI_ALPHA, /* U+002d61: TIFINAGH LETTER YAW*/
-                                           RTUNI_ALPHA, /* U+002d62: TIFINAGH LETTER YAY*/
-                                           RTUNI_ALPHA, /* U+002d63: TIFINAGH LETTER YAZ*/
-                                           RTUNI_ALPHA, /* U+002d64: TIFINAGH LETTER TAWELLEMET YAZ*/
-                                           RTUNI_ALPHA, /* U+002d65: TIFINAGH LETTER YAZZ*/
-                                                     0, /* U+002d66: */
-                                                     0, /* U+002d67: */
-                                                     0, /* U+002d68: */
-                                                     0, /* U+002d69: */
-                                                     0, /* U+002d6a: */
-                                                     0, /* U+002d6b: */
-                                                     0, /* U+002d6c: */
-                                                     0, /* U+002d6d: */
-                                                     0, /* U+002d6e: */
-                                           RTUNI_ALPHA, /* U+002d6f: TIFINAGH MODIFIER LETTER LABIALIZATION MARK*/
-                                                     0, /* U+002d70: */
-                                                     0, /* U+002d71: */
-                                                     0, /* U+002d72: */
-                                                     0, /* U+002d73: */
-                                                     0, /* U+002d74: */
-                                                     0, /* U+002d75: */
-                                                     0, /* U+002d76: */
-                                                     0, /* U+002d77: */
-                                                     0, /* U+002d78: */
-                                                     0, /* U+002d79: */
-                                                     0, /* U+002d7a: */
-                                                     0, /* U+002d7b: */
-                                                     0, /* U+002d7c: */
-                                                     0, /* U+002d7d: */
-                                                     0, /* U+002d7e: */
-                                                     0, /* U+002d7f: */
-                                           RTUNI_ALPHA, /* U+002d80: ETHIOPIC SYLLABLE LOA*/
-                                           RTUNI_ALPHA, /* U+002d81: ETHIOPIC SYLLABLE MOA*/
-                                           RTUNI_ALPHA, /* U+002d82: ETHIOPIC SYLLABLE ROA*/
-                                           RTUNI_ALPHA, /* U+002d83: ETHIOPIC SYLLABLE SOA*/
-                                           RTUNI_ALPHA, /* U+002d84: ETHIOPIC SYLLABLE SHOA*/
-                                           RTUNI_ALPHA, /* U+002d85: ETHIOPIC SYLLABLE BOA*/
-                                           RTUNI_ALPHA, /* U+002d86: ETHIOPIC SYLLABLE TOA*/
-                                           RTUNI_ALPHA, /* U+002d87: ETHIOPIC SYLLABLE COA*/
-                                           RTUNI_ALPHA, /* U+002d88: ETHIOPIC SYLLABLE NOA*/
-                                           RTUNI_ALPHA, /* U+002d89: ETHIOPIC SYLLABLE NYOA*/
-                                           RTUNI_ALPHA, /* U+002d8a: ETHIOPIC SYLLABLE GLOTTAL OA*/
-                                           RTUNI_ALPHA, /* U+002d8b: ETHIOPIC SYLLABLE ZOA*/
-                                           RTUNI_ALPHA, /* U+002d8c: ETHIOPIC SYLLABLE DOA*/
-                                           RTUNI_ALPHA, /* U+002d8d: ETHIOPIC SYLLABLE DDOA*/
-                                           RTUNI_ALPHA, /* U+002d8e: ETHIOPIC SYLLABLE JOA*/
-                                           RTUNI_ALPHA, /* U+002d8f: ETHIOPIC SYLLABLE THOA*/
-                                           RTUNI_ALPHA, /* U+002d90: ETHIOPIC SYLLABLE CHOA*/
-                                           RTUNI_ALPHA, /* U+002d91: ETHIOPIC SYLLABLE PHOA*/
-                                           RTUNI_ALPHA, /* U+002d92: ETHIOPIC SYLLABLE POA*/
-                                           RTUNI_ALPHA, /* U+002d93: ETHIOPIC SYLLABLE GGWA*/
-                                           RTUNI_ALPHA, /* U+002d94: ETHIOPIC SYLLABLE GGWI*/
-                                           RTUNI_ALPHA, /* U+002d95: ETHIOPIC SYLLABLE GGWEE*/
-                                           RTUNI_ALPHA, /* U+002d96: ETHIOPIC SYLLABLE GGWE*/
-                                                     0, /* U+002d97: */
-                                                     0, /* U+002d98: */
-                                                     0, /* U+002d99: */
-                                                     0, /* U+002d9a: */
-                                                     0, /* U+002d9b: */
-                                                     0, /* U+002d9c: */
-                                                     0, /* U+002d9d: */
-                                                     0, /* U+002d9e: */
-                                                     0, /* U+002d9f: */
-                                           RTUNI_ALPHA, /* U+002da0: ETHIOPIC SYLLABLE SSA*/
-                                           RTUNI_ALPHA, /* U+002da1: ETHIOPIC SYLLABLE SSU*/
-                                           RTUNI_ALPHA, /* U+002da2: ETHIOPIC SYLLABLE SSI*/
-                                           RTUNI_ALPHA, /* U+002da3: ETHIOPIC SYLLABLE SSAA*/
-                                           RTUNI_ALPHA, /* U+002da4: ETHIOPIC SYLLABLE SSEE*/
-                                           RTUNI_ALPHA, /* U+002da5: ETHIOPIC SYLLABLE SSE*/
-                                           RTUNI_ALPHA, /* U+002da6: ETHIOPIC SYLLABLE SSO*/
-                                                     0, /* U+002da7: */
-                                           RTUNI_ALPHA, /* U+002da8: ETHIOPIC SYLLABLE CCA*/
-                                           RTUNI_ALPHA, /* U+002da9: ETHIOPIC SYLLABLE CCU*/
-                                           RTUNI_ALPHA, /* U+002daa: ETHIOPIC SYLLABLE CCI*/
-                                           RTUNI_ALPHA, /* U+002dab: ETHIOPIC SYLLABLE CCAA*/
-                                           RTUNI_ALPHA, /* U+002dac: ETHIOPIC SYLLABLE CCEE*/
-                                           RTUNI_ALPHA, /* U+002dad: ETHIOPIC SYLLABLE CCE*/
-                                           RTUNI_ALPHA, /* U+002dae: ETHIOPIC SYLLABLE CCO*/
-                                                     0, /* U+002daf: */
-                                           RTUNI_ALPHA, /* U+002db0: ETHIOPIC SYLLABLE ZZA*/
-                                           RTUNI_ALPHA, /* U+002db1: ETHIOPIC SYLLABLE ZZU*/
-                                           RTUNI_ALPHA, /* U+002db2: ETHIOPIC SYLLABLE ZZI*/
-                                           RTUNI_ALPHA, /* U+002db3: ETHIOPIC SYLLABLE ZZAA*/
-                                           RTUNI_ALPHA, /* U+002db4: ETHIOPIC SYLLABLE ZZEE*/
-                                           RTUNI_ALPHA, /* U+002db5: ETHIOPIC SYLLABLE ZZE*/
-                                           RTUNI_ALPHA, /* U+002db6: ETHIOPIC SYLLABLE ZZO*/
-                                                     0, /* U+002db7: */
-                                           RTUNI_ALPHA, /* U+002db8: ETHIOPIC SYLLABLE CCHA*/
-                                           RTUNI_ALPHA, /* U+002db9: ETHIOPIC SYLLABLE CCHU*/
-                                           RTUNI_ALPHA, /* U+002dba: ETHIOPIC SYLLABLE CCHI*/
-                                           RTUNI_ALPHA, /* U+002dbb: ETHIOPIC SYLLABLE CCHAA*/
-                                           RTUNI_ALPHA, /* U+002dbc: ETHIOPIC SYLLABLE CCHEE*/
-                                           RTUNI_ALPHA, /* U+002dbd: ETHIOPIC SYLLABLE CCHE*/
-                                           RTUNI_ALPHA, /* U+002dbe: ETHIOPIC SYLLABLE CCHO*/
-                                                     0, /* U+002dbf: */
-                                           RTUNI_ALPHA, /* U+002dc0: ETHIOPIC SYLLABLE QYA*/
-                                           RTUNI_ALPHA, /* U+002dc1: ETHIOPIC SYLLABLE QYU*/
-                                           RTUNI_ALPHA, /* U+002dc2: ETHIOPIC SYLLABLE QYI*/
-                                           RTUNI_ALPHA, /* U+002dc3: ETHIOPIC SYLLABLE QYAA*/
-                                           RTUNI_ALPHA, /* U+002dc4: ETHIOPIC SYLLABLE QYEE*/
-                                           RTUNI_ALPHA, /* U+002dc5: ETHIOPIC SYLLABLE QYE*/
-                                           RTUNI_ALPHA, /* U+002dc6: ETHIOPIC SYLLABLE QYO*/
-                                                     0, /* U+002dc7: */
-                                           RTUNI_ALPHA, /* U+002dc8: ETHIOPIC SYLLABLE KYA*/
-                                           RTUNI_ALPHA, /* U+002dc9: ETHIOPIC SYLLABLE KYU*/
-                                           RTUNI_ALPHA, /* U+002dca: ETHIOPIC SYLLABLE KYI*/
-                                           RTUNI_ALPHA, /* U+002dcb: ETHIOPIC SYLLABLE KYAA*/
-                                           RTUNI_ALPHA, /* U+002dcc: ETHIOPIC SYLLABLE KYEE*/
-                                           RTUNI_ALPHA, /* U+002dcd: ETHIOPIC SYLLABLE KYE*/
-                                           RTUNI_ALPHA, /* U+002dce: ETHIOPIC SYLLABLE KYO*/
-                                                     0, /* U+002dcf: */
-                                           RTUNI_ALPHA, /* U+002dd0: ETHIOPIC SYLLABLE XYA*/
-                                           RTUNI_ALPHA, /* U+002dd1: ETHIOPIC SYLLABLE XYU*/
-                                           RTUNI_ALPHA, /* U+002dd2: ETHIOPIC SYLLABLE XYI*/
-                                           RTUNI_ALPHA, /* U+002dd3: ETHIOPIC SYLLABLE XYAA*/
-                                           RTUNI_ALPHA, /* U+002dd4: ETHIOPIC SYLLABLE XYEE*/
-                                           RTUNI_ALPHA, /* U+002dd5: ETHIOPIC SYLLABLE XYE*/
-                                           RTUNI_ALPHA, /* U+002dd6: ETHIOPIC SYLLABLE XYO*/
-                                                     0, /* U+002dd7: */
-                                           RTUNI_ALPHA, /* U+002dd8: ETHIOPIC SYLLABLE GYA*/
-                                           RTUNI_ALPHA, /* U+002dd9: ETHIOPIC SYLLABLE GYU*/
-                                           RTUNI_ALPHA, /* U+002dda: ETHIOPIC SYLLABLE GYI*/
-                                           RTUNI_ALPHA, /* U+002ddb: ETHIOPIC SYLLABLE GYAA*/
-                                           RTUNI_ALPHA, /* U+002ddc: ETHIOPIC SYLLABLE GYEE*/
-                                           RTUNI_ALPHA, /* U+002ddd: ETHIOPIC SYLLABLE GYE*/
-                                           RTUNI_ALPHA, /* U+002dde: ETHIOPIC SYLLABLE GYO*/
-                                                     0, /* U+002ddf: */
-                                                     0, /* U+002de0: */
-                                                     0, /* U+002de1: */
-                                                     0, /* U+002de2: */
-                                                     0, /* U+002de3: */
-                                                     0, /* U+002de4: */
-                                                     0, /* U+002de5: */
-                                                     0, /* U+002de6: */
-                                                     0, /* U+002de7: */
-                                                     0, /* U+002de8: */
-                                                     0, /* U+002de9: */
-                                                     0, /* U+002dea: */
-                                                     0, /* U+002deb: */
-                                                     0, /* U+002dec: */
-                                                     0, /* U+002ded: */
-                                                     0, /* U+002dee: */
-                                                     0, /* U+002def: */
-                                                     0, /* U+002df0: */
-                                                     0, /* U+002df1: */
-                                                     0, /* U+002df2: */
-                                                     0, /* U+002df3: */
-                                                     0, /* U+002df4: */
-                                                     0, /* U+002df5: */
-                                                     0, /* U+002df6: */
-                                                     0, /* U+002df7: */
-                                                     0, /* U+002df8: */
-                                                     0, /* U+002df9: */
-                                                     0, /* U+002dfa: */
-                                                     0, /* U+002dfb: */
-                                                     0, /* U+002dfc: */
-                                                     0, /* U+002dfd: */
-                                                     0, /* U+002dfe: */
-                                                     0, /* U+002dff: */
-                                                     0, /* U+002e00: RIGHT ANGLE SUBSTITUTION MARKER*/
-                                                     0, /* U+002e01: RIGHT ANGLE DOTTED SUBSTITUTION MARKER*/
-                                                     0, /* U+002e02: LEFT SUBSTITUTION BRACKET*/
-                                                     0, /* U+002e03: RIGHT SUBSTITUTION BRACKET*/
-                                                     0, /* U+002e04: LEFT DOTTED SUBSTITUTION BRACKET*/
-                                                     0, /* U+002e05: RIGHT DOTTED SUBSTITUTION BRACKET*/
-                                                     0, /* U+002e06: RAISED INTERPOLATION MARKER*/
-                                                     0, /* U+002e07: RAISED DOTTED INTERPOLATION MARKER*/
-                                                     0, /* U+002e08: DOTTED TRANSPOSITION MARKER*/
-                                                     0, /* U+002e09: LEFT TRANSPOSITION BRACKET*/
-                                                     0, /* U+002e0a: RIGHT TRANSPOSITION BRACKET*/
-                                                     0, /* U+002e0b: RAISED SQUARE*/
-                                                     0, /* U+002e0c: LEFT RAISED OMISSION BRACKET*/
-                                                     0, /* U+002e0d: RIGHT RAISED OMISSION BRACKET*/
-                                                     0, /* U+002e0e: EDITORIAL CORONIS*/
-                                                     0, /* U+002e0f: PARAGRAPHOS*/
-                                                     0, /* U+002e10: FORKED PARAGRAPHOS*/
-                                                     0, /* U+002e11: REVERSED FORKED PARAGRAPHOS*/
-                                                     0, /* U+002e12: HYPODIASTOLE*/
-                                                     0, /* U+002e13: DOTTED OBELOS*/
-                                                     0, /* U+002e14: DOWNWARDS ANCORA*/
-                                                     0, /* U+002e15: UPWARDS ANCORA*/
-                                                     0, /* U+002e16: DOTTED RIGHT-POINTING ANGLE*/
-                                                     0, /* U+002e17: DOUBLE OBLIQUE HYPHEN*/
-                                                     0, /* U+002e18: */
-                                                     0, /* U+002e19: */
-                                                     0, /* U+002e1a: */
-                                                     0, /* U+002e1b: */
-                                                     0, /* U+002e1c: LEFT LOW PARAPHRASE BRACKET*/
-                                                     0, /* U+002e1d: RIGHT LOW PARAPHRASE BRACKET*/
-                                                     0, /* U+002e1e: */
-                                                     0, /* U+002e1f: */
-                                                     0, /* U+002e20: */
-                                                     0, /* U+002e21: */
-                                                     0, /* U+002e22: */
-                                                     0, /* U+002e23: */
-                                                     0, /* U+002e24: */
-                                                     0, /* U+002e25: */
-                                                     0, /* U+002e26: */
-                                                     0, /* U+002e27: */
-                                                     0, /* U+002e28: */
-                                                     0, /* U+002e29: */
-                                                     0, /* U+002e2a: */
-                                                     0, /* U+002e2b: */
-                                                     0, /* U+002e2c: */
-                                                     0, /* U+002e2d: */
-                                                     0, /* U+002e2e: */
-                                                     0, /* U+002e2f: */
-                                                     0, /* U+002e30: */
-                                                     0, /* U+002e31: */
-                                                     0, /* U+002e32: */
-                                                     0, /* U+002e33: */
-                                                     0, /* U+002e34: */
-                                                     0, /* U+002e35: */
-                                                     0, /* U+002e36: */
-                                                     0, /* U+002e37: */
-                                                     0, /* U+002e38: */
-                                                     0, /* U+002e39: */
-                                                     0, /* U+002e3a: */
-                                                     0, /* U+002e3b: */
-                                                     0, /* U+002e3c: */
-                                                     0, /* U+002e3d: */
-                                                     0, /* U+002e3e: */
-                                                     0, /* U+002e3f: */
-                                                     0, /* U+002e40: */
-                                                     0, /* U+002e41: */
-                                                     0, /* U+002e42: */
-                                                     0, /* U+002e43: */
-                                                     0, /* U+002e44: */
-                                                     0, /* U+002e45: */
-                                                     0, /* U+002e46: */
-                                                     0, /* U+002e47: */
-                                                     0, /* U+002e48: */
-                                                     0, /* U+002e49: */
-                                                     0, /* U+002e4a: */
-                                                     0, /* U+002e4b: */
-                                                     0, /* U+002e4c: */
-                                                     0, /* U+002e4d: */
-                                                     0, /* U+002e4e: */
-                                                     0, /* U+002e4f: */
-                                                     0, /* U+002e50: */
-                                                     0, /* U+002e51: */
-                                                     0, /* U+002e52: */
-                                                     0, /* U+002e53: */
-                                                     0, /* U+002e54: */
-                                                     0, /* U+002e55: */
-                                                     0, /* U+002e56: */
-                                                     0, /* U+002e57: */
-                                                     0, /* U+002e58: */
-                                                     0, /* U+002e59: */
-                                                     0, /* U+002e5a: */
-                                                     0, /* U+002e5b: */
-                                                     0, /* U+002e5c: */
-                                                     0, /* U+002e5d: */
-                                                     0, /* U+002e5e: */
-                                                     0, /* U+002e5f: */
-                                                     0, /* U+002e60: */
-                                                     0, /* U+002e61: */
-                                                     0, /* U+002e62: */
-                                                     0, /* U+002e63: */
-                                                     0, /* U+002e64: */
-                                                     0, /* U+002e65: */
-                                                     0, /* U+002e66: */
-                                                     0, /* U+002e67: */
-                                                     0, /* U+002e68: */
-                                                     0, /* U+002e69: */
-                                                     0, /* U+002e6a: */
-                                                     0, /* U+002e6b: */
-                                                     0, /* U+002e6c: */
-                                                     0, /* U+002e6d: */
-                                                     0, /* U+002e6e: */
-                                                     0, /* U+002e6f: */
-                                                     0, /* U+002e70: */
-                                                     0, /* U+002e71: */
-                                                     0, /* U+002e72: */
-                                                     0, /* U+002e73: */
-                                                     0, /* U+002e74: */
-                                                     0, /* U+002e75: */
-                                                     0, /* U+002e76: */
-                                                     0, /* U+002e77: */
-                                                     0, /* U+002e78: */
-                                                     0, /* U+002e79: */
-                                                     0, /* U+002e7a: */
-                                                     0, /* U+002e7b: */
-                                                     0, /* U+002e7c: */
-                                                     0, /* U+002e7d: */
-                                                     0, /* U+002e7e: */
-                                                     0, /* U+002e7f: */
-                                                     0, /* U+002e80: CJK RADICAL REPEAT*/
-                                                     0, /* U+002e81: CJK RADICAL CLIFF*/
-                                                     0, /* U+002e82: CJK RADICAL SECOND ONE*/
-                                                     0, /* U+002e83: CJK RADICAL SECOND TWO*/
-                                                     0, /* U+002e84: CJK RADICAL SECOND THREE*/
-                                                     0, /* U+002e85: CJK RADICAL PERSON*/
-                                                     0, /* U+002e86: CJK RADICAL BOX*/
-                                                     0, /* U+002e87: CJK RADICAL TABLE*/
-                                                     0, /* U+002e88: CJK RADICAL KNIFE ONE*/
-                                                     0, /* U+002e89: CJK RADICAL KNIFE TWO*/
-                                                     0, /* U+002e8a: CJK RADICAL DIVINATION*/
-                                                     0, /* U+002e8b: CJK RADICAL SEAL*/
-                                                     0, /* U+002e8c: CJK RADICAL SMALL ONE*/
-                                                     0, /* U+002e8d: CJK RADICAL SMALL TWO*/
-                                                     0, /* U+002e8e: CJK RADICAL LAME ONE*/
-                                                     0, /* U+002e8f: CJK RADICAL LAME TWO*/
-                                                     0, /* U+002e90: CJK RADICAL LAME THREE*/
-                                                     0, /* U+002e91: CJK RADICAL LAME FOUR*/
-                                                     0, /* U+002e92: CJK RADICAL SNAKE*/
-                                                     0, /* U+002e93: CJK RADICAL THREAD*/
-                                                     0, /* U+002e94: CJK RADICAL SNOUT ONE*/
-                                                     0, /* U+002e95: CJK RADICAL SNOUT TWO*/
-                                                     0, /* U+002e96: CJK RADICAL HEART ONE*/
-                                                     0, /* U+002e97: CJK RADICAL HEART TWO*/
-                                                     0, /* U+002e98: CJK RADICAL HAND*/
-                                                     0, /* U+002e99: CJK RADICAL RAP*/
-                                                     0, /* U+002e9a: */
-                                                     0, /* U+002e9b: CJK RADICAL CHOKE*/
-                                                     0, /* U+002e9c: CJK RADICAL SUN*/
-                                                     0, /* U+002e9d: CJK RADICAL MOON*/
-                                                     0, /* U+002e9e: CJK RADICAL DEATH*/
-                                                     0, /* U+002e9f: CJK RADICAL MOTHER*/
-                                                     0, /* U+002ea0: CJK RADICAL CIVILIAN*/
-                                                     0, /* U+002ea1: CJK RADICAL WATER ONE*/
-                                                     0, /* U+002ea2: CJK RADICAL WATER TWO*/
-                                                     0, /* U+002ea3: CJK RADICAL FIRE*/
-                                                     0, /* U+002ea4: CJK RADICAL PAW ONE*/
-                                                     0, /* U+002ea5: CJK RADICAL PAW TWO*/
-                                                     0, /* U+002ea6: CJK RADICAL SIMPLIFIED HALF TREE TRUNK*/
-                                                     0, /* U+002ea7: CJK RADICAL COW*/
-                                                     0, /* U+002ea8: CJK RADICAL DOG*/
-                                                     0, /* U+002ea9: CJK RADICAL JADE*/
-                                                     0, /* U+002eaa: CJK RADICAL BOLT OF CLOTH*/
-                                                     0, /* U+002eab: CJK RADICAL EYE*/
-                                                     0, /* U+002eac: CJK RADICAL SPIRIT ONE*/
-                                                     0, /* U+002ead: CJK RADICAL SPIRIT TWO*/
-                                                     0, /* U+002eae: CJK RADICAL BAMBOO*/
-                                                     0, /* U+002eaf: CJK RADICAL SILK*/
-                                                     0, /* U+002eb0: CJK RADICAL C-SIMPLIFIED SILK*/
-                                                     0, /* U+002eb1: CJK RADICAL NET ONE*/
-                                                     0, /* U+002eb2: CJK RADICAL NET TWO*/
-                                                     0, /* U+002eb3: CJK RADICAL NET THREE*/
-                                                     0, /* U+002eb4: CJK RADICAL NET FOUR*/
-                                                     0, /* U+002eb5: CJK RADICAL MESH*/
-                                                     0, /* U+002eb6: CJK RADICAL SHEEP*/
-                                                     0, /* U+002eb7: CJK RADICAL RAM*/
-                                                     0, /* U+002eb8: CJK RADICAL EWE*/
-                                                     0, /* U+002eb9: CJK RADICAL OLD*/
-                                                     0, /* U+002eba: CJK RADICAL BRUSH ONE*/
-                                                     0, /* U+002ebb: CJK RADICAL BRUSH TWO*/
-                                                     0, /* U+002ebc: CJK RADICAL MEAT*/
-                                                     0, /* U+002ebd: CJK RADICAL MORTAR*/
-                                                     0, /* U+002ebe: CJK RADICAL GRASS ONE*/
-                                                     0, /* U+002ebf: CJK RADICAL GRASS TWO*/
-                                                     0, /* U+002ec0: CJK RADICAL GRASS THREE*/
-                                                     0, /* U+002ec1: CJK RADICAL TIGER*/
-                                                     0, /* U+002ec2: CJK RADICAL CLOTHES*/
-                                                     0, /* U+002ec3: CJK RADICAL WEST ONE*/
-                                                     0, /* U+002ec4: CJK RADICAL WEST TWO*/
-                                                     0, /* U+002ec5: CJK RADICAL C-SIMPLIFIED SEE*/
-                                                     0, /* U+002ec6: CJK RADICAL SIMPLIFIED HORN*/
-                                                     0, /* U+002ec7: CJK RADICAL HORN*/
-                                                     0, /* U+002ec8: CJK RADICAL C-SIMPLIFIED SPEECH*/
-                                                     0, /* U+002ec9: CJK RADICAL C-SIMPLIFIED SHELL*/
-                                                     0, /* U+002eca: CJK RADICAL FOOT*/
-                                                     0, /* U+002ecb: CJK RADICAL C-SIMPLIFIED CART*/
-                                                     0, /* U+002ecc: CJK RADICAL SIMPLIFIED WALK*/
-                                                     0, /* U+002ecd: CJK RADICAL WALK ONE*/
-                                                     0, /* U+002ece: CJK RADICAL WALK TWO*/
-                                                     0, /* U+002ecf: CJK RADICAL CITY*/
-                                                     0, /* U+002ed0: CJK RADICAL C-SIMPLIFIED GOLD*/
-                                                     0, /* U+002ed1: CJK RADICAL LONG ONE*/
-                                                     0, /* U+002ed2: CJK RADICAL LONG TWO*/
-                                                     0, /* U+002ed3: CJK RADICAL C-SIMPLIFIED LONG*/
-                                                     0, /* U+002ed4: CJK RADICAL C-SIMPLIFIED GATE*/
-                                                     0, /* U+002ed5: CJK RADICAL MOUND ONE*/
-                                                     0, /* U+002ed6: CJK RADICAL MOUND TWO*/
-                                                     0, /* U+002ed7: CJK RADICAL RAIN*/
-                                                     0, /* U+002ed8: CJK RADICAL BLUE*/
-                                                     0, /* U+002ed9: CJK RADICAL C-SIMPLIFIED TANNED LEATHER*/
-                                                     0, /* U+002eda: CJK RADICAL C-SIMPLIFIED LEAF*/
-                                                     0, /* U+002edb: CJK RADICAL C-SIMPLIFIED WIND*/
-                                                     0, /* U+002edc: CJK RADICAL C-SIMPLIFIED FLY*/
-                                                     0, /* U+002edd: CJK RADICAL EAT ONE*/
-                                                     0, /* U+002ede: CJK RADICAL EAT TWO*/
-                                                     0, /* U+002edf: CJK RADICAL EAT THREE*/
-                                                     0, /* U+002ee0: CJK RADICAL C-SIMPLIFIED EAT*/
-                                                     0, /* U+002ee1: CJK RADICAL HEAD*/
-                                                     0, /* U+002ee2: CJK RADICAL C-SIMPLIFIED HORSE*/
-                                                     0, /* U+002ee3: CJK RADICAL BONE*/
-                                                     0, /* U+002ee4: CJK RADICAL GHOST*/
-                                                     0, /* U+002ee5: CJK RADICAL C-SIMPLIFIED FISH*/
-                                                     0, /* U+002ee6: CJK RADICAL C-SIMPLIFIED BIRD*/
-                                                     0, /* U+002ee7: CJK RADICAL C-SIMPLIFIED SALT*/
-                                                     0, /* U+002ee8: CJK RADICAL SIMPLIFIED WHEAT*/
-                                                     0, /* U+002ee9: CJK RADICAL SIMPLIFIED YELLOW*/
-                                                     0, /* U+002eea: CJK RADICAL C-SIMPLIFIED FROG*/
-                                                     0, /* U+002eeb: CJK RADICAL J-SIMPLIFIED EVEN*/
-                                                     0, /* U+002eec: CJK RADICAL C-SIMPLIFIED EVEN*/
-                                                     0, /* U+002eed: CJK RADICAL J-SIMPLIFIED TOOTH*/
-                                                     0, /* U+002eee: CJK RADICAL C-SIMPLIFIED TOOTH*/
-                                                     0, /* U+002eef: CJK RADICAL J-SIMPLIFIED DRAGON*/
-                                                     0, /* U+002ef0: CJK RADICAL C-SIMPLIFIED DRAGON*/
-                                                     0, /* U+002ef1: CJK RADICAL TURTLE*/
-                                                     0, /* U+002ef2: CJK RADICAL J-SIMPLIFIED TURTLE*/
-                                                     0, /* U+002ef3: CJK RADICAL C-SIMPLIFIED TURTLE*/
-                                                     0, /* U+002ef4: */
-                                                     0, /* U+002ef5: */
-                                                     0, /* U+002ef6: */
-                                                     0, /* U+002ef7: */
-                                                     0, /* U+002ef8: */
-                                                     0, /* U+002ef9: */
-                                                     0, /* U+002efa: */
-                                                     0, /* U+002efb: */
-                                                     0, /* U+002efc: */
-                                                     0, /* U+002efd: */
-                                                     0, /* U+002efe: */
-                                                     0, /* U+002eff: */
-                                                     0, /* U+002f00: KANGXI RADICAL ONE*/
-                                                     0, /* U+002f01: KANGXI RADICAL LINE*/
-                                                     0, /* U+002f02: KANGXI RADICAL DOT*/
-                                                     0, /* U+002f03: KANGXI RADICAL SLASH*/
-                                                     0, /* U+002f04: KANGXI RADICAL SECOND*/
-                                                     0, /* U+002f05: KANGXI RADICAL HOOK*/
-                                                     0, /* U+002f06: KANGXI RADICAL TWO*/
-                                                     0, /* U+002f07: KANGXI RADICAL LID*/
-                                                     0, /* U+002f08: KANGXI RADICAL MAN*/
-                                                     0, /* U+002f09: KANGXI RADICAL LEGS*/
-                                                     0, /* U+002f0a: KANGXI RADICAL ENTER*/
-                                                     0, /* U+002f0b: KANGXI RADICAL EIGHT*/
-                                                     0, /* U+002f0c: KANGXI RADICAL DOWN BOX*/
-                                                     0, /* U+002f0d: KANGXI RADICAL COVER*/
-                                                     0, /* U+002f0e: KANGXI RADICAL ICE*/
-                                                     0, /* U+002f0f: KANGXI RADICAL TABLE*/
-                                                     0, /* U+002f10: KANGXI RADICAL OPEN BOX*/
-                                                     0, /* U+002f11: KANGXI RADICAL KNIFE*/
-                                                     0, /* U+002f12: KANGXI RADICAL POWER*/
-                                                     0, /* U+002f13: KANGXI RADICAL WRAP*/
-                                                     0, /* U+002f14: KANGXI RADICAL SPOON*/
-                                                     0, /* U+002f15: KANGXI RADICAL RIGHT OPEN BOX*/
-                                                     0, /* U+002f16: KANGXI RADICAL HIDING ENCLOSURE*/
-                                                     0, /* U+002f17: KANGXI RADICAL TEN*/
-                                                     0, /* U+002f18: KANGXI RADICAL DIVINATION*/
-                                                     0, /* U+002f19: KANGXI RADICAL SEAL*/
-                                                     0, /* U+002f1a: KANGXI RADICAL CLIFF*/
-                                                     0, /* U+002f1b: KANGXI RADICAL PRIVATE*/
-                                                     0, /* U+002f1c: KANGXI RADICAL AGAIN*/
-                                                     0, /* U+002f1d: KANGXI RADICAL MOUTH*/
-                                                     0, /* U+002f1e: KANGXI RADICAL ENCLOSURE*/
-                                                     0, /* U+002f1f: KANGXI RADICAL EARTH*/
-                                                     0, /* U+002f20: KANGXI RADICAL SCHOLAR*/
-                                                     0, /* U+002f21: KANGXI RADICAL GO*/
-                                                     0, /* U+002f22: KANGXI RADICAL GO SLOWLY*/
-                                                     0, /* U+002f23: KANGXI RADICAL EVENING*/
-                                                     0, /* U+002f24: KANGXI RADICAL BIG*/
-                                                     0, /* U+002f25: KANGXI RADICAL WOMAN*/
-                                                     0, /* U+002f26: KANGXI RADICAL CHILD*/
-                                                     0, /* U+002f27: KANGXI RADICAL ROOF*/
-                                                     0, /* U+002f28: KANGXI RADICAL INCH*/
-                                                     0, /* U+002f29: KANGXI RADICAL SMALL*/
-                                                     0, /* U+002f2a: KANGXI RADICAL LAME*/
-                                                     0, /* U+002f2b: KANGXI RADICAL CORPSE*/
-                                                     0, /* U+002f2c: KANGXI RADICAL SPROUT*/
-                                                     0, /* U+002f2d: KANGXI RADICAL MOUNTAIN*/
-                                                     0, /* U+002f2e: KANGXI RADICAL RIVER*/
-                                                     0, /* U+002f2f: KANGXI RADICAL WORK*/
-                                                     0, /* U+002f30: KANGXI RADICAL ONESELF*/
-                                                     0, /* U+002f31: KANGXI RADICAL TURBAN*/
-                                                     0, /* U+002f32: KANGXI RADICAL DRY*/
-                                                     0, /* U+002f33: KANGXI RADICAL SHORT THREAD*/
-                                                     0, /* U+002f34: KANGXI RADICAL DOTTED CLIFF*/
-                                                     0, /* U+002f35: KANGXI RADICAL LONG STRIDE*/
-                                                     0, /* U+002f36: KANGXI RADICAL TWO HANDS*/
-                                                     0, /* U+002f37: KANGXI RADICAL SHOOT*/
-                                                     0, /* U+002f38: KANGXI RADICAL BOW*/
-                                                     0, /* U+002f39: KANGXI RADICAL SNOUT*/
-                                                     0, /* U+002f3a: KANGXI RADICAL BRISTLE*/
-                                                     0, /* U+002f3b: KANGXI RADICAL STEP*/
-                                                     0, /* U+002f3c: KANGXI RADICAL HEART*/
-                                                     0, /* U+002f3d: KANGXI RADICAL HALBERD*/
-                                                     0, /* U+002f3e: KANGXI RADICAL DOOR*/
-                                                     0, /* U+002f3f: KANGXI RADICAL HAND*/
-                                                     0, /* U+002f40: KANGXI RADICAL BRANCH*/
-                                                     0, /* U+002f41: KANGXI RADICAL RAP*/
-                                                     0, /* U+002f42: KANGXI RADICAL SCRIPT*/
-                                                     0, /* U+002f43: KANGXI RADICAL DIPPER*/
-                                                     0, /* U+002f44: KANGXI RADICAL AXE*/
-                                                     0, /* U+002f45: KANGXI RADICAL SQUARE*/
-                                                     0, /* U+002f46: KANGXI RADICAL NOT*/
-                                                     0, /* U+002f47: KANGXI RADICAL SUN*/
-                                                     0, /* U+002f48: KANGXI RADICAL SAY*/
-                                                     0, /* U+002f49: KANGXI RADICAL MOON*/
-                                                     0, /* U+002f4a: KANGXI RADICAL TREE*/
-                                                     0, /* U+002f4b: KANGXI RADICAL LACK*/
-                                                     0, /* U+002f4c: KANGXI RADICAL STOP*/
-                                                     0, /* U+002f4d: KANGXI RADICAL DEATH*/
-                                                     0, /* U+002f4e: KANGXI RADICAL WEAPON*/
-                                                     0, /* U+002f4f: KANGXI RADICAL DO NOT*/
-                                                     0, /* U+002f50: KANGXI RADICAL COMPARE*/
-                                                     0, /* U+002f51: KANGXI RADICAL FUR*/
-                                                     0, /* U+002f52: KANGXI RADICAL CLAN*/
-                                                     0, /* U+002f53: KANGXI RADICAL STEAM*/
-                                                     0, /* U+002f54: KANGXI RADICAL WATER*/
-                                                     0, /* U+002f55: KANGXI RADICAL FIRE*/
-                                                     0, /* U+002f56: KANGXI RADICAL CLAW*/
-                                                     0, /* U+002f57: KANGXI RADICAL FATHER*/
-                                                     0, /* U+002f58: KANGXI RADICAL DOUBLE X*/
-                                                     0, /* U+002f59: KANGXI RADICAL HALF TREE TRUNK*/
-                                                     0, /* U+002f5a: KANGXI RADICAL SLICE*/
-                                                     0, /* U+002f5b: KANGXI RADICAL FANG*/
-                                                     0, /* U+002f5c: KANGXI RADICAL COW*/
-                                                     0, /* U+002f5d: KANGXI RADICAL DOG*/
-                                                     0, /* U+002f5e: KANGXI RADICAL PROFOUND*/
-                                                     0, /* U+002f5f: KANGXI RADICAL JADE*/
-                                                     0, /* U+002f60: KANGXI RADICAL MELON*/
-                                                     0, /* U+002f61: KANGXI RADICAL TILE*/
-                                                     0, /* U+002f62: KANGXI RADICAL SWEET*/
-                                                     0, /* U+002f63: KANGXI RADICAL LIFE*/
-                                                     0, /* U+002f64: KANGXI RADICAL USE*/
-                                                     0, /* U+002f65: KANGXI RADICAL FIELD*/
-                                                     0, /* U+002f66: KANGXI RADICAL BOLT OF CLOTH*/
-                                                     0, /* U+002f67: KANGXI RADICAL SICKNESS*/
-                                                     0, /* U+002f68: KANGXI RADICAL DOTTED TENT*/
-                                                     0, /* U+002f69: KANGXI RADICAL WHITE*/
-                                                     0, /* U+002f6a: KANGXI RADICAL SKIN*/
-                                                     0, /* U+002f6b: KANGXI RADICAL DISH*/
-                                                     0, /* U+002f6c: KANGXI RADICAL EYE*/
-                                                     0, /* U+002f6d: KANGXI RADICAL SPEAR*/
-                                                     0, /* U+002f6e: KANGXI RADICAL ARROW*/
-                                                     0, /* U+002f6f: KANGXI RADICAL STONE*/
-                                                     0, /* U+002f70: KANGXI RADICAL SPIRIT*/
-                                                     0, /* U+002f71: KANGXI RADICAL TRACK*/
-                                                     0, /* U+002f72: KANGXI RADICAL GRAIN*/
-                                                     0, /* U+002f73: KANGXI RADICAL CAVE*/
-                                                     0, /* U+002f74: KANGXI RADICAL STAND*/
-                                                     0, /* U+002f75: KANGXI RADICAL BAMBOO*/
-                                                     0, /* U+002f76: KANGXI RADICAL RICE*/
-                                                     0, /* U+002f77: KANGXI RADICAL SILK*/
-                                                     0, /* U+002f78: KANGXI RADICAL JAR*/
-                                                     0, /* U+002f79: KANGXI RADICAL NET*/
-                                                     0, /* U+002f7a: KANGXI RADICAL SHEEP*/
-                                                     0, /* U+002f7b: KANGXI RADICAL FEATHER*/
-                                                     0, /* U+002f7c: KANGXI RADICAL OLD*/
-                                                     0, /* U+002f7d: KANGXI RADICAL AND*/
-                                                     0, /* U+002f7e: KANGXI RADICAL PLOW*/
-                                                     0, /* U+002f7f: KANGXI RADICAL EAR*/
-                                                     0, /* U+002f80: KANGXI RADICAL BRUSH*/
-                                                     0, /* U+002f81: KANGXI RADICAL MEAT*/
-                                                     0, /* U+002f82: KANGXI RADICAL MINISTER*/
-                                                     0, /* U+002f83: KANGXI RADICAL SELF*/
-                                                     0, /* U+002f84: KANGXI RADICAL ARRIVE*/
-                                                     0, /* U+002f85: KANGXI RADICAL MORTAR*/
-                                                     0, /* U+002f86: KANGXI RADICAL TONGUE*/
-                                                     0, /* U+002f87: KANGXI RADICAL OPPOSE*/
-                                                     0, /* U+002f88: KANGXI RADICAL BOAT*/
-                                                     0, /* U+002f89: KANGXI RADICAL STOPPING*/
-                                                     0, /* U+002f8a: KANGXI RADICAL COLOR*/
-                                                     0, /* U+002f8b: KANGXI RADICAL GRASS*/
-                                                     0, /* U+002f8c: KANGXI RADICAL TIGER*/
-                                                     0, /* U+002f8d: KANGXI RADICAL INSECT*/
-                                                     0, /* U+002f8e: KANGXI RADICAL BLOOD*/
-                                                     0, /* U+002f8f: KANGXI RADICAL WALK ENCLOSURE*/
-                                                     0, /* U+002f90: KANGXI RADICAL CLOTHES*/
-                                                     0, /* U+002f91: KANGXI RADICAL WEST*/
-                                                     0, /* U+002f92: KANGXI RADICAL SEE*/
-                                                     0, /* U+002f93: KANGXI RADICAL HORN*/
-                                                     0, /* U+002f94: KANGXI RADICAL SPEECH*/
-                                                     0, /* U+002f95: KANGXI RADICAL VALLEY*/
-                                                     0, /* U+002f96: KANGXI RADICAL BEAN*/
-                                                     0, /* U+002f97: KANGXI RADICAL PIG*/
-                                                     0, /* U+002f98: KANGXI RADICAL BADGER*/
-                                                     0, /* U+002f99: KANGXI RADICAL SHELL*/
-                                                     0, /* U+002f9a: KANGXI RADICAL RED*/
-                                                     0, /* U+002f9b: KANGXI RADICAL RUN*/
-                                                     0, /* U+002f9c: KANGXI RADICAL FOOT*/
-                                                     0, /* U+002f9d: KANGXI RADICAL BODY*/
-                                                     0, /* U+002f9e: KANGXI RADICAL CART*/
-                                                     0, /* U+002f9f: KANGXI RADICAL BITTER*/
-                                                     0, /* U+002fa0: KANGXI RADICAL MORNING*/
-                                                     0, /* U+002fa1: KANGXI RADICAL WALK*/
-                                                     0, /* U+002fa2: KANGXI RADICAL CITY*/
-                                                     0, /* U+002fa3: KANGXI RADICAL WINE*/
-                                                     0, /* U+002fa4: KANGXI RADICAL DISTINGUISH*/
-                                                     0, /* U+002fa5: KANGXI RADICAL VILLAGE*/
-                                                     0, /* U+002fa6: KANGXI RADICAL GOLD*/
-                                                     0, /* U+002fa7: KANGXI RADICAL LONG*/
-                                                     0, /* U+002fa8: KANGXI RADICAL GATE*/
-                                                     0, /* U+002fa9: KANGXI RADICAL MOUND*/
-                                                     0, /* U+002faa: KANGXI RADICAL SLAVE*/
-                                                     0, /* U+002fab: KANGXI RADICAL SHORT TAILED BIRD*/
-                                                     0, /* U+002fac: KANGXI RADICAL RAIN*/
-                                                     0, /* U+002fad: KANGXI RADICAL BLUE*/
-                                                     0, /* U+002fae: KANGXI RADICAL WRONG*/
-                                                     0, /* U+002faf: KANGXI RADICAL FACE*/
-                                                     0, /* U+002fb0: KANGXI RADICAL LEATHER*/
-                                                     0, /* U+002fb1: KANGXI RADICAL TANNED LEATHER*/
-                                                     0, /* U+002fb2: KANGXI RADICAL LEEK*/
-                                                     0, /* U+002fb3: KANGXI RADICAL SOUND*/
-                                                     0, /* U+002fb4: KANGXI RADICAL LEAF*/
-                                                     0, /* U+002fb5: KANGXI RADICAL WIND*/
-                                                     0, /* U+002fb6: KANGXI RADICAL FLY*/
-                                                     0, /* U+002fb7: KANGXI RADICAL EAT*/
-                                                     0, /* U+002fb8: KANGXI RADICAL HEAD*/
-                                                     0, /* U+002fb9: KANGXI RADICAL FRAGRANT*/
-                                                     0, /* U+002fba: KANGXI RADICAL HORSE*/
-                                                     0, /* U+002fbb: KANGXI RADICAL BONE*/
-                                                     0, /* U+002fbc: KANGXI RADICAL TALL*/
-                                                     0, /* U+002fbd: KANGXI RADICAL HAIR*/
-                                                     0, /* U+002fbe: KANGXI RADICAL FIGHT*/
-                                                     0, /* U+002fbf: KANGXI RADICAL SACRIFICIAL WINE*/
-                                                     0, /* U+002fc0: KANGXI RADICAL CAULDRON*/
-                                                     0, /* U+002fc1: KANGXI RADICAL GHOST*/
-                                                     0, /* U+002fc2: KANGXI RADICAL FISH*/
-                                                     0, /* U+002fc3: KANGXI RADICAL BIRD*/
-                                                     0, /* U+002fc4: KANGXI RADICAL SALT*/
-                                                     0, /* U+002fc5: KANGXI RADICAL DEER*/
-                                                     0, /* U+002fc6: KANGXI RADICAL WHEAT*/
-                                                     0, /* U+002fc7: KANGXI RADICAL HEMP*/
-                                                     0, /* U+002fc8: KANGXI RADICAL YELLOW*/
-                                                     0, /* U+002fc9: KANGXI RADICAL MILLET*/
-                                                     0, /* U+002fca: KANGXI RADICAL BLACK*/
-                                                     0, /* U+002fcb: KANGXI RADICAL EMBROIDERY*/
-                                                     0, /* U+002fcc: KANGXI RADICAL FROG*/
-                                                     0, /* U+002fcd: KANGXI RADICAL TRIPOD*/
-                                                     0, /* U+002fce: KANGXI RADICAL DRUM*/
-                                                     0, /* U+002fcf: KANGXI RADICAL RAT*/
-                                                     0, /* U+002fd0: KANGXI RADICAL NOSE*/
-                                                     0, /* U+002fd1: KANGXI RADICAL EVEN*/
-                                                     0, /* U+002fd2: KANGXI RADICAL TOOTH*/
-                                                     0, /* U+002fd3: KANGXI RADICAL DRAGON*/
-                                                     0, /* U+002fd4: KANGXI RADICAL TURTLE*/
-                                                     0, /* U+002fd5: KANGXI RADICAL FLUTE*/
-                                                     0, /* U+002fd6: */
-                                                     0, /* U+002fd7: */
-                                                     0, /* U+002fd8: */
-                                                     0, /* U+002fd9: */
-                                                     0, /* U+002fda: */
-                                                     0, /* U+002fdb: */
-                                                     0, /* U+002fdc: */
-                                                     0, /* U+002fdd: */
-                                                     0, /* U+002fde: */
-                                                     0, /* U+002fdf: */
-                                                     0, /* U+002fe0: */
-                                                     0, /* U+002fe1: */
-                                                     0, /* U+002fe2: */
-                                                     0, /* U+002fe3: */
-                                                     0, /* U+002fe4: */
-                                                     0, /* U+002fe5: */
-                                                     0, /* U+002fe6: */
-                                                     0, /* U+002fe7: */
-                                                     0, /* U+002fe8: */
-                                                     0, /* U+002fe9: */
-                                                     0, /* U+002fea: */
-                                                     0, /* U+002feb: */
-                                                     0, /* U+002fec: */
-                                                     0, /* U+002fed: */
-                                                     0, /* U+002fee: */
-                                                     0, /* U+002fef: */
-                                                     0, /* U+002ff0: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT*/
-                                                     0, /* U+002ff1: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW*/
-                                                     0, /* U+002ff2: IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT*/
-                                                     0, /* U+002ff3: IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW*/
-                                                     0, /* U+002ff4: IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND*/
-                                                     0, /* U+002ff5: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE*/
-                                                     0, /* U+002ff6: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW*/
-                                                     0, /* U+002ff7: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT*/
-                                                     0, /* U+002ff8: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT*/
-                                                     0, /* U+002ff9: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT*/
-                                                     0, /* U+002ffa: IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT*/
-                                                     0, /* U+002ffb: IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID*/
-                                                     0, /* U+002ffc: */
-                                                     0, /* U+002ffd: */
-                                                     0, /* U+002ffe: */
-                                                     0, /* U+002fff: */
-                                          RTUNI_WSPACE, /* U+003000: IDEOGRAPHIC SPACE*/
-                                                     0, /* U+003001: IDEOGRAPHIC COMMA*/
-                                                     0, /* U+003002: IDEOGRAPHIC FULL STOP*/
-                                                     0, /* U+003003: DITTO MARK*/
-                                                     0, /* U+003004: JAPANESE INDUSTRIAL STANDARD SYMBOL*/
-                                           RTUNI_ALPHA, /* U+003005: IDEOGRAPHIC ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+003006: IDEOGRAPHIC CLOSING MARK*/
-                                           RTUNI_ALPHA, /* U+003007: IDEOGRAPHIC NUMBER ZERO*/
-                                                     0, /* U+003008: LEFT ANGLE BRACKET*/
-                                                     0, /* U+003009: RIGHT ANGLE BRACKET*/
-                                                     0, /* U+00300a: LEFT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+00300b: RIGHT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+00300c: LEFT CORNER BRACKET*/
-                                                     0, /* U+00300d: RIGHT CORNER BRACKET*/
-                                                     0, /* U+00300e: LEFT WHITE CORNER BRACKET*/
-                                                     0, /* U+00300f: RIGHT WHITE CORNER BRACKET*/
-                                                     0, /* U+003010: LEFT BLACK LENTICULAR BRACKET*/
-                                                     0, /* U+003011: RIGHT BLACK LENTICULAR BRACKET*/
-                                                     0, /* U+003012: POSTAL MARK*/
-                                                     0, /* U+003013: GETA MARK*/
-                                                     0, /* U+003014: LEFT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+003015: RIGHT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+003016: LEFT WHITE LENTICULAR BRACKET*/
-                                                     0, /* U+003017: RIGHT WHITE LENTICULAR BRACKET*/
-                                                     0, /* U+003018: LEFT WHITE TORTOISE SHELL BRACKET*/
-                                                     0, /* U+003019: RIGHT WHITE TORTOISE SHELL BRACKET*/
-                                                     0, /* U+00301a: LEFT WHITE SQUARE BRACKET*/
-                                                     0, /* U+00301b: RIGHT WHITE SQUARE BRACKET*/
-                                                     0, /* U+00301c: WAVE DASH*/
-                                                     0, /* U+00301d: REVERSED DOUBLE PRIME QUOTATION MARK*/
-                                                     0, /* U+00301e: DOUBLE PRIME QUOTATION MARK*/
-                                                     0, /* U+00301f: LOW DOUBLE PRIME QUOTATION MARK*/
-                                                     0, /* U+003020: POSTAL MARK FACE*/
-                                           RTUNI_ALPHA, /* U+003021: HANGZHOU NUMERAL ONE*/
-                                           RTUNI_ALPHA, /* U+003022: HANGZHOU NUMERAL TWO*/
-                                           RTUNI_ALPHA, /* U+003023: HANGZHOU NUMERAL THREE*/
-                                           RTUNI_ALPHA, /* U+003024: HANGZHOU NUMERAL FOUR*/
-                                           RTUNI_ALPHA, /* U+003025: HANGZHOU NUMERAL FIVE*/
-                                           RTUNI_ALPHA, /* U+003026: HANGZHOU NUMERAL SIX*/
-                                           RTUNI_ALPHA, /* U+003027: HANGZHOU NUMERAL SEVEN*/
-                                           RTUNI_ALPHA, /* U+003028: HANGZHOU NUMERAL EIGHT*/
-                                           RTUNI_ALPHA, /* U+003029: HANGZHOU NUMERAL NINE*/
-                                                     0, /* U+00302a: IDEOGRAPHIC LEVEL TONE MARK*/
-                                                     0, /* U+00302b: IDEOGRAPHIC RISING TONE MARK*/
-                                                     0, /* U+00302c: IDEOGRAPHIC DEPARTING TONE MARK*/
-                                                     0, /* U+00302d: IDEOGRAPHIC ENTERING TONE MARK*/
-                                                     0, /* U+00302e: HANGUL SINGLE DOT TONE MARK*/
-                                                     0, /* U+00302f: HANGUL DOUBLE DOT TONE MARK*/
-                                                     0, /* U+003030: WAVY DASH*/
-                                           RTUNI_ALPHA, /* U+003031: VERTICAL KANA REPEAT MARK*/
-                                           RTUNI_ALPHA, /* U+003032: VERTICAL KANA REPEAT WITH VOICED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+003033: VERTICAL KANA REPEAT MARK UPPER HALF*/
-                                           RTUNI_ALPHA, /* U+003034: VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF*/
-                                           RTUNI_ALPHA, /* U+003035: VERTICAL KANA REPEAT MARK LOWER HALF*/
-                                                     0, /* U+003036: CIRCLED POSTAL MARK*/
-                                                     0, /* U+003037: IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL*/
-                                           RTUNI_ALPHA, /* U+003038: HANGZHOU NUMERAL TEN*/
-                                           RTUNI_ALPHA, /* U+003039: HANGZHOU NUMERAL TWENTY*/
-                                           RTUNI_ALPHA, /* U+00303a: HANGZHOU NUMERAL THIRTY*/
-                                           RTUNI_ALPHA, /* U+00303b: VERTICAL IDEOGRAPHIC ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+00303c: MASU MARK*/
-                                                     0, /* U+00303d: PART ALTERNATION MARK*/
-                                                     0, /* U+00303e: IDEOGRAPHIC VARIATION INDICATOR*/
-                                                     0, /* U+00303f: IDEOGRAPHIC HALF FILL SPACE*/
-                                                     0, /* U+003040: */
-                                           RTUNI_ALPHA, /* U+003041: HIRAGANA LETTER SMALL A*/
-                                           RTUNI_ALPHA, /* U+003042: HIRAGANA LETTER A*/
-                                           RTUNI_ALPHA, /* U+003043: HIRAGANA LETTER SMALL I*/
-                                           RTUNI_ALPHA, /* U+003044: HIRAGANA LETTER I*/
-                                           RTUNI_ALPHA, /* U+003045: HIRAGANA LETTER SMALL U*/
-                                           RTUNI_ALPHA, /* U+003046: HIRAGANA LETTER U*/
-                                           RTUNI_ALPHA, /* U+003047: HIRAGANA LETTER SMALL E*/
-                                           RTUNI_ALPHA, /* U+003048: HIRAGANA LETTER E*/
-                                           RTUNI_ALPHA, /* U+003049: HIRAGANA LETTER SMALL O*/
-                                           RTUNI_ALPHA, /* U+00304a: HIRAGANA LETTER O*/
-                                           RTUNI_ALPHA, /* U+00304b: HIRAGANA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+00304c: HIRAGANA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+00304d: HIRAGANA LETTER KI*/
-                                           RTUNI_ALPHA, /* U+00304e: HIRAGANA LETTER GI*/
-                                           RTUNI_ALPHA, /* U+00304f: HIRAGANA LETTER KU*/
-                                           RTUNI_ALPHA, /* U+003050: HIRAGANA LETTER GU*/
-                                           RTUNI_ALPHA, /* U+003051: HIRAGANA LETTER KE*/
-                                           RTUNI_ALPHA, /* U+003052: HIRAGANA LETTER GE*/
-                                           RTUNI_ALPHA, /* U+003053: HIRAGANA LETTER KO*/
-                                           RTUNI_ALPHA, /* U+003054: HIRAGANA LETTER GO*/
-                                           RTUNI_ALPHA, /* U+003055: HIRAGANA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+003056: HIRAGANA LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+003057: HIRAGANA LETTER SI*/
-                                           RTUNI_ALPHA, /* U+003058: HIRAGANA LETTER ZI*/
-                                           RTUNI_ALPHA, /* U+003059: HIRAGANA LETTER SU*/
-                                           RTUNI_ALPHA, /* U+00305a: HIRAGANA LETTER ZU*/
-                                           RTUNI_ALPHA, /* U+00305b: HIRAGANA LETTER SE*/
-                                           RTUNI_ALPHA, /* U+00305c: HIRAGANA LETTER ZE*/
-                                           RTUNI_ALPHA, /* U+00305d: HIRAGANA LETTER SO*/
-                                           RTUNI_ALPHA, /* U+00305e: HIRAGANA LETTER ZO*/
-                                           RTUNI_ALPHA, /* U+00305f: HIRAGANA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+003060: HIRAGANA LETTER DA*/
-                                           RTUNI_ALPHA, /* U+003061: HIRAGANA LETTER TI*/
-                                           RTUNI_ALPHA, /* U+003062: HIRAGANA LETTER DI*/
-                                           RTUNI_ALPHA, /* U+003063: HIRAGANA LETTER SMALL TU*/
-                                           RTUNI_ALPHA, /* U+003064: HIRAGANA LETTER TU*/
-                                           RTUNI_ALPHA, /* U+003065: HIRAGANA LETTER DU*/
-                                           RTUNI_ALPHA, /* U+003066: HIRAGANA LETTER TE*/
-                                           RTUNI_ALPHA, /* U+003067: HIRAGANA LETTER DE*/
-                                           RTUNI_ALPHA, /* U+003068: HIRAGANA LETTER TO*/
-                                           RTUNI_ALPHA, /* U+003069: HIRAGANA LETTER DO*/
-                                           RTUNI_ALPHA, /* U+00306a: HIRAGANA LETTER NA*/
-                                           RTUNI_ALPHA, /* U+00306b: HIRAGANA LETTER NI*/
-                                           RTUNI_ALPHA, /* U+00306c: HIRAGANA LETTER NU*/
-                                           RTUNI_ALPHA, /* U+00306d: HIRAGANA LETTER NE*/
-                                           RTUNI_ALPHA, /* U+00306e: HIRAGANA LETTER NO*/
-                                           RTUNI_ALPHA, /* U+00306f: HIRAGANA LETTER HA*/
-                                           RTUNI_ALPHA, /* U+003070: HIRAGANA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+003071: HIRAGANA LETTER PA*/
-                                           RTUNI_ALPHA, /* U+003072: HIRAGANA LETTER HI*/
-                                           RTUNI_ALPHA, /* U+003073: HIRAGANA LETTER BI*/
-                                           RTUNI_ALPHA, /* U+003074: HIRAGANA LETTER PI*/
-                                           RTUNI_ALPHA, /* U+003075: HIRAGANA LETTER HU*/
-                                           RTUNI_ALPHA, /* U+003076: HIRAGANA LETTER BU*/
-                                           RTUNI_ALPHA, /* U+003077: HIRAGANA LETTER PU*/
-                                           RTUNI_ALPHA, /* U+003078: HIRAGANA LETTER HE*/
-                                           RTUNI_ALPHA, /* U+003079: HIRAGANA LETTER BE*/
-                                           RTUNI_ALPHA, /* U+00307a: HIRAGANA LETTER PE*/
-                                           RTUNI_ALPHA, /* U+00307b: HIRAGANA LETTER HO*/
-                                           RTUNI_ALPHA, /* U+00307c: HIRAGANA LETTER BO*/
-                                           RTUNI_ALPHA, /* U+00307d: HIRAGANA LETTER PO*/
-                                           RTUNI_ALPHA, /* U+00307e: HIRAGANA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00307f: HIRAGANA LETTER MI*/
-                                           RTUNI_ALPHA, /* U+003080: HIRAGANA LETTER MU*/
-                                           RTUNI_ALPHA, /* U+003081: HIRAGANA LETTER ME*/
-                                           RTUNI_ALPHA, /* U+003082: HIRAGANA LETTER MO*/
-                                           RTUNI_ALPHA, /* U+003083: HIRAGANA LETTER SMALL YA*/
-                                           RTUNI_ALPHA, /* U+003084: HIRAGANA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+003085: HIRAGANA LETTER SMALL YU*/
-                                           RTUNI_ALPHA, /* U+003086: HIRAGANA LETTER YU*/
-                                           RTUNI_ALPHA, /* U+003087: HIRAGANA LETTER SMALL YO*/
-                                           RTUNI_ALPHA, /* U+003088: HIRAGANA LETTER YO*/
-                                           RTUNI_ALPHA, /* U+003089: HIRAGANA LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00308a: HIRAGANA LETTER RI*/
-                                           RTUNI_ALPHA, /* U+00308b: HIRAGANA LETTER RU*/
-                                           RTUNI_ALPHA, /* U+00308c: HIRAGANA LETTER RE*/
-                                           RTUNI_ALPHA, /* U+00308d: HIRAGANA LETTER RO*/
-                                           RTUNI_ALPHA, /* U+00308e: HIRAGANA LETTER SMALL WA*/
-                                           RTUNI_ALPHA, /* U+00308f: HIRAGANA LETTER WA*/
-                                           RTUNI_ALPHA, /* U+003090: HIRAGANA LETTER WI*/
-                                           RTUNI_ALPHA, /* U+003091: HIRAGANA LETTER WE*/
-                                           RTUNI_ALPHA, /* U+003092: HIRAGANA LETTER WO*/
-                                           RTUNI_ALPHA, /* U+003093: HIRAGANA LETTER N*/
-                                           RTUNI_ALPHA, /* U+003094: HIRAGANA LETTER VU*/
-                                           RTUNI_ALPHA, /* U+003095: HIRAGANA LETTER SMALL KA*/
-                                           RTUNI_ALPHA, /* U+003096: HIRAGANA LETTER SMALL KE*/
-                                                     0, /* U+003097: */
-                                                     0, /* U+003098: */
-                                                     0, /* U+003099: COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK*/
-                                                     0, /* U+00309a: COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
-                                                     0, /* U+00309b: KATAKANA-HIRAGANA VOICED SOUND MARK*/
-                                                     0, /* U+00309c: KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+00309d: HIRAGANA ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+00309e: HIRAGANA VOICED ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+00309f: HIRAGANA DIGRAPH YORI*/
-                                                     0, /* U+0030a0: KATAKANA-HIRAGANA DOUBLE HYPHEN*/
-                                           RTUNI_ALPHA, /* U+0030a1: KATAKANA LETTER SMALL A*/
-                                           RTUNI_ALPHA, /* U+0030a2: KATAKANA LETTER A*/
-                                           RTUNI_ALPHA, /* U+0030a3: KATAKANA LETTER SMALL I*/
-                                           RTUNI_ALPHA, /* U+0030a4: KATAKANA LETTER I*/
-                                           RTUNI_ALPHA, /* U+0030a5: KATAKANA LETTER SMALL U*/
-                                           RTUNI_ALPHA, /* U+0030a6: KATAKANA LETTER U*/
-                                           RTUNI_ALPHA, /* U+0030a7: KATAKANA LETTER SMALL E*/
-                                           RTUNI_ALPHA, /* U+0030a8: KATAKANA LETTER E*/
-                                           RTUNI_ALPHA, /* U+0030a9: KATAKANA LETTER SMALL O*/
-                                           RTUNI_ALPHA, /* U+0030aa: KATAKANA LETTER O*/
-                                           RTUNI_ALPHA, /* U+0030ab: KATAKANA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+0030ac: KATAKANA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+0030ad: KATAKANA LETTER KI*/
-                                           RTUNI_ALPHA, /* U+0030ae: KATAKANA LETTER GI*/
-                                           RTUNI_ALPHA, /* U+0030af: KATAKANA LETTER KU*/
-                                           RTUNI_ALPHA, /* U+0030b0: KATAKANA LETTER GU*/
-                                           RTUNI_ALPHA, /* U+0030b1: KATAKANA LETTER KE*/
-                                           RTUNI_ALPHA, /* U+0030b2: KATAKANA LETTER GE*/
-                                           RTUNI_ALPHA, /* U+0030b3: KATAKANA LETTER KO*/
-                                           RTUNI_ALPHA, /* U+0030b4: KATAKANA LETTER GO*/
-                                           RTUNI_ALPHA, /* U+0030b5: KATAKANA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+0030b6: KATAKANA LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+0030b7: KATAKANA LETTER SI*/
-                                           RTUNI_ALPHA, /* U+0030b8: KATAKANA LETTER ZI*/
-                                           RTUNI_ALPHA, /* U+0030b9: KATAKANA LETTER SU*/
-                                           RTUNI_ALPHA, /* U+0030ba: KATAKANA LETTER ZU*/
-                                           RTUNI_ALPHA, /* U+0030bb: KATAKANA LETTER SE*/
-                                           RTUNI_ALPHA, /* U+0030bc: KATAKANA LETTER ZE*/
-                                           RTUNI_ALPHA, /* U+0030bd: KATAKANA LETTER SO*/
-                                           RTUNI_ALPHA, /* U+0030be: KATAKANA LETTER ZO*/
-                                           RTUNI_ALPHA, /* U+0030bf: KATAKANA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+0030c0: KATAKANA LETTER DA*/
-                                           RTUNI_ALPHA, /* U+0030c1: KATAKANA LETTER TI*/
-                                           RTUNI_ALPHA, /* U+0030c2: KATAKANA LETTER DI*/
-                                           RTUNI_ALPHA, /* U+0030c3: KATAKANA LETTER SMALL TU*/
-                                           RTUNI_ALPHA, /* U+0030c4: KATAKANA LETTER TU*/
-                                           RTUNI_ALPHA, /* U+0030c5: KATAKANA LETTER DU*/
-                                           RTUNI_ALPHA, /* U+0030c6: KATAKANA LETTER TE*/
-                                           RTUNI_ALPHA, /* U+0030c7: KATAKANA LETTER DE*/
-                                           RTUNI_ALPHA, /* U+0030c8: KATAKANA LETTER TO*/
-                                           RTUNI_ALPHA, /* U+0030c9: KATAKANA LETTER DO*/
-                                           RTUNI_ALPHA, /* U+0030ca: KATAKANA LETTER NA*/
-                                           RTUNI_ALPHA, /* U+0030cb: KATAKANA LETTER NI*/
-                                           RTUNI_ALPHA, /* U+0030cc: KATAKANA LETTER NU*/
-                                           RTUNI_ALPHA, /* U+0030cd: KATAKANA LETTER NE*/
-                                           RTUNI_ALPHA, /* U+0030ce: KATAKANA LETTER NO*/
-                                           RTUNI_ALPHA, /* U+0030cf: KATAKANA LETTER HA*/
-                                           RTUNI_ALPHA, /* U+0030d0: KATAKANA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+0030d1: KATAKANA LETTER PA*/
-                                           RTUNI_ALPHA, /* U+0030d2: KATAKANA LETTER HI*/
-                                           RTUNI_ALPHA, /* U+0030d3: KATAKANA LETTER BI*/
-                                           RTUNI_ALPHA, /* U+0030d4: KATAKANA LETTER PI*/
-                                           RTUNI_ALPHA, /* U+0030d5: KATAKANA LETTER HU*/
-                                           RTUNI_ALPHA, /* U+0030d6: KATAKANA LETTER BU*/
-                                           RTUNI_ALPHA, /* U+0030d7: KATAKANA LETTER PU*/
-                                           RTUNI_ALPHA, /* U+0030d8: KATAKANA LETTER HE*/
-                                           RTUNI_ALPHA, /* U+0030d9: KATAKANA LETTER BE*/
-                                           RTUNI_ALPHA, /* U+0030da: KATAKANA LETTER PE*/
-                                           RTUNI_ALPHA, /* U+0030db: KATAKANA LETTER HO*/
-                                           RTUNI_ALPHA, /* U+0030dc: KATAKANA LETTER BO*/
-                                           RTUNI_ALPHA, /* U+0030dd: KATAKANA LETTER PO*/
-                                           RTUNI_ALPHA, /* U+0030de: KATAKANA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+0030df: KATAKANA LETTER MI*/
-                                           RTUNI_ALPHA, /* U+0030e0: KATAKANA LETTER MU*/
-                                           RTUNI_ALPHA, /* U+0030e1: KATAKANA LETTER ME*/
-                                           RTUNI_ALPHA, /* U+0030e2: KATAKANA LETTER MO*/
-                                           RTUNI_ALPHA, /* U+0030e3: KATAKANA LETTER SMALL YA*/
-                                           RTUNI_ALPHA, /* U+0030e4: KATAKANA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+0030e5: KATAKANA LETTER SMALL YU*/
-                                           RTUNI_ALPHA, /* U+0030e6: KATAKANA LETTER YU*/
-                                           RTUNI_ALPHA, /* U+0030e7: KATAKANA LETTER SMALL YO*/
-                                           RTUNI_ALPHA, /* U+0030e8: KATAKANA LETTER YO*/
-                                           RTUNI_ALPHA, /* U+0030e9: KATAKANA LETTER RA*/
-                                           RTUNI_ALPHA, /* U+0030ea: KATAKANA LETTER RI*/
-                                           RTUNI_ALPHA, /* U+0030eb: KATAKANA LETTER RU*/
-                                           RTUNI_ALPHA, /* U+0030ec: KATAKANA LETTER RE*/
-                                           RTUNI_ALPHA, /* U+0030ed: KATAKANA LETTER RO*/
-                                           RTUNI_ALPHA, /* U+0030ee: KATAKANA LETTER SMALL WA*/
-                                           RTUNI_ALPHA, /* U+0030ef: KATAKANA LETTER WA*/
-                                           RTUNI_ALPHA, /* U+0030f0: KATAKANA LETTER WI*/
-                                           RTUNI_ALPHA, /* U+0030f1: KATAKANA LETTER WE*/
-                                           RTUNI_ALPHA, /* U+0030f2: KATAKANA LETTER WO*/
-                                           RTUNI_ALPHA, /* U+0030f3: KATAKANA LETTER N*/
-                                           RTUNI_ALPHA, /* U+0030f4: KATAKANA LETTER VU*/
-                                           RTUNI_ALPHA, /* U+0030f5: KATAKANA LETTER SMALL KA*/
-                                           RTUNI_ALPHA, /* U+0030f6: KATAKANA LETTER SMALL KE*/
-                                           RTUNI_ALPHA, /* U+0030f7: KATAKANA LETTER VA*/
-                                           RTUNI_ALPHA, /* U+0030f8: KATAKANA LETTER VI*/
-                                           RTUNI_ALPHA, /* U+0030f9: KATAKANA LETTER VE*/
-                                           RTUNI_ALPHA, /* U+0030fa: KATAKANA LETTER VO*/
-                                                     0, /* U+0030fb: KATAKANA MIDDLE DOT*/
-                                           RTUNI_ALPHA, /* U+0030fc: KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+0030fd: KATAKANA ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+0030fe: KATAKANA VOICED ITERATION MARK*/
-                                           RTUNI_ALPHA, /* U+0030ff: KATAKANA DIGRAPH KOTO*/
-                                                     0, /* U+003100: */
-                                                     0, /* U+003101: */
-                                                     0, /* U+003102: */
-                                                     0, /* U+003103: */
-                                                     0, /* U+003104: */
-                                           RTUNI_ALPHA, /* U+003105: BOPOMOFO LETTER B*/
-                                           RTUNI_ALPHA, /* U+003106: BOPOMOFO LETTER P*/
-                                           RTUNI_ALPHA, /* U+003107: BOPOMOFO LETTER M*/
-                                           RTUNI_ALPHA, /* U+003108: BOPOMOFO LETTER F*/
-                                           RTUNI_ALPHA, /* U+003109: BOPOMOFO LETTER D*/
-                                           RTUNI_ALPHA, /* U+00310a: BOPOMOFO LETTER T*/
-                                           RTUNI_ALPHA, /* U+00310b: BOPOMOFO LETTER N*/
-                                           RTUNI_ALPHA, /* U+00310c: BOPOMOFO LETTER L*/
-                                           RTUNI_ALPHA, /* U+00310d: BOPOMOFO LETTER G*/
-                                           RTUNI_ALPHA, /* U+00310e: BOPOMOFO LETTER K*/
-                                           RTUNI_ALPHA, /* U+00310f: BOPOMOFO LETTER H*/
-                                           RTUNI_ALPHA, /* U+003110: BOPOMOFO LETTER J*/
-                                           RTUNI_ALPHA, /* U+003111: BOPOMOFO LETTER Q*/
-                                           RTUNI_ALPHA, /* U+003112: BOPOMOFO LETTER X*/
-                                           RTUNI_ALPHA, /* U+003113: BOPOMOFO LETTER ZH*/
-                                           RTUNI_ALPHA, /* U+003114: BOPOMOFO LETTER CH*/
-                                           RTUNI_ALPHA, /* U+003115: BOPOMOFO LETTER SH*/
-                                           RTUNI_ALPHA, /* U+003116: BOPOMOFO LETTER R*/
-                                           RTUNI_ALPHA, /* U+003117: BOPOMOFO LETTER Z*/
-                                           RTUNI_ALPHA, /* U+003118: BOPOMOFO LETTER C*/
-                                           RTUNI_ALPHA, /* U+003119: BOPOMOFO LETTER S*/
-                                           RTUNI_ALPHA, /* U+00311a: BOPOMOFO LETTER A*/
-                                           RTUNI_ALPHA, /* U+00311b: BOPOMOFO LETTER O*/
-                                           RTUNI_ALPHA, /* U+00311c: BOPOMOFO LETTER E*/
-                                           RTUNI_ALPHA, /* U+00311d: BOPOMOFO LETTER EH*/
-                                           RTUNI_ALPHA, /* U+00311e: BOPOMOFO LETTER AI*/
-                                           RTUNI_ALPHA, /* U+00311f: BOPOMOFO LETTER EI*/
-                                           RTUNI_ALPHA, /* U+003120: BOPOMOFO LETTER AU*/
-                                           RTUNI_ALPHA, /* U+003121: BOPOMOFO LETTER OU*/
-                                           RTUNI_ALPHA, /* U+003122: BOPOMOFO LETTER AN*/
-                                           RTUNI_ALPHA, /* U+003123: BOPOMOFO LETTER EN*/
-                                           RTUNI_ALPHA, /* U+003124: BOPOMOFO LETTER ANG*/
-                                           RTUNI_ALPHA, /* U+003125: BOPOMOFO LETTER ENG*/
-                                           RTUNI_ALPHA, /* U+003126: BOPOMOFO LETTER ER*/
-                                           RTUNI_ALPHA, /* U+003127: BOPOMOFO LETTER I*/
-                                           RTUNI_ALPHA, /* U+003128: BOPOMOFO LETTER U*/
-                                           RTUNI_ALPHA, /* U+003129: BOPOMOFO LETTER IU*/
-                                           RTUNI_ALPHA, /* U+00312a: BOPOMOFO LETTER V*/
-                                           RTUNI_ALPHA, /* U+00312b: BOPOMOFO LETTER NG*/
-                                           RTUNI_ALPHA, /* U+00312c: BOPOMOFO LETTER GN*/
-                                                     0, /* U+00312d: */
-                                                     0, /* U+00312e: */
-                                                     0, /* U+00312f: */
-                                                     0, /* U+003130: */
-                                           RTUNI_ALPHA, /* U+003131: HANGUL LETTER KIYEOK*/
-                                           RTUNI_ALPHA, /* U+003132: HANGUL LETTER SSANGKIYEOK*/
-                                           RTUNI_ALPHA, /* U+003133: HANGUL LETTER KIYEOK-SIOS*/
-                                           RTUNI_ALPHA, /* U+003134: HANGUL LETTER NIEUN*/
-                                           RTUNI_ALPHA, /* U+003135: HANGUL LETTER NIEUN-CIEUC*/
-                                           RTUNI_ALPHA, /* U+003136: HANGUL LETTER NIEUN-HIEUH*/
-                                           RTUNI_ALPHA, /* U+003137: HANGUL LETTER TIKEUT*/
-                                           RTUNI_ALPHA, /* U+003138: HANGUL LETTER SSANGTIKEUT*/
-                                           RTUNI_ALPHA, /* U+003139: HANGUL LETTER RIEUL*/
-                                           RTUNI_ALPHA, /* U+00313a: HANGUL LETTER RIEUL-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00313b: HANGUL LETTER RIEUL-MIEUM*/
-                                           RTUNI_ALPHA, /* U+00313c: HANGUL LETTER RIEUL-PIEUP*/
-                                           RTUNI_ALPHA, /* U+00313d: HANGUL LETTER RIEUL-SIOS*/
-                                           RTUNI_ALPHA, /* U+00313e: HANGUL LETTER RIEUL-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00313f: HANGUL LETTER RIEUL-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+003140: HANGUL LETTER RIEUL-HIEUH*/
-                                           RTUNI_ALPHA, /* U+003141: HANGUL LETTER MIEUM*/
-                                           RTUNI_ALPHA, /* U+003142: HANGUL LETTER PIEUP*/
-                                           RTUNI_ALPHA, /* U+003143: HANGUL LETTER SSANGPIEUP*/
-                                           RTUNI_ALPHA, /* U+003144: HANGUL LETTER PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+003145: HANGUL LETTER SIOS*/
-                                           RTUNI_ALPHA, /* U+003146: HANGUL LETTER SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+003147: HANGUL LETTER IEUNG*/
-                                           RTUNI_ALPHA, /* U+003148: HANGUL LETTER CIEUC*/
-                                           RTUNI_ALPHA, /* U+003149: HANGUL LETTER SSANGCIEUC*/
-                                           RTUNI_ALPHA, /* U+00314a: HANGUL LETTER CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+00314b: HANGUL LETTER KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+00314c: HANGUL LETTER THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00314d: HANGUL LETTER PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00314e: HANGUL LETTER HIEUH*/
-                                           RTUNI_ALPHA, /* U+00314f: HANGUL LETTER A*/
-                                           RTUNI_ALPHA, /* U+003150: HANGUL LETTER AE*/
-                                           RTUNI_ALPHA, /* U+003151: HANGUL LETTER YA*/
-                                           RTUNI_ALPHA, /* U+003152: HANGUL LETTER YAE*/
-                                           RTUNI_ALPHA, /* U+003153: HANGUL LETTER EO*/
-                                           RTUNI_ALPHA, /* U+003154: HANGUL LETTER E*/
-                                           RTUNI_ALPHA, /* U+003155: HANGUL LETTER YEO*/
-                                           RTUNI_ALPHA, /* U+003156: HANGUL LETTER YE*/
-                                           RTUNI_ALPHA, /* U+003157: HANGUL LETTER O*/
-                                           RTUNI_ALPHA, /* U+003158: HANGUL LETTER WA*/
-                                           RTUNI_ALPHA, /* U+003159: HANGUL LETTER WAE*/
-                                           RTUNI_ALPHA, /* U+00315a: HANGUL LETTER OE*/
-                                           RTUNI_ALPHA, /* U+00315b: HANGUL LETTER YO*/
-                                           RTUNI_ALPHA, /* U+00315c: HANGUL LETTER U*/
-                                           RTUNI_ALPHA, /* U+00315d: HANGUL LETTER WEO*/
-                                           RTUNI_ALPHA, /* U+00315e: HANGUL LETTER WE*/
-                                           RTUNI_ALPHA, /* U+00315f: HANGUL LETTER WI*/
-                                           RTUNI_ALPHA, /* U+003160: HANGUL LETTER YU*/
-                                           RTUNI_ALPHA, /* U+003161: HANGUL LETTER EU*/
-                                           RTUNI_ALPHA, /* U+003162: HANGUL LETTER YI*/
-                                           RTUNI_ALPHA, /* U+003163: HANGUL LETTER I*/
-                                           RTUNI_ALPHA, /* U+003164: HANGUL FILLER*/
-                                           RTUNI_ALPHA, /* U+003165: HANGUL LETTER SSANGNIEUN*/
-                                           RTUNI_ALPHA, /* U+003166: HANGUL LETTER NIEUN-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+003167: HANGUL LETTER NIEUN-SIOS*/
-                                           RTUNI_ALPHA, /* U+003168: HANGUL LETTER NIEUN-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+003169: HANGUL LETTER RIEUL-KIYEOK-SIOS*/
-                                           RTUNI_ALPHA, /* U+00316a: HANGUL LETTER RIEUL-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+00316b: HANGUL LETTER RIEUL-PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+00316c: HANGUL LETTER RIEUL-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+00316d: HANGUL LETTER RIEUL-YEORINHIEUH*/
-                                           RTUNI_ALPHA, /* U+00316e: HANGUL LETTER MIEUM-PIEUP*/
-                                           RTUNI_ALPHA, /* U+00316f: HANGUL LETTER MIEUM-SIOS*/
-                                           RTUNI_ALPHA, /* U+003170: HANGUL LETTER MIEUM-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+003171: HANGUL LETTER KAPYEOUNMIEUM*/
-                                           RTUNI_ALPHA, /* U+003172: HANGUL LETTER PIEUP-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+003173: HANGUL LETTER PIEUP-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+003174: HANGUL LETTER PIEUP-SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+003175: HANGUL LETTER PIEUP-SIOS-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+003176: HANGUL LETTER PIEUP-CIEUC*/
-                                           RTUNI_ALPHA, /* U+003177: HANGUL LETTER PIEUP-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+003178: HANGUL LETTER KAPYEOUNPIEUP*/
-                                           RTUNI_ALPHA, /* U+003179: HANGUL LETTER KAPYEOUNSSANGPIEUP*/
-                                           RTUNI_ALPHA, /* U+00317a: HANGUL LETTER SIOS-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00317b: HANGUL LETTER SIOS-NIEUN*/
-                                           RTUNI_ALPHA, /* U+00317c: HANGUL LETTER SIOS-TIKEUT*/
-                                           RTUNI_ALPHA, /* U+00317d: HANGUL LETTER SIOS-PIEUP*/
-                                           RTUNI_ALPHA, /* U+00317e: HANGUL LETTER SIOS-CIEUC*/
-                                           RTUNI_ALPHA, /* U+00317f: HANGUL LETTER PANSIOS*/
-                                           RTUNI_ALPHA, /* U+003180: HANGUL LETTER SSANGIEUNG*/
-                                           RTUNI_ALPHA, /* U+003181: HANGUL LETTER YESIEUNG*/
-                                           RTUNI_ALPHA, /* U+003182: HANGUL LETTER YESIEUNG-SIOS*/
-                                           RTUNI_ALPHA, /* U+003183: HANGUL LETTER YESIEUNG-PANSIOS*/
-                                           RTUNI_ALPHA, /* U+003184: HANGUL LETTER KAPYEOUNPHIEUPH*/
-                                           RTUNI_ALPHA, /* U+003185: HANGUL LETTER SSANGHIEUH*/
-                                           RTUNI_ALPHA, /* U+003186: HANGUL LETTER YEORINHIEUH*/
-                                           RTUNI_ALPHA, /* U+003187: HANGUL LETTER YO-YA*/
-                                           RTUNI_ALPHA, /* U+003188: HANGUL LETTER YO-YAE*/
-                                           RTUNI_ALPHA, /* U+003189: HANGUL LETTER YO-I*/
-                                           RTUNI_ALPHA, /* U+00318a: HANGUL LETTER YU-YEO*/
-                                           RTUNI_ALPHA, /* U+00318b: HANGUL LETTER YU-YE*/
-                                           RTUNI_ALPHA, /* U+00318c: HANGUL LETTER YU-I*/
-                                           RTUNI_ALPHA, /* U+00318d: HANGUL LETTER ARAEA*/
-                                           RTUNI_ALPHA, /* U+00318e: HANGUL LETTER ARAEAE*/
-                                                     0, /* U+00318f: */
-                                                     0, /* U+003190: IDEOGRAPHIC ANNOTATION LINKING MARK*/
-                                                     0, /* U+003191: IDEOGRAPHIC ANNOTATION REVERSE MARK*/
-                                                     0, /* U+003192: IDEOGRAPHIC ANNOTATION ONE MARK*/
-                                                     0, /* U+003193: IDEOGRAPHIC ANNOTATION TWO MARK*/
-                                                     0, /* U+003194: IDEOGRAPHIC ANNOTATION THREE MARK*/
-                                                     0, /* U+003195: IDEOGRAPHIC ANNOTATION FOUR MARK*/
-                                                     0, /* U+003196: IDEOGRAPHIC ANNOTATION TOP MARK*/
-                                                     0, /* U+003197: IDEOGRAPHIC ANNOTATION MIDDLE MARK*/
-                                                     0, /* U+003198: IDEOGRAPHIC ANNOTATION BOTTOM MARK*/
-                                                     0, /* U+003199: IDEOGRAPHIC ANNOTATION FIRST MARK*/
-                                                     0, /* U+00319a: IDEOGRAPHIC ANNOTATION SECOND MARK*/
-                                                     0, /* U+00319b: IDEOGRAPHIC ANNOTATION THIRD MARK*/
-                                                     0, /* U+00319c: IDEOGRAPHIC ANNOTATION FOURTH MARK*/
-                                                     0, /* U+00319d: IDEOGRAPHIC ANNOTATION HEAVEN MARK*/
-                                                     0, /* U+00319e: IDEOGRAPHIC ANNOTATION EARTH MARK*/
-                                                     0, /* U+00319f: IDEOGRAPHIC ANNOTATION MAN MARK*/
-                                           RTUNI_ALPHA, /* U+0031a0: BOPOMOFO LETTER BU*/
-                                           RTUNI_ALPHA, /* U+0031a1: BOPOMOFO LETTER ZI*/
-                                           RTUNI_ALPHA, /* U+0031a2: BOPOMOFO LETTER JI*/
-                                           RTUNI_ALPHA, /* U+0031a3: BOPOMOFO LETTER GU*/
-                                           RTUNI_ALPHA, /* U+0031a4: BOPOMOFO LETTER EE*/
-                                           RTUNI_ALPHA, /* U+0031a5: BOPOMOFO LETTER ENN*/
-                                           RTUNI_ALPHA, /* U+0031a6: BOPOMOFO LETTER OO*/
-                                           RTUNI_ALPHA, /* U+0031a7: BOPOMOFO LETTER ONN*/
-                                           RTUNI_ALPHA, /* U+0031a8: BOPOMOFO LETTER IR*/
-                                           RTUNI_ALPHA, /* U+0031a9: BOPOMOFO LETTER ANN*/
-                                           RTUNI_ALPHA, /* U+0031aa: BOPOMOFO LETTER INN*/
-                                           RTUNI_ALPHA, /* U+0031ab: BOPOMOFO LETTER UNN*/
-                                           RTUNI_ALPHA, /* U+0031ac: BOPOMOFO LETTER IM*/
-                                           RTUNI_ALPHA, /* U+0031ad: BOPOMOFO LETTER NGG*/
-                                           RTUNI_ALPHA, /* U+0031ae: BOPOMOFO LETTER AINN*/
-                                           RTUNI_ALPHA, /* U+0031af: BOPOMOFO LETTER AUNN*/
-                                           RTUNI_ALPHA, /* U+0031b0: BOPOMOFO LETTER AM*/
-                                           RTUNI_ALPHA, /* U+0031b1: BOPOMOFO LETTER OM*/
-                                           RTUNI_ALPHA, /* U+0031b2: BOPOMOFO LETTER ONG*/
-                                           RTUNI_ALPHA, /* U+0031b3: BOPOMOFO LETTER INNN*/
-                                           RTUNI_ALPHA, /* U+0031b4: BOPOMOFO FINAL LETTER P*/
-                                           RTUNI_ALPHA, /* U+0031b5: BOPOMOFO FINAL LETTER T*/
-                                           RTUNI_ALPHA, /* U+0031b6: BOPOMOFO FINAL LETTER K*/
-                                           RTUNI_ALPHA, /* U+0031b7: BOPOMOFO FINAL LETTER H*/
-                                                     0, /* U+0031b8: */
-                                                     0, /* U+0031b9: */
-                                                     0, /* U+0031ba: */
-                                                     0, /* U+0031bb: */
-                                                     0, /* U+0031bc: */
-                                                     0, /* U+0031bd: */
-                                                     0, /* U+0031be: */
-                                                     0, /* U+0031bf: */
-                                                     0, /* U+0031c0: CJK STROKE T*/
-                                                     0, /* U+0031c1: CJK STROKE WG*/
-                                                     0, /* U+0031c2: CJK STROKE XG*/
-                                                     0, /* U+0031c3: CJK STROKE BXG*/
-                                                     0, /* U+0031c4: CJK STROKE SW*/
-                                                     0, /* U+0031c5: CJK STROKE HZZ*/
-                                                     0, /* U+0031c6: CJK STROKE HZG*/
-                                                     0, /* U+0031c7: CJK STROKE HP*/
-                                                     0, /* U+0031c8: CJK STROKE HZWG*/
-                                                     0, /* U+0031c9: CJK STROKE SZWG*/
-                                                     0, /* U+0031ca: CJK STROKE HZT*/
-                                                     0, /* U+0031cb: CJK STROKE HZZP*/
-                                                     0, /* U+0031cc: CJK STROKE HPWG*/
-                                                     0, /* U+0031cd: CJK STROKE HZW*/
-                                                     0, /* U+0031ce: CJK STROKE HZZZ*/
-                                                     0, /* U+0031cf: CJK STROKE N*/
-                                                     0, /* U+0031d0: */
-                                                     0, /* U+0031d1: */
-                                                     0, /* U+0031d2: */
-                                                     0, /* U+0031d3: */
-                                                     0, /* U+0031d4: */
-                                                     0, /* U+0031d5: */
-                                                     0, /* U+0031d6: */
-                                                     0, /* U+0031d7: */
-                                                     0, /* U+0031d8: */
-                                                     0, /* U+0031d9: */
-                                                     0, /* U+0031da: */
-                                                     0, /* U+0031db: */
-                                                     0, /* U+0031dc: */
-                                                     0, /* U+0031dd: */
-                                                     0, /* U+0031de: */
-                                                     0, /* U+0031df: */
-                                                     0, /* U+0031e0: */
-                                                     0, /* U+0031e1: */
-                                                     0, /* U+0031e2: */
-                                                     0, /* U+0031e3: */
-                                                     0, /* U+0031e4: */
-                                                     0, /* U+0031e5: */
-                                                     0, /* U+0031e6: */
-                                                     0, /* U+0031e7: */
-                                                     0, /* U+0031e8: */
-                                                     0, /* U+0031e9: */
-                                                     0, /* U+0031ea: */
-                                                     0, /* U+0031eb: */
-                                                     0, /* U+0031ec: */
-                                                     0, /* U+0031ed: */
-                                                     0, /* U+0031ee: */
-                                                     0, /* U+0031ef: */
-                                           RTUNI_ALPHA, /* U+0031f0: KATAKANA LETTER SMALL KU*/
-                                           RTUNI_ALPHA, /* U+0031f1: KATAKANA LETTER SMALL SI*/
-                                           RTUNI_ALPHA, /* U+0031f2: KATAKANA LETTER SMALL SU*/
-                                           RTUNI_ALPHA, /* U+0031f3: KATAKANA LETTER SMALL TO*/
-                                           RTUNI_ALPHA, /* U+0031f4: KATAKANA LETTER SMALL NU*/
-                                           RTUNI_ALPHA, /* U+0031f5: KATAKANA LETTER SMALL HA*/
-                                           RTUNI_ALPHA, /* U+0031f6: KATAKANA LETTER SMALL HI*/
-                                           RTUNI_ALPHA, /* U+0031f7: KATAKANA LETTER SMALL HU*/
-                                           RTUNI_ALPHA, /* U+0031f8: KATAKANA LETTER SMALL HE*/
-                                           RTUNI_ALPHA, /* U+0031f9: KATAKANA LETTER SMALL HO*/
-                                           RTUNI_ALPHA, /* U+0031fa: KATAKANA LETTER SMALL MU*/
-                                           RTUNI_ALPHA, /* U+0031fb: KATAKANA LETTER SMALL RA*/
-                                           RTUNI_ALPHA, /* U+0031fc: KATAKANA LETTER SMALL RI*/
-                                           RTUNI_ALPHA, /* U+0031fd: KATAKANA LETTER SMALL RU*/
-                                           RTUNI_ALPHA, /* U+0031fe: KATAKANA LETTER SMALL RE*/
-                                           RTUNI_ALPHA, /* U+0031ff: KATAKANA LETTER SMALL RO*/
-                                                     0, /* U+003200: PARENTHESIZED HANGUL KIYEOK*/
-                                                     0, /* U+003201: PARENTHESIZED HANGUL NIEUN*/
-                                                     0, /* U+003202: PARENTHESIZED HANGUL TIKEUT*/
-                                                     0, /* U+003203: PARENTHESIZED HANGUL RIEUL*/
-                                                     0, /* U+003204: PARENTHESIZED HANGUL MIEUM*/
-                                                     0, /* U+003205: PARENTHESIZED HANGUL PIEUP*/
-                                                     0, /* U+003206: PARENTHESIZED HANGUL SIOS*/
-                                                     0, /* U+003207: PARENTHESIZED HANGUL IEUNG*/
-                                                     0, /* U+003208: PARENTHESIZED HANGUL CIEUC*/
-                                                     0, /* U+003209: PARENTHESIZED HANGUL CHIEUCH*/
-                                                     0, /* U+00320a: PARENTHESIZED HANGUL KHIEUKH*/
-                                                     0, /* U+00320b: PARENTHESIZED HANGUL THIEUTH*/
-                                                     0, /* U+00320c: PARENTHESIZED HANGUL PHIEUPH*/
-                                                     0, /* U+00320d: PARENTHESIZED HANGUL HIEUH*/
-                                                     0, /* U+00320e: PARENTHESIZED HANGUL KIYEOK A*/
-                                                     0, /* U+00320f: PARENTHESIZED HANGUL NIEUN A*/
-                                                     0, /* U+003210: PARENTHESIZED HANGUL TIKEUT A*/
-                                                     0, /* U+003211: PARENTHESIZED HANGUL RIEUL A*/
-                                                     0, /* U+003212: PARENTHESIZED HANGUL MIEUM A*/
-                                                     0, /* U+003213: PARENTHESIZED HANGUL PIEUP A*/
-                                                     0, /* U+003214: PARENTHESIZED HANGUL SIOS A*/
-                                                     0, /* U+003215: PARENTHESIZED HANGUL IEUNG A*/
-                                                     0, /* U+003216: PARENTHESIZED HANGUL CIEUC A*/
-                                                     0, /* U+003217: PARENTHESIZED HANGUL CHIEUCH A*/
-                                                     0, /* U+003218: PARENTHESIZED HANGUL KHIEUKH A*/
-                                                     0, /* U+003219: PARENTHESIZED HANGUL THIEUTH A*/
-                                                     0, /* U+00321a: PARENTHESIZED HANGUL PHIEUPH A*/
-                                                     0, /* U+00321b: PARENTHESIZED HANGUL HIEUH A*/
-                                                     0, /* U+00321c: PARENTHESIZED HANGUL CIEUC U*/
-                                                     0, /* U+00321d: PARENTHESIZED KOREAN CHARACTER OJEON*/
-                                                     0, /* U+00321e: PARENTHESIZED KOREAN CHARACTER O HU*/
-                                                     0, /* U+00321f: */
-                                                     0, /* U+003220: PARENTHESIZED IDEOGRAPH ONE*/
-                                                     0, /* U+003221: PARENTHESIZED IDEOGRAPH TWO*/
-                                                     0, /* U+003222: PARENTHESIZED IDEOGRAPH THREE*/
-                                                     0, /* U+003223: PARENTHESIZED IDEOGRAPH FOUR*/
-                                                     0, /* U+003224: PARENTHESIZED IDEOGRAPH FIVE*/
-                                                     0, /* U+003225: PARENTHESIZED IDEOGRAPH SIX*/
-                                                     0, /* U+003226: PARENTHESIZED IDEOGRAPH SEVEN*/
-                                                     0, /* U+003227: PARENTHESIZED IDEOGRAPH EIGHT*/
-                                                     0, /* U+003228: PARENTHESIZED IDEOGRAPH NINE*/
-                                                     0, /* U+003229: PARENTHESIZED IDEOGRAPH TEN*/
-                                                     0, /* U+00322a: PARENTHESIZED IDEOGRAPH MOON*/
-                                                     0, /* U+00322b: PARENTHESIZED IDEOGRAPH FIRE*/
-                                                     0, /* U+00322c: PARENTHESIZED IDEOGRAPH WATER*/
-                                                     0, /* U+00322d: PARENTHESIZED IDEOGRAPH WOOD*/
-                                                     0, /* U+00322e: PARENTHESIZED IDEOGRAPH METAL*/
-                                                     0, /* U+00322f: PARENTHESIZED IDEOGRAPH EARTH*/
-                                                     0, /* U+003230: PARENTHESIZED IDEOGRAPH SUN*/
-                                                     0, /* U+003231: PARENTHESIZED IDEOGRAPH STOCK*/
-                                                     0, /* U+003232: PARENTHESIZED IDEOGRAPH HAVE*/
-                                                     0, /* U+003233: PARENTHESIZED IDEOGRAPH SOCIETY*/
-                                                     0, /* U+003234: PARENTHESIZED IDEOGRAPH NAME*/
-                                                     0, /* U+003235: PARENTHESIZED IDEOGRAPH SPECIAL*/
-                                                     0, /* U+003236: PARENTHESIZED IDEOGRAPH FINANCIAL*/
-                                                     0, /* U+003237: PARENTHESIZED IDEOGRAPH CONGRATULATION*/
-                                                     0, /* U+003238: PARENTHESIZED IDEOGRAPH LABOR*/
-                                                     0, /* U+003239: PARENTHESIZED IDEOGRAPH REPRESENT*/
-                                                     0, /* U+00323a: PARENTHESIZED IDEOGRAPH CALL*/
-                                                     0, /* U+00323b: PARENTHESIZED IDEOGRAPH STUDY*/
-                                                     0, /* U+00323c: PARENTHESIZED IDEOGRAPH SUPERVISE*/
-                                                     0, /* U+00323d: PARENTHESIZED IDEOGRAPH ENTERPRISE*/
-                                                     0, /* U+00323e: PARENTHESIZED IDEOGRAPH RESOURCE*/
-                                                     0, /* U+00323f: PARENTHESIZED IDEOGRAPH ALLIANCE*/
-                                                     0, /* U+003240: PARENTHESIZED IDEOGRAPH FESTIVAL*/
-                                                     0, /* U+003241: PARENTHESIZED IDEOGRAPH REST*/
-                                                     0, /* U+003242: PARENTHESIZED IDEOGRAPH SELF*/
-                                                     0, /* U+003243: PARENTHESIZED IDEOGRAPH REACH*/
-                                                     0, /* U+003244: */
-                                                     0, /* U+003245: */
-                                                     0, /* U+003246: */
-                                                     0, /* U+003247: */
-                                                     0, /* U+003248: */
-                                                     0, /* U+003249: */
-                                                     0, /* U+00324a: */
-                                                     0, /* U+00324b: */
-                                                     0, /* U+00324c: */
-                                                     0, /* U+00324d: */
-                                                     0, /* U+00324e: */
-                                                     0, /* U+00324f: */
-                                                     0, /* U+003250: PARTNERSHIP SIGN*/
-                                                     0, /* U+003251: CIRCLED NUMBER TWENTY ONE*/
-                                                     0, /* U+003252: CIRCLED NUMBER TWENTY TWO*/
-                                                     0, /* U+003253: CIRCLED NUMBER TWENTY THREE*/
-                                                     0, /* U+003254: CIRCLED NUMBER TWENTY FOUR*/
-                                                     0, /* U+003255: CIRCLED NUMBER TWENTY FIVE*/
-                                                     0, /* U+003256: CIRCLED NUMBER TWENTY SIX*/
-                                                     0, /* U+003257: CIRCLED NUMBER TWENTY SEVEN*/
-                                                     0, /* U+003258: CIRCLED NUMBER TWENTY EIGHT*/
-                                                     0, /* U+003259: CIRCLED NUMBER TWENTY NINE*/
-                                                     0, /* U+00325a: CIRCLED NUMBER THIRTY*/
-                                                     0, /* U+00325b: CIRCLED NUMBER THIRTY ONE*/
-                                                     0, /* U+00325c: CIRCLED NUMBER THIRTY TWO*/
-                                                     0, /* U+00325d: CIRCLED NUMBER THIRTY THREE*/
-                                                     0, /* U+00325e: CIRCLED NUMBER THIRTY FOUR*/
-                                                     0, /* U+00325f: CIRCLED NUMBER THIRTY FIVE*/
-                                                     0, /* U+003260: CIRCLED HANGUL KIYEOK*/
-                                                     0, /* U+003261: CIRCLED HANGUL NIEUN*/
-                                                     0, /* U+003262: CIRCLED HANGUL TIKEUT*/
-                                                     0, /* U+003263: CIRCLED HANGUL RIEUL*/
-                                                     0, /* U+003264: CIRCLED HANGUL MIEUM*/
-                                                     0, /* U+003265: CIRCLED HANGUL PIEUP*/
-                                                     0, /* U+003266: CIRCLED HANGUL SIOS*/
-                                                     0, /* U+003267: CIRCLED HANGUL IEUNG*/
-                                                     0, /* U+003268: CIRCLED HANGUL CIEUC*/
-                                                     0, /* U+003269: CIRCLED HANGUL CHIEUCH*/
-                                                     0, /* U+00326a: CIRCLED HANGUL KHIEUKH*/
-                                                     0, /* U+00326b: CIRCLED HANGUL THIEUTH*/
-                                                     0, /* U+00326c: CIRCLED HANGUL PHIEUPH*/
-                                                     0, /* U+00326d: CIRCLED HANGUL HIEUH*/
-                                                     0, /* U+00326e: CIRCLED HANGUL KIYEOK A*/
-                                                     0, /* U+00326f: CIRCLED HANGUL NIEUN A*/
-                                                     0, /* U+003270: CIRCLED HANGUL TIKEUT A*/
-                                                     0, /* U+003271: CIRCLED HANGUL RIEUL A*/
-                                                     0, /* U+003272: CIRCLED HANGUL MIEUM A*/
-                                                     0, /* U+003273: CIRCLED HANGUL PIEUP A*/
-                                                     0, /* U+003274: CIRCLED HANGUL SIOS A*/
-                                                     0, /* U+003275: CIRCLED HANGUL IEUNG A*/
-                                                     0, /* U+003276: CIRCLED HANGUL CIEUC A*/
-                                                     0, /* U+003277: CIRCLED HANGUL CHIEUCH A*/
-                                                     0, /* U+003278: CIRCLED HANGUL KHIEUKH A*/
-                                                     0, /* U+003279: CIRCLED HANGUL THIEUTH A*/
-                                                     0, /* U+00327a: CIRCLED HANGUL PHIEUPH A*/
-                                                     0, /* U+00327b: CIRCLED HANGUL HIEUH A*/
-                                                     0, /* U+00327c: CIRCLED KOREAN CHARACTER CHAMKO*/
-                                                     0, /* U+00327d: CIRCLED KOREAN CHARACTER JUEUI*/
-                                                     0, /* U+00327e: CIRCLED HANGUL IEUNG U*/
-                                                     0, /* U+00327f: KOREAN STANDARD SYMBOL*/
-                                                     0, /* U+003280: CIRCLED IDEOGRAPH ONE*/
-                                                     0, /* U+003281: CIRCLED IDEOGRAPH TWO*/
-                                                     0, /* U+003282: CIRCLED IDEOGRAPH THREE*/
-                                                     0, /* U+003283: CIRCLED IDEOGRAPH FOUR*/
-                                                     0, /* U+003284: CIRCLED IDEOGRAPH FIVE*/
-                                                     0, /* U+003285: CIRCLED IDEOGRAPH SIX*/
-                                                     0, /* U+003286: CIRCLED IDEOGRAPH SEVEN*/
-                                                     0, /* U+003287: CIRCLED IDEOGRAPH EIGHT*/
-                                                     0, /* U+003288: CIRCLED IDEOGRAPH NINE*/
-                                                     0, /* U+003289: CIRCLED IDEOGRAPH TEN*/
-                                                     0, /* U+00328a: CIRCLED IDEOGRAPH MOON*/
-                                                     0, /* U+00328b: CIRCLED IDEOGRAPH FIRE*/
-                                                     0, /* U+00328c: CIRCLED IDEOGRAPH WATER*/
-                                                     0, /* U+00328d: CIRCLED IDEOGRAPH WOOD*/
-                                                     0, /* U+00328e: CIRCLED IDEOGRAPH METAL*/
-                                                     0, /* U+00328f: CIRCLED IDEOGRAPH EARTH*/
-                                                     0, /* U+003290: CIRCLED IDEOGRAPH SUN*/
-                                                     0, /* U+003291: CIRCLED IDEOGRAPH STOCK*/
-                                                     0, /* U+003292: CIRCLED IDEOGRAPH HAVE*/
-                                                     0, /* U+003293: CIRCLED IDEOGRAPH SOCIETY*/
-                                                     0, /* U+003294: CIRCLED IDEOGRAPH NAME*/
-                                                     0, /* U+003295: CIRCLED IDEOGRAPH SPECIAL*/
-                                                     0, /* U+003296: CIRCLED IDEOGRAPH FINANCIAL*/
-                                                     0, /* U+003297: CIRCLED IDEOGRAPH CONGRATULATION*/
-                                                     0, /* U+003298: CIRCLED IDEOGRAPH LABOR*/
-                                                     0, /* U+003299: CIRCLED IDEOGRAPH SECRET*/
-                                                     0, /* U+00329a: CIRCLED IDEOGRAPH MALE*/
-                                                     0, /* U+00329b: CIRCLED IDEOGRAPH FEMALE*/
-                                                     0, /* U+00329c: CIRCLED IDEOGRAPH SUITABLE*/
-                                                     0, /* U+00329d: CIRCLED IDEOGRAPH EXCELLENT*/
-                                                     0, /* U+00329e: CIRCLED IDEOGRAPH PRINT*/
-                                                     0, /* U+00329f: CIRCLED IDEOGRAPH ATTENTION*/
-                                                     0, /* U+0032a0: CIRCLED IDEOGRAPH ITEM*/
-                                                     0, /* U+0032a1: CIRCLED IDEOGRAPH REST*/
-                                                     0, /* U+0032a2: CIRCLED IDEOGRAPH COPY*/
-                                                     0, /* U+0032a3: CIRCLED IDEOGRAPH CORRECT*/
-                                                     0, /* U+0032a4: CIRCLED IDEOGRAPH HIGH*/
-                                                     0, /* U+0032a5: CIRCLED IDEOGRAPH CENTRE*/
-                                                     0, /* U+0032a6: CIRCLED IDEOGRAPH LOW*/
-                                                     0, /* U+0032a7: CIRCLED IDEOGRAPH LEFT*/
-                                                     0, /* U+0032a8: CIRCLED IDEOGRAPH RIGHT*/
-                                                     0, /* U+0032a9: CIRCLED IDEOGRAPH MEDICINE*/
-                                                     0, /* U+0032aa: CIRCLED IDEOGRAPH RELIGION*/
-                                                     0, /* U+0032ab: CIRCLED IDEOGRAPH STUDY*/
-                                                     0, /* U+0032ac: CIRCLED IDEOGRAPH SUPERVISE*/
-                                                     0, /* U+0032ad: CIRCLED IDEOGRAPH ENTERPRISE*/
-                                                     0, /* U+0032ae: CIRCLED IDEOGRAPH RESOURCE*/
-                                                     0, /* U+0032af: CIRCLED IDEOGRAPH ALLIANCE*/
-                                                     0, /* U+0032b0: CIRCLED IDEOGRAPH NIGHT*/
-                                                     0, /* U+0032b1: CIRCLED NUMBER THIRTY SIX*/
-                                                     0, /* U+0032b2: CIRCLED NUMBER THIRTY SEVEN*/
-                                                     0, /* U+0032b3: CIRCLED NUMBER THIRTY EIGHT*/
-                                                     0, /* U+0032b4: CIRCLED NUMBER THIRTY NINE*/
-                                                     0, /* U+0032b5: CIRCLED NUMBER FORTY*/
-                                                     0, /* U+0032b6: CIRCLED NUMBER FORTY ONE*/
-                                                     0, /* U+0032b7: CIRCLED NUMBER FORTY TWO*/
-                                                     0, /* U+0032b8: CIRCLED NUMBER FORTY THREE*/
-                                                     0, /* U+0032b9: CIRCLED NUMBER FORTY FOUR*/
-                                                     0, /* U+0032ba: CIRCLED NUMBER FORTY FIVE*/
-                                                     0, /* U+0032bb: CIRCLED NUMBER FORTY SIX*/
-                                                     0, /* U+0032bc: CIRCLED NUMBER FORTY SEVEN*/
-                                                     0, /* U+0032bd: CIRCLED NUMBER FORTY EIGHT*/
-                                                     0, /* U+0032be: CIRCLED NUMBER FORTY NINE*/
-                                                     0, /* U+0032bf: CIRCLED NUMBER FIFTY*/
-                                                     0, /* U+0032c0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY*/
-                                                     0, /* U+0032c1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY*/
-                                                     0, /* U+0032c2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH*/
-                                                     0, /* U+0032c3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL*/
-                                                     0, /* U+0032c4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY*/
-                                                     0, /* U+0032c5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE*/
-                                                     0, /* U+0032c6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY*/
-                                                     0, /* U+0032c7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST*/
-                                                     0, /* U+0032c8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER*/
-                                                     0, /* U+0032c9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER*/
-                                                     0, /* U+0032ca: IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER*/
-                                                     0, /* U+0032cb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER*/
-                                                     0, /* U+0032cc: SQUARE HG*/
-                                                     0, /* U+0032cd: SQUARE ERG*/
-                                                     0, /* U+0032ce: SQUARE EV*/
-                                                     0, /* U+0032cf: LIMITED LIABILITY SIGN*/
-                                                     0, /* U+0032d0: CIRCLED KATAKANA A*/
-                                                     0, /* U+0032d1: CIRCLED KATAKANA I*/
-                                                     0, /* U+0032d2: CIRCLED KATAKANA U*/
-                                                     0, /* U+0032d3: CIRCLED KATAKANA E*/
-                                                     0, /* U+0032d4: CIRCLED KATAKANA O*/
-                                                     0, /* U+0032d5: CIRCLED KATAKANA KA*/
-                                                     0, /* U+0032d6: CIRCLED KATAKANA KI*/
-                                                     0, /* U+0032d7: CIRCLED KATAKANA KU*/
-                                                     0, /* U+0032d8: CIRCLED KATAKANA KE*/
-                                                     0, /* U+0032d9: CIRCLED KATAKANA KO*/
-                                                     0, /* U+0032da: CIRCLED KATAKANA SA*/
-                                                     0, /* U+0032db: CIRCLED KATAKANA SI*/
-                                                     0, /* U+0032dc: CIRCLED KATAKANA SU*/
-                                                     0, /* U+0032dd: CIRCLED KATAKANA SE*/
-                                                     0, /* U+0032de: CIRCLED KATAKANA SO*/
-                                                     0, /* U+0032df: CIRCLED KATAKANA TA*/
-                                                     0, /* U+0032e0: CIRCLED KATAKANA TI*/
-                                                     0, /* U+0032e1: CIRCLED KATAKANA TU*/
-                                                     0, /* U+0032e2: CIRCLED KATAKANA TE*/
-                                                     0, /* U+0032e3: CIRCLED KATAKANA TO*/
-                                                     0, /* U+0032e4: CIRCLED KATAKANA NA*/
-                                                     0, /* U+0032e5: CIRCLED KATAKANA NI*/
-                                                     0, /* U+0032e6: CIRCLED KATAKANA NU*/
-                                                     0, /* U+0032e7: CIRCLED KATAKANA NE*/
-                                                     0, /* U+0032e8: CIRCLED KATAKANA NO*/
-                                                     0, /* U+0032e9: CIRCLED KATAKANA HA*/
-                                                     0, /* U+0032ea: CIRCLED KATAKANA HI*/
-                                                     0, /* U+0032eb: CIRCLED KATAKANA HU*/
-                                                     0, /* U+0032ec: CIRCLED KATAKANA HE*/
-                                                     0, /* U+0032ed: CIRCLED KATAKANA HO*/
-                                                     0, /* U+0032ee: CIRCLED KATAKANA MA*/
-                                                     0, /* U+0032ef: CIRCLED KATAKANA MI*/
-                                                     0, /* U+0032f0: CIRCLED KATAKANA MU*/
-                                                     0, /* U+0032f1: CIRCLED KATAKANA ME*/
-                                                     0, /* U+0032f2: CIRCLED KATAKANA MO*/
-                                                     0, /* U+0032f3: CIRCLED KATAKANA YA*/
-                                                     0, /* U+0032f4: CIRCLED KATAKANA YU*/
-                                                     0, /* U+0032f5: CIRCLED KATAKANA YO*/
-                                                     0, /* U+0032f6: CIRCLED KATAKANA RA*/
-                                                     0, /* U+0032f7: CIRCLED KATAKANA RI*/
-                                                     0, /* U+0032f8: CIRCLED KATAKANA RU*/
-                                                     0, /* U+0032f9: CIRCLED KATAKANA RE*/
-                                                     0, /* U+0032fa: CIRCLED KATAKANA RO*/
-                                                     0, /* U+0032fb: CIRCLED KATAKANA WA*/
-                                                     0, /* U+0032fc: CIRCLED KATAKANA WI*/
-                                                     0, /* U+0032fd: CIRCLED KATAKANA WE*/
-                                                     0, /* U+0032fe: CIRCLED KATAKANA WO*/
-                                                     0, /* U+0032ff: */
-                                                     0, /* U+003300: SQUARE APAATO*/
-                                                     0, /* U+003301: SQUARE ARUHUA*/
-                                                     0, /* U+003302: SQUARE ANPEA*/
-                                                     0, /* U+003303: SQUARE AARU*/
-                                                     0, /* U+003304: SQUARE ININGU*/
-                                                     0, /* U+003305: SQUARE INTI*/
-                                                     0, /* U+003306: SQUARE UON*/
-                                                     0, /* U+003307: SQUARE ESUKUUDO*/
-                                                     0, /* U+003308: SQUARE EEKAA*/
-                                                     0, /* U+003309: SQUARE ONSU*/
-                                                     0, /* U+00330a: SQUARE OOMU*/
-                                                     0, /* U+00330b: SQUARE KAIRI*/
-                                                     0, /* U+00330c: SQUARE KARATTO*/
-                                                     0, /* U+00330d: SQUARE KARORII*/
-                                                     0, /* U+00330e: SQUARE GARON*/
-                                                     0, /* U+00330f: SQUARE GANMA*/
-                                                     0, /* U+003310: SQUARE GIGA*/
-                                                     0, /* U+003311: SQUARE GINII*/
-                                                     0, /* U+003312: SQUARE KYURII*/
-                                                     0, /* U+003313: SQUARE GIRUDAA*/
-                                                     0, /* U+003314: SQUARE KIRO*/
-                                                     0, /* U+003315: SQUARE KIROGURAMU*/
-                                                     0, /* U+003316: SQUARE KIROMEETORU*/
-                                                     0, /* U+003317: SQUARE KIROWATTO*/
-                                                     0, /* U+003318: SQUARE GURAMU*/
-                                                     0, /* U+003319: SQUARE GURAMUTON*/
-                                                     0, /* U+00331a: SQUARE KURUZEIRO*/
-                                                     0, /* U+00331b: SQUARE KUROONE*/
-                                                     0, /* U+00331c: SQUARE KEESU*/
-                                                     0, /* U+00331d: SQUARE KORUNA*/
-                                                     0, /* U+00331e: SQUARE KOOPO*/
-                                                     0, /* U+00331f: SQUARE SAIKURU*/
-                                                     0, /* U+003320: SQUARE SANTIIMU*/
-                                                     0, /* U+003321: SQUARE SIRINGU*/
-                                                     0, /* U+003322: SQUARE SENTI*/
-                                                     0, /* U+003323: SQUARE SENTO*/
-                                                     0, /* U+003324: SQUARE DAASU*/
-                                                     0, /* U+003325: SQUARE DESI*/
-                                                     0, /* U+003326: SQUARE DORU*/
-                                                     0, /* U+003327: SQUARE TON*/
-                                                     0, /* U+003328: SQUARE NANO*/
-                                                     0, /* U+003329: SQUARE NOTTO*/
-                                                     0, /* U+00332a: SQUARE HAITU*/
-                                                     0, /* U+00332b: SQUARE PAASENTO*/
-                                                     0, /* U+00332c: SQUARE PAATU*/
-                                                     0, /* U+00332d: SQUARE BAARERU*/
-                                                     0, /* U+00332e: SQUARE PIASUTORU*/
-                                                     0, /* U+00332f: SQUARE PIKURU*/
-                                                     0, /* U+003330: SQUARE PIKO*/
-                                                     0, /* U+003331: SQUARE BIRU*/
-                                                     0, /* U+003332: SQUARE HUARADDO*/
-                                                     0, /* U+003333: SQUARE HUIITO*/
-                                                     0, /* U+003334: SQUARE BUSSYERU*/
-                                                     0, /* U+003335: SQUARE HURAN*/
-                                                     0, /* U+003336: SQUARE HEKUTAARU*/
-                                                     0, /* U+003337: SQUARE PESO*/
-                                                     0, /* U+003338: SQUARE PENIHI*/
-                                                     0, /* U+003339: SQUARE HERUTU*/
-                                                     0, /* U+00333a: SQUARE PENSU*/
-                                                     0, /* U+00333b: SQUARE PEEZI*/
-                                                     0, /* U+00333c: SQUARE BEETA*/
-                                                     0, /* U+00333d: SQUARE POINTO*/
-                                                     0, /* U+00333e: SQUARE BORUTO*/
-                                                     0, /* U+00333f: SQUARE HON*/
-                                                     0, /* U+003340: SQUARE PONDO*/
-                                                     0, /* U+003341: SQUARE HOORU*/
-                                                     0, /* U+003342: SQUARE HOON*/
-                                                     0, /* U+003343: SQUARE MAIKURO*/
-                                                     0, /* U+003344: SQUARE MAIRU*/
-                                                     0, /* U+003345: SQUARE MAHHA*/
-                                                     0, /* U+003346: SQUARE MARUKU*/
-                                                     0, /* U+003347: SQUARE MANSYON*/
-                                                     0, /* U+003348: SQUARE MIKURON*/
-                                                     0, /* U+003349: SQUARE MIRI*/
-                                                     0, /* U+00334a: SQUARE MIRIBAARU*/
-                                                     0, /* U+00334b: SQUARE MEGA*/
-                                                     0, /* U+00334c: SQUARE MEGATON*/
-                                                     0, /* U+00334d: SQUARE MEETORU*/
-                                                     0, /* U+00334e: SQUARE YAADO*/
-                                                     0, /* U+00334f: SQUARE YAARU*/
-                                                     0, /* U+003350: SQUARE YUAN*/
-                                                     0, /* U+003351: SQUARE RITTORU*/
-                                                     0, /* U+003352: SQUARE RIRA*/
-                                                     0, /* U+003353: SQUARE RUPII*/
-                                                     0, /* U+003354: SQUARE RUUBURU*/
-                                                     0, /* U+003355: SQUARE REMU*/
-                                                     0, /* U+003356: SQUARE RENTOGEN*/
-                                                     0, /* U+003357: SQUARE WATTO*/
-                                                     0, /* U+003358: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO*/
-                                                     0, /* U+003359: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE*/
-                                                     0, /* U+00335a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO*/
-                                                     0, /* U+00335b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE*/
-                                                     0, /* U+00335c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR*/
-                                                     0, /* U+00335d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE*/
-                                                     0, /* U+00335e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX*/
-                                                     0, /* U+00335f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN*/
-                                                     0, /* U+003360: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT*/
-                                                     0, /* U+003361: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE*/
-                                                     0, /* U+003362: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN*/
-                                                     0, /* U+003363: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN*/
-                                                     0, /* U+003364: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE*/
-                                                     0, /* U+003365: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN*/
-                                                     0, /* U+003366: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN*/
-                                                     0, /* U+003367: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN*/
-                                                     0, /* U+003368: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN*/
-                                                     0, /* U+003369: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN*/
-                                                     0, /* U+00336a: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN*/
-                                                     0, /* U+00336b: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN*/
-                                                     0, /* U+00336c: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY*/
-                                                     0, /* U+00336d: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE*/
-                                                     0, /* U+00336e: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO*/
-                                                     0, /* U+00336f: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE*/
-                                                     0, /* U+003370: IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR*/
-                                                     0, /* U+003371: SQUARE HPA*/
-                                                     0, /* U+003372: SQUARE DA*/
-                                                     0, /* U+003373: SQUARE AU*/
-                                                     0, /* U+003374: SQUARE BAR*/
-                                                     0, /* U+003375: SQUARE OV*/
-                                                     0, /* U+003376: SQUARE PC*/
-                                                     0, /* U+003377: SQUARE DM*/
-                                                     0, /* U+003378: SQUARE DM SQUARED*/
-                                                     0, /* U+003379: SQUARE DM CUBED*/
-                                                     0, /* U+00337a: SQUARE IU*/
-                                                     0, /* U+00337b: SQUARE ERA NAME HEISEI*/
-                                                     0, /* U+00337c: SQUARE ERA NAME SYOUWA*/
-                                                     0, /* U+00337d: SQUARE ERA NAME TAISYOU*/
-                                                     0, /* U+00337e: SQUARE ERA NAME MEIZI*/
-                                                     0, /* U+00337f: SQUARE CORPORATION*/
-                                                     0, /* U+003380: SQUARE PA AMPS*/
-                                                     0, /* U+003381: SQUARE NA*/
-                                                     0, /* U+003382: SQUARE MU A*/
-                                                     0, /* U+003383: SQUARE MA*/
-                                                     0, /* U+003384: SQUARE KA*/
-                                                     0, /* U+003385: SQUARE KB*/
-                                                     0, /* U+003386: SQUARE MB*/
-                                                     0, /* U+003387: SQUARE GB*/
-                                                     0, /* U+003388: SQUARE CAL*/
-                                                     0, /* U+003389: SQUARE KCAL*/
-                                                     0, /* U+00338a: SQUARE PF*/
-                                                     0, /* U+00338b: SQUARE NF*/
-                                                     0, /* U+00338c: SQUARE MU F*/
-                                                     0, /* U+00338d: SQUARE MU G*/
-                                                     0, /* U+00338e: SQUARE MG*/
-                                                     0, /* U+00338f: SQUARE KG*/
-                                                     0, /* U+003390: SQUARE HZ*/
-                                                     0, /* U+003391: SQUARE KHZ*/
-                                                     0, /* U+003392: SQUARE MHZ*/
-                                                     0, /* U+003393: SQUARE GHZ*/
-                                                     0, /* U+003394: SQUARE THZ*/
-                                                     0, /* U+003395: SQUARE MU L*/
-                                                     0, /* U+003396: SQUARE ML*/
-                                                     0, /* U+003397: SQUARE DL*/
-                                                     0, /* U+003398: SQUARE KL*/
-                                                     0, /* U+003399: SQUARE FM*/
-                                                     0, /* U+00339a: SQUARE NM*/
-                                                     0, /* U+00339b: SQUARE MU M*/
-                                                     0, /* U+00339c: SQUARE MM*/
-                                                     0, /* U+00339d: SQUARE CM*/
-                                                     0, /* U+00339e: SQUARE KM*/
-                                                     0, /* U+00339f: SQUARE MM SQUARED*/
-                                                     0, /* U+0033a0: SQUARE CM SQUARED*/
-                                                     0, /* U+0033a1: SQUARE M SQUARED*/
-                                                     0, /* U+0033a2: SQUARE KM SQUARED*/
-                                                     0, /* U+0033a3: SQUARE MM CUBED*/
-                                                     0, /* U+0033a4: SQUARE CM CUBED*/
-                                                     0, /* U+0033a5: SQUARE M CUBED*/
-                                                     0, /* U+0033a6: SQUARE KM CUBED*/
-                                                     0, /* U+0033a7: SQUARE M OVER S*/
-                                                     0, /* U+0033a8: SQUARE M OVER S SQUARED*/
-                                                     0, /* U+0033a9: SQUARE PA*/
-                                                     0, /* U+0033aa: SQUARE KPA*/
-                                                     0, /* U+0033ab: SQUARE MPA*/
-                                                     0, /* U+0033ac: SQUARE GPA*/
-                                                     0, /* U+0033ad: SQUARE RAD*/
-                                                     0, /* U+0033ae: SQUARE RAD OVER S*/
-                                                     0, /* U+0033af: SQUARE RAD OVER S SQUARED*/
-                                                     0, /* U+0033b0: SQUARE PS*/
-                                                     0, /* U+0033b1: SQUARE NS*/
-                                                     0, /* U+0033b2: SQUARE MU S*/
-                                                     0, /* U+0033b3: SQUARE MS*/
-                                                     0, /* U+0033b4: SQUARE PV*/
-                                                     0, /* U+0033b5: SQUARE NV*/
-                                                     0, /* U+0033b6: SQUARE MU V*/
-                                                     0, /* U+0033b7: SQUARE MV*/
-                                                     0, /* U+0033b8: SQUARE KV*/
-                                                     0, /* U+0033b9: SQUARE MV MEGA*/
-                                                     0, /* U+0033ba: SQUARE PW*/
-                                                     0, /* U+0033bb: SQUARE NW*/
-                                                     0, /* U+0033bc: SQUARE MU W*/
-                                                     0, /* U+0033bd: SQUARE MW*/
-                                                     0, /* U+0033be: SQUARE KW*/
-                                                     0, /* U+0033bf: SQUARE MW MEGA*/
-                                                     0, /* U+0033c0: SQUARE K OHM*/
-                                                     0, /* U+0033c1: SQUARE M OHM*/
-                                                     0, /* U+0033c2: SQUARE AM*/
-                                                     0, /* U+0033c3: SQUARE BQ*/
-                                                     0, /* U+0033c4: SQUARE CC*/
-                                                     0, /* U+0033c5: SQUARE CD*/
-                                                     0, /* U+0033c6: SQUARE C OVER KG*/
-                                                     0, /* U+0033c7: SQUARE CO*/
-                                                     0, /* U+0033c8: SQUARE DB*/
-                                                     0, /* U+0033c9: SQUARE GY*/
-                                                     0, /* U+0033ca: SQUARE HA*/
-                                                     0, /* U+0033cb: SQUARE HP*/
-                                                     0, /* U+0033cc: SQUARE IN*/
-                                                     0, /* U+0033cd: SQUARE KK*/
-                                                     0, /* U+0033ce: SQUARE KM CAPITAL*/
-                                                     0, /* U+0033cf: SQUARE KT*/
-                                                     0, /* U+0033d0: SQUARE LM*/
-                                                     0, /* U+0033d1: SQUARE LN*/
-                                                     0, /* U+0033d2: SQUARE LOG*/
-                                                     0, /* U+0033d3: SQUARE LX*/
-                                                     0, /* U+0033d4: SQUARE MB SMALL*/
-                                                     0, /* U+0033d5: SQUARE MIL*/
-                                                     0, /* U+0033d6: SQUARE MOL*/
-                                                     0, /* U+0033d7: SQUARE PH*/
-                                                     0, /* U+0033d8: SQUARE PM*/
-                                                     0, /* U+0033d9: SQUARE PPM*/
-                                                     0, /* U+0033da: SQUARE PR*/
-                                                     0, /* U+0033db: SQUARE SR*/
-                                                     0, /* U+0033dc: SQUARE SV*/
-                                                     0, /* U+0033dd: SQUARE WB*/
-                                                     0, /* U+0033de: SQUARE V OVER M*/
-                                                     0, /* U+0033df: SQUARE A OVER M*/
-                                                     0, /* U+0033e0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE*/
-                                                     0, /* U+0033e1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO*/
-                                                     0, /* U+0033e2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE*/
-                                                     0, /* U+0033e3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR*/
-                                                     0, /* U+0033e4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE*/
-                                                     0, /* U+0033e5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX*/
-                                                     0, /* U+0033e6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN*/
-                                                     0, /* U+0033e7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT*/
-                                                     0, /* U+0033e8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE*/
-                                                     0, /* U+0033e9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN*/
-                                                     0, /* U+0033ea: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN*/
-                                                     0, /* U+0033eb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE*/
-                                                     0, /* U+0033ec: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN*/
-                                                     0, /* U+0033ed: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN*/
-                                                     0, /* U+0033ee: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN*/
-                                                     0, /* U+0033ef: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN*/
-                                                     0, /* U+0033f0: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN*/
-                                                     0, /* U+0033f1: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN*/
-                                                     0, /* U+0033f2: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN*/
-                                                     0, /* U+0033f3: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY*/
-                                                     0, /* U+0033f4: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE*/
-                                                     0, /* U+0033f5: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO*/
-                                                     0, /* U+0033f6: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE*/
-                                                     0, /* U+0033f7: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR*/
-                                                     0, /* U+0033f8: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE*/
-                                                     0, /* U+0033f9: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX*/
-                                                     0, /* U+0033fa: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN*/
-                                                     0, /* U+0033fb: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT*/
-                                                     0, /* U+0033fc: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE*/
-                                                     0, /* U+0033fd: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY*/
-                                                     0, /* U+0033fe: IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE*/
-                                                     0, /* U+0033ff: SQUARE GAL*/
-                                           RTUNI_ALPHA, /* U+003400: <CJK Ideograph Extension A, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x004db5[] =
-{
-                                           RTUNI_ALPHA, /* U+004db5: <CJK Ideograph Extension A, Last>*/
-                                                     0, /* U+004db6: */
-                                                     0, /* U+004db7: */
-                                                     0, /* U+004db8: */
-                                                     0, /* U+004db9: */
-                                                     0, /* U+004dba: */
-                                                     0, /* U+004dbb: */
-                                                     0, /* U+004dbc: */
-                                                     0, /* U+004dbd: */
-                                                     0, /* U+004dbe: */
-                                                     0, /* U+004dbf: */
-                                                     0, /* U+004dc0: HEXAGRAM FOR THE CREATIVE HEAVEN*/
-                                                     0, /* U+004dc1: HEXAGRAM FOR THE RECEPTIVE EARTH*/
-                                                     0, /* U+004dc2: HEXAGRAM FOR DIFFICULTY AT THE BEGINNING*/
-                                                     0, /* U+004dc3: HEXAGRAM FOR YOUTHFUL FOLLY*/
-                                                     0, /* U+004dc4: HEXAGRAM FOR WAITING*/
-                                                     0, /* U+004dc5: HEXAGRAM FOR CONFLICT*/
-                                                     0, /* U+004dc6: HEXAGRAM FOR THE ARMY*/
-                                                     0, /* U+004dc7: HEXAGRAM FOR HOLDING TOGETHER*/
-                                                     0, /* U+004dc8: HEXAGRAM FOR SMALL TAMING*/
-                                                     0, /* U+004dc9: HEXAGRAM FOR TREADING*/
-                                                     0, /* U+004dca: HEXAGRAM FOR PEACE*/
-                                                     0, /* U+004dcb: HEXAGRAM FOR STANDSTILL*/
-                                                     0, /* U+004dcc: HEXAGRAM FOR FELLOWSHIP*/
-                                                     0, /* U+004dcd: HEXAGRAM FOR GREAT POSSESSION*/
-                                                     0, /* U+004dce: HEXAGRAM FOR MODESTY*/
-                                                     0, /* U+004dcf: HEXAGRAM FOR ENTHUSIASM*/
-                                                     0, /* U+004dd0: HEXAGRAM FOR FOLLOWING*/
-                                                     0, /* U+004dd1: HEXAGRAM FOR WORK ON THE DECAYED*/
-                                                     0, /* U+004dd2: HEXAGRAM FOR APPROACH*/
-                                                     0, /* U+004dd3: HEXAGRAM FOR CONTEMPLATION*/
-                                                     0, /* U+004dd4: HEXAGRAM FOR BITING THROUGH*/
-                                                     0, /* U+004dd5: HEXAGRAM FOR GRACE*/
-                                                     0, /* U+004dd6: HEXAGRAM FOR SPLITTING APART*/
-                                                     0, /* U+004dd7: HEXAGRAM FOR RETURN*/
-                                                     0, /* U+004dd8: HEXAGRAM FOR INNOCENCE*/
-                                                     0, /* U+004dd9: HEXAGRAM FOR GREAT TAMING*/
-                                                     0, /* U+004dda: HEXAGRAM FOR MOUTH CORNERS*/
-                                                     0, /* U+004ddb: HEXAGRAM FOR GREAT PREPONDERANCE*/
-                                                     0, /* U+004ddc: HEXAGRAM FOR THE ABYSMAL WATER*/
-                                                     0, /* U+004ddd: HEXAGRAM FOR THE CLINGING FIRE*/
-                                                     0, /* U+004dde: HEXAGRAM FOR INFLUENCE*/
-                                                     0, /* U+004ddf: HEXAGRAM FOR DURATION*/
-                                                     0, /* U+004de0: HEXAGRAM FOR RETREAT*/
-                                                     0, /* U+004de1: HEXAGRAM FOR GREAT POWER*/
-                                                     0, /* U+004de2: HEXAGRAM FOR PROGRESS*/
-                                                     0, /* U+004de3: HEXAGRAM FOR DARKENING OF THE LIGHT*/
-                                                     0, /* U+004de4: HEXAGRAM FOR THE FAMILY*/
-                                                     0, /* U+004de5: HEXAGRAM FOR OPPOSITION*/
-                                                     0, /* U+004de6: HEXAGRAM FOR OBSTRUCTION*/
-                                                     0, /* U+004de7: HEXAGRAM FOR DELIVERANCE*/
-                                                     0, /* U+004de8: HEXAGRAM FOR DECREASE*/
-                                                     0, /* U+004de9: HEXAGRAM FOR INCREASE*/
-                                                     0, /* U+004dea: HEXAGRAM FOR BREAKTHROUGH*/
-                                                     0, /* U+004deb: HEXAGRAM FOR COMING TO MEET*/
-                                                     0, /* U+004dec: HEXAGRAM FOR GATHERING TOGETHER*/
-                                                     0, /* U+004ded: HEXAGRAM FOR PUSHING UPWARD*/
-                                                     0, /* U+004dee: HEXAGRAM FOR OPPRESSION*/
-                                                     0, /* U+004def: HEXAGRAM FOR THE WELL*/
-                                                     0, /* U+004df0: HEXAGRAM FOR REVOLUTION*/
-                                                     0, /* U+004df1: HEXAGRAM FOR THE CAULDRON*/
-                                                     0, /* U+004df2: HEXAGRAM FOR THE AROUSING THUNDER*/
-                                                     0, /* U+004df3: HEXAGRAM FOR THE KEEPING STILL MOUNTAIN*/
-                                                     0, /* U+004df4: HEXAGRAM FOR DEVELOPMENT*/
-                                                     0, /* U+004df5: HEXAGRAM FOR THE MARRYING MAIDEN*/
-                                                     0, /* U+004df6: HEXAGRAM FOR ABUNDANCE*/
-                                                     0, /* U+004df7: HEXAGRAM FOR THE WANDERER*/
-                                                     0, /* U+004df8: HEXAGRAM FOR THE GENTLE WIND*/
-                                                     0, /* U+004df9: HEXAGRAM FOR THE JOYOUS LAKE*/
-                                                     0, /* U+004dfa: HEXAGRAM FOR DISPERSION*/
-                                                     0, /* U+004dfb: HEXAGRAM FOR LIMITATION*/
-                                                     0, /* U+004dfc: HEXAGRAM FOR INNER TRUTH*/
-                                                     0, /* U+004dfd: HEXAGRAM FOR SMALL PREPONDERANCE*/
-                                                     0, /* U+004dfe: HEXAGRAM FOR AFTER COMPLETION*/
-                                                     0, /* U+004dff: HEXAGRAM FOR BEFORE COMPLETION*/
-                                           RTUNI_ALPHA, /* U+004e00: <CJK Ideograph, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x009fbb[] =
-{
-                                           RTUNI_ALPHA, /* U+009fbb: <CJK Ideograph, Last>*/
-                                                     0, /* U+009fbc: */
-                                                     0, /* U+009fbd: */
-                                                     0, /* U+009fbe: */
-                                                     0, /* U+009fbf: */
-                                                     0, /* U+009fc0: */
-                                                     0, /* U+009fc1: */
-                                                     0, /* U+009fc2: */
-                                                     0, /* U+009fc3: */
-                                                     0, /* U+009fc4: */
-                                                     0, /* U+009fc5: */
-                                                     0, /* U+009fc6: */
-                                                     0, /* U+009fc7: */
-                                                     0, /* U+009fc8: */
-                                                     0, /* U+009fc9: */
-                                                     0, /* U+009fca: */
-                                                     0, /* U+009fcb: */
-                                                     0, /* U+009fcc: */
-                                                     0, /* U+009fcd: */
-                                                     0, /* U+009fce: */
-                                                     0, /* U+009fcf: */
-                                                     0, /* U+009fd0: */
-                                                     0, /* U+009fd1: */
-                                                     0, /* U+009fd2: */
-                                                     0, /* U+009fd3: */
-                                                     0, /* U+009fd4: */
-                                                     0, /* U+009fd5: */
-                                                     0, /* U+009fd6: */
-                                                     0, /* U+009fd7: */
-                                                     0, /* U+009fd8: */
-                                                     0, /* U+009fd9: */
-                                                     0, /* U+009fda: */
-                                                     0, /* U+009fdb: */
-                                                     0, /* U+009fdc: */
-                                                     0, /* U+009fdd: */
-                                                     0, /* U+009fde: */
-                                                     0, /* U+009fdf: */
-                                                     0, /* U+009fe0: */
-                                                     0, /* U+009fe1: */
-                                                     0, /* U+009fe2: */
-                                                     0, /* U+009fe3: */
-                                                     0, /* U+009fe4: */
-                                                     0, /* U+009fe5: */
-                                                     0, /* U+009fe6: */
-                                                     0, /* U+009fe7: */
-                                                     0, /* U+009fe8: */
-                                                     0, /* U+009fe9: */
-                                                     0, /* U+009fea: */
-                                                     0, /* U+009feb: */
-                                                     0, /* U+009fec: */
-                                                     0, /* U+009fed: */
-                                                     0, /* U+009fee: */
-                                                     0, /* U+009fef: */
-                                                     0, /* U+009ff0: */
-                                                     0, /* U+009ff1: */
-                                                     0, /* U+009ff2: */
-                                                     0, /* U+009ff3: */
-                                                     0, /* U+009ff4: */
-                                                     0, /* U+009ff5: */
-                                                     0, /* U+009ff6: */
-                                                     0, /* U+009ff7: */
-                                                     0, /* U+009ff8: */
-                                                     0, /* U+009ff9: */
-                                                     0, /* U+009ffa: */
-                                                     0, /* U+009ffb: */
-                                                     0, /* U+009ffc: */
-                                                     0, /* U+009ffd: */
-                                                     0, /* U+009ffe: */
-                                                     0, /* U+009fff: */
-                                           RTUNI_ALPHA, /* U+00a000: YI SYLLABLE IT*/
-                                           RTUNI_ALPHA, /* U+00a001: YI SYLLABLE IX*/
-                                           RTUNI_ALPHA, /* U+00a002: YI SYLLABLE I*/
-                                           RTUNI_ALPHA, /* U+00a003: YI SYLLABLE IP*/
-                                           RTUNI_ALPHA, /* U+00a004: YI SYLLABLE IET*/
-                                           RTUNI_ALPHA, /* U+00a005: YI SYLLABLE IEX*/
-                                           RTUNI_ALPHA, /* U+00a006: YI SYLLABLE IE*/
-                                           RTUNI_ALPHA, /* U+00a007: YI SYLLABLE IEP*/
-                                           RTUNI_ALPHA, /* U+00a008: YI SYLLABLE AT*/
-                                           RTUNI_ALPHA, /* U+00a009: YI SYLLABLE AX*/
-                                           RTUNI_ALPHA, /* U+00a00a: YI SYLLABLE A*/
-                                           RTUNI_ALPHA, /* U+00a00b: YI SYLLABLE AP*/
-                                           RTUNI_ALPHA, /* U+00a00c: YI SYLLABLE UOX*/
-                                           RTUNI_ALPHA, /* U+00a00d: YI SYLLABLE UO*/
-                                           RTUNI_ALPHA, /* U+00a00e: YI SYLLABLE UOP*/
-                                           RTUNI_ALPHA, /* U+00a00f: YI SYLLABLE OT*/
-                                           RTUNI_ALPHA, /* U+00a010: YI SYLLABLE OX*/
-                                           RTUNI_ALPHA, /* U+00a011: YI SYLLABLE O*/
-                                           RTUNI_ALPHA, /* U+00a012: YI SYLLABLE OP*/
-                                           RTUNI_ALPHA, /* U+00a013: YI SYLLABLE EX*/
-                                           RTUNI_ALPHA, /* U+00a014: YI SYLLABLE E*/
-                                           RTUNI_ALPHA, /* U+00a015: YI SYLLABLE WU*/
-                                           RTUNI_ALPHA, /* U+00a016: YI SYLLABLE BIT*/
-                                           RTUNI_ALPHA, /* U+00a017: YI SYLLABLE BIX*/
-                                           RTUNI_ALPHA, /* U+00a018: YI SYLLABLE BI*/
-                                           RTUNI_ALPHA, /* U+00a019: YI SYLLABLE BIP*/
-                                           RTUNI_ALPHA, /* U+00a01a: YI SYLLABLE BIET*/
-                                           RTUNI_ALPHA, /* U+00a01b: YI SYLLABLE BIEX*/
-                                           RTUNI_ALPHA, /* U+00a01c: YI SYLLABLE BIE*/
-                                           RTUNI_ALPHA, /* U+00a01d: YI SYLLABLE BIEP*/
-                                           RTUNI_ALPHA, /* U+00a01e: YI SYLLABLE BAT*/
-                                           RTUNI_ALPHA, /* U+00a01f: YI SYLLABLE BAX*/
-                                           RTUNI_ALPHA, /* U+00a020: YI SYLLABLE BA*/
-                                           RTUNI_ALPHA, /* U+00a021: YI SYLLABLE BAP*/
-                                           RTUNI_ALPHA, /* U+00a022: YI SYLLABLE BUOX*/
-                                           RTUNI_ALPHA, /* U+00a023: YI SYLLABLE BUO*/
-                                           RTUNI_ALPHA, /* U+00a024: YI SYLLABLE BUOP*/
-                                           RTUNI_ALPHA, /* U+00a025: YI SYLLABLE BOT*/
-                                           RTUNI_ALPHA, /* U+00a026: YI SYLLABLE BOX*/
-                                           RTUNI_ALPHA, /* U+00a027: YI SYLLABLE BO*/
-                                           RTUNI_ALPHA, /* U+00a028: YI SYLLABLE BOP*/
-                                           RTUNI_ALPHA, /* U+00a029: YI SYLLABLE BEX*/
-                                           RTUNI_ALPHA, /* U+00a02a: YI SYLLABLE BE*/
-                                           RTUNI_ALPHA, /* U+00a02b: YI SYLLABLE BEP*/
-                                           RTUNI_ALPHA, /* U+00a02c: YI SYLLABLE BUT*/
-                                           RTUNI_ALPHA, /* U+00a02d: YI SYLLABLE BUX*/
-                                           RTUNI_ALPHA, /* U+00a02e: YI SYLLABLE BU*/
-                                           RTUNI_ALPHA, /* U+00a02f: YI SYLLABLE BUP*/
-                                           RTUNI_ALPHA, /* U+00a030: YI SYLLABLE BURX*/
-                                           RTUNI_ALPHA, /* U+00a031: YI SYLLABLE BUR*/
-                                           RTUNI_ALPHA, /* U+00a032: YI SYLLABLE BYT*/
-                                           RTUNI_ALPHA, /* U+00a033: YI SYLLABLE BYX*/
-                                           RTUNI_ALPHA, /* U+00a034: YI SYLLABLE BY*/
-                                           RTUNI_ALPHA, /* U+00a035: YI SYLLABLE BYP*/
-                                           RTUNI_ALPHA, /* U+00a036: YI SYLLABLE BYRX*/
-                                           RTUNI_ALPHA, /* U+00a037: YI SYLLABLE BYR*/
-                                           RTUNI_ALPHA, /* U+00a038: YI SYLLABLE PIT*/
-                                           RTUNI_ALPHA, /* U+00a039: YI SYLLABLE PIX*/
-                                           RTUNI_ALPHA, /* U+00a03a: YI SYLLABLE PI*/
-                                           RTUNI_ALPHA, /* U+00a03b: YI SYLLABLE PIP*/
-                                           RTUNI_ALPHA, /* U+00a03c: YI SYLLABLE PIEX*/
-                                           RTUNI_ALPHA, /* U+00a03d: YI SYLLABLE PIE*/
-                                           RTUNI_ALPHA, /* U+00a03e: YI SYLLABLE PIEP*/
-                                           RTUNI_ALPHA, /* U+00a03f: YI SYLLABLE PAT*/
-                                           RTUNI_ALPHA, /* U+00a040: YI SYLLABLE PAX*/
-                                           RTUNI_ALPHA, /* U+00a041: YI SYLLABLE PA*/
-                                           RTUNI_ALPHA, /* U+00a042: YI SYLLABLE PAP*/
-                                           RTUNI_ALPHA, /* U+00a043: YI SYLLABLE PUOX*/
-                                           RTUNI_ALPHA, /* U+00a044: YI SYLLABLE PUO*/
-                                           RTUNI_ALPHA, /* U+00a045: YI SYLLABLE PUOP*/
-                                           RTUNI_ALPHA, /* U+00a046: YI SYLLABLE POT*/
-                                           RTUNI_ALPHA, /* U+00a047: YI SYLLABLE POX*/
-                                           RTUNI_ALPHA, /* U+00a048: YI SYLLABLE PO*/
-                                           RTUNI_ALPHA, /* U+00a049: YI SYLLABLE POP*/
-                                           RTUNI_ALPHA, /* U+00a04a: YI SYLLABLE PUT*/
-                                           RTUNI_ALPHA, /* U+00a04b: YI SYLLABLE PUX*/
-                                           RTUNI_ALPHA, /* U+00a04c: YI SYLLABLE PU*/
-                                           RTUNI_ALPHA, /* U+00a04d: YI SYLLABLE PUP*/
-                                           RTUNI_ALPHA, /* U+00a04e: YI SYLLABLE PURX*/
-                                           RTUNI_ALPHA, /* U+00a04f: YI SYLLABLE PUR*/
-                                           RTUNI_ALPHA, /* U+00a050: YI SYLLABLE PYT*/
-                                           RTUNI_ALPHA, /* U+00a051: YI SYLLABLE PYX*/
-                                           RTUNI_ALPHA, /* U+00a052: YI SYLLABLE PY*/
-                                           RTUNI_ALPHA, /* U+00a053: YI SYLLABLE PYP*/
-                                           RTUNI_ALPHA, /* U+00a054: YI SYLLABLE PYRX*/
-                                           RTUNI_ALPHA, /* U+00a055: YI SYLLABLE PYR*/
-                                           RTUNI_ALPHA, /* U+00a056: YI SYLLABLE BBIT*/
-                                           RTUNI_ALPHA, /* U+00a057: YI SYLLABLE BBIX*/
-                                           RTUNI_ALPHA, /* U+00a058: YI SYLLABLE BBI*/
-                                           RTUNI_ALPHA, /* U+00a059: YI SYLLABLE BBIP*/
-                                           RTUNI_ALPHA, /* U+00a05a: YI SYLLABLE BBIET*/
-                                           RTUNI_ALPHA, /* U+00a05b: YI SYLLABLE BBIEX*/
-                                           RTUNI_ALPHA, /* U+00a05c: YI SYLLABLE BBIE*/
-                                           RTUNI_ALPHA, /* U+00a05d: YI SYLLABLE BBIEP*/
-                                           RTUNI_ALPHA, /* U+00a05e: YI SYLLABLE BBAT*/
-                                           RTUNI_ALPHA, /* U+00a05f: YI SYLLABLE BBAX*/
-                                           RTUNI_ALPHA, /* U+00a060: YI SYLLABLE BBA*/
-                                           RTUNI_ALPHA, /* U+00a061: YI SYLLABLE BBAP*/
-                                           RTUNI_ALPHA, /* U+00a062: YI SYLLABLE BBUOX*/
-                                           RTUNI_ALPHA, /* U+00a063: YI SYLLABLE BBUO*/
-                                           RTUNI_ALPHA, /* U+00a064: YI SYLLABLE BBUOP*/
-                                           RTUNI_ALPHA, /* U+00a065: YI SYLLABLE BBOT*/
-                                           RTUNI_ALPHA, /* U+00a066: YI SYLLABLE BBOX*/
-                                           RTUNI_ALPHA, /* U+00a067: YI SYLLABLE BBO*/
-                                           RTUNI_ALPHA, /* U+00a068: YI SYLLABLE BBOP*/
-                                           RTUNI_ALPHA, /* U+00a069: YI SYLLABLE BBEX*/
-                                           RTUNI_ALPHA, /* U+00a06a: YI SYLLABLE BBE*/
-                                           RTUNI_ALPHA, /* U+00a06b: YI SYLLABLE BBEP*/
-                                           RTUNI_ALPHA, /* U+00a06c: YI SYLLABLE BBUT*/
-                                           RTUNI_ALPHA, /* U+00a06d: YI SYLLABLE BBUX*/
-                                           RTUNI_ALPHA, /* U+00a06e: YI SYLLABLE BBU*/
-                                           RTUNI_ALPHA, /* U+00a06f: YI SYLLABLE BBUP*/
-                                           RTUNI_ALPHA, /* U+00a070: YI SYLLABLE BBURX*/
-                                           RTUNI_ALPHA, /* U+00a071: YI SYLLABLE BBUR*/
-                                           RTUNI_ALPHA, /* U+00a072: YI SYLLABLE BBYT*/
-                                           RTUNI_ALPHA, /* U+00a073: YI SYLLABLE BBYX*/
-                                           RTUNI_ALPHA, /* U+00a074: YI SYLLABLE BBY*/
-                                           RTUNI_ALPHA, /* U+00a075: YI SYLLABLE BBYP*/
-                                           RTUNI_ALPHA, /* U+00a076: YI SYLLABLE NBIT*/
-                                           RTUNI_ALPHA, /* U+00a077: YI SYLLABLE NBIX*/
-                                           RTUNI_ALPHA, /* U+00a078: YI SYLLABLE NBI*/
-                                           RTUNI_ALPHA, /* U+00a079: YI SYLLABLE NBIP*/
-                                           RTUNI_ALPHA, /* U+00a07a: YI SYLLABLE NBIEX*/
-                                           RTUNI_ALPHA, /* U+00a07b: YI SYLLABLE NBIE*/
-                                           RTUNI_ALPHA, /* U+00a07c: YI SYLLABLE NBIEP*/
-                                           RTUNI_ALPHA, /* U+00a07d: YI SYLLABLE NBAT*/
-                                           RTUNI_ALPHA, /* U+00a07e: YI SYLLABLE NBAX*/
-                                           RTUNI_ALPHA, /* U+00a07f: YI SYLLABLE NBA*/
-                                           RTUNI_ALPHA, /* U+00a080: YI SYLLABLE NBAP*/
-                                           RTUNI_ALPHA, /* U+00a081: YI SYLLABLE NBOT*/
-                                           RTUNI_ALPHA, /* U+00a082: YI SYLLABLE NBOX*/
-                                           RTUNI_ALPHA, /* U+00a083: YI SYLLABLE NBO*/
-                                           RTUNI_ALPHA, /* U+00a084: YI SYLLABLE NBOP*/
-                                           RTUNI_ALPHA, /* U+00a085: YI SYLLABLE NBUT*/
-                                           RTUNI_ALPHA, /* U+00a086: YI SYLLABLE NBUX*/
-                                           RTUNI_ALPHA, /* U+00a087: YI SYLLABLE NBU*/
-                                           RTUNI_ALPHA, /* U+00a088: YI SYLLABLE NBUP*/
-                                           RTUNI_ALPHA, /* U+00a089: YI SYLLABLE NBURX*/
-                                           RTUNI_ALPHA, /* U+00a08a: YI SYLLABLE NBUR*/
-                                           RTUNI_ALPHA, /* U+00a08b: YI SYLLABLE NBYT*/
-                                           RTUNI_ALPHA, /* U+00a08c: YI SYLLABLE NBYX*/
-                                           RTUNI_ALPHA, /* U+00a08d: YI SYLLABLE NBY*/
-                                           RTUNI_ALPHA, /* U+00a08e: YI SYLLABLE NBYP*/
-                                           RTUNI_ALPHA, /* U+00a08f: YI SYLLABLE NBYRX*/
-                                           RTUNI_ALPHA, /* U+00a090: YI SYLLABLE NBYR*/
-                                           RTUNI_ALPHA, /* U+00a091: YI SYLLABLE HMIT*/
-                                           RTUNI_ALPHA, /* U+00a092: YI SYLLABLE HMIX*/
-                                           RTUNI_ALPHA, /* U+00a093: YI SYLLABLE HMI*/
-                                           RTUNI_ALPHA, /* U+00a094: YI SYLLABLE HMIP*/
-                                           RTUNI_ALPHA, /* U+00a095: YI SYLLABLE HMIEX*/
-                                           RTUNI_ALPHA, /* U+00a096: YI SYLLABLE HMIE*/
-                                           RTUNI_ALPHA, /* U+00a097: YI SYLLABLE HMIEP*/
-                                           RTUNI_ALPHA, /* U+00a098: YI SYLLABLE HMAT*/
-                                           RTUNI_ALPHA, /* U+00a099: YI SYLLABLE HMAX*/
-                                           RTUNI_ALPHA, /* U+00a09a: YI SYLLABLE HMA*/
-                                           RTUNI_ALPHA, /* U+00a09b: YI SYLLABLE HMAP*/
-                                           RTUNI_ALPHA, /* U+00a09c: YI SYLLABLE HMUOX*/
-                                           RTUNI_ALPHA, /* U+00a09d: YI SYLLABLE HMUO*/
-                                           RTUNI_ALPHA, /* U+00a09e: YI SYLLABLE HMUOP*/
-                                           RTUNI_ALPHA, /* U+00a09f: YI SYLLABLE HMOT*/
-                                           RTUNI_ALPHA, /* U+00a0a0: YI SYLLABLE HMOX*/
-                                           RTUNI_ALPHA, /* U+00a0a1: YI SYLLABLE HMO*/
-                                           RTUNI_ALPHA, /* U+00a0a2: YI SYLLABLE HMOP*/
-                                           RTUNI_ALPHA, /* U+00a0a3: YI SYLLABLE HMUT*/
-                                           RTUNI_ALPHA, /* U+00a0a4: YI SYLLABLE HMUX*/
-                                           RTUNI_ALPHA, /* U+00a0a5: YI SYLLABLE HMU*/
-                                           RTUNI_ALPHA, /* U+00a0a6: YI SYLLABLE HMUP*/
-                                           RTUNI_ALPHA, /* U+00a0a7: YI SYLLABLE HMURX*/
-                                           RTUNI_ALPHA, /* U+00a0a8: YI SYLLABLE HMUR*/
-                                           RTUNI_ALPHA, /* U+00a0a9: YI SYLLABLE HMYX*/
-                                           RTUNI_ALPHA, /* U+00a0aa: YI SYLLABLE HMY*/
-                                           RTUNI_ALPHA, /* U+00a0ab: YI SYLLABLE HMYP*/
-                                           RTUNI_ALPHA, /* U+00a0ac: YI SYLLABLE HMYRX*/
-                                           RTUNI_ALPHA, /* U+00a0ad: YI SYLLABLE HMYR*/
-                                           RTUNI_ALPHA, /* U+00a0ae: YI SYLLABLE MIT*/
-                                           RTUNI_ALPHA, /* U+00a0af: YI SYLLABLE MIX*/
-                                           RTUNI_ALPHA, /* U+00a0b0: YI SYLLABLE MI*/
-                                           RTUNI_ALPHA, /* U+00a0b1: YI SYLLABLE MIP*/
-                                           RTUNI_ALPHA, /* U+00a0b2: YI SYLLABLE MIEX*/
-                                           RTUNI_ALPHA, /* U+00a0b3: YI SYLLABLE MIE*/
-                                           RTUNI_ALPHA, /* U+00a0b4: YI SYLLABLE MIEP*/
-                                           RTUNI_ALPHA, /* U+00a0b5: YI SYLLABLE MAT*/
-                                           RTUNI_ALPHA, /* U+00a0b6: YI SYLLABLE MAX*/
-                                           RTUNI_ALPHA, /* U+00a0b7: YI SYLLABLE MA*/
-                                           RTUNI_ALPHA, /* U+00a0b8: YI SYLLABLE MAP*/
-                                           RTUNI_ALPHA, /* U+00a0b9: YI SYLLABLE MUOT*/
-                                           RTUNI_ALPHA, /* U+00a0ba: YI SYLLABLE MUOX*/
-                                           RTUNI_ALPHA, /* U+00a0bb: YI SYLLABLE MUO*/
-                                           RTUNI_ALPHA, /* U+00a0bc: YI SYLLABLE MUOP*/
-                                           RTUNI_ALPHA, /* U+00a0bd: YI SYLLABLE MOT*/
-                                           RTUNI_ALPHA, /* U+00a0be: YI SYLLABLE MOX*/
-                                           RTUNI_ALPHA, /* U+00a0bf: YI SYLLABLE MO*/
-                                           RTUNI_ALPHA, /* U+00a0c0: YI SYLLABLE MOP*/
-                                           RTUNI_ALPHA, /* U+00a0c1: YI SYLLABLE MEX*/
-                                           RTUNI_ALPHA, /* U+00a0c2: YI SYLLABLE ME*/
-                                           RTUNI_ALPHA, /* U+00a0c3: YI SYLLABLE MUT*/
-                                           RTUNI_ALPHA, /* U+00a0c4: YI SYLLABLE MUX*/
-                                           RTUNI_ALPHA, /* U+00a0c5: YI SYLLABLE MU*/
-                                           RTUNI_ALPHA, /* U+00a0c6: YI SYLLABLE MUP*/
-                                           RTUNI_ALPHA, /* U+00a0c7: YI SYLLABLE MURX*/
-                                           RTUNI_ALPHA, /* U+00a0c8: YI SYLLABLE MUR*/
-                                           RTUNI_ALPHA, /* U+00a0c9: YI SYLLABLE MYT*/
-                                           RTUNI_ALPHA, /* U+00a0ca: YI SYLLABLE MYX*/
-                                           RTUNI_ALPHA, /* U+00a0cb: YI SYLLABLE MY*/
-                                           RTUNI_ALPHA, /* U+00a0cc: YI SYLLABLE MYP*/
-                                           RTUNI_ALPHA, /* U+00a0cd: YI SYLLABLE FIT*/
-                                           RTUNI_ALPHA, /* U+00a0ce: YI SYLLABLE FIX*/
-                                           RTUNI_ALPHA, /* U+00a0cf: YI SYLLABLE FI*/
-                                           RTUNI_ALPHA, /* U+00a0d0: YI SYLLABLE FIP*/
-                                           RTUNI_ALPHA, /* U+00a0d1: YI SYLLABLE FAT*/
-                                           RTUNI_ALPHA, /* U+00a0d2: YI SYLLABLE FAX*/
-                                           RTUNI_ALPHA, /* U+00a0d3: YI SYLLABLE FA*/
-                                           RTUNI_ALPHA, /* U+00a0d4: YI SYLLABLE FAP*/
-                                           RTUNI_ALPHA, /* U+00a0d5: YI SYLLABLE FOX*/
-                                           RTUNI_ALPHA, /* U+00a0d6: YI SYLLABLE FO*/
-                                           RTUNI_ALPHA, /* U+00a0d7: YI SYLLABLE FOP*/
-                                           RTUNI_ALPHA, /* U+00a0d8: YI SYLLABLE FUT*/
-                                           RTUNI_ALPHA, /* U+00a0d9: YI SYLLABLE FUX*/
-                                           RTUNI_ALPHA, /* U+00a0da: YI SYLLABLE FU*/
-                                           RTUNI_ALPHA, /* U+00a0db: YI SYLLABLE FUP*/
-                                           RTUNI_ALPHA, /* U+00a0dc: YI SYLLABLE FURX*/
-                                           RTUNI_ALPHA, /* U+00a0dd: YI SYLLABLE FUR*/
-                                           RTUNI_ALPHA, /* U+00a0de: YI SYLLABLE FYT*/
-                                           RTUNI_ALPHA, /* U+00a0df: YI SYLLABLE FYX*/
-                                           RTUNI_ALPHA, /* U+00a0e0: YI SYLLABLE FY*/
-                                           RTUNI_ALPHA, /* U+00a0e1: YI SYLLABLE FYP*/
-                                           RTUNI_ALPHA, /* U+00a0e2: YI SYLLABLE VIT*/
-                                           RTUNI_ALPHA, /* U+00a0e3: YI SYLLABLE VIX*/
-                                           RTUNI_ALPHA, /* U+00a0e4: YI SYLLABLE VI*/
-                                           RTUNI_ALPHA, /* U+00a0e5: YI SYLLABLE VIP*/
-                                           RTUNI_ALPHA, /* U+00a0e6: YI SYLLABLE VIET*/
-                                           RTUNI_ALPHA, /* U+00a0e7: YI SYLLABLE VIEX*/
-                                           RTUNI_ALPHA, /* U+00a0e8: YI SYLLABLE VIE*/
-                                           RTUNI_ALPHA, /* U+00a0e9: YI SYLLABLE VIEP*/
-                                           RTUNI_ALPHA, /* U+00a0ea: YI SYLLABLE VAT*/
-                                           RTUNI_ALPHA, /* U+00a0eb: YI SYLLABLE VAX*/
-                                           RTUNI_ALPHA, /* U+00a0ec: YI SYLLABLE VA*/
-                                           RTUNI_ALPHA, /* U+00a0ed: YI SYLLABLE VAP*/
-                                           RTUNI_ALPHA, /* U+00a0ee: YI SYLLABLE VOT*/
-                                           RTUNI_ALPHA, /* U+00a0ef: YI SYLLABLE VOX*/
-                                           RTUNI_ALPHA, /* U+00a0f0: YI SYLLABLE VO*/
-                                           RTUNI_ALPHA, /* U+00a0f1: YI SYLLABLE VOP*/
-                                           RTUNI_ALPHA, /* U+00a0f2: YI SYLLABLE VEX*/
-                                           RTUNI_ALPHA, /* U+00a0f3: YI SYLLABLE VEP*/
-                                           RTUNI_ALPHA, /* U+00a0f4: YI SYLLABLE VUT*/
-                                           RTUNI_ALPHA, /* U+00a0f5: YI SYLLABLE VUX*/
-                                           RTUNI_ALPHA, /* U+00a0f6: YI SYLLABLE VU*/
-                                           RTUNI_ALPHA, /* U+00a0f7: YI SYLLABLE VUP*/
-                                           RTUNI_ALPHA, /* U+00a0f8: YI SYLLABLE VURX*/
-                                           RTUNI_ALPHA, /* U+00a0f9: YI SYLLABLE VUR*/
-                                           RTUNI_ALPHA, /* U+00a0fa: YI SYLLABLE VYT*/
-                                           RTUNI_ALPHA, /* U+00a0fb: YI SYLLABLE VYX*/
-                                           RTUNI_ALPHA, /* U+00a0fc: YI SYLLABLE VY*/
-                                           RTUNI_ALPHA, /* U+00a0fd: YI SYLLABLE VYP*/
-                                           RTUNI_ALPHA, /* U+00a0fe: YI SYLLABLE VYRX*/
-                                           RTUNI_ALPHA, /* U+00a0ff: YI SYLLABLE VYR*/
-                                           RTUNI_ALPHA, /* U+00a100: YI SYLLABLE DIT*/
-                                           RTUNI_ALPHA, /* U+00a101: YI SYLLABLE DIX*/
-                                           RTUNI_ALPHA, /* U+00a102: YI SYLLABLE DI*/
-                                           RTUNI_ALPHA, /* U+00a103: YI SYLLABLE DIP*/
-                                           RTUNI_ALPHA, /* U+00a104: YI SYLLABLE DIEX*/
-                                           RTUNI_ALPHA, /* U+00a105: YI SYLLABLE DIE*/
-                                           RTUNI_ALPHA, /* U+00a106: YI SYLLABLE DIEP*/
-                                           RTUNI_ALPHA, /* U+00a107: YI SYLLABLE DAT*/
-                                           RTUNI_ALPHA, /* U+00a108: YI SYLLABLE DAX*/
-                                           RTUNI_ALPHA, /* U+00a109: YI SYLLABLE DA*/
-                                           RTUNI_ALPHA, /* U+00a10a: YI SYLLABLE DAP*/
-                                           RTUNI_ALPHA, /* U+00a10b: YI SYLLABLE DUOX*/
-                                           RTUNI_ALPHA, /* U+00a10c: YI SYLLABLE DUO*/
-                                           RTUNI_ALPHA, /* U+00a10d: YI SYLLABLE DOT*/
-                                           RTUNI_ALPHA, /* U+00a10e: YI SYLLABLE DOX*/
-                                           RTUNI_ALPHA, /* U+00a10f: YI SYLLABLE DO*/
-                                           RTUNI_ALPHA, /* U+00a110: YI SYLLABLE DOP*/
-                                           RTUNI_ALPHA, /* U+00a111: YI SYLLABLE DEX*/
-                                           RTUNI_ALPHA, /* U+00a112: YI SYLLABLE DE*/
-                                           RTUNI_ALPHA, /* U+00a113: YI SYLLABLE DEP*/
-                                           RTUNI_ALPHA, /* U+00a114: YI SYLLABLE DUT*/
-                                           RTUNI_ALPHA, /* U+00a115: YI SYLLABLE DUX*/
-                                           RTUNI_ALPHA, /* U+00a116: YI SYLLABLE DU*/
-                                           RTUNI_ALPHA, /* U+00a117: YI SYLLABLE DUP*/
-                                           RTUNI_ALPHA, /* U+00a118: YI SYLLABLE DURX*/
-                                           RTUNI_ALPHA, /* U+00a119: YI SYLLABLE DUR*/
-                                           RTUNI_ALPHA, /* U+00a11a: YI SYLLABLE TIT*/
-                                           RTUNI_ALPHA, /* U+00a11b: YI SYLLABLE TIX*/
-                                           RTUNI_ALPHA, /* U+00a11c: YI SYLLABLE TI*/
-                                           RTUNI_ALPHA, /* U+00a11d: YI SYLLABLE TIP*/
-                                           RTUNI_ALPHA, /* U+00a11e: YI SYLLABLE TIEX*/
-                                           RTUNI_ALPHA, /* U+00a11f: YI SYLLABLE TIE*/
-                                           RTUNI_ALPHA, /* U+00a120: YI SYLLABLE TIEP*/
-                                           RTUNI_ALPHA, /* U+00a121: YI SYLLABLE TAT*/
-                                           RTUNI_ALPHA, /* U+00a122: YI SYLLABLE TAX*/
-                                           RTUNI_ALPHA, /* U+00a123: YI SYLLABLE TA*/
-                                           RTUNI_ALPHA, /* U+00a124: YI SYLLABLE TAP*/
-                                           RTUNI_ALPHA, /* U+00a125: YI SYLLABLE TUOT*/
-                                           RTUNI_ALPHA, /* U+00a126: YI SYLLABLE TUOX*/
-                                           RTUNI_ALPHA, /* U+00a127: YI SYLLABLE TUO*/
-                                           RTUNI_ALPHA, /* U+00a128: YI SYLLABLE TUOP*/
-                                           RTUNI_ALPHA, /* U+00a129: YI SYLLABLE TOT*/
-                                           RTUNI_ALPHA, /* U+00a12a: YI SYLLABLE TOX*/
-                                           RTUNI_ALPHA, /* U+00a12b: YI SYLLABLE TO*/
-                                           RTUNI_ALPHA, /* U+00a12c: YI SYLLABLE TOP*/
-                                           RTUNI_ALPHA, /* U+00a12d: YI SYLLABLE TEX*/
-                                           RTUNI_ALPHA, /* U+00a12e: YI SYLLABLE TE*/
-                                           RTUNI_ALPHA, /* U+00a12f: YI SYLLABLE TEP*/
-                                           RTUNI_ALPHA, /* U+00a130: YI SYLLABLE TUT*/
-                                           RTUNI_ALPHA, /* U+00a131: YI SYLLABLE TUX*/
-                                           RTUNI_ALPHA, /* U+00a132: YI SYLLABLE TU*/
-                                           RTUNI_ALPHA, /* U+00a133: YI SYLLABLE TUP*/
-                                           RTUNI_ALPHA, /* U+00a134: YI SYLLABLE TURX*/
-                                           RTUNI_ALPHA, /* U+00a135: YI SYLLABLE TUR*/
-                                           RTUNI_ALPHA, /* U+00a136: YI SYLLABLE DDIT*/
-                                           RTUNI_ALPHA, /* U+00a137: YI SYLLABLE DDIX*/
-                                           RTUNI_ALPHA, /* U+00a138: YI SYLLABLE DDI*/
-                                           RTUNI_ALPHA, /* U+00a139: YI SYLLABLE DDIP*/
-                                           RTUNI_ALPHA, /* U+00a13a: YI SYLLABLE DDIEX*/
-                                           RTUNI_ALPHA, /* U+00a13b: YI SYLLABLE DDIE*/
-                                           RTUNI_ALPHA, /* U+00a13c: YI SYLLABLE DDIEP*/
-                                           RTUNI_ALPHA, /* U+00a13d: YI SYLLABLE DDAT*/
-                                           RTUNI_ALPHA, /* U+00a13e: YI SYLLABLE DDAX*/
-                                           RTUNI_ALPHA, /* U+00a13f: YI SYLLABLE DDA*/
-                                           RTUNI_ALPHA, /* U+00a140: YI SYLLABLE DDAP*/
-                                           RTUNI_ALPHA, /* U+00a141: YI SYLLABLE DDUOX*/
-                                           RTUNI_ALPHA, /* U+00a142: YI SYLLABLE DDUO*/
-                                           RTUNI_ALPHA, /* U+00a143: YI SYLLABLE DDUOP*/
-                                           RTUNI_ALPHA, /* U+00a144: YI SYLLABLE DDOT*/
-                                           RTUNI_ALPHA, /* U+00a145: YI SYLLABLE DDOX*/
-                                           RTUNI_ALPHA, /* U+00a146: YI SYLLABLE DDO*/
-                                           RTUNI_ALPHA, /* U+00a147: YI SYLLABLE DDOP*/
-                                           RTUNI_ALPHA, /* U+00a148: YI SYLLABLE DDEX*/
-                                           RTUNI_ALPHA, /* U+00a149: YI SYLLABLE DDE*/
-                                           RTUNI_ALPHA, /* U+00a14a: YI SYLLABLE DDEP*/
-                                           RTUNI_ALPHA, /* U+00a14b: YI SYLLABLE DDUT*/
-                                           RTUNI_ALPHA, /* U+00a14c: YI SYLLABLE DDUX*/
-                                           RTUNI_ALPHA, /* U+00a14d: YI SYLLABLE DDU*/
-                                           RTUNI_ALPHA, /* U+00a14e: YI SYLLABLE DDUP*/
-                                           RTUNI_ALPHA, /* U+00a14f: YI SYLLABLE DDURX*/
-                                           RTUNI_ALPHA, /* U+00a150: YI SYLLABLE DDUR*/
-                                           RTUNI_ALPHA, /* U+00a151: YI SYLLABLE NDIT*/
-                                           RTUNI_ALPHA, /* U+00a152: YI SYLLABLE NDIX*/
-                                           RTUNI_ALPHA, /* U+00a153: YI SYLLABLE NDI*/
-                                           RTUNI_ALPHA, /* U+00a154: YI SYLLABLE NDIP*/
-                                           RTUNI_ALPHA, /* U+00a155: YI SYLLABLE NDIEX*/
-                                           RTUNI_ALPHA, /* U+00a156: YI SYLLABLE NDIE*/
-                                           RTUNI_ALPHA, /* U+00a157: YI SYLLABLE NDAT*/
-                                           RTUNI_ALPHA, /* U+00a158: YI SYLLABLE NDAX*/
-                                           RTUNI_ALPHA, /* U+00a159: YI SYLLABLE NDA*/
-                                           RTUNI_ALPHA, /* U+00a15a: YI SYLLABLE NDAP*/
-                                           RTUNI_ALPHA, /* U+00a15b: YI SYLLABLE NDOT*/
-                                           RTUNI_ALPHA, /* U+00a15c: YI SYLLABLE NDOX*/
-                                           RTUNI_ALPHA, /* U+00a15d: YI SYLLABLE NDO*/
-                                           RTUNI_ALPHA, /* U+00a15e: YI SYLLABLE NDOP*/
-                                           RTUNI_ALPHA, /* U+00a15f: YI SYLLABLE NDEX*/
-                                           RTUNI_ALPHA, /* U+00a160: YI SYLLABLE NDE*/
-                                           RTUNI_ALPHA, /* U+00a161: YI SYLLABLE NDEP*/
-                                           RTUNI_ALPHA, /* U+00a162: YI SYLLABLE NDUT*/
-                                           RTUNI_ALPHA, /* U+00a163: YI SYLLABLE NDUX*/
-                                           RTUNI_ALPHA, /* U+00a164: YI SYLLABLE NDU*/
-                                           RTUNI_ALPHA, /* U+00a165: YI SYLLABLE NDUP*/
-                                           RTUNI_ALPHA, /* U+00a166: YI SYLLABLE NDURX*/
-                                           RTUNI_ALPHA, /* U+00a167: YI SYLLABLE NDUR*/
-                                           RTUNI_ALPHA, /* U+00a168: YI SYLLABLE HNIT*/
-                                           RTUNI_ALPHA, /* U+00a169: YI SYLLABLE HNIX*/
-                                           RTUNI_ALPHA, /* U+00a16a: YI SYLLABLE HNI*/
-                                           RTUNI_ALPHA, /* U+00a16b: YI SYLLABLE HNIP*/
-                                           RTUNI_ALPHA, /* U+00a16c: YI SYLLABLE HNIET*/
-                                           RTUNI_ALPHA, /* U+00a16d: YI SYLLABLE HNIEX*/
-                                           RTUNI_ALPHA, /* U+00a16e: YI SYLLABLE HNIE*/
-                                           RTUNI_ALPHA, /* U+00a16f: YI SYLLABLE HNIEP*/
-                                           RTUNI_ALPHA, /* U+00a170: YI SYLLABLE HNAT*/
-                                           RTUNI_ALPHA, /* U+00a171: YI SYLLABLE HNAX*/
-                                           RTUNI_ALPHA, /* U+00a172: YI SYLLABLE HNA*/
-                                           RTUNI_ALPHA, /* U+00a173: YI SYLLABLE HNAP*/
-                                           RTUNI_ALPHA, /* U+00a174: YI SYLLABLE HNUOX*/
-                                           RTUNI_ALPHA, /* U+00a175: YI SYLLABLE HNUO*/
-                                           RTUNI_ALPHA, /* U+00a176: YI SYLLABLE HNOT*/
-                                           RTUNI_ALPHA, /* U+00a177: YI SYLLABLE HNOX*/
-                                           RTUNI_ALPHA, /* U+00a178: YI SYLLABLE HNOP*/
-                                           RTUNI_ALPHA, /* U+00a179: YI SYLLABLE HNEX*/
-                                           RTUNI_ALPHA, /* U+00a17a: YI SYLLABLE HNE*/
-                                           RTUNI_ALPHA, /* U+00a17b: YI SYLLABLE HNEP*/
-                                           RTUNI_ALPHA, /* U+00a17c: YI SYLLABLE HNUT*/
-                                           RTUNI_ALPHA, /* U+00a17d: YI SYLLABLE NIT*/
-                                           RTUNI_ALPHA, /* U+00a17e: YI SYLLABLE NIX*/
-                                           RTUNI_ALPHA, /* U+00a17f: YI SYLLABLE NI*/
-                                           RTUNI_ALPHA, /* U+00a180: YI SYLLABLE NIP*/
-                                           RTUNI_ALPHA, /* U+00a181: YI SYLLABLE NIEX*/
-                                           RTUNI_ALPHA, /* U+00a182: YI SYLLABLE NIE*/
-                                           RTUNI_ALPHA, /* U+00a183: YI SYLLABLE NIEP*/
-                                           RTUNI_ALPHA, /* U+00a184: YI SYLLABLE NAX*/
-                                           RTUNI_ALPHA, /* U+00a185: YI SYLLABLE NA*/
-                                           RTUNI_ALPHA, /* U+00a186: YI SYLLABLE NAP*/
-                                           RTUNI_ALPHA, /* U+00a187: YI SYLLABLE NUOX*/
-                                           RTUNI_ALPHA, /* U+00a188: YI SYLLABLE NUO*/
-                                           RTUNI_ALPHA, /* U+00a189: YI SYLLABLE NUOP*/
-                                           RTUNI_ALPHA, /* U+00a18a: YI SYLLABLE NOT*/
-                                           RTUNI_ALPHA, /* U+00a18b: YI SYLLABLE NOX*/
-                                           RTUNI_ALPHA, /* U+00a18c: YI SYLLABLE NO*/
-                                           RTUNI_ALPHA, /* U+00a18d: YI SYLLABLE NOP*/
-                                           RTUNI_ALPHA, /* U+00a18e: YI SYLLABLE NEX*/
-                                           RTUNI_ALPHA, /* U+00a18f: YI SYLLABLE NE*/
-                                           RTUNI_ALPHA, /* U+00a190: YI SYLLABLE NEP*/
-                                           RTUNI_ALPHA, /* U+00a191: YI SYLLABLE NUT*/
-                                           RTUNI_ALPHA, /* U+00a192: YI SYLLABLE NUX*/
-                                           RTUNI_ALPHA, /* U+00a193: YI SYLLABLE NU*/
-                                           RTUNI_ALPHA, /* U+00a194: YI SYLLABLE NUP*/
-                                           RTUNI_ALPHA, /* U+00a195: YI SYLLABLE NURX*/
-                                           RTUNI_ALPHA, /* U+00a196: YI SYLLABLE NUR*/
-                                           RTUNI_ALPHA, /* U+00a197: YI SYLLABLE HLIT*/
-                                           RTUNI_ALPHA, /* U+00a198: YI SYLLABLE HLIX*/
-                                           RTUNI_ALPHA, /* U+00a199: YI SYLLABLE HLI*/
-                                           RTUNI_ALPHA, /* U+00a19a: YI SYLLABLE HLIP*/
-                                           RTUNI_ALPHA, /* U+00a19b: YI SYLLABLE HLIEX*/
-                                           RTUNI_ALPHA, /* U+00a19c: YI SYLLABLE HLIE*/
-                                           RTUNI_ALPHA, /* U+00a19d: YI SYLLABLE HLIEP*/
-                                           RTUNI_ALPHA, /* U+00a19e: YI SYLLABLE HLAT*/
-                                           RTUNI_ALPHA, /* U+00a19f: YI SYLLABLE HLAX*/
-                                           RTUNI_ALPHA, /* U+00a1a0: YI SYLLABLE HLA*/
-                                           RTUNI_ALPHA, /* U+00a1a1: YI SYLLABLE HLAP*/
-                                           RTUNI_ALPHA, /* U+00a1a2: YI SYLLABLE HLUOX*/
-                                           RTUNI_ALPHA, /* U+00a1a3: YI SYLLABLE HLUO*/
-                                           RTUNI_ALPHA, /* U+00a1a4: YI SYLLABLE HLUOP*/
-                                           RTUNI_ALPHA, /* U+00a1a5: YI SYLLABLE HLOX*/
-                                           RTUNI_ALPHA, /* U+00a1a6: YI SYLLABLE HLO*/
-                                           RTUNI_ALPHA, /* U+00a1a7: YI SYLLABLE HLOP*/
-                                           RTUNI_ALPHA, /* U+00a1a8: YI SYLLABLE HLEX*/
-                                           RTUNI_ALPHA, /* U+00a1a9: YI SYLLABLE HLE*/
-                                           RTUNI_ALPHA, /* U+00a1aa: YI SYLLABLE HLEP*/
-                                           RTUNI_ALPHA, /* U+00a1ab: YI SYLLABLE HLUT*/
-                                           RTUNI_ALPHA, /* U+00a1ac: YI SYLLABLE HLUX*/
-                                           RTUNI_ALPHA, /* U+00a1ad: YI SYLLABLE HLU*/
-                                           RTUNI_ALPHA, /* U+00a1ae: YI SYLLABLE HLUP*/
-                                           RTUNI_ALPHA, /* U+00a1af: YI SYLLABLE HLURX*/
-                                           RTUNI_ALPHA, /* U+00a1b0: YI SYLLABLE HLUR*/
-                                           RTUNI_ALPHA, /* U+00a1b1: YI SYLLABLE HLYT*/
-                                           RTUNI_ALPHA, /* U+00a1b2: YI SYLLABLE HLYX*/
-                                           RTUNI_ALPHA, /* U+00a1b3: YI SYLLABLE HLY*/
-                                           RTUNI_ALPHA, /* U+00a1b4: YI SYLLABLE HLYP*/
-                                           RTUNI_ALPHA, /* U+00a1b5: YI SYLLABLE HLYRX*/
-                                           RTUNI_ALPHA, /* U+00a1b6: YI SYLLABLE HLYR*/
-                                           RTUNI_ALPHA, /* U+00a1b7: YI SYLLABLE LIT*/
-                                           RTUNI_ALPHA, /* U+00a1b8: YI SYLLABLE LIX*/
-                                           RTUNI_ALPHA, /* U+00a1b9: YI SYLLABLE LI*/
-                                           RTUNI_ALPHA, /* U+00a1ba: YI SYLLABLE LIP*/
-                                           RTUNI_ALPHA, /* U+00a1bb: YI SYLLABLE LIET*/
-                                           RTUNI_ALPHA, /* U+00a1bc: YI SYLLABLE LIEX*/
-                                           RTUNI_ALPHA, /* U+00a1bd: YI SYLLABLE LIE*/
-                                           RTUNI_ALPHA, /* U+00a1be: YI SYLLABLE LIEP*/
-                                           RTUNI_ALPHA, /* U+00a1bf: YI SYLLABLE LAT*/
-                                           RTUNI_ALPHA, /* U+00a1c0: YI SYLLABLE LAX*/
-                                           RTUNI_ALPHA, /* U+00a1c1: YI SYLLABLE LA*/
-                                           RTUNI_ALPHA, /* U+00a1c2: YI SYLLABLE LAP*/
-                                           RTUNI_ALPHA, /* U+00a1c3: YI SYLLABLE LUOT*/
-                                           RTUNI_ALPHA, /* U+00a1c4: YI SYLLABLE LUOX*/
-                                           RTUNI_ALPHA, /* U+00a1c5: YI SYLLABLE LUO*/
-                                           RTUNI_ALPHA, /* U+00a1c6: YI SYLLABLE LUOP*/
-                                           RTUNI_ALPHA, /* U+00a1c7: YI SYLLABLE LOT*/
-                                           RTUNI_ALPHA, /* U+00a1c8: YI SYLLABLE LOX*/
-                                           RTUNI_ALPHA, /* U+00a1c9: YI SYLLABLE LO*/
-                                           RTUNI_ALPHA, /* U+00a1ca: YI SYLLABLE LOP*/
-                                           RTUNI_ALPHA, /* U+00a1cb: YI SYLLABLE LEX*/
-                                           RTUNI_ALPHA, /* U+00a1cc: YI SYLLABLE LE*/
-                                           RTUNI_ALPHA, /* U+00a1cd: YI SYLLABLE LEP*/
-                                           RTUNI_ALPHA, /* U+00a1ce: YI SYLLABLE LUT*/
-                                           RTUNI_ALPHA, /* U+00a1cf: YI SYLLABLE LUX*/
-                                           RTUNI_ALPHA, /* U+00a1d0: YI SYLLABLE LU*/
-                                           RTUNI_ALPHA, /* U+00a1d1: YI SYLLABLE LUP*/
-                                           RTUNI_ALPHA, /* U+00a1d2: YI SYLLABLE LURX*/
-                                           RTUNI_ALPHA, /* U+00a1d3: YI SYLLABLE LUR*/
-                                           RTUNI_ALPHA, /* U+00a1d4: YI SYLLABLE LYT*/
-                                           RTUNI_ALPHA, /* U+00a1d5: YI SYLLABLE LYX*/
-                                           RTUNI_ALPHA, /* U+00a1d6: YI SYLLABLE LY*/
-                                           RTUNI_ALPHA, /* U+00a1d7: YI SYLLABLE LYP*/
-                                           RTUNI_ALPHA, /* U+00a1d8: YI SYLLABLE LYRX*/
-                                           RTUNI_ALPHA, /* U+00a1d9: YI SYLLABLE LYR*/
-                                           RTUNI_ALPHA, /* U+00a1da: YI SYLLABLE GIT*/
-                                           RTUNI_ALPHA, /* U+00a1db: YI SYLLABLE GIX*/
-                                           RTUNI_ALPHA, /* U+00a1dc: YI SYLLABLE GI*/
-                                           RTUNI_ALPHA, /* U+00a1dd: YI SYLLABLE GIP*/
-                                           RTUNI_ALPHA, /* U+00a1de: YI SYLLABLE GIET*/
-                                           RTUNI_ALPHA, /* U+00a1df: YI SYLLABLE GIEX*/
-                                           RTUNI_ALPHA, /* U+00a1e0: YI SYLLABLE GIE*/
-                                           RTUNI_ALPHA, /* U+00a1e1: YI SYLLABLE GIEP*/
-                                           RTUNI_ALPHA, /* U+00a1e2: YI SYLLABLE GAT*/
-                                           RTUNI_ALPHA, /* U+00a1e3: YI SYLLABLE GAX*/
-                                           RTUNI_ALPHA, /* U+00a1e4: YI SYLLABLE GA*/
-                                           RTUNI_ALPHA, /* U+00a1e5: YI SYLLABLE GAP*/
-                                           RTUNI_ALPHA, /* U+00a1e6: YI SYLLABLE GUOT*/
-                                           RTUNI_ALPHA, /* U+00a1e7: YI SYLLABLE GUOX*/
-                                           RTUNI_ALPHA, /* U+00a1e8: YI SYLLABLE GUO*/
-                                           RTUNI_ALPHA, /* U+00a1e9: YI SYLLABLE GUOP*/
-                                           RTUNI_ALPHA, /* U+00a1ea: YI SYLLABLE GOT*/
-                                           RTUNI_ALPHA, /* U+00a1eb: YI SYLLABLE GOX*/
-                                           RTUNI_ALPHA, /* U+00a1ec: YI SYLLABLE GO*/
-                                           RTUNI_ALPHA, /* U+00a1ed: YI SYLLABLE GOP*/
-                                           RTUNI_ALPHA, /* U+00a1ee: YI SYLLABLE GET*/
-                                           RTUNI_ALPHA, /* U+00a1ef: YI SYLLABLE GEX*/
-                                           RTUNI_ALPHA, /* U+00a1f0: YI SYLLABLE GE*/
-                                           RTUNI_ALPHA, /* U+00a1f1: YI SYLLABLE GEP*/
-                                           RTUNI_ALPHA, /* U+00a1f2: YI SYLLABLE GUT*/
-                                           RTUNI_ALPHA, /* U+00a1f3: YI SYLLABLE GUX*/
-                                           RTUNI_ALPHA, /* U+00a1f4: YI SYLLABLE GU*/
-                                           RTUNI_ALPHA, /* U+00a1f5: YI SYLLABLE GUP*/
-                                           RTUNI_ALPHA, /* U+00a1f6: YI SYLLABLE GURX*/
-                                           RTUNI_ALPHA, /* U+00a1f7: YI SYLLABLE GUR*/
-                                           RTUNI_ALPHA, /* U+00a1f8: YI SYLLABLE KIT*/
-                                           RTUNI_ALPHA, /* U+00a1f9: YI SYLLABLE KIX*/
-                                           RTUNI_ALPHA, /* U+00a1fa: YI SYLLABLE KI*/
-                                           RTUNI_ALPHA, /* U+00a1fb: YI SYLLABLE KIP*/
-                                           RTUNI_ALPHA, /* U+00a1fc: YI SYLLABLE KIEX*/
-                                           RTUNI_ALPHA, /* U+00a1fd: YI SYLLABLE KIE*/
-                                           RTUNI_ALPHA, /* U+00a1fe: YI SYLLABLE KIEP*/
-                                           RTUNI_ALPHA, /* U+00a1ff: YI SYLLABLE KAT*/
-                                           RTUNI_ALPHA, /* U+00a200: YI SYLLABLE KAX*/
-                                           RTUNI_ALPHA, /* U+00a201: YI SYLLABLE KA*/
-                                           RTUNI_ALPHA, /* U+00a202: YI SYLLABLE KAP*/
-                                           RTUNI_ALPHA, /* U+00a203: YI SYLLABLE KUOX*/
-                                           RTUNI_ALPHA, /* U+00a204: YI SYLLABLE KUO*/
-                                           RTUNI_ALPHA, /* U+00a205: YI SYLLABLE KUOP*/
-                                           RTUNI_ALPHA, /* U+00a206: YI SYLLABLE KOT*/
-                                           RTUNI_ALPHA, /* U+00a207: YI SYLLABLE KOX*/
-                                           RTUNI_ALPHA, /* U+00a208: YI SYLLABLE KO*/
-                                           RTUNI_ALPHA, /* U+00a209: YI SYLLABLE KOP*/
-                                           RTUNI_ALPHA, /* U+00a20a: YI SYLLABLE KET*/
-                                           RTUNI_ALPHA, /* U+00a20b: YI SYLLABLE KEX*/
-                                           RTUNI_ALPHA, /* U+00a20c: YI SYLLABLE KE*/
-                                           RTUNI_ALPHA, /* U+00a20d: YI SYLLABLE KEP*/
-                                           RTUNI_ALPHA, /* U+00a20e: YI SYLLABLE KUT*/
-                                           RTUNI_ALPHA, /* U+00a20f: YI SYLLABLE KUX*/
-                                           RTUNI_ALPHA, /* U+00a210: YI SYLLABLE KU*/
-                                           RTUNI_ALPHA, /* U+00a211: YI SYLLABLE KUP*/
-                                           RTUNI_ALPHA, /* U+00a212: YI SYLLABLE KURX*/
-                                           RTUNI_ALPHA, /* U+00a213: YI SYLLABLE KUR*/
-                                           RTUNI_ALPHA, /* U+00a214: YI SYLLABLE GGIT*/
-                                           RTUNI_ALPHA, /* U+00a215: YI SYLLABLE GGIX*/
-                                           RTUNI_ALPHA, /* U+00a216: YI SYLLABLE GGI*/
-                                           RTUNI_ALPHA, /* U+00a217: YI SYLLABLE GGIEX*/
-                                           RTUNI_ALPHA, /* U+00a218: YI SYLLABLE GGIE*/
-                                           RTUNI_ALPHA, /* U+00a219: YI SYLLABLE GGIEP*/
-                                           RTUNI_ALPHA, /* U+00a21a: YI SYLLABLE GGAT*/
-                                           RTUNI_ALPHA, /* U+00a21b: YI SYLLABLE GGAX*/
-                                           RTUNI_ALPHA, /* U+00a21c: YI SYLLABLE GGA*/
-                                           RTUNI_ALPHA, /* U+00a21d: YI SYLLABLE GGAP*/
-                                           RTUNI_ALPHA, /* U+00a21e: YI SYLLABLE GGUOT*/
-                                           RTUNI_ALPHA, /* U+00a21f: YI SYLLABLE GGUOX*/
-                                           RTUNI_ALPHA, /* U+00a220: YI SYLLABLE GGUO*/
-                                           RTUNI_ALPHA, /* U+00a221: YI SYLLABLE GGUOP*/
-                                           RTUNI_ALPHA, /* U+00a222: YI SYLLABLE GGOT*/
-                                           RTUNI_ALPHA, /* U+00a223: YI SYLLABLE GGOX*/
-                                           RTUNI_ALPHA, /* U+00a224: YI SYLLABLE GGO*/
-                                           RTUNI_ALPHA, /* U+00a225: YI SYLLABLE GGOP*/
-                                           RTUNI_ALPHA, /* U+00a226: YI SYLLABLE GGET*/
-                                           RTUNI_ALPHA, /* U+00a227: YI SYLLABLE GGEX*/
-                                           RTUNI_ALPHA, /* U+00a228: YI SYLLABLE GGE*/
-                                           RTUNI_ALPHA, /* U+00a229: YI SYLLABLE GGEP*/
-                                           RTUNI_ALPHA, /* U+00a22a: YI SYLLABLE GGUT*/
-                                           RTUNI_ALPHA, /* U+00a22b: YI SYLLABLE GGUX*/
-                                           RTUNI_ALPHA, /* U+00a22c: YI SYLLABLE GGU*/
-                                           RTUNI_ALPHA, /* U+00a22d: YI SYLLABLE GGUP*/
-                                           RTUNI_ALPHA, /* U+00a22e: YI SYLLABLE GGURX*/
-                                           RTUNI_ALPHA, /* U+00a22f: YI SYLLABLE GGUR*/
-                                           RTUNI_ALPHA, /* U+00a230: YI SYLLABLE MGIEX*/
-                                           RTUNI_ALPHA, /* U+00a231: YI SYLLABLE MGIE*/
-                                           RTUNI_ALPHA, /* U+00a232: YI SYLLABLE MGAT*/
-                                           RTUNI_ALPHA, /* U+00a233: YI SYLLABLE MGAX*/
-                                           RTUNI_ALPHA, /* U+00a234: YI SYLLABLE MGA*/
-                                           RTUNI_ALPHA, /* U+00a235: YI SYLLABLE MGAP*/
-                                           RTUNI_ALPHA, /* U+00a236: YI SYLLABLE MGUOX*/
-                                           RTUNI_ALPHA, /* U+00a237: YI SYLLABLE MGUO*/
-                                           RTUNI_ALPHA, /* U+00a238: YI SYLLABLE MGUOP*/
-                                           RTUNI_ALPHA, /* U+00a239: YI SYLLABLE MGOT*/
-                                           RTUNI_ALPHA, /* U+00a23a: YI SYLLABLE MGOX*/
-                                           RTUNI_ALPHA, /* U+00a23b: YI SYLLABLE MGO*/
-                                           RTUNI_ALPHA, /* U+00a23c: YI SYLLABLE MGOP*/
-                                           RTUNI_ALPHA, /* U+00a23d: YI SYLLABLE MGEX*/
-                                           RTUNI_ALPHA, /* U+00a23e: YI SYLLABLE MGE*/
-                                           RTUNI_ALPHA, /* U+00a23f: YI SYLLABLE MGEP*/
-                                           RTUNI_ALPHA, /* U+00a240: YI SYLLABLE MGUT*/
-                                           RTUNI_ALPHA, /* U+00a241: YI SYLLABLE MGUX*/
-                                           RTUNI_ALPHA, /* U+00a242: YI SYLLABLE MGU*/
-                                           RTUNI_ALPHA, /* U+00a243: YI SYLLABLE MGUP*/
-                                           RTUNI_ALPHA, /* U+00a244: YI SYLLABLE MGURX*/
-                                           RTUNI_ALPHA, /* U+00a245: YI SYLLABLE MGUR*/
-                                           RTUNI_ALPHA, /* U+00a246: YI SYLLABLE HXIT*/
-                                           RTUNI_ALPHA, /* U+00a247: YI SYLLABLE HXIX*/
-                                           RTUNI_ALPHA, /* U+00a248: YI SYLLABLE HXI*/
-                                           RTUNI_ALPHA, /* U+00a249: YI SYLLABLE HXIP*/
-                                           RTUNI_ALPHA, /* U+00a24a: YI SYLLABLE HXIET*/
-                                           RTUNI_ALPHA, /* U+00a24b: YI SYLLABLE HXIEX*/
-                                           RTUNI_ALPHA, /* U+00a24c: YI SYLLABLE HXIE*/
-                                           RTUNI_ALPHA, /* U+00a24d: YI SYLLABLE HXIEP*/
-                                           RTUNI_ALPHA, /* U+00a24e: YI SYLLABLE HXAT*/
-                                           RTUNI_ALPHA, /* U+00a24f: YI SYLLABLE HXAX*/
-                                           RTUNI_ALPHA, /* U+00a250: YI SYLLABLE HXA*/
-                                           RTUNI_ALPHA, /* U+00a251: YI SYLLABLE HXAP*/
-                                           RTUNI_ALPHA, /* U+00a252: YI SYLLABLE HXUOT*/
-                                           RTUNI_ALPHA, /* U+00a253: YI SYLLABLE HXUOX*/
-                                           RTUNI_ALPHA, /* U+00a254: YI SYLLABLE HXUO*/
-                                           RTUNI_ALPHA, /* U+00a255: YI SYLLABLE HXUOP*/
-                                           RTUNI_ALPHA, /* U+00a256: YI SYLLABLE HXOT*/
-                                           RTUNI_ALPHA, /* U+00a257: YI SYLLABLE HXOX*/
-                                           RTUNI_ALPHA, /* U+00a258: YI SYLLABLE HXO*/
-                                           RTUNI_ALPHA, /* U+00a259: YI SYLLABLE HXOP*/
-                                           RTUNI_ALPHA, /* U+00a25a: YI SYLLABLE HXEX*/
-                                           RTUNI_ALPHA, /* U+00a25b: YI SYLLABLE HXE*/
-                                           RTUNI_ALPHA, /* U+00a25c: YI SYLLABLE HXEP*/
-                                           RTUNI_ALPHA, /* U+00a25d: YI SYLLABLE NGIEX*/
-                                           RTUNI_ALPHA, /* U+00a25e: YI SYLLABLE NGIE*/
-                                           RTUNI_ALPHA, /* U+00a25f: YI SYLLABLE NGIEP*/
-                                           RTUNI_ALPHA, /* U+00a260: YI SYLLABLE NGAT*/
-                                           RTUNI_ALPHA, /* U+00a261: YI SYLLABLE NGAX*/
-                                           RTUNI_ALPHA, /* U+00a262: YI SYLLABLE NGA*/
-                                           RTUNI_ALPHA, /* U+00a263: YI SYLLABLE NGAP*/
-                                           RTUNI_ALPHA, /* U+00a264: YI SYLLABLE NGUOT*/
-                                           RTUNI_ALPHA, /* U+00a265: YI SYLLABLE NGUOX*/
-                                           RTUNI_ALPHA, /* U+00a266: YI SYLLABLE NGUO*/
-                                           RTUNI_ALPHA, /* U+00a267: YI SYLLABLE NGOT*/
-                                           RTUNI_ALPHA, /* U+00a268: YI SYLLABLE NGOX*/
-                                           RTUNI_ALPHA, /* U+00a269: YI SYLLABLE NGO*/
-                                           RTUNI_ALPHA, /* U+00a26a: YI SYLLABLE NGOP*/
-                                           RTUNI_ALPHA, /* U+00a26b: YI SYLLABLE NGEX*/
-                                           RTUNI_ALPHA, /* U+00a26c: YI SYLLABLE NGE*/
-                                           RTUNI_ALPHA, /* U+00a26d: YI SYLLABLE NGEP*/
-                                           RTUNI_ALPHA, /* U+00a26e: YI SYLLABLE HIT*/
-                                           RTUNI_ALPHA, /* U+00a26f: YI SYLLABLE HIEX*/
-                                           RTUNI_ALPHA, /* U+00a270: YI SYLLABLE HIE*/
-                                           RTUNI_ALPHA, /* U+00a271: YI SYLLABLE HAT*/
-                                           RTUNI_ALPHA, /* U+00a272: YI SYLLABLE HAX*/
-                                           RTUNI_ALPHA, /* U+00a273: YI SYLLABLE HA*/
-                                           RTUNI_ALPHA, /* U+00a274: YI SYLLABLE HAP*/
-                                           RTUNI_ALPHA, /* U+00a275: YI SYLLABLE HUOT*/
-                                           RTUNI_ALPHA, /* U+00a276: YI SYLLABLE HUOX*/
-                                           RTUNI_ALPHA, /* U+00a277: YI SYLLABLE HUO*/
-                                           RTUNI_ALPHA, /* U+00a278: YI SYLLABLE HUOP*/
-                                           RTUNI_ALPHA, /* U+00a279: YI SYLLABLE HOT*/
-                                           RTUNI_ALPHA, /* U+00a27a: YI SYLLABLE HOX*/
-                                           RTUNI_ALPHA, /* U+00a27b: YI SYLLABLE HO*/
-                                           RTUNI_ALPHA, /* U+00a27c: YI SYLLABLE HOP*/
-                                           RTUNI_ALPHA, /* U+00a27d: YI SYLLABLE HEX*/
-                                           RTUNI_ALPHA, /* U+00a27e: YI SYLLABLE HE*/
-                                           RTUNI_ALPHA, /* U+00a27f: YI SYLLABLE HEP*/
-                                           RTUNI_ALPHA, /* U+00a280: YI SYLLABLE WAT*/
-                                           RTUNI_ALPHA, /* U+00a281: YI SYLLABLE WAX*/
-                                           RTUNI_ALPHA, /* U+00a282: YI SYLLABLE WA*/
-                                           RTUNI_ALPHA, /* U+00a283: YI SYLLABLE WAP*/
-                                           RTUNI_ALPHA, /* U+00a284: YI SYLLABLE WUOX*/
-                                           RTUNI_ALPHA, /* U+00a285: YI SYLLABLE WUO*/
-                                           RTUNI_ALPHA, /* U+00a286: YI SYLLABLE WUOP*/
-                                           RTUNI_ALPHA, /* U+00a287: YI SYLLABLE WOX*/
-                                           RTUNI_ALPHA, /* U+00a288: YI SYLLABLE WO*/
-                                           RTUNI_ALPHA, /* U+00a289: YI SYLLABLE WOP*/
-                                           RTUNI_ALPHA, /* U+00a28a: YI SYLLABLE WEX*/
-                                           RTUNI_ALPHA, /* U+00a28b: YI SYLLABLE WE*/
-                                           RTUNI_ALPHA, /* U+00a28c: YI SYLLABLE WEP*/
-                                           RTUNI_ALPHA, /* U+00a28d: YI SYLLABLE ZIT*/
-                                           RTUNI_ALPHA, /* U+00a28e: YI SYLLABLE ZIX*/
-                                           RTUNI_ALPHA, /* U+00a28f: YI SYLLABLE ZI*/
-                                           RTUNI_ALPHA, /* U+00a290: YI SYLLABLE ZIP*/
-                                           RTUNI_ALPHA, /* U+00a291: YI SYLLABLE ZIEX*/
-                                           RTUNI_ALPHA, /* U+00a292: YI SYLLABLE ZIE*/
-                                           RTUNI_ALPHA, /* U+00a293: YI SYLLABLE ZIEP*/
-                                           RTUNI_ALPHA, /* U+00a294: YI SYLLABLE ZAT*/
-                                           RTUNI_ALPHA, /* U+00a295: YI SYLLABLE ZAX*/
-                                           RTUNI_ALPHA, /* U+00a296: YI SYLLABLE ZA*/
-                                           RTUNI_ALPHA, /* U+00a297: YI SYLLABLE ZAP*/
-                                           RTUNI_ALPHA, /* U+00a298: YI SYLLABLE ZUOX*/
-                                           RTUNI_ALPHA, /* U+00a299: YI SYLLABLE ZUO*/
-                                           RTUNI_ALPHA, /* U+00a29a: YI SYLLABLE ZUOP*/
-                                           RTUNI_ALPHA, /* U+00a29b: YI SYLLABLE ZOT*/
-                                           RTUNI_ALPHA, /* U+00a29c: YI SYLLABLE ZOX*/
-                                           RTUNI_ALPHA, /* U+00a29d: YI SYLLABLE ZO*/
-                                           RTUNI_ALPHA, /* U+00a29e: YI SYLLABLE ZOP*/
-                                           RTUNI_ALPHA, /* U+00a29f: YI SYLLABLE ZEX*/
-                                           RTUNI_ALPHA, /* U+00a2a0: YI SYLLABLE ZE*/
-                                           RTUNI_ALPHA, /* U+00a2a1: YI SYLLABLE ZEP*/
-                                           RTUNI_ALPHA, /* U+00a2a2: YI SYLLABLE ZUT*/
-                                           RTUNI_ALPHA, /* U+00a2a3: YI SYLLABLE ZUX*/
-                                           RTUNI_ALPHA, /* U+00a2a4: YI SYLLABLE ZU*/
-                                           RTUNI_ALPHA, /* U+00a2a5: YI SYLLABLE ZUP*/
-                                           RTUNI_ALPHA, /* U+00a2a6: YI SYLLABLE ZURX*/
-                                           RTUNI_ALPHA, /* U+00a2a7: YI SYLLABLE ZUR*/
-                                           RTUNI_ALPHA, /* U+00a2a8: YI SYLLABLE ZYT*/
-                                           RTUNI_ALPHA, /* U+00a2a9: YI SYLLABLE ZYX*/
-                                           RTUNI_ALPHA, /* U+00a2aa: YI SYLLABLE ZY*/
-                                           RTUNI_ALPHA, /* U+00a2ab: YI SYLLABLE ZYP*/
-                                           RTUNI_ALPHA, /* U+00a2ac: YI SYLLABLE ZYRX*/
-                                           RTUNI_ALPHA, /* U+00a2ad: YI SYLLABLE ZYR*/
-                                           RTUNI_ALPHA, /* U+00a2ae: YI SYLLABLE CIT*/
-                                           RTUNI_ALPHA, /* U+00a2af: YI SYLLABLE CIX*/
-                                           RTUNI_ALPHA, /* U+00a2b0: YI SYLLABLE CI*/
-                                           RTUNI_ALPHA, /* U+00a2b1: YI SYLLABLE CIP*/
-                                           RTUNI_ALPHA, /* U+00a2b2: YI SYLLABLE CIET*/
-                                           RTUNI_ALPHA, /* U+00a2b3: YI SYLLABLE CIEX*/
-                                           RTUNI_ALPHA, /* U+00a2b4: YI SYLLABLE CIE*/
-                                           RTUNI_ALPHA, /* U+00a2b5: YI SYLLABLE CIEP*/
-                                           RTUNI_ALPHA, /* U+00a2b6: YI SYLLABLE CAT*/
-                                           RTUNI_ALPHA, /* U+00a2b7: YI SYLLABLE CAX*/
-                                           RTUNI_ALPHA, /* U+00a2b8: YI SYLLABLE CA*/
-                                           RTUNI_ALPHA, /* U+00a2b9: YI SYLLABLE CAP*/
-                                           RTUNI_ALPHA, /* U+00a2ba: YI SYLLABLE CUOX*/
-                                           RTUNI_ALPHA, /* U+00a2bb: YI SYLLABLE CUO*/
-                                           RTUNI_ALPHA, /* U+00a2bc: YI SYLLABLE CUOP*/
-                                           RTUNI_ALPHA, /* U+00a2bd: YI SYLLABLE COT*/
-                                           RTUNI_ALPHA, /* U+00a2be: YI SYLLABLE COX*/
-                                           RTUNI_ALPHA, /* U+00a2bf: YI SYLLABLE CO*/
-                                           RTUNI_ALPHA, /* U+00a2c0: YI SYLLABLE COP*/
-                                           RTUNI_ALPHA, /* U+00a2c1: YI SYLLABLE CEX*/
-                                           RTUNI_ALPHA, /* U+00a2c2: YI SYLLABLE CE*/
-                                           RTUNI_ALPHA, /* U+00a2c3: YI SYLLABLE CEP*/
-                                           RTUNI_ALPHA, /* U+00a2c4: YI SYLLABLE CUT*/
-                                           RTUNI_ALPHA, /* U+00a2c5: YI SYLLABLE CUX*/
-                                           RTUNI_ALPHA, /* U+00a2c6: YI SYLLABLE CU*/
-                                           RTUNI_ALPHA, /* U+00a2c7: YI SYLLABLE CUP*/
-                                           RTUNI_ALPHA, /* U+00a2c8: YI SYLLABLE CURX*/
-                                           RTUNI_ALPHA, /* U+00a2c9: YI SYLLABLE CUR*/
-                                           RTUNI_ALPHA, /* U+00a2ca: YI SYLLABLE CYT*/
-                                           RTUNI_ALPHA, /* U+00a2cb: YI SYLLABLE CYX*/
-                                           RTUNI_ALPHA, /* U+00a2cc: YI SYLLABLE CY*/
-                                           RTUNI_ALPHA, /* U+00a2cd: YI SYLLABLE CYP*/
-                                           RTUNI_ALPHA, /* U+00a2ce: YI SYLLABLE CYRX*/
-                                           RTUNI_ALPHA, /* U+00a2cf: YI SYLLABLE CYR*/
-                                           RTUNI_ALPHA, /* U+00a2d0: YI SYLLABLE ZZIT*/
-                                           RTUNI_ALPHA, /* U+00a2d1: YI SYLLABLE ZZIX*/
-                                           RTUNI_ALPHA, /* U+00a2d2: YI SYLLABLE ZZI*/
-                                           RTUNI_ALPHA, /* U+00a2d3: YI SYLLABLE ZZIP*/
-                                           RTUNI_ALPHA, /* U+00a2d4: YI SYLLABLE ZZIET*/
-                                           RTUNI_ALPHA, /* U+00a2d5: YI SYLLABLE ZZIEX*/
-                                           RTUNI_ALPHA, /* U+00a2d6: YI SYLLABLE ZZIE*/
-                                           RTUNI_ALPHA, /* U+00a2d7: YI SYLLABLE ZZIEP*/
-                                           RTUNI_ALPHA, /* U+00a2d8: YI SYLLABLE ZZAT*/
-                                           RTUNI_ALPHA, /* U+00a2d9: YI SYLLABLE ZZAX*/
-                                           RTUNI_ALPHA, /* U+00a2da: YI SYLLABLE ZZA*/
-                                           RTUNI_ALPHA, /* U+00a2db: YI SYLLABLE ZZAP*/
-                                           RTUNI_ALPHA, /* U+00a2dc: YI SYLLABLE ZZOX*/
-                                           RTUNI_ALPHA, /* U+00a2dd: YI SYLLABLE ZZO*/
-                                           RTUNI_ALPHA, /* U+00a2de: YI SYLLABLE ZZOP*/
-                                           RTUNI_ALPHA, /* U+00a2df: YI SYLLABLE ZZEX*/
-                                           RTUNI_ALPHA, /* U+00a2e0: YI SYLLABLE ZZE*/
-                                           RTUNI_ALPHA, /* U+00a2e1: YI SYLLABLE ZZEP*/
-                                           RTUNI_ALPHA, /* U+00a2e2: YI SYLLABLE ZZUX*/
-                                           RTUNI_ALPHA, /* U+00a2e3: YI SYLLABLE ZZU*/
-                                           RTUNI_ALPHA, /* U+00a2e4: YI SYLLABLE ZZUP*/
-                                           RTUNI_ALPHA, /* U+00a2e5: YI SYLLABLE ZZURX*/
-                                           RTUNI_ALPHA, /* U+00a2e6: YI SYLLABLE ZZUR*/
-                                           RTUNI_ALPHA, /* U+00a2e7: YI SYLLABLE ZZYT*/
-                                           RTUNI_ALPHA, /* U+00a2e8: YI SYLLABLE ZZYX*/
-                                           RTUNI_ALPHA, /* U+00a2e9: YI SYLLABLE ZZY*/
-                                           RTUNI_ALPHA, /* U+00a2ea: YI SYLLABLE ZZYP*/
-                                           RTUNI_ALPHA, /* U+00a2eb: YI SYLLABLE ZZYRX*/
-                                           RTUNI_ALPHA, /* U+00a2ec: YI SYLLABLE ZZYR*/
-                                           RTUNI_ALPHA, /* U+00a2ed: YI SYLLABLE NZIT*/
-                                           RTUNI_ALPHA, /* U+00a2ee: YI SYLLABLE NZIX*/
-                                           RTUNI_ALPHA, /* U+00a2ef: YI SYLLABLE NZI*/
-                                           RTUNI_ALPHA, /* U+00a2f0: YI SYLLABLE NZIP*/
-                                           RTUNI_ALPHA, /* U+00a2f1: YI SYLLABLE NZIEX*/
-                                           RTUNI_ALPHA, /* U+00a2f2: YI SYLLABLE NZIE*/
-                                           RTUNI_ALPHA, /* U+00a2f3: YI SYLLABLE NZIEP*/
-                                           RTUNI_ALPHA, /* U+00a2f4: YI SYLLABLE NZAT*/
-                                           RTUNI_ALPHA, /* U+00a2f5: YI SYLLABLE NZAX*/
-                                           RTUNI_ALPHA, /* U+00a2f6: YI SYLLABLE NZA*/
-                                           RTUNI_ALPHA, /* U+00a2f7: YI SYLLABLE NZAP*/
-                                           RTUNI_ALPHA, /* U+00a2f8: YI SYLLABLE NZUOX*/
-                                           RTUNI_ALPHA, /* U+00a2f9: YI SYLLABLE NZUO*/
-                                           RTUNI_ALPHA, /* U+00a2fa: YI SYLLABLE NZOX*/
-                                           RTUNI_ALPHA, /* U+00a2fb: YI SYLLABLE NZOP*/
-                                           RTUNI_ALPHA, /* U+00a2fc: YI SYLLABLE NZEX*/
-                                           RTUNI_ALPHA, /* U+00a2fd: YI SYLLABLE NZE*/
-                                           RTUNI_ALPHA, /* U+00a2fe: YI SYLLABLE NZUX*/
-                                           RTUNI_ALPHA, /* U+00a2ff: YI SYLLABLE NZU*/
-                                           RTUNI_ALPHA, /* U+00a300: YI SYLLABLE NZUP*/
-                                           RTUNI_ALPHA, /* U+00a301: YI SYLLABLE NZURX*/
-                                           RTUNI_ALPHA, /* U+00a302: YI SYLLABLE NZUR*/
-                                           RTUNI_ALPHA, /* U+00a303: YI SYLLABLE NZYT*/
-                                           RTUNI_ALPHA, /* U+00a304: YI SYLLABLE NZYX*/
-                                           RTUNI_ALPHA, /* U+00a305: YI SYLLABLE NZY*/
-                                           RTUNI_ALPHA, /* U+00a306: YI SYLLABLE NZYP*/
-                                           RTUNI_ALPHA, /* U+00a307: YI SYLLABLE NZYRX*/
-                                           RTUNI_ALPHA, /* U+00a308: YI SYLLABLE NZYR*/
-                                           RTUNI_ALPHA, /* U+00a309: YI SYLLABLE SIT*/
-                                           RTUNI_ALPHA, /* U+00a30a: YI SYLLABLE SIX*/
-                                           RTUNI_ALPHA, /* U+00a30b: YI SYLLABLE SI*/
-                                           RTUNI_ALPHA, /* U+00a30c: YI SYLLABLE SIP*/
-                                           RTUNI_ALPHA, /* U+00a30d: YI SYLLABLE SIEX*/
-                                           RTUNI_ALPHA, /* U+00a30e: YI SYLLABLE SIE*/
-                                           RTUNI_ALPHA, /* U+00a30f: YI SYLLABLE SIEP*/
-                                           RTUNI_ALPHA, /* U+00a310: YI SYLLABLE SAT*/
-                                           RTUNI_ALPHA, /* U+00a311: YI SYLLABLE SAX*/
-                                           RTUNI_ALPHA, /* U+00a312: YI SYLLABLE SA*/
-                                           RTUNI_ALPHA, /* U+00a313: YI SYLLABLE SAP*/
-                                           RTUNI_ALPHA, /* U+00a314: YI SYLLABLE SUOX*/
-                                           RTUNI_ALPHA, /* U+00a315: YI SYLLABLE SUO*/
-                                           RTUNI_ALPHA, /* U+00a316: YI SYLLABLE SUOP*/
-                                           RTUNI_ALPHA, /* U+00a317: YI SYLLABLE SOT*/
-                                           RTUNI_ALPHA, /* U+00a318: YI SYLLABLE SOX*/
-                                           RTUNI_ALPHA, /* U+00a319: YI SYLLABLE SO*/
-                                           RTUNI_ALPHA, /* U+00a31a: YI SYLLABLE SOP*/
-                                           RTUNI_ALPHA, /* U+00a31b: YI SYLLABLE SEX*/
-                                           RTUNI_ALPHA, /* U+00a31c: YI SYLLABLE SE*/
-                                           RTUNI_ALPHA, /* U+00a31d: YI SYLLABLE SEP*/
-                                           RTUNI_ALPHA, /* U+00a31e: YI SYLLABLE SUT*/
-                                           RTUNI_ALPHA, /* U+00a31f: YI SYLLABLE SUX*/
-                                           RTUNI_ALPHA, /* U+00a320: YI SYLLABLE SU*/
-                                           RTUNI_ALPHA, /* U+00a321: YI SYLLABLE SUP*/
-                                           RTUNI_ALPHA, /* U+00a322: YI SYLLABLE SURX*/
-                                           RTUNI_ALPHA, /* U+00a323: YI SYLLABLE SUR*/
-                                           RTUNI_ALPHA, /* U+00a324: YI SYLLABLE SYT*/
-                                           RTUNI_ALPHA, /* U+00a325: YI SYLLABLE SYX*/
-                                           RTUNI_ALPHA, /* U+00a326: YI SYLLABLE SY*/
-                                           RTUNI_ALPHA, /* U+00a327: YI SYLLABLE SYP*/
-                                           RTUNI_ALPHA, /* U+00a328: YI SYLLABLE SYRX*/
-                                           RTUNI_ALPHA, /* U+00a329: YI SYLLABLE SYR*/
-                                           RTUNI_ALPHA, /* U+00a32a: YI SYLLABLE SSIT*/
-                                           RTUNI_ALPHA, /* U+00a32b: YI SYLLABLE SSIX*/
-                                           RTUNI_ALPHA, /* U+00a32c: YI SYLLABLE SSI*/
-                                           RTUNI_ALPHA, /* U+00a32d: YI SYLLABLE SSIP*/
-                                           RTUNI_ALPHA, /* U+00a32e: YI SYLLABLE SSIEX*/
-                                           RTUNI_ALPHA, /* U+00a32f: YI SYLLABLE SSIE*/
-                                           RTUNI_ALPHA, /* U+00a330: YI SYLLABLE SSIEP*/
-                                           RTUNI_ALPHA, /* U+00a331: YI SYLLABLE SSAT*/
-                                           RTUNI_ALPHA, /* U+00a332: YI SYLLABLE SSAX*/
-                                           RTUNI_ALPHA, /* U+00a333: YI SYLLABLE SSA*/
-                                           RTUNI_ALPHA, /* U+00a334: YI SYLLABLE SSAP*/
-                                           RTUNI_ALPHA, /* U+00a335: YI SYLLABLE SSOT*/
-                                           RTUNI_ALPHA, /* U+00a336: YI SYLLABLE SSOX*/
-                                           RTUNI_ALPHA, /* U+00a337: YI SYLLABLE SSO*/
-                                           RTUNI_ALPHA, /* U+00a338: YI SYLLABLE SSOP*/
-                                           RTUNI_ALPHA, /* U+00a339: YI SYLLABLE SSEX*/
-                                           RTUNI_ALPHA, /* U+00a33a: YI SYLLABLE SSE*/
-                                           RTUNI_ALPHA, /* U+00a33b: YI SYLLABLE SSEP*/
-                                           RTUNI_ALPHA, /* U+00a33c: YI SYLLABLE SSUT*/
-                                           RTUNI_ALPHA, /* U+00a33d: YI SYLLABLE SSUX*/
-                                           RTUNI_ALPHA, /* U+00a33e: YI SYLLABLE SSU*/
-                                           RTUNI_ALPHA, /* U+00a33f: YI SYLLABLE SSUP*/
-                                           RTUNI_ALPHA, /* U+00a340: YI SYLLABLE SSYT*/
-                                           RTUNI_ALPHA, /* U+00a341: YI SYLLABLE SSYX*/
-                                           RTUNI_ALPHA, /* U+00a342: YI SYLLABLE SSY*/
-                                           RTUNI_ALPHA, /* U+00a343: YI SYLLABLE SSYP*/
-                                           RTUNI_ALPHA, /* U+00a344: YI SYLLABLE SSYRX*/
-                                           RTUNI_ALPHA, /* U+00a345: YI SYLLABLE SSYR*/
-                                           RTUNI_ALPHA, /* U+00a346: YI SYLLABLE ZHAT*/
-                                           RTUNI_ALPHA, /* U+00a347: YI SYLLABLE ZHAX*/
-                                           RTUNI_ALPHA, /* U+00a348: YI SYLLABLE ZHA*/
-                                           RTUNI_ALPHA, /* U+00a349: YI SYLLABLE ZHAP*/
-                                           RTUNI_ALPHA, /* U+00a34a: YI SYLLABLE ZHUOX*/
-                                           RTUNI_ALPHA, /* U+00a34b: YI SYLLABLE ZHUO*/
-                                           RTUNI_ALPHA, /* U+00a34c: YI SYLLABLE ZHUOP*/
-                                           RTUNI_ALPHA, /* U+00a34d: YI SYLLABLE ZHOT*/
-                                           RTUNI_ALPHA, /* U+00a34e: YI SYLLABLE ZHOX*/
-                                           RTUNI_ALPHA, /* U+00a34f: YI SYLLABLE ZHO*/
-                                           RTUNI_ALPHA, /* U+00a350: YI SYLLABLE ZHOP*/
-                                           RTUNI_ALPHA, /* U+00a351: YI SYLLABLE ZHET*/
-                                           RTUNI_ALPHA, /* U+00a352: YI SYLLABLE ZHEX*/
-                                           RTUNI_ALPHA, /* U+00a353: YI SYLLABLE ZHE*/
-                                           RTUNI_ALPHA, /* U+00a354: YI SYLLABLE ZHEP*/
-                                           RTUNI_ALPHA, /* U+00a355: YI SYLLABLE ZHUT*/
-                                           RTUNI_ALPHA, /* U+00a356: YI SYLLABLE ZHUX*/
-                                           RTUNI_ALPHA, /* U+00a357: YI SYLLABLE ZHU*/
-                                           RTUNI_ALPHA, /* U+00a358: YI SYLLABLE ZHUP*/
-                                           RTUNI_ALPHA, /* U+00a359: YI SYLLABLE ZHURX*/
-                                           RTUNI_ALPHA, /* U+00a35a: YI SYLLABLE ZHUR*/
-                                           RTUNI_ALPHA, /* U+00a35b: YI SYLLABLE ZHYT*/
-                                           RTUNI_ALPHA, /* U+00a35c: YI SYLLABLE ZHYX*/
-                                           RTUNI_ALPHA, /* U+00a35d: YI SYLLABLE ZHY*/
-                                           RTUNI_ALPHA, /* U+00a35e: YI SYLLABLE ZHYP*/
-                                           RTUNI_ALPHA, /* U+00a35f: YI SYLLABLE ZHYRX*/
-                                           RTUNI_ALPHA, /* U+00a360: YI SYLLABLE ZHYR*/
-                                           RTUNI_ALPHA, /* U+00a361: YI SYLLABLE CHAT*/
-                                           RTUNI_ALPHA, /* U+00a362: YI SYLLABLE CHAX*/
-                                           RTUNI_ALPHA, /* U+00a363: YI SYLLABLE CHA*/
-                                           RTUNI_ALPHA, /* U+00a364: YI SYLLABLE CHAP*/
-                                           RTUNI_ALPHA, /* U+00a365: YI SYLLABLE CHUOT*/
-                                           RTUNI_ALPHA, /* U+00a366: YI SYLLABLE CHUOX*/
-                                           RTUNI_ALPHA, /* U+00a367: YI SYLLABLE CHUO*/
-                                           RTUNI_ALPHA, /* U+00a368: YI SYLLABLE CHUOP*/
-                                           RTUNI_ALPHA, /* U+00a369: YI SYLLABLE CHOT*/
-                                           RTUNI_ALPHA, /* U+00a36a: YI SYLLABLE CHOX*/
-                                           RTUNI_ALPHA, /* U+00a36b: YI SYLLABLE CHO*/
-                                           RTUNI_ALPHA, /* U+00a36c: YI SYLLABLE CHOP*/
-                                           RTUNI_ALPHA, /* U+00a36d: YI SYLLABLE CHET*/
-                                           RTUNI_ALPHA, /* U+00a36e: YI SYLLABLE CHEX*/
-                                           RTUNI_ALPHA, /* U+00a36f: YI SYLLABLE CHE*/
-                                           RTUNI_ALPHA, /* U+00a370: YI SYLLABLE CHEP*/
-                                           RTUNI_ALPHA, /* U+00a371: YI SYLLABLE CHUX*/
-                                           RTUNI_ALPHA, /* U+00a372: YI SYLLABLE CHU*/
-                                           RTUNI_ALPHA, /* U+00a373: YI SYLLABLE CHUP*/
-                                           RTUNI_ALPHA, /* U+00a374: YI SYLLABLE CHURX*/
-                                           RTUNI_ALPHA, /* U+00a375: YI SYLLABLE CHUR*/
-                                           RTUNI_ALPHA, /* U+00a376: YI SYLLABLE CHYT*/
-                                           RTUNI_ALPHA, /* U+00a377: YI SYLLABLE CHYX*/
-                                           RTUNI_ALPHA, /* U+00a378: YI SYLLABLE CHY*/
-                                           RTUNI_ALPHA, /* U+00a379: YI SYLLABLE CHYP*/
-                                           RTUNI_ALPHA, /* U+00a37a: YI SYLLABLE CHYRX*/
-                                           RTUNI_ALPHA, /* U+00a37b: YI SYLLABLE CHYR*/
-                                           RTUNI_ALPHA, /* U+00a37c: YI SYLLABLE RRAX*/
-                                           RTUNI_ALPHA, /* U+00a37d: YI SYLLABLE RRA*/
-                                           RTUNI_ALPHA, /* U+00a37e: YI SYLLABLE RRUOX*/
-                                           RTUNI_ALPHA, /* U+00a37f: YI SYLLABLE RRUO*/
-                                           RTUNI_ALPHA, /* U+00a380: YI SYLLABLE RROT*/
-                                           RTUNI_ALPHA, /* U+00a381: YI SYLLABLE RROX*/
-                                           RTUNI_ALPHA, /* U+00a382: YI SYLLABLE RRO*/
-                                           RTUNI_ALPHA, /* U+00a383: YI SYLLABLE RROP*/
-                                           RTUNI_ALPHA, /* U+00a384: YI SYLLABLE RRET*/
-                                           RTUNI_ALPHA, /* U+00a385: YI SYLLABLE RREX*/
-                                           RTUNI_ALPHA, /* U+00a386: YI SYLLABLE RRE*/
-                                           RTUNI_ALPHA, /* U+00a387: YI SYLLABLE RREP*/
-                                           RTUNI_ALPHA, /* U+00a388: YI SYLLABLE RRUT*/
-                                           RTUNI_ALPHA, /* U+00a389: YI SYLLABLE RRUX*/
-                                           RTUNI_ALPHA, /* U+00a38a: YI SYLLABLE RRU*/
-                                           RTUNI_ALPHA, /* U+00a38b: YI SYLLABLE RRUP*/
-                                           RTUNI_ALPHA, /* U+00a38c: YI SYLLABLE RRURX*/
-                                           RTUNI_ALPHA, /* U+00a38d: YI SYLLABLE RRUR*/
-                                           RTUNI_ALPHA, /* U+00a38e: YI SYLLABLE RRYT*/
-                                           RTUNI_ALPHA, /* U+00a38f: YI SYLLABLE RRYX*/
-                                           RTUNI_ALPHA, /* U+00a390: YI SYLLABLE RRY*/
-                                           RTUNI_ALPHA, /* U+00a391: YI SYLLABLE RRYP*/
-                                           RTUNI_ALPHA, /* U+00a392: YI SYLLABLE RRYRX*/
-                                           RTUNI_ALPHA, /* U+00a393: YI SYLLABLE RRYR*/
-                                           RTUNI_ALPHA, /* U+00a394: YI SYLLABLE NRAT*/
-                                           RTUNI_ALPHA, /* U+00a395: YI SYLLABLE NRAX*/
-                                           RTUNI_ALPHA, /* U+00a396: YI SYLLABLE NRA*/
-                                           RTUNI_ALPHA, /* U+00a397: YI SYLLABLE NRAP*/
-                                           RTUNI_ALPHA, /* U+00a398: YI SYLLABLE NROX*/
-                                           RTUNI_ALPHA, /* U+00a399: YI SYLLABLE NRO*/
-                                           RTUNI_ALPHA, /* U+00a39a: YI SYLLABLE NROP*/
-                                           RTUNI_ALPHA, /* U+00a39b: YI SYLLABLE NRET*/
-                                           RTUNI_ALPHA, /* U+00a39c: YI SYLLABLE NREX*/
-                                           RTUNI_ALPHA, /* U+00a39d: YI SYLLABLE NRE*/
-                                           RTUNI_ALPHA, /* U+00a39e: YI SYLLABLE NREP*/
-                                           RTUNI_ALPHA, /* U+00a39f: YI SYLLABLE NRUT*/
-                                           RTUNI_ALPHA, /* U+00a3a0: YI SYLLABLE NRUX*/
-                                           RTUNI_ALPHA, /* U+00a3a1: YI SYLLABLE NRU*/
-                                           RTUNI_ALPHA, /* U+00a3a2: YI SYLLABLE NRUP*/
-                                           RTUNI_ALPHA, /* U+00a3a3: YI SYLLABLE NRURX*/
-                                           RTUNI_ALPHA, /* U+00a3a4: YI SYLLABLE NRUR*/
-                                           RTUNI_ALPHA, /* U+00a3a5: YI SYLLABLE NRYT*/
-                                           RTUNI_ALPHA, /* U+00a3a6: YI SYLLABLE NRYX*/
-                                           RTUNI_ALPHA, /* U+00a3a7: YI SYLLABLE NRY*/
-                                           RTUNI_ALPHA, /* U+00a3a8: YI SYLLABLE NRYP*/
-                                           RTUNI_ALPHA, /* U+00a3a9: YI SYLLABLE NRYRX*/
-                                           RTUNI_ALPHA, /* U+00a3aa: YI SYLLABLE NRYR*/
-                                           RTUNI_ALPHA, /* U+00a3ab: YI SYLLABLE SHAT*/
-                                           RTUNI_ALPHA, /* U+00a3ac: YI SYLLABLE SHAX*/
-                                           RTUNI_ALPHA, /* U+00a3ad: YI SYLLABLE SHA*/
-                                           RTUNI_ALPHA, /* U+00a3ae: YI SYLLABLE SHAP*/
-                                           RTUNI_ALPHA, /* U+00a3af: YI SYLLABLE SHUOX*/
-                                           RTUNI_ALPHA, /* U+00a3b0: YI SYLLABLE SHUO*/
-                                           RTUNI_ALPHA, /* U+00a3b1: YI SYLLABLE SHUOP*/
-                                           RTUNI_ALPHA, /* U+00a3b2: YI SYLLABLE SHOT*/
-                                           RTUNI_ALPHA, /* U+00a3b3: YI SYLLABLE SHOX*/
-                                           RTUNI_ALPHA, /* U+00a3b4: YI SYLLABLE SHO*/
-                                           RTUNI_ALPHA, /* U+00a3b5: YI SYLLABLE SHOP*/
-                                           RTUNI_ALPHA, /* U+00a3b6: YI SYLLABLE SHET*/
-                                           RTUNI_ALPHA, /* U+00a3b7: YI SYLLABLE SHEX*/
-                                           RTUNI_ALPHA, /* U+00a3b8: YI SYLLABLE SHE*/
-                                           RTUNI_ALPHA, /* U+00a3b9: YI SYLLABLE SHEP*/
-                                           RTUNI_ALPHA, /* U+00a3ba: YI SYLLABLE SHUT*/
-                                           RTUNI_ALPHA, /* U+00a3bb: YI SYLLABLE SHUX*/
-                                           RTUNI_ALPHA, /* U+00a3bc: YI SYLLABLE SHU*/
-                                           RTUNI_ALPHA, /* U+00a3bd: YI SYLLABLE SHUP*/
-                                           RTUNI_ALPHA, /* U+00a3be: YI SYLLABLE SHURX*/
-                                           RTUNI_ALPHA, /* U+00a3bf: YI SYLLABLE SHUR*/
-                                           RTUNI_ALPHA, /* U+00a3c0: YI SYLLABLE SHYT*/
-                                           RTUNI_ALPHA, /* U+00a3c1: YI SYLLABLE SHYX*/
-                                           RTUNI_ALPHA, /* U+00a3c2: YI SYLLABLE SHY*/
-                                           RTUNI_ALPHA, /* U+00a3c3: YI SYLLABLE SHYP*/
-                                           RTUNI_ALPHA, /* U+00a3c4: YI SYLLABLE SHYRX*/
-                                           RTUNI_ALPHA, /* U+00a3c5: YI SYLLABLE SHYR*/
-                                           RTUNI_ALPHA, /* U+00a3c6: YI SYLLABLE RAT*/
-                                           RTUNI_ALPHA, /* U+00a3c7: YI SYLLABLE RAX*/
-                                           RTUNI_ALPHA, /* U+00a3c8: YI SYLLABLE RA*/
-                                           RTUNI_ALPHA, /* U+00a3c9: YI SYLLABLE RAP*/
-                                           RTUNI_ALPHA, /* U+00a3ca: YI SYLLABLE RUOX*/
-                                           RTUNI_ALPHA, /* U+00a3cb: YI SYLLABLE RUO*/
-                                           RTUNI_ALPHA, /* U+00a3cc: YI SYLLABLE RUOP*/
-                                           RTUNI_ALPHA, /* U+00a3cd: YI SYLLABLE ROT*/
-                                           RTUNI_ALPHA, /* U+00a3ce: YI SYLLABLE ROX*/
-                                           RTUNI_ALPHA, /* U+00a3cf: YI SYLLABLE RO*/
-                                           RTUNI_ALPHA, /* U+00a3d0: YI SYLLABLE ROP*/
-                                           RTUNI_ALPHA, /* U+00a3d1: YI SYLLABLE REX*/
-                                           RTUNI_ALPHA, /* U+00a3d2: YI SYLLABLE RE*/
-                                           RTUNI_ALPHA, /* U+00a3d3: YI SYLLABLE REP*/
-                                           RTUNI_ALPHA, /* U+00a3d4: YI SYLLABLE RUT*/
-                                           RTUNI_ALPHA, /* U+00a3d5: YI SYLLABLE RUX*/
-                                           RTUNI_ALPHA, /* U+00a3d6: YI SYLLABLE RU*/
-                                           RTUNI_ALPHA, /* U+00a3d7: YI SYLLABLE RUP*/
-                                           RTUNI_ALPHA, /* U+00a3d8: YI SYLLABLE RURX*/
-                                           RTUNI_ALPHA, /* U+00a3d9: YI SYLLABLE RUR*/
-                                           RTUNI_ALPHA, /* U+00a3da: YI SYLLABLE RYT*/
-                                           RTUNI_ALPHA, /* U+00a3db: YI SYLLABLE RYX*/
-                                           RTUNI_ALPHA, /* U+00a3dc: YI SYLLABLE RY*/
-                                           RTUNI_ALPHA, /* U+00a3dd: YI SYLLABLE RYP*/
-                                           RTUNI_ALPHA, /* U+00a3de: YI SYLLABLE RYRX*/
-                                           RTUNI_ALPHA, /* U+00a3df: YI SYLLABLE RYR*/
-                                           RTUNI_ALPHA, /* U+00a3e0: YI SYLLABLE JIT*/
-                                           RTUNI_ALPHA, /* U+00a3e1: YI SYLLABLE JIX*/
-                                           RTUNI_ALPHA, /* U+00a3e2: YI SYLLABLE JI*/
-                                           RTUNI_ALPHA, /* U+00a3e3: YI SYLLABLE JIP*/
-                                           RTUNI_ALPHA, /* U+00a3e4: YI SYLLABLE JIET*/
-                                           RTUNI_ALPHA, /* U+00a3e5: YI SYLLABLE JIEX*/
-                                           RTUNI_ALPHA, /* U+00a3e6: YI SYLLABLE JIE*/
-                                           RTUNI_ALPHA, /* U+00a3e7: YI SYLLABLE JIEP*/
-                                           RTUNI_ALPHA, /* U+00a3e8: YI SYLLABLE JUOT*/
-                                           RTUNI_ALPHA, /* U+00a3e9: YI SYLLABLE JUOX*/
-                                           RTUNI_ALPHA, /* U+00a3ea: YI SYLLABLE JUO*/
-                                           RTUNI_ALPHA, /* U+00a3eb: YI SYLLABLE JUOP*/
-                                           RTUNI_ALPHA, /* U+00a3ec: YI SYLLABLE JOT*/
-                                           RTUNI_ALPHA, /* U+00a3ed: YI SYLLABLE JOX*/
-                                           RTUNI_ALPHA, /* U+00a3ee: YI SYLLABLE JO*/
-                                           RTUNI_ALPHA, /* U+00a3ef: YI SYLLABLE JOP*/
-                                           RTUNI_ALPHA, /* U+00a3f0: YI SYLLABLE JUT*/
-                                           RTUNI_ALPHA, /* U+00a3f1: YI SYLLABLE JUX*/
-                                           RTUNI_ALPHA, /* U+00a3f2: YI SYLLABLE JU*/
-                                           RTUNI_ALPHA, /* U+00a3f3: YI SYLLABLE JUP*/
-                                           RTUNI_ALPHA, /* U+00a3f4: YI SYLLABLE JURX*/
-                                           RTUNI_ALPHA, /* U+00a3f5: YI SYLLABLE JUR*/
-                                           RTUNI_ALPHA, /* U+00a3f6: YI SYLLABLE JYT*/
-                                           RTUNI_ALPHA, /* U+00a3f7: YI SYLLABLE JYX*/
-                                           RTUNI_ALPHA, /* U+00a3f8: YI SYLLABLE JY*/
-                                           RTUNI_ALPHA, /* U+00a3f9: YI SYLLABLE JYP*/
-                                           RTUNI_ALPHA, /* U+00a3fa: YI SYLLABLE JYRX*/
-                                           RTUNI_ALPHA, /* U+00a3fb: YI SYLLABLE JYR*/
-                                           RTUNI_ALPHA, /* U+00a3fc: YI SYLLABLE QIT*/
-                                           RTUNI_ALPHA, /* U+00a3fd: YI SYLLABLE QIX*/
-                                           RTUNI_ALPHA, /* U+00a3fe: YI SYLLABLE QI*/
-                                           RTUNI_ALPHA, /* U+00a3ff: YI SYLLABLE QIP*/
-                                           RTUNI_ALPHA, /* U+00a400: YI SYLLABLE QIET*/
-                                           RTUNI_ALPHA, /* U+00a401: YI SYLLABLE QIEX*/
-                                           RTUNI_ALPHA, /* U+00a402: YI SYLLABLE QIE*/
-                                           RTUNI_ALPHA, /* U+00a403: YI SYLLABLE QIEP*/
-                                           RTUNI_ALPHA, /* U+00a404: YI SYLLABLE QUOT*/
-                                           RTUNI_ALPHA, /* U+00a405: YI SYLLABLE QUOX*/
-                                           RTUNI_ALPHA, /* U+00a406: YI SYLLABLE QUO*/
-                                           RTUNI_ALPHA, /* U+00a407: YI SYLLABLE QUOP*/
-                                           RTUNI_ALPHA, /* U+00a408: YI SYLLABLE QOT*/
-                                           RTUNI_ALPHA, /* U+00a409: YI SYLLABLE QOX*/
-                                           RTUNI_ALPHA, /* U+00a40a: YI SYLLABLE QO*/
-                                           RTUNI_ALPHA, /* U+00a40b: YI SYLLABLE QOP*/
-                                           RTUNI_ALPHA, /* U+00a40c: YI SYLLABLE QUT*/
-                                           RTUNI_ALPHA, /* U+00a40d: YI SYLLABLE QUX*/
-                                           RTUNI_ALPHA, /* U+00a40e: YI SYLLABLE QU*/
-                                           RTUNI_ALPHA, /* U+00a40f: YI SYLLABLE QUP*/
-                                           RTUNI_ALPHA, /* U+00a410: YI SYLLABLE QURX*/
-                                           RTUNI_ALPHA, /* U+00a411: YI SYLLABLE QUR*/
-                                           RTUNI_ALPHA, /* U+00a412: YI SYLLABLE QYT*/
-                                           RTUNI_ALPHA, /* U+00a413: YI SYLLABLE QYX*/
-                                           RTUNI_ALPHA, /* U+00a414: YI SYLLABLE QY*/
-                                           RTUNI_ALPHA, /* U+00a415: YI SYLLABLE QYP*/
-                                           RTUNI_ALPHA, /* U+00a416: YI SYLLABLE QYRX*/
-                                           RTUNI_ALPHA, /* U+00a417: YI SYLLABLE QYR*/
-                                           RTUNI_ALPHA, /* U+00a418: YI SYLLABLE JJIT*/
-                                           RTUNI_ALPHA, /* U+00a419: YI SYLLABLE JJIX*/
-                                           RTUNI_ALPHA, /* U+00a41a: YI SYLLABLE JJI*/
-                                           RTUNI_ALPHA, /* U+00a41b: YI SYLLABLE JJIP*/
-                                           RTUNI_ALPHA, /* U+00a41c: YI SYLLABLE JJIET*/
-                                           RTUNI_ALPHA, /* U+00a41d: YI SYLLABLE JJIEX*/
-                                           RTUNI_ALPHA, /* U+00a41e: YI SYLLABLE JJIE*/
-                                           RTUNI_ALPHA, /* U+00a41f: YI SYLLABLE JJIEP*/
-                                           RTUNI_ALPHA, /* U+00a420: YI SYLLABLE JJUOX*/
-                                           RTUNI_ALPHA, /* U+00a421: YI SYLLABLE JJUO*/
-                                           RTUNI_ALPHA, /* U+00a422: YI SYLLABLE JJUOP*/
-                                           RTUNI_ALPHA, /* U+00a423: YI SYLLABLE JJOT*/
-                                           RTUNI_ALPHA, /* U+00a424: YI SYLLABLE JJOX*/
-                                           RTUNI_ALPHA, /* U+00a425: YI SYLLABLE JJO*/
-                                           RTUNI_ALPHA, /* U+00a426: YI SYLLABLE JJOP*/
-                                           RTUNI_ALPHA, /* U+00a427: YI SYLLABLE JJUT*/
-                                           RTUNI_ALPHA, /* U+00a428: YI SYLLABLE JJUX*/
-                                           RTUNI_ALPHA, /* U+00a429: YI SYLLABLE JJU*/
-                                           RTUNI_ALPHA, /* U+00a42a: YI SYLLABLE JJUP*/
-                                           RTUNI_ALPHA, /* U+00a42b: YI SYLLABLE JJURX*/
-                                           RTUNI_ALPHA, /* U+00a42c: YI SYLLABLE JJUR*/
-                                           RTUNI_ALPHA, /* U+00a42d: YI SYLLABLE JJYT*/
-                                           RTUNI_ALPHA, /* U+00a42e: YI SYLLABLE JJYX*/
-                                           RTUNI_ALPHA, /* U+00a42f: YI SYLLABLE JJY*/
-                                           RTUNI_ALPHA, /* U+00a430: YI SYLLABLE JJYP*/
-                                           RTUNI_ALPHA, /* U+00a431: YI SYLLABLE NJIT*/
-                                           RTUNI_ALPHA, /* U+00a432: YI SYLLABLE NJIX*/
-                                           RTUNI_ALPHA, /* U+00a433: YI SYLLABLE NJI*/
-                                           RTUNI_ALPHA, /* U+00a434: YI SYLLABLE NJIP*/
-                                           RTUNI_ALPHA, /* U+00a435: YI SYLLABLE NJIET*/
-                                           RTUNI_ALPHA, /* U+00a436: YI SYLLABLE NJIEX*/
-                                           RTUNI_ALPHA, /* U+00a437: YI SYLLABLE NJIE*/
-                                           RTUNI_ALPHA, /* U+00a438: YI SYLLABLE NJIEP*/
-                                           RTUNI_ALPHA, /* U+00a439: YI SYLLABLE NJUOX*/
-                                           RTUNI_ALPHA, /* U+00a43a: YI SYLLABLE NJUO*/
-                                           RTUNI_ALPHA, /* U+00a43b: YI SYLLABLE NJOT*/
-                                           RTUNI_ALPHA, /* U+00a43c: YI SYLLABLE NJOX*/
-                                           RTUNI_ALPHA, /* U+00a43d: YI SYLLABLE NJO*/
-                                           RTUNI_ALPHA, /* U+00a43e: YI SYLLABLE NJOP*/
-                                           RTUNI_ALPHA, /* U+00a43f: YI SYLLABLE NJUX*/
-                                           RTUNI_ALPHA, /* U+00a440: YI SYLLABLE NJU*/
-                                           RTUNI_ALPHA, /* U+00a441: YI SYLLABLE NJUP*/
-                                           RTUNI_ALPHA, /* U+00a442: YI SYLLABLE NJURX*/
-                                           RTUNI_ALPHA, /* U+00a443: YI SYLLABLE NJUR*/
-                                           RTUNI_ALPHA, /* U+00a444: YI SYLLABLE NJYT*/
-                                           RTUNI_ALPHA, /* U+00a445: YI SYLLABLE NJYX*/
-                                           RTUNI_ALPHA, /* U+00a446: YI SYLLABLE NJY*/
-                                           RTUNI_ALPHA, /* U+00a447: YI SYLLABLE NJYP*/
-                                           RTUNI_ALPHA, /* U+00a448: YI SYLLABLE NJYRX*/
-                                           RTUNI_ALPHA, /* U+00a449: YI SYLLABLE NJYR*/
-                                           RTUNI_ALPHA, /* U+00a44a: YI SYLLABLE NYIT*/
-                                           RTUNI_ALPHA, /* U+00a44b: YI SYLLABLE NYIX*/
-                                           RTUNI_ALPHA, /* U+00a44c: YI SYLLABLE NYI*/
-                                           RTUNI_ALPHA, /* U+00a44d: YI SYLLABLE NYIP*/
-                                           RTUNI_ALPHA, /* U+00a44e: YI SYLLABLE NYIET*/
-                                           RTUNI_ALPHA, /* U+00a44f: YI SYLLABLE NYIEX*/
-                                           RTUNI_ALPHA, /* U+00a450: YI SYLLABLE NYIE*/
-                                           RTUNI_ALPHA, /* U+00a451: YI SYLLABLE NYIEP*/
-                                           RTUNI_ALPHA, /* U+00a452: YI SYLLABLE NYUOX*/
-                                           RTUNI_ALPHA, /* U+00a453: YI SYLLABLE NYUO*/
-                                           RTUNI_ALPHA, /* U+00a454: YI SYLLABLE NYUOP*/
-                                           RTUNI_ALPHA, /* U+00a455: YI SYLLABLE NYOT*/
-                                           RTUNI_ALPHA, /* U+00a456: YI SYLLABLE NYOX*/
-                                           RTUNI_ALPHA, /* U+00a457: YI SYLLABLE NYO*/
-                                           RTUNI_ALPHA, /* U+00a458: YI SYLLABLE NYOP*/
-                                           RTUNI_ALPHA, /* U+00a459: YI SYLLABLE NYUT*/
-                                           RTUNI_ALPHA, /* U+00a45a: YI SYLLABLE NYUX*/
-                                           RTUNI_ALPHA, /* U+00a45b: YI SYLLABLE NYU*/
-                                           RTUNI_ALPHA, /* U+00a45c: YI SYLLABLE NYUP*/
-                                           RTUNI_ALPHA, /* U+00a45d: YI SYLLABLE XIT*/
-                                           RTUNI_ALPHA, /* U+00a45e: YI SYLLABLE XIX*/
-                                           RTUNI_ALPHA, /* U+00a45f: YI SYLLABLE XI*/
-                                           RTUNI_ALPHA, /* U+00a460: YI SYLLABLE XIP*/
-                                           RTUNI_ALPHA, /* U+00a461: YI SYLLABLE XIET*/
-                                           RTUNI_ALPHA, /* U+00a462: YI SYLLABLE XIEX*/
-                                           RTUNI_ALPHA, /* U+00a463: YI SYLLABLE XIE*/
-                                           RTUNI_ALPHA, /* U+00a464: YI SYLLABLE XIEP*/
-                                           RTUNI_ALPHA, /* U+00a465: YI SYLLABLE XUOX*/
-                                           RTUNI_ALPHA, /* U+00a466: YI SYLLABLE XUO*/
-                                           RTUNI_ALPHA, /* U+00a467: YI SYLLABLE XOT*/
-                                           RTUNI_ALPHA, /* U+00a468: YI SYLLABLE XOX*/
-                                           RTUNI_ALPHA, /* U+00a469: YI SYLLABLE XO*/
-                                           RTUNI_ALPHA, /* U+00a46a: YI SYLLABLE XOP*/
-                                           RTUNI_ALPHA, /* U+00a46b: YI SYLLABLE XYT*/
-                                           RTUNI_ALPHA, /* U+00a46c: YI SYLLABLE XYX*/
-                                           RTUNI_ALPHA, /* U+00a46d: YI SYLLABLE XY*/
-                                           RTUNI_ALPHA, /* U+00a46e: YI SYLLABLE XYP*/
-                                           RTUNI_ALPHA, /* U+00a46f: YI SYLLABLE XYRX*/
-                                           RTUNI_ALPHA, /* U+00a470: YI SYLLABLE XYR*/
-                                           RTUNI_ALPHA, /* U+00a471: YI SYLLABLE YIT*/
-                                           RTUNI_ALPHA, /* U+00a472: YI SYLLABLE YIX*/
-                                           RTUNI_ALPHA, /* U+00a473: YI SYLLABLE YI*/
-                                           RTUNI_ALPHA, /* U+00a474: YI SYLLABLE YIP*/
-                                           RTUNI_ALPHA, /* U+00a475: YI SYLLABLE YIET*/
-                                           RTUNI_ALPHA, /* U+00a476: YI SYLLABLE YIEX*/
-                                           RTUNI_ALPHA, /* U+00a477: YI SYLLABLE YIE*/
-                                           RTUNI_ALPHA, /* U+00a478: YI SYLLABLE YIEP*/
-                                           RTUNI_ALPHA, /* U+00a479: YI SYLLABLE YUOT*/
-                                           RTUNI_ALPHA, /* U+00a47a: YI SYLLABLE YUOX*/
-                                           RTUNI_ALPHA, /* U+00a47b: YI SYLLABLE YUO*/
-                                           RTUNI_ALPHA, /* U+00a47c: YI SYLLABLE YUOP*/
-                                           RTUNI_ALPHA, /* U+00a47d: YI SYLLABLE YOT*/
-                                           RTUNI_ALPHA, /* U+00a47e: YI SYLLABLE YOX*/
-                                           RTUNI_ALPHA, /* U+00a47f: YI SYLLABLE YO*/
-                                           RTUNI_ALPHA, /* U+00a480: YI SYLLABLE YOP*/
-                                           RTUNI_ALPHA, /* U+00a481: YI SYLLABLE YUT*/
-                                           RTUNI_ALPHA, /* U+00a482: YI SYLLABLE YUX*/
-                                           RTUNI_ALPHA, /* U+00a483: YI SYLLABLE YU*/
-                                           RTUNI_ALPHA, /* U+00a484: YI SYLLABLE YUP*/
-                                           RTUNI_ALPHA, /* U+00a485: YI SYLLABLE YURX*/
-                                           RTUNI_ALPHA, /* U+00a486: YI SYLLABLE YUR*/
-                                           RTUNI_ALPHA, /* U+00a487: YI SYLLABLE YYT*/
-                                           RTUNI_ALPHA, /* U+00a488: YI SYLLABLE YYX*/
-                                           RTUNI_ALPHA, /* U+00a489: YI SYLLABLE YY*/
-                                           RTUNI_ALPHA, /* U+00a48a: YI SYLLABLE YYP*/
-                                           RTUNI_ALPHA, /* U+00a48b: YI SYLLABLE YYRX*/
-                                           RTUNI_ALPHA, /* U+00a48c: YI SYLLABLE YYR*/
-                                                     0, /* U+00a48d: */
-                                                     0, /* U+00a48e: */
-                                                     0, /* U+00a48f: */
-                                                     0, /* U+00a490: YI RADICAL QOT*/
-                                                     0, /* U+00a491: YI RADICAL LI*/
-                                                     0, /* U+00a492: YI RADICAL KIT*/
-                                                     0, /* U+00a493: YI RADICAL NYIP*/
-                                                     0, /* U+00a494: YI RADICAL CYP*/
-                                                     0, /* U+00a495: YI RADICAL SSI*/
-                                                     0, /* U+00a496: YI RADICAL GGOP*/
-                                                     0, /* U+00a497: YI RADICAL GEP*/
-                                                     0, /* U+00a498: YI RADICAL MI*/
-                                                     0, /* U+00a499: YI RADICAL HXIT*/
-                                                     0, /* U+00a49a: YI RADICAL LYR*/
-                                                     0, /* U+00a49b: YI RADICAL BBUT*/
-                                                     0, /* U+00a49c: YI RADICAL MOP*/
-                                                     0, /* U+00a49d: YI RADICAL YO*/
-                                                     0, /* U+00a49e: YI RADICAL PUT*/
-                                                     0, /* U+00a49f: YI RADICAL HXUO*/
-                                                     0, /* U+00a4a0: YI RADICAL TAT*/
-                                                     0, /* U+00a4a1: YI RADICAL GA*/
-                                                     0, /* U+00a4a2: YI RADICAL ZUP*/
-                                                     0, /* U+00a4a3: YI RADICAL CYT*/
-                                                     0, /* U+00a4a4: YI RADICAL DDUR*/
-                                                     0, /* U+00a4a5: YI RADICAL BUR*/
-                                                     0, /* U+00a4a6: YI RADICAL GGUO*/
-                                                     0, /* U+00a4a7: YI RADICAL NYOP*/
-                                                     0, /* U+00a4a8: YI RADICAL TU*/
-                                                     0, /* U+00a4a9: YI RADICAL OP*/
-                                                     0, /* U+00a4aa: YI RADICAL JJUT*/
-                                                     0, /* U+00a4ab: YI RADICAL ZOT*/
-                                                     0, /* U+00a4ac: YI RADICAL PYT*/
-                                                     0, /* U+00a4ad: YI RADICAL HMO*/
-                                                     0, /* U+00a4ae: YI RADICAL YIT*/
-                                                     0, /* U+00a4af: YI RADICAL VUR*/
-                                                     0, /* U+00a4b0: YI RADICAL SHY*/
-                                                     0, /* U+00a4b1: YI RADICAL VEP*/
-                                                     0, /* U+00a4b2: YI RADICAL ZA*/
-                                                     0, /* U+00a4b3: YI RADICAL JO*/
-                                                     0, /* U+00a4b4: YI RADICAL NZUP*/
-                                                     0, /* U+00a4b5: YI RADICAL JJY*/
-                                                     0, /* U+00a4b6: YI RADICAL GOT*/
-                                                     0, /* U+00a4b7: YI RADICAL JJIE*/
-                                                     0, /* U+00a4b8: YI RADICAL WO*/
-                                                     0, /* U+00a4b9: YI RADICAL DU*/
-                                                     0, /* U+00a4ba: YI RADICAL SHUR*/
-                                                     0, /* U+00a4bb: YI RADICAL LIE*/
-                                                     0, /* U+00a4bc: YI RADICAL CY*/
-                                                     0, /* U+00a4bd: YI RADICAL CUOP*/
-                                                     0, /* U+00a4be: YI RADICAL CIP*/
-                                                     0, /* U+00a4bf: YI RADICAL HXOP*/
-                                                     0, /* U+00a4c0: YI RADICAL SHAT*/
-                                                     0, /* U+00a4c1: YI RADICAL ZUR*/
-                                                     0, /* U+00a4c2: YI RADICAL SHOP*/
-                                                     0, /* U+00a4c3: YI RADICAL CHE*/
-                                                     0, /* U+00a4c4: YI RADICAL ZZIET*/
-                                                     0, /* U+00a4c5: YI RADICAL NBIE*/
-                                                     0, /* U+00a4c6: YI RADICAL KE*/
-                                                     0, /* U+00a4c7: */
-                                                     0, /* U+00a4c8: */
-                                                     0, /* U+00a4c9: */
-                                                     0, /* U+00a4ca: */
-                                                     0, /* U+00a4cb: */
-                                                     0, /* U+00a4cc: */
-                                                     0, /* U+00a4cd: */
-                                                     0, /* U+00a4ce: */
-                                                     0, /* U+00a4cf: */
-                                                     0, /* U+00a4d0: */
-                                                     0, /* U+00a4d1: */
-                                                     0, /* U+00a4d2: */
-                                                     0, /* U+00a4d3: */
-                                                     0, /* U+00a4d4: */
-                                                     0, /* U+00a4d5: */
-                                                     0, /* U+00a4d6: */
-                                                     0, /* U+00a4d7: */
-                                                     0, /* U+00a4d8: */
-                                                     0, /* U+00a4d9: */
-                                                     0, /* U+00a4da: */
-                                                     0, /* U+00a4db: */
-                                                     0, /* U+00a4dc: */
-                                                     0, /* U+00a4dd: */
-                                                     0, /* U+00a4de: */
-                                                     0, /* U+00a4df: */
-                                                     0, /* U+00a4e0: */
-                                                     0, /* U+00a4e1: */
-                                                     0, /* U+00a4e2: */
-                                                     0, /* U+00a4e3: */
-                                                     0, /* U+00a4e4: */
-                                                     0, /* U+00a4e5: */
-                                                     0, /* U+00a4e6: */
-                                                     0, /* U+00a4e7: */
-                                                     0, /* U+00a4e8: */
-                                                     0, /* U+00a4e9: */
-                                                     0, /* U+00a4ea: */
-                                                     0, /* U+00a4eb: */
-                                                     0, /* U+00a4ec: */
-                                                     0, /* U+00a4ed: */
-                                                     0, /* U+00a4ee: */
-                                                     0, /* U+00a4ef: */
-                                                     0, /* U+00a4f0: */
-                                                     0, /* U+00a4f1: */
-                                                     0, /* U+00a4f2: */
-                                                     0, /* U+00a4f3: */
-                                                     0, /* U+00a4f4: */
-                                                     0, /* U+00a4f5: */
-                                                     0, /* U+00a4f6: */
-                                                     0, /* U+00a4f7: */
-                                                     0, /* U+00a4f8: */
-                                                     0, /* U+00a4f9: */
-                                                     0, /* U+00a4fa: */
-                                                     0, /* U+00a4fb: */
-                                                     0, /* U+00a4fc: */
-                                                     0, /* U+00a4fd: */
-                                                     0, /* U+00a4fe: */
-                                                     0, /* U+00a4ff: */
-                                                     0, /* U+00a500: */
-                                                     0, /* U+00a501: */
-                                                     0, /* U+00a502: */
-                                                     0, /* U+00a503: */
-                                                     0, /* U+00a504: */
-                                                     0, /* U+00a505: */
-                                                     0, /* U+00a506: */
-                                                     0, /* U+00a507: */
-                                                     0, /* U+00a508: */
-                                                     0, /* U+00a509: */
-                                                     0, /* U+00a50a: */
-                                                     0, /* U+00a50b: */
-                                                     0, /* U+00a50c: */
-                                                     0, /* U+00a50d: */
-                                                     0, /* U+00a50e: */
-                                                     0, /* U+00a50f: */
-                                                     0, /* U+00a510: */
-                                                     0, /* U+00a511: */
-                                                     0, /* U+00a512: */
-                                                     0, /* U+00a513: */
-                                                     0, /* U+00a514: */
-                                                     0, /* U+00a515: */
-                                                     0, /* U+00a516: */
-                                                     0, /* U+00a517: */
-                                                     0, /* U+00a518: */
-                                                     0, /* U+00a519: */
-                                                     0, /* U+00a51a: */
-                                                     0, /* U+00a51b: */
-                                                     0, /* U+00a51c: */
-                                                     0, /* U+00a51d: */
-                                                     0, /* U+00a51e: */
-                                                     0, /* U+00a51f: */
-                                                     0, /* U+00a520: */
-                                                     0, /* U+00a521: */
-                                                     0, /* U+00a522: */
-                                                     0, /* U+00a523: */
-                                                     0, /* U+00a524: */
-                                                     0, /* U+00a525: */
-                                                     0, /* U+00a526: */
-                                                     0, /* U+00a527: */
-                                                     0, /* U+00a528: */
-                                                     0, /* U+00a529: */
-                                                     0, /* U+00a52a: */
-                                                     0, /* U+00a52b: */
-                                                     0, /* U+00a52c: */
-                                                     0, /* U+00a52d: */
-                                                     0, /* U+00a52e: */
-                                                     0, /* U+00a52f: */
-                                                     0, /* U+00a530: */
-                                                     0, /* U+00a531: */
-                                                     0, /* U+00a532: */
-                                                     0, /* U+00a533: */
-                                                     0, /* U+00a534: */
-                                                     0, /* U+00a535: */
-                                                     0, /* U+00a536: */
-                                                     0, /* U+00a537: */
-                                                     0, /* U+00a538: */
-                                                     0, /* U+00a539: */
-                                                     0, /* U+00a53a: */
-                                                     0, /* U+00a53b: */
-                                                     0, /* U+00a53c: */
-                                                     0, /* U+00a53d: */
-                                                     0, /* U+00a53e: */
-                                                     0, /* U+00a53f: */
-                                                     0, /* U+00a540: */
-                                                     0, /* U+00a541: */
-                                                     0, /* U+00a542: */
-                                                     0, /* U+00a543: */
-                                                     0, /* U+00a544: */
-                                                     0, /* U+00a545: */
-                                                     0, /* U+00a546: */
-                                                     0, /* U+00a547: */
-                                                     0, /* U+00a548: */
-                                                     0, /* U+00a549: */
-                                                     0, /* U+00a54a: */
-                                                     0, /* U+00a54b: */
-                                                     0, /* U+00a54c: */
-                                                     0, /* U+00a54d: */
-                                                     0, /* U+00a54e: */
-                                                     0, /* U+00a54f: */
-                                                     0, /* U+00a550: */
-                                                     0, /* U+00a551: */
-                                                     0, /* U+00a552: */
-                                                     0, /* U+00a553: */
-                                                     0, /* U+00a554: */
-                                                     0, /* U+00a555: */
-                                                     0, /* U+00a556: */
-                                                     0, /* U+00a557: */
-                                                     0, /* U+00a558: */
-                                                     0, /* U+00a559: */
-                                                     0, /* U+00a55a: */
-                                                     0, /* U+00a55b: */
-                                                     0, /* U+00a55c: */
-                                                     0, /* U+00a55d: */
-                                                     0, /* U+00a55e: */
-                                                     0, /* U+00a55f: */
-                                                     0, /* U+00a560: */
-                                                     0, /* U+00a561: */
-                                                     0, /* U+00a562: */
-                                                     0, /* U+00a563: */
-                                                     0, /* U+00a564: */
-                                                     0, /* U+00a565: */
-                                                     0, /* U+00a566: */
-                                                     0, /* U+00a567: */
-                                                     0, /* U+00a568: */
-                                                     0, /* U+00a569: */
-                                                     0, /* U+00a56a: */
-                                                     0, /* U+00a56b: */
-                                                     0, /* U+00a56c: */
-                                                     0, /* U+00a56d: */
-                                                     0, /* U+00a56e: */
-                                                     0, /* U+00a56f: */
-                                                     0, /* U+00a570: */
-                                                     0, /* U+00a571: */
-                                                     0, /* U+00a572: */
-                                                     0, /* U+00a573: */
-                                                     0, /* U+00a574: */
-                                                     0, /* U+00a575: */
-                                                     0, /* U+00a576: */
-                                                     0, /* U+00a577: */
-                                                     0, /* U+00a578: */
-                                                     0, /* U+00a579: */
-                                                     0, /* U+00a57a: */
-                                                     0, /* U+00a57b: */
-                                                     0, /* U+00a57c: */
-                                                     0, /* U+00a57d: */
-                                                     0, /* U+00a57e: */
-                                                     0, /* U+00a57f: */
-                                                     0, /* U+00a580: */
-                                                     0, /* U+00a581: */
-                                                     0, /* U+00a582: */
-                                                     0, /* U+00a583: */
-                                                     0, /* U+00a584: */
-                                                     0, /* U+00a585: */
-                                                     0, /* U+00a586: */
-                                                     0, /* U+00a587: */
-                                                     0, /* U+00a588: */
-                                                     0, /* U+00a589: */
-                                                     0, /* U+00a58a: */
-                                                     0, /* U+00a58b: */
-                                                     0, /* U+00a58c: */
-                                                     0, /* U+00a58d: */
-                                                     0, /* U+00a58e: */
-                                                     0, /* U+00a58f: */
-                                                     0, /* U+00a590: */
-                                                     0, /* U+00a591: */
-                                                     0, /* U+00a592: */
-                                                     0, /* U+00a593: */
-                                                     0, /* U+00a594: */
-                                                     0, /* U+00a595: */
-                                                     0, /* U+00a596: */
-                                                     0, /* U+00a597: */
-                                                     0, /* U+00a598: */
-                                                     0, /* U+00a599: */
-                                                     0, /* U+00a59a: */
-                                                     0, /* U+00a59b: */
-                                                     0, /* U+00a59c: */
-                                                     0, /* U+00a59d: */
-                                                     0, /* U+00a59e: */
-                                                     0, /* U+00a59f: */
-                                                     0, /* U+00a5a0: */
-                                                     0, /* U+00a5a1: */
-                                                     0, /* U+00a5a2: */
-                                                     0, /* U+00a5a3: */
-                                                     0, /* U+00a5a4: */
-                                                     0, /* U+00a5a5: */
-                                                     0, /* U+00a5a6: */
-                                                     0, /* U+00a5a7: */
-                                                     0, /* U+00a5a8: */
-                                                     0, /* U+00a5a9: */
-                                                     0, /* U+00a5aa: */
-                                                     0, /* U+00a5ab: */
-                                                     0, /* U+00a5ac: */
-                                                     0, /* U+00a5ad: */
-                                                     0, /* U+00a5ae: */
-                                                     0, /* U+00a5af: */
-                                                     0, /* U+00a5b0: */
-                                                     0, /* U+00a5b1: */
-                                                     0, /* U+00a5b2: */
-                                                     0, /* U+00a5b3: */
-                                                     0, /* U+00a5b4: */
-                                                     0, /* U+00a5b5: */
-                                                     0, /* U+00a5b6: */
-                                                     0, /* U+00a5b7: */
-                                                     0, /* U+00a5b8: */
-                                                     0, /* U+00a5b9: */
-                                                     0, /* U+00a5ba: */
-                                                     0, /* U+00a5bb: */
-                                                     0, /* U+00a5bc: */
-                                                     0, /* U+00a5bd: */
-                                                     0, /* U+00a5be: */
-                                                     0, /* U+00a5bf: */
-                                                     0, /* U+00a5c0: */
-                                                     0, /* U+00a5c1: */
-                                                     0, /* U+00a5c2: */
-                                                     0, /* U+00a5c3: */
-                                                     0, /* U+00a5c4: */
-                                                     0, /* U+00a5c5: */
-                                                     0, /* U+00a5c6: */
-                                                     0, /* U+00a5c7: */
-                                                     0, /* U+00a5c8: */
-                                                     0, /* U+00a5c9: */
-                                                     0, /* U+00a5ca: */
-                                                     0, /* U+00a5cb: */
-                                                     0, /* U+00a5cc: */
-                                                     0, /* U+00a5cd: */
-                                                     0, /* U+00a5ce: */
-                                                     0, /* U+00a5cf: */
-                                                     0, /* U+00a5d0: */
-                                                     0, /* U+00a5d1: */
-                                                     0, /* U+00a5d2: */
-                                                     0, /* U+00a5d3: */
-                                                     0, /* U+00a5d4: */
-                                                     0, /* U+00a5d5: */
-                                                     0, /* U+00a5d6: */
-                                                     0, /* U+00a5d7: */
-                                                     0, /* U+00a5d8: */
-                                                     0, /* U+00a5d9: */
-                                                     0, /* U+00a5da: */
-                                                     0, /* U+00a5db: */
-                                                     0, /* U+00a5dc: */
-                                                     0, /* U+00a5dd: */
-                                                     0, /* U+00a5de: */
-                                                     0, /* U+00a5df: */
-                                                     0, /* U+00a5e0: */
-                                                     0, /* U+00a5e1: */
-                                                     0, /* U+00a5e2: */
-                                                     0, /* U+00a5e3: */
-                                                     0, /* U+00a5e4: */
-                                                     0, /* U+00a5e5: */
-                                                     0, /* U+00a5e6: */
-                                                     0, /* U+00a5e7: */
-                                                     0, /* U+00a5e8: */
-                                                     0, /* U+00a5e9: */
-                                                     0, /* U+00a5ea: */
-                                                     0, /* U+00a5eb: */
-                                                     0, /* U+00a5ec: */
-                                                     0, /* U+00a5ed: */
-                                                     0, /* U+00a5ee: */
-                                                     0, /* U+00a5ef: */
-                                                     0, /* U+00a5f0: */
-                                                     0, /* U+00a5f1: */
-                                                     0, /* U+00a5f2: */
-                                                     0, /* U+00a5f3: */
-                                                     0, /* U+00a5f4: */
-                                                     0, /* U+00a5f5: */
-                                                     0, /* U+00a5f6: */
-                                                     0, /* U+00a5f7: */
-                                                     0, /* U+00a5f8: */
-                                                     0, /* U+00a5f9: */
-                                                     0, /* U+00a5fa: */
-                                                     0, /* U+00a5fb: */
-                                                     0, /* U+00a5fc: */
-                                                     0, /* U+00a5fd: */
-                                                     0, /* U+00a5fe: */
-                                                     0, /* U+00a5ff: */
-                                                     0, /* U+00a600: */
-                                                     0, /* U+00a601: */
-                                                     0, /* U+00a602: */
-                                                     0, /* U+00a603: */
-                                                     0, /* U+00a604: */
-                                                     0, /* U+00a605: */
-                                                     0, /* U+00a606: */
-                                                     0, /* U+00a607: */
-                                                     0, /* U+00a608: */
-                                                     0, /* U+00a609: */
-                                                     0, /* U+00a60a: */
-                                                     0, /* U+00a60b: */
-                                                     0, /* U+00a60c: */
-                                                     0, /* U+00a60d: */
-                                                     0, /* U+00a60e: */
-                                                     0, /* U+00a60f: */
-                                                     0, /* U+00a610: */
-                                                     0, /* U+00a611: */
-                                                     0, /* U+00a612: */
-                                                     0, /* U+00a613: */
-                                                     0, /* U+00a614: */
-                                                     0, /* U+00a615: */
-                                                     0, /* U+00a616: */
-                                                     0, /* U+00a617: */
-                                                     0, /* U+00a618: */
-                                                     0, /* U+00a619: */
-                                                     0, /* U+00a61a: */
-                                                     0, /* U+00a61b: */
-                                                     0, /* U+00a61c: */
-                                                     0, /* U+00a61d: */
-                                                     0, /* U+00a61e: */
-                                                     0, /* U+00a61f: */
-                                                     0, /* U+00a620: */
-                                                     0, /* U+00a621: */
-                                                     0, /* U+00a622: */
-                                                     0, /* U+00a623: */
-                                                     0, /* U+00a624: */
-                                                     0, /* U+00a625: */
-                                                     0, /* U+00a626: */
-                                                     0, /* U+00a627: */
-                                                     0, /* U+00a628: */
-                                                     0, /* U+00a629: */
-                                                     0, /* U+00a62a: */
-                                                     0, /* U+00a62b: */
-                                                     0, /* U+00a62c: */
-                                                     0, /* U+00a62d: */
-                                                     0, /* U+00a62e: */
-                                                     0, /* U+00a62f: */
-                                                     0, /* U+00a630: */
-                                                     0, /* U+00a631: */
-                                                     0, /* U+00a632: */
-                                                     0, /* U+00a633: */
-                                                     0, /* U+00a634: */
-                                                     0, /* U+00a635: */
-                                                     0, /* U+00a636: */
-                                                     0, /* U+00a637: */
-                                                     0, /* U+00a638: */
-                                                     0, /* U+00a639: */
-                                                     0, /* U+00a63a: */
-                                                     0, /* U+00a63b: */
-                                                     0, /* U+00a63c: */
-                                                     0, /* U+00a63d: */
-                                                     0, /* U+00a63e: */
-                                                     0, /* U+00a63f: */
-                                                     0, /* U+00a640: */
-                                                     0, /* U+00a641: */
-                                                     0, /* U+00a642: */
-                                                     0, /* U+00a643: */
-                                                     0, /* U+00a644: */
-                                                     0, /* U+00a645: */
-                                                     0, /* U+00a646: */
-                                                     0, /* U+00a647: */
-                                                     0, /* U+00a648: */
-                                                     0, /* U+00a649: */
-                                                     0, /* U+00a64a: */
-                                                     0, /* U+00a64b: */
-                                                     0, /* U+00a64c: */
-                                                     0, /* U+00a64d: */
-                                                     0, /* U+00a64e: */
-                                                     0, /* U+00a64f: */
-                                                     0, /* U+00a650: */
-                                                     0, /* U+00a651: */
-                                                     0, /* U+00a652: */
-                                                     0, /* U+00a653: */
-                                                     0, /* U+00a654: */
-                                                     0, /* U+00a655: */
-                                                     0, /* U+00a656: */
-                                                     0, /* U+00a657: */
-                                                     0, /* U+00a658: */
-                                                     0, /* U+00a659: */
-                                                     0, /* U+00a65a: */
-                                                     0, /* U+00a65b: */
-                                                     0, /* U+00a65c: */
-                                                     0, /* U+00a65d: */
-                                                     0, /* U+00a65e: */
-                                                     0, /* U+00a65f: */
-                                                     0, /* U+00a660: */
-                                                     0, /* U+00a661: */
-                                                     0, /* U+00a662: */
-                                                     0, /* U+00a663: */
-                                                     0, /* U+00a664: */
-                                                     0, /* U+00a665: */
-                                                     0, /* U+00a666: */
-                                                     0, /* U+00a667: */
-                                                     0, /* U+00a668: */
-                                                     0, /* U+00a669: */
-                                                     0, /* U+00a66a: */
-                                                     0, /* U+00a66b: */
-                                                     0, /* U+00a66c: */
-                                                     0, /* U+00a66d: */
-                                                     0, /* U+00a66e: */
-                                                     0, /* U+00a66f: */
-                                                     0, /* U+00a670: */
-                                                     0, /* U+00a671: */
-                                                     0, /* U+00a672: */
-                                                     0, /* U+00a673: */
-                                                     0, /* U+00a674: */
-                                                     0, /* U+00a675: */
-                                                     0, /* U+00a676: */
-                                                     0, /* U+00a677: */
-                                                     0, /* U+00a678: */
-                                                     0, /* U+00a679: */
-                                                     0, /* U+00a67a: */
-                                                     0, /* U+00a67b: */
-                                                     0, /* U+00a67c: */
-                                                     0, /* U+00a67d: */
-                                                     0, /* U+00a67e: */
-                                                     0, /* U+00a67f: */
-                                                     0, /* U+00a680: */
-                                                     0, /* U+00a681: */
-                                                     0, /* U+00a682: */
-                                                     0, /* U+00a683: */
-                                                     0, /* U+00a684: */
-                                                     0, /* U+00a685: */
-                                                     0, /* U+00a686: */
-                                                     0, /* U+00a687: */
-                                                     0, /* U+00a688: */
-                                                     0, /* U+00a689: */
-                                                     0, /* U+00a68a: */
-                                                     0, /* U+00a68b: */
-                                                     0, /* U+00a68c: */
-                                                     0, /* U+00a68d: */
-                                                     0, /* U+00a68e: */
-                                                     0, /* U+00a68f: */
-                                                     0, /* U+00a690: */
-                                                     0, /* U+00a691: */
-                                                     0, /* U+00a692: */
-                                                     0, /* U+00a693: */
-                                                     0, /* U+00a694: */
-                                                     0, /* U+00a695: */
-                                                     0, /* U+00a696: */
-                                                     0, /* U+00a697: */
-                                                     0, /* U+00a698: */
-                                                     0, /* U+00a699: */
-                                                     0, /* U+00a69a: */
-                                                     0, /* U+00a69b: */
-                                                     0, /* U+00a69c: */
-                                                     0, /* U+00a69d: */
-                                                     0, /* U+00a69e: */
-                                                     0, /* U+00a69f: */
-                                                     0, /* U+00a6a0: */
-                                                     0, /* U+00a6a1: */
-                                                     0, /* U+00a6a2: */
-                                                     0, /* U+00a6a3: */
-                                                     0, /* U+00a6a4: */
-                                                     0, /* U+00a6a5: */
-                                                     0, /* U+00a6a6: */
-                                                     0, /* U+00a6a7: */
-                                                     0, /* U+00a6a8: */
-                                                     0, /* U+00a6a9: */
-                                                     0, /* U+00a6aa: */
-                                                     0, /* U+00a6ab: */
-                                                     0, /* U+00a6ac: */
-                                                     0, /* U+00a6ad: */
-                                                     0, /* U+00a6ae: */
-                                                     0, /* U+00a6af: */
-                                                     0, /* U+00a6b0: */
-                                                     0, /* U+00a6b1: */
-                                                     0, /* U+00a6b2: */
-                                                     0, /* U+00a6b3: */
-                                                     0, /* U+00a6b4: */
-                                                     0, /* U+00a6b5: */
-                                                     0, /* U+00a6b6: */
-                                                     0, /* U+00a6b7: */
-                                                     0, /* U+00a6b8: */
-                                                     0, /* U+00a6b9: */
-                                                     0, /* U+00a6ba: */
-                                                     0, /* U+00a6bb: */
-                                                     0, /* U+00a6bc: */
-                                                     0, /* U+00a6bd: */
-                                                     0, /* U+00a6be: */
-                                                     0, /* U+00a6bf: */
-                                                     0, /* U+00a6c0: */
-                                                     0, /* U+00a6c1: */
-                                                     0, /* U+00a6c2: */
-                                                     0, /* U+00a6c3: */
-                                                     0, /* U+00a6c4: */
-                                                     0, /* U+00a6c5: */
-                                                     0, /* U+00a6c6: */
-                                                     0, /* U+00a6c7: */
-                                                     0, /* U+00a6c8: */
-                                                     0, /* U+00a6c9: */
-                                                     0, /* U+00a6ca: */
-                                                     0, /* U+00a6cb: */
-                                                     0, /* U+00a6cc: */
-                                                     0, /* U+00a6cd: */
-                                                     0, /* U+00a6ce: */
-                                                     0, /* U+00a6cf: */
-                                                     0, /* U+00a6d0: */
-                                                     0, /* U+00a6d1: */
-                                                     0, /* U+00a6d2: */
-                                                     0, /* U+00a6d3: */
-                                                     0, /* U+00a6d4: */
-                                                     0, /* U+00a6d5: */
-                                                     0, /* U+00a6d6: */
-                                                     0, /* U+00a6d7: */
-                                                     0, /* U+00a6d8: */
-                                                     0, /* U+00a6d9: */
-                                                     0, /* U+00a6da: */
-                                                     0, /* U+00a6db: */
-                                                     0, /* U+00a6dc: */
-                                                     0, /* U+00a6dd: */
-                                                     0, /* U+00a6de: */
-                                                     0, /* U+00a6df: */
-                                                     0, /* U+00a6e0: */
-                                                     0, /* U+00a6e1: */
-                                                     0, /* U+00a6e2: */
-                                                     0, /* U+00a6e3: */
-                                                     0, /* U+00a6e4: */
-                                                     0, /* U+00a6e5: */
-                                                     0, /* U+00a6e6: */
-                                                     0, /* U+00a6e7: */
-                                                     0, /* U+00a6e8: */
-                                                     0, /* U+00a6e9: */
-                                                     0, /* U+00a6ea: */
-                                                     0, /* U+00a6eb: */
-                                                     0, /* U+00a6ec: */
-                                                     0, /* U+00a6ed: */
-                                                     0, /* U+00a6ee: */
-                                                     0, /* U+00a6ef: */
-                                                     0, /* U+00a6f0: */
-                                                     0, /* U+00a6f1: */
-                                                     0, /* U+00a6f2: */
-                                                     0, /* U+00a6f3: */
-                                                     0, /* U+00a6f4: */
-                                                     0, /* U+00a6f5: */
-                                                     0, /* U+00a6f6: */
-                                                     0, /* U+00a6f7: */
-                                                     0, /* U+00a6f8: */
-                                                     0, /* U+00a6f9: */
-                                                     0, /* U+00a6fa: */
-                                                     0, /* U+00a6fb: */
-                                                     0, /* U+00a6fc: */
-                                                     0, /* U+00a6fd: */
-                                                     0, /* U+00a6fe: */
-                                                     0, /* U+00a6ff: */
-                                                     0, /* U+00a700: MODIFIER LETTER CHINESE TONE YIN PING*/
-                                                     0, /* U+00a701: MODIFIER LETTER CHINESE TONE YANG PING*/
-                                                     0, /* U+00a702: MODIFIER LETTER CHINESE TONE YIN SHANG*/
-                                                     0, /* U+00a703: MODIFIER LETTER CHINESE TONE YANG SHANG*/
-                                                     0, /* U+00a704: MODIFIER LETTER CHINESE TONE YIN QU*/
-                                                     0, /* U+00a705: MODIFIER LETTER CHINESE TONE YANG QU*/
-                                                     0, /* U+00a706: MODIFIER LETTER CHINESE TONE YIN RU*/
-                                                     0, /* U+00a707: MODIFIER LETTER CHINESE TONE YANG RU*/
-                                                     0, /* U+00a708: MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR*/
-                                                     0, /* U+00a709: MODIFIER LETTER HIGH DOTTED TONE BAR*/
-                                                     0, /* U+00a70a: MODIFIER LETTER MID DOTTED TONE BAR*/
-                                                     0, /* U+00a70b: MODIFIER LETTER LOW DOTTED TONE BAR*/
-                                                     0, /* U+00a70c: MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR*/
-                                                     0, /* U+00a70d: MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a70e: MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a70f: MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a710: MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a711: MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a712: MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a713: MODIFIER LETTER HIGH LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a714: MODIFIER LETTER MID LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a715: MODIFIER LETTER LOW LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a716: MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR*/
-                                                     0, /* U+00a717: */
-                                                     0, /* U+00a718: */
-                                                     0, /* U+00a719: */
-                                                     0, /* U+00a71a: */
-                                                     0, /* U+00a71b: */
-                                                     0, /* U+00a71c: */
-                                                     0, /* U+00a71d: */
-                                                     0, /* U+00a71e: */
-                                                     0, /* U+00a71f: */
-                                                     0, /* U+00a720: */
-                                                     0, /* U+00a721: */
-                                                     0, /* U+00a722: */
-                                                     0, /* U+00a723: */
-                                                     0, /* U+00a724: */
-                                                     0, /* U+00a725: */
-                                                     0, /* U+00a726: */
-                                                     0, /* U+00a727: */
-                                                     0, /* U+00a728: */
-                                                     0, /* U+00a729: */
-                                                     0, /* U+00a72a: */
-                                                     0, /* U+00a72b: */
-                                                     0, /* U+00a72c: */
-                                                     0, /* U+00a72d: */
-                                                     0, /* U+00a72e: */
-                                                     0, /* U+00a72f: */
-                                                     0, /* U+00a730: */
-                                                     0, /* U+00a731: */
-                                                     0, /* U+00a732: */
-                                                     0, /* U+00a733: */
-                                                     0, /* U+00a734: */
-                                                     0, /* U+00a735: */
-                                                     0, /* U+00a736: */
-                                                     0, /* U+00a737: */
-                                                     0, /* U+00a738: */
-                                                     0, /* U+00a739: */
-                                                     0, /* U+00a73a: */
-                                                     0, /* U+00a73b: */
-                                                     0, /* U+00a73c: */
-                                                     0, /* U+00a73d: */
-                                                     0, /* U+00a73e: */
-                                                     0, /* U+00a73f: */
-                                                     0, /* U+00a740: */
-                                                     0, /* U+00a741: */
-                                                     0, /* U+00a742: */
-                                                     0, /* U+00a743: */
-                                                     0, /* U+00a744: */
-                                                     0, /* U+00a745: */
-                                                     0, /* U+00a746: */
-                                                     0, /* U+00a747: */
-                                                     0, /* U+00a748: */
-                                                     0, /* U+00a749: */
-                                                     0, /* U+00a74a: */
-                                                     0, /* U+00a74b: */
-                                                     0, /* U+00a74c: */
-                                                     0, /* U+00a74d: */
-                                                     0, /* U+00a74e: */
-                                                     0, /* U+00a74f: */
-                                                     0, /* U+00a750: */
-                                                     0, /* U+00a751: */
-                                                     0, /* U+00a752: */
-                                                     0, /* U+00a753: */
-                                                     0, /* U+00a754: */
-                                                     0, /* U+00a755: */
-                                                     0, /* U+00a756: */
-                                                     0, /* U+00a757: */
-                                                     0, /* U+00a758: */
-                                                     0, /* U+00a759: */
-                                                     0, /* U+00a75a: */
-                                                     0, /* U+00a75b: */
-                                                     0, /* U+00a75c: */
-                                                     0, /* U+00a75d: */
-                                                     0, /* U+00a75e: */
-                                                     0, /* U+00a75f: */
-                                                     0, /* U+00a760: */
-                                                     0, /* U+00a761: */
-                                                     0, /* U+00a762: */
-                                                     0, /* U+00a763: */
-                                                     0, /* U+00a764: */
-                                                     0, /* U+00a765: */
-                                                     0, /* U+00a766: */
-                                                     0, /* U+00a767: */
-                                                     0, /* U+00a768: */
-                                                     0, /* U+00a769: */
-                                                     0, /* U+00a76a: */
-                                                     0, /* U+00a76b: */
-                                                     0, /* U+00a76c: */
-                                                     0, /* U+00a76d: */
-                                                     0, /* U+00a76e: */
-                                                     0, /* U+00a76f: */
-                                                     0, /* U+00a770: */
-                                                     0, /* U+00a771: */
-                                                     0, /* U+00a772: */
-                                                     0, /* U+00a773: */
-                                                     0, /* U+00a774: */
-                                                     0, /* U+00a775: */
-                                                     0, /* U+00a776: */
-                                                     0, /* U+00a777: */
-                                                     0, /* U+00a778: */
-                                                     0, /* U+00a779: */
-                                                     0, /* U+00a77a: */
-                                                     0, /* U+00a77b: */
-                                                     0, /* U+00a77c: */
-                                                     0, /* U+00a77d: */
-                                                     0, /* U+00a77e: */
-                                                     0, /* U+00a77f: */
-                                                     0, /* U+00a780: */
-                                                     0, /* U+00a781: */
-                                                     0, /* U+00a782: */
-                                                     0, /* U+00a783: */
-                                                     0, /* U+00a784: */
-                                                     0, /* U+00a785: */
-                                                     0, /* U+00a786: */
-                                                     0, /* U+00a787: */
-                                                     0, /* U+00a788: */
-                                                     0, /* U+00a789: */
-                                                     0, /* U+00a78a: */
-                                                     0, /* U+00a78b: */
-                                                     0, /* U+00a78c: */
-                                                     0, /* U+00a78d: */
-                                                     0, /* U+00a78e: */
-                                                     0, /* U+00a78f: */
-                                                     0, /* U+00a790: */
-                                                     0, /* U+00a791: */
-                                                     0, /* U+00a792: */
-                                                     0, /* U+00a793: */
-                                                     0, /* U+00a794: */
-                                                     0, /* U+00a795: */
-                                                     0, /* U+00a796: */
-                                                     0, /* U+00a797: */
-                                                     0, /* U+00a798: */
-                                                     0, /* U+00a799: */
-                                                     0, /* U+00a79a: */
-                                                     0, /* U+00a79b: */
-                                                     0, /* U+00a79c: */
-                                                     0, /* U+00a79d: */
-                                                     0, /* U+00a79e: */
-                                                     0, /* U+00a79f: */
-                                                     0, /* U+00a7a0: */
-                                                     0, /* U+00a7a1: */
-                                                     0, /* U+00a7a2: */
-                                                     0, /* U+00a7a3: */
-                                                     0, /* U+00a7a4: */
-                                                     0, /* U+00a7a5: */
-                                                     0, /* U+00a7a6: */
-                                                     0, /* U+00a7a7: */
-                                                     0, /* U+00a7a8: */
-                                                     0, /* U+00a7a9: */
-                                                     0, /* U+00a7aa: */
-                                                     0, /* U+00a7ab: */
-                                                     0, /* U+00a7ac: */
-                                                     0, /* U+00a7ad: */
-                                                     0, /* U+00a7ae: */
-                                                     0, /* U+00a7af: */
-                                                     0, /* U+00a7b0: */
-                                                     0, /* U+00a7b1: */
-                                                     0, /* U+00a7b2: */
-                                                     0, /* U+00a7b3: */
-                                                     0, /* U+00a7b4: */
-                                                     0, /* U+00a7b5: */
-                                                     0, /* U+00a7b6: */
-                                                     0, /* U+00a7b7: */
-                                                     0, /* U+00a7b8: */
-                                                     0, /* U+00a7b9: */
-                                                     0, /* U+00a7ba: */
-                                                     0, /* U+00a7bb: */
-                                                     0, /* U+00a7bc: */
-                                                     0, /* U+00a7bd: */
-                                                     0, /* U+00a7be: */
-                                                     0, /* U+00a7bf: */
-                                                     0, /* U+00a7c0: */
-                                                     0, /* U+00a7c1: */
-                                                     0, /* U+00a7c2: */
-                                                     0, /* U+00a7c3: */
-                                                     0, /* U+00a7c4: */
-                                                     0, /* U+00a7c5: */
-                                                     0, /* U+00a7c6: */
-                                                     0, /* U+00a7c7: */
-                                                     0, /* U+00a7c8: */
-                                                     0, /* U+00a7c9: */
-                                                     0, /* U+00a7ca: */
-                                                     0, /* U+00a7cb: */
-                                                     0, /* U+00a7cc: */
-                                                     0, /* U+00a7cd: */
-                                                     0, /* U+00a7ce: */
-                                                     0, /* U+00a7cf: */
-                                                     0, /* U+00a7d0: */
-                                                     0, /* U+00a7d1: */
-                                                     0, /* U+00a7d2: */
-                                                     0, /* U+00a7d3: */
-                                                     0, /* U+00a7d4: */
-                                                     0, /* U+00a7d5: */
-                                                     0, /* U+00a7d6: */
-                                                     0, /* U+00a7d7: */
-                                                     0, /* U+00a7d8: */
-                                                     0, /* U+00a7d9: */
-                                                     0, /* U+00a7da: */
-                                                     0, /* U+00a7db: */
-                                                     0, /* U+00a7dc: */
-                                                     0, /* U+00a7dd: */
-                                                     0, /* U+00a7de: */
-                                                     0, /* U+00a7df: */
-                                                     0, /* U+00a7e0: */
-                                                     0, /* U+00a7e1: */
-                                                     0, /* U+00a7e2: */
-                                                     0, /* U+00a7e3: */
-                                                     0, /* U+00a7e4: */
-                                                     0, /* U+00a7e5: */
-                                                     0, /* U+00a7e6: */
-                                                     0, /* U+00a7e7: */
-                                                     0, /* U+00a7e8: */
-                                                     0, /* U+00a7e9: */
-                                                     0, /* U+00a7ea: */
-                                                     0, /* U+00a7eb: */
-                                                     0, /* U+00a7ec: */
-                                                     0, /* U+00a7ed: */
-                                                     0, /* U+00a7ee: */
-                                                     0, /* U+00a7ef: */
-                                                     0, /* U+00a7f0: */
-                                                     0, /* U+00a7f1: */
-                                                     0, /* U+00a7f2: */
-                                                     0, /* U+00a7f3: */
-                                                     0, /* U+00a7f4: */
-                                                     0, /* U+00a7f5: */
-                                                     0, /* U+00a7f6: */
-                                                     0, /* U+00a7f7: */
-                                                     0, /* U+00a7f8: */
-                                                     0, /* U+00a7f9: */
-                                                     0, /* U+00a7fa: */
-                                                     0, /* U+00a7fb: */
-                                                     0, /* U+00a7fc: */
-                                                     0, /* U+00a7fd: */
-                                                     0, /* U+00a7fe: */
-                                                     0, /* U+00a7ff: */
-                                           RTUNI_ALPHA, /* U+00a800: SYLOTI NAGRI LETTER A*/
-                                           RTUNI_ALPHA, /* U+00a801: SYLOTI NAGRI LETTER I*/
-                                                     0, /* U+00a802: SYLOTI NAGRI SIGN DVISVARA*/
-                                           RTUNI_ALPHA, /* U+00a803: SYLOTI NAGRI LETTER U*/
-                                           RTUNI_ALPHA, /* U+00a804: SYLOTI NAGRI LETTER E*/
-                                           RTUNI_ALPHA, /* U+00a805: SYLOTI NAGRI LETTER O*/
-                                                     0, /* U+00a806: SYLOTI NAGRI SIGN HASANTA*/
-                                           RTUNI_ALPHA, /* U+00a807: SYLOTI NAGRI LETTER KO*/
-                                           RTUNI_ALPHA, /* U+00a808: SYLOTI NAGRI LETTER KHO*/
-                                           RTUNI_ALPHA, /* U+00a809: SYLOTI NAGRI LETTER GO*/
-                                           RTUNI_ALPHA, /* U+00a80a: SYLOTI NAGRI LETTER GHO*/
-                                                     0, /* U+00a80b: SYLOTI NAGRI SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+00a80c: SYLOTI NAGRI LETTER CO*/
-                                           RTUNI_ALPHA, /* U+00a80d: SYLOTI NAGRI LETTER CHO*/
-                                           RTUNI_ALPHA, /* U+00a80e: SYLOTI NAGRI LETTER JO*/
-                                           RTUNI_ALPHA, /* U+00a80f: SYLOTI NAGRI LETTER JHO*/
-                                           RTUNI_ALPHA, /* U+00a810: SYLOTI NAGRI LETTER TTO*/
-                                           RTUNI_ALPHA, /* U+00a811: SYLOTI NAGRI LETTER TTHO*/
-                                           RTUNI_ALPHA, /* U+00a812: SYLOTI NAGRI LETTER DDO*/
-                                           RTUNI_ALPHA, /* U+00a813: SYLOTI NAGRI LETTER DDHO*/
-                                           RTUNI_ALPHA, /* U+00a814: SYLOTI NAGRI LETTER TO*/
-                                           RTUNI_ALPHA, /* U+00a815: SYLOTI NAGRI LETTER THO*/
-                                           RTUNI_ALPHA, /* U+00a816: SYLOTI NAGRI LETTER DO*/
-                                           RTUNI_ALPHA, /* U+00a817: SYLOTI NAGRI LETTER DHO*/
-                                           RTUNI_ALPHA, /* U+00a818: SYLOTI NAGRI LETTER NO*/
-                                           RTUNI_ALPHA, /* U+00a819: SYLOTI NAGRI LETTER PO*/
-                                           RTUNI_ALPHA, /* U+00a81a: SYLOTI NAGRI LETTER PHO*/
-                                           RTUNI_ALPHA, /* U+00a81b: SYLOTI NAGRI LETTER BO*/
-                                           RTUNI_ALPHA, /* U+00a81c: SYLOTI NAGRI LETTER BHO*/
-                                           RTUNI_ALPHA, /* U+00a81d: SYLOTI NAGRI LETTER MO*/
-                                           RTUNI_ALPHA, /* U+00a81e: SYLOTI NAGRI LETTER RO*/
-                                           RTUNI_ALPHA, /* U+00a81f: SYLOTI NAGRI LETTER LO*/
-                                           RTUNI_ALPHA, /* U+00a820: SYLOTI NAGRI LETTER RRO*/
-                                           RTUNI_ALPHA, /* U+00a821: SYLOTI NAGRI LETTER SO*/
-                                           RTUNI_ALPHA, /* U+00a822: SYLOTI NAGRI LETTER HO*/
-                                           RTUNI_ALPHA, /* U+00a823: SYLOTI NAGRI VOWEL SIGN A*/
-                                           RTUNI_ALPHA, /* U+00a824: SYLOTI NAGRI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+00a825: SYLOTI NAGRI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+00a826: SYLOTI NAGRI VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+00a827: SYLOTI NAGRI VOWEL SIGN OO*/
-                                                     0, /* U+00a828: SYLOTI NAGRI POETRY MARK-1*/
-                                                     0, /* U+00a829: SYLOTI NAGRI POETRY MARK-2*/
-                                                     0, /* U+00a82a: SYLOTI NAGRI POETRY MARK-3*/
-                                                     0, /* U+00a82b: SYLOTI NAGRI POETRY MARK-4*/
-                                                     0, /* U+00a82c: */
-                                                     0, /* U+00a82d: */
-                                                     0, /* U+00a82e: */
-                                                     0, /* U+00a82f: */
-                                                     0, /* U+00a830: */
-                                                     0, /* U+00a831: */
-                                                     0, /* U+00a832: */
-                                                     0, /* U+00a833: */
-                                                     0, /* U+00a834: */
-                                                     0, /* U+00a835: */
-                                                     0, /* U+00a836: */
-                                                     0, /* U+00a837: */
-                                                     0, /* U+00a838: */
-                                                     0, /* U+00a839: */
-                                                     0, /* U+00a83a: */
-                                                     0, /* U+00a83b: */
-                                                     0, /* U+00a83c: */
-                                                     0, /* U+00a83d: */
-                                                     0, /* U+00a83e: */
-                                                     0, /* U+00a83f: */
-                                                     0, /* U+00a840: */
-                                                     0, /* U+00a841: */
-                                                     0, /* U+00a842: */
-                                                     0, /* U+00a843: */
-                                                     0, /* U+00a844: */
-                                                     0, /* U+00a845: */
-                                                     0, /* U+00a846: */
-                                                     0, /* U+00a847: */
-                                                     0, /* U+00a848: */
-                                                     0, /* U+00a849: */
-                                                     0, /* U+00a84a: */
-                                                     0, /* U+00a84b: */
-                                                     0, /* U+00a84c: */
-                                                     0, /* U+00a84d: */
-                                                     0, /* U+00a84e: */
-                                                     0, /* U+00a84f: */
-                                                     0, /* U+00a850: */
-                                                     0, /* U+00a851: */
-                                                     0, /* U+00a852: */
-                                                     0, /* U+00a853: */
-                                                     0, /* U+00a854: */
-                                                     0, /* U+00a855: */
-                                                     0, /* U+00a856: */
-                                                     0, /* U+00a857: */
-                                                     0, /* U+00a858: */
-                                                     0, /* U+00a859: */
-                                                     0, /* U+00a85a: */
-                                                     0, /* U+00a85b: */
-                                                     0, /* U+00a85c: */
-                                                     0, /* U+00a85d: */
-                                                     0, /* U+00a85e: */
-                                                     0, /* U+00a85f: */
-                                                     0, /* U+00a860: */
-                                                     0, /* U+00a861: */
-                                                     0, /* U+00a862: */
-                                                     0, /* U+00a863: */
-                                                     0, /* U+00a864: */
-                                                     0, /* U+00a865: */
-                                                     0, /* U+00a866: */
-                                                     0, /* U+00a867: */
-                                                     0, /* U+00a868: */
-                                                     0, /* U+00a869: */
-                                                     0, /* U+00a86a: */
-                                                     0, /* U+00a86b: */
-                                                     0, /* U+00a86c: */
-                                                     0, /* U+00a86d: */
-                                                     0, /* U+00a86e: */
-                                                     0, /* U+00a86f: */
-                                                     0, /* U+00a870: */
-                                                     0, /* U+00a871: */
-                                                     0, /* U+00a872: */
-                                                     0, /* U+00a873: */
-                                                     0, /* U+00a874: */
-                                                     0, /* U+00a875: */
-                                                     0, /* U+00a876: */
-                                                     0, /* U+00a877: */
-                                                     0, /* U+00a878: */
-                                                     0, /* U+00a879: */
-                                                     0, /* U+00a87a: */
-                                                     0, /* U+00a87b: */
-                                                     0, /* U+00a87c: */
-                                                     0, /* U+00a87d: */
-                                                     0, /* U+00a87e: */
-                                                     0, /* U+00a87f: */
-                                                     0, /* U+00a880: */
-                                                     0, /* U+00a881: */
-                                                     0, /* U+00a882: */
-                                                     0, /* U+00a883: */
-                                                     0, /* U+00a884: */
-                                                     0, /* U+00a885: */
-                                                     0, /* U+00a886: */
-                                                     0, /* U+00a887: */
-                                                     0, /* U+00a888: */
-                                                     0, /* U+00a889: */
-                                                     0, /* U+00a88a: */
-                                                     0, /* U+00a88b: */
-                                                     0, /* U+00a88c: */
-                                                     0, /* U+00a88d: */
-                                                     0, /* U+00a88e: */
-                                                     0, /* U+00a88f: */
-                                                     0, /* U+00a890: */
-                                                     0, /* U+00a891: */
-                                                     0, /* U+00a892: */
-                                                     0, /* U+00a893: */
-                                                     0, /* U+00a894: */
-                                                     0, /* U+00a895: */
-                                                     0, /* U+00a896: */
-                                                     0, /* U+00a897: */
-                                                     0, /* U+00a898: */
-                                                     0, /* U+00a899: */
-                                                     0, /* U+00a89a: */
-                                                     0, /* U+00a89b: */
-                                                     0, /* U+00a89c: */
-                                                     0, /* U+00a89d: */
-                                                     0, /* U+00a89e: */
-                                                     0, /* U+00a89f: */
-                                                     0, /* U+00a8a0: */
-                                                     0, /* U+00a8a1: */
-                                                     0, /* U+00a8a2: */
-                                                     0, /* U+00a8a3: */
-                                                     0, /* U+00a8a4: */
-                                                     0, /* U+00a8a5: */
-                                                     0, /* U+00a8a6: */
-                                                     0, /* U+00a8a7: */
-                                                     0, /* U+00a8a8: */
-                                                     0, /* U+00a8a9: */
-                                                     0, /* U+00a8aa: */
-                                                     0, /* U+00a8ab: */
-                                                     0, /* U+00a8ac: */
-                                                     0, /* U+00a8ad: */
-                                                     0, /* U+00a8ae: */
-                                                     0, /* U+00a8af: */
-                                                     0, /* U+00a8b0: */
-                                                     0, /* U+00a8b1: */
-                                                     0, /* U+00a8b2: */
-                                                     0, /* U+00a8b3: */
-                                                     0, /* U+00a8b4: */
-                                                     0, /* U+00a8b5: */
-                                                     0, /* U+00a8b6: */
-                                                     0, /* U+00a8b7: */
-                                                     0, /* U+00a8b8: */
-                                                     0, /* U+00a8b9: */
-                                                     0, /* U+00a8ba: */
-                                                     0, /* U+00a8bb: */
-                                                     0, /* U+00a8bc: */
-                                                     0, /* U+00a8bd: */
-                                                     0, /* U+00a8be: */
-                                                     0, /* U+00a8bf: */
-                                                     0, /* U+00a8c0: */
-                                                     0, /* U+00a8c1: */
-                                                     0, /* U+00a8c2: */
-                                                     0, /* U+00a8c3: */
-                                                     0, /* U+00a8c4: */
-                                                     0, /* U+00a8c5: */
-                                                     0, /* U+00a8c6: */
-                                                     0, /* U+00a8c7: */
-                                                     0, /* U+00a8c8: */
-                                                     0, /* U+00a8c9: */
-                                                     0, /* U+00a8ca: */
-                                                     0, /* U+00a8cb: */
-                                                     0, /* U+00a8cc: */
-                                                     0, /* U+00a8cd: */
-                                                     0, /* U+00a8ce: */
-                                                     0, /* U+00a8cf: */
-                                                     0, /* U+00a8d0: */
-                                                     0, /* U+00a8d1: */
-                                                     0, /* U+00a8d2: */
-                                                     0, /* U+00a8d3: */
-                                                     0, /* U+00a8d4: */
-                                                     0, /* U+00a8d5: */
-                                                     0, /* U+00a8d6: */
-                                                     0, /* U+00a8d7: */
-                                                     0, /* U+00a8d8: */
-                                                     0, /* U+00a8d9: */
-                                                     0, /* U+00a8da: */
-                                                     0, /* U+00a8db: */
-                                                     0, /* U+00a8dc: */
-                                                     0, /* U+00a8dd: */
-                                                     0, /* U+00a8de: */
-                                                     0, /* U+00a8df: */
-                                                     0, /* U+00a8e0: */
-                                                     0, /* U+00a8e1: */
-                                                     0, /* U+00a8e2: */
-                                                     0, /* U+00a8e3: */
-                                                     0, /* U+00a8e4: */
-                                                     0, /* U+00a8e5: */
-                                                     0, /* U+00a8e6: */
-                                                     0, /* U+00a8e7: */
-                                                     0, /* U+00a8e8: */
-                                                     0, /* U+00a8e9: */
-                                                     0, /* U+00a8ea: */
-                                                     0, /* U+00a8eb: */
-                                                     0, /* U+00a8ec: */
-                                                     0, /* U+00a8ed: */
-                                                     0, /* U+00a8ee: */
-                                                     0, /* U+00a8ef: */
-                                                     0, /* U+00a8f0: */
-                                                     0, /* U+00a8f1: */
-                                                     0, /* U+00a8f2: */
-                                                     0, /* U+00a8f3: */
-                                                     0, /* U+00a8f4: */
-                                                     0, /* U+00a8f5: */
-                                                     0, /* U+00a8f6: */
-                                                     0, /* U+00a8f7: */
-                                                     0, /* U+00a8f8: */
-                                                     0, /* U+00a8f9: */
-                                                     0, /* U+00a8fa: */
-                                                     0, /* U+00a8fb: */
-                                                     0, /* U+00a8fc: */
-                                                     0, /* U+00a8fd: */
-                                                     0, /* U+00a8fe: */
-                                                     0, /* U+00a8ff: */
-                                                     0, /* U+00a900: */
-                                                     0, /* U+00a901: */
-                                                     0, /* U+00a902: */
-                                                     0, /* U+00a903: */
-                                                     0, /* U+00a904: */
-                                                     0, /* U+00a905: */
-                                                     0, /* U+00a906: */
-                                                     0, /* U+00a907: */
-                                                     0, /* U+00a908: */
-                                                     0, /* U+00a909: */
-                                                     0, /* U+00a90a: */
-                                                     0, /* U+00a90b: */
-                                                     0, /* U+00a90c: */
-                                                     0, /* U+00a90d: */
-                                                     0, /* U+00a90e: */
-                                                     0, /* U+00a90f: */
-                                                     0, /* U+00a910: */
-                                                     0, /* U+00a911: */
-                                                     0, /* U+00a912: */
-                                                     0, /* U+00a913: */
-                                                     0, /* U+00a914: */
-                                                     0, /* U+00a915: */
-                                                     0, /* U+00a916: */
-                                                     0, /* U+00a917: */
-                                                     0, /* U+00a918: */
-                                                     0, /* U+00a919: */
-                                                     0, /* U+00a91a: */
-                                                     0, /* U+00a91b: */
-                                                     0, /* U+00a91c: */
-                                                     0, /* U+00a91d: */
-                                                     0, /* U+00a91e: */
-                                                     0, /* U+00a91f: */
-                                                     0, /* U+00a920: */
-                                                     0, /* U+00a921: */
-                                                     0, /* U+00a922: */
-                                                     0, /* U+00a923: */
-                                                     0, /* U+00a924: */
-                                                     0, /* U+00a925: */
-                                                     0, /* U+00a926: */
-                                                     0, /* U+00a927: */
-                                                     0, /* U+00a928: */
-                                                     0, /* U+00a929: */
-                                                     0, /* U+00a92a: */
-                                                     0, /* U+00a92b: */
-                                                     0, /* U+00a92c: */
-                                                     0, /* U+00a92d: */
-                                                     0, /* U+00a92e: */
-                                                     0, /* U+00a92f: */
-                                                     0, /* U+00a930: */
-                                                     0, /* U+00a931: */
-                                                     0, /* U+00a932: */
-                                                     0, /* U+00a933: */
-                                                     0, /* U+00a934: */
-                                                     0, /* U+00a935: */
-                                                     0, /* U+00a936: */
-                                                     0, /* U+00a937: */
-                                                     0, /* U+00a938: */
-                                                     0, /* U+00a939: */
-                                                     0, /* U+00a93a: */
-                                                     0, /* U+00a93b: */
-                                                     0, /* U+00a93c: */
-                                                     0, /* U+00a93d: */
-                                                     0, /* U+00a93e: */
-                                                     0, /* U+00a93f: */
-                                                     0, /* U+00a940: */
-                                                     0, /* U+00a941: */
-                                                     0, /* U+00a942: */
-                                                     0, /* U+00a943: */
-                                                     0, /* U+00a944: */
-                                                     0, /* U+00a945: */
-                                                     0, /* U+00a946: */
-                                                     0, /* U+00a947: */
-                                                     0, /* U+00a948: */
-                                                     0, /* U+00a949: */
-                                                     0, /* U+00a94a: */
-                                                     0, /* U+00a94b: */
-                                                     0, /* U+00a94c: */
-                                                     0, /* U+00a94d: */
-                                                     0, /* U+00a94e: */
-                                                     0, /* U+00a94f: */
-                                                     0, /* U+00a950: */
-                                                     0, /* U+00a951: */
-                                                     0, /* U+00a952: */
-                                                     0, /* U+00a953: */
-                                                     0, /* U+00a954: */
-                                                     0, /* U+00a955: */
-                                                     0, /* U+00a956: */
-                                                     0, /* U+00a957: */
-                                                     0, /* U+00a958: */
-                                                     0, /* U+00a959: */
-                                                     0, /* U+00a95a: */
-                                                     0, /* U+00a95b: */
-                                                     0, /* U+00a95c: */
-                                                     0, /* U+00a95d: */
-                                                     0, /* U+00a95e: */
-                                                     0, /* U+00a95f: */
-                                                     0, /* U+00a960: */
-                                                     0, /* U+00a961: */
-                                                     0, /* U+00a962: */
-                                                     0, /* U+00a963: */
-                                                     0, /* U+00a964: */
-                                                     0, /* U+00a965: */
-                                                     0, /* U+00a966: */
-                                                     0, /* U+00a967: */
-                                                     0, /* U+00a968: */
-                                                     0, /* U+00a969: */
-                                                     0, /* U+00a96a: */
-                                                     0, /* U+00a96b: */
-                                                     0, /* U+00a96c: */
-                                                     0, /* U+00a96d: */
-                                                     0, /* U+00a96e: */
-                                                     0, /* U+00a96f: */
-                                                     0, /* U+00a970: */
-                                                     0, /* U+00a971: */
-                                                     0, /* U+00a972: */
-                                                     0, /* U+00a973: */
-                                                     0, /* U+00a974: */
-                                                     0, /* U+00a975: */
-                                                     0, /* U+00a976: */
-                                                     0, /* U+00a977: */
-                                                     0, /* U+00a978: */
-                                                     0, /* U+00a979: */
-                                                     0, /* U+00a97a: */
-                                                     0, /* U+00a97b: */
-                                                     0, /* U+00a97c: */
-                                                     0, /* U+00a97d: */
-                                                     0, /* U+00a97e: */
-                                                     0, /* U+00a97f: */
-                                                     0, /* U+00a980: */
-                                                     0, /* U+00a981: */
-                                                     0, /* U+00a982: */
-                                                     0, /* U+00a983: */
-                                                     0, /* U+00a984: */
-                                                     0, /* U+00a985: */
-                                                     0, /* U+00a986: */
-                                                     0, /* U+00a987: */
-                                                     0, /* U+00a988: */
-                                                     0, /* U+00a989: */
-                                                     0, /* U+00a98a: */
-                                                     0, /* U+00a98b: */
-                                                     0, /* U+00a98c: */
-                                                     0, /* U+00a98d: */
-                                                     0, /* U+00a98e: */
-                                                     0, /* U+00a98f: */
-                                                     0, /* U+00a990: */
-                                                     0, /* U+00a991: */
-                                                     0, /* U+00a992: */
-                                                     0, /* U+00a993: */
-                                                     0, /* U+00a994: */
-                                                     0, /* U+00a995: */
-                                                     0, /* U+00a996: */
-                                                     0, /* U+00a997: */
-                                                     0, /* U+00a998: */
-                                                     0, /* U+00a999: */
-                                                     0, /* U+00a99a: */
-                                                     0, /* U+00a99b: */
-                                                     0, /* U+00a99c: */
-                                                     0, /* U+00a99d: */
-                                                     0, /* U+00a99e: */
-                                                     0, /* U+00a99f: */
-                                                     0, /* U+00a9a0: */
-                                                     0, /* U+00a9a1: */
-                                                     0, /* U+00a9a2: */
-                                                     0, /* U+00a9a3: */
-                                                     0, /* U+00a9a4: */
-                                                     0, /* U+00a9a5: */
-                                                     0, /* U+00a9a6: */
-                                                     0, /* U+00a9a7: */
-                                                     0, /* U+00a9a8: */
-                                                     0, /* U+00a9a9: */
-                                                     0, /* U+00a9aa: */
-                                                     0, /* U+00a9ab: */
-                                                     0, /* U+00a9ac: */
-                                                     0, /* U+00a9ad: */
-                                                     0, /* U+00a9ae: */
-                                                     0, /* U+00a9af: */
-                                                     0, /* U+00a9b0: */
-                                                     0, /* U+00a9b1: */
-                                                     0, /* U+00a9b2: */
-                                                     0, /* U+00a9b3: */
-                                                     0, /* U+00a9b4: */
-                                                     0, /* U+00a9b5: */
-                                                     0, /* U+00a9b6: */
-                                                     0, /* U+00a9b7: */
-                                                     0, /* U+00a9b8: */
-                                                     0, /* U+00a9b9: */
-                                                     0, /* U+00a9ba: */
-                                                     0, /* U+00a9bb: */
-                                                     0, /* U+00a9bc: */
-                                                     0, /* U+00a9bd: */
-                                                     0, /* U+00a9be: */
-                                                     0, /* U+00a9bf: */
-                                                     0, /* U+00a9c0: */
-                                                     0, /* U+00a9c1: */
-                                                     0, /* U+00a9c2: */
-                                                     0, /* U+00a9c3: */
-                                                     0, /* U+00a9c4: */
-                                                     0, /* U+00a9c5: */
-                                                     0, /* U+00a9c6: */
-                                                     0, /* U+00a9c7: */
-                                                     0, /* U+00a9c8: */
-                                                     0, /* U+00a9c9: */
-                                                     0, /* U+00a9ca: */
-                                                     0, /* U+00a9cb: */
-                                                     0, /* U+00a9cc: */
-                                                     0, /* U+00a9cd: */
-                                                     0, /* U+00a9ce: */
-                                                     0, /* U+00a9cf: */
-                                                     0, /* U+00a9d0: */
-                                                     0, /* U+00a9d1: */
-                                                     0, /* U+00a9d2: */
-                                                     0, /* U+00a9d3: */
-                                                     0, /* U+00a9d4: */
-                                                     0, /* U+00a9d5: */
-                                                     0, /* U+00a9d6: */
-                                                     0, /* U+00a9d7: */
-                                                     0, /* U+00a9d8: */
-                                                     0, /* U+00a9d9: */
-                                                     0, /* U+00a9da: */
-                                                     0, /* U+00a9db: */
-                                                     0, /* U+00a9dc: */
-                                                     0, /* U+00a9dd: */
-                                                     0, /* U+00a9de: */
-                                                     0, /* U+00a9df: */
-                                                     0, /* U+00a9e0: */
-                                                     0, /* U+00a9e1: */
-                                                     0, /* U+00a9e2: */
-                                                     0, /* U+00a9e3: */
-                                                     0, /* U+00a9e4: */
-                                                     0, /* U+00a9e5: */
-                                                     0, /* U+00a9e6: */
-                                                     0, /* U+00a9e7: */
-                                                     0, /* U+00a9e8: */
-                                                     0, /* U+00a9e9: */
-                                                     0, /* U+00a9ea: */
-                                                     0, /* U+00a9eb: */
-                                                     0, /* U+00a9ec: */
-                                                     0, /* U+00a9ed: */
-                                                     0, /* U+00a9ee: */
-                                                     0, /* U+00a9ef: */
-                                                     0, /* U+00a9f0: */
-                                                     0, /* U+00a9f1: */
-                                                     0, /* U+00a9f2: */
-                                                     0, /* U+00a9f3: */
-                                                     0, /* U+00a9f4: */
-                                                     0, /* U+00a9f5: */
-                                                     0, /* U+00a9f6: */
-                                                     0, /* U+00a9f7: */
-                                                     0, /* U+00a9f8: */
-                                                     0, /* U+00a9f9: */
-                                                     0, /* U+00a9fa: */
-                                                     0, /* U+00a9fb: */
-                                                     0, /* U+00a9fc: */
-                                                     0, /* U+00a9fd: */
-                                                     0, /* U+00a9fe: */
-                                                     0, /* U+00a9ff: */
-                                                     0, /* U+00aa00: */
-                                                     0, /* U+00aa01: */
-                                                     0, /* U+00aa02: */
-                                                     0, /* U+00aa03: */
-                                                     0, /* U+00aa04: */
-                                                     0, /* U+00aa05: */
-                                                     0, /* U+00aa06: */
-                                                     0, /* U+00aa07: */
-                                                     0, /* U+00aa08: */
-                                                     0, /* U+00aa09: */
-                                                     0, /* U+00aa0a: */
-                                                     0, /* U+00aa0b: */
-                                                     0, /* U+00aa0c: */
-                                                     0, /* U+00aa0d: */
-                                                     0, /* U+00aa0e: */
-                                                     0, /* U+00aa0f: */
-                                                     0, /* U+00aa10: */
-                                                     0, /* U+00aa11: */
-                                                     0, /* U+00aa12: */
-                                                     0, /* U+00aa13: */
-                                                     0, /* U+00aa14: */
-                                                     0, /* U+00aa15: */
-                                                     0, /* U+00aa16: */
-                                                     0, /* U+00aa17: */
-                                                     0, /* U+00aa18: */
-                                                     0, /* U+00aa19: */
-                                                     0, /* U+00aa1a: */
-                                                     0, /* U+00aa1b: */
-                                                     0, /* U+00aa1c: */
-                                                     0, /* U+00aa1d: */
-                                                     0, /* U+00aa1e: */
-                                                     0, /* U+00aa1f: */
-                                                     0, /* U+00aa20: */
-                                                     0, /* U+00aa21: */
-                                                     0, /* U+00aa22: */
-                                                     0, /* U+00aa23: */
-                                                     0, /* U+00aa24: */
-                                                     0, /* U+00aa25: */
-                                                     0, /* U+00aa26: */
-                                                     0, /* U+00aa27: */
-                                                     0, /* U+00aa28: */
-                                                     0, /* U+00aa29: */
-                                                     0, /* U+00aa2a: */
-                                                     0, /* U+00aa2b: */
-                                                     0, /* U+00aa2c: */
-                                                     0, /* U+00aa2d: */
-                                                     0, /* U+00aa2e: */
-                                                     0, /* U+00aa2f: */
-                                                     0, /* U+00aa30: */
-                                                     0, /* U+00aa31: */
-                                                     0, /* U+00aa32: */
-                                                     0, /* U+00aa33: */
-                                                     0, /* U+00aa34: */
-                                                     0, /* U+00aa35: */
-                                                     0, /* U+00aa36: */
-                                                     0, /* U+00aa37: */
-                                                     0, /* U+00aa38: */
-                                                     0, /* U+00aa39: */
-                                                     0, /* U+00aa3a: */
-                                                     0, /* U+00aa3b: */
-                                                     0, /* U+00aa3c: */
-                                                     0, /* U+00aa3d: */
-                                                     0, /* U+00aa3e: */
-                                                     0, /* U+00aa3f: */
-                                                     0, /* U+00aa40: */
-                                                     0, /* U+00aa41: */
-                                                     0, /* U+00aa42: */
-                                                     0, /* U+00aa43: */
-                                                     0, /* U+00aa44: */
-                                                     0, /* U+00aa45: */
-                                                     0, /* U+00aa46: */
-                                                     0, /* U+00aa47: */
-                                                     0, /* U+00aa48: */
-                                                     0, /* U+00aa49: */
-                                                     0, /* U+00aa4a: */
-                                                     0, /* U+00aa4b: */
-                                                     0, /* U+00aa4c: */
-                                                     0, /* U+00aa4d: */
-                                                     0, /* U+00aa4e: */
-                                                     0, /* U+00aa4f: */
-                                                     0, /* U+00aa50: */
-                                                     0, /* U+00aa51: */
-                                                     0, /* U+00aa52: */
-                                                     0, /* U+00aa53: */
-                                                     0, /* U+00aa54: */
-                                                     0, /* U+00aa55: */
-                                                     0, /* U+00aa56: */
-                                                     0, /* U+00aa57: */
-                                                     0, /* U+00aa58: */
-                                                     0, /* U+00aa59: */
-                                                     0, /* U+00aa5a: */
-                                                     0, /* U+00aa5b: */
-                                                     0, /* U+00aa5c: */
-                                                     0, /* U+00aa5d: */
-                                                     0, /* U+00aa5e: */
-                                                     0, /* U+00aa5f: */
-                                                     0, /* U+00aa60: */
-                                                     0, /* U+00aa61: */
-                                                     0, /* U+00aa62: */
-                                                     0, /* U+00aa63: */
-                                                     0, /* U+00aa64: */
-                                                     0, /* U+00aa65: */
-                                                     0, /* U+00aa66: */
-                                                     0, /* U+00aa67: */
-                                                     0, /* U+00aa68: */
-                                                     0, /* U+00aa69: */
-                                                     0, /* U+00aa6a: */
-                                                     0, /* U+00aa6b: */
-                                                     0, /* U+00aa6c: */
-                                                     0, /* U+00aa6d: */
-                                                     0, /* U+00aa6e: */
-                                                     0, /* U+00aa6f: */
-                                                     0, /* U+00aa70: */
-                                                     0, /* U+00aa71: */
-                                                     0, /* U+00aa72: */
-                                                     0, /* U+00aa73: */
-                                                     0, /* U+00aa74: */
-                                                     0, /* U+00aa75: */
-                                                     0, /* U+00aa76: */
-                                                     0, /* U+00aa77: */
-                                                     0, /* U+00aa78: */
-                                                     0, /* U+00aa79: */
-                                                     0, /* U+00aa7a: */
-                                                     0, /* U+00aa7b: */
-                                                     0, /* U+00aa7c: */
-                                                     0, /* U+00aa7d: */
-                                                     0, /* U+00aa7e: */
-                                                     0, /* U+00aa7f: */
-                                                     0, /* U+00aa80: */
-                                                     0, /* U+00aa81: */
-                                                     0, /* U+00aa82: */
-                                                     0, /* U+00aa83: */
-                                                     0, /* U+00aa84: */
-                                                     0, /* U+00aa85: */
-                                                     0, /* U+00aa86: */
-                                                     0, /* U+00aa87: */
-                                                     0, /* U+00aa88: */
-                                                     0, /* U+00aa89: */
-                                                     0, /* U+00aa8a: */
-                                                     0, /* U+00aa8b: */
-                                                     0, /* U+00aa8c: */
-                                                     0, /* U+00aa8d: */
-                                                     0, /* U+00aa8e: */
-                                                     0, /* U+00aa8f: */
-                                                     0, /* U+00aa90: */
-                                                     0, /* U+00aa91: */
-                                                     0, /* U+00aa92: */
-                                                     0, /* U+00aa93: */
-                                                     0, /* U+00aa94: */
-                                                     0, /* U+00aa95: */
-                                                     0, /* U+00aa96: */
-                                                     0, /* U+00aa97: */
-                                                     0, /* U+00aa98: */
-                                                     0, /* U+00aa99: */
-                                                     0, /* U+00aa9a: */
-                                                     0, /* U+00aa9b: */
-                                                     0, /* U+00aa9c: */
-                                                     0, /* U+00aa9d: */
-                                                     0, /* U+00aa9e: */
-                                                     0, /* U+00aa9f: */
-                                                     0, /* U+00aaa0: */
-                                                     0, /* U+00aaa1: */
-                                                     0, /* U+00aaa2: */
-                                                     0, /* U+00aaa3: */
-                                                     0, /* U+00aaa4: */
-                                                     0, /* U+00aaa5: */
-                                                     0, /* U+00aaa6: */
-                                                     0, /* U+00aaa7: */
-                                                     0, /* U+00aaa8: */
-                                                     0, /* U+00aaa9: */
-                                                     0, /* U+00aaaa: */
-                                                     0, /* U+00aaab: */
-                                                     0, /* U+00aaac: */
-                                                     0, /* U+00aaad: */
-                                                     0, /* U+00aaae: */
-                                                     0, /* U+00aaaf: */
-                                                     0, /* U+00aab0: */
-                                                     0, /* U+00aab1: */
-                                                     0, /* U+00aab2: */
-                                                     0, /* U+00aab3: */
-                                                     0, /* U+00aab4: */
-                                                     0, /* U+00aab5: */
-                                                     0, /* U+00aab6: */
-                                                     0, /* U+00aab7: */
-                                                     0, /* U+00aab8: */
-                                                     0, /* U+00aab9: */
-                                                     0, /* U+00aaba: */
-                                                     0, /* U+00aabb: */
-                                                     0, /* U+00aabc: */
-                                                     0, /* U+00aabd: */
-                                                     0, /* U+00aabe: */
-                                                     0, /* U+00aabf: */
-                                                     0, /* U+00aac0: */
-                                                     0, /* U+00aac1: */
-                                                     0, /* U+00aac2: */
-                                                     0, /* U+00aac3: */
-                                                     0, /* U+00aac4: */
-                                                     0, /* U+00aac5: */
-                                                     0, /* U+00aac6: */
-                                                     0, /* U+00aac7: */
-                                                     0, /* U+00aac8: */
-                                                     0, /* U+00aac9: */
-                                                     0, /* U+00aaca: */
-                                                     0, /* U+00aacb: */
-                                                     0, /* U+00aacc: */
-                                                     0, /* U+00aacd: */
-                                                     0, /* U+00aace: */
-                                                     0, /* U+00aacf: */
-                                                     0, /* U+00aad0: */
-                                                     0, /* U+00aad1: */
-                                                     0, /* U+00aad2: */
-                                                     0, /* U+00aad3: */
-                                                     0, /* U+00aad4: */
-                                                     0, /* U+00aad5: */
-                                                     0, /* U+00aad6: */
-                                                     0, /* U+00aad7: */
-                                                     0, /* U+00aad8: */
-                                                     0, /* U+00aad9: */
-                                                     0, /* U+00aada: */
-                                                     0, /* U+00aadb: */
-                                                     0, /* U+00aadc: */
-                                                     0, /* U+00aadd: */
-                                                     0, /* U+00aade: */
-                                                     0, /* U+00aadf: */
-                                                     0, /* U+00aae0: */
-                                                     0, /* U+00aae1: */
-                                                     0, /* U+00aae2: */
-                                                     0, /* U+00aae3: */
-                                                     0, /* U+00aae4: */
-                                                     0, /* U+00aae5: */
-                                                     0, /* U+00aae6: */
-                                                     0, /* U+00aae7: */
-                                                     0, /* U+00aae8: */
-                                                     0, /* U+00aae9: */
-                                                     0, /* U+00aaea: */
-                                                     0, /* U+00aaeb: */
-                                                     0, /* U+00aaec: */
-                                                     0, /* U+00aaed: */
-                                                     0, /* U+00aaee: */
-                                                     0, /* U+00aaef: */
-                                                     0, /* U+00aaf0: */
-                                                     0, /* U+00aaf1: */
-                                                     0, /* U+00aaf2: */
-                                                     0, /* U+00aaf3: */
-                                                     0, /* U+00aaf4: */
-                                                     0, /* U+00aaf5: */
-                                                     0, /* U+00aaf6: */
-                                                     0, /* U+00aaf7: */
-                                                     0, /* U+00aaf8: */
-                                                     0, /* U+00aaf9: */
-                                                     0, /* U+00aafa: */
-                                                     0, /* U+00aafb: */
-                                                     0, /* U+00aafc: */
-                                                     0, /* U+00aafd: */
-                                                     0, /* U+00aafe: */
-                                                     0, /* U+00aaff: */
-                                                     0, /* U+00ab00: */
-                                                     0, /* U+00ab01: */
-                                                     0, /* U+00ab02: */
-                                                     0, /* U+00ab03: */
-                                                     0, /* U+00ab04: */
-                                                     0, /* U+00ab05: */
-                                                     0, /* U+00ab06: */
-                                                     0, /* U+00ab07: */
-                                                     0, /* U+00ab08: */
-                                                     0, /* U+00ab09: */
-                                                     0, /* U+00ab0a: */
-                                                     0, /* U+00ab0b: */
-                                                     0, /* U+00ab0c: */
-                                                     0, /* U+00ab0d: */
-                                                     0, /* U+00ab0e: */
-                                                     0, /* U+00ab0f: */
-                                                     0, /* U+00ab10: */
-                                                     0, /* U+00ab11: */
-                                                     0, /* U+00ab12: */
-                                                     0, /* U+00ab13: */
-                                                     0, /* U+00ab14: */
-                                                     0, /* U+00ab15: */
-                                                     0, /* U+00ab16: */
-                                                     0, /* U+00ab17: */
-                                                     0, /* U+00ab18: */
-                                                     0, /* U+00ab19: */
-                                                     0, /* U+00ab1a: */
-                                                     0, /* U+00ab1b: */
-                                                     0, /* U+00ab1c: */
-                                                     0, /* U+00ab1d: */
-                                                     0, /* U+00ab1e: */
-                                                     0, /* U+00ab1f: */
-                                                     0, /* U+00ab20: */
-                                                     0, /* U+00ab21: */
-                                                     0, /* U+00ab22: */
-                                                     0, /* U+00ab23: */
-                                                     0, /* U+00ab24: */
-                                                     0, /* U+00ab25: */
-                                                     0, /* U+00ab26: */
-                                                     0, /* U+00ab27: */
-                                                     0, /* U+00ab28: */
-                                                     0, /* U+00ab29: */
-                                                     0, /* U+00ab2a: */
-                                                     0, /* U+00ab2b: */
-                                                     0, /* U+00ab2c: */
-                                                     0, /* U+00ab2d: */
-                                                     0, /* U+00ab2e: */
-                                                     0, /* U+00ab2f: */
-                                                     0, /* U+00ab30: */
-                                                     0, /* U+00ab31: */
-                                                     0, /* U+00ab32: */
-                                                     0, /* U+00ab33: */
-                                                     0, /* U+00ab34: */
-                                                     0, /* U+00ab35: */
-                                                     0, /* U+00ab36: */
-                                                     0, /* U+00ab37: */
-                                                     0, /* U+00ab38: */
-                                                     0, /* U+00ab39: */
-                                                     0, /* U+00ab3a: */
-                                                     0, /* U+00ab3b: */
-                                                     0, /* U+00ab3c: */
-                                                     0, /* U+00ab3d: */
-                                                     0, /* U+00ab3e: */
-                                                     0, /* U+00ab3f: */
-                                                     0, /* U+00ab40: */
-                                                     0, /* U+00ab41: */
-                                                     0, /* U+00ab42: */
-                                                     0, /* U+00ab43: */
-                                                     0, /* U+00ab44: */
-                                                     0, /* U+00ab45: */
-                                                     0, /* U+00ab46: */
-                                                     0, /* U+00ab47: */
-                                                     0, /* U+00ab48: */
-                                                     0, /* U+00ab49: */
-                                                     0, /* U+00ab4a: */
-                                                     0, /* U+00ab4b: */
-                                                     0, /* U+00ab4c: */
-                                                     0, /* U+00ab4d: */
-                                                     0, /* U+00ab4e: */
-                                                     0, /* U+00ab4f: */
-                                                     0, /* U+00ab50: */
-                                                     0, /* U+00ab51: */
-                                                     0, /* U+00ab52: */
-                                                     0, /* U+00ab53: */
-                                                     0, /* U+00ab54: */
-                                                     0, /* U+00ab55: */
-                                                     0, /* U+00ab56: */
-                                                     0, /* U+00ab57: */
-                                                     0, /* U+00ab58: */
-                                                     0, /* U+00ab59: */
-                                                     0, /* U+00ab5a: */
-                                                     0, /* U+00ab5b: */
-                                                     0, /* U+00ab5c: */
-                                                     0, /* U+00ab5d: */
-                                                     0, /* U+00ab5e: */
-                                                     0, /* U+00ab5f: */
-                                                     0, /* U+00ab60: */
-                                                     0, /* U+00ab61: */
-                                                     0, /* U+00ab62: */
-                                                     0, /* U+00ab63: */
-                                                     0, /* U+00ab64: */
-                                                     0, /* U+00ab65: */
-                                                     0, /* U+00ab66: */
-                                                     0, /* U+00ab67: */
-                                                     0, /* U+00ab68: */
-                                                     0, /* U+00ab69: */
-                                                     0, /* U+00ab6a: */
-                                                     0, /* U+00ab6b: */
-                                                     0, /* U+00ab6c: */
-                                                     0, /* U+00ab6d: */
-                                                     0, /* U+00ab6e: */
-                                                     0, /* U+00ab6f: */
-                                                     0, /* U+00ab70: */
-                                                     0, /* U+00ab71: */
-                                                     0, /* U+00ab72: */
-                                                     0, /* U+00ab73: */
-                                                     0, /* U+00ab74: */
-                                                     0, /* U+00ab75: */
-                                                     0, /* U+00ab76: */
-                                                     0, /* U+00ab77: */
-                                                     0, /* U+00ab78: */
-                                                     0, /* U+00ab79: */
-                                                     0, /* U+00ab7a: */
-                                                     0, /* U+00ab7b: */
-                                                     0, /* U+00ab7c: */
-                                                     0, /* U+00ab7d: */
-                                                     0, /* U+00ab7e: */
-                                                     0, /* U+00ab7f: */
-                                                     0, /* U+00ab80: */
-                                                     0, /* U+00ab81: */
-                                                     0, /* U+00ab82: */
-                                                     0, /* U+00ab83: */
-                                                     0, /* U+00ab84: */
-                                                     0, /* U+00ab85: */
-                                                     0, /* U+00ab86: */
-                                                     0, /* U+00ab87: */
-                                                     0, /* U+00ab88: */
-                                                     0, /* U+00ab89: */
-                                                     0, /* U+00ab8a: */
-                                                     0, /* U+00ab8b: */
-                                                     0, /* U+00ab8c: */
-                                                     0, /* U+00ab8d: */
-                                                     0, /* U+00ab8e: */
-                                                     0, /* U+00ab8f: */
-                                                     0, /* U+00ab90: */
-                                                     0, /* U+00ab91: */
-                                                     0, /* U+00ab92: */
-                                                     0, /* U+00ab93: */
-                                                     0, /* U+00ab94: */
-                                                     0, /* U+00ab95: */
-                                                     0, /* U+00ab96: */
-                                                     0, /* U+00ab97: */
-                                                     0, /* U+00ab98: */
-                                                     0, /* U+00ab99: */
-                                                     0, /* U+00ab9a: */
-                                                     0, /* U+00ab9b: */
-                                                     0, /* U+00ab9c: */
-                                                     0, /* U+00ab9d: */
-                                                     0, /* U+00ab9e: */
-                                                     0, /* U+00ab9f: */
-                                                     0, /* U+00aba0: */
-                                                     0, /* U+00aba1: */
-                                                     0, /* U+00aba2: */
-                                                     0, /* U+00aba3: */
-                                                     0, /* U+00aba4: */
-                                                     0, /* U+00aba5: */
-                                                     0, /* U+00aba6: */
-                                                     0, /* U+00aba7: */
-                                                     0, /* U+00aba8: */
-                                                     0, /* U+00aba9: */
-                                                     0, /* U+00abaa: */
-                                                     0, /* U+00abab: */
-                                                     0, /* U+00abac: */
-                                                     0, /* U+00abad: */
-                                                     0, /* U+00abae: */
-                                                     0, /* U+00abaf: */
-                                                     0, /* U+00abb0: */
-                                                     0, /* U+00abb1: */
-                                                     0, /* U+00abb2: */
-                                                     0, /* U+00abb3: */
-                                                     0, /* U+00abb4: */
-                                                     0, /* U+00abb5: */
-                                                     0, /* U+00abb6: */
-                                                     0, /* U+00abb7: */
-                                                     0, /* U+00abb8: */
-                                                     0, /* U+00abb9: */
-                                                     0, /* U+00abba: */
-                                                     0, /* U+00abbb: */
-                                                     0, /* U+00abbc: */
-                                                     0, /* U+00abbd: */
-                                                     0, /* U+00abbe: */
-                                                     0, /* U+00abbf: */
-                                                     0, /* U+00abc0: */
-                                                     0, /* U+00abc1: */
-                                                     0, /* U+00abc2: */
-                                                     0, /* U+00abc3: */
-                                                     0, /* U+00abc4: */
-                                                     0, /* U+00abc5: */
-                                                     0, /* U+00abc6: */
-                                                     0, /* U+00abc7: */
-                                                     0, /* U+00abc8: */
-                                                     0, /* U+00abc9: */
-                                                     0, /* U+00abca: */
-                                                     0, /* U+00abcb: */
-                                                     0, /* U+00abcc: */
-                                                     0, /* U+00abcd: */
-                                                     0, /* U+00abce: */
-                                                     0, /* U+00abcf: */
-                                                     0, /* U+00abd0: */
-                                                     0, /* U+00abd1: */
-                                                     0, /* U+00abd2: */
-                                                     0, /* U+00abd3: */
-                                                     0, /* U+00abd4: */
-                                                     0, /* U+00abd5: */
-                                                     0, /* U+00abd6: */
-                                                     0, /* U+00abd7: */
-                                                     0, /* U+00abd8: */
-                                                     0, /* U+00abd9: */
-                                                     0, /* U+00abda: */
-                                                     0, /* U+00abdb: */
-                                                     0, /* U+00abdc: */
-                                                     0, /* U+00abdd: */
-                                                     0, /* U+00abde: */
-                                                     0, /* U+00abdf: */
-                                                     0, /* U+00abe0: */
-                                                     0, /* U+00abe1: */
-                                                     0, /* U+00abe2: */
-                                                     0, /* U+00abe3: */
-                                                     0, /* U+00abe4: */
-                                                     0, /* U+00abe5: */
-                                                     0, /* U+00abe6: */
-                                                     0, /* U+00abe7: */
-                                                     0, /* U+00abe8: */
-                                                     0, /* U+00abe9: */
-                                                     0, /* U+00abea: */
-                                                     0, /* U+00abeb: */
-                                                     0, /* U+00abec: */
-                                                     0, /* U+00abed: */
-                                                     0, /* U+00abee: */
-                                                     0, /* U+00abef: */
-                                                     0, /* U+00abf0: */
-                                                     0, /* U+00abf1: */
-                                                     0, /* U+00abf2: */
-                                                     0, /* U+00abf3: */
-                                                     0, /* U+00abf4: */
-                                                     0, /* U+00abf5: */
-                                                     0, /* U+00abf6: */
-                                                     0, /* U+00abf7: */
-                                                     0, /* U+00abf8: */
-                                                     0, /* U+00abf9: */
-                                                     0, /* U+00abfa: */
-                                                     0, /* U+00abfb: */
-                                                     0, /* U+00abfc: */
-                                                     0, /* U+00abfd: */
-                                                     0, /* U+00abfe: */
-                                                     0, /* U+00abff: */
-                                           RTUNI_ALPHA, /* U+00ac00: <Hangul Syllable, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x00d7a3[] =
-{
-                                           RTUNI_ALPHA, /* U+00d7a3: <Hangul Syllable, Last>*/
-};
-
-static const uint8_t g_afRTUniFlags0x00f900[] =
-{
-                                           RTUNI_ALPHA, /* U+00f900: CJK COMPATIBILITY IDEOGRAPH-F900*/
-                                           RTUNI_ALPHA, /* U+00f901: CJK COMPATIBILITY IDEOGRAPH-F901*/
-                                           RTUNI_ALPHA, /* U+00f902: CJK COMPATIBILITY IDEOGRAPH-F902*/
-                                           RTUNI_ALPHA, /* U+00f903: CJK COMPATIBILITY IDEOGRAPH-F903*/
-                                           RTUNI_ALPHA, /* U+00f904: CJK COMPATIBILITY IDEOGRAPH-F904*/
-                                           RTUNI_ALPHA, /* U+00f905: CJK COMPATIBILITY IDEOGRAPH-F905*/
-                                           RTUNI_ALPHA, /* U+00f906: CJK COMPATIBILITY IDEOGRAPH-F906*/
-                                           RTUNI_ALPHA, /* U+00f907: CJK COMPATIBILITY IDEOGRAPH-F907*/
-                                           RTUNI_ALPHA, /* U+00f908: CJK COMPATIBILITY IDEOGRAPH-F908*/
-                                           RTUNI_ALPHA, /* U+00f909: CJK COMPATIBILITY IDEOGRAPH-F909*/
-                                           RTUNI_ALPHA, /* U+00f90a: CJK COMPATIBILITY IDEOGRAPH-F90A*/
-                                           RTUNI_ALPHA, /* U+00f90b: CJK COMPATIBILITY IDEOGRAPH-F90B*/
-                                           RTUNI_ALPHA, /* U+00f90c: CJK COMPATIBILITY IDEOGRAPH-F90C*/
-                                           RTUNI_ALPHA, /* U+00f90d: CJK COMPATIBILITY IDEOGRAPH-F90D*/
-                                           RTUNI_ALPHA, /* U+00f90e: CJK COMPATIBILITY IDEOGRAPH-F90E*/
-                                           RTUNI_ALPHA, /* U+00f90f: CJK COMPATIBILITY IDEOGRAPH-F90F*/
-                                           RTUNI_ALPHA, /* U+00f910: CJK COMPATIBILITY IDEOGRAPH-F910*/
-                                           RTUNI_ALPHA, /* U+00f911: CJK COMPATIBILITY IDEOGRAPH-F911*/
-                                           RTUNI_ALPHA, /* U+00f912: CJK COMPATIBILITY IDEOGRAPH-F912*/
-                                           RTUNI_ALPHA, /* U+00f913: CJK COMPATIBILITY IDEOGRAPH-F913*/
-                                           RTUNI_ALPHA, /* U+00f914: CJK COMPATIBILITY IDEOGRAPH-F914*/
-                                           RTUNI_ALPHA, /* U+00f915: CJK COMPATIBILITY IDEOGRAPH-F915*/
-                                           RTUNI_ALPHA, /* U+00f916: CJK COMPATIBILITY IDEOGRAPH-F916*/
-                                           RTUNI_ALPHA, /* U+00f917: CJK COMPATIBILITY IDEOGRAPH-F917*/
-                                           RTUNI_ALPHA, /* U+00f918: CJK COMPATIBILITY IDEOGRAPH-F918*/
-                                           RTUNI_ALPHA, /* U+00f919: CJK COMPATIBILITY IDEOGRAPH-F919*/
-                                           RTUNI_ALPHA, /* U+00f91a: CJK COMPATIBILITY IDEOGRAPH-F91A*/
-                                           RTUNI_ALPHA, /* U+00f91b: CJK COMPATIBILITY IDEOGRAPH-F91B*/
-                                           RTUNI_ALPHA, /* U+00f91c: CJK COMPATIBILITY IDEOGRAPH-F91C*/
-                                           RTUNI_ALPHA, /* U+00f91d: CJK COMPATIBILITY IDEOGRAPH-F91D*/
-                                           RTUNI_ALPHA, /* U+00f91e: CJK COMPATIBILITY IDEOGRAPH-F91E*/
-                                           RTUNI_ALPHA, /* U+00f91f: CJK COMPATIBILITY IDEOGRAPH-F91F*/
-                                           RTUNI_ALPHA, /* U+00f920: CJK COMPATIBILITY IDEOGRAPH-F920*/
-                                           RTUNI_ALPHA, /* U+00f921: CJK COMPATIBILITY IDEOGRAPH-F921*/
-                                           RTUNI_ALPHA, /* U+00f922: CJK COMPATIBILITY IDEOGRAPH-F922*/
-                                           RTUNI_ALPHA, /* U+00f923: CJK COMPATIBILITY IDEOGRAPH-F923*/
-                                           RTUNI_ALPHA, /* U+00f924: CJK COMPATIBILITY IDEOGRAPH-F924*/
-                                           RTUNI_ALPHA, /* U+00f925: CJK COMPATIBILITY IDEOGRAPH-F925*/
-                                           RTUNI_ALPHA, /* U+00f926: CJK COMPATIBILITY IDEOGRAPH-F926*/
-                                           RTUNI_ALPHA, /* U+00f927: CJK COMPATIBILITY IDEOGRAPH-F927*/
-                                           RTUNI_ALPHA, /* U+00f928: CJK COMPATIBILITY IDEOGRAPH-F928*/
-                                           RTUNI_ALPHA, /* U+00f929: CJK COMPATIBILITY IDEOGRAPH-F929*/
-                                           RTUNI_ALPHA, /* U+00f92a: CJK COMPATIBILITY IDEOGRAPH-F92A*/
-                                           RTUNI_ALPHA, /* U+00f92b: CJK COMPATIBILITY IDEOGRAPH-F92B*/
-                                           RTUNI_ALPHA, /* U+00f92c: CJK COMPATIBILITY IDEOGRAPH-F92C*/
-                                           RTUNI_ALPHA, /* U+00f92d: CJK COMPATIBILITY IDEOGRAPH-F92D*/
-                                           RTUNI_ALPHA, /* U+00f92e: CJK COMPATIBILITY IDEOGRAPH-F92E*/
-                                           RTUNI_ALPHA, /* U+00f92f: CJK COMPATIBILITY IDEOGRAPH-F92F*/
-                                           RTUNI_ALPHA, /* U+00f930: CJK COMPATIBILITY IDEOGRAPH-F930*/
-                                           RTUNI_ALPHA, /* U+00f931: CJK COMPATIBILITY IDEOGRAPH-F931*/
-                                           RTUNI_ALPHA, /* U+00f932: CJK COMPATIBILITY IDEOGRAPH-F932*/
-                                           RTUNI_ALPHA, /* U+00f933: CJK COMPATIBILITY IDEOGRAPH-F933*/
-                                           RTUNI_ALPHA, /* U+00f934: CJK COMPATIBILITY IDEOGRAPH-F934*/
-                                           RTUNI_ALPHA, /* U+00f935: CJK COMPATIBILITY IDEOGRAPH-F935*/
-                                           RTUNI_ALPHA, /* U+00f936: CJK COMPATIBILITY IDEOGRAPH-F936*/
-                                           RTUNI_ALPHA, /* U+00f937: CJK COMPATIBILITY IDEOGRAPH-F937*/
-                                           RTUNI_ALPHA, /* U+00f938: CJK COMPATIBILITY IDEOGRAPH-F938*/
-                                           RTUNI_ALPHA, /* U+00f939: CJK COMPATIBILITY IDEOGRAPH-F939*/
-                                           RTUNI_ALPHA, /* U+00f93a: CJK COMPATIBILITY IDEOGRAPH-F93A*/
-                                           RTUNI_ALPHA, /* U+00f93b: CJK COMPATIBILITY IDEOGRAPH-F93B*/
-                                           RTUNI_ALPHA, /* U+00f93c: CJK COMPATIBILITY IDEOGRAPH-F93C*/
-                                           RTUNI_ALPHA, /* U+00f93d: CJK COMPATIBILITY IDEOGRAPH-F93D*/
-                                           RTUNI_ALPHA, /* U+00f93e: CJK COMPATIBILITY IDEOGRAPH-F93E*/
-                                           RTUNI_ALPHA, /* U+00f93f: CJK COMPATIBILITY IDEOGRAPH-F93F*/
-                                           RTUNI_ALPHA, /* U+00f940: CJK COMPATIBILITY IDEOGRAPH-F940*/
-                                           RTUNI_ALPHA, /* U+00f941: CJK COMPATIBILITY IDEOGRAPH-F941*/
-                                           RTUNI_ALPHA, /* U+00f942: CJK COMPATIBILITY IDEOGRAPH-F942*/
-                                           RTUNI_ALPHA, /* U+00f943: CJK COMPATIBILITY IDEOGRAPH-F943*/
-                                           RTUNI_ALPHA, /* U+00f944: CJK COMPATIBILITY IDEOGRAPH-F944*/
-                                           RTUNI_ALPHA, /* U+00f945: CJK COMPATIBILITY IDEOGRAPH-F945*/
-                                           RTUNI_ALPHA, /* U+00f946: CJK COMPATIBILITY IDEOGRAPH-F946*/
-                                           RTUNI_ALPHA, /* U+00f947: CJK COMPATIBILITY IDEOGRAPH-F947*/
-                                           RTUNI_ALPHA, /* U+00f948: CJK COMPATIBILITY IDEOGRAPH-F948*/
-                                           RTUNI_ALPHA, /* U+00f949: CJK COMPATIBILITY IDEOGRAPH-F949*/
-                                           RTUNI_ALPHA, /* U+00f94a: CJK COMPATIBILITY IDEOGRAPH-F94A*/
-                                           RTUNI_ALPHA, /* U+00f94b: CJK COMPATIBILITY IDEOGRAPH-F94B*/
-                                           RTUNI_ALPHA, /* U+00f94c: CJK COMPATIBILITY IDEOGRAPH-F94C*/
-                                           RTUNI_ALPHA, /* U+00f94d: CJK COMPATIBILITY IDEOGRAPH-F94D*/
-                                           RTUNI_ALPHA, /* U+00f94e: CJK COMPATIBILITY IDEOGRAPH-F94E*/
-                                           RTUNI_ALPHA, /* U+00f94f: CJK COMPATIBILITY IDEOGRAPH-F94F*/
-                                           RTUNI_ALPHA, /* U+00f950: CJK COMPATIBILITY IDEOGRAPH-F950*/
-                                           RTUNI_ALPHA, /* U+00f951: CJK COMPATIBILITY IDEOGRAPH-F951*/
-                                           RTUNI_ALPHA, /* U+00f952: CJK COMPATIBILITY IDEOGRAPH-F952*/
-                                           RTUNI_ALPHA, /* U+00f953: CJK COMPATIBILITY IDEOGRAPH-F953*/
-                                           RTUNI_ALPHA, /* U+00f954: CJK COMPATIBILITY IDEOGRAPH-F954*/
-                                           RTUNI_ALPHA, /* U+00f955: CJK COMPATIBILITY IDEOGRAPH-F955*/
-                                           RTUNI_ALPHA, /* U+00f956: CJK COMPATIBILITY IDEOGRAPH-F956*/
-                                           RTUNI_ALPHA, /* U+00f957: CJK COMPATIBILITY IDEOGRAPH-F957*/
-                                           RTUNI_ALPHA, /* U+00f958: CJK COMPATIBILITY IDEOGRAPH-F958*/
-                                           RTUNI_ALPHA, /* U+00f959: CJK COMPATIBILITY IDEOGRAPH-F959*/
-                                           RTUNI_ALPHA, /* U+00f95a: CJK COMPATIBILITY IDEOGRAPH-F95A*/
-                                           RTUNI_ALPHA, /* U+00f95b: CJK COMPATIBILITY IDEOGRAPH-F95B*/
-                                           RTUNI_ALPHA, /* U+00f95c: CJK COMPATIBILITY IDEOGRAPH-F95C*/
-                                           RTUNI_ALPHA, /* U+00f95d: CJK COMPATIBILITY IDEOGRAPH-F95D*/
-                                           RTUNI_ALPHA, /* U+00f95e: CJK COMPATIBILITY IDEOGRAPH-F95E*/
-                                           RTUNI_ALPHA, /* U+00f95f: CJK COMPATIBILITY IDEOGRAPH-F95F*/
-                                           RTUNI_ALPHA, /* U+00f960: CJK COMPATIBILITY IDEOGRAPH-F960*/
-                                           RTUNI_ALPHA, /* U+00f961: CJK COMPATIBILITY IDEOGRAPH-F961*/
-                                           RTUNI_ALPHA, /* U+00f962: CJK COMPATIBILITY IDEOGRAPH-F962*/
-                                           RTUNI_ALPHA, /* U+00f963: CJK COMPATIBILITY IDEOGRAPH-F963*/
-                                           RTUNI_ALPHA, /* U+00f964: CJK COMPATIBILITY IDEOGRAPH-F964*/
-                                           RTUNI_ALPHA, /* U+00f965: CJK COMPATIBILITY IDEOGRAPH-F965*/
-                                           RTUNI_ALPHA, /* U+00f966: CJK COMPATIBILITY IDEOGRAPH-F966*/
-                                           RTUNI_ALPHA, /* U+00f967: CJK COMPATIBILITY IDEOGRAPH-F967*/
-                                           RTUNI_ALPHA, /* U+00f968: CJK COMPATIBILITY IDEOGRAPH-F968*/
-                                           RTUNI_ALPHA, /* U+00f969: CJK COMPATIBILITY IDEOGRAPH-F969*/
-                                           RTUNI_ALPHA, /* U+00f96a: CJK COMPATIBILITY IDEOGRAPH-F96A*/
-                                           RTUNI_ALPHA, /* U+00f96b: CJK COMPATIBILITY IDEOGRAPH-F96B*/
-                                           RTUNI_ALPHA, /* U+00f96c: CJK COMPATIBILITY IDEOGRAPH-F96C*/
-                                           RTUNI_ALPHA, /* U+00f96d: CJK COMPATIBILITY IDEOGRAPH-F96D*/
-                                           RTUNI_ALPHA, /* U+00f96e: CJK COMPATIBILITY IDEOGRAPH-F96E*/
-                                           RTUNI_ALPHA, /* U+00f96f: CJK COMPATIBILITY IDEOGRAPH-F96F*/
-                                           RTUNI_ALPHA, /* U+00f970: CJK COMPATIBILITY IDEOGRAPH-F970*/
-                                           RTUNI_ALPHA, /* U+00f971: CJK COMPATIBILITY IDEOGRAPH-F971*/
-                                           RTUNI_ALPHA, /* U+00f972: CJK COMPATIBILITY IDEOGRAPH-F972*/
-                                           RTUNI_ALPHA, /* U+00f973: CJK COMPATIBILITY IDEOGRAPH-F973*/
-                                           RTUNI_ALPHA, /* U+00f974: CJK COMPATIBILITY IDEOGRAPH-F974*/
-                                           RTUNI_ALPHA, /* U+00f975: CJK COMPATIBILITY IDEOGRAPH-F975*/
-                                           RTUNI_ALPHA, /* U+00f976: CJK COMPATIBILITY IDEOGRAPH-F976*/
-                                           RTUNI_ALPHA, /* U+00f977: CJK COMPATIBILITY IDEOGRAPH-F977*/
-                                           RTUNI_ALPHA, /* U+00f978: CJK COMPATIBILITY IDEOGRAPH-F978*/
-                                           RTUNI_ALPHA, /* U+00f979: CJK COMPATIBILITY IDEOGRAPH-F979*/
-                                           RTUNI_ALPHA, /* U+00f97a: CJK COMPATIBILITY IDEOGRAPH-F97A*/
-                                           RTUNI_ALPHA, /* U+00f97b: CJK COMPATIBILITY IDEOGRAPH-F97B*/
-                                           RTUNI_ALPHA, /* U+00f97c: CJK COMPATIBILITY IDEOGRAPH-F97C*/
-                                           RTUNI_ALPHA, /* U+00f97d: CJK COMPATIBILITY IDEOGRAPH-F97D*/
-                                           RTUNI_ALPHA, /* U+00f97e: CJK COMPATIBILITY IDEOGRAPH-F97E*/
-                                           RTUNI_ALPHA, /* U+00f97f: CJK COMPATIBILITY IDEOGRAPH-F97F*/
-                                           RTUNI_ALPHA, /* U+00f980: CJK COMPATIBILITY IDEOGRAPH-F980*/
-                                           RTUNI_ALPHA, /* U+00f981: CJK COMPATIBILITY IDEOGRAPH-F981*/
-                                           RTUNI_ALPHA, /* U+00f982: CJK COMPATIBILITY IDEOGRAPH-F982*/
-                                           RTUNI_ALPHA, /* U+00f983: CJK COMPATIBILITY IDEOGRAPH-F983*/
-                                           RTUNI_ALPHA, /* U+00f984: CJK COMPATIBILITY IDEOGRAPH-F984*/
-                                           RTUNI_ALPHA, /* U+00f985: CJK COMPATIBILITY IDEOGRAPH-F985*/
-                                           RTUNI_ALPHA, /* U+00f986: CJK COMPATIBILITY IDEOGRAPH-F986*/
-                                           RTUNI_ALPHA, /* U+00f987: CJK COMPATIBILITY IDEOGRAPH-F987*/
-                                           RTUNI_ALPHA, /* U+00f988: CJK COMPATIBILITY IDEOGRAPH-F988*/
-                                           RTUNI_ALPHA, /* U+00f989: CJK COMPATIBILITY IDEOGRAPH-F989*/
-                                           RTUNI_ALPHA, /* U+00f98a: CJK COMPATIBILITY IDEOGRAPH-F98A*/
-                                           RTUNI_ALPHA, /* U+00f98b: CJK COMPATIBILITY IDEOGRAPH-F98B*/
-                                           RTUNI_ALPHA, /* U+00f98c: CJK COMPATIBILITY IDEOGRAPH-F98C*/
-                                           RTUNI_ALPHA, /* U+00f98d: CJK COMPATIBILITY IDEOGRAPH-F98D*/
-                                           RTUNI_ALPHA, /* U+00f98e: CJK COMPATIBILITY IDEOGRAPH-F98E*/
-                                           RTUNI_ALPHA, /* U+00f98f: CJK COMPATIBILITY IDEOGRAPH-F98F*/
-                                           RTUNI_ALPHA, /* U+00f990: CJK COMPATIBILITY IDEOGRAPH-F990*/
-                                           RTUNI_ALPHA, /* U+00f991: CJK COMPATIBILITY IDEOGRAPH-F991*/
-                                           RTUNI_ALPHA, /* U+00f992: CJK COMPATIBILITY IDEOGRAPH-F992*/
-                                           RTUNI_ALPHA, /* U+00f993: CJK COMPATIBILITY IDEOGRAPH-F993*/
-                                           RTUNI_ALPHA, /* U+00f994: CJK COMPATIBILITY IDEOGRAPH-F994*/
-                                           RTUNI_ALPHA, /* U+00f995: CJK COMPATIBILITY IDEOGRAPH-F995*/
-                                           RTUNI_ALPHA, /* U+00f996: CJK COMPATIBILITY IDEOGRAPH-F996*/
-                                           RTUNI_ALPHA, /* U+00f997: CJK COMPATIBILITY IDEOGRAPH-F997*/
-                                           RTUNI_ALPHA, /* U+00f998: CJK COMPATIBILITY IDEOGRAPH-F998*/
-                                           RTUNI_ALPHA, /* U+00f999: CJK COMPATIBILITY IDEOGRAPH-F999*/
-                                           RTUNI_ALPHA, /* U+00f99a: CJK COMPATIBILITY IDEOGRAPH-F99A*/
-                                           RTUNI_ALPHA, /* U+00f99b: CJK COMPATIBILITY IDEOGRAPH-F99B*/
-                                           RTUNI_ALPHA, /* U+00f99c: CJK COMPATIBILITY IDEOGRAPH-F99C*/
-                                           RTUNI_ALPHA, /* U+00f99d: CJK COMPATIBILITY IDEOGRAPH-F99D*/
-                                           RTUNI_ALPHA, /* U+00f99e: CJK COMPATIBILITY IDEOGRAPH-F99E*/
-                                           RTUNI_ALPHA, /* U+00f99f: CJK COMPATIBILITY IDEOGRAPH-F99F*/
-                                           RTUNI_ALPHA, /* U+00f9a0: CJK COMPATIBILITY IDEOGRAPH-F9A0*/
-                                           RTUNI_ALPHA, /* U+00f9a1: CJK COMPATIBILITY IDEOGRAPH-F9A1*/
-                                           RTUNI_ALPHA, /* U+00f9a2: CJK COMPATIBILITY IDEOGRAPH-F9A2*/
-                                           RTUNI_ALPHA, /* U+00f9a3: CJK COMPATIBILITY IDEOGRAPH-F9A3*/
-                                           RTUNI_ALPHA, /* U+00f9a4: CJK COMPATIBILITY IDEOGRAPH-F9A4*/
-                                           RTUNI_ALPHA, /* U+00f9a5: CJK COMPATIBILITY IDEOGRAPH-F9A5*/
-                                           RTUNI_ALPHA, /* U+00f9a6: CJK COMPATIBILITY IDEOGRAPH-F9A6*/
-                                           RTUNI_ALPHA, /* U+00f9a7: CJK COMPATIBILITY IDEOGRAPH-F9A7*/
-                                           RTUNI_ALPHA, /* U+00f9a8: CJK COMPATIBILITY IDEOGRAPH-F9A8*/
-                                           RTUNI_ALPHA, /* U+00f9a9: CJK COMPATIBILITY IDEOGRAPH-F9A9*/
-                                           RTUNI_ALPHA, /* U+00f9aa: CJK COMPATIBILITY IDEOGRAPH-F9AA*/
-                                           RTUNI_ALPHA, /* U+00f9ab: CJK COMPATIBILITY IDEOGRAPH-F9AB*/
-                                           RTUNI_ALPHA, /* U+00f9ac: CJK COMPATIBILITY IDEOGRAPH-F9AC*/
-                                           RTUNI_ALPHA, /* U+00f9ad: CJK COMPATIBILITY IDEOGRAPH-F9AD*/
-                                           RTUNI_ALPHA, /* U+00f9ae: CJK COMPATIBILITY IDEOGRAPH-F9AE*/
-                                           RTUNI_ALPHA, /* U+00f9af: CJK COMPATIBILITY IDEOGRAPH-F9AF*/
-                                           RTUNI_ALPHA, /* U+00f9b0: CJK COMPATIBILITY IDEOGRAPH-F9B0*/
-                                           RTUNI_ALPHA, /* U+00f9b1: CJK COMPATIBILITY IDEOGRAPH-F9B1*/
-                                           RTUNI_ALPHA, /* U+00f9b2: CJK COMPATIBILITY IDEOGRAPH-F9B2*/
-                                           RTUNI_ALPHA, /* U+00f9b3: CJK COMPATIBILITY IDEOGRAPH-F9B3*/
-                                           RTUNI_ALPHA, /* U+00f9b4: CJK COMPATIBILITY IDEOGRAPH-F9B4*/
-                                           RTUNI_ALPHA, /* U+00f9b5: CJK COMPATIBILITY IDEOGRAPH-F9B5*/
-                                           RTUNI_ALPHA, /* U+00f9b6: CJK COMPATIBILITY IDEOGRAPH-F9B6*/
-                                           RTUNI_ALPHA, /* U+00f9b7: CJK COMPATIBILITY IDEOGRAPH-F9B7*/
-                                           RTUNI_ALPHA, /* U+00f9b8: CJK COMPATIBILITY IDEOGRAPH-F9B8*/
-                                           RTUNI_ALPHA, /* U+00f9b9: CJK COMPATIBILITY IDEOGRAPH-F9B9*/
-                                           RTUNI_ALPHA, /* U+00f9ba: CJK COMPATIBILITY IDEOGRAPH-F9BA*/
-                                           RTUNI_ALPHA, /* U+00f9bb: CJK COMPATIBILITY IDEOGRAPH-F9BB*/
-                                           RTUNI_ALPHA, /* U+00f9bc: CJK COMPATIBILITY IDEOGRAPH-F9BC*/
-                                           RTUNI_ALPHA, /* U+00f9bd: CJK COMPATIBILITY IDEOGRAPH-F9BD*/
-                                           RTUNI_ALPHA, /* U+00f9be: CJK COMPATIBILITY IDEOGRAPH-F9BE*/
-                                           RTUNI_ALPHA, /* U+00f9bf: CJK COMPATIBILITY IDEOGRAPH-F9BF*/
-                                           RTUNI_ALPHA, /* U+00f9c0: CJK COMPATIBILITY IDEOGRAPH-F9C0*/
-                                           RTUNI_ALPHA, /* U+00f9c1: CJK COMPATIBILITY IDEOGRAPH-F9C1*/
-                                           RTUNI_ALPHA, /* U+00f9c2: CJK COMPATIBILITY IDEOGRAPH-F9C2*/
-                                           RTUNI_ALPHA, /* U+00f9c3: CJK COMPATIBILITY IDEOGRAPH-F9C3*/
-                                           RTUNI_ALPHA, /* U+00f9c4: CJK COMPATIBILITY IDEOGRAPH-F9C4*/
-                                           RTUNI_ALPHA, /* U+00f9c5: CJK COMPATIBILITY IDEOGRAPH-F9C5*/
-                                           RTUNI_ALPHA, /* U+00f9c6: CJK COMPATIBILITY IDEOGRAPH-F9C6*/
-                                           RTUNI_ALPHA, /* U+00f9c7: CJK COMPATIBILITY IDEOGRAPH-F9C7*/
-                                           RTUNI_ALPHA, /* U+00f9c8: CJK COMPATIBILITY IDEOGRAPH-F9C8*/
-                                           RTUNI_ALPHA, /* U+00f9c9: CJK COMPATIBILITY IDEOGRAPH-F9C9*/
-                                           RTUNI_ALPHA, /* U+00f9ca: CJK COMPATIBILITY IDEOGRAPH-F9CA*/
-                                           RTUNI_ALPHA, /* U+00f9cb: CJK COMPATIBILITY IDEOGRAPH-F9CB*/
-                                           RTUNI_ALPHA, /* U+00f9cc: CJK COMPATIBILITY IDEOGRAPH-F9CC*/
-                                           RTUNI_ALPHA, /* U+00f9cd: CJK COMPATIBILITY IDEOGRAPH-F9CD*/
-                                           RTUNI_ALPHA, /* U+00f9ce: CJK COMPATIBILITY IDEOGRAPH-F9CE*/
-                                           RTUNI_ALPHA, /* U+00f9cf: CJK COMPATIBILITY IDEOGRAPH-F9CF*/
-                                           RTUNI_ALPHA, /* U+00f9d0: CJK COMPATIBILITY IDEOGRAPH-F9D0*/
-                                           RTUNI_ALPHA, /* U+00f9d1: CJK COMPATIBILITY IDEOGRAPH-F9D1*/
-                                           RTUNI_ALPHA, /* U+00f9d2: CJK COMPATIBILITY IDEOGRAPH-F9D2*/
-                                           RTUNI_ALPHA, /* U+00f9d3: CJK COMPATIBILITY IDEOGRAPH-F9D3*/
-                                           RTUNI_ALPHA, /* U+00f9d4: CJK COMPATIBILITY IDEOGRAPH-F9D4*/
-                                           RTUNI_ALPHA, /* U+00f9d5: CJK COMPATIBILITY IDEOGRAPH-F9D5*/
-                                           RTUNI_ALPHA, /* U+00f9d6: CJK COMPATIBILITY IDEOGRAPH-F9D6*/
-                                           RTUNI_ALPHA, /* U+00f9d7: CJK COMPATIBILITY IDEOGRAPH-F9D7*/
-                                           RTUNI_ALPHA, /* U+00f9d8: CJK COMPATIBILITY IDEOGRAPH-F9D8*/
-                                           RTUNI_ALPHA, /* U+00f9d9: CJK COMPATIBILITY IDEOGRAPH-F9D9*/
-                                           RTUNI_ALPHA, /* U+00f9da: CJK COMPATIBILITY IDEOGRAPH-F9DA*/
-                                           RTUNI_ALPHA, /* U+00f9db: CJK COMPATIBILITY IDEOGRAPH-F9DB*/
-                                           RTUNI_ALPHA, /* U+00f9dc: CJK COMPATIBILITY IDEOGRAPH-F9DC*/
-                                           RTUNI_ALPHA, /* U+00f9dd: CJK COMPATIBILITY IDEOGRAPH-F9DD*/
-                                           RTUNI_ALPHA, /* U+00f9de: CJK COMPATIBILITY IDEOGRAPH-F9DE*/
-                                           RTUNI_ALPHA, /* U+00f9df: CJK COMPATIBILITY IDEOGRAPH-F9DF*/
-                                           RTUNI_ALPHA, /* U+00f9e0: CJK COMPATIBILITY IDEOGRAPH-F9E0*/
-                                           RTUNI_ALPHA, /* U+00f9e1: CJK COMPATIBILITY IDEOGRAPH-F9E1*/
-                                           RTUNI_ALPHA, /* U+00f9e2: CJK COMPATIBILITY IDEOGRAPH-F9E2*/
-                                           RTUNI_ALPHA, /* U+00f9e3: CJK COMPATIBILITY IDEOGRAPH-F9E3*/
-                                           RTUNI_ALPHA, /* U+00f9e4: CJK COMPATIBILITY IDEOGRAPH-F9E4*/
-                                           RTUNI_ALPHA, /* U+00f9e5: CJK COMPATIBILITY IDEOGRAPH-F9E5*/
-                                           RTUNI_ALPHA, /* U+00f9e6: CJK COMPATIBILITY IDEOGRAPH-F9E6*/
-                                           RTUNI_ALPHA, /* U+00f9e7: CJK COMPATIBILITY IDEOGRAPH-F9E7*/
-                                           RTUNI_ALPHA, /* U+00f9e8: CJK COMPATIBILITY IDEOGRAPH-F9E8*/
-                                           RTUNI_ALPHA, /* U+00f9e9: CJK COMPATIBILITY IDEOGRAPH-F9E9*/
-                                           RTUNI_ALPHA, /* U+00f9ea: CJK COMPATIBILITY IDEOGRAPH-F9EA*/
-                                           RTUNI_ALPHA, /* U+00f9eb: CJK COMPATIBILITY IDEOGRAPH-F9EB*/
-                                           RTUNI_ALPHA, /* U+00f9ec: CJK COMPATIBILITY IDEOGRAPH-F9EC*/
-                                           RTUNI_ALPHA, /* U+00f9ed: CJK COMPATIBILITY IDEOGRAPH-F9ED*/
-                                           RTUNI_ALPHA, /* U+00f9ee: CJK COMPATIBILITY IDEOGRAPH-F9EE*/
-                                           RTUNI_ALPHA, /* U+00f9ef: CJK COMPATIBILITY IDEOGRAPH-F9EF*/
-                                           RTUNI_ALPHA, /* U+00f9f0: CJK COMPATIBILITY IDEOGRAPH-F9F0*/
-                                           RTUNI_ALPHA, /* U+00f9f1: CJK COMPATIBILITY IDEOGRAPH-F9F1*/
-                                           RTUNI_ALPHA, /* U+00f9f2: CJK COMPATIBILITY IDEOGRAPH-F9F2*/
-                                           RTUNI_ALPHA, /* U+00f9f3: CJK COMPATIBILITY IDEOGRAPH-F9F3*/
-                                           RTUNI_ALPHA, /* U+00f9f4: CJK COMPATIBILITY IDEOGRAPH-F9F4*/
-                                           RTUNI_ALPHA, /* U+00f9f5: CJK COMPATIBILITY IDEOGRAPH-F9F5*/
-                                           RTUNI_ALPHA, /* U+00f9f6: CJK COMPATIBILITY IDEOGRAPH-F9F6*/
-                                           RTUNI_ALPHA, /* U+00f9f7: CJK COMPATIBILITY IDEOGRAPH-F9F7*/
-                                           RTUNI_ALPHA, /* U+00f9f8: CJK COMPATIBILITY IDEOGRAPH-F9F8*/
-                                           RTUNI_ALPHA, /* U+00f9f9: CJK COMPATIBILITY IDEOGRAPH-F9F9*/
-                                           RTUNI_ALPHA, /* U+00f9fa: CJK COMPATIBILITY IDEOGRAPH-F9FA*/
-                                           RTUNI_ALPHA, /* U+00f9fb: CJK COMPATIBILITY IDEOGRAPH-F9FB*/
-                                           RTUNI_ALPHA, /* U+00f9fc: CJK COMPATIBILITY IDEOGRAPH-F9FC*/
-                                           RTUNI_ALPHA, /* U+00f9fd: CJK COMPATIBILITY IDEOGRAPH-F9FD*/
-                                           RTUNI_ALPHA, /* U+00f9fe: CJK COMPATIBILITY IDEOGRAPH-F9FE*/
-                                           RTUNI_ALPHA, /* U+00f9ff: CJK COMPATIBILITY IDEOGRAPH-F9FF*/
-                                           RTUNI_ALPHA, /* U+00fa00: CJK COMPATIBILITY IDEOGRAPH-FA00*/
-                                           RTUNI_ALPHA, /* U+00fa01: CJK COMPATIBILITY IDEOGRAPH-FA01*/
-                                           RTUNI_ALPHA, /* U+00fa02: CJK COMPATIBILITY IDEOGRAPH-FA02*/
-                                           RTUNI_ALPHA, /* U+00fa03: CJK COMPATIBILITY IDEOGRAPH-FA03*/
-                                           RTUNI_ALPHA, /* U+00fa04: CJK COMPATIBILITY IDEOGRAPH-FA04*/
-                                           RTUNI_ALPHA, /* U+00fa05: CJK COMPATIBILITY IDEOGRAPH-FA05*/
-                                           RTUNI_ALPHA, /* U+00fa06: CJK COMPATIBILITY IDEOGRAPH-FA06*/
-                                           RTUNI_ALPHA, /* U+00fa07: CJK COMPATIBILITY IDEOGRAPH-FA07*/
-                                           RTUNI_ALPHA, /* U+00fa08: CJK COMPATIBILITY IDEOGRAPH-FA08*/
-                                           RTUNI_ALPHA, /* U+00fa09: CJK COMPATIBILITY IDEOGRAPH-FA09*/
-                                           RTUNI_ALPHA, /* U+00fa0a: CJK COMPATIBILITY IDEOGRAPH-FA0A*/
-                                           RTUNI_ALPHA, /* U+00fa0b: CJK COMPATIBILITY IDEOGRAPH-FA0B*/
-                                           RTUNI_ALPHA, /* U+00fa0c: CJK COMPATIBILITY IDEOGRAPH-FA0C*/
-                                           RTUNI_ALPHA, /* U+00fa0d: CJK COMPATIBILITY IDEOGRAPH-FA0D*/
-                                           RTUNI_ALPHA, /* U+00fa0e: CJK COMPATIBILITY IDEOGRAPH-FA0E*/
-                                           RTUNI_ALPHA, /* U+00fa0f: CJK COMPATIBILITY IDEOGRAPH-FA0F*/
-                                           RTUNI_ALPHA, /* U+00fa10: CJK COMPATIBILITY IDEOGRAPH-FA10*/
-                                           RTUNI_ALPHA, /* U+00fa11: CJK COMPATIBILITY IDEOGRAPH-FA11*/
-                                           RTUNI_ALPHA, /* U+00fa12: CJK COMPATIBILITY IDEOGRAPH-FA12*/
-                                           RTUNI_ALPHA, /* U+00fa13: CJK COMPATIBILITY IDEOGRAPH-FA13*/
-                                           RTUNI_ALPHA, /* U+00fa14: CJK COMPATIBILITY IDEOGRAPH-FA14*/
-                                           RTUNI_ALPHA, /* U+00fa15: CJK COMPATIBILITY IDEOGRAPH-FA15*/
-                                           RTUNI_ALPHA, /* U+00fa16: CJK COMPATIBILITY IDEOGRAPH-FA16*/
-                                           RTUNI_ALPHA, /* U+00fa17: CJK COMPATIBILITY IDEOGRAPH-FA17*/
-                                           RTUNI_ALPHA, /* U+00fa18: CJK COMPATIBILITY IDEOGRAPH-FA18*/
-                                           RTUNI_ALPHA, /* U+00fa19: CJK COMPATIBILITY IDEOGRAPH-FA19*/
-                                           RTUNI_ALPHA, /* U+00fa1a: CJK COMPATIBILITY IDEOGRAPH-FA1A*/
-                                           RTUNI_ALPHA, /* U+00fa1b: CJK COMPATIBILITY IDEOGRAPH-FA1B*/
-                                           RTUNI_ALPHA, /* U+00fa1c: CJK COMPATIBILITY IDEOGRAPH-FA1C*/
-                                           RTUNI_ALPHA, /* U+00fa1d: CJK COMPATIBILITY IDEOGRAPH-FA1D*/
-                                           RTUNI_ALPHA, /* U+00fa1e: CJK COMPATIBILITY IDEOGRAPH-FA1E*/
-                                           RTUNI_ALPHA, /* U+00fa1f: CJK COMPATIBILITY IDEOGRAPH-FA1F*/
-                                           RTUNI_ALPHA, /* U+00fa20: CJK COMPATIBILITY IDEOGRAPH-FA20*/
-                                           RTUNI_ALPHA, /* U+00fa21: CJK COMPATIBILITY IDEOGRAPH-FA21*/
-                                           RTUNI_ALPHA, /* U+00fa22: CJK COMPATIBILITY IDEOGRAPH-FA22*/
-                                           RTUNI_ALPHA, /* U+00fa23: CJK COMPATIBILITY IDEOGRAPH-FA23*/
-                                           RTUNI_ALPHA, /* U+00fa24: CJK COMPATIBILITY IDEOGRAPH-FA24*/
-                                           RTUNI_ALPHA, /* U+00fa25: CJK COMPATIBILITY IDEOGRAPH-FA25*/
-                                           RTUNI_ALPHA, /* U+00fa26: CJK COMPATIBILITY IDEOGRAPH-FA26*/
-                                           RTUNI_ALPHA, /* U+00fa27: CJK COMPATIBILITY IDEOGRAPH-FA27*/
-                                           RTUNI_ALPHA, /* U+00fa28: CJK COMPATIBILITY IDEOGRAPH-FA28*/
-                                           RTUNI_ALPHA, /* U+00fa29: CJK COMPATIBILITY IDEOGRAPH-FA29*/
-                                           RTUNI_ALPHA, /* U+00fa2a: CJK COMPATIBILITY IDEOGRAPH-FA2A*/
-                                           RTUNI_ALPHA, /* U+00fa2b: CJK COMPATIBILITY IDEOGRAPH-FA2B*/
-                                           RTUNI_ALPHA, /* U+00fa2c: CJK COMPATIBILITY IDEOGRAPH-FA2C*/
-                                           RTUNI_ALPHA, /* U+00fa2d: CJK COMPATIBILITY IDEOGRAPH-FA2D*/
-                                                     0, /* U+00fa2e: */
-                                                     0, /* U+00fa2f: */
-                                           RTUNI_ALPHA, /* U+00fa30: CJK COMPATIBILITY IDEOGRAPH-FA30*/
-                                           RTUNI_ALPHA, /* U+00fa31: CJK COMPATIBILITY IDEOGRAPH-FA31*/
-                                           RTUNI_ALPHA, /* U+00fa32: CJK COMPATIBILITY IDEOGRAPH-FA32*/
-                                           RTUNI_ALPHA, /* U+00fa33: CJK COMPATIBILITY IDEOGRAPH-FA33*/
-                                           RTUNI_ALPHA, /* U+00fa34: CJK COMPATIBILITY IDEOGRAPH-FA34*/
-                                           RTUNI_ALPHA, /* U+00fa35: CJK COMPATIBILITY IDEOGRAPH-FA35*/
-                                           RTUNI_ALPHA, /* U+00fa36: CJK COMPATIBILITY IDEOGRAPH-FA36*/
-                                           RTUNI_ALPHA, /* U+00fa37: CJK COMPATIBILITY IDEOGRAPH-FA37*/
-                                           RTUNI_ALPHA, /* U+00fa38: CJK COMPATIBILITY IDEOGRAPH-FA38*/
-                                           RTUNI_ALPHA, /* U+00fa39: CJK COMPATIBILITY IDEOGRAPH-FA39*/
-                                           RTUNI_ALPHA, /* U+00fa3a: CJK COMPATIBILITY IDEOGRAPH-FA3A*/
-                                           RTUNI_ALPHA, /* U+00fa3b: CJK COMPATIBILITY IDEOGRAPH-FA3B*/
-                                           RTUNI_ALPHA, /* U+00fa3c: CJK COMPATIBILITY IDEOGRAPH-FA3C*/
-                                           RTUNI_ALPHA, /* U+00fa3d: CJK COMPATIBILITY IDEOGRAPH-FA3D*/
-                                           RTUNI_ALPHA, /* U+00fa3e: CJK COMPATIBILITY IDEOGRAPH-FA3E*/
-                                           RTUNI_ALPHA, /* U+00fa3f: CJK COMPATIBILITY IDEOGRAPH-FA3F*/
-                                           RTUNI_ALPHA, /* U+00fa40: CJK COMPATIBILITY IDEOGRAPH-FA40*/
-                                           RTUNI_ALPHA, /* U+00fa41: CJK COMPATIBILITY IDEOGRAPH-FA41*/
-                                           RTUNI_ALPHA, /* U+00fa42: CJK COMPATIBILITY IDEOGRAPH-FA42*/
-                                           RTUNI_ALPHA, /* U+00fa43: CJK COMPATIBILITY IDEOGRAPH-FA43*/
-                                           RTUNI_ALPHA, /* U+00fa44: CJK COMPATIBILITY IDEOGRAPH-FA44*/
-                                           RTUNI_ALPHA, /* U+00fa45: CJK COMPATIBILITY IDEOGRAPH-FA45*/
-                                           RTUNI_ALPHA, /* U+00fa46: CJK COMPATIBILITY IDEOGRAPH-FA46*/
-                                           RTUNI_ALPHA, /* U+00fa47: CJK COMPATIBILITY IDEOGRAPH-FA47*/
-                                           RTUNI_ALPHA, /* U+00fa48: CJK COMPATIBILITY IDEOGRAPH-FA48*/
-                                           RTUNI_ALPHA, /* U+00fa49: CJK COMPATIBILITY IDEOGRAPH-FA49*/
-                                           RTUNI_ALPHA, /* U+00fa4a: CJK COMPATIBILITY IDEOGRAPH-FA4A*/
-                                           RTUNI_ALPHA, /* U+00fa4b: CJK COMPATIBILITY IDEOGRAPH-FA4B*/
-                                           RTUNI_ALPHA, /* U+00fa4c: CJK COMPATIBILITY IDEOGRAPH-FA4C*/
-                                           RTUNI_ALPHA, /* U+00fa4d: CJK COMPATIBILITY IDEOGRAPH-FA4D*/
-                                           RTUNI_ALPHA, /* U+00fa4e: CJK COMPATIBILITY IDEOGRAPH-FA4E*/
-                                           RTUNI_ALPHA, /* U+00fa4f: CJK COMPATIBILITY IDEOGRAPH-FA4F*/
-                                           RTUNI_ALPHA, /* U+00fa50: CJK COMPATIBILITY IDEOGRAPH-FA50*/
-                                           RTUNI_ALPHA, /* U+00fa51: CJK COMPATIBILITY IDEOGRAPH-FA51*/
-                                           RTUNI_ALPHA, /* U+00fa52: CJK COMPATIBILITY IDEOGRAPH-FA52*/
-                                           RTUNI_ALPHA, /* U+00fa53: CJK COMPATIBILITY IDEOGRAPH-FA53*/
-                                           RTUNI_ALPHA, /* U+00fa54: CJK COMPATIBILITY IDEOGRAPH-FA54*/
-                                           RTUNI_ALPHA, /* U+00fa55: CJK COMPATIBILITY IDEOGRAPH-FA55*/
-                                           RTUNI_ALPHA, /* U+00fa56: CJK COMPATIBILITY IDEOGRAPH-FA56*/
-                                           RTUNI_ALPHA, /* U+00fa57: CJK COMPATIBILITY IDEOGRAPH-FA57*/
-                                           RTUNI_ALPHA, /* U+00fa58: CJK COMPATIBILITY IDEOGRAPH-FA58*/
-                                           RTUNI_ALPHA, /* U+00fa59: CJK COMPATIBILITY IDEOGRAPH-FA59*/
-                                           RTUNI_ALPHA, /* U+00fa5a: CJK COMPATIBILITY IDEOGRAPH-FA5A*/
-                                           RTUNI_ALPHA, /* U+00fa5b: CJK COMPATIBILITY IDEOGRAPH-FA5B*/
-                                           RTUNI_ALPHA, /* U+00fa5c: CJK COMPATIBILITY IDEOGRAPH-FA5C*/
-                                           RTUNI_ALPHA, /* U+00fa5d: CJK COMPATIBILITY IDEOGRAPH-FA5D*/
-                                           RTUNI_ALPHA, /* U+00fa5e: CJK COMPATIBILITY IDEOGRAPH-FA5E*/
-                                           RTUNI_ALPHA, /* U+00fa5f: CJK COMPATIBILITY IDEOGRAPH-FA5F*/
-                                           RTUNI_ALPHA, /* U+00fa60: CJK COMPATIBILITY IDEOGRAPH-FA60*/
-                                           RTUNI_ALPHA, /* U+00fa61: CJK COMPATIBILITY IDEOGRAPH-FA61*/
-                                           RTUNI_ALPHA, /* U+00fa62: CJK COMPATIBILITY IDEOGRAPH-FA62*/
-                                           RTUNI_ALPHA, /* U+00fa63: CJK COMPATIBILITY IDEOGRAPH-FA63*/
-                                           RTUNI_ALPHA, /* U+00fa64: CJK COMPATIBILITY IDEOGRAPH-FA64*/
-                                           RTUNI_ALPHA, /* U+00fa65: CJK COMPATIBILITY IDEOGRAPH-FA65*/
-                                           RTUNI_ALPHA, /* U+00fa66: CJK COMPATIBILITY IDEOGRAPH-FA66*/
-                                           RTUNI_ALPHA, /* U+00fa67: CJK COMPATIBILITY IDEOGRAPH-FA67*/
-                                           RTUNI_ALPHA, /* U+00fa68: CJK COMPATIBILITY IDEOGRAPH-FA68*/
-                                           RTUNI_ALPHA, /* U+00fa69: CJK COMPATIBILITY IDEOGRAPH-FA69*/
-                                           RTUNI_ALPHA, /* U+00fa6a: CJK COMPATIBILITY IDEOGRAPH-FA6A*/
-                                                     0, /* U+00fa6b: */
-                                                     0, /* U+00fa6c: */
-                                                     0, /* U+00fa6d: */
-                                                     0, /* U+00fa6e: */
-                                                     0, /* U+00fa6f: */
-                                           RTUNI_ALPHA, /* U+00fa70: CJK COMPATIBILITY IDEOGRAPH-FA70*/
-                                           RTUNI_ALPHA, /* U+00fa71: CJK COMPATIBILITY IDEOGRAPH-FA71*/
-                                           RTUNI_ALPHA, /* U+00fa72: CJK COMPATIBILITY IDEOGRAPH-FA72*/
-                                           RTUNI_ALPHA, /* U+00fa73: CJK COMPATIBILITY IDEOGRAPH-FA73*/
-                                           RTUNI_ALPHA, /* U+00fa74: CJK COMPATIBILITY IDEOGRAPH-FA74*/
-                                           RTUNI_ALPHA, /* U+00fa75: CJK COMPATIBILITY IDEOGRAPH-FA75*/
-                                           RTUNI_ALPHA, /* U+00fa76: CJK COMPATIBILITY IDEOGRAPH-FA76*/
-                                           RTUNI_ALPHA, /* U+00fa77: CJK COMPATIBILITY IDEOGRAPH-FA77*/
-                                           RTUNI_ALPHA, /* U+00fa78: CJK COMPATIBILITY IDEOGRAPH-FA78*/
-                                           RTUNI_ALPHA, /* U+00fa79: CJK COMPATIBILITY IDEOGRAPH-FA79*/
-                                           RTUNI_ALPHA, /* U+00fa7a: CJK COMPATIBILITY IDEOGRAPH-FA7A*/
-                                           RTUNI_ALPHA, /* U+00fa7b: CJK COMPATIBILITY IDEOGRAPH-FA7B*/
-                                           RTUNI_ALPHA, /* U+00fa7c: CJK COMPATIBILITY IDEOGRAPH-FA7C*/
-                                           RTUNI_ALPHA, /* U+00fa7d: CJK COMPATIBILITY IDEOGRAPH-FA7D*/
-                                           RTUNI_ALPHA, /* U+00fa7e: CJK COMPATIBILITY IDEOGRAPH-FA7E*/
-                                           RTUNI_ALPHA, /* U+00fa7f: CJK COMPATIBILITY IDEOGRAPH-FA7F*/
-                                           RTUNI_ALPHA, /* U+00fa80: CJK COMPATIBILITY IDEOGRAPH-FA80*/
-                                           RTUNI_ALPHA, /* U+00fa81: CJK COMPATIBILITY IDEOGRAPH-FA81*/
-                                           RTUNI_ALPHA, /* U+00fa82: CJK COMPATIBILITY IDEOGRAPH-FA82*/
-                                           RTUNI_ALPHA, /* U+00fa83: CJK COMPATIBILITY IDEOGRAPH-FA83*/
-                                           RTUNI_ALPHA, /* U+00fa84: CJK COMPATIBILITY IDEOGRAPH-FA84*/
-                                           RTUNI_ALPHA, /* U+00fa85: CJK COMPATIBILITY IDEOGRAPH-FA85*/
-                                           RTUNI_ALPHA, /* U+00fa86: CJK COMPATIBILITY IDEOGRAPH-FA86*/
-                                           RTUNI_ALPHA, /* U+00fa87: CJK COMPATIBILITY IDEOGRAPH-FA87*/
-                                           RTUNI_ALPHA, /* U+00fa88: CJK COMPATIBILITY IDEOGRAPH-FA88*/
-                                           RTUNI_ALPHA, /* U+00fa89: CJK COMPATIBILITY IDEOGRAPH-FA89*/
-                                           RTUNI_ALPHA, /* U+00fa8a: CJK COMPATIBILITY IDEOGRAPH-FA8A*/
-                                           RTUNI_ALPHA, /* U+00fa8b: CJK COMPATIBILITY IDEOGRAPH-FA8B*/
-                                           RTUNI_ALPHA, /* U+00fa8c: CJK COMPATIBILITY IDEOGRAPH-FA8C*/
-                                           RTUNI_ALPHA, /* U+00fa8d: CJK COMPATIBILITY IDEOGRAPH-FA8D*/
-                                           RTUNI_ALPHA, /* U+00fa8e: CJK COMPATIBILITY IDEOGRAPH-FA8E*/
-                                           RTUNI_ALPHA, /* U+00fa8f: CJK COMPATIBILITY IDEOGRAPH-FA8F*/
-                                           RTUNI_ALPHA, /* U+00fa90: CJK COMPATIBILITY IDEOGRAPH-FA90*/
-                                           RTUNI_ALPHA, /* U+00fa91: CJK COMPATIBILITY IDEOGRAPH-FA91*/
-                                           RTUNI_ALPHA, /* U+00fa92: CJK COMPATIBILITY IDEOGRAPH-FA92*/
-                                           RTUNI_ALPHA, /* U+00fa93: CJK COMPATIBILITY IDEOGRAPH-FA93*/
-                                           RTUNI_ALPHA, /* U+00fa94: CJK COMPATIBILITY IDEOGRAPH-FA94*/
-                                           RTUNI_ALPHA, /* U+00fa95: CJK COMPATIBILITY IDEOGRAPH-FA95*/
-                                           RTUNI_ALPHA, /* U+00fa96: CJK COMPATIBILITY IDEOGRAPH-FA96*/
-                                           RTUNI_ALPHA, /* U+00fa97: CJK COMPATIBILITY IDEOGRAPH-FA97*/
-                                           RTUNI_ALPHA, /* U+00fa98: CJK COMPATIBILITY IDEOGRAPH-FA98*/
-                                           RTUNI_ALPHA, /* U+00fa99: CJK COMPATIBILITY IDEOGRAPH-FA99*/
-                                           RTUNI_ALPHA, /* U+00fa9a: CJK COMPATIBILITY IDEOGRAPH-FA9A*/
-                                           RTUNI_ALPHA, /* U+00fa9b: CJK COMPATIBILITY IDEOGRAPH-FA9B*/
-                                           RTUNI_ALPHA, /* U+00fa9c: CJK COMPATIBILITY IDEOGRAPH-FA9C*/
-                                           RTUNI_ALPHA, /* U+00fa9d: CJK COMPATIBILITY IDEOGRAPH-FA9D*/
-                                           RTUNI_ALPHA, /* U+00fa9e: CJK COMPATIBILITY IDEOGRAPH-FA9E*/
-                                           RTUNI_ALPHA, /* U+00fa9f: CJK COMPATIBILITY IDEOGRAPH-FA9F*/
-                                           RTUNI_ALPHA, /* U+00faa0: CJK COMPATIBILITY IDEOGRAPH-FAA0*/
-                                           RTUNI_ALPHA, /* U+00faa1: CJK COMPATIBILITY IDEOGRAPH-FAA1*/
-                                           RTUNI_ALPHA, /* U+00faa2: CJK COMPATIBILITY IDEOGRAPH-FAA2*/
-                                           RTUNI_ALPHA, /* U+00faa3: CJK COMPATIBILITY IDEOGRAPH-FAA3*/
-                                           RTUNI_ALPHA, /* U+00faa4: CJK COMPATIBILITY IDEOGRAPH-FAA4*/
-                                           RTUNI_ALPHA, /* U+00faa5: CJK COMPATIBILITY IDEOGRAPH-FAA5*/
-                                           RTUNI_ALPHA, /* U+00faa6: CJK COMPATIBILITY IDEOGRAPH-FAA6*/
-                                           RTUNI_ALPHA, /* U+00faa7: CJK COMPATIBILITY IDEOGRAPH-FAA7*/
-                                           RTUNI_ALPHA, /* U+00faa8: CJK COMPATIBILITY IDEOGRAPH-FAA8*/
-                                           RTUNI_ALPHA, /* U+00faa9: CJK COMPATIBILITY IDEOGRAPH-FAA9*/
-                                           RTUNI_ALPHA, /* U+00faaa: CJK COMPATIBILITY IDEOGRAPH-FAAA*/
-                                           RTUNI_ALPHA, /* U+00faab: CJK COMPATIBILITY IDEOGRAPH-FAAB*/
-                                           RTUNI_ALPHA, /* U+00faac: CJK COMPATIBILITY IDEOGRAPH-FAAC*/
-                                           RTUNI_ALPHA, /* U+00faad: CJK COMPATIBILITY IDEOGRAPH-FAAD*/
-                                           RTUNI_ALPHA, /* U+00faae: CJK COMPATIBILITY IDEOGRAPH-FAAE*/
-                                           RTUNI_ALPHA, /* U+00faaf: CJK COMPATIBILITY IDEOGRAPH-FAAF*/
-                                           RTUNI_ALPHA, /* U+00fab0: CJK COMPATIBILITY IDEOGRAPH-FAB0*/
-                                           RTUNI_ALPHA, /* U+00fab1: CJK COMPATIBILITY IDEOGRAPH-FAB1*/
-                                           RTUNI_ALPHA, /* U+00fab2: CJK COMPATIBILITY IDEOGRAPH-FAB2*/
-                                           RTUNI_ALPHA, /* U+00fab3: CJK COMPATIBILITY IDEOGRAPH-FAB3*/
-                                           RTUNI_ALPHA, /* U+00fab4: CJK COMPATIBILITY IDEOGRAPH-FAB4*/
-                                           RTUNI_ALPHA, /* U+00fab5: CJK COMPATIBILITY IDEOGRAPH-FAB5*/
-                                           RTUNI_ALPHA, /* U+00fab6: CJK COMPATIBILITY IDEOGRAPH-FAB6*/
-                                           RTUNI_ALPHA, /* U+00fab7: CJK COMPATIBILITY IDEOGRAPH-FAB7*/
-                                           RTUNI_ALPHA, /* U+00fab8: CJK COMPATIBILITY IDEOGRAPH-FAB8*/
-                                           RTUNI_ALPHA, /* U+00fab9: CJK COMPATIBILITY IDEOGRAPH-FAB9*/
-                                           RTUNI_ALPHA, /* U+00faba: CJK COMPATIBILITY IDEOGRAPH-FABA*/
-                                           RTUNI_ALPHA, /* U+00fabb: CJK COMPATIBILITY IDEOGRAPH-FABB*/
-                                           RTUNI_ALPHA, /* U+00fabc: CJK COMPATIBILITY IDEOGRAPH-FABC*/
-                                           RTUNI_ALPHA, /* U+00fabd: CJK COMPATIBILITY IDEOGRAPH-FABD*/
-                                           RTUNI_ALPHA, /* U+00fabe: CJK COMPATIBILITY IDEOGRAPH-FABE*/
-                                           RTUNI_ALPHA, /* U+00fabf: CJK COMPATIBILITY IDEOGRAPH-FABF*/
-                                           RTUNI_ALPHA, /* U+00fac0: CJK COMPATIBILITY IDEOGRAPH-FAC0*/
-                                           RTUNI_ALPHA, /* U+00fac1: CJK COMPATIBILITY IDEOGRAPH-FAC1*/
-                                           RTUNI_ALPHA, /* U+00fac2: CJK COMPATIBILITY IDEOGRAPH-FAC2*/
-                                           RTUNI_ALPHA, /* U+00fac3: CJK COMPATIBILITY IDEOGRAPH-FAC3*/
-                                           RTUNI_ALPHA, /* U+00fac4: CJK COMPATIBILITY IDEOGRAPH-FAC4*/
-                                           RTUNI_ALPHA, /* U+00fac5: CJK COMPATIBILITY IDEOGRAPH-FAC5*/
-                                           RTUNI_ALPHA, /* U+00fac6: CJK COMPATIBILITY IDEOGRAPH-FAC6*/
-                                           RTUNI_ALPHA, /* U+00fac7: CJK COMPATIBILITY IDEOGRAPH-FAC7*/
-                                           RTUNI_ALPHA, /* U+00fac8: CJK COMPATIBILITY IDEOGRAPH-FAC8*/
-                                           RTUNI_ALPHA, /* U+00fac9: CJK COMPATIBILITY IDEOGRAPH-FAC9*/
-                                           RTUNI_ALPHA, /* U+00faca: CJK COMPATIBILITY IDEOGRAPH-FACA*/
-                                           RTUNI_ALPHA, /* U+00facb: CJK COMPATIBILITY IDEOGRAPH-FACB*/
-                                           RTUNI_ALPHA, /* U+00facc: CJK COMPATIBILITY IDEOGRAPH-FACC*/
-                                           RTUNI_ALPHA, /* U+00facd: CJK COMPATIBILITY IDEOGRAPH-FACD*/
-                                           RTUNI_ALPHA, /* U+00face: CJK COMPATIBILITY IDEOGRAPH-FACE*/
-                                           RTUNI_ALPHA, /* U+00facf: CJK COMPATIBILITY IDEOGRAPH-FACF*/
-                                           RTUNI_ALPHA, /* U+00fad0: CJK COMPATIBILITY IDEOGRAPH-FAD0*/
-                                           RTUNI_ALPHA, /* U+00fad1: CJK COMPATIBILITY IDEOGRAPH-FAD1*/
-                                           RTUNI_ALPHA, /* U+00fad2: CJK COMPATIBILITY IDEOGRAPH-FAD2*/
-                                           RTUNI_ALPHA, /* U+00fad3: CJK COMPATIBILITY IDEOGRAPH-FAD3*/
-                                           RTUNI_ALPHA, /* U+00fad4: CJK COMPATIBILITY IDEOGRAPH-FAD4*/
-                                           RTUNI_ALPHA, /* U+00fad5: CJK COMPATIBILITY IDEOGRAPH-FAD5*/
-                                           RTUNI_ALPHA, /* U+00fad6: CJK COMPATIBILITY IDEOGRAPH-FAD6*/
-                                           RTUNI_ALPHA, /* U+00fad7: CJK COMPATIBILITY IDEOGRAPH-FAD7*/
-                                           RTUNI_ALPHA, /* U+00fad8: CJK COMPATIBILITY IDEOGRAPH-FAD8*/
-                                           RTUNI_ALPHA, /* U+00fad9: CJK COMPATIBILITY IDEOGRAPH-FAD9*/
-                                                     0, /* U+00fada: */
-                                                     0, /* U+00fadb: */
-                                                     0, /* U+00fadc: */
-                                                     0, /* U+00fadd: */
-                                                     0, /* U+00fade: */
-                                                     0, /* U+00fadf: */
-                                                     0, /* U+00fae0: */
-                                                     0, /* U+00fae1: */
-                                                     0, /* U+00fae2: */
-                                                     0, /* U+00fae3: */
-                                                     0, /* U+00fae4: */
-                                                     0, /* U+00fae5: */
-                                                     0, /* U+00fae6: */
-                                                     0, /* U+00fae7: */
-                                                     0, /* U+00fae8: */
-                                                     0, /* U+00fae9: */
-                                                     0, /* U+00faea: */
-                                                     0, /* U+00faeb: */
-                                                     0, /* U+00faec: */
-                                                     0, /* U+00faed: */
-                                                     0, /* U+00faee: */
-                                                     0, /* U+00faef: */
-                                                     0, /* U+00faf0: */
-                                                     0, /* U+00faf1: */
-                                                     0, /* U+00faf2: */
-                                                     0, /* U+00faf3: */
-                                                     0, /* U+00faf4: */
-                                                     0, /* U+00faf5: */
-                                                     0, /* U+00faf6: */
-                                                     0, /* U+00faf7: */
-                                                     0, /* U+00faf8: */
-                                                     0, /* U+00faf9: */
-                                                     0, /* U+00fafa: */
-                                                     0, /* U+00fafb: */
-                                                     0, /* U+00fafc: */
-                                                     0, /* U+00fafd: */
-                                                     0, /* U+00fafe: */
-                                                     0, /* U+00faff: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb00: LATIN SMALL LIGATURE FF*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb01: LATIN SMALL LIGATURE FI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb02: LATIN SMALL LIGATURE FL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb03: LATIN SMALL LIGATURE FFI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb04: LATIN SMALL LIGATURE FFL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb05: LATIN SMALL LIGATURE LONG S T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb06: LATIN SMALL LIGATURE ST*/
-                                                     0, /* U+00fb07: */
-                                                     0, /* U+00fb08: */
-                                                     0, /* U+00fb09: */
-                                                     0, /* U+00fb0a: */
-                                                     0, /* U+00fb0b: */
-                                                     0, /* U+00fb0c: */
-                                                     0, /* U+00fb0d: */
-                                                     0, /* U+00fb0e: */
-                                                     0, /* U+00fb0f: */
-                                                     0, /* U+00fb10: */
-                                                     0, /* U+00fb11: */
-                                                     0, /* U+00fb12: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb13: ARMENIAN SMALL LIGATURE MEN NOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb14: ARMENIAN SMALL LIGATURE MEN ECH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb15: ARMENIAN SMALL LIGATURE MEN INI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb16: ARMENIAN SMALL LIGATURE VEW NOW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00fb17: ARMENIAN SMALL LIGATURE MEN XEH*/
-                                                     0, /* U+00fb18: */
-                                                     0, /* U+00fb19: */
-                                                     0, /* U+00fb1a: */
-                                                     0, /* U+00fb1b: */
-                                                     0, /* U+00fb1c: */
-                                           RTUNI_ALPHA, /* U+00fb1d: HEBREW LETTER YOD WITH HIRIQ*/
-                                           RTUNI_ALPHA, /* U+00fb1e: HEBREW POINT JUDEO-SPANISH VARIKA*/
-                                           RTUNI_ALPHA, /* U+00fb1f: HEBREW LIGATURE YIDDISH YOD YOD PATAH*/
-                                           RTUNI_ALPHA, /* U+00fb20: HEBREW LETTER ALTERNATIVE AYIN*/
-                                           RTUNI_ALPHA, /* U+00fb21: HEBREW LETTER WIDE ALEF*/
-                                           RTUNI_ALPHA, /* U+00fb22: HEBREW LETTER WIDE DALET*/
-                                           RTUNI_ALPHA, /* U+00fb23: HEBREW LETTER WIDE HE*/
-                                           RTUNI_ALPHA, /* U+00fb24: HEBREW LETTER WIDE KAF*/
-                                           RTUNI_ALPHA, /* U+00fb25: HEBREW LETTER WIDE LAMED*/
-                                           RTUNI_ALPHA, /* U+00fb26: HEBREW LETTER WIDE FINAL MEM*/
-                                           RTUNI_ALPHA, /* U+00fb27: HEBREW LETTER WIDE RESH*/
-                                           RTUNI_ALPHA, /* U+00fb28: HEBREW LETTER WIDE TAV*/
-                                                     0, /* U+00fb29: HEBREW LETTER ALTERNATIVE PLUS SIGN*/
-                                           RTUNI_ALPHA, /* U+00fb2a: HEBREW LETTER SHIN WITH SHIN DOT*/
-                                           RTUNI_ALPHA, /* U+00fb2b: HEBREW LETTER SHIN WITH SIN DOT*/
-                                           RTUNI_ALPHA, /* U+00fb2c: HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT*/
-                                           RTUNI_ALPHA, /* U+00fb2d: HEBREW LETTER SHIN WITH DAGESH AND SIN DOT*/
-                                           RTUNI_ALPHA, /* U+00fb2e: HEBREW LETTER ALEF WITH PATAH*/
-                                           RTUNI_ALPHA, /* U+00fb2f: HEBREW LETTER ALEF WITH QAMATS*/
-                                           RTUNI_ALPHA, /* U+00fb30: HEBREW LETTER ALEF WITH MAPIQ*/
-                                           RTUNI_ALPHA, /* U+00fb31: HEBREW LETTER BET WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb32: HEBREW LETTER GIMEL WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb33: HEBREW LETTER DALET WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb34: HEBREW LETTER HE WITH MAPIQ*/
-                                           RTUNI_ALPHA, /* U+00fb35: HEBREW LETTER VAV WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb36: HEBREW LETTER ZAYIN WITH DAGESH*/
-                                                     0, /* U+00fb37: */
-                                           RTUNI_ALPHA, /* U+00fb38: HEBREW LETTER TET WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb39: HEBREW LETTER YOD WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb3a: HEBREW LETTER FINAL KAF WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb3b: HEBREW LETTER KAF WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb3c: HEBREW LETTER LAMED WITH DAGESH*/
-                                                     0, /* U+00fb3d: */
-                                           RTUNI_ALPHA, /* U+00fb3e: HEBREW LETTER MEM WITH DAGESH*/
-                                                     0, /* U+00fb3f: */
-                                           RTUNI_ALPHA, /* U+00fb40: HEBREW LETTER NUN WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb41: HEBREW LETTER SAMEKH WITH DAGESH*/
-                                                     0, /* U+00fb42: */
-                                           RTUNI_ALPHA, /* U+00fb43: HEBREW LETTER FINAL PE WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb44: HEBREW LETTER PE WITH DAGESH*/
-                                                     0, /* U+00fb45: */
-                                           RTUNI_ALPHA, /* U+00fb46: HEBREW LETTER TSADI WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb47: HEBREW LETTER QOF WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb48: HEBREW LETTER RESH WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb49: HEBREW LETTER SHIN WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb4a: HEBREW LETTER TAV WITH DAGESH*/
-                                           RTUNI_ALPHA, /* U+00fb4b: HEBREW LETTER VAV WITH HOLAM*/
-                                           RTUNI_ALPHA, /* U+00fb4c: HEBREW LETTER BET WITH RAFE*/
-                                           RTUNI_ALPHA, /* U+00fb4d: HEBREW LETTER KAF WITH RAFE*/
-                                           RTUNI_ALPHA, /* U+00fb4e: HEBREW LETTER PE WITH RAFE*/
-                                           RTUNI_ALPHA, /* U+00fb4f: HEBREW LIGATURE ALEF LAMED*/
-                                           RTUNI_ALPHA, /* U+00fb50: ARABIC LETTER ALEF WASLA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb51: ARABIC LETTER ALEF WASLA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb52: ARABIC LETTER BEEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb53: ARABIC LETTER BEEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb54: ARABIC LETTER BEEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb55: ARABIC LETTER BEEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb56: ARABIC LETTER PEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb57: ARABIC LETTER PEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb58: ARABIC LETTER PEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb59: ARABIC LETTER PEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5a: ARABIC LETTER BEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5b: ARABIC LETTER BEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5c: ARABIC LETTER BEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5d: ARABIC LETTER BEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5e: ARABIC LETTER TTEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb5f: ARABIC LETTER TTEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb60: ARABIC LETTER TTEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb61: ARABIC LETTER TTEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb62: ARABIC LETTER TEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb63: ARABIC LETTER TEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb64: ARABIC LETTER TEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb65: ARABIC LETTER TEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb66: ARABIC LETTER TTEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb67: ARABIC LETTER TTEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb68: ARABIC LETTER TTEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb69: ARABIC LETTER TTEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6a: ARABIC LETTER VEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6b: ARABIC LETTER VEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6c: ARABIC LETTER VEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6d: ARABIC LETTER VEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6e: ARABIC LETTER PEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb6f: ARABIC LETTER PEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb70: ARABIC LETTER PEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb71: ARABIC LETTER PEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb72: ARABIC LETTER DYEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb73: ARABIC LETTER DYEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb74: ARABIC LETTER DYEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb75: ARABIC LETTER DYEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb76: ARABIC LETTER NYEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb77: ARABIC LETTER NYEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb78: ARABIC LETTER NYEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb79: ARABIC LETTER NYEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7a: ARABIC LETTER TCHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7b: ARABIC LETTER TCHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7c: ARABIC LETTER TCHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7d: ARABIC LETTER TCHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7e: ARABIC LETTER TCHEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb7f: ARABIC LETTER TCHEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb80: ARABIC LETTER TCHEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb81: ARABIC LETTER TCHEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb82: ARABIC LETTER DDAHAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb83: ARABIC LETTER DDAHAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb84: ARABIC LETTER DAHAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb85: ARABIC LETTER DAHAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb86: ARABIC LETTER DUL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb87: ARABIC LETTER DUL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb88: ARABIC LETTER DDAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb89: ARABIC LETTER DDAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8a: ARABIC LETTER JEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8b: ARABIC LETTER JEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8c: ARABIC LETTER RREH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8d: ARABIC LETTER RREH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8e: ARABIC LETTER KEHEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb8f: ARABIC LETTER KEHEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb90: ARABIC LETTER KEHEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb91: ARABIC LETTER KEHEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb92: ARABIC LETTER GAF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb93: ARABIC LETTER GAF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb94: ARABIC LETTER GAF INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb95: ARABIC LETTER GAF MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb96: ARABIC LETTER GUEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb97: ARABIC LETTER GUEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb98: ARABIC LETTER GUEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb99: ARABIC LETTER GUEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9a: ARABIC LETTER NGOEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9b: ARABIC LETTER NGOEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9c: ARABIC LETTER NGOEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9d: ARABIC LETTER NGOEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9e: ARABIC LETTER NOON GHUNNA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fb9f: ARABIC LETTER NOON GHUNNA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba0: ARABIC LETTER RNOON ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fba1: ARABIC LETTER RNOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba2: ARABIC LETTER RNOON INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba3: ARABIC LETTER RNOON MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba4: ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fba5: ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba6: ARABIC LETTER HEH GOAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fba7: ARABIC LETTER HEH GOAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba8: ARABIC LETTER HEH GOAL INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fba9: ARABIC LETTER HEH GOAL MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbaa: ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbab: ARABIC LETTER HEH DOACHASHMEE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbac: ARABIC LETTER HEH DOACHASHMEE INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbad: ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbae: ARABIC LETTER YEH BARREE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbaf: ARABIC LETTER YEH BARREE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbb0: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbb1: ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM*/
-                                                     0, /* U+00fbb2: */
-                                                     0, /* U+00fbb3: */
-                                                     0, /* U+00fbb4: */
-                                                     0, /* U+00fbb5: */
-                                                     0, /* U+00fbb6: */
-                                                     0, /* U+00fbb7: */
-                                                     0, /* U+00fbb8: */
-                                                     0, /* U+00fbb9: */
-                                                     0, /* U+00fbba: */
-                                                     0, /* U+00fbbb: */
-                                                     0, /* U+00fbbc: */
-                                                     0, /* U+00fbbd: */
-                                                     0, /* U+00fbbe: */
-                                                     0, /* U+00fbbf: */
-                                                     0, /* U+00fbc0: */
-                                                     0, /* U+00fbc1: */
-                                                     0, /* U+00fbc2: */
-                                                     0, /* U+00fbc3: */
-                                                     0, /* U+00fbc4: */
-                                                     0, /* U+00fbc5: */
-                                                     0, /* U+00fbc6: */
-                                                     0, /* U+00fbc7: */
-                                                     0, /* U+00fbc8: */
-                                                     0, /* U+00fbc9: */
-                                                     0, /* U+00fbca: */
-                                                     0, /* U+00fbcb: */
-                                                     0, /* U+00fbcc: */
-                                                     0, /* U+00fbcd: */
-                                                     0, /* U+00fbce: */
-                                                     0, /* U+00fbcf: */
-                                                     0, /* U+00fbd0: */
-                                                     0, /* U+00fbd1: */
-                                                     0, /* U+00fbd2: */
-                                           RTUNI_ALPHA, /* U+00fbd3: ARABIC LETTER NG ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd4: ARABIC LETTER NG FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd5: ARABIC LETTER NG INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd6: ARABIC LETTER NG MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd7: ARABIC LETTER U ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd8: ARABIC LETTER U FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbd9: ARABIC LETTER OE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbda: ARABIC LETTER OE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbdb: ARABIC LETTER YU ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbdc: ARABIC LETTER YU FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbdd: ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbde: ARABIC LETTER VE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbdf: ARABIC LETTER VE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe0: ARABIC LETTER KIRGHIZ OE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe1: ARABIC LETTER KIRGHIZ OE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe2: ARABIC LETTER KIRGHIZ YU ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe3: ARABIC LETTER KIRGHIZ YU FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe4: ARABIC LETTER E ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe5: ARABIC LETTER E FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe6: ARABIC LETTER E INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe7: ARABIC LETTER E MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe8: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbe9: ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbea: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbeb: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbec: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbed: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbee: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbef: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf1: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf2: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf3: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf4: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf5: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf6: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf7: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf8: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbf9: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbfa: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbfb: ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbfc: ARABIC LETTER FARSI YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fbfd: ARABIC LETTER FARSI YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbfe: ARABIC LETTER FARSI YEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fbff: ARABIC LETTER FARSI YEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc00: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc01: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc02: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc03: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc04: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc05: ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc06: ARABIC LIGATURE BEH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc07: ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc08: ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc09: ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0a: ARABIC LIGATURE BEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0b: ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0c: ARABIC LIGATURE TEH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0d: ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0e: ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc0f: ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc10: ARABIC LIGATURE TEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc11: ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc12: ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc13: ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc14: ARABIC LIGATURE THEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc15: ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc16: ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc17: ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc18: ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc19: ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1a: ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1b: ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1c: ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1d: ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1e: ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc1f: ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc20: ARABIC LIGATURE SAD WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc21: ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc22: ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc23: ARABIC LIGATURE DAD WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc24: ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc25: ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc26: ARABIC LIGATURE TAH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc27: ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc28: ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc29: ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2a: ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2b: ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2c: ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2d: ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2e: ARABIC LIGATURE FEH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc2f: ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc30: ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc31: ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc32: ARABIC LIGATURE FEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc33: ARABIC LIGATURE QAF WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc34: ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc35: ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc36: ARABIC LIGATURE QAF WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc37: ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc38: ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc39: ARABIC LIGATURE KAF WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3a: ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3b: ARABIC LIGATURE KAF WITH LAM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3c: ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3d: ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3e: ARABIC LIGATURE KAF WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc3f: ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc40: ARABIC LIGATURE LAM WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc41: ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc42: ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc43: ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc44: ARABIC LIGATURE LAM WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc45: ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc46: ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc47: ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc48: ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc49: ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4a: ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4b: ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4c: ARABIC LIGATURE NOON WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4d: ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4e: ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc4f: ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc50: ARABIC LIGATURE NOON WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc51: ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc52: ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc53: ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc54: ARABIC LIGATURE HEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc55: ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc56: ARABIC LIGATURE YEH WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc57: ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc58: ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc59: ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5a: ARABIC LIGATURE YEH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5b: ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5c: ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5d: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5e: ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc5f: ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc60: ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc61: ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc62: ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc63: ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fc64: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc65: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc66: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc67: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc68: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc69: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6a: ARABIC LIGATURE BEH WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6b: ARABIC LIGATURE BEH WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6c: ARABIC LIGATURE BEH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6d: ARABIC LIGATURE BEH WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6e: ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc6f: ARABIC LIGATURE BEH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc70: ARABIC LIGATURE TEH WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc71: ARABIC LIGATURE TEH WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc72: ARABIC LIGATURE TEH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc73: ARABIC LIGATURE TEH WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc74: ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc75: ARABIC LIGATURE TEH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc76: ARABIC LIGATURE THEH WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc77: ARABIC LIGATURE THEH WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc78: ARABIC LIGATURE THEH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc79: ARABIC LIGATURE THEH WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7a: ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7b: ARABIC LIGATURE THEH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7c: ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7d: ARABIC LIGATURE FEH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7e: ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc7f: ARABIC LIGATURE QAF WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc80: ARABIC LIGATURE KAF WITH ALEF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc81: ARABIC LIGATURE KAF WITH LAM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc82: ARABIC LIGATURE KAF WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc83: ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc84: ARABIC LIGATURE KAF WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc85: ARABIC LIGATURE LAM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc86: ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc87: ARABIC LIGATURE LAM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc88: ARABIC LIGATURE MEEM WITH ALEF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc89: ARABIC LIGATURE MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8a: ARABIC LIGATURE NOON WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8b: ARABIC LIGATURE NOON WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8c: ARABIC LIGATURE NOON WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8d: ARABIC LIGATURE NOON WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8e: ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc8f: ARABIC LIGATURE NOON WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc90: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc91: ARABIC LIGATURE YEH WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc92: ARABIC LIGATURE YEH WITH ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc93: ARABIC LIGATURE YEH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc94: ARABIC LIGATURE YEH WITH NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc95: ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc96: ARABIC LIGATURE YEH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc97: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc98: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc99: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9a: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9b: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9c: ARABIC LIGATURE BEH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9d: ARABIC LIGATURE BEH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9e: ARABIC LIGATURE BEH WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fc9f: ARABIC LIGATURE BEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca0: ARABIC LIGATURE BEH WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca1: ARABIC LIGATURE TEH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca2: ARABIC LIGATURE TEH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca3: ARABIC LIGATURE TEH WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca4: ARABIC LIGATURE TEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca5: ARABIC LIGATURE TEH WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca6: ARABIC LIGATURE THEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca7: ARABIC LIGATURE JEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca8: ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fca9: ARABIC LIGATURE HAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcaa: ARABIC LIGATURE HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcab: ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcac: ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcad: ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcae: ARABIC LIGATURE SEEN WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcaf: ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb0: ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb1: ARABIC LIGATURE SAD WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb2: ARABIC LIGATURE SAD WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb3: ARABIC LIGATURE SAD WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb4: ARABIC LIGATURE DAD WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb5: ARABIC LIGATURE DAD WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb6: ARABIC LIGATURE DAD WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb7: ARABIC LIGATURE DAD WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb8: ARABIC LIGATURE TAH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcb9: ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcba: ARABIC LIGATURE AIN WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcbb: ARABIC LIGATURE AIN WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcbc: ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcbd: ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcbe: ARABIC LIGATURE FEH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcbf: ARABIC LIGATURE FEH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc0: ARABIC LIGATURE FEH WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc1: ARABIC LIGATURE FEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc2: ARABIC LIGATURE QAF WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc3: ARABIC LIGATURE QAF WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc4: ARABIC LIGATURE KAF WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc5: ARABIC LIGATURE KAF WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc6: ARABIC LIGATURE KAF WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc7: ARABIC LIGATURE KAF WITH LAM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc8: ARABIC LIGATURE KAF WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcc9: ARABIC LIGATURE LAM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcca: ARABIC LIGATURE LAM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fccb: ARABIC LIGATURE LAM WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fccc: ARABIC LIGATURE LAM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fccd: ARABIC LIGATURE LAM WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcce: ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fccf: ARABIC LIGATURE MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd0: ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd1: ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd2: ARABIC LIGATURE NOON WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd3: ARABIC LIGATURE NOON WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd4: ARABIC LIGATURE NOON WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd5: ARABIC LIGATURE NOON WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd6: ARABIC LIGATURE NOON WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd7: ARABIC LIGATURE HEH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd8: ARABIC LIGATURE HEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcd9: ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcda: ARABIC LIGATURE YEH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcdb: ARABIC LIGATURE YEH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcdc: ARABIC LIGATURE YEH WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcdd: ARABIC LIGATURE YEH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcde: ARABIC LIGATURE YEH WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcdf: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce0: ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce1: ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce2: ARABIC LIGATURE BEH WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce3: ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce4: ARABIC LIGATURE TEH WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce5: ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce6: ARABIC LIGATURE THEH WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce7: ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce8: ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fce9: ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcea: ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fceb: ARABIC LIGATURE KAF WITH LAM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcec: ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fced: ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcee: ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcef: ARABIC LIGATURE NOON WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf0: ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf1: ARABIC LIGATURE YEH WITH HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf2: ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf3: ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf4: ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf5: ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf6: ARABIC LIGATURE TAH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf7: ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf8: ARABIC LIGATURE AIN WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcf9: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcfa: ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcfb: ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcfc: ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcfd: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcfe: ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fcff: ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd00: ARABIC LIGATURE HAH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd01: ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd02: ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd03: ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd04: ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd05: ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd06: ARABIC LIGATURE SAD WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd07: ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd08: ARABIC LIGATURE DAD WITH YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd09: ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0a: ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0b: ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0c: ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0d: ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0e: ARABIC LIGATURE SEEN WITH REH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd0f: ARABIC LIGATURE SAD WITH REH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd10: ARABIC LIGATURE DAD WITH REH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fd11: ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd12: ARABIC LIGATURE TAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd13: ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd14: ARABIC LIGATURE AIN WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd15: ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd16: ARABIC LIGATURE GHAIN WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd17: ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd18: ARABIC LIGATURE SEEN WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd19: ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1a: ARABIC LIGATURE SHEEN WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1b: ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1c: ARABIC LIGATURE HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1d: ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1e: ARABIC LIGATURE JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd1f: ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd20: ARABIC LIGATURE KHAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd21: ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd22: ARABIC LIGATURE SAD WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd23: ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd24: ARABIC LIGATURE DAD WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd25: ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd26: ARABIC LIGATURE SHEEN WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd27: ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd28: ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd29: ARABIC LIGATURE SHEEN WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2a: ARABIC LIGATURE SEEN WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2b: ARABIC LIGATURE SAD WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2c: ARABIC LIGATURE DAD WITH REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2d: ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2e: ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd2f: ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd30: ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd31: ARABIC LIGATURE SEEN WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd32: ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd33: ARABIC LIGATURE TAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd34: ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd35: ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd36: ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd37: ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd38: ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd39: ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd3a: ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd3b: ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd3c: ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd3d: ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM*/
-                                                     0, /* U+00fd3e: ORNATE LEFT PARENTHESIS*/
-                                                     0, /* U+00fd3f: ORNATE RIGHT PARENTHESIS*/
-                                                     0, /* U+00fd40: */
-                                                     0, /* U+00fd41: */
-                                                     0, /* U+00fd42: */
-                                                     0, /* U+00fd43: */
-                                                     0, /* U+00fd44: */
-                                                     0, /* U+00fd45: */
-                                                     0, /* U+00fd46: */
-                                                     0, /* U+00fd47: */
-                                                     0, /* U+00fd48: */
-                                                     0, /* U+00fd49: */
-                                                     0, /* U+00fd4a: */
-                                                     0, /* U+00fd4b: */
-                                                     0, /* U+00fd4c: */
-                                                     0, /* U+00fd4d: */
-                                                     0, /* U+00fd4e: */
-                                                     0, /* U+00fd4f: */
-                                           RTUNI_ALPHA, /* U+00fd50: ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd51: ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd52: ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd53: ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd54: ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd55: ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd56: ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd57: ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd58: ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd59: ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5a: ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5b: ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5c: ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5d: ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5e: ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd5f: ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd60: ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd61: ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd62: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd63: ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd64: ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd65: ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd66: ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd67: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd68: ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd69: ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6a: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6b: ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6c: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6d: ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6e: ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd6f: ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd70: ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd71: ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd72: ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd73: ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd74: ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd75: ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd76: ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd77: ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd78: ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd79: ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7a: ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7b: ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7c: ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7d: ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7e: ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd7f: ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd80: ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd81: ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd82: ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd83: ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd84: ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd85: ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd86: ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd87: ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd88: ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd89: ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8a: ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8b: ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8c: ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8d: ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8e: ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd8f: ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM*/
-                                                     0, /* U+00fd90: */
-                                                     0, /* U+00fd91: */
-                                           RTUNI_ALPHA, /* U+00fd92: ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd93: ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd94: ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd95: ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd96: ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd97: ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd98: ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd99: ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9a: ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9b: ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9c: ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9d: ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9e: ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fd9f: ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda0: ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda1: ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda2: ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda3: ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda4: ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda5: ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda6: ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda7: ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda8: ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fda9: ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdaa: ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdab: ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdac: ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdad: ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdae: ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdaf: ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb0: ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb1: ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb2: ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb3: ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb4: ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb5: ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb6: ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb7: ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb8: ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdb9: ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdba: ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdbb: ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdbc: ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdbd: ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdbe: ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdbf: ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc0: ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc1: ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc2: ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc3: ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc4: ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc5: ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc6: ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fdc7: ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM*/
-                                                     0, /* U+00fdc8: */
-                                                     0, /* U+00fdc9: */
-                                                     0, /* U+00fdca: */
-                                                     0, /* U+00fdcb: */
-                                                     0, /* U+00fdcc: */
-                                                     0, /* U+00fdcd: */
-                                                     0, /* U+00fdce: */
-                                                     0, /* U+00fdcf: */
-                                                     0, /* U+00fdd0: */
-                                                     0, /* U+00fdd1: */
-                                                     0, /* U+00fdd2: */
-                                                     0, /* U+00fdd3: */
-                                                     0, /* U+00fdd4: */
-                                                     0, /* U+00fdd5: */
-                                                     0, /* U+00fdd6: */
-                                                     0, /* U+00fdd7: */
-                                                     0, /* U+00fdd8: */
-                                                     0, /* U+00fdd9: */
-                                                     0, /* U+00fdda: */
-                                                     0, /* U+00fddb: */
-                                                     0, /* U+00fddc: */
-                                                     0, /* U+00fddd: */
-                                                     0, /* U+00fdde: */
-                                                     0, /* U+00fddf: */
-                                                     0, /* U+00fde0: */
-                                                     0, /* U+00fde1: */
-                                                     0, /* U+00fde2: */
-                                                     0, /* U+00fde3: */
-                                                     0, /* U+00fde4: */
-                                                     0, /* U+00fde5: */
-                                                     0, /* U+00fde6: */
-                                                     0, /* U+00fde7: */
-                                                     0, /* U+00fde8: */
-                                                     0, /* U+00fde9: */
-                                                     0, /* U+00fdea: */
-                                                     0, /* U+00fdeb: */
-                                                     0, /* U+00fdec: */
-                                                     0, /* U+00fded: */
-                                                     0, /* U+00fdee: */
-                                                     0, /* U+00fdef: */
-                                           RTUNI_ALPHA, /* U+00fdf0: ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf1: ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf2: ARABIC LIGATURE ALLAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf3: ARABIC LIGATURE AKBAR ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf4: ARABIC LIGATURE MOHAMMAD ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf5: ARABIC LIGATURE SALAM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf6: ARABIC LIGATURE RASOUL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf7: ARABIC LIGATURE ALAYHE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf8: ARABIC LIGATURE WASALLAM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdf9: ARABIC LIGATURE SALLA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fdfa: ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM*/
-                                           RTUNI_ALPHA, /* U+00fdfb: ARABIC LIGATURE JALLAJALALOUHOU*/
-                                                     0, /* U+00fdfc: RIAL SIGN*/
-                                                     0, /* U+00fdfd: ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM*/
-                                                     0, /* U+00fdfe: */
-                                                     0, /* U+00fdff: */
-                                                     0, /* U+00fe00: VARIATION SELECTOR-1*/
-                                                     0, /* U+00fe01: VARIATION SELECTOR-2*/
-                                                     0, /* U+00fe02: VARIATION SELECTOR-3*/
-                                                     0, /* U+00fe03: VARIATION SELECTOR-4*/
-                                                     0, /* U+00fe04: VARIATION SELECTOR-5*/
-                                                     0, /* U+00fe05: VARIATION SELECTOR-6*/
-                                                     0, /* U+00fe06: VARIATION SELECTOR-7*/
-                                                     0, /* U+00fe07: VARIATION SELECTOR-8*/
-                                                     0, /* U+00fe08: VARIATION SELECTOR-9*/
-                                                     0, /* U+00fe09: VARIATION SELECTOR-10*/
-                                                     0, /* U+00fe0a: VARIATION SELECTOR-11*/
-                                                     0, /* U+00fe0b: VARIATION SELECTOR-12*/
-                                                     0, /* U+00fe0c: VARIATION SELECTOR-13*/
-                                                     0, /* U+00fe0d: VARIATION SELECTOR-14*/
-                                                     0, /* U+00fe0e: VARIATION SELECTOR-15*/
-                                                     0, /* U+00fe0f: VARIATION SELECTOR-16*/
-                                                     0, /* U+00fe10: PRESENTATION FORM FOR VERTICAL COMMA*/
-                                                     0, /* U+00fe11: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA*/
-                                                     0, /* U+00fe12: PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP*/
-                                                     0, /* U+00fe13: PRESENTATION FORM FOR VERTICAL COLON*/
-                                                     0, /* U+00fe14: PRESENTATION FORM FOR VERTICAL SEMICOLON*/
-                                                     0, /* U+00fe15: PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK*/
-                                                     0, /* U+00fe16: PRESENTATION FORM FOR VERTICAL QUESTION MARK*/
-                                                     0, /* U+00fe17: PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET*/
-                                                     0, /* U+00fe18: PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET*/
-                                                     0, /* U+00fe19: PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS*/
-                                                     0, /* U+00fe1a: */
-                                                     0, /* U+00fe1b: */
-                                                     0, /* U+00fe1c: */
-                                                     0, /* U+00fe1d: */
-                                                     0, /* U+00fe1e: */
-                                                     0, /* U+00fe1f: */
-                                                     0, /* U+00fe20: COMBINING LIGATURE LEFT HALF*/
-                                                     0, /* U+00fe21: COMBINING LIGATURE RIGHT HALF*/
-                                                     0, /* U+00fe22: COMBINING DOUBLE TILDE LEFT HALF*/
-                                                     0, /* U+00fe23: COMBINING DOUBLE TILDE RIGHT HALF*/
-                                                     0, /* U+00fe24: */
-                                                     0, /* U+00fe25: */
-                                                     0, /* U+00fe26: */
-                                                     0, /* U+00fe27: */
-                                                     0, /* U+00fe28: */
-                                                     0, /* U+00fe29: */
-                                                     0, /* U+00fe2a: */
-                                                     0, /* U+00fe2b: */
-                                                     0, /* U+00fe2c: */
-                                                     0, /* U+00fe2d: */
-                                                     0, /* U+00fe2e: */
-                                                     0, /* U+00fe2f: */
-                                                     0, /* U+00fe30: PRESENTATION FORM FOR VERTICAL TWO DOT LEADER*/
-                                                     0, /* U+00fe31: PRESENTATION FORM FOR VERTICAL EM DASH*/
-                                                     0, /* U+00fe32: PRESENTATION FORM FOR VERTICAL EN DASH*/
-                                                     0, /* U+00fe33: PRESENTATION FORM FOR VERTICAL LOW LINE*/
-                                                     0, /* U+00fe34: PRESENTATION FORM FOR VERTICAL WAVY LOW LINE*/
-                                                     0, /* U+00fe35: PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS*/
-                                                     0, /* U+00fe36: PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS*/
-                                                     0, /* U+00fe37: PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET*/
-                                                     0, /* U+00fe38: PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET*/
-                                                     0, /* U+00fe39: PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+00fe3a: PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+00fe3b: PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET*/
-                                                     0, /* U+00fe3c: PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET*/
-                                                     0, /* U+00fe3d: PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+00fe3e: PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET*/
-                                                     0, /* U+00fe3f: PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET*/
-                                                     0, /* U+00fe40: PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET*/
-                                                     0, /* U+00fe41: PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/
-                                                     0, /* U+00fe42: PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/
-                                                     0, /* U+00fe43: PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/
-                                                     0, /* U+00fe44: PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/
-                                                     0, /* U+00fe45: SESAME DOT*/
-                                                     0, /* U+00fe46: WHITE SESAME DOT*/
-                                                     0, /* U+00fe47: PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET*/
-                                                     0, /* U+00fe48: PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET*/
-                                                     0, /* U+00fe49: DASHED OVERLINE*/
-                                                     0, /* U+00fe4a: CENTRELINE OVERLINE*/
-                                                     0, /* U+00fe4b: WAVY OVERLINE*/
-                                                     0, /* U+00fe4c: DOUBLE WAVY OVERLINE*/
-                                                     0, /* U+00fe4d: DASHED LOW LINE*/
-                                                     0, /* U+00fe4e: CENTRELINE LOW LINE*/
-                                                     0, /* U+00fe4f: WAVY LOW LINE*/
-                                                     0, /* U+00fe50: SMALL COMMA*/
-                                                     0, /* U+00fe51: SMALL IDEOGRAPHIC COMMA*/
-                                                     0, /* U+00fe52: SMALL FULL STOP*/
-                                                     0, /* U+00fe53: */
-                                                     0, /* U+00fe54: SMALL SEMICOLON*/
-                                                     0, /* U+00fe55: SMALL COLON*/
-                                                     0, /* U+00fe56: SMALL QUESTION MARK*/
-                                                     0, /* U+00fe57: SMALL EXCLAMATION MARK*/
-                                                     0, /* U+00fe58: SMALL EM DASH*/
-                                                     0, /* U+00fe59: SMALL LEFT PARENTHESIS*/
-                                                     0, /* U+00fe5a: SMALL RIGHT PARENTHESIS*/
-                                                     0, /* U+00fe5b: SMALL LEFT CURLY BRACKET*/
-                                                     0, /* U+00fe5c: SMALL RIGHT CURLY BRACKET*/
-                                                     0, /* U+00fe5d: SMALL LEFT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+00fe5e: SMALL RIGHT TORTOISE SHELL BRACKET*/
-                                                     0, /* U+00fe5f: SMALL NUMBER SIGN*/
-                                                     0, /* U+00fe60: SMALL AMPERSAND*/
-                                                     0, /* U+00fe61: SMALL ASTERISK*/
-                                                     0, /* U+00fe62: SMALL PLUS SIGN*/
-                                                     0, /* U+00fe63: SMALL HYPHEN-MINUS*/
-                                                     0, /* U+00fe64: SMALL LESS-THAN SIGN*/
-                                                     0, /* U+00fe65: SMALL GREATER-THAN SIGN*/
-                                                     0, /* U+00fe66: SMALL EQUALS SIGN*/
-                                                     0, /* U+00fe67: */
-                                                     0, /* U+00fe68: SMALL REVERSE SOLIDUS*/
-                                                     0, /* U+00fe69: SMALL DOLLAR SIGN*/
-                                                     0, /* U+00fe6a: SMALL PERCENT SIGN*/
-                                                     0, /* U+00fe6b: SMALL COMMERCIAL AT*/
-                                                     0, /* U+00fe6c: */
-                                                     0, /* U+00fe6d: */
-                                                     0, /* U+00fe6e: */
-                                                     0, /* U+00fe6f: */
-                                           RTUNI_ALPHA, /* U+00fe70: ARABIC FATHATAN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe71: ARABIC TATWEEL WITH FATHATAN ABOVE*/
-                                           RTUNI_ALPHA, /* U+00fe72: ARABIC DAMMATAN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe73: ARABIC TAIL FRAGMENT*/
-                                           RTUNI_ALPHA, /* U+00fe74: ARABIC KASRATAN ISOLATED FORM*/
-                                                     0, /* U+00fe75: */
-                                           RTUNI_ALPHA, /* U+00fe76: ARABIC FATHA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe77: ARABIC FATHA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe78: ARABIC DAMMA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe79: ARABIC DAMMA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7a: ARABIC KASRA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7b: ARABIC KASRA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7c: ARABIC SHADDA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7d: ARABIC SHADDA MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7e: ARABIC SUKUN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe7f: ARABIC SUKUN MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe80: ARABIC LETTER HAMZA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe81: ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe82: ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe83: ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe84: ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe85: ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe86: ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe87: ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe88: ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe89: ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8a: ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8b: ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8c: ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8d: ARABIC LETTER ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8e: ARABIC LETTER ALEF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe8f: ARABIC LETTER BEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe90: ARABIC LETTER BEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe91: ARABIC LETTER BEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe92: ARABIC LETTER BEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe93: ARABIC LETTER TEH MARBUTA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe94: ARABIC LETTER TEH MARBUTA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe95: ARABIC LETTER TEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe96: ARABIC LETTER TEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe97: ARABIC LETTER TEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe98: ARABIC LETTER TEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe99: ARABIC LETTER THEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9a: ARABIC LETTER THEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9b: ARABIC LETTER THEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9c: ARABIC LETTER THEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9d: ARABIC LETTER JEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9e: ARABIC LETTER JEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fe9f: ARABIC LETTER JEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea0: ARABIC LETTER JEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea1: ARABIC LETTER HAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fea2: ARABIC LETTER HAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea3: ARABIC LETTER HAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea4: ARABIC LETTER HAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea5: ARABIC LETTER KHAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fea6: ARABIC LETTER KHAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea7: ARABIC LETTER KHAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea8: ARABIC LETTER KHAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fea9: ARABIC LETTER DAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feaa: ARABIC LETTER DAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feab: ARABIC LETTER THAL ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feac: ARABIC LETTER THAL FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fead: ARABIC LETTER REH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feae: ARABIC LETTER REH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feaf: ARABIC LETTER ZAIN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feb0: ARABIC LETTER ZAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb1: ARABIC LETTER SEEN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feb2: ARABIC LETTER SEEN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb3: ARABIC LETTER SEEN INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb4: ARABIC LETTER SEEN MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb5: ARABIC LETTER SHEEN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feb6: ARABIC LETTER SHEEN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb7: ARABIC LETTER SHEEN INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb8: ARABIC LETTER SHEEN MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feb9: ARABIC LETTER SAD ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feba: ARABIC LETTER SAD FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00febb: ARABIC LETTER SAD INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00febc: ARABIC LETTER SAD MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00febd: ARABIC LETTER DAD ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00febe: ARABIC LETTER DAD FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00febf: ARABIC LETTER DAD INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec0: ARABIC LETTER DAD MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec1: ARABIC LETTER TAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fec2: ARABIC LETTER TAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec3: ARABIC LETTER TAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec4: ARABIC LETTER TAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec5: ARABIC LETTER ZAH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fec6: ARABIC LETTER ZAH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec7: ARABIC LETTER ZAH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec8: ARABIC LETTER ZAH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fec9: ARABIC LETTER AIN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feca: ARABIC LETTER AIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fecb: ARABIC LETTER AIN INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fecc: ARABIC LETTER AIN MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fecd: ARABIC LETTER GHAIN ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fece: ARABIC LETTER GHAIN FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fecf: ARABIC LETTER GHAIN INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed0: ARABIC LETTER GHAIN MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed1: ARABIC LETTER FEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fed2: ARABIC LETTER FEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed3: ARABIC LETTER FEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed4: ARABIC LETTER FEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed5: ARABIC LETTER QAF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fed6: ARABIC LETTER QAF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed7: ARABIC LETTER QAF INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed8: ARABIC LETTER QAF MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fed9: ARABIC LETTER KAF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feda: ARABIC LETTER KAF FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fedb: ARABIC LETTER KAF INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fedc: ARABIC LETTER KAF MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fedd: ARABIC LETTER LAM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fede: ARABIC LETTER LAM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fedf: ARABIC LETTER LAM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee0: ARABIC LETTER LAM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee1: ARABIC LETTER MEEM ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fee2: ARABIC LETTER MEEM FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee3: ARABIC LETTER MEEM INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee4: ARABIC LETTER MEEM MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee5: ARABIC LETTER NOON ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fee6: ARABIC LETTER NOON FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee7: ARABIC LETTER NOON INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee8: ARABIC LETTER NOON MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fee9: ARABIC LETTER HEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feea: ARABIC LETTER HEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feeb: ARABIC LETTER HEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feec: ARABIC LETTER HEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feed: ARABIC LETTER WAW ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00feee: ARABIC LETTER WAW FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00feef: ARABIC LETTER ALEF MAKSURA ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fef0: ARABIC LETTER ALEF MAKSURA FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef1: ARABIC LETTER YEH ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fef2: ARABIC LETTER YEH FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef3: ARABIC LETTER YEH INITIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef4: ARABIC LETTER YEH MEDIAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef5: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fef6: ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef7: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fef8: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fef9: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fefa: ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM*/
-                                           RTUNI_ALPHA, /* U+00fefb: ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM*/
-                                           RTUNI_ALPHA, /* U+00fefc: ARABIC LIGATURE LAM WITH ALEF FINAL FORM*/
-                                                     0, /* U+00fefd: */
-                                                     0, /* U+00fefe: */
-                                                     0, /* U+00feff: ZERO WIDTH NO-BREAK SPACE*/
-                                                     0, /* U+00ff00: */
-                                                     0, /* U+00ff01: FULLWIDTH EXCLAMATION MARK*/
-                                                     0, /* U+00ff02: FULLWIDTH QUOTATION MARK*/
-                                                     0, /* U+00ff03: FULLWIDTH NUMBER SIGN*/
-                                                     0, /* U+00ff04: FULLWIDTH DOLLAR SIGN*/
-                                                     0, /* U+00ff05: FULLWIDTH PERCENT SIGN*/
-                                                     0, /* U+00ff06: FULLWIDTH AMPERSAND*/
-                                                     0, /* U+00ff07: FULLWIDTH APOSTROPHE*/
-                                                     0, /* U+00ff08: FULLWIDTH LEFT PARENTHESIS*/
-                                                     0, /* U+00ff09: FULLWIDTH RIGHT PARENTHESIS*/
-                                                     0, /* U+00ff0a: FULLWIDTH ASTERISK*/
-                                                     0, /* U+00ff0b: FULLWIDTH PLUS SIGN*/
-                                                     0, /* U+00ff0c: FULLWIDTH COMMA*/
-                                                     0, /* U+00ff0d: FULLWIDTH HYPHEN-MINUS*/
-                                                     0, /* U+00ff0e: FULLWIDTH FULL STOP*/
-                                                     0, /* U+00ff0f: FULLWIDTH SOLIDUS*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff10: FULLWIDTH DIGIT ZERO*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff11: FULLWIDTH DIGIT ONE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff12: FULLWIDTH DIGIT TWO*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff13: FULLWIDTH DIGIT THREE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff14: FULLWIDTH DIGIT FOUR*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff15: FULLWIDTH DIGIT FIVE*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff16: FULLWIDTH DIGIT SIX*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff17: FULLWIDTH DIGIT SEVEN*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff18: FULLWIDTH DIGIT EIGHT*/
-                           RTUNI_XDIGIT | RTUNI_DDIGIT, /* U+00ff19: FULLWIDTH DIGIT NINE*/
-                                                     0, /* U+00ff1a: FULLWIDTH COLON*/
-                                                     0, /* U+00ff1b: FULLWIDTH SEMICOLON*/
-                                                     0, /* U+00ff1c: FULLWIDTH LESS-THAN SIGN*/
-                                                     0, /* U+00ff1d: FULLWIDTH EQUALS SIGN*/
-                                                     0, /* U+00ff1e: FULLWIDTH GREATER-THAN SIGN*/
-                                                     0, /* U+00ff1f: FULLWIDTH QUESTION MARK*/
-                                                     0, /* U+00ff20: FULLWIDTH COMMERCIAL AT*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_UPPER, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
-                                                     0, /* U+00ff3b: FULLWIDTH LEFT SQUARE BRACKET*/
-                                                     0, /* U+00ff3c: FULLWIDTH REVERSE SOLIDUS*/
-                                                     0, /* U+00ff3d: FULLWIDTH RIGHT SQUARE BRACKET*/
-                                                     0, /* U+00ff3e: FULLWIDTH CIRCUMFLEX ACCENT*/
-                                                     0, /* U+00ff3f: FULLWIDTH LOW LINE*/
-                                                     0, /* U+00ff40: FULLWIDTH GRAVE ACCENT*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
-              RTUNI_ALPHA | RTUNI_XDIGIT | RTUNI_LOWER, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
-                                                     0, /* U+00ff5b: FULLWIDTH LEFT CURLY BRACKET*/
-                                                     0, /* U+00ff5c: FULLWIDTH VERTICAL LINE*/
-                                                     0, /* U+00ff5d: FULLWIDTH RIGHT CURLY BRACKET*/
-                                                     0, /* U+00ff5e: FULLWIDTH TILDE*/
-                                                     0, /* U+00ff5f: FULLWIDTH LEFT WHITE PARENTHESIS*/
-                                                     0, /* U+00ff60: FULLWIDTH RIGHT WHITE PARENTHESIS*/
-                                                     0, /* U+00ff61: HALFWIDTH IDEOGRAPHIC FULL STOP*/
-                                                     0, /* U+00ff62: HALFWIDTH LEFT CORNER BRACKET*/
-                                                     0, /* U+00ff63: HALFWIDTH RIGHT CORNER BRACKET*/
-                                                     0, /* U+00ff64: HALFWIDTH IDEOGRAPHIC COMMA*/
-                                                     0, /* U+00ff65: HALFWIDTH KATAKANA MIDDLE DOT*/
-                                           RTUNI_ALPHA, /* U+00ff66: HALFWIDTH KATAKANA LETTER WO*/
-                                           RTUNI_ALPHA, /* U+00ff67: HALFWIDTH KATAKANA LETTER SMALL A*/
-                                           RTUNI_ALPHA, /* U+00ff68: HALFWIDTH KATAKANA LETTER SMALL I*/
-                                           RTUNI_ALPHA, /* U+00ff69: HALFWIDTH KATAKANA LETTER SMALL U*/
-                                           RTUNI_ALPHA, /* U+00ff6a: HALFWIDTH KATAKANA LETTER SMALL E*/
-                                           RTUNI_ALPHA, /* U+00ff6b: HALFWIDTH KATAKANA LETTER SMALL O*/
-                                           RTUNI_ALPHA, /* U+00ff6c: HALFWIDTH KATAKANA LETTER SMALL YA*/
-                                           RTUNI_ALPHA, /* U+00ff6d: HALFWIDTH KATAKANA LETTER SMALL YU*/
-                                           RTUNI_ALPHA, /* U+00ff6e: HALFWIDTH KATAKANA LETTER SMALL YO*/
-                                           RTUNI_ALPHA, /* U+00ff6f: HALFWIDTH KATAKANA LETTER SMALL TU*/
-                                           RTUNI_ALPHA, /* U+00ff70: HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+00ff71: HALFWIDTH KATAKANA LETTER A*/
-                                           RTUNI_ALPHA, /* U+00ff72: HALFWIDTH KATAKANA LETTER I*/
-                                           RTUNI_ALPHA, /* U+00ff73: HALFWIDTH KATAKANA LETTER U*/
-                                           RTUNI_ALPHA, /* U+00ff74: HALFWIDTH KATAKANA LETTER E*/
-                                           RTUNI_ALPHA, /* U+00ff75: HALFWIDTH KATAKANA LETTER O*/
-                                           RTUNI_ALPHA, /* U+00ff76: HALFWIDTH KATAKANA LETTER KA*/
-                                           RTUNI_ALPHA, /* U+00ff77: HALFWIDTH KATAKANA LETTER KI*/
-                                           RTUNI_ALPHA, /* U+00ff78: HALFWIDTH KATAKANA LETTER KU*/
-                                           RTUNI_ALPHA, /* U+00ff79: HALFWIDTH KATAKANA LETTER KE*/
-                                           RTUNI_ALPHA, /* U+00ff7a: HALFWIDTH KATAKANA LETTER KO*/
-                                           RTUNI_ALPHA, /* U+00ff7b: HALFWIDTH KATAKANA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+00ff7c: HALFWIDTH KATAKANA LETTER SI*/
-                                           RTUNI_ALPHA, /* U+00ff7d: HALFWIDTH KATAKANA LETTER SU*/
-                                           RTUNI_ALPHA, /* U+00ff7e: HALFWIDTH KATAKANA LETTER SE*/
-                                           RTUNI_ALPHA, /* U+00ff7f: HALFWIDTH KATAKANA LETTER SO*/
-                                           RTUNI_ALPHA, /* U+00ff80: HALFWIDTH KATAKANA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+00ff81: HALFWIDTH KATAKANA LETTER TI*/
-                                           RTUNI_ALPHA, /* U+00ff82: HALFWIDTH KATAKANA LETTER TU*/
-                                           RTUNI_ALPHA, /* U+00ff83: HALFWIDTH KATAKANA LETTER TE*/
-                                           RTUNI_ALPHA, /* U+00ff84: HALFWIDTH KATAKANA LETTER TO*/
-                                           RTUNI_ALPHA, /* U+00ff85: HALFWIDTH KATAKANA LETTER NA*/
-                                           RTUNI_ALPHA, /* U+00ff86: HALFWIDTH KATAKANA LETTER NI*/
-                                           RTUNI_ALPHA, /* U+00ff87: HALFWIDTH KATAKANA LETTER NU*/
-                                           RTUNI_ALPHA, /* U+00ff88: HALFWIDTH KATAKANA LETTER NE*/
-                                           RTUNI_ALPHA, /* U+00ff89: HALFWIDTH KATAKANA LETTER NO*/
-                                           RTUNI_ALPHA, /* U+00ff8a: HALFWIDTH KATAKANA LETTER HA*/
-                                           RTUNI_ALPHA, /* U+00ff8b: HALFWIDTH KATAKANA LETTER HI*/
-                                           RTUNI_ALPHA, /* U+00ff8c: HALFWIDTH KATAKANA LETTER HU*/
-                                           RTUNI_ALPHA, /* U+00ff8d: HALFWIDTH KATAKANA LETTER HE*/
-                                           RTUNI_ALPHA, /* U+00ff8e: HALFWIDTH KATAKANA LETTER HO*/
-                                           RTUNI_ALPHA, /* U+00ff8f: HALFWIDTH KATAKANA LETTER MA*/
-                                           RTUNI_ALPHA, /* U+00ff90: HALFWIDTH KATAKANA LETTER MI*/
-                                           RTUNI_ALPHA, /* U+00ff91: HALFWIDTH KATAKANA LETTER MU*/
-                                           RTUNI_ALPHA, /* U+00ff92: HALFWIDTH KATAKANA LETTER ME*/
-                                           RTUNI_ALPHA, /* U+00ff93: HALFWIDTH KATAKANA LETTER MO*/
-                                           RTUNI_ALPHA, /* U+00ff94: HALFWIDTH KATAKANA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00ff95: HALFWIDTH KATAKANA LETTER YU*/
-                                           RTUNI_ALPHA, /* U+00ff96: HALFWIDTH KATAKANA LETTER YO*/
-                                           RTUNI_ALPHA, /* U+00ff97: HALFWIDTH KATAKANA LETTER RA*/
-                                           RTUNI_ALPHA, /* U+00ff98: HALFWIDTH KATAKANA LETTER RI*/
-                                           RTUNI_ALPHA, /* U+00ff99: HALFWIDTH KATAKANA LETTER RU*/
-                                           RTUNI_ALPHA, /* U+00ff9a: HALFWIDTH KATAKANA LETTER RE*/
-                                           RTUNI_ALPHA, /* U+00ff9b: HALFWIDTH KATAKANA LETTER RO*/
-                                           RTUNI_ALPHA, /* U+00ff9c: HALFWIDTH KATAKANA LETTER WA*/
-                                           RTUNI_ALPHA, /* U+00ff9d: HALFWIDTH KATAKANA LETTER N*/
-                                           RTUNI_ALPHA, /* U+00ff9e: HALFWIDTH KATAKANA VOICED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+00ff9f: HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK*/
-                                           RTUNI_ALPHA, /* U+00ffa0: HALFWIDTH HANGUL FILLER*/
-                                           RTUNI_ALPHA, /* U+00ffa1: HALFWIDTH HANGUL LETTER KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00ffa2: HALFWIDTH HANGUL LETTER SSANGKIYEOK*/
-                                           RTUNI_ALPHA, /* U+00ffa3: HALFWIDTH HANGUL LETTER KIYEOK-SIOS*/
-                                           RTUNI_ALPHA, /* U+00ffa4: HALFWIDTH HANGUL LETTER NIEUN*/
-                                           RTUNI_ALPHA, /* U+00ffa5: HALFWIDTH HANGUL LETTER NIEUN-CIEUC*/
-                                           RTUNI_ALPHA, /* U+00ffa6: HALFWIDTH HANGUL LETTER NIEUN-HIEUH*/
-                                           RTUNI_ALPHA, /* U+00ffa7: HALFWIDTH HANGUL LETTER TIKEUT*/
-                                           RTUNI_ALPHA, /* U+00ffa8: HALFWIDTH HANGUL LETTER SSANGTIKEUT*/
-                                           RTUNI_ALPHA, /* U+00ffa9: HALFWIDTH HANGUL LETTER RIEUL*/
-                                           RTUNI_ALPHA, /* U+00ffaa: HALFWIDTH HANGUL LETTER RIEUL-KIYEOK*/
-                                           RTUNI_ALPHA, /* U+00ffab: HALFWIDTH HANGUL LETTER RIEUL-MIEUM*/
-                                           RTUNI_ALPHA, /* U+00ffac: HALFWIDTH HANGUL LETTER RIEUL-PIEUP*/
-                                           RTUNI_ALPHA, /* U+00ffad: HALFWIDTH HANGUL LETTER RIEUL-SIOS*/
-                                           RTUNI_ALPHA, /* U+00ffae: HALFWIDTH HANGUL LETTER RIEUL-THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00ffaf: HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00ffb0: HALFWIDTH HANGUL LETTER RIEUL-HIEUH*/
-                                           RTUNI_ALPHA, /* U+00ffb1: HALFWIDTH HANGUL LETTER MIEUM*/
-                                           RTUNI_ALPHA, /* U+00ffb2: HALFWIDTH HANGUL LETTER PIEUP*/
-                                           RTUNI_ALPHA, /* U+00ffb3: HALFWIDTH HANGUL LETTER SSANGPIEUP*/
-                                           RTUNI_ALPHA, /* U+00ffb4: HALFWIDTH HANGUL LETTER PIEUP-SIOS*/
-                                           RTUNI_ALPHA, /* U+00ffb5: HALFWIDTH HANGUL LETTER SIOS*/
-                                           RTUNI_ALPHA, /* U+00ffb6: HALFWIDTH HANGUL LETTER SSANGSIOS*/
-                                           RTUNI_ALPHA, /* U+00ffb7: HALFWIDTH HANGUL LETTER IEUNG*/
-                                           RTUNI_ALPHA, /* U+00ffb8: HALFWIDTH HANGUL LETTER CIEUC*/
-                                           RTUNI_ALPHA, /* U+00ffb9: HALFWIDTH HANGUL LETTER SSANGCIEUC*/
-                                           RTUNI_ALPHA, /* U+00ffba: HALFWIDTH HANGUL LETTER CHIEUCH*/
-                                           RTUNI_ALPHA, /* U+00ffbb: HALFWIDTH HANGUL LETTER KHIEUKH*/
-                                           RTUNI_ALPHA, /* U+00ffbc: HALFWIDTH HANGUL LETTER THIEUTH*/
-                                           RTUNI_ALPHA, /* U+00ffbd: HALFWIDTH HANGUL LETTER PHIEUPH*/
-                                           RTUNI_ALPHA, /* U+00ffbe: HALFWIDTH HANGUL LETTER HIEUH*/
-                                                     0, /* U+00ffbf: */
-                                                     0, /* U+00ffc0: */
-                                                     0, /* U+00ffc1: */
-                                           RTUNI_ALPHA, /* U+00ffc2: HALFWIDTH HANGUL LETTER A*/
-                                           RTUNI_ALPHA, /* U+00ffc3: HALFWIDTH HANGUL LETTER AE*/
-                                           RTUNI_ALPHA, /* U+00ffc4: HALFWIDTH HANGUL LETTER YA*/
-                                           RTUNI_ALPHA, /* U+00ffc5: HALFWIDTH HANGUL LETTER YAE*/
-                                           RTUNI_ALPHA, /* U+00ffc6: HALFWIDTH HANGUL LETTER EO*/
-                                           RTUNI_ALPHA, /* U+00ffc7: HALFWIDTH HANGUL LETTER E*/
-                                                     0, /* U+00ffc8: */
-                                                     0, /* U+00ffc9: */
-                                           RTUNI_ALPHA, /* U+00ffca: HALFWIDTH HANGUL LETTER YEO*/
-                                           RTUNI_ALPHA, /* U+00ffcb: HALFWIDTH HANGUL LETTER YE*/
-                                           RTUNI_ALPHA, /* U+00ffcc: HALFWIDTH HANGUL LETTER O*/
-                                           RTUNI_ALPHA, /* U+00ffcd: HALFWIDTH HANGUL LETTER WA*/
-                                           RTUNI_ALPHA, /* U+00ffce: HALFWIDTH HANGUL LETTER WAE*/
-                                           RTUNI_ALPHA, /* U+00ffcf: HALFWIDTH HANGUL LETTER OE*/
-                                                     0, /* U+00ffd0: */
-                                                     0, /* U+00ffd1: */
-                                           RTUNI_ALPHA, /* U+00ffd2: HALFWIDTH HANGUL LETTER YO*/
-                                           RTUNI_ALPHA, /* U+00ffd3: HALFWIDTH HANGUL LETTER U*/
-                                           RTUNI_ALPHA, /* U+00ffd4: HALFWIDTH HANGUL LETTER WEO*/
-                                           RTUNI_ALPHA, /* U+00ffd5: HALFWIDTH HANGUL LETTER WE*/
-                                           RTUNI_ALPHA, /* U+00ffd6: HALFWIDTH HANGUL LETTER WI*/
-                                           RTUNI_ALPHA, /* U+00ffd7: HALFWIDTH HANGUL LETTER YU*/
-                                                     0, /* U+00ffd8: */
-                                                     0, /* U+00ffd9: */
-                                           RTUNI_ALPHA, /* U+00ffda: HALFWIDTH HANGUL LETTER EU*/
-                                           RTUNI_ALPHA, /* U+00ffdb: HALFWIDTH HANGUL LETTER YI*/
-                                           RTUNI_ALPHA, /* U+00ffdc: HALFWIDTH HANGUL LETTER I*/
-                                                     0, /* U+00ffdd: */
-                                                     0, /* U+00ffde: */
-                                                     0, /* U+00ffdf: */
-                                                     0, /* U+00ffe0: FULLWIDTH CENT SIGN*/
-                                                     0, /* U+00ffe1: FULLWIDTH POUND SIGN*/
-                                                     0, /* U+00ffe2: FULLWIDTH NOT SIGN*/
-                                                     0, /* U+00ffe3: FULLWIDTH MACRON*/
-                                                     0, /* U+00ffe4: FULLWIDTH BROKEN BAR*/
-                                                     0, /* U+00ffe5: FULLWIDTH YEN SIGN*/
-                                                     0, /* U+00ffe6: FULLWIDTH WON SIGN*/
-                                                     0, /* U+00ffe7: */
-                                                     0, /* U+00ffe8: HALFWIDTH FORMS LIGHT VERTICAL*/
-                                                     0, /* U+00ffe9: HALFWIDTH LEFTWARDS ARROW*/
-                                                     0, /* U+00ffea: HALFWIDTH UPWARDS ARROW*/
-                                                     0, /* U+00ffeb: HALFWIDTH RIGHTWARDS ARROW*/
-                                                     0, /* U+00ffec: HALFWIDTH DOWNWARDS ARROW*/
-                                                     0, /* U+00ffed: HALFWIDTH BLACK SQUARE*/
-                                                     0, /* U+00ffee: HALFWIDTH WHITE CIRCLE*/
-                                                     0, /* U+00ffef: */
-                                                     0, /* U+00fff0: */
-                                                     0, /* U+00fff1: */
-                                                     0, /* U+00fff2: */
-                                                     0, /* U+00fff3: */
-                                                     0, /* U+00fff4: */
-                                                     0, /* U+00fff5: */
-                                                     0, /* U+00fff6: */
-                                                     0, /* U+00fff7: */
-                                                     0, /* U+00fff8: */
-                                                     0, /* U+00fff9: INTERLINEAR ANNOTATION ANCHOR*/
-                                                     0, /* U+00fffa: INTERLINEAR ANNOTATION SEPARATOR*/
-                                                     0, /* U+00fffb: INTERLINEAR ANNOTATION TERMINATOR*/
-                                                     0, /* U+00fffc: OBJECT REPLACEMENT CHARACTER*/
-                                                     0, /* U+00fffd: REPLACEMENT CHARACTER*/
-                                                     0, /* U+00fffe: */
-                                                     0, /* U+00ffff: */
-                                           RTUNI_ALPHA, /* U+010000: LINEAR B SYLLABLE B008 A*/
-                                           RTUNI_ALPHA, /* U+010001: LINEAR B SYLLABLE B038 E*/
-                                           RTUNI_ALPHA, /* U+010002: LINEAR B SYLLABLE B028 I*/
-                                           RTUNI_ALPHA, /* U+010003: LINEAR B SYLLABLE B061 O*/
-                                           RTUNI_ALPHA, /* U+010004: LINEAR B SYLLABLE B010 U*/
-                                           RTUNI_ALPHA, /* U+010005: LINEAR B SYLLABLE B001 DA*/
-                                           RTUNI_ALPHA, /* U+010006: LINEAR B SYLLABLE B045 DE*/
-                                           RTUNI_ALPHA, /* U+010007: LINEAR B SYLLABLE B007 DI*/
-                                           RTUNI_ALPHA, /* U+010008: LINEAR B SYLLABLE B014 DO*/
-                                           RTUNI_ALPHA, /* U+010009: LINEAR B SYLLABLE B051 DU*/
-                                           RTUNI_ALPHA, /* U+01000a: LINEAR B SYLLABLE B057 JA*/
-                                           RTUNI_ALPHA, /* U+01000b: LINEAR B SYLLABLE B046 JE*/
-                                                     0, /* U+01000c: */
-                                           RTUNI_ALPHA, /* U+01000d: LINEAR B SYLLABLE B036 JO*/
-                                           RTUNI_ALPHA, /* U+01000e: LINEAR B SYLLABLE B065 JU*/
-                                           RTUNI_ALPHA, /* U+01000f: LINEAR B SYLLABLE B077 KA*/
-                                           RTUNI_ALPHA, /* U+010010: LINEAR B SYLLABLE B044 KE*/
-                                           RTUNI_ALPHA, /* U+010011: LINEAR B SYLLABLE B067 KI*/
-                                           RTUNI_ALPHA, /* U+010012: LINEAR B SYLLABLE B070 KO*/
-                                           RTUNI_ALPHA, /* U+010013: LINEAR B SYLLABLE B081 KU*/
-                                           RTUNI_ALPHA, /* U+010014: LINEAR B SYLLABLE B080 MA*/
-                                           RTUNI_ALPHA, /* U+010015: LINEAR B SYLLABLE B013 ME*/
-                                           RTUNI_ALPHA, /* U+010016: LINEAR B SYLLABLE B073 MI*/
-                                           RTUNI_ALPHA, /* U+010017: LINEAR B SYLLABLE B015 MO*/
-                                           RTUNI_ALPHA, /* U+010018: LINEAR B SYLLABLE B023 MU*/
-                                           RTUNI_ALPHA, /* U+010019: LINEAR B SYLLABLE B006 NA*/
-                                           RTUNI_ALPHA, /* U+01001a: LINEAR B SYLLABLE B024 NE*/
-                                           RTUNI_ALPHA, /* U+01001b: LINEAR B SYLLABLE B030 NI*/
-                                           RTUNI_ALPHA, /* U+01001c: LINEAR B SYLLABLE B052 NO*/
-                                           RTUNI_ALPHA, /* U+01001d: LINEAR B SYLLABLE B055 NU*/
-                                           RTUNI_ALPHA, /* U+01001e: LINEAR B SYLLABLE B003 PA*/
-                                           RTUNI_ALPHA, /* U+01001f: LINEAR B SYLLABLE B072 PE*/
-                                           RTUNI_ALPHA, /* U+010020: LINEAR B SYLLABLE B039 PI*/
-                                           RTUNI_ALPHA, /* U+010021: LINEAR B SYLLABLE B011 PO*/
-                                           RTUNI_ALPHA, /* U+010022: LINEAR B SYLLABLE B050 PU*/
-                                           RTUNI_ALPHA, /* U+010023: LINEAR B SYLLABLE B016 QA*/
-                                           RTUNI_ALPHA, /* U+010024: LINEAR B SYLLABLE B078 QE*/
-                                           RTUNI_ALPHA, /* U+010025: LINEAR B SYLLABLE B021 QI*/
-                                           RTUNI_ALPHA, /* U+010026: LINEAR B SYLLABLE B032 QO*/
-                                                     0, /* U+010027: */
-                                           RTUNI_ALPHA, /* U+010028: LINEAR B SYLLABLE B060 RA*/
-                                           RTUNI_ALPHA, /* U+010029: LINEAR B SYLLABLE B027 RE*/
-                                           RTUNI_ALPHA, /* U+01002a: LINEAR B SYLLABLE B053 RI*/
-                                           RTUNI_ALPHA, /* U+01002b: LINEAR B SYLLABLE B002 RO*/
-                                           RTUNI_ALPHA, /* U+01002c: LINEAR B SYLLABLE B026 RU*/
-                                           RTUNI_ALPHA, /* U+01002d: LINEAR B SYLLABLE B031 SA*/
-                                           RTUNI_ALPHA, /* U+01002e: LINEAR B SYLLABLE B009 SE*/
-                                           RTUNI_ALPHA, /* U+01002f: LINEAR B SYLLABLE B041 SI*/
-                                           RTUNI_ALPHA, /* U+010030: LINEAR B SYLLABLE B012 SO*/
-                                           RTUNI_ALPHA, /* U+010031: LINEAR B SYLLABLE B058 SU*/
-                                           RTUNI_ALPHA, /* U+010032: LINEAR B SYLLABLE B059 TA*/
-                                           RTUNI_ALPHA, /* U+010033: LINEAR B SYLLABLE B004 TE*/
-                                           RTUNI_ALPHA, /* U+010034: LINEAR B SYLLABLE B037 TI*/
-                                           RTUNI_ALPHA, /* U+010035: LINEAR B SYLLABLE B005 TO*/
-                                           RTUNI_ALPHA, /* U+010036: LINEAR B SYLLABLE B069 TU*/
-                                           RTUNI_ALPHA, /* U+010037: LINEAR B SYLLABLE B054 WA*/
-                                           RTUNI_ALPHA, /* U+010038: LINEAR B SYLLABLE B075 WE*/
-                                           RTUNI_ALPHA, /* U+010039: LINEAR B SYLLABLE B040 WI*/
-                                           RTUNI_ALPHA, /* U+01003a: LINEAR B SYLLABLE B042 WO*/
-                                                     0, /* U+01003b: */
-                                           RTUNI_ALPHA, /* U+01003c: LINEAR B SYLLABLE B017 ZA*/
-                                           RTUNI_ALPHA, /* U+01003d: LINEAR B SYLLABLE B074 ZE*/
-                                                     0, /* U+01003e: */
-                                           RTUNI_ALPHA, /* U+01003f: LINEAR B SYLLABLE B020 ZO*/
-                                           RTUNI_ALPHA, /* U+010040: LINEAR B SYLLABLE B025 A2*/
-                                           RTUNI_ALPHA, /* U+010041: LINEAR B SYLLABLE B043 A3*/
-                                           RTUNI_ALPHA, /* U+010042: LINEAR B SYLLABLE B085 AU*/
-                                           RTUNI_ALPHA, /* U+010043: LINEAR B SYLLABLE B071 DWE*/
-                                           RTUNI_ALPHA, /* U+010044: LINEAR B SYLLABLE B090 DWO*/
-                                           RTUNI_ALPHA, /* U+010045: LINEAR B SYLLABLE B048 NWA*/
-                                           RTUNI_ALPHA, /* U+010046: LINEAR B SYLLABLE B029 PU2*/
-                                           RTUNI_ALPHA, /* U+010047: LINEAR B SYLLABLE B062 PTE*/
-                                           RTUNI_ALPHA, /* U+010048: LINEAR B SYLLABLE B076 RA2*/
-                                           RTUNI_ALPHA, /* U+010049: LINEAR B SYLLABLE B033 RA3*/
-                                           RTUNI_ALPHA, /* U+01004a: LINEAR B SYLLABLE B068 RO2*/
-                                           RTUNI_ALPHA, /* U+01004b: LINEAR B SYLLABLE B066 TA2*/
-                                           RTUNI_ALPHA, /* U+01004c: LINEAR B SYLLABLE B087 TWE*/
-                                           RTUNI_ALPHA, /* U+01004d: LINEAR B SYLLABLE B091 TWO*/
-                                                     0, /* U+01004e: */
-                                                     0, /* U+01004f: */
-                                           RTUNI_ALPHA, /* U+010050: LINEAR B SYMBOL B018*/
-                                           RTUNI_ALPHA, /* U+010051: LINEAR B SYMBOL B019*/
-                                           RTUNI_ALPHA, /* U+010052: LINEAR B SYMBOL B022*/
-                                           RTUNI_ALPHA, /* U+010053: LINEAR B SYMBOL B034*/
-                                           RTUNI_ALPHA, /* U+010054: LINEAR B SYMBOL B047*/
-                                           RTUNI_ALPHA, /* U+010055: LINEAR B SYMBOL B049*/
-                                           RTUNI_ALPHA, /* U+010056: LINEAR B SYMBOL B056*/
-                                           RTUNI_ALPHA, /* U+010057: LINEAR B SYMBOL B063*/
-                                           RTUNI_ALPHA, /* U+010058: LINEAR B SYMBOL B064*/
-                                           RTUNI_ALPHA, /* U+010059: LINEAR B SYMBOL B079*/
-                                           RTUNI_ALPHA, /* U+01005a: LINEAR B SYMBOL B082*/
-                                           RTUNI_ALPHA, /* U+01005b: LINEAR B SYMBOL B083*/
-                                           RTUNI_ALPHA, /* U+01005c: LINEAR B SYMBOL B086*/
-                                           RTUNI_ALPHA, /* U+01005d: LINEAR B SYMBOL B089*/
-                                                     0, /* U+01005e: */
-                                                     0, /* U+01005f: */
-                                                     0, /* U+010060: */
-                                                     0, /* U+010061: */
-                                                     0, /* U+010062: */
-                                                     0, /* U+010063: */
-                                                     0, /* U+010064: */
-                                                     0, /* U+010065: */
-                                                     0, /* U+010066: */
-                                                     0, /* U+010067: */
-                                                     0, /* U+010068: */
-                                                     0, /* U+010069: */
-                                                     0, /* U+01006a: */
-                                                     0, /* U+01006b: */
-                                                     0, /* U+01006c: */
-                                                     0, /* U+01006d: */
-                                                     0, /* U+01006e: */
-                                                     0, /* U+01006f: */
-                                                     0, /* U+010070: */
-                                                     0, /* U+010071: */
-                                                     0, /* U+010072: */
-                                                     0, /* U+010073: */
-                                                     0, /* U+010074: */
-                                                     0, /* U+010075: */
-                                                     0, /* U+010076: */
-                                                     0, /* U+010077: */
-                                                     0, /* U+010078: */
-                                                     0, /* U+010079: */
-                                                     0, /* U+01007a: */
-                                                     0, /* U+01007b: */
-                                                     0, /* U+01007c: */
-                                                     0, /* U+01007d: */
-                                                     0, /* U+01007e: */
-                                                     0, /* U+01007f: */
-                                           RTUNI_ALPHA, /* U+010080: LINEAR B IDEOGRAM B100 MAN*/
-                                           RTUNI_ALPHA, /* U+010081: LINEAR B IDEOGRAM B102 WOMAN*/
-                                           RTUNI_ALPHA, /* U+010082: LINEAR B IDEOGRAM B104 DEER*/
-                                           RTUNI_ALPHA, /* U+010083: LINEAR B IDEOGRAM B105 EQUID*/
-                                           RTUNI_ALPHA, /* U+010084: LINEAR B IDEOGRAM B105F MARE*/
-                                           RTUNI_ALPHA, /* U+010085: LINEAR B IDEOGRAM B105M STALLION*/
-                                           RTUNI_ALPHA, /* U+010086: LINEAR B IDEOGRAM B106F EWE*/
-                                           RTUNI_ALPHA, /* U+010087: LINEAR B IDEOGRAM B106M RAM*/
-                                           RTUNI_ALPHA, /* U+010088: LINEAR B IDEOGRAM B107F SHE-GOAT*/
-                                           RTUNI_ALPHA, /* U+010089: LINEAR B IDEOGRAM B107M HE-GOAT*/
-                                           RTUNI_ALPHA, /* U+01008a: LINEAR B IDEOGRAM B108F SOW*/
-                                           RTUNI_ALPHA, /* U+01008b: LINEAR B IDEOGRAM B108M BOAR*/
-                                           RTUNI_ALPHA, /* U+01008c: LINEAR B IDEOGRAM B109F COW*/
-                                           RTUNI_ALPHA, /* U+01008d: LINEAR B IDEOGRAM B109M BULL*/
-                                           RTUNI_ALPHA, /* U+01008e: LINEAR B IDEOGRAM B120 WHEAT*/
-                                           RTUNI_ALPHA, /* U+01008f: LINEAR B IDEOGRAM B121 BARLEY*/
-                                           RTUNI_ALPHA, /* U+010090: LINEAR B IDEOGRAM B122 OLIVE*/
-                                           RTUNI_ALPHA, /* U+010091: LINEAR B IDEOGRAM B123 SPICE*/
-                                           RTUNI_ALPHA, /* U+010092: LINEAR B IDEOGRAM B125 CYPERUS*/
-                                           RTUNI_ALPHA, /* U+010093: LINEAR B MONOGRAM B127 KAPO*/
-                                           RTUNI_ALPHA, /* U+010094: LINEAR B MONOGRAM B128 KANAKO*/
-                                           RTUNI_ALPHA, /* U+010095: LINEAR B IDEOGRAM B130 OIL*/
-                                           RTUNI_ALPHA, /* U+010096: LINEAR B IDEOGRAM B131 WINE*/
-                                           RTUNI_ALPHA, /* U+010097: LINEAR B IDEOGRAM B132*/
-                                           RTUNI_ALPHA, /* U+010098: LINEAR B MONOGRAM B133 AREPA*/
-                                           RTUNI_ALPHA, /* U+010099: LINEAR B MONOGRAM B135 MERI*/
-                                           RTUNI_ALPHA, /* U+01009a: LINEAR B IDEOGRAM B140 BRONZE*/
-                                           RTUNI_ALPHA, /* U+01009b: LINEAR B IDEOGRAM B141 GOLD*/
-                                           RTUNI_ALPHA, /* U+01009c: LINEAR B IDEOGRAM B142*/
-                                           RTUNI_ALPHA, /* U+01009d: LINEAR B IDEOGRAM B145 WOOL*/
-                                           RTUNI_ALPHA, /* U+01009e: LINEAR B IDEOGRAM B146*/
-                                           RTUNI_ALPHA, /* U+01009f: LINEAR B IDEOGRAM B150*/
-                                           RTUNI_ALPHA, /* U+0100a0: LINEAR B IDEOGRAM B151 HORN*/
-                                           RTUNI_ALPHA, /* U+0100a1: LINEAR B IDEOGRAM B152*/
-                                           RTUNI_ALPHA, /* U+0100a2: LINEAR B IDEOGRAM B153*/
-                                           RTUNI_ALPHA, /* U+0100a3: LINEAR B IDEOGRAM B154*/
-                                           RTUNI_ALPHA, /* U+0100a4: LINEAR B MONOGRAM B156 TURO2*/
-                                           RTUNI_ALPHA, /* U+0100a5: LINEAR B IDEOGRAM B157*/
-                                           RTUNI_ALPHA, /* U+0100a6: LINEAR B IDEOGRAM B158*/
-                                           RTUNI_ALPHA, /* U+0100a7: LINEAR B IDEOGRAM B159 CLOTH*/
-                                           RTUNI_ALPHA, /* U+0100a8: LINEAR B IDEOGRAM B160*/
-                                           RTUNI_ALPHA, /* U+0100a9: LINEAR B IDEOGRAM B161*/
-                                           RTUNI_ALPHA, /* U+0100aa: LINEAR B IDEOGRAM B162 GARMENT*/
-                                           RTUNI_ALPHA, /* U+0100ab: LINEAR B IDEOGRAM B163 ARMOUR*/
-                                           RTUNI_ALPHA, /* U+0100ac: LINEAR B IDEOGRAM B164*/
-                                           RTUNI_ALPHA, /* U+0100ad: LINEAR B IDEOGRAM B165*/
-                                           RTUNI_ALPHA, /* U+0100ae: LINEAR B IDEOGRAM B166*/
-                                           RTUNI_ALPHA, /* U+0100af: LINEAR B IDEOGRAM B167*/
-                                           RTUNI_ALPHA, /* U+0100b0: LINEAR B IDEOGRAM B168*/
-                                           RTUNI_ALPHA, /* U+0100b1: LINEAR B IDEOGRAM B169*/
-                                           RTUNI_ALPHA, /* U+0100b2: LINEAR B IDEOGRAM B170*/
-                                           RTUNI_ALPHA, /* U+0100b3: LINEAR B IDEOGRAM B171*/
-                                           RTUNI_ALPHA, /* U+0100b4: LINEAR B IDEOGRAM B172*/
-                                           RTUNI_ALPHA, /* U+0100b5: LINEAR B IDEOGRAM B173 MONTH*/
-                                           RTUNI_ALPHA, /* U+0100b6: LINEAR B IDEOGRAM B174*/
-                                           RTUNI_ALPHA, /* U+0100b7: LINEAR B IDEOGRAM B176 TREE*/
-                                           RTUNI_ALPHA, /* U+0100b8: LINEAR B IDEOGRAM B177*/
-                                           RTUNI_ALPHA, /* U+0100b9: LINEAR B IDEOGRAM B178*/
-                                           RTUNI_ALPHA, /* U+0100ba: LINEAR B IDEOGRAM B179*/
-                                           RTUNI_ALPHA, /* U+0100bb: LINEAR B IDEOGRAM B180*/
-                                           RTUNI_ALPHA, /* U+0100bc: LINEAR B IDEOGRAM B181*/
-                                           RTUNI_ALPHA, /* U+0100bd: LINEAR B IDEOGRAM B182*/
-                                           RTUNI_ALPHA, /* U+0100be: LINEAR B IDEOGRAM B183*/
-                                           RTUNI_ALPHA, /* U+0100bf: LINEAR B IDEOGRAM B184*/
-                                           RTUNI_ALPHA, /* U+0100c0: LINEAR B IDEOGRAM B185*/
-                                           RTUNI_ALPHA, /* U+0100c1: LINEAR B IDEOGRAM B189*/
-                                           RTUNI_ALPHA, /* U+0100c2: LINEAR B IDEOGRAM B190*/
-                                           RTUNI_ALPHA, /* U+0100c3: LINEAR B IDEOGRAM B191 HELMET*/
-                                           RTUNI_ALPHA, /* U+0100c4: LINEAR B IDEOGRAM B220 FOOTSTOOL*/
-                                           RTUNI_ALPHA, /* U+0100c5: LINEAR B IDEOGRAM B225 BATHTUB*/
-                                           RTUNI_ALPHA, /* U+0100c6: LINEAR B IDEOGRAM B230 SPEAR*/
-                                           RTUNI_ALPHA, /* U+0100c7: LINEAR B IDEOGRAM B231 ARROW*/
-                                           RTUNI_ALPHA, /* U+0100c8: LINEAR B IDEOGRAM B232*/
-                                           RTUNI_ALPHA, /* U+0100c9: LINEAR B IDEOGRAM B233 SWORD*/
-                                           RTUNI_ALPHA, /* U+0100ca: LINEAR B IDEOGRAM B234*/
-                                           RTUNI_ALPHA, /* U+0100cb: LINEAR B IDEOGRAM B236*/
-                                           RTUNI_ALPHA, /* U+0100cc: LINEAR B IDEOGRAM B240 WHEELED CHARIOT*/
-                                           RTUNI_ALPHA, /* U+0100cd: LINEAR B IDEOGRAM B241 CHARIOT*/
-                                           RTUNI_ALPHA, /* U+0100ce: LINEAR B IDEOGRAM B242 CHARIOT FRAME*/
-                                           RTUNI_ALPHA, /* U+0100cf: LINEAR B IDEOGRAM B243 WHEEL*/
-                                           RTUNI_ALPHA, /* U+0100d0: LINEAR B IDEOGRAM B245*/
-                                           RTUNI_ALPHA, /* U+0100d1: LINEAR B IDEOGRAM B246*/
-                                           RTUNI_ALPHA, /* U+0100d2: LINEAR B MONOGRAM B247 DIPTE*/
-                                           RTUNI_ALPHA, /* U+0100d3: LINEAR B IDEOGRAM B248*/
-                                           RTUNI_ALPHA, /* U+0100d4: LINEAR B IDEOGRAM B249*/
-                                           RTUNI_ALPHA, /* U+0100d5: LINEAR B IDEOGRAM B251*/
-                                           RTUNI_ALPHA, /* U+0100d6: LINEAR B IDEOGRAM B252*/
-                                           RTUNI_ALPHA, /* U+0100d7: LINEAR B IDEOGRAM B253*/
-                                           RTUNI_ALPHA, /* U+0100d8: LINEAR B IDEOGRAM B254 DART*/
-                                           RTUNI_ALPHA, /* U+0100d9: LINEAR B IDEOGRAM B255*/
-                                           RTUNI_ALPHA, /* U+0100da: LINEAR B IDEOGRAM B256*/
-                                           RTUNI_ALPHA, /* U+0100db: LINEAR B IDEOGRAM B257*/
-                                           RTUNI_ALPHA, /* U+0100dc: LINEAR B IDEOGRAM B258*/
-                                           RTUNI_ALPHA, /* U+0100dd: LINEAR B IDEOGRAM B259*/
-                                           RTUNI_ALPHA, /* U+0100de: LINEAR B IDEOGRAM VESSEL B155*/
-                                           RTUNI_ALPHA, /* U+0100df: LINEAR B IDEOGRAM VESSEL B200*/
-                                           RTUNI_ALPHA, /* U+0100e0: LINEAR B IDEOGRAM VESSEL B201*/
-                                           RTUNI_ALPHA, /* U+0100e1: LINEAR B IDEOGRAM VESSEL B202*/
-                                           RTUNI_ALPHA, /* U+0100e2: LINEAR B IDEOGRAM VESSEL B203*/
-                                           RTUNI_ALPHA, /* U+0100e3: LINEAR B IDEOGRAM VESSEL B204*/
-                                           RTUNI_ALPHA, /* U+0100e4: LINEAR B IDEOGRAM VESSEL B205*/
-                                           RTUNI_ALPHA, /* U+0100e5: LINEAR B IDEOGRAM VESSEL B206*/
-                                           RTUNI_ALPHA, /* U+0100e6: LINEAR B IDEOGRAM VESSEL B207*/
-                                           RTUNI_ALPHA, /* U+0100e7: LINEAR B IDEOGRAM VESSEL B208*/
-                                           RTUNI_ALPHA, /* U+0100e8: LINEAR B IDEOGRAM VESSEL B209*/
-                                           RTUNI_ALPHA, /* U+0100e9: LINEAR B IDEOGRAM VESSEL B210*/
-                                           RTUNI_ALPHA, /* U+0100ea: LINEAR B IDEOGRAM VESSEL B211*/
-                                           RTUNI_ALPHA, /* U+0100eb: LINEAR B IDEOGRAM VESSEL B212*/
-                                           RTUNI_ALPHA, /* U+0100ec: LINEAR B IDEOGRAM VESSEL B213*/
-                                           RTUNI_ALPHA, /* U+0100ed: LINEAR B IDEOGRAM VESSEL B214*/
-                                           RTUNI_ALPHA, /* U+0100ee: LINEAR B IDEOGRAM VESSEL B215*/
-                                           RTUNI_ALPHA, /* U+0100ef: LINEAR B IDEOGRAM VESSEL B216*/
-                                           RTUNI_ALPHA, /* U+0100f0: LINEAR B IDEOGRAM VESSEL B217*/
-                                           RTUNI_ALPHA, /* U+0100f1: LINEAR B IDEOGRAM VESSEL B218*/
-                                           RTUNI_ALPHA, /* U+0100f2: LINEAR B IDEOGRAM VESSEL B219*/
-                                           RTUNI_ALPHA, /* U+0100f3: LINEAR B IDEOGRAM VESSEL B221*/
-                                           RTUNI_ALPHA, /* U+0100f4: LINEAR B IDEOGRAM VESSEL B222*/
-                                           RTUNI_ALPHA, /* U+0100f5: LINEAR B IDEOGRAM VESSEL B226*/
-                                           RTUNI_ALPHA, /* U+0100f6: LINEAR B IDEOGRAM VESSEL B227*/
-                                           RTUNI_ALPHA, /* U+0100f7: LINEAR B IDEOGRAM VESSEL B228*/
-                                           RTUNI_ALPHA, /* U+0100f8: LINEAR B IDEOGRAM VESSEL B229*/
-                                           RTUNI_ALPHA, /* U+0100f9: LINEAR B IDEOGRAM VESSEL B250*/
-                                           RTUNI_ALPHA, /* U+0100fa: LINEAR B IDEOGRAM VESSEL B305*/
-                                                     0, /* U+0100fb: */
-                                                     0, /* U+0100fc: */
-                                                     0, /* U+0100fd: */
-                                                     0, /* U+0100fe: */
-                                                     0, /* U+0100ff: */
-                                                     0, /* U+010100: AEGEAN WORD SEPARATOR LINE*/
-                                                     0, /* U+010101: AEGEAN WORD SEPARATOR DOT*/
-                                                     0, /* U+010102: AEGEAN CHECK MARK*/
-                                                     0, /* U+010103: */
-                                                     0, /* U+010104: */
-                                                     0, /* U+010105: */
-                                                     0, /* U+010106: */
-                                                     0, /* U+010107: AEGEAN NUMBER ONE*/
-                                                     0, /* U+010108: AEGEAN NUMBER TWO*/
-                                                     0, /* U+010109: AEGEAN NUMBER THREE*/
-                                                     0, /* U+01010a: AEGEAN NUMBER FOUR*/
-                                                     0, /* U+01010b: AEGEAN NUMBER FIVE*/
-                                                     0, /* U+01010c: AEGEAN NUMBER SIX*/
-                                                     0, /* U+01010d: AEGEAN NUMBER SEVEN*/
-                                                     0, /* U+01010e: AEGEAN NUMBER EIGHT*/
-                                                     0, /* U+01010f: AEGEAN NUMBER NINE*/
-                                                     0, /* U+010110: AEGEAN NUMBER TEN*/
-                                                     0, /* U+010111: AEGEAN NUMBER TWENTY*/
-                                                     0, /* U+010112: AEGEAN NUMBER THIRTY*/
-                                                     0, /* U+010113: AEGEAN NUMBER FORTY*/
-                                                     0, /* U+010114: AEGEAN NUMBER FIFTY*/
-                                                     0, /* U+010115: AEGEAN NUMBER SIXTY*/
-                                                     0, /* U+010116: AEGEAN NUMBER SEVENTY*/
-                                                     0, /* U+010117: AEGEAN NUMBER EIGHTY*/
-                                                     0, /* U+010118: AEGEAN NUMBER NINETY*/
-                                                     0, /* U+010119: AEGEAN NUMBER ONE HUNDRED*/
-                                                     0, /* U+01011a: AEGEAN NUMBER TWO HUNDRED*/
-                                                     0, /* U+01011b: AEGEAN NUMBER THREE HUNDRED*/
-                                                     0, /* U+01011c: AEGEAN NUMBER FOUR HUNDRED*/
-                                                     0, /* U+01011d: AEGEAN NUMBER FIVE HUNDRED*/
-                                                     0, /* U+01011e: AEGEAN NUMBER SIX HUNDRED*/
-                                                     0, /* U+01011f: AEGEAN NUMBER SEVEN HUNDRED*/
-                                                     0, /* U+010120: AEGEAN NUMBER EIGHT HUNDRED*/
-                                                     0, /* U+010121: AEGEAN NUMBER NINE HUNDRED*/
-                                                     0, /* U+010122: AEGEAN NUMBER ONE THOUSAND*/
-                                                     0, /* U+010123: AEGEAN NUMBER TWO THOUSAND*/
-                                                     0, /* U+010124: AEGEAN NUMBER THREE THOUSAND*/
-                                                     0, /* U+010125: AEGEAN NUMBER FOUR THOUSAND*/
-                                                     0, /* U+010126: AEGEAN NUMBER FIVE THOUSAND*/
-                                                     0, /* U+010127: AEGEAN NUMBER SIX THOUSAND*/
-                                                     0, /* U+010128: AEGEAN NUMBER SEVEN THOUSAND*/
-                                                     0, /* U+010129: AEGEAN NUMBER EIGHT THOUSAND*/
-                                                     0, /* U+01012a: AEGEAN NUMBER NINE THOUSAND*/
-                                                     0, /* U+01012b: AEGEAN NUMBER TEN THOUSAND*/
-                                                     0, /* U+01012c: AEGEAN NUMBER TWENTY THOUSAND*/
-                                                     0, /* U+01012d: AEGEAN NUMBER THIRTY THOUSAND*/
-                                                     0, /* U+01012e: AEGEAN NUMBER FORTY THOUSAND*/
-                                                     0, /* U+01012f: AEGEAN NUMBER FIFTY THOUSAND*/
-                                                     0, /* U+010130: AEGEAN NUMBER SIXTY THOUSAND*/
-                                                     0, /* U+010131: AEGEAN NUMBER SEVENTY THOUSAND*/
-                                                     0, /* U+010132: AEGEAN NUMBER EIGHTY THOUSAND*/
-                                                     0, /* U+010133: AEGEAN NUMBER NINETY THOUSAND*/
-                                                     0, /* U+010134: */
-                                                     0, /* U+010135: */
-                                                     0, /* U+010136: */
-                                                     0, /* U+010137: AEGEAN WEIGHT BASE UNIT*/
-                                                     0, /* U+010138: AEGEAN WEIGHT FIRST SUBUNIT*/
-                                                     0, /* U+010139: AEGEAN WEIGHT SECOND SUBUNIT*/
-                                                     0, /* U+01013a: AEGEAN WEIGHT THIRD SUBUNIT*/
-                                                     0, /* U+01013b: AEGEAN WEIGHT FOURTH SUBUNIT*/
-                                                     0, /* U+01013c: AEGEAN DRY MEASURE FIRST SUBUNIT*/
-                                                     0, /* U+01013d: AEGEAN LIQUID MEASURE FIRST SUBUNIT*/
-                                                     0, /* U+01013e: AEGEAN MEASURE SECOND SUBUNIT*/
-                                                     0, /* U+01013f: AEGEAN MEASURE THIRD SUBUNIT*/
-                                           RTUNI_ALPHA, /* U+010140: GREEK ACROPHONIC ATTIC ONE QUARTER*/
-                                           RTUNI_ALPHA, /* U+010141: GREEK ACROPHONIC ATTIC ONE HALF*/
-                                           RTUNI_ALPHA, /* U+010142: GREEK ACROPHONIC ATTIC ONE DRACHMA*/
-                                           RTUNI_ALPHA, /* U+010143: GREEK ACROPHONIC ATTIC FIVE*/
-                                           RTUNI_ALPHA, /* U+010144: GREEK ACROPHONIC ATTIC FIFTY*/
-                                           RTUNI_ALPHA, /* U+010145: GREEK ACROPHONIC ATTIC FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+010146: GREEK ACROPHONIC ATTIC FIVE THOUSAND*/
-                                           RTUNI_ALPHA, /* U+010147: GREEK ACROPHONIC ATTIC FIFTY THOUSAND*/
-                                           RTUNI_ALPHA, /* U+010148: GREEK ACROPHONIC ATTIC FIVE TALENTS*/
-                                           RTUNI_ALPHA, /* U+010149: GREEK ACROPHONIC ATTIC TEN TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014a: GREEK ACROPHONIC ATTIC FIFTY TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014b: GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014c: GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014d: GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014e: GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS*/
-                                           RTUNI_ALPHA, /* U+01014f: GREEK ACROPHONIC ATTIC FIVE STATERS*/
-                                           RTUNI_ALPHA, /* U+010150: GREEK ACROPHONIC ATTIC TEN STATERS*/
-                                           RTUNI_ALPHA, /* U+010151: GREEK ACROPHONIC ATTIC FIFTY STATERS*/
-                                           RTUNI_ALPHA, /* U+010152: GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS*/
-                                           RTUNI_ALPHA, /* U+010153: GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS*/
-                                           RTUNI_ALPHA, /* U+010154: GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS*/
-                                           RTUNI_ALPHA, /* U+010155: GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS*/
-                                           RTUNI_ALPHA, /* U+010156: GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS*/
-                                           RTUNI_ALPHA, /* U+010157: GREEK ACROPHONIC ATTIC TEN MNAS*/
-                                           RTUNI_ALPHA, /* U+010158: GREEK ACROPHONIC HERAEUM ONE PLETHRON*/
-                                           RTUNI_ALPHA, /* U+010159: GREEK ACROPHONIC THESPIAN ONE*/
-                                           RTUNI_ALPHA, /* U+01015a: GREEK ACROPHONIC HERMIONIAN ONE*/
-                                           RTUNI_ALPHA, /* U+01015b: GREEK ACROPHONIC EPIDAUREAN TWO*/
-                                           RTUNI_ALPHA, /* U+01015c: GREEK ACROPHONIC THESPIAN TWO*/
-                                           RTUNI_ALPHA, /* U+01015d: GREEK ACROPHONIC CYRENAIC TWO DRACHMAS*/
-                                           RTUNI_ALPHA, /* U+01015e: GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS*/
-                                           RTUNI_ALPHA, /* U+01015f: GREEK ACROPHONIC TROEZENIAN FIVE*/
-                                           RTUNI_ALPHA, /* U+010160: GREEK ACROPHONIC TROEZENIAN TEN*/
-                                           RTUNI_ALPHA, /* U+010161: GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM*/
-                                           RTUNI_ALPHA, /* U+010162: GREEK ACROPHONIC HERMIONIAN TEN*/
-                                           RTUNI_ALPHA, /* U+010163: GREEK ACROPHONIC MESSENIAN TEN*/
-                                           RTUNI_ALPHA, /* U+010164: GREEK ACROPHONIC THESPIAN TEN*/
-                                           RTUNI_ALPHA, /* U+010165: GREEK ACROPHONIC THESPIAN THIRTY*/
-                                           RTUNI_ALPHA, /* U+010166: GREEK ACROPHONIC TROEZENIAN FIFTY*/
-                                           RTUNI_ALPHA, /* U+010167: GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM*/
-                                           RTUNI_ALPHA, /* U+010168: GREEK ACROPHONIC HERMIONIAN FIFTY*/
-                                           RTUNI_ALPHA, /* U+010169: GREEK ACROPHONIC THESPIAN FIFTY*/
-                                           RTUNI_ALPHA, /* U+01016a: GREEK ACROPHONIC THESPIAN ONE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+01016b: GREEK ACROPHONIC THESPIAN THREE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+01016c: GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+01016d: GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+01016e: GREEK ACROPHONIC THESPIAN FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+01016f: GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+010170: GREEK ACROPHONIC NAXIAN FIVE HUNDRED*/
-                                           RTUNI_ALPHA, /* U+010171: GREEK ACROPHONIC THESPIAN ONE THOUSAND*/
-                                           RTUNI_ALPHA, /* U+010172: GREEK ACROPHONIC THESPIAN FIVE THOUSAND*/
-                                           RTUNI_ALPHA, /* U+010173: GREEK ACROPHONIC DELPHIC FIVE MNAS*/
-                                           RTUNI_ALPHA, /* U+010174: GREEK ACROPHONIC STRATIAN FIFTY MNAS*/
-                                                     0, /* U+010175: GREEK ONE HALF SIGN*/
-                                                     0, /* U+010176: GREEK ONE HALF SIGN ALTERNATE FORM*/
-                                                     0, /* U+010177: GREEK TWO THIRDS SIGN*/
-                                                     0, /* U+010178: GREEK THREE QUARTERS SIGN*/
-                                                     0, /* U+010179: GREEK YEAR SIGN*/
-                                                     0, /* U+01017a: GREEK TALENT SIGN*/
-                                                     0, /* U+01017b: GREEK DRACHMA SIGN*/
-                                                     0, /* U+01017c: GREEK OBOL SIGN*/
-                                                     0, /* U+01017d: GREEK TWO OBOLS SIGN*/
-                                                     0, /* U+01017e: GREEK THREE OBOLS SIGN*/
-                                                     0, /* U+01017f: GREEK FOUR OBOLS SIGN*/
-                                                     0, /* U+010180: GREEK FIVE OBOLS SIGN*/
-                                                     0, /* U+010181: GREEK METRETES SIGN*/
-                                                     0, /* U+010182: GREEK KYATHOS BASE SIGN*/
-                                                     0, /* U+010183: GREEK LITRA SIGN*/
-                                                     0, /* U+010184: GREEK OUNKIA SIGN*/
-                                                     0, /* U+010185: GREEK XESTES SIGN*/
-                                                     0, /* U+010186: GREEK ARTABE SIGN*/
-                                                     0, /* U+010187: GREEK AROURA SIGN*/
-                                                     0, /* U+010188: GREEK GRAMMA SIGN*/
-                                                     0, /* U+010189: GREEK TRYBLION BASE SIGN*/
-                                                     0, /* U+01018a: GREEK ZERO SIGN*/
-                                                     0, /* U+01018b: */
-                                                     0, /* U+01018c: */
-                                                     0, /* U+01018d: */
-                                                     0, /* U+01018e: */
-                                                     0, /* U+01018f: */
-                                                     0, /* U+010190: */
-                                                     0, /* U+010191: */
-                                                     0, /* U+010192: */
-                                                     0, /* U+010193: */
-                                                     0, /* U+010194: */
-                                                     0, /* U+010195: */
-                                                     0, /* U+010196: */
-                                                     0, /* U+010197: */
-                                                     0, /* U+010198: */
-                                                     0, /* U+010199: */
-                                                     0, /* U+01019a: */
-                                                     0, /* U+01019b: */
-                                                     0, /* U+01019c: */
-                                                     0, /* U+01019d: */
-                                                     0, /* U+01019e: */
-                                                     0, /* U+01019f: */
-                                                     0, /* U+0101a0: */
-                                                     0, /* U+0101a1: */
-                                                     0, /* U+0101a2: */
-                                                     0, /* U+0101a3: */
-                                                     0, /* U+0101a4: */
-                                                     0, /* U+0101a5: */
-                                                     0, /* U+0101a6: */
-                                                     0, /* U+0101a7: */
-                                                     0, /* U+0101a8: */
-                                                     0, /* U+0101a9: */
-                                                     0, /* U+0101aa: */
-                                                     0, /* U+0101ab: */
-                                                     0, /* U+0101ac: */
-                                                     0, /* U+0101ad: */
-                                                     0, /* U+0101ae: */
-                                                     0, /* U+0101af: */
-                                                     0, /* U+0101b0: */
-                                                     0, /* U+0101b1: */
-                                                     0, /* U+0101b2: */
-                                                     0, /* U+0101b3: */
-                                                     0, /* U+0101b4: */
-                                                     0, /* U+0101b5: */
-                                                     0, /* U+0101b6: */
-                                                     0, /* U+0101b7: */
-                                                     0, /* U+0101b8: */
-                                                     0, /* U+0101b9: */
-                                                     0, /* U+0101ba: */
-                                                     0, /* U+0101bb: */
-                                                     0, /* U+0101bc: */
-                                                     0, /* U+0101bd: */
-                                                     0, /* U+0101be: */
-                                                     0, /* U+0101bf: */
-                                                     0, /* U+0101c0: */
-                                                     0, /* U+0101c1: */
-                                                     0, /* U+0101c2: */
-                                                     0, /* U+0101c3: */
-                                                     0, /* U+0101c4: */
-                                                     0, /* U+0101c5: */
-                                                     0, /* U+0101c6: */
-                                                     0, /* U+0101c7: */
-                                                     0, /* U+0101c8: */
-                                                     0, /* U+0101c9: */
-                                                     0, /* U+0101ca: */
-                                                     0, /* U+0101cb: */
-                                                     0, /* U+0101cc: */
-                                                     0, /* U+0101cd: */
-                                                     0, /* U+0101ce: */
-                                                     0, /* U+0101cf: */
-                                                     0, /* U+0101d0: */
-                                                     0, /* U+0101d1: */
-                                                     0, /* U+0101d2: */
-                                                     0, /* U+0101d3: */
-                                                     0, /* U+0101d4: */
-                                                     0, /* U+0101d5: */
-                                                     0, /* U+0101d6: */
-                                                     0, /* U+0101d7: */
-                                                     0, /* U+0101d8: */
-                                                     0, /* U+0101d9: */
-                                                     0, /* U+0101da: */
-                                                     0, /* U+0101db: */
-                                                     0, /* U+0101dc: */
-                                                     0, /* U+0101dd: */
-                                                     0, /* U+0101de: */
-                                                     0, /* U+0101df: */
-                                                     0, /* U+0101e0: */
-                                                     0, /* U+0101e1: */
-                                                     0, /* U+0101e2: */
-                                                     0, /* U+0101e3: */
-                                                     0, /* U+0101e4: */
-                                                     0, /* U+0101e5: */
-                                                     0, /* U+0101e6: */
-                                                     0, /* U+0101e7: */
-                                                     0, /* U+0101e8: */
-                                                     0, /* U+0101e9: */
-                                                     0, /* U+0101ea: */
-                                                     0, /* U+0101eb: */
-                                                     0, /* U+0101ec: */
-                                                     0, /* U+0101ed: */
-                                                     0, /* U+0101ee: */
-                                                     0, /* U+0101ef: */
-                                                     0, /* U+0101f0: */
-                                                     0, /* U+0101f1: */
-                                                     0, /* U+0101f2: */
-                                                     0, /* U+0101f3: */
-                                                     0, /* U+0101f4: */
-                                                     0, /* U+0101f5: */
-                                                     0, /* U+0101f6: */
-                                                     0, /* U+0101f7: */
-                                                     0, /* U+0101f8: */
-                                                     0, /* U+0101f9: */
-                                                     0, /* U+0101fa: */
-                                                     0, /* U+0101fb: */
-                                                     0, /* U+0101fc: */
-                                                     0, /* U+0101fd: */
-                                                     0, /* U+0101fe: */
-                                                     0, /* U+0101ff: */
-                                                     0, /* U+010200: */
-                                                     0, /* U+010201: */
-                                                     0, /* U+010202: */
-                                                     0, /* U+010203: */
-                                                     0, /* U+010204: */
-                                                     0, /* U+010205: */
-                                                     0, /* U+010206: */
-                                                     0, /* U+010207: */
-                                                     0, /* U+010208: */
-                                                     0, /* U+010209: */
-                                                     0, /* U+01020a: */
-                                                     0, /* U+01020b: */
-                                                     0, /* U+01020c: */
-                                                     0, /* U+01020d: */
-                                                     0, /* U+01020e: */
-                                                     0, /* U+01020f: */
-                                                     0, /* U+010210: */
-                                                     0, /* U+010211: */
-                                                     0, /* U+010212: */
-                                                     0, /* U+010213: */
-                                                     0, /* U+010214: */
-                                                     0, /* U+010215: */
-                                                     0, /* U+010216: */
-                                                     0, /* U+010217: */
-                                                     0, /* U+010218: */
-                                                     0, /* U+010219: */
-                                                     0, /* U+01021a: */
-                                                     0, /* U+01021b: */
-                                                     0, /* U+01021c: */
-                                                     0, /* U+01021d: */
-                                                     0, /* U+01021e: */
-                                                     0, /* U+01021f: */
-                                                     0, /* U+010220: */
-                                                     0, /* U+010221: */
-                                                     0, /* U+010222: */
-                                                     0, /* U+010223: */
-                                                     0, /* U+010224: */
-                                                     0, /* U+010225: */
-                                                     0, /* U+010226: */
-                                                     0, /* U+010227: */
-                                                     0, /* U+010228: */
-                                                     0, /* U+010229: */
-                                                     0, /* U+01022a: */
-                                                     0, /* U+01022b: */
-                                                     0, /* U+01022c: */
-                                                     0, /* U+01022d: */
-                                                     0, /* U+01022e: */
-                                                     0, /* U+01022f: */
-                                                     0, /* U+010230: */
-                                                     0, /* U+010231: */
-                                                     0, /* U+010232: */
-                                                     0, /* U+010233: */
-                                                     0, /* U+010234: */
-                                                     0, /* U+010235: */
-                                                     0, /* U+010236: */
-                                                     0, /* U+010237: */
-                                                     0, /* U+010238: */
-                                                     0, /* U+010239: */
-                                                     0, /* U+01023a: */
-                                                     0, /* U+01023b: */
-                                                     0, /* U+01023c: */
-                                                     0, /* U+01023d: */
-                                                     0, /* U+01023e: */
-                                                     0, /* U+01023f: */
-                                                     0, /* U+010240: */
-                                                     0, /* U+010241: */
-                                                     0, /* U+010242: */
-                                                     0, /* U+010243: */
-                                                     0, /* U+010244: */
-                                                     0, /* U+010245: */
-                                                     0, /* U+010246: */
-                                                     0, /* U+010247: */
-                                                     0, /* U+010248: */
-                                                     0, /* U+010249: */
-                                                     0, /* U+01024a: */
-                                                     0, /* U+01024b: */
-                                                     0, /* U+01024c: */
-                                                     0, /* U+01024d: */
-                                                     0, /* U+01024e: */
-                                                     0, /* U+01024f: */
-                                                     0, /* U+010250: */
-                                                     0, /* U+010251: */
-                                                     0, /* U+010252: */
-                                                     0, /* U+010253: */
-                                                     0, /* U+010254: */
-                                                     0, /* U+010255: */
-                                                     0, /* U+010256: */
-                                                     0, /* U+010257: */
-                                                     0, /* U+010258: */
-                                                     0, /* U+010259: */
-                                                     0, /* U+01025a: */
-                                                     0, /* U+01025b: */
-                                                     0, /* U+01025c: */
-                                                     0, /* U+01025d: */
-                                                     0, /* U+01025e: */
-                                                     0, /* U+01025f: */
-                                                     0, /* U+010260: */
-                                                     0, /* U+010261: */
-                                                     0, /* U+010262: */
-                                                     0, /* U+010263: */
-                                                     0, /* U+010264: */
-                                                     0, /* U+010265: */
-                                                     0, /* U+010266: */
-                                                     0, /* U+010267: */
-                                                     0, /* U+010268: */
-                                                     0, /* U+010269: */
-                                                     0, /* U+01026a: */
-                                                     0, /* U+01026b: */
-                                                     0, /* U+01026c: */
-                                                     0, /* U+01026d: */
-                                                     0, /* U+01026e: */
-                                                     0, /* U+01026f: */
-                                                     0, /* U+010270: */
-                                                     0, /* U+010271: */
-                                                     0, /* U+010272: */
-                                                     0, /* U+010273: */
-                                                     0, /* U+010274: */
-                                                     0, /* U+010275: */
-                                                     0, /* U+010276: */
-                                                     0, /* U+010277: */
-                                                     0, /* U+010278: */
-                                                     0, /* U+010279: */
-                                                     0, /* U+01027a: */
-                                                     0, /* U+01027b: */
-                                                     0, /* U+01027c: */
-                                                     0, /* U+01027d: */
-                                                     0, /* U+01027e: */
-                                                     0, /* U+01027f: */
-                                                     0, /* U+010280: */
-                                                     0, /* U+010281: */
-                                                     0, /* U+010282: */
-                                                     0, /* U+010283: */
-                                                     0, /* U+010284: */
-                                                     0, /* U+010285: */
-                                                     0, /* U+010286: */
-                                                     0, /* U+010287: */
-                                                     0, /* U+010288: */
-                                                     0, /* U+010289: */
-                                                     0, /* U+01028a: */
-                                                     0, /* U+01028b: */
-                                                     0, /* U+01028c: */
-                                                     0, /* U+01028d: */
-                                                     0, /* U+01028e: */
-                                                     0, /* U+01028f: */
-                                                     0, /* U+010290: */
-                                                     0, /* U+010291: */
-                                                     0, /* U+010292: */
-                                                     0, /* U+010293: */
-                                                     0, /* U+010294: */
-                                                     0, /* U+010295: */
-                                                     0, /* U+010296: */
-                                                     0, /* U+010297: */
-                                                     0, /* U+010298: */
-                                                     0, /* U+010299: */
-                                                     0, /* U+01029a: */
-                                                     0, /* U+01029b: */
-                                                     0, /* U+01029c: */
-                                                     0, /* U+01029d: */
-                                                     0, /* U+01029e: */
-                                                     0, /* U+01029f: */
-                                                     0, /* U+0102a0: */
-                                                     0, /* U+0102a1: */
-                                                     0, /* U+0102a2: */
-                                                     0, /* U+0102a3: */
-                                                     0, /* U+0102a4: */
-                                                     0, /* U+0102a5: */
-                                                     0, /* U+0102a6: */
-                                                     0, /* U+0102a7: */
-                                                     0, /* U+0102a8: */
-                                                     0, /* U+0102a9: */
-                                                     0, /* U+0102aa: */
-                                                     0, /* U+0102ab: */
-                                                     0, /* U+0102ac: */
-                                                     0, /* U+0102ad: */
-                                                     0, /* U+0102ae: */
-                                                     0, /* U+0102af: */
-                                                     0, /* U+0102b0: */
-                                                     0, /* U+0102b1: */
-                                                     0, /* U+0102b2: */
-                                                     0, /* U+0102b3: */
-                                                     0, /* U+0102b4: */
-                                                     0, /* U+0102b5: */
-                                                     0, /* U+0102b6: */
-                                                     0, /* U+0102b7: */
-                                                     0, /* U+0102b8: */
-                                                     0, /* U+0102b9: */
-                                                     0, /* U+0102ba: */
-                                                     0, /* U+0102bb: */
-                                                     0, /* U+0102bc: */
-                                                     0, /* U+0102bd: */
-                                                     0, /* U+0102be: */
-                                                     0, /* U+0102bf: */
-                                                     0, /* U+0102c0: */
-                                                     0, /* U+0102c1: */
-                                                     0, /* U+0102c2: */
-                                                     0, /* U+0102c3: */
-                                                     0, /* U+0102c4: */
-                                                     0, /* U+0102c5: */
-                                                     0, /* U+0102c6: */
-                                                     0, /* U+0102c7: */
-                                                     0, /* U+0102c8: */
-                                                     0, /* U+0102c9: */
-                                                     0, /* U+0102ca: */
-                                                     0, /* U+0102cb: */
-                                                     0, /* U+0102cc: */
-                                                     0, /* U+0102cd: */
-                                                     0, /* U+0102ce: */
-                                                     0, /* U+0102cf: */
-                                                     0, /* U+0102d0: */
-                                                     0, /* U+0102d1: */
-                                                     0, /* U+0102d2: */
-                                                     0, /* U+0102d3: */
-                                                     0, /* U+0102d4: */
-                                                     0, /* U+0102d5: */
-                                                     0, /* U+0102d6: */
-                                                     0, /* U+0102d7: */
-                                                     0, /* U+0102d8: */
-                                                     0, /* U+0102d9: */
-                                                     0, /* U+0102da: */
-                                                     0, /* U+0102db: */
-                                                     0, /* U+0102dc: */
-                                                     0, /* U+0102dd: */
-                                                     0, /* U+0102de: */
-                                                     0, /* U+0102df: */
-                                                     0, /* U+0102e0: */
-                                                     0, /* U+0102e1: */
-                                                     0, /* U+0102e2: */
-                                                     0, /* U+0102e3: */
-                                                     0, /* U+0102e4: */
-                                                     0, /* U+0102e5: */
-                                                     0, /* U+0102e6: */
-                                                     0, /* U+0102e7: */
-                                                     0, /* U+0102e8: */
-                                                     0, /* U+0102e9: */
-                                                     0, /* U+0102ea: */
-                                                     0, /* U+0102eb: */
-                                                     0, /* U+0102ec: */
-                                                     0, /* U+0102ed: */
-                                                     0, /* U+0102ee: */
-                                                     0, /* U+0102ef: */
-                                                     0, /* U+0102f0: */
-                                                     0, /* U+0102f1: */
-                                                     0, /* U+0102f2: */
-                                                     0, /* U+0102f3: */
-                                                     0, /* U+0102f4: */
-                                                     0, /* U+0102f5: */
-                                                     0, /* U+0102f6: */
-                                                     0, /* U+0102f7: */
-                                                     0, /* U+0102f8: */
-                                                     0, /* U+0102f9: */
-                                                     0, /* U+0102fa: */
-                                                     0, /* U+0102fb: */
-                                                     0, /* U+0102fc: */
-                                                     0, /* U+0102fd: */
-                                                     0, /* U+0102fe: */
-                                                     0, /* U+0102ff: */
-                                           RTUNI_ALPHA, /* U+010300: OLD ITALIC LETTER A*/
-                                           RTUNI_ALPHA, /* U+010301: OLD ITALIC LETTER BE*/
-                                           RTUNI_ALPHA, /* U+010302: OLD ITALIC LETTER KE*/
-                                           RTUNI_ALPHA, /* U+010303: OLD ITALIC LETTER DE*/
-                                           RTUNI_ALPHA, /* U+010304: OLD ITALIC LETTER E*/
-                                           RTUNI_ALPHA, /* U+010305: OLD ITALIC LETTER VE*/
-                                           RTUNI_ALPHA, /* U+010306: OLD ITALIC LETTER ZE*/
-                                           RTUNI_ALPHA, /* U+010307: OLD ITALIC LETTER HE*/
-                                           RTUNI_ALPHA, /* U+010308: OLD ITALIC LETTER THE*/
-                                           RTUNI_ALPHA, /* U+010309: OLD ITALIC LETTER I*/
-                                           RTUNI_ALPHA, /* U+01030a: OLD ITALIC LETTER KA*/
-                                           RTUNI_ALPHA, /* U+01030b: OLD ITALIC LETTER EL*/
-                                           RTUNI_ALPHA, /* U+01030c: OLD ITALIC LETTER EM*/
-                                           RTUNI_ALPHA, /* U+01030d: OLD ITALIC LETTER EN*/
-                                           RTUNI_ALPHA, /* U+01030e: OLD ITALIC LETTER ESH*/
-                                           RTUNI_ALPHA, /* U+01030f: OLD ITALIC LETTER O*/
-                                           RTUNI_ALPHA, /* U+010310: OLD ITALIC LETTER PE*/
-                                           RTUNI_ALPHA, /* U+010311: OLD ITALIC LETTER SHE*/
-                                           RTUNI_ALPHA, /* U+010312: OLD ITALIC LETTER KU*/
-                                           RTUNI_ALPHA, /* U+010313: OLD ITALIC LETTER ER*/
-                                           RTUNI_ALPHA, /* U+010314: OLD ITALIC LETTER ES*/
-                                           RTUNI_ALPHA, /* U+010315: OLD ITALIC LETTER TE*/
-                                           RTUNI_ALPHA, /* U+010316: OLD ITALIC LETTER U*/
-                                           RTUNI_ALPHA, /* U+010317: OLD ITALIC LETTER EKS*/
-                                           RTUNI_ALPHA, /* U+010318: OLD ITALIC LETTER PHE*/
-                                           RTUNI_ALPHA, /* U+010319: OLD ITALIC LETTER KHE*/
-                                           RTUNI_ALPHA, /* U+01031a: OLD ITALIC LETTER EF*/
-                                           RTUNI_ALPHA, /* U+01031b: OLD ITALIC LETTER ERS*/
-                                           RTUNI_ALPHA, /* U+01031c: OLD ITALIC LETTER CHE*/
-                                           RTUNI_ALPHA, /* U+01031d: OLD ITALIC LETTER II*/
-                                           RTUNI_ALPHA, /* U+01031e: OLD ITALIC LETTER UU*/
-                                                     0, /* U+01031f: */
-                                                     0, /* U+010320: OLD ITALIC NUMERAL ONE*/
-                                                     0, /* U+010321: OLD ITALIC NUMERAL FIVE*/
-                                                     0, /* U+010322: OLD ITALIC NUMERAL TEN*/
-                                                     0, /* U+010323: OLD ITALIC NUMERAL FIFTY*/
-                                                     0, /* U+010324: */
-                                                     0, /* U+010325: */
-                                                     0, /* U+010326: */
-                                                     0, /* U+010327: */
-                                                     0, /* U+010328: */
-                                                     0, /* U+010329: */
-                                                     0, /* U+01032a: */
-                                                     0, /* U+01032b: */
-                                                     0, /* U+01032c: */
-                                                     0, /* U+01032d: */
-                                                     0, /* U+01032e: */
-                                                     0, /* U+01032f: */
-                                           RTUNI_ALPHA, /* U+010330: GOTHIC LETTER AHSA*/
-                                           RTUNI_ALPHA, /* U+010331: GOTHIC LETTER BAIRKAN*/
-                                           RTUNI_ALPHA, /* U+010332: GOTHIC LETTER GIBA*/
-                                           RTUNI_ALPHA, /* U+010333: GOTHIC LETTER DAGS*/
-                                           RTUNI_ALPHA, /* U+010334: GOTHIC LETTER AIHVUS*/
-                                           RTUNI_ALPHA, /* U+010335: GOTHIC LETTER QAIRTHRA*/
-                                           RTUNI_ALPHA, /* U+010336: GOTHIC LETTER IUJA*/
-                                           RTUNI_ALPHA, /* U+010337: GOTHIC LETTER HAGL*/
-                                           RTUNI_ALPHA, /* U+010338: GOTHIC LETTER THIUTH*/
-                                           RTUNI_ALPHA, /* U+010339: GOTHIC LETTER EIS*/
-                                           RTUNI_ALPHA, /* U+01033a: GOTHIC LETTER KUSMA*/
-                                           RTUNI_ALPHA, /* U+01033b: GOTHIC LETTER LAGUS*/
-                                           RTUNI_ALPHA, /* U+01033c: GOTHIC LETTER MANNA*/
-                                           RTUNI_ALPHA, /* U+01033d: GOTHIC LETTER NAUTHS*/
-                                           RTUNI_ALPHA, /* U+01033e: GOTHIC LETTER JER*/
-                                           RTUNI_ALPHA, /* U+01033f: GOTHIC LETTER URUS*/
-                                           RTUNI_ALPHA, /* U+010340: GOTHIC LETTER PAIRTHRA*/
-                                           RTUNI_ALPHA, /* U+010341: GOTHIC LETTER NINETY*/
-                                           RTUNI_ALPHA, /* U+010342: GOTHIC LETTER RAIDA*/
-                                           RTUNI_ALPHA, /* U+010343: GOTHIC LETTER SAUIL*/
-                                           RTUNI_ALPHA, /* U+010344: GOTHIC LETTER TEIWS*/
-                                           RTUNI_ALPHA, /* U+010345: GOTHIC LETTER WINJA*/
-                                           RTUNI_ALPHA, /* U+010346: GOTHIC LETTER FAIHU*/
-                                           RTUNI_ALPHA, /* U+010347: GOTHIC LETTER IGGWS*/
-                                           RTUNI_ALPHA, /* U+010348: GOTHIC LETTER HWAIR*/
-                                           RTUNI_ALPHA, /* U+010349: GOTHIC LETTER OTHAL*/
-                                           RTUNI_ALPHA, /* U+01034a: GOTHIC LETTER NINE HUNDRED*/
-                                                     0, /* U+01034b: */
-                                                     0, /* U+01034c: */
-                                                     0, /* U+01034d: */
-                                                     0, /* U+01034e: */
-                                                     0, /* U+01034f: */
-                                                     0, /* U+010350: */
-                                                     0, /* U+010351: */
-                                                     0, /* U+010352: */
-                                                     0, /* U+010353: */
-                                                     0, /* U+010354: */
-                                                     0, /* U+010355: */
-                                                     0, /* U+010356: */
-                                                     0, /* U+010357: */
-                                                     0, /* U+010358: */
-                                                     0, /* U+010359: */
-                                                     0, /* U+01035a: */
-                                                     0, /* U+01035b: */
-                                                     0, /* U+01035c: */
-                                                     0, /* U+01035d: */
-                                                     0, /* U+01035e: */
-                                                     0, /* U+01035f: */
-                                                     0, /* U+010360: */
-                                                     0, /* U+010361: */
-                                                     0, /* U+010362: */
-                                                     0, /* U+010363: */
-                                                     0, /* U+010364: */
-                                                     0, /* U+010365: */
-                                                     0, /* U+010366: */
-                                                     0, /* U+010367: */
-                                                     0, /* U+010368: */
-                                                     0, /* U+010369: */
-                                                     0, /* U+01036a: */
-                                                     0, /* U+01036b: */
-                                                     0, /* U+01036c: */
-                                                     0, /* U+01036d: */
-                                                     0, /* U+01036e: */
-                                                     0, /* U+01036f: */
-                                                     0, /* U+010370: */
-                                                     0, /* U+010371: */
-                                                     0, /* U+010372: */
-                                                     0, /* U+010373: */
-                                                     0, /* U+010374: */
-                                                     0, /* U+010375: */
-                                                     0, /* U+010376: */
-                                                     0, /* U+010377: */
-                                                     0, /* U+010378: */
-                                                     0, /* U+010379: */
-                                                     0, /* U+01037a: */
-                                                     0, /* U+01037b: */
-                                                     0, /* U+01037c: */
-                                                     0, /* U+01037d: */
-                                                     0, /* U+01037e: */
-                                                     0, /* U+01037f: */
-                                           RTUNI_ALPHA, /* U+010380: UGARITIC LETTER ALPA*/
-                                           RTUNI_ALPHA, /* U+010381: UGARITIC LETTER BETA*/
-                                           RTUNI_ALPHA, /* U+010382: UGARITIC LETTER GAMLA*/
-                                           RTUNI_ALPHA, /* U+010383: UGARITIC LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+010384: UGARITIC LETTER DELTA*/
-                                           RTUNI_ALPHA, /* U+010385: UGARITIC LETTER HO*/
-                                           RTUNI_ALPHA, /* U+010386: UGARITIC LETTER WO*/
-                                           RTUNI_ALPHA, /* U+010387: UGARITIC LETTER ZETA*/
-                                           RTUNI_ALPHA, /* U+010388: UGARITIC LETTER HOTA*/
-                                           RTUNI_ALPHA, /* U+010389: UGARITIC LETTER TET*/
-                                           RTUNI_ALPHA, /* U+01038a: UGARITIC LETTER YOD*/
-                                           RTUNI_ALPHA, /* U+01038b: UGARITIC LETTER KAF*/
-                                           RTUNI_ALPHA, /* U+01038c: UGARITIC LETTER SHIN*/
-                                           RTUNI_ALPHA, /* U+01038d: UGARITIC LETTER LAMDA*/
-                                           RTUNI_ALPHA, /* U+01038e: UGARITIC LETTER MEM*/
-                                           RTUNI_ALPHA, /* U+01038f: UGARITIC LETTER DHAL*/
-                                           RTUNI_ALPHA, /* U+010390: UGARITIC LETTER NUN*/
-                                           RTUNI_ALPHA, /* U+010391: UGARITIC LETTER ZU*/
-                                           RTUNI_ALPHA, /* U+010392: UGARITIC LETTER SAMKA*/
-                                           RTUNI_ALPHA, /* U+010393: UGARITIC LETTER AIN*/
-                                           RTUNI_ALPHA, /* U+010394: UGARITIC LETTER PU*/
-                                           RTUNI_ALPHA, /* U+010395: UGARITIC LETTER SADE*/
-                                           RTUNI_ALPHA, /* U+010396: UGARITIC LETTER QOPA*/
-                                           RTUNI_ALPHA, /* U+010397: UGARITIC LETTER RASHA*/
-                                           RTUNI_ALPHA, /* U+010398: UGARITIC LETTER THANNA*/
-                                           RTUNI_ALPHA, /* U+010399: UGARITIC LETTER GHAIN*/
-                                           RTUNI_ALPHA, /* U+01039a: UGARITIC LETTER TO*/
-                                           RTUNI_ALPHA, /* U+01039b: UGARITIC LETTER I*/
-                                           RTUNI_ALPHA, /* U+01039c: UGARITIC LETTER U*/
-                                           RTUNI_ALPHA, /* U+01039d: UGARITIC LETTER SSU*/
-                                                     0, /* U+01039e: */
-                                                     0, /* U+01039f: UGARITIC WORD DIVIDER*/
-                                           RTUNI_ALPHA, /* U+0103a0: OLD PERSIAN SIGN A*/
-                                           RTUNI_ALPHA, /* U+0103a1: OLD PERSIAN SIGN I*/
-                                           RTUNI_ALPHA, /* U+0103a2: OLD PERSIAN SIGN U*/
-                                           RTUNI_ALPHA, /* U+0103a3: OLD PERSIAN SIGN KA*/
-                                           RTUNI_ALPHA, /* U+0103a4: OLD PERSIAN SIGN KU*/
-                                           RTUNI_ALPHA, /* U+0103a5: OLD PERSIAN SIGN GA*/
-                                           RTUNI_ALPHA, /* U+0103a6: OLD PERSIAN SIGN GU*/
-                                           RTUNI_ALPHA, /* U+0103a7: OLD PERSIAN SIGN XA*/
-                                           RTUNI_ALPHA, /* U+0103a8: OLD PERSIAN SIGN CA*/
-                                           RTUNI_ALPHA, /* U+0103a9: OLD PERSIAN SIGN JA*/
-                                           RTUNI_ALPHA, /* U+0103aa: OLD PERSIAN SIGN JI*/
-                                           RTUNI_ALPHA, /* U+0103ab: OLD PERSIAN SIGN TA*/
-                                           RTUNI_ALPHA, /* U+0103ac: OLD PERSIAN SIGN TU*/
-                                           RTUNI_ALPHA, /* U+0103ad: OLD PERSIAN SIGN DA*/
-                                           RTUNI_ALPHA, /* U+0103ae: OLD PERSIAN SIGN DI*/
-                                           RTUNI_ALPHA, /* U+0103af: OLD PERSIAN SIGN DU*/
-                                           RTUNI_ALPHA, /* U+0103b0: OLD PERSIAN SIGN THA*/
-                                           RTUNI_ALPHA, /* U+0103b1: OLD PERSIAN SIGN PA*/
-                                           RTUNI_ALPHA, /* U+0103b2: OLD PERSIAN SIGN BA*/
-                                           RTUNI_ALPHA, /* U+0103b3: OLD PERSIAN SIGN FA*/
-                                           RTUNI_ALPHA, /* U+0103b4: OLD PERSIAN SIGN NA*/
-                                           RTUNI_ALPHA, /* U+0103b5: OLD PERSIAN SIGN NU*/
-                                           RTUNI_ALPHA, /* U+0103b6: OLD PERSIAN SIGN MA*/
-                                           RTUNI_ALPHA, /* U+0103b7: OLD PERSIAN SIGN MI*/
-                                           RTUNI_ALPHA, /* U+0103b8: OLD PERSIAN SIGN MU*/
-                                           RTUNI_ALPHA, /* U+0103b9: OLD PERSIAN SIGN YA*/
-                                           RTUNI_ALPHA, /* U+0103ba: OLD PERSIAN SIGN VA*/
-                                           RTUNI_ALPHA, /* U+0103bb: OLD PERSIAN SIGN VI*/
-                                           RTUNI_ALPHA, /* U+0103bc: OLD PERSIAN SIGN RA*/
-                                           RTUNI_ALPHA, /* U+0103bd: OLD PERSIAN SIGN RU*/
-                                           RTUNI_ALPHA, /* U+0103be: OLD PERSIAN SIGN LA*/
-                                           RTUNI_ALPHA, /* U+0103bf: OLD PERSIAN SIGN SA*/
-                                           RTUNI_ALPHA, /* U+0103c0: OLD PERSIAN SIGN ZA*/
-                                           RTUNI_ALPHA, /* U+0103c1: OLD PERSIAN SIGN SHA*/
-                                           RTUNI_ALPHA, /* U+0103c2: OLD PERSIAN SIGN SSA*/
-                                           RTUNI_ALPHA, /* U+0103c3: OLD PERSIAN SIGN HA*/
-                                                     0, /* U+0103c4: */
-                                                     0, /* U+0103c5: */
-                                                     0, /* U+0103c6: */
-                                                     0, /* U+0103c7: */
-                                           RTUNI_ALPHA, /* U+0103c8: OLD PERSIAN SIGN AURAMAZDAA*/
-                                           RTUNI_ALPHA, /* U+0103c9: OLD PERSIAN SIGN AURAMAZDAA-2*/
-                                           RTUNI_ALPHA, /* U+0103ca: OLD PERSIAN SIGN AURAMAZDAAHA*/
-                                           RTUNI_ALPHA, /* U+0103cb: OLD PERSIAN SIGN XSHAAYATHIYA*/
-                                           RTUNI_ALPHA, /* U+0103cc: OLD PERSIAN SIGN DAHYAAUSH*/
-                                           RTUNI_ALPHA, /* U+0103cd: OLD PERSIAN SIGN DAHYAAUSH-2*/
-                                           RTUNI_ALPHA, /* U+0103ce: OLD PERSIAN SIGN BAGA*/
-                                           RTUNI_ALPHA, /* U+0103cf: OLD PERSIAN SIGN BUUMISH*/
-                                                     0, /* U+0103d0: OLD PERSIAN WORD DIVIDER*/
-                                           RTUNI_ALPHA, /* U+0103d1: OLD PERSIAN NUMBER ONE*/
-                                           RTUNI_ALPHA, /* U+0103d2: OLD PERSIAN NUMBER TWO*/
-                                           RTUNI_ALPHA, /* U+0103d3: OLD PERSIAN NUMBER TEN*/
-                                           RTUNI_ALPHA, /* U+0103d4: OLD PERSIAN NUMBER TWENTY*/
-                                           RTUNI_ALPHA, /* U+0103d5: OLD PERSIAN NUMBER HUNDRED*/
-                                                     0, /* U+0103d6: */
-                                                     0, /* U+0103d7: */
-                                                     0, /* U+0103d8: */
-                                                     0, /* U+0103d9: */
-                                                     0, /* U+0103da: */
-                                                     0, /* U+0103db: */
-                                                     0, /* U+0103dc: */
-                                                     0, /* U+0103dd: */
-                                                     0, /* U+0103de: */
-                                                     0, /* U+0103df: */
-                                                     0, /* U+0103e0: */
-                                                     0, /* U+0103e1: */
-                                                     0, /* U+0103e2: */
-                                                     0, /* U+0103e3: */
-                                                     0, /* U+0103e4: */
-                                                     0, /* U+0103e5: */
-                                                     0, /* U+0103e6: */
-                                                     0, /* U+0103e7: */
-                                                     0, /* U+0103e8: */
-                                                     0, /* U+0103e9: */
-                                                     0, /* U+0103ea: */
-                                                     0, /* U+0103eb: */
-                                                     0, /* U+0103ec: */
-                                                     0, /* U+0103ed: */
-                                                     0, /* U+0103ee: */
-                                                     0, /* U+0103ef: */
-                                                     0, /* U+0103f0: */
-                                                     0, /* U+0103f1: */
-                                                     0, /* U+0103f2: */
-                                                     0, /* U+0103f3: */
-                                                     0, /* U+0103f4: */
-                                                     0, /* U+0103f5: */
-                                                     0, /* U+0103f6: */
-                                                     0, /* U+0103f7: */
-                                                     0, /* U+0103f8: */
-                                                     0, /* U+0103f9: */
-                                                     0, /* U+0103fa: */
-                                                     0, /* U+0103fb: */
-                                                     0, /* U+0103fc: */
-                                                     0, /* U+0103fd: */
-                                                     0, /* U+0103fe: */
-                                                     0, /* U+0103ff: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010400: DESERET CAPITAL LETTER LONG I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010401: DESERET CAPITAL LETTER LONG E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010402: DESERET CAPITAL LETTER LONG A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010404: DESERET CAPITAL LETTER LONG O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040c: DESERET CAPITAL LETTER AY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040d: DESERET CAPITAL LETTER OW*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040e: DESERET CAPITAL LETTER WU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01040f: DESERET CAPITAL LETTER YEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010410: DESERET CAPITAL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010411: DESERET CAPITAL LETTER PEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010412: DESERET CAPITAL LETTER BEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010413: DESERET CAPITAL LETTER TEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010414: DESERET CAPITAL LETTER DEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010415: DESERET CAPITAL LETTER CHEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010416: DESERET CAPITAL LETTER JEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010417: DESERET CAPITAL LETTER KAY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010418: DESERET CAPITAL LETTER GAY*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010419: DESERET CAPITAL LETTER EF*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041a: DESERET CAPITAL LETTER VEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041b: DESERET CAPITAL LETTER ETH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041c: DESERET CAPITAL LETTER THEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041d: DESERET CAPITAL LETTER ES*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01041f: DESERET CAPITAL LETTER ESH*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010421: DESERET CAPITAL LETTER ER*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010422: DESERET CAPITAL LETTER EL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010423: DESERET CAPITAL LETTER EM*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010424: DESERET CAPITAL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010425: DESERET CAPITAL LETTER ENG*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010426: DESERET CAPITAL LETTER OI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+010427: DESERET CAPITAL LETTER EW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010428: DESERET SMALL LETTER LONG I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010429: DESERET SMALL LETTER LONG E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042a: DESERET SMALL LETTER LONG A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042b: DESERET SMALL LETTER LONG AH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042c: DESERET SMALL LETTER LONG O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042d: DESERET SMALL LETTER LONG OO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042e: DESERET SMALL LETTER SHORT I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01042f: DESERET SMALL LETTER SHORT E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010430: DESERET SMALL LETTER SHORT A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010431: DESERET SMALL LETTER SHORT AH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010432: DESERET SMALL LETTER SHORT O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010433: DESERET SMALL LETTER SHORT OO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010434: DESERET SMALL LETTER AY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010435: DESERET SMALL LETTER OW*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010436: DESERET SMALL LETTER WU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010437: DESERET SMALL LETTER YEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010438: DESERET SMALL LETTER H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010439: DESERET SMALL LETTER PEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043a: DESERET SMALL LETTER BEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043b: DESERET SMALL LETTER TEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043c: DESERET SMALL LETTER DEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043d: DESERET SMALL LETTER CHEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043e: DESERET SMALL LETTER JEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01043f: DESERET SMALL LETTER KAY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010440: DESERET SMALL LETTER GAY*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010441: DESERET SMALL LETTER EF*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010442: DESERET SMALL LETTER VEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010443: DESERET SMALL LETTER ETH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010444: DESERET SMALL LETTER THEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010445: DESERET SMALL LETTER ES*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010446: DESERET SMALL LETTER ZEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010447: DESERET SMALL LETTER ESH*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010448: DESERET SMALL LETTER ZHEE*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+010449: DESERET SMALL LETTER ER*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044a: DESERET SMALL LETTER EL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044b: DESERET SMALL LETTER EM*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044c: DESERET SMALL LETTER EN*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044d: DESERET SMALL LETTER ENG*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044e: DESERET SMALL LETTER OI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01044f: DESERET SMALL LETTER EW*/
-                                           RTUNI_ALPHA, /* U+010450: SHAVIAN LETTER PEEP*/
-                                           RTUNI_ALPHA, /* U+010451: SHAVIAN LETTER TOT*/
-                                           RTUNI_ALPHA, /* U+010452: SHAVIAN LETTER KICK*/
-                                           RTUNI_ALPHA, /* U+010453: SHAVIAN LETTER FEE*/
-                                           RTUNI_ALPHA, /* U+010454: SHAVIAN LETTER THIGH*/
-                                           RTUNI_ALPHA, /* U+010455: SHAVIAN LETTER SO*/
-                                           RTUNI_ALPHA, /* U+010456: SHAVIAN LETTER SURE*/
-                                           RTUNI_ALPHA, /* U+010457: SHAVIAN LETTER CHURCH*/
-                                           RTUNI_ALPHA, /* U+010458: SHAVIAN LETTER YEA*/
-                                           RTUNI_ALPHA, /* U+010459: SHAVIAN LETTER HUNG*/
-                                           RTUNI_ALPHA, /* U+01045a: SHAVIAN LETTER BIB*/
-                                           RTUNI_ALPHA, /* U+01045b: SHAVIAN LETTER DEAD*/
-                                           RTUNI_ALPHA, /* U+01045c: SHAVIAN LETTER GAG*/
-                                           RTUNI_ALPHA, /* U+01045d: SHAVIAN LETTER VOW*/
-                                           RTUNI_ALPHA, /* U+01045e: SHAVIAN LETTER THEY*/
-                                           RTUNI_ALPHA, /* U+01045f: SHAVIAN LETTER ZOO*/
-                                           RTUNI_ALPHA, /* U+010460: SHAVIAN LETTER MEASURE*/
-                                           RTUNI_ALPHA, /* U+010461: SHAVIAN LETTER JUDGE*/
-                                           RTUNI_ALPHA, /* U+010462: SHAVIAN LETTER WOE*/
-                                           RTUNI_ALPHA, /* U+010463: SHAVIAN LETTER HA-HA*/
-                                           RTUNI_ALPHA, /* U+010464: SHAVIAN LETTER LOLL*/
-                                           RTUNI_ALPHA, /* U+010465: SHAVIAN LETTER MIME*/
-                                           RTUNI_ALPHA, /* U+010466: SHAVIAN LETTER IF*/
-                                           RTUNI_ALPHA, /* U+010467: SHAVIAN LETTER EGG*/
-                                           RTUNI_ALPHA, /* U+010468: SHAVIAN LETTER ASH*/
-                                           RTUNI_ALPHA, /* U+010469: SHAVIAN LETTER ADO*/
-                                           RTUNI_ALPHA, /* U+01046a: SHAVIAN LETTER ON*/
-                                           RTUNI_ALPHA, /* U+01046b: SHAVIAN LETTER WOOL*/
-                                           RTUNI_ALPHA, /* U+01046c: SHAVIAN LETTER OUT*/
-                                           RTUNI_ALPHA, /* U+01046d: SHAVIAN LETTER AH*/
-                                           RTUNI_ALPHA, /* U+01046e: SHAVIAN LETTER ROAR*/
-                                           RTUNI_ALPHA, /* U+01046f: SHAVIAN LETTER NUN*/
-                                           RTUNI_ALPHA, /* U+010470: SHAVIAN LETTER EAT*/
-                                           RTUNI_ALPHA, /* U+010471: SHAVIAN LETTER AGE*/
-                                           RTUNI_ALPHA, /* U+010472: SHAVIAN LETTER ICE*/
-                                           RTUNI_ALPHA, /* U+010473: SHAVIAN LETTER UP*/
-                                           RTUNI_ALPHA, /* U+010474: SHAVIAN LETTER OAK*/
-                                           RTUNI_ALPHA, /* U+010475: SHAVIAN LETTER OOZE*/
-                                           RTUNI_ALPHA, /* U+010476: SHAVIAN LETTER OIL*/
-                                           RTUNI_ALPHA, /* U+010477: SHAVIAN LETTER AWE*/
-                                           RTUNI_ALPHA, /* U+010478: SHAVIAN LETTER ARE*/
-                                           RTUNI_ALPHA, /* U+010479: SHAVIAN LETTER OR*/
-                                           RTUNI_ALPHA, /* U+01047a: SHAVIAN LETTER AIR*/
-                                           RTUNI_ALPHA, /* U+01047b: SHAVIAN LETTER ERR*/
-                                           RTUNI_ALPHA, /* U+01047c: SHAVIAN LETTER ARRAY*/
-                                           RTUNI_ALPHA, /* U+01047d: SHAVIAN LETTER EAR*/
-                                           RTUNI_ALPHA, /* U+01047e: SHAVIAN LETTER IAN*/
-                                           RTUNI_ALPHA, /* U+01047f: SHAVIAN LETTER YEW*/
-                                           RTUNI_ALPHA, /* U+010480: OSMANYA LETTER ALEF*/
-                                           RTUNI_ALPHA, /* U+010481: OSMANYA LETTER BA*/
-                                           RTUNI_ALPHA, /* U+010482: OSMANYA LETTER TA*/
-                                           RTUNI_ALPHA, /* U+010483: OSMANYA LETTER JA*/
-                                           RTUNI_ALPHA, /* U+010484: OSMANYA LETTER XA*/
-                                           RTUNI_ALPHA, /* U+010485: OSMANYA LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+010486: OSMANYA LETTER DEEL*/
-                                           RTUNI_ALPHA, /* U+010487: OSMANYA LETTER RA*/
-                                           RTUNI_ALPHA, /* U+010488: OSMANYA LETTER SA*/
-                                           RTUNI_ALPHA, /* U+010489: OSMANYA LETTER SHIIN*/
-                                           RTUNI_ALPHA, /* U+01048a: OSMANYA LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+01048b: OSMANYA LETTER CAYN*/
-                                           RTUNI_ALPHA, /* U+01048c: OSMANYA LETTER GA*/
-                                           RTUNI_ALPHA, /* U+01048d: OSMANYA LETTER FA*/
-                                           RTUNI_ALPHA, /* U+01048e: OSMANYA LETTER QAAF*/
-                                           RTUNI_ALPHA, /* U+01048f: OSMANYA LETTER KAAF*/
-                                           RTUNI_ALPHA, /* U+010490: OSMANYA LETTER LAAN*/
-                                           RTUNI_ALPHA, /* U+010491: OSMANYA LETTER MIIN*/
-                                           RTUNI_ALPHA, /* U+010492: OSMANYA LETTER NUUN*/
-                                           RTUNI_ALPHA, /* U+010493: OSMANYA LETTER WAW*/
-                                           RTUNI_ALPHA, /* U+010494: OSMANYA LETTER HA*/
-                                           RTUNI_ALPHA, /* U+010495: OSMANYA LETTER YA*/
-                                           RTUNI_ALPHA, /* U+010496: OSMANYA LETTER A*/
-                                           RTUNI_ALPHA, /* U+010497: OSMANYA LETTER E*/
-                                           RTUNI_ALPHA, /* U+010498: OSMANYA LETTER I*/
-                                           RTUNI_ALPHA, /* U+010499: OSMANYA LETTER O*/
-                                           RTUNI_ALPHA, /* U+01049a: OSMANYA LETTER U*/
-                                           RTUNI_ALPHA, /* U+01049b: OSMANYA LETTER AA*/
-                                           RTUNI_ALPHA, /* U+01049c: OSMANYA LETTER EE*/
-                                           RTUNI_ALPHA, /* U+01049d: OSMANYA LETTER OO*/
-                                                     0, /* U+01049e: */
-                                                     0, /* U+01049f: */
-                                          RTUNI_DDIGIT, /* U+0104a0: OSMANYA DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+0104a1: OSMANYA DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+0104a2: OSMANYA DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+0104a3: OSMANYA DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+0104a4: OSMANYA DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+0104a5: OSMANYA DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+0104a6: OSMANYA DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+0104a7: OSMANYA DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+0104a8: OSMANYA DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+0104a9: OSMANYA DIGIT NINE*/
-                                                     0, /* U+0104aa: */
-                                                     0, /* U+0104ab: */
-                                                     0, /* U+0104ac: */
-                                                     0, /* U+0104ad: */
-                                                     0, /* U+0104ae: */
-                                                     0, /* U+0104af: */
-                                                     0, /* U+0104b0: */
-                                                     0, /* U+0104b1: */
-                                                     0, /* U+0104b2: */
-                                                     0, /* U+0104b3: */
-                                                     0, /* U+0104b4: */
-                                                     0, /* U+0104b5: */
-                                                     0, /* U+0104b6: */
-                                                     0, /* U+0104b7: */
-                                                     0, /* U+0104b8: */
-                                                     0, /* U+0104b9: */
-                                                     0, /* U+0104ba: */
-                                                     0, /* U+0104bb: */
-                                                     0, /* U+0104bc: */
-                                                     0, /* U+0104bd: */
-                                                     0, /* U+0104be: */
-                                                     0, /* U+0104bf: */
-                                                     0, /* U+0104c0: */
-                                                     0, /* U+0104c1: */
-                                                     0, /* U+0104c2: */
-                                                     0, /* U+0104c3: */
-                                                     0, /* U+0104c4: */
-                                                     0, /* U+0104c5: */
-                                                     0, /* U+0104c6: */
-                                                     0, /* U+0104c7: */
-                                                     0, /* U+0104c8: */
-                                                     0, /* U+0104c9: */
-                                                     0, /* U+0104ca: */
-                                                     0, /* U+0104cb: */
-                                                     0, /* U+0104cc: */
-                                                     0, /* U+0104cd: */
-                                                     0, /* U+0104ce: */
-                                                     0, /* U+0104cf: */
-                                                     0, /* U+0104d0: */
-                                                     0, /* U+0104d1: */
-                                                     0, /* U+0104d2: */
-                                                     0, /* U+0104d3: */
-                                                     0, /* U+0104d4: */
-                                                     0, /* U+0104d5: */
-                                                     0, /* U+0104d6: */
-                                                     0, /* U+0104d7: */
-                                                     0, /* U+0104d8: */
-                                                     0, /* U+0104d9: */
-                                                     0, /* U+0104da: */
-                                                     0, /* U+0104db: */
-                                                     0, /* U+0104dc: */
-                                                     0, /* U+0104dd: */
-                                                     0, /* U+0104de: */
-                                                     0, /* U+0104df: */
-                                                     0, /* U+0104e0: */
-                                                     0, /* U+0104e1: */
-                                                     0, /* U+0104e2: */
-                                                     0, /* U+0104e3: */
-                                                     0, /* U+0104e4: */
-                                                     0, /* U+0104e5: */
-                                                     0, /* U+0104e6: */
-                                                     0, /* U+0104e7: */
-                                                     0, /* U+0104e8: */
-                                                     0, /* U+0104e9: */
-                                                     0, /* U+0104ea: */
-                                                     0, /* U+0104eb: */
-                                                     0, /* U+0104ec: */
-                                                     0, /* U+0104ed: */
-                                                     0, /* U+0104ee: */
-                                                     0, /* U+0104ef: */
-                                                     0, /* U+0104f0: */
-                                                     0, /* U+0104f1: */
-                                                     0, /* U+0104f2: */
-                                                     0, /* U+0104f3: */
-                                                     0, /* U+0104f4: */
-                                                     0, /* U+0104f5: */
-                                                     0, /* U+0104f6: */
-                                                     0, /* U+0104f7: */
-                                                     0, /* U+0104f8: */
-                                                     0, /* U+0104f9: */
-                                                     0, /* U+0104fa: */
-                                                     0, /* U+0104fb: */
-                                                     0, /* U+0104fc: */
-                                                     0, /* U+0104fd: */
-                                                     0, /* U+0104fe: */
-                                                     0, /* U+0104ff: */
-                                                     0, /* U+010500: */
-                                                     0, /* U+010501: */
-                                                     0, /* U+010502: */
-                                                     0, /* U+010503: */
-                                                     0, /* U+010504: */
-                                                     0, /* U+010505: */
-                                                     0, /* U+010506: */
-                                                     0, /* U+010507: */
-                                                     0, /* U+010508: */
-                                                     0, /* U+010509: */
-                                                     0, /* U+01050a: */
-                                                     0, /* U+01050b: */
-                                                     0, /* U+01050c: */
-                                                     0, /* U+01050d: */
-                                                     0, /* U+01050e: */
-                                                     0, /* U+01050f: */
-                                                     0, /* U+010510: */
-                                                     0, /* U+010511: */
-                                                     0, /* U+010512: */
-                                                     0, /* U+010513: */
-                                                     0, /* U+010514: */
-                                                     0, /* U+010515: */
-                                                     0, /* U+010516: */
-                                                     0, /* U+010517: */
-                                                     0, /* U+010518: */
-                                                     0, /* U+010519: */
-                                                     0, /* U+01051a: */
-                                                     0, /* U+01051b: */
-                                                     0, /* U+01051c: */
-                                                     0, /* U+01051d: */
-                                                     0, /* U+01051e: */
-                                                     0, /* U+01051f: */
-                                                     0, /* U+010520: */
-                                                     0, /* U+010521: */
-                                                     0, /* U+010522: */
-                                                     0, /* U+010523: */
-                                                     0, /* U+010524: */
-                                                     0, /* U+010525: */
-                                                     0, /* U+010526: */
-                                                     0, /* U+010527: */
-                                                     0, /* U+010528: */
-                                                     0, /* U+010529: */
-                                                     0, /* U+01052a: */
-                                                     0, /* U+01052b: */
-                                                     0, /* U+01052c: */
-                                                     0, /* U+01052d: */
-                                                     0, /* U+01052e: */
-                                                     0, /* U+01052f: */
-                                                     0, /* U+010530: */
-                                                     0, /* U+010531: */
-                                                     0, /* U+010532: */
-                                                     0, /* U+010533: */
-                                                     0, /* U+010534: */
-                                                     0, /* U+010535: */
-                                                     0, /* U+010536: */
-                                                     0, /* U+010537: */
-                                                     0, /* U+010538: */
-                                                     0, /* U+010539: */
-                                                     0, /* U+01053a: */
-                                                     0, /* U+01053b: */
-                                                     0, /* U+01053c: */
-                                                     0, /* U+01053d: */
-                                                     0, /* U+01053e: */
-                                                     0, /* U+01053f: */
-                                                     0, /* U+010540: */
-                                                     0, /* U+010541: */
-                                                     0, /* U+010542: */
-                                                     0, /* U+010543: */
-                                                     0, /* U+010544: */
-                                                     0, /* U+010545: */
-                                                     0, /* U+010546: */
-                                                     0, /* U+010547: */
-                                                     0, /* U+010548: */
-                                                     0, /* U+010549: */
-                                                     0, /* U+01054a: */
-                                                     0, /* U+01054b: */
-                                                     0, /* U+01054c: */
-                                                     0, /* U+01054d: */
-                                                     0, /* U+01054e: */
-                                                     0, /* U+01054f: */
-                                                     0, /* U+010550: */
-                                                     0, /* U+010551: */
-                                                     0, /* U+010552: */
-                                                     0, /* U+010553: */
-                                                     0, /* U+010554: */
-                                                     0, /* U+010555: */
-                                                     0, /* U+010556: */
-                                                     0, /* U+010557: */
-                                                     0, /* U+010558: */
-                                                     0, /* U+010559: */
-                                                     0, /* U+01055a: */
-                                                     0, /* U+01055b: */
-                                                     0, /* U+01055c: */
-                                                     0, /* U+01055d: */
-                                                     0, /* U+01055e: */
-                                                     0, /* U+01055f: */
-                                                     0, /* U+010560: */
-                                                     0, /* U+010561: */
-                                                     0, /* U+010562: */
-                                                     0, /* U+010563: */
-                                                     0, /* U+010564: */
-                                                     0, /* U+010565: */
-                                                     0, /* U+010566: */
-                                                     0, /* U+010567: */
-                                                     0, /* U+010568: */
-                                                     0, /* U+010569: */
-                                                     0, /* U+01056a: */
-                                                     0, /* U+01056b: */
-                                                     0, /* U+01056c: */
-                                                     0, /* U+01056d: */
-                                                     0, /* U+01056e: */
-                                                     0, /* U+01056f: */
-                                                     0, /* U+010570: */
-                                                     0, /* U+010571: */
-                                                     0, /* U+010572: */
-                                                     0, /* U+010573: */
-                                                     0, /* U+010574: */
-                                                     0, /* U+010575: */
-                                                     0, /* U+010576: */
-                                                     0, /* U+010577: */
-                                                     0, /* U+010578: */
-                                                     0, /* U+010579: */
-                                                     0, /* U+01057a: */
-                                                     0, /* U+01057b: */
-                                                     0, /* U+01057c: */
-                                                     0, /* U+01057d: */
-                                                     0, /* U+01057e: */
-                                                     0, /* U+01057f: */
-                                                     0, /* U+010580: */
-                                                     0, /* U+010581: */
-                                                     0, /* U+010582: */
-                                                     0, /* U+010583: */
-                                                     0, /* U+010584: */
-                                                     0, /* U+010585: */
-                                                     0, /* U+010586: */
-                                                     0, /* U+010587: */
-                                                     0, /* U+010588: */
-                                                     0, /* U+010589: */
-                                                     0, /* U+01058a: */
-                                                     0, /* U+01058b: */
-                                                     0, /* U+01058c: */
-                                                     0, /* U+01058d: */
-                                                     0, /* U+01058e: */
-                                                     0, /* U+01058f: */
-                                                     0, /* U+010590: */
-                                                     0, /* U+010591: */
-                                                     0, /* U+010592: */
-                                                     0, /* U+010593: */
-                                                     0, /* U+010594: */
-                                                     0, /* U+010595: */
-                                                     0, /* U+010596: */
-                                                     0, /* U+010597: */
-                                                     0, /* U+010598: */
-                                                     0, /* U+010599: */
-                                                     0, /* U+01059a: */
-                                                     0, /* U+01059b: */
-                                                     0, /* U+01059c: */
-                                                     0, /* U+01059d: */
-                                                     0, /* U+01059e: */
-                                                     0, /* U+01059f: */
-                                                     0, /* U+0105a0: */
-                                                     0, /* U+0105a1: */
-                                                     0, /* U+0105a2: */
-                                                     0, /* U+0105a3: */
-                                                     0, /* U+0105a4: */
-                                                     0, /* U+0105a5: */
-                                                     0, /* U+0105a6: */
-                                                     0, /* U+0105a7: */
-                                                     0, /* U+0105a8: */
-                                                     0, /* U+0105a9: */
-                                                     0, /* U+0105aa: */
-                                                     0, /* U+0105ab: */
-                                                     0, /* U+0105ac: */
-                                                     0, /* U+0105ad: */
-                                                     0, /* U+0105ae: */
-                                                     0, /* U+0105af: */
-                                                     0, /* U+0105b0: */
-                                                     0, /* U+0105b1: */
-                                                     0, /* U+0105b2: */
-                                                     0, /* U+0105b3: */
-                                                     0, /* U+0105b4: */
-                                                     0, /* U+0105b5: */
-                                                     0, /* U+0105b6: */
-                                                     0, /* U+0105b7: */
-                                                     0, /* U+0105b8: */
-                                                     0, /* U+0105b9: */
-                                                     0, /* U+0105ba: */
-                                                     0, /* U+0105bb: */
-                                                     0, /* U+0105bc: */
-                                                     0, /* U+0105bd: */
-                                                     0, /* U+0105be: */
-                                                     0, /* U+0105bf: */
-                                                     0, /* U+0105c0: */
-                                                     0, /* U+0105c1: */
-                                                     0, /* U+0105c2: */
-                                                     0, /* U+0105c3: */
-                                                     0, /* U+0105c4: */
-                                                     0, /* U+0105c5: */
-                                                     0, /* U+0105c6: */
-                                                     0, /* U+0105c7: */
-                                                     0, /* U+0105c8: */
-                                                     0, /* U+0105c9: */
-                                                     0, /* U+0105ca: */
-                                                     0, /* U+0105cb: */
-                                                     0, /* U+0105cc: */
-                                                     0, /* U+0105cd: */
-                                                     0, /* U+0105ce: */
-                                                     0, /* U+0105cf: */
-                                                     0, /* U+0105d0: */
-                                                     0, /* U+0105d1: */
-                                                     0, /* U+0105d2: */
-                                                     0, /* U+0105d3: */
-                                                     0, /* U+0105d4: */
-                                                     0, /* U+0105d5: */
-                                                     0, /* U+0105d6: */
-                                                     0, /* U+0105d7: */
-                                                     0, /* U+0105d8: */
-                                                     0, /* U+0105d9: */
-                                                     0, /* U+0105da: */
-                                                     0, /* U+0105db: */
-                                                     0, /* U+0105dc: */
-                                                     0, /* U+0105dd: */
-                                                     0, /* U+0105de: */
-                                                     0, /* U+0105df: */
-                                                     0, /* U+0105e0: */
-                                                     0, /* U+0105e1: */
-                                                     0, /* U+0105e2: */
-                                                     0, /* U+0105e3: */
-                                                     0, /* U+0105e4: */
-                                                     0, /* U+0105e5: */
-                                                     0, /* U+0105e6: */
-                                                     0, /* U+0105e7: */
-                                                     0, /* U+0105e8: */
-                                                     0, /* U+0105e9: */
-                                                     0, /* U+0105ea: */
-                                                     0, /* U+0105eb: */
-                                                     0, /* U+0105ec: */
-                                                     0, /* U+0105ed: */
-                                                     0, /* U+0105ee: */
-                                                     0, /* U+0105ef: */
-                                                     0, /* U+0105f0: */
-                                                     0, /* U+0105f1: */
-                                                     0, /* U+0105f2: */
-                                                     0, /* U+0105f3: */
-                                                     0, /* U+0105f4: */
-                                                     0, /* U+0105f5: */
-                                                     0, /* U+0105f6: */
-                                                     0, /* U+0105f7: */
-                                                     0, /* U+0105f8: */
-                                                     0, /* U+0105f9: */
-                                                     0, /* U+0105fa: */
-                                                     0, /* U+0105fb: */
-                                                     0, /* U+0105fc: */
-                                                     0, /* U+0105fd: */
-                                                     0, /* U+0105fe: */
-                                                     0, /* U+0105ff: */
-                                                     0, /* U+010600: */
-                                                     0, /* U+010601: */
-                                                     0, /* U+010602: */
-                                                     0, /* U+010603: */
-                                                     0, /* U+010604: */
-                                                     0, /* U+010605: */
-                                                     0, /* U+010606: */
-                                                     0, /* U+010607: */
-                                                     0, /* U+010608: */
-                                                     0, /* U+010609: */
-                                                     0, /* U+01060a: */
-                                                     0, /* U+01060b: */
-                                                     0, /* U+01060c: */
-                                                     0, /* U+01060d: */
-                                                     0, /* U+01060e: */
-                                                     0, /* U+01060f: */
-                                                     0, /* U+010610: */
-                                                     0, /* U+010611: */
-                                                     0, /* U+010612: */
-                                                     0, /* U+010613: */
-                                                     0, /* U+010614: */
-                                                     0, /* U+010615: */
-                                                     0, /* U+010616: */
-                                                     0, /* U+010617: */
-                                                     0, /* U+010618: */
-                                                     0, /* U+010619: */
-                                                     0, /* U+01061a: */
-                                                     0, /* U+01061b: */
-                                                     0, /* U+01061c: */
-                                                     0, /* U+01061d: */
-                                                     0, /* U+01061e: */
-                                                     0, /* U+01061f: */
-                                                     0, /* U+010620: */
-                                                     0, /* U+010621: */
-                                                     0, /* U+010622: */
-                                                     0, /* U+010623: */
-                                                     0, /* U+010624: */
-                                                     0, /* U+010625: */
-                                                     0, /* U+010626: */
-                                                     0, /* U+010627: */
-                                                     0, /* U+010628: */
-                                                     0, /* U+010629: */
-                                                     0, /* U+01062a: */
-                                                     0, /* U+01062b: */
-                                                     0, /* U+01062c: */
-                                                     0, /* U+01062d: */
-                                                     0, /* U+01062e: */
-                                                     0, /* U+01062f: */
-                                                     0, /* U+010630: */
-                                                     0, /* U+010631: */
-                                                     0, /* U+010632: */
-                                                     0, /* U+010633: */
-                                                     0, /* U+010634: */
-                                                     0, /* U+010635: */
-                                                     0, /* U+010636: */
-                                                     0, /* U+010637: */
-                                                     0, /* U+010638: */
-                                                     0, /* U+010639: */
-                                                     0, /* U+01063a: */
-                                                     0, /* U+01063b: */
-                                                     0, /* U+01063c: */
-                                                     0, /* U+01063d: */
-                                                     0, /* U+01063e: */
-                                                     0, /* U+01063f: */
-                                                     0, /* U+010640: */
-                                                     0, /* U+010641: */
-                                                     0, /* U+010642: */
-                                                     0, /* U+010643: */
-                                                     0, /* U+010644: */
-                                                     0, /* U+010645: */
-                                                     0, /* U+010646: */
-                                                     0, /* U+010647: */
-                                                     0, /* U+010648: */
-                                                     0, /* U+010649: */
-                                                     0, /* U+01064a: */
-                                                     0, /* U+01064b: */
-                                                     0, /* U+01064c: */
-                                                     0, /* U+01064d: */
-                                                     0, /* U+01064e: */
-                                                     0, /* U+01064f: */
-                                                     0, /* U+010650: */
-                                                     0, /* U+010651: */
-                                                     0, /* U+010652: */
-                                                     0, /* U+010653: */
-                                                     0, /* U+010654: */
-                                                     0, /* U+010655: */
-                                                     0, /* U+010656: */
-                                                     0, /* U+010657: */
-                                                     0, /* U+010658: */
-                                                     0, /* U+010659: */
-                                                     0, /* U+01065a: */
-                                                     0, /* U+01065b: */
-                                                     0, /* U+01065c: */
-                                                     0, /* U+01065d: */
-                                                     0, /* U+01065e: */
-                                                     0, /* U+01065f: */
-                                                     0, /* U+010660: */
-                                                     0, /* U+010661: */
-                                                     0, /* U+010662: */
-                                                     0, /* U+010663: */
-                                                     0, /* U+010664: */
-                                                     0, /* U+010665: */
-                                                     0, /* U+010666: */
-                                                     0, /* U+010667: */
-                                                     0, /* U+010668: */
-                                                     0, /* U+010669: */
-                                                     0, /* U+01066a: */
-                                                     0, /* U+01066b: */
-                                                     0, /* U+01066c: */
-                                                     0, /* U+01066d: */
-                                                     0, /* U+01066e: */
-                                                     0, /* U+01066f: */
-                                                     0, /* U+010670: */
-                                                     0, /* U+010671: */
-                                                     0, /* U+010672: */
-                                                     0, /* U+010673: */
-                                                     0, /* U+010674: */
-                                                     0, /* U+010675: */
-                                                     0, /* U+010676: */
-                                                     0, /* U+010677: */
-                                                     0, /* U+010678: */
-                                                     0, /* U+010679: */
-                                                     0, /* U+01067a: */
-                                                     0, /* U+01067b: */
-                                                     0, /* U+01067c: */
-                                                     0, /* U+01067d: */
-                                                     0, /* U+01067e: */
-                                                     0, /* U+01067f: */
-                                                     0, /* U+010680: */
-                                                     0, /* U+010681: */
-                                                     0, /* U+010682: */
-                                                     0, /* U+010683: */
-                                                     0, /* U+010684: */
-                                                     0, /* U+010685: */
-                                                     0, /* U+010686: */
-                                                     0, /* U+010687: */
-                                                     0, /* U+010688: */
-                                                     0, /* U+010689: */
-                                                     0, /* U+01068a: */
-                                                     0, /* U+01068b: */
-                                                     0, /* U+01068c: */
-                                                     0, /* U+01068d: */
-                                                     0, /* U+01068e: */
-                                                     0, /* U+01068f: */
-                                                     0, /* U+010690: */
-                                                     0, /* U+010691: */
-                                                     0, /* U+010692: */
-                                                     0, /* U+010693: */
-                                                     0, /* U+010694: */
-                                                     0, /* U+010695: */
-                                                     0, /* U+010696: */
-                                                     0, /* U+010697: */
-                                                     0, /* U+010698: */
-                                                     0, /* U+010699: */
-                                                     0, /* U+01069a: */
-                                                     0, /* U+01069b: */
-                                                     0, /* U+01069c: */
-                                                     0, /* U+01069d: */
-                                                     0, /* U+01069e: */
-                                                     0, /* U+01069f: */
-                                                     0, /* U+0106a0: */
-                                                     0, /* U+0106a1: */
-                                                     0, /* U+0106a2: */
-                                                     0, /* U+0106a3: */
-                                                     0, /* U+0106a4: */
-                                                     0, /* U+0106a5: */
-                                                     0, /* U+0106a6: */
-                                                     0, /* U+0106a7: */
-                                                     0, /* U+0106a8: */
-                                                     0, /* U+0106a9: */
-                                                     0, /* U+0106aa: */
-                                                     0, /* U+0106ab: */
-                                                     0, /* U+0106ac: */
-                                                     0, /* U+0106ad: */
-                                                     0, /* U+0106ae: */
-                                                     0, /* U+0106af: */
-                                                     0, /* U+0106b0: */
-                                                     0, /* U+0106b1: */
-                                                     0, /* U+0106b2: */
-                                                     0, /* U+0106b3: */
-                                                     0, /* U+0106b4: */
-                                                     0, /* U+0106b5: */
-                                                     0, /* U+0106b6: */
-                                                     0, /* U+0106b7: */
-                                                     0, /* U+0106b8: */
-                                                     0, /* U+0106b9: */
-                                                     0, /* U+0106ba: */
-                                                     0, /* U+0106bb: */
-                                                     0, /* U+0106bc: */
-                                                     0, /* U+0106bd: */
-                                                     0, /* U+0106be: */
-                                                     0, /* U+0106bf: */
-                                                     0, /* U+0106c0: */
-                                                     0, /* U+0106c1: */
-                                                     0, /* U+0106c2: */
-                                                     0, /* U+0106c3: */
-                                                     0, /* U+0106c4: */
-                                                     0, /* U+0106c5: */
-                                                     0, /* U+0106c6: */
-                                                     0, /* U+0106c7: */
-                                                     0, /* U+0106c8: */
-                                                     0, /* U+0106c9: */
-                                                     0, /* U+0106ca: */
-                                                     0, /* U+0106cb: */
-                                                     0, /* U+0106cc: */
-                                                     0, /* U+0106cd: */
-                                                     0, /* U+0106ce: */
-                                                     0, /* U+0106cf: */
-                                                     0, /* U+0106d0: */
-                                                     0, /* U+0106d1: */
-                                                     0, /* U+0106d2: */
-                                                     0, /* U+0106d3: */
-                                                     0, /* U+0106d4: */
-                                                     0, /* U+0106d5: */
-                                                     0, /* U+0106d6: */
-                                                     0, /* U+0106d7: */
-                                                     0, /* U+0106d8: */
-                                                     0, /* U+0106d9: */
-                                                     0, /* U+0106da: */
-                                                     0, /* U+0106db: */
-                                                     0, /* U+0106dc: */
-                                                     0, /* U+0106dd: */
-                                                     0, /* U+0106de: */
-                                                     0, /* U+0106df: */
-                                                     0, /* U+0106e0: */
-                                                     0, /* U+0106e1: */
-                                                     0, /* U+0106e2: */
-                                                     0, /* U+0106e3: */
-                                                     0, /* U+0106e4: */
-                                                     0, /* U+0106e5: */
-                                                     0, /* U+0106e6: */
-                                                     0, /* U+0106e7: */
-                                                     0, /* U+0106e8: */
-                                                     0, /* U+0106e9: */
-                                                     0, /* U+0106ea: */
-                                                     0, /* U+0106eb: */
-                                                     0, /* U+0106ec: */
-                                                     0, /* U+0106ed: */
-                                                     0, /* U+0106ee: */
-                                                     0, /* U+0106ef: */
-                                                     0, /* U+0106f0: */
-                                                     0, /* U+0106f1: */
-                                                     0, /* U+0106f2: */
-                                                     0, /* U+0106f3: */
-                                                     0, /* U+0106f4: */
-                                                     0, /* U+0106f5: */
-                                                     0, /* U+0106f6: */
-                                                     0, /* U+0106f7: */
-                                                     0, /* U+0106f8: */
-                                                     0, /* U+0106f9: */
-                                                     0, /* U+0106fa: */
-                                                     0, /* U+0106fb: */
-                                                     0, /* U+0106fc: */
-                                                     0, /* U+0106fd: */
-                                                     0, /* U+0106fe: */
-                                                     0, /* U+0106ff: */
-                                                     0, /* U+010700: */
-                                                     0, /* U+010701: */
-                                                     0, /* U+010702: */
-                                                     0, /* U+010703: */
-                                                     0, /* U+010704: */
-                                                     0, /* U+010705: */
-                                                     0, /* U+010706: */
-                                                     0, /* U+010707: */
-                                                     0, /* U+010708: */
-                                                     0, /* U+010709: */
-                                                     0, /* U+01070a: */
-                                                     0, /* U+01070b: */
-                                                     0, /* U+01070c: */
-                                                     0, /* U+01070d: */
-                                                     0, /* U+01070e: */
-                                                     0, /* U+01070f: */
-                                                     0, /* U+010710: */
-                                                     0, /* U+010711: */
-                                                     0, /* U+010712: */
-                                                     0, /* U+010713: */
-                                                     0, /* U+010714: */
-                                                     0, /* U+010715: */
-                                                     0, /* U+010716: */
-                                                     0, /* U+010717: */
-                                                     0, /* U+010718: */
-                                                     0, /* U+010719: */
-                                                     0, /* U+01071a: */
-                                                     0, /* U+01071b: */
-                                                     0, /* U+01071c: */
-                                                     0, /* U+01071d: */
-                                                     0, /* U+01071e: */
-                                                     0, /* U+01071f: */
-                                                     0, /* U+010720: */
-                                                     0, /* U+010721: */
-                                                     0, /* U+010722: */
-                                                     0, /* U+010723: */
-                                                     0, /* U+010724: */
-                                                     0, /* U+010725: */
-                                                     0, /* U+010726: */
-                                                     0, /* U+010727: */
-                                                     0, /* U+010728: */
-                                                     0, /* U+010729: */
-                                                     0, /* U+01072a: */
-                                                     0, /* U+01072b: */
-                                                     0, /* U+01072c: */
-                                                     0, /* U+01072d: */
-                                                     0, /* U+01072e: */
-                                                     0, /* U+01072f: */
-                                                     0, /* U+010730: */
-                                                     0, /* U+010731: */
-                                                     0, /* U+010732: */
-                                                     0, /* U+010733: */
-                                                     0, /* U+010734: */
-                                                     0, /* U+010735: */
-                                                     0, /* U+010736: */
-                                                     0, /* U+010737: */
-                                                     0, /* U+010738: */
-                                                     0, /* U+010739: */
-                                                     0, /* U+01073a: */
-                                                     0, /* U+01073b: */
-                                                     0, /* U+01073c: */
-                                                     0, /* U+01073d: */
-                                                     0, /* U+01073e: */
-                                                     0, /* U+01073f: */
-                                                     0, /* U+010740: */
-                                                     0, /* U+010741: */
-                                                     0, /* U+010742: */
-                                                     0, /* U+010743: */
-                                                     0, /* U+010744: */
-                                                     0, /* U+010745: */
-                                                     0, /* U+010746: */
-                                                     0, /* U+010747: */
-                                                     0, /* U+010748: */
-                                                     0, /* U+010749: */
-                                                     0, /* U+01074a: */
-                                                     0, /* U+01074b: */
-                                                     0, /* U+01074c: */
-                                                     0, /* U+01074d: */
-                                                     0, /* U+01074e: */
-                                                     0, /* U+01074f: */
-                                                     0, /* U+010750: */
-                                                     0, /* U+010751: */
-                                                     0, /* U+010752: */
-                                                     0, /* U+010753: */
-                                                     0, /* U+010754: */
-                                                     0, /* U+010755: */
-                                                     0, /* U+010756: */
-                                                     0, /* U+010757: */
-                                                     0, /* U+010758: */
-                                                     0, /* U+010759: */
-                                                     0, /* U+01075a: */
-                                                     0, /* U+01075b: */
-                                                     0, /* U+01075c: */
-                                                     0, /* U+01075d: */
-                                                     0, /* U+01075e: */
-                                                     0, /* U+01075f: */
-                                                     0, /* U+010760: */
-                                                     0, /* U+010761: */
-                                                     0, /* U+010762: */
-                                                     0, /* U+010763: */
-                                                     0, /* U+010764: */
-                                                     0, /* U+010765: */
-                                                     0, /* U+010766: */
-                                                     0, /* U+010767: */
-                                                     0, /* U+010768: */
-                                                     0, /* U+010769: */
-                                                     0, /* U+01076a: */
-                                                     0, /* U+01076b: */
-                                                     0, /* U+01076c: */
-                                                     0, /* U+01076d: */
-                                                     0, /* U+01076e: */
-                                                     0, /* U+01076f: */
-                                                     0, /* U+010770: */
-                                                     0, /* U+010771: */
-                                                     0, /* U+010772: */
-                                                     0, /* U+010773: */
-                                                     0, /* U+010774: */
-                                                     0, /* U+010775: */
-                                                     0, /* U+010776: */
-                                                     0, /* U+010777: */
-                                                     0, /* U+010778: */
-                                                     0, /* U+010779: */
-                                                     0, /* U+01077a: */
-                                                     0, /* U+01077b: */
-                                                     0, /* U+01077c: */
-                                                     0, /* U+01077d: */
-                                                     0, /* U+01077e: */
-                                                     0, /* U+01077f: */
-                                                     0, /* U+010780: */
-                                                     0, /* U+010781: */
-                                                     0, /* U+010782: */
-                                                     0, /* U+010783: */
-                                                     0, /* U+010784: */
-                                                     0, /* U+010785: */
-                                                     0, /* U+010786: */
-                                                     0, /* U+010787: */
-                                                     0, /* U+010788: */
-                                                     0, /* U+010789: */
-                                                     0, /* U+01078a: */
-                                                     0, /* U+01078b: */
-                                                     0, /* U+01078c: */
-                                                     0, /* U+01078d: */
-                                                     0, /* U+01078e: */
-                                                     0, /* U+01078f: */
-                                                     0, /* U+010790: */
-                                                     0, /* U+010791: */
-                                                     0, /* U+010792: */
-                                                     0, /* U+010793: */
-                                                     0, /* U+010794: */
-                                                     0, /* U+010795: */
-                                                     0, /* U+010796: */
-                                                     0, /* U+010797: */
-                                                     0, /* U+010798: */
-                                                     0, /* U+010799: */
-                                                     0, /* U+01079a: */
-                                                     0, /* U+01079b: */
-                                                     0, /* U+01079c: */
-                                                     0, /* U+01079d: */
-                                                     0, /* U+01079e: */
-                                                     0, /* U+01079f: */
-                                                     0, /* U+0107a0: */
-                                                     0, /* U+0107a1: */
-                                                     0, /* U+0107a2: */
-                                                     0, /* U+0107a3: */
-                                                     0, /* U+0107a4: */
-                                                     0, /* U+0107a5: */
-                                                     0, /* U+0107a6: */
-                                                     0, /* U+0107a7: */
-                                                     0, /* U+0107a8: */
-                                                     0, /* U+0107a9: */
-                                                     0, /* U+0107aa: */
-                                                     0, /* U+0107ab: */
-                                                     0, /* U+0107ac: */
-                                                     0, /* U+0107ad: */
-                                                     0, /* U+0107ae: */
-                                                     0, /* U+0107af: */
-                                                     0, /* U+0107b0: */
-                                                     0, /* U+0107b1: */
-                                                     0, /* U+0107b2: */
-                                                     0, /* U+0107b3: */
-                                                     0, /* U+0107b4: */
-                                                     0, /* U+0107b5: */
-                                                     0, /* U+0107b6: */
-                                                     0, /* U+0107b7: */
-                                                     0, /* U+0107b8: */
-                                                     0, /* U+0107b9: */
-                                                     0, /* U+0107ba: */
-                                                     0, /* U+0107bb: */
-                                                     0, /* U+0107bc: */
-                                                     0, /* U+0107bd: */
-                                                     0, /* U+0107be: */
-                                                     0, /* U+0107bf: */
-                                                     0, /* U+0107c0: */
-                                                     0, /* U+0107c1: */
-                                                     0, /* U+0107c2: */
-                                                     0, /* U+0107c3: */
-                                                     0, /* U+0107c4: */
-                                                     0, /* U+0107c5: */
-                                                     0, /* U+0107c6: */
-                                                     0, /* U+0107c7: */
-                                                     0, /* U+0107c8: */
-                                                     0, /* U+0107c9: */
-                                                     0, /* U+0107ca: */
-                                                     0, /* U+0107cb: */
-                                                     0, /* U+0107cc: */
-                                                     0, /* U+0107cd: */
-                                                     0, /* U+0107ce: */
-                                                     0, /* U+0107cf: */
-                                                     0, /* U+0107d0: */
-                                                     0, /* U+0107d1: */
-                                                     0, /* U+0107d2: */
-                                                     0, /* U+0107d3: */
-                                                     0, /* U+0107d4: */
-                                                     0, /* U+0107d5: */
-                                                     0, /* U+0107d6: */
-                                                     0, /* U+0107d7: */
-                                                     0, /* U+0107d8: */
-                                                     0, /* U+0107d9: */
-                                                     0, /* U+0107da: */
-                                                     0, /* U+0107db: */
-                                                     0, /* U+0107dc: */
-                                                     0, /* U+0107dd: */
-                                                     0, /* U+0107de: */
-                                                     0, /* U+0107df: */
-                                                     0, /* U+0107e0: */
-                                                     0, /* U+0107e1: */
-                                                     0, /* U+0107e2: */
-                                                     0, /* U+0107e3: */
-                                                     0, /* U+0107e4: */
-                                                     0, /* U+0107e5: */
-                                                     0, /* U+0107e6: */
-                                                     0, /* U+0107e7: */
-                                                     0, /* U+0107e8: */
-                                                     0, /* U+0107e9: */
-                                                     0, /* U+0107ea: */
-                                                     0, /* U+0107eb: */
-                                                     0, /* U+0107ec: */
-                                                     0, /* U+0107ed: */
-                                                     0, /* U+0107ee: */
-                                                     0, /* U+0107ef: */
-                                                     0, /* U+0107f0: */
-                                                     0, /* U+0107f1: */
-                                                     0, /* U+0107f2: */
-                                                     0, /* U+0107f3: */
-                                                     0, /* U+0107f4: */
-                                                     0, /* U+0107f5: */
-                                                     0, /* U+0107f6: */
-                                                     0, /* U+0107f7: */
-                                                     0, /* U+0107f8: */
-                                                     0, /* U+0107f9: */
-                                                     0, /* U+0107fa: */
-                                                     0, /* U+0107fb: */
-                                                     0, /* U+0107fc: */
-                                                     0, /* U+0107fd: */
-                                                     0, /* U+0107fe: */
-                                                     0, /* U+0107ff: */
-                                           RTUNI_ALPHA, /* U+010800: CYPRIOT SYLLABLE A*/
-                                           RTUNI_ALPHA, /* U+010801: CYPRIOT SYLLABLE E*/
-                                           RTUNI_ALPHA, /* U+010802: CYPRIOT SYLLABLE I*/
-                                           RTUNI_ALPHA, /* U+010803: CYPRIOT SYLLABLE O*/
-                                           RTUNI_ALPHA, /* U+010804: CYPRIOT SYLLABLE U*/
-                                           RTUNI_ALPHA, /* U+010805: CYPRIOT SYLLABLE JA*/
-                                                     0, /* U+010806: */
-                                                     0, /* U+010807: */
-                                           RTUNI_ALPHA, /* U+010808: CYPRIOT SYLLABLE JO*/
-                                                     0, /* U+010809: */
-                                           RTUNI_ALPHA, /* U+01080a: CYPRIOT SYLLABLE KA*/
-                                           RTUNI_ALPHA, /* U+01080b: CYPRIOT SYLLABLE KE*/
-                                           RTUNI_ALPHA, /* U+01080c: CYPRIOT SYLLABLE KI*/
-                                           RTUNI_ALPHA, /* U+01080d: CYPRIOT SYLLABLE KO*/
-                                           RTUNI_ALPHA, /* U+01080e: CYPRIOT SYLLABLE KU*/
-                                           RTUNI_ALPHA, /* U+01080f: CYPRIOT SYLLABLE LA*/
-                                           RTUNI_ALPHA, /* U+010810: CYPRIOT SYLLABLE LE*/
-                                           RTUNI_ALPHA, /* U+010811: CYPRIOT SYLLABLE LI*/
-                                           RTUNI_ALPHA, /* U+010812: CYPRIOT SYLLABLE LO*/
-                                           RTUNI_ALPHA, /* U+010813: CYPRIOT SYLLABLE LU*/
-                                           RTUNI_ALPHA, /* U+010814: CYPRIOT SYLLABLE MA*/
-                                           RTUNI_ALPHA, /* U+010815: CYPRIOT SYLLABLE ME*/
-                                           RTUNI_ALPHA, /* U+010816: CYPRIOT SYLLABLE MI*/
-                                           RTUNI_ALPHA, /* U+010817: CYPRIOT SYLLABLE MO*/
-                                           RTUNI_ALPHA, /* U+010818: CYPRIOT SYLLABLE MU*/
-                                           RTUNI_ALPHA, /* U+010819: CYPRIOT SYLLABLE NA*/
-                                           RTUNI_ALPHA, /* U+01081a: CYPRIOT SYLLABLE NE*/
-                                           RTUNI_ALPHA, /* U+01081b: CYPRIOT SYLLABLE NI*/
-                                           RTUNI_ALPHA, /* U+01081c: CYPRIOT SYLLABLE NO*/
-                                           RTUNI_ALPHA, /* U+01081d: CYPRIOT SYLLABLE NU*/
-                                           RTUNI_ALPHA, /* U+01081e: CYPRIOT SYLLABLE PA*/
-                                           RTUNI_ALPHA, /* U+01081f: CYPRIOT SYLLABLE PE*/
-                                           RTUNI_ALPHA, /* U+010820: CYPRIOT SYLLABLE PI*/
-                                           RTUNI_ALPHA, /* U+010821: CYPRIOT SYLLABLE PO*/
-                                           RTUNI_ALPHA, /* U+010822: CYPRIOT SYLLABLE PU*/
-                                           RTUNI_ALPHA, /* U+010823: CYPRIOT SYLLABLE RA*/
-                                           RTUNI_ALPHA, /* U+010824: CYPRIOT SYLLABLE RE*/
-                                           RTUNI_ALPHA, /* U+010825: CYPRIOT SYLLABLE RI*/
-                                           RTUNI_ALPHA, /* U+010826: CYPRIOT SYLLABLE RO*/
-                                           RTUNI_ALPHA, /* U+010827: CYPRIOT SYLLABLE RU*/
-                                           RTUNI_ALPHA, /* U+010828: CYPRIOT SYLLABLE SA*/
-                                           RTUNI_ALPHA, /* U+010829: CYPRIOT SYLLABLE SE*/
-                                           RTUNI_ALPHA, /* U+01082a: CYPRIOT SYLLABLE SI*/
-                                           RTUNI_ALPHA, /* U+01082b: CYPRIOT SYLLABLE SO*/
-                                           RTUNI_ALPHA, /* U+01082c: CYPRIOT SYLLABLE SU*/
-                                           RTUNI_ALPHA, /* U+01082d: CYPRIOT SYLLABLE TA*/
-                                           RTUNI_ALPHA, /* U+01082e: CYPRIOT SYLLABLE TE*/
-                                           RTUNI_ALPHA, /* U+01082f: CYPRIOT SYLLABLE TI*/
-                                           RTUNI_ALPHA, /* U+010830: CYPRIOT SYLLABLE TO*/
-                                           RTUNI_ALPHA, /* U+010831: CYPRIOT SYLLABLE TU*/
-                                           RTUNI_ALPHA, /* U+010832: CYPRIOT SYLLABLE WA*/
-                                           RTUNI_ALPHA, /* U+010833: CYPRIOT SYLLABLE WE*/
-                                           RTUNI_ALPHA, /* U+010834: CYPRIOT SYLLABLE WI*/
-                                           RTUNI_ALPHA, /* U+010835: CYPRIOT SYLLABLE WO*/
-                                                     0, /* U+010836: */
-                                           RTUNI_ALPHA, /* U+010837: CYPRIOT SYLLABLE XA*/
-                                           RTUNI_ALPHA, /* U+010838: CYPRIOT SYLLABLE XE*/
-                                                     0, /* U+010839: */
-                                                     0, /* U+01083a: */
-                                                     0, /* U+01083b: */
-                                           RTUNI_ALPHA, /* U+01083c: CYPRIOT SYLLABLE ZA*/
-                                                     0, /* U+01083d: */
-                                                     0, /* U+01083e: */
-                                           RTUNI_ALPHA, /* U+01083f: CYPRIOT SYLLABLE ZO*/
-                                                     0, /* U+010840: */
-                                                     0, /* U+010841: */
-                                                     0, /* U+010842: */
-                                                     0, /* U+010843: */
-                                                     0, /* U+010844: */
-                                                     0, /* U+010845: */
-                                                     0, /* U+010846: */
-                                                     0, /* U+010847: */
-                                                     0, /* U+010848: */
-                                                     0, /* U+010849: */
-                                                     0, /* U+01084a: */
-                                                     0, /* U+01084b: */
-                                                     0, /* U+01084c: */
-                                                     0, /* U+01084d: */
-                                                     0, /* U+01084e: */
-                                                     0, /* U+01084f: */
-                                                     0, /* U+010850: */
-                                                     0, /* U+010851: */
-                                                     0, /* U+010852: */
-                                                     0, /* U+010853: */
-                                                     0, /* U+010854: */
-                                                     0, /* U+010855: */
-                                                     0, /* U+010856: */
-                                                     0, /* U+010857: */
-                                                     0, /* U+010858: */
-                                                     0, /* U+010859: */
-                                                     0, /* U+01085a: */
-                                                     0, /* U+01085b: */
-                                                     0, /* U+01085c: */
-                                                     0, /* U+01085d: */
-                                                     0, /* U+01085e: */
-                                                     0, /* U+01085f: */
-                                                     0, /* U+010860: */
-                                                     0, /* U+010861: */
-                                                     0, /* U+010862: */
-                                                     0, /* U+010863: */
-                                                     0, /* U+010864: */
-                                                     0, /* U+010865: */
-                                                     0, /* U+010866: */
-                                                     0, /* U+010867: */
-                                                     0, /* U+010868: */
-                                                     0, /* U+010869: */
-                                                     0, /* U+01086a: */
-                                                     0, /* U+01086b: */
-                                                     0, /* U+01086c: */
-                                                     0, /* U+01086d: */
-                                                     0, /* U+01086e: */
-                                                     0, /* U+01086f: */
-                                                     0, /* U+010870: */
-                                                     0, /* U+010871: */
-                                                     0, /* U+010872: */
-                                                     0, /* U+010873: */
-                                                     0, /* U+010874: */
-                                                     0, /* U+010875: */
-                                                     0, /* U+010876: */
-                                                     0, /* U+010877: */
-                                                     0, /* U+010878: */
-                                                     0, /* U+010879: */
-                                                     0, /* U+01087a: */
-                                                     0, /* U+01087b: */
-                                                     0, /* U+01087c: */
-                                                     0, /* U+01087d: */
-                                                     0, /* U+01087e: */
-                                                     0, /* U+01087f: */
-                                                     0, /* U+010880: */
-                                                     0, /* U+010881: */
-                                                     0, /* U+010882: */
-                                                     0, /* U+010883: */
-                                                     0, /* U+010884: */
-                                                     0, /* U+010885: */
-                                                     0, /* U+010886: */
-                                                     0, /* U+010887: */
-                                                     0, /* U+010888: */
-                                                     0, /* U+010889: */
-                                                     0, /* U+01088a: */
-                                                     0, /* U+01088b: */
-                                                     0, /* U+01088c: */
-                                                     0, /* U+01088d: */
-                                                     0, /* U+01088e: */
-                                                     0, /* U+01088f: */
-                                                     0, /* U+010890: */
-                                                     0, /* U+010891: */
-                                                     0, /* U+010892: */
-                                                     0, /* U+010893: */
-                                                     0, /* U+010894: */
-                                                     0, /* U+010895: */
-                                                     0, /* U+010896: */
-                                                     0, /* U+010897: */
-                                                     0, /* U+010898: */
-                                                     0, /* U+010899: */
-                                                     0, /* U+01089a: */
-                                                     0, /* U+01089b: */
-                                                     0, /* U+01089c: */
-                                                     0, /* U+01089d: */
-                                                     0, /* U+01089e: */
-                                                     0, /* U+01089f: */
-                                                     0, /* U+0108a0: */
-                                                     0, /* U+0108a1: */
-                                                     0, /* U+0108a2: */
-                                                     0, /* U+0108a3: */
-                                                     0, /* U+0108a4: */
-                                                     0, /* U+0108a5: */
-                                                     0, /* U+0108a6: */
-                                                     0, /* U+0108a7: */
-                                                     0, /* U+0108a8: */
-                                                     0, /* U+0108a9: */
-                                                     0, /* U+0108aa: */
-                                                     0, /* U+0108ab: */
-                                                     0, /* U+0108ac: */
-                                                     0, /* U+0108ad: */
-                                                     0, /* U+0108ae: */
-                                                     0, /* U+0108af: */
-                                                     0, /* U+0108b0: */
-                                                     0, /* U+0108b1: */
-                                                     0, /* U+0108b2: */
-                                                     0, /* U+0108b3: */
-                                                     0, /* U+0108b4: */
-                                                     0, /* U+0108b5: */
-                                                     0, /* U+0108b6: */
-                                                     0, /* U+0108b7: */
-                                                     0, /* U+0108b8: */
-                                                     0, /* U+0108b9: */
-                                                     0, /* U+0108ba: */
-                                                     0, /* U+0108bb: */
-                                                     0, /* U+0108bc: */
-                                                     0, /* U+0108bd: */
-                                                     0, /* U+0108be: */
-                                                     0, /* U+0108bf: */
-                                                     0, /* U+0108c0: */
-                                                     0, /* U+0108c1: */
-                                                     0, /* U+0108c2: */
-                                                     0, /* U+0108c3: */
-                                                     0, /* U+0108c4: */
-                                                     0, /* U+0108c5: */
-                                                     0, /* U+0108c6: */
-                                                     0, /* U+0108c7: */
-                                                     0, /* U+0108c8: */
-                                                     0, /* U+0108c9: */
-                                                     0, /* U+0108ca: */
-                                                     0, /* U+0108cb: */
-                                                     0, /* U+0108cc: */
-                                                     0, /* U+0108cd: */
-                                                     0, /* U+0108ce: */
-                                                     0, /* U+0108cf: */
-                                                     0, /* U+0108d0: */
-                                                     0, /* U+0108d1: */
-                                                     0, /* U+0108d2: */
-                                                     0, /* U+0108d3: */
-                                                     0, /* U+0108d4: */
-                                                     0, /* U+0108d5: */
-                                                     0, /* U+0108d6: */
-                                                     0, /* U+0108d7: */
-                                                     0, /* U+0108d8: */
-                                                     0, /* U+0108d9: */
-                                                     0, /* U+0108da: */
-                                                     0, /* U+0108db: */
-                                                     0, /* U+0108dc: */
-                                                     0, /* U+0108dd: */
-                                                     0, /* U+0108de: */
-                                                     0, /* U+0108df: */
-                                                     0, /* U+0108e0: */
-                                                     0, /* U+0108e1: */
-                                                     0, /* U+0108e2: */
-                                                     0, /* U+0108e3: */
-                                                     0, /* U+0108e4: */
-                                                     0, /* U+0108e5: */
-                                                     0, /* U+0108e6: */
-                                                     0, /* U+0108e7: */
-                                                     0, /* U+0108e8: */
-                                                     0, /* U+0108e9: */
-                                                     0, /* U+0108ea: */
-                                                     0, /* U+0108eb: */
-                                                     0, /* U+0108ec: */
-                                                     0, /* U+0108ed: */
-                                                     0, /* U+0108ee: */
-                                                     0, /* U+0108ef: */
-                                                     0, /* U+0108f0: */
-                                                     0, /* U+0108f1: */
-                                                     0, /* U+0108f2: */
-                                                     0, /* U+0108f3: */
-                                                     0, /* U+0108f4: */
-                                                     0, /* U+0108f5: */
-                                                     0, /* U+0108f6: */
-                                                     0, /* U+0108f7: */
-                                                     0, /* U+0108f8: */
-                                                     0, /* U+0108f9: */
-                                                     0, /* U+0108fa: */
-                                                     0, /* U+0108fb: */
-                                                     0, /* U+0108fc: */
-                                                     0, /* U+0108fd: */
-                                                     0, /* U+0108fe: */
-                                                     0, /* U+0108ff: */
-                                                     0, /* U+010900: */
-                                                     0, /* U+010901: */
-                                                     0, /* U+010902: */
-                                                     0, /* U+010903: */
-                                                     0, /* U+010904: */
-                                                     0, /* U+010905: */
-                                                     0, /* U+010906: */
-                                                     0, /* U+010907: */
-                                                     0, /* U+010908: */
-                                                     0, /* U+010909: */
-                                                     0, /* U+01090a: */
-                                                     0, /* U+01090b: */
-                                                     0, /* U+01090c: */
-                                                     0, /* U+01090d: */
-                                                     0, /* U+01090e: */
-                                                     0, /* U+01090f: */
-                                                     0, /* U+010910: */
-                                                     0, /* U+010911: */
-                                                     0, /* U+010912: */
-                                                     0, /* U+010913: */
-                                                     0, /* U+010914: */
-                                                     0, /* U+010915: */
-                                                     0, /* U+010916: */
-                                                     0, /* U+010917: */
-                                                     0, /* U+010918: */
-                                                     0, /* U+010919: */
-                                                     0, /* U+01091a: */
-                                                     0, /* U+01091b: */
-                                                     0, /* U+01091c: */
-                                                     0, /* U+01091d: */
-                                                     0, /* U+01091e: */
-                                                     0, /* U+01091f: */
-                                                     0, /* U+010920: */
-                                                     0, /* U+010921: */
-                                                     0, /* U+010922: */
-                                                     0, /* U+010923: */
-                                                     0, /* U+010924: */
-                                                     0, /* U+010925: */
-                                                     0, /* U+010926: */
-                                                     0, /* U+010927: */
-                                                     0, /* U+010928: */
-                                                     0, /* U+010929: */
-                                                     0, /* U+01092a: */
-                                                     0, /* U+01092b: */
-                                                     0, /* U+01092c: */
-                                                     0, /* U+01092d: */
-                                                     0, /* U+01092e: */
-                                                     0, /* U+01092f: */
-                                                     0, /* U+010930: */
-                                                     0, /* U+010931: */
-                                                     0, /* U+010932: */
-                                                     0, /* U+010933: */
-                                                     0, /* U+010934: */
-                                                     0, /* U+010935: */
-                                                     0, /* U+010936: */
-                                                     0, /* U+010937: */
-                                                     0, /* U+010938: */
-                                                     0, /* U+010939: */
-                                                     0, /* U+01093a: */
-                                                     0, /* U+01093b: */
-                                                     0, /* U+01093c: */
-                                                     0, /* U+01093d: */
-                                                     0, /* U+01093e: */
-                                                     0, /* U+01093f: */
-                                                     0, /* U+010940: */
-                                                     0, /* U+010941: */
-                                                     0, /* U+010942: */
-                                                     0, /* U+010943: */
-                                                     0, /* U+010944: */
-                                                     0, /* U+010945: */
-                                                     0, /* U+010946: */
-                                                     0, /* U+010947: */
-                                                     0, /* U+010948: */
-                                                     0, /* U+010949: */
-                                                     0, /* U+01094a: */
-                                                     0, /* U+01094b: */
-                                                     0, /* U+01094c: */
-                                                     0, /* U+01094d: */
-                                                     0, /* U+01094e: */
-                                                     0, /* U+01094f: */
-                                                     0, /* U+010950: */
-                                                     0, /* U+010951: */
-                                                     0, /* U+010952: */
-                                                     0, /* U+010953: */
-                                                     0, /* U+010954: */
-                                                     0, /* U+010955: */
-                                                     0, /* U+010956: */
-                                                     0, /* U+010957: */
-                                                     0, /* U+010958: */
-                                                     0, /* U+010959: */
-                                                     0, /* U+01095a: */
-                                                     0, /* U+01095b: */
-                                                     0, /* U+01095c: */
-                                                     0, /* U+01095d: */
-                                                     0, /* U+01095e: */
-                                                     0, /* U+01095f: */
-                                                     0, /* U+010960: */
-                                                     0, /* U+010961: */
-                                                     0, /* U+010962: */
-                                                     0, /* U+010963: */
-                                                     0, /* U+010964: */
-                                                     0, /* U+010965: */
-                                                     0, /* U+010966: */
-                                                     0, /* U+010967: */
-                                                     0, /* U+010968: */
-                                                     0, /* U+010969: */
-                                                     0, /* U+01096a: */
-                                                     0, /* U+01096b: */
-                                                     0, /* U+01096c: */
-                                                     0, /* U+01096d: */
-                                                     0, /* U+01096e: */
-                                                     0, /* U+01096f: */
-                                                     0, /* U+010970: */
-                                                     0, /* U+010971: */
-                                                     0, /* U+010972: */
-                                                     0, /* U+010973: */
-                                                     0, /* U+010974: */
-                                                     0, /* U+010975: */
-                                                     0, /* U+010976: */
-                                                     0, /* U+010977: */
-                                                     0, /* U+010978: */
-                                                     0, /* U+010979: */
-                                                     0, /* U+01097a: */
-                                                     0, /* U+01097b: */
-                                                     0, /* U+01097c: */
-                                                     0, /* U+01097d: */
-                                                     0, /* U+01097e: */
-                                                     0, /* U+01097f: */
-                                                     0, /* U+010980: */
-                                                     0, /* U+010981: */
-                                                     0, /* U+010982: */
-                                                     0, /* U+010983: */
-                                                     0, /* U+010984: */
-                                                     0, /* U+010985: */
-                                                     0, /* U+010986: */
-                                                     0, /* U+010987: */
-                                                     0, /* U+010988: */
-                                                     0, /* U+010989: */
-                                                     0, /* U+01098a: */
-                                                     0, /* U+01098b: */
-                                                     0, /* U+01098c: */
-                                                     0, /* U+01098d: */
-                                                     0, /* U+01098e: */
-                                                     0, /* U+01098f: */
-                                                     0, /* U+010990: */
-                                                     0, /* U+010991: */
-                                                     0, /* U+010992: */
-                                                     0, /* U+010993: */
-                                                     0, /* U+010994: */
-                                                     0, /* U+010995: */
-                                                     0, /* U+010996: */
-                                                     0, /* U+010997: */
-                                                     0, /* U+010998: */
-                                                     0, /* U+010999: */
-                                                     0, /* U+01099a: */
-                                                     0, /* U+01099b: */
-                                                     0, /* U+01099c: */
-                                                     0, /* U+01099d: */
-                                                     0, /* U+01099e: */
-                                                     0, /* U+01099f: */
-                                                     0, /* U+0109a0: */
-                                                     0, /* U+0109a1: */
-                                                     0, /* U+0109a2: */
-                                                     0, /* U+0109a3: */
-                                                     0, /* U+0109a4: */
-                                                     0, /* U+0109a5: */
-                                                     0, /* U+0109a6: */
-                                                     0, /* U+0109a7: */
-                                                     0, /* U+0109a8: */
-                                                     0, /* U+0109a9: */
-                                                     0, /* U+0109aa: */
-                                                     0, /* U+0109ab: */
-                                                     0, /* U+0109ac: */
-                                                     0, /* U+0109ad: */
-                                                     0, /* U+0109ae: */
-                                                     0, /* U+0109af: */
-                                                     0, /* U+0109b0: */
-                                                     0, /* U+0109b1: */
-                                                     0, /* U+0109b2: */
-                                                     0, /* U+0109b3: */
-                                                     0, /* U+0109b4: */
-                                                     0, /* U+0109b5: */
-                                                     0, /* U+0109b6: */
-                                                     0, /* U+0109b7: */
-                                                     0, /* U+0109b8: */
-                                                     0, /* U+0109b9: */
-                                                     0, /* U+0109ba: */
-                                                     0, /* U+0109bb: */
-                                                     0, /* U+0109bc: */
-                                                     0, /* U+0109bd: */
-                                                     0, /* U+0109be: */
-                                                     0, /* U+0109bf: */
-                                                     0, /* U+0109c0: */
-                                                     0, /* U+0109c1: */
-                                                     0, /* U+0109c2: */
-                                                     0, /* U+0109c3: */
-                                                     0, /* U+0109c4: */
-                                                     0, /* U+0109c5: */
-                                                     0, /* U+0109c6: */
-                                                     0, /* U+0109c7: */
-                                                     0, /* U+0109c8: */
-                                                     0, /* U+0109c9: */
-                                                     0, /* U+0109ca: */
-                                                     0, /* U+0109cb: */
-                                                     0, /* U+0109cc: */
-                                                     0, /* U+0109cd: */
-                                                     0, /* U+0109ce: */
-                                                     0, /* U+0109cf: */
-                                                     0, /* U+0109d0: */
-                                                     0, /* U+0109d1: */
-                                                     0, /* U+0109d2: */
-                                                     0, /* U+0109d3: */
-                                                     0, /* U+0109d4: */
-                                                     0, /* U+0109d5: */
-                                                     0, /* U+0109d6: */
-                                                     0, /* U+0109d7: */
-                                                     0, /* U+0109d8: */
-                                                     0, /* U+0109d9: */
-                                                     0, /* U+0109da: */
-                                                     0, /* U+0109db: */
-                                                     0, /* U+0109dc: */
-                                                     0, /* U+0109dd: */
-                                                     0, /* U+0109de: */
-                                                     0, /* U+0109df: */
-                                                     0, /* U+0109e0: */
-                                                     0, /* U+0109e1: */
-                                                     0, /* U+0109e2: */
-                                                     0, /* U+0109e3: */
-                                                     0, /* U+0109e4: */
-                                                     0, /* U+0109e5: */
-                                                     0, /* U+0109e6: */
-                                                     0, /* U+0109e7: */
-                                                     0, /* U+0109e8: */
-                                                     0, /* U+0109e9: */
-                                                     0, /* U+0109ea: */
-                                                     0, /* U+0109eb: */
-                                                     0, /* U+0109ec: */
-                                                     0, /* U+0109ed: */
-                                                     0, /* U+0109ee: */
-                                                     0, /* U+0109ef: */
-                                                     0, /* U+0109f0: */
-                                                     0, /* U+0109f1: */
-                                                     0, /* U+0109f2: */
-                                                     0, /* U+0109f3: */
-                                                     0, /* U+0109f4: */
-                                                     0, /* U+0109f5: */
-                                                     0, /* U+0109f6: */
-                                                     0, /* U+0109f7: */
-                                                     0, /* U+0109f8: */
-                                                     0, /* U+0109f9: */
-                                                     0, /* U+0109fa: */
-                                                     0, /* U+0109fb: */
-                                                     0, /* U+0109fc: */
-                                                     0, /* U+0109fd: */
-                                                     0, /* U+0109fe: */
-                                                     0, /* U+0109ff: */
-                                           RTUNI_ALPHA, /* U+010a00: KHAROSHTHI LETTER A*/
-                                           RTUNI_ALPHA, /* U+010a01: KHAROSHTHI VOWEL SIGN I*/
-                                           RTUNI_ALPHA, /* U+010a02: KHAROSHTHI VOWEL SIGN U*/
-                                           RTUNI_ALPHA, /* U+010a03: KHAROSHTHI VOWEL SIGN VOCALIC R*/
-                                                     0, /* U+010a04: */
-                                           RTUNI_ALPHA, /* U+010a05: KHAROSHTHI VOWEL SIGN E*/
-                                           RTUNI_ALPHA, /* U+010a06: KHAROSHTHI VOWEL SIGN O*/
-                                                     0, /* U+010a07: */
-                                                     0, /* U+010a08: */
-                                                     0, /* U+010a09: */
-                                                     0, /* U+010a0a: */
-                                                     0, /* U+010a0b: */
-                                           RTUNI_ALPHA, /* U+010a0c: KHAROSHTHI VOWEL LENGTH MARK*/
-                                           RTUNI_ALPHA, /* U+010a0d: KHAROSHTHI SIGN DOUBLE RING BELOW*/
-                                           RTUNI_ALPHA, /* U+010a0e: KHAROSHTHI SIGN ANUSVARA*/
-                                           RTUNI_ALPHA, /* U+010a0f: KHAROSHTHI SIGN VISARGA*/
-                                           RTUNI_ALPHA, /* U+010a10: KHAROSHTHI LETTER KA*/
-                                           RTUNI_ALPHA, /* U+010a11: KHAROSHTHI LETTER KHA*/
-                                           RTUNI_ALPHA, /* U+010a12: KHAROSHTHI LETTER GA*/
-                                           RTUNI_ALPHA, /* U+010a13: KHAROSHTHI LETTER GHA*/
-                                                     0, /* U+010a14: */
-                                           RTUNI_ALPHA, /* U+010a15: KHAROSHTHI LETTER CA*/
-                                           RTUNI_ALPHA, /* U+010a16: KHAROSHTHI LETTER CHA*/
-                                           RTUNI_ALPHA, /* U+010a17: KHAROSHTHI LETTER JA*/
-                                                     0, /* U+010a18: */
-                                           RTUNI_ALPHA, /* U+010a19: KHAROSHTHI LETTER NYA*/
-                                           RTUNI_ALPHA, /* U+010a1a: KHAROSHTHI LETTER TTA*/
-                                           RTUNI_ALPHA, /* U+010a1b: KHAROSHTHI LETTER TTHA*/
-                                           RTUNI_ALPHA, /* U+010a1c: KHAROSHTHI LETTER DDA*/
-                                           RTUNI_ALPHA, /* U+010a1d: KHAROSHTHI LETTER DDHA*/
-                                           RTUNI_ALPHA, /* U+010a1e: KHAROSHTHI LETTER NNA*/
-                                           RTUNI_ALPHA, /* U+010a1f: KHAROSHTHI LETTER TA*/
-                                           RTUNI_ALPHA, /* U+010a20: KHAROSHTHI LETTER THA*/
-                                           RTUNI_ALPHA, /* U+010a21: KHAROSHTHI LETTER DA*/
-                                           RTUNI_ALPHA, /* U+010a22: KHAROSHTHI LETTER DHA*/
-                                           RTUNI_ALPHA, /* U+010a23: KHAROSHTHI LETTER NA*/
-                                           RTUNI_ALPHA, /* U+010a24: KHAROSHTHI LETTER PA*/
-                                           RTUNI_ALPHA, /* U+010a25: KHAROSHTHI LETTER PHA*/
-                                           RTUNI_ALPHA, /* U+010a26: KHAROSHTHI LETTER BA*/
-                                           RTUNI_ALPHA, /* U+010a27: KHAROSHTHI LETTER BHA*/
-                                           RTUNI_ALPHA, /* U+010a28: KHAROSHTHI LETTER MA*/
-                                           RTUNI_ALPHA, /* U+010a29: KHAROSHTHI LETTER YA*/
-                                           RTUNI_ALPHA, /* U+010a2a: KHAROSHTHI LETTER RA*/
-                                           RTUNI_ALPHA, /* U+010a2b: KHAROSHTHI LETTER LA*/
-                                           RTUNI_ALPHA, /* U+010a2c: KHAROSHTHI LETTER VA*/
-                                           RTUNI_ALPHA, /* U+010a2d: KHAROSHTHI LETTER SHA*/
-                                           RTUNI_ALPHA, /* U+010a2e: KHAROSHTHI LETTER SSA*/
-                                           RTUNI_ALPHA, /* U+010a2f: KHAROSHTHI LETTER SA*/
-                                           RTUNI_ALPHA, /* U+010a30: KHAROSHTHI LETTER ZA*/
-                                           RTUNI_ALPHA, /* U+010a31: KHAROSHTHI LETTER HA*/
-                                           RTUNI_ALPHA, /* U+010a32: KHAROSHTHI LETTER KKA*/
-                                           RTUNI_ALPHA, /* U+010a33: KHAROSHTHI LETTER TTTHA*/
-};
-
-static const uint8_t g_afRTUniFlags0x01d400[] =
-{
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d400: MATHEMATICAL BOLD CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d401: MATHEMATICAL BOLD CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d402: MATHEMATICAL BOLD CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d403: MATHEMATICAL BOLD CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d404: MATHEMATICAL BOLD CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d405: MATHEMATICAL BOLD CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d406: MATHEMATICAL BOLD CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d407: MATHEMATICAL BOLD CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d408: MATHEMATICAL BOLD CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d409: MATHEMATICAL BOLD CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40a: MATHEMATICAL BOLD CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40b: MATHEMATICAL BOLD CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40c: MATHEMATICAL BOLD CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40d: MATHEMATICAL BOLD CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40e: MATHEMATICAL BOLD CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d40f: MATHEMATICAL BOLD CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d410: MATHEMATICAL BOLD CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d411: MATHEMATICAL BOLD CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d412: MATHEMATICAL BOLD CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d413: MATHEMATICAL BOLD CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d414: MATHEMATICAL BOLD CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d415: MATHEMATICAL BOLD CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d416: MATHEMATICAL BOLD CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d417: MATHEMATICAL BOLD CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d418: MATHEMATICAL BOLD CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d419: MATHEMATICAL BOLD CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41a: MATHEMATICAL BOLD SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41b: MATHEMATICAL BOLD SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41c: MATHEMATICAL BOLD SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41d: MATHEMATICAL BOLD SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41e: MATHEMATICAL BOLD SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d41f: MATHEMATICAL BOLD SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d420: MATHEMATICAL BOLD SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d421: MATHEMATICAL BOLD SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d422: MATHEMATICAL BOLD SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d423: MATHEMATICAL BOLD SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d424: MATHEMATICAL BOLD SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d425: MATHEMATICAL BOLD SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d426: MATHEMATICAL BOLD SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d427: MATHEMATICAL BOLD SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d428: MATHEMATICAL BOLD SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d429: MATHEMATICAL BOLD SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42a: MATHEMATICAL BOLD SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42b: MATHEMATICAL BOLD SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42c: MATHEMATICAL BOLD SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42d: MATHEMATICAL BOLD SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42e: MATHEMATICAL BOLD SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d42f: MATHEMATICAL BOLD SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d430: MATHEMATICAL BOLD SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d431: MATHEMATICAL BOLD SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d432: MATHEMATICAL BOLD SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d433: MATHEMATICAL BOLD SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d434: MATHEMATICAL ITALIC CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d435: MATHEMATICAL ITALIC CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d436: MATHEMATICAL ITALIC CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d437: MATHEMATICAL ITALIC CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d438: MATHEMATICAL ITALIC CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d439: MATHEMATICAL ITALIC CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43a: MATHEMATICAL ITALIC CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43b: MATHEMATICAL ITALIC CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43c: MATHEMATICAL ITALIC CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43d: MATHEMATICAL ITALIC CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43e: MATHEMATICAL ITALIC CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d43f: MATHEMATICAL ITALIC CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d440: MATHEMATICAL ITALIC CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d441: MATHEMATICAL ITALIC CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d442: MATHEMATICAL ITALIC CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d443: MATHEMATICAL ITALIC CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d444: MATHEMATICAL ITALIC CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d445: MATHEMATICAL ITALIC CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d446: MATHEMATICAL ITALIC CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d447: MATHEMATICAL ITALIC CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d448: MATHEMATICAL ITALIC CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d449: MATHEMATICAL ITALIC CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44a: MATHEMATICAL ITALIC CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44b: MATHEMATICAL ITALIC CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44c: MATHEMATICAL ITALIC CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d44d: MATHEMATICAL ITALIC CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44e: MATHEMATICAL ITALIC SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d44f: MATHEMATICAL ITALIC SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d450: MATHEMATICAL ITALIC SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d451: MATHEMATICAL ITALIC SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d452: MATHEMATICAL ITALIC SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d453: MATHEMATICAL ITALIC SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d454: MATHEMATICAL ITALIC SMALL G*/
-                                                     0, /* U+01d455: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d456: MATHEMATICAL ITALIC SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d457: MATHEMATICAL ITALIC SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d458: MATHEMATICAL ITALIC SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d459: MATHEMATICAL ITALIC SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45a: MATHEMATICAL ITALIC SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45b: MATHEMATICAL ITALIC SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45c: MATHEMATICAL ITALIC SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45d: MATHEMATICAL ITALIC SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45e: MATHEMATICAL ITALIC SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d45f: MATHEMATICAL ITALIC SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d460: MATHEMATICAL ITALIC SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d461: MATHEMATICAL ITALIC SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d462: MATHEMATICAL ITALIC SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d463: MATHEMATICAL ITALIC SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d464: MATHEMATICAL ITALIC SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d465: MATHEMATICAL ITALIC SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d466: MATHEMATICAL ITALIC SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d467: MATHEMATICAL ITALIC SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d468: MATHEMATICAL BOLD ITALIC CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d469: MATHEMATICAL BOLD ITALIC CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46a: MATHEMATICAL BOLD ITALIC CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46b: MATHEMATICAL BOLD ITALIC CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46c: MATHEMATICAL BOLD ITALIC CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46d: MATHEMATICAL BOLD ITALIC CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46e: MATHEMATICAL BOLD ITALIC CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d46f: MATHEMATICAL BOLD ITALIC CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d470: MATHEMATICAL BOLD ITALIC CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d471: MATHEMATICAL BOLD ITALIC CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d472: MATHEMATICAL BOLD ITALIC CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d473: MATHEMATICAL BOLD ITALIC CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d474: MATHEMATICAL BOLD ITALIC CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d475: MATHEMATICAL BOLD ITALIC CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d476: MATHEMATICAL BOLD ITALIC CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d477: MATHEMATICAL BOLD ITALIC CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d478: MATHEMATICAL BOLD ITALIC CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d479: MATHEMATICAL BOLD ITALIC CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47a: MATHEMATICAL BOLD ITALIC CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47b: MATHEMATICAL BOLD ITALIC CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47c: MATHEMATICAL BOLD ITALIC CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47d: MATHEMATICAL BOLD ITALIC CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47e: MATHEMATICAL BOLD ITALIC CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d47f: MATHEMATICAL BOLD ITALIC CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d480: MATHEMATICAL BOLD ITALIC CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d481: MATHEMATICAL BOLD ITALIC CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d482: MATHEMATICAL BOLD ITALIC SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d483: MATHEMATICAL BOLD ITALIC SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d484: MATHEMATICAL BOLD ITALIC SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d485: MATHEMATICAL BOLD ITALIC SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d486: MATHEMATICAL BOLD ITALIC SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d487: MATHEMATICAL BOLD ITALIC SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d488: MATHEMATICAL BOLD ITALIC SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d489: MATHEMATICAL BOLD ITALIC SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48a: MATHEMATICAL BOLD ITALIC SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48b: MATHEMATICAL BOLD ITALIC SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48c: MATHEMATICAL BOLD ITALIC SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48d: MATHEMATICAL BOLD ITALIC SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48e: MATHEMATICAL BOLD ITALIC SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d48f: MATHEMATICAL BOLD ITALIC SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d490: MATHEMATICAL BOLD ITALIC SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d491: MATHEMATICAL BOLD ITALIC SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d492: MATHEMATICAL BOLD ITALIC SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d493: MATHEMATICAL BOLD ITALIC SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d494: MATHEMATICAL BOLD ITALIC SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d495: MATHEMATICAL BOLD ITALIC SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d496: MATHEMATICAL BOLD ITALIC SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d497: MATHEMATICAL BOLD ITALIC SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d498: MATHEMATICAL BOLD ITALIC SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d499: MATHEMATICAL BOLD ITALIC SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49a: MATHEMATICAL BOLD ITALIC SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d49b: MATHEMATICAL BOLD ITALIC SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49c: MATHEMATICAL SCRIPT CAPITAL A*/
-                                                     0, /* U+01d49d: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49e: MATHEMATICAL SCRIPT CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d49f: MATHEMATICAL SCRIPT CAPITAL D*/
-                                                     0, /* U+01d4a0: */
-                                                     0, /* U+01d4a1: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a2: MATHEMATICAL SCRIPT CAPITAL G*/
-                                                     0, /* U+01d4a3: */
-                                                     0, /* U+01d4a4: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a5: MATHEMATICAL SCRIPT CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a6: MATHEMATICAL SCRIPT CAPITAL K*/
-                                                     0, /* U+01d4a7: */
-                                                     0, /* U+01d4a8: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4a9: MATHEMATICAL SCRIPT CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4aa: MATHEMATICAL SCRIPT CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ab: MATHEMATICAL SCRIPT CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ac: MATHEMATICAL SCRIPT CAPITAL Q*/
-                                                     0, /* U+01d4ad: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4ae: MATHEMATICAL SCRIPT CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4af: MATHEMATICAL SCRIPT CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b0: MATHEMATICAL SCRIPT CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b1: MATHEMATICAL SCRIPT CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b2: MATHEMATICAL SCRIPT CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b3: MATHEMATICAL SCRIPT CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b4: MATHEMATICAL SCRIPT CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4b5: MATHEMATICAL SCRIPT CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b6: MATHEMATICAL SCRIPT SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b7: MATHEMATICAL SCRIPT SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b8: MATHEMATICAL SCRIPT SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4b9: MATHEMATICAL SCRIPT SMALL D*/
-                                                     0, /* U+01d4ba: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bb: MATHEMATICAL SCRIPT SMALL F*/
-                                                     0, /* U+01d4bc: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bd: MATHEMATICAL SCRIPT SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4be: MATHEMATICAL SCRIPT SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4bf: MATHEMATICAL SCRIPT SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c0: MATHEMATICAL SCRIPT SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c1: MATHEMATICAL SCRIPT SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c2: MATHEMATICAL SCRIPT SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c3: MATHEMATICAL SCRIPT SMALL N*/
-                                                     0, /* U+01d4c4: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c5: MATHEMATICAL SCRIPT SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c6: MATHEMATICAL SCRIPT SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c7: MATHEMATICAL SCRIPT SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c8: MATHEMATICAL SCRIPT SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4c9: MATHEMATICAL SCRIPT SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ca: MATHEMATICAL SCRIPT SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cb: MATHEMATICAL SCRIPT SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cc: MATHEMATICAL SCRIPT SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cd: MATHEMATICAL SCRIPT SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ce: MATHEMATICAL SCRIPT SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4cf: MATHEMATICAL SCRIPT SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d0: MATHEMATICAL BOLD SCRIPT CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d1: MATHEMATICAL BOLD SCRIPT CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d2: MATHEMATICAL BOLD SCRIPT CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d3: MATHEMATICAL BOLD SCRIPT CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d4: MATHEMATICAL BOLD SCRIPT CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d5: MATHEMATICAL BOLD SCRIPT CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d6: MATHEMATICAL BOLD SCRIPT CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d7: MATHEMATICAL BOLD SCRIPT CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d8: MATHEMATICAL BOLD SCRIPT CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4d9: MATHEMATICAL BOLD SCRIPT CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4da: MATHEMATICAL BOLD SCRIPT CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4db: MATHEMATICAL BOLD SCRIPT CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dc: MATHEMATICAL BOLD SCRIPT CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4dd: MATHEMATICAL BOLD SCRIPT CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4de: MATHEMATICAL BOLD SCRIPT CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4df: MATHEMATICAL BOLD SCRIPT CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e0: MATHEMATICAL BOLD SCRIPT CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e1: MATHEMATICAL BOLD SCRIPT CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e2: MATHEMATICAL BOLD SCRIPT CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e3: MATHEMATICAL BOLD SCRIPT CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e4: MATHEMATICAL BOLD SCRIPT CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e5: MATHEMATICAL BOLD SCRIPT CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e6: MATHEMATICAL BOLD SCRIPT CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e7: MATHEMATICAL BOLD SCRIPT CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e8: MATHEMATICAL BOLD SCRIPT CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d4e9: MATHEMATICAL BOLD SCRIPT CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ea: MATHEMATICAL BOLD SCRIPT SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4eb: MATHEMATICAL BOLD SCRIPT SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ec: MATHEMATICAL BOLD SCRIPT SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ed: MATHEMATICAL BOLD SCRIPT SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ee: MATHEMATICAL BOLD SCRIPT SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ef: MATHEMATICAL BOLD SCRIPT SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f0: MATHEMATICAL BOLD SCRIPT SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f1: MATHEMATICAL BOLD SCRIPT SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f2: MATHEMATICAL BOLD SCRIPT SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f3: MATHEMATICAL BOLD SCRIPT SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f4: MATHEMATICAL BOLD SCRIPT SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f5: MATHEMATICAL BOLD SCRIPT SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f6: MATHEMATICAL BOLD SCRIPT SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f7: MATHEMATICAL BOLD SCRIPT SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f8: MATHEMATICAL BOLD SCRIPT SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4f9: MATHEMATICAL BOLD SCRIPT SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fa: MATHEMATICAL BOLD SCRIPT SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fb: MATHEMATICAL BOLD SCRIPT SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fc: MATHEMATICAL BOLD SCRIPT SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fd: MATHEMATICAL BOLD SCRIPT SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4fe: MATHEMATICAL BOLD SCRIPT SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d4ff: MATHEMATICAL BOLD SCRIPT SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d500: MATHEMATICAL BOLD SCRIPT SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d501: MATHEMATICAL BOLD SCRIPT SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d502: MATHEMATICAL BOLD SCRIPT SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d503: MATHEMATICAL BOLD SCRIPT SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d504: MATHEMATICAL FRAKTUR CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d505: MATHEMATICAL FRAKTUR CAPITAL B*/
-                                                     0, /* U+01d506: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d507: MATHEMATICAL FRAKTUR CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d508: MATHEMATICAL FRAKTUR CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d509: MATHEMATICAL FRAKTUR CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50a: MATHEMATICAL FRAKTUR CAPITAL G*/
-                                                     0, /* U+01d50b: */
-                                                     0, /* U+01d50c: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50d: MATHEMATICAL FRAKTUR CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50e: MATHEMATICAL FRAKTUR CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d50f: MATHEMATICAL FRAKTUR CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d510: MATHEMATICAL FRAKTUR CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d511: MATHEMATICAL FRAKTUR CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d512: MATHEMATICAL FRAKTUR CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d513: MATHEMATICAL FRAKTUR CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d514: MATHEMATICAL FRAKTUR CAPITAL Q*/
-                                                     0, /* U+01d515: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d516: MATHEMATICAL FRAKTUR CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d517: MATHEMATICAL FRAKTUR CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d518: MATHEMATICAL FRAKTUR CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d519: MATHEMATICAL FRAKTUR CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51a: MATHEMATICAL FRAKTUR CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51b: MATHEMATICAL FRAKTUR CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d51c: MATHEMATICAL FRAKTUR CAPITAL Y*/
-                                                     0, /* U+01d51d: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51e: MATHEMATICAL FRAKTUR SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d51f: MATHEMATICAL FRAKTUR SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d520: MATHEMATICAL FRAKTUR SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d521: MATHEMATICAL FRAKTUR SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d522: MATHEMATICAL FRAKTUR SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d523: MATHEMATICAL FRAKTUR SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d524: MATHEMATICAL FRAKTUR SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d525: MATHEMATICAL FRAKTUR SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d526: MATHEMATICAL FRAKTUR SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d527: MATHEMATICAL FRAKTUR SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d528: MATHEMATICAL FRAKTUR SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d529: MATHEMATICAL FRAKTUR SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52a: MATHEMATICAL FRAKTUR SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52b: MATHEMATICAL FRAKTUR SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52c: MATHEMATICAL FRAKTUR SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52d: MATHEMATICAL FRAKTUR SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52e: MATHEMATICAL FRAKTUR SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d52f: MATHEMATICAL FRAKTUR SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d530: MATHEMATICAL FRAKTUR SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d531: MATHEMATICAL FRAKTUR SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d532: MATHEMATICAL FRAKTUR SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d533: MATHEMATICAL FRAKTUR SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d534: MATHEMATICAL FRAKTUR SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d535: MATHEMATICAL FRAKTUR SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d536: MATHEMATICAL FRAKTUR SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d537: MATHEMATICAL FRAKTUR SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d538: MATHEMATICAL DOUBLE-STRUCK CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d539: MATHEMATICAL DOUBLE-STRUCK CAPITAL B*/
-                                                     0, /* U+01d53a: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53b: MATHEMATICAL DOUBLE-STRUCK CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53c: MATHEMATICAL DOUBLE-STRUCK CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53d: MATHEMATICAL DOUBLE-STRUCK CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d53e: MATHEMATICAL DOUBLE-STRUCK CAPITAL G*/
-                                                     0, /* U+01d53f: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d540: MATHEMATICAL DOUBLE-STRUCK CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d541: MATHEMATICAL DOUBLE-STRUCK CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d542: MATHEMATICAL DOUBLE-STRUCK CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d543: MATHEMATICAL DOUBLE-STRUCK CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d544: MATHEMATICAL DOUBLE-STRUCK CAPITAL M*/
-                                                     0, /* U+01d545: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d546: MATHEMATICAL DOUBLE-STRUCK CAPITAL O*/
-                                                     0, /* U+01d547: */
-                                                     0, /* U+01d548: */
-                                                     0, /* U+01d549: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54a: MATHEMATICAL DOUBLE-STRUCK CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54b: MATHEMATICAL DOUBLE-STRUCK CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54c: MATHEMATICAL DOUBLE-STRUCK CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54d: MATHEMATICAL DOUBLE-STRUCK CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54e: MATHEMATICAL DOUBLE-STRUCK CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d54f: MATHEMATICAL DOUBLE-STRUCK CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d550: MATHEMATICAL DOUBLE-STRUCK CAPITAL Y*/
-                                                     0, /* U+01d551: */
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d552: MATHEMATICAL DOUBLE-STRUCK SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d553: MATHEMATICAL DOUBLE-STRUCK SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d554: MATHEMATICAL DOUBLE-STRUCK SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d555: MATHEMATICAL DOUBLE-STRUCK SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d556: MATHEMATICAL DOUBLE-STRUCK SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d557: MATHEMATICAL DOUBLE-STRUCK SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d558: MATHEMATICAL DOUBLE-STRUCK SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d559: MATHEMATICAL DOUBLE-STRUCK SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55a: MATHEMATICAL DOUBLE-STRUCK SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55b: MATHEMATICAL DOUBLE-STRUCK SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55c: MATHEMATICAL DOUBLE-STRUCK SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55d: MATHEMATICAL DOUBLE-STRUCK SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55e: MATHEMATICAL DOUBLE-STRUCK SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d55f: MATHEMATICAL DOUBLE-STRUCK SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d560: MATHEMATICAL DOUBLE-STRUCK SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d561: MATHEMATICAL DOUBLE-STRUCK SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d562: MATHEMATICAL DOUBLE-STRUCK SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d563: MATHEMATICAL DOUBLE-STRUCK SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d564: MATHEMATICAL DOUBLE-STRUCK SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d565: MATHEMATICAL DOUBLE-STRUCK SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d566: MATHEMATICAL DOUBLE-STRUCK SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d567: MATHEMATICAL DOUBLE-STRUCK SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d568: MATHEMATICAL DOUBLE-STRUCK SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d569: MATHEMATICAL DOUBLE-STRUCK SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56a: MATHEMATICAL DOUBLE-STRUCK SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d56b: MATHEMATICAL DOUBLE-STRUCK SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56c: MATHEMATICAL BOLD FRAKTUR CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56d: MATHEMATICAL BOLD FRAKTUR CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56e: MATHEMATICAL BOLD FRAKTUR CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d56f: MATHEMATICAL BOLD FRAKTUR CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d570: MATHEMATICAL BOLD FRAKTUR CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d571: MATHEMATICAL BOLD FRAKTUR CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d572: MATHEMATICAL BOLD FRAKTUR CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d573: MATHEMATICAL BOLD FRAKTUR CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d574: MATHEMATICAL BOLD FRAKTUR CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d575: MATHEMATICAL BOLD FRAKTUR CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d576: MATHEMATICAL BOLD FRAKTUR CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d577: MATHEMATICAL BOLD FRAKTUR CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d578: MATHEMATICAL BOLD FRAKTUR CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d579: MATHEMATICAL BOLD FRAKTUR CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57a: MATHEMATICAL BOLD FRAKTUR CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57b: MATHEMATICAL BOLD FRAKTUR CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57c: MATHEMATICAL BOLD FRAKTUR CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57d: MATHEMATICAL BOLD FRAKTUR CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57e: MATHEMATICAL BOLD FRAKTUR CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d57f: MATHEMATICAL BOLD FRAKTUR CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d580: MATHEMATICAL BOLD FRAKTUR CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d581: MATHEMATICAL BOLD FRAKTUR CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d582: MATHEMATICAL BOLD FRAKTUR CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d583: MATHEMATICAL BOLD FRAKTUR CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d584: MATHEMATICAL BOLD FRAKTUR CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d585: MATHEMATICAL BOLD FRAKTUR CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d586: MATHEMATICAL BOLD FRAKTUR SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d587: MATHEMATICAL BOLD FRAKTUR SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d588: MATHEMATICAL BOLD FRAKTUR SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d589: MATHEMATICAL BOLD FRAKTUR SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58a: MATHEMATICAL BOLD FRAKTUR SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58b: MATHEMATICAL BOLD FRAKTUR SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58c: MATHEMATICAL BOLD FRAKTUR SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58d: MATHEMATICAL BOLD FRAKTUR SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58e: MATHEMATICAL BOLD FRAKTUR SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d58f: MATHEMATICAL BOLD FRAKTUR SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d590: MATHEMATICAL BOLD FRAKTUR SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d591: MATHEMATICAL BOLD FRAKTUR SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d592: MATHEMATICAL BOLD FRAKTUR SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d593: MATHEMATICAL BOLD FRAKTUR SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d594: MATHEMATICAL BOLD FRAKTUR SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d595: MATHEMATICAL BOLD FRAKTUR SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d596: MATHEMATICAL BOLD FRAKTUR SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d597: MATHEMATICAL BOLD FRAKTUR SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d598: MATHEMATICAL BOLD FRAKTUR SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d599: MATHEMATICAL BOLD FRAKTUR SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59a: MATHEMATICAL BOLD FRAKTUR SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59b: MATHEMATICAL BOLD FRAKTUR SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59c: MATHEMATICAL BOLD FRAKTUR SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59d: MATHEMATICAL BOLD FRAKTUR SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59e: MATHEMATICAL BOLD FRAKTUR SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d59f: MATHEMATICAL BOLD FRAKTUR SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a0: MATHEMATICAL SANS-SERIF CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a1: MATHEMATICAL SANS-SERIF CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a2: MATHEMATICAL SANS-SERIF CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a3: MATHEMATICAL SANS-SERIF CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a4: MATHEMATICAL SANS-SERIF CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a5: MATHEMATICAL SANS-SERIF CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a6: MATHEMATICAL SANS-SERIF CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a7: MATHEMATICAL SANS-SERIF CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a8: MATHEMATICAL SANS-SERIF CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5a9: MATHEMATICAL SANS-SERIF CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5aa: MATHEMATICAL SANS-SERIF CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ab: MATHEMATICAL SANS-SERIF CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ac: MATHEMATICAL SANS-SERIF CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ad: MATHEMATICAL SANS-SERIF CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ae: MATHEMATICAL SANS-SERIF CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5af: MATHEMATICAL SANS-SERIF CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b0: MATHEMATICAL SANS-SERIF CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b1: MATHEMATICAL SANS-SERIF CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b2: MATHEMATICAL SANS-SERIF CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b3: MATHEMATICAL SANS-SERIF CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b4: MATHEMATICAL SANS-SERIF CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b5: MATHEMATICAL SANS-SERIF CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b6: MATHEMATICAL SANS-SERIF CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b7: MATHEMATICAL SANS-SERIF CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b8: MATHEMATICAL SANS-SERIF CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5b9: MATHEMATICAL SANS-SERIF CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ba: MATHEMATICAL SANS-SERIF SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bb: MATHEMATICAL SANS-SERIF SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bc: MATHEMATICAL SANS-SERIF SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bd: MATHEMATICAL SANS-SERIF SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5be: MATHEMATICAL SANS-SERIF SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5bf: MATHEMATICAL SANS-SERIF SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c0: MATHEMATICAL SANS-SERIF SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c1: MATHEMATICAL SANS-SERIF SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c2: MATHEMATICAL SANS-SERIF SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c3: MATHEMATICAL SANS-SERIF SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c4: MATHEMATICAL SANS-SERIF SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c5: MATHEMATICAL SANS-SERIF SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c6: MATHEMATICAL SANS-SERIF SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c7: MATHEMATICAL SANS-SERIF SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c8: MATHEMATICAL SANS-SERIF SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5c9: MATHEMATICAL SANS-SERIF SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ca: MATHEMATICAL SANS-SERIF SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cb: MATHEMATICAL SANS-SERIF SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cc: MATHEMATICAL SANS-SERIF SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cd: MATHEMATICAL SANS-SERIF SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ce: MATHEMATICAL SANS-SERIF SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5cf: MATHEMATICAL SANS-SERIF SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d0: MATHEMATICAL SANS-SERIF SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d1: MATHEMATICAL SANS-SERIF SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d2: MATHEMATICAL SANS-SERIF SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5d3: MATHEMATICAL SANS-SERIF SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d4: MATHEMATICAL SANS-SERIF BOLD CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d5: MATHEMATICAL SANS-SERIF BOLD CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d6: MATHEMATICAL SANS-SERIF BOLD CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d7: MATHEMATICAL SANS-SERIF BOLD CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d8: MATHEMATICAL SANS-SERIF BOLD CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5d9: MATHEMATICAL SANS-SERIF BOLD CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5da: MATHEMATICAL SANS-SERIF BOLD CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5db: MATHEMATICAL SANS-SERIF BOLD CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dc: MATHEMATICAL SANS-SERIF BOLD CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5dd: MATHEMATICAL SANS-SERIF BOLD CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5de: MATHEMATICAL SANS-SERIF BOLD CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5df: MATHEMATICAL SANS-SERIF BOLD CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e0: MATHEMATICAL SANS-SERIF BOLD CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e1: MATHEMATICAL SANS-SERIF BOLD CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e2: MATHEMATICAL SANS-SERIF BOLD CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e3: MATHEMATICAL SANS-SERIF BOLD CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e4: MATHEMATICAL SANS-SERIF BOLD CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e5: MATHEMATICAL SANS-SERIF BOLD CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e6: MATHEMATICAL SANS-SERIF BOLD CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e7: MATHEMATICAL SANS-SERIF BOLD CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e8: MATHEMATICAL SANS-SERIF BOLD CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5e9: MATHEMATICAL SANS-SERIF BOLD CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ea: MATHEMATICAL SANS-SERIF BOLD CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5eb: MATHEMATICAL SANS-SERIF BOLD CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ec: MATHEMATICAL SANS-SERIF BOLD CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d5ed: MATHEMATICAL SANS-SERIF BOLD CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ee: MATHEMATICAL SANS-SERIF BOLD SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ef: MATHEMATICAL SANS-SERIF BOLD SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f0: MATHEMATICAL SANS-SERIF BOLD SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f1: MATHEMATICAL SANS-SERIF BOLD SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f2: MATHEMATICAL SANS-SERIF BOLD SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f3: MATHEMATICAL SANS-SERIF BOLD SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f4: MATHEMATICAL SANS-SERIF BOLD SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f5: MATHEMATICAL SANS-SERIF BOLD SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f6: MATHEMATICAL SANS-SERIF BOLD SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f7: MATHEMATICAL SANS-SERIF BOLD SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f8: MATHEMATICAL SANS-SERIF BOLD SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5f9: MATHEMATICAL SANS-SERIF BOLD SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fa: MATHEMATICAL SANS-SERIF BOLD SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fb: MATHEMATICAL SANS-SERIF BOLD SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fc: MATHEMATICAL SANS-SERIF BOLD SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fd: MATHEMATICAL SANS-SERIF BOLD SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5fe: MATHEMATICAL SANS-SERIF BOLD SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d5ff: MATHEMATICAL SANS-SERIF BOLD SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d600: MATHEMATICAL SANS-SERIF BOLD SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d601: MATHEMATICAL SANS-SERIF BOLD SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d602: MATHEMATICAL SANS-SERIF BOLD SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d603: MATHEMATICAL SANS-SERIF BOLD SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d604: MATHEMATICAL SANS-SERIF BOLD SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d605: MATHEMATICAL SANS-SERIF BOLD SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d606: MATHEMATICAL SANS-SERIF BOLD SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d607: MATHEMATICAL SANS-SERIF BOLD SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d608: MATHEMATICAL SANS-SERIF ITALIC CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d609: MATHEMATICAL SANS-SERIF ITALIC CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d60f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d610: MATHEMATICAL SANS-SERIF ITALIC CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d611: MATHEMATICAL SANS-SERIF ITALIC CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d612: MATHEMATICAL SANS-SERIF ITALIC CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d613: MATHEMATICAL SANS-SERIF ITALIC CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d614: MATHEMATICAL SANS-SERIF ITALIC CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d615: MATHEMATICAL SANS-SERIF ITALIC CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d616: MATHEMATICAL SANS-SERIF ITALIC CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d617: MATHEMATICAL SANS-SERIF ITALIC CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d618: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d619: MATHEMATICAL SANS-SERIF ITALIC CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61a: MATHEMATICAL SANS-SERIF ITALIC CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61b: MATHEMATICAL SANS-SERIF ITALIC CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61c: MATHEMATICAL SANS-SERIF ITALIC CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61d: MATHEMATICAL SANS-SERIF ITALIC CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61e: MATHEMATICAL SANS-SERIF ITALIC CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d61f: MATHEMATICAL SANS-SERIF ITALIC CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d620: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d621: MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d622: MATHEMATICAL SANS-SERIF ITALIC SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d623: MATHEMATICAL SANS-SERIF ITALIC SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d624: MATHEMATICAL SANS-SERIF ITALIC SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d625: MATHEMATICAL SANS-SERIF ITALIC SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d626: MATHEMATICAL SANS-SERIF ITALIC SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d627: MATHEMATICAL SANS-SERIF ITALIC SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d628: MATHEMATICAL SANS-SERIF ITALIC SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d629: MATHEMATICAL SANS-SERIF ITALIC SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62a: MATHEMATICAL SANS-SERIF ITALIC SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62b: MATHEMATICAL SANS-SERIF ITALIC SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62c: MATHEMATICAL SANS-SERIF ITALIC SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62d: MATHEMATICAL SANS-SERIF ITALIC SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62e: MATHEMATICAL SANS-SERIF ITALIC SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d62f: MATHEMATICAL SANS-SERIF ITALIC SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d630: MATHEMATICAL SANS-SERIF ITALIC SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d631: MATHEMATICAL SANS-SERIF ITALIC SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d632: MATHEMATICAL SANS-SERIF ITALIC SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d633: MATHEMATICAL SANS-SERIF ITALIC SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d634: MATHEMATICAL SANS-SERIF ITALIC SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d635: MATHEMATICAL SANS-SERIF ITALIC SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d636: MATHEMATICAL SANS-SERIF ITALIC SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d637: MATHEMATICAL SANS-SERIF ITALIC SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d638: MATHEMATICAL SANS-SERIF ITALIC SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d639: MATHEMATICAL SANS-SERIF ITALIC SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63a: MATHEMATICAL SANS-SERIF ITALIC SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d63b: MATHEMATICAL SANS-SERIF ITALIC SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d63f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d640: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d641: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d642: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d643: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d644: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d645: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d646: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d647: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d648: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d649: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d64f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d650: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d651: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d652: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d653: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d654: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d655: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d656: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d657: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d658: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d659: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d65f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d660: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d661: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d662: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d663: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d664: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d665: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d666: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d667: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d668: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d669: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66a: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66b: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66c: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66d: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66e: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d66f: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d670: MATHEMATICAL MONOSPACE CAPITAL A*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d671: MATHEMATICAL MONOSPACE CAPITAL B*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d672: MATHEMATICAL MONOSPACE CAPITAL C*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d673: MATHEMATICAL MONOSPACE CAPITAL D*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d674: MATHEMATICAL MONOSPACE CAPITAL E*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d675: MATHEMATICAL MONOSPACE CAPITAL F*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d676: MATHEMATICAL MONOSPACE CAPITAL G*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d677: MATHEMATICAL MONOSPACE CAPITAL H*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d678: MATHEMATICAL MONOSPACE CAPITAL I*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d679: MATHEMATICAL MONOSPACE CAPITAL J*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67a: MATHEMATICAL MONOSPACE CAPITAL K*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67b: MATHEMATICAL MONOSPACE CAPITAL L*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67c: MATHEMATICAL MONOSPACE CAPITAL M*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67d: MATHEMATICAL MONOSPACE CAPITAL N*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67e: MATHEMATICAL MONOSPACE CAPITAL O*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d67f: MATHEMATICAL MONOSPACE CAPITAL P*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d680: MATHEMATICAL MONOSPACE CAPITAL Q*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d681: MATHEMATICAL MONOSPACE CAPITAL R*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d682: MATHEMATICAL MONOSPACE CAPITAL S*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d683: MATHEMATICAL MONOSPACE CAPITAL T*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d684: MATHEMATICAL MONOSPACE CAPITAL U*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d685: MATHEMATICAL MONOSPACE CAPITAL V*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d686: MATHEMATICAL MONOSPACE CAPITAL W*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d687: MATHEMATICAL MONOSPACE CAPITAL X*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d688: MATHEMATICAL MONOSPACE CAPITAL Y*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d689: MATHEMATICAL MONOSPACE CAPITAL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68a: MATHEMATICAL MONOSPACE SMALL A*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68b: MATHEMATICAL MONOSPACE SMALL B*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68c: MATHEMATICAL MONOSPACE SMALL C*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68d: MATHEMATICAL MONOSPACE SMALL D*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68e: MATHEMATICAL MONOSPACE SMALL E*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d68f: MATHEMATICAL MONOSPACE SMALL F*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d690: MATHEMATICAL MONOSPACE SMALL G*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d691: MATHEMATICAL MONOSPACE SMALL H*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d692: MATHEMATICAL MONOSPACE SMALL I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d693: MATHEMATICAL MONOSPACE SMALL J*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d694: MATHEMATICAL MONOSPACE SMALL K*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d695: MATHEMATICAL MONOSPACE SMALL L*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d696: MATHEMATICAL MONOSPACE SMALL M*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d697: MATHEMATICAL MONOSPACE SMALL N*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d698: MATHEMATICAL MONOSPACE SMALL O*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d699: MATHEMATICAL MONOSPACE SMALL P*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69a: MATHEMATICAL MONOSPACE SMALL Q*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69b: MATHEMATICAL MONOSPACE SMALL R*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69c: MATHEMATICAL MONOSPACE SMALL S*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69d: MATHEMATICAL MONOSPACE SMALL T*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69e: MATHEMATICAL MONOSPACE SMALL U*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d69f: MATHEMATICAL MONOSPACE SMALL V*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a0: MATHEMATICAL MONOSPACE SMALL W*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a1: MATHEMATICAL MONOSPACE SMALL X*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a2: MATHEMATICAL MONOSPACE SMALL Y*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a3: MATHEMATICAL MONOSPACE SMALL Z*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a4: MATHEMATICAL ITALIC SMALL DOTLESS I*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6a5: MATHEMATICAL ITALIC SMALL DOTLESS J*/
-                                                     0, /* U+01d6a6: */
-                                                     0, /* U+01d6a7: */
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a8: MATHEMATICAL BOLD CAPITAL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6a9: MATHEMATICAL BOLD CAPITAL BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6aa: MATHEMATICAL BOLD CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ab: MATHEMATICAL BOLD CAPITAL DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ac: MATHEMATICAL BOLD CAPITAL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ad: MATHEMATICAL BOLD CAPITAL ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ae: MATHEMATICAL BOLD CAPITAL ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6af: MATHEMATICAL BOLD CAPITAL THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b0: MATHEMATICAL BOLD CAPITAL IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b1: MATHEMATICAL BOLD CAPITAL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b2: MATHEMATICAL BOLD CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b3: MATHEMATICAL BOLD CAPITAL MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b4: MATHEMATICAL BOLD CAPITAL NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b5: MATHEMATICAL BOLD CAPITAL XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b6: MATHEMATICAL BOLD CAPITAL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b7: MATHEMATICAL BOLD CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b8: MATHEMATICAL BOLD CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6b9: MATHEMATICAL BOLD CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ba: MATHEMATICAL BOLD CAPITAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bb: MATHEMATICAL BOLD CAPITAL TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bc: MATHEMATICAL BOLD CAPITAL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bd: MATHEMATICAL BOLD CAPITAL PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6be: MATHEMATICAL BOLD CAPITAL CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6bf: MATHEMATICAL BOLD CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6c0: MATHEMATICAL BOLD CAPITAL OMEGA*/
-                                                     0, /* U+01d6c1: MATHEMATICAL BOLD NABLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c2: MATHEMATICAL BOLD SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c3: MATHEMATICAL BOLD SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c4: MATHEMATICAL BOLD SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c5: MATHEMATICAL BOLD SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c6: MATHEMATICAL BOLD SMALL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c7: MATHEMATICAL BOLD SMALL ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c8: MATHEMATICAL BOLD SMALL ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6c9: MATHEMATICAL BOLD SMALL THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ca: MATHEMATICAL BOLD SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cb: MATHEMATICAL BOLD SMALL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cc: MATHEMATICAL BOLD SMALL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cd: MATHEMATICAL BOLD SMALL MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ce: MATHEMATICAL BOLD SMALL NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6cf: MATHEMATICAL BOLD SMALL XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d0: MATHEMATICAL BOLD SMALL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d1: MATHEMATICAL BOLD SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d2: MATHEMATICAL BOLD SMALL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d3: MATHEMATICAL BOLD SMALL FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d4: MATHEMATICAL BOLD SMALL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d5: MATHEMATICAL BOLD SMALL TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d6: MATHEMATICAL BOLD SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d7: MATHEMATICAL BOLD SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d8: MATHEMATICAL BOLD SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6d9: MATHEMATICAL BOLD SMALL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6da: MATHEMATICAL BOLD SMALL OMEGA*/
-                                                     0, /* U+01d6db: MATHEMATICAL BOLD PARTIAL DIFFERENTIAL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dc: MATHEMATICAL BOLD EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6dd: MATHEMATICAL BOLD THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6de: MATHEMATICAL BOLD KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6df: MATHEMATICAL BOLD PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e0: MATHEMATICAL BOLD RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6e1: MATHEMATICAL BOLD PI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e2: MATHEMATICAL ITALIC CAPITAL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e3: MATHEMATICAL ITALIC CAPITAL BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e4: MATHEMATICAL ITALIC CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e5: MATHEMATICAL ITALIC CAPITAL DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e6: MATHEMATICAL ITALIC CAPITAL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e7: MATHEMATICAL ITALIC CAPITAL ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e8: MATHEMATICAL ITALIC CAPITAL ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6e9: MATHEMATICAL ITALIC CAPITAL THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ea: MATHEMATICAL ITALIC CAPITAL IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6eb: MATHEMATICAL ITALIC CAPITAL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ec: MATHEMATICAL ITALIC CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ed: MATHEMATICAL ITALIC CAPITAL MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ee: MATHEMATICAL ITALIC CAPITAL NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6ef: MATHEMATICAL ITALIC CAPITAL XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f0: MATHEMATICAL ITALIC CAPITAL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f1: MATHEMATICAL ITALIC CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f2: MATHEMATICAL ITALIC CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f3: MATHEMATICAL ITALIC CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f4: MATHEMATICAL ITALIC CAPITAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f5: MATHEMATICAL ITALIC CAPITAL TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f6: MATHEMATICAL ITALIC CAPITAL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f7: MATHEMATICAL ITALIC CAPITAL PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f8: MATHEMATICAL ITALIC CAPITAL CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6f9: MATHEMATICAL ITALIC CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d6fa: MATHEMATICAL ITALIC CAPITAL OMEGA*/
-                                                     0, /* U+01d6fb: MATHEMATICAL ITALIC NABLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fc: MATHEMATICAL ITALIC SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fd: MATHEMATICAL ITALIC SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6fe: MATHEMATICAL ITALIC SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d6ff: MATHEMATICAL ITALIC SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d700: MATHEMATICAL ITALIC SMALL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d701: MATHEMATICAL ITALIC SMALL ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d702: MATHEMATICAL ITALIC SMALL ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d703: MATHEMATICAL ITALIC SMALL THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d704: MATHEMATICAL ITALIC SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d705: MATHEMATICAL ITALIC SMALL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d706: MATHEMATICAL ITALIC SMALL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d707: MATHEMATICAL ITALIC SMALL MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d708: MATHEMATICAL ITALIC SMALL NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d709: MATHEMATICAL ITALIC SMALL XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70a: MATHEMATICAL ITALIC SMALL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70b: MATHEMATICAL ITALIC SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70c: MATHEMATICAL ITALIC SMALL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70d: MATHEMATICAL ITALIC SMALL FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70e: MATHEMATICAL ITALIC SMALL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d70f: MATHEMATICAL ITALIC SMALL TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d710: MATHEMATICAL ITALIC SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d711: MATHEMATICAL ITALIC SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d712: MATHEMATICAL ITALIC SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d713: MATHEMATICAL ITALIC SMALL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d714: MATHEMATICAL ITALIC SMALL OMEGA*/
-                                                     0, /* U+01d715: MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d716: MATHEMATICAL ITALIC EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d717: MATHEMATICAL ITALIC THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d718: MATHEMATICAL ITALIC KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d719: MATHEMATICAL ITALIC PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71a: MATHEMATICAL ITALIC RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d71b: MATHEMATICAL ITALIC PI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71c: MATHEMATICAL BOLD ITALIC CAPITAL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71d: MATHEMATICAL BOLD ITALIC CAPITAL BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71e: MATHEMATICAL BOLD ITALIC CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d71f: MATHEMATICAL BOLD ITALIC CAPITAL DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d720: MATHEMATICAL BOLD ITALIC CAPITAL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d721: MATHEMATICAL BOLD ITALIC CAPITAL ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d722: MATHEMATICAL BOLD ITALIC CAPITAL ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d723: MATHEMATICAL BOLD ITALIC CAPITAL THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d724: MATHEMATICAL BOLD ITALIC CAPITAL IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d725: MATHEMATICAL BOLD ITALIC CAPITAL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d726: MATHEMATICAL BOLD ITALIC CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d727: MATHEMATICAL BOLD ITALIC CAPITAL MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d728: MATHEMATICAL BOLD ITALIC CAPITAL NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d729: MATHEMATICAL BOLD ITALIC CAPITAL XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72a: MATHEMATICAL BOLD ITALIC CAPITAL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72b: MATHEMATICAL BOLD ITALIC CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72c: MATHEMATICAL BOLD ITALIC CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72d: MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72e: MATHEMATICAL BOLD ITALIC CAPITAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d72f: MATHEMATICAL BOLD ITALIC CAPITAL TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d730: MATHEMATICAL BOLD ITALIC CAPITAL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d731: MATHEMATICAL BOLD ITALIC CAPITAL PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d732: MATHEMATICAL BOLD ITALIC CAPITAL CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d733: MATHEMATICAL BOLD ITALIC CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d734: MATHEMATICAL BOLD ITALIC CAPITAL OMEGA*/
-                                                     0, /* U+01d735: MATHEMATICAL BOLD ITALIC NABLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d736: MATHEMATICAL BOLD ITALIC SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d737: MATHEMATICAL BOLD ITALIC SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d738: MATHEMATICAL BOLD ITALIC SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d739: MATHEMATICAL BOLD ITALIC SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73a: MATHEMATICAL BOLD ITALIC SMALL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73b: MATHEMATICAL BOLD ITALIC SMALL ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73c: MATHEMATICAL BOLD ITALIC SMALL ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73d: MATHEMATICAL BOLD ITALIC SMALL THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73e: MATHEMATICAL BOLD ITALIC SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d73f: MATHEMATICAL BOLD ITALIC SMALL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d740: MATHEMATICAL BOLD ITALIC SMALL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d741: MATHEMATICAL BOLD ITALIC SMALL MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d742: MATHEMATICAL BOLD ITALIC SMALL NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d743: MATHEMATICAL BOLD ITALIC SMALL XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d744: MATHEMATICAL BOLD ITALIC SMALL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d745: MATHEMATICAL BOLD ITALIC SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d746: MATHEMATICAL BOLD ITALIC SMALL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d747: MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d748: MATHEMATICAL BOLD ITALIC SMALL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d749: MATHEMATICAL BOLD ITALIC SMALL TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74a: MATHEMATICAL BOLD ITALIC SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74b: MATHEMATICAL BOLD ITALIC SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74c: MATHEMATICAL BOLD ITALIC SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74d: MATHEMATICAL BOLD ITALIC SMALL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d74e: MATHEMATICAL BOLD ITALIC SMALL OMEGA*/
-                                                     0, /* U+01d74f: MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d750: MATHEMATICAL BOLD ITALIC EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d751: MATHEMATICAL BOLD ITALIC THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d752: MATHEMATICAL BOLD ITALIC KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d753: MATHEMATICAL BOLD ITALIC PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d754: MATHEMATICAL BOLD ITALIC RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d755: MATHEMATICAL BOLD ITALIC PI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d756: MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d757: MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d758: MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d759: MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75a: MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75b: MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75c: MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75d: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75e: MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d75f: MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d760: MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d761: MATHEMATICAL SANS-SERIF BOLD CAPITAL MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d762: MATHEMATICAL SANS-SERIF BOLD CAPITAL NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d763: MATHEMATICAL SANS-SERIF BOLD CAPITAL XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d764: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d765: MATHEMATICAL SANS-SERIF BOLD CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d766: MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d767: MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d768: MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d769: MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76a: MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76b: MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76c: MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76d: MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d76e: MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA*/
-                                                     0, /* U+01d76f: MATHEMATICAL SANS-SERIF BOLD NABLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d770: MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d771: MATHEMATICAL SANS-SERIF BOLD SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d772: MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d773: MATHEMATICAL SANS-SERIF BOLD SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d774: MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d775: MATHEMATICAL SANS-SERIF BOLD SMALL ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d776: MATHEMATICAL SANS-SERIF BOLD SMALL ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d777: MATHEMATICAL SANS-SERIF BOLD SMALL THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d778: MATHEMATICAL SANS-SERIF BOLD SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d779: MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77a: MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77b: MATHEMATICAL SANS-SERIF BOLD SMALL MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77c: MATHEMATICAL SANS-SERIF BOLD SMALL NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77d: MATHEMATICAL SANS-SERIF BOLD SMALL XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77e: MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d77f: MATHEMATICAL SANS-SERIF BOLD SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d780: MATHEMATICAL SANS-SERIF BOLD SMALL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d781: MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d782: MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d783: MATHEMATICAL SANS-SERIF BOLD SMALL TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d784: MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d785: MATHEMATICAL SANS-SERIF BOLD SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d786: MATHEMATICAL SANS-SERIF BOLD SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d787: MATHEMATICAL SANS-SERIF BOLD SMALL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d788: MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA*/
-                                                     0, /* U+01d789: MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78a: MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78b: MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78c: MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78d: MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78e: MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d78f: MATHEMATICAL SANS-SERIF BOLD PI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d790: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d791: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d792: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d793: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d794: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d795: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d796: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d797: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d798: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d799: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79a: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79b: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79c: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79d: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79e: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d79f: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a0: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a1: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a2: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a3: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a4: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a5: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a6: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a7: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI*/
-                             RTUNI_ALPHA | RTUNI_UPPER, /* U+01d7a8: MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA*/
-                                                     0, /* U+01d7a9: MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7aa: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ab: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ac: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ad: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ae: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7af: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b3: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b4: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b5: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b6: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b7: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b8: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7b9: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7ba: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bb: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bc: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bd: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7be: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7bf: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c0: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c1: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c2: MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA*/
-                                                     0, /* U+01d7c3: MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c4: MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c5: MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c6: MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c7: MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c8: MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL*/
-                             RTUNI_ALPHA | RTUNI_LOWER, /* U+01d7c9: MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL*/
-                                                     0, /* U+01d7ca: */
-                                                     0, /* U+01d7cb: */
-                                                     0, /* U+01d7cc: */
-                                                     0, /* U+01d7cd: */
-                                          RTUNI_DDIGIT, /* U+01d7ce: MATHEMATICAL BOLD DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+01d7cf: MATHEMATICAL BOLD DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+01d7d0: MATHEMATICAL BOLD DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+01d7d1: MATHEMATICAL BOLD DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+01d7d2: MATHEMATICAL BOLD DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+01d7d3: MATHEMATICAL BOLD DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+01d7d4: MATHEMATICAL BOLD DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+01d7d5: MATHEMATICAL BOLD DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+01d7d6: MATHEMATICAL BOLD DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+01d7d7: MATHEMATICAL BOLD DIGIT NINE*/
-                                          RTUNI_DDIGIT, /* U+01d7d8: MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+01d7d9: MATHEMATICAL DOUBLE-STRUCK DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+01d7da: MATHEMATICAL DOUBLE-STRUCK DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+01d7db: MATHEMATICAL DOUBLE-STRUCK DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+01d7dc: MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+01d7dd: MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+01d7de: MATHEMATICAL DOUBLE-STRUCK DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+01d7df: MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+01d7e0: MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+01d7e1: MATHEMATICAL DOUBLE-STRUCK DIGIT NINE*/
-                                          RTUNI_DDIGIT, /* U+01d7e2: MATHEMATICAL SANS-SERIF DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+01d7e3: MATHEMATICAL SANS-SERIF DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+01d7e4: MATHEMATICAL SANS-SERIF DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+01d7e5: MATHEMATICAL SANS-SERIF DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+01d7e6: MATHEMATICAL SANS-SERIF DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+01d7e7: MATHEMATICAL SANS-SERIF DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+01d7e8: MATHEMATICAL SANS-SERIF DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+01d7e9: MATHEMATICAL SANS-SERIF DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+01d7ea: MATHEMATICAL SANS-SERIF DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+01d7eb: MATHEMATICAL SANS-SERIF DIGIT NINE*/
-                                          RTUNI_DDIGIT, /* U+01d7ec: MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+01d7ed: MATHEMATICAL SANS-SERIF BOLD DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+01d7ee: MATHEMATICAL SANS-SERIF BOLD DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+01d7ef: MATHEMATICAL SANS-SERIF BOLD DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+01d7f0: MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+01d7f1: MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+01d7f2: MATHEMATICAL SANS-SERIF BOLD DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+01d7f3: MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+01d7f4: MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+01d7f5: MATHEMATICAL SANS-SERIF BOLD DIGIT NINE*/
-                                          RTUNI_DDIGIT, /* U+01d7f6: MATHEMATICAL MONOSPACE DIGIT ZERO*/
-                                          RTUNI_DDIGIT, /* U+01d7f7: MATHEMATICAL MONOSPACE DIGIT ONE*/
-                                          RTUNI_DDIGIT, /* U+01d7f8: MATHEMATICAL MONOSPACE DIGIT TWO*/
-                                          RTUNI_DDIGIT, /* U+01d7f9: MATHEMATICAL MONOSPACE DIGIT THREE*/
-                                          RTUNI_DDIGIT, /* U+01d7fa: MATHEMATICAL MONOSPACE DIGIT FOUR*/
-                                          RTUNI_DDIGIT, /* U+01d7fb: MATHEMATICAL MONOSPACE DIGIT FIVE*/
-                                          RTUNI_DDIGIT, /* U+01d7fc: MATHEMATICAL MONOSPACE DIGIT SIX*/
-                                          RTUNI_DDIGIT, /* U+01d7fd: MATHEMATICAL MONOSPACE DIGIT SEVEN*/
-                                          RTUNI_DDIGIT, /* U+01d7fe: MATHEMATICAL MONOSPACE DIGIT EIGHT*/
-                                          RTUNI_DDIGIT, /* U+01d7ff: MATHEMATICAL MONOSPACE DIGIT NINE*/
-};
-
-static const uint8_t g_afRTUniFlags0x020000[] =
-{
-                                           RTUNI_ALPHA, /* U+020000: <CJK Ideograph Extension B, First>*/
-};
-
-static const uint8_t g_afRTUniFlags0x02a6d6[] =
-{
-                                           RTUNI_ALPHA, /* U+02a6d6: <CJK Ideograph Extension B, Last>*/
-};
-
-static const uint8_t g_afRTUniFlags0x02f800[] =
-{
-                                           RTUNI_ALPHA, /* U+02f800: CJK COMPATIBILITY IDEOGRAPH-2F800*/
-                                           RTUNI_ALPHA, /* U+02f801: CJK COMPATIBILITY IDEOGRAPH-2F801*/
-                                           RTUNI_ALPHA, /* U+02f802: CJK COMPATIBILITY IDEOGRAPH-2F802*/
-                                           RTUNI_ALPHA, /* U+02f803: CJK COMPATIBILITY IDEOGRAPH-2F803*/
-                                           RTUNI_ALPHA, /* U+02f804: CJK COMPATIBILITY IDEOGRAPH-2F804*/
-                                           RTUNI_ALPHA, /* U+02f805: CJK COMPATIBILITY IDEOGRAPH-2F805*/
-                                           RTUNI_ALPHA, /* U+02f806: CJK COMPATIBILITY IDEOGRAPH-2F806*/
-                                           RTUNI_ALPHA, /* U+02f807: CJK COMPATIBILITY IDEOGRAPH-2F807*/
-                                           RTUNI_ALPHA, /* U+02f808: CJK COMPATIBILITY IDEOGRAPH-2F808*/
-                                           RTUNI_ALPHA, /* U+02f809: CJK COMPATIBILITY IDEOGRAPH-2F809*/
-                                           RTUNI_ALPHA, /* U+02f80a: CJK COMPATIBILITY IDEOGRAPH-2F80A*/
-                                           RTUNI_ALPHA, /* U+02f80b: CJK COMPATIBILITY IDEOGRAPH-2F80B*/
-                                           RTUNI_ALPHA, /* U+02f80c: CJK COMPATIBILITY IDEOGRAPH-2F80C*/
-                                           RTUNI_ALPHA, /* U+02f80d: CJK COMPATIBILITY IDEOGRAPH-2F80D*/
-                                           RTUNI_ALPHA, /* U+02f80e: CJK COMPATIBILITY IDEOGRAPH-2F80E*/
-                                           RTUNI_ALPHA, /* U+02f80f: CJK COMPATIBILITY IDEOGRAPH-2F80F*/
-                                           RTUNI_ALPHA, /* U+02f810: CJK COMPATIBILITY IDEOGRAPH-2F810*/
-                                           RTUNI_ALPHA, /* U+02f811: CJK COMPATIBILITY IDEOGRAPH-2F811*/
-                                           RTUNI_ALPHA, /* U+02f812: CJK COMPATIBILITY IDEOGRAPH-2F812*/
-                                           RTUNI_ALPHA, /* U+02f813: CJK COMPATIBILITY IDEOGRAPH-2F813*/
-                                           RTUNI_ALPHA, /* U+02f814: CJK COMPATIBILITY IDEOGRAPH-2F814*/
-                                           RTUNI_ALPHA, /* U+02f815: CJK COMPATIBILITY IDEOGRAPH-2F815*/
-                                           RTUNI_ALPHA, /* U+02f816: CJK COMPATIBILITY IDEOGRAPH-2F816*/
-                                           RTUNI_ALPHA, /* U+02f817: CJK COMPATIBILITY IDEOGRAPH-2F817*/
-                                           RTUNI_ALPHA, /* U+02f818: CJK COMPATIBILITY IDEOGRAPH-2F818*/
-                                           RTUNI_ALPHA, /* U+02f819: CJK COMPATIBILITY IDEOGRAPH-2F819*/
-                                           RTUNI_ALPHA, /* U+02f81a: CJK COMPATIBILITY IDEOGRAPH-2F81A*/
-                                           RTUNI_ALPHA, /* U+02f81b: CJK COMPATIBILITY IDEOGRAPH-2F81B*/
-                                           RTUNI_ALPHA, /* U+02f81c: CJK COMPATIBILITY IDEOGRAPH-2F81C*/
-                                           RTUNI_ALPHA, /* U+02f81d: CJK COMPATIBILITY IDEOGRAPH-2F81D*/
-                                           RTUNI_ALPHA, /* U+02f81e: CJK COMPATIBILITY IDEOGRAPH-2F81E*/
-                                           RTUNI_ALPHA, /* U+02f81f: CJK COMPATIBILITY IDEOGRAPH-2F81F*/
-                                           RTUNI_ALPHA, /* U+02f820: CJK COMPATIBILITY IDEOGRAPH-2F820*/
-                                           RTUNI_ALPHA, /* U+02f821: CJK COMPATIBILITY IDEOGRAPH-2F821*/
-                                           RTUNI_ALPHA, /* U+02f822: CJK COMPATIBILITY IDEOGRAPH-2F822*/
-                                           RTUNI_ALPHA, /* U+02f823: CJK COMPATIBILITY IDEOGRAPH-2F823*/
-                                           RTUNI_ALPHA, /* U+02f824: CJK COMPATIBILITY IDEOGRAPH-2F824*/
-                                           RTUNI_ALPHA, /* U+02f825: CJK COMPATIBILITY IDEOGRAPH-2F825*/
-                                           RTUNI_ALPHA, /* U+02f826: CJK COMPATIBILITY IDEOGRAPH-2F826*/
-                                           RTUNI_ALPHA, /* U+02f827: CJK COMPATIBILITY IDEOGRAPH-2F827*/
-                                           RTUNI_ALPHA, /* U+02f828: CJK COMPATIBILITY IDEOGRAPH-2F828*/
-                                           RTUNI_ALPHA, /* U+02f829: CJK COMPATIBILITY IDEOGRAPH-2F829*/
-                                           RTUNI_ALPHA, /* U+02f82a: CJK COMPATIBILITY IDEOGRAPH-2F82A*/
-                                           RTUNI_ALPHA, /* U+02f82b: CJK COMPATIBILITY IDEOGRAPH-2F82B*/
-                                           RTUNI_ALPHA, /* U+02f82c: CJK COMPATIBILITY IDEOGRAPH-2F82C*/
-                                           RTUNI_ALPHA, /* U+02f82d: CJK COMPATIBILITY IDEOGRAPH-2F82D*/
-                                           RTUNI_ALPHA, /* U+02f82e: CJK COMPATIBILITY IDEOGRAPH-2F82E*/
-                                           RTUNI_ALPHA, /* U+02f82f: CJK COMPATIBILITY IDEOGRAPH-2F82F*/
-                                           RTUNI_ALPHA, /* U+02f830: CJK COMPATIBILITY IDEOGRAPH-2F830*/
-                                           RTUNI_ALPHA, /* U+02f831: CJK COMPATIBILITY IDEOGRAPH-2F831*/
-                                           RTUNI_ALPHA, /* U+02f832: CJK COMPATIBILITY IDEOGRAPH-2F832*/
-                                           RTUNI_ALPHA, /* U+02f833: CJK COMPATIBILITY IDEOGRAPH-2F833*/
-                                           RTUNI_ALPHA, /* U+02f834: CJK COMPATIBILITY IDEOGRAPH-2F834*/
-                                           RTUNI_ALPHA, /* U+02f835: CJK COMPATIBILITY IDEOGRAPH-2F835*/
-                                           RTUNI_ALPHA, /* U+02f836: CJK COMPATIBILITY IDEOGRAPH-2F836*/
-                                           RTUNI_ALPHA, /* U+02f837: CJK COMPATIBILITY IDEOGRAPH-2F837*/
-                                           RTUNI_ALPHA, /* U+02f838: CJK COMPATIBILITY IDEOGRAPH-2F838*/
-                                           RTUNI_ALPHA, /* U+02f839: CJK COMPATIBILITY IDEOGRAPH-2F839*/
-                                           RTUNI_ALPHA, /* U+02f83a: CJK COMPATIBILITY IDEOGRAPH-2F83A*/
-                                           RTUNI_ALPHA, /* U+02f83b: CJK COMPATIBILITY IDEOGRAPH-2F83B*/
-                                           RTUNI_ALPHA, /* U+02f83c: CJK COMPATIBILITY IDEOGRAPH-2F83C*/
-                                           RTUNI_ALPHA, /* U+02f83d: CJK COMPATIBILITY IDEOGRAPH-2F83D*/
-                                           RTUNI_ALPHA, /* U+02f83e: CJK COMPATIBILITY IDEOGRAPH-2F83E*/
-                                           RTUNI_ALPHA, /* U+02f83f: CJK COMPATIBILITY IDEOGRAPH-2F83F*/
-                                           RTUNI_ALPHA, /* U+02f840: CJK COMPATIBILITY IDEOGRAPH-2F840*/
-                                           RTUNI_ALPHA, /* U+02f841: CJK COMPATIBILITY IDEOGRAPH-2F841*/
-                                           RTUNI_ALPHA, /* U+02f842: CJK COMPATIBILITY IDEOGRAPH-2F842*/
-                                           RTUNI_ALPHA, /* U+02f843: CJK COMPATIBILITY IDEOGRAPH-2F843*/
-                                           RTUNI_ALPHA, /* U+02f844: CJK COMPATIBILITY IDEOGRAPH-2F844*/
-                                           RTUNI_ALPHA, /* U+02f845: CJK COMPATIBILITY IDEOGRAPH-2F845*/
-                                           RTUNI_ALPHA, /* U+02f846: CJK COMPATIBILITY IDEOGRAPH-2F846*/
-                                           RTUNI_ALPHA, /* U+02f847: CJK COMPATIBILITY IDEOGRAPH-2F847*/
-                                           RTUNI_ALPHA, /* U+02f848: CJK COMPATIBILITY IDEOGRAPH-2F848*/
-                                           RTUNI_ALPHA, /* U+02f849: CJK COMPATIBILITY IDEOGRAPH-2F849*/
-                                           RTUNI_ALPHA, /* U+02f84a: CJK COMPATIBILITY IDEOGRAPH-2F84A*/
-                                           RTUNI_ALPHA, /* U+02f84b: CJK COMPATIBILITY IDEOGRAPH-2F84B*/
-                                           RTUNI_ALPHA, /* U+02f84c: CJK COMPATIBILITY IDEOGRAPH-2F84C*/
-                                           RTUNI_ALPHA, /* U+02f84d: CJK COMPATIBILITY IDEOGRAPH-2F84D*/
-                                           RTUNI_ALPHA, /* U+02f84e: CJK COMPATIBILITY IDEOGRAPH-2F84E*/
-                                           RTUNI_ALPHA, /* U+02f84f: CJK COMPATIBILITY IDEOGRAPH-2F84F*/
-                                           RTUNI_ALPHA, /* U+02f850: CJK COMPATIBILITY IDEOGRAPH-2F850*/
-                                           RTUNI_ALPHA, /* U+02f851: CJK COMPATIBILITY IDEOGRAPH-2F851*/
-                                           RTUNI_ALPHA, /* U+02f852: CJK COMPATIBILITY IDEOGRAPH-2F852*/
-                                           RTUNI_ALPHA, /* U+02f853: CJK COMPATIBILITY IDEOGRAPH-2F853*/
-                                           RTUNI_ALPHA, /* U+02f854: CJK COMPATIBILITY IDEOGRAPH-2F854*/
-                                           RTUNI_ALPHA, /* U+02f855: CJK COMPATIBILITY IDEOGRAPH-2F855*/
-                                           RTUNI_ALPHA, /* U+02f856: CJK COMPATIBILITY IDEOGRAPH-2F856*/
-                                           RTUNI_ALPHA, /* U+02f857: CJK COMPATIBILITY IDEOGRAPH-2F857*/
-                                           RTUNI_ALPHA, /* U+02f858: CJK COMPATIBILITY IDEOGRAPH-2F858*/
-                                           RTUNI_ALPHA, /* U+02f859: CJK COMPATIBILITY IDEOGRAPH-2F859*/
-                                           RTUNI_ALPHA, /* U+02f85a: CJK COMPATIBILITY IDEOGRAPH-2F85A*/
-                                           RTUNI_ALPHA, /* U+02f85b: CJK COMPATIBILITY IDEOGRAPH-2F85B*/
-                                           RTUNI_ALPHA, /* U+02f85c: CJK COMPATIBILITY IDEOGRAPH-2F85C*/
-                                           RTUNI_ALPHA, /* U+02f85d: CJK COMPATIBILITY IDEOGRAPH-2F85D*/
-                                           RTUNI_ALPHA, /* U+02f85e: CJK COMPATIBILITY IDEOGRAPH-2F85E*/
-                                           RTUNI_ALPHA, /* U+02f85f: CJK COMPATIBILITY IDEOGRAPH-2F85F*/
-                                           RTUNI_ALPHA, /* U+02f860: CJK COMPATIBILITY IDEOGRAPH-2F860*/
-                                           RTUNI_ALPHA, /* U+02f861: CJK COMPATIBILITY IDEOGRAPH-2F861*/
-                                           RTUNI_ALPHA, /* U+02f862: CJK COMPATIBILITY IDEOGRAPH-2F862*/
-                                           RTUNI_ALPHA, /* U+02f863: CJK COMPATIBILITY IDEOGRAPH-2F863*/
-                                           RTUNI_ALPHA, /* U+02f864: CJK COMPATIBILITY IDEOGRAPH-2F864*/
-                                           RTUNI_ALPHA, /* U+02f865: CJK COMPATIBILITY IDEOGRAPH-2F865*/
-                                           RTUNI_ALPHA, /* U+02f866: CJK COMPATIBILITY IDEOGRAPH-2F866*/
-                                           RTUNI_ALPHA, /* U+02f867: CJK COMPATIBILITY IDEOGRAPH-2F867*/
-                                           RTUNI_ALPHA, /* U+02f868: CJK COMPATIBILITY IDEOGRAPH-2F868*/
-                                           RTUNI_ALPHA, /* U+02f869: CJK COMPATIBILITY IDEOGRAPH-2F869*/
-                                           RTUNI_ALPHA, /* U+02f86a: CJK COMPATIBILITY IDEOGRAPH-2F86A*/
-                                           RTUNI_ALPHA, /* U+02f86b: CJK COMPATIBILITY IDEOGRAPH-2F86B*/
-                                           RTUNI_ALPHA, /* U+02f86c: CJK COMPATIBILITY IDEOGRAPH-2F86C*/
-                                           RTUNI_ALPHA, /* U+02f86d: CJK COMPATIBILITY IDEOGRAPH-2F86D*/
-                                           RTUNI_ALPHA, /* U+02f86e: CJK COMPATIBILITY IDEOGRAPH-2F86E*/
-                                           RTUNI_ALPHA, /* U+02f86f: CJK COMPATIBILITY IDEOGRAPH-2F86F*/
-                                           RTUNI_ALPHA, /* U+02f870: CJK COMPATIBILITY IDEOGRAPH-2F870*/
-                                           RTUNI_ALPHA, /* U+02f871: CJK COMPATIBILITY IDEOGRAPH-2F871*/
-                                           RTUNI_ALPHA, /* U+02f872: CJK COMPATIBILITY IDEOGRAPH-2F872*/
-                                           RTUNI_ALPHA, /* U+02f873: CJK COMPATIBILITY IDEOGRAPH-2F873*/
-                                           RTUNI_ALPHA, /* U+02f874: CJK COMPATIBILITY IDEOGRAPH-2F874*/
-                                           RTUNI_ALPHA, /* U+02f875: CJK COMPATIBILITY IDEOGRAPH-2F875*/
-                                           RTUNI_ALPHA, /* U+02f876: CJK COMPATIBILITY IDEOGRAPH-2F876*/
-                                           RTUNI_ALPHA, /* U+02f877: CJK COMPATIBILITY IDEOGRAPH-2F877*/
-                                           RTUNI_ALPHA, /* U+02f878: CJK COMPATIBILITY IDEOGRAPH-2F878*/
-                                           RTUNI_ALPHA, /* U+02f879: CJK COMPATIBILITY IDEOGRAPH-2F879*/
-                                           RTUNI_ALPHA, /* U+02f87a: CJK COMPATIBILITY IDEOGRAPH-2F87A*/
-                                           RTUNI_ALPHA, /* U+02f87b: CJK COMPATIBILITY IDEOGRAPH-2F87B*/
-                                           RTUNI_ALPHA, /* U+02f87c: CJK COMPATIBILITY IDEOGRAPH-2F87C*/
-                                           RTUNI_ALPHA, /* U+02f87d: CJK COMPATIBILITY IDEOGRAPH-2F87D*/
-                                           RTUNI_ALPHA, /* U+02f87e: CJK COMPATIBILITY IDEOGRAPH-2F87E*/
-                                           RTUNI_ALPHA, /* U+02f87f: CJK COMPATIBILITY IDEOGRAPH-2F87F*/
-                                           RTUNI_ALPHA, /* U+02f880: CJK COMPATIBILITY IDEOGRAPH-2F880*/
-                                           RTUNI_ALPHA, /* U+02f881: CJK COMPATIBILITY IDEOGRAPH-2F881*/
-                                           RTUNI_ALPHA, /* U+02f882: CJK COMPATIBILITY IDEOGRAPH-2F882*/
-                                           RTUNI_ALPHA, /* U+02f883: CJK COMPATIBILITY IDEOGRAPH-2F883*/
-                                           RTUNI_ALPHA, /* U+02f884: CJK COMPATIBILITY IDEOGRAPH-2F884*/
-                                           RTUNI_ALPHA, /* U+02f885: CJK COMPATIBILITY IDEOGRAPH-2F885*/
-                                           RTUNI_ALPHA, /* U+02f886: CJK COMPATIBILITY IDEOGRAPH-2F886*/
-                                           RTUNI_ALPHA, /* U+02f887: CJK COMPATIBILITY IDEOGRAPH-2F887*/
-                                           RTUNI_ALPHA, /* U+02f888: CJK COMPATIBILITY IDEOGRAPH-2F888*/
-                                           RTUNI_ALPHA, /* U+02f889: CJK COMPATIBILITY IDEOGRAPH-2F889*/
-                                           RTUNI_ALPHA, /* U+02f88a: CJK COMPATIBILITY IDEOGRAPH-2F88A*/
-                                           RTUNI_ALPHA, /* U+02f88b: CJK COMPATIBILITY IDEOGRAPH-2F88B*/
-                                           RTUNI_ALPHA, /* U+02f88c: CJK COMPATIBILITY IDEOGRAPH-2F88C*/
-                                           RTUNI_ALPHA, /* U+02f88d: CJK COMPATIBILITY IDEOGRAPH-2F88D*/
-                                           RTUNI_ALPHA, /* U+02f88e: CJK COMPATIBILITY IDEOGRAPH-2F88E*/
-                                           RTUNI_ALPHA, /* U+02f88f: CJK COMPATIBILITY IDEOGRAPH-2F88F*/
-                                           RTUNI_ALPHA, /* U+02f890: CJK COMPATIBILITY IDEOGRAPH-2F890*/
-                                           RTUNI_ALPHA, /* U+02f891: CJK COMPATIBILITY IDEOGRAPH-2F891*/
-                                           RTUNI_ALPHA, /* U+02f892: CJK COMPATIBILITY IDEOGRAPH-2F892*/
-                                           RTUNI_ALPHA, /* U+02f893: CJK COMPATIBILITY IDEOGRAPH-2F893*/
-                                           RTUNI_ALPHA, /* U+02f894: CJK COMPATIBILITY IDEOGRAPH-2F894*/
-                                           RTUNI_ALPHA, /* U+02f895: CJK COMPATIBILITY IDEOGRAPH-2F895*/
-                                           RTUNI_ALPHA, /* U+02f896: CJK COMPATIBILITY IDEOGRAPH-2F896*/
-                                           RTUNI_ALPHA, /* U+02f897: CJK COMPATIBILITY IDEOGRAPH-2F897*/
-                                           RTUNI_ALPHA, /* U+02f898: CJK COMPATIBILITY IDEOGRAPH-2F898*/
-                                           RTUNI_ALPHA, /* U+02f899: CJK COMPATIBILITY IDEOGRAPH-2F899*/
-                                           RTUNI_ALPHA, /* U+02f89a: CJK COMPATIBILITY IDEOGRAPH-2F89A*/
-                                           RTUNI_ALPHA, /* U+02f89b: CJK COMPATIBILITY IDEOGRAPH-2F89B*/
-                                           RTUNI_ALPHA, /* U+02f89c: CJK COMPATIBILITY IDEOGRAPH-2F89C*/
-                                           RTUNI_ALPHA, /* U+02f89d: CJK COMPATIBILITY IDEOGRAPH-2F89D*/
-                                           RTUNI_ALPHA, /* U+02f89e: CJK COMPATIBILITY IDEOGRAPH-2F89E*/
-                                           RTUNI_ALPHA, /* U+02f89f: CJK COMPATIBILITY IDEOGRAPH-2F89F*/
-                                           RTUNI_ALPHA, /* U+02f8a0: CJK COMPATIBILITY IDEOGRAPH-2F8A0*/
-                                           RTUNI_ALPHA, /* U+02f8a1: CJK COMPATIBILITY IDEOGRAPH-2F8A1*/
-                                           RTUNI_ALPHA, /* U+02f8a2: CJK COMPATIBILITY IDEOGRAPH-2F8A2*/
-                                           RTUNI_ALPHA, /* U+02f8a3: CJK COMPATIBILITY IDEOGRAPH-2F8A3*/
-                                           RTUNI_ALPHA, /* U+02f8a4: CJK COMPATIBILITY IDEOGRAPH-2F8A4*/
-                                           RTUNI_ALPHA, /* U+02f8a5: CJK COMPATIBILITY IDEOGRAPH-2F8A5*/
-                                           RTUNI_ALPHA, /* U+02f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6*/
-                                           RTUNI_ALPHA, /* U+02f8a7: CJK COMPATIBILITY IDEOGRAPH-2F8A7*/
-                                           RTUNI_ALPHA, /* U+02f8a8: CJK COMPATIBILITY IDEOGRAPH-2F8A8*/
-                                           RTUNI_ALPHA, /* U+02f8a9: CJK COMPATIBILITY IDEOGRAPH-2F8A9*/
-                                           RTUNI_ALPHA, /* U+02f8aa: CJK COMPATIBILITY IDEOGRAPH-2F8AA*/
-                                           RTUNI_ALPHA, /* U+02f8ab: CJK COMPATIBILITY IDEOGRAPH-2F8AB*/
-                                           RTUNI_ALPHA, /* U+02f8ac: CJK COMPATIBILITY IDEOGRAPH-2F8AC*/
-                                           RTUNI_ALPHA, /* U+02f8ad: CJK COMPATIBILITY IDEOGRAPH-2F8AD*/
-                                           RTUNI_ALPHA, /* U+02f8ae: CJK COMPATIBILITY IDEOGRAPH-2F8AE*/
-                                           RTUNI_ALPHA, /* U+02f8af: CJK COMPATIBILITY IDEOGRAPH-2F8AF*/
-                                           RTUNI_ALPHA, /* U+02f8b0: CJK COMPATIBILITY IDEOGRAPH-2F8B0*/
-                                           RTUNI_ALPHA, /* U+02f8b1: CJK COMPATIBILITY IDEOGRAPH-2F8B1*/
-                                           RTUNI_ALPHA, /* U+02f8b2: CJK COMPATIBILITY IDEOGRAPH-2F8B2*/
-                                           RTUNI_ALPHA, /* U+02f8b3: CJK COMPATIBILITY IDEOGRAPH-2F8B3*/
-                                           RTUNI_ALPHA, /* U+02f8b4: CJK COMPATIBILITY IDEOGRAPH-2F8B4*/
-                                           RTUNI_ALPHA, /* U+02f8b5: CJK COMPATIBILITY IDEOGRAPH-2F8B5*/
-                                           RTUNI_ALPHA, /* U+02f8b6: CJK COMPATIBILITY IDEOGRAPH-2F8B6*/
-                                           RTUNI_ALPHA, /* U+02f8b7: CJK COMPATIBILITY IDEOGRAPH-2F8B7*/
-                                           RTUNI_ALPHA, /* U+02f8b8: CJK COMPATIBILITY IDEOGRAPH-2F8B8*/
-                                           RTUNI_ALPHA, /* U+02f8b9: CJK COMPATIBILITY IDEOGRAPH-2F8B9*/
-                                           RTUNI_ALPHA, /* U+02f8ba: CJK COMPATIBILITY IDEOGRAPH-2F8BA*/
-                                           RTUNI_ALPHA, /* U+02f8bb: CJK COMPATIBILITY IDEOGRAPH-2F8BB*/
-                                           RTUNI_ALPHA, /* U+02f8bc: CJK COMPATIBILITY IDEOGRAPH-2F8BC*/
-                                           RTUNI_ALPHA, /* U+02f8bd: CJK COMPATIBILITY IDEOGRAPH-2F8BD*/
-                                           RTUNI_ALPHA, /* U+02f8be: CJK COMPATIBILITY IDEOGRAPH-2F8BE*/
-                                           RTUNI_ALPHA, /* U+02f8bf: CJK COMPATIBILITY IDEOGRAPH-2F8BF*/
-                                           RTUNI_ALPHA, /* U+02f8c0: CJK COMPATIBILITY IDEOGRAPH-2F8C0*/
-                                           RTUNI_ALPHA, /* U+02f8c1: CJK COMPATIBILITY IDEOGRAPH-2F8C1*/
-                                           RTUNI_ALPHA, /* U+02f8c2: CJK COMPATIBILITY IDEOGRAPH-2F8C2*/
-                                           RTUNI_ALPHA, /* U+02f8c3: CJK COMPATIBILITY IDEOGRAPH-2F8C3*/
-                                           RTUNI_ALPHA, /* U+02f8c4: CJK COMPATIBILITY IDEOGRAPH-2F8C4*/
-                                           RTUNI_ALPHA, /* U+02f8c5: CJK COMPATIBILITY IDEOGRAPH-2F8C5*/
-                                           RTUNI_ALPHA, /* U+02f8c6: CJK COMPATIBILITY IDEOGRAPH-2F8C6*/
-                                           RTUNI_ALPHA, /* U+02f8c7: CJK COMPATIBILITY IDEOGRAPH-2F8C7*/
-                                           RTUNI_ALPHA, /* U+02f8c8: CJK COMPATIBILITY IDEOGRAPH-2F8C8*/
-                                           RTUNI_ALPHA, /* U+02f8c9: CJK COMPATIBILITY IDEOGRAPH-2F8C9*/
-                                           RTUNI_ALPHA, /* U+02f8ca: CJK COMPATIBILITY IDEOGRAPH-2F8CA*/
-                                           RTUNI_ALPHA, /* U+02f8cb: CJK COMPATIBILITY IDEOGRAPH-2F8CB*/
-                                           RTUNI_ALPHA, /* U+02f8cc: CJK COMPATIBILITY IDEOGRAPH-2F8CC*/
-                                           RTUNI_ALPHA, /* U+02f8cd: CJK COMPATIBILITY IDEOGRAPH-2F8CD*/
-                                           RTUNI_ALPHA, /* U+02f8ce: CJK COMPATIBILITY IDEOGRAPH-2F8CE*/
-                                           RTUNI_ALPHA, /* U+02f8cf: CJK COMPATIBILITY IDEOGRAPH-2F8CF*/
-                                           RTUNI_ALPHA, /* U+02f8d0: CJK COMPATIBILITY IDEOGRAPH-2F8D0*/
-                                           RTUNI_ALPHA, /* U+02f8d1: CJK COMPATIBILITY IDEOGRAPH-2F8D1*/
-                                           RTUNI_ALPHA, /* U+02f8d2: CJK COMPATIBILITY IDEOGRAPH-2F8D2*/
-                                           RTUNI_ALPHA, /* U+02f8d3: CJK COMPATIBILITY IDEOGRAPH-2F8D3*/
-                                           RTUNI_ALPHA, /* U+02f8d4: CJK COMPATIBILITY IDEOGRAPH-2F8D4*/
-                                           RTUNI_ALPHA, /* U+02f8d5: CJK COMPATIBILITY IDEOGRAPH-2F8D5*/
-                                           RTUNI_ALPHA, /* U+02f8d6: CJK COMPATIBILITY IDEOGRAPH-2F8D6*/
-                                           RTUNI_ALPHA, /* U+02f8d7: CJK COMPATIBILITY IDEOGRAPH-2F8D7*/
-                                           RTUNI_ALPHA, /* U+02f8d8: CJK COMPATIBILITY IDEOGRAPH-2F8D8*/
-                                           RTUNI_ALPHA, /* U+02f8d9: CJK COMPATIBILITY IDEOGRAPH-2F8D9*/
-                                           RTUNI_ALPHA, /* U+02f8da: CJK COMPATIBILITY IDEOGRAPH-2F8DA*/
-                                           RTUNI_ALPHA, /* U+02f8db: CJK COMPATIBILITY IDEOGRAPH-2F8DB*/
-                                           RTUNI_ALPHA, /* U+02f8dc: CJK COMPATIBILITY IDEOGRAPH-2F8DC*/
-                                           RTUNI_ALPHA, /* U+02f8dd: CJK COMPATIBILITY IDEOGRAPH-2F8DD*/
-                                           RTUNI_ALPHA, /* U+02f8de: CJK COMPATIBILITY IDEOGRAPH-2F8DE*/
-                                           RTUNI_ALPHA, /* U+02f8df: CJK COMPATIBILITY IDEOGRAPH-2F8DF*/
-                                           RTUNI_ALPHA, /* U+02f8e0: CJK COMPATIBILITY IDEOGRAPH-2F8E0*/
-                                           RTUNI_ALPHA, /* U+02f8e1: CJK COMPATIBILITY IDEOGRAPH-2F8E1*/
-                                           RTUNI_ALPHA, /* U+02f8e2: CJK COMPATIBILITY IDEOGRAPH-2F8E2*/
-                                           RTUNI_ALPHA, /* U+02f8e3: CJK COMPATIBILITY IDEOGRAPH-2F8E3*/
-                                           RTUNI_ALPHA, /* U+02f8e4: CJK COMPATIBILITY IDEOGRAPH-2F8E4*/
-                                           RTUNI_ALPHA, /* U+02f8e5: CJK COMPATIBILITY IDEOGRAPH-2F8E5*/
-                                           RTUNI_ALPHA, /* U+02f8e6: CJK COMPATIBILITY IDEOGRAPH-2F8E6*/
-                                           RTUNI_ALPHA, /* U+02f8e7: CJK COMPATIBILITY IDEOGRAPH-2F8E7*/
-                                           RTUNI_ALPHA, /* U+02f8e8: CJK COMPATIBILITY IDEOGRAPH-2F8E8*/
-                                           RTUNI_ALPHA, /* U+02f8e9: CJK COMPATIBILITY IDEOGRAPH-2F8E9*/
-                                           RTUNI_ALPHA, /* U+02f8ea: CJK COMPATIBILITY IDEOGRAPH-2F8EA*/
-                                           RTUNI_ALPHA, /* U+02f8eb: CJK COMPATIBILITY IDEOGRAPH-2F8EB*/
-                                           RTUNI_ALPHA, /* U+02f8ec: CJK COMPATIBILITY IDEOGRAPH-2F8EC*/
-                                           RTUNI_ALPHA, /* U+02f8ed: CJK COMPATIBILITY IDEOGRAPH-2F8ED*/
-                                           RTUNI_ALPHA, /* U+02f8ee: CJK COMPATIBILITY IDEOGRAPH-2F8EE*/
-                                           RTUNI_ALPHA, /* U+02f8ef: CJK COMPATIBILITY IDEOGRAPH-2F8EF*/
-                                           RTUNI_ALPHA, /* U+02f8f0: CJK COMPATIBILITY IDEOGRAPH-2F8F0*/
-                                           RTUNI_ALPHA, /* U+02f8f1: CJK COMPATIBILITY IDEOGRAPH-2F8F1*/
-                                           RTUNI_ALPHA, /* U+02f8f2: CJK COMPATIBILITY IDEOGRAPH-2F8F2*/
-                                           RTUNI_ALPHA, /* U+02f8f3: CJK COMPATIBILITY IDEOGRAPH-2F8F3*/
-                                           RTUNI_ALPHA, /* U+02f8f4: CJK COMPATIBILITY IDEOGRAPH-2F8F4*/
-                                           RTUNI_ALPHA, /* U+02f8f5: CJK COMPATIBILITY IDEOGRAPH-2F8F5*/
-                                           RTUNI_ALPHA, /* U+02f8f6: CJK COMPATIBILITY IDEOGRAPH-2F8F6*/
-                                           RTUNI_ALPHA, /* U+02f8f7: CJK COMPATIBILITY IDEOGRAPH-2F8F7*/
-                                           RTUNI_ALPHA, /* U+02f8f8: CJK COMPATIBILITY IDEOGRAPH-2F8F8*/
-                                           RTUNI_ALPHA, /* U+02f8f9: CJK COMPATIBILITY IDEOGRAPH-2F8F9*/
-                                           RTUNI_ALPHA, /* U+02f8fa: CJK COMPATIBILITY IDEOGRAPH-2F8FA*/
-                                           RTUNI_ALPHA, /* U+02f8fb: CJK COMPATIBILITY IDEOGRAPH-2F8FB*/
-                                           RTUNI_ALPHA, /* U+02f8fc: CJK COMPATIBILITY IDEOGRAPH-2F8FC*/
-                                           RTUNI_ALPHA, /* U+02f8fd: CJK COMPATIBILITY IDEOGRAPH-2F8FD*/
-                                           RTUNI_ALPHA, /* U+02f8fe: CJK COMPATIBILITY IDEOGRAPH-2F8FE*/
-                                           RTUNI_ALPHA, /* U+02f8ff: CJK COMPATIBILITY IDEOGRAPH-2F8FF*/
-                                           RTUNI_ALPHA, /* U+02f900: CJK COMPATIBILITY IDEOGRAPH-2F900*/
-                                           RTUNI_ALPHA, /* U+02f901: CJK COMPATIBILITY IDEOGRAPH-2F901*/
-                                           RTUNI_ALPHA, /* U+02f902: CJK COMPATIBILITY IDEOGRAPH-2F902*/
-                                           RTUNI_ALPHA, /* U+02f903: CJK COMPATIBILITY IDEOGRAPH-2F903*/
-                                           RTUNI_ALPHA, /* U+02f904: CJK COMPATIBILITY IDEOGRAPH-2F904*/
-                                           RTUNI_ALPHA, /* U+02f905: CJK COMPATIBILITY IDEOGRAPH-2F905*/
-                                           RTUNI_ALPHA, /* U+02f906: CJK COMPATIBILITY IDEOGRAPH-2F906*/
-                                           RTUNI_ALPHA, /* U+02f907: CJK COMPATIBILITY IDEOGRAPH-2F907*/
-                                           RTUNI_ALPHA, /* U+02f908: CJK COMPATIBILITY IDEOGRAPH-2F908*/
-                                           RTUNI_ALPHA, /* U+02f909: CJK COMPATIBILITY IDEOGRAPH-2F909*/
-                                           RTUNI_ALPHA, /* U+02f90a: CJK COMPATIBILITY IDEOGRAPH-2F90A*/
-                                           RTUNI_ALPHA, /* U+02f90b: CJK COMPATIBILITY IDEOGRAPH-2F90B*/
-                                           RTUNI_ALPHA, /* U+02f90c: CJK COMPATIBILITY IDEOGRAPH-2F90C*/
-                                           RTUNI_ALPHA, /* U+02f90d: CJK COMPATIBILITY IDEOGRAPH-2F90D*/
-                                           RTUNI_ALPHA, /* U+02f90e: CJK COMPATIBILITY IDEOGRAPH-2F90E*/
-                                           RTUNI_ALPHA, /* U+02f90f: CJK COMPATIBILITY IDEOGRAPH-2F90F*/
-                                           RTUNI_ALPHA, /* U+02f910: CJK COMPATIBILITY IDEOGRAPH-2F910*/
-                                           RTUNI_ALPHA, /* U+02f911: CJK COMPATIBILITY IDEOGRAPH-2F911*/
-                                           RTUNI_ALPHA, /* U+02f912: CJK COMPATIBILITY IDEOGRAPH-2F912*/
-                                           RTUNI_ALPHA, /* U+02f913: CJK COMPATIBILITY IDEOGRAPH-2F913*/
-                                           RTUNI_ALPHA, /* U+02f914: CJK COMPATIBILITY IDEOGRAPH-2F914*/
-                                           RTUNI_ALPHA, /* U+02f915: CJK COMPATIBILITY IDEOGRAPH-2F915*/
-                                           RTUNI_ALPHA, /* U+02f916: CJK COMPATIBILITY IDEOGRAPH-2F916*/
-                                           RTUNI_ALPHA, /* U+02f917: CJK COMPATIBILITY IDEOGRAPH-2F917*/
-                                           RTUNI_ALPHA, /* U+02f918: CJK COMPATIBILITY IDEOGRAPH-2F918*/
-                                           RTUNI_ALPHA, /* U+02f919: CJK COMPATIBILITY IDEOGRAPH-2F919*/
-                                           RTUNI_ALPHA, /* U+02f91a: CJK COMPATIBILITY IDEOGRAPH-2F91A*/
-                                           RTUNI_ALPHA, /* U+02f91b: CJK COMPATIBILITY IDEOGRAPH-2F91B*/
-                                           RTUNI_ALPHA, /* U+02f91c: CJK COMPATIBILITY IDEOGRAPH-2F91C*/
-                                           RTUNI_ALPHA, /* U+02f91d: CJK COMPATIBILITY IDEOGRAPH-2F91D*/
-                                           RTUNI_ALPHA, /* U+02f91e: CJK COMPATIBILITY IDEOGRAPH-2F91E*/
-                                           RTUNI_ALPHA, /* U+02f91f: CJK COMPATIBILITY IDEOGRAPH-2F91F*/
-                                           RTUNI_ALPHA, /* U+02f920: CJK COMPATIBILITY IDEOGRAPH-2F920*/
-                                           RTUNI_ALPHA, /* U+02f921: CJK COMPATIBILITY IDEOGRAPH-2F921*/
-                                           RTUNI_ALPHA, /* U+02f922: CJK COMPATIBILITY IDEOGRAPH-2F922*/
-                                           RTUNI_ALPHA, /* U+02f923: CJK COMPATIBILITY IDEOGRAPH-2F923*/
-                                           RTUNI_ALPHA, /* U+02f924: CJK COMPATIBILITY IDEOGRAPH-2F924*/
-                                           RTUNI_ALPHA, /* U+02f925: CJK COMPATIBILITY IDEOGRAPH-2F925*/
-                                           RTUNI_ALPHA, /* U+02f926: CJK COMPATIBILITY IDEOGRAPH-2F926*/
-                                           RTUNI_ALPHA, /* U+02f927: CJK COMPATIBILITY IDEOGRAPH-2F927*/
-                                           RTUNI_ALPHA, /* U+02f928: CJK COMPATIBILITY IDEOGRAPH-2F928*/
-                                           RTUNI_ALPHA, /* U+02f929: CJK COMPATIBILITY IDEOGRAPH-2F929*/
-                                           RTUNI_ALPHA, /* U+02f92a: CJK COMPATIBILITY IDEOGRAPH-2F92A*/
-                                           RTUNI_ALPHA, /* U+02f92b: CJK COMPATIBILITY IDEOGRAPH-2F92B*/
-                                           RTUNI_ALPHA, /* U+02f92c: CJK COMPATIBILITY IDEOGRAPH-2F92C*/
-                                           RTUNI_ALPHA, /* U+02f92d: CJK COMPATIBILITY IDEOGRAPH-2F92D*/
-                                           RTUNI_ALPHA, /* U+02f92e: CJK COMPATIBILITY IDEOGRAPH-2F92E*/
-                                           RTUNI_ALPHA, /* U+02f92f: CJK COMPATIBILITY IDEOGRAPH-2F92F*/
-                                           RTUNI_ALPHA, /* U+02f930: CJK COMPATIBILITY IDEOGRAPH-2F930*/
-                                           RTUNI_ALPHA, /* U+02f931: CJK COMPATIBILITY IDEOGRAPH-2F931*/
-                                           RTUNI_ALPHA, /* U+02f932: CJK COMPATIBILITY IDEOGRAPH-2F932*/
-                                           RTUNI_ALPHA, /* U+02f933: CJK COMPATIBILITY IDEOGRAPH-2F933*/
-                                           RTUNI_ALPHA, /* U+02f934: CJK COMPATIBILITY IDEOGRAPH-2F934*/
-                                           RTUNI_ALPHA, /* U+02f935: CJK COMPATIBILITY IDEOGRAPH-2F935*/
-                                           RTUNI_ALPHA, /* U+02f936: CJK COMPATIBILITY IDEOGRAPH-2F936*/
-                                           RTUNI_ALPHA, /* U+02f937: CJK COMPATIBILITY IDEOGRAPH-2F937*/
-                                           RTUNI_ALPHA, /* U+02f938: CJK COMPATIBILITY IDEOGRAPH-2F938*/
-                                           RTUNI_ALPHA, /* U+02f939: CJK COMPATIBILITY IDEOGRAPH-2F939*/
-                                           RTUNI_ALPHA, /* U+02f93a: CJK COMPATIBILITY IDEOGRAPH-2F93A*/
-                                           RTUNI_ALPHA, /* U+02f93b: CJK COMPATIBILITY IDEOGRAPH-2F93B*/
-                                           RTUNI_ALPHA, /* U+02f93c: CJK COMPATIBILITY IDEOGRAPH-2F93C*/
-                                           RTUNI_ALPHA, /* U+02f93d: CJK COMPATIBILITY IDEOGRAPH-2F93D*/
-                                           RTUNI_ALPHA, /* U+02f93e: CJK COMPATIBILITY IDEOGRAPH-2F93E*/
-                                           RTUNI_ALPHA, /* U+02f93f: CJK COMPATIBILITY IDEOGRAPH-2F93F*/
-                                           RTUNI_ALPHA, /* U+02f940: CJK COMPATIBILITY IDEOGRAPH-2F940*/
-                                           RTUNI_ALPHA, /* U+02f941: CJK COMPATIBILITY IDEOGRAPH-2F941*/
-                                           RTUNI_ALPHA, /* U+02f942: CJK COMPATIBILITY IDEOGRAPH-2F942*/
-                                           RTUNI_ALPHA, /* U+02f943: CJK COMPATIBILITY IDEOGRAPH-2F943*/
-                                           RTUNI_ALPHA, /* U+02f944: CJK COMPATIBILITY IDEOGRAPH-2F944*/
-                                           RTUNI_ALPHA, /* U+02f945: CJK COMPATIBILITY IDEOGRAPH-2F945*/
-                                           RTUNI_ALPHA, /* U+02f946: CJK COMPATIBILITY IDEOGRAPH-2F946*/
-                                           RTUNI_ALPHA, /* U+02f947: CJK COMPATIBILITY IDEOGRAPH-2F947*/
-                                           RTUNI_ALPHA, /* U+02f948: CJK COMPATIBILITY IDEOGRAPH-2F948*/
-                                           RTUNI_ALPHA, /* U+02f949: CJK COMPATIBILITY IDEOGRAPH-2F949*/
-                                           RTUNI_ALPHA, /* U+02f94a: CJK COMPATIBILITY IDEOGRAPH-2F94A*/
-                                           RTUNI_ALPHA, /* U+02f94b: CJK COMPATIBILITY IDEOGRAPH-2F94B*/
-                                           RTUNI_ALPHA, /* U+02f94c: CJK COMPATIBILITY IDEOGRAPH-2F94C*/
-                                           RTUNI_ALPHA, /* U+02f94d: CJK COMPATIBILITY IDEOGRAPH-2F94D*/
-                                           RTUNI_ALPHA, /* U+02f94e: CJK COMPATIBILITY IDEOGRAPH-2F94E*/
-                                           RTUNI_ALPHA, /* U+02f94f: CJK COMPATIBILITY IDEOGRAPH-2F94F*/
-                                           RTUNI_ALPHA, /* U+02f950: CJK COMPATIBILITY IDEOGRAPH-2F950*/
-                                           RTUNI_ALPHA, /* U+02f951: CJK COMPATIBILITY IDEOGRAPH-2F951*/
-                                           RTUNI_ALPHA, /* U+02f952: CJK COMPATIBILITY IDEOGRAPH-2F952*/
-                                           RTUNI_ALPHA, /* U+02f953: CJK COMPATIBILITY IDEOGRAPH-2F953*/
-                                           RTUNI_ALPHA, /* U+02f954: CJK COMPATIBILITY IDEOGRAPH-2F954*/
-                                           RTUNI_ALPHA, /* U+02f955: CJK COMPATIBILITY IDEOGRAPH-2F955*/
-                                           RTUNI_ALPHA, /* U+02f956: CJK COMPATIBILITY IDEOGRAPH-2F956*/
-                                           RTUNI_ALPHA, /* U+02f957: CJK COMPATIBILITY IDEOGRAPH-2F957*/
-                                           RTUNI_ALPHA, /* U+02f958: CJK COMPATIBILITY IDEOGRAPH-2F958*/
-                                           RTUNI_ALPHA, /* U+02f959: CJK COMPATIBILITY IDEOGRAPH-2F959*/
-                                           RTUNI_ALPHA, /* U+02f95a: CJK COMPATIBILITY IDEOGRAPH-2F95A*/
-                                           RTUNI_ALPHA, /* U+02f95b: CJK COMPATIBILITY IDEOGRAPH-2F95B*/
-                                           RTUNI_ALPHA, /* U+02f95c: CJK COMPATIBILITY IDEOGRAPH-2F95C*/
-                                           RTUNI_ALPHA, /* U+02f95d: CJK COMPATIBILITY IDEOGRAPH-2F95D*/
-                                           RTUNI_ALPHA, /* U+02f95e: CJK COMPATIBILITY IDEOGRAPH-2F95E*/
-                                           RTUNI_ALPHA, /* U+02f95f: CJK COMPATIBILITY IDEOGRAPH-2F95F*/
-                                           RTUNI_ALPHA, /* U+02f960: CJK COMPATIBILITY IDEOGRAPH-2F960*/
-                                           RTUNI_ALPHA, /* U+02f961: CJK COMPATIBILITY IDEOGRAPH-2F961*/
-                                           RTUNI_ALPHA, /* U+02f962: CJK COMPATIBILITY IDEOGRAPH-2F962*/
-                                           RTUNI_ALPHA, /* U+02f963: CJK COMPATIBILITY IDEOGRAPH-2F963*/
-                                           RTUNI_ALPHA, /* U+02f964: CJK COMPATIBILITY IDEOGRAPH-2F964*/
-                                           RTUNI_ALPHA, /* U+02f965: CJK COMPATIBILITY IDEOGRAPH-2F965*/
-                                           RTUNI_ALPHA, /* U+02f966: CJK COMPATIBILITY IDEOGRAPH-2F966*/
-                                           RTUNI_ALPHA, /* U+02f967: CJK COMPATIBILITY IDEOGRAPH-2F967*/
-                                           RTUNI_ALPHA, /* U+02f968: CJK COMPATIBILITY IDEOGRAPH-2F968*/
-                                           RTUNI_ALPHA, /* U+02f969: CJK COMPATIBILITY IDEOGRAPH-2F969*/
-                                           RTUNI_ALPHA, /* U+02f96a: CJK COMPATIBILITY IDEOGRAPH-2F96A*/
-                                           RTUNI_ALPHA, /* U+02f96b: CJK COMPATIBILITY IDEOGRAPH-2F96B*/
-                                           RTUNI_ALPHA, /* U+02f96c: CJK COMPATIBILITY IDEOGRAPH-2F96C*/
-                                           RTUNI_ALPHA, /* U+02f96d: CJK COMPATIBILITY IDEOGRAPH-2F96D*/
-                                           RTUNI_ALPHA, /* U+02f96e: CJK COMPATIBILITY IDEOGRAPH-2F96E*/
-                                           RTUNI_ALPHA, /* U+02f96f: CJK COMPATIBILITY IDEOGRAPH-2F96F*/
-                                           RTUNI_ALPHA, /* U+02f970: CJK COMPATIBILITY IDEOGRAPH-2F970*/
-                                           RTUNI_ALPHA, /* U+02f971: CJK COMPATIBILITY IDEOGRAPH-2F971*/
-                                           RTUNI_ALPHA, /* U+02f972: CJK COMPATIBILITY IDEOGRAPH-2F972*/
-                                           RTUNI_ALPHA, /* U+02f973: CJK COMPATIBILITY IDEOGRAPH-2F973*/
-                                           RTUNI_ALPHA, /* U+02f974: CJK COMPATIBILITY IDEOGRAPH-2F974*/
-                                           RTUNI_ALPHA, /* U+02f975: CJK COMPATIBILITY IDEOGRAPH-2F975*/
-                                           RTUNI_ALPHA, /* U+02f976: CJK COMPATIBILITY IDEOGRAPH-2F976*/
-                                           RTUNI_ALPHA, /* U+02f977: CJK COMPATIBILITY IDEOGRAPH-2F977*/
-                                           RTUNI_ALPHA, /* U+02f978: CJK COMPATIBILITY IDEOGRAPH-2F978*/
-                                           RTUNI_ALPHA, /* U+02f979: CJK COMPATIBILITY IDEOGRAPH-2F979*/
-                                           RTUNI_ALPHA, /* U+02f97a: CJK COMPATIBILITY IDEOGRAPH-2F97A*/
-                                           RTUNI_ALPHA, /* U+02f97b: CJK COMPATIBILITY IDEOGRAPH-2F97B*/
-                                           RTUNI_ALPHA, /* U+02f97c: CJK COMPATIBILITY IDEOGRAPH-2F97C*/
-                                           RTUNI_ALPHA, /* U+02f97d: CJK COMPATIBILITY IDEOGRAPH-2F97D*/
-                                           RTUNI_ALPHA, /* U+02f97e: CJK COMPATIBILITY IDEOGRAPH-2F97E*/
-                                           RTUNI_ALPHA, /* U+02f97f: CJK COMPATIBILITY IDEOGRAPH-2F97F*/
-                                           RTUNI_ALPHA, /* U+02f980: CJK COMPATIBILITY IDEOGRAPH-2F980*/
-                                           RTUNI_ALPHA, /* U+02f981: CJK COMPATIBILITY IDEOGRAPH-2F981*/
-                                           RTUNI_ALPHA, /* U+02f982: CJK COMPATIBILITY IDEOGRAPH-2F982*/
-                                           RTUNI_ALPHA, /* U+02f983: CJK COMPATIBILITY IDEOGRAPH-2F983*/
-                                           RTUNI_ALPHA, /* U+02f984: CJK COMPATIBILITY IDEOGRAPH-2F984*/
-                                           RTUNI_ALPHA, /* U+02f985: CJK COMPATIBILITY IDEOGRAPH-2F985*/
-                                           RTUNI_ALPHA, /* U+02f986: CJK COMPATIBILITY IDEOGRAPH-2F986*/
-                                           RTUNI_ALPHA, /* U+02f987: CJK COMPATIBILITY IDEOGRAPH-2F987*/
-                                           RTUNI_ALPHA, /* U+02f988: CJK COMPATIBILITY IDEOGRAPH-2F988*/
-                                           RTUNI_ALPHA, /* U+02f989: CJK COMPATIBILITY IDEOGRAPH-2F989*/
-                                           RTUNI_ALPHA, /* U+02f98a: CJK COMPATIBILITY IDEOGRAPH-2F98A*/
-                                           RTUNI_ALPHA, /* U+02f98b: CJK COMPATIBILITY IDEOGRAPH-2F98B*/
-                                           RTUNI_ALPHA, /* U+02f98c: CJK COMPATIBILITY IDEOGRAPH-2F98C*/
-                                           RTUNI_ALPHA, /* U+02f98d: CJK COMPATIBILITY IDEOGRAPH-2F98D*/
-                                           RTUNI_ALPHA, /* U+02f98e: CJK COMPATIBILITY IDEOGRAPH-2F98E*/
-                                           RTUNI_ALPHA, /* U+02f98f: CJK COMPATIBILITY IDEOGRAPH-2F98F*/
-                                           RTUNI_ALPHA, /* U+02f990: CJK COMPATIBILITY IDEOGRAPH-2F990*/
-                                           RTUNI_ALPHA, /* U+02f991: CJK COMPATIBILITY IDEOGRAPH-2F991*/
-                                           RTUNI_ALPHA, /* U+02f992: CJK COMPATIBILITY IDEOGRAPH-2F992*/
-                                           RTUNI_ALPHA, /* U+02f993: CJK COMPATIBILITY IDEOGRAPH-2F993*/
-                                           RTUNI_ALPHA, /* U+02f994: CJK COMPATIBILITY IDEOGRAPH-2F994*/
-                                           RTUNI_ALPHA, /* U+02f995: CJK COMPATIBILITY IDEOGRAPH-2F995*/
-                                           RTUNI_ALPHA, /* U+02f996: CJK COMPATIBILITY IDEOGRAPH-2F996*/
-                                           RTUNI_ALPHA, /* U+02f997: CJK COMPATIBILITY IDEOGRAPH-2F997*/
-                                           RTUNI_ALPHA, /* U+02f998: CJK COMPATIBILITY IDEOGRAPH-2F998*/
-                                           RTUNI_ALPHA, /* U+02f999: CJK COMPATIBILITY IDEOGRAPH-2F999*/
-                                           RTUNI_ALPHA, /* U+02f99a: CJK COMPATIBILITY IDEOGRAPH-2F99A*/
-                                           RTUNI_ALPHA, /* U+02f99b: CJK COMPATIBILITY IDEOGRAPH-2F99B*/
-                                           RTUNI_ALPHA, /* U+02f99c: CJK COMPATIBILITY IDEOGRAPH-2F99C*/
-                                           RTUNI_ALPHA, /* U+02f99d: CJK COMPATIBILITY IDEOGRAPH-2F99D*/
-                                           RTUNI_ALPHA, /* U+02f99e: CJK COMPATIBILITY IDEOGRAPH-2F99E*/
-                                           RTUNI_ALPHA, /* U+02f99f: CJK COMPATIBILITY IDEOGRAPH-2F99F*/
-                                           RTUNI_ALPHA, /* U+02f9a0: CJK COMPATIBILITY IDEOGRAPH-2F9A0*/
-                                           RTUNI_ALPHA, /* U+02f9a1: CJK COMPATIBILITY IDEOGRAPH-2F9A1*/
-                                           RTUNI_ALPHA, /* U+02f9a2: CJK COMPATIBILITY IDEOGRAPH-2F9A2*/
-                                           RTUNI_ALPHA, /* U+02f9a3: CJK COMPATIBILITY IDEOGRAPH-2F9A3*/
-                                           RTUNI_ALPHA, /* U+02f9a4: CJK COMPATIBILITY IDEOGRAPH-2F9A4*/
-                                           RTUNI_ALPHA, /* U+02f9a5: CJK COMPATIBILITY IDEOGRAPH-2F9A5*/
-                                           RTUNI_ALPHA, /* U+02f9a6: CJK COMPATIBILITY IDEOGRAPH-2F9A6*/
-                                           RTUNI_ALPHA, /* U+02f9a7: CJK COMPATIBILITY IDEOGRAPH-2F9A7*/
-                                           RTUNI_ALPHA, /* U+02f9a8: CJK COMPATIBILITY IDEOGRAPH-2F9A8*/
-                                           RTUNI_ALPHA, /* U+02f9a9: CJK COMPATIBILITY IDEOGRAPH-2F9A9*/
-                                           RTUNI_ALPHA, /* U+02f9aa: CJK COMPATIBILITY IDEOGRAPH-2F9AA*/
-                                           RTUNI_ALPHA, /* U+02f9ab: CJK COMPATIBILITY IDEOGRAPH-2F9AB*/
-                                           RTUNI_ALPHA, /* U+02f9ac: CJK COMPATIBILITY IDEOGRAPH-2F9AC*/
-                                           RTUNI_ALPHA, /* U+02f9ad: CJK COMPATIBILITY IDEOGRAPH-2F9AD*/
-                                           RTUNI_ALPHA, /* U+02f9ae: CJK COMPATIBILITY IDEOGRAPH-2F9AE*/
-                                           RTUNI_ALPHA, /* U+02f9af: CJK COMPATIBILITY IDEOGRAPH-2F9AF*/
-                                           RTUNI_ALPHA, /* U+02f9b0: CJK COMPATIBILITY IDEOGRAPH-2F9B0*/
-                                           RTUNI_ALPHA, /* U+02f9b1: CJK COMPATIBILITY IDEOGRAPH-2F9B1*/
-                                           RTUNI_ALPHA, /* U+02f9b2: CJK COMPATIBILITY IDEOGRAPH-2F9B2*/
-                                           RTUNI_ALPHA, /* U+02f9b3: CJK COMPATIBILITY IDEOGRAPH-2F9B3*/
-                                           RTUNI_ALPHA, /* U+02f9b4: CJK COMPATIBILITY IDEOGRAPH-2F9B4*/
-                                           RTUNI_ALPHA, /* U+02f9b5: CJK COMPATIBILITY IDEOGRAPH-2F9B5*/
-                                           RTUNI_ALPHA, /* U+02f9b6: CJK COMPATIBILITY IDEOGRAPH-2F9B6*/
-                                           RTUNI_ALPHA, /* U+02f9b7: CJK COMPATIBILITY IDEOGRAPH-2F9B7*/
-                                           RTUNI_ALPHA, /* U+02f9b8: CJK COMPATIBILITY IDEOGRAPH-2F9B8*/
-                                           RTUNI_ALPHA, /* U+02f9b9: CJK COMPATIBILITY IDEOGRAPH-2F9B9*/
-                                           RTUNI_ALPHA, /* U+02f9ba: CJK COMPATIBILITY IDEOGRAPH-2F9BA*/
-                                           RTUNI_ALPHA, /* U+02f9bb: CJK COMPATIBILITY IDEOGRAPH-2F9BB*/
-                                           RTUNI_ALPHA, /* U+02f9bc: CJK COMPATIBILITY IDEOGRAPH-2F9BC*/
-                                           RTUNI_ALPHA, /* U+02f9bd: CJK COMPATIBILITY IDEOGRAPH-2F9BD*/
-                                           RTUNI_ALPHA, /* U+02f9be: CJK COMPATIBILITY IDEOGRAPH-2F9BE*/
-                                           RTUNI_ALPHA, /* U+02f9bf: CJK COMPATIBILITY IDEOGRAPH-2F9BF*/
-                                           RTUNI_ALPHA, /* U+02f9c0: CJK COMPATIBILITY IDEOGRAPH-2F9C0*/
-                                           RTUNI_ALPHA, /* U+02f9c1: CJK COMPATIBILITY IDEOGRAPH-2F9C1*/
-                                           RTUNI_ALPHA, /* U+02f9c2: CJK COMPATIBILITY IDEOGRAPH-2F9C2*/
-                                           RTUNI_ALPHA, /* U+02f9c3: CJK COMPATIBILITY IDEOGRAPH-2F9C3*/
-                                           RTUNI_ALPHA, /* U+02f9c4: CJK COMPATIBILITY IDEOGRAPH-2F9C4*/
-                                           RTUNI_ALPHA, /* U+02f9c5: CJK COMPATIBILITY IDEOGRAPH-2F9C5*/
-                                           RTUNI_ALPHA, /* U+02f9c6: CJK COMPATIBILITY IDEOGRAPH-2F9C6*/
-                                           RTUNI_ALPHA, /* U+02f9c7: CJK COMPATIBILITY IDEOGRAPH-2F9C7*/
-                                           RTUNI_ALPHA, /* U+02f9c8: CJK COMPATIBILITY IDEOGRAPH-2F9C8*/
-                                           RTUNI_ALPHA, /* U+02f9c9: CJK COMPATIBILITY IDEOGRAPH-2F9C9*/
-                                           RTUNI_ALPHA, /* U+02f9ca: CJK COMPATIBILITY IDEOGRAPH-2F9CA*/
-                                           RTUNI_ALPHA, /* U+02f9cb: CJK COMPATIBILITY IDEOGRAPH-2F9CB*/
-                                           RTUNI_ALPHA, /* U+02f9cc: CJK COMPATIBILITY IDEOGRAPH-2F9CC*/
-                                           RTUNI_ALPHA, /* U+02f9cd: CJK COMPATIBILITY IDEOGRAPH-2F9CD*/
-                                           RTUNI_ALPHA, /* U+02f9ce: CJK COMPATIBILITY IDEOGRAPH-2F9CE*/
-                                           RTUNI_ALPHA, /* U+02f9cf: CJK COMPATIBILITY IDEOGRAPH-2F9CF*/
-                                           RTUNI_ALPHA, /* U+02f9d0: CJK COMPATIBILITY IDEOGRAPH-2F9D0*/
-                                           RTUNI_ALPHA, /* U+02f9d1: CJK COMPATIBILITY IDEOGRAPH-2F9D1*/
-                                           RTUNI_ALPHA, /* U+02f9d2: CJK COMPATIBILITY IDEOGRAPH-2F9D2*/
-                                           RTUNI_ALPHA, /* U+02f9d3: CJK COMPATIBILITY IDEOGRAPH-2F9D3*/
-                                           RTUNI_ALPHA, /* U+02f9d4: CJK COMPATIBILITY IDEOGRAPH-2F9D4*/
-                                           RTUNI_ALPHA, /* U+02f9d5: CJK COMPATIBILITY IDEOGRAPH-2F9D5*/
-                                           RTUNI_ALPHA, /* U+02f9d6: CJK COMPATIBILITY IDEOGRAPH-2F9D6*/
-                                           RTUNI_ALPHA, /* U+02f9d7: CJK COMPATIBILITY IDEOGRAPH-2F9D7*/
-                                           RTUNI_ALPHA, /* U+02f9d8: CJK COMPATIBILITY IDEOGRAPH-2F9D8*/
-                                           RTUNI_ALPHA, /* U+02f9d9: CJK COMPATIBILITY IDEOGRAPH-2F9D9*/
-                                           RTUNI_ALPHA, /* U+02f9da: CJK COMPATIBILITY IDEOGRAPH-2F9DA*/
-                                           RTUNI_ALPHA, /* U+02f9db: CJK COMPATIBILITY IDEOGRAPH-2F9DB*/
-                                           RTUNI_ALPHA, /* U+02f9dc: CJK COMPATIBILITY IDEOGRAPH-2F9DC*/
-                                           RTUNI_ALPHA, /* U+02f9dd: CJK COMPATIBILITY IDEOGRAPH-2F9DD*/
-                                           RTUNI_ALPHA, /* U+02f9de: CJK COMPATIBILITY IDEOGRAPH-2F9DE*/
-                                           RTUNI_ALPHA, /* U+02f9df: CJK COMPATIBILITY IDEOGRAPH-2F9DF*/
-                                           RTUNI_ALPHA, /* U+02f9e0: CJK COMPATIBILITY IDEOGRAPH-2F9E0*/
-                                           RTUNI_ALPHA, /* U+02f9e1: CJK COMPATIBILITY IDEOGRAPH-2F9E1*/
-                                           RTUNI_ALPHA, /* U+02f9e2: CJK COMPATIBILITY IDEOGRAPH-2F9E2*/
-                                           RTUNI_ALPHA, /* U+02f9e3: CJK COMPATIBILITY IDEOGRAPH-2F9E3*/
-                                           RTUNI_ALPHA, /* U+02f9e4: CJK COMPATIBILITY IDEOGRAPH-2F9E4*/
-                                           RTUNI_ALPHA, /* U+02f9e5: CJK COMPATIBILITY IDEOGRAPH-2F9E5*/
-                                           RTUNI_ALPHA, /* U+02f9e6: CJK COMPATIBILITY IDEOGRAPH-2F9E6*/
-                                           RTUNI_ALPHA, /* U+02f9e7: CJK COMPATIBILITY IDEOGRAPH-2F9E7*/
-                                           RTUNI_ALPHA, /* U+02f9e8: CJK COMPATIBILITY IDEOGRAPH-2F9E8*/
-                                           RTUNI_ALPHA, /* U+02f9e9: CJK COMPATIBILITY IDEOGRAPH-2F9E9*/
-                                           RTUNI_ALPHA, /* U+02f9ea: CJK COMPATIBILITY IDEOGRAPH-2F9EA*/
-                                           RTUNI_ALPHA, /* U+02f9eb: CJK COMPATIBILITY IDEOGRAPH-2F9EB*/
-                                           RTUNI_ALPHA, /* U+02f9ec: CJK COMPATIBILITY IDEOGRAPH-2F9EC*/
-                                           RTUNI_ALPHA, /* U+02f9ed: CJK COMPATIBILITY IDEOGRAPH-2F9ED*/
-                                           RTUNI_ALPHA, /* U+02f9ee: CJK COMPATIBILITY IDEOGRAPH-2F9EE*/
-                                           RTUNI_ALPHA, /* U+02f9ef: CJK COMPATIBILITY IDEOGRAPH-2F9EF*/
-                                           RTUNI_ALPHA, /* U+02f9f0: CJK COMPATIBILITY IDEOGRAPH-2F9F0*/
-                                           RTUNI_ALPHA, /* U+02f9f1: CJK COMPATIBILITY IDEOGRAPH-2F9F1*/
-                                           RTUNI_ALPHA, /* U+02f9f2: CJK COMPATIBILITY IDEOGRAPH-2F9F2*/
-                                           RTUNI_ALPHA, /* U+02f9f3: CJK COMPATIBILITY IDEOGRAPH-2F9F3*/
-                                           RTUNI_ALPHA, /* U+02f9f4: CJK COMPATIBILITY IDEOGRAPH-2F9F4*/
-                                           RTUNI_ALPHA, /* U+02f9f5: CJK COMPATIBILITY IDEOGRAPH-2F9F5*/
-                                           RTUNI_ALPHA, /* U+02f9f6: CJK COMPATIBILITY IDEOGRAPH-2F9F6*/
-                                           RTUNI_ALPHA, /* U+02f9f7: CJK COMPATIBILITY IDEOGRAPH-2F9F7*/
-                                           RTUNI_ALPHA, /* U+02f9f8: CJK COMPATIBILITY IDEOGRAPH-2F9F8*/
-                                           RTUNI_ALPHA, /* U+02f9f9: CJK COMPATIBILITY IDEOGRAPH-2F9F9*/
-                                           RTUNI_ALPHA, /* U+02f9fa: CJK COMPATIBILITY IDEOGRAPH-2F9FA*/
-                                           RTUNI_ALPHA, /* U+02f9fb: CJK COMPATIBILITY IDEOGRAPH-2F9FB*/
-                                           RTUNI_ALPHA, /* U+02f9fc: CJK COMPATIBILITY IDEOGRAPH-2F9FC*/
-                                           RTUNI_ALPHA, /* U+02f9fd: CJK COMPATIBILITY IDEOGRAPH-2F9FD*/
-                                           RTUNI_ALPHA, /* U+02f9fe: CJK COMPATIBILITY IDEOGRAPH-2F9FE*/
-                                           RTUNI_ALPHA, /* U+02f9ff: CJK COMPATIBILITY IDEOGRAPH-2F9FF*/
-                                           RTUNI_ALPHA, /* U+02fa00: CJK COMPATIBILITY IDEOGRAPH-2FA00*/
-                                           RTUNI_ALPHA, /* U+02fa01: CJK COMPATIBILITY IDEOGRAPH-2FA01*/
-                                           RTUNI_ALPHA, /* U+02fa02: CJK COMPATIBILITY IDEOGRAPH-2FA02*/
-                                           RTUNI_ALPHA, /* U+02fa03: CJK COMPATIBILITY IDEOGRAPH-2FA03*/
-                                           RTUNI_ALPHA, /* U+02fa04: CJK COMPATIBILITY IDEOGRAPH-2FA04*/
-                                           RTUNI_ALPHA, /* U+02fa05: CJK COMPATIBILITY IDEOGRAPH-2FA05*/
-                                           RTUNI_ALPHA, /* U+02fa06: CJK COMPATIBILITY IDEOGRAPH-2FA06*/
-                                           RTUNI_ALPHA, /* U+02fa07: CJK COMPATIBILITY IDEOGRAPH-2FA07*/
-                                           RTUNI_ALPHA, /* U+02fa08: CJK COMPATIBILITY IDEOGRAPH-2FA08*/
-                                           RTUNI_ALPHA, /* U+02fa09: CJK COMPATIBILITY IDEOGRAPH-2FA09*/
-                                           RTUNI_ALPHA, /* U+02fa0a: CJK COMPATIBILITY IDEOGRAPH-2FA0A*/
-                                           RTUNI_ALPHA, /* U+02fa0b: CJK COMPATIBILITY IDEOGRAPH-2FA0B*/
-                                           RTUNI_ALPHA, /* U+02fa0c: CJK COMPATIBILITY IDEOGRAPH-2FA0C*/
-                                           RTUNI_ALPHA, /* U+02fa0d: CJK COMPATIBILITY IDEOGRAPH-2FA0D*/
-                                           RTUNI_ALPHA, /* U+02fa0e: CJK COMPATIBILITY IDEOGRAPH-2FA0E*/
-                                           RTUNI_ALPHA, /* U+02fa0f: CJK COMPATIBILITY IDEOGRAPH-2FA0F*/
-                                           RTUNI_ALPHA, /* U+02fa10: CJK COMPATIBILITY IDEOGRAPH-2FA10*/
-                                           RTUNI_ALPHA, /* U+02fa11: CJK COMPATIBILITY IDEOGRAPH-2FA11*/
-                                           RTUNI_ALPHA, /* U+02fa12: CJK COMPATIBILITY IDEOGRAPH-2FA12*/
-                                           RTUNI_ALPHA, /* U+02fa13: CJK COMPATIBILITY IDEOGRAPH-2FA13*/
-                                           RTUNI_ALPHA, /* U+02fa14: CJK COMPATIBILITY IDEOGRAPH-2FA14*/
-                                           RTUNI_ALPHA, /* U+02fa15: CJK COMPATIBILITY IDEOGRAPH-2FA15*/
-                                           RTUNI_ALPHA, /* U+02fa16: CJK COMPATIBILITY IDEOGRAPH-2FA16*/
-                                           RTUNI_ALPHA, /* U+02fa17: CJK COMPATIBILITY IDEOGRAPH-2FA17*/
-                                           RTUNI_ALPHA, /* U+02fa18: CJK COMPATIBILITY IDEOGRAPH-2FA18*/
-                                           RTUNI_ALPHA, /* U+02fa19: CJK COMPATIBILITY IDEOGRAPH-2FA19*/
-                                           RTUNI_ALPHA, /* U+02fa1a: CJK COMPATIBILITY IDEOGRAPH-2FA1A*/
-                                           RTUNI_ALPHA, /* U+02fa1b: CJK COMPATIBILITY IDEOGRAPH-2FA1B*/
-                                           RTUNI_ALPHA, /* U+02fa1c: CJK COMPATIBILITY IDEOGRAPH-2FA1C*/
-                                           RTUNI_ALPHA, /* U+02fa1d: CJK COMPATIBILITY IDEOGRAPH-2FA1D*/
-};
-
-
-const RTUNIFLAGSRANGE g_aRTUniFlagsRanges[] =
-{
-    { 0x000000, 0x003401, &g_afRTUniFlags0x000000[0] },
-    { 0x004db5, 0x004e01, &g_afRTUniFlags0x004db5[0] },
-    { 0x009fbb, 0x00ac01, &g_afRTUniFlags0x009fbb[0] },
-    { 0x00d7a3, 0x00d7a4, &g_afRTUniFlags0x00d7a3[0] },
-    { 0x00f900, 0x010a34, &g_afRTUniFlags0x00f900[0] },
-    { 0x01d400, 0x01d800, &g_afRTUniFlags0x01d400[0] },
-    { 0x020000, 0x020001, &g_afRTUniFlags0x020000[0] },
-    { 0x02a6d6, 0x02a6d7, &g_afRTUniFlags0x02a6d6[0] },
-    { 0x02f800, 0x02fa1e, &g_afRTUniFlags0x02f800[0] },
-    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
-
-static const RTUNICP g_afRTUniUpper0x000000[] =
-{
-    0x00, /* U+000000: <control>*/
-    0x01, /* U+000001: <control>*/
-    0x02, /* U+000002: <control>*/
-    0x03, /* U+000003: <control>*/
-    0x04, /* U+000004: <control>*/
-    0x05, /* U+000005: <control>*/
-    0x06, /* U+000006: <control>*/
-    0x07, /* U+000007: <control>*/
-    0x08, /* U+000008: <control>*/
-    0x09, /* U+000009: <control>*/
-    0x0a, /* U+00000a: <control>*/
-    0x0b, /* U+00000b: <control>*/
-    0x0c, /* U+00000c: <control>*/
-    0x0d, /* U+00000d: <control>*/
-    0x0e, /* U+00000e: <control>*/
-    0x0f, /* U+00000f: <control>*/
-    0x10, /* U+000010: <control>*/
-    0x11, /* U+000011: <control>*/
-    0x12, /* U+000012: <control>*/
-    0x13, /* U+000013: <control>*/
-    0x14, /* U+000014: <control>*/
-    0x15, /* U+000015: <control>*/
-    0x16, /* U+000016: <control>*/
-    0x17, /* U+000017: <control>*/
-    0x18, /* U+000018: <control>*/
-    0x19, /* U+000019: <control>*/
-    0x1a, /* U+00001a: <control>*/
-    0x1b, /* U+00001b: <control>*/
-    0x1c, /* U+00001c: <control>*/
-    0x1d, /* U+00001d: <control>*/
-    0x1e, /* U+00001e: <control>*/
-    0x1f, /* U+00001f: <control>*/
-    0x20, /* U+000020: SPACE*/
-    0x21, /* U+000021: EXCLAMATION MARK*/
-    0x22, /* U+000022: QUOTATION MARK*/
-    0x23, /* U+000023: NUMBER SIGN*/
-    0x24, /* U+000024: DOLLAR SIGN*/
-    0x25, /* U+000025: PERCENT SIGN*/
-    0x26, /* U+000026: AMPERSAND*/
-    0x27, /* U+000027: APOSTROPHE*/
-    0x28, /* U+000028: LEFT PARENTHESIS*/
-    0x29, /* U+000029: RIGHT PARENTHESIS*/
-    0x2a, /* U+00002a: ASTERISK*/
-    0x2b, /* U+00002b: PLUS SIGN*/
-    0x2c, /* U+00002c: COMMA*/
-    0x2d, /* U+00002d: HYPHEN-MINUS*/
-    0x2e, /* U+00002e: FULL STOP*/
-    0x2f, /* U+00002f: SOLIDUS*/
-    0x30, /* U+000030: DIGIT ZERO*/
-    0x31, /* U+000031: DIGIT ONE*/
-    0x32, /* U+000032: DIGIT TWO*/
-    0x33, /* U+000033: DIGIT THREE*/
-    0x34, /* U+000034: DIGIT FOUR*/
-    0x35, /* U+000035: DIGIT FIVE*/
-    0x36, /* U+000036: DIGIT SIX*/
-    0x37, /* U+000037: DIGIT SEVEN*/
-    0x38, /* U+000038: DIGIT EIGHT*/
-    0x39, /* U+000039: DIGIT NINE*/
-    0x3a, /* U+00003a: COLON*/
-    0x3b, /* U+00003b: SEMICOLON*/
-    0x3c, /* U+00003c: LESS-THAN SIGN*/
-    0x3d, /* U+00003d: EQUALS SIGN*/
-    0x3e, /* U+00003e: GREATER-THAN SIGN*/
-    0x3f, /* U+00003f: QUESTION MARK*/
-    0x40, /* U+000040: COMMERCIAL AT*/
-    0x41, /* U+000041: LATIN CAPITAL LETTER A*/
-    0x42, /* U+000042: LATIN CAPITAL LETTER B*/
-    0x43, /* U+000043: LATIN CAPITAL LETTER C*/
-    0x44, /* U+000044: LATIN CAPITAL LETTER D*/
-    0x45, /* U+000045: LATIN CAPITAL LETTER E*/
-    0x46, /* U+000046: LATIN CAPITAL LETTER F*/
-    0x47, /* U+000047: LATIN CAPITAL LETTER G*/
-    0x48, /* U+000048: LATIN CAPITAL LETTER H*/
-    0x49, /* U+000049: LATIN CAPITAL LETTER I*/
-    0x4a, /* U+00004a: LATIN CAPITAL LETTER J*/
-    0x4b, /* U+00004b: LATIN CAPITAL LETTER K*/
-    0x4c, /* U+00004c: LATIN CAPITAL LETTER L*/
-    0x4d, /* U+00004d: LATIN CAPITAL LETTER M*/
-    0x4e, /* U+00004e: LATIN CAPITAL LETTER N*/
-    0x4f, /* U+00004f: LATIN CAPITAL LETTER O*/
-    0x50, /* U+000050: LATIN CAPITAL LETTER P*/
-    0x51, /* U+000051: LATIN CAPITAL LETTER Q*/
-    0x52, /* U+000052: LATIN CAPITAL LETTER R*/
-    0x53, /* U+000053: LATIN CAPITAL LETTER S*/
-    0x54, /* U+000054: LATIN CAPITAL LETTER T*/
-    0x55, /* U+000055: LATIN CAPITAL LETTER U*/
-    0x56, /* U+000056: LATIN CAPITAL LETTER V*/
-    0x57, /* U+000057: LATIN CAPITAL LETTER W*/
-    0x58, /* U+000058: LATIN CAPITAL LETTER X*/
-    0x59, /* U+000059: LATIN CAPITAL LETTER Y*/
-    0x5a, /* U+00005a: LATIN CAPITAL LETTER Z*/
-    0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
-    0x5c, /* U+00005c: REVERSE SOLIDUS*/
-    0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
-    0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
-    0x5f, /* U+00005f: LOW LINE*/
-    0x60, /* U+000060: GRAVE ACCENT*/
-    0x41, /* U+000061: LATIN SMALL LETTER A*/
-    0x42, /* U+000062: LATIN SMALL LETTER B*/
-    0x43, /* U+000063: LATIN SMALL LETTER C*/
-    0x44, /* U+000064: LATIN SMALL LETTER D*/
-    0x45, /* U+000065: LATIN SMALL LETTER E*/
-    0x46, /* U+000066: LATIN SMALL LETTER F*/
-    0x47, /* U+000067: LATIN SMALL LETTER G*/
-    0x48, /* U+000068: LATIN SMALL LETTER H*/
-    0x49, /* U+000069: LATIN SMALL LETTER I*/
-    0x4a, /* U+00006a: LATIN SMALL LETTER J*/
-    0x4b, /* U+00006b: LATIN SMALL LETTER K*/
-    0x4c, /* U+00006c: LATIN SMALL LETTER L*/
-    0x4d, /* U+00006d: LATIN SMALL LETTER M*/
-    0x4e, /* U+00006e: LATIN SMALL LETTER N*/
-    0x4f, /* U+00006f: LATIN SMALL LETTER O*/
-    0x50, /* U+000070: LATIN SMALL LETTER P*/
-    0x51, /* U+000071: LATIN SMALL LETTER Q*/
-    0x52, /* U+000072: LATIN SMALL LETTER R*/
-    0x53, /* U+000073: LATIN SMALL LETTER S*/
-    0x54, /* U+000074: LATIN SMALL LETTER T*/
-    0x55, /* U+000075: LATIN SMALL LETTER U*/
-    0x56, /* U+000076: LATIN SMALL LETTER V*/
-    0x57, /* U+000077: LATIN SMALL LETTER W*/
-    0x58, /* U+000078: LATIN SMALL LETTER X*/
-    0x59, /* U+000079: LATIN SMALL LETTER Y*/
-    0x5a, /* U+00007a: LATIN SMALL LETTER Z*/
-    0x7b, /* U+00007b: LEFT CURLY BRACKET*/
-    0x7c, /* U+00007c: VERTICAL LINE*/
-    0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
-    0x7e, /* U+00007e: TILDE*/
-    0x7f, /* U+00007f: <control>*/
-    0x80, /* U+000080: <control>*/
-    0x81, /* U+000081: <control>*/
-    0x82, /* U+000082: <control>*/
-    0x83, /* U+000083: <control>*/
-    0x84, /* U+000084: <control>*/
-    0x85, /* U+000085: <control>*/
-    0x86, /* U+000086: <control>*/
-    0x87, /* U+000087: <control>*/
-    0x88, /* U+000088: <control>*/
-    0x89, /* U+000089: <control>*/
-    0x8a, /* U+00008a: <control>*/
-    0x8b, /* U+00008b: <control>*/
-    0x8c, /* U+00008c: <control>*/
-    0x8d, /* U+00008d: <control>*/
-    0x8e, /* U+00008e: <control>*/
-    0x8f, /* U+00008f: <control>*/
-    0x90, /* U+000090: <control>*/
-    0x91, /* U+000091: <control>*/
-    0x92, /* U+000092: <control>*/
-    0x93, /* U+000093: <control>*/
-    0x94, /* U+000094: <control>*/
-    0x95, /* U+000095: <control>*/
-    0x96, /* U+000096: <control>*/
-    0x97, /* U+000097: <control>*/
-    0x98, /* U+000098: <control>*/
-    0x99, /* U+000099: <control>*/
-    0x9a, /* U+00009a: <control>*/
-    0x9b, /* U+00009b: <control>*/
-    0x9c, /* U+00009c: <control>*/
-    0x9d, /* U+00009d: <control>*/
-    0x9e, /* U+00009e: <control>*/
-    0x9f, /* U+00009f: <control>*/
-    0xa0, /* U+0000a0: NO-BREAK SPACE*/
-    0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
-    0xa2, /* U+0000a2: CENT SIGN*/
-    0xa3, /* U+0000a3: POUND SIGN*/
-    0xa4, /* U+0000a4: CURRENCY SIGN*/
-    0xa5, /* U+0000a5: YEN SIGN*/
-    0xa6, /* U+0000a6: BROKEN BAR*/
-    0xa7, /* U+0000a7: SECTION SIGN*/
-    0xa8, /* U+0000a8: DIAERESIS*/
-    0xa9, /* U+0000a9: COPYRIGHT SIGN*/
-    0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
-    0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-    0xac, /* U+0000ac: NOT SIGN*/
-    0xad, /* U+0000ad: SOFT HYPHEN*/
-    0xae, /* U+0000ae: REGISTERED SIGN*/
-    0xaf, /* U+0000af: MACRON*/
-    0xb0, /* U+0000b0: DEGREE SIGN*/
-    0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
-    0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
-    0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
-    0xb4, /* U+0000b4: ACUTE ACCENT*/
-    0x39c, /* U+0000b5: MICRO SIGN*/
-    0xb6, /* U+0000b6: PILCROW SIGN*/
-    0xb7, /* U+0000b7: MIDDLE DOT*/
-    0xb8, /* U+0000b8: CEDILLA*/
-    0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
-    0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
-    0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-    0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
-    0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
-    0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
-    0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
-    0xc0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
-    0xc1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
-    0xc2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
-    0xc3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
-    0xc4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
-    0xc5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
-    0xc6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
-    0xc7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
-    0xc8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
-    0xc9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
-    0xca, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
-    0xcb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
-    0xcc, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
-    0xcd, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
-    0xce, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
-    0xcf, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
-    0xd0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
-    0xd1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
-    0xd2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
-    0xd3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
-    0xd4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
-    0xd5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
-    0xd6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
-    0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
-    0xd8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
-    0xd9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
-    0xda, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
-    0xdb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
-    0xdc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
-    0xdd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
-    0xde, /* U+0000de: LATIN CAPITAL LETTER THORN*/
-    0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
-    0xc0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
-    0xc1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
-    0xc2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
-    0xc3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
-    0xc4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
-    0xc5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
-    0xc6, /* U+0000e6: LATIN SMALL LETTER AE*/
-    0xc7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
-    0xc8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
-    0xc9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
-    0xca, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
-    0xcb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
-    0xcc, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
-    0xcd, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
-    0xce, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
-    0xcf, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
-    0xd0, /* U+0000f0: LATIN SMALL LETTER ETH*/
-    0xd1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
-    0xd2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
-    0xd3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
-    0xd4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
-    0xd5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
-    0xd6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
-    0xf7, /* U+0000f7: DIVISION SIGN*/
-    0xd8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
-    0xd9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
-    0xda, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
-    0xdb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
-    0xdc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
-    0xdd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
-    0xde, /* U+0000fe: LATIN SMALL LETTER THORN*/
-    0x178, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
-    0x100, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
-    0x100, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
-    0x102, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
-    0x102, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
-    0x104, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
-    0x104, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
-    0x106, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
-    0x106, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
-    0x108, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
-    0x108, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
-    0x10a, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
-    0x10a, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
-    0x10c, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
-    0x10c, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
-    0x10e, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
-    0x10e, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
-    0x110, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
-    0x110, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
-    0x112, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
-    0x112, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
-    0x114, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
-    0x114, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
-    0x116, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
-    0x116, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
-    0x118, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
-    0x118, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
-    0x11a, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
-    0x11a, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
-    0x11c, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
-    0x11c, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
-    0x11e, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
-    0x11e, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
-    0x120, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
-    0x120, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
-    0x122, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
-    0x122, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
-    0x124, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
-    0x124, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
-    0x126, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
-    0x126, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
-    0x128, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
-    0x128, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
-    0x12a, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
-    0x12a, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
-    0x12c, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
-    0x12c, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
-    0x12e, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
-    0x12e, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
-    0x130, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
-    0x49, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
-    0x132, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
-    0x132, /* U+000133: LATIN SMALL LIGATURE IJ*/
-    0x134, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
-    0x134, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
-    0x136, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
-    0x136, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
-    0x138, /* U+000138: LATIN SMALL LETTER KRA*/
-    0x139, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
-    0x139, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
-    0x13b, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
-    0x13b, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
-    0x13d, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
-    0x13d, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
-    0x13f, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
-    0x13f, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
-    0x141, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
-    0x141, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
-    0x143, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
-    0x143, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
-    0x145, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
-    0x145, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
-    0x147, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
-    0x147, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
-    0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
-    0x14a, /* U+00014a: LATIN CAPITAL LETTER ENG*/
-    0x14a, /* U+00014b: LATIN SMALL LETTER ENG*/
-    0x14c, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
-    0x14c, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
-    0x14e, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
-    0x14e, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
-    0x150, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
-    0x150, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
-    0x152, /* U+000152: LATIN CAPITAL LIGATURE OE*/
-    0x152, /* U+000153: LATIN SMALL LIGATURE OE*/
-    0x154, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
-    0x154, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
-    0x156, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
-    0x156, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
-    0x158, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
-    0x158, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
-    0x15a, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
-    0x15a, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
-    0x15c, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
-    0x15c, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
-    0x15e, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
-    0x15e, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
-    0x160, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
-    0x160, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
-    0x162, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
-    0x162, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
-    0x164, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
-    0x164, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
-    0x166, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
-    0x166, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
-    0x168, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
-    0x168, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
-    0x16a, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
-    0x16a, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
-    0x16c, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
-    0x16c, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
-    0x16e, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
-    0x16e, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
-    0x170, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
-    0x170, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
-    0x172, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
-    0x172, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
-    0x174, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
-    0x174, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
-    0x176, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
-    0x176, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
-    0x178, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
-    0x179, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
-    0x179, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
-    0x17b, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
-    0x17b, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
-    0x17d, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
-    0x17d, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
-    0x53, /* U+00017f: LATIN SMALL LETTER LONG S*/
-    0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
-    0x181, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
-    0x182, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
-    0x182, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
-    0x184, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
-    0x184, /* U+000185: LATIN SMALL LETTER TONE SIX*/
-    0x186, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
-    0x187, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
-    0x187, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
-    0x189, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
-    0x18a, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
-    0x18b, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
-    0x18b, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
-    0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
-    0x18e, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
-    0x18f, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
-    0x190, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
-    0x191, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
-    0x191, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
-    0x193, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
-    0x194, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
-    0x1f6, /* U+000195: LATIN SMALL LETTER HV*/
-    0x196, /* U+000196: LATIN CAPITAL LETTER IOTA*/
-    0x197, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
-    0x198, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
-    0x198, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
-    0x23d, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
-    0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
-    0x19c, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
-    0x19d, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
-    0x220, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
-    0x19f, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
-    0x1a0, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
-    0x1a0, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
-    0x1a2, /* U+0001a2: LATIN CAPITAL LETTER OI*/
-    0x1a2, /* U+0001a3: LATIN SMALL LETTER OI*/
-    0x1a4, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
-    0x1a4, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
-    0x1a6, /* U+0001a6: LATIN LETTER YR*/
-    0x1a7, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
-    0x1a7, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
-    0x1a9, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
-    0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
-    0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
-    0x1ac, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
-    0x1ac, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
-    0x1ae, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
-    0x1af, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
-    0x1af, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
-    0x1b1, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
-    0x1b2, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
-    0x1b3, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
-    0x1b3, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
-    0x1b5, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
-    0x1b5, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
-    0x1b7, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
-    0x1b8, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
-    0x1b8, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
-    0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
-    0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
-    0x1bc, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
-    0x1bc, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
-    0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
-    0x1f7, /* U+0001bf: LATIN LETTER WYNN*/
-    0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
-    0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
-    0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
-    0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
-    0x1c4, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
-    0x1c4, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
-    0x1c4, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
-    0x1c7, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
-    0x1c7, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
-    0x1c7, /* U+0001c9: LATIN SMALL LETTER LJ*/
-    0x1ca, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
-    0x1ca, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
-    0x1ca, /* U+0001cc: LATIN SMALL LETTER NJ*/
-    0x1cd, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
-    0x1cd, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
-    0x1cf, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
-    0x1cf, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
-    0x1d1, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
-    0x1d1, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
-    0x1d3, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
-    0x1d3, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
-    0x1d5, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
-    0x1d5, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
-    0x1d7, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
-    0x1d7, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
-    0x1d9, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
-    0x1d9, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
-    0x1db, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
-    0x1db, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
-    0x18e, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
-    0x1de, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
-    0x1de, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
-    0x1e0, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
-    0x1e0, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
-    0x1e2, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
-    0x1e2, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
-    0x1e4, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
-    0x1e4, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
-    0x1e6, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
-    0x1e6, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
-    0x1e8, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
-    0x1e8, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
-    0x1ea, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
-    0x1ea, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
-    0x1ec, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
-    0x1ec, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
-    0x1ee, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
-    0x1ee, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
-    0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
-    0x1f1, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
-    0x1f1, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
-    0x1f1, /* U+0001f3: LATIN SMALL LETTER DZ*/
-    0x1f4, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
-    0x1f4, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
-    0x1f6, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
-    0x1f7, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
-    0x1f8, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
-    0x1f8, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
-    0x1fa, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
-    0x1fa, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
-    0x1fc, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
-    0x1fc, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
-    0x1fe, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
-    0x1fe, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
-    0x200, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
-    0x200, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
-    0x202, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
-    0x202, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
-    0x204, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
-    0x204, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
-    0x206, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
-    0x206, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
-    0x208, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
-    0x208, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
-    0x20a, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
-    0x20a, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
-    0x20c, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
-    0x20c, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
-    0x20e, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
-    0x20e, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
-    0x210, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
-    0x210, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
-    0x212, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
-    0x212, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
-    0x214, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
-    0x214, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
-    0x216, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
-    0x216, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
-    0x218, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
-    0x218, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
-    0x21a, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
-    0x21a, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
-    0x21c, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
-    0x21c, /* U+00021d: LATIN SMALL LETTER YOGH*/
-    0x21e, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
-    0x21e, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
-    0x220, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
-    0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
-    0x222, /* U+000222: LATIN CAPITAL LETTER OU*/
-    0x222, /* U+000223: LATIN SMALL LETTER OU*/
-    0x224, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
-    0x224, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
-    0x226, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
-    0x226, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
-    0x228, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
-    0x228, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
-    0x22a, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
-    0x22a, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
-    0x22c, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
-    0x22c, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
-    0x22e, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
-    0x22e, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
-    0x230, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
-    0x230, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
-    0x232, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
-    0x232, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
-    0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
-    0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
-    0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
-    0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
-    0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
-    0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
-    0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
-    0x23b, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
-    0x23b, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
-    0x23d, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
-    0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
-    0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
-    0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
-    0x241, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
-    0x242, /* U+000242: */
-    0x243, /* U+000243: */
-    0x244, /* U+000244: */
-    0x245, /* U+000245: */
-    0x246, /* U+000246: */
-    0x247, /* U+000247: */
-    0x248, /* U+000248: */
-    0x249, /* U+000249: */
-    0x24a, /* U+00024a: */
-    0x24b, /* U+00024b: */
-    0x24c, /* U+00024c: */
-    0x24d, /* U+00024d: */
-    0x24e, /* U+00024e: */
-    0x24f, /* U+00024f: */
-    0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
-    0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
-    0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
-    0x181, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
-    0x186, /* U+000254: LATIN SMALL LETTER OPEN O*/
-    0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
-    0x189, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
-    0x18a, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
-    0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
-    0x18f, /* U+000259: LATIN SMALL LETTER SCHWA*/
-    0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
-    0x190, /* U+00025b: LATIN SMALL LETTER OPEN E*/
-    0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
-    0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
-    0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
-    0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
-    0x193, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
-    0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
-    0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
-    0x194, /* U+000263: LATIN SMALL LETTER GAMMA*/
-    0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
-    0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
-    0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
-    0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
-    0x197, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
-    0x196, /* U+000269: LATIN SMALL LETTER IOTA*/
-    0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
-    0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
-    0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
-    0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
-    0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
-    0x19c, /* U+00026f: LATIN SMALL LETTER TURNED M*/
-    0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
-    0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
-    0x19d, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
-    0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
-    0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
-    0x19f, /* U+000275: LATIN SMALL LETTER BARRED O*/
-    0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
-    0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
-    0x278, /* U+000278: LATIN SMALL LETTER PHI*/
-    0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
-    0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
-    0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
-    0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
-    0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
-    0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
-    0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
-    0x1a6, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
-    0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
-    0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
-    0x1a9, /* U+000283: LATIN SMALL LETTER ESH*/
-    0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
-    0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
-    0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
-    0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
-    0x1ae, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
-    0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
-    0x1b1, /* U+00028a: LATIN SMALL LETTER UPSILON*/
-    0x1b2, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
-    0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
-    0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
-    0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
-    0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
-    0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
-    0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
-    0x1b7, /* U+000292: LATIN SMALL LETTER EZH*/
-    0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
-    0x241, /* U+000294: LATIN LETTER GLOTTAL STOP*/
-    0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
-    0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
-    0x297, /* U+000297: LATIN LETTER STRETCHED C*/
-    0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
-    0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
-    0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
-    0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
-    0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
-    0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
-    0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
-    0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
-    0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
-    0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
-    0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
-    0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
-    0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
-    0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
-    0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
-    0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
-    0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
-    0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
-    0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
-    0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
-    0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
-    0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
-    0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
-    0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
-    0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
-    0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
-    0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
-    0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
-    0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
-    0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
-    0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
-    0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
-    0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
-    0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
-    0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
-    0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
-    0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
-    0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
-    0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
-    0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
-    0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
-    0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
-    0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
-    0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
-    0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
-    0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
-    0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
-    0x2c7, /* U+0002c7: CARON*/
-    0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
-    0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
-    0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
-    0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
-    0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
-    0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
-    0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
-    0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
-    0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
-    0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
-    0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
-    0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
-    0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
-    0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
-    0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
-    0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
-    0x2d8, /* U+0002d8: BREVE*/
-    0x2d9, /* U+0002d9: DOT ABOVE*/
-    0x2da, /* U+0002da: RING ABOVE*/
-    0x2db, /* U+0002db: OGONEK*/
-    0x2dc, /* U+0002dc: SMALL TILDE*/
-    0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
-    0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
-    0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
-    0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
-    0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
-    0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
-    0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
-    0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
-    0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
-    0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
-    0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
-    0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
-    0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
-    0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
-    0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
-    0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
-    0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
-    0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
-    0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
-    0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
-    0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
-    0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
-    0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
-    0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
-    0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
-    0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
-    0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
-    0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
-    0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
-    0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
-    0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
-    0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
-    0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
-    0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
-    0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
-    0x300, /* U+000300: COMBINING GRAVE ACCENT*/
-    0x301, /* U+000301: COMBINING ACUTE ACCENT*/
-    0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
-    0x303, /* U+000303: COMBINING TILDE*/
-    0x304, /* U+000304: COMBINING MACRON*/
-    0x305, /* U+000305: COMBINING OVERLINE*/
-    0x306, /* U+000306: COMBINING BREVE*/
-    0x307, /* U+000307: COMBINING DOT ABOVE*/
-    0x308, /* U+000308: COMBINING DIAERESIS*/
-    0x309, /* U+000309: COMBINING HOOK ABOVE*/
-    0x30a, /* U+00030a: COMBINING RING ABOVE*/
-    0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
-    0x30c, /* U+00030c: COMBINING CARON*/
-    0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
-    0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
-    0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
-    0x310, /* U+000310: COMBINING CANDRABINDU*/
-    0x311, /* U+000311: COMBINING INVERTED BREVE*/
-    0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
-    0x313, /* U+000313: COMBINING COMMA ABOVE*/
-    0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
-    0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
-    0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
-    0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
-    0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
-    0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
-    0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
-    0x31b, /* U+00031b: COMBINING HORN*/
-    0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
-    0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
-    0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
-    0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
-    0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
-    0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
-    0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
-    0x323, /* U+000323: COMBINING DOT BELOW*/
-    0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
-    0x325, /* U+000325: COMBINING RING BELOW*/
-    0x326, /* U+000326: COMBINING COMMA BELOW*/
-    0x327, /* U+000327: COMBINING CEDILLA*/
-    0x328, /* U+000328: COMBINING OGONEK*/
-    0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
-    0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
-    0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
-    0x32c, /* U+00032c: COMBINING CARON BELOW*/
-    0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
-    0x32e, /* U+00032e: COMBINING BREVE BELOW*/
-    0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
-    0x330, /* U+000330: COMBINING TILDE BELOW*/
-    0x331, /* U+000331: COMBINING MACRON BELOW*/
-    0x332, /* U+000332: COMBINING LOW LINE*/
-    0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
-    0x334, /* U+000334: COMBINING TILDE OVERLAY*/
-    0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
-    0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
-    0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
-    0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
-    0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
-    0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
-    0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
-    0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
-    0x33d, /* U+00033d: COMBINING X ABOVE*/
-    0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
-    0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
-    0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
-    0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
-    0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
-    0x343, /* U+000343: COMBINING GREEK KORONIS*/
-    0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
-    0x399, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
-    0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
-    0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
-    0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
-    0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
-    0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
-    0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
-    0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
-    0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
-    0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
-    0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
-    0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
-    0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
-    0x352, /* U+000352: COMBINING FERMATA*/
-    0x353, /* U+000353: COMBINING X BELOW*/
-    0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
-    0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
-    0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
-    0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
-    0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
-    0x359, /* U+000359: COMBINING ASTERISK BELOW*/
-    0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
-    0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
-    0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
-    0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
-    0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
-    0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
-    0x360, /* U+000360: COMBINING DOUBLE TILDE*/
-    0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
-    0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
-    0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
-    0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
-    0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
-    0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
-    0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
-    0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
-    0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
-    0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
-    0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
-    0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
-    0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
-    0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
-    0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
-    0x370, /* U+000370: */
-    0x371, /* U+000371: */
-    0x372, /* U+000372: */
-    0x373, /* U+000373: */
-    0x374, /* U+000374: GREEK NUMERAL SIGN*/
-    0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
-    0x376, /* U+000376: */
-    0x377, /* U+000377: */
-    0x378, /* U+000378: */
-    0x379, /* U+000379: */
-    0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
-    0x37b, /* U+00037b: */
-    0x37c, /* U+00037c: */
-    0x37d, /* U+00037d: */
-    0x37e, /* U+00037e: GREEK QUESTION MARK*/
-    0x37f, /* U+00037f: */
-    0x380, /* U+000380: */
-    0x381, /* U+000381: */
-    0x382, /* U+000382: */
-    0x383, /* U+000383: */
-    0x384, /* U+000384: GREEK TONOS*/
-    0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
-    0x386, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
-    0x387, /* U+000387: GREEK ANO TELEIA*/
-    0x388, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
-    0x389, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
-    0x38a, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
-    0x38b, /* U+00038b: */
-    0x38c, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
-    0x38d, /* U+00038d: */
-    0x38e, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
-    0x38f, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
-    0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
-    0x391, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
-    0x392, /* U+000392: GREEK CAPITAL LETTER BETA*/
-    0x393, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
-    0x394, /* U+000394: GREEK CAPITAL LETTER DELTA*/
-    0x395, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
-    0x396, /* U+000396: GREEK CAPITAL LETTER ZETA*/
-    0x397, /* U+000397: GREEK CAPITAL LETTER ETA*/
-    0x398, /* U+000398: GREEK CAPITAL LETTER THETA*/
-    0x399, /* U+000399: GREEK CAPITAL LETTER IOTA*/
-    0x39a, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
-    0x39b, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
-    0x39c, /* U+00039c: GREEK CAPITAL LETTER MU*/
-    0x39d, /* U+00039d: GREEK CAPITAL LETTER NU*/
-    0x39e, /* U+00039e: GREEK CAPITAL LETTER XI*/
-    0x39f, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
-    0x3a0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
-    0x3a1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
-    0x3a2, /* U+0003a2: */
-    0x3a3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
-    0x3a4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
-    0x3a5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
-    0x3a6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
-    0x3a7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
-    0x3a8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
-    0x3a9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
-    0x3aa, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
-    0x3ab, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
-    0x386, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
-    0x388, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
-    0x389, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
-    0x38a, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
-    0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
-    0x391, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
-    0x392, /* U+0003b2: GREEK SMALL LETTER BETA*/
-    0x393, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
-    0x394, /* U+0003b4: GREEK SMALL LETTER DELTA*/
-    0x395, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
-    0x396, /* U+0003b6: GREEK SMALL LETTER ZETA*/
-    0x397, /* U+0003b7: GREEK SMALL LETTER ETA*/
-    0x398, /* U+0003b8: GREEK SMALL LETTER THETA*/
-    0x399, /* U+0003b9: GREEK SMALL LETTER IOTA*/
-    0x39a, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
-    0x39b, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
-    0x39c, /* U+0003bc: GREEK SMALL LETTER MU*/
-    0x39d, /* U+0003bd: GREEK SMALL LETTER NU*/
-    0x39e, /* U+0003be: GREEK SMALL LETTER XI*/
-    0x39f, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
-    0x3a0, /* U+0003c0: GREEK SMALL LETTER PI*/
-    0x3a1, /* U+0003c1: GREEK SMALL LETTER RHO*/
-    0x3a3, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
-    0x3a3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
-    0x3a4, /* U+0003c4: GREEK SMALL LETTER TAU*/
-    0x3a5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
-    0x3a6, /* U+0003c6: GREEK SMALL LETTER PHI*/
-    0x3a7, /* U+0003c7: GREEK SMALL LETTER CHI*/
-    0x3a8, /* U+0003c8: GREEK SMALL LETTER PSI*/
-    0x3a9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
-    0x3aa, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
-    0x3ab, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
-    0x38c, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
-    0x38e, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
-    0x38f, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
-    0x3cf, /* U+0003cf: */
-    0x392, /* U+0003d0: GREEK BETA SYMBOL*/
-    0x398, /* U+0003d1: GREEK THETA SYMBOL*/
-    0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
-    0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
-    0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
-    0x3a6, /* U+0003d5: GREEK PHI SYMBOL*/
-    0x3a0, /* U+0003d6: GREEK PI SYMBOL*/
-    0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
-    0x3d8, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
-    0x3d8, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
-    0x3da, /* U+0003da: GREEK LETTER STIGMA*/
-    0x3da, /* U+0003db: GREEK SMALL LETTER STIGMA*/
-    0x3dc, /* U+0003dc: GREEK LETTER DIGAMMA*/
-    0x3dc, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
-    0x3de, /* U+0003de: GREEK LETTER KOPPA*/
-    0x3de, /* U+0003df: GREEK SMALL LETTER KOPPA*/
-    0x3e0, /* U+0003e0: GREEK LETTER SAMPI*/
-    0x3e0, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
-    0x3e2, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
-    0x3e2, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
-    0x3e4, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
-    0x3e4, /* U+0003e5: COPTIC SMALL LETTER FEI*/
-    0x3e6, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
-    0x3e6, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
-    0x3e8, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
-    0x3e8, /* U+0003e9: COPTIC SMALL LETTER HORI*/
-    0x3ea, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
-    0x3ea, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
-    0x3ec, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
-    0x3ec, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
-    0x3ee, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
-    0x3ee, /* U+0003ef: COPTIC SMALL LETTER DEI*/
-    0x39a, /* U+0003f0: GREEK KAPPA SYMBOL*/
-    0x3a1, /* U+0003f1: GREEK RHO SYMBOL*/
-    0x3f9, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
-    0x3f3, /* U+0003f3: GREEK LETTER YOT*/
-    0x3f4, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
-    0x395, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
-    0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
-    0x3f7, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
-    0x3f7, /* U+0003f8: GREEK SMALL LETTER SHO*/
-    0x3f9, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
-    0x3fa, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
-    0x3fa, /* U+0003fb: GREEK SMALL LETTER SAN*/
-    0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
-    0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
-    0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
-    0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
-    0x400, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
-    0x401, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
-    0x402, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
-    0x403, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
-    0x404, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
-    0x405, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
-    0x406, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
-    0x407, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
-    0x408, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
-    0x409, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
-    0x40a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
-    0x40b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
-    0x40c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
-    0x40d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
-    0x40e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
-    0x40f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
-    0x410, /* U+000410: CYRILLIC CAPITAL LETTER A*/
-    0x411, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
-    0x412, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
-    0x413, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
-    0x414, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
-    0x415, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
-    0x416, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
-    0x417, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
-    0x418, /* U+000418: CYRILLIC CAPITAL LETTER I*/
-    0x419, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
-    0x41a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
-    0x41b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
-    0x41c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
-    0x41d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
-    0x41e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
-    0x41f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
-    0x420, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
-    0x421, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
-    0x422, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
-    0x423, /* U+000423: CYRILLIC CAPITAL LETTER U*/
-    0x424, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
-    0x425, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
-    0x426, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
-    0x427, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
-    0x428, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
-    0x429, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
-    0x42a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
-    0x42b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
-    0x42c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
-    0x42d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
-    0x42e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
-    0x42f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
-    0x410, /* U+000430: CYRILLIC SMALL LETTER A*/
-    0x411, /* U+000431: CYRILLIC SMALL LETTER BE*/
-    0x412, /* U+000432: CYRILLIC SMALL LETTER VE*/
-    0x413, /* U+000433: CYRILLIC SMALL LETTER GHE*/
-    0x414, /* U+000434: CYRILLIC SMALL LETTER DE*/
-    0x415, /* U+000435: CYRILLIC SMALL LETTER IE*/
-    0x416, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
-    0x417, /* U+000437: CYRILLIC SMALL LETTER ZE*/
-    0x418, /* U+000438: CYRILLIC SMALL LETTER I*/
-    0x419, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
-    0x41a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
-    0x41b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
-    0x41c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
-    0x41d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
-    0x41e, /* U+00043e: CYRILLIC SMALL LETTER O*/
-    0x41f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
-    0x420, /* U+000440: CYRILLIC SMALL LETTER ER*/
-    0x421, /* U+000441: CYRILLIC SMALL LETTER ES*/
-    0x422, /* U+000442: CYRILLIC SMALL LETTER TE*/
-    0x423, /* U+000443: CYRILLIC SMALL LETTER U*/
-    0x424, /* U+000444: CYRILLIC SMALL LETTER EF*/
-    0x425, /* U+000445: CYRILLIC SMALL LETTER HA*/
-    0x426, /* U+000446: CYRILLIC SMALL LETTER TSE*/
-    0x427, /* U+000447: CYRILLIC SMALL LETTER CHE*/
-    0x428, /* U+000448: CYRILLIC SMALL LETTER SHA*/
-    0x429, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
-    0x42a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
-    0x42b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
-    0x42c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
-    0x42d, /* U+00044d: CYRILLIC SMALL LETTER E*/
-    0x42e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
-    0x42f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
-    0x400, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
-    0x401, /* U+000451: CYRILLIC SMALL LETTER IO*/
-    0x402, /* U+000452: CYRILLIC SMALL LETTER DJE*/
-    0x403, /* U+000453: CYRILLIC SMALL LETTER GJE*/
-    0x404, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
-    0x405, /* U+000455: CYRILLIC SMALL LETTER DZE*/
-    0x406, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
-    0x407, /* U+000457: CYRILLIC SMALL LETTER YI*/
-    0x408, /* U+000458: CYRILLIC SMALL LETTER JE*/
-    0x409, /* U+000459: CYRILLIC SMALL LETTER LJE*/
-    0x40a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
-    0x40b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
-    0x40c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
-    0x40d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
-    0x40e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
-    0x40f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
-    0x460, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
-    0x460, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
-    0x462, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
-    0x462, /* U+000463: CYRILLIC SMALL LETTER YAT*/
-    0x464, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
-    0x464, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
-    0x466, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
-    0x466, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
-    0x468, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
-    0x468, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
-    0x46a, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
-    0x46a, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
-    0x46c, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
-    0x46c, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
-    0x46e, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
-    0x46e, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
-    0x470, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
-    0x470, /* U+000471: CYRILLIC SMALL LETTER PSI*/
-    0x472, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
-    0x472, /* U+000473: CYRILLIC SMALL LETTER FITA*/
-    0x474, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
-    0x474, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
-    0x476, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-    0x476, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-    0x478, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
-    0x478, /* U+000479: CYRILLIC SMALL LETTER UK*/
-    0x47a, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
-    0x47a, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
-    0x47c, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
-    0x47c, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
-    0x47e, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
-    0x47e, /* U+00047f: CYRILLIC SMALL LETTER OT*/
-    0x480, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
-    0x480, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
-    0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
-    0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
-    0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
-    0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
-    0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
-    0x487, /* U+000487: */
-    0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
-    0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
-    0x48a, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
-    0x48a, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
-    0x48c, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
-    0x48c, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
-    0x48e, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
-    0x48e, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
-    0x490, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
-    0x490, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
-    0x492, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
-    0x492, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
-    0x494, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
-    0x494, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
-    0x496, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
-    0x496, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
-    0x498, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
-    0x498, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
-    0x49a, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
-    0x49a, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
-    0x49c, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
-    0x49c, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
-    0x49e, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
-    0x49e, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
-    0x4a0, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
-    0x4a0, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
-    0x4a2, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
-    0x4a2, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
-    0x4a4, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
-    0x4a4, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
-    0x4a6, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
-    0x4a6, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
-    0x4a8, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
-    0x4a8, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
-    0x4aa, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
-    0x4aa, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
-    0x4ac, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
-    0x4ac, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
-    0x4ae, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
-    0x4ae, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
-    0x4b0, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
-    0x4b0, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
-    0x4b2, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
-    0x4b2, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
-    0x4b4, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
-    0x4b4, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
-    0x4b6, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
-    0x4b6, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
-    0x4b8, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
-    0x4b8, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
-    0x4ba, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
-    0x4ba, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
-    0x4bc, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
-    0x4bc, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
-    0x4be, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
-    0x4be, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
-    0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
-    0x4c1, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
-    0x4c1, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
-    0x4c3, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
-    0x4c3, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
-    0x4c5, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
-    0x4c5, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
-    0x4c7, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
-    0x4c7, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
-    0x4c9, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
-    0x4c9, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
-    0x4cb, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
-    0x4cb, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
-    0x4cd, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
-    0x4cd, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
-    0x4cf, /* U+0004cf: */
-    0x4d0, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
-    0x4d0, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
-    0x4d2, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
-    0x4d2, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
-    0x4d4, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
-    0x4d4, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
-    0x4d6, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
-    0x4d6, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
-    0x4d8, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
-    0x4d8, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
-    0x4da, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
-    0x4da, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
-    0x4dc, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
-    0x4dc, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
-    0x4de, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
-    0x4de, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
-    0x4e0, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
-    0x4e0, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
-    0x4e2, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
-    0x4e2, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
-    0x4e4, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
-    0x4e4, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
-    0x4e6, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
-    0x4e6, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
-    0x4e8, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
-    0x4e8, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
-    0x4ea, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
-    0x4ea, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
-    0x4ec, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
-    0x4ec, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
-    0x4ee, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
-    0x4ee, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
-    0x4f0, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
-    0x4f0, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
-    0x4f2, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
-    0x4f2, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
-    0x4f4, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
-    0x4f4, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
-    0x4f6, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
-    0x4f6, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
-    0x4f8, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
-    0x4f8, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
-    0x4fa, /* U+0004fa: */
-    0x4fb, /* U+0004fb: */
-    0x4fc, /* U+0004fc: */
-    0x4fd, /* U+0004fd: */
-    0x4fe, /* U+0004fe: */
-    0x4ff, /* U+0004ff: */
-    0x500, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
-    0x500, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
-    0x502, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
-    0x502, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
-    0x504, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
-    0x504, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
-    0x506, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
-    0x506, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
-    0x508, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
-    0x508, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
-    0x50a, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
-    0x50a, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
-    0x50c, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
-    0x50c, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
-    0x50e, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
-    0x50e, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
-    0x510, /* U+000510: */
-    0x511, /* U+000511: */
-    0x512, /* U+000512: */
-    0x513, /* U+000513: */
-    0x514, /* U+000514: */
-    0x515, /* U+000515: */
-    0x516, /* U+000516: */
-    0x517, /* U+000517: */
-    0x518, /* U+000518: */
-    0x519, /* U+000519: */
-    0x51a, /* U+00051a: */
-    0x51b, /* U+00051b: */
-    0x51c, /* U+00051c: */
-    0x51d, /* U+00051d: */
-    0x51e, /* U+00051e: */
-    0x51f, /* U+00051f: */
-    0x520, /* U+000520: */
-    0x521, /* U+000521: */
-    0x522, /* U+000522: */
-    0x523, /* U+000523: */
-    0x524, /* U+000524: */
-    0x525, /* U+000525: */
-    0x526, /* U+000526: */
-    0x527, /* U+000527: */
-    0x528, /* U+000528: */
-    0x529, /* U+000529: */
-    0x52a, /* U+00052a: */
-    0x52b, /* U+00052b: */
-    0x52c, /* U+00052c: */
-    0x52d, /* U+00052d: */
-    0x52e, /* U+00052e: */
-    0x52f, /* U+00052f: */
-    0x530, /* U+000530: */
-    0x531, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
-    0x532, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
-    0x533, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
-    0x534, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
-    0x535, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
-    0x536, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
-    0x537, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
-    0x538, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
-    0x539, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
-    0x53a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
-    0x53b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
-    0x53c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
-    0x53d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
-    0x53e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
-    0x53f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
-    0x540, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
-    0x541, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
-    0x542, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
-    0x543, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
-    0x544, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
-    0x545, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
-    0x546, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
-    0x547, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
-    0x548, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
-    0x549, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
-    0x54a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
-    0x54b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
-    0x54c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
-    0x54d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
-    0x54e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
-    0x54f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
-    0x550, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
-    0x551, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
-    0x552, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
-    0x553, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
-    0x554, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
-    0x555, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
-    0x556, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
-    0x557, /* U+000557: */
-    0x558, /* U+000558: */
-    0x559, /* U+000559: ARMENIAN MODIFIER LETTER LEFT HALF RING*/
-    0x55a, /* U+00055a: ARMENIAN APOSTROPHE*/
-    0x55b, /* U+00055b: ARMENIAN EMPHASIS MARK*/
-    0x55c, /* U+00055c: ARMENIAN EXCLAMATION MARK*/
-    0x55d, /* U+00055d: ARMENIAN COMMA*/
-    0x55e, /* U+00055e: ARMENIAN QUESTION MARK*/
-    0x55f, /* U+00055f: ARMENIAN ABBREVIATION MARK*/
-    0x560, /* U+000560: */
-    0x531, /* U+000561: ARMENIAN SMALL LETTER AYB*/
-    0x532, /* U+000562: ARMENIAN SMALL LETTER BEN*/
-    0x533, /* U+000563: ARMENIAN SMALL LETTER GIM*/
-    0x534, /* U+000564: ARMENIAN SMALL LETTER DA*/
-    0x535, /* U+000565: ARMENIAN SMALL LETTER ECH*/
-    0x536, /* U+000566: ARMENIAN SMALL LETTER ZA*/
-    0x537, /* U+000567: ARMENIAN SMALL LETTER EH*/
-    0x538, /* U+000568: ARMENIAN SMALL LETTER ET*/
-    0x539, /* U+000569: ARMENIAN SMALL LETTER TO*/
-    0x53a, /* U+00056a: ARMENIAN SMALL LETTER ZHE*/
-    0x53b, /* U+00056b: ARMENIAN SMALL LETTER INI*/
-    0x53c, /* U+00056c: ARMENIAN SMALL LETTER LIWN*/
-    0x53d, /* U+00056d: ARMENIAN SMALL LETTER XEH*/
-    0x53e, /* U+00056e: ARMENIAN SMALL LETTER CA*/
-    0x53f, /* U+00056f: ARMENIAN SMALL LETTER KEN*/
-    0x540, /* U+000570: ARMENIAN SMALL LETTER HO*/
-    0x541, /* U+000571: ARMENIAN SMALL LETTER JA*/
-    0x542, /* U+000572: ARMENIAN SMALL LETTER GHAD*/
-    0x543, /* U+000573: ARMENIAN SMALL LETTER CHEH*/
-    0x544, /* U+000574: ARMENIAN SMALL LETTER MEN*/
-    0x545, /* U+000575: ARMENIAN SMALL LETTER YI*/
-    0x546, /* U+000576: ARMENIAN SMALL LETTER NOW*/
-    0x547, /* U+000577: ARMENIAN SMALL LETTER SHA*/
-    0x548, /* U+000578: ARMENIAN SMALL LETTER VO*/
-    0x549, /* U+000579: ARMENIAN SMALL LETTER CHA*/
-    0x54a, /* U+00057a: ARMENIAN SMALL LETTER PEH*/
-    0x54b, /* U+00057b: ARMENIAN SMALL LETTER JHEH*/
-    0x54c, /* U+00057c: ARMENIAN SMALL LETTER RA*/
-    0x54d, /* U+00057d: ARMENIAN SMALL LETTER SEH*/
-    0x54e, /* U+00057e: ARMENIAN SMALL LETTER VEW*/
-    0x54f, /* U+00057f: ARMENIAN SMALL LETTER TIWN*/
-    0x550, /* U+000580: ARMENIAN SMALL LETTER REH*/
-    0x551, /* U+000581: ARMENIAN SMALL LETTER CO*/
-    0x552, /* U+000582: ARMENIAN SMALL LETTER YIWN*/
-    0x553, /* U+000583: ARMENIAN SMALL LETTER PIWR*/
-    0x554, /* U+000584: ARMENIAN SMALL LETTER KEH*/
-    0x555, /* U+000585: ARMENIAN SMALL LETTER OH*/
-    0x556, /* U+000586: ARMENIAN SMALL LETTER FEH*/
-};
-
-static const RTUNICP g_afRTUniUpper0x001e01[] =
-{
-    0x1e00, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
-    0x1e02, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
-    0x1e02, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
-    0x1e04, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
-    0x1e04, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
-    0x1e06, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
-    0x1e06, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
-    0x1e08, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
-    0x1e08, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
-    0x1e0a, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
-    0x1e0a, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
-    0x1e0c, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
-    0x1e0c, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
-    0x1e0e, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
-    0x1e0e, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
-    0x1e10, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
-    0x1e10, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
-    0x1e12, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
-    0x1e12, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
-    0x1e14, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
-    0x1e14, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
-    0x1e16, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
-    0x1e16, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
-    0x1e18, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
-    0x1e18, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
-    0x1e1a, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
-    0x1e1a, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
-    0x1e1c, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
-    0x1e1c, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
-    0x1e1e, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
-    0x1e1e, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
-    0x1e20, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
-    0x1e20, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
-    0x1e22, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
-    0x1e22, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
-    0x1e24, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
-    0x1e24, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
-    0x1e26, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
-    0x1e26, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
-    0x1e28, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
-    0x1e28, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
-    0x1e2a, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
-    0x1e2a, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
-    0x1e2c, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
-    0x1e2c, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
-    0x1e2e, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
-    0x1e2e, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
-    0x1e30, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
-    0x1e30, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
-    0x1e32, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
-    0x1e32, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
-    0x1e34, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
-    0x1e34, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
-    0x1e36, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
-    0x1e36, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
-    0x1e38, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
-    0x1e38, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
-    0x1e3a, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
-    0x1e3a, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
-    0x1e3c, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
-    0x1e3c, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
-    0x1e3e, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
-    0x1e3e, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
-    0x1e40, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
-    0x1e40, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
-    0x1e42, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
-    0x1e42, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
-    0x1e44, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
-    0x1e44, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
-    0x1e46, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
-    0x1e46, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
-    0x1e48, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
-    0x1e48, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
-    0x1e4a, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
-    0x1e4a, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
-    0x1e4c, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
-    0x1e4c, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
-    0x1e4e, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
-    0x1e4e, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
-    0x1e50, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
-    0x1e50, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
-    0x1e52, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
-    0x1e52, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
-    0x1e54, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
-    0x1e54, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
-    0x1e56, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
-    0x1e56, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
-    0x1e58, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
-    0x1e58, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
-    0x1e5a, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
-    0x1e5a, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
-    0x1e5c, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
-    0x1e5c, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
-    0x1e5e, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
-    0x1e5e, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
-    0x1e60, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
-    0x1e60, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
-    0x1e62, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
-    0x1e62, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
-    0x1e64, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
-    0x1e64, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
-    0x1e66, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
-    0x1e66, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
-    0x1e68, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-    0x1e68, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-    0x1e6a, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
-    0x1e6a, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
-    0x1e6c, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
-    0x1e6c, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
-    0x1e6e, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
-    0x1e6e, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
-    0x1e70, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
-    0x1e70, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
-    0x1e72, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
-    0x1e72, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
-    0x1e74, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
-    0x1e74, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
-    0x1e76, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
-    0x1e76, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
-    0x1e78, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
-    0x1e78, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
-    0x1e7a, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
-    0x1e7a, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
-    0x1e7c, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
-    0x1e7c, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
-    0x1e7e, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
-    0x1e7e, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
-    0x1e80, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
-    0x1e80, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
-    0x1e82, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
-    0x1e82, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
-    0x1e84, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
-    0x1e84, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
-    0x1e86, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
-    0x1e86, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
-    0x1e88, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
-    0x1e88, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
-    0x1e8a, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
-    0x1e8a, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
-    0x1e8c, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
-    0x1e8c, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
-    0x1e8e, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
-    0x1e8e, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
-    0x1e90, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
-    0x1e90, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
-    0x1e92, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
-    0x1e92, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
-    0x1e94, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
-    0x1e94, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
-    0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
-    0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
-    0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
-    0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
-    0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
-    0x1e60, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
-    0x1e9c, /* U+001e9c: */
-    0x1e9d, /* U+001e9d: */
-    0x1e9e, /* U+001e9e: */
-    0x1e9f, /* U+001e9f: */
-    0x1ea0, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
-    0x1ea0, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
-    0x1ea2, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
-    0x1ea2, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
-    0x1ea4, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-    0x1ea4, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-    0x1ea6, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-    0x1ea6, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-    0x1ea8, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ea8, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1eaa, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
-    0x1eaa, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
-    0x1eac, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1eac, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1eae, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
-    0x1eae, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
-    0x1eb0, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
-    0x1eb0, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
-    0x1eb2, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
-    0x1eb2, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
-    0x1eb4, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
-    0x1eb4, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
-    0x1eb6, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
-    0x1eb6, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
-    0x1eb8, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
-    0x1eb8, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
-    0x1eba, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
-    0x1eba, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
-    0x1ebc, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
-    0x1ebc, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
-    0x1ebe, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-    0x1ebe, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-    0x1ec0, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-    0x1ec0, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-    0x1ec2, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ec2, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ec4, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
-    0x1ec4, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
-    0x1ec6, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ec6, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ec8, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
-    0x1ec8, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
-    0x1eca, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
-    0x1eca, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
-    0x1ecc, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
-    0x1ecc, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
-    0x1ece, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
-    0x1ece, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
-    0x1ed0, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-    0x1ed0, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-    0x1ed2, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-    0x1ed2, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-    0x1ed4, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ed4, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ed6, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
-    0x1ed6, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
-    0x1ed8, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ed8, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1eda, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
-    0x1eda, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
-    0x1edc, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
-    0x1edc, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
-    0x1ede, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
-    0x1ede, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
-    0x1ee0, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
-    0x1ee0, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
-    0x1ee2, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
-    0x1ee2, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
-    0x1ee4, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
-    0x1ee4, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
-    0x1ee6, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
-    0x1ee6, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
-    0x1ee8, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
-    0x1ee8, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
-    0x1eea, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
-    0x1eea, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
-    0x1eec, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
-    0x1eec, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
-    0x1eee, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
-    0x1eee, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
-    0x1ef0, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
-    0x1ef0, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
-    0x1ef2, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
-    0x1ef2, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
-    0x1ef4, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
-    0x1ef4, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
-    0x1ef6, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
-    0x1ef6, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
-    0x1ef8, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
-    0x1ef8, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
-    0x1efa, /* U+001efa: */
-    0x1efb, /* U+001efb: */
-    0x1efc, /* U+001efc: */
-    0x1efd, /* U+001efd: */
-    0x1efe, /* U+001efe: */
-    0x1eff, /* U+001eff: */
-    0x1f08, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
-    0x1f09, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
-    0x1f0a, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
-    0x1f0b, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
-    0x1f0c, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
-    0x1f0d, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
-    0x1f0e, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-    0x1f0f, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-    0x1f08, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
-    0x1f09, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
-    0x1f0a, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
-    0x1f0b, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
-    0x1f0c, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
-    0x1f0d, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
-    0x1f0e, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-    0x1f0f, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-    0x1f18, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
-    0x1f19, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
-    0x1f1a, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
-    0x1f1b, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
-    0x1f1c, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
-    0x1f1d, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
-    0x1f16, /* U+001f16: */
-    0x1f17, /* U+001f17: */
-    0x1f18, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
-    0x1f19, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
-    0x1f1a, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
-    0x1f1b, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
-    0x1f1c, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
-    0x1f1d, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
-    0x1f1e, /* U+001f1e: */
-    0x1f1f, /* U+001f1f: */
-    0x1f28, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
-    0x1f29, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
-    0x1f2a, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
-    0x1f2b, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
-    0x1f2c, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
-    0x1f2d, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
-    0x1f2e, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
-    0x1f2f, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
-    0x1f28, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
-    0x1f29, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
-    0x1f2a, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
-    0x1f2b, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
-    0x1f2c, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
-    0x1f2d, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
-    0x1f2e, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
-    0x1f2f, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
-    0x1f38, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
-    0x1f39, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
-    0x1f3a, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
-    0x1f3b, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
-    0x1f3c, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
-    0x1f3d, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
-    0x1f3e, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-    0x1f3f, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-    0x1f38, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
-    0x1f39, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
-    0x1f3a, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
-    0x1f3b, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
-    0x1f3c, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
-    0x1f3d, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
-    0x1f3e, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-    0x1f3f, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-    0x1f48, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
-    0x1f49, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
-    0x1f4a, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
-    0x1f4b, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
-    0x1f4c, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
-    0x1f4d, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
-    0x1f46, /* U+001f46: */
-    0x1f47, /* U+001f47: */
-    0x1f48, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
-    0x1f49, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
-    0x1f4a, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
-    0x1f4b, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
-    0x1f4c, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
-    0x1f4d, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
-    0x1f4e, /* U+001f4e: */
-    0x1f4f, /* U+001f4f: */
-    0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
-    0x1f59, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
-    0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
-    0x1f5b, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
-    0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
-    0x1f5d, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
-    0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
-    0x1f5f, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-    0x1f58, /* U+001f58: */
-    0x1f59, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
-    0x1f5a, /* U+001f5a: */
-    0x1f5b, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
-    0x1f5c, /* U+001f5c: */
-    0x1f5d, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
-    0x1f5e, /* U+001f5e: */
-    0x1f5f, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-    0x1f68, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
-    0x1f69, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
-    0x1f6a, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
-    0x1f6b, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
-    0x1f6c, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
-    0x1f6d, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
-    0x1f6e, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-    0x1f6f, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-    0x1f68, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
-    0x1f69, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
-    0x1f6a, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
-    0x1f6b, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
-    0x1f6c, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
-    0x1f6d, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
-    0x1f6e, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-    0x1f6f, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-    0x1fba, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
-    0x1fbb, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
-    0x1fc8, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
-    0x1fc9, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
-    0x1fca, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
-    0x1fcb, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
-    0x1fda, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
-    0x1fdb, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
-    0x1ff8, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
-    0x1ff9, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
-    0x1fea, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
-    0x1feb, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
-    0x1ffa, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
-    0x1ffb, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
-    0x1f7e, /* U+001f7e: */
-    0x1f7f, /* U+001f7f: */
-    0x1f88, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1f89, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1f8a, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1f8b, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1f8c, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1f8d, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1f8e, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f8f, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f88, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1f89, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1f8a, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1f8b, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1f8c, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1f8d, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1f8e, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f8f, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f98, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1f99, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1f9a, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1f9b, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1f9c, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1f9d, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1f9e, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f9f, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f98, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1f99, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1f9a, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1f9b, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1f9c, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1f9d, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1f9e, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f9f, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1fa8, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1fa9, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1faa, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1fab, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1fac, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1fad, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1fae, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1faf, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fa8, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1fa9, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1faa, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1fab, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1fac, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1fad, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1fae, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1faf, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1fb8, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
-    0x1fb9, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
-    0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1fbc, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
-    0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1fb5, /* U+001fb5: */
-    0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
-    0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fb8, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
-    0x1fb9, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
-    0x1fba, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
-    0x1fbb, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
-    0x1fbc, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
-    0x1fbd, /* U+001fbd: GREEK KORONIS*/
-    0x399, /* U+001fbe: GREEK PROSGEGRAMMENI*/
-    0x1fbf, /* U+001fbf: GREEK PSILI*/
-    0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
-    0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
-    0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1fcc, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
-    0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1fc5, /* U+001fc5: */
-    0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
-    0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fc8, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
-    0x1fc9, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
-    0x1fca, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
-    0x1fcb, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
-    0x1fcc, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
-    0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
-    0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
-    0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
-    0x1fd8, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
-    0x1fd9, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
-    0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
-    0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
-    0x1fd4, /* U+001fd4: */
-    0x1fd5, /* U+001fd5: */
-    0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
-    0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
-    0x1fd8, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
-    0x1fd9, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
-    0x1fda, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
-    0x1fdb, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
-    0x1fdc, /* U+001fdc: */
-    0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
-    0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
-    0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
-    0x1fe8, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
-    0x1fe9, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
-    0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
-    0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
-    0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
-    0x1fec, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
-    0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
-    0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
-    0x1fe8, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
-    0x1fe9, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
-    0x1fea, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
-    0x1feb, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
-    0x1fec, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
-    0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
-    0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
-    0x1fef, /* U+001fef: GREEK VARIA*/
-    0x1ff0, /* U+001ff0: */
-    0x1ff1, /* U+001ff1: */
-    0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1ffc, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
-    0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1ff5, /* U+001ff5: */
-    0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
-    0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1ff8, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
-    0x1ff9, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
-    0x1ffa, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
-    0x1ffb, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
-    0x1ffc, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
-    0x1ffd, /* U+001ffd: GREEK OXIA*/
-    0x1ffe, /* U+001ffe: GREEK DASIA*/
-    0x1fff, /* U+001fff: */
-    0x2000, /* U+002000: EN QUAD*/
-    0x2001, /* U+002001: EM QUAD*/
-    0x2002, /* U+002002: EN SPACE*/
-    0x2003, /* U+002003: EM SPACE*/
-    0x2004, /* U+002004: THREE-PER-EM SPACE*/
-    0x2005, /* U+002005: FOUR-PER-EM SPACE*/
-    0x2006, /* U+002006: SIX-PER-EM SPACE*/
-    0x2007, /* U+002007: FIGURE SPACE*/
-    0x2008, /* U+002008: PUNCTUATION SPACE*/
-    0x2009, /* U+002009: THIN SPACE*/
-    0x200a, /* U+00200a: HAIR SPACE*/
-    0x200b, /* U+00200b: ZERO WIDTH SPACE*/
-    0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
-    0x200d, /* U+00200d: ZERO WIDTH JOINER*/
-    0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
-    0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
-    0x2010, /* U+002010: HYPHEN*/
-    0x2011, /* U+002011: NON-BREAKING HYPHEN*/
-    0x2012, /* U+002012: FIGURE DASH*/
-    0x2013, /* U+002013: EN DASH*/
-    0x2014, /* U+002014: EM DASH*/
-    0x2015, /* U+002015: HORIZONTAL BAR*/
-    0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
-    0x2017, /* U+002017: DOUBLE LOW LINE*/
-    0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
-    0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
-    0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
-    0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
-    0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
-    0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
-    0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
-    0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
-    0x2020, /* U+002020: DAGGER*/
-    0x2021, /* U+002021: DOUBLE DAGGER*/
-    0x2022, /* U+002022: BULLET*/
-    0x2023, /* U+002023: TRIANGULAR BULLET*/
-    0x2024, /* U+002024: ONE DOT LEADER*/
-    0x2025, /* U+002025: TWO DOT LEADER*/
-    0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
-    0x2027, /* U+002027: HYPHENATION POINT*/
-    0x2028, /* U+002028: LINE SEPARATOR*/
-    0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
-    0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
-    0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
-    0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
-    0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
-    0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
-    0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
-    0x2030, /* U+002030: PER MILLE SIGN*/
-    0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
-    0x2032, /* U+002032: PRIME*/
-    0x2033, /* U+002033: DOUBLE PRIME*/
-    0x2034, /* U+002034: TRIPLE PRIME*/
-    0x2035, /* U+002035: REVERSED PRIME*/
-    0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
-    0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
-    0x2038, /* U+002038: CARET*/
-    0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
-    0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
-    0x203b, /* U+00203b: REFERENCE MARK*/
-    0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
-    0x203d, /* U+00203d: INTERROBANG*/
-    0x203e, /* U+00203e: OVERLINE*/
-    0x203f, /* U+00203f: UNDERTIE*/
-    0x2040, /* U+002040: CHARACTER TIE*/
-    0x2041, /* U+002041: CARET INSERTION POINT*/
-    0x2042, /* U+002042: ASTERISM*/
-    0x2043, /* U+002043: HYPHEN BULLET*/
-    0x2044, /* U+002044: FRACTION SLASH*/
-    0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
-    0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
-    0x2047, /* U+002047: DOUBLE QUESTION MARK*/
-    0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
-    0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
-    0x204a, /* U+00204a: TIRONIAN SIGN ET*/
-    0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
-    0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
-    0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
-    0x204e, /* U+00204e: LOW ASTERISK*/
-    0x204f, /* U+00204f: REVERSED SEMICOLON*/
-    0x2050, /* U+002050: CLOSE UP*/
-    0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
-    0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
-    0x2053, /* U+002053: SWUNG DASH*/
-    0x2054, /* U+002054: INVERTED UNDERTIE*/
-    0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
-    0x2056, /* U+002056: THREE DOT PUNCTUATION*/
-    0x2057, /* U+002057: QUADRUPLE PRIME*/
-    0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
-    0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
-    0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
-    0x205b, /* U+00205b: FOUR DOT MARK*/
-    0x205c, /* U+00205c: DOTTED CROSS*/
-    0x205d, /* U+00205d: TRICOLON*/
-    0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
-    0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
-    0x2060, /* U+002060: WORD JOINER*/
-    0x2061, /* U+002061: FUNCTION APPLICATION*/
-    0x2062, /* U+002062: INVISIBLE TIMES*/
-    0x2063, /* U+002063: INVISIBLE SEPARATOR*/
-    0x2064, /* U+002064: */
-    0x2065, /* U+002065: */
-    0x2066, /* U+002066: */
-    0x2067, /* U+002067: */
-    0x2068, /* U+002068: */
-    0x2069, /* U+002069: */
-    0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
-    0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
-    0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
-    0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
-    0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
-    0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
-    0x2070, /* U+002070: SUPERSCRIPT ZERO*/
-    0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
-    0x2072, /* U+002072: */
-    0x2073, /* U+002073: */
-    0x2074, /* U+002074: SUPERSCRIPT FOUR*/
-    0x2075, /* U+002075: SUPERSCRIPT FIVE*/
-    0x2076, /* U+002076: SUPERSCRIPT SIX*/
-    0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
-    0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
-    0x2079, /* U+002079: SUPERSCRIPT NINE*/
-    0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
-    0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
-    0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
-    0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
-    0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
-    0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
-    0x2080, /* U+002080: SUBSCRIPT ZERO*/
-    0x2081, /* U+002081: SUBSCRIPT ONE*/
-    0x2082, /* U+002082: SUBSCRIPT TWO*/
-    0x2083, /* U+002083: SUBSCRIPT THREE*/
-    0x2084, /* U+002084: SUBSCRIPT FOUR*/
-    0x2085, /* U+002085: SUBSCRIPT FIVE*/
-    0x2086, /* U+002086: SUBSCRIPT SIX*/
-    0x2087, /* U+002087: SUBSCRIPT SEVEN*/
-    0x2088, /* U+002088: SUBSCRIPT EIGHT*/
-    0x2089, /* U+002089: SUBSCRIPT NINE*/
-    0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
-    0x208b, /* U+00208b: SUBSCRIPT MINUS*/
-    0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
-    0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
-    0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
-    0x208f, /* U+00208f: */
-    0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
-    0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
-    0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
-    0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
-    0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
-    0x2095, /* U+002095: */
-    0x2096, /* U+002096: */
-    0x2097, /* U+002097: */
-    0x2098, /* U+002098: */
-    0x2099, /* U+002099: */
-    0x209a, /* U+00209a: */
-    0x209b, /* U+00209b: */
-    0x209c, /* U+00209c: */
-    0x209d, /* U+00209d: */
-    0x209e, /* U+00209e: */
-    0x209f, /* U+00209f: */
-    0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
-    0x20a1, /* U+0020a1: COLON SIGN*/
-    0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
-    0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
-    0x20a4, /* U+0020a4: LIRA SIGN*/
-    0x20a5, /* U+0020a5: MILL SIGN*/
-    0x20a6, /* U+0020a6: NAIRA SIGN*/
-    0x20a7, /* U+0020a7: PESETA SIGN*/
-    0x20a8, /* U+0020a8: RUPEE SIGN*/
-    0x20a9, /* U+0020a9: WON SIGN*/
-    0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
-    0x20ab, /* U+0020ab: DONG SIGN*/
-    0x20ac, /* U+0020ac: EURO SIGN*/
-    0x20ad, /* U+0020ad: KIP SIGN*/
-    0x20ae, /* U+0020ae: TUGRIK SIGN*/
-    0x20af, /* U+0020af: DRACHMA SIGN*/
-    0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
-    0x20b1, /* U+0020b1: PESO SIGN*/
-    0x20b2, /* U+0020b2: GUARANI SIGN*/
-    0x20b3, /* U+0020b3: AUSTRAL SIGN*/
-    0x20b4, /* U+0020b4: HRYVNIA SIGN*/
-    0x20b5, /* U+0020b5: CEDI SIGN*/
-    0x20b6, /* U+0020b6: */
-    0x20b7, /* U+0020b7: */
-    0x20b8, /* U+0020b8: */
-    0x20b9, /* U+0020b9: */
-    0x20ba, /* U+0020ba: */
-    0x20bb, /* U+0020bb: */
-    0x20bc, /* U+0020bc: */
-    0x20bd, /* U+0020bd: */
-    0x20be, /* U+0020be: */
-    0x20bf, /* U+0020bf: */
-    0x20c0, /* U+0020c0: */
-    0x20c1, /* U+0020c1: */
-    0x20c2, /* U+0020c2: */
-    0x20c3, /* U+0020c3: */
-    0x20c4, /* U+0020c4: */
-    0x20c5, /* U+0020c5: */
-    0x20c6, /* U+0020c6: */
-    0x20c7, /* U+0020c7: */
-    0x20c8, /* U+0020c8: */
-    0x20c9, /* U+0020c9: */
-    0x20ca, /* U+0020ca: */
-    0x20cb, /* U+0020cb: */
-    0x20cc, /* U+0020cc: */
-    0x20cd, /* U+0020cd: */
-    0x20ce, /* U+0020ce: */
-    0x20cf, /* U+0020cf: */
-    0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
-    0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
-    0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
-    0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
-    0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
-    0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
-    0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
-    0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
-    0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
-    0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
-    0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
-    0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
-    0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
-    0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
-    0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
-    0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
-    0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
-    0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
-    0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
-    0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
-    0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
-    0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
-    0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
-    0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
-    0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
-    0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
-    0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
-    0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
-    0x20ec, /* U+0020ec: */
-    0x20ed, /* U+0020ed: */
-    0x20ee, /* U+0020ee: */
-    0x20ef, /* U+0020ef: */
-    0x20f0, /* U+0020f0: */
-    0x20f1, /* U+0020f1: */
-    0x20f2, /* U+0020f2: */
-    0x20f3, /* U+0020f3: */
-    0x20f4, /* U+0020f4: */
-    0x20f5, /* U+0020f5: */
-    0x20f6, /* U+0020f6: */
-    0x20f7, /* U+0020f7: */
-    0x20f8, /* U+0020f8: */
-    0x20f9, /* U+0020f9: */
-    0x20fa, /* U+0020fa: */
-    0x20fb, /* U+0020fb: */
-    0x20fc, /* U+0020fc: */
-    0x20fd, /* U+0020fd: */
-    0x20fe, /* U+0020fe: */
-    0x20ff, /* U+0020ff: */
-    0x2100, /* U+002100: ACCOUNT OF*/
-    0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
-    0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
-    0x2103, /* U+002103: DEGREE CELSIUS*/
-    0x2104, /* U+002104: CENTRE LINE SYMBOL*/
-    0x2105, /* U+002105: CARE OF*/
-    0x2106, /* U+002106: CADA UNA*/
-    0x2107, /* U+002107: EULER CONSTANT*/
-    0x2108, /* U+002108: SCRUPLE*/
-    0x2109, /* U+002109: DEGREE FAHRENHEIT*/
-    0x210a, /* U+00210a: SCRIPT SMALL G*/
-    0x210b, /* U+00210b: SCRIPT CAPITAL H*/
-    0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
-    0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
-    0x210e, /* U+00210e: PLANCK CONSTANT*/
-    0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
-    0x2110, /* U+002110: SCRIPT CAPITAL I*/
-    0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
-    0x2112, /* U+002112: SCRIPT CAPITAL L*/
-    0x2113, /* U+002113: SCRIPT SMALL L*/
-    0x2114, /* U+002114: L B BAR SYMBOL*/
-    0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
-    0x2116, /* U+002116: NUMERO SIGN*/
-    0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
-    0x2118, /* U+002118: SCRIPT CAPITAL P*/
-    0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
-    0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
-    0x211b, /* U+00211b: SCRIPT CAPITAL R*/
-    0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
-    0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
-    0x211e, /* U+00211e: PRESCRIPTION TAKE*/
-    0x211f, /* U+00211f: RESPONSE*/
-    0x2120, /* U+002120: SERVICE MARK*/
-    0x2121, /* U+002121: TELEPHONE SIGN*/
-    0x2122, /* U+002122: TRADE MARK SIGN*/
-    0x2123, /* U+002123: VERSICLE*/
-    0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
-    0x2125, /* U+002125: OUNCE SIGN*/
-    0x2126, /* U+002126: OHM SIGN*/
-    0x2127, /* U+002127: INVERTED OHM SIGN*/
-    0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
-    0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
-    0x212a, /* U+00212a: KELVIN SIGN*/
-    0x212b, /* U+00212b: ANGSTROM SIGN*/
-    0x212c, /* U+00212c: SCRIPT CAPITAL B*/
-    0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
-    0x212e, /* U+00212e: ESTIMATED SYMBOL*/
-    0x212f, /* U+00212f: SCRIPT SMALL E*/
-    0x2130, /* U+002130: SCRIPT CAPITAL E*/
-    0x2131, /* U+002131: SCRIPT CAPITAL F*/
-    0x2132, /* U+002132: TURNED CAPITAL F*/
-    0x2133, /* U+002133: SCRIPT CAPITAL M*/
-    0x2134, /* U+002134: SCRIPT SMALL O*/
-    0x2135, /* U+002135: ALEF SYMBOL*/
-    0x2136, /* U+002136: BET SYMBOL*/
-    0x2137, /* U+002137: GIMEL SYMBOL*/
-    0x2138, /* U+002138: DALET SYMBOL*/
-    0x2139, /* U+002139: INFORMATION SOURCE*/
-    0x213a, /* U+00213a: ROTATED CAPITAL Q*/
-    0x213b, /* U+00213b: FACSIMILE SIGN*/
-    0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
-    0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
-    0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
-    0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
-    0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
-    0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
-    0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
-    0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
-    0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
-    0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
-    0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
-    0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
-    0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
-    0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
-    0x214a, /* U+00214a: PROPERTY LINE*/
-    0x214b, /* U+00214b: TURNED AMPERSAND*/
-    0x214c, /* U+00214c: PER SIGN*/
-    0x214d, /* U+00214d: */
-    0x214e, /* U+00214e: */
-    0x214f, /* U+00214f: */
-    0x2150, /* U+002150: */
-    0x2151, /* U+002151: */
-    0x2152, /* U+002152: */
-    0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
-    0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
-    0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
-    0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
-    0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
-    0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
-    0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
-    0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
-    0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
-    0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
-    0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
-    0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
-    0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
-    0x2160, /* U+002160: ROMAN NUMERAL ONE*/
-    0x2161, /* U+002161: ROMAN NUMERAL TWO*/
-    0x2162, /* U+002162: ROMAN NUMERAL THREE*/
-    0x2163, /* U+002163: ROMAN NUMERAL FOUR*/
-    0x2164, /* U+002164: ROMAN NUMERAL FIVE*/
-    0x2165, /* U+002165: ROMAN NUMERAL SIX*/
-    0x2166, /* U+002166: ROMAN NUMERAL SEVEN*/
-    0x2167, /* U+002167: ROMAN NUMERAL EIGHT*/
-    0x2168, /* U+002168: ROMAN NUMERAL NINE*/
-    0x2169, /* U+002169: ROMAN NUMERAL TEN*/
-    0x216a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
-    0x216b, /* U+00216b: ROMAN NUMERAL TWELVE*/
-    0x216c, /* U+00216c: ROMAN NUMERAL FIFTY*/
-    0x216d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
-    0x216e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
-    0x216f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
-    0x2160, /* U+002170: SMALL ROMAN NUMERAL ONE*/
-    0x2161, /* U+002171: SMALL ROMAN NUMERAL TWO*/
-    0x2162, /* U+002172: SMALL ROMAN NUMERAL THREE*/
-    0x2163, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
-    0x2164, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
-    0x2165, /* U+002175: SMALL ROMAN NUMERAL SIX*/
-    0x2166, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
-    0x2167, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
-    0x2168, /* U+002178: SMALL ROMAN NUMERAL NINE*/
-    0x2169, /* U+002179: SMALL ROMAN NUMERAL TEN*/
-    0x216a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
-    0x216b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
-    0x216c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
-    0x216d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
-    0x216e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
-    0x216f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
-    0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
-    0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
-    0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
-    0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
-    0x2184, /* U+002184: */
-    0x2185, /* U+002185: */
-    0x2186, /* U+002186: */
-    0x2187, /* U+002187: */
-    0x2188, /* U+002188: */
-    0x2189, /* U+002189: */
-    0x218a, /* U+00218a: */
-    0x218b, /* U+00218b: */
-    0x218c, /* U+00218c: */
-    0x218d, /* U+00218d: */
-    0x218e, /* U+00218e: */
-    0x218f, /* U+00218f: */
-    0x2190, /* U+002190: LEFTWARDS ARROW*/
-    0x2191, /* U+002191: UPWARDS ARROW*/
-    0x2192, /* U+002192: RIGHTWARDS ARROW*/
-    0x2193, /* U+002193: DOWNWARDS ARROW*/
-    0x2194, /* U+002194: LEFT RIGHT ARROW*/
-    0x2195, /* U+002195: UP DOWN ARROW*/
-    0x2196, /* U+002196: NORTH WEST ARROW*/
-    0x2197, /* U+002197: NORTH EAST ARROW*/
-    0x2198, /* U+002198: SOUTH EAST ARROW*/
-    0x2199, /* U+002199: SOUTH WEST ARROW*/
-    0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
-    0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
-    0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
-    0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
-    0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
-    0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
-    0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
-    0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
-    0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
-    0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
-    0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
-    0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
-    0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
-    0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
-    0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
-    0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
-    0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
-    0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
-    0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
-    0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
-    0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
-    0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
-    0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
-    0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
-    0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
-    0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
-    0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
-    0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
-    0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
-    0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
-    0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
-    0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
-    0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
-    0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
-    0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
-    0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
-    0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
-    0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
-    0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
-    0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
-    0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
-    0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
-    0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
-    0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
-    0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
-    0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
-    0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
-    0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
-    0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
-    0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
-    0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
-    0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
-    0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
-    0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
-    0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
-    0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
-    0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
-    0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
-    0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
-    0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
-    0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
-    0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
-    0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
-    0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
-    0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
-    0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
-    0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
-    0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
-    0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
-    0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
-    0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
-    0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
-    0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
-    0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
-    0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
-    0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
-    0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
-    0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
-    0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
-    0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
-    0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
-    0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
-    0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
-    0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
-    0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
-    0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
-    0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
-    0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
-    0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
-    0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
-    0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
-    0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
-    0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
-    0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
-    0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
-    0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
-    0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
-    0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
-    0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
-    0x2200, /* U+002200: FOR ALL*/
-    0x2201, /* U+002201: COMPLEMENT*/
-    0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
-    0x2203, /* U+002203: THERE EXISTS*/
-    0x2204, /* U+002204: THERE DOES NOT EXIST*/
-    0x2205, /* U+002205: EMPTY SET*/
-    0x2206, /* U+002206: INCREMENT*/
-    0x2207, /* U+002207: NABLA*/
-    0x2208, /* U+002208: ELEMENT OF*/
-    0x2209, /* U+002209: NOT AN ELEMENT OF*/
-    0x220a, /* U+00220a: SMALL ELEMENT OF*/
-    0x220b, /* U+00220b: CONTAINS AS MEMBER*/
-    0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
-    0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
-    0x220e, /* U+00220e: END OF PROOF*/
-    0x220f, /* U+00220f: N-ARY PRODUCT*/
-    0x2210, /* U+002210: N-ARY COPRODUCT*/
-    0x2211, /* U+002211: N-ARY SUMMATION*/
-    0x2212, /* U+002212: MINUS SIGN*/
-    0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
-    0x2214, /* U+002214: DOT PLUS*/
-    0x2215, /* U+002215: DIVISION SLASH*/
-    0x2216, /* U+002216: SET MINUS*/
-    0x2217, /* U+002217: ASTERISK OPERATOR*/
-    0x2218, /* U+002218: RING OPERATOR*/
-    0x2219, /* U+002219: BULLET OPERATOR*/
-    0x221a, /* U+00221a: SQUARE ROOT*/
-    0x221b, /* U+00221b: CUBE ROOT*/
-    0x221c, /* U+00221c: FOURTH ROOT*/
-    0x221d, /* U+00221d: PROPORTIONAL TO*/
-    0x221e, /* U+00221e: INFINITY*/
-    0x221f, /* U+00221f: RIGHT ANGLE*/
-    0x2220, /* U+002220: ANGLE*/
-    0x2221, /* U+002221: MEASURED ANGLE*/
-    0x2222, /* U+002222: SPHERICAL ANGLE*/
-    0x2223, /* U+002223: DIVIDES*/
-    0x2224, /* U+002224: DOES NOT DIVIDE*/
-    0x2225, /* U+002225: PARALLEL TO*/
-    0x2226, /* U+002226: NOT PARALLEL TO*/
-    0x2227, /* U+002227: LOGICAL AND*/
-    0x2228, /* U+002228: LOGICAL OR*/
-    0x2229, /* U+002229: INTERSECTION*/
-    0x222a, /* U+00222a: UNION*/
-    0x222b, /* U+00222b: INTEGRAL*/
-    0x222c, /* U+00222c: DOUBLE INTEGRAL*/
-    0x222d, /* U+00222d: TRIPLE INTEGRAL*/
-    0x222e, /* U+00222e: CONTOUR INTEGRAL*/
-    0x222f, /* U+00222f: SURFACE INTEGRAL*/
-    0x2230, /* U+002230: VOLUME INTEGRAL*/
-    0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
-    0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
-    0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
-    0x2234, /* U+002234: THEREFORE*/
-    0x2235, /* U+002235: BECAUSE*/
-    0x2236, /* U+002236: RATIO*/
-    0x2237, /* U+002237: PROPORTION*/
-    0x2238, /* U+002238: DOT MINUS*/
-    0x2239, /* U+002239: EXCESS*/
-    0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
-    0x223b, /* U+00223b: HOMOTHETIC*/
-    0x223c, /* U+00223c: TILDE OPERATOR*/
-    0x223d, /* U+00223d: REVERSED TILDE*/
-    0x223e, /* U+00223e: INVERTED LAZY S*/
-    0x223f, /* U+00223f: SINE WAVE*/
-    0x2240, /* U+002240: WREATH PRODUCT*/
-    0x2241, /* U+002241: NOT TILDE*/
-    0x2242, /* U+002242: MINUS TILDE*/
-    0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
-    0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
-    0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
-    0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
-    0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
-    0x2248, /* U+002248: ALMOST EQUAL TO*/
-    0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
-    0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
-    0x224b, /* U+00224b: TRIPLE TILDE*/
-    0x224c, /* U+00224c: ALL EQUAL TO*/
-    0x224d, /* U+00224d: EQUIVALENT TO*/
-    0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
-    0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
-    0x2250, /* U+002250: APPROACHES THE LIMIT*/
-    0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
-    0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
-    0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
-    0x2254, /* U+002254: COLON EQUALS*/
-    0x2255, /* U+002255: EQUALS COLON*/
-    0x2256, /* U+002256: RING IN EQUAL TO*/
-    0x2257, /* U+002257: RING EQUAL TO*/
-    0x2258, /* U+002258: CORRESPONDS TO*/
-    0x2259, /* U+002259: ESTIMATES*/
-    0x225a, /* U+00225a: EQUIANGULAR TO*/
-    0x225b, /* U+00225b: STAR EQUALS*/
-    0x225c, /* U+00225c: DELTA EQUAL TO*/
-    0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
-    0x225e, /* U+00225e: MEASURED BY*/
-    0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
-    0x2260, /* U+002260: NOT EQUAL TO*/
-    0x2261, /* U+002261: IDENTICAL TO*/
-    0x2262, /* U+002262: NOT IDENTICAL TO*/
-    0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
-    0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
-    0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
-    0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
-    0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
-    0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
-    0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
-    0x226a, /* U+00226a: MUCH LESS-THAN*/
-    0x226b, /* U+00226b: MUCH GREATER-THAN*/
-    0x226c, /* U+00226c: BETWEEN*/
-    0x226d, /* U+00226d: NOT EQUIVALENT TO*/
-    0x226e, /* U+00226e: NOT LESS-THAN*/
-    0x226f, /* U+00226f: NOT GREATER-THAN*/
-    0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
-    0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
-    0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
-    0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
-    0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
-    0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
-    0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
-    0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
-    0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
-    0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
-    0x227a, /* U+00227a: PRECEDES*/
-    0x227b, /* U+00227b: SUCCEEDS*/
-    0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
-    0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
-    0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
-    0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
-    0x2280, /* U+002280: DOES NOT PRECEDE*/
-    0x2281, /* U+002281: DOES NOT SUCCEED*/
-    0x2282, /* U+002282: SUBSET OF*/
-    0x2283, /* U+002283: SUPERSET OF*/
-    0x2284, /* U+002284: NOT A SUBSET OF*/
-    0x2285, /* U+002285: NOT A SUPERSET OF*/
-    0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
-    0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
-    0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
-    0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
-    0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
-    0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
-    0x228c, /* U+00228c: MULTISET*/
-    0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
-    0x228e, /* U+00228e: MULTISET UNION*/
-    0x228f, /* U+00228f: SQUARE IMAGE OF*/
-    0x2290, /* U+002290: SQUARE ORIGINAL OF*/
-    0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
-    0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
-    0x2293, /* U+002293: SQUARE CAP*/
-    0x2294, /* U+002294: SQUARE CUP*/
-    0x2295, /* U+002295: CIRCLED PLUS*/
-    0x2296, /* U+002296: CIRCLED MINUS*/
-    0x2297, /* U+002297: CIRCLED TIMES*/
-    0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
-    0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
-    0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
-    0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
-    0x229c, /* U+00229c: CIRCLED EQUALS*/
-    0x229d, /* U+00229d: CIRCLED DASH*/
-    0x229e, /* U+00229e: SQUARED PLUS*/
-    0x229f, /* U+00229f: SQUARED MINUS*/
-    0x22a0, /* U+0022a0: SQUARED TIMES*/
-    0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
-    0x22a2, /* U+0022a2: RIGHT TACK*/
-    0x22a3, /* U+0022a3: LEFT TACK*/
-    0x22a4, /* U+0022a4: DOWN TACK*/
-    0x22a5, /* U+0022a5: UP TACK*/
-    0x22a6, /* U+0022a6: ASSERTION*/
-    0x22a7, /* U+0022a7: MODELS*/
-    0x22a8, /* U+0022a8: TRUE*/
-    0x22a9, /* U+0022a9: FORCES*/
-    0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
-    0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-    0x22ac, /* U+0022ac: DOES NOT PROVE*/
-    0x22ad, /* U+0022ad: NOT TRUE*/
-    0x22ae, /* U+0022ae: DOES NOT FORCE*/
-    0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-    0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
-    0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
-    0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
-    0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
-    0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
-    0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
-    0x22b6, /* U+0022b6: ORIGINAL OF*/
-    0x22b7, /* U+0022b7: IMAGE OF*/
-    0x22b8, /* U+0022b8: MULTIMAP*/
-    0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
-    0x22ba, /* U+0022ba: INTERCALATE*/
-    0x22bb, /* U+0022bb: XOR*/
-    0x22bc, /* U+0022bc: NAND*/
-    0x22bd, /* U+0022bd: NOR*/
-    0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
-    0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
-    0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
-    0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
-    0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
-    0x22c3, /* U+0022c3: N-ARY UNION*/
-    0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
-    0x22c5, /* U+0022c5: DOT OPERATOR*/
-    0x22c6, /* U+0022c6: STAR OPERATOR*/
-    0x22c7, /* U+0022c7: DIVISION TIMES*/
-    0x22c8, /* U+0022c8: BOWTIE*/
-    0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-    0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-    0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
-    0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
-    0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
-    0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
-    0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
-    0x22d0, /* U+0022d0: DOUBLE SUBSET*/
-    0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
-    0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
-    0x22d3, /* U+0022d3: DOUBLE UNION*/
-    0x22d4, /* U+0022d4: PITCHFORK*/
-    0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
-    0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
-    0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
-    0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
-    0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
-    0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
-    0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
-    0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
-    0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
-    0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
-    0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
-    0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
-    0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
-    0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
-    0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
-    0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
-    0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
-    0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
-    0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
-    0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
-    0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
-    0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
-    0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
-    0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
-    0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
-    0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
-    0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
-    0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
-    0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
-    0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
-    0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
-    0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
-    0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
-    0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
-    0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
-    0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
-    0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
-    0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
-    0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
-    0x2300, /* U+002300: DIAMETER SIGN*/
-    0x2301, /* U+002301: ELECTRIC ARROW*/
-    0x2302, /* U+002302: HOUSE*/
-    0x2303, /* U+002303: UP ARROWHEAD*/
-    0x2304, /* U+002304: DOWN ARROWHEAD*/
-    0x2305, /* U+002305: PROJECTIVE*/
-    0x2306, /* U+002306: PERSPECTIVE*/
-    0x2307, /* U+002307: WAVY LINE*/
-    0x2308, /* U+002308: LEFT CEILING*/
-    0x2309, /* U+002309: RIGHT CEILING*/
-    0x230a, /* U+00230a: LEFT FLOOR*/
-    0x230b, /* U+00230b: RIGHT FLOOR*/
-    0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
-    0x230d, /* U+00230d: BOTTOM LEFT CROP*/
-    0x230e, /* U+00230e: TOP RIGHT CROP*/
-    0x230f, /* U+00230f: TOP LEFT CROP*/
-    0x2310, /* U+002310: REVERSED NOT SIGN*/
-    0x2311, /* U+002311: SQUARE LOZENGE*/
-    0x2312, /* U+002312: ARC*/
-    0x2313, /* U+002313: SEGMENT*/
-    0x2314, /* U+002314: SECTOR*/
-    0x2315, /* U+002315: TELEPHONE RECORDER*/
-    0x2316, /* U+002316: POSITION INDICATOR*/
-    0x2317, /* U+002317: VIEWDATA SQUARE*/
-    0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
-    0x2319, /* U+002319: TURNED NOT SIGN*/
-    0x231a, /* U+00231a: WATCH*/
-    0x231b, /* U+00231b: HOURGLASS*/
-    0x231c, /* U+00231c: TOP LEFT CORNER*/
-    0x231d, /* U+00231d: TOP RIGHT CORNER*/
-    0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
-    0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
-    0x2320, /* U+002320: TOP HALF INTEGRAL*/
-    0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
-    0x2322, /* U+002322: FROWN*/
-    0x2323, /* U+002323: SMILE*/
-    0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
-    0x2325, /* U+002325: OPTION KEY*/
-    0x2326, /* U+002326: ERASE TO THE RIGHT*/
-    0x2327, /* U+002327: X IN A RECTANGLE BOX*/
-    0x2328, /* U+002328: KEYBOARD*/
-    0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
-    0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
-    0x232b, /* U+00232b: ERASE TO THE LEFT*/
-    0x232c, /* U+00232c: BENZENE RING*/
-    0x232d, /* U+00232d: CYLINDRICITY*/
-    0x232e, /* U+00232e: ALL AROUND-PROFILE*/
-    0x232f, /* U+00232f: SYMMETRY*/
-    0x2330, /* U+002330: TOTAL RUNOUT*/
-    0x2331, /* U+002331: DIMENSION ORIGIN*/
-    0x2332, /* U+002332: CONICAL TAPER*/
-    0x2333, /* U+002333: SLOPE*/
-    0x2334, /* U+002334: COUNTERBORE*/
-    0x2335, /* U+002335: COUNTERSINK*/
-    0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
-    0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
-    0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
-    0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
-    0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
-    0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
-    0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
-    0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
-    0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
-    0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
-    0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
-    0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
-    0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
-    0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
-    0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
-    0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
-    0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
-    0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
-    0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
-    0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
-    0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
-    0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
-    0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
-    0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
-    0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
-    0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
-    0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
-    0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
-    0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
-    0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
-    0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
-    0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
-    0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
-    0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
-    0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
-    0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
-    0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
-    0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
-    0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
-    0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
-    0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
-    0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
-    0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
-    0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
-    0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
-    0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
-    0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
-    0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
-    0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
-    0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
-    0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
-    0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
-    0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
-    0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
-    0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
-    0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
-    0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
-    0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
-    0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
-    0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
-    0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
-    0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
-    0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
-    0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
-    0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
-    0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
-    0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
-    0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
-    0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
-    0x237b, /* U+00237b: NOT CHECK MARK*/
-    0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
-    0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
-    0x237e, /* U+00237e: BELL SYMBOL*/
-    0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
-    0x2380, /* U+002380: INSERTION SYMBOL*/
-    0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
-    0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
-    0x2383, /* U+002383: EMPHASIS SYMBOL*/
-    0x2384, /* U+002384: COMPOSITION SYMBOL*/
-    0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
-    0x2386, /* U+002386: ENTER SYMBOL*/
-    0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
-    0x2388, /* U+002388: HELM SYMBOL*/
-    0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
-    0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
-    0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
-    0x238c, /* U+00238c: UNDO SYMBOL*/
-    0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
-    0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
-    0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
-    0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
-    0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
-    0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
-    0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
-    0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
-    0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
-    0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
-    0x2397, /* U+002397: PREVIOUS PAGE*/
-    0x2398, /* U+002398: NEXT PAGE*/
-    0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
-    0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
-    0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
-    0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
-    0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
-    0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
-    0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
-    0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
-    0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
-    0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
-    0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
-    0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
-    0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
-    0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
-    0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
-    0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
-    0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
-    0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
-    0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
-    0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
-    0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
-    0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
-    0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
-    0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
-    0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
-    0x23b2, /* U+0023b2: SUMMATION TOP*/
-    0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
-    0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
-    0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
-    0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
-    0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
-    0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
-    0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
-    0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
-    0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
-    0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
-    0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
-    0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
-    0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
-    0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
-    0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
-    0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
-    0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
-    0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
-    0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
-    0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
-    0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
-    0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
-    0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
-    0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
-    0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
-    0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
-    0x23cd, /* U+0023cd: SQUARE FOOT*/
-    0x23ce, /* U+0023ce: RETURN SYMBOL*/
-    0x23cf, /* U+0023cf: EJECT SYMBOL*/
-    0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
-    0x23d1, /* U+0023d1: METRICAL BREVE*/
-    0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
-    0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
-    0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
-    0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
-    0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
-    0x23d7, /* U+0023d7: METRICAL TRISEME*/
-    0x23d8, /* U+0023d8: METRICAL TETRASEME*/
-    0x23d9, /* U+0023d9: METRICAL PENTASEME*/
-    0x23da, /* U+0023da: EARTH GROUND*/
-    0x23db, /* U+0023db: FUSE*/
-    0x23dc, /* U+0023dc: */
-    0x23dd, /* U+0023dd: */
-    0x23de, /* U+0023de: */
-    0x23df, /* U+0023df: */
-    0x23e0, /* U+0023e0: */
-    0x23e1, /* U+0023e1: */
-    0x23e2, /* U+0023e2: */
-    0x23e3, /* U+0023e3: */
-    0x23e4, /* U+0023e4: */
-    0x23e5, /* U+0023e5: */
-    0x23e6, /* U+0023e6: */
-    0x23e7, /* U+0023e7: */
-    0x23e8, /* U+0023e8: */
-    0x23e9, /* U+0023e9: */
-    0x23ea, /* U+0023ea: */
-    0x23eb, /* U+0023eb: */
-    0x23ec, /* U+0023ec: */
-    0x23ed, /* U+0023ed: */
-    0x23ee, /* U+0023ee: */
-    0x23ef, /* U+0023ef: */
-    0x23f0, /* U+0023f0: */
-    0x23f1, /* U+0023f1: */
-    0x23f2, /* U+0023f2: */
-    0x23f3, /* U+0023f3: */
-    0x23f4, /* U+0023f4: */
-    0x23f5, /* U+0023f5: */
-    0x23f6, /* U+0023f6: */
-    0x23f7, /* U+0023f7: */
-    0x23f8, /* U+0023f8: */
-    0x23f9, /* U+0023f9: */
-    0x23fa, /* U+0023fa: */
-    0x23fb, /* U+0023fb: */
-    0x23fc, /* U+0023fc: */
-    0x23fd, /* U+0023fd: */
-    0x23fe, /* U+0023fe: */
-    0x23ff, /* U+0023ff: */
-    0x2400, /* U+002400: SYMBOL FOR NULL*/
-    0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
-    0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
-    0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
-    0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
-    0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
-    0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
-    0x2407, /* U+002407: SYMBOL FOR BELL*/
-    0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
-    0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
-    0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
-    0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
-    0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
-    0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
-    0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
-    0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
-    0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
-    0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
-    0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
-    0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
-    0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
-    0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
-    0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
-    0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
-    0x2418, /* U+002418: SYMBOL FOR CANCEL*/
-    0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
-    0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
-    0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
-    0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
-    0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
-    0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
-    0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
-    0x2420, /* U+002420: SYMBOL FOR SPACE*/
-    0x2421, /* U+002421: SYMBOL FOR DELETE*/
-    0x2422, /* U+002422: BLANK SYMBOL*/
-    0x2423, /* U+002423: OPEN BOX*/
-    0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
-    0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
-    0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
-    0x2427, /* U+002427: */
-    0x2428, /* U+002428: */
-    0x2429, /* U+002429: */
-    0x242a, /* U+00242a: */
-    0x242b, /* U+00242b: */
-    0x242c, /* U+00242c: */
-    0x242d, /* U+00242d: */
-    0x242e, /* U+00242e: */
-    0x242f, /* U+00242f: */
-    0x2430, /* U+002430: */
-    0x2431, /* U+002431: */
-    0x2432, /* U+002432: */
-    0x2433, /* U+002433: */
-    0x2434, /* U+002434: */
-    0x2435, /* U+002435: */
-    0x2436, /* U+002436: */
-    0x2437, /* U+002437: */
-    0x2438, /* U+002438: */
-    0x2439, /* U+002439: */
-    0x243a, /* U+00243a: */
-    0x243b, /* U+00243b: */
-    0x243c, /* U+00243c: */
-    0x243d, /* U+00243d: */
-    0x243e, /* U+00243e: */
-    0x243f, /* U+00243f: */
-    0x2440, /* U+002440: OCR HOOK*/
-    0x2441, /* U+002441: OCR CHAIR*/
-    0x2442, /* U+002442: OCR FORK*/
-    0x2443, /* U+002443: OCR INVERTED FORK*/
-    0x2444, /* U+002444: OCR BELT BUCKLE*/
-    0x2445, /* U+002445: OCR BOW TIE*/
-    0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
-    0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
-    0x2448, /* U+002448: OCR DASH*/
-    0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
-    0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
-    0x244b, /* U+00244b: */
-    0x244c, /* U+00244c: */
-    0x244d, /* U+00244d: */
-    0x244e, /* U+00244e: */
-    0x244f, /* U+00244f: */
-    0x2450, /* U+002450: */
-    0x2451, /* U+002451: */
-    0x2452, /* U+002452: */
-    0x2453, /* U+002453: */
-    0x2454, /* U+002454: */
-    0x2455, /* U+002455: */
-    0x2456, /* U+002456: */
-    0x2457, /* U+002457: */
-    0x2458, /* U+002458: */
-    0x2459, /* U+002459: */
-    0x245a, /* U+00245a: */
-    0x245b, /* U+00245b: */
-    0x245c, /* U+00245c: */
-    0x245d, /* U+00245d: */
-    0x245e, /* U+00245e: */
-    0x245f, /* U+00245f: */
-    0x2460, /* U+002460: CIRCLED DIGIT ONE*/
-    0x2461, /* U+002461: CIRCLED DIGIT TWO*/
-    0x2462, /* U+002462: CIRCLED DIGIT THREE*/
-    0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
-    0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
-    0x2465, /* U+002465: CIRCLED DIGIT SIX*/
-    0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
-    0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
-    0x2468, /* U+002468: CIRCLED DIGIT NINE*/
-    0x2469, /* U+002469: CIRCLED NUMBER TEN*/
-    0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
-    0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
-    0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
-    0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
-    0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
-    0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
-    0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
-    0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
-    0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
-    0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
-    0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
-    0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
-    0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
-    0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
-    0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
-    0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
-    0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
-    0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
-    0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
-    0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
-    0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
-    0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
-    0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
-    0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
-    0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
-    0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
-    0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
-    0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
-    0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
-    0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
-    0x2488, /* U+002488: DIGIT ONE FULL STOP*/
-    0x2489, /* U+002489: DIGIT TWO FULL STOP*/
-    0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
-    0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
-    0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
-    0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
-    0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
-    0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
-    0x2490, /* U+002490: DIGIT NINE FULL STOP*/
-    0x2491, /* U+002491: NUMBER TEN FULL STOP*/
-    0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
-    0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
-    0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
-    0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
-    0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
-    0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
-    0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
-    0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
-    0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
-    0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
-    0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
-    0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
-    0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
-    0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
-    0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
-    0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
-    0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
-    0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
-    0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
-    0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
-    0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
-    0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
-    0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
-    0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
-    0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
-    0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
-    0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
-    0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
-    0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
-    0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
-    0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
-    0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
-    0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
-    0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
-    0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
-    0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
-    0x24b6, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
-    0x24b7, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
-    0x24b8, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
-    0x24b9, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
-    0x24ba, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
-    0x24bb, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
-    0x24bc, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
-    0x24bd, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
-    0x24be, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
-    0x24bf, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
-    0x24c0, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
-    0x24c1, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
-    0x24c2, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
-    0x24c3, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
-    0x24c4, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
-    0x24c5, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
-    0x24c6, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
-    0x24c7, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
-    0x24c8, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
-    0x24c9, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
-    0x24ca, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
-    0x24cb, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
-    0x24cc, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
-    0x24cd, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
-    0x24ce, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
-    0x24cf, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
-    0x24b6, /* U+0024d0: CIRCLED LATIN SMALL LETTER A*/
-    0x24b7, /* U+0024d1: CIRCLED LATIN SMALL LETTER B*/
-    0x24b8, /* U+0024d2: CIRCLED LATIN SMALL LETTER C*/
-    0x24b9, /* U+0024d3: CIRCLED LATIN SMALL LETTER D*/
-    0x24ba, /* U+0024d4: CIRCLED LATIN SMALL LETTER E*/
-    0x24bb, /* U+0024d5: CIRCLED LATIN SMALL LETTER F*/
-    0x24bc, /* U+0024d6: CIRCLED LATIN SMALL LETTER G*/
-    0x24bd, /* U+0024d7: CIRCLED LATIN SMALL LETTER H*/
-    0x24be, /* U+0024d8: CIRCLED LATIN SMALL LETTER I*/
-    0x24bf, /* U+0024d9: CIRCLED LATIN SMALL LETTER J*/
-    0x24c0, /* U+0024da: CIRCLED LATIN SMALL LETTER K*/
-    0x24c1, /* U+0024db: CIRCLED LATIN SMALL LETTER L*/
-    0x24c2, /* U+0024dc: CIRCLED LATIN SMALL LETTER M*/
-    0x24c3, /* U+0024dd: CIRCLED LATIN SMALL LETTER N*/
-    0x24c4, /* U+0024de: CIRCLED LATIN SMALL LETTER O*/
-    0x24c5, /* U+0024df: CIRCLED LATIN SMALL LETTER P*/
-    0x24c6, /* U+0024e0: CIRCLED LATIN SMALL LETTER Q*/
-    0x24c7, /* U+0024e1: CIRCLED LATIN SMALL LETTER R*/
-    0x24c8, /* U+0024e2: CIRCLED LATIN SMALL LETTER S*/
-    0x24c9, /* U+0024e3: CIRCLED LATIN SMALL LETTER T*/
-    0x24ca, /* U+0024e4: CIRCLED LATIN SMALL LETTER U*/
-    0x24cb, /* U+0024e5: CIRCLED LATIN SMALL LETTER V*/
-    0x24cc, /* U+0024e6: CIRCLED LATIN SMALL LETTER W*/
-    0x24cd, /* U+0024e7: CIRCLED LATIN SMALL LETTER X*/
-    0x24ce, /* U+0024e8: CIRCLED LATIN SMALL LETTER Y*/
-    0x24cf, /* U+0024e9: CIRCLED LATIN SMALL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniUpper0x002c30[] =
-{
-    0x2c00, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
-    0x2c01, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
-    0x2c02, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
-    0x2c03, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
-    0x2c04, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
-    0x2c05, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
-    0x2c06, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
-    0x2c07, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
-    0x2c08, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
-    0x2c09, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
-    0x2c0a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
-    0x2c0b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
-    0x2c0c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
-    0x2c0d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
-    0x2c0e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
-    0x2c0f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
-    0x2c10, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
-    0x2c11, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
-    0x2c12, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
-    0x2c13, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
-    0x2c14, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
-    0x2c15, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
-    0x2c16, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
-    0x2c17, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
-    0x2c18, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
-    0x2c19, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
-    0x2c1a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
-    0x2c1b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
-    0x2c1c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
-    0x2c1d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
-    0x2c1e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
-    0x2c1f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
-    0x2c20, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
-    0x2c21, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
-    0x2c22, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
-    0x2c23, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
-    0x2c24, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
-    0x2c25, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
-    0x2c26, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
-    0x2c27, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
-    0x2c28, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
-    0x2c29, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
-    0x2c2a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
-    0x2c2b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
-    0x2c2c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
-    0x2c2d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
-    0x2c2e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
-    0x2c5f, /* U+002c5f: */
-    0x2c60, /* U+002c60: */
-    0x2c61, /* U+002c61: */
-    0x2c62, /* U+002c62: */
-    0x2c63, /* U+002c63: */
-    0x2c64, /* U+002c64: */
-    0x2c65, /* U+002c65: */
-    0x2c66, /* U+002c66: */
-    0x2c67, /* U+002c67: */
-    0x2c68, /* U+002c68: */
-    0x2c69, /* U+002c69: */
-    0x2c6a, /* U+002c6a: */
-    0x2c6b, /* U+002c6b: */
-    0x2c6c, /* U+002c6c: */
-    0x2c6d, /* U+002c6d: */
-    0x2c6e, /* U+002c6e: */
-    0x2c6f, /* U+002c6f: */
-    0x2c70, /* U+002c70: */
-    0x2c71, /* U+002c71: */
-    0x2c72, /* U+002c72: */
-    0x2c73, /* U+002c73: */
-    0x2c74, /* U+002c74: */
-    0x2c75, /* U+002c75: */
-    0x2c76, /* U+002c76: */
-    0x2c77, /* U+002c77: */
-    0x2c78, /* U+002c78: */
-    0x2c79, /* U+002c79: */
-    0x2c7a, /* U+002c7a: */
-    0x2c7b, /* U+002c7b: */
-    0x2c7c, /* U+002c7c: */
-    0x2c7d, /* U+002c7d: */
-    0x2c7e, /* U+002c7e: */
-    0x2c7f, /* U+002c7f: */
-    0x2c80, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
-    0x2c80, /* U+002c81: COPTIC SMALL LETTER ALFA*/
-    0x2c82, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
-    0x2c82, /* U+002c83: COPTIC SMALL LETTER VIDA*/
-    0x2c84, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
-    0x2c84, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
-    0x2c86, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
-    0x2c86, /* U+002c87: COPTIC SMALL LETTER DALDA*/
-    0x2c88, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
-    0x2c88, /* U+002c89: COPTIC SMALL LETTER EIE*/
-    0x2c8a, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
-    0x2c8a, /* U+002c8b: COPTIC SMALL LETTER SOU*/
-    0x2c8c, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
-    0x2c8c, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
-    0x2c8e, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
-    0x2c8e, /* U+002c8f: COPTIC SMALL LETTER HATE*/
-    0x2c90, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
-    0x2c90, /* U+002c91: COPTIC SMALL LETTER THETHE*/
-    0x2c92, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
-    0x2c92, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
-    0x2c94, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
-    0x2c94, /* U+002c95: COPTIC SMALL LETTER KAPA*/
-    0x2c96, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
-    0x2c96, /* U+002c97: COPTIC SMALL LETTER LAULA*/
-    0x2c98, /* U+002c98: COPTIC CAPITAL LETTER MI*/
-    0x2c98, /* U+002c99: COPTIC SMALL LETTER MI*/
-    0x2c9a, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
-    0x2c9a, /* U+002c9b: COPTIC SMALL LETTER NI*/
-    0x2c9c, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
-    0x2c9c, /* U+002c9d: COPTIC SMALL LETTER KSI*/
-    0x2c9e, /* U+002c9e: COPTIC CAPITAL LETTER O*/
-    0x2c9e, /* U+002c9f: COPTIC SMALL LETTER O*/
-    0x2ca0, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
-    0x2ca0, /* U+002ca1: COPTIC SMALL LETTER PI*/
-    0x2ca2, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
-    0x2ca2, /* U+002ca3: COPTIC SMALL LETTER RO*/
-    0x2ca4, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
-    0x2ca4, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
-    0x2ca6, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
-    0x2ca6, /* U+002ca7: COPTIC SMALL LETTER TAU*/
-    0x2ca8, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
-    0x2ca8, /* U+002ca9: COPTIC SMALL LETTER UA*/
-    0x2caa, /* U+002caa: COPTIC CAPITAL LETTER FI*/
-    0x2caa, /* U+002cab: COPTIC SMALL LETTER FI*/
-    0x2cac, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
-    0x2cac, /* U+002cad: COPTIC SMALL LETTER KHI*/
-    0x2cae, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
-    0x2cae, /* U+002caf: COPTIC SMALL LETTER PSI*/
-    0x2cb0, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
-    0x2cb0, /* U+002cb1: COPTIC SMALL LETTER OOU*/
-    0x2cb2, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
-    0x2cb2, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
-    0x2cb4, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
-    0x2cb4, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
-    0x2cb6, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
-    0x2cb6, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
-    0x2cb8, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
-    0x2cb8, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
-    0x2cba, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
-    0x2cba, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
-    0x2cbc, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
-    0x2cbc, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
-    0x2cbe, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
-    0x2cbe, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
-    0x2cc0, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
-    0x2cc0, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
-    0x2cc2, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
-    0x2cc2, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
-    0x2cc4, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
-    0x2cc4, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
-    0x2cc6, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
-    0x2cc6, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
-    0x2cc8, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
-    0x2cc8, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
-    0x2cca, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
-    0x2cca, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
-    0x2ccc, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
-    0x2ccc, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
-    0x2cce, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
-    0x2cce, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
-    0x2cd0, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
-    0x2cd0, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
-    0x2cd2, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
-    0x2cd2, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
-    0x2cd4, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
-    0x2cd4, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
-    0x2cd6, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
-    0x2cd6, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
-    0x2cd8, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
-    0x2cd8, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
-    0x2cda, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
-    0x2cda, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
-    0x2cdc, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
-    0x2cdc, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
-    0x2cde, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
-    0x2cde, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
-    0x2ce0, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
-    0x2ce0, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
-    0x2ce2, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
-    0x2ce2, /* U+002ce3: COPTIC SMALL LETTER OLD NUBIAN WAU*/
-    0x2ce4, /* U+002ce4: COPTIC SYMBOL KAI*/
-    0x2ce5, /* U+002ce5: COPTIC SYMBOL MI RO*/
-    0x2ce6, /* U+002ce6: COPTIC SYMBOL PI RO*/
-    0x2ce7, /* U+002ce7: COPTIC SYMBOL STAUROS*/
-    0x2ce8, /* U+002ce8: COPTIC SYMBOL TAU RO*/
-    0x2ce9, /* U+002ce9: COPTIC SYMBOL KHI RO*/
-    0x2cea, /* U+002cea: COPTIC SYMBOL SHIMA SIMA*/
-    0x2ceb, /* U+002ceb: */
-    0x2cec, /* U+002cec: */
-    0x2ced, /* U+002ced: */
-    0x2cee, /* U+002cee: */
-    0x2cef, /* U+002cef: */
-    0x2cf0, /* U+002cf0: */
-    0x2cf1, /* U+002cf1: */
-    0x2cf2, /* U+002cf2: */
-    0x2cf3, /* U+002cf3: */
-    0x2cf4, /* U+002cf4: */
-    0x2cf5, /* U+002cf5: */
-    0x2cf6, /* U+002cf6: */
-    0x2cf7, /* U+002cf7: */
-    0x2cf8, /* U+002cf8: */
-    0x2cf9, /* U+002cf9: COPTIC OLD NUBIAN FULL STOP*/
-    0x2cfa, /* U+002cfa: COPTIC OLD NUBIAN DIRECT QUESTION MARK*/
-    0x2cfb, /* U+002cfb: COPTIC OLD NUBIAN INDIRECT QUESTION MARK*/
-    0x2cfc, /* U+002cfc: COPTIC OLD NUBIAN VERSE DIVIDER*/
-    0x2cfd, /* U+002cfd: COPTIC FRACTION ONE HALF*/
-    0x2cfe, /* U+002cfe: COPTIC FULL STOP*/
-    0x2cff, /* U+002cff: COPTIC MORPHOLOGICAL DIVIDER*/
-    0x10a0, /* U+002d00: GEORGIAN SMALL LETTER AN*/
-    0x10a1, /* U+002d01: GEORGIAN SMALL LETTER BAN*/
-    0x10a2, /* U+002d02: GEORGIAN SMALL LETTER GAN*/
-    0x10a3, /* U+002d03: GEORGIAN SMALL LETTER DON*/
-    0x10a4, /* U+002d04: GEORGIAN SMALL LETTER EN*/
-    0x10a5, /* U+002d05: GEORGIAN SMALL LETTER VIN*/
-    0x10a6, /* U+002d06: GEORGIAN SMALL LETTER ZEN*/
-    0x10a7, /* U+002d07: GEORGIAN SMALL LETTER TAN*/
-    0x10a8, /* U+002d08: GEORGIAN SMALL LETTER IN*/
-    0x10a9, /* U+002d09: GEORGIAN SMALL LETTER KAN*/
-    0x10aa, /* U+002d0a: GEORGIAN SMALL LETTER LAS*/
-    0x10ab, /* U+002d0b: GEORGIAN SMALL LETTER MAN*/
-    0x10ac, /* U+002d0c: GEORGIAN SMALL LETTER NAR*/
-    0x10ad, /* U+002d0d: GEORGIAN SMALL LETTER ON*/
-    0x10ae, /* U+002d0e: GEORGIAN SMALL LETTER PAR*/
-    0x10af, /* U+002d0f: GEORGIAN SMALL LETTER ZHAR*/
-    0x10b0, /* U+002d10: GEORGIAN SMALL LETTER RAE*/
-    0x10b1, /* U+002d11: GEORGIAN SMALL LETTER SAN*/
-    0x10b2, /* U+002d12: GEORGIAN SMALL LETTER TAR*/
-    0x10b3, /* U+002d13: GEORGIAN SMALL LETTER UN*/
-    0x10b4, /* U+002d14: GEORGIAN SMALL LETTER PHAR*/
-    0x10b5, /* U+002d15: GEORGIAN SMALL LETTER KHAR*/
-    0x10b6, /* U+002d16: GEORGIAN SMALL LETTER GHAN*/
-    0x10b7, /* U+002d17: GEORGIAN SMALL LETTER QAR*/
-    0x10b8, /* U+002d18: GEORGIAN SMALL LETTER SHIN*/
-    0x10b9, /* U+002d19: GEORGIAN SMALL LETTER CHIN*/
-    0x10ba, /* U+002d1a: GEORGIAN SMALL LETTER CAN*/
-    0x10bb, /* U+002d1b: GEORGIAN SMALL LETTER JIL*/
-    0x10bc, /* U+002d1c: GEORGIAN SMALL LETTER CIL*/
-    0x10bd, /* U+002d1d: GEORGIAN SMALL LETTER CHAR*/
-    0x10be, /* U+002d1e: GEORGIAN SMALL LETTER XAN*/
-    0x10bf, /* U+002d1f: GEORGIAN SMALL LETTER JHAN*/
-    0x10c0, /* U+002d20: GEORGIAN SMALL LETTER HAE*/
-    0x10c1, /* U+002d21: GEORGIAN SMALL LETTER HE*/
-    0x10c2, /* U+002d22: GEORGIAN SMALL LETTER HIE*/
-    0x10c3, /* U+002d23: GEORGIAN SMALL LETTER WE*/
-    0x10c4, /* U+002d24: GEORGIAN SMALL LETTER HAR*/
-    0x10c5, /* U+002d25: GEORGIAN SMALL LETTER HOE*/
-};
-
-static const RTUNICP g_afRTUniUpper0x00ff41[] =
-{
-    0xff21, /* U+00ff41: FULLWIDTH LATIN SMALL LETTER A*/
-    0xff22, /* U+00ff42: FULLWIDTH LATIN SMALL LETTER B*/
-    0xff23, /* U+00ff43: FULLWIDTH LATIN SMALL LETTER C*/
-    0xff24, /* U+00ff44: FULLWIDTH LATIN SMALL LETTER D*/
-    0xff25, /* U+00ff45: FULLWIDTH LATIN SMALL LETTER E*/
-    0xff26, /* U+00ff46: FULLWIDTH LATIN SMALL LETTER F*/
-    0xff27, /* U+00ff47: FULLWIDTH LATIN SMALL LETTER G*/
-    0xff28, /* U+00ff48: FULLWIDTH LATIN SMALL LETTER H*/
-    0xff29, /* U+00ff49: FULLWIDTH LATIN SMALL LETTER I*/
-    0xff2a, /* U+00ff4a: FULLWIDTH LATIN SMALL LETTER J*/
-    0xff2b, /* U+00ff4b: FULLWIDTH LATIN SMALL LETTER K*/
-    0xff2c, /* U+00ff4c: FULLWIDTH LATIN SMALL LETTER L*/
-    0xff2d, /* U+00ff4d: FULLWIDTH LATIN SMALL LETTER M*/
-    0xff2e, /* U+00ff4e: FULLWIDTH LATIN SMALL LETTER N*/
-    0xff2f, /* U+00ff4f: FULLWIDTH LATIN SMALL LETTER O*/
-    0xff30, /* U+00ff50: FULLWIDTH LATIN SMALL LETTER P*/
-    0xff31, /* U+00ff51: FULLWIDTH LATIN SMALL LETTER Q*/
-    0xff32, /* U+00ff52: FULLWIDTH LATIN SMALL LETTER R*/
-    0xff33, /* U+00ff53: FULLWIDTH LATIN SMALL LETTER S*/
-    0xff34, /* U+00ff54: FULLWIDTH LATIN SMALL LETTER T*/
-    0xff35, /* U+00ff55: FULLWIDTH LATIN SMALL LETTER U*/
-    0xff36, /* U+00ff56: FULLWIDTH LATIN SMALL LETTER V*/
-    0xff37, /* U+00ff57: FULLWIDTH LATIN SMALL LETTER W*/
-    0xff38, /* U+00ff58: FULLWIDTH LATIN SMALL LETTER X*/
-    0xff39, /* U+00ff59: FULLWIDTH LATIN SMALL LETTER Y*/
-    0xff3a, /* U+00ff5a: FULLWIDTH LATIN SMALL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniUpper0x010428[] =
-{
-    0x10400, /* U+010428: DESERET SMALL LETTER LONG I*/
-    0x10401, /* U+010429: DESERET SMALL LETTER LONG E*/
-    0x10402, /* U+01042a: DESERET SMALL LETTER LONG A*/
-    0x10403, /* U+01042b: DESERET SMALL LETTER LONG AH*/
-    0x10404, /* U+01042c: DESERET SMALL LETTER LONG O*/
-    0x10405, /* U+01042d: DESERET SMALL LETTER LONG OO*/
-    0x10406, /* U+01042e: DESERET SMALL LETTER SHORT I*/
-    0x10407, /* U+01042f: DESERET SMALL LETTER SHORT E*/
-    0x10408, /* U+010430: DESERET SMALL LETTER SHORT A*/
-    0x10409, /* U+010431: DESERET SMALL LETTER SHORT AH*/
-    0x1040a, /* U+010432: DESERET SMALL LETTER SHORT O*/
-    0x1040b, /* U+010433: DESERET SMALL LETTER SHORT OO*/
-    0x1040c, /* U+010434: DESERET SMALL LETTER AY*/
-    0x1040d, /* U+010435: DESERET SMALL LETTER OW*/
-    0x1040e, /* U+010436: DESERET SMALL LETTER WU*/
-    0x1040f, /* U+010437: DESERET SMALL LETTER YEE*/
-    0x10410, /* U+010438: DESERET SMALL LETTER H*/
-    0x10411, /* U+010439: DESERET SMALL LETTER PEE*/
-    0x10412, /* U+01043a: DESERET SMALL LETTER BEE*/
-    0x10413, /* U+01043b: DESERET SMALL LETTER TEE*/
-    0x10414, /* U+01043c: DESERET SMALL LETTER DEE*/
-    0x10415, /* U+01043d: DESERET SMALL LETTER CHEE*/
-    0x10416, /* U+01043e: DESERET SMALL LETTER JEE*/
-    0x10417, /* U+01043f: DESERET SMALL LETTER KAY*/
-    0x10418, /* U+010440: DESERET SMALL LETTER GAY*/
-    0x10419, /* U+010441: DESERET SMALL LETTER EF*/
-    0x1041a, /* U+010442: DESERET SMALL LETTER VEE*/
-    0x1041b, /* U+010443: DESERET SMALL LETTER ETH*/
-    0x1041c, /* U+010444: DESERET SMALL LETTER THEE*/
-    0x1041d, /* U+010445: DESERET SMALL LETTER ES*/
-    0x1041e, /* U+010446: DESERET SMALL LETTER ZEE*/
-    0x1041f, /* U+010447: DESERET SMALL LETTER ESH*/
-    0x10420, /* U+010448: DESERET SMALL LETTER ZHEE*/
-    0x10421, /* U+010449: DESERET SMALL LETTER ER*/
-    0x10422, /* U+01044a: DESERET SMALL LETTER EL*/
-    0x10423, /* U+01044b: DESERET SMALL LETTER EM*/
-    0x10424, /* U+01044c: DESERET SMALL LETTER EN*/
-    0x10425, /* U+01044d: DESERET SMALL LETTER ENG*/
-    0x10426, /* U+01044e: DESERET SMALL LETTER OI*/
-    0x10427, /* U+01044f: DESERET SMALL LETTER EW*/
-};
-
-
-const RTUNICASERANGE g_aRTUniUpperRanges[] =
-{
-    { 0x000000, 0x000587, &g_afRTUniUpper0x000000[0] },
-    { 0x001e01, 0x0024ea, &g_afRTUniUpper0x001e01[0] },
-    { 0x002c30, 0x002d26, &g_afRTUniUpper0x002c30[0] },
-    { 0x00ff41, 0x00ff5b, &g_afRTUniUpper0x00ff41[0] },
-    { 0x010428, 0x010450, &g_afRTUniUpper0x010428[0] },
-    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
-
-static const RTUNICP g_afRTUniLower0x000000[] =
-{
-    0x00, /* U+000000: <control>*/
-    0x01, /* U+000001: <control>*/
-    0x02, /* U+000002: <control>*/
-    0x03, /* U+000003: <control>*/
-    0x04, /* U+000004: <control>*/
-    0x05, /* U+000005: <control>*/
-    0x06, /* U+000006: <control>*/
-    0x07, /* U+000007: <control>*/
-    0x08, /* U+000008: <control>*/
-    0x09, /* U+000009: <control>*/
-    0x0a, /* U+00000a: <control>*/
-    0x0b, /* U+00000b: <control>*/
-    0x0c, /* U+00000c: <control>*/
-    0x0d, /* U+00000d: <control>*/
-    0x0e, /* U+00000e: <control>*/
-    0x0f, /* U+00000f: <control>*/
-    0x10, /* U+000010: <control>*/
-    0x11, /* U+000011: <control>*/
-    0x12, /* U+000012: <control>*/
-    0x13, /* U+000013: <control>*/
-    0x14, /* U+000014: <control>*/
-    0x15, /* U+000015: <control>*/
-    0x16, /* U+000016: <control>*/
-    0x17, /* U+000017: <control>*/
-    0x18, /* U+000018: <control>*/
-    0x19, /* U+000019: <control>*/
-    0x1a, /* U+00001a: <control>*/
-    0x1b, /* U+00001b: <control>*/
-    0x1c, /* U+00001c: <control>*/
-    0x1d, /* U+00001d: <control>*/
-    0x1e, /* U+00001e: <control>*/
-    0x1f, /* U+00001f: <control>*/
-    0x20, /* U+000020: SPACE*/
-    0x21, /* U+000021: EXCLAMATION MARK*/
-    0x22, /* U+000022: QUOTATION MARK*/
-    0x23, /* U+000023: NUMBER SIGN*/
-    0x24, /* U+000024: DOLLAR SIGN*/
-    0x25, /* U+000025: PERCENT SIGN*/
-    0x26, /* U+000026: AMPERSAND*/
-    0x27, /* U+000027: APOSTROPHE*/
-    0x28, /* U+000028: LEFT PARENTHESIS*/
-    0x29, /* U+000029: RIGHT PARENTHESIS*/
-    0x2a, /* U+00002a: ASTERISK*/
-    0x2b, /* U+00002b: PLUS SIGN*/
-    0x2c, /* U+00002c: COMMA*/
-    0x2d, /* U+00002d: HYPHEN-MINUS*/
-    0x2e, /* U+00002e: FULL STOP*/
-    0x2f, /* U+00002f: SOLIDUS*/
-    0x30, /* U+000030: DIGIT ZERO*/
-    0x31, /* U+000031: DIGIT ONE*/
-    0x32, /* U+000032: DIGIT TWO*/
-    0x33, /* U+000033: DIGIT THREE*/
-    0x34, /* U+000034: DIGIT FOUR*/
-    0x35, /* U+000035: DIGIT FIVE*/
-    0x36, /* U+000036: DIGIT SIX*/
-    0x37, /* U+000037: DIGIT SEVEN*/
-    0x38, /* U+000038: DIGIT EIGHT*/
-    0x39, /* U+000039: DIGIT NINE*/
-    0x3a, /* U+00003a: COLON*/
-    0x3b, /* U+00003b: SEMICOLON*/
-    0x3c, /* U+00003c: LESS-THAN SIGN*/
-    0x3d, /* U+00003d: EQUALS SIGN*/
-    0x3e, /* U+00003e: GREATER-THAN SIGN*/
-    0x3f, /* U+00003f: QUESTION MARK*/
-    0x40, /* U+000040: COMMERCIAL AT*/
-    0x61, /* U+000041: LATIN CAPITAL LETTER A*/
-    0x62, /* U+000042: LATIN CAPITAL LETTER B*/
-    0x63, /* U+000043: LATIN CAPITAL LETTER C*/
-    0x64, /* U+000044: LATIN CAPITAL LETTER D*/
-    0x65, /* U+000045: LATIN CAPITAL LETTER E*/
-    0x66, /* U+000046: LATIN CAPITAL LETTER F*/
-    0x67, /* U+000047: LATIN CAPITAL LETTER G*/
-    0x68, /* U+000048: LATIN CAPITAL LETTER H*/
-    0x69, /* U+000049: LATIN CAPITAL LETTER I*/
-    0x6a, /* U+00004a: LATIN CAPITAL LETTER J*/
-    0x6b, /* U+00004b: LATIN CAPITAL LETTER K*/
-    0x6c, /* U+00004c: LATIN CAPITAL LETTER L*/
-    0x6d, /* U+00004d: LATIN CAPITAL LETTER M*/
-    0x6e, /* U+00004e: LATIN CAPITAL LETTER N*/
-    0x6f, /* U+00004f: LATIN CAPITAL LETTER O*/
-    0x70, /* U+000050: LATIN CAPITAL LETTER P*/
-    0x71, /* U+000051: LATIN CAPITAL LETTER Q*/
-    0x72, /* U+000052: LATIN CAPITAL LETTER R*/
-    0x73, /* U+000053: LATIN CAPITAL LETTER S*/
-    0x74, /* U+000054: LATIN CAPITAL LETTER T*/
-    0x75, /* U+000055: LATIN CAPITAL LETTER U*/
-    0x76, /* U+000056: LATIN CAPITAL LETTER V*/
-    0x77, /* U+000057: LATIN CAPITAL LETTER W*/
-    0x78, /* U+000058: LATIN CAPITAL LETTER X*/
-    0x79, /* U+000059: LATIN CAPITAL LETTER Y*/
-    0x7a, /* U+00005a: LATIN CAPITAL LETTER Z*/
-    0x5b, /* U+00005b: LEFT SQUARE BRACKET*/
-    0x5c, /* U+00005c: REVERSE SOLIDUS*/
-    0x5d, /* U+00005d: RIGHT SQUARE BRACKET*/
-    0x5e, /* U+00005e: CIRCUMFLEX ACCENT*/
-    0x5f, /* U+00005f: LOW LINE*/
-    0x60, /* U+000060: GRAVE ACCENT*/
-    0x61, /* U+000061: LATIN SMALL LETTER A*/
-    0x62, /* U+000062: LATIN SMALL LETTER B*/
-    0x63, /* U+000063: LATIN SMALL LETTER C*/
-    0x64, /* U+000064: LATIN SMALL LETTER D*/
-    0x65, /* U+000065: LATIN SMALL LETTER E*/
-    0x66, /* U+000066: LATIN SMALL LETTER F*/
-    0x67, /* U+000067: LATIN SMALL LETTER G*/
-    0x68, /* U+000068: LATIN SMALL LETTER H*/
-    0x69, /* U+000069: LATIN SMALL LETTER I*/
-    0x6a, /* U+00006a: LATIN SMALL LETTER J*/
-    0x6b, /* U+00006b: LATIN SMALL LETTER K*/
-    0x6c, /* U+00006c: LATIN SMALL LETTER L*/
-    0x6d, /* U+00006d: LATIN SMALL LETTER M*/
-    0x6e, /* U+00006e: LATIN SMALL LETTER N*/
-    0x6f, /* U+00006f: LATIN SMALL LETTER O*/
-    0x70, /* U+000070: LATIN SMALL LETTER P*/
-    0x71, /* U+000071: LATIN SMALL LETTER Q*/
-    0x72, /* U+000072: LATIN SMALL LETTER R*/
-    0x73, /* U+000073: LATIN SMALL LETTER S*/
-    0x74, /* U+000074: LATIN SMALL LETTER T*/
-    0x75, /* U+000075: LATIN SMALL LETTER U*/
-    0x76, /* U+000076: LATIN SMALL LETTER V*/
-    0x77, /* U+000077: LATIN SMALL LETTER W*/
-    0x78, /* U+000078: LATIN SMALL LETTER X*/
-    0x79, /* U+000079: LATIN SMALL LETTER Y*/
-    0x7a, /* U+00007a: LATIN SMALL LETTER Z*/
-    0x7b, /* U+00007b: LEFT CURLY BRACKET*/
-    0x7c, /* U+00007c: VERTICAL LINE*/
-    0x7d, /* U+00007d: RIGHT CURLY BRACKET*/
-    0x7e, /* U+00007e: TILDE*/
-    0x7f, /* U+00007f: <control>*/
-    0x80, /* U+000080: <control>*/
-    0x81, /* U+000081: <control>*/
-    0x82, /* U+000082: <control>*/
-    0x83, /* U+000083: <control>*/
-    0x84, /* U+000084: <control>*/
-    0x85, /* U+000085: <control>*/
-    0x86, /* U+000086: <control>*/
-    0x87, /* U+000087: <control>*/
-    0x88, /* U+000088: <control>*/
-    0x89, /* U+000089: <control>*/
-    0x8a, /* U+00008a: <control>*/
-    0x8b, /* U+00008b: <control>*/
-    0x8c, /* U+00008c: <control>*/
-    0x8d, /* U+00008d: <control>*/
-    0x8e, /* U+00008e: <control>*/
-    0x8f, /* U+00008f: <control>*/
-    0x90, /* U+000090: <control>*/
-    0x91, /* U+000091: <control>*/
-    0x92, /* U+000092: <control>*/
-    0x93, /* U+000093: <control>*/
-    0x94, /* U+000094: <control>*/
-    0x95, /* U+000095: <control>*/
-    0x96, /* U+000096: <control>*/
-    0x97, /* U+000097: <control>*/
-    0x98, /* U+000098: <control>*/
-    0x99, /* U+000099: <control>*/
-    0x9a, /* U+00009a: <control>*/
-    0x9b, /* U+00009b: <control>*/
-    0x9c, /* U+00009c: <control>*/
-    0x9d, /* U+00009d: <control>*/
-    0x9e, /* U+00009e: <control>*/
-    0x9f, /* U+00009f: <control>*/
-    0xa0, /* U+0000a0: NO-BREAK SPACE*/
-    0xa1, /* U+0000a1: INVERTED EXCLAMATION MARK*/
-    0xa2, /* U+0000a2: CENT SIGN*/
-    0xa3, /* U+0000a3: POUND SIGN*/
-    0xa4, /* U+0000a4: CURRENCY SIGN*/
-    0xa5, /* U+0000a5: YEN SIGN*/
-    0xa6, /* U+0000a6: BROKEN BAR*/
-    0xa7, /* U+0000a7: SECTION SIGN*/
-    0xa8, /* U+0000a8: DIAERESIS*/
-    0xa9, /* U+0000a9: COPYRIGHT SIGN*/
-    0xaa, /* U+0000aa: FEMININE ORDINAL INDICATOR*/
-    0xab, /* U+0000ab: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-    0xac, /* U+0000ac: NOT SIGN*/
-    0xad, /* U+0000ad: SOFT HYPHEN*/
-    0xae, /* U+0000ae: REGISTERED SIGN*/
-    0xaf, /* U+0000af: MACRON*/
-    0xb0, /* U+0000b0: DEGREE SIGN*/
-    0xb1, /* U+0000b1: PLUS-MINUS SIGN*/
-    0xb2, /* U+0000b2: SUPERSCRIPT TWO*/
-    0xb3, /* U+0000b3: SUPERSCRIPT THREE*/
-    0xb4, /* U+0000b4: ACUTE ACCENT*/
-    0xb5, /* U+0000b5: MICRO SIGN*/
-    0xb6, /* U+0000b6: PILCROW SIGN*/
-    0xb7, /* U+0000b7: MIDDLE DOT*/
-    0xb8, /* U+0000b8: CEDILLA*/
-    0xb9, /* U+0000b9: SUPERSCRIPT ONE*/
-    0xba, /* U+0000ba: MASCULINE ORDINAL INDICATOR*/
-    0xbb, /* U+0000bb: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK*/
-    0xbc, /* U+0000bc: VULGAR FRACTION ONE QUARTER*/
-    0xbd, /* U+0000bd: VULGAR FRACTION ONE HALF*/
-    0xbe, /* U+0000be: VULGAR FRACTION THREE QUARTERS*/
-    0xbf, /* U+0000bf: INVERTED QUESTION MARK*/
-    0xe0, /* U+0000c0: LATIN CAPITAL LETTER A WITH GRAVE*/
-    0xe1, /* U+0000c1: LATIN CAPITAL LETTER A WITH ACUTE*/
-    0xe2, /* U+0000c2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX*/
-    0xe3, /* U+0000c3: LATIN CAPITAL LETTER A WITH TILDE*/
-    0xe4, /* U+0000c4: LATIN CAPITAL LETTER A WITH DIAERESIS*/
-    0xe5, /* U+0000c5: LATIN CAPITAL LETTER A WITH RING ABOVE*/
-    0xe6, /* U+0000c6: LATIN CAPITAL LETTER AE*/
-    0xe7, /* U+0000c7: LATIN CAPITAL LETTER C WITH CEDILLA*/
-    0xe8, /* U+0000c8: LATIN CAPITAL LETTER E WITH GRAVE*/
-    0xe9, /* U+0000c9: LATIN CAPITAL LETTER E WITH ACUTE*/
-    0xea, /* U+0000ca: LATIN CAPITAL LETTER E WITH CIRCUMFLEX*/
-    0xeb, /* U+0000cb: LATIN CAPITAL LETTER E WITH DIAERESIS*/
-    0xec, /* U+0000cc: LATIN CAPITAL LETTER I WITH GRAVE*/
-    0xed, /* U+0000cd: LATIN CAPITAL LETTER I WITH ACUTE*/
-    0xee, /* U+0000ce: LATIN CAPITAL LETTER I WITH CIRCUMFLEX*/
-    0xef, /* U+0000cf: LATIN CAPITAL LETTER I WITH DIAERESIS*/
-    0xf0, /* U+0000d0: LATIN CAPITAL LETTER ETH*/
-    0xf1, /* U+0000d1: LATIN CAPITAL LETTER N WITH TILDE*/
-    0xf2, /* U+0000d2: LATIN CAPITAL LETTER O WITH GRAVE*/
-    0xf3, /* U+0000d3: LATIN CAPITAL LETTER O WITH ACUTE*/
-    0xf4, /* U+0000d4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX*/
-    0xf5, /* U+0000d5: LATIN CAPITAL LETTER O WITH TILDE*/
-    0xf6, /* U+0000d6: LATIN CAPITAL LETTER O WITH DIAERESIS*/
-    0xd7, /* U+0000d7: MULTIPLICATION SIGN*/
-    0xf8, /* U+0000d8: LATIN CAPITAL LETTER O WITH STROKE*/
-    0xf9, /* U+0000d9: LATIN CAPITAL LETTER U WITH GRAVE*/
-    0xfa, /* U+0000da: LATIN CAPITAL LETTER U WITH ACUTE*/
-    0xfb, /* U+0000db: LATIN CAPITAL LETTER U WITH CIRCUMFLEX*/
-    0xfc, /* U+0000dc: LATIN CAPITAL LETTER U WITH DIAERESIS*/
-    0xfd, /* U+0000dd: LATIN CAPITAL LETTER Y WITH ACUTE*/
-    0xfe, /* U+0000de: LATIN CAPITAL LETTER THORN*/
-    0xdf, /* U+0000df: LATIN SMALL LETTER SHARP S*/
-    0xe0, /* U+0000e0: LATIN SMALL LETTER A WITH GRAVE*/
-    0xe1, /* U+0000e1: LATIN SMALL LETTER A WITH ACUTE*/
-    0xe2, /* U+0000e2: LATIN SMALL LETTER A WITH CIRCUMFLEX*/
-    0xe3, /* U+0000e3: LATIN SMALL LETTER A WITH TILDE*/
-    0xe4, /* U+0000e4: LATIN SMALL LETTER A WITH DIAERESIS*/
-    0xe5, /* U+0000e5: LATIN SMALL LETTER A WITH RING ABOVE*/
-    0xe6, /* U+0000e6: LATIN SMALL LETTER AE*/
-    0xe7, /* U+0000e7: LATIN SMALL LETTER C WITH CEDILLA*/
-    0xe8, /* U+0000e8: LATIN SMALL LETTER E WITH GRAVE*/
-    0xe9, /* U+0000e9: LATIN SMALL LETTER E WITH ACUTE*/
-    0xea, /* U+0000ea: LATIN SMALL LETTER E WITH CIRCUMFLEX*/
-    0xeb, /* U+0000eb: LATIN SMALL LETTER E WITH DIAERESIS*/
-    0xec, /* U+0000ec: LATIN SMALL LETTER I WITH GRAVE*/
-    0xed, /* U+0000ed: LATIN SMALL LETTER I WITH ACUTE*/
-    0xee, /* U+0000ee: LATIN SMALL LETTER I WITH CIRCUMFLEX*/
-    0xef, /* U+0000ef: LATIN SMALL LETTER I WITH DIAERESIS*/
-    0xf0, /* U+0000f0: LATIN SMALL LETTER ETH*/
-    0xf1, /* U+0000f1: LATIN SMALL LETTER N WITH TILDE*/
-    0xf2, /* U+0000f2: LATIN SMALL LETTER O WITH GRAVE*/
-    0xf3, /* U+0000f3: LATIN SMALL LETTER O WITH ACUTE*/
-    0xf4, /* U+0000f4: LATIN SMALL LETTER O WITH CIRCUMFLEX*/
-    0xf5, /* U+0000f5: LATIN SMALL LETTER O WITH TILDE*/
-    0xf6, /* U+0000f6: LATIN SMALL LETTER O WITH DIAERESIS*/
-    0xf7, /* U+0000f7: DIVISION SIGN*/
-    0xf8, /* U+0000f8: LATIN SMALL LETTER O WITH STROKE*/
-    0xf9, /* U+0000f9: LATIN SMALL LETTER U WITH GRAVE*/
-    0xfa, /* U+0000fa: LATIN SMALL LETTER U WITH ACUTE*/
-    0xfb, /* U+0000fb: LATIN SMALL LETTER U WITH CIRCUMFLEX*/
-    0xfc, /* U+0000fc: LATIN SMALL LETTER U WITH DIAERESIS*/
-    0xfd, /* U+0000fd: LATIN SMALL LETTER Y WITH ACUTE*/
-    0xfe, /* U+0000fe: LATIN SMALL LETTER THORN*/
-    0xff, /* U+0000ff: LATIN SMALL LETTER Y WITH DIAERESIS*/
-    0x101, /* U+000100: LATIN CAPITAL LETTER A WITH MACRON*/
-    0x101, /* U+000101: LATIN SMALL LETTER A WITH MACRON*/
-    0x103, /* U+000102: LATIN CAPITAL LETTER A WITH BREVE*/
-    0x103, /* U+000103: LATIN SMALL LETTER A WITH BREVE*/
-    0x105, /* U+000104: LATIN CAPITAL LETTER A WITH OGONEK*/
-    0x105, /* U+000105: LATIN SMALL LETTER A WITH OGONEK*/
-    0x107, /* U+000106: LATIN CAPITAL LETTER C WITH ACUTE*/
-    0x107, /* U+000107: LATIN SMALL LETTER C WITH ACUTE*/
-    0x109, /* U+000108: LATIN CAPITAL LETTER C WITH CIRCUMFLEX*/
-    0x109, /* U+000109: LATIN SMALL LETTER C WITH CIRCUMFLEX*/
-    0x10b, /* U+00010a: LATIN CAPITAL LETTER C WITH DOT ABOVE*/
-    0x10b, /* U+00010b: LATIN SMALL LETTER C WITH DOT ABOVE*/
-    0x10d, /* U+00010c: LATIN CAPITAL LETTER C WITH CARON*/
-    0x10d, /* U+00010d: LATIN SMALL LETTER C WITH CARON*/
-    0x10f, /* U+00010e: LATIN CAPITAL LETTER D WITH CARON*/
-    0x10f, /* U+00010f: LATIN SMALL LETTER D WITH CARON*/
-    0x111, /* U+000110: LATIN CAPITAL LETTER D WITH STROKE*/
-    0x111, /* U+000111: LATIN SMALL LETTER D WITH STROKE*/
-    0x113, /* U+000112: LATIN CAPITAL LETTER E WITH MACRON*/
-    0x113, /* U+000113: LATIN SMALL LETTER E WITH MACRON*/
-    0x115, /* U+000114: LATIN CAPITAL LETTER E WITH BREVE*/
-    0x115, /* U+000115: LATIN SMALL LETTER E WITH BREVE*/
-    0x117, /* U+000116: LATIN CAPITAL LETTER E WITH DOT ABOVE*/
-    0x117, /* U+000117: LATIN SMALL LETTER E WITH DOT ABOVE*/
-    0x119, /* U+000118: LATIN CAPITAL LETTER E WITH OGONEK*/
-    0x119, /* U+000119: LATIN SMALL LETTER E WITH OGONEK*/
-    0x11b, /* U+00011a: LATIN CAPITAL LETTER E WITH CARON*/
-    0x11b, /* U+00011b: LATIN SMALL LETTER E WITH CARON*/
-    0x11d, /* U+00011c: LATIN CAPITAL LETTER G WITH CIRCUMFLEX*/
-    0x11d, /* U+00011d: LATIN SMALL LETTER G WITH CIRCUMFLEX*/
-    0x11f, /* U+00011e: LATIN CAPITAL LETTER G WITH BREVE*/
-    0x11f, /* U+00011f: LATIN SMALL LETTER G WITH BREVE*/
-    0x121, /* U+000120: LATIN CAPITAL LETTER G WITH DOT ABOVE*/
-    0x121, /* U+000121: LATIN SMALL LETTER G WITH DOT ABOVE*/
-    0x123, /* U+000122: LATIN CAPITAL LETTER G WITH CEDILLA*/
-    0x123, /* U+000123: LATIN SMALL LETTER G WITH CEDILLA*/
-    0x125, /* U+000124: LATIN CAPITAL LETTER H WITH CIRCUMFLEX*/
-    0x125, /* U+000125: LATIN SMALL LETTER H WITH CIRCUMFLEX*/
-    0x127, /* U+000126: LATIN CAPITAL LETTER H WITH STROKE*/
-    0x127, /* U+000127: LATIN SMALL LETTER H WITH STROKE*/
-    0x129, /* U+000128: LATIN CAPITAL LETTER I WITH TILDE*/
-    0x129, /* U+000129: LATIN SMALL LETTER I WITH TILDE*/
-    0x12b, /* U+00012a: LATIN CAPITAL LETTER I WITH MACRON*/
-    0x12b, /* U+00012b: LATIN SMALL LETTER I WITH MACRON*/
-    0x12d, /* U+00012c: LATIN CAPITAL LETTER I WITH BREVE*/
-    0x12d, /* U+00012d: LATIN SMALL LETTER I WITH BREVE*/
-    0x12f, /* U+00012e: LATIN CAPITAL LETTER I WITH OGONEK*/
-    0x12f, /* U+00012f: LATIN SMALL LETTER I WITH OGONEK*/
-    0x69, /* U+000130: LATIN CAPITAL LETTER I WITH DOT ABOVE*/
-    0x131, /* U+000131: LATIN SMALL LETTER DOTLESS I*/
-    0x133, /* U+000132: LATIN CAPITAL LIGATURE IJ*/
-    0x133, /* U+000133: LATIN SMALL LIGATURE IJ*/
-    0x135, /* U+000134: LATIN CAPITAL LETTER J WITH CIRCUMFLEX*/
-    0x135, /* U+000135: LATIN SMALL LETTER J WITH CIRCUMFLEX*/
-    0x137, /* U+000136: LATIN CAPITAL LETTER K WITH CEDILLA*/
-    0x137, /* U+000137: LATIN SMALL LETTER K WITH CEDILLA*/
-    0x138, /* U+000138: LATIN SMALL LETTER KRA*/
-    0x13a, /* U+000139: LATIN CAPITAL LETTER L WITH ACUTE*/
-    0x13a, /* U+00013a: LATIN SMALL LETTER L WITH ACUTE*/
-    0x13c, /* U+00013b: LATIN CAPITAL LETTER L WITH CEDILLA*/
-    0x13c, /* U+00013c: LATIN SMALL LETTER L WITH CEDILLA*/
-    0x13e, /* U+00013d: LATIN CAPITAL LETTER L WITH CARON*/
-    0x13e, /* U+00013e: LATIN SMALL LETTER L WITH CARON*/
-    0x140, /* U+00013f: LATIN CAPITAL LETTER L WITH MIDDLE DOT*/
-    0x140, /* U+000140: LATIN SMALL LETTER L WITH MIDDLE DOT*/
-    0x142, /* U+000141: LATIN CAPITAL LETTER L WITH STROKE*/
-    0x142, /* U+000142: LATIN SMALL LETTER L WITH STROKE*/
-    0x144, /* U+000143: LATIN CAPITAL LETTER N WITH ACUTE*/
-    0x144, /* U+000144: LATIN SMALL LETTER N WITH ACUTE*/
-    0x146, /* U+000145: LATIN CAPITAL LETTER N WITH CEDILLA*/
-    0x146, /* U+000146: LATIN SMALL LETTER N WITH CEDILLA*/
-    0x148, /* U+000147: LATIN CAPITAL LETTER N WITH CARON*/
-    0x148, /* U+000148: LATIN SMALL LETTER N WITH CARON*/
-    0x149, /* U+000149: LATIN SMALL LETTER N PRECEDED BY APOSTROPHE*/
-    0x14b, /* U+00014a: LATIN CAPITAL LETTER ENG*/
-    0x14b, /* U+00014b: LATIN SMALL LETTER ENG*/
-    0x14d, /* U+00014c: LATIN CAPITAL LETTER O WITH MACRON*/
-    0x14d, /* U+00014d: LATIN SMALL LETTER O WITH MACRON*/
-    0x14f, /* U+00014e: LATIN CAPITAL LETTER O WITH BREVE*/
-    0x14f, /* U+00014f: LATIN SMALL LETTER O WITH BREVE*/
-    0x151, /* U+000150: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE*/
-    0x151, /* U+000151: LATIN SMALL LETTER O WITH DOUBLE ACUTE*/
-    0x153, /* U+000152: LATIN CAPITAL LIGATURE OE*/
-    0x153, /* U+000153: LATIN SMALL LIGATURE OE*/
-    0x155, /* U+000154: LATIN CAPITAL LETTER R WITH ACUTE*/
-    0x155, /* U+000155: LATIN SMALL LETTER R WITH ACUTE*/
-    0x157, /* U+000156: LATIN CAPITAL LETTER R WITH CEDILLA*/
-    0x157, /* U+000157: LATIN SMALL LETTER R WITH CEDILLA*/
-    0x159, /* U+000158: LATIN CAPITAL LETTER R WITH CARON*/
-    0x159, /* U+000159: LATIN SMALL LETTER R WITH CARON*/
-    0x15b, /* U+00015a: LATIN CAPITAL LETTER S WITH ACUTE*/
-    0x15b, /* U+00015b: LATIN SMALL LETTER S WITH ACUTE*/
-    0x15d, /* U+00015c: LATIN CAPITAL LETTER S WITH CIRCUMFLEX*/
-    0x15d, /* U+00015d: LATIN SMALL LETTER S WITH CIRCUMFLEX*/
-    0x15f, /* U+00015e: LATIN CAPITAL LETTER S WITH CEDILLA*/
-    0x15f, /* U+00015f: LATIN SMALL LETTER S WITH CEDILLA*/
-    0x161, /* U+000160: LATIN CAPITAL LETTER S WITH CARON*/
-    0x161, /* U+000161: LATIN SMALL LETTER S WITH CARON*/
-    0x163, /* U+000162: LATIN CAPITAL LETTER T WITH CEDILLA*/
-    0x163, /* U+000163: LATIN SMALL LETTER T WITH CEDILLA*/
-    0x165, /* U+000164: LATIN CAPITAL LETTER T WITH CARON*/
-    0x165, /* U+000165: LATIN SMALL LETTER T WITH CARON*/
-    0x167, /* U+000166: LATIN CAPITAL LETTER T WITH STROKE*/
-    0x167, /* U+000167: LATIN SMALL LETTER T WITH STROKE*/
-    0x169, /* U+000168: LATIN CAPITAL LETTER U WITH TILDE*/
-    0x169, /* U+000169: LATIN SMALL LETTER U WITH TILDE*/
-    0x16b, /* U+00016a: LATIN CAPITAL LETTER U WITH MACRON*/
-    0x16b, /* U+00016b: LATIN SMALL LETTER U WITH MACRON*/
-    0x16d, /* U+00016c: LATIN CAPITAL LETTER U WITH BREVE*/
-    0x16d, /* U+00016d: LATIN SMALL LETTER U WITH BREVE*/
-    0x16f, /* U+00016e: LATIN CAPITAL LETTER U WITH RING ABOVE*/
-    0x16f, /* U+00016f: LATIN SMALL LETTER U WITH RING ABOVE*/
-    0x171, /* U+000170: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE*/
-    0x171, /* U+000171: LATIN SMALL LETTER U WITH DOUBLE ACUTE*/
-    0x173, /* U+000172: LATIN CAPITAL LETTER U WITH OGONEK*/
-    0x173, /* U+000173: LATIN SMALL LETTER U WITH OGONEK*/
-    0x175, /* U+000174: LATIN CAPITAL LETTER W WITH CIRCUMFLEX*/
-    0x175, /* U+000175: LATIN SMALL LETTER W WITH CIRCUMFLEX*/
-    0x177, /* U+000176: LATIN CAPITAL LETTER Y WITH CIRCUMFLEX*/
-    0x177, /* U+000177: LATIN SMALL LETTER Y WITH CIRCUMFLEX*/
-    0xff, /* U+000178: LATIN CAPITAL LETTER Y WITH DIAERESIS*/
-    0x17a, /* U+000179: LATIN CAPITAL LETTER Z WITH ACUTE*/
-    0x17a, /* U+00017a: LATIN SMALL LETTER Z WITH ACUTE*/
-    0x17c, /* U+00017b: LATIN CAPITAL LETTER Z WITH DOT ABOVE*/
-    0x17c, /* U+00017c: LATIN SMALL LETTER Z WITH DOT ABOVE*/
-    0x17e, /* U+00017d: LATIN CAPITAL LETTER Z WITH CARON*/
-    0x17e, /* U+00017e: LATIN SMALL LETTER Z WITH CARON*/
-    0x17f, /* U+00017f: LATIN SMALL LETTER LONG S*/
-    0x180, /* U+000180: LATIN SMALL LETTER B WITH STROKE*/
-    0x253, /* U+000181: LATIN CAPITAL LETTER B WITH HOOK*/
-    0x183, /* U+000182: LATIN CAPITAL LETTER B WITH TOPBAR*/
-    0x183, /* U+000183: LATIN SMALL LETTER B WITH TOPBAR*/
-    0x185, /* U+000184: LATIN CAPITAL LETTER TONE SIX*/
-    0x185, /* U+000185: LATIN SMALL LETTER TONE SIX*/
-    0x254, /* U+000186: LATIN CAPITAL LETTER OPEN O*/
-    0x188, /* U+000187: LATIN CAPITAL LETTER C WITH HOOK*/
-    0x188, /* U+000188: LATIN SMALL LETTER C WITH HOOK*/
-    0x256, /* U+000189: LATIN CAPITAL LETTER AFRICAN D*/
-    0x257, /* U+00018a: LATIN CAPITAL LETTER D WITH HOOK*/
-    0x18c, /* U+00018b: LATIN CAPITAL LETTER D WITH TOPBAR*/
-    0x18c, /* U+00018c: LATIN SMALL LETTER D WITH TOPBAR*/
-    0x18d, /* U+00018d: LATIN SMALL LETTER TURNED DELTA*/
-    0x1dd, /* U+00018e: LATIN CAPITAL LETTER REVERSED E*/
-    0x259, /* U+00018f: LATIN CAPITAL LETTER SCHWA*/
-    0x25b, /* U+000190: LATIN CAPITAL LETTER OPEN E*/
-    0x192, /* U+000191: LATIN CAPITAL LETTER F WITH HOOK*/
-    0x192, /* U+000192: LATIN SMALL LETTER F WITH HOOK*/
-    0x260, /* U+000193: LATIN CAPITAL LETTER G WITH HOOK*/
-    0x263, /* U+000194: LATIN CAPITAL LETTER GAMMA*/
-    0x195, /* U+000195: LATIN SMALL LETTER HV*/
-    0x269, /* U+000196: LATIN CAPITAL LETTER IOTA*/
-    0x268, /* U+000197: LATIN CAPITAL LETTER I WITH STROKE*/
-    0x199, /* U+000198: LATIN CAPITAL LETTER K WITH HOOK*/
-    0x199, /* U+000199: LATIN SMALL LETTER K WITH HOOK*/
-    0x19a, /* U+00019a: LATIN SMALL LETTER L WITH BAR*/
-    0x19b, /* U+00019b: LATIN SMALL LETTER LAMBDA WITH STROKE*/
-    0x26f, /* U+00019c: LATIN CAPITAL LETTER TURNED M*/
-    0x272, /* U+00019d: LATIN CAPITAL LETTER N WITH LEFT HOOK*/
-    0x19e, /* U+00019e: LATIN SMALL LETTER N WITH LONG RIGHT LEG*/
-    0x275, /* U+00019f: LATIN CAPITAL LETTER O WITH MIDDLE TILDE*/
-    0x1a1, /* U+0001a0: LATIN CAPITAL LETTER O WITH HORN*/
-    0x1a1, /* U+0001a1: LATIN SMALL LETTER O WITH HORN*/
-    0x1a3, /* U+0001a2: LATIN CAPITAL LETTER OI*/
-    0x1a3, /* U+0001a3: LATIN SMALL LETTER OI*/
-    0x1a5, /* U+0001a4: LATIN CAPITAL LETTER P WITH HOOK*/
-    0x1a5, /* U+0001a5: LATIN SMALL LETTER P WITH HOOK*/
-    0x280, /* U+0001a6: LATIN LETTER YR*/
-    0x1a8, /* U+0001a7: LATIN CAPITAL LETTER TONE TWO*/
-    0x1a8, /* U+0001a8: LATIN SMALL LETTER TONE TWO*/
-    0x283, /* U+0001a9: LATIN CAPITAL LETTER ESH*/
-    0x1aa, /* U+0001aa: LATIN LETTER REVERSED ESH LOOP*/
-    0x1ab, /* U+0001ab: LATIN SMALL LETTER T WITH PALATAL HOOK*/
-    0x1ad, /* U+0001ac: LATIN CAPITAL LETTER T WITH HOOK*/
-    0x1ad, /* U+0001ad: LATIN SMALL LETTER T WITH HOOK*/
-    0x288, /* U+0001ae: LATIN CAPITAL LETTER T WITH RETROFLEX HOOK*/
-    0x1b0, /* U+0001af: LATIN CAPITAL LETTER U WITH HORN*/
-    0x1b0, /* U+0001b0: LATIN SMALL LETTER U WITH HORN*/
-    0x28a, /* U+0001b1: LATIN CAPITAL LETTER UPSILON*/
-    0x28b, /* U+0001b2: LATIN CAPITAL LETTER V WITH HOOK*/
-    0x1b4, /* U+0001b3: LATIN CAPITAL LETTER Y WITH HOOK*/
-    0x1b4, /* U+0001b4: LATIN SMALL LETTER Y WITH HOOK*/
-    0x1b6, /* U+0001b5: LATIN CAPITAL LETTER Z WITH STROKE*/
-    0x1b6, /* U+0001b6: LATIN SMALL LETTER Z WITH STROKE*/
-    0x292, /* U+0001b7: LATIN CAPITAL LETTER EZH*/
-    0x1b9, /* U+0001b8: LATIN CAPITAL LETTER EZH REVERSED*/
-    0x1b9, /* U+0001b9: LATIN SMALL LETTER EZH REVERSED*/
-    0x1ba, /* U+0001ba: LATIN SMALL LETTER EZH WITH TAIL*/
-    0x1bb, /* U+0001bb: LATIN LETTER TWO WITH STROKE*/
-    0x1bd, /* U+0001bc: LATIN CAPITAL LETTER TONE FIVE*/
-    0x1bd, /* U+0001bd: LATIN SMALL LETTER TONE FIVE*/
-    0x1be, /* U+0001be: LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE*/
-    0x1bf, /* U+0001bf: LATIN LETTER WYNN*/
-    0x1c0, /* U+0001c0: LATIN LETTER DENTAL CLICK*/
-    0x1c1, /* U+0001c1: LATIN LETTER LATERAL CLICK*/
-    0x1c2, /* U+0001c2: LATIN LETTER ALVEOLAR CLICK*/
-    0x1c3, /* U+0001c3: LATIN LETTER RETROFLEX CLICK*/
-    0x1c6, /* U+0001c4: LATIN CAPITAL LETTER DZ WITH CARON*/
-    0x1c6, /* U+0001c5: LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON*/
-    0x1c6, /* U+0001c6: LATIN SMALL LETTER DZ WITH CARON*/
-    0x1c9, /* U+0001c7: LATIN CAPITAL LETTER LJ*/
-    0x1c9, /* U+0001c8: LATIN CAPITAL LETTER L WITH SMALL LETTER J*/
-    0x1c9, /* U+0001c9: LATIN SMALL LETTER LJ*/
-    0x1cc, /* U+0001ca: LATIN CAPITAL LETTER NJ*/
-    0x1cc, /* U+0001cb: LATIN CAPITAL LETTER N WITH SMALL LETTER J*/
-    0x1cc, /* U+0001cc: LATIN SMALL LETTER NJ*/
-    0x1ce, /* U+0001cd: LATIN CAPITAL LETTER A WITH CARON*/
-    0x1ce, /* U+0001ce: LATIN SMALL LETTER A WITH CARON*/
-    0x1d0, /* U+0001cf: LATIN CAPITAL LETTER I WITH CARON*/
-    0x1d0, /* U+0001d0: LATIN SMALL LETTER I WITH CARON*/
-    0x1d2, /* U+0001d1: LATIN CAPITAL LETTER O WITH CARON*/
-    0x1d2, /* U+0001d2: LATIN SMALL LETTER O WITH CARON*/
-    0x1d4, /* U+0001d3: LATIN CAPITAL LETTER U WITH CARON*/
-    0x1d4, /* U+0001d4: LATIN SMALL LETTER U WITH CARON*/
-    0x1d6, /* U+0001d5: LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON*/
-    0x1d6, /* U+0001d6: LATIN SMALL LETTER U WITH DIAERESIS AND MACRON*/
-    0x1d8, /* U+0001d7: LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE*/
-    0x1d8, /* U+0001d8: LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE*/
-    0x1da, /* U+0001d9: LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON*/
-    0x1da, /* U+0001da: LATIN SMALL LETTER U WITH DIAERESIS AND CARON*/
-    0x1dc, /* U+0001db: LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE*/
-    0x1dc, /* U+0001dc: LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE*/
-    0x1dd, /* U+0001dd: LATIN SMALL LETTER TURNED E*/
-    0x1df, /* U+0001de: LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON*/
-    0x1df, /* U+0001df: LATIN SMALL LETTER A WITH DIAERESIS AND MACRON*/
-    0x1e1, /* U+0001e0: LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON*/
-    0x1e1, /* U+0001e1: LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON*/
-    0x1e3, /* U+0001e2: LATIN CAPITAL LETTER AE WITH MACRON*/
-    0x1e3, /* U+0001e3: LATIN SMALL LETTER AE WITH MACRON*/
-    0x1e5, /* U+0001e4: LATIN CAPITAL LETTER G WITH STROKE*/
-    0x1e5, /* U+0001e5: LATIN SMALL LETTER G WITH STROKE*/
-    0x1e7, /* U+0001e6: LATIN CAPITAL LETTER G WITH CARON*/
-    0x1e7, /* U+0001e7: LATIN SMALL LETTER G WITH CARON*/
-    0x1e9, /* U+0001e8: LATIN CAPITAL LETTER K WITH CARON*/
-    0x1e9, /* U+0001e9: LATIN SMALL LETTER K WITH CARON*/
-    0x1eb, /* U+0001ea: LATIN CAPITAL LETTER O WITH OGONEK*/
-    0x1eb, /* U+0001eb: LATIN SMALL LETTER O WITH OGONEK*/
-    0x1ed, /* U+0001ec: LATIN CAPITAL LETTER O WITH OGONEK AND MACRON*/
-    0x1ed, /* U+0001ed: LATIN SMALL LETTER O WITH OGONEK AND MACRON*/
-    0x1ef, /* U+0001ee: LATIN CAPITAL LETTER EZH WITH CARON*/
-    0x1ef, /* U+0001ef: LATIN SMALL LETTER EZH WITH CARON*/
-    0x1f0, /* U+0001f0: LATIN SMALL LETTER J WITH CARON*/
-    0x1f3, /* U+0001f1: LATIN CAPITAL LETTER DZ*/
-    0x1f3, /* U+0001f2: LATIN CAPITAL LETTER D WITH SMALL LETTER Z*/
-    0x1f3, /* U+0001f3: LATIN SMALL LETTER DZ*/
-    0x1f5, /* U+0001f4: LATIN CAPITAL LETTER G WITH ACUTE*/
-    0x1f5, /* U+0001f5: LATIN SMALL LETTER G WITH ACUTE*/
-    0x195, /* U+0001f6: LATIN CAPITAL LETTER HWAIR*/
-    0x1bf, /* U+0001f7: LATIN CAPITAL LETTER WYNN*/
-    0x1f9, /* U+0001f8: LATIN CAPITAL LETTER N WITH GRAVE*/
-    0x1f9, /* U+0001f9: LATIN SMALL LETTER N WITH GRAVE*/
-    0x1fb, /* U+0001fa: LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE*/
-    0x1fb, /* U+0001fb: LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE*/
-    0x1fd, /* U+0001fc: LATIN CAPITAL LETTER AE WITH ACUTE*/
-    0x1fd, /* U+0001fd: LATIN SMALL LETTER AE WITH ACUTE*/
-    0x1ff, /* U+0001fe: LATIN CAPITAL LETTER O WITH STROKE AND ACUTE*/
-    0x1ff, /* U+0001ff: LATIN SMALL LETTER O WITH STROKE AND ACUTE*/
-    0x201, /* U+000200: LATIN CAPITAL LETTER A WITH DOUBLE GRAVE*/
-    0x201, /* U+000201: LATIN SMALL LETTER A WITH DOUBLE GRAVE*/
-    0x203, /* U+000202: LATIN CAPITAL LETTER A WITH INVERTED BREVE*/
-    0x203, /* U+000203: LATIN SMALL LETTER A WITH INVERTED BREVE*/
-    0x205, /* U+000204: LATIN CAPITAL LETTER E WITH DOUBLE GRAVE*/
-    0x205, /* U+000205: LATIN SMALL LETTER E WITH DOUBLE GRAVE*/
-    0x207, /* U+000206: LATIN CAPITAL LETTER E WITH INVERTED BREVE*/
-    0x207, /* U+000207: LATIN SMALL LETTER E WITH INVERTED BREVE*/
-    0x209, /* U+000208: LATIN CAPITAL LETTER I WITH DOUBLE GRAVE*/
-    0x209, /* U+000209: LATIN SMALL LETTER I WITH DOUBLE GRAVE*/
-    0x20b, /* U+00020a: LATIN CAPITAL LETTER I WITH INVERTED BREVE*/
-    0x20b, /* U+00020b: LATIN SMALL LETTER I WITH INVERTED BREVE*/
-    0x20d, /* U+00020c: LATIN CAPITAL LETTER O WITH DOUBLE GRAVE*/
-    0x20d, /* U+00020d: LATIN SMALL LETTER O WITH DOUBLE GRAVE*/
-    0x20f, /* U+00020e: LATIN CAPITAL LETTER O WITH INVERTED BREVE*/
-    0x20f, /* U+00020f: LATIN SMALL LETTER O WITH INVERTED BREVE*/
-    0x211, /* U+000210: LATIN CAPITAL LETTER R WITH DOUBLE GRAVE*/
-    0x211, /* U+000211: LATIN SMALL LETTER R WITH DOUBLE GRAVE*/
-    0x213, /* U+000212: LATIN CAPITAL LETTER R WITH INVERTED BREVE*/
-    0x213, /* U+000213: LATIN SMALL LETTER R WITH INVERTED BREVE*/
-    0x215, /* U+000214: LATIN CAPITAL LETTER U WITH DOUBLE GRAVE*/
-    0x215, /* U+000215: LATIN SMALL LETTER U WITH DOUBLE GRAVE*/
-    0x217, /* U+000216: LATIN CAPITAL LETTER U WITH INVERTED BREVE*/
-    0x217, /* U+000217: LATIN SMALL LETTER U WITH INVERTED BREVE*/
-    0x219, /* U+000218: LATIN CAPITAL LETTER S WITH COMMA BELOW*/
-    0x219, /* U+000219: LATIN SMALL LETTER S WITH COMMA BELOW*/
-    0x21b, /* U+00021a: LATIN CAPITAL LETTER T WITH COMMA BELOW*/
-    0x21b, /* U+00021b: LATIN SMALL LETTER T WITH COMMA BELOW*/
-    0x21d, /* U+00021c: LATIN CAPITAL LETTER YOGH*/
-    0x21d, /* U+00021d: LATIN SMALL LETTER YOGH*/
-    0x21f, /* U+00021e: LATIN CAPITAL LETTER H WITH CARON*/
-    0x21f, /* U+00021f: LATIN SMALL LETTER H WITH CARON*/
-    0x19e, /* U+000220: LATIN CAPITAL LETTER N WITH LONG RIGHT LEG*/
-    0x221, /* U+000221: LATIN SMALL LETTER D WITH CURL*/
-    0x223, /* U+000222: LATIN CAPITAL LETTER OU*/
-    0x223, /* U+000223: LATIN SMALL LETTER OU*/
-    0x225, /* U+000224: LATIN CAPITAL LETTER Z WITH HOOK*/
-    0x225, /* U+000225: LATIN SMALL LETTER Z WITH HOOK*/
-    0x227, /* U+000226: LATIN CAPITAL LETTER A WITH DOT ABOVE*/
-    0x227, /* U+000227: LATIN SMALL LETTER A WITH DOT ABOVE*/
-    0x229, /* U+000228: LATIN CAPITAL LETTER E WITH CEDILLA*/
-    0x229, /* U+000229: LATIN SMALL LETTER E WITH CEDILLA*/
-    0x22b, /* U+00022a: LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON*/
-    0x22b, /* U+00022b: LATIN SMALL LETTER O WITH DIAERESIS AND MACRON*/
-    0x22d, /* U+00022c: LATIN CAPITAL LETTER O WITH TILDE AND MACRON*/
-    0x22d, /* U+00022d: LATIN SMALL LETTER O WITH TILDE AND MACRON*/
-    0x22f, /* U+00022e: LATIN CAPITAL LETTER O WITH DOT ABOVE*/
-    0x22f, /* U+00022f: LATIN SMALL LETTER O WITH DOT ABOVE*/
-    0x231, /* U+000230: LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON*/
-    0x231, /* U+000231: LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON*/
-    0x233, /* U+000232: LATIN CAPITAL LETTER Y WITH MACRON*/
-    0x233, /* U+000233: LATIN SMALL LETTER Y WITH MACRON*/
-    0x234, /* U+000234: LATIN SMALL LETTER L WITH CURL*/
-    0x235, /* U+000235: LATIN SMALL LETTER N WITH CURL*/
-    0x236, /* U+000236: LATIN SMALL LETTER T WITH CURL*/
-    0x237, /* U+000237: LATIN SMALL LETTER DOTLESS J*/
-    0x238, /* U+000238: LATIN SMALL LETTER DB DIGRAPH*/
-    0x239, /* U+000239: LATIN SMALL LETTER QP DIGRAPH*/
-    0x23a, /* U+00023a: LATIN CAPITAL LETTER A WITH STROKE*/
-    0x23c, /* U+00023b: LATIN CAPITAL LETTER C WITH STROKE*/
-    0x23c, /* U+00023c: LATIN SMALL LETTER C WITH STROKE*/
-    0x19a, /* U+00023d: LATIN CAPITAL LETTER L WITH BAR*/
-    0x23e, /* U+00023e: LATIN CAPITAL LETTER T WITH DIAGONAL STROKE*/
-    0x23f, /* U+00023f: LATIN SMALL LETTER S WITH SWASH TAIL*/
-    0x240, /* U+000240: LATIN SMALL LETTER Z WITH SWASH TAIL*/
-    0x294, /* U+000241: LATIN CAPITAL LETTER GLOTTAL STOP*/
-    0x242, /* U+000242: */
-    0x243, /* U+000243: */
-    0x244, /* U+000244: */
-    0x245, /* U+000245: */
-    0x246, /* U+000246: */
-    0x247, /* U+000247: */
-    0x248, /* U+000248: */
-    0x249, /* U+000249: */
-    0x24a, /* U+00024a: */
-    0x24b, /* U+00024b: */
-    0x24c, /* U+00024c: */
-    0x24d, /* U+00024d: */
-    0x24e, /* U+00024e: */
-    0x24f, /* U+00024f: */
-    0x250, /* U+000250: LATIN SMALL LETTER TURNED A*/
-    0x251, /* U+000251: LATIN SMALL LETTER ALPHA*/
-    0x252, /* U+000252: LATIN SMALL LETTER TURNED ALPHA*/
-    0x253, /* U+000253: LATIN SMALL LETTER B WITH HOOK*/
-    0x254, /* U+000254: LATIN SMALL LETTER OPEN O*/
-    0x255, /* U+000255: LATIN SMALL LETTER C WITH CURL*/
-    0x256, /* U+000256: LATIN SMALL LETTER D WITH TAIL*/
-    0x257, /* U+000257: LATIN SMALL LETTER D WITH HOOK*/
-    0x258, /* U+000258: LATIN SMALL LETTER REVERSED E*/
-    0x259, /* U+000259: LATIN SMALL LETTER SCHWA*/
-    0x25a, /* U+00025a: LATIN SMALL LETTER SCHWA WITH HOOK*/
-    0x25b, /* U+00025b: LATIN SMALL LETTER OPEN E*/
-    0x25c, /* U+00025c: LATIN SMALL LETTER REVERSED OPEN E*/
-    0x25d, /* U+00025d: LATIN SMALL LETTER REVERSED OPEN E WITH HOOK*/
-    0x25e, /* U+00025e: LATIN SMALL LETTER CLOSED REVERSED OPEN E*/
-    0x25f, /* U+00025f: LATIN SMALL LETTER DOTLESS J WITH STROKE*/
-    0x260, /* U+000260: LATIN SMALL LETTER G WITH HOOK*/
-    0x261, /* U+000261: LATIN SMALL LETTER SCRIPT G*/
-    0x262, /* U+000262: LATIN LETTER SMALL CAPITAL G*/
-    0x263, /* U+000263: LATIN SMALL LETTER GAMMA*/
-    0x264, /* U+000264: LATIN SMALL LETTER RAMS HORN*/
-    0x265, /* U+000265: LATIN SMALL LETTER TURNED H*/
-    0x266, /* U+000266: LATIN SMALL LETTER H WITH HOOK*/
-    0x267, /* U+000267: LATIN SMALL LETTER HENG WITH HOOK*/
-    0x268, /* U+000268: LATIN SMALL LETTER I WITH STROKE*/
-    0x269, /* U+000269: LATIN SMALL LETTER IOTA*/
-    0x26a, /* U+00026a: LATIN LETTER SMALL CAPITAL I*/
-    0x26b, /* U+00026b: LATIN SMALL LETTER L WITH MIDDLE TILDE*/
-    0x26c, /* U+00026c: LATIN SMALL LETTER L WITH BELT*/
-    0x26d, /* U+00026d: LATIN SMALL LETTER L WITH RETROFLEX HOOK*/
-    0x26e, /* U+00026e: LATIN SMALL LETTER LEZH*/
-    0x26f, /* U+00026f: LATIN SMALL LETTER TURNED M*/
-    0x270, /* U+000270: LATIN SMALL LETTER TURNED M WITH LONG LEG*/
-    0x271, /* U+000271: LATIN SMALL LETTER M WITH HOOK*/
-    0x272, /* U+000272: LATIN SMALL LETTER N WITH LEFT HOOK*/
-    0x273, /* U+000273: LATIN SMALL LETTER N WITH RETROFLEX HOOK*/
-    0x274, /* U+000274: LATIN LETTER SMALL CAPITAL N*/
-    0x275, /* U+000275: LATIN SMALL LETTER BARRED O*/
-    0x276, /* U+000276: LATIN LETTER SMALL CAPITAL OE*/
-    0x277, /* U+000277: LATIN SMALL LETTER CLOSED OMEGA*/
-    0x278, /* U+000278: LATIN SMALL LETTER PHI*/
-    0x279, /* U+000279: LATIN SMALL LETTER TURNED R*/
-    0x27a, /* U+00027a: LATIN SMALL LETTER TURNED R WITH LONG LEG*/
-    0x27b, /* U+00027b: LATIN SMALL LETTER TURNED R WITH HOOK*/
-    0x27c, /* U+00027c: LATIN SMALL LETTER R WITH LONG LEG*/
-    0x27d, /* U+00027d: LATIN SMALL LETTER R WITH TAIL*/
-    0x27e, /* U+00027e: LATIN SMALL LETTER R WITH FISHHOOK*/
-    0x27f, /* U+00027f: LATIN SMALL LETTER REVERSED R WITH FISHHOOK*/
-    0x280, /* U+000280: LATIN LETTER SMALL CAPITAL R*/
-    0x281, /* U+000281: LATIN LETTER SMALL CAPITAL INVERTED R*/
-    0x282, /* U+000282: LATIN SMALL LETTER S WITH HOOK*/
-    0x283, /* U+000283: LATIN SMALL LETTER ESH*/
-    0x284, /* U+000284: LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK*/
-    0x285, /* U+000285: LATIN SMALL LETTER SQUAT REVERSED ESH*/
-    0x286, /* U+000286: LATIN SMALL LETTER ESH WITH CURL*/
-    0x287, /* U+000287: LATIN SMALL LETTER TURNED T*/
-    0x288, /* U+000288: LATIN SMALL LETTER T WITH RETROFLEX HOOK*/
-    0x289, /* U+000289: LATIN SMALL LETTER U BAR*/
-    0x28a, /* U+00028a: LATIN SMALL LETTER UPSILON*/
-    0x28b, /* U+00028b: LATIN SMALL LETTER V WITH HOOK*/
-    0x28c, /* U+00028c: LATIN SMALL LETTER TURNED V*/
-    0x28d, /* U+00028d: LATIN SMALL LETTER TURNED W*/
-    0x28e, /* U+00028e: LATIN SMALL LETTER TURNED Y*/
-    0x28f, /* U+00028f: LATIN LETTER SMALL CAPITAL Y*/
-    0x290, /* U+000290: LATIN SMALL LETTER Z WITH RETROFLEX HOOK*/
-    0x291, /* U+000291: LATIN SMALL LETTER Z WITH CURL*/
-    0x292, /* U+000292: LATIN SMALL LETTER EZH*/
-    0x293, /* U+000293: LATIN SMALL LETTER EZH WITH CURL*/
-    0x294, /* U+000294: LATIN LETTER GLOTTAL STOP*/
-    0x295, /* U+000295: LATIN LETTER PHARYNGEAL VOICED FRICATIVE*/
-    0x296, /* U+000296: LATIN LETTER INVERTED GLOTTAL STOP*/
-    0x297, /* U+000297: LATIN LETTER STRETCHED C*/
-    0x298, /* U+000298: LATIN LETTER BILABIAL CLICK*/
-    0x299, /* U+000299: LATIN LETTER SMALL CAPITAL B*/
-    0x29a, /* U+00029a: LATIN SMALL LETTER CLOSED OPEN E*/
-    0x29b, /* U+00029b: LATIN LETTER SMALL CAPITAL G WITH HOOK*/
-    0x29c, /* U+00029c: LATIN LETTER SMALL CAPITAL H*/
-    0x29d, /* U+00029d: LATIN SMALL LETTER J WITH CROSSED-TAIL*/
-    0x29e, /* U+00029e: LATIN SMALL LETTER TURNED K*/
-    0x29f, /* U+00029f: LATIN LETTER SMALL CAPITAL L*/
-    0x2a0, /* U+0002a0: LATIN SMALL LETTER Q WITH HOOK*/
-    0x2a1, /* U+0002a1: LATIN LETTER GLOTTAL STOP WITH STROKE*/
-    0x2a2, /* U+0002a2: LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE*/
-    0x2a3, /* U+0002a3: LATIN SMALL LETTER DZ DIGRAPH*/
-    0x2a4, /* U+0002a4: LATIN SMALL LETTER DEZH DIGRAPH*/
-    0x2a5, /* U+0002a5: LATIN SMALL LETTER DZ DIGRAPH WITH CURL*/
-    0x2a6, /* U+0002a6: LATIN SMALL LETTER TS DIGRAPH*/
-    0x2a7, /* U+0002a7: LATIN SMALL LETTER TESH DIGRAPH*/
-    0x2a8, /* U+0002a8: LATIN SMALL LETTER TC DIGRAPH WITH CURL*/
-    0x2a9, /* U+0002a9: LATIN SMALL LETTER FENG DIGRAPH*/
-    0x2aa, /* U+0002aa: LATIN SMALL LETTER LS DIGRAPH*/
-    0x2ab, /* U+0002ab: LATIN SMALL LETTER LZ DIGRAPH*/
-    0x2ac, /* U+0002ac: LATIN LETTER BILABIAL PERCUSSIVE*/
-    0x2ad, /* U+0002ad: LATIN LETTER BIDENTAL PERCUSSIVE*/
-    0x2ae, /* U+0002ae: LATIN SMALL LETTER TURNED H WITH FISHHOOK*/
-    0x2af, /* U+0002af: LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL*/
-    0x2b0, /* U+0002b0: MODIFIER LETTER SMALL H*/
-    0x2b1, /* U+0002b1: MODIFIER LETTER SMALL H WITH HOOK*/
-    0x2b2, /* U+0002b2: MODIFIER LETTER SMALL J*/
-    0x2b3, /* U+0002b3: MODIFIER LETTER SMALL R*/
-    0x2b4, /* U+0002b4: MODIFIER LETTER SMALL TURNED R*/
-    0x2b5, /* U+0002b5: MODIFIER LETTER SMALL TURNED R WITH HOOK*/
-    0x2b6, /* U+0002b6: MODIFIER LETTER SMALL CAPITAL INVERTED R*/
-    0x2b7, /* U+0002b7: MODIFIER LETTER SMALL W*/
-    0x2b8, /* U+0002b8: MODIFIER LETTER SMALL Y*/
-    0x2b9, /* U+0002b9: MODIFIER LETTER PRIME*/
-    0x2ba, /* U+0002ba: MODIFIER LETTER DOUBLE PRIME*/
-    0x2bb, /* U+0002bb: MODIFIER LETTER TURNED COMMA*/
-    0x2bc, /* U+0002bc: MODIFIER LETTER APOSTROPHE*/
-    0x2bd, /* U+0002bd: MODIFIER LETTER REVERSED COMMA*/
-    0x2be, /* U+0002be: MODIFIER LETTER RIGHT HALF RING*/
-    0x2bf, /* U+0002bf: MODIFIER LETTER LEFT HALF RING*/
-    0x2c0, /* U+0002c0: MODIFIER LETTER GLOTTAL STOP*/
-    0x2c1, /* U+0002c1: MODIFIER LETTER REVERSED GLOTTAL STOP*/
-    0x2c2, /* U+0002c2: MODIFIER LETTER LEFT ARROWHEAD*/
-    0x2c3, /* U+0002c3: MODIFIER LETTER RIGHT ARROWHEAD*/
-    0x2c4, /* U+0002c4: MODIFIER LETTER UP ARROWHEAD*/
-    0x2c5, /* U+0002c5: MODIFIER LETTER DOWN ARROWHEAD*/
-    0x2c6, /* U+0002c6: MODIFIER LETTER CIRCUMFLEX ACCENT*/
-    0x2c7, /* U+0002c7: CARON*/
-    0x2c8, /* U+0002c8: MODIFIER LETTER VERTICAL LINE*/
-    0x2c9, /* U+0002c9: MODIFIER LETTER MACRON*/
-    0x2ca, /* U+0002ca: MODIFIER LETTER ACUTE ACCENT*/
-    0x2cb, /* U+0002cb: MODIFIER LETTER GRAVE ACCENT*/
-    0x2cc, /* U+0002cc: MODIFIER LETTER LOW VERTICAL LINE*/
-    0x2cd, /* U+0002cd: MODIFIER LETTER LOW MACRON*/
-    0x2ce, /* U+0002ce: MODIFIER LETTER LOW GRAVE ACCENT*/
-    0x2cf, /* U+0002cf: MODIFIER LETTER LOW ACUTE ACCENT*/
-    0x2d0, /* U+0002d0: MODIFIER LETTER TRIANGULAR COLON*/
-    0x2d1, /* U+0002d1: MODIFIER LETTER HALF TRIANGULAR COLON*/
-    0x2d2, /* U+0002d2: MODIFIER LETTER CENTRED RIGHT HALF RING*/
-    0x2d3, /* U+0002d3: MODIFIER LETTER CENTRED LEFT HALF RING*/
-    0x2d4, /* U+0002d4: MODIFIER LETTER UP TACK*/
-    0x2d5, /* U+0002d5: MODIFIER LETTER DOWN TACK*/
-    0x2d6, /* U+0002d6: MODIFIER LETTER PLUS SIGN*/
-    0x2d7, /* U+0002d7: MODIFIER LETTER MINUS SIGN*/
-    0x2d8, /* U+0002d8: BREVE*/
-    0x2d9, /* U+0002d9: DOT ABOVE*/
-    0x2da, /* U+0002da: RING ABOVE*/
-    0x2db, /* U+0002db: OGONEK*/
-    0x2dc, /* U+0002dc: SMALL TILDE*/
-    0x2dd, /* U+0002dd: DOUBLE ACUTE ACCENT*/
-    0x2de, /* U+0002de: MODIFIER LETTER RHOTIC HOOK*/
-    0x2df, /* U+0002df: MODIFIER LETTER CROSS ACCENT*/
-    0x2e0, /* U+0002e0: MODIFIER LETTER SMALL GAMMA*/
-    0x2e1, /* U+0002e1: MODIFIER LETTER SMALL L*/
-    0x2e2, /* U+0002e2: MODIFIER LETTER SMALL S*/
-    0x2e3, /* U+0002e3: MODIFIER LETTER SMALL X*/
-    0x2e4, /* U+0002e4: MODIFIER LETTER SMALL REVERSED GLOTTAL STOP*/
-    0x2e5, /* U+0002e5: MODIFIER LETTER EXTRA-HIGH TONE BAR*/
-    0x2e6, /* U+0002e6: MODIFIER LETTER HIGH TONE BAR*/
-    0x2e7, /* U+0002e7: MODIFIER LETTER MID TONE BAR*/
-    0x2e8, /* U+0002e8: MODIFIER LETTER LOW TONE BAR*/
-    0x2e9, /* U+0002e9: MODIFIER LETTER EXTRA-LOW TONE BAR*/
-    0x2ea, /* U+0002ea: MODIFIER LETTER YIN DEPARTING TONE MARK*/
-    0x2eb, /* U+0002eb: MODIFIER LETTER YANG DEPARTING TONE MARK*/
-    0x2ec, /* U+0002ec: MODIFIER LETTER VOICING*/
-    0x2ed, /* U+0002ed: MODIFIER LETTER UNASPIRATED*/
-    0x2ee, /* U+0002ee: MODIFIER LETTER DOUBLE APOSTROPHE*/
-    0x2ef, /* U+0002ef: MODIFIER LETTER LOW DOWN ARROWHEAD*/
-    0x2f0, /* U+0002f0: MODIFIER LETTER LOW UP ARROWHEAD*/
-    0x2f1, /* U+0002f1: MODIFIER LETTER LOW LEFT ARROWHEAD*/
-    0x2f2, /* U+0002f2: MODIFIER LETTER LOW RIGHT ARROWHEAD*/
-    0x2f3, /* U+0002f3: MODIFIER LETTER LOW RING*/
-    0x2f4, /* U+0002f4: MODIFIER LETTER MIDDLE GRAVE ACCENT*/
-    0x2f5, /* U+0002f5: MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT*/
-    0x2f6, /* U+0002f6: MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT*/
-    0x2f7, /* U+0002f7: MODIFIER LETTER LOW TILDE*/
-    0x2f8, /* U+0002f8: MODIFIER LETTER RAISED COLON*/
-    0x2f9, /* U+0002f9: MODIFIER LETTER BEGIN HIGH TONE*/
-    0x2fa, /* U+0002fa: MODIFIER LETTER END HIGH TONE*/
-    0x2fb, /* U+0002fb: MODIFIER LETTER BEGIN LOW TONE*/
-    0x2fc, /* U+0002fc: MODIFIER LETTER END LOW TONE*/
-    0x2fd, /* U+0002fd: MODIFIER LETTER SHELF*/
-    0x2fe, /* U+0002fe: MODIFIER LETTER OPEN SHELF*/
-    0x2ff, /* U+0002ff: MODIFIER LETTER LOW LEFT ARROW*/
-    0x300, /* U+000300: COMBINING GRAVE ACCENT*/
-    0x301, /* U+000301: COMBINING ACUTE ACCENT*/
-    0x302, /* U+000302: COMBINING CIRCUMFLEX ACCENT*/
-    0x303, /* U+000303: COMBINING TILDE*/
-    0x304, /* U+000304: COMBINING MACRON*/
-    0x305, /* U+000305: COMBINING OVERLINE*/
-    0x306, /* U+000306: COMBINING BREVE*/
-    0x307, /* U+000307: COMBINING DOT ABOVE*/
-    0x308, /* U+000308: COMBINING DIAERESIS*/
-    0x309, /* U+000309: COMBINING HOOK ABOVE*/
-    0x30a, /* U+00030a: COMBINING RING ABOVE*/
-    0x30b, /* U+00030b: COMBINING DOUBLE ACUTE ACCENT*/
-    0x30c, /* U+00030c: COMBINING CARON*/
-    0x30d, /* U+00030d: COMBINING VERTICAL LINE ABOVE*/
-    0x30e, /* U+00030e: COMBINING DOUBLE VERTICAL LINE ABOVE*/
-    0x30f, /* U+00030f: COMBINING DOUBLE GRAVE ACCENT*/
-    0x310, /* U+000310: COMBINING CANDRABINDU*/
-    0x311, /* U+000311: COMBINING INVERTED BREVE*/
-    0x312, /* U+000312: COMBINING TURNED COMMA ABOVE*/
-    0x313, /* U+000313: COMBINING COMMA ABOVE*/
-    0x314, /* U+000314: COMBINING REVERSED COMMA ABOVE*/
-    0x315, /* U+000315: COMBINING COMMA ABOVE RIGHT*/
-    0x316, /* U+000316: COMBINING GRAVE ACCENT BELOW*/
-    0x317, /* U+000317: COMBINING ACUTE ACCENT BELOW*/
-    0x318, /* U+000318: COMBINING LEFT TACK BELOW*/
-    0x319, /* U+000319: COMBINING RIGHT TACK BELOW*/
-    0x31a, /* U+00031a: COMBINING LEFT ANGLE ABOVE*/
-    0x31b, /* U+00031b: COMBINING HORN*/
-    0x31c, /* U+00031c: COMBINING LEFT HALF RING BELOW*/
-    0x31d, /* U+00031d: COMBINING UP TACK BELOW*/
-    0x31e, /* U+00031e: COMBINING DOWN TACK BELOW*/
-    0x31f, /* U+00031f: COMBINING PLUS SIGN BELOW*/
-    0x320, /* U+000320: COMBINING MINUS SIGN BELOW*/
-    0x321, /* U+000321: COMBINING PALATALIZED HOOK BELOW*/
-    0x322, /* U+000322: COMBINING RETROFLEX HOOK BELOW*/
-    0x323, /* U+000323: COMBINING DOT BELOW*/
-    0x324, /* U+000324: COMBINING DIAERESIS BELOW*/
-    0x325, /* U+000325: COMBINING RING BELOW*/
-    0x326, /* U+000326: COMBINING COMMA BELOW*/
-    0x327, /* U+000327: COMBINING CEDILLA*/
-    0x328, /* U+000328: COMBINING OGONEK*/
-    0x329, /* U+000329: COMBINING VERTICAL LINE BELOW*/
-    0x32a, /* U+00032a: COMBINING BRIDGE BELOW*/
-    0x32b, /* U+00032b: COMBINING INVERTED DOUBLE ARCH BELOW*/
-    0x32c, /* U+00032c: COMBINING CARON BELOW*/
-    0x32d, /* U+00032d: COMBINING CIRCUMFLEX ACCENT BELOW*/
-    0x32e, /* U+00032e: COMBINING BREVE BELOW*/
-    0x32f, /* U+00032f: COMBINING INVERTED BREVE BELOW*/
-    0x330, /* U+000330: COMBINING TILDE BELOW*/
-    0x331, /* U+000331: COMBINING MACRON BELOW*/
-    0x332, /* U+000332: COMBINING LOW LINE*/
-    0x333, /* U+000333: COMBINING DOUBLE LOW LINE*/
-    0x334, /* U+000334: COMBINING TILDE OVERLAY*/
-    0x335, /* U+000335: COMBINING SHORT STROKE OVERLAY*/
-    0x336, /* U+000336: COMBINING LONG STROKE OVERLAY*/
-    0x337, /* U+000337: COMBINING SHORT SOLIDUS OVERLAY*/
-    0x338, /* U+000338: COMBINING LONG SOLIDUS OVERLAY*/
-    0x339, /* U+000339: COMBINING RIGHT HALF RING BELOW*/
-    0x33a, /* U+00033a: COMBINING INVERTED BRIDGE BELOW*/
-    0x33b, /* U+00033b: COMBINING SQUARE BELOW*/
-    0x33c, /* U+00033c: COMBINING SEAGULL BELOW*/
-    0x33d, /* U+00033d: COMBINING X ABOVE*/
-    0x33e, /* U+00033e: COMBINING VERTICAL TILDE*/
-    0x33f, /* U+00033f: COMBINING DOUBLE OVERLINE*/
-    0x340, /* U+000340: COMBINING GRAVE TONE MARK*/
-    0x341, /* U+000341: COMBINING ACUTE TONE MARK*/
-    0x342, /* U+000342: COMBINING GREEK PERISPOMENI*/
-    0x343, /* U+000343: COMBINING GREEK KORONIS*/
-    0x344, /* U+000344: COMBINING GREEK DIALYTIKA TONOS*/
-    0x345, /* U+000345: COMBINING GREEK YPOGEGRAMMENI*/
-    0x346, /* U+000346: COMBINING BRIDGE ABOVE*/
-    0x347, /* U+000347: COMBINING EQUALS SIGN BELOW*/
-    0x348, /* U+000348: COMBINING DOUBLE VERTICAL LINE BELOW*/
-    0x349, /* U+000349: COMBINING LEFT ANGLE BELOW*/
-    0x34a, /* U+00034a: COMBINING NOT TILDE ABOVE*/
-    0x34b, /* U+00034b: COMBINING HOMOTHETIC ABOVE*/
-    0x34c, /* U+00034c: COMBINING ALMOST EQUAL TO ABOVE*/
-    0x34d, /* U+00034d: COMBINING LEFT RIGHT ARROW BELOW*/
-    0x34e, /* U+00034e: COMBINING UPWARDS ARROW BELOW*/
-    0x34f, /* U+00034f: COMBINING GRAPHEME JOINER*/
-    0x350, /* U+000350: COMBINING RIGHT ARROWHEAD ABOVE*/
-    0x351, /* U+000351: COMBINING LEFT HALF RING ABOVE*/
-    0x352, /* U+000352: COMBINING FERMATA*/
-    0x353, /* U+000353: COMBINING X BELOW*/
-    0x354, /* U+000354: COMBINING LEFT ARROWHEAD BELOW*/
-    0x355, /* U+000355: COMBINING RIGHT ARROWHEAD BELOW*/
-    0x356, /* U+000356: COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW*/
-    0x357, /* U+000357: COMBINING RIGHT HALF RING ABOVE*/
-    0x358, /* U+000358: COMBINING DOT ABOVE RIGHT*/
-    0x359, /* U+000359: COMBINING ASTERISK BELOW*/
-    0x35a, /* U+00035a: COMBINING DOUBLE RING BELOW*/
-    0x35b, /* U+00035b: COMBINING ZIGZAG ABOVE*/
-    0x35c, /* U+00035c: COMBINING DOUBLE BREVE BELOW*/
-    0x35d, /* U+00035d: COMBINING DOUBLE BREVE*/
-    0x35e, /* U+00035e: COMBINING DOUBLE MACRON*/
-    0x35f, /* U+00035f: COMBINING DOUBLE MACRON BELOW*/
-    0x360, /* U+000360: COMBINING DOUBLE TILDE*/
-    0x361, /* U+000361: COMBINING DOUBLE INVERTED BREVE*/
-    0x362, /* U+000362: COMBINING DOUBLE RIGHTWARDS ARROW BELOW*/
-    0x363, /* U+000363: COMBINING LATIN SMALL LETTER A*/
-    0x364, /* U+000364: COMBINING LATIN SMALL LETTER E*/
-    0x365, /* U+000365: COMBINING LATIN SMALL LETTER I*/
-    0x366, /* U+000366: COMBINING LATIN SMALL LETTER O*/
-    0x367, /* U+000367: COMBINING LATIN SMALL LETTER U*/
-    0x368, /* U+000368: COMBINING LATIN SMALL LETTER C*/
-    0x369, /* U+000369: COMBINING LATIN SMALL LETTER D*/
-    0x36a, /* U+00036a: COMBINING LATIN SMALL LETTER H*/
-    0x36b, /* U+00036b: COMBINING LATIN SMALL LETTER M*/
-    0x36c, /* U+00036c: COMBINING LATIN SMALL LETTER R*/
-    0x36d, /* U+00036d: COMBINING LATIN SMALL LETTER T*/
-    0x36e, /* U+00036e: COMBINING LATIN SMALL LETTER V*/
-    0x36f, /* U+00036f: COMBINING LATIN SMALL LETTER X*/
-    0x370, /* U+000370: */
-    0x371, /* U+000371: */
-    0x372, /* U+000372: */
-    0x373, /* U+000373: */
-    0x374, /* U+000374: GREEK NUMERAL SIGN*/
-    0x375, /* U+000375: GREEK LOWER NUMERAL SIGN*/
-    0x376, /* U+000376: */
-    0x377, /* U+000377: */
-    0x378, /* U+000378: */
-    0x379, /* U+000379: */
-    0x37a, /* U+00037a: GREEK YPOGEGRAMMENI*/
-    0x37b, /* U+00037b: */
-    0x37c, /* U+00037c: */
-    0x37d, /* U+00037d: */
-    0x37e, /* U+00037e: GREEK QUESTION MARK*/
-    0x37f, /* U+00037f: */
-    0x380, /* U+000380: */
-    0x381, /* U+000381: */
-    0x382, /* U+000382: */
-    0x383, /* U+000383: */
-    0x384, /* U+000384: GREEK TONOS*/
-    0x385, /* U+000385: GREEK DIALYTIKA TONOS*/
-    0x3ac, /* U+000386: GREEK CAPITAL LETTER ALPHA WITH TONOS*/
-    0x387, /* U+000387: GREEK ANO TELEIA*/
-    0x3ad, /* U+000388: GREEK CAPITAL LETTER EPSILON WITH TONOS*/
-    0x3ae, /* U+000389: GREEK CAPITAL LETTER ETA WITH TONOS*/
-    0x3af, /* U+00038a: GREEK CAPITAL LETTER IOTA WITH TONOS*/
-    0x38b, /* U+00038b: */
-    0x3cc, /* U+00038c: GREEK CAPITAL LETTER OMICRON WITH TONOS*/
-    0x38d, /* U+00038d: */
-    0x3cd, /* U+00038e: GREEK CAPITAL LETTER UPSILON WITH TONOS*/
-    0x3ce, /* U+00038f: GREEK CAPITAL LETTER OMEGA WITH TONOS*/
-    0x390, /* U+000390: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS*/
-    0x3b1, /* U+000391: GREEK CAPITAL LETTER ALPHA*/
-    0x3b2, /* U+000392: GREEK CAPITAL LETTER BETA*/
-    0x3b3, /* U+000393: GREEK CAPITAL LETTER GAMMA*/
-    0x3b4, /* U+000394: GREEK CAPITAL LETTER DELTA*/
-    0x3b5, /* U+000395: GREEK CAPITAL LETTER EPSILON*/
-    0x3b6, /* U+000396: GREEK CAPITAL LETTER ZETA*/
-    0x3b7, /* U+000397: GREEK CAPITAL LETTER ETA*/
-    0x3b8, /* U+000398: GREEK CAPITAL LETTER THETA*/
-    0x3b9, /* U+000399: GREEK CAPITAL LETTER IOTA*/
-    0x3ba, /* U+00039a: GREEK CAPITAL LETTER KAPPA*/
-    0x3bb, /* U+00039b: GREEK CAPITAL LETTER LAMDA*/
-    0x3bc, /* U+00039c: GREEK CAPITAL LETTER MU*/
-    0x3bd, /* U+00039d: GREEK CAPITAL LETTER NU*/
-    0x3be, /* U+00039e: GREEK CAPITAL LETTER XI*/
-    0x3bf, /* U+00039f: GREEK CAPITAL LETTER OMICRON*/
-    0x3c0, /* U+0003a0: GREEK CAPITAL LETTER PI*/
-    0x3c1, /* U+0003a1: GREEK CAPITAL LETTER RHO*/
-    0x3a2, /* U+0003a2: */
-    0x3c3, /* U+0003a3: GREEK CAPITAL LETTER SIGMA*/
-    0x3c4, /* U+0003a4: GREEK CAPITAL LETTER TAU*/
-    0x3c5, /* U+0003a5: GREEK CAPITAL LETTER UPSILON*/
-    0x3c6, /* U+0003a6: GREEK CAPITAL LETTER PHI*/
-    0x3c7, /* U+0003a7: GREEK CAPITAL LETTER CHI*/
-    0x3c8, /* U+0003a8: GREEK CAPITAL LETTER PSI*/
-    0x3c9, /* U+0003a9: GREEK CAPITAL LETTER OMEGA*/
-    0x3ca, /* U+0003aa: GREEK CAPITAL LETTER IOTA WITH DIALYTIKA*/
-    0x3cb, /* U+0003ab: GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA*/
-    0x3ac, /* U+0003ac: GREEK SMALL LETTER ALPHA WITH TONOS*/
-    0x3ad, /* U+0003ad: GREEK SMALL LETTER EPSILON WITH TONOS*/
-    0x3ae, /* U+0003ae: GREEK SMALL LETTER ETA WITH TONOS*/
-    0x3af, /* U+0003af: GREEK SMALL LETTER IOTA WITH TONOS*/
-    0x3b0, /* U+0003b0: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS*/
-    0x3b1, /* U+0003b1: GREEK SMALL LETTER ALPHA*/
-    0x3b2, /* U+0003b2: GREEK SMALL LETTER BETA*/
-    0x3b3, /* U+0003b3: GREEK SMALL LETTER GAMMA*/
-    0x3b4, /* U+0003b4: GREEK SMALL LETTER DELTA*/
-    0x3b5, /* U+0003b5: GREEK SMALL LETTER EPSILON*/
-    0x3b6, /* U+0003b6: GREEK SMALL LETTER ZETA*/
-    0x3b7, /* U+0003b7: GREEK SMALL LETTER ETA*/
-    0x3b8, /* U+0003b8: GREEK SMALL LETTER THETA*/
-    0x3b9, /* U+0003b9: GREEK SMALL LETTER IOTA*/
-    0x3ba, /* U+0003ba: GREEK SMALL LETTER KAPPA*/
-    0x3bb, /* U+0003bb: GREEK SMALL LETTER LAMDA*/
-    0x3bc, /* U+0003bc: GREEK SMALL LETTER MU*/
-    0x3bd, /* U+0003bd: GREEK SMALL LETTER NU*/
-    0x3be, /* U+0003be: GREEK SMALL LETTER XI*/
-    0x3bf, /* U+0003bf: GREEK SMALL LETTER OMICRON*/
-    0x3c0, /* U+0003c0: GREEK SMALL LETTER PI*/
-    0x3c1, /* U+0003c1: GREEK SMALL LETTER RHO*/
-    0x3c2, /* U+0003c2: GREEK SMALL LETTER FINAL SIGMA*/
-    0x3c3, /* U+0003c3: GREEK SMALL LETTER SIGMA*/
-    0x3c4, /* U+0003c4: GREEK SMALL LETTER TAU*/
-    0x3c5, /* U+0003c5: GREEK SMALL LETTER UPSILON*/
-    0x3c6, /* U+0003c6: GREEK SMALL LETTER PHI*/
-    0x3c7, /* U+0003c7: GREEK SMALL LETTER CHI*/
-    0x3c8, /* U+0003c8: GREEK SMALL LETTER PSI*/
-    0x3c9, /* U+0003c9: GREEK SMALL LETTER OMEGA*/
-    0x3ca, /* U+0003ca: GREEK SMALL LETTER IOTA WITH DIALYTIKA*/
-    0x3cb, /* U+0003cb: GREEK SMALL LETTER UPSILON WITH DIALYTIKA*/
-    0x3cc, /* U+0003cc: GREEK SMALL LETTER OMICRON WITH TONOS*/
-    0x3cd, /* U+0003cd: GREEK SMALL LETTER UPSILON WITH TONOS*/
-    0x3ce, /* U+0003ce: GREEK SMALL LETTER OMEGA WITH TONOS*/
-    0x3cf, /* U+0003cf: */
-    0x3d0, /* U+0003d0: GREEK BETA SYMBOL*/
-    0x3d1, /* U+0003d1: GREEK THETA SYMBOL*/
-    0x3d2, /* U+0003d2: GREEK UPSILON WITH HOOK SYMBOL*/
-    0x3d3, /* U+0003d3: GREEK UPSILON WITH ACUTE AND HOOK SYMBOL*/
-    0x3d4, /* U+0003d4: GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL*/
-    0x3d5, /* U+0003d5: GREEK PHI SYMBOL*/
-    0x3d6, /* U+0003d6: GREEK PI SYMBOL*/
-    0x3d7, /* U+0003d7: GREEK KAI SYMBOL*/
-    0x3d9, /* U+0003d8: GREEK LETTER ARCHAIC KOPPA*/
-    0x3d9, /* U+0003d9: GREEK SMALL LETTER ARCHAIC KOPPA*/
-    0x3db, /* U+0003da: GREEK LETTER STIGMA*/
-    0x3db, /* U+0003db: GREEK SMALL LETTER STIGMA*/
-    0x3dd, /* U+0003dc: GREEK LETTER DIGAMMA*/
-    0x3dd, /* U+0003dd: GREEK SMALL LETTER DIGAMMA*/
-    0x3df, /* U+0003de: GREEK LETTER KOPPA*/
-    0x3df, /* U+0003df: GREEK SMALL LETTER KOPPA*/
-    0x3e1, /* U+0003e0: GREEK LETTER SAMPI*/
-    0x3e1, /* U+0003e1: GREEK SMALL LETTER SAMPI*/
-    0x3e3, /* U+0003e2: COPTIC CAPITAL LETTER SHEI*/
-    0x3e3, /* U+0003e3: COPTIC SMALL LETTER SHEI*/
-    0x3e5, /* U+0003e4: COPTIC CAPITAL LETTER FEI*/
-    0x3e5, /* U+0003e5: COPTIC SMALL LETTER FEI*/
-    0x3e7, /* U+0003e6: COPTIC CAPITAL LETTER KHEI*/
-    0x3e7, /* U+0003e7: COPTIC SMALL LETTER KHEI*/
-    0x3e9, /* U+0003e8: COPTIC CAPITAL LETTER HORI*/
-    0x3e9, /* U+0003e9: COPTIC SMALL LETTER HORI*/
-    0x3eb, /* U+0003ea: COPTIC CAPITAL LETTER GANGIA*/
-    0x3eb, /* U+0003eb: COPTIC SMALL LETTER GANGIA*/
-    0x3ed, /* U+0003ec: COPTIC CAPITAL LETTER SHIMA*/
-    0x3ed, /* U+0003ed: COPTIC SMALL LETTER SHIMA*/
-    0x3ef, /* U+0003ee: COPTIC CAPITAL LETTER DEI*/
-    0x3ef, /* U+0003ef: COPTIC SMALL LETTER DEI*/
-    0x3f0, /* U+0003f0: GREEK KAPPA SYMBOL*/
-    0x3f1, /* U+0003f1: GREEK RHO SYMBOL*/
-    0x3f2, /* U+0003f2: GREEK LUNATE SIGMA SYMBOL*/
-    0x3f3, /* U+0003f3: GREEK LETTER YOT*/
-    0x3b8, /* U+0003f4: GREEK CAPITAL THETA SYMBOL*/
-    0x3f5, /* U+0003f5: GREEK LUNATE EPSILON SYMBOL*/
-    0x3f6, /* U+0003f6: GREEK REVERSED LUNATE EPSILON SYMBOL*/
-    0x3f8, /* U+0003f7: GREEK CAPITAL LETTER SHO*/
-    0x3f8, /* U+0003f8: GREEK SMALL LETTER SHO*/
-    0x3f2, /* U+0003f9: GREEK CAPITAL LUNATE SIGMA SYMBOL*/
-    0x3fb, /* U+0003fa: GREEK CAPITAL LETTER SAN*/
-    0x3fb, /* U+0003fb: GREEK SMALL LETTER SAN*/
-    0x3fc, /* U+0003fc: GREEK RHO WITH STROKE SYMBOL*/
-    0x3fd, /* U+0003fd: GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL*/
-    0x3fe, /* U+0003fe: GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL*/
-    0x3ff, /* U+0003ff: GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL*/
-    0x450, /* U+000400: CYRILLIC CAPITAL LETTER IE WITH GRAVE*/
-    0x451, /* U+000401: CYRILLIC CAPITAL LETTER IO*/
-    0x452, /* U+000402: CYRILLIC CAPITAL LETTER DJE*/
-    0x453, /* U+000403: CYRILLIC CAPITAL LETTER GJE*/
-    0x454, /* U+000404: CYRILLIC CAPITAL LETTER UKRAINIAN IE*/
-    0x455, /* U+000405: CYRILLIC CAPITAL LETTER DZE*/
-    0x456, /* U+000406: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I*/
-    0x457, /* U+000407: CYRILLIC CAPITAL LETTER YI*/
-    0x458, /* U+000408: CYRILLIC CAPITAL LETTER JE*/
-    0x459, /* U+000409: CYRILLIC CAPITAL LETTER LJE*/
-    0x45a, /* U+00040a: CYRILLIC CAPITAL LETTER NJE*/
-    0x45b, /* U+00040b: CYRILLIC CAPITAL LETTER TSHE*/
-    0x45c, /* U+00040c: CYRILLIC CAPITAL LETTER KJE*/
-    0x45d, /* U+00040d: CYRILLIC CAPITAL LETTER I WITH GRAVE*/
-    0x45e, /* U+00040e: CYRILLIC CAPITAL LETTER SHORT U*/
-    0x45f, /* U+00040f: CYRILLIC CAPITAL LETTER DZHE*/
-    0x430, /* U+000410: CYRILLIC CAPITAL LETTER A*/
-    0x431, /* U+000411: CYRILLIC CAPITAL LETTER BE*/
-    0x432, /* U+000412: CYRILLIC CAPITAL LETTER VE*/
-    0x433, /* U+000413: CYRILLIC CAPITAL LETTER GHE*/
-    0x434, /* U+000414: CYRILLIC CAPITAL LETTER DE*/
-    0x435, /* U+000415: CYRILLIC CAPITAL LETTER IE*/
-    0x436, /* U+000416: CYRILLIC CAPITAL LETTER ZHE*/
-    0x437, /* U+000417: CYRILLIC CAPITAL LETTER ZE*/
-    0x438, /* U+000418: CYRILLIC CAPITAL LETTER I*/
-    0x439, /* U+000419: CYRILLIC CAPITAL LETTER SHORT I*/
-    0x43a, /* U+00041a: CYRILLIC CAPITAL LETTER KA*/
-    0x43b, /* U+00041b: CYRILLIC CAPITAL LETTER EL*/
-    0x43c, /* U+00041c: CYRILLIC CAPITAL LETTER EM*/
-    0x43d, /* U+00041d: CYRILLIC CAPITAL LETTER EN*/
-    0x43e, /* U+00041e: CYRILLIC CAPITAL LETTER O*/
-    0x43f, /* U+00041f: CYRILLIC CAPITAL LETTER PE*/
-    0x440, /* U+000420: CYRILLIC CAPITAL LETTER ER*/
-    0x441, /* U+000421: CYRILLIC CAPITAL LETTER ES*/
-    0x442, /* U+000422: CYRILLIC CAPITAL LETTER TE*/
-    0x443, /* U+000423: CYRILLIC CAPITAL LETTER U*/
-    0x444, /* U+000424: CYRILLIC CAPITAL LETTER EF*/
-    0x445, /* U+000425: CYRILLIC CAPITAL LETTER HA*/
-    0x446, /* U+000426: CYRILLIC CAPITAL LETTER TSE*/
-    0x447, /* U+000427: CYRILLIC CAPITAL LETTER CHE*/
-    0x448, /* U+000428: CYRILLIC CAPITAL LETTER SHA*/
-    0x449, /* U+000429: CYRILLIC CAPITAL LETTER SHCHA*/
-    0x44a, /* U+00042a: CYRILLIC CAPITAL LETTER HARD SIGN*/
-    0x44b, /* U+00042b: CYRILLIC CAPITAL LETTER YERU*/
-    0x44c, /* U+00042c: CYRILLIC CAPITAL LETTER SOFT SIGN*/
-    0x44d, /* U+00042d: CYRILLIC CAPITAL LETTER E*/
-    0x44e, /* U+00042e: CYRILLIC CAPITAL LETTER YU*/
-    0x44f, /* U+00042f: CYRILLIC CAPITAL LETTER YA*/
-    0x430, /* U+000430: CYRILLIC SMALL LETTER A*/
-    0x431, /* U+000431: CYRILLIC SMALL LETTER BE*/
-    0x432, /* U+000432: CYRILLIC SMALL LETTER VE*/
-    0x433, /* U+000433: CYRILLIC SMALL LETTER GHE*/
-    0x434, /* U+000434: CYRILLIC SMALL LETTER DE*/
-    0x435, /* U+000435: CYRILLIC SMALL LETTER IE*/
-    0x436, /* U+000436: CYRILLIC SMALL LETTER ZHE*/
-    0x437, /* U+000437: CYRILLIC SMALL LETTER ZE*/
-    0x438, /* U+000438: CYRILLIC SMALL LETTER I*/
-    0x439, /* U+000439: CYRILLIC SMALL LETTER SHORT I*/
-    0x43a, /* U+00043a: CYRILLIC SMALL LETTER KA*/
-    0x43b, /* U+00043b: CYRILLIC SMALL LETTER EL*/
-    0x43c, /* U+00043c: CYRILLIC SMALL LETTER EM*/
-    0x43d, /* U+00043d: CYRILLIC SMALL LETTER EN*/
-    0x43e, /* U+00043e: CYRILLIC SMALL LETTER O*/
-    0x43f, /* U+00043f: CYRILLIC SMALL LETTER PE*/
-    0x440, /* U+000440: CYRILLIC SMALL LETTER ER*/
-    0x441, /* U+000441: CYRILLIC SMALL LETTER ES*/
-    0x442, /* U+000442: CYRILLIC SMALL LETTER TE*/
-    0x443, /* U+000443: CYRILLIC SMALL LETTER U*/
-    0x444, /* U+000444: CYRILLIC SMALL LETTER EF*/
-    0x445, /* U+000445: CYRILLIC SMALL LETTER HA*/
-    0x446, /* U+000446: CYRILLIC SMALL LETTER TSE*/
-    0x447, /* U+000447: CYRILLIC SMALL LETTER CHE*/
-    0x448, /* U+000448: CYRILLIC SMALL LETTER SHA*/
-    0x449, /* U+000449: CYRILLIC SMALL LETTER SHCHA*/
-    0x44a, /* U+00044a: CYRILLIC SMALL LETTER HARD SIGN*/
-    0x44b, /* U+00044b: CYRILLIC SMALL LETTER YERU*/
-    0x44c, /* U+00044c: CYRILLIC SMALL LETTER SOFT SIGN*/
-    0x44d, /* U+00044d: CYRILLIC SMALL LETTER E*/
-    0x44e, /* U+00044e: CYRILLIC SMALL LETTER YU*/
-    0x44f, /* U+00044f: CYRILLIC SMALL LETTER YA*/
-    0x450, /* U+000450: CYRILLIC SMALL LETTER IE WITH GRAVE*/
-    0x451, /* U+000451: CYRILLIC SMALL LETTER IO*/
-    0x452, /* U+000452: CYRILLIC SMALL LETTER DJE*/
-    0x453, /* U+000453: CYRILLIC SMALL LETTER GJE*/
-    0x454, /* U+000454: CYRILLIC SMALL LETTER UKRAINIAN IE*/
-    0x455, /* U+000455: CYRILLIC SMALL LETTER DZE*/
-    0x456, /* U+000456: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I*/
-    0x457, /* U+000457: CYRILLIC SMALL LETTER YI*/
-    0x458, /* U+000458: CYRILLIC SMALL LETTER JE*/
-    0x459, /* U+000459: CYRILLIC SMALL LETTER LJE*/
-    0x45a, /* U+00045a: CYRILLIC SMALL LETTER NJE*/
-    0x45b, /* U+00045b: CYRILLIC SMALL LETTER TSHE*/
-    0x45c, /* U+00045c: CYRILLIC SMALL LETTER KJE*/
-    0x45d, /* U+00045d: CYRILLIC SMALL LETTER I WITH GRAVE*/
-    0x45e, /* U+00045e: CYRILLIC SMALL LETTER SHORT U*/
-    0x45f, /* U+00045f: CYRILLIC SMALL LETTER DZHE*/
-    0x461, /* U+000460: CYRILLIC CAPITAL LETTER OMEGA*/
-    0x461, /* U+000461: CYRILLIC SMALL LETTER OMEGA*/
-    0x463, /* U+000462: CYRILLIC CAPITAL LETTER YAT*/
-    0x463, /* U+000463: CYRILLIC SMALL LETTER YAT*/
-    0x465, /* U+000464: CYRILLIC CAPITAL LETTER IOTIFIED E*/
-    0x465, /* U+000465: CYRILLIC SMALL LETTER IOTIFIED E*/
-    0x467, /* U+000466: CYRILLIC CAPITAL LETTER LITTLE YUS*/
-    0x467, /* U+000467: CYRILLIC SMALL LETTER LITTLE YUS*/
-    0x469, /* U+000468: CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS*/
-    0x469, /* U+000469: CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS*/
-    0x46b, /* U+00046a: CYRILLIC CAPITAL LETTER BIG YUS*/
-    0x46b, /* U+00046b: CYRILLIC SMALL LETTER BIG YUS*/
-    0x46d, /* U+00046c: CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS*/
-    0x46d, /* U+00046d: CYRILLIC SMALL LETTER IOTIFIED BIG YUS*/
-    0x46f, /* U+00046e: CYRILLIC CAPITAL LETTER KSI*/
-    0x46f, /* U+00046f: CYRILLIC SMALL LETTER KSI*/
-    0x471, /* U+000470: CYRILLIC CAPITAL LETTER PSI*/
-    0x471, /* U+000471: CYRILLIC SMALL LETTER PSI*/
-    0x473, /* U+000472: CYRILLIC CAPITAL LETTER FITA*/
-    0x473, /* U+000473: CYRILLIC SMALL LETTER FITA*/
-    0x475, /* U+000474: CYRILLIC CAPITAL LETTER IZHITSA*/
-    0x475, /* U+000475: CYRILLIC SMALL LETTER IZHITSA*/
-    0x477, /* U+000476: CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-    0x477, /* U+000477: CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT*/
-    0x479, /* U+000478: CYRILLIC CAPITAL LETTER UK*/
-    0x479, /* U+000479: CYRILLIC SMALL LETTER UK*/
-    0x47b, /* U+00047a: CYRILLIC CAPITAL LETTER ROUND OMEGA*/
-    0x47b, /* U+00047b: CYRILLIC SMALL LETTER ROUND OMEGA*/
-    0x47d, /* U+00047c: CYRILLIC CAPITAL LETTER OMEGA WITH TITLO*/
-    0x47d, /* U+00047d: CYRILLIC SMALL LETTER OMEGA WITH TITLO*/
-    0x47f, /* U+00047e: CYRILLIC CAPITAL LETTER OT*/
-    0x47f, /* U+00047f: CYRILLIC SMALL LETTER OT*/
-    0x481, /* U+000480: CYRILLIC CAPITAL LETTER KOPPA*/
-    0x481, /* U+000481: CYRILLIC SMALL LETTER KOPPA*/
-    0x482, /* U+000482: CYRILLIC THOUSANDS SIGN*/
-    0x483, /* U+000483: COMBINING CYRILLIC TITLO*/
-    0x484, /* U+000484: COMBINING CYRILLIC PALATALIZATION*/
-    0x485, /* U+000485: COMBINING CYRILLIC DASIA PNEUMATA*/
-    0x486, /* U+000486: COMBINING CYRILLIC PSILI PNEUMATA*/
-    0x487, /* U+000487: */
-    0x488, /* U+000488: COMBINING CYRILLIC HUNDRED THOUSANDS SIGN*/
-    0x489, /* U+000489: COMBINING CYRILLIC MILLIONS SIGN*/
-    0x48b, /* U+00048a: CYRILLIC CAPITAL LETTER SHORT I WITH TAIL*/
-    0x48b, /* U+00048b: CYRILLIC SMALL LETTER SHORT I WITH TAIL*/
-    0x48d, /* U+00048c: CYRILLIC CAPITAL LETTER SEMISOFT SIGN*/
-    0x48d, /* U+00048d: CYRILLIC SMALL LETTER SEMISOFT SIGN*/
-    0x48f, /* U+00048e: CYRILLIC CAPITAL LETTER ER WITH TICK*/
-    0x48f, /* U+00048f: CYRILLIC SMALL LETTER ER WITH TICK*/
-    0x491, /* U+000490: CYRILLIC CAPITAL LETTER GHE WITH UPTURN*/
-    0x491, /* U+000491: CYRILLIC SMALL LETTER GHE WITH UPTURN*/
-    0x493, /* U+000492: CYRILLIC CAPITAL LETTER GHE WITH STROKE*/
-    0x493, /* U+000493: CYRILLIC SMALL LETTER GHE WITH STROKE*/
-    0x495, /* U+000494: CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK*/
-    0x495, /* U+000495: CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK*/
-    0x497, /* U+000496: CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER*/
-    0x497, /* U+000497: CYRILLIC SMALL LETTER ZHE WITH DESCENDER*/
-    0x499, /* U+000498: CYRILLIC CAPITAL LETTER ZE WITH DESCENDER*/
-    0x499, /* U+000499: CYRILLIC SMALL LETTER ZE WITH DESCENDER*/
-    0x49b, /* U+00049a: CYRILLIC CAPITAL LETTER KA WITH DESCENDER*/
-    0x49b, /* U+00049b: CYRILLIC SMALL LETTER KA WITH DESCENDER*/
-    0x49d, /* U+00049c: CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE*/
-    0x49d, /* U+00049d: CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE*/
-    0x49f, /* U+00049e: CYRILLIC CAPITAL LETTER KA WITH STROKE*/
-    0x49f, /* U+00049f: CYRILLIC SMALL LETTER KA WITH STROKE*/
-    0x4a1, /* U+0004a0: CYRILLIC CAPITAL LETTER BASHKIR KA*/
-    0x4a1, /* U+0004a1: CYRILLIC SMALL LETTER BASHKIR KA*/
-    0x4a3, /* U+0004a2: CYRILLIC CAPITAL LETTER EN WITH DESCENDER*/
-    0x4a3, /* U+0004a3: CYRILLIC SMALL LETTER EN WITH DESCENDER*/
-    0x4a5, /* U+0004a4: CYRILLIC CAPITAL LIGATURE EN GHE*/
-    0x4a5, /* U+0004a5: CYRILLIC SMALL LIGATURE EN GHE*/
-    0x4a7, /* U+0004a6: CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK*/
-    0x4a7, /* U+0004a7: CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK*/
-    0x4a9, /* U+0004a8: CYRILLIC CAPITAL LETTER ABKHASIAN HA*/
-    0x4a9, /* U+0004a9: CYRILLIC SMALL LETTER ABKHASIAN HA*/
-    0x4ab, /* U+0004aa: CYRILLIC CAPITAL LETTER ES WITH DESCENDER*/
-    0x4ab, /* U+0004ab: CYRILLIC SMALL LETTER ES WITH DESCENDER*/
-    0x4ad, /* U+0004ac: CYRILLIC CAPITAL LETTER TE WITH DESCENDER*/
-    0x4ad, /* U+0004ad: CYRILLIC SMALL LETTER TE WITH DESCENDER*/
-    0x4af, /* U+0004ae: CYRILLIC CAPITAL LETTER STRAIGHT U*/
-    0x4af, /* U+0004af: CYRILLIC SMALL LETTER STRAIGHT U*/
-    0x4b1, /* U+0004b0: CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE*/
-    0x4b1, /* U+0004b1: CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE*/
-    0x4b3, /* U+0004b2: CYRILLIC CAPITAL LETTER HA WITH DESCENDER*/
-    0x4b3, /* U+0004b3: CYRILLIC SMALL LETTER HA WITH DESCENDER*/
-    0x4b5, /* U+0004b4: CYRILLIC CAPITAL LIGATURE TE TSE*/
-    0x4b5, /* U+0004b5: CYRILLIC SMALL LIGATURE TE TSE*/
-    0x4b7, /* U+0004b6: CYRILLIC CAPITAL LETTER CHE WITH DESCENDER*/
-    0x4b7, /* U+0004b7: CYRILLIC SMALL LETTER CHE WITH DESCENDER*/
-    0x4b9, /* U+0004b8: CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE*/
-    0x4b9, /* U+0004b9: CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE*/
-    0x4bb, /* U+0004ba: CYRILLIC CAPITAL LETTER SHHA*/
-    0x4bb, /* U+0004bb: CYRILLIC SMALL LETTER SHHA*/
-    0x4bd, /* U+0004bc: CYRILLIC CAPITAL LETTER ABKHASIAN CHE*/
-    0x4bd, /* U+0004bd: CYRILLIC SMALL LETTER ABKHASIAN CHE*/
-    0x4bf, /* U+0004be: CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER*/
-    0x4bf, /* U+0004bf: CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER*/
-    0x4c0, /* U+0004c0: CYRILLIC LETTER PALOCHKA*/
-    0x4c2, /* U+0004c1: CYRILLIC CAPITAL LETTER ZHE WITH BREVE*/
-    0x4c2, /* U+0004c2: CYRILLIC SMALL LETTER ZHE WITH BREVE*/
-    0x4c4, /* U+0004c3: CYRILLIC CAPITAL LETTER KA WITH HOOK*/
-    0x4c4, /* U+0004c4: CYRILLIC SMALL LETTER KA WITH HOOK*/
-    0x4c6, /* U+0004c5: CYRILLIC CAPITAL LETTER EL WITH TAIL*/
-    0x4c6, /* U+0004c6: CYRILLIC SMALL LETTER EL WITH TAIL*/
-    0x4c8, /* U+0004c7: CYRILLIC CAPITAL LETTER EN WITH HOOK*/
-    0x4c8, /* U+0004c8: CYRILLIC SMALL LETTER EN WITH HOOK*/
-    0x4ca, /* U+0004c9: CYRILLIC CAPITAL LETTER EN WITH TAIL*/
-    0x4ca, /* U+0004ca: CYRILLIC SMALL LETTER EN WITH TAIL*/
-    0x4cc, /* U+0004cb: CYRILLIC CAPITAL LETTER KHAKASSIAN CHE*/
-    0x4cc, /* U+0004cc: CYRILLIC SMALL LETTER KHAKASSIAN CHE*/
-    0x4ce, /* U+0004cd: CYRILLIC CAPITAL LETTER EM WITH TAIL*/
-    0x4ce, /* U+0004ce: CYRILLIC SMALL LETTER EM WITH TAIL*/
-    0x4cf, /* U+0004cf: */
-    0x4d1, /* U+0004d0: CYRILLIC CAPITAL LETTER A WITH BREVE*/
-    0x4d1, /* U+0004d1: CYRILLIC SMALL LETTER A WITH BREVE*/
-    0x4d3, /* U+0004d2: CYRILLIC CAPITAL LETTER A WITH DIAERESIS*/
-    0x4d3, /* U+0004d3: CYRILLIC SMALL LETTER A WITH DIAERESIS*/
-    0x4d5, /* U+0004d4: CYRILLIC CAPITAL LIGATURE A IE*/
-    0x4d5, /* U+0004d5: CYRILLIC SMALL LIGATURE A IE*/
-    0x4d7, /* U+0004d6: CYRILLIC CAPITAL LETTER IE WITH BREVE*/
-    0x4d7, /* U+0004d7: CYRILLIC SMALL LETTER IE WITH BREVE*/
-    0x4d9, /* U+0004d8: CYRILLIC CAPITAL LETTER SCHWA*/
-    0x4d9, /* U+0004d9: CYRILLIC SMALL LETTER SCHWA*/
-    0x4db, /* U+0004da: CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS*/
-    0x4db, /* U+0004db: CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS*/
-    0x4dd, /* U+0004dc: CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS*/
-    0x4dd, /* U+0004dd: CYRILLIC SMALL LETTER ZHE WITH DIAERESIS*/
-    0x4df, /* U+0004de: CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS*/
-    0x4df, /* U+0004df: CYRILLIC SMALL LETTER ZE WITH DIAERESIS*/
-    0x4e1, /* U+0004e0: CYRILLIC CAPITAL LETTER ABKHASIAN DZE*/
-    0x4e1, /* U+0004e1: CYRILLIC SMALL LETTER ABKHASIAN DZE*/
-    0x4e3, /* U+0004e2: CYRILLIC CAPITAL LETTER I WITH MACRON*/
-    0x4e3, /* U+0004e3: CYRILLIC SMALL LETTER I WITH MACRON*/
-    0x4e5, /* U+0004e4: CYRILLIC CAPITAL LETTER I WITH DIAERESIS*/
-    0x4e5, /* U+0004e5: CYRILLIC SMALL LETTER I WITH DIAERESIS*/
-    0x4e7, /* U+0004e6: CYRILLIC CAPITAL LETTER O WITH DIAERESIS*/
-    0x4e7, /* U+0004e7: CYRILLIC SMALL LETTER O WITH DIAERESIS*/
-    0x4e9, /* U+0004e8: CYRILLIC CAPITAL LETTER BARRED O*/
-    0x4e9, /* U+0004e9: CYRILLIC SMALL LETTER BARRED O*/
-    0x4eb, /* U+0004ea: CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS*/
-    0x4eb, /* U+0004eb: CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS*/
-    0x4ed, /* U+0004ec: CYRILLIC CAPITAL LETTER E WITH DIAERESIS*/
-    0x4ed, /* U+0004ed: CYRILLIC SMALL LETTER E WITH DIAERESIS*/
-    0x4ef, /* U+0004ee: CYRILLIC CAPITAL LETTER U WITH MACRON*/
-    0x4ef, /* U+0004ef: CYRILLIC SMALL LETTER U WITH MACRON*/
-    0x4f1, /* U+0004f0: CYRILLIC CAPITAL LETTER U WITH DIAERESIS*/
-    0x4f1, /* U+0004f1: CYRILLIC SMALL LETTER U WITH DIAERESIS*/
-    0x4f3, /* U+0004f2: CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE*/
-    0x4f3, /* U+0004f3: CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE*/
-    0x4f5, /* U+0004f4: CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS*/
-    0x4f5, /* U+0004f5: CYRILLIC SMALL LETTER CHE WITH DIAERESIS*/
-    0x4f7, /* U+0004f6: CYRILLIC CAPITAL LETTER GHE WITH DESCENDER*/
-    0x4f7, /* U+0004f7: CYRILLIC SMALL LETTER GHE WITH DESCENDER*/
-    0x4f9, /* U+0004f8: CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS*/
-    0x4f9, /* U+0004f9: CYRILLIC SMALL LETTER YERU WITH DIAERESIS*/
-    0x4fa, /* U+0004fa: */
-    0x4fb, /* U+0004fb: */
-    0x4fc, /* U+0004fc: */
-    0x4fd, /* U+0004fd: */
-    0x4fe, /* U+0004fe: */
-    0x4ff, /* U+0004ff: */
-    0x501, /* U+000500: CYRILLIC CAPITAL LETTER KOMI DE*/
-    0x501, /* U+000501: CYRILLIC SMALL LETTER KOMI DE*/
-    0x503, /* U+000502: CYRILLIC CAPITAL LETTER KOMI DJE*/
-    0x503, /* U+000503: CYRILLIC SMALL LETTER KOMI DJE*/
-    0x505, /* U+000504: CYRILLIC CAPITAL LETTER KOMI ZJE*/
-    0x505, /* U+000505: CYRILLIC SMALL LETTER KOMI ZJE*/
-    0x507, /* U+000506: CYRILLIC CAPITAL LETTER KOMI DZJE*/
-    0x507, /* U+000507: CYRILLIC SMALL LETTER KOMI DZJE*/
-    0x509, /* U+000508: CYRILLIC CAPITAL LETTER KOMI LJE*/
-    0x509, /* U+000509: CYRILLIC SMALL LETTER KOMI LJE*/
-    0x50b, /* U+00050a: CYRILLIC CAPITAL LETTER KOMI NJE*/
-    0x50b, /* U+00050b: CYRILLIC SMALL LETTER KOMI NJE*/
-    0x50d, /* U+00050c: CYRILLIC CAPITAL LETTER KOMI SJE*/
-    0x50d, /* U+00050d: CYRILLIC SMALL LETTER KOMI SJE*/
-    0x50f, /* U+00050e: CYRILLIC CAPITAL LETTER KOMI TJE*/
-    0x50f, /* U+00050f: CYRILLIC SMALL LETTER KOMI TJE*/
-    0x510, /* U+000510: */
-    0x511, /* U+000511: */
-    0x512, /* U+000512: */
-    0x513, /* U+000513: */
-    0x514, /* U+000514: */
-    0x515, /* U+000515: */
-    0x516, /* U+000516: */
-    0x517, /* U+000517: */
-    0x518, /* U+000518: */
-    0x519, /* U+000519: */
-    0x51a, /* U+00051a: */
-    0x51b, /* U+00051b: */
-    0x51c, /* U+00051c: */
-    0x51d, /* U+00051d: */
-    0x51e, /* U+00051e: */
-    0x51f, /* U+00051f: */
-    0x520, /* U+000520: */
-    0x521, /* U+000521: */
-    0x522, /* U+000522: */
-    0x523, /* U+000523: */
-    0x524, /* U+000524: */
-    0x525, /* U+000525: */
-    0x526, /* U+000526: */
-    0x527, /* U+000527: */
-    0x528, /* U+000528: */
-    0x529, /* U+000529: */
-    0x52a, /* U+00052a: */
-    0x52b, /* U+00052b: */
-    0x52c, /* U+00052c: */
-    0x52d, /* U+00052d: */
-    0x52e, /* U+00052e: */
-    0x52f, /* U+00052f: */
-    0x530, /* U+000530: */
-    0x561, /* U+000531: ARMENIAN CAPITAL LETTER AYB*/
-    0x562, /* U+000532: ARMENIAN CAPITAL LETTER BEN*/
-    0x563, /* U+000533: ARMENIAN CAPITAL LETTER GIM*/
-    0x564, /* U+000534: ARMENIAN CAPITAL LETTER DA*/
-    0x565, /* U+000535: ARMENIAN CAPITAL LETTER ECH*/
-    0x566, /* U+000536: ARMENIAN CAPITAL LETTER ZA*/
-    0x567, /* U+000537: ARMENIAN CAPITAL LETTER EH*/
-    0x568, /* U+000538: ARMENIAN CAPITAL LETTER ET*/
-    0x569, /* U+000539: ARMENIAN CAPITAL LETTER TO*/
-    0x56a, /* U+00053a: ARMENIAN CAPITAL LETTER ZHE*/
-    0x56b, /* U+00053b: ARMENIAN CAPITAL LETTER INI*/
-    0x56c, /* U+00053c: ARMENIAN CAPITAL LETTER LIWN*/
-    0x56d, /* U+00053d: ARMENIAN CAPITAL LETTER XEH*/
-    0x56e, /* U+00053e: ARMENIAN CAPITAL LETTER CA*/
-    0x56f, /* U+00053f: ARMENIAN CAPITAL LETTER KEN*/
-    0x570, /* U+000540: ARMENIAN CAPITAL LETTER HO*/
-    0x571, /* U+000541: ARMENIAN CAPITAL LETTER JA*/
-    0x572, /* U+000542: ARMENIAN CAPITAL LETTER GHAD*/
-    0x573, /* U+000543: ARMENIAN CAPITAL LETTER CHEH*/
-    0x574, /* U+000544: ARMENIAN CAPITAL LETTER MEN*/
-    0x575, /* U+000545: ARMENIAN CAPITAL LETTER YI*/
-    0x576, /* U+000546: ARMENIAN CAPITAL LETTER NOW*/
-    0x577, /* U+000547: ARMENIAN CAPITAL LETTER SHA*/
-    0x578, /* U+000548: ARMENIAN CAPITAL LETTER VO*/
-    0x579, /* U+000549: ARMENIAN CAPITAL LETTER CHA*/
-    0x57a, /* U+00054a: ARMENIAN CAPITAL LETTER PEH*/
-    0x57b, /* U+00054b: ARMENIAN CAPITAL LETTER JHEH*/
-    0x57c, /* U+00054c: ARMENIAN CAPITAL LETTER RA*/
-    0x57d, /* U+00054d: ARMENIAN CAPITAL LETTER SEH*/
-    0x57e, /* U+00054e: ARMENIAN CAPITAL LETTER VEW*/
-    0x57f, /* U+00054f: ARMENIAN CAPITAL LETTER TIWN*/
-    0x580, /* U+000550: ARMENIAN CAPITAL LETTER REH*/
-    0x581, /* U+000551: ARMENIAN CAPITAL LETTER CO*/
-    0x582, /* U+000552: ARMENIAN CAPITAL LETTER YIWN*/
-    0x583, /* U+000553: ARMENIAN CAPITAL LETTER PIWR*/
-    0x584, /* U+000554: ARMENIAN CAPITAL LETTER KEH*/
-    0x585, /* U+000555: ARMENIAN CAPITAL LETTER OH*/
-    0x586, /* U+000556: ARMENIAN CAPITAL LETTER FEH*/
-};
-
-static const RTUNICP g_afRTUniLower0x0010a0[] =
-{
-    0x2d00, /* U+0010a0: GEORGIAN CAPITAL LETTER AN*/
-    0x2d01, /* U+0010a1: GEORGIAN CAPITAL LETTER BAN*/
-    0x2d02, /* U+0010a2: GEORGIAN CAPITAL LETTER GAN*/
-    0x2d03, /* U+0010a3: GEORGIAN CAPITAL LETTER DON*/
-    0x2d04, /* U+0010a4: GEORGIAN CAPITAL LETTER EN*/
-    0x2d05, /* U+0010a5: GEORGIAN CAPITAL LETTER VIN*/
-    0x2d06, /* U+0010a6: GEORGIAN CAPITAL LETTER ZEN*/
-    0x2d07, /* U+0010a7: GEORGIAN CAPITAL LETTER TAN*/
-    0x2d08, /* U+0010a8: GEORGIAN CAPITAL LETTER IN*/
-    0x2d09, /* U+0010a9: GEORGIAN CAPITAL LETTER KAN*/
-    0x2d0a, /* U+0010aa: GEORGIAN CAPITAL LETTER LAS*/
-    0x2d0b, /* U+0010ab: GEORGIAN CAPITAL LETTER MAN*/
-    0x2d0c, /* U+0010ac: GEORGIAN CAPITAL LETTER NAR*/
-    0x2d0d, /* U+0010ad: GEORGIAN CAPITAL LETTER ON*/
-    0x2d0e, /* U+0010ae: GEORGIAN CAPITAL LETTER PAR*/
-    0x2d0f, /* U+0010af: GEORGIAN CAPITAL LETTER ZHAR*/
-    0x2d10, /* U+0010b0: GEORGIAN CAPITAL LETTER RAE*/
-    0x2d11, /* U+0010b1: GEORGIAN CAPITAL LETTER SAN*/
-    0x2d12, /* U+0010b2: GEORGIAN CAPITAL LETTER TAR*/
-    0x2d13, /* U+0010b3: GEORGIAN CAPITAL LETTER UN*/
-    0x2d14, /* U+0010b4: GEORGIAN CAPITAL LETTER PHAR*/
-    0x2d15, /* U+0010b5: GEORGIAN CAPITAL LETTER KHAR*/
-    0x2d16, /* U+0010b6: GEORGIAN CAPITAL LETTER GHAN*/
-    0x2d17, /* U+0010b7: GEORGIAN CAPITAL LETTER QAR*/
-    0x2d18, /* U+0010b8: GEORGIAN CAPITAL LETTER SHIN*/
-    0x2d19, /* U+0010b9: GEORGIAN CAPITAL LETTER CHIN*/
-    0x2d1a, /* U+0010ba: GEORGIAN CAPITAL LETTER CAN*/
-    0x2d1b, /* U+0010bb: GEORGIAN CAPITAL LETTER JIL*/
-    0x2d1c, /* U+0010bc: GEORGIAN CAPITAL LETTER CIL*/
-    0x2d1d, /* U+0010bd: GEORGIAN CAPITAL LETTER CHAR*/
-    0x2d1e, /* U+0010be: GEORGIAN CAPITAL LETTER XAN*/
-    0x2d1f, /* U+0010bf: GEORGIAN CAPITAL LETTER JHAN*/
-    0x2d20, /* U+0010c0: GEORGIAN CAPITAL LETTER HAE*/
-    0x2d21, /* U+0010c1: GEORGIAN CAPITAL LETTER HE*/
-    0x2d22, /* U+0010c2: GEORGIAN CAPITAL LETTER HIE*/
-    0x2d23, /* U+0010c3: GEORGIAN CAPITAL LETTER WE*/
-    0x2d24, /* U+0010c4: GEORGIAN CAPITAL LETTER HAR*/
-    0x2d25, /* U+0010c5: GEORGIAN CAPITAL LETTER HOE*/
-};
-
-static const RTUNICP g_afRTUniLower0x001e00[] =
-{
-    0x1e01, /* U+001e00: LATIN CAPITAL LETTER A WITH RING BELOW*/
-    0x1e01, /* U+001e01: LATIN SMALL LETTER A WITH RING BELOW*/
-    0x1e03, /* U+001e02: LATIN CAPITAL LETTER B WITH DOT ABOVE*/
-    0x1e03, /* U+001e03: LATIN SMALL LETTER B WITH DOT ABOVE*/
-    0x1e05, /* U+001e04: LATIN CAPITAL LETTER B WITH DOT BELOW*/
-    0x1e05, /* U+001e05: LATIN SMALL LETTER B WITH DOT BELOW*/
-    0x1e07, /* U+001e06: LATIN CAPITAL LETTER B WITH LINE BELOW*/
-    0x1e07, /* U+001e07: LATIN SMALL LETTER B WITH LINE BELOW*/
-    0x1e09, /* U+001e08: LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE*/
-    0x1e09, /* U+001e09: LATIN SMALL LETTER C WITH CEDILLA AND ACUTE*/
-    0x1e0b, /* U+001e0a: LATIN CAPITAL LETTER D WITH DOT ABOVE*/
-    0x1e0b, /* U+001e0b: LATIN SMALL LETTER D WITH DOT ABOVE*/
-    0x1e0d, /* U+001e0c: LATIN CAPITAL LETTER D WITH DOT BELOW*/
-    0x1e0d, /* U+001e0d: LATIN SMALL LETTER D WITH DOT BELOW*/
-    0x1e0f, /* U+001e0e: LATIN CAPITAL LETTER D WITH LINE BELOW*/
-    0x1e0f, /* U+001e0f: LATIN SMALL LETTER D WITH LINE BELOW*/
-    0x1e11, /* U+001e10: LATIN CAPITAL LETTER D WITH CEDILLA*/
-    0x1e11, /* U+001e11: LATIN SMALL LETTER D WITH CEDILLA*/
-    0x1e13, /* U+001e12: LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW*/
-    0x1e13, /* U+001e13: LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW*/
-    0x1e15, /* U+001e14: LATIN CAPITAL LETTER E WITH MACRON AND GRAVE*/
-    0x1e15, /* U+001e15: LATIN SMALL LETTER E WITH MACRON AND GRAVE*/
-    0x1e17, /* U+001e16: LATIN CAPITAL LETTER E WITH MACRON AND ACUTE*/
-    0x1e17, /* U+001e17: LATIN SMALL LETTER E WITH MACRON AND ACUTE*/
-    0x1e19, /* U+001e18: LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW*/
-    0x1e19, /* U+001e19: LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW*/
-    0x1e1b, /* U+001e1a: LATIN CAPITAL LETTER E WITH TILDE BELOW*/
-    0x1e1b, /* U+001e1b: LATIN SMALL LETTER E WITH TILDE BELOW*/
-    0x1e1d, /* U+001e1c: LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE*/
-    0x1e1d, /* U+001e1d: LATIN SMALL LETTER E WITH CEDILLA AND BREVE*/
-    0x1e1f, /* U+001e1e: LATIN CAPITAL LETTER F WITH DOT ABOVE*/
-    0x1e1f, /* U+001e1f: LATIN SMALL LETTER F WITH DOT ABOVE*/
-    0x1e21, /* U+001e20: LATIN CAPITAL LETTER G WITH MACRON*/
-    0x1e21, /* U+001e21: LATIN SMALL LETTER G WITH MACRON*/
-    0x1e23, /* U+001e22: LATIN CAPITAL LETTER H WITH DOT ABOVE*/
-    0x1e23, /* U+001e23: LATIN SMALL LETTER H WITH DOT ABOVE*/
-    0x1e25, /* U+001e24: LATIN CAPITAL LETTER H WITH DOT BELOW*/
-    0x1e25, /* U+001e25: LATIN SMALL LETTER H WITH DOT BELOW*/
-    0x1e27, /* U+001e26: LATIN CAPITAL LETTER H WITH DIAERESIS*/
-    0x1e27, /* U+001e27: LATIN SMALL LETTER H WITH DIAERESIS*/
-    0x1e29, /* U+001e28: LATIN CAPITAL LETTER H WITH CEDILLA*/
-    0x1e29, /* U+001e29: LATIN SMALL LETTER H WITH CEDILLA*/
-    0x1e2b, /* U+001e2a: LATIN CAPITAL LETTER H WITH BREVE BELOW*/
-    0x1e2b, /* U+001e2b: LATIN SMALL LETTER H WITH BREVE BELOW*/
-    0x1e2d, /* U+001e2c: LATIN CAPITAL LETTER I WITH TILDE BELOW*/
-    0x1e2d, /* U+001e2d: LATIN SMALL LETTER I WITH TILDE BELOW*/
-    0x1e2f, /* U+001e2e: LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE*/
-    0x1e2f, /* U+001e2f: LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE*/
-    0x1e31, /* U+001e30: LATIN CAPITAL LETTER K WITH ACUTE*/
-    0x1e31, /* U+001e31: LATIN SMALL LETTER K WITH ACUTE*/
-    0x1e33, /* U+001e32: LATIN CAPITAL LETTER K WITH DOT BELOW*/
-    0x1e33, /* U+001e33: LATIN SMALL LETTER K WITH DOT BELOW*/
-    0x1e35, /* U+001e34: LATIN CAPITAL LETTER K WITH LINE BELOW*/
-    0x1e35, /* U+001e35: LATIN SMALL LETTER K WITH LINE BELOW*/
-    0x1e37, /* U+001e36: LATIN CAPITAL LETTER L WITH DOT BELOW*/
-    0x1e37, /* U+001e37: LATIN SMALL LETTER L WITH DOT BELOW*/
-    0x1e39, /* U+001e38: LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON*/
-    0x1e39, /* U+001e39: LATIN SMALL LETTER L WITH DOT BELOW AND MACRON*/
-    0x1e3b, /* U+001e3a: LATIN CAPITAL LETTER L WITH LINE BELOW*/
-    0x1e3b, /* U+001e3b: LATIN SMALL LETTER L WITH LINE BELOW*/
-    0x1e3d, /* U+001e3c: LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW*/
-    0x1e3d, /* U+001e3d: LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW*/
-    0x1e3f, /* U+001e3e: LATIN CAPITAL LETTER M WITH ACUTE*/
-    0x1e3f, /* U+001e3f: LATIN SMALL LETTER M WITH ACUTE*/
-    0x1e41, /* U+001e40: LATIN CAPITAL LETTER M WITH DOT ABOVE*/
-    0x1e41, /* U+001e41: LATIN SMALL LETTER M WITH DOT ABOVE*/
-    0x1e43, /* U+001e42: LATIN CAPITAL LETTER M WITH DOT BELOW*/
-    0x1e43, /* U+001e43: LATIN SMALL LETTER M WITH DOT BELOW*/
-    0x1e45, /* U+001e44: LATIN CAPITAL LETTER N WITH DOT ABOVE*/
-    0x1e45, /* U+001e45: LATIN SMALL LETTER N WITH DOT ABOVE*/
-    0x1e47, /* U+001e46: LATIN CAPITAL LETTER N WITH DOT BELOW*/
-    0x1e47, /* U+001e47: LATIN SMALL LETTER N WITH DOT BELOW*/
-    0x1e49, /* U+001e48: LATIN CAPITAL LETTER N WITH LINE BELOW*/
-    0x1e49, /* U+001e49: LATIN SMALL LETTER N WITH LINE BELOW*/
-    0x1e4b, /* U+001e4a: LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW*/
-    0x1e4b, /* U+001e4b: LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW*/
-    0x1e4d, /* U+001e4c: LATIN CAPITAL LETTER O WITH TILDE AND ACUTE*/
-    0x1e4d, /* U+001e4d: LATIN SMALL LETTER O WITH TILDE AND ACUTE*/
-    0x1e4f, /* U+001e4e: LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS*/
-    0x1e4f, /* U+001e4f: LATIN SMALL LETTER O WITH TILDE AND DIAERESIS*/
-    0x1e51, /* U+001e50: LATIN CAPITAL LETTER O WITH MACRON AND GRAVE*/
-    0x1e51, /* U+001e51: LATIN SMALL LETTER O WITH MACRON AND GRAVE*/
-    0x1e53, /* U+001e52: LATIN CAPITAL LETTER O WITH MACRON AND ACUTE*/
-    0x1e53, /* U+001e53: LATIN SMALL LETTER O WITH MACRON AND ACUTE*/
-    0x1e55, /* U+001e54: LATIN CAPITAL LETTER P WITH ACUTE*/
-    0x1e55, /* U+001e55: LATIN SMALL LETTER P WITH ACUTE*/
-    0x1e57, /* U+001e56: LATIN CAPITAL LETTER P WITH DOT ABOVE*/
-    0x1e57, /* U+001e57: LATIN SMALL LETTER P WITH DOT ABOVE*/
-    0x1e59, /* U+001e58: LATIN CAPITAL LETTER R WITH DOT ABOVE*/
-    0x1e59, /* U+001e59: LATIN SMALL LETTER R WITH DOT ABOVE*/
-    0x1e5b, /* U+001e5a: LATIN CAPITAL LETTER R WITH DOT BELOW*/
-    0x1e5b, /* U+001e5b: LATIN SMALL LETTER R WITH DOT BELOW*/
-    0x1e5d, /* U+001e5c: LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON*/
-    0x1e5d, /* U+001e5d: LATIN SMALL LETTER R WITH DOT BELOW AND MACRON*/
-    0x1e5f, /* U+001e5e: LATIN CAPITAL LETTER R WITH LINE BELOW*/
-    0x1e5f, /* U+001e5f: LATIN SMALL LETTER R WITH LINE BELOW*/
-    0x1e61, /* U+001e60: LATIN CAPITAL LETTER S WITH DOT ABOVE*/
-    0x1e61, /* U+001e61: LATIN SMALL LETTER S WITH DOT ABOVE*/
-    0x1e63, /* U+001e62: LATIN CAPITAL LETTER S WITH DOT BELOW*/
-    0x1e63, /* U+001e63: LATIN SMALL LETTER S WITH DOT BELOW*/
-    0x1e65, /* U+001e64: LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE*/
-    0x1e65, /* U+001e65: LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE*/
-    0x1e67, /* U+001e66: LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE*/
-    0x1e67, /* U+001e67: LATIN SMALL LETTER S WITH CARON AND DOT ABOVE*/
-    0x1e69, /* U+001e68: LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-    0x1e69, /* U+001e69: LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE*/
-    0x1e6b, /* U+001e6a: LATIN CAPITAL LETTER T WITH DOT ABOVE*/
-    0x1e6b, /* U+001e6b: LATIN SMALL LETTER T WITH DOT ABOVE*/
-    0x1e6d, /* U+001e6c: LATIN CAPITAL LETTER T WITH DOT BELOW*/
-    0x1e6d, /* U+001e6d: LATIN SMALL LETTER T WITH DOT BELOW*/
-    0x1e6f, /* U+001e6e: LATIN CAPITAL LETTER T WITH LINE BELOW*/
-    0x1e6f, /* U+001e6f: LATIN SMALL LETTER T WITH LINE BELOW*/
-    0x1e71, /* U+001e70: LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW*/
-    0x1e71, /* U+001e71: LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW*/
-    0x1e73, /* U+001e72: LATIN CAPITAL LETTER U WITH DIAERESIS BELOW*/
-    0x1e73, /* U+001e73: LATIN SMALL LETTER U WITH DIAERESIS BELOW*/
-    0x1e75, /* U+001e74: LATIN CAPITAL LETTER U WITH TILDE BELOW*/
-    0x1e75, /* U+001e75: LATIN SMALL LETTER U WITH TILDE BELOW*/
-    0x1e77, /* U+001e76: LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW*/
-    0x1e77, /* U+001e77: LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW*/
-    0x1e79, /* U+001e78: LATIN CAPITAL LETTER U WITH TILDE AND ACUTE*/
-    0x1e79, /* U+001e79: LATIN SMALL LETTER U WITH TILDE AND ACUTE*/
-    0x1e7b, /* U+001e7a: LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS*/
-    0x1e7b, /* U+001e7b: LATIN SMALL LETTER U WITH MACRON AND DIAERESIS*/
-    0x1e7d, /* U+001e7c: LATIN CAPITAL LETTER V WITH TILDE*/
-    0x1e7d, /* U+001e7d: LATIN SMALL LETTER V WITH TILDE*/
-    0x1e7f, /* U+001e7e: LATIN CAPITAL LETTER V WITH DOT BELOW*/
-    0x1e7f, /* U+001e7f: LATIN SMALL LETTER V WITH DOT BELOW*/
-    0x1e81, /* U+001e80: LATIN CAPITAL LETTER W WITH GRAVE*/
-    0x1e81, /* U+001e81: LATIN SMALL LETTER W WITH GRAVE*/
-    0x1e83, /* U+001e82: LATIN CAPITAL LETTER W WITH ACUTE*/
-    0x1e83, /* U+001e83: LATIN SMALL LETTER W WITH ACUTE*/
-    0x1e85, /* U+001e84: LATIN CAPITAL LETTER W WITH DIAERESIS*/
-    0x1e85, /* U+001e85: LATIN SMALL LETTER W WITH DIAERESIS*/
-    0x1e87, /* U+001e86: LATIN CAPITAL LETTER W WITH DOT ABOVE*/
-    0x1e87, /* U+001e87: LATIN SMALL LETTER W WITH DOT ABOVE*/
-    0x1e89, /* U+001e88: LATIN CAPITAL LETTER W WITH DOT BELOW*/
-    0x1e89, /* U+001e89: LATIN SMALL LETTER W WITH DOT BELOW*/
-    0x1e8b, /* U+001e8a: LATIN CAPITAL LETTER X WITH DOT ABOVE*/
-    0x1e8b, /* U+001e8b: LATIN SMALL LETTER X WITH DOT ABOVE*/
-    0x1e8d, /* U+001e8c: LATIN CAPITAL LETTER X WITH DIAERESIS*/
-    0x1e8d, /* U+001e8d: LATIN SMALL LETTER X WITH DIAERESIS*/
-    0x1e8f, /* U+001e8e: LATIN CAPITAL LETTER Y WITH DOT ABOVE*/
-    0x1e8f, /* U+001e8f: LATIN SMALL LETTER Y WITH DOT ABOVE*/
-    0x1e91, /* U+001e90: LATIN CAPITAL LETTER Z WITH CIRCUMFLEX*/
-    0x1e91, /* U+001e91: LATIN SMALL LETTER Z WITH CIRCUMFLEX*/
-    0x1e93, /* U+001e92: LATIN CAPITAL LETTER Z WITH DOT BELOW*/
-    0x1e93, /* U+001e93: LATIN SMALL LETTER Z WITH DOT BELOW*/
-    0x1e95, /* U+001e94: LATIN CAPITAL LETTER Z WITH LINE BELOW*/
-    0x1e95, /* U+001e95: LATIN SMALL LETTER Z WITH LINE BELOW*/
-    0x1e96, /* U+001e96: LATIN SMALL LETTER H WITH LINE BELOW*/
-    0x1e97, /* U+001e97: LATIN SMALL LETTER T WITH DIAERESIS*/
-    0x1e98, /* U+001e98: LATIN SMALL LETTER W WITH RING ABOVE*/
-    0x1e99, /* U+001e99: LATIN SMALL LETTER Y WITH RING ABOVE*/
-    0x1e9a, /* U+001e9a: LATIN SMALL LETTER A WITH RIGHT HALF RING*/
-    0x1e9b, /* U+001e9b: LATIN SMALL LETTER LONG S WITH DOT ABOVE*/
-    0x1e9c, /* U+001e9c: */
-    0x1e9d, /* U+001e9d: */
-    0x1e9e, /* U+001e9e: */
-    0x1e9f, /* U+001e9f: */
-    0x1ea1, /* U+001ea0: LATIN CAPITAL LETTER A WITH DOT BELOW*/
-    0x1ea1, /* U+001ea1: LATIN SMALL LETTER A WITH DOT BELOW*/
-    0x1ea3, /* U+001ea2: LATIN CAPITAL LETTER A WITH HOOK ABOVE*/
-    0x1ea3, /* U+001ea3: LATIN SMALL LETTER A WITH HOOK ABOVE*/
-    0x1ea5, /* U+001ea4: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-    0x1ea5, /* U+001ea5: LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE*/
-    0x1ea7, /* U+001ea6: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-    0x1ea7, /* U+001ea7: LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE*/
-    0x1ea9, /* U+001ea8: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ea9, /* U+001ea9: LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1eab, /* U+001eaa: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE*/
-    0x1eab, /* U+001eab: LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE*/
-    0x1ead, /* U+001eac: LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ead, /* U+001ead: LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1eaf, /* U+001eae: LATIN CAPITAL LETTER A WITH BREVE AND ACUTE*/
-    0x1eaf, /* U+001eaf: LATIN SMALL LETTER A WITH BREVE AND ACUTE*/
-    0x1eb1, /* U+001eb0: LATIN CAPITAL LETTER A WITH BREVE AND GRAVE*/
-    0x1eb1, /* U+001eb1: LATIN SMALL LETTER A WITH BREVE AND GRAVE*/
-    0x1eb3, /* U+001eb2: LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE*/
-    0x1eb3, /* U+001eb3: LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE*/
-    0x1eb5, /* U+001eb4: LATIN CAPITAL LETTER A WITH BREVE AND TILDE*/
-    0x1eb5, /* U+001eb5: LATIN SMALL LETTER A WITH BREVE AND TILDE*/
-    0x1eb7, /* U+001eb6: LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW*/
-    0x1eb7, /* U+001eb7: LATIN SMALL LETTER A WITH BREVE AND DOT BELOW*/
-    0x1eb9, /* U+001eb8: LATIN CAPITAL LETTER E WITH DOT BELOW*/
-    0x1eb9, /* U+001eb9: LATIN SMALL LETTER E WITH DOT BELOW*/
-    0x1ebb, /* U+001eba: LATIN CAPITAL LETTER E WITH HOOK ABOVE*/
-    0x1ebb, /* U+001ebb: LATIN SMALL LETTER E WITH HOOK ABOVE*/
-    0x1ebd, /* U+001ebc: LATIN CAPITAL LETTER E WITH TILDE*/
-    0x1ebd, /* U+001ebd: LATIN SMALL LETTER E WITH TILDE*/
-    0x1ebf, /* U+001ebe: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-    0x1ebf, /* U+001ebf: LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE*/
-    0x1ec1, /* U+001ec0: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-    0x1ec1, /* U+001ec1: LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE*/
-    0x1ec3, /* U+001ec2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ec3, /* U+001ec3: LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ec5, /* U+001ec4: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE*/
-    0x1ec5, /* U+001ec5: LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE*/
-    0x1ec7, /* U+001ec6: LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ec7, /* U+001ec7: LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ec9, /* U+001ec8: LATIN CAPITAL LETTER I WITH HOOK ABOVE*/
-    0x1ec9, /* U+001ec9: LATIN SMALL LETTER I WITH HOOK ABOVE*/
-    0x1ecb, /* U+001eca: LATIN CAPITAL LETTER I WITH DOT BELOW*/
-    0x1ecb, /* U+001ecb: LATIN SMALL LETTER I WITH DOT BELOW*/
-    0x1ecd, /* U+001ecc: LATIN CAPITAL LETTER O WITH DOT BELOW*/
-    0x1ecd, /* U+001ecd: LATIN SMALL LETTER O WITH DOT BELOW*/
-    0x1ecf, /* U+001ece: LATIN CAPITAL LETTER O WITH HOOK ABOVE*/
-    0x1ecf, /* U+001ecf: LATIN SMALL LETTER O WITH HOOK ABOVE*/
-    0x1ed1, /* U+001ed0: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-    0x1ed1, /* U+001ed1: LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE*/
-    0x1ed3, /* U+001ed2: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-    0x1ed3, /* U+001ed3: LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE*/
-    0x1ed5, /* U+001ed4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ed5, /* U+001ed5: LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE*/
-    0x1ed7, /* U+001ed6: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE*/
-    0x1ed7, /* U+001ed7: LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE*/
-    0x1ed9, /* U+001ed8: LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1ed9, /* U+001ed9: LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW*/
-    0x1edb, /* U+001eda: LATIN CAPITAL LETTER O WITH HORN AND ACUTE*/
-    0x1edb, /* U+001edb: LATIN SMALL LETTER O WITH HORN AND ACUTE*/
-    0x1edd, /* U+001edc: LATIN CAPITAL LETTER O WITH HORN AND GRAVE*/
-    0x1edd, /* U+001edd: LATIN SMALL LETTER O WITH HORN AND GRAVE*/
-    0x1edf, /* U+001ede: LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE*/
-    0x1edf, /* U+001edf: LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE*/
-    0x1ee1, /* U+001ee0: LATIN CAPITAL LETTER O WITH HORN AND TILDE*/
-    0x1ee1, /* U+001ee1: LATIN SMALL LETTER O WITH HORN AND TILDE*/
-    0x1ee3, /* U+001ee2: LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW*/
-    0x1ee3, /* U+001ee3: LATIN SMALL LETTER O WITH HORN AND DOT BELOW*/
-    0x1ee5, /* U+001ee4: LATIN CAPITAL LETTER U WITH DOT BELOW*/
-    0x1ee5, /* U+001ee5: LATIN SMALL LETTER U WITH DOT BELOW*/
-    0x1ee7, /* U+001ee6: LATIN CAPITAL LETTER U WITH HOOK ABOVE*/
-    0x1ee7, /* U+001ee7: LATIN SMALL LETTER U WITH HOOK ABOVE*/
-    0x1ee9, /* U+001ee8: LATIN CAPITAL LETTER U WITH HORN AND ACUTE*/
-    0x1ee9, /* U+001ee9: LATIN SMALL LETTER U WITH HORN AND ACUTE*/
-    0x1eeb, /* U+001eea: LATIN CAPITAL LETTER U WITH HORN AND GRAVE*/
-    0x1eeb, /* U+001eeb: LATIN SMALL LETTER U WITH HORN AND GRAVE*/
-    0x1eed, /* U+001eec: LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE*/
-    0x1eed, /* U+001eed: LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE*/
-    0x1eef, /* U+001eee: LATIN CAPITAL LETTER U WITH HORN AND TILDE*/
-    0x1eef, /* U+001eef: LATIN SMALL LETTER U WITH HORN AND TILDE*/
-    0x1ef1, /* U+001ef0: LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW*/
-    0x1ef1, /* U+001ef1: LATIN SMALL LETTER U WITH HORN AND DOT BELOW*/
-    0x1ef3, /* U+001ef2: LATIN CAPITAL LETTER Y WITH GRAVE*/
-    0x1ef3, /* U+001ef3: LATIN SMALL LETTER Y WITH GRAVE*/
-    0x1ef5, /* U+001ef4: LATIN CAPITAL LETTER Y WITH DOT BELOW*/
-    0x1ef5, /* U+001ef5: LATIN SMALL LETTER Y WITH DOT BELOW*/
-    0x1ef7, /* U+001ef6: LATIN CAPITAL LETTER Y WITH HOOK ABOVE*/
-    0x1ef7, /* U+001ef7: LATIN SMALL LETTER Y WITH HOOK ABOVE*/
-    0x1ef9, /* U+001ef8: LATIN CAPITAL LETTER Y WITH TILDE*/
-    0x1ef9, /* U+001ef9: LATIN SMALL LETTER Y WITH TILDE*/
-    0x1efa, /* U+001efa: */
-    0x1efb, /* U+001efb: */
-    0x1efc, /* U+001efc: */
-    0x1efd, /* U+001efd: */
-    0x1efe, /* U+001efe: */
-    0x1eff, /* U+001eff: */
-    0x1f00, /* U+001f00: GREEK SMALL LETTER ALPHA WITH PSILI*/
-    0x1f01, /* U+001f01: GREEK SMALL LETTER ALPHA WITH DASIA*/
-    0x1f02, /* U+001f02: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA*/
-    0x1f03, /* U+001f03: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA*/
-    0x1f04, /* U+001f04: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA*/
-    0x1f05, /* U+001f05: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA*/
-    0x1f06, /* U+001f06: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-    0x1f07, /* U+001f07: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-    0x1f00, /* U+001f08: GREEK CAPITAL LETTER ALPHA WITH PSILI*/
-    0x1f01, /* U+001f09: GREEK CAPITAL LETTER ALPHA WITH DASIA*/
-    0x1f02, /* U+001f0a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA*/
-    0x1f03, /* U+001f0b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA*/
-    0x1f04, /* U+001f0c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA*/
-    0x1f05, /* U+001f0d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA*/
-    0x1f06, /* U+001f0e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI*/
-    0x1f07, /* U+001f0f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI*/
-    0x1f10, /* U+001f10: GREEK SMALL LETTER EPSILON WITH PSILI*/
-    0x1f11, /* U+001f11: GREEK SMALL LETTER EPSILON WITH DASIA*/
-    0x1f12, /* U+001f12: GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA*/
-    0x1f13, /* U+001f13: GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA*/
-    0x1f14, /* U+001f14: GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA*/
-    0x1f15, /* U+001f15: GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA*/
-    0x1f16, /* U+001f16: */
-    0x1f17, /* U+001f17: */
-    0x1f10, /* U+001f18: GREEK CAPITAL LETTER EPSILON WITH PSILI*/
-    0x1f11, /* U+001f19: GREEK CAPITAL LETTER EPSILON WITH DASIA*/
-    0x1f12, /* U+001f1a: GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA*/
-    0x1f13, /* U+001f1b: GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA*/
-    0x1f14, /* U+001f1c: GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA*/
-    0x1f15, /* U+001f1d: GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA*/
-    0x1f1e, /* U+001f1e: */
-    0x1f1f, /* U+001f1f: */
-    0x1f20, /* U+001f20: GREEK SMALL LETTER ETA WITH PSILI*/
-    0x1f21, /* U+001f21: GREEK SMALL LETTER ETA WITH DASIA*/
-    0x1f22, /* U+001f22: GREEK SMALL LETTER ETA WITH PSILI AND VARIA*/
-    0x1f23, /* U+001f23: GREEK SMALL LETTER ETA WITH DASIA AND VARIA*/
-    0x1f24, /* U+001f24: GREEK SMALL LETTER ETA WITH PSILI AND OXIA*/
-    0x1f25, /* U+001f25: GREEK SMALL LETTER ETA WITH DASIA AND OXIA*/
-    0x1f26, /* U+001f26: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI*/
-    0x1f27, /* U+001f27: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI*/
-    0x1f20, /* U+001f28: GREEK CAPITAL LETTER ETA WITH PSILI*/
-    0x1f21, /* U+001f29: GREEK CAPITAL LETTER ETA WITH DASIA*/
-    0x1f22, /* U+001f2a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA*/
-    0x1f23, /* U+001f2b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA*/
-    0x1f24, /* U+001f2c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA*/
-    0x1f25, /* U+001f2d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA*/
-    0x1f26, /* U+001f2e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI*/
-    0x1f27, /* U+001f2f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI*/
-    0x1f30, /* U+001f30: GREEK SMALL LETTER IOTA WITH PSILI*/
-    0x1f31, /* U+001f31: GREEK SMALL LETTER IOTA WITH DASIA*/
-    0x1f32, /* U+001f32: GREEK SMALL LETTER IOTA WITH PSILI AND VARIA*/
-    0x1f33, /* U+001f33: GREEK SMALL LETTER IOTA WITH DASIA AND VARIA*/
-    0x1f34, /* U+001f34: GREEK SMALL LETTER IOTA WITH PSILI AND OXIA*/
-    0x1f35, /* U+001f35: GREEK SMALL LETTER IOTA WITH DASIA AND OXIA*/
-    0x1f36, /* U+001f36: GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-    0x1f37, /* U+001f37: GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-    0x1f30, /* U+001f38: GREEK CAPITAL LETTER IOTA WITH PSILI*/
-    0x1f31, /* U+001f39: GREEK CAPITAL LETTER IOTA WITH DASIA*/
-    0x1f32, /* U+001f3a: GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA*/
-    0x1f33, /* U+001f3b: GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA*/
-    0x1f34, /* U+001f3c: GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA*/
-    0x1f35, /* U+001f3d: GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA*/
-    0x1f36, /* U+001f3e: GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI*/
-    0x1f37, /* U+001f3f: GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI*/
-    0x1f40, /* U+001f40: GREEK SMALL LETTER OMICRON WITH PSILI*/
-    0x1f41, /* U+001f41: GREEK SMALL LETTER OMICRON WITH DASIA*/
-    0x1f42, /* U+001f42: GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA*/
-    0x1f43, /* U+001f43: GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA*/
-    0x1f44, /* U+001f44: GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA*/
-    0x1f45, /* U+001f45: GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA*/
-    0x1f46, /* U+001f46: */
-    0x1f47, /* U+001f47: */
-    0x1f40, /* U+001f48: GREEK CAPITAL LETTER OMICRON WITH PSILI*/
-    0x1f41, /* U+001f49: GREEK CAPITAL LETTER OMICRON WITH DASIA*/
-    0x1f42, /* U+001f4a: GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA*/
-    0x1f43, /* U+001f4b: GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA*/
-    0x1f44, /* U+001f4c: GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA*/
-    0x1f45, /* U+001f4d: GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA*/
-    0x1f4e, /* U+001f4e: */
-    0x1f4f, /* U+001f4f: */
-    0x1f50, /* U+001f50: GREEK SMALL LETTER UPSILON WITH PSILI*/
-    0x1f51, /* U+001f51: GREEK SMALL LETTER UPSILON WITH DASIA*/
-    0x1f52, /* U+001f52: GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA*/
-    0x1f53, /* U+001f53: GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA*/
-    0x1f54, /* U+001f54: GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA*/
-    0x1f55, /* U+001f55: GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA*/
-    0x1f56, /* U+001f56: GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI*/
-    0x1f57, /* U+001f57: GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-    0x1f58, /* U+001f58: */
-    0x1f51, /* U+001f59: GREEK CAPITAL LETTER UPSILON WITH DASIA*/
-    0x1f5a, /* U+001f5a: */
-    0x1f53, /* U+001f5b: GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA*/
-    0x1f5c, /* U+001f5c: */
-    0x1f55, /* U+001f5d: GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA*/
-    0x1f5e, /* U+001f5e: */
-    0x1f57, /* U+001f5f: GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI*/
-    0x1f60, /* U+001f60: GREEK SMALL LETTER OMEGA WITH PSILI*/
-    0x1f61, /* U+001f61: GREEK SMALL LETTER OMEGA WITH DASIA*/
-    0x1f62, /* U+001f62: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA*/
-    0x1f63, /* U+001f63: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA*/
-    0x1f64, /* U+001f64: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA*/
-    0x1f65, /* U+001f65: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA*/
-    0x1f66, /* U+001f66: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-    0x1f67, /* U+001f67: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-    0x1f60, /* U+001f68: GREEK CAPITAL LETTER OMEGA WITH PSILI*/
-    0x1f61, /* U+001f69: GREEK CAPITAL LETTER OMEGA WITH DASIA*/
-    0x1f62, /* U+001f6a: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA*/
-    0x1f63, /* U+001f6b: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA*/
-    0x1f64, /* U+001f6c: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA*/
-    0x1f65, /* U+001f6d: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA*/
-    0x1f66, /* U+001f6e: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI*/
-    0x1f67, /* U+001f6f: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI*/
-    0x1f70, /* U+001f70: GREEK SMALL LETTER ALPHA WITH VARIA*/
-    0x1f71, /* U+001f71: GREEK SMALL LETTER ALPHA WITH OXIA*/
-    0x1f72, /* U+001f72: GREEK SMALL LETTER EPSILON WITH VARIA*/
-    0x1f73, /* U+001f73: GREEK SMALL LETTER EPSILON WITH OXIA*/
-    0x1f74, /* U+001f74: GREEK SMALL LETTER ETA WITH VARIA*/
-    0x1f75, /* U+001f75: GREEK SMALL LETTER ETA WITH OXIA*/
-    0x1f76, /* U+001f76: GREEK SMALL LETTER IOTA WITH VARIA*/
-    0x1f77, /* U+001f77: GREEK SMALL LETTER IOTA WITH OXIA*/
-    0x1f78, /* U+001f78: GREEK SMALL LETTER OMICRON WITH VARIA*/
-    0x1f79, /* U+001f79: GREEK SMALL LETTER OMICRON WITH OXIA*/
-    0x1f7a, /* U+001f7a: GREEK SMALL LETTER UPSILON WITH VARIA*/
-    0x1f7b, /* U+001f7b: GREEK SMALL LETTER UPSILON WITH OXIA*/
-    0x1f7c, /* U+001f7c: GREEK SMALL LETTER OMEGA WITH VARIA*/
-    0x1f7d, /* U+001f7d: GREEK SMALL LETTER OMEGA WITH OXIA*/
-    0x1f7e, /* U+001f7e: */
-    0x1f7f, /* U+001f7f: */
-    0x1f80, /* U+001f80: GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1f81, /* U+001f81: GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1f82, /* U+001f82: GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1f83, /* U+001f83: GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1f84, /* U+001f84: GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1f85, /* U+001f85: GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1f86, /* U+001f86: GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f87, /* U+001f87: GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f80, /* U+001f88: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1f81, /* U+001f89: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1f82, /* U+001f8a: GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1f83, /* U+001f8b: GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1f84, /* U+001f8c: GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1f85, /* U+001f8d: GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1f86, /* U+001f8e: GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f87, /* U+001f8f: GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f90, /* U+001f90: GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1f91, /* U+001f91: GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1f92, /* U+001f92: GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1f93, /* U+001f93: GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1f94, /* U+001f94: GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1f95, /* U+001f95: GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1f96, /* U+001f96: GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f97, /* U+001f97: GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f90, /* U+001f98: GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1f91, /* U+001f99: GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1f92, /* U+001f9a: GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1f93, /* U+001f9b: GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1f94, /* U+001f9c: GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1f95, /* U+001f9d: GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1f96, /* U+001f9e: GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1f97, /* U+001f9f: GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1fa0, /* U+001fa0: GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI*/
-    0x1fa1, /* U+001fa1: GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI*/
-    0x1fa2, /* U+001fa2: GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI*/
-    0x1fa3, /* U+001fa3: GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI*/
-    0x1fa4, /* U+001fa4: GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI*/
-    0x1fa5, /* U+001fa5: GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI*/
-    0x1fa6, /* U+001fa6: GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fa7, /* U+001fa7: GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fa0, /* U+001fa8: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI*/
-    0x1fa1, /* U+001fa9: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI*/
-    0x1fa2, /* U+001faa: GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI*/
-    0x1fa3, /* U+001fab: GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI*/
-    0x1fa4, /* U+001fac: GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI*/
-    0x1fa5, /* U+001fad: GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI*/
-    0x1fa6, /* U+001fae: GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1fa7, /* U+001faf: GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI*/
-    0x1fb0, /* U+001fb0: GREEK SMALL LETTER ALPHA WITH VRACHY*/
-    0x1fb1, /* U+001fb1: GREEK SMALL LETTER ALPHA WITH MACRON*/
-    0x1fb2, /* U+001fb2: GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1fb3, /* U+001fb3: GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI*/
-    0x1fb4, /* U+001fb4: GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1fb5, /* U+001fb5: */
-    0x1fb6, /* U+001fb6: GREEK SMALL LETTER ALPHA WITH PERISPOMENI*/
-    0x1fb7, /* U+001fb7: GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1fb0, /* U+001fb8: GREEK CAPITAL LETTER ALPHA WITH VRACHY*/
-    0x1fb1, /* U+001fb9: GREEK CAPITAL LETTER ALPHA WITH MACRON*/
-    0x1f70, /* U+001fba: GREEK CAPITAL LETTER ALPHA WITH VARIA*/
-    0x1f71, /* U+001fbb: GREEK CAPITAL LETTER ALPHA WITH OXIA*/
-    0x1fb3, /* U+001fbc: GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI*/
-    0x1fbd, /* U+001fbd: GREEK KORONIS*/
-    0x1fbe, /* U+001fbe: GREEK PROSGEGRAMMENI*/
-    0x1fbf, /* U+001fbf: GREEK PSILI*/
-    0x1fc0, /* U+001fc0: GREEK PERISPOMENI*/
-    0x1fc1, /* U+001fc1: GREEK DIALYTIKA AND PERISPOMENI*/
-    0x1fc2, /* U+001fc2: GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1fc3, /* U+001fc3: GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI*/
-    0x1fc4, /* U+001fc4: GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1fc5, /* U+001fc5: */
-    0x1fc6, /* U+001fc6: GREEK SMALL LETTER ETA WITH PERISPOMENI*/
-    0x1fc7, /* U+001fc7: GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f72, /* U+001fc8: GREEK CAPITAL LETTER EPSILON WITH VARIA*/
-    0x1f73, /* U+001fc9: GREEK CAPITAL LETTER EPSILON WITH OXIA*/
-    0x1f74, /* U+001fca: GREEK CAPITAL LETTER ETA WITH VARIA*/
-    0x1f75, /* U+001fcb: GREEK CAPITAL LETTER ETA WITH OXIA*/
-    0x1fc3, /* U+001fcc: GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI*/
-    0x1fcd, /* U+001fcd: GREEK PSILI AND VARIA*/
-    0x1fce, /* U+001fce: GREEK PSILI AND OXIA*/
-    0x1fcf, /* U+001fcf: GREEK PSILI AND PERISPOMENI*/
-    0x1fd0, /* U+001fd0: GREEK SMALL LETTER IOTA WITH VRACHY*/
-    0x1fd1, /* U+001fd1: GREEK SMALL LETTER IOTA WITH MACRON*/
-    0x1fd2, /* U+001fd2: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA*/
-    0x1fd3, /* U+001fd3: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA*/
-    0x1fd4, /* U+001fd4: */
-    0x1fd5, /* U+001fd5: */
-    0x1fd6, /* U+001fd6: GREEK SMALL LETTER IOTA WITH PERISPOMENI*/
-    0x1fd7, /* U+001fd7: GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI*/
-    0x1fd0, /* U+001fd8: GREEK CAPITAL LETTER IOTA WITH VRACHY*/
-    0x1fd1, /* U+001fd9: GREEK CAPITAL LETTER IOTA WITH MACRON*/
-    0x1f76, /* U+001fda: GREEK CAPITAL LETTER IOTA WITH VARIA*/
-    0x1f77, /* U+001fdb: GREEK CAPITAL LETTER IOTA WITH OXIA*/
-    0x1fdc, /* U+001fdc: */
-    0x1fdd, /* U+001fdd: GREEK DASIA AND VARIA*/
-    0x1fde, /* U+001fde: GREEK DASIA AND OXIA*/
-    0x1fdf, /* U+001fdf: GREEK DASIA AND PERISPOMENI*/
-    0x1fe0, /* U+001fe0: GREEK SMALL LETTER UPSILON WITH VRACHY*/
-    0x1fe1, /* U+001fe1: GREEK SMALL LETTER UPSILON WITH MACRON*/
-    0x1fe2, /* U+001fe2: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA*/
-    0x1fe3, /* U+001fe3: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA*/
-    0x1fe4, /* U+001fe4: GREEK SMALL LETTER RHO WITH PSILI*/
-    0x1fe5, /* U+001fe5: GREEK SMALL LETTER RHO WITH DASIA*/
-    0x1fe6, /* U+001fe6: GREEK SMALL LETTER UPSILON WITH PERISPOMENI*/
-    0x1fe7, /* U+001fe7: GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI*/
-    0x1fe0, /* U+001fe8: GREEK CAPITAL LETTER UPSILON WITH VRACHY*/
-    0x1fe1, /* U+001fe9: GREEK CAPITAL LETTER UPSILON WITH MACRON*/
-    0x1f7a, /* U+001fea: GREEK CAPITAL LETTER UPSILON WITH VARIA*/
-    0x1f7b, /* U+001feb: GREEK CAPITAL LETTER UPSILON WITH OXIA*/
-    0x1fe5, /* U+001fec: GREEK CAPITAL LETTER RHO WITH DASIA*/
-    0x1fed, /* U+001fed: GREEK DIALYTIKA AND VARIA*/
-    0x1fee, /* U+001fee: GREEK DIALYTIKA AND OXIA*/
-    0x1fef, /* U+001fef: GREEK VARIA*/
-    0x1ff0, /* U+001ff0: */
-    0x1ff1, /* U+001ff1: */
-    0x1ff2, /* U+001ff2: GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI*/
-    0x1ff3, /* U+001ff3: GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI*/
-    0x1ff4, /* U+001ff4: GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI*/
-    0x1ff5, /* U+001ff5: */
-    0x1ff6, /* U+001ff6: GREEK SMALL LETTER OMEGA WITH PERISPOMENI*/
-    0x1ff7, /* U+001ff7: GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI*/
-    0x1f78, /* U+001ff8: GREEK CAPITAL LETTER OMICRON WITH VARIA*/
-    0x1f79, /* U+001ff9: GREEK CAPITAL LETTER OMICRON WITH OXIA*/
-    0x1f7c, /* U+001ffa: GREEK CAPITAL LETTER OMEGA WITH VARIA*/
-    0x1f7d, /* U+001ffb: GREEK CAPITAL LETTER OMEGA WITH OXIA*/
-    0x1ff3, /* U+001ffc: GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI*/
-    0x1ffd, /* U+001ffd: GREEK OXIA*/
-    0x1ffe, /* U+001ffe: GREEK DASIA*/
-    0x1fff, /* U+001fff: */
-    0x2000, /* U+002000: EN QUAD*/
-    0x2001, /* U+002001: EM QUAD*/
-    0x2002, /* U+002002: EN SPACE*/
-    0x2003, /* U+002003: EM SPACE*/
-    0x2004, /* U+002004: THREE-PER-EM SPACE*/
-    0x2005, /* U+002005: FOUR-PER-EM SPACE*/
-    0x2006, /* U+002006: SIX-PER-EM SPACE*/
-    0x2007, /* U+002007: FIGURE SPACE*/
-    0x2008, /* U+002008: PUNCTUATION SPACE*/
-    0x2009, /* U+002009: THIN SPACE*/
-    0x200a, /* U+00200a: HAIR SPACE*/
-    0x200b, /* U+00200b: ZERO WIDTH SPACE*/
-    0x200c, /* U+00200c: ZERO WIDTH NON-JOINER*/
-    0x200d, /* U+00200d: ZERO WIDTH JOINER*/
-    0x200e, /* U+00200e: LEFT-TO-RIGHT MARK*/
-    0x200f, /* U+00200f: RIGHT-TO-LEFT MARK*/
-    0x2010, /* U+002010: HYPHEN*/
-    0x2011, /* U+002011: NON-BREAKING HYPHEN*/
-    0x2012, /* U+002012: FIGURE DASH*/
-    0x2013, /* U+002013: EN DASH*/
-    0x2014, /* U+002014: EM DASH*/
-    0x2015, /* U+002015: HORIZONTAL BAR*/
-    0x2016, /* U+002016: DOUBLE VERTICAL LINE*/
-    0x2017, /* U+002017: DOUBLE LOW LINE*/
-    0x2018, /* U+002018: LEFT SINGLE QUOTATION MARK*/
-    0x2019, /* U+002019: RIGHT SINGLE QUOTATION MARK*/
-    0x201a, /* U+00201a: SINGLE LOW-9 QUOTATION MARK*/
-    0x201b, /* U+00201b: SINGLE HIGH-REVERSED-9 QUOTATION MARK*/
-    0x201c, /* U+00201c: LEFT DOUBLE QUOTATION MARK*/
-    0x201d, /* U+00201d: RIGHT DOUBLE QUOTATION MARK*/
-    0x201e, /* U+00201e: DOUBLE LOW-9 QUOTATION MARK*/
-    0x201f, /* U+00201f: DOUBLE HIGH-REVERSED-9 QUOTATION MARK*/
-    0x2020, /* U+002020: DAGGER*/
-    0x2021, /* U+002021: DOUBLE DAGGER*/
-    0x2022, /* U+002022: BULLET*/
-    0x2023, /* U+002023: TRIANGULAR BULLET*/
-    0x2024, /* U+002024: ONE DOT LEADER*/
-    0x2025, /* U+002025: TWO DOT LEADER*/
-    0x2026, /* U+002026: HORIZONTAL ELLIPSIS*/
-    0x2027, /* U+002027: HYPHENATION POINT*/
-    0x2028, /* U+002028: LINE SEPARATOR*/
-    0x2029, /* U+002029: PARAGRAPH SEPARATOR*/
-    0x202a, /* U+00202a: LEFT-TO-RIGHT EMBEDDING*/
-    0x202b, /* U+00202b: RIGHT-TO-LEFT EMBEDDING*/
-    0x202c, /* U+00202c: POP DIRECTIONAL FORMATTING*/
-    0x202d, /* U+00202d: LEFT-TO-RIGHT OVERRIDE*/
-    0x202e, /* U+00202e: RIGHT-TO-LEFT OVERRIDE*/
-    0x202f, /* U+00202f: NARROW NO-BREAK SPACE*/
-    0x2030, /* U+002030: PER MILLE SIGN*/
-    0x2031, /* U+002031: PER TEN THOUSAND SIGN*/
-    0x2032, /* U+002032: PRIME*/
-    0x2033, /* U+002033: DOUBLE PRIME*/
-    0x2034, /* U+002034: TRIPLE PRIME*/
-    0x2035, /* U+002035: REVERSED PRIME*/
-    0x2036, /* U+002036: REVERSED DOUBLE PRIME*/
-    0x2037, /* U+002037: REVERSED TRIPLE PRIME*/
-    0x2038, /* U+002038: CARET*/
-    0x2039, /* U+002039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK*/
-    0x203a, /* U+00203a: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK*/
-    0x203b, /* U+00203b: REFERENCE MARK*/
-    0x203c, /* U+00203c: DOUBLE EXCLAMATION MARK*/
-    0x203d, /* U+00203d: INTERROBANG*/
-    0x203e, /* U+00203e: OVERLINE*/
-    0x203f, /* U+00203f: UNDERTIE*/
-    0x2040, /* U+002040: CHARACTER TIE*/
-    0x2041, /* U+002041: CARET INSERTION POINT*/
-    0x2042, /* U+002042: ASTERISM*/
-    0x2043, /* U+002043: HYPHEN BULLET*/
-    0x2044, /* U+002044: FRACTION SLASH*/
-    0x2045, /* U+002045: LEFT SQUARE BRACKET WITH QUILL*/
-    0x2046, /* U+002046: RIGHT SQUARE BRACKET WITH QUILL*/
-    0x2047, /* U+002047: DOUBLE QUESTION MARK*/
-    0x2048, /* U+002048: QUESTION EXCLAMATION MARK*/
-    0x2049, /* U+002049: EXCLAMATION QUESTION MARK*/
-    0x204a, /* U+00204a: TIRONIAN SIGN ET*/
-    0x204b, /* U+00204b: REVERSED PILCROW SIGN*/
-    0x204c, /* U+00204c: BLACK LEFTWARDS BULLET*/
-    0x204d, /* U+00204d: BLACK RIGHTWARDS BULLET*/
-    0x204e, /* U+00204e: LOW ASTERISK*/
-    0x204f, /* U+00204f: REVERSED SEMICOLON*/
-    0x2050, /* U+002050: CLOSE UP*/
-    0x2051, /* U+002051: TWO ASTERISKS ALIGNED VERTICALLY*/
-    0x2052, /* U+002052: COMMERCIAL MINUS SIGN*/
-    0x2053, /* U+002053: SWUNG DASH*/
-    0x2054, /* U+002054: INVERTED UNDERTIE*/
-    0x2055, /* U+002055: FLOWER PUNCTUATION MARK*/
-    0x2056, /* U+002056: THREE DOT PUNCTUATION*/
-    0x2057, /* U+002057: QUADRUPLE PRIME*/
-    0x2058, /* U+002058: FOUR DOT PUNCTUATION*/
-    0x2059, /* U+002059: FIVE DOT PUNCTUATION*/
-    0x205a, /* U+00205a: TWO DOT PUNCTUATION*/
-    0x205b, /* U+00205b: FOUR DOT MARK*/
-    0x205c, /* U+00205c: DOTTED CROSS*/
-    0x205d, /* U+00205d: TRICOLON*/
-    0x205e, /* U+00205e: VERTICAL FOUR DOTS*/
-    0x205f, /* U+00205f: MEDIUM MATHEMATICAL SPACE*/
-    0x2060, /* U+002060: WORD JOINER*/
-    0x2061, /* U+002061: FUNCTION APPLICATION*/
-    0x2062, /* U+002062: INVISIBLE TIMES*/
-    0x2063, /* U+002063: INVISIBLE SEPARATOR*/
-    0x2064, /* U+002064: */
-    0x2065, /* U+002065: */
-    0x2066, /* U+002066: */
-    0x2067, /* U+002067: */
-    0x2068, /* U+002068: */
-    0x2069, /* U+002069: */
-    0x206a, /* U+00206a: INHIBIT SYMMETRIC SWAPPING*/
-    0x206b, /* U+00206b: ACTIVATE SYMMETRIC SWAPPING*/
-    0x206c, /* U+00206c: INHIBIT ARABIC FORM SHAPING*/
-    0x206d, /* U+00206d: ACTIVATE ARABIC FORM SHAPING*/
-    0x206e, /* U+00206e: NATIONAL DIGIT SHAPES*/
-    0x206f, /* U+00206f: NOMINAL DIGIT SHAPES*/
-    0x2070, /* U+002070: SUPERSCRIPT ZERO*/
-    0x2071, /* U+002071: SUPERSCRIPT LATIN SMALL LETTER I*/
-    0x2072, /* U+002072: */
-    0x2073, /* U+002073: */
-    0x2074, /* U+002074: SUPERSCRIPT FOUR*/
-    0x2075, /* U+002075: SUPERSCRIPT FIVE*/
-    0x2076, /* U+002076: SUPERSCRIPT SIX*/
-    0x2077, /* U+002077: SUPERSCRIPT SEVEN*/
-    0x2078, /* U+002078: SUPERSCRIPT EIGHT*/
-    0x2079, /* U+002079: SUPERSCRIPT NINE*/
-    0x207a, /* U+00207a: SUPERSCRIPT PLUS SIGN*/
-    0x207b, /* U+00207b: SUPERSCRIPT MINUS*/
-    0x207c, /* U+00207c: SUPERSCRIPT EQUALS SIGN*/
-    0x207d, /* U+00207d: SUPERSCRIPT LEFT PARENTHESIS*/
-    0x207e, /* U+00207e: SUPERSCRIPT RIGHT PARENTHESIS*/
-    0x207f, /* U+00207f: SUPERSCRIPT LATIN SMALL LETTER N*/
-    0x2080, /* U+002080: SUBSCRIPT ZERO*/
-    0x2081, /* U+002081: SUBSCRIPT ONE*/
-    0x2082, /* U+002082: SUBSCRIPT TWO*/
-    0x2083, /* U+002083: SUBSCRIPT THREE*/
-    0x2084, /* U+002084: SUBSCRIPT FOUR*/
-    0x2085, /* U+002085: SUBSCRIPT FIVE*/
-    0x2086, /* U+002086: SUBSCRIPT SIX*/
-    0x2087, /* U+002087: SUBSCRIPT SEVEN*/
-    0x2088, /* U+002088: SUBSCRIPT EIGHT*/
-    0x2089, /* U+002089: SUBSCRIPT NINE*/
-    0x208a, /* U+00208a: SUBSCRIPT PLUS SIGN*/
-    0x208b, /* U+00208b: SUBSCRIPT MINUS*/
-    0x208c, /* U+00208c: SUBSCRIPT EQUALS SIGN*/
-    0x208d, /* U+00208d: SUBSCRIPT LEFT PARENTHESIS*/
-    0x208e, /* U+00208e: SUBSCRIPT RIGHT PARENTHESIS*/
-    0x208f, /* U+00208f: */
-    0x2090, /* U+002090: LATIN SUBSCRIPT SMALL LETTER A*/
-    0x2091, /* U+002091: LATIN SUBSCRIPT SMALL LETTER E*/
-    0x2092, /* U+002092: LATIN SUBSCRIPT SMALL LETTER O*/
-    0x2093, /* U+002093: LATIN SUBSCRIPT SMALL LETTER X*/
-    0x2094, /* U+002094: LATIN SUBSCRIPT SMALL LETTER SCHWA*/
-    0x2095, /* U+002095: */
-    0x2096, /* U+002096: */
-    0x2097, /* U+002097: */
-    0x2098, /* U+002098: */
-    0x2099, /* U+002099: */
-    0x209a, /* U+00209a: */
-    0x209b, /* U+00209b: */
-    0x209c, /* U+00209c: */
-    0x209d, /* U+00209d: */
-    0x209e, /* U+00209e: */
-    0x209f, /* U+00209f: */
-    0x20a0, /* U+0020a0: EURO-CURRENCY SIGN*/
-    0x20a1, /* U+0020a1: COLON SIGN*/
-    0x20a2, /* U+0020a2: CRUZEIRO SIGN*/
-    0x20a3, /* U+0020a3: FRENCH FRANC SIGN*/
-    0x20a4, /* U+0020a4: LIRA SIGN*/
-    0x20a5, /* U+0020a5: MILL SIGN*/
-    0x20a6, /* U+0020a6: NAIRA SIGN*/
-    0x20a7, /* U+0020a7: PESETA SIGN*/
-    0x20a8, /* U+0020a8: RUPEE SIGN*/
-    0x20a9, /* U+0020a9: WON SIGN*/
-    0x20aa, /* U+0020aa: NEW SHEQEL SIGN*/
-    0x20ab, /* U+0020ab: DONG SIGN*/
-    0x20ac, /* U+0020ac: EURO SIGN*/
-    0x20ad, /* U+0020ad: KIP SIGN*/
-    0x20ae, /* U+0020ae: TUGRIK SIGN*/
-    0x20af, /* U+0020af: DRACHMA SIGN*/
-    0x20b0, /* U+0020b0: GERMAN PENNY SIGN*/
-    0x20b1, /* U+0020b1: PESO SIGN*/
-    0x20b2, /* U+0020b2: GUARANI SIGN*/
-    0x20b3, /* U+0020b3: AUSTRAL SIGN*/
-    0x20b4, /* U+0020b4: HRYVNIA SIGN*/
-    0x20b5, /* U+0020b5: CEDI SIGN*/
-    0x20b6, /* U+0020b6: */
-    0x20b7, /* U+0020b7: */
-    0x20b8, /* U+0020b8: */
-    0x20b9, /* U+0020b9: */
-    0x20ba, /* U+0020ba: */
-    0x20bb, /* U+0020bb: */
-    0x20bc, /* U+0020bc: */
-    0x20bd, /* U+0020bd: */
-    0x20be, /* U+0020be: */
-    0x20bf, /* U+0020bf: */
-    0x20c0, /* U+0020c0: */
-    0x20c1, /* U+0020c1: */
-    0x20c2, /* U+0020c2: */
-    0x20c3, /* U+0020c3: */
-    0x20c4, /* U+0020c4: */
-    0x20c5, /* U+0020c5: */
-    0x20c6, /* U+0020c6: */
-    0x20c7, /* U+0020c7: */
-    0x20c8, /* U+0020c8: */
-    0x20c9, /* U+0020c9: */
-    0x20ca, /* U+0020ca: */
-    0x20cb, /* U+0020cb: */
-    0x20cc, /* U+0020cc: */
-    0x20cd, /* U+0020cd: */
-    0x20ce, /* U+0020ce: */
-    0x20cf, /* U+0020cf: */
-    0x20d0, /* U+0020d0: COMBINING LEFT HARPOON ABOVE*/
-    0x20d1, /* U+0020d1: COMBINING RIGHT HARPOON ABOVE*/
-    0x20d2, /* U+0020d2: COMBINING LONG VERTICAL LINE OVERLAY*/
-    0x20d3, /* U+0020d3: COMBINING SHORT VERTICAL LINE OVERLAY*/
-    0x20d4, /* U+0020d4: COMBINING ANTICLOCKWISE ARROW ABOVE*/
-    0x20d5, /* U+0020d5: COMBINING CLOCKWISE ARROW ABOVE*/
-    0x20d6, /* U+0020d6: COMBINING LEFT ARROW ABOVE*/
-    0x20d7, /* U+0020d7: COMBINING RIGHT ARROW ABOVE*/
-    0x20d8, /* U+0020d8: COMBINING RING OVERLAY*/
-    0x20d9, /* U+0020d9: COMBINING CLOCKWISE RING OVERLAY*/
-    0x20da, /* U+0020da: COMBINING ANTICLOCKWISE RING OVERLAY*/
-    0x20db, /* U+0020db: COMBINING THREE DOTS ABOVE*/
-    0x20dc, /* U+0020dc: COMBINING FOUR DOTS ABOVE*/
-    0x20dd, /* U+0020dd: COMBINING ENCLOSING CIRCLE*/
-    0x20de, /* U+0020de: COMBINING ENCLOSING SQUARE*/
-    0x20df, /* U+0020df: COMBINING ENCLOSING DIAMOND*/
-    0x20e0, /* U+0020e0: COMBINING ENCLOSING CIRCLE BACKSLASH*/
-    0x20e1, /* U+0020e1: COMBINING LEFT RIGHT ARROW ABOVE*/
-    0x20e2, /* U+0020e2: COMBINING ENCLOSING SCREEN*/
-    0x20e3, /* U+0020e3: COMBINING ENCLOSING KEYCAP*/
-    0x20e4, /* U+0020e4: COMBINING ENCLOSING UPWARD POINTING TRIANGLE*/
-    0x20e5, /* U+0020e5: COMBINING REVERSE SOLIDUS OVERLAY*/
-    0x20e6, /* U+0020e6: COMBINING DOUBLE VERTICAL STROKE OVERLAY*/
-    0x20e7, /* U+0020e7: COMBINING ANNUITY SYMBOL*/
-    0x20e8, /* U+0020e8: COMBINING TRIPLE UNDERDOT*/
-    0x20e9, /* U+0020e9: COMBINING WIDE BRIDGE ABOVE*/
-    0x20ea, /* U+0020ea: COMBINING LEFTWARDS ARROW OVERLAY*/
-    0x20eb, /* U+0020eb: COMBINING LONG DOUBLE SOLIDUS OVERLAY*/
-    0x20ec, /* U+0020ec: */
-    0x20ed, /* U+0020ed: */
-    0x20ee, /* U+0020ee: */
-    0x20ef, /* U+0020ef: */
-    0x20f0, /* U+0020f0: */
-    0x20f1, /* U+0020f1: */
-    0x20f2, /* U+0020f2: */
-    0x20f3, /* U+0020f3: */
-    0x20f4, /* U+0020f4: */
-    0x20f5, /* U+0020f5: */
-    0x20f6, /* U+0020f6: */
-    0x20f7, /* U+0020f7: */
-    0x20f8, /* U+0020f8: */
-    0x20f9, /* U+0020f9: */
-    0x20fa, /* U+0020fa: */
-    0x20fb, /* U+0020fb: */
-    0x20fc, /* U+0020fc: */
-    0x20fd, /* U+0020fd: */
-    0x20fe, /* U+0020fe: */
-    0x20ff, /* U+0020ff: */
-    0x2100, /* U+002100: ACCOUNT OF*/
-    0x2101, /* U+002101: ADDRESSED TO THE SUBJECT*/
-    0x2102, /* U+002102: DOUBLE-STRUCK CAPITAL C*/
-    0x2103, /* U+002103: DEGREE CELSIUS*/
-    0x2104, /* U+002104: CENTRE LINE SYMBOL*/
-    0x2105, /* U+002105: CARE OF*/
-    0x2106, /* U+002106: CADA UNA*/
-    0x2107, /* U+002107: EULER CONSTANT*/
-    0x2108, /* U+002108: SCRUPLE*/
-    0x2109, /* U+002109: DEGREE FAHRENHEIT*/
-    0x210a, /* U+00210a: SCRIPT SMALL G*/
-    0x210b, /* U+00210b: SCRIPT CAPITAL H*/
-    0x210c, /* U+00210c: BLACK-LETTER CAPITAL H*/
-    0x210d, /* U+00210d: DOUBLE-STRUCK CAPITAL H*/
-    0x210e, /* U+00210e: PLANCK CONSTANT*/
-    0x210f, /* U+00210f: PLANCK CONSTANT OVER TWO PI*/
-    0x2110, /* U+002110: SCRIPT CAPITAL I*/
-    0x2111, /* U+002111: BLACK-LETTER CAPITAL I*/
-    0x2112, /* U+002112: SCRIPT CAPITAL L*/
-    0x2113, /* U+002113: SCRIPT SMALL L*/
-    0x2114, /* U+002114: L B BAR SYMBOL*/
-    0x2115, /* U+002115: DOUBLE-STRUCK CAPITAL N*/
-    0x2116, /* U+002116: NUMERO SIGN*/
-    0x2117, /* U+002117: SOUND RECORDING COPYRIGHT*/
-    0x2118, /* U+002118: SCRIPT CAPITAL P*/
-    0x2119, /* U+002119: DOUBLE-STRUCK CAPITAL P*/
-    0x211a, /* U+00211a: DOUBLE-STRUCK CAPITAL Q*/
-    0x211b, /* U+00211b: SCRIPT CAPITAL R*/
-    0x211c, /* U+00211c: BLACK-LETTER CAPITAL R*/
-    0x211d, /* U+00211d: DOUBLE-STRUCK CAPITAL R*/
-    0x211e, /* U+00211e: PRESCRIPTION TAKE*/
-    0x211f, /* U+00211f: RESPONSE*/
-    0x2120, /* U+002120: SERVICE MARK*/
-    0x2121, /* U+002121: TELEPHONE SIGN*/
-    0x2122, /* U+002122: TRADE MARK SIGN*/
-    0x2123, /* U+002123: VERSICLE*/
-    0x2124, /* U+002124: DOUBLE-STRUCK CAPITAL Z*/
-    0x2125, /* U+002125: OUNCE SIGN*/
-    0x3c9, /* U+002126: OHM SIGN*/
-    0x2127, /* U+002127: INVERTED OHM SIGN*/
-    0x2128, /* U+002128: BLACK-LETTER CAPITAL Z*/
-    0x2129, /* U+002129: TURNED GREEK SMALL LETTER IOTA*/
-    0x6b, /* U+00212a: KELVIN SIGN*/
-    0xe5, /* U+00212b: ANGSTROM SIGN*/
-    0x212c, /* U+00212c: SCRIPT CAPITAL B*/
-    0x212d, /* U+00212d: BLACK-LETTER CAPITAL C*/
-    0x212e, /* U+00212e: ESTIMATED SYMBOL*/
-    0x212f, /* U+00212f: SCRIPT SMALL E*/
-    0x2130, /* U+002130: SCRIPT CAPITAL E*/
-    0x2131, /* U+002131: SCRIPT CAPITAL F*/
-    0x2132, /* U+002132: TURNED CAPITAL F*/
-    0x2133, /* U+002133: SCRIPT CAPITAL M*/
-    0x2134, /* U+002134: SCRIPT SMALL O*/
-    0x2135, /* U+002135: ALEF SYMBOL*/
-    0x2136, /* U+002136: BET SYMBOL*/
-    0x2137, /* U+002137: GIMEL SYMBOL*/
-    0x2138, /* U+002138: DALET SYMBOL*/
-    0x2139, /* U+002139: INFORMATION SOURCE*/
-    0x213a, /* U+00213a: ROTATED CAPITAL Q*/
-    0x213b, /* U+00213b: FACSIMILE SIGN*/
-    0x213c, /* U+00213c: DOUBLE-STRUCK SMALL PI*/
-    0x213d, /* U+00213d: DOUBLE-STRUCK SMALL GAMMA*/
-    0x213e, /* U+00213e: DOUBLE-STRUCK CAPITAL GAMMA*/
-    0x213f, /* U+00213f: DOUBLE-STRUCK CAPITAL PI*/
-    0x2140, /* U+002140: DOUBLE-STRUCK N-ARY SUMMATION*/
-    0x2141, /* U+002141: TURNED SANS-SERIF CAPITAL G*/
-    0x2142, /* U+002142: TURNED SANS-SERIF CAPITAL L*/
-    0x2143, /* U+002143: REVERSED SANS-SERIF CAPITAL L*/
-    0x2144, /* U+002144: TURNED SANS-SERIF CAPITAL Y*/
-    0x2145, /* U+002145: DOUBLE-STRUCK ITALIC CAPITAL D*/
-    0x2146, /* U+002146: DOUBLE-STRUCK ITALIC SMALL D*/
-    0x2147, /* U+002147: DOUBLE-STRUCK ITALIC SMALL E*/
-    0x2148, /* U+002148: DOUBLE-STRUCK ITALIC SMALL I*/
-    0x2149, /* U+002149: DOUBLE-STRUCK ITALIC SMALL J*/
-    0x214a, /* U+00214a: PROPERTY LINE*/
-    0x214b, /* U+00214b: TURNED AMPERSAND*/
-    0x214c, /* U+00214c: PER SIGN*/
-    0x214d, /* U+00214d: */
-    0x214e, /* U+00214e: */
-    0x214f, /* U+00214f: */
-    0x2150, /* U+002150: */
-    0x2151, /* U+002151: */
-    0x2152, /* U+002152: */
-    0x2153, /* U+002153: VULGAR FRACTION ONE THIRD*/
-    0x2154, /* U+002154: VULGAR FRACTION TWO THIRDS*/
-    0x2155, /* U+002155: VULGAR FRACTION ONE FIFTH*/
-    0x2156, /* U+002156: VULGAR FRACTION TWO FIFTHS*/
-    0x2157, /* U+002157: VULGAR FRACTION THREE FIFTHS*/
-    0x2158, /* U+002158: VULGAR FRACTION FOUR FIFTHS*/
-    0x2159, /* U+002159: VULGAR FRACTION ONE SIXTH*/
-    0x215a, /* U+00215a: VULGAR FRACTION FIVE SIXTHS*/
-    0x215b, /* U+00215b: VULGAR FRACTION ONE EIGHTH*/
-    0x215c, /* U+00215c: VULGAR FRACTION THREE EIGHTHS*/
-    0x215d, /* U+00215d: VULGAR FRACTION FIVE EIGHTHS*/
-    0x215e, /* U+00215e: VULGAR FRACTION SEVEN EIGHTHS*/
-    0x215f, /* U+00215f: FRACTION NUMERATOR ONE*/
-    0x2170, /* U+002160: ROMAN NUMERAL ONE*/
-    0x2171, /* U+002161: ROMAN NUMERAL TWO*/
-    0x2172, /* U+002162: ROMAN NUMERAL THREE*/
-    0x2173, /* U+002163: ROMAN NUMERAL FOUR*/
-    0x2174, /* U+002164: ROMAN NUMERAL FIVE*/
-    0x2175, /* U+002165: ROMAN NUMERAL SIX*/
-    0x2176, /* U+002166: ROMAN NUMERAL SEVEN*/
-    0x2177, /* U+002167: ROMAN NUMERAL EIGHT*/
-    0x2178, /* U+002168: ROMAN NUMERAL NINE*/
-    0x2179, /* U+002169: ROMAN NUMERAL TEN*/
-    0x217a, /* U+00216a: ROMAN NUMERAL ELEVEN*/
-    0x217b, /* U+00216b: ROMAN NUMERAL TWELVE*/
-    0x217c, /* U+00216c: ROMAN NUMERAL FIFTY*/
-    0x217d, /* U+00216d: ROMAN NUMERAL ONE HUNDRED*/
-    0x217e, /* U+00216e: ROMAN NUMERAL FIVE HUNDRED*/
-    0x217f, /* U+00216f: ROMAN NUMERAL ONE THOUSAND*/
-    0x2170, /* U+002170: SMALL ROMAN NUMERAL ONE*/
-    0x2171, /* U+002171: SMALL ROMAN NUMERAL TWO*/
-    0x2172, /* U+002172: SMALL ROMAN NUMERAL THREE*/
-    0x2173, /* U+002173: SMALL ROMAN NUMERAL FOUR*/
-    0x2174, /* U+002174: SMALL ROMAN NUMERAL FIVE*/
-    0x2175, /* U+002175: SMALL ROMAN NUMERAL SIX*/
-    0x2176, /* U+002176: SMALL ROMAN NUMERAL SEVEN*/
-    0x2177, /* U+002177: SMALL ROMAN NUMERAL EIGHT*/
-    0x2178, /* U+002178: SMALL ROMAN NUMERAL NINE*/
-    0x2179, /* U+002179: SMALL ROMAN NUMERAL TEN*/
-    0x217a, /* U+00217a: SMALL ROMAN NUMERAL ELEVEN*/
-    0x217b, /* U+00217b: SMALL ROMAN NUMERAL TWELVE*/
-    0x217c, /* U+00217c: SMALL ROMAN NUMERAL FIFTY*/
-    0x217d, /* U+00217d: SMALL ROMAN NUMERAL ONE HUNDRED*/
-    0x217e, /* U+00217e: SMALL ROMAN NUMERAL FIVE HUNDRED*/
-    0x217f, /* U+00217f: SMALL ROMAN NUMERAL ONE THOUSAND*/
-    0x2180, /* U+002180: ROMAN NUMERAL ONE THOUSAND C D*/
-    0x2181, /* U+002181: ROMAN NUMERAL FIVE THOUSAND*/
-    0x2182, /* U+002182: ROMAN NUMERAL TEN THOUSAND*/
-    0x2183, /* U+002183: ROMAN NUMERAL REVERSED ONE HUNDRED*/
-    0x2184, /* U+002184: */
-    0x2185, /* U+002185: */
-    0x2186, /* U+002186: */
-    0x2187, /* U+002187: */
-    0x2188, /* U+002188: */
-    0x2189, /* U+002189: */
-    0x218a, /* U+00218a: */
-    0x218b, /* U+00218b: */
-    0x218c, /* U+00218c: */
-    0x218d, /* U+00218d: */
-    0x218e, /* U+00218e: */
-    0x218f, /* U+00218f: */
-    0x2190, /* U+002190: LEFTWARDS ARROW*/
-    0x2191, /* U+002191: UPWARDS ARROW*/
-    0x2192, /* U+002192: RIGHTWARDS ARROW*/
-    0x2193, /* U+002193: DOWNWARDS ARROW*/
-    0x2194, /* U+002194: LEFT RIGHT ARROW*/
-    0x2195, /* U+002195: UP DOWN ARROW*/
-    0x2196, /* U+002196: NORTH WEST ARROW*/
-    0x2197, /* U+002197: NORTH EAST ARROW*/
-    0x2198, /* U+002198: SOUTH EAST ARROW*/
-    0x2199, /* U+002199: SOUTH WEST ARROW*/
-    0x219a, /* U+00219a: LEFTWARDS ARROW WITH STROKE*/
-    0x219b, /* U+00219b: RIGHTWARDS ARROW WITH STROKE*/
-    0x219c, /* U+00219c: LEFTWARDS WAVE ARROW*/
-    0x219d, /* U+00219d: RIGHTWARDS WAVE ARROW*/
-    0x219e, /* U+00219e: LEFTWARDS TWO HEADED ARROW*/
-    0x219f, /* U+00219f: UPWARDS TWO HEADED ARROW*/
-    0x21a0, /* U+0021a0: RIGHTWARDS TWO HEADED ARROW*/
-    0x21a1, /* U+0021a1: DOWNWARDS TWO HEADED ARROW*/
-    0x21a2, /* U+0021a2: LEFTWARDS ARROW WITH TAIL*/
-    0x21a3, /* U+0021a3: RIGHTWARDS ARROW WITH TAIL*/
-    0x21a4, /* U+0021a4: LEFTWARDS ARROW FROM BAR*/
-    0x21a5, /* U+0021a5: UPWARDS ARROW FROM BAR*/
-    0x21a6, /* U+0021a6: RIGHTWARDS ARROW FROM BAR*/
-    0x21a7, /* U+0021a7: DOWNWARDS ARROW FROM BAR*/
-    0x21a8, /* U+0021a8: UP DOWN ARROW WITH BASE*/
-    0x21a9, /* U+0021a9: LEFTWARDS ARROW WITH HOOK*/
-    0x21aa, /* U+0021aa: RIGHTWARDS ARROW WITH HOOK*/
-    0x21ab, /* U+0021ab: LEFTWARDS ARROW WITH LOOP*/
-    0x21ac, /* U+0021ac: RIGHTWARDS ARROW WITH LOOP*/
-    0x21ad, /* U+0021ad: LEFT RIGHT WAVE ARROW*/
-    0x21ae, /* U+0021ae: LEFT RIGHT ARROW WITH STROKE*/
-    0x21af, /* U+0021af: DOWNWARDS ZIGZAG ARROW*/
-    0x21b0, /* U+0021b0: UPWARDS ARROW WITH TIP LEFTWARDS*/
-    0x21b1, /* U+0021b1: UPWARDS ARROW WITH TIP RIGHTWARDS*/
-    0x21b2, /* U+0021b2: DOWNWARDS ARROW WITH TIP LEFTWARDS*/
-    0x21b3, /* U+0021b3: DOWNWARDS ARROW WITH TIP RIGHTWARDS*/
-    0x21b4, /* U+0021b4: RIGHTWARDS ARROW WITH CORNER DOWNWARDS*/
-    0x21b5, /* U+0021b5: DOWNWARDS ARROW WITH CORNER LEFTWARDS*/
-    0x21b6, /* U+0021b6: ANTICLOCKWISE TOP SEMICIRCLE ARROW*/
-    0x21b7, /* U+0021b7: CLOCKWISE TOP SEMICIRCLE ARROW*/
-    0x21b8, /* U+0021b8: NORTH WEST ARROW TO LONG BAR*/
-    0x21b9, /* U+0021b9: LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR*/
-    0x21ba, /* U+0021ba: ANTICLOCKWISE OPEN CIRCLE ARROW*/
-    0x21bb, /* U+0021bb: CLOCKWISE OPEN CIRCLE ARROW*/
-    0x21bc, /* U+0021bc: LEFTWARDS HARPOON WITH BARB UPWARDS*/
-    0x21bd, /* U+0021bd: LEFTWARDS HARPOON WITH BARB DOWNWARDS*/
-    0x21be, /* U+0021be: UPWARDS HARPOON WITH BARB RIGHTWARDS*/
-    0x21bf, /* U+0021bf: UPWARDS HARPOON WITH BARB LEFTWARDS*/
-    0x21c0, /* U+0021c0: RIGHTWARDS HARPOON WITH BARB UPWARDS*/
-    0x21c1, /* U+0021c1: RIGHTWARDS HARPOON WITH BARB DOWNWARDS*/
-    0x21c2, /* U+0021c2: DOWNWARDS HARPOON WITH BARB RIGHTWARDS*/
-    0x21c3, /* U+0021c3: DOWNWARDS HARPOON WITH BARB LEFTWARDS*/
-    0x21c4, /* U+0021c4: RIGHTWARDS ARROW OVER LEFTWARDS ARROW*/
-    0x21c5, /* U+0021c5: UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW*/
-    0x21c6, /* U+0021c6: LEFTWARDS ARROW OVER RIGHTWARDS ARROW*/
-    0x21c7, /* U+0021c7: LEFTWARDS PAIRED ARROWS*/
-    0x21c8, /* U+0021c8: UPWARDS PAIRED ARROWS*/
-    0x21c9, /* U+0021c9: RIGHTWARDS PAIRED ARROWS*/
-    0x21ca, /* U+0021ca: DOWNWARDS PAIRED ARROWS*/
-    0x21cb, /* U+0021cb: LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON*/
-    0x21cc, /* U+0021cc: RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON*/
-    0x21cd, /* U+0021cd: LEFTWARDS DOUBLE ARROW WITH STROKE*/
-    0x21ce, /* U+0021ce: LEFT RIGHT DOUBLE ARROW WITH STROKE*/
-    0x21cf, /* U+0021cf: RIGHTWARDS DOUBLE ARROW WITH STROKE*/
-    0x21d0, /* U+0021d0: LEFTWARDS DOUBLE ARROW*/
-    0x21d1, /* U+0021d1: UPWARDS DOUBLE ARROW*/
-    0x21d2, /* U+0021d2: RIGHTWARDS DOUBLE ARROW*/
-    0x21d3, /* U+0021d3: DOWNWARDS DOUBLE ARROW*/
-    0x21d4, /* U+0021d4: LEFT RIGHT DOUBLE ARROW*/
-    0x21d5, /* U+0021d5: UP DOWN DOUBLE ARROW*/
-    0x21d6, /* U+0021d6: NORTH WEST DOUBLE ARROW*/
-    0x21d7, /* U+0021d7: NORTH EAST DOUBLE ARROW*/
-    0x21d8, /* U+0021d8: SOUTH EAST DOUBLE ARROW*/
-    0x21d9, /* U+0021d9: SOUTH WEST DOUBLE ARROW*/
-    0x21da, /* U+0021da: LEFTWARDS TRIPLE ARROW*/
-    0x21db, /* U+0021db: RIGHTWARDS TRIPLE ARROW*/
-    0x21dc, /* U+0021dc: LEFTWARDS SQUIGGLE ARROW*/
-    0x21dd, /* U+0021dd: RIGHTWARDS SQUIGGLE ARROW*/
-    0x21de, /* U+0021de: UPWARDS ARROW WITH DOUBLE STROKE*/
-    0x21df, /* U+0021df: DOWNWARDS ARROW WITH DOUBLE STROKE*/
-    0x21e0, /* U+0021e0: LEFTWARDS DASHED ARROW*/
-    0x21e1, /* U+0021e1: UPWARDS DASHED ARROW*/
-    0x21e2, /* U+0021e2: RIGHTWARDS DASHED ARROW*/
-    0x21e3, /* U+0021e3: DOWNWARDS DASHED ARROW*/
-    0x21e4, /* U+0021e4: LEFTWARDS ARROW TO BAR*/
-    0x21e5, /* U+0021e5: RIGHTWARDS ARROW TO BAR*/
-    0x21e6, /* U+0021e6: LEFTWARDS WHITE ARROW*/
-    0x21e7, /* U+0021e7: UPWARDS WHITE ARROW*/
-    0x21e8, /* U+0021e8: RIGHTWARDS WHITE ARROW*/
-    0x21e9, /* U+0021e9: DOWNWARDS WHITE ARROW*/
-    0x21ea, /* U+0021ea: UPWARDS WHITE ARROW FROM BAR*/
-    0x21eb, /* U+0021eb: UPWARDS WHITE ARROW ON PEDESTAL*/
-    0x21ec, /* U+0021ec: UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR*/
-    0x21ed, /* U+0021ed: UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR*/
-    0x21ee, /* U+0021ee: UPWARDS WHITE DOUBLE ARROW*/
-    0x21ef, /* U+0021ef: UPWARDS WHITE DOUBLE ARROW ON PEDESTAL*/
-    0x21f0, /* U+0021f0: RIGHTWARDS WHITE ARROW FROM WALL*/
-    0x21f1, /* U+0021f1: NORTH WEST ARROW TO CORNER*/
-    0x21f2, /* U+0021f2: SOUTH EAST ARROW TO CORNER*/
-    0x21f3, /* U+0021f3: UP DOWN WHITE ARROW*/
-    0x21f4, /* U+0021f4: RIGHT ARROW WITH SMALL CIRCLE*/
-    0x21f5, /* U+0021f5: DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW*/
-    0x21f6, /* U+0021f6: THREE RIGHTWARDS ARROWS*/
-    0x21f7, /* U+0021f7: LEFTWARDS ARROW WITH VERTICAL STROKE*/
-    0x21f8, /* U+0021f8: RIGHTWARDS ARROW WITH VERTICAL STROKE*/
-    0x21f9, /* U+0021f9: LEFT RIGHT ARROW WITH VERTICAL STROKE*/
-    0x21fa, /* U+0021fa: LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fb, /* U+0021fb: RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fc, /* U+0021fc: LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE*/
-    0x21fd, /* U+0021fd: LEFTWARDS OPEN-HEADED ARROW*/
-    0x21fe, /* U+0021fe: RIGHTWARDS OPEN-HEADED ARROW*/
-    0x21ff, /* U+0021ff: LEFT RIGHT OPEN-HEADED ARROW*/
-    0x2200, /* U+002200: FOR ALL*/
-    0x2201, /* U+002201: COMPLEMENT*/
-    0x2202, /* U+002202: PARTIAL DIFFERENTIAL*/
-    0x2203, /* U+002203: THERE EXISTS*/
-    0x2204, /* U+002204: THERE DOES NOT EXIST*/
-    0x2205, /* U+002205: EMPTY SET*/
-    0x2206, /* U+002206: INCREMENT*/
-    0x2207, /* U+002207: NABLA*/
-    0x2208, /* U+002208: ELEMENT OF*/
-    0x2209, /* U+002209: NOT AN ELEMENT OF*/
-    0x220a, /* U+00220a: SMALL ELEMENT OF*/
-    0x220b, /* U+00220b: CONTAINS AS MEMBER*/
-    0x220c, /* U+00220c: DOES NOT CONTAIN AS MEMBER*/
-    0x220d, /* U+00220d: SMALL CONTAINS AS MEMBER*/
-    0x220e, /* U+00220e: END OF PROOF*/
-    0x220f, /* U+00220f: N-ARY PRODUCT*/
-    0x2210, /* U+002210: N-ARY COPRODUCT*/
-    0x2211, /* U+002211: N-ARY SUMMATION*/
-    0x2212, /* U+002212: MINUS SIGN*/
-    0x2213, /* U+002213: MINUS-OR-PLUS SIGN*/
-    0x2214, /* U+002214: DOT PLUS*/
-    0x2215, /* U+002215: DIVISION SLASH*/
-    0x2216, /* U+002216: SET MINUS*/
-    0x2217, /* U+002217: ASTERISK OPERATOR*/
-    0x2218, /* U+002218: RING OPERATOR*/
-    0x2219, /* U+002219: BULLET OPERATOR*/
-    0x221a, /* U+00221a: SQUARE ROOT*/
-    0x221b, /* U+00221b: CUBE ROOT*/
-    0x221c, /* U+00221c: FOURTH ROOT*/
-    0x221d, /* U+00221d: PROPORTIONAL TO*/
-    0x221e, /* U+00221e: INFINITY*/
-    0x221f, /* U+00221f: RIGHT ANGLE*/
-    0x2220, /* U+002220: ANGLE*/
-    0x2221, /* U+002221: MEASURED ANGLE*/
-    0x2222, /* U+002222: SPHERICAL ANGLE*/
-    0x2223, /* U+002223: DIVIDES*/
-    0x2224, /* U+002224: DOES NOT DIVIDE*/
-    0x2225, /* U+002225: PARALLEL TO*/
-    0x2226, /* U+002226: NOT PARALLEL TO*/
-    0x2227, /* U+002227: LOGICAL AND*/
-    0x2228, /* U+002228: LOGICAL OR*/
-    0x2229, /* U+002229: INTERSECTION*/
-    0x222a, /* U+00222a: UNION*/
-    0x222b, /* U+00222b: INTEGRAL*/
-    0x222c, /* U+00222c: DOUBLE INTEGRAL*/
-    0x222d, /* U+00222d: TRIPLE INTEGRAL*/
-    0x222e, /* U+00222e: CONTOUR INTEGRAL*/
-    0x222f, /* U+00222f: SURFACE INTEGRAL*/
-    0x2230, /* U+002230: VOLUME INTEGRAL*/
-    0x2231, /* U+002231: CLOCKWISE INTEGRAL*/
-    0x2232, /* U+002232: CLOCKWISE CONTOUR INTEGRAL*/
-    0x2233, /* U+002233: ANTICLOCKWISE CONTOUR INTEGRAL*/
-    0x2234, /* U+002234: THEREFORE*/
-    0x2235, /* U+002235: BECAUSE*/
-    0x2236, /* U+002236: RATIO*/
-    0x2237, /* U+002237: PROPORTION*/
-    0x2238, /* U+002238: DOT MINUS*/
-    0x2239, /* U+002239: EXCESS*/
-    0x223a, /* U+00223a: GEOMETRIC PROPORTION*/
-    0x223b, /* U+00223b: HOMOTHETIC*/
-    0x223c, /* U+00223c: TILDE OPERATOR*/
-    0x223d, /* U+00223d: REVERSED TILDE*/
-    0x223e, /* U+00223e: INVERTED LAZY S*/
-    0x223f, /* U+00223f: SINE WAVE*/
-    0x2240, /* U+002240: WREATH PRODUCT*/
-    0x2241, /* U+002241: NOT TILDE*/
-    0x2242, /* U+002242: MINUS TILDE*/
-    0x2243, /* U+002243: ASYMPTOTICALLY EQUAL TO*/
-    0x2244, /* U+002244: NOT ASYMPTOTICALLY EQUAL TO*/
-    0x2245, /* U+002245: APPROXIMATELY EQUAL TO*/
-    0x2246, /* U+002246: APPROXIMATELY BUT NOT ACTUALLY EQUAL TO*/
-    0x2247, /* U+002247: NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO*/
-    0x2248, /* U+002248: ALMOST EQUAL TO*/
-    0x2249, /* U+002249: NOT ALMOST EQUAL TO*/
-    0x224a, /* U+00224a: ALMOST EQUAL OR EQUAL TO*/
-    0x224b, /* U+00224b: TRIPLE TILDE*/
-    0x224c, /* U+00224c: ALL EQUAL TO*/
-    0x224d, /* U+00224d: EQUIVALENT TO*/
-    0x224e, /* U+00224e: GEOMETRICALLY EQUIVALENT TO*/
-    0x224f, /* U+00224f: DIFFERENCE BETWEEN*/
-    0x2250, /* U+002250: APPROACHES THE LIMIT*/
-    0x2251, /* U+002251: GEOMETRICALLY EQUAL TO*/
-    0x2252, /* U+002252: APPROXIMATELY EQUAL TO OR THE IMAGE OF*/
-    0x2253, /* U+002253: IMAGE OF OR APPROXIMATELY EQUAL TO*/
-    0x2254, /* U+002254: COLON EQUALS*/
-    0x2255, /* U+002255: EQUALS COLON*/
-    0x2256, /* U+002256: RING IN EQUAL TO*/
-    0x2257, /* U+002257: RING EQUAL TO*/
-    0x2258, /* U+002258: CORRESPONDS TO*/
-    0x2259, /* U+002259: ESTIMATES*/
-    0x225a, /* U+00225a: EQUIANGULAR TO*/
-    0x225b, /* U+00225b: STAR EQUALS*/
-    0x225c, /* U+00225c: DELTA EQUAL TO*/
-    0x225d, /* U+00225d: EQUAL TO BY DEFINITION*/
-    0x225e, /* U+00225e: MEASURED BY*/
-    0x225f, /* U+00225f: QUESTIONED EQUAL TO*/
-    0x2260, /* U+002260: NOT EQUAL TO*/
-    0x2261, /* U+002261: IDENTICAL TO*/
-    0x2262, /* U+002262: NOT IDENTICAL TO*/
-    0x2263, /* U+002263: STRICTLY EQUIVALENT TO*/
-    0x2264, /* U+002264: LESS-THAN OR EQUAL TO*/
-    0x2265, /* U+002265: GREATER-THAN OR EQUAL TO*/
-    0x2266, /* U+002266: LESS-THAN OVER EQUAL TO*/
-    0x2267, /* U+002267: GREATER-THAN OVER EQUAL TO*/
-    0x2268, /* U+002268: LESS-THAN BUT NOT EQUAL TO*/
-    0x2269, /* U+002269: GREATER-THAN BUT NOT EQUAL TO*/
-    0x226a, /* U+00226a: MUCH LESS-THAN*/
-    0x226b, /* U+00226b: MUCH GREATER-THAN*/
-    0x226c, /* U+00226c: BETWEEN*/
-    0x226d, /* U+00226d: NOT EQUIVALENT TO*/
-    0x226e, /* U+00226e: NOT LESS-THAN*/
-    0x226f, /* U+00226f: NOT GREATER-THAN*/
-    0x2270, /* U+002270: NEITHER LESS-THAN NOR EQUAL TO*/
-    0x2271, /* U+002271: NEITHER GREATER-THAN NOR EQUAL TO*/
-    0x2272, /* U+002272: LESS-THAN OR EQUIVALENT TO*/
-    0x2273, /* U+002273: GREATER-THAN OR EQUIVALENT TO*/
-    0x2274, /* U+002274: NEITHER LESS-THAN NOR EQUIVALENT TO*/
-    0x2275, /* U+002275: NEITHER GREATER-THAN NOR EQUIVALENT TO*/
-    0x2276, /* U+002276: LESS-THAN OR GREATER-THAN*/
-    0x2277, /* U+002277: GREATER-THAN OR LESS-THAN*/
-    0x2278, /* U+002278: NEITHER LESS-THAN NOR GREATER-THAN*/
-    0x2279, /* U+002279: NEITHER GREATER-THAN NOR LESS-THAN*/
-    0x227a, /* U+00227a: PRECEDES*/
-    0x227b, /* U+00227b: SUCCEEDS*/
-    0x227c, /* U+00227c: PRECEDES OR EQUAL TO*/
-    0x227d, /* U+00227d: SUCCEEDS OR EQUAL TO*/
-    0x227e, /* U+00227e: PRECEDES OR EQUIVALENT TO*/
-    0x227f, /* U+00227f: SUCCEEDS OR EQUIVALENT TO*/
-    0x2280, /* U+002280: DOES NOT PRECEDE*/
-    0x2281, /* U+002281: DOES NOT SUCCEED*/
-    0x2282, /* U+002282: SUBSET OF*/
-    0x2283, /* U+002283: SUPERSET OF*/
-    0x2284, /* U+002284: NOT A SUBSET OF*/
-    0x2285, /* U+002285: NOT A SUPERSET OF*/
-    0x2286, /* U+002286: SUBSET OF OR EQUAL TO*/
-    0x2287, /* U+002287: SUPERSET OF OR EQUAL TO*/
-    0x2288, /* U+002288: NEITHER A SUBSET OF NOR EQUAL TO*/
-    0x2289, /* U+002289: NEITHER A SUPERSET OF NOR EQUAL TO*/
-    0x228a, /* U+00228a: SUBSET OF WITH NOT EQUAL TO*/
-    0x228b, /* U+00228b: SUPERSET OF WITH NOT EQUAL TO*/
-    0x228c, /* U+00228c: MULTISET*/
-    0x228d, /* U+00228d: MULTISET MULTIPLICATION*/
-    0x228e, /* U+00228e: MULTISET UNION*/
-    0x228f, /* U+00228f: SQUARE IMAGE OF*/
-    0x2290, /* U+002290: SQUARE ORIGINAL OF*/
-    0x2291, /* U+002291: SQUARE IMAGE OF OR EQUAL TO*/
-    0x2292, /* U+002292: SQUARE ORIGINAL OF OR EQUAL TO*/
-    0x2293, /* U+002293: SQUARE CAP*/
-    0x2294, /* U+002294: SQUARE CUP*/
-    0x2295, /* U+002295: CIRCLED PLUS*/
-    0x2296, /* U+002296: CIRCLED MINUS*/
-    0x2297, /* U+002297: CIRCLED TIMES*/
-    0x2298, /* U+002298: CIRCLED DIVISION SLASH*/
-    0x2299, /* U+002299: CIRCLED DOT OPERATOR*/
-    0x229a, /* U+00229a: CIRCLED RING OPERATOR*/
-    0x229b, /* U+00229b: CIRCLED ASTERISK OPERATOR*/
-    0x229c, /* U+00229c: CIRCLED EQUALS*/
-    0x229d, /* U+00229d: CIRCLED DASH*/
-    0x229e, /* U+00229e: SQUARED PLUS*/
-    0x229f, /* U+00229f: SQUARED MINUS*/
-    0x22a0, /* U+0022a0: SQUARED TIMES*/
-    0x22a1, /* U+0022a1: SQUARED DOT OPERATOR*/
-    0x22a2, /* U+0022a2: RIGHT TACK*/
-    0x22a3, /* U+0022a3: LEFT TACK*/
-    0x22a4, /* U+0022a4: DOWN TACK*/
-    0x22a5, /* U+0022a5: UP TACK*/
-    0x22a6, /* U+0022a6: ASSERTION*/
-    0x22a7, /* U+0022a7: MODELS*/
-    0x22a8, /* U+0022a8: TRUE*/
-    0x22a9, /* U+0022a9: FORCES*/
-    0x22aa, /* U+0022aa: TRIPLE VERTICAL BAR RIGHT TURNSTILE*/
-    0x22ab, /* U+0022ab: DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-    0x22ac, /* U+0022ac: DOES NOT PROVE*/
-    0x22ad, /* U+0022ad: NOT TRUE*/
-    0x22ae, /* U+0022ae: DOES NOT FORCE*/
-    0x22af, /* U+0022af: NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE*/
-    0x22b0, /* U+0022b0: PRECEDES UNDER RELATION*/
-    0x22b1, /* U+0022b1: SUCCEEDS UNDER RELATION*/
-    0x22b2, /* U+0022b2: NORMAL SUBGROUP OF*/
-    0x22b3, /* U+0022b3: CONTAINS AS NORMAL SUBGROUP*/
-    0x22b4, /* U+0022b4: NORMAL SUBGROUP OF OR EQUAL TO*/
-    0x22b5, /* U+0022b5: CONTAINS AS NORMAL SUBGROUP OR EQUAL TO*/
-    0x22b6, /* U+0022b6: ORIGINAL OF*/
-    0x22b7, /* U+0022b7: IMAGE OF*/
-    0x22b8, /* U+0022b8: MULTIMAP*/
-    0x22b9, /* U+0022b9: HERMITIAN CONJUGATE MATRIX*/
-    0x22ba, /* U+0022ba: INTERCALATE*/
-    0x22bb, /* U+0022bb: XOR*/
-    0x22bc, /* U+0022bc: NAND*/
-    0x22bd, /* U+0022bd: NOR*/
-    0x22be, /* U+0022be: RIGHT ANGLE WITH ARC*/
-    0x22bf, /* U+0022bf: RIGHT TRIANGLE*/
-    0x22c0, /* U+0022c0: N-ARY LOGICAL AND*/
-    0x22c1, /* U+0022c1: N-ARY LOGICAL OR*/
-    0x22c2, /* U+0022c2: N-ARY INTERSECTION*/
-    0x22c3, /* U+0022c3: N-ARY UNION*/
-    0x22c4, /* U+0022c4: DIAMOND OPERATOR*/
-    0x22c5, /* U+0022c5: DOT OPERATOR*/
-    0x22c6, /* U+0022c6: STAR OPERATOR*/
-    0x22c7, /* U+0022c7: DIVISION TIMES*/
-    0x22c8, /* U+0022c8: BOWTIE*/
-    0x22c9, /* U+0022c9: LEFT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-    0x22ca, /* U+0022ca: RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT*/
-    0x22cb, /* U+0022cb: LEFT SEMIDIRECT PRODUCT*/
-    0x22cc, /* U+0022cc: RIGHT SEMIDIRECT PRODUCT*/
-    0x22cd, /* U+0022cd: REVERSED TILDE EQUALS*/
-    0x22ce, /* U+0022ce: CURLY LOGICAL OR*/
-    0x22cf, /* U+0022cf: CURLY LOGICAL AND*/
-    0x22d0, /* U+0022d0: DOUBLE SUBSET*/
-    0x22d1, /* U+0022d1: DOUBLE SUPERSET*/
-    0x22d2, /* U+0022d2: DOUBLE INTERSECTION*/
-    0x22d3, /* U+0022d3: DOUBLE UNION*/
-    0x22d4, /* U+0022d4: PITCHFORK*/
-    0x22d5, /* U+0022d5: EQUAL AND PARALLEL TO*/
-    0x22d6, /* U+0022d6: LESS-THAN WITH DOT*/
-    0x22d7, /* U+0022d7: GREATER-THAN WITH DOT*/
-    0x22d8, /* U+0022d8: VERY MUCH LESS-THAN*/
-    0x22d9, /* U+0022d9: VERY MUCH GREATER-THAN*/
-    0x22da, /* U+0022da: LESS-THAN EQUAL TO OR GREATER-THAN*/
-    0x22db, /* U+0022db: GREATER-THAN EQUAL TO OR LESS-THAN*/
-    0x22dc, /* U+0022dc: EQUAL TO OR LESS-THAN*/
-    0x22dd, /* U+0022dd: EQUAL TO OR GREATER-THAN*/
-    0x22de, /* U+0022de: EQUAL TO OR PRECEDES*/
-    0x22df, /* U+0022df: EQUAL TO OR SUCCEEDS*/
-    0x22e0, /* U+0022e0: DOES NOT PRECEDE OR EQUAL*/
-    0x22e1, /* U+0022e1: DOES NOT SUCCEED OR EQUAL*/
-    0x22e2, /* U+0022e2: NOT SQUARE IMAGE OF OR EQUAL TO*/
-    0x22e3, /* U+0022e3: NOT SQUARE ORIGINAL OF OR EQUAL TO*/
-    0x22e4, /* U+0022e4: SQUARE IMAGE OF OR NOT EQUAL TO*/
-    0x22e5, /* U+0022e5: SQUARE ORIGINAL OF OR NOT EQUAL TO*/
-    0x22e6, /* U+0022e6: LESS-THAN BUT NOT EQUIVALENT TO*/
-    0x22e7, /* U+0022e7: GREATER-THAN BUT NOT EQUIVALENT TO*/
-    0x22e8, /* U+0022e8: PRECEDES BUT NOT EQUIVALENT TO*/
-    0x22e9, /* U+0022e9: SUCCEEDS BUT NOT EQUIVALENT TO*/
-    0x22ea, /* U+0022ea: NOT NORMAL SUBGROUP OF*/
-    0x22eb, /* U+0022eb: DOES NOT CONTAIN AS NORMAL SUBGROUP*/
-    0x22ec, /* U+0022ec: NOT NORMAL SUBGROUP OF OR EQUAL TO*/
-    0x22ed, /* U+0022ed: DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL*/
-    0x22ee, /* U+0022ee: VERTICAL ELLIPSIS*/
-    0x22ef, /* U+0022ef: MIDLINE HORIZONTAL ELLIPSIS*/
-    0x22f0, /* U+0022f0: UP RIGHT DIAGONAL ELLIPSIS*/
-    0x22f1, /* U+0022f1: DOWN RIGHT DIAGONAL ELLIPSIS*/
-    0x22f2, /* U+0022f2: ELEMENT OF WITH LONG HORIZONTAL STROKE*/
-    0x22f3, /* U+0022f3: ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22f4, /* U+0022f4: SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22f5, /* U+0022f5: ELEMENT OF WITH DOT ABOVE*/
-    0x22f6, /* U+0022f6: ELEMENT OF WITH OVERBAR*/
-    0x22f7, /* U+0022f7: SMALL ELEMENT OF WITH OVERBAR*/
-    0x22f8, /* U+0022f8: ELEMENT OF WITH UNDERBAR*/
-    0x22f9, /* U+0022f9: ELEMENT OF WITH TWO HORIZONTAL STROKES*/
-    0x22fa, /* U+0022fa: CONTAINS WITH LONG HORIZONTAL STROKE*/
-    0x22fb, /* U+0022fb: CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22fc, /* U+0022fc: SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE*/
-    0x22fd, /* U+0022fd: CONTAINS WITH OVERBAR*/
-    0x22fe, /* U+0022fe: SMALL CONTAINS WITH OVERBAR*/
-    0x22ff, /* U+0022ff: Z NOTATION BAG MEMBERSHIP*/
-    0x2300, /* U+002300: DIAMETER SIGN*/
-    0x2301, /* U+002301: ELECTRIC ARROW*/
-    0x2302, /* U+002302: HOUSE*/
-    0x2303, /* U+002303: UP ARROWHEAD*/
-    0x2304, /* U+002304: DOWN ARROWHEAD*/
-    0x2305, /* U+002305: PROJECTIVE*/
-    0x2306, /* U+002306: PERSPECTIVE*/
-    0x2307, /* U+002307: WAVY LINE*/
-    0x2308, /* U+002308: LEFT CEILING*/
-    0x2309, /* U+002309: RIGHT CEILING*/
-    0x230a, /* U+00230a: LEFT FLOOR*/
-    0x230b, /* U+00230b: RIGHT FLOOR*/
-    0x230c, /* U+00230c: BOTTOM RIGHT CROP*/
-    0x230d, /* U+00230d: BOTTOM LEFT CROP*/
-    0x230e, /* U+00230e: TOP RIGHT CROP*/
-    0x230f, /* U+00230f: TOP LEFT CROP*/
-    0x2310, /* U+002310: REVERSED NOT SIGN*/
-    0x2311, /* U+002311: SQUARE LOZENGE*/
-    0x2312, /* U+002312: ARC*/
-    0x2313, /* U+002313: SEGMENT*/
-    0x2314, /* U+002314: SECTOR*/
-    0x2315, /* U+002315: TELEPHONE RECORDER*/
-    0x2316, /* U+002316: POSITION INDICATOR*/
-    0x2317, /* U+002317: VIEWDATA SQUARE*/
-    0x2318, /* U+002318: PLACE OF INTEREST SIGN*/
-    0x2319, /* U+002319: TURNED NOT SIGN*/
-    0x231a, /* U+00231a: WATCH*/
-    0x231b, /* U+00231b: HOURGLASS*/
-    0x231c, /* U+00231c: TOP LEFT CORNER*/
-    0x231d, /* U+00231d: TOP RIGHT CORNER*/
-    0x231e, /* U+00231e: BOTTOM LEFT CORNER*/
-    0x231f, /* U+00231f: BOTTOM RIGHT CORNER*/
-    0x2320, /* U+002320: TOP HALF INTEGRAL*/
-    0x2321, /* U+002321: BOTTOM HALF INTEGRAL*/
-    0x2322, /* U+002322: FROWN*/
-    0x2323, /* U+002323: SMILE*/
-    0x2324, /* U+002324: UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS*/
-    0x2325, /* U+002325: OPTION KEY*/
-    0x2326, /* U+002326: ERASE TO THE RIGHT*/
-    0x2327, /* U+002327: X IN A RECTANGLE BOX*/
-    0x2328, /* U+002328: KEYBOARD*/
-    0x2329, /* U+002329: LEFT-POINTING ANGLE BRACKET*/
-    0x232a, /* U+00232a: RIGHT-POINTING ANGLE BRACKET*/
-    0x232b, /* U+00232b: ERASE TO THE LEFT*/
-    0x232c, /* U+00232c: BENZENE RING*/
-    0x232d, /* U+00232d: CYLINDRICITY*/
-    0x232e, /* U+00232e: ALL AROUND-PROFILE*/
-    0x232f, /* U+00232f: SYMMETRY*/
-    0x2330, /* U+002330: TOTAL RUNOUT*/
-    0x2331, /* U+002331: DIMENSION ORIGIN*/
-    0x2332, /* U+002332: CONICAL TAPER*/
-    0x2333, /* U+002333: SLOPE*/
-    0x2334, /* U+002334: COUNTERBORE*/
-    0x2335, /* U+002335: COUNTERSINK*/
-    0x2336, /* U+002336: APL FUNCTIONAL SYMBOL I-BEAM*/
-    0x2337, /* U+002337: APL FUNCTIONAL SYMBOL SQUISH QUAD*/
-    0x2338, /* U+002338: APL FUNCTIONAL SYMBOL QUAD EQUAL*/
-    0x2339, /* U+002339: APL FUNCTIONAL SYMBOL QUAD DIVIDE*/
-    0x233a, /* U+00233a: APL FUNCTIONAL SYMBOL QUAD DIAMOND*/
-    0x233b, /* U+00233b: APL FUNCTIONAL SYMBOL QUAD JOT*/
-    0x233c, /* U+00233c: APL FUNCTIONAL SYMBOL QUAD CIRCLE*/
-    0x233d, /* U+00233d: APL FUNCTIONAL SYMBOL CIRCLE STILE*/
-    0x233e, /* U+00233e: APL FUNCTIONAL SYMBOL CIRCLE JOT*/
-    0x233f, /* U+00233f: APL FUNCTIONAL SYMBOL SLASH BAR*/
-    0x2340, /* U+002340: APL FUNCTIONAL SYMBOL BACKSLASH BAR*/
-    0x2341, /* U+002341: APL FUNCTIONAL SYMBOL QUAD SLASH*/
-    0x2342, /* U+002342: APL FUNCTIONAL SYMBOL QUAD BACKSLASH*/
-    0x2343, /* U+002343: APL FUNCTIONAL SYMBOL QUAD LESS-THAN*/
-    0x2344, /* U+002344: APL FUNCTIONAL SYMBOL QUAD GREATER-THAN*/
-    0x2345, /* U+002345: APL FUNCTIONAL SYMBOL LEFTWARDS VANE*/
-    0x2346, /* U+002346: APL FUNCTIONAL SYMBOL RIGHTWARDS VANE*/
-    0x2347, /* U+002347: APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW*/
-    0x2348, /* U+002348: APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW*/
-    0x2349, /* U+002349: APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH*/
-    0x234a, /* U+00234a: APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR*/
-    0x234b, /* U+00234b: APL FUNCTIONAL SYMBOL DELTA STILE*/
-    0x234c, /* U+00234c: APL FUNCTIONAL SYMBOL QUAD DOWN CARET*/
-    0x234d, /* U+00234d: APL FUNCTIONAL SYMBOL QUAD DELTA*/
-    0x234e, /* U+00234e: APL FUNCTIONAL SYMBOL DOWN TACK JOT*/
-    0x234f, /* U+00234f: APL FUNCTIONAL SYMBOL UPWARDS VANE*/
-    0x2350, /* U+002350: APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW*/
-    0x2351, /* U+002351: APL FUNCTIONAL SYMBOL UP TACK OVERBAR*/
-    0x2352, /* U+002352: APL FUNCTIONAL SYMBOL DEL STILE*/
-    0x2353, /* U+002353: APL FUNCTIONAL SYMBOL QUAD UP CARET*/
-    0x2354, /* U+002354: APL FUNCTIONAL SYMBOL QUAD DEL*/
-    0x2355, /* U+002355: APL FUNCTIONAL SYMBOL UP TACK JOT*/
-    0x2356, /* U+002356: APL FUNCTIONAL SYMBOL DOWNWARDS VANE*/
-    0x2357, /* U+002357: APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW*/
-    0x2358, /* U+002358: APL FUNCTIONAL SYMBOL QUOTE UNDERBAR*/
-    0x2359, /* U+002359: APL FUNCTIONAL SYMBOL DELTA UNDERBAR*/
-    0x235a, /* U+00235a: APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR*/
-    0x235b, /* U+00235b: APL FUNCTIONAL SYMBOL JOT UNDERBAR*/
-    0x235c, /* U+00235c: APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR*/
-    0x235d, /* U+00235d: APL FUNCTIONAL SYMBOL UP SHOE JOT*/
-    0x235e, /* U+00235e: APL FUNCTIONAL SYMBOL QUOTE QUAD*/
-    0x235f, /* U+00235f: APL FUNCTIONAL SYMBOL CIRCLE STAR*/
-    0x2360, /* U+002360: APL FUNCTIONAL SYMBOL QUAD COLON*/
-    0x2361, /* U+002361: APL FUNCTIONAL SYMBOL UP TACK DIAERESIS*/
-    0x2362, /* U+002362: APL FUNCTIONAL SYMBOL DEL DIAERESIS*/
-    0x2363, /* U+002363: APL FUNCTIONAL SYMBOL STAR DIAERESIS*/
-    0x2364, /* U+002364: APL FUNCTIONAL SYMBOL JOT DIAERESIS*/
-    0x2365, /* U+002365: APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS*/
-    0x2366, /* U+002366: APL FUNCTIONAL SYMBOL DOWN SHOE STILE*/
-    0x2367, /* U+002367: APL FUNCTIONAL SYMBOL LEFT SHOE STILE*/
-    0x2368, /* U+002368: APL FUNCTIONAL SYMBOL TILDE DIAERESIS*/
-    0x2369, /* U+002369: APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS*/
-    0x236a, /* U+00236a: APL FUNCTIONAL SYMBOL COMMA BAR*/
-    0x236b, /* U+00236b: APL FUNCTIONAL SYMBOL DEL TILDE*/
-    0x236c, /* U+00236c: APL FUNCTIONAL SYMBOL ZILDE*/
-    0x236d, /* U+00236d: APL FUNCTIONAL SYMBOL STILE TILDE*/
-    0x236e, /* U+00236e: APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR*/
-    0x236f, /* U+00236f: APL FUNCTIONAL SYMBOL QUAD NOT EQUAL*/
-    0x2370, /* U+002370: APL FUNCTIONAL SYMBOL QUAD QUESTION*/
-    0x2371, /* U+002371: APL FUNCTIONAL SYMBOL DOWN CARET TILDE*/
-    0x2372, /* U+002372: APL FUNCTIONAL SYMBOL UP CARET TILDE*/
-    0x2373, /* U+002373: APL FUNCTIONAL SYMBOL IOTA*/
-    0x2374, /* U+002374: APL FUNCTIONAL SYMBOL RHO*/
-    0x2375, /* U+002375: APL FUNCTIONAL SYMBOL OMEGA*/
-    0x2376, /* U+002376: APL FUNCTIONAL SYMBOL ALPHA UNDERBAR*/
-    0x2377, /* U+002377: APL FUNCTIONAL SYMBOL EPSILON UNDERBAR*/
-    0x2378, /* U+002378: APL FUNCTIONAL SYMBOL IOTA UNDERBAR*/
-    0x2379, /* U+002379: APL FUNCTIONAL SYMBOL OMEGA UNDERBAR*/
-    0x237a, /* U+00237a: APL FUNCTIONAL SYMBOL ALPHA*/
-    0x237b, /* U+00237b: NOT CHECK MARK*/
-    0x237c, /* U+00237c: RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW*/
-    0x237d, /* U+00237d: SHOULDERED OPEN BOX*/
-    0x237e, /* U+00237e: BELL SYMBOL*/
-    0x237f, /* U+00237f: VERTICAL LINE WITH MIDDLE DOT*/
-    0x2380, /* U+002380: INSERTION SYMBOL*/
-    0x2381, /* U+002381: CONTINUOUS UNDERLINE SYMBOL*/
-    0x2382, /* U+002382: DISCONTINUOUS UNDERLINE SYMBOL*/
-    0x2383, /* U+002383: EMPHASIS SYMBOL*/
-    0x2384, /* U+002384: COMPOSITION SYMBOL*/
-    0x2385, /* U+002385: WHITE SQUARE WITH CENTRE VERTICAL LINE*/
-    0x2386, /* U+002386: ENTER SYMBOL*/
-    0x2387, /* U+002387: ALTERNATIVE KEY SYMBOL*/
-    0x2388, /* U+002388: HELM SYMBOL*/
-    0x2389, /* U+002389: CIRCLED HORIZONTAL BAR WITH NOTCH*/
-    0x238a, /* U+00238a: CIRCLED TRIANGLE DOWN*/
-    0x238b, /* U+00238b: BROKEN CIRCLE WITH NORTHWEST ARROW*/
-    0x238c, /* U+00238c: UNDO SYMBOL*/
-    0x238d, /* U+00238d: MONOSTABLE SYMBOL*/
-    0x238e, /* U+00238e: HYSTERESIS SYMBOL*/
-    0x238f, /* U+00238f: OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL*/
-    0x2390, /* U+002390: OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL*/
-    0x2391, /* U+002391: PASSIVE-PULL-DOWN-OUTPUT SYMBOL*/
-    0x2392, /* U+002392: PASSIVE-PULL-UP-OUTPUT SYMBOL*/
-    0x2393, /* U+002393: DIRECT CURRENT SYMBOL FORM TWO*/
-    0x2394, /* U+002394: SOFTWARE-FUNCTION SYMBOL*/
-    0x2395, /* U+002395: APL FUNCTIONAL SYMBOL QUAD*/
-    0x2396, /* U+002396: DECIMAL SEPARATOR KEY SYMBOL*/
-    0x2397, /* U+002397: PREVIOUS PAGE*/
-    0x2398, /* U+002398: NEXT PAGE*/
-    0x2399, /* U+002399: PRINT SCREEN SYMBOL*/
-    0x239a, /* U+00239a: CLEAR SCREEN SYMBOL*/
-    0x239b, /* U+00239b: LEFT PARENTHESIS UPPER HOOK*/
-    0x239c, /* U+00239c: LEFT PARENTHESIS EXTENSION*/
-    0x239d, /* U+00239d: LEFT PARENTHESIS LOWER HOOK*/
-    0x239e, /* U+00239e: RIGHT PARENTHESIS UPPER HOOK*/
-    0x239f, /* U+00239f: RIGHT PARENTHESIS EXTENSION*/
-    0x23a0, /* U+0023a0: RIGHT PARENTHESIS LOWER HOOK*/
-    0x23a1, /* U+0023a1: LEFT SQUARE BRACKET UPPER CORNER*/
-    0x23a2, /* U+0023a2: LEFT SQUARE BRACKET EXTENSION*/
-    0x23a3, /* U+0023a3: LEFT SQUARE BRACKET LOWER CORNER*/
-    0x23a4, /* U+0023a4: RIGHT SQUARE BRACKET UPPER CORNER*/
-    0x23a5, /* U+0023a5: RIGHT SQUARE BRACKET EXTENSION*/
-    0x23a6, /* U+0023a6: RIGHT SQUARE BRACKET LOWER CORNER*/
-    0x23a7, /* U+0023a7: LEFT CURLY BRACKET UPPER HOOK*/
-    0x23a8, /* U+0023a8: LEFT CURLY BRACKET MIDDLE PIECE*/
-    0x23a9, /* U+0023a9: LEFT CURLY BRACKET LOWER HOOK*/
-    0x23aa, /* U+0023aa: CURLY BRACKET EXTENSION*/
-    0x23ab, /* U+0023ab: RIGHT CURLY BRACKET UPPER HOOK*/
-    0x23ac, /* U+0023ac: RIGHT CURLY BRACKET MIDDLE PIECE*/
-    0x23ad, /* U+0023ad: RIGHT CURLY BRACKET LOWER HOOK*/
-    0x23ae, /* U+0023ae: INTEGRAL EXTENSION*/
-    0x23af, /* U+0023af: HORIZONTAL LINE EXTENSION*/
-    0x23b0, /* U+0023b0: UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION*/
-    0x23b1, /* U+0023b1: UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION*/
-    0x23b2, /* U+0023b2: SUMMATION TOP*/
-    0x23b3, /* U+0023b3: SUMMATION BOTTOM*/
-    0x23b4, /* U+0023b4: TOP SQUARE BRACKET*/
-    0x23b5, /* U+0023b5: BOTTOM SQUARE BRACKET*/
-    0x23b6, /* U+0023b6: BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET*/
-    0x23b7, /* U+0023b7: RADICAL SYMBOL BOTTOM*/
-    0x23b8, /* U+0023b8: LEFT VERTICAL BOX LINE*/
-    0x23b9, /* U+0023b9: RIGHT VERTICAL BOX LINE*/
-    0x23ba, /* U+0023ba: HORIZONTAL SCAN LINE-1*/
-    0x23bb, /* U+0023bb: HORIZONTAL SCAN LINE-3*/
-    0x23bc, /* U+0023bc: HORIZONTAL SCAN LINE-7*/
-    0x23bd, /* U+0023bd: HORIZONTAL SCAN LINE-9*/
-    0x23be, /* U+0023be: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT*/
-    0x23bf, /* U+0023bf: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT*/
-    0x23c0, /* U+0023c0: DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE*/
-    0x23c1, /* U+0023c1: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE*/
-    0x23c2, /* U+0023c2: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE*/
-    0x23c3, /* U+0023c3: DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE*/
-    0x23c4, /* U+0023c4: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE*/
-    0x23c5, /* U+0023c5: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE*/
-    0x23c6, /* U+0023c6: DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE*/
-    0x23c7, /* U+0023c7: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE*/
-    0x23c8, /* U+0023c8: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE*/
-    0x23c9, /* U+0023c9: DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL*/
-    0x23ca, /* U+0023ca: DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL*/
-    0x23cb, /* U+0023cb: DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT*/
-    0x23cc, /* U+0023cc: DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT*/
-    0x23cd, /* U+0023cd: SQUARE FOOT*/
-    0x23ce, /* U+0023ce: RETURN SYMBOL*/
-    0x23cf, /* U+0023cf: EJECT SYMBOL*/
-    0x23d0, /* U+0023d0: VERTICAL LINE EXTENSION*/
-    0x23d1, /* U+0023d1: METRICAL BREVE*/
-    0x23d2, /* U+0023d2: METRICAL LONG OVER SHORT*/
-    0x23d3, /* U+0023d3: METRICAL SHORT OVER LONG*/
-    0x23d4, /* U+0023d4: METRICAL LONG OVER TWO SHORTS*/
-    0x23d5, /* U+0023d5: METRICAL TWO SHORTS OVER LONG*/
-    0x23d6, /* U+0023d6: METRICAL TWO SHORTS JOINED*/
-    0x23d7, /* U+0023d7: METRICAL TRISEME*/
-    0x23d8, /* U+0023d8: METRICAL TETRASEME*/
-    0x23d9, /* U+0023d9: METRICAL PENTASEME*/
-    0x23da, /* U+0023da: EARTH GROUND*/
-    0x23db, /* U+0023db: FUSE*/
-    0x23dc, /* U+0023dc: */
-    0x23dd, /* U+0023dd: */
-    0x23de, /* U+0023de: */
-    0x23df, /* U+0023df: */
-    0x23e0, /* U+0023e0: */
-    0x23e1, /* U+0023e1: */
-    0x23e2, /* U+0023e2: */
-    0x23e3, /* U+0023e3: */
-    0x23e4, /* U+0023e4: */
-    0x23e5, /* U+0023e5: */
-    0x23e6, /* U+0023e6: */
-    0x23e7, /* U+0023e7: */
-    0x23e8, /* U+0023e8: */
-    0x23e9, /* U+0023e9: */
-    0x23ea, /* U+0023ea: */
-    0x23eb, /* U+0023eb: */
-    0x23ec, /* U+0023ec: */
-    0x23ed, /* U+0023ed: */
-    0x23ee, /* U+0023ee: */
-    0x23ef, /* U+0023ef: */
-    0x23f0, /* U+0023f0: */
-    0x23f1, /* U+0023f1: */
-    0x23f2, /* U+0023f2: */
-    0x23f3, /* U+0023f3: */
-    0x23f4, /* U+0023f4: */
-    0x23f5, /* U+0023f5: */
-    0x23f6, /* U+0023f6: */
-    0x23f7, /* U+0023f7: */
-    0x23f8, /* U+0023f8: */
-    0x23f9, /* U+0023f9: */
-    0x23fa, /* U+0023fa: */
-    0x23fb, /* U+0023fb: */
-    0x23fc, /* U+0023fc: */
-    0x23fd, /* U+0023fd: */
-    0x23fe, /* U+0023fe: */
-    0x23ff, /* U+0023ff: */
-    0x2400, /* U+002400: SYMBOL FOR NULL*/
-    0x2401, /* U+002401: SYMBOL FOR START OF HEADING*/
-    0x2402, /* U+002402: SYMBOL FOR START OF TEXT*/
-    0x2403, /* U+002403: SYMBOL FOR END OF TEXT*/
-    0x2404, /* U+002404: SYMBOL FOR END OF TRANSMISSION*/
-    0x2405, /* U+002405: SYMBOL FOR ENQUIRY*/
-    0x2406, /* U+002406: SYMBOL FOR ACKNOWLEDGE*/
-    0x2407, /* U+002407: SYMBOL FOR BELL*/
-    0x2408, /* U+002408: SYMBOL FOR BACKSPACE*/
-    0x2409, /* U+002409: SYMBOL FOR HORIZONTAL TABULATION*/
-    0x240a, /* U+00240a: SYMBOL FOR LINE FEED*/
-    0x240b, /* U+00240b: SYMBOL FOR VERTICAL TABULATION*/
-    0x240c, /* U+00240c: SYMBOL FOR FORM FEED*/
-    0x240d, /* U+00240d: SYMBOL FOR CARRIAGE RETURN*/
-    0x240e, /* U+00240e: SYMBOL FOR SHIFT OUT*/
-    0x240f, /* U+00240f: SYMBOL FOR SHIFT IN*/
-    0x2410, /* U+002410: SYMBOL FOR DATA LINK ESCAPE*/
-    0x2411, /* U+002411: SYMBOL FOR DEVICE CONTROL ONE*/
-    0x2412, /* U+002412: SYMBOL FOR DEVICE CONTROL TWO*/
-    0x2413, /* U+002413: SYMBOL FOR DEVICE CONTROL THREE*/
-    0x2414, /* U+002414: SYMBOL FOR DEVICE CONTROL FOUR*/
-    0x2415, /* U+002415: SYMBOL FOR NEGATIVE ACKNOWLEDGE*/
-    0x2416, /* U+002416: SYMBOL FOR SYNCHRONOUS IDLE*/
-    0x2417, /* U+002417: SYMBOL FOR END OF TRANSMISSION BLOCK*/
-    0x2418, /* U+002418: SYMBOL FOR CANCEL*/
-    0x2419, /* U+002419: SYMBOL FOR END OF MEDIUM*/
-    0x241a, /* U+00241a: SYMBOL FOR SUBSTITUTE*/
-    0x241b, /* U+00241b: SYMBOL FOR ESCAPE*/
-    0x241c, /* U+00241c: SYMBOL FOR FILE SEPARATOR*/
-    0x241d, /* U+00241d: SYMBOL FOR GROUP SEPARATOR*/
-    0x241e, /* U+00241e: SYMBOL FOR RECORD SEPARATOR*/
-    0x241f, /* U+00241f: SYMBOL FOR UNIT SEPARATOR*/
-    0x2420, /* U+002420: SYMBOL FOR SPACE*/
-    0x2421, /* U+002421: SYMBOL FOR DELETE*/
-    0x2422, /* U+002422: BLANK SYMBOL*/
-    0x2423, /* U+002423: OPEN BOX*/
-    0x2424, /* U+002424: SYMBOL FOR NEWLINE*/
-    0x2425, /* U+002425: SYMBOL FOR DELETE FORM TWO*/
-    0x2426, /* U+002426: SYMBOL FOR SUBSTITUTE FORM TWO*/
-    0x2427, /* U+002427: */
-    0x2428, /* U+002428: */
-    0x2429, /* U+002429: */
-    0x242a, /* U+00242a: */
-    0x242b, /* U+00242b: */
-    0x242c, /* U+00242c: */
-    0x242d, /* U+00242d: */
-    0x242e, /* U+00242e: */
-    0x242f, /* U+00242f: */
-    0x2430, /* U+002430: */
-    0x2431, /* U+002431: */
-    0x2432, /* U+002432: */
-    0x2433, /* U+002433: */
-    0x2434, /* U+002434: */
-    0x2435, /* U+002435: */
-    0x2436, /* U+002436: */
-    0x2437, /* U+002437: */
-    0x2438, /* U+002438: */
-    0x2439, /* U+002439: */
-    0x243a, /* U+00243a: */
-    0x243b, /* U+00243b: */
-    0x243c, /* U+00243c: */
-    0x243d, /* U+00243d: */
-    0x243e, /* U+00243e: */
-    0x243f, /* U+00243f: */
-    0x2440, /* U+002440: OCR HOOK*/
-    0x2441, /* U+002441: OCR CHAIR*/
-    0x2442, /* U+002442: OCR FORK*/
-    0x2443, /* U+002443: OCR INVERTED FORK*/
-    0x2444, /* U+002444: OCR BELT BUCKLE*/
-    0x2445, /* U+002445: OCR BOW TIE*/
-    0x2446, /* U+002446: OCR BRANCH BANK IDENTIFICATION*/
-    0x2447, /* U+002447: OCR AMOUNT OF CHECK*/
-    0x2448, /* U+002448: OCR DASH*/
-    0x2449, /* U+002449: OCR CUSTOMER ACCOUNT NUMBER*/
-    0x244a, /* U+00244a: OCR DOUBLE BACKSLASH*/
-    0x244b, /* U+00244b: */
-    0x244c, /* U+00244c: */
-    0x244d, /* U+00244d: */
-    0x244e, /* U+00244e: */
-    0x244f, /* U+00244f: */
-    0x2450, /* U+002450: */
-    0x2451, /* U+002451: */
-    0x2452, /* U+002452: */
-    0x2453, /* U+002453: */
-    0x2454, /* U+002454: */
-    0x2455, /* U+002455: */
-    0x2456, /* U+002456: */
-    0x2457, /* U+002457: */
-    0x2458, /* U+002458: */
-    0x2459, /* U+002459: */
-    0x245a, /* U+00245a: */
-    0x245b, /* U+00245b: */
-    0x245c, /* U+00245c: */
-    0x245d, /* U+00245d: */
-    0x245e, /* U+00245e: */
-    0x245f, /* U+00245f: */
-    0x2460, /* U+002460: CIRCLED DIGIT ONE*/
-    0x2461, /* U+002461: CIRCLED DIGIT TWO*/
-    0x2462, /* U+002462: CIRCLED DIGIT THREE*/
-    0x2463, /* U+002463: CIRCLED DIGIT FOUR*/
-    0x2464, /* U+002464: CIRCLED DIGIT FIVE*/
-    0x2465, /* U+002465: CIRCLED DIGIT SIX*/
-    0x2466, /* U+002466: CIRCLED DIGIT SEVEN*/
-    0x2467, /* U+002467: CIRCLED DIGIT EIGHT*/
-    0x2468, /* U+002468: CIRCLED DIGIT NINE*/
-    0x2469, /* U+002469: CIRCLED NUMBER TEN*/
-    0x246a, /* U+00246a: CIRCLED NUMBER ELEVEN*/
-    0x246b, /* U+00246b: CIRCLED NUMBER TWELVE*/
-    0x246c, /* U+00246c: CIRCLED NUMBER THIRTEEN*/
-    0x246d, /* U+00246d: CIRCLED NUMBER FOURTEEN*/
-    0x246e, /* U+00246e: CIRCLED NUMBER FIFTEEN*/
-    0x246f, /* U+00246f: CIRCLED NUMBER SIXTEEN*/
-    0x2470, /* U+002470: CIRCLED NUMBER SEVENTEEN*/
-    0x2471, /* U+002471: CIRCLED NUMBER EIGHTEEN*/
-    0x2472, /* U+002472: CIRCLED NUMBER NINETEEN*/
-    0x2473, /* U+002473: CIRCLED NUMBER TWENTY*/
-    0x2474, /* U+002474: PARENTHESIZED DIGIT ONE*/
-    0x2475, /* U+002475: PARENTHESIZED DIGIT TWO*/
-    0x2476, /* U+002476: PARENTHESIZED DIGIT THREE*/
-    0x2477, /* U+002477: PARENTHESIZED DIGIT FOUR*/
-    0x2478, /* U+002478: PARENTHESIZED DIGIT FIVE*/
-    0x2479, /* U+002479: PARENTHESIZED DIGIT SIX*/
-    0x247a, /* U+00247a: PARENTHESIZED DIGIT SEVEN*/
-    0x247b, /* U+00247b: PARENTHESIZED DIGIT EIGHT*/
-    0x247c, /* U+00247c: PARENTHESIZED DIGIT NINE*/
-    0x247d, /* U+00247d: PARENTHESIZED NUMBER TEN*/
-    0x247e, /* U+00247e: PARENTHESIZED NUMBER ELEVEN*/
-    0x247f, /* U+00247f: PARENTHESIZED NUMBER TWELVE*/
-    0x2480, /* U+002480: PARENTHESIZED NUMBER THIRTEEN*/
-    0x2481, /* U+002481: PARENTHESIZED NUMBER FOURTEEN*/
-    0x2482, /* U+002482: PARENTHESIZED NUMBER FIFTEEN*/
-    0x2483, /* U+002483: PARENTHESIZED NUMBER SIXTEEN*/
-    0x2484, /* U+002484: PARENTHESIZED NUMBER SEVENTEEN*/
-    0x2485, /* U+002485: PARENTHESIZED NUMBER EIGHTEEN*/
-    0x2486, /* U+002486: PARENTHESIZED NUMBER NINETEEN*/
-    0x2487, /* U+002487: PARENTHESIZED NUMBER TWENTY*/
-    0x2488, /* U+002488: DIGIT ONE FULL STOP*/
-    0x2489, /* U+002489: DIGIT TWO FULL STOP*/
-    0x248a, /* U+00248a: DIGIT THREE FULL STOP*/
-    0x248b, /* U+00248b: DIGIT FOUR FULL STOP*/
-    0x248c, /* U+00248c: DIGIT FIVE FULL STOP*/
-    0x248d, /* U+00248d: DIGIT SIX FULL STOP*/
-    0x248e, /* U+00248e: DIGIT SEVEN FULL STOP*/
-    0x248f, /* U+00248f: DIGIT EIGHT FULL STOP*/
-    0x2490, /* U+002490: DIGIT NINE FULL STOP*/
-    0x2491, /* U+002491: NUMBER TEN FULL STOP*/
-    0x2492, /* U+002492: NUMBER ELEVEN FULL STOP*/
-    0x2493, /* U+002493: NUMBER TWELVE FULL STOP*/
-    0x2494, /* U+002494: NUMBER THIRTEEN FULL STOP*/
-    0x2495, /* U+002495: NUMBER FOURTEEN FULL STOP*/
-    0x2496, /* U+002496: NUMBER FIFTEEN FULL STOP*/
-    0x2497, /* U+002497: NUMBER SIXTEEN FULL STOP*/
-    0x2498, /* U+002498: NUMBER SEVENTEEN FULL STOP*/
-    0x2499, /* U+002499: NUMBER EIGHTEEN FULL STOP*/
-    0x249a, /* U+00249a: NUMBER NINETEEN FULL STOP*/
-    0x249b, /* U+00249b: NUMBER TWENTY FULL STOP*/
-    0x249c, /* U+00249c: PARENTHESIZED LATIN SMALL LETTER A*/
-    0x249d, /* U+00249d: PARENTHESIZED LATIN SMALL LETTER B*/
-    0x249e, /* U+00249e: PARENTHESIZED LATIN SMALL LETTER C*/
-    0x249f, /* U+00249f: PARENTHESIZED LATIN SMALL LETTER D*/
-    0x24a0, /* U+0024a0: PARENTHESIZED LATIN SMALL LETTER E*/
-    0x24a1, /* U+0024a1: PARENTHESIZED LATIN SMALL LETTER F*/
-    0x24a2, /* U+0024a2: PARENTHESIZED LATIN SMALL LETTER G*/
-    0x24a3, /* U+0024a3: PARENTHESIZED LATIN SMALL LETTER H*/
-    0x24a4, /* U+0024a4: PARENTHESIZED LATIN SMALL LETTER I*/
-    0x24a5, /* U+0024a5: PARENTHESIZED LATIN SMALL LETTER J*/
-    0x24a6, /* U+0024a6: PARENTHESIZED LATIN SMALL LETTER K*/
-    0x24a7, /* U+0024a7: PARENTHESIZED LATIN SMALL LETTER L*/
-    0x24a8, /* U+0024a8: PARENTHESIZED LATIN SMALL LETTER M*/
-    0x24a9, /* U+0024a9: PARENTHESIZED LATIN SMALL LETTER N*/
-    0x24aa, /* U+0024aa: PARENTHESIZED LATIN SMALL LETTER O*/
-    0x24ab, /* U+0024ab: PARENTHESIZED LATIN SMALL LETTER P*/
-    0x24ac, /* U+0024ac: PARENTHESIZED LATIN SMALL LETTER Q*/
-    0x24ad, /* U+0024ad: PARENTHESIZED LATIN SMALL LETTER R*/
-    0x24ae, /* U+0024ae: PARENTHESIZED LATIN SMALL LETTER S*/
-    0x24af, /* U+0024af: PARENTHESIZED LATIN SMALL LETTER T*/
-    0x24b0, /* U+0024b0: PARENTHESIZED LATIN SMALL LETTER U*/
-    0x24b1, /* U+0024b1: PARENTHESIZED LATIN SMALL LETTER V*/
-    0x24b2, /* U+0024b2: PARENTHESIZED LATIN SMALL LETTER W*/
-    0x24b3, /* U+0024b3: PARENTHESIZED LATIN SMALL LETTER X*/
-    0x24b4, /* U+0024b4: PARENTHESIZED LATIN SMALL LETTER Y*/
-    0x24b5, /* U+0024b5: PARENTHESIZED LATIN SMALL LETTER Z*/
-    0x24d0, /* U+0024b6: CIRCLED LATIN CAPITAL LETTER A*/
-    0x24d1, /* U+0024b7: CIRCLED LATIN CAPITAL LETTER B*/
-    0x24d2, /* U+0024b8: CIRCLED LATIN CAPITAL LETTER C*/
-    0x24d3, /* U+0024b9: CIRCLED LATIN CAPITAL LETTER D*/
-    0x24d4, /* U+0024ba: CIRCLED LATIN CAPITAL LETTER E*/
-    0x24d5, /* U+0024bb: CIRCLED LATIN CAPITAL LETTER F*/
-    0x24d6, /* U+0024bc: CIRCLED LATIN CAPITAL LETTER G*/
-    0x24d7, /* U+0024bd: CIRCLED LATIN CAPITAL LETTER H*/
-    0x24d8, /* U+0024be: CIRCLED LATIN CAPITAL LETTER I*/
-    0x24d9, /* U+0024bf: CIRCLED LATIN CAPITAL LETTER J*/
-    0x24da, /* U+0024c0: CIRCLED LATIN CAPITAL LETTER K*/
-    0x24db, /* U+0024c1: CIRCLED LATIN CAPITAL LETTER L*/
-    0x24dc, /* U+0024c2: CIRCLED LATIN CAPITAL LETTER M*/
-    0x24dd, /* U+0024c3: CIRCLED LATIN CAPITAL LETTER N*/
-    0x24de, /* U+0024c4: CIRCLED LATIN CAPITAL LETTER O*/
-    0x24df, /* U+0024c5: CIRCLED LATIN CAPITAL LETTER P*/
-    0x24e0, /* U+0024c6: CIRCLED LATIN CAPITAL LETTER Q*/
-    0x24e1, /* U+0024c7: CIRCLED LATIN CAPITAL LETTER R*/
-    0x24e2, /* U+0024c8: CIRCLED LATIN CAPITAL LETTER S*/
-    0x24e3, /* U+0024c9: CIRCLED LATIN CAPITAL LETTER T*/
-    0x24e4, /* U+0024ca: CIRCLED LATIN CAPITAL LETTER U*/
-    0x24e5, /* U+0024cb: CIRCLED LATIN CAPITAL LETTER V*/
-    0x24e6, /* U+0024cc: CIRCLED LATIN CAPITAL LETTER W*/
-    0x24e7, /* U+0024cd: CIRCLED LATIN CAPITAL LETTER X*/
-    0x24e8, /* U+0024ce: CIRCLED LATIN CAPITAL LETTER Y*/
-    0x24e9, /* U+0024cf: CIRCLED LATIN CAPITAL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniLower0x002c00[] =
-{
-    0x2c30, /* U+002c00: GLAGOLITIC CAPITAL LETTER AZU*/
-    0x2c31, /* U+002c01: GLAGOLITIC CAPITAL LETTER BUKY*/
-    0x2c32, /* U+002c02: GLAGOLITIC CAPITAL LETTER VEDE*/
-    0x2c33, /* U+002c03: GLAGOLITIC CAPITAL LETTER GLAGOLI*/
-    0x2c34, /* U+002c04: GLAGOLITIC CAPITAL LETTER DOBRO*/
-    0x2c35, /* U+002c05: GLAGOLITIC CAPITAL LETTER YESTU*/
-    0x2c36, /* U+002c06: GLAGOLITIC CAPITAL LETTER ZHIVETE*/
-    0x2c37, /* U+002c07: GLAGOLITIC CAPITAL LETTER DZELO*/
-    0x2c38, /* U+002c08: GLAGOLITIC CAPITAL LETTER ZEMLJA*/
-    0x2c39, /* U+002c09: GLAGOLITIC CAPITAL LETTER IZHE*/
-    0x2c3a, /* U+002c0a: GLAGOLITIC CAPITAL LETTER INITIAL IZHE*/
-    0x2c3b, /* U+002c0b: GLAGOLITIC CAPITAL LETTER I*/
-    0x2c3c, /* U+002c0c: GLAGOLITIC CAPITAL LETTER DJERVI*/
-    0x2c3d, /* U+002c0d: GLAGOLITIC CAPITAL LETTER KAKO*/
-    0x2c3e, /* U+002c0e: GLAGOLITIC CAPITAL LETTER LJUDIJE*/
-    0x2c3f, /* U+002c0f: GLAGOLITIC CAPITAL LETTER MYSLITE*/
-    0x2c40, /* U+002c10: GLAGOLITIC CAPITAL LETTER NASHI*/
-    0x2c41, /* U+002c11: GLAGOLITIC CAPITAL LETTER ONU*/
-    0x2c42, /* U+002c12: GLAGOLITIC CAPITAL LETTER POKOJI*/
-    0x2c43, /* U+002c13: GLAGOLITIC CAPITAL LETTER RITSI*/
-    0x2c44, /* U+002c14: GLAGOLITIC CAPITAL LETTER SLOVO*/
-    0x2c45, /* U+002c15: GLAGOLITIC CAPITAL LETTER TVRIDO*/
-    0x2c46, /* U+002c16: GLAGOLITIC CAPITAL LETTER UKU*/
-    0x2c47, /* U+002c17: GLAGOLITIC CAPITAL LETTER FRITU*/
-    0x2c48, /* U+002c18: GLAGOLITIC CAPITAL LETTER HERU*/
-    0x2c49, /* U+002c19: GLAGOLITIC CAPITAL LETTER OTU*/
-    0x2c4a, /* U+002c1a: GLAGOLITIC CAPITAL LETTER PE*/
-    0x2c4b, /* U+002c1b: GLAGOLITIC CAPITAL LETTER SHTA*/
-    0x2c4c, /* U+002c1c: GLAGOLITIC CAPITAL LETTER TSI*/
-    0x2c4d, /* U+002c1d: GLAGOLITIC CAPITAL LETTER CHRIVI*/
-    0x2c4e, /* U+002c1e: GLAGOLITIC CAPITAL LETTER SHA*/
-    0x2c4f, /* U+002c1f: GLAGOLITIC CAPITAL LETTER YERU*/
-    0x2c50, /* U+002c20: GLAGOLITIC CAPITAL LETTER YERI*/
-    0x2c51, /* U+002c21: GLAGOLITIC CAPITAL LETTER YATI*/
-    0x2c52, /* U+002c22: GLAGOLITIC CAPITAL LETTER SPIDERY HA*/
-    0x2c53, /* U+002c23: GLAGOLITIC CAPITAL LETTER YU*/
-    0x2c54, /* U+002c24: GLAGOLITIC CAPITAL LETTER SMALL YUS*/
-    0x2c55, /* U+002c25: GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL*/
-    0x2c56, /* U+002c26: GLAGOLITIC CAPITAL LETTER YO*/
-    0x2c57, /* U+002c27: GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS*/
-    0x2c58, /* U+002c28: GLAGOLITIC CAPITAL LETTER BIG YUS*/
-    0x2c59, /* U+002c29: GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS*/
-    0x2c5a, /* U+002c2a: GLAGOLITIC CAPITAL LETTER FITA*/
-    0x2c5b, /* U+002c2b: GLAGOLITIC CAPITAL LETTER IZHITSA*/
-    0x2c5c, /* U+002c2c: GLAGOLITIC CAPITAL LETTER SHTAPIC*/
-    0x2c5d, /* U+002c2d: GLAGOLITIC CAPITAL LETTER TROKUTASTI A*/
-    0x2c5e, /* U+002c2e: GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE*/
-    0x2c2f, /* U+002c2f: */
-    0x2c30, /* U+002c30: GLAGOLITIC SMALL LETTER AZU*/
-    0x2c31, /* U+002c31: GLAGOLITIC SMALL LETTER BUKY*/
-    0x2c32, /* U+002c32: GLAGOLITIC SMALL LETTER VEDE*/
-    0x2c33, /* U+002c33: GLAGOLITIC SMALL LETTER GLAGOLI*/
-    0x2c34, /* U+002c34: GLAGOLITIC SMALL LETTER DOBRO*/
-    0x2c35, /* U+002c35: GLAGOLITIC SMALL LETTER YESTU*/
-    0x2c36, /* U+002c36: GLAGOLITIC SMALL LETTER ZHIVETE*/
-    0x2c37, /* U+002c37: GLAGOLITIC SMALL LETTER DZELO*/
-    0x2c38, /* U+002c38: GLAGOLITIC SMALL LETTER ZEMLJA*/
-    0x2c39, /* U+002c39: GLAGOLITIC SMALL LETTER IZHE*/
-    0x2c3a, /* U+002c3a: GLAGOLITIC SMALL LETTER INITIAL IZHE*/
-    0x2c3b, /* U+002c3b: GLAGOLITIC SMALL LETTER I*/
-    0x2c3c, /* U+002c3c: GLAGOLITIC SMALL LETTER DJERVI*/
-    0x2c3d, /* U+002c3d: GLAGOLITIC SMALL LETTER KAKO*/
-    0x2c3e, /* U+002c3e: GLAGOLITIC SMALL LETTER LJUDIJE*/
-    0x2c3f, /* U+002c3f: GLAGOLITIC SMALL LETTER MYSLITE*/
-    0x2c40, /* U+002c40: GLAGOLITIC SMALL LETTER NASHI*/
-    0x2c41, /* U+002c41: GLAGOLITIC SMALL LETTER ONU*/
-    0x2c42, /* U+002c42: GLAGOLITIC SMALL LETTER POKOJI*/
-    0x2c43, /* U+002c43: GLAGOLITIC SMALL LETTER RITSI*/
-    0x2c44, /* U+002c44: GLAGOLITIC SMALL LETTER SLOVO*/
-    0x2c45, /* U+002c45: GLAGOLITIC SMALL LETTER TVRIDO*/
-    0x2c46, /* U+002c46: GLAGOLITIC SMALL LETTER UKU*/
-    0x2c47, /* U+002c47: GLAGOLITIC SMALL LETTER FRITU*/
-    0x2c48, /* U+002c48: GLAGOLITIC SMALL LETTER HERU*/
-    0x2c49, /* U+002c49: GLAGOLITIC SMALL LETTER OTU*/
-    0x2c4a, /* U+002c4a: GLAGOLITIC SMALL LETTER PE*/
-    0x2c4b, /* U+002c4b: GLAGOLITIC SMALL LETTER SHTA*/
-    0x2c4c, /* U+002c4c: GLAGOLITIC SMALL LETTER TSI*/
-    0x2c4d, /* U+002c4d: GLAGOLITIC SMALL LETTER CHRIVI*/
-    0x2c4e, /* U+002c4e: GLAGOLITIC SMALL LETTER SHA*/
-    0x2c4f, /* U+002c4f: GLAGOLITIC SMALL LETTER YERU*/
-    0x2c50, /* U+002c50: GLAGOLITIC SMALL LETTER YERI*/
-    0x2c51, /* U+002c51: GLAGOLITIC SMALL LETTER YATI*/
-    0x2c52, /* U+002c52: GLAGOLITIC SMALL LETTER SPIDERY HA*/
-    0x2c53, /* U+002c53: GLAGOLITIC SMALL LETTER YU*/
-    0x2c54, /* U+002c54: GLAGOLITIC SMALL LETTER SMALL YUS*/
-    0x2c55, /* U+002c55: GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL*/
-    0x2c56, /* U+002c56: GLAGOLITIC SMALL LETTER YO*/
-    0x2c57, /* U+002c57: GLAGOLITIC SMALL LETTER IOTATED SMALL YUS*/
-    0x2c58, /* U+002c58: GLAGOLITIC SMALL LETTER BIG YUS*/
-    0x2c59, /* U+002c59: GLAGOLITIC SMALL LETTER IOTATED BIG YUS*/
-    0x2c5a, /* U+002c5a: GLAGOLITIC SMALL LETTER FITA*/
-    0x2c5b, /* U+002c5b: GLAGOLITIC SMALL LETTER IZHITSA*/
-    0x2c5c, /* U+002c5c: GLAGOLITIC SMALL LETTER SHTAPIC*/
-    0x2c5d, /* U+002c5d: GLAGOLITIC SMALL LETTER TROKUTASTI A*/
-    0x2c5e, /* U+002c5e: GLAGOLITIC SMALL LETTER LATINATE MYSLITE*/
-    0x2c5f, /* U+002c5f: */
-    0x2c60, /* U+002c60: */
-    0x2c61, /* U+002c61: */
-    0x2c62, /* U+002c62: */
-    0x2c63, /* U+002c63: */
-    0x2c64, /* U+002c64: */
-    0x2c65, /* U+002c65: */
-    0x2c66, /* U+002c66: */
-    0x2c67, /* U+002c67: */
-    0x2c68, /* U+002c68: */
-    0x2c69, /* U+002c69: */
-    0x2c6a, /* U+002c6a: */
-    0x2c6b, /* U+002c6b: */
-    0x2c6c, /* U+002c6c: */
-    0x2c6d, /* U+002c6d: */
-    0x2c6e, /* U+002c6e: */
-    0x2c6f, /* U+002c6f: */
-    0x2c70, /* U+002c70: */
-    0x2c71, /* U+002c71: */
-    0x2c72, /* U+002c72: */
-    0x2c73, /* U+002c73: */
-    0x2c74, /* U+002c74: */
-    0x2c75, /* U+002c75: */
-    0x2c76, /* U+002c76: */
-    0x2c77, /* U+002c77: */
-    0x2c78, /* U+002c78: */
-    0x2c79, /* U+002c79: */
-    0x2c7a, /* U+002c7a: */
-    0x2c7b, /* U+002c7b: */
-    0x2c7c, /* U+002c7c: */
-    0x2c7d, /* U+002c7d: */
-    0x2c7e, /* U+002c7e: */
-    0x2c7f, /* U+002c7f: */
-    0x2c81, /* U+002c80: COPTIC CAPITAL LETTER ALFA*/
-    0x2c81, /* U+002c81: COPTIC SMALL LETTER ALFA*/
-    0x2c83, /* U+002c82: COPTIC CAPITAL LETTER VIDA*/
-    0x2c83, /* U+002c83: COPTIC SMALL LETTER VIDA*/
-    0x2c85, /* U+002c84: COPTIC CAPITAL LETTER GAMMA*/
-    0x2c85, /* U+002c85: COPTIC SMALL LETTER GAMMA*/
-    0x2c87, /* U+002c86: COPTIC CAPITAL LETTER DALDA*/
-    0x2c87, /* U+002c87: COPTIC SMALL LETTER DALDA*/
-    0x2c89, /* U+002c88: COPTIC CAPITAL LETTER EIE*/
-    0x2c89, /* U+002c89: COPTIC SMALL LETTER EIE*/
-    0x2c8b, /* U+002c8a: COPTIC CAPITAL LETTER SOU*/
-    0x2c8b, /* U+002c8b: COPTIC SMALL LETTER SOU*/
-    0x2c8d, /* U+002c8c: COPTIC CAPITAL LETTER ZATA*/
-    0x2c8d, /* U+002c8d: COPTIC SMALL LETTER ZATA*/
-    0x2c8f, /* U+002c8e: COPTIC CAPITAL LETTER HATE*/
-    0x2c8f, /* U+002c8f: COPTIC SMALL LETTER HATE*/
-    0x2c91, /* U+002c90: COPTIC CAPITAL LETTER THETHE*/
-    0x2c91, /* U+002c91: COPTIC SMALL LETTER THETHE*/
-    0x2c93, /* U+002c92: COPTIC CAPITAL LETTER IAUDA*/
-    0x2c93, /* U+002c93: COPTIC SMALL LETTER IAUDA*/
-    0x2c95, /* U+002c94: COPTIC CAPITAL LETTER KAPA*/
-    0x2c95, /* U+002c95: COPTIC SMALL LETTER KAPA*/
-    0x2c97, /* U+002c96: COPTIC CAPITAL LETTER LAULA*/
-    0x2c97, /* U+002c97: COPTIC SMALL LETTER LAULA*/
-    0x2c99, /* U+002c98: COPTIC CAPITAL LETTER MI*/
-    0x2c99, /* U+002c99: COPTIC SMALL LETTER MI*/
-    0x2c9b, /* U+002c9a: COPTIC CAPITAL LETTER NI*/
-    0x2c9b, /* U+002c9b: COPTIC SMALL LETTER NI*/
-    0x2c9d, /* U+002c9c: COPTIC CAPITAL LETTER KSI*/
-    0x2c9d, /* U+002c9d: COPTIC SMALL LETTER KSI*/
-    0x2c9f, /* U+002c9e: COPTIC CAPITAL LETTER O*/
-    0x2c9f, /* U+002c9f: COPTIC SMALL LETTER O*/
-    0x2ca1, /* U+002ca0: COPTIC CAPITAL LETTER PI*/
-    0x2ca1, /* U+002ca1: COPTIC SMALL LETTER PI*/
-    0x2ca3, /* U+002ca2: COPTIC CAPITAL LETTER RO*/
-    0x2ca3, /* U+002ca3: COPTIC SMALL LETTER RO*/
-    0x2ca5, /* U+002ca4: COPTIC CAPITAL LETTER SIMA*/
-    0x2ca5, /* U+002ca5: COPTIC SMALL LETTER SIMA*/
-    0x2ca7, /* U+002ca6: COPTIC CAPITAL LETTER TAU*/
-    0x2ca7, /* U+002ca7: COPTIC SMALL LETTER TAU*/
-    0x2ca9, /* U+002ca8: COPTIC CAPITAL LETTER UA*/
-    0x2ca9, /* U+002ca9: COPTIC SMALL LETTER UA*/
-    0x2cab, /* U+002caa: COPTIC CAPITAL LETTER FI*/
-    0x2cab, /* U+002cab: COPTIC SMALL LETTER FI*/
-    0x2cad, /* U+002cac: COPTIC CAPITAL LETTER KHI*/
-    0x2cad, /* U+002cad: COPTIC SMALL LETTER KHI*/
-    0x2caf, /* U+002cae: COPTIC CAPITAL LETTER PSI*/
-    0x2caf, /* U+002caf: COPTIC SMALL LETTER PSI*/
-    0x2cb1, /* U+002cb0: COPTIC CAPITAL LETTER OOU*/
-    0x2cb1, /* U+002cb1: COPTIC SMALL LETTER OOU*/
-    0x2cb3, /* U+002cb2: COPTIC CAPITAL LETTER DIALECT-P ALEF*/
-    0x2cb3, /* U+002cb3: COPTIC SMALL LETTER DIALECT-P ALEF*/
-    0x2cb5, /* U+002cb4: COPTIC CAPITAL LETTER OLD COPTIC AIN*/
-    0x2cb5, /* U+002cb5: COPTIC SMALL LETTER OLD COPTIC AIN*/
-    0x2cb7, /* U+002cb6: COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE*/
-    0x2cb7, /* U+002cb7: COPTIC SMALL LETTER CRYPTOGRAMMIC EIE*/
-    0x2cb9, /* U+002cb8: COPTIC CAPITAL LETTER DIALECT-P KAPA*/
-    0x2cb9, /* U+002cb9: COPTIC SMALL LETTER DIALECT-P KAPA*/
-    0x2cbb, /* U+002cba: COPTIC CAPITAL LETTER DIALECT-P NI*/
-    0x2cbb, /* U+002cbb: COPTIC SMALL LETTER DIALECT-P NI*/
-    0x2cbd, /* U+002cbc: COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI*/
-    0x2cbd, /* U+002cbd: COPTIC SMALL LETTER CRYPTOGRAMMIC NI*/
-    0x2cbf, /* U+002cbe: COPTIC CAPITAL LETTER OLD COPTIC OOU*/
-    0x2cbf, /* U+002cbf: COPTIC SMALL LETTER OLD COPTIC OOU*/
-    0x2cc1, /* U+002cc0: COPTIC CAPITAL LETTER SAMPI*/
-    0x2cc1, /* U+002cc1: COPTIC SMALL LETTER SAMPI*/
-    0x2cc3, /* U+002cc2: COPTIC CAPITAL LETTER CROSSED SHEI*/
-    0x2cc3, /* U+002cc3: COPTIC SMALL LETTER CROSSED SHEI*/
-    0x2cc5, /* U+002cc4: COPTIC CAPITAL LETTER OLD COPTIC SHEI*/
-    0x2cc5, /* U+002cc5: COPTIC SMALL LETTER OLD COPTIC SHEI*/
-    0x2cc7, /* U+002cc6: COPTIC CAPITAL LETTER OLD COPTIC ESH*/
-    0x2cc7, /* U+002cc7: COPTIC SMALL LETTER OLD COPTIC ESH*/
-    0x2cc9, /* U+002cc8: COPTIC CAPITAL LETTER AKHMIMIC KHEI*/
-    0x2cc9, /* U+002cc9: COPTIC SMALL LETTER AKHMIMIC KHEI*/
-    0x2ccb, /* U+002cca: COPTIC CAPITAL LETTER DIALECT-P HORI*/
-    0x2ccb, /* U+002ccb: COPTIC SMALL LETTER DIALECT-P HORI*/
-    0x2ccd, /* U+002ccc: COPTIC CAPITAL LETTER OLD COPTIC HORI*/
-    0x2ccd, /* U+002ccd: COPTIC SMALL LETTER OLD COPTIC HORI*/
-    0x2ccf, /* U+002cce: COPTIC CAPITAL LETTER OLD COPTIC HA*/
-    0x2ccf, /* U+002ccf: COPTIC SMALL LETTER OLD COPTIC HA*/
-    0x2cd1, /* U+002cd0: COPTIC CAPITAL LETTER L-SHAPED HA*/
-    0x2cd1, /* U+002cd1: COPTIC SMALL LETTER L-SHAPED HA*/
-    0x2cd3, /* U+002cd2: COPTIC CAPITAL LETTER OLD COPTIC HEI*/
-    0x2cd3, /* U+002cd3: COPTIC SMALL LETTER OLD COPTIC HEI*/
-    0x2cd5, /* U+002cd4: COPTIC CAPITAL LETTER OLD COPTIC HAT*/
-    0x2cd5, /* U+002cd5: COPTIC SMALL LETTER OLD COPTIC HAT*/
-    0x2cd7, /* U+002cd6: COPTIC CAPITAL LETTER OLD COPTIC GANGIA*/
-    0x2cd7, /* U+002cd7: COPTIC SMALL LETTER OLD COPTIC GANGIA*/
-    0x2cd9, /* U+002cd8: COPTIC CAPITAL LETTER OLD COPTIC DJA*/
-    0x2cd9, /* U+002cd9: COPTIC SMALL LETTER OLD COPTIC DJA*/
-    0x2cdb, /* U+002cda: COPTIC CAPITAL LETTER OLD COPTIC SHIMA*/
-    0x2cdb, /* U+002cdb: COPTIC SMALL LETTER OLD COPTIC SHIMA*/
-    0x2cdd, /* U+002cdc: COPTIC CAPITAL LETTER OLD NUBIAN SHIMA*/
-    0x2cdd, /* U+002cdd: COPTIC SMALL LETTER OLD NUBIAN SHIMA*/
-    0x2cdf, /* U+002cde: COPTIC CAPITAL LETTER OLD NUBIAN NGI*/
-    0x2cdf, /* U+002cdf: COPTIC SMALL LETTER OLD NUBIAN NGI*/
-    0x2ce1, /* U+002ce0: COPTIC CAPITAL LETTER OLD NUBIAN NYI*/
-    0x2ce1, /* U+002ce1: COPTIC SMALL LETTER OLD NUBIAN NYI*/
-    0x2ce3, /* U+002ce2: COPTIC CAPITAL LETTER OLD NUBIAN WAU*/
-};
-
-static const RTUNICP g_afRTUniLower0x00ff21[] =
-{
-    0xff41, /* U+00ff21: FULLWIDTH LATIN CAPITAL LETTER A*/
-    0xff42, /* U+00ff22: FULLWIDTH LATIN CAPITAL LETTER B*/
-    0xff43, /* U+00ff23: FULLWIDTH LATIN CAPITAL LETTER C*/
-    0xff44, /* U+00ff24: FULLWIDTH LATIN CAPITAL LETTER D*/
-    0xff45, /* U+00ff25: FULLWIDTH LATIN CAPITAL LETTER E*/
-    0xff46, /* U+00ff26: FULLWIDTH LATIN CAPITAL LETTER F*/
-    0xff47, /* U+00ff27: FULLWIDTH LATIN CAPITAL LETTER G*/
-    0xff48, /* U+00ff28: FULLWIDTH LATIN CAPITAL LETTER H*/
-    0xff49, /* U+00ff29: FULLWIDTH LATIN CAPITAL LETTER I*/
-    0xff4a, /* U+00ff2a: FULLWIDTH LATIN CAPITAL LETTER J*/
-    0xff4b, /* U+00ff2b: FULLWIDTH LATIN CAPITAL LETTER K*/
-    0xff4c, /* U+00ff2c: FULLWIDTH LATIN CAPITAL LETTER L*/
-    0xff4d, /* U+00ff2d: FULLWIDTH LATIN CAPITAL LETTER M*/
-    0xff4e, /* U+00ff2e: FULLWIDTH LATIN CAPITAL LETTER N*/
-    0xff4f, /* U+00ff2f: FULLWIDTH LATIN CAPITAL LETTER O*/
-    0xff50, /* U+00ff30: FULLWIDTH LATIN CAPITAL LETTER P*/
-    0xff51, /* U+00ff31: FULLWIDTH LATIN CAPITAL LETTER Q*/
-    0xff52, /* U+00ff32: FULLWIDTH LATIN CAPITAL LETTER R*/
-    0xff53, /* U+00ff33: FULLWIDTH LATIN CAPITAL LETTER S*/
-    0xff54, /* U+00ff34: FULLWIDTH LATIN CAPITAL LETTER T*/
-    0xff55, /* U+00ff35: FULLWIDTH LATIN CAPITAL LETTER U*/
-    0xff56, /* U+00ff36: FULLWIDTH LATIN CAPITAL LETTER V*/
-    0xff57, /* U+00ff37: FULLWIDTH LATIN CAPITAL LETTER W*/
-    0xff58, /* U+00ff38: FULLWIDTH LATIN CAPITAL LETTER X*/
-    0xff59, /* U+00ff39: FULLWIDTH LATIN CAPITAL LETTER Y*/
-    0xff5a, /* U+00ff3a: FULLWIDTH LATIN CAPITAL LETTER Z*/
-};
-
-static const RTUNICP g_afRTUniLower0x010400[] =
-{
-    0x10428, /* U+010400: DESERET CAPITAL LETTER LONG I*/
-    0x10429, /* U+010401: DESERET CAPITAL LETTER LONG E*/
-    0x1042a, /* U+010402: DESERET CAPITAL LETTER LONG A*/
-    0x1042b, /* U+010403: DESERET CAPITAL LETTER LONG AH*/
-    0x1042c, /* U+010404: DESERET CAPITAL LETTER LONG O*/
-    0x1042d, /* U+010405: DESERET CAPITAL LETTER LONG OO*/
-    0x1042e, /* U+010406: DESERET CAPITAL LETTER SHORT I*/
-    0x1042f, /* U+010407: DESERET CAPITAL LETTER SHORT E*/
-    0x10430, /* U+010408: DESERET CAPITAL LETTER SHORT A*/
-    0x10431, /* U+010409: DESERET CAPITAL LETTER SHORT AH*/
-    0x10432, /* U+01040a: DESERET CAPITAL LETTER SHORT O*/
-    0x10433, /* U+01040b: DESERET CAPITAL LETTER SHORT OO*/
-    0x10434, /* U+01040c: DESERET CAPITAL LETTER AY*/
-    0x10435, /* U+01040d: DESERET CAPITAL LETTER OW*/
-    0x10436, /* U+01040e: DESERET CAPITAL LETTER WU*/
-    0x10437, /* U+01040f: DESERET CAPITAL LETTER YEE*/
-    0x10438, /* U+010410: DESERET CAPITAL LETTER H*/
-    0x10439, /* U+010411: DESERET CAPITAL LETTER PEE*/
-    0x1043a, /* U+010412: DESERET CAPITAL LETTER BEE*/
-    0x1043b, /* U+010413: DESERET CAPITAL LETTER TEE*/
-    0x1043c, /* U+010414: DESERET CAPITAL LETTER DEE*/
-    0x1043d, /* U+010415: DESERET CAPITAL LETTER CHEE*/
-    0x1043e, /* U+010416: DESERET CAPITAL LETTER JEE*/
-    0x1043f, /* U+010417: DESERET CAPITAL LETTER KAY*/
-    0x10440, /* U+010418: DESERET CAPITAL LETTER GAY*/
-    0x10441, /* U+010419: DESERET CAPITAL LETTER EF*/
-    0x10442, /* U+01041a: DESERET CAPITAL LETTER VEE*/
-    0x10443, /* U+01041b: DESERET CAPITAL LETTER ETH*/
-    0x10444, /* U+01041c: DESERET CAPITAL LETTER THEE*/
-    0x10445, /* U+01041d: DESERET CAPITAL LETTER ES*/
-    0x10446, /* U+01041e: DESERET CAPITAL LETTER ZEE*/
-    0x10447, /* U+01041f: DESERET CAPITAL LETTER ESH*/
-    0x10448, /* U+010420: DESERET CAPITAL LETTER ZHEE*/
-    0x10449, /* U+010421: DESERET CAPITAL LETTER ER*/
-    0x1044a, /* U+010422: DESERET CAPITAL LETTER EL*/
-    0x1044b, /* U+010423: DESERET CAPITAL LETTER EM*/
-    0x1044c, /* U+010424: DESERET CAPITAL LETTER EN*/
-    0x1044d, /* U+010425: DESERET CAPITAL LETTER ENG*/
-    0x1044e, /* U+010426: DESERET CAPITAL LETTER OI*/
-    0x1044f, /* U+010427: DESERET CAPITAL LETTER EW*/
-};
-
-
-const RTUNICASERANGE g_aRTUniLowerRanges[] =
-{
-    { 0x000000, 0x000557, &g_afRTUniLower0x000000[0] },
-    { 0x0010a0, 0x0010c6, &g_afRTUniLower0x0010a0[0] },
-    { 0x001e00, 0x0024d0, &g_afRTUniLower0x001e00[0] },
-    { 0x002c00, 0x002ce3, &g_afRTUniLower0x002c00[0] },
-    { 0x00ff21, 0x00ff3b, &g_afRTUniLower0x00ff21[0] },
-    { 0x010400, 0x010428, &g_afRTUniLower0x010400[0] },
-    { ~(RTUNICP)0, ~(RTUNICP)0, NULL }
-};
-
diff --git a/src/VBox/Runtime/common/string/uniread.cpp b/src/VBox/Runtime/common/string/uniread.cpp
index 01ddd1c..cf63bea 100644
--- a/src/VBox/Runtime/common/string/uniread.cpp
+++ b/src/VBox/Runtime/common/string/uniread.cpp
@@ -34,17 +34,22 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+#else
+# include <unistd.h>
+#endif
 
 
 /*******************************************************************************
 *   Global Variables                                                           *
 *******************************************************************************/
-/** When set, no output is produced.  Very useful when debugging ths code. */
-static bool g_fQuiet = false;
 /** The file we're currently parsing. */
 static const char *g_pszCurFile;
 /** The current line number. */
 static unsigned g_iLine;
+/** The current output file. */
+static FILE *g_pCurOutFile;
 
 
 /**
@@ -883,6 +888,7 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
         AppendFlag(pszFlags, "RTUNI_LOWER");
     //if (pInfo->???)
     //    AppendFlag(pszFlags, "RTUNI_BSPACE");
+#if 0
     if (pInfo->fInvNFD_QC != 0 || pInfo->fInvNFC_QC != 0)
     {
         AppendFlag(pszFlags, "RTUNI_QC_NFX");
@@ -893,6 +899,7 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
     }
     else if (pInfo->paDecompositionMapping && !*pInfo->pszDecompositionType)
         fprintf(stderr, "uniread: U+%05X is not QC_NFX but has canonical mappings.\n", pInfo->CodePoint);
+#endif
 
     if (!*pszFlags)
     {
@@ -905,6 +912,43 @@ static bool CalcFlags(struct CPINFO *pInfo, char *pszFlags)
 
 
 /**
+ * Closes the primary output stream.
+ */
+static int Stream1Close(void)
+{
+    if (g_pCurOutFile && g_pCurOutFile != stdout && g_pCurOutFile != stderr)
+    {
+        if (fclose(g_pCurOutFile) != 0)
+        {
+            fprintf(stderr, "Error closing output file.\n");
+            return -1;
+        }
+    }
+    g_pCurOutFile = NULL;
+    return 0;
+}
+
+
+/**
+ * Initializes the 1st stream to output to a given file.
+ */
+static int Stream1Init(const char *pszName)
+{
+    int rc = Stream1Close();
+    if (!rc)
+    {
+        g_pCurOutFile = fopen(pszName, "w");
+        if (!g_pCurOutFile)
+        {
+            fprintf(stderr, "Error opening output file '%s'.\n", pszName);
+            rc = -1;
+        }
+    }
+    return rc;
+}
+
+
+/**
  * printf wrapper for the primary output stream.
  *
  * @returns See vfprintf.
@@ -916,10 +960,7 @@ static int Stream1Printf(const char *pszFormat, ...)
     int     cch;
     va_list va;
     va_start(va, pszFormat);
-    if (!g_fQuiet)
-        cch = vfprintf(stdout, pszFormat, va);
-    else
-        cch = (int)strlen(pszFormat);
+    cch = vfprintf(g_pCurOutFile, pszFormat, va);
     va_end(va);
     return cch;
 }
@@ -973,17 +1014,30 @@ static int Stream2Printf(const char *pszFormat, ...)
 /**
  * Print the unidata.cpp file header and include list.
  */
-int PrintHeader(const char *argv0)
+int PrintHeader(const char *argv0, const char *pszBaseDir)
 {
-    Stream1Printf("/** @file\n"
-                  " *\n"
+    char szBuf[1024];
+    if (!pszBaseDir)
+    {
+        memset(szBuf, 0, sizeof(szBuf));
+#ifdef _MSC_VER
+        _getcwd(szBuf, sizeof(szBuf));
+#else
+        getcwd(szBuf, sizeof(szBuf));
+#endif
+        pszBaseDir = szBuf;
+    }
+
+    Stream1Printf("/* $" "Id" "$ */\n"
+                  "/** @file\n"
                   " * IPRT - Unicode Tables.\n"
                   " *\n"
-                  " * Automatically Generated by %s (" __DATE__ " " __TIME__ ")\n"
+                  " * Automatically Generated from %s\n"
+                  " * by %s (" __DATE__ " " __TIME__ ")\n"
                   " */\n"
                   "\n"
                   "/*\n"
-                  " * Copyright (C) 2006-2010 Oracle Corporation\n"
+                  " * Copyright (C) 2006-2014 Oracle Corporation\n"
                   " *\n"
                   " * This file is part of VirtualBox Open Source Edition (OSE), as\n"
                   " * available from http://www.virtualbox.org. This file is free software;\n"
@@ -1005,7 +1059,7 @@ int PrintHeader(const char *argv0)
                   "\n"
                   "#include <iprt/uni.h>\n"
                   "\n",
-                  argv0);
+                  pszBaseDir, argv0);
     return 0;
 }
 
@@ -1019,7 +1073,7 @@ int PrintFlags(void)
      * Print flags table.
      */
     Stream2Init();
-    Stream2Printf("const RTUNIFLAGSRANGE g_aRTUniFlagsRanges[] =\n"
+    Stream2Printf("RT_DECL_DATA_CONST(const RTUNIFLAGSRANGE) g_aRTUniFlagsRanges[] =\n"
                   "{\n");
     RTUNICP i = 0;
     int iStart = -1;
@@ -1046,7 +1100,7 @@ int PrintFlags(void)
         {
             if (iStart < 0)
             {
-                Stream1Printf("static const uint8_t g_afRTUniFlags0x%06x[] = \n"
+                Stream1Printf("static const uint8_t g_afRTUniFlags0x%06x[] =\n"
                               "{\n", i);
                 iStart = i;
             }
@@ -1068,7 +1122,7 @@ int PrintFlags(void)
 static int PrintUpper(void)
 {
     Stream2Init();
-    Stream2Printf("const RTUNICASERANGE g_aRTUniUpperRanges[] =\n"
+    Stream2Printf("RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniUpperRanges[] =\n"
                   "{\n");
     RTUNICP i = 0;
     int iStart = -1;
@@ -1094,7 +1148,7 @@ static int PrintUpper(void)
         {
             if (iStart < 0)
             {
-                Stream1Printf("static const RTUNICP g_afRTUniUpper0x%06x[] = \n"
+                Stream1Printf("static const RTUNICP g_afRTUniUpper0x%06x[] =\n"
                               "{\n", i);
                 iStart = i;
             }
@@ -1115,7 +1169,7 @@ static int PrintUpper(void)
 static int PrintLower(void)
 {
     Stream2Init();
-    Stream2Printf("const RTUNICASERANGE g_aRTUniLowerRanges[] =\n"
+    Stream2Printf("RT_DECL_DATA_CONST(const RTUNICASERANGE) g_aRTUniLowerRanges[] =\n"
                   "{\n");
     RTUNICP i = 0;
     int iStart = -1;
@@ -1141,7 +1195,7 @@ static int PrintLower(void)
         {
             if (iStart < 0)
             {
-                Stream1Printf("static const RTUNICP g_afRTUniLower0x%06x[] = \n"
+                Stream1Printf("static const RTUNICP g_afRTUniLower0x%06x[] =\n"
                               "{\n", i);
                 iStart = i;
             }
@@ -1201,9 +1255,6 @@ int main(int argc, char **argv)
             argi++;
             pszBaseDir = argv[argi];
         }
-        else if (   !strcmp(argv[argi], "-q")
-                 || !strcmp(argv[argi], "--quiet"))
-            g_fQuiet = true;
         else
         {
             fprintf(stderr, "uniread: syntax error at '%s': Unknown argument\n", argv[argi]);
@@ -1231,24 +1282,29 @@ int main(int argc, char **argv)
         return rc;
 
     /*
-     * Print stuff.
+     * Produce output files.
      */
-    rc = PrintHeader(argv[0]);
-    if (rc)
-        return rc;
-    rc = PrintFlags();
-    if (rc)
-        return rc;
-    rc = PrintUpper();
-    if (rc)
-        return rc;
-    rc = PrintLower();
-    if (rc)
-        return rc;
+    rc = Stream1Init("unidata-flags.cpp");
+    if (!rc)
+        rc = PrintHeader(argv[0], pszBaseDir);
+    if (!rc)
+        rc = PrintFlags();
+
+    rc = Stream1Init("unidata-upper.cpp");
+    if (!rc)
+        rc = PrintHeader(argv[0], pszBaseDir);
+    if (!rc)
+        rc = PrintUpper();
+
+    rc = Stream1Init("unidata-lower.cpp");
+    if (!rc)
+        rc = PrintHeader(argv[0], pszBaseDir);
+    if (!rc)
+        rc = PrintLower();
+    if (!rc)
+        rc = Stream1Close();
 
     /* done */
-    fflush(stdout);
-
     return rc;
 }
 
diff --git a/src/VBox/Runtime/common/string/utf-16-case.cpp b/src/VBox/Runtime/common/string/utf-16-case.cpp
new file mode 100644
index 0000000..bde4700
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-16-case.cpp
@@ -0,0 +1,178 @@
+/* $Id: utf-16-case.cpp $ */
+/** @file
+ * IPRT - UTF-16, Case Sensitivity.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+RTDECL(int) RTUtf16ICmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
+{
+    if (pwsz1 == pwsz2)
+        return 0;
+    if (!pwsz1)
+        return -1;
+    if (!pwsz2)
+        return 1;
+
+    PCRTUTF16 pwsz1Start = pwsz1; /* keep it around in case we have to backtrack on a surrogate pair */
+    for (;;)
+    {
+        register RTUTF16  wc1 = *pwsz1;
+        register RTUTF16  wc2 = *pwsz2;
+        register int     iDiff = wc1 - wc2;
+        if (iDiff)
+        {
+            /* unless they are *both* surrogate pairs, there is no chance they'll be identical. */
+            if (    wc1 < 0xd800
+                ||  wc2 < 0xd800
+                ||  wc1 > 0xdfff
+                ||  wc2 > 0xdfff)
+            {
+                /* simple UCS-2 char */
+                iDiff = RTUniCpToUpper(wc1) - RTUniCpToUpper(wc2);
+                if (iDiff)
+                    iDiff = RTUniCpToLower(wc1) - RTUniCpToLower(wc2);
+            }
+            else
+            {
+                /* a damned pair */
+                RTUNICP uc1;
+                RTUNICP uc2;
+                if (wc1 >= 0xdc00)
+                {
+                    if (pwsz1Start == pwsz1)
+                        return iDiff;
+                    uc1 = pwsz1[-1];
+                    if (uc1 < 0xd800 || uc1 >= 0xdc00)
+                        return iDiff;
+                    uc1 = 0x10000 + (((uc1       & 0x3ff) << 10) | (wc1 & 0x3ff));
+                    uc2 = 0x10000 + (((pwsz2[-1] & 0x3ff) << 10) | (wc2 & 0x3ff));
+                }
+                else
+                {
+                    uc1 = *++pwsz1;
+                    if (uc1 < 0xdc00 || uc1 >= 0xe000)
+                        return iDiff;
+                    uc1 = 0x10000 + (((wc1 & 0x3ff) << 10) | (uc1      & 0x3ff));
+                    uc2 = 0x10000 + (((wc2 & 0x3ff) << 10) | (*++pwsz2 & 0x3ff));
+                }
+                iDiff = RTUniCpToUpper(uc1) - RTUniCpToUpper(uc2);
+                if (iDiff)
+                    iDiff = RTUniCpToLower(uc1) - RTUniCpToLower(uc2); /* serious paranoia! */
+            }
+            if (iDiff)
+                return iDiff;
+        }
+        if (!wc1)
+            return 0;
+        pwsz1++;
+        pwsz2++;
+    }
+}
+RT_EXPORT_SYMBOL(RTUtf16ICmp);
+
+
+RTDECL(PRTUTF16) RTUtf16ToLower(PRTUTF16 pwsz)
+{
+    PRTUTF16 pwc = pwsz;
+    for (;;)
+    {
+        RTUTF16 wc = *pwc;
+        if (!wc)
+            break;
+        if (wc < 0xd800 || wc >= 0xdc00)
+        {
+            RTUNICP ucFolded = RTUniCpToLower(wc);
+            if (ucFolded < 0x10000)
+                *pwc++ = RTUniCpToLower(wc);
+        }
+        else
+        {
+            /* surrogate */
+            RTUTF16 wc2 = pwc[1];
+            if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
+            {
+                RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
+                RTUNICP ucFolded = RTUniCpToLower(uc);
+                if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
+                {
+                    uc -= 0x10000;
+                    *pwc++ = 0xd800 | (uc >> 10);
+                    *pwc++ = 0xdc00 | (uc & 0x3ff);
+                }
+            }
+            else /* invalid encoding. */
+                pwc++;
+        }
+    }
+    return pwsz;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLower);
+
+
+RTDECL(PRTUTF16) RTUtf16ToUpper(PRTUTF16 pwsz)
+{
+    PRTUTF16 pwc = pwsz;
+    for (;;)
+    {
+        RTUTF16 wc = *pwc;
+        if (!wc)
+            break;
+        if (wc < 0xd800 || wc >= 0xdc00)
+            *pwc++ = RTUniCpToUpper(wc);
+        else
+        {
+            /* surrogate */
+            RTUTF16 wc2 = pwc[1];
+            if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
+            {
+                RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
+                RTUNICP ucFolded = RTUniCpToUpper(uc);
+                if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
+                {
+                    uc -= 0x10000;
+                    *pwc++ = 0xd800 | (uc >> 10);
+                    *pwc++ = 0xdc00 | (uc & 0x3ff);
+                }
+            }
+            else /* invalid encoding. */
+                pwc++;
+        }
+    }
+    return pwsz;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToUpper);
+
diff --git a/src/VBox/Runtime/common/string/utf-16-latin-1.cpp b/src/VBox/Runtime/common/string/utf-16-latin-1.cpp
new file mode 100644
index 0000000..9a8b5e8
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-16-latin-1.cpp
@@ -0,0 +1,479 @@
+/* $Id: utf-16-latin-1.cpp $ */
+/** @file
+ * IPRT - Latin-1 and UTF-16.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+/**
+ * Validate the UTF-16 encoding and calculates the length of a Latin1 encoding.
+ *
+ * @returns iprt status code.
+ * @param   pwsz        The UTF-16 string.
+ * @param   cwc         The max length of the UTF-16 string to consider.
+ * @param   pcch        Where to store the length (excluding '\\0') of the Latin1 string. (cch == cb, btw)
+ */
+static int rtUtf16CalcLatin1Length(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
+{
+    int     rc = VINF_SUCCESS;
+    size_t  cch = 0;
+    while (cwc > 0)
+    {
+        RTUTF16 wc = *pwsz++; cwc--;
+        if (!wc)
+            break;
+        else if (RT_LIKELY(wc < 0x100))
+            ++cch;
+        else
+        {
+            if (wc < 0xd800 || wc > 0xdfff)
+            {
+                if (wc >= 0xfffe)
+                {
+                    RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
+                    rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
+                    break;
+                }
+            }
+            else
+            {
+                if (wc >= 0xdc00)
+                {
+                    RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+                if (cwc <= 0)
+                {
+                    RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+                wc = *pwsz++; cwc--;
+                if (wc < 0xdc00 || wc > 0xdfff)
+                {
+                    RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+            }
+
+            rc = VERR_NO_TRANSLATION;
+            break;
+        }
+    }
+
+    /* done */
+    *pcch = cch;
+    return rc;
+}
+
+
+/**
+ * Recodes an valid UTF-16 string as Latin1.
+ *
+ * @returns iprt status code.
+ * @param   pwsz        The UTF-16 string.
+ * @param   cwc         The number of RTUTF16 characters to process from pwsz. The recoding
+ *                      will stop when cwc or '\\0' is reached.
+ * @param   psz         Where to store the Latin1 string.
+ * @param   cch         The size of the Latin1 buffer, excluding the terminator.
+ */
+static int rtUtf16RecodeAsLatin1(PCRTUTF16 pwsz, size_t cwc, char *psz, size_t cch)
+{
+    unsigned char  *pch = (unsigned char *)psz;
+    int             rc  = VINF_SUCCESS;
+    while (cwc > 0)
+    {
+        RTUTF16 wc = *pwsz++; cwc--;
+        if (!wc)
+            break;
+        if (RT_LIKELY(wc < 0x100))
+        {
+            if (RT_UNLIKELY(cch < 1))
+            {
+                RTStrAssertMsgFailed(("Buffer overflow! 1\n"));
+                rc = VERR_BUFFER_OVERFLOW;
+                break;
+            }
+            cch--;
+            *pch++ = (unsigned char)wc;
+        }
+        else
+        {
+            if (wc < 0xd800 || wc > 0xdfff)
+            {
+                if (wc >= 0xfffe)
+                {
+                    RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
+                    rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
+                    break;
+                }
+            }
+            else
+            {
+                if (wc >= 0xdc00)
+                {
+                    RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+                if (cwc <= 0)
+                {
+                    RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+                RTUTF16 wc2 = *pwsz++; cwc--;
+                if (wc2 < 0xdc00 || wc2 > 0xdfff)
+                {
+                    RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
+                    rc = VERR_INVALID_UTF16_ENCODING;
+                    break;
+                }
+            }
+
+            rc = VERR_NO_TRANSLATION;
+            break;
+        }
+    }
+
+    /* done */
+    *pch = '\0';
+    return rc;
+}
+
+
+RTDECL(int)  RTUtf16ToLatin1Tag(PCRTUTF16 pwszString, char **ppszString, const char *pszTag)
+{
+    /*
+     * Validate input.
+     */
+    Assert(VALID_PTR(ppszString));
+    Assert(VALID_PTR(pwszString));
+    *ppszString = NULL;
+
+    /*
+     * Validate the UTF-16 string and calculate the length of the UTF-8 encoding of it.
+     */
+    size_t cch;
+    int rc = rtUtf16CalcLatin1Length(pwszString, RTSTR_MAX, &cch);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Allocate buffer and recode it.
+         */
+        char *pszResult = (char *)RTMemAllocTag(cch + 1, pszTag);
+        if (pszResult)
+        {
+            rc = rtUtf16RecodeAsLatin1(pwszString, RTSTR_MAX, pszResult, cch);
+            if (RT_SUCCESS(rc))
+            {
+                *ppszString = pszResult;
+                return rc;
+            }
+
+            RTMemFree(pszResult);
+        }
+        else
+            rc = VERR_NO_STR_MEMORY;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLatin1Tag);
+
+
+RTDECL(int)  RTUtf16ToLatin1ExTag(PCRTUTF16 pwszString, size_t cwcString, char **ppsz, size_t cch, size_t *pcch, const char *pszTag)
+{
+    /*
+     * Validate input.
+     */
+    AssertPtr(pwszString);
+    AssertPtr(ppsz);
+    AssertPtrNull(pcch);
+
+    /*
+     * Validate the UTF-16 string and calculate the length of the Latin1 encoding of it.
+     */
+    size_t cchResult;
+    int rc = rtUtf16CalcLatin1Length(pwszString, cwcString, &cchResult);
+    if (RT_SUCCESS(rc))
+    {
+        if (pcch)
+            *pcch = cchResult;
+
+        /*
+         * Check buffer size / Allocate buffer and recode it.
+         */
+        bool fShouldFree;
+        char *pszResult;
+        if (cch > 0 && *ppsz)
+        {
+            fShouldFree = false;
+            if (cch <= cchResult)
+                return VERR_BUFFER_OVERFLOW;
+            pszResult = *ppsz;
+        }
+        else
+        {
+            *ppsz = NULL;
+            fShouldFree = true;
+            cch = RT_MAX(cch, cchResult + 1);
+            pszResult = (char *)RTMemAllocTag(cch, pszTag);
+        }
+        if (pszResult)
+        {
+            rc = rtUtf16RecodeAsLatin1(pwszString, cwcString, pszResult, cch - 1);
+            if (RT_SUCCESS(rc))
+            {
+                *ppsz = pszResult;
+                return rc;
+            }
+
+            if (fShouldFree)
+                RTMemFree(pszResult);
+        }
+        else
+            rc = VERR_NO_STR_MEMORY;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16ToLatin1ExTag);
+
+
+RTDECL(size_t) RTUtf16CalcLatin1Len(PCRTUTF16 pwsz)
+{
+    size_t cch;
+    int rc = rtUtf16CalcLatin1Length(pwsz, RTSTR_MAX, &cch);
+    return RT_SUCCESS(rc) ? cch : 0;
+}
+RT_EXPORT_SYMBOL(RTUtf16CalcLatin1Len);
+
+
+RTDECL(int) RTUtf16CalcLatin1LenEx(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
+{
+    size_t cch;
+    int rc = rtUtf16CalcLatin1Length(pwsz, cwc, &cch);
+    if (pcch)
+        *pcch = RT_SUCCESS(rc) ? cch : ~(size_t)0;
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTUtf16CalcLatin1LenEx);
+
+
+/**
+ * Calculates the UTF-16 length of a Latin1 string.  In fact this is just the
+ * original length, but the function saves us nasty comments to that effect
+ * all over the place.
+ *
+ * @returns IPRT status code.
+ * @param   psz     Pointer to the Latin1 string.
+ * @param   cch     The max length of the string. (btw cch = cb)
+ *                  Use RTSTR_MAX if all of the string is to be examined.s
+ * @param   pcwc    Where to store the length of the UTF-16 string as a number of RTUTF16 characters.
+ */
+static int rtLatin1CalcUtf16Length(const char *psz, size_t cch, size_t *pcwc)
+{
+    *pcwc = RTStrNLen(psz, cch);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Recodes a Latin1 string as UTF-16.  This is just a case of expanding it to
+ * sixteen bits, as Unicode is a superset of Latin1.
+ *
+ * Since we know the input is valid, we do *not* perform length checks.
+ *
+ * @returns iprt status code.
+ * @param   psz     The Latin1 string to recode.
+ * @param   cch     The number of chars (the type char, so bytes if you like) to process of the Latin1 string.
+ *                  The recoding will stop when cch or '\\0' is reached. Pass RTSTR_MAX to process up to '\\0'.
+ * @param   pwsz    Where to store the UTF-16 string.
+ * @param   cwc     The number of RTUTF16 items the pwsz buffer can hold, excluding the terminator ('\\0').
+ */
+static int rtLatin1RecodeAsUtf16(const char *psz, size_t cch, PRTUTF16 pwsz, size_t cwc)
+{
+    int                     rc   = VINF_SUCCESS;
+    const unsigned char    *puch = (const unsigned char *)psz;
+    PRTUTF16                pwc  = pwsz;
+    while (cch-- > 0)
+    {
+        /* read the next char and check for terminator. */
+        const unsigned char uch = *puch;
+        if (!uch)
+            break;
+
+        /* check for output overflow */
+        if (RT_UNLIKELY(cwc < 1))
+        {
+            rc = VERR_BUFFER_OVERFLOW;
+            break;
+        }
+
+        /* expand the code point */
+        *pwc++ = uch;
+        cwc--;
+        puch++;
+    }
+
+    /* done */
+    *pwc = '\0';
+    return rc;
+}
+
+
+RTDECL(int) RTLatin1ToUtf16Tag(const char *pszString, PRTUTF16 *ppwszString, const char *pszTag)
+{
+    /*
+     * Validate input.
+     */
+    Assert(VALID_PTR(ppwszString));
+    Assert(VALID_PTR(pszString));
+    *ppwszString = NULL;
+
+    /*
+     * Validate the input and calculate the length of the UTF-16 string.
+     */
+    size_t cwc;
+    int rc = rtLatin1CalcUtf16Length(pszString, RTSTR_MAX, &cwc);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Allocate buffer.
+         */
+        PRTUTF16 pwsz = (PRTUTF16)RTMemAllocTag((cwc + 1) * sizeof(RTUTF16), pszTag);
+        if (pwsz)
+        {
+            /*
+             * Encode the UTF-16 string.
+             */
+            rc = rtLatin1RecodeAsUtf16(pszString, RTSTR_MAX, pwsz, cwc);
+            if (RT_SUCCESS(rc))
+            {
+                *ppwszString = pwsz;
+                return rc;
+            }
+            RTMemFree(pwsz);
+        }
+        else
+            rc = VERR_NO_UTF16_MEMORY;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1ToUtf16Tag);
+
+
+RTDECL(int)  RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
+                                  PRTUTF16 *ppwsz, size_t cwc, size_t *pcwc, const char *pszTag)
+{
+    /*
+     * Validate input.
+     */
+    Assert(VALID_PTR(pszString));
+    Assert(VALID_PTR(ppwsz));
+    Assert(!pcwc || VALID_PTR(pcwc));
+
+    /*
+     * Validate the input and calculate the length of the UTF-16 string.
+     */
+    size_t cwcResult;
+    int rc = rtLatin1CalcUtf16Length(pszString, cchString, &cwcResult);
+    if (RT_SUCCESS(rc))
+    {
+        if (pcwc)
+            *pcwc = cwcResult;
+
+        /*
+         * Check buffer size / Allocate buffer.
+         */
+        bool fShouldFree;
+        PRTUTF16 pwszResult;
+        if (cwc > 0 && *ppwsz)
+        {
+            fShouldFree = false;
+            if (cwc <= cwcResult)
+                return VERR_BUFFER_OVERFLOW;
+            pwszResult = *ppwsz;
+        }
+        else
+        {
+            *ppwsz = NULL;
+            fShouldFree = true;
+            cwc = RT_MAX(cwcResult + 1, cwc);
+            pwszResult = (PRTUTF16)RTMemAllocTag(cwc * sizeof(RTUTF16), pszTag);
+        }
+        if (pwszResult)
+        {
+            /*
+             * Encode the UTF-16 string.
+             */
+            rc = rtLatin1RecodeAsUtf16(pszString, cchString, pwszResult, cwc - 1);
+            if (RT_SUCCESS(rc))
+            {
+                *ppwsz = pwszResult;
+                return rc;
+            }
+            if (fShouldFree)
+                RTMemFree(pwszResult);
+        }
+        else
+            rc = VERR_NO_UTF16_MEMORY;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1ToUtf16ExTag);
+
+
+RTDECL(size_t) RTLatin1CalcUtf16Len(const char *psz)
+{
+    size_t cwc;
+    int rc = rtLatin1CalcUtf16Length(psz, RTSTR_MAX, &cwc);
+    return RT_SUCCESS(rc) ? cwc : 0;
+}
+RT_EXPORT_SYMBOL(RTLatin1CalcUtf16Len);
+
+
+RTDECL(int) RTLatin1CalcUtf16LenEx(const char *psz, size_t cch, size_t *pcwc)
+{
+    size_t cwc;
+    int rc = rtLatin1CalcUtf16Length(psz, cch, &cwc);
+    if (pcwc)
+        *pcwc = RT_SUCCESS(rc) ? cwc : ~(size_t)0;
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTLatin1CalcUtf16LenEx);
+
diff --git a/src/VBox/Runtime/common/string/utf-16.cpp b/src/VBox/Runtime/common/string/utf-16.cpp
index 2a1eb95..63c9931 100644
--- a/src/VBox/Runtime/common/string/utf-16.cpp
+++ b/src/VBox/Runtime/common/string/utf-16.cpp
@@ -170,145 +170,6 @@ RTDECL(int) RTUtf16Cmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
 RT_EXPORT_SYMBOL(RTUtf16Cmp);
 
 
-RTDECL(int) RTUtf16ICmp(register PCRTUTF16 pwsz1, register PCRTUTF16 pwsz2)
-{
-    if (pwsz1 == pwsz2)
-        return 0;
-    if (!pwsz1)
-        return -1;
-    if (!pwsz2)
-        return 1;
-
-    PCRTUTF16 pwsz1Start = pwsz1; /* keep it around in case we have to backtrack on a surrogate pair */
-    for (;;)
-    {
-        register RTUTF16  wc1 = *pwsz1;
-        register RTUTF16  wc2 = *pwsz2;
-        register int     iDiff = wc1 - wc2;
-        if (iDiff)
-        {
-            /* unless they are *both* surrogate pairs, there is no chance they'll be identical. */
-            if (    wc1 < 0xd800
-                ||  wc2 < 0xd800
-                ||  wc1 > 0xdfff
-                ||  wc2 > 0xdfff)
-            {
-                /* simple UCS-2 char */
-                iDiff = RTUniCpToUpper(wc1) - RTUniCpToUpper(wc2);
-                if (iDiff)
-                    iDiff = RTUniCpToLower(wc1) - RTUniCpToLower(wc2);
-            }
-            else
-            {
-                /* a damned pair */
-                RTUNICP uc1;
-                RTUNICP uc2;
-                if (wc1 >= 0xdc00)
-                {
-                    if (pwsz1Start == pwsz1)
-                        return iDiff;
-                    uc1 = pwsz1[-1];
-                    if (uc1 < 0xd800 || uc1 >= 0xdc00)
-                        return iDiff;
-                    uc1 = 0x10000 + (((uc1       & 0x3ff) << 10) | (wc1 & 0x3ff));
-                    uc2 = 0x10000 + (((pwsz2[-1] & 0x3ff) << 10) | (wc2 & 0x3ff));
-                }
-                else
-                {
-                    uc1 = *++pwsz1;
-                    if (uc1 < 0xdc00 || uc1 >= 0xe000)
-                        return iDiff;
-                    uc1 = 0x10000 + (((wc1 & 0x3ff) << 10) | (uc1      & 0x3ff));
-                    uc2 = 0x10000 + (((wc2 & 0x3ff) << 10) | (*++pwsz2 & 0x3ff));
-                }
-                iDiff = RTUniCpToUpper(uc1) - RTUniCpToUpper(uc2);
-                if (iDiff)
-                    iDiff = RTUniCpToLower(uc1) - RTUniCpToLower(uc2); /* serious paranoia! */
-            }
-            if (iDiff)
-                return iDiff;
-        }
-        if (!wc1)
-            return 0;
-        pwsz1++;
-        pwsz2++;
-    }
-}
-RT_EXPORT_SYMBOL(RTUtf16ICmp);
-
-
-RTDECL(PRTUTF16) RTUtf16ToLower(PRTUTF16 pwsz)
-{
-    PRTUTF16 pwc = pwsz;
-    for (;;)
-    {
-        RTUTF16 wc = *pwc;
-        if (!wc)
-            break;
-        if (wc < 0xd800 || wc >= 0xdc00)
-        {
-            RTUNICP ucFolded = RTUniCpToLower(wc);
-            if (ucFolded < 0x10000)
-                *pwc++ = RTUniCpToLower(wc);
-        }
-        else
-        {
-            /* surrogate */
-            RTUTF16 wc2 = pwc[1];
-            if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
-            {
-                RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
-                RTUNICP ucFolded = RTUniCpToLower(uc);
-                if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
-                {
-                    uc -= 0x10000;
-                    *pwc++ = 0xd800 | (uc >> 10);
-                    *pwc++ = 0xdc00 | (uc & 0x3ff);
-                }
-            }
-            else /* invalid encoding. */
-                pwc++;
-        }
-    }
-    return pwsz;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLower);
-
-
-RTDECL(PRTUTF16) RTUtf16ToUpper(PRTUTF16 pwsz)
-{
-    PRTUTF16 pwc = pwsz;
-    for (;;)
-    {
-        RTUTF16 wc = *pwc;
-        if (!wc)
-            break;
-        if (wc < 0xd800 || wc >= 0xdc00)
-            *pwc++ = RTUniCpToUpper(wc);
-        else
-        {
-            /* surrogate */
-            RTUTF16 wc2 = pwc[1];
-            if (wc2 >= 0xdc00 && wc2 <= 0xdfff)
-            {
-                RTUNICP uc = 0x10000 + (((wc & 0x3ff) << 10) | (wc2 & 0x3ff));
-                RTUNICP ucFolded = RTUniCpToUpper(uc);
-                if (uc != ucFolded && ucFolded >= 0x10000) /* we don't support shrinking the string */
-                {
-                    uc -= 0x10000;
-                    *pwc++ = 0xd800 | (uc >> 10);
-                    *pwc++ = 0xdc00 | (uc & 0x3ff);
-                }
-            }
-            else /* invalid encoding. */
-                pwc++;
-        }
-    }
-    return pwsz;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToUpper);
-
-
 RTDECL(int) RTUtf16ValidateEncoding(PCRTUTF16 pwsz)
 {
     return RTUtf16ValidateEncodingEx(pwsz, RTSTR_MAX, 0);
@@ -785,442 +646,3 @@ RTDECL(PRTUTF16) RTUtf16PutCpInternal(PRTUTF16 pwsz, RTUNICP CodePoint)
 }
 RT_EXPORT_SYMBOL(RTUtf16PutCpInternal);
 
-
-/**
- * Validate the UTF-16 encoding and calculates the length of a Latin1 encoding.
- *
- * @returns iprt status code.
- * @param   pwsz        The UTF-16 string.
- * @param   cwc         The max length of the UTF-16 string to consider.
- * @param   pcch        Where to store the length (excluding '\\0') of the Latin1 string. (cch == cb, btw)
- */
-static int rtUtf16CalcLatin1Length(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
-{
-    int     rc = VINF_SUCCESS;
-    size_t  cch = 0;
-    while (cwc > 0)
-    {
-        RTUTF16 wc = *pwsz++; cwc--;
-        if (!wc)
-            break;
-        else if (RT_LIKELY(wc < 0x100))
-            ++cch;
-        else
-        {
-            if (wc < 0xd800 || wc > 0xdfff)
-            {
-                if (wc >= 0xfffe)
-                {
-                    RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
-                    rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
-                    break;
-                }
-            }
-            else
-            {
-                if (wc >= 0xdc00)
-                {
-                    RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-                if (cwc <= 0)
-                {
-                    RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-                wc = *pwsz++; cwc--;
-                if (wc < 0xdc00 || wc > 0xdfff)
-                {
-                    RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-            }
-
-            rc = VERR_NO_TRANSLATION;
-            break;
-        }
-    }
-
-    /* done */
-    *pcch = cch;
-    return rc;
-}
-
-
-/**
- * Recodes an valid UTF-16 string as Latin1.
- *
- * @returns iprt status code.
- * @param   pwsz        The UTF-16 string.
- * @param   cwc         The number of RTUTF16 characters to process from pwsz. The recoding
- *                      will stop when cwc or '\\0' is reached.
- * @param   psz         Where to store the Latin1 string.
- * @param   cch         The size of the Latin1 buffer, excluding the terminator.
- */
-static int rtUtf16RecodeAsLatin1(PCRTUTF16 pwsz, size_t cwc, char *psz, size_t cch)
-{
-    unsigned char  *pch = (unsigned char *)psz;
-    int             rc  = VINF_SUCCESS;
-    while (cwc > 0)
-    {
-        RTUTF16 wc = *pwsz++; cwc--;
-        if (!wc)
-            break;
-        if (RT_LIKELY(wc < 0x100))
-        {
-            if (RT_UNLIKELY(cch < 1))
-            {
-                RTStrAssertMsgFailed(("Buffer overflow! 1\n"));
-                rc = VERR_BUFFER_OVERFLOW;
-                break;
-            }
-            cch--;
-            *pch++ = (unsigned char)wc;
-        }
-        else
-        {
-            if (wc < 0xd800 || wc > 0xdfff)
-            {
-                if (wc >= 0xfffe)
-                {
-                    RTStrAssertMsgFailed(("endian indicator! wc=%#x\n", wc));
-                    rc = VERR_CODE_POINT_ENDIAN_INDICATOR;
-                    break;
-                }
-            }
-            else
-            {
-                if (wc >= 0xdc00)
-                {
-                    RTStrAssertMsgFailed(("Wrong 1st char in surrogate! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-                if (cwc <= 0)
-                {
-                    RTStrAssertMsgFailed(("Invalid length! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-                RTUTF16 wc2 = *pwsz++; cwc--;
-                if (wc2 < 0xdc00 || wc2 > 0xdfff)
-                {
-                    RTStrAssertMsgFailed(("Wrong 2nd char in surrogate! wc=%#x\n", wc));
-                    rc = VERR_INVALID_UTF16_ENCODING;
-                    break;
-                }
-            }
-
-            rc = VERR_NO_TRANSLATION;
-            break;
-        }
-    }
-
-    /* done */
-    *pch = '\0';
-    return rc;
-}
-
-
-RTDECL(int)  RTUtf16ToLatin1Tag(PCRTUTF16 pwszString, char **ppszString, const char *pszTag)
-{
-    /*
-     * Validate input.
-     */
-    Assert(VALID_PTR(ppszString));
-    Assert(VALID_PTR(pwszString));
-    *ppszString = NULL;
-
-    /*
-     * Validate the UTF-16 string and calculate the length of the UTF-8 encoding of it.
-     */
-    size_t cch;
-    int rc = rtUtf16CalcLatin1Length(pwszString, RTSTR_MAX, &cch);
-    if (RT_SUCCESS(rc))
-    {
-        /*
-         * Allocate buffer and recode it.
-         */
-        char *pszResult = (char *)RTMemAllocTag(cch + 1, pszTag);
-        if (pszResult)
-        {
-            rc = rtUtf16RecodeAsLatin1(pwszString, RTSTR_MAX, pszResult, cch);
-            if (RT_SUCCESS(rc))
-            {
-                *ppszString = pszResult;
-                return rc;
-            }
-
-            RTMemFree(pszResult);
-        }
-        else
-            rc = VERR_NO_STR_MEMORY;
-    }
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLatin1Tag);
-
-
-RTDECL(int)  RTUtf16ToLatin1ExTag(PCRTUTF16 pwszString, size_t cwcString, char **ppsz, size_t cch, size_t *pcch, const char *pszTag)
-{
-    /*
-     * Validate input.
-     */
-    AssertPtr(pwszString);
-    AssertPtr(ppsz);
-    AssertPtrNull(pcch);
-
-    /*
-     * Validate the UTF-16 string and calculate the length of the Latin1 encoding of it.
-     */
-    size_t cchResult;
-    int rc = rtUtf16CalcLatin1Length(pwszString, cwcString, &cchResult);
-    if (RT_SUCCESS(rc))
-    {
-        if (pcch)
-            *pcch = cchResult;
-
-        /*
-         * Check buffer size / Allocate buffer and recode it.
-         */
-        bool fShouldFree;
-        char *pszResult;
-        if (cch > 0 && *ppsz)
-        {
-            fShouldFree = false;
-            if (cch <= cchResult)
-                return VERR_BUFFER_OVERFLOW;
-            pszResult = *ppsz;
-        }
-        else
-        {
-            *ppsz = NULL;
-            fShouldFree = true;
-            cch = RT_MAX(cch, cchResult + 1);
-            pszResult = (char *)RTMemAllocTag(cch, pszTag);
-        }
-        if (pszResult)
-        {
-            rc = rtUtf16RecodeAsLatin1(pwszString, cwcString, pszResult, cch - 1);
-            if (RT_SUCCESS(rc))
-            {
-                *ppsz = pszResult;
-                return rc;
-            }
-
-            if (fShouldFree)
-                RTMemFree(pszResult);
-        }
-        else
-            rc = VERR_NO_STR_MEMORY;
-    }
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16ToLatin1ExTag);
-
-
-RTDECL(size_t) RTUtf16CalcLatin1Len(PCRTUTF16 pwsz)
-{
-    size_t cch;
-    int rc = rtUtf16CalcLatin1Length(pwsz, RTSTR_MAX, &cch);
-    return RT_SUCCESS(rc) ? cch : 0;
-}
-RT_EXPORT_SYMBOL(RTUtf16CalcLatin1Len);
-
-
-RTDECL(int) RTUtf16CalcLatin1LenEx(PCRTUTF16 pwsz, size_t cwc, size_t *pcch)
-{
-    size_t cch;
-    int rc = rtUtf16CalcLatin1Length(pwsz, cwc, &cch);
-    if (pcch)
-        *pcch = RT_SUCCESS(rc) ? cch : ~(size_t)0;
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTUtf16CalcLatin1LenEx);
-
-
-/**
- * Calculates the UTF-16 length of a Latin1 string.  In fact this is just the
- * original length, but the function saves us nasty comments to that effect
- * all over the place.
- *
- * @returns IPRT status code.
- * @param   psz     Pointer to the Latin1 string.
- * @param   cch     The max length of the string. (btw cch = cb)
- *                  Use RTSTR_MAX if all of the string is to be examined.s
- * @param   pcwc    Where to store the length of the UTF-16 string as a number of RTUTF16 characters.
- */
-static int rtLatin1CalcUtf16Length(const char *psz, size_t cch, size_t *pcwc)
-{
-    *pcwc = RTStrNLen(psz, cch);
-    return VINF_SUCCESS;
-}
-
-
-/**
- * Recodes a Latin1 string as UTF-16.  This is just a case of expanding it to
- * sixteen bits, as Unicode is a superset of Latin1.
- *
- * Since we know the input is valid, we do *not* perform length checks.
- *
- * @returns iprt status code.
- * @param   psz     The Latin1 string to recode.
- * @param   cch     The number of chars (the type char, so bytes if you like) to process of the Latin1 string.
- *                  The recoding will stop when cch or '\\0' is reached. Pass RTSTR_MAX to process up to '\\0'.
- * @param   pwsz    Where to store the UTF-16 string.
- * @param   cwc     The number of RTUTF16 items the pwsz buffer can hold, excluding the terminator ('\\0').
- */
-static int rtLatin1RecodeAsUtf16(const char *psz, size_t cch, PRTUTF16 pwsz, size_t cwc)
-{
-    int                     rc   = VINF_SUCCESS;
-    const unsigned char    *puch = (const unsigned char *)psz;
-    PRTUTF16                pwc  = pwsz;
-    while (cch-- > 0)
-    {
-        /* read the next char and check for terminator. */
-        const unsigned char uch = *puch;
-        if (!uch)
-            break;
-
-        /* check for output overflow */
-        if (RT_UNLIKELY(cwc < 1))
-        {
-            rc = VERR_BUFFER_OVERFLOW;
-            break;
-        }
-
-        /* expand the code point */
-        *pwc++ = uch;
-        cwc--;
-        puch++;
-    }
-
-    /* done */
-    *pwc = '\0';
-    return rc;
-}
-
-
-RTDECL(int) RTLatin1ToUtf16Tag(const char *pszString, PRTUTF16 *ppwszString, const char *pszTag)
-{
-    /*
-     * Validate input.
-     */
-    Assert(VALID_PTR(ppwszString));
-    Assert(VALID_PTR(pszString));
-    *ppwszString = NULL;
-
-    /*
-     * Validate the input and calculate the length of the UTF-16 string.
-     */
-    size_t cwc;
-    int rc = rtLatin1CalcUtf16Length(pszString, RTSTR_MAX, &cwc);
-    if (RT_SUCCESS(rc))
-    {
-        /*
-         * Allocate buffer.
-         */
-        PRTUTF16 pwsz = (PRTUTF16)RTMemAllocTag((cwc + 1) * sizeof(RTUTF16), pszTag);
-        if (pwsz)
-        {
-            /*
-             * Encode the UTF-16 string.
-             */
-            rc = rtLatin1RecodeAsUtf16(pszString, RTSTR_MAX, pwsz, cwc);
-            if (RT_SUCCESS(rc))
-            {
-                *ppwszString = pwsz;
-                return rc;
-            }
-            RTMemFree(pwsz);
-        }
-        else
-            rc = VERR_NO_UTF16_MEMORY;
-    }
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1ToUtf16Tag);
-
-
-RTDECL(int)  RTLatin1ToUtf16ExTag(const char *pszString, size_t cchString,
-                                  PRTUTF16 *ppwsz, size_t cwc, size_t *pcwc, const char *pszTag)
-{
-    /*
-     * Validate input.
-     */
-    Assert(VALID_PTR(pszString));
-    Assert(VALID_PTR(ppwsz));
-    Assert(!pcwc || VALID_PTR(pcwc));
-
-    /*
-     * Validate the input and calculate the length of the UTF-16 string.
-     */
-    size_t cwcResult;
-    int rc = rtLatin1CalcUtf16Length(pszString, cchString, &cwcResult);
-    if (RT_SUCCESS(rc))
-    {
-        if (pcwc)
-            *pcwc = cwcResult;
-
-        /*
-         * Check buffer size / Allocate buffer.
-         */
-        bool fShouldFree;
-        PRTUTF16 pwszResult;
-        if (cwc > 0 && *ppwsz)
-        {
-            fShouldFree = false;
-            if (cwc <= cwcResult)
-                return VERR_BUFFER_OVERFLOW;
-            pwszResult = *ppwsz;
-        }
-        else
-        {
-            *ppwsz = NULL;
-            fShouldFree = true;
-            cwc = RT_MAX(cwcResult + 1, cwc);
-            pwszResult = (PRTUTF16)RTMemAllocTag(cwc * sizeof(RTUTF16), pszTag);
-        }
-        if (pwszResult)
-        {
-            /*
-             * Encode the UTF-16 string.
-             */
-            rc = rtLatin1RecodeAsUtf16(pszString, cchString, pwszResult, cwc - 1);
-            if (RT_SUCCESS(rc))
-            {
-                *ppwsz = pwszResult;
-                return rc;
-            }
-            if (fShouldFree)
-                RTMemFree(pwszResult);
-        }
-        else
-            rc = VERR_NO_UTF16_MEMORY;
-    }
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1ToUtf16ExTag);
-
-
-RTDECL(size_t) RTLatin1CalcUtf16Len(const char *psz)
-{
-    size_t cwc;
-    int rc = rtLatin1CalcUtf16Length(psz, RTSTR_MAX, &cwc);
-    return RT_SUCCESS(rc) ? cwc : 0;
-}
-RT_EXPORT_SYMBOL(RTLatin1CalcUtf16Len);
-
-
-RTDECL(int) RTLatin1CalcUtf16LenEx(const char *psz, size_t cch, size_t *pcwc)
-{
-    size_t cwc;
-    int rc = rtLatin1CalcUtf16Length(psz, cch, &cwc);
-    if (pcwc)
-        *pcwc = RT_SUCCESS(rc) ? cwc : ~(size_t)0;
-    return rc;
-}
-RT_EXPORT_SYMBOL(RTLatin1CalcUtf16LenEx);
diff --git a/src/VBox/Runtime/common/string/utf-8-case.cpp b/src/VBox/Runtime/common/string/utf-8-case.cpp
index e674944..595b7e0 100644
--- a/src/VBox/Runtime/common/string/utf-8-case.cpp
+++ b/src/VBox/Runtime/common/string/utf-8-case.cpp
@@ -1,6 +1,6 @@
 /* $Id: utf-8-case.cpp $ */
 /** @file
- * IPRT - UTF-8 Case Sensitivity and Folding.
+ * IPRT - UTF-8 Case Sensitivity and Folding, Part 1.
  */
 
 /*
@@ -289,8 +289,12 @@ RTDECL(char *) RTStrToLower(char *psz)
         int rc = RTStrGetCpEx(&pszSrc, &uc);
         if (RT_SUCCESS(rc))
         {
-            uc = RTUniCpToLower(uc);
-            pszDst = RTStrPutCp(pszDst, uc);
+            RTUNICP uc2 = RTUniCpToLower(uc);
+            if (RT_LIKELY(   uc2 == uc
+                          || RTUniCpCalcUtf8Len(uc2) == RTUniCpCalcUtf8Len(uc)))
+                pszDst = RTStrPutCp(pszDst, uc2);
+            else
+                pszDst = RTStrPutCp(pszDst, uc);
         }
         else
         {
@@ -322,8 +326,12 @@ RTDECL(char *) RTStrToUpper(char *psz)
         int rc = RTStrGetCpEx(&pszSrc, &uc);
         if (RT_SUCCESS(rc))
         {
-            uc = RTUniCpToUpper(uc);
-            pszDst = RTStrPutCp(pszDst, uc);
+            RTUNICP uc2 = RTUniCpToUpper(uc);
+            if (RT_LIKELY(   uc2 == uc
+                          || RTUniCpCalcUtf8Len(uc2) == RTUniCpCalcUtf8Len(uc)))
+                pszDst = RTStrPutCp(pszDst, uc2);
+            else
+                pszDst = RTStrPutCp(pszDst, uc);
         }
         else
         {
@@ -338,82 +346,3 @@ RTDECL(char *) RTStrToUpper(char *psz)
 }
 RT_EXPORT_SYMBOL(RTStrToUpper);
 
-
-RTDECL(bool) RTStrIsCaseFoldable(const char *psz)
-{
-    /*
-     * Loop the code points in the string, checking them one by one until we
-     * find something that can be folded.
-     */
-    RTUNICP uc;
-    do
-    {
-        int rc = RTStrGetCpEx(&psz, &uc);
-        if (RT_SUCCESS(rc))
-        {
-            if (RTUniCpIsFoldable(uc))
-                return true;
-        }
-        else
-        {
-            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
-            AssertRC(rc);
-        }
-    } while (uc != 0);
-
-    return false;
-}
-RT_EXPORT_SYMBOL(RTStrIsCaseFoldable);
-
-
-RTDECL(bool) RTStrIsUpperCased(const char *psz)
-{
-    /*
-     * Check that there are no lower case chars in the string.
-     */
-    RTUNICP uc;
-    do
-    {
-        int rc = RTStrGetCpEx(&psz, &uc);
-        if (RT_SUCCESS(rc))
-        {
-            if (RTUniCpIsLower(uc))
-                return false;
-        }
-        else
-        {
-            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
-            AssertRC(rc);
-        }
-    } while (uc != 0);
-
-    return true;
-}
-RT_EXPORT_SYMBOL(RTStrIsUpperCased);
-
-
-RTDECL(bool) RTStrIsLowerCased(const char *psz)
-{
-    /*
-     * Check that there are no lower case chars in the string.
-     */
-    RTUNICP uc;
-    do
-    {
-        int rc = RTStrGetCpEx(&psz, &uc);
-        if (RT_SUCCESS(rc))
-        {
-            if (RTUniCpIsUpper(uc))
-                return false;
-        }
-        else
-        {
-            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
-            AssertRC(rc);
-        }
-    } while (uc != 0);
-
-    return true;
-}
-RT_EXPORT_SYMBOL(RTStrIsLowerCased);
-
diff --git a/src/VBox/Runtime/common/string/utf-8-case2.cpp b/src/VBox/Runtime/common/string/utf-8-case2.cpp
new file mode 100644
index 0000000..fbd053f
--- /dev/null
+++ b/src/VBox/Runtime/common/string/utf-8-case2.cpp
@@ -0,0 +1,118 @@
+/* $Id: utf-8-case2.cpp $ */
+/** @file
+ * IPRT - UTF-8 Case Sensitivity and Folding, Part 2 (requires unidata-flags.cpp).
+ */
+
+/*
+ * Copyright (C) 2006-2010 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/string.h>
+#include "internal/iprt.h"
+
+#include <iprt/uni.h>
+#include <iprt/alloc.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include "internal/string.h"
+
+
+RTDECL(bool) RTStrIsCaseFoldable(const char *psz)
+{
+    /*
+     * Loop the code points in the string, checking them one by one until we
+     * find something that can be folded.
+     */
+    RTUNICP uc;
+    do
+    {
+        int rc = RTStrGetCpEx(&psz, &uc);
+        if (RT_SUCCESS(rc))
+        {
+            if (RTUniCpIsFoldable(uc))
+                return true;
+        }
+        else
+        {
+            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+            AssertRC(rc);
+        }
+    } while (uc != 0);
+
+    return false;
+}
+RT_EXPORT_SYMBOL(RTStrIsCaseFoldable);
+
+
+RTDECL(bool) RTStrIsUpperCased(const char *psz)
+{
+    /*
+     * Check that there are no lower case chars in the string.
+     */
+    RTUNICP uc;
+    do
+    {
+        int rc = RTStrGetCpEx(&psz, &uc);
+        if (RT_SUCCESS(rc))
+        {
+            if (RTUniCpIsLower(uc))
+                return false;
+        }
+        else
+        {
+            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+            AssertRC(rc);
+        }
+    } while (uc != 0);
+
+    return true;
+}
+RT_EXPORT_SYMBOL(RTStrIsUpperCased);
+
+
+RTDECL(bool) RTStrIsLowerCased(const char *psz)
+{
+    /*
+     * Check that there are no lower case chars in the string.
+     */
+    RTUNICP uc;
+    do
+    {
+        int rc = RTStrGetCpEx(&psz, &uc);
+        if (RT_SUCCESS(rc))
+        {
+            if (RTUniCpIsUpper(uc))
+                return false;
+        }
+        else
+        {
+            /* bad encoding, just skip it quietly (uc == RTUNICP_INVALID (!= 0)). */
+            AssertRC(rc);
+        }
+    } while (uc != 0);
+
+    return true;
+}
+RT_EXPORT_SYMBOL(RTStrIsLowerCased);
+
diff --git a/src/VBox/Runtime/common/vfs/vfschain.cpp b/src/VBox/Runtime/common/vfs/vfschain.cpp
index 2e43b26..e7ee52e 100644
--- a/src/VBox/Runtime/common/vfs/vfschain.cpp
+++ b/src/VBox/Runtime/common/vfs/vfschain.cpp
@@ -612,11 +612,12 @@ RTDECL(int) RTVfsChainOpenFile(const char *pszSpec, uint64_t fOpen, PRTVFSFILE p
 
 RTDECL(int) RTVfsChainOpenIoStream(const char *pszSpec, uint64_t fOpen, PRTVFSIOSTREAM phVfsIos, const char **ppszError)
 {
+    if (ppszError)
+        *ppszError = NULL;
+
     AssertPtrReturn(pszSpec, VERR_INVALID_POINTER);
     AssertReturn(*pszSpec != '\0', VERR_INVALID_PARAMETER);
     AssertPtrReturn(phVfsIos, VERR_INVALID_POINTER);
-    if (ppszError)
-        *ppszError = NULL;
 
     /*
      * If it's not a VFS chain spec, treat it as a file.
diff --git a/src/VBox/Runtime/common/zip/pkzip.cpp b/src/VBox/Runtime/common/zip/pkzip.cpp
new file mode 100644
index 0000000..34cb048
--- /dev/null
+++ b/src/VBox/Runtime/common/zip/pkzip.cpp
@@ -0,0 +1,240 @@
+/* $Id: pkzip.cpp $ */
+/** @file
+ * IPRT - PKZIP archive I/O.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/******************************************************************************
+ *   Header Files                                                             *
+ ******************************************************************************/
+#include <iprt/zip.h>
+#include <iprt/file.h>
+#include <iprt/fs.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+#include <iprt/vfs.h>
+#include <iprt/vfslowlevel.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Memory stream private data.
+ */
+typedef struct MEMIOSTREAM
+{
+    /** Size of the memory buffer. */
+    size_t      cbBuf;
+    /** Pointer to the memory buffer. */
+    uint8_t     *pu8Buf;
+    /** Current offset. */
+    size_t      off;
+} MEMIOSTREAM;
+typedef MEMIOSTREAM *PMEMIOSTREAM;
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnClose}
+ */
+static DECLCALLBACK(int) memFssIos_Close(void *pvThis)
+{
+    NOREF(pvThis);
+    return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
+ */
+static DECLCALLBACK(int) memFssIos_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    PMEMIOSTREAM pThis = (PMEMIOSTREAM)pvThis;
+    switch (enmAddAttr)
+    {
+        case RTFSOBJATTRADD_NOTHING:
+        case RTFSOBJATTRADD_UNIX:
+            RT_ZERO(*pObjInfo);
+            pObjInfo->cbObject = pThis->cbBuf;
+            break;
+        default:
+            return VERR_NOT_SUPPORTED;
+    }
+    return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnRead}
+ */
+static DECLCALLBACK(int) memFssIos_Read(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead)
+{
+    PMEMIOSTREAM pThis = (PMEMIOSTREAM)pvThis;
+    Assert(pSgBuf->cSegs == 1);
+
+    if (off < 0)
+        off = pThis->off;
+    if (off >= (RTFOFF)pThis->cbBuf)
+        return pcbRead ? VINF_EOF : VERR_EOF;
+
+    size_t cbLeft = pThis->cbBuf - off;
+    size_t cbToRead = pSgBuf->paSegs[0].cbSeg;
+    if (cbToRead > cbLeft)
+    {
+        if (!pcbRead)
+            return VERR_EOF;
+        cbToRead = (size_t)cbLeft;
+    }
+
+    memcpy(pSgBuf->paSegs[0].pvSeg, pThis->pu8Buf + off, cbToRead);
+    pThis->off = off + cbToRead;
+    if (pcbRead)
+        *pcbRead = cbToRead;
+
+    return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnWrite}
+ */
+static DECLCALLBACK(int) memFssIos_Write(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbWritten)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnFlush}
+ */
+static DECLCALLBACK(int) memFssIos_Flush(void *pvThis)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnPollOne}
+ */
+static DECLCALLBACK(int) memFssIos_PollOne(void *pvThis, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr, uint32_t *pfRetEvents)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnTell}
+ */
+static DECLCALLBACK(int) memFssIos_Tell(void *pvThis, PRTFOFF poffActual)
+{
+    PMEMIOSTREAM pThis = (PMEMIOSTREAM)pvThis;
+    *poffActual = pThis->off;
+    return VINF_SUCCESS;
+}
+
+/**
+ * Memory I/O object stream operations.
+ */
+static const RTVFSIOSTREAMOPS g_memFssIosOps =
+{
+    { /* Obj */
+        RTVFSOBJOPS_VERSION,
+        RTVFSOBJTYPE_IO_STREAM,
+        "MemFsStream::IoStream",
+        memFssIos_Close,
+        memFssIos_QueryInfo,
+        RTVFSOBJOPS_VERSION
+    },
+    RTVFSIOSTREAMOPS_VERSION,
+    RTVFSIOSTREAMOPS_FEAT_NO_SG,
+    memFssIos_Read,
+    memFssIos_Write,
+    memFssIos_Flush,
+    memFssIos_PollOne,
+    memFssIos_Tell,
+    NULL /*Skip*/,
+    NULL /*ZeroFill*/,
+    RTVFSIOSTREAMOPS_VERSION
+};
+
+RTDECL(int) RTZipPkzipMemDecompress(void **ppvDst, size_t *pcbDst, const void *pvSrc, size_t cbSrc, const char *pszObject)
+{
+    PMEMIOSTREAM pIosData;
+    RTVFSIOSTREAM hVfsIos;
+    int rc = RTVfsNewIoStream(&g_memFssIosOps,
+                              sizeof(*pIosData),
+                              RTFILE_O_READ | RTFILE_O_DENY_WRITE | RTFILE_O_OPEN,
+                              NIL_RTVFS,
+                              NIL_RTVFSLOCK,
+                              &hVfsIos,
+                              (void **)&pIosData);
+    if (RT_SUCCESS(rc))
+    {
+        pIosData->pu8Buf = (uint8_t*)pvSrc;
+        pIosData->cbBuf  = cbSrc;
+        pIosData->off    = 0;
+        RTVFSFSSTREAM hVfsFss;
+        rc = RTZipPkzipFsStreamFromIoStream(hVfsIos, 0 /*fFlags*/, &hVfsFss);
+        RTVfsIoStrmRelease(hVfsIos);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Loop through all objects. Actually this wouldn't be required
+             * for .zip files but we opened it as I/O stream.
+             */
+            for (bool fFound = false; !fFound;)
+            {
+                char        *pszName;
+                RTVFSOBJ    hVfsObj;
+                rc = RTVfsFsStrmNext(hVfsFss, &pszName, NULL /*penmType*/, &hVfsObj);
+                if (RT_FAILURE(rc))
+                    break;
+                fFound = !strcmp(pszName, pszObject);
+                if (fFound)
+                {
+                    RTFSOBJINFO UnixInfo;
+                    rc = RTVfsObjQueryInfo(hVfsObj, &UnixInfo, RTFSOBJATTRADD_UNIX);
+                    if (RT_SUCCESS(rc))
+                    {
+                        size_t cb = UnixInfo.cbObject;
+                        void *pv = RTMemAlloc(cb);
+                        if (pv)
+                        {
+                            RTVFSIOSTREAM hVfsIosObj = RTVfsObjToIoStream(hVfsObj);
+                            if (hVfsIos)
+                            {
+                                rc = RTVfsIoStrmRead(hVfsIosObj, pv, cb, true /*fBlocking*/, NULL);
+                                if (RT_SUCCESS(rc))
+                                {
+                                    *ppvDst = pv;
+                                    *pcbDst = cb;
+                                }
+                                else
+                                    RTMemFree(pv);
+                            }
+                        }
+                    }
+                }
+                RTVfsObjRelease(hVfsObj);
+                RTStrFree(pszName);
+            }
+            RTVfsFsStrmRelease(hVfsFss);
+        }
+    }
+    return rc;
+}
diff --git a/src/VBox/Runtime/common/zip/pkzipvfs.cpp b/src/VBox/Runtime/common/zip/pkzipvfs.cpp
new file mode 100644
index 0000000..cc0567e
--- /dev/null
+++ b/src/VBox/Runtime/common/zip/pkzipvfs.cpp
@@ -0,0 +1,1277 @@
+/* $Id: pkzipvfs.cpp $ */
+/** @file
+ * IPRT - PKZIP Virtual Filesystem.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/******************************************************************************
+ *   Header Files                                                             *
+ ******************************************************************************/
+#include <iprt/zip.h>
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/file.h>
+#include <iprt/mem.h>
+#include <iprt/poll.h>
+#include <iprt/string.h>
+#include <iprt/vfs.h>
+#include <iprt/vfslowlevel.h>
+#include <iprt/stream.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/* See http://www.pkware.com/documents/casestudies/APPNOTE.TXT */
+
+/**
+ * PKZip Local File Header.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIPLOCALFILEHDR
+{
+    /** Magic value, see RTZIPPKZIPLOCALFILEHDR_MAGIC. */
+    uint32_t                u32Magic;
+    /** Minimum version needed to extract. */
+    uint16_t                u16Version;
+    /** General purpose bit flag. */
+    uint16_t                fFlags;
+    /** Compression method. See RTZIPPKZIP_COMP_METHOD_XXX. */
+    uint16_t                u16ComprMethod;
+    /** Last modified time, MS-DOS format: HHHHHMMM MMMSSSSS, multiply seconds by 2 */
+    uint16_t                u16LastModifiedTime;
+    /** Last modified date, MS-DOS format: YYYYYYYM MMMDDDDD, year starts at 1980 */
+    uint16_t                u16LastModifiedDate;
+    /** Checksum. */
+    uint32_t                u32Crc;
+    /** Compressed size. */
+    uint32_t                cbCompressed;
+    /** Uncompressed size. */
+    uint32_t                cbUncompressed;
+    /** Length of the file name. */
+    uint16_t                cbFilename;
+    /** Length of the extra field. */
+    uint16_t                cbExtra;
+    /** Start of the file name. */
+    uint8_t                 u8Filename;
+} RTZIPPKZIPLOCALFILEHDR;
+#pragma pack()
+AssertCompileSize(RTZIPPKZIPLOCALFILEHDR, 30+1);
+/** Pointer to PKZip Local File Header. */
+typedef RTZIPPKZIPLOCALFILEHDR *PRTZIPPKZIPLOCALFILEHDR;
+
+#define RTZIPPKZIPLOCALFILEHDR_MAGIC        RT_MAKE_U32_FROM_U8('P','K','\003','\004')
+
+/**
+ * PKZip compression method.
+ */
+typedef enum RTZIPPKZIP_COMP_METHOD
+{
+    /** No compression */
+    RTZIPPKZIP_COMP_METHOD_STORED = 0,
+    /** Shrunk */
+    RTZIPPKZIP_COMP_METHOD_SHRUNK = 1,
+    /** Reduced with compression factor 1 */
+    RTZIPPKZIP_COMP_METHOD_REDUCED1 = 2,
+    /** Reduced with compression factor 2 */
+    RTZIPPKZIP_COMP_METHOD_REDUCED2 = 3,
+    /** Reduced with compression factor 3 */
+    RTZIPPKZIP_COMP_METHOD_REDUCED3 = 4,
+    /** Reduced with compression factor 4 */
+    RTZIPPKZIP_COMP_METHOD_REDUCED4 = 5,
+    /** Imploded */
+    RTZIPPKZIP_COMP_METHOD_IMPLODED = 6,
+    /** Deflated */
+    RTZIPPKZIP_COMP_METHOD_DEFLATED = 8,
+    /** Deflated64 */
+    RTZIPPKZIP_COMP_METHOD_DEFLATED64 = 9,
+    /* Compressed using bzip2 */
+    RTZIPPKZIP_COMP_METHOD_BZIP2 = 12,
+    /** Compressed using LZMA */
+    RTZIPPKZIP_COMP_METHOD_LZMA = 14
+} RTZIPPKZIP_COMP_METHOD;
+
+/**
+ * PKZip Central Directory Header.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIPCENTRDIRHDR
+{
+    /** The magic value. See RTZIPPKZIPCENTRDIRHDR_MAGIC. */
+    uint32_t                u32Magic;
+    /** The version used for creating the item. */
+    uint16_t                u16VerMade;
+    /** The minimum version required for extracting the item. */
+    uint16_t                u16VerRequired;
+    /** General purpose flags. */
+    uint16_t                fFlags;
+    /** Compresstion method. See RTZIPPKZIP_COMP_METHOD_XXX */
+    uint16_t                u16ComprMethod;
+    /** Last modified time, MS-DOS format: HHHHHMMM MMMSSSSS, multiply seconds by 2 */
+    uint16_t                u16LastModifiedTime;
+    /** Last modified date, MS-DOS format: YYYYYYYM MMMDDDDD, year starts at 1980 */
+    uint16_t                u16LastModifiedDate;
+    /** Checksum. */
+    uint32_t                u32Crc;
+    /** Compressed size. */
+    uint32_t                cbCompressed;
+    /** Uncompressed size. */
+    uint32_t                cbUncompressed;
+    /** Length of the object file name. */
+    uint16_t                cbFilename;
+    /** Length of the extra field. */
+    uint16_t                cbExtra;
+    /** Length of the object comment. */
+    uint16_t                cbComment;
+    /** The number of the disk on which this file begins. */
+    uint16_t                iDiskStart;
+    /** Internal attributes. */
+    uint16_t                u16IntAttrib;
+    /** External attributes. */
+    uint32_t                u32ExtAttrib;
+    /** Offset from the start of the first disk on which this file appears to
+     * where the local file header should be found. */
+    uint32_t                offLocalFileHeader;
+    /** Start of the file name. */
+    uint8_t                 u8Filename;
+} RTZIPPKZIPCENTRDIRHDR;
+#pragma pack()
+AssertCompileSize(RTZIPPKZIPCENTRDIRHDR, 46+1);
+/** Pointer to the PKZip Central Directory Header. */
+typedef RTZIPPKZIPCENTRDIRHDR *PRTZIPPKZIPCENTRDIRHDR;
+
+#define RTZIPPKZIPCENTRDIRHDR_MAGIC         RT_MAKE_U32_FROM_U8('P','K','\001','\002')
+
+/**
+ * PKZip End of Central Directory Record.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIPENDOFCENTRDIRREC
+{
+    /** The magic value. See RTZIPPKZIPENDOFCENTRDIRREC_MAGIC. */
+    uint32_t                u32Magic;
+    /** Number of this disk. */
+    uint16_t                iThisDisk;
+    /** Number of the disk with the start of the Central Directory. */
+    uint16_t                iDiskStartCentrDirectory;
+    /** Number of Central Directory entries on this disk. */
+    uint16_t                cCentrDirRecordsThisDisk;
+    /** Number of Central Directory records. */
+    uint16_t                cCentrDirRecords;
+    /** Size of the Central Directory in bytes. */
+    uint32_t                cbCentrDir;
+    /** Offset of the Central Directory. */
+    uint32_t                offCentrDir;
+    /** Size of the comment in bytes. */
+    uint16_t                cbComment;
+    /** Start of the comment. */
+    uint8_t                 u8Comment;
+} RTZIPPKZIPENDOFCENTRDIRREC;
+#pragma pack()
+AssertCompileSize(RTZIPPKZIPENDOFCENTRDIRREC, 22+1);
+/** Pointer to the PKZip End of Central Directory Record. */
+typedef RTZIPPKZIPENDOFCENTRDIRREC const *PCRTZIPPKZIPENDOFCENTRDIRREC;
+
+#define RTZIPPKZIPENDOFCENTRDIRREC_MAGIC    RT_MAKE_U32_FROM_U8('P','K','\005','\006')
+
+/**
+ * PKZip ZIP64 End of Central Directory Record.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIP64ENDOFCENTRDIRREC
+{
+    /** The magic value. See RTZIPPKZIP64ENDOFCENTRDIRREC_MAGIC. */
+    uint32_t                u32Magic;
+    /** Size of Zip64 end of Central Directory Record. */
+    uint64_t                cbSizeEocdr;
+    /** The version used for creating the item. */
+    uint16_t                u16VerMade;
+    /** The minimum version required for extracting the item. */
+    uint16_t                u16VerRequired;
+    /** Number of this disk. */
+    uint32_t                iThisDisk;
+    /** Number of the disk with the start of the Central Directory. */
+    uint32_t                iDiskStartCentrDirectory;
+    /** Number of Central Directory entries on this disk. */
+    uint64_t                cCentrDirRecordsThisDisk;
+    /** Number of Central Directory records. */
+    uint64_t                cCentrDirRecords;
+    /** Size of the Central Directory in bytes. */
+    uint64_t                cbCentrDir;
+    /** Offset of the Central Directory. */
+    uint64_t                offCentrDir;
+} RTZIPPKZIP64ENDOFCENTRDIRREC;
+#pragma pack()
+AssertCompileSize(RTZIPPKZIP64ENDOFCENTRDIRREC, 56);
+/** Pointer to the 64-bit PKZip End of Central Directory Record. */
+typedef RTZIPPKZIP64ENDOFCENTRDIRREC *PRTZIPPKZIP64ENDOFCENTRDIRREC;
+
+#define RTZIPPKZIP64ENDOFCENTRDIRREC_MAGIC  RT_MAKE_U32_FROM_U8('P','K','\006','\006')
+
+/**
+ * PKZip ZIP64 End of Central Directory Locator.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIP64ENDOFCENTRDIRLOC
+{
+    /** The magic value. See RTZIPPKZIP64ENDOFCENTRDIRLOC_MAGIC. */
+    uint32_t                u32Magic;
+    /** Number of the disk with the start of the ZIP64 End of Central Directory. */
+    uint32_t                iDiskStartCentrDir;
+    /** Relative offset of the ZIP64 End of Central Directory Record. */
+    uint64_t                offEndOfCentrDirRec;
+    /** Total number of disks. */
+    uint32_t                cDisks;
+} RTZIPPKZIP64ENDOFCENTRDIRLOC;
+#pragma pack()
+AssertCompileSize(RTZIPPKZIP64ENDOFCENTRDIRLOC, 20);
+
+#define RTZIPPKZIP64ENDOFCENTRDIRLOC_MAGIC  RT_MAKE_U32_FROM_U8('P','K','\006','\007')
+
+/**
+ * PKZip ZIP64 Extended Information Extra Field.
+ */
+#pragma pack(1)
+typedef struct RTZIPPKZIP64EXTRAFIELD
+{
+    /** Uncompressed size. */
+    uint64_t                cbUncompressed;
+    /** Compressed size. */
+    uint64_t                cbCompressed;
+    /** Offset from the start of the first disk on which this file appears to
+     * where the local file header should be found. */
+    uint64_t                offLocalFileHeader;
+    /** The number of the disk on which this file begins. */
+    uint32_t                iDiskStart;
+} RTZIPPKZIP64EXTRAFIELD;
+#pragma pack()
+/** Pointer to the ZIP64 Extended Information Extra Field. */
+typedef RTZIPPKZIP64EXTRAFIELD *PRTZIPPKZIP64EXTRAFIELD;
+AssertCompileSize(RTZIPPKZIP64EXTRAFIELD, 28);
+
+/**
+ * PKZip reader instance data.
+ */
+typedef struct RTZIPPKZIPREADER
+{
+    /** Set if we have the End of Central Directory record. */
+    bool                    fHaveEocd;
+    /** The Central Directory header. */
+    RTZIPPKZIPCENTRDIRHDR   cdh;
+    /** ZIP64 extended information. */
+    RTZIPPKZIP64EXTRAFIELD  cd64ex;
+    /** Set if ZIP64 End of Central Directory Locator is present (archive setting). */
+    bool                    fZip64Eocd;
+    /** Set if cd64ex is valid for the current file header (object setting). */
+    bool                    fZip64Ex;
+    /* The name of the current object. */
+    char                    szName[RTPATH_MAX];
+} RTZIPPKZIPREADER;
+/** Pointer to the PKZip reader instance data. */
+typedef RTZIPPKZIPREADER *PRTZIPPKZIPREADER;
+
+/**
+ * Pkzip object (directory).
+ */
+typedef struct RTZIPPKZIPBASEOBJ
+{
+    /** Pointer to the reader instance data (resides in the filesystem
+     * stream). */
+    PRTZIPPKZIPREADER       pPkzipReader;
+    /** The object info with unix attributes. */
+    RTFSOBJINFO             ObjInfo;
+} RTZIPPKZIPBASEOBJ;
+/** Pointer to a PKZIP filesystem stream base object. */
+typedef RTZIPPKZIPBASEOBJ *PRTZIPPKZIPBASEOBJ;
+
+/**
+ * Pkzip object (file) represented as a VFS I/O stream.
+ */
+typedef struct RTZIPPKZIPIOSTREAM
+{
+    /** The basic PKZIP object data. */
+    RTZIPPKZIPBASEOBJ       BaseObj;
+    /** The number of (uncompressed) bytes in the file. */
+    uint64_t                cbFile;
+    /** The current file position at uncompressed file data. */
+    uint64_t                offFile;
+    /** The start position of the compressed data in the hVfsIos. */
+    uint64_t                offCompStart;
+    /** The current position for decompressing bytes in the hVfsIos. */
+    uint64_t                offComp;
+    /** The number of compressed bytes starting at offCompStart. */
+    uint64_t                cbComp;
+    /** Set if we have to pass the type function the next time the input
+     * function is called. */
+    bool                    fPassZipType;
+    /** Set if we've reached the end of the file. */
+    bool                    fEndOfStream;
+    /** Pkzip compression method for this object. */
+    RTZIPPKZIP_COMP_METHOD  enmCompMethod;
+    /** Zip compression method. */
+    RTZIPTYPE               enmZipType;
+    /** The decompressor instance. */
+    PRTZIPDECOMP            pZip;
+    /** The input I/O stream. */
+    RTVFSIOSTREAM           hVfsIos;
+} RTZIPPKZIPIOSTREAM;
+/** Pointer to a the private data of a PKZIP file I/O stream. */
+typedef RTZIPPKZIPIOSTREAM *PRTZIPPKZIPIOSTREAM;
+
+
+/**
+ * PKZip filesystem stream private data. The stream must be seekable!
+ */
+typedef struct RTZIPPKZIPFSSTREAM
+{
+    /** The input I/O stream. */
+    RTVFSIOSTREAM           hVfsIos;
+
+    /** The current object (referenced). */
+    RTVFSOBJ                hVfsCurObj;
+    /** Pointer to the private data if hVfsCurObj is representing a file. */
+    PRTZIPPKZIPIOSTREAM     pCurIosData;
+
+    /** The offset of the first Central Directory header. */
+    uint64_t                offFirstCdh;
+    /** The offset of the next Central Directory header. */
+    uint64_t                offNextCdh;
+
+    /** Size of the central directory. */
+    uint64_t                cbCentrDir;
+    /** Current central directory entry. */
+    uint64_t                iCentrDirEntry;
+    /** Number of central directory entries. */
+    uint64_t                cCentrDirEntries;
+
+    /** Set if we have the End of Central Directory Record. */
+    bool                    fHaveEocd;
+    /** Set if we've reached the end of the stream. */
+    bool                    fEndOfStream;
+    /** Set if we've encountered a fatal error. */
+    int                     rcFatal;
+
+    /** The PKZIP reader instance data. */
+    RTZIPPKZIPREADER        PkzipReader;
+} RTZIPPKZIPFSSTREAM;
+/** Pointer to a the private data of a PKZIP filesystem stream. */
+typedef RTZIPPKZIPFSSTREAM *PRTZIPPKZIPFSSTREAM;
+
+
+
+/**
+ * Decode date/time from DOS format as used in PKZip.
+ */
+static int rtZipPkzipReaderDecodeDosTime(PRTTIMESPEC pTimeSpec, uint16_t u16Time, uint16_t u16Date)
+{
+    RTTIME time;
+    RT_ZERO(time);
+    time.i32Year    = ((u16Date & 0xfe00) >>  9) + 1980;
+    time.u8Month    =  (u16Date & 0x01e0) >>  5;
+    time.u8MonthDay =   u16Date & 0x001f;
+    time.u8Hour     =  (u16Time & 0xf800) >> 11;
+    time.u8Minute   =  (u16Time & 0x07e0) >>  5;
+    time.u8Second   =   u16Time & 0x001f;
+    RTTimeNormalize(&time);
+    RTTimeImplode(pTimeSpec, &time);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Parse the Local File Header.
+ * Just skip the data as we trust the Central Directory.
+ */
+static int rtZipPkzipParseLocalFileHeader(PRTZIPPKZIPREADER pThis, PRTZIPPKZIPLOCALFILEHDR pLfh, size_t *pcbExtra)
+{
+    if (pLfh->cbFilename >= sizeof(pThis->szName))
+        return VERR_PKZIP_NAME_TOO_LONG;
+
+    *pcbExtra = pLfh->cbFilename + pLfh->cbExtra;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Parse the Central Directory Header.
+ */
+static int rtZipPkzipParseCentrDirHeader(PRTZIPPKZIPREADER pThis, PRTZIPPKZIPCENTRDIRHDR pCdh, size_t *pcbExtra)
+{
+    if (pCdh->u32Magic != RTZIPPKZIPCENTRDIRHDR_MAGIC)
+        return VERR_PKZIP_BAD_CDF_HEADER;
+
+    if (pCdh->cbFilename >= sizeof(pThis->szName))
+        return VERR_PKZIP_NAME_TOO_LONG;
+
+    *pcbExtra = pCdh->cbFilename + pCdh->cbExtra + pCdh->cbComment;
+
+    pThis->cdh = *pCdh;
+    pThis->fZip64Ex = false;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Return the offset of the Local File Header.
+ */
+static uint64_t rtZipPkzipReaderOffLocalHeader(PRTZIPPKZIPREADER pThis)
+{
+    if (pThis->fZip64Ex && pThis->cdh.offLocalFileHeader == (uint32_t)-1)
+        return pThis->cd64ex.offLocalFileHeader;
+
+    return pThis->cdh.offLocalFileHeader;
+}
+
+
+/**
+ * Return the uncompressed object size.
+ */
+static uint64_t rtZipPkzipReaderUncompressed(PRTZIPPKZIPREADER pThis)
+{
+    if (pThis->fZip64Ex && pThis->cdh.cbUncompressed == (uint32_t)-1)
+        return pThis->cd64ex.cbUncompressed;
+    
+    return pThis->cdh.cbUncompressed;
+}
+
+
+/**
+ * Return the compressed object size.
+ */
+static uint64_t rtZipPkzipReaderCompressed(PRTZIPPKZIPREADER pThis)
+{
+    if (pThis->fZip64Ex && pThis->cdh.cbCompressed == (uint32_t)-1)
+        return pThis->cd64ex.cbCompressed;
+    
+    return pThis->cdh.cbCompressed;
+}
+
+
+/**
+ * Parse the extra part of the Central Directory Header.
+ */
+static int rtZipPkzipParseCentrDirHeaderExtra(PRTZIPPKZIPREADER pThis, uint8_t *pu8Buf, size_t cb,
+                                              RTZIPPKZIP_COMP_METHOD *penmCompMethod, uint64_t *pcbCompressed)
+{
+    int rc = RTStrCopyEx(pThis->szName, sizeof(pThis->szName), (const char*)pu8Buf, pThis->cdh.cbFilename);
+    if (RT_SUCCESS(rc))
+    {
+        uint8_t *offStart = pu8Buf;
+        pu8Buf += pThis->cdh.cbFilename;
+        cb      = pThis->cdh.cbExtra;
+        while (cb >= 4)
+        {
+            uint16_t idExtra = *(uint16_t*)pu8Buf;
+            pu8Buf += 2;
+            uint16_t cbExtra = *(uint16_t*)pu8Buf;
+            pu8Buf += 2;
+            cb     -= 4;
+
+            if (cb >= cbExtra)
+            {
+                switch (idExtra)
+                {
+                    case 0x0001:
+                        /*
+                         * ZIP64 Extended Information Extra Field.
+                         */
+                        if (!pThis->fZip64Eocd)
+                            return VERR_PKZIP_ZIP64EX_IN_ZIP32;
+                        /* Not all fields are really used. */
+                        RT_ZERO(pThis->cd64ex);
+                        memcpy(&pThis->cd64ex, pu8Buf, cbExtra);
+                        pThis->fZip64Ex = true;
+                        break;
+
+                    default:
+                        /* unknown, just skip */
+                        break;
+                }
+                pu8Buf += cbExtra;
+                cb     -= cbExtra;
+            }
+            else
+            {
+                rc = VERR_PKZIP_BAD_CDF_HEADER;
+                break;
+            }
+        }
+
+        *penmCompMethod = (RTZIPPKZIP_COMP_METHOD)pThis->cdh.u16ComprMethod;
+        *pcbCompressed  = rtZipPkzipReaderCompressed(pThis);
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Translate a PKZip header to an IPRT object info structure.
+ */
+static int rtZipPkzipReaderGetFsObjInfo(PRTZIPPKZIPREADER pThis, PRTFSOBJINFO pObjInfo)
+{
+    /*
+     * Zap the whole structure, this takes care of unused space in the union.
+     */
+    RT_ZERO(*pObjInfo);
+    pObjInfo->cbObject = rtZipPkzipReaderUncompressed(pThis);
+    pObjInfo->cbAllocated = rtZipPkzipReaderUncompressed(pThis); /* XXX */
+    RTTIMESPEC ts;
+    rtZipPkzipReaderDecodeDosTime(&ts, pThis->cdh.u16LastModifiedTime, pThis->cdh.u16LastModifiedDate);
+    pObjInfo->ChangeTime = ts;
+    pObjInfo->ModificationTime = ts;
+    pObjInfo->AccessTime = ts;
+    pObjInfo->BirthTime = ts;
+    const char *pszEnd = strchr(pThis->szName, '\0');
+    if (pszEnd == &pThis->szName[0] || pszEnd[-1] != '/')
+        pObjInfo->Attr.fMode = RTFS_TYPE_FILE \
+                             | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR \
+                             | RTFS_UNIX_IRGRP \
+                             | RTFS_UNIX_IROTH;
+    else
+        pObjInfo->Attr.fMode = RTFS_TYPE_DIRECTORY \
+                             | RTFS_UNIX_IRWXU \
+                             | RTFS_UNIX_IRGRP | RTFS_UNIX_IXGRP \
+                             | RTFS_UNIX_IROTH | RTFS_UNIX_IXOTH;
+    pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX;
+    pObjInfo->Attr.u.Unix.cHardlinks = 1;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Search the magic value of the End Of Central Directory Record.
+ *
+ * @returns true if found, false otherwise.
+ * @param   pu8Buf      buffer.
+ * @param   cb          size of buffer.
+ * @param   piPos       where to store the position of the magic value.
+ */
+static bool rtZipPkzipReaderScanEocd(const uint8_t *pu8Buf, size_t cb, int *piPos)
+{
+    if (cb < 4)
+        return false;
+    ssize_t i;
+    for (i = (ssize_t)cb - 4; i >= 0; --i)
+        if (*(uint32_t*)(pu8Buf + i) == RTZIPPKZIPENDOFCENTRDIRREC_MAGIC)
+        {
+            *piPos = i;
+            return true;
+        }
+    return false;
+}
+
+
+/**
+ * Read the Local File Header. We ignore the content -- we trust the Central
+ * Directory.
+ */
+static int rtZipPkzipFssIosReadLfh(PRTZIPPKZIPFSSTREAM pThis, uint64_t *poffStartData)
+{
+    RTZIPPKZIPLOCALFILEHDR lfh;
+    uint64_t offLocalFileHeader = rtZipPkzipReaderOffLocalHeader(&pThis->PkzipReader);
+    int rc = RTVfsIoStrmReadAt(pThis->hVfsIos, offLocalFileHeader,
+                               &lfh, sizeof(lfh) - 1, true /*fBlocking*/, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        if (lfh.u32Magic == RTZIPPKZIPLOCALFILEHDR_MAGIC)
+        {
+            size_t cbExtra = 0;
+            rc = rtZipPkzipParseLocalFileHeader(&pThis->PkzipReader, &lfh, &cbExtra);
+            if (RT_SUCCESS(rc))
+            {
+                /* Just skip the file name and and extra field. We use the data
+                 * from the Central Directory Header. */
+                rc = RTVfsIoStrmSkip(pThis->hVfsIos, cbExtra);
+                if (RT_SUCCESS(rc))
+                    *poffStartData = offLocalFileHeader + sizeof(lfh) - 1 + cbExtra;
+            }
+        }
+        else
+            rc = VERR_PKZIP_BAD_LF_HEADER;
+    }
+
+    return rc;
+}
+
+
+/**
+ * Scan the current Central Directory Header.
+ */
+static int rtZipPkzipFssIosReadCdh(PRTZIPPKZIPFSSTREAM pThis, uint64_t *poffStartData,
+                                    RTZIPPKZIP_COMP_METHOD *penmCompMethod, uint64_t *pcbCompressed)
+{
+    int rc;
+
+    uint64_t offCd = pThis->offNextCdh - pThis->offFirstCdh;
+    if (   pThis->iCentrDirEntry < pThis->cCentrDirEntries
+        || offCd + sizeof(RTZIPPKZIPCENTRDIRHDR) - 1 <= pThis->cbCentrDir)
+    {
+        RTZIPPKZIPCENTRDIRHDR cdh;
+        rc = RTVfsIoStrmReadAt(pThis->hVfsIos, pThis->offNextCdh,
+                               &cdh, sizeof(cdh) - 1, true /*fBlocking*/, NULL);
+        if (RT_SUCCESS(rc))
+        {
+            pThis->offNextCdh += sizeof(cdh) - 1;
+            pThis->iCentrDirEntry++;
+            size_t cbExtra = 0;
+            rc = rtZipPkzipParseCentrDirHeader(&pThis->PkzipReader, &cdh, &cbExtra);
+            if (RT_SUCCESS(rc))
+            {
+                if (offCd + sizeof(RTZIPPKZIPCENTRDIRHDR) - 1 + cbExtra <= pThis->cbCentrDir)
+                {
+                    /* extra data up to 64k */
+                    uint8_t *pu8Buf = (uint8_t*)RTMemTmpAlloc(cbExtra);
+                    if (pu8Buf)
+                    {
+                        rc = RTVfsIoStrmRead(pThis->hVfsIos, pu8Buf, cbExtra, true /*fBlocking*/, NULL);
+                        if (RT_SUCCESS(rc))
+                        {
+                            rc = rtZipPkzipParseCentrDirHeaderExtra(&pThis->PkzipReader, pu8Buf, cbExtra,
+                                                                    penmCompMethod, pcbCompressed);
+                            if (RT_SUCCESS(rc))
+                                rc = rtZipPkzipFssIosReadLfh(pThis, poffStartData);
+                        }
+                        pThis->offNextCdh += cbExtra;
+                        RTMemTmpFree(pu8Buf);
+                    }
+                    else
+                        rc = VERR_NO_MEMORY;
+                }
+                else
+                    rc = VERR_EOF;
+            }
+        }
+    }
+    else
+        rc = VERR_EOF;
+
+    return rc;
+}
+
+
+/**
+ * Scan for the End of Central Directory Record. Of course this works not if
+ * the stream is non-seekable (i.e. a pipe).
+ */
+static int rtZipPkzipFssIosReadEocb(PRTZIPPKZIPFSSTREAM pThis)
+{
+    RTFSOBJINFO Info;
+    int rc = RTVfsIoStrmQueryInfo(pThis->hVfsIos, &Info, RTFSOBJATTRADD_UNIX);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    uint64_t cbFile = Info.cbObject;
+    if (cbFile < sizeof(RTZIPPKZIPENDOFCENTRDIRREC)-1)
+        return VERR_PKZIP_NO_EOCB;
+
+    /* search for start of the 'end of Central Directory Record' */
+    size_t cbBuf = RT_MIN(_1K, cbFile);
+    uint8_t *pu8Buf = (uint8_t*)RTMemTmpAlloc(cbBuf);
+    if (!pu8Buf)
+        return VERR_NO_MEMORY;
+
+    /* maximum size of EOCD comment 2^16-1 */
+    const size_t cbHdrMax = 0xffff + sizeof(RTZIPPKZIPENDOFCENTRDIRREC) - 1;
+    uint64_t offMin = cbFile >= cbHdrMax ? cbFile - cbHdrMax : 0;
+
+    uint64_t off = cbFile - cbBuf;
+    while (off >= offMin)
+    {
+        rc = RTVfsIoStrmReadAt(pThis->hVfsIos, off, pu8Buf, cbBuf, true /*fBlocking*/, NULL);
+        if (RT_FAILURE(rc))
+            break;
+        int offMagic;
+        if (rtZipPkzipReaderScanEocd(pu8Buf, cbBuf, &offMagic))
+        {
+            off += offMagic;
+            RTZIPPKZIPENDOFCENTRDIRREC eocd;
+            rc = RTVfsIoStrmReadAt(pThis->hVfsIos, off, &eocd, sizeof(eocd) - 1,
+                                   true /*fBlocking*/, NULL);
+            if (RT_SUCCESS(rc))
+            {
+                /* well, this shouldn't fail if the content didn't change */
+                if (eocd.u32Magic == RTZIPPKZIPENDOFCENTRDIRREC_MAGIC)
+                {
+                    /* sanity check */
+                    if (off + RT_OFFSETOF(RTZIPPKZIPENDOFCENTRDIRREC, u8Comment) + eocd.cbComment == cbFile)
+                    {
+                        pThis->offFirstCdh = eocd.offCentrDir;
+                        pThis->offNextCdh = eocd.offCentrDir;
+                        pThis->iCentrDirEntry = 0;
+                        pThis->cCentrDirEntries = eocd.cCentrDirRecords;
+                        pThis->cbCentrDir = eocd.cbCentrDir;
+                        pThis->PkzipReader.fHaveEocd = true;
+                    }
+                    else
+                        rc = VERR_PKZIP_NO_EOCB;
+                }
+                else
+                    rc = VERR_PKZIP_NO_EOCB;
+            }
+            if (rc != VERR_PKZIP_NO_EOCB)
+                break;
+        }
+        else
+            rc = VERR_PKZIP_NO_EOCB;
+        /* overlap the following read */
+        off -= cbBuf - 4;
+    }
+
+    RTMemTmpFree(pu8Buf);
+
+    /*
+     * Now check for the presence of the Zip64 End of Central Directory Locator.
+     */
+    if (   RT_SUCCESS(rc)
+        && off > (unsigned)sizeof(RTZIPPKZIP64ENDOFCENTRDIRLOC))
+    {
+        off -= sizeof(RTZIPPKZIP64ENDOFCENTRDIRLOC);
+
+        RTZIPPKZIP64ENDOFCENTRDIRLOC eocd64loc;
+        rc = RTVfsIoStrmReadAt(pThis->hVfsIos, off, &eocd64loc, sizeof(eocd64loc), true /*fBlocking*/, NULL);
+        if (RT_SUCCESS(rc))
+        {
+            if (eocd64loc.u32Magic == RTZIPPKZIP64ENDOFCENTRDIRLOC_MAGIC)
+                pThis->PkzipReader.fZip64Eocd = true;
+        }
+    }
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnClose}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssBaseObj_Close(void *pvThis)
+{
+    PRTZIPPKZIPBASEOBJ pThis = (PRTZIPPKZIPBASEOBJ)pvThis;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssBaseObj_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    PRTZIPPKZIPBASEOBJ pThis = (PRTZIPPKZIPBASEOBJ)pvThis;
+
+    /*
+     * Copy the desired data.
+     */
+    switch (enmAddAttr)
+    {
+        case RTFSOBJATTRADD_NOTHING:
+        case RTFSOBJATTRADD_UNIX:
+            *pObjInfo = pThis->ObjInfo;
+            break;
+
+        case RTFSOBJATTRADD_UNIX_OWNER:
+            *pObjInfo = pThis->ObjInfo;
+            break;
+
+        case RTFSOBJATTRADD_UNIX_GROUP:
+            *pObjInfo = pThis->ObjInfo;
+            break;
+
+        case RTFSOBJATTRADD_EASIZE:
+            *pObjInfo = pThis->ObjInfo;
+            break;
+
+        default:
+            return VERR_NOT_SUPPORTED;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * PKZip filesystem base object operations (directory objects).
+ */
+static const RTVFSOBJOPS g_rtZipPkzipFssBaseObjOps =
+{
+    RTVFSOBJOPS_VERSION,
+    RTVFSOBJTYPE_BASE,
+    "PkzipFsStream::Obj",
+    rtZipPkzipFssBaseObj_Close,
+    rtZipPkzipFssBaseObj_QueryInfo,
+    RTVFSOBJOPS_VERSION
+};
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnClose}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIos_Close(void *pvThis)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+
+    RTVfsIoStrmRelease(pThis->hVfsIos);
+    pThis->hVfsIos = NIL_RTVFSIOSTREAM;
+
+    if (pThis->pZip)
+    {
+        RTZipDecompDestroy(pThis->pZip);
+        pThis->pZip = NULL;
+    }
+
+    return rtZipPkzipFssBaseObj_Close(&pThis->BaseObj);
+}
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIos_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+    return rtZipPkzipFssBaseObj_QueryInfo(&pThis->BaseObj, pObjInfo, enmAddAttr);
+}
+
+
+/**
+ * Callback function for rtZipPkzipFssIos_Read. For feeding compressed data
+ * into the decompressor function.
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIosReadHelper(void *pvThis, void *pvBuf, size_t cbToRead, size_t *pcbRead)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+    int rc = VINF_SUCCESS;
+    if (!cbToRead)
+        return rc;
+    if (   pThis->fPassZipType
+        && cbToRead > 0)
+    {
+        uint8_t *pu8Buf = (uint8_t*)pvBuf;
+        pu8Buf[0] = pThis->enmZipType;
+        pvBuf = &pu8Buf[1];
+        cbToRead--;
+        pThis->fPassZipType = false;
+    }
+    if (cbToRead > 0)
+    {
+        size_t cbRead = 0;
+        const size_t cbAvail = pThis->cbComp;
+        rc = RTVfsIoStrmReadAt(pThis->hVfsIos, pThis->offComp, pvBuf,
+                               RT_MIN(cbToRead, cbAvail), true /*fBlocking*/, &cbRead);
+        if (   RT_SUCCESS(rc)
+            && cbToRead > cbAvail)
+            rc = pcbRead ? VINF_EOF : VERR_EOF;
+        if (   rc == VINF_EOF
+            && !pcbRead)
+            rc = VERR_EOF;
+        pThis->offComp += cbRead;
+        if (pcbRead)
+            *pcbRead = cbRead;
+    }
+    return rc;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnRead}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIos_Read(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+    Assert(pSgBuf->cSegs == 1);
+
+    if (off < 0)
+        off = pThis->offFile;
+    if (off >= (RTFOFF)pThis->cbFile)
+        return pcbRead ? VINF_EOF : VERR_EOF;
+
+    Assert(pThis->cbFile >= pThis->offFile);
+    uint64_t cbLeft   = (uint64_t)(pThis->cbFile - pThis->offFile);
+    size_t   cbToRead = pSgBuf->paSegs[0].cbSeg;
+    if (cbToRead > cbLeft)
+    {
+        if (!pcbRead)
+            return VERR_EOF;
+        cbToRead = (size_t)cbLeft;
+    }
+
+    /*
+     * Restart decompression at start of stream or on backward seeking.
+     */
+    if (   !pThis->pZip
+        || !off
+        || off < (RTFOFF)pThis->offFile)
+    {
+        switch (pThis->enmCompMethod)
+        {
+            case RTZIPPKZIP_COMP_METHOD_STORED:
+                pThis->enmZipType = RTZIPTYPE_STORE;
+                break;
+
+            case RTZIPPKZIP_COMP_METHOD_DEFLATED:
+                pThis->enmZipType = RTZIPTYPE_ZLIB_NO_HEADER;
+                break;
+
+            default:
+                pThis->enmZipType = RTZIPTYPE_INVALID;
+                break;
+        }
+
+        if (pThis->pZip)
+        {
+            RTZipDecompDestroy(pThis->pZip);
+            pThis->pZip = NULL;
+        }
+        int rc = RTZipDecompCreate(&pThis->pZip, (void*)pThis, rtZipPkzipFssIosReadHelper);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    /*
+     * Skip bytes if necessary.
+     */
+    if (off > (RTFOFF)pThis->offFile)
+    {
+        uint8_t u8Buf[_1K];
+        while (off > (RTFOFF)pThis->offFile)
+        {
+            size_t cbSkip = off - pThis->offFile;
+            if (cbSkip > sizeof(u8Buf))
+                cbSkip = sizeof(u8Buf);
+            int rc = RTZipDecompress(pThis->pZip, u8Buf, cbSkip, NULL);
+            if (RT_FAILURE(rc))
+                return rc;
+            pThis->offFile += cbSkip;
+        }
+    }
+
+    /*
+     * Do the actual reading.
+     */
+    size_t cbReadStack = 0;
+    if (!pcbRead)
+        pcbRead = &cbReadStack;
+    int rc = RTZipDecompress(pThis->pZip, pSgBuf->paSegs[0].pvSeg, cbToRead, pcbRead);
+    pThis->offFile = off + *pcbRead;
+    if (pThis->offFile >= pThis->cbFile)
+    {
+        Assert(pThis->offFile == pThis->cbFile);
+        pThis->fEndOfStream = true;
+    }
+
+    return rc;
+}
+
+static DECLCALLBACK(int) rtZipPkzipFssIos_Write(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcWritten)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+static DECLCALLBACK(int) rtZipPkzipFssIos_Flush(void *pvThis)
+{
+    return VERR_NOT_IMPLEMENTED;
+}
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnPollOne}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIos_PollOne(void *pvThis, uint32_t fEvents, RTMSINTERVAL cMillies,
+                                                  bool fIntr, uint32_t *pfRetEvents)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+
+    /* When we've reached the end, read will be set to indicate it. */
+    if (   (fEvents & RTPOLL_EVT_READ)
+        && pThis->fEndOfStream)
+    {
+        int rc = RTVfsIoStrmPoll(pThis->hVfsIos, fEvents, 0, fIntr, pfRetEvents);
+        if (RT_SUCCESS(rc))
+            *pfRetEvents |= RTPOLL_EVT_READ;
+        else
+            *pfRetEvents = RTPOLL_EVT_READ;
+        return VINF_SUCCESS;
+    }
+
+    return RTVfsIoStrmPoll(pThis->hVfsIos, fEvents, cMillies, fIntr, pfRetEvents);
+}
+
+
+/**
+ * @interface_method_impl{RTVFSIOSTREAMOPS,pfnTell}
+ */
+static DECLCALLBACK(int) rtZipPkzipFssIos_Tell(void *pvThis, PRTFOFF poffActual)
+{
+    PRTZIPPKZIPIOSTREAM pThis = (PRTZIPPKZIPIOSTREAM)pvThis;
+    *poffActual = pThis->offFile;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Pkzip I/O object stream operations.
+ */
+static const RTVFSIOSTREAMOPS g_rtZipPkzipFssIosOps =
+{
+    { /* Obj */
+        RTVFSOBJOPS_VERSION,
+        RTVFSOBJTYPE_IO_STREAM,
+        "PkzipFsStream::IoStream",
+        rtZipPkzipFssIos_Close,
+        rtZipPkzipFssIos_QueryInfo,
+        RTVFSOBJOPS_VERSION
+    },
+    RTVFSIOSTREAMOPS_VERSION,
+    RTVFSIOSTREAMOPS_FEAT_NO_SG,
+    rtZipPkzipFssIos_Read,
+    rtZipPkzipFssIos_Write,
+    rtZipPkzipFssIos_Flush,
+    rtZipPkzipFssIos_PollOne,
+    rtZipPkzipFssIos_Tell,
+    NULL /*Skip*/,
+    NULL /*ZeroFill*/,
+    RTVFSIOSTREAMOPS_VERSION
+};
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnClose}
+ */
+static DECLCALLBACK(int) rtZipPkzipFss_Close(void *pvThis)
+{
+    PRTZIPPKZIPFSSTREAM pThis = (PRTZIPPKZIPFSSTREAM)pvThis;
+
+    RTVfsObjRelease(pThis->hVfsCurObj);
+    pThis->hVfsCurObj  = NIL_RTVFSOBJ;
+    pThis->pCurIosData = NULL;
+
+    RTVfsIoStrmRelease(pThis->hVfsIos);
+    pThis->hVfsIos = NIL_RTVFSIOSTREAM;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
+ */
+static DECLCALLBACK(int) rtZipPkzipFss_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
+{
+    PRTZIPPKZIPFSSTREAM pThis = (PRTZIPPKZIPFSSTREAM)pvThis;
+    /* Take the lazy approach here, with the sideffect of providing some info
+       that is actually kind of useful. */
+    return RTVfsIoStrmQueryInfo(pThis->hVfsIos, pObjInfo, enmAddAttr);
+}
+
+
+/**
+ * @interface_method_impl{RTVFSFSSTREAMOPS,pfnNext}
+ */
+static DECLCALLBACK(int) rtZipPkzipFss_Next(void *pvThis, char **ppszName, RTVFSOBJTYPE *penmType, PRTVFSOBJ phVfsObj)
+{
+    PRTZIPPKZIPFSSTREAM pThis = (PRTZIPPKZIPFSSTREAM)pvThis;
+
+    /*
+     * Dispense with the current object.
+     */
+    if (pThis->hVfsCurObj != NIL_RTVFSOBJ)
+    {
+        if (pThis->pCurIosData)
+        {
+            pThis->pCurIosData->fEndOfStream = true;
+            pThis->pCurIosData->offFile      = pThis->pCurIosData->cbFile;
+            pThis->pCurIosData = NULL;
+        }
+
+        RTVfsObjRelease(pThis->hVfsCurObj);
+        pThis->hVfsCurObj = NIL_RTVFSOBJ;
+    }
+
+    /*
+     * Check if we've already reached the end in some way.
+     */
+    if (pThis->fEndOfStream)
+        return VERR_EOF;
+    if (pThis->rcFatal != VINF_SUCCESS)
+        return pThis->rcFatal;
+
+    int rc = VINF_SUCCESS;
+
+    /*
+     * Read the end of Central Directory Record once.
+     */
+    if (!pThis->PkzipReader.fHaveEocd)
+        rc = rtZipPkzipFssIosReadEocb(pThis);
+    uint64_t offData = 0;
+
+    /*
+     * Parse the current Central Directory Header.
+     */
+    RTZIPPKZIP_COMP_METHOD enmCompMethod = RTZIPPKZIP_COMP_METHOD_STORED;
+    uint64_t cbCompressed = 0;
+    if (RT_SUCCESS(rc))
+        rc = rtZipPkzipFssIosReadCdh(pThis, &offData, &enmCompMethod, &cbCompressed);
+    if (RT_FAILURE(rc))
+        return pThis->rcFatal = rc;
+
+    /*
+     * Fill an object info structure from the current Pkzip state.
+     */
+    RTFSOBJINFO Info;
+    rc = rtZipPkzipReaderGetFsObjInfo(&pThis->PkzipReader, &Info);
+    if (RT_FAILURE(rc))
+        return pThis->rcFatal = rc;
+
+    /*
+     * Create an object of the appropriate type.
+     */
+    RTVFSOBJTYPE enmType;
+    RTVFSOBJ hVfsObj;
+    RTFMODE fType = Info.Attr.fMode & RTFS_TYPE_MASK;
+    switch (fType)
+    {
+        case RTFS_TYPE_FILE:
+            RTVFSIOSTREAM hVfsIos;
+            PRTZIPPKZIPIOSTREAM pIosData;
+            rc = RTVfsNewIoStream(&g_rtZipPkzipFssIosOps,
+                                  sizeof(*pIosData),
+                                  RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN,
+                                  NIL_RTVFS,
+                                  NIL_RTVFSLOCK,
+                                  &hVfsIos,
+                                  (void **)&pIosData);
+            if (RT_FAILURE(rc))
+                return pThis->rcFatal = rc;
+
+            pIosData->BaseObj.pPkzipReader = &pThis->PkzipReader;
+            pIosData->BaseObj.ObjInfo      = Info;
+            pIosData->cbFile               = Info.cbObject;
+            pIosData->offFile              = 0;
+            pIosData->offComp              = offData;
+            pIosData->offCompStart         = offData;
+            pIosData->cbComp               = cbCompressed;
+            pIosData->enmCompMethod        = enmCompMethod;
+            pIosData->fPassZipType         = true;
+            pIosData->hVfsIos              = pThis->hVfsIos;
+            RTVfsIoStrmRetain(pThis->hVfsIos);
+            pThis->pCurIosData = pIosData;
+            enmType = RTVFSOBJTYPE_IO_STREAM;
+            hVfsObj = RTVfsObjFromIoStream(hVfsIos);
+            RTVfsIoStrmRelease(hVfsIos);
+            break;
+
+        case RTFS_TYPE_DIRECTORY:
+            PRTZIPPKZIPBASEOBJ pBaseObjData;
+            rc = RTVfsNewBaseObj(&g_rtZipPkzipFssBaseObjOps,
+                                 sizeof(*pBaseObjData),
+                                 NIL_RTVFS,
+                                 NIL_RTVFSLOCK,
+                                 &hVfsObj,
+                                 (void **)&pBaseObjData);
+            if (RT_FAILURE(rc))
+                return pThis->rcFatal = rc;
+
+            pBaseObjData->pPkzipReader = &pThis->PkzipReader;
+            pBaseObjData->ObjInfo      = Info;
+            enmType = RTVFSOBJTYPE_BASE;
+            break;
+
+        default:
+            return pThis->rcFatal = VERR_PKZIP_UNKNOWN_TYPE_FLAG;
+    }
+    pThis->hVfsCurObj = hVfsObj;
+
+    if (ppszName)
+    {
+        rc = RTStrDupEx(ppszName, pThis->PkzipReader.szName);
+        if (RT_FAILURE(rc))
+            return pThis->rcFatal = rc;
+    }
+
+    if (phVfsObj)
+    {
+        RTVfsObjRetain(hVfsObj);
+        *phVfsObj = hVfsObj;
+    }
+
+    if (penmType)
+        *penmType = enmType;
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * PKZip filesystem stream operations.
+ */
+static const RTVFSFSSTREAMOPS rtZipPkzipFssOps =
+{
+    { /* Obj */
+        RTVFSOBJOPS_VERSION,
+        RTVFSOBJTYPE_FS_STREAM,
+        "PkzipFsStream",
+        rtZipPkzipFss_Close,
+        rtZipPkzipFss_QueryInfo,
+        RTVFSOBJOPS_VERSION
+    },
+    RTVFSFSSTREAMOPS_VERSION,
+    0,
+    rtZipPkzipFss_Next,
+    RTVFSFSSTREAMOPS_VERSION
+};
+
+
+RTDECL(int) RTZipPkzipFsStreamFromIoStream(RTVFSIOSTREAM hVfsIosIn, uint32_t fFlags, PRTVFSFSSTREAM phVfsFss)
+{
+    /*
+     * Input validation.
+     */
+    AssertPtrReturn(phVfsFss, VERR_INVALID_HANDLE);
+    *phVfsFss = NIL_RTVFSFSSTREAM;
+    AssertPtrReturn(hVfsIosIn, VERR_INVALID_HANDLE);
+    AssertReturn(!fFlags, VERR_INVALID_PARAMETER);
+
+    uint32_t cRefs = RTVfsIoStrmRetain(hVfsIosIn);
+    AssertReturn(cRefs != UINT32_MAX, VERR_INVALID_HANDLE);
+
+    /*
+     * Retain the input stream and create a new filesystem stream handle.
+     */
+    PRTZIPPKZIPFSSTREAM pThis;
+    RTVFSFSSTREAM     hVfsFss;
+    int rc = RTVfsNewFsStream(&rtZipPkzipFssOps, sizeof(*pThis),
+                              NIL_RTVFS, NIL_RTVFSLOCK, &hVfsFss, (void **)&pThis);
+    if (RT_SUCCESS(rc))
+    {
+        pThis->hVfsIos              = hVfsIosIn;
+        pThis->hVfsCurObj           = NIL_RTVFSOBJ;
+        pThis->pCurIosData          = NULL;
+        pThis->fEndOfStream         = false;
+        pThis->rcFatal              = VINF_SUCCESS;
+        pThis->fHaveEocd            = false;
+
+        *phVfsFss = hVfsFss;
+        return VINF_SUCCESS;
+    }
+
+    RTVfsIoStrmRelease(hVfsIosIn);
+    return rc;
+}
diff --git a/src/VBox/Runtime/common/zip/tarcmd.cpp b/src/VBox/Runtime/common/zip/tarcmd.cpp
index b018b28..aecca4a 100644
--- a/src/VBox/Runtime/common/zip/tarcmd.cpp
+++ b/src/VBox/Runtime/common/zip/tarcmd.cpp
@@ -162,7 +162,7 @@ typedef RTEXITCODE (*PFNDOWITHMEMBER)(PRTZIPTARCMDOPS pOpts, RTVFSOBJ hVfsObj, c
  */
 static bool rtZipTarCmdIsNameInArray(const char *pszName, const char * const *papszNames, uint32_t *piName)
 {
-    for (uint32_t iName = 0; papszNames[iName]; iName)
+    for (uint32_t iName = 0; papszNames[iName]; iName++)
         if (!strcmp(papszNames[iName], pszName))
         {
             if (piName)
@@ -358,6 +358,8 @@ static RTEXITCODE rtZipTarDoWithMembers(PRTZIPTARCMDOPS pOpts, PFNDOWITHMEMBER p
                 RTMsgError("%s: Was not found in the archive", pOpts->papszFiles[iFile]);
                 rcExit = RTEXITCODE_FAILURE;
             }
+
+        RTVfsFsStrmRelease(hVfsFssIn);
     }
     RTMemFree(pbmFound);
     return rcExit;
diff --git a/src/VBox/Runtime/common/zip/unzipcmd.cpp b/src/VBox/Runtime/common/zip/unzipcmd.cpp
new file mode 100644
index 0000000..499742e
--- /dev/null
+++ b/src/VBox/Runtime/common/zip/unzipcmd.cpp
@@ -0,0 +1,481 @@
+/* $Id: unzipcmd.cpp $ */
+/** @file
+ * IPRT - A mini UNZIP Command.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/zip.h>
+#include <iprt/asm.h>
+#include <iprt/getopt.h>
+#include <iprt/file.h>
+#include <iprt/mem.h>
+#include <iprt/message.h>
+#include <iprt/path.h>
+#include <iprt/string.h>
+#include <iprt/vfs.h>
+#include <iprt/stream.h>
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+
+/**
+ * IPRT UNZIP option structure.
+ */
+typedef struct RTZIPUNZIPCMDOPS
+{
+    /** The operation. */
+    int            iOperation;
+    /** The long operation option name. */
+    const char     *pszOperation;
+    /** The directory to change into when upacking. */
+    const char     *pszDirectory;
+    /** The unzip file name. */
+    const char     *pszFile;
+    /** The number of files/directories to be extracted from archive specified. */
+    uint32_t       cFiles;
+    /** Wether we're verbose or quiet. */
+    bool           fVerbose;
+    /** Skip the restauration of the modification time for directories. */
+    bool           fNoModTimeDirectories;
+    /** Skip the restauration of the modification time for files. */
+    bool           fNoModTimeFiles;
+    /** Array of files/directories, terminated by a NULL entry. */
+    const char * const *papszFiles;
+} RTZIPUNZIPCMDOPS;
+/** Pointer to the UNZIP options. */
+typedef RTZIPUNZIPCMDOPS *PRTZIPUNZIPCMDOPS;
+
+/**
+ * Callback used by rtZipUnzipDoWithMembers
+ *
+ * @returns rcExit or RTEXITCODE_FAILURE.
+ * @param   pOpts               The Unzip options.
+ * @param   hVfsObj             The Unzip object to display
+ * @param   pszName             The name.
+ * @param   rcExit              The current exit code.
+ */
+typedef RTEXITCODE (*PFNDOWITHMEMBER)(PRTZIPUNZIPCMDOPS pOpts, RTVFSOBJ hVfsObj, const char *pszName, RTEXITCODE rcExit, PRTFOFF pcBytes);
+
+
+/**
+ *
+ */
+static RTEXITCODE rtZipUnzipCmdListCallback(PRTZIPUNZIPCMDOPS pOpts, RTVFSOBJ hVfsObj,
+                                            const char *pszName, RTEXITCODE rcExit, PRTFOFF pcBytes)
+{
+    /*
+     * Query all the information.
+     */
+    RTFSOBJINFO UnixInfo;
+    int rc = RTVfsObjQueryInfo(hVfsObj, &UnixInfo, RTFSOBJATTRADD_UNIX);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTVfsObjQueryInfo returned %Rrc on '%s'", rc, pszName);
+
+    RTTIME time;
+    if (!RTTimeExplode(&time, &UnixInfo.ModificationTime))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Cannot explode time on '%s'", pszName);
+
+    RTPrintf("%9RU64  %04d-%02d-%02d %02d:%02d   %s\n",
+             UnixInfo.cbObject,
+             time.i32Year, time.u8Month, time.u8MonthDay,
+             time.u8Hour, time.u8Minute,
+             pszName);
+
+    *pcBytes = UnixInfo.cbObject;
+    return rcExit;
+}
+
+
+/**
+ * Extracts a file.
+ */
+static RTEXITCODE rtZipUnzipCmdExtractFile(PRTZIPUNZIPCMDOPS pOpts, RTVFSOBJ hVfsObj, RTEXITCODE rcExit,
+                                           const char *pszDst, PCRTFSOBJINFO pUnixInfo)
+{
+    /*
+     * Open the destination file and create a stream object for it.
+     */
+    uint32_t fOpen = RTFILE_O_READWRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_ACCESS_ATTR_DEFAULT
+                   | (pUnixInfo->Attr.fMode << RTFILE_O_CREATE_MODE_SHIFT);
+    RTFILE hFile;
+    int rc = RTFileOpen(&hFile, pszDst, fOpen);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error creating file: %Rrc", pszDst, rc);
+
+    RTVFSIOSTREAM hVfsIosDst;
+    rc = RTVfsIoStrmFromRTFile(hFile, fOpen, true /*fLeaveOpen*/, &hVfsIosDst);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Pump the data thru.
+         */
+        RTVFSIOSTREAM hVfsIosSrc = RTVfsObjToIoStream(hVfsObj);
+        rc = RTVfsUtilPumpIoStreams(hVfsIosSrc, hVfsIosDst, (uint32_t)RT_MIN(pUnixInfo->cbObject, _1M));
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Correct the file mode and other attributes.
+             */
+            if (!pOpts->fNoModTimeFiles)
+            {
+                rc = RTFileSetTimes(hFile, NULL, &pUnixInfo->ModificationTime, NULL, NULL);
+                if (RT_FAILURE(rc))
+                    rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error setting times: %Rrc", pszDst, rc);
+            }
+        }
+        else
+            rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error writing out file: %Rrc", pszDst, rc);
+        RTVfsIoStrmRelease(hVfsIosSrc);
+        RTVfsIoStrmRelease(hVfsIosDst);
+    }
+    else
+        rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error creating I/O stream for file: %Rrc", pszDst, rc);
+
+    return rcExit;
+}
+
+
+/**
+ *
+ */
+static RTEXITCODE rtZipUnzipCmdExtractCallback(PRTZIPUNZIPCMDOPS pOpts, RTVFSOBJ hVfsObj,
+                                               const char *pszName, RTEXITCODE rcExit, PRTFOFF pcBytes)
+{
+    if (pOpts->fVerbose)
+        RTPrintf("%s\n", pszName);
+
+    /*
+     * Query all the information.
+     */
+    RTFSOBJINFO UnixInfo;
+    int rc = RTVfsObjQueryInfo(hVfsObj, &UnixInfo, RTFSOBJATTRADD_UNIX);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTVfsObjQueryInfo returned %Rrc on '%s'", rc, pszName);
+    
+    *pcBytes = UnixInfo.cbObject;
+
+    char szDst[RTPATH_MAX];
+    rc = RTPathJoin(szDst, sizeof(szDst), pOpts->pszDirectory ? pOpts->pszDirectory : ".", pszName);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Failed to construct destination path for: %Rrc", pszName, rc);
+
+    /*
+     * Extract according to the type.
+     */
+    switch (UnixInfo.Attr.fMode & RTFS_TYPE_MASK)
+    {
+        case RTFS_TYPE_FILE:
+            return rtZipUnzipCmdExtractFile(pOpts, hVfsObj, rcExit, szDst, &UnixInfo);
+
+        case RTFS_TYPE_DIRECTORY:
+            rc = RTDirCreateFullPath(szDst, UnixInfo.Attr.fMode & RTFS_UNIX_ALL_ACCESS_PERMS);
+            if (RT_FAILURE(rc))
+                return RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error creating directory: %Rrc", szDst, rc);
+            break;
+
+        default:
+            return RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Unknown file type.", pszName);
+    }
+
+    if (!pOpts->fNoModTimeDirectories)
+    {
+        rc = RTPathSetTimesEx(szDst, NULL, &UnixInfo.ModificationTime, NULL, NULL, RTPATH_F_ON_LINK);
+        if (RT_FAILURE(rc) && rc != VERR_NOT_SUPPORTED && rc != VERR_NS_SYMLINK_SET_TIME)
+            rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "%s: Error changing modification time: %Rrc.", pszName, rc);
+    }
+
+    return rcExit;
+}
+
+
+/**
+ * Checks if @a pszName is a member of @a papszNames, optionally returning the
+ * index.
+ *
+ * @returns true if the name is in the list, otherwise false.
+ * @param   pszName             The name to find.
+ * @param   papszNames          The array of names.
+ * @param   piName              Where to optionally return the array index.
+ */
+static bool rtZipUnzipCmdIsNameInArray(const char *pszName, const char * const *papszNames, uint32_t *piName)
+{
+    for (uint32_t iName = 0; papszNames[iName]; ++iName)
+        if (!strcmp(papszNames[iName], pszName))
+        {
+            if (piName)
+                *piName = iName;
+            return true;
+        }
+    return false;
+}
+
+
+/**
+ * Opens the input archive specified by the options.
+ *
+ * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE + printed message.
+ * @param   pOpts           The options.
+ * @param   phVfsFss        Where to return the UNZIP filesystem stream handle.
+ */
+static RTEXITCODE rtZipUnzipCmdOpenInputArchive(PRTZIPUNZIPCMDOPS pOpts, PRTVFSFSSTREAM phVfsFss)
+{
+    /*
+     * Open the input file.
+     */
+    RTVFSIOSTREAM hVfsIos;
+    const char    *pszError;
+    int rc = RTVfsChainOpenIoStream(pOpts->pszFile,
+                                    RTFILE_O_READ | RTFILE_O_DENY_WRITE | RTFILE_O_OPEN,
+                                    &hVfsIos,
+                                    &pszError);
+    if (RT_FAILURE(rc))
+    {
+        if (pszError && *pszError)
+            return RTMsgErrorExit(RTEXITCODE_FAILURE,
+                                  "RTVfsChainOpenIoStream failed with rc=%Rrc:\n"
+                                  "    '%s'\n",
+                                  "     %*s^\n",
+                                  rc, pOpts->pszFile, pszError - pOpts->pszFile, "");
+        return RTMsgErrorExit(RTEXITCODE_FAILURE,
+                              "Failed with %Rrc opening the input archive '%s'", rc, pOpts->pszFile);
+    }
+
+    rc = RTZipPkzipFsStreamFromIoStream(hVfsIos, 0 /*fFlags*/, phVfsFss);
+    RTVfsIoStrmRelease(hVfsIos);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to open pkzip filesystem stream: %Rrc", rc);
+
+    return RTEXITCODE_SUCCESS;
+}
+
+
+/**
+ * Worker for the --list and --extract commands.
+ *
+ * @returns The appropriate exit code.
+ * @param   pOpts               The Unzip options.
+ * @param   pfnCallback         The command specific callback.
+ */
+static RTEXITCODE rtZipUnzipDoWithMembers(PRTZIPUNZIPCMDOPS pOpts, PFNDOWITHMEMBER pfnCallback,
+                                          uint32_t *pcFiles, PRTFOFF pcBytes)
+{
+    /*
+     * Allocate a bitmap to go with the file list.  This will be used to
+     * indicate which files we've processed and which not.
+     */
+    uint32_t *pbmFound = NULL;
+    if (pOpts->cFiles)
+    {
+        pbmFound = (uint32_t *)RTMemAllocZ(((pOpts->cFiles + 31) / 32) * sizeof(uint32_t));
+        if (!pbmFound)
+            return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to allocate the found-file-bitmap");
+    }
+
+    uint32_t cFiles = 0;
+    RTFOFF cBytesSum = 0;
+
+    /*
+     * Open the input archive.
+     */
+    RTVFSFSSTREAM hVfsFssIn;
+    RTEXITCODE rcExit = rtZipUnzipCmdOpenInputArchive(pOpts, &hVfsFssIn);
+    if (rcExit == RTEXITCODE_SUCCESS)
+    {
+        /*
+         * Process the stream.
+         */
+        for (;;)
+        {
+            /*
+             * Retrieve the next object.
+             */
+            char       *pszName;
+            RTVFSOBJ    hVfsObj;
+            int rc = RTVfsFsStrmNext(hVfsFssIn, &pszName, NULL, &hVfsObj);
+            if (RT_FAILURE(rc))
+            {
+                if (rc != VERR_EOF)
+                    rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "RTVfsFsStrmNext returned %Rrc", rc);
+                break;
+            }
+
+            /*
+             * Should we process this object?
+             */
+            uint32_t iFile = UINT32_MAX;
+            if (   !pOpts->cFiles
+                || rtZipUnzipCmdIsNameInArray(pszName, pOpts->papszFiles, &iFile))
+            {
+                if (pbmFound)
+                    ASMBitSet(pbmFound, iFile);
+
+                RTFOFF cBytes = 0;
+                rcExit = pfnCallback(pOpts, hVfsObj, pszName, rcExit, &cBytes);
+
+                cBytesSum += cBytes;
+                cFiles++;
+            }
+
+            /*
+             * Release the current object and string.
+             */
+            RTVfsObjRelease(hVfsObj);
+            RTStrFree(pszName);
+        }
+
+        /*
+         * Complain about any files we didn't find.
+         */
+        for (uint32_t iFile = 0; iFile <pOpts->cFiles; iFile++)
+            if (!ASMBitTest(pbmFound, iFile))
+            {
+                RTMsgError("%s: Was not found in the archive", pOpts->papszFiles[iFile]);
+                rcExit = RTEXITCODE_FAILURE;
+            }
+
+        RTVfsFsStrmRelease(hVfsFssIn);
+    }
+
+    RTMemFree(pbmFound);
+
+    *pcFiles = cFiles;
+    *pcBytes = cBytesSum;
+
+    return RTEXITCODE_SUCCESS;
+}
+
+
+RTDECL(RTEXITCODE) RTZipUnzipCmd(unsigned cArgs, char **papszArgs)
+{
+    /*
+     * Parse the command line.
+     */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        /* options */
+        { NULL,            'c', RTGETOPT_REQ_NOTHING }, /* extract files to stdout/stderr */
+        { NULL,            'd', RTGETOPT_REQ_STRING  }, /* extract files to this directory */
+        { NULL,            'l', RTGETOPT_REQ_NOTHING }, /* list archive files (short format) */
+        { NULL,            'p', RTGETOPT_REQ_NOTHING }, /* extract files to stdout */
+        { NULL,            't', RTGETOPT_REQ_NOTHING }, /* test archive files */
+        { NULL,            'v', RTGETOPT_REQ_NOTHING }, /* verbose */
+
+        /* modifiers */
+        { NULL,            'a', RTGETOPT_REQ_NOTHING }, /* convert text files */
+        { NULL,            'b', RTGETOPT_REQ_NOTHING }, /* no conversion, treat as binary */
+        { NULL,            'D', RTGETOPT_REQ_NOTHING }, /* don't restore timestamps for directories
+                                                           (and files) */
+    };
+
+    RTGETOPTSTATE GetState;
+    int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1,
+                          RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTGetOpt failed: %Rrc", rc);
+
+    RTZIPUNZIPCMDOPS Opts;
+    RT_ZERO(Opts);
+    
+    RTGETOPTUNION  ValueUnion;
+    while (   (rc = RTGetOpt(&GetState, &ValueUnion)) != 0
+           && rc != VINF_GETOPT_NOT_OPTION)
+    {
+        switch (rc)
+        {
+            case 'd':
+                if (Opts.pszDirectory)
+                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "You may only specify -d once");
+                Opts.pszDirectory = ValueUnion.psz;
+                break;
+
+            case 'D':
+                if (!Opts.fNoModTimeDirectories)
+                    Opts.fNoModTimeDirectories = true; /* -D */
+                else
+                    Opts.fNoModTimeFiles = true; /* -DD */
+                break;
+
+            case 'l':
+            case 't': /* treat 'test' like 'list' */
+                if (Opts.iOperation)
+                    return RTMsgErrorExit(RTEXITCODE_SYNTAX,
+                                          "Conflicting unzip operation (%s already set, now %s)",
+                                          Opts.pszOperation, ValueUnion.pDef->pszLong);
+                Opts.iOperation   = rc;
+                Opts.pszOperation = ValueUnion.pDef->pszLong;
+                break;
+
+            case 'v':
+                Opts.fVerbose = true;
+                break;
+
+            default:
+                Opts.pszFile = ValueUnion.psz;
+                return RTGetOptPrintError(rc, &ValueUnion);
+        }
+    }
+
+    if (rc == VINF_GETOPT_NOT_OPTION)
+    {
+        Assert((unsigned)GetState.iNext - 1 <= cArgs);
+        Opts.pszFile = papszArgs[GetState.iNext - 1];
+        if ((unsigned)GetState.iNext <= cArgs)
+        {
+            Opts.papszFiles = (const char * const *)&papszArgs[GetState.iNext];
+            Opts.cFiles     = cArgs - GetState.iNext;
+        }
+    }
+
+    RTFOFF cBytes = 0;
+    uint32_t cFiles = 0;
+    switch (Opts.iOperation)
+    {
+        case 'l':
+        {
+            RTPrintf("  Length      Date    Time    Name\n"
+                     "---------  ---------- -----   ----\n");
+            RTEXITCODE rcExit = rtZipUnzipDoWithMembers(&Opts, rtZipUnzipCmdListCallback, &cFiles, &cBytes);
+            RTPrintf("---------                     -------\n"
+                     "%9RU64                     %u file%s\n",
+                     cBytes, cFiles, cFiles != 1 ? "s" : "");
+
+            return rcExit;
+        }
+
+        default:
+            return rtZipUnzipDoWithMembers(&Opts, rtZipUnzipCmdExtractCallback, &cFiles, &cBytes);
+    }
+
+    return RTEXITCODE_SUCCESS;
+}
diff --git a/src/VBox/Runtime/common/zip/zip.cpp b/src/VBox/Runtime/common/zip/zip.cpp
index fa8d140..2592f7a 100644
--- a/src/VBox/Runtime/common/zip/zip.cpp
+++ b/src/VBox/Runtime/common/zip/zip.cpp
@@ -419,6 +419,18 @@ static DECLCALLBACK(int) rtZipStoreDecompInit(PRTZIPDECOMP pZip)
 
 
 #ifdef RTZIP_USE_ZLIB
+
+/*
+ * Missing definitions from zutil.h. We need these constants for calling
+ * inflateInit2() / deflateInit2().
+ */
+# ifndef Z_DEF_WBITS
+#  define Z_DEF_WBITS        MAX_WBITS
+# endif
+# ifndef Z_DEF_MEM_LEVEL
+#  define Z_DEF_MEM_LEVEL    8
+# endif
+
 /**
  * Convert from zlib errno to iprt status code.
  * @returns iprt status code.
@@ -542,8 +554,9 @@ static DECLCALLBACK(int) rtZipZlibCompDestroy(PRTZIPCOMP pZip)
  * @returns iprt status code.
  * @param   pZip        The compressor instance.
  * @param   enmLevel    The desired compression level.
+ * @param   fZlibHeader If true, write the Zlib header.
  */
-static DECLCALLBACK(int) rtZipZlibCompInit(PRTZIPCOMP pZip, RTZIPLEVEL enmLevel)
+static DECLCALLBACK(int) rtZipZlibCompInit(PRTZIPCOMP pZip, RTZIPLEVEL enmLevel, bool fZlibHeader)
 {
     pZip->pfnCompress = rtZipZlibCompress;
     pZip->pfnFinish   = rtZipZlibCompFinish;
@@ -563,7 +576,8 @@ static DECLCALLBACK(int) rtZipZlibCompInit(PRTZIPCOMP pZip, RTZIPLEVEL enmLevel)
     pZip->u.Zlib.avail_out = sizeof(pZip->abBuffer) - 1;
     pZip->u.Zlib.opaque    = pZip;
 
-    int rc = deflateInit(&pZip->u.Zlib, iLevel);
+    int rc = deflateInit2(&pZip->u.Zlib, iLevel, Z_DEFLATED, fZlibHeader ? Z_DEF_WBITS : -Z_DEF_WBITS,
+                          Z_DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
     return rc >= 0 ? rc = VINF_SUCCESS : zipErrConvertFromZlib(rc, true /*fCompressing*/);
 }
 
@@ -635,8 +649,9 @@ static DECLCALLBACK(int) rtZipZlibDecompDestroy(PRTZIPDECOMP pZip)
  * Initialize the decompressor instance.
  * @returns iprt status code.
  * @param   pZip        The decompressor instance.
+ * @param   fZlibHeader If true, expect the Zlib header.
  */
-static DECLCALLBACK(int) rtZipZlibDecompInit(PRTZIPDECOMP pZip)
+static DECLCALLBACK(int) rtZipZlibDecompInit(PRTZIPDECOMP pZip, bool fZlibHeader)
 {
     pZip->pfnDecompress = rtZipZlibDecompress;
     pZip->pfnDestroy = rtZipZlibDecompDestroy;
@@ -644,7 +659,7 @@ static DECLCALLBACK(int) rtZipZlibDecompInit(PRTZIPDECOMP pZip)
     memset(&pZip->u.Zlib, 0, sizeof(pZip->u.Zlib));
     pZip->u.Zlib.opaque    = pZip;
 
-    int rc = inflateInit(&pZip->u.Zlib);
+    int rc = inflateInit2(&pZip->u.Zlib, fZlibHeader ? Z_DEF_WBITS : -Z_DEF_WBITS);
     return rc >= 0 ? VINF_SUCCESS : zipErrConvertFromZlib(rc, false /*fCompressing*/);
 }
 
@@ -1405,8 +1420,9 @@ RTDECL(int)     RTZipCompCreate(PRTZIPCOMP *ppZip, void *pvUser, PFNRTZIPOUT pfn
             break;
 
         case RTZIPTYPE_ZLIB:
+        case RTZIPTYPE_ZLIB_NO_HEADER:
 #ifdef RTZIP_USE_ZLIB
-            rc = rtZipZlibCompInit(pZip, enmLevel);
+            rc = rtZipZlibCompInit(pZip, enmLevel, enmType == RTZIPTYPE_ZLIB /*fZlibHeader*/);
 #endif
             break;
 
@@ -1583,8 +1599,9 @@ static int rtzipDecompInit(PRTZIPDECOMP pZip)
             break;
 
         case RTZIPTYPE_ZLIB:
+        case RTZIPTYPE_ZLIB_NO_HEADER:
 #ifdef RTZIP_USE_ZLIB
-            rc = rtZipZlibDecompInit(pZip);
+            rc = rtZipZlibDecompInit(pZip, pZip->enmType == RTZIPTYPE_ZLIB /*fHeader*/);
 #else
             AssertMsgFailed(("Zlib is not include in this build!\n"));
 #endif
diff --git a/src/VBox/Runtime/generic/critsect-generic.cpp b/src/VBox/Runtime/generic/critsect-generic.cpp
index 4258fcf..4d736b9 100644
--- a/src/VBox/Runtime/generic/critsect-generic.cpp
+++ b/src/VBox/Runtime/generic/critsect-generic.cpp
@@ -58,7 +58,11 @@ RTDECL(int) RTCritSectInitEx(PRTCRITSECT pCritSect, uint32_t fFlags, RTLOCKVALCL
      * Initialize the structure and
      */
     pCritSect->u32Magic             = RTCRITSECT_MAGIC;
-    pCritSect->fFlags               = fFlags;
+#ifdef IN_RING0
+    pCritSect->fFlags               = fFlags | RTCRITSECT_FLAGS_RING0;
+#else
+    pCritSect->fFlags               = fFlags & ~RTCRITSECT_FLAGS_RING0;
+#endif
     pCritSect->cNestings            = 0;
     pCritSect->cLockers             = -1;
     pCritSect->NativeThreadOwner    = NIL_RTNATIVETHREAD;
@@ -86,15 +90,22 @@ RTDECL(int) RTCritSectInitEx(PRTCRITSECT pCritSect, uint32_t fFlags, RTLOCKVALCL
 #endif
     if (RT_SUCCESS(rc))
     {
+#ifdef IN_RING0
+        rc = RTSemEventCreate(&pCritSect->EventSem);
+
+#else
         rc = RTSemEventCreateEx(&pCritSect->EventSem,
                                 fFlags & RTCRITSECT_FLAGS_BOOTSTRAP_HACK
                                 ? RTSEMEVENT_FLAGS_NO_LOCK_VAL | RTSEMEVENT_FLAGS_BOOTSTRAP_HACK
                                 : RTSEMEVENT_FLAGS_NO_LOCK_VAL,
                                 NIL_RTLOCKVALCLASS,
                                 NULL);
+#endif
         if (RT_SUCCESS(rc))
             return VINF_SUCCESS;
+#ifdef RTCRITSECT_STRICT
         RTLockValidatorRecExclDestroy(&pCritSect->pValidatorRec);
+#endif
     }
 
     AssertRC(rc);
@@ -107,14 +118,14 @@ RT_EXPORT_SYMBOL(RTCritSectInitEx);
 
 RTDECL(uint32_t) RTCritSectSetSubClass(PRTCRITSECT pCritSect, uint32_t uSubClass)
 {
-#ifdef RTCRITSECT_STRICT
+# ifdef RTCRITSECT_STRICT
     AssertPtrReturn(pCritSect, RTLOCKVAL_SUB_CLASS_INVALID);
     AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, RTLOCKVAL_SUB_CLASS_INVALID);
     AssertReturn(!(pCritSect->fFlags & RTCRITSECT_FLAGS_NOP), RTLOCKVAL_SUB_CLASS_INVALID);
     return RTLockValidatorRecExclSetSubClass(pCritSect->pValidatorRec, uSubClass);
-#else
+# else
     return RTLOCKVAL_SUB_CLASS_INVALID;
-#endif
+# endif
 }
 
 
@@ -123,6 +134,11 @@ DECL_FORCE_INLINE(int) rtCritSectTryEnter(PRTCRITSECT pCritSect, PCRTLOCKVALSRCP
     Assert(pCritSect);
     Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
     /*AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);*/
+#ifdef IN_RING0
+    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
      * Return straight away if NOP.
@@ -195,6 +211,11 @@ DECL_FORCE_INLINE(int) rtCritSectEnter(PRTCRITSECT pCritSect, PCRTLOCKVALSRCPOS
 {
     AssertPtr(pCritSect);
     AssertReturn(pCritSect->u32Magic == RTCRITSECT_MAGIC, VERR_SEM_DESTROYED);
+#ifdef IN_RING0
+    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
      * Return straight away if NOP.
@@ -266,11 +287,13 @@ DECL_FORCE_INLINE(int) rtCritSectEnter(PRTCRITSECT pCritSect, PCRTLOCKVALSRCPOS
                 ASMAtomicDecS32(&pCritSect->cLockers);
                 return rc9;
             }
-#else
+#elif defined(IN_RING3)
             RTThreadBlocking(hThreadSelf, RTTHREADSTATE_CRITSECT, false);
 #endif
             int rc = RTSemEventWait(pCritSect->EventSem, RT_INDEFINITE_WAIT);
+#ifdef IN_RING3
             RTThreadUnblocked(hThreadSelf, RTTHREADSTATE_CRITSECT);
+#endif
 
             if (pCritSect->u32Magic != RTCRITSECT_MAGIC)
                 return VERR_SEM_DESTROYED;
@@ -321,6 +344,11 @@ RTDECL(int) RTCritSectLeave(PRTCRITSECT pCritSect)
      */
     Assert(pCritSect);
     Assert(pCritSect->u32Magic == RTCRITSECT_MAGIC);
+#ifdef IN_RING0
+    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
     if (pCritSect->fFlags & RTCRITSECT_FLAGS_NOP)
         return VINF_SUCCESS;
 
@@ -362,7 +390,7 @@ RT_EXPORT_SYMBOL(RTCritSectLeave);
 
 
 
-
+#ifdef IN_RING3
 
 static int rtCritSectEnterMultiple(size_t cCritSects, PRTCRITSECT *papCritSects, PCRTLOCKVALSRCPOS pSrcPos)
 {
@@ -476,6 +504,9 @@ RTDECL(int) RTCritSectLeaveMultiple(size_t cCritSects, PRTCRITSECT *papCritSects
 }
 RT_EXPORT_SYMBOL(RTCritSectLeaveMultiple);
 
+#endif /* IN_RING3 */
+
+
 
 RTDECL(int) RTCritSectDelete(PRTCRITSECT pCritSect)
 {
@@ -487,6 +518,11 @@ RTDECL(int) RTCritSectDelete(PRTCRITSECT pCritSect)
     Assert(pCritSect->cNestings == 0);
     Assert(pCritSect->cLockers == -1);
     Assert(pCritSect->NativeThreadOwner == NIL_RTNATIVETHREAD);
+#ifdef IN_RING0
+    Assert(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0);
+#else
+    Assert(!(pCritSect->fFlags & RTCRITSECT_FLAGS_RING0));
+#endif
 
     /*
      * Invalidate the structure and free the mutex.
@@ -505,7 +541,9 @@ RTDECL(int) RTCritSectDelete(PRTCRITSECT pCritSect)
     int rc = RTSemEventDestroy(EventSem);
     AssertRC(rc);
 
+#ifdef RTCRITSECT_STRICT
     RTLockValidatorRecExclDestroy(&pCritSect->pValidatorRec);
+#endif
 
     return rc;
 }
diff --git a/src/VBox/Runtime/generic/memsafer-generic.cpp b/src/VBox/Runtime/generic/memsafer-generic.cpp
new file mode 100644
index 0000000..abee137
--- /dev/null
+++ b/src/VBox/Runtime/generic/memsafer-generic.cpp
@@ -0,0 +1,215 @@
+/* $Id: memsafer-generic.cpp $ */
+/** @file
+ * IPRT - Memory Allocate for Sensitive Data, generic heap-based implementation.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/memsafer.h>
+
+#include <iprt/assert.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** Allocation size alignment. */
+#define RTMEMSAFER_ALIGN        16
+/** Padding after the block to avoid small overruns. */
+#define RTMEMSAFER_PAD_BEFORE   96
+/** Padding after the block to avoid small underruns. */
+#define RTMEMSAFER_PAD_AFTER    32
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** XOR scrabler value.
+ * @todo determine this at runtime */
+#if ARCH_BITS == 32
+static uintptr_t g_uScramblerXor = UINT32_C(0x867af88d);
+#elif ARCH_BITS == 64
+static uintptr_t g_uScramblerXor = UINT64_C(0xed95ecc99416d312);
+#else
+# error "Bad ARCH_BITS value"
+#endif
+
+
+
+RTDECL(int) RTMemSaferScramble(void *pv, size_t cb)
+{
+
+    AssertMsg(*(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE) == cb,
+              ("*pvStart=%#zx cb=%#zx\n", *(size_t *)((char *)pv- RTMEMSAFER_PAD_BEFORE), cb));
+
+    /* Note! This isn't supposed to be safe, just less obvious. */
+    uintptr_t *pu = (uintptr_t *)pv;
+    cb = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+    while (cb > 0)
+    {
+        *pu ^= g_uScramblerXor;
+        pu++;
+        cb -= sizeof(*pu);
+    }
+
+    return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTMemSaferScramble);
+
+
+RTDECL(int) RTMemSaferUnscramble(void *pv, size_t cb)
+{
+    AssertMsg(*(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE) == cb,
+              ("*pvStart=%#zx cb=%#zx\n", *(size_t *)((char *)pv - RTMEMSAFER_PAD_BEFORE), cb));
+
+    /* Note! This isn't supposed to be safe, just less obvious. */
+    uintptr_t *pu = (uintptr_t *)pv;
+    cb = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+    while (cb > 0)
+    {
+        *pu ^= g_uScramblerXor;
+        pu++;
+        cb -= sizeof(*pu);
+    }
+
+    return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTMemSaferUnscramble);
+
+
+RTDECL(int) RTMemSaferAllocZExTag(void **ppvNew, size_t cb, const char *pszTag) RT_NO_THROW
+{
+    AssertReturn(cb, VERR_INVALID_PARAMETER);
+    AssertPtrReturn(ppvNew, VERR_INVALID_PARAMETER);
+    *ppvNew = NULL;
+
+    /*
+     * Don't request zeroed memory.  We want random heap garbage in the
+     * padding zones, notthing that makes our allocations easier to find.
+     */
+    size_t cbUser = RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN);
+    void *pvNew = RTMemAlloc(cbUser + RTMEMSAFER_PAD_BEFORE + RTMEMSAFER_PAD_AFTER);
+    if (pvNew)
+    {
+#ifdef RT_STRICT /* For checking input in string builds. */
+        memset(pvNew, 0xad, RTMEMSAFER_PAD_BEFORE);
+        memset((char *)pvNew + RTMEMSAFER_PAD_BEFORE + cb, 0xda, RTMEMSAFER_PAD_AFTER + (cbUser - cb));
+        *(size_t *)pvNew = cb;
+#endif
+
+        void *pvUser = (char *)pvNew + RTMEMSAFER_PAD_BEFORE;
+        *ppvNew = pvUser;
+
+        /* You don't use this API for performance, so we always clean memory. */
+        RT_BZERO(pvUser, cb);
+
+        return VINF_SUCCESS;
+    }
+    return VERR_NO_MEMORY;
+}
+RT_EXPORT_SYMBOL(RTMemSaferAllocZExTag);
+
+
+RTDECL(void) RTMemSaferFree(void *pv, size_t cb) RT_NO_THROW
+{
+    if (pv)
+    {
+        Assert(cb);
+        void *pvStart = (char *)pv - RTMEMSAFER_PAD_BEFORE;
+        AssertMsg(*(size_t *)pvStart == cb, ("*pvStart=%#zx cb=%#zx\n", *(size_t *)pvStart, cb));
+        RTMemWipeThoroughly(pv, RT_ALIGN_Z(cb, RTMEMSAFER_ALIGN), 3);
+        RTMemFree(pvStart);
+    }
+    else
+        Assert(cb == 0);
+}
+RT_EXPORT_SYMBOL(RTMemSaferFree);
+
+
+RTDECL(int) RTMemSaferReallocZExTag(size_t cbOld, void *pvOld, size_t cbNew, void **ppvNew, const char *pszTag) RT_NO_THROW
+{
+    /*
+     * We cannot let the heap move us around because we will be failing in our
+     * duty to clean things up.  So, allocate a new block, copy over the old
+     * content, and free the old one.
+     */
+    int rc;
+    /* Real realloc. */
+    if (cbNew && cbOld)
+    {
+        AssertPtr(pvOld);
+        AssertMsg(*(size_t *)((char *)pvOld - RTMEMSAFER_PAD_BEFORE) == cbOld,
+                  ("*pvStart=%#zx cbOld=%#zx\n", *(size_t *)((char *)pvOld - RTMEMSAFER_PAD_BEFORE), cbOld));
+
+        void *pvNew;
+        rc = RTMemSaferAllocZExTag(&pvNew, cbNew, pszTag);
+        if (RT_SUCCESS(rc))
+        {
+            memcpy(pvNew, pvOld, RT_MIN(cbNew, cbOld));
+            RTMemSaferFree(pvOld, cbOld);
+            *ppvNew = pvNew;
+        }
+    }
+    /* First allocation. */
+    else if (!cbOld)
+    {
+        Assert(pvOld == NULL);
+        rc = RTMemSaferAllocZExTag(ppvNew, cbNew, pszTag);
+    }
+    /* Free operation*/
+    else
+    {
+        RTMemSaferFree(pvOld, cbOld);
+        rc = VINF_SUCCESS;
+    }
+    return rc;
+}
+RT_EXPORT_SYMBOL(RTMemSaferReallocZExTag);
+
+
+RTDECL(void *) RTMemSaferAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    void *pvNew = NULL;
+    int rc = RTMemSaferAllocZExTag(&pvNew, cb, pszTag);
+    if (RT_SUCCESS(rc))
+        return pvNew;
+    return NULL;
+}
+RT_EXPORT_SYMBOL(RTMemSaferAllocZTag);
+
+
+RTDECL(void *) RTMemSaferReallocZTag(size_t cbOld, void *pvOld, size_t cbNew, const char *pszTag) RT_NO_THROW
+{
+    void *pvNew = NULL;
+    int rc = RTMemSaferReallocZExTag(cbOld, pvOld, cbNew, &pvNew, pszTag);
+    if (RT_SUCCESS(rc))
+        return pvNew;
+    return NULL;
+}
+RT_EXPORT_SYMBOL(RTMemSaferReallocZTag);
+
diff --git a/src/VBox/Runtime/include/internal/dbgmod.h b/src/VBox/Runtime/include/internal/dbgmod.h
index 2d06044..cf35ef1 100644
--- a/src/VBox/Runtime/include/internal/dbgmod.h
+++ b/src/VBox/Runtime/include/internal/dbgmod.h
@@ -227,6 +227,18 @@ typedef struct RTDBGMODVTIMG
      */
     DECLCALLBACKMEMBER(RTLDRARCH, pfnGetArch)(PRTDBGMODINT pMod);
 
+    /**
+     * Generic method for querying image properties.
+     *
+     * @returns IPRT status code.
+     * @param   pMod            Pointer to the module structure.
+     * @param   enmLdrProp      The property to query.
+     * @param   pvBuf           Pointer to the return buffer.
+     * @param   cbBuf           The size of the return buffer.
+     * @sa      RTLdrQueryProp
+     */
+    DECLCALLBACKMEMBER(int, pfnQueryProp)(PRTDBGMODINT pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf);
+
     /** For catching initialization errors (RTDBGMODVTIMG_MAGIC). */
     uint32_t    u32EndMagic;
 } RTDBGMODVTIMG;
@@ -558,6 +570,18 @@ typedef struct RTDBGMODDEFERRED
             /** The CRC-32 value found in the .gnu_debuglink section. */
             uint32_t    uCrc32;
         }   GnuDebugLink;
+
+        struct
+        {
+            /** The image UUID. */
+            RTUUID          Uuid;
+            /** Image architecture. */
+            RTLDRARCH       enmArch;
+            /** Number of segment mappings. */
+            uint32_t        cSegs;
+            /** Segment mappings. */
+            RTDBGSEGMENT    aSegs[1];
+        }   MachO;
     } u;
 } RTDBGMODDEFERRED;
 /** Pointer to the deferred loading data. */
@@ -616,6 +640,27 @@ typedef struct RTDBGMODINT
 typedef RTDBGMODINT *PRTDBGMODINT;
 
 
+/**
+ * Special segment package used passing segment order information for mach-o
+ * images (mainly mach_kernel, really).
+ *
+ * Passes to rtDbgModDwarf_TryOpen via RTDBGMODINF::pvDbgPriv.
+ */
+typedef struct RTDBGDWARFSEGPKG
+{
+    /** Pointer to the segment array. */
+    PCRTDBGSEGMENT      paSegs;
+    /** Number of segments. */
+    uint32_t            cSegs;
+    /** For use more internal use in file locator callbacks. */
+    RTLDRARCH           enmArch;
+    /** For use more internal use in file locator callbacks. */
+    PCRTUUID            pUuid;
+} RTDBGDWARFSEGPKG;
+/** Pointer to a const segment package. */
+typedef RTDBGDWARFSEGPKG const *PCRTDBGDWARFSEGPKG;
+
+
 extern DECLHIDDEN(RTSTRCACHE)           g_hDbgModStrCache;
 extern DECLHIDDEN(RTDBGMODVTDBG const)  g_rtDbgModVtDbgCodeView;
 extern DECLHIDDEN(RTDBGMODVTDBG const)  g_rtDbgModVtDbgDwarf;
@@ -636,7 +681,7 @@ DECLHIDDEN(int) rtDbgModContainer_RemoveAll(PRTDBGMODINT pMod);
 
 DECLHIDDEN(int) rtDbgModCreateForExports(PRTDBGMODINT pDbgMod);
 DECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
-                                       RTDBGCFG hDbgCfg, PRTDBGMODDEFERRED *ppDeferred);
+                                       RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred);
 
 DECLHIDDEN(int) rtDbgModLdrOpenFromHandle(PRTDBGMODINT pDbgMod, RTLDRMOD hLdrMod);
 
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/include/internal/iprt-openssl.h
similarity index 53%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/include/internal/iprt-openssl.h
index 35b6d89..c3cb581 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/include/internal/iprt-openssl.h
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: iprt-openssl.h $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - Internal header for the OpenSSL helpers.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -25,28 +25,18 @@
  */
 
 
-/*******************************************************************************
-*   Header Files                                                               *
-*******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
-#include <iprt/initterm.h>
-#include <iprt/message.h>
-
-
-int main(int argc, char **argv)
-{
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
-}
+#ifndef ___internal_iprt_openssl_h
+#define ___internal_iprt_openssl_h
+
+#include <iprt/crypto/x509.h>
+
+RT_C_DECLS_BEGIN
+
+DECLHIDDEN(void) rtCrOpenSslInit(void);
+DECLHIDDEN(int)  rtCrOpenSslErrInfoCallback(const char *pach, size_t cch, void *pvUser);
+DECLHIDDEN(int)  rtCrOpenSslAddX509CertToStack(void *pvOsslStack, PCRTCRX509CERTIFICATE pCert);
+
+RT_C_DECLS_END
+
+#endif
 
diff --git a/src/VBox/Runtime/include/internal/ldr.h b/src/VBox/Runtime/include/internal/ldr.h
index 9999827..df89c1e 100644
--- a/src/VBox/Runtime/include/internal/ldr.h
+++ b/src/VBox/Runtime/include/internal/ldr.h
@@ -311,6 +311,7 @@ typedef struct RTLDROPS
      *
      * @returns IPRT status code.
      *
+     * @param   pMod            Pointer to the loader module structure.
      * @param   pvBuf           The buffer to read into.
      * @param   iDbgInfo        The debug info ordinal number if the request
      *                          corresponds exactly to a debug info part from
@@ -321,92 +322,59 @@ typedef struct RTLDROPS
      */
     DECLCALLBACKMEMBER(int, pfnReadDbgInfo)(PRTLDRMODINTERNAL pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void *pvBuf);
 
-    /** Dummy entry to make sure we've initialized it all. */
-    RTUINT uDummy;
-} RTLDROPS;
-typedef RTLDROPS *PRTLDROPS;
-typedef const RTLDROPS *PCRTLDROPS;
-
-
-/** Pointer to a loader reader instance. */
-typedef struct RTLDRREADER *PRTLDRREADER;
-
-/**
- * Loader image reader instance.
- * The reader will have extra data members following this structure.
- */
-typedef struct RTLDRREADER
-{
-    /** The name of the image provider. */
-    const char *pszName;
-
     /**
-     * Reads bytes at a give place in the raw image.
+     * Generic method for querying image properties.
      *
-     * @returns iprt status code.
-     * @param   pReader     Pointer to the reader instance.
-     * @param   pvBuf       Where to store the bits.
-     * @param   cb          Number of bytes to read.
-     * @param   off         Where to start reading relative to the start of the raw image.
-     */
-    DECLCALLBACKMEMBER(int, pfnRead)(PRTLDRREADER pReader, void *pvBuf, size_t cb, RTFOFF off);
-
-    /**
-     * Tells end position of last read.
-     *
-     * @returns position relative to start of the raw image.
-     * @param   pReader     Pointer to the reader instance.
-     */
-    DECLCALLBACKMEMBER(RTFOFF, pfnTell)(PRTLDRREADER pReader);
-
-    /**
-     * Gets the size of the raw image bits.
+     * @returns IPRT status code.
+     * @retval  VERR_NOT_SUPPORTED if the property query isn't supported (either all
+     *          or that specific property).
+     * @retval  VERR_NOT_FOUND the property was not found in the module.
      *
-     * @returns size of raw image bits in bytes.
-     * @param   pReader     Pointer to the reader instance.
+     * @param   pMod            Pointer to the loader module structure.
+     * @param   enmLdrProp      The property to query (valid).
+     * @param   pvBuf           Pointer to the return buffer (valid).
+     * @param   cbBuf           The size of the return buffer (valid as per
+     *                          property).
+     * @param   pcbRet          The number of bytes actually returned.  If
+     *                          VERR_BUFFER_OVERFLOW is returned, this is set to the
+     *                          required buffer size.
      */
-    DECLCALLBACKMEMBER(RTFOFF, pfnSize)(PRTLDRREADER pReader);
+    DECLCALLBACKMEMBER(int, pfnQueryProp)(PRTLDRMODINTERNAL pMod, RTLDRPROP enmProp, void *pvBuf, size_t cbBuf, size_t *pcbRet);
 
     /**
-     * Map the bits into memory.
+     * Verify the image signature.
      *
-     * The mapping will be freed upon calling pfnDestroy() if not pfnUnmap()
-     * is called before that. The mapping is read only.
+     * This may permform additional integrity checks on the image structures that
+     * was not done when opening the image.
      *
-     * @returns iprt status code.
-     * @param   pReader     Pointer to the reader instance.
-     * @param   ppvBits     Where to store the address of the memory mapping on success.
-     *                      The size of the mapping can be obtained by calling pfnSize().
-     */
-    DECLCALLBACKMEMBER(int, pfnMap)(PRTLDRREADER pReader, const void **ppvBits);
-
-    /**
-     * Unmap bits.
-     *
-     * @returns iprt status code.
-     * @param   pReader     Pointer to the reader instance.
-     * @param   pvBits      Memory pointer returned by pfnMap().
-     */
-    DECLCALLBACKMEMBER(int, pfnUnmap)(PRTLDRREADER pReader, const void *pvBits);
-
-    /**
-     * Gets the most appropriate log name.
+     * @returns IPRT status code.
+     * @retval  VERR_LDRVI_NOT_SIGNED if not signed.
      *
-     * @returns Pointer to readonly log name.
-     * @param   pReader     Pointer to the reader instance.
+     * @param   pMod            Pointer to the loader module structure.
+     * @param   pfnCallback     Callback that does the signature and certificate
+     *                          verficiation.
+     * @param   pvUser          User argument for the callback.
+     * @param   pErrInfo        Pointer to an error info buffer. Optional.
      */
-    DECLCALLBACKMEMBER(const char *, pfnLogName)(PRTLDRREADER pReader);
+    DECLCALLBACKMEMBER(int, pfnVerifySignature)(PRTLDRMODINTERNAL pMod, PFNRTLDRVALIDATESIGNEDDATA pfnCallback, void *pvUser,
+                                                PRTERRINFO pErrInfo);
 
     /**
-     * Releases all resources associated with the reader instance.
-     * The instance is invalid after this call returns.
+     * Calculate the image hash according the image signing rules.
      *
-     * @returns iprt status code.
-     * @param   pReader     Pointer to the reader instance.
+     * @returns IPRT status code.
+     * @param   hLdrMod         The module handle.
+     * @param   enmDigest       Which kind of digest.
+     * @param   pszDigest       Where to store the image digest.
+     * @param   cbDigest        Size of the buffer @a pszDigest points at.
      */
-    DECLCALLBACKMEMBER(int, pfnDestroy)(PRTLDRREADER pReader);
+    DECLCALLBACKMEMBER(int, pfnHashImage)(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest);
 
-} RTLDRREADER;
+    /** Dummy entry to make sure we've initialized it all. */
+    RTUINT uDummy;
+} RTLDROPS;
+typedef RTLDROPS *PRTLDROPS;
+typedef const RTLDROPS *PCRTLDROPS;
 
 
 /**
@@ -446,8 +414,6 @@ DECLINLINE(bool) rtldrIsValid(RTLDRMOD hLdrMod)
         && ((PRTLDRMODINTERNAL)hLdrMod)->u32Magic == RTLDRMOD_MAGIC;
 }
 
-int rtldrOpenWithReader(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phMod);
-
 
 /**
  * Native loader module.
@@ -491,9 +457,9 @@ int rtldrNativeLoad(const char *pszFilename, uintptr_t *phHandle, uint32_t fFlag
  */
 int rtldrNativeLoadSystem(const char *pszFilename, const char *pszExt, uint32_t fFlags, PRTLDRMOD phLdrMod);
 
-int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod);
-int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
-int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod);
+int rtldrPEOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offNtHdrs, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
+int rtldrELFOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
+int rtldrkLdrOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, PRTLDRMOD phLdrMod, PRTERRINFO pErrInfo);
 /*int rtldrLXOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offLX, PRTLDRMOD phLdrMod);
 int rtldrMachoOpen(PRTLDRREADER pReader, uint32_t fFlags, RTLDRARCH enmArch, RTFOFF offSomething, PRTLDRMOD phLdrMod);*/
 
diff --git a/src/VBox/Runtime/include/internal/ldrPE.h b/src/VBox/Runtime/include/internal/ldrPE.h
index dd2bc37..d1de685 100644
--- a/src/VBox/Runtime/include/internal/ldrPE.h
+++ b/src/VBox/Runtime/include/internal/ldrPE.h
@@ -72,15 +72,22 @@
 #define  IMAGE_SUBSYSTEM_OS2_CUI  0x5
 #define  IMAGE_SUBSYSTEM_POSIX_CUI  0x7
 
-#define  IMAGE_LIBRARY_PROCESS_INIT  0x0001
-#define  IMAGE_LIBRARY_PROCESS_TERM  0x0002
-#define  IMAGE_LIBRARY_THREAD_INIT  0x0004
-#define  IMAGE_LIBRARY_THREAD_TERM  0x0008
-#define  IMAGE_DLLCHARACTERISTICS_NO_ISOLATION  0x0200
-#define  IMAGE_DLLCHARACTERISTICS_NO_SEH  0x0400
-#define  IMAGE_DLLCHARACTERISTICS_NO_BIND  0x0800
-#define  IMAGE_DLLCHARACTERISTICS_WDM_DRIVER  0x2000
-#define  IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE  0x8000
+#define  IMAGE_LIBRARY_PROCESS_INIT                         0x0001
+#define  IMAGE_LIBRARY_PROCESS_TERM                         0x0002
+#define  IMAGE_LIBRARY_THREAD_INIT                          0x0004
+#define  IMAGE_LIBRARY_THREAD_TERM                          0x0008
+#define  IMAGE_DLLCHARACTERISTICS_RESERVED                  0x0010
+#define  IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA           0x0020
+#define  IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE              0x0040
+#define  IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY           0x0080
+#define  IMAGE_DLLCHARACTERISTICS_NX_COMPAT                 0x0100
+#define  IMAGE_DLLCHARACTERISTICS_NO_ISOLATION              0x0200
+#define  IMAGE_DLLCHARACTERISTICS_NO_SEH                    0x0400
+#define  IMAGE_DLLCHARACTERISTICS_NO_BIND                   0x0800
+#define  IMAGE_DLLCHARACTERISTICS_APPCONTAINER              0x1000
+#define  IMAGE_DLLCHARACTERISTICS_WDM_DRIVER                0x2000
+#define  IMAGE_DLLCHARACTERISTICS_GUARD_CF                  0x4000
+#define  IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE     0x8000
 
 #define  IMAGE_NUMBEROF_DIRECTORY_ENTRIES  0x10
 
@@ -207,6 +214,9 @@
 #define  WIN_CERT_TYPE_EFI_PKCS115          UINT16_C(0x0ef0)
 #define  WIN_CERT_TYPE_EFI_GUID             UINT16_C(0x0ef1)
 
+/** The alignment of the certificate table.
+ * @remarks Found thru signtool experiments.  */
+#define  WIN_CERTIFICATE_ALIGNMENT          8
 
 /* For .DBG files. */
 #define  IMAGE_SEPARATE_DEBUG_SIGNATURE     UINT16_C(0x4944)
@@ -516,7 +526,46 @@ typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32;
 typedef IMAGE_THUNK_DATA32 const *PCIMAGE_THUNK_DATA32;
 
 
-typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32
+
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
+#pragma pack()
+
+
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V1
+{
+    uint32_t  Size;
+    uint32_t  TimeDateStamp;
+    uint16_t  MajorVersion;
+    uint16_t  MinorVersion;
+    uint32_t  GlobalFlagsClear;
+    uint32_t  GlobalFlagsSet;
+    uint32_t  CriticalSectionDefaultTimeout;
+    uint32_t  DeCommitFreeBlockThreshold;
+    uint32_t  DeCommitTotalFreeThreshold;
+    uint32_t  LockPrefixTable;
+    uint32_t  MaximumAllocationSize;
+    uint32_t  VirtualMemoryThreshold;
+    uint32_t  ProcessHeapFlags;
+    uint32_t  ProcessAffinityMask;
+    uint16_t  CSDVersion;
+    uint16_t  Reserved1;
+    uint32_t  EditList;
+    uint32_t  SecurityCookie;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V1, 0x40);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V1 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V1 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V1;
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V2
 {
     uint32_t  Size;
     uint32_t  TimeDateStamp;
@@ -538,11 +587,50 @@ typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32
     uint32_t  SecurityCookie;
     uint32_t  SEHandlerTable;
     uint32_t  SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY32;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32 *PIMAGE_LOAD_CONFIG_DIRECTORY32;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V2;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V2, 0x48);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V2 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V2;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V2 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V2;
 
-typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32_V3
+{
+    uint32_t  Size;
+    uint32_t  TimeDateStamp;
+    uint16_t  MajorVersion;
+    uint16_t  MinorVersion;
+    uint32_t  GlobalFlagsClear;
+    uint32_t  GlobalFlagsSet;
+    uint32_t  CriticalSectionDefaultTimeout;
+    uint32_t  DeCommitFreeBlockThreshold;
+    uint32_t  DeCommitTotalFreeThreshold;
+    uint32_t  LockPrefixTable;
+    uint32_t  MaximumAllocationSize;
+    uint32_t  VirtualMemoryThreshold;
+    uint32_t  ProcessHeapFlags;
+    uint32_t  ProcessAffinityMask;
+    uint16_t  CSDVersion;
+    uint16_t  Reserved1;
+    uint32_t  EditList;
+    uint32_t  SecurityCookie;
+    uint32_t  SEHandlerTable;
+    uint32_t  SEHandlerCount;
+    uint32_t  GuardCFCCheckFunctionPointer;
+    uint32_t  Reserved2;
+    uint32_t  GuardCFFunctionTable;
+    uint32_t  GuardCFFunctionCount;
+    uint32_t  GuardFlags;
+} IMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY32_V3, 0x5c);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3 *PIMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3 const *PCIMAGE_LOAD_CONFIG_DIRECTORY32_V3;
+
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32_V3   IMAGE_LOAD_CONFIG_DIRECTORY32;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY32_V3  PIMAGE_LOAD_CONFIG_DIRECTORY32;
+typedef PCIMAGE_LOAD_CONFIG_DIRECTORY32_V3 PCIMAGE_LOAD_CONFIG_DIRECTORY32;
+
+/* No _IMAGE_LOAD_CONFIG_DIRECTORY64_V1 exists. */
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64_V2
 {
     uint32_t  Size;
     uint32_t  TimeDateStamp;
@@ -564,10 +652,48 @@ typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64
     uint64_t  SecurityCookie;
     uint64_t  SEHandlerTable;
     uint64_t  SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY64;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY64 *PIMAGE_LOAD_CONFIG_DIRECTORY64;
-typedef IMAGE_LOAD_CONFIG_DIRECTORY64 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64;
+} IMAGE_LOAD_CONFIG_DIRECTORY64_V2;
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY64_V2, 0x70);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V2 *PIMAGE_LOAD_CONFIG_DIRECTORY64_V2;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V2 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64_V2;
 
+#pragma pack(4) /* Why not 8 byte alignment, baka microsofties?!? */
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64_V3
+{
+    uint32_t  Size;
+    uint32_t  TimeDateStamp;
+    uint16_t  MajorVersion;
+    uint16_t  MinorVersion;
+    uint32_t  GlobalFlagsClear;
+    uint32_t  GlobalFlagsSet;
+    uint32_t  CriticalSectionDefaultTimeout;
+    uint64_t  DeCommitFreeBlockThreshold;
+    uint64_t  DeCommitTotalFreeThreshold;
+    uint64_t  LockPrefixTable;
+    uint64_t  MaximumAllocationSize;
+    uint64_t  VirtualMemoryThreshold;
+    uint64_t  ProcessAffinityMask;
+    uint32_t  ProcessHeapFlags;
+    uint16_t  CSDVersion;
+    uint16_t  Reserved1;
+    uint64_t  EditList;
+    uint64_t  SecurityCookie;
+    uint64_t  SEHandlerTable;
+    uint64_t  SEHandlerCount;
+    uint64_t  GuardCFCCheckFunctionPointer;
+    uint64_t  Reserved2;
+    uint64_t  GuardCFFunctionTable;
+    uint64_t  GuardCFFunctionCount;
+    uint32_t  GuardFlags;
+} IMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+#pragma pack()
+AssertCompileSize(IMAGE_LOAD_CONFIG_DIRECTORY64_V3, 0x94);
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3 *PIMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3 const *PCIMAGE_LOAD_CONFIG_DIRECTORY64_V3;
+
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64_V3   IMAGE_LOAD_CONFIG_DIRECTORY64;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY64_V3  PIMAGE_LOAD_CONFIG_DIRECTORY64;
+typedef PCIMAGE_LOAD_CONFIG_DIRECTORY64_V3 PCIMAGE_LOAD_CONFIG_DIRECTORY64;
 
 typedef struct _IMAGE_DEBUG_DIRECTORY
 {
@@ -580,6 +706,7 @@ typedef struct _IMAGE_DEBUG_DIRECTORY
     uint32_t  AddressOfRawData;
     uint32_t  PointerToRawData;
 } IMAGE_DEBUG_DIRECTORY;
+AssertCompileSize(IMAGE_DEBUG_DIRECTORY, 28);
 typedef IMAGE_DEBUG_DIRECTORY *PIMAGE_DEBUG_DIRECTORY;
 typedef IMAGE_DEBUG_DIRECTORY const *PCIMAGE_DEBUG_DIRECTORY;
 
@@ -591,6 +718,7 @@ typedef struct _IMAGE_DEBUG_MISC
     uint8_t    Reserved[3];
     uint8_t    Data[1];
 } IMAGE_DEBUG_MISC;
+AssertCompileSize(IMAGE_DEBUG_MISC, 16);
 typedef IMAGE_DEBUG_MISC *PIMAGE_DEBUG_MISC;
 typedef IMAGE_DEBUG_MISC const *PCIMAGE_DEBUG_MISC;
 
@@ -602,27 +730,11 @@ typedef struct WIN_CERTIFICATE
     uint16_t    wCertificateType;
     uint8_t     bCertificate[8];
 } WIN_CERTIFICATE;
+AssertCompileSize(WIN_CERTIFICATE, 16);
 typedef WIN_CERTIFICATE *PWIN_CERTIFICATE;
 typedef WIN_CERTIFICATE const *PCWIN_CERTIFICATE;
 
 
-
-
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-/* WARNING! NO MORE PRAGMA PACK 4 from here on. Assert size of all new types. */
-#pragma pack()
-
-
-
-
-
 /** The header of a .DBG file (NT4). */
 typedef struct _IMAGE_SEPARATE_DEBUG_HEADER
 {
diff --git a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
index a102b0a..6a3f8d7 100644
--- a/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
+++ b/src/VBox/Runtime/nt/RTErrConvertFromNtStatus.cpp
@@ -48,6 +48,7 @@ RTDECL(int)  RTErrConvertFromNtStatus(long lNativeCode)
         case STATUS_DATATYPE_MISALIGNMENT:  return VERR_INVALID_POINTER;
         case STATUS_NO_MORE_FILES:          return VERR_NO_MORE_FILES;
         case STATUS_NO_MORE_ENTRIES:        return VERR_NO_MORE_FILES;
+        case STATUS_NO_MEMORY:              return VERR_NO_MEMORY;
 
         case STATUS_INVALID_HANDLE:         return VERR_INVALID_HANDLE;
         case STATUS_INVALID_PARAMETER:      return VERR_INVALID_PARAMETER;
@@ -58,6 +59,7 @@ RTDECL(int)  RTErrConvertFromNtStatus(long lNativeCode)
         case STATUS_OBJECT_NAME_NOT_FOUND:  return VERR_FILE_NOT_FOUND;
         case STATUS_OBJECT_PATH_INVALID:    return VERR_INVALID_NAME;
         case STATUS_OBJECT_PATH_NOT_FOUND:  return VERR_PATH_NOT_FOUND;
+        case STATUS_OBJECT_PATH_SYNTAX_BAD: return VERR_INVALID_NAME;
         case STATUS_BAD_NETWORK_PATH:       return VERR_NET_PATH_NOT_FOUND;
         case STATUS_NOT_A_DIRECTORY:        return VERR_NOT_A_DIRECTORY;
     }
diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
index 2840dd4..fd35307 100644
--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
+++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
@@ -1,4 +1,4 @@
-/* $Revision: 91595 $ */
+/* $Revision: 94832 $ */
 /** @file
  * IPRT - Ring-0 Memory Objects, Linux.
  */
@@ -1528,23 +1528,30 @@ DECLHIDDEN(int) rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ p
             }
 
 #ifdef CONFIG_NUMA_BALANCING
+# if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+#  ifdef RHEL_RELEASE_CODE
+#   if RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7, 0)
+#    define VBOX_NUMA_HACK_OLD
+#   endif
+#  endif
+# endif
             if (RT_SUCCESS(rc))
             {
-                /** @todo Ugly hack! But right now we have no other means to disable
-                 *        automatic NUMA page balancing. */
+                /** @todo Ugly hack! But right now we have no other means to
+                 *        disable automatic NUMA page balancing. */
 # ifdef RT_OS_X86
-#  if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+#  ifdef VBOX_NUMA_HACK_OLD
                 pTask->mm->numa_next_reset = jiffies + 0x7fffffffUL;
 #  endif
                 pTask->mm->numa_next_scan  = jiffies + 0x7fffffffUL;
 # else
-#  if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+#  ifdef VBOX_NUMA_HACK_OLD
                 pTask->mm->numa_next_reset = jiffies + 0x7fffffffffffffffUL;
 #  endif
                 pTask->mm->numa_next_scan  = jiffies + 0x7fffffffffffffffUL;
 # endif
             }
-#endif
+#endif /* CONFIG_NUMA_BALANCING */
 
             up_write(&pTask->mm->mmap_sem);
 
diff --git a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm b/src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm
similarity index 75%
copy from src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
copy to src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm
index 11fdcf3..857c449 100644
--- a/src/VBox/HostDrivers/Support/win/SUPDrvA-win.asm
+++ b/src/VBox/Runtime/r0drv/nt/toxic-chkstk-r0drv-nt.asm
@@ -1,10 +1,10 @@
-; $Id: SUPDrvA-win.asm $
+; $Id: toxic-chkstk-r0drv-nt.asm $
 ;; @file
-; VirtualBox Support Driver - Windows NT specific assembly parts.
+; IPRT - Toxic _chkstk symbol.
 ;
 
 ;
-; Copyright (C) 2006-2010 Oracle Corporation
+; Copyright (C) 2006-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -30,17 +30,13 @@
 %include "iprt/asmdefs.mac"
 
 BEGINCODE
-%ifdef RT_ARCH_AMD64
- %define _DbgPrint DbgPrint
-%endif
-extern _DbgPrint
 
-%if 1 ; see alternative in SUPDrv-win.cpp
 ;;
-; Kind of alias for DbgPrint
-export NAME(SUPR0Printf)
-BEGINPROC SUPR0Printf
-        jmp     _DbgPrint
-ENDPROC SUPR0Printf
-%endif
+; Bad function to drag into kernel code as you're eating up too much stack.
+;
+BEGINPROC _chkstk
+%define MY_SYM _chkstk_is_considered_toxic_in_kernel_code__you_should_locate_code_using_too_much_stack_and_change_it_to_use_heap
+    extern  MY_SYM
+    jmp     MY_SYM
+ENDPROC _chkstk
 
diff --git a/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c
index 00aa7f0..ddec688 100644
--- a/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c
+++ b/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -214,7 +214,7 @@ RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem)
 
     rtR0SemEventMultiSolRelease(pThis);
 #ifdef DEBUG_ramshankar
-    /** See @bugref{6318} comment#11 */
+    /** See @bugref{6318} comment #11. */
     return VINF_SUCCESS;
 #endif
     RT_ASSERT_PREEMPT_CPUID();
@@ -246,7 +246,7 @@ RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem)
     rtR0SemEventMultiSolRelease(pThis);
 
 #ifdef DEBUG_ramshankar
-    /** See @bugref{6318} comment#11 */
+    /** See @bugref{6318} comment #11. */
     return VINF_SUCCESS;
 #endif
     RT_ASSERT_PREEMPT_CPUID();
diff --git a/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp b/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp
new file mode 100644
index 0000000..1c7fb86
--- /dev/null
+++ b/src/VBox/Runtime/r3/nt/RTProcQueryParent-r3-nt.cpp
@@ -0,0 +1,93 @@
+/* $Id: RTProcQueryParent-r3-nt.cpp $ */
+/** @file
+ * IPRT - Process, Windows.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#define LOG_GROUP RTLOGGROUP_PROCESS
+#include <iprt/nt/nt.h>
+
+#include <iprt/process.h>
+#include "internal/iprt.h"
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+
+
+
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent)
+{
+    NTSTATUS    rcNt;
+    HANDLE      hClose = RTNT_INVALID_HANDLE_VALUE;
+    HANDLE      hNtProc;
+
+    /*
+     * Open the process.  We take a shortcut if it's the current process.
+     */
+    if (hProcess == RTProcSelf())
+        hNtProc = NtCurrentProcess();
+    else
+    {
+        CLIENT_ID ClientId;
+        ClientId.UniqueProcess = (HANDLE)hProcess;
+        ClientId.UniqueThread  = NULL;
+
+        OBJECT_ATTRIBUTES ObjAttrs;
+        InitializeObjectAttributes(&ObjAttrs, NULL, OBJ_CASE_INSENSITIVE, NULL, NULL);
+
+        rcNt = NtOpenProcess(&hClose, PROCESS_QUERY_LIMITED_INFORMATION, &ObjAttrs, &ClientId);
+        if (!NT_SUCCESS(rcNt))
+            rcNt = NtOpenProcess(&hClose, PROCESS_QUERY_INFORMATION, &ObjAttrs, &ClientId);
+        if (!NT_SUCCESS(rcNt))
+            return RTErrConvertFromNtStatus(rcNt);
+        hNtProc = hClose;
+    }
+
+    /*
+     * Query the information.
+     */
+    int rc;
+    PROCESS_BASIC_INFORMATION BasicInfo;
+    ULONG cbIgn;
+    rcNt = NtQueryInformationProcess(hNtProc, ProcessBasicInformation, &BasicInfo, sizeof(BasicInfo), &cbIgn);
+    if (NT_SUCCESS(rcNt))
+    {
+        *phParent = BasicInfo.InheritedFromUniqueProcessId;
+        rc = VINF_SUCCESS;
+    }
+    else
+        rc = RTErrConvertFromNtStatus(rcNt);
+
+    /*
+     * Clean up.
+     */
+    if (hClose != RTNT_INVALID_HANDLE_VALUE)
+        NtClose(hClose);
+
+    return rc;
+}
+
diff --git a/src/VBox/Runtime/r3/posix/process-posix.cpp b/src/VBox/Runtime/r3/posix/process-posix.cpp
index 01631f6..553808f 100644
--- a/src/VBox/Runtime/r3/posix/process-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-posix.cpp
@@ -147,6 +147,17 @@ RTR3DECL(uint64_t) RTProcGetAffinityMask(void)
 }
 
 
+RTR3DECL(int) RTProcQueryParent(RTPROCESS hProcess, PRTPROCESS phParent)
+{
+    if (hProcess == RTProcSelf())
+    {
+        *phParent = getppid();
+        return VINF_SUCCESS;
+    }
+    return VERR_NOT_SUPPORTED;
+}
+
+
 RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser,
                                   size_t *pcbUser)
 {
diff --git a/src/VBox/Runtime/r3/posix/rtmemlocked-posix.cpp b/src/VBox/Runtime/r3/posix/rtmemlocked-posix.cpp
new file mode 100644
index 0000000..92aff0b
--- /dev/null
+++ b/src/VBox/Runtime/r3/posix/rtmemlocked-posix.cpp
@@ -0,0 +1,160 @@
+/* $Id: rtmemlocked-posix.cpp $ */
+/** @file
+ * IPRT - RTMemLocked*, POSIX.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include "internal/iprt.h"
+#include <iprt/mem.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/param.h>
+#include <iprt/string.h>
+#include "internal/mem.h"
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) 
+# define MAP_ANONYMOUS MAP_ANON 
+#endif
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Header for a locked memory region.
+ */
+typedef struct RTMEMLOCKEDHDR
+{
+    /** Magic value. */
+    uint32_t            u32Magic;
+    /** Size of the region in bytes including the header, rounded to a page aligned value. */
+    size_t              cbRegion;
+#if HC_ARCH_BITS == 64
+    /** 8 byte alignment of the structure on 64bit platforms. */
+    uint32_t            u32Alignment;
+#endif
+} RTMEMLOCKEDHDR;
+/** Pointer to a locked memory region header. */
+typedef RTMEMLOCKEDHDR *PRTMEMLOCKEDHDR;
+/** Magic for the header. (Vienna Teng) */
+#define RTMEMLOCKEDHDR_MAGIC UINT32_C(0x19781003)
+
+RTDECL(int) RTMemLockedAllocExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW
+{
+    int rc = VINF_SUCCESS;
+    size_t cbAlloc = RT_ALIGN_Z(cb + sizeof(RTMEMLOCKEDHDR), PAGE_SIZE);
+    void *pv;
+
+    NOREF(pszTag);
+
+    pv = mmap(NULL, cbAlloc, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
+              -1, 0);
+    if (pv != MAP_FAILED)
+    {
+        int rcPosix = mlock(pv, cbAlloc);
+        if (!rcPosix)
+        {
+            PRTMEMLOCKEDHDR pHdr = (PRTMEMLOCKEDHDR)pv;
+            AssertPtr(pHdr);
+
+            pHdr->u32Magic = RTMEMLOCKEDHDR_MAGIC;
+            pHdr->cbRegion = cbAlloc;
+            *ppv = pHdr + 1;
+        }
+        else
+            rc = RTErrConvertFromErrno(errno);
+    }
+
+    return rc;
+}
+
+RTDECL(int) RTMemLockedAllocZExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocExTag(cb, pszTag, &pv);
+
+    if (RT_SUCCESS(rc))
+    {
+        RT_BZERO(pv, cb);
+        *ppv = pv;
+    }
+
+    return rc;
+}
+
+RTDECL(void *) RTMemLockedAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocExTag(cb, pszTag, &pv);
+
+    if (RT_FAILURE(rc))
+        return NULL;
+
+    return pv;
+}
+
+RTDECL(void *) RTMemLockedAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocZExTag(cb, pszTag, &pv);
+
+    if (RT_FAILURE(rc))
+        return NULL;
+
+    return pv;
+}
+
+RTDECL(void) RTMemLockedFree(void *pv) RT_NO_THROW
+{
+    /*
+     * Validate & adjust the input.
+     */
+    if (!pv)
+        return;
+    AssertPtr(pv);
+
+    int rcPosix;
+    PRTMEMLOCKEDHDR pHdr = ((PRTMEMLOCKEDHDR)pv) - 1;
+    AssertReturnVoid(pHdr->u32Magic == RTMEMLOCKEDHDR_MAGIC);
+
+    pHdr->u32Magic = ~RTMEMLOCKEDHDR_MAGIC;
+    rcPosix = munlock(pHdr, pHdr->cbRegion);
+    AssertMsg(rcPosix == 0, ("rc=%d errno=%d pv=%p\n", rcPosix, errno, pHdr)); NOREF(rcPosix);
+
+    rcPosix = munmap(pHdr, pHdr->cbRegion);
+    AssertMsg(rcPosix == 0, ("rc=%d errno=%d pv=%p\n", rcPosix, errno, pHdr)); NOREF(rcPosix);
+}
+
diff --git a/src/VBox/Runtime/r3/stream.cpp b/src/VBox/Runtime/r3/stream.cpp
index d8b90cc..4866439 100644
--- a/src/VBox/Runtime/r3/stream.cpp
+++ b/src/VBox/Runtime/r3/stream.cpp
@@ -1092,6 +1092,19 @@ RTR3DECL(int) RTStrmPrintf(PRTSTREAM pStream, const char *pszFormat, ...)
 
 
 /**
+ * Dumper vprintf-like function outputting to a stream.
+ *
+ * @param   pvUser          The stream to print to.  NULL means standard output.
+ * @param   pszFormat       Runtime format string.
+ * @param   va              Arguments specified by pszFormat.
+ */
+RTDECL(void) RTStrmDumpPrintfV(void *pvUser, const char *pszFormat, va_list va)
+{
+    RTStrmPrintfV(pvUser ? (PRTSTREAM)pvUser : g_pStdOut, pszFormat, va);
+}
+
+
+/**
  * Prints a formatted string to the standard output stream (g_pStdOut).
  *
  * @returns Number of bytes printed.
diff --git a/src/VBox/Runtime/r3/win/VBoxRT-openssl-ose.def b/src/VBox/Runtime/r3/win/VBoxRT-openssl-ose.def
index e1ac857..193fe2a 100644
--- a/src/VBox/Runtime/r3/win/VBoxRT-openssl-ose.def
+++ b/src/VBox/Runtime/r3/win/VBoxRT-openssl-ose.def
@@ -805,8 +805,11 @@
     EVP_add_cipher
     EVP_add_digest
     EVP_aes_128_cbc
+    EVP_aes_128_xts
     EVP_aes_192_cbc
+    EVP_aes_192_xts
     EVP_aes_256_cbc
+    EVP_aes_256_xts
     EVP_BytesToKey
     EVP_Cipher
     EVP_CIPHER_asn1_to_param
diff --git a/src/VBox/Runtime/r3/win/VBoxRT-openssl.def b/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
index f872e71..967069b 100644
--- a/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
+++ b/src/VBox/Runtime/r3/win/VBoxRT-openssl.def
@@ -4,12 +4,12 @@
 ;
 ; This file is appended to the architecture specific .def file.
 ;
-; E:\coding\vbox\svn\trunk\tools\win.x86\vcc\v8sp1\bin\x86_amd64\dumpbin.exe \coding\vbox\svn\trunk\out\win.amd64\debug\lib\VBox-libcrypto.lib /symbols /OUT:foo.lst
-; grep " External " foo.lst | grep -v " UNDEF " | grep -v " ??_" | grep -v " notype  " | sort   | cut -d "|" -f 2
+; E:\coding\vbox\svn\trunk\tools\win.x86\vcc\v10sp1\bin\dumpbin.exe \coding\vbox\svn\trunk\out\win.amd64\debug\lib\VBox-libcrypto.lib /symbols /out:foo.lst
+; grep " External " foo.lst | grep -v " UNDEF " | grep -v " ??_" | grep -v " notype  " | cut -d "|" -f 2 | sort
 ;
 
 ;
-; Copyright (C) 2009-2013 Oracle Corporation
+; Copyright (C) 2009-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -40,35 +40,45 @@
     _CONF_new_data
     _CONF_new_section
     a2d_ASN1_OBJECT
+    a2i_ASN1_ENUMERATED
     a2i_ASN1_INTEGER
     a2i_ASN1_STRING
+    a2i_GENERAL_NAME
     a2i_ipadd
     a2i_IPADDRESS
     a2i_IPADDRESS_NC
     ACCESS_DESCRIPTION_free
     ACCESS_DESCRIPTION_new
+    AES_bi_ige_encrypt
     AES_cbc_encrypt
     AES_cfb1_encrypt
     AES_cfb128_encrypt
     AES_cfb8_encrypt
-    AES_cfbr_encrypt_block
     AES_ctr128_encrypt
     AES_decrypt
     AES_ecb_encrypt
     AES_encrypt
+    AES_ige_encrypt
     AES_ofb128_encrypt
     AES_options
     AES_set_decrypt_key
     AES_set_encrypt_key
-    asc2uni
+    AES_unwrap_key
+    AES_wrap_key
     asn1_add_error
+    ASN1_add_oid_module
+    ASN1_BIT_STRING_check
     ASN1_BIT_STRING_free
     ASN1_BIT_STRING_get_bit
+    ASN1_BIT_STRING_name_print
     ASN1_BIT_STRING_new
+    ASN1_BIT_STRING_num_asc
     ASN1_BIT_STRING_set
+    ASN1_BIT_STRING_set_asc
     ASN1_BIT_STRING_set_bit
     ASN1_BMPSTRING_free
     ASN1_BMPSTRING_new
+    ASN1_bn_print
     ASN1_check_infinite_end
     ASN1_const_check_infinite_end
     asn1_const_Finish
@@ -90,6 +100,7 @@
     asn1_ex_c2i
     asn1_ex_i2c
     asn1_Finish
+    ASN1_GENERALIZEDTIME_adj
     ASN1_GENERALIZEDTIME_check
     ASN1_GENERALIZEDTIME_free
     ASN1_GENERALIZEDTIME_new
@@ -131,7 +142,9 @@
     ASN1_item_ndef_i2d
     ASN1_item_new
     ASN1_item_pack
+    ASN1_item_print
     ASN1_item_sign
+    ASN1_item_sign_ctx
     ASN1_item_unpack
     ASN1_item_verify
     ASN1_mbstring_copy
@@ -150,7 +163,18 @@
     ASN1_pack_string
     ASN1_parse
     ASN1_parse_dump
-    asn1_primitive_clear
+    ASN1_PCTX_free
+    ASN1_PCTX_get_cert_flags
+    ASN1_PCTX_get_flags
+    ASN1_PCTX_get_nm_flags
+    ASN1_PCTX_get_oid_flags
+    ASN1_PCTX_get_str_flags
+    ASN1_PCTX_new
+    ASN1_PCTX_set_cert_flags
+    ASN1_PCTX_set_flags
+    ASN1_PCTX_set_nm_flags
+    ASN1_PCTX_set_oid_flags
+    ASN1_PCTX_set_str_flags
     ASN1_primitive_free
     ASN1_primitive_new
     ASN1_PRINTABLE_free
@@ -165,6 +189,7 @@
     asn1_set_choice_selector
     ASN1_sign
     ASN1_STRING_cmp
+    ASN1_STRING_copy
     ASN1_STRING_data
     ASN1_STRING_dup
     ASN1_STRING_free
@@ -194,12 +219,16 @@
     ASN1_template_free
     ASN1_template_i2d
     ASN1_template_new
+    asn1_template_print_ctx
+    ASN1_TIME_adj
     ASN1_TIME_check
     ASN1_TIME_free
     ASN1_TIME_new
     ASN1_TIME_print
     ASN1_TIME_set
+    ASN1_TIME_set_string
     ASN1_TIME_to_generalizedtime
+    ASN1_TYPE_cmp
     ASN1_TYPE_free
     ASN1_TYPE_get
     ASN1_TYPE_get_int_octetstring
@@ -213,6 +242,7 @@
     ASN1_UNIVERSALSTRING_new
     ASN1_UNIVERSALSTRING_to_string
     ASN1_unpack_string
+    ASN1_UTCTIME_adj
     ASN1_UTCTIME_check
     ASN1_UTCTIME_cmp_time_t
     ASN1_UTCTIME_free
@@ -231,15 +261,32 @@
     AUTHORITY_KEYID_new
     BASIC_CONSTRAINTS_free
     BASIC_CONSTRAINTS_new
+    BF_cbc_encrypt
+    BF_cfb64_encrypt
+    BF_decrypt
+    BF_ecb_encrypt
+    BF_encrypt
+    BF_ofb64_encrypt
+    BF_options
+    BF_set_key
     BIO_accept
+    BIO_asn1_get_prefix
+    BIO_asn1_get_suffix
+    BIO_asn1_set_prefix
+    BIO_asn1_set_suffix
     BIO_callback_ctrl
     BIO_clear_flags
     BIO_CONNECT_free
     BIO_CONNECT_new
     BIO_copy_next_retry
     BIO_ctrl
+    BIO_ctrl_get_read_request
+    BIO_ctrl_get_write_guarantee
     BIO_ctrl_pending
+    BIO_ctrl_reset_read_request
     BIO_ctrl_wpending
+    BIO_debug_callback
+    BIO_dgram_non_fatal_error
     BIO_dump
     BIO_dump_cb
     BIO_dump_fp
@@ -247,7 +294,16 @@
     BIO_dump_indent_cb
     BIO_dump_indent_fp
     BIO_dup_chain
+    BIO_f_asn1
+    BIO_f_base64
     BIO_f_buffer
+    BIO_f_cipher
+    BIO_f_md
+    BIO_f_nbio_test
+    BIO_f_null
+    BIO_f_reliable
+    BIO_fd_non_fatal_error
+    BIO_fd_should_retry
     BIO_find_type
     BIO_free
     BIO_free_all
@@ -267,27 +323,48 @@
     BIO_method_name
     BIO_method_type
     BIO_new
+    BIO_new_accept
+    BIO_new_bio_pair
+    BIO_new_CMS
     BIO_new_connect
+    BIO_new_dgram
+    BIO_new_fd
     BIO_new_file
     BIO_new_fp
+    BIO_new_mem_buf
+    BIO_new_NDEF
+    BIO_new_PKCS7
     BIO_new_socket
     BIO_next
+    BIO_nread
+    BIO_nread0
     BIO_number_read
     BIO_number_written
+    BIO_nwrite
+    BIO_nwrite0
     BIO_pop
+    BIO_printf
     BIO_ptr_ctrl
     BIO_push
     BIO_puts
     BIO_read
+    BIO_s_accept
+    BIO_s_bio
     BIO_s_connect
+    BIO_s_datagram
+    BIO_s_fd
     BIO_s_file
+    BIO_s_mem
+    BIO_s_null
     BIO_s_socket
     BIO_set
     BIO_set_callback
     BIO_set_callback_arg
+    BIO_set_cipher
     BIO_set_ex_data
     BIO_set_flags
     BIO_set_tcp_ndelay
+    BIO_snprintf
     BIO_sock_cleanup
     BIO_sock_error
     BIO_sock_init
@@ -297,27 +374,30 @@
     BIO_socket_nbio
     BIO_test_flags
     BIO_vfree
+    BIO_vprintf
+    BIO_vsnprintf
     BIO_write
     BN_add
     bn_add_part_words
     BN_add_word
     bn_add_words
+    BN_asc2bn
     BN_bin2bn
     BN_BLINDING_convert
     BN_BLINDING_convert_ex
     BN_BLINDING_create_param
     BN_BLINDING_free
     BN_BLINDING_get_flags
-    BN_BLINDING_get_thread_id
     BN_BLINDING_invert
     BN_BLINDING_invert_ex
     BN_BLINDING_new
     BN_BLINDING_set_flags
-    BN_BLINDING_set_thread_id
+    BN_BLINDING_thread_id
     BN_BLINDING_update
     BN_bn2bin
     BN_bn2dec
     BN_bn2hex
+    BN_bn2mpi
     BN_bntest_rand
     BN_clear
     BN_clear_bit
@@ -325,11 +405,11 @@
     BN_cmp
     bn_cmp_part_words
     bn_cmp_words
+    BN_consttime_swap
     BN_copy
     BN_CTX_end
     BN_CTX_free
     BN_CTX_get
-    BN_CTX_init
     BN_CTX_new
     BN_CTX_start
     BN_dec2bn
@@ -338,7 +418,6 @@
     BN_div_word
     bn_div_words
     BN_dup
-    bn_dup_expand
     BN_exp
     bn_expand2
     BN_free
@@ -346,7 +425,6 @@
     BN_gcd
     BN_GENCB_call
     BN_generate_prime_ex
-    BN_get_params
     BN_get_word
     BN_get0_nist_prime_192
     BN_get0_nist_prime_224
@@ -389,6 +467,7 @@
     BN_mod_exp_mont_word
     BN_mod_exp_recp
     BN_mod_exp_simple
+    BN_mod_exp2_mont
     BN_mod_inverse
     BN_mod_lshift
     BN_mod_lshift_quick
@@ -408,6 +487,7 @@
     BN_MONT_CTX_new
     BN_MONT_CTX_set
     BN_MONT_CTX_set_locked
+    BN_mpi2bn
     BN_mul
     bn_mul_add_words
     bn_mul_comba4
@@ -429,7 +509,9 @@
     BN_nnmod
     BN_num_bits
     BN_num_bits_word
+    BN_options
     BN_print
+    BN_print_fp
     BN_pseudo_rand
     BN_pseudo_rand_range
     BN_rand
@@ -443,7 +525,6 @@
     BN_rshift1
     BN_set_bit
     BN_set_negative
-    BN_set_params
     BN_set_word
     BN_sqr
     bn_sqr_comba4
@@ -462,11 +543,15 @@
     BN_ucmp
     BN_usub
     BN_value_one
+    BN_X931_derive_prime_ex
+    BN_X931_generate_prime_ex
+    BN_X931_generate_Xpq
     BUF_MEM_free
     BUF_MEM_grow
     BUF_MEM_grow_clean
     BUF_MEM_new
     BUF_memdup
+    BUF_reverse
     BUF_strdup
     BUF_strlcat
     BUF_strlcpy
@@ -476,29 +561,188 @@
     c2i_ASN1_OBJECT
     CERTIFICATEPOLICIES_free
     CERTIFICATEPOLICIES_new
+    check_defer
+    CMAC_CTX_cleanup
+    CMAC_CTX_copy
+    CMAC_CTX_free
+    CMAC_CTX_get0_cipher_ctx
+    CMAC_CTX_new
+    CMAC_Final
+    CMAC_Init
+    CMAC_resume
+    CMAC_Update
+    CMS_add_simple_smimecap
+    CMS_add_smimecap
+    CMS_add_standard_smimecap
+    CMS_add0_cert
+    CMS_add0_CertificateChoices
+    CMS_add0_crl
+    CMS_add0_recipient_key
+    CMS_add0_recipient_password
+    CMS_add0_RevocationInfoChoice
+    CMS_add1_cert
+    CMS_add1_crl
+    CMS_add1_ReceiptRequest
+    CMS_add1_recipient_cert
+    CMS_add1_signer
+    CMS_compress
+    cms_content_bio
+    CMS_ContentInfo_free
+    CMS_ContentInfo_new
+    CMS_ContentInfo_print_ctx
+    CMS_data
+    cms_Data_create
+    CMS_data_create
+    CMS_dataFinal
+    CMS_dataInit
+    CMS_decrypt
+    CMS_decrypt_set1_key
+    CMS_decrypt_set1_password
+    CMS_decrypt_set1_pkey
+    CMS_digest_create
+    CMS_digest_verify
+    cms_DigestAlgorithm_find_ctx
+    cms_DigestAlgorithm_init_bio
+    cms_DigestAlgorithm_set
+    cms_DigestedData_create
+    cms_DigestedData_do_final
+    cms_DigestedData_init_bio
+    cms_encode_Receipt
+    CMS_encrypt
+    cms_EncryptedContent_init
+    cms_EncryptedContent_init_bio
+    CMS_EncryptedData_decrypt
+    CMS_EncryptedData_encrypt
+    cms_EncryptedData_init_bio
+    CMS_EncryptedData_set1_key
+    CMS_EnvelopedData_create
+    cms_EnvelopedData_init_bio
+    CMS_final
+    CMS_get0_content
+    CMS_get0_eContentType
+    cms_get0_enveloped
+    CMS_get0_RecipientInfos
+    CMS_get0_SignerInfos
+    CMS_get0_signers
+    CMS_get0_type
+    CMS_get1_certs
+    CMS_get1_crls
+    CMS_get1_ReceiptRequest
+    CMS_is_detached
+    cms_msgSigDigest_add1
+    cms_Receipt_verify
+    CMS_ReceiptRequest_create0
+    CMS_ReceiptRequest_free
+    CMS_ReceiptRequest_get0_values
+    CMS_ReceiptRequest_new
+    CMS_RecipientInfo_decrypt
+    CMS_RecipientInfo_kekri_get0_id
+    CMS_RecipientInfo_kekri_id_cmp
+    CMS_RecipientInfo_ktri_cert_cmp
+    CMS_RecipientInfo_ktri_get0_algs
+    CMS_RecipientInfo_ktri_get0_signer_id
+    cms_RecipientInfo_pwri_crypt
+    CMS_RecipientInfo_set0_key
+    CMS_RecipientInfo_set0_password
+    CMS_RecipientInfo_set0_pkey
+    CMS_RecipientInfo_type
+    CMS_set_detached
+    CMS_set1_eContentType
+    cms_set1_SignerIdentifier
+    CMS_set1_signers_certs
+    CMS_sign
+    CMS_sign_receipt
+    CMS_signed_add1_attr
+    CMS_signed_add1_attr_by_NID
+    CMS_signed_add1_attr_by_OBJ
+    CMS_signed_add1_attr_by_txt
+    CMS_signed_delete_attr
+    CMS_signed_get_attr
+    CMS_signed_get_attr_by_NID
+    CMS_signed_get_attr_by_OBJ
+    CMS_signed_get_attr_count
+    CMS_signed_get0_data_by_OBJ
+    cms_SignedData_final
+    CMS_SignedData_init
+    cms_SignedData_init_bio
+    cms_SignerIdentifier_cert_cmp
+    cms_SignerIdentifier_get0_signer_id
+    CMS_SignerInfo_cert_cmp
+    CMS_SignerInfo_get0_algs
+    CMS_SignerInfo_get0_signer_id
+    CMS_SignerInfo_set1_signer_cert
+    CMS_SignerInfo_sign
+    CMS_SignerInfo_verify
+    CMS_SignerInfo_verify_content
+    CMS_stream
+    CMS_uncompress
+    CMS_unsigned_add1_attr
+    CMS_unsigned_add1_attr_by_NID
+    CMS_unsigned_add1_attr_by_OBJ
+    CMS_unsigned_add1_attr_by_txt
+    CMS_unsigned_delete_attr
+    CMS_unsigned_get_attr
+    CMS_unsigned_get_attr_by_NID
+    CMS_unsigned_get_attr_by_OBJ
+    CMS_unsigned_get_attr_count
+    CMS_unsigned_get0_data_by_OBJ
+    CMS_verify
+    CMS_verify_receipt
     CONF_dump_bio
     CONF_dump_fp
     CONF_free
     CONF_get_number
     CONF_get_section
     CONF_get_string
+    CONF_get1_default_config_file
+    CONF_imodule_get_flags
+    CONF_imodule_get_module
+    CONF_imodule_get_name
+    CONF_imodule_get_usr_data
+    CONF_imodule_get_value
+    CONF_imodule_set_flags
+    CONF_imodule_set_usr_data
     CONF_load
     CONF_load_bio
     CONF_load_fp
+    CONF_module_add
+    CONF_module_get_usr_data
+    CONF_module_set_usr_data
+    CONF_modules_finish
+    CONF_modules_free
+    CONF_modules_load
+    CONF_modules_load_file
+    CONF_modules_unload
     CONF_parse_list
     CONF_set_default_method
     CONF_set_nconf
     CRL_DIST_POINTS_free
     CRL_DIST_POINTS_new
     CRYPTO_add_lock
+    CRYPTO_cbc128_decrypt
+    CRYPTO_cbc128_encrypt
+    CRYPTO_ccm128_aad
+    CRYPTO_ccm128_decrypt
+    CRYPTO_ccm128_decrypt_ccm64
+    CRYPTO_ccm128_encrypt
+    CRYPTO_ccm128_encrypt_ccm64
+    CRYPTO_ccm128_init
+    CRYPTO_ccm128_setiv
+    CRYPTO_ccm128_tag
+    CRYPTO_cfb128_1_encrypt
+    CRYPTO_cfb128_8_encrypt
+    CRYPTO_cfb128_encrypt
     CRYPTO_cleanup_all_ex_data
+    CRYPTO_ctr128_encrypt
+    CRYPTO_ctr128_encrypt_ctr32
+    CRYPTO_cts128_decrypt
+    CRYPTO_cts128_decrypt_block
+    CRYPTO_cts128_encrypt
+    CRYPTO_cts128_encrypt_block
     CRYPTO_dbg_free
     CRYPTO_dbg_get_options
     CRYPTO_dbg_malloc
-    CRYPTO_dbg_pop_info
-    CRYPTO_dbg_push_info
     CRYPTO_dbg_realloc
-    CRYPTO_dbg_remove_all_info
     CRYPTO_dbg_set_options
     CRYPTO_destroy_dynlockid
     CRYPTO_dup_ex_data
@@ -506,6 +750,17 @@
     CRYPTO_free
     CRYPTO_free_ex_data
     CRYPTO_free_locked
+    CRYPTO_gcm128_aad
+    CRYPTO_gcm128_decrypt
+    CRYPTO_gcm128_decrypt_ctr32
+    CRYPTO_gcm128_encrypt
+    CRYPTO_gcm128_encrypt_ctr32
+    CRYPTO_gcm128_finish
+    CRYPTO_gcm128_init
+    CRYPTO_gcm128_new
+    CRYPTO_gcm128_release
+    CRYPTO_gcm128_setiv
+    CRYPTO_gcm128_tag
     CRYPTO_get_add_lock_callback
     CRYPTO_get_dynlock_create_callback
     CRYPTO_get_dynlock_destroy_callback
@@ -515,6 +770,7 @@
     CRYPTO_get_ex_data_implementation
     CRYPTO_get_ex_new_index
     CRYPTO_get_id_callback
+    CRYPTO_get_lock_name
     CRYPTO_get_locked_mem_ex_functions
     CRYPTO_get_locked_mem_functions
     CRYPTO_get_locking_callback
@@ -527,14 +783,19 @@
     CRYPTO_is_mem_check_on
     CRYPTO_lock
     CRYPTO_malloc
-    CRYPTO_malloc_debug_init
     CRYPTO_malloc_locked
     CRYPTO_mem_ctrl
     CRYPTO_mem_leaks
     CRYPTO_mem_leaks_cb
     CRYPTO_mem_leaks_fp
+    CRYPTO_memcmp
     CRYPTO_new_ex_data
+    CRYPTO_nistcts128_decrypt
+    CRYPTO_nistcts128_decrypt_block
+    CRYPTO_nistcts128_encrypt
+    CRYPTO_nistcts128_encrypt_block
     CRYPTO_num_locks
+    CRYPTO_ofb128_encrypt
     CRYPTO_pop_info
     CRYPTO_push_info_
     CRYPTO_realloc
@@ -555,9 +816,17 @@
     CRYPTO_set_mem_debug_options
     CRYPTO_set_mem_ex_functions
     CRYPTO_set_mem_functions
-    CRYPTO_set_mem_info_functions
     CRYPTO_strdup
     CRYPTO_thread_id
+    CRYPTO_THREADID_cmp
+    CRYPTO_THREADID_cpy
+    CRYPTO_THREADID_current
+    CRYPTO_THREADID_get_callback
+    CRYPTO_THREADID_hash
+    CRYPTO_THREADID_set_callback
+    CRYPTO_THREADID_set_numeric
+    CRYPTO_THREADID_set_pointer
+    CRYPTO_xts128_encrypt
     d2i_ACCESS_DESCRIPTION
     d2i_ASN1_BIT_STRING
     d2i_ASN1_BMPSTRING
@@ -573,7 +842,9 @@
     d2i_ASN1_OCTET_STRING
     d2i_ASN1_PRINTABLE
     d2i_ASN1_PRINTABLESTRING
+    d2i_ASN1_SEQUENCE_ANY
     d2i_ASN1_SET
+    d2i_ASN1_SET_ANY
     d2i_ASN1_T61STRING
     d2i_ASN1_TIME
     d2i_ASN1_TYPE
@@ -588,30 +859,27 @@
     d2i_AutoPrivateKey
     d2i_BASIC_CONSTRAINTS
     d2i_CERTIFICATEPOLICIES
+    d2i_CMS_bio
+    d2i_CMS_ContentInfo
+    d2i_CMS_ReceiptRequest
     d2i_CRL_DIST_POINTS
     d2i_DHparams
     d2i_DIRECTORYSTRING
     d2i_DISPLAYTEXT
     d2i_DIST_POINT
     d2i_DIST_POINT_NAME
-    d2i_EC_PRIVATEKEY
-    d2i_EC_PUBKEY
-    d2i_EC_PUBKEY_bio
-    d2i_EC_PUBKEY_fp
-    d2i_ECDSA_SIG
-    d2i_ECParameters
-    d2i_ECPKParameters
-    d2i_ECPKPARAMETERS
-    d2i_ECPrivateKey
-    d2i_ECPrivateKey_bio
-    d2i_ECPrivateKey_fp
     d2i_EDIPARTYNAME
     d2i_EXTENDED_KEY_USAGE
     d2i_GENERAL_NAME
     d2i_GENERAL_NAMES
+    d2i_ISSUING_DIST_POINT
     d2i_NETSCAPE_CERT_SEQUENCE
+    d2i_NETSCAPE_ENCRYPTED_PKEY
+    d2i_NETSCAPE_PKEY
+    d2i_Netscape_RSA
     d2i_NETSCAPE_SPKAC
     d2i_NETSCAPE_SPKI
+    d2i_NETSCAPE_X509
     d2i_NOTICEREF
     d2i_OCSP_BASICRESP
     d2i_OCSP_CERTID
@@ -635,6 +903,7 @@
     d2i_PKCS12
     d2i_PKCS12_BAGS
     d2i_PKCS12_bio
+    d2i_PKCS12_fp
     d2i_PKCS12_MAC_DATA
     d2i_PKCS12_SAFEBAG
     d2i_PKCS7
@@ -654,6 +923,8 @@
     d2i_PKCS8_PRIV_KEY_INFO
     d2i_PKCS8_PRIV_KEY_INFO_bio
     d2i_PKCS8_PRIV_KEY_INFO_fp
+    d2i_PKCS8PrivateKey_bio
+    d2i_PKCS8PrivateKey_fp
     d2i_PKEY_USAGE_PERIOD
     d2i_POLICYINFO
     d2i_POLICYQUALINFO
@@ -666,6 +937,8 @@
     d2i_PUBKEY_bio
     d2i_PUBKEY_fp
     d2i_PublicKey
+    d2i_RSA_NET
+    d2i_RSA_PSS_PARAMS
     d2i_RSA_PUBKEY
     d2i_RSA_PUBKEY_bio
     d2i_RSA_PUBKEY_fp
@@ -710,6 +983,8 @@
     DH_compute_key
     DH_free
     DH_generate_key
+    DH_generate_parameters
+    DH_generate_parameters_ex
     DH_get_default_method
     DH_get_ex_data
     DH_get_ex_new_index
@@ -721,6 +996,7 @@
     DH_set_method
     DH_size
     DH_up_ref
+    DHparams_dup
     DHparams_print
     DHparams_print_fp
     DIRECTORYSTRING_free
@@ -731,217 +1007,34 @@
     DIST_POINT_NAME_free
     DIST_POINT_NAME_new
     DIST_POINT_new
-    EC_EX_DATA_clear_free_all_data
-    EC_EX_DATA_clear_free_data
-    EC_EX_DATA_free_all_data
-    EC_EX_DATA_free_data
-    EC_EX_DATA_get_data
-    EC_EX_DATA_set_data
-    EC_get_builtin_curves
-    ec_GF2m_have_precompute_mult
-    ec_GF2m_precompute_mult
-    ec_GF2m_simple_add
-    ec_GF2m_simple_cmp
-    ec_GF2m_simple_dbl
-    ec_GF2m_simple_field_div
-    ec_GF2m_simple_field_mul
-    ec_GF2m_simple_field_sqr
-    ec_GF2m_simple_group_check_discriminant
-    ec_GF2m_simple_group_clear_finish
-    ec_GF2m_simple_group_copy
-    ec_GF2m_simple_group_finish
-    ec_GF2m_simple_group_get_curve
-    ec_GF2m_simple_group_get_degree
-    ec_GF2m_simple_group_init
-    ec_GF2m_simple_group_set_curve
-    ec_GF2m_simple_invert
-    ec_GF2m_simple_is_at_infinity
-    ec_GF2m_simple_is_on_curve
-    ec_GF2m_simple_make_affine
-    EC_GF2m_simple_method
-    ec_GF2m_simple_mul
-    ec_GF2m_simple_oct2point
-    ec_GF2m_simple_point_clear_finish
-    ec_GF2m_simple_point_copy
-    ec_GF2m_simple_point_finish
-    ec_GF2m_simple_point_get_affine_coordinates
-    ec_GF2m_simple_point_init
-    ec_GF2m_simple_point_set_affine_coordinates
-    ec_GF2m_simple_point_set_to_infinity
-    ec_GF2m_simple_point2oct
-    ec_GF2m_simple_points_make_affine
-    ec_GF2m_simple_set_compressed_coordinates
-    ec_GFp_mont_field_decode
-    ec_GFp_mont_field_encode
-    ec_GFp_mont_field_mul
-    ec_GFp_mont_field_set_to_one
-    ec_GFp_mont_field_sqr
-    ec_GFp_mont_group_clear_finish
-    ec_GFp_mont_group_copy
-    ec_GFp_mont_group_finish
-    ec_GFp_mont_group_init
-    ec_GFp_mont_group_set_curve
-    EC_GFp_mont_method
-    ec_GFp_nist_field_mul
-    ec_GFp_nist_field_sqr
-    ec_GFp_nist_group_copy
-    ec_GFp_nist_group_set_curve
-    EC_GFp_nist_method
-    ec_GFp_simple_add
-    ec_GFp_simple_cmp
-    ec_GFp_simple_dbl
-    ec_GFp_simple_field_mul
-    ec_GFp_simple_field_sqr
-    ec_GFp_simple_get_Jprojective_coordinates_GFp
-    ec_GFp_simple_group_check_discriminant
-    ec_GFp_simple_group_clear_finish
-    ec_GFp_simple_group_copy
-    ec_GFp_simple_group_finish
-    ec_GFp_simple_group_get_curve
-    ec_GFp_simple_group_get_degree
-    ec_GFp_simple_group_init
-    ec_GFp_simple_group_set_curve
-    ec_GFp_simple_invert
-    ec_GFp_simple_is_at_infinity
-    ec_GFp_simple_is_on_curve
-    ec_GFp_simple_make_affine
-    EC_GFp_simple_method
-    ec_GFp_simple_oct2point
-    ec_GFp_simple_point_clear_finish
-    ec_GFp_simple_point_copy
-    ec_GFp_simple_point_finish
-    ec_GFp_simple_point_get_affine_coordinates
-    ec_GFp_simple_point_init
-    ec_GFp_simple_point_set_affine_coordinates
-    ec_GFp_simple_point_set_to_infinity
-    ec_GFp_simple_point2oct
-    ec_GFp_simple_points_make_affine
-    ec_GFp_simple_set_compressed_coordinates
-    ec_GFp_simple_set_Jprojective_coordinates_GFp
-    EC_GROUP_check_discriminant
-    EC_GROUP_clear_free
-    EC_GROUP_cmp
-    EC_GROUP_copy
-    EC_GROUP_dup
-    EC_GROUP_free
-    EC_GROUP_get_asn1_flag
-    EC_GROUP_get_basis_type
-    EC_GROUP_get_cofactor
-    EC_GROUP_get_curve_GF2m
-    EC_GROUP_get_curve_GFp
-    EC_GROUP_get_curve_name
-    EC_GROUP_get_degree
-    EC_GROUP_get_order
-    EC_GROUP_get_pentanomial_basis
-    EC_GROUP_get_point_conversion_form
-    EC_GROUP_get_seed_len
-    EC_GROUP_get_trinomial_basis
-    EC_GROUP_get0_generator
-    EC_GROUP_get0_seed
-    EC_GROUP_have_precompute_mult
-    EC_GROUP_method_of
-    EC_GROUP_new
-    EC_GROUP_new_by_curve_name
-    EC_GROUP_new_curve_GF2m
-    EC_GROUP_new_curve_GFp
-    EC_GROUP_precompute_mult
-    EC_GROUP_set_asn1_flag
-    EC_GROUP_set_curve_GF2m
-    EC_GROUP_set_curve_GFp
-    EC_GROUP_set_curve_name
-    EC_GROUP_set_generator
-    EC_GROUP_set_point_conversion_form
-    EC_GROUP_set_seed
-    EC_KEY_check_key
-    EC_KEY_copy
-    EC_KEY_dup
-    EC_KEY_free
-    EC_KEY_generate_key
-    EC_KEY_get_conv_form
-    EC_KEY_get_enc_flags
-    EC_KEY_get_key_method_data
-    EC_KEY_get0_group
-    EC_KEY_get0_private_key
-    EC_KEY_get0_public_key
-    EC_KEY_insert_key_method_data
-    EC_KEY_new
-    EC_KEY_new_by_curve_name
-    EC_KEY_precompute_mult
-    EC_KEY_print
-    EC_KEY_print_fp
-    EC_KEY_set_asn1_flag
-    EC_KEY_set_conv_form
-    EC_KEY_set_enc_flags
-    EC_KEY_set_group
-    EC_KEY_set_private_key
-    EC_KEY_set_public_key
-    EC_KEY_up_ref
-    EC_METHOD_get_field_type
-    EC_POINT_add
-    EC_POINT_bn2point
-    EC_POINT_clear_free
-    EC_POINT_cmp
-    EC_POINT_copy
-    EC_POINT_dbl
-    EC_POINT_dup
-    EC_POINT_free
-    EC_POINT_get_affine_coordinates_GF2m
-    EC_POINT_get_affine_coordinates_GFp
-    EC_POINT_get_Jprojective_coordinates_GFp
-    EC_POINT_hex2point
-    EC_POINT_invert
-    EC_POINT_is_at_infinity
-    EC_POINT_is_on_curve
-    EC_POINT_make_affine
-    EC_POINT_method_of
-    EC_POINT_mul
-    EC_POINT_new
-    EC_POINT_oct2point
-    EC_POINT_point2bn
-    EC_POINT_point2hex
-    EC_POINT_point2oct
-    EC_POINT_set_affine_coordinates_GF2m
-    EC_POINT_set_affine_coordinates_GFp
-    EC_POINT_set_compressed_coordinates_GF2m
-    EC_POINT_set_compressed_coordinates_GFp
-    EC_POINT_set_Jprojective_coordinates_GFp
-    EC_POINT_set_to_infinity
-    EC_POINTs_make_affine
-    EC_POINTs_mul
-    EC_PRIVATEKEY_free
-    EC_PRIVATEKEY_new
-    ec_wNAF_have_precompute_mult
-    ec_wNAF_mul
-    ec_wNAF_precompute_mult
-    ecdsa_check
-    ECDSA_do_sign
-    ECDSA_do_sign_ex
-    ECDSA_do_verify
-    ECDSA_get_default_method
-    ECDSA_get_ex_data
-    ECDSA_get_ex_new_index
-    ECDSA_OpenSSL
-    ECDSA_set_default_method
-    ECDSA_set_ex_data
-    ECDSA_set_method
-    ECDSA_SIG_free
-    ECDSA_SIG_new
-    ECDSA_sign
-    ECDSA_sign_ex
-    ECDSA_sign_setup
-    ECDSA_size
-    ECDSA_verify
-    ECPARAMETERS_free
-    ECPARAMETERS_new
-    ECParameters_print
-    ECParameters_print_fp
-    ECPKPARAMETERS_free
-    ECPKPARAMETERS_new
-    ECPKParameters_print
-    ECPKParameters_print_fp
+    DIST_POINT_set_dpname
+    DSO_bind_func
+    DSO_bind_var
+    DSO_convert_filename
+    DSO_ctrl
+    DSO_flags
+    DSO_free
+    DSO_get_default_method
+    DSO_get_filename
+    DSO_get_loaded_filename
+    DSO_get_method
+    DSO_global_lookup
+    DSO_load
+    DSO_merge
+    DSO_METHOD_null
+    DSO_METHOD_openssl
+    DSO_new
+    DSO_new_method
+    DSO_pathbyaddr
+    DSO_set_default_method
+    DSO_set_filename
+    DSO_set_method
+    DSO_set_name_converter
+    DSO_up_ref
     EDIPARTYNAME_free
     EDIPARTYNAME_new
     ERR_add_error_data
+    ERR_add_error_vdata
     ERR_clear_error
     ERR_error_string
     ERR_error_string_n
@@ -956,42 +1049,86 @@
     ERR_get_state
     ERR_get_string_table
     ERR_lib_error_string
+    ERR_load_ASN1_strings
+    ERR_load_BIO_strings
+    ERR_load_BN_strings
+    ERR_load_BUF_strings
+    ERR_load_CMS_strings
+    ERR_load_CONF_strings
+    ERR_load_CRYPTO_strings
+    ERR_load_crypto_strings
+    ERR_load_DH_strings
+    ERR_load_DSO_strings
+    ERR_load_ERR_strings
+    ERR_load_EVP_strings
+    ERR_load_OBJ_strings
+    ERR_load_OCSP_strings
+    ERR_load_PEM_strings
+    ERR_load_PKCS12_strings
+    ERR_load_PKCS7_strings
+    ERR_load_RAND_strings
+    ERR_load_RSA_strings
     ERR_load_strings
+    ERR_load_UI_strings
+    ERR_load_X509_strings
+    ERR_load_X509V3_strings
     ERR_peek_error
     ERR_peek_error_line
     ERR_peek_error_line_data
     ERR_peek_last_error
     ERR_peek_last_error_line
     ERR_peek_last_error_line_data
+    ERR_pop_to_mark
     ERR_print_errors
     ERR_print_errors_cb
+    ERR_print_errors_fp
     ERR_put_error
     ERR_reason_error_string
     ERR_release_err_state_table
     ERR_remove_state
+    ERR_remove_thread_state
     ERR_set_error_data
     ERR_set_implementation
+    ERR_set_mark
     ERR_unload_strings
+    EVP_add_alg_module
     EVP_add_cipher
     EVP_add_digest
     EVP_aes_128_cbc
+    EVP_aes_128_cbc_hmac_sha1
+    EVP_aes_128_ccm
     EVP_aes_128_cfb1
     EVP_aes_128_cfb128
     EVP_aes_128_cfb8
+    EVP_aes_128_ctr
     EVP_aes_128_ecb
+    EVP_aes_128_gcm
     EVP_aes_128_ofb
+    EVP_aes_128_xts
     EVP_aes_192_cbc
+    EVP_aes_192_ccm
     EVP_aes_192_cfb1
     EVP_aes_192_cfb128
     EVP_aes_192_cfb8
+    EVP_aes_192_ctr
     EVP_aes_192_ecb
+    EVP_aes_192_gcm
     EVP_aes_192_ofb
     EVP_aes_256_cbc
+    EVP_aes_256_cbc_hmac_sha1
+    EVP_aes_256_ccm
     EVP_aes_256_cfb1
     EVP_aes_256_cfb128
     EVP_aes_256_cfb8
+    EVP_aes_256_ctr
     EVP_aes_256_ecb
+    EVP_aes_256_gcm
     EVP_aes_256_ofb
+    EVP_aes_256_xts
+    EVP_bf_cbc
+    EVP_bf_cfb64
+    EVP_bf_ecb
+    EVP_bf_ofb
     EVP_BytesToKey
     EVP_Cipher
     EVP_CIPHER_asn1_to_param
@@ -1000,6 +1137,7 @@
     EVP_CIPHER_CTX_cipher
     EVP_CIPHER_CTX_cleanup
     EVP_CIPHER_CTX_clear_flags
+    EVP_CIPHER_CTX_copy
     EVP_CIPHER_CTX_ctrl
     EVP_CIPHER_CTX_flags
     EVP_CIPHER_CTX_free
@@ -1015,6 +1153,8 @@
     EVP_CIPHER_CTX_set_key_length
     EVP_CIPHER_CTX_set_padding
     EVP_CIPHER_CTX_test_flags
+    EVP_CIPHER_do_all
+    EVP_CIPHER_do_all_sorted
     EVP_CIPHER_flags
     EVP_CIPHER_get_asn1_iv
     EVP_CIPHER_iv_length
@@ -1043,7 +1183,13 @@
     EVP_DigestFinal_ex
     EVP_DigestInit
     EVP_DigestInit_ex
+    EVP_DigestSignFinal
+    EVP_DigestSignInit
     EVP_DigestUpdate
+    EVP_DigestVerifyFinal
+    EVP_DigestVerifyInit
+    EVP_dss
+    EVP_dss1
     EVP_ecdsa
     EVP_enc_null
     EVP_EncodeBlock
@@ -1069,45 +1215,142 @@
     EVP_MD_CTX_md
     EVP_MD_CTX_set_flags
     EVP_MD_CTX_test_flags
+    EVP_MD_do_all
+    EVP_MD_do_all_sorted
+    EVP_MD_flags
+    EVP_md_null
     EVP_MD_pkey_type
     EVP_MD_size
     EVP_MD_type
     EVP_md5
+    EVP_OpenFinal
+    EVP_OpenInit
     EVP_PBE_alg_add
+    EVP_PBE_alg_add_type
     EVP_PBE_CipherInit
     EVP_PBE_cleanup
+    EVP_PBE_find
     EVP_PKCS82PKEY
     EVP_PKEY_add1_attr
     EVP_PKEY_add1_attr_by_NID
     EVP_PKEY_add1_attr_by_OBJ
     EVP_PKEY_add1_attr_by_txt
+    EVP_PKEY_asn1_add_alias
+    EVP_PKEY_asn1_add0
+    EVP_PKEY_asn1_copy
+    EVP_PKEY_asn1_find
+    EVP_PKEY_asn1_find_str
+    EVP_PKEY_asn1_free
+    EVP_PKEY_asn1_get_count
+    EVP_PKEY_asn1_get0
+    EVP_PKEY_asn1_get0_info
+    EVP_PKEY_asn1_new
+    EVP_PKEY_asn1_set_ctrl
+    EVP_PKEY_asn1_set_free
+    EVP_PKEY_asn1_set_param
+    EVP_PKEY_asn1_set_private
+    EVP_PKEY_asn1_set_public
     EVP_PKEY_assign
+    EVP_PKEY_base_id
     EVP_PKEY_bits
     EVP_PKEY_cmp
     EVP_PKEY_cmp_parameters
     EVP_PKEY_copy_parameters
+    EVP_PKEY_CTX_ctrl
+    EVP_PKEY_CTX_ctrl_str
+    EVP_PKEY_CTX_dup
+    EVP_PKEY_CTX_free
+    EVP_PKEY_CTX_get_app_data
+    EVP_PKEY_CTX_get_cb
+    EVP_PKEY_CTX_get_data
+    EVP_PKEY_CTX_get_keygen_info
+    EVP_PKEY_CTX_get_operation
+    EVP_PKEY_CTX_get0_peerkey
+    EVP_PKEY_CTX_get0_pkey
+    EVP_PKEY_CTX_new
+    EVP_PKEY_CTX_new_id
+    EVP_PKEY_CTX_set_app_data
+    EVP_PKEY_CTX_set_cb
+    EVP_PKEY_CTX_set_data
+    EVP_PKEY_CTX_set0_keygen_info
+    EVP_PKEY_decrypt
+    EVP_PKEY_decrypt_init
+    EVP_PKEY_decrypt_old
     EVP_PKEY_delete_attr
+    EVP_PKEY_derive
+    EVP_PKEY_derive_init
+    EVP_PKEY_derive_set_peer
+    EVP_PKEY_encrypt
+    EVP_PKEY_encrypt_init
+    EVP_PKEY_encrypt_old
     EVP_PKEY_free
     EVP_PKEY_get_attr
     EVP_PKEY_get_attr_by_NID
     EVP_PKEY_get_attr_by_OBJ
     EVP_PKEY_get_attr_count
+    EVP_PKEY_get_default_digest_nid
+    EVP_PKEY_get0
+    EVP_PKEY_get0_asn1
     EVP_PKEY_get1_DH
-    EVP_PKEY_get1_EC_KEY
     EVP_PKEY_get1_RSA
+    EVP_PKEY_id
+    EVP_PKEY_keygen
+    EVP_PKEY_keygen_init
+    EVP_PKEY_meth_add0
+    EVP_PKEY_meth_copy
+    EVP_PKEY_meth_find
+    EVP_PKEY_meth_free
+    EVP_PKEY_meth_get0_info
+    EVP_PKEY_meth_new
+    EVP_PKEY_meth_set_cleanup
+    EVP_PKEY_meth_set_copy
+    EVP_PKEY_meth_set_ctrl
+    EVP_PKEY_meth_set_decrypt
+    EVP_PKEY_meth_set_derive
+    EVP_PKEY_meth_set_encrypt
+    EVP_PKEY_meth_set_init
+    EVP_PKEY_meth_set_keygen
+    EVP_PKEY_meth_set_paramgen
+    EVP_PKEY_meth_set_sign
+    EVP_PKEY_meth_set_signctx
+    EVP_PKEY_meth_set_verify
+    EVP_PKEY_meth_set_verify_recover
+    EVP_PKEY_meth_set_verifyctx
     EVP_PKEY_missing_parameters
     EVP_PKEY_new
+    EVP_PKEY_new_mac_key
+    EVP_PKEY_paramgen
+    EVP_PKEY_paramgen_init
+    EVP_PKEY_print_params
+    EVP_PKEY_print_private
+    EVP_PKEY_print_public
     EVP_PKEY_save_parameters
+    evp_pkey_set_cb_translate
+    EVP_PKEY_set_type
+    EVP_PKEY_set_type_str
     EVP_PKEY_set1_DH
-    EVP_PKEY_set1_EC_KEY
     EVP_PKEY_set1_RSA
+    EVP_PKEY_sign
+    EVP_PKEY_sign_init
     EVP_PKEY_size
     EVP_PKEY_type
+    EVP_PKEY_verify
+    EVP_PKEY_verify_init
+    EVP_PKEY_verify_recover
+    EVP_PKEY_verify_recover_init
     EVP_PKEY2PKCS8
     EVP_PKEY2PKCS8_broken
     EVP_rc4
     EVP_rc4_40
+    EVP_rc4_hmac_md5
     EVP_read_pw_string
+    EVP_read_pw_string_min
+    EVP_SealFinal
+    EVP_SealInit
+    EVP_seed_cbc
+    EVP_seed_cfb128
+    EVP_seed_ecb
+    EVP_seed_ofb
     EVP_set_pw_prompt
     EVP_sha1
     EVP_sha224
@@ -1118,16 +1361,31 @@
     EVP_VerifyFinal
     EXTENDED_KEY_USAGE_free
     EXTENDED_KEY_USAGE_new
+    GENERAL_NAME_cmp
+    GENERAL_NAME_dup
     GENERAL_NAME_free
+    GENERAL_NAME_get0_otherName
+    GENERAL_NAME_get0_value
     GENERAL_NAME_new
     GENERAL_NAME_print
+    GENERAL_NAME_set0_othername
+    GENERAL_NAME_set0_value
     GENERAL_NAMES_free
     GENERAL_NAMES_new
     GENERAL_SUBTREE_free
     GENERAL_SUBTREE_new
+    get_rfc2409_prime_1024
+    get_rfc2409_prime_768
+    get_rfc3526_prime_1536
+    get_rfc3526_prime_2048
+    get_rfc3526_prime_3072
+    get_rfc3526_prime_4096
+    get_rfc3526_prime_6144
+    get_rfc3526_prime_8192
     hex_to_string
     HMAC
     HMAC_CTX_cleanup
+    HMAC_CTX_copy
     HMAC_CTX_init
     HMAC_CTX_set_flags
     HMAC_Final
@@ -1135,12 +1393,14 @@
     HMAC_Init_ex
     HMAC_Update
     i2a_ACCESS_DESCRIPTION
+    i2a_ASN1_ENUMERATED
     i2a_ASN1_INTEGER
     i2a_ASN1_OBJECT
     i2a_ASN1_STRING
     i2c_ASN1_BIT_STRING
     i2c_ASN1_INTEGER
     i2d_ACCESS_DESCRIPTION
+    i2d_ASN1_bio_stream
     i2d_ASN1_BIT_STRING
     i2d_ASN1_BMPSTRING
     i2d_ASN1_BOOLEAN
@@ -1155,7 +1415,9 @@
     i2d_ASN1_OCTET_STRING
     i2d_ASN1_PRINTABLE
     i2d_ASN1_PRINTABLESTRING
+    i2d_ASN1_SEQUENCE_ANY
     i2d_ASN1_SET
+    i2d_ASN1_SET_ANY
     i2d_ASN1_T61STRING
     i2d_ASN1_TIME
     i2d_ASN1_TYPE
@@ -1167,30 +1429,28 @@
     i2d_AUTHORITY_KEYID
     i2d_BASIC_CONSTRAINTS
     i2d_CERTIFICATEPOLICIES
+    i2d_CMS_bio
+    i2d_CMS_bio_stream
+    i2d_CMS_ContentInfo
+    i2d_CMS_ReceiptRequest
     i2d_CRL_DIST_POINTS
     i2d_DHparams
     i2d_DIRECTORYSTRING
     i2d_DISPLAYTEXT
     i2d_DIST_POINT
     i2d_DIST_POINT_NAME
-    i2d_EC_PRIVATEKEY
-    i2d_EC_PUBKEY
-    i2d_EC_PUBKEY_bio
-    i2d_EC_PUBKEY_fp
-    i2d_ECDSA_SIG
-    i2d_ECParameters
-    i2d_ECPKParameters
-    i2d_ECPKPARAMETERS
-    i2d_ECPrivateKey
-    i2d_ECPrivateKey_bio
-    i2d_ECPrivateKey_fp
     i2d_EDIPARTYNAME
     i2d_EXTENDED_KEY_USAGE
     i2d_GENERAL_NAME
     i2d_GENERAL_NAMES
+    i2d_ISSUING_DIST_POINT
     i2d_NETSCAPE_CERT_SEQUENCE
+    i2d_NETSCAPE_ENCRYPTED_PKEY
+    i2d_NETSCAPE_PKEY
+    i2d_Netscape_RSA
     i2d_NETSCAPE_SPKAC
     i2d_NETSCAPE_SPKI
+    i2d_NETSCAPE_X509
     i2d_NOTICEREF
     i2d_OCSP_BASICRESP
     i2d_OCSP_CERTID
@@ -1214,10 +1474,12 @@
     i2d_PKCS12
     i2d_PKCS12_BAGS
     i2d_PKCS12_bio
+    i2d_PKCS12_fp
     i2d_PKCS12_MAC_DATA
     i2d_PKCS12_SAFEBAG
     i2d_PKCS7
     i2d_PKCS7_bio
+    i2d_PKCS7_bio_stream
     i2d_PKCS7_DIGEST
     i2d_PKCS7_ENC_CONTENT
     i2d_PKCS7_ENCRYPT
@@ -1234,6 +1496,10 @@
     i2d_PKCS8_PRIV_KEY_INFO
     i2d_PKCS8_PRIV_KEY_INFO_bio
     i2d_PKCS8_PRIV_KEY_INFO_fp
+    i2d_PKCS8PrivateKey_bio
+    i2d_PKCS8PrivateKey_fp
+    i2d_PKCS8PrivateKey_nid_bio
+    i2d_PKCS8PrivateKey_nid_fp
     i2d_PKCS8PrivateKeyInfo_bio
     i2d_PKCS8PrivateKeyInfo_fp
     i2d_PKEY_USAGE_PERIOD
@@ -1248,6 +1514,8 @@
     i2d_PUBKEY_bio
     i2d_PUBKEY_fp
     i2d_PublicKey
+    i2d_RSA_NET
+    i2d_RSA_PSS_PARAMS
     i2d_RSA_PUBKEY
     i2d_RSA_PUBKEY_bio
     i2d_RSA_PUBKEY_fp
@@ -1287,7 +1555,6 @@
     i2d_X509_REVOKED
     i2d_X509_SIG
     i2d_X509_VAL
-    i2o_ECPublicKey
     i2s_ASN1_ENUMERATED
     i2s_ASN1_ENUMERATED_TABLE
     i2s_ASN1_INTEGER
@@ -1296,6 +1563,9 @@
     i2v_ASN1_BIT_STRING
     i2v_GENERAL_NAME
     i2v_GENERAL_NAMES
+    int_rsa_verify
+    ISSUING_DIST_POINT_free
+    ISSUING_DIST_POINT_new
     level_add_node
     level_find_node
     lh_delete
@@ -1304,16 +1574,23 @@
     lh_free
     lh_insert
     lh_new
+    lh_node_stats
+    lh_node_stats_bio
+    lh_node_usage_stats
+    lh_node_usage_stats_bio
     lh_num_items
     lh_retrieve
+    lh_stats
+    lh_stats_bio
     lh_strhash
+    MD5
     md5_block_data_order
     MD5_Final
     MD5_Init
     MD5_Transform
     MD5_Update
-    MGF1
     name_cmp
+    NAME_CONSTRAINTS_check
     NAME_CONSTRAINTS_free
     NAME_CONSTRAINTS_new
     NCONF_default
@@ -1331,23 +1608,36 @@
     NCONF_WIN32
     NETSCAPE_CERT_SEQUENCE_free
     NETSCAPE_CERT_SEQUENCE_new
+    NETSCAPE_ENCRYPTED_PKEY_free
+    NETSCAPE_ENCRYPTED_PKEY_new
+    NETSCAPE_PKEY_free
+    NETSCAPE_PKEY_new
     NETSCAPE_SPKAC_free
     NETSCAPE_SPKAC_new
+    NETSCAPE_SPKI_b64_decode
+    NETSCAPE_SPKI_b64_encode
     NETSCAPE_SPKI_free
+    NETSCAPE_SPKI_get_pubkey
     NETSCAPE_SPKI_new
+    NETSCAPE_SPKI_print
+    NETSCAPE_SPKI_set_pubkey
     NETSCAPE_SPKI_sign
     NETSCAPE_SPKI_verify
+    NETSCAPE_X509_free
+    NETSCAPE_X509_new
     NOTICEREF_free
     NOTICEREF_new
-    o2i_ECPublicKey
     OBJ_add_object
-    OBJ_bsearch
-    OBJ_bsearch_ex
+    OBJ_add_sigid
+    OBJ_bsearch_
+    OBJ_bsearch_ex_
     OBJ_cleanup
     OBJ_cmp
     OBJ_create
     OBJ_create_objects
     OBJ_dup
+    OBJ_find_sigid_algs
+    OBJ_find_sigid_by_algs
     OBJ_ln2nid
     OBJ_NAME_add
     OBJ_NAME_cleanup
@@ -1363,47 +1653,150 @@
     OBJ_nid2sn
     OBJ_obj2nid
     OBJ_obj2txt
+    OBJ_sigid_free
     OBJ_sn2nid
     OBJ_txt2nid
     OBJ_txt2obj
+    OCSP_accept_responses_new
+    OCSP_archive_cutoff_new
+    OCSP_basic_add1_cert
+    OCSP_basic_add1_nonce
+    OCSP_basic_add1_status
+    OCSP_basic_sign
+    OCSP_basic_verify
+    OCSP_BASICRESP_add_ext
+    OCSP_BASICRESP_add1_ext_i2d
+    OCSP_BASICRESP_delete_ext
     OCSP_BASICRESP_free
+    OCSP_BASICRESP_get_ext
+    OCSP_BASICRESP_get_ext_by_critical
+    OCSP_BASICRESP_get_ext_by_NID
+    OCSP_BASICRESP_get_ext_by_OBJ
+    OCSP_BASICRESP_get_ext_count
+    OCSP_BASICRESP_get1_ext_d2i
     OCSP_BASICRESP_new
+    OCSP_cert_id_new
+    OCSP_cert_status_str
+    OCSP_cert_to_id
+    OCSP_CERTID_dup
     OCSP_CERTID_free
     OCSP_CERTID_new
     OCSP_CERTSTATUS_free
     OCSP_CERTSTATUS_new
+    OCSP_check_nonce
+    OCSP_check_validity
+    OCSP_copy_nonce
+    OCSP_crl_reason_str
     OCSP_CRLID_free
     OCSP_CRLID_new
+    OCSP_crlID_new
+    OCSP_id_cmp
+    OCSP_id_get0_info
+    OCSP_id_issuer_cmp
+    OCSP_ONEREQ_add_ext
+    OCSP_ONEREQ_add1_ext_i2d
+    OCSP_ONEREQ_delete_ext
     OCSP_ONEREQ_free
+    OCSP_ONEREQ_get_ext
+    OCSP_ONEREQ_get_ext_by_critical
+    OCSP_ONEREQ_get_ext_by_NID
+    OCSP_ONEREQ_get_ext_by_OBJ
+    OCSP_ONEREQ_get_ext_count
+    OCSP_onereq_get0_id
+    OCSP_ONEREQ_get1_ext_d2i
     OCSP_ONEREQ_new
+    OCSP_parse_url
+    OCSP_REQ_CTX_add1_header
+    OCSP_REQ_CTX_free
+    OCSP_REQ_CTX_set1_req
     OCSP_REQINFO_free
     OCSP_REQINFO_new
+    OCSP_REQUEST_add_ext
+    OCSP_request_add0_id
+    OCSP_request_add1_cert
+    OCSP_REQUEST_add1_ext_i2d
+    OCSP_request_add1_nonce
+    OCSP_REQUEST_delete_ext
     OCSP_REQUEST_free
+    OCSP_REQUEST_get_ext
+    OCSP_REQUEST_get_ext_by_critical
+    OCSP_REQUEST_get_ext_by_NID
+    OCSP_REQUEST_get_ext_by_OBJ
+    OCSP_REQUEST_get_ext_count
+    OCSP_REQUEST_get1_ext_d2i
+    OCSP_request_is_signed
     OCSP_REQUEST_new
+    OCSP_request_onereq_count
+    OCSP_request_onereq_get0
+    OCSP_REQUEST_print
+    OCSP_request_set1_name
+    OCSP_request_sign
+    OCSP_request_verify
+    OCSP_resp_count
+    OCSP_resp_find
+    OCSP_resp_find_status
+    OCSP_resp_get0
     OCSP_RESPBYTES_free
     OCSP_RESPBYTES_new
     OCSP_RESPDATA_free
     OCSP_RESPDATA_new
     OCSP_RESPID_free
     OCSP_RESPID_new
+    OCSP_response_create
     OCSP_RESPONSE_free
+    OCSP_response_get1_basic
     OCSP_RESPONSE_new
+    OCSP_RESPONSE_print
+    OCSP_response_status
+    OCSP_response_status_str
     OCSP_REVOKEDINFO_free
     OCSP_REVOKEDINFO_new
+    OCSP_sendreq_bio
+    OCSP_sendreq_nbio
+    OCSP_sendreq_new
     OCSP_SERVICELOC_free
     OCSP_SERVICELOC_new
     OCSP_SIGNATURE_free
     OCSP_SIGNATURE_new
+    OCSP_single_get0_status
+    OCSP_SINGLERESP_add_ext
+    OCSP_SINGLERESP_add1_ext_i2d
+    OCSP_SINGLERESP_delete_ext
     OCSP_SINGLERESP_free
+    OCSP_SINGLERESP_get_ext
+    OCSP_SINGLERESP_get_ext_by_critical
+    OCSP_SINGLERESP_get_ext_by_NID
+    OCSP_SINGLERESP_get_ext_by_OBJ
+    OCSP_SINGLERESP_get_ext_count
+    OCSP_SINGLERESP_get1_ext_d2i
     OCSP_SINGLERESP_new
+    OCSP_url_svcloc_new
+    OPENSSL_add_all_algorithms_conf
+    OPENSSL_add_all_algorithms_noconf
     OpenSSL_add_all_ciphers
+    OpenSSL_add_all_digests
+    OPENSSL_asc2uni
     OPENSSL_cleanse
+    OPENSSL_config
+    OPENSSL_cpuid_setup
     OPENSSL_DIR_end
     OPENSSL_DIR_read
     OPENSSL_gmtime
+    OPENSSL_gmtime_adj
+    OPENSSL_ia32cap_loc
+    OPENSSL_init
     OPENSSL_isservice
     OPENSSL_issetugid
+    OPENSSL_load_builtin_modules
+    OPENSSL_memcmp
+    OPENSSL_no_config
+    OPENSSL_showfatal
+    OPENSSL_stderr
+    OPENSSL_strcasecmp
+    OPENSSL_strncasecmp
+    OPENSSL_uni2asc
     OpenSSLDie
+    OTHERNAME_cmp
     OTHERNAME_free
     OTHERNAME_new
     PBE2PARAM_free
@@ -1412,21 +1805,26 @@
     PBEPARAM_new
     PBKDF2PARAM_free
     PBKDF2PARAM_new
+    PEM_ASN1_read
     PEM_ASN1_read_bio
+    PEM_ASN1_write
     PEM_ASN1_write_bio
     PEM_bytes_read_bio
+    pem_check_suffix
     PEM_def_callback
     PEM_dek_info
     PEM_do_header
     PEM_get_EVP_CIPHER_INFO
     PEM_proc_type
+    PEM_read
     PEM_read_bio
+    PEM_read_bio_CMS
     PEM_read_bio_DHparams
-    PEM_read_bio_EC_PUBKEY
-    PEM_read_bio_ECPKParameters
-    PEM_read_bio_ECPrivateKey
     PEM_read_bio_NETSCAPE_CERT_SEQUENCE
+    PEM_read_bio_Parameters
     PEM_read_bio_PKCS7
+    PEM_read_bio_PKCS8
+    PEM_read_bio_PKCS8_PRIV_KEY_INFO
     PEM_read_bio_PrivateKey
     PEM_read_bio_PUBKEY
     PEM_read_bio_RSA_PUBKEY
@@ -1437,13 +1835,42 @@
     PEM_read_bio_X509_CERT_PAIR
     PEM_read_bio_X509_CRL
     PEM_read_bio_X509_REQ
+    PEM_read_CMS
+    PEM_read_DHparams
+    PEM_read_NETSCAPE_CERT_SEQUENCE
+    PEM_read_PKCS7
+    PEM_read_PKCS8
+    PEM_read_PKCS8_PRIV_KEY_INFO
+    PEM_read_PrivateKey
+    PEM_read_PUBKEY
+    PEM_read_RSA_PUBKEY
+    PEM_read_RSAPrivateKey
+    PEM_read_RSAPublicKey
+    PEM_read_X509
+    PEM_read_X509_AUX
+    PEM_read_X509_CERT_PAIR
+    PEM_read_X509_CRL
+    PEM_read_X509_REQ
+    PEM_SealFinal
+    PEM_SealInit
+    PEM_SealUpdate
+    PEM_SignFinal
+    PEM_SignInit
+    PEM_SignUpdate
+    PEM_write
     PEM_write_bio
+    PEM_write_bio_ASN1_stream
+    PEM_write_bio_CMS
+    PEM_write_bio_CMS_stream
     PEM_write_bio_DHparams
-    PEM_write_bio_EC_PUBKEY
-    PEM_write_bio_ECPKParameters
-    PEM_write_bio_ECPrivateKey
     PEM_write_bio_NETSCAPE_CERT_SEQUENCE
+    PEM_write_bio_Parameters
     PEM_write_bio_PKCS7
+    PEM_write_bio_PKCS7_stream
+    PEM_write_bio_PKCS8
+    PEM_write_bio_PKCS8_PRIV_KEY_INFO
+    PEM_write_bio_PKCS8PrivateKey
+    PEM_write_bio_PKCS8PrivateKey_nid
     PEM_write_bio_PrivateKey
     PEM_write_bio_PUBKEY
     PEM_write_bio_RSA_PUBKEY
@@ -1455,17 +1882,50 @@
     PEM_write_bio_X509_CRL
     PEM_write_bio_X509_REQ
     PEM_write_bio_X509_REQ_NEW
+    PEM_write_CMS
+    PEM_write_DHparams
+    PEM_write_NETSCAPE_CERT_SEQUENCE
+    PEM_write_PKCS7
+    PEM_write_PKCS8
+    PEM_write_PKCS8_PRIV_KEY_INFO
+    PEM_write_PKCS8PrivateKey
+    PEM_write_PKCS8PrivateKey_nid
+    PEM_write_PrivateKey
+    PEM_write_PUBKEY
+    PEM_write_RSA_PUBKEY
+    PEM_write_RSAPrivateKey
+    PEM_write_RSAPublicKey
+    PEM_write_X509
+    PEM_write_X509_AUX
+    PEM_write_X509_CERT_PAIR
+    PEM_write_X509_CRL
+    PEM_write_X509_REQ
+    PEM_write_X509_REQ_NEW
+    PEM_X509_INFO_read
     PEM_X509_INFO_read_bio
     PEM_X509_INFO_write_bio
     pitem_free
     pitem_new
     PKCS1_MGF1
+    PKCS12_add_cert
+    PKCS12_add_CSPName_asc
+    PKCS12_add_friendlyname_asc
+    PKCS12_add_friendlyname_uni
+    PKCS12_add_key
+    PKCS12_add_localkeyid
+    PKCS12_add_safe
+    PKCS12_add_safes
     PKCS12_BAGS_free
     PKCS12_BAGS_new
     PKCS12_certbag2x509
     PKCS12_certbag2x509crl
+    PKCS12_create
     PKCS12_decrypt_skey
     PKCS12_free
+    PKCS12_gen_mac
+    PKCS12_get_attr_gen
+    PKCS12_get_friendlyname
+    PKCS12_init
     PKCS12_item_decrypt_d2i
     PKCS12_item_i2d_encrypt
     PKCS12_item_pack_safebag
@@ -1476,66 +1936,110 @@
     PKCS12_MAKE_KEYBAG
     PKCS12_MAKE_SHKEYBAG
     PKCS12_new
+    PKCS12_newpass
     PKCS12_pack_authsafes
     PKCS12_pack_p7data
     PKCS12_pack_p7encdata
+    PKCS12_parse
     PKCS12_PBE_add
     PKCS12_pbe_crypt
     PKCS12_PBE_keyivgen
     PKCS12_SAFEBAG_free
     PKCS12_SAFEBAG_new
+    PKCS12_set_mac
+    PKCS12_setup_mac
     PKCS12_unpack_authsafes
     PKCS12_unpack_p7data
     PKCS12_unpack_p7encdata
+    PKCS12_verify_mac
     PKCS12_x5092certbag
     PKCS12_x509crl2certbag
     PKCS5_PBE_add
     PKCS5_PBE_keyivgen
     PKCS5_pbe_set
+    PKCS5_pbe_set0_algor
     PKCS5_pbe2_set
+    PKCS5_pbe2_set_iv
+    PKCS5_PBKDF2_HMAC
     PKCS5_PBKDF2_HMAC_SHA1
+    PKCS5_pbkdf2_set
     PKCS5_v2_PBE_keyivgen
+    PKCS5_v2_PBKDF2_keyivgen
+    PKCS7_add_attrib_content_type
+    PKCS7_add_attrib_smimecap
+    PKCS7_add_attribute
     PKCS7_add_certificate
     PKCS7_add_crl
     PKCS7_add_recipient
     PKCS7_add_recipient_info
     PKCS7_add_signature
+    PKCS7_add_signed_attribute
     PKCS7_add_signer
+    PKCS7_add0_attrib_signing_time
+    PKCS7_add1_attrib_digest
     PKCS7_cert_from_signer_info
     PKCS7_content_new
     PKCS7_ctrl
+    PKCS7_dataDecode
+    PKCS7_dataFinal
+    PKCS7_dataInit
+    PKCS7_dataVerify
+    PKCS7_decrypt
     PKCS7_DIGEST_free
+    PKCS7_digest_from_attributes
     PKCS7_DIGEST_new
     PKCS7_dup
     PKCS7_ENC_CONTENT_free
     PKCS7_ENC_CONTENT_new
+    PKCS7_encrypt
     PKCS7_ENCRYPT_free
     PKCS7_ENCRYPT_new
     PKCS7_ENVELOPE_free
     PKCS7_ENVELOPE_new
+    PKCS7_final
     PKCS7_free
+    PKCS7_get_attribute
+    PKCS7_get_issuer_and_serial
+    PKCS7_get_signed_attribute
     PKCS7_get_signer_info
+    PKCS7_get_smimecap
+    PKCS7_get0_signers
     PKCS7_ISSUER_AND_SERIAL_digest
     PKCS7_ISSUER_AND_SERIAL_free
     PKCS7_ISSUER_AND_SERIAL_new
     PKCS7_new
+    PKCS7_print_ctx
     PKCS7_RECIP_INFO_free
+    PKCS7_RECIP_INFO_get0_alg
     PKCS7_RECIP_INFO_new
     PKCS7_RECIP_INFO_set
+    PKCS7_set_attributes
     PKCS7_set_cipher
     PKCS7_set_content
     PKCS7_set_digest
+    PKCS7_set_signed_attributes
     PKCS7_set_type
     PKCS7_set0_type_other
+    PKCS7_sign
+    PKCS7_sign_add_signer
     PKCS7_SIGN_ENVELOPE_free
     PKCS7_SIGN_ENVELOPE_new
+    PKCS7_signatureVerify
     PKCS7_SIGNED_free
     PKCS7_SIGNED_new
     PKCS7_SIGNER_INFO_free
+    PKCS7_SIGNER_INFO_get0_algs
     PKCS7_SIGNER_INFO_new
     PKCS7_SIGNER_INFO_set
+    PKCS7_SIGNER_INFO_sign
+    PKCS7_simple_smimecap
+    PKCS7_stream
+    PKCS7_verify
+    PKCS8_add_keyusage
     PKCS8_decrypt
     PKCS8_encrypt
+    PKCS8_pkey_get0
+    PKCS8_pkey_set0
     PKCS8_PRIV_KEY_INFO_free
     PKCS8_PRIV_KEY_INFO_new
     PKCS8_set_broken
@@ -1553,6 +2057,7 @@
     POLICY_MAPPING_new
     policy_node_cmp_new
     policy_node_free
+    policy_node_match
     POLICYINFO_free
     POLICYINFO_new
     POLICYQUALINFO_free
@@ -1565,7 +2070,11 @@
     pqueue_next
     pqueue_peek
     pqueue_pop
+    pqueue_print
     pqueue_size
+    private_AES_set_decrypt_key
+    private_AES_set_encrypt_key
+    private_RC4_set_key
     PROXY_CERT_INFO_EXTENSION_free
     PROXY_CERT_INFO_EXTENSION_new
     PROXY_POLICY_free
@@ -1593,6 +2102,7 @@
     RC4_set_key
     RSA_blinding_off
     RSA_blinding_on
+    RSA_check_key
     RSA_flags
     RSA_free
     RSA_generate_key
@@ -1607,6 +2117,8 @@
     RSA_null_method
     RSA_padding_add_none
     RSA_padding_add_PKCS1_OAEP
+    RSA_padding_add_PKCS1_PSS
+    RSA_padding_add_PKCS1_PSS_mgf1
     RSA_padding_add_PKCS1_type_1
     RSA_padding_add_PKCS1_type_2
     RSA_padding_add_SSLv23
@@ -1622,6 +2134,8 @@
     RSA_print_fp
     RSA_private_decrypt
     RSA_private_encrypt
+    RSA_PSS_PARAMS_free
+    RSA_PSS_PARAMS_new
     RSA_public_decrypt
     RSA_public_encrypt
     RSA_set_default_method
@@ -1629,15 +2143,26 @@
     RSA_set_method
     RSA_setup_blinding
     RSA_sign
+    RSA_sign_ASN1_OCTET_STRING
     RSA_size
     RSA_up_ref
     RSA_verify
+    RSA_verify_ASN1_OCTET_STRING
+    RSA_verify_PKCS1_PSS
+    RSA_verify_PKCS1_PSS_mgf1
     RSA_X931_hash_id
-    RSAPrivateKey_asn1_meth
     RSAPrivateKey_dup
     RSAPublicKey_dup
     s2i_ASN1_INTEGER
     s2i_ASN1_OCTET_STRING
+    SEED_cbc_encrypt
+    SEED_cfb128_encrypt
+    SEED_decrypt
+    SEED_ecb_encrypt
+    SEED_encrypt
+    SEED_ofb128_encrypt
+    SEED_set_key
+    SHA1
     SHA1_Final
     SHA1_Init
     SHA1_Transform
@@ -1681,6 +2206,30 @@
     sk_unshift
     sk_value
     sk_zero
+    SMIME_crlf_copy
+    SMIME_read_ASN1
+    SMIME_read_CMS
+    SMIME_read_PKCS7
+    SMIME_text
+    SMIME_write_ASN1
+    SMIME_write_CMS
+    SMIME_write_PKCS7
+    SRP_Calc_A
+    SRP_Calc_B
+    SRP_Calc_client_key
+    SRP_Calc_server_key
+    SRP_Calc_u
+    SRP_Calc_x
+    SRP_check_known_gN_param
+    SRP_create_verifier
+    SRP_create_verifier_BN
+    SRP_get_default_gN
+    SRP_VBASE_free
+    SRP_VBASE_get_by_user
+    SRP_VBASE_init
+    SRP_VBASE_new
+    SRP_Verify_A_mod_N
+    SRP_Verify_B_mod_N
     SSLeay
     SSLeay_version
     string_to_hex
@@ -1695,6 +2244,12 @@
     SXNETID_free
     SXNETID_new
     tree_find_sk
+    TXT_DB_create_index
+    TXT_DB_free
+    TXT_DB_get_by_index
+    TXT_DB_insert
+    TXT_DB_read
+    TXT_DB_write
     UI_add_error_string
     UI_add_info_string
     UI_add_input_boolean
@@ -1728,11 +2283,13 @@
     UI_method_get_closer
     UI_method_get_flusher
     UI_method_get_opener
+    UI_method_get_prompt_constructor
     UI_method_get_reader
     UI_method_get_writer
     UI_method_set_closer
     UI_method_set_flusher
     UI_method_set_opener
+    UI_method_set_prompt_constructor
     UI_method_set_reader
     UI_method_set_writer
     UI_new
@@ -1743,7 +2300,8 @@
     UI_set_ex_data
     UI_set_method
     UI_set_result
-    uni2asc
+    UI_UTIL_read_pw
+    UI_UTIL_read_pw_string
     USERNOTICE_free
     USERNOTICE_new
     UTF8_getc
@@ -1760,10 +2318,10 @@
     X509_ALGOR_free
     X509_ALGOR_get0
     X509_ALGOR_new
+    X509_ALGOR_set_md
     X509_ALGOR_set0
     X509_alias_get0
     X509_alias_set1
-    X509_asn1_meth
     X509_ATTRIBUTE_count
     X509_ATTRIBUTE_create
     X509_ATTRIBUTE_create_by_NID
@@ -1783,6 +2341,7 @@
     X509_CERT_PAIR_free
     X509_CERT_PAIR_new
     X509_certificate_type
+    X509_check_akid
     X509_check_ca
     X509_check_issued
     X509_check_private_key
@@ -1807,10 +2366,26 @@
     X509_CRL_get_ext_by_OBJ
     X509_CRL_get_ext_count
     X509_CRL_get_ext_d2i
+    X509_CRL_get_meth_data
+    X509_CRL_get0_by_cert
+    X509_CRL_get0_by_serial
     X509_CRL_INFO_free
     X509_CRL_INFO_new
+    X509_CRL_match
+    X509_CRL_METHOD_free
+    X509_CRL_METHOD_new
     X509_CRL_new
+    X509_CRL_print
+    X509_CRL_print_fp
+    X509_CRL_set_default_method
+    X509_CRL_set_issuer_name
+    X509_CRL_set_lastUpdate
+    X509_CRL_set_meth_data
+    X509_CRL_set_nextUpdate
+    X509_CRL_set_version
     X509_CRL_sign
+    X509_CRL_sign_ctx
+    X509_CRL_sort
     X509_CRL_verify
     X509_delete_ext
     X509_digest
@@ -1859,6 +2434,7 @@
     X509_issuer_and_serial_hash
     X509_issuer_name_cmp
     X509_issuer_name_hash
+    X509_issuer_name_hash_old
     X509_keyid_get0
     X509_keyid_set1
     X509_load_cert_crl_file
@@ -1901,6 +2477,7 @@
     X509_NAME_get_text_by_NID
     X509_NAME_get_text_by_OBJ
     X509_NAME_hash
+    X509_NAME_hash_old
     X509_NAME_new
     X509_NAME_oneline
     X509_NAME_print
@@ -1935,8 +2512,10 @@
     X509_pubkey_digest
     X509_PUBKEY_free
     X509_PUBKEY_get
+    X509_PUBKEY_get0_param
     X509_PUBKEY_new
     X509_PUBKEY_set
+    X509_PUBKEY_set0_param
     X509_PURPOSE_add
     X509_PURPOSE_cleanup
     X509_PURPOSE_get_by_id
@@ -1972,11 +2551,16 @@
     X509_REQ_INFO_free
     X509_REQ_INFO_new
     X509_REQ_new
+    X509_REQ_print
+    X509_REQ_print_ex
+    X509_REQ_print_fp
     X509_REQ_set_extension_nids
     X509_REQ_set_pubkey
     X509_REQ_set_subject_name
     X509_REQ_set_version
     X509_REQ_sign
+    X509_REQ_sign_ctx
+    X509_REQ_to_X509
     X509_REQ_verify
     X509_REVOKED_add_ext
     X509_REVOKED_add1_ext_i2d
@@ -1989,10 +2573,21 @@
     X509_REVOKED_get_ext_count
     X509_REVOKED_get_ext_d2i
     X509_REVOKED_new
+    X509_REVOKED_set_revocationDate
+    X509_REVOKED_set_serialNumber
     X509_set_ex_data
+    X509_set_issuer_name
+    X509_set_notAfter
+    X509_set_notBefore
+    X509_set_pubkey
+    X509_set_serialNumber
+    X509_set_subject_name
+    X509_set_version
     X509_SIG_free
     X509_SIG_new
     X509_sign
+    X509_sign_ctx
+    X509_signature_dump
     X509_signature_print
     X509_STORE_add_cert
     X509_STORE_add_crl
@@ -2006,7 +2601,10 @@
     X509_STORE_CTX_get_ex_data
     X509_STORE_CTX_get_ex_new_index
     X509_STORE_CTX_get_explicit_policy
+    X509_STORE_CTX_get0_current_crl
+    X509_STORE_CTX_get0_current_issuer
     X509_STORE_CTX_get0_param
+    X509_STORE_CTX_get0_parent_ctx
     X509_STORE_CTX_get0_policy_tree
     X509_STORE_CTX_get1_chain
     X509_STORE_CTX_get1_issuer
@@ -2029,6 +2627,8 @@
     X509_STORE_CTX_trusted_stack
     X509_STORE_free
     X509_STORE_get_by_subject
+    X509_STORE_get1_certs
+    X509_STORE_get1_crls
     X509_STORE_load_locations
     X509_STORE_new
     X509_STORE_set_default_paths
@@ -2036,11 +2636,14 @@
     X509_STORE_set_flags
     X509_STORE_set_purpose
     X509_STORE_set_trust
+    X509_STORE_set_verify_cb
     X509_STORE_set1_param
     X509_subject_name_cmp
     X509_subject_name_hash
+    X509_subject_name_hash_old
     X509_supported_extension
     X509_time_adj
+    X509_time_adj_ex
     X509_to_X509_REQ
     X509_TRUST_add
     X509_TRUST_cleanup
@@ -2136,10 +2739,6 @@
     X509V3_set_ctx
     X509V3_set_nconf
     X509V3_string_free
-    X9_62_CHARACTERISTIC_TWO_free
-    X9_62_CHARACTERISTIC_TWO_new
-    X9_62_PENTANOMIAL_free
-    X9_62_PENTANOMIAL_new
 
     ;
     ; OpenSSL ssl symbols
@@ -2150,11 +2749,11 @@
     BIO_new_ssl_connect
     BIO_ssl_copy_session_id
     BIO_ssl_shutdown
-    check_srvr_ecc_cert_and_alg
     d2i_SSL_SESSION
     do_dtls1_write
     dtls1_accept
     dtls1_buffer_message
+    dtls1_check_timeout_num
     dtls1_clear
     dtls1_clear_record_buffer
     dtls1_client_hello
@@ -2174,11 +2773,13 @@
     dtls1_get_record
     dtls1_get_timeout
     dtls1_handle_timeout
+    dtls1_heartbeat
     dtls1_is_timer_expired
     dtls1_listen
     dtls1_min_mtu
     dtls1_new
     dtls1_output_cert_chain
+    dtls1_process_heartbeat
     dtls1_read_bytes
     dtls1_read_failed
     dtls1_reset_seq_numbers
@@ -2197,30 +2798,42 @@
     dtls1_send_server_hello
     dtls1_send_server_key_exchange
     dtls1_set_message_header
+    dtls1_shutdown
     dtls1_start_timer
     dtls1_stop_timer
     dtls1_write_app_data_bytes
     dtls1_write_bytes
-    dtlsv1_base_method
     DTLSv1_client_method
     DTLSv1_method
     DTLSv1_server_method
     ERR_load_SSL_strings
     i2d_SSL_SESSION
+    n_ssl3_mac
+    OBJ_bsearch_ssl_cipher_id
+    PEM_read_bio_SSL_SESSION
+    PEM_read_SSL_SESSION
+    PEM_write_bio_SSL_SESSION
+    PEM_write_SSL_SESSION
+    SRP_Calc_A_param
+    SRP_generate_client_master_secret
+    SRP_generate_server_master_secret
     SSL_accept
     SSL_add_client_CA
     ssl_add_clienthello_renegotiate_ext
     ssl_add_clienthello_tlsext
+    ssl_add_clienthello_use_srtp_ext
     SSL_add_dir_cert_subjects_to_stack
     SSL_add_file_cert_subjects_to_stack
     ssl_add_serverhello_renegotiate_ext
     ssl_add_serverhello_tlsext
+    ssl_add_serverhello_use_srtp_ext
     SSL_alert_desc_string
     SSL_alert_desc_string_long
     SSL_alert_type_string
     SSL_alert_type_string_long
     ssl_bad_method
     ssl_bytes_to_cipher_list
+    SSL_cache_hit
     SSL_callback_ctrl
     ssl_cert_dup
     ssl_cert_free
@@ -2234,6 +2847,7 @@
     SSL_CIPHER_description
     SSL_CIPHER_get_bits
     ssl_cipher_get_evp
+    SSL_CIPHER_get_id
     SSL_CIPHER_get_name
     SSL_CIPHER_get_version
     ssl_cipher_id_cmp
@@ -2242,6 +2856,7 @@
     SSL_clear
     ssl_clear_bad_session
     ssl_clear_cipher_ctx
+    ssl_clear_hash_ctx
     SSL_COMP_add_compression_method
     SSL_COMP_get_compression_methods
     SSL_COMP_get_name
@@ -2291,16 +2906,31 @@
     SSL_CTX_set_generate_session_id
     SSL_CTX_set_info_callback
     SSL_CTX_set_msg_callback
+    SSL_CTX_set_next_proto_select_cb
+    SSL_CTX_set_next_protos_advertised_cb
+    SSL_CTX_set_psk_client_callback
+    SSL_CTX_set_psk_server_callback
     SSL_CTX_set_purpose
     SSL_CTX_set_quiet_shutdown
     SSL_CTX_set_session_id_context
+    SSL_CTX_set_srp_cb_arg
+    SSL_CTX_set_srp_client_pwd_callback
+    SSL_CTX_set_srp_password
+    SSL_CTX_set_srp_strength
+    SSL_CTX_set_srp_username
+    SSL_CTX_set_srp_username_callback
+    SSL_CTX_set_srp_verify_param_callback
     SSL_CTX_set_ssl_version
     SSL_CTX_set_timeout
+    SSL_CTX_set_tlsext_use_srtp
     SSL_CTX_set_tmp_dh_callback
     SSL_CTX_set_tmp_rsa_callback
     SSL_CTX_set_trust
     SSL_CTX_set_verify
     SSL_CTX_set_verify_depth
+    SSL_CTX_set1_param
+    SSL_CTX_SRP_CTX_free
+    SSL_CTX_SRP_CTX_init
     SSL_CTX_use_certificate
     SSL_CTX_use_certificate_ASN1
     SSL_CTX_use_certificate_chain_file
@@ -2308,6 +2938,7 @@
     SSL_CTX_use_PrivateKey
     SSL_CTX_use_PrivateKey_ASN1
     SSL_CTX_use_PrivateKey_file
+    SSL_CTX_use_psk_identity_hint
     SSL_CTX_use_RSAPrivateKey
     SSL_CTX_use_RSAPrivateKey_ASN1
     SSL_CTX_use_RSAPrivateKey_file
@@ -2315,8 +2946,11 @@
     SSL_do_handshake
     SSL_dup
     SSL_dup_CA_list
+    SSL_export_keying_material
+    ssl_fill_hello_random
     SSL_free
     ssl_free_wbio_buffer
+    ssl_get_algorithm2
     SSL_get_certificate
     SSL_get_cipher_list
     SSL_get_ciphers
@@ -2332,6 +2966,7 @@
     SSL_get_ex_new_index
     SSL_get_fd
     SSL_get_finished
+    ssl_get_handshake_digest
     SSL_get_info_callback
     ssl_get_new_session
     SSL_get_peer_cert_chain
@@ -2339,17 +2974,26 @@
     SSL_get_peer_finished
     ssl_get_prev_session
     SSL_get_privatekey
+    SSL_get_psk_identity
+    SSL_get_psk_identity_hint
     SSL_get_quiet_shutdown
     SSL_get_rbio
     SSL_get_read_ahead
     SSL_get_rfd
+    SSL_get_selected_srtp_profile
     ssl_get_server_send_cert
+    ssl_get_server_send_pkey
     SSL_get_servername
     SSL_get_servername_type
     SSL_get_session
     SSL_get_shared_ciphers
     SSL_get_shutdown
     ssl_get_sign_pkey
+    SSL_get_srp_g
+    SSL_get_srp_N
+    SSL_get_srp_userinfo
+    SSL_get_srp_username
+    SSL_get_srtp_profiles
     SSL_get_SSL_CTX
     SSL_get_ssl_method
     SSL_get_verify_callback
@@ -2359,6 +3003,7 @@
     SSL_get_version
     SSL_get_wbio
     SSL_get_wfd
+    SSL_get0_next_proto_negotiated
     SSL_get1_session
     SSL_has_matching_session_id
     ssl_init_wbio_buffer
@@ -2370,52 +3015,70 @@
     ssl_ok
     ssl_parse_clienthello_renegotiate_ext
     ssl_parse_clienthello_tlsext
+    ssl_parse_clienthello_use_srtp_ext
     ssl_parse_serverhello_renegotiate_ext
     ssl_parse_serverhello_tlsext
+    ssl_parse_serverhello_use_srtp_ext
     SSL_peek
     SSL_pending
+    ssl_prepare_clienthello_tlsext
+    ssl_prepare_serverhello_tlsext
     SSL_read
     SSL_renegotiate
+    SSL_renegotiate_abbreviated
     SSL_renegotiate_pending
+    ssl_replace_hash
     SSL_rstate_string
     SSL_rstate_string_long
+    SSL_select_next_proto
     ssl_sess_cert_free
     ssl_sess_cert_new
-    SSL_SESSION_cmp
     SSL_SESSION_free
+    SSL_SESSION_get_compress_id
     SSL_SESSION_get_ex_data
     SSL_SESSION_get_ex_new_index
     SSL_SESSION_get_id
     SSL_SESSION_get_time
     SSL_SESSION_get_timeout
-    SSL_SESSION_hash
+    SSL_SESSION_get0_peer
     SSL_SESSION_new
     SSL_SESSION_print
     SSL_SESSION_print_fp
     SSL_SESSION_set_ex_data
     SSL_SESSION_set_time
     SSL_SESSION_set_timeout
+    SSL_SESSION_set1_id_context
     SSL_set_accept_state
     SSL_set_bio
     ssl_set_cert_masks
     SSL_set_cipher_list
     SSL_set_client_CA_list
     SSL_set_connect_state
+    SSL_set_debug
     SSL_set_ex_data
     SSL_set_fd
     SSL_set_generate_session_id
     SSL_set_info_callback
     SSL_set_msg_callback
     ssl_set_peer_cert_type
+    SSL_set_psk_client_callback
+    SSL_set_psk_server_callback
     SSL_set_purpose
     SSL_set_quiet_shutdown
     SSL_set_read_ahead
     SSL_set_rfd
     SSL_set_session
     SSL_set_session_id_context
+    SSL_set_session_secret_cb
+    SSL_set_session_ticket_ext
+    SSL_set_session_ticket_ext_cb
     SSL_set_shutdown
+    SSL_set_srp_server_param
+    SSL_set_srp_server_param_pw
     SSL_set_SSL_CTX
     SSL_set_ssl_method
+    SSL_set_state
+    SSL_set_tlsext_use_srtp
     SSL_set_tmp_dh_callback
     SSL_set_tmp_rsa_callback
     SSL_set_trust
@@ -2423,7 +3086,11 @@
     SSL_set_verify_depth
     SSL_set_verify_result
     SSL_set_wfd
+    SSL_set1_param
     SSL_shutdown
+    SSL_SRP_CTX_free
+    SSL_SRP_CTX_init
+    SSL_srp_server_param_with_username
     SSL_state
     SSL_state_string
     SSL_state_string_long
@@ -2437,6 +3104,7 @@
     SSL_use_PrivateKey
     SSL_use_PrivateKey_ASN1
     SSL_use_PrivateKey_file
+    SSL_use_psk_identity_hint
     SSL_use_RSAPrivateKey
     SSL_use_RSAPrivateKey_ASN1
     SSL_use_RSAPrivateKey_file
@@ -2489,6 +3157,10 @@
     ssl3_accept
     ssl3_alert_code
     ssl3_callback_ctrl
+    ssl3_cbc_copy_mac
+    ssl3_cbc_digest_record
+    ssl3_cbc_record_digest_supported
+    ssl3_cbc_remove_padding
     ssl3_cert_verify_mac
     ssl3_change_cipher_state
     ssl3_check_cert_and_algorithm
@@ -2504,6 +3176,7 @@
     ssl3_ctx_callback_ctrl
     ssl3_ctx_ctrl
     ssl3_default_timeout
+    ssl3_digest_cached_records
     ssl3_dispatch_alert
     ssl3_do_change_cipher_spec
     ssl3_do_compress
@@ -2513,6 +3186,7 @@
     ssl3_final_finish_mac
     ssl3_finish_mac
     ssl3_free
+    ssl3_free_digest_list
     ssl3_generate_master_secret
     ssl3_get_cert_status
     ssl3_get_cert_verify
@@ -2526,12 +3200,12 @@
     ssl3_get_key_exchange
     ssl3_get_message
     ssl3_get_new_session_ticket
+    ssl3_get_next_proto
     ssl3_get_req_cert_type
     ssl3_get_server_certificate
     ssl3_get_server_done
     ssl3_get_server_hello
     ssl3_init_finished_mac
-    ssl3_mac
     ssl3_new
     ssl3_num_ciphers
     ssl3_output_cert_chain
@@ -2542,6 +3216,8 @@
     ssl3_read_bytes
     ssl3_read_n
     ssl3_record_sequence_update
+    ssl3_release_read_buffer
+    ssl3_release_write_buffer
     ssl3_renegotiate
     ssl3_renegotiate_check
     ssl3_send_alert
@@ -2554,42 +3230,56 @@
     ssl3_send_finished
     ssl3_send_hello_request
     ssl3_send_newsession_ticket
+    ssl3_send_next_proto
     ssl3_send_server_certificate
     ssl3_send_server_done
     ssl3_send_server_hello
     ssl3_send_server_key_exchange
     ssl3_setup_buffers
     ssl3_setup_key_block
+    ssl3_setup_read_buffer
+    ssl3_setup_write_buffer
     ssl3_shutdown
     ssl3_write
     ssl3_write_bytes
     ssl3_write_pending
-    sslv2_base_method
     SSLv2_client_method
     SSLv2_method
     SSLv2_server_method
-    sslv23_base_method
     SSLv23_client_method
     SSLv23_method
     SSLv23_server_method
-    sslv3_base_method
     SSLv3_client_method
     SSLv3_method
     SSLv3_server_method
     tls1_alert_code
+    tls1_cbc_remove_padding
     tls1_cert_verify_mac
     tls1_change_cipher_state
     tls1_clear
     tls1_default_timeout
     tls1_enc
+    tls1_export_keying_material
     tls1_final_finish_mac
     tls1_free
     tls1_generate_master_secret
+    tls1_heartbeat
     tls1_mac
     tls1_new
+    tls1_process_heartbeat
+    tls1_process_sigalgs
     tls1_process_ticket
     tls1_setup_key_block
-    tlsv1_base_method
+    tls12_get_hash
+    tls12_get_req_sig_algs
+    tls12_get_sigandhash
+    tls12_get_sigid
+    TLSv1_1_client_method
+    TLSv1_1_method
+    TLSv1_1_server_method
+    TLSv1_2_client_method
+    TLSv1_2_method
+    TLSv1_2_server_method
     TLSv1_client_method
     TLSv1_method
     TLSv1_server_method
diff --git a/src/VBox/Runtime/r3/win/ntdll-mini-implib.c b/src/VBox/Runtime/r3/win/ntdll-mini-implib.c
deleted file mode 100644
index a3eeef7..0000000
--- a/src/VBox/Runtime/r3/win/ntdll-mini-implib.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* $Id: ntdll-mini-implib.c $ */
-/** @file
- * IPRT - Minimal NTDLL import library defintion file.
- */
-
-/*
- * Copyright (C) 2010-2013 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- *
- * The contents of this file may alternatively be used under the terms
- * of the Common Development and Distribution License Version 1.0
- * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
- * VirtualBox OSE distribution, in which case the provisions of the
- * CDDL are applicable instead of those of the GPL.
- *
- * You may elect to license modified versions of this file under the
- * terms and conditions of either the GPL or the CDDL or both.
- */
-
-
-#include <Windows.h>
-
-#undef  NTSYSAPI
-#define NTSYSAPI __declspec(dllexport)
-
-typedef LONG    NTSTATUS;
-typedef PVOID   PIO_STATUS_BLOCK;
-typedef INT     FILE_INFORMATION_CLASS;
-typedef INT     FS_INFORMATION_CLASS;
-typedef INT     MEMORY_INFORMATION_CLASS;
-typedef INT     PROCESSINFOCLASS;
-typedef PVOID   POBJECT_ATTRIBUTES;
-typedef PVOID   PIO_APC_ROUTINE;
-typedef PVOID   PUNICODE_STRING;
-
-
-/* Error/status conversion: */
-
-NTSYSAPI ULONG NTAPI RtlNtStatusToDosError(IN NTSTATUS Status)
-{
-    return 1;
-}
-
-
-/* Queries: */
-
-NTSYSAPI LONG NTAPI NtQueryTimerResolution(OUT PULONG MaximumResolution,
-                                           OUT PULONG MinimumResolution,
-                                           OUT PULONG CurrentResolution)
-{
-    return -1;
-}
-
-NTSYSAPI LONG NTAPI NtQueryDirectoryFile(IN HANDLE FileHandle,
-                                         IN HANDLE Event OPTIONAL,
-                                         IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
-                                         IN PVOID ApcContext OPTIONAL,
-                                         OUT PIO_STATUS_BLOCK IoStatusBlock,
-                                         OUT PVOID FileInformation,
-                                         IN ULONG Length,
-                                         IN FILE_INFORMATION_CLASS FileInformationClass,
-                                         IN BOOLEAN ReturnSingleEntry,
-                                         IN PUNICODE_STRING FileName OPTIONAL,
-                                         IN BOOLEAN RestartScan)
-{
-    return -1;
-}
-
-NTSYSAPI LONG NTAPI NtQueryDirectoryObject(IN HANDLE ObjectHandle,
-                                           OUT PVOID Buffer,
-                                           IN ULONG Length,
-                                           IN BOOLEAN ReturnSingleEntry,
-                                           IN BOOLEAN RestartScan,
-                                           IN OUT PULONG Context,
-                                           OUT PULONG ReturneLength)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS WINAPI NtQueryInformationFile(IN HANDLE h,
-                                                OUT PIO_STATUS_BLOCK b,
-                                                OUT PVOID pvBuf,
-                                                IN LONG cbBuf,
-                                                IN FILE_INFORMATION_CLASS e)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(IN HANDLE hProcess,
-                                                  IN PROCESSINFOCLASS enmProcInfo,
-                                                  OUT PVOID pvBuf,
-                                                  IN SIZE_T cbBuf,
-                                                  OUT PSIZE_T pcbReturned OPTIONAL)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryVolumeInformationFile(IN HANDLE hFile,
-                                                     OUT PIO_STATUS_BLOCK IoStatusBlock,
-                                                     OUT PVOID pvBuf,
-                                                     IN ULONG cbBuf,
-                                                     IN FS_INFORMATION_CLASS FsInformationClass)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE hProcess,
-                                             IN LPCVOID pvWhere,
-                                             IN MEMORY_INFORMATION_CLASS MemoryInfo,
-                                             OUT PVOID pvBuf,
-                                             IN SIZE_T cbBuf,
-                                             OUT PSIZE_T pcbReturned OPTIONAL)
-{
-    return -1;
-}
-
-
-/* Setters: */
-
-NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE FileHandle,
-                                             OUT PIO_STATUS_BLOCK IoStatusBlock,
-                                             IN PVOID FileInformation,
-                                             IN ULONG Length,
-                                             IN FILE_INFORMATION_CLASS FileInformationClass)
-{
-    return -1;
-}
-
-NTSYSAPI LONG NTAPI NtSetTimerResolution(IN ULONG DesiredResolution,
-                                         IN BOOLEAN SetResolution,
-                                         OUT PULONG CurrentResolution)
-{
-    return -1;
-}
-
-
-
-/* Handles: */
-
-NTSYSAPI NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle,
-                                     IN ACCESS_MASK DesiredAccess,
-                                     IN POBJECT_ATTRIBUTES ObjectAttributes,
-                                     OUT PIO_STATUS_BLOCK IoStatusBlock,
-                                     IN PLARGE_INTEGER AllocationSize OPTIONAL,
-                                     IN ULONG FileAttributes,
-                                     IN ULONG ShareAccess,
-                                     IN ULONG CreateDisposition,
-                                     IN ULONG CreateOptions,
-                                     IN PVOID EaBuffer,
-                                     IN ULONG EaLength)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtOpenDirectoryObject(OUT PHANDLE ObjectHandle,
-                                              IN ACCESS_MASK DesiredAccess,
-                                              IN POBJECT_ATTRIBUTES ObjectAttributes)
-{
-    return -1;
-}
-
-NTSYSAPI NTSTATUS NTAPI NtClose(IN HANDLE Handle)
-{
-    return -1;
-}
-
diff --git a/src/VBox/Runtime/r3/win/ntdll-mini-implib.def b/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
index 64bc932..b6ae4e0 100644
--- a/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
+++ b/src/VBox/Runtime/r3/win/ntdll-mini-implib.def
@@ -4,7 +4,7 @@
 ;
 
 ;
-; Copyright (C) 2010-2013 Oracle Corporation
+; Copyright (C) 2010-2014 Oracle Corporation
 ;
 ; This file is part of VirtualBox Open Source Edition (OSE), as
 ; available from http://www.virtualbox.org. This file is free software;
@@ -26,15 +26,46 @@
 
 LIBRARY ntdll.dll
 EXPORTS
-    RtlNtStatusToDosError
-    NtQueryTimerResolution
-    NtQueryDirectoryFile
-    NtQueryInformationFile
-    NtQueryInformationProcess
-    NtSetInformationFile
-    NtSetTimerResolution
-    NtQueryVolumeInformationFile
-    NtQueryVirtualMemory
-    NtCreateFile
-    NtClose
-    NtOpenDirectoryObject
+  ; Exported name                           - The name x86 name sought by the linker.
+  ;                                         - This needs to be defined as a symbol, we generate assembly.
+    NtClose                               ;;= _NtClose at 4
+    NtCreateFile                          ;;= _NtCreateFile at 44
+    NtCreateSection                       ;;= _NtCreateSection at 28
+    NtDelayExecution                      ;;= _NtDelayExecution at 8
+    NtDeviceIoControlFile                 ;;= _NtDeviceIoControlFile at 40
+    NtDuplicateObject                     ;;= _NtDuplicateObject at 28
+    NtOpenDirectoryObject                 ;;= _NtOpenDirectoryObject at 12
+    NtOpenProcess                         ;;= _NtOpenProcess at 16
+    NtOpenProcessToken                    ;;= _NtOpenProcessToken at 12
+    NtOpenThreadToken                     ;;= _NtOpenThreadToken at 16
+    NtQueryDirectoryFile                  ;;= _NtQueryDirectoryFile at 44
+    NtQueryDirectoryObject                ;;= _NtQueryDirectoryObject at 28
+    NtQueryInformationFile                ;;= _NtQueryInformationFile at 20
+    NtQueryInformationProcess             ;;= _NtQueryInformationProcess at 20
+    NtQueryInformationThread              ;;= _NtQueryInformationThread at 20
+    NtQueryInformationToken               ;;= _NtQueryInformationToken at 20
+    NtQueryObject                         ;;= _NtQueryObject at 20
+    NtQueryTimerResolution                ;;= _NtQueryTimerResolution at 12
+    NtQueryVirtualMemory                  ;;= _NtQueryVirtualMemory at 24
+    NtQueryVolumeInformationFile          ;;= _NtQueryVolumeInformationFile at 20
+    NtReadFile                            ;;= _NtReadFile at 36
+    NtReadVirtualMemory                   ;;= _NtReadVirtualMemory at 20
+    NtSetInformationFile                  ;;= _NtSetInformationFile at 20
+    NtSetInformationObject                ;;= _NtSetInformationObject at 16
+    NtSetInformationThread                ;;= _NtSetInformationThread at 16
+    NtSetTimerResolution                  ;;= _NtSetTimerResolution at 12
+    NtWriteFile                           ;;= _NtWriteFile at 36
+    NtWriteVirtualMemory                  ;;= _NtWriteVirtualMemory at 20
+    NtYieldExecution                      ;;= _NtYieldExecution at 0
+                                          ;;
+    RtlAddAccessAllowedAce                ;;= _RtlAddAccessAllowedAce at 16
+    RtlAddAccessDeniedAce                 ;;= _RtlAddAccessDeniedAce at 16
+    RtlCopySid                            ;;= _RtlCopySid at 12
+    RtlCreateAcl                          ;;= _RtlCreateAcl at 12
+    RtlCreateSecurityDescriptor           ;;= _RtlCreateSecurityDescriptor at 8
+    RtlGetVersion                         ;;= _RtlGetVersion at 4
+    RtlInitializeSid                      ;;= _RtlInitializeSid at 12
+    RtlNtStatusToDosError                 ;;= _RtlNtStatusToDosError at 4
+    RtlSetDaclSecurityDescriptor          ;;= _RtlSetDaclSecurityDescriptor at 16
+    RtlSubAuthoritySid                    ;;= _RtlSubAuthoritySid at 8
+
diff --git a/src/VBox/Runtime/r3/win/rtmemlocked-win.cpp b/src/VBox/Runtime/r3/win/rtmemlocked-win.cpp
new file mode 100644
index 0000000..196171f
--- /dev/null
+++ b/src/VBox/Runtime/r3/win/rtmemlocked-win.cpp
@@ -0,0 +1,110 @@
+/* $Id: rtmemlocked-win.cpp $ */
+/** @file
+ * IPRT - RTMemLocked*, POSIX.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#define LOG_GROUP RTLOGGROUP_MEM
+#include "internal/iprt.h"
+#include <iprt/mem.h>
+
+#include <iprt/assert.h>
+#include <iprt/err.h>
+#include <iprt/param.h>
+#include <iprt/string.h>
+#include "internal/mem.h"
+
+#include <Windows.h>
+
+/*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+
+RTDECL(int) RTMemLockedAllocExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW
+{
+    int rc = VINF_SUCCESS;
+
+    *ppv = RTMemAlloc(cb);
+    if (!*ppv)
+        rc = VERR_NO_MEMORY;
+
+    return rc;
+}
+
+RTDECL(int) RTMemLockedAllocZExTag(size_t cb, const char *pszTag, void **ppv) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocExTag(cb, pszTag, &pv);
+
+    if (RT_SUCCESS(rc))
+    {
+        RT_BZERO(pv, cb);
+        *ppv = pv;
+    }
+
+    return rc;
+}
+
+RTDECL(void *) RTMemLockedAllocTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocExTag(cb, pszTag, &pv);
+
+    if (RT_FAILURE(rc))
+        return NULL;
+
+    return pv;
+}
+
+RTDECL(void *) RTMemLockedAllocZTag(size_t cb, const char *pszTag) RT_NO_THROW
+{
+    void *pv = NULL;
+    int rc = RTMemLockedAllocZExTag(cb, pszTag, &pv);
+
+    if (RT_FAILURE(rc))
+        return NULL;
+
+    return pv;
+}
+
+RTDECL(void) RTMemLockedFree(void *pv) RT_NO_THROW
+{
+    /*
+     * Validate & adjust the input.
+     */
+    if (!pv)
+        return;
+    AssertPtr(pv);
+
+    RTMemFree(pv);
+}
+
diff --git a/src/VBox/Runtime/testcase/72kb-random.bin b/src/VBox/Runtime/testcase/72kb-random.bin
new file mode 100644
index 0000000..4ef1b53
Binary files /dev/null and b/src/VBox/Runtime/testcase/72kb-random.bin differ
diff --git a/src/VBox/Runtime/testcase/72kb-random.h b/src/VBox/Runtime/testcase/72kb-random.h
new file mode 100644
index 0000000..17e1508
--- /dev/null
+++ b/src/VBox/Runtime/testcase/72kb-random.h
@@ -0,0 +1,4644 @@
+/* $Id: 72kb-random.h $ */
+/** @file
+ * C version of 72kb-random.bin generated by bin2c.
+ * 72kb-random.bin was generated from /dev/random on FreeBSD 9.1.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#include <iprt/cdefs.h>
+
+const unsigned char g_abRandom72KB[] =
+{
+    0xe8, 0xea, 0xf4, 0x76, 0x2b, 0x38, 0xfd, 0x61, 0xfd, 0x08, 0x4f, 0xe9, 0x60, 0xd6, 0x51, 0x52,
+    0xa9, 0x10, 0x5f, 0x47, 0xe1, 0x94, 0xad, 0x0b, 0xdc, 0x5a, 0x6d, 0xd9, 0x8c, 0x78, 0x30, 0xc8,
+    0x12, 0x21, 0x5a, 0xfa, 0x4e, 0x0c, 0x34, 0x19, 0x21, 0x5e, 0x6e, 0x02, 0xe3, 0x37, 0xbb, 0xc7,
+    0x4d, 0x7c, 0xc2, 0x48, 0x53, 0xbd, 0xff, 0xfe, 0x3e, 0x88, 0x66, 0x59, 0x79, 0xc7, 0x68, 0x43,
+    0x87, 0xef, 0x03, 0x33, 0x04, 0x49, 0x71, 0x30, 0xc0, 0xb0, 0x35, 0x45, 0x66, 0xd0, 0xf2, 0x46,
+    0x66, 0x51, 0xc7, 0xd3, 0x29, 0x47, 0xd5, 0x6a, 0x48, 0x00, 0x27, 0x83, 0x7c, 0x43, 0x4b, 0xff,
+    0x0a, 0x73, 0x9c, 0xd2, 0x84, 0x70, 0x4f, 0xdb, 0xd5, 0x70, 0x4e, 0x33, 0xfb, 0xbb, 0x10, 0x11,
+    0xc5, 0x87, 0x87, 0x97, 0x8c, 0xd4, 0x8c, 0x71, 0xf7, 0x03, 0x94, 0x8c, 0x90, 0x66, 0x2d, 0xd2,
+    0xd3, 0xf2, 0xd3, 0x06, 0xa5, 0x9d, 0x4e, 0xe1, 0x16, 0x7b, 0x26, 0xb1, 0x08, 0xa9, 0xeb, 0xba,
+    0x65, 0xb2, 0x5c, 0xb8, 0x62, 0x46, 0x71, 0x59, 0xe1, 0x9e, 0xfe, 0x8d, 0xcf, 0x62, 0xa6, 0x6f,
+    0x63, 0x9d, 0x2b, 0x2a, 0xdf, 0xa8, 0x6e, 0xb9, 0x40, 0x9f, 0x0c, 0xed, 0x6f, 0xf4, 0xcf, 0x09,
+    0x89, 0x6e, 0xa5, 0x72, 0x01, 0xdd, 0x9c, 0x84, 0x1d, 0x2b, 0x0c, 0x60, 0x32, 0xc4, 0xe5, 0xc5,
+    0x75, 0x55, 0x75, 0x0b, 0x0b, 0x07, 0x5c, 0x80, 0xae, 0xeb, 0xa7, 0xd2, 0xbe, 0x04, 0x6a, 0x58,
+    0x98, 0xc9, 0x64, 0x92, 0x68, 0x23, 0x40, 0x87, 0x6c, 0x9d, 0x88, 0x82, 0x24, 0x33, 0xd7, 0x5d,
+    0x8b, 0x39, 0x66, 0xc2, 0x7d, 0x26, 0x0f, 0x81, 0xac, 0xc0, 0x1a, 0xc5, 0xd4, 0x7c, 0x5c, 0x7c,
+    0xe8, 0xbc, 0x2d, 0x5b, 0x7e, 0xee, 0x56, 0x24, 0x71, 0xf9, 0xf8, 0x2b, 0x87, 0x5f, 0xfd, 0x50,
+    0x53, 0x24, 0xec, 0x16, 0x9a, 0x19, 0xef, 0x5b, 0x0e, 0xf2, 0x59, 0xc6, 0xb8, 0x24, 0x43, 0x67,
+    0x02, 0x23, 0x05, 0xf9, 0x37, 0xe3, 0xbd, 0xb9, 0xf6, 0x1f, 0x55, 0x1c, 0x45, 0x60, 0x04, 0x1a,
+    0x48, 0x4f, 0x39, 0x11, 0xb2, 0xb8, 0x18, 0x3e, 0x33, 0x89, 0x18, 0x55, 0x5e, 0xb4, 0x29, 0xb3,
+    0x1d, 0xf2, 0xbf, 0x2f, 0xaa, 0x4b, 0x54, 0x2b, 0x1f, 0xd1, 0xc8, 0x98, 0xdc, 0x79, 0xa1, 0x9a,
+    0xaa, 0x33, 0xf4, 0xa1, 0xc8, 0xcc, 0xc0, 0x1c, 0xce, 0x4b, 0xe7, 0xc3, 0xc4, 0x30, 0x2a, 0xef,
+    0x1c, 0x55, 0x18, 0xc1, 0x9b, 0x35, 0x25, 0x9e, 0x56, 0x44, 0x04, 0x43, 0xcd, 0x45, 0x3d, 0x7f,
+    0xe1, 0x49, 0xa5, 0x2d, 0x1a, 0xee, 0x5e, 0x4e, 0x02, 0x4c, 0x14, 0x6b, 0x70, 0x18, 0x6a, 0x64,
+    0xb7, 0x4d, 0xa0, 0x1b, 0xfd, 0x6e, 0x18, 0xcc, 0xda, 0x9a, 0xc4, 0xd3, 0x18, 0x7b, 0xbe, 0xeb,
+    0xb5, 0xcf, 0x67, 0xb8, 0xbb, 0x54, 0x20, 0x84, 0x5f, 0xbb, 0x4c, 0xd9, 0x92, 0x83, 0xd1, 0x01,
+    0xcd, 0x94, 0xb7, 0x36, 0xe4, 0x15, 0x11, 0xdf, 0xf0, 0x44, 0x03, 0x3b, 0x6f, 0x3c, 0x88, 0x23,
+    0x1e, 0x26, 0xb5, 0xd2, 0x26, 0x33, 0xe5, 0x27, 0x06, 0x75, 0x5c, 0xff, 0x03, 0xd3, 0x26, 0x6b,
+    0x07, 0x3b, 0xf0, 0x88, 0x98, 0xc9, 0x9b, 0xaf, 0xfc, 0xab, 0xe7, 0xff, 0x17, 0x0d, 0x00, 0x27,
+    0xa0, 0x1a, 0xfb, 0x87, 0xd2, 0xe7, 0xe2, 0x05, 0xf7, 0xc0, 0x23, 0x08, 0x7e, 0x72, 0xb3, 0x1c,
+    0xb3, 0xfa, 0x64, 0x3d, 0x06, 0x3c, 0xe3, 0x9b, 0xc4, 0xbe, 0xfe, 0x5a, 0x99, 0xc2, 0x97, 0xdd,
+    0xa1, 0xe1, 0x04, 0xa5, 0x78, 0x9d, 0xaa, 0x46, 0x9f, 0xec, 0xb8, 0x59, 0x81, 0xfb, 0xd0, 0xb8,
+    0xb0, 0x3a, 0x95, 0xe2, 0x59, 0xdc, 0x54, 0xcf, 0x3a, 0x31, 0x65, 0x3a, 0xfc, 0x57, 0x56, 0x2c,
+    0x2b, 0xf2, 0x31, 0x0c, 0xb3, 0xaf, 0x14, 0xe4, 0xf8, 0xba, 0xe8, 0x71, 0xc9, 0x9f, 0x41, 0xd2,
+    0xa7, 0x80, 0x78, 0x0c, 0xd1, 0xd9, 0x4d, 0x5a, 0x96, 0x07, 0xe8, 0x70, 0x11, 0x0c, 0xe5, 0xab,
+    0xa8, 0x63, 0x5b, 0xc5, 0x15, 0x1f, 0x28, 0x4b, 0x44, 0x74, 0xec, 0x2b, 0x74, 0x08, 0x41, 0x81,
+    0x00, 0x43, 0x80, 0x2b, 0xf7, 0x52, 0x4b, 0xcf, 0x61, 0xab, 0x71, 0x72, 0x44, 0xe2, 0xe7, 0x18,
+    0xc4, 0xad, 0x56, 0x5f, 0x5e, 0x0e, 0xdd, 0x87, 0xf2, 0xc8, 0x53, 0x96, 0xcc, 0x3d, 0x06, 0x54,
+    0xce, 0xf2, 0x7f, 0xdb, 0x73, 0x1d, 0x32, 0x42, 0xb3, 0x9e, 0x17, 0x08, 0x35, 0x59, 0x26, 0x2c,
+    0x52, 0x1c, 0x65, 0x08, 0xbf, 0xa3, 0x2c, 0x89, 0x3a, 0x76, 0x5f, 0xd2, 0xc4, 0xe8, 0xbf, 0x7e,
+    0x74, 0xbb, 0xc1, 0x14, 0x7d, 0x96, 0x7d, 0x6a, 0xf5, 0x04, 0x45, 0x84, 0xc4, 0x37, 0x91, 0xbd,
+    0xc5, 0x02, 0xe4, 0xf3, 0x14, 0xfc, 0xeb, 0x7a, 0x70, 0x59, 0x9a, 0x01, 0xd5, 0x93, 0xfc, 0xc0,
+    0xee, 0x72, 0x30, 0x22, 0x47, 0x4c, 0x9f, 0x7e, 0x37, 0xa6, 0x9a, 0x28, 0xef, 0xce, 0xa2, 0xf6,
+    0x48, 0xc1, 0x15, 0xc2, 0x63, 0xa8, 0xa2, 0xfe, 0x62, 0xe4, 0xbe, 0xb9, 0xa0, 0x3c, 0x3e, 0xad,
+    0x04, 0x0e, 0xe7, 0x57, 0xf7, 0xb3, 0xca, 0x04, 0x33, 0xbb, 0x0e, 0x60, 0x80, 0xe9, 0x59, 0x48,
+    0x2f, 0x64, 0xee, 0xd9, 0x6e, 0x82, 0xa4, 0x8c, 0x8f, 0x1d, 0x8f, 0x3c, 0x5e, 0xe7, 0xe3, 0xf7,
+    0x44, 0x3a, 0x0d, 0xcf, 0xce, 0x38, 0x5b, 0x33, 0x54, 0x84, 0xef, 0x2a, 0x02, 0xb4, 0x23, 0x31,
+    0xdc, 0xe1, 0xf4, 0xc7, 0x5d, 0x68, 0x31, 0x43, 0x6f, 0x27, 0x6e, 0x4c, 0xe2, 0xa6, 0xf1, 0xd1,
+    0xc0, 0xff, 0x69, 0x23, 0x71, 0x45, 0xd0, 0x66, 0xd2, 0xac, 0xde, 0x6a, 0xb4, 0x9c, 0x3c, 0x60,
+    0xcf, 0x6c, 0xc4, 0x61, 0xc2, 0x05, 0xf4, 0x2c, 0x9e, 0x9a, 0x16, 0x5f, 0x7a, 0x43, 0x66, 0x1e,
+    0x70, 0xc6, 0x43, 0x8e, 0xd6, 0xb7, 0xdc, 0x5f, 0xcd, 0x0e, 0xaf, 0x2c, 0x34, 0xd6, 0x65, 0x8e,
+    0x02, 0x4d, 0xf5, 0x6a, 0x83, 0xf7, 0xec, 0xe8, 0x04, 0x98, 0x5b, 0x4e, 0x04, 0x20, 0xbd, 0x09,
+    0xdb, 0xe6, 0xe5, 0x4e, 0x14, 0x86, 0x48, 0xf0, 0x4b, 0xeb, 0x3d, 0x31, 0x20, 0xb0, 0xd5, 0xfc,
+    0x43, 0x78, 0x58, 0x67, 0xd8, 0x2e, 0xdd, 0x28, 0x0a, 0xc7, 0x35, 0x8c, 0x33, 0x49, 0x1b, 0x7c,
+    0x44, 0x62, 0xb3, 0x9a, 0x6d, 0x41, 0x1f, 0xec, 0xd9, 0xed, 0x32, 0x67, 0x21, 0xf7, 0x38, 0x84,
+    0xea, 0x8e, 0xc1, 0xa5, 0x52, 0xef, 0x1a, 0x1f, 0xae, 0xbf, 0x49, 0x22, 0x5b, 0xf1, 0x7e, 0x00,
+    0x9c, 0x2b, 0x75, 0x9e, 0xb7, 0xfe, 0x18, 0xbe, 0xf1, 0x80, 0x49, 0x56, 0x58, 0x90, 0xa5, 0x81,
+    0xb9, 0x3f, 0x7e, 0xd3, 0xe2, 0xa2, 0xaf, 0x95, 0xd8, 0x33, 0x39, 0xf1, 0x02, 0xa9, 0xb3, 0x9b,
+    0xe3, 0xac, 0xd7, 0xbf, 0x62, 0xc1, 0x63, 0x71, 0x59, 0xc3, 0xfe, 0xfb, 0xfc, 0x88, 0x5f, 0xd9,
+    0x2c, 0x68, 0x44, 0x5c, 0xea, 0x1b, 0xc3, 0x7b, 0x8d, 0x18, 0x0c, 0x03, 0xc4, 0x46, 0x4b, 0x3d,
+    0xf9, 0xcb, 0xb2, 0x03, 0xd9, 0x90, 0xdd, 0x47, 0x65, 0xb9, 0xaa, 0x5c, 0xb4, 0xdd, 0x70, 0x93,
+    0x45, 0x95, 0x22, 0x13, 0x49, 0x7c, 0x98, 0xef, 0x7c, 0xea, 0x89, 0x2c, 0xdb, 0x5a, 0x4d, 0xae,
+    0x6e, 0x13, 0x2c, 0xfc, 0x11, 0x2d, 0x15, 0x40, 0x7c, 0x25, 0xd3, 0xc2, 0x55, 0xdd, 0xee, 0xb5,
+    0xbb, 0x5c, 0xe3, 0x04, 0x56, 0xa6, 0xed, 0x11, 0x1e, 0xc7, 0xc9, 0xb2, 0x9e, 0xec, 0xda, 0xb4,
+    0x70, 0xfa, 0x63, 0xa1, 0x42, 0x35, 0xa5, 0xde, 0xda, 0xcd, 0x4c, 0xc5, 0x61, 0xa6, 0x80, 0x10,
+    0x60, 0xdd, 0x21, 0x0e, 0x42, 0xb5, 0xde, 0xdc, 0x0a, 0xfa, 0x56, 0xf6, 0x57, 0x94, 0xfc, 0xbb,
+    0xb3, 0x24, 0xd0, 0x50, 0xbb, 0xee, 0x55, 0x47, 0x01, 0x29, 0x56, 0x45, 0x5f, 0x4a, 0xdb, 0x62,
+    0x78, 0xb5, 0xbe, 0x62, 0x5b, 0xef, 0xb8, 0x79, 0xd1, 0x4d, 0xab, 0xca, 0x24, 0x8f, 0xd7, 0xd4,
+    0x8a, 0xae, 0x2b, 0xba, 0xba, 0xbf, 0xba, 0x37, 0x4d, 0x9e, 0x7c, 0x78, 0x94, 0xa1, 0x49, 0xde,
+    0xd2, 0x34, 0x59, 0xce, 0x07, 0x56, 0x9d, 0x09, 0x59, 0xfb, 0xa6, 0xbc, 0x8d, 0x3b, 0x28, 0x74,
+    0x8c, 0xb1, 0x43, 0xfe, 0xf7, 0xe3, 0x54, 0x28, 0x2e, 0xab, 0x71, 0x70, 0x72, 0xe7, 0xe6, 0x62,
+    0xab, 0x53, 0x0b, 0xee, 0x83, 0x99, 0xb6, 0x2f, 0xc8, 0x5a, 0x01, 0x3e, 0x1c, 0x8f, 0xae, 0x84,
+    0xf7, 0x7e, 0x9b, 0xa8, 0xb0, 0xbd, 0xa0, 0xf2, 0xe1, 0xb0, 0x69, 0x99, 0xe9, 0xe8, 0x69, 0x04,
+    0x5e, 0x99, 0x20, 0x84, 0xf7, 0x6f, 0x3c, 0xcc, 0x15, 0x13, 0xbc, 0x88, 0x9b, 0x2f, 0xe1, 0x68,
+    0x69, 0x38, 0xf1, 0xac, 0x7f, 0x9f, 0xf0, 0xdd, 0x48, 0x04, 0xf4, 0xed, 0x88, 0xaa, 0x6a, 0xe2,
+    0xb3, 0x3f, 0x4c, 0x28, 0x30, 0x6a, 0x40, 0x05, 0x42, 0x07, 0xb4, 0xf4, 0xf2, 0x40, 0x48, 0xa6,
+    0xf7, 0xed, 0x4e, 0x54, 0xe8, 0xd4, 0x9f, 0x92, 0xd4, 0x68, 0x07, 0x93, 0x13, 0x4e, 0xbb, 0xd9,
+    0xe9, 0x9a, 0xc9, 0x76, 0x09, 0xb3, 0x52, 0x3f, 0x51, 0xc4, 0x2e, 0xa7, 0x2e, 0xc4, 0x40, 0x24,
+    0xbf, 0xaf, 0x74, 0x55, 0xe3, 0x8c, 0xa8, 0x67, 0xe9, 0x04, 0x2f, 0x86, 0x99, 0x00, 0xcc, 0x75,
+    0xc1, 0x9a, 0x9d, 0x42, 0x17, 0x71, 0xc9, 0x30, 0x8a, 0xc4, 0x8a, 0x40, 0xd1, 0x54, 0x40, 0x07,
+    0x82, 0xb5, 0x74, 0x5c, 0xbc, 0xc8, 0x5d, 0x60, 0x8d, 0xf4, 0x5f, 0xb5, 0xee, 0x93, 0xd4, 0xab,
+    0x5b, 0x02, 0xc8, 0xcb, 0x79, 0xa8, 0x8a, 0xe6, 0x15, 0x18, 0x40, 0x6a, 0x0c, 0x09, 0x9e, 0x2d,
+    0x38, 0x96, 0x2f, 0x86, 0x95, 0x31, 0xfa, 0x92, 0x2f, 0x8d, 0x2e, 0x43, 0xba, 0xec, 0x60, 0xc0,
+    0x25, 0x81, 0xf7, 0x66, 0x03, 0x59, 0x3f, 0xad, 0xa2, 0x0e, 0xd8, 0x03, 0xf0, 0x85, 0x91, 0x45,
+    0xac, 0x12, 0x73, 0x1f, 0x35, 0x3c, 0xce, 0x9f, 0x1e, 0x61, 0x2f, 0xe7, 0x14, 0xbb, 0x42, 0x70,
+    0x9c, 0xfd, 0x16, 0x87, 0xc5, 0xd8, 0xd8, 0x73, 0x68, 0xb8, 0x34, 0x98, 0x56, 0x1d, 0x77, 0x8f,
+    0x78, 0x9b, 0xad, 0x99, 0x1e, 0xbd, 0x0f, 0xb4, 0xc1, 0x4f, 0xfa, 0x74, 0xbc, 0xa8, 0x33, 0x23,
+    0x8c, 0xf5, 0x88, 0xb7, 0xf2, 0x54, 0x53, 0x79, 0x4a, 0x6c, 0xf0, 0x5d, 0x37, 0xa8, 0xf2, 0x46,
+    0xf6, 0x78, 0x93, 0xfa, 0xba, 0x4b, 0x4a, 0x44, 0xe3, 0x3a, 0xf5, 0x08, 0x0e, 0x61, 0x50, 0xdd,
+    0x41, 0x51, 0xa9, 0x5c, 0xac, 0xde, 0xad, 0x38, 0x9e, 0xd1, 0xf0, 0x7c, 0x3c, 0xa0, 0x77, 0x0c,
+    0xb7, 0x53, 0xbd, 0xb1, 0x5c, 0x70, 0xbd, 0x76, 0x61, 0x1e, 0x04, 0xc2, 0x50, 0x8d, 0x98, 0xe4,
+    0x55, 0x46, 0x11, 0x97, 0x33, 0x6d, 0x3b, 0x39, 0x82, 0xfb, 0x13, 0xe5, 0x58, 0x1c, 0x3c, 0x46,
+    0xa7, 0x86, 0xd2, 0xd1, 0x5c, 0x31, 0x3b, 0xc5, 0x99, 0xd8, 0x31, 0xdd, 0x98, 0xe1, 0xcb, 0x41,
+    0x74, 0x59, 0x3a, 0xba, 0xcb, 0x12, 0x0a, 0x37, 0x09, 0x5c, 0x01, 0xca, 0x86, 0x12, 0xa6, 0x2b,
+    0xa0, 0x6a, 0x9d, 0x07, 0xd0, 0x79, 0xd6, 0x06, 0xed, 0xbd, 0x4d, 0xd5, 0x24, 0x82, 0xc3, 0xbf,
+    0x20, 0xff, 0x45, 0x5c, 0xb9, 0x9f, 0xc4, 0x25, 0x39, 0xcb, 0x7f, 0xbf, 0xdd, 0x93, 0xcf, 0xb9,
+    0x2c, 0x59, 0x73, 0xd8, 0xd1, 0xb3, 0x20, 0x71, 0x7c, 0xf3, 0x62, 0xaa, 0x10, 0xe5, 0xfc, 0x25,
+    0x08, 0x3e, 0x49, 0xac, 0x12, 0xa4, 0xaa, 0x40, 0xba, 0xe6, 0xc5, 0x84, 0x0b, 0x38, 0xb2, 0xf7,
+    0x1a, 0x9c, 0xac, 0x82, 0x2c, 0x0f, 0x94, 0xc5, 0x2f, 0x24, 0xa6, 0x7a, 0x29, 0x11, 0xa8, 0x5c,
+    0x5d, 0x8f, 0x65, 0x29, 0x61, 0xd0, 0x2a, 0x65, 0xfd, 0xfb, 0x3d, 0x9a, 0x8b, 0xca, 0x7f, 0xac,
+    0x46, 0x1a, 0xd4, 0xa7, 0x5e, 0x66, 0x4b, 0xb1, 0x33, 0xb6, 0x57, 0x09, 0x2d, 0x40, 0x8a, 0xb9,
+    0x15, 0xf3, 0xee, 0xb9, 0x9a, 0x20, 0xfc, 0x51, 0x56, 0x9a, 0x18, 0x9a, 0x9e, 0x84, 0x14, 0x24,
+    0x50, 0xda, 0xd7, 0x79, 0x35, 0x08, 0xb1, 0xae, 0xc3, 0x19, 0xce, 0x86, 0xbd, 0x62, 0x56, 0xc0,
+    0xd9, 0x71, 0xa4, 0x6e, 0x9e, 0xd2, 0x70, 0x38, 0x55, 0x88, 0x2f, 0x60, 0x95, 0x46, 0xe9, 0x41,
+    0x5b, 0x8b, 0x48, 0x27, 0xff, 0x1f, 0x1e, 0x8d, 0xf3, 0x7c, 0xda, 0x9f, 0x29, 0xf6, 0xc8, 0xbd,
+    0x01, 0x56, 0x6e, 0x43, 0xc8, 0xc3, 0x34, 0xd2, 0x93, 0x43, 0x99, 0x17, 0x88, 0x64, 0xc7, 0xfb,
+    0xd0, 0x29, 0x68, 0x19, 0x97, 0x62, 0x11, 0x2a, 0xbb, 0x2c, 0x02, 0xd1, 0xb0, 0xd2, 0x0c, 0x90,
+    0x68, 0x30, 0xe6, 0x41, 0x06, 0x92, 0x8c, 0xe0, 0xe2, 0xaf, 0x16, 0x8d, 0xbf, 0x50, 0x3f, 0x16,
+    0x0e, 0xc0, 0xbe, 0xef, 0xf3, 0x67, 0xee, 0x2c, 0x20, 0xb8, 0x0d, 0x22, 0x91, 0x29, 0x0f, 0x26,
+    0x63, 0x55, 0xa5, 0x13, 0x71, 0x41, 0x4b, 0x57, 0xe8, 0xff, 0x1a, 0x4f, 0x93, 0x24, 0x89, 0xf9,
+    0x30, 0xde, 0xd0, 0x37, 0xda, 0x42, 0xa0, 0xf4, 0x19, 0x66, 0x68, 0x00, 0x9c, 0xbf, 0x7c, 0xaf,
+    0xd3, 0x91, 0x93, 0xd0, 0x69, 0x91, 0xe9, 0xfd, 0xa8, 0xc5, 0x02, 0x24, 0xfe, 0x1f, 0x1c, 0x33,
+    0xc4, 0xf3, 0x6f, 0x48, 0x01, 0x55, 0xc1, 0x4a, 0x42, 0x92, 0x6f, 0xc7, 0x0c, 0x6a, 0x46, 0xca,
+    0xb1, 0x56, 0x15, 0x86, 0x91, 0x1b, 0x2d, 0xf6, 0x3c, 0x50, 0x3f, 0xc3, 0xba, 0x6d, 0x1a, 0xf7,
+    0xa5, 0x42, 0x4a, 0x77, 0x09, 0x90, 0x24, 0x14, 0x01, 0x91, 0x7e, 0x3c, 0xf3, 0x88, 0xc0, 0x86,
+    0xf3, 0x94, 0x48, 0xd3, 0x73, 0x6d, 0x17, 0x3c, 0xc5, 0x7c, 0x67, 0x13, 0x4f, 0x0b, 0x20, 0x19,
+    0xf9, 0x02, 0x9c, 0xb7, 0xe1, 0x3e, 0x09, 0x5b, 0x97, 0x9e, 0x73, 0x27, 0x4f, 0x9a, 0x9b, 0x44,
+    0xd2, 0x19, 0x17, 0x24, 0xef, 0xa1, 0x19, 0xdc, 0xf3, 0xa4, 0x28, 0x96, 0x46, 0x87, 0x0b, 0x3a,
+    0x09, 0xe8, 0xd0, 0x1e, 0x39, 0x9c, 0x0e, 0x72, 0x1a, 0xc2, 0x06, 0x2d, 0xe5, 0x23, 0xb7, 0xa9,
+    0xc3, 0x64, 0x14, 0x25, 0xf4, 0xcf, 0x6a, 0x45, 0xa7, 0xe5, 0x0b, 0x8d, 0x76, 0x8a, 0xd5, 0x60,
+    0x4b, 0x58, 0x29, 0xce, 0xc2, 0x27, 0xd4, 0xac, 0x4c, 0x74, 0x18, 0x3f, 0x59, 0x88, 0x70, 0xb1,
+    0x7e, 0xb0, 0x04, 0x91, 0xf8, 0x38, 0x20, 0x5b, 0xde, 0xa7, 0x1e, 0x3f, 0x2b, 0xcc, 0xe3, 0x15,
+    0x56, 0x38, 0x33, 0x68, 0x2c, 0xa8, 0x48, 0x66, 0x4e, 0x3e, 0x78, 0x2c, 0xd4, 0x44, 0x97, 0x9e,
+    0x0f, 0xe5, 0x20, 0x8a, 0x2c, 0x53, 0xe9, 0xfa, 0x6c, 0xb6, 0x1e, 0x58, 0x58, 0xf4, 0x62, 0x97,
+    0x7b, 0x12, 0x60, 0x24, 0x99, 0x62, 0x47, 0x8f, 0xc8, 0x6b, 0x98, 0x17, 0x26, 0x46, 0xf6, 0x93,
+    0x6c, 0xb6, 0x8e, 0xa3, 0x5e, 0x29, 0xc3, 0xd5, 0xf3, 0x13, 0x8d, 0x31, 0xdd, 0xb3, 0x4c, 0x69,
+    0x34, 0x9a, 0xf2, 0x13, 0x28, 0x7a, 0xaf, 0x4a, 0x1b, 0xde, 0xde, 0xcc, 0xc4, 0x7b, 0x3a, 0xc2,
+    0x5f, 0xc0, 0xed, 0x2f, 0xab, 0xdf, 0xc6, 0x1e, 0x5c, 0xc5, 0x91, 0xb8, 0x15, 0xda, 0x5e, 0x7c,
+    0xed, 0x28, 0xf3, 0x7f, 0xd4, 0x2c, 0x69, 0xc0, 0x75, 0x6e, 0xac, 0x9e, 0xf1, 0xe6, 0xaa, 0xde,
+    0x77, 0x52, 0x53, 0xdd, 0x66, 0x29, 0x38, 0x45, 0x94, 0x00, 0x48, 0xef, 0xb8, 0x0a, 0x5d, 0x9c,
+    0xd6, 0xe4, 0x4e, 0x60, 0x31, 0xde, 0xc4, 0xc3, 0x98, 0x07, 0x07, 0xea, 0xa6, 0x75, 0x26, 0xca,
+    0xce, 0x22, 0xe9, 0x68, 0xa8, 0xd7, 0x2f, 0x3f, 0x01, 0x72, 0x4b, 0xb3, 0x6e, 0x46, 0xd3, 0x7f,
+    0x1a, 0xd6, 0xb1, 0xda, 0x2f, 0x1d, 0xdf, 0x64, 0x55, 0x79, 0xf7, 0x97, 0x5a, 0xb1, 0xfd, 0x26,
+    0x89, 0x51, 0xf8, 0xc1, 0x7a, 0x8c, 0x90, 0x28, 0x78, 0xa1, 0x14, 0x58, 0x10, 0x61, 0x6f, 0x0a,
+    0xb7, 0x46, 0x7f, 0x18, 0x5e, 0xca, 0x98, 0x43, 0xfe, 0xc3, 0xff, 0xa9, 0xf6, 0xbe, 0xb6, 0x7b,
+    0x1c, 0xd6, 0x54, 0x55, 0xc9, 0xff, 0xfb, 0x23, 0xa4, 0x75, 0x83, 0x0b, 0xfb, 0x5d, 0xb4, 0x08,
+    0x30, 0x3d, 0xd7, 0xc7, 0x74, 0xc3, 0x0d, 0xfb, 0xa4, 0x05, 0x89, 0xdc, 0xbd, 0xec, 0x33, 0xa8,
+    0x32, 0x16, 0x8f, 0x9d, 0x30, 0x81, 0x1e, 0x80, 0x6f, 0x08, 0xbe, 0xde, 0x16, 0xdb, 0xac, 0x37,
+    0xbb, 0x36, 0x62, 0xa9, 0x00, 0x58, 0x9d, 0x18, 0x5d, 0x0e, 0xc2, 0x90, 0xe8, 0xe3, 0xb6, 0x48,
+    0x0a, 0xd6, 0x50, 0xf9, 0x5e, 0x29, 0x06, 0x38, 0xf9, 0x64, 0x0d, 0xc4, 0x2e, 0xa7, 0xe0, 0x0a,
+    0x20, 0xcc, 0x65, 0x2e, 0xd7, 0x79, 0xd5, 0x96, 0xb4, 0x74, 0x2b, 0xd7, 0x7e, 0x32, 0x69, 0x3c,
+    0x49, 0x9b, 0xfe, 0x07, 0xda, 0x75, 0x43, 0x60, 0x72, 0x03, 0x7f, 0x28, 0x76, 0x04, 0x9f, 0xcb,
+    0xaa, 0x39, 0xc5, 0x95, 0x68, 0x07, 0x51, 0x4e, 0xd8, 0x4f, 0xab, 0xd3, 0xfb, 0x4f, 0xcd, 0x56,
+    0xc7, 0x0a, 0x5a, 0x64, 0x42, 0xfa, 0x5b, 0xb6, 0xd4, 0xfd, 0x1c, 0x0c, 0xa5, 0x2a, 0xf8, 0xd9,
+    0x25, 0x3c, 0x41, 0x67, 0x82, 0x8b, 0xc3, 0x53, 0x3f, 0x98, 0x33, 0x13, 0x73, 0xaa, 0xfd, 0x6d,
+    0xd3, 0x4b, 0x45, 0x77, 0x60, 0x0b, 0xc4, 0x17, 0xc8, 0x3e, 0x2b, 0xc4, 0x99, 0x08, 0x8b, 0x5d,
+    0x70, 0xc3, 0x26, 0x9f, 0x09, 0xdf, 0xbc, 0xe6, 0xde, 0xa8, 0x98, 0x8a, 0xa1, 0x7f, 0x6c, 0x74,
+    0x6c, 0x71, 0xf6, 0x60, 0x50, 0xef, 0x01, 0xf4, 0x81, 0xee, 0x94, 0x05, 0x87, 0xb0, 0x4c, 0xfa,
+    0x8f, 0xf6, 0x65, 0x69, 0x75, 0xc9, 0x1a, 0x81, 0x43, 0x38, 0x39, 0x84, 0xa1, 0xcc, 0x17, 0x1a,
+    0xb7, 0x98, 0x2d, 0x08, 0x50, 0x2d, 0x16, 0xe2, 0x50, 0x3c, 0x4c, 0xf6, 0x6d, 0x71, 0xd8, 0x71,
+    0x19, 0x2e, 0xbf, 0x69, 0x4a, 0x15, 0x5a, 0x40, 0xb7, 0xf8, 0x82, 0xa9, 0x5a, 0xf7, 0x07, 0x7a,
+    0x38, 0x89, 0x44, 0xd1, 0x3c, 0x1c, 0xb0, 0x16, 0xf0, 0x13, 0xb3, 0xec, 0x32, 0x16, 0x7f, 0x4b,
+    0xba, 0x0e, 0xec, 0xdd, 0x14, 0x96, 0xdb, 0xf5, 0xd8, 0xd9, 0xa2, 0x88, 0xa2, 0x94, 0x17, 0x20,
+    0xc9, 0x5f, 0x6c, 0xb4, 0x32, 0xa3, 0x72, 0xb2, 0xa2, 0xef, 0x41, 0x75, 0x72, 0x7b, 0x5b, 0x63,
+    0x19, 0x17, 0x84, 0x4e, 0xe9, 0xc1, 0xc4, 0x01, 0xc5, 0x04, 0xe2, 0x95, 0x40, 0x98, 0xd1, 0x62,
+    0xb0, 0x95, 0x61, 0xc0, 0x84, 0x44, 0x29, 0x73, 0x03, 0x26, 0x7d, 0xea, 0xd6, 0x3c, 0x2b, 0x4a,
+    0xe2, 0xcb, 0x4e, 0x08, 0x85, 0xa2, 0x22, 0x59, 0x57, 0x3d, 0x55, 0x12, 0x48, 0x3f, 0x70, 0xc2,
+    0x50, 0x2f, 0x00, 0x84, 0xec, 0x7d, 0xad, 0xbb, 0x2c, 0x51, 0x29, 0x3e, 0xcb, 0xef, 0xe7, 0xe3,
+    0xd0, 0x41, 0x6f, 0xd6, 0xcd, 0xba, 0x73, 0x1f, 0xba, 0x3a, 0x78, 0xed, 0x74, 0x38, 0x4b, 0x6e,
+    0x2b, 0x0a, 0xf0, 0x5a, 0xce, 0xa1, 0x8f, 0x5d, 0x9e, 0xef, 0xac, 0x41, 0x2e, 0xf2, 0xf1, 0xbf,
+    0x21, 0xe8, 0x64, 0x29, 0x77, 0x08, 0xb4, 0xe7, 0x04, 0x19, 0xce, 0xda, 0xf4, 0xb0, 0xe6, 0x07,
+    0x68, 0xde, 0xa8, 0x9f, 0x4e, 0x64, 0x42, 0x9c, 0xb0, 0xc6, 0x9c, 0xf3, 0x70, 0x79, 0xd3, 0x92,
+    0x2c, 0x77, 0xb7, 0xb3, 0x19, 0xe4, 0x0f, 0xe6, 0x7e, 0xde, 0xd3, 0xcb, 0x34, 0x11, 0xc1, 0x93,
+    0x02, 0x84, 0x4d, 0xaf, 0xcf, 0x59, 0x63, 0x5b, 0x87, 0xb1, 0x73, 0xa7, 0xc4, 0xe9, 0x4b, 0xfe,
+    0xf7, 0xa9, 0x76, 0x4b, 0x79, 0x18, 0x7c, 0x33, 0x0f, 0xd6, 0x5c, 0xea, 0x5d, 0xc2, 0x08, 0xad,
+    0x91, 0x4e, 0x78, 0x88, 0x47, 0x14, 0x7a, 0xbe, 0x04, 0xc3, 0x9a, 0x08, 0x9e, 0xa3, 0xb2, 0x98,
+    0xe8, 0x4e, 0x61, 0x7d, 0x91, 0x3d, 0x2f, 0xd3, 0x2e, 0xa1, 0x30, 0x7d, 0x31, 0x86, 0x86, 0x4c,
+    0xe7, 0x6e, 0x0d, 0x57, 0x0f, 0x79, 0x53, 0xfd, 0xe3, 0x1f, 0x95, 0x40, 0x60, 0xbf, 0x5c, 0xd5,
+    0x04, 0xdf, 0xcc, 0x10, 0x0c, 0xba, 0xd9, 0x6d, 0xc8, 0x57, 0x04, 0x74, 0xf9, 0x16, 0xe6, 0x96,
+    0x6a, 0xe6, 0x84, 0xdf, 0xc2, 0x16, 0xd1, 0x68, 0x6d, 0xa1, 0xd6, 0x8d, 0xca, 0xf9, 0xfd, 0x96,
+    0xdb, 0xe5, 0x49, 0xa4, 0x9f, 0xe7, 0xac, 0x3a, 0xeb, 0x39, 0x7d, 0x8a, 0xc1, 0x4e, 0x03, 0xe5,
+    0x33, 0x68, 0x81, 0x95, 0xee, 0x96, 0x78, 0x4e, 0xa5, 0x34, 0x4f, 0xbf, 0xaf, 0x15, 0x29, 0x40,
+    0x64, 0x8f, 0xfe, 0x96, 0x70, 0x6e, 0xc9, 0x09, 0x18, 0xe0, 0x55, 0x6c, 0x1d, 0xd5, 0x7e, 0x99,
+    0x7e, 0x20, 0x11, 0x1b, 0x59, 0x08, 0x5b, 0x79, 0x3a, 0xed, 0x48, 0xc2, 0xa5, 0x81, 0x35, 0xc6,
+    0x52, 0x43, 0x29, 0x78, 0x22, 0x68, 0x0b, 0x4c, 0x5e, 0x39, 0x64, 0x83, 0xbe, 0xe5, 0xa9, 0x7a,
+    0x26, 0x2a, 0xef, 0xb6, 0x58, 0x0a, 0x12, 0x3b, 0x45, 0xea, 0x59, 0xc9, 0x1c, 0x6c, 0x42, 0x8e,
+    0x63, 0x9b, 0x2d, 0x8c, 0x01, 0xbd, 0x49, 0x40, 0x7f, 0x93, 0x53, 0x30, 0xe1, 0xd2, 0x6c, 0x29,
+    0x02, 0xd7, 0xc5, 0x96, 0x63, 0x34, 0xc7, 0x0c, 0x25, 0x16, 0x56, 0xa8, 0x80, 0x98, 0xbc, 0xfc,
+    0x55, 0x2a, 0xe8, 0xad, 0x02, 0xb6, 0xee, 0xa9, 0x1e, 0x95, 0x9e, 0x7e, 0x0a, 0xa9, 0xe9, 0xf2,
+    0xce, 0x70, 0x84, 0xb8, 0x81, 0x15, 0x6b, 0x80, 0x18, 0x8e, 0xad, 0x99, 0x5d, 0xdb, 0xca, 0x39,
+    0x57, 0xe1, 0xcb, 0x0b, 0xcd, 0x5d, 0xa4, 0xa6, 0xbe, 0xff, 0xb8, 0x8c, 0x68, 0xf9, 0x07, 0x6d,
+    0x36, 0x18, 0x0b, 0x72, 0x52, 0x1e, 0x70, 0xc5, 0x50, 0x83, 0xfe, 0x5c, 0xa7, 0xd6, 0x5f, 0xc6,
+    0x6e, 0x64, 0x71, 0x2b, 0x63, 0xac, 0xd4, 0x42, 0x44, 0xa9, 0x34, 0x50, 0x8d, 0x19, 0x13, 0x17,
+    0xde, 0x93, 0xdc, 0x1b, 0x97, 0xf5, 0x38, 0x6a, 0xe9, 0xa0, 0x0f, 0x67, 0x25, 0x64, 0xae, 0x9e,
+    0x51, 0xc6, 0xc8, 0x5e, 0x09, 0x57, 0x01, 0x29, 0x96, 0x60, 0xf8, 0xd1, 0x15, 0xef, 0x9c, 0x62,
+    0xcc, 0x2e, 0x15, 0x96, 0x4d, 0x13, 0x3f, 0xb7, 0x5c, 0x1e, 0x2d, 0x76, 0x33, 0x96, 0x5b, 0x82,
+    0x99, 0xb1, 0x29, 0x5d, 0x9a, 0x21, 0xdc, 0xff, 0xb9, 0x76, 0xd6, 0x76, 0x4f, 0x37, 0xa2, 0xca,
+    0x4d, 0xf6, 0xd4, 0xb8, 0x0b, 0xc2, 0x7b, 0xb1, 0x09, 0xc3, 0x97, 0x49, 0x2a, 0xd8, 0xeb, 0x1a,
+    0x6a, 0x51, 0x90, 0xf2, 0xe0, 0xdb, 0x8d, 0x4b, 0xaf, 0x25, 0xdc, 0x75, 0x37, 0x52, 0xa1, 0x2f,
+    0x30, 0xbe, 0x5c, 0xee, 0xc4, 0x53, 0x6b, 0x9d, 0x40, 0xec, 0x93, 0xa2, 0x15, 0x9a, 0xec, 0xb9,
+    0xae, 0x03, 0x4c, 0xdb, 0x84, 0xee, 0x09, 0x54, 0x13, 0xa6, 0xb2, 0xe7, 0x31, 0xac, 0x52, 0x2a,
+    0x14, 0x63, 0xf9, 0x12, 0x2f, 0xd2, 0xc7, 0x16, 0x83, 0x56, 0xcc, 0xf7, 0xc4, 0x47, 0x72, 0x18,
+    0xaa, 0x8f, 0x27, 0x28, 0xbd, 0x39, 0x41, 0x6f, 0xc3, 0x9e, 0xb2, 0x07, 0x8c, 0xd5, 0xff, 0xdd,
+    0x40, 0x0c, 0x1f, 0x31, 0x37, 0xd6, 0xd4, 0x3a, 0x33, 0xfc, 0xcb, 0xf4, 0x3f, 0xf9, 0xe4, 0xc8,
+    0x4d, 0xc6, 0xb5, 0xe4, 0x25, 0x80, 0x88, 0x9e, 0x22, 0xe8, 0x49, 0xca, 0xd9, 0xf1, 0x10, 0x2f,
+    0x11, 0x53, 0xe4, 0x90, 0x91, 0xa9, 0x05, 0xe1, 0x7e, 0x5b, 0xdf, 0xee, 0x31, 0x7e, 0x7a, 0xf0,
+    0xd7, 0xd9, 0x48, 0x2c, 0x77, 0x1b, 0xe5, 0x97, 0x84, 0x7f, 0x43, 0xef, 0x03, 0xa9, 0x0b, 0x7c,
+    0xaa, 0xb8, 0x55, 0x79, 0xcc, 0x02, 0x24, 0xa6, 0xac, 0xf5, 0x89, 0x25, 0x94, 0x16, 0x58, 0x54,
+    0x52, 0x6d, 0xc5, 0x8f, 0xb6, 0x50, 0x0f, 0xba, 0xf8, 0x18, 0xe7, 0xae, 0xff, 0x06, 0xa6, 0x6a,
+    0x8c, 0x79, 0x2f, 0x13, 0x7b, 0x2b, 0x95, 0x94, 0x31, 0x7d, 0x69, 0x3f, 0x01, 0xce, 0x2c, 0x7b,
+    0x9f, 0xc9, 0xb5, 0x93, 0x10, 0x24, 0xb7, 0x9b, 0xe9, 0xc0, 0xe6, 0x01, 0x5f, 0xec, 0x51, 0xac,
+    0x07, 0xa5, 0x42, 0x05, 0x00, 0x13, 0x77, 0xf3, 0x56, 0x85, 0x14, 0x88, 0x42, 0x0c, 0x3f, 0xa6,
+    0x01, 0xed, 0x16, 0x72, 0xc6, 0x25, 0x26, 0x0c, 0x64, 0x87, 0xfa, 0x7e, 0x19, 0x88, 0xa6, 0xfc,
+    0x0f, 0x87, 0x56, 0x3e, 0x00, 0x3b, 0x7f, 0xa5, 0x04, 0x59, 0xc1, 0x65, 0x2f, 0x08, 0xd4, 0xb4,
+    0x27, 0x9d, 0x51, 0x00, 0x9a, 0x3a, 0x10, 0x71, 0xd3, 0x69, 0x3a, 0xc8, 0xe1, 0xcb, 0x84, 0xa3,
+    0x90, 0x62, 0xe8, 0x1d, 0x50, 0xbc, 0xd7, 0xeb, 0xd3, 0xc6, 0xc9, 0xf6, 0x41, 0xf0, 0xcb, 0xe5,
+    0xa6, 0x15, 0x10, 0x69, 0x39, 0xb2, 0x8c, 0x2d, 0xe6, 0x9a, 0xa9, 0x1e, 0x40, 0xce, 0xc9, 0xe8,
+    0x16, 0xd2, 0x00, 0x3c, 0x46, 0xbd, 0x59, 0x77, 0xb4, 0x15, 0x55, 0x86, 0x46, 0xff, 0x2e, 0x96,
+    0x6e, 0x63, 0xb7, 0x23, 0x47, 0x68, 0xcc, 0xf1, 0x83, 0x2b, 0x77, 0x6d, 0x93, 0x6e, 0xe2, 0x08,
+    0x59, 0x87, 0xae, 0x03, 0xca, 0x6b, 0x81, 0x93, 0x04, 0xe5, 0xad, 0xcf, 0x05, 0x8f, 0x53, 0x4d,
+    0x50, 0xce, 0xe7, 0x7a, 0x17, 0x4f, 0xa3, 0x33, 0xd4, 0x91, 0x55, 0xe4, 0xc6, 0x47, 0x47, 0x12,
+    0x63, 0xb4, 0xee, 0xbb, 0x63, 0x8a, 0x0a, 0x94, 0x3c, 0x12, 0x54, 0x3c, 0x81, 0xee, 0xdd, 0x78,
+    0xe2, 0x38, 0xb1, 0xf7, 0x62, 0x1d, 0x0d, 0x99, 0xb7, 0x5e, 0x98, 0x0e, 0xc4, 0xd9, 0x42, 0x3a,
+    0x88, 0x2e, 0x1b, 0x28, 0xa2, 0xbf, 0x55, 0x97, 0x6c, 0xf1, 0xd8, 0x59, 0x91, 0x38, 0xe6, 0x21,
+    0x81, 0xf8, 0xc4, 0x7d, 0x65, 0x96, 0x7b, 0xc8, 0xf8, 0x9a, 0xdb, 0x63, 0x28, 0x03, 0x2d, 0xca,
+    0x54, 0x86, 0xd8, 0x01, 0xba, 0x61, 0x97, 0x18, 0x9f, 0x40, 0x83, 0xec, 0x72, 0x04, 0xe9, 0x81,
+    0x19, 0xb9, 0x5c, 0xc5, 0x73, 0x4d, 0x43, 0xc2, 0x83, 0x83, 0x13, 0xe3, 0x8a, 0x7e, 0x39, 0x79,
+    0x2c, 0x4d, 0x88, 0x86, 0x13, 0x5c, 0xe5, 0x38, 0x47, 0x96, 0x57, 0x4d, 0xfe, 0x01, 0x0d, 0x5c,
+    0x72, 0xf1, 0xc1, 0x08, 0x4c, 0xd0, 0x8d, 0xb8, 0x5b, 0x63, 0xb7, 0x9a, 0x98, 0xd6, 0x12, 0xe9,
+    0xe4, 0x78, 0xcd, 0xc3, 0x8a, 0x28, 0x49, 0xfb, 0x76, 0x8a, 0x1d, 0x43, 0xd7, 0xb5, 0xac, 0x32,
+    0x06, 0x07, 0xae, 0x76, 0x68, 0x69, 0x94, 0xb2, 0x25, 0x19, 0x44, 0x66, 0x05, 0x51, 0x49, 0xb9,
+    0xd0, 0x7f, 0x40, 0x0e, 0xdf, 0xc1, 0x3b, 0x00, 0x84, 0x6b, 0xa8, 0xdd, 0x69, 0xb4, 0x67, 0x9b,
+    0xcc, 0x1b, 0x10, 0x14, 0x22, 0x1d, 0x18, 0x62, 0xe1, 0x06, 0x43, 0x59, 0x50, 0xd4, 0xe6, 0xd9,
+    0x11, 0xb8, 0x09, 0x35, 0x22, 0x28, 0x6a, 0xd1, 0xbf, 0xab, 0x0f, 0x9b, 0xaa, 0x7a, 0x98, 0xb4,
+    0x2d, 0x31, 0xcb, 0x24, 0x3a, 0x71, 0x89, 0xf9, 0x16, 0xf8, 0x5e, 0xf2, 0xa6, 0x00, 0xa8, 0x78,
+    0xad, 0x7e, 0xf8, 0x7f, 0x1e, 0x74, 0x85, 0x35, 0x44, 0x42, 0xf9, 0xb6, 0x75, 0xc7, 0x29, 0xf8,
+    0x3e, 0xd0, 0xe2, 0x89, 0x8a, 0xb6, 0x7c, 0x99, 0x04, 0xa2, 0x3d, 0x23, 0xdb, 0x12, 0x37, 0x36,
+    0x2e, 0x3d, 0x93, 0xd7, 0x65, 0x2c, 0xdf, 0x57, 0x77, 0x57, 0x1e, 0x05, 0x48, 0x33, 0xe6, 0x8e,
+    0xfe, 0x72, 0xc7, 0xee, 0x6a, 0x1f, 0x29, 0x7d, 0xb7, 0x22, 0x08, 0x44, 0xca, 0x7c, 0x94, 0x2e,
+    0x8a, 0x67, 0x63, 0x37, 0xf0, 0xcb, 0x13, 0xfd, 0xd5, 0xd3, 0x9e, 0x42, 0x08, 0x30, 0xe9, 0xf7,
+    0x0d, 0x1d, 0xe9, 0x4a, 0x2b, 0x98, 0x0a, 0x08, 0x9b, 0x0c, 0x9e, 0x40, 0xae, 0x74, 0x2d, 0x85,
+    0xbb, 0xd7, 0x08, 0x33, 0x12, 0x9a, 0x30, 0xfd, 0x4c, 0x55, 0xca, 0xcd, 0x21, 0x24, 0x31, 0x0b,
+    0x49, 0xa3, 0x6b, 0x3c, 0x6d, 0x4d, 0x6f, 0xaa, 0x5c, 0x86, 0xd3, 0x38, 0x4d, 0xb9, 0x94, 0xf8,
+    0x30, 0x87, 0x46, 0x9a, 0x71, 0x1e, 0x57, 0x34, 0x52, 0xb9, 0x0c, 0xfe, 0x52, 0xc4, 0x40, 0xcc,
+    0xfe, 0x5d, 0x2e, 0xdd, 0xda, 0x02, 0x84, 0x6b, 0xec, 0x81, 0x25, 0x2d, 0xa6, 0x0e, 0x82, 0x47,
+    0xec, 0x3a, 0x35, 0x24, 0x07, 0xc0, 0x30, 0x12, 0x49, 0xc4, 0x64, 0x15, 0x3b, 0xb3, 0x56, 0xfd,
+    0x66, 0xf6, 0x0b, 0xf6, 0x1f, 0xd9, 0xd4, 0x01, 0xa2, 0xb1, 0xcc, 0x7c, 0x9d, 0x95, 0x81, 0x73,
+    0x94, 0x12, 0x5f, 0xd7, 0xde, 0x22, 0xd4, 0x69, 0x09, 0x27, 0xcd, 0xda, 0x13, 0x94, 0x9d, 0xa4,
+    0x6d, 0x76, 0xe9, 0xd0, 0x26, 0x6e, 0xea, 0xa4, 0x9f, 0xde, 0xf1, 0xe6, 0x16, 0x76, 0x90, 0x4c,
+    0x53, 0x94, 0x79, 0x7d, 0x10, 0xfa, 0x1d, 0x7e, 0x61, 0x31, 0x7d, 0x11, 0x8d, 0x8b, 0x8e, 0xa5,
+    0x0a, 0x67, 0x29, 0x86, 0x94, 0xa8, 0xd5, 0xe9, 0x20, 0x3e, 0x26, 0x51, 0x31, 0xff, 0x88, 0x32,
+    0x4f, 0x3d, 0x9c, 0x8b, 0xb1, 0x47, 0xea, 0xe8, 0x10, 0x73, 0x8d, 0x2a, 0x4f, 0x0d, 0x6e, 0x23,
+    0x27, 0xea, 0x6c, 0xff, 0x81, 0xd3, 0x33, 0x42, 0x2f, 0xb0, 0xe3, 0xff, 0xb6, 0x3a, 0x00, 0xbf,
+    0xa7, 0x84, 0x95, 0x94, 0x6a, 0xeb, 0x36, 0x4c, 0x08, 0x17, 0xa2, 0x1e, 0xb4, 0x5a, 0x9b, 0xc0,
+    0xdb, 0xb2, 0x74, 0x0e, 0x10, 0xe7, 0x0e, 0xd3, 0xea, 0x0e, 0xce, 0x7e, 0x49, 0x4f, 0x8d, 0xe2,
+    0xa7, 0xc7, 0x71, 0x1d, 0x4b, 0x50, 0xb2, 0x2e, 0x3f, 0x4a, 0x56, 0xdf, 0xb3, 0xb9, 0x6f, 0x02,
+    0x03, 0xd9, 0x7a, 0x3c, 0x2a, 0x78, 0x0c, 0xec, 0x2d, 0x82, 0x48, 0xad, 0x48, 0xb3, 0x65, 0x8c,
+    0x03, 0x0e, 0x4f, 0x3e, 0xa7, 0x71, 0xdf, 0x30, 0x14, 0xd6, 0x98, 0x83, 0x0d, 0x1d, 0xc7, 0xa9,
+    0x72, 0xb1, 0x1d, 0xd4, 0xd9, 0xfd, 0x39, 0x6e, 0x02, 0xa0, 0x3e, 0x1e, 0x5c, 0x1b, 0x6e, 0x6b,
+    0x60, 0x92, 0xd3, 0x3e, 0x56, 0x79, 0xe4, 0x9e, 0x80, 0xff, 0xd2, 0x24, 0xed, 0x72, 0x0c, 0xd3,
+    0xc9, 0x2b, 0x33, 0x3e, 0x89, 0x4b, 0xc9, 0x4d, 0xd3, 0xcb, 0xe2, 0x57, 0x58, 0xda, 0x90, 0x5f,
+    0x36, 0x13, 0xcb, 0x80, 0x27, 0x92, 0x40, 0xb3, 0x54, 0x4c, 0xe3, 0xb4, 0xb4, 0xb6, 0xb8, 0xa1,
+    0xad, 0xf8, 0xea, 0xb8, 0xab, 0x0c, 0x0e, 0xc8, 0x42, 0x64, 0xed, 0x47, 0x81, 0x64, 0x0f, 0x60,
+    0x90, 0xad, 0x1a, 0xb3, 0x6f, 0xe6, 0x31, 0xf9, 0x3a, 0x0a, 0xb0, 0x13, 0x62, 0x2a, 0xd6, 0xcd,
+    0x72, 0x4a, 0x48, 0x9c, 0x60, 0x10, 0x86, 0x67, 0xc8, 0xe2, 0x65, 0x45, 0x91, 0x9e, 0xda, 0x1d,
+    0x61, 0x63, 0x3d, 0x07, 0xfb, 0x9f, 0xb2, 0x69, 0x93, 0x32, 0x7b, 0x4b, 0x4c, 0x90, 0x9e, 0x98,
+    0x49, 0x1e, 0xf8, 0x6b, 0x09, 0xa7, 0xc0, 0x66, 0x73, 0x8c, 0x4d, 0x1f, 0x93, 0x6f, 0x93, 0xfd,
+    0x20, 0x30, 0xcf, 0xbd, 0x04, 0xfd, 0xd9, 0x02, 0xe0, 0xcd, 0x9f, 0x7c, 0x7f, 0xc6, 0x38, 0xca,
+    0x0d, 0xe4, 0x49, 0x9a, 0x8e, 0x25, 0x9c, 0x8e, 0x28, 0xa6, 0x7d, 0x8c, 0xdf, 0xb6, 0x31, 0x36,
+    0x32, 0x50, 0x65, 0x36, 0xfa, 0x97, 0x76, 0xf6, 0xf2, 0x15, 0x0c, 0xa2, 0xff, 0xe6, 0x87, 0x44,
+    0x1c, 0xaf, 0xbf, 0x7a, 0x12, 0x8c, 0x47, 0x9f, 0xbe, 0x0f, 0xc4, 0xda, 0x6e, 0x77, 0x4d, 0xa5,
+    0xda, 0x34, 0x6f, 0x32, 0xd6, 0x4f, 0xdb, 0x05, 0x50, 0x76, 0xf8, 0x9f, 0x64, 0x4d, 0x06, 0xdc,
+    0x9c, 0xda, 0x61, 0xcd, 0xac, 0x52, 0xe7, 0x41, 0x60, 0x96, 0x34, 0xd6, 0x21, 0xa4, 0x1a, 0xac,
+    0xec, 0x24, 0x8b, 0x0e, 0x96, 0xf1, 0x2b, 0x9b, 0x8e, 0x74, 0xc0, 0x01, 0x14, 0x89, 0x44, 0x7b,
+    0xf9, 0x7f, 0x56, 0xfa, 0x41, 0x1f, 0xc2, 0x75, 0xf0, 0x9b, 0x66, 0x0c, 0x19, 0x10, 0xdb, 0xf8,
+    0xe9, 0xcf, 0x74, 0x7c, 0xbe, 0x33, 0xc6, 0xae, 0x5d, 0xa2, 0xb4, 0xd6, 0x4f, 0x06, 0x24, 0xad,
+    0x4c, 0x0a, 0xe6, 0x22, 0xdb, 0x95, 0x40, 0x73, 0xff, 0xd8, 0x28, 0x0b, 0x12, 0xa2, 0xf9, 0xeb,
+    0x2d, 0x7a, 0xc5, 0x9f, 0xea, 0xa3, 0xa6, 0x1e, 0xfa, 0x1a, 0xa6, 0x85, 0x49, 0xfd, 0x36, 0xf4,
+    0xd6, 0xee, 0x47, 0xbc, 0x5f, 0x5d, 0xc2, 0x62, 0x37, 0x02, 0xe1, 0xa0, 0xf9, 0x7e, 0x9c, 0x2f,
+    0xf1, 0x14, 0x03, 0xd3, 0x1a, 0x8c, 0x11, 0x3f, 0xc7, 0xe2, 0xe7, 0x37, 0x11, 0xb2, 0x5e, 0x95,
+    0x99, 0xa8, 0x9a, 0x91, 0x8a, 0xcc, 0x19, 0xa2, 0xec, 0x0d, 0xbc, 0xe1, 0xb6, 0xda, 0x8f, 0x71,
+    0xaa, 0x0e, 0x59, 0x28, 0xce, 0x4a, 0xf6, 0xad, 0x67, 0x25, 0x5f, 0xf7, 0x6b, 0x32, 0xb8, 0xb5,
+    0x24, 0x77, 0x54, 0x22, 0x41, 0x63, 0x15, 0x9b, 0x32, 0xcd, 0xe9, 0xe6, 0xd6, 0xb9, 0x7f, 0xb5,
+    0x38, 0xfa, 0x50, 0x0b, 0x66, 0x45, 0x1b, 0x11, 0xda, 0xba, 0x45, 0xed, 0x2a, 0x49, 0xe6, 0x8e,
+    0x86, 0x66, 0x89, 0x24, 0x5e, 0x5f, 0xe8, 0x83, 0x05, 0x43, 0xc8, 0xb9, 0x19, 0x74, 0xb7, 0xdb,
+    0x36, 0x4e, 0x2d, 0x25, 0x68, 0xde, 0x5f, 0x85, 0x63, 0xa6, 0x79, 0xc5, 0x89, 0xbd, 0xea, 0xb5,
+    0x3f, 0x7e, 0xf3, 0x41, 0x6a, 0xe1, 0x6a, 0xc3, 0x0c, 0x10, 0x87, 0xca, 0x67, 0x0b, 0x72, 0xf2,
+    0x7b, 0x69, 0xeb, 0x07, 0xb2, 0x79, 0x63, 0xec, 0x95, 0xe4, 0x9c, 0xbe, 0x64, 0x19, 0x5c, 0x93,
+    0x70, 0x19, 0x44, 0xa0, 0xf9, 0xad, 0x04, 0x17, 0x52, 0xaa, 0x0a, 0xa9, 0x53, 0x76, 0xe4, 0x1c,
+    0xf3, 0x7a, 0x7f, 0x4e, 0x46, 0xd2, 0x17, 0x03, 0x5d, 0x4d, 0x62, 0x81, 0x33, 0x01, 0x7c, 0x45,
+    0xe0, 0x9e, 0xdf, 0x91, 0xe4, 0x7c, 0x2c, 0x22, 0x1f, 0xa3, 0xfd, 0x9e, 0xd6, 0x71, 0x1c, 0x09,
+    0x73, 0xb8, 0x01, 0x98, 0x03, 0x2a, 0xe1, 0xbf, 0x44, 0x80, 0xaa, 0x4e, 0x81, 0xbe, 0x17, 0xf7,
+    0x93, 0xdb, 0xd7, 0x80, 0x68, 0x7a, 0x81, 0xa8, 0x8a, 0xb6, 0xcb, 0xdf, 0x40, 0x97, 0x07, 0x75,
+    0xa7, 0xa6, 0xe7, 0x2b, 0x2d, 0xe1, 0x0f, 0x09, 0x19, 0x3f, 0x08, 0xc7, 0x7e, 0x86, 0xfe, 0x16,
+    0x45, 0x54, 0xc8, 0x11, 0xc8, 0x0d, 0x24, 0xac, 0xd7, 0xe5, 0x2f, 0x86, 0x71, 0x93, 0x69, 0x47,
+    0xa4, 0xd2, 0x85, 0xa2, 0x5a, 0x52, 0x4d, 0x60, 0x14, 0xf7, 0xd8, 0xcf, 0x39, 0x8e, 0x9e, 0x52,
+    0x2b, 0x5d, 0x35, 0xb2, 0x53, 0x80, 0x4f, 0xf4, 0xf0, 0x6b, 0x55, 0x10, 0x83, 0x4a, 0x85, 0xc8,
+    0x0a, 0x5e, 0x25, 0x30, 0x94, 0xc0, 0x24, 0x18, 0x76, 0x82, 0x99, 0xf9, 0x66, 0xa9, 0xca, 0xde,
+    0xa2, 0x3c, 0x59, 0x28, 0x47, 0x1e, 0x4d, 0x1f, 0x74, 0xdc, 0xa2, 0x3f, 0x49, 0xdd, 0xea, 0x39,
+    0xde, 0xbe, 0x57, 0x77, 0xb1, 0x8a, 0x98, 0xe1, 0x17, 0x00, 0x63, 0x3b, 0x7a, 0xf2, 0x8f, 0x57,
+    0x24, 0xee, 0xac, 0x9a, 0x91, 0xd2, 0x19, 0xab, 0x58, 0x29, 0xda, 0x1d, 0x9c, 0x34, 0xe6, 0x08,
+    0x28, 0x59, 0x43, 0x7d, 0x67, 0xb9, 0x6c, 0xc7, 0x9e, 0x6b, 0x3e, 0xc2, 0x44, 0x7e, 0xa9, 0xbb,
+    0x86, 0xcd, 0x12, 0x3b, 0x63, 0xa0, 0x8f, 0x48, 0xd1, 0x03, 0x22, 0x01, 0x90, 0x1a, 0x6f, 0xe2,
+    0x67, 0xbf, 0x07, 0x8c, 0xca, 0x00, 0x77, 0x2d, 0x00, 0x0b, 0xc0, 0x4a, 0xde, 0x64, 0xfd, 0x86,
+    0xbe, 0xbb, 0xfd, 0x29, 0xa2, 0x04, 0x94, 0x5d, 0x85, 0x94, 0x05, 0x5d, 0x73, 0x96, 0xf8, 0x71,
+    0xd6, 0x17, 0x9d, 0xf0, 0xde, 0x45, 0xc5, 0x4d, 0xfa, 0xf4, 0xa6, 0x31, 0x63, 0x87, 0xc4, 0x34,
+    0x1c, 0x7f, 0x4c, 0x94, 0xea, 0x23, 0x2e, 0xbd, 0x24, 0x79, 0x12, 0xea, 0xf3, 0x03, 0xac, 0xd4,
+    0xb5, 0x81, 0x5b, 0xb8, 0x5c, 0x25, 0x54, 0x12, 0xba, 0xff, 0xe6, 0x75, 0xe7, 0xb8, 0xdd, 0x4e,
+    0x32, 0x2b, 0xb5, 0xed, 0x2a, 0xd1, 0xe3, 0xa5, 0xe8, 0xac, 0xb8, 0x63, 0xf3, 0x5b, 0x3e, 0x0a,
+    0xec, 0x6f, 0x10, 0x63, 0x69, 0x3d, 0xb1, 0xf6, 0xc6, 0x78, 0xa7, 0x41, 0x81, 0x67, 0x12, 0x80,
+    0x4f, 0xd4, 0x00, 0xfd, 0xa4, 0x71, 0x8d, 0xcd, 0xe5, 0x0c, 0xed, 0xe7, 0x96, 0xf7, 0x98, 0x57,
+    0xba, 0x27, 0x3e, 0xae, 0x63, 0xdc, 0x8a, 0x68, 0x28, 0xe9, 0x73, 0x9d, 0x0b, 0x9f, 0x9b, 0x76,
+    0x7f, 0xcb, 0x9a, 0xaa, 0x1b, 0xf9, 0x4d, 0x16, 0xc2, 0x04, 0x60, 0x5c, 0x15, 0x15, 0x48, 0x3a,
+    0x8a, 0x1a, 0x78, 0xea, 0xb7, 0x72, 0x76, 0x64, 0x7f, 0x63, 0x48, 0xbd, 0xba, 0x19, 0x43, 0x83,
+    0x8d, 0x8d, 0x21, 0x14, 0x9c, 0x6f, 0x8b, 0x37, 0xa3, 0x8b, 0x8c, 0x5d, 0x06, 0x2d, 0xf5, 0x8f,
+    0xef, 0x91, 0x8c, 0x5f, 0x40, 0x3d, 0x12, 0x6a, 0xee, 0xfe, 0xeb, 0xc9, 0xe8, 0xe3, 0xc9, 0x87,
+    0x4d, 0x2b, 0x0c, 0x79, 0xeb, 0x2d, 0x29, 0xfa, 0xe3, 0x3b, 0x7b, 0xbc, 0x15, 0xc8, 0xac, 0xcc,
+    0x76, 0x7f, 0x61, 0x36, 0xa9, 0xb6, 0x7d, 0xc2, 0x2c, 0x02, 0xd4, 0x7c, 0x54, 0x98, 0x33, 0x61,
+    0x5a, 0x51, 0xd4, 0x50, 0xb2, 0xfb, 0x9a, 0xae, 0x28, 0xee, 0x5d, 0x6c, 0x21, 0x56, 0x52, 0x65,
+    0x68, 0x50, 0x71, 0x8e, 0x52, 0x15, 0xfc, 0x8c, 0x7c, 0x37, 0x70, 0x5f, 0xa4, 0xf0, 0xb8, 0x5d,
+    0xd9, 0x99, 0x38, 0xb6, 0xe3, 0x00, 0x24, 0xae, 0xec, 0x39, 0x40, 0x39, 0xde, 0x58, 0x1a, 0x6e,
+    0x5b, 0xb8, 0x30, 0x59, 0xaf, 0x05, 0x0a, 0xc8, 0x3d, 0x16, 0xd7, 0xea, 0x57, 0xcd, 0xba, 0x7d,
+    0x2b, 0x2f, 0x5a, 0x67, 0x70, 0xe3, 0x07, 0x87, 0x4c, 0x65, 0x74, 0x26, 0xd8, 0xcf, 0x6c, 0xac,
+    0x7e, 0xfc, 0x2e, 0xe2, 0x76, 0xaf, 0x5f, 0x2b, 0x31, 0x6d, 0x93, 0xa9, 0x73, 0x9b, 0x12, 0xfb,
+    0xab, 0xf9, 0xbb, 0x6c, 0x00, 0x3d, 0xed, 0x55, 0xfd, 0x03, 0x80, 0x6d, 0xb4, 0xee, 0xc8, 0xc0,
+    0x4e, 0xb8, 0x85, 0xed, 0xde, 0x2d, 0xfa, 0x70, 0x4a, 0x47, 0x19, 0x37, 0x77, 0x96, 0x4f, 0x19,
+    0xb2, 0xd9, 0xe2, 0xd6, 0xb9, 0xf2, 0xe7, 0x90, 0xf2, 0xb7, 0xfb, 0x59, 0x05, 0x13, 0x12, 0x4e,
+    0x57, 0x5c, 0x94, 0xd4, 0x33, 0x17, 0xdb, 0x6b, 0xf3, 0x17, 0x79, 0xbe, 0xeb, 0x0f, 0x74, 0x0c,
+    0x04, 0x7d, 0x2e, 0x2b, 0x2e, 0x33, 0x07, 0xcf, 0xe7, 0x3c, 0x37, 0x3e, 0xe5, 0x52, 0x8d, 0x9b,
+    0x4a, 0xc5, 0x4b, 0x1e, 0xdd, 0x31, 0x01, 0x47, 0xc0, 0x8d, 0x5d, 0x70, 0xfa, 0x7d, 0xfc, 0x4e,
+    0x2b, 0x94, 0x7f, 0x97, 0x69, 0xad, 0xce, 0xad, 0x51, 0x3e, 0xca, 0x2a, 0x6e, 0x72, 0x46, 0xa5,
+    0x01, 0xa0, 0xac, 0x4f, 0x1d, 0x65, 0xd6, 0x86, 0x1e, 0xe9, 0x9d, 0xec, 0xed, 0x66, 0x02, 0x96,
+    0x4f, 0x0b, 0xea, 0xd0, 0x28, 0x7f, 0x58, 0xd5, 0x27, 0x8d, 0x5e, 0x85, 0x73, 0x33, 0xfd, 0xf5,
+    0x25, 0x0f, 0x28, 0x11, 0x76, 0x09, 0x46, 0x57, 0x80, 0x64, 0xe2, 0x8a, 0xbd, 0xa1, 0xdd, 0xf3,
+    0x65, 0x14, 0x7a, 0xc2, 0xfe, 0xde, 0xdc, 0x21, 0xa9, 0x93, 0xe8, 0xa5, 0x33, 0x62, 0x68, 0xeb,
+    0x77, 0x3a, 0xba, 0xe6, 0x40, 0x8c, 0x22, 0xc3, 0xc2, 0x3f, 0x80, 0x5f, 0x0b, 0xbb, 0xac, 0x37,
+    0x27, 0x3b, 0xab, 0xca, 0xf8, 0x24, 0x5d, 0x35, 0x8b, 0x72, 0x45, 0xd0, 0xff, 0x1f, 0x6a, 0x16,
+    0xd8, 0xc8, 0x54, 0x5f, 0x13, 0x3d, 0xe7, 0x31, 0xa0, 0xdd, 0xc6, 0xf7, 0x66, 0xdf, 0x1e, 0xbd,
+    0x34, 0x6c, 0x57, 0x59, 0x99, 0x45, 0x65, 0xc6, 0xa0, 0x62, 0x80, 0x77, 0x91, 0x49, 0xce, 0xa0,
+    0x76, 0x6b, 0x11, 0xd8, 0x97, 0xca, 0xd3, 0x62, 0x2e, 0x55, 0xfd, 0xfe, 0xff, 0x83, 0x26, 0x1b,
+    0x7c, 0x71, 0x1b, 0xab, 0xd1, 0xb6, 0x9c, 0x34, 0x37, 0xf2, 0xb2, 0xf0, 0x08, 0x8c, 0x12, 0x79,
+    0x48, 0x66, 0x17, 0x42, 0xc1, 0x8d, 0x8d, 0x79, 0xd1, 0x9f, 0xc3, 0xee, 0xb0, 0xab, 0x9b, 0x0e,
+    0x55, 0x3e, 0xd4, 0x2d, 0xf7, 0x54, 0x41, 0x28, 0x27, 0x39, 0x87, 0xf5, 0xe6, 0xb4, 0x7e, 0x25,
+    0xd4, 0x71, 0x85, 0x67, 0xeb, 0xf4, 0x39, 0xbe, 0xb0, 0xfd, 0x41, 0xb6, 0x5f, 0xd7, 0x68, 0x85,
+    0x30, 0xa4, 0xe2, 0x42, 0x96, 0x7e, 0xec, 0xbb, 0x16, 0x0f, 0xd8, 0x41, 0xe3, 0x7d, 0x0b, 0x87,
+    0x39, 0x3d, 0xe4, 0x7c, 0x7f, 0xa3, 0x0d, 0xd1, 0xe5, 0x91, 0x26, 0x65, 0x8b, 0x4a, 0xdf, 0x06,
+    0xf9, 0x34, 0x66, 0xbe, 0x4c, 0x9c, 0x0c, 0xb3, 0x4c, 0xe2, 0xf0, 0x0b, 0x98, 0x0e, 0xf6, 0xc7,
+    0x8b, 0x28, 0x45, 0x7f, 0x9a, 0xb1, 0x4d, 0x9b, 0x42, 0xec, 0x6e, 0x8e, 0xe8, 0xca, 0x66, 0x84,
+    0x4d, 0x7a, 0x67, 0xcb, 0xda, 0xd6, 0x85, 0xe3, 0xdb, 0xbe, 0xc0, 0x5b, 0x7b, 0x52, 0xd1, 0x69,
+    0xa1, 0xd1, 0xf1, 0x98, 0x4d, 0xf8, 0x99, 0xd5, 0xf0, 0x09, 0x43, 0x1f, 0x46, 0xec, 0x1c, 0xa0,
+    0x7e, 0x87, 0x72, 0xd7, 0xa3, 0x23, 0xa8, 0xc2, 0x32, 0x8c, 0xf2, 0x9a, 0xc2, 0xc9, 0x51, 0xc4,
+    0xc3, 0x37, 0xf6, 0x3f, 0xeb, 0x25, 0x04, 0x0b, 0xaf, 0x9c, 0xbf, 0xbe, 0x0b, 0x5d, 0x02, 0x54,
+    0x69, 0x9a, 0xa3, 0xe0, 0xa7, 0x6e, 0xd3, 0x55, 0x13, 0x1e, 0x91, 0xc5, 0x19, 0x15, 0xba, 0xb9,
+    0x85, 0x55, 0x39, 0xc7, 0x01, 0xed, 0x69, 0x36, 0xd6, 0x82, 0xe6, 0x10, 0x45, 0xc3, 0xe7, 0x36,
+    0xe4, 0x0c, 0x67, 0x2d, 0xd7, 0x73, 0x91, 0xa1, 0xca, 0xfb, 0xb3, 0x51, 0xff, 0x55, 0x5e, 0xe2,
+    0x71, 0x31, 0x59, 0x9d, 0x04, 0x66, 0x14, 0xcc, 0xd2, 0x74, 0xa8, 0x7d, 0xb7, 0xdc, 0x6c, 0x5a,
+    0x3f, 0x85, 0x53, 0xf2, 0x45, 0x3d, 0x85, 0xb9, 0xfb, 0x37, 0x8d, 0xfc, 0x6d, 0x85, 0x44, 0x3d,
+    0xcb, 0xcd, 0x20, 0x15, 0x8d, 0x42, 0x57, 0xc1, 0x07, 0x3c, 0x85, 0x21, 0x02, 0x0c, 0xa5, 0xfc,
+    0xb3, 0x32, 0x82, 0x22, 0x70, 0x7a, 0x4b, 0x34, 0xda, 0x1e, 0x7c, 0xd5, 0xa9, 0xa2, 0xe4, 0x27,
+    0x16, 0xa6, 0x39, 0x33, 0x57, 0x9d, 0x1a, 0x2b, 0xe7, 0x9e, 0x2c, 0x14, 0xb4, 0x0f, 0xa5, 0x3c,
+    0x21, 0x82, 0xa8, 0x55, 0x43, 0xf7, 0xed, 0x86, 0x4d, 0x36, 0x66, 0x78, 0xb1, 0x8e, 0x40, 0xdf,
+    0xcf, 0x25, 0x1d, 0x37, 0x77, 0x9c, 0x91, 0xe1, 0xf4, 0xd3, 0x02, 0x64, 0x33, 0xb1, 0x03, 0xd0,
+    0xfc, 0xac, 0x93, 0x12, 0x58, 0x47, 0xd7, 0x5c, 0x92, 0x59, 0x82, 0xff, 0x76, 0x7f, 0x12, 0xe6,
+    0x65, 0xed, 0x77, 0x20, 0x5d, 0x0b, 0x83, 0x6f, 0x78, 0x71, 0xc9, 0x00, 0x18, 0xea, 0x1e, 0x23,
+    0x76, 0x86, 0x1c, 0x02, 0xd5, 0x9d, 0x70, 0xf8, 0x7c, 0x65, 0x67, 0xb0, 0xb2, 0xab, 0xee, 0x47,
+    0x50, 0xda, 0xb2, 0x75, 0x8c, 0xd3, 0x8e, 0xe0, 0x31, 0x13, 0x21, 0xa7, 0x29, 0xdf, 0x76, 0xd8,
+    0xa4, 0x6d, 0x9e, 0x3d, 0x06, 0xf8, 0x2b, 0x2a, 0xde, 0x78, 0xcf, 0xde, 0x9c, 0x8b, 0x63, 0xe1,
+    0xd7, 0x59, 0x5a, 0x34, 0x75, 0x62, 0x2f, 0xc1, 0x26, 0x78, 0x35, 0xbb, 0x0a, 0x2e, 0x98, 0xd4,
+    0x70, 0xdf, 0x56, 0x79, 0x5a, 0x8b, 0x33, 0xff, 0xd7, 0x13, 0xc4, 0xb7, 0x38, 0xe6, 0xca, 0x2c,
+    0x9e, 0x96, 0x06, 0xf2, 0xa0, 0x0f, 0xb5, 0xb8, 0xf6, 0xbb, 0x7c, 0x30, 0x3d, 0xf8, 0x17, 0xc0,
+    0xe6, 0x1b, 0xea, 0xfb, 0x52, 0x25, 0x24, 0x60, 0xb4, 0x01, 0x0e, 0x84, 0xa2, 0xc2, 0xf9, 0x32,
+    0x17, 0x18, 0x58, 0xc1, 0xb7, 0xfd, 0x1e, 0xa6, 0xb6, 0x94, 0x9d, 0x70, 0xbd, 0x95, 0x6a, 0x75,
+    0x2c, 0x09, 0xd1, 0x12, 0x83, 0x6b, 0x17, 0x23, 0x5d, 0xef, 0x87, 0x63, 0xe9, 0x42, 0xe0, 0xc3,
+    0xef, 0x5a, 0xc8, 0xe0, 0x2c, 0x76, 0x71, 0xc4, 0x99, 0x46, 0x12, 0x03, 0x14, 0x33, 0xe6, 0x86,
+    0x10, 0xaa, 0x4f, 0x4b, 0x02, 0x5f, 0xbb, 0xf3, 0x9c, 0xfc, 0xba, 0x65, 0x39, 0xe6, 0x3b, 0xc1,
+    0xb3, 0x6a, 0x77, 0x6d, 0x02, 0x3f, 0xa5, 0xbc, 0x5b, 0xf5, 0x34, 0x73, 0x28, 0x96, 0xcf, 0x1a,
+    0x56, 0x9a, 0x89, 0x43, 0x5a, 0xd4, 0x49, 0x82, 0x93, 0xaf, 0x92, 0x3e, 0x47, 0xd4, 0x6c, 0x6f,
+    0x18, 0xe7, 0x39, 0x69, 0x71, 0x46, 0xff, 0xe2, 0xef, 0x0d, 0xf3, 0x5f, 0x83, 0xa1, 0x99, 0x1b,
+    0xaf, 0x2f, 0xd0, 0x98, 0x3f, 0x72, 0xd0, 0x96, 0xd1, 0x36, 0xc2, 0x5c, 0xc2, 0x71, 0xf8, 0xc5,
+    0x5d, 0x8c, 0x54, 0xc9, 0x3b, 0x5d, 0x9d, 0x94, 0x90, 0xf8, 0x89, 0x09, 0x4b, 0x37, 0xa3, 0x77,
+    0x66, 0x85, 0xc2, 0x05, 0x6d, 0x46, 0x8a, 0x84, 0x04, 0x40, 0x26, 0xe7, 0xaa, 0x33, 0x41, 0xd9,
+    0xeb, 0x4e, 0xf5, 0x39, 0x65, 0xb4, 0x73, 0x89, 0x17, 0x49, 0x22, 0x0e, 0x7c, 0xa9, 0xd6, 0x79,
+    0xe9, 0xf2, 0xc7, 0xfe, 0x30, 0x37, 0xbd, 0x3a, 0x87, 0xfe, 0xb7, 0x30, 0xe3, 0x1b, 0xf3, 0xe2,
+    0x7f, 0x10, 0xa9, 0x13, 0x7a, 0x06, 0xa3, 0xb1, 0x23, 0x06, 0xe3, 0xab, 0x63, 0x97, 0x98, 0xfa,
+    0xe8, 0xeb, 0xd4, 0xe5, 0xae, 0x1e, 0x27, 0xe9, 0x5f, 0xa5, 0xbd, 0x04, 0x15, 0x29, 0x40, 0xeb,
+    0x94, 0x9d, 0x71, 0x40, 0x71, 0x01, 0x0c, 0x3d, 0x96, 0xc8, 0x60, 0x9b, 0x4d, 0x97, 0xdf, 0xe5,
+    0x37, 0xd2, 0x74, 0xaa, 0x45, 0xf8, 0x98, 0x5c, 0xd6, 0xee, 0xbb, 0xd7, 0xab, 0xe2, 0x80, 0x9a,
+    0x99, 0x67, 0xb7, 0x8d, 0x46, 0x9a, 0x6a, 0x77, 0x8b, 0xbc, 0x69, 0xe7, 0xc1, 0xc8, 0x8c, 0x26,
+    0x42, 0xdb, 0x42, 0x11, 0x43, 0x90, 0xf4, 0x48, 0x3a, 0x35, 0xdb, 0x04, 0xe1, 0x6b, 0x62, 0x47,
+    0x10, 0x2a, 0x40, 0xd8, 0xe5, 0xf9, 0x3f, 0xe0, 0x92, 0xe8, 0x2f, 0x75, 0x6e, 0x4b, 0x30, 0xb5,
+    0x1c, 0x97, 0x99, 0x17, 0x59, 0xb5, 0x8b, 0xc5, 0xa1, 0x42, 0x4e, 0xe0, 0xe4, 0x9c, 0x69, 0x98,
+    0xbb, 0x75, 0x76, 0x70, 0xeb, 0x36, 0xde, 0xe4, 0xa4, 0xd4, 0xad, 0x77, 0x2e, 0xb2, 0xa7, 0xaf,
+    0x0a, 0xe3, 0x7d, 0x22, 0x13, 0xf1, 0xe2, 0xc7, 0x03, 0xe6, 0x1c, 0x6d, 0x41, 0x00, 0x5e, 0x4b,
+    0xa8, 0x2e, 0xf7, 0x9b, 0x88, 0x61, 0x7e, 0x46, 0x75, 0xa3, 0x6b, 0xed, 0x2b, 0x21, 0xb8, 0x90,
+    0xd8, 0xc0, 0xad, 0x38, 0xea, 0xf9, 0x7f, 0xfa, 0x6f, 0x2e, 0x41, 0x31, 0xb1, 0x3c, 0x97, 0x3f,
+    0x09, 0x70, 0xc3, 0xe8, 0xcf, 0xed, 0xf4, 0x1f, 0x02, 0x77, 0x1a, 0x5d, 0x75, 0x0b, 0xd8, 0x7a,
+    0x18, 0x5b, 0x30, 0x5f, 0x2c, 0x52, 0xc7, 0x4c, 0x89, 0x1c, 0x2f, 0x72, 0x61, 0x5b, 0xad, 0xb2,
+    0xdf, 0x72, 0xe8, 0xd1, 0xdd, 0x12, 0x1f, 0xdb, 0x07, 0x07, 0x52, 0xfc, 0x55, 0xcb, 0x5c, 0xc2,
+    0x19, 0x47, 0xe6, 0x66, 0x13, 0x03, 0x31, 0x21, 0x53, 0x00, 0xc3, 0xcd, 0xeb, 0xc1, 0xc2, 0x2e,
+    0xa1, 0x38, 0x27, 0xe7, 0x76, 0xe8, 0xed, 0x71, 0x69, 0xac, 0x50, 0xee, 0xe1, 0xd8, 0x51, 0x42,
+    0xd2, 0x96, 0xb2, 0x55, 0xe1, 0x3d, 0xd4, 0x57, 0x1d, 0xc6, 0x18, 0x97, 0x9a, 0x31, 0x3f, 0x00,
+    0x0b, 0x91, 0x85, 0xfd, 0x7c, 0x97, 0xa3, 0x16, 0x77, 0x23, 0x66, 0xec, 0x57, 0x34, 0x7e, 0x66,
+    0xaa, 0xac, 0x41, 0x1d, 0x26, 0x21, 0xac, 0xbf, 0x9e, 0xe9, 0x59, 0x01, 0x88, 0x8a, 0x9a, 0x50,
+    0x70, 0x82, 0x0f, 0x95, 0xcb, 0xe3, 0xad, 0xf0, 0xef, 0x67, 0x9b, 0xf9, 0xa9, 0x0a, 0x36, 0xae,
+    0x81, 0xe0, 0x39, 0x3a, 0xc3, 0x98, 0xd3, 0x81, 0xe0, 0x9e, 0xc6, 0x26, 0x19, 0x0c, 0x19, 0x80,
+    0x21, 0xd4, 0x85, 0xf1, 0x42, 0x5f, 0xc7, 0xef, 0xe4, 0x78, 0x04, 0x07, 0xc2, 0x07, 0xfd, 0x41,
+    0xd4, 0x32, 0xcc, 0xdb, 0x0c, 0xb5, 0xb8, 0x72, 0x8c, 0xde, 0x90, 0xa0, 0xda, 0xe4, 0x72, 0xc9,
+    0x80, 0x87, 0x58, 0x16, 0x34, 0xd4, 0x16, 0xf2, 0x2e, 0x9f, 0x44, 0xb1, 0x92, 0x2e, 0xe8, 0x22,
+    0x14, 0x02, 0xe2, 0x5f, 0x55, 0x74, 0xca, 0xed, 0xc3, 0x97, 0xb7, 0xfc, 0x97, 0xc2, 0x34, 0x7f,
+    0x18, 0xb8, 0x43, 0x8d, 0xb9, 0x88, 0x37, 0x9a, 0x1e, 0xbe, 0xff, 0xa2, 0x9a, 0x8c, 0x69, 0x7c,
+    0x63, 0xf6, 0x51, 0x25, 0xde, 0x14, 0x66, 0x7c, 0xb8, 0x40, 0x65, 0x1c, 0x21, 0x24, 0xf0, 0x93,
+    0x19, 0xa6, 0x85, 0xd8, 0x4d, 0x38, 0x15, 0xa4, 0x90, 0x54, 0x52, 0xe9, 0xd4, 0xf2, 0xdf, 0xa5,
+    0xc1, 0x5e, 0xc9, 0xdb, 0xa6, 0x22, 0x0f, 0x70, 0x83, 0xf7, 0x17, 0x55, 0x26, 0xb0, 0x89, 0x5e,
+    0x75, 0xf7, 0x99, 0xe7, 0x60, 0x28, 0xaa, 0xd4, 0x3a, 0x6a, 0x00, 0x40, 0x26, 0x1f, 0x0a, 0xc2,
+    0x7c, 0x0f, 0x68, 0xeb, 0xf0, 0xa0, 0xde, 0x8b, 0xbc, 0x68, 0x7b, 0xdb, 0xc6, 0x96, 0xa3, 0xe1,
+    0xfe, 0x80, 0xc5, 0x1d, 0x96, 0x99, 0xbc, 0x1e, 0x70, 0xbd, 0x27, 0xfb, 0xb3, 0x9e, 0x54, 0xda,
+    0xab, 0x9f, 0x2d, 0x2c, 0x0e, 0x11, 0x4f, 0xcf, 0x55, 0x11, 0x5e, 0xb6, 0x01, 0xa5, 0x94, 0xd5,
+    0x94, 0x0c, 0xbd, 0x94, 0x43, 0x84, 0x67, 0xfa, 0x27, 0x7d, 0x40, 0x36, 0x70, 0xba, 0x8b, 0xb2,
+    0xa0, 0xc1, 0xff, 0x64, 0x06, 0xd6, 0xc8, 0xbd, 0x89, 0x0b, 0xfa, 0x6f, 0x7e, 0x5b, 0xc5, 0x2e,
+    0x3f, 0xdc, 0x96, 0x29, 0xdc, 0xa4, 0x97, 0x73, 0x95, 0x76, 0x05, 0x6e, 0x0a, 0xcb, 0x04, 0x2a,
+    0xca, 0x2a, 0xae, 0xc1, 0x0a, 0x52, 0x06, 0x70, 0xa8, 0x69, 0x66, 0x3e, 0xab, 0xa0, 0xfa, 0x47,
+    0x1b, 0xad, 0x4f, 0xd2, 0x63, 0x1c, 0xa4, 0x60, 0xba, 0x19, 0x8a, 0xfe, 0x3e, 0xf5, 0x3a, 0xc4,
+    0xa0, 0x9f, 0x84, 0x71, 0x25, 0xf9, 0x53, 0x17, 0xbc, 0x26, 0x51, 0x4d, 0xd2, 0x49, 0x5d, 0xf6,
+    0x3d, 0x7f, 0x1e, 0xab, 0x9e, 0xb2, 0x2c, 0x89, 0xb2, 0x00, 0xfa, 0xd6, 0x29, 0x68, 0x00, 0xee,
+    0x17, 0x49, 0xc2, 0xf9, 0xd2, 0xfe, 0x4e, 0xda, 0x86, 0xcd, 0x04, 0x4a, 0x81, 0x1c, 0x16, 0x14,
+    0xa4, 0x19, 0x1c, 0xd6, 0x9f, 0xa1, 0x31, 0x2d, 0x3c, 0x80, 0x51, 0xf5, 0xf4, 0x71, 0xa1, 0xb0,
+    0x9b, 0x9b, 0x07, 0x48, 0x87, 0x32, 0xbd, 0x15, 0x5b, 0x84, 0x84, 0x10, 0x89, 0xbb, 0xb1, 0x24,
+    0x62, 0x2d, 0xaf, 0x29, 0xd7, 0xbb, 0x88, 0x30, 0x09, 0xc8, 0x55, 0x17, 0x2d, 0xd1, 0xf4, 0x96,
+    0xa7, 0x7b, 0x7d, 0x44, 0x6c, 0x54, 0xc4, 0xfc, 0x1c, 0x21, 0xd0, 0x3d, 0xc7, 0x76, 0x16, 0x03,
+    0x17, 0x5d, 0x99, 0x03, 0x37, 0x32, 0x68, 0x30, 0x88, 0x62, 0xc1, 0xf6, 0x54, 0xf8, 0x73, 0x4a,
+    0x2a, 0x69, 0x6c, 0x29, 0x0e, 0x2b, 0xf3, 0x6c, 0x34, 0x0b, 0xf9, 0x50, 0xd1, 0xf2, 0x29, 0xa0,
+    0x55, 0x78, 0xc9, 0x33, 0xe1, 0x2e, 0xca, 0xcc, 0xd0, 0xfe, 0xbc, 0xa6, 0xa5, 0x9a, 0xc5, 0x82,
+    0xce, 0x5c, 0xf3, 0x09, 0x2a, 0xef, 0xfe, 0xfb, 0xab, 0x61, 0x5a, 0xb6, 0xb2, 0x28, 0x1a, 0x63,
+    0x64, 0x53, 0x09, 0xd2, 0xd8, 0xa7, 0xde, 0x01, 0x13, 0xd6, 0x43, 0x79, 0x92, 0x41, 0x9e, 0x4a,
+    0x60, 0x12, 0x8d, 0xd1, 0x1d, 0x70, 0x32, 0xa5, 0x9c, 0x4b, 0x3c, 0xa5, 0x5a, 0x7f, 0x9e, 0x14,
+    0x4a, 0xf6, 0xb6, 0x91, 0x1a, 0xf6, 0xfd, 0x53, 0x82, 0xbb, 0x02, 0x07, 0x2d, 0x9a, 0x6c, 0x62,
+    0x98, 0x99, 0x68, 0x27, 0x16, 0x78, 0xb0, 0xf4, 0x9b, 0xc1, 0xea, 0x41, 0xa3, 0x76, 0x85, 0x3f,
+    0x23, 0xb3, 0x35, 0x98, 0x98, 0x5e, 0x40, 0xa9, 0x8f, 0xa5, 0x08, 0x90, 0xaf, 0xf7, 0xaa, 0xbb,
+    0xa9, 0x7e, 0x84, 0xf3, 0xdc, 0x3c, 0xcd, 0x16, 0x6c, 0x02, 0x88, 0xef, 0x17, 0x20, 0xa4, 0xed,
+    0xf5, 0xeb, 0xd5, 0xab, 0x75, 0xde, 0x47, 0xae, 0x21, 0x74, 0xed, 0x25, 0xb6, 0x1a, 0xb0, 0x7d,
+    0x99, 0x04, 0xdf, 0x96, 0x84, 0x27, 0x27, 0x46, 0x5f, 0x43, 0xa4, 0xd3, 0x0d, 0xe5, 0x88, 0xdb,
+    0x43, 0xda, 0x97, 0xb3, 0x2e, 0xec, 0x4e, 0xc5, 0x7b, 0x89, 0x11, 0x82, 0x11, 0xe9, 0xfd, 0xe7,
+    0x25, 0xa4, 0x24, 0x40, 0xa5, 0x03, 0x61, 0x94, 0x49, 0x51, 0xfc, 0xc7, 0x08, 0xb7, 0xea, 0x66,
+    0x91, 0xde, 0x2c, 0x44, 0x94, 0x20, 0x66, 0xc6, 0xec, 0x87, 0x81, 0x85, 0x44, 0xb2, 0x5f, 0x57,
+    0xe2, 0x16, 0x23, 0x13, 0x99, 0x5d, 0x0b, 0x9a, 0x1a, 0xeb, 0x9b, 0xac, 0x69, 0x7a, 0x0e, 0x1c,
+    0x0a, 0x94, 0xa5, 0xbd, 0x47, 0x9a, 0xa4, 0x08, 0xfc, 0xda, 0xd9, 0x04, 0x34, 0xbd, 0x8b, 0x5f,
+    0x58, 0x2c, 0xf6, 0xee, 0xc0, 0x62, 0x8b, 0xdf, 0xc4, 0xb8, 0x6a, 0xb8, 0xcf, 0x2d, 0x1b, 0xa5,
+    0x58, 0x1b, 0x35, 0x82, 0xf0, 0x58, 0x7a, 0x0e, 0xb4, 0x0f, 0xc7, 0x9a, 0x22, 0x04, 0xf7, 0xdd,
+    0x19, 0x56, 0xf2, 0xcc, 0xf9, 0x74, 0x4e, 0xea, 0xfc, 0x53, 0x11, 0x20, 0x5f, 0x88, 0xc8, 0x5d,
+    0x21, 0xa3, 0xc7, 0x1e, 0x74, 0x04, 0xab, 0x12, 0xfe, 0x5e, 0x3a, 0x6d, 0x88, 0x31, 0x5f, 0xe4,
+    0xba, 0xb5, 0x37, 0x4f, 0x68, 0xe1, 0x8b, 0x87, 0x5d, 0xf3, 0xb1, 0x6c, 0x18, 0xf9, 0x95, 0x45,
+    0x01, 0x2c, 0x09, 0x09, 0xa9, 0x7d, 0x98, 0x80, 0x4b, 0x4e, 0xe5, 0x64, 0xd9, 0x51, 0xe0, 0x70,
+    0x16, 0xc7, 0x07, 0xe2, 0x66, 0xad, 0x00, 0x76, 0x89, 0x62, 0x3c, 0x30, 0x94, 0xe1, 0x49, 0x64,
+    0xf8, 0x89, 0xc0, 0x2a, 0xf8, 0x07, 0x1b, 0x02, 0xc8, 0x34, 0x47, 0x6a, 0xec, 0xa2, 0x44, 0x54,
+    0xfa, 0x47, 0x01, 0xae, 0x16, 0x33, 0x24, 0x74, 0xfc, 0x05, 0xb4, 0xcb, 0x21, 0xbf, 0xab, 0x13,
+    0xbf, 0xfe, 0x31, 0xd0, 0x43, 0x5a, 0x7f, 0x5b, 0x56, 0xc7, 0xa7, 0xc2, 0x2c, 0x5b, 0xda, 0x22,
+    0xbc, 0x40, 0x51, 0xa5, 0x27, 0x50, 0xdd, 0x32, 0x87, 0x7c, 0xe9, 0x5a, 0xa7, 0x2d, 0xbf, 0x3d,
+    0xc3, 0x14, 0x02, 0xab, 0xf4, 0x36, 0x20, 0x7d, 0xfd, 0x38, 0x2c, 0x07, 0x88, 0xec, 0xb0, 0x31,
+    0xab, 0x8e, 0xc1, 0xa4, 0xe1, 0x41, 0x43, 0x7b, 0x5c, 0xa6, 0x55, 0xf4, 0x0c, 0x32, 0x08, 0x43,
+    0x0d, 0x7d, 0x6e, 0x02, 0x44, 0x2c, 0x21, 0xe5, 0x13, 0xfc, 0x92, 0x05, 0x13, 0x24, 0xd5, 0xe1,
+    0xa9, 0x89, 0x2a, 0x33, 0x2d, 0x8b, 0x88, 0xe5, 0xdb, 0x92, 0xbf, 0xf1, 0x73, 0xe3, 0x67, 0x8c,
+    0x08, 0xd9, 0xe5, 0x21, 0x4b, 0x09, 0x3c, 0xbe, 0x59, 0x9e, 0x8f, 0x34, 0x61, 0xaa, 0x33, 0x9a,
+    0x5b, 0x1b, 0xf9, 0xa9, 0xc0, 0xbf, 0xc0, 0x00, 0x76, 0x6a, 0xea, 0xa7, 0xc4, 0xd0, 0x4a, 0xb9,
+    0x4e, 0x20, 0xe0, 0x8d, 0x01, 0x2b, 0x75, 0x6c, 0x96, 0x19, 0xcc, 0x99, 0xcb, 0x75, 0x02, 0xcf,
+    0xe4, 0x8f, 0x0b, 0xe8, 0x8a, 0x71, 0xde, 0x34, 0x15, 0x87, 0x33, 0x24, 0x68, 0xeb, 0x75, 0x4d,
+    0x4f, 0x5a, 0x36, 0xae, 0x15, 0x8d, 0x44, 0x63, 0x34, 0xe7, 0x5d, 0x24, 0x57, 0x9e, 0xc0, 0xd2,
+    0x57, 0xb9, 0x09, 0x0f, 0xc8, 0xa6, 0x62, 0xc7, 0xad, 0x7e, 0xe5, 0x04, 0x51, 0x23, 0x3a, 0xf9,
+    0x84, 0x76, 0xb4, 0x07, 0x72, 0xd3, 0xa9, 0x2d, 0xc9, 0x0a, 0x32, 0xdd, 0xb5, 0x5d, 0x44, 0x09,
+    0x87, 0x56, 0xb5, 0xd2, 0x94, 0x0f, 0x24, 0x79, 0xe1, 0x1b, 0xe0, 0xf6, 0x55, 0x93, 0x6e, 0x2c,
+    0xdc, 0xd3, 0xc7, 0xf5, 0x22, 0xf1, 0xd9, 0x7d, 0xb5, 0x19, 0xc1, 0xe6, 0x93, 0x88, 0xf4, 0x31,
+    0x37, 0x39, 0x1b, 0x77, 0xbc, 0xd3, 0x74, 0x7d, 0x7a, 0x38, 0xb8, 0xbb, 0xb8, 0x5b, 0x1b, 0x8f,
+    0x6e, 0x80, 0x48, 0x91, 0x25, 0xd9, 0x2e, 0x10, 0x0a, 0x11, 0xf8, 0xa0, 0x73, 0x76, 0x70, 0x4c,
+    0xfe, 0x9e, 0x5f, 0xaf, 0x8f, 0xe4, 0x74, 0x3e, 0x52, 0x54, 0xd5, 0x60, 0x78, 0xa1, 0xdd, 0xea,
+    0x5c, 0x04, 0x93, 0x1b, 0x35, 0x50, 0x1c, 0xd6, 0x96, 0xf2, 0xb0, 0x03, 0x54, 0x6e, 0x78, 0x56,
+    0x9f, 0x70, 0xae, 0x2f, 0x06, 0x33, 0x2a, 0xf0, 0x2b, 0x17, 0x8d, 0x8d, 0x66, 0x53, 0x94, 0x56,
+    0x20, 0xf7, 0xf6, 0x29, 0xdd, 0x70, 0xd2, 0xf2, 0xec, 0x17, 0x81, 0xc4, 0x4c, 0xd9, 0x49, 0xe0,
+    0x31, 0xb7, 0x44, 0x22, 0x6f, 0x04, 0x92, 0xbf, 0x51, 0xc5, 0xfe, 0x6f, 0x43, 0xcf, 0x8c, 0xe7,
+    0xe3, 0x55, 0x03, 0xf6, 0x95, 0x5b, 0x9a, 0xe0, 0xfe, 0x8d, 0xbf, 0xcc, 0xc1, 0x96, 0xea, 0x67,
+    0xa6, 0x01, 0x69, 0xe1, 0xf7, 0xf5, 0x37, 0xcb, 0xf0, 0x37, 0x4f, 0x81, 0xe0, 0x71, 0xd8, 0x7f,
+    0xe3, 0x3b, 0xd5, 0x88, 0xa4, 0xc8, 0x2f, 0xf7, 0x2d, 0xb4, 0x8e, 0x3a, 0x9c, 0xe9, 0x09, 0xd8,
+    0x6b, 0x3b, 0x75, 0x97, 0xa7, 0x92, 0x5d, 0x15, 0xd9, 0x6f, 0x1e, 0x6d, 0xfe, 0x47, 0x22, 0xc2,
+    0x2d, 0x05, 0x17, 0xb2, 0x6b, 0x1a, 0x91, 0x8d, 0x02, 0x5e, 0x9a, 0xf8, 0xa4, 0x6d, 0x11, 0xe4,
+    0xfe, 0xf2, 0x3b, 0x7a, 0x8f, 0xe2, 0x97, 0xe9, 0x2a, 0xe4, 0xaa, 0x17, 0x7f, 0xf9, 0x75, 0xac,
+    0xd4, 0xd9, 0x68, 0x7a, 0x7f, 0xf5, 0xec, 0xbf, 0xd7, 0xda, 0xcb, 0x1c, 0xd1, 0xa6, 0x55, 0x54,
+    0xa7, 0x8f, 0x74, 0x53, 0x06, 0xe1, 0x01, 0x13, 0xd4, 0x5d, 0x7e, 0xfd, 0x44, 0xae, 0xa1, 0x01,
+    0x95, 0x3d, 0x68, 0x6b, 0x6b, 0x28, 0xc7, 0x51, 0xd1, 0x88, 0xce, 0x3a, 0x4a, 0x04, 0xca, 0x19,
+    0x78, 0x39, 0xb3, 0x80, 0x6a, 0xe4, 0x49, 0x11, 0xea, 0x94, 0x7d, 0xad, 0xc3, 0xfd, 0xb7, 0x6e,
+    0x9b, 0x2b, 0x86, 0xa2, 0x70, 0xc9, 0xe1, 0xc2, 0xaa, 0xb5, 0xae, 0x03, 0xdc, 0x64, 0x66, 0x6b,
+    0xa2, 0xaf, 0x9b, 0xce, 0x9f, 0xac, 0x90, 0x51, 0xf9, 0x67, 0x11, 0x89, 0xcc, 0xc1, 0xfe, 0x5e,
+    0xd7, 0x13, 0x48, 0x2d, 0xb9, 0x60, 0x64, 0x7d, 0x93, 0x7c, 0xe2, 0x5c, 0xdb, 0xe9, 0xa3, 0x4b,
+    0xe0, 0xf6, 0x13, 0x2f, 0xcd, 0x5b, 0x14, 0xdb, 0x67, 0x39, 0x1a, 0xf2, 0x65, 0x87, 0xb0, 0x5a,
+    0x4a, 0xe0, 0xde, 0x00, 0xa3, 0xbd, 0xda, 0xe2, 0xa6, 0x3f, 0x3f, 0x40, 0x0a, 0x79, 0x65, 0x0c,
+    0x58, 0xc5, 0xff, 0x9f, 0x39, 0x29, 0x8b, 0x52, 0x43, 0x6f, 0xd2, 0x63, 0x4e, 0xe3, 0x86, 0xb1,
+    0x1b, 0xf4, 0x05, 0x43, 0x5f, 0x10, 0xd0, 0x8f, 0x34, 0xb3, 0x93, 0x4b, 0x54, 0x91, 0x6a, 0xdb,
+    0x38, 0x54, 0xbb, 0xa5, 0x4c, 0x13, 0x3c, 0x1f, 0x1a, 0x3c, 0x4f, 0x6e, 0xe0, 0x28, 0x16, 0xda,
+    0xd5, 0xf3, 0x53, 0xe3, 0xc8, 0x80, 0x5b, 0xee, 0x4d, 0x7d, 0xaf, 0x82, 0x8f, 0x62, 0xab, 0x44,
+    0x68, 0x5b, 0x3d, 0x49, 0x4a, 0x8b, 0x10, 0xdd, 0x76, 0x60, 0x7b, 0x22, 0x1e, 0xea, 0x8a, 0xcb,
+    0x4f, 0x4c, 0x22, 0xf9, 0x32, 0x87, 0x55, 0x14, 0x30, 0x15, 0xd6, 0x60, 0xf6, 0x44, 0xac, 0x5b,
+    0x0b, 0xff, 0xe7, 0x46, 0x86, 0x5a, 0xfb, 0x22, 0x68, 0x4a, 0x92, 0x08, 0xfc, 0x9c, 0xe9, 0x05,
+    0x5a, 0x4d, 0x8e, 0x28, 0xf7, 0xe1, 0x63, 0xab, 0x99, 0x41, 0x95, 0x74, 0x7a, 0x37, 0xc3, 0x2e,
+    0x97, 0x39, 0x51, 0xfc, 0x87, 0x6e, 0xd2, 0xfb, 0x21, 0x95, 0x59, 0x5a, 0xc0, 0x20, 0xa7, 0x50,
+    0x8c, 0x67, 0xc8, 0x7f, 0xd2, 0xd9, 0x98, 0xb4, 0x42, 0x4a, 0xdb, 0xb5, 0x27, 0x43, 0xfb, 0x7f,
+    0xd8, 0xdd, 0x60, 0x87, 0x63, 0x00, 0x1e, 0x7a, 0x8f, 0xe6, 0x66, 0x0f, 0x99, 0x67, 0x8d, 0xd2,
+    0xbf, 0x1e, 0xd3, 0x33, 0x22, 0xd2, 0xa7, 0x1f, 0x01, 0x55, 0xe9, 0x3f, 0x09, 0x5c, 0xa9, 0x34,
+    0xca, 0x4f, 0xa4, 0x48, 0x94, 0xf8, 0xe9, 0x71, 0xd3, 0x8d, 0x40, 0x74, 0x12, 0x9c, 0x86, 0xc2,
+    0xd7, 0xf0, 0xc7, 0x02, 0xd9, 0x0b, 0xfb, 0x88, 0xc3, 0x98, 0x9e, 0x96, 0xa7, 0xe7, 0xe9, 0x14,
+    0x1b, 0x5d, 0x8e, 0x81, 0x28, 0x1d, 0xd2, 0x8a, 0x58, 0xe5, 0x26, 0xba, 0x63, 0x18, 0x87, 0xe5,
+    0x43, 0xf2, 0x15, 0xd8, 0x1c, 0xf5, 0x73, 0x8f, 0xda, 0xea, 0x6b, 0x93, 0x88, 0xb1, 0x06, 0x5c,
+    0x05, 0x4f, 0x20, 0x99, 0xdc, 0x4e, 0xa7, 0x82, 0x45, 0xa4, 0xe6, 0x92, 0x0d, 0x16, 0x7f, 0xe3,
+    0xd0, 0x78, 0x6c, 0x96, 0x44, 0x18, 0xac, 0x83, 0x7e, 0x54, 0x0d, 0x41, 0x1a, 0x3d, 0xe2, 0x3d,
+    0x2f, 0x8d, 0x37, 0x5b, 0xe7, 0xc8, 0x8c, 0xab, 0xbb, 0x26, 0xfc, 0x1f, 0x0b, 0xb6, 0x2c, 0xf6,
+    0x4b, 0x4d, 0x00, 0xb0, 0x53, 0x9d, 0x99, 0x16, 0xd0, 0x62, 0xbc, 0x2a, 0xcc, 0x41, 0x78, 0xa8,
+    0x3b, 0x0a, 0x6d, 0xf1, 0xe8, 0x07, 0x02, 0x8c, 0xd6, 0x4b, 0x33, 0xd3, 0x9c, 0xbf, 0x4c, 0xc8,
+    0xdb, 0x54, 0x00, 0xe5, 0x51, 0xda, 0xef, 0x01, 0xad, 0x83, 0xfa, 0xda, 0x10, 0x88, 0xc8, 0xf8,
+    0xe9, 0x7f, 0xcb, 0x1e, 0x34, 0x3a, 0xc0, 0x94, 0x64, 0x57, 0x80, 0x1d, 0x47, 0x92, 0x2f, 0x68,
+    0x30, 0x52, 0xbc, 0x4c, 0xa2, 0xd9, 0x4a, 0x26, 0xf0, 0xdc, 0xe5, 0x71, 0x1d, 0xc4, 0xaa, 0xcf,
+    0xbb, 0xec, 0xc1, 0x51, 0x7d, 0x1c, 0x52, 0x57, 0x00, 0x47, 0x0d, 0x98, 0x26, 0x71, 0x75, 0x42,
+    0x02, 0xef, 0x4a, 0x91, 0xce, 0x27, 0xf2, 0x6a, 0xaf, 0x6e, 0x6e, 0xb9, 0x5f, 0xc0, 0xdf, 0xc3,
+    0xfa, 0x99, 0xfd, 0x8a, 0x1d, 0x05, 0x1f, 0x37, 0xca, 0x1b, 0xaa, 0x87, 0xd7, 0x23, 0xa3, 0xf6,
+    0xd0, 0xca, 0xe6, 0x2e, 0xe7, 0x65, 0x55, 0x9a, 0x44, 0x1d, 0x1d, 0x70, 0x2f, 0xf7, 0x92, 0x0b,
+    0x1d, 0x46, 0x91, 0xc1, 0xdd, 0x86, 0xb4, 0xcc, 0x09, 0x16, 0xb5, 0x13, 0x9a, 0xa5, 0x6d, 0x6e,
+    0xd4, 0x32, 0x75, 0x69, 0xbd, 0xac, 0xaa, 0x57, 0xcf, 0x91, 0x8d, 0x2a, 0x5d, 0xcd, 0xeb, 0xe2,
+    0x04, 0xd3, 0x12, 0xe3, 0x58, 0xe4, 0xbb, 0x8d, 0x3a, 0xc9, 0x35, 0x64, 0xd8, 0xc3, 0x43, 0x65,
+    0xfc, 0xb2, 0xfb, 0x72, 0x71, 0xe8, 0x70, 0x56, 0xb3, 0xa3, 0x07, 0x8c, 0x56, 0x9c, 0x1b, 0x14,
+    0xcf, 0xcc, 0x9d, 0xf3, 0xdc, 0x2a, 0x03, 0x6c, 0xf3, 0xe6, 0xec, 0x8c, 0x00, 0xf2, 0xc5, 0xe4,
+    0x15, 0xfa, 0xce, 0xe8, 0xb5, 0x34, 0x6b, 0x8d, 0x91, 0xc4, 0x2e, 0x34, 0x45, 0xb0, 0x2d, 0xac,
+    0xc0, 0x87, 0x34, 0x98, 0x5d, 0xbf, 0x2a, 0xa0, 0xf6, 0xc8, 0x75, 0xad, 0x36, 0x6f, 0x1a, 0xe5,
+    0x2a, 0xbf, 0x8d, 0x21, 0x3f, 0x16, 0x95, 0xee, 0x33, 0x6c, 0x09, 0x76, 0xe8, 0xe0, 0x52, 0x21,
+    0x99, 0x15, 0x11, 0xa0, 0x5c, 0x35, 0x24, 0x27, 0x64, 0x3e, 0x34, 0x04, 0xe0, 0xbe, 0xc9, 0x87,
+    0xa3, 0x26, 0xa0, 0xa3, 0x43, 0x4a, 0xfb, 0xdd, 0xff, 0x5c, 0x37, 0x6d, 0x3d, 0x7e, 0x69, 0x8b,
+    0x21, 0xad, 0x42, 0x53, 0xa8, 0x8d, 0x59, 0x24, 0xba, 0xa6, 0xfa, 0x35, 0x18, 0x1b, 0x76, 0x8e,
+    0xbf, 0x3a, 0xb6, 0xed, 0x76, 0x48, 0x8c, 0xba, 0x81, 0x0b, 0xa5, 0xe1, 0x82, 0xc9, 0x37, 0x79,
+    0x86, 0xb5, 0x91, 0xa7, 0xb3, 0x59, 0xff, 0xf1, 0xee, 0x85, 0x5e, 0x15, 0x71, 0x5d, 0xbd, 0xb4,
+    0xa9, 0xc8, 0x30, 0xf3, 0x98, 0x62, 0x6b, 0x9e, 0x36, 0xdd, 0xea, 0xd2, 0xec, 0xf1, 0xba, 0x4b,
+    0xf7, 0xb3, 0x76, 0x86, 0x17, 0x2b, 0xdf, 0xee, 0x7f, 0x45, 0x2f, 0xfd, 0xb7, 0xd7, 0x70, 0xfa,
+    0x88, 0xa8, 0x19, 0x82, 0xd7, 0x28, 0x71, 0x17, 0x53, 0xf7, 0x2f, 0x2a, 0x27, 0x8b, 0x7d, 0x64,
+    0xf8, 0x7d, 0xd9, 0xa5, 0x0f, 0x0b, 0x40, 0x9f, 0x43, 0xdc, 0x5e, 0x45, 0xbc, 0x3b, 0xc0, 0x50,
+    0xb5, 0x68, 0x24, 0x33, 0x94, 0x63, 0xa7, 0xb3, 0x48, 0x91, 0x38, 0x97, 0x5d, 0x2c, 0x58, 0x18,
+    0xee, 0x3b, 0x2b, 0xc2, 0x78, 0xac, 0xa8, 0xf2, 0xfd, 0x12, 0x33, 0x5b, 0xc3, 0xcd, 0xbd, 0xe3,
+    0xfa, 0x92, 0xb1, 0x75, 0x57, 0x97, 0xd7, 0xe9, 0x75, 0x75, 0xbd, 0x4c, 0xfd, 0xaf, 0x88, 0x64,
+    0x83, 0x86, 0x9e, 0x76, 0x51, 0xfb, 0x86, 0xfe, 0xd1, 0x25, 0x0b, 0xec, 0xb4, 0x0f, 0x07, 0xbc,
+    0x5f, 0xb5, 0xf2, 0xb8, 0x2e, 0x56, 0xf3, 0xe6, 0xb3, 0x4b, 0x67, 0x26, 0x2d, 0x60, 0x6c, 0x30,
+    0xbc, 0xf6, 0xb1, 0x72, 0xc0, 0x87, 0xda, 0xa1, 0xf8, 0x24, 0xc3, 0x7a, 0xf5, 0x86, 0x1d, 0x5e,
+    0x00, 0xf7, 0x2a, 0x4c, 0x12, 0x66, 0x1d, 0xd1, 0xd2, 0x3d, 0x6e, 0xb6, 0x71, 0x93, 0x72, 0xe5,
+    0xd5, 0x0f, 0x31, 0x46, 0xc8, 0x8a, 0x9a, 0xe4, 0x2a, 0x8a, 0xf8, 0x34, 0x3d, 0x02, 0x9a, 0xd9,
+    0xff, 0x2c, 0x51, 0xb0, 0x8c, 0x04, 0x28, 0x46, 0x25, 0x03, 0xfc, 0x1f, 0xde, 0x0d, 0x68, 0x24,
+    0x15, 0xfe, 0xbd, 0xd8, 0x53, 0x8c, 0xa0, 0xdb, 0x54, 0xb6, 0xf8, 0x68, 0xf2, 0x67, 0x8a, 0x3b,
+    0xb3, 0xd1, 0x04, 0x2f, 0xd6, 0xa0, 0x36, 0x80, 0xef, 0x4b, 0x63, 0x12, 0x9d, 0x5c, 0x73, 0xd0,
+    0x2f, 0x4c, 0xe1, 0x35, 0xab, 0xf1, 0xb5, 0xca, 0x93, 0xc4, 0x0b, 0xf0, 0xe5, 0x91, 0xe8, 0xd1,
+    0xcc, 0xd2, 0x29, 0x04, 0x75, 0xe8, 0xc1, 0xd7, 0x89, 0x79, 0x80, 0x96, 0x04, 0x18, 0xc6, 0x69,
+    0xf1, 0x27, 0x19, 0x21, 0xda, 0x3e, 0x44, 0x55, 0x11, 0xe5, 0x4d, 0x7c, 0xbf, 0x44, 0x19, 0x4c,
+    0x77, 0x9d, 0x52, 0x3b, 0x7a, 0x6e, 0x8b, 0x8c, 0x59, 0x92, 0xbe, 0xa5, 0xb6, 0xc6, 0x3b, 0x1f,
+    0xd4, 0x87, 0x1c, 0x57, 0xe1, 0x3b, 0x7c, 0x36, 0x90, 0xf8, 0x93, 0x01, 0x59, 0x0b, 0x92, 0xa6,
+    0x43, 0xee, 0x9c, 0xd8, 0xef, 0x26, 0xcd, 0xf2, 0x4d, 0x61, 0x1c, 0xcc, 0x3a, 0x3c, 0xb6, 0xbc,
+    0x23, 0x43, 0x1f, 0xe8, 0x58, 0x9a, 0x79, 0x0c, 0x98, 0xd4, 0xcf, 0x1d, 0x24, 0xf3, 0x52, 0xd8,
+    0x49, 0x9c, 0x92, 0xa5, 0x97, 0x1a, 0x4a, 0xae, 0x52, 0x48, 0xf5, 0x47, 0x37, 0x02, 0x6d, 0x67,
+    0x52, 0x1f, 0x95, 0xc2, 0xa1, 0x9b, 0xb2, 0x8f, 0xf0, 0xce, 0xd9, 0x37, 0x49, 0xd0, 0xff, 0x5d,
+    0x6d, 0x08, 0xa0, 0x4c, 0x22, 0x65, 0x08, 0xc2, 0x17, 0xfa, 0x10, 0xfa, 0xcb, 0xf4, 0xd1, 0xe9,
+    0xf4, 0xdb, 0xf1, 0xcf, 0x53, 0xed, 0x92, 0xa6, 0xe6, 0x49, 0xe2, 0x6a, 0xf3, 0x48, 0x28, 0x9c,
+    0x45, 0x23, 0xe5, 0x2e, 0x5a, 0x3b, 0x8d, 0xf6, 0x0d, 0x8e, 0x7d, 0xa0, 0x5a, 0xf0, 0x60, 0xa6,
+    0xc6, 0x41, 0x34, 0x74, 0xa1, 0x8e, 0x77, 0xb1, 0x49, 0xc7, 0x65, 0xd6, 0x15, 0x75, 0xaa, 0x1f,
+    0x91, 0x71, 0xf7, 0x88, 0x4d, 0x3e, 0x86, 0xfa, 0x45, 0xf8, 0xcb, 0x97, 0x7a, 0xdf, 0xfb, 0x1b,
+    0x19, 0x87, 0xee, 0xea, 0x75, 0x6f, 0xc1, 0x80, 0xc6, 0xb8, 0xe0, 0x1f, 0x4d, 0x0f, 0xde, 0x6b,
+    0xd0, 0x82, 0x02, 0xe5, 0xa3, 0x91, 0xeb, 0x3e, 0xa1, 0xa2, 0xd7, 0xcb, 0x89, 0xb2, 0x3a, 0x3e,
+    0xe0, 0x8d, 0x5d, 0xac, 0x3b, 0x54, 0x45, 0x45, 0xc6, 0x50, 0xdc, 0xdc, 0xb6, 0x35, 0x68, 0xd5,
+    0x8a, 0xa3, 0x53, 0xaa, 0xda, 0xb3, 0x7a, 0x4b, 0x8b, 0x54, 0x10, 0x61, 0xc4, 0x90, 0x8e, 0x30,
+    0x75, 0x21, 0xe8, 0xb1, 0xf2, 0x3d, 0x4c, 0xa7, 0xb6, 0x04, 0x60, 0xfd, 0x66, 0x9e, 0xb2, 0xe8,
+    0xab, 0x32, 0x68, 0x05, 0xd0, 0x90, 0x8a, 0x9a, 0xd0, 0xff, 0xc6, 0x66, 0xd0, 0x0b, 0x65, 0xd9,
+    0x69, 0xf9, 0x07, 0x4e, 0xda, 0xb9, 0x33, 0x4c, 0xa1, 0x76, 0xfc, 0x9b, 0x80, 0xe8, 0xdb, 0x9d,
+    0x5f, 0x9b, 0x5f, 0xae, 0x06, 0xb1, 0xc1, 0x3b, 0x47, 0x69, 0x7f, 0x44, 0x84, 0x30, 0x41, 0x05,
+    0xfe, 0x57, 0x11, 0x14, 0x86, 0xab, 0x28, 0xfb, 0xda, 0xf6, 0xe3, 0xd0, 0x17, 0xde, 0x5c, 0x37,
+    0xe9, 0x35, 0xad, 0x2c, 0x31, 0x5e, 0x7b, 0x68, 0x0a, 0x2c, 0x49, 0xf0, 0x5b, 0x36, 0xac, 0x48,
+    0x1d, 0xff, 0x03, 0xd1, 0xbc, 0x15, 0xfd, 0x8c, 0xc4, 0x3a, 0x03, 0x92, 0x6e, 0x74, 0x3f, 0xe0,
+    0x8f, 0x46, 0xe3, 0xb2, 0x9f, 0x1a, 0x9f, 0x79, 0xe7, 0x29, 0xa5, 0xec, 0x0f, 0xf4, 0xa9, 0x05,
+    0x7e, 0xf0, 0xa2, 0x0b, 0xd7, 0x32, 0xcb, 0x0d, 0x3a, 0x00, 0x7f, 0xb5, 0xc0, 0xba, 0xd2, 0xa3,
+    0x21, 0x0d, 0x7b, 0x13, 0x0e, 0x03, 0xee, 0xe0, 0x16, 0x57, 0xde, 0x0d, 0xec, 0x3c, 0xe1, 0xbd,
+    0xc2, 0xfd, 0x6a, 0x18, 0x40, 0xff, 0x3d, 0x6d, 0x21, 0x76, 0xef, 0x95, 0x36, 0xcd, 0xbc, 0xc6,
+    0x87, 0x13, 0xff, 0x46, 0xf4, 0x6b, 0x4f, 0xb0, 0xda, 0x38, 0x20, 0x61, 0x77, 0x84, 0xe1, 0x4c,
+    0x88, 0x18, 0x37, 0x17, 0xb9, 0xa5, 0x2d, 0x81, 0x83, 0x07, 0x4d, 0x09, 0xb8, 0x40, 0x4b, 0x45,
+    0xae, 0xdb, 0xcf, 0x17, 0x77, 0x1e, 0x1c, 0xb6, 0x24, 0xe2, 0x96, 0xfb, 0xd0, 0x34, 0xeb, 0xf8,
+    0x7a, 0x33, 0x36, 0xe5, 0xf9, 0x00, 0xc9, 0x08, 0xeb, 0x33, 0xff, 0xe9, 0xe5, 0x51, 0xe6, 0x31,
+    0x4c, 0x4d, 0x46, 0x29, 0xee, 0x12, 0x65, 0x68, 0x2f, 0x5d, 0x70, 0x5f, 0x7a, 0xb7, 0x9c, 0x57,
+    0x53, 0xa3, 0xc8, 0xdf, 0x19, 0x58, 0x8d, 0x14, 0xfa, 0x68, 0x0e, 0x53, 0xa5, 0x0d, 0x17, 0x55,
+    0xf6, 0x9d, 0x3d, 0x08, 0xa2, 0x1c, 0xd8, 0x06, 0x0c, 0xb0, 0x9b, 0xb3, 0x2d, 0xe3, 0x33, 0xf6,
+    0xed, 0x3b, 0xc7, 0x60, 0xee, 0xb2, 0xb6, 0x0b, 0xcc, 0x12, 0xfb, 0x10, 0x8f, 0xea, 0x4c, 0x1d,
+    0xcb, 0x5d, 0x96, 0x7f, 0xde, 0x71, 0x08, 0x26, 0x78, 0xa6, 0x8e, 0x49, 0x46, 0x54, 0x37, 0xfe,
+    0xf9, 0x0c, 0xfb, 0x80, 0x93, 0x39, 0xe3, 0x49, 0xb1, 0x04, 0xec, 0x0c, 0x08, 0xd5, 0xde, 0x22,
+    0xe0, 0xac, 0x88, 0x8c, 0x19, 0x9c, 0x2d, 0xd3, 0x0a, 0x5e, 0x57, 0xc9, 0xa5, 0xfb, 0x31, 0xd1,
+    0x79, 0xa4, 0x2a, 0x25, 0x4f, 0x30, 0xc1, 0xf5, 0xd8, 0x99, 0x54, 0xfb, 0x8b, 0x03, 0xe6, 0x7c,
+    0x91, 0xed, 0x8b, 0x8f, 0x41, 0x72, 0xd4, 0x5d, 0x10, 0xde, 0xee, 0xe5, 0x6e, 0xbf, 0x76, 0x79,
+    0x93, 0x42, 0x18, 0xe8, 0x36, 0xba, 0x32, 0xc5, 0x7f, 0x2b, 0x9b, 0xff, 0x30, 0xac, 0xef, 0x59,
+    0xe4, 0xb3, 0xe0, 0xae, 0xf2, 0x0f, 0x64, 0xf2, 0xda, 0x6c, 0x71, 0xa6, 0xc7, 0x2a, 0xca, 0x3a,
+    0x6c, 0x8d, 0x16, 0xbc, 0x91, 0x85, 0x11, 0xc7, 0x8d, 0xa5, 0x17, 0x80, 0xfe, 0x8b, 0x90, 0x71,
+    0x9c, 0x47, 0xbd, 0x8e, 0x45, 0x1e, 0x3d, 0x20, 0x62, 0xbc, 0xa1, 0xbc, 0xaf, 0x54, 0x39, 0xb3,
+    0x9c, 0x94, 0x7b, 0x25, 0xeb, 0xde, 0x86, 0xd7, 0xa9, 0xc9, 0x24, 0x80, 0x54, 0xd2, 0x6d, 0x6c,
+    0xd1, 0x58, 0xc5, 0x61, 0x8e, 0x4b, 0xf0, 0x6b, 0x05, 0x0b, 0x4a, 0xa0, 0x23, 0xab, 0xfd, 0xbc,
+    0xe4, 0xf2, 0xbf, 0xb4, 0xd0, 0x8d, 0xd2, 0xa3, 0xbd, 0x66, 0x5c, 0xfc, 0x82, 0xfb, 0xd4, 0xa4,
+    0xbf, 0x57, 0x29, 0xdf, 0x84, 0x0f, 0x46, 0xe9, 0x05, 0x98, 0x3c, 0x9d, 0xf4, 0xbd, 0x87, 0x53,
+    0xb0, 0x36, 0x28, 0xde, 0x29, 0x0b, 0x4e, 0xdd, 0xb5, 0x8c, 0x79, 0xc6, 0xd0, 0x2f, 0x40, 0xfa,
+    0x08, 0x05, 0x50, 0x3f, 0x30, 0xd1, 0xf7, 0x36, 0x67, 0x95, 0xe7, 0xa3, 0xae, 0x64, 0x38, 0xf2,
+    0x6e, 0x20, 0x39, 0x41, 0xd1, 0x33, 0x79, 0x9a, 0xd7, 0x13, 0x73, 0xa4, 0x68, 0x9a, 0x8b, 0x56,
+    0x82, 0x4e, 0x6a, 0x32, 0x58, 0x06, 0xaf, 0xb4, 0xdd, 0x31, 0x8d, 0xf4, 0x02, 0xa5, 0x3c, 0x7a,
+    0xa2, 0x0f, 0xde, 0xc0, 0x4a, 0x5f, 0xf1, 0x06, 0x96, 0xfb, 0xa7, 0xdf, 0x92, 0xa8, 0xb0, 0x63,
+    0x69, 0x4d, 0x03, 0xf8, 0x11, 0x3f, 0xfe, 0xad, 0x12, 0xf1, 0x66, 0x20, 0xd3, 0x33, 0xab, 0xef,
+    0x1a, 0x38, 0x14, 0x93, 0xe6, 0x38, 0xbd, 0xff, 0x37, 0xd1, 0x19, 0x50, 0xf5, 0x1a, 0xff, 0xc4,
+    0xc2, 0x4e, 0x4d, 0x22, 0x56, 0x5b, 0x2e, 0x98, 0x7a, 0x3e, 0x0c, 0x8c, 0xdb, 0x6d, 0x23, 0xdc,
+    0x80, 0x31, 0x26, 0x43, 0xb0, 0xfe, 0x7f, 0x5e, 0xa4, 0xe7, 0xfb, 0xd5, 0xb3, 0x5d, 0x7a, 0xf4,
+    0x07, 0x83, 0xc6, 0x41, 0x9c, 0x3f, 0xbb, 0x96, 0xc5, 0x07, 0x85, 0x3c, 0xd4, 0x5e, 0x62, 0xcf,
+    0x05, 0xe8, 0x2e, 0x50, 0xe3, 0xb3, 0x21, 0xf9, 0x68, 0x67, 0x66, 0x58, 0x64, 0xfa, 0x53, 0x74,
+    0xae, 0x98, 0x63, 0x44, 0x98, 0xc7, 0x4c, 0xb2, 0x5c, 0x5e, 0x46, 0x77, 0xd4, 0x9f, 0xe7, 0x03,
+    0x4d, 0x29, 0x0f, 0x54, 0x92, 0x76, 0x7a, 0xde, 0x41, 0x6f, 0xcb, 0x83, 0x3b, 0x70, 0x83, 0x02,
+    0x11, 0x1c, 0x6d, 0x9b, 0x9e, 0x6b, 0x63, 0xc7, 0x42, 0x5b, 0x1e, 0xeb, 0x84, 0xa7, 0x40, 0xee,
+    0x69, 0xe3, 0x47, 0x57, 0xc3, 0x1b, 0x50, 0x2a, 0x00, 0x9e, 0x52, 0x44, 0xe7, 0xb5, 0x11, 0x3d,
+    0xf2, 0x09, 0xe1, 0x90, 0x6f, 0xff, 0x8c, 0x3d, 0x16, 0xd5, 0xd1, 0xf9, 0x50, 0x9b, 0x28, 0xc4,
+    0x60, 0x61, 0x96, 0xfb, 0xc1, 0x33, 0x43, 0x41, 0xef, 0x38, 0xdf, 0x0e, 0x99, 0xc6, 0x65, 0x5d,
+    0x5e, 0x7a, 0xc1, 0xd5, 0xaa, 0x2b, 0x98, 0x71, 0x7e, 0xee, 0x85, 0xac, 0x40, 0x5f, 0x49, 0x32,
+    0x5d, 0x1e, 0x0b, 0x2d, 0xcc, 0x86, 0x37, 0xb9, 0xfd, 0x24, 0x8c, 0xf3, 0x0a, 0x50, 0x94, 0x95,
+    0x2e, 0x35, 0xac, 0x6a, 0x99, 0x86, 0x35, 0x24, 0xf2, 0xf9, 0xcd, 0x02, 0x99, 0xc4, 0x0a, 0x81,
+    0x6c, 0x99, 0x42, 0x8f, 0x02, 0xba, 0x40, 0x2c, 0xe7, 0x0e, 0x97, 0x6e, 0x24, 0x18, 0x9e, 0xc0,
+    0x62, 0xdc, 0xad, 0x3c, 0xb2, 0x1f, 0x93, 0x9b, 0x1a, 0xd7, 0xdf, 0x34, 0x77, 0x60, 0xda, 0xe4,
+    0x53, 0xb4, 0x17, 0xd2, 0x76, 0x73, 0x43, 0xe4, 0xf1, 0x30, 0x3c, 0xf5, 0xb1, 0xe7, 0x2d, 0x6b,
+    0x88, 0x6b, 0xd5, 0x48, 0x68, 0x8c, 0x4f, 0xa9, 0x98, 0xad, 0x2c, 0x53, 0xb0, 0xf3, 0x89, 0x2f,
+    0xea, 0xb7, 0xff, 0xc9, 0x98, 0x80, 0x69, 0xcc, 0x4e, 0xea, 0xff, 0x24, 0x8c, 0xcc, 0x93, 0xf5,
+    0x2f, 0x41, 0xc9, 0x46, 0x4f, 0x83, 0x08, 0xd9, 0x97, 0x86, 0x80, 0x4f, 0x12, 0x46, 0x7e, 0xf8,
+    0xcf, 0x65, 0xae, 0x90, 0x25, 0xe3, 0x3e, 0x9c, 0xaa, 0x37, 0x61, 0x11, 0x2a, 0xc3, 0xcf, 0x8e,
+    0x4b, 0xec, 0x6b, 0x2a, 0x82, 0xd2, 0x8d, 0x2d, 0x28, 0x4f, 0x45, 0x35, 0xa8, 0x9a, 0x45, 0x9c,
+    0xa8, 0x77, 0x7e, 0x06, 0xa8, 0x1b, 0xb0, 0x2d, 0xaa, 0x08, 0x64, 0x6e, 0xaf, 0x1a, 0x96, 0x11,
+    0xc8, 0x7f, 0x20, 0x4d, 0xc1, 0x33, 0xf1, 0x94, 0x7f, 0xb7, 0xff, 0xa2, 0x37, 0xfe, 0x89, 0x37,
+    0xc7, 0xd7, 0x3e, 0x3c, 0x39, 0x54, 0x6e, 0x3a, 0xfa, 0x64, 0xf2, 0xfa, 0x15, 0x99, 0x64, 0xb3,
+    0x72, 0xdd, 0xf3, 0xba, 0x1e, 0x9b, 0x93, 0x7e, 0xa9, 0x66, 0x1f, 0xe9, 0x60, 0xf6, 0xfe, 0x78,
+    0xd9, 0x12, 0x43, 0x51, 0x16, 0x6c, 0x10, 0x22, 0xdc, 0xdb, 0x31, 0x2c, 0xdf, 0x60, 0x14, 0xf1,
+    0x4b, 0x0a, 0xa8, 0xbf, 0x05, 0xa9, 0xf9, 0x34, 0x7f, 0x5b, 0x03, 0xb7, 0x51, 0xc0, 0x36, 0x4b,
+    0x87, 0x53, 0x77, 0x10, 0x3c, 0xf7, 0x66, 0x2e, 0xfb, 0xd7, 0xd4, 0xb2, 0x18, 0x1e, 0x24, 0x17,
+    0x6b, 0xf2, 0x27, 0x6c, 0x0c, 0xf9, 0x5c, 0x0c, 0xac, 0x04, 0x45, 0xc3, 0x32, 0x9a, 0xe3, 0xad,
+    0x0c, 0x3e, 0x9f, 0xca, 0x73, 0x38, 0xe7, 0x57, 0xee, 0xe9, 0xc7, 0x46, 0x93, 0x66, 0xb4, 0x1c,
+    0x63, 0x9c, 0xee, 0xc9, 0x51, 0xa8, 0xc6, 0x08, 0xaa, 0x74, 0xe5, 0x4b, 0xec, 0xb6, 0xf2, 0xe1,
+    0x0b, 0xb7, 0xda, 0xe1, 0x78, 0x32, 0xd1, 0xe7, 0xbf, 0x97, 0x22, 0x6a, 0x6d, 0xd2, 0xd0, 0x52,
+    0x0a, 0x88, 0x72, 0x08, 0xed, 0x66, 0x70, 0x66, 0x7b, 0xa1, 0xaf, 0x65, 0xa3, 0x32, 0xdd, 0xb2,
+    0x1f, 0xa6, 0x9c, 0xcc, 0x3e, 0xda, 0x89, 0x24, 0x73, 0x2c, 0x0d, 0x2d, 0xb4, 0xcd, 0xaf, 0xcd,
+    0xd6, 0xb2, 0x16, 0xb4, 0xee, 0x07, 0x91, 0x9d, 0xce, 0xbd, 0x6c, 0x6b, 0xbd, 0x54, 0x25, 0xed,
+    0xe1, 0xcc, 0x25, 0xa9, 0x94, 0xf4, 0x96, 0xeb, 0x7a, 0x37, 0xd7, 0x98, 0xc0, 0x0c, 0xf5, 0xc2,
+    0x07, 0x6c, 0x8f, 0xb9, 0x1b, 0x3c, 0x89, 0x2a, 0xd0, 0x6f, 0x89, 0xe3, 0x8b, 0x4f, 0x7c, 0xa5,
+    0xb6, 0x77, 0xe0, 0x4a, 0x2e, 0x90, 0xe1, 0xa3, 0x69, 0xa8, 0x53, 0x8b, 0x06, 0x9e, 0x85, 0x40,
+    0x5b, 0x4f, 0xf2, 0x85, 0x00, 0xe5, 0x8b, 0xe3, 0xef, 0xa0, 0xd9, 0x69, 0x81, 0xba, 0x0d, 0x17,
+    0xa5, 0x87, 0x01, 0xa8, 0x59, 0x2c, 0x57, 0x54, 0x2f, 0xbb, 0xbe, 0x49, 0x15, 0x93, 0xa6, 0xb9,
+    0x3c, 0x67, 0x4d, 0x0d, 0x5d, 0x9b, 0x69, 0x5e, 0xd0, 0x88, 0x07, 0x8b, 0xaa, 0xf5, 0x89, 0xe3,
+    0x38, 0x8c, 0x98, 0xb4, 0x85, 0xb3, 0x9c, 0xaf, 0x8f, 0x41, 0x7d, 0x9a, 0xf3, 0x94, 0xf3, 0xbc,
+    0x81, 0x9e, 0xa9, 0x96, 0x3d, 0x85, 0x3a, 0xb1, 0xf1, 0xa9, 0x94, 0x62, 0xfe, 0x4a, 0xe1, 0x19,
+    0x4f, 0xc5, 0x87, 0x08, 0xea, 0x4e, 0x53, 0x01, 0x20, 0x14, 0xc0, 0xdf, 0x37, 0x75, 0x2c, 0x1e,
+    0xd5, 0x0e, 0x1f, 0x8c, 0xa7, 0x03, 0xa8, 0x8d, 0xba, 0x74, 0x6d, 0x31, 0xef, 0x60, 0x47, 0xcc,
+    0x0e, 0x52, 0xe3, 0x75, 0x59, 0x9a, 0xae, 0xf2, 0x79, 0xe5, 0xbb, 0x44, 0x25, 0xbb, 0x38, 0x6a,
+    0x78, 0x85, 0xef, 0x58, 0x7a, 0x52, 0xd3, 0x18, 0x29, 0x2d, 0xfe, 0x2d, 0xd7, 0x91, 0xf6, 0xbb,
+    0xb8, 0x23, 0x37, 0x22, 0x70, 0xa1, 0xda, 0xfe, 0xbc, 0xe5, 0xaf, 0x46, 0x6c, 0x60, 0xe2, 0x25,
+    0x29, 0xa9, 0xb6, 0xcb, 0xd3, 0x0f, 0x05, 0x52, 0x6e, 0x31, 0x44, 0x56, 0xcb, 0x76, 0xe5, 0xb1,
+    0x2c, 0x1d, 0x1e, 0xbd, 0xbd, 0x78, 0x35, 0x1c, 0xad, 0xc3, 0xfa, 0xfd, 0x11, 0x8b, 0xa9, 0xcf,
+    0x83, 0x32, 0xed, 0x53, 0x14, 0x52, 0x90, 0xc2, 0x37, 0xc9, 0x46, 0xff, 0xec, 0x4c, 0xea, 0x9d,
+    0x2a, 0xe8, 0x8b, 0xa9, 0x02, 0x27, 0xbc, 0x42, 0x9c, 0x8a, 0xcc, 0x27, 0x70, 0x46, 0x59, 0x7d,
+    0x57, 0x48, 0x62, 0xc1, 0x21, 0x76, 0x68, 0xa7, 0xfa, 0x35, 0x11, 0x01, 0x49, 0xd2, 0x25, 0x83,
+    0x87, 0xa5, 0x08, 0xb2, 0xfc, 0xef, 0xcd, 0xfa, 0xfb, 0x56, 0xf9, 0xbf, 0xbf, 0x77, 0xae, 0x85,
+    0x99, 0x64, 0x3e, 0x75, 0xbb, 0xe5, 0xc1, 0x44, 0xf8, 0x19, 0x4b, 0x55, 0xff, 0x77, 0x61, 0x82,
+    0x5e, 0x9e, 0x61, 0xd7, 0x24, 0xed, 0xc3, 0x38, 0xbe, 0x52, 0x6d, 0x46, 0x52, 0x5a, 0xfe, 0xbd,
+    0x02, 0x48, 0xfb, 0xab, 0xb1, 0x8e, 0xb1, 0x40, 0xf3, 0xdb, 0x5e, 0x41, 0x30, 0x69, 0xe3, 0x09,
+    0x01, 0xb8, 0xb4, 0xc8, 0x37, 0xe0, 0x6d, 0xa7, 0xd6, 0x6b, 0x0a, 0x4b, 0x51, 0xa0, 0x2d, 0x5e,
+    0xd7, 0x06, 0xf3, 0xa3, 0x76, 0x84, 0x62, 0x04, 0x97, 0xcd, 0xf3, 0x31, 0x55, 0x4e, 0x85, 0xa3,
+    0xbc, 0x26, 0x42, 0x36, 0x6b, 0x0d, 0x97, 0x24, 0x27, 0x65, 0x15, 0x48, 0x63, 0x25, 0xd1, 0xb3,
+    0x2b, 0xbf, 0xf2, 0xb5, 0x48, 0xf9, 0x8d, 0xf7, 0x3d, 0xd4, 0xf3, 0x00, 0x2f, 0x84, 0x60, 0x17,
+    0xef, 0x5c, 0x07, 0x38, 0xc4, 0xbe, 0x0c, 0x43, 0x2f, 0x55, 0xd8, 0xf1, 0x3c, 0xcc, 0xb8, 0x5c,
+    0xb4, 0x29, 0x54, 0x4b, 0x2f, 0x53, 0x83, 0x94, 0xd8, 0x36, 0x5b, 0x06, 0xb0, 0xc8, 0x3e, 0x1a,
+    0x2f, 0x1a, 0xd9, 0x06, 0xea, 0x88, 0x97, 0x5d, 0xa5, 0xbc, 0xe1, 0x87, 0x6f, 0x9d, 0xf5, 0xa1,
+    0x20, 0x4a, 0x8b, 0xf9, 0x7a, 0x8a, 0xee, 0xb7, 0xae, 0xd4, 0x24, 0xeb, 0xcb, 0xc1, 0x72, 0x88,
+    0xc4, 0x73, 0x88, 0xbc, 0xa1, 0xf1, 0x59, 0xf2, 0x13, 0xab, 0x49, 0xe5, 0xc4, 0x2a, 0x65, 0x92,
+    0x2e, 0x23, 0x98, 0x17, 0xd9, 0xd2, 0xce, 0xf5, 0x7b, 0x78, 0x04, 0xd2, 0xad, 0xd2, 0xe0, 0x9e,
+    0xb9, 0x91, 0x0b, 0xdd, 0x76, 0x42, 0x23, 0x73, 0x90, 0x5b, 0x8e, 0xb9, 0xb9, 0x3e, 0x45, 0x6d,
+    0xc3, 0x33, 0x5d, 0x21, 0x21, 0x0d, 0xc0, 0xd3, 0xfd, 0x3e, 0xde, 0x4e, 0x86, 0x0a, 0x2c, 0xb6,
+    0x11, 0xd8, 0x65, 0x8c, 0x9b, 0x82, 0x62, 0x2c, 0x87, 0x5f, 0x03, 0x56, 0xb3, 0x39, 0x87, 0x95,
+    0x03, 0x55, 0x4a, 0xd2, 0x12, 0xfa, 0xb0, 0xda, 0x62, 0x24, 0x79, 0x4b, 0x64, 0x65, 0x70, 0x9d,
+    0x71, 0x79, 0x06, 0x45, 0xe1, 0x2b, 0x15, 0x8a, 0x5f, 0x05, 0xb8, 0x3d, 0xc9, 0x27, 0xfd, 0xb4,
+    0xd5, 0x47, 0xc1, 0xbf, 0xac, 0x5f, 0x7e, 0x91, 0xa3, 0x56, 0x84, 0xca, 0x76, 0x75, 0xf1, 0x52,
+    0xcc, 0xc3, 0xc6, 0x60, 0x61, 0xb4, 0x75, 0x25, 0x85, 0x10, 0xe3, 0x4e, 0x8f, 0x0c, 0xcf, 0xd1,
+    0xb4, 0x05, 0x95, 0x81, 0x98, 0x48, 0x67, 0xb4, 0x40, 0x69, 0x76, 0xbb, 0xdc, 0x2b, 0x48, 0xe2,
+    0x1f, 0x0a, 0xaa, 0x56, 0x0d, 0x6f, 0xab, 0xf6, 0x43, 0xfd, 0x64, 0x38, 0x00, 0x2a, 0x3d, 0x84,
+    0xb6, 0x0e, 0xd2, 0x9f, 0x32, 0x1b, 0x3b, 0x19, 0x2f, 0x60, 0x79, 0x28, 0x0a, 0xfd, 0xe1, 0x03,
+    0x9e, 0x56, 0x1d, 0x54, 0x8d, 0x3f, 0xb2, 0xa7, 0x7a, 0x3b, 0x84, 0xf0, 0xcc, 0xef, 0xaf, 0x42,
+    0x98, 0x21, 0x27, 0x54, 0xf8, 0xbd, 0x67, 0x41, 0xee, 0xa7, 0x6e, 0x2f, 0x2f, 0x74, 0xc1, 0xfa,
+    0x6a, 0xef, 0xc9, 0x2c, 0xf9, 0x5a, 0x4d, 0x1b, 0x7f, 0x90, 0xad, 0xa2, 0x77, 0x1c, 0xab, 0x5a,
+    0x5d, 0xc4, 0x44, 0x15, 0xcc, 0x69, 0x85, 0x2f, 0xd6, 0x24, 0xe8, 0x31, 0xe8, 0x34, 0xf9, 0x70,
+    0xb2, 0x4f, 0xf8, 0x53, 0x31, 0xa2, 0x29, 0x4e, 0xd3, 0xec, 0x2a, 0x3f, 0x68, 0x4c, 0x0c, 0x7f,
+    0x21, 0x4c, 0x5c, 0x6a, 0x9a, 0x5b, 0x2f, 0x9d, 0x4a, 0x37, 0x6c, 0xc4, 0x07, 0x3a, 0xdc, 0x30,
+    0xd7, 0x30, 0x81, 0x87, 0xf7, 0xd5, 0xd8, 0x30, 0x3f, 0x48, 0xab, 0xf0, 0x0f, 0x7d, 0x1d, 0xfe,
+    0xf9, 0x22, 0x64, 0x4b, 0x2a, 0x6d, 0x07, 0xe0, 0x2c, 0x81, 0x26, 0xc1, 0xc5, 0xc8, 0x6c, 0x20,
+    0x53, 0x80, 0x01, 0x12, 0xed, 0x31, 0xd5, 0x1a, 0xe8, 0xad, 0x3d, 0x29, 0x08, 0x34, 0x3f, 0x8b,
+    0xdd, 0xf0, 0x76, 0x10, 0xa1, 0x1b, 0x77, 0xae, 0xfd, 0xd7, 0xf4, 0x7c, 0xb2, 0xa0, 0x7c, 0xb8,
+    0x60, 0x3b, 0xc8, 0x7d, 0x08, 0x73, 0xc9, 0x90, 0x3b, 0x02, 0x15, 0xb5, 0xfe, 0xaf, 0xd5, 0x46,
+    0x37, 0x4e, 0xfd, 0x4d, 0xac, 0x95, 0x66, 0x7a, 0xb1, 0x1a, 0x50, 0x0d, 0x8c, 0xe2, 0x9c, 0x65,
+    0x27, 0x53, 0xfa, 0x92, 0xc0, 0x8a, 0x35, 0xea, 0xe8, 0x5c, 0x72, 0x4a, 0xa6, 0x25, 0xf6, 0x7a,
+    0x6a, 0x8c, 0xcf, 0xcb, 0x16, 0x1d, 0x80, 0x69, 0x3a, 0x85, 0x30, 0xf1, 0xb6, 0xf8, 0xac, 0x4c,
+    0x85, 0x51, 0xae, 0xa7, 0x8f, 0x74, 0x5a, 0xad, 0x6a, 0xba, 0x58, 0xd4, 0x1f, 0x03, 0x44, 0xc8,
+    0x40, 0xab, 0xe0, 0x80, 0xde, 0x3f, 0x6d, 0xef, 0x3a, 0x6b, 0xec, 0xb3, 0x0e, 0x01, 0x10, 0xa1,
+    0xf9, 0x60, 0x7a, 0xa7, 0x68, 0xcd, 0xd2, 0xb4, 0x99, 0x43, 0xad, 0x51, 0x43, 0xd9, 0xa2, 0x8a,
+    0x70, 0x5f, 0x1d, 0x11, 0xab, 0x55, 0x7c, 0xde, 0x9f, 0xb6, 0xbc, 0x4f, 0xd4, 0x01, 0x07, 0xcb,
+    0x4c, 0xa1, 0x7f, 0x4c, 0x7d, 0x06, 0x23, 0x21, 0x9c, 0x87, 0xcb, 0xbf, 0xa6, 0xa7, 0x3e, 0x83,
+    0x4a, 0x11, 0x95, 0x84, 0xcd, 0xca, 0xfa, 0x5b, 0xe9, 0xf3, 0xc8, 0xbd, 0xcf, 0x4f, 0x19, 0xf0,
+    0xaf, 0x41, 0x71, 0xda, 0x7a, 0x28, 0xbb, 0x95, 0xd6, 0xa8, 0x0b, 0x3b, 0x70, 0xa1, 0x9f, 0x09,
+    0x23, 0xff, 0x63, 0x8b, 0x92, 0xc2, 0x8f, 0xc5, 0x17, 0x42, 0x82, 0x48, 0x26, 0xcf, 0x06, 0x38,
+    0x90, 0xec, 0xa9, 0xe1, 0x5d, 0xdb, 0x5e, 0x4e, 0x41, 0x72, 0x53, 0xf0, 0x1b, 0x3a, 0x09, 0x39,
+    0x0f, 0x47, 0xbe, 0x28, 0xeb, 0x28, 0x51, 0xa9, 0x88, 0x31, 0x70, 0xc6, 0xbf, 0x02, 0x45, 0xbf,
+    0x43, 0x18, 0x07, 0x97, 0x73, 0xa2, 0x48, 0xed, 0xaf, 0x77, 0xcd, 0x2b, 0x32, 0x35, 0x47, 0xb0,
+    0xea, 0xab, 0x25, 0xfd, 0x02, 0xaa, 0x0f, 0x2c, 0xf6, 0x68, 0xee, 0xef, 0x90, 0xf5, 0xb9, 0xaf,
+    0x05, 0x39, 0x14, 0x87, 0x7f, 0xa1, 0xf3, 0xf7, 0x5f, 0xbe, 0xb9, 0xbe, 0x8a, 0xba, 0x38, 0x6c,
+    0xc8, 0x83, 0x4b, 0xdf, 0x62, 0xa0, 0x0d, 0x29, 0x04, 0x54, 0xa5, 0xec, 0x97, 0x1d, 0xa2, 0x02,
+    0x88, 0x46, 0x47, 0x25, 0x34, 0x57, 0x20, 0xb7, 0x44, 0x77, 0x08, 0xf0, 0xfa, 0xc6, 0xf6, 0x51,
+    0xd8, 0xd9, 0xd9, 0xfa, 0xa0, 0x46, 0xa6, 0x09, 0x9f, 0x35, 0xf3, 0xb6, 0xa0, 0x66, 0x0c, 0x08,
+    0x15, 0xdc, 0x06, 0x48, 0x7f, 0xbd, 0x1d, 0x84, 0xec, 0x5c, 0x12, 0xb7, 0x34, 0x0e, 0x3c, 0x1e,
+    0x37, 0x07, 0x0a, 0xf8, 0x02, 0x2d, 0xf6, 0x0b, 0x85, 0x83, 0x0a, 0x72, 0x42, 0x5d, 0x22, 0x9c,
+    0xf0, 0x87, 0x57, 0x7d, 0xeb, 0x33, 0x84, 0x55, 0x3d, 0x28, 0x0d, 0xf8, 0x54, 0x40, 0xba, 0xfb,
+    0x18, 0xa6, 0x3c, 0x50, 0x8b, 0xfc, 0x51, 0x3e, 0x35, 0xf8, 0xa2, 0x9d, 0x95, 0xf5, 0x6f, 0xd1,
+    0x01, 0x77, 0x7a, 0x9c, 0xd4, 0x00, 0xc0, 0x73, 0x18, 0xd8, 0xce, 0x23, 0x70, 0x8c, 0xc0, 0xe3,
+    0x5d, 0x0b, 0x35, 0x63, 0x91, 0x71, 0x69, 0x34, 0x68, 0x7b, 0x4d, 0xe8, 0x38, 0xd2, 0x00, 0x6d,
+    0x8b, 0xc5, 0x7c, 0x3b, 0x41, 0x7f, 0x39, 0x9e, 0x7a, 0x53, 0x55, 0xb9, 0x6d, 0x84, 0xeb, 0x88,
+    0x49, 0xc8, 0x20, 0x69, 0x4b, 0xbd, 0xdd, 0x2d, 0x71, 0x8b, 0x76, 0x8e, 0x32, 0x81, 0xaf, 0xf2,
+    0x00, 0x72, 0x8c, 0x50, 0x9a, 0x20, 0xc6, 0xaf, 0x6d, 0x9c, 0x97, 0x41, 0x2d, 0x56, 0xcf, 0xa6,
+    0x39, 0x84, 0xb4, 0xb1, 0xb7, 0x8f, 0x23, 0xfc, 0x92, 0xe2, 0xed, 0x2b, 0xc4, 0x37, 0x00, 0x82,
+    0x71, 0x27, 0x4c, 0xb5, 0x1f, 0x0f, 0x90, 0x41, 0xbb, 0xf4, 0x27, 0x0e, 0x3c, 0xef, 0x77, 0xba,
+    0x28, 0xcf, 0xc5, 0x78, 0x4b, 0x1f, 0xa0, 0xa8, 0x15, 0x33, 0x3b, 0x82, 0xf3, 0x3f, 0xbe, 0x1c,
+    0xa3, 0xc1, 0x12, 0x9b, 0x54, 0x4a, 0xd2, 0xb7, 0x74, 0x95, 0xfa, 0x0d, 0xe0, 0x28, 0x35, 0xc1,
+    0x35, 0xaa, 0x65, 0xab, 0xfe, 0x86, 0x9c, 0xa8, 0xf7, 0x88, 0x06, 0x17, 0x27, 0xcf, 0x01, 0xd7,
+    0x75, 0x7b, 0x8c, 0x80, 0x26, 0xdd, 0xe0, 0x4e, 0x87, 0x55, 0x1c, 0x69, 0x73, 0xfc, 0xb6, 0x91,
+    0x42, 0x57, 0xd5, 0x9f, 0xcb, 0xbf, 0x78, 0xd0, 0x68, 0x05, 0xe7, 0x84, 0x4b, 0xde, 0xd8, 0xdd,
+    0x10, 0xd3, 0xbf, 0xa9, 0xbd, 0xc9, 0xc0, 0x8d, 0x77, 0x48, 0x68, 0xd6, 0x92, 0x15, 0x9a, 0x4c,
+    0xd3, 0xa2, 0x94, 0x42, 0x00, 0x91, 0xdc, 0x59, 0x9f, 0x99, 0xc0, 0x80, 0x63, 0xd9, 0x19, 0xfa,
+    0xe3, 0x59, 0x25, 0xf9, 0x26, 0x89, 0xd9, 0x5b, 0x0e, 0xbd, 0xd5, 0x82, 0xdd, 0xc7, 0x8c, 0xb5,
+    0x7b, 0xa2, 0x5c, 0xae, 0xab, 0x20, 0x5f, 0xe9, 0xed, 0x98, 0x1a, 0xac, 0xbb, 0xff, 0xd9, 0x34,
+    0xd5, 0xa1, 0xc0, 0xc5, 0x35, 0x6b, 0x19, 0x51, 0xfc, 0x24, 0xe0, 0x00, 0xc9, 0xa0, 0x73, 0x46,
+    0x54, 0x0f, 0x2c, 0xbc, 0xf6, 0x5d, 0xe9, 0xb7, 0x48, 0xe9, 0x48, 0x23, 0x11, 0x05, 0xe5, 0xd6,
+    0x57, 0xff, 0xf6, 0x21, 0x7f, 0x3b, 0xda, 0xad, 0xbd, 0x9c, 0xdf, 0x06, 0x41, 0x24, 0x7d, 0xfd,
+    0xee, 0x23, 0x55, 0x35, 0x6b, 0x69, 0x32, 0x39, 0x46, 0xf8, 0xee, 0x51, 0x62, 0xbd, 0x85, 0xa9,
+    0x5b, 0x12, 0x1f, 0x2c, 0x2f, 0xdc, 0x2d, 0x4e, 0xbd, 0x0a, 0xd8, 0xfc, 0x2a, 0xd8, 0x7c, 0x52,
+    0xe6, 0x95, 0xa3, 0x10, 0x88, 0xcd, 0xc6, 0xd0, 0x94, 0x97, 0x25, 0x5f, 0xd3, 0xd2, 0x0d, 0xff,
+    0x8a, 0x09, 0x77, 0xcb, 0x79, 0xf7, 0xcb, 0x4c, 0x40, 0xae, 0xbc, 0x1b, 0xd9, 0xf7, 0xa1, 0x7c,
+    0x87, 0xbe, 0xbe, 0x0d, 0xcb, 0x5a, 0x73, 0x34, 0x3c, 0x5e, 0x76, 0x38, 0x5a, 0xc5, 0xac, 0x2d,
+    0x2c, 0x35, 0x46, 0x34, 0xfa, 0x40, 0x63, 0x5b, 0x16, 0xd2, 0x5f, 0xe1, 0xc1, 0x01, 0x6a, 0xcb,
+    0xd3, 0x40, 0x72, 0x63, 0x83, 0x7a, 0x30, 0x34, 0xc3, 0xd7, 0x2e, 0xbb, 0x71, 0x39, 0xf3, 0xa3,
+    0x2a, 0xe9, 0x5e, 0x3e, 0x77, 0x7c, 0x44, 0xb0, 0x7d, 0xd5, 0xb8, 0x2e, 0xea, 0xfc, 0xad, 0x43,
+    0x74, 0xd6, 0xa3, 0xcd, 0x11, 0x79, 0x34, 0x0f, 0x9e, 0xbd, 0xc2, 0x77, 0xef, 0x6d, 0x6a, 0x81,
+    0x0e, 0x6d, 0xa8, 0x70, 0xaa, 0xa0, 0xa6, 0xc1, 0xd8, 0x94, 0x69, 0x0d, 0x44, 0x02, 0x0f, 0x10,
+    0x7c, 0x53, 0x5f, 0xd1, 0x80, 0x5c, 0x2d, 0x81, 0x43, 0x40, 0xf1, 0x01, 0x54, 0x84, 0x5f, 0x05,
+    0x3b, 0xa8, 0x62, 0xa6, 0x0a, 0xff, 0x1a, 0x33, 0x36, 0x1f, 0xe1, 0xfd, 0xbc, 0x0e, 0x73, 0xee,
+    0xa8, 0x2e, 0x6c, 0xde, 0x13, 0xc8, 0xf1, 0x29, 0x9b, 0x2c, 0x43, 0x5e, 0x59, 0x82, 0x32, 0xc4,
+    0x33, 0xd6, 0xec, 0xc4, 0x06, 0x96, 0xef, 0x36, 0x52, 0x79, 0x3d, 0xff, 0x8c, 0x1b, 0x40, 0x99,
+    0xbc, 0x90, 0x30, 0x68, 0x80, 0x93, 0x5c, 0x58, 0xf2, 0x4f, 0xf3, 0xa4, 0xaf, 0xb5, 0x78, 0xf8,
+    0x36, 0x5e, 0x96, 0x03, 0x09, 0x11, 0x13, 0xc2, 0xee, 0x01, 0xfd, 0x2d, 0x6d, 0xd5, 0x26, 0xae,
+    0xc0, 0xc0, 0xf7, 0x7d, 0x6c, 0x9d, 0xc2, 0x20, 0xd8, 0xb6, 0x9a, 0x8e, 0xf2, 0x51, 0xd6, 0xd6,
+    0xcb, 0x6b, 0x92, 0xdf, 0x95, 0xd3, 0xb1, 0xb8, 0x29, 0xf8, 0x4d, 0x69, 0x33, 0x9f, 0xa5, 0xfa,
+    0xac, 0x84, 0x01, 0xfa, 0x71, 0xeb, 0x77, 0x97, 0xa2, 0x55, 0xe5, 0x24, 0x02, 0xaf, 0xfa, 0x62,
+    0xe8, 0x99, 0x41, 0xf2, 0x08, 0xd6, 0xf6, 0x40, 0x76, 0xfe, 0xe0, 0x42, 0x44, 0x36, 0x7b, 0xaa,
+    0xe0, 0x0f, 0x58, 0xd8, 0x01, 0x81, 0x3a, 0x5a, 0x44, 0x7d, 0x4b, 0xf3, 0x55, 0xd7, 0x67, 0x51,
+    0xdd, 0x4f, 0xbf, 0x52, 0x97, 0x87, 0x6c, 0xd7, 0x69, 0x22, 0xf5, 0x99, 0x07, 0xdf, 0x56, 0x11,
+    0x59, 0x34, 0xfb, 0xa6, 0x7e, 0x2b, 0xf7, 0x7d, 0x77, 0x94, 0xa5, 0x94, 0xd1, 0x9e, 0x96, 0x1d,
+    0x15, 0x43, 0x86, 0xcb, 0x4a, 0xe4, 0x98, 0x42, 0x9b, 0xab, 0xd5, 0x2d, 0x2a, 0x43, 0x4f, 0x02,
+    0x73, 0x48, 0x11, 0x46, 0x1f, 0x77, 0xe5, 0x56, 0xdd, 0x60, 0xea, 0x06, 0xd1, 0x19, 0x87, 0x88,
+    0x0f, 0x8b, 0xcf, 0xcc, 0x23, 0x3a, 0xc1, 0x55, 0xa7, 0x23, 0xbd, 0xce, 0xb4, 0xb2, 0x38, 0x16,
+    0xb4, 0x6a, 0x4e, 0x6f, 0x6c, 0x3e, 0x8b, 0x18, 0x39, 0xed, 0xa7, 0x03, 0xa8, 0x21, 0xf2, 0xd6,
+    0xa2, 0xd0, 0xa6, 0xff, 0x21, 0xc6, 0xa7, 0xe4, 0x8f, 0xe0, 0xff, 0xb6, 0xfc, 0x9f, 0xed, 0x9e,
+    0x2a, 0xa9, 0x18, 0x7e, 0x03, 0x7a, 0xfe, 0x64, 0xcd, 0x1c, 0x2e, 0x5c, 0x76, 0x3c, 0xda, 0x0e,
+    0x0a, 0x4b, 0xb9, 0xe3, 0xd3, 0x55, 0x04, 0x90, 0xf2, 0xa1, 0x68, 0x24, 0xf7, 0xee, 0x77, 0x87,
+    0x2d, 0xec, 0x2f, 0x0a, 0x3e, 0xcb, 0x14, 0xd5, 0xe7, 0xf6, 0xeb, 0xd7, 0x68, 0x5e, 0x6a, 0xf4,
+    0x34, 0xed, 0x05, 0x5d, 0xd0, 0xa6, 0x2c, 0xfd, 0xd1, 0x10, 0x42, 0x64, 0x9f, 0x5d, 0xb8, 0x16,
+    0xf5, 0xe6, 0xa0, 0x18, 0x44, 0xb6, 0x1d, 0x97, 0xdd, 0x71, 0xb4, 0x54, 0x6c, 0xf7, 0x4c, 0xe8,
+    0xab, 0x1a, 0xc2, 0x5e, 0x05, 0x81, 0x60, 0x18, 0x20, 0x78, 0x42, 0x9a, 0xf4, 0x1f, 0x30, 0x7b,
+    0x08, 0x63, 0xf7, 0x01, 0x48, 0xdd, 0xf8, 0x2f, 0xef, 0x43, 0x0b, 0x70, 0xac, 0xb3, 0x4b, 0xe8,
+    0x5b, 0x47, 0x50, 0xb2, 0xae, 0xb2, 0x12, 0x97, 0x81, 0xe7, 0x4f, 0x39, 0x1e, 0xbe, 0xa1, 0xa8,
+    0xac, 0x26, 0x14, 0x6c, 0x9e, 0x24, 0x98, 0x45, 0xec, 0x5e, 0xc3, 0x71, 0x89, 0xb9, 0x19, 0x6b,
+    0x11, 0x9a, 0x42, 0xad, 0x42, 0x18, 0x2b, 0xdb, 0x0d, 0x78, 0x93, 0xea, 0x9f, 0x0f, 0xfe, 0x6d,
+    0x2b, 0x6a, 0xab, 0x9a, 0xa1, 0x3a, 0x5b, 0x02, 0xe7, 0x9d, 0xf4, 0x7a, 0x1f, 0x04, 0x91, 0x89,
+    0x8f, 0x81, 0x03, 0xb2, 0x75, 0xc8, 0x7a, 0x7e, 0x42, 0x61, 0x93, 0xd6, 0xef, 0x8d, 0x36, 0x4a,
+    0x8e, 0x76, 0x2a, 0x67, 0x44, 0xaf, 0x3c, 0x6e, 0x2e, 0x6f, 0xe4, 0x7a, 0xdd, 0x81, 0x97, 0xc9,
+    0x02, 0x0d, 0x0a, 0x9c, 0xca, 0x5e, 0x97, 0xd3, 0x85, 0xfd, 0x2b, 0x25, 0x3c, 0x90, 0xf0, 0xc1,
+    0x09, 0xa0, 0x46, 0xdd, 0x78, 0x37, 0x60, 0xf4, 0x48, 0x44, 0xb1, 0x9d, 0x71, 0xa2, 0x95, 0x59,
+    0x8f, 0x22, 0x7f, 0x93, 0xaf, 0xe0, 0x22, 0x75, 0x3b, 0x5d, 0x85, 0x66, 0x28, 0x94, 0xc9, 0xe7,
+    0x1e, 0x33, 0x67, 0x9c, 0x96, 0x44, 0x0a, 0xac, 0xa6, 0x5d, 0xfb, 0xfb, 0x38, 0xbf, 0x83, 0x36,
+    0xf1, 0x29, 0xfc, 0xc0, 0xdf, 0x49, 0x63, 0x2d, 0xc4, 0xb5, 0xed, 0x6e, 0xae, 0x74, 0x42, 0xea,
+    0xbc, 0x98, 0xc3, 0x65, 0x20, 0x9c, 0xdc, 0x84, 0x0d, 0x3c, 0x1d, 0xc2, 0xb6, 0xb1, 0xe3, 0x0d,
+    0xc6, 0xe7, 0x19, 0xb2, 0x35, 0xe0, 0x06, 0xdb, 0xfd, 0x56, 0x5c, 0x35, 0x75, 0x0f, 0x51, 0x6b,
+    0x02, 0xdd, 0xdf, 0x66, 0xef, 0x35, 0x6a, 0x6e, 0x72, 0x5e, 0x27, 0x58, 0xc1, 0x80, 0x5f, 0xc2,
+    0x2a, 0x0f, 0x60, 0xf3, 0xbd, 0x34, 0xf2, 0x2e, 0x9d, 0x63, 0xba, 0x12, 0x92, 0x37, 0x11, 0x81,
+    0x2d, 0xee, 0x14, 0xc6, 0x40, 0x7e, 0xd9, 0x5e, 0x6b, 0xeb, 0x3e, 0x83, 0x39, 0xe5, 0x0c, 0x90,
+    0xce, 0x78, 0xbd, 0xae, 0xbd, 0x61, 0xd6, 0x46, 0xa1, 0xcd, 0xac, 0xf6, 0xc6, 0xd4, 0xfe, 0xfc,
+    0x91, 0xe4, 0x25, 0xbc, 0xde, 0x38, 0x64, 0xde, 0x9e, 0x66, 0xc6, 0xfe, 0xc4, 0x92, 0x4b, 0x0a,
+    0x3d, 0xcc, 0xcc, 0xac, 0x8d, 0x21, 0xa6, 0x66, 0xb5, 0xbf, 0xc6, 0x1d, 0x4e, 0x78, 0xc2, 0xc2,
+    0x2d, 0x5f, 0x34, 0x95, 0x13, 0x98, 0xb2, 0x60, 0x78, 0xed, 0x5c, 0x7f, 0xd5, 0x56, 0x12, 0xef,
+    0x65, 0x44, 0xe1, 0xf3, 0xc8, 0x28, 0x8e, 0xe5, 0x71, 0x60, 0x03, 0xbe, 0x65, 0xb6, 0x8a, 0xf8,
+    0x84, 0xe8, 0xb3, 0xbb, 0xb7, 0xcc, 0xb9, 0x49, 0xac, 0x77, 0xbd, 0x65, 0x92, 0xcb, 0x1e, 0x0b,
+    0x09, 0x6e, 0x4a, 0x89, 0xe0, 0x1e, 0x82, 0x9f, 0x0d, 0xca, 0xc7, 0xab, 0xe8, 0x69, 0x5c, 0x4e,
+    0xd7, 0x89, 0x1e, 0xe1, 0x5a, 0xa3, 0x50, 0xf0, 0x71, 0x61, 0x27, 0x8d, 0xab, 0x70, 0xf8, 0xe9,
+    0x63, 0x67, 0xbb, 0x00, 0x6e, 0x80, 0x29, 0x3c, 0xe9, 0x7b, 0xcf, 0x37, 0x5c, 0x8d, 0x58, 0x77,
+    0x2f, 0xfa, 0xe9, 0x57, 0xc6, 0xf1, 0xf6, 0x10, 0x9b, 0xc5, 0x5d, 0x5f, 0x95, 0x19, 0x37, 0xa4,
+    0x45, 0x4f, 0x3d, 0x95, 0x28, 0x9d, 0x1d, 0x73, 0xa2, 0xeb, 0xa6, 0x73, 0x01, 0xd7, 0x9b, 0xe2,
+    0x38, 0x4a, 0xb0, 0xc6, 0x59, 0x3f, 0x98, 0x6f, 0xd8, 0x25, 0xe1, 0x38, 0xb3, 0x21, 0x33, 0xaf,
+    0xce, 0x0f, 0x56, 0xac, 0x6b, 0x8d, 0x65, 0xb3, 0x47, 0xee, 0xbe, 0x6f, 0x0c, 0x22, 0x39, 0x4c,
+    0x44, 0x20, 0x05, 0x0f, 0xf2, 0x66, 0x6a, 0xb5, 0x59, 0xb7, 0x0d, 0x4f, 0x87, 0xb7, 0xba, 0x57,
+    0x98, 0x42, 0xae, 0x67, 0x47, 0xcf, 0x61, 0xcd, 0x68, 0x28, 0x18, 0x34, 0xbe, 0x75, 0x9c, 0xcb,
+    0x72, 0xbc, 0x3b, 0xed, 0x7f, 0x00, 0xb9, 0x2a, 0x22, 0x93, 0x8f, 0x2a, 0x5d, 0x0a, 0xd4, 0xae,
+    0x76, 0xf5, 0x61, 0xe6, 0x6c, 0xef, 0xa6, 0xc0, 0xc2, 0xd0, 0xbb, 0x90, 0x74, 0xfe, 0x3a, 0x0e,
+    0xfd, 0xc6, 0xac, 0x75, 0x77, 0xa9, 0x98, 0x01, 0x1f, 0x30, 0x4d, 0xd8, 0x4e, 0xa0, 0xc1, 0x39,
+    0x8e, 0xc5, 0xfc, 0x5e, 0xba, 0xcf, 0x37, 0x98, 0x44, 0x12, 0x76, 0x88, 0x66, 0xc3, 0xe2, 0xe1,
+    0x83, 0x72, 0x0a, 0xc9, 0x0a, 0xe2, 0xde, 0x5d, 0x7e, 0x4e, 0x48, 0x4e, 0x4d, 0xb9, 0xa3, 0x1e,
+    0xda, 0x43, 0xbe, 0x6d, 0x85, 0xc2, 0xfe, 0x1e, 0x6a, 0xb3, 0xcc, 0x63, 0x65, 0xb5, 0x5a, 0xf2,
+    0x83, 0x01, 0x27, 0x72, 0x2d, 0x83, 0x7b, 0xf3, 0x00, 0x82, 0x74, 0x8a, 0x59, 0x0a, 0x87, 0x85,
+    0x34, 0xba, 0x7f, 0x39, 0xdb, 0x02, 0xec, 0x2a, 0xe2, 0x04, 0x6f, 0xc9, 0x6c, 0x21, 0x63, 0xed,
+    0x5b, 0x46, 0x77, 0xc0, 0xd9, 0xa6, 0xd0, 0x3e, 0x40, 0xa3, 0xb8, 0x26, 0x40, 0x70, 0x29, 0x49,
+    0xcc, 0x90, 0x73, 0xf8, 0x1d, 0x24, 0xae, 0xa7, 0x84, 0xa4, 0x35, 0xe7, 0x02, 0xbf, 0x6d, 0x89,
+    0x58, 0x2e, 0x54, 0x79, 0xef, 0x6f, 0x3a, 0x19, 0xa8, 0xbf, 0xc0, 0xe6, 0x16, 0xee, 0xbb, 0x9b,
+    0x06, 0xa0, 0x3a, 0x9e, 0x90, 0x77, 0x7c, 0xf8, 0x1c, 0x4f, 0x64, 0x72, 0x3a, 0x77, 0x9a, 0x2f,
+    0xb6, 0xa4, 0x7a, 0x1f, 0x0f, 0xbe, 0x07, 0x16, 0x41, 0xb5, 0x22, 0x65, 0x5b, 0xc5, 0x4b, 0x0c,
+    0xc6, 0xb8, 0x5f, 0xd0, 0xa2, 0x40, 0x6d, 0x1b, 0xc4, 0xd8, 0xd9, 0x18, 0x07, 0xd2, 0xc9, 0x55,
+    0x15, 0xba, 0xee, 0x3d, 0xc1, 0xd9, 0xe2, 0xf5, 0x03, 0x4b, 0x00, 0x41, 0xdb, 0x4e, 0x20, 0x64,
+    0xcb, 0x16, 0x38, 0xe3, 0x7d, 0x47, 0x77, 0x1d, 0xf7, 0x27, 0xce, 0x67, 0x01, 0xd4, 0x7b, 0x3b,
+    0xaf, 0x89, 0xb2, 0x5f, 0xb4, 0x37, 0x66, 0x2c, 0xac, 0x7e, 0x27, 0xd6, 0xbb, 0xfc, 0x58, 0x17,
+    0x9f, 0xcc, 0x7c, 0x13, 0x44, 0xb3, 0xd7, 0xfe, 0xd5, 0xae, 0x75, 0x29, 0xba, 0x80, 0x7e, 0xf4,
+    0x84, 0x19, 0x63, 0x56, 0x37, 0x2a, 0x32, 0x09, 0x25, 0x3b, 0x39, 0xb9, 0x9a, 0xbe, 0x03, 0x18,
+    0x9e, 0x1c, 0xe1, 0x8a, 0x0c, 0x1f, 0xfb, 0xcf, 0xd1, 0xd7, 0x96, 0x6f, 0xc7, 0xda, 0x57, 0x81,
+    0x98, 0x09, 0x1f, 0x48, 0x91, 0x1c, 0x1a, 0x1d, 0xba, 0xe8, 0x52, 0x42, 0x8d, 0x63, 0xc7, 0xd6,
+    0x67, 0xca, 0xcc, 0xdb, 0x56, 0xba, 0x2c, 0x89, 0xdc, 0xa2, 0xaf, 0x8c, 0x61, 0xdc, 0x56, 0x11,
+    0x33, 0xd4, 0xa8, 0x3c, 0x32, 0x51, 0xe2, 0x4a, 0x80, 0xd6, 0x76, 0x66, 0x0f, 0x72, 0x8a, 0xe1,
+    0x6d, 0xd7, 0xb3, 0x2e, 0x3e, 0xe0, 0x48, 0x63, 0xd8, 0x3f, 0xff, 0x5d, 0x1e, 0x3d, 0xbe, 0xf2,
+    0xa5, 0x3a, 0xb4, 0x94, 0xe8, 0xab, 0x77, 0xca, 0xc8, 0x98, 0x18, 0xde, 0xdb, 0xa0, 0xef, 0x3b,
+    0xe5, 0x67, 0xc0, 0x9e, 0xf5, 0x92, 0xbd, 0xfd, 0x3c, 0xde, 0xd5, 0x19, 0x4a, 0x8d, 0xf5, 0x7c,
+    0xd5, 0x03, 0x4e, 0x69, 0x2a, 0x6f, 0x80, 0xca, 0x0f, 0xed, 0x7b, 0xb2, 0xc2, 0x02, 0x85, 0xe4,
+    0xf1, 0x39, 0xcc, 0xfe, 0x04, 0xcd, 0xa6, 0x62, 0x85, 0x13, 0xcc, 0x83, 0x4d, 0xa3, 0xbd, 0xa8,
+    0x8d, 0xa5, 0x04, 0xda, 0x32, 0x53, 0x74, 0x71, 0x5c, 0x91, 0x67, 0x0e, 0x83, 0x38, 0x98, 0xdd,
+    0x48, 0x83, 0xcf, 0xc9, 0xed, 0x7b, 0xef, 0xc3, 0x95, 0x77, 0xe3, 0xf1, 0x53, 0x0d, 0xd6, 0xde,
+    0xef, 0xb4, 0x1b, 0xb9, 0x27, 0x1a, 0xe9, 0xc3, 0x93, 0xe4, 0xb5, 0xb2, 0x1b, 0x9d, 0x95, 0x4c,
+    0xf2, 0xfb, 0x9d, 0x90, 0x86, 0xc9, 0x67, 0xce, 0x0d, 0x50, 0x7a, 0x48, 0x34, 0x54, 0x2c, 0x10,
+    0x8f, 0x9a, 0x19, 0x63, 0x16, 0x97, 0xd8, 0x5a, 0xba, 0x83, 0x93, 0x08, 0x75, 0x3c, 0xa2, 0x91,
+    0x98, 0xe3, 0x89, 0x46, 0x4e, 0xc3, 0x92, 0xb6, 0xa7, 0x21, 0xaf, 0x43, 0xe2, 0x70, 0xea, 0xd4,
+    0xa6, 0x7a, 0xf3, 0x6b, 0x4e, 0x46, 0x3e, 0xa2, 0x55, 0x83, 0xea, 0xb8, 0x04, 0xf0, 0x55, 0xd0,
+    0x14, 0xf7, 0x71, 0x3a, 0xc1, 0x6b, 0x67, 0x6c, 0x68, 0xa5, 0xa1, 0x48, 0x27, 0x3c, 0xa3, 0x6c,
+    0x30, 0x01, 0x4b, 0xab, 0x3d, 0xb7, 0xcc, 0x85, 0xff, 0x56, 0x2a, 0x8e, 0x02, 0x41, 0xc5, 0xed,
+    0x6e, 0x21, 0x52, 0x78, 0x4f, 0x53, 0xac, 0x42, 0xb9, 0x8d, 0x13, 0xbf, 0xf1, 0xb4, 0x09, 0x2d,
+    0x63, 0x79, 0xce, 0xc7, 0x74, 0x46, 0xdc, 0x20, 0xe6, 0x80, 0xda, 0xaa, 0x11, 0x4d, 0x1b, 0xf9,
+    0x7b, 0x87, 0x8d, 0x79, 0xa5, 0x72, 0x27, 0x58, 0xfb, 0x36, 0x2b, 0x7c, 0xc3, 0xea, 0xa3, 0x06,
+    0x76, 0x98, 0x2a, 0x13, 0x51, 0x90, 0xe2, 0x0f, 0xee, 0x3e, 0x36, 0xd6, 0x8a, 0x37, 0xcb, 0x6f,
+    0xd6, 0xaf, 0x45, 0xcc, 0xf5, 0xe6, 0x56, 0x2e, 0xd3, 0x75, 0x48, 0xf0, 0x6e, 0xb2, 0x40, 0x0c,
+    0x57, 0x30, 0x3a, 0xa9, 0x64, 0x12, 0x07, 0x61, 0x1d, 0x92, 0xd9, 0xc7, 0x5b, 0xa5, 0x9f, 0x41,
+    0xd5, 0xa9, 0x3c, 0x4e, 0x3a, 0x92, 0x7a, 0x49, 0xc9, 0xc8, 0x64, 0x9b, 0xf5, 0xcb, 0x7a, 0x37,
+    0xcc, 0x27, 0x9a, 0xb6, 0xac, 0x9f, 0x07, 0x6a, 0x49, 0xfa, 0xb6, 0xd9, 0xb4, 0xab, 0x18, 0xaa,
+    0x26, 0x64, 0xc9, 0x4a, 0xab, 0x0b, 0x74, 0xa0, 0xa3, 0xa9, 0x80, 0xfd, 0x9f, 0x92, 0x86, 0xfc,
+    0xae, 0x45, 0xae, 0x5f, 0x3e, 0x3d, 0x54, 0x2f, 0x4b, 0x8f, 0xe9, 0x83, 0x2b, 0x30, 0xfd, 0x64,
+    0x38, 0x95, 0xb9, 0x3c, 0xd1, 0x1e, 0x11, 0x3e, 0x2a, 0x25, 0xad, 0x2a, 0x9c, 0x57, 0x37, 0xf5,
+    0x2f, 0x34, 0xea, 0xf4, 0x72, 0x6e, 0xee, 0xe7, 0xe4, 0xd8, 0x87, 0x5d, 0x3e, 0x6c, 0x76, 0xdb,
+    0xda, 0xcc, 0x11, 0xf3, 0x64, 0x96, 0x4a, 0x85, 0xe9, 0xff, 0x4a, 0x1e, 0xbc, 0xe3, 0x7c, 0x84,
+    0xc4, 0x5c, 0xeb, 0x17, 0x63, 0x3d, 0xf8, 0x62, 0xc7, 0x77, 0xea, 0x49, 0x11, 0xb7, 0x0f, 0x75,
+    0xd8, 0x27, 0xea, 0x34, 0x9f, 0x08, 0xfb, 0x47, 0xad, 0x9e, 0x79, 0x05, 0x04, 0x08, 0x4a, 0x23,
+    0x47, 0xcb, 0xfb, 0xbc, 0x79, 0x3c, 0x8b, 0x2a, 0x44, 0x2a, 0xd0, 0x62, 0x7e, 0xe2, 0x00, 0x37,
+    0xbc, 0x07, 0x17, 0xb3, 0x16, 0xe2, 0x73, 0x1a, 0x5d, 0x8c, 0xdd, 0x16, 0x3a, 0x28, 0x15, 0x73,
+    0x4e, 0xbf, 0x9c, 0x08, 0x25, 0xd8, 0x9f, 0xb9, 0x90, 0xce, 0x2d, 0x5d, 0x3f, 0x7c, 0xac, 0xca,
+    0x07, 0x9c, 0x1d, 0x34, 0x30, 0x66, 0x06, 0xc9, 0xb8, 0xe6, 0x53, 0xd4, 0xc7, 0xd9, 0xf4, 0xa4,
+    0x89, 0xd6, 0x24, 0xb7, 0xd0, 0xd0, 0xa6, 0x82, 0x3b, 0xda, 0xce, 0xc2, 0x77, 0xf2, 0xd4, 0xb7,
+    0x1d, 0xe7, 0x49, 0xa9, 0x82, 0x28, 0xd6, 0x95, 0x6b, 0x77, 0xd9, 0xb8, 0xaa, 0x95, 0xc0, 0xbe,
+    0xb2, 0x44, 0xcc, 0xb4, 0x10, 0xdc, 0x6a, 0xfa, 0x2d, 0x6b, 0x7a, 0xac, 0x7a, 0xa7, 0xfa, 0x00,
+    0xeb, 0x6c, 0x71, 0x0a, 0xd3, 0xf8, 0x4c, 0x9c, 0xc2, 0xfa, 0xb5, 0x73, 0x01, 0xe0, 0x62, 0xd4,
+    0x74, 0xe9, 0xdf, 0x88, 0xda, 0x5b, 0x00, 0x66, 0xbd, 0x16, 0x0b, 0x54, 0x68, 0x96, 0x95, 0xde,
+    0x15, 0x12, 0x08, 0x12, 0xf0, 0xca, 0xc5, 0x1f, 0x5a, 0xa0, 0x37, 0x06, 0xe0, 0xb0, 0x0c, 0xf6,
+    0xd7, 0x17, 0x63, 0x1b, 0xc7, 0x27, 0xed, 0x0b, 0xa6, 0x4e, 0x59, 0x3c, 0x8e, 0xd9, 0x22, 0x47,
+    0x04, 0x60, 0x52, 0xee, 0x19, 0xe3, 0x6c, 0xe4, 0xcf, 0x2f, 0x25, 0x2d, 0x73, 0x10, 0x54, 0x80,
+    0x38, 0xbd, 0x4c, 0x27, 0x23, 0x2d, 0x91, 0xa7, 0xb4, 0x59, 0x83, 0xd4, 0xbd, 0x2f, 0x1c, 0x88,
+    0x4a, 0xb8, 0xe2, 0xa4, 0x8f, 0xf1, 0x47, 0xc6, 0x3f, 0x51, 0x41, 0x23, 0xe2, 0x4a, 0x79, 0x49,
+    0x20, 0xe4, 0x92, 0xe3, 0x9c, 0xa8, 0xf4, 0x32, 0xc0, 0xd0, 0xd4, 0x79, 0xc9, 0x13, 0xf5, 0xd0,
+    0x74, 0xba, 0x77, 0x20, 0xd8, 0xcb, 0x57, 0xfe, 0x8c, 0xb4, 0x7b, 0xa2, 0x12, 0xe9, 0x81, 0x74,
+    0x3b, 0x59, 0xda, 0xd3, 0x3c, 0xb7, 0xd1, 0x85, 0x04, 0xa3, 0x7f, 0x76, 0x5c, 0x50, 0xb0, 0x52,
+    0xaf, 0x0a, 0x9b, 0xc9, 0x3d, 0x64, 0x0f, 0x79, 0x13, 0x58, 0x3e, 0x60, 0x66, 0xe9, 0x8f, 0x39,
+    0x85, 0x63, 0x90, 0x0c, 0x69, 0xfd, 0x91, 0x4d, 0x57, 0xf6, 0x4f, 0x1e, 0x0f, 0x80, 0x43, 0xf1,
+    0xd2, 0x1a, 0x23, 0x02, 0xc9, 0xd2, 0x1e, 0xc5, 0x94, 0x9f, 0x27, 0x49, 0xc9, 0xb8, 0x46, 0xcd,
+    0xd3, 0x4f, 0x05, 0x01, 0x7c, 0xea, 0xe3, 0xe9, 0x96, 0x75, 0xa5, 0xec, 0xb5, 0x80, 0x84, 0x5b,
+    0x13, 0x99, 0x19, 0xad, 0x99, 0xc8, 0x34, 0x79, 0x32, 0xb0, 0x8f, 0xc6, 0xfe, 0xb2, 0xa6, 0xf2,
+    0xda, 0xc7, 0x5a, 0x05, 0x2e, 0xd3, 0x65, 0xb3, 0x7c, 0x83, 0x84, 0x8d, 0xe4, 0x55, 0x22, 0xbc,
+    0xdc, 0xde, 0x8f, 0xcd, 0xc3, 0x13, 0x8b, 0x52, 0xd7, 0x9f, 0x0d, 0xf9, 0x80, 0x99, 0xbf, 0x70,
+    0xbb, 0xeb, 0xe4, 0x37, 0x9f, 0xda, 0x13, 0x68, 0xbd, 0x23, 0x18, 0x30, 0x04, 0x68, 0x92, 0xa0,
+    0x48, 0x85, 0x72, 0xb4, 0x48, 0x3c, 0x1b, 0xbc, 0x86, 0x89, 0xd5, 0xee, 0x41, 0x35, 0x68, 0xf9,
+    0x14, 0x6f, 0x60, 0x9c, 0x5f, 0xaf, 0x3b, 0x6f, 0x1e, 0x8b, 0x30, 0xa0, 0x49, 0x8c, 0xed, 0x46,
+    0xb7, 0x2b, 0xf6, 0x9e, 0x2f, 0xb3, 0xd8, 0xeb, 0x56, 0x3c, 0xbf, 0xff, 0x21, 0x5c, 0x32, 0x0b,
+    0x83, 0x0f, 0x33, 0x90, 0x27, 0x99, 0x45, 0xf6, 0xb2, 0x47, 0x07, 0xda, 0x61, 0x46, 0x27, 0x63,
+    0x6f, 0xf6, 0x58, 0xca, 0x59, 0x76, 0xb0, 0x2d, 0x67, 0xe6, 0x11, 0xd8, 0x03, 0x13, 0x39, 0x8a,
+    0xd5, 0x69, 0xaa, 0x72, 0x70, 0x85, 0x08, 0xac, 0x5c, 0x40, 0x5c, 0x30, 0x8e, 0xba, 0x00, 0x1f,
+    0x3a, 0x72, 0xaa, 0x24, 0x1d, 0x89, 0xff, 0x6f, 0x2c, 0x03, 0x2a, 0xec, 0x0d, 0x7f, 0x37, 0x3e,
+    0x25, 0x10, 0xdd, 0xf2, 0xdb, 0x1c, 0xf7, 0x75, 0x61, 0x56, 0x38, 0xa1, 0x61, 0x1c, 0xd0, 0xe7,
+    0x92, 0xc0, 0x69, 0x05, 0x39, 0x2c, 0x24, 0xc4, 0xd2, 0x29, 0x2f, 0xaa, 0x5c, 0xf7, 0x4a, 0xd9,
+    0xd8, 0xbe, 0x5a, 0x47, 0x0c, 0xc4, 0xf4, 0x4a, 0xa9, 0x8d, 0xcc, 0xfd, 0xd1, 0x95, 0x08, 0xef,
+    0x9a, 0x5d, 0xa8, 0xb0, 0x64, 0x2b, 0xcc, 0xbb, 0xcd, 0x8b, 0x94, 0x25, 0xfd, 0x5e, 0x23, 0x4c,
+    0xbc, 0xc0, 0xdf, 0xf9, 0x98, 0xe6, 0xad, 0x18, 0x17, 0x2c, 0xbd, 0x22, 0x98, 0xeb, 0xcc, 0x9f,
+    0xc5, 0xdb, 0x9e, 0xe3, 0xdc, 0xfa, 0x5b, 0x7c, 0x01, 0x44, 0x5d, 0xe0, 0xa5, 0x46, 0x06, 0xad,
+    0xfe, 0x71, 0x6c, 0x10, 0x85, 0x36, 0xfd, 0x14, 0x6b, 0x82, 0x45, 0x58, 0xa5, 0x97, 0x60, 0x15,
+    0x35, 0x3b, 0x77, 0xe8, 0x0c, 0x3e, 0xa6, 0x13, 0x3e, 0xaf, 0x3b, 0xed, 0x4b, 0xa6, 0x93, 0x86,
+    0xfd, 0xb1, 0xa8, 0xb4, 0x67, 0x5d, 0x17, 0x0b, 0x4c, 0xac, 0xad, 0xf7, 0x71, 0xc2, 0xd2, 0xe9,
+    0x4e, 0xa7, 0x93, 0x5e, 0x82, 0x10, 0x96, 0xf9, 0x55, 0xd6, 0xd5, 0x18, 0xb1, 0xa9, 0xd9, 0x59,
+    0x3d, 0x93, 0x6a, 0x20, 0xcc, 0x9e, 0x12, 0x7d, 0x91, 0x79, 0x9c, 0xef, 0x7c, 0x29, 0xaa, 0x84,
+    0x34, 0xd0, 0x2e, 0x3d, 0xfd, 0xa1, 0xcb, 0x47, 0xc4, 0xbe, 0x36, 0x25, 0x82, 0x91, 0x2e, 0xb1,
+    0x9f, 0x01, 0x2e, 0x0e, 0xb8, 0x3f, 0xff, 0x93, 0xb1, 0x07, 0x3b, 0xb9, 0xda, 0x22, 0xd3, 0x52,
+    0x7f, 0x11, 0xcd, 0x61, 0xc8, 0xaf, 0xa3, 0x59, 0x8a, 0xb7, 0x92, 0x5f, 0x7f, 0x69, 0x9a, 0xbc,
+    0xd3, 0x00, 0x28, 0x8c, 0xaa, 0x52, 0x5e, 0x79, 0xce, 0xc9, 0xee, 0x1a, 0x80, 0xbb, 0x7e, 0x8f,
+    0x9d, 0x32, 0x5f, 0x88, 0x8b, 0x6d, 0xa5, 0x4a, 0x37, 0x1d, 0x6f, 0x22, 0x9d, 0xb7, 0xd8, 0xcf,
+    0xb7, 0x67, 0x89, 0x46, 0x80, 0xda, 0x46, 0xad, 0x4f, 0x76, 0xa3, 0x29, 0x65, 0x45, 0xe8, 0xd8,
+    0x8a, 0xb3, 0xff, 0xcf, 0x3f, 0xab, 0xd5, 0xac, 0xc6, 0x4b, 0xb4, 0xf1, 0xf2, 0x7e, 0x07, 0xdd,
+    0x4a, 0x45, 0x96, 0x84, 0xf4, 0x37, 0x10, 0xff, 0x4b, 0x7d, 0xda, 0x43, 0x26, 0xf3, 0x2b, 0xbe,
+    0x49, 0x7c, 0x25, 0x62, 0xec, 0xab, 0x1f, 0x9c, 0x3a, 0x2d, 0x9d, 0xeb, 0x1e, 0x68, 0xfb, 0x84,
+    0x22, 0xc7, 0x21, 0x5c, 0xd5, 0xa8, 0xcd, 0x9d, 0xed, 0xf7, 0x6a, 0x53, 0xe4, 0x5c, 0xc2, 0x80,
+    0x9f, 0x2c, 0xfb, 0x60, 0xc7, 0xb2, 0x1d, 0x7d, 0x99, 0x4b, 0xe5, 0xef, 0x9d, 0x37, 0x88, 0x21,
+    0xbd, 0x6b, 0x5a, 0x9b, 0x3a, 0x14, 0x88, 0x1d, 0x8f, 0xc2, 0x3d, 0xd4, 0xab, 0x06, 0x7c, 0x8f,
+    0x71, 0x35, 0xe5, 0xcf, 0x27, 0x5f, 0x6f, 0x46, 0x27, 0x54, 0xe7, 0x78, 0x6a, 0xcc, 0x73, 0xbe,
+    0xfa, 0xa9, 0x17, 0xdc, 0xf2, 0x37, 0x0b, 0x7a, 0x5b, 0xd1, 0x47, 0xbf, 0xeb, 0x80, 0x82, 0x02,
+    0x93, 0x0c, 0xed, 0x93, 0xe3, 0x63, 0xcc, 0xc2, 0xc6, 0xa7, 0x65, 0x0a, 0xf8, 0x64, 0x63, 0x88,
+    0x23, 0x25, 0x41, 0xda, 0x44, 0x9c, 0x0b, 0xb1, 0x2a, 0x01, 0x97, 0x46, 0x7a, 0x4a, 0x11, 0x1a,
+    0xde, 0x69, 0x0b, 0x72, 0x09, 0x89, 0x44, 0xd7, 0x15, 0x85, 0x79, 0x68, 0x60, 0x15, 0xb0, 0xc2,
+    0x99, 0xf6, 0x30, 0xe7, 0x0f, 0xa4, 0x3b, 0x2d, 0xc5, 0x0a, 0x80, 0x64, 0x4d, 0x71, 0x98, 0x1e,
+    0x88, 0xc4, 0x90, 0x47, 0x23, 0x34, 0x29, 0x6a, 0xb9, 0xb4, 0xcd, 0x33, 0x7f, 0x01, 0x2f, 0xf7,
+    0x4c, 0x8f, 0x73, 0xd0, 0xfe, 0x68, 0x6e, 0x28, 0xa3, 0xe7, 0x73, 0xbf, 0xa4, 0x7f, 0x31, 0x4e,
+    0x2d, 0x4b, 0x93, 0xc1, 0xc4, 0xac, 0xee, 0x38, 0xe6, 0x03, 0xbe, 0xf0, 0x80, 0xf6, 0x8a, 0x46,
+    0x2e, 0xaf, 0x3a, 0xbd, 0x55, 0x4a, 0x8e, 0xd5, 0x5e, 0xb8, 0xdd, 0xe0, 0x0e, 0x89, 0xe0, 0x40,
+    0x89, 0x21, 0x30, 0xf8, 0x59, 0xe0, 0x58, 0x20, 0x81, 0xf2, 0x39, 0xf5, 0x02, 0x5e, 0x3d, 0x2e,
+    0x3c, 0x47, 0x54, 0x43, 0x77, 0xa5, 0x64, 0x47, 0x9b, 0xa9, 0xf1, 0x0c, 0xc5, 0x9e, 0xa8, 0x4e,
+    0x6f, 0x3b, 0x1f, 0xf5, 0x63, 0xae, 0x59, 0x28, 0xcf, 0x73, 0xa2, 0xf3, 0xe0, 0x36, 0xd2, 0x75,
+    0xf5, 0x54, 0x8f, 0x42, 0xbe, 0x89, 0x02, 0x7b, 0x96, 0xed, 0x5c, 0x2d, 0xff, 0x20, 0xe1, 0x18,
+    0xdc, 0x7e, 0xaa, 0x02, 0x5e, 0x87, 0x90, 0x85, 0x03, 0xa8, 0xd5, 0xb0, 0x5b, 0xbd, 0xa3, 0x22,
+    0x88, 0xc5, 0x14, 0x84, 0x9c, 0x72, 0xa3, 0x93, 0xcb, 0x23, 0xe5, 0xf9, 0x05, 0x20, 0x06, 0xfe,
+    0xca, 0xd7, 0xf2, 0xe0, 0x81, 0xc6, 0xea, 0x33, 0x29, 0x30, 0xcd, 0x3c, 0xac, 0x14, 0x62, 0xcd,
+    0xc7, 0x61, 0x79, 0x76, 0x05, 0x8d, 0x69, 0xdb, 0x69, 0xb5, 0x46, 0x77, 0x7a, 0x4a, 0xc6, 0x72,
+    0x7f, 0x80, 0x1e, 0x86, 0xbc, 0xae, 0xcb, 0xf5, 0x90, 0x47, 0x8c, 0xba, 0xf1, 0x24, 0x89, 0xcf,
+    0x1e, 0x38, 0x30, 0x7c, 0xc4, 0x17, 0x78, 0xb7, 0xd6, 0x96, 0x51, 0x00, 0x7b, 0xb8, 0x59, 0xd3,
+    0x4e, 0xc3, 0xba, 0xe1, 0x7d, 0x5e, 0x84, 0xc0, 0x23, 0xd1, 0xc2, 0xc2, 0x09, 0x12, 0x6d, 0x7e,
+    0x74, 0x81, 0xe5, 0xb1, 0x57, 0xc1, 0x94, 0x4d, 0x0e, 0x32, 0xe8, 0xe1, 0xe1, 0x98, 0x88, 0xf1,
+    0xce, 0x45, 0xd0, 0xd9, 0xc9, 0x45, 0xba, 0x47, 0x30, 0x4c, 0x0a, 0xde, 0x27, 0xa9, 0xa7, 0x55,
+    0x52, 0x74, 0x61, 0xf9, 0x4a, 0xa0, 0x4f, 0xe3, 0x9b, 0x84, 0x0d, 0xf5, 0xdf, 0xb9, 0x0b, 0x5b,
+    0xea, 0xde, 0xe9, 0x20, 0x58, 0x62, 0x3f, 0xc5, 0xdf, 0xc7, 0x34, 0xfd, 0x7b, 0x06, 0xe8, 0xf5,
+    0x8c, 0x69, 0x12, 0x3e, 0x20, 0x4a, 0x3f, 0x63, 0xc6, 0x02, 0x1b, 0x2b, 0x79, 0x8c, 0x56, 0x7d,
+    0xb1, 0x1c, 0xa9, 0xa6, 0x7b, 0xa6, 0x48, 0x17, 0x27, 0x0e, 0x70, 0x7e, 0x9f, 0xc7, 0xc3, 0x5a,
+    0xdf, 0xda, 0x0c, 0x22, 0xfe, 0xa2, 0x7c, 0x18, 0xbe, 0xba, 0x1b, 0x5f, 0x38, 0x20, 0x41, 0x51,
+    0xde, 0xe7, 0xa5, 0x87, 0xbc, 0xaf, 0x11, 0xd9, 0x3a, 0x6d, 0x84, 0x3c, 0xfd, 0x7f, 0x20, 0xa3,
+    0x2d, 0x91, 0xc2, 0x48, 0x1a, 0xef, 0xa1, 0xa3, 0x5b, 0xc2, 0x8f, 0x34, 0xdb, 0x19, 0x72, 0x54,
+    0x24, 0x0d, 0xc4, 0xb0, 0x04, 0xe2, 0xd9, 0x1c, 0x9e, 0x6a, 0x14, 0x57, 0xe2, 0x1f, 0xa3, 0x3b,
+    0x11, 0xba, 0xba, 0xc8, 0x71, 0x4c, 0xc2, 0x92, 0x62, 0x93, 0x0f, 0xf9, 0x45, 0xe6, 0x95, 0x94,
+    0x29, 0x08, 0x10, 0x24, 0xfa, 0x80, 0x82, 0xcb, 0x58, 0xdb, 0x01, 0x37, 0x96, 0x71, 0xa7, 0x38,
+    0x50, 0x21, 0xdf, 0x20, 0xf8, 0x0e, 0x66, 0x85, 0x45, 0x76, 0x92, 0x68, 0x92, 0x2f, 0x22, 0x77,
+    0xa2, 0x32, 0x5c, 0x78, 0xc3, 0xc1, 0x0e, 0xef, 0x11, 0x01, 0xff, 0xa0, 0x20, 0x7e, 0x94, 0x97,
+    0xec, 0xc3, 0xaa, 0x2e, 0x52, 0x76, 0x54, 0x58, 0x56, 0x78, 0xc1, 0xf3, 0x1b, 0xc2, 0x43, 0x76,
+    0x40, 0x72, 0x3b, 0x76, 0x64, 0x10, 0xbc, 0xac, 0x13, 0xd4, 0x23, 0xe2, 0x89, 0x85, 0x7d, 0x5e,
+    0x46, 0xfe, 0x94, 0x76, 0x83, 0x2e, 0xcc, 0x84, 0xae, 0xa6, 0x0c, 0xe9, 0x79, 0x3a, 0x66, 0xdc,
+    0x06, 0x0b, 0x65, 0xaa, 0x9f, 0x30, 0xb0, 0x4b, 0xfb, 0xf8, 0x9f, 0x24, 0xb0, 0x60, 0x10, 0xa2,
+    0x43, 0x7e, 0xfa, 0x60, 0xae, 0x39, 0xbb, 0x32, 0x77, 0xbe, 0xb9, 0x24, 0x20, 0xe7, 0x91, 0xbb,
+    0x7b, 0x62, 0xb3, 0xc4, 0xaa, 0x36, 0x8a, 0x4d, 0xbc, 0x11, 0xd1, 0x2d, 0xb7, 0x00, 0x23, 0x23,
+    0xe3, 0xde, 0xb2, 0xfa, 0xdc, 0x7a, 0xd7, 0x4e, 0x04, 0xb0, 0x46, 0xef, 0x46, 0xff, 0x1b, 0xbe,
+    0x7b, 0xad, 0xb6, 0x2a, 0xc8, 0xfb, 0xdd, 0x71, 0xe8, 0xc0, 0xa8, 0x55, 0x79, 0xde, 0x01, 0x8d,
+    0x80, 0x35, 0xe7, 0x0c, 0xcb, 0xdd, 0x8e, 0x6d, 0xe5, 0x48, 0x64, 0x1b, 0x36, 0x83, 0xfe, 0xfc,
+    0x64, 0x07, 0xf1, 0x51, 0x76, 0x74, 0x2e, 0xfb, 0x4a, 0xee, 0xe3, 0x59, 0xef, 0x74, 0x19, 0xc5,
+    0x1b, 0x43, 0x66, 0xb1, 0x50, 0xf4, 0x78, 0x4a, 0x1b, 0xd0, 0x15, 0x1f, 0x8c, 0xe8, 0x33, 0xfe,
+    0x51, 0x8b, 0x16, 0x6b, 0x9b, 0x9e, 0x48, 0x12, 0x01, 0xfe, 0x96, 0x54, 0x8d, 0xe1, 0xf1, 0xbd,
+    0xd3, 0x21, 0x8b, 0xab, 0x95, 0x8d, 0xae, 0xec, 0x91, 0x1a, 0x1c, 0xb2, 0xf2, 0xc1, 0x85, 0x5b,
+    0x43, 0xa7, 0xd9, 0xe7, 0xeb, 0xa8, 0x67, 0x1f, 0x63, 0xf9, 0x1b, 0x06, 0x5e, 0x2a, 0xcd, 0x41,
+    0xed, 0xf3, 0x6e, 0xb8, 0xdb, 0xe7, 0x7c, 0x65, 0x94, 0xdf, 0xba, 0xfa, 0x8d, 0xf4, 0xaa, 0x9d,
+    0x8d, 0x2f, 0xf6, 0xfe, 0x81, 0x51, 0x5b, 0xac, 0xca, 0xec, 0xac, 0x3a, 0x9b, 0xc5, 0x70, 0x5b,
+    0x22, 0x2f, 0xbe, 0x01, 0x5c, 0x7f, 0xb0, 0x92, 0xa7, 0x15, 0x63, 0x5b, 0xdb, 0xa4, 0x1b, 0x55,
+    0x02, 0x85, 0x57, 0xe6, 0x14, 0xc3, 0x36, 0x27, 0x7e, 0x59, 0x53, 0x48, 0xda, 0x13, 0xbb, 0xa6,
+    0x0e, 0x39, 0xaf, 0x44, 0x73, 0x9c, 0xa4, 0xe9, 0xbf, 0xc5, 0x89, 0x67, 0x4c, 0x13, 0xac, 0x4b,
+    0x3c, 0xe7, 0x3f, 0x8a, 0x06, 0xaf, 0x73, 0x2d, 0x33, 0x9a, 0x77, 0x5b, 0x99, 0x7e, 0x06, 0xb8,
+    0x2f, 0x57, 0x96, 0x12, 0x22, 0x07, 0x3c, 0xd8, 0x84, 0x3e, 0xb9, 0x56, 0xa2, 0xaa, 0xe8, 0xc6,
+    0x3f, 0x44, 0x5c, 0x28, 0xae, 0x85, 0x6d, 0x0a, 0x95, 0x88, 0xce, 0xcf, 0x99, 0xee, 0x4d, 0x40,
+    0xe4, 0x74, 0x80, 0x11, 0x85, 0x9e, 0xa1, 0xe1, 0xbe, 0xb5, 0x10, 0xab, 0xe7, 0xc6, 0x39, 0x45,
+    0xee, 0x87, 0x6e, 0x1e, 0x22, 0x77, 0x5f, 0x45, 0x23, 0x34, 0xfb, 0x4b, 0xbc, 0xa7, 0xd3, 0x47,
+    0xaa, 0xf6, 0xe5, 0xad, 0xf4, 0x8f, 0x16, 0x43, 0xe2, 0x39, 0x11, 0xed, 0x04, 0x96, 0xf4, 0x1e,
+    0xb0, 0xe4, 0x77, 0xa9, 0x5a, 0xbf, 0x01, 0xe3, 0xa2, 0x7b, 0xc9, 0xd3, 0xf1, 0xe9, 0x92, 0x0a,
+    0xe3, 0x80, 0x4c, 0x98, 0x78, 0xd8, 0xce, 0xd9, 0x3d, 0x2b, 0x31, 0xad, 0xca, 0x0a, 0x6a, 0x0d,
+    0xce, 0x32, 0xf6, 0xe6, 0x42, 0x86, 0x51, 0x80, 0x5e, 0xe7, 0xa0, 0x58, 0x32, 0xd2, 0x93, 0x20,
+    0x70, 0x17, 0x3b, 0xcf, 0x13, 0x84, 0x5b, 0x76, 0xcd, 0x8a, 0xa9, 0x4e, 0x14, 0x1e, 0xcf, 0x17,
+    0xde, 0x14, 0xc4, 0xc0, 0xc3, 0x15, 0x3c, 0xa8, 0x5f, 0x01, 0x84, 0x2d, 0x0d, 0x36, 0x1e, 0x34,
+    0x2b, 0x5b, 0x49, 0x26, 0xfb, 0xd7, 0x6c, 0x97, 0x64, 0x44, 0x5b, 0xeb, 0x46, 0xf8, 0x84, 0xad,
+    0x30, 0x1c, 0x97, 0xf3, 0x0d, 0x0f, 0x63, 0x68, 0x1e, 0x06, 0x13, 0x7b, 0x97, 0x7a, 0x8f, 0x92,
+    0x81, 0xd6, 0x15, 0xfa, 0xad, 0x1b, 0xaa, 0xea, 0xa2, 0x55, 0x90, 0xbf, 0x6c, 0x40, 0x84, 0x27,
+    0x7a, 0x72, 0x2a, 0x38, 0x66, 0x12, 0x16, 0xbf, 0xa2, 0x5d, 0x3a, 0xd9, 0xff, 0x4d, 0x1e, 0x41,
+    0x0e, 0x54, 0xab, 0xe3, 0x4f, 0x9e, 0x1c, 0xaa, 0x08, 0x91, 0xe6, 0xdb, 0x24, 0x0d, 0xa0, 0x9e,
+    0xb2, 0x92, 0xc3, 0x8c, 0x19, 0x99, 0xd2, 0x65, 0x31, 0x27, 0x2e, 0x85, 0xb4, 0x60, 0x8e, 0xa5,
+    0x0b, 0x38, 0x57, 0xb4, 0x04, 0xda, 0xfe, 0x49, 0x5c, 0x6d, 0xe9, 0xfd, 0x66, 0x86, 0x58, 0x6e,
+    0xbd, 0xa5, 0xcb, 0x4b, 0xa7, 0xd4, 0x50, 0xed, 0x48, 0x49, 0x85, 0x66, 0x1a, 0xda, 0xbd, 0x9a,
+    0xa6, 0x79, 0xbc, 0x10, 0xbf, 0x1d, 0x25, 0x56, 0x70, 0x00, 0xdf, 0x12, 0xfd, 0xb6, 0x5b, 0x97,
+    0xfd, 0x55, 0x63, 0xb8, 0x6a, 0x18, 0xc5, 0xd1, 0xa8, 0xca, 0xfb, 0x26, 0x24, 0x4c, 0x4e, 0xcd,
+    0xaf, 0xa2, 0xad, 0xa7, 0xe5, 0xd0, 0xdd, 0xef, 0x10, 0x61, 0xe1, 0xe9, 0x62, 0x53, 0x2b, 0x94,
+    0x4e, 0x35, 0x12, 0xbe, 0x27, 0xe3, 0x22, 0x68, 0x9f, 0xe5, 0x4b, 0x44, 0x10, 0x8a, 0xf7, 0x22,
+    0xcb, 0xf4, 0x0c, 0xbb, 0xa4, 0x64, 0xb1, 0x07, 0x44, 0x52, 0xb3, 0x88, 0xf7, 0x37, 0xd6, 0x31,
+    0x9d, 0x48, 0xdf, 0x23, 0xc5, 0x4e, 0x9e, 0x23, 0x81, 0x92, 0xc2, 0xaa, 0xdc, 0x1d, 0x04, 0xe2,
+    0x63, 0x7e, 0x36, 0x29, 0x40, 0x61, 0x56, 0xe7, 0xf8, 0x12, 0x18, 0xa9, 0x49, 0xfc, 0xd6, 0x56,
+    0x79, 0xc0, 0x44, 0xbe, 0x68, 0xa2, 0xd6, 0xfa, 0x63, 0x7f, 0x59, 0x1c, 0x53, 0x45, 0x80, 0xf2,
+    0x7e, 0x80, 0xeb, 0xe3, 0x8c, 0x9b, 0x77, 0x0d, 0xcd, 0x92, 0x0b, 0xc2, 0xf2, 0x36, 0xad, 0x3d,
+    0x5b, 0x95, 0xd2, 0x56, 0xb4, 0xd9, 0x36, 0xa7, 0x99, 0x16, 0xd0, 0x76, 0x0f, 0x3a, 0x80, 0x7d,
+    0x23, 0x73, 0x77, 0xae, 0x24, 0xfb, 0xcd, 0xb4, 0x37, 0x50, 0x30, 0xf9, 0x0f, 0x6c, 0x30, 0xec,
+    0x2b, 0xe1, 0x7f, 0xb2, 0xe1, 0x1c, 0x7c, 0x92, 0xec, 0xce, 0xca, 0x91, 0x5d, 0xfa, 0xe9, 0x50,
+    0xc9, 0x90, 0x5e, 0xbd, 0x7f, 0xb1, 0x5b, 0xd9, 0x50, 0xc2, 0x60, 0x47, 0x11, 0x8d, 0xf0, 0x13,
+    0xb1, 0xe8, 0x64, 0x14, 0xb6, 0xfc, 0xdf, 0x40, 0x49, 0xd2, 0x34, 0xf9, 0xe0, 0xf0, 0xf1, 0x09,
+    0x9c, 0xac, 0xea, 0xe0, 0xba, 0xa5, 0x11, 0x08, 0x40, 0x0d, 0x4d, 0xc0, 0x2d, 0x36, 0x11, 0x3b,
+    0xb6, 0x96, 0x28, 0xf4, 0xdf, 0x7f, 0x99, 0xc9, 0xf1, 0xa2, 0xc1, 0x75, 0x5b, 0x9b, 0xb7, 0x08,
+    0x4e, 0xf1, 0xbc, 0x47, 0x72, 0xe9, 0x70, 0xf1, 0x07, 0x64, 0x7e, 0xa1, 0x94, 0xb2, 0x4c, 0x79,
+    0x3c, 0xab, 0x9f, 0xaa, 0x05, 0xe8, 0x5d, 0x19, 0xa0, 0xe6, 0xfd, 0x79, 0xe1, 0xb4, 0xa3, 0x1e,
+    0x23, 0x92, 0x7e, 0xa5, 0xe7, 0xea, 0x6a, 0x3e, 0xb9, 0x71, 0x15, 0x2c, 0x0c, 0x96, 0x7d, 0xfc,
+    0x9e, 0x62, 0x12, 0xc0, 0xa6, 0x8b, 0x52, 0xa1, 0xbb, 0x3f, 0xe8, 0xdb, 0x6a, 0x7b, 0xf8, 0x6b,
+    0x2a, 0xd9, 0x83, 0x86, 0xcf, 0x88, 0x5c, 0x40, 0x98, 0xe7, 0xc4, 0xf3, 0xf1, 0x19, 0x47, 0xa4,
+    0x12, 0x84, 0x10, 0x20, 0xb6, 0x1e, 0xf5, 0x06, 0xea, 0x39, 0x47, 0xdd, 0x29, 0x09, 0x48, 0x54,
+    0x73, 0x3c, 0x6a, 0x24, 0x5a, 0xc7, 0x4a, 0xd2, 0x54, 0xa7, 0xcf, 0x6c, 0x06, 0xfa, 0xc2, 0x1f,
+    0xaf, 0x4d, 0x7e, 0x29, 0xd2, 0x37, 0xc9, 0xd5, 0xec, 0x43, 0x46, 0xab, 0xbc, 0xcd, 0x36, 0xa9,
+    0xec, 0x1f, 0x73, 0x59, 0xf1, 0xab, 0xd7, 0x11, 0xda, 0x2b, 0x4b, 0xec, 0x55, 0xcb, 0x53, 0x8e,
+    0xf6, 0x13, 0x38, 0xb5, 0x70, 0x7a, 0x2e, 0xb5, 0x9c, 0x7f, 0xe6, 0x74, 0xca, 0x6f, 0xa4, 0x63,
+    0xe2, 0x63, 0x5a, 0x25, 0xf1, 0xff, 0x61, 0x70, 0x07, 0xdc, 0xce, 0x94, 0xda, 0x53, 0x46, 0x3a,
+    0xb9, 0x1b, 0xf9, 0xa3, 0xef, 0xb5, 0xb7, 0x94, 0x54, 0xf7, 0x32, 0x00, 0x05, 0x60, 0xde, 0xb0,
+    0x7b, 0xf8, 0x6b, 0x64, 0x57, 0xa2, 0x97, 0x55, 0xda, 0x68, 0x14, 0x72, 0x61, 0x57, 0xcc, 0x95,
+    0xec, 0xe0, 0x44, 0x2f, 0x6c, 0xa2, 0x55, 0xab, 0x28, 0x9c, 0x11, 0x2b, 0x88, 0xc9, 0xb6, 0x65,
+    0x11, 0xac, 0xeb, 0x40, 0x16, 0x41, 0x29, 0x6d, 0xab, 0x50, 0xb8, 0x8f, 0x11, 0xc0, 0x3c, 0x03,
+    0x2e, 0xa7, 0xab, 0x19, 0xfb, 0x91, 0x3b, 0x56, 0x2e, 0x22, 0xbb, 0x05, 0xd0, 0x04, 0x49, 0x6a,
+    0xcd, 0x33, 0x89, 0xd3, 0x86, 0x43, 0x4c, 0x87, 0x43, 0x6d, 0xd6, 0x1d, 0x0d, 0x0e, 0xf7, 0x9a,
+    0x9f, 0x19, 0x01, 0xbb, 0x92, 0x69, 0x86, 0xc3, 0x96, 0x88, 0xa7, 0xc1, 0xe5, 0x40, 0xf1, 0x42,
+    0x3f, 0x70, 0x14, 0x6c, 0x3c, 0xf9, 0xb6, 0x68, 0x4a, 0x1e, 0x52, 0x9b, 0x76, 0xb6, 0x98, 0x23,
+    0x2a, 0xb9, 0xb6, 0xa0, 0x34, 0x43, 0x71, 0x81, 0x6e, 0xb6, 0xc9, 0xd6, 0x32, 0x18, 0x3f, 0xdd,
+    0xea, 0xfa, 0x0c, 0xd2, 0x89, 0xba, 0x59, 0xc3, 0x23, 0x68, 0x74, 0x79, 0xca, 0xed, 0xc9, 0x6f,
+    0x46, 0x41, 0x64, 0xff, 0x64, 0xa8, 0x8d, 0x92, 0xb1, 0x7d, 0xdd, 0x00, 0x99, 0xe7, 0xb3, 0x08,
+    0x6b, 0x25, 0xeb, 0x51, 0x17, 0x34, 0xe5, 0x2f, 0x8a, 0x51, 0x18, 0xf5, 0xc8, 0x41, 0x99, 0x7e,
+    0x23, 0xa4, 0x08, 0x0b, 0xae, 0x3a, 0xc0, 0xbe, 0xa5, 0x43, 0x51, 0x54, 0x1e, 0xfb, 0xb2, 0x08,
+    0x15, 0x20, 0xcf, 0x42, 0xe1, 0x99, 0x65, 0xff, 0x98, 0xce, 0x46, 0x5f, 0x5b, 0x31, 0x5d, 0xb4,
+    0xe2, 0xb0, 0xcb, 0x3e, 0x3f, 0x29, 0x40, 0x77, 0x40, 0x48, 0x53, 0x53, 0xb5, 0x43, 0xcf, 0xfb,
+    0xbb, 0x82, 0x22, 0x71, 0x9a, 0x45, 0xa6, 0xa5, 0x1b, 0x09, 0x1e, 0x8b, 0xab, 0x00, 0x77, 0xa4,
+    0x61, 0xb3, 0xb9, 0x19, 0xf4, 0xb9, 0xa9, 0x93, 0x3f, 0x05, 0xb1, 0x29, 0xe0, 0xe6, 0xd6, 0x64,
+    0xc5, 0xe3, 0xff, 0x28, 0xb5, 0xe1, 0x80, 0x75, 0xe9, 0x38, 0x95, 0xdc, 0xfc, 0xf1, 0x98, 0x61,
+    0xe1, 0x31, 0x64, 0x74, 0xd9, 0x84, 0x84, 0x61, 0x80, 0x8b, 0x00, 0x0e, 0x4c, 0x14, 0x89, 0x25,
+    0x85, 0x20, 0x44, 0x8e, 0x4a, 0x18, 0x12, 0x7f, 0xc3, 0x05, 0x23, 0x58, 0xae, 0xe0, 0x85, 0xa7,
+    0x90, 0x50, 0xdd, 0xf3, 0x47, 0x40, 0xa7, 0xe7, 0x50, 0xad, 0xa1, 0x46, 0xfb, 0x36, 0x7c, 0x16,
+    0xc4, 0x7c, 0x1f, 0x36, 0x20, 0xbb, 0x47, 0xa5, 0xdb, 0x27, 0xd4, 0x4f, 0xc1, 0xc5, 0xf7, 0xec,
+    0xf1, 0xdf, 0x4a, 0xcd, 0xa4, 0x76, 0x8f, 0x98, 0xbb, 0x16, 0x34, 0x0a, 0x75, 0x89, 0x24, 0x3a,
+    0xcc, 0x70, 0xb2, 0x36, 0xcc, 0xc1, 0xcc, 0x1d, 0x81, 0x76, 0xa3, 0xd6, 0x94, 0xd4, 0x00, 0x61,
+    0x2b, 0x53, 0x81, 0x3c, 0xf2, 0x97, 0x99, 0x53, 0xa9, 0x20, 0x3b, 0x99, 0x72, 0xf7, 0xbf, 0xd3,
+    0x12, 0x1b, 0x93, 0x16, 0x18, 0xe8, 0x6a, 0x4e, 0xc6, 0x28, 0x32, 0xe9, 0xa1, 0xf8, 0x9b, 0xe0,
+    0xdb, 0x1f, 0xc6, 0x6d, 0x3f, 0xd7, 0x29, 0x58, 0x48, 0x1c, 0xab, 0xdd, 0xce, 0x67, 0x05, 0xa7,
+    0x76, 0xb8, 0x1b, 0x36, 0xbc, 0x24, 0x5a, 0x35, 0xcf, 0x73, 0xff, 0xd0, 0x47, 0x5a, 0x91, 0xa0,
+    0xda, 0x1c, 0xbf, 0xbe, 0xce, 0x60, 0x9e, 0x9e, 0x19, 0x47, 0x2b, 0x9a, 0x3b, 0x4c, 0xec, 0xf0,
+    0xd3, 0x5b, 0xe4, 0x15, 0xf5, 0xdd, 0xa7, 0xf4, 0x46, 0x12, 0x38, 0x5d, 0x54, 0x0e, 0x94, 0x28,
+    0xdb, 0x7d, 0x2d, 0xa3, 0xc3, 0x5e, 0x5a, 0xcd, 0x64, 0x72, 0x2d, 0x26, 0x2b, 0xf2, 0x9b, 0xa1,
+    0xe8, 0x1b, 0xea, 0xeb, 0xb5, 0x1d, 0x67, 0x2a, 0x5a, 0xe7, 0x18, 0x6b, 0x59, 0x2f, 0xb2, 0x79,
+    0x8a, 0x47, 0x43, 0x8d, 0xfa, 0x83, 0x00, 0x9a, 0x2e, 0x16, 0x77, 0x13, 0x23, 0xa8, 0xe2, 0x65,
+    0x65, 0xab, 0x10, 0xa4, 0x62, 0x5b, 0x5b, 0xc7, 0xee, 0x9e, 0x4d, 0xcd, 0xec, 0x75, 0x9c, 0x74,
+    0x41, 0x4a, 0x82, 0x2a, 0xa8, 0x8e, 0x77, 0xee, 0xef, 0x77, 0xb8, 0x6b, 0x9e, 0x65, 0x85, 0x73,
+    0x6d, 0x68, 0x8c, 0x52, 0x34, 0xb7, 0xa7, 0xa3, 0xe9, 0x93, 0x92, 0x02, 0xf4, 0xcf, 0xa7, 0x79,
+    0x35, 0x11, 0xf4, 0xbe, 0xdb, 0x23, 0xae, 0x1a, 0x24, 0x52, 0x9e, 0xff, 0x2a, 0x5a, 0x42, 0x9b,
+    0xf7, 0x8a, 0x8c, 0x73, 0xce, 0xfb, 0xe2, 0x5c, 0x19, 0x57, 0xfb, 0xa3, 0x7b, 0x62, 0xb5, 0xcd,
+    0xa2, 0x5d, 0x4e, 0x83, 0xc0, 0x41, 0xa6, 0xd7, 0xd9, 0xa2, 0x9d, 0x1b, 0x20, 0x07, 0x4c, 0xd4,
+    0x13, 0xfe, 0xed, 0xc7, 0x42, 0xc6, 0x7b, 0xe2, 0x6c, 0xf3, 0xa1, 0xdd, 0xc9, 0x3c, 0xc3, 0xb3,
+    0x39, 0xed, 0xbe, 0x23, 0x11, 0xef, 0x91, 0x5c, 0x05, 0x75, 0x75, 0xcd, 0xa4, 0xb7, 0x3a, 0x4b,
+    0x29, 0x2a, 0xfa, 0x92, 0x81, 0x1f, 0xd4, 0x38, 0xb9, 0x02, 0xcd, 0x74, 0xef, 0xd7, 0x51, 0xac,
+    0xc1, 0x1b, 0xf9, 0x15, 0x06, 0x5b, 0xbb, 0x77, 0x9b, 0x22, 0x2f, 0x59, 0x87, 0x1a, 0xa5, 0xa2,
+    0x16, 0xc4, 0xeb, 0x50, 0xce, 0x15, 0xd9, 0x85, 0xbc, 0x8e, 0x34, 0x5d, 0x09, 0x30, 0x98, 0xe1,
+    0x05, 0x75, 0xc8, 0x71, 0x5a, 0x82, 0x10, 0xb7, 0x4c, 0x22, 0x2d, 0x66, 0xbf, 0x7a, 0xb6, 0xe4,
+    0x97, 0xb4, 0xb9, 0xdd, 0x61, 0x15, 0x92, 0xb4, 0xbd, 0x06, 0x5b, 0x92, 0x3e, 0xf3, 0xbd, 0xfa,
+    0xe8, 0x25, 0x46, 0x0f, 0xa1, 0x1b, 0x1b, 0xd6, 0xad, 0x6e, 0x6b, 0x9b, 0xbb, 0x55, 0x86, 0x21,
+    0x6d, 0x80, 0xe8, 0x75, 0x2f, 0x5d, 0xcf, 0x3b, 0x25, 0x23, 0xf5, 0x62, 0x1b, 0xbf, 0xe0, 0x0d,
+    0x45, 0x7e, 0x23, 0x41, 0xe2, 0x6c, 0x14, 0xf6, 0x1f, 0x53, 0xe0, 0x25, 0x43, 0x55, 0xe7, 0xe1,
+    0xbb, 0xf0, 0xbd, 0x24, 0x7d, 0x5e, 0x76, 0xa8, 0xc5, 0x4b, 0x2d, 0x29, 0x3e, 0x96, 0xda, 0x94,
+    0x5f, 0x35, 0x3d, 0x58, 0x4f, 0x98, 0x69, 0xa3, 0xe5, 0x1b, 0x11, 0xb5, 0x2d, 0x14, 0x13, 0x73,
+    0x15, 0x97, 0xf7, 0xe0, 0x81, 0x70, 0x42, 0x4d, 0xe2, 0xb7, 0xfc, 0xd9, 0x3b, 0xf3, 0x6c, 0x34,
+    0xf8, 0x43, 0xd0, 0x26, 0xb4, 0x18, 0x5a, 0xb6, 0x84, 0xcf, 0xea, 0xdb, 0x28, 0xd6, 0xe7, 0xae,
+    0xb4, 0x0b, 0x69, 0x96, 0x1a, 0x7e, 0x1a, 0x4f, 0x59, 0x5c, 0xe0, 0xe7, 0xc5, 0xaa, 0xcf, 0x6c,
+    0x5a, 0xd0, 0x04, 0x00, 0x92, 0x94, 0x36, 0x64, 0x33, 0x67, 0x24, 0xce, 0x67, 0x33, 0x91, 0x86,
+    0x36, 0xb2, 0xc0, 0x36, 0xdd, 0x5a, 0xa3, 0x1b, 0xc2, 0xcb, 0x30, 0x4d, 0x7d, 0x7d, 0xd4, 0x39,
+    0xea, 0x97, 0x22, 0xd6, 0x01, 0x3d, 0x53, 0x8c, 0x82, 0xdf, 0x32, 0x37, 0x04, 0xda, 0x14, 0x36,
+    0x65, 0x9a, 0xe6, 0x24, 0x8d, 0xa4, 0xbc, 0xf6, 0x0e, 0x6d, 0xf0, 0x83, 0xfa, 0x4f, 0x21, 0x66,
+    0x15, 0x63, 0x7c, 0x69, 0xb2, 0x1f, 0xbb, 0xaa, 0xc7, 0xd7, 0xab, 0x17, 0x7c, 0x3d, 0x85, 0x36,
+    0x78, 0x06, 0x3f, 0x93, 0x04, 0xe0, 0x20, 0xfb, 0x0c, 0xe8, 0xf4, 0x73, 0xca, 0x85, 0xae, 0xfe,
+    0xa7, 0xb7, 0x15, 0x09, 0x22, 0xe1, 0x07, 0xbd, 0x77, 0xf5, 0x77, 0xfc, 0x4f, 0x4d, 0x16, 0x67,
+    0x58, 0xc1, 0xea, 0x81, 0x09, 0x49, 0x02, 0x10, 0x2b, 0xc7, 0x12, 0xd0, 0x7f, 0xa3, 0x58, 0x0d,
+    0xf8, 0xb7, 0xa2, 0x1a, 0x52, 0x31, 0xfc, 0x00, 0x72, 0x5d, 0x93, 0x15, 0x13, 0x94, 0x59, 0x3d,
+    0xbe, 0x04, 0x33, 0x2d, 0x47, 0x15, 0x68, 0xb0, 0x11, 0xd0, 0x44, 0x65, 0x53, 0xa4, 0x96, 0x96,
+    0x35, 0x36, 0xe2, 0x97, 0xe7, 0xe8, 0xcf, 0x1a, 0x54, 0x7f, 0x46, 0x64, 0xb5, 0xa3, 0xe8, 0xd7,
+    0xb3, 0xd8, 0x6e, 0xe2, 0x83, 0xda, 0x79, 0x75, 0x65, 0xfb, 0x45, 0xf0, 0xca, 0x69, 0x4d, 0xd4,
+    0xd8, 0x7d, 0x53, 0x33, 0xd5, 0x3c, 0xb7, 0x1a, 0xb9, 0x78, 0x47, 0x20, 0x17, 0xba, 0xbe, 0xea,
+    0xdf, 0xe8, 0xd7, 0x5d, 0xda, 0x95, 0xb5, 0x38, 0xdd, 0x48, 0x53, 0xeb, 0xa7, 0x63, 0xf5, 0x85,
+    0x6a, 0x37, 0xde, 0xdf, 0xd2, 0x2e, 0x7d, 0xfd, 0x6c, 0xd1, 0x2a, 0x7d, 0x30, 0xc9, 0x21, 0x32,
+    0x2f, 0x5b, 0x77, 0x1e, 0xd4, 0xe2, 0x4b, 0x23, 0xfb, 0x11, 0xff, 0x32, 0x91, 0x30, 0xb2, 0x70,
+    0x04, 0xce, 0x60, 0x7c, 0x0c, 0x69, 0x67, 0xb5, 0x58, 0x1b, 0xff, 0x1e, 0xd3, 0xb3, 0x5f, 0x74,
+    0xca, 0xb6, 0x80, 0x82, 0x46, 0xfd, 0xc2, 0xda, 0x79, 0x54, 0xa6, 0x3f, 0x1b, 0x1d, 0x8b, 0xcc,
+    0xca, 0x36, 0xdf, 0xfd, 0x90, 0xfb, 0x49, 0xd7, 0xd7, 0x43, 0xae, 0xb5, 0x37, 0xe5, 0xdb, 0xc6,
+    0x4f, 0x3b, 0xf8, 0xb5, 0x7c, 0xd9, 0x91, 0x98, 0x28, 0xd8, 0x16, 0x78, 0xba, 0xc3, 0x1b, 0x81,
+    0x4d, 0xba, 0x4d, 0x51, 0xd0, 0x77, 0x44, 0x15, 0xb1, 0xc4, 0xa2, 0x1f, 0xa2, 0xe4, 0xf1, 0x82,
+    0x2e, 0x1e, 0xc8, 0xcf, 0xd9, 0xe3, 0xe7, 0x5f, 0x38, 0x34, 0xca, 0x8f, 0x16, 0x25, 0xbc, 0xeb,
+    0xfc, 0x92, 0x12, 0xea, 0x5f, 0x92, 0x82, 0x52, 0xf0, 0x83, 0xfa, 0xe4, 0xaf, 0xad, 0x41, 0x22,
+    0x98, 0x58, 0x0f, 0xc4, 0xe1, 0x3c, 0x8d, 0x95, 0x73, 0xf4, 0x61, 0x47, 0x8d, 0x0d, 0x6d, 0x25,
+    0x80, 0xc2, 0xa3, 0x83, 0x2d, 0x20, 0x8f, 0x83, 0x32, 0x6d, 0xc1, 0xf1, 0x46, 0x19, 0x19, 0xe5,
+    0x96, 0x68, 0x29, 0x80, 0xd0, 0x2d, 0x0a, 0x2a, 0x03, 0xd0, 0x9d, 0xe4, 0x05, 0x86, 0x57, 0x6b,
+    0x8d, 0x12, 0x49, 0x5e, 0xdc, 0xba, 0x9a, 0x47, 0x5b, 0x92, 0x36, 0xa8, 0x43, 0x15, 0x34, 0x0a,
+    0x61, 0xad, 0x3d, 0x7e, 0x58, 0xa5, 0xc1, 0xc6, 0x53, 0xff, 0x61, 0x84, 0x20, 0x86, 0x20, 0x54,
+    0xe7, 0xfc, 0x8a, 0x39, 0x12, 0xb0, 0x23, 0x59, 0x4f, 0x92, 0x3b, 0x06, 0x4e, 0xd0, 0x0f, 0x88,
+    0xea, 0x7c, 0x84, 0x94, 0xae, 0x23, 0xbe, 0x63, 0xbc, 0xea, 0x60, 0xfc, 0x7d, 0xdf, 0x38, 0x39,
+    0xfe, 0x09, 0x48, 0x64, 0xbb, 0x05, 0x79, 0x2e, 0x71, 0xfe, 0x6d, 0x11, 0x56, 0x95, 0x52, 0x79,
+    0x7e, 0x90, 0x8a, 0x6e, 0x49, 0x4e, 0x98, 0x68, 0x1b, 0xbf, 0xe2, 0x1d, 0x57, 0x35, 0xe7, 0x2d,
+    0x23, 0xc6, 0x42, 0xfe, 0x46, 0xa3, 0x37, 0x24, 0x28, 0x41, 0x1b, 0xb0, 0xa7, 0xe8, 0x9c, 0x57,
+    0xea, 0x49, 0x26, 0x15, 0x7c, 0x82, 0x31, 0x92, 0xa2, 0x64, 0x3a, 0xa6, 0x31, 0x8c, 0x06, 0x90,
+    0x41, 0xf5, 0xca, 0xdb, 0x87, 0xe5, 0x91, 0xe2, 0xf8, 0x2c, 0xde, 0x92, 0xb8, 0x7a, 0x74, 0x42,
+    0x26, 0xde, 0xb0, 0x9f, 0x8d, 0x45, 0xbd, 0xd0, 0x8a, 0x88, 0x3b, 0x3b, 0x09, 0xc4, 0x53, 0xf4,
+    0xb4, 0x1b, 0xba, 0x8c, 0xaf, 0x1a, 0x8d, 0x85, 0x3a, 0xe4, 0x35, 0xca, 0x27, 0x9f, 0x21, 0x0d,
+    0x57, 0xee, 0xc0, 0x75, 0xad, 0x1a, 0x67, 0x1f, 0x6a, 0x2e, 0xa8, 0x0f, 0xa1, 0x03, 0xe3, 0x4c,
+    0x9b, 0x51, 0x60, 0xa4, 0x9b, 0x88, 0xef, 0x0a, 0x40, 0x5a, 0xdb, 0xcd, 0x57, 0x6e, 0xe9, 0xc0,
+    0x5e, 0x5f, 0xe1, 0xb3, 0xcf, 0xd5, 0xb8, 0xf2, 0x90, 0x5f, 0x10, 0x2f, 0x0a, 0x65, 0x2f, 0x2d,
+    0x81, 0xde, 0x4c, 0xf8, 0xef, 0x94, 0x7a, 0x38, 0x93, 0x45, 0x9a, 0x94, 0xdf, 0xd5, 0x8c, 0x5c,
+    0xc4, 0xf9, 0xa3, 0x31, 0xd6, 0x35, 0x9f, 0x04, 0x58, 0xc1, 0x1e, 0x37, 0x1f, 0x2a, 0x5e, 0xd6,
+    0x2a, 0xa8, 0xb9, 0x39, 0x5c, 0x4f, 0xab, 0x2c, 0x36, 0x76, 0xb4, 0xd9, 0xf0, 0x34, 0x26, 0x6b,
+    0xc6, 0xca, 0x0b, 0x77, 0x7f, 0xce, 0x77, 0xf6, 0xbe, 0x6c, 0x05, 0x1f, 0x41, 0xfe, 0xb0, 0x7b,
+    0xa3, 0xe6, 0xf2, 0xf3, 0xe9, 0x24, 0x27, 0xa1, 0x43, 0x2d, 0x55, 0x56, 0xb9, 0x3f, 0x6d, 0x77,
+    0xe0, 0xce, 0x85, 0x1d, 0x60, 0x48, 0xce, 0x9e, 0x20, 0x68, 0x09, 0x9a, 0xd8, 0xd8, 0xad, 0xe8,
+    0x07, 0x90, 0xed, 0xba, 0x14, 0xb5, 0xd8, 0xdf, 0x4d, 0xbd, 0x89, 0x73, 0x53, 0xd8, 0x9c, 0xca,
+    0x1b, 0xad, 0x9b, 0x4d, 0xc4, 0xc0, 0x00, 0xce, 0xf4, 0xcc, 0x49, 0x8d, 0xa3, 0xf4, 0xb5, 0x4f,
+    0x06, 0xfa, 0x23, 0xe4, 0xb5, 0xfe, 0x3c, 0x06, 0x4c, 0xc8, 0x2a, 0x08, 0x90, 0x2a, 0x2c, 0x26,
+    0x7f, 0xce, 0xef, 0x4d, 0x6b, 0x31, 0x53, 0xca, 0xf0, 0x3c, 0xcd, 0xe4, 0xb6, 0x9e, 0xdd, 0x09,
+    0x3b, 0x43, 0x0f, 0x0a, 0x78, 0x63, 0x12, 0x65, 0x4d, 0xfa, 0x76, 0x82, 0x16, 0x52, 0xbe, 0x60,
+    0x5a, 0x09, 0x20, 0xc6, 0x67, 0x6b, 0xc7, 0xfd, 0xf0, 0xb5, 0xb1, 0xa0, 0x68, 0x00, 0x1b, 0xcc,
+    0x17, 0x9e, 0x0c, 0x0e, 0x84, 0x71, 0xc2, 0x3c, 0x96, 0xe1, 0xc3, 0x5f, 0x2e, 0xdc, 0xc1, 0xdc,
+    0x4b, 0xe0, 0xba, 0x02, 0x5c, 0x14, 0x3a, 0x43, 0xb4, 0x35, 0xeb, 0xd7, 0xe3, 0x5d, 0x17, 0x1b,
+    0x86, 0x44, 0xb7, 0x4f, 0xaa, 0x0b, 0x22, 0xe6, 0xbb, 0x47, 0x15, 0xfa, 0xef, 0x83, 0xc4, 0xb4,
+    0xed, 0xc7, 0xd5, 0x46, 0x5e, 0x84, 0x92, 0x8c, 0xcf, 0xf8, 0xfe, 0xfc, 0xba, 0x57, 0x0b, 0x4c,
+    0x8c, 0x55, 0x5a, 0x6e, 0x04, 0xfc, 0xbe, 0xaf, 0xff, 0x91, 0x2a, 0xaa, 0xf5, 0x58, 0x92, 0xfd,
+    0xae, 0x72, 0xb1, 0x4f, 0x22, 0xc2, 0xca, 0xdc, 0x5e, 0x87, 0xd0, 0x6e, 0x53, 0x9b, 0x4a, 0xfc,
+    0x1f, 0xdb, 0x38, 0x5a, 0x99, 0x19, 0x2b, 0x94, 0x83, 0xcd, 0x35, 0x3f, 0xbe, 0x10, 0x49, 0xd7,
+    0x74, 0xa8, 0x37, 0xde, 0x7d, 0xae, 0x3d, 0x5d, 0xd9, 0x49, 0x72, 0x00, 0x65, 0x8f, 0x26, 0x54,
+    0x88, 0xf8, 0xca, 0x80, 0x89, 0x27, 0x47, 0x03, 0x24, 0x2c, 0x0d, 0x33, 0xfa, 0x4a, 0x27, 0x35,
+    0xab, 0x44, 0xfd, 0x9a, 0x69, 0x37, 0xfc, 0xf2, 0x49, 0x54, 0x82, 0x0d, 0x3e, 0xb6, 0xaf, 0x66,
+    0xf5, 0x8b, 0x5a, 0xf0, 0xee, 0x66, 0x36, 0xec, 0x73, 0x8e, 0xcf, 0x11, 0x2d, 0xd4, 0x2e, 0x91,
+    0xd9, 0xfa, 0x53, 0x8c, 0x0c, 0xd9, 0x71, 0x0e, 0xe0, 0x41, 0x1d, 0xe9, 0x05, 0x26, 0x8d, 0xed,
+    0x02, 0x37, 0x35, 0x98, 0x2c, 0x9b, 0x8e, 0x76, 0x3b, 0x87, 0xca, 0xb8, 0x4b, 0xf8, 0xbc, 0x60,
+    0x18, 0xfa, 0x24, 0xcd, 0x2f, 0x42, 0x07, 0x9d, 0xc4, 0xf4, 0xea, 0x02, 0xa8, 0x64, 0xdf, 0xb3,
+    0x36, 0x08, 0xbe, 0xa3, 0xc5, 0x51, 0x91, 0x4f, 0x24, 0x5d, 0x05, 0xc1, 0x34, 0x5f, 0xd0, 0xc5,
+    0xe6, 0x7f, 0x90, 0x9e, 0x5d, 0x78, 0x56, 0x90, 0xe0, 0x7c, 0x8e, 0x31, 0x00, 0xd0, 0x18, 0x2c,
+    0x79, 0xd2, 0x08, 0x7f, 0x26, 0x19, 0xb7, 0x83, 0xd1, 0x02, 0x84, 0x1a, 0x3f, 0x33, 0x20, 0x4c,
+    0xd2, 0xf7, 0xca, 0x05, 0x6d, 0x12, 0xa8, 0x5c, 0x3d, 0xd7, 0xe9, 0x95, 0x87, 0xc5, 0x81, 0x58,
+    0x74, 0xf1, 0x48, 0x92, 0x3b, 0xeb, 0xf3, 0x65, 0x0c, 0xaa, 0xee, 0x72, 0x3e, 0xfc, 0x62, 0x7e,
+    0x23, 0x5f, 0x7f, 0x7b, 0xb1, 0x86, 0x4b, 0x4d, 0xb1, 0x06, 0xc0, 0x98, 0x0f, 0x0d, 0xb4, 0xc8,
+    0x88, 0xce, 0xb4, 0xb2, 0x4d, 0x4f, 0x19, 0xf1, 0x82, 0xf7, 0x74, 0xb3, 0x81, 0x9f, 0x8c, 0x63,
+    0x83, 0xc4, 0x85, 0x34, 0x4a, 0x69, 0xcf, 0x9e, 0x74, 0x5b, 0x45, 0xd9, 0x74, 0xcd, 0x51, 0x85,
+    0xf4, 0x3f, 0x61, 0x39, 0x42, 0x48, 0xcb, 0xba, 0xaa, 0xda, 0x7d, 0x53, 0xc2, 0x63, 0xbe, 0x0d,
+    0x05, 0xf2, 0xdb, 0x41, 0x74, 0xa4, 0xab, 0xee, 0xeb, 0x1b, 0xa3, 0x21, 0x4f, 0x65, 0x7a, 0x76,
+    0xd7, 0xaf, 0xe6, 0x2c, 0xe9, 0x17, 0x66, 0x68, 0x86, 0x22, 0x7d, 0xc9, 0x63, 0x9f, 0xdc, 0xb4,
+    0x26, 0x03, 0x98, 0x31, 0x4a, 0x82, 0x1c, 0xf9, 0x8b, 0x8b, 0x82, 0x71, 0xae, 0x47, 0x0c, 0xf3,
+    0xd5, 0x76, 0x2a, 0xda, 0x7b, 0x01, 0x5f, 0x04, 0xd1, 0xc1, 0xe0, 0x76, 0x1e, 0x66, 0xd7, 0x18,
+    0xb4, 0xa7, 0xc9, 0x0b, 0x1d, 0xba, 0x2e, 0x00, 0x4e, 0x8b, 0x4e, 0xdc, 0x40, 0x1f, 0x3e, 0xd7,
+    0xf5, 0xf2, 0x0b, 0xec, 0xa3, 0x8c, 0xcd, 0xa4, 0x27, 0xf1, 0x8a, 0x87, 0x4d, 0x9b, 0x27, 0x3f,
+    0xc9, 0xe5, 0x42, 0xa2, 0x03, 0x49, 0xf2, 0x33, 0x99, 0xa9, 0x8b, 0xd1, 0x36, 0x22, 0x33, 0x1b,
+    0x4d, 0x59, 0xe0, 0x70, 0xd9, 0x42, 0xe3, 0x0d, 0x89, 0x61, 0x7b, 0xdc, 0x0b, 0x48, 0xab, 0x10,
+    0xa4, 0x6b, 0xa2, 0x50, 0x92, 0x77, 0x05, 0x48, 0xcb, 0x24, 0xef, 0x93, 0xbd, 0xad, 0x95, 0x39,
+    0x7d, 0x22, 0x65, 0x9c, 0x9c, 0xb0, 0x42, 0x18, 0xfc, 0xf2, 0x0b, 0xac, 0xa2, 0xf7, 0x0a, 0x94,
+    0x07, 0xa2, 0xf0, 0x77, 0x04, 0x06, 0x55, 0x67, 0x23, 0xe4, 0x6b, 0x49, 0x17, 0x99, 0x9b, 0x43,
+    0x7c, 0x9b, 0x83, 0x39, 0xb2, 0xe9, 0xbe, 0xa8, 0x9b, 0x14, 0xd5, 0x21, 0x74, 0x6f, 0x38, 0x2c,
+    0x94, 0xa1, 0x13, 0x3a, 0x0b, 0x58, 0x76, 0xf3, 0xe1, 0xfa, 0xcd, 0x54, 0x6c, 0x0a, 0xf4, 0xed,
+    0xc7, 0x8d, 0x7e, 0xc9, 0xb4, 0x4b, 0xc8, 0xc5, 0x52, 0xd6, 0x20, 0x3f, 0xfe, 0x9b, 0x03, 0xfe,
+    0x8c, 0xe5, 0xb7, 0x80, 0x09, 0x2f, 0x4d, 0x83, 0x88, 0x0e, 0xd4, 0x04, 0xea, 0xb5, 0x08, 0x5d,
+    0x38, 0xf9, 0x29, 0x07, 0x99, 0x08, 0x42, 0xd5, 0xf5, 0x21, 0x8e, 0xdb, 0xab, 0x64, 0x08, 0x71,
+    0x51, 0x3b, 0x89, 0x41, 0x03, 0x2d, 0x30, 0xc5, 0x08, 0x3e, 0x06, 0x3c, 0x2e, 0x09, 0x06, 0x87,
+    0xd1, 0xb6, 0x7f, 0x45, 0x77, 0xac, 0xe6, 0x6e, 0xc0, 0x59, 0x3c, 0x08, 0xbb, 0xd1, 0xe9, 0x5e,
+    0xc3, 0xc0, 0x57, 0xeb, 0xf3, 0x5f, 0x34, 0x2a, 0x9c, 0xfe, 0xbb, 0xa9, 0x59, 0x27, 0xc7, 0x70,
+    0xd6, 0x4c, 0x48, 0x23, 0xd7, 0x9a, 0xdf, 0xb3, 0x9d, 0x73, 0x10, 0x8e, 0xc6, 0x90, 0xfb, 0xf9,
+    0xde, 0x5b, 0x4a, 0x94, 0xa0, 0x9e, 0x68, 0x6f, 0x03, 0x2e, 0xda, 0x9d, 0xa7, 0x5b, 0xae, 0xa4,
+    0x1b, 0xa2, 0xd6, 0xf4, 0x67, 0xa6, 0x75, 0xe8, 0x91, 0x66, 0x36, 0x64, 0x9e, 0x2d, 0xb9, 0x69,
+    0x46, 0xd3, 0xe1, 0x3e, 0x1e, 0xb9, 0xe6, 0x80, 0xd6, 0xed, 0x02, 0xaf, 0x9c, 0xdf, 0x9d, 0xb4,
+    0xf2, 0xdc, 0x79, 0xa6, 0x97, 0xfb, 0x2c, 0xd9, 0xef, 0x1b, 0x27, 0x7d, 0x50, 0xc1, 0x7b, 0x4b,
+    0xd4, 0x22, 0x00, 0x8f, 0x40, 0x63, 0x56, 0x1b, 0x0f, 0x71, 0x55, 0xd6, 0x0c, 0x3d, 0xe9, 0x37,
+    0x71, 0x9b, 0x13, 0x78, 0xaa, 0x77, 0x28, 0xe7, 0x6b, 0xdd, 0xfa, 0x49, 0xee, 0x19, 0xb1, 0xf8,
+    0xd9, 0xd6, 0x7e, 0xce, 0xae, 0x0b, 0x41, 0x4e, 0x1a, 0x41, 0x61, 0x68, 0xf8, 0x39, 0xab, 0x60,
+    0x83, 0x22, 0x7e, 0x9b, 0xbc, 0x59, 0x66, 0xe5, 0x3e, 0xbb, 0xe9, 0xf3, 0x96, 0xa8, 0xe5, 0xf5,
+    0xad, 0xc8, 0xfb, 0x96, 0x97, 0xc8, 0x7a, 0x29, 0x46, 0xe5, 0x3b, 0xe7, 0x50, 0x9a, 0x6d, 0xf6,
+    0x5f, 0x47, 0x27, 0xba, 0x53, 0x3e, 0xf7, 0x86, 0x02, 0xf1, 0xde, 0x2b, 0x65, 0xc2, 0x6b, 0xb8,
+    0x70, 0xde, 0xb2, 0x46, 0x40, 0x83, 0x76, 0x60, 0x6b, 0x78, 0x5d, 0xa2, 0x67, 0xcd, 0x95, 0x82,
+    0x33, 0x8b, 0xa3, 0x67, 0x49, 0xdd, 0xff, 0xb3, 0xc1, 0xf9, 0x35, 0xbb, 0x0d, 0xec, 0x7a, 0x58,
+    0x7e, 0x3f, 0xee, 0x13, 0xa0, 0x4d, 0x9a, 0x85, 0x41, 0xcc, 0xf8, 0x33, 0x3f, 0x93, 0xf2, 0x71,
+    0x81, 0xa1, 0xa5, 0x80, 0x0c, 0x0a, 0xbf, 0xfd, 0x5c, 0xbc, 0x30, 0x69, 0x6a, 0x55, 0x5d, 0x6f,
+    0x30, 0xa0, 0x86, 0x0d, 0x5f, 0x5f, 0xb9, 0x51, 0xa6, 0x6f, 0x2f, 0xd0, 0x8e, 0xed, 0x9e, 0x80,
+    0xad, 0x8d, 0x2f, 0xdd, 0x6e, 0x99, 0x92, 0x62, 0xae, 0xe8, 0xe1, 0x5f, 0xf6, 0x1a, 0x2b, 0x1f,
+    0xc1, 0xfc, 0x60, 0x7d, 0xcb, 0xfb, 0xa4, 0xc7, 0x88, 0xd1, 0xd9, 0x34, 0x31, 0x8a, 0x81, 0xf2,
+    0x79, 0xef, 0xcd, 0x61, 0x36, 0xb4, 0x3f, 0x08, 0x67, 0x92, 0xb6, 0xbd, 0x7e, 0x61, 0x98, 0xff,
+    0xf3, 0x4d, 0x97, 0xfb, 0x00, 0xf3, 0x9e, 0xcc, 0xb9, 0x32, 0x1f, 0x1c, 0xcf, 0x1d, 0xcc, 0xa9,
+    0xed, 0x96, 0x7f, 0x6e, 0x1e, 0x67, 0xba, 0xc4, 0x1a, 0x74, 0x56, 0xa7, 0x03, 0x9c, 0xf8, 0x96,
+    0x66, 0x40, 0xee, 0x9b, 0xa8, 0xdb, 0xd9, 0x1b, 0xbb, 0xbc, 0xb3, 0xd0, 0xaa, 0xfd, 0x15, 0xb1,
+    0x5a, 0xa4, 0xcb, 0xc9, 0x2d, 0x95, 0x5d, 0x5a, 0x07, 0xf9, 0x1b, 0x62, 0x4c, 0xc3, 0xf5, 0x1c,
+    0x0c, 0xab, 0xe7, 0xae, 0x6a, 0x4e, 0x40, 0xc7, 0x21, 0xc1, 0x4c, 0xd0, 0xd8, 0xa3, 0xcf, 0x50,
+    0x5b, 0x5e, 0x72, 0xa3, 0x0c, 0x34, 0x23, 0x8f, 0x28, 0x84, 0x34, 0x78, 0x16, 0xd2, 0x17, 0xd1,
+    0xa2, 0xcf, 0x58, 0x3a, 0x35, 0xca, 0xbc, 0x30, 0xd4, 0x12, 0x90, 0x0f, 0x16, 0x78, 0x52, 0x8a,
+    0x8b, 0xf8, 0x23, 0x42, 0x41, 0x8a, 0x77, 0xe7, 0xf3, 0x19, 0xfb, 0x88, 0x58, 0x06, 0xf3, 0x3a,
+    0xee, 0xd2, 0xe9, 0xb6, 0x0d, 0xcf, 0xc1, 0x51, 0xcc, 0xd1, 0x2b, 0x55, 0x9a, 0x24, 0xf0, 0x72,
+    0x50, 0x25, 0xe1, 0x5f, 0xd5, 0x2f, 0x20, 0x6f, 0xee, 0xee, 0xed, 0x8f, 0x9c, 0x49, 0x08, 0xd1,
+    0x1d, 0x7d, 0x2e, 0xc0, 0x61, 0x68, 0x5a, 0xe5, 0x81, 0x11, 0xa9, 0xec, 0xa7, 0x67, 0x8c, 0x18,
+    0xab, 0x15, 0x4b, 0x9c, 0xef, 0x3f, 0xa9, 0xc6, 0x95, 0x76, 0x58, 0x2c, 0x62, 0x09, 0xde, 0xed,
+    0x73, 0x3e, 0xfc, 0x69, 0x0f, 0xa6, 0xfb, 0x6f, 0x9e, 0x3a, 0x5c, 0x27, 0x24, 0x26, 0xb3, 0x83,
+    0x86, 0x27, 0x83, 0x78, 0xcf, 0x32, 0x4e, 0x7d, 0xb6, 0x72, 0xee, 0x5f, 0x11, 0xed, 0xa2, 0xc5,
+    0x96, 0xda, 0xb3, 0xb3, 0xbc, 0xae, 0xd0, 0xca, 0x09, 0x3c, 0x0b, 0x2f, 0xc4, 0xca, 0x27, 0xd1,
+    0xd3, 0x54, 0xea, 0x6e, 0x0e, 0x1a, 0xe6, 0xd5, 0x74, 0x2b, 0x7e, 0xbb, 0x76, 0x51, 0xac, 0xe8,
+    0xa7, 0x34, 0xe1, 0x57, 0xf4, 0x3c, 0x3e, 0xa0, 0x95, 0x96, 0xf6, 0x94, 0x1b, 0xe1, 0x53, 0x2c,
+    0xb8, 0xfc, 0xad, 0xb3, 0x6f, 0x4e, 0x93, 0x24, 0x3a, 0x2e, 0xde, 0xe0, 0xec, 0x1e, 0x5a, 0x50,
+    0xcd, 0x38, 0xf5, 0xf1, 0xdc, 0x8f, 0x52, 0x03, 0xd5, 0x45, 0xc6, 0x9e, 0xbc, 0xbe, 0xbd, 0x10,
+    0x6b, 0xed, 0x81, 0x15, 0x92, 0x55, 0x96, 0xf6, 0x42, 0x16, 0x53, 0xd2, 0xb7, 0xa5, 0xe1, 0xa4,
+    0xba, 0x85, 0xa5, 0xd7, 0x21, 0x17, 0x0b, 0x7b, 0x40, 0x35, 0x04, 0x8f, 0x1a, 0x70, 0x28, 0xee,
+    0x18, 0x29, 0x05, 0x7b, 0x75, 0xb2, 0xaf, 0xd2, 0x71, 0x25, 0xf6, 0x6d, 0x9c, 0x90, 0x52, 0x76,
+    0x9b, 0x72, 0x4e, 0xd8, 0xe2, 0x59, 0x75, 0x63, 0x22, 0xbb, 0x7e, 0x24, 0x72, 0xc5, 0x1b, 0x2e,
+    0xa7, 0x7a, 0x42, 0xd0, 0x78, 0x9c, 0xd3, 0xe4, 0x38, 0xd1, 0xc8, 0x76, 0x04, 0xee, 0xf0, 0x3a,
+    0x39, 0x89, 0x3e, 0x55, 0x74, 0x51, 0xcd, 0x07, 0x73, 0x9a, 0xf3, 0x44, 0xf3, 0xda, 0x7f, 0x55,
+    0x98, 0x5b, 0x51, 0x1a, 0xd1, 0x38, 0x57, 0x2a, 0xb0, 0x8a, 0xcf, 0x0f, 0x7b, 0xea, 0xb5, 0x6c,
+    0x5f, 0x10, 0xb8, 0x1b, 0xe8, 0x52, 0x22, 0xad, 0x2a, 0xbb, 0xda, 0xcf, 0x7e, 0x30, 0x61, 0xb5,
+    0xec, 0xd1, 0x66, 0x30, 0x03, 0x13, 0x4e, 0xdd, 0x1d, 0x17, 0xe8, 0x0d, 0x63, 0x4a, 0x28, 0xa8,
+    0xca, 0xa1, 0x9c, 0xeb, 0x05, 0x19, 0xad, 0xa4, 0x72, 0x2d, 0xdc, 0x16, 0xc5, 0x26, 0xf9, 0x2b,
+    0xab, 0x6e, 0xdc, 0xe9, 0x37, 0x4a, 0xcb, 0xfe, 0x80, 0x53, 0x6e, 0xcc, 0x4d, 0x16, 0x27, 0xe3,
+    0x8e, 0x1d, 0x2a, 0x6d, 0x9a, 0xe2, 0xfc, 0x87, 0x6e, 0x5d, 0x09, 0x21, 0xdc, 0x5d, 0xc6, 0x04,
+    0xb7, 0x58, 0x99, 0xf0, 0x04, 0x1e, 0x35, 0xce, 0x95, 0x1b, 0x68, 0x54, 0x51, 0xd3, 0x7a, 0xe7,
+    0x7a, 0xaf, 0xd1, 0x06, 0x50, 0x16, 0x63, 0x95, 0x43, 0x1e, 0x63, 0xef, 0xb1, 0x85, 0x19, 0x8a,
+    0x8c, 0xd6, 0x10, 0x81, 0x09, 0x51, 0xf2, 0xa9, 0x71, 0x70, 0xe5, 0xb3, 0xa3, 0xb1, 0x89, 0x47,
+    0x0a, 0x54, 0x4f, 0x3d, 0xc9, 0x66, 0x3a, 0x8c, 0x1e, 0x18, 0x37, 0xc3, 0x98, 0x44, 0x1e, 0x1b,
+    0xed, 0xac, 0xc3, 0x36, 0x7c, 0x86, 0xee, 0x92, 0x32, 0x1d, 0xaa, 0x9a, 0x25, 0xb2, 0xe3, 0xcb,
+    0x55, 0xa2, 0xa4, 0xe7, 0x79, 0x41, 0x4c, 0x69, 0xb1, 0xf4, 0x49, 0x21, 0xbc, 0xfc, 0xc7, 0x0e,
+    0x97, 0xa7, 0x03, 0x95, 0xfb, 0x9e, 0xdf, 0x9d, 0x26, 0x61, 0x46, 0x57, 0x28, 0xea, 0x33, 0xc2,
+    0xa2, 0x53, 0x32, 0xf5, 0xd5, 0x05, 0x95, 0xcc, 0xa8, 0xba, 0xd6, 0x70, 0x40, 0x15, 0x0a, 0x36,
+    0xc3, 0x0a, 0x37, 0xab, 0x16, 0x25, 0x56, 0x61, 0x04, 0x85, 0x5f, 0x85, 0xd1, 0xfc, 0x4c, 0x9f,
+    0x64, 0xc1, 0xee, 0xa3, 0x8d, 0x2e, 0x46, 0xae, 0x74, 0x2c, 0x31, 0x13, 0x67, 0xa6, 0x21, 0x63,
+    0xfd, 0x66, 0xdf, 0x0c, 0xf9, 0x41, 0x13, 0x4d, 0xd2, 0x8e, 0x6c, 0xe7, 0xaf, 0x99, 0x6f, 0x9e,
+    0xec, 0x1b, 0x47, 0xba, 0x05, 0xbf, 0x3f, 0x14, 0x0e, 0x9d, 0x9d, 0xea, 0x38, 0xdd, 0x75, 0xba,
+    0x4b, 0x56, 0x28, 0xdf, 0xea, 0x39, 0xea, 0xb8, 0xdf, 0xe2, 0x1f, 0x05, 0x75, 0x6c, 0x6b, 0x3c,
+    0xc6, 0xc3, 0x9b, 0x78, 0x62, 0x86, 0x69, 0x1b, 0xfd, 0x0d, 0xf9, 0x91, 0xde, 0x01, 0x68, 0x60,
+    0x1f, 0xa7, 0x78, 0xa7, 0x1a, 0xeb, 0x7e, 0xec, 0x8f, 0x90, 0x7f, 0x1e, 0x66, 0x5f, 0xa2, 0x75,
+    0xe3, 0x60, 0x15, 0xac, 0x80, 0x1d, 0x40, 0x36, 0x0c, 0x8d, 0x71, 0x1c, 0x6c, 0xca, 0x15, 0x91,
+    0xd3, 0x8d, 0x39, 0xb6, 0x8c, 0xe5, 0x6c, 0xb0, 0xfe, 0x18, 0xed, 0x33, 0x83, 0x74, 0x62, 0x86,
+    0x91, 0x7f, 0x4f, 0x88, 0xb0, 0x68, 0xce, 0xcb, 0x30, 0xb3, 0xb7, 0x2f, 0x66, 0xd3, 0x39, 0x1d,
+    0x44, 0xaa, 0xd8, 0x2d, 0x04, 0xab, 0x4b, 0x57, 0x60, 0xb3, 0x06, 0x75, 0x60, 0x2a, 0xc7, 0xbe,
+    0x88, 0xd0, 0x85, 0xa8, 0xf1, 0x54, 0xef, 0xc1, 0x03, 0xd2, 0xe8, 0xd0, 0x46, 0x27, 0x8e, 0x13,
+    0xb8, 0x11, 0xc6, 0xc0, 0x7f, 0x74, 0x41, 0x8a, 0x6b, 0x92, 0x34, 0x5e, 0x99, 0x32, 0xc2, 0xc8,
+    0xfc, 0x60, 0xa7, 0x2d, 0x67, 0x3c, 0xf3, 0xa5, 0x5a, 0x16, 0xec, 0x2c, 0x1e, 0x73, 0x10, 0x1a,
+    0x73, 0x2d, 0xd4, 0xbb, 0x40, 0xf9, 0x2a, 0x62, 0xff, 0x2f, 0xc7, 0x10, 0x2c, 0x41, 0x3b, 0x9a,
+    0x32, 0xa9, 0xc2, 0x17, 0x98, 0xe9, 0xcb, 0xa2, 0x80, 0x41, 0xed, 0x62, 0x4a, 0xc0, 0x36, 0x2f,
+    0x43, 0x2d, 0x4f, 0x61, 0xc9, 0xfc, 0xbf, 0xa3, 0xa3, 0xdf, 0x71, 0xb9, 0xe9, 0x7e, 0x7f, 0x2c,
+    0xaf, 0x83, 0xd2, 0x1c, 0x6d, 0x5f, 0x9c, 0x91, 0x5b, 0x69, 0x63, 0x1c, 0x76, 0x0f, 0xd4, 0xda,
+    0x39, 0x13, 0xa4, 0xf9, 0xc4, 0x63, 0x68, 0xbc, 0xdb, 0x9c, 0x81, 0x60, 0x99, 0x37, 0xaa, 0xfe,
+    0xe2, 0x94, 0x24, 0x5e, 0x9f, 0x19, 0xe4, 0x4e, 0x6a, 0x68, 0x27, 0x8d, 0xb2, 0x87, 0x3d, 0x97,
+    0xb9, 0xe9, 0xfa, 0x78, 0xc2, 0x5f, 0x88, 0x00, 0x37, 0x6d, 0x06, 0x14, 0xfc, 0x09, 0xa7, 0x7a,
+    0x67, 0x4b, 0xbf, 0xbb, 0x2e, 0xef, 0x76, 0x66, 0x52, 0xe3, 0x65, 0xe4, 0x6a, 0xee, 0x51, 0xd0,
+    0x9b, 0x24, 0x2d, 0x12, 0x86, 0x9b, 0x00, 0x9d, 0x49, 0x48, 0xbf, 0x0f, 0x86, 0xc4, 0x42, 0x78,
+    0x2e, 0x90, 0x1b, 0x39, 0x53, 0xe3, 0x50, 0xd1, 0xed, 0xf9, 0xe9, 0xe7, 0x46, 0xa0, 0xc3, 0xed,
+    0x60, 0x9b, 0x86, 0x38, 0x12, 0x7e, 0x66, 0x1f, 0x04, 0xb7, 0x05, 0xb4, 0x4f, 0xab, 0x28, 0x30,
+    0xcd, 0xef, 0x10, 0xa7, 0x22, 0x64, 0x88, 0xbb, 0x62, 0x5f, 0x02, 0x27, 0x84, 0x4a, 0x50, 0xb6,
+    0x8c, 0xf9, 0x74, 0x06, 0x45, 0xb7, 0x92, 0xc5, 0x53, 0xb2, 0x50, 0xf4, 0x50, 0x0e, 0x03, 0x28,
+    0x78, 0xa1, 0xc7, 0x46, 0xec, 0x94, 0x8a, 0xad, 0xfb, 0x96, 0x08, 0x6f, 0xab, 0x09, 0xa4, 0xf1,
+    0x6d, 0x4e, 0x8c, 0x57, 0x50, 0x0f, 0xa9, 0x68, 0xb2, 0xcb, 0x69, 0x1f, 0x89, 0x90, 0x71, 0x69,
+    0xc3, 0x63, 0x71, 0x58, 0x7e, 0x58, 0x27, 0x06, 0x0c, 0xfd, 0x24, 0x65, 0x33, 0xaa, 0xd5, 0xad,
+    0xeb, 0x74, 0x91, 0x6c, 0x26, 0x2f, 0x3e, 0x95, 0x63, 0x79, 0xd8, 0x0e, 0xdb, 0xed, 0x8c, 0x13,
+    0xf2, 0x1f, 0xb7, 0xf2, 0xb2, 0xcb, 0x69, 0xee, 0x85, 0xce, 0xa2, 0x8d, 0xca, 0x70, 0xb8, 0x90,
+    0xc4, 0x43, 0xdb, 0xb3, 0x66, 0x39, 0x3e, 0x09, 0x25, 0xba, 0x32, 0x5a, 0xa4, 0xa6, 0x1d, 0x4f,
+    0x63, 0x23, 0xe0, 0x0f, 0x61, 0x17, 0xcc, 0xce, 0xed, 0x6d, 0xab, 0x6e, 0xf5, 0x91, 0xac, 0x6e,
+    0x94, 0x59, 0x67, 0x80, 0x8a, 0xa5, 0x5e, 0xf6, 0x87, 0x39, 0x57, 0xb9, 0x25, 0x81, 0xe7, 0xe8,
+    0x1e, 0xfd, 0x28, 0x38, 0x2a, 0xfb, 0x87, 0x7c, 0x68, 0xac, 0xc7, 0xcc, 0x65, 0x96, 0xda, 0x1f,
+    0x5f, 0x4e, 0x51, 0x76, 0x3a, 0xfe, 0x28, 0xa4, 0xa6, 0xd4, 0x1d, 0x76, 0x7a, 0xf8, 0xa7, 0xee,
+    0x39, 0xe5, 0xb7, 0x79, 0x4a, 0xfb, 0x78, 0x13, 0xe7, 0x8b, 0xa3, 0xa7, 0xa8, 0xf2, 0x2e, 0x07,
+    0x36, 0x2d, 0xf0, 0x14, 0xd6, 0xf2, 0xb4, 0x53, 0xe5, 0x70, 0x3e, 0x38, 0x7a, 0x9d, 0x78, 0x2d,
+    0xde, 0x7c, 0x1d, 0x07, 0x04, 0x7f, 0xd6, 0xc6, 0x89, 0xaa, 0xe5, 0xdb, 0x6f, 0x5b, 0x96, 0xae,
+    0xe5, 0xf4, 0x64, 0x18, 0x15, 0xf2, 0xde, 0x7b, 0x2e, 0x53, 0xa3, 0x7a, 0x92, 0x0d, 0xfc, 0x7a,
+    0xb1, 0xf6, 0xb1, 0x39, 0x61, 0x09, 0xb5, 0x9f, 0x8a, 0x4c, 0x5c, 0x25, 0xf7, 0x3a, 0xbe, 0x4c,
+    0xf0, 0x95, 0xec, 0x51, 0x31, 0x73, 0x53, 0xc7, 0xf9, 0x58, 0xe1, 0x16, 0x42, 0xd6, 0xa9, 0x19,
+    0x0c, 0x7e, 0x9c, 0x6b, 0x4d, 0x9f, 0x9b, 0x01, 0x9a, 0x86, 0x66, 0xe4, 0x91, 0x5b, 0x0b, 0x4a,
+    0x6f, 0x06, 0x02, 0x7e, 0x47, 0xca, 0x8e, 0x55, 0x06, 0xc2, 0x93, 0x0a, 0xc6, 0x10, 0x4f, 0xb8,
+    0x27, 0x93, 0xbd, 0x85, 0xfa, 0x5f, 0xf6, 0xbb, 0x2e, 0xd4, 0xba, 0x14, 0xba, 0x79, 0xe4, 0x0d,
+    0xa0, 0xd1, 0x83, 0x51, 0x8e, 0xe2, 0xe9, 0xb0, 0x28, 0xe0, 0xf0, 0x91, 0x17, 0xce, 0x65, 0xe1,
+    0xa6, 0xeb, 0x22, 0x97, 0x76, 0x39, 0x3d, 0xd5, 0x93, 0x91, 0x6d, 0x6c, 0xaf, 0xdb, 0x76, 0x65,
+    0x0c, 0xaa, 0xfe, 0x4f, 0xa1, 0xf5, 0x06, 0xc2, 0xce, 0xde, 0xbd, 0xaa, 0x22, 0x88, 0x60, 0x4a,
+    0xa2, 0xb0, 0x58, 0x9c, 0x3b, 0x47, 0x3c, 0x73, 0x1a, 0xc0, 0xfe, 0x3d, 0xb7, 0x6b, 0x5c, 0xa8,
+    0x0f, 0x71, 0x64, 0xac, 0x34, 0xf2, 0x4e, 0x2b, 0x18, 0xe3, 0x97, 0x40, 0x5e, 0x1b, 0x1b, 0x6c,
+    0x6a, 0x7a, 0x41, 0x66, 0x79, 0x5e, 0x2b, 0x39, 0xba, 0x8f, 0x1f, 0x08, 0x33, 0x08, 0xb6, 0x57,
+    0x8e, 0x06, 0x3c, 0x99, 0x04, 0x72, 0x6b, 0x18, 0x49, 0x31, 0xad, 0x83, 0xf4, 0xdf, 0xb8, 0x41,
+    0x6e, 0x34, 0xdb, 0x69, 0x44, 0x1b, 0x04, 0xe7, 0x2b, 0x74, 0x64, 0x30, 0x5d, 0x52, 0x40, 0xab,
+    0xeb, 0xb4, 0x2c, 0xc3, 0xd1, 0x52, 0x76, 0xb0, 0xad, 0xc7, 0x7c, 0x18, 0xe0, 0x18, 0xd0, 0x1b,
+    0x81, 0x17, 0xc6, 0x67, 0x3e, 0x21, 0xa7, 0x8f, 0x88, 0xb3, 0xd0, 0x89, 0x37, 0x72, 0xd4, 0xec,
+    0x1f, 0x02, 0xb3, 0x5b, 0x19, 0xb8, 0x87, 0x49, 0x49, 0xa5, 0x1b, 0xbc, 0xdd, 0x14, 0xb2, 0xe6,
+    0x42, 0x64, 0x77, 0x74, 0x53, 0x30, 0x65, 0x0c, 0x16, 0xa6, 0x61, 0x45, 0xee, 0x5b, 0x20, 0xcc,
+    0xad, 0xca, 0x8c, 0x53, 0xb3, 0x83, 0x86, 0xd2, 0x73, 0x43, 0x9d, 0x34, 0xb8, 0x8f, 0xec, 0x76,
+    0x54, 0x42, 0xc3, 0x7e, 0x91, 0xe9, 0xe3, 0x7e, 0x12, 0x97, 0x08, 0xdb, 0x5f, 0x84, 0x07, 0xd5,
+    0x7b, 0x80, 0xeb, 0x6f, 0xf8, 0xa8, 0x9e, 0xfd, 0x68, 0xcb, 0xb6, 0xff, 0xa8, 0xb1, 0x1d, 0x4a,
+    0x63, 0xe0, 0xfe, 0xde, 0x94, 0x16, 0x45, 0x01, 0xbf, 0x47, 0xde, 0x75, 0xc4, 0xdd, 0x3c, 0x57,
+    0x64, 0x10, 0xcf, 0x6d, 0xfc, 0x82, 0xd9, 0xb4, 0xe9, 0x98, 0x1a, 0x8f, 0xe1, 0xc0, 0x1d, 0xe6,
+    0x6e, 0x2f, 0x1d, 0x47, 0x8e, 0xdb, 0xbe, 0x9e, 0x38, 0xfe, 0x5c, 0x8c, 0x12, 0xd6, 0x61, 0x66,
+    0xc1, 0x67, 0xb1, 0xe7, 0x4d, 0x57, 0x64, 0xd6, 0x9e, 0x58, 0x4f, 0x56, 0x4e, 0x48, 0xb7, 0x9b,
+    0x0d, 0xfa, 0x03, 0x0b, 0x2a, 0x2d, 0x74, 0xcd, 0x1e, 0x8d, 0xd9, 0x8e, 0xbc, 0xbc, 0x5b, 0x0a,
+    0x6a, 0xe4, 0x3e, 0x1d, 0x8b, 0x82, 0x96, 0x29, 0xad, 0xd0, 0x5c, 0x16, 0x20, 0xd4, 0xed, 0xb0,
+    0x07, 0x65, 0x56, 0x4a, 0xc6, 0xd1, 0x48, 0x2c, 0xff, 0x45, 0x19, 0xdb, 0x9d, 0xec, 0x0d, 0xd0,
+    0xbf, 0x1e, 0x6c, 0x40, 0xb9, 0x80, 0x78, 0x01, 0x6e, 0x8f, 0x9a, 0x9d, 0x49, 0x81, 0x3f, 0x31,
+    0x95, 0xf3, 0xe9, 0xd2, 0x04, 0xed, 0x86, 0x01, 0xc5, 0x2f, 0x92, 0x5b, 0xab, 0x95, 0xcc, 0x18,
+    0x5c, 0x81, 0x5d, 0x74, 0xa3, 0x20, 0x68, 0x1d, 0xa1, 0xec, 0x78, 0x5f, 0x63, 0x22, 0x9e, 0x30,
+    0x0d, 0xc7, 0x09, 0x84, 0xbe, 0x83, 0xe5, 0xe5, 0x07, 0x85, 0x2d, 0x1b, 0x7f, 0xbe, 0x75, 0xbd,
+    0xfe, 0x3a, 0xc6, 0x10, 0xb5, 0x84, 0x07, 0xf1, 0x8b, 0xac, 0x02, 0x33, 0x00, 0x32, 0xaa, 0x11,
+    0x57, 0xf0, 0x45, 0x60, 0xca, 0x74, 0x74, 0xcd, 0x12, 0x13, 0xea, 0x9b, 0x6a, 0xd0, 0x74, 0x15,
+    0x8f, 0xe4, 0xa8, 0x07, 0xfc, 0x3d, 0xa2, 0xb2, 0xf7, 0x3b, 0xa2, 0xfe, 0x44, 0x6e, 0xea, 0xf1,
+    0xb7, 0x72, 0x35, 0x02, 0x12, 0xa2, 0xdc, 0x93, 0x68, 0x25, 0xea, 0xdd, 0x3b, 0x8f, 0xc0, 0xa7,
+    0x32, 0xe4, 0xe7, 0xaf, 0x9d, 0x9e, 0xdc, 0x1f, 0xca, 0x33, 0xdd, 0xd9, 0x07, 0x41, 0xba, 0x62,
+    0x40, 0x03, 0xe6, 0xd3, 0x0e, 0x0f, 0x81, 0xf3, 0xe6, 0x6a, 0x57, 0x2a, 0x99, 0x87, 0x32, 0xc7,
+    0x22, 0xe5, 0xe2, 0x25, 0xcf, 0x37, 0x7f, 0x27, 0xaa, 0xb7, 0x3e, 0x78, 0x28, 0xd3, 0x38, 0x61,
+    0xad, 0x02, 0xd5, 0x3f, 0xb5, 0x50, 0x1f, 0x39, 0xf0, 0x9f, 0xa0, 0xf7, 0xc0, 0xf8, 0xb6, 0x26,
+    0xca, 0x79, 0x56, 0xa7, 0x3e, 0xfb, 0x27, 0x0c, 0x36, 0x28, 0x1b, 0x49, 0xc1, 0xc9, 0xf3, 0xe9,
+    0x91, 0xb5, 0x2b, 0x2f, 0xe1, 0xd1, 0xfa, 0x6f, 0x7b, 0xab, 0x58, 0x29, 0xef, 0x41, 0x09, 0x2f,
+    0x01, 0x00, 0x19, 0x2c, 0xf7, 0x18, 0xbb, 0x38, 0x60, 0x25, 0x04, 0x40, 0xb3, 0x40, 0xf9, 0x3e,
+    0x6f, 0xa7, 0xaa, 0xea, 0x42, 0xcf, 0x73, 0x52, 0xd9, 0x6d, 0xd4, 0x22, 0xb6, 0x6d, 0x3e, 0x3b,
+    0x26, 0x65, 0x90, 0x58, 0x1d, 0x19, 0x92, 0x76, 0x5a, 0xc0, 0x0f, 0x3e, 0x22, 0x34, 0xc1, 0x5e,
+    0x9c, 0x17, 0x2c, 0xe7, 0xfb, 0x08, 0x73, 0xdb, 0xb4, 0x6c, 0x2c, 0x34, 0xc3, 0xec, 0x03, 0x27,
+    0xa1, 0x72, 0xfe, 0x22, 0xb7, 0x08, 0x52, 0x2a, 0xaa, 0xf0, 0x60, 0xc2, 0x98, 0x6e, 0xae, 0xa1,
+    0xfb, 0x1e, 0x3c, 0xc2, 0x9a, 0x0a, 0x1d, 0x7a, 0x93, 0xe3, 0xc5, 0x88, 0x41, 0x0f, 0x1b, 0xcd,
+    0x0a, 0x20, 0xbd, 0x25, 0x92, 0x6f, 0xa9, 0xb5, 0x78, 0x2d, 0x70, 0x0b, 0x0e, 0x48, 0x86, 0x8c,
+    0xd8, 0xe5, 0xc6, 0x2a, 0xf7, 0x2f, 0x7e, 0xf8, 0x98, 0x83, 0x1f, 0xc1, 0x53, 0x79, 0x64, 0x55,
+    0x6d, 0x1b, 0xc3, 0xcd, 0x2a, 0xb5, 0x23, 0xe5, 0x48, 0x2a, 0xf7, 0x5d, 0xf5, 0x0e, 0x3e, 0x16,
+    0x88, 0x3b, 0x65, 0x5f, 0x43, 0xf9, 0x8a, 0x98, 0x22, 0x7e, 0xce, 0x61, 0xd5, 0xe0, 0x6c, 0xa9,
+    0x25, 0x1a, 0xb6, 0x21, 0x96, 0xc2, 0x51, 0x53, 0x91, 0x94, 0xf2, 0xdd, 0x2f, 0x08, 0x5b, 0x7e,
+    0x11, 0x21, 0x14, 0xb0, 0x08, 0xcc, 0x71, 0xf6, 0x90, 0x0e, 0x61, 0x5f, 0x61, 0x77, 0xfe, 0x76,
+    0x8d, 0xa2, 0x2d, 0xae, 0x9b, 0x21, 0x16, 0x44, 0xb1, 0xf5, 0x20, 0xaf, 0xc7, 0xb3, 0xeb, 0x37,
+    0xe7, 0xfe, 0xc5, 0x02, 0xe5, 0xb8, 0x4d, 0x15, 0x12, 0x12, 0xa3, 0xd9, 0xb4, 0x53, 0x4a, 0x21,
+    0xb2, 0xf1, 0x50, 0x5c, 0xab, 0x0e, 0xc7, 0x32, 0x2b, 0xd2, 0x6d, 0x3f, 0xc9, 0xfd, 0x90, 0x5f,
+    0xce, 0x75, 0xcd, 0x45, 0x6d, 0x67, 0xc1, 0xb7, 0x06, 0xf4, 0xe0, 0x2a, 0x3a, 0x42, 0xf0, 0x6c,
+    0x07, 0x97, 0x45, 0x25, 0x8c, 0xdb, 0xdb, 0x02, 0xcf, 0x6a, 0x8f, 0x3a, 0xea, 0x18, 0xfd, 0x59,
+    0x5b, 0x06, 0xbf, 0x47, 0x1a, 0xb1, 0x9b, 0x30, 0x64, 0xc2, 0x1b, 0x9b, 0xc5, 0x2a, 0x6d, 0x76,
+    0x91, 0x5c, 0xd6, 0x96, 0xec, 0x75, 0x22, 0x91, 0x97, 0x0f, 0x14, 0x62, 0x5c, 0x9d, 0x6f, 0xfe,
+    0x51, 0x81, 0xcc, 0x31, 0x8c, 0x7e, 0x6a, 0x10, 0x57, 0x2a, 0x7d, 0x51, 0x15, 0x1f, 0xb6, 0x37,
+    0xb6, 0x69, 0x59, 0x1a, 0xb4, 0x40, 0x7e, 0x42, 0x27, 0x6e, 0x14, 0xc7, 0xe6, 0x4d, 0x52, 0x29,
+    0x1e, 0xf0, 0x7c, 0x2b, 0x36, 0x61, 0x58, 0x22, 0x4a, 0x2c, 0xee, 0xec, 0x02, 0x11, 0xd5, 0xdb,
+    0x3a, 0x8d, 0xed, 0xd8, 0x9f, 0xb5, 0x7a, 0x03, 0x40, 0xa5, 0x64, 0x61, 0x28, 0xf6, 0xfd, 0x11,
+    0xf6, 0x25, 0x78, 0xc4, 0x12, 0x91, 0xdb, 0x9d, 0xc1, 0xe6, 0x5d, 0x97, 0xfc, 0x0a, 0xff, 0xd2,
+    0x19, 0x0c, 0x0d, 0xd1, 0xe6, 0x62, 0x35, 0xb6, 0x31, 0x85, 0xc0, 0x22, 0x61, 0xf8, 0xdf, 0xc5,
+    0x32, 0x17, 0xb4, 0xfb, 0x33, 0x9d, 0xf0, 0xfb, 0xb8, 0x8f, 0xc4, 0xd6, 0x73, 0xfc, 0x4e, 0xb5,
+    0x6f, 0x88, 0xe9, 0x5d, 0x48, 0x77, 0xa1, 0x76, 0xcd, 0xcc, 0xae, 0x86, 0x49, 0x6b, 0x11, 0xf9,
+    0x13, 0xbe, 0xd1, 0x9b, 0xdc, 0xeb, 0xe2, 0xed, 0xda, 0x4c, 0xfe, 0x27, 0x1b, 0x4d, 0x49, 0x79,
+    0x13, 0xf7, 0x7a, 0x6a, 0x7f, 0x1b, 0x32, 0xf0, 0x8c, 0x9d, 0x18, 0x79, 0xcf, 0xe2, 0xc1, 0x69,
+    0xb4, 0xd8, 0x59, 0x34, 0x4c, 0x52, 0x91, 0xa9, 0x07, 0x01, 0x1a, 0x2c, 0x71, 0xfc, 0xbb, 0x0b,
+    0x23, 0xd4, 0x0d, 0xd2, 0xe4, 0xbf, 0x71, 0x7a, 0xa9, 0xa1, 0x09, 0x98, 0xf0, 0x9d, 0x00, 0x96,
+    0x1c, 0x38, 0xb5, 0xb2, 0xaf, 0x8a, 0x3a, 0x31, 0x0d, 0xd0, 0xb5, 0x18, 0xd7, 0x84, 0xed, 0x71,
+    0x9e, 0xb7, 0xd3, 0x53, 0x1f, 0x5b, 0x9c, 0x26, 0xb8, 0xbf, 0x9e, 0x16, 0xcd, 0x65, 0x15, 0xc8,
+    0xe5, 0x29, 0x57, 0x36, 0xa2, 0x4b, 0x6a, 0x18, 0xc4, 0xee, 0x7e, 0x66, 0x53, 0xb6, 0x0b, 0x18,
+    0xf2, 0xa6, 0xac, 0x3f, 0xbd, 0x25, 0xac, 0x5c, 0xf5, 0x28, 0xc1, 0xa5, 0xa6, 0x2f, 0x18, 0x37,
+    0x8c, 0x18, 0x3b, 0xab, 0x14, 0xda, 0xc1, 0x9f, 0xa5, 0xe5, 0x4f, 0xde, 0x8f, 0x57, 0x7d, 0x6d,
+    0xdb, 0x71, 0x09, 0xbc, 0xa3, 0x75, 0x7f, 0xdd, 0x05, 0x09, 0xf0, 0x96, 0xbe, 0xea, 0xe4, 0x5c,
+    0xd6, 0x23, 0x0e, 0x34, 0xee, 0x94, 0x7a, 0x41, 0x72, 0x3a, 0x1d, 0xdb, 0x55, 0x01, 0x20, 0xa1,
+    0xac, 0xb0, 0xd4, 0xe6, 0x05, 0x20, 0xf7, 0xf8, 0x3b, 0xf4, 0x98, 0x85, 0x5c, 0xcc, 0xb1, 0x62,
+    0x51, 0x88, 0x93, 0xd2, 0xfb, 0x7e, 0x17, 0x6e, 0xdb, 0xbc, 0x1d, 0x3f, 0x46, 0x02, 0x8c, 0x31,
+    0x5e, 0xfe, 0xc0, 0xd7, 0x45, 0xc1, 0x4c, 0x77, 0x6f, 0xa6, 0xf0, 0xda, 0xe0, 0x92, 0xd4, 0xa4,
+    0x16, 0xcc, 0x67, 0xf1, 0xc8, 0x65, 0x2e, 0x79, 0xea, 0x39, 0xa2, 0x7e, 0xbc, 0x83, 0x98, 0xaf,
+    0xb7, 0xcf, 0xf3, 0x11, 0xce, 0xc1, 0x10, 0xaa, 0x58, 0xe3, 0x6c, 0x48, 0x58, 0x13, 0xcb, 0x76,
+    0x15, 0x15, 0xd4, 0xeb, 0x74, 0x5a, 0xaa, 0xaa, 0x57, 0x22, 0x2b, 0x27, 0xc3, 0xcb, 0x7b, 0x85,
+    0x84, 0x39, 0x65, 0xfa, 0x4c, 0xeb, 0x7b, 0x46, 0xd1, 0xde, 0x53, 0xde, 0x58, 0x38, 0x23, 0xfb,
+    0xa6, 0xef, 0xaa, 0x3c, 0x14, 0x77, 0x81, 0xc3, 0x06, 0x61, 0x04, 0x50, 0xb5, 0xfb, 0x2b, 0x65,
+    0x88, 0xb2, 0x60, 0x3e, 0x20, 0x84, 0x5e, 0x98, 0x52, 0x5a, 0xb0, 0x22, 0xe8, 0x9d, 0x0a, 0xbf,
+    0xbb, 0xf9, 0x2c, 0x8f, 0x85, 0xb5, 0x49, 0xa9, 0x2d, 0xda, 0xcf, 0x31, 0x68, 0xbb, 0xe5, 0x7c,
+    0xec, 0xd2, 0xed, 0xac, 0x7e, 0x98, 0xfb, 0xb1, 0x15, 0x8c, 0x1f, 0x52, 0xec, 0x4f, 0x13, 0x64,
+    0xbf, 0x5e, 0x21, 0x8a, 0xf4, 0x73, 0x82, 0xa3, 0x9f, 0x05, 0x75, 0xf9, 0xf7, 0xb3, 0xcb, 0x83,
+    0x75, 0x56, 0x41, 0x56, 0xc6, 0x63, 0x97, 0x4a, 0xea, 0xee, 0x6b, 0x3d, 0x96, 0x90, 0xfa, 0x3f,
+    0x60, 0x1b, 0x4c, 0x86, 0x98, 0xeb, 0x52, 0xac, 0x2d, 0xeb, 0xf9, 0xf5, 0x6a, 0x56, 0x5e, 0x05,
+    0x00, 0x7e, 0x3f, 0x48, 0x01, 0x6e, 0x20, 0x1d, 0xe3, 0x62, 0x2a, 0x16, 0x29, 0x9f, 0xe8, 0xbf,
+    0xd9, 0x14, 0x02, 0xe3, 0x54, 0x96, 0xd3, 0xcf, 0x9d, 0x74, 0x39, 0x11, 0x24, 0x25, 0xe3, 0xc1,
+    0x1b, 0xbb, 0x23, 0xfc, 0xff, 0x13, 0xcb, 0x5e, 0x4e, 0xc7, 0x01, 0x6d, 0x7c, 0xe2, 0x19, 0x06,
+    0x4e, 0x0f, 0xfc, 0x38, 0xf5, 0x55, 0x41, 0xe1, 0x79, 0x5e, 0x5e, 0x65, 0x76, 0x0b, 0x2b, 0x04,
+    0x21, 0x14, 0x82, 0x4e, 0x5f, 0xdc, 0x7a, 0x36, 0x45, 0x63, 0xfb, 0xa3, 0x74, 0xc9, 0x65, 0xd5,
+    0xf3, 0xdd, 0x99, 0x94, 0x1c, 0xed, 0xdd, 0x15, 0x24, 0x56, 0x6c, 0xac, 0x7d, 0xf3, 0x43, 0x30,
+    0x72, 0x4d, 0xe6, 0xa7, 0xf9, 0x2b, 0x51, 0x24, 0x98, 0x8c, 0x9b, 0x76, 0x79, 0x5b, 0xd7, 0x0e,
+    0x8b, 0x00, 0x43, 0x2d, 0xa5, 0x2c, 0xf8, 0x58, 0xd4, 0xdf, 0xd2, 0xa4, 0x8d, 0xfc, 0xcf, 0x5c,
+    0x87, 0x00, 0xd9, 0x74, 0xc7, 0x8d, 0xc1, 0x21, 0x1e, 0xf5, 0x4b, 0x74, 0x71, 0x66, 0xb3, 0x1b,
+    0x7e, 0x06, 0x6b, 0x83, 0x13, 0x95, 0x68, 0x13, 0xed, 0xfa, 0x96, 0x9c, 0xb2, 0xf1, 0x94, 0xd5,
+    0x56, 0x5b, 0x62, 0x7f, 0x71, 0xbf, 0x0a, 0xea, 0x5e, 0xd3, 0x1c, 0xae, 0x0c, 0x1f, 0x1b, 0x33,
+    0x5a, 0x2d, 0x7c, 0x30, 0xa4, 0xb0, 0x91, 0x88, 0xf3, 0xaf, 0xf3, 0xb4, 0xb7, 0xaf, 0xcd, 0x08,
+    0x96, 0x09, 0xfa, 0xb9, 0x21, 0xc3, 0xf7, 0x22, 0xc3, 0x78, 0x1d, 0x6b, 0xff, 0xc3, 0x00, 0xea,
+    0x99, 0x0e, 0xa3, 0x22, 0xca, 0x9b, 0x49, 0x37, 0x85, 0x00, 0xb6, 0x59, 0xfd, 0x85, 0x43, 0xcf,
+    0xdc, 0x24, 0x00, 0x8e, 0xf9, 0xb1, 0xd2, 0xa8, 0x94, 0x55, 0x0a, 0xf7, 0x81, 0x32, 0x08, 0x84,
+    0xa2, 0x40, 0x7a, 0x2d, 0xbd, 0x0a, 0x5b, 0x11, 0x00, 0x16, 0xf6, 0x63, 0x01, 0x35, 0xb7, 0x8c,
+    0xe1, 0x0b, 0x2d, 0xf8, 0x9b, 0xbe, 0x43, 0xa6, 0xae, 0x45, 0x5e, 0x91, 0x7c, 0x16, 0x76, 0x91,
+    0xde, 0x48, 0x4f, 0x60, 0xb8, 0x03, 0x47, 0x65, 0xc8, 0x13, 0xf9, 0x03, 0xb9, 0xaa, 0xfe, 0x08,
+    0x8f, 0x3e, 0x8a, 0x8d, 0xbb, 0x1d, 0xa2, 0x46, 0x07, 0xa1, 0x35, 0xaf, 0x68, 0xc1, 0x27, 0xe3,
+    0xe1, 0x4e, 0x5a, 0xbb, 0x21, 0xb6, 0x52, 0xae, 0xc3, 0xfa, 0x30, 0xcd, 0x4e, 0x81, 0x79, 0xde,
+    0x67, 0x46, 0x9e, 0x0a, 0xd8, 0x89, 0x17, 0x30, 0xea, 0x05, 0xb9, 0xc0, 0x48, 0xd3, 0x8e, 0x09,
+    0x56, 0x59, 0x67, 0x41, 0xcc, 0xa4, 0xef, 0xdb, 0x7c, 0xa6, 0x0b, 0xbd, 0x2a, 0xb0, 0x5c, 0x74,
+    0x0f, 0xca, 0xf6, 0x2e, 0xe4, 0xe6, 0xf1, 0x74, 0x26, 0x49, 0x34, 0x41, 0xfa, 0xfd, 0xcc, 0xd0,
+    0x00, 0x83, 0x4b, 0x43, 0x0a, 0xe8, 0x5f, 0xd8, 0x69, 0x49, 0xd0, 0xf2, 0x34, 0x84, 0x16, 0x3d,
+    0x90, 0x96, 0x9a, 0x85, 0xac, 0x4e, 0xe0, 0x2b, 0x48, 0x10, 0xb5, 0xc6, 0xb5, 0x2d, 0x8f, 0x63,
+    0x9f, 0x87, 0x50, 0x99, 0x1b, 0xac, 0x8c, 0x65, 0x7f, 0x29, 0x16, 0xd9, 0xa0, 0xe6, 0x22, 0x63,
+    0x23, 0xdc, 0xa4, 0x9f, 0x28, 0x36, 0xa5, 0x57, 0xa1, 0x99, 0x36, 0x1f, 0x62, 0xc8, 0x3e, 0xa7,
+    0x7e, 0xf7, 0x63, 0xee, 0xed, 0xce, 0x48, 0x26, 0x88, 0x1c, 0x0d, 0x9e, 0xa1, 0xf1, 0xba, 0x1d,
+    0xf7, 0x7f, 0x19, 0x47, 0x6e, 0xa1, 0x06, 0xe0, 0x19, 0xd5, 0x9b, 0xfe, 0x24, 0x97, 0x8a, 0x3b,
+    0xc7, 0xe2, 0xe6, 0x10, 0x76, 0xbf, 0x57, 0x75, 0x17, 0xce, 0x17, 0x32, 0x4c, 0xb5, 0xc0, 0x95,
+    0x03, 0x45, 0xf5, 0x63, 0x05, 0x64, 0x25, 0x89, 0x7b, 0x96, 0x5a, 0xe4, 0x42, 0xa5, 0x42, 0x61,
+    0x58, 0xb7, 0xaf, 0x3d, 0xae, 0x83, 0xd7, 0x84, 0x9c, 0x6d, 0x10, 0x14, 0xaa, 0xd4, 0xc6, 0x56,
+    0xe5, 0x3a, 0xfb, 0x20, 0xd0, 0x40, 0x13, 0x2f, 0xe9, 0xe9, 0x83, 0x4c, 0xf5, 0xb7, 0x66, 0x5a,
+    0xb0, 0xf1, 0x0a, 0xa8, 0xcc, 0xe7, 0xec, 0xcf, 0x39, 0xb0, 0xbb, 0x39, 0x6a, 0x11, 0xeb, 0x48,
+    0x9c, 0xc4, 0xdf, 0x15, 0xfc, 0x8c, 0x40, 0x3d, 0xd0, 0xe3, 0x00, 0xee, 0xe1, 0xda, 0xf5, 0x96,
+    0x0f, 0x60, 0x6f, 0xd2, 0x20, 0x6e, 0x20, 0x89, 0x10, 0x1e, 0x8a, 0x65, 0x6d, 0x02, 0x0a, 0x13,
+    0x9d, 0x96, 0xf6, 0x17, 0x6f, 0xa0, 0x89, 0x39, 0xd5, 0x8d, 0xdc, 0x1a, 0x1a, 0xd1, 0x17, 0x7c,
+    0x69, 0x42, 0x35, 0xde, 0x30, 0x8e, 0x74, 0x71, 0xa7, 0x23, 0x5e, 0x0a, 0x6d, 0x61, 0x68, 0x77,
+    0x5a, 0x20, 0xb0, 0x4b, 0x06, 0x76, 0x93, 0x9e, 0x8e, 0x29, 0x39, 0x14, 0x55, 0x13, 0x0b, 0xd3,
+    0x13, 0xd8, 0x07, 0x8b, 0xe5, 0x8e, 0xa5, 0x32, 0xeb, 0x1f, 0x92, 0x17, 0x62, 0xf1, 0x6e, 0x6b,
+    0x3c, 0x0d, 0xef, 0xa1, 0x31, 0xff, 0x5f, 0xf0, 0x3a, 0xb8, 0xeb, 0xe8, 0xc4, 0x87, 0xbb, 0x56,
+    0xf6, 0x3d, 0xe4, 0xf3, 0x6e, 0xf1, 0xc1, 0x81, 0x45, 0xbe, 0xaf, 0x17, 0x95, 0xbd, 0xe1, 0x29,
+    0x41, 0x05, 0x42, 0x4c, 0x1e, 0x58, 0xdd, 0x2b, 0x88, 0xfd, 0xd0, 0x12, 0x0c, 0x6b, 0xd4, 0xbc,
+    0xa0, 0xe6, 0x13, 0xa6, 0xf6, 0xc1, 0xaa, 0xfe, 0x52, 0x8b, 0x38, 0x7c, 0x3a, 0xcb, 0x3b, 0x91,
+    0xc0, 0xcf, 0xd6, 0x68, 0x90, 0x44, 0x50, 0x3c, 0x1d, 0x9f, 0x4f, 0xf9, 0x55, 0x04, 0xb2, 0xa3,
+    0xc9, 0xbb, 0xde, 0x53, 0x59, 0xaa, 0xc1, 0xd2, 0xf7, 0x7f, 0x27, 0x02, 0x6a, 0x0a, 0x91, 0xd9,
+    0x9e, 0x34, 0x4e, 0xdf, 0x94, 0xbc, 0xa7, 0x4d, 0x5b, 0xe0, 0xfc, 0x7d, 0x3a, 0x77, 0x39, 0x86,
+    0xa1, 0x96, 0xdd, 0xf0, 0xab, 0xb1, 0xbe, 0xaa, 0x8e, 0x98, 0x34, 0x1c, 0x6e, 0x92, 0xfc, 0xc9,
+    0x79, 0xd6, 0x65, 0xda, 0x27, 0x6c, 0xaf, 0x71, 0xa6, 0x82, 0x76, 0x09, 0x17, 0xef, 0x6d, 0xce,
+    0xfa, 0x34, 0x57, 0x33, 0x51, 0x5e, 0xb8, 0xc8, 0x47, 0x25, 0x36, 0x80, 0x64, 0xae, 0x91, 0xc9,
+    0x2d, 0xab, 0x2e, 0x14, 0xd0, 0x9f, 0x2c, 0xe9, 0x74, 0x8a, 0x87, 0x1d, 0x5d, 0x4e, 0x58, 0x23,
+    0xdd, 0xeb, 0x53, 0x26, 0x0a, 0xdc, 0xab, 0x75, 0xa7, 0x43, 0x3d, 0xae, 0xf3, 0x86, 0x74, 0xde,
+    0xe7, 0x22, 0xd3, 0xa3, 0x17, 0x04, 0x6a, 0x0a, 0x9f, 0x23, 0xbf, 0xcd, 0x00, 0x12, 0x47, 0x5e,
+    0x2d, 0xdf, 0x33, 0x83, 0x92, 0xed, 0x21, 0xa7, 0x6e, 0xdd, 0xe6, 0xe6, 0xa9, 0x69, 0x17, 0xa9,
+    0x4e, 0x6c, 0x4e, 0xe0, 0x33, 0xc6, 0x23, 0x30, 0x7a, 0x88, 0xfa, 0x59, 0x1d, 0xc3, 0x87, 0x20,
+    0x58, 0xb7, 0x0a, 0xac, 0xe3, 0xd6, 0xe2, 0xfc, 0xa7, 0xef, 0x07, 0xf3, 0x3e, 0x82, 0xfe, 0x37,
+    0xaf, 0xb2, 0xfb, 0x02, 0x8d, 0x0d, 0x6b, 0x8b, 0xa1, 0x51, 0x87, 0xda, 0xb0, 0x2e, 0x49, 0xd4,
+    0x65, 0x1c, 0xd3, 0x17, 0x4c, 0xbe, 0x81, 0xe1, 0x7b, 0xda, 0xed, 0x1d, 0x45, 0x2d, 0xd9, 0x4d,
+    0x50, 0x57, 0xdf, 0x94, 0x19, 0x35, 0x20, 0x13, 0x33, 0x34, 0x0a, 0x18, 0x62, 0x21, 0x73, 0x9d,
+    0xdb, 0x73, 0x64, 0x36, 0x07, 0xaf, 0x30, 0x96, 0xa2, 0x69, 0x1f, 0x32, 0xc9, 0xf6, 0xe3, 0xa9,
+    0x30, 0xf8, 0x70, 0x7d, 0xfe, 0xfd, 0x6d, 0x53, 0x57, 0x0b, 0xd6, 0xbf, 0xb6, 0x1a, 0x1e, 0xdd,
+    0xaa, 0x79, 0x54, 0xdc, 0x0d, 0xce, 0x0c, 0x52, 0xff, 0xa6, 0xdc, 0xac, 0x15, 0x12, 0x43, 0x6e,
+    0x62, 0x3d, 0xc6, 0x40, 0x9a, 0xf3, 0x19, 0x40, 0x1a, 0x31, 0xef, 0xbc, 0x54, 0x11, 0xe4, 0xe6,
+    0xc7, 0x9a, 0x59, 0x2e, 0x27, 0x76, 0x7f, 0xb1, 0x6a, 0x6e, 0x99, 0x98, 0x32, 0xa5, 0x02, 0xc9,
+    0x74, 0x2e, 0x91, 0x57, 0x2f, 0x9b, 0x07, 0xa1, 0x57, 0x4e, 0xf8, 0xa5, 0x08, 0xa6, 0xa1, 0xab,
+    0xb6, 0xaf, 0x12, 0xfd, 0xae, 0x3b, 0xdf, 0x7c, 0xc1, 0x4a, 0x82, 0x39, 0x4f, 0x45, 0x03, 0x39,
+    0x46, 0xd4, 0xe0, 0x61, 0x5f, 0x4a, 0x6d, 0x09, 0x77, 0x77, 0x71, 0xb2, 0x7f, 0xdf, 0x71, 0x31,
+    0xfb, 0x31, 0x64, 0x90, 0xbc, 0x63, 0xd5, 0xa6, 0x94, 0x12, 0xaf, 0xee, 0x33, 0xe6, 0xa3, 0x14,
+    0x7b, 0x74, 0x47, 0x34, 0xe2, 0xbe, 0x52, 0x17, 0x79, 0xa7, 0x3a, 0xef, 0x53, 0x8c, 0xc5, 0xb9,
+    0x3f, 0xfb, 0x43, 0xcb, 0x26, 0xd3, 0x50, 0xc8, 0xed, 0x4f, 0xf8, 0x52, 0x86, 0x47, 0x68, 0x1b,
+    0x66, 0x88, 0x93, 0xe5, 0xb9, 0x4d, 0x69, 0x56, 0x90, 0x46, 0x33, 0xf8, 0x94, 0xd2, 0x4d, 0xea,
+    0x6b, 0x1c, 0x04, 0x0c, 0xcc, 0xeb, 0x8f, 0x10, 0x2a, 0xc2, 0x6d, 0x2f, 0x5d, 0x83, 0xd9, 0x5b,
+    0xcd, 0x82, 0xec, 0xc7, 0xf3, 0x22, 0x37, 0xf9, 0x79, 0x94, 0xc1, 0xa4, 0xcd, 0xf1, 0x98, 0x66,
+    0x48, 0x4c, 0x29, 0x0d, 0x75, 0x96, 0xba, 0x44, 0x89, 0x8f, 0x51, 0x42, 0xc5, 0xc0, 0x7e, 0x8b,
+    0x49, 0x69, 0x09, 0x17, 0x57, 0x38, 0xa4, 0x1e, 0x43, 0x1b, 0xdd, 0xd6, 0xb0, 0x0f, 0xc4, 0x19,
+    0x80, 0xab, 0x27, 0xf6, 0xf9, 0xc5, 0xb7, 0x0f, 0x57, 0x5a, 0x47, 0xb7, 0x2a, 0xc2, 0xf2, 0x92,
+    0xb0, 0x06, 0x2c, 0xff, 0x11, 0xd0, 0xe0, 0x5e, 0xb2, 0xe8, 0xe7, 0xfb, 0xa4, 0x2d, 0x72, 0xe1,
+    0xa0, 0xe3, 0xd9, 0xf0, 0xe4, 0x78, 0xba, 0x14, 0xb6, 0x0d, 0x6c, 0xf0, 0xbf, 0xca, 0x3a, 0xa4,
+    0x60, 0x5b, 0x0a, 0x27, 0x95, 0xb3, 0xcb, 0xd3, 0x23, 0x2f, 0xe9, 0xc3, 0xd7, 0x49, 0xc7, 0xf6,
+    0xb0, 0x51, 0x59, 0x83, 0xd2, 0xb0, 0xb8, 0x2b, 0xa3, 0x49, 0xad, 0x08, 0x2c, 0x9d, 0x53, 0x3f,
+    0xc6, 0x7c, 0x2c, 0xc3, 0xcf, 0xa3, 0xde, 0xc4, 0x85, 0x5b, 0x92, 0x0d, 0x1f, 0x10, 0xd9, 0x17,
+    0xaa, 0x3c, 0x41, 0x24, 0x45, 0x73, 0xe3, 0x48, 0x5c, 0xe0, 0x4d, 0x3a, 0xff, 0x6f, 0x56, 0xcc,
+    0x81, 0x85, 0xc9, 0xad, 0x45, 0x1a, 0xa9, 0x44, 0xfe, 0x6a, 0xbf, 0x5d, 0xaf, 0x0e, 0x8d, 0x48,
+    0x78, 0x25, 0xd3, 0xbb, 0xbb, 0xd9, 0x5c, 0xb0, 0x1a, 0x74, 0xa7, 0x64, 0xcd, 0x51, 0x0a, 0xd2,
+    0x8f, 0xcd, 0x7c, 0x8b, 0x04, 0x39, 0xed, 0x98, 0x86, 0x5a, 0x65, 0x63, 0x1d, 0xb3, 0x1d, 0x65,
+    0xf8, 0xf8, 0x02, 0x45, 0x73, 0x02, 0x0c, 0xb1, 0xbf, 0xae, 0x24, 0x61, 0x2f, 0x8a, 0xd7, 0x35,
+    0xe2, 0x56, 0x3d, 0x4c, 0xbd, 0x6b, 0x4a, 0x38, 0x1f, 0x2d, 0xde, 0x78, 0xc0, 0x2f, 0xb1, 0x7c,
+    0x4a, 0x7f, 0x05, 0xef, 0xfd, 0x42, 0x99, 0xb0, 0x9c, 0xec, 0x51, 0x29, 0xdd, 0xf1, 0xba, 0x0f,
+    0x41, 0x92, 0x00, 0x0f, 0x84, 0x7b, 0x50, 0x3c, 0x37, 0xd5, 0x95, 0x4c, 0xb6, 0xa8, 0xe5, 0x78,
+    0x2e, 0x87, 0x29, 0x61, 0xb6, 0x28, 0xc8, 0x57, 0x17, 0x56, 0xa1, 0x9c, 0xa4, 0x08, 0xf3, 0x46,
+    0xff, 0xc1, 0x2a, 0xce, 0xaa, 0x55, 0xf2, 0x38, 0xee, 0x8d, 0xbf, 0xdc, 0x31, 0x6a, 0xae, 0x58,
+    0xa1, 0xc2, 0xa1, 0xf2, 0xdf, 0xc5, 0x03, 0x81, 0x28, 0x07, 0xa7, 0x1c, 0x39, 0xfb, 0x94, 0xa2,
+    0x16, 0xc7, 0x80, 0xb2, 0x32, 0xbe, 0x37, 0xfb, 0x86, 0x30, 0xc2, 0xbe, 0x80, 0x4f, 0x17, 0x37,
+    0xbf, 0xe7, 0xf7, 0x06, 0xf9, 0xbe, 0x42, 0x5c, 0xc3, 0x91, 0xe2, 0x5f, 0xd0, 0x3e, 0x7b, 0x93,
+    0x6b, 0xee, 0x06, 0xd7, 0xb8, 0x0c, 0xd6, 0xaf, 0x0c, 0x14, 0xa7, 0x16, 0xaf, 0x25, 0x60, 0xec,
+    0x4c, 0xf1, 0x56, 0xe1, 0x05, 0x19, 0x3c, 0xc1, 0x15, 0x3e, 0x96, 0x45, 0x10, 0x3b, 0xab, 0xf7,
+    0x9c, 0xe4, 0x2e, 0x64, 0xaf, 0xb9, 0x2c, 0x56, 0x89, 0x67, 0x72, 0x89, 0x2b, 0xe2, 0x04, 0x9c,
+    0x5a, 0x0a, 0x71, 0xbe, 0xee, 0x12, 0x6d, 0xb8, 0x4f, 0xb4, 0xfa, 0xe4, 0xa5, 0x13, 0x39, 0xe4,
+    0x18, 0x33, 0xfc, 0x55, 0x84, 0xb4, 0x79, 0x92, 0x96, 0x2c, 0x8a, 0xa7, 0xb6, 0xb7, 0xae, 0x8d,
+    0xeb, 0x27, 0x0e, 0xb2, 0x83, 0x0d, 0xab, 0x3f, 0x18, 0x78, 0xea, 0x1b, 0xa8, 0xe2, 0x93, 0x23,
+    0x02, 0x0d, 0x54, 0x0c, 0x2c, 0xfc, 0xbb, 0xfd, 0xae, 0xc4, 0x47, 0x3b, 0x38, 0x16, 0xc6, 0xb2,
+    0xac, 0xdc, 0x3e, 0xe2, 0x2e, 0x77, 0x27, 0x66, 0x5d, 0xfe, 0xbb, 0x61, 0x4b, 0x9d, 0xa5, 0x86,
+    0xd0, 0xa9, 0xfe, 0xa3, 0xbf, 0xba, 0x5d, 0xd8, 0x15, 0x1b, 0x42, 0x9e, 0xc1, 0x35, 0xe2, 0x1c,
+    0x14, 0x1e, 0x0f, 0xfb, 0x44, 0xaa, 0x67, 0x07, 0xc9, 0xcf, 0xbd, 0x01, 0xc0, 0x97, 0x9f, 0x81,
+    0x62, 0x32, 0xa3, 0x3d, 0x44, 0x95, 0xe2, 0xda, 0x2e, 0x99, 0x93, 0x85, 0x63, 0xea, 0xcf, 0x77,
+    0x8d, 0x6c, 0x56, 0xc2, 0x1c, 0xbf, 0x93, 0x79, 0x57, 0xf5, 0x5a, 0xaa, 0x93, 0xba, 0x29, 0xdc,
+    0x2b, 0x0b, 0x0b, 0xe4, 0x21, 0x59, 0x5b, 0xa8, 0x5c, 0xd5, 0x43, 0x15, 0xff, 0x56, 0x05, 0xdd,
+    0xf6, 0xb5, 0x5d, 0x4e, 0x36, 0x1e, 0x8c, 0xbb, 0x77, 0x32, 0x6f, 0x23, 0x90, 0xf5, 0xd1, 0x2c,
+    0x82, 0x6e, 0xcb, 0xad, 0x7e, 0xc4, 0xe2, 0x5f, 0x81, 0x2c, 0xba, 0x38, 0x28, 0x7c, 0x28, 0x6f,
+    0xd0, 0xcb, 0x77, 0x2f, 0x38, 0x5e, 0xaa, 0xc2, 0x6a, 0xbf, 0x3e, 0x62, 0x4d, 0x4a, 0xe2, 0x1b,
+    0xe8, 0x67, 0x92, 0xa9, 0xc0, 0x2c, 0x53, 0x84, 0xf5, 0x9e, 0x51, 0x4a, 0x85, 0x6a, 0x6e, 0xcc,
+    0xab, 0xbb, 0x7c, 0xcc, 0xb0, 0x3b, 0x76, 0x9e, 0xf2, 0x34, 0x16, 0x79, 0x94, 0x67, 0xdb, 0x2c,
+    0xe9, 0x6b, 0x67, 0xfa, 0xc5, 0xa6, 0x51, 0x6a, 0xbb, 0x45, 0x72, 0xd6, 0x1b, 0xe4, 0xff, 0x3f,
+    0x95, 0x05, 0x16, 0x13, 0xd9, 0x9f, 0x70, 0x4b, 0x58, 0xb2, 0x88, 0x12, 0x90, 0x2d, 0xbd, 0xef,
+    0xd8, 0xac, 0x79, 0x88, 0x0e, 0xb2, 0xcf, 0xf8, 0xa2, 0xbb, 0xf3, 0x1d, 0xcd, 0x0f, 0x03, 0x3f,
+    0xd3, 0x90, 0x90, 0x71, 0x6a, 0x61, 0xc6, 0x39, 0xeb, 0xbc, 0xd6, 0x6e, 0xdc, 0xb7, 0xcf, 0x4b,
+    0xb2, 0x05, 0xe4, 0x60, 0xf5, 0xfd, 0x48, 0x69, 0x57, 0xbe, 0xb5, 0x6c, 0x82, 0xf1, 0x9d, 0x2f,
+    0x64, 0x0e, 0xec, 0xf5, 0xe1, 0xa5, 0xcb, 0xc1, 0x40, 0x33, 0x0f, 0xc5, 0x01, 0x89, 0x34, 0x1d,
+    0xab, 0xe1, 0x2d, 0x12, 0x9b, 0xe1, 0xba, 0xff, 0x4b, 0x68, 0x80, 0xb3, 0xf5, 0x40, 0x46, 0x87,
+    0x3a, 0x21, 0x65, 0xc1, 0x2e, 0xc7, 0x8b, 0x76, 0x2b, 0x2a, 0x52, 0xd7, 0x69, 0xc5, 0xdd, 0x78,
+    0x43, 0x3d, 0x4a, 0x0c, 0xff, 0x57, 0xbb, 0x84, 0xcc, 0x47, 0xa4, 0x15, 0x66, 0x9f, 0x0a, 0x70,
+    0x77, 0xda, 0xfb, 0x5f, 0xa6, 0xe4, 0xf6, 0x64, 0x3d, 0x63, 0x9a, 0x75, 0x8e, 0x29, 0xa5, 0x02,
+    0xa0, 0xe9, 0x9b, 0xfb, 0x96, 0x11, 0xaf, 0x0d, 0xc9, 0x8e, 0x84, 0x82, 0x1f, 0x05, 0x95, 0x54,
+    0xab, 0x57, 0xd0, 0xb7, 0xa8, 0xe6, 0x55, 0x67, 0x62, 0x19, 0x26, 0x33, 0x68, 0xc5, 0x01, 0xe0,
+    0xb7, 0x5e, 0xba, 0x10, 0x9c, 0xcd, 0x0a, 0xce, 0xd7, 0xf4, 0xf1, 0x04, 0xfe, 0x91, 0xa8, 0xe5,
+    0xcf, 0x55, 0x49, 0xfc, 0x4b, 0x8f, 0x83, 0xa4, 0x78, 0x24, 0x6b, 0x85, 0xf3, 0xa6, 0x5e, 0x6b,
+    0xa1, 0x0a, 0x27, 0xb7, 0x5f, 0x31, 0x48, 0xbc, 0x50, 0x03, 0x4b, 0x63, 0xd6, 0x73, 0xb8, 0x5d,
+    0x24, 0xcd, 0x81, 0x95, 0x3b, 0xb4, 0xae, 0x82, 0x45, 0x86, 0x4e, 0x89, 0xcc, 0x39, 0xc1, 0x98,
+    0x68, 0x72, 0xe0, 0x6e, 0x7c, 0xd3, 0xf9, 0x59, 0x2e, 0x35, 0xea, 0x22, 0xa3, 0x93, 0x35, 0x8d,
+    0xf4, 0x47, 0xf0, 0x76, 0xae, 0xb6, 0x56, 0xa9, 0x73, 0xaa, 0x34, 0xf8, 0x4b, 0xae, 0xd5, 0xa0,
+    0x61, 0x1a, 0x67, 0x21, 0x1f, 0xff, 0x81, 0x94, 0x42, 0x1d, 0xa9, 0xa1, 0x18, 0x66, 0x36, 0x1b,
+    0x12, 0xe1, 0x56, 0x2a, 0x92, 0x4e, 0xda, 0x34, 0x44, 0x8f, 0x16, 0x97, 0xc5, 0xbe, 0x44, 0x88,
+    0xc4, 0xaa, 0xba, 0x11, 0xd6, 0x34, 0x9f, 0xee, 0x78, 0xa0, 0xf2, 0x6c, 0x4c, 0x1b, 0xeb, 0x87,
+    0xb9, 0x3a, 0x08, 0xe8, 0x0c, 0xbb, 0x43, 0x85, 0x4e, 0x9e, 0x22, 0x71, 0x67, 0xb4, 0xeb, 0xe3,
+    0x49, 0xc6, 0x33, 0xbd, 0x95, 0x81, 0xa9, 0x56, 0xf2, 0x2d, 0xb0, 0x5c, 0x49, 0xba, 0x18, 0xa7,
+    0x1c, 0x44, 0x5b, 0x3f, 0xd6, 0x10, 0xd9, 0x58, 0xd9, 0x0c, 0x78, 0x3c, 0x21, 0x35, 0xb3, 0x19,
+    0x55, 0x7b, 0xb6, 0xed, 0x6b, 0x60, 0x14, 0xc1, 0x15, 0xb8, 0x5b, 0xb8, 0x8f, 0x36, 0x32, 0xf9,
+    0x06, 0xfd, 0xcd, 0x2c, 0xf6, 0xe0, 0xb1, 0x0f, 0xfb, 0xe7, 0x78, 0xec, 0xb9, 0x4c, 0x67, 0xec,
+    0x0d, 0xbb, 0x76, 0x4e, 0xe6, 0xa8, 0x17, 0xf9, 0x1b, 0x4b, 0xa9, 0xe8, 0x03, 0xa3, 0xdc, 0x2b,
+    0xce, 0x9c, 0xac, 0x8a, 0x10, 0x30, 0x60, 0x5a, 0x0a, 0xf4, 0xd1, 0x0c, 0x5a, 0xcd, 0xc1, 0x77,
+    0xf6, 0x8c, 0xbf, 0xba, 0x97, 0xfc, 0xbd, 0xa1, 0x94, 0xc2, 0x0b, 0x4e, 0x4e, 0x5a, 0x58, 0x94,
+    0x5b, 0xda, 0x8a, 0x78, 0x43, 0xff, 0x89, 0xca, 0x0c, 0x09, 0xac, 0x6d, 0x08, 0xfd, 0x78, 0xd6,
+    0x59, 0x10, 0x88, 0x49, 0x81, 0xdb, 0xe2, 0xa1, 0xe5, 0x10, 0xc7, 0x1d, 0xa3, 0x12, 0x07, 0x99,
+    0xd2, 0x2c, 0xf8, 0x87, 0x9b, 0xb6, 0x45, 0x7c, 0x38, 0x3a, 0xc7, 0x3b, 0xaa, 0xee, 0xd0, 0x26,
+    0x97, 0xab, 0x23, 0xcb, 0xf8, 0xbd, 0x7a, 0x98, 0x72, 0x99, 0xc9, 0xcd, 0x4d, 0x37, 0xf3, 0xdd,
+    0x18, 0x84, 0xaf, 0x71, 0x78, 0x8d, 0x6f, 0x0e, 0x83, 0x06, 0x61, 0xa9, 0x02, 0x09, 0x9d, 0xfc,
+    0x71, 0xec, 0x5c, 0xe5, 0xfd, 0x47, 0x4b, 0xeb, 0xca, 0xec, 0x26, 0x31, 0x0c, 0xb2, 0xbe, 0x90,
+    0x5e, 0x56, 0x17, 0x00, 0x60, 0x68, 0x15, 0x16, 0xe4, 0x3d, 0x19, 0x2e, 0xf1, 0x97, 0x81, 0x3e,
+    0xe5, 0x53, 0xe0, 0x01, 0x99, 0x84, 0x26, 0x0c, 0xd7, 0x1a, 0xd5, 0xd3, 0x06, 0x2f, 0xb6, 0xa5,
+    0xef, 0x2f, 0xb4, 0x30, 0x5f, 0x41, 0x7a, 0x70, 0x1c, 0x92, 0x86, 0xc3, 0x6b, 0x15, 0x42, 0x51,
+    0x4c, 0x02, 0xd7, 0xba, 0x3f, 0x3c, 0x19, 0x33, 0xfe, 0x74, 0x4a, 0x90, 0x8e, 0xb4, 0xc3, 0x4c,
+    0xaa, 0x41, 0x36, 0x6f, 0x1e, 0xa8, 0x50, 0xe9, 0x30, 0xf4, 0xe6, 0x70, 0xf9, 0x3d, 0x15, 0xca,
+    0x0e, 0xf3, 0x17, 0xc0, 0x3c, 0xd3, 0xfd, 0xbb, 0xbb, 0x1a, 0x9e, 0xb8, 0x46, 0x9c, 0xe2, 0xa0,
+    0x62, 0x33, 0x7d, 0xa0, 0xf0, 0xdd, 0xbf, 0x96, 0x2a, 0x92, 0x6d, 0x72, 0xf8, 0x26, 0xbd, 0x1c,
+    0xe2, 0x94, 0xd5, 0xc4, 0x04, 0x5b, 0x6f, 0x47, 0xa0, 0xb4, 0xf9, 0x87, 0x76, 0x5e, 0xa0, 0xac,
+    0x0b, 0xd0, 0xe3, 0xd9, 0xf7, 0x3f, 0x54, 0xb7, 0x49, 0x5c, 0xf2, 0x03, 0x83, 0x9b, 0xda, 0x82,
+    0x26, 0x45, 0x01, 0x77, 0x5e, 0x00, 0x83, 0xfc, 0x1a, 0xbe, 0x03, 0xeb, 0x96, 0x4c, 0xb9, 0x99,
+    0x9a, 0x8e, 0x2e, 0x68, 0x12, 0x16, 0x62, 0x24, 0x23, 0xab, 0x41, 0xc6, 0x42, 0xff, 0x3f, 0xf2,
+    0xd5, 0xe0, 0x47, 0x5f, 0x48, 0xfc, 0xe2, 0x49, 0x2c, 0x10, 0xab, 0xff, 0x97, 0x89, 0xe0, 0xfc,
+    0x8a, 0x08, 0xfa, 0xfd, 0xb9, 0x7c, 0x7d, 0xd0, 0xff, 0x54, 0x8c, 0x6f, 0x84, 0x5b, 0x8b, 0xdb,
+    0xf2, 0xe8, 0x3d, 0x66, 0x36, 0x91, 0x2a, 0x29, 0x49, 0xb4, 0x0e, 0x4e, 0x60, 0xb4, 0x8f, 0x8e,
+    0x2e, 0xd7, 0x66, 0x42, 0x89, 0x78, 0x60, 0x49, 0xee, 0x86, 0xb3, 0x4a, 0xbd, 0xa2, 0x98, 0x0c,
+    0xb4, 0xdf, 0xe0, 0x2f, 0x05, 0x67, 0x24, 0xb5, 0x97, 0x21, 0x51, 0xa1, 0x62, 0xad, 0xc4, 0xa5,
+    0xd2, 0x54, 0x33, 0x69, 0x5e, 0x00, 0xae, 0xf6, 0xf6, 0xfa, 0x27, 0x3b, 0x63, 0x5c, 0xb7, 0xcc,
+    0x77, 0x0b, 0x3e, 0x9c, 0x48, 0x4c, 0xd8, 0xb8, 0x1e, 0xf7, 0xb9, 0xf6, 0x96, 0x60, 0x96, 0x86,
+    0x9e, 0x9d, 0x5a, 0x7d, 0xa4, 0xa0, 0xc7, 0x08, 0xac, 0xb3, 0xb4, 0xcc, 0xd1, 0x1e, 0x8d, 0xd5,
+    0x32, 0x6d, 0xc6, 0xa3, 0x05, 0x40, 0x3b, 0x93, 0xe8, 0xfb, 0x1a, 0x09, 0xc0, 0x16, 0xc2, 0xff,
+    0x65, 0x25, 0xad, 0xb8, 0x82, 0x2a, 0x64, 0xc8, 0xef, 0x1e, 0x5f, 0x44, 0xc7, 0xe6, 0xb6, 0xeb,
+    0xc3, 0xc2, 0x94, 0x91, 0x7f, 0x1d, 0x2b, 0xf6, 0x76, 0x13, 0x83, 0x41, 0xbe, 0x50, 0x2f, 0x64,
+    0x8f, 0xda, 0x40, 0x8f, 0x43, 0xb7, 0xf0, 0x30, 0xc6, 0x76, 0xd4, 0x26, 0x50, 0x43, 0xe6, 0xa7,
+    0x1d, 0x1b, 0x7f, 0x19, 0x8b, 0xeb, 0x08, 0x28, 0x6d, 0x6d, 0x73, 0x2e, 0x65, 0xbd, 0x97, 0xb0,
+    0xf8, 0x91, 0x9f, 0xbb, 0x41, 0x22, 0x7b, 0x71, 0x8f, 0x25, 0xb3, 0x67, 0xd1, 0x0f, 0xe8, 0xd0,
+    0xe9, 0x80, 0x1a, 0x26, 0x81, 0x20, 0x56, 0x14, 0xa1, 0x7f, 0x86, 0xa3, 0x79, 0x28, 0xe5, 0x0a,
+    0x59, 0x17, 0x44, 0x41, 0x32, 0x8f, 0xf8, 0xe8, 0x02, 0xaa, 0x09, 0xa4, 0xf0, 0x69, 0x34, 0xdd,
+    0xc6, 0x73, 0x2e, 0x78, 0x79, 0xf4, 0x45, 0xc8, 0x37, 0xcf, 0x5b, 0xc3, 0xba, 0xa8, 0x40, 0xf5,
+    0xae, 0x85, 0xf2, 0x6a, 0x42, 0x6d, 0xd3, 0x04, 0x18, 0x85, 0xf5, 0x79, 0xfa, 0x82, 0xf0, 0x5e,
+    0x44, 0x23, 0x94, 0xcf, 0x2f, 0x2d, 0x45, 0x3e, 0xd3, 0x58, 0x9d, 0xa4, 0xa3, 0xda, 0xcf, 0x2b,
+    0x0e, 0xb0, 0x4b, 0xca, 0xf3, 0xd4, 0xe6, 0xbe, 0x84, 0x79, 0x02, 0xef, 0xaa, 0x22, 0x0f, 0x84,
+    0xa5, 0xef, 0x36, 0xdf, 0xa7, 0x20, 0x06, 0xa2, 0x78, 0x78, 0x93, 0x9b, 0x00, 0x95, 0xa6, 0x91,
+    0x00, 0xaf, 0xf6, 0xe3, 0x80, 0x82, 0xdf, 0x3c, 0xce, 0xe5, 0xeb, 0xf1, 0x00, 0x78, 0xcf, 0xad,
+    0x59, 0x7b, 0x34, 0xdd, 0x20, 0x7b, 0x92, 0x95, 0x49, 0xb0, 0x3e, 0x99, 0x68, 0x08, 0xda, 0xbb,
+    0x4c, 0x6c, 0xc6, 0x27, 0xe6, 0xb7, 0x63, 0xae, 0x55, 0xb6, 0x25, 0x60, 0xfe, 0x95, 0x7d, 0x8c,
+    0x88, 0x2b, 0x9c, 0x4c, 0xa9, 0x50, 0xa8, 0xb3, 0xed, 0x8c, 0xc7, 0xa6, 0x7a, 0x76, 0x06, 0x1f,
+    0x40, 0x51, 0x9a, 0x46, 0x0a, 0xa9, 0x48, 0xd3, 0xe6, 0x80, 0x21, 0xc5, 0x78, 0xcf, 0x07, 0x47,
+    0x0c, 0xb5, 0x82, 0xcb, 0x5c, 0x94, 0x11, 0xb9, 0x2c, 0x79, 0x8e, 0xd8, 0x30, 0x8b, 0x37, 0x1b,
+    0xd7, 0xb2, 0x52, 0x27, 0x39, 0x0c, 0x69, 0x73, 0x63, 0x1d, 0x21, 0x78, 0x21, 0x80, 0x13, 0xfb,
+    0x2d, 0xbf, 0x9f, 0x75, 0x1f, 0x4f, 0x1e, 0xdd, 0x3f, 0xb2, 0x02, 0x10, 0x4f, 0x03, 0x87, 0xd7,
+    0xde, 0x77, 0xab, 0xdd, 0x0d, 0x5a, 0x2a, 0x68, 0x0b, 0x5c, 0x35, 0x51, 0xb5, 0xc5, 0x2f, 0xff,
+    0xee, 0xcb, 0xaa, 0x60, 0x4e, 0xa0, 0xb3, 0xbe, 0x4d, 0x74, 0x31, 0xf1, 0x7c, 0x60, 0xce, 0x03,
+    0x92, 0x83, 0xc3, 0x26, 0x8c, 0x45, 0x0c, 0xc5, 0x63, 0x35, 0x36, 0x8a, 0xa3, 0x0c, 0x49, 0xc1,
+    0x08, 0x71, 0x2c, 0x10, 0xe8, 0xcd, 0xc8, 0x63, 0x0d, 0xf0, 0x8e, 0x81, 0xa8, 0xf3, 0xc7, 0x43,
+    0xe5, 0x24, 0xc7, 0x43, 0x73, 0x09, 0xbf, 0xcd, 0x73, 0x4d, 0xa4, 0x88, 0x85, 0xc6, 0x42, 0x1e,
+    0xe1, 0x34, 0xf1, 0x97, 0x2a, 0xc0, 0x2f, 0xa7, 0xe0, 0xb9, 0x25, 0xe6, 0xb5, 0x65, 0x4c, 0xff,
+    0x1a, 0xe4, 0x77, 0x5e, 0x01, 0x99, 0x5e, 0x28, 0xd6, 0x08, 0xef, 0x20, 0x34, 0x9c, 0x03, 0xa6,
+    0x86, 0xe7, 0xc3, 0x3e, 0x9c, 0xab, 0xb9, 0xeb, 0xab, 0x80, 0xa9, 0xff, 0x0b, 0x8a, 0x06, 0xd4,
+    0xa9, 0xb8, 0xfb, 0x99, 0x41, 0x71, 0xb2, 0x47, 0xc6, 0x51, 0xde, 0x0f, 0xfa, 0xde, 0x82, 0x0b,
+    0x83, 0xba, 0xb2, 0xb8, 0x2d, 0x1c, 0xa0, 0xdc, 0x07, 0xf6, 0x51, 0x72, 0x01, 0xf0, 0x5f, 0x20,
+    0x6c, 0xd8, 0x42, 0x8b, 0xdc, 0x23, 0x0c, 0x70, 0xad, 0x2f, 0x58, 0xe0, 0xf2, 0xe2, 0x35, 0x2a,
+    0xb5, 0xac, 0xa4, 0x36, 0x04, 0x62, 0xc6, 0x01, 0x49, 0xc9, 0x2a, 0x26, 0x3c, 0x88, 0x7d, 0xfa,
+    0xf9, 0x36, 0xb5, 0x97, 0xa0, 0xe1, 0xbe, 0xaf, 0x17, 0x32, 0x68, 0xdf, 0x85, 0x21, 0x99, 0x83,
+    0x31, 0xfb, 0xa9, 0x57, 0x8f, 0x59, 0xf6, 0x96, 0xef, 0x68, 0x7f, 0x0d, 0x90, 0x6e, 0x72, 0x43,
+    0x9c, 0x5d, 0xc2, 0xc9, 0xf8, 0xa1, 0x93, 0xa9, 0x13, 0x95, 0x29, 0x06, 0xc4, 0x0d, 0xa1, 0x09,
+    0x4b, 0xf2, 0x67, 0x09, 0xd2, 0x87, 0xad, 0x16, 0xc3, 0xaf, 0x96, 0xea, 0x63, 0xcc, 0x83, 0x05,
+    0xbc, 0xe4, 0xdd, 0xfa, 0xa9, 0xfe, 0x27, 0xf5, 0x05, 0x6a, 0xe3, 0xc1, 0x7f, 0x22, 0xc6, 0xb5,
+    0xad, 0x3c, 0xd4, 0x9c, 0xd2, 0x21, 0x5f, 0x62, 0x8b, 0xcb, 0x70, 0x58, 0x87, 0xbb, 0x35, 0x50,
+    0x9b, 0x66, 0xaf, 0x72, 0xc2, 0x39, 0x91, 0x0f, 0xa6, 0xf1, 0xbf, 0x05, 0x4b, 0x1d, 0x93, 0xe6,
+    0x78, 0xc3, 0x4b, 0x29, 0xdc, 0x71, 0xac, 0xe0, 0xa9, 0x27, 0x65, 0x3a, 0xba, 0xdc, 0xb3, 0xfa,
+    0xa2, 0x26, 0xa8, 0xeb, 0x5b, 0xc4, 0xf9, 0x0d, 0x55, 0x98, 0xc9, 0x21, 0xe1, 0xe5, 0x7d, 0x5b,
+    0x2e, 0x23, 0xf6, 0xab, 0x5f, 0xb1, 0x3d, 0x1c, 0x74, 0x73, 0x9d, 0xae, 0x7b, 0x2e, 0xcb, 0xb6,
+    0xad, 0x7d, 0x4b, 0x41, 0x65, 0x4d, 0x4c, 0x6c, 0xba, 0x55, 0xd3, 0x78, 0x3b, 0x7b, 0x59, 0x67,
+    0x7b, 0xa4, 0x15, 0x10, 0x72, 0x18, 0x60, 0x4d, 0x57, 0x79, 0x42, 0x1c, 0xa4, 0x44, 0x2b, 0xd3,
+    0xc3, 0xd8, 0x67, 0xf5, 0xcc, 0x56, 0x8f, 0x66, 0x1a, 0xa9, 0x1c, 0x47, 0x0f, 0x4a, 0xfc, 0x0b,
+    0x01, 0xd0, 0xa1, 0x8d, 0x2f, 0xd0, 0xa8, 0x46, 0xba, 0xcc, 0x35, 0x5b, 0xb2, 0x2a, 0x2e, 0x27,
+    0x4b, 0xf3, 0xe6, 0x6e, 0x79, 0xc8, 0xb2, 0x43, 0xbf, 0xe3, 0x6f, 0x1b, 0x0e, 0x73, 0x29, 0x91,
+    0x8f, 0x79, 0x79, 0xd4, 0xd0, 0xa8, 0xce, 0x94, 0x35, 0xea, 0xad, 0x13, 0x02, 0xf9, 0x2e, 0x40,
+    0x7f, 0xfb, 0x01, 0x20, 0x11, 0xb2, 0x9d, 0x12, 0x5f, 0x22, 0x89, 0x92, 0xb5, 0x6e, 0x8c, 0xf2,
+    0x37, 0xa2, 0x74, 0xff, 0x35, 0xe9, 0xba, 0x69, 0x7e, 0xb3, 0xf8, 0x61, 0x84, 0x78, 0x8c, 0x98,
+    0x61, 0x92, 0xea, 0xa9, 0x71, 0xba, 0x0c, 0xd8, 0xed, 0x8a, 0xe6, 0x1b, 0x3b, 0xf5, 0x75, 0x85,
+    0x0e, 0x0e, 0x3c, 0x5f, 0xf4, 0xbd, 0x91, 0x8a, 0xb1, 0x1c, 0xcd, 0xf1, 0x15, 0xaa, 0x31, 0xd5,
+    0x67, 0x50, 0xdf, 0xf9, 0x9a, 0x15, 0x9a, 0x20, 0xbc, 0x2f, 0xff, 0x89, 0x28, 0x00, 0x0a, 0x5a,
+    0x74, 0x8a, 0xc0, 0x3a, 0x35, 0xad, 0xab, 0xaf, 0xd9, 0xf2, 0x8e, 0x63, 0x4c, 0x0a, 0x4e, 0x46,
+    0x2b, 0xd2, 0x19, 0x28, 0x9b, 0xe7, 0x52, 0xcf, 0xb4, 0x80, 0x61, 0x73, 0x23, 0x12, 0x79, 0x35,
+    0x47, 0x40, 0x24, 0x7e, 0x44, 0xbd, 0x2b, 0x3c, 0x49, 0x86, 0x6f, 0x16, 0xe4, 0xf6, 0x36, 0xcd,
+    0x45, 0xd9, 0x2e, 0x18, 0x2e, 0x75, 0x1b, 0xd6, 0xdd, 0xa6, 0xe3, 0x60, 0x1c, 0x39, 0x71, 0xb5,
+    0xd3, 0x18, 0xb5, 0xd7, 0x56, 0x27, 0xa6, 0x75, 0x84, 0x11, 0xb0, 0x5a, 0x1e, 0x81, 0x0e, 0x15,
+    0x55, 0x6b, 0x1e, 0x14, 0xa9, 0x66, 0x96, 0xd5, 0xa3, 0x17, 0x96, 0x4e, 0x44, 0x21, 0x70, 0x90,
+    0x82, 0x0d, 0x7c, 0x49, 0x66, 0xa0, 0xe2, 0x32, 0x34, 0x8a, 0x89, 0x7c, 0x90, 0x4a, 0x7a, 0x29,
+    0x36, 0xf4, 0xe4, 0x20, 0x4e, 0xea, 0xa6, 0xff, 0xc1, 0xb0, 0xc3, 0x1a, 0x14, 0x13, 0xf7, 0x34,
+    0xfc, 0xac, 0x12, 0xb3, 0x86, 0xb7, 0x48, 0xe7, 0x18, 0xbb, 0xcf, 0xfb, 0x67, 0xeb, 0x82, 0x83,
+    0x5b, 0x1e, 0x60, 0x38, 0x0c, 0x7a, 0x57, 0x3f, 0x74, 0x1e, 0x27, 0x98, 0xa2, 0x40, 0xd7, 0xe8,
+    0xac, 0xe3, 0x0e, 0xed, 0x55, 0x5a, 0x30, 0xbb, 0xb8, 0x7e, 0x7c, 0xec, 0x07, 0xb9, 0x38, 0x66,
+    0x65, 0xa0, 0xc4, 0x49, 0xf5, 0x13, 0x33, 0x0a, 0x75, 0x5d, 0x70, 0xee, 0xcf, 0xd7, 0xec, 0xa4,
+    0xa4, 0x90, 0x8b, 0xc0, 0x65, 0x56, 0x44, 0xb3, 0x8a, 0x6b, 0xdc, 0xa8, 0x3b, 0x5f, 0xb9, 0x5a,
+    0x23, 0x5a, 0x72, 0x14, 0xb2, 0xd7, 0x8d, 0x06, 0xe1, 0x90, 0x88, 0x6c, 0xec, 0xdd, 0x22, 0xa1,
+    0x79, 0xbb, 0x25, 0x97, 0x33, 0xab, 0x59, 0xeb, 0x54, 0xed, 0xf6, 0x9e, 0x39, 0xbf, 0xc7, 0x70,
+    0x7c, 0x1c, 0x5e, 0x5c, 0x7a, 0x6e, 0xcb, 0x98, 0xde, 0x59, 0xc4, 0xc1, 0xb8, 0x66, 0x97, 0x11,
+    0xdf, 0x99, 0x5c, 0xf4, 0xce, 0xd9, 0x1a, 0x8d, 0xfc, 0x93, 0xb2, 0x23, 0xb0, 0x38, 0x8f, 0xc3,
+    0xd7, 0xa4, 0x3b, 0x74, 0xae, 0x5e, 0x65, 0xcd, 0x46, 0x14, 0xc1, 0x59, 0x30, 0x05, 0x47, 0xd2,
+    0x6b, 0x83, 0x31, 0x00, 0x38, 0x21, 0xee, 0x6b, 0xa2, 0x2d, 0xb6, 0xd1, 0x5f, 0x1e, 0x05, 0x83,
+    0x68, 0x8e, 0x66, 0x34, 0x02, 0x21, 0x8a, 0x98, 0x1c, 0x15, 0x3a, 0xfc, 0xa4, 0xe0, 0x80, 0x3d,
+    0xdd, 0x33, 0xf8, 0xf3, 0x3b, 0x4a, 0xa1, 0xfa, 0x97, 0x42, 0x87, 0xf4, 0x55, 0x77, 0x91, 0x86,
+    0xe8, 0xbc, 0x81, 0xd4, 0x6e, 0x63, 0x7d, 0x19, 0x0c, 0x13, 0x47, 0xdc, 0x4a, 0x0b, 0x89, 0xc7,
+    0xcd, 0x62, 0x13, 0x5f, 0x78, 0xa4, 0x84, 0xf3, 0x96, 0x4d, 0x55, 0x4e, 0xb8, 0x4b, 0x8e, 0x1c,
+    0x13, 0xa7, 0x7f, 0x44, 0x22, 0x01, 0x63, 0x7a, 0x8f, 0x3d, 0xbc, 0x1b, 0x99, 0x32, 0x64, 0x55,
+    0x2e, 0x1d, 0x02, 0x73, 0x7f, 0xa9, 0x83, 0x12, 0xdf, 0xc3, 0xc1, 0xfc, 0x61, 0x9b, 0x27, 0x19,
+    0x08, 0x75, 0x3e, 0x8c, 0xb4, 0x9d, 0x52, 0xb5, 0x51, 0xa8, 0xb0, 0xfc, 0x03, 0xcb, 0xfc, 0xee,
+    0x59, 0x9c, 0xf2, 0xe5, 0xc0, 0x7d, 0x62, 0x95, 0xd6, 0x7f, 0xd9, 0x7a, 0xbe, 0x2e, 0x50, 0xd3,
+    0x0e, 0x2e, 0x6d, 0xa7, 0xbb, 0x0b, 0x72, 0x6f, 0x94, 0x5e, 0x7a, 0x7a, 0x50, 0x22, 0x58, 0x50,
+    0x3e, 0x2d, 0x7f, 0x11, 0x9d, 0xa3, 0x1b, 0xc1, 0x66, 0x2c, 0x57, 0x92, 0x99, 0xea, 0x23, 0x13,
+    0x12, 0x09, 0x1a, 0xdd, 0xfe, 0xeb, 0x60, 0xe3, 0x30, 0x42, 0x25, 0x05, 0x43, 0x8c, 0x38, 0x2d,
+    0xc6, 0xa9, 0xa5, 0x96, 0x18, 0xd9, 0x4c, 0x2c, 0x4e, 0x6a, 0x08, 0x1f, 0x20, 0xd1, 0x3f, 0xcb,
+    0x96, 0x75, 0xa1, 0x82, 0xdc, 0x28, 0x4c, 0x7f, 0xca, 0x70, 0x2a, 0x0c, 0xf0, 0x76, 0xdd, 0x62,
+    0x7d, 0x4a, 0xab, 0x55, 0x3f, 0xc7, 0xa7, 0xb1, 0x5a, 0xa5, 0x51, 0x9d, 0x34, 0x09, 0x4a, 0x41,
+    0x32, 0x3d, 0x11, 0xee, 0x75, 0x98, 0x69, 0x69, 0xc9, 0x7e, 0xfe, 0xe5, 0xe0, 0x5e, 0xfb, 0x0f,
+    0x47, 0xac, 0x6c, 0xbd, 0x08, 0x52, 0x7e, 0x7c, 0xbd, 0x51, 0x9a, 0x43, 0x3a, 0x36, 0x28, 0x18,
+    0x59, 0x23, 0xbe, 0xc2, 0xbd, 0x55, 0x37, 0xc1, 0x82, 0xeb, 0x5e, 0x3d, 0x56, 0x1f, 0x8b, 0x44,
+    0x3e, 0x94, 0x5f, 0xb3, 0xd6, 0x4c, 0x23, 0x18, 0x57, 0x5a, 0xc7, 0xa7, 0x91, 0x79, 0xf5, 0x68,
+    0xb0, 0x66, 0x8f, 0x1a, 0xd1, 0xfc, 0x86, 0x82, 0x30, 0x30, 0x38, 0x7f, 0xbf, 0x38, 0x7c, 0x99,
+    0x4c, 0xb8, 0x0b, 0x08, 0x66, 0xa1, 0x63, 0xc3, 0x28, 0x6e, 0x55, 0x9a, 0xbb, 0xd8, 0x02, 0x35,
+    0xdc, 0x84, 0x1b, 0x40, 0x62, 0x96, 0xfa, 0x65, 0x27, 0x85, 0xa1, 0x0a, 0x6f, 0xb9, 0xd9, 0x73,
+    0xbb, 0xb6, 0x52, 0x98, 0x06, 0x4d, 0xbb, 0x8b, 0xb9, 0x77, 0x56, 0x96, 0x13, 0xd9, 0x69, 0xaa,
+    0x53, 0xca, 0x6b, 0x72, 0x75, 0xb0, 0x0c, 0x5e, 0xe9, 0xe3, 0x60, 0x1c, 0xf9, 0x24, 0xbe, 0x12,
+    0xdd, 0xe5, 0xb2, 0x10, 0x35, 0x97, 0xff, 0xe5, 0xfc, 0x92, 0x94, 0xdf, 0xbb, 0xc0, 0xdd, 0x55,
+    0x3e, 0xee, 0x9d, 0x59, 0x99, 0x10, 0x70, 0xf6, 0xe7, 0x24, 0x3c, 0x70, 0xbc, 0x43, 0x7d, 0xa0,
+    0xec, 0xde, 0x0e, 0x94, 0x49, 0xba, 0x03, 0x61, 0xec, 0x62, 0x9b, 0xe6, 0x1e, 0x30, 0x7c, 0x22,
+    0x48, 0x46, 0x26, 0x3b, 0x90, 0xdc, 0xe7, 0x3e, 0x1d, 0x7b, 0x76, 0x50, 0x08, 0xb5, 0xff, 0x3b,
+    0x9a, 0x5d, 0xe7, 0x6c, 0x32, 0xf6, 0x9d, 0x68, 0x22, 0xa1, 0x84, 0x8e, 0x23, 0xd7, 0xad, 0x52,
+    0xa2, 0xf4, 0xda, 0xcf, 0x4d, 0xbd, 0xa1, 0x71, 0x58, 0x7e, 0xf3, 0x2d, 0x55, 0xd8, 0x03, 0xb3,
+    0x6b, 0x6d, 0xf4, 0xc5, 0xb2, 0xb5, 0x0d, 0x6a, 0xa6, 0x34, 0x2f, 0xa7, 0x33, 0x65, 0x92, 0x83,
+    0xfb, 0x5a, 0x1a, 0xc8, 0xec, 0x40, 0x0c, 0x9d, 0x84, 0x61, 0x3d, 0xde, 0xba, 0x58, 0x9a, 0xd3,
+    0x4f, 0xe4, 0x8d, 0x56, 0x08, 0x2e, 0x0e, 0x3a, 0x29, 0x6d, 0xeb, 0xca, 0xf7, 0x5a, 0xcd, 0x61,
+    0xa3, 0xdd, 0xe2, 0x35, 0x12, 0xa6, 0x34, 0x22, 0x69, 0x3c, 0xc2, 0x1a, 0x19, 0xad, 0x2a, 0x50,
+    0xc6, 0xcc, 0x67, 0x77, 0x5e, 0x65, 0x16, 0xb2, 0x06, 0x5b, 0x22, 0xc7, 0xfd, 0x55, 0x83, 0xdb,
+    0x0e, 0xee, 0x46, 0xd7, 0x39, 0xf5, 0x66, 0x92, 0xe8, 0xe7, 0xdd, 0xfd, 0xe8, 0x4a, 0xae, 0x15,
+    0x04, 0x9d, 0x08, 0xa3, 0x21, 0x51, 0x31, 0xe2, 0x13, 0x7f, 0x5f, 0x76, 0x84, 0x42, 0x24, 0xc9,
+    0xb8, 0xf7, 0xe2, 0xa1, 0xf8, 0x6b, 0xe9, 0x58, 0x47, 0x43, 0x15, 0x78, 0xed, 0xac, 0x28, 0xd3,
+    0xdf, 0x80, 0x90, 0xdc, 0x28, 0xd9, 0xef, 0xd6, 0xbb, 0x17, 0x3d, 0xa6, 0xa8, 0xcc, 0x2e, 0xfc,
+    0xe8, 0x61, 0x70, 0xc6, 0xfa, 0x22, 0x03, 0x90, 0x1f, 0xf7, 0x7f, 0x3b, 0x4c, 0x81, 0xa0, 0x00,
+    0x0b, 0x64, 0x02, 0x9a, 0x89, 0x44, 0xfa, 0xc3, 0xdc, 0xe8, 0x87, 0x1c, 0x3f, 0x59, 0x0d, 0xc8,
+    0xf2, 0x5b, 0x3d, 0x5b, 0xfa, 0xd9, 0x92, 0x7f, 0x42, 0xda, 0xa2, 0x8a, 0x98, 0x1d, 0xa7, 0x7a,
+    0x73, 0x9b, 0xd7, 0xd1, 0x27, 0xbf, 0x14, 0x6b, 0x58, 0xa2, 0xb0, 0xda, 0xe0, 0xea, 0x81, 0x30,
+    0x62, 0xd1, 0x1b, 0x0f, 0x91, 0x63, 0xed, 0x39, 0xd7, 0x30, 0x53, 0x7a, 0x5c, 0xd5, 0xa0, 0x7a,
+    0x11, 0xb8, 0xd3, 0x04, 0xce, 0x31, 0x08, 0xff, 0x09, 0x76, 0xd7, 0x3a, 0xf0, 0xc2, 0xc1, 0xa4,
+    0xfe, 0x32, 0xc9, 0x13, 0x61, 0x08, 0x1d, 0x90, 0xb7, 0x09, 0x99, 0xb7, 0xef, 0x9c, 0x2b, 0x2f,
+    0x0e, 0xdd, 0x2b, 0x97, 0xe9, 0xc3, 0x22, 0xad, 0x2b, 0x8a, 0x90, 0x13, 0x17, 0x73, 0x66, 0x87,
+    0x36, 0xd9, 0xbc, 0xc8, 0x28, 0x81, 0xfc, 0x24, 0x6b, 0x37, 0xf4, 0x73, 0xe8, 0xdf, 0x1c, 0xab,
+    0xbb, 0xb9, 0x26, 0x3f, 0x5f, 0xf0, 0x22, 0x62, 0x74, 0x7c, 0x6d, 0x48, 0x2e, 0x30, 0xc1, 0x9a,
+    0x06, 0x2a, 0x7b, 0x7e, 0x15, 0x20, 0x35, 0xe8, 0x44, 0x35, 0x88, 0x69, 0x47, 0x2a, 0xcf, 0x0c,
+    0x2d, 0x73, 0x09, 0x54, 0xd5, 0x8f, 0x3e, 0x7b, 0xaf, 0x80, 0x52, 0x17, 0xde, 0x96, 0x11, 0x11,
+    0xfa, 0x47, 0x2c, 0x1c, 0xdb, 0x7f, 0x76, 0x70, 0x3c, 0xc5, 0xf0, 0x48, 0xcc, 0xe0, 0x76, 0xda,
+    0xa0, 0xb5, 0xa5, 0xec, 0x06, 0xb5, 0xfa, 0xe5, 0x5a, 0xb0, 0x7d, 0x81, 0x01, 0x6a, 0x27, 0xdc,
+    0x97, 0xb0, 0x25, 0x8c, 0xde, 0x38, 0xda, 0x66, 0x05, 0x28, 0x93, 0xdd, 0x90, 0x31, 0x3e, 0x86,
+    0x0a, 0x61, 0x2b, 0x09, 0xfe, 0x04, 0x37, 0xc6, 0x62, 0x30, 0x54, 0x81, 0xa5, 0x82, 0x77, 0xd3,
+    0xce, 0xac, 0x4a, 0x99, 0xac, 0x2d, 0x7c, 0x7e, 0x53, 0xf0, 0x82, 0x01, 0x84, 0x7c, 0xd4, 0x55,
+    0x2a, 0xf8, 0xfb, 0x45, 0x1b, 0xb5, 0x15, 0x33, 0xd7, 0xae, 0xef, 0x72, 0x65, 0x70, 0x73, 0xb8,
+    0x01, 0xa2, 0x42, 0xc9, 0x67, 0xbb, 0x58, 0xb8, 0x9d, 0x7c, 0x9d, 0x47, 0xe6, 0x55, 0xf4, 0xce,
+    0x51, 0x5b, 0x9b, 0x5c, 0x0b, 0x7b, 0xdf, 0x21, 0x30, 0x6e, 0x90, 0x5e, 0xa0, 0xcc, 0x74, 0x12,
+    0xd6, 0xe3, 0xcc, 0x33, 0x22, 0x6e, 0x12, 0xe5, 0x6c, 0x99, 0x69, 0x46, 0x56, 0xcd, 0xa7, 0xf1,
+    0x23, 0xce, 0x76, 0xd5, 0xcc, 0xb0, 0x5e, 0xbc, 0x8d, 0x78, 0xcd, 0x75, 0xda, 0x07, 0xd5, 0xfd,
+    0x97, 0xad, 0x7c, 0x67, 0xd5, 0x64, 0x02, 0x11, 0x0c, 0xcf, 0x68, 0x74, 0x58, 0x7b, 0xac, 0xd8,
+    0x84, 0x9a, 0x52, 0x17, 0x7e, 0x05, 0x73, 0x76, 0x77, 0xb0, 0x34, 0x79, 0xf8, 0xc9, 0xcb, 0x5f,
+    0x59, 0xd9, 0x4f, 0x56, 0xbc, 0x05, 0xbc, 0x80, 0x7b, 0x67, 0x5e, 0xfc, 0xe2, 0x2f, 0x89, 0x2d,
+    0x8f, 0xcf, 0x41, 0x3b, 0x47, 0x08, 0x20, 0x20, 0xf0, 0x25, 0xa3, 0x70, 0xf5, 0xf3, 0x30, 0x70,
+    0xf5, 0xd2, 0x77, 0x29, 0x4a, 0x2c, 0xc3, 0x0b, 0x44, 0xa7, 0x54, 0x4e, 0x0b, 0xc6, 0x71, 0xcd,
+    0xed, 0xbc, 0xd6, 0x60, 0x6e, 0x52, 0x38, 0x16, 0x8a, 0xde, 0x38, 0x22, 0xa6, 0xf9, 0xd1, 0xf1,
+    0x79, 0xc0, 0xd0, 0x92, 0x56, 0xd5, 0x8a, 0xb5, 0xb1, 0x18, 0xe2, 0x5e, 0x22, 0x3f, 0x11, 0x07,
+    0xad, 0xe6, 0x16, 0x7a, 0x5a, 0x64, 0xf8, 0x9a, 0x69, 0x40, 0x9e, 0xc1, 0x2a, 0x2b, 0x98, 0x15,
+    0xa4, 0xd1, 0xc7, 0x19, 0xfa, 0xce, 0x1e, 0xfe, 0x8f, 0xe7, 0x40, 0x3d, 0x8e, 0xdb, 0x02, 0x95,
+    0x69, 0xe3, 0xca, 0xae, 0x06, 0xac, 0x22, 0x39, 0x44, 0xd8, 0x75, 0x31, 0xa5, 0xa7, 0xc6, 0x5e,
+    0x89, 0xca, 0xb1, 0x5b, 0xe8, 0x90, 0x92, 0xa2, 0x9a, 0x4d, 0xb0, 0xd3, 0xec, 0x7f, 0xbb, 0x85,
+    0xb2, 0xc5, 0x64, 0x14, 0xab, 0xfb, 0x7c, 0xe4, 0x12, 0x66, 0x1c, 0x02, 0xc0, 0x91, 0x46, 0xc9,
+    0x01, 0x70, 0x95, 0xde, 0x9a, 0xf1, 0x25, 0x69, 0xc3, 0xed, 0x7a, 0xd0, 0xed, 0xe9, 0xec, 0xe2,
+    0xd4, 0x1d, 0xac, 0xce, 0xfc, 0x32, 0x39, 0xd7, 0x69, 0x5e, 0xba, 0x0c, 0xf9, 0x9c, 0xbc, 0x4f,
+    0x94, 0x77, 0xeb, 0x7c, 0x46, 0x26, 0x60, 0xfc, 0xb9, 0x8c, 0x6f, 0x6a, 0xf0, 0xfd, 0xb7, 0x8c,
+    0xc9, 0x0d, 0x2f, 0x7f, 0x0a, 0x49, 0x4b, 0xe7, 0x32, 0x67, 0x24, 0xfd, 0x41, 0xfb, 0x23, 0x65,
+    0x33, 0x52, 0x59, 0x90, 0x5f, 0x29, 0xae, 0xa3, 0x7c, 0x99, 0xe9, 0xa0, 0x83, 0x2d, 0x20, 0x90,
+    0xf7, 0x95, 0x85, 0xd0, 0x59, 0xdd, 0x97, 0x58, 0x40, 0xe5, 0x89, 0x4b, 0x11, 0x10, 0x76, 0x9e,
+    0x61, 0xf2, 0x5c, 0xfa, 0x80, 0xfd, 0xa8, 0x59, 0xab, 0x8c, 0xc8, 0x1f, 0x71, 0x35, 0x63, 0x15,
+    0xec, 0x3d, 0xe6, 0x53, 0xf9, 0xfb, 0x54, 0xdd, 0x38, 0x0c, 0x84, 0xff, 0x6b, 0xf1, 0x1d, 0xb2,
+    0xc5, 0x67, 0x12, 0x80, 0xa9, 0x19, 0xa7, 0x5e, 0xa1, 0xc3, 0xad, 0x1a, 0x1f, 0x50, 0x8e, 0xab,
+    0xed, 0x48, 0x9b, 0x3e, 0x0d, 0x71, 0x4a, 0xe2, 0xfa, 0x1c, 0xfd, 0xee, 0x81, 0x61, 0x88, 0x61,
+    0x73, 0x50, 0x35, 0x2a, 0x49, 0x07, 0xfb, 0x0b, 0x80, 0x2f, 0x70, 0x66, 0x31, 0x34, 0x44, 0x68,
+    0x42, 0xc1, 0xda, 0x20, 0x12, 0x5f, 0xa0, 0x9d, 0xa2, 0x14, 0xef, 0x50, 0xff, 0x26, 0xd4, 0x71,
+    0xfd, 0x28, 0x8e, 0xbd, 0x4b, 0xe0, 0x86, 0xb5, 0x1e, 0x77, 0xc3, 0x17, 0x2f, 0x0a, 0xac, 0x6d,
+    0x9d, 0x7f, 0xb9, 0xdc, 0x08, 0xc6, 0x4b, 0x69, 0x3d, 0x5c, 0xd1, 0x83, 0xb1, 0x42, 0x1e, 0x81,
+    0x2b, 0xc3, 0x14, 0xfe, 0x0c, 0x06, 0x07, 0xc7, 0x9e, 0xf7, 0x2a, 0x49, 0x91, 0x3c, 0x66, 0x3a,
+    0x35, 0xc2, 0xb6, 0xea, 0x0d, 0x75, 0xce, 0x20, 0x7e, 0x56, 0xbf, 0x5b, 0xcc, 0x1b, 0xe5, 0xd2,
+    0xb0, 0xca, 0x10, 0x43, 0xce, 0x5c, 0x56, 0xcb, 0x61, 0x27, 0xb7, 0xd7, 0x87, 0xeb, 0x8d, 0x31,
+    0xe5, 0x34, 0x9a, 0x9a, 0x98, 0x53, 0x04, 0xaf, 0xab, 0xd2, 0x42, 0xa6, 0x35, 0x97, 0xec, 0xb8,
+    0x62, 0x39, 0x08, 0x4e, 0x56, 0x1e, 0xa8, 0xcc, 0xff, 0x76, 0xcd, 0x17, 0x46, 0xfa, 0x1c, 0x39,
+    0x16, 0x65, 0xcb, 0x9c, 0x4d, 0x7c, 0x81, 0x0b, 0x74, 0xb1, 0xf3, 0x89, 0x0b, 0xf3, 0x95, 0x81,
+    0x37, 0xd2, 0x60, 0x02, 0xd2, 0x1a, 0xd7, 0xe2, 0x1d, 0x10, 0x83, 0xf3, 0x1c, 0x02, 0x87, 0x93,
+    0x6b, 0x3c, 0xc2, 0x56, 0xf4, 0xf7, 0xf0, 0x61, 0x4a, 0x1a, 0x2f, 0x52, 0x28, 0x1f, 0xf0, 0xc7,
+    0xca, 0x9b, 0x85, 0x92, 0x9c, 0x97, 0x1a, 0xb6, 0xca, 0x5b, 0x32, 0x08, 0x42, 0x38, 0x10, 0xd2,
+    0x39, 0x85, 0x66, 0x30, 0x00, 0x59, 0xc8, 0xfa, 0x24, 0x3d, 0x46, 0xf2, 0xc4, 0xa2, 0xc7, 0x3b,
+    0x89, 0x2d, 0x2d, 0xf0, 0x8d, 0x7f, 0xcc, 0x5b, 0xb4, 0x6a, 0xc7, 0x99, 0x72, 0x44, 0xc3, 0xe2,
+    0x58, 0xe3, 0x8e, 0xe4, 0x77, 0x8f, 0x91, 0x26, 0xc0, 0x06, 0xe0, 0xe2, 0x5f, 0x14, 0x56, 0xa2,
+    0x60, 0x36, 0x3b, 0xd3, 0x15, 0x5d, 0x6b, 0x95, 0x36, 0x1c, 0x95, 0xc5, 0x90, 0x51, 0x27, 0x02,
+    0xc4, 0x26, 0x24, 0x56, 0xbb, 0x89, 0xab, 0xe6, 0xa1, 0x0d, 0x25, 0x3d, 0x17, 0xce, 0xc1, 0x79,
+    0x00, 0x96, 0x59, 0xb2, 0x93, 0xa0, 0x96, 0x14, 0xc9, 0xfa, 0x48, 0x1d, 0x99, 0x72, 0xf6, 0x2b,
+    0x64, 0xb2, 0xf5, 0x17, 0x5f, 0x10, 0x62, 0x1b, 0x3a, 0xe9, 0xc1, 0x0d, 0xca, 0x34, 0xbf, 0xc8,
+    0x57, 0x24, 0xeb, 0x2a, 0x84, 0x42, 0x18, 0x9e, 0x00, 0x14, 0x37, 0xcc, 0xda, 0x4e, 0x7c, 0x71,
+    0x04, 0x23, 0x54, 0x86, 0x22, 0xea, 0x51, 0x72, 0x98, 0x63, 0x18, 0x53, 0x33, 0x3f, 0x0a, 0xcf,
+    0xdd, 0x60, 0x8d, 0xea, 0x2a, 0xeb, 0xbe, 0xa8, 0x10, 0x4b, 0x26, 0x84, 0xf5, 0x03, 0x22, 0x40,
+    0x57, 0x67, 0x6a, 0xd6, 0x50, 0x65, 0xce, 0xf0, 0x8c, 0x73, 0xad, 0xda, 0x58, 0x35, 0x2c, 0xb5,
+    0xe5, 0xc1, 0xad, 0x3f, 0x7a, 0xd1, 0x15, 0x5b, 0xed, 0xa2, 0xb7, 0x50, 0xa0, 0x20, 0xbf, 0x8a,
+    0xb2, 0x05, 0xed, 0xdd, 0x79, 0x99, 0x78, 0xc3, 0x26, 0x8b, 0x30, 0x57, 0x25, 0xb0, 0x5b, 0x18,
+    0x75, 0xb8, 0xf2, 0x22, 0xc4, 0x07, 0xb6, 0xea, 0x80, 0xbd, 0xcb, 0x25, 0x92, 0x88, 0x38, 0x95,
+    0x8f, 0xa8, 0xf1, 0xfc, 0x35, 0xbe, 0xb7, 0x85, 0x02, 0xd5, 0x81, 0x66, 0x0c, 0x51, 0xbc, 0x30,
+    0x03, 0xc1, 0xbf, 0x3f, 0xa5, 0x49, 0xbc, 0xd8, 0x72, 0xe7, 0xf0, 0x7e, 0xa1, 0x82, 0x8a, 0x45,
+    0x6b, 0xbb, 0x56, 0xa2, 0x02, 0x28, 0x9c, 0xd9, 0x78, 0x49, 0x9b, 0x13, 0xb2, 0xb3, 0x85, 0xbd,
+    0x94, 0x6d, 0xad, 0xb4, 0xce, 0x05, 0x44, 0xc4, 0x34, 0xbb, 0x73, 0xbd, 0xaf, 0x0a, 0x9a, 0x30,
+    0x33, 0x1a, 0x88, 0xec, 0x82, 0x45, 0x31, 0x3f, 0x08, 0x3a, 0xad, 0xab, 0xf2, 0x23, 0x7f, 0xcc,
+    0xe2, 0x9d, 0xe7, 0x3b, 0x56, 0x9e, 0x03, 0xb7, 0xf6, 0xb6, 0xa5, 0x66, 0x31, 0xaf, 0x18, 0x2b,
+    0x51, 0xe6, 0x31, 0x8a, 0xd3, 0x93, 0xf8, 0x61, 0x57, 0xa7, 0x94, 0xb6, 0x81, 0xa1, 0x25, 0x51,
+    0xdb, 0x7f, 0x18, 0xa4, 0xf1, 0xd6, 0x2d, 0xe0, 0x8e, 0x89, 0xb4, 0xbf, 0xb0, 0xd6, 0xcc, 0xd7,
+    0xdb, 0x1b, 0x06, 0x1c, 0xc2, 0xca, 0x45, 0x43, 0xb5, 0x69, 0x64, 0x05, 0xb1, 0xb4, 0xce, 0xdc,
+    0xe8, 0x50, 0x4c, 0xe8, 0x96, 0x55, 0x26, 0xfd, 0x33, 0x52, 0x47, 0xbe, 0xb5, 0x9a, 0x8d, 0x8a,
+    0xbb, 0x07, 0xd0, 0x86, 0xd7, 0x8e, 0x26, 0x62, 0x07, 0x95, 0x7f, 0x9d, 0xb5, 0xaa, 0x2d, 0x4b,
+    0xf7, 0xd6, 0x6b, 0xbf, 0x7a, 0x6b, 0xfa, 0xde, 0xea, 0xd8, 0xcd, 0x77, 0x59, 0xa1, 0xd9, 0x62,
+    0x4f, 0x1a, 0x09, 0xc8, 0x0b, 0xcc, 0x98, 0x1a, 0x8f, 0x7e, 0x7c, 0xf5, 0x45, 0x73, 0x39, 0x27,
+    0x76, 0x4f, 0x25, 0x7c, 0x14, 0x0b, 0x7d, 0x9b, 0x63, 0x1f, 0x70, 0x50, 0x1a, 0x2d, 0x68, 0x98,
+    0x4d, 0x31, 0xcb, 0x29, 0xbe, 0xc4, 0x6a, 0x55, 0xf1, 0x9c, 0xb0, 0x0b, 0xa2, 0x32, 0x6f, 0x59,
+    0x8d, 0xde, 0xcd, 0xd4, 0x06, 0x3d, 0x83, 0x17, 0xe8, 0x8e, 0x5a, 0xb8, 0x2d, 0x24, 0x4a, 0xcc,
+    0x05, 0xd4, 0x1a, 0x56, 0xea, 0x54, 0xa3, 0x3d, 0x84, 0xd3, 0x1c, 0x81, 0x0c, 0xbe, 0x91, 0xf6,
+    0xe4, 0x64, 0x1c, 0x3e, 0xcd, 0x65, 0x3a, 0xad, 0xee, 0xdc, 0x12, 0x13, 0x84, 0xbe, 0x8c, 0x16,
+    0xc8, 0x1e, 0x6e, 0x27, 0xe3, 0x84, 0x14, 0xa6, 0xbc, 0x83, 0x95, 0xe8, 0x8e, 0xd8, 0xed, 0xa1,
+    0xa2, 0xbf, 0x03, 0x5e, 0xaa, 0x49, 0xf1, 0xcd, 0xa9, 0xbb, 0xb1, 0x89, 0x49, 0x49, 0x63, 0x5c,
+    0xea, 0x5c, 0x1d, 0x4d, 0xef, 0xfc, 0x35, 0xe8, 0x00, 0x97, 0xec, 0xe0, 0x47, 0x20, 0xe2, 0x56,
+    0x31, 0x23, 0xcd, 0xec, 0xe5, 0x70, 0x62, 0x15, 0x6d, 0xe7, 0x95, 0x81, 0x8f, 0x56, 0x78, 0xe8,
+    0x7b, 0xc9, 0xa7, 0xf2, 0xe5, 0xe6, 0xcd, 0x21, 0xdd, 0x75, 0x20, 0x9e, 0xf9, 0xb3, 0xd4, 0x6f,
+    0x6e, 0x6d, 0xa0, 0xfe, 0x07, 0xed, 0xdf, 0xe7, 0xe3, 0x98, 0x75, 0x21, 0x45, 0xf5, 0x6d, 0x6f,
+    0xb3, 0x62, 0xad, 0xa8, 0x2b, 0x36, 0x42, 0x46, 0x22, 0xa2, 0x91, 0xc6, 0x8b, 0x03, 0xd7, 0x80,
+    0xd7, 0x4b, 0x1b, 0xeb, 0x0d, 0xd8, 0x56, 0x38, 0x78, 0xe3, 0x24, 0x0f, 0x59, 0xe7, 0x45, 0x5b,
+    0x87, 0xd4, 0x83, 0x65, 0x69, 0x1c, 0xad, 0x86, 0x07, 0x94, 0x76, 0x84, 0xdc, 0x26, 0x9e, 0xd4,
+    0xea, 0x8d, 0xed, 0xb3, 0xa2, 0x7b, 0x07, 0x58, 0x84, 0x03, 0xe0, 0x1f, 0x4f, 0xfb, 0xbf, 0xa5,
+    0x79, 0x0c, 0x2e, 0x48, 0xf4, 0x1d, 0x0a, 0x57, 0xde, 0x73, 0x50, 0x70, 0x08, 0x05, 0x9b, 0x58,
+    0x5c, 0x5d, 0x57, 0x80, 0xc1, 0xe8, 0x24, 0xfb, 0x7e, 0x46, 0x08, 0x68, 0xcb, 0xdf, 0xc2, 0x91,
+    0x04, 0x06, 0x07, 0xbc, 0x85, 0x25, 0x16, 0x6a, 0x6c, 0x6a, 0xa3, 0xa2, 0x98, 0x3b, 0xa7, 0xa0,
+    0xcf, 0x2a, 0xa2, 0x11, 0x9c, 0xe0, 0x84, 0x3b, 0x36, 0x2f, 0x33, 0x5a, 0xf2, 0xa0, 0xee, 0xb1,
+    0xd9, 0xb6, 0x45, 0xbd, 0x82, 0x1e, 0x36, 0x0a, 0x46, 0x48, 0x35, 0x54, 0xa8, 0x3c, 0x8a, 0x0b,
+    0x85, 0x19, 0xe9, 0x88, 0xb8, 0xc3, 0xd6, 0x7b, 0x89, 0x32, 0x56, 0xff, 0xfc, 0x50, 0xdd, 0xf9,
+    0x6b, 0x5f, 0x9d, 0xb1, 0xd4, 0x56, 0x07, 0xd3, 0xf6, 0xac, 0x05, 0x91, 0x31, 0xf0, 0xe6, 0x35,
+    0x7f, 0x7e, 0x1e, 0x3d, 0xed, 0x4a, 0x87, 0x7d, 0x14, 0xa0, 0x0e, 0xbb, 0xa9, 0x54, 0xc2, 0x1f,
+    0x2a, 0x74, 0xd0, 0x2b, 0x56, 0x1b, 0xc0, 0x02, 0x5c, 0x47, 0xd5, 0xed, 0x87, 0x82, 0x6b, 0xdf,
+    0x7c, 0x0b, 0xa5, 0xd1, 0x89, 0x18, 0x6d, 0xd3, 0xa5, 0x0d, 0xdc, 0x73, 0xb1, 0x27, 0x55, 0xe2,
+    0xec, 0x4b, 0x8d, 0xe1, 0xee, 0xaa, 0x12, 0xd0, 0x62, 0x30, 0x59, 0x4c, 0xee, 0x6e, 0x6f, 0x6b,
+    0xf9, 0x74, 0x90, 0x89, 0x3e, 0xdb, 0xe1, 0xde, 0xe8, 0x2d, 0xee, 0x34, 0xa8, 0x02, 0x98, 0xbc,
+    0xc7, 0x0c, 0xfc, 0xfd, 0x03, 0xb7, 0x69, 0x3c, 0xa9, 0x62, 0x08, 0x66, 0x0a, 0xc7, 0xa4, 0xf3,
+    0x04, 0x56, 0x16, 0x5b, 0x76, 0xeb, 0x8e, 0xca, 0xf1, 0xec, 0x75, 0xd7, 0x66, 0x48, 0xa5, 0x58,
+    0x05, 0x33, 0xa3, 0x79, 0x8c, 0x21, 0x1f, 0x7a, 0xd1, 0x69, 0x53, 0xed, 0xe4, 0x4a, 0xff, 0xef,
+    0xbc, 0xec, 0x17, 0x18, 0x0f, 0x94, 0x0e, 0x1d, 0x9b, 0x2e, 0xbc, 0xa9, 0x54, 0xf8, 0x5b, 0x2d,
+    0x2f, 0x9f, 0x26, 0xff, 0x00, 0x9d, 0x72, 0xb7, 0xb9, 0x47, 0xae, 0x8b, 0xde, 0x64, 0x3b, 0xd3,
+    0x4b, 0xde, 0x1d, 0xf7, 0x8d, 0xc0, 0x00, 0xdf, 0xbe, 0x07, 0x2c, 0xf2, 0xd5, 0x4f, 0xe1, 0xe0,
+    0x38, 0x6c, 0x8d, 0x79, 0xf7, 0xa8, 0xa5, 0xaf, 0x99, 0xd3, 0xd9, 0x67, 0x3d, 0xb1, 0xd8, 0x5b,
+    0xce, 0x6a, 0x02, 0xe4, 0x66, 0x0d, 0x4d, 0x50, 0xb0, 0x4b, 0x27, 0x09, 0xa9, 0x37, 0x51, 0xde,
+    0x77, 0x40, 0xe5, 0x4a, 0xdb, 0x58, 0x2d, 0x11, 0xa9, 0xbe, 0x36, 0x1d, 0x3c, 0xe0, 0x96, 0x6f,
+    0x94, 0x6b, 0x3b, 0xbf, 0xa2, 0xb0, 0x26, 0x85, 0xb2, 0x50, 0xa2, 0x41, 0xe3, 0x84, 0x45, 0x87,
+    0x77, 0x04, 0xd7, 0x16, 0x01, 0x19, 0x61, 0x4b, 0x04, 0xc3, 0x93, 0x3b, 0x41, 0xe1, 0x7a, 0xdb,
+    0xb3, 0x7c, 0x25, 0x5c, 0x42, 0x70, 0x55, 0x68, 0xf3, 0x1b, 0xfa, 0x99, 0xda, 0x57, 0x09, 0x5f,
+    0xf6, 0x69, 0xa7, 0xbc, 0x7d, 0xe1, 0x0d, 0xf3, 0x13, 0xef, 0xe7, 0x4f, 0x45, 0xb5, 0x43, 0x1b,
+    0xe4, 0xd9, 0xd0, 0x2b, 0xfa, 0x70, 0x9f, 0x15, 0x0e, 0x6d, 0xa9, 0x30, 0x43, 0x08, 0x26, 0x4d,
+    0x31, 0x66, 0x7c, 0x60, 0xee, 0x17, 0xe0, 0x79, 0x43, 0xf2, 0xe6, 0xb3, 0xe1, 0x7e, 0xb7, 0xfc,
+    0x94, 0x54, 0x78, 0xb5, 0xbc, 0xe8, 0xed, 0x41, 0x78, 0xdf, 0x49, 0xef, 0x0e, 0x15, 0xac, 0x00,
+    0x8f, 0x87, 0xd2, 0x79, 0x69, 0xfd, 0x62, 0x4c, 0xda, 0xa4, 0x19, 0xa0, 0x7b, 0xe4, 0xac, 0x9b,
+    0x0f, 0x18, 0x4c, 0x1e, 0x32, 0xad, 0xbd, 0x3a, 0xba, 0xfc, 0xd0, 0xbf, 0x84, 0x37, 0x27, 0xb1,
+    0xc2, 0xbd, 0xe1, 0xad, 0xa2, 0xd1, 0xab, 0x6f, 0xe2, 0x88, 0xff, 0x8d, 0x58, 0x78, 0x39, 0x5e,
+    0xf7, 0x04, 0x11, 0xe2, 0xa0, 0x2a, 0x0f, 0x19, 0x31, 0xec, 0x8e, 0xea, 0x48, 0xd2, 0x6e, 0x2c,
+    0x62, 0x99, 0xb4, 0x34, 0xed, 0xd6, 0x73, 0x35, 0xe0, 0xa5, 0x04, 0x4d, 0x3b, 0x3e, 0x0e, 0x77,
+    0xa8, 0x8d, 0x36, 0x8f, 0xe3, 0x53, 0x9d, 0x90, 0xc8, 0x04, 0xda, 0xf5, 0x02, 0x98, 0xa9, 0x94,
+    0xfa, 0x41, 0xe5, 0x25, 0xed, 0x5a, 0x78, 0x64, 0x6d, 0xae, 0xa7, 0x7c, 0x35, 0xab, 0xe7, 0xdc,
+    0x82, 0xc4, 0x8b, 0xa5, 0x8b, 0xaa, 0xbd, 0x3c, 0xd0, 0x0d, 0x3e, 0x38, 0x81, 0x05, 0x1f, 0x92,
+    0xb0, 0x83, 0xd1, 0x60, 0x15, 0x7b, 0xca, 0x1b, 0xf5, 0x92, 0x27, 0xee, 0x6e, 0xf0, 0x38, 0xe2,
+    0x01, 0x27, 0x64, 0x8c, 0x34, 0xaa, 0xbe, 0xdd, 0xee, 0x4a, 0xf4, 0x2a, 0x31, 0x3e, 0x57, 0xcc,
+    0x6d, 0x06, 0x2c, 0x5a, 0x44, 0xa0, 0x37, 0x5d, 0x7d, 0x97, 0x8c, 0x84, 0xa2, 0x07, 0xc9, 0x72,
+    0xb4, 0x87, 0xed, 0xcc, 0xd9, 0x6b, 0x9a, 0xff, 0xf7, 0xcc, 0x41, 0xbf, 0xc6, 0x5d, 0x3c, 0x25,
+    0x5b, 0xca, 0x7c, 0x8c, 0x96, 0x2f, 0xf9, 0x7c, 0x95, 0x91, 0x81, 0xb1, 0x7f, 0x0b, 0x85, 0x09,
+    0x8e, 0xfe, 0x6b, 0x2a, 0x87, 0x4a, 0xef, 0x58, 0xb1, 0x6d, 0x54, 0x6f, 0x38, 0xb9, 0xde, 0x9f,
+    0x55, 0x00, 0xc8, 0x2f, 0x6a, 0x67, 0x33, 0xb6, 0xd4, 0x5d, 0xb5, 0x32, 0x55, 0x4b, 0xf7, 0x2e,
+    0xa6, 0xad, 0x8d, 0x1b, 0xa1, 0x2e, 0x93, 0x38, 0xc4, 0x91, 0x97, 0xc3, 0xea, 0xde, 0x18, 0x31,
+    0x26, 0x96, 0x9b, 0xc3, 0xa6, 0xe0, 0x94, 0x4f, 0xe8, 0x39, 0x1d, 0x38, 0x85, 0x8e, 0xd7, 0x83,
+    0x40, 0x4a, 0x6a, 0xc7, 0xbe, 0xba, 0x71, 0x40, 0xe0, 0x9e, 0xc4, 0x20, 0xab, 0xd2, 0x37, 0x46,
+    0x23, 0xb1, 0x3f, 0xf0, 0xaa, 0x8d, 0x17, 0x00, 0x3e, 0x80, 0x7c, 0x8c, 0x0f, 0x8a, 0xb3, 0x0b,
+    0xf2, 0x25, 0x20, 0x0f, 0x23, 0x3f, 0x70, 0xee, 0x04, 0x88, 0x1b, 0x05, 0x8d, 0x19, 0x53, 0x79,
+    0x25, 0x68, 0xfc, 0x53, 0xd5, 0x3e, 0x5a, 0x2f, 0x82, 0x49, 0xbb, 0x4b, 0xb0, 0x7d, 0x8b, 0xcf,
+    0xda, 0x4a, 0xe5, 0x20, 0xc4, 0xf3, 0x76, 0x46, 0x1b, 0x76, 0x92, 0x24, 0xd1, 0xd1, 0x47, 0x44,
+    0x0f, 0xa0, 0xbc, 0x40, 0xa5, 0xb7, 0x29, 0x9a, 0x02, 0x8f, 0xda, 0xb6, 0x71, 0x42, 0x0b, 0x17,
+    0xc6, 0x18, 0x1c, 0x56, 0xe9, 0x3d, 0x63, 0x35, 0xc8, 0x93, 0x47, 0x88, 0x8a, 0x44, 0x53, 0x7f,
+    0xdf, 0x59, 0x0c, 0x2c, 0x65, 0xd4, 0x29, 0xff, 0x89, 0x0c, 0xc0, 0xc6, 0xcf, 0xb7, 0xc3, 0x62,
+    0x85, 0x4b, 0x0b, 0x9a, 0x26, 0xe1, 0x83, 0x0e, 0xb3, 0xc6, 0x2a, 0xfe, 0x72, 0x1f, 0x1d, 0x70,
+    0x7e, 0xe2, 0x3e, 0xfe, 0x6f, 0xfa, 0x66, 0x86, 0x33, 0xf8, 0xc3, 0x17, 0x6c, 0x8b, 0x91, 0x00,
+    0x88, 0x69, 0x7e, 0xc2, 0xb4, 0x14, 0x5d, 0xae, 0xcf, 0x49, 0xe0, 0x29, 0x27, 0x6d, 0x9e, 0x5d,
+    0x1d, 0x17, 0xa4, 0xe0, 0xdb, 0x22, 0x9f, 0x6b, 0x35, 0xdc, 0xb0, 0xd6, 0x75, 0xf5, 0xfb, 0x7e,
+    0x5f, 0xcf, 0x3e, 0x1a, 0x3f, 0x16, 0xe0, 0xf0, 0x76, 0xd6, 0x3e, 0x84, 0xcc, 0xf5, 0xe4, 0x72,
+    0xd6, 0x47, 0xd8, 0xf4, 0xd0, 0xb6, 0x87, 0xe9, 0x15, 0x8a, 0x72, 0xd2, 0x48, 0xa0, 0xe1, 0x86,
+    0x27, 0x15, 0x01, 0xf0, 0x06, 0xa4, 0xc5, 0x66, 0x22, 0x88, 0x19, 0x14, 0xa8, 0x06, 0xf6, 0x7e,
+    0xeb, 0xb6, 0xae, 0x4a, 0x49, 0xfd, 0xcb, 0x54, 0x71, 0xc8, 0x5d, 0x11, 0xa8, 0x84, 0xa9, 0x58,
+    0xc1, 0xa2, 0x79, 0x18, 0xc9, 0x57, 0xa0, 0xe4, 0x8b, 0x78, 0x62, 0x80, 0x32, 0x71, 0x60, 0x6b,
+    0xf8, 0xbc, 0xca, 0xf5, 0x37, 0x59, 0x30, 0x45, 0xd1, 0x4e, 0x2d, 0x79, 0x07, 0x7c, 0xaa, 0x62,
+    0x02, 0xb7, 0x8f, 0xd6, 0xd6, 0x9e, 0x87, 0xf7, 0xc0, 0x7a, 0x47, 0xa5, 0x8a, 0xb4, 0xbb, 0xbc,
+    0xcd, 0xef, 0x7f, 0x04, 0x08, 0xdd, 0x1d, 0x27, 0x1f, 0x26, 0x28, 0x2c, 0x11, 0xb5, 0xb6, 0x28,
+    0x47, 0x57, 0xff, 0x34, 0x67, 0xc2, 0x8c, 0xca, 0xbf, 0x40, 0x7b, 0xbb, 0x1e, 0xa1, 0xe5, 0xc3,
+    0x17, 0x3a, 0xbe, 0xa6, 0xf3, 0x0e, 0x31, 0x9d, 0x00, 0xa5, 0xbe, 0x49, 0xdc, 0x95, 0x63, 0xfa,
+    0xb6, 0xbb, 0x9a, 0x40, 0x4e, 0x22, 0x6e, 0x8c, 0xe8, 0x7f, 0x32, 0xba, 0xc4, 0x94, 0x03, 0xbe,
+    0x99, 0x70, 0x5e, 0x56, 0x5f, 0x7a, 0xe3, 0x96, 0x19, 0x72, 0x4e, 0xff, 0x71, 0x8f, 0x17, 0x18,
+    0xbd, 0x69, 0xc0, 0xcc, 0xca, 0x02, 0x4b, 0xf6, 0x66, 0x15, 0xe0, 0xb2, 0x9c, 0xbc, 0x5c, 0x4e,
+    0xe6, 0x64, 0xdf, 0x2c, 0xd9, 0x74, 0x96, 0xb8, 0xa5, 0x19, 0xc2, 0x44, 0xad, 0x15, 0xf8, 0x6e,
+    0xb1, 0xc8, 0x09, 0xe1, 0x8a, 0x75, 0x6d, 0xe2, 0x83, 0x12, 0x61, 0x9f, 0x77, 0x85, 0xa4, 0x2e,
+    0xb0, 0x53, 0xa7, 0x93, 0x65, 0x0e, 0x89, 0xfa, 0xde, 0x99, 0xd1, 0xdc, 0x40, 0xf6, 0x88, 0xd4,
+    0xde, 0x9a, 0x6b, 0xcf, 0x40, 0x6c, 0xb2, 0x86, 0x22, 0x24, 0xcb, 0x85, 0xd1, 0x0a, 0xc7, 0x61,
+    0x30, 0xf9, 0x89, 0xb8, 0x63, 0x59, 0x15, 0x42, 0xff, 0x6a, 0xe9, 0x4e, 0x8c, 0xa8, 0xcb, 0xad,
+    0x90, 0x20, 0xf3, 0x3f, 0x5c, 0x0f, 0x6a, 0xf2, 0x2d, 0x65, 0x03, 0x6a, 0xba, 0xa2, 0x82, 0x2c,
+    0x13, 0x91, 0x68, 0xe1, 0x24, 0xed, 0x40, 0xea, 0xf0, 0xba, 0xb0, 0xb5, 0xd4, 0x13, 0x51, 0xee,
+    0x78, 0x75, 0x50, 0x6e, 0xa0, 0x1e, 0x60, 0x47, 0x89, 0x76, 0x65, 0x45, 0xfe, 0xa4, 0xef, 0x8b,
+    0x77, 0x85, 0xae, 0xe9, 0xb6, 0x93, 0x04, 0x2d, 0x37, 0x68, 0x3b, 0x8a, 0xeb, 0xf9, 0xc8, 0x79,
+    0xd8, 0xe0, 0x9f, 0x30, 0xb1, 0xa0, 0xed, 0xee, 0x0e, 0x55, 0xff, 0x62, 0x44, 0xb0, 0x1d, 0x34,
+    0xbd, 0x87, 0x43, 0xef, 0x4c, 0xc4, 0xae, 0x1d, 0x8f, 0xeb, 0x52, 0xe1, 0xf8, 0x96, 0x93, 0x57,
+    0x29, 0x31, 0x96, 0x12, 0x1a, 0xdc, 0x12, 0x89, 0xda, 0x25, 0x8e, 0x4e, 0xb8, 0x58, 0x02, 0xd8,
+    0x3e, 0xab, 0x11, 0x13, 0xe2, 0x6e, 0xc4, 0xd7, 0x56, 0x9f, 0x65, 0x43, 0x6f, 0xd7, 0x38, 0xe5,
+    0xe1, 0xf3, 0xeb, 0x84, 0xa9, 0x78, 0x4d, 0xb0, 0x9b, 0x60, 0x98, 0x95, 0x3e, 0x60, 0x06, 0xb1,
+    0x75, 0x03, 0x85, 0x08, 0xad, 0xa0, 0x8d, 0x11, 0x5f, 0xa1, 0x88, 0x55, 0x08, 0x60, 0xfa, 0x9c,
+    0x75, 0x80, 0xac, 0x39, 0x11, 0xb0, 0x59, 0xe5, 0xc9, 0xa0, 0x63, 0xab, 0xc4, 0x56, 0xd1, 0x80,
+    0xe8, 0x7c, 0xd0, 0x8f, 0x62, 0x9d, 0x37, 0xb6, 0x6d, 0xd1, 0x6b, 0x2a, 0xba, 0x0f, 0xf9, 0x7f,
+    0xea, 0xa8, 0x34, 0xf2, 0x40, 0xf4, 0x2f, 0x5f, 0xe3, 0x7c, 0x19, 0x3e, 0xb9, 0x68, 0x02, 0x73,
+    0xc9, 0xef, 0x4b, 0x96, 0x1f, 0xf1, 0xd9, 0x81, 0x36, 0x73, 0x98, 0x5c, 0xdc, 0x84, 0x2e, 0x96,
+    0xb8, 0x84, 0x12, 0x5c, 0x03, 0xc8, 0xc6, 0x27, 0x9a, 0x95, 0xfa, 0x6e, 0xb1, 0x47, 0xf5, 0xb0,
+    0x8d, 0x86, 0x0f, 0xa8, 0xf6, 0xe3, 0x06, 0xdb, 0x57, 0x0e, 0xab, 0x68, 0x20, 0x6b, 0xf3, 0xa2,
+    0x5c, 0xce, 0x5e, 0xdd, 0x96, 0xb0, 0xa8, 0x26, 0xe7, 0xb6, 0xac, 0xf3, 0x7d, 0x5e, 0xaf, 0x1b,
+    0x69, 0x37, 0xe9, 0x50, 0xc4, 0x3c, 0x02, 0xa2, 0xfe, 0xba, 0xc6, 0x5a, 0x3b, 0x20, 0xf7, 0x51,
+    0xb2, 0x3f, 0x5f, 0x80, 0xa6, 0x21, 0xdb, 0x63, 0x9b, 0xd8, 0x9f, 0xae, 0xa6, 0x2b, 0x8e, 0x07,
+    0x6a, 0xda, 0x6d, 0x94, 0x34, 0xd3, 0xac, 0xb0, 0xe0, 0x73, 0xe5, 0x83, 0x9b, 0x1a, 0xfd, 0xd2,
+    0xaf, 0xe7, 0x09, 0x36, 0x68, 0x22, 0x37, 0xdd, 0x77, 0xf9, 0x6f, 0xa3, 0x99, 0x87, 0x17, 0x2c,
+    0xb2, 0x13, 0x90, 0x28, 0x7c, 0x68, 0x40, 0x6b, 0xb7, 0xf2, 0x52, 0xd3, 0xd2, 0xae, 0x80, 0x50,
+    0xad, 0x0a, 0x4b, 0x7b, 0xd8, 0x04, 0x3a, 0x00, 0xd8, 0xfd, 0x4b, 0xb9, 0x8b, 0xee, 0x2a, 0xca,
+    0x22, 0x17, 0x40, 0x68, 0x43, 0x07, 0x34, 0x25, 0x96, 0x08, 0x9f, 0xe0, 0xa3, 0x7a, 0x57, 0x62,
+    0xe3, 0xe0, 0x08, 0xae, 0x72, 0x59, 0x93, 0x73, 0x6a, 0x38, 0x78, 0xec, 0x3f, 0x3e, 0xc5, 0x4e,
+    0xa0, 0x74, 0x96, 0x36, 0x8e, 0xd5, 0xbc, 0x04, 0x4b, 0x16, 0xd8, 0xc9, 0x47, 0x50, 0xa8, 0x30,
+    0x56, 0xd7, 0x29, 0xbc, 0x83, 0xa8, 0xd3, 0x68, 0xd6, 0x61, 0xde, 0x10, 0x10, 0x6e, 0x71, 0x63,
+    0x2a, 0xcd, 0xe3, 0xb9, 0xbb, 0xcf, 0xa9, 0xd9, 0x0b, 0xe9, 0x3e, 0xbb, 0xc3, 0xc4, 0xd3, 0x37,
+    0x1d, 0xe4, 0xea, 0x14, 0x2c, 0x69, 0x6c, 0xa1, 0xa1, 0xbe, 0x7f, 0xd2, 0xcd, 0x72, 0xa5, 0xd7,
+    0xe3, 0x6f, 0xf1, 0x82, 0xa9, 0xa5, 0x25, 0x0d, 0xd5, 0x19, 0xd9, 0x6a, 0x16, 0x9f, 0x91, 0x97,
+    0x72, 0x51, 0xe7, 0x48, 0x6f, 0x97, 0x7c, 0xb1, 0xae, 0x3b, 0x30, 0x48, 0xcf, 0x49, 0xaa, 0xfd,
+    0x15, 0x0a, 0x6e, 0xef, 0x3d, 0x03, 0x10, 0xfa, 0x36, 0x93, 0x6c, 0x62, 0x71, 0x7c, 0x04, 0x44,
+    0x07, 0x54, 0xd4, 0x39, 0x13, 0x98, 0x07, 0x42, 0xf3, 0x8d, 0x55, 0x22, 0x0c, 0x95, 0x9c, 0x08,
+    0xd5, 0xb7, 0xbd, 0x68, 0xb1, 0xb3, 0x03, 0x86, 0x65, 0x4d, 0x65, 0xfe, 0x17, 0x22, 0x51, 0xfa,
+    0x2f, 0xad, 0x93, 0x4e, 0xaa, 0xc1, 0xed, 0x41, 0x56, 0xd0, 0xb1, 0x3c, 0x36, 0xeb, 0xb7, 0xe1,
+    0x37, 0xc2, 0xf2, 0x62, 0x3b, 0xe6, 0x7c, 0x2f, 0x99, 0x99, 0x8c, 0x5e, 0xe1, 0xc1, 0xa3, 0xfa,
+    0x6b, 0xee, 0x95, 0x20, 0x83, 0xed, 0x18, 0xd4, 0x10, 0xe9, 0xc0, 0xba, 0x92, 0xf2, 0xba, 0x56,
+    0x0b, 0x68, 0x20, 0xe7, 0x40, 0x3a, 0xc2, 0x56, 0xd0, 0xc0, 0x95, 0x84, 0x62, 0x5b, 0x46, 0x14,
+    0xbd, 0xb6, 0xb9, 0x3b, 0x17, 0x45, 0xd4, 0xc0, 0xe1, 0x7f, 0x4d, 0x00, 0x22, 0x90, 0xc1, 0x5f,
+    0xa3, 0x56, 0xd1, 0xfc, 0x18, 0xbb, 0xf0, 0xd4, 0x9c, 0x0e, 0x52, 0xe3, 0xbf, 0xf1, 0xd6, 0xf2,
+    0xb6, 0xcc, 0x29, 0x2c, 0xc7, 0xea, 0x81, 0xdf, 0xac, 0x89, 0x26, 0xb2, 0x17, 0x46, 0xb7, 0x52,
+    0x12, 0xbb, 0xdc, 0x5e, 0xa6, 0xf1, 0x60, 0x90, 0xff, 0x46, 0xac, 0x40, 0x51, 0x51, 0x0f, 0x52,
+    0xaa, 0xb6, 0xd3, 0xe3, 0xed, 0xfb, 0x2f, 0xe2, 0x16, 0x6a, 0xe2, 0x97, 0xa2, 0x81, 0xb2, 0xda,
+    0x40, 0x69, 0xca, 0xb7, 0x1e, 0x56, 0xf6, 0x79, 0xdc, 0xf5, 0x3b, 0x51, 0xef, 0xf9, 0xe7, 0x70,
+    0x5b, 0x9a, 0x6e, 0xea, 0x22, 0x73, 0xc2, 0xdd, 0x7b, 0xe0, 0x37, 0x8e, 0x10, 0x05, 0x80, 0x56,
+    0x98, 0x3b, 0xea, 0xb6, 0x54, 0x2a, 0x18, 0xc3, 0x36, 0x8d, 0xef, 0x6b, 0x72, 0x89, 0xd3, 0x41,
+    0x08, 0xbb, 0x6a, 0x25, 0xa3, 0x33, 0xdf, 0x81, 0x1b, 0x98, 0x19, 0x77, 0x58, 0xd6, 0x95, 0x9e,
+    0x67, 0xde, 0x7b, 0x9c, 0xc8, 0x3b, 0xfb, 0xdd, 0x4f, 0x9a, 0x06, 0x2e, 0x8c, 0xfa, 0x55, 0xbb,
+    0x21, 0x9c, 0x6d, 0xd4, 0xca, 0x42, 0x9d, 0x63, 0x64, 0x03, 0x7b, 0x1c, 0x53, 0xeb, 0xb6, 0x0b,
+    0x26, 0xcc, 0x07, 0x5a, 0xcb, 0x4d, 0xdf, 0x5a, 0xd7, 0xf7, 0xe5, 0x57, 0x70, 0x39, 0x76, 0xda,
+    0xa6, 0x87, 0x14, 0x1b, 0x6f, 0xf2, 0x19, 0x2f, 0x3b, 0x0b, 0xf8, 0xe0, 0x63, 0x05, 0x7b, 0xc1,
+    0x9e, 0xf0, 0xf9, 0xdc, 0xd8, 0x19, 0x38, 0x07, 0xc6, 0xda, 0xd8, 0xd5, 0xb9, 0x1f, 0xbb, 0x48,
+    0xe7, 0xd4, 0x91, 0xc9, 0xb8, 0x5c, 0x2c, 0x90, 0xdf, 0xbe, 0xd0, 0xa2, 0x7c, 0x5e, 0xdb, 0x37,
+    0xed, 0xac, 0x09, 0xa1, 0x98, 0xcb, 0x16, 0x47, 0x5d, 0xcb, 0x35, 0xe1, 0x6a, 0xa4, 0x5c, 0x5b,
+    0x77, 0x75, 0x20, 0x3e, 0x4d, 0x2d, 0xaa, 0x52, 0x6f, 0xde, 0x7a, 0x1f, 0x44, 0xda, 0x01, 0x81,
+    0x9c, 0x3e, 0xe9, 0x3b, 0xe3, 0x3c, 0x44, 0x32, 0x6d, 0x11, 0x71, 0x8e, 0xca, 0xac, 0xe7, 0xcc,
+    0x37, 0x9d, 0x0d, 0x41, 0xd0, 0x29, 0xd7, 0xf0, 0x08, 0xae, 0x5e, 0x69, 0x5c, 0x74, 0xeb, 0xfc,
+    0xc3, 0x65, 0x2f, 0xf4, 0x4b, 0x75, 0xf6, 0xbb, 0x3b, 0xba, 0x61, 0x6f, 0xf2, 0x79, 0xff, 0x61,
+    0x2e, 0x81, 0x6e, 0x77, 0x1e, 0x50, 0xc5, 0x57, 0xaf, 0x7e, 0x81, 0x28, 0x5f, 0xa6, 0xf6, 0xca,
+    0xdf, 0x7c, 0x2e, 0xa4, 0xf1, 0x34, 0x82, 0x1d, 0x3c, 0x14, 0xb2, 0x31, 0x00, 0x8a, 0xef, 0xb2,
+    0x53, 0xbe, 0x2a, 0x17, 0xaa, 0xac, 0x6a, 0x59, 0x19, 0x60, 0x47, 0x3f, 0x2c, 0x00, 0x97, 0x80,
+    0xf8, 0x28, 0x6f, 0x05, 0x4a, 0x40, 0xef, 0x9f, 0x48, 0x69, 0xa8, 0xc9, 0xaa, 0x65, 0xcb, 0x07,
+    0x2a, 0x17, 0x17, 0x40, 0xa3, 0x9b, 0x90, 0xd9, 0xf2, 0x97, 0x17, 0xeb, 0x15, 0xeb, 0x32, 0xc2,
+    0x65, 0x65, 0x78, 0x5a, 0x78, 0x9f, 0xb5, 0xc9, 0x66, 0x96, 0x23, 0xa0, 0x8a, 0xd2, 0xb8, 0xcc,
+    0xc5, 0x2c, 0x51, 0xd8, 0x27, 0x45, 0x8e, 0x4c, 0xd2, 0x2c, 0x06, 0x39, 0xf7, 0xc8, 0x59, 0x48,
+    0x70, 0x0d, 0x64, 0x6b, 0x50, 0xd6, 0x87, 0x96, 0xfb, 0xca, 0x45, 0x19, 0xec, 0xa6, 0x3d, 0xa2,
+    0x54, 0x6f, 0x38, 0x5f, 0xde, 0xe3, 0xb9, 0x9d, 0x92, 0x5e, 0x90, 0xc7, 0x97, 0xfd, 0x56, 0x88,
+    0x5c, 0xa4, 0x31, 0x15, 0xd9, 0xa6, 0x53, 0xc5, 0xe4, 0x91, 0xfe, 0xed, 0x3c, 0x94, 0xd8, 0xee,
+    0xf1, 0x12, 0xfc, 0x96, 0xb1, 0x5b, 0x69, 0xe1, 0xab, 0xe7, 0x01, 0xdf, 0x20, 0xc1, 0xc6, 0xe1,
+    0x53, 0x8b, 0xc5, 0x6f, 0x66, 0x97, 0xf2, 0x8e, 0x91, 0x20, 0x5b, 0x2f, 0x77, 0xe7, 0x74, 0xa7,
+    0xf8, 0xcf, 0xdc, 0x99, 0x48, 0x1b, 0xf6, 0x06, 0x20, 0xb5, 0x28, 0xd2, 0x83, 0x49, 0xd7, 0xc4,
+    0xc4, 0xa8, 0xeb, 0x2f, 0x90, 0x0d, 0xf5, 0x97, 0xf1, 0xf8, 0x2d, 0xe7, 0x9a, 0x02, 0x29, 0x92,
+    0x89, 0xbd, 0xbc, 0xbd, 0xe0, 0xbf, 0x67, 0xc6, 0x19, 0x71, 0xfa, 0xbf, 0xbb, 0xcd, 0x9c, 0x68,
+    0xdb, 0x7a, 0xb7, 0x21, 0x6f, 0xaa, 0x4a, 0x26, 0x27, 0xab, 0xe8, 0x4c, 0x1a, 0x9b, 0x15, 0xc7,
+    0x15, 0x54, 0x7c, 0xc6, 0xd0, 0xee, 0x5e, 0x04, 0x4b, 0x7c, 0x7e, 0xe2, 0x22, 0xb9, 0x1a, 0x8d,
+    0x1d, 0xe4, 0xd7, 0xb9, 0x31, 0x59, 0xf8, 0xbe, 0x27, 0x66, 0x3d, 0x9d, 0x5a, 0x99, 0xcf, 0x38,
+    0x00, 0x95, 0x25, 0xbb, 0x4c, 0x72, 0x97, 0x89, 0xf4, 0x15, 0x70, 0xad, 0xf8, 0xc7, 0xb0, 0x0d,
+    0x75, 0x6f, 0x55, 0x6b, 0xfc, 0x88, 0xa5, 0xaf, 0xdc, 0x79, 0xd2, 0xe5, 0x4c, 0x7c, 0xce, 0x87,
+    0x69, 0xe8, 0xc8, 0x21, 0x87, 0xb5, 0x30, 0x0e, 0xcb, 0xe2, 0xb2, 0x6b, 0xe4, 0x59, 0x0c, 0x11,
+    0x5b, 0x0c, 0x63, 0x85, 0xf8, 0xb9, 0x02, 0xa1, 0x4c, 0x14, 0x98, 0x08, 0xce, 0x1f, 0x6a, 0x5e,
+    0x5c, 0x99, 0xa2, 0x07, 0x5b, 0xe4, 0x6e, 0xa5, 0x95, 0xda, 0xa3, 0x03, 0x3d, 0x46, 0x25, 0x03,
+    0x9c, 0xff, 0xb2, 0xb7, 0x5d, 0x45, 0xa2, 0xa6, 0xfa, 0x25, 0x5e, 0x9a, 0xd0, 0x85, 0xe4, 0x08,
+    0xa7, 0x18, 0xa8, 0xc8, 0xcb, 0x7c, 0x81, 0xfe, 0x98, 0x50, 0xe1, 0xd4, 0x46, 0xcb, 0x96, 0x41,
+    0x19, 0xc4, 0x47, 0xbe, 0x78, 0x2b, 0xb3, 0x5f, 0x69, 0xa8, 0xf7, 0xf6, 0xb2, 0x00, 0x06, 0x02,
+    0x54, 0x7a, 0x44, 0xad, 0xa4, 0x45, 0x45, 0x30, 0x13, 0x9f, 0x43, 0x0c, 0x89, 0xeb, 0xda, 0x5a,
+    0x41, 0x41, 0x8f, 0x17, 0x06, 0xe7, 0xbc, 0xd1, 0x8b, 0x7d, 0xbe, 0xd5, 0x0d, 0x17, 0x15, 0x72,
+    0xd5, 0x23, 0xdc, 0x5a, 0x8c, 0x1b, 0xfa, 0x0f, 0x15, 0x4a, 0x97, 0x71, 0x6c, 0x1d, 0xdf, 0xcd,
+    0xdc, 0xa9, 0x72, 0x88, 0x2e, 0x0f, 0x42, 0x8e, 0xdc, 0xb7, 0x75, 0xaa, 0xe2, 0x10, 0xfb, 0x46,
+    0x04, 0x00, 0xab, 0x41, 0x28, 0x2c, 0xf6, 0x60, 0x09, 0xc0, 0x5a, 0x41, 0xf3, 0x9c, 0xee, 0xf4,
+    0x0c, 0xe1, 0x69, 0xd0, 0xb5, 0xde, 0x61, 0xd2, 0x5f, 0x3c, 0x5a, 0x13, 0xeb, 0x5c, 0x8d, 0x1e,
+    0xc7, 0x82, 0x50, 0xf5, 0x15, 0x18, 0x0a, 0xa6, 0x17, 0x89, 0x5f, 0x8f, 0xc3, 0x32, 0x74, 0xd2,
+    0x69, 0xe6, 0xd0, 0xd9, 0x55, 0x35, 0xbf, 0xf1, 0x3c, 0xc4, 0x0b, 0x33, 0xa8, 0xbd, 0x45, 0x3f,
+    0x46, 0x6c, 0xe1, 0x74, 0xab, 0x20, 0x04, 0xf4, 0x1f, 0x96, 0x7f, 0x5e, 0xce, 0x68, 0x74, 0x56,
+    0xec, 0xc1, 0x52, 0xad, 0x63, 0x92, 0xb8, 0x5a, 0x4d, 0x77, 0xe0, 0x91, 0xf6, 0x29, 0x19, 0x3e,
+    0x07, 0x91, 0x99, 0xcb, 0xb0, 0xa0, 0xe6, 0x59, 0x12, 0xca, 0x5e, 0x7e, 0xd4, 0xb6, 0xb1, 0xcc,
+    0x38, 0xfe, 0x87, 0xd5, 0xd4, 0x3f, 0x41, 0x3a, 0xab, 0x91, 0x45, 0xd0, 0xc1, 0x9c, 0xfe, 0xba,
+    0xe1, 0xd4, 0x3a, 0x0b, 0xf4, 0x5f, 0xf9, 0x6e, 0x35, 0x1f, 0x54, 0xe2, 0xed, 0x61, 0x63, 0xe5,
+    0xe2, 0x94, 0xc7, 0x6b, 0x50, 0x77, 0x0e, 0x1b, 0xec, 0xf7, 0xa2, 0xd6, 0xf8, 0x0a, 0x3d, 0x83,
+    0x91, 0x1c, 0x30, 0x9e, 0x5f, 0xf5, 0x21, 0x7e, 0xbd, 0x99, 0xf7, 0x57, 0x7d, 0xae, 0xdc, 0xee,
+    0x85, 0xfc, 0xbe, 0xbf, 0x72, 0xcd, 0xa5, 0x06, 0x3f, 0x65, 0x45, 0x3e, 0x14, 0xa8, 0x04, 0xe1,
+    0xff, 0x89, 0x66, 0x67, 0xcf, 0x1c, 0xab, 0x31, 0xd7, 0x47, 0x2d, 0xfb, 0x75, 0x41, 0x2c, 0x85,
+    0x0a, 0x4b, 0xfa, 0x57, 0xa7, 0x39, 0x72, 0x34, 0xbd, 0x98, 0x8c, 0x52, 0xae, 0x63, 0xaf, 0x14,
+    0x3a, 0x4a, 0x7d, 0x08, 0xdc, 0xa5, 0x45, 0x93, 0xf7, 0xc0, 0x03, 0x59, 0x79, 0xe7, 0xe9, 0x69,
+    0xb0, 0x8f, 0x1d, 0x93, 0xb5, 0xfe, 0x73, 0x48, 0x53, 0x94, 0x9a, 0xcc, 0x55, 0xd8, 0x30, 0x2c,
+    0x0e, 0x97, 0xc4, 0xd6, 0x95, 0x2b, 0x1c, 0xf3, 0xf2, 0xa8, 0x5c, 0x9b, 0xfa, 0xbb, 0xfc, 0x4b,
+    0x1c, 0xd7, 0xc8, 0xdd, 0x2f, 0x98, 0x1c, 0xa9, 0xe0, 0xc9, 0x4f, 0x57, 0xe9, 0x39, 0x81, 0x42,
+    0x53, 0xc1, 0x9d, 0xe3, 0x36, 0x25, 0xd5, 0x1c, 0x7b, 0x30, 0x42, 0x50, 0x88, 0x51, 0x4c, 0x53,
+    0x53, 0xac, 0x48, 0x86, 0x46, 0x2b, 0x00, 0x80, 0x2d, 0x7c, 0xe4, 0x95, 0xfb, 0x69, 0xdc, 0x75,
+    0x1e, 0x2f, 0x44, 0x8f, 0xf8, 0x77, 0x8a, 0xde, 0x1e, 0xea, 0x44, 0x7d, 0xd7, 0xba, 0x3a, 0xf1,
+    0x39, 0xfc, 0x76, 0x71, 0x69, 0x07, 0x8c, 0x2a, 0x14, 0xa5, 0xcb, 0xa9, 0x15, 0x97, 0x14, 0x5a,
+    0x2b, 0x87, 0x05, 0xe0, 0x69, 0xc0, 0xbe, 0x6a, 0xdc, 0x7b, 0x01, 0x31, 0xe3, 0x4e, 0x08, 0x20,
+    0x51, 0xb1, 0xf6, 0x5b, 0x97, 0x6f, 0x9c, 0xfd, 0x94, 0x96, 0x1e, 0xf9, 0x31, 0xd4, 0x84, 0x93,
+    0xc2, 0xa5, 0xe1, 0xa3, 0x41, 0xda, 0xd2, 0x1e, 0x89, 0x21, 0x4a, 0xb7, 0x87, 0xc9, 0xb0, 0x50,
+    0xd0, 0xbf, 0x74, 0x8e, 0xea, 0x71, 0x2d, 0x9c, 0xbf, 0x5c, 0xf1, 0xf7, 0x9e, 0x15, 0xb5, 0x03,
+    0x58, 0xbc, 0x11, 0x58, 0x6d, 0xf4, 0xc6, 0xb8, 0x77, 0x90, 0xde, 0xc3, 0x57, 0xc8, 0xbe, 0x27,
+    0x6e, 0xb7, 0x07, 0x6c, 0x25, 0xda, 0x5b, 0xfa, 0xc6, 0xc2, 0x6a, 0x69, 0xea, 0x7d, 0x42, 0x90,
+    0x33, 0x85, 0x19, 0x84, 0x7c, 0x79, 0x19, 0x3c, 0x09, 0xb8, 0xd4, 0x7e, 0x1f, 0x2c, 0x33, 0x4a,
+    0x8a, 0xdc, 0x0d, 0x2d, 0xbd, 0xe2, 0x79, 0xf8, 0x66, 0x22, 0xd1, 0xa7, 0x64, 0xe3, 0x6a, 0x60,
+    0xc6, 0xd6, 0xa4, 0x81, 0x6b, 0x4e, 0xa9, 0xce, 0x93, 0xa7, 0xc2, 0xa2, 0x75, 0x29, 0x92, 0xa4,
+    0xa2, 0xc7, 0x0d, 0x02, 0x80, 0xfa, 0xef, 0x31, 0x09, 0xc9, 0xc5, 0x7a, 0x8b, 0xdb, 0x78, 0x73,
+    0xdc, 0xe7, 0x66, 0x69, 0xa1, 0x73, 0xe5, 0x3b, 0x80, 0x5a, 0xa7, 0x33, 0x3f, 0x18, 0x56, 0x75,
+    0x62, 0x2a, 0x23, 0x2a, 0x46, 0x35, 0xc7, 0x1a, 0x25, 0x90, 0x3c, 0xc4, 0x29, 0x71, 0x3a, 0x36,
+    0xa0, 0x8c, 0x91, 0x96, 0x4e, 0x81, 0x8b, 0x6a, 0x7d, 0x46, 0xab, 0x0f, 0xf5, 0x5e, 0x6c, 0x88,
+    0x70, 0xe6, 0xec, 0xe7, 0xdf, 0xfd, 0xc4, 0xd0, 0x36, 0x3a, 0x5d, 0x6d, 0x94, 0xaf, 0x31, 0xe4,
+    0x4b, 0xdc, 0xf4, 0x9f, 0x81, 0x3c, 0x7b, 0x50, 0x67, 0xbb, 0x23, 0x15, 0x22, 0x23, 0xda, 0x12,
+    0xf6, 0x16, 0xdd, 0xa8, 0x39, 0x02, 0x69, 0x26, 0x9e, 0x8d, 0x2c, 0xe9, 0x97, 0x14, 0x10, 0x7b,
+    0x3b, 0x59, 0x86, 0x6c, 0xa5, 0x4e, 0x59, 0x80, 0x61, 0xd6, 0xec, 0xca, 0xe8, 0xa3, 0x75, 0xa7,
+    0x50, 0x3a, 0x57, 0x26, 0xee, 0xe5, 0x97, 0x1c, 0x49, 0x25, 0xb5, 0x0b, 0xa3, 0x49, 0x1f, 0xa4,
+    0x57, 0x56, 0xac, 0xc4, 0x32, 0xc4, 0xd0, 0x2c, 0x43, 0x22, 0xbe, 0x89, 0x6a, 0x01, 0x6c, 0x04,
+    0x5a, 0xd5, 0x5a, 0x53, 0x49, 0xa2, 0x83, 0x62, 0x29, 0x2f, 0xd6, 0x97, 0x88, 0x74, 0x0c, 0x90,
+    0x13, 0x72, 0x61, 0x61, 0x39, 0x9b, 0xd3, 0x43, 0x36, 0xd2, 0x30, 0x06, 0x17, 0xbf, 0xa2, 0x02,
+    0x89, 0x70, 0x3a, 0x6e, 0x86, 0x9d, 0xdc, 0x18, 0xec, 0x75, 0x64, 0xd0, 0xe4, 0xba, 0xaf, 0xce,
+    0xb4, 0xe1, 0x55, 0x31, 0x84, 0x9f, 0xdd, 0x82, 0x32, 0xd6, 0xa2, 0x7a, 0xa2, 0x38, 0x49, 0x8b,
+    0x50, 0x3d, 0x8f, 0xea, 0x53, 0x0c, 0xc6, 0x19, 0xf2, 0xc9, 0x28, 0xcf, 0xd9, 0x07, 0x0f, 0x7f,
+    0xd7, 0xae, 0xd5, 0x3d, 0x8c, 0xe3, 0x8c, 0x41, 0x79, 0x71, 0x39, 0x59, 0x8e, 0x3a, 0xa5, 0x42,
+    0xa3, 0x3c, 0xf2, 0xc7, 0x66, 0x1f, 0xe7, 0x4c, 0xb8, 0x65, 0x0e, 0x39, 0x48, 0xab, 0xe4, 0x35,
+    0x68, 0x56, 0xe1, 0xbd, 0xec, 0xac, 0x9b, 0xfc, 0xad, 0x3b, 0x23, 0xac, 0xc0, 0x65, 0xdd, 0x92,
+    0x5e, 0x8c, 0x06, 0xfb, 0x02, 0xd7, 0xd9, 0xc0, 0xb8, 0xdb, 0x59, 0x2e, 0x6b, 0xa1, 0x15, 0x69,
+    0xbe, 0x9f, 0x55, 0x7d, 0x31, 0x7f, 0xd2, 0xdb, 0xd7, 0xd6, 0x94, 0x37, 0xb3, 0xf6, 0x65, 0x79,
+    0xe0, 0xe4, 0x7f, 0x75, 0x1c, 0x01, 0xd8, 0x66, 0xa2, 0x65, 0x2f, 0x35, 0x84, 0x3b, 0xff, 0x4c,
+    0x01, 0x57, 0xc3, 0xce, 0x08, 0x6e, 0x9f, 0x5d, 0xa6, 0x29, 0x4d, 0x2c, 0xc0, 0x2c, 0xbd, 0xcd,
+    0xa7, 0x2c, 0x7d, 0x70, 0xcb, 0x4e, 0x31, 0x0f, 0x88, 0x7b, 0x83, 0x87, 0xaa, 0x4b, 0xce, 0xe2,
+    0x9e, 0xa3, 0x76, 0x9e, 0x74, 0x61, 0x77, 0xf5, 0x28, 0xfa, 0x1c, 0x06, 0x60, 0x6b, 0xe4, 0xa4,
+    0x47, 0x8c, 0x90, 0x2d, 0x6d, 0xa9, 0x20, 0x8d, 0xc1, 0xa1, 0x3d, 0x66, 0x81, 0xa3, 0x9c, 0x8d,
+    0x01, 0x70, 0x0a, 0xa1, 0x1b, 0xb7, 0xdf, 0xff, 0x52, 0x0e, 0xfd, 0xc2, 0x36, 0x22, 0x5a, 0xcf,
+    0x6e, 0xbb, 0xab, 0x3c, 0x0e, 0x41, 0x55, 0x8b, 0x6b, 0x4b, 0x44, 0x12, 0xb7, 0x9a, 0x8e, 0xed,
+    0x63, 0x2e, 0xe4, 0x1b, 0x09, 0xc1, 0x8d, 0x9b, 0x68, 0x0d, 0x9d, 0x8d, 0xad, 0x75, 0x98, 0x8b,
+    0x3d, 0xc4, 0xf6, 0xf5, 0x36, 0x08, 0xb9, 0xa8, 0x51, 0x0e, 0x82, 0x8b, 0x47, 0x4f, 0x6d, 0xef,
+    0xdc, 0x83, 0xae, 0x7d, 0x92, 0x3e, 0x20, 0x4b, 0x07, 0x83, 0x42, 0xca, 0x24, 0x47, 0x5e, 0x44,
+    0x94, 0x30, 0x42, 0xc8, 0x5a, 0x48, 0x42, 0xbc, 0xe2, 0x70, 0xbf, 0x67, 0x71, 0xe2, 0x76, 0xf8,
+    0x3f, 0x1f, 0xcb, 0x09, 0xc4, 0x7d, 0x13, 0x28, 0xa9, 0x87, 0x94, 0x01, 0xf0, 0x3f, 0x6c, 0x62,
+    0xb4, 0x73, 0x12, 0xbe, 0x6e, 0x9b, 0x48, 0x9b, 0xc2, 0x01, 0x07, 0xda, 0x8b, 0xbe, 0x0b, 0xc1,
+    0x08, 0xb6, 0xf2, 0x0e, 0x43, 0x61, 0x1a, 0xa7, 0x80, 0xce, 0x53, 0x74, 0x04, 0x0e, 0xa8, 0xf4,
+    0xbd, 0x08, 0x7b, 0x89, 0x04, 0x24, 0x26, 0xb5, 0x8c, 0x55, 0xfc, 0xd1, 0xce, 0xc8, 0xcc, 0xed,
+    0x56, 0x37, 0xbe, 0xdc, 0x3f, 0xfb, 0x48, 0x1c, 0x1e, 0x5d, 0x86, 0x43, 0xb7, 0x30, 0x80, 0x55,
+    0xa7, 0x8a, 0x94, 0xe0, 0x40, 0x66, 0x24, 0xda, 0x14, 0xd6, 0x1e, 0x0c, 0x96, 0x0c, 0x89, 0x39,
+    0x23, 0x2e, 0x54, 0x7b, 0xe8, 0x9f, 0x34, 0xaa, 0x46, 0x98, 0xe6, 0xa3, 0x18, 0x24, 0x79, 0xa3,
+    0x6f, 0x03, 0x08, 0x8e, 0xb0, 0xa6, 0xc8, 0xa6, 0xd2, 0xb0, 0xd0, 0x00, 0x38, 0xaa, 0x9b, 0xeb,
+    0x58, 0x8d, 0x95, 0x8e, 0x98, 0x6b, 0xd7, 0x5e, 0xf7, 0xb8, 0x4c, 0x56, 0x70, 0x52, 0x82, 0xcf,
+    0x83, 0x75, 0x51, 0xd3, 0xd1, 0xf4, 0x71, 0xf9, 0x2e, 0xf2, 0x37, 0x3b, 0xb0, 0xd5, 0x50, 0x15,
+    0xeb, 0xb7, 0x8e, 0xe9, 0xe7, 0xf7, 0xda, 0xa9, 0xdc, 0xe9, 0x3a, 0x21, 0x5b, 0xc2, 0x2c, 0x7a,
+    0x47, 0xcf, 0x9d, 0x77, 0xd4, 0x4b, 0x1c, 0x06, 0xdc, 0xfb, 0xb7, 0xe6, 0xf2, 0xac, 0xe4, 0x4f,
+    0x93, 0x36, 0x4b, 0x7a, 0xd2, 0x44, 0x43, 0x8f, 0xab, 0x2f, 0xdf, 0xa6, 0x1b, 0xe9, 0x7a, 0x48,
+    0x9a, 0x33, 0xe4, 0x69, 0xbb, 0x33, 0xba, 0x59, 0xdc, 0x37, 0xd5, 0xe2, 0xca, 0x31, 0x2d, 0x1b,
+    0x5c, 0x33, 0x53, 0xfe, 0xe7, 0xea, 0xdc, 0x8e, 0xf7, 0xec, 0x43, 0xe0, 0x5d, 0x6b, 0x03, 0xb5,
+    0xd8, 0xc0, 0x57, 0x30, 0x32, 0x75, 0x2c, 0x4b, 0xb0, 0x53, 0xc3, 0x59, 0xbd, 0x81, 0x15, 0x6c,
+    0x55, 0x7b, 0x48, 0x88, 0x64, 0x3a, 0xc2, 0xbe, 0x49, 0x77, 0x4b, 0xc0, 0x5c, 0x76, 0x32, 0x72,
+    0x23, 0xee, 0xf5, 0x2f, 0xa5, 0x9b, 0x68, 0x0e, 0x16, 0x86, 0x44, 0x23, 0x43, 0x24, 0xb2, 0xd1,
+    0xf6, 0x1b, 0x11, 0x28, 0x81, 0xe7, 0x71, 0x91, 0xa8, 0x84, 0x5b, 0xda, 0x2e, 0x8d, 0xb7, 0xd1,
+    0x74, 0x1d, 0x92, 0x60, 0xf3, 0xcb, 0x1f, 0xad, 0xef, 0xce, 0x5e, 0xd4, 0xfb, 0x3f, 0x79, 0x71,
+    0x51, 0x31, 0x97, 0x45, 0x85, 0x2a, 0x39, 0xe8, 0x38, 0x98, 0xe5, 0x44, 0xfe, 0xb2, 0xf6, 0xb9,
+    0xc0, 0x2a, 0xa0, 0x48, 0xc1, 0xd5, 0x7c, 0xd9, 0x84, 0xa6, 0x80, 0x4e, 0x64, 0x57, 0x6f, 0x2c,
+    0x43, 0x7c, 0x70, 0x0c, 0x75, 0x16, 0x37, 0x20, 0x1f, 0x63, 0xcd, 0x96, 0xab, 0xaa, 0x19, 0xef,
+    0x54, 0x7d, 0x80, 0x49, 0x11, 0xea, 0x31, 0xf2, 0xf9, 0x5b, 0xf3, 0x03, 0x33, 0xf9, 0x45, 0xf4,
+    0x1b, 0x95, 0xa9, 0x24, 0x6f, 0x74, 0x41, 0x0d, 0x53, 0x06, 0x53, 0x07, 0xd4, 0x72, 0x85, 0xc1,
+    0x90, 0xa7, 0xf9, 0x7e, 0xd8, 0xee, 0x01, 0x1a, 0x11, 0xdf, 0x04, 0xba, 0xc6, 0x18, 0xf5, 0xcc,
+    0x11, 0xd0, 0x2b, 0xda, 0x27, 0x47, 0x54, 0x28, 0xa5, 0xf0, 0x8d, 0x3c, 0x84, 0x13, 0xb8, 0x3e,
+    0x78, 0x27, 0xf2, 0xd8, 0x9c, 0xae, 0x3c, 0x93, 0x51, 0x07, 0x1c, 0x25, 0xb1, 0x17, 0x27, 0xa3,
+    0xb5, 0xdd, 0x39, 0x12, 0xd6, 0x8b, 0xdb, 0x7a, 0x78, 0xf1, 0x58, 0x3e, 0xf9, 0x32, 0x02, 0x2c,
+    0x1b, 0x66, 0xa6, 0xdf, 0x01, 0xf5, 0x4e, 0x4b, 0xc4, 0x94, 0x94, 0x0a, 0x0c, 0xf9, 0xf1, 0x8b,
+    0x8c, 0x7b, 0x63, 0x3d, 0x12, 0x18, 0xef, 0xcf, 0x44, 0x35, 0x39, 0xbc, 0x7e, 0x95, 0xcb, 0x18,
+    0x20, 0xce, 0x79, 0x29, 0x6d, 0x27, 0xe0, 0xb2, 0xdc, 0x82, 0x7e, 0x19, 0x9d, 0x10, 0xbd, 0xa8,
+    0x19, 0x87, 0xed, 0x71, 0x79, 0x22, 0xa2, 0x8d, 0xba, 0x32, 0x8c, 0x42, 0x4d, 0xcc, 0x0f, 0xfd,
+    0x4a, 0xfb, 0xa8, 0x95, 0xf7, 0x85, 0x4b, 0xdf, 0x54, 0x28, 0xaa, 0x9b, 0x45, 0x3e, 0x18, 0xba,
+    0xa9, 0x31, 0xa9, 0x33, 0xd3, 0xc0, 0xd7, 0x3d, 0x3e, 0xe7, 0x32, 0x93, 0x8e, 0x30, 0xe3, 0x54,
+    0xec, 0x3a, 0x9d, 0xd3, 0xd9, 0x6e, 0x72, 0xfd, 0x5d, 0xed, 0x13, 0xec, 0x65, 0x27, 0xc2, 0xeb,
+    0xd3, 0x32, 0x8c, 0x6b, 0x70, 0x21, 0xf8, 0x6d, 0xfb, 0x36, 0x15, 0xe5, 0x1e, 0x10, 0x0b, 0x58,
+    0x30, 0xd0, 0x5d, 0x69, 0xdc, 0x13, 0xe2, 0x26, 0x6b, 0x63, 0x3c, 0x07, 0xfe, 0x84, 0xa2, 0x3a,
+    0x29, 0xa5, 0x51, 0xcb, 0xca, 0xd4, 0xb3, 0xf5, 0x36, 0x22, 0xd7, 0x54, 0x7c, 0x49, 0xe7, 0x7b,
+    0xb6, 0x93, 0xae, 0xa8, 0x5c, 0x4c, 0x82, 0x3c, 0xb7, 0x5c, 0xb8, 0x52, 0xa2, 0x02, 0x1f, 0x06,
+    0x83, 0xdb, 0xaf, 0x66, 0x2b, 0xa9, 0x99, 0x09, 0x0c, 0x07, 0x90, 0xd4, 0xa4, 0x6c, 0x03, 0xd8,
+    0xe3, 0xa8, 0x05, 0xb4, 0x93, 0xe4, 0x37, 0x96, 0x0d, 0xb0, 0xee, 0xcb, 0x5b, 0x1f, 0x61, 0x49,
+    0x5e, 0xcb, 0x6b, 0xa7, 0xbc, 0xfc, 0x36, 0x79, 0x44, 0x3b, 0xca, 0x8a, 0xe1, 0x65, 0xee, 0xd4,
+    0x06, 0xbe, 0xab, 0xb9, 0x14, 0xe1, 0x0f, 0x55, 0xfe, 0x14, 0x69, 0x84, 0x13, 0x67, 0x0b, 0x25,
+    0x3a, 0xe4, 0x08, 0x58, 0x85, 0xae, 0x8e, 0xf1, 0xa2, 0x1c, 0x9e, 0x41, 0x7f, 0x33, 0x96, 0x99,
+    0x32, 0x8e, 0xd0, 0x40, 0x0f, 0x9a, 0x52, 0xf7, 0xe6, 0x0d, 0x78, 0xfb, 0x5d, 0x28, 0x40, 0xbb,
+    0x69, 0x05, 0x92, 0x2e, 0x88, 0x3e, 0xbc, 0xd1, 0xe1, 0x7d, 0xac, 0x99, 0x27, 0x06, 0xc7, 0x29,
+    0x77, 0xd0, 0x18, 0x1e, 0x3a, 0xe8, 0x52, 0xd8, 0x10, 0x54, 0x0d, 0x9e, 0xb2, 0x0d, 0x0f, 0x5f,
+    0xda, 0xb5, 0x69, 0x6a, 0xcd, 0xf1, 0x24, 0x91, 0xac, 0x08, 0x89, 0x9a, 0x70, 0x0d, 0xc4, 0xc4,
+    0xc6, 0x35, 0x3d, 0xb2, 0x0d, 0x7b, 0xe0, 0x1d, 0xd4, 0xec, 0x3b, 0xf1, 0x80, 0x55, 0x93, 0xba,
+    0xb4, 0x7c, 0xe5, 0x42, 0xd3, 0x8b, 0x07, 0x04, 0xcb, 0x72, 0x23, 0xc9, 0xb4, 0x91, 0xb2, 0xea,
+    0x8e, 0x0d, 0x35, 0x48, 0xc7, 0xfb, 0xe6, 0xde, 0x7a, 0x66, 0x0d, 0xec, 0x01, 0x78, 0x98, 0x18,
+    0xda, 0x79, 0xb0, 0x35, 0xc5, 0x6f, 0x71, 0x16, 0x3c, 0x08, 0x4f, 0x9e, 0x77, 0x43, 0x3f, 0x02,
+    0x40, 0x17, 0xed, 0x2b, 0x8d, 0xdc, 0xb7, 0xef, 0x5d, 0x84, 0x92, 0x6c, 0xc2, 0xdd, 0xff, 0x9f,
+    0xbc, 0x60, 0x8c, 0xf4, 0xce, 0x82, 0xb1, 0xd4, 0xbb, 0x2e, 0xd1, 0x68, 0xb5, 0xc4, 0xda, 0x67,
+    0x49, 0x36, 0xf8, 0xcf, 0x84, 0xf3, 0x3d, 0x71, 0x42, 0x52, 0x58, 0x27, 0x5e, 0x71, 0xe5, 0x1c,
+    0x51, 0x2a, 0x3a, 0x2c, 0x53, 0x55, 0xc2, 0x35, 0x62, 0x0b, 0x75, 0x36, 0xaa, 0xad, 0xd9, 0x26,
+    0x02, 0x7f, 0x9c, 0xe3, 0xf8, 0xc6, 0x31, 0x9b, 0x80, 0xaa, 0x88, 0x8e, 0xeb, 0x7c, 0xc2, 0x43,
+    0x3a, 0x31, 0x4c, 0x37, 0x32, 0x5e, 0x6d, 0x3c, 0x16, 0x28, 0xbe, 0xe1, 0x24, 0xd3, 0x63, 0x51,
+    0x57, 0x17, 0x82, 0x11, 0xb2, 0x1c, 0xbd, 0x32, 0x60, 0x86, 0x8a, 0x97, 0xf6, 0xd8, 0x34, 0x17,
+    0xd6, 0x6a, 0x8b, 0xa2, 0x77, 0x26, 0x45, 0xc1, 0xc0, 0x92, 0xea, 0x23, 0x3c, 0x84, 0x62, 0x2d,
+    0x31, 0xbd, 0x37, 0xb4, 0x92, 0x06, 0xf7, 0x97, 0x46, 0x92, 0x07, 0xfc, 0xae, 0xaf, 0x60, 0x27,
+    0x32, 0xd0, 0xcb, 0x77, 0x93, 0x58, 0xc5, 0xf5, 0xc5, 0x7e, 0xe3, 0x1e, 0x8a, 0x89, 0x5a, 0xa8,
+    0x2f, 0x89, 0xe9, 0xd0, 0x04, 0x05, 0xa5, 0xe9, 0x94, 0xd4, 0xfb, 0x05, 0x07, 0x2d, 0xab, 0xea,
+    0x31, 0x53, 0x12, 0x4a, 0xe1, 0x72, 0x7f, 0xa3, 0x65, 0xe6, 0x9b, 0xa5, 0x6a, 0xdb, 0x7d, 0x1b,
+    0x26, 0x39, 0xa3, 0xc3, 0xa0, 0x68, 0xfb, 0xa1, 0x89, 0xe6, 0x93, 0x5a, 0x97, 0x30, 0x6f, 0x42,
+    0xbe, 0x0c, 0x44, 0x73, 0x74, 0x07, 0x43, 0x45, 0xb4, 0xd9, 0xeb, 0x23, 0xe3, 0x1e, 0xa0, 0xbb,
+    0xfc, 0x93, 0xbf, 0x95, 0x2c, 0xa3, 0xde, 0x01, 0xe6, 0x58, 0x9c, 0xf2, 0xac, 0xe2, 0x3d, 0x43,
+    0xc5, 0x45, 0x5d, 0x47, 0xdf, 0x62, 0x63, 0xd1, 0x30, 0x09, 0x16, 0x8f, 0xb3, 0xe4, 0x2a, 0xf9,
+    0x31, 0xe6, 0x63, 0xe5, 0xa8, 0x88, 0x75, 0xe8, 0x23, 0x27, 0xf3, 0xb5, 0x64, 0x57, 0x65, 0xf2,
+    0xc0, 0xaa, 0x8c, 0x87, 0x33, 0x03, 0x67, 0xb1, 0xfb, 0xac, 0x1f, 0xdd, 0x41, 0xf1, 0x07, 0x01,
+    0x44, 0x08, 0x09, 0x38, 0x8f, 0x6c, 0xaf, 0x1b, 0x95, 0x08, 0xfb, 0x1a, 0xa5, 0x1b, 0x05, 0x35,
+    0x0c, 0xa9, 0xa6, 0x2a, 0x9b, 0xd3, 0x87, 0x3f, 0x16, 0xf6, 0x88, 0x22, 0xf4, 0x6f, 0x5d, 0xb8,
+    0xfd, 0x63, 0x91, 0x25, 0x7a, 0x97, 0xc7, 0xe4, 0x0f, 0xde, 0xa7, 0x08, 0xe7, 0x9e, 0xda, 0xef,
+    0xd1, 0x00, 0x99, 0x2b, 0xe0, 0x76, 0xfc, 0x1e, 0xe4, 0x2a, 0xa8, 0xba, 0x76, 0x9d, 0xf0, 0xe9,
+    0x20, 0xa4, 0x98, 0x0b, 0x86, 0x96, 0xa8, 0xa7, 0x72, 0x84, 0x7a, 0xe0, 0xd6, 0xa5, 0xaf, 0x57,
+    0xaf, 0xc8, 0x51, 0x12, 0xee, 0x8c, 0xca, 0x20, 0x3a, 0x82, 0x5b, 0x7c, 0xf3, 0x43, 0x90, 0x8a,
+    0x73, 0xe5, 0xf4, 0x80, 0x8e, 0x91, 0x3a, 0x88, 0xdc, 0x92, 0xfd, 0x13, 0x07, 0xff, 0xc4, 0x35,
+    0xa7, 0x7e, 0x4e, 0x03, 0xb3, 0x7a, 0x69, 0xd2, 0x44, 0xee, 0x1c, 0x38, 0xc1, 0xc4, 0xec, 0x25,
+    0x0f, 0x9b, 0x09, 0xd2, 0x69, 0x24, 0xdb, 0x75, 0x53, 0x8e, 0x79, 0x64, 0xd1, 0x18, 0xa0, 0x51,
+    0x50, 0x4f, 0x8b, 0xf2, 0xa5, 0x63, 0x71, 0x19, 0xd6, 0x98, 0x9e, 0x81, 0xe4, 0x9b, 0x52, 0xdb,
+    0x9e, 0x17, 0x87, 0x3c, 0x26, 0xc1, 0xc0, 0xbf, 0x37, 0x2d, 0x1b, 0x06, 0x3d, 0xb5, 0xb7, 0x26,
+    0x7e, 0x00, 0xf9, 0xdc, 0x66, 0x0d, 0xb3, 0xf9, 0x8f, 0x87, 0x0c, 0x70, 0xec, 0x2d, 0xe1, 0xaa,
+    0x82, 0x06, 0x0c, 0xd4, 0x88, 0x9f, 0xd1, 0x57, 0x3d, 0x34, 0x08, 0x31, 0x0f, 0x14, 0xc8, 0x55,
+    0xff, 0x20, 0xb9, 0xf0, 0xaa, 0x48, 0x1f, 0x8c, 0x2d, 0x16, 0xfe, 0x03, 0x77, 0x5c, 0x39, 0x5d,
+    0xf5, 0x3d, 0x25, 0xac, 0x09, 0x4f, 0x97, 0x4d, 0x2c, 0x30, 0x5c, 0x01, 0x19, 0xb9, 0x88, 0x65,
+    0x2c, 0x28, 0x04, 0xc4, 0x1b, 0xbf, 0xe8, 0x28, 0xd5, 0x2a, 0xc3, 0x31, 0x6e, 0xc2, 0xf4, 0xa8,
+    0x56, 0x23, 0x10, 0x0c, 0x96, 0xa1, 0x17, 0xe1, 0xe2, 0x93, 0xbf, 0x48, 0x84, 0xbb, 0xe9, 0x43,
+    0x58, 0x56, 0x0d, 0x31, 0xff, 0x64, 0x8d, 0x73, 0x39, 0xbb, 0xc1, 0x53, 0x61, 0xb5, 0xee, 0x70,
+    0x9a, 0x0f, 0xba, 0xc5, 0xfd, 0x4f, 0x6f, 0x85, 0x56, 0xd6, 0x38, 0x6e, 0xff, 0xeb, 0xd2, 0x41,
+    0x15, 0x5f, 0x02, 0xde, 0xa5, 0x7b, 0x4f, 0x56, 0xad, 0x17, 0x07, 0xe0, 0xcb, 0x31, 0x96, 0x67,
+    0x3d, 0xc0, 0x44, 0x81, 0x7b, 0xf5, 0x50, 0xa8, 0x8d, 0xfc, 0x82, 0xe4, 0xb0, 0x4c, 0x90, 0x9a,
+    0x75, 0x3e, 0xed, 0xd4, 0x43, 0x7e, 0xca, 0xc3, 0xe7, 0x4d, 0x32, 0xef, 0x44, 0x8b, 0x5b, 0x5b,
+    0xa7, 0x36, 0xda, 0xe5, 0xc2, 0x74, 0x25, 0xa9, 0x41, 0xd3, 0x9e, 0xac, 0x03, 0x90, 0x6f, 0xf6,
+    0x84, 0xd9, 0x80, 0xa7, 0x75, 0x4b, 0x61, 0x91, 0xbc, 0x26, 0x84, 0xd0, 0xe1, 0x72, 0x68, 0x20,
+    0x78, 0xa0, 0x21, 0x8b, 0x92, 0x92, 0x67, 0x43, 0x93, 0x5b, 0xa3, 0x1d, 0x64, 0x71, 0x66, 0xca,
+    0x9b, 0x85, 0x62, 0xd4, 0x4f, 0x42, 0x66, 0x75, 0x01, 0xb8, 0xd0, 0x7f, 0x64, 0x42, 0x96, 0x9d,
+    0x63, 0x04, 0x2d, 0x7a, 0x69, 0x2f, 0x1b, 0x17, 0x99, 0xfb, 0x3b, 0x24, 0xf9, 0xec, 0x64, 0x5b,
+    0x66, 0x54, 0xd8, 0xbb, 0x97, 0xf3, 0x37, 0x5c, 0x9a, 0x2c, 0xe7, 0x72, 0xa4, 0x93, 0x5c, 0xbb,
+    0x11, 0x82, 0x06, 0xe2, 0xdf, 0x9c, 0x02, 0x9d, 0xea, 0x2f, 0x8b, 0xc7, 0x4e, 0x15, 0xbb, 0x15,
+    0xd9, 0x14, 0x51, 0x49, 0x69, 0xdf, 0x03, 0xdd, 0x09, 0xca, 0x0b, 0x67, 0x39, 0x57, 0xa4, 0x0b,
+    0xde, 0xba, 0x76, 0xf9, 0xac, 0x72, 0x93, 0x59, 0xd7, 0x41, 0xeb, 0x98, 0xbe, 0x82, 0x27, 0x14,
+    0x11, 0xae, 0x29, 0x46, 0x02, 0xb1, 0x4f, 0xa7, 0x3c, 0x6f, 0x4e, 0xd9, 0xcc, 0x2d, 0x53, 0xa8,
+    0x98, 0x5c, 0xde, 0xd1, 0x09, 0x76, 0x87, 0xb9, 0xf6, 0xa0, 0x55, 0x78, 0xb0, 0xf0, 0x5d, 0x0c,
+    0x88, 0x63, 0xa1, 0x6d, 0x66, 0xda, 0x75, 0xbe, 0x46, 0x24, 0x7c, 0x2c, 0x4a, 0x41, 0x8f, 0xbb,
+    0x2f, 0xdd, 0xe1, 0x98, 0xc4, 0x27, 0xea, 0xeb, 0x4b, 0x54, 0x28, 0xc6, 0x6d, 0x9a, 0xa6, 0xdd,
+    0xec, 0x3f, 0xa6, 0xe7, 0xb5, 0xf6, 0xa1, 0xf7, 0xea, 0x0f, 0xf3, 0xff, 0x50, 0x2b, 0x72, 0xda,
+    0x19, 0x53, 0x01, 0xa1, 0x72, 0x97, 0x34, 0x38, 0x69, 0xae, 0x59, 0x12, 0xfe, 0x6f, 0xe1, 0xd4,
+    0xa2, 0x5f, 0x04, 0x70, 0xaf, 0xe0, 0x12, 0xfd, 0xc8, 0x64, 0xae, 0xcd, 0x28, 0xbe, 0xf2, 0x37,
+    0x13, 0xfc, 0xe1, 0xb9, 0x7e, 0xda, 0x00, 0xf4, 0x07, 0xdc, 0x6f, 0x4d, 0xd4, 0xa2, 0x9a, 0xc6,
+    0xdd, 0xa9, 0xe5, 0xe6, 0xc9, 0x4d, 0x84, 0xa8, 0x88, 0xbe, 0xc0, 0x2c, 0xe0, 0x07, 0x1a, 0xe2,
+    0xba, 0xdb, 0xf5, 0x90, 0x07, 0x6e, 0xe2, 0x51, 0xa4, 0x11, 0x58, 0xaf, 0x88, 0x5e, 0xbf, 0x72,
+    0x2a, 0x5d, 0xa2, 0x8d, 0x41, 0xd9, 0xed, 0xae, 0x69, 0xcc, 0xee, 0x8f, 0x6e, 0x66, 0xa8, 0x49,
+    0x2d, 0x5c, 0x0f, 0xbf, 0x77, 0x05, 0x24, 0x96, 0x93, 0xdf, 0xcd, 0xbb, 0x2c, 0x8b, 0x6d, 0x9e,
+    0x09, 0xa0, 0xbe, 0xf4, 0x5f, 0x11, 0x6d, 0x89, 0xcd, 0x41, 0x25, 0x60, 0x22, 0x7c, 0x86, 0x83,
+    0x4a, 0x19, 0x60, 0xd9, 0x92, 0xdc, 0x38, 0x06, 0x41, 0xc3, 0x3a, 0x82, 0x5a, 0x79, 0x66, 0x2c,
+    0xa1, 0x4b, 0xf2, 0x48, 0xfe, 0x8e, 0xc0, 0x5a, 0x2b, 0xce, 0x18, 0x3e, 0x80, 0xda, 0x80, 0xb8,
+    0x69, 0xcf, 0x1d, 0xe9, 0x2f, 0x01, 0xad, 0xe0, 0xed, 0xc9, 0x8c, 0xe9, 0xd4, 0xe7, 0x83, 0xfd,
+    0x86, 0xcf, 0x2c, 0x8d, 0xcf, 0xb0, 0x7e, 0x76, 0xd4, 0x4e, 0x22, 0x56, 0xd6, 0xb1, 0xaf, 0xf0,
+    0x9e, 0xd1, 0xb0, 0x00, 0x6a, 0x93, 0x86, 0x98, 0x5a, 0x1b, 0x3c, 0x7d, 0xc1, 0x86, 0x38, 0x55,
+    0x81, 0x25, 0x71, 0x6f, 0x24, 0x77, 0x31, 0x4c, 0x0d, 0xdf, 0xd2, 0x3c, 0x4b, 0x8d, 0xf8, 0x10,
+    0xc7, 0xd9, 0x6d, 0x9a, 0x8d, 0x16, 0x9b, 0x74, 0x86, 0x1d, 0xc8, 0xd0, 0x10, 0x7f, 0x2b, 0x6e,
+    0xa4, 0x2c, 0xc6, 0xb0, 0x4f, 0xa2, 0x2e, 0xdc, 0x59, 0x09, 0x70, 0x90, 0x98, 0xe2, 0xd6, 0x11,
+    0x43, 0x35, 0x5f, 0xd2, 0x72, 0xe9, 0x7d, 0x9a, 0x23, 0x3c, 0x68, 0x5f, 0xe1, 0x13, 0xfb, 0xcf,
+    0x77, 0xea, 0x99, 0xbe, 0xbb, 0x67, 0x32, 0x3e, 0x06, 0xe4, 0x35, 0x10, 0x67, 0x3a, 0x85, 0xb5,
+    0x1c, 0x20, 0xc2, 0x25, 0x7b, 0x36, 0x18, 0x32, 0x6b, 0xbd, 0xdf, 0x76, 0x74, 0x9b, 0x70, 0xa0,
+    0xf9, 0x77, 0x85, 0xbb, 0x11, 0xc1, 0x2c, 0x36, 0x52, 0x73, 0xc2, 0xd4, 0x6e, 0xb0, 0x43, 0x91,
+    0x2f, 0x3c, 0xcc, 0x7c, 0x62, 0x9a, 0xc8, 0x28, 0x82, 0x8b, 0x7c, 0x08, 0x25, 0xbc, 0x98, 0x88,
+    0xa8, 0x3e, 0xcb, 0x0b, 0x5f, 0xc3, 0xdb, 0x0a, 0xfc, 0x17, 0xf2, 0xb2, 0xff, 0x34, 0xc7, 0xf6,
+    0x69, 0x38, 0x15, 0xc6, 0xb2, 0x99, 0x67, 0xbd, 0x02, 0xbd, 0x9d, 0xc3, 0x97, 0xe1, 0x28, 0x6d,
+    0x5b, 0x37, 0xcb, 0xde, 0xe0, 0x82, 0x5d, 0x6a, 0x0f, 0x44, 0x5c, 0x28, 0x36, 0xc6, 0xc9, 0x8c,
+    0xd3, 0xbf, 0xe9, 0x22, 0xdc, 0x66, 0x8b, 0xea, 0x8e, 0x26, 0x9b, 0xac, 0x73, 0xf0, 0x65, 0x81,
+    0x77, 0x2f, 0xb2, 0xc9, 0xd9, 0xc7, 0x0d, 0x00, 0x5f, 0x06, 0x48, 0x77, 0x53, 0x6a, 0x30, 0x8e,
+    0x88, 0x83, 0xb7, 0x36, 0xae, 0x9d, 0x06, 0x70, 0xd6, 0xa2, 0x35, 0xf7, 0x7c, 0x57, 0x03, 0xc4,
+    0xc9, 0x73, 0xc4, 0xeb, 0x76, 0xc9, 0xd1, 0x68, 0xf1, 0xe3, 0xe4, 0x03, 0xb3, 0xdc, 0x85, 0xa7,
+    0x31, 0x5a, 0xf0, 0xdc, 0x30, 0x7e, 0x2b, 0x54, 0x1b, 0x5a, 0xe5, 0x53, 0x90, 0xd8, 0x1c, 0xad,
+    0x52, 0x31, 0xd5, 0x4d, 0xfc, 0x20, 0x88, 0xbf, 0x2f, 0xd1, 0x37, 0x9a, 0x1a, 0x5f, 0x46, 0x24,
+    0x50, 0xc8, 0xfa, 0x0c, 0xff, 0x0c, 0x19, 0x2c, 0x65, 0xe9, 0x6a, 0xfd, 0xe5, 0xa8, 0x28, 0x56,
+    0x88, 0x1e, 0x60, 0xa2, 0xcf, 0x38, 0xfd, 0xb9, 0xfa, 0x68, 0xa7, 0x16, 0xfd, 0xa4, 0x60, 0x92,
+    0xd3, 0x64, 0x33, 0xe9, 0xb6, 0xaf, 0x0e, 0xb1, 0x22, 0xa4, 0x7e, 0x0e, 0x7a, 0x4a, 0xa3, 0x1d,
+    0x97, 0x9b, 0x18, 0x98, 0x03, 0x99, 0x4b, 0xbf, 0xeb, 0x71, 0xfd, 0x5d, 0x1a, 0x71, 0xd7, 0x6b,
+    0xf2, 0xe7, 0x23, 0x96, 0x64, 0x18, 0x81, 0x34, 0xf3, 0x2c, 0x6c, 0xc7, 0xe9, 0x9f, 0x06, 0xff,
+    0x7d, 0x0c, 0x16, 0x59, 0x86, 0x9d, 0xb3, 0x29, 0x7c, 0x7a, 0xe1, 0x7b, 0xf8, 0xc3, 0x97, 0x4d,
+    0x64, 0xaf, 0x8f, 0x55, 0x84, 0xc1, 0xce, 0xcb, 0xaa, 0xd2, 0x6c, 0x67, 0x27, 0x0c, 0x6d, 0x66,
+    0xf3, 0x94, 0x55, 0xef, 0xbe, 0x7f, 0x73, 0x4a, 0x1f, 0x3d, 0x10, 0x4c, 0x56, 0x41, 0x0e, 0xc7,
+    0xb4, 0x76, 0x62, 0x84, 0xec, 0x0b, 0x84, 0x70, 0x32, 0x00, 0x18, 0xde, 0xb5, 0x64, 0xaf, 0x11,
+    0x91, 0x5b, 0x58, 0xa0, 0x1e, 0x82, 0x8a, 0x3d, 0x85, 0x80, 0x12, 0xbb, 0x99, 0x51, 0xb1, 0x5c,
+    0xad, 0xf0, 0xa6, 0x4d, 0xc4, 0xc9, 0x6c, 0xb2, 0x28, 0x99, 0xc0, 0xb4, 0xbd, 0x6c, 0x50, 0x81,
+    0xe7, 0x3e, 0x37, 0xef, 0x80, 0xa8, 0xd4, 0x57, 0xa5, 0x7c, 0xf1, 0xaf, 0xbe, 0x55, 0xc9, 0x50,
+    0x5b, 0xc6, 0xab, 0x44, 0x13, 0xde, 0xd5, 0xec, 0x6c, 0x2b, 0x4f, 0xb5, 0x48, 0x93, 0x4f, 0x8e,
+    0x73, 0x72, 0x1a, 0xca, 0x6f, 0x92, 0xd8, 0xdd, 0xdb, 0x9f, 0x39, 0x9d, 0x76, 0x94, 0xbb, 0x74,
+    0xbc, 0xf6, 0x0e, 0x0d, 0x37, 0x74, 0x35, 0x66, 0x76, 0xa1, 0x2f, 0x62, 0x7c, 0x33, 0x11, 0xe5,
+    0x24, 0x09, 0xf6, 0xab, 0xd5, 0x5b, 0x00, 0x46, 0x83, 0x6b, 0x0d, 0x48, 0x96, 0x56, 0xc9, 0xd4,
+    0x58, 0xab, 0x88, 0xba, 0x3a, 0xd5, 0x2a, 0xfd, 0x1b, 0xe6, 0xde, 0x19, 0x55, 0xfd, 0x74, 0x54,
+    0x41, 0x6f, 0xc6, 0x0c, 0x15, 0x2f, 0x17, 0x1e, 0x3c, 0x74, 0x14, 0x1d, 0xd2, 0x63, 0x24, 0x7e,
+    0x12, 0x8e, 0xd1, 0x55, 0x56, 0x04, 0x8c, 0xdb, 0x8c, 0xbd, 0x49, 0x02, 0xf5, 0x00, 0x26, 0xc5,
+    0x52, 0x6f, 0x69, 0x70, 0x47, 0xd9, 0x43, 0x5e, 0x2c, 0xf2, 0x85, 0x6d, 0xf8, 0x1f, 0xb9, 0x57,
+    0x4a, 0x1a, 0x69, 0xd6, 0x34, 0x47, 0xae, 0x3b, 0x77, 0xe3, 0x57, 0xa7, 0xe3, 0x5e, 0x06, 0x40,
+    0x12, 0x88, 0x94, 0xa5, 0x75, 0x8e, 0xb3, 0xde, 0x21, 0x2f, 0xef, 0xfb, 0x47, 0x73, 0xb9, 0x0f,
+    0x81, 0xfa, 0x1a, 0x5a, 0xfc, 0x7a, 0xe5, 0x21, 0x3f, 0xaa, 0x60, 0x73, 0x96, 0x6b, 0xa6, 0x08,
+    0x0d, 0xce, 0xfd, 0x40, 0x74, 0x84, 0x4e, 0x52, 0x12, 0x11, 0xd1, 0xee, 0xf9, 0x0a, 0xa4, 0x5e,
+    0x95, 0x5e, 0x1b, 0xee, 0x2b, 0xb4, 0xbe, 0xa1, 0xe5, 0x3b, 0xe1, 0x5d, 0x32, 0xbb, 0x6c, 0x1d,
+    0xc1, 0xdd, 0x44, 0x6b, 0x98, 0x0f, 0xd7, 0x60, 0xdc, 0xce, 0x3f, 0xbf, 0x4a, 0x6d, 0x12, 0xea,
+    0x87, 0x98, 0xcc, 0xb8, 0x73, 0x6f, 0x15, 0xe6, 0x2d, 0x3c, 0x23, 0x58, 0x20, 0x02, 0x13, 0xa9,
+    0xa1, 0x01, 0xb7, 0xcc, 0xf1, 0xc5, 0x53, 0x62, 0x76, 0x5d, 0xbb, 0x8b, 0x2a, 0xf1, 0xb7, 0xde,
+    0x96, 0xd3, 0x63, 0x15, 0xee, 0xe9, 0x0f, 0xfe, 0xdf, 0x2b, 0xb6, 0xc9, 0x81, 0x30, 0x0c, 0x83,
+    0x59, 0x10, 0x45, 0x17, 0x63, 0xd1, 0x19, 0xd9, 0xd2, 0x13, 0xa1, 0xd9, 0x3a, 0x61, 0x94, 0xb0,
+    0x1c, 0x15, 0x3a, 0xbe, 0xb3, 0x57, 0x14, 0xb3, 0x2b, 0x29, 0xd6, 0x85, 0x73, 0x43, 0x17, 0x36,
+    0x83, 0xf0, 0x51, 0xbb, 0x95, 0xae, 0x9a, 0xaa, 0x10, 0xb5, 0x43, 0x14, 0x33, 0xed, 0x51, 0x08,
+    0xd2, 0x6c, 0x3b, 0x07, 0xca, 0xaa, 0xa0, 0x37, 0xbe, 0xee, 0x08, 0xee, 0x00, 0xf3, 0xb0, 0x24,
+    0xda, 0xb0, 0x70, 0xb6, 0xb3, 0x83, 0x7e, 0xee, 0x11, 0xc6, 0x9b, 0x54, 0xb5, 0x99, 0xb0, 0xc9,
+    0x4e, 0x6e, 0x59, 0xf1, 0xa6, 0x34, 0x6b, 0x3b, 0x42, 0x5f, 0x37, 0x12, 0x25, 0x7b, 0x7d, 0x57,
+    0x01, 0x80, 0xa5, 0x32, 0x19, 0x78, 0x9c, 0x1c, 0xa9, 0xdf, 0xe7, 0xaa, 0xe1, 0xdd, 0xeb, 0x51,
+    0x4a, 0xc7, 0x1f, 0x5d, 0x2f, 0x20, 0x64, 0x59, 0x61, 0x05, 0x8d, 0x79, 0xe0, 0x04, 0xcf, 0xf0,
+    0x77, 0x6d, 0x94, 0xae, 0x98, 0x0f, 0xbc, 0x9a, 0x88, 0x9a, 0xf0, 0x88, 0x0d, 0x38, 0xae, 0x5e,
+    0x0b, 0xa1, 0xe5, 0x15, 0x36, 0x1f, 0xd2, 0xd4, 0x1e, 0xa4, 0x07, 0x80, 0xf3, 0xae, 0x3a, 0x86,
+    0xb6, 0x7b, 0x38, 0x23, 0xf1, 0x17, 0x79, 0x4d, 0x82, 0xc9, 0x8f, 0xb0, 0x6e, 0x30, 0x2a, 0xa3,
+    0x6b, 0x0a, 0xa5, 0xb4, 0x3b, 0xbe, 0x02, 0xe9, 0x63, 0x73, 0x9e, 0xee, 0xef, 0x2d, 0x93, 0x61,
+    0xf5, 0x11, 0x30, 0x9b, 0xd9, 0x78, 0x14, 0x6c, 0xe3, 0xe5, 0x62, 0x25, 0x69, 0xfd, 0xbd, 0xbd,
+    0x94, 0x18, 0xe4, 0x79, 0x7a, 0x5a, 0x3e, 0xd6, 0x8b, 0xb3, 0xe0, 0x03, 0x32, 0x69, 0x16, 0x6b,
+    0x35, 0xc0, 0xf1, 0x7e, 0xde, 0x2f, 0x53, 0x19, 0x7d, 0x02, 0x94, 0xd6, 0xe4, 0x1f, 0xc4, 0xfb,
+    0x75, 0x6d, 0x7b, 0x6b, 0xd8, 0xa5, 0x51, 0x05, 0x7a, 0x73, 0x3c, 0x0d, 0x22, 0x72, 0xc6, 0x92,
+    0x7d, 0x6b, 0xca, 0xd2, 0x4d, 0x04, 0x8c, 0x36, 0x1a, 0x8d, 0x5e, 0x40, 0x6c, 0x47, 0xc3, 0x07,
+    0x83, 0xe9, 0x5d, 0x34, 0x7a, 0xc9, 0x80, 0xed, 0xfb, 0x7c, 0xd4, 0x80, 0xeb, 0xa4, 0x14, 0xdb,
+    0xcc, 0x10, 0x7d, 0x31, 0xb6, 0x5e, 0xb7, 0xcc, 0xb4, 0xf3, 0xa5, 0x9e, 0x69, 0x09, 0x8f, 0x8e,
+    0xce, 0x28, 0xf7, 0xbc, 0x04, 0x1d, 0x9b, 0x7c, 0x59, 0x2b, 0x05, 0x38, 0xfd, 0x4e, 0x38, 0xe7,
+    0x45, 0x5e, 0x01, 0x04, 0x90, 0x5b, 0x38, 0xa8, 0x8f, 0x6b, 0x74, 0x88, 0xfb, 0xe8, 0x96, 0x0c,
+    0x94, 0x98, 0x47, 0x1a, 0x48, 0xfa, 0xbe, 0xbe, 0x47, 0xa6, 0x31, 0x62, 0x15, 0x66, 0x57, 0x28,
+    0x58, 0x79, 0x8c, 0xee, 0xf0, 0xb6, 0x84, 0x25, 0x93, 0xa0, 0x95, 0x90, 0x0d, 0x68, 0xba, 0x35,
+    0x7c, 0x4b, 0x94, 0x55, 0x4d, 0x29, 0x5a, 0x10, 0x1f, 0xc0, 0xe2, 0x8e, 0x0e, 0x8f, 0xcb, 0xe4,
+    0x15, 0x96, 0x3d, 0xc9, 0x17, 0xb8, 0xab, 0x3c, 0xaa, 0xc8, 0x86, 0x63, 0x0c, 0x3d, 0x1f, 0xf1,
+    0xc8, 0x1d, 0x15, 0x30, 0xbd, 0xce, 0x93, 0x4a, 0x8a, 0x99, 0x19, 0x71, 0xb6, 0x42, 0xa1, 0xe1,
+    0x4c, 0xfe, 0xf1, 0xa1, 0xac, 0x82, 0xc5, 0x25, 0x06, 0xd1, 0x2f, 0x2e, 0x69, 0xa8, 0xaf, 0x3e,
+    0x71, 0x72, 0x7a, 0x97, 0x68, 0xcd, 0xef, 0x22, 0x57, 0x2c, 0xb5, 0xd9, 0xfb, 0x43, 0xde, 0xdc,
+    0xac, 0xdd, 0x99, 0x1b, 0xb8, 0x6e, 0xfd, 0xe5, 0x24, 0x58, 0xe2, 0xca, 0x4a, 0xc0, 0xdf, 0x9a,
+    0xbd, 0x21, 0x18, 0xe9, 0xf2, 0x24, 0xba, 0xd8, 0x54, 0xd1, 0x68, 0x15, 0x9a, 0xad, 0x70, 0x20,
+    0x7b, 0xac, 0x86, 0xcf, 0x92, 0x38, 0xca, 0x49, 0xba, 0xb4, 0xc2, 0x48, 0x57, 0xca, 0xe4, 0xf3,
+    0xcb, 0xda, 0x0c, 0xf2, 0xa9, 0x53, 0x4a, 0x24, 0xa2, 0xe2, 0xe6, 0x90, 0xeb, 0x05, 0x81, 0x88,
+    0x13, 0xb7, 0xb5, 0x6a, 0x07, 0x68, 0xcd, 0x3f, 0xf9, 0xa0, 0x8d, 0x46, 0x0a, 0x89, 0x28, 0xd7,
+    0xb7, 0xc8, 0xaa, 0xd4, 0x55, 0x68, 0x35, 0x3d, 0x71, 0xd8, 0x91, 0xdd, 0xa3, 0x3e, 0x80, 0x6c,
+    0x87, 0xaa, 0x86, 0x40, 0x4b, 0xd4, 0xe2, 0x05, 0xad, 0xb2, 0xa1, 0x4b, 0x37, 0xe9, 0xc1, 0x1e,
+    0x0d, 0x89, 0xce, 0x00, 0x17, 0x3b, 0x8f, 0xb3, 0x67, 0x3d, 0xf6, 0xa9, 0x18, 0x7c, 0xce, 0x00,
+    0x25, 0x2b, 0xcd, 0xfc, 0x5e, 0x18, 0x69, 0x10, 0x0d, 0x4d, 0x3f, 0x1f, 0xa6, 0xc9, 0x02, 0xae,
+    0xb6, 0xcc, 0x6e, 0x96, 0x7a, 0xb0, 0xb8, 0xba, 0x2c, 0xd3, 0x08, 0x3e, 0xb4, 0x3c, 0x5d, 0xde,
+    0xed, 0x9e, 0x42, 0x63, 0x28, 0x49, 0xa3, 0x8f, 0xc0, 0xd7, 0xd8, 0x5d, 0xf4, 0x7c, 0xc4, 0x95,
+    0xc7, 0xcd, 0x5c, 0x24, 0xd4, 0x50, 0x70, 0x11, 0x40, 0x06, 0x60, 0x2b, 0xa9, 0x3b, 0x4a, 0x9e,
+    0xa6, 0xa8, 0xcf, 0x4e, 0x93, 0x3d, 0xf5, 0xe0, 0xe2, 0x07, 0xa7, 0xc3, 0x93, 0x74, 0x76, 0xaf,
+    0x38, 0x84, 0x86, 0x75, 0x5e, 0x2c, 0xba, 0x28, 0x58, 0x4f, 0xc5, 0xaa, 0x76, 0xf4, 0x3a, 0x1f,
+    0x1a, 0x76, 0xcb, 0xf1, 0x09, 0x06, 0x89, 0x2f, 0x8b, 0xea, 0xfd, 0x32, 0x7b, 0x1c, 0x2c, 0x16,
+    0x18, 0x02, 0xd6, 0x2c, 0xe1, 0xb1, 0xc4, 0x73, 0x10, 0xac, 0x6f, 0xce, 0xee, 0x3d, 0xa1, 0xe8,
+    0x5e, 0x32, 0x9f, 0x94, 0x34, 0xbb, 0x27, 0x8a, 0x94, 0x16, 0x28, 0x08, 0x25, 0x32, 0x8a, 0x40,
+    0x8d, 0xd1, 0x5a, 0x4f, 0x3e, 0xe3, 0x98, 0xb0, 0x46, 0xd7, 0xfb, 0xbe, 0x0f, 0x5e, 0x4d, 0x61,
+    0xf9, 0x46, 0xf5, 0xbe, 0x87, 0x2c, 0xb9, 0xe6, 0x1d, 0xd3, 0xcd, 0x1b, 0x26, 0xba, 0xc9, 0x69,
+    0x4b, 0xcc, 0x5b, 0xb2, 0x6c, 0x0d, 0x42, 0x86, 0x28, 0x2a, 0x01, 0x54, 0xf9, 0xd1, 0x62, 0x64,
+    0x0d, 0xee, 0x9c, 0xbe, 0x25, 0x7d, 0xfc, 0x40, 0x64, 0x8a, 0xaf, 0x60, 0x32, 0xfb, 0xf3, 0x75,
+    0xd4, 0xa3, 0xe2, 0xa8, 0x15, 0xae, 0x07, 0x19, 0x37, 0xbd, 0x81, 0x60, 0x11, 0x0f, 0x57, 0xdc,
+    0x57, 0xda, 0x86, 0xbd, 0xeb, 0x1b, 0xac, 0x46, 0x7d, 0xf7, 0xed, 0xc2, 0xed, 0xc2, 0x3e, 0xe0,
+    0xb8, 0xf7, 0x46, 0x73, 0x20, 0x20, 0x3e, 0x07, 0xb6, 0x98, 0x41, 0x65, 0x49, 0x08, 0x71, 0xfc,
+    0xd2, 0xd7, 0x84, 0x38, 0xae, 0x4d, 0x6d, 0x57, 0x58, 0x36, 0x32, 0x41, 0x3e, 0x7a, 0x91, 0x49,
+    0x6b, 0x7e, 0x9e, 0x60, 0xcd, 0xd4, 0x86, 0xb9, 0xbd, 0x16, 0x5c, 0x10, 0xcd, 0x97, 0xf6, 0x0f,
+    0xc4, 0x78, 0x03, 0x96, 0x5b, 0x68, 0x4c, 0x05, 0x3c, 0x0b, 0x8b, 0x20, 0x3f, 0x01, 0xf8, 0x5b,
+    0x34, 0xaf, 0x1d, 0x53, 0x8f, 0xad, 0xb6, 0x3d, 0xd8, 0x05, 0x43, 0x70, 0xbb, 0xd7, 0x47, 0x97,
+    0x34, 0x14, 0x6e, 0x15, 0x95, 0x74, 0x68, 0x1d, 0x6a, 0xb3, 0x6c, 0xf8, 0xd5, 0x14, 0x99, 0xa0,
+    0x80, 0xd9, 0xe8, 0xe0, 0xec, 0x76, 0xc6, 0x32, 0x18, 0xee, 0xf3, 0x78, 0x56, 0x41, 0xd7, 0x03,
+    0xe5, 0x02, 0xb4, 0x23, 0x08, 0x38, 0x59, 0xe5, 0xf7, 0xd7, 0x01, 0x86, 0x76, 0x98, 0xd9, 0x0d,
+    0x57, 0xc9, 0x97, 0x2a, 0x70, 0xf4, 0x74, 0xd7, 0x2a, 0xd6, 0x1e, 0xb7, 0xae, 0xe7, 0xec, 0x3b,
+    0x4d, 0x43, 0x4e, 0x33, 0xc9, 0x3c, 0x19, 0xe2, 0x24, 0x22, 0x23, 0xb2, 0xa0, 0xa4, 0x20, 0xa5,
+    0x0a, 0x14, 0x2c, 0xce, 0xea, 0x95, 0x03, 0x69, 0xaf, 0xf8, 0x36, 0x04, 0xbe, 0xc2, 0x21, 0x10,
+    0x11, 0x05, 0x13, 0x3e, 0xff, 0x9d, 0x54, 0x0c, 0x3e, 0x79, 0x6b, 0xe7, 0xce, 0xc5, 0x6a, 0xce,
+    0x28, 0x63, 0xb0, 0x95, 0xa4, 0x3b, 0x2f, 0xab, 0xa6, 0x0c, 0xef, 0xc3, 0x0f, 0x17, 0xe0, 0x1b,
+    0x35, 0x2f, 0x61, 0xdd, 0x78, 0xb2, 0xc9, 0x4d, 0x74, 0x6d, 0x16, 0xe2, 0x0c, 0xdc, 0x5c, 0x4c,
+    0xb1, 0x36, 0xc2, 0xc1, 0x5c, 0x6b, 0x44, 0xda, 0x47, 0xa6, 0x07, 0x78, 0x23, 0x9f, 0x6a, 0x55,
+    0x07, 0xc2, 0x34, 0xf9, 0xa0, 0x71, 0x44, 0x51, 0xd0, 0x34, 0x38, 0xd2, 0x21, 0x3e, 0x2f, 0xed,
+    0x8c, 0x7e, 0x33, 0x50, 0xcf, 0x03, 0x7c, 0x8e, 0xce, 0xa6, 0x20, 0xfc, 0xcf, 0x85, 0x95, 0xfe,
+    0x54, 0xed, 0xd0, 0xd1, 0x69, 0xb4, 0x82, 0xd5, 0x74, 0x2a, 0xfa, 0xcd, 0xd5, 0x37, 0x45, 0xe6,
+    0xb6, 0x2c, 0x5e, 0x23, 0x1d, 0x69, 0x99, 0x5b, 0x7d, 0x25, 0xd2, 0x61, 0x22, 0xd1, 0xad, 0x78,
+    0x07, 0xb1, 0x3b, 0xf5, 0x8e, 0x97, 0xf3, 0x95, 0x88, 0x00, 0x4f, 0x58, 0xaf, 0x73, 0x49, 0x0c,
+    0x10, 0x5c, 0x9c, 0x89, 0x8b, 0x19, 0x31, 0x3c, 0x78, 0xe3, 0xd8, 0x05, 0x48, 0x1b, 0x1f, 0xc8,
+    0xfc, 0x59, 0xe3, 0xe2, 0x5b, 0x25, 0xc1, 0x14, 0x4a, 0x75, 0xbb, 0x5b, 0x2b, 0x21, 0xe1, 0xf0,
+    0x79, 0x12, 0x1c, 0x6d, 0x89, 0xf4, 0xb2, 0x99, 0x1b, 0x39, 0x0e, 0xf0, 0xd0, 0x2f, 0x70, 0xc1,
+    0x4f, 0xc4, 0x78, 0x5a, 0x47, 0x0b, 0x05, 0xa0, 0xb8, 0xee, 0x45, 0x52, 0xf8, 0xb1, 0x53, 0xbc,
+    0xd6, 0x8a, 0x38, 0x5b, 0xa7, 0xc8, 0x2f, 0x3d, 0x9e, 0x18, 0x49, 0xcc, 0x7e, 0x35, 0x22, 0x93,
+    0x92, 0xe7, 0xf6, 0x82, 0xdd, 0xec, 0x65, 0x05, 0x3b, 0x69, 0xa6, 0xf7, 0xa6, 0x23, 0xa1, 0x06,
+    0x84, 0x27, 0x50, 0x7a, 0x8a, 0x01, 0xc8, 0xc2, 0x23, 0x74, 0x3a, 0x2b, 0x5e, 0xe7, 0x84, 0x88,
+    0xb3, 0xf9, 0x25, 0xce, 0xe3, 0x59, 0xe9, 0x1e, 0xfc, 0x87, 0xb6, 0x07, 0xb0, 0x68, 0x18, 0x38,
+    0x6c, 0x3f, 0x33, 0x36, 0xf8, 0x6e, 0xaf, 0xb7, 0x41, 0x94, 0x26, 0xf9, 0xaf, 0x2d, 0x30, 0x6b,
+    0x43, 0x35, 0x3b, 0xd3, 0xde, 0xf3, 0xb4, 0xa4, 0x29, 0x0c, 0x86, 0x99, 0x86, 0xda, 0x76, 0xc7,
+    0xed, 0x16, 0xe6, 0xd1, 0xe1, 0x45, 0xc8, 0x40, 0x91, 0xa0, 0x8d, 0x16, 0x16, 0xdf, 0xed, 0x02,
+    0xba, 0x58, 0x91, 0xc0, 0xea, 0x51, 0x4b, 0xf6, 0x15, 0xb9, 0x17, 0xba, 0x2c, 0x12, 0x5b, 0x34,
+    0x30, 0xee, 0x87, 0x86, 0xa1, 0xff, 0xa1, 0x6c, 0xa2, 0x06, 0x65, 0x30, 0x9e, 0xa6, 0x53, 0x15,
+    0x78, 0x3f, 0x44, 0x46, 0x99, 0x79, 0xe3, 0x15, 0x45, 0x24, 0xc8, 0x62, 0xcc, 0x10, 0x31, 0x91,
+    0x34, 0xec, 0xb2, 0x8e, 0x87, 0xb2, 0x26, 0xd8, 0x91, 0x99, 0xe6, 0x4a, 0x03, 0xed, 0x9a, 0x25,
+    0x77, 0x3f, 0x9d, 0x0b, 0x53, 0xe0, 0x8c, 0x56, 0xcf, 0x29, 0x05, 0x86, 0x5b, 0x2a, 0xd0, 0xda,
+    0xb2, 0x6b, 0xaa, 0xf2, 0x93, 0x77, 0x52, 0x4c, 0xa3, 0x26, 0x73, 0x26, 0xdd, 0x8d, 0x9d, 0xf7,
+    0xaa, 0xf2, 0x1b, 0xe4, 0x33, 0x29, 0xb9, 0xca, 0x3b, 0xe4, 0x40, 0x42, 0xdb, 0x03, 0x24, 0xb3,
+    0x58, 0x1e, 0xb6, 0x5c, 0xeb, 0xb6, 0x90, 0xbd, 0x90, 0xb5, 0x44, 0x08, 0xc0, 0xf8, 0x03, 0x7a,
+    0x65, 0xc1, 0x39, 0x72, 0x8d, 0x61, 0xa0, 0xb3, 0x93, 0x47, 0x1a, 0x14, 0xd2, 0x56, 0xfd, 0xbf,
+    0x7a, 0xe7, 0xe8, 0x6c, 0x90, 0x66, 0x6d, 0x6e, 0xce, 0x69, 0x28, 0x22, 0x64, 0xe8, 0x35, 0x5f,
+    0xc1, 0xbe, 0x65, 0x73, 0x1b, 0x6b, 0x3b, 0xb5, 0xad, 0x2c, 0x2a, 0x24, 0x58, 0xbd, 0x37, 0x4d,
+    0x07, 0x2d, 0x82, 0xa0, 0xde, 0xd9, 0x38, 0x80, 0x7b, 0xb7, 0xfb, 0x38, 0x85, 0xe2, 0x73, 0x37,
+    0xd6, 0xba, 0x95, 0x8a, 0x1f, 0xe0, 0x99, 0x6e, 0x2c, 0x38, 0x9d, 0x42, 0x59, 0xb1, 0xd2, 0xb1,
+    0x23, 0x64, 0x76, 0x26, 0x10, 0x0d, 0x47, 0x45, 0xaf, 0xec, 0x7f, 0xbc, 0x82, 0xe7, 0x2a, 0xc5,
+    0x49, 0x19, 0xc4, 0xb5, 0x66, 0xad, 0x07, 0x2a, 0xc7, 0xcb, 0x95, 0xe8, 0x70, 0xfe, 0x00, 0xd0,
+    0x21, 0x00, 0xe9, 0xb0, 0x87, 0x71, 0xfa, 0x03, 0x3a, 0x1a, 0x67, 0xea, 0xa4, 0xce, 0xa6, 0x6c,
+    0xa1, 0x76, 0x1a, 0xfd, 0x2b, 0x42, 0x4f, 0x49, 0xe4, 0xdb, 0xe8, 0x97, 0xf5, 0x9c, 0x56, 0xdf,
+    0x54, 0x62, 0x64, 0x79, 0x8b, 0x25, 0xb6, 0x93, 0x41, 0x0f, 0x02, 0xee, 0x8a, 0x3e, 0x54, 0x27,
+    0xa1, 0x81, 0xde, 0x5c, 0x09, 0x97, 0x4d, 0x9f, 0xae, 0xb8, 0x8e, 0x87, 0x38, 0x29, 0x43, 0xa3,
+    0xbb, 0x5e, 0x67, 0x29, 0x19, 0x82, 0xf8, 0xa3, 0x04, 0xfa, 0x03, 0xd3, 0xbd, 0x4c, 0x2a, 0x00,
+    0x02, 0x28, 0xfb, 0x80, 0x8a, 0xd3, 0xc7, 0x02, 0xf7, 0xc6, 0x81, 0x84, 0xbb, 0x29, 0xb4, 0x92,
+    0xcb, 0xab, 0xfd, 0xfa, 0x04, 0xa3, 0x72, 0x54, 0xf5, 0xbe, 0xda, 0xce, 0xf9, 0x18, 0x1d, 0xc1,
+    0xe9, 0x7a, 0x6a, 0xb2, 0x6f, 0xef, 0x97, 0xc4, 0x65, 0x76, 0x21, 0x6c, 0x06, 0x90, 0xfd, 0xf9,
+    0x64, 0x85, 0x3f, 0xa9, 0xe2, 0xd8, 0x4f, 0x86, 0x25, 0xab, 0x28, 0xdd, 0x46, 0x44, 0xa8, 0x3e,
+    0xb5, 0x1f, 0x2c, 0x8a, 0x73, 0x3b, 0x62, 0x61, 0xce, 0x36, 0x75, 0x5e, 0xa0, 0x90, 0x07, 0x58,
+    0x6c, 0x52, 0x58, 0x34, 0xd2, 0x20, 0x57, 0x5e, 0x6f, 0x8d, 0x56, 0x77, 0xb0, 0x4a, 0x83, 0x69,
+    0xcd, 0x95, 0x30, 0x17, 0x0d, 0x5f, 0x5f, 0x5c, 0xf8, 0xa0, 0xd8, 0xb3, 0xcc, 0xa4, 0xcf, 0x66,
+    0x03, 0x95, 0x17, 0x75, 0xda, 0xeb, 0xc3, 0x1b, 0x12, 0x39, 0x28, 0x7c, 0xae, 0xcf, 0xe7, 0x19,
+    0x91, 0x98, 0x2b, 0x55, 0xcf, 0x3b, 0x4f, 0xdf, 0xfe, 0x35, 0x01, 0x4a, 0x61, 0xe8, 0x71, 0x90,
+    0x2f, 0x7b, 0x96, 0x60, 0xea, 0xb2, 0x47, 0x79, 0xe9, 0xfb, 0x8c, 0xe4, 0x4e, 0xf0, 0x7d, 0x1a,
+    0x26, 0x5c, 0x32, 0x56, 0xa5, 0xfa, 0xf0, 0x34, 0xda, 0xde, 0xe9, 0x9c, 0xfb, 0xe4, 0x0c, 0xfe,
+    0xb6, 0x64, 0x36, 0xb0, 0xff, 0x2a, 0x5e, 0xcd, 0xa1, 0x19, 0x07, 0x40, 0x6e, 0xfe, 0xb9, 0x05,
+    0x05, 0xa3, 0x42, 0x9e, 0xd0, 0x99, 0xf4, 0xaf, 0x04, 0x33, 0xa5, 0xc3, 0xc6, 0xe0, 0x0c, 0xdd,
+    0xba, 0xae, 0x94, 0xda, 0x3d, 0xc5, 0x7b, 0xbe, 0xfc, 0x85, 0x4e, 0x79, 0x7c, 0x15, 0xfc, 0xc0,
+    0x96, 0xd4, 0xf4, 0x1f, 0xd0, 0x56, 0xa4, 0x24, 0xad, 0xe3, 0x6e, 0x69, 0xf2, 0x98, 0x02, 0x76,
+    0xc1, 0x4c, 0xc9, 0x15, 0x09, 0xa8, 0x25, 0xdd, 0x19, 0x8c, 0xc5, 0x20, 0xa9, 0xf4, 0x4a, 0xfb,
+    0x24, 0x65, 0x33, 0xc7, 0x25, 0x0b, 0xeb, 0x9d, 0xc6, 0x80, 0x8e, 0x96, 0x17, 0xc9, 0xb6, 0x3d,
+    0x59, 0x47, 0x15, 0xf4, 0xc6, 0x21, 0x7c, 0x15, 0x3d, 0xab, 0x28, 0xd4, 0x42, 0xdb, 0xaa, 0xc3,
+    0x5d, 0x27, 0xe4, 0xd8, 0xc5, 0x0d, 0xd8, 0x2c, 0x9d, 0xb5, 0xa4, 0x3a, 0xaf, 0x49, 0xa9, 0x05,
+    0x1a, 0xd1, 0x97, 0x99, 0xa1, 0xe0, 0xaa, 0x32, 0x86, 0x89, 0x19, 0xc3, 0x81, 0x10, 0x74, 0x31,
+    0x0f, 0xdc, 0x67, 0xa5, 0xef, 0x60, 0x5f, 0x60, 0x4d, 0xed, 0x8f, 0x15, 0xbf, 0x85, 0x3c, 0x85,
+    0x87, 0x0d, 0xc9, 0x67, 0x13, 0xa8, 0xb6, 0x8f, 0x6c, 0x39, 0x9c, 0x32, 0x8e, 0xbc, 0x59, 0xe5,
+    0x18, 0xdf, 0x74, 0x1b, 0x91, 0x00, 0xdb, 0x2a, 0x15, 0x05, 0x65, 0xe0, 0xc5, 0x04, 0xa7, 0x82,
+    0x7c, 0x42, 0x7a, 0xca, 0x21, 0x8e, 0x47, 0xc0, 0xd1, 0x5c, 0xb7, 0x30, 0xaa, 0x2d, 0xf1, 0xe6,
+    0xa2, 0x5a, 0xa0, 0xd2, 0x93, 0x30, 0xa4, 0x29, 0x47, 0xf0, 0xae, 0x8e, 0x71, 0xac, 0x42, 0xec,
+    0x3c, 0xcc, 0x38, 0x02, 0x53, 0x1f, 0xf6, 0x87, 0x9c, 0x44, 0xad, 0x1d, 0xde, 0x73, 0x1b, 0xfa,
+    0x05, 0xd0, 0x7f, 0xff, 0xad, 0x92, 0x97, 0x9d, 0x6c, 0xc4, 0xb9, 0x98, 0xb7, 0x0a, 0x44, 0x2b,
+    0x1d, 0x58, 0xed, 0x71, 0x42, 0x69, 0xfe, 0xd0, 0xde, 0xe6, 0x04, 0x8f, 0xb3, 0x75, 0x05, 0xa4,
+    0x19, 0x19, 0xec, 0xff, 0xe0, 0xdb, 0x56, 0xab, 0x4f, 0x8f, 0xdb, 0x78, 0x43, 0x9f, 0xcb, 0xc9,
+    0xdd, 0xd5, 0x09, 0x2c, 0x48, 0x1f, 0xdf, 0x2b, 0xed, 0x73, 0xa4, 0x56, 0x78, 0x23, 0xd9, 0x2a,
+    0x0b, 0x52, 0x7b, 0xb8, 0x8c, 0x6f, 0x06, 0xcc, 0xbf, 0x7e, 0x3d, 0xf2, 0xa1, 0xd8, 0xc7, 0x38,
+    0x09, 0xf0, 0xe1, 0xea, 0x0c, 0x81, 0xb0, 0x2e, 0x7c, 0xeb, 0x38, 0x72, 0x27, 0x04, 0x50, 0x89,
+    0x6a, 0xda, 0x0c, 0xa9, 0xb1, 0xbf, 0x0c, 0x5d, 0x2c, 0x79, 0x5a, 0x94, 0x62, 0x3b, 0x9e, 0xf7,
+    0x74, 0x33, 0xb4, 0xc1, 0xca, 0x87, 0x0b, 0x17, 0x3e, 0xfa, 0xcb, 0x99, 0x0a, 0xf0, 0x01, 0xda,
+    0x30, 0x4a, 0x62, 0xa1, 0xd0, 0x6e, 0x6e, 0x07, 0xd3, 0xcb, 0x29, 0x1f, 0x40, 0xbd, 0x93, 0x74,
+    0xcb, 0x7e, 0x03, 0x78, 0xff, 0x22, 0x93, 0xd0, 0xcc, 0xfa, 0xdd, 0xc7, 0x7b, 0x76, 0x44, 0x1d,
+    0x9b, 0xe9, 0xe6, 0x51, 0x60, 0x6f, 0x45, 0x76, 0xc6, 0x04, 0xee, 0x41, 0xdc, 0xf5, 0x31, 0x56,
+    0xa1, 0x4e, 0x09, 0x6e, 0xf3, 0x37, 0x87, 0xd6, 0x43, 0x36, 0xa9, 0x49, 0x87, 0x6f, 0xf1, 0xb9,
+    0x9d, 0xa8, 0x2c, 0xc1, 0x34, 0xdd, 0x57, 0x2e, 0xb6, 0xb1, 0xc3, 0x03, 0xf7, 0xf8, 0x7d, 0xc4,
+    0xf5, 0x35, 0xff, 0xf2, 0x88, 0x62, 0x84, 0xf8, 0x9c, 0x92, 0x91, 0x0b, 0xae, 0xab, 0xdc, 0x13,
+    0x81, 0xe9, 0x9e, 0x1f, 0xc1, 0x4e, 0x4b, 0xcf, 0x07, 0x09, 0x5a, 0x88, 0x48, 0x74, 0x54, 0x78,
+    0xc9, 0xe7, 0x94, 0xbc, 0x59, 0xff, 0x84, 0x68, 0xe3, 0xc3, 0xfa, 0x24, 0x99, 0xff, 0x04, 0x65,
+    0x6c, 0xf0, 0xba, 0x63, 0x7c, 0x8b, 0xa2, 0xda, 0x33, 0x42, 0x8f, 0xa8, 0x9a, 0x64, 0xd5, 0x9e,
+    0x26, 0xf0, 0xc8, 0x34, 0x8b, 0xfa, 0x37, 0x5f, 0x06, 0x17, 0xf4, 0x0c, 0xb8, 0xa4, 0x2e, 0x52,
+    0x60, 0x7f, 0xcd, 0x76, 0x0a, 0xb4, 0xe1, 0xe6, 0xdd, 0x90, 0x26, 0xe4, 0x88, 0xd0, 0x59, 0x58,
+    0x6e, 0x95, 0x1c, 0x78, 0x6e, 0x42, 0x18, 0x9f, 0x10, 0xb3, 0x67, 0x79, 0x52, 0xad, 0xef, 0x23,
+    0x87, 0x48, 0xf1, 0xf6, 0xcd, 0x8e, 0xf7, 0x3d, 0xc8, 0xc5, 0xe1, 0x4a, 0xb3, 0x46, 0xa7, 0x28,
+    0x79, 0xc0, 0x55, 0xb6, 0x28, 0xc3, 0x93, 0x19, 0x82, 0x89, 0x10, 0x7c, 0x9f, 0x08, 0xcc, 0xa1,
+    0x3e, 0x70, 0xa1, 0xca, 0x45, 0x02, 0x69, 0xab, 0xf2, 0x7d, 0x38, 0xe0, 0xab, 0xf1, 0x5c, 0x88,
+    0xa8, 0xf0, 0xe5, 0x37, 0xec, 0x60, 0x5e, 0xae, 0x2e, 0x03, 0x24, 0xd2, 0x96, 0x66, 0xaa, 0x77,
+    0x78, 0xcf, 0x3c, 0x71, 0xba, 0x0e, 0xd8, 0x95, 0x58, 0xd8, 0xe7, 0x2d, 0x96, 0xda, 0xa8, 0x05,
+    0x93, 0xd5, 0xf2, 0xc1, 0x14, 0xfa, 0xf7, 0x0c, 0xfc, 0x3f, 0x42, 0xa1, 0xfb, 0x63, 0xb6, 0x2d,
+    0x8a, 0x6e, 0x77, 0xc1, 0xa3, 0x28, 0x06, 0x32, 0xf0, 0xe9, 0x7b, 0x47, 0x0d, 0x7a, 0xec, 0x2e,
+    0x8d, 0xe6, 0x83, 0x03, 0xde, 0x44, 0x32, 0xd6, 0xa9, 0xb6, 0xde, 0x53, 0x06, 0x0e, 0xd0, 0x69,
+    0xbf, 0x2c, 0x5a, 0xc9, 0x9d, 0xe8, 0x51, 0xea, 0x20, 0xed, 0xfb, 0xd2, 0xc2, 0x5b, 0x57, 0xf8,
+    0x7a, 0xc4, 0x31, 0xba, 0x29, 0x23, 0xcc, 0xa7, 0x4d, 0x58, 0xa3, 0x3c, 0x5e, 0x6b, 0x39, 0x54,
+    0x76, 0x32, 0x81, 0x97, 0xf3, 0x1b, 0x1c, 0x24, 0x65, 0xde, 0x8e, 0x19, 0xaa, 0x03, 0x7d, 0x80,
+    0xa2, 0xe8, 0xae, 0x74, 0x3d, 0x41, 0x2d, 0x40, 0xf1, 0x6d, 0x2c, 0xa3, 0xd4, 0x2b, 0xfd, 0x89,
+    0x8c, 0x45, 0x33, 0xb1, 0xd9, 0x87, 0xd8, 0x31, 0x1c, 0x82, 0xfc, 0x53, 0x89, 0xb1, 0x30, 0xd5,
+    0x68, 0x6e, 0x95, 0x18, 0x6b, 0x44, 0x09, 0xd9, 0xe9, 0x9f, 0x97, 0x9b, 0x60, 0xe1, 0x9d, 0x8f,
+    0x59, 0x40, 0x09, 0xbc, 0x88, 0xd2, 0xf2, 0x6a, 0xee, 0x73, 0xe2, 0xa9, 0xb9, 0x34, 0x78, 0xbf,
+    0xbd, 0xab, 0xcb, 0xbe, 0xb5, 0x58, 0x27, 0x79, 0x83, 0x12, 0xe9, 0x4e, 0x8a, 0x16, 0x3c, 0x23,
+    0xf0, 0x44, 0xc2, 0xec, 0x89, 0x2e, 0xf9, 0x27, 0x88, 0xd5, 0x6e, 0x56, 0xb3, 0x28, 0xc8, 0xa2,
+    0xdb, 0x5a, 0xfe, 0xe9, 0x52, 0xf7, 0xaa, 0xf8, 0x4c, 0xae, 0xea, 0x60, 0xe9, 0xa8, 0xa5, 0x73,
+    0x13, 0x93, 0xe9, 0x5d, 0xdd, 0x4a, 0xde, 0x6d, 0xad, 0x7e, 0x4f, 0x81, 0x4f, 0xb3, 0xbe, 0x49,
+    0x6c, 0x74, 0xf2, 0x09, 0xbf, 0x94, 0xb9, 0xbf, 0xb7, 0x87, 0xa3, 0x33, 0x2f, 0x96, 0x4a, 0x23,
+    0xa6, 0xde, 0xef, 0x33, 0x0a, 0xd4, 0x67, 0x9b, 0x7d, 0x6a, 0x8e, 0xa4, 0xe1, 0x62, 0x2c, 0xbf,
+    0x28, 0xb2, 0xc4, 0x61, 0xaf, 0x33, 0xac, 0x00, 0x8a, 0x32, 0xde, 0xda, 0xd5, 0x1b, 0x19, 0x82,
+    0x75, 0x51, 0x62, 0x2e, 0x08, 0x86, 0xae, 0x8d, 0x44, 0xf4, 0xef, 0xca, 0xc7, 0x34, 0xfe, 0x71,
+    0x17, 0x8f, 0xc0, 0x11, 0x23, 0xee, 0xf0, 0x3e, 0xb1, 0xd2, 0x2d, 0xe8, 0xa7, 0x9f, 0x09, 0x94,
+    0xbe, 0x9f, 0x35, 0x69, 0x6f, 0xac, 0x61, 0xbb, 0xd5, 0xd9, 0x46, 0xcc, 0x9e, 0x1e, 0x12, 0x36,
+    0x2e, 0x65, 0xa9, 0x82, 0x85, 0xc6, 0xf9, 0x84, 0x8b, 0xb5, 0xa1, 0xac, 0x0f, 0x9d, 0x81, 0x1f,
+    0x3a, 0xd8, 0x95, 0x05, 0xb6, 0xc3, 0x6a, 0x80, 0xf2, 0xf9, 0x7d, 0x0f, 0x3f, 0x5e, 0x79, 0x50,
+    0x4b, 0x67, 0x3a, 0x60, 0x49, 0xc7, 0x01, 0x2b, 0x07, 0x6f, 0x47, 0x2f, 0x8c, 0xb1, 0x77, 0x77,
+    0x8d, 0xb3, 0x65, 0x94, 0x6f, 0xdc, 0x63, 0xf4, 0x2a, 0x7f, 0x9f, 0xa7, 0x7d, 0x55, 0x5c, 0x6f,
+    0xcf, 0x6f, 0x86, 0x86, 0xe7, 0xa6, 0x36, 0x27, 0x58, 0x28, 0xee, 0x0f, 0xb2, 0x2b, 0xe7, 0xb3,
+    0x2e, 0xbf, 0x06, 0x4d, 0x96, 0xc4, 0x43, 0xb0, 0x09, 0x3d, 0x44, 0xa8, 0x31, 0x24, 0xfb, 0x03,
+    0xa6, 0x26, 0x8f, 0xdc, 0x08, 0x93, 0x6e, 0x02, 0x7d, 0xec, 0x8e, 0x3a, 0x0b, 0x2b, 0xb3, 0xf0,
+    0xad, 0xe6, 0xb9, 0xc8, 0xe9, 0x34, 0xdf, 0x29, 0xe6, 0x8c, 0x00, 0xec, 0x5c, 0x6e, 0xb0, 0x3c,
+    0x1e, 0xe3, 0x11, 0x3c, 0x2c, 0x25, 0xf2, 0xe6, 0x40, 0xf9, 0x17, 0x53, 0x90, 0x33, 0x53, 0x11,
+    0x17, 0xfd, 0xea, 0x30, 0xd4, 0xfd, 0x21, 0x90, 0x5f, 0xc6, 0x00, 0xd1, 0x05, 0x57, 0x14, 0x52,
+    0xc0, 0x75, 0x52, 0xa1, 0xe1, 0x78, 0x68, 0x70, 0x7d, 0x37, 0xac, 0x28, 0xe3, 0xa0, 0x63, 0x60,
+    0xce, 0x05, 0x49, 0x20, 0x74, 0xca, 0xf4, 0x19, 0xc9, 0x1f, 0x45, 0x6f, 0x27, 0xdd, 0x8b, 0x4d,
+    0xb6, 0x95, 0x2b, 0x73, 0xeb, 0xdf, 0x97, 0x51, 0xda, 0x93, 0x09, 0xd8, 0x21, 0xaa, 0x89, 0xa9,
+    0x05, 0xec, 0xf7, 0x84, 0xe8, 0x6e, 0xa6, 0x6c, 0x2f, 0xef, 0x1b, 0x5a, 0x9d, 0x66, 0x8f, 0x87,
+    0x45, 0xcc, 0x89, 0x4d, 0xd8, 0xc5, 0xfa, 0xe2, 0x6d, 0xe3, 0x9d, 0xeb, 0x8b, 0xca, 0xbf, 0xc8,
+    0xa3, 0xbf, 0x2c, 0x07, 0x3d, 0x5b, 0x70, 0xe3, 0x72, 0x0c, 0xdd, 0x4e, 0x03, 0x66, 0x46, 0xca,
+    0x3e, 0xf9, 0x2e, 0x45, 0x3b, 0xe0, 0xd9, 0x4f, 0xc2, 0x41, 0x2b, 0x14, 0xc4, 0x25, 0xef, 0x2c,
+    0xaf, 0x59, 0xe4, 0xf5, 0x1d, 0x83, 0xac, 0x37, 0x36, 0xd4, 0x92, 0xeb, 0x8b, 0x61, 0x1a, 0x25,
+    0xad, 0xd3, 0xa4, 0x70, 0x6d, 0x7a, 0x4e, 0xb2, 0x60, 0x93, 0x66, 0x85, 0x4c, 0x53, 0x1a, 0xdf,
+    0xd1, 0xcb, 0x28, 0x43, 0x71, 0x12, 0x05, 0x5f, 0x64, 0x0c, 0xf5, 0xf2, 0xc6, 0xe6, 0x65, 0xbf,
+    0x89, 0xcf, 0xc5, 0x5d, 0x33, 0x2e, 0xfc, 0x0b, 0x54, 0xed, 0xe8, 0x2c, 0xaf, 0x17, 0x9e, 0xa6,
+    0x64, 0x7d, 0x1d, 0x8b, 0x79, 0xd3, 0x30, 0x66, 0x7c, 0x5d, 0x36, 0x85, 0x1d, 0x2c, 0xab, 0xe2,
+    0x3a, 0x15, 0x47, 0x97, 0xfd, 0xdc, 0x1c, 0xec, 0xb1, 0xe7, 0x0f, 0xcb, 0xe2, 0x1e, 0x90, 0x16,
+    0xe4, 0x96, 0xb0, 0x58, 0x6e, 0x44, 0x37, 0x65, 0x8c, 0x3d, 0x29, 0xb5, 0xaa, 0xd3, 0x8a, 0xd7,
+    0x4b, 0xe3, 0xe0, 0x73, 0x33, 0xea, 0xb9, 0x27, 0x86, 0xb2, 0xfa, 0x9d, 0x23, 0x75, 0x8e, 0xad,
+    0x40, 0x35, 0x25, 0x97, 0xaf, 0xb6, 0x98, 0xdd, 0x96, 0xf1, 0x3e, 0x68, 0xd5, 0x3a, 0x39, 0x53,
+    0xea, 0xde, 0x4f, 0x24, 0x1e, 0x41, 0xca, 0x9c, 0x95, 0x05, 0xc8, 0x52, 0x83, 0x5b, 0x2e, 0x2b,
+    0x93, 0x04, 0x87, 0xf6, 0x6c, 0x87, 0x2c, 0x7c, 0x63, 0x09, 0x1d, 0x53, 0x22, 0xf1, 0x3e, 0x51,
+    0x61, 0x4d, 0x54, 0xb4, 0xee, 0xf1, 0x8c, 0x2a, 0xe4, 0xf3, 0x0d, 0xa0, 0xe9, 0x37, 0xf9, 0xa9,
+    0x89, 0x6b, 0xfc, 0x8b, 0x55, 0x5f, 0x4f, 0x32, 0x26, 0xf1, 0xb1, 0xeb, 0x10, 0x7d, 0x3e, 0x0a,
+    0x86, 0x87, 0x7e, 0x43, 0x18, 0x79, 0xf7, 0x2a, 0xaa, 0x0a, 0x1e, 0x2d, 0x16, 0x1c, 0x8b, 0xc9,
+    0xdf, 0xe5, 0x78, 0xbf, 0x91, 0x27, 0xa5, 0x68, 0x47, 0xa5, 0xd8, 0x10, 0x06, 0xde, 0x43, 0xa2,
+    0x37, 0x9e, 0x33, 0xa1, 0xe9, 0x17, 0xa2, 0xb2, 0x78, 0xeb, 0xe8, 0x4d, 0x6e, 0x98, 0xa4, 0xe3,
+    0xe5, 0x20, 0x5c, 0x57, 0x5c, 0x4e, 0xb0, 0xef, 0x16, 0xe7, 0xcf, 0x13, 0x69, 0x3c, 0x2a, 0x79,
+    0xcc, 0xe9, 0x92, 0xf4, 0x93, 0xd4, 0x13, 0x5c, 0xe0, 0x8b, 0xc0, 0x1d, 0x68, 0xae, 0x53, 0x1d,
+    0x73, 0x40, 0x40, 0xac, 0xbc, 0xe7, 0x27, 0xf4, 0xd9, 0x36, 0xde, 0x29, 0x58, 0x67, 0x62, 0x01,
+    0x02, 0xcb, 0x65, 0xee, 0xad, 0xc3, 0x87, 0x25, 0x99, 0x97, 0xc0, 0xfa, 0x91, 0xb4, 0x3c, 0xaa,
+    0x2f, 0x33, 0xcf, 0x9b, 0x6f, 0x75, 0xf0, 0xa0, 0x36, 0x71, 0x38, 0x8c, 0x9f, 0x8e, 0x80, 0x09,
+    0x0f, 0x74, 0x77, 0x02, 0x20, 0x37, 0x6a, 0xfb, 0x18, 0xad, 0x85, 0x4f, 0x29, 0x8d, 0x84, 0x6b,
+    0x6d, 0x3e, 0xf3, 0x7c, 0xc4, 0x24, 0xb3, 0x9b, 0xf5, 0x23, 0x6e, 0xe8, 0xd6, 0xd0, 0xfd, 0xdc,
+    0xb6, 0x1c, 0x0f, 0xf1, 0xb0, 0x47, 0x2a, 0xef, 0xda, 0xf5, 0xdf, 0xf6, 0x99, 0xf0, 0x21, 0x76,
+    0x47, 0xa6, 0xd4, 0x82, 0xdf, 0xeb, 0x79, 0x5c, 0x84, 0x8c, 0xba, 0x00, 0xfc, 0x16, 0xbc, 0xd1,
+    0x21, 0xd5, 0xf2, 0x1d, 0xa8, 0x26, 0x1a, 0x9c, 0x3c, 0x3e, 0x48, 0xa1, 0xcc, 0x7b, 0x72, 0xc8,
+    0xac, 0x3b, 0xbe, 0x51, 0xdc, 0x6c, 0x95, 0x80, 0x7f, 0xf1, 0x96, 0x32, 0x18, 0x5a, 0xe5, 0x8a,
+    0x4e, 0xbc, 0x32, 0x43, 0x5c, 0x89, 0x5a, 0x76, 0x70, 0x04, 0x2a, 0xae, 0x85, 0x02, 0xae, 0x05,
+    0x2f, 0x58, 0x87, 0xe5, 0x68, 0xa6, 0xd0, 0xab, 0x6c, 0x4e, 0x59, 0xda, 0x25, 0x78, 0xff, 0x46,
+    0x7c, 0xb7, 0x78, 0xdd, 0xac, 0x41, 0x8b, 0x0c, 0xaf, 0xfd, 0x77, 0x23, 0xd2, 0x63, 0x47, 0x12,
+    0x04, 0xdb, 0x1f, 0x8e, 0x70, 0x45, 0x4c, 0xb5, 0x44, 0xf6, 0x2c, 0xbb, 0xe8, 0x62, 0x88, 0xa8,
+    0x10, 0x82, 0x6c, 0x59, 0x42, 0xa9, 0x53, 0x09, 0x75, 0xc6, 0x8f, 0x9a, 0x41, 0xfe, 0x1d, 0x88,
+    0xd1, 0x7e, 0xf8, 0x0d, 0x87, 0xf5, 0x78, 0xd0, 0x44, 0xbc, 0x45, 0xd3, 0x90, 0xb2, 0x32, 0x7c,
+    0xcd, 0xa4, 0xc6, 0x64, 0x2c, 0x6e, 0x26, 0xfb, 0x54, 0xb3, 0xe2, 0xed, 0x53, 0x4f, 0x3c, 0xf9,
+    0x2f, 0x13, 0xe7, 0xea, 0x2d, 0xea, 0x37, 0x67, 0x5b, 0xae, 0x5d, 0x72, 0x31, 0x16, 0x23, 0x78,
+    0x17, 0xc7, 0x65, 0xc7, 0x89, 0x1c, 0x04, 0xc9, 0xe3, 0xb8, 0xb1, 0x38, 0xb9, 0x3d, 0xec, 0xdd,
+    0x38, 0x51, 0x72, 0x6b, 0x12, 0x62, 0xb4, 0xd9, 0x82, 0xe8, 0x7f, 0x30, 0x52, 0x8e, 0xa2, 0x35,
+    0xf3, 0x86, 0xf1, 0xbc, 0x9d, 0x50, 0x72, 0x4a, 0xc6, 0x69, 0xaf, 0xc1, 0x4d, 0xc9, 0xaf, 0xf5,
+    0xa1, 0x9e, 0x80, 0xee, 0x28, 0x32, 0xb6, 0x6d, 0x00, 0x15, 0x99, 0x18, 0xf7, 0xab, 0x8c, 0xa6,
+    0xc5, 0xd0, 0x4b, 0x67, 0x73, 0x19, 0x0a, 0xa1, 0x05, 0x48, 0x8f, 0x01, 0xc9, 0x62, 0xc8, 0x7e,
+    0x52, 0xce, 0x46, 0x41, 0xaf, 0x8a, 0x75, 0xf0, 0x4f, 0xaa, 0xc0, 0x91, 0x9e, 0xc0, 0xcd, 0x19,
+    0x3a, 0x9d, 0xf3, 0x1a, 0x77, 0x01, 0x09, 0x09, 0x61, 0x53, 0x9e, 0xf3, 0xe1, 0x95, 0xfd, 0xfb,
+    0xdd, 0x82, 0xdd, 0x9f, 0xe7, 0x69, 0x4b, 0xfb, 0x11, 0x2c, 0x1d, 0xbc, 0xb4, 0x46, 0x7a, 0x26,
+    0xc6, 0xa9, 0xd0, 0x83, 0x2c, 0x9e, 0x45, 0x47, 0xf2, 0xc3, 0xe2, 0x47, 0x3c, 0x48, 0x1c, 0x01,
+    0xc1, 0x66, 0x1d, 0x2f, 0xe7, 0x99, 0xbc, 0x90, 0x78, 0xe7, 0x74, 0xac, 0x77, 0xdd, 0x2f, 0xda,
+    0xdf, 0xf6, 0x83, 0x96, 0x69, 0xa5, 0x87, 0x3b, 0x31, 0xdc, 0x0a, 0x53, 0xcc, 0x27, 0x9d, 0xff,
+    0xb6, 0xcb, 0x86, 0x97, 0xb9, 0xde, 0xde, 0xf1, 0x41, 0xff, 0x09, 0xbd, 0xa0, 0xb8, 0x32, 0x85,
+    0x25, 0xc8, 0x51, 0xe9, 0x0c, 0xbb, 0x7b, 0x95, 0xe6, 0x87, 0x3c, 0x6a, 0x94, 0x6f, 0x95, 0x9a,
+    0xa7, 0x97, 0xda, 0xc4, 0xa2, 0xd8, 0x2d, 0x46, 0xb6, 0x74, 0xea, 0xa8, 0xc8, 0xc8, 0x07, 0x3c,
+    0x67, 0xf1, 0x8d, 0x4e, 0x6e, 0x0c, 0xfe, 0x5f, 0xf6, 0xde, 0xd4, 0x8b, 0xee, 0x8f, 0x8f, 0x63,
+    0x45, 0x12, 0x2e, 0xeb, 0x7f, 0xf2, 0xdb, 0x35, 0xa3, 0x52, 0xfc, 0x0b, 0x24, 0x40, 0xe7, 0x3c,
+    0x8b, 0x8c, 0x02, 0x4c, 0xe6, 0xe9, 0xd6, 0x47, 0x44, 0x83, 0x62, 0x7c, 0xb0, 0x6e, 0x03, 0x8a,
+    0x30, 0x56, 0xa0, 0xff, 0xe8, 0xf6, 0x6a, 0x61, 0x29, 0x94, 0x66, 0x3b, 0x24, 0x28, 0xb2, 0x0c,
+    0x1f, 0xae, 0xf5, 0x07, 0xf1, 0x9e, 0x5f, 0x9b, 0x39, 0xd4, 0x8d, 0x70, 0x59, 0x88, 0xeb, 0x79,
+    0x28, 0x68, 0xeb, 0x10, 0x98, 0x0f, 0xeb, 0xd0, 0x4e, 0xf8, 0x05, 0xcd, 0xf7, 0x10, 0xb3, 0x38,
+    0x64, 0x3b, 0x64, 0xd6, 0x38, 0x07, 0xc0, 0x41, 0xb6, 0x6d, 0xb7, 0xab, 0xa3, 0xab, 0x9c, 0xfd,
+    0x1e, 0x16, 0x57, 0xea, 0x12, 0xbe, 0x9a, 0x1e, 0x63, 0x76, 0x0f, 0x8a, 0xa5, 0x4a, 0xa1, 0x85,
+    0x7a, 0xdc, 0xbf, 0x69, 0x98, 0xcc, 0x3e, 0x95, 0x57, 0x93, 0x83, 0x02, 0xb5, 0x99, 0x48, 0xf2,
+    0xf3, 0xa4, 0xd4, 0xf4, 0x7e, 0x2b, 0xdc, 0xe7, 0x61, 0x90, 0x3c, 0x58, 0x6f, 0x1e, 0x13, 0x3a,
+    0xf7, 0x9a, 0xde, 0x14, 0x03, 0xa3, 0x6e, 0x52, 0x55, 0xe7, 0xb7, 0x59, 0x18, 0x76, 0xcc, 0x40,
+    0xc7, 0x54, 0x29, 0x9b, 0xdb, 0x16, 0xa6, 0x98, 0x8a, 0x94, 0xad, 0xe6, 0x2a, 0xba, 0x0b, 0x61,
+    0xb6, 0xcc, 0xcb, 0x31, 0xf0, 0x20, 0xe6, 0x91, 0xb5, 0xc9, 0x4b, 0x78, 0x80, 0x26, 0xdb, 0xfc,
+    0x66, 0x77, 0xf5, 0x0d, 0x3b, 0xac, 0xd7, 0x15, 0x0d, 0x12, 0x68, 0xea, 0x47, 0x57, 0x4f, 0x73,
+    0xb1, 0xbb, 0xa2, 0x88, 0xd9, 0xc4, 0x60, 0xbc, 0x08, 0x2a, 0x04, 0xaf, 0x9d, 0xac, 0x07, 0xa1,
+    0x6a, 0xe8, 0xe4, 0xc1, 0xbf, 0x3d, 0xfc, 0x39, 0x6b, 0xe2, 0xd4, 0xdb, 0x1e, 0xc6, 0x47, 0x5e,
+    0x16, 0xad, 0xa4, 0xbd, 0x69, 0x04, 0xde, 0x55, 0xf7, 0x32, 0x39, 0x01, 0x8f, 0x5c, 0x48, 0xbb,
+    0x5d, 0xaf, 0xad, 0x8b, 0x6d, 0xf3, 0x37, 0x45, 0x3c, 0xd6, 0x95, 0xaa, 0x99, 0xea, 0xe4, 0xc0,
+    0x71, 0xfb, 0xfe, 0xc3, 0x0c, 0x72, 0x7b, 0xad, 0x90, 0x06, 0x9d, 0xc4, 0x01, 0x5e, 0xba, 0xf4,
+    0x24, 0xa4, 0x7b, 0x03, 0xc9, 0x68, 0x34, 0xb2, 0xa7, 0xbd, 0xd2, 0xd7, 0xbf, 0x61, 0xf8, 0xa1,
+    0xe5, 0xb2, 0xe0, 0xb0, 0x06, 0xd7, 0x78, 0x99, 0xbb, 0xcc, 0x0c, 0x0e, 0xfa, 0x10, 0xa8, 0xcd,
+    0xbe, 0xa8, 0x74, 0x77, 0xf1, 0xd0, 0x96, 0x33, 0x24, 0xf2, 0x29, 0x61, 0xb5, 0xab, 0xa0, 0xcd,
+    0x72, 0x25, 0xcf, 0x67, 0xf5, 0x75, 0xe3, 0xc3, 0xcc, 0x6b, 0x1c, 0xd1, 0xe7, 0x10, 0xf7, 0x78,
+    0x36, 0x15, 0x93, 0x92, 0xb9, 0xf3, 0xb2, 0xf9, 0xed, 0x05, 0x4c, 0xe1, 0x23, 0x21, 0xb9, 0x9b,
+    0x35, 0x1a, 0xe1, 0xcd, 0xc4, 0x86, 0xd4, 0xef, 0x91, 0xd5, 0x2f, 0xd2, 0xde, 0x1b, 0xa0, 0x71,
+    0xa8, 0xf2, 0x76, 0xd6, 0x21, 0x1b, 0xf5, 0x41, 0x5e, 0xbe, 0x90, 0x2e, 0x98, 0x06, 0xbc, 0x93,
+    0x1e, 0x11, 0x02, 0xcd, 0xb8, 0x93, 0xb8, 0xde, 0x5e, 0xd3, 0xc7, 0xb7, 0x09, 0x95, 0x77, 0xfe,
+    0xca, 0x07, 0xd2, 0x37, 0x6f, 0x4a, 0xbe, 0x1d, 0x92, 0x38, 0x14, 0x53, 0xef, 0xf1, 0xe4, 0x63,
+    0xd2, 0x27, 0x61, 0x8c, 0xca, 0x35, 0xcc, 0x23, 0x1d, 0xd8, 0x2f, 0x70, 0x7f, 0xb0, 0x50, 0xfc,
+    0x5e, 0xf4, 0x52, 0xa2, 0xc4, 0x0d, 0x91, 0x9b, 0xab, 0xa5, 0xf7, 0xc1, 0xac, 0x90, 0xbb, 0x33,
+    0x47, 0x0d, 0xdf, 0x73, 0x24, 0x0f, 0x0e, 0x43, 0x84, 0xc4, 0xb2, 0x14, 0x2c, 0xda, 0x74, 0xd8,
+    0xfa, 0x89, 0x61, 0x34, 0xf5, 0x2c, 0xe9, 0xb3, 0xcd, 0xcc, 0x5d, 0x15, 0xfd, 0xbc, 0xc7, 0x31,
+    0x02, 0x32, 0xf6, 0x89, 0x07, 0x23, 0x0d, 0x5e, 0x1a, 0xcb, 0x0e, 0x22, 0xb0, 0xb8, 0x62, 0x6e,
+    0xd0, 0xf4, 0xb4, 0x73, 0xdc, 0x5b, 0x5b, 0x51, 0x01, 0xcd, 0xfb, 0xc4, 0xee, 0x4e, 0xf6, 0x19,
+    0x0b, 0x08, 0x4c, 0x19, 0x94, 0x1f, 0x9a, 0x89, 0xea, 0x9c, 0x1c, 0x7f, 0x08, 0xa0, 0x23, 0x5e,
+    0x36, 0x3f, 0xee, 0xe3, 0xb8, 0xdf, 0xfa, 0x00, 0x44, 0x87, 0x46, 0x08, 0xf9, 0xae, 0x30, 0x9a,
+    0x12, 0x40, 0xe7, 0xb0, 0xc8, 0x0f, 0x32, 0x25, 0x4c, 0xa7, 0xac, 0xf8, 0x1f, 0xcf, 0x82, 0x4f,
+    0x28, 0x0f, 0x88, 0x13, 0x33, 0x33, 0x1f, 0x7a, 0xa0, 0xcf, 0x7f, 0x7c, 0x8f, 0xee, 0x51, 0x19,
+    0x34, 0x18, 0x24, 0xa3, 0xdc, 0xec, 0xe0, 0x2b, 0x5f, 0x26, 0xa8, 0x67, 0xaf, 0xc0, 0xe9, 0xc8,
+    0x5e, 0x05, 0xee, 0xee, 0x58, 0xf4, 0x3b, 0x48, 0x89, 0x2e, 0xc6, 0xef, 0x2b, 0xfb, 0x33, 0x92,
+    0x8d, 0x34, 0xc5, 0xd4, 0x4c, 0xfe, 0x7b, 0x1f, 0x87, 0xcf, 0xc1, 0x39, 0x01, 0xd8, 0xd3, 0x22,
+    0x11, 0x33, 0xf5, 0xd4, 0xb2, 0xdd, 0x68, 0xe7, 0x5f, 0xdc, 0xe6, 0x22, 0x63, 0xde, 0x00, 0x2a,
+    0xaa, 0x69, 0x03, 0xf7, 0xb5, 0x51, 0xed, 0x5e, 0xb1, 0xd4, 0x13, 0xdd, 0x76, 0xd4, 0x2a, 0x68,
+    0xe6, 0xcd, 0xd0, 0x76, 0xa9, 0x78, 0x8b, 0xed, 0x5c, 0x21, 0xb2, 0x4b, 0x77, 0x22, 0x35, 0x59,
+    0xef, 0xea, 0xb3, 0x9c, 0x24, 0xf8, 0x9c, 0x3b, 0xf8, 0xc6, 0xbb, 0x34, 0x06, 0xac, 0xf2, 0xa6,
+    0x98, 0xb2, 0xdc, 0xfc, 0x2c, 0x71, 0xa0, 0x21, 0x86, 0xcc, 0x1d, 0x12, 0x67, 0xc0, 0x70, 0xa2,
+    0x14, 0x33, 0x54, 0x66, 0xb1, 0xd5, 0x22, 0x40, 0xf1, 0x6a, 0x25, 0xc3, 0xf1, 0x6a, 0xe9, 0x3f,
+    0xac, 0x26, 0x30, 0x30, 0xe6, 0x1e, 0xfa, 0xff, 0xb9, 0xb2, 0x3e, 0x7c, 0x14, 0x79, 0x85, 0x83,
+    0xe7, 0x1d, 0xc3, 0x6e, 0xdc, 0x7e, 0xb1, 0xcb, 0x95, 0xe2, 0xc6, 0xc8, 0x34, 0x12, 0x40, 0x50,
+    0x7c, 0x67, 0xe0, 0x39, 0xdc, 0x81, 0x8a, 0xb3, 0x77, 0x21, 0x36, 0x5e, 0x80, 0xb4, 0x04, 0x5f,
+    0xd6, 0xf4, 0x1a, 0xd3, 0x25, 0x59, 0x2d, 0xeb, 0x1e, 0x8b, 0x1f, 0x32, 0x36, 0xaa, 0xc0, 0x55,
+    0xcd, 0x3d, 0xc1, 0xff, 0x2e, 0xb3, 0xc2, 0x5a, 0x6b, 0x53, 0xc8, 0xba, 0xa9, 0x97, 0xbe, 0x78,
+    0x71, 0xb8, 0xe4, 0x29, 0x34, 0x27, 0x5d, 0xaf, 0x6a, 0xf0, 0x94, 0xb1, 0xe2, 0xe1, 0xd7, 0x8f,
+    0xa4, 0x96, 0x09, 0x33, 0x35, 0xa5, 0xea, 0x08, 0x7d, 0xf2, 0xe1, 0x76, 0xf8, 0x79, 0x19, 0xd8,
+    0x0b, 0x2f, 0x8a, 0x97, 0xba, 0xdc, 0x1e, 0x53, 0x16, 0xed, 0x45, 0x97, 0x4d, 0xd2, 0x46, 0x5c,
+    0x84, 0x07, 0x40, 0x6d, 0xc5, 0x51, 0x3f, 0xb9, 0xae, 0x1a, 0xc2, 0xb9, 0xa5, 0x74, 0xbf, 0x39,
+    0xbc, 0x40, 0x6a, 0x22, 0xcd, 0xc5, 0xc2, 0xbd, 0x87, 0xd0, 0x9a, 0xbc, 0xdb, 0x4a, 0x0b, 0x94,
+    0xfa, 0xee, 0xcb, 0xc7, 0x84, 0x7b, 0xee, 0xc2, 0x89, 0x85, 0xfd, 0x1a, 0xba, 0x39, 0x11, 0x5f,
+    0xc1, 0xac, 0x88, 0x2c, 0xa8, 0xb3, 0x07, 0xff, 0xec, 0x38, 0xe7, 0x9d, 0xf5, 0x5e, 0x90, 0x66,
+    0x91, 0x89, 0x36, 0x9f, 0x8e, 0xe6, 0x53, 0x55, 0x6e, 0x91, 0x88, 0x47, 0xa1, 0xe0, 0xd9, 0x8f,
+    0x8a, 0xb2, 0xca, 0x37, 0x69, 0xf6, 0x21, 0xd1, 0x11, 0x52, 0xaf, 0xad, 0x2b, 0xc2, 0x08, 0x3f,
+    0x98, 0x8f, 0xa9, 0xf3, 0xf6, 0x66, 0x2c, 0x05, 0x75, 0x6e, 0x8d, 0xf0, 0x4c, 0xfb, 0xb9, 0x4d,
+    0xcb, 0x7c, 0x85, 0x8d, 0xb8, 0x98, 0xda, 0x7e, 0x5f, 0x5a, 0x25, 0x4a, 0xa8, 0xb6, 0xb4, 0xcb,
+    0x75, 0xec, 0x00, 0x63, 0x91, 0x96, 0x2a, 0x5b, 0xcc, 0x71, 0xae, 0x94, 0x78, 0x3d, 0x59, 0xc5,
+    0xef, 0x42, 0xd6, 0x43, 0xbf, 0x0c, 0x0d, 0x17, 0xcb, 0x8a, 0x3c, 0x8a, 0xe8, 0x17, 0x3b, 0x3e,
+    0x1c, 0x0b, 0xd1, 0x01, 0x07, 0x6f, 0xe3, 0x17, 0x91, 0x97, 0xb3, 0x48, 0x46, 0xd8, 0xa2, 0x20,
+    0xbf, 0xdb, 0xf3, 0x33, 0xaf, 0x7d, 0x0f, 0x50, 0xbc, 0x09, 0x39, 0x95, 0x25, 0x21, 0x8c, 0xc7,
+    0x18, 0x9d, 0x0e, 0x75, 0x8a, 0xb5, 0xa1, 0x2d, 0xe1, 0xf9, 0x03, 0x95, 0xf1, 0x52, 0x44, 0xc8,
+    0xff, 0x77, 0x27, 0x33, 0x65, 0x84, 0x59, 0xa0, 0x13, 0xbf, 0x7c, 0x4d, 0x24, 0x41, 0x1f, 0x23,
+    0x9a, 0xf7, 0x45, 0x52, 0x9e, 0xa8, 0x77, 0x96, 0xf5, 0x16, 0x74, 0xb9, 0x5f, 0x7e, 0x3b, 0x02,
+    0xff, 0xec, 0x75, 0x0f, 0xc3, 0xe5, 0x02, 0x35, 0x50, 0xcb, 0x7c, 0x79, 0x0b, 0x2b, 0x8e, 0x34,
+    0xba, 0x89, 0xf4, 0x0c, 0x2d, 0xe1, 0xf4, 0x5d, 0x0a, 0xd3, 0x9c, 0x69, 0x95, 0xf3, 0xe3, 0x85,
+    0xbd, 0xdd, 0xd2, 0xa0, 0x36, 0x89, 0x7d, 0xf6, 0x1b, 0x14, 0x7a, 0xed, 0xff, 0x6f, 0x42, 0x27,
+    0x57, 0xbe, 0xd5, 0x61, 0xaf, 0x90, 0x48, 0xed, 0xef, 0x71, 0x02, 0xe0, 0x26, 0xb3, 0xb4, 0x41,
+    0xe0, 0x47, 0x29, 0xf1, 0x7a, 0xc2, 0x38, 0x0a, 0xe7, 0xec, 0xee, 0x1f, 0x65, 0x48, 0x0c, 0x06,
+    0x70, 0xf5, 0xdb, 0xe9, 0xaa, 0x22, 0x32, 0x18, 0x78, 0x49, 0xd0, 0xb3, 0x58, 0x26, 0x68, 0xbc,
+    0x95, 0x22, 0x05, 0x7f, 0x1f, 0x3c, 0x3d, 0x77, 0xba, 0xc4, 0x28, 0x7b, 0x54, 0xd9, 0xc3, 0x6d,
+    0x8b, 0x1b, 0x03, 0xa0, 0x0a, 0xb5, 0x3f, 0xae, 0x10, 0x3b, 0x2f, 0xe9, 0x17, 0x08, 0xbd, 0x80,
+    0xa7, 0xb5, 0x05, 0x41, 0x8c, 0x08, 0x38, 0x5e, 0x5c, 0x8c, 0xb8, 0x07, 0x0c, 0xeb, 0xf3, 0x9b,
+    0x1b, 0x9a, 0x3e, 0x3a, 0x30, 0x7c, 0x9e, 0x84, 0x61, 0xbc, 0x44, 0xa8, 0xf6, 0x53, 0x95, 0x46,
+    0x31, 0x76, 0xe6, 0x73, 0x04, 0x30, 0xb1, 0x99, 0x92, 0x04, 0x1f, 0x6a, 0x68, 0x79, 0x16, 0x03,
+    0x5e, 0x41, 0xf4, 0xb8, 0xe2, 0x2b, 0x6f, 0x6c, 0x3c, 0x9a, 0x0b, 0xdc, 0x39, 0x9b, 0x10, 0xa8,
+    0x20, 0xdc, 0x7e, 0x03, 0x06, 0x32, 0x56, 0x6f, 0xf3, 0xed, 0x56, 0x37, 0xa9, 0xe8, 0xef, 0xfb,
+    0xb9, 0x32, 0x39, 0x95, 0xb7, 0x2e, 0x23, 0xab, 0xb1, 0x50, 0x9c, 0xe0, 0x4d, 0x08, 0xf1, 0xdf,
+    0x60, 0x6a, 0xea, 0x6c, 0x67, 0x57, 0x2c, 0x0c, 0x87, 0xa0, 0x16, 0x3a, 0x17, 0xe9, 0x3e, 0x14,
+    0xe9, 0xf6, 0xf4, 0x84, 0xae, 0x51, 0x76, 0x23, 0xcc, 0x32, 0x1f, 0x6d, 0xcf, 0x21, 0x56, 0xc8,
+    0x2d, 0xc9, 0x01, 0xae, 0x59, 0x0d, 0xcd, 0x50, 0x24, 0x85, 0xf6, 0x06, 0xaf, 0xbf, 0xb1, 0x22,
+    0x6e, 0xd6, 0xe2, 0x7b, 0x66, 0xfd, 0xcb, 0x29, 0x57, 0x9e, 0x6e, 0xae, 0xf3, 0xdc, 0x88, 0xca,
+    0x41, 0x4e, 0xb3, 0xba, 0x03, 0xe0, 0x80, 0xab, 0x87, 0x2a, 0xb5, 0xb9, 0xc4, 0x6c, 0x06, 0x98,
+    0xc3, 0x82, 0xd0, 0x62, 0xb2, 0x5b, 0xb0, 0xf1, 0x70, 0x68, 0xb7, 0x72, 0x3a, 0x92, 0xcd, 0xf6,
+    0x2b, 0x2b, 0x27, 0xe5, 0xb6, 0x09, 0x49, 0xe0, 0x21, 0x95, 0xd4, 0x97, 0x15, 0xd5, 0x2d, 0x5b,
+    0x82, 0x5d, 0x79, 0xf5, 0xd4, 0x32, 0x2f, 0x26, 0xbe, 0x1f, 0x31, 0xd6, 0x2e, 0xfe, 0x2c, 0xf1,
+    0xd9, 0x49, 0x64, 0xfc, 0xc0, 0x53, 0x5e, 0x7b, 0xa3, 0xd4, 0xaf, 0x13, 0x66, 0x80, 0xd7, 0x50,
+    0x31, 0x5a, 0x38, 0x53, 0x8b, 0x79, 0xa1, 0xc0, 0x9f, 0xc9, 0x9a, 0xb6, 0x96, 0x2b, 0x1b, 0xee,
+    0x33, 0x8f, 0xff, 0xcf, 0x8f, 0xda, 0x5e, 0xb4, 0x9d, 0x04, 0xb4, 0x23, 0xde, 0x00, 0x08, 0x41,
+    0xc0, 0x7e, 0x91, 0xb1, 0xc6, 0xa0, 0x56, 0xf2, 0x80, 0x33, 0x75, 0x47, 0x0b, 0x7e, 0xfb, 0x4d,
+    0x8f, 0x78, 0x94, 0x4f, 0xf1, 0xa2, 0x75, 0x25, 0x30, 0x22, 0x6f, 0x95, 0xb1, 0xf8, 0xc4, 0xda,
+    0x83, 0x1a, 0x2d, 0xd6, 0xac, 0x22, 0x49, 0xf8, 0x38, 0xe4, 0x7f, 0x64, 0x06, 0x97, 0x5d, 0xac,
+    0x36, 0xda, 0xc9, 0x2f, 0xa3, 0x55, 0x86, 0xa0, 0x52, 0xc2, 0xee, 0x0b, 0x3a, 0x57, 0xf0, 0x5a,
+    0x95, 0x76, 0x55, 0x34, 0x28, 0xba, 0xa9, 0xa3, 0xaf, 0xb3, 0xc1, 0xd1, 0x7e, 0x67, 0xa2, 0xae,
+    0x36, 0x2e, 0x2c, 0x9c, 0xca, 0xf9, 0x48, 0x93, 0xba, 0xa5, 0x54, 0xab, 0x20, 0x46, 0x78, 0xad,
+    0xf0, 0xa5, 0x6b, 0x94, 0x44, 0xc8, 0xd5, 0xe0, 0x75, 0x95, 0x9f, 0xfb, 0x0b, 0xbc, 0xf7, 0xfc,
+    0xdb, 0x56, 0x3a, 0x4d, 0x2c, 0xd0, 0x59, 0x7d, 0x52, 0x99, 0x63, 0x77, 0x13, 0xca, 0x52, 0xaa,
+    0x27, 0x04, 0x21, 0x6d, 0xa4, 0x09, 0x07, 0xf5, 0x46, 0x83, 0x66, 0x96, 0xec, 0xaa, 0x72, 0x6c,
+    0x01, 0x38, 0xa2, 0x82, 0x29, 0x1a, 0xb9, 0x21, 0x67, 0xca, 0xf1, 0x51, 0x44, 0x36, 0x63, 0x57,
+    0xf9, 0x89, 0x8d, 0x8a, 0x6a, 0x9c, 0x54, 0x45, 0x3c, 0x09, 0xd6, 0xfc, 0x58, 0x40, 0x9b, 0x31,
+    0x60, 0x34, 0x5e, 0xff, 0x8a, 0x68, 0xb7, 0xac, 0x66, 0x74, 0xb6, 0xd6, 0x18, 0xa9, 0x79, 0xd0,
+    0xee, 0xf0, 0x82, 0xe0, 0x78, 0x2b, 0x61, 0xd0, 0x1b, 0x7b, 0x16, 0xdd, 0xf9, 0xf1, 0x19, 0x6f,
+    0x0a, 0xbf, 0x17, 0x8a, 0x21, 0x1b, 0x2c, 0xcd, 0x36, 0x92, 0x98, 0x00, 0xa7, 0xb2, 0x09, 0x7c,
+    0x89, 0x2c, 0xd8, 0x1a, 0x40, 0x23, 0xe9, 0x09, 0x81, 0xcd, 0x33, 0xfe, 0xeb, 0x57, 0xdd, 0x88,
+    0x20, 0xbf, 0xcc, 0xa9, 0xa5, 0xa3, 0xde, 0x83, 0x89, 0xf0, 0x68, 0x3b, 0x01, 0xbd, 0xdd, 0x32,
+    0xbe, 0x2b, 0x1b, 0x33, 0x9b, 0xe8, 0x9c, 0xfd, 0xa4, 0xcc, 0xf6, 0x10, 0xf5, 0x64, 0x35, 0x28,
+    0x44, 0xdc, 0x4a, 0x4a, 0x68, 0xbd, 0xfd, 0xa4, 0x05, 0xca, 0xf6, 0xd3, 0xde, 0x1c, 0xe0, 0x32,
+    0xf3, 0x25, 0x2a, 0xcc, 0x5b, 0x61, 0xa3, 0x63, 0x13, 0x66, 0x20, 0x9e, 0x71, 0x3a, 0xe7, 0x8c,
+    0x7d, 0xff, 0x1b, 0x81, 0x7c, 0x05, 0xf8, 0x88, 0x59, 0x2c, 0x4f, 0x4a, 0x2d, 0xfe, 0x84, 0xf1,
+    0xe9, 0x7a, 0xb3, 0xdf, 0xa9, 0x9d, 0xdc, 0xc6, 0x61, 0xcf, 0x8f, 0x67, 0x36, 0x29, 0x38, 0x96,
+    0x87, 0x9b, 0xd9, 0x0c, 0x2c, 0x10, 0x0a, 0xd1, 0x77, 0x6c, 0xbd, 0xae, 0x59, 0x2a, 0xcd, 0x6d,
+    0x16, 0x8a, 0xce, 0x76, 0x29, 0x3c, 0x20, 0x0e, 0x76, 0x2f, 0x44, 0x7d, 0x36, 0xd5, 0xdf, 0x7f,
+    0xab, 0x26, 0x73, 0x00, 0x3f, 0x26, 0x03, 0xbe, 0xa8, 0x5a, 0x4f, 0x1f, 0xef, 0xe1, 0xd1, 0x5f,
+    0x66, 0xf9, 0xa0, 0xe6, 0x00, 0xe7, 0x72, 0x4e, 0x8e, 0x07, 0x09, 0xc7, 0xa8, 0x14, 0x97, 0xcb,
+    0x92, 0x8b, 0xa7, 0xe8, 0x9f, 0x40, 0xdc, 0x39, 0x5b, 0xf8, 0xb7, 0x84, 0x24, 0x44, 0xce, 0x86,
+    0x9d, 0x8c, 0xdb, 0x20, 0x03, 0xea, 0x44, 0xe2, 0x92, 0x44, 0xc3, 0x54, 0x3e, 0x4a, 0x8b, 0xec,
+    0x3d, 0xc0, 0xcc, 0x02, 0x22, 0xb1, 0x71, 0x57, 0xbb, 0xed, 0x0b, 0x2f, 0xd7, 0xcd, 0xa6, 0x34,
+    0xa0, 0x33, 0x2f, 0x89, 0xd8, 0xc7, 0x18, 0xcb, 0x46, 0x61, 0x6f, 0x66, 0x97, 0xc5, 0xd1, 0x7c,
+    0xf4, 0x61, 0x60, 0xad, 0x9c, 0x69, 0xec, 0x43, 0x36, 0x73, 0xa7, 0x99, 0x60, 0xa6, 0x1b, 0xa1,
+    0xf2, 0x43, 0x96, 0xc3, 0x6a, 0x2d, 0x66, 0x80, 0x3e, 0xee, 0x7d, 0x63, 0xc0, 0xa0, 0x60, 0x9f,
+    0x8d, 0x29, 0xdf, 0x2d, 0x3b, 0x4c, 0x6c, 0x20, 0x9b, 0xa7, 0xc0, 0x8d, 0x89, 0x87, 0x8a, 0x68,
+    0x6a, 0xe5, 0x99, 0xdb, 0x00, 0xf0, 0xa6, 0x0f, 0xe8, 0x00, 0xea, 0x58, 0xbc, 0x5a, 0x09, 0xc6,
+    0xb6, 0xad, 0xc3, 0x33, 0xca, 0x6b, 0x68, 0xbc, 0x06, 0x4d, 0xaa, 0xd6, 0x9c, 0xb9, 0xf4, 0xda,
+    0x3b, 0x03, 0x6e, 0x8d, 0x7a, 0x1a, 0xf3, 0x32, 0x5f, 0x77, 0x83, 0x3d, 0xe9, 0xb0, 0xca, 0xe1,
+    0xd6, 0x79, 0xbb, 0x3f, 0x02, 0x77, 0x50, 0x5d, 0xa5, 0x2f, 0x79, 0x55, 0xa3, 0xf3, 0x9a, 0xfe,
+    0x9c, 0x67, 0x13, 0x28, 0xaf, 0x45, 0x62, 0x97, 0xa9, 0x6e, 0x14, 0xea, 0x2a, 0xe8, 0x3f, 0x23,
+    0x39, 0x34, 0x71, 0x8f, 0x5e, 0x39, 0x86, 0xfb, 0x96, 0xfe, 0x5a, 0xf4, 0xb8, 0x65, 0x7b, 0x44,
+    0xf4, 0x56, 0xf1, 0x94, 0x7d, 0x33, 0xd5, 0x4c, 0x59, 0x18, 0xef, 0x62, 0x29, 0x65, 0x72, 0xe9,
+    0xb2, 0x1b, 0x3d, 0xbb, 0xc2, 0xbc, 0xfd, 0x79, 0x29, 0x6d, 0xfa, 0xcb, 0xdc, 0xa1, 0x9c, 0x49,
+    0x43, 0x8d, 0xbd, 0xe2, 0xaa, 0xb5, 0xfc, 0x63, 0x09, 0x98, 0x02, 0xe5, 0x50, 0xfb, 0x0b, 0x9a,
+    0x2b, 0xa2, 0x56, 0xcc, 0xf0, 0xc4, 0xe5, 0x7c, 0xf2, 0xcd, 0xec, 0xa4, 0x70, 0x75, 0x17, 0x7c,
+    0xa6, 0xe1, 0x61, 0x2e, 0x15, 0x6e, 0x36, 0xaa, 0xe1, 0x77, 0x64, 0xa6, 0xa5, 0xc0, 0xdc, 0x4e,
+    0x03, 0xdc, 0x2b, 0x82, 0x90, 0x3e, 0xa1, 0x25, 0x19, 0xf9, 0x20, 0x72, 0x8b, 0xce, 0x61, 0xc8,
+    0x3c, 0x21, 0xf5, 0x46, 0x40, 0xf4, 0x84, 0x86, 0x56, 0xc8, 0x07, 0x7b, 0x64, 0xcf, 0x61, 0xe0,
+    0x8a, 0xaa, 0xd0, 0x24, 0x9a, 0x4c, 0x08, 0x4e, 0xe0, 0x28, 0x05, 0x4b, 0x7d, 0x40, 0x02, 0xb6,
+    0xb5, 0xb5, 0x19, 0x44, 0x75, 0xa0, 0xff, 0xab, 0x97, 0xa7, 0x5a, 0xe0, 0x2e, 0x1d, 0x8c, 0xef,
+    0x1c, 0x92, 0x26, 0x9f, 0x45, 0xca, 0x5e, 0xbe, 0x41, 0xe7, 0xea, 0x0d, 0xd7, 0xc7, 0x4c, 0x0e,
+    0xa9, 0x16, 0x2d, 0x05, 0xad, 0x2b, 0x14, 0xbc, 0xed, 0x4d, 0xf1, 0x35, 0xee, 0x61, 0x7b, 0x92,
+    0x68, 0x28, 0x86, 0x42, 0xd1, 0x7d, 0x22, 0x5e, 0x3b, 0x65, 0x22, 0x4c, 0x75, 0x06, 0xa4, 0xad,
+    0xe6, 0xb8, 0x30, 0x49, 0xe0, 0x6d, 0x83, 0x5e, 0x06, 0x29, 0x60, 0x46, 0x2b, 0x6c, 0x03, 0x2a,
+    0x4b, 0x2e, 0x7a, 0xe6, 0x90, 0x42, 0x64, 0xc9, 0x5c, 0x2f, 0x83, 0x24, 0x88, 0x1b, 0xda, 0x8c,
+    0x24, 0xe5, 0x79, 0xae, 0x7c, 0x7d, 0x38, 0x81, 0x5b, 0x20, 0x9f, 0xb2, 0x69, 0xb8, 0x09, 0xf4,
+    0x2e, 0x42, 0xdf, 0xfe, 0xbd, 0xf3, 0xdd, 0x90, 0x85, 0x8a, 0xb7, 0x23, 0x8a, 0x92, 0x60, 0xdb,
+    0xcb, 0x32, 0x32, 0x79, 0xe2, 0x95, 0xf6, 0x66, 0xae, 0x9c, 0xdd, 0x46, 0x0a, 0xc4, 0xfb, 0x0b,
+    0x37, 0x32, 0x61, 0x6d, 0x53, 0x71, 0x8a, 0x7c, 0x77, 0x05, 0xf8, 0x54, 0xe0, 0x39, 0x17, 0xe2,
+    0x78, 0xc5, 0x2d, 0x73, 0x51, 0x2a, 0x5e, 0x62, 0x86, 0x06, 0xa7, 0xd1, 0x0e, 0xda, 0x8c, 0xc3,
+    0x85, 0xfe, 0x37, 0xc4, 0xbe, 0x47, 0x4b, 0xc8, 0x34, 0xcf, 0x12, 0x87, 0x82, 0x53, 0xce, 0x2e,
+    0x03, 0xa3, 0xbe, 0x63, 0x8e, 0xa6, 0x3c, 0xc7, 0x19, 0x7f, 0x08, 0xee, 0xa4, 0x0a, 0x39, 0x83,
+    0x40, 0x96, 0x52, 0xef, 0x7c, 0xd7, 0x2b, 0xad, 0x2d, 0x4c, 0x01, 0x30, 0xe3, 0x78, 0xd3, 0xb2,
+    0x09, 0xf6, 0xef, 0x15, 0x81, 0x7a, 0xdd, 0x6a, 0x29, 0x3e, 0xdf, 0x97, 0x21, 0xd7, 0xdc, 0xb1,
+    0xe0, 0x76, 0x52, 0xdd, 0x4a, 0xc1, 0x25, 0xc1, 0xc3, 0x35, 0xff, 0x92, 0x95, 0x8f, 0xc2, 0x59,
+    0xee, 0x49, 0x3f, 0x46, 0xc7, 0x5b, 0xd1, 0x39, 0x2d, 0x6f, 0x11, 0x84, 0xa4, 0x5b, 0x73, 0x4e,
+    0xaa, 0xa8, 0x22, 0x63, 0xd0, 0x16, 0x93, 0x55, 0x1e, 0xd8, 0x14, 0x0f, 0x31, 0xe7, 0x6d, 0xc9,
+    0xca, 0xb4, 0x9e, 0x5d, 0xb9, 0xf9, 0x50, 0x89, 0x54, 0x54, 0x13, 0xac, 0x60, 0xd8, 0x14, 0x9a,
+    0x85, 0xee, 0x7f, 0xdf, 0xf8, 0x1b, 0xe8, 0x30, 0xde, 0x83, 0x32, 0x25, 0xfd, 0xde, 0xbb, 0x82,
+    0x32, 0xd4, 0xad, 0x27, 0x0f, 0x19, 0x16, 0xb4, 0xe2, 0xbb, 0x0b, 0x6f, 0x9c, 0x4e, 0x7c, 0x05,
+    0x33, 0x88, 0x10, 0xf0, 0x20, 0xa4, 0x50, 0x00, 0x79, 0xc6, 0x45, 0x33, 0xc1, 0xb5, 0x55, 0x01,
+    0x93, 0x87, 0x6f, 0x07, 0xb6, 0xbb, 0x5f, 0x77, 0xe1, 0xfe, 0x8e, 0x34, 0x92, 0xf3, 0xba, 0x1a,
+    0x10, 0xfe, 0x63, 0xb8, 0x44, 0x1b, 0x99, 0x9c, 0x4c, 0x18, 0x75, 0xf2, 0xd5, 0xe8, 0x77, 0x3d,
+    0x65, 0xec, 0x6f, 0xbb, 0x80, 0x49, 0x73, 0xde, 0x1a, 0x5f, 0x5e, 0x55, 0x20, 0x90, 0xe3, 0xea,
+    0x4a, 0x57, 0x89, 0x63, 0x83, 0xa4, 0xc9, 0x58, 0x02, 0x24, 0x37, 0x49, 0x48, 0xe5, 0xb4, 0x2d,
+    0x0d, 0xdd, 0x2c, 0xb6, 0x98, 0xea, 0x13, 0x0c, 0x0b, 0x1e, 0xf0, 0x1e, 0xd3, 0x35, 0x1d, 0x5d,
+    0xc8, 0xd7, 0x2f, 0xe5, 0xb9, 0x50, 0x1c, 0xdc, 0xd7, 0x8f, 0x75, 0x59, 0x33, 0x57, 0xae, 0xb8,
+    0x03, 0x7b, 0x5c, 0x3c, 0xe4, 0x94, 0xb1, 0x81, 0x8b, 0xc9, 0xc6, 0x8e, 0x4d, 0xa0, 0x1a, 0x69,
+    0xe4, 0x2d, 0xff, 0x3c, 0x2a, 0x8f, 0x90, 0xfd, 0x56, 0xf4, 0xca, 0x75, 0xae, 0x00, 0x74, 0x86,
+    0x79, 0xa7, 0xe7, 0xf3, 0x9e, 0x98, 0xdc, 0x65, 0xbc, 0xb8, 0xa9, 0x77, 0xdd, 0xa2, 0xfd, 0xf3,
+    0xd7, 0x12, 0xd6, 0x48, 0xb9, 0x47, 0x2e, 0x02, 0xb8, 0x0a, 0x97, 0x25, 0xd3, 0x50, 0xa1, 0xdf,
+    0x67, 0x82, 0x83, 0xe6, 0xc4, 0x10, 0xd8, 0xd3, 0xe5, 0xfc, 0x1c, 0x52, 0xd4, 0xe3, 0x19, 0xed,
+    0xac, 0xeb, 0x86, 0xcb, 0x0e, 0x29, 0x5d, 0xab, 0xb9, 0x2c, 0x38, 0x4a, 0x0d, 0x21, 0xe1, 0x7c,
+    0x46, 0x89, 0x55, 0xf2, 0x67, 0x47, 0x5a, 0x28, 0x81, 0xc6, 0xe5, 0xfb, 0x76, 0xe5, 0x12, 0x46,
+    0xbe, 0x7a, 0xf4, 0xaa, 0xab, 0xa8, 0x14, 0x4e, 0x92, 0x15, 0xb9, 0x32, 0xcc, 0x16, 0xcd, 0x24,
+    0x68, 0xcb, 0x0d, 0x47, 0xfc, 0x9f, 0xe2, 0x77, 0x83, 0x71, 0xda, 0x96, 0x73, 0x4f, 0x82, 0xad,
+    0x73, 0xd3, 0xd8, 0xd8, 0x57, 0x64, 0x7b, 0x5d, 0x6e, 0x26, 0x6f, 0x73, 0x49, 0x93, 0x9d, 0x83,
+    0xa4, 0x01, 0xc2, 0x91, 0x67, 0xc6, 0xb7, 0x43, 0xc5, 0x44, 0xa8, 0x9b, 0x88, 0xe9, 0x37, 0xc3,
+    0x63, 0x93, 0xd2, 0x90, 0xd8, 0xf5, 0x7a, 0x0d, 0x63, 0x79, 0xfb, 0xbb, 0x98, 0x40, 0x60, 0x95,
+    0x2f, 0x2b, 0x3c, 0xaa, 0xd0, 0xc4, 0x42, 0x7a, 0x91, 0x70, 0x21, 0x89, 0x25, 0x67, 0x3c, 0x8f,
+    0xc3, 0x30, 0xed, 0x0e, 0xa1, 0xbf, 0x44, 0xa7, 0x38, 0xef, 0xe2, 0xc9, 0x42, 0xdb, 0xe7, 0xd6,
+    0x75, 0xbf, 0x74, 0xf3, 0x57, 0xb6, 0x7b, 0x36, 0x1f, 0x0b, 0xab, 0x94, 0xac, 0x29, 0x3b, 0xa0,
+    0x8d, 0x94, 0x16, 0x5b, 0x90, 0x3f, 0x81, 0x0e, 0x20, 0xb7, 0xdf, 0x83, 0x2c, 0xf8, 0x2f, 0x36,
+    0xc4, 0x3c, 0x94, 0x8c, 0xd2, 0x14, 0x79, 0x2a, 0x57, 0xbe, 0x83, 0x35, 0x9c, 0xf5, 0x9c, 0xca,
+    0x19, 0x1e, 0xc4, 0x7c, 0xc4, 0xc6, 0x13, 0x6b, 0x1a, 0xa7, 0x26, 0x28, 0xf6, 0xf6, 0xbd, 0x58,
+    0xbc, 0x7a, 0xb7, 0x3d, 0x96, 0x80, 0xa2, 0x6d, 0x63, 0x55, 0x94, 0xbb, 0xba, 0x9b, 0xa1, 0x0f,
+    0x19, 0xd0, 0x9e, 0x21, 0xd6, 0x93, 0xfb, 0x30, 0xc4, 0xe4, 0x52, 0x92, 0xf2, 0x7a, 0xd4, 0xb7,
+    0xed, 0x4d, 0x68, 0xf2, 0x32, 0x32, 0x5b, 0xe3, 0xd8, 0x40, 0x2b, 0x11, 0x16, 0x31, 0xdc, 0xd1,
+    0x13, 0x43, 0x58, 0x55, 0x82, 0xa6, 0x80, 0x0c, 0x22, 0xd1, 0x82, 0xe0, 0x4b, 0x0a, 0xd9, 0x72,
+    0xa4, 0x78, 0xb5, 0x3e, 0x62, 0xf4, 0x2f, 0x5c, 0x95, 0xe2, 0x69, 0x6b, 0x1c, 0x86, 0xc5, 0x2f,
+    0xc2, 0x5f, 0xab, 0x80, 0x3d, 0xb5, 0xb5, 0xd3, 0x0d, 0x38, 0x8c, 0xdd, 0x62, 0xf9, 0x26, 0x54,
+    0xed, 0xfe, 0x86, 0xec, 0x83, 0x70, 0x3d, 0x9a, 0xb9, 0x3f, 0xc9, 0x41, 0xbc, 0x9b, 0xcc, 0x94,
+    0xba, 0xda, 0x12, 0x9a, 0xed, 0xfc, 0x3d, 0x4a, 0x4d, 0xf8, 0xd3, 0x1d, 0xdf, 0x4e, 0x6e, 0x6d,
+    0x47, 0x8c, 0xbc, 0x9a, 0x41, 0x6b, 0x95, 0x06, 0x04, 0xca, 0xd4, 0x4f, 0xb6, 0x25, 0xc4, 0xe5,
+    0x30, 0x17, 0xfe, 0x3a, 0xbe, 0xed, 0x53, 0xa3, 0x8e, 0xbf, 0xa9, 0x33, 0x65, 0x5f, 0x92, 0x83,
+    0x16, 0x8d, 0x7c, 0xa1, 0x9d, 0x06, 0x6c, 0x20, 0xb8, 0xc2, 0xcb, 0xd3, 0xd3, 0x43, 0xda, 0xd9,
+    0xf1, 0xf9, 0x32, 0x70, 0x2b, 0xf1, 0x6b, 0xd4, 0x55, 0x61, 0xa3, 0x09, 0xe9, 0xcc, 0xcd, 0x84,
+    0xad, 0x2c, 0x52, 0x1b, 0xa1, 0xe8, 0xc4, 0x30, 0x63, 0xcb, 0x2d, 0x1c, 0x41, 0xdd, 0x4f, 0x26,
+    0x5e, 0x05, 0x2a, 0x09, 0xb9, 0xd8, 0x04, 0x1d, 0x93, 0x7b, 0x08, 0xd2, 0xfa, 0xc1, 0x4d, 0x71,
+    0xe6, 0xdb, 0x26, 0x31, 0x81, 0x5b, 0x8c, 0xaa, 0x6a, 0x18, 0x97, 0xdb, 0x70, 0xa4, 0x36, 0xac,
+    0x79, 0x08, 0x38, 0x4b, 0x65, 0x82, 0xaf, 0xe4, 0xf5, 0xe3, 0x4c, 0xef, 0xf9, 0x9e, 0xdb, 0xfc,
+    0x51, 0x25, 0x03, 0x09, 0x93, 0xda, 0xa2, 0x1c, 0x50, 0x55, 0xc8, 0x3b, 0x70, 0xe5, 0xbb, 0x95,
+    0x5f, 0xa9, 0xe0, 0xdf, 0xd4, 0xbd, 0xaa, 0xf4, 0x08, 0xa8, 0xd4, 0xc7, 0x69, 0xdd, 0x58, 0xab,
+    0x79, 0x75, 0xb6, 0xc9, 0xab, 0xfc, 0x46, 0xf2, 0x78, 0x1c, 0x58, 0x83, 0x30, 0x3c, 0x8e, 0xc9,
+    0xa5, 0xa6, 0x8c, 0x83, 0xa9, 0x4e, 0x21, 0xc7, 0x67, 0x75, 0x59, 0x92, 0x86, 0xbc, 0xc4, 0x2c,
+    0x27, 0xd5, 0x4b, 0x11, 0x0d, 0x04, 0x4b, 0xd5, 0x07, 0x64, 0x61, 0x13, 0x1d, 0x2a, 0x09, 0xf7,
+    0x5c, 0xc7, 0x5d, 0x1e, 0x28, 0xd2, 0x4e, 0xdd, 0xca, 0xa8, 0xae, 0x7e, 0xb8, 0xb9, 0x56, 0x34,
+    0x0a, 0x36, 0xe1, 0xbe, 0x23, 0x40, 0x8b, 0x92, 0xfd, 0x2c, 0x5f, 0xda, 0x4d, 0x97, 0xb6, 0xff,
+    0x58, 0xf9, 0xbe, 0x64, 0xb9, 0x1b, 0x77, 0xee, 0x0c, 0x82, 0xb4, 0xed, 0x1b, 0x2b, 0x7c, 0x0f,
+    0x73, 0xdd, 0xf7, 0x6c, 0x75, 0x28, 0x1b, 0xfb, 0x4f, 0x79, 0xa4, 0x3b, 0x50, 0x7b, 0xbf, 0xee,
+    0xa0, 0xf2, 0xba, 0x60, 0xf7, 0x4d, 0xb2, 0x4d, 0x4b, 0x18, 0xa9, 0x7d, 0x1e, 0xeb, 0xb8, 0xe7,
+    0xb5, 0xfd, 0x97, 0x64, 0x5f, 0x71, 0x47, 0xd5, 0x08, 0x0a, 0x84, 0x07, 0x84, 0x43, 0x92, 0x59,
+    0xdc, 0x8d, 0xdd, 0x79, 0x05, 0x87, 0xaa, 0x1e, 0xd1, 0x59, 0x26, 0x3e, 0x87, 0xe4, 0x8f, 0xa0,
+    0x5b, 0x40, 0xaa, 0x86, 0xaa, 0x8e, 0x9a, 0x8d, 0x18, 0x3c, 0x1e, 0x77, 0x98, 0x6d, 0x55, 0x0e,
+    0xda, 0x45, 0x16, 0x85, 0x87, 0x16, 0x8c, 0xb0, 0x50, 0xfa, 0xf7, 0xf8, 0xc7, 0xc7, 0xa1, 0xe4,
+    0x54, 0x28, 0x42, 0x8e, 0x21, 0x5b, 0x6e, 0x0c, 0x5b, 0x0a, 0x91, 0x07, 0x8a, 0x77, 0xbc, 0xb3,
+    0x85, 0x39, 0x2f, 0xc9, 0x89, 0x67, 0x3b, 0x2b, 0x59, 0x5a, 0xe3, 0x77, 0x40, 0x1b, 0x06, 0x25,
+    0x91, 0xe7, 0x1e, 0x4c, 0x3c, 0x08, 0xd2, 0x7e, 0x00, 0xea, 0x69, 0xa0, 0x97, 0x74, 0xf5, 0x36,
+    0x19, 0x05, 0x59, 0xd9, 0x64, 0x77, 0xe9, 0x80, 0x63, 0xd4, 0xd5, 0x8e, 0x32, 0xd2, 0x6a, 0x19,
+    0x1e, 0x49, 0xae, 0x07, 0xd5, 0xa9, 0x72, 0x75, 0xbd, 0x6f, 0xaa, 0xb7, 0x09, 0x68, 0xbf, 0x6c,
+    0x6b, 0x75, 0xe0, 0x71, 0xb8, 0xd1, 0x1b, 0xc9, 0xaa, 0x11, 0x14, 0xfb, 0xa7, 0xe1, 0x35, 0x6b,
+    0xd5, 0xdd, 0x06, 0xd9, 0x9e, 0x0e, 0x67, 0x6e, 0xa9, 0x56, 0x66, 0x2c, 0x91, 0xac, 0x7c, 0x9c,
+    0xd4, 0x2e, 0x67, 0xf7, 0x17, 0x18, 0x43, 0x6c, 0x0b, 0xd7, 0x26, 0x37, 0x95, 0x5e, 0xa8, 0xc2,
+    0x5a, 0x9b, 0x39, 0x63, 0x54, 0x24, 0x0d, 0x1c, 0x06, 0xc4, 0x46, 0xc1, 0x41, 0xb6, 0x45, 0xf2,
+    0x49, 0x3b, 0x4a, 0x89, 0x1c, 0x09, 0x81, 0xe3, 0xb5, 0xfe, 0xe6, 0xfd, 0x7f, 0xef, 0x86, 0xd8,
+    0xa5, 0xa8, 0x0f, 0x00, 0x30, 0xf9, 0xfe, 0x1f, 0x8e, 0x9c, 0xdf, 0xd4, 0x19, 0x73, 0x4a, 0xae,
+    0x90, 0x11, 0x16, 0xac, 0x9a, 0xf0, 0xc0, 0x1b, 0x0f, 0x3c, 0xa6, 0xa4, 0xcf, 0xd9, 0xf1, 0x9f,
+    0x5c, 0x98, 0x9e, 0xf3, 0xaf, 0x7e, 0xb4, 0x80, 0xa2, 0x84, 0x03, 0xe4, 0x72, 0x0f, 0x92, 0xe0,
+    0x90, 0xe2, 0x45, 0x73, 0x4d, 0x51, 0xf5, 0x04, 0x15, 0x70, 0x0f, 0x2a, 0x4b, 0x82, 0x9a, 0x0f,
+    0xe7, 0xb4, 0x77, 0x9e, 0x31, 0xe5, 0xc9, 0x8a, 0xa5, 0x9a, 0xf8, 0x06, 0x61, 0xa4, 0x52, 0x58,
+    0xde, 0x8f, 0x84, 0x6e, 0x1b, 0x10, 0x92, 0x9f, 0x5e, 0x82, 0x50, 0x61, 0x6a, 0x47, 0x0b, 0xcf,
+    0x06, 0xe8, 0x24, 0x7c, 0x24, 0x26, 0xce, 0x28, 0x57, 0x31, 0x04, 0xcd, 0xbc, 0x6a, 0x72, 0xb4,
+    0xc2, 0x09, 0xa2, 0x31, 0xb1, 0xa3, 0x88, 0xcc, 0xe3, 0x4f, 0x19, 0xb2, 0x78, 0xd2, 0x29, 0xdf,
+    0xd6, 0x80, 0xe3, 0x36, 0x8a, 0x97, 0x91, 0x85, 0x9f, 0xeb, 0xcc, 0x09, 0x46, 0x05, 0xbb, 0x0b,
+    0x56, 0x40, 0x0c, 0x98, 0x7f, 0x31, 0x8b, 0xb8, 0x0e, 0x36, 0x93, 0xd3, 0xb4, 0xf2, 0xba, 0x52,
+    0x6d, 0x1f, 0x99, 0x06, 0x9e, 0x96, 0x3d, 0x56, 0x82, 0xc4, 0xf3, 0x69, 0xb1, 0x68, 0x93, 0x1b,
+    0x9a, 0xfb, 0x64, 0x43, 0xa2, 0x49, 0x8a, 0xf9, 0x6d, 0x23, 0xe5, 0x7e, 0x76, 0x06, 0x27, 0x7f,
+    0x19, 0x13, 0x4e, 0x94, 0x61, 0x23, 0x55, 0x53, 0xeb, 0xbd, 0x03, 0x87, 0x39, 0x9a, 0xdd, 0x30,
+    0xe0, 0x79, 0x3f, 0x9b, 0x5e, 0xf6, 0xaf, 0x15, 0x8d, 0xb2, 0xff, 0xba, 0x12, 0x3a, 0xe5, 0x98,
+    0xee, 0xe4, 0x88, 0x48, 0xb6, 0x0d, 0x83, 0x70, 0xae, 0x23, 0xa6, 0x18, 0xa1, 0x52, 0xdb, 0xac,
+    0x7a, 0x67, 0x80, 0x5e, 0x89, 0x0f, 0x1f, 0xf4, 0x96, 0xa1, 0x65, 0x1d, 0x20, 0x08, 0xba, 0x4c,
+    0x94, 0xa8, 0xc5, 0x67, 0x91, 0x5b, 0x4c, 0xa0, 0xe8, 0x47, 0x19, 0x44, 0x99, 0xc0, 0xaf, 0x04,
+    0xa9, 0xe1, 0x24, 0x97, 0x47, 0x07, 0x8b, 0xef, 0x2d, 0x1a, 0x60, 0x1b, 0xec, 0x01, 0xf5, 0x7e,
+    0xe4, 0x9b, 0xbe, 0x6f, 0x20, 0x21, 0xc2, 0xde, 0x44, 0x74, 0xef, 0x1a, 0x63, 0xc8, 0x81, 0xf5,
+    0x2f, 0x96, 0xe9, 0xbc, 0xe0, 0x5d, 0xa5, 0xb5, 0x7a, 0x5f, 0x6e, 0xc3, 0x2d, 0x80, 0x8c, 0x56,
+    0xe6, 0x75, 0x81, 0x49, 0x68, 0x39, 0x5d, 0x96, 0x2c, 0x58, 0x83, 0x42, 0xa2, 0xd6, 0x3e, 0xe0,
+    0x0b, 0xe9, 0x2d, 0x40, 0x2b, 0xa7, 0x5d, 0x17, 0xab, 0x2c, 0x9d, 0x5c, 0x76, 0x00, 0x4d, 0x6c,
+    0x4e, 0x38, 0xa4, 0x1c, 0x26, 0x24, 0x10, 0x18, 0xa0, 0x28, 0xb5, 0x35, 0x0d, 0x72, 0x3a, 0xfd,
+    0x99, 0x16, 0xfd, 0x4c, 0x37, 0x64, 0x1f, 0xb3, 0xb3, 0x77, 0x5f, 0xe5, 0xaa, 0x7e, 0x8d, 0xab,
+    0x2c, 0xc6, 0xc5, 0x89, 0xcb, 0x39, 0x02, 0x5d, 0x35, 0xe2, 0x4c, 0x0e, 0x74, 0x5f, 0x76, 0x9f,
+    0xf9, 0x17, 0x11, 0xd1, 0x20, 0x31, 0x1f, 0xd6, 0x1a, 0x32, 0x0d, 0xed, 0x99, 0xdb, 0xd4, 0xf2,
+    0xf1, 0x1e, 0x32, 0xb4, 0x01, 0xfa, 0xb9, 0x45, 0x53, 0xae, 0x65, 0x7f, 0xf5, 0xbc, 0x2b, 0xbd,
+    0x0b, 0x42, 0x58, 0x8d, 0xb3, 0x48, 0x09, 0xa4, 0x4e, 0x9b, 0x3c, 0xca, 0x6e, 0xbd, 0x9a, 0x24,
+    0x5c, 0xc7, 0x1b, 0x72, 0xb0, 0x48, 0x9f, 0xa2, 0x96, 0x95, 0x6b, 0x25, 0xda, 0xc1, 0x6c, 0x1f,
+    0x34, 0x83, 0x91, 0x7d, 0x3e, 0x38, 0xcb, 0x31, 0xab, 0xa7, 0xac, 0xa1, 0xb0, 0x2c, 0x78, 0x9f,
+    0x6a, 0x83, 0x37, 0x6f, 0x2d, 0x87, 0xa5, 0x6e, 0x57, 0xb3, 0x78, 0xb9, 0xc8, 0xf4, 0xb5, 0xc4,
+    0xe0, 0x7f, 0x56, 0x41, 0x78, 0xb8, 0x6c, 0x8e, 0x98, 0xa0, 0x2a, 0xd5, 0x92, 0x0c, 0x18, 0xfa,
+    0x43, 0x70, 0xee, 0x6b, 0x06, 0x50, 0x5b, 0xa8, 0x7e, 0xa7, 0x0d, 0xb5, 0x58, 0xb2, 0xa6, 0xda,
+    0x58, 0x70, 0x74, 0x2b, 0x75, 0x5b, 0x97, 0xa4, 0x24, 0xa6, 0x32, 0xcd, 0x2f, 0xde, 0xf8, 0xfa,
+    0x03, 0x6d, 0x03, 0x2b, 0xa6, 0x44, 0x52, 0xac, 0xde, 0xfe, 0xcd, 0x21, 0x01, 0x14, 0x3b, 0xa9,
+    0xbb, 0x5a, 0x12, 0xb7, 0xb3, 0x64, 0xfa, 0xff, 0x43, 0x86, 0xef, 0xcd, 0x75, 0x8c, 0xb6, 0xc5,
+    0xca, 0x9e, 0xfa, 0x90, 0xf6, 0xcb, 0xcb, 0xd4, 0x43, 0x23, 0xc3, 0xa8, 0xb5, 0x6b, 0x7e, 0x08,
+    0x1a, 0x7d, 0x28, 0x5b, 0x14, 0x50, 0x27, 0xa3, 0x2c, 0x37, 0x43, 0xaf, 0x1d, 0xba, 0x76, 0xd8,
+    0x24, 0xe4, 0xa3, 0xbe, 0x89, 0x6a, 0x28, 0x91, 0x3e, 0xdb, 0x10, 0xfd, 0x7f, 0xa8, 0x5c, 0xe1,
+    0x94, 0xf4, 0xf3, 0xe9, 0x37, 0xa4, 0x41, 0x5c, 0x07, 0x1a, 0x15, 0x1f, 0xaf, 0x90, 0x0f, 0xae,
+    0xf5, 0x39, 0x2f, 0x00, 0x92, 0x56, 0x2a, 0x88, 0x6d, 0x2e, 0x74, 0x51, 0xc6, 0xd5, 0x2b, 0x76,
+    0xd6, 0xe1, 0xed, 0x17, 0x32, 0xc8, 0x39, 0x6c, 0xe3, 0x31, 0xfa, 0x8e, 0x0a, 0x2f, 0xcd, 0xc6,
+    0x62, 0x4e, 0x53, 0x90, 0xa0, 0x74, 0xa0, 0x88, 0x2b, 0xe8, 0x68, 0x1a, 0x4a, 0xe7, 0x2d, 0x65,
+    0xb1, 0x7a, 0x01, 0xe6, 0x63, 0xd9, 0xc5, 0x92, 0xbd, 0x48, 0x7d, 0xea, 0xa0, 0x31, 0xc1, 0xc7,
+    0xbc, 0xe9, 0x31, 0x07, 0x8d, 0x39, 0xc2, 0x42, 0x62, 0x3f, 0x65, 0x0e, 0xb0, 0x90, 0xff, 0x72,
+    0x2e, 0xc0, 0xf5, 0xf5, 0x58, 0xa1, 0xbb, 0x67, 0xb8, 0x9f, 0x69, 0xfb, 0x6f, 0xe9, 0xb2, 0xf6,
+    0x3e, 0xba, 0x0c, 0x2c, 0x5f, 0xa0, 0xcb, 0xf8, 0x5d, 0x90, 0x49, 0x9e, 0x4e, 0x86, 0x8c, 0xc2,
+    0x7e, 0x82, 0x90, 0x12, 0x69, 0x59, 0x24, 0xb7, 0xce, 0x61, 0x10, 0x1a, 0xfd, 0xcf, 0xbd, 0x6a,
+    0xf2, 0xd4, 0x20, 0x59, 0xeb, 0x26, 0x5f, 0x66, 0x21, 0xdb, 0xa6, 0x47, 0x6c, 0x70, 0xfe, 0x71,
+    0x7a, 0x34, 0x68, 0x8e, 0x10, 0xce, 0x20, 0xc1, 0xf4, 0xe9, 0xce, 0xea, 0xef, 0x8f, 0x3e, 0xe4,
+    0x2d, 0xb0, 0x1c, 0x0c, 0xf5, 0xcd, 0xf3, 0xb0, 0x95, 0x96, 0x3b, 0xe8, 0x16, 0x60, 0xb2, 0x6a,
+    0x32, 0xd2, 0x36, 0x75, 0x32, 0x87, 0xa9, 0x43, 0xf9, 0xa2, 0xa6, 0xe9, 0x7c, 0xc8, 0xf8, 0x0a,
+    0x6e, 0xc7, 0x2a, 0x34, 0x7a, 0x81, 0xdd, 0xca, 0x75, 0xc6, 0xcb, 0x4d, 0x6b, 0x02, 0xe5, 0x83,
+    0x00, 0x6d, 0xe2, 0x82, 0xc2, 0x80, 0xaa, 0x95, 0x6a, 0x33, 0xd7, 0xfe, 0x91, 0x51, 0xa3, 0x21,
+    0x08, 0x08, 0x3a, 0x3a, 0x2e, 0xc0, 0xf4, 0x69, 0x05, 0xd8, 0x7c, 0x7e, 0x85, 0xc5, 0x45, 0x6f,
+    0xc3, 0x62, 0x04, 0x64, 0x8a, 0x8b, 0xec, 0x42, 0x42, 0x33, 0x4e, 0x03, 0xae, 0x54, 0x3d, 0x59,
+    0x14, 0xa7, 0x69, 0xd6, 0x05, 0x9e, 0x88, 0x01, 0x3c, 0x18, 0x9f, 0x6b, 0xbc, 0xa6, 0xd5, 0x87,
+    0x6c, 0xfd, 0xd0, 0xbb, 0x65, 0xa6, 0x10, 0x91, 0x21, 0xb0, 0x85, 0x2d, 0xb9, 0xfc, 0x89, 0x64,
+    0x9b, 0xf3, 0x91, 0x49, 0x60, 0xc9, 0x52, 0x69, 0x3b, 0xa2, 0x86, 0x81, 0x76, 0x74, 0x26, 0x4a,
+    0x8f, 0xb9, 0x36, 0xfa, 0xb1, 0x8a, 0x42, 0x6b, 0xa6, 0xd1, 0x06, 0x2a, 0x67, 0x1c, 0x35, 0x3b,
+    0xe1, 0x14, 0x4f, 0x0c, 0xcb, 0x46, 0x50, 0x1b, 0x78, 0xdf, 0x99, 0x14, 0xfe, 0x4c, 0xd4, 0x64,
+    0x77, 0xba, 0x74, 0xdc, 0x44, 0x40, 0x1d, 0x7e, 0xb1, 0x1f, 0x04, 0xdd, 0xd5, 0xf0, 0x80, 0x03,
+    0x3d, 0x6c, 0x20, 0x2c, 0x13, 0x11, 0xa6, 0x98, 0x89, 0x51, 0xd7, 0x82, 0xfe, 0xdd, 0xaa, 0x9f,
+    0x03, 0x2b, 0x26, 0x82, 0x2b, 0xd7, 0x43, 0x48, 0x7e, 0x52, 0x14, 0x3d, 0x5f, 0xed, 0x73, 0xde,
+    0x44, 0xf7, 0x6a, 0x8d, 0x5a, 0xd2, 0xa2, 0xb0, 0x82, 0x7a, 0xfb, 0x97, 0x4c, 0x71, 0x61, 0xe5,
+    0x4d, 0xd2, 0xd6, 0xcb, 0xa9, 0xb3, 0xcd, 0x51, 0x58, 0x02, 0xb8, 0x05, 0x92, 0x16, 0x1b, 0xbc,
+    0x6f, 0x0f, 0x58, 0x37, 0xef, 0x2f, 0xf6, 0x22, 0xb7, 0x7f, 0xeb, 0xf0, 0xbe, 0x4f, 0x36, 0x48,
+    0x78, 0xb8, 0x3b, 0x59, 0x0c, 0x4b, 0x61, 0x37, 0x5d, 0x7c, 0x77, 0xa3, 0xb3, 0xa7, 0x6f, 0xe3,
+    0x26, 0xf6, 0x50, 0x9f, 0x6e, 0x6c, 0x6b, 0x17, 0x22, 0x3b, 0x4c, 0x83, 0x13, 0x44, 0x29, 0x98,
+    0x38, 0xc6, 0xa4, 0x7b, 0xb5, 0xbc, 0x55, 0x2d, 0xa5, 0xc8, 0x3f, 0x0b, 0x3b, 0xd3, 0xc7, 0x32,
+    0x97, 0xde, 0x11, 0x0d, 0x47, 0xf3, 0xa2, 0x93, 0x47, 0xb2, 0xdd, 0x53, 0xa7, 0x1c, 0xac, 0x97,
+    0x96, 0x4d, 0xb0, 0x85, 0xcd, 0x3c, 0x52, 0xb1, 0xd0, 0x2d, 0xcd, 0x26, 0xad, 0x38, 0xe8, 0xf4,
+    0xf3, 0x24, 0xf9, 0x30, 0xb9, 0x73, 0x1d, 0xb6, 0x61, 0xae, 0x02, 0xf3, 0xf7, 0xb4, 0x3b, 0x84,
+    0xb5, 0x64, 0x93, 0x31, 0xa5, 0x07, 0xd3, 0x15, 0x08, 0x5b, 0x79, 0x0e, 0x03, 0x15, 0x17, 0xfc,
+    0xb5, 0xe4, 0xc1, 0x17, 0x78, 0xb8, 0xea, 0x04, 0x2d, 0xc0, 0x82, 0xe7, 0x50, 0x26, 0xab, 0xc3,
+    0x7d, 0x64, 0xf3, 0x16, 0x20, 0x7a, 0xd7, 0x3f, 0xfd, 0xa1, 0x6c, 0xfc, 0x0d, 0xdf, 0x7f, 0xc2,
+    0x3b, 0x28, 0x98, 0x63, 0x0f, 0xc3, 0x36, 0xc3, 0xf6, 0x33, 0x9e, 0x94, 0xdb, 0xe2, 0x46, 0xc8,
+    0xff, 0x23, 0xce, 0x1d, 0xb4, 0x8b, 0xa3, 0xaf, 0x3a, 0x70, 0x1c, 0xdd, 0xe0, 0x16, 0xbf, 0xc1,
+    0x5f, 0xf6, 0x8c, 0x9e, 0x3d, 0xfc, 0x6a, 0x8b, 0x21, 0xf5, 0x6b, 0xc7, 0x70, 0x7f, 0x5a, 0xde,
+    0x8b, 0x18, 0x88, 0x04, 0xb3, 0x05, 0xca, 0xfb, 0x83, 0xd8, 0xc7, 0x4d, 0x17, 0xe9, 0xc7, 0xc0,
+    0x0c, 0x3a, 0x72, 0x83, 0xd5, 0x6b, 0x2e, 0x6b, 0xaa, 0xae, 0x4d, 0x55, 0x52, 0xda, 0xf1, 0x8e,
+    0x42, 0x13, 0xbe, 0x4b, 0xfd, 0x45, 0x88, 0x48, 0xf7, 0xc9, 0xfc, 0xbd, 0xa2, 0xbf, 0x65, 0xd2,
+    0x82, 0x1b, 0xd6, 0x29, 0xda, 0x35, 0xd8, 0x0c, 0x7e, 0x0e, 0x17, 0x3c, 0xf7, 0xf1, 0x84, 0x5b,
+    0x33, 0x85, 0x05, 0x96, 0x49, 0x3d, 0xd2, 0x5f, 0xdc, 0x69, 0x49, 0x28, 0x9f, 0xd1, 0x1c, 0x52,
+    0x2b, 0x6a, 0x20, 0xcc, 0x6d, 0x50, 0x05, 0x69, 0x26, 0x2e, 0xa6, 0x5d, 0x91, 0x14, 0xf5, 0x1e,
+    0x30, 0xa6, 0xf6, 0xcd, 0x35, 0xcf, 0x32, 0x4b, 0x01, 0x67, 0x97, 0x1a, 0x1d, 0xd0, 0x5f, 0x00,
+    0x56, 0xa0, 0x89, 0x1b, 0x9c, 0x78, 0xe3, 0x16, 0x4a, 0xab, 0xc4, 0x6d, 0xd8, 0xa3, 0xf1, 0x1d,
+    0x23, 0x01, 0x83, 0xfc, 0xbe, 0xb5, 0xed, 0x41, 0xc9, 0xbc, 0xce, 0x85, 0x6e, 0x54, 0xae, 0xac,
+    0x8f, 0x76, 0x66, 0x55, 0x4f, 0x0b, 0xbe, 0xa5, 0x53, 0x35, 0xa1, 0x56, 0x00, 0x4c, 0xdd, 0x51,
+    0xd9, 0xbc, 0x30, 0xfc, 0x70, 0x05, 0xbb, 0x95, 0x49, 0xd2, 0xf4, 0x5f, 0x34, 0x31, 0x32, 0x4a,
+    0xfd, 0x88, 0xfe, 0x51, 0x56, 0x90, 0xb4, 0xec, 0xb1, 0xaa, 0x4e, 0x70, 0x4f, 0x51, 0x4d, 0x90,
+    0xbd, 0xf3, 0x92, 0xad, 0xee, 0xe8, 0x0c, 0x37, 0x12, 0x80, 0x3a, 0x79, 0x46, 0x2e, 0xff, 0xee,
+    0x9d, 0x34, 0xa3, 0x7d, 0x13, 0xcc, 0x3f, 0x34, 0xe2, 0xe5, 0x20, 0x10, 0xd9, 0x67, 0x23, 0xd8,
+    0x79, 0xae, 0x5f, 0x05, 0x5c, 0x9c, 0xc5, 0x32, 0xcc, 0x7d, 0x3a, 0x5a, 0x3f, 0x18, 0xf0, 0x99,
+    0xed, 0xf4, 0xd2, 0x46, 0x24, 0xef, 0xf9, 0x8a, 0x9a, 0xe6, 0x25, 0x1d, 0x1c, 0x01, 0xc9, 0x0d,
+    0x83, 0x92, 0x8a, 0x4d, 0xf2, 0xae, 0x03, 0xbb, 0x92, 0x2e, 0x32, 0xa5, 0x2a, 0x48, 0xdc, 0x6d,
+    0x4f, 0xde, 0x74, 0x6e, 0xc1, 0x44, 0xf8, 0x58, 0x10, 0x96, 0xf4, 0xa5, 0xe7, 0xe6, 0x25, 0xcb,
+    0x29, 0x81, 0xa9, 0x22, 0x81, 0x72, 0xde, 0x25, 0x4e, 0xa3, 0x3e, 0x54, 0x64, 0x77, 0x12, 0xbc,
+    0x9a, 0xe2, 0xae, 0x94, 0xe6, 0xf4, 0x47, 0x9e, 0xc0, 0xe0, 0x1d, 0x8d, 0x9d, 0x79, 0xb6, 0x8d,
+    0xdf, 0xa8, 0xe1, 0xaf, 0x3b, 0x5e, 0x72, 0xf8, 0x38, 0xb5, 0x08, 0x97, 0x40, 0x03, 0xf3, 0xd3,
+    0x6a, 0x18, 0xad, 0x5e, 0xcf, 0x75, 0xbb, 0xf1, 0x84, 0x9a, 0x31, 0x4c, 0xd5, 0x13, 0x61, 0x8f,
+    0xb2, 0x4e, 0xe5, 0xe0, 0x3d, 0x31, 0xe9, 0x4f, 0xa0, 0xc7, 0xb8, 0xaf, 0x1f, 0xcf, 0xdb, 0x10,
+    0xe3, 0x06, 0x61, 0xea, 0xab, 0xe7, 0xc4, 0xd8, 0xb9, 0x36, 0x21, 0xcf, 0xb5, 0x03, 0x06, 0x3b,
+    0x0f, 0xf8, 0x57, 0x02, 0x25, 0xb4, 0xfe, 0xed, 0x09, 0xaa, 0x91, 0x89, 0xff, 0x30, 0x6a, 0xeb,
+    0xeb, 0x38, 0x3c, 0x52, 0x5d, 0x00, 0x5b, 0x15, 0xed, 0x21, 0x8b, 0x8d, 0x5e, 0xa6, 0xe9, 0x21,
+    0x11, 0x04, 0x5a, 0xed, 0x98, 0x27, 0xd8, 0xf7, 0x1a, 0x76, 0xe5, 0x8b, 0xc8, 0x1f, 0xb7, 0x55,
+    0x24, 0x31, 0xe5, 0x91, 0xc4, 0x5e, 0x44, 0x77, 0xda, 0x89, 0x85, 0x22, 0xa1, 0x37, 0xb2, 0xea,
+    0xb8, 0x80, 0x6d, 0x0d, 0x5b, 0x18, 0x7b, 0x96, 0x17, 0xe6, 0x42, 0x04, 0x2d, 0xe2, 0x4c, 0xc5,
+    0x56, 0x86, 0xe3, 0x7d, 0x6e, 0x03, 0x93, 0x1d, 0x51, 0x4b, 0x5b, 0xee, 0x9c, 0x14, 0x69, 0xe3,
+    0x44, 0x27, 0xc9, 0x05, 0xbe, 0x52, 0x21, 0x41, 0xc4, 0x67, 0x47, 0x91, 0xef, 0xbb, 0x81, 0x99,
+    0xc3, 0xe8, 0x88, 0x05, 0x4d, 0x8f, 0x59, 0x73, 0xbe, 0x77, 0x60, 0x56, 0xa9, 0x1b, 0x82, 0xd3,
+    0x49, 0x5d, 0xe1, 0x6c, 0xb3, 0x13, 0x36, 0x9c, 0x85, 0x99, 0xd8, 0x71, 0x87, 0x4f, 0x60, 0x2a,
+    0xeb, 0xcc, 0x79, 0xa6, 0x83, 0x26, 0x0c, 0xad, 0x60, 0x16, 0xff, 0xee, 0x95, 0xf2, 0x00, 0xe2,
+    0x8c, 0x91, 0x79, 0xec, 0x4e, 0xbd, 0x56, 0xe2, 0x65, 0x28, 0x10, 0x7b, 0x7a, 0x50, 0x27, 0x99,
+    0x92, 0x90, 0x2f, 0x4e, 0x8e, 0x95, 0x4c, 0x66, 0x32, 0xd4, 0xbe, 0x6c, 0x16, 0x8d, 0x07, 0xe1,
+    0x6e, 0xf2, 0x9e, 0xbe, 0xf2, 0xd4, 0x4e, 0xe6, 0x98, 0x57, 0x23, 0x5b, 0x7e, 0xe5, 0x67, 0x0e,
+    0x49, 0xd3, 0xab, 0x3a, 0xcc, 0x00, 0x82, 0x7e, 0xdc, 0x50, 0xba, 0xcd, 0x0c, 0xd7, 0xa2, 0x31,
+    0x8a, 0xce, 0x5a, 0xbf, 0xef, 0x93, 0x4c, 0x4e, 0x5e, 0x83, 0x89, 0x29, 0x06, 0x07, 0x22, 0x64,
+    0x1b, 0x6d, 0x09, 0xd5, 0x04, 0xc9, 0x33, 0xda, 0x76, 0x3f, 0x17, 0x60, 0x52, 0x73, 0xcc, 0x44,
+    0xa5, 0xec, 0xe7, 0x7b, 0x30, 0x03, 0x6d, 0xdf, 0x8e, 0x6e, 0xa6, 0x82, 0xa6, 0x1c, 0x0c, 0xc9,
+    0x87, 0xc9, 0x57, 0x3d, 0x42, 0x23, 0x54, 0x92, 0x53, 0x7e, 0x60, 0x20, 0x17, 0x53, 0x85, 0x43,
+    0xc0, 0x8c, 0x68, 0xd2, 0xef, 0x8f, 0xc7, 0x56, 0x75, 0xa1, 0x8b, 0xb9, 0xcc, 0x44, 0x92, 0x08,
+    0x10, 0x47, 0x43, 0x26, 0xac, 0xce, 0x53, 0x97, 0xda, 0x30, 0xdc, 0xd3, 0x8d, 0x85, 0xc4, 0xe5,
+    0x7d, 0xbb, 0x32, 0x87, 0x01, 0xe4, 0x07, 0x8a, 0xa7, 0x1c, 0x2c, 0xe3, 0x0c, 0x07, 0xab, 0x98,
+    0x8d, 0xb5, 0x66, 0xb5, 0x92, 0x8d, 0x0e, 0x5e, 0x23, 0x26, 0xc7, 0x9a, 0x1d, 0x92, 0xea, 0xc9,
+    0x1e, 0x75, 0x8a, 0x2c, 0x9d, 0xac, 0x10, 0x4a, 0x6a, 0x6e, 0xcd, 0xb1, 0x96, 0xa9, 0x3f, 0xe0,
+    0xae, 0x34, 0x4a, 0xb5, 0x66, 0x19, 0x4c, 0xe4, 0x90, 0xf0, 0x73, 0xaf, 0xa1, 0x3c, 0x23, 0xbb,
+    0x57, 0xe4, 0x99, 0xc8, 0xf6, 0x69, 0x74, 0xbe, 0x08, 0xf1, 0xc2, 0x8f, 0xe2, 0x48, 0xed, 0xde,
+    0xf0, 0xd7, 0xe3, 0x95, 0xee, 0x6a, 0x76, 0x2b, 0xf1, 0xb6, 0xe7, 0xcb, 0x4b, 0x19, 0xc2, 0xec,
+    0xad, 0x2c, 0x8c, 0x40, 0x0e, 0x06, 0x6f, 0xb2, 0x59, 0xff, 0xb8, 0x39, 0x35, 0x62, 0xd3, 0x46,
+    0x77, 0x7a, 0x93, 0x07, 0xb9, 0x83, 0xaa, 0x13, 0xef, 0xe6, 0x56, 0x0f, 0xab, 0x2d, 0xd9, 0xba,
+    0xec, 0x86, 0x76, 0x2c, 0xe1, 0x8d, 0x9c, 0x12, 0xa6, 0x0d, 0xcb, 0x9a, 0x8a, 0xbd, 0xfa, 0x1a,
+    0x19, 0x62, 0x0f, 0x43, 0xea, 0x32, 0x5a, 0x62, 0x7e, 0x47, 0x14, 0x73, 0x87, 0xa3, 0x66, 0x35,
+    0x45, 0xf6, 0x13, 0xf0, 0xef, 0x52, 0xa5, 0xea, 0xcb, 0xf9, 0x90, 0xb7, 0x1d, 0xaa, 0x25, 0xe6,
+    0x60, 0xc6, 0xc8, 0xa5, 0x3f, 0xe0, 0xf1, 0x85, 0x18, 0xd9, 0x9a, 0xf9, 0xb4, 0x90, 0x4a, 0x8c,
+    0x1e, 0xba, 0x3e, 0x47, 0x68, 0x13, 0x4f, 0x41, 0xb3, 0xdf, 0xde, 0x6d, 0x67, 0x0b, 0xd1, 0x63,
+    0xe6, 0x17, 0xaa, 0xb9, 0xec, 0xe5, 0x2c, 0xf5, 0xd2, 0xec, 0x58, 0x93, 0x7d, 0x7e, 0x5c, 0xae,
+    0xf5, 0x71, 0x91, 0x00, 0x67, 0x96, 0xf8, 0x95, 0x34, 0x4c, 0x78, 0x15, 0xe0, 0x4e, 0x83, 0xa4,
+    0x3c, 0xb9, 0xf6, 0xf9, 0x0e, 0xe3, 0xd0, 0xea, 0xa5, 0x77, 0xac, 0x8f, 0x80, 0xe7, 0xc9, 0xca,
+    0x2b, 0x45, 0x1b, 0x4e, 0xbf, 0x56, 0x4e, 0x22, 0xd0, 0xe5, 0xe5, 0xe7, 0xd9, 0x72, 0xd9, 0xb4,
+    0x37, 0xbd, 0xfc, 0xd2, 0x03, 0x24, 0x47, 0x01, 0x02, 0x43, 0x8b, 0x0d, 0x0f, 0xcd, 0x97, 0xdb,
+    0x09, 0x36, 0x54, 0x0d, 0x66, 0xf7, 0xd3, 0xbb, 0x78, 0x21, 0x6b, 0x02, 0x6f, 0xfe, 0x49, 0x81,
+    0x64, 0x32, 0x73, 0xf9, 0x82, 0x01, 0xf7, 0x5d, 0xb5, 0xd8, 0x9d, 0x6b, 0x22, 0x5e, 0xaf, 0x29,
+    0x25, 0xfc, 0x5d, 0xc2, 0xfc, 0x72, 0x6e, 0xbe, 0xd7, 0x4b, 0xe2, 0xc9, 0x02, 0x3d, 0xea, 0xbb,
+    0x44, 0xf1, 0xe7, 0x9a, 0x65, 0xd5, 0xfb, 0x46, 0x53, 0x5d, 0x71, 0x6a, 0x2e, 0x1e, 0x0f, 0xd3,
+    0x43, 0xb0, 0x7d, 0xdb, 0x2e, 0x1e, 0xda, 0x3c, 0x50, 0x2c, 0x98, 0x79, 0x28, 0x34, 0x76, 0xc6,
+    0x89, 0xe0, 0xdf, 0x2e, 0x61, 0xb0, 0xb8, 0x89, 0x72, 0x91, 0xd3, 0x74, 0xbb, 0xa5, 0x87, 0x7b,
+    0xcb, 0x1c, 0xb7, 0x50, 0x1a, 0xa7, 0xef, 0x8d, 0x9b, 0x44, 0xd2, 0x61, 0x20, 0xa8, 0x16, 0xa1,
+    0x84, 0x36, 0x04, 0x8b, 0xec, 0x79, 0xa0, 0xf5, 0x6b, 0x01, 0x2f, 0xf3, 0x6b, 0x18, 0xe8, 0xf6,
+    0xfd, 0xd2, 0xb9, 0x3c, 0x31, 0xeb, 0xf3, 0x89, 0x09, 0x6a, 0x5e, 0x87, 0xaa, 0xda, 0x0b, 0x8a,
+    0x0c, 0x55, 0x76, 0xa7, 0x9c, 0x5d, 0x83, 0x1d, 0x96, 0x29, 0xbd, 0xea, 0xc4, 0x7e, 0x2f, 0x1e,
+    0x67, 0xc0, 0xdb, 0x9f, 0xe3, 0xeb, 0x36, 0x08, 0x23, 0x7a, 0xe2, 0xc6, 0xc5, 0xe3, 0x40, 0x84,
+    0xf4, 0xf5, 0xc3, 0x42, 0x9f, 0x5a, 0x56, 0x60, 0xaf, 0x1b, 0xdc, 0xad, 0x84, 0xd3, 0x82, 0x9c,
+    0xeb, 0x2b, 0xe1, 0x18, 0x7c, 0x6d, 0x28, 0xa0, 0x4d, 0xef, 0x30, 0x04, 0xfc, 0x16, 0x2e, 0x72,
+    0x34, 0xcc, 0x66, 0xc0, 0xae, 0x93, 0x59, 0x34, 0x1a, 0xbd, 0x95, 0xfb, 0x6e, 0x64, 0x4c, 0x45,
+    0x80, 0x2c, 0xea, 0xda, 0x9e, 0x3d, 0x1a, 0x9c, 0x6c, 0x05, 0x82, 0x9b, 0x04, 0x05, 0x5e, 0x48,
+    0x92, 0xf8, 0x07, 0x02, 0xf5, 0xc1, 0x82, 0xac, 0x3a, 0xbd, 0x7c, 0x92, 0x7f, 0x31, 0x60, 0xd8,
+    0xaa, 0xf4, 0x82, 0x28, 0xae, 0xd0, 0xe3, 0x93, 0xb5, 0x7a, 0x34, 0xf2, 0x7a, 0x1f, 0xa9, 0x80,
+    0x84, 0x69, 0xb4, 0x5e, 0x14, 0x50, 0x6a, 0x8a, 0x4c, 0x59, 0xdd, 0xda, 0xda, 0xb3, 0xa0, 0x9d,
+    0x0f, 0x5a, 0xcc, 0xc9, 0x83, 0xfc, 0x0f, 0xcc, 0x4b, 0x00, 0x3a, 0xc0, 0x3e, 0x21, 0x3b, 0xc1,
+    0x9d, 0x09, 0x47, 0xc4, 0x18, 0xc0, 0xda, 0x81, 0x49, 0x8e, 0x72, 0x78, 0x05, 0x3d, 0x32, 0x47,
+    0xb8, 0xac, 0xb3, 0x43, 0x21, 0x14, 0xa8, 0xf6, 0x4a, 0x15, 0x5b, 0x40, 0x7e, 0x88, 0x99, 0x6c,
+    0x25, 0x5b, 0x4a, 0xe7, 0xd2, 0x09, 0x5a, 0xb6, 0x5d, 0x94, 0x04, 0x04, 0x5c, 0x1c, 0x83, 0xc3,
+    0x40, 0x1c, 0x11, 0xda, 0xdd, 0x86, 0x52, 0x9d, 0x16, 0x00, 0x6d, 0xb2, 0x01, 0x4b, 0x6f, 0x23,
+    0x82, 0x4e, 0xbd, 0x39, 0x03, 0x7a, 0x9f, 0x22, 0x64, 0x00, 0xdd, 0x38, 0x33, 0xf3, 0xa1, 0x7d,
+    0xe3, 0xdd, 0xd9, 0x1b, 0x98, 0x11, 0x62, 0xf6, 0x6a, 0x1c, 0x04, 0x13, 0x49, 0x7e, 0x25, 0x90,
+    0x0b, 0xa8, 0x7d, 0xe2, 0xbc, 0x32, 0xb0, 0xef, 0xf1, 0x43, 0xcb, 0xb1, 0x41, 0x70, 0xb9, 0x8f,
+    0xd0, 0x98, 0x08, 0xfd, 0x42, 0x7a, 0xb2, 0x96, 0xcd, 0xac, 0x3a, 0xe1, 0xbb, 0x2b, 0xc3, 0x6f,
+    0x77, 0xd3, 0x28, 0x29, 0xfa, 0xf4, 0x84, 0x64, 0xa1, 0x82, 0x62, 0x43, 0x4f, 0x45, 0x13, 0x0a,
+    0x5a, 0x08, 0xad, 0x1a, 0x2f, 0x3d, 0x4f, 0xc2, 0x1f, 0x1f, 0xea, 0xa7, 0xc0, 0x76, 0xd9, 0x18,
+    0xb4, 0xc3, 0x02, 0x1e, 0x71, 0xfa, 0xc4, 0x07, 0x65, 0x0c, 0xd2, 0x4b, 0xa5, 0x6a, 0x74, 0xe2,
+    0x0d, 0x87, 0xbb, 0x1b, 0x36, 0xe7, 0xa6, 0x90, 0x02, 0xb6, 0x6e, 0xaf, 0xdc, 0x22, 0xf6, 0x7e,
+    0xfe, 0xc8, 0x18, 0x05, 0x4e, 0x03, 0xa2, 0x2f, 0x88, 0x58, 0x6f, 0x82, 0xd9, 0xc8, 0xd3, 0xc9,
+    0xac, 0x23, 0xcd, 0xf5, 0xcc, 0xf2, 0xf5, 0x0d, 0xac, 0x54, 0x5e, 0xbb, 0xdd, 0xfc, 0x8b, 0x8a,
+    0x5d, 0x73, 0xcb, 0xec, 0x3a, 0x1e, 0x82, 0xd2, 0xd2, 0x99, 0x19, 0xfb, 0x6b, 0xb7, 0xf5, 0x40,
+    0xaa, 0x1f, 0x62, 0x0b, 0x40, 0x08, 0x47, 0xb7, 0xdf, 0xa7, 0x1d, 0x5a, 0x7a, 0xa7, 0x59, 0x34,
+    0xde, 0xe1, 0xbf, 0x47, 0x90, 0xa8, 0x96, 0x67, 0xdd, 0x1a, 0xaa, 0xf5, 0x05, 0x01, 0x61, 0x7f,
+    0x32, 0x5c, 0x30, 0xb0, 0x60, 0x03, 0x49, 0xaa, 0xac, 0xff, 0x94, 0xd4, 0xba, 0x61, 0x89, 0x41,
+    0xff, 0x8f, 0xf0, 0xed, 0xdf, 0x76, 0x47, 0x18, 0x5d, 0x02, 0x8e, 0xf9, 0xe0, 0x2c, 0x72, 0xc1,
+    0xc7, 0x7c, 0x3d, 0x07, 0xa5, 0x22, 0x24, 0x2d, 0x10, 0x67, 0x16, 0x1a, 0xab, 0xc7, 0xc5, 0x26,
+    0x6c, 0x75, 0xfc, 0x1d, 0x23, 0xe2, 0xca, 0x07, 0xed, 0xd5, 0xa8, 0x86, 0xbc, 0x33, 0x2e, 0x28,
+    0x3a, 0x80, 0x1c, 0x50, 0xff, 0xf3, 0xd2, 0xdf, 0xf8, 0xd1, 0x75, 0x4c, 0xcb, 0x87, 0x95, 0x8b,
+    0xe6, 0x60, 0xb5, 0x6a, 0x9a, 0xf5, 0xb4, 0xd0, 0x71, 0x51, 0x0f, 0x4a, 0x24, 0x90, 0x26, 0x02,
+    0x50, 0x40, 0x04, 0xf9, 0xb8, 0xa5, 0x34, 0x7d, 0xf3, 0xb2, 0x17, 0x4c, 0x32, 0x32, 0x29, 0x28,
+    0xf4, 0xf1, 0xe2, 0x46, 0xac, 0x17, 0x10, 0x8b, 0x05, 0xf3, 0x41, 0x39, 0x2c, 0x4c, 0xac, 0xb5,
+    0xd2, 0xae, 0xa9, 0xe1, 0xfa, 0x61, 0xe3, 0x3d, 0xd9, 0x88, 0xdd, 0xdc, 0xe5, 0x58, 0xbe, 0x37,
+    0x80, 0x89, 0x53, 0x47, 0x79, 0x3a, 0x6e, 0x4b, 0x11, 0x3c, 0x60, 0xec, 0xd9, 0xe4, 0x0c, 0xfa,
+    0x89, 0x0d, 0x62, 0x5d, 0xa7, 0x4c, 0xbb, 0xcd, 0x4c, 0x7f, 0xbc, 0x93, 0x34, 0xfe, 0xea, 0x09,
+    0xc9, 0xd9, 0xaa, 0x94, 0x19, 0xb6, 0xd3, 0x4d, 0x34, 0x12, 0x51, 0x96, 0x32, 0x24, 0x5b, 0xe7,
+    0xb7, 0xb6, 0xe8, 0x59, 0x88, 0x65, 0x3a, 0x07, 0xcc, 0xda, 0x80, 0x17, 0x7d, 0x59, 0x78, 0x51,
+    0x7d, 0x15, 0x94, 0x18, 0x8f, 0x00, 0x08, 0x28, 0xc8, 0x58, 0xed, 0x7d, 0x1e, 0x99, 0x8d, 0xe3,
+    0x1a, 0xc4, 0x1c, 0xb5, 0x6e, 0x83, 0x49, 0x96, 0xc9, 0xe8, 0xbb, 0xa7, 0xeb, 0xae, 0x0d, 0x1d,
+    0xc2, 0x78, 0x36, 0x0b, 0x03, 0x85, 0x96, 0x46, 0xb6, 0x34, 0x75, 0xaa, 0x99, 0x04, 0x5f, 0x91,
+    0x1a, 0x66, 0x4a, 0xbb, 0xa1, 0xea, 0xe4, 0xfb, 0xca, 0x90, 0xd3, 0x75, 0xa9, 0xf2, 0x5b, 0xbc,
+    0xb8, 0x8b, 0x81, 0x25, 0xf5, 0x6c, 0x05, 0x9c, 0x43, 0xf7, 0xbb, 0x23, 0x7f, 0x4f, 0xd7, 0x8f,
+    0x19, 0x3b, 0x0b, 0xf3, 0xde, 0x1a, 0x4b, 0xb9, 0x72, 0x7f, 0xe3, 0x14, 0xd7, 0x38, 0x3f, 0x9e,
+    0xdc, 0x35, 0x3c, 0x56, 0x0a, 0x60, 0x7a, 0x60, 0x11, 0x38, 0x08, 0x4f, 0x02, 0x55, 0x7b, 0xb4,
+    0x0d, 0x77, 0x00, 0xc3, 0x7e, 0x13, 0x81, 0xbd, 0xb8, 0x38, 0x60, 0x6c, 0xe5, 0x9f, 0x11, 0xf4,
+    0x9b, 0x71, 0x27, 0xf7, 0xfb, 0x33, 0x97, 0x44, 0xdd, 0x1c, 0xf6, 0x91, 0x5a, 0x48, 0x35, 0x87,
+    0xe6, 0xbc, 0xa7, 0x38, 0xce, 0xf8, 0x7d, 0x5f, 0x97, 0xd7, 0xb4, 0xb3, 0x47, 0x44, 0xc1, 0x26,
+    0x78, 0x5f, 0xb6, 0x73, 0xbf, 0x4f, 0xaa, 0x0a, 0x96, 0xf2, 0xcf, 0x6e, 0x5e, 0x19, 0xa8, 0x2a,
+    0x22, 0xfb, 0xc7, 0xc6, 0x0f, 0x06, 0x4e, 0xb4, 0xcc, 0x8d, 0x10, 0xf5, 0xe6, 0xd3, 0xae, 0x0f,
+    0xa4, 0xb4, 0xb3, 0x78, 0xd2, 0xc8, 0xaf, 0xf2, 0xac, 0xea, 0x68, 0x87, 0x74, 0x39, 0x65, 0x22,
+    0x55, 0x16, 0x96, 0x6a, 0xd0, 0xe9, 0x3e, 0x2d, 0x39, 0xce, 0x27, 0x94, 0x56, 0xc2, 0x0b, 0xab,
+    0xea, 0x91, 0x5d, 0xee, 0x86, 0x9f, 0x03, 0x45, 0x83, 0xc9, 0xd4, 0x55, 0x40, 0x3b, 0x84, 0x49,
+    0x14, 0xe5, 0x53, 0xcf, 0x6a, 0xd1, 0x98, 0x62, 0x1f, 0x01, 0x86, 0x32, 0x05, 0xc8, 0x3f, 0x83,
+    0x63, 0x3b, 0x79, 0x31, 0xc7, 0xd4, 0x51, 0x10, 0x23, 0x29, 0xb8, 0x68, 0x6c, 0x28, 0xff, 0xbe,
+    0xd6, 0x78, 0xc9, 0xcd, 0x41, 0xf1, 0xda, 0x1f, 0x9e, 0xce, 0x1c, 0x48, 0x1f, 0x8a, 0x9f, 0xe3,
+    0x39, 0x19, 0x7d, 0xe5, 0x33, 0x17, 0x99, 0x92, 0x58, 0x43, 0x96, 0x63, 0xb7, 0x51, 0xca, 0xa3,
+    0x1d, 0x7e, 0xad, 0x71, 0x27, 0x02, 0x17, 0x5e, 0x69, 0xf6, 0xfc, 0x9d, 0x05, 0x47, 0x2d, 0x2d,
+    0x28, 0x13, 0x05, 0x65, 0xf7, 0xc0, 0xbe, 0x58, 0xdd, 0x3b, 0x52, 0xda, 0x7f, 0x45, 0x9f, 0xf0,
+    0xd1, 0x83, 0x0b, 0x0c, 0x7e, 0xc8, 0x55, 0x8e, 0x48, 0x25, 0xec, 0x71, 0xe0, 0x5c, 0xbd, 0xe3,
+    0x77, 0x0a, 0xca, 0x0c, 0xdf, 0x65, 0x87, 0xd9, 0x29, 0x67, 0x38, 0x8f, 0x80, 0xad, 0x62, 0xb0,
+    0x9f, 0xad, 0x9b, 0x36, 0xe8, 0x83, 0x54, 0xee, 0x6b, 0x86, 0x06, 0xaf, 0xbe, 0x56, 0xda, 0x59,
+    0x2d, 0xa3, 0xe6, 0x86, 0xce, 0x46, 0x75, 0x7e, 0x9c, 0x9f, 0x8e, 0xf5, 0xc7, 0x1b, 0xa7, 0xd7,
+    0xd2, 0x9e, 0x1d, 0x2c, 0x7e, 0x3c, 0x74, 0xf7, 0x03, 0xca, 0x23, 0x40, 0x0a, 0xa0, 0x66, 0xd5,
+    0xa1, 0x7e, 0x28, 0x07, 0xe4, 0x8c, 0x1c, 0x99, 0x7d, 0x34, 0x7a, 0xff, 0x4f, 0xcc, 0x46, 0xa2,
+    0x09, 0x70, 0xc9, 0x4d, 0xbe, 0xbf, 0xe1, 0xac, 0xad, 0x1e, 0x08, 0xb8, 0xa8, 0xaa, 0x4a, 0xbe,
+    0xc2, 0x15, 0x90, 0x78, 0xba, 0x89, 0x81, 0xb0, 0xa1, 0xfe, 0xbd, 0xf1, 0x2a, 0x6e, 0x8c, 0x12,
+    0xdc, 0x10, 0xb2, 0x31, 0xf9, 0xea, 0x00, 0x94, 0x45, 0x03, 0xff, 0xf6, 0x6d, 0xe3, 0x53, 0x58,
+    0x25, 0xe6, 0xd5, 0x23, 0x43, 0x60, 0xe2, 0x4e, 0x7d, 0x13, 0x42, 0x70, 0xf2, 0x82, 0x07, 0x43,
+    0xc0, 0x28, 0x98, 0xc9, 0x09, 0xb0, 0x65, 0x88, 0x4d, 0x6a, 0x13, 0x46, 0x5b, 0x32, 0x39, 0x6c,
+    0x61, 0x1c, 0xdd, 0xea, 0x79, 0x3e, 0x41, 0xf6, 0x28, 0x38, 0x1b, 0x18, 0xf8, 0xad, 0xfc, 0xad,
+    0x9a, 0xf8, 0x8e, 0x5b, 0x1c, 0x66, 0xa5, 0x73, 0xd5, 0xc2, 0x1c, 0xce, 0xbd, 0xdb, 0x70, 0x96,
+    0x43, 0xc8, 0xea, 0xde, 0xc4, 0xec, 0x5c, 0xe1, 0x00, 0xfd, 0x33, 0xdc, 0x4e, 0x4c, 0xd2, 0xa2,
+    0x3c, 0x60, 0x8b, 0x4c, 0xcf, 0x1f, 0xaf, 0x96, 0x8b, 0x88, 0x59, 0x95, 0xe9, 0x57, 0x1c, 0x55,
+    0x1f, 0x92, 0x1f, 0x5f, 0x9e, 0xea, 0x54, 0x74, 0x06, 0xbb, 0x99, 0xe4, 0x3c, 0x92, 0x30, 0x98,
+    0xe8, 0xd1, 0xeb, 0x1a, 0x35, 0xe1, 0x5f, 0x88, 0x6a, 0x64, 0x4c, 0x94, 0x61, 0xe2, 0xd1, 0x3e,
+    0xfb, 0x05, 0x62, 0x9d, 0x8c, 0xf7, 0x14, 0xf8, 0xf0, 0x4d, 0x4d, 0x89, 0xa8, 0x6a, 0x41, 0xc4,
+    0xda, 0x8b, 0x58, 0x28, 0x09, 0x40, 0xa0, 0x06, 0x52, 0xad, 0x20, 0x84, 0x47, 0x7f, 0x82, 0x82,
+    0x11, 0x7b, 0xd4, 0xc3, 0x74, 0x4b, 0xee, 0x92, 0x71, 0x5f, 0x83, 0x59, 0x10, 0x3e, 0xdd, 0x58,
+    0xc5, 0xc6, 0x67, 0xe3, 0x0b, 0xec, 0x1f, 0xb4, 0x21, 0x0c, 0x85, 0x0c, 0xa1, 0x7c, 0xd1, 0xcd,
+    0xc3, 0x6d, 0x0e, 0xdb, 0x0a, 0xed, 0x22, 0x99, 0x07, 0xd9, 0xfc, 0x60, 0x53, 0xf8, 0x99, 0x10,
+    0x91, 0x89, 0x79, 0xf1, 0xfb, 0x59, 0xda, 0xfc, 0x73, 0x9a, 0x21, 0x1a, 0x60, 0x9e, 0x70, 0x55,
+    0x8f, 0x4c, 0x5f, 0x9d, 0x14, 0x71, 0xf8, 0x80, 0xc4, 0xb9, 0x91, 0x3f, 0x46, 0x36, 0x78, 0xb6,
+    0x4b, 0x69, 0xd3, 0x0f, 0x1c, 0x49, 0x45, 0x39, 0x58, 0xdd, 0x05, 0x23, 0x0e, 0xd3, 0x73, 0x79,
+    0x89, 0x2e, 0xd7, 0xec, 0xaa, 0x01, 0x29, 0xa3, 0x5c, 0x29, 0xca, 0x80, 0x4a, 0xda, 0x03, 0xe1,
+    0x4d, 0x53, 0xf0, 0x5c, 0xab, 0xbd, 0x00, 0xd2, 0x54, 0x5e, 0x7b, 0xfa, 0xc3, 0xfd, 0x00, 0x1d,
+    0xbd, 0x1d, 0xde, 0x3d, 0x0b, 0xa4, 0x42, 0x38, 0xe7, 0x72, 0x65, 0x4e, 0xc2, 0x7e, 0x31, 0x82,
+    0xf7, 0x6d, 0x86, 0xc1, 0x46, 0x77, 0x6b, 0x1a, 0xe1, 0x02, 0xc4, 0x06, 0x0a, 0xa7, 0x5f, 0x15,
+    0xa4, 0x21, 0xec, 0x88, 0xb3, 0x2c, 0x20, 0x13, 0x3c, 0x4a, 0xca, 0xf5, 0xd9, 0x2b, 0x9d, 0xb3,
+    0xd0, 0x33, 0xc5, 0x0f, 0xf0, 0x27, 0x72, 0xc7, 0xbc, 0xbe, 0x65, 0x3a, 0x24, 0x11, 0x4b, 0xb1,
+    0xa8, 0x9a, 0x00, 0x7c, 0x51, 0x78, 0x4e, 0x94, 0x60, 0x9c, 0x99, 0xc9, 0x55, 0xc4, 0xc7, 0x55,
+    0xec, 0x2a, 0x34, 0xd0, 0x92, 0x34, 0xea, 0x00, 0x99, 0xbe, 0xcf, 0x82, 0xdb, 0x08, 0xe6, 0x0b,
+    0x89, 0x4f, 0x2f, 0x85, 0x7d, 0x31, 0x89, 0xfe, 0x5b, 0xe5, 0x64, 0x16, 0x8c, 0xe4, 0xbf, 0xba,
+    0x86, 0xd6, 0x7f, 0xd0, 0x46, 0x4d, 0x5e, 0x04, 0xf0, 0xf4, 0xe8, 0x55, 0x30, 0x47, 0x28, 0x1c,
+    0x46, 0x88, 0x21, 0x68, 0xcd, 0xc4, 0xf8, 0x75, 0xcf, 0xdb, 0x4b, 0x28, 0x8f, 0x23, 0xd9, 0x3a,
+    0xe9, 0x57, 0x0e, 0x96, 0x52, 0x4b, 0x71, 0xff, 0x1b, 0xef, 0x7c, 0xe2, 0xf4, 0x0c, 0x41, 0x00,
+    0x1a, 0xf5, 0xd2, 0xb8, 0x23, 0x28, 0xf8, 0x81, 0xc6, 0x6b, 0x80, 0x3c, 0x65, 0xfe, 0x0e, 0xc1,
+    0xe6, 0x8b, 0xa1, 0x4e, 0x77, 0xae, 0xf1, 0x8e, 0x41, 0x3d, 0x30, 0x2e, 0x50, 0x4b, 0x40, 0xc5,
+    0x0a, 0xe5, 0x41, 0xfa, 0x30, 0xba, 0x39, 0x92, 0xc6, 0x5c, 0x61, 0xd8, 0xc4, 0x16, 0x47, 0x7e,
+    0x7e, 0x12, 0xaa, 0x42, 0xba, 0x5b, 0x49, 0xc1, 0x83, 0x20, 0x4b, 0x40, 0x7b, 0x4e, 0x5a, 0x82,
+    0xab, 0x85, 0xd0, 0x4f, 0xc1, 0x78, 0x25, 0x6b, 0xbf, 0xae, 0x91, 0x8f, 0xa5, 0x68, 0x8a, 0x02,
+    0x8b, 0xc2, 0x1c, 0xd7, 0xe1, 0x68, 0xee, 0x2c, 0x81, 0x44, 0x29, 0x6e, 0x13, 0xa2, 0xe8, 0x3d,
+    0xfe, 0xf1, 0x45, 0x59, 0xc7, 0xa2, 0xc4, 0x42, 0x96, 0xbc, 0xa8, 0x14, 0x43, 0x03, 0x8d, 0x85,
+    0x09, 0x47, 0x76, 0xae, 0x45, 0xf6, 0x31, 0xb8, 0x59, 0x34, 0x58, 0x2d, 0xad, 0xb3, 0x93, 0xce,
+    0x00, 0x59, 0xb2, 0xe6, 0xd6, 0x13, 0x25, 0x39, 0x40, 0xe6, 0xd2, 0xc4, 0x1d, 0x6c, 0x2e, 0x54,
+    0xb5, 0x91, 0x12, 0xd8, 0x3e, 0x69, 0x34, 0xa7, 0x04, 0xca, 0x59, 0x46, 0xd3, 0xb5, 0x13, 0xfd,
+    0x9d, 0x92, 0x2a, 0x68, 0x97, 0x36, 0xfb, 0xc7, 0x05, 0xf9, 0x42, 0x0c, 0x91, 0x0b, 0x4d, 0x51,
+    0x65, 0xc9, 0x81, 0x3a, 0xc0, 0x88, 0xfc, 0xb0, 0x4b, 0x25, 0x1c, 0x74, 0xa6, 0x4d, 0xdb, 0xed,
+    0xff, 0x90, 0x66, 0x9a, 0x59, 0x94, 0xb8, 0x12, 0xb5, 0xdb, 0x62, 0xcb, 0x71, 0x14, 0x95, 0x14,
+    0x86, 0xf6, 0x98, 0xab, 0xe7, 0x63, 0xcb, 0x79, 0x04, 0x6b, 0x93, 0xe1, 0x7a, 0x52, 0xfd, 0x72,
+    0x24, 0xe7, 0xd1, 0x84, 0xa3, 0x50, 0x7d, 0xdb, 0x5f, 0x9f, 0xba, 0xfb, 0x42, 0x2f, 0x4f, 0xff,
+    0xe3, 0xa5, 0x71, 0xf9, 0xb3, 0x53, 0xd3, 0xeb, 0x0f, 0xf9, 0x75, 0x55, 0x2f, 0x9b, 0x98, 0x4c,
+    0xb5, 0x5f, 0x41, 0xd8, 0x22, 0x09, 0x42, 0x38, 0xea, 0xcc, 0x00, 0xbb, 0x6d, 0xd4, 0x46, 0x45,
+    0x01, 0xf6, 0x9c, 0xe2, 0x62, 0x06, 0x92, 0x4d, 0xc7, 0x8f, 0xc6, 0x41, 0x56, 0x2d, 0x84, 0x9d,
+    0xc3, 0x2d, 0x90, 0xbd, 0xd3, 0xa3, 0xf1, 0xed, 0x33, 0x02, 0x76, 0x90, 0xa2, 0xa0, 0x77, 0x0b,
+    0x67, 0x15, 0xb6, 0x0b, 0x2b, 0x5c, 0x6d, 0x40, 0x92, 0xf3, 0xfc, 0xe6, 0xf7, 0xd9, 0xaa, 0x85,
+    0x36, 0x30, 0x9f, 0xac, 0x4e, 0x00, 0x35, 0xbd, 0xac, 0x3b, 0xb0, 0x6f, 0x00, 0xe6, 0xd9, 0x46,
+    0xfe, 0xda, 0x6c, 0x3f, 0x08, 0x02, 0x0a, 0xce, 0xe7, 0x2f, 0xb6, 0x89, 0x1f, 0x52, 0x30, 0x40,
+    0x35, 0xb5, 0xf6, 0x2c, 0x88, 0x5e, 0x2a, 0xf9, 0x27, 0x45, 0xcd, 0xfd, 0xfe, 0xea, 0x6d, 0x20,
+    0x3a, 0x36, 0xca, 0x66, 0x61, 0xa2, 0x25, 0x11, 0x77, 0x9c, 0xaf, 0x43, 0x9d, 0x36, 0xc1, 0x7d,
+    0x9c, 0xf6, 0xa6, 0xca, 0x0b, 0x7c, 0x3e, 0xd8, 0x69, 0xdc, 0x98, 0xdd, 0xa3, 0xb3, 0x72, 0x8b,
+    0xd7, 0xab, 0x6f, 0xce, 0x98, 0xf2, 0x38, 0x72, 0xc9, 0x57, 0xa5, 0x12, 0xad, 0x40, 0x2d, 0x80,
+    0xb0, 0xa5, 0xa2, 0x54, 0x50, 0x4d, 0xc3, 0xbb, 0xab, 0xb4, 0x40, 0x15, 0x53, 0x0d, 0xb6, 0x31,
+    0xad, 0x5c, 0x78, 0x25, 0xe2, 0x54, 0x75, 0x81, 0xea, 0xcf, 0x07, 0xe8, 0x6b, 0x33, 0x67, 0x3f,
+    0xad, 0xaf, 0x2f, 0x0b, 0x4d, 0xc8, 0xf1, 0xc3, 0x9e, 0x1c, 0x7b, 0x01, 0x16, 0x1e, 0x30, 0x6d,
+    0x00, 0xd3, 0xc0, 0xc5, 0xde, 0xdf, 0xc5, 0xf1, 0x59, 0xae, 0x26, 0xe5, 0x80, 0x56, 0x9d, 0x38,
+    0xd1, 0xbf, 0x1b, 0xe0, 0x53, 0x45, 0x48, 0x4c, 0x1d, 0x32, 0x75, 0xab, 0x0e, 0xcc, 0x55, 0x8c,
+    0xec, 0x9c, 0x3f, 0x09, 0x21, 0x90, 0x15, 0x7d, 0x86, 0xae, 0x91, 0x31, 0xf8, 0xfb, 0x29, 0xe8,
+    0x87, 0x6c, 0xe4, 0xfb, 0x2e, 0x6e, 0x13, 0xda, 0x38, 0xbd, 0xe2, 0x54, 0xe5, 0x2b, 0x8a, 0x3e,
+    0x24, 0x5c, 0x9d, 0x31, 0x0e, 0x87, 0x05, 0xd8, 0x78, 0x90, 0xd5, 0x5a, 0x7a, 0x46, 0x16, 0xcd,
+    0x48, 0x68, 0xf5, 0xd8, 0x1d, 0xc5, 0xf8, 0x01, 0xd9, 0x49, 0x95, 0xab, 0xd4, 0x0c, 0x89, 0x7e,
+    0xfd, 0xb4, 0x90, 0x74, 0xe3, 0xf8, 0x7c, 0xeb, 0x98, 0x72, 0x70, 0x3c, 0xd9, 0xe6, 0x39, 0x6c,
+    0x65, 0x26, 0x4f, 0xbe, 0xa0, 0x09, 0x5f, 0x7a, 0x73, 0x1c, 0x25, 0x04, 0x0a, 0x36, 0xe9, 0xf2,
+    0xb9, 0xd6, 0xf1, 0x98, 0x8f, 0x11, 0x0d, 0x39, 0xbe, 0x74, 0x63, 0x63, 0x3e, 0xe0, 0x94, 0x9a,
+    0x12, 0x33, 0xe9, 0xba, 0x39, 0x3f, 0xe8, 0xf9, 0x0b, 0x63, 0x18, 0x20, 0x27, 0x32, 0x53, 0x1b,
+    0x79, 0xff, 0x55, 0x4b, 0x45, 0xc5, 0x7b, 0x50, 0xeb, 0x7b, 0x58, 0x84, 0x7e, 0x93, 0xca, 0x8b,
+    0x6d, 0xf4, 0xd7, 0x50, 0x0b, 0xf7, 0x20, 0x3a, 0x7a, 0x23, 0x5c, 0x57, 0x61, 0x6e, 0xd4, 0xc5,
+    0x02, 0xba, 0xe1, 0xf8, 0x9c, 0xa0, 0x8a, 0x4c, 0xae, 0xb7, 0xb4, 0xd9, 0x83, 0x1e, 0xbb, 0x42,
+    0x1b, 0x22, 0x25, 0x1c, 0xc1, 0x74, 0xdd, 0x4e, 0xc8, 0x59, 0xc0, 0x7d, 0xcb, 0x50, 0x4d, 0xb0,
+    0x47, 0x86, 0xee, 0x6a, 0x9e, 0x04, 0x28, 0x34, 0x6a, 0xce, 0x77, 0x6a, 0x1e, 0xf0, 0x3f, 0xd9,
+    0x38, 0x86, 0x7e, 0x90, 0x20, 0x98, 0xe3, 0xcc, 0x9a, 0x4b, 0xab, 0x86, 0xf2, 0x3e, 0x1c, 0x32,
+    0x68, 0x49, 0x6d, 0xf2, 0xeb, 0x5b, 0x67, 0x45, 0x7d, 0x77, 0xee, 0xd0, 0xd7, 0xad, 0x37, 0x09,
+    0xf6, 0x65, 0xb4, 0x4c, 0xf3, 0xec, 0xfc, 0x1e, 0xfc, 0x48, 0x41, 0xd9, 0x8e, 0xe5, 0x91, 0x9c,
+    0x86, 0xf9, 0x71, 0xf7, 0xb8, 0xb8, 0x3b, 0x21, 0xf9, 0xdd, 0x6c, 0xfc, 0xca, 0x7d, 0x08, 0x5f,
+    0x1f, 0xa4, 0x33, 0xe6, 0x2f, 0x00, 0x6e, 0x21, 0x72, 0xf5, 0xd4, 0x17, 0xb2, 0x96, 0xcd, 0xab,
+    0xc6, 0xec, 0xe9, 0xa5, 0x7c, 0x6b, 0x0e, 0xde, 0x75, 0x3c, 0x8a, 0x78, 0x5f, 0xfa, 0xc6, 0xaa,
+    0xb9, 0xa3, 0xa9, 0x8a, 0xf9, 0x7d, 0x0f, 0xf8, 0x62, 0xc4, 0x54, 0x05, 0xc5, 0xcb, 0xe0, 0x85,
+    0x34, 0x99, 0xa8, 0xef, 0x92, 0x2d, 0x4b, 0xe3, 0x5d, 0xa1, 0x0d, 0x55, 0x7a, 0x24, 0x74, 0xcf,
+    0xa9, 0x4c, 0xbb, 0x62, 0xf8, 0xdb, 0xd1, 0x17, 0x14, 0x52, 0x9a, 0x7d, 0x51, 0x06, 0x45, 0x1f,
+    0x33, 0x96, 0xc0, 0xfd, 0xd4, 0x20, 0x83, 0x53, 0x5c, 0x3c, 0x0e, 0xe3, 0xbe, 0xc2, 0xb0, 0x67,
+    0x66, 0xae, 0x7f, 0x87, 0x20, 0x91, 0x5d, 0x26, 0x55, 0x40, 0x22, 0xc1, 0x5b, 0x78, 0x6f, 0x5e,
+    0xf2, 0x02, 0xcb, 0xa9, 0xc2, 0x54, 0x53, 0xa7, 0x17, 0x4c, 0xb8, 0x34, 0xbc, 0x55, 0xb4, 0x30,
+    0x5c, 0x6c, 0x66, 0x5d, 0x04, 0x47, 0x13, 0xc8, 0xf7, 0xaa, 0xa4, 0x68, 0xcb, 0xff, 0xf7, 0x72,
+    0xc9, 0x50, 0x9b, 0xfb, 0x6b, 0x2e, 0xdc, 0x79, 0xd3, 0x01, 0xb8, 0x07, 0xdb, 0xf3, 0x07, 0x52,
+    0x38, 0x24, 0xb4, 0x9b, 0x3e, 0xab, 0xb3, 0x5b, 0x8f, 0x39, 0x03, 0x94, 0x56, 0x99, 0x23, 0x25,
+    0x04, 0x4d, 0xfb, 0x31, 0x30, 0x14, 0xa6, 0x55, 0x25, 0x22, 0xa4, 0x28, 0x8b, 0xc9, 0xf0, 0x0f,
+    0x5a, 0x32, 0xbd, 0xb5, 0xfc, 0x08, 0x03, 0x2a, 0x4e, 0xbb, 0x27, 0x3f, 0x3a, 0x3a, 0x6d, 0x76,
+    0x2f, 0x65, 0x99, 0x58, 0xc3, 0x24, 0x17, 0x7f, 0xf3, 0xb5, 0x1f, 0xe2, 0xe7, 0xed, 0x48, 0x87,
+    0xa0, 0x8d, 0x6b, 0xab, 0x17, 0x48, 0xa8, 0x2e, 0x20, 0x3e, 0x1d, 0xa6, 0x95, 0xea, 0xb4, 0x6d,
+    0xb4, 0x39, 0x9d, 0xcb, 0x6b, 0xcd, 0xbf, 0xb4, 0xf0, 0x57, 0xbd, 0xaf, 0x9d, 0x98, 0x74, 0xc4,
+    0x31, 0x7f, 0xa7, 0x6a, 0x26, 0xf6, 0xe9, 0x14, 0x46, 0x61, 0x42, 0xd6, 0x1f, 0x70, 0x50, 0xf8,
+    0xf2, 0x61, 0x68, 0x61, 0x20, 0x9b, 0xef, 0x6c, 0xc8, 0xc3, 0x12, 0x97, 0xf0, 0xe3, 0x0f, 0xc8,
+    0xc9, 0x97, 0x5a, 0x1e, 0xc7, 0x0d, 0xcb, 0x27, 0x25, 0x8c, 0xbf, 0x0e, 0xe4, 0xe0, 0x14, 0x9c,
+    0x1b, 0xb5, 0xb6, 0x3c, 0xa0, 0x93, 0xf8, 0xca, 0xf9, 0x77, 0xa7, 0x39, 0xb4, 0xa8, 0x0b, 0x69,
+    0x72, 0x00, 0x4a, 0x3f, 0xc4, 0xd9, 0x10, 0xde, 0x13, 0x62, 0xc0, 0x3c, 0x3b, 0x66, 0xda, 0x10,
+    0x9d, 0x8c, 0x3c, 0x40, 0x22, 0x9a, 0x13, 0xe7, 0x92, 0xdb, 0x66, 0x0f, 0x62, 0xc7, 0xb5, 0x4a,
+    0x71, 0x9a, 0xb2, 0x05, 0x00, 0xe2, 0xfa, 0x84, 0x38, 0x71, 0x7f, 0x40, 0x2e, 0x6e, 0x90, 0x4c,
+    0x30, 0x65, 0xf3, 0x37, 0xbf, 0xcb, 0x98, 0x4f, 0x5d, 0x9c, 0x48, 0xc8, 0xf3, 0xa4, 0x5b, 0x89,
+    0x99, 0xcf, 0xd7, 0x37, 0x84, 0x74, 0x5b, 0x1a, 0x2e, 0x93, 0x67, 0x15, 0x77, 0x2f, 0x09, 0x7f,
+    0xe0, 0x01, 0xde, 0xb0, 0x9e, 0x0d, 0xb6, 0x1b, 0x4a, 0x95, 0x44, 0x59, 0x51, 0xf6, 0xea, 0x1d,
+    0x00, 0xf7, 0x9f, 0xbc, 0x1c, 0xda, 0xf9, 0x0d, 0xbe, 0x7a, 0xb7, 0x4f, 0xa4, 0x58, 0xbc, 0xe9,
+    0xb1, 0x76, 0x3b, 0xe0, 0x07, 0xd7, 0xed, 0xd4, 0x81, 0xd7, 0x23, 0xf5, 0xfa, 0x42, 0x60, 0x55,
+    0xa3, 0xc0, 0x84, 0x5d, 0xd6, 0x47, 0xa4, 0x5d, 0x00, 0xc9, 0x9f, 0x74, 0xbe, 0x2d, 0xa7, 0x30,
+    0x00, 0x3b, 0xdc, 0xbe, 0xdd, 0x43, 0x18, 0x65, 0x3b, 0x3a, 0xd3, 0x90, 0x38, 0xac, 0x51, 0x0d,
+    0x98, 0x0f, 0x1a, 0xa5, 0x93, 0x59, 0x57, 0x89, 0xe5, 0x3b, 0x00, 0x9e, 0x6e, 0xaa, 0xda, 0xa7,
+    0x6c, 0x77, 0x8e, 0x66, 0x83, 0x5a, 0x5f, 0x4b, 0x07, 0x4f, 0x8a, 0x7a, 0xbd, 0x75, 0xca, 0xb1,
+    0x12, 0xde, 0x02, 0xc6, 0x11, 0x82, 0x08, 0xcb, 0x3c, 0xc7, 0xdf, 0x96, 0xba, 0x47, 0xfa, 0xb5,
+    0x98, 0xcb, 0xeb, 0x53, 0x11, 0xeb, 0x7c, 0xd6, 0x93, 0xea, 0x6c, 0x79, 0xf5, 0x2e, 0xde, 0xfc,
+    0x1e, 0x66, 0x5e, 0xa8, 0x48, 0x13, 0xcd, 0x3f, 0xbf, 0xdf, 0xa0, 0xe9, 0xaf, 0x83, 0xf5, 0x1f,
+    0x3a, 0xee, 0x64, 0x65, 0x92, 0x8a, 0x63, 0xa8, 0x46, 0x73, 0x7f, 0x9b, 0x76, 0xe1, 0x6c, 0x8b,
+    0x50, 0xd9, 0x4b, 0xa5, 0x08, 0x53, 0xd1, 0x2e, 0xc7, 0xb7, 0x07, 0x57, 0x4c, 0x78, 0x2e, 0x69,
+    0x7d, 0xdc, 0xb0, 0xa8, 0xff, 0x43, 0x3d, 0x3b, 0x6a, 0x87, 0x30, 0xfb, 0xd2, 0x52, 0x25, 0xca,
+    0x70, 0x40, 0x81, 0x53, 0xbb, 0x00, 0x39, 0xf2, 0xf4, 0xa1, 0x74, 0x4b, 0xcd, 0xe8, 0xfc, 0xcf,
+    0x99, 0x0e, 0x15, 0x27, 0xbe, 0x77, 0x10, 0xdd, 0xe1, 0xbb, 0xec, 0x30, 0x17, 0xb8, 0xa4, 0x78,
+    0xa1, 0x89, 0xa3, 0xec, 0xf4, 0x8c, 0x8b, 0xf7, 0x9d, 0x1d, 0xbe, 0xb7, 0xce, 0x09, 0x21, 0x40,
+    0xc7, 0x48, 0xa1, 0xa4, 0x3c, 0x94, 0x05, 0x68, 0x91, 0x6e, 0x66, 0xf3, 0xc1, 0xa2, 0x0a, 0x1b,
+    0x21, 0x99, 0x56, 0xcd, 0x7c, 0xed, 0xea, 0xc5, 0xdf, 0x48, 0xc8, 0xda, 0x02, 0xee, 0x61, 0x18,
+    0x3b, 0x0c, 0x32, 0xb0, 0x98, 0x6d, 0xad, 0xc5, 0x74, 0xfd, 0x46, 0x3e, 0x2d, 0xf7, 0xb6, 0xd5,
+    0xef, 0x04, 0x11, 0x78, 0x63, 0x2a, 0x41, 0x6e, 0x85, 0x72, 0x1f, 0x7d, 0x45, 0x15, 0xd6, 0x35,
+    0x07, 0xac, 0xec, 0xd5, 0x19, 0x8f, 0x69, 0x94, 0xf3, 0xc8, 0x63, 0x36, 0xb2, 0x5c, 0xcf, 0xd8,
+    0xae, 0x1d, 0x56, 0x20, 0x15, 0x79, 0x51, 0xc5, 0xb2, 0x77, 0x8f, 0xe7, 0x84, 0xfd, 0x42, 0x46,
+    0x96, 0x33, 0x42, 0xb7, 0xec, 0x95, 0xa1, 0xa3, 0xdc, 0xee, 0xd6, 0x2e, 0xf5, 0x0f, 0x7f, 0x5e,
+    0x99, 0x3d, 0x22, 0x89, 0x78, 0xc0, 0x58, 0xd2, 0xef, 0xe1, 0x86, 0x3b, 0x4e, 0x48, 0x8c, 0x46,
+    0xcb, 0xc5, 0xae, 0xc4, 0x05, 0x25, 0xe1, 0x8b, 0x26, 0xe3, 0x51, 0x5a, 0x71, 0x49, 0x40, 0xa4,
+    0x0c, 0x13, 0xc1, 0xeb, 0xe3, 0x07, 0xa4, 0xdf, 0x0b, 0xf1, 0x36, 0xfc, 0xa0, 0xcd, 0x67, 0xad,
+    0x3b, 0x0b, 0xce, 0x6b, 0x8b, 0x3a, 0x04, 0x12, 0xa7, 0x8f, 0x1f, 0x17, 0xed, 0x34, 0xf7, 0xe9,
+    0xb3, 0xf6, 0x07, 0x3e, 0x0a, 0xe0, 0x78, 0x93, 0xf1, 0x4d, 0x93, 0x98, 0x96, 0xb8, 0x16, 0x51,
+    0x79, 0x2f, 0x7b, 0x53, 0xa8, 0x96, 0x2d, 0x5a, 0x09, 0x93, 0x58, 0xf3, 0x68, 0x38, 0x72, 0xb1,
+    0xbb, 0x89, 0x6b, 0x94, 0xe5, 0x87, 0x75, 0xe8, 0x4c, 0x30, 0x33, 0x5a, 0x44, 0x69, 0x26, 0x7d,
+    0xc1, 0xfa, 0xca, 0xbf, 0x16, 0xe7, 0x22, 0xef, 0x11, 0x89, 0x28, 0xa9, 0x12, 0xdf, 0x7d, 0x9d,
+    0xc5, 0x3a, 0xb1, 0x0b, 0x4f, 0xbc, 0x9b, 0x32, 0xf6, 0xfa, 0x00, 0x56, 0xc3, 0xcf, 0xb9, 0xd8,
+    0xa6, 0xe5, 0x0e, 0x7a, 0xcf, 0x78, 0xfb, 0x87, 0x0d, 0x30, 0x19, 0x72, 0x87, 0x22, 0x7c, 0xbd,
+    0x01, 0x4e, 0xd6, 0xdb, 0x91, 0xcc, 0xa3, 0x82, 0x97, 0x6d, 0x24, 0xa3, 0xde, 0xd3, 0xed, 0x3a,
+    0x3d, 0x9f, 0x85, 0x82, 0x28, 0x5f, 0x9b, 0x7e, 0xea, 0x2f, 0x11, 0xab, 0x30, 0x6b, 0x60, 0xc3,
+    0x26, 0xfa, 0xdf, 0x84, 0x10, 0xa6, 0x18, 0xe3, 0xef, 0x4f, 0x4c, 0xfe, 0xba, 0xaf, 0x06, 0xb7,
+    0xb3, 0xb1, 0x3f, 0x89, 0x78, 0xe2, 0xe3, 0x86, 0xdf, 0x2c, 0x36, 0xcb, 0x06, 0x56, 0xa8, 0x56,
+    0xae, 0xf9, 0xf0, 0xe2, 0xe4, 0xbb, 0x21, 0x9e, 0x87, 0x17, 0xb2, 0xf7, 0x9b, 0x48, 0x19, 0xb7,
+    0x83, 0xc6, 0x7e, 0x4f, 0xee, 0x99, 0x3d, 0x2d, 0x8b, 0x66, 0xf3, 0xe2, 0x41, 0x85, 0xee, 0xd0,
+    0xad, 0x81, 0x2b, 0x09, 0x34, 0x69, 0xc0, 0x52, 0x01, 0x5f, 0xe8, 0x69, 0xf2, 0x63, 0xd3, 0xba,
+    0xf5, 0xed, 0xac, 0x82, 0xfa, 0x98, 0x21, 0xb9, 0x5f, 0x00, 0x7b, 0x4e, 0x6c, 0x00, 0x4b, 0x74,
+    0x35, 0x57, 0x7e, 0xb9, 0x08, 0xa5, 0x85, 0x01, 0x94, 0xc4, 0xa3, 0x70, 0x37, 0x34, 0xfd, 0x97,
+    0x7b, 0xdc, 0x9a, 0xa5, 0xd9, 0xc5, 0x42, 0x00, 0xe2, 0x5a, 0x65, 0x78, 0xac, 0xf8, 0x49, 0xe3,
+    0xd2, 0x5b, 0x43, 0x09, 0xf5, 0x30, 0x4b, 0x88, 0x9f, 0x7e, 0x7d, 0x37, 0x28, 0x5b, 0x10, 0xcc,
+    0x64, 0xf5, 0x2c, 0x9d, 0x8f, 0x94, 0x57, 0x67, 0x8f, 0xd0, 0xb6, 0x3f, 0x60, 0xec, 0x92, 0x5d,
+    0x11, 0x26, 0x5a, 0x02, 0xef, 0xee, 0xae, 0x70, 0x47, 0x42, 0x7e, 0xc0, 0x33, 0x6f, 0xb9, 0x25,
+    0x21, 0x11, 0xd5, 0x11, 0xfc, 0x23, 0x1c, 0xd3, 0xdb, 0x3e, 0xa4, 0xe9, 0x6a, 0x3a, 0x7e, 0x58,
+    0xae, 0xd6, 0xe3, 0xc8, 0x86, 0x91, 0xb0, 0x9b, 0x6c, 0x11, 0x29, 0x75, 0x1b, 0x79, 0x0a, 0x32,
+    0x76, 0x49, 0x20, 0x15, 0x57, 0x8a, 0xf3, 0xc6, 0xa6, 0x8f, 0xdf, 0x98, 0x9a, 0x5c, 0xcc, 0x23,
+    0x9f, 0xa3, 0x67, 0xb2, 0xe2, 0x91, 0x65, 0x41, 0xb7, 0x90, 0x80, 0x7e, 0xc9, 0x78, 0x3e, 0x82,
+    0x16, 0x7c, 0x8d, 0x4a, 0x01, 0x12, 0x37, 0xbc, 0x9d, 0x68, 0x5c, 0x3f, 0x9f, 0x0b, 0x90, 0xae,
+    0xe5, 0x93, 0x38, 0x0c, 0x3a, 0x42, 0x19, 0x34, 0x96, 0x9b, 0xfd, 0xeb, 0x60, 0x52, 0x9f, 0x70,
+    0x41, 0x2c, 0xed, 0xa8, 0xaf, 0x2f, 0x99, 0xc9, 0xaf, 0x99, 0x87, 0x1d, 0xc0, 0x51, 0x6a, 0x1c,
+    0xa6, 0xbc, 0x41, 0x03, 0x75, 0x8f, 0x0d, 0x14, 0x06, 0xf8, 0x2d, 0xe1, 0xba, 0x71, 0x25, 0x5e,
+    0xc5, 0xbd, 0xeb, 0xa4, 0x1c, 0xba, 0xdd, 0x47, 0xeb, 0x4a, 0x95, 0xa7, 0x1b, 0x05, 0xa9, 0xd1,
+    0x8d, 0xa7, 0x31, 0x44, 0x66, 0xa5, 0xbb, 0x07, 0x08, 0x38, 0xb3, 0x5d, 0x63, 0x66, 0x6a, 0x11,
+    0xe9, 0x83, 0xa7, 0x54, 0x0d, 0x7b, 0x04, 0x73, 0x7d, 0x9f, 0x82, 0xfc, 0xae, 0x99, 0xc3, 0xc7,
+    0x1f, 0x51, 0x1e, 0x59, 0x7f, 0x97, 0xf3, 0x82, 0xef, 0x9c, 0xf0, 0xdf, 0x91, 0xed, 0x63, 0xf3,
+    0x6d, 0xec, 0xe6, 0x74, 0x53, 0x57, 0xf3, 0x38, 0x0d, 0xcd, 0xff, 0x4a, 0x86, 0x33, 0x48, 0x6e,
+    0x36, 0x66, 0xb5, 0xfb, 0xe3, 0xc5, 0x7d, 0xd0, 0x1b, 0xe3, 0x52, 0x25, 0xd8, 0x1b, 0xd0, 0x0a,
+    0xd8, 0xea, 0x0a, 0xdc, 0x48, 0x28, 0xf4, 0x0c, 0x25, 0x47, 0x46, 0x1f, 0x33, 0xaa, 0x5f, 0xb4,
+    0x35, 0xb1, 0x78, 0x41, 0x80, 0xde, 0x68, 0x7f, 0xeb, 0x31, 0xde, 0x5a, 0x47, 0xda, 0x32, 0x36,
+    0xb8, 0x8d, 0x04, 0x08, 0xab, 0xd4, 0x44, 0x98, 0xb6, 0x29, 0xf2, 0x81, 0xeb, 0x57, 0x86, 0x56,
+    0x0b, 0x6f, 0x4c, 0xb6, 0x50, 0x6c, 0x74, 0x31, 0x52, 0x35, 0x58, 0x53, 0x21, 0xd4, 0x65, 0x82,
+    0x98, 0x9f, 0x6f, 0x04, 0x37, 0xc2, 0x3a, 0x9a, 0xc2, 0xbd, 0x1d, 0xdb, 0x77, 0xd4, 0xb3, 0x9c,
+    0x29, 0x93, 0xc1, 0x1c, 0x53, 0x2d, 0x0a, 0x52, 0xbf, 0x80, 0x04, 0x75, 0xdc, 0xf5, 0x27, 0x8b,
+    0xfd, 0x82, 0xb2, 0x26, 0x9b, 0x3d, 0x8d, 0xfb, 0x46, 0x61, 0x3b, 0xfd, 0x2a, 0x71, 0x0d, 0x3c,
+    0x18, 0xb4, 0x5a, 0xa5, 0x22, 0x29, 0xf9, 0x9f, 0xca, 0x9b, 0x95, 0xbd, 0x58, 0x22, 0x66, 0xa4,
+    0xfd, 0x65, 0x9b, 0xe4, 0x8f, 0xe3, 0x16, 0x7b, 0xa8, 0x56, 0x98, 0xf9, 0xa7, 0xd8, 0x8d, 0x5d,
+    0x6b, 0xb2, 0x5b, 0x1d, 0x32, 0xa1, 0xc3, 0x04, 0xba, 0xb7, 0x5c, 0x12, 0xdb, 0x8e, 0x68, 0x40,
+    0xa4, 0x82, 0x26, 0x5c, 0xbb, 0x6c, 0x1e, 0x21, 0x1e, 0x66, 0x09, 0x20, 0x2f, 0x0e, 0xa8, 0xcc,
+    0x7d, 0x92, 0xbf, 0x3e, 0x47, 0x66, 0xec, 0x59, 0x21, 0x4d, 0x22, 0x5b, 0xff, 0x94, 0x29, 0x3c,
+    0x8c, 0x4c, 0xa4, 0x6a, 0x2f, 0xf5, 0xdf, 0x99, 0x8b, 0xff, 0xd5, 0x1d, 0x14, 0x85, 0x93, 0xde,
+    0x3c, 0xc7, 0xae, 0x94, 0x5b, 0x83, 0x1c, 0x27, 0x39, 0xf9, 0x1c, 0xc4, 0x97, 0x49, 0xe2, 0xec,
+    0x2d, 0x94, 0x85, 0x72, 0xf1, 0x27, 0x7b, 0xdc, 0xef, 0xf4, 0x1c, 0x8d, 0x09, 0xce, 0x89, 0x43,
+    0xf0, 0x9b, 0x12, 0xae, 0x08, 0xd3, 0x6c, 0x1a, 0xe4, 0xe3, 0xfe, 0x03, 0xe8, 0x6c, 0x8d, 0x08,
+    0x03, 0x3c, 0x02, 0xa1, 0x7d, 0xdd, 0x31, 0x3b, 0xce, 0x25, 0x6c, 0x49, 0x85, 0x75, 0xeb, 0x6b,
+    0xe8, 0x03, 0x1c, 0x00, 0x97, 0x01, 0x1a, 0xdb, 0xaf, 0x34, 0xee, 0x23, 0x71, 0x45, 0xee, 0xb2,
+    0x05, 0x52, 0x05, 0x90, 0x5e, 0xd9, 0xd9, 0x91, 0x37, 0x25, 0x1f, 0xb8, 0x1e, 0x8e, 0x43, 0x1d,
+    0xc2, 0xa9, 0x48, 0x58, 0xd7, 0x30, 0x57, 0x07, 0x48, 0x8f, 0x97, 0x6b, 0xa0, 0x3a, 0x0b, 0x53,
+    0xcd, 0x56, 0x74, 0x8e, 0x8e, 0xbc, 0x24, 0xb8, 0x2b, 0x1a, 0xa2, 0x84, 0x6e, 0x65, 0xd4, 0x1a,
+    0x17, 0x06, 0x56, 0xc6, 0x63, 0xbc, 0x85, 0x73, 0xda, 0xf5, 0xd5, 0xd7, 0x7d, 0x42, 0x7b, 0xf3,
+    0xa9, 0x44, 0x81, 0xaa, 0xfc, 0x61, 0x19, 0x8d, 0x50, 0x1f, 0xbb, 0x4b, 0x92, 0xea, 0x5f, 0x26,
+    0x89, 0x8a, 0x29, 0xea, 0x66, 0x4a, 0xd9, 0x8e, 0x08, 0x5c, 0xb7, 0x40, 0xc1, 0x79, 0x0c, 0xc6,
+    0x50, 0x6e, 0xf0, 0x3e, 0x8a, 0xf5, 0xca, 0x11, 0x13, 0xed, 0x97, 0xbd, 0x6e, 0xe0, 0xe9, 0xf9,
+    0xf2, 0xc4, 0x99, 0x92, 0x96, 0x97, 0x3c, 0x5a, 0x25, 0x86, 0xd0, 0xb2, 0x4a, 0x7d, 0x0e, 0x6d,
+    0xed, 0x0f, 0x81, 0x6e, 0x41, 0xfa, 0xbb, 0xe7, 0xb3, 0xa5, 0x63, 0xdd, 0xc8, 0xb2, 0xe0, 0x49,
+    0x5e, 0x74, 0x96, 0x0f, 0x64, 0x35, 0x3b, 0xf4, 0xe0, 0x4d, 0xa9, 0x34, 0x8d, 0xce, 0x31, 0xfd,
+    0x1f, 0x61, 0xd1, 0x3c, 0x6c, 0xda, 0xda, 0x1d, 0x2e, 0x40, 0x15, 0x05, 0x06, 0x95, 0x75, 0x25,
+    0x62, 0x8b, 0x74, 0xa4, 0xa1, 0x34, 0x93, 0x4e, 0xf8, 0xc7, 0x06, 0x68, 0xa7, 0x46, 0x5e, 0xe6,
+    0xaf, 0x4c, 0x4f, 0x4e, 0x94, 0xbc, 0xf8, 0x4d, 0x02, 0x87, 0x80, 0xda, 0xac, 0xfb, 0x36, 0x95,
+    0xa5, 0xf1, 0x5c, 0x5a, 0x16, 0x4b, 0x57, 0x92, 0xc3, 0x52, 0x11, 0x7e, 0xe2, 0x5c, 0x27, 0x0b,
+    0x27, 0xb5, 0x60, 0x21, 0xdd, 0x05, 0x9a, 0x14, 0xda, 0x81, 0x40, 0x7a, 0xe8, 0xd5, 0x26, 0xc0,
+    0x56, 0x75, 0xd8, 0xc5, 0x64, 0x42, 0xb3, 0x6e, 0x59, 0x4e, 0xcf, 0xe7, 0xaf, 0x37, 0x09, 0x8a,
+    0xd5, 0xcf, 0xa8, 0xd0, 0x7e, 0x3c, 0xb8, 0x5b, 0xcf, 0x60, 0x3d, 0x97, 0x95, 0xc0, 0x88, 0x5b,
+    0x42, 0x14, 0xde, 0xf2, 0xb2, 0x8b, 0xf3, 0x99, 0xf2, 0x18, 0x16, 0xfd, 0x46, 0xdf, 0x44, 0xcb,
+    0x93, 0x56, 0xc7, 0x5b, 0x7f, 0x13, 0x1c, 0xae, 0x01, 0x09, 0x45, 0xdf, 0xbb, 0x72, 0x63, 0x7f,
+    0xe0, 0x78, 0x5f, 0xb7, 0xcc, 0x73, 0xf9, 0xc3, 0xa0, 0x33, 0xec, 0x0b, 0xad, 0xe1, 0xc8, 0x03,
+    0x16, 0x7e, 0x2a, 0x8b, 0x84, 0xca, 0x20, 0x40, 0x7d, 0xbd, 0xc1, 0xef, 0xde, 0x4a, 0xcc, 0xae,
+    0x2d, 0xbe, 0xfd, 0xbd, 0xdd, 0x3b, 0x65, 0xd9, 0x39, 0x81, 0x0f, 0x5a, 0xb5, 0x9a, 0xf9, 0x38,
+    0xf9, 0x84, 0x8b, 0x7c, 0x20, 0x63, 0x54, 0x41, 0xea, 0x1a, 0x79, 0x49, 0x9d, 0xa2, 0x88, 0x4d,
+    0xeb, 0xd7, 0x0f, 0xe0, 0x60, 0xa6, 0xa9, 0xe8, 0x98, 0xd2, 0x03, 0x9e, 0x94, 0x5f, 0x69, 0x69,
+    0x91, 0x8b, 0x5f, 0x08, 0x98, 0x9c, 0x53, 0xa9, 0x2b, 0x05, 0xde, 0xfb, 0xcc, 0xf7, 0xd8, 0x8b,
+    0x5c, 0x19, 0x97, 0x35, 0x8f, 0x06, 0xbd, 0x3e, 0xc9, 0xfc, 0xd3, 0x36, 0x36, 0xc5, 0x24, 0xc1,
+    0x55, 0x9c, 0xb8, 0x8a, 0x88, 0x06, 0x3e, 0x15, 0x38, 0x37, 0x15, 0xb6, 0xba, 0xc1, 0x91, 0x8f,
+    0x9c, 0x18, 0x5b, 0xc0, 0x66, 0xf1, 0xeb, 0x7e, 0x26, 0x41, 0x90, 0x90, 0x28, 0xcf, 0x7f, 0xc1,
+    0xd7, 0x21, 0xac, 0xb7, 0xf9, 0xfe, 0x4f, 0x1d, 0x3c, 0xca, 0xd6, 0x0b, 0xa3, 0xe2, 0x9b, 0x17,
+    0x13, 0x32, 0x3a, 0xcf, 0xba, 0xa1, 0xe0, 0xf2, 0x89, 0x9c, 0xea, 0x3a, 0x19, 0x29, 0xf0, 0x84,
+    0x68, 0x3e, 0xff, 0x99, 0xc1, 0xba, 0x0c, 0x05, 0xe0, 0xba, 0x3f, 0xe3, 0x0f, 0x32, 0x5c, 0xb1,
+    0x02, 0xcd, 0x70, 0xf2, 0x57, 0x7f, 0xe7, 0x38, 0x62, 0x0d, 0xee, 0x07, 0xb8, 0x16, 0xfb, 0xa5,
+    0x22, 0x72, 0x15, 0xa3, 0x59, 0xe5, 0x25, 0x6d, 0x80, 0x05, 0x20, 0xa2, 0xbc, 0xfa, 0x56, 0xe7,
+    0x61, 0x18, 0x29, 0x7e, 0x46, 0xe8, 0x79, 0x7e, 0x82, 0x3e, 0xa8, 0xa2, 0x8a, 0x62, 0xcf, 0xc6,
+    0x15, 0xd7, 0x86, 0xaa, 0x10, 0xf5, 0x64, 0x56, 0xec, 0x35, 0x77, 0xf5, 0x3f, 0x28, 0x4e, 0xef,
+    0x88, 0x88, 0x47, 0x8d, 0x1a, 0x6a, 0xe1, 0xec, 0xc0, 0xa0, 0x69, 0x93, 0x79, 0x31, 0x70, 0x7f,
+    0xdf, 0x18, 0x30, 0xf9, 0x5d, 0x94, 0x5f, 0x38, 0x29, 0xeb, 0x69, 0x2e, 0x11, 0xb9, 0xb2, 0x4c,
+    0xd5, 0xd8, 0x67, 0x4b, 0x55, 0x9e, 0xd7, 0xe6, 0x2a, 0xc1, 0xda, 0xcb, 0xb5, 0xd6, 0x40, 0x06,
+    0xe0, 0xf1, 0x64, 0x7b, 0x75, 0xf6, 0xb7, 0x03, 0x9a, 0x6f, 0x9e, 0x58, 0xdd, 0x0b, 0xf5, 0x10,
+    0x03, 0xa5, 0x9f, 0xa2, 0x3d, 0x2d, 0x84, 0x3a, 0xd1, 0x32, 0x19, 0xbe, 0x28, 0x4a, 0x7a, 0x2a,
+    0xbe, 0x29, 0x8b, 0x9c, 0x5b, 0x26, 0xf6, 0xc9, 0x61, 0xd5, 0x2d, 0x1f, 0xd9, 0x90, 0x9e, 0xa4,
+    0x01, 0x70, 0x5d, 0x5f, 0x67, 0x41, 0x50, 0x38, 0x96, 0x2f, 0xf5, 0x6a, 0x35, 0xce, 0x7c, 0xd9,
+    0xcf, 0x2e, 0x3c, 0x1d, 0x99, 0x65, 0x8f, 0x47, 0x28, 0x21, 0xd0, 0xda, 0xd3, 0x88, 0xa1, 0xf7,
+    0xf4, 0xbf, 0x5c, 0xd9, 0x6b, 0xfd, 0x5f, 0x73, 0x98, 0x15, 0x0a, 0x94, 0xde, 0x7a, 0x8e, 0x39,
+    0x1c, 0x48, 0xd2, 0xe2, 0x93, 0x90, 0xd3, 0x11, 0xd9, 0x4e, 0x15, 0x8e, 0x60, 0x61, 0xba, 0xf0,
+    0x05, 0xce, 0x4e, 0xce, 0xa1, 0x19, 0xa1, 0xbe, 0xd1, 0x7c, 0x68, 0x76, 0x66, 0x4d, 0x39, 0x81,
+    0x14, 0xab, 0x07, 0x68, 0xbc, 0xae, 0xdf, 0x22, 0x07, 0x7e, 0x78, 0x8b, 0xe3, 0x48, 0x75, 0x9a,
+    0xef, 0xec, 0x43, 0x1b, 0x9a, 0x5d, 0xc4, 0xa2, 0xc4, 0x1f, 0xaf, 0x92, 0x01, 0xf5, 0x8e, 0x46,
+    0xaf, 0xb1, 0x04, 0x16, 0xca, 0xe2, 0x89, 0x11, 0x64, 0x42, 0xe3, 0xcb, 0x2e, 0x07, 0xef, 0xb4,
+    0x33, 0x84, 0x7a, 0xcf, 0x20, 0x5e, 0x45, 0x6d, 0x3e, 0x01, 0xd5, 0x46, 0x99, 0x7b, 0x29, 0x79,
+    0x66, 0x1c, 0x33, 0x72, 0xba, 0xe7, 0x77, 0x8a, 0x2f, 0x4a, 0x1b, 0xd6, 0x02, 0xbe, 0xa5, 0x43,
+    0x7f, 0xae, 0xdf, 0x69, 0x43, 0x20, 0xab, 0x06, 0x7d, 0xaf, 0x87, 0xc0, 0x22, 0x2e, 0x75, 0x5b,
+    0x3b, 0x16, 0x26, 0x53, 0x6a, 0xc2, 0x40, 0x1e, 0x9a, 0x66, 0x6c, 0x83, 0xe6, 0xf4, 0xbd, 0xf3,
+    0xbd, 0x17, 0x9c, 0x3c, 0xf6, 0xf4, 0xd7, 0x27, 0x29, 0x49, 0x0a, 0x03, 0x3e, 0xb0, 0x2f, 0x3a,
+    0xcc, 0xf8, 0x6e, 0x06, 0x85, 0x8d, 0x87, 0x67, 0x64, 0x13, 0xb3, 0x8b, 0x42, 0x49, 0x46, 0x9b,
+    0xae, 0xc8, 0x6a, 0x9f, 0x5a, 0xc4, 0x68, 0x77, 0x47, 0x21, 0x9f, 0xf3, 0xc2, 0x83, 0xdf, 0x81,
+    0x78, 0xfd, 0x57, 0x43, 0x32, 0x07, 0xea, 0xa4, 0x28, 0x18, 0x3d, 0x63, 0x38, 0x4d, 0x56, 0xed,
+    0x0c, 0xe9, 0xa2, 0xec, 0x3a, 0x9d, 0xde, 0xc3, 0xfb, 0x80, 0x22, 0xc1, 0xb2, 0x24, 0xf6, 0x79,
+    0x82, 0xe8, 0x27, 0x51, 0xc3, 0xd7, 0xe4, 0x5a, 0x26, 0x84, 0x7b, 0x83, 0x7d, 0xcf, 0x67, 0x0b,
+    0x74, 0x02, 0x24, 0xb0, 0x6a, 0xbe, 0x7e, 0x6c, 0x4f, 0xa2, 0xe0, 0xbf, 0x5d, 0x0a, 0x6a, 0xca,
+    0xf6, 0x52, 0x9a, 0x71, 0xa7, 0x85, 0x8d, 0xf7, 0x59, 0x2a, 0xa8, 0x57, 0x44, 0x03, 0xa4, 0x13,
+    0x1b, 0x14, 0x47, 0x81, 0x75, 0xad, 0x4a, 0x1e, 0xc1, 0x4c, 0x44, 0x91, 0xd3, 0xb6, 0x89, 0x10,
+    0x07, 0x79, 0x47, 0xf8, 0x7c, 0x4e, 0xcf, 0x69, 0x37, 0x06, 0x73, 0xdd, 0x13, 0x0b, 0x3a, 0x6e,
+    0xeb, 0xb8, 0xd9, 0xed, 0xc3, 0xb7, 0x4e, 0x1e, 0x18, 0x97, 0xc2, 0x65, 0xd6, 0x83, 0x0c, 0x81,
+    0x37, 0x60, 0xd8, 0x1f, 0xe5, 0x87, 0xe4, 0xbf, 0xa3, 0xff, 0xac, 0x7b, 0x28, 0x54, 0x6e, 0x12,
+    0x1d, 0x5c, 0xee, 0x82, 0x31, 0x95, 0xd3, 0xfa, 0xc8, 0x50, 0xa9, 0xd6, 0x09, 0x52, 0xbb, 0x5a,
+    0xac, 0x29, 0x02, 0x8a, 0xdb, 0xd2, 0x4a, 0x5c, 0x35, 0x70, 0x74, 0x5f, 0xd7, 0x09, 0xae, 0x58,
+    0x91, 0x86, 0x0b, 0x5b, 0x6a, 0x15, 0x56, 0xc3, 0xc4, 0xb1, 0x43, 0x9b, 0x47, 0x47, 0xc6, 0x70,
+    0x7e, 0xd3, 0xfe, 0x4f, 0x17, 0xa8, 0x41, 0x0a, 0xc0, 0x6b, 0x4d, 0x2c, 0x3e, 0x8b, 0x3a, 0xfa,
+    0x53, 0xd9, 0x6f, 0x3f, 0x58, 0x01, 0x59, 0xda, 0x29, 0x3d, 0x85, 0xc5, 0x9f, 0x4d, 0xc1, 0x64,
+    0xb6, 0x32, 0x08, 0x0c, 0x22, 0xd7, 0x81, 0x78, 0x3d, 0xd4, 0xf3, 0x9b, 0xe6, 0x98, 0xe2, 0x22,
+    0x08, 0xd1, 0x5f, 0x7f, 0xfa, 0x3a, 0xc7, 0x01, 0xac, 0x90, 0x83, 0x5a, 0x98, 0x78, 0xfa, 0x82,
+    0x52, 0x2c, 0xf4, 0x23, 0x3b, 0x4d, 0xec, 0x2f, 0xc8, 0x2b, 0xcd, 0x07, 0xbb, 0x50, 0x10, 0x48,
+    0xb3, 0x8b, 0x27, 0x96, 0x49, 0xf5, 0x47, 0x51, 0xa3, 0xb0, 0x52, 0x65, 0x5f, 0x2e, 0x8a, 0x78,
+    0xdb, 0xb2, 0xed, 0x7a, 0xa3, 0x88, 0x6d, 0xe2, 0x9e, 0x73, 0x64, 0xa5, 0x8d, 0xe5, 0x6e, 0xdc,
+    0x7d, 0xeb, 0xd2, 0xa4, 0x68, 0x5e, 0x7b, 0xa1, 0xeb, 0xf2, 0x78, 0x50, 0x09, 0x27, 0xef, 0xd1,
+    0xa9, 0xe0, 0x29, 0xa9, 0xac, 0x7a, 0xdf, 0xd7, 0x44, 0x30, 0x63, 0xf2, 0x2b, 0x01, 0xfd, 0xab,
+    0xb1, 0x4e, 0x4d, 0x10, 0x6d, 0xe5, 0x3a, 0xdd, 0x9c, 0x42, 0xb4, 0xcc, 0xb2, 0xdc, 0x4f, 0xbe,
+    0x22, 0xd2, 0x8b, 0x1d, 0x0d, 0x8e, 0x54, 0xd0, 0xcd, 0xd5, 0x03, 0xc7, 0xa3, 0xaa, 0x2b, 0x86,
+    0x77, 0x38, 0xa8, 0xcc, 0x26, 0xfe, 0x46, 0xd2, 0x3c, 0x8a, 0x9f, 0xe4, 0x3f, 0xff, 0xbc, 0xef,
+    0xfc, 0xba, 0x3f, 0xd6, 0xd1, 0xd9, 0xe4, 0x6f, 0x55, 0x33, 0x2c, 0xab, 0x62, 0xc6, 0x5a, 0x2c,
+    0x3a, 0xf6, 0x88, 0xb7, 0x72, 0xee, 0xff, 0xec, 0xfc, 0x82, 0x70, 0x23, 0x2c, 0x87, 0x40, 0x1b,
+    0x02, 0x5d, 0xe8, 0xf1, 0x65, 0x73, 0xd6, 0x99, 0x32, 0x57, 0xd7, 0x3e, 0x37, 0x9a, 0x19, 0x2f,
+    0x15, 0xa7, 0x84, 0x23, 0x4b, 0x76, 0x1d, 0x13, 0x02, 0x2a, 0x0c, 0xa0, 0x9a, 0x30, 0x33, 0xf5,
+    0xd8, 0x60, 0x9b, 0x54, 0xc2, 0xeb, 0x2f, 0xf6, 0x4b, 0x60, 0xe7, 0x83, 0xf3, 0x89, 0xdc, 0xe8,
+    0xd8, 0x8c, 0x08, 0x4c, 0x16, 0xe3, 0x87, 0x9e, 0x77, 0x74, 0x92, 0xe5, 0xef, 0x77, 0xd7, 0xe7,
+    0x1d, 0x33, 0x3a, 0x17, 0x34, 0x70, 0x7a, 0x95, 0xce, 0xee, 0x92, 0x81, 0xdc, 0x76, 0x46, 0x33,
+    0x1b, 0xef, 0x70, 0x98, 0x0b, 0xfd, 0x02, 0xf2, 0x1c, 0x1c, 0xcb, 0x1e, 0xba, 0x63, 0x8f, 0x3f,
+    0xfb, 0x8e, 0x2f, 0xc8, 0xb2, 0xe5, 0x63, 0xe9, 0x88, 0xaf, 0xc7, 0xb5, 0x1d, 0xd1, 0xb1, 0x9d,
+    0xbb, 0x75, 0xd5, 0x25, 0x93, 0x11, 0x30, 0xe4, 0x6e, 0xa8, 0x70, 0xd0, 0xfa, 0x0a, 0x9f, 0xbb,
+    0xcf, 0xb8, 0x3c, 0x64, 0x38, 0xf0, 0x65, 0x77, 0x44, 0x5a, 0x45, 0x60, 0x53, 0xb3, 0xe9, 0x4d,
+    0x17, 0x64, 0xa0, 0x82, 0x01, 0x8e, 0x72, 0x28, 0x5d, 0x63, 0x3a, 0x17, 0x5b, 0xfd, 0xc3, 0x3d,
+    0xab, 0xff, 0xb6, 0x3c, 0x26, 0x7d, 0xbb, 0x8c, 0x8b, 0xff, 0xea, 0xe0, 0x54, 0xdc, 0xd2, 0xff,
+    0xc4, 0x87, 0xf1, 0x0d, 0xa8, 0x72, 0x2d, 0xf0, 0x81, 0x0a, 0x8d, 0x9f, 0x1a, 0x30, 0xb4, 0x02,
+    0x72, 0x13, 0x06, 0xde, 0x60, 0xa0, 0xeb, 0x15, 0x68, 0xfa, 0xc9, 0x38, 0x10, 0x6c, 0xd5, 0x9d,
+    0x24, 0x72, 0x4e, 0xc0, 0x6b, 0x15, 0x29, 0x4f, 0x46, 0xe5, 0x32, 0xc6, 0x0a, 0x39, 0x75, 0xe5,
+    0xc5, 0xf2, 0x60, 0x58, 0x3e, 0x2d, 0x2d, 0xb2, 0x8f, 0xac, 0xab, 0x90, 0x6d, 0xeb, 0x14, 0x9a,
+    0xa1, 0xce, 0xeb, 0xa0, 0xd2, 0x92, 0xb2, 0x80, 0xcd, 0x9d, 0x64, 0xd7, 0x75, 0xcc, 0x54, 0x58,
+    0x40, 0xde, 0x7b, 0x98, 0x43, 0x5a, 0xe9, 0x53, 0xc9, 0xa8, 0x0a, 0x4e, 0xbc, 0xb8, 0xc5, 0x0c,
+    0x98, 0xc4, 0x6b, 0xb0, 0x5d, 0x37, 0x2e, 0x45, 0x2b, 0x2f, 0xfc, 0x47, 0x27, 0x35, 0x46, 0x85,
+    0x59, 0xbb, 0xd5, 0x04, 0x66, 0xbe, 0xc8, 0xf7, 0x72, 0x8f, 0x0b, 0x7c, 0x9d, 0xb1, 0xf3, 0xd6,
+    0x9e, 0x12, 0x46, 0x20, 0xe3, 0xc8, 0x9d, 0x34, 0x4b, 0x18, 0x85, 0x2e, 0x3e, 0xe1, 0x7d, 0xf7,
+    0xaf, 0x77, 0x3b, 0x54, 0x07, 0x33, 0xe6, 0x95, 0xd4, 0xa4, 0x19, 0x1a, 0xa3, 0x7e, 0xcb, 0x5c,
+    0xc4, 0x50, 0x46, 0xca, 0xb6, 0x19, 0xf4, 0xb0, 0x47, 0x0c, 0x6e, 0x37, 0xca, 0xb0, 0x2a, 0x1a,
+    0x31, 0xdc, 0x0f, 0x02, 0xaf, 0xa9, 0x2f, 0x44, 0x93, 0x1c, 0xa8, 0x15, 0xc0, 0xb4, 0x87, 0x24,
+    0x74, 0x9b, 0x10, 0xae, 0xa4, 0x22, 0x43, 0xa0, 0x45, 0x7d, 0x66, 0x2b, 0xa4, 0x04, 0xac, 0x0e,
+    0x9d, 0xfc, 0x97, 0x57, 0xb5, 0x50, 0x7e, 0x03, 0x06, 0xd4, 0x4d, 0x49, 0x41, 0x4b, 0xfa, 0x83,
+    0x7f, 0x9e, 0x0a, 0x2a, 0xd9, 0x5c, 0x30, 0x1a, 0x4c, 0x66, 0xea, 0x82, 0xf2, 0xda, 0xe9, 0x4a,
+    0xe8, 0x65, 0xca, 0x7b, 0x00, 0x22, 0x81, 0x7c, 0xdc, 0x0a, 0x4b, 0x00, 0x17, 0xa8, 0x41, 0xe0,
+    0xe9, 0x37, 0x54, 0xf8, 0x7c, 0x86, 0xd2, 0x8a, 0x0d, 0xbc, 0x63, 0x00, 0xec, 0x63, 0x91, 0x46,
+    0x4a, 0x32, 0xd0, 0xdf, 0x3e, 0x55, 0x21, 0xb4, 0x51, 0x65, 0xee, 0x8b, 0xe1, 0x96, 0x8e, 0x65,
+    0xf3, 0x92, 0x11, 0x0d, 0x0d, 0x62, 0x90, 0xf0, 0x17, 0x32, 0xbd, 0x22, 0xa2, 0x72, 0xb2, 0xb5,
+    0x2a, 0x8a, 0x76, 0x3a, 0x66, 0x10, 0x28, 0x80, 0x14, 0xf2, 0x25, 0x44, 0x3c, 0x3b, 0x63, 0x32,
+    0x08, 0x64, 0xf8, 0xe3, 0x1b, 0x96, 0x46, 0xa9, 0x74, 0x83, 0x56, 0xbd, 0x2f, 0x72, 0x1d, 0x10,
+    0x47, 0x42, 0x44, 0xa9, 0xfb, 0x15, 0xc6, 0xa8, 0xfd, 0xfe, 0x64, 0x05, 0x6e, 0x96, 0x76, 0xcc,
+    0xb9, 0x95, 0x88, 0xc3, 0x94, 0x01, 0x28, 0x9d, 0x53, 0xf1, 0x73, 0x1e, 0x5b, 0xf3, 0x0e, 0x91,
+    0x8d, 0xf5, 0xe4, 0x48, 0xa2, 0x7b, 0xe3, 0x83, 0xf4, 0x91, 0x13, 0xfd, 0x4d, 0xcb, 0xab, 0x12,
+    0x6d, 0x09, 0x21, 0x35, 0xc3, 0xe1, 0x2c, 0x08, 0x51, 0x9b, 0x7c, 0xd2, 0x71, 0x6d, 0xd5, 0x57,
+    0xe0, 0x50, 0x1e, 0xb3, 0xbb, 0x30, 0xad, 0x69, 0xf7, 0x6a, 0x68, 0x7a, 0x9f, 0x29, 0x21, 0x0d,
+    0x52, 0xdb, 0x83, 0x51, 0x00, 0xa6, 0x37, 0x9f, 0x72, 0xbd, 0x7e, 0x56, 0x4e, 0x3d, 0x9d, 0xab,
+    0xf3, 0x6c, 0xea, 0x99, 0x73, 0x08, 0xbc, 0x2e, 0x13, 0xd8, 0x5f, 0x0d, 0xb7, 0xfe, 0x02, 0x34,
+    0x47, 0x12, 0x1f, 0xbe, 0x2c, 0xac, 0xe7, 0x7b, 0x1e, 0x88, 0x01, 0x3e, 0x42, 0xbb, 0x7f, 0x28,
+    0x46, 0x16, 0x9f, 0x49, 0x60, 0x13, 0x3c, 0x39, 0x13, 0x4b, 0xc3, 0xca, 0xba, 0xff, 0x3d, 0xcb,
+    0xe9, 0xca, 0xaf, 0x46, 0xb0, 0xcf, 0x44, 0x20, 0xcf, 0xc2, 0x25, 0x52, 0x25, 0xb9, 0x67, 0x7d,
+    0x88, 0x13, 0x99, 0xdf, 0x77, 0x3b, 0xa7, 0x9f, 0x8b, 0x04, 0xb6, 0xbe, 0x69, 0x6f, 0x83, 0xbf,
+    0x87, 0x80, 0xb8, 0x0c, 0x3f, 0x64, 0x06, 0x07, 0xe0, 0x96, 0x11, 0xf3, 0xc7, 0x76, 0xd2, 0x2f,
+    0x59, 0x93, 0xe7, 0xbd, 0x8d, 0x47, 0x28, 0x65, 0x00, 0xa9, 0x94, 0x95, 0x50, 0xbd, 0x8a, 0x40,
+    0xe7, 0xe0, 0x43, 0x39, 0xa5, 0x1d, 0x61, 0x87, 0xca, 0x44, 0xd9, 0xcd, 0x37, 0xce, 0xa9, 0x56,
+    0x55, 0x92, 0xee, 0x2f, 0xba, 0x29, 0xa5, 0x20, 0x02, 0x63, 0x64, 0xdd, 0xa1, 0xbd, 0xf2, 0x25,
+    0x4a, 0x79, 0xce, 0x80, 0x58, 0x16, 0xc6, 0x28, 0x65, 0xc0, 0x27, 0x3d, 0x19, 0x73, 0xee, 0xd4,
+    0x1a, 0x21, 0x79, 0x8c, 0x43, 0x00, 0x32, 0xe7, 0x0a, 0xa9, 0x66, 0xb4, 0xdf, 0x3f, 0x84, 0xd3,
+    0x39, 0xb6, 0x62, 0x49, 0x06, 0x7f, 0x11, 0x9a, 0x0a, 0x84, 0xdf, 0x32, 0x46, 0x07, 0xcd, 0x3a,
+    0xcc, 0xeb, 0x27, 0xf7, 0x5c, 0x65, 0xc2, 0x5a, 0xb6, 0xa0, 0x6f, 0x3c, 0x4f, 0x61, 0x8f, 0xf0,
+    0x22, 0xf9, 0x0d, 0x0a, 0xd1, 0x81, 0x0b, 0x0a, 0xf1, 0x9a, 0x3c, 0x82, 0x7a, 0x50, 0x0c, 0x66,
+    0x84, 0xf7, 0xd8, 0xc8, 0x21, 0xa9, 0x1c, 0xf7, 0xd1, 0xdb, 0x7c, 0x33, 0x24, 0xae, 0xf9, 0xc3,
+    0xb2, 0xbe, 0x32, 0x43, 0xdf, 0x81, 0xd2, 0x6c, 0x45, 0xe8, 0x4b, 0x07, 0x06, 0xed, 0x99, 0xf7,
+    0xa7, 0xab, 0x60, 0x96, 0x9f, 0x2a, 0x75, 0x83, 0xb9, 0xda, 0xea, 0x06, 0x94, 0x58, 0x1c, 0x18,
+    0xa2, 0x82, 0x6e, 0x85, 0x0f, 0xca, 0x36, 0xb9, 0x84, 0x04, 0x40, 0xce, 0xb5, 0x8f, 0xed, 0xe4,
+    0xdd, 0x27, 0x9f, 0x3b, 0xd4, 0xe8, 0xde, 0x3e, 0x93, 0x6a, 0x18, 0x71, 0x94, 0x6c, 0x77, 0xad,
+    0xb8, 0x4d, 0x56, 0xab, 0xf2, 0x0d, 0x63, 0x80, 0x9a, 0xc3, 0xdc, 0x81, 0x62, 0x47, 0xf6, 0x12,
+    0xbd, 0xdb, 0xd0, 0x99, 0x98, 0x23, 0x0f, 0xd1, 0xa4, 0x91, 0xcd, 0xff, 0xa8, 0x76, 0x23, 0x6c,
+    0x51, 0x28, 0xcb, 0x56, 0x7a, 0xa7, 0xb3, 0x58, 0xea, 0x6f, 0x02, 0xdc, 0x4a, 0x8f, 0x62, 0xeb,
+    0xbb, 0x51, 0xfc, 0x0d, 0xa9, 0x25, 0x96, 0x69, 0xf5, 0x77, 0x2b, 0x7f, 0xda, 0x5a, 0x66, 0x4f,
+    0x9b, 0x9c, 0xa1, 0x79, 0x20, 0xc8, 0x87, 0x58, 0x5f, 0x16, 0xa3, 0xea, 0x2f, 0xd8, 0xec, 0x5b,
+    0x6b, 0x48, 0xe6, 0xef, 0x7a, 0xb8, 0xcf, 0x09, 0x9f, 0xb8, 0x23, 0x30, 0x27, 0x6d, 0x47, 0x89,
+    0x89, 0xf3, 0xe2, 0x2d, 0x46, 0x16, 0x98, 0x0a, 0xd4, 0xbd, 0x1e, 0xaa, 0xff, 0xb5, 0xc1, 0xdb,
+    0x39, 0x70, 0xee, 0xde, 0xc3, 0x67, 0x30, 0x16, 0x00, 0xfe, 0xd6, 0x0c, 0xca, 0xd7, 0xa7, 0xc8,
+    0x9e, 0xa7, 0x26, 0x54, 0xfb, 0x0d, 0x7b, 0x51, 0x6e, 0x6a, 0xdc, 0x11, 0x1c, 0x14, 0x08, 0xda,
+    0xed, 0xf2, 0xe9, 0x1f, 0x5d, 0x00, 0x2d, 0x1a, 0x4a, 0x23, 0xb1, 0xb6, 0x41, 0xef, 0x29, 0x9c,
+    0x1f, 0x19, 0x4c, 0xae, 0x7d, 0xd3, 0x0e, 0xe1, 0xb2, 0xde, 0x50, 0x5d, 0x85, 0x34, 0xf5, 0x16,
+    0x2b, 0xd0, 0x31, 0x61, 0x9a, 0x9d, 0x19, 0xd6, 0x6c, 0xf4, 0xbe, 0x9c, 0x43, 0xa9, 0xc2, 0xd7,
+    0x0f, 0xe3, 0x87, 0xad, 0xa3, 0x31, 0x7f, 0x46, 0xb9, 0xb5, 0x11, 0x6e, 0x06, 0x03, 0xc1, 0xd3,
+    0x8a, 0x79, 0x36, 0xc2, 0x37, 0xac, 0x12, 0x7e, 0x13, 0x6a, 0x6c, 0x12, 0x79, 0x25, 0x43, 0x5f,
+    0x4b, 0x03, 0xf3, 0xae, 0x4e, 0xc0, 0x4d, 0x20, 0x74, 0xf0, 0x75, 0x44, 0x8a, 0x3c, 0x33, 0x6d,
+    0x2d, 0xbb, 0xb5, 0x9e, 0x6f, 0x22, 0x56, 0x4a, 0x18, 0xc1, 0x63, 0x35, 0x94, 0x3d, 0xfa, 0xba,
+    0x7d, 0x24, 0xaf, 0xcf, 0xdc, 0x8e, 0x12, 0x1d, 0x1d, 0x4f, 0xd0, 0xda, 0xaa, 0x1a, 0x03, 0xe7,
+    0x3f, 0x4d, 0xaa, 0xc9, 0xd0, 0x57, 0x5d, 0xe7, 0x3b, 0xf3, 0x9b, 0xa8, 0x74, 0x91, 0xe7, 0x2b,
+    0x24, 0xe5, 0xe0, 0xfb, 0x4e, 0xdd, 0x53, 0xca, 0xff, 0xca, 0x5f, 0x31, 0xe7, 0xae, 0xb1, 0x78,
+    0xcb, 0xbe, 0xb1, 0x64, 0xf9, 0x9d, 0x69, 0xb8, 0x01, 0x01, 0x54, 0xa2, 0x45, 0x1e, 0xdb, 0xe1,
+    0xde, 0x68, 0xa0, 0xba, 0xd1, 0x67, 0xc6, 0x4a, 0xcd, 0xc4, 0x5a, 0x16, 0xaf, 0x48, 0x3e, 0x24,
+    0x1f, 0x26, 0x62, 0xe3, 0x61, 0xfe, 0x56, 0x13, 0xb7, 0x44, 0xfd, 0x06, 0xdb, 0x59, 0xa9, 0x8a,
+    0x19, 0xc7, 0x67, 0x1d, 0x4e, 0xd0, 0xa8, 0x25, 0xe1, 0xeb, 0xd7, 0xae, 0x15, 0xdd, 0x6c, 0xe5,
+    0x51, 0x22, 0x13, 0x2d, 0xd9, 0x3e, 0x09, 0x19, 0xfe, 0x89, 0x91, 0x4c, 0x49, 0x5f, 0x5c, 0x79,
+    0x88, 0xe0, 0x5e, 0xf5, 0x33, 0x9b, 0x25, 0x3f, 0xb5, 0xea, 0x3c, 0x3f, 0x7a, 0x8f, 0x69, 0x68,
+    0xc4, 0xd9, 0xa8, 0xe1, 0x40, 0x84, 0xfd, 0xc6, 0xd0, 0x0a, 0x3c, 0x16, 0x08, 0x45, 0x48, 0x90,
+    0xbe, 0xd1, 0x1a, 0x3e, 0x8e, 0x20, 0x7e, 0xb3, 0x68, 0x88, 0xee, 0x92, 0x7f, 0xd0, 0x23, 0xa3,
+    0xe8, 0x0a, 0x15, 0x0c, 0x7e, 0x87, 0x0d, 0x55, 0x39, 0x7e, 0x84, 0x59, 0x1f, 0x6b, 0x44, 0xe0,
+    0xde, 0xf3, 0xae, 0x2c, 0xb8, 0xbf, 0x44, 0x93, 0xde, 0xec, 0x0e, 0x44, 0x2f, 0x94, 0x62, 0xef,
+    0xff, 0xf4, 0xba, 0x82, 0x4e, 0x07, 0x6a, 0xc5, 0xed, 0x9f, 0x63, 0x39, 0x32, 0x9c, 0x16, 0x34,
+    0x01, 0xa9, 0x3c, 0x53, 0xc2, 0x00, 0x37, 0x0f, 0xea, 0x21, 0xf0, 0x28, 0x8f, 0xc2, 0xc9, 0x88,
+    0x5c, 0x48, 0x85, 0xdc, 0xc6, 0x46, 0x95, 0x14, 0xc5, 0xdf, 0x63, 0x48, 0x61, 0xd2, 0x19, 0xb8,
+    0xb8, 0xfa, 0x85, 0x10, 0x87, 0x7a, 0x10, 0xcc, 0x81, 0x14, 0x84, 0x5d, 0x79, 0xd6, 0xfa, 0x80,
+    0xe1, 0x30, 0xdc, 0x54, 0x98, 0xe6, 0x39, 0x69, 0xc4, 0x83, 0xbd, 0x7c, 0x91, 0x57, 0xd8, 0xa5,
+    0x09, 0xa0, 0xfb, 0x98, 0x5d, 0x8d, 0x28, 0x03, 0xb9, 0x8d, 0x3c, 0xe4, 0xc3, 0xb8, 0xfa, 0xc6,
+    0x91, 0x1d, 0xb6, 0x3b, 0x9b, 0xb2, 0xd5, 0x56, 0xb1, 0x90, 0xd8, 0xfd, 0xbc, 0x21, 0x41, 0x9f,
+    0x08, 0x71, 0x5f, 0x37, 0xe0, 0xea, 0x6f, 0x62, 0x8b, 0x60, 0xba, 0xfd, 0xdb, 0x3c, 0x94, 0x44,
+    0xe4, 0x95, 0x3c, 0xed, 0x7b, 0xd2, 0xd0, 0x4f, 0x8e, 0x07, 0xbe, 0xf7, 0x2d, 0x73, 0xd5, 0xad,
+    0x71, 0xde, 0xb9, 0x18, 0x22, 0xae, 0xbb, 0x06, 0xb7, 0x99, 0x4a, 0x2f, 0xff, 0x70, 0xe6, 0x31,
+    0x85, 0x58, 0x01, 0xe5, 0x15, 0x01, 0x43, 0xb5, 0x51, 0xd0, 0xf0, 0x0c, 0xe2, 0x9e, 0xe2, 0x5d,
+    0x0e, 0xc8, 0xba, 0x8f, 0x38, 0xb5, 0x4f, 0xce, 0xd8, 0x0d, 0x4b, 0x90, 0x1e, 0x04, 0x83, 0xe5,
+    0x62, 0x29, 0x1f, 0x63, 0x10, 0xd6, 0xd4, 0x4e, 0xe2, 0xed, 0xc3, 0x38, 0x3e, 0x9e, 0x95, 0xd8,
+    0x63, 0x5d, 0x7e, 0xcf, 0x64, 0xa1, 0x84, 0x80, 0x7f, 0x63, 0xeb, 0x10, 0xd6, 0x36, 0x5b, 0xd9,
+    0xc8, 0x54, 0x9d, 0xee, 0x5e, 0xcd, 0x99, 0x17, 0x18, 0x29, 0x84, 0x0b, 0x4a, 0xbe, 0x0c, 0xc9,
+    0x14, 0xc6, 0x91, 0x6f, 0x69, 0xa8, 0x11, 0x8d, 0x5b, 0xc1, 0x19, 0xc1, 0x8f, 0xc0, 0x66, 0xf9,
+    0x36, 0xc8, 0x91, 0x7b, 0x70, 0xc7, 0x42, 0x3d, 0x9f, 0xb9, 0x24, 0xd7, 0x45, 0xbf, 0x42, 0xa0,
+    0x0a, 0x1f, 0x48, 0x60, 0xec, 0x3e, 0x39, 0x6f, 0x87, 0x5d, 0xfc, 0x91, 0xb7, 0x44, 0xef, 0xde,
+    0xe9, 0x6e, 0x38, 0xb3, 0xb4, 0x9f, 0x15, 0x29, 0x4a, 0xfc, 0x15, 0xdf, 0xff, 0x61, 0x6f, 0xac,
+    0xa8, 0xdc, 0x6d, 0xfc, 0xbf, 0x47, 0x0a, 0x92, 0x3f, 0x24, 0x0d, 0x01, 0x9a, 0xe4, 0xe0, 0x16,
+    0xc1, 0x4e, 0x49, 0xd4, 0x08, 0x43, 0xb9, 0xde, 0xca, 0x83, 0x74, 0xea, 0x94, 0x5a, 0x2a, 0xd2,
+    0xa3, 0x81, 0xbd, 0xdd, 0xc8, 0xe7, 0xe9, 0xba, 0x81, 0xfd, 0xa3, 0x8b, 0x20, 0x9c, 0xfd, 0x16,
+    0x1f, 0xe7, 0xe5, 0x6a, 0xa8, 0x85, 0x23, 0x27, 0x64, 0xcf, 0x39, 0xcc, 0x2b, 0x3a, 0x1f, 0xce,
+    0x9b, 0x7e, 0x8c, 0x82, 0x89, 0xe3, 0x23, 0x66, 0xef, 0x64, 0xb5, 0x7c, 0x17, 0xc9, 0x69, 0x35,
+    0x10, 0xfd, 0x77, 0xc8, 0x03, 0xc8, 0x28, 0xaf, 0x13, 0x89, 0x3b, 0xfd, 0x47, 0x06, 0x61, 0x0d,
+    0x70, 0x8b, 0x16, 0xd0, 0x7b, 0xc4, 0x4b, 0x71, 0x1f, 0xf8, 0x23, 0x6b, 0x4b, 0xd3, 0x6a, 0xc1,
+    0x71, 0x73, 0x7d, 0x7a, 0x7b, 0x93, 0xd3, 0x02, 0xc3, 0x50, 0xa3, 0xeb, 0x04, 0xbd, 0xa0, 0xa5,
+    0xa1, 0x35, 0x6d, 0x87, 0xaf, 0xe9, 0x0e, 0xa1, 0x01, 0xdc, 0x9c, 0x72, 0x65, 0x15, 0x87, 0x82,
+    0xaa, 0xa9, 0x7c, 0x8f, 0x59, 0x71, 0x46, 0x9c, 0xe7, 0x57, 0x63, 0x4a, 0xb7, 0xc7, 0xd9, 0x69,
+    0x37, 0x3f, 0xcd, 0x8e, 0xed, 0x6e, 0xc8, 0xf1, 0xf7, 0x7a, 0x25, 0xdd, 0xed, 0xf3, 0x6b, 0x9a,
+    0x72, 0x92, 0xd0, 0x74, 0x11, 0x8d, 0x58, 0x31, 0x3c, 0xfe, 0x07, 0x04, 0x84, 0x75, 0xa1, 0x83,
+    0x21, 0x55, 0x74, 0xa1, 0xfb, 0x54, 0x65, 0xce, 0x53, 0xf1, 0x17, 0x0d, 0xd4, 0xb9, 0xa9, 0x32,
+    0x0a, 0x79, 0x3b, 0x39, 0xc9, 0x77, 0xcf, 0xf4, 0xcf, 0xb3, 0xfb, 0xf7, 0xd7, 0x20, 0x39, 0x6e,
+    0xb3, 0xc9, 0x5b, 0x09, 0xe7, 0xaf, 0x76, 0x81, 0x25, 0x5f, 0x2b, 0x14, 0x88, 0xba, 0x1e, 0x4d,
+    0x09, 0xd9, 0xba, 0xd3, 0x66, 0xef, 0x00, 0x4f, 0x4c, 0xf7, 0xaf, 0xcd, 0x8a, 0xd1, 0x8d, 0x42,
+    0xc6, 0x3d, 0x5f, 0x73, 0xff, 0x81, 0x55, 0xc1, 0x70, 0xc0, 0x55, 0x0e, 0x5a, 0x28, 0xa3, 0x6b,
+    0x0a, 0x48, 0x97, 0x49, 0xd5, 0xe4, 0x49, 0x7c, 0x6e, 0x6e, 0x5f, 0xc3, 0x88, 0x82, 0xc1, 0x84,
+    0x3a, 0xfb, 0xae, 0x30, 0xa0, 0x8e, 0xa3, 0x6d, 0x1e, 0x60, 0xac, 0x49, 0x60, 0x69, 0x47, 0x75,
+    0xa5, 0xdd, 0xcf, 0x6f, 0x44, 0x97, 0x90, 0x8f, 0x6c, 0x31, 0xc8, 0x52, 0xf6, 0xf5, 0x2c, 0x7b,
+    0x48, 0xe4, 0xb4, 0xdd, 0x01, 0x1f, 0xed, 0x7c, 0xbb, 0xfc, 0x6d, 0x9d, 0xd8, 0xc7, 0x94, 0x7a,
+    0x4b, 0x38, 0x3e, 0xe4, 0xf8, 0x0c, 0x20, 0xb2, 0x16, 0xb2, 0x05, 0x9f, 0xa0, 0x45, 0xdd, 0x24,
+    0x28, 0x3d, 0x65, 0x05, 0x5a, 0xec, 0x02, 0x9d, 0x95, 0x8e, 0x38, 0x3b, 0xaa, 0xe2, 0xfe, 0xbc,
+    0x47, 0xed, 0x65, 0xd5, 0xb3, 0xa0, 0xb3, 0x95, 0x5c, 0x6d, 0xc0, 0x2a, 0x38, 0x8e, 0xce, 0xc2,
+    0xf6, 0xe6, 0x72, 0xa7, 0x78, 0x81, 0x8f, 0x19, 0x48, 0x2e, 0x19, 0xb8, 0x82, 0xa5, 0xda, 0x87,
+    0x8c, 0x8a, 0xa8, 0xd2, 0xc5, 0x16, 0x15, 0xad, 0x53, 0x3b, 0xc6, 0xb0, 0xc1, 0x68, 0x68, 0xe4,
+    0x1f, 0xba, 0x82, 0x45, 0x0b, 0x2f, 0x9e, 0xb2, 0x39, 0xbd, 0x1b, 0x30, 0xb3, 0x02, 0xf8, 0x6d,
+    0x54, 0x4a, 0xb6, 0x48, 0x98, 0xf5, 0x5f, 0xe1, 0x0a, 0xba, 0x94, 0xba, 0xbe, 0x20, 0x53, 0x60,
+    0x37, 0x0f, 0x1b, 0x95, 0xd3, 0x1a, 0x1f, 0x3c, 0xcb, 0x48, 0xc9, 0x98, 0xd4, 0xd3, 0x8b, 0xc3,
+    0xce, 0x44, 0x75, 0x64, 0x0d, 0x51, 0x54, 0x6b, 0xf9, 0xdc, 0xee, 0xcd, 0xb1, 0x4f, 0x01, 0xaf,
+    0x80, 0x64, 0xb0, 0xac, 0xef, 0x52, 0xe2, 0x2f, 0xb1, 0x83, 0x73, 0xb6, 0x94, 0x0f, 0x6c, 0xdd,
+    0x40, 0xfd, 0x97, 0xf8, 0xac, 0x70, 0x52, 0xe8, 0xb7, 0x40, 0x33, 0x12, 0x9a, 0x83, 0x63, 0xa4,
+    0xca, 0x55, 0x76, 0xae, 0x8c, 0x6e, 0xed, 0x2d, 0x4f, 0xd2, 0x2d, 0x81, 0x77, 0x38, 0xf1, 0xa8,
+    0xbf, 0xcc, 0x48, 0x7d, 0x1e, 0x95, 0xd8, 0x7a, 0x90, 0x88, 0xb5, 0x91, 0x6a, 0x70, 0xa0, 0xa4,
+    0xa4, 0xe4, 0x51, 0x42, 0x1c, 0x89, 0x26, 0xee, 0xcc, 0x98, 0x27, 0xe7, 0xd3, 0x69, 0xb5, 0x33,
+    0x89, 0x83, 0x65, 0x51, 0xdb, 0xc7, 0xc5, 0xeb, 0xcd, 0xd0, 0x2e, 0xea, 0x43, 0x6c, 0xcf, 0xb9,
+    0xde, 0xff, 0xb3, 0x5b, 0x84, 0xc8, 0x78, 0x5f, 0xe8, 0x09, 0x93, 0x18, 0x1f, 0xd7, 0x8a, 0xa1,
+    0xb0, 0xb3, 0x38, 0x6e, 0x3c, 0x62, 0xa2, 0x3b, 0xb5, 0x8e, 0x20, 0xe9, 0x11, 0x02, 0xc5, 0x73,
+    0xf9, 0xf0, 0x36, 0xf6, 0xa9, 0x2d, 0x4a, 0xe1, 0x3f, 0x60, 0x84, 0x99, 0xfe, 0x08, 0x88, 0x97,
+    0x28, 0x7f, 0x43, 0x51, 0x6c, 0x76, 0x32, 0x6e, 0xfc, 0x8d, 0x6d, 0xb8, 0x8e, 0x58, 0x70, 0x65,
+    0xc5, 0x17, 0x77, 0x60, 0x0d, 0xbe, 0x8f, 0xfe, 0x44, 0x58, 0xd3, 0x4a, 0x7b, 0x8b, 0xc5, 0xef,
+    0x83, 0xf4, 0xb9, 0x64, 0x3b, 0xfd, 0xc8, 0x7b, 0x49, 0x00, 0x88, 0x43, 0x40, 0x68, 0x7c, 0xc8,
+    0xf4, 0x90, 0x93, 0x97, 0x3e, 0xab, 0x84, 0x78, 0x18, 0x68, 0x8e, 0x0b, 0x09, 0x03, 0x7f, 0x8e,
+    0xbe, 0x96, 0x5e, 0xc1, 0x4f, 0x71, 0xc8, 0x16, 0xc6, 0xb0, 0x52, 0xe5, 0xa5, 0x93, 0x20, 0x51,
+    0x4b, 0x4a, 0xdf, 0xe4, 0x65, 0xa3, 0xda, 0x28, 0x42, 0x5e, 0x33, 0xd2, 0xde, 0x49, 0x61, 0x3c,
+    0x10, 0x5a, 0xc2, 0x81, 0x97, 0x16, 0x38, 0x24, 0xd3, 0x4b, 0x88, 0xda, 0x71, 0xed, 0x0d, 0xa8,
+    0x07, 0x09, 0xc2, 0xee, 0x40, 0xae, 0x0f, 0x0e, 0x49, 0x4e, 0xcf, 0xd6, 0x7a, 0x47, 0x35, 0x41,
+    0x74, 0x3e, 0x20, 0x31, 0x51, 0x75, 0x4f, 0x06, 0x71, 0x90, 0x64, 0xde, 0xef, 0x25, 0xac, 0x14,
+    0xfc, 0xf6, 0x90, 0x7d, 0x8c, 0xdf, 0xb8, 0x7c, 0xff, 0x0f, 0x65, 0x6f, 0xbe, 0xac, 0x9e, 0x9a,
+    0xde, 0x04, 0x68, 0xbf, 0x0e, 0xef, 0xd1, 0xf2, 0x6b, 0x75, 0x0c, 0x0a, 0x9c, 0xef, 0x2a, 0xf2,
+    0x77, 0x8f, 0xb7, 0x6d, 0x34, 0x9b, 0xcf, 0x6d, 0x00, 0xfa, 0x11, 0x1c, 0x57, 0x83, 0x1a, 0x4b,
+    0xee, 0x4c, 0xb8, 0x27, 0xba, 0xf3, 0x02, 0x7f, 0x31, 0x13, 0xfd, 0x97, 0xc7, 0x48, 0xb3, 0x28,
+    0x88, 0xe5, 0x6c, 0x60, 0x5c, 0x4d, 0x0d, 0x45, 0x19, 0xa7, 0xb6, 0x3e, 0x66, 0x8e, 0xf1, 0xe1,
+    0x40, 0xb4, 0x40, 0x6b, 0xcd, 0xbe, 0x6e, 0x2c, 0x64, 0xa1, 0x3d, 0x01, 0x27, 0x8a, 0x83, 0xbc,
+    0xe1, 0xc0, 0x76, 0x2e, 0xd0, 0xdd, 0xa1, 0xe3, 0x91, 0x81, 0xb7, 0x53, 0x6b, 0x78, 0x17, 0x78,
+    0x81, 0xb8, 0x90, 0xe4, 0x2f, 0xe3, 0x66, 0xde, 0x46, 0x88, 0x7e, 0x2f, 0xca, 0x32, 0xbb, 0xa5,
+    0xcf, 0x25, 0xb7, 0x00, 0x00, 0x19, 0x98, 0x1d, 0x1d, 0x07, 0xff, 0xa0, 0x1d, 0x7a, 0x2c, 0xbd,
+    0x6f, 0xef, 0x01, 0xc6, 0x6d, 0x4b, 0x6b, 0x4f, 0xb9, 0x6b, 0xc3, 0x9a, 0x41, 0x47, 0x3e, 0x7f,
+    0x4e, 0xbc, 0x30, 0x14, 0x60, 0xe0, 0xa0, 0x9a, 0xc2, 0x9d, 0x75, 0xca, 0xcc, 0xc5, 0x4d, 0x75,
+    0x94, 0x1f, 0x58, 0xbc, 0x22, 0x88, 0xed, 0x5e, 0xa4, 0xf6, 0xe2, 0x5e, 0xb9, 0x28, 0x26, 0x66,
+    0xce, 0x70, 0x8c, 0x9e, 0x5d, 0x2e, 0x90, 0xab, 0x11, 0xff, 0xdb, 0x98, 0x50, 0x25, 0x9d, 0x02,
+    0xfc, 0x95, 0x16, 0x12, 0x67, 0xc7, 0x2b, 0xbe, 0xe5, 0x69, 0xa1, 0x77, 0x6a, 0x52, 0x07, 0x07,
+    0xfc, 0xf7, 0xa2, 0xfa, 0x8f, 0xfc, 0x50, 0x4a, 0x04, 0x45, 0x8d, 0x69, 0xa4, 0x7f, 0x23, 0x79,
+    0xe9, 0xf1, 0x76, 0xd7, 0x96, 0x62, 0x2d, 0x63, 0xb5, 0x49, 0x50, 0xba, 0x0e, 0xf5, 0x1c, 0x87,
+    0xc1, 0xa8, 0x25, 0x62, 0x8c, 0xf2, 0x91, 0x58, 0x6b, 0x11, 0xe4, 0xe7, 0x2f, 0x99, 0x62, 0x68,
+    0x6f, 0xd1, 0x4a, 0x83, 0x9c, 0x10, 0xde, 0x16, 0xbb, 0x02, 0x46, 0xd5, 0x2e, 0xdc, 0xeb, 0x8c,
+    0x0d, 0xab, 0x5e, 0x16, 0xb6, 0xc7, 0xfa, 0xfa, 0x59, 0x50, 0x37, 0x61, 0xa7, 0x40, 0x92, 0xb3,
+    0xea, 0xdc, 0x9d, 0x79, 0x6b, 0xc9, 0x7e, 0x5c, 0xad, 0x97, 0xf2, 0x87, 0x8b, 0xf7, 0x74, 0x10,
+    0xc7, 0x21, 0x2d, 0xd0, 0x99, 0x77, 0xfa, 0x9d, 0x9a, 0xc5, 0x03, 0x4a, 0x46, 0x45, 0x5b, 0xde,
+    0xa6, 0x9e, 0xa0, 0xd9, 0x84, 0x24, 0x87, 0x0f, 0x2f, 0x31, 0x35, 0xfd, 0xab, 0xf9, 0x1c, 0x46,
+    0x09, 0x08, 0xae, 0xc9, 0x42, 0x78, 0x53, 0xe0, 0xc5, 0x09, 0xdb, 0x63, 0x7f, 0x15, 0x58, 0xf1,
+    0xac, 0x55, 0x6f, 0x78, 0x3f, 0xf0, 0xee, 0x18, 0x59, 0x25, 0xf1, 0xd3, 0x4b, 0x73, 0x84, 0x9b,
+    0xfe, 0xd3, 0x60, 0x68, 0x47, 0x3e, 0x79, 0xc5, 0x40, 0x84, 0x50, 0x25, 0x23, 0xa7, 0xfa, 0xe9,
+    0xf6, 0xfd, 0x93, 0x47, 0xc7, 0x81, 0xa5, 0xdd, 0x98, 0x15, 0xfa, 0x44, 0x6c, 0x22, 0x9e, 0x41,
+    0x4b, 0x37, 0xba, 0x48, 0xc4, 0x5f, 0x77, 0xf1, 0x54, 0xf4, 0xb7, 0xb7, 0x67, 0xc7, 0xfb, 0x1f,
+    0xb9, 0x1d, 0x2b, 0xef, 0x60, 0x09, 0xbf, 0x2d, 0x61, 0x26, 0xe6, 0x15, 0xd2, 0xf3, 0x98, 0x9c,
+    0xfc, 0x43, 0xde, 0x1a, 0x26, 0xbe, 0x96, 0xd5, 0xbc, 0x88, 0xad, 0x57, 0xb6, 0xfa, 0x5d, 0x3a,
+    0x29, 0xf4, 0x23, 0x3b, 0x7c, 0xcd, 0xd2, 0x4d, 0x1c, 0x18, 0x37, 0x66, 0x8c, 0x08, 0xf3, 0x5e,
+    0xe6, 0x39, 0x6e, 0x31, 0xfa, 0x7f, 0x64, 0xe9, 0xb1, 0xbc, 0x32, 0xda, 0x9d, 0x74, 0xfd, 0xbd,
+    0x82, 0x72, 0xf2, 0xf6, 0x0d, 0x1a, 0x87, 0x3f, 0x5b, 0x6c, 0x11, 0x11, 0x19, 0x48, 0x41, 0x74,
+    0xb0, 0x88, 0xf6, 0x22, 0x46, 0x85, 0xd4, 0x2a, 0x2d, 0x6a, 0x23, 0x88, 0x6e, 0x53, 0x57, 0x3a,
+    0xb3, 0xf1, 0xda, 0x56, 0xbd, 0xd1, 0xe2, 0x48, 0x6f, 0xc4, 0x05, 0x27, 0xe1, 0x60, 0x71, 0xc7,
+    0xa6, 0xdc, 0x0a, 0x87, 0xe9, 0x61, 0xc1, 0x33, 0x9d, 0x62, 0xeb, 0x64, 0x26, 0x82, 0x34, 0x26,
+    0x50, 0x32, 0x16, 0xe5, 0xc4, 0x83, 0xc8, 0x81, 0x1c, 0xae, 0xb3, 0x26, 0x5c, 0x21, 0x28, 0x2d,
+    0x20, 0xf5, 0xb0, 0xae, 0xa1, 0x41, 0x85, 0x9e, 0x0d, 0x2e, 0xc2, 0xd9, 0x14, 0x09, 0xca, 0xb5,
+    0x6e, 0xeb, 0x2d, 0xd2, 0x5f, 0x1c, 0xb1, 0xd1, 0xa9, 0xfd, 0x52, 0x5e, 0xa6, 0x48, 0xb7, 0x34,
+    0x0d, 0xff, 0xda, 0x64, 0xcb, 0x71, 0xe6, 0x33, 0x29, 0x3d, 0x37, 0x7f, 0x28, 0x0f, 0x4f, 0xc4,
+    0x68, 0x24, 0x6b, 0x51, 0xbc, 0x1d, 0xbd, 0x74, 0xff, 0x43, 0x9a, 0x87, 0x85, 0x82, 0x0e, 0x60,
+    0xb1, 0x79, 0xdb, 0x9c, 0x80, 0xac, 0x76, 0x7c, 0xbd, 0xaf, 0xc4, 0x06, 0x93, 0x56, 0x3c, 0x20,
+    0xe6, 0x68, 0x38, 0x63, 0x40, 0xaf, 0x10, 0x67, 0xd8, 0xb4, 0x0f, 0xa8, 0x74, 0xd1, 0x38, 0x95,
+    0xac, 0x2e, 0xc2, 0xc4, 0xef, 0x51, 0x07, 0xed, 0x0d, 0x17, 0x6a, 0xbe, 0x3d, 0x68, 0xb8, 0x82,
+    0x55, 0x05, 0x9e, 0x4b, 0x30, 0x23, 0xc4, 0x8d, 0xc6, 0x1d, 0x1b, 0x35, 0x81, 0x99, 0x7e, 0x87,
+    0xe4, 0x99, 0x2a, 0xd8, 0xfb, 0x24, 0x7d, 0xd3, 0xf1, 0xeb, 0xb2, 0x06, 0x47, 0xa8, 0x54, 0xc7,
+    0x55, 0xcd, 0xb3, 0x46, 0xd3, 0xb1, 0x48, 0x49, 0xa8, 0x81, 0x04, 0xce, 0xef, 0x0f, 0x65, 0x50,
+    0x98, 0x95, 0x3c, 0xdb, 0xc6, 0x9a, 0x51, 0x59, 0xbc, 0x16, 0x53, 0x6b, 0x6e, 0xe7, 0x17, 0x65,
+    0xcb, 0xdd, 0x06, 0x68, 0x48, 0x65, 0x46, 0x0d, 0x93, 0xd0, 0x50, 0x06, 0x30, 0x7d, 0xfa, 0x36,
+    0x97, 0x40, 0xf9, 0x53, 0xda, 0x18, 0x81, 0x44, 0xcf, 0x69, 0x69, 0x81, 0x27, 0xc9, 0x67, 0x85,
+    0xf6, 0x5a, 0x68, 0x45, 0x81, 0xbf, 0x4b, 0x10, 0x9a, 0x1a, 0x5e, 0x71, 0xe0, 0x1f, 0xe4, 0xd0,
+    0x11, 0x19, 0xa9, 0x72, 0x9a, 0x37, 0xdd, 0xf0, 0x04, 0x04, 0xed, 0x4e, 0x8e, 0x50, 0xe6, 0x4c,
+    0x48, 0x8e, 0x05, 0xd0, 0x6e, 0xce, 0xf0, 0x85, 0x34, 0x1f, 0x57, 0x74, 0x90, 0xcd, 0x0a, 0x0c,
+    0x0a, 0xea, 0xd2, 0x59, 0x20, 0x2a, 0xd4, 0x04, 0xb7, 0xeb, 0x1a, 0x42, 0x41, 0x43, 0xd8, 0xac,
+    0x50, 0x4c, 0xb8, 0x61, 0xeb, 0x0c, 0x82, 0x17, 0xf4, 0x41, 0x8f, 0xbd, 0xc0, 0x91, 0xfd, 0xb9,
+    0x5f, 0xc8, 0x68, 0x28, 0x45, 0x8f, 0xb1, 0xcc, 0x2f, 0x71, 0x44, 0xc1, 0x85, 0xe6, 0x81, 0x2c,
+    0xdb, 0x5f, 0x3e, 0x5e, 0x9f, 0x8c, 0x11, 0x60, 0xd2, 0x7e, 0xe6, 0xd1, 0x2b, 0x4e, 0x42, 0x5c,
+    0xd3, 0xdd, 0xcf, 0x4d, 0x17, 0x7f, 0xfa, 0xab, 0x8f, 0x86, 0xd6, 0xbd, 0xa4, 0xb2, 0x41, 0xc6,
+    0xdd, 0xb9, 0xec, 0xa7, 0x96, 0xcf, 0x63, 0x90, 0xe0, 0x65, 0x56, 0x38, 0x78, 0xb8, 0x6b, 0x07,
+    0x33, 0xae, 0x58, 0x99, 0xb0, 0xef, 0x34, 0xdf, 0x5e, 0xdf, 0xa4, 0x6f, 0xb0, 0x1f, 0x7d, 0x5b,
+    0xbc, 0x62, 0x5d, 0x58, 0x59, 0x78, 0x39, 0xdb, 0x90, 0xfc, 0x53, 0xa2, 0xd2, 0x57, 0x92, 0x3a,
+    0x11, 0xfb, 0x74, 0x47, 0x3f, 0xb6, 0x08, 0xea, 0x68, 0xc6, 0x3e, 0x91, 0x6a, 0x15, 0xdf, 0x2a,
+    0x42, 0xbb, 0x55, 0xb2, 0xd6, 0x2b, 0xae, 0x23, 0xd1, 0x60, 0x47, 0x7f, 0x64, 0xb0, 0x63, 0x11,
+    0x23, 0xfe, 0x5f, 0x49, 0x78, 0x1a, 0x4a, 0x86, 0x98, 0x3f, 0xe0, 0x1f, 0x24, 0x33, 0x2f, 0x5f,
+    0x16, 0x40, 0xec, 0x18, 0x9a, 0xf2, 0x8a, 0x55, 0xa2, 0xe1, 0xdf, 0xf2, 0xa6, 0x7f, 0x8c, 0x63,
+    0x01, 0x7b, 0x4b, 0x83, 0xa0, 0xc1, 0xc4, 0x04, 0xfc, 0x79, 0x60, 0x6d, 0x90, 0x40, 0x59, 0xd6,
+    0xfa, 0x96, 0x27, 0x83, 0xe6, 0xde, 0x26, 0xf4, 0x82, 0xb1, 0x7e, 0x29, 0xd4, 0x37, 0x28, 0xba,
+    0x7c, 0x85, 0x7b, 0xe0, 0x4c, 0x93, 0xfb, 0xd3, 0xa5, 0x07, 0x08, 0x4d, 0x60, 0x40, 0xc4, 0xb3,
+    0x5e, 0x76, 0x66, 0xfd, 0x93, 0x1c, 0x00, 0x9d, 0x74, 0x32, 0x1e, 0x1f, 0x28, 0x71, 0xc4, 0x7a,
+    0xea, 0xd1, 0x9a, 0x34, 0x2c, 0xc5, 0x9b, 0xd0, 0x70, 0x11, 0xee, 0x70, 0x81, 0x1f, 0x91, 0x0e,
+    0xb9, 0x4e, 0xdc, 0x3a, 0xb5, 0xb3, 0x58, 0x76, 0x67, 0x25, 0x64, 0xf4, 0xec, 0x96, 0x63, 0x7b,
+    0x65, 0xcc, 0xe6, 0x5e, 0xff, 0xf5, 0x03, 0xd0, 0x85, 0x3f, 0x58, 0x9d, 0x87, 0xec, 0x32, 0xf1,
+    0xca, 0x5b, 0xbe, 0xb8, 0x04, 0xd9, 0xfc, 0x24, 0x66, 0xbd, 0x37, 0xa8, 0x6c, 0x7a, 0xe3, 0x13,
+    0x93, 0xaf, 0x96, 0xce, 0xbc, 0x24, 0xb2, 0xfd, 0x16, 0xea, 0x57, 0xdf, 0x4f, 0xf7, 0x5c, 0x16,
+    0x5a, 0xaf, 0x3f, 0x39, 0x20, 0x8b, 0xea, 0x61, 0xad, 0xe3, 0xd4, 0xbc, 0xaf, 0x7a, 0x22, 0xb4,
+    0x71, 0x86, 0xb4, 0xf1, 0x60, 0x98, 0x95, 0xc7, 0xed, 0x11, 0x4d, 0xb5, 0x14, 0x1f, 0xe1, 0x66,
+    0xcc, 0x92, 0x03, 0xea, 0x83, 0x44, 0x96, 0x2d, 0x5e, 0xb6, 0x5c, 0x4e, 0x51, 0x7f, 0x8e, 0xb5,
+    0x8b, 0x48, 0xe1, 0xde, 0xc6, 0x9d, 0x79, 0xe2, 0x95, 0x53, 0x58, 0xc7, 0x71, 0x4b, 0x6d, 0x4c,
+    0x6f, 0xc7, 0xed, 0x4e, 0x55, 0xc3, 0x0f, 0x01, 0x81, 0x1c, 0xd1, 0x76, 0x53, 0xa7, 0xe0, 0x27,
+    0x99, 0x42, 0x6b, 0xd5, 0x12, 0x09, 0xad, 0xda, 0x66, 0x62, 0xd1, 0x5b, 0xa2, 0x2e, 0xb4, 0x7b,
+    0xf1, 0xc5, 0xa2, 0x10, 0xb5, 0x98, 0xdd, 0xd3, 0x9f, 0x1c, 0xf6, 0x97, 0xd4, 0xfb, 0x0b, 0x7b,
+    0x9c, 0x88, 0x6b, 0xbe, 0x63, 0x42, 0xff, 0x4d, 0x97, 0x15, 0xf7, 0x4b, 0x30, 0xe7, 0xf6, 0xc7,
+    0x8b, 0x50, 0x04, 0x7f, 0x20, 0xd9, 0x2e, 0x62, 0x14, 0xf0, 0x25, 0xdb, 0xcf, 0x87, 0x57, 0x31,
+    0x1a, 0x59, 0x29, 0x19, 0xee, 0x41, 0xae, 0xf2, 0x6f, 0x14, 0xb2, 0xea, 0x71, 0x20, 0x53, 0x98,
+    0x89, 0xbe, 0x16, 0xc7, 0xad, 0x0b, 0xdb, 0x42, 0xd0, 0xd4, 0x56, 0x65, 0x39, 0xe6, 0x33, 0xc6,
+    0x3f, 0xc2, 0xad, 0x29, 0x33, 0xef, 0x47, 0x56, 0x11, 0x74, 0x5f, 0x9d, 0xec, 0xcc, 0x99, 0xb3,
+    0xc5, 0x6c, 0x7c, 0xe7, 0x77, 0xdb, 0xc9, 0xde, 0x7c, 0x20, 0xdf, 0x53, 0x35, 0xa7, 0x3d, 0x9e,
+    0x20, 0x0b, 0xf0, 0x92, 0xc5, 0x13, 0x11, 0x6d, 0xdf, 0x69, 0x92, 0x93, 0x0c, 0x42, 0x2b, 0x6c,
+    0x43, 0x02, 0xc5, 0xa5, 0x4c, 0xa5, 0x61, 0x3e, 0x89, 0xf3, 0x7f, 0xe1, 0x3a, 0x3c, 0x8d, 0xdc,
+    0x9d, 0x26, 0x5e, 0x59, 0x62, 0x48, 0xb5, 0x24, 0x3e, 0x39, 0xf9, 0x62, 0x93, 0x4a, 0xef, 0x1d,
+    0xcd, 0x2a, 0x6e, 0xa4, 0x3d, 0x4d, 0x65, 0x7e, 0xe4, 0xd3, 0xf4, 0x0d, 0xf6, 0x30, 0x48, 0x71,
+    0xda, 0x02, 0x92, 0x10, 0xdb, 0x4e, 0x96, 0xa6, 0xcf, 0xd9, 0x1e, 0xc7, 0x8e, 0xe8, 0x6c, 0x9d,
+    0xa9, 0x9e, 0x4d, 0x85, 0xb4, 0x9e, 0x13, 0xf2, 0x14, 0x17, 0xc2, 0xb1, 0x31, 0x9f, 0xd8, 0x55,
+    0xa5, 0x55, 0xbd, 0x78, 0x7a, 0x73, 0x57, 0x4f, 0x61, 0x73, 0x42, 0x98, 0x8c, 0x8b, 0x35, 0x93,
+    0x35, 0x07, 0xc7, 0x01, 0x33, 0x0d, 0xd1, 0x01, 0xa3, 0x25, 0xdc, 0x9e, 0xf6, 0xbd, 0x9b, 0xe2,
+    0x53, 0x25, 0x44, 0xb5, 0x8f, 0x9c, 0x8d, 0x53, 0xe6, 0x50, 0xb1, 0xf0, 0x30, 0xbf, 0xca, 0x9a,
+    0xff, 0xff, 0x93, 0x98, 0xa9, 0xbf, 0xec, 0xb4, 0xe2, 0x8e, 0xf6, 0xba, 0x7e, 0xed, 0x8d, 0xd8,
+    0x31, 0xcb, 0x30, 0x7f, 0x58, 0x65, 0xa8, 0x12, 0x31, 0x43, 0x81, 0xe9, 0x2d, 0x41, 0x7e, 0xc3,
+    0x4a, 0xfa, 0x43, 0xaa, 0x70, 0xae, 0x42, 0xc5, 0x31, 0x27, 0xd0, 0xfe, 0x6f, 0x79, 0x8d, 0x44,
+    0x8c, 0x7d, 0x0c, 0x3e, 0x1b, 0xd5, 0xac, 0xbf, 0x19, 0x3c, 0xd1, 0xd0, 0xa7, 0x9f, 0xbf, 0x63,
+    0x40, 0x5d, 0x4a, 0x74, 0xe9, 0x6e, 0x4d, 0xe1, 0xd2, 0x83, 0xaa, 0x5e, 0x18, 0x42, 0x7a, 0x48,
+    0x52, 0xa5, 0x31, 0xc2, 0xd6, 0xaa, 0x22, 0x17, 0x9d, 0x96, 0x24, 0x70, 0x98, 0x16, 0x9e, 0xa4,
+    0x19, 0xdf, 0xda, 0xc4, 0x60, 0xd7, 0x83, 0xe5, 0x1c, 0x69, 0x3d, 0xfa, 0xe9, 0xf9, 0x79, 0x08,
+    0x14, 0x2e, 0x09, 0x9f, 0x63, 0xa7, 0x1e, 0x32, 0xe9, 0x52, 0x0e, 0xa1, 0xbd, 0x3f, 0xb7, 0x6d,
+    0x5b, 0x68, 0x38, 0xa7, 0x8c, 0xd9, 0x5c, 0x8d, 0x9d, 0xb9, 0xdc, 0x19, 0xd1, 0x96, 0x28, 0xee,
+    0xad, 0x74, 0x5e, 0x73, 0x8b, 0x44, 0x74, 0x8b, 0x91, 0x25, 0xc9, 0x79, 0xae, 0x3e, 0x8a, 0xa0,
+    0x74, 0x97, 0x7a, 0x8a, 0xcc, 0xba, 0xa3, 0xde, 0xf1, 0x51, 0x89, 0xa1, 0x9b, 0x0a, 0x35, 0x30,
+    0x3c, 0x9f, 0xeb, 0xa2, 0x6a, 0x1e, 0x1f, 0xb0, 0x57, 0x85, 0x08, 0xac, 0xbe, 0x56, 0x50, 0xc8,
+    0xaf, 0x2b, 0x03, 0x04, 0x87, 0x37, 0x6a, 0x67, 0x8e, 0x42, 0x62, 0x6a, 0xbb, 0x89, 0xe5, 0xb2,
+    0xc3, 0x24, 0x97, 0xf0, 0x01, 0x0a, 0x7a, 0xaf, 0x2b, 0x9f, 0x0d, 0x88, 0x08, 0xb6, 0x23, 0x41,
+    0x1d, 0x59, 0x2d, 0x99, 0x72, 0xc7, 0x9a, 0x1c, 0xb6, 0xa3, 0x3d, 0xac, 0xf0, 0x8a, 0xcb, 0x25,
+    0xd9, 0x05, 0xbe, 0x51, 0x5a, 0xd5, 0x45, 0xfd, 0xda, 0x8d, 0xef, 0x7a, 0x4d, 0x32, 0x67, 0xa6,
+    0x8a, 0x94, 0x84, 0x29, 0x88, 0x37, 0x42, 0x60, 0x38, 0x76, 0x02, 0xcf, 0xa3, 0x65, 0xac, 0xe3,
+    0xfd, 0x9d, 0xfa, 0x04, 0x48, 0x46, 0xa6, 0xcd, 0x34, 0x3f, 0x82, 0xf7, 0x18, 0x3f, 0x48, 0x5e,
+    0x72, 0x84, 0x7e, 0xec, 0x52, 0x28, 0xc9, 0x22, 0xd3, 0x84, 0x3a, 0x1c, 0xc8, 0xb9, 0x8e, 0x22,
+    0x3f, 0xe6, 0xc5, 0xd8, 0xeb, 0xeb, 0x7d, 0x9c, 0x82, 0xdd, 0x49, 0x1f, 0x5f, 0x7a, 0x65, 0x60,
+    0x32, 0x10, 0x37, 0xe5, 0xf4, 0xe8, 0xe8, 0x18, 0x87, 0x1f, 0x5c, 0x92, 0x5c, 0xe5, 0xeb, 0xb8,
+    0x8d, 0xbb, 0xa1, 0xf1, 0x32, 0x86, 0xd3, 0x82, 0xb5, 0x32, 0x2e, 0x6c, 0x83, 0x91, 0x20, 0xc7,
+    0x6b, 0x49, 0x01, 0x03, 0xd8, 0x7e, 0x1b, 0x2a, 0xed, 0x3c, 0x97, 0x23, 0x7a, 0x7d, 0x2c, 0x96,
+    0x0e, 0x3c, 0x8d, 0x0e, 0x7b, 0xbb, 0x1f, 0x1e, 0xc7, 0x09, 0xc8, 0x7c, 0xb3, 0xfe, 0x97, 0xb1,
+    0x2a, 0xfd, 0x5e, 0x9c, 0x6a, 0xfd, 0x31, 0xbb, 0x5c, 0x2e, 0xd7, 0x14, 0x42, 0xa2, 0x16, 0xa4,
+    0xb7, 0xe2, 0x81, 0x50, 0xd2, 0xaa, 0xb9, 0x27, 0x95, 0xb5, 0x1e, 0x7b, 0x55, 0x80, 0x43, 0x73,
+    0x3a, 0x94, 0x06, 0x9c, 0x32, 0xf4, 0xbc, 0x83, 0xc4, 0x1f, 0x37, 0xae, 0xb5, 0x6f, 0xe7, 0x70,
+    0x4c, 0xac, 0xc7, 0x84, 0xa1, 0x79, 0x9e, 0xd8, 0xf1, 0x3b, 0xc2, 0x14, 0x5b, 0xa9, 0xec, 0xfe,
+    0x49, 0x6b, 0xc5, 0x4a, 0x66, 0x79, 0x1a, 0x46, 0x88, 0x64, 0x50, 0x12, 0xa2, 0x84, 0xb7, 0x34,
+    0x7f, 0x2b, 0xaa, 0x81, 0xcd, 0xae, 0xf4, 0xc5, 0x6d, 0x44, 0xea, 0xe4, 0x4b, 0xfb, 0xb5, 0x1e,
+    0x8d, 0x6e, 0xfe, 0xcd, 0xad, 0x27, 0xb1, 0x0c, 0xb3, 0xe7, 0xf8, 0xec, 0x82, 0x95, 0xc3, 0x0f,
+    0x6e, 0x50, 0xc9, 0xfe, 0x20, 0x84, 0x5d, 0x0b, 0x91, 0xed, 0x4f, 0x4b, 0x14, 0xc8, 0x43, 0xc5,
+    0x57, 0x44, 0x12, 0x61, 0xa0, 0xdd, 0x1a, 0x48, 0x1a, 0xf1, 0xe2, 0x6b, 0x61, 0xd9, 0x38, 0x63,
+    0x37, 0x9a, 0x27, 0xb1, 0xf9, 0x6f, 0x8f, 0x47, 0x72, 0x35, 0x0d, 0x20, 0x90, 0x0f, 0x5a, 0x33,
+    0xe0, 0x31, 0x1a, 0x1b, 0x0b, 0x15, 0x2d, 0xdc, 0xde, 0x6f, 0x4b, 0xb7, 0xba, 0xaf, 0x52, 0xd9,
+    0x99, 0xfd, 0x60, 0xf5, 0x32, 0xb4, 0xcd, 0xff, 0x08, 0x38, 0x58, 0x48, 0xb9, 0x2c, 0x76, 0xff,
+    0xd0, 0x5e, 0x0a, 0xd6, 0xae, 0x1f, 0xa5, 0xdc, 0xa2, 0xdc, 0xd0, 0xc8, 0x4b, 0x40, 0xbd, 0xe2,
+    0xf6, 0xf4, 0xa9, 0xf4, 0xa1, 0xbf, 0xa9, 0x89, 0x32, 0x52, 0x8a, 0x6d, 0xf4, 0xcc, 0xee, 0xd6,
+    0x4c, 0xba, 0x60, 0x22, 0x3c, 0x2d, 0xbd, 0x0a, 0x1a, 0x3a, 0x0b, 0x42, 0xf9, 0xa2, 0x90, 0x16,
+    0x38, 0x0c, 0x89, 0x44, 0xbf, 0xbc, 0x5e, 0x47, 0xfe, 0xba, 0xa6, 0x82, 0x7d, 0x22, 0x85, 0xa8,
+    0x63, 0x33, 0x2d, 0xf1, 0x76, 0x4a, 0xf2, 0xb9, 0xa4, 0x39, 0x4d, 0x9a, 0xba, 0xea, 0x8e, 0xbf,
+    0xc7, 0x35, 0x45, 0x49, 0xa3, 0x08, 0xc7, 0x61, 0x3c, 0xd8, 0x6e, 0xea, 0x12, 0x3f, 0x71, 0xa9,
+    0x30, 0xd9, 0x10, 0x2e, 0x96, 0x34, 0x41, 0x8b, 0x54, 0x45, 0x42, 0x35, 0x92, 0x6f, 0x78, 0x25,
+    0xdb, 0x98, 0x13, 0x4f, 0xc1, 0xcb, 0xd4, 0xc2, 0x14, 0x62, 0x6b, 0x64, 0xcc, 0x92, 0xbc, 0x0e,
+    0x16, 0xc8, 0x2c, 0xce, 0x2e, 0x6f, 0xcc, 0xe1, 0x0f, 0x6f, 0xe3, 0x4b, 0x93, 0x0b, 0x2e, 0xd1,
+    0xaa, 0x85, 0xff, 0xa3, 0x05, 0xff, 0xf5, 0xb3, 0xff, 0x17, 0x22, 0x79, 0x2f, 0x89, 0x2b, 0xd1,
+    0x4e, 0xd4, 0x2a, 0x2d, 0x00, 0x51, 0xc5, 0x88, 0x5b, 0x96, 0xe6, 0xd1, 0xeb, 0x74, 0x5f, 0x56,
+    0xb9, 0x64, 0x3b, 0xc7, 0x3e, 0x6e, 0x07, 0xdb, 0x11, 0x8b, 0x1e, 0xd8, 0x96, 0x2d, 0x8c, 0x51,
+    0x32, 0x27, 0x87, 0x4a, 0xae, 0x66, 0x9a, 0x8c, 0x22, 0x6d, 0xd7, 0x2a, 0x5d, 0x61, 0x98, 0xd9,
+    0x7f, 0x68, 0x58, 0x07, 0x25, 0xc7, 0x16, 0x2d, 0x90, 0x79, 0xe8, 0x4e, 0xaf, 0xd9, 0x3f, 0x90,
+    0x78, 0x8b, 0xf4, 0x1f, 0x17, 0xbd, 0x0a, 0x52, 0xb5, 0x58, 0x2b, 0x82, 0x2e, 0xc8, 0x14, 0x74,
+    0xd3, 0x56, 0x47, 0xcf, 0x26, 0xc1, 0x86, 0x00, 0x06, 0xe5, 0x4d, 0x48, 0x51, 0x73, 0x9f, 0x37,
+    0xba, 0x0e, 0x5c, 0x17, 0x16, 0x5a, 0x6f, 0x6d, 0x28, 0x19, 0xe4, 0xe1, 0x5b, 0xc7, 0x9b, 0x9e,
+    0xfb, 0x03, 0x2a, 0x98, 0xda, 0x96, 0x1b, 0x30, 0x6c, 0x12, 0xa2, 0x6c, 0x4d, 0xdf, 0xc4, 0x6d,
+    0x0b, 0xf8, 0x77, 0x8e, 0x36, 0xd2, 0xee, 0xdc, 0x27, 0x08, 0x3b, 0x2b, 0x3b, 0x24, 0x8e, 0xab,
+    0x98, 0x6f, 0x07, 0x27, 0x24, 0x4d, 0xd6, 0x35, 0x73, 0x43, 0x0b, 0xaf, 0x64, 0x1a, 0x4a, 0xa9,
+    0xd8, 0x1e, 0xf1, 0x7b, 0xca, 0xaf, 0x81, 0x59, 0xea, 0x5a, 0x36, 0xdb, 0x0f, 0x11, 0x5f, 0x70,
+    0x40, 0xef, 0x88, 0x05, 0xe1, 0x08, 0x5c, 0x4c, 0x04, 0x10, 0x7a, 0x03, 0xce, 0xa4, 0x35, 0x55,
+    0xd1, 0x1c, 0x02, 0xdf, 0x11, 0xee, 0xa4, 0x9d, 0x5b, 0x7e, 0x95, 0xae, 0x8c, 0x9c, 0x31, 0xde,
+    0xfa, 0x39, 0xe9, 0xba, 0xc0, 0xda, 0xc9, 0x27, 0x3a, 0xc7, 0x5a, 0x10, 0x3e, 0x14, 0x65, 0x48,
+    0x4a, 0xff, 0x27, 0x38, 0xa2, 0x13, 0x75, 0x3e, 0x15, 0xcc, 0xdd, 0xee, 0x95, 0xcf, 0xfa, 0x71,
+    0x6a, 0xdd, 0xfa, 0x73, 0x63, 0x23, 0x6d, 0x1a, 0x46, 0x65, 0xf4, 0x66, 0xb2, 0x9f, 0x00, 0x21,
+    0x0e, 0xb5, 0xf3, 0x7f, 0x52, 0x8f, 0x19, 0x96, 0xca, 0xf2, 0x5b, 0x35, 0xf5, 0xfa, 0xcf, 0x23,
+    0xf8, 0xf9, 0x21, 0x37, 0xf7, 0x30, 0x6b, 0x69, 0xd2, 0x09, 0x11, 0x97, 0x8b, 0xa8, 0xce, 0x11,
+    0x71, 0x15, 0x4e, 0x98, 0xa3, 0xe0, 0x40, 0xb7, 0x84, 0x91, 0xff, 0x99, 0x54, 0xb6, 0x77, 0x76,
+    0x87, 0x98, 0xb2, 0x3c, 0x49, 0x07, 0x76, 0x1c, 0x65, 0xd3, 0x19, 0x79, 0x46, 0x67, 0xf0, 0x68,
+    0xb5, 0xd2, 0xd5, 0x2f, 0xcf, 0x79, 0x90, 0xbf, 0x85, 0x7b, 0x0d, 0xcf, 0xa8, 0x21, 0x84, 0xbc,
+    0xe6, 0x77, 0xc8, 0x61, 0x79, 0xcf, 0x28, 0x2f, 0xa6, 0xb1, 0xd8, 0xd7, 0xb5, 0x1f, 0xee, 0x4e,
+    0x37, 0x09, 0x8c, 0xa9, 0xb8, 0xa8, 0x4c, 0x35, 0xee, 0x12, 0x56, 0xe3, 0x80, 0xae, 0x5e, 0xfe,
+    0x20, 0xd0, 0x24, 0x4a, 0x59, 0x2c, 0xa5, 0x43, 0x7c, 0x34, 0xec, 0x79, 0x37, 0x55, 0xeb, 0x48,
+    0xda, 0x67, 0x96, 0x93, 0xd6, 0x6d, 0xa3, 0x27, 0xbf, 0xb7, 0x3f, 0x38, 0x01, 0x8f, 0xe6, 0xd1,
+    0xd4, 0xf1, 0x64, 0x76, 0x70, 0x58, 0x9d, 0x8d, 0x0c, 0x92, 0x4f, 0xb2, 0x51, 0x61, 0xa8, 0x80,
+    0x1f, 0x09, 0x06, 0x06, 0xcd, 0x94, 0xca, 0xff, 0x25, 0x1e, 0x19, 0xce, 0x4a, 0xff, 0x77, 0x5e,
+    0x4b, 0xcb, 0x1b, 0x32, 0x73, 0x56, 0xcc, 0x64, 0x28, 0x57, 0x72, 0xe9, 0x87, 0x7b, 0x61, 0xb8,
+    0xb5, 0x7c, 0x4d, 0x0a, 0x4e, 0xaf, 0x01, 0x14, 0xfb, 0xd7, 0x2b, 0x36, 0x2d, 0xa7, 0xe1, 0x04,
+    0xd6, 0xb5, 0x87, 0xfe, 0xeb, 0x68, 0xde, 0xda, 0xbd, 0xe5, 0xff, 0xc2, 0x25, 0x70, 0x1e, 0x54,
+    0x48, 0x3e, 0xf7, 0x1f, 0x3d, 0x32, 0x05, 0xb5, 0xb9, 0xe1, 0xde, 0xb6, 0xea, 0xe2, 0x82, 0x3a,
+    0x07, 0x3c, 0xad, 0xbb, 0xa0, 0x3e, 0x44, 0x21, 0x41, 0xde, 0x6e, 0xcb, 0x59, 0x21, 0xc9, 0x89,
+    0xd4, 0x5f, 0x53, 0x79, 0x9e, 0x18, 0x99, 0xdf, 0x6f, 0x19, 0x4c, 0x32, 0x44, 0x55, 0xd6, 0xc6,
+    0xba, 0xc1, 0x86, 0xbd, 0x33, 0xb7, 0x6d, 0x7a, 0xe1, 0xc8, 0x04, 0x2e, 0xa7, 0x20, 0x37, 0xfc,
+    0x8b, 0x10, 0x3a, 0x03, 0x5a, 0x9b, 0x88, 0x19, 0xd9, 0x93, 0xf8, 0x45, 0xeb, 0x5c, 0x33, 0xf4,
+    0xb7, 0x72, 0xe2, 0xb4, 0x4b, 0x01, 0x99, 0x7a, 0x42, 0x70, 0x22, 0x42, 0xd4, 0x08, 0x50, 0x38,
+    0xae, 0x32, 0xbc, 0xcb, 0xa0, 0x8b, 0xcf, 0xc9, 0x13, 0xa8, 0x45, 0xdb, 0x24, 0x0c, 0x07, 0xc7,
+    0x03, 0x52, 0x6f, 0x42, 0xbf, 0x5a, 0x5d, 0xc9, 0x0f, 0xf5, 0x0f, 0xc9, 0xd7, 0x67, 0x27, 0x67,
+    0xc6, 0xad, 0x7b, 0xb3, 0x28, 0x44, 0x1b, 0x53, 0xd3, 0x74, 0x28, 0xf5, 0x55, 0xf9, 0x9f, 0x04,
+    0x88, 0x83, 0xe3, 0x0f, 0xeb, 0x94, 0x31, 0x2d, 0x79, 0x88, 0x4e, 0xfb, 0x68, 0x85, 0x77, 0xe5,
+    0xf0, 0xc0, 0x45, 0x9e, 0x31, 0x99, 0x63, 0xe9, 0x9e, 0xc1, 0x6c, 0x10, 0x2f, 0xc9, 0xd1, 0x22,
+    0x85, 0x07, 0x46, 0x41, 0xd4, 0xe1, 0x64, 0x28, 0x78, 0x06, 0xe2, 0xcc, 0x20, 0x96, 0xe2, 0xe9,
+    0x5e, 0x6c, 0x48, 0x32, 0x5c, 0x6b, 0xb3, 0x36, 0x9a, 0xc4, 0x6b, 0x31, 0xf2, 0x45, 0x3a, 0x72,
+    0x3e, 0xdd, 0x18, 0x2a, 0xc7, 0x48, 0x67, 0x52, 0xb0, 0x00, 0x8e, 0x54, 0x0a, 0x60, 0x43, 0x58,
+    0x72, 0xcd, 0xd2, 0xd9, 0x8e, 0xee, 0xf7, 0x94, 0xaf, 0x44, 0xe6, 0x38, 0x36, 0x9a, 0x7c, 0x40,
+    0xb0, 0x9b, 0x3a, 0x02, 0x1c, 0xec, 0x9b, 0xdc, 0x14, 0x01, 0x94, 0xa8, 0xd5, 0x31, 0x70, 0xb6,
+    0x52, 0x57, 0xdb, 0xe9, 0xe2, 0x57, 0x83, 0x2d, 0x29, 0x8f, 0xe4, 0x76, 0xca, 0xd7, 0xc0, 0x35,
+    0x83, 0x7c, 0x35, 0xd3, 0xbb, 0xad, 0xb3, 0x5e, 0xe9, 0x25, 0x29, 0xd1, 0x19, 0x5e, 0xea, 0xd5,
+    0x07, 0xcf, 0x28, 0xe7, 0x18, 0xb2, 0x34, 0xde, 0x5e, 0xc3, 0xc8, 0xc2, 0xfe, 0x79, 0xca, 0x21,
+    0xe5, 0x85, 0x2d, 0x54, 0x4b, 0xc8, 0x55, 0x10, 0x69, 0xea, 0xcf, 0x14, 0x66, 0x5c, 0x7d, 0x37,
+    0xd0, 0x5f, 0x5b, 0xd6, 0xf5, 0x08, 0xbc, 0xee, 0xe5, 0xe3, 0xd0, 0x33, 0x45, 0x1a, 0x8c, 0x34,
+    0x14, 0x56, 0x43, 0x42, 0xc1, 0x67, 0x6c, 0xc8, 0xca, 0xf9, 0xef, 0x2c, 0xd9, 0xcd, 0xee, 0x98,
+    0x4d, 0xd2, 0xa3, 0x90, 0x9c, 0x9d, 0x62, 0x1a, 0x73, 0x62, 0xe8, 0x4b, 0x50, 0xe1, 0x74, 0xfe,
+    0x69, 0xb1, 0x3b, 0x18, 0x33, 0x5d, 0xb8, 0xa1, 0x07, 0xcb, 0x0a, 0xbd, 0x51, 0x2b, 0xa0, 0x55,
+    0x60, 0x90, 0x79, 0xa0, 0x97, 0xcb, 0x64, 0x89, 0x0b, 0x2e, 0x9f, 0xfc, 0x48, 0x6a, 0x3b, 0xe1,
+    0xbb, 0x55, 0xf3, 0x89, 0x10, 0x60, 0x23, 0x3a, 0xb6, 0x1d, 0x3d, 0x30, 0xb8, 0x1b, 0x4f, 0xd2,
+    0xbd, 0x9f, 0x6f, 0xb5, 0x17, 0xe7, 0x74, 0xa3, 0xe4, 0x45, 0xe5, 0xc4, 0x6d, 0x95, 0xda, 0x11,
+    0x28, 0xb6, 0xc1, 0xbe, 0x03, 0x3e, 0x5e, 0x06, 0x13, 0x0a, 0xdf, 0xba, 0x99, 0x9c, 0x94, 0xc2,
+    0xcf, 0xe3, 0x21, 0x25, 0x23, 0x60, 0x45, 0x5c, 0xe4, 0x89, 0xab, 0xda, 0x06, 0xcc, 0xbe, 0x88,
+    0xda, 0x40, 0xe8, 0x0d, 0xad, 0xff, 0x4b, 0xb0, 0xdc, 0x2e, 0x4d, 0x20, 0xe8, 0xe6, 0x21, 0xb0,
+    0x50, 0xc5, 0x11, 0xbe, 0xfd, 0x4f, 0xbd, 0x37, 0x8b, 0x5d, 0xe7, 0x69, 0xc8, 0xd2, 0x10, 0x18,
+    0x9a, 0x82, 0x23, 0x3e, 0x4c, 0x7c, 0x5f, 0x38, 0x04, 0xd1, 0x8b, 0xf0, 0x2e, 0x93, 0x4b, 0x28,
+    0xa4, 0x91, 0xc9, 0x9c, 0x98, 0x60, 0x47, 0x26, 0x11, 0x5c, 0x4d, 0x77, 0xf0, 0x1c, 0xa7, 0x12,
+    0xc0, 0x49, 0x59, 0x84, 0x66, 0xd1, 0xf9, 0xa3, 0xfb, 0xd0, 0x7d, 0xdd, 0xe4, 0x6a, 0xe1, 0x28,
+    0xfe, 0xb0, 0xca, 0x00, 0x2c, 0x91, 0xe5, 0x7d, 0x0f, 0x69, 0x59, 0x3a, 0x9e, 0xd7, 0x75, 0x95,
+    0xb3, 0x59, 0x5d, 0x0c, 0x56, 0x79, 0x5a, 0x26, 0xfa, 0x66, 0xaa, 0x60, 0xc2, 0x70, 0xcb, 0xab,
+    0x82, 0x3b, 0x00, 0xb0, 0xf0, 0x8c, 0xfe, 0x05, 0xa6, 0xb1, 0xfb, 0x5d, 0x8f, 0x72, 0xb3, 0xee,
+    0x11, 0x23, 0xf8, 0x96, 0x95, 0x69, 0xab, 0xc7, 0xfd, 0x0e, 0x01, 0xae, 0xec, 0xe4, 0x72, 0xe8,
+    0x2a, 0x15, 0x17, 0x74, 0x2d, 0xc1, 0xe3, 0xbb, 0xdc, 0x6a, 0xe8, 0x33, 0x1c, 0xdf, 0xaf, 0x8e,
+    0xe7, 0x8a, 0xd9, 0x4a, 0x6d, 0xf4, 0x6e, 0x6c, 0xb2, 0x08, 0x3d, 0x31, 0xd8, 0xae, 0xab, 0xb0,
+    0xbd, 0xb7, 0x48, 0x16, 0xe0, 0xfc, 0x76, 0x7c, 0x16, 0x99, 0x59, 0x4c, 0x67, 0x90, 0x6a, 0xd8,
+    0x71, 0x23, 0xe2, 0x25, 0x72, 0xa4, 0x04, 0x12, 0x20, 0x3e, 0x1e, 0x6f, 0xd6, 0xde, 0x07, 0x72,
+    0xf4, 0x48, 0x1b, 0x45, 0x69, 0x3b, 0xb3, 0xf8, 0xa1, 0xed, 0xba, 0xbe, 0xc2, 0x8f, 0x04, 0xf5,
+    0xe5, 0x6f, 0x8f, 0x2e, 0x55, 0xcb, 0x9a, 0xf6, 0xf2, 0x46, 0xc1, 0xfb, 0xf5, 0xa0, 0x68, 0x77,
+    0xe8, 0x44, 0xdb, 0xd3, 0xe7, 0x00, 0x23, 0x39, 0xb7, 0xca, 0x68, 0x14, 0x90, 0xc0, 0x12, 0x4e,
+    0xff, 0x22, 0x45, 0x42, 0xed, 0xdd, 0x70, 0x75, 0xf1, 0xc1, 0x83, 0x55, 0x55, 0x95, 0xad, 0xf0,
+    0xcd, 0xe3, 0xdf, 0x37, 0x94, 0xa5, 0x10, 0x10, 0xb4, 0x0d, 0x9f, 0xa7, 0x23, 0xf4, 0x1b, 0xe8,
+    0x8f, 0xf9, 0xab, 0x9c, 0x96, 0x7c, 0xbc, 0x05, 0x45, 0x56, 0x54, 0xc4, 0x74, 0x03, 0x74, 0x6a,
+    0xa5, 0x13, 0xc6, 0x38, 0x9c, 0x21, 0x6d, 0x3c, 0xb7, 0x5f, 0xe8, 0xc1, 0xb3, 0xee, 0xd6, 0xbb,
+    0x7a, 0xdf, 0xe7, 0xdd, 0x27, 0x57, 0x30, 0x10, 0xe1, 0x6e, 0x99, 0xb3, 0x36, 0x9e, 0xa7, 0x09,
+    0x49, 0x40, 0xf0, 0x0c, 0xc7, 0xe8, 0xcf, 0x29, 0x00, 0x7d, 0x54, 0x5d, 0xc8, 0xca, 0x76, 0x0f,
+    0x29, 0xb8, 0x47, 0x5e, 0x5f, 0x13, 0xea, 0x22, 0xee, 0xfd, 0xbc, 0x35, 0x35, 0x10, 0x82, 0x0b,
+    0xf8, 0x25, 0xbe, 0xb7, 0xed, 0x07, 0x91, 0xa2, 0x7e, 0x43, 0x45, 0xe0, 0x1b, 0xb9, 0x4e, 0xdd,
+    0x45, 0x11, 0x9a, 0x4a, 0x77, 0x3e, 0xc6, 0x9a, 0x0c, 0xb3, 0x9b, 0x53, 0xd2, 0x2c, 0x90, 0x6c,
+    0xda, 0x34, 0x17, 0xa0, 0x22, 0x81, 0xb2, 0x7e, 0x60, 0xbc, 0xe2, 0x03, 0x9f, 0x8a, 0x1a, 0xf0,
+    0x6b, 0x0c, 0x40, 0x76, 0x3c, 0x1d, 0x4c, 0xdd, 0x7e, 0x41, 0xd0, 0xfd, 0x8b, 0xaf, 0xf6, 0x08,
+    0xe6, 0x4f, 0xc9, 0xa3, 0x3b, 0x5b, 0xcb, 0x37, 0xa2, 0x2e, 0x29, 0xab, 0x25, 0x6e, 0x7d, 0x71,
+    0xa9, 0x6a, 0x27, 0x82, 0x5e, 0x12, 0x77, 0x29, 0x17, 0xb3, 0x6a, 0x78, 0xc8, 0x97, 0x03, 0x53,
+    0x7e, 0xf8, 0x80, 0xa8, 0x39, 0x83, 0x57, 0x55, 0x71, 0xa0, 0x12, 0xf2, 0x34, 0xaf, 0xd1, 0x89,
+    0xfd, 0x80, 0x0b, 0xd4, 0x2b, 0x47, 0x24, 0x24, 0x82, 0xed, 0xb0, 0x75, 0x43, 0xeb, 0x8b, 0x1e,
+    0xb6, 0x0f, 0x4f, 0x30, 0x23, 0xe9, 0x11, 0x68, 0xcc, 0x61, 0x05, 0x1d, 0xe6, 0xaa, 0x35, 0x19,
+    0xbe, 0xae, 0xd8, 0x3d, 0x26, 0xe1, 0x06, 0xf6, 0x4a, 0xf1, 0x68, 0xd0, 0xc4, 0x30, 0x68, 0x13,
+    0xe6, 0x6d, 0x2a, 0x30, 0x74, 0x6d, 0xa7, 0xa2, 0x23, 0xaf, 0x75, 0xb5, 0x77, 0x2c, 0xaf, 0x46,
+    0x21, 0xc3, 0xaa, 0x91, 0x31, 0x34, 0xf6, 0xf1, 0xa1, 0xcb, 0x52, 0x0d, 0xfa, 0x91, 0x78, 0x9b,
+    0x71, 0x7a, 0x4f, 0x13, 0x94, 0x0a, 0xc7, 0x7a, 0x5b, 0xdc, 0x85, 0x9f, 0xf9, 0x6f, 0x33, 0xc4,
+    0x06, 0x3d, 0x92, 0x9a, 0xf9, 0x95, 0x64, 0x0a, 0x17, 0x96, 0xbb, 0x17, 0x9f, 0x29, 0xe9, 0x8c,
+    0xc0, 0x91, 0x37, 0xa6, 0x4b, 0xc8, 0xa8, 0x8c, 0xd8, 0x2d, 0x06, 0xad, 0xc6, 0x26, 0xd6, 0xbe,
+    0x15, 0xa4, 0x63, 0x04, 0x13, 0x77, 0x3e, 0xd2, 0x8b, 0x09, 0x07, 0xc5, 0x0c, 0xf9, 0x89, 0x0c,
+    0x29, 0x2a, 0x08, 0xe0, 0x84, 0x6f, 0x67, 0x90, 0xb7, 0x65, 0x88, 0x61, 0x19, 0xaf, 0x83, 0x9d,
+    0x65, 0xf6, 0x54, 0xaa, 0xd9, 0x76, 0x4f, 0x66, 0x25, 0x0f, 0xeb, 0x40, 0x25, 0x58, 0x3d, 0x77,
+    0x74, 0xf7, 0xa6, 0x94, 0x14, 0x7b, 0x8a, 0x4e, 0x0b, 0x61, 0x6e, 0x71, 0x93, 0xc7, 0x9c, 0x3a,
+    0xbb, 0xce, 0x66, 0xe0, 0xc5, 0xae, 0x6c, 0xbf, 0x04, 0xc7, 0x43, 0x27, 0x14, 0x00, 0x7a, 0x69,
+    0x4d, 0x0e, 0x9f, 0x15, 0x8b, 0x61, 0xe7, 0x45, 0x16, 0x49, 0xd9, 0xc8, 0xa2, 0x17, 0xb1, 0x2e,
+    0xd3, 0x68, 0x20, 0x8b, 0x64, 0x8d, 0x05, 0xde, 0x7f, 0x3a, 0x48, 0x0e, 0x9c, 0xc2, 0x3e, 0xa5,
+    0x75, 0x34, 0xe0, 0x28, 0x39, 0x53, 0x73, 0x5d, 0x2a, 0x5e, 0xdd, 0x88, 0xb5, 0x2c, 0x2f, 0xd4,
+    0xcd, 0x60, 0x63, 0x66, 0x5f, 0xaa, 0x47, 0x99, 0x2d, 0x96, 0xf8, 0x8e, 0x9c, 0x11, 0x5d, 0x72,
+    0xa6, 0x81, 0x7d, 0x9e, 0x3c, 0xc6, 0x41, 0x00, 0x79, 0x50, 0x60, 0x23, 0x5b, 0x24, 0x0c, 0xe7,
+    0x0d, 0xca, 0xd5, 0x4f, 0xbe, 0x60, 0x98, 0x3e, 0xe8, 0xf5, 0x0e, 0x12, 0xb2, 0x9e, 0x57, 0x54,
+    0xc4, 0x09, 0x13, 0x51, 0xf9, 0xc1, 0x48, 0x70, 0x96, 0x5b, 0x13, 0xe7, 0x77, 0x77, 0x72, 0xf2,
+    0x36, 0x18, 0x2d, 0x20, 0x86, 0x53, 0x4d, 0xfc, 0x6f, 0xa5, 0x90, 0x0a, 0x66, 0xb7, 0x80, 0xaf,
+    0xa5, 0xa4, 0xb2, 0x1f, 0x38, 0x04, 0xbb, 0xbf, 0xc4, 0x62, 0x8a, 0x92, 0xed, 0xfa, 0xc4, 0x56,
+    0xba, 0xfe, 0x56, 0x3f, 0xa2, 0x04, 0xca, 0xaa, 0xde, 0x4a, 0x27, 0xc0, 0xb5, 0xd8, 0x03, 0x22,
+    0x55, 0x91, 0x73, 0xf8, 0xa0, 0xd7, 0xdb, 0x05, 0xf2, 0xcf, 0xe8, 0x6b, 0xcd, 0x3d, 0xdb, 0x54,
+    0x22, 0xc9, 0xbc, 0xe9, 0x6b, 0x15, 0xdc, 0x5f, 0xba, 0xd6, 0xc4, 0xb4, 0x79, 0xaa, 0x45, 0x04,
+    0x2b, 0xc2, 0xe6, 0xcb, 0xe0, 0xcb, 0xda, 0x83, 0x5c, 0x9e, 0xbb, 0xdb, 0x2a, 0x65, 0x3f, 0x61,
+    0xf7, 0xb6, 0x21, 0x6a, 0x97, 0x85, 0x5c, 0xa6, 0x2e, 0x12, 0x32, 0x00, 0x54, 0xaf, 0xc0, 0x63,
+    0x04, 0x9c, 0x5a, 0x56, 0x47, 0x5a, 0xec, 0xab, 0x6f, 0x6a, 0xd7, 0xe1, 0x81, 0x00, 0x60, 0xe5,
+    0xb7, 0xbd, 0x29, 0x30, 0xf7, 0x54, 0x4f, 0x89, 0x43, 0x6b, 0xe8, 0xd5, 0x8c, 0xde, 0x20, 0xe3,
+    0x13, 0x9c, 0x30, 0x37, 0xb4, 0x43, 0x1f, 0x30, 0x3b, 0xb5, 0xff, 0xea, 0x18, 0xf1, 0x66, 0x55,
+    0x9a, 0xd3, 0x9b, 0x11, 0x57, 0x90, 0x3b, 0x63, 0x0f, 0xe8, 0xde, 0xf8, 0x8b, 0xda, 0xe9, 0x4c,
+    0xe7, 0x48, 0x6b, 0xba, 0x8c, 0x91, 0x97, 0xce, 0x84, 0x33, 0x16, 0xd1, 0xe4, 0x91, 0x99, 0x53,
+    0xa1, 0xee, 0x41, 0x7f, 0xd9, 0xfd, 0x03, 0xa3, 0x5b, 0xb1, 0x8a, 0xdc, 0x54, 0x8f, 0x99, 0xd4,
+    0x62, 0x4a, 0x95, 0xda, 0x5d, 0xcb, 0x27, 0x13, 0x3f, 0x93, 0xed, 0x34, 0xa7, 0x57, 0xee, 0x7e,
+    0x31, 0xdd, 0xdb, 0xfc, 0x60, 0xb5, 0xfd, 0x7e, 0x66, 0x2a, 0xb4, 0x1d, 0xd7, 0x17, 0x7f, 0x8c,
+    0x9c, 0x93, 0xb4, 0x7d, 0x1f, 0xb0, 0xd4, 0xb7, 0x66, 0xfb, 0xd6, 0xfb, 0xa3, 0x7a, 0xed, 0x38,
+    0x9a, 0x24, 0xf9, 0xf7, 0x12, 0x44, 0x02, 0xdb, 0xd1, 0x55, 0xbf, 0x2c, 0xb7, 0xef, 0x83, 0x14,
+    0x33, 0xdc, 0x35, 0x9c, 0x94, 0x93, 0x95, 0xe6, 0x56, 0xbb, 0xa2, 0xb7, 0x5c, 0x9e, 0xcc, 0x35,
+    0xf1, 0x34, 0x3e, 0x42, 0xe6, 0x75, 0x4c, 0x3c, 0x12, 0xd6, 0xe8, 0xff, 0xa1, 0x8b, 0x4f, 0x84,
+    0x94, 0xd7, 0x56, 0xea, 0xc2, 0xca, 0x86, 0x92, 0x8e, 0x2e, 0xa7, 0x4b, 0xde, 0x86, 0xf2, 0x51,
+    0x83, 0xf3, 0xff, 0x95, 0x3f, 0x49, 0x6a, 0x99, 0x62, 0x8b, 0x62, 0x78, 0x0a, 0xd8, 0x84, 0x32,
+    0x1d, 0xa6, 0x13, 0x29, 0x96, 0x2c, 0xbe, 0x33, 0x8e, 0x79, 0x3e, 0x23, 0x9a, 0xe8, 0xff, 0x20,
+    0x29, 0xae, 0x10, 0xa4, 0x54, 0x1c, 0x2d, 0x93, 0xb2, 0xce, 0x08, 0x87, 0x12, 0xab, 0x04, 0xb2,
+    0xe0, 0xd0, 0xf5, 0x0f, 0x18, 0xaf, 0xc7, 0x13, 0xb1, 0xc5, 0x8f, 0x9d, 0x3f, 0xa3, 0x53, 0x38,
+    0x6d, 0x75, 0xb1, 0xe6, 0x5e, 0x92, 0xa8, 0x84, 0xce, 0xba, 0x59, 0x72, 0xb7, 0x09, 0xb7, 0xfd,
+    0x85, 0x62, 0xa4, 0x84, 0xf9, 0xad, 0x09, 0x77, 0x8c, 0x7f, 0x37, 0x1c, 0x3a, 0x0f, 0xd5, 0xd3,
+    0xc0, 0x43, 0xe8, 0x0d, 0x07, 0x99, 0xfc, 0x8a, 0x55, 0xdb, 0x5b, 0x87, 0x38, 0x9a, 0x89, 0x1b,
+    0x08, 0x77, 0x7d, 0xc0, 0x61, 0xf7, 0x37, 0x19, 0xd3, 0x6c, 0x77, 0x2c, 0x20, 0xe6, 0xb7, 0x11,
+    0x9e, 0xa3, 0xe3, 0x9a, 0x27, 0x9f, 0x53, 0xdb, 0x1b, 0xb6, 0x02, 0x54, 0x2e, 0xb7, 0xe8, 0xa5,
+    0x9a, 0x34, 0x38, 0xa9, 0xa0, 0x47, 0xa9, 0x8f, 0xf5, 0x24, 0xa7, 0x61, 0xba, 0x35, 0x71, 0x1e,
+    0xad, 0x20, 0x87, 0x83, 0x48, 0x7d, 0xa2, 0x16, 0xde, 0x1b, 0xa4, 0x23, 0x4c, 0xc5, 0xf0, 0xa4,
+    0xef, 0x3f, 0x62, 0xef, 0x75, 0x83, 0x9d, 0x5a, 0x82, 0xcc, 0xff, 0x48, 0x40, 0x85, 0xb3, 0x73,
+    0x1e, 0x75, 0x59, 0xb9, 0x5e, 0x6c, 0xd0, 0x39, 0x6c, 0x91, 0x9d, 0x4e, 0x36, 0xd8, 0x43, 0xfd,
+    0x13, 0x53, 0x9f, 0x4b, 0xb5, 0xe4, 0xc6, 0xa5, 0x46, 0x46, 0x4e, 0xa8, 0x03, 0x9d, 0xe6, 0x69,
+    0xe2, 0x29, 0xdf, 0x7c, 0x75, 0x5c, 0xfb, 0xd2, 0xbf, 0x44, 0xec, 0x0a, 0xaf, 0xe5, 0x22, 0xa6,
+    0x25, 0x16, 0x9d, 0x04, 0x70, 0xf7, 0x2c, 0xb2, 0x68, 0x10, 0x8a, 0x8d, 0x83, 0xb3, 0x16, 0x23,
+    0x5f, 0x06, 0x2a, 0x16, 0xc6, 0x22, 0x7e, 0xe9, 0xd2, 0xf3, 0x64, 0x96, 0x1b, 0x64, 0x8f, 0x50,
+    0x86, 0x50, 0x03, 0x5d, 0x4f, 0x54, 0x37, 0x2d, 0xe0, 0x2b, 0x68, 0x28, 0x6f, 0x64, 0x4d, 0xcb,
+    0x1e, 0x02, 0x7e, 0x44, 0xf6, 0x60, 0x2f, 0x02, 0xa7, 0x88, 0x06, 0x26, 0xb0, 0xe5, 0x2e, 0x34,
+    0xe3, 0x52, 0xbb, 0x34, 0x91, 0x05, 0xac, 0x8e, 0x98, 0xad, 0x0b, 0x39, 0xa3, 0x45, 0x7a, 0x39,
+    0x0a, 0x25, 0x51, 0xad, 0x43, 0x73, 0xd5, 0xc7, 0x4f, 0x35, 0xa2, 0xf4, 0x13, 0xcd, 0x62, 0xfd,
+    0xbf, 0xff, 0xfc, 0x2b, 0x6f, 0x93, 0xa7, 0x4d, 0x67, 0xb7, 0x80, 0xad, 0x33, 0x1b, 0x8f, 0xb5,
+    0x56, 0x46, 0x94, 0x8e, 0xe1, 0x73, 0xb2, 0x6f, 0x25, 0x84, 0x2b, 0x89, 0x74, 0x6d, 0xc5, 0xf2,
+    0x7e, 0x54, 0xac, 0x54, 0x59, 0x02, 0xfb, 0xd3, 0x42, 0xb1, 0x51, 0x8c, 0x68, 0x68, 0xe2, 0x06,
+    0x99, 0x95, 0x22, 0x5b, 0xa0, 0x21, 0x41, 0x3a, 0xb7, 0x21, 0x7b, 0x0d, 0x99, 0x92, 0xf2, 0x30,
+    0x51, 0x12, 0x03, 0xba, 0x56, 0x8b, 0x85, 0x31, 0x10, 0x23, 0x96, 0xf9, 0x43, 0xf3, 0x70, 0x19,
+    0x8a, 0x3b, 0x67, 0x67, 0x9f, 0x19, 0xb3, 0x8c, 0x94, 0x95, 0x70, 0xf4, 0xa0, 0x4d, 0xde, 0x83,
+    0x1d, 0x05, 0xc7, 0x50, 0xd3, 0x25, 0xa6, 0x00, 0xdc, 0x58, 0x41, 0x85, 0xae, 0xb8, 0x25, 0x0c,
+    0x39, 0x68, 0xf6, 0x18, 0x02, 0xa3, 0x4d, 0x81, 0x4d, 0x88, 0xf0, 0xf3, 0x8e, 0x0b, 0xd6, 0x40,
+    0x9b, 0xdb, 0xad, 0x9e, 0x8b, 0xc5, 0xab, 0x2e, 0x93, 0x64, 0xf5, 0xa8, 0x30, 0x77, 0x6b, 0x50,
+    0xfc, 0x07, 0x7d, 0x72, 0x67, 0x75, 0x79, 0x74, 0x8c, 0x36, 0x61, 0x2c, 0x24, 0x92, 0x25, 0x09,
+    0x6c, 0xfe, 0x90, 0x09, 0x17, 0x66, 0xc5, 0xc7, 0xa6, 0xb8, 0x21, 0x84, 0xc0, 0xca, 0xfa, 0x0f,
+    0x33, 0x30, 0x47, 0xd7, 0xae, 0xed, 0xe6, 0x29, 0x74, 0xe4, 0xfd, 0xd8, 0x4f, 0xbf, 0xe6, 0x2b,
+    0x30, 0x09, 0x40, 0x20, 0x2e, 0x1a, 0xa9, 0xe4, 0x9b, 0xb6, 0xf1, 0x01, 0xd7, 0xb7, 0xde, 0x65,
+    0x01, 0xcb, 0x03, 0x96, 0x40, 0x66, 0x76, 0x77, 0x5f, 0xad, 0x2a, 0xdb, 0xb0, 0x37, 0x80, 0x18,
+    0x9b, 0x18, 0xac, 0x71, 0x89, 0x5f, 0x2f, 0xee, 0x8f, 0xec, 0x70, 0x5f, 0xce, 0x39, 0x2b, 0x2d,
+    0xcf, 0x7c, 0x63, 0x5f, 0xec, 0x74, 0x98, 0xf1, 0x8a, 0xea, 0xf6, 0x11, 0xc0, 0x6d, 0x33, 0xc6,
+    0x1f, 0x69, 0x45, 0xae, 0x50, 0xea, 0xa0, 0x38, 0x6d, 0x7e, 0x83, 0x65, 0xfa, 0xcb, 0x63, 0xa3,
+    0xff, 0xe4, 0x5a, 0x26, 0x07, 0xad, 0xc9, 0xcd, 0x16, 0x0c, 0x50, 0x2b, 0x04, 0x44, 0xb8, 0xc5,
+    0x0e, 0x8e, 0xbb, 0x80, 0xf4, 0x23, 0x10, 0x67, 0x6c, 0x60, 0x79, 0x9e, 0x59, 0x6f, 0x03, 0x95,
+    0x6a, 0xaf, 0xbe, 0xde, 0xbd, 0xba, 0x6a, 0xd3, 0x75, 0x75, 0x30, 0x19, 0xf4, 0x80, 0x75, 0xee,
+    0xcf, 0x2c, 0x35, 0xf5, 0xd6, 0xc4, 0x9e, 0x82, 0xcb, 0x22, 0x5e, 0xe3, 0xf9, 0x06, 0xdc, 0xea,
+    0x72, 0xa0, 0x11, 0x88, 0x2b, 0x21, 0x36, 0xb9, 0x2f, 0xd0, 0x31, 0x70, 0x78, 0xad, 0xe7, 0xb6,
+    0xe9, 0x45, 0xcb, 0x34, 0x50, 0xfb, 0xc0, 0xb8, 0xe4, 0xc2, 0xbf, 0x1d, 0x41, 0x53, 0x3d, 0xa5,
+    0xcd, 0x1c, 0xa8, 0xf7, 0xf3, 0x5e, 0x9d, 0x87, 0xf2, 0x8e, 0xf2, 0xf8, 0x1e, 0x10, 0x28, 0x3f,
+    0x68, 0x8a, 0x15, 0xb0, 0x04, 0x4a, 0x40, 0x34, 0xd2, 0xf5, 0x14, 0x9d, 0x9c, 0xae, 0x95, 0xc5,
+    0xa3, 0xb0, 0xeb, 0xfd, 0xc3, 0xb0, 0xe6, 0x53, 0x2d, 0x35, 0x2f, 0xa7, 0x7f, 0x8b, 0x22, 0xba,
+    0x33, 0x32, 0x0f, 0xd0, 0x43, 0x5b, 0xae, 0x59, 0x25, 0x73, 0xae, 0x01, 0xfe, 0x16, 0x21, 0x27,
+    0xbc, 0x01, 0xaa, 0x92, 0x0e, 0x65, 0xfc, 0x44, 0x7b, 0xd9, 0xb3, 0xf5, 0x17, 0xe6, 0x39, 0xc2,
+    0x1c, 0xf3, 0x52, 0xe2, 0x03, 0x97, 0x7c, 0xf5, 0x73, 0x75, 0x7f, 0xad, 0x4a, 0x71, 0xaa, 0x56,
+    0x5b, 0x99, 0x6e, 0xa6, 0x81, 0xdd, 0xd4, 0x3f, 0xfe, 0x55, 0x3e, 0x15, 0x44, 0xb5, 0x63, 0x69,
+    0x74, 0xd3, 0x9c, 0xb1, 0x79, 0x58, 0xf3, 0xb2, 0x58, 0x3c, 0x5e, 0x8f, 0x01, 0x58, 0xe4, 0xe9,
+    0x05, 0xdc, 0xad, 0x3f, 0x2c, 0x4f, 0xec, 0xc8, 0x4e, 0x95, 0x88, 0xac, 0xe2, 0x2b, 0x73, 0xd6,
+    0x9d, 0xa0, 0x24, 0x83, 0xa9, 0x1e, 0xac, 0x83, 0x5c, 0x34, 0x34, 0x8b, 0x8a, 0xb5, 0x75, 0x85,
+    0x08, 0xbf, 0xbf, 0xd0, 0xd7, 0xe5, 0x02, 0xab, 0x91, 0xaf, 0xce, 0xf8, 0xae, 0xa2, 0x3f, 0xb6,
+    0xff, 0x34, 0x17, 0xfe, 0x7b, 0x00, 0xf4, 0x45, 0x23, 0x60, 0x18, 0x07, 0x09, 0x5a, 0x4f, 0x4a,
+    0xbe, 0xeb, 0xab, 0x86, 0x5c, 0x38, 0x8a, 0x13, 0xcc, 0x62, 0x18, 0x7f, 0x46, 0xce, 0x00, 0x4c,
+    0x50, 0xa5, 0x16, 0xd1, 0x17, 0xe1, 0x42, 0xe6, 0x62, 0xb6, 0xa8, 0x5b, 0x73, 0xf1, 0xf6, 0x46,
+    0xf4, 0x1c, 0xcc, 0x94, 0x92, 0x63, 0x21, 0xc1, 0x05, 0x89, 0xc0, 0x15, 0x53, 0xd2, 0xf8, 0xb8,
+    0x4a, 0x41, 0xf3, 0xb2, 0xbc, 0xa4, 0x0b, 0xe9, 0x08, 0x28, 0x45, 0xdb, 0x86, 0x17, 0xf7, 0x3f,
+    0xf6, 0x87, 0xcf, 0xf0, 0xae, 0x94, 0x1b, 0x0a, 0xbf, 0x14, 0xbb, 0xda, 0xdf, 0x07, 0x56, 0xa6,
+    0xe8, 0x02, 0xcf, 0x94, 0x09, 0x01, 0xf5, 0x97, 0x21, 0x77, 0x5c, 0x55, 0x7a, 0xb7, 0xa0, 0x2d,
+    0xc0, 0xee, 0x11, 0x9c, 0xa5, 0x2d, 0x40, 0xb4, 0xd0, 0xff, 0xa9, 0xfd, 0xe3, 0x95, 0x58, 0xa9,
+    0x60, 0xef, 0x72, 0xd5, 0xe0, 0x7c, 0xf1, 0x20, 0x57, 0x1e, 0x43, 0x91, 0x0f, 0x7a, 0xd8, 0xb2,
+    0x62, 0x82, 0x4e, 0x13, 0x11, 0x22, 0xa4, 0x18, 0xb9, 0xd0, 0x7a, 0x12, 0x8f, 0xb0, 0xd6, 0xf3,
+    0x2e, 0x73, 0x97, 0x46, 0x93, 0x8a, 0x71, 0x64, 0x7a, 0x1a, 0x25, 0xbd, 0x6c, 0x0c, 0x8b, 0x13,
+    0xfa, 0x06, 0x5f, 0x75, 0xac, 0x3b, 0x55, 0x26, 0xc1, 0x32, 0x1e, 0x0a, 0x7c, 0x6e, 0x84, 0x41,
+    0x63, 0x9b, 0x32, 0xe7, 0xae, 0xe4, 0xe4, 0xdc, 0x38, 0xd3, 0xf1, 0xb1, 0x19, 0xd4, 0x0f, 0x96,
+    0xa2, 0xb8, 0xda, 0x6a, 0x6c, 0x72, 0xd3, 0x82, 0x16, 0x36, 0xd1, 0x2d, 0x52, 0xd6, 0x77, 0x13,
+    0xb7, 0x54, 0xa9, 0x46, 0x79, 0x3e, 0x86, 0xbf, 0x5a, 0xa0, 0xc2, 0xdc, 0x0d, 0xdc, 0xa5, 0x58,
+    0x7e, 0x0e, 0xb8, 0x11, 0x40, 0xe8, 0xe1, 0x51, 0x7b, 0x5e, 0xab, 0x28, 0x2b, 0xff, 0xb2, 0x35,
+    0xd3, 0xe7, 0x41, 0xb7, 0xaa, 0x85, 0x72, 0xc6, 0xa9, 0x99, 0xdc, 0xe1, 0x89, 0x63, 0xfa, 0x99,
+    0xe2, 0x89, 0xc8, 0x2f, 0x8a, 0x1a, 0x4c, 0x42, 0xd8, 0xde, 0x63, 0x3f, 0x37, 0xcd, 0x95, 0xbe,
+    0xc3, 0x91, 0xb3, 0x77, 0x18, 0x40, 0x8f, 0x50, 0x28, 0x93, 0x59, 0xd5, 0xe4, 0x1d, 0x9f, 0x4d,
+    0x4d, 0x37, 0xbf, 0x7e, 0xbe, 0x88, 0x51, 0xa7, 0x9e, 0x04, 0x1f, 0x14, 0x2d, 0x7a, 0x28, 0x09,
+    0x06, 0xd6, 0x36, 0x20, 0xf2, 0xea, 0xa9, 0x66, 0xbb, 0x00, 0xc4, 0x35, 0x80, 0x38, 0xda, 0x9d,
+    0x6b, 0xc6, 0xfd, 0x14, 0xb9, 0x72, 0x59, 0xe7, 0xb4, 0x84, 0xa0, 0xfa, 0x8c, 0x24, 0x2a, 0xeb,
+    0x9e, 0x0f, 0x08, 0x5d, 0x43, 0x32, 0xce, 0xd9, 0xd2, 0x00, 0xb7, 0x50, 0xc8, 0xc5, 0x1a, 0x12,
+    0xf1, 0x5b, 0x41, 0x72, 0xe6, 0xe1, 0xde, 0x03, 0x86, 0xb6, 0xf8, 0xfc, 0xc0, 0x51, 0xfc, 0xea,
+    0x21, 0x49, 0xdb, 0x9d, 0x85, 0xb7, 0x00, 0xf3, 0x6c, 0xec, 0x26, 0xc7, 0xe5, 0x7b, 0x08, 0x84,
+    0x36, 0xf1, 0x55, 0x7b, 0xc3, 0x6d, 0x1e, 0xfb, 0x32, 0xea, 0xb6, 0x47, 0x44, 0x2d, 0x9f, 0xba,
+    0x17, 0x18, 0x85, 0xe2, 0x79, 0x3c, 0x2d, 0x8a, 0x27, 0x0b, 0x09, 0xe6, 0x04, 0x94, 0x73, 0xfd,
+    0x0b, 0xc7, 0xc9, 0x8b, 0x2d, 0xd6, 0x28, 0x7c, 0x9a, 0xe9, 0xc0, 0x67, 0xe3, 0x68, 0x14, 0x49,
+    0xe5, 0x2c, 0x5c, 0x41, 0x32, 0xf3, 0x34, 0xc4, 0xca, 0x5b, 0x1b, 0xfa, 0xef, 0x8e, 0x96, 0x34,
+    0x61, 0xfe, 0x89, 0x4b, 0xed, 0x7a, 0x33, 0x86, 0xbb, 0x04, 0xbc, 0x71, 0x5e, 0x9a, 0x0f, 0x82,
+    0x4e, 0x01, 0xce, 0x12, 0x08, 0x53, 0x2c, 0x21, 0x25, 0xe1, 0xdd, 0x50, 0x49, 0xc4, 0xd5, 0x84,
+    0x53, 0xe3, 0xd7, 0x5a, 0x28, 0x56, 0x87, 0x24, 0x89, 0x36, 0x21, 0x72, 0xd2, 0x85, 0x1b, 0xc6,
+    0xb9, 0x5b, 0x18, 0x8d, 0xd5, 0x78, 0x52, 0x7a, 0xcf, 0x5f, 0x64, 0x03, 0x3d, 0xfe, 0x2f, 0x9c,
+    0x50, 0x54, 0x2c, 0x40, 0x60, 0x88, 0x96, 0xf7, 0xab, 0xff, 0xbf, 0x3d, 0xd9, 0x9d, 0x73, 0x79,
+    0xcf, 0x96, 0x15, 0x67, 0xad, 0x2a, 0xfd, 0x04, 0x66, 0xa5, 0x9f, 0x96, 0x68, 0xac, 0xd4, 0x37,
+    0xd9, 0xe1, 0xb7, 0x85, 0x26, 0x18, 0x2c, 0x47, 0x09, 0x3d, 0xb2, 0x7a, 0x74, 0x21, 0x80, 0x45,
+    0x6e, 0xd1, 0x1f, 0x87, 0xa7, 0x3f, 0x33, 0x0a, 0x06, 0x55, 0x56, 0x39, 0x83, 0x30, 0xbd, 0x32,
+    0xd1, 0xb0, 0xb2, 0xad, 0x52, 0x7f, 0x2e, 0x3f, 0x3f, 0xbb, 0x3a, 0x45, 0xc4, 0x80, 0x87, 0x40,
+    0x08, 0x7b, 0x2d, 0x0d, 0x7c, 0x42, 0xb0, 0x06, 0x42, 0xd2, 0x62, 0x10, 0x86, 0xab, 0xb5, 0xaf,
+    0x5f, 0x91, 0x78, 0x9c, 0x7a, 0x2f, 0x52, 0xef, 0x89, 0x54, 0x10, 0x03, 0x83, 0xb3, 0x16, 0x9d,
+    0x16, 0x65, 0x2f, 0x87, 0x40, 0x26, 0x9a, 0x35, 0xe4, 0xe5, 0x56, 0x54, 0x5a, 0x61, 0x1c, 0xb8,
+    0xb2, 0xf8, 0x2b, 0x6a, 0xff, 0xcf, 0xfc, 0x08, 0xe9, 0x6d, 0x6e, 0xae, 0x50, 0x8d, 0x55, 0x32,
+    0x6e, 0xec, 0x89, 0xed, 0xea, 0xb9, 0x86, 0x23, 0xfb, 0xf5, 0x4e, 0xdc, 0xaa, 0x55, 0x2f, 0xad,
+    0x3a, 0xf6, 0x6c, 0x6a, 0x9d, 0xfb, 0x41, 0x46, 0x8c, 0x09, 0xf7, 0x75, 0xd9, 0xe3, 0x5c, 0xa8,
+    0xa2, 0x5f, 0xaa, 0xda, 0xef, 0x87, 0x20, 0x8a, 0x77, 0x98, 0x94, 0x25, 0x4e, 0x5e, 0xc9, 0x21,
+    0x01, 0x9d, 0x1a, 0x4f, 0xfb, 0x04, 0xec, 0xe0, 0xb0, 0x59, 0x11, 0xa1, 0xb7, 0x11, 0x56, 0xe2,
+    0x99, 0x83, 0xaa, 0x75, 0xe8, 0x72, 0x93, 0xbb, 0xdc, 0xac, 0x3c, 0x6c, 0x50, 0x60, 0x27, 0x5f,
+    0x0e, 0x9f, 0xbf, 0x7f, 0x41, 0x7e, 0x84, 0x44, 0x4d, 0xb2, 0x18, 0x1f, 0x4b, 0xa2, 0x4e, 0xe3,
+    0x88, 0x63, 0x2a, 0xe8, 0x4d, 0xf4, 0x6d, 0xaf, 0xb5, 0x1d, 0x4b, 0xf6, 0x89, 0x57, 0x2c, 0xf7,
+    0x52, 0xef, 0x59, 0x34, 0xe3, 0xb1, 0xda, 0xe8, 0x80, 0xcf, 0x16, 0x0b, 0x9b, 0x4e, 0xc9, 0x54,
+    0x71, 0x38, 0x3e, 0xe3, 0x87, 0x7a, 0x4a, 0x85, 0x30, 0x89, 0x8e, 0x3b, 0xcf, 0x17, 0xdf, 0x01,
+    0x6a, 0xd2, 0x43, 0x8c, 0x5c, 0xae, 0xf6, 0x57, 0x3f, 0xcb, 0xf3, 0x29, 0x53, 0x3c, 0x4c, 0x46,
+    0xe0, 0x46, 0x2e, 0x7d, 0x7b, 0xe0, 0xa7, 0x8c, 0xc5, 0xb3, 0x0b, 0x6f, 0x60, 0x0c, 0x1f, 0xa8,
+    0xed, 0x42, 0x55, 0xc6, 0xb3, 0xc5, 0xda, 0x41, 0x9a, 0xb7, 0xcf, 0xf4, 0x75, 0xee, 0xaa, 0x5d,
+    0x08, 0xb0, 0x06, 0x7d, 0x6b, 0x53, 0x2d, 0xd2, 0x10, 0xc9, 0x4f, 0xe9, 0x9e, 0xcf, 0x76, 0x5f,
+    0x38, 0x4b, 0x0b, 0x22, 0x4c, 0xfb, 0x45, 0xb3, 0x96, 0x45, 0xe5, 0xa0, 0xe0, 0xc7, 0xf9, 0xd7,
+    0xde, 0xf9, 0xb0, 0x7a, 0x68, 0x7e, 0xbd, 0x80, 0x00, 0xe4, 0x80, 0x7f, 0x2d, 0x98, 0x06, 0xf0,
+    0x05, 0x42, 0x1c, 0xed, 0xcc, 0x8d, 0xef, 0x1b, 0x9e, 0xb2, 0x4c, 0xe2, 0x63, 0x92, 0xfb, 0x1c,
+    0x75, 0x05, 0xe4, 0x40, 0x1e, 0x02, 0x80, 0xbb, 0x73, 0x55, 0x6a, 0xd7, 0xf1, 0x62, 0x27, 0x23,
+    0x87, 0xc3, 0x51, 0x25, 0x48, 0xb7, 0xa5, 0xab, 0x0d, 0x10, 0xbc, 0x51, 0x75, 0xda, 0x7c, 0xb2,
+    0x79, 0x97, 0xc6, 0x1f, 0xa9, 0xb4, 0x18, 0x93, 0x45, 0xbb, 0xcf, 0xee, 0xd7, 0xd0, 0xcb, 0xb7,
+    0x78, 0xef, 0xdf, 0x97, 0x69, 0x52, 0xf2, 0x43, 0x66, 0xd3, 0x73, 0xb8, 0x68, 0x44, 0xe7, 0xcc,
+    0x2f, 0xd4, 0x5c, 0xf4, 0xc9, 0x23, 0x69, 0x6e, 0xb7, 0x78, 0x60, 0x7c, 0x8a, 0x22, 0xc9, 0xed,
+    0x2b, 0xa0, 0x5f, 0xbd, 0xae, 0xa1, 0x7e, 0xdd, 0x46, 0x79, 0x59, 0x24, 0x07, 0x5d, 0x67, 0xdd,
+    0x2b, 0x26, 0x53, 0x98, 0x6e, 0x61, 0x20, 0x1a, 0xcc, 0xd4, 0xe2, 0x6b, 0x13, 0x7f, 0x28, 0x2e,
+    0xe1, 0x54, 0x6f, 0x0e, 0x03, 0x72, 0x45, 0x1e, 0x70, 0xe8, 0x55, 0x57, 0x16, 0xfd, 0xa9, 0xb7,
+    0xdd, 0xcd, 0xe4, 0xdc, 0x9a, 0x0d, 0xd3, 0x91, 0x26, 0x18, 0x68, 0xf5, 0x09, 0x30, 0xe3, 0x5a,
+    0x8c, 0x22, 0x0e, 0x32, 0xf9, 0xa3, 0xdc, 0xf4, 0xf3, 0x85, 0xf5, 0x2f, 0xd6, 0x8c, 0x66, 0xa9,
+    0xcf, 0x17, 0x87, 0x42, 0x68, 0xec, 0xe7, 0xa5, 0xc1, 0xd7, 0x5b, 0x2f, 0xfb, 0xc7, 0x3b, 0x25,
+    0x50, 0xb7, 0x2e, 0x0c, 0x0d, 0x0c, 0x70, 0xed, 0x14, 0xd5, 0x1f, 0x50, 0x10, 0x4a, 0xa4, 0x49,
+    0xcb, 0xa9, 0x1f, 0x61, 0xde, 0x6c, 0x79, 0x8e, 0x7a, 0x29, 0xa6, 0x5a, 0xda, 0x93, 0xc5, 0xe3,
+    0xff, 0xd1, 0x0a, 0x90, 0xee, 0x78, 0x1e, 0x3d, 0x6a, 0x2d, 0xa5, 0x87, 0xe7, 0x6f, 0x67, 0xf9,
+    0xe4, 0xc2, 0x39, 0xc3, 0x96, 0x13, 0xd8, 0x85, 0xc3, 0xde, 0x56, 0x7d, 0x3f, 0x03, 0x7c, 0xc5,
+    0x6c, 0xca, 0x87, 0x07, 0x8a, 0x1b, 0x0e, 0x6c, 0x03, 0x87, 0x8a, 0xee, 0x07, 0x16, 0x62, 0x92,
+    0xc3, 0x36, 0x9f, 0x97, 0x45, 0x86, 0x3a, 0xd5, 0xbd, 0x79, 0x65, 0xa3, 0x74, 0x1a, 0x8e, 0xa8,
+    0x16, 0x22, 0x6e, 0xfa, 0x3f, 0xcf, 0x47, 0xd5, 0xee, 0x3f, 0x27, 0x9d, 0x7b, 0x3e, 0x49, 0xa0,
+    0x5c, 0x93, 0xb5, 0xb3, 0x02, 0x46, 0x45, 0x74, 0x2f, 0xa5, 0xf9, 0x96, 0x1a, 0x84, 0x22, 0xdd,
+    0xee, 0x22, 0x5a, 0x01, 0x30, 0x32, 0x80, 0xf3, 0xdd, 0x6c, 0x9c, 0x9b, 0xd4, 0x62, 0x1b, 0x71,
+    0x77, 0x8a, 0xef, 0xb5, 0x08, 0xbc, 0xd6, 0xc9, 0xe7, 0x11, 0xcc, 0x72, 0xa9, 0x1a, 0xa7, 0x94,
+    0x96, 0xcb, 0xa4, 0xb0, 0x08, 0x40, 0xaf, 0x20, 0x78, 0xe1, 0xa5, 0xc2, 0x76, 0x6e, 0xe5, 0x3b,
+    0xc0, 0x1d, 0xfa, 0x12, 0x4a, 0x69, 0x88, 0x89, 0xe3, 0x97, 0x83, 0x6b, 0xe7, 0x61, 0xf6, 0x0c,
+    0x25, 0xd8, 0x33, 0xb7, 0x94, 0xf5, 0x9d, 0x21, 0x8d, 0xfe, 0x60, 0x10, 0x75, 0x3d, 0x25, 0x38,
+    0x2f, 0x22, 0xf7, 0x72, 0x18, 0xa2, 0x47, 0xe6, 0x96, 0xa2, 0x4e, 0x0b, 0x2b, 0xc2, 0xf1, 0x57,
+    0x2e, 0xe2, 0xeb, 0xb1, 0x26, 0x08, 0xd2, 0xa5, 0x3f, 0x12, 0xee, 0x99, 0xa2, 0x6d, 0xf9, 0x2a,
+    0xd8, 0x0f, 0x16, 0xe6, 0x2f, 0x6d, 0xb6, 0xd0, 0xfd, 0x64, 0x76, 0xe3, 0x9e, 0x05, 0x2b, 0x2c,
+    0xdc, 0x49, 0x18, 0x1b, 0x0d, 0x3c, 0x10, 0xa1, 0xc4, 0x32, 0x9c, 0x2d, 0x46, 0x66, 0x43, 0xb4,
+    0x7b, 0xef, 0x9e, 0x4f, 0xa3, 0xd5, 0xc0, 0xde, 0x77, 0x8c, 0xd5, 0x34, 0xf2, 0x35, 0x57, 0x63,
+    0x76, 0xb4, 0x75, 0xe7, 0x47, 0xbb, 0x2a, 0x40, 0x85, 0x50, 0xa0, 0x5a, 0x0b, 0x59, 0xd9, 0x92,
+    0x9d, 0x67, 0x63, 0xbf, 0x78, 0xfc, 0x78, 0x58, 0x01, 0x95, 0x79, 0x0a, 0xae, 0xea, 0x09, 0x38,
+    0x0f, 0x33, 0x83, 0x5d, 0x3f, 0x4f, 0x0f, 0xf8, 0x92, 0xaf, 0x9d, 0x00, 0x24, 0x22, 0x67, 0xfe,
+    0x7c, 0xd4, 0x7c, 0x50, 0x49, 0xab, 0x08, 0x00, 0x55, 0x54, 0xde, 0x78, 0x3d, 0xa3, 0x05, 0x3a,
+    0xa2, 0x07, 0x5b, 0xe4, 0x8a, 0x52, 0x98, 0xad, 0x7d, 0xd0, 0x73, 0x80, 0xbc, 0x1f, 0x43, 0xcf,
+    0x68, 0x3d, 0xab, 0xa2, 0x28, 0x55, 0x6d, 0xe5, 0x69, 0xaf, 0x20, 0xbc, 0xaf, 0xf1, 0x60, 0x88,
+    0xc3, 0xcf, 0xc8, 0xc3, 0x9d, 0x24, 0x32, 0x4b, 0xd5, 0x49, 0xf3, 0xf0, 0x76, 0x8a, 0xc4, 0xe5,
+    0x42, 0xa4, 0xa5, 0x51, 0xd3, 0x07, 0x03, 0xbd, 0x56, 0x79, 0xe4, 0xd6, 0x9c, 0xb8, 0x95, 0x01,
+    0x6b, 0x7e, 0x8e, 0xe1, 0x4e, 0x55, 0x82, 0x51, 0x53, 0x24, 0x42, 0x5d, 0x20, 0xae, 0x64, 0x31,
+    0xa1, 0xd0, 0xd4, 0xba, 0x03, 0x04, 0x51, 0xf6, 0xcc, 0x6a, 0xf7, 0x58, 0x93, 0x3b, 0x86, 0x91,
+    0x2c, 0x21, 0xdd, 0xcb, 0x43, 0x3b, 0x71, 0xd2, 0xdc, 0x36, 0x77, 0x33, 0x0b, 0x24, 0x82, 0x32,
+    0xfb, 0x0a, 0xd3, 0x94, 0x31, 0xe4, 0xf3, 0xd4, 0xba, 0xec, 0xb7, 0x2d, 0x2a, 0xe1, 0xf2, 0x35,
+    0x0b, 0x6d, 0x96, 0xcd, 0xd6, 0xb2, 0xa1, 0xb0, 0x1f, 0xb1, 0x62, 0x36, 0x78, 0x3f, 0xe8, 0x2a,
+    0x2a, 0x99, 0x49, 0x0d, 0x4d, 0x53, 0x21, 0x51, 0x39, 0xd7, 0xc7, 0x27, 0x1d, 0x87, 0xc1, 0x1a,
+    0x7a, 0xff, 0xc8, 0xb4, 0xdd, 0xca, 0x08, 0x6e, 0xd8, 0xf6, 0xa4, 0xdc, 0x6a, 0x31, 0x23, 0xdb,
+    0x6c, 0x13, 0x4b, 0xd6, 0x8a, 0x18, 0xfd, 0xd3, 0x6f, 0x8d, 0x85, 0xa0, 0x3a, 0xbe, 0x8d, 0xdb,
+    0x58, 0x0c, 0x04, 0x19, 0x92, 0x00, 0x41, 0x04, 0x62, 0x3d, 0xa0, 0xba, 0xe3, 0x02, 0xff, 0x48,
+    0x04, 0x57, 0x09, 0xf9, 0x76, 0xbf, 0xdd, 0xe3, 0x7c, 0x36, 0x3f, 0xa1, 0x17, 0xae, 0x4e, 0xe3,
+    0x71, 0xbc, 0x73, 0xb6, 0xd5, 0x56, 0x84, 0xb6, 0x4c, 0xb4, 0xad, 0x76, 0xf8, 0x11, 0x9c, 0xd3,
+    0xae, 0x8c, 0x8d, 0x64, 0x22, 0x53, 0xf8, 0xba, 0x9a, 0x0b, 0xcd, 0x5d, 0x02, 0x2b, 0x01, 0x94,
+    0x1d, 0x58, 0xf5, 0xa7, 0xdf, 0x43, 0x21, 0xd9, 0x39, 0x01, 0x27, 0xbd, 0xc9, 0xb0, 0xc4, 0x09,
+    0xac, 0x3d, 0x2c, 0xb4, 0x7f, 0x0b, 0x70, 0x2c, 0x0b, 0xbb, 0x32, 0x82, 0xf4, 0xbe, 0x3b, 0x8a,
+    0xed, 0x3b, 0x8b, 0x60, 0x21, 0xc6, 0xce, 0x47, 0x2c, 0xd8, 0x8b, 0x50, 0x24, 0x69, 0x5b, 0x0f,
+    0x6f, 0xc3, 0x00, 0x24, 0x6f, 0xe2, 0x6e, 0x8d, 0xb7, 0x6b, 0xec, 0x51, 0x1c, 0x46, 0x70, 0xde,
+    0xad, 0xf8, 0x17, 0x12, 0xf1, 0xb5, 0xb9, 0x9e, 0x00, 0x84, 0xf5, 0x11, 0xd0, 0xa7, 0xea, 0xff,
+    0x86, 0x4d, 0x01, 0xe7, 0xb5, 0x42, 0x05, 0x5a, 0xc5, 0x8f, 0xa6, 0xcd, 0x9f, 0x11, 0x69, 0x52,
+    0x4e, 0x4e, 0xd2, 0xce, 0x54, 0x1a, 0x01, 0xef, 0x7a, 0x1b, 0x20, 0x7e, 0xbb, 0x28, 0x93, 0xbc,
+    0x9e, 0x6b, 0xfd, 0xb0, 0xe3, 0x05, 0x8b, 0x5f, 0x34, 0xab, 0x4f, 0x35, 0x72, 0x38, 0xd2, 0x79,
+    0x97, 0x6b, 0x3f, 0x8f, 0x96, 0x53, 0x62, 0xd6, 0x9d, 0xae, 0x30, 0x29, 0x97, 0x5d, 0x2f, 0x83,
+    0xec, 0x01, 0xe4, 0x76, 0xb5, 0xde, 0xd8, 0x1f, 0xa6, 0xc9, 0xbe, 0xb6, 0x7b, 0x58, 0x33, 0xbb,
+    0x26, 0xf3, 0x2f, 0xcf, 0x8e, 0x61, 0x55, 0x2b, 0x33, 0x77, 0xb9, 0x23, 0xf7, 0x90, 0x0a, 0x13,
+    0x1c, 0x1e, 0x7a, 0x2f, 0xeb, 0xa1, 0xc7, 0xf7, 0x23, 0xf8, 0x44, 0x48, 0xff, 0x46, 0x05, 0x77,
+    0xe0, 0x80, 0x96, 0xc9, 0x5a, 0x88, 0xdd, 0xef, 0x63, 0xb6, 0x3a, 0x20, 0x29, 0xb9, 0xc3, 0x32,
+    0x4e, 0xc7, 0xcd, 0x93, 0x7e, 0x5d, 0x10, 0x64, 0x83, 0xc0, 0xef, 0xdd, 0xbc, 0xe3, 0x92, 0x48,
+    0x6e, 0x02, 0x2c, 0x93, 0x79, 0xc9, 0xfa, 0xed, 0xd2, 0x1b, 0x0e, 0x5e, 0x3b, 0x3a, 0x1b, 0x90,
+    0x1c, 0x53, 0x36, 0x50, 0xe0, 0x56, 0xd2, 0xeb, 0x8a, 0x3f, 0x8a, 0x3e, 0xee, 0x9d, 0x5a, 0xfd,
+    0x42, 0x8c, 0xc4, 0xf9, 0x54, 0xc2, 0xf2, 0x70, 0x0e, 0x90, 0xc0, 0x2c, 0x7b, 0x72, 0x83, 0x9e,
+    0xb5, 0x65, 0xca, 0x83, 0x04, 0x8b, 0x84, 0x3d, 0x4c, 0x55, 0x3f, 0x73, 0x92, 0xf1, 0x29, 0xaa,
+    0xe8, 0x92, 0x6e, 0x45, 0x40, 0x33, 0xc2, 0x04, 0x3f, 0x06, 0x66, 0xdb, 0xca, 0x1b, 0xb7, 0xf1,
+    0xa5, 0x1f, 0x0b, 0x18, 0x3c, 0x2e, 0xf2, 0x7b, 0xb6, 0x33, 0x22, 0x2c, 0xeb, 0xdc, 0x8a, 0xdb,
+    0x2f, 0x9c, 0xcf, 0x0e, 0x30, 0xdf, 0xed, 0x6c, 0xd7, 0x9c, 0x7c, 0x05, 0xdd, 0xeb, 0x85, 0x75,
+    0x9b, 0x88, 0xbe, 0xee, 0xb5, 0x17, 0x21, 0x65, 0xc5, 0xff, 0xd3, 0x90, 0x9e, 0xaa, 0x5a, 0xb2,
+    0x01, 0x3c, 0x53, 0xf1, 0x0e, 0xa6, 0xc6, 0xcc, 0xfa, 0x9d, 0x39, 0x9a, 0x61, 0xdd, 0x59, 0x55,
+    0x12, 0xcc, 0xd7, 0x8c, 0xd2, 0x53, 0xaa, 0xce, 0x54, 0x54, 0x56, 0xdf, 0xbf, 0x2a, 0x5a, 0x9c,
+    0xd0, 0xff, 0xbf, 0x84, 0x56, 0xb0, 0x49, 0x65, 0x17, 0x00, 0xa7, 0xe7, 0xa4, 0x1c, 0xe2, 0xec,
+    0xe4, 0x0c, 0x57, 0xa8, 0x61, 0xcd, 0xae, 0x3a, 0xb8, 0xc0, 0xc7, 0xdf, 0xdd, 0x86, 0x01, 0x3e,
+    0x5f, 0x2a, 0x55, 0xdd, 0x0c, 0xff, 0xd4, 0xf1, 0x26, 0x23, 0x22, 0x04, 0xac, 0x70, 0x03, 0x3e,
+    0xf8, 0xff, 0xb4, 0xca, 0x79, 0x9b, 0xca, 0x55, 0x86, 0xc9, 0xa7, 0x7e, 0xc8, 0xea, 0x9c, 0x99,
+    0x7e, 0x48, 0x6c, 0x54, 0xd7, 0x64, 0x6e, 0xdb, 0x32, 0xeb, 0xe9, 0x90, 0xb7, 0x06, 0x27, 0x79,
+    0x97, 0x6e, 0xb2, 0x0e, 0x96, 0x18, 0xcc, 0x67, 0x09, 0x34, 0x03, 0x78, 0x2d, 0x0b, 0x9c, 0x06,
+    0x86, 0x25, 0x16, 0x24, 0xb8, 0x17, 0xc0, 0x6e, 0xd9, 0xe3, 0xc7, 0xe2, 0x95, 0xf5, 0x71, 0xed,
+    0xf8, 0xde, 0x6b, 0x6e, 0x29, 0x98, 0xae, 0x00, 0x32, 0x0a, 0xc2, 0x14, 0x00, 0x47, 0x96, 0x8b,
+    0x30, 0x59, 0x4c, 0xe6, 0x3c, 0xa9, 0x00, 0x96, 0xb2, 0x59, 0x00, 0x7a, 0xf4, 0xc2, 0x9e, 0xc5,
+    0xb9, 0x16, 0x42, 0xbe, 0x31, 0x93, 0x45, 0xeb, 0xe0, 0xb4, 0x3c, 0xc3, 0x72, 0xde, 0xeb, 0xa4,
+    0x93, 0x7f, 0x98, 0x13, 0x56, 0x61, 0xc3, 0x99, 0xf2, 0xe2, 0xa5, 0x6b, 0xa2, 0x80, 0x80, 0x54,
+    0xec, 0x3f, 0xad, 0x6b, 0xc5, 0xba, 0x3f, 0x8b, 0xe7, 0x6b, 0x6c, 0xb9, 0x28, 0x81, 0x4d, 0x7e,
+    0x48, 0xdc, 0x28, 0x15, 0x4f, 0x97, 0x1a, 0x5b, 0x07, 0x62, 0x21, 0xb3, 0x25, 0x8e, 0xbc, 0x77,
+    0xc6, 0x11, 0x9d, 0x1e, 0xed, 0xa5, 0xbf, 0x1b, 0x0e, 0x1b, 0x44, 0x70, 0xc5, 0xa3, 0x0f, 0xd8,
+    0xa8, 0x43, 0x6d, 0xf9, 0x97, 0x59, 0x9d, 0xb9, 0x8d, 0x48, 0xff, 0xb8, 0x75, 0x71, 0x34, 0x46,
+    0xea, 0x16, 0xb6, 0x9e, 0x3e, 0x71, 0xad, 0xda, 0x6c, 0xe4, 0x08, 0xb6, 0x51, 0x51, 0x3c, 0xa7,
+    0x41, 0xb3, 0x54, 0x92, 0xd7, 0x97, 0x50, 0xf5, 0x5b, 0xd2, 0x25, 0xd1, 0xa6, 0x9d, 0x16, 0x2d,
+    0xb7, 0xb6, 0x17, 0x64, 0x39, 0xda, 0xa3, 0xef, 0x54, 0x46, 0x8c, 0x91, 0x85, 0xa2, 0x22, 0x18,
+    0xf3, 0x2e, 0xd1, 0x0d, 0xae, 0x94, 0xd1, 0xbe, 0xc7, 0x04, 0x3e, 0x34, 0x9f, 0xe9, 0x42, 0x51,
+    0xb5, 0xce, 0xaa, 0x90, 0x9d, 0xe0, 0xaa, 0x34, 0xe4, 0x10, 0xc9, 0x00, 0x85, 0xce, 0xb0, 0x0c,
+    0xdb, 0x48, 0x4b, 0x21, 0x49, 0x5e, 0x69, 0xdc, 0x01, 0x77, 0x27, 0x97, 0x1e, 0x5b, 0x07, 0xd6,
+    0x47, 0x10, 0x84, 0x6d, 0x2d, 0x88, 0x6e, 0xb1, 0x2b, 0xac, 0x0a, 0x8b, 0x0c, 0x68, 0x13, 0xdb,
+    0xb1, 0x8e, 0x25, 0xb5, 0xc6, 0x01, 0x0c, 0xb0, 0xc5, 0xa4, 0x40, 0xd0, 0x28, 0x56, 0xf1, 0x78,
+    0x1b, 0x77, 0x0c, 0x29, 0x0d, 0xa6, 0xb8, 0x74, 0x1f, 0x9f, 0xde, 0x79, 0xe0, 0xc0, 0x5a, 0xed,
+    0xc8, 0xf4, 0xeb, 0x26, 0xf4, 0xe5, 0x0f, 0x45, 0x7a, 0x5d, 0xd0, 0x73, 0x10, 0x8b, 0xf2, 0xd3,
+    0xa8, 0x0b, 0x31, 0x26, 0x58, 0x6f, 0xd9, 0xef, 0xee, 0xb5, 0x11, 0xed, 0xb3, 0xf5, 0x7b, 0xe1,
+    0x66, 0xe2, 0xa2, 0x1e, 0x9e, 0xd3, 0x8e, 0x21, 0x95, 0xbc, 0x00, 0x65, 0xbf, 0xb0, 0x4f, 0x27,
+    0x4c, 0xf5, 0x4b, 0x1f, 0x3b, 0x7a, 0x25, 0xd4, 0x2e, 0xb8, 0x1a, 0x8a, 0x92, 0x2f, 0x08, 0x85,
+    0x6d, 0x82, 0xd6, 0xd2, 0xd6, 0x74, 0xed, 0xe0, 0xf1, 0xfc, 0x1f, 0x26, 0x29, 0x9f, 0x85, 0xad,
+    0x13, 0x8d, 0x67, 0xb4, 0xc8, 0x3b, 0x65, 0xa9, 0xdf, 0x94, 0x60, 0x7a, 0xc2, 0x30, 0xad, 0x25,
+    0xc9, 0xf7, 0x09, 0xc9, 0x6a, 0xd2, 0xfc, 0x6e, 0xa2, 0x24, 0xbd, 0xfb, 0x03, 0x2b, 0xd4, 0xf6,
+    0x0c, 0xab, 0x85, 0x2c, 0x69, 0xa1, 0xdb, 0x3a, 0x54, 0x8d, 0xbf, 0xcb, 0x53, 0x56, 0xc2, 0xeb,
+    0xe9, 0x06, 0xe7, 0x92, 0x34, 0x8d, 0xd7, 0xa3, 0xf3, 0xd3, 0x8e, 0x7e, 0xd0, 0x97, 0x09, 0x01,
+    0xb3, 0xd3, 0xeb, 0xde, 0x90, 0xaa, 0x70, 0x87, 0x61, 0x7a, 0x31, 0xdd, 0xa6, 0x8c, 0x7c, 0x2c,
+    0x09, 0x07, 0x9b, 0x6c, 0xd0, 0xd4, 0x17, 0x27, 0x88, 0xc9, 0xef, 0xed, 0x4e, 0xe8, 0x65, 0x92,
+    0xaf, 0xfb, 0x45, 0x61, 0x9f, 0xa6, 0xd6, 0x08, 0xd9, 0xdc, 0x5e, 0xed, 0x61, 0x45, 0x84, 0x30,
+    0xe4, 0x68, 0x8a, 0x6a, 0x68, 0x99, 0x5b, 0xb1, 0x23, 0x75, 0xe0, 0xaa, 0x31, 0x1a, 0x8b, 0x34,
+    0xba, 0x3a, 0x7f, 0xff, 0xb9, 0xda, 0x21, 0x48, 0x74, 0xc2, 0x49, 0xe9, 0xcc, 0x87, 0x6a, 0xab,
+    0x4a, 0x9d, 0x68, 0x0b, 0x48, 0xe5, 0x70, 0x61, 0xec, 0x5b, 0xe1, 0xe9, 0x09, 0x24, 0xb2, 0xd8,
+    0x50, 0x34, 0xe1, 0xd9, 0x5b, 0x9b, 0xeb, 0xe7, 0x2b, 0x71, 0x90, 0xae, 0x76, 0x05, 0x7f, 0x28,
+    0x55, 0x7d, 0x02, 0xa1, 0xb9, 0x80, 0x97, 0x75, 0x83, 0xab, 0x29, 0x18, 0x04, 0x89, 0x94, 0xa2,
+    0x9e, 0xe8, 0x37, 0xa3, 0x83, 0x11, 0x68, 0x7b, 0xba, 0x66, 0x48, 0xf6, 0xe6, 0x1a, 0xd6, 0xb0,
+    0x54, 0x0a, 0xa9, 0x50, 0xd4, 0xfa, 0x53, 0x4e, 0x33, 0x5f, 0x44, 0xe8, 0xca, 0xdc, 0x8c, 0xc9,
+    0x10, 0x84, 0x99, 0x85, 0x6d, 0xb5, 0x4c, 0x8b, 0x01, 0x56, 0xb4, 0xe4, 0xa4, 0x0e, 0x3c, 0x62,
+    0x14, 0xdb, 0x59, 0x6e, 0xcd, 0xa7, 0x37, 0x70, 0x12, 0x6e, 0x58, 0xe4, 0x52, 0x5b, 0x5a, 0xbf,
+    0xc9, 0xab, 0x9c, 0xbc, 0x53, 0x54, 0x02, 0xaf, 0x28, 0x66, 0xf5, 0x1f, 0xb9, 0x5e, 0x88, 0x20,
+    0x0e, 0xa8, 0xb9, 0xf0, 0x06, 0x46, 0x82, 0xa9, 0xfd, 0x8e, 0x02, 0xfb, 0xd6, 0x12, 0x2b, 0x56,
+    0xe2, 0x2b, 0x7e, 0x8e, 0x8d, 0x74, 0x93, 0x85, 0xe4, 0xe0, 0x78, 0x18, 0x03, 0xbe, 0xe9, 0x34,
+    0xc7, 0xa7, 0x9e, 0xce, 0x00, 0x24, 0xd2, 0x76, 0x95, 0xd5, 0x09, 0x20, 0xb8, 0x42, 0xbf, 0xc7,
+    0x09, 0x79, 0xb5, 0xe0, 0x01, 0xf9, 0x18, 0xd0, 0x5f, 0x7e, 0x5d, 0xd2, 0xdf, 0xc5, 0xc3, 0xe2,
+    0x2a, 0x08, 0x3f, 0xa7, 0x93, 0xe1, 0x2e, 0x96, 0x33, 0xf3, 0xc2, 0x19, 0x1e, 0xdc, 0xa9, 0x14,
+    0xd6, 0xc5, 0xd6, 0x91, 0x46, 0x8c, 0xee, 0x36, 0xf8, 0xd8, 0x6b, 0x63, 0x10, 0x1c, 0xb2, 0x21,
+    0xae, 0xfc, 0x8c, 0x4b, 0x43, 0x02, 0xf0, 0xce, 0xef, 0xa5, 0x5a, 0x69, 0x81, 0x86, 0x58, 0x67,
+    0xeb, 0xd0, 0xbd, 0x53, 0x58, 0x1f, 0xce, 0x15, 0x70, 0x67, 0xbc, 0xc4, 0xbd, 0x65, 0x39, 0x60,
+    0xfa, 0x6c, 0x74, 0xbd, 0xd6, 0x45, 0xdb, 0xd5, 0x2f, 0x0c, 0x54, 0x95, 0x53, 0xcf, 0xb4, 0xc0,
+    0x64, 0x1f, 0x76, 0xdc, 0xe1, 0x8f, 0x1c, 0x9a, 0x55, 0x14, 0x3c, 0x7d, 0xca, 0xfa, 0xf9, 0x2a,
+    0x81, 0x60, 0xbf, 0x88, 0xcc, 0xfe, 0x2d, 0x58, 0x51, 0x0f, 0x0c, 0x3e, 0x2f, 0xfd, 0xeb, 0x14,
+    0x3e, 0xc9, 0x06, 0x85, 0xc6, 0xe6, 0x62, 0x51, 0x1f, 0x87, 0xa5, 0xe3, 0x1e, 0x25, 0xb8, 0x3d,
+    0x5d, 0xb9, 0xd7, 0x7e, 0x13, 0x72, 0x8b, 0x2b, 0x8a, 0x94, 0x79, 0xef, 0xf7, 0x7c, 0x92, 0xea,
+    0xba, 0xee, 0xcf, 0x32, 0x20, 0xc1, 0x27, 0x65, 0xd3, 0xed, 0x1c, 0x95, 0x74, 0x64, 0x51, 0xda,
+    0x44, 0x36, 0x1f, 0x8a, 0xb1, 0x8e, 0xd7, 0x33, 0x00, 0x35, 0x5c, 0xc6, 0xf0, 0x28, 0xdc, 0xe6,
+    0x20, 0xbd, 0xb1, 0x77, 0x45, 0x84, 0xa8, 0x54, 0x77, 0x1e, 0x6a, 0x08, 0x71, 0xad, 0x3b, 0x16,
+    0x6b, 0x3a, 0xd7, 0x75, 0xed, 0x0a, 0x1b, 0x22, 0x61, 0xca, 0xda, 0x84, 0xd2, 0xf4, 0x91, 0x51,
+    0xeb, 0x8c, 0x71, 0xa6, 0x1b, 0x36, 0xa5, 0x0a, 0x37, 0x7b, 0x80, 0x0c, 0xcc, 0x52, 0x1a, 0x3a,
+    0xb2, 0x1a, 0x28, 0xa7, 0x92, 0xad, 0x99, 0x8f, 0x60, 0xbf, 0x90, 0xbf, 0x25, 0xac, 0x92, 0x41,
+    0x1f, 0xd4, 0xfa, 0x04, 0xee, 0xac, 0x27, 0x12, 0xe8, 0xea, 0x0a, 0x2d, 0xbe, 0x45, 0xc6, 0x82,
+    0x6a, 0xe1, 0xac, 0x7b, 0x13, 0xa4, 0x9e, 0x50, 0xbd, 0x79, 0xc7, 0xf6, 0xba, 0x2a, 0x69, 0x6e,
+    0x5b, 0xc2, 0x7f, 0xda, 0xc4, 0x7c, 0xb3, 0x93, 0xfb, 0x8b, 0x91, 0xa9, 0xb2, 0x23, 0x59, 0x52,
+    0x3c, 0x87, 0x31, 0xd7, 0x1d, 0xb5, 0x19, 0xf1, 0x7c, 0x3a, 0x61, 0x51, 0x29, 0x20, 0x35, 0x32,
+    0xf1, 0xa7, 0xb2, 0x85, 0xed, 0x27, 0x22, 0xa2, 0x4b, 0xf1, 0x8e, 0x95, 0x43, 0x67, 0x39, 0x8f,
+    0xeb, 0x75, 0x36, 0x3b, 0x7a, 0x7b, 0x08, 0xd5, 0x85, 0x28, 0xd3, 0xfb, 0xcb, 0x80, 0x85, 0xa8,
+    0x5d, 0x5a, 0x62, 0x89, 0x19, 0x69, 0xbf, 0x1d, 0xc0, 0x2c, 0x1c, 0x38, 0x94, 0xd6, 0xf0, 0x19,
+    0xe0, 0x29, 0x75, 0x5b, 0x2d, 0xf2, 0xe0, 0xd6, 0x09, 0x8e, 0xd7, 0xad, 0x68, 0xa7, 0x75, 0x97,
+    0x6b, 0xb0, 0x24, 0x63, 0xec, 0xfb, 0xfb, 0x40, 0xfc, 0xe0, 0xd7, 0x7b, 0x05, 0xf0, 0xf7, 0x98,
+    0xda, 0xcf, 0xf0, 0x6c, 0xae, 0xdc, 0xe7, 0x22, 0xed, 0xb1, 0x11, 0x86, 0xbd, 0x3f, 0x77, 0xf2,
+    0x08, 0x97, 0xac, 0x38, 0x41, 0x4f, 0x10, 0xcb, 0x42, 0xa1, 0xaf, 0x2e, 0xbe, 0x3d, 0xd8, 0x9f,
+    0xd7, 0xaf, 0x2a, 0x21, 0x67, 0x61, 0x04, 0x59, 0x6d, 0xc1, 0x55, 0x5c, 0xff, 0xb3, 0xb9, 0x52,
+    0x23, 0x43, 0x44, 0xfc, 0x55, 0xdb, 0xd2, 0xd8, 0x48, 0x80, 0x2b, 0x84, 0x62, 0x13, 0xae, 0x91,
+    0x97, 0xa0, 0xe2, 0x42, 0x7e, 0x4c, 0x74, 0x71, 0x5f, 0x7d, 0x16, 0x4e, 0x2e, 0xbe, 0xc8, 0xb9,
+    0x60, 0x54, 0x3c, 0x10, 0xac, 0xe8, 0x41, 0x94, 0x56, 0x25, 0x7b, 0x1e, 0x33, 0x5c, 0xe6, 0x08,
+    0x8c, 0x57, 0x81, 0x2c, 0xd0, 0x8b, 0x50, 0xc6, 0x62, 0xb7, 0x1f, 0x53, 0xbb, 0xc1, 0x30, 0xcd,
+    0xde, 0xd3, 0x80, 0x47, 0x60, 0xf2, 0xce, 0xfc, 0xdd, 0x05, 0x87, 0x2c, 0x1e, 0x34, 0xea, 0xec,
+    0x13, 0x21, 0xef, 0x1b, 0x70, 0x8f, 0x24, 0xf6, 0x2c, 0x42, 0xdd, 0xc4, 0x94, 0xb8, 0x0b, 0x77,
+    0x74, 0x49, 0x0c, 0x8a, 0x8e, 0x0b, 0x02, 0x4e, 0x01, 0xbc, 0x54, 0xa4, 0x99, 0x8a, 0xd4, 0x6f,
+    0x98, 0xd2, 0x49, 0xd8, 0xf4, 0x2b, 0x3c, 0x0b, 0xda, 0x8e, 0x70, 0x02, 0xbd, 0x43, 0x4f, 0x9c,
+    0x91, 0x43, 0x10, 0x1a, 0x91, 0x69, 0xf2, 0x36, 0xb8, 0xd1, 0x53, 0x09, 0x8c, 0x25, 0x49, 0xb3,
+    0x95, 0xbb, 0xb6, 0x1b, 0xb3, 0xd8, 0x68, 0x91, 0x4f, 0xaa, 0x7e, 0xeb, 0x3b, 0x93, 0xe3, 0xef,
+    0xad, 0x4c, 0xec, 0xbf, 0xee, 0x9f, 0x1b, 0x63, 0x81, 0xab, 0xb8, 0x79, 0x3a, 0xad, 0xff, 0xf4,
+    0x18, 0x13, 0x4d, 0x82, 0x3e, 0x95, 0x65, 0x35, 0x38, 0x22, 0x43, 0xcc, 0x4e, 0x80, 0x71, 0xdc,
+    0x24, 0xc6, 0x76, 0x56, 0x06, 0x23, 0x9a, 0x0f, 0xf3, 0xb3, 0xe3, 0xf5, 0x26, 0x2e, 0xca, 0x62,
+    0xd1, 0x1a, 0x21, 0x4c, 0x3c, 0x4b, 0xa3, 0x95, 0x32, 0x51, 0x1a, 0xe1, 0xfc, 0xf4, 0xdc, 0x6d,
+    0xd3, 0x3e, 0x28, 0x86, 0x1b, 0x1a, 0xce, 0x90, 0x1b, 0xc0, 0x9a, 0xb4, 0x31, 0xe6, 0xe0, 0x31,
+    0x89, 0xb8, 0xba, 0xb7, 0xd8, 0xcd, 0x5d, 0x27, 0x14, 0xc7, 0x4a, 0x0e, 0xb7, 0xdd, 0x98, 0x6d,
+    0xee, 0xee, 0x8a, 0x1b, 0x36, 0x9a, 0x59, 0x08, 0xa7, 0xd0, 0x7a, 0x2a, 0x02, 0x09, 0x9d, 0x25,
+    0x9b, 0x4e, 0x6e, 0x36, 0x71, 0xa1, 0x9a, 0x99, 0x17, 0xe6, 0x56, 0x4f, 0x9a, 0x0b, 0xd8, 0xf4,
+    0x5c, 0x76, 0xfa, 0x9c, 0xd8, 0xc2, 0x3f, 0x36, 0x8a, 0xb9, 0x12, 0x6f, 0xde, 0x7b, 0xd0, 0xf4,
+    0x21, 0x51, 0x68, 0xe2, 0x9a, 0xc1, 0xfb, 0xdd, 0x7f, 0x17, 0x93, 0xc5, 0x6e, 0xe7, 0x2b, 0x31,
+    0xc6, 0x1e, 0xfa, 0x1f, 0xd9, 0x13, 0xca, 0x9d, 0x9f, 0xa3, 0xb6, 0xc0, 0xd7, 0x1d, 0x96, 0xc5,
+    0xab, 0xe0, 0xac, 0x78, 0x4c, 0xc4, 0x11, 0x37, 0xca, 0xe6, 0xe7, 0x1d, 0x46, 0x23, 0xc1, 0x2d,
+    0xfe, 0x2d, 0xe5, 0x2e, 0xac, 0xd0, 0x24, 0xab, 0xb0, 0x95, 0x75, 0x38, 0x93, 0x75, 0xbd, 0x9d,
+    0x7a, 0x12, 0x6b, 0x21, 0xaa, 0x6c, 0x94, 0x26, 0x64, 0x76, 0xa9, 0x6d, 0x2c, 0x3b, 0x0c, 0x4c,
+    0x8e, 0x1d, 0xc1, 0x46, 0x28, 0x67, 0xa7, 0xbe, 0xae, 0xff, 0x7a, 0x33, 0xcf, 0xeb, 0x49, 0xde,
+    0x6f, 0x1b, 0x4b, 0xeb, 0xe4, 0x01, 0xff, 0x51, 0x68, 0x81, 0xd5, 0x0e, 0x93, 0xcc, 0x16, 0x34,
+    0xba, 0x4d, 0xd3, 0xf9, 0x23, 0xe5, 0x24, 0x5a, 0xdb, 0xca, 0xc8, 0xce, 0xb3, 0x8d, 0xe7, 0x4f,
+    0x71, 0xf4, 0xe6, 0x87, 0x97, 0xcd, 0x11, 0xbb, 0x3b, 0x58, 0x1d, 0x53, 0x8c, 0xe5, 0xee, 0xc1,
+    0x2e, 0x00, 0x90, 0xc8, 0xec, 0x7b, 0x0b, 0x8e, 0x04, 0xb3, 0xe0, 0x96, 0x38, 0x77, 0x12, 0x86,
+    0x0f, 0xb7, 0x25, 0x7b, 0xfb, 0x39, 0x6c, 0xdc, 0x20, 0x3b, 0x6e, 0x69, 0x0a, 0xee, 0x70, 0x4c,
+    0xc8, 0xb9, 0x4a, 0x5b, 0x88, 0x43, 0x5c, 0x6f, 0x12, 0x8f, 0xe0, 0x7c, 0x50, 0xc8, 0x40, 0x26,
+    0x7b, 0xf3, 0x47, 0x91, 0xa4, 0x93, 0xff, 0x41, 0x3a, 0x8f, 0x04, 0xbd, 0x3d, 0x68, 0x64, 0x5a,
+    0x88, 0xb6, 0xc1, 0xb7, 0x8c, 0xfd, 0x9e, 0xbf, 0x41, 0x21, 0x03, 0xf5, 0x78, 0x93, 0x6e, 0xd3,
+    0x09, 0x7d, 0x9e, 0x41, 0x13, 0x17, 0xf2, 0x32, 0x7b, 0x1b, 0x7b, 0x81, 0xf2, 0x5d, 0x3d, 0x0c,
+    0x64, 0xea, 0xb4, 0x18, 0xb1, 0xbc, 0x98, 0xa4, 0x66, 0xd1, 0x1f, 0xb1, 0x8f, 0x5a, 0x0b, 0x14,
+    0xb5, 0xa6, 0x53, 0xf6, 0x65, 0x63, 0x43, 0xd8, 0xec, 0x53, 0xb7, 0xe6, 0xa3, 0xd8, 0xfb, 0x77,
+    0xfe, 0x88, 0xbf, 0x1b, 0xf8, 0xfc, 0x6d, 0x44, 0x55, 0x73, 0xee, 0x24, 0xab, 0xe6, 0xcc, 0xe7,
+    0x48, 0xb8, 0x45, 0x35, 0xbf, 0x94, 0x5a, 0x46, 0x65, 0x0e, 0x68, 0x54, 0x52, 0x6f, 0x0f, 0xea,
+    0xf0, 0x31, 0x42, 0xd2, 0xa3, 0x77, 0x57, 0xfc, 0xa8, 0xed, 0xed, 0x4e, 0xd2, 0xca, 0x9c, 0x92,
+    0xc7, 0x53, 0x9e, 0x21, 0x67, 0x3b, 0x83, 0xe9, 0x43, 0x24, 0xe0, 0x8c, 0xfa, 0x5e, 0xfe, 0x7e,
+    0xe6, 0x17, 0x00, 0xbd, 0x41, 0x29, 0x9f, 0x44, 0x64, 0x4d, 0xe8, 0xe1, 0x2f, 0x22, 0x4c, 0x21,
+    0xb1, 0x5b, 0x69, 0xe6, 0x79, 0x7d, 0xf9, 0x62, 0xa0, 0x16, 0xdb, 0xaf, 0xbf, 0x46, 0x37, 0x97,
+    0x49, 0x39, 0x7e, 0xdf, 0x2f, 0xb8, 0xbb, 0x88, 0x4d, 0xc7, 0x87, 0x78, 0x54, 0x1d, 0xac, 0xbb,
+    0xc6, 0x51, 0xdb, 0x80, 0x5d, 0xe7, 0x2c, 0x30, 0x98, 0x01, 0x2f, 0xeb, 0xd9, 0xa7, 0x24, 0x9c,
+    0x64, 0x13, 0x1d, 0xe7, 0x62, 0xa6, 0xb3, 0xb6, 0x9b, 0x7e, 0xa1, 0xc1, 0xed, 0xdc, 0xcf, 0xf1,
+    0x99, 0x02, 0xad, 0xb4, 0x18, 0xac, 0xcb, 0x57, 0x33, 0x9c, 0x7b, 0xcb, 0x18, 0x65, 0x21, 0xbb,
+    0x25, 0xb7, 0x9f, 0xf3, 0x1e, 0x93, 0x00, 0x7c, 0xac, 0x48, 0xa4, 0x64, 0x3b, 0x46, 0xb9, 0xdd,
+    0xe8, 0x02, 0xd6, 0x73, 0xcc, 0xb6, 0x45, 0x80, 0x74, 0x58, 0x73, 0xce, 0x30, 0x48, 0x06, 0xc2,
+    0x70, 0xcf, 0xdf, 0x61, 0x13, 0x14, 0x9e, 0xb3, 0xb9, 0x6d, 0x8e, 0x42, 0x7f, 0x70, 0xa0, 0x1f,
+    0xdf, 0xab, 0xed, 0x40, 0x43, 0x49, 0x26, 0x61, 0x19, 0xac, 0x14, 0x84, 0x7f, 0x0a, 0x84, 0xbf,
+    0xb5, 0x19, 0x1a, 0xaf, 0x66, 0x11, 0xd8, 0x52, 0x59, 0x0c, 0x54, 0x4e, 0xa6, 0xd9, 0x93, 0x0a,
+    0x74, 0x0d, 0xd0, 0x0f, 0xe9, 0x15, 0x95, 0x67, 0x8a, 0x60, 0xc8, 0x13, 0xe0, 0xb8, 0x29, 0xd7,
+    0x63, 0xe4, 0xb6, 0x3d, 0x85, 0x71, 0x06, 0xa6, 0xcd, 0x67, 0xf6, 0xa2, 0x68, 0x60, 0xbb, 0x64,
+    0x01, 0xa5, 0x5d, 0x7d, 0x11, 0xe0, 0xcd, 0x22, 0x7c, 0x5a, 0x5b, 0x2c, 0x94, 0xd8, 0x6e, 0x81,
+    0xfc, 0xc7, 0x00, 0xc2, 0xa3, 0xea, 0x1d, 0x69, 0x62, 0xe6, 0xba, 0xda, 0xa5, 0xcc, 0x4e, 0x52,
+    0xe6, 0x78, 0x51, 0x86, 0xd6, 0x25, 0x2a, 0x79, 0x20, 0xc9, 0x0a, 0xae, 0xe4, 0x18, 0x20, 0xb7,
+    0xe0, 0x43, 0x8d, 0x19, 0xba, 0x1e, 0x95, 0xa4, 0x41, 0x73, 0x52, 0xe4, 0x77, 0xb3, 0x7e, 0x9c,
+    0xee, 0x6b, 0xa6, 0x89, 0x31, 0xec, 0xb3, 0x9a, 0x40, 0x45, 0x7a, 0xd0, 0xbe, 0xea, 0x06, 0x83,
+    0x8f, 0x27, 0xcc, 0x65, 0xf8, 0x62, 0xb0, 0xe3, 0xc5, 0x13, 0xdc, 0xf0, 0x03, 0xbd, 0x79, 0x24,
+    0x66, 0x53, 0xbb, 0x37, 0x6d, 0xe3, 0xe6, 0x18, 0xba, 0x05, 0x3c, 0x85, 0xa3, 0xb6, 0x42, 0xd7,
+    0x4a, 0x50, 0xc8, 0xb9, 0x15, 0x81, 0xf1, 0x01, 0x9e, 0xd5, 0x3d, 0x4b, 0xee, 0x4a, 0x64, 0xd2,
+    0x42, 0x7d, 0xd0, 0x90, 0x87, 0x41, 0xe8, 0xb8, 0x86, 0xa1, 0x31, 0x01, 0xf0, 0xce, 0xd2, 0x9e,
+    0x93, 0xf6, 0x21, 0x42, 0xb9, 0x1a, 0xe6, 0x28, 0x02, 0xf7, 0x52, 0xd4, 0xd2, 0x44, 0x10, 0xfa,
+    0x05, 0xc0, 0xf9, 0xab, 0x5f, 0x99, 0x6d, 0x96, 0xb6, 0xab, 0xdb, 0x1b, 0xa3, 0x27, 0xbe, 0x56,
+    0x1c, 0xff, 0x14, 0x76, 0x16, 0x52, 0xf8, 0xfd, 0xe8, 0x57, 0x5f, 0xb9, 0x7b, 0xd6, 0x0c, 0xa0,
+    0xa0, 0x42, 0xc6, 0xdd, 0xa1, 0x79, 0x2d, 0xcf, 0xa7, 0xdd, 0xe2, 0x23, 0x2f, 0xf5, 0x79, 0x3a,
+    0x6f, 0xc3, 0x10, 0xe9, 0x99, 0xc5, 0x1a, 0x27, 0x08, 0x14, 0xdf, 0xce, 0x16, 0x33, 0xf3, 0x91,
+    0xd4, 0x5f, 0xb7, 0x06, 0x0b, 0x38, 0x5f, 0xb8, 0x3d, 0x81, 0x83, 0x0f, 0x89, 0xf0, 0x72, 0x19,
+    0xf7, 0xb4, 0x28, 0x3a, 0x02, 0x40, 0xc2, 0x48, 0x5f, 0x60, 0x22, 0xca, 0x08, 0xa2, 0x7d, 0x1e,
+    0x8b, 0xa3, 0x60, 0xb2, 0xef, 0xdc, 0xa6, 0x6c, 0xe5, 0x35, 0x72, 0xe2, 0x03, 0x58, 0x1b, 0xa3,
+    0xe8, 0x2e, 0xc1, 0x2c, 0x8b, 0xbe, 0x46, 0x0a, 0x5c, 0xd6, 0xf8, 0x9a, 0x03, 0xa3, 0xca, 0xd4,
+    0x4d, 0x36, 0x47, 0xf2, 0xb9, 0xa6, 0x93, 0xf1, 0xe3, 0x5a, 0x46, 0x4e, 0x83, 0x66, 0x00, 0xf1,
+    0x82, 0xb1, 0x98, 0x64, 0xa7, 0x87, 0x0d, 0x99, 0xaa, 0x90, 0x1a, 0xb0, 0x2e, 0x28, 0x05, 0x52,
+    0x72, 0x1a, 0x82, 0x2c, 0xae, 0x60, 0xad, 0x28, 0x28, 0x53, 0xa2, 0x63, 0x5a, 0x6a, 0x60, 0x6f,
+    0xec, 0x0b, 0x1e, 0x6a, 0xae, 0x75, 0x59, 0x0b, 0x8a, 0x69, 0x63, 0x37, 0xbc, 0x4a, 0xea, 0x95,
+    0x7f, 0xa5, 0x41, 0x2f, 0x5e, 0xa3, 0x1e, 0x23, 0x7d, 0x41, 0xf2, 0xc7, 0x8e, 0xc1, 0x93, 0xe4,
+    0xe9, 0xf0, 0x28, 0x1c, 0x09, 0x37, 0x62, 0x79, 0x01, 0x66, 0x5e, 0x07, 0x80, 0xc6, 0xc5, 0x85,
+    0x63, 0xd5, 0xd9, 0x8e, 0x38, 0x8d, 0x29, 0x0d, 0x75, 0xec, 0x00, 0xa0, 0xa6, 0x58, 0x19, 0x98,
+    0x4a, 0x17, 0xc4, 0xf8, 0x02, 0x6d, 0x15, 0x5f, 0xb0, 0x11, 0x28, 0xbe, 0xec, 0x78, 0x4d, 0x94,
+    0x10, 0x51, 0x1d, 0xa8, 0x47, 0x40, 0xd3, 0x5c, 0xed, 0xa9, 0x33, 0x09, 0x6b, 0x3d, 0xbc, 0x18,
+    0xe6, 0x67, 0x5f, 0x26, 0xee, 0x3a, 0x0e, 0xbe, 0x6f, 0x25, 0xf1, 0x10, 0x73, 0xa6, 0x50, 0x47,
+    0x80, 0xed, 0x45, 0x14, 0xb8, 0xa0, 0xaf, 0x85, 0xb7, 0xa7, 0x1f, 0x66, 0xf1, 0xe0, 0x77, 0x51,
+    0x71, 0x7a, 0xb1, 0x77, 0xb6, 0xcb, 0x9a, 0x39, 0xe4, 0x6e, 0xee, 0x3a, 0x09, 0xa6, 0x14, 0x24,
+    0xc3, 0x28, 0x20, 0xb2, 0x82, 0x86, 0x1c, 0x4b, 0xde, 0x5b, 0xf0, 0x53, 0x11, 0x75, 0x19, 0x3b,
+    0x0d, 0x9a, 0xad, 0xfa, 0x2d, 0xbd, 0x0d, 0x6c, 0x4e, 0xba, 0xd2, 0xc6, 0x2e, 0xee, 0xa9, 0x09,
+    0xe8, 0xa9, 0x69, 0x44, 0x2e, 0x10, 0x30, 0xb6, 0x45, 0x63, 0xe9, 0x7d, 0x21, 0x55, 0x14, 0x51,
+    0x5c, 0xc4, 0x42, 0x67, 0x5a, 0xf7, 0x0e, 0xd4, 0x08, 0xa3, 0xdf, 0x86, 0x9d, 0x16, 0xf0, 0xdc,
+    0xa5, 0x85, 0x0d, 0xc2, 0x98, 0x8e, 0x1d, 0xe4, 0xb5, 0x08, 0x76, 0x9e, 0xe9, 0x76, 0x8e, 0x5c,
+    0xf6, 0x9b, 0x82, 0xd1, 0xd4, 0x11, 0x46, 0x70, 0x7e, 0xe3, 0x48, 0x73, 0x0e, 0xea, 0xd3, 0x23,
+    0xf4, 0x1a, 0x7a, 0x2b, 0xbc, 0xd1, 0x1c, 0x8a, 0xdd, 0xc7, 0xa6, 0xc4, 0xc3, 0x35, 0x69, 0x75,
+    0x4c, 0xe8, 0x21, 0xfe, 0x74, 0xb6, 0x24, 0xbc, 0x00, 0xfa, 0x0b, 0x66, 0x8a, 0xb2, 0x48, 0x56,
+    0x6b, 0xd6, 0x14, 0x73, 0x3a, 0x0b, 0x78, 0x3c, 0x10, 0xc1, 0xe5, 0x51, 0xc7, 0x44, 0x73, 0x72,
+    0x71, 0x23, 0x89, 0x17, 0x59, 0x3c, 0x6a, 0x5b, 0x83, 0x28, 0xde, 0x19, 0xa5, 0x8d, 0x6b, 0x67,
+    0x13, 0x9f, 0x97, 0x41, 0xd6, 0x61, 0xbb, 0x66, 0x85, 0xdd, 0xd8, 0xc1, 0xbc, 0x37, 0xeb, 0x9d,
+    0xc1, 0xd6, 0x82, 0x13, 0xfe, 0x10, 0x69, 0x36, 0x97, 0xab, 0xd0, 0xef, 0x3e, 0x2b, 0x0a, 0x60,
+    0x9a, 0x03, 0x81, 0x89, 0x52, 0x6a, 0xab, 0x28, 0x6d, 0xaf, 0x11, 0xc0, 0x87, 0xf1, 0x1d, 0x94,
+    0x0e, 0x93, 0x22, 0x44, 0xc5, 0xd8, 0x2c, 0x40, 0x88, 0x0e, 0xe8, 0x64, 0x05, 0x5d, 0xb1, 0xdb,
+    0x2b, 0x55, 0x7d, 0x6f, 0x7a, 0x1c, 0x7d, 0x1e, 0x19, 0x65, 0x2d, 0x87, 0x09, 0xfe, 0xa9, 0x14,
+    0x86, 0x8b, 0xfb, 0x03, 0xfb, 0x52, 0x3d, 0x79, 0x21, 0x2b, 0xba, 0xda, 0x1c, 0xaf, 0x41, 0xdf,
+    0x21, 0xcf, 0x35, 0x4f, 0xb4, 0x2b, 0x8a, 0xe1, 0x8e, 0x67, 0x76, 0x44, 0x05, 0xf5, 0x4f, 0xc4,
+    0xd5, 0x52, 0xa6, 0x85, 0xba, 0xe2, 0x95, 0xc1, 0xf2, 0x8b, 0x5b, 0x0e, 0x30, 0x10, 0x74, 0x71,
+    0x6c, 0x2c, 0xec, 0xa4, 0xc6, 0x72, 0xb9, 0xed, 0x86, 0x4e, 0x3f, 0x89, 0x89, 0x52, 0x98, 0xb3,
+    0xbd, 0xe0, 0x1e, 0x91, 0xc2, 0x29, 0x2f, 0x54, 0xc1, 0xea, 0x60, 0xe4, 0x3b, 0xda, 0x07, 0x17,
+    0xc5, 0xf8, 0x3a, 0x64, 0xcd, 0x2a, 0x50, 0x44, 0x0c, 0x38, 0x19, 0x3b, 0xda, 0x18, 0xc3, 0xc2,
+    0x55, 0x60, 0xa0, 0x5d, 0x02, 0xbe, 0xaa, 0x33, 0x76, 0x99, 0xb3, 0x8b, 0x1a, 0xb0, 0x7a, 0xe4,
+    0x6c, 0xea, 0x38, 0x9c, 0xa4, 0x5b, 0x69, 0x5d, 0x8d, 0xa8, 0x73, 0xad, 0x3a, 0x03, 0x0c, 0xc1,
+    0x3e, 0xab, 0xbf, 0xa2, 0xbc, 0x36, 0x54, 0xf2, 0x8b, 0xa1, 0xa8, 0x65, 0x70, 0x54, 0x5f, 0x23,
+    0x5a, 0xd2, 0x6e, 0x4d, 0x0a, 0xfc, 0x59, 0xd1, 0xe9, 0x0d, 0xcd, 0x90, 0xe3, 0xef, 0xe8, 0xf6,
+    0x9f, 0x51, 0x4c, 0x93, 0xca, 0xc1, 0x0a, 0x12, 0x41, 0xaf, 0x93, 0x0b, 0xbd, 0x93, 0xb2, 0xd3,
+    0xec, 0x5d, 0x1d, 0xad, 0x28, 0x1c, 0xff, 0x1d, 0xcc, 0x70, 0x5d, 0x4f, 0x6e, 0xbb, 0x0a, 0xc0,
+    0xd6, 0x5b, 0xa3, 0x93, 0x17, 0x79, 0x40, 0x8f, 0xaa, 0xfa, 0xea, 0x3d, 0x6f, 0x62, 0xa2, 0xcb,
+    0xdc, 0x85, 0x7a, 0x69, 0xe6, 0xed, 0xa1, 0xba, 0x52, 0x53, 0x8c, 0xf4, 0x3f, 0x67, 0x17, 0x7e,
+    0x83, 0xf4, 0xf4, 0xaf, 0xe9, 0x5a, 0x92, 0xbf, 0x96, 0x4f, 0xee, 0xad, 0x3c, 0xc1, 0x18, 0x08,
+    0x2c, 0xa9, 0xf4, 0x23, 0x14, 0x15, 0x00, 0x05, 0xaa, 0xed, 0x28, 0x49, 0x0c, 0x4d, 0x94, 0xa5,
+    0x6c, 0xa1, 0x31, 0x88, 0x38, 0x34, 0x64, 0xd2, 0x92, 0x60, 0xca, 0x75, 0x62, 0x09, 0xe3, 0x5c,
+    0xe4, 0x75, 0xeb, 0xab, 0xbc, 0x42, 0x9d, 0x6c, 0xd5, 0xf3, 0xca, 0x66, 0x7f, 0xfe, 0x1c, 0x0f,
+    0xc6, 0xb0, 0xd4, 0x75, 0xf7, 0x4a, 0x05, 0x0b, 0xa4, 0xfc, 0xc0, 0x70, 0xa4, 0x06, 0x2a, 0x55,
+    0x61, 0xc6, 0xbd, 0xb8, 0x23, 0x60, 0xbe, 0xc7, 0x1a, 0x73, 0x3f, 0x2a, 0x1a, 0x50, 0xbb, 0x40,
+    0x58, 0x7e, 0x2f, 0xfa, 0xe9, 0x59, 0x9b, 0x85, 0xf4, 0xf6, 0xa3, 0x87, 0x0a, 0xae, 0x08, 0x58,
+    0x98, 0xea, 0x4a, 0x80, 0x4f, 0x18, 0x6c, 0x71, 0x84, 0x3b, 0x45, 0xa7, 0xb6, 0x8b, 0x4d, 0x18,
+    0x52, 0x28, 0xb3, 0x11, 0x0f, 0x82, 0xd7, 0x62, 0xa2, 0x53, 0xef, 0x77, 0x5d, 0xf6, 0x52, 0x1e,
+    0xb1, 0xe7, 0x77, 0xf9, 0x12, 0xfc, 0x35, 0xca, 0xce, 0x7a, 0xd7, 0x4a, 0x9d, 0x7c, 0x7c, 0xe6,
+    0xa9, 0xa0, 0x4c, 0x09, 0xb7, 0x49, 0x82, 0x87, 0xfb, 0x33, 0x7c, 0x51, 0x13, 0xd0, 0xf9, 0xdd,
+    0x36, 0xa4, 0x6a, 0x56, 0xfc, 0x60, 0xa6, 0x01, 0x26, 0x6c, 0x27, 0x0d, 0xa9, 0x7d, 0xfe, 0x49,
+    0x5d, 0xcf, 0xb0, 0xbe, 0xdf, 0x4b, 0xed, 0x83, 0x28, 0x3f, 0x0a, 0xdb, 0xf5, 0x6a, 0x34, 0x3d,
+    0x97, 0xa5, 0x10, 0x21, 0xc7, 0x8b, 0x92, 0x5d, 0x1b, 0x41, 0x0b, 0xa2, 0x21, 0xff, 0xf6, 0x2c,
+    0x53, 0xb1, 0x9d, 0x47, 0x0b, 0xab, 0x7f, 0xf2, 0xc9, 0x52, 0x08, 0xce, 0x74, 0x73, 0x07, 0x3b,
+    0x3d, 0x69, 0xbd, 0xc8, 0xcc, 0xf6, 0x7b, 0xe0, 0x94, 0xcf, 0x83, 0x4e, 0x0e, 0x07, 0x63, 0xd4,
+    0xa9, 0xce, 0xf4, 0xc4, 0x34, 0x93, 0x8b, 0xed, 0x88, 0x38, 0x3d, 0x82, 0xc6, 0xa2, 0x42, 0x1e,
+    0x18, 0x04, 0xf8, 0x91, 0x5b, 0x1b, 0x10, 0x1a, 0x7e, 0x3c, 0xd4, 0xdd, 0x63, 0x98, 0x88, 0xd4,
+    0x56, 0xda, 0x84, 0x5f, 0x29, 0x09, 0xd1, 0x2e, 0x8a, 0x11, 0xc6, 0x9b, 0x3c, 0x39, 0xe9, 0x3a,
+    0x1f, 0xfd, 0xb4, 0x09, 0x70, 0xe3, 0x37, 0xee, 0x7a, 0xa9, 0x1d, 0x20, 0x3a, 0x5f, 0xd8, 0xd8,
+    0xc8, 0xd6, 0x3e, 0xa2, 0xb9, 0x25, 0x1d, 0x3b, 0x72, 0x85, 0x6c, 0x77, 0x43, 0x4d, 0x94, 0x95,
+    0xfb, 0x2a, 0x51, 0xbd, 0xce, 0x28, 0x10, 0x9d, 0x7f, 0x48, 0xe4, 0xb1, 0x56, 0x7e, 0xaf, 0xb1,
+    0xa7, 0x8f, 0x20, 0x70, 0x4f, 0x21, 0xdb, 0x76, 0x12, 0xe1, 0x33, 0x96, 0x8f, 0x69, 0xb8, 0x00,
+    0x17, 0x07, 0xed, 0x2d, 0x30, 0x65, 0xda, 0xab, 0x2f, 0xf7, 0x65, 0x26, 0x99, 0xd9, 0x3d, 0x23,
+    0x19, 0x44, 0x9b, 0x18, 0x39, 0xbc, 0x58, 0x4e, 0xfe, 0x2e, 0x3e, 0xa6, 0x33, 0x7e, 0x87, 0xd6,
+    0xae, 0xa6, 0x66, 0x45, 0x2a, 0xed, 0x2d, 0xd5, 0xa8, 0x71, 0xc1, 0xfb, 0xb9, 0x09, 0xf4, 0x66,
+    0x95, 0x57, 0x8c, 0x90, 0x20, 0xad, 0x7d, 0x31, 0x02, 0x77, 0xce, 0x76, 0xc1, 0xf7, 0x18, 0xcb,
+    0xa3, 0x92, 0x4c, 0xe0, 0xf9, 0x47, 0x55, 0x62, 0xd3, 0xeb, 0x57, 0xbf, 0xe3, 0x39, 0x14, 0xaf,
+    0xb0, 0x41, 0x77, 0x7b, 0x48, 0x24, 0x13, 0x51, 0x4f, 0x96, 0x26, 0x99, 0xe2, 0x0c, 0x36, 0xa8,
+    0xc0, 0xe9, 0x0f, 0x17, 0x8b, 0xab, 0x88, 0x32, 0xcf, 0xae, 0x50, 0xef, 0x5f, 0xdd, 0x4f, 0xd5,
+    0xe8, 0xcb, 0xd2, 0xae, 0x1a, 0x56, 0x37, 0xd8, 0x32, 0xd3, 0x4c, 0x81, 0xac, 0x4a, 0x1c, 0x4a,
+    0xbc, 0xc5, 0xbd, 0xf8, 0x26, 0x66, 0x59, 0x46, 0x14, 0x53, 0x09, 0x04, 0x32, 0x73, 0x38, 0x11,
+    0x89, 0x8b, 0x60, 0xc1, 0x7c, 0xa7, 0x91, 0x73, 0x90, 0x60, 0x07, 0xff, 0x5f, 0xc0, 0xb9, 0xfb,
+    0x1b, 0x51, 0x9a, 0x6c, 0xfa, 0xae, 0x70, 0xed, 0xa5, 0xd5, 0xd3, 0x02, 0x7d, 0xf4, 0x76, 0xe8,
+    0x68, 0x1e, 0x53, 0x99, 0xef, 0xbc, 0x82, 0x6b, 0xdd, 0x26, 0x49, 0xf8, 0x66, 0x39, 0xf0, 0x53,
+    0xe8, 0x92, 0xad, 0xb8, 0x3a, 0x73, 0x8e, 0x9c, 0x3f, 0x5f, 0x50, 0xdc, 0xb1, 0x3e, 0xad, 0x4a,
+    0x8f, 0x51, 0x40, 0xfa, 0x64, 0x38, 0x6f, 0x17, 0x0d, 0xae, 0xcd, 0xc8, 0xbd, 0x0f, 0x8f, 0x3c,
+    0x8d, 0x29, 0xe6, 0x7a, 0x5f, 0x90, 0x1c, 0xd0, 0x74, 0x43, 0x3b, 0x3a, 0x28, 0x72, 0x4d, 0x22,
+    0xae, 0x9d, 0x32, 0x09, 0x42, 0xb9, 0x06, 0xf4, 0x83, 0x92, 0xc5, 0x8b, 0x43, 0x60, 0x42, 0x16,
+    0x49, 0x74, 0xc5, 0x2c, 0x26, 0xf4, 0x98, 0x8e, 0x79, 0x6b, 0x80, 0x22, 0xe8, 0xf3, 0x92, 0x50,
+    0x4d, 0x27, 0x94, 0xc7, 0x96, 0xd9, 0xec, 0xb0, 0x08, 0xd2, 0x16, 0x97, 0x7f, 0xd6, 0x4e, 0x73,
+    0x23, 0xe9, 0xb7, 0xf5, 0x96, 0xf4, 0xab, 0x16, 0x59, 0x67, 0x8b, 0x63, 0x3f, 0x68, 0xe9, 0x90,
+    0x0d, 0x3b, 0x53, 0x87, 0xcf, 0x85, 0x95, 0x3a, 0xd1, 0x0c, 0xd6, 0x83, 0xc8, 0xf3, 0x30, 0x06,
+    0x3a, 0x52, 0xd6, 0xab, 0xdd, 0xfa, 0x83, 0x66, 0x07, 0x3e, 0xe0, 0xf5, 0x05, 0x41, 0x69, 0x15,
+    0x24, 0x35, 0xe1, 0x68, 0x1f, 0x77, 0x63, 0x48, 0xce, 0x00, 0x0c, 0xbb, 0xa8, 0x03, 0x02, 0xda,
+    0xb4, 0xbf, 0x70, 0x0d, 0xee, 0x64, 0x31, 0x41, 0xa7, 0x5d, 0xe6, 0x06, 0xc0, 0x2d, 0x03, 0x0f,
+    0xab, 0x17, 0xb3, 0x7a, 0x22, 0x2d, 0x58, 0xd8, 0x86, 0x1b, 0xdc, 0x3d, 0x6e, 0x6d, 0xd5, 0x51,
+    0x04, 0x4f, 0x85, 0xd0, 0x60, 0x33, 0xce, 0x43, 0x35, 0x5e, 0x47, 0x2c, 0x8e, 0x48, 0x36, 0x5f,
+    0x55, 0xb0, 0x4a, 0x88, 0xd0, 0x23, 0x7a, 0x4e, 0x9c, 0x15, 0xc0, 0x9e, 0x08, 0xa6, 0x37, 0x42,
+    0x38, 0x89, 0xc4, 0x41, 0x87, 0x0c, 0x45, 0x68, 0xd7, 0xf2, 0xac, 0xc0, 0xf2, 0x9f, 0xb4, 0x12,
+    0x64, 0xd6, 0xc7, 0x4e, 0x11, 0x25, 0xbb, 0x28, 0xce, 0xb9, 0x84, 0x0e, 0xff, 0x87, 0x79, 0xb3,
+    0x23, 0x6c, 0xd0, 0x73, 0x9e, 0xdb, 0x34, 0xd9, 0xff, 0x88, 0x51, 0xec, 0x02, 0x6b, 0x1c, 0xe7,
+    0x5a, 0x64, 0xe2, 0x99, 0x9c, 0x56, 0x91, 0x99, 0xca, 0xe5, 0x33, 0x6d, 0x1d, 0xd1, 0x6f, 0x63,
+    0x57, 0x49, 0x25, 0xb2, 0x94, 0xcd, 0x6d, 0xd8, 0x47, 0xbb, 0xf4, 0x23, 0xc6, 0x1c, 0x96, 0xb9,
+    0x2e, 0x3f, 0xbc, 0x37, 0xad, 0x5e, 0xf1, 0x39, 0xf2, 0xce, 0xe0, 0xbf, 0x64, 0xe7, 0xb5, 0x43,
+    0xc3, 0x49, 0x71, 0xa4, 0x4c, 0xa8, 0x76, 0xd6, 0x28, 0x68, 0xd2, 0x17, 0xbe, 0x0e, 0xfd, 0x82,
+    0xf5, 0x6b, 0xde, 0xab, 0x2f, 0x0a, 0x2b, 0xf8, 0xb8, 0xdf, 0xe9, 0x66, 0x2a, 0xa0, 0x3a, 0x1f,
+    0x41, 0x71, 0xe1, 0x9b, 0x04, 0xd8, 0x1a, 0x66, 0xac, 0x0a, 0x03, 0x2f, 0x9f, 0x8b, 0x23, 0x1f,
+    0xf0, 0xe9, 0x0c, 0xa3, 0x15, 0xdf, 0x32, 0xec, 0x52, 0x04, 0x5b, 0x70, 0xbf, 0xf3, 0x90, 0x3e,
+    0x68, 0xf5, 0x94, 0x8b, 0xd9, 0x7b, 0xe3, 0xbb, 0x70, 0x7f, 0x7b, 0xf5, 0x92, 0x05, 0x97, 0x5c,
+    0x65, 0xf8, 0x32, 0xc7, 0x36, 0xf1, 0x5b, 0xce, 0xc6, 0x58, 0x5b, 0x2d, 0x06, 0x16, 0x18, 0xa4,
+    0xf8, 0x72, 0x02, 0xef, 0xb3, 0x3a, 0x2e, 0x9b, 0xaa, 0x33, 0x37, 0xb4, 0xc1, 0x2a, 0x2b, 0x05,
+    0x63, 0x98, 0xbd, 0x46, 0x97, 0xf2, 0xb3, 0xf7, 0xe2, 0xef, 0xe4, 0x6b, 0xa8, 0xfd, 0xb6, 0x90,
+    0x38, 0xe7, 0x10, 0x2a, 0x04, 0xb0, 0x56, 0x4d, 0x55, 0x49, 0xe8, 0x23, 0xb9, 0x80, 0xb0, 0x37,
+    0xa5, 0x07, 0xc1, 0x8f, 0x86, 0x47, 0x13, 0x7d, 0x79, 0x4d, 0xc2, 0x1e, 0x0e, 0xe4, 0xb6, 0x8f,
+    0xcf, 0x0c, 0xd3, 0xea, 0x9b, 0xa9, 0x22, 0x5f, 0xa4, 0x53, 0xba, 0x80, 0xf9, 0x8b, 0xaf, 0x73,
+    0xa6, 0xad, 0xd6, 0x3a, 0xdd, 0xe9, 0x6a, 0xed, 0xbd, 0x53, 0x2b, 0x54, 0x78, 0xee, 0xcc, 0xea,
+    0xdb, 0xde, 0xf3, 0x10, 0xc3, 0xeb, 0x8f, 0xf0, 0xba, 0xb6, 0x69, 0x41, 0x2f, 0xe5, 0x3c, 0xc5,
+    0x11, 0xc8, 0x64, 0x12, 0x51, 0xe2, 0x35, 0x6a, 0x8d, 0x47, 0xe2, 0xe5, 0xe8, 0xc0, 0x4e, 0x0d,
+    0x84, 0x62, 0x0c, 0x01, 0xfc, 0x86, 0xfa, 0xb6, 0xe5, 0xb5, 0x3e, 0xc0, 0x5b, 0x4e, 0xbe, 0xf7,
+    0xd1, 0x0c, 0x0b, 0xec, 0x83, 0xa3, 0xb6, 0xf8, 0x15, 0x6f, 0x78, 0x83, 0x52, 0xe8, 0x05, 0x49,
+    0xf5, 0x8a, 0xe8, 0x07, 0x51, 0x58, 0x24, 0x9f, 0xcc, 0x58, 0x78, 0x8d, 0xcf, 0x9f, 0x52, 0xe7,
+    0x29, 0xde, 0xdd, 0x4e, 0xb7, 0xfd, 0xf7, 0xc2, 0x76, 0x80, 0xa4, 0xf4, 0xcc, 0xa5, 0x5b, 0x2e,
+    0x14, 0x9d, 0xe5, 0x31, 0xdd, 0x7a, 0x01, 0xa5, 0x98, 0x71, 0x19, 0xb4, 0x05, 0xf0, 0xdb, 0x64,
+    0x8f, 0xf3, 0x5e, 0x76, 0x4a, 0xab, 0x58, 0x7e, 0x94, 0x39, 0xe9, 0x27, 0xd6, 0xf8, 0x0f, 0x91,
+    0xa7, 0x45, 0x06, 0x7e, 0x34, 0x29, 0x74, 0x95, 0x66, 0x9f, 0x1a, 0x32, 0xd2, 0x23, 0x8b, 0x0e,
+    0x61, 0x92, 0xfe, 0x45, 0x88, 0x69, 0x54, 0x89, 0x37, 0x89, 0xe7, 0x24, 0xe6, 0x91, 0xb9, 0x44,
+    0xaa, 0x96, 0x8e, 0x23, 0x52, 0x1f, 0x07, 0x7a, 0xfd, 0xb5, 0x1f, 0xa0, 0x39, 0xcb, 0x4b, 0x09,
+    0x54, 0x92, 0xe3, 0x7c, 0x41, 0x20, 0x34, 0xd2, 0x89, 0xeb, 0x4f, 0x6e, 0xcd, 0xc4, 0xc9, 0x62,
+    0x93, 0xd7, 0x1c, 0x22, 0x69, 0xd8, 0xa2, 0xb4, 0x5c, 0x22, 0x83, 0x60, 0x63, 0xab, 0xc2, 0xc6,
+    0xf8, 0xe3, 0x56, 0x57, 0x44, 0x8f, 0x5e, 0x86, 0x13, 0x65, 0xa2, 0x92, 0xb5, 0xab, 0x99, 0x14,
+    0x08, 0xa4, 0x63, 0xd1, 0x99, 0xac, 0xb2, 0x96, 0x4b, 0xb9, 0x57, 0xdd, 0xa8, 0x00, 0x4e, 0xf7,
+    0x40, 0x91, 0x78, 0x6b, 0xf7, 0x37, 0x48, 0x2a, 0x97, 0x3a, 0x5b, 0x18, 0x87, 0x0d, 0xc3, 0x59,
+    0x69, 0xef, 0xcf, 0xc9, 0x5d, 0x6a, 0x1b, 0x59, 0xb0, 0x17, 0x44, 0x85, 0x4a, 0x0b, 0x4a, 0x54,
+    0x4f, 0x70, 0xbb, 0x01, 0x3d, 0x62, 0xa2, 0x38, 0x19, 0x47, 0x9d, 0x3c, 0x63, 0xfc, 0xe5, 0x81,
+    0x0f, 0xc2, 0xf9, 0xa0, 0x7f, 0xc6, 0xfa, 0x8c, 0xea, 0x44, 0xbb, 0x22, 0xda, 0xcc, 0x22, 0x36,
+    0x32, 0x8e, 0x97, 0xee, 0x16, 0x34, 0xf6, 0xf5, 0x3f, 0xaf, 0xf2, 0x1e, 0x93, 0xa2, 0xa1, 0xfc,
+    0xa8, 0x60, 0x1d, 0xb6, 0x03, 0x02, 0x1d, 0x66, 0x2e, 0x70, 0xcc, 0x9e, 0xfc, 0xec, 0x84, 0x6c,
+    0x2a, 0xe0, 0x84, 0x18, 0xc3, 0x0f, 0x14, 0x5c, 0x52, 0xc4, 0x8d, 0xec, 0x28, 0x61, 0xa4, 0xfc,
+    0x09, 0x20, 0x30, 0xd4, 0xc6, 0xca, 0xe0, 0x5d, 0x0c, 0xdb, 0xd7, 0xae, 0x9e, 0x2c, 0x36, 0xb6,
+    0x57, 0xbb, 0xa3, 0xe0, 0x7e, 0xc0, 0xb3, 0xe1, 0x06, 0x13, 0x5f, 0xba, 0x9d, 0x3c, 0x86, 0x08,
+    0x32, 0x5c, 0xc6, 0xe7, 0xb9, 0x85, 0x0c, 0x7b, 0xf4, 0x81, 0x2d, 0x48, 0x6c, 0x9a, 0x11, 0xb2,
+    0x5b, 0xbf, 0x13, 0x5e, 0xb0, 0x65, 0x87, 0xca, 0x5e, 0x79, 0xb5, 0xde, 0x17, 0xfa, 0xb8, 0x3c,
+    0xb3, 0xb8, 0xfa, 0x75, 0x32, 0xd9, 0x82, 0xc8, 0xd2, 0xaf, 0x28, 0x63, 0xff, 0x44, 0xed, 0x58,
+    0x85, 0x28, 0x83, 0x72, 0xf1, 0x9d, 0x17, 0x81, 0x60, 0x58, 0xf0, 0xef, 0x76, 0x56, 0x08, 0x73,
+    0x40, 0x2b, 0xa0, 0x2a, 0xbd, 0x51, 0xe3, 0x58, 0x05, 0xe9, 0x50, 0x3c, 0x3a, 0xeb, 0x0f, 0x75,
+    0x7a, 0xb4, 0xe5, 0x52, 0xea, 0xcb, 0x97, 0xf1, 0xfb, 0x1c, 0x1a, 0x31, 0xc3, 0x36, 0x56, 0x91,
+    0xdf, 0xb4, 0xa5, 0x9e, 0x91, 0x3e, 0xcc, 0x94, 0x2a, 0x43, 0xa6, 0x20, 0xc4, 0x81, 0x6d, 0xff,
+    0x5e, 0x39, 0x6a, 0xa7, 0x31, 0xf3, 0x1d, 0xe7, 0xbd, 0x38, 0xd4, 0xef, 0x07, 0x35, 0x29, 0x9f,
+    0xa0, 0x51, 0xe6, 0x61, 0x78, 0x3e, 0x0e, 0x3f, 0xad, 0x55, 0xa2, 0xe7, 0x93, 0xf7, 0x56, 0x36,
+    0x73, 0x18, 0x2c, 0x51, 0x13, 0x8d, 0x19, 0x68, 0x81, 0x8a, 0x88, 0x15, 0xb5, 0xa2, 0x97, 0x0f,
+    0x07, 0xe5, 0x47, 0xe5, 0x77, 0x0b, 0xed, 0x25, 0x85, 0x1f, 0x90, 0x81, 0x31, 0x7a, 0x39, 0xb5,
+    0xd4, 0xc3, 0x92, 0x46, 0xba, 0x93, 0x1d, 0x97, 0x99, 0x4a, 0x8d, 0x8b, 0x45, 0x5e, 0x9c, 0xb7,
+    0x68, 0x98, 0x06, 0x59, 0x57, 0x36, 0x67, 0xcd, 0xbd, 0xee, 0x92, 0x22, 0x2b, 0x48, 0xbe, 0x80,
+    0xfb, 0x8d, 0x00, 0xd8, 0xb7, 0xda, 0x8a, 0x6d, 0x62, 0xac, 0xe4, 0xa0, 0x9b, 0x80, 0x26, 0x19,
+    0x91, 0x85, 0x00, 0x00, 0x83, 0x58, 0xc1, 0xd8, 0x7f, 0x62, 0x5b, 0x1f, 0x30, 0xe8, 0x83, 0xd6,
+    0xa8, 0x3a, 0xfb, 0x20, 0x8f, 0xac, 0x41, 0xdf, 0x43, 0x4b, 0xfb, 0x7d, 0xb6, 0x53, 0x62, 0x72,
+    0xc9, 0x91, 0xe5, 0x0e, 0x5e, 0xc0, 0xf8, 0xc5, 0x08, 0xce, 0xa9, 0x43, 0xc4, 0xb8, 0x47, 0x72,
+    0xb3, 0x32, 0x60, 0x24, 0x2e, 0xe5, 0x8b, 0xbf, 0xc1, 0x2b, 0x8b, 0x78, 0x7b, 0x97, 0xb7, 0xb2,
+    0xa7, 0xec, 0x66, 0xca, 0x7e, 0x8e, 0x5d, 0xa3, 0x8c, 0x21, 0xc1, 0x04, 0x5a, 0x3c, 0xe1, 0x4b,
+    0xb5, 0xf9, 0xcb, 0xc5, 0x8a, 0xa8, 0xac, 0x46, 0xa2, 0x97, 0xe5, 0x0b, 0x5e, 0x91, 0xe6, 0x6c,
+    0xff, 0xaa, 0x7e, 0xcd, 0x44, 0xe5, 0xf7, 0x04, 0x67, 0x43, 0x91, 0x37, 0x00, 0x85, 0xc2, 0xa2,
+    0xa7, 0xb7, 0x7e, 0x91, 0x61, 0xb5, 0x87, 0xe1, 0xcc, 0xab, 0x0f, 0xc4, 0x91, 0x0d, 0x3a, 0xb5,
+    0x4e, 0xf0, 0x7e, 0x6d, 0x1c, 0xe3, 0x6a, 0x79, 0xd1, 0xe8, 0x0b, 0xc4, 0x2d, 0xe0, 0x9f, 0xbd,
+    0xde, 0x20, 0x02, 0x0d, 0x25, 0xcc, 0x3f, 0x5b, 0xe7, 0xc4, 0xb8, 0x51, 0xde, 0x89, 0x7d, 0x1e,
+    0x33, 0x13, 0x5e, 0x76, 0x7f, 0x9d, 0x73, 0x97, 0x0a, 0x85, 0xd6, 0xc2, 0xac, 0xc2, 0xef, 0x3e,
+    0x67, 0x23, 0x61, 0x46, 0xe8, 0xab, 0x9f, 0xa4, 0x60, 0x27, 0x89, 0x69, 0xa3, 0x8b, 0x56, 0xad,
+    0x4d, 0x09, 0x09, 0xea, 0x3c, 0xa6, 0xe9, 0xb4, 0xd8, 0x0c, 0x05, 0x50, 0x5d, 0x3a, 0x77, 0x90,
+    0x61, 0x7d, 0xd9, 0x14, 0xb4, 0x94, 0x93, 0x1f, 0xfc, 0x0d, 0x21, 0x58, 0x5e, 0x78, 0x03, 0x95,
+    0xa3, 0xe6, 0x61, 0xee, 0x6c, 0xd9, 0xed, 0x8b, 0x9f, 0x47, 0xae, 0xf6, 0x07, 0x7d, 0x89, 0x69,
+    0x61, 0xa2, 0x19, 0xb4, 0x2f, 0x60, 0xf2, 0x8e, 0x0e, 0xbb, 0x64, 0x84, 0x59, 0x1c, 0x8a, 0x25,
+    0x01, 0x31, 0xfa, 0x29, 0xf0, 0x95, 0xaf, 0xc1, 0x3a, 0x8a, 0x9b, 0x63, 0x9c, 0xe3, 0x6b, 0x75,
+    0x8a, 0x79, 0xd2, 0xd2, 0xf5, 0x25, 0x18, 0x08, 0x17, 0x09, 0xa6, 0x46, 0x56, 0x5a, 0xe9, 0xcb,
+    0xb5, 0xa3, 0x9c, 0xc4, 0x7e, 0x23, 0xf7, 0x3a, 0x43, 0xa8, 0x90, 0x48, 0x8a, 0x5d, 0x55, 0x08,
+    0x86, 0x90, 0x13, 0x73, 0x37, 0x51, 0xa4, 0xac, 0xb4, 0x38, 0xff, 0xaf, 0x5f, 0x61, 0x6b, 0x2d,
+    0xb3, 0xe9, 0x88, 0x73, 0x7a, 0xc3, 0x5e, 0x9e, 0x7c, 0x35, 0x83, 0xf8, 0x83, 0xb3, 0xbd, 0x10,
+    0x85, 0x63, 0x8d, 0x6e, 0xf7, 0x23, 0xc4, 0x4a, 0x08, 0x3a, 0x95, 0x42, 0xbc, 0x3d, 0x21, 0xc1,
+    0x4e, 0xcc, 0x51, 0xe7, 0x82, 0x20, 0x48, 0x69, 0x6f, 0x95, 0x74, 0x45, 0x3b, 0x36, 0x7d, 0xef,
+    0x4d, 0xa4, 0x94, 0x24, 0xa8, 0x92, 0x43, 0x5f, 0x9b, 0xa6, 0x04, 0x2d, 0x72, 0x95, 0x2b, 0x06,
+    0x11, 0x22, 0x2c, 0x59, 0x38, 0x5c, 0x7f, 0xc1, 0x07, 0xc8, 0xcf, 0x0f, 0x00, 0xae, 0x59, 0xad,
+    0xf5, 0xbe, 0x1a, 0x23, 0x79, 0xfb, 0xbb, 0x32, 0x0c, 0x9c, 0x5d, 0xb0, 0xc1, 0x76, 0x84, 0x99,
+    0x69, 0xf2, 0x2a, 0xf4, 0xb4, 0x49, 0x38, 0x14, 0x9f, 0x05, 0x10, 0xba, 0xd8, 0x3c, 0xc1, 0x6f,
+    0x3a, 0x17, 0x59, 0xf0, 0x47, 0xf7, 0x10, 0xb8, 0x1a, 0x31, 0x6a, 0x6c, 0xa5, 0x07, 0x5c, 0x1b,
+    0x34, 0x5f, 0xcc, 0x5f, 0xa1, 0x66, 0x68, 0x43, 0x8f, 0x82, 0xfc, 0xf0, 0x60, 0xa5, 0xa9, 0xc3,
+    0xef, 0xe6, 0x7b, 0x3e, 0x30, 0xb6, 0x48, 0xd1, 0x4d, 0xa9, 0x09, 0xcd, 0xc5, 0x70, 0x0c, 0x07,
+    0xe7, 0x37, 0x32, 0x8f, 0xff, 0x34, 0xa3, 0xea, 0x8f, 0xcb, 0x88, 0xa4, 0xe8, 0xf0, 0xb8, 0x2c,
+    0xc2, 0x0a, 0x00, 0x1b, 0x9d, 0x62, 0x5e, 0xd5, 0x07, 0x84, 0x72, 0x7d, 0x93, 0x11, 0x03, 0x27,
+    0xae, 0x46, 0x39, 0xf8, 0xdd, 0x58, 0x49, 0xaa, 0x5d, 0x84, 0x09, 0x84, 0xc3, 0x65, 0x53, 0xbf,
+    0x3f, 0xa5, 0xae, 0xe3, 0x75, 0xd2, 0xe5, 0xd1, 0xb0, 0xf6, 0xbc, 0x85, 0xac, 0xa4, 0x21, 0x61,
+    0xfb, 0x6d, 0xc0, 0x73, 0x17, 0xe5, 0x79, 0xc4, 0x45, 0xf7, 0xfc, 0x35, 0x73, 0xf8, 0x62, 0xa8,
+    0xd1, 0x2f, 0x4d, 0x71, 0xfc, 0x7c, 0x2c, 0x60, 0xb0, 0x2d, 0x47, 0x6d, 0x54, 0x26, 0x9a, 0xc7,
+    0x68, 0xc0, 0xf4, 0x8b, 0xb7, 0x4b, 0x06, 0xaf, 0x5e, 0xc6, 0x0f, 0x45, 0xa8, 0x3b, 0x43, 0x99,
+    0x23, 0x23, 0x5c, 0xd8, 0x08, 0x09, 0x5e, 0x09, 0x54, 0x5e, 0xc6, 0x96, 0x6c, 0x24, 0xf5, 0xa2,
+    0x29, 0xe1, 0x3b, 0x51, 0x89, 0xa5, 0x7e, 0xe5, 0x2b, 0xfa, 0x75, 0xa2, 0xf1, 0x49, 0x93, 0xd5,
+    0xf2, 0x5a, 0xe1, 0xec, 0xd2, 0x39, 0xe5, 0x55, 0x8f, 0xfd, 0x55, 0x42, 0xf8, 0xbf, 0x06, 0xb0,
+    0x5f, 0xea, 0xd8, 0x08, 0x8b, 0xa4, 0xcb, 0xf0, 0xb9, 0x9d, 0x0b, 0x1d, 0x31, 0x29, 0xe1, 0x3d,
+    0x77, 0xb1, 0xe8, 0xe9, 0x10, 0x69, 0xb8, 0x13, 0x94, 0x5d, 0x28, 0xe6, 0xe2, 0xdb, 0x7c, 0x3c,
+    0x9c, 0xf2, 0xc6, 0x69, 0x9d, 0xf9, 0xdb, 0x84, 0xb1, 0xfb, 0x26, 0x23, 0x01, 0x81, 0xac, 0xed,
+    0xaf, 0xbc, 0x20, 0xc0, 0x63, 0x40, 0x00, 0xe7, 0x93, 0x55, 0xdb, 0x53, 0x39, 0x2d, 0xf6, 0x8e,
+    0x01, 0xcd, 0x3f, 0x06, 0x68, 0x60, 0xa3, 0xc3, 0xbe, 0x60, 0xb5, 0x00, 0x24, 0x33, 0x75, 0x17,
+    0xdd, 0xdb, 0x49, 0xb1, 0xb6, 0x5d, 0x38, 0xa6, 0x80, 0x6c, 0x9c, 0x09, 0x9d, 0x14, 0x64, 0xed,
+    0x60, 0xed, 0xaf, 0x76, 0xd8, 0x37, 0x31, 0x81, 0xcb, 0xe6, 0x57, 0x55, 0xf3, 0x73, 0x80, 0xbd,
+    0xb9, 0xbc, 0xfa, 0x5a, 0x28, 0x81, 0x27, 0xb5, 0x56, 0xd5, 0x74, 0x88, 0x36, 0x54, 0xbd, 0xda,
+    0x35, 0x4a, 0x91, 0xa5, 0x8f, 0x3e, 0x91, 0x71, 0x34, 0x26, 0xec, 0xaa, 0xe0, 0x5f, 0x1e, 0x87,
+    0x8b, 0x0a, 0xd9, 0x97, 0x1c, 0xd3, 0x01, 0x5c, 0x45, 0xdb, 0x28, 0x23, 0x0e, 0x7e, 0x12, 0xc0,
+    0xc4, 0x79, 0x6c, 0x81, 0x8b, 0xd4, 0xa3, 0x40, 0x25, 0x5f, 0x16, 0x3f, 0xb1, 0x10, 0xa7, 0x53,
+    0x4a, 0xe2, 0x0c, 0x6e, 0x93, 0x07, 0x2a, 0xc0, 0x5a, 0x6f, 0x0d, 0xb1, 0x62, 0x71, 0xff, 0xc3,
+    0x17, 0xbc, 0x1b, 0xeb, 0x92, 0x05, 0x80, 0xb9, 0x7b, 0x90, 0xef, 0xbe, 0x06, 0x22, 0x90, 0x91,
+    0x69, 0xb8, 0xde, 0x71, 0xae, 0x12, 0x35, 0x31, 0xc3, 0x03, 0x23, 0x6e, 0x53, 0x08, 0x66, 0xcd,
+    0x4f, 0x35, 0xf4, 0xd1, 0x35, 0xd1, 0x80, 0x2f, 0x67, 0xdb, 0xf4, 0x1e, 0x3c, 0x17, 0xba, 0x5b,
+    0xe5, 0xf4, 0x97, 0x25, 0x06, 0x01, 0x12, 0x92, 0xbe, 0x1f, 0x6d, 0x9d, 0xb2, 0x59, 0x78, 0x5b,
+    0xc4, 0x4a, 0xd6, 0x75, 0x2d, 0x1e, 0xf9, 0x2b, 0x51, 0xea, 0x6d, 0xf5, 0x71, 0x55, 0x36, 0xb8,
+    0xc7, 0x98, 0x24, 0xa2, 0xce, 0x9d, 0x29, 0x60, 0x0d, 0x48, 0x8d, 0x67, 0x0f, 0x55, 0xa5, 0x78,
+    0x5a, 0x4f, 0xbc, 0x79, 0x16, 0x97, 0xcb, 0x78, 0xc5, 0xde, 0x71, 0xc5, 0x54, 0x04, 0x98, 0x93,
+    0xd9, 0x01, 0xeb, 0x35, 0x70, 0xe2, 0x22, 0x92, 0x2d, 0x99, 0x0c, 0xd1, 0xcc, 0x0c, 0x76, 0xd6,
+    0xea, 0x4c, 0x27, 0x7b, 0x1a, 0x93, 0x95, 0x09, 0xd8, 0x47, 0x0b, 0x75, 0xa4, 0xad, 0x4b, 0x4e,
+    0x12, 0xdd, 0xd4, 0x26, 0x78, 0x8a, 0x52, 0xb7, 0x93, 0x7c, 0x42, 0xe3, 0x90, 0xed, 0x2a, 0x94,
+    0xc6, 0xe4, 0x70, 0x4c, 0x88, 0x33, 0x8b, 0x3f, 0xef, 0x3a, 0xff, 0xd2, 0x13, 0x25, 0xad, 0x28,
+    0x0b, 0xb9, 0x06, 0x91, 0x7c, 0x63, 0x02, 0xda, 0x18, 0x85, 0x4e, 0x8f, 0x79, 0x4c, 0xbf, 0x24,
+    0xd7, 0x24, 0x3d, 0xfd, 0x21, 0x90, 0xe5, 0xd4, 0x79, 0xc9, 0x53, 0xef, 0x05, 0xda, 0x36, 0x45,
+    0xb4, 0x37, 0xa0, 0x27, 0x20, 0x06, 0x51, 0x87, 0x7e, 0xc9, 0x49, 0x7c, 0xc3, 0x44, 0x4b, 0xcb,
+    0xdd, 0x13, 0xf3, 0x3d, 0xc5, 0x27, 0xd5, 0x11, 0x09, 0x65, 0xf7, 0x9a, 0xf9, 0x97, 0x55, 0x53,
+    0x2f, 0x88, 0xd4, 0xc2, 0x54, 0xaa, 0xa0, 0xfd, 0x17, 0x9e, 0x00, 0x96, 0x32, 0x5d, 0x51, 0x49,
+    0x14, 0x74, 0xe5, 0xdc, 0x8b, 0x7d, 0xb4, 0x01, 0x93, 0xa0, 0xe4, 0x55, 0x10, 0xb6, 0x5c, 0x5c,
+    0x7e, 0x86, 0xdd, 0x8b, 0x7c, 0x35, 0x08, 0xdd, 0x32, 0x52, 0x4d, 0x62, 0xad, 0xb2, 0x8f, 0x18,
+    0x74, 0x85, 0xdf, 0x01, 0x50, 0xb6, 0xbb, 0x5c, 0xce, 0xdd, 0x57, 0xc3, 0x5b, 0x5d, 0xb1, 0x41,
+    0x75, 0x36, 0x96, 0x33, 0xc9, 0x3d, 0x13, 0x11, 0x02, 0x7f, 0xc1, 0x3f, 0x8a, 0xa3, 0x2c, 0x4d,
+    0x51, 0x4c, 0x5f, 0x4c, 0x79, 0x59, 0x2a, 0xae, 0x64, 0x77, 0xac, 0x9a, 0x69, 0xd5, 0xa6, 0x19,
+    0x45, 0xfc, 0x67, 0x5b, 0x37, 0xda, 0x40, 0x78, 0x28, 0x96, 0x00, 0x93, 0x49, 0xb2, 0x2d, 0x82,
+    0x7c, 0xf0, 0xb5, 0xa3, 0x56, 0xac, 0x15, 0x8a, 0x75, 0xe8, 0x9a, 0x7a, 0x81, 0x75, 0x3c, 0x98,
+    0x42, 0x84, 0xba, 0x85, 0xfd, 0xbc, 0x22, 0x6d, 0x64, 0xc9, 0x94, 0x72, 0x84, 0xaf, 0x7d, 0x7c,
+    0x0e, 0xcd, 0xe5, 0x75, 0x46, 0x8f, 0xd7, 0x51, 0xfe, 0x36, 0x3c, 0xc2, 0xa7, 0x12, 0xdd, 0xb4,
+    0x07, 0x7a, 0x50, 0x2d, 0xaa, 0x8b, 0x15, 0x7d, 0x4b, 0xb1, 0x68, 0x8f, 0x6d, 0xa7, 0x11, 0xd0,
+    0xab, 0xce, 0xda, 0x2d, 0x21, 0x54, 0x88, 0xb8, 0x8e, 0x41, 0x3e, 0x32, 0x8e, 0x1b, 0xbe, 0x58,
+    0x60, 0x3f, 0x26, 0x34, 0x7b, 0x3f, 0x66, 0x15, 0x35, 0x9f, 0x9e, 0xa7, 0x29, 0xc5, 0x56, 0xe4,
+    0xf2, 0x63, 0xd9, 0xac, 0x4e, 0x32, 0x43, 0x92, 0x2e, 0x3b, 0x27, 0x59, 0x94, 0xb3, 0x88, 0x25,
+    0x70, 0xac, 0xb8, 0x00, 0xa2, 0x6d, 0xbf, 0x21, 0x71, 0x99, 0x14, 0x00, 0xd7, 0xaf, 0xe3, 0x3c,
+    0x34, 0x19, 0x76, 0xa3, 0xe4, 0xb7, 0xe6, 0xd9, 0x47, 0xd1, 0xc9, 0x89, 0x1d, 0x13, 0x97, 0x4a,
+    0x61, 0x99, 0x1e, 0x1b, 0xd3, 0xa3, 0xdd, 0xa3, 0xd9, 0x79, 0xd7, 0x77, 0x7c, 0x3c, 0xf8, 0x97,
+    0x94, 0xaa, 0x64, 0xe3, 0xc1, 0x5d, 0x83, 0x7a, 0xda, 0xdd, 0xf1, 0x35, 0xa2, 0x25, 0xa9, 0x33,
+    0x92, 0x18, 0x4c, 0xa8, 0xc7, 0xed, 0x90, 0x5a, 0x6f, 0x82, 0x24, 0xad, 0x9a, 0x3b, 0x2f, 0xea,
+    0x9d, 0x6e, 0x59, 0x9d, 0xda, 0x03, 0xaa, 0xd5, 0xfe, 0x63, 0x51, 0xe6, 0xe1, 0x65, 0x21, 0xf9,
+    0x6a, 0x25, 0xd5, 0x4f, 0x85, 0x22, 0x0a, 0xb3, 0x38, 0x25, 0xef, 0x00, 0xd0, 0x59, 0xf1, 0x67,
+    0xfb, 0x5d, 0xa4, 0xcb, 0xab, 0x5b, 0x45, 0xde, 0x8c, 0xf8, 0x2a, 0x0b, 0xaf, 0xe7, 0xde, 0x59,
+    0xfb, 0xa9, 0x49, 0xe8, 0x0a, 0xcd, 0x4f, 0xe9, 0x04, 0x14, 0xf0, 0x9e, 0x5e, 0xad, 0x2d, 0x44,
+    0xda, 0x81, 0x3f, 0xd9, 0xa2, 0xa4, 0x3c, 0x88, 0x21, 0x3e, 0xd6, 0x2d, 0x73, 0xd4, 0x18, 0xc9,
+    0x61, 0xa9, 0x26, 0x7e, 0x4b, 0x06, 0x16, 0xce, 0x8e, 0x7c, 0x10, 0xc5, 0x35, 0x14, 0xcc, 0x09,
+    0x14, 0x5e, 0x17, 0x37, 0x21, 0x40, 0x8b, 0x4a, 0x3a, 0xc2, 0xda, 0x46, 0x0c, 0xfc, 0x0d, 0xf9,
+    0xbb, 0x9c, 0x93, 0x19, 0x5f, 0xf1, 0x9f, 0x08, 0xaa, 0x33, 0xa6, 0xdd, 0x63, 0xa3, 0x23, 0x39,
+    0x7d, 0x4c, 0x4a, 0x98, 0xd9, 0xf1, 0xe5, 0x4e, 0xfa, 0xb9, 0x5b, 0xff, 0xf5, 0xdc, 0xca, 0xfc,
+    0xcd, 0x26, 0xbf, 0xed, 0x67, 0x92, 0xd6, 0x5d, 0x9c, 0x10, 0xa3, 0x7b, 0xd4, 0xab, 0x20, 0xbc,
+    0x53, 0xb0, 0xf8, 0x8a, 0x3c, 0x34, 0x11, 0xa4, 0x0e, 0x3b, 0x95, 0x22, 0x41, 0x0d, 0x2e, 0xe2,
+    0xb1, 0x84, 0xbb, 0xce, 0x11, 0xb7, 0x3c, 0xc2, 0xfc, 0xd0, 0x9c, 0xaf, 0xa1, 0x7f, 0x51, 0x89,
+    0x6f, 0x73, 0x1f, 0x8c, 0x84, 0x86, 0x0f, 0x61, 0x0e, 0x67, 0xd0, 0xbd, 0x2e, 0x8a, 0xc8, 0xe0,
+    0x66, 0xd9, 0xfe, 0xe7, 0x0d, 0xfc, 0x72, 0x1a, 0xa7, 0x4c, 0x6e, 0x72, 0x88, 0x74, 0x8d, 0x17,
+    0x5a, 0x1e, 0xb3, 0x30, 0x79, 0xca, 0x36, 0x11, 0x12, 0x90, 0x82, 0x7e, 0x8b, 0xf1, 0x49, 0x02,
+    0x7f, 0x7f, 0x3d, 0x3f, 0x02, 0x7d, 0x7c, 0xd5, 0x60, 0xba, 0x9b, 0xa9, 0x3a, 0x13, 0x88, 0xa3,
+    0x6f, 0xf1, 0x3d, 0xfa, 0xff, 0x63, 0x99, 0x93, 0xe9, 0x74, 0x78, 0x05, 0xfe, 0x30, 0x57, 0x0b,
+    0x39, 0xe8, 0x28, 0xf5, 0xaa, 0x0d, 0x05, 0x0d, 0x91, 0xbd, 0x75, 0x44, 0x71, 0x4e, 0xdf, 0xbe,
+    0xd5, 0x54, 0x09, 0x92, 0xa7, 0x50, 0x74, 0x05, 0xb3, 0x40, 0x9e, 0xeb, 0x7c, 0x1c, 0xbb, 0xe8,
+    0x4a, 0x89, 0xa5, 0xc2, 0xd9, 0x57, 0xba, 0xd6, 0x5e, 0x35, 0xb0, 0x68, 0xa8, 0x08, 0xff, 0x3f,
+    0x27, 0xba, 0x37, 0x39, 0x73, 0x07, 0x6e, 0xab, 0x95, 0xd3, 0x09, 0xc4, 0xe5, 0x00, 0xaf, 0x8b,
+    0xdd, 0x58, 0x97, 0x64, 0x3f, 0x94, 0xd5, 0xfa, 0x10, 0x86, 0x33, 0x15, 0x55, 0xe1, 0x04, 0x6b,
+    0xd3, 0xfc, 0x8b, 0xda, 0x6b, 0x67, 0x2e, 0xb6, 0xf7, 0xdd, 0x85, 0x77, 0x9f, 0x80, 0x61, 0xd7,
+    0xfb, 0x61, 0x0d, 0x34, 0x10, 0xe0, 0xf4, 0x31, 0x94, 0x66, 0x69, 0x00, 0x2e, 0xbe, 0xd8, 0xa1,
+    0xb5, 0x22, 0x8d, 0x7a, 0x28, 0xff, 0xa4, 0x1d, 0x99, 0x6d, 0x0a, 0x10, 0x9e, 0x90, 0x28, 0xa5,
+    0x63, 0xd5, 0x71, 0x10, 0x37, 0x4e, 0x29, 0xc4, 0xe1, 0xf1, 0x37, 0x57, 0x46, 0x6d, 0x68, 0x02,
+    0xc0, 0x0f, 0x78, 0x56, 0xd4, 0xc3, 0x5c, 0x83, 0x8d, 0xe9, 0x3a, 0xa2, 0xd8, 0x5d, 0xa5, 0x4f,
+    0x8b, 0xef, 0xa5, 0x06, 0xb1, 0xa7, 0x3d, 0x7a, 0x91, 0xf7, 0xe4, 0x7b, 0x69, 0xba, 0x4f, 0xe1,
+    0xe9, 0xa1, 0x63, 0x82, 0xcf, 0xbb, 0x29, 0xb6, 0x46, 0xdf, 0xf4, 0x2c, 0x1e, 0x1a, 0x75, 0xe1,
+    0x5e, 0x8e, 0x87, 0x55, 0x90, 0xb1, 0x6f, 0x8d, 0x2c, 0x5a, 0x24, 0xa1, 0x86, 0xae, 0x1f, 0xd6,
+    0x65, 0x2c, 0xff, 0xc4, 0x5e, 0x27, 0x01, 0x6c, 0x6c, 0xdd, 0xc6, 0x2e, 0x7f, 0xb1, 0x0c, 0x73,
+    0xaa, 0x51, 0x8c, 0x5a, 0x78, 0xe6, 0x1d, 0x61, 0x1e, 0x43, 0xc3, 0x66, 0xff, 0x63, 0x7e, 0xad,
+    0x27, 0x81, 0x53, 0x32, 0x49, 0x99, 0xce, 0xfb, 0x62, 0x6e, 0xdc, 0x23, 0xe0, 0xe9, 0xd7, 0x6e,
+    0x79, 0x8f, 0xfe, 0x77, 0xf8, 0x3c, 0x50, 0x9b, 0xf6, 0x92, 0xd8, 0x75, 0x2a, 0xda, 0x2e, 0x15,
+    0x15, 0x1b, 0xa6, 0x76, 0x9c, 0x47, 0x72, 0x0d, 0xd5, 0xd5, 0xcb, 0x4d, 0x04, 0xd4, 0x94, 0xa5,
+    0x85, 0x6d, 0x56, 0x74, 0x5d, 0x59, 0x2f, 0x3d, 0x19, 0x35, 0x9e, 0x82, 0x07, 0x1e, 0x23, 0xc6,
+    0x24, 0x08, 0x72, 0x67, 0x8a, 0xfa, 0x68, 0xbd, 0x1a, 0xac, 0x70, 0x23, 0xc0, 0xf9, 0xab, 0x07,
+    0xba, 0xeb, 0xaa, 0x94, 0x7a, 0x1b, 0x3c, 0xbc, 0x96, 0xd2, 0xf9, 0xc6, 0xb6, 0x60, 0x5a, 0x57,
+    0xe3, 0xd0, 0xc2, 0x98, 0xb2, 0x5e, 0x5a, 0xd5, 0x45, 0x1c, 0xe5, 0x3a, 0x43, 0xf8, 0xe9, 0xcc,
+    0x3f, 0x1a, 0x1c, 0x4c, 0xdb, 0x3c, 0x05, 0x6b, 0x50, 0xf8, 0xbd, 0x0c, 0xd6, 0x8f, 0xf2, 0xdc,
+    0xa4, 0xe4, 0x7c, 0xb6, 0x1a, 0xf7, 0xe3, 0x6a, 0xa2, 0x5f, 0x14, 0x0e, 0x6b, 0x81, 0x65, 0xad,
+    0x94, 0xfe, 0x36, 0x89, 0x65, 0xf3, 0xd6, 0x8b, 0x29, 0x01, 0xff, 0xd8, 0x11, 0x47, 0x88, 0x5e,
+    0x23, 0xb7, 0xd4, 0x6e, 0xf5, 0x79, 0xbf, 0xaf, 0x6e, 0xf9, 0x26, 0xb2, 0x09, 0x0f, 0x45, 0xcd,
+    0xd0, 0x31, 0xfc, 0x5f, 0x03, 0xdf, 0xe9, 0x6e, 0x51, 0x6a, 0x6f, 0x9d, 0x5b, 0x19, 0xd5, 0x1d,
+    0xc7, 0x12, 0xb5, 0x51, 0x8f, 0xc9, 0x20, 0x4a, 0x0f, 0x89, 0xd5, 0x9f, 0x03, 0x9e, 0x4d, 0x8a,
+    0xe4, 0x8a, 0x93, 0xe6, 0xe1, 0x74, 0x86, 0x77, 0x44, 0xe3, 0x4c, 0x8b, 0x1c, 0xea, 0x13, 0xfb,
+    0xd7, 0x7f, 0x69, 0x2e, 0x4c, 0xf8, 0xa3, 0xfb, 0xdf, 0xdb, 0x3e, 0xba, 0xf5, 0x82, 0xd4, 0x8f,
+    0xd6, 0xdb, 0xdb, 0x98, 0xa9, 0x0e, 0x9b, 0x70, 0xcd, 0xd6, 0xcc, 0x28, 0x99, 0xe7, 0x29, 0xaf,
+    0xd1, 0x9e, 0xdc, 0x6b, 0xdc, 0xa4, 0x45, 0x00, 0x53, 0xf6, 0x14, 0x5d, 0x0a, 0xab, 0x66, 0x25,
+    0xdd, 0x86, 0x65, 0x4e, 0xf2, 0x48, 0x04, 0x98, 0x04, 0xba, 0x29, 0xd7, 0xe1, 0x1f, 0xca, 0x81,
+    0x57, 0x96, 0x18, 0x4a, 0x92, 0x1a, 0x7e, 0x4b, 0x44, 0xd2, 0xad, 0x51, 0x90, 0xef, 0xba, 0x77,
+    0x93, 0xca, 0xd1, 0xfb, 0xfe, 0x75, 0x6b, 0x1c, 0x44, 0xe1, 0x94, 0x79, 0x27, 0x6c, 0xa6, 0x2a,
+    0x32, 0x63, 0x82, 0xcf, 0xc6, 0x81, 0x9c, 0xa9, 0xd4, 0x89, 0xcf, 0x6a, 0x27, 0x73, 0x4c, 0xc4,
+    0xf3, 0xef, 0x4f, 0x75, 0x7f, 0x4e, 0xc1, 0x9b, 0xd5, 0xf6, 0x0b, 0x52, 0x12, 0xce, 0x16, 0x39,
+    0x97, 0x13, 0x3f, 0x74, 0x85, 0x3c, 0xb1, 0x8d, 0x33, 0x94, 0x5d, 0x09, 0xee, 0x62, 0x15, 0xf0,
+    0xff, 0xde, 0xe0, 0x7b, 0x12, 0xf1, 0x80, 0x75, 0xf9, 0xc9, 0x5e, 0xf5, 0x8a, 0x51, 0xa2, 0xfb,
+    0x70, 0x05, 0xad, 0xe0, 0x08, 0x5c, 0x01, 0x5a, 0x50, 0xf4, 0xf1, 0x26, 0x38, 0x3e, 0xb2, 0x5d,
+    0x10, 0xc5, 0xbf, 0xc5, 0x86, 0xa0, 0x58, 0xa3, 0x12, 0x8c, 0xa4, 0xda, 0xf3, 0xa0, 0x2d, 0x0f,
+    0xf6, 0x01, 0xb6, 0x2a, 0x1c, 0x94, 0x8d, 0xe8, 0x07, 0xa5, 0xb8, 0x0d, 0xbb, 0x6a, 0x24, 0x9f,
+    0x6e, 0x17, 0x0e, 0xe5, 0xd6, 0x6c, 0xed, 0x07, 0xa0, 0xd9, 0x5a, 0x51, 0xdf, 0x31, 0x60, 0x47,
+    0x16, 0x09, 0x73, 0x14, 0x9c, 0xc2, 0x81, 0x5f, 0x1f, 0x42, 0xad, 0x9f, 0x46, 0x1e, 0x25, 0x57,
+    0xf9, 0xa2, 0x60, 0x19, 0x88, 0xef, 0x59, 0x10, 0x8c, 0x1f, 0x61, 0x5b, 0x8c, 0xa7, 0xc2, 0x54,
+    0x96, 0xe2, 0x61, 0x19, 0xce, 0xd9, 0xa5, 0xb0, 0x10, 0xd3, 0xab, 0xe6, 0xfe, 0x81, 0x40, 0x2b,
+    0x41, 0x8b, 0x0a, 0xe9, 0x73, 0xc6, 0x8d, 0x1d, 0xd6, 0x35, 0xf4, 0x1c, 0xd9, 0xd5, 0x28, 0x9b,
+    0x22, 0x5e, 0xbf, 0x25, 0xaf, 0x28, 0x7f, 0x6a, 0x0b, 0xc4, 0x5a, 0xbe, 0x89, 0xb3, 0x3a, 0xc3,
+    0xc1, 0xc8, 0x52, 0x9f, 0xba, 0x73, 0x85, 0x66, 0xfd, 0x59, 0x5a, 0xb2, 0xa5, 0xcf, 0x69, 0x78,
+    0xf4, 0x96, 0x23, 0x16, 0x3a, 0x08, 0xd2, 0x95, 0x5b, 0xc8, 0x3d, 0x1a, 0xe5, 0x74, 0xa3, 0x7d,
+    0x64, 0x36, 0xe6, 0x8d, 0xa8, 0xbf, 0xf9, 0x98, 0x53, 0xb3, 0xf4, 0x5a, 0x83, 0xf9, 0x45, 0xa1,
+    0x60, 0xa2, 0x74, 0x0b, 0xa5, 0xc0, 0x6d, 0xf3, 0x04, 0xd4, 0x5a, 0xcd, 0x4d, 0x4b, 0xf6, 0x0a,
+    0x7b, 0xf3, 0x3b, 0x1f, 0x7e, 0xc7, 0x4b, 0xd1, 0x00, 0xb4, 0x77, 0x75, 0xa2, 0xa2, 0xce, 0x76,
+    0x76, 0x68, 0x65, 0x5d, 0x12, 0x02, 0x8b, 0x77, 0x73, 0xe7, 0x69, 0xbd, 0x38, 0xfa, 0xd6, 0x02,
+    0xbb, 0xd5, 0x33, 0x5c, 0x59, 0xdd, 0x03, 0xc8, 0x06, 0xab, 0x9e, 0xd1, 0xf3, 0x79, 0xd6, 0x58,
+    0xf1, 0xbc, 0x17, 0x6d, 0xfc, 0x27, 0x3c, 0xb4, 0xa2, 0x47, 0xb1, 0x77, 0x4b, 0xa9, 0xf9, 0x3e,
+    0x85, 0xf1, 0x0a, 0x01, 0x44, 0x84, 0xea, 0x25, 0x0f, 0xf0, 0x3e, 0x75, 0x65, 0x4e, 0xd4, 0x1d,
+    0xc5, 0x68, 0x0d, 0xf4, 0xda, 0xb7, 0x44, 0x04, 0xd8, 0x2d, 0x62, 0x7f, 0x16, 0xbd, 0x72, 0x24,
+    0xbd, 0x63, 0x10, 0x4b, 0x52, 0x01, 0x9d, 0xcd, 0x5f, 0xe0, 0x21, 0x8e, 0x32, 0x4c, 0xd6, 0xa0,
+    0x89, 0xf5, 0x49, 0xf3, 0x1c, 0x0e, 0x0e, 0xf1, 0x35, 0x06, 0x27, 0xac, 0x3a, 0x23, 0xe9, 0x96,
+    0xb3, 0x80, 0x65, 0x88, 0x32, 0xbc, 0x5a, 0xfd, 0x57, 0xc8, 0x20, 0x28, 0x27, 0xac, 0x07, 0x73,
+    0x7f, 0x86, 0x2f, 0xa2, 0x61, 0x76, 0xfa, 0xd0, 0x69, 0xd1, 0xcf, 0x52, 0x07, 0x54, 0xa3, 0x2d,
+    0xf1, 0x8d, 0x26, 0x97, 0xbb, 0x79, 0xbc, 0x2f, 0xb4, 0x9f, 0xe2, 0x2f, 0x5c, 0xbd, 0xe3, 0x2c,
+    0xab, 0x9d, 0xd6, 0xda, 0x76, 0x4a, 0x74, 0x91, 0x5c, 0x03, 0x73, 0xcc, 0x2a, 0xee, 0x5f, 0xbc,
+    0x94, 0x92, 0x62, 0x66, 0xae, 0x38, 0x06, 0x0d, 0xf6, 0xe0, 0xd9, 0x4b, 0xae, 0x22, 0xe6, 0x42,
+    0x1d, 0xf6, 0xd3, 0xbb, 0x56, 0xb7, 0x5c, 0xac, 0xfb, 0x16, 0xc7, 0x15, 0x55, 0xae, 0xd5, 0xe2,
+    0x43, 0x29, 0xe6, 0x05, 0xe6, 0x4d, 0x6a, 0xdc, 0xa8, 0xdb, 0xb1, 0xcd, 0xdc, 0x00, 0x38, 0x1d,
+    0x21, 0xab, 0x42, 0xab, 0x04, 0xb9, 0x73, 0xb8, 0x66, 0x1a, 0xe8, 0x46, 0x07, 0x14, 0xbc, 0x97,
+    0xd2, 0x49, 0xc2, 0x37, 0x9e, 0xa6, 0x5d, 0x7f, 0xca, 0x36, 0x0a, 0x49, 0x9f, 0xc4, 0x6c, 0x9c,
+    0x9c, 0xde, 0x34, 0x77, 0x5c, 0x07, 0x74, 0x22, 0xac, 0xfc, 0x80, 0x13, 0xe8, 0xb1, 0x4b, 0x5c,
+    0x3e, 0xa8, 0x4a, 0x1f, 0x1f, 0xe1, 0x56, 0xa4, 0x06, 0xa6, 0x7a, 0x3e, 0xf3, 0x3a, 0xf3, 0x86,
+    0xcc, 0x1f, 0x91, 0xdf, 0x68, 0xda, 0x7f, 0x3a, 0x0d, 0xe8, 0xb9, 0xf5, 0x46, 0xb3, 0x61, 0x4c,
+    0xd6, 0xe0, 0x2c, 0x9d, 0xfa, 0x0d, 0x3b, 0xee, 0x0f, 0xc2, 0xff, 0xa5, 0x2e, 0x41, 0x47, 0xb7,
+    0x00, 0xfe, 0x72, 0x8f, 0xef, 0x33, 0xb3, 0x84, 0x18, 0x7b, 0x0d, 0x1d, 0xde, 0x31, 0xb3, 0x23,
+    0xab, 0x4e, 0xc6, 0x87, 0xd7, 0xfc, 0x54, 0x2b, 0xa1, 0x97, 0x64, 0x3f, 0x75, 0x2b, 0x79, 0xb3,
+    0x54, 0x7d, 0x97, 0x2a, 0xf3, 0xba, 0x99, 0xce, 0x04, 0x3a, 0xcd, 0xae, 0x35, 0x4d, 0x18, 0xbc,
+    0xb7, 0x11, 0x22, 0x50, 0xc1, 0xa8, 0x92, 0x60, 0x4f, 0xb0, 0xea, 0x33, 0x3c, 0xce, 0xd8, 0x1e,
+    0xc7, 0xb4, 0xc4, 0x65, 0x71, 0x71, 0x88, 0xc6, 0x3a, 0x34, 0x47, 0xc9, 0xde, 0x45, 0x35, 0xcd,
+    0x9f, 0x69, 0x51, 0xd6, 0x5f, 0xce, 0x2b, 0x77, 0xb1, 0x4d, 0x26, 0x7f, 0xff, 0x70, 0x25, 0x3a,
+    0x3e, 0x52, 0x6f, 0xa8, 0x03, 0xd8, 0x45, 0xeb, 0x8c, 0x42, 0x63, 0xba, 0xe9, 0x33, 0x9a, 0xe6,
+    0x52, 0x98, 0x07, 0x3d, 0xed, 0x6f, 0x90, 0x2f, 0xe3, 0x12, 0xa9, 0xd5, 0xc1, 0xb3, 0x0a, 0xe5,
+    0xcd, 0x27, 0x98, 0x00, 0x16, 0xcc, 0xad, 0xfc, 0x5a, 0x65, 0x10, 0xa9, 0xea, 0x10, 0x90, 0xb7,
+    0x10, 0x82, 0x49, 0x14, 0xc0, 0xde, 0x71, 0xbe, 0x92, 0x87, 0xb7, 0xb2, 0xe9, 0x6d, 0x5f, 0xd8,
+    0x6f, 0xe2, 0x1a, 0xb7, 0xd7, 0x30, 0xd3, 0x2c, 0xfd, 0x17, 0x09, 0x6d, 0x63, 0xda, 0x54, 0x3b,
+    0x8d, 0xc7, 0x29, 0x1d, 0x42, 0xdb, 0x5a, 0xd1, 0xbe, 0xaf, 0x90, 0x2c, 0x0b, 0xee, 0xac, 0xe8,
+    0x65, 0x83, 0xa1, 0xc1, 0x12, 0xc6, 0x54, 0x5f, 0xf6, 0x6b, 0x6c, 0xbf, 0x1a, 0x00, 0xe7, 0xdd,
+    0xa1, 0x91, 0xb4, 0xe9, 0x3d, 0x86, 0x44, 0x5e, 0x69, 0x37, 0x69, 0x91, 0x61, 0x34, 0xd1, 0x2d,
+    0x3a, 0x9a, 0x91, 0x75, 0xbf, 0xab, 0x08, 0x85, 0x7d, 0xb6, 0x01, 0xa8, 0xc0, 0x3d, 0x57, 0x37,
+    0xf5, 0x0a, 0xe4, 0x81, 0x4a, 0x11, 0x38, 0xca, 0xd7, 0x2c, 0x44, 0x75, 0x4b, 0xcc, 0x80, 0xde,
+    0x2b, 0xad, 0x59, 0x5e, 0x78, 0x41, 0x23, 0xa9, 0x1a, 0x09, 0x1e, 0x07, 0xe8, 0x8b, 0x6c, 0x6a,
+    0xe7, 0x91, 0xf4, 0xa5, 0xfe, 0x1b, 0x83, 0x23, 0x60, 0xd3, 0xf1, 0x9b, 0x02, 0x93, 0xdf, 0x20,
+    0x20, 0x49, 0xb2, 0xdc, 0xf3, 0x89, 0x93, 0xd1, 0xaf, 0x1c, 0x8a, 0x4e, 0xec, 0xec, 0x88, 0x65,
+    0x77, 0x2f, 0x4d, 0xfa, 0xaa, 0x73, 0xe8, 0xa6, 0x08, 0x4b, 0xc3, 0x79, 0x64, 0x56, 0xf0, 0x79,
+    0x24, 0xbd, 0x89, 0x3b, 0x6b, 0x3d, 0xdd, 0xe8, 0x81, 0x4a, 0x86, 0x47, 0x6f, 0xd8, 0x69, 0xf1,
+    0x9b, 0x54, 0x63, 0x82, 0x96, 0x62, 0x06, 0x55, 0xbf, 0x77, 0x77, 0xf1, 0x08, 0xa3, 0x78, 0x09,
+    0xab, 0xae, 0x57, 0x4c, 0xf9, 0x64, 0xc2, 0x87, 0x5d, 0x72, 0x80, 0x6a, 0x50, 0xa8, 0x11, 0x6a,
+    0xef, 0xd2, 0x25, 0x12, 0x3b, 0xd2, 0x5f, 0xcf, 0x91, 0x2f, 0x62, 0x8e, 0x96, 0x45, 0x9c, 0x77,
+    0xf5, 0xde, 0xca, 0x93, 0xea, 0x3d, 0xfa, 0x6f, 0x1c, 0x26, 0xd8, 0xe7, 0x92, 0x67, 0xcd, 0xbb,
+    0x71, 0xa9, 0xa6, 0x57, 0x16, 0x11, 0x2f, 0x4d, 0x5a, 0x2a, 0x89, 0xd7, 0x47, 0x8a, 0xa9, 0x2f,
+    0x6b, 0x3c, 0x8d, 0xa2, 0x01, 0x40, 0x47, 0xca, 0xb6, 0xd8, 0x27, 0x81, 0xd7, 0x9e, 0xc2, 0xdf,
+    0xf2, 0xb4, 0x85, 0x96, 0x6e, 0xa4, 0xf9, 0xf7, 0xaf, 0x00, 0x42, 0x83, 0x80, 0xf2, 0x7b, 0xa7,
+    0xe1, 0xcc, 0xcb, 0x26, 0x6a, 0x4f, 0xb5, 0xc4, 0x4e, 0x48, 0x75, 0x5a, 0x33, 0xa0, 0x25, 0xd9,
+    0xf4, 0xfb, 0xb6, 0x93, 0xe0, 0x8e, 0x41, 0xcf, 0x40, 0x19, 0x28, 0x0b, 0x74, 0x08, 0x98, 0x89,
+    0x3e, 0x40, 0x45, 0x7b, 0x54, 0x34, 0xca, 0xcc, 0x9c, 0x18, 0xbf, 0x6b, 0x3f, 0xc4, 0x62, 0xb0,
+    0xc7, 0x37, 0xfd, 0x27, 0xe6, 0xe8, 0x34, 0x7d, 0xb3, 0x21, 0xc6, 0x34, 0xf8, 0xea, 0x00, 0x32,
+    0x96, 0x20, 0x8d, 0x99, 0x27, 0xcb, 0x6b, 0x26, 0xa3, 0x64, 0x5c, 0x25, 0xf6, 0x20, 0xd2, 0x73,
+    0x77, 0x36, 0xee, 0x4d, 0xb5, 0x5e, 0x7f, 0xb4, 0x2c, 0x06, 0x77, 0x5e, 0x61, 0x30, 0x2a, 0xc9,
+    0x47, 0x2b, 0xdf, 0x96, 0x57, 0xe9, 0xf6, 0xac, 0xe3, 0xa5, 0xed, 0xdb, 0xb4, 0x53, 0x3d, 0x9e,
+    0xfe, 0x16, 0x24, 0x85, 0x56, 0x8b, 0x71, 0xe1, 0x79, 0x8d, 0x11, 0x0b, 0x9b, 0xf2, 0x3d, 0x27,
+    0x98, 0x5c, 0x7d, 0x18, 0x75, 0x4e, 0xd3, 0x1b, 0x72, 0x5a, 0xb5, 0xaf, 0xfe, 0x66, 0x67, 0x12,
+    0xaf, 0xcf, 0x54, 0x06, 0xa4, 0x39, 0x06, 0x6c, 0x00, 0x8f, 0xab, 0x22, 0x8c, 0x06, 0xe8, 0x97,
+    0x07, 0xed, 0xc3, 0x2b, 0xbe, 0x8c, 0xb9, 0x23, 0x11, 0xda, 0x68, 0xec, 0x84, 0x13, 0x31, 0xb9,
+    0xfb, 0xd7, 0xb4, 0x02, 0x15, 0x65, 0x11, 0x2c, 0x58, 0x74, 0x6a, 0x33, 0x25, 0x23, 0x21, 0x48,
+    0x4c, 0x83, 0x51, 0xa4, 0x4a, 0x85, 0x03, 0x77, 0x81, 0x8b, 0xfc, 0x53, 0xe1, 0x93, 0x9c, 0x8a,
+    0x33, 0xd7, 0xfd, 0xf5, 0xcb, 0x2e, 0xa8, 0xf6, 0x73, 0x1d, 0x3d, 0xce, 0xba, 0xac, 0xba, 0x62,
+    0x63, 0x6f, 0x7f, 0x32, 0x40, 0xf4, 0x09, 0xe3, 0xda, 0x76, 0x66, 0x12, 0xe6, 0x9d, 0x8c, 0x91,
+    0xb6, 0xa0, 0x39, 0x2b, 0xfa, 0x19, 0xda, 0x5f, 0xf0, 0xa7, 0x1f, 0x58, 0x04, 0xda, 0xc4, 0xc2,
+    0xc7, 0xee, 0x70, 0x68, 0x18, 0x03, 0x11, 0xc2, 0xbb, 0x3f, 0xbc, 0x10, 0xb4, 0x52, 0x3b, 0xff,
+    0x68, 0x6b, 0x3d, 0xf1, 0xca, 0xb4, 0xf0, 0x7e, 0xf1, 0x3f, 0xa2, 0x60, 0xce, 0xf9, 0xaa, 0x2e,
+    0x12, 0x8b, 0x54, 0xa4, 0xa6, 0x60, 0x3a, 0x93, 0xeb, 0x23, 0xa0, 0x1c, 0x14, 0x82, 0x5e, 0x5a,
+    0x93, 0x11, 0x42, 0x98, 0x69, 0x53, 0x1a, 0x2d, 0xd5, 0x41, 0xd1, 0xdd, 0xab, 0xb6, 0x23, 0x44,
+    0xd3, 0xc3, 0xd2, 0x1f, 0x4f, 0x2b, 0xf2, 0x09, 0xf8, 0x2f, 0x96, 0x18, 0x80, 0xa3, 0x8c, 0x97,
+    0xdf, 0x76, 0x70, 0x75, 0xf4, 0xec, 0x49, 0x70, 0x2f, 0x26, 0xeb, 0xc5, 0x41, 0x56, 0xda, 0x3b,
+    0x2c, 0x87, 0xd0, 0xea, 0xcb, 0x19, 0xdf, 0x7b, 0x6b, 0x04, 0x5d, 0x55, 0x51, 0xa6, 0xd5, 0x16,
+    0x7b, 0x6c, 0x96, 0x28, 0xd9, 0x62, 0xc3, 0x7d, 0xf2, 0x3b, 0x2f, 0x3a, 0x23, 0xf2, 0x15, 0x6d,
+    0x28, 0x1c, 0xdd, 0xd9, 0xb0, 0x70, 0x70, 0xce, 0x97, 0xdb, 0xca, 0x17, 0x97, 0x22, 0x1b, 0x71,
+    0xd0, 0x43, 0x7b, 0xcc, 0xaa, 0xb0, 0x43, 0x5a, 0xfb, 0x04, 0xc1, 0x80, 0x75, 0xb1, 0xf1, 0x06,
+    0xb3, 0x64, 0xaa, 0x7d, 0x36, 0x33, 0x7d, 0x4e, 0xf6, 0xac, 0xda, 0x75, 0xa9, 0x5b, 0x32, 0xff,
+    0x2f, 0x00, 0x80, 0xdf, 0x0b, 0x36, 0x20, 0x7d, 0x81, 0xfb, 0xf2, 0x7d, 0xaf, 0x7b, 0xc0, 0x9e,
+    0x16, 0x34, 0x7e, 0x4e, 0x38, 0xae, 0xe5, 0x29, 0x83, 0xd3, 0x1c, 0x6b, 0xfa, 0x4c, 0xb1, 0x0a,
+    0x09, 0xa7, 0xfb, 0x36, 0x4b, 0xd3, 0x18, 0x65, 0xe0, 0xf5, 0x03, 0x3a, 0x9f, 0x15, 0x68, 0x47,
+    0x97, 0x7f, 0xcc, 0x6c, 0x7f, 0xa0, 0x84, 0x30, 0x38, 0x8c, 0x7e, 0x6b, 0x51, 0xbf, 0x91, 0x00,
+    0x33, 0x07, 0x71, 0x39, 0x8d, 0xb4, 0x88, 0x45, 0xcb, 0xee, 0xe0, 0x40, 0xb3, 0xc6, 0xe8, 0xc3,
+    0xbd, 0x01, 0xd7, 0xe0, 0xa5, 0x2a, 0x8f, 0x52, 0x41, 0xd4, 0xc6, 0x4e, 0xc8, 0xf4, 0x03, 0x5d,
+    0xcc, 0xcb, 0x0b, 0x01, 0x7c, 0x50, 0xc7, 0xc3, 0x16, 0x81, 0x29, 0xa2, 0x98, 0xfb, 0x64, 0xde,
+    0x4a, 0x5e, 0x16, 0x31, 0x5c, 0x7d, 0xf0, 0x19, 0xbc, 0x91, 0xb3, 0x28, 0xff, 0x1a, 0x0b, 0xec,
+    0xb7, 0xac, 0x91, 0x93, 0x24, 0x2c, 0xc1, 0x6f, 0x9c, 0x79, 0x2e, 0x80, 0xa8, 0x2a, 0x8f, 0x19,
+    0x65, 0xf1, 0xa0, 0x22, 0xe8, 0x0b, 0x3e, 0x03, 0xeb, 0x11, 0xae, 0x5f, 0x90, 0x85, 0x99, 0xc2,
+    0xe8, 0x29, 0xbd, 0xc4, 0x5d, 0xbc, 0xee, 0x10, 0x90, 0x96, 0xcf, 0x21, 0x9d, 0x12, 0x73, 0x72,
+    0xd2, 0xcb, 0x1b, 0xa7, 0x3e, 0x6e, 0x2b, 0x00, 0xb6, 0x9b, 0x0b, 0x07, 0x3f, 0x30, 0x19, 0x9a,
+    0x4b, 0x19, 0x8a, 0xa6, 0x71, 0x20, 0x9e, 0xb9, 0xbe, 0x2b, 0x91, 0xed, 0x5a, 0x72, 0xa1, 0xd4,
+    0xd4, 0xeb, 0xd0, 0x7b, 0x79, 0x06, 0xb4, 0xa7, 0xef, 0xcd, 0x6b, 0x94, 0x11, 0xbe, 0xf2, 0x4d,
+    0xb4, 0x74, 0x57, 0x5a, 0x4b, 0x75, 0xa3, 0xb8, 0x3c, 0x67, 0xd8, 0x4c, 0x52, 0x26, 0x2a, 0xdc,
+    0x5b, 0x63, 0x4d, 0x25, 0xfa, 0x96, 0xa7, 0x7d, 0x02, 0x2a, 0x2f, 0xc6, 0x87, 0x39, 0x3c, 0x8b,
+    0xe4, 0x21, 0x73, 0xb6, 0xca, 0xdc, 0x32, 0x11, 0x7e, 0xc5, 0x54, 0x76, 0xa6, 0x22, 0x1e, 0xa9,
+    0x79, 0x4b, 0x29, 0x9c, 0xf8, 0x64, 0xff, 0x94, 0xda, 0xb2, 0xba, 0x3f, 0x1a, 0x11, 0xe9, 0x3d,
+    0x5b, 0x9c, 0xb5, 0x2d, 0x28, 0x3a, 0x5f, 0x54, 0x52, 0xbd, 0xb3, 0x29, 0x4e, 0x44, 0x8a, 0x52,
+    0x77, 0xca, 0xc8, 0x7c, 0x1d, 0x17, 0x89, 0x5b, 0xd0, 0xaf, 0xb2, 0x9c, 0x84, 0xa3, 0x5c, 0x7a,
+    0xb5, 0x25, 0xf8, 0xa5, 0xb3, 0xb1, 0x28, 0x04, 0xde, 0x28, 0x36, 0x8e, 0xd2, 0x46, 0xae, 0x03,
+    0x58, 0xec, 0x73, 0x21, 0x4e, 0x1e, 0xe9, 0x39, 0xb5, 0x83, 0x5d, 0x15, 0x86, 0x5a, 0xd7, 0x1c,
+    0xf1, 0x5a, 0xda, 0x57, 0x73, 0xd6, 0xec, 0x10, 0x95, 0xc1, 0x08, 0x5a, 0x02, 0x06, 0x0c, 0xe0,
+    0xd7, 0xca, 0xc2, 0x3e, 0x6e, 0x51, 0xcd, 0x0c, 0xed, 0xba, 0xa4, 0xa1, 0x65, 0xb7, 0xa5, 0xe6,
+    0x7f, 0x03, 0x40, 0x4e, 0xe7, 0x06, 0x2a, 0x21, 0x47, 0x68, 0x67, 0x06, 0xe5, 0x2c, 0x00, 0xa0,
+    0x3c, 0x38, 0xb2, 0xdc, 0xf7, 0x47, 0xf9, 0xf4, 0x7b, 0x90, 0xcc, 0x07, 0x09, 0x4d, 0xf4, 0x4c,
+    0x37, 0xd8, 0xc3, 0x20, 0x16, 0x48, 0x25, 0x49, 0xc3, 0x61, 0xb5, 0x82, 0x0a, 0xdd, 0xa7, 0xca,
+    0xa8, 0xd2, 0xf7, 0x41, 0xab, 0x8f, 0xa4, 0x94, 0xe4, 0x3d, 0x2e, 0xab, 0xa2, 0xf1, 0x6b, 0xce,
+    0x86, 0xbd, 0x8d, 0x8f, 0x8b, 0x79, 0x0b, 0x8f, 0x4d, 0xc2, 0x25, 0x84, 0x9d, 0xb6, 0x20, 0x97,
+    0xbd, 0x16, 0x5b, 0xf6, 0x5b, 0x03, 0x51, 0x40, 0x4d, 0x68, 0x8c, 0x12, 0x1b, 0x41, 0xbc, 0x31,
+    0xcc, 0xbe, 0x90, 0x9c, 0xa4, 0x08, 0x2d, 0xd6, 0x05, 0x1d, 0x4e, 0xfd, 0x2e, 0x36, 0x28, 0xea,
+    0xb7, 0x66, 0x67, 0x48, 0xfd, 0x82, 0x15, 0x3f, 0x39, 0x60, 0x4f, 0x36, 0x2c, 0x35, 0x92, 0x79,
+    0xcd, 0x18, 0x72, 0x05, 0x89, 0xe4, 0x52, 0xd6, 0x92, 0x88, 0x32, 0xb5, 0x2a, 0xa8, 0x79, 0x0f,
+    0x74, 0x7d, 0x62, 0xa2, 0x8a, 0x00, 0xfa, 0x9a, 0x88, 0x8b, 0x23, 0xa6, 0x08, 0x67, 0xf3, 0x7b,
+    0xd3, 0xed, 0xb1, 0xd0, 0x7d, 0xf7, 0x19, 0x34, 0xcd, 0x51, 0x7a, 0x08, 0xba, 0x30, 0xba, 0xdd,
+    0x5e, 0xca, 0xce, 0xf2, 0xf9, 0x5f, 0xb6, 0x6d, 0xa9, 0xfd, 0x0e, 0xc4, 0x69, 0x24, 0x06, 0xd5,
+    0x80, 0x09, 0xe5, 0x82, 0x23, 0x3d, 0xff, 0x88, 0xea, 0x27, 0xb2, 0x34, 0xd1, 0xfe, 0x4f, 0x7f,
+    0x77, 0x1f, 0x11, 0xa4, 0xc3, 0x6a, 0x4b, 0xd2, 0x62, 0x6e, 0x32, 0xeb, 0xec, 0xee, 0x69, 0x60,
+    0x33, 0xfe, 0x6f, 0x45, 0xe9, 0xd7, 0xdf, 0x5a, 0x29, 0x09, 0x34, 0x59, 0xc8, 0x31, 0x97, 0x40,
+    0xbc, 0x13, 0x5f, 0xc7, 0xd3, 0xcf, 0xaf, 0x0d, 0x50, 0xf7, 0x30, 0xfb, 0x2e, 0x25, 0x26, 0x9f,
+    0x99, 0x70, 0xe9, 0x5c, 0x29, 0x1d, 0xcb, 0x1f, 0x7e, 0xdd, 0xb8, 0xfb, 0xe1, 0x0e, 0x7e, 0xc2,
+    0x09, 0x86, 0x09, 0x92, 0x0d, 0xfa, 0x8e, 0x7d, 0x0c, 0xf3, 0x3f, 0x85, 0xbb, 0x56, 0xfe, 0x93,
+    0x83, 0xd6, 0x6d, 0xe4, 0xe0, 0x0f, 0xfa, 0xba, 0x9b, 0xa2, 0x57, 0xc0, 0x04, 0xd1, 0x5b, 0xab,
+    0x89, 0x1a, 0x97, 0x68, 0x27, 0x6f, 0x6d, 0x91, 0x88, 0x3a, 0x1e, 0x7b, 0x30, 0x54, 0x53, 0xd7,
+    0x4d, 0x9b, 0xaf, 0xd9, 0x41, 0x95, 0x09, 0xc5, 0x9e, 0x9c, 0xb5, 0x00, 0x7d, 0xac, 0x21, 0x05,
+    0xca, 0xb7, 0x84, 0x55, 0x71, 0xcf, 0x39, 0xcf, 0xee, 0xbb, 0xda, 0x8d, 0xbf, 0x60, 0x51, 0x41,
+    0x87, 0xbd, 0xba, 0x55, 0xd3, 0xb5, 0x47, 0x50, 0xb5, 0xd4, 0x6d, 0xbd, 0xef, 0x50, 0xd0, 0x02,
+    0x69, 0xba, 0x2d, 0x28, 0x49, 0x5e, 0x12, 0x45, 0x32, 0x0b, 0x56, 0xfa, 0x69, 0x85, 0x6d, 0xe3,
+    0xca, 0x1d, 0x52, 0xd6, 0x37, 0x79, 0x8a, 0xcc, 0x51, 0x9f, 0x6e, 0xd1, 0x9c, 0xc6, 0xb6, 0x4c,
+    0x81, 0xb5, 0xda, 0x9d, 0xb4, 0xb7, 0xbc, 0xa1, 0x96, 0x1c, 0x42, 0x3b, 0x58, 0x97, 0xc2, 0x78,
+    0xc7, 0x12, 0x21, 0x45, 0x4d, 0x11, 0x5e, 0x2d, 0x4b, 0x0e, 0x3a, 0xc2, 0x94, 0x21, 0xe4, 0x3a,
+    0xfa, 0xe2, 0x0d, 0x8b, 0x4c, 0xba, 0x3c, 0x98, 0xaa, 0x44, 0x22, 0xcf, 0x3a, 0x2b, 0x70, 0x65,
+    0x72, 0x9c, 0x01, 0x84, 0xea, 0x5f, 0x93, 0x67, 0x68, 0x26, 0xe4, 0xb3, 0x53, 0x28, 0xd6, 0xf1,
+    0x45, 0x2c, 0x8d, 0x20, 0xc2, 0x75, 0x32, 0x08, 0x95, 0x38, 0x5a, 0xf2, 0xd1, 0xe1, 0x2b, 0x76,
+    0x1d, 0xe8, 0xb2, 0xb1, 0x3d, 0x09, 0x0b, 0xc6, 0xfa, 0x7e, 0xde, 0x54, 0x08, 0xc2, 0xc2, 0xf7,
+    0x48, 0xa9, 0x5b, 0xa3, 0xa7, 0x63, 0x20, 0x4b, 0x1f, 0x76, 0x89, 0x3a, 0x24, 0xbe, 0x14, 0x22,
+    0xa7, 0x20, 0x33, 0x2c, 0xd0, 0x68, 0x37, 0xa4, 0x95, 0xea, 0x19, 0xce, 0x66, 0x1b, 0x0a, 0x64,
+    0x0b, 0x08, 0x6e, 0x31, 0x78, 0xfb, 0xaa, 0x14, 0x29, 0x5d, 0xa5, 0xf7, 0x29, 0x92, 0xe0, 0x13,
+    0x64, 0x57, 0x34, 0xcb, 0x44, 0x51, 0xfe, 0x94, 0x2e, 0xfa, 0xdd, 0x49, 0x2d, 0xd5, 0xf1, 0xc0,
+    0xdd, 0x3c, 0xff, 0x1a, 0x3c, 0xfc, 0x61, 0x97, 0xd2, 0xe4, 0x42, 0x3d, 0x96, 0xa8, 0x49, 0x10,
+    0x05, 0x44, 0x94, 0xd5, 0x5d, 0xb8, 0x46, 0xf1, 0x4c, 0xc9, 0x9d, 0x66, 0xac, 0x3b, 0xdc, 0x5a,
+    0x95, 0x70, 0x01, 0x3a, 0xcf, 0x85, 0xbe, 0x6a, 0xbd, 0x4e, 0x82, 0xb4, 0x1d, 0x65, 0x5f, 0x41,
+    0x77, 0x07, 0x1d, 0xfb, 0xaa, 0x42, 0x7c, 0x35, 0x9d, 0xb6, 0xde, 0x26, 0x54, 0xc1, 0xe5, 0xba,
+    0xa7, 0x59, 0x80, 0xd8, 0x44, 0xe3, 0x9d, 0x0f, 0xdf, 0x8a, 0x46, 0x08, 0xca, 0x11, 0x72, 0xa9,
+    0x3b, 0x72, 0x06, 0xc3, 0x6c, 0xa5, 0xd1, 0x1c, 0xcc, 0xbe, 0x3e, 0xd8, 0x34, 0xbf, 0xd1, 0xf8,
+    0x64, 0xc5, 0x9e, 0x0e, 0xfe, 0xd9, 0x51, 0xf9, 0x31, 0x0a, 0xe0, 0xd7, 0x2e, 0x42, 0x5f, 0x8f,
+    0x4d, 0xaf, 0xfc, 0x6f, 0x48, 0xdf, 0x66, 0x78, 0x56, 0x5e, 0xab, 0xac, 0xf1, 0xbd, 0xa2, 0xb7,
+    0x77, 0x1f, 0x75, 0x78, 0xd2, 0xeb, 0xa7, 0x39, 0xc2, 0x9a, 0x47, 0xb7, 0xa5, 0x43, 0xfb, 0x29,
+    0xdc, 0x90, 0x88, 0x92, 0x31, 0x43, 0x8b, 0xf7, 0x8c, 0x69, 0xd5, 0x01, 0x08, 0x24, 0x1e, 0x6c,
+    0x85, 0x85, 0xa1, 0xf1, 0x06, 0x88, 0xb1, 0x6c, 0x8a, 0x62, 0x91, 0xd3, 0x75, 0x86, 0x98, 0x01,
+    0x35, 0x54, 0xc4, 0x0b, 0xfc, 0xcc, 0xd6, 0x50, 0xb6, 0x99, 0x81, 0x6d, 0xd6, 0x12, 0xb5, 0x48,
+    0x35, 0x4d, 0xdc, 0x54, 0x6c, 0x7b, 0x42, 0xa9, 0xdf, 0x64, 0x85, 0xcd, 0xbe, 0xd8, 0xee, 0xfc,
+    0x5f, 0x5d, 0xcf, 0x4a, 0xc1, 0x1c, 0x8b, 0x2e, 0x1b, 0x76, 0xcf, 0x4d, 0x4c, 0x93, 0xa2, 0xf3,
+    0xc9, 0xd6, 0xf1, 0x4a, 0xf8, 0xdf, 0xec, 0x0b, 0x66, 0x5e, 0xc4, 0x11, 0x46, 0x06, 0x81, 0xe6,
+    0x5f, 0x17, 0xc2, 0x65, 0x83, 0x2d, 0xa2, 0xe7, 0xcf, 0x9c, 0x17, 0x6c, 0xdf, 0x33, 0x4a, 0x17,
+    0x55, 0xac, 0xdc, 0x45, 0xf8, 0xcd, 0x75, 0xc0, 0x2e, 0x75, 0xed, 0xa5, 0x20, 0x62, 0x14, 0xd1,
+    0xc6, 0x47, 0xf4, 0x6d, 0xf9, 0xbd, 0xd8, 0x3a, 0x4f, 0xd3, 0x2d, 0xc7, 0x20, 0xfb, 0xe9, 0x60,
+    0x65, 0xb4, 0x60, 0xe0, 0xce, 0xd6, 0xdf, 0x80, 0xff, 0xeb, 0x88, 0x00, 0x12, 0xd9, 0x33, 0xe7,
+    0xe0, 0xfc, 0x90, 0x8d, 0x73, 0xc7, 0x08, 0x39, 0xed, 0x5e, 0x1a, 0xb4, 0x71, 0x66, 0x0a, 0x88,
+    0xcb, 0x33, 0x77, 0x94, 0xd1, 0xcb, 0x69, 0x5c, 0xf5, 0x91, 0xd5, 0xc9, 0x15, 0x56, 0x58, 0x57,
+    0x80, 0x84, 0xdc, 0xa8, 0x87, 0x9a, 0xa3, 0x8d, 0x8c, 0x2a, 0x62, 0x6a, 0xfe, 0xe9, 0x67, 0x00,
+    0x65, 0x7d, 0xb5, 0x00, 0x53, 0xe9, 0xb1, 0x25, 0xda, 0x28, 0xca, 0xe4, 0x85, 0x9b, 0x24, 0x8b,
+    0x85, 0xe9, 0x96, 0xcc, 0xfc, 0x86, 0xec, 0xc0, 0xf6, 0x0f, 0xcc, 0xf0, 0x7e, 0xdd, 0x63, 0x2b,
+    0x6d, 0x07, 0xbf, 0x85, 0x25, 0x9f, 0x81, 0x65, 0xcc, 0xd7, 0x65, 0x37, 0x04, 0x23, 0xd0, 0xea,
+    0xe2, 0x01, 0x22, 0x78, 0xfe, 0x90, 0xa5, 0x22, 0x81, 0x0b, 0xf6, 0xcf, 0x9e, 0x9d, 0x81, 0x33,
+    0x54, 0x8e, 0x30, 0xec, 0x9d, 0x1b, 0xbd, 0x9e, 0xb4, 0xd2, 0x41, 0x5c, 0x99, 0xf5, 0x45, 0x00,
+    0x64, 0x64, 0xd9, 0x0e, 0x85, 0x16, 0xbb, 0xd3, 0x64, 0xdc, 0xc6, 0x4f, 0x6d, 0x1e, 0xf8, 0xdb,
+    0x2e, 0xe0, 0x37, 0x11, 0x20, 0xdb, 0x8b, 0xf6, 0x5f, 0x7b, 0x2e, 0x60, 0xf7, 0x4e, 0xa0, 0xd9,
+    0x4b, 0x0e, 0x7c, 0x91, 0x4e, 0x69, 0xff, 0xf6, 0xe4, 0x58, 0x39, 0x63, 0xca, 0x1f, 0x31, 0x6e,
+    0xf9, 0xd4, 0xb7, 0x86, 0x39, 0xca, 0x64, 0x2b, 0xdc, 0xa9, 0x19, 0x3d, 0xff, 0x1e, 0x99, 0xee,
+    0x0a, 0xb6, 0x90, 0x08, 0xe8, 0x24, 0x59, 0x13, 0x72, 0x85, 0x71, 0x52, 0x56, 0xcc, 0x47, 0xb9,
+    0x95, 0x3e, 0x4d, 0xaf, 0x4a, 0xc4, 0x69, 0x3b, 0x3e, 0x88, 0x60, 0x16, 0x4f, 0x22, 0xd2, 0x9c,
+    0x6f, 0xc5, 0x45, 0x86, 0xe0, 0xb8, 0x4b, 0xb8, 0xe5, 0x70, 0x3f, 0xed, 0x58, 0xd7, 0xcb, 0xa3,
+    0x03, 0x11, 0xe0, 0x01, 0x3c, 0x30, 0x14, 0x10, 0xcc, 0x62, 0x79, 0x2b, 0x59, 0x28, 0xcb, 0xca,
+    0xec, 0x5e, 0x46, 0xb3, 0x6a, 0xfb, 0x17, 0xda, 0xab, 0x6b, 0x9f, 0x79, 0xd0, 0x3c, 0x4d, 0xa6,
+    0xd5, 0xb9, 0x15, 0xb2, 0x91, 0xe8, 0x12, 0x49, 0x6f, 0x4f, 0xc9, 0xa3, 0xfd, 0x74, 0x44, 0x65,
+    0xea, 0x7a, 0xf2, 0x65, 0x61, 0x9f, 0xc8, 0xbc, 0xc2, 0xee, 0x79, 0x04, 0x26, 0xaa, 0xec, 0xa5,
+    0xa5, 0xda, 0x62, 0xe3, 0x74, 0x7c, 0x5b, 0x94, 0x62, 0xe1, 0xd9, 0xcc, 0xd5, 0x76, 0xc9, 0x77,
+    0xdd, 0x77, 0xe2, 0x22, 0x6e, 0x32, 0x0d, 0xae, 0xf4, 0x81, 0xc6, 0x19, 0xf4, 0xef, 0xda, 0x6f,
+    0xdb, 0x8d, 0xa2, 0xdf, 0x28, 0x45, 0x8d, 0x09, 0x60, 0x5e, 0xf2, 0xd3, 0x2a, 0xdd, 0xb0, 0x87,
+    0x27, 0xc5, 0x91, 0x46, 0xfe, 0x6c, 0xd3, 0x11, 0x61, 0x01, 0x11, 0x2a, 0x1e, 0x12, 0x6e, 0xe8,
+    0x72, 0x11, 0x46, 0x19, 0xf1, 0x67, 0x1d, 0xe6, 0x64, 0x83, 0x9f, 0xc1, 0x6f, 0xc1, 0x1c, 0x1f,
+    0xc5, 0x40, 0x35, 0x48, 0xef, 0xdc, 0x69, 0x37, 0xf5, 0xb7, 0xa9, 0x6c, 0x40, 0xff, 0x55, 0x58,
+    0xa1, 0xbf, 0x2b, 0x36, 0x10, 0x6e, 0xae, 0x14, 0xd3, 0x69, 0x57, 0xf9, 0x2f, 0x17, 0x3d, 0x82,
+    0x09, 0x9d, 0x5b, 0x92, 0xec, 0x1d, 0x81, 0xd1, 0xa7, 0x3a, 0x2b, 0x0c, 0x99, 0xe2, 0xa8, 0x3f,
+    0xfd, 0x01, 0xf4, 0xc6, 0x35, 0xb4, 0xa6, 0xa4, 0xac, 0xcd, 0xb1, 0x80, 0x23, 0x9a, 0x2a, 0x92,
+    0x47, 0xa2, 0x04, 0xe3, 0x62, 0xa5, 0xfb, 0x95, 0x0c, 0x67, 0x1e, 0xa3, 0xb6, 0x1b, 0x54, 0x38,
+    0xe9, 0xec, 0xf0, 0xc9, 0x41, 0xa7, 0xbe, 0x44, 0x5d, 0xda, 0x32, 0x8a, 0x65, 0x26, 0x50, 0xee,
+    0xb6, 0x19, 0xb0, 0x52, 0xf6, 0x87, 0xd7, 0x36, 0x50, 0x4d, 0x57, 0x6d, 0x7d, 0xf6, 0x12, 0xaf,
+    0x67, 0x16, 0x1b, 0x10, 0x51, 0xc5, 0x5f, 0xd8, 0xbf, 0x85, 0x66, 0xa4, 0x91, 0xb5, 0x41, 0x5b,
+    0x2b, 0x2a, 0x66, 0xbc, 0x25, 0x51, 0xfb, 0x89, 0x91, 0x6f, 0x85, 0x38, 0x49, 0xac, 0x1b, 0x80,
+    0x23, 0x03, 0x0c, 0x85, 0x6e, 0x55, 0xf0, 0x76, 0x1b, 0xff, 0x12, 0xc8, 0xe0, 0x74, 0x20, 0xb4,
+    0x0c, 0x78, 0xd7, 0xfe, 0x20, 0x83, 0xdc, 0xc7, 0x7a, 0x47, 0xf1, 0xa7, 0x74, 0xfd, 0xa7, 0x8a,
+    0x87, 0xea, 0xd8, 0x4c, 0xc8, 0xdb, 0x6e, 0x9d, 0x15, 0x90, 0xe5, 0x47, 0xeb, 0xfe, 0xd7, 0xe8,
+    0x9d, 0xb8, 0x0e, 0x4f, 0x53, 0xf2, 0xcf, 0xc4, 0xee, 0xe5, 0x2a, 0x89, 0xe0, 0x61, 0x04, 0x1b,
+    0x43, 0x2a, 0x48, 0x4d, 0xc4, 0x79, 0xb5, 0x6c, 0x5a, 0xea, 0xbe, 0xce, 0xee, 0x55, 0xa4, 0x3b,
+    0x85, 0xff, 0x83, 0x6c, 0x68, 0xb1, 0xa1, 0xf9, 0x01, 0x47, 0x0a, 0x8e, 0xa7, 0xaf, 0xc1, 0x08,
+    0x68, 0xf2, 0xa3, 0x2b, 0x6c, 0x76, 0xd5, 0x4c, 0xef, 0x44, 0xf0, 0x2f, 0x66, 0xe4, 0xe6, 0xba,
+    0x58, 0xd7, 0x45, 0x98, 0x09, 0xda, 0x94, 0x86, 0xd3, 0xea, 0xc6, 0x9e, 0x4d, 0x83, 0x51, 0x06,
+    0x64, 0x8e, 0x87, 0x24, 0xcd, 0x75, 0xd8, 0x65, 0x23, 0xd8, 0x14, 0xcb, 0x32, 0x4e, 0x51, 0x55,
+    0x88, 0xbd, 0x30, 0xca, 0xbe, 0x15, 0x30, 0xde, 0x49, 0xa5, 0xb1, 0xec, 0x9e, 0x3c, 0x9a, 0x0a,
+    0xa6, 0x4c, 0x21, 0x83, 0x00, 0x2e, 0xe7, 0x2c, 0x7f, 0x9f, 0xc4, 0x6d, 0xc4, 0x23, 0xcc, 0xc8,
+    0x78, 0xef, 0x65, 0xd4, 0x1b, 0x2f, 0x73, 0xb0, 0x75, 0xa0, 0x84, 0xf9, 0x97, 0x42, 0xc2, 0x2c,
+    0xb6, 0x90, 0x64, 0xd5, 0x76, 0xd5, 0x86, 0x73, 0x4b, 0xb5, 0x8e, 0x1b, 0x43, 0x59, 0xc8, 0x8b,
+    0xda, 0x1c, 0x99, 0xe1, 0xe5, 0x69, 0x15, 0x10, 0xd4, 0xf7, 0xd4, 0x79, 0xb5, 0x6f, 0xf3, 0x77,
+    0xf2, 0xc1, 0x0d, 0x92, 0x23, 0x21, 0x00, 0x3a, 0x54, 0xb3, 0x44, 0x2c, 0x30, 0xce, 0x38, 0xf0,
+    0xf9, 0xf6, 0xfe, 0xe3, 0xd0, 0xd2, 0x8c, 0xa1, 0xde, 0xeb, 0x36, 0x67, 0xd3, 0xaf, 0xd1, 0x0a,
+    0x29, 0x71, 0xa4, 0x3e, 0xed, 0x05, 0xfe, 0xa4, 0xaf, 0x88, 0xb6, 0xae, 0x3a, 0x53, 0x5b, 0x9f,
+    0xb4, 0x9c, 0xec, 0x11, 0xc9, 0x00, 0x3f, 0x94, 0x3a, 0x8f, 0x6d, 0x47, 0x66, 0x9d, 0x81, 0x51,
+    0xb3, 0x66, 0x33, 0x75, 0x8d, 0x5b, 0x77, 0xe9, 0xfb, 0x0b, 0x96, 0xf7, 0x67, 0xcf, 0x92, 0xef,
+    0xe8, 0xde, 0xb9, 0x3f, 0x86, 0xda, 0xdb, 0x78, 0xac, 0x4d, 0xb1, 0x52, 0x1f, 0xfa, 0xa7, 0x88,
+    0xe6, 0xba, 0xdc, 0xff, 0x53, 0x87, 0xdb, 0x12, 0x5e, 0xb1, 0x1f, 0xd4, 0xc2, 0x14, 0x7a, 0x63,
+    0x9b, 0x74, 0x8f, 0x01, 0x51, 0xb6, 0x81, 0x3f, 0xea, 0xd6, 0xe7, 0x2b, 0x66, 0xef, 0xb3, 0x85,
+    0x04, 0xa9, 0x92, 0x78, 0x4e, 0xa0, 0xb9, 0x0e, 0xd7, 0xe3, 0x44, 0xe6, 0x34, 0xdf, 0x05, 0x7f,
+    0x3e, 0xa2, 0x06, 0x94, 0xab, 0xba, 0x1c, 0x68, 0x36, 0x8a, 0x7c, 0x16, 0x91, 0x18, 0xa9, 0x82,
+    0x7c, 0x84, 0x5b, 0x47, 0x5b, 0x3d, 0x5a, 0x34, 0xd0, 0x2a, 0x84, 0x28, 0xba, 0x62, 0x5d, 0x63,
+    0x47, 0x15, 0xfb, 0x49, 0xa7, 0xb4, 0xb8, 0xa6, 0xb0, 0x63, 0x92, 0x79, 0xe6, 0x9e, 0xf1, 0x8d,
+    0x33, 0x4c, 0x1c, 0x94, 0x64, 0x3a, 0x56, 0xf6, 0xbe, 0x68, 0xa1, 0x44, 0x44, 0xd9, 0xa1, 0x67,
+    0x0e, 0x1a, 0x6c, 0x46, 0x5d, 0xac, 0xa4, 0xee, 0x88, 0x86, 0x76, 0x8e, 0xe5, 0x96, 0xd0, 0x38,
+    0x6e, 0xd5, 0x83, 0x3e, 0x30, 0x3c, 0xd0, 0xf5, 0xf0, 0x4a, 0xa0, 0x54, 0xb9, 0x72, 0x87, 0x23,
+    0x71, 0x28, 0x3d, 0x32, 0xc6, 0x7a, 0xe3, 0x5f, 0x42, 0x9b, 0xe4, 0x43, 0x81, 0x32, 0x55, 0x84,
+    0xf4, 0x43, 0x15, 0x9f, 0x91, 0x90, 0xd0, 0xf4, 0xaa, 0xbb, 0xf4, 0x51, 0xbe, 0xb2, 0x99, 0x8d,
+    0xde, 0x68, 0xf1, 0x0f, 0xf4, 0xa1, 0xe4, 0x50, 0x42, 0xab, 0x74, 0x21, 0xd1, 0x35, 0xe2, 0x3b,
+    0x47, 0xf3, 0xd1, 0xbf, 0x9d, 0x41, 0x11, 0x6d, 0x4d, 0xca, 0x84, 0x18, 0x0b, 0xa4, 0xd1, 0x3b,
+    0xb0, 0x5c, 0x33, 0x49, 0x3b, 0x8a, 0x49, 0xa2, 0xf6, 0x43, 0x90, 0xee, 0xc5, 0xf2, 0x1e, 0x5b,
+    0xb5, 0x0c, 0x73, 0x10, 0xf4, 0xcd, 0xc7, 0x2a, 0x49, 0x66, 0x58, 0x08, 0x99, 0x15, 0xcb, 0xb5,
+    0xf6, 0x43, 0x83, 0x71, 0x53, 0x3c, 0x4d, 0xb9, 0x25, 0xc6, 0x0a, 0x33, 0xe1, 0x1e, 0xc5, 0x25,
+    0x23, 0x9e, 0xc0, 0xa8, 0x66, 0xe7, 0x63, 0xcf, 0x9d, 0xc5, 0x6c, 0xd5, 0x01, 0xdf, 0x14, 0xc8,
+    0xc8, 0xd3, 0xbf, 0x43, 0x6a, 0xb8, 0x8a, 0xe3, 0x3e, 0x9a, 0x40, 0xa8, 0xf0, 0xef, 0x27, 0xf0,
+    0x1a, 0x02, 0xe8, 0xa0, 0x3c, 0x4e, 0x2b, 0xee, 0x90, 0x35, 0x24, 0x6b, 0xd6, 0x8a, 0xa6, 0xe6,
+    0xd2, 0x95, 0x89, 0x02, 0xde, 0xdf, 0xc1, 0x19, 0xab, 0x94, 0x17, 0xf8, 0x84, 0xab, 0xd0, 0x28,
+    0x3a, 0xb9, 0xf2, 0x2f, 0x32, 0x4d, 0xcb, 0xfd, 0x6f, 0xf6, 0x96, 0xed, 0x17, 0x60, 0xfc, 0xd6,
+    0xfa, 0x11, 0x9d, 0x8e, 0x83, 0xfe, 0xc6, 0xb6, 0x45, 0x8c, 0x7a, 0xe2, 0x5b, 0x59, 0x86, 0x40,
+    0x44, 0xac, 0x0f, 0x7e, 0x0e, 0x27, 0xe5, 0x09, 0x22, 0xe0, 0x6e, 0x98, 0xf7, 0x75, 0xe5, 0x1a,
+    0x64, 0xa7, 0x4b, 0x17, 0x8c, 0x9f, 0xba, 0x90, 0x7e, 0xea, 0x98, 0xf3, 0xd8, 0x41, 0x98, 0x3e,
+    0x08, 0x6f, 0xb6, 0x18, 0x2c, 0xdb, 0x74, 0xf1, 0x67, 0xb4, 0xb1, 0x45, 0xbe, 0x2e, 0x0c, 0xf0,
+    0xff, 0x9e, 0x90, 0xe1, 0x8e, 0x90, 0x72, 0x25, 0xa7, 0xa2, 0x4c, 0x34, 0xdf, 0x5e, 0x41, 0x5e,
+    0x61, 0xd7, 0x26, 0x1d, 0x9f, 0x9d, 0x09, 0x31, 0x41, 0x04, 0x0f, 0x29, 0x6a, 0x7b, 0x02, 0x0c,
+    0x81, 0x21, 0x1b, 0xa0, 0x1a, 0xbb, 0xc7, 0x46, 0xae, 0x36, 0x5c, 0x92, 0x9f, 0x03, 0x41, 0x6b,
+    0xa1, 0x1c, 0xc9, 0x1d, 0xf9, 0x48, 0xe7, 0xc3, 0xf6, 0xb2, 0xcd, 0x56, 0xca, 0x6b, 0x31, 0xd9,
+    0x85, 0x0a, 0x19, 0xf8, 0x13, 0x86, 0xab, 0x7c, 0x54, 0x97, 0x6a, 0xb5, 0x3f, 0x94, 0x50, 0x90,
+    0x63, 0xdf, 0x9c, 0x65, 0xd1, 0x1d, 0x9d, 0x67, 0x0a, 0x39, 0x66, 0x73, 0x53, 0x4c, 0x5c, 0x8a,
+    0xd4, 0x73, 0x9b, 0x29, 0x58, 0xb6, 0x58, 0xd1, 0x5f, 0x89, 0x4f, 0x88, 0x1b, 0xf4, 0x74, 0xee,
+    0x25, 0x0d, 0x77, 0x04, 0x9c, 0xbb, 0x53, 0xa2, 0xfe, 0x14, 0x4c, 0xae, 0xcd, 0x4d, 0x24, 0xc4,
+    0x2f, 0x6f, 0x0f, 0x69, 0x6b, 0x4b, 0x5f, 0x34, 0x11, 0x5c, 0x0b, 0xa8, 0x2b, 0x4d, 0xde, 0x9f,
+    0x41, 0xac, 0x9a, 0x80, 0x76, 0x5a, 0xe2, 0xe1, 0xcd, 0x2c, 0x12, 0x85, 0x85, 0xce, 0x49, 0x1c,
+    0xb4, 0xf8, 0x82, 0x10, 0xe6, 0x8a, 0x15, 0x00, 0xc7, 0x6f, 0xcb, 0xde, 0x9c, 0xd8, 0xb3, 0x21,
+    0x42, 0xde, 0x80, 0xab, 0x1c, 0x7e, 0x14, 0x8e, 0xf7, 0x76, 0x36, 0x49, 0xbc, 0x0f, 0xb6, 0xbc,
+    0xaf, 0x9e, 0x44, 0xde, 0x7a, 0x43, 0xb6, 0x9b, 0xf9, 0x93, 0xfa, 0x5f, 0xf1, 0x90, 0xb9, 0x16,
+    0x3d, 0x14, 0x38, 0xf9, 0xae, 0x15, 0x04, 0x90, 0x09, 0x3d, 0x3e, 0xd1, 0x52, 0xfc, 0xfd, 0xea,
+    0xa4, 0xb8, 0x9b, 0x28, 0x94, 0x6f, 0x71, 0xde, 0x05, 0x05, 0x71, 0x15, 0xb5, 0x42, 0xbd, 0x72,
+    0x58, 0x01, 0x56, 0x3a, 0xfc, 0xf4, 0x7f, 0xc6, 0x7d, 0x03, 0xb9, 0x01, 0x2a, 0x58, 0x0e, 0xc3,
+    0xee, 0x48, 0x5d, 0xb7, 0x25, 0x54, 0x48, 0x5b, 0x93, 0xdb, 0x59, 0x80, 0x06, 0xbc, 0x6b, 0x80,
+    0xc5, 0xd2, 0xdc, 0xd2, 0x29, 0x88, 0x46, 0x68, 0xd2, 0xa7, 0x43, 0xa0, 0xa1, 0x66, 0x7d, 0x5a,
+    0xb5, 0x1d, 0x28, 0x32, 0x18, 0x48, 0x1b, 0xc4, 0x17, 0x66, 0x65, 0x0e, 0xad, 0x96, 0x14, 0x1a,
+    0x4e, 0x8b, 0xa5, 0xa9, 0xcb, 0x7d, 0xd8, 0xda, 0x52, 0xf9, 0x77, 0x5b, 0x18, 0x7e, 0x99, 0xd9,
+    0xf9, 0x71, 0x1f, 0x47, 0x77, 0x85, 0xd6, 0x8d, 0xf1, 0x1f, 0x45, 0xaf, 0xf8, 0x22, 0x69, 0xe9,
+    0x4c, 0x8f, 0x2e, 0xc2, 0x63, 0x0d, 0x90, 0x1d, 0x06, 0x71, 0x70, 0x99, 0x0d, 0x60, 0x4b, 0xe9,
+    0x4f, 0xd5, 0x80, 0x6e, 0xf3, 0xbe, 0x09, 0x59, 0xda, 0x49, 0xa4, 0xec, 0x49, 0x44, 0xed, 0x4b,
+    0x0b, 0xdc, 0xe1, 0xdd, 0x41, 0x5f, 0x6d, 0xb9, 0x4a, 0xda, 0x0a, 0x4f, 0xe4, 0x13, 0x65, 0x81,
+    0x40, 0xc1, 0xea, 0x69, 0xa8, 0x63, 0xc5, 0x62, 0x3b, 0xca, 0xad, 0x97, 0xdf, 0x20, 0x45, 0xf6,
+    0xaa, 0x4a, 0x5f, 0x57, 0x6b, 0x88, 0xc9, 0x11, 0xca, 0xac, 0x1e, 0x60, 0xf2, 0x63, 0x45, 0x52,
+    0xf9, 0xc6, 0x7c, 0x13, 0x4e, 0x4c, 0x7b, 0xc2, 0xfc, 0x19, 0xb8, 0x1a, 0x35, 0xc1, 0x58, 0x42,
+    0xd1, 0x21, 0xa0, 0x7e, 0xc1, 0x9a, 0xfe, 0xbd, 0xad, 0x61, 0xb9, 0x21, 0x06, 0xaa, 0x87, 0x2b,
+    0x9a, 0x33, 0xc4, 0x87, 0x12, 0xb8, 0x07, 0xdf, 0xcc, 0x99, 0x60, 0x86, 0x8e, 0x92, 0x17, 0x7b,
+    0x58, 0x07, 0x19, 0xf3, 0x34, 0xa8, 0xc6, 0xf5, 0x51, 0xdc, 0x10, 0x29, 0xb6, 0xbf, 0x5a, 0xc1,
+    0xcf, 0x56, 0x97, 0x91, 0x91, 0x0f, 0x69, 0xc6, 0x94, 0x98, 0xe7, 0x0a, 0x09, 0xba, 0xe2, 0x46,
+    0x22, 0xb3, 0x7c, 0xa3, 0x96, 0x4d, 0xdf, 0x4a, 0x1f, 0x79, 0xb9, 0xf5, 0xc3, 0x9c, 0x94, 0x13,
+    0x0f, 0x4b, 0x6d, 0xd0, 0xe5, 0xf8, 0x37, 0x48, 0x23, 0xc8, 0x07, 0x12, 0xb2, 0x11, 0xed, 0xc5,
+    0xf1, 0xa2, 0xe5, 0x95, 0xc6, 0xe0, 0xcc, 0x9a, 0x0c, 0xea, 0x10, 0x8b, 0xd1, 0x3f, 0xfe, 0x77,
+    0xfa, 0x4d, 0x5e, 0x36, 0x3d, 0xb8, 0x26, 0x1f, 0x66, 0x65, 0xf9, 0x49, 0xe2, 0x66, 0xeb, 0xdb,
+    0xca, 0x41, 0xb3, 0xae, 0x4d, 0xfa, 0x50, 0x56, 0x5c, 0x50, 0x0b, 0x46, 0x53, 0xc8, 0x8c, 0x7c,
+    0x0d, 0x3d, 0x46, 0xe6, 0x23, 0x7b, 0x47, 0x23, 0x78, 0xdb, 0x63, 0xfb, 0xf1, 0x22, 0x02, 0x15,
+    0x62, 0x05, 0x55, 0xaa, 0xd3, 0x71, 0x75, 0x54, 0x48, 0x17, 0x27, 0x39, 0x95, 0x1d, 0xa8, 0x99,
+    0x28, 0xa3, 0x4f, 0xce, 0xa7, 0x6a, 0x0b, 0x9b, 0x83, 0x20, 0xbc, 0xc1, 0xea, 0xa6, 0x60, 0x4f,
+    0x5e, 0xec, 0x60, 0x15, 0x6a, 0x78, 0xe6, 0xe9, 0x81, 0x6c, 0x18, 0x0f, 0x55, 0x35, 0xec, 0x1b,
+    0x06, 0xba, 0xb1, 0x6f, 0x7d, 0xcd, 0xe4, 0x7e, 0x1d, 0x8f, 0x3e, 0xb1, 0xe2, 0x5a, 0xed, 0x4a,
+    0xc5, 0x62, 0x66, 0xec, 0xca, 0xcc, 0xed, 0x0c, 0x83, 0x7c, 0xca, 0x15, 0x78, 0x47, 0x29, 0xb0,
+    0xb3, 0x67, 0x7f, 0x49, 0xb3, 0xfd, 0x10, 0x1b, 0x1e, 0xc7, 0xa4, 0x4a, 0xff, 0x9e, 0xca, 0xb9,
+    0x3a, 0xf6, 0x95, 0x55, 0xa5, 0x3d, 0x55, 0x5a, 0xb9, 0xff, 0x07, 0xb7, 0x77, 0xaf, 0x4d, 0x0d,
+    0x6d, 0x92, 0x26, 0x72, 0x0f, 0xc1, 0x70, 0xd3, 0x71, 0xb0, 0xad, 0xdc, 0xae, 0x9e, 0x33, 0x15,
+    0xfb, 0x6d, 0xac, 0xed, 0x5a, 0xf1, 0x0c, 0xc6, 0x4e, 0x1f, 0xcf, 0x03, 0xd1, 0xb9, 0x21, 0xeb,
+    0x35, 0xc1, 0x72, 0x08, 0xfe, 0x1f, 0xce, 0x85, 0x36, 0xf5, 0xb1, 0xc5, 0x6d, 0xcb, 0x7f, 0x40,
+    0xc7, 0x02, 0x56, 0xdd, 0x0c, 0x86, 0x43, 0xde, 0xed, 0x1f, 0x11, 0xd8, 0xb3, 0x8d, 0x44, 0x8c,
+    0x64, 0x2e, 0x43, 0x97, 0xd4, 0x5f, 0xc0, 0x79, 0xc0, 0x3b, 0xf2, 0x67, 0xe8, 0xa6, 0x08, 0xc3,
+    0x45, 0x14, 0x25, 0x46, 0x33, 0xd8, 0x83, 0x43, 0x8b, 0x0c, 0x72, 0x4f, 0xca, 0x4e, 0x4c, 0xa8,
+    0x31, 0xf0, 0x7d, 0xef, 0xe1, 0xd8, 0xcc, 0xa5, 0x5b, 0x3a, 0xee, 0x4e, 0xc1, 0x6f, 0x48, 0x4b,
+    0xe8, 0xb0, 0x83, 0x7d, 0x55, 0xe7, 0x80, 0xca, 0x0c, 0xed, 0xe7, 0x6d, 0x10, 0x35, 0x9d, 0xc9,
+    0x44, 0x0f, 0x7a, 0x81, 0xd5, 0x5e, 0xd0, 0x18, 0x3b, 0x38, 0x13, 0x84, 0x9e, 0xe1, 0x3b, 0x00,
+    0xb9, 0xf6, 0xc0, 0x44, 0xcd, 0x8a, 0x84, 0x0c, 0x50, 0x2b, 0x8c, 0x61, 0xb2, 0x14, 0x9b, 0xbd,
+    0x22, 0xaa, 0x3a, 0x6c, 0x85, 0x48, 0xa9, 0xc1, 0x0e, 0xf7, 0xc2, 0xc6, 0xe7, 0xa6, 0xf5, 0xfb,
+    0xb0, 0xe6, 0xe7, 0x77, 0xa5, 0xa8, 0xe1, 0xea, 0xda, 0x63, 0xeb, 0x48, 0x7c, 0x12, 0x8f, 0xa1,
+    0x1f, 0x01, 0xa6, 0x5e, 0x24, 0xc6, 0x4d, 0x58, 0x29, 0x50, 0xf3, 0x0e, 0x54, 0x37, 0xee, 0x39,
+    0x1c, 0xc1, 0x22, 0xb3, 0x31, 0xc7, 0xa3, 0x7b, 0x47, 0x63, 0x7e, 0x60, 0x23, 0xe5, 0xe4, 0xa5,
+    0x47, 0x34, 0x8e, 0x12, 0xa0, 0x1b, 0x88, 0x53, 0xc3, 0x03, 0x1b, 0x9b, 0xba, 0xaa, 0x06, 0xad,
+    0x77, 0xd3, 0x8a, 0x2d, 0xe1, 0xe9, 0x18, 0xb2, 0xa5, 0x17, 0x78, 0x34, 0x9c, 0x11, 0x69, 0xc2,
+    0x5c, 0xbd, 0x1b, 0xa4, 0xa0, 0xb0, 0x49, 0xf2, 0x14, 0x78, 0x3d, 0x6f, 0x16, 0xd2, 0x87, 0x97,
+    0xd0, 0x63, 0xf2, 0x1d, 0x70, 0x33, 0x06, 0x2c, 0x1d, 0xf5, 0xc8, 0x07, 0x0e, 0x04, 0x92, 0x78,
+    0x6a, 0xf7, 0xdf, 0xf9, 0xf9, 0x72, 0x20, 0x87, 0x23, 0x88, 0xe6, 0xfc, 0x6e, 0xee, 0xb5, 0x96,
+    0x7e, 0xa0, 0xb8, 0x5a, 0xd1, 0x3e, 0x58, 0x73, 0xde, 0xfe, 0x04, 0x58, 0x69, 0x30, 0x0a, 0x9c,
+    0x71, 0x23, 0x02, 0x83, 0xb4, 0xca, 0xe2, 0x14, 0x12, 0x96, 0xcd, 0x78, 0xbd, 0x50, 0xae, 0x81,
+    0x91, 0xd6, 0x71, 0x9d, 0x41, 0xee, 0xc5, 0x27, 0xff, 0xcf, 0xb3, 0xd6, 0x84, 0x7b, 0xce, 0x8f,
+    0xc5, 0x70, 0x84, 0x80, 0xe0, 0xec, 0x0f, 0xe9, 0x29, 0x47, 0x6b, 0x31, 0xd8, 0x0c, 0xb7, 0x2f,
+    0xda, 0x3a, 0x3e, 0xd9, 0x5b, 0x2f, 0x07, 0x77, 0x45, 0x11, 0xa0, 0x04, 0x8c, 0x4e, 0x5a, 0x0a,
+    0x19, 0x04, 0x51, 0xde, 0xde, 0x50, 0xfb, 0x4b, 0x04, 0x25, 0x66, 0xf6, 0xbf, 0x00, 0xe7, 0x9b,
+    0x3c, 0x6a, 0xf4, 0x2c, 0x20, 0xd4, 0x8a, 0xb9, 0xaa, 0x01, 0xe7, 0xa9, 0x93, 0x87, 0x2d, 0x87,
+    0x2e, 0x9e, 0xed, 0x1a, 0x9d, 0xa7, 0x3f, 0x17, 0x69, 0xc6, 0xb9, 0x7a, 0x96, 0x3c, 0x40, 0xd8,
+    0x91, 0xb1, 0x1c, 0xde, 0x7f, 0x69, 0x1c, 0xb2, 0x10, 0xfd, 0xa8, 0x7a, 0x71, 0x83, 0x50, 0xdc,
+    0x83, 0xf5, 0x32, 0xcb, 0xb6, 0x81, 0x35, 0xb2, 0xf2, 0x0e, 0x9a, 0x9e, 0x20, 0xac, 0x24, 0x11,
+    0xe4, 0x04, 0x91, 0x86, 0x79, 0x74, 0x96, 0x9f, 0x36, 0x82, 0x64, 0x11, 0x0c, 0xca, 0x67, 0xac,
+    0x5c, 0xfd, 0xf3, 0xa5, 0x31, 0xc0, 0x14, 0x94, 0x13, 0x47, 0x36, 0x16, 0x27, 0x52, 0x22, 0x27,
+    0xe8, 0xfd, 0xba, 0x80, 0xa0, 0xee, 0xc8, 0x4b, 0x85, 0x97, 0x07, 0x24, 0x7a, 0x68, 0x2d, 0xd4,
+    0x43, 0x02, 0xa1, 0xcf, 0x4c, 0x67, 0x96, 0x35, 0xa9, 0x86, 0xd6, 0xa6, 0x0b, 0xca, 0xe9, 0xe9,
+    0x46, 0x14, 0xd1, 0xaf, 0xd4, 0x20, 0x1a, 0x38, 0xa5, 0x4d, 0x4e, 0x27, 0x1d, 0x5f, 0x30, 0x67,
+    0x9f, 0xeb, 0xb8, 0xae, 0x0d, 0x43, 0xb7, 0x4b, 0x12, 0x89, 0xbd, 0x22, 0x47, 0x85, 0x23, 0x73,
+    0x20, 0xa8, 0x02, 0x58, 0xef, 0x23, 0x59, 0x24, 0xd8, 0x3a, 0x71, 0x83, 0x5c, 0xef, 0xbd, 0x52,
+    0x9b, 0x92, 0x52, 0x56, 0xc3, 0x4f, 0x70, 0x0c, 0xfc, 0xd9, 0x3c, 0xb8, 0xf8, 0x54, 0xb5, 0xf7,
+    0x99, 0x0a, 0xb1, 0x34, 0x2a, 0x12, 0x1f, 0x0c, 0x46, 0x64, 0x62, 0x52, 0xb4, 0xd0, 0x1a, 0x3a,
+    0xda, 0x94, 0x64, 0xe6, 0x7a, 0x1a, 0xde, 0x63, 0x2d, 0xda, 0x1f, 0x8e, 0x80, 0x3b, 0x65, 0xad,
+    0x0f, 0xcd, 0x40, 0x82, 0x83, 0xe6, 0x3c, 0x1a, 0x61, 0xd4, 0xef, 0x92, 0x9a, 0x5c, 0x48, 0x96,
+    0xb5, 0x68, 0xc4, 0x89, 0xfb, 0xe1, 0xbc, 0x49, 0x86, 0x75, 0xcd, 0x00, 0xf9, 0x3d, 0x88, 0xce,
+    0x5f, 0x7b, 0x36, 0x61, 0xd2, 0xcc, 0xfe, 0x31, 0xa2, 0x52, 0x72, 0x28, 0xf9, 0x97, 0xe4, 0x65,
+    0x80, 0x3b, 0x32, 0x53, 0x6e, 0x46, 0xb7, 0xd7, 0x54, 0xea, 0xe8, 0xcd, 0x26, 0x47, 0x2b, 0x18,
+    0xa9, 0xe1, 0xd3, 0x8e, 0x28, 0xec, 0x85, 0xcd, 0xf0, 0xa2, 0xdd, 0x67, 0x2e, 0xdf, 0xe1, 0xf1,
+    0xeb, 0xff, 0xa7, 0xe9, 0x25, 0x40, 0x28, 0x94, 0x17, 0xc7, 0x6e, 0x2c, 0x1f, 0xda, 0x0e, 0xde,
+    0xc6, 0x61, 0x9f, 0x6d, 0xd8, 0xc3, 0x59, 0x6a, 0xad, 0x02, 0xe7, 0xda, 0xe0, 0xfb, 0xff, 0xfc,
+    0x06, 0x13, 0xc0, 0x36, 0x84, 0x5e, 0x2b, 0x58, 0x17, 0xa2, 0xcb, 0x44, 0x85, 0x81, 0x7d, 0xf8,
+    0xc7, 0x63, 0x67, 0x02, 0x5e, 0x88, 0xe1, 0x84, 0xc0, 0xf6, 0x52, 0xc0, 0x16, 0x94, 0x1a, 0xd5,
+    0x54, 0x9a, 0xde, 0xf3, 0xc8, 0xc2, 0x2b, 0x21, 0x4e, 0x4e, 0xe7, 0x9d, 0x55, 0xd2, 0xc6, 0xeb,
+    0x76, 0xd5, 0x8c, 0x13, 0x6b, 0xeb, 0x17, 0x38, 0xdd, 0x20, 0xea, 0xbb, 0xe3, 0xc6, 0x42, 0xd9,
+    0xd8, 0xa3, 0x45, 0x98, 0xd8, 0x51, 0xab, 0xdf, 0xee, 0xd3, 0xc5, 0xda, 0xe6, 0x93, 0xb9, 0xd8,
+    0xbf, 0x6e, 0x22, 0xec, 0xc5, 0xd5, 0x91, 0x2b, 0x3d, 0x0a, 0xfe, 0x63, 0xc4, 0x94, 0x80, 0xd0,
+    0xbe, 0xcd, 0x12, 0xb3, 0xe7, 0x51, 0x01, 0x6d, 0x0f, 0x51, 0x46, 0x3e, 0xe4, 0xf1, 0x31, 0x95,
+    0x25, 0x8d, 0xdc, 0xf1, 0x02, 0x0b, 0x3b, 0xaa, 0x11, 0x59, 0x5b, 0x03, 0x30, 0x8f, 0x1b, 0x43,
+    0xaf, 0x2b, 0x33, 0xb5, 0xcf, 0x6f, 0x53, 0xf9, 0x17, 0x3c, 0xeb, 0x7b, 0xf4, 0x62, 0x39, 0x00,
+    0xa4, 0x36, 0x93, 0x42, 0xc9, 0xfe, 0xf5, 0x75, 0xc9, 0x8a, 0x41, 0xd4, 0x86, 0x5f, 0xe5, 0x0b,
+    0xa6, 0x94, 0xb4, 0xab, 0x8b, 0x77, 0x58, 0x3d, 0x3d, 0x38, 0xef, 0x3f, 0xd5, 0x75, 0x78, 0x1b,
+    0x67, 0x3b, 0x8f, 0xa7, 0x5a, 0x07, 0x60, 0x2f, 0x94, 0x9c, 0x55, 0xf5, 0x2f, 0x8c, 0x37, 0xad,
+    0x2b, 0x1c, 0x13, 0x77, 0xa9, 0x87, 0x08, 0x76, 0xed, 0x69, 0xbe, 0xf3, 0xb6, 0x48, 0xef, 0xb8,
+    0xaa, 0x98, 0xfd, 0x79, 0x3c, 0x67, 0xc1, 0xd8, 0x6a, 0xb0, 0xad, 0x00, 0x3a, 0xd5, 0xae, 0xf9,
+    0xbe, 0x3c, 0xb1, 0x39, 0x06, 0xf1, 0x92, 0x70, 0x73, 0xc3, 0x63, 0xad, 0x84, 0x29, 0x0f, 0x67,
+    0x81, 0x0f, 0x8d, 0xd3, 0x20, 0x9c, 0x75, 0x13, 0x9b, 0x66, 0xfc, 0x3c, 0x8a, 0x89, 0x8d, 0x6d,
+    0x16, 0xec, 0x23, 0xf2, 0xdb, 0x26, 0x22, 0x61, 0xfa, 0xcb, 0x4b, 0xf5, 0x9c, 0xd7, 0x3c, 0x53,
+    0x51, 0x7a, 0x4f, 0xc7, 0x3c, 0x02, 0x3f, 0xfa, 0x4f, 0x29, 0x13, 0x84, 0xde, 0x3c, 0x21, 0xad,
+    0xb3, 0x77, 0x83, 0x3b, 0x3f, 0x50, 0x4d, 0x56, 0xd6, 0x55, 0x79, 0xf7, 0x4b, 0xdf, 0x72, 0x74,
+    0x60, 0x48, 0x9f, 0x52, 0xa9, 0x53, 0x73, 0xf7, 0x93, 0x1c, 0xf5, 0x32, 0xa7, 0xb2, 0xc3, 0x7e,
+    0x5f, 0xa4, 0x24, 0xbf, 0x33, 0x28, 0x31, 0xd2, 0x02, 0x10, 0x75, 0x20, 0xa1, 0x50, 0x33, 0x9c,
+    0xda, 0xaf, 0x6b, 0x08, 0xc7, 0xf4, 0xb8, 0x89, 0xbd, 0x9c, 0x26, 0xe0, 0x5a, 0x95, 0x1d, 0x45,
+    0x42, 0x3f, 0xd0, 0x78, 0x1b, 0xf7, 0xd7, 0x37, 0xf9, 0x08, 0xa1, 0xd9, 0x6e, 0x78, 0x34, 0x0e,
+    0xab, 0x8e, 0xcc, 0x97, 0xe7, 0x32, 0xaa, 0x2c, 0x68, 0x1b, 0x83, 0xb9, 0x9a, 0x3b, 0x3a, 0xe7,
+    0xd0, 0x52, 0xa4, 0xf2, 0x97, 0xf1, 0x1c, 0x11, 0x7e, 0xc6, 0x52, 0x53, 0x43, 0x8d, 0x37, 0xad,
+    0x7d, 0xba, 0x6d, 0xab, 0xa4, 0x05, 0x34, 0xad, 0x60, 0x15, 0x13, 0xe3, 0x2f, 0x55, 0xbc, 0x1b,
+    0xef, 0x1c, 0x6c, 0x58, 0xcc, 0x3d, 0xf6, 0x4b, 0x16, 0xe3, 0x1a, 0xb5, 0xeb, 0x51, 0xc3, 0xa9,
+    0xdf, 0x1b, 0x76, 0x69, 0x4c, 0xdd, 0xe7, 0x8d, 0xb5, 0x8b, 0xfe, 0x28, 0xef, 0x2f, 0xda, 0xdc,
+    0x50, 0xf8, 0xcc, 0xc4, 0x60, 0x41, 0xad, 0x6e, 0x6a, 0x43, 0xb6, 0x53, 0x75, 0xa8, 0x57, 0xc6,
+    0x48, 0x38, 0x6a, 0xd0, 0x91, 0x99, 0x84, 0x6c, 0x44, 0xd9, 0x87, 0x9c, 0x20, 0xaf, 0x9e, 0x49,
+    0x72, 0xcb, 0xeb, 0x18, 0x17, 0x1c, 0x6b, 0xa5, 0x72, 0x45, 0x37, 0x85, 0xe2, 0x50, 0xbc, 0xfd,
+    0x02, 0x4b, 0x1e, 0x45, 0x78, 0x8a, 0x16, 0xef, 0xce, 0x9f, 0x76, 0x3f, 0x11, 0xd3, 0x96, 0x5d,
+    0xd1, 0x69, 0x10, 0x59, 0x04, 0xd2, 0xf5, 0x1f, 0x8e, 0xb6, 0x13, 0xe0, 0x05, 0x82, 0x6a, 0xc5,
+    0x78, 0x02, 0x54, 0x63, 0xb5, 0x2b, 0x7d, 0x27, 0x8f, 0xe7, 0xed, 0xba, 0xcb, 0xe1, 0xb5, 0x23,
+    0x03, 0x12, 0x17, 0xe6, 0x07, 0x1e, 0x3b, 0x05, 0xf9, 0xa0, 0xa5, 0x09, 0x33, 0x50, 0x4c, 0x46,
+    0x9a, 0x47, 0xdd, 0xc6, 0x37, 0x1b, 0xa1, 0x76, 0xd8, 0x05, 0x5d, 0x49, 0xef, 0xbf, 0xa3, 0xea,
+    0xdd, 0x25, 0x1c, 0x70, 0xee, 0x46, 0xfc, 0x07, 0x10, 0x21, 0x5b, 0xaf, 0x89, 0x71, 0x1c, 0x48,
+    0x4f, 0x8d, 0x12, 0xf4, 0x27, 0x68, 0xb3, 0xac, 0xc3, 0xad, 0xbb, 0xde, 0xa9, 0x1e, 0xb2, 0x99,
+    0xbc, 0xbf, 0xbe, 0xbb, 0x0e, 0x09, 0xb3, 0xc8, 0xae, 0xbd, 0xe1, 0xc5, 0xc8, 0x3b, 0x0d, 0xe3,
+    0x18, 0x41, 0xb0, 0xc0, 0xf6, 0x09, 0x66, 0x06, 0x3b, 0xe4, 0xfb, 0xb4, 0x4f, 0x27, 0x5b, 0x19,
+    0xc6, 0x98, 0x63, 0x1d, 0x75, 0x1d, 0x5d, 0x1c, 0x20, 0xc5, 0x49, 0x8c, 0x74, 0x75, 0xfa, 0x0b,
+    0x64, 0xb3, 0x2a, 0x48, 0x6e, 0x2b, 0xfd, 0x4b, 0x3b, 0xa0, 0x51, 0xc6, 0xe8, 0x94, 0x0c, 0x77,
+    0x0c, 0x7f, 0x8a, 0x35, 0x6d, 0xba, 0x6d, 0x02, 0x94, 0xec, 0xe5, 0xed, 0xc2, 0x9f, 0xfd, 0x7f,
+    0x40, 0x27, 0xc1, 0x62, 0x70, 0xc6, 0x36, 0xf4, 0x49, 0xd7, 0x59, 0x08, 0x81, 0x64, 0x95, 0x2e,
+    0xe0, 0xc4, 0xf0, 0x76, 0x81, 0x06, 0xef, 0xc3, 0x5e, 0x76, 0x08, 0x6a, 0xaf, 0x48, 0x41, 0x5b,
+    0x41, 0x4d, 0x64, 0xe5, 0xd9, 0x62, 0xec, 0x96, 0x4e, 0x78, 0x00, 0x42, 0xd9, 0x67, 0xac, 0x10,
+    0xba, 0x26, 0x7b, 0xf9, 0x15, 0xd5, 0x42, 0xeb, 0xf9, 0x02, 0x99, 0xc5, 0xdd, 0x89, 0xab, 0x23,
+    0xc6, 0x07, 0x96, 0x92, 0xb7, 0xb5, 0xa9, 0x6e, 0x30, 0x5e, 0xc8, 0x17, 0x32, 0x66, 0x5d, 0xf7,
+    0xb4, 0x55, 0x16, 0xb4, 0xe7, 0x97, 0x1c, 0xf4, 0xe6, 0xe6, 0x7e, 0x8a, 0xe8, 0x56, 0x35, 0x5a,
+    0xed, 0xf2, 0x0f, 0x1d, 0xbc, 0x97, 0x1c, 0x12, 0xa9, 0x3d, 0xd0, 0xdd, 0x9c, 0xe6, 0x4c, 0xc3,
+    0x7b, 0x74, 0xf5, 0x22, 0x90, 0xa4, 0xfe, 0x8c, 0x88, 0xea, 0xd6, 0x4b, 0x5b, 0x90, 0x3e, 0x6b,
+    0x60, 0x89, 0x0b, 0xa1, 0xf3, 0xdc, 0xf9, 0x67, 0x84, 0x27, 0x37, 0x69, 0xb9, 0x79, 0x02, 0xa0,
+    0x23, 0x18, 0x3c, 0x46, 0xa4, 0xa7, 0x3f, 0x3e, 0x16, 0xb6, 0xdc, 0xba, 0x13, 0x32, 0x55, 0xf9,
+    0xd9, 0x18, 0x4a, 0xd3, 0x9b, 0x1c, 0x2a, 0xb1, 0xf1, 0x2d, 0xca, 0x54, 0xff, 0x9d, 0xc9, 0x6c,
+    0x2a, 0x71, 0x53, 0x06, 0x88, 0x58, 0xef, 0xd4, 0x52, 0x39, 0x6d, 0x23, 0xe0, 0x3c, 0x57, 0x25,
+    0x15, 0x8f, 0x9c, 0x57, 0x44, 0x88, 0x0e, 0x70, 0x05, 0x0c, 0x57, 0x6b, 0xef, 0x91, 0xf4, 0xcb,
+    0xea, 0xba, 0xe0, 0x94, 0x23, 0xb3, 0x96, 0xb0, 0xd7, 0x43, 0xaf, 0xcd, 0x5d, 0xc4, 0xf2, 0x67,
+    0x0b, 0x1f, 0xab, 0x8c, 0x58, 0xcf, 0xeb, 0x25, 0xb2, 0xa2, 0xc6, 0xc8, 0x44, 0x06, 0x56, 0xa9,
+    0x21, 0x98, 0xc0, 0xfe, 0x2b, 0x50, 0x71, 0x6e, 0x32, 0xc8, 0x92, 0x00, 0xbf, 0x9e, 0x21, 0x64,
+    0x3f, 0x40, 0x34, 0x05, 0x0f, 0x3e, 0xc2, 0xbc, 0x8d, 0x62, 0xf8, 0x47, 0x63, 0xf8, 0xa6, 0xc7,
+    0x31, 0x4f, 0xdf, 0x02, 0x2d, 0x8e, 0xd6, 0x61, 0x87, 0x41, 0xf2, 0xae, 0x6d, 0x96, 0x80, 0x98,
+    0xea, 0xd0, 0xce, 0xea, 0x89, 0xcd, 0x47, 0xc9, 0x1a, 0x3e, 0xe9, 0x38, 0x99, 0x9f, 0x34, 0x4b,
+    0xe2, 0xf7, 0xfb, 0xcd, 0xeb, 0x42, 0xfa, 0x62, 0x43, 0x17, 0xbd, 0x7c, 0xe7, 0xaf, 0xb8, 0xf4,
+    0x69, 0x65, 0x03, 0xe4, 0x17, 0x57, 0x8b, 0x0a, 0x90, 0x78, 0xc2, 0x2a, 0x49, 0x14, 0x11, 0x2a,
+    0x0f, 0x88, 0x2f, 0x3b, 0x29, 0x94, 0x7f, 0xee, 0xdd, 0xcd, 0xd9, 0x40, 0x7a, 0xa6, 0x96, 0xb9,
+    0x3a, 0xb9, 0x2e, 0x81, 0x08, 0xe9, 0x1d, 0x74, 0x08, 0x29, 0xd9, 0xc2, 0xea, 0x1b, 0xb2, 0x02,
+    0xbf, 0xc8, 0x9c, 0x27, 0xe1, 0x24, 0x3b, 0x55, 0x15, 0x00, 0xcf, 0x4a, 0x17, 0x09, 0x7d, 0x56,
+    0x8d, 0xb9, 0xcf, 0x24, 0xc4, 0x7a, 0xe2, 0x7b, 0x10, 0x3f, 0x3d, 0x00, 0x8b, 0xbc, 0xa6, 0x66,
+    0xa6, 0x22, 0x4f, 0x66, 0x1e, 0x43, 0x25, 0x5a, 0x59, 0xc3, 0x48, 0x4b, 0x46, 0x02, 0xf1, 0x3d,
+    0x22, 0x64, 0xe0, 0xd7, 0x1c, 0xc6, 0xd8, 0x1e, 0x62, 0x3a, 0xdb, 0xf5, 0x1b, 0xe6, 0xbe, 0x30,
+    0x27, 0xa8, 0x4f, 0x99, 0x66, 0x9a, 0xdd, 0xc0, 0xdb, 0x27, 0xcf, 0xa4, 0x40, 0x7a, 0x72, 0x14,
+    0x5c, 0x3f, 0x46, 0x38, 0xe0, 0x4d, 0x6b, 0x20, 0x98, 0x66, 0x0f, 0x25, 0x3a, 0x86, 0x4c, 0xaf,
+    0x9a, 0xb8, 0xb7, 0x2c, 0x9b, 0x41, 0x47, 0x72, 0x0e, 0xc6, 0x87, 0x7e, 0x97, 0x8d, 0xe8, 0x66,
+    0x1b, 0x95, 0xad, 0xdb, 0xa7, 0x08, 0x70, 0xaa, 0x28, 0x31, 0x1c, 0x23, 0xc8, 0xca, 0xb7, 0xa8,
+    0x4b, 0x1a, 0xbc, 0x7e, 0x9f, 0x5c, 0xca, 0xca, 0xdb, 0x54, 0x97, 0xbd, 0x58, 0x2c, 0x88, 0xda,
+    0xac, 0x6d, 0x7b, 0x23, 0xe4, 0x55, 0xb2, 0x99, 0xa6, 0x0e, 0x22, 0xfb, 0xf2, 0x5f, 0xe2, 0x04,
+    0x5d, 0xc8, 0x56, 0x31, 0x99, 0x3e, 0x1c, 0x02, 0x74, 0xaa, 0x27, 0x36, 0xd5, 0x61, 0xc0, 0x92,
+    0xe9, 0xc4, 0xd8, 0x72, 0x35, 0x0a, 0x14, 0xbf, 0x25, 0x02, 0x76, 0x21, 0xd7, 0xbf, 0x7e, 0x3f,
+    0x82, 0xf8, 0x13, 0x0b, 0x45, 0x9c, 0xc3, 0x0d, 0xd7, 0x3e, 0xa8, 0xbe, 0xff, 0x37, 0xec, 0x70,
+    0x23, 0x0a, 0x5d, 0x77, 0x22, 0x75, 0xd4, 0xcf, 0x1c, 0xaf, 0xd7, 0xd7, 0x19, 0xf2, 0x09, 0xc1,
+    0x46, 0xa3, 0x8c, 0x2f, 0xf2, 0x98, 0x2b, 0x3a, 0x0d, 0x6e, 0x66, 0x29, 0x05, 0x8f, 0xa4, 0x68,
+    0xf4, 0x02, 0x30, 0xd3, 0x7c, 0xea, 0xc4, 0x98, 0xea, 0x2c, 0x27, 0x2c, 0x46, 0x05, 0xa6, 0xa8,
+    0xd0, 0xe7, 0x25, 0xd4, 0x23, 0xa8, 0x9e, 0x29, 0x0e, 0x17, 0xf8, 0x28, 0x19, 0x2b, 0x1b, 0x4b,
+    0xff, 0xdc, 0xa8, 0x88, 0x3d, 0x8d, 0x4c, 0x2b, 0x3b, 0xb6, 0xd1, 0x45, 0xf9, 0x70, 0x1c, 0xf4,
+    0x2e, 0xb6, 0xcc, 0x82, 0xee, 0x91, 0xb1, 0x39, 0x68, 0x63, 0xa8, 0xe9, 0x7f, 0xae, 0x12, 0x27,
+    0x71, 0xed, 0x01, 0xe4, 0x12, 0x8f, 0xea, 0x7f, 0x94, 0x5e, 0x5d, 0xab, 0x36, 0x1c, 0xdc, 0xb7,
+    0xec, 0xff, 0xb3, 0x59, 0x49, 0x51, 0x56, 0x7b, 0xff, 0xc2, 0xe6, 0x42, 0xf0, 0x6a, 0xac, 0xd0,
+    0x46, 0x47, 0x4f, 0xb6, 0x57, 0x27, 0x9f, 0xa4, 0xbd, 0x2d, 0x21, 0x36, 0xe3, 0x11, 0xaa, 0xf9,
+    0xc3, 0x95, 0xc9, 0x7f, 0x65, 0x7e, 0x6e, 0x78, 0x9f, 0xe4, 0x65, 0x09, 0x3d, 0xa7, 0xd2, 0xda,
+    0x2c, 0x92, 0xc9, 0xf7, 0x5e, 0x6c, 0x3d, 0xf6, 0x5c, 0x5a, 0xf3, 0x67, 0xcd, 0x71, 0xf2, 0xdf,
+    0x66, 0xc5, 0xc2, 0x83, 0x60, 0xea, 0x39, 0xf3, 0x90, 0x90, 0xd2, 0x71, 0x71, 0x67, 0xb9, 0xd4,
+    0x50, 0xd6, 0xe4, 0x11, 0x07, 0xac, 0xc1, 0x26, 0x8a, 0x73, 0xb5, 0xb4, 0x3e, 0xbd, 0xcf, 0x08,
+    0x7e, 0x6d, 0x15, 0xf1, 0xc8, 0x49, 0x79, 0x6e, 0x64, 0xcc, 0x25, 0xa4, 0x85, 0x19, 0x61, 0x72,
+    0x72, 0xa1, 0xd8, 0x76, 0x53, 0x18, 0xe4, 0x11, 0x46, 0x40, 0xd4, 0xab, 0x74, 0x46, 0xc7, 0x4c,
+    0x0a, 0x6e, 0x8f, 0xe2, 0x17, 0x1b, 0x39, 0x07, 0xad, 0xea, 0xf4, 0x56, 0xbb, 0x9c, 0x00, 0xff,
+    0xfb, 0x7c, 0x48, 0x0c, 0xb1, 0x13, 0x9e, 0x61, 0xf0, 0x12, 0xb4, 0x35, 0xa5, 0x5f, 0x4c, 0xb2,
+    0x43, 0x49, 0x94, 0x81, 0xba, 0xf7, 0x33, 0x7f, 0x93, 0xd1, 0x70, 0xce, 0x36, 0x9a, 0x43, 0xb8,
+    0x5c, 0x08, 0x3b, 0x1e, 0xd0, 0x37, 0x81, 0x58, 0x60, 0xc8, 0x05, 0xf1, 0x55, 0xcd, 0x14, 0x8a,
+    0x21, 0xf3, 0x6d, 0x05, 0x7a, 0xbd, 0x86, 0x9f, 0xdb, 0x1d, 0xea, 0x09, 0x6d, 0x90, 0xfa, 0x27,
+    0xf8, 0xc4, 0x8d, 0xd4, 0x26, 0x99, 0x93, 0x6a, 0x28, 0x8a, 0xb5, 0xcf, 0x26, 0xc5, 0xa5, 0x0f,
+    0xa7, 0xe8, 0xfa, 0xa7, 0x55, 0x2a, 0x74, 0x62, 0xdb, 0x79, 0x4f, 0xbf, 0x44, 0x91, 0x5c, 0x0e,
+    0x9e, 0xe2, 0x52, 0xec, 0x3c, 0xdf, 0xd6, 0x35, 0xe1, 0x17, 0x8e, 0x10, 0x89, 0x0c, 0x35, 0x37,
+    0x44, 0x95, 0x4b, 0xd8, 0x84, 0x46, 0x20, 0x44, 0x91, 0x01, 0x2f, 0xbb, 0x83, 0x41, 0xee, 0x5b,
+    0x6d, 0xf0, 0xd2, 0x3b, 0x7d, 0xdf, 0x88, 0x67, 0xee, 0x46, 0x48, 0x85, 0xf6, 0xc9, 0xa8, 0x39,
+    0xa9, 0x02, 0xcb, 0xe0, 0x72, 0xea, 0xff, 0x9e, 0x9d, 0x77, 0xcd, 0x86, 0xff, 0xe4, 0x25, 0x18,
+    0x43, 0x82, 0xc4, 0xda, 0x07, 0x16, 0xc8, 0x23, 0xf7, 0xc1, 0x9d, 0x0b, 0x42, 0x40, 0x74, 0xb0,
+    0x54, 0x88, 0x63, 0xd1, 0xf7, 0xb6, 0x9e, 0x29, 0xf1, 0x40, 0xa2, 0x1d, 0x3f, 0x22, 0x19, 0x37,
+    0xaa, 0x1e, 0x97, 0xb0, 0x9c, 0x5d, 0xda, 0x10, 0x63, 0x03, 0xd2, 0x0d, 0xcc, 0x16, 0x8c, 0x48,
+    0x85, 0xcf, 0xae, 0x2d, 0x2e, 0x20, 0xe5, 0x7e, 0xd9, 0xbc, 0xd5, 0xd6, 0x89, 0x55, 0x3c, 0xea,
+    0x00, 0x92, 0x1e, 0x67, 0x60, 0x04, 0xc8, 0xff, 0x31, 0xd9, 0x81, 0xc2, 0xf6, 0x4d, 0xcf, 0x3d,
+    0xf3, 0xc0, 0xe6, 0x98, 0x8f, 0xbc, 0x32, 0x44, 0x04, 0xdb, 0x5b, 0x3c, 0xc0, 0x0b, 0x16, 0x2b,
+    0x0f, 0x71, 0x8b, 0x76, 0xfa, 0x38, 0x00, 0xa3, 0xeb, 0x43, 0xd2, 0x20, 0xac, 0x71, 0x50, 0x2a,
+    0xb0, 0x76, 0x38, 0x47, 0x8c, 0x7a, 0x74, 0x2f, 0x89, 0xf3, 0x59, 0x41, 0x41, 0xa9, 0x93, 0x57,
+    0x60, 0x10, 0x00, 0xee, 0x78, 0x1c, 0xaf, 0x42, 0x87, 0x8c, 0x02, 0xb5, 0xad, 0x98, 0x2c, 0x0e,
+    0x6e, 0x88, 0x2e, 0x6f, 0x37, 0x4a, 0xec, 0x9c, 0x0a, 0x00, 0x2d, 0x54, 0x0a, 0x1d, 0xb1, 0xdd,
+    0xe6, 0x67, 0xcb, 0x83, 0x2d, 0xf4, 0xe0, 0x65, 0xef, 0x14, 0x1a, 0x3f, 0xbb, 0x2d, 0xe3, 0x9b,
+    0x39, 0x41, 0xc1, 0x7c, 0xcf, 0xef, 0x73, 0x85, 0x40, 0x92, 0x64, 0x0e, 0x6c, 0xe6, 0xf9, 0x2f,
+    0xe8, 0xb0, 0xdf, 0x30, 0x7c, 0x5f, 0xd9, 0x29, 0x2f, 0x1b, 0x96, 0x3a, 0xac, 0x89, 0x3a, 0xa1,
+    0x8b, 0x32, 0xa8, 0x1a, 0xe6, 0x82, 0x69, 0x67, 0x52, 0x0f, 0xc1, 0xef, 0xe7, 0x94, 0x70, 0x2f,
+    0x89, 0xc0, 0xc6, 0x42, 0x60, 0x01, 0x88, 0x4a, 0xee, 0xeb, 0x7d, 0xf7, 0x9c, 0xaa, 0x7d, 0xdf,
+    0x8e, 0x03, 0xff, 0xc5, 0xa8, 0x29, 0x38, 0xe2, 0xf0, 0xa7, 0xb5, 0x72, 0x85, 0x87, 0x67, 0xe1,
+    0xd6, 0x08, 0xa8, 0x16, 0xcb, 0x87, 0x8a, 0x98, 0xaa, 0xfb, 0x19, 0x5e, 0x0b, 0xab, 0xdd, 0xbc,
+    0x51, 0x6a, 0xad, 0x7c, 0x38, 0x3e, 0x86, 0x3a, 0x36, 0xdc, 0x32, 0xb7, 0x93, 0x7c, 0xf7, 0xf3,
+    0xa4, 0x9a, 0xb6, 0x6f, 0xa2, 0x3d, 0x78, 0x18, 0x25, 0x6f, 0x0d, 0xd6, 0x18, 0x71, 0x9d, 0x2e,
+    0xbd, 0xb6, 0x25, 0xa9, 0xac, 0x39, 0x0d, 0xc5, 0x66, 0xe9, 0xd5, 0x36, 0x7f, 0xe8, 0x4b, 0xd6,
+    0xb2, 0x04, 0x9a, 0x94, 0x43, 0x80, 0x74, 0x3b, 0x93, 0x76, 0xf5, 0x6c, 0xbc, 0x52, 0xaf, 0xfb,
+    0x0f, 0x50, 0x23, 0x6b, 0x3c, 0x50, 0x5e, 0x94, 0x1e, 0x51, 0xef, 0xc5, 0x95, 0x5d, 0x9a, 0xa8,
+    0x0d, 0xdb, 0x39, 0xa7, 0x6a, 0x2c, 0xa0, 0x1c, 0x51, 0x4d, 0x23, 0xc1, 0xd1, 0x7a, 0x26, 0xb7,
+    0x2b, 0xbf, 0x0c, 0xff, 0xf2, 0xcc, 0xd9, 0x85, 0x44, 0x0c, 0x8a, 0x0a, 0x76, 0xc8, 0x73, 0x77,
+    0x65, 0xa8, 0xf7, 0xd8, 0xc6, 0x73, 0x4a, 0xbe, 0xe0, 0x88, 0xbc, 0xf4, 0xa8, 0x6b, 0x0e, 0x83,
+    0x9d, 0x4d, 0x07, 0x82, 0x99, 0x0b, 0x0d, 0xc0, 0xcd, 0x07, 0x73, 0x19, 0x2c, 0x4e, 0x20, 0x15,
+    0xcc, 0xc2, 0x33, 0xd5, 0x30, 0x46, 0x6a, 0x51, 0xe3, 0x51, 0x5b, 0x38, 0x89, 0xa4, 0x1a, 0xdf,
+    0xd5, 0xac, 0x89, 0x41, 0x8e, 0xd2, 0xcf, 0x46, 0x84, 0xba, 0xb5, 0x3f, 0x48, 0x2b, 0x7c, 0x6b,
+    0x63, 0x22, 0x08, 0xb2, 0x80, 0xec, 0x58, 0x6d, 0x5f, 0x1b, 0x1f, 0x24, 0xed, 0xc7, 0x0b, 0x8d,
+    0x71, 0xca, 0x1c, 0xa2, 0x71, 0x57, 0x30, 0x5b, 0xef, 0x23, 0xf3, 0xcc, 0xdc, 0x0b, 0xd7, 0x2c,
+    0xda, 0x79, 0xba, 0x7b, 0xd4, 0x5a, 0x1b, 0x57, 0xbc, 0x5e, 0x27, 0x20, 0xdd, 0xdd, 0x73, 0xc3,
+    0xaf, 0x99, 0x3c, 0x60, 0x99, 0x34, 0xce, 0x5b, 0xd4, 0x61, 0x2f, 0x4c, 0x93, 0x2d, 0x5e, 0x3d,
+    0x7c, 0x0f, 0xce, 0xee, 0xd6, 0x7e, 0xc6, 0xd5, 0x04, 0x2c, 0x24, 0xd8, 0x75, 0x20, 0xa4, 0x36,
+    0xdc, 0x1a, 0x17, 0x9c, 0x5c, 0xc7, 0xe4, 0x48, 0x10, 0x59, 0xc8, 0xe1, 0xbd, 0xc1, 0xcc, 0x15,
+    0x01, 0x5c, 0xc3, 0x37, 0x39, 0x8c, 0x90, 0xab, 0xe8, 0xac, 0xec, 0xbe, 0x26, 0x78, 0x76, 0xcf,
+    0xa8, 0x92, 0xaa, 0x73, 0x02, 0x14, 0x94, 0x97, 0x57, 0x50, 0x53, 0x89, 0xb6, 0x12, 0x79, 0xb3,
+    0xb1, 0x0b, 0x57, 0x80, 0x91, 0xe9, 0xa6, 0x31, 0xaf, 0xc7, 0x96, 0x81, 0x47, 0x12, 0x9a, 0x4a,
+    0x9a, 0x07, 0x10, 0x38, 0x91, 0xea, 0x6f, 0x1c, 0xbb, 0x2b, 0xc7, 0x78, 0xe7, 0x31, 0x87, 0xab,
+    0x19, 0xd8, 0x14, 0xe0, 0x55, 0xf1, 0x06, 0xef, 0x88, 0xa5, 0x38, 0x8e, 0x72, 0xc9, 0x86, 0x7e,
+    0x8c, 0xcc, 0x39, 0xca, 0x63, 0xee, 0x30, 0x94, 0xcd, 0xa4, 0x42, 0x2c, 0xcb, 0x98, 0x67, 0x00,
+    0x08, 0x12, 0x2d, 0x0d, 0xdb, 0x4f, 0x63, 0x7a, 0x43, 0x1c, 0x61, 0x1d, 0xc3, 0xc7, 0xe0, 0x11,
+    0x7c, 0xc2, 0x94, 0xb9, 0xd3, 0x15, 0xd4, 0xff, 0x0d, 0xec, 0x57, 0x66, 0xe6, 0x37, 0x5b, 0xde,
+    0xfa, 0x63, 0xe6, 0x84, 0xe4, 0xee, 0xf8, 0x4c, 0x48, 0x8b, 0x27, 0x9a, 0x79, 0x91, 0x67, 0x74,
+    0xc7, 0xec, 0x0d, 0xd9, 0xbb, 0x87, 0x75, 0xbf, 0x74, 0x4c, 0x32, 0x0c, 0xca, 0x24, 0x96, 0xa2,
+    0x6d, 0xd2, 0x10, 0x11, 0x2d, 0xe7, 0x87, 0x64, 0xbd, 0x11, 0xf0, 0x06, 0x9d, 0x10, 0xb9, 0xb5,
+    0xee, 0x92, 0xfd, 0x88, 0xa3, 0xc4, 0x5c, 0xf8, 0xdc, 0x57, 0xa0, 0x6f, 0x9e, 0xb4, 0x16, 0x2e,
+    0x97, 0x7a, 0xf9, 0xe2, 0x57, 0x3a, 0x85, 0x14, 0x99, 0x96, 0x8b, 0x0c, 0x24, 0xb4, 0x08, 0xf5,
+    0x81, 0xda, 0xc7, 0xef, 0x0a, 0x96, 0x92, 0xf8, 0x6c, 0xf1, 0xfe, 0x33, 0x9a, 0x15, 0x53, 0xf4,
+    0xa5, 0xef, 0x6a, 0x1a, 0x4e, 0xa8, 0x40, 0xdc, 0xfa, 0x1a, 0xa3, 0xb9, 0x1d, 0xcc, 0x9b, 0x9e,
+    0x55, 0x45, 0x0a, 0x6f, 0xe6, 0xa3, 0x85, 0xd8, 0x1d, 0x47, 0x1a, 0x0e, 0x76, 0x08, 0x80, 0xa8,
+    0xc3, 0x01, 0x9b, 0x52, 0xb7, 0x86, 0x3d, 0x98, 0x34, 0xf9, 0x0e, 0x8a, 0xa3, 0x9f, 0x0c, 0x17,
+    0xf7, 0x7c, 0x47, 0x6e, 0xce, 0xe7, 0x87, 0x50, 0xbb, 0x48, 0x50, 0x42, 0x23, 0x62, 0x4c, 0xdb,
+    0x41, 0xcd, 0x16, 0x7f, 0x78, 0xaf, 0x7c, 0x3e, 0x9b, 0x3d, 0x24, 0x93, 0x35, 0x51, 0x0a, 0x24,
+    0x83, 0x1f, 0x56, 0x5f, 0x2f, 0xeb, 0x51, 0x80, 0x0a, 0x88, 0x9b, 0xc2, 0x08, 0xd9, 0xf9, 0x88,
+    0x62, 0xc2, 0x5a, 0x09, 0x9e, 0x09, 0x70, 0x14, 0xb7, 0xa9, 0x46, 0x2c, 0xf0, 0x14, 0x8a, 0x2c,
+    0xf5, 0xae, 0x1c, 0x51, 0xdf, 0x9d, 0xdb, 0x6a, 0xb4, 0x79, 0x47, 0x77, 0x2f, 0x86, 0xc6, 0xfe,
+    0xe3, 0xf1, 0x17, 0x89, 0xa8, 0x2c, 0x3c, 0x1e, 0x2d, 0x6a, 0xa5, 0xcb, 0x62, 0x4f, 0xe2, 0x05,
+    0x4e, 0xdc, 0x99, 0x62, 0xe5, 0x1c, 0x90, 0x30, 0xa5, 0xa8, 0x85, 0x2f, 0xa6, 0xb3, 0xda, 0x30,
+    0x64, 0x70, 0x29, 0xdf, 0xd7, 0x2a, 0xed, 0x95, 0x45, 0x35, 0x0b, 0x82, 0x26, 0x0d, 0x74, 0x07,
+    0x65, 0xec, 0x38, 0x10, 0xf5, 0x97, 0x0e, 0xe4, 0x15, 0x2d, 0x8c, 0x56, 0x35, 0xfa, 0x03, 0xea,
+    0xdb, 0x06, 0x0a, 0x5d, 0x28, 0x31, 0xa7, 0x1e, 0x29, 0x73, 0xc5, 0xcf, 0xa7, 0xbb, 0x09, 0xf4,
+    0x28, 0xa7, 0xc5, 0x10, 0xc5, 0x83, 0x94, 0x2d, 0x0b, 0xad, 0x5d, 0x20, 0x0d, 0xd3, 0x57, 0x90,
+    0x32, 0xb9, 0x5d, 0x4b, 0x82, 0xc4, 0x2b, 0xc7, 0xfa, 0xd0, 0x43, 0x4f, 0x4c, 0x1c, 0x53, 0x28,
+    0x12, 0xab, 0xb3, 0x04, 0xa2, 0x74, 0xce, 0x5d, 0xdd, 0xc6, 0xa8, 0x3f, 0xbe, 0xb7, 0x16, 0xad,
+    0x32, 0x5f, 0x5c, 0x34, 0xf1, 0x2a, 0x61, 0x3e, 0x80, 0x14, 0x58, 0x17, 0xb9, 0xe8, 0x65, 0x05,
+    0x2f, 0xfb, 0x4c, 0xc0, 0x12, 0x28, 0x9d, 0xdf, 0x50, 0x8d, 0x5c, 0x88, 0x48, 0x0d, 0x01, 0x2c,
+    0x1e, 0xd5, 0xea, 0x99, 0x7f, 0x78, 0x36, 0xeb, 0x5f, 0xba, 0x91, 0xbb, 0x93, 0x25, 0xa9, 0xdb,
+    0xba, 0xc8, 0x3a, 0x7a, 0x54, 0x62, 0xcf, 0xb0, 0xd4, 0x97, 0x76, 0xce, 0xf2, 0xed, 0xc2, 0x38,
+    0xbe, 0x86, 0x34, 0x44, 0x5b, 0x84, 0x86, 0x55, 0x8d, 0xf3, 0x2a, 0x07, 0x37, 0x50, 0x7c, 0xb6,
+    0xa6, 0xb2, 0xf2, 0xd9, 0xf0, 0xfa, 0x12, 0x20, 0x2a, 0xfc, 0xa7, 0xc5, 0x64, 0xdf, 0x41, 0x6a,
+    0x5b, 0xf3, 0x61, 0xc0, 0x96, 0x68, 0xab, 0xbb, 0xbd, 0x2f, 0x2c, 0xc6, 0xe9, 0x6e, 0x84, 0x31,
+    0x1c, 0xd2, 0xaa, 0xb6, 0x53, 0xaa, 0x5c, 0xf1, 0x2f, 0xb4, 0x3b, 0x5c, 0x32, 0x1a, 0x98, 0x1e,
+};
+
+const unsigned g_cbRandom72KB = sizeof(g_abRandom72KB);
+/* end of file */
+
diff --git a/src/VBox/Runtime/testcase/Makefile.kmk b/src/VBox/Runtime/testcase/Makefile.kmk
index 3ceb9f0..9a241b9 100644
--- a/src/VBox/Runtime/testcase/Makefile.kmk
+++ b/src/VBox/Runtime/testcase/Makefile.kmk
@@ -48,11 +48,13 @@ PROGRAMS += \
 	tstRTAvl \
 	tstRTBase64 \
 	tstRTBitOperations \
+	tstRTBigNum \
 	tstRTCidr \
 	tstRTCritSect \
 	tstRTCritSectRw \
 	tstRTCType \
 	tstRTDigest \
+	tstRTDigest-2 \
 	tstDir \
 	tstDir-2 \
 	tstDir-3 \
@@ -78,6 +80,7 @@ PROGRAMS += \
 	tstIprtMiniString \
 	tstLdr \
 	tstLdrLoad \
+	tstRTLdrVerifyPeImage \
 	tstRTList \
 	tstRTLockValidator \
 	tstLog \
@@ -164,11 +167,25 @@ if1of ($(KBUILD_TARGET_ARCH), amd64 x86)
  	tstLdr-3 \
  	tstLdr-4 \
  	tstNoCrt-1 \
-	tstRTR0MemUserKernelDriver \
-	tstRTR0SemMutexDriver \
-	tstRTR0TimerDriver \
-	tstR0ThreadPreemptionDriver \
 	tstTSC
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  PROGRAMS += \
+  	tstRTR0MemUserKernelDriverHardened \
+  	tstRTR0SemMutexDriverHardened \
+  	tstRTR0TimerDriverHardened \
+  	tstR0ThreadPreemptionDriverHardened
+  DLLS     += \
+    	tstRTR0MemUserKernelDriver \
+  	tstRTR0SemMutexDriver \
+  	tstRTR0TimerDriver \
+  	tstR0ThreadPreemptionDriver
+ else
+  PROGRAMS += \
+    	tstRTR0MemUserKernelDriver \
+  	tstRTR0SemMutexDriver \
+  	tstRTR0TimerDriver \
+  	tstR0ThreadPreemptionDriver
+ endif
  SYSMODS += \
  	tstLdrObjR0 \
  	tstRTR0MemUserKernel \
@@ -203,6 +220,9 @@ tstRTAvl_SOURCES = tstRTAvl.cpp
 tstRTBase64_TEMPLATE = VBOXR3TSTEXE
 tstRTBase64_SOURCES = tstRTBase64.cpp
 
+tstRTBigNum_TEMPLATE = VBOXR3TSTEXE
+tstRTBigNum_SOURCES = tstRTBigNum.cpp
+
 tstRTBitOperations_TEMPLATE = VBOXR3TSTEXE
 tstRTBitOperations_SOURCES = tstRTBitOperations.cpp
 
@@ -227,8 +247,15 @@ tstRTCritSectW32_DEFS = TRY_WIN32_CRIT
 tstRTCType_TEMPLATE = VBOXR3TSTEXE
 tstRTCType_SOURCES = tstRTCType.cpp
 
+tstRTDigest_TEMPLATE = VBOXR3TSTEXE
 tstRTDigest_SOURCES = tstRTDigest.cpp
 
+tstRTDigest-2_TEMPLATE = VBOXR3TSTEXE
+ifndef VBOX_WITH_ALT_HASH_CODE
+ tstRTDigest-2_DEFS = IPRT_WITHOUT_SHA512T224 IPRT_WITHOUT_SHA512T256
+endif
+tstRTDigest-2_SOURCES = tstRTDigest-2.cpp
+
 ifdef VBOX_WITH_LIBCURL
 tstRTHttp_TEMPLATE = VBOXR3TSTEXE
 tstRTHttp_SOURCES = tstRTHttp.cpp
@@ -401,6 +428,9 @@ tstLdr-4_LIBS = \
 tstLdrLoad_TEMPLATE = VBOXR3TSTEXE
 tstLdrLoad_SOURCES = tstLdrLoad.cpp
 
+tstRTLdrVerifyPeImage_TEMPLATE = VBOXR3TSTEXE
+tstRTLdrVerifyPeImage_SOURCES = tstRTLdrVerifyPeImage.cpp
+
 tstRTList_TEMPLATE = VBOXR3TSTEXE
 tstRTList_SOURCES = tstRTList.cpp
 
@@ -620,6 +650,15 @@ tstRTR0DbgKrnlInfo_LIBS = $(PATH_STAGE_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
 if1of ($(VBOX_LDR_FMT), pe lx)
  tstRTR0DbgKrnlInfo_LIBS += $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
 endif
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstRTR0DbgKrnlInfoDriverHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstRTR0DbgKrnlInfoDriverHardened_NAME = tstRTR0DbgKrnlInfoDriver
+ tstRTR0DbgKrnlInfoDriverHardened_DEFS = PROGRAM_NAME_STR=\"tstRTR0DbgKrnlInfoDriver\"
+ tstRTR0DbgKrnlInfoDriverHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstRTR0DbgKrnlInfoDriver_TEMPLATE = VBoxR3TstDll
+else
+ tstRTR0DbgKrnlInfoDriver_TEMPLATE = VBOXR3TSTEXE
+endif
 tstRTR0DbgKrnlInfoDriver_TEMPLATE = VBOXR3TSTEXE
 tstRTR0DbgKrnlInfoDriver_SOURCES = tstRTR0DbgKrnlInfoDriver.cpp
 
@@ -633,7 +672,15 @@ tstRTR0MemUserKernel_LIBS = $(PATH_STAGE_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
 if1of ($(VBOX_LDR_FMT), pe lx)
  tstRTR0MemUserKernel_LIBS += $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
 endif
-tstRTR0MemUserKernelDriver_TEMPLATE = VBOXR3TSTEXE
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstRTR0MemUserKernelDriverHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstRTR0MemUserKernelDriverHardened_NAME = tstRTR0MemUserKernelDriver
+ tstRTR0MemUserKernelDriverHardened_DEFS = PROGRAM_NAME_STR=\"tstRTR0MemUserKernelDriver\"
+ tstRTR0MemUserKernelDriverHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstRTR0MemUserKernelDriver_TEMPLATE = VBoxR3TstDll
+else
+ tstRTR0MemUserKernelDriver_TEMPLATE = VBOXR3TSTEXE
+endif
 tstRTR0MemUserKernelDriver_SOURCES = tstRTR0MemUserKernelDriver.cpp
 
 
@@ -646,7 +693,15 @@ tstRTR0SemMutex_LIBS = $(PATH_STAGE_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
 if1of ($(VBOX_LDR_FMT), pe lx)
  tstRTR0SemMutex_LIBS += $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
 endif
-tstRTR0SemMutexDriver_TEMPLATE = VBOXR3TSTEXE
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstRTR0SemMutexDriverHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstRTR0SemMutexDriverHardened_NAME = tstRTR0SemMutexDriver
+ tstRTR0SemMutexDriverHardened_DEFS = PROGRAM_NAME_STR=\"tstRTR0SemMutexDriver\"
+ tstRTR0SemMutexDriverHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstRTR0SemMutexDriver_TEMPLATE = VBoxR3TstDll
+else
+ tstRTR0SemMutexDriver_TEMPLATE = VBOXR3TSTEXE
+endif
 tstRTR0SemMutexDriver_SOURCES = tstRTR0SemMutexDriver.cpp
 
 
@@ -659,7 +714,15 @@ tstRTR0Timer_LIBS = $(PATH_STAGE_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
 if1of ($(VBOX_LDR_FMT), pe lx)
  tstRTR0Timer_LIBS += $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
 endif
-tstRTR0TimerDriver_TEMPLATE = VBOXR3TSTEXE
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstRTR0TimerDriverHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstRTR0TimerDriverHardened_NAME = tstRTR0TimerDriver
+ tstRTR0TimerDriverHardened_DEFS = PROGRAM_NAME_STR=\"tstRTR0TimerDriver\"
+ tstRTR0TimerDriverHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstRTR0TimerDriver_TEMPLATE = VBoxR3TstDll
+else
+ tstRTR0TimerDriver_TEMPLATE = VBOXR3TSTEXE
+endif
 tstRTR0TimerDriver_SOURCES = tstRTR0TimerDriver.cpp
 
 
@@ -672,7 +735,15 @@ tstR0ThreadPreemption_LIBS = $(PATH_STAGE_LIB)/RuntimeR0$(VBOX_SUFF_LIB)
 if1of ($(VBOX_LDR_FMT), pe lx)
  tstR0ThreadPreemption_LIBS += $(PATH_STAGE_LIB)/SUPR0$(VBOX_SUFF_LIB)
 endif
-tstR0ThreadPreemptionDriver_TEMPLATE = VBOXR3TSTEXE
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstR0ThreadPreemptionDriverHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstR0ThreadPreemptionDriverHardened_NAME = tstR0ThreadPreemptionDriver
+ tstR0ThreadPreemptionDriverHardened_DEFS = PROGRAM_NAME_STR=\"tstR0ThreadPreemptionDriver\"
+ tstR0ThreadPreemptionDriverHardened_SOURCES = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstR0ThreadPreemptionDriver_TEMPLATE = VBoxR3TstDll
+else
+ tstR0ThreadPreemptionDriver_TEMPLATE = VBOXR3TSTEXE
+endif
 tstR0ThreadPreemptionDriver_SOURCES = tstR0ThreadPreemptionDriver.cpp
 
 
diff --git a/src/VBox/Runtime/testcase/tstIprtMiniString.cpp b/src/VBox/Runtime/testcase/tstIprtMiniString.cpp
index fa5ad8f..704078c 100644
--- a/src/VBox/Runtime/testcase/tstIprtMiniString.cpp
+++ b/src/VBox/Runtime/testcase/tstIprtMiniString.cpp
@@ -371,6 +371,28 @@ static int mymemcmp(const char *psz1, const char *psz2, size_t cch)
     return 0;
 }
 
+#if 0
+/**
+ * Detects a few annoying unicode points with unstable case folding for UTF-8.
+ *
+ * Unicode 4.01, I think, introduces a few codepoints with lower/upper mappings
+ * that has a different length when encoded as UTF-8.  This breaks some
+ * assumptions we used to make.  Since it's just a handful codepoints, we'll
+ * detect them and ignore them here.  The actual case folding functions in
+ * IPRT will of course deal with this in a more robust manner.
+ *
+ * @returns true if problematic, false if not.
+ * @param   uc      The codepoints.
+ */
+static bool isUnevenUtf8FoldingCp(RTUNICP uc)
+{
+    RTUNICP ucLower = RTUniCpToLower(uc);
+    RTUNICP ucUpper = RTUniCpToUpper(uc);
+    //return RTUniCpCalcUtf8Len(ucLower) != RTUniCpCalcUtf8Len(ucUpper);
+    return false;
+}
+#endif
+
 static void test2(RTTEST hTest)
 {
     RTTestSub(hTest, "UTF-8 upper/lower encoding assumption");
@@ -383,9 +405,23 @@ static void test2(RTTEST hTest)
         RTTESTI_CHECK(mymemcmp((str1).c_str(), (str2).c_str(), (str2).length() + 1) == 0); \
     } while (0)
 
-    RTCString strTmp;
+    RTCString strTmp, strExpect;
     char szDst[16];
 
+    /* Some simple ascii stuff. */
+    strTmp    = "abcdefghijklmnopqrstuvwxyz0123456ABCDEFGHIJKLMNOPQRSTUVWXYZ;-+/\\";
+    strExpect = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456ABCDEFGHIJKLMNOPQRSTUVWXYZ;-+/\\";
+    strTmp.toUpper();
+    CHECK_EQUAL(strTmp, strExpect);
+
+    strTmp.toLower();
+    strExpect = "abcdefghijklmnopqrstuvwxyz0123456abcdefghijklmnopqrstuvwxyz;-+/\\";
+    CHECK_EQUAL(strTmp, strExpect);
+
+    strTmp    = "abcdefghijklmnopqrstuvwxyz0123456ABCDEFGHIJKLMNOPQRSTUVWXYZ;-+/\\";
+    strTmp.toLower();
+    CHECK_EQUAL(strTmp, strExpect);
+
     /* Collect all upper and lower case code points. */
     RTCString strLower("");
     strLower.reserve(_4M);
@@ -395,6 +431,16 @@ static void test2(RTTEST hTest)
 
     for (RTUNICP uc = 1; uc <= 0x10fffd; uc++)
     {
+        /* Unicode 4.01, I think, introduced a few codepoints with lower/upper mappings
+           that aren't up for roundtrips and which case folding has a different UTF-8
+           length.  We'll just skip them here as there are very few:
+            - Dotless small i and dotless capital I folds into ASCII I and i.
+            - The small letter long s folds to ASCII S.
+            - Greek prosgegrammeni folds to iota, which is a letter with both upper
+              and lower case foldings of its own. */
+        if (uc == 0x131 || uc == 0x130 || uc == 0x17f || 0x1fbe)
+            continue;
+
         if (RTUniCpIsLower(uc))
         {
             RTTESTI_CHECK_MSG(uc < 0xd800 || (uc > 0xdfff && uc != 0xfffe && uc != 0xffff), ("%#x\n", uc));
@@ -438,14 +484,15 @@ static void test2(RTTEST hTest)
         RTTESTI_CHECK_MSG(ucUpper2 == ucUpper, ("ucUpper2=%#x ucUpper=%#x\n", ucUpper2, ucUpper));
 
         RTUNICP const       ucLower2  = RTUniCpToLower(ucUpper);
+        RTTESTI_CHECK_MSG(ucLower2 == ucLower, ("ucLower2=%#x ucLower=%#x\n", ucLower2, ucLower));
         RTUNICP const       ucUpper3  = RTUniCpToUpper(ucLower2);
         RTTESTI_CHECK_MSG(ucUpper3 == ucUpper, ("ucUpper3=%#x ucUpper=%#x\n", ucUpper3, ucUpper));
 
         pszDstEnd = RTStrPutCp(szDst, ucLower2);
         size_t const        cchLower2 = pszDstEnd - &szDst[0];
         RTTESTI_CHECK_MSG(cchDst == cchLower2,
-                          ("ucLower2=%#x %u bytes;  ucUpper=%#x %u bytes\n",
-                           ucLower2, cchLower2, ucUpper, cchDst));
+                          ("ucLower2=%#x %u bytes;  ucUpper=%#x %u bytes; ucLower=%#x\n",
+                           ucLower2, cchLower2, ucUpper, cchDst, ucLower));
     }
     RTTESTI_CHECK(strlen(strUpper2.c_str()) == strUpper2.length());
     RTTESTI_CHECK_MSG(cch == strUpper2.length(), ("cch=%u length()=%u\n", cch, strUpper2.length()));
@@ -483,6 +530,7 @@ static void test2(RTTEST hTest)
         RTTESTI_CHECK_MSG(ucLower2 == ucLower, ("ucLower2=%#x ucLower=%#x\n", ucLower2, ucLower));
 
         RTUNICP const       ucUpper2  = RTUniCpToUpper(ucLower);
+        RTTESTI_CHECK_MSG(ucUpper2 == ucUpper, ("ucUpper2=%#x ucUpper=%#x\n", ucUpper2, ucUpper));
         RTUNICP const       ucLower3  = RTUniCpToLower(ucUpper2);
         RTTESTI_CHECK_MSG(ucLower3 == ucLower, ("ucLower3=%#x ucLower=%#x\n", ucLower3, ucLower));
 
diff --git a/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp b/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp
index 9826330..e88913d 100644
--- a/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp
+++ b/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp
@@ -74,7 +74,10 @@ static DECLCALLBACK(int) MyThreadProc(RTTHREAD hSelf, void *pvCpuIdx)
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 #ifndef VBOX
     RTPrintf("tstSup: SKIPPED\n");
@@ -285,3 +288,14 @@ int main(int argc, char **argv)
 #endif
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Runtime/testcase/tstRTBigNum.cpp b/src/VBox/Runtime/testcase/tstRTBigNum.cpp
new file mode 100644
index 0000000..31925bd
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTBigNum.cpp
@@ -0,0 +1,852 @@
+/* $Id: tstRTBigNum.cpp $ */
+/** @file
+ * IPRT - Testcase for the RTBigNum* functions.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/bignum.h>
+
+#include <iprt/test.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static RTTEST g_hTest;
+
+
+static uint8_t const g_abLargePositive[] =
+{
+    0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
+    0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
+    0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
+    0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa4
+};
+static RTBIGNUM g_LargePositive;
+static RTBIGNUM g_LargePositive2; /**< Smaller than g_LargePositive.  */
+
+static uint8_t const g_abLargePositiveMinus1[] =
+{
+    0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
+    0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
+    0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
+    0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa3
+};
+static RTBIGNUM g_LargePositiveMinus1; /**< g_LargePositive - 1 */
+
+
+static uint8_t const g_abLargeNegative[] =
+{
+    0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
+    0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
+    0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
+    0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
+    0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
+    0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
+    0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8b
+};
+static RTBIGNUM g_LargeNegative;
+static RTBIGNUM g_LargeNegative2; /**< A few digits less than g_LargeNegative, i.e. larger value.  */
+
+static uint8_t const g_abLargeNegativePluss1[] =
+{
+    0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
+    0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
+    0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
+    0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
+    0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
+    0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
+    0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8c
+};
+static RTBIGNUM g_LargeNegativePluss1; /**< g_LargeNegative + 1 */
+
+
+static uint8_t const g_ab64BitPositive1[] = { 0x53, 0xe0, 0xdf, 0x11,  0x85, 0x93, 0x06, 0x21 };
+static uint64_t g_u64BitPositive1 = UINT64_C(0x53e0df1185930621);
+static RTBIGNUM g_64BitPositive1;
+
+
+static RTBIGNUM g_Zero;
+static RTBIGNUM g_One;
+static RTBIGNUM g_Two;
+static RTBIGNUM g_Three;
+static RTBIGNUM g_Four;
+static RTBIGNUM g_Five;
+static RTBIGNUM g_Ten;
+static RTBIGNUM g_FourtyTwo;
+
+static uint8_t const g_abMinus1[] = { 0xff, 0xff, 0xff, 0xff,  0xff, 0xff, 0xff, 0xff };
+static int64_t  g_iBitMinus1 = -1;
+static RTBIGNUM g_Minus1;
+
+
+
+static void testInitOneLittleEndian(uint8_t const *pb, size_t cb, PRTBIGNUM pBigNum)
+{
+    uint8_t abLittleEndian[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
+    RTTESTI_CHECK_RETV(cb <= sizeof(abLittleEndian));
+
+    size_t         cbLeft = cb;
+    uint8_t       *pbDst  = abLittleEndian + cb - 1;
+    uint8_t const *pbSrc  = pb;
+    while (cbLeft-- > 0)
+        *pbDst-- = *pbSrc++;
+
+    RTBIGNUM Num;
+    RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED,
+                                       abLittleEndian, cb), VINF_SUCCESS);
+    RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
+    RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
+    RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
+    RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
+
+    RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED | RTBIGNUMINIT_F_SENSITIVE,
+                                       abLittleEndian, cb), VINF_SUCCESS);
+    RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
+    RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
+    RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
+    RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
+}
+
+static void testMoreInit(void)
+{
+    RTTESTI_CHECK(!g_LargePositive.fNegative);
+    RTTESTI_CHECK(!g_LargePositive.fSensitive);
+    RTTESTI_CHECK(!g_LargePositive2.fNegative);
+    RTTESTI_CHECK(!g_LargePositive2.fSensitive);
+    RTTESTI_CHECK(g_LargeNegative.fNegative);
+    RTTESTI_CHECK(!g_LargeNegative.fSensitive);
+    RTTESTI_CHECK(g_LargeNegative2.fNegative);
+    RTTESTI_CHECK(!g_LargeNegative2.fSensitive);
+
+    RTTESTI_CHECK(!g_Zero.fNegative);
+    RTTESTI_CHECK(!g_Zero.fSensitive);
+    RTTESTI_CHECK(g_Zero.cUsed == 0);
+
+    RTTESTI_CHECK(g_Minus1.fNegative);
+    RTTESTI_CHECK(!g_Minus1.fSensitive);
+    RTTESTI_CHECK(g_Minus1.cUsed == 1);
+    RTTESTI_CHECK(g_Minus1.pauElements[0] == 1);
+
+    RTTESTI_CHECK(g_One.cUsed       == 1 && g_One.pauElements[0]        == 1);
+    RTTESTI_CHECK(g_Two.cUsed       == 1 && g_Two.pauElements[0]        == 2);
+    RTTESTI_CHECK(g_Three.cUsed     == 1 && g_Three.pauElements[0]      == 3);
+    RTTESTI_CHECK(g_Four.cUsed      == 1 && g_Four.pauElements[0]       == 4);
+    RTTESTI_CHECK(g_Ten.cUsed       == 1 && g_Ten.pauElements[0]        == 10);
+    RTTESTI_CHECK(g_FourtyTwo.cUsed == 1 && g_FourtyTwo.pauElements[0]  == 42);
+
+    /* Test big endian initialization w/ sensitive variation. */
+    testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive), &g_LargePositive);
+    testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive) - 11, &g_LargePositive2);
+
+    testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative), &g_LargeNegative);
+    testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative) - 9, &g_LargeNegative2);
+
+    RTTESTI_CHECK(g_Minus1.cUsed == 1);
+    testInitOneLittleEndian(g_abMinus1, sizeof(g_abMinus1), &g_Minus1);
+    testInitOneLittleEndian(g_abMinus1, 1, &g_Minus1);
+    testInitOneLittleEndian(g_abMinus1, 4, &g_Minus1);
+
+}
+
+
+static void testCompare(void)
+{
+    RTTestSub(g_hTest, "RTBigNumCompare*");
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive) == 0);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargePositive) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive2) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargePositive) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_Zero) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_Zero) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositiveMinus1) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositiveMinus1, &g_LargePositive) == -1);
+
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative) == 0);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative2) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargeNegative) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargeNegative) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_Zero) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_Zero) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegativePluss1, &g_LargeNegative) == 1);
+
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargePositive) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative2) == 1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive2) == -1);
+    RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargeNegative2) == 1);
+
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 0) == 0);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 1) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT32_MAX) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT64_MAX) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive, UINT64_MAX) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive2, 0x7213593) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 1) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, UINT64_MAX) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0x80034053) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1) == 0);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
+
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 0) == 0);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 1) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, -1) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, INT32_MAX) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT32_MIN) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT64_MIN) == -1);
+    RTTESTI_CHECK(g_u64BitPositive1 < (uint64_t)INT64_MAX);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1) == 0);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MIN) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MAX) == -1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -1) == 0);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -2) == 1);
+    RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, 0) == -1);
+}
+
+
+static void testSubtraction(void)
+{
+    RTTestSub(g_hTest, "RTBigNumSubtract");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+        RTBIGNUM Result2;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 + 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, INT64_C(-1) - g_u64BitPositive1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+        RTTESTI_CHECK(Result.cUsed == 1);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+        RTTESTI_CHECK(Result.cUsed == 1);
+
+        RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) < 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+        RTTESTI_CHECK(Result.cUsed == 1);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+        RTTESTI_CHECK(Result.cUsed == 1);
+
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegativePluss1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+        RTTESTI_CHECK(Result.cUsed == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+    }
+}
+
+
+static void testAddition(void)
+{
+    RTTestSub(g_hTest, "RTBigNumAdd");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+        RTBIGNUM Result2;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -2) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_64BitPositive1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 - 1) == 0);
+
+        RTTESTI_CHECK(g_u64BitPositive1 * 2 > g_u64BitPositive1);
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_64BitPositive1, &g_64BitPositive1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 * 2) == 0);
+
+
+        RTTESTI_CHECK_RC(RTBigNumAssign(&Result2, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumNegateThis(&Result2), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &Result2), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &Result2), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) > 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositiveMinus1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) > 0);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) < 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegative) == 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) < 0);
+        RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegativePluss1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+    }
+}
+
+static bool testHexStringToNum(PRTBIGNUM pBigNum, const char *pszHex, uint32_t fFlags)
+{
+    uint8_t abBuf[_4K];
+    size_t  cbHex = strlen(pszHex);
+    RTTESTI_CHECK_RET(!(cbHex & 1), false);
+    cbHex /= 2;
+    RTTESTI_CHECK_RET(cbHex < sizeof(abBuf), false);
+    RTTESTI_CHECK_RC_RET(RTStrConvertHexBytes(pszHex, abBuf, cbHex, 0), VINF_SUCCESS, false);
+    RTTESTI_CHECK_RC_RET(RTBigNumInit(pBigNum, RTBIGNUMINIT_F_ENDIAN_BIG | fFlags, abBuf, cbHex), VINF_SUCCESS, false);
+    return true;
+}
+
+static void testMultiplication(void)
+{
+    RTTestSub(g_hTest, "RTBigNumMultiply");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+        RTBIGNUM Result2;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+        RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
+        RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
+
+
+        static struct
+        {
+            const char *pszF1, *pszF2, *pszResult;
+        } s_aTests[] =
+        {
+            {
+                "29865DBFA717181B9DD4B515BD072DE10A5A314385F6DED735AC553FCD307D30C499",
+                "4DD65692F7365B90C55F63988E5B6C448653E7DB9DD941507586BD8CF71398287C",
+                "0CA02E8FFDB0EEA37264338A4AAA91C8974E162DDFCBCF804B434A11955671B89B3645AAB75423D60CA3459B0B4F3F28978DA768779FB54CF362FD61924637582F221C"
+            },
+            {
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000001"
+            }
+        };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+        {
+            RTBIGNUM F1, F2, Expected;
+            if (   testHexStringToNum(&F1, s_aTests[i].pszF1, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&F2, s_aTests[i].pszF2, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+            {
+                RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &F1, &F2), VINF_SUCCESS);
+                RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&F1), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&F2), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+            }
+        }
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+    }
+}
+
+
+static void testDivision(void)
+{
+    RTTestSub(g_hTest, "RTBigNumDivide");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Quotient;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Quotient, fFlags), VINF_SUCCESS);
+        RTBIGNUM Remainder;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Remainder, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Zero, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 0) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Four, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 2) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Three, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Ten, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 5) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
+
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, -1) == 0);
+
+
+#if 0
+        static struct
+        {
+            const char *pszF1, *pszF2, *pszQuotient, *pszRemainder;
+        } s_aTests[] =
+        {
+            {
+                "29865DBFA717181B9DD4B515BD072DE10A5A314385F6DED735AC553FCD307D30C499",
+                "4DD65692F7365B90C55F63988E5B6C448653E7DB9DD941507586BD8CF71398287C",
+                "0CA02E8FFDB0EEA37264338A4AAA91C8974E162DDFCBCF804B434A11955671B89B3645AAB75423D60CA3459B0B4F3F28978DA768779FB54CF362FD61924637582F221C"
+            },
+            {
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+                "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000001"
+            }
+        };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+        {
+            RTBIGNUM F1, F2, Expected;
+            if (   testHexStringToNum(&F1, s_aTests[i].pszF1, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&F2, s_aTests[i].pszF2, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+            {
+                RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &F1, &F2), VINF_SUCCESS);
+                RTTESTI_CHECK(RTBigNumCompare(&Quotient, &Expected) == 0);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&F1), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&F2), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+            }
+        }
+#endif
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Quotient), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Remainder), VINF_SUCCESS);
+    }
+}
+
+
+static void testModulo(void)
+{
+    RTTestSub(g_hTest, "RTBigNumModulo");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+        RTBIGNUM Tmp;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Tmp, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Four, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Three, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Ten, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumAdd(&Tmp, &g_LargePositive, &Result), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositiveMinus1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+    }
+}
+
+
+static void testExponentiation(void)
+{
+    RTTestSub(g_hTest, "RTBigNumExponentiate");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+        RTBIGNUM Result2;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_One, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Two), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 4) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Ten), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1024) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3125) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Ten), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 9765625) == 0);
+
+        static struct
+        {
+            const char *pszBase, *pszExponent, *pszResult;
+        } s_aTests[] =
+        {
+            {
+                "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /* = */
+                "04546412B9E39476F10009F62608F614774C5AE475482434F138C3EA976583ECE09E58F1F03CE41F821A1D5DA59B69D031290B0AC7F7D5058E3AFA2CA3DAA7261D1620CA"
+                "D050576C0AFDF51ADBFCB9073B9D8324E816EA6BE4648DF68092F6617ED609045E6BE9D5410AE2CFF725832414E67656233F4DFA952461D321282426D50E2AF524D779EC"
+                "0744547E8A4F0768C2C49AF3A5A89D129430CA58456BE4534BC53C67523506C7A8B5770D88CF28B6B3EEBE73F3EA71BA2CE27C4C89BE0D699922B1A1EB20143CB0830A43"
+                "D864DDFFF026BA781614C2D55F3EDEA7257B93A0F40824E57D6EDFCFFB4611C316374D0D15698E6584851F1898DCAE75FC4D180908763DDB2FF93766EF144D091274AFE5"
+                "6980A1F4F574D577DAD833EA9486A4B499BFCA9C08225D7BDB2C632B4D9B53EF51C02ED419F22657D626064BCC2B083CD664E1A8D68F82F33233A833AC98AA0282B8B88D"
+                "A430CF2E581A1C7C4A1D646CA42760ED10C398F7C032A94D53964E6885B5C1CA884EC15081D4C010978627C85767FEC6F93364044EA86567F9610ABFB837808CC995FB5F"
+                "710B21CE198E0D4AD9F73C3BD56CB9965C85C790BF3F4B326B5245BFA81783126217BF80687C4A8AA3AE80969A4407191B4F90E71A0ABCCB5FEDD40477CE9D10FBAEF103"
+                "8457AB19BD793CECDFF8B29A96F12F590BFED544E08F834A44DEEF461281C40024EFE9388689AAC69BCBAB3D06434172D9319F30754756E1CF77B300679215BEBD27FC20"
+                "A2F1D2029BC767D4894A5F7B21BD784CD1DD4F41697839969CB6D2AA1E0AFA5D3D644A792586F681EB36475CAE59EB457E55D6AC2E286E196BFAC000C7389A96C514552D"
+                "5D9D3DD962F72DAE4A7575A9A67856646239560A39E50826BB2523598C8F8FF0EC8D09618378E9F362A8FBFE842B55CD1855A95D8A5E93B8B91D31EB8FBBF57113F06171"
+                "BB69B81C4240EC4C7D1AC67EA1CE4CEBEE71828917EC1CF500E1AD2F09535F5498CD6E613383810A840A265AED5DD20AE58FFF2D0DEB8EF99FA494B22714F520E8E8B684"
+                "5E8521966A7B1699236998A730FDF9F049CE2A4EA44D1EBC3B9754908848540D0DEE64A6D60E2BFBC3362B659C10543BDC20C1BAD3D68B173442C100C2C366CB885E8490"
+                "EDB977E49E9D51D4427B73B3B999AF4BA17685387182C3918D20808197A2E3FCDD0F66ECDEC05542C23A08B94C83BDF93606A49E9A0645B002CFCA1EAE1917BEED0D6542"
+                "9A0EF00E5FB5F70D61C8C4DF1F1E9DA58188A221"
+            },
+            {
+                "03", /*^*/ "164b", /* = */
+                "29ABEC229C2B15C41573F8608D4DCD2DADAACA94CA3C40B42FFAD32D6202E228E16F61E050FF97EC5D45F24A4EB057C2D1A5DA72DFC5944E6941DBEDDE70EF56702BEC35"
+                "A3150EFE84E87185E3CBAB1D73F434EB820E41298BDD4F3941230DFFD8DFF1D2E2F3C5D0CB5088505B9C78507A81AAD8073C28B8FA70771C3E04110344328C6B3F38E55A"
+                "32B009F4DDA1813232C3FF422DF4E4D12545C803C63D0BE67E2E773B2BAC41CC69D895787B217D7BE9CE80BD4B500AE630AA21B50A06E0A74953F8011E9F23863CA79885"
+                "35D5FF0214DBD9B25756BE3D43008A15C018348E6A7C3355F4BECF37595BD530E5AC1AD3B14182862E47AD002097465F6B78F435B0D6365E18490567F508CD3CAAAD340A"
+                "E76A218FE8B517F923FE9CCDE61CB35409590CDBC606D89BA33B32A3862DEE7AB99DFBE103D02D2BED6D418B949E6B3C51CAB8AB5BE93AA104FA10D3A02D4CAD6700CD0F"
+                "83922EAAB18705915198DE51C1C562984E2B7571F36A4D756C459B61E0A4B7DE268A74E807311273DD51C2863771AB72504044C870E2498F13BF1DE92C13D93008E304D2"
+                "879C5D8A646DB5BF7BC64D96BB9E2FBA2EA6BF55CD825ABD995762F661C327133BE01F9A9F298CA096B3CE61CBBD8047A003870B218AC505D72ED6C7BF3B37BE5877B6A1"
+                "606A713EE86509C99B2A3627FD74AE7E81FE7F69C34B40E01A6F8B18A328E0F9D18A7911E5645331540538AA76B6D5D591F14313D730CFE30728089A245EE91058748F0C"
+                "E3E6CE4DE51D23E233BFF9007E0065AEBAA3FB0D0FACE62A4757FE1C9C7075E2214071197D5074C92AF1E6D853F7DE782F32F1E40507CB981A1C10AC6B1C23AC46C07EF1"
+                "EDE857C444902B936771DF75E0EE6C2CB3F0F9DBB387BAD0658E98F42A7338DE45E2F1B012B530FFD66861F74137C041D7558408A4A23B83FBDDE494381D9F9FF0326D44"
+                "302F75DE68B91A54CFF6E3C2821D09F2664CA74783C29AF98E2F1D3D84CAC49EAE55BABE3D2CBE8833D50517109E19CB5C63D1DE26E308ACC213D1CBCCF7C3AAE05B06D9"
+                "909AB0A1AEFD02A193CFADC7F724D377E1F4E78DC21012BE26D910548CDF55B0AB9CB64756045FF48C3B858E954553267C4087EC5A9C860CFA56CF5CFBB442BDDA298230"
+                "D6C000A6A6010D87FB4C3859C3AFAF15C37BCE03EBC392E8149056C489508841110060A991F1EEAF1E7CCF0B279AB2B35F3DAC0FAB4F4A107794E67D305E6D61A27C8FEB"
+                "DEA00C3334C888B2092E740DD3EFF7A69F06CE12EF511126EB23D80902D1D54BF4AEE04DF9457D59E8859AA83D6229481E1B1BC7C3ED96F6F7C1CEEF7B904268FD00BE51"
+                "1EF69692D593F8A9F7CCC053C343306940A4054A55DBA94D95FF6D02B7A73E110C2DBE6CA29C01B5921420B5BC9C92DAA9D82003829C6AE772FF12135C2E138C6725DC47"
+                "7938F3062264575EBBB1CBB359E496DD7A38AE0E33D1B1D9C16BDD87E6DE44DFB832286AE01D00AA14B423DBF7ECCC34A0A06A249707B75C2BA931D7F4F513FDF0F6E516"
+                "345B8DA85FEFD218B390828AECADF0C47916FAF44CB29010B0BB2BBA8E120B6DAFB2CC90B9D1B8659C2AFB"
+            }
+        };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+        {
+            RTBIGNUM Base, Exponent, Expected;
+            if (   testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+            {
+                RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &Base, &Exponent), VINF_SUCCESS);
+                RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+            }
+        }
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
+    }
+}
+
+
+static void testModExp(void)
+{
+    RTTestSub(g_hTest, "RTBigNumModExp");
+
+    for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
+    {
+        RTBIGNUM Result;
+        RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_One, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_One, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_Zero, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_One), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Zero, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Three), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Three), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Five), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
+
+        RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Four), VINF_SUCCESS);
+        RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
+
+#if 0
+        static struct
+        {
+            const char *pszBase, *pszExponent, *pszModulus, *pszResult;
+        } s_aTests[] =
+        {
+            {
+                "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /*mod */ " ",  /* = */
+            },
+        };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
+        {
+            RTBIGNUM Base, Exponent, Expected, Modulus;
+            if (   testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Modulus, s_aTests[i].pszModulus, RTBIGNUMINIT_F_UNSIGNED | fFlags)
+                && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
+            {
+                RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &Base, &Exponent, &Modulus), VINF_SUCCESS);
+                RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
+                RTTESTI_CHECK_RC(RTBigNumDestroy(&Modulus), VINF_SUCCESS);
+            }
+        }
+#endif
+
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
+    }
+}
+
+
+static void testToBytes(void)
+{
+    RTTestSub(g_hTest, "RTBigNumToBytes*Endian");
+    uint8_t abBuf[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 1), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 2), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 3), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 4), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0 && abBuf[4] == 0xcc);
+
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 1), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xcc && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 2), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 3), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 4), VINF_SUCCESS);
+    RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xff && abBuf[4] == 0xcc);
+
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive)), VINF_SUCCESS);
+    RTTESTI_CHECK(memcmp(abBuf, g_abLargePositive, sizeof(g_abLargePositive)) == 0);
+    RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive)] == 0xcc);
+
+    memset(abBuf, 0xcc, sizeof(abBuf));
+    RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive) -1 ), VERR_BUFFER_OVERFLOW);
+    RTTESTI_CHECK(memcmp(abBuf, &g_abLargePositive[1], sizeof(g_abLargePositive) - 1) == 0);
+    RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive) - 1] == 0xcc);
+
+}
+
+
+int main()
+{
+    RTEXITCODE rcExit = RTTestInitAndCreate("tstRTBigNum", &g_hTest);
+    if (rcExit != RTEXITCODE_SUCCESS)
+        return rcExit;
+    RTTestBanner(g_hTest);
+
+    /* Init fixed integers. */
+    RTTestSub(g_hTest, "RTBigNumInit");
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargePositive, sizeof(g_abLargePositive)), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargePositive, sizeof(g_abLargePositive) - 11), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositiveMinus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargePositiveMinus1, sizeof(g_abLargePositiveMinus1)), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargeNegative, sizeof(g_abLargeNegative)), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargeNegative, sizeof(g_abLargeNegative) - 9), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegativePluss1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abLargeNegativePluss1, sizeof(g_abLargeNegativePluss1)), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_64BitPositive1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_ab64BitPositive1, sizeof(g_ab64BitPositive1)), VINF_SUCCESS);
+
+    RTTESTI_CHECK_RC(RTBigNumInitZero(&g_Zero, 0), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_One,       RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x01", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Two,       RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x02", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Three,     RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x03", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Four,      RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x04", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Five,      RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x05", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Ten,       RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x0a", 1), VINF_SUCCESS);
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_FourtyTwo, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x2a", 1), VINF_SUCCESS);
+
+    RTTESTI_CHECK_RC(RTBigNumInit(&g_Minus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
+                                  g_abMinus1, sizeof(g_abMinus1)), VINF_SUCCESS);
+    testMoreInit();
+
+    if (RTTestIErrorCount() == 0)
+    {
+        /* Do testing. */
+        testCompare();
+        testSubtraction();
+        testAddition();
+        testMultiplication();
+        testDivision();
+        testModulo();
+        testExponentiation();
+        testModExp();
+        testToBytes();
+
+        /* Cleanups. */
+        RTTestSub(g_hTest, "RTBigNumDestroy");
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive2), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative2), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_Zero), VINF_SUCCESS);
+        RTTESTI_CHECK_RC(RTBigNumDestroy(&g_64BitPositive1), VINF_SUCCESS);
+    }
+
+    return RTTestSummaryAndDestroy(g_hTest);
+}
+
diff --git a/src/VBox/Runtime/testcase/tstRTDigest-2.cpp b/src/VBox/Runtime/testcase/tstRTDigest-2.cpp
new file mode 100644
index 0000000..3137c91
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTDigest-2.cpp
@@ -0,0 +1,1278 @@
+/* $Id: tstRTDigest-2.cpp $ */
+/** @file
+ * IPRT Testcase - Checksums and Digests.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/crypto/digest.h>
+#include <iprt/md2.h>
+#include <iprt/md5.h>
+#include <iprt/sha.h>
+
+#include <iprt/asm.h>
+#include <iprt/err.h>
+#include <iprt/test.h>
+#include <iprt/thread.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+typedef struct TESTRTDIGEST
+{
+    /** Pointer to the input. */
+    void const *pvInput;
+    /** The size of the input. */
+    size_t      cbInput;
+    /** The expected digest. */
+    const char *pszDigest;
+    /** Clue what this is. Can be NULL. */
+    const char *pszTest;
+} TESTRTDIGEST;
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+#include "72kb-random.h"
+
+
+#define CHECK_STRING(a_pszActual, a_pszExpected) \
+    do { \
+        if (strcmp(a_pszActual, a_pszExpected)) \
+            RTTestIFailed("line %u: Expected %s, got %s.", __LINE__, a_pszExpected, a_pszActual); \
+    } while (0)
+
+
+/**
+ * Worker for testGeneric that finalizes the digest and compares it with what is
+ * expected.
+ *
+ * @returns true on success, false on failure.
+ * @param   hDigest             The digest to finalize and check.
+ * @param   iTest               The test number (for reporting).
+ * @param   pTest               The test.
+ */
+static bool testGenericCheckResult(RTCRDIGEST hDigest, uint32_t iTest, TESTRTDIGEST const *pTest)
+{
+    RTTESTI_CHECK_RC_RET(RTCrDigestFinal(hDigest, NULL, 0), VINF_SUCCESS, false);
+
+    char szDigest[_4K * 2];
+    RTTESTI_CHECK_RC_RET(RTStrPrintHexBytes(szDigest, sizeof(szDigest),
+                                            RTCrDigestGetHash(hDigest), RTCrDigestGetHashSize(hDigest), 0 /*fFlags*/),
+                         VINF_SUCCESS, false);
+
+    if (strcmp(szDigest, pTest->pszDigest))
+    {
+        RTTestIFailed("sub-test %#u (%s) failed: Expected %s, got %s.", iTest, pTest->pszTest, pTest->pszDigest, szDigest);
+        return false;
+    }
+
+    return true;
+}
+
+
+/**
+ * Table driven generic digest test case.
+ *
+ * @param   pszDigestObjId  The object ID of the digest algorithm to test.
+ * @param   paTests         The test table.
+ * @param   cTests          The number of tests in the table.
+ * @param   pszDigestName   The name of the digest.
+ * @param   enmDigestType   The digest enum type value.
+ */
+static void testGeneric(const char *pszDigestObjId, TESTRTDIGEST const *paTests, size_t cTests, const char *pszDigestName,
+                        RTDIGESTTYPE enmDigestType)
+{
+    /*
+     * Execute the tests.
+     */
+    RTCRDIGEST hDigest;
+    for (uint32_t iTest = 0; iTest < cTests; iTest++)
+    {
+        /*
+         * The whole thing in one go.
+         */
+        RTTESTI_CHECK_RC_RETV(RTCrDigestCreateByObjIdString(&hDigest, pszDigestObjId), VINF_SUCCESS);
+        uint32_t const cbHash = RTCrDigestGetHashSize(hDigest);
+        RTTESTI_CHECK_RETV(cbHash > 0);
+        RTTESTI_CHECK_RETV(cbHash < _1K);
+        RTTESTI_CHECK_RC_RETV(RTCrDigestUpdate(hDigest, paTests[iTest].pvInput, paTests[iTest].cbInput), VINF_SUCCESS);
+        if (!testGenericCheckResult(hDigest, iTest, &paTests[iTest]))
+            continue; /* skip the remaining tests if this failed. */
+
+        /*
+         * Repeat the test feeding the input in smaller chunks.
+         */
+        static const uint32_t s_acbChunks[] = { 1, 2, 3, 7, 11, 16, 19, 31, 61, 127, 255, 511, 1023, 1024 };
+        for (uint32_t i = 0; i < RT_ELEMENTS(s_acbChunks); i++)
+        {
+            uint32_t const cbChunk = s_acbChunks[i];
+
+            RTTESTI_CHECK_RC_RETV(RTCrDigestReset(hDigest), VINF_SUCCESS);
+
+            uint8_t const *pbInput = (uint8_t const *)paTests[iTest].pvInput;
+            size_t         cbInput = paTests[iTest].cbInput;
+            while (cbInput > 0)
+            {
+                size_t cbUpdate = RT_MIN(cbInput, cbChunk);
+                RTTESTI_CHECK_RC_RETV(RTCrDigestUpdate(hDigest, pbInput, cbUpdate), VINF_SUCCESS);
+                pbInput += cbUpdate;
+                cbInput -= cbUpdate;
+            }
+
+            if (!testGenericCheckResult(hDigest, iTest, &paTests[iTest]))
+                break; /* No need to test the other permutations if this fails. */
+        }
+
+        RTTESTI_CHECK_RC(RTCrDigestRelease(hDigest), 0);
+    }
+
+    /*
+     * Do a quick benchmark.
+     */
+    RTTESTI_CHECK_RC_RETV(RTCrDigestCreateByObjIdString(&hDigest, pszDigestObjId), VINF_SUCCESS);
+
+    /* Warmup. */
+    uint32_t cChunks  = enmDigestType == RTDIGESTTYPE_MD2 ? 12 : 128;
+    uint32_t cLeft    = cChunks;
+    int      rc       = VINF_SUCCESS;
+    RTThreadYield();
+    uint64_t uStartTS = RTTimeNanoTS();
+    while (cLeft-- > 0)
+        rc |= RTCrDigestUpdate(hDigest, g_abRandom72KB, sizeof(g_abRandom72KB));
+    uint64_t cNsPerChunk = (RTTimeNanoTS() - uStartTS) / cChunks;
+    if (!cNsPerChunk)
+        cNsPerChunk = 16000000 / cChunks; /* Time resolution kludge: 16ms. */
+    RTTESTI_CHECK_RETV(rc == VINF_SUCCESS);
+
+    /* Do it for real for about 2 seconds. */
+    RTTESTI_CHECK_RC(RTCrDigestReset(hDigest), VINF_SUCCESS);
+    cChunks = _2G32 / cNsPerChunk;
+    cLeft   = cChunks;
+    RTThreadYield();
+    uStartTS = RTTimeNanoTS();
+    while (cLeft-- > 0)
+        rc |= RTCrDigestUpdate(hDigest, g_abRandom72KB, sizeof(g_abRandom72KB));
+    uint64_t cNsElapsed = RTTimeNanoTS() - uStartTS;
+    RTTESTI_CHECK(rc == VINF_SUCCESS);
+
+    RTTestIValueF((uint64_t)cChunks * sizeof(g_abRandom72KB) / _1K / (0.000000001 * cNsElapsed), RTTESTUNIT_KILOBYTES_PER_SEC,
+                  "%s throughput", pszDigestName);
+    RTTESTI_CHECK_RC(RTCrDigestRelease(hDigest), 0);
+}
+
+
+/**
+ * Tests MD2.
+ */
+static void testMd2(void)
+{
+    RTTestISub("MD2");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTMD2_HASH_SIZE];
+    char        szDigest[RTMD2_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "8350e5a3e24c153df2275c9f80692773");
+
+    pszString = "The quick brown fox jumps over the lazy dog";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "03d85a0d629d2c442e987525319fc471");
+
+    pszString = "a";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "32ec01ec4a6dac72c0ab96fb34c0b5d1");
+
+    pszString = "abc";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "da853b0d3f88d99b30283a69e6ded6bb");
+
+    pszString = "message digest";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "ab4f496bfb2a530b219ff33031fe06b0");
+
+    pszString = "abcdefghijklmnopqrstuvwxyz";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "4e8ddff3650292ab5a4108c3aa47940b");
+
+    pszString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "da33def2a42df13975352846c30338cd");
+
+    pszString = "12345678901234567890123456789012345678901234567890123456789012345678901234567890";
+    RTMd2(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd2ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "d5976f79d83d3a0dc9806c3c66f3efd8");
+
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { &g_abRandom72KB[0],          0, "8350e5a3e24c153df2275c9f80692773", "MD2 0 bytes" },
+        { &g_abRandom72KB[0],          1, "142ca23308e886f4249d147914889156", "MD2 1 byte" },
+        { &g_abRandom72KB[0],          2, "5e962a3590849aff8038032cb55e4491", "MD2 2 bytes" },
+        { &g_abRandom72KB[0],          3, "0d866c59a8b5e1c305570be5ade02d5e", "MD2 3 bytes" },
+        { &g_abRandom72KB[0],          4, "dfd68bdf6826b5c8bf55675a0f0b8703", "MD2 4 bytes" },
+        { &g_abRandom72KB[0],          5, "33f83255dcceaf8abbafdca5327f9886", "MD2 5 bytes" },
+        { &g_abRandom72KB[0],          6, "586a0dac9c469e938adca3e405ba0ac8", "MD2 6 bytes" },
+        { &g_abRandom72KB[0],          7, "88427c5c074552dfd2ced41d4fe5e853", "MD2 7 bytes" },
+        { &g_abRandom72KB[0],          8, "927ac332618d50e49aae2d5f64c025b4", "MD2 8 bytes" },
+        { &g_abRandom72KB[0],          9, "9fcae6b2526d3f089a3cccc31aa8ebf1", "MD2 9 bytes" },
+        { &g_abRandom72KB[0],         10, "3ad05f9fd70ad323a0bbe77d2c320456", "MD2 10 bytes" },
+        { &g_abRandom72KB[0],         11, "d9bdb0ccacdd65694d19482521256e5d", "MD2 11 bytes" },
+        { &g_abRandom72KB[0],         12, "b79cb3a39d25750fa380f6e82c3cc239", "MD2 12 bytes" },
+        { &g_abRandom72KB[0],         13, "b7db14f7057edd00e8c769060a3a8cb3", "MD2 13 bytes" },
+        { &g_abRandom72KB[0],         14, "c3d3e05a1cb241890cbb164c800c4576", "MD2 14 bytes" },
+        { &g_abRandom72KB[0],         15, "08a7b38a5e0891b07a0ed1a69f6037b2", "MD2 15 bytes" },
+        { &g_abRandom72KB[0],         16, "7131c0f3b904678579fe4a64b79095a4", "MD2 16 bytes" },
+        { &g_abRandom72KB[0],         17, "f91ba6efd6069ff46d604ecfdec15ac9", "MD2 17 bytes" },
+        { &g_abRandom72KB[0],         18, "bea228d4e8358268071b440f41e68d21", "MD2 18 bytes" },
+        { &g_abRandom72KB[0],         19, "ca4c5c896ed5dc6ac52fb8b5aedcb044", "MD2 19 bytes" },
+        { &g_abRandom72KB[0],         20, "9e66429cd582564328b86f72208460f3", "MD2 20 bytes" },
+        { &g_abRandom72KB[0],         21, "a366dd52bcd8baf3578e5ccff819074b", "MD2 21 bytes" },
+        { &g_abRandom72KB[0],         22, "4f909f0f5101e87bb8652036fcd54fea", "MD2 22 bytes" },
+        { &g_abRandom72KB[0],         23, "f74233c43a71736be4ae4d0259658106", "MD2 23 bytes" },
+        { &g_abRandom72KB[0],         24, "3a245315355acb62a402646f3eb789e7", "MD2 24 bytes" },
+        { &g_abRandom72KB[0],         25, "f9bbc496a41f2f377b9e7a665a503fc4", "MD2 25 bytes" },
+        { &g_abRandom72KB[0],         26, "b90cc3e523c58b2ddee36dabf6544961", "MD2 26 bytes" },
+        { &g_abRandom72KB[0],         27, "99a035865fbd3fe595afc01140fa8c34", "MD2 27 bytes" },
+        { &g_abRandom72KB[0],         28, "8196f2d6989d824b828b483c8bf21390", "MD2 28 bytes" },
+        { &g_abRandom72KB[0],         29, "957754cec1095bb3eed25827282c00db", "MD2 29 bytes" },
+        { &g_abRandom72KB[0],         30, "8c392b65a3824de6edf94d4c4df064cd", "MD2 30 bytes" },
+        { &g_abRandom72KB[0],         31, "cb7276510e070c82e5391e682c262e1d", "MD2 31 bytes" },
+        { &g_abRandom72KB[0],         32, "cb6ba252ddd841c483095a58f2c2c78c", "MD2 32 bytes" },
+        { &g_abRandom72KB[0],         33, "a74fdcd7798bb3d9153d486e0c2049bf", "MD2 33 bytes" },
+        { &g_abRandom72KB[0],         34, "30f1d91b79c01fe15dda2d018e05ce8c", "MD2 34 bytes" },
+        { &g_abRandom72KB[0],         35, "d24c79922d3168fc5ea3896cf6517067", "MD2 35 bytes" },
+        { &g_abRandom72KB[0],         36, "eea7cb5dc0716cda6a1b97db655db057", "MD2 36 bytes" },
+        { &g_abRandom72KB[0],         37, "85223ec3f4b266bb9ef9546dd4c6fbe0", "MD2 37 bytes" },
+        { &g_abRandom72KB[0],         38, "4f45bdd2390452ab7ea46448f3e08d72", "MD2 38 bytes" },
+        { &g_abRandom72KB[0],         39, "c2e0e4b3fbaab93342e952ff1f45bb3e", "MD2 39 bytes" },
+        { &g_abRandom72KB[0],         40, "08967efe427009b4b4f1d6d444ae2897", "MD2 40 bytes" },
+        { &g_abRandom72KB[0],         41, "ef66a72fb184b64d07b525dc1a6e0376", "MD2 41 bytes" },
+        { &g_abRandom72KB[0],         42, "8e08b6337537406770c27584293ea515", "MD2 42 bytes" },
+        { &g_abRandom72KB[0],         43, "08fe64ee6d9a811154d9312c586c0a08", "MD2 43 bytes" },
+        { &g_abRandom72KB[0],         44, "4f29656bf1fe579357240d1a364415c5", "MD2 44 bytes" },
+        { &g_abRandom72KB[0],         45, "7998eb00e5774b175db8fa91de555aab", "MD2 45 bytes" },
+        { &g_abRandom72KB[0],         46, "a7692c36d342ba2b750f1f26fecdac56", "MD2 46 bytes" },
+        { &g_abRandom72KB[0],         47, "038f0bb2828f03fcabde6aa9dcb10e6d", "MD2 47 bytes" },
+        { &g_abRandom72KB[0],         48, "b178ffa99a7c5caefef81b8601fbd992", "MD2 48 bytes" },
+        { &g_abRandom72KB[0],         49, "f139777906b3ca8785a893f4aacd2489", "MD2 49 bytes" },
+        { &g_abRandom72KB[0],         50, "e1a57dcc846d8c0ad3853fde8278094e", "MD2 50 bytes" },
+        { &g_abRandom72KB[0],         51, "e754995fa0fd61ba9e10a54e12afde4f", "MD2 51 bytes" },
+        { &g_abRandom72KB[0],         52, "ddf17522138d919678f44eaeeb1c0901", "MD2 52 bytes" },
+        { &g_abRandom72KB[0],         53, "7b588ece72a7dca79fcabfda083b7ac0", "MD2 53 bytes" },
+        { &g_abRandom72KB[0],         54, "8b23c8a9261faeb9ebb2853a03f3f2eb", "MD2 54 bytes" },
+        { &g_abRandom72KB[0],         55, "89d700920d22d2f4a655add9fce30295", "MD2 55 bytes" },
+        { &g_abRandom72KB[0],         56, "c3ece99f88613724c8e6d17af9e728a9", "MD2 56 bytes" },
+        { &g_abRandom72KB[0],         57, "271a0f4e6e270fb0264348cff440f36d", "MD2 57 bytes" },
+        { &g_abRandom72KB[0],         58, "4b01b8d1f7912dea17b5c8f5aa0654f2", "MD2 58 bytes" },
+        { &g_abRandom72KB[0],         59, "ed399fc4cab3cbcc1d65dda49f9496b7", "MD2 59 bytes" },
+        { &g_abRandom72KB[0],         60, "59eab0ff60a2da2935cdd548082c3cf9", "MD2 60 bytes" },
+        { &g_abRandom72KB[0],         61, "88c5169745df6ef88088bd5d162ef2f9", "MD2 61 bytes" },
+        { &g_abRandom72KB[0],         62, "c4711f410d141f7e3fc40464cf117a98", "MD2 62 bytes" },
+        { &g_abRandom72KB[0],         63, "d9bf4e2e3692082cf712466c90c7548b", "MD2 63 bytes" },
+        { &g_abRandom72KB[0],         64, "cd8e18bede03bbc4620539b3d41091a0", "MD2 64 bytes" },
+        { &g_abRandom72KB[0],         65, "4ccbf9b18f0a47a958efd71f4bcff1d5", "MD2 65 bytes" },
+        { &g_abRandom72KB[0],         66, "5f0356e384a3ace42ddaa0053494e932", "MD2 66 bytes" },
+        { &g_abRandom72KB[0],         67, "c90f40c059da2d14c45c9a6f72fbc06a", "MD2 67 bytes" },
+        { &g_abRandom72KB[0],         68, "29d000bccfc0df57d79da8d275c5766d", "MD2 68 bytes" },
+        { &g_abRandom72KB[0],         69, "2fb908536b6e0e4ead7aa5e8552a10cb", "MD2 69 bytes" },
+        { &g_abRandom72KB[0],         70, "df1e18111f62b07aae8e3f81d74385d1", "MD2 70 bytes" },
+        { &g_abRandom72KB[0],         71, "1213eca29ce71f0037527f8347da4c1c", "MD2 71 bytes" },
+        { &g_abRandom72KB[0],         72, "bd6686795f936446534646f7d7f35e03", "MD2 72 bytes" },
+        { &g_abRandom72KB[0],         73, "b5181c0b712b3aa024e67430edbd816a", "MD2 73 bytes" },
+        { &g_abRandom72KB[0],         74, "3b05c33b18ac294e35cd18337d31a842", "MD2 74 bytes" },
+        { &g_abRandom72KB[0],         75, "1d6e83621f88667536242ff538872758", "MD2 75 bytes" },
+        { &g_abRandom72KB[0],         76, "d830d59fe1cba1da97f19c8750a130d6", "MD2 76 bytes" },
+        { &g_abRandom72KB[0],         77, "2d290278d7c502b59a68ca47f22e2ffd", "MD2 77 bytes" },
+        { &g_abRandom72KB[0],         78, "7fcf7fa7e54c5189c76c3724811fe105", "MD2 78 bytes" },
+        { &g_abRandom72KB[0],         79, "f41c1697d5cb26734108aace37d2f8ee", "MD2 79 bytes" },
+        { &g_abRandom72KB[0],         80, "ff814e4823539973251969c88f0aabd2", "MD2 80 bytes" },
+        { &g_abRandom72KB[0],         81, "eaf947ace4636dd9fdf5f540d48afa18", "MD2 81 bytes" },
+        { &g_abRandom72KB[0],         82, "89b69633a8f41d2f318a59157f7b1135", "MD2 82 bytes" },
+        { &g_abRandom72KB[0],         83, "22b6a01cf22dda9aecd29903eb551b96", "MD2 83 bytes" },
+        { &g_abRandom72KB[0],         84, "2ab03e9c9674df73c9316ae471275b9e", "MD2 84 bytes" },
+        { &g_abRandom72KB[0],         85, "f3c3b113995ad4bb6ac011bce4c8aaeb", "MD2 85 bytes" },
+        { &g_abRandom72KB[0],         86, "c47408bcce2ad6d88c27644381829d17", "MD2 86 bytes" },
+        { &g_abRandom72KB[0],         87, "6a7eb6a1d8d6e2d32fbfb5e18b4a7d78", "MD2 87 bytes" },
+        { &g_abRandom72KB[0],         88, "573d2746448f32b9fb2e7e96c902df5d", "MD2 88 bytes" },
+        { &g_abRandom72KB[0],         89, "88043ead96eb9ad170a2a5c04b31473e", "MD2 89 bytes" },
+        { &g_abRandom72KB[0],         90, "e08bf4255a9aceec98195d98fe23ca3a", "MD2 90 bytes" },
+        { &g_abRandom72KB[0],         91, "8c5d08ff1e6cd07b13ea5c8f2679be54", "MD2 91 bytes" },
+        { &g_abRandom72KB[0],         92, "229e41d0dea6c9fc50385a04107d34e1", "MD2 92 bytes" },
+        { &g_abRandom72KB[0],         93, "9ba3f41db14506d0d72d2477086fc3b0", "MD2 93 bytes" },
+        { &g_abRandom72KB[0],         94, "6838e101797e4af9db93cce7b7f08497", "MD2 94 bytes" },
+        { &g_abRandom72KB[0],         95, "a936e8484a013da8fb2f76b1a5e0e577", "MD2 95 bytes" },
+        { &g_abRandom72KB[0],         96, "34140248d6f7c3cfe08c52460bd5ae85", "MD2 96 bytes" },
+        { &g_abRandom72KB[0],         97, "65022916cd54ab0dfddd5b6a5d88daf6", "MD2 97 bytes" },
+        { &g_abRandom72KB[0],         98, "929a96dfeaca781892e1ef0114429d07", "MD2 98 bytes" },
+        { &g_abRandom72KB[0],         99, "f3c117eff8a7693a34f60d8364b32fb4", "MD2 99 bytes" },
+        { &g_abRandom72KB[0],        100, "b20414388581bc1f001bad02d34db98f", "MD2 100 bytes" },
+        { &g_abRandom72KB[0],        101, "2e649b9250edc6a717f7a72ba5ad245b", "MD2 101 bytes" },
+        { &g_abRandom72KB[0],        102, "84c30f8dfb3555f24320d1da1fe41845", "MD2 102 bytes" },
+        { &g_abRandom72KB[0],        103, "ce647df6e37517be82a63eb5bb06c010", "MD2 103 bytes" },
+        { &g_abRandom72KB[0],        104, "e58b4587f8d8654446b495054ca9a3c8", "MD2 104 bytes" },
+        { &g_abRandom72KB[0],        105, "d0e5067a2fcdd00cbb058228b9f23a09", "MD2 105 bytes" },
+        { &g_abRandom72KB[0],        106, "2666a7d835c27bf8e2b88e5260fc4b08", "MD2 106 bytes" },
+        { &g_abRandom72KB[0],        107, "ba5f7980c93a5f63a921d11f74aa0c0b", "MD2 107 bytes" },
+        { &g_abRandom72KB[0],        108, "c03ca631eed8a88ddd6aadb6b138da41", "MD2 108 bytes" },
+        { &g_abRandom72KB[0],        109, "84c273d3e262c7d0d18f8d32ce6c87ab", "MD2 109 bytes" },
+        { &g_abRandom72KB[0],        110, "8abc96f5ef0dd75a64ed4aebdb529e45", "MD2 110 bytes" },
+        { &g_abRandom72KB[0],        111, "85d93a90b19e9dcaf2794d61eaf6095f", "MD2 111 bytes" },
+        { &g_abRandom72KB[0],        112, "d14a45c32e48b9deee617a4682a6e47a", "MD2 112 bytes" },
+        { &g_abRandom72KB[0],        113, "171a52a9b9df939ce634a530e1fdb571", "MD2 113 bytes" },
+        { &g_abRandom72KB[0],        114, "bcfd33c67597ea544a54266c5b971ad5", "MD2 114 bytes" },
+        { &g_abRandom72KB[0],        115, "76799540a3dace08d09dc1c23e33d7db", "MD2 115 bytes" },
+        { &g_abRandom72KB[0],        116, "83ef334faedec13d17f5df823d0f98a1", "MD2 116 bytes" },
+        { &g_abRandom72KB[0],        117, "cafcb95eac55ba3a07d8a216dc89bf3c", "MD2 117 bytes" },
+        { &g_abRandom72KB[0],        118, "042c1f9c066204e9cb43a8ba6a73195a", "MD2 118 bytes" },
+        { &g_abRandom72KB[0],        119, "829e12d96e1a3ce4c51dd70e9774da42", "MD2 119 bytes" },
+        { &g_abRandom72KB[0],        120, "162c221e43624b03dee871e2ddf9275a", "MD2 120 bytes" },
+        { &g_abRandom72KB[0],        121, "272eba7f65e4704a8200039351f7b7ed", "MD2 121 bytes" },
+        { &g_abRandom72KB[0],        122, "4418e4c4ef6b6c9f5d6e35f934c54dc2", "MD2 122 bytes" },
+        { &g_abRandom72KB[0],        123, "cbb78508b71600c067923bf200abd2d2", "MD2 123 bytes" },
+        { &g_abRandom72KB[0],        124, "133e55a0236279fe2c3c8a616e6a4ec1", "MD2 124 bytes" },
+        { &g_abRandom72KB[0],        125, "5aba7624888166ecfcf88607e7bca4ff", "MD2 125 bytes" },
+        { &g_abRandom72KB[0],        126, "99fe0c4302b79f84b236eb125af38c9f", "MD2 126 bytes" },
+        { &g_abRandom72KB[0],        127, "1c6aacae3441ab225a7aec2deefa5f8a", "MD2 127 bytes" },
+        { &g_abRandom72KB[0],        128, "a971703ab10735c6df4e19ff5052da40", "MD2 128 bytes" },
+        { &g_abRandom72KB[0],        129, "e7fd473d1f062183a18af88e947d0096", "MD2 129 bytes" },
+        { &g_abRandom72KB[0],       1024, "bdccc17a55ced048a6937a2735b09cc6", "MD2 1024 bytes" },
+        { &g_abRandom72KB[0],      73001, "54e982ce469bc379a71e2ca755eabe31", "MD2 73001 bytes" },
+        { &g_abRandom72KB[0],      73728, "2cf3570a90117130c8879cca30dafb39", "MD2 73728 bytes" },
+        { &g_abRandom72KB[0x20c9],  9991, "bbba194efa81238e5b613e20e937144e", "MD2 8393 bytes @9991" },
+    };
+    testGeneric("1.2.840.113549.2.2", s_abTests, RT_ELEMENTS(s_abTests), "MD2", RTDIGESTTYPE_MD2);
+}
+
+
+/**
+ * Tests MD5.
+ */
+static void testMd5(void)
+{
+    RTTestISub("MD5");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTMD5_HASH_SIZE];
+    char        szDigest[RTMD5_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "d41d8cd98f00b204e9800998ecf8427e");
+
+    pszString = "The quick brown fox jumps over the lazy dog";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "9e107d9d372bb6826bd81d3542a419d6");
+
+    pszString = "a";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "0cc175b9c0f1b6a831c399e269772661");
+
+    pszString = "abc";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "900150983cd24fb0d6963f7d28e17f72");
+
+    pszString = "message digest";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "f96b697d7cb7938d525a2f31aaf161d0");
+
+    pszString = "abcdefghijklmnopqrstuvwxyz";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "c3fcd3d76192e4007dfb496cca67e13b");
+
+    pszString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "d174ab98d277d9f5a5611c2c9f419d9f");
+
+    pszString = "12345678901234567890123456789012345678901234567890123456789012345678901234567890";
+    RTMd5(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTMd5ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "57edf4a22be3c955ac49da2e2107b67a");
+
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { &g_abRandom72KB[0],         0, "d41d8cd98f00b204e9800998ecf8427e", "MD5 0 bytes" },
+        { &g_abRandom72KB[0],         1, "785d512be4316d578e6650613b45e934", "MD5 1 bytes" },
+        { &g_abRandom72KB[0],         2, "87ed1a6013d72148da0b0294e763048d", "MD5 2 bytes" },
+        { &g_abRandom72KB[0],         3, "822de939633727229045cb7789af7df5", "MD5 3 bytes" },
+        { &g_abRandom72KB[0],         4, "86287bc09cb9260cf25c132979051304", "MD5 4 bytes" },
+        { &g_abRandom72KB[0],         5, "d3d1ce75037d39cf5de6c00f0ed3ca78", "MD5 5 bytes" },
+        { &g_abRandom72KB[0],         6, "3dd3a9b4fdf9afecac4ff3a81fa42487", "MD5 6 bytes" },
+        { &g_abRandom72KB[0],         7, "15644ca265e05e9c6cf19f297fd061d4", "MD5 7 bytes" },
+        { &g_abRandom72KB[0],         8, "da96c8b71cd59cb6af75358ca6c85d7f", "MD5 8 bytes" },
+        { &g_abRandom72KB[0],         9, "c2ad718a365c3b3ea6452d18911c9731", "MD5 9 bytes" },
+        { &g_abRandom72KB[0],        10, "b5075641b6951182c10596c1f2e4f77a", "MD5 10 bytes" },
+        { &g_abRandom72KB[0],        11, "ceea2cb4481c655b7057e1b8dd5a0bd1", "MD5 11 bytes" },
+        { &g_abRandom72KB[0],        12, "006e60df0db98aaa0c7a920ea3b663e3", "MD5 12 bytes" },
+        { &g_abRandom72KB[0],        13, "3a2cfd399b70235b276203b03dd6eb0e", "MD5 13 bytes" },
+        { &g_abRandom72KB[0],        14, "e7829cff3b8c15a6771b9ee8e9dd2084", "MD5 14 bytes" },
+        { &g_abRandom72KB[0],        15, "4277413716da82ffee61f36fc25fd5b1", "MD5 15 bytes" },
+        { &g_abRandom72KB[0],        16, "823753a79e0677c9b7e41b5725dbce8f", "MD5 16 bytes" },
+        { &g_abRandom72KB[0],        17, "3af2c16a115519a00fa8c38f99bdd531", "MD5 17 bytes" },
+        { &g_abRandom72KB[0],        18, "e0d640f347fd089338434c4ddc826538", "MD5 18 bytes" },
+        { &g_abRandom72KB[0],        19, "d07554497ee83534affa84a5af86c04d", "MD5 19 bytes" },
+        { &g_abRandom72KB[0],        20, "b3156aab604ab535832243ff1ce0d3ea", "MD5 20 bytes" },
+        { &g_abRandom72KB[0],        21, "a4fb150aab01d4ac4859ecaecf221c63", "MD5 21 bytes" },
+        { &g_abRandom72KB[0],        22, "fe6aa2d9c68e100ebaca1bede6be7025", "MD5 22 bytes" },
+        { &g_abRandom72KB[0],        23, "db6c3662d9a8950ddcd1b8603a5ab040", "MD5 23 bytes" },
+        { &g_abRandom72KB[0],        24, "c56df7b41f9b1420e9e114e82484bcdf", "MD5 24 bytes" },
+        { &g_abRandom72KB[0],        25, "7194fb3612d4f53d8eeaa80d60618e49", "MD5 25 bytes" },
+        { &g_abRandom72KB[0],        26, "3355f00eac0c85ea8e84c713f55bca3a", "MD5 26 bytes" },
+        { &g_abRandom72KB[0],        27, "127b104d22b2cb437ba3b34f6c977e05", "MD5 27 bytes" },
+        { &g_abRandom72KB[0],        28, "ce4911fab274a55254cc8989252b47a9", "MD5 28 bytes" },
+        { &g_abRandom72KB[0],        29, "f9dd6d60777fee2d654835d5b239979b", "MD5 29 bytes" },
+        { &g_abRandom72KB[0],        30, "213779ae9dd7ce0cf199c42ad719da5d", "MD5 30 bytes" },
+        { &g_abRandom72KB[0],        31, "5e561c81405437e2205aa64eff81fad3", "MD5 31 bytes" },
+        { &g_abRandom72KB[0],        32, "e41238f661fa29883be2f387e56621fb", "MD5 32 bytes" },
+        { &g_abRandom72KB[0],        33, "d474457edf9bb331935109b905b2ac9c", "MD5 33 bytes" },
+        { &g_abRandom72KB[0],        34, "9c60aa7bb5380442a96fcc960c54f4cd", "MD5 34 bytes" },
+        { &g_abRandom72KB[0],        35, "6c27d085e88368d951d0be70bcb83daa", "MD5 35 bytes" },
+        { &g_abRandom72KB[0],        36, "e743d29943ddee43e2d3b20373868ace", "MD5 36 bytes" },
+        { &g_abRandom72KB[0],        37, "7917ff3a754410f5f3e6a1e34543ad3b", "MD5 37 bytes" },
+        { &g_abRandom72KB[0],        38, "d9f6b9d5188e836fa851a5900ac20f3a", "MD5 38 bytes" },
+        { &g_abRandom72KB[0],        39, "cef18b503ba9beb5ddf8a70112aaad88", "MD5 39 bytes" },
+        { &g_abRandom72KB[0],        40, "39be72035e1058aee305b984373a6b16", "MD5 40 bytes" },
+        { &g_abRandom72KB[0],        41, "5f8eda0e0084622bf6233594f06af754", "MD5 41 bytes" },
+        { &g_abRandom72KB[0],        42, "c30e55ff2004e7b90009dee503964bbf", "MD5 42 bytes" },
+        { &g_abRandom72KB[0],        43, "7a7f33277aa22a9199951022ab96c383", "MD5 43 bytes" },
+        { &g_abRandom72KB[0],        44, "4f02d1a4e1ab98f7aed56ba12964af62", "MD5 44 bytes" },
+        { &g_abRandom72KB[0],        45, "e0802f8b1739e5c284184d595624392e", "MD5 45 bytes" },
+        { &g_abRandom72KB[0],        46, "50ea8f8f8a2bc14f7c07a9ec42826daa", "MD5 46 bytes" },
+        { &g_abRandom72KB[0],        47, "365f247ba76a2024d2ff234b4e99bc48", "MD5 47 bytes" },
+        { &g_abRandom72KB[0],        48, "cea411e3c67e77b48170699fe259e1c6", "MD5 48 bytes" },
+        { &g_abRandom72KB[0],        49, "8453cb1977439f97279e39cbd8408ced", "MD5 49 bytes" },
+        { &g_abRandom72KB[0],        50, "e6288244d7ae6f30dafa113146044f1b", "MD5 50 bytes" },
+        { &g_abRandom72KB[0],        51, "f0c19a27d2474b5a2076ad0013ce966d", "MD5 51 bytes" },
+        { &g_abRandom72KB[0],        52, "9265e6aea5bb3e16b4771dc0e15e9b23", "MD5 52 bytes" },
+        { &g_abRandom72KB[0],        53, "3efcf10c3fd84a1999a11a8f2474fddd", "MD5 53 bytes" },
+        { &g_abRandom72KB[0],        54, "cd6004b92196226fc754794bb185c09e", "MD5 54 bytes" },
+        { &g_abRandom72KB[0],        55, "3ad247a37a75767374e3808930ff1240", "MD5 55 bytes" },
+        { &g_abRandom72KB[0],        56, "11e8564e3db197beeaa8b9665b2ee2aa", "MD5 56 bytes" },
+        { &g_abRandom72KB[0],        57, "790119e207ba5bf9b95768bd4acec278", "MD5 57 bytes" },
+        { &g_abRandom72KB[0],        58, "2ff7a27055eb975c8d36f7105b905422", "MD5 58 bytes" },
+        { &g_abRandom72KB[0],        59, "d1d5be70e576e9db7145b68bfaf4b8f7", "MD5 59 bytes" },
+        { &g_abRandom72KB[0],        60, "d4383ffab62bda08cf2222186954abc8", "MD5 60 bytes" },
+        { &g_abRandom72KB[0],        61, "69454edb58ddb72d7a715125ac5eefec", "MD5 61 bytes" },
+        { &g_abRandom72KB[0],        62, "c2ea1754ec455e15e83c79630e726295", "MD5 62 bytes" },
+        { &g_abRandom72KB[0],        63, "5c05c6ca2dc4ddbd52e447c2683aed47", "MD5 63 bytes" },
+        { &g_abRandom72KB[0],        64, "a9f2d51e24b01bef5c96d4ab09b00f7b", "MD5 64 bytes" },
+        { &g_abRandom72KB[0],        65, "f9ac6f5e2f43481d5966d7b9f946df6e", "MD5 65 bytes" },
+        { &g_abRandom72KB[0],        66, "004d20523ee8c581da762700d4856e95", "MD5 66 bytes" },
+        { &g_abRandom72KB[0],        67, "54180f89561ec585155c83cdb332eda7", "MD5 67 bytes" },
+        { &g_abRandom72KB[0],        68, "e6e884c81250372d2f6d1e297a58fd3d", "MD5 68 bytes" },
+        { &g_abRandom72KB[0],        69, "1ece0e157d215cec78ac5e7fc6096899", "MD5 69 bytes" },
+        { &g_abRandom72KB[0],        70, "998fc35762eb99548110129d81873b4b", "MD5 70 bytes" },
+        { &g_abRandom72KB[0],        71, "54e6dd0d33bc39c7bae536d20a070074", "MD5 71 bytes" },
+        { &g_abRandom72KB[0],        72, "0eef8b9cf8f1e008cec190ab021e42d2", "MD5 72 bytes" },
+        { &g_abRandom72KB[0],        73, "5519c0cdf891efe0bd9ead66cd20d9b4", "MD5 73 bytes" },
+        { &g_abRandom72KB[0],        74, "14deef0ce4d7e2105875532f21da2212", "MD5 74 bytes" },
+        { &g_abRandom72KB[0],        75, "938fdf08e55106e588fec9659ecc3f4b", "MD5 75 bytes" },
+        { &g_abRandom72KB[0],        76, "7f4f6a2114cd8552aa948b20d7cfd725", "MD5 76 bytes" },
+        { &g_abRandom72KB[0],        77, "5c34a0fe473b856d9665d789f7107146", "MD5 77 bytes" },
+        { &g_abRandom72KB[0],        78, "c0fe660ac18254a65efdc8f71da77635", "MD5 78 bytes" },
+        { &g_abRandom72KB[0],        79, "2c2670f20850aaa3f5e0d8a8fc07ae6e", "MD5 79 bytes" },
+        { &g_abRandom72KB[0],        80, "8e74b2fb1edfd2135fd7240c62906fce", "MD5 80 bytes" },
+        { &g_abRandom72KB[0],        81, "724214ccd4c5f1608cc577d80f1c1d63", "MD5 81 bytes" },
+        { &g_abRandom72KB[0],        82, "2215de010fdcc3fe82a4bda76fc4c00c", "MD5 82 bytes" },
+        { &g_abRandom72KB[0],        83, "f022e4fd762db1e713deff528eb8ab15", "MD5 83 bytes" },
+        { &g_abRandom72KB[0],        84, "262c82ee993d73543fb86f60d43849bc", "MD5 84 bytes" },
+        { &g_abRandom72KB[0],        85, "dac379497414e4135ea8e42ccbe39a11", "MD5 85 bytes" },
+        { &g_abRandom72KB[0],        86, "c01cb2483bbdf778b536b07d7b12d31b", "MD5 86 bytes" },
+        { &g_abRandom72KB[0],        87, "8f4753f5e64fa725f1a2a9a638e97686", "MD5 87 bytes" },
+        { &g_abRandom72KB[0],        88, "6f53a21288b8a107a237df50b99fbc63", "MD5 88 bytes" },
+        { &g_abRandom72KB[0],        89, "1df7274ecf95aecf4cef76070b4bc703", "MD5 89 bytes" },
+        { &g_abRandom72KB[0],        90, "ebde27beebf8649892818f2c1b94dbac", "MD5 90 bytes" },
+        { &g_abRandom72KB[0],        91, "c259c1aa0277ef8f3fda149d657f2958", "MD5 91 bytes" },
+        { &g_abRandom72KB[0],        92, "47654004a1761a853d3a052cf3207e04", "MD5 92 bytes" },
+        { &g_abRandom72KB[0],        93, "4e3011d42a53c359dfb7ed0cdd9fca3c", "MD5 93 bytes" },
+        { &g_abRandom72KB[0],        94, "eab81b49b0efad606e623cad773f9bad", "MD5 94 bytes" },
+        { &g_abRandom72KB[0],        95, "77a15147669b80b13cebf7f944865f7a", "MD5 95 bytes" },
+        { &g_abRandom72KB[0],        96, "6975f970c6c7f8d11a52b8465df6f752", "MD5 96 bytes" },
+        { &g_abRandom72KB[0],        97, "a5628bb324d1bd34bc41f81501c73c6d", "MD5 97 bytes" },
+        { &g_abRandom72KB[0],        98, "c1b67f871130569c8dcd56b13997011b", "MD5 98 bytes" },
+        { &g_abRandom72KB[0],        99, "4225c0cda6c16259a74c0733f3fa3025", "MD5 99 bytes" },
+        { &g_abRandom72KB[0],       100, "39d1a9671f5eee3fd63f571e5700fb18", "MD5 100 bytes" },
+        { &g_abRandom72KB[0],       101, "743bed2b5485505ebcd9c2dcaf61afd3", "MD5 101 bytes" },
+        { &g_abRandom72KB[0],       102, "7a0d60739b87793168113a695257de4b", "MD5 102 bytes" },
+        { &g_abRandom72KB[0],       103, "d483ae1c829dc3244ede1f46488c0f0c", "MD5 103 bytes" },
+        { &g_abRandom72KB[0],       104, "1502b082b28c1b60decad1c3ec8d637b", "MD5 104 bytes" },
+        { &g_abRandom72KB[0],       105, "df0d769bad97093d00560e4221023dbf", "MD5 105 bytes" },
+        { &g_abRandom72KB[0],       106, "bd3641699ffe5adb1c8a3c8917abb1ff", "MD5 106 bytes" },
+        { &g_abRandom72KB[0],       107, "b5e585c6da2c40a7e5aab059e7bd15ee", "MD5 107 bytes" },
+        { &g_abRandom72KB[0],       108, "e3f8ec4a683a3512f73639cd6ef69638", "MD5 108 bytes" },
+        { &g_abRandom72KB[0],       109, "a4a4b065603644c6d50dc0a4426badf6", "MD5 109 bytes" },
+        { &g_abRandom72KB[0],       110, "7b22226bdb2504211fa8b99d2860b2c0", "MD5 110 bytes" },
+        { &g_abRandom72KB[0],       111, "ab89296851f6ffc435431b82a3247b15", "MD5 111 bytes" },
+        { &g_abRandom72KB[0],       112, "20249b22ba14b007555e54c9366ddabd", "MD5 112 bytes" },
+        { &g_abRandom72KB[0],       113, "6bf5d9a3a30b5eb7af2a4092eda69ecd", "MD5 113 bytes" },
+        { &g_abRandom72KB[0],       114, "f7d97a06da8494176e0fe01934e31e1f", "MD5 114 bytes" },
+        { &g_abRandom72KB[0],       115, "2616a77b387bb99afdf8bb1f54f7a000", "MD5 115 bytes" },
+        { &g_abRandom72KB[0],       116, "bf81d63f172e2ce9b958f0da5c92c344", "MD5 116 bytes" },
+        { &g_abRandom72KB[0],       117, "8633ee1f631841cb1887a487f22a9f9f", "MD5 117 bytes" },
+        { &g_abRandom72KB[0],       118, "0f3b0311c0cf9d9eba3240404cae137d", "MD5 118 bytes" },
+        { &g_abRandom72KB[0],       119, "f79c00a97df8d45a211e6d01409c119b", "MD5 119 bytes" },
+        { &g_abRandom72KB[0],       120, "4d88da4ff44c801f692b46869f2fbb98", "MD5 120 bytes" },
+        { &g_abRandom72KB[0],       121, "15ca57bd78833831f54dfdcfbd5e4d29", "MD5 121 bytes" },
+        { &g_abRandom72KB[0],       122, "0877ba42c2b57ab3d0041ddbc4bd930b", "MD5 122 bytes" },
+        { &g_abRandom72KB[0],       123, "66086909e3740dd20004b0968e3316b5", "MD5 123 bytes" },
+        { &g_abRandom72KB[0],       124, "bafe834041396ce465f0995677ea6fba", "MD5 124 bytes" },
+        { &g_abRandom72KB[0],       125, "634eff105e618d75ab738512aff11048", "MD5 125 bytes" },
+        { &g_abRandom72KB[0],       126, "850257fc17096cce1e2d6de664e7ec04", "MD5 126 bytes" },
+        { &g_abRandom72KB[0],       127, "f12f54a3ecee91de840103aaa0d3726a", "MD5 127 bytes" },
+        { &g_abRandom72KB[0],       128, "1a266528b8119279e9639418a2d85e77", "MD5 128 bytes" },
+        { &g_abRandom72KB[0],       129, "e4791e35863addd6fa74ff1662d6a908", "MD5 129 bytes" },
+        { &g_abRandom72KB[0],      1024, "310e55220bd80529e76a544209f8e532", "MD5 1024 bytes" },
+        { &g_abRandom72KB[0],     73001, "f3d05b52be86f1db66a9ebf5ababaaa8", "MD5 73001 bytes" },
+        { &g_abRandom72KB[0],     73728, "aef57c3b2ec6e560b51b8094fe34def7", "MD5 73728 bytes" },
+        { &g_abRandom72KB[0x20c9], 9991, "6461339c6615d23c704298a313e07cf5", "MD5 8393 bytes @9991" },
+    };
+    testGeneric("1.2.840.113549.2.5", s_abTests, RT_ELEMENTS(s_abTests), "MD5", RTDIGESTTYPE_MD5);
+}
+
+
+/**
+ * Tests SHA-1
+ */
+static void testSha1(void)
+{
+    RTTestISub("SHA-1");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA1_HASH_SIZE];
+    char        szDigest[RTSHA1_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "";
+    RTSha1(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha1ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "da39a3ee5e6b4b0d3255bfef95601890afd80709");
+
+    pszString = "The quick brown fox jumps over the lazy dog";
+    RTSha1(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha1ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12");
+
+    pszString = "a";
+    RTSha1(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha1ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
+
+    pszString = "abc";
+    RTSha1(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha1ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "a9993e364706816aba3e25717850c26c9cd0d89d");
+
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { &g_abRandom72KB[0],         0, "da39a3ee5e6b4b0d3255bfef95601890afd80709", "SHA-1 0 bytes" },
+        { &g_abRandom72KB[0],         1, "768aab37c292010133979e821ad5ac081ade388a", "SHA-1 1 bytes" },
+        { &g_abRandom72KB[0],         2, "e1d72a3d75ec967fe2826670ed35ce5242204ad2", "SHA-1 2 bytes" },
+        { &g_abRandom72KB[0],         3, "d76ef947caa78f5e786d4ea417edec1d8f5a399b", "SHA-1 3 bytes" },
+        { &g_abRandom72KB[0],         4, "392932bb1bd20acce81b1c9df604cb149ca3089e", "SHA-1 4 bytes" },
+        { &g_abRandom72KB[0],         5, "f13362588bcfe78afd6f2b4f264bfa10f9e18bcf", "SHA-1 5 bytes" },
+        { &g_abRandom72KB[0],         6, "9f582f1afe75e3769d6afc95f266b114c1f42349", "SHA-1 6 bytes" },
+        { &g_abRandom72KB[0],         7, "e9326429c1709dd2278220e72eab0de2eebcfa67", "SHA-1 7 bytes" },
+        { &g_abRandom72KB[0],         8, "7882a61d6bd15b1377810d6a2083c20306b56b2d", "SHA-1 8 bytes" },
+        { &g_abRandom72KB[0],         9, "71df6819243e6ff29be17628fd9e051d732bf26e", "SHA-1 9 bytes" },
+        { &g_abRandom72KB[0],        10, "76f9029c260c99700fe14341d39067bcc746b766", "SHA-1 10 bytes" },
+        { &g_abRandom72KB[0],        11, "b11df4de9916a760282f046f86d7e65ebc276daa", "SHA-1 11 bytes" },
+        { &g_abRandom72KB[0],        12, "67af3a95329eb9d23b4db48e372befe02f93860d", "SHA-1 12 bytes" },
+        { &g_abRandom72KB[0],        13, "add021eaaa1c315110708e307ff6cf838fac4764", "SHA-1 13 bytes" },
+        { &g_abRandom72KB[0],        14, "b66297ac3211b967b27010316a4feeb87af377b1", "SHA-1 14 bytes" },
+        { &g_abRandom72KB[0],        15, "8350ccd151d4fbc8fcaa76486854c82ce28bf1c2", "SHA-1 15 bytes" },
+        { &g_abRandom72KB[0],        16, "e005dbbc5f955cf88e06ad92eb2fecb8d7abc829", "SHA-1 16 bytes" },
+        { &g_abRandom72KB[0],        17, "d9b9101f8026e9c9e164370e11b6b14877642339", "SHA-1 17 bytes" },
+        { &g_abRandom72KB[0],        18, "f999dfca047ee12be46b4141d9387d8694a8c03f", "SHA-1 18 bytes" },
+        { &g_abRandom72KB[0],        19, "366324b23a2ef746fe5bedce961482c0e8816fd1", "SHA-1 19 bytes" },
+        { &g_abRandom72KB[0],        20, "6f987e9f030a9b25790ec79b0c9c0a5d8085a565", "SHA-1 20 bytes" },
+        { &g_abRandom72KB[0],        21, "799a3aa036d56809e459f757a4086a9b83549fd8", "SHA-1 21 bytes" },
+        { &g_abRandom72KB[0],        22, "1fd879155acdd70d26b64533283b033db95cb264", "SHA-1 22 bytes" },
+        { &g_abRandom72KB[0],        23, "888db854b475c3923f73090ad855d68c8708ecf4", "SHA-1 23 bytes" },
+        { &g_abRandom72KB[0],        24, "c81e41a34ec7ae112a59bdcc1e31c9dd9f75cafc", "SHA-1 24 bytes" },
+        { &g_abRandom72KB[0],        25, "a19edeb182e13e11c7371b6795f9f973544e25e2", "SHA-1 25 bytes" },
+        { &g_abRandom72KB[0],        26, "7a98f96aa921d6932dd966d4f41f7afafef50992", "SHA-1 26 bytes" },
+        { &g_abRandom72KB[0],        27, "847272961c5a5a1b10d2fefab9d95475bb246e6b", "SHA-1 27 bytes" },
+        { &g_abRandom72KB[0],        28, "eb2b1dbc0ea2a23e308e1bf9d6e78167f62b9a5c", "SHA-1 28 bytes" },
+        { &g_abRandom72KB[0],        29, "5050998e561c0887e3365d8c87f63ce00cc4084e", "SHA-1 29 bytes" },
+        { &g_abRandom72KB[0],        30, "42278d4e8a70aeaa64f9194f1c90d827bba85a45", "SHA-1 30 bytes" },
+        { &g_abRandom72KB[0],        31, "f87ad36842c6e36fbbe7b3edd6514d4670367b79", "SHA-1 31 bytes" },
+        { &g_abRandom72KB[0],        32, "9faa3230afd8279a4b006d37b9f243b2f6430616", "SHA-1 32 bytes" },
+        { &g_abRandom72KB[0],        33, "5ca875e82e84cfa9aee1adc5a54fdb8b276f9c9a", "SHA-1 33 bytes" },
+        { &g_abRandom72KB[0],        34, "833d2bb01ec548b204750e0a3b9226059377aa66", "SHA-1 34 bytes" },
+        { &g_abRandom72KB[0],        35, "aeb0843fc2978addc14cc42a184887a57678722b", "SHA-1 35 bytes" },
+        { &g_abRandom72KB[0],        36, "77d4e5da16564461a0a44ce0ac4d0e885c46c127", "SHA-1 36 bytes" },
+        { &g_abRandom72KB[0],        37, "dfe064bcfed5f8fa2fe8efca6a75a9ca51d2ef43", "SHA-1 37 bytes" },
+        { &g_abRandom72KB[0],        38, "a89cf8c2af3a1ede699eb7421d0038030035b081", "SHA-1 38 bytes" },
+        { &g_abRandom72KB[0],        39, "5f4eb0893c2ea7445fea51508573f9f8eab98862", "SHA-1 39 bytes" },
+        { &g_abRandom72KB[0],        40, "2cf921e5e564b947c6ae98e709b49e9e7c7f9c2f", "SHA-1 40 bytes" },
+        { &g_abRandom72KB[0],        41, "7788ea70ee17e475b360e4e59f3f7792137e836d", "SHA-1 41 bytes" },
+        { &g_abRandom72KB[0],        42, "6506ab486671f2a2b7e8a19626da6ae531299f39", "SHA-1 42 bytes" },
+        { &g_abRandom72KB[0],        43, "950096584b7a7aabd610ef466be73e544d9d0809", "SHA-1 43 bytes" },
+        { &g_abRandom72KB[0],        44, "ff99e44ed9e8f30f81a9b50f61c376681ee16a91", "SHA-1 44 bytes" },
+        { &g_abRandom72KB[0],        45, "f043b267447eaf18c89528e8f52fa0c8f33c0022", "SHA-1 45 bytes" },
+        { &g_abRandom72KB[0],        46, "a9527c0a351fe0b4606eba0a8900b78c0f311f1a", "SHA-1 46 bytes" },
+        { &g_abRandom72KB[0],        47, "579f1fea36188490d80bfe4f04bd5a0e625006d2", "SHA-1 47 bytes" },
+        { &g_abRandom72KB[0],        48, "c43765e7b3565e7a78ccf96011a4afad18f7f781", "SHA-1 48 bytes" },
+        { &g_abRandom72KB[0],        49, "a3130b7c92c6441e8c319c6768e611d74e419ce7", "SHA-1 49 bytes" },
+        { &g_abRandom72KB[0],        50, "ef8fedfa73384d6c68c7e956ddc1c45239d40be0", "SHA-1 50 bytes" },
+        { &g_abRandom72KB[0],        51, "a4dea447ae78523fec06a7e65d798f1a61c3b96b", "SHA-1 51 bytes" },
+        { &g_abRandom72KB[0],        52, "86b4aa02ab3cc63badf544131087689ecaf25f24", "SHA-1 52 bytes" },
+        { &g_abRandom72KB[0],        53, "a0faf581ceaa922d0530f90d76fbd93e93810d58", "SHA-1 53 bytes" },
+        { &g_abRandom72KB[0],        54, "80ab7368ad003e5083d9804579a565de6a278c40", "SHA-1 54 bytes" },
+        { &g_abRandom72KB[0],        55, "8b1bec05d4a56b1beb500f2d639b3f7887d68e81", "SHA-1 55 bytes" },
+        { &g_abRandom72KB[0],        56, "66ba1322833fd92af27ae37e4382e95b525969b4", "SHA-1 56 bytes" },
+        { &g_abRandom72KB[0],        57, "ecab320750baead21b14d31450512ec0584ccd8d", "SHA-1 57 bytes" },
+        { &g_abRandom72KB[0],        58, "a4f13253e34d4dc4f65c4b4b3da694fdf8af3bf9", "SHA-1 58 bytes" },
+        { &g_abRandom72KB[0],        59, "73f6b88c28af42df6a0ab207e33176078082f67d", "SHA-1 59 bytes" },
+        { &g_abRandom72KB[0],        60, "d19f291905289ded6ed13b3dc8c47f94b999c100", "SHA-1 60 bytes" },
+        { &g_abRandom72KB[0],        61, "bd0bef35c45892c13c27825de9920a8b9fc91d73", "SHA-1 61 bytes" },
+        { &g_abRandom72KB[0],        62, "f62f8426087fea0bf3733f2b2f6d37fd155d01f6", "SHA-1 62 bytes" },
+        { &g_abRandom72KB[0],        63, "22891a14ef0e27fabef93f768fd645e042254011", "SHA-1 63 bytes" },
+        { &g_abRandom72KB[0],        64, "364a08a4a85f6fe61272125ae2e549a1c4cc3fe4", "SHA-1 64 bytes" },
+        { &g_abRandom72KB[0],        65, "8bf19ebbe263845cd3c35b853f1892d959dc8bd4", "SHA-1 65 bytes" },
+        { &g_abRandom72KB[0],        66, "ed3a0f2dc02fcc12e134bfd2f4e23a6294122e57", "SHA-1 66 bytes" },
+        { &g_abRandom72KB[0],        67, "596308eb7eabf39431ec953d2c6bacb9bb7c6c70", "SHA-1 67 bytes" },
+        { &g_abRandom72KB[0],        68, "d1d736e7d1a7ffe5613f6337248d67d7ebf8be01", "SHA-1 68 bytes" },
+        { &g_abRandom72KB[0],        69, "6ebad117db6e9cdfedae52f44df3ba51eb95efa2", "SHA-1 69 bytes" },
+        { &g_abRandom72KB[0],        70, "f5a05b4b156c07c23e8779f776a7f894922c148f", "SHA-1 70 bytes" },
+        { &g_abRandom72KB[0],        71, "01aef4f832ad68e6708f31a97bc363d9da20b6ba", "SHA-1 71 bytes" },
+        { &g_abRandom72KB[0],        72, "1bbf9dc55aa008a5e0c7fc4d34cb9e283f785b4e", "SHA-1 72 bytes" },
+        { &g_abRandom72KB[0],        73, "1504867acdbe4b1db5015d272182d17a4620a8b9", "SHA-1 73 bytes" },
+        { &g_abRandom72KB[0],        74, "7c96021e92a9bf98e5fb34ac17a3db487f1c7ac7", "SHA-1 74 bytes" },
+        { &g_abRandom72KB[0],        75, "d53acd002a6fc89120bc1ae7698aa0996cfacf00", "SHA-1 75 bytes" },
+        { &g_abRandom72KB[0],        76, "f8036f1ffdcaaadc1beb1542264f43060bf7c0c3", "SHA-1 76 bytes" },
+        { &g_abRandom72KB[0],        77, "6bec2adc19d2229054499d035f9904b6a69ea89a", "SHA-1 77 bytes" },
+        { &g_abRandom72KB[0],        78, "ad09365576f77c608afe0242caaae3604ce0fd17", "SHA-1 78 bytes" },
+        { &g_abRandom72KB[0],        79, "8ef16b886a12c3ceadf67d6bf8ee016c72b4c02a", "SHA-1 79 bytes" },
+        { &g_abRandom72KB[0],        80, "bd60ca67ea01e456de55bfbf0cc1095eadeda98a", "SHA-1 80 bytes" },
+        { &g_abRandom72KB[0],        81, "6cb9bb8e6447fff7a04e46de9e8410bffe7185f9", "SHA-1 81 bytes" },
+        { &g_abRandom72KB[0],        82, "2365ced0aa582dfdfe0b7ba0607e6953d64e1029", "SHA-1 82 bytes" },
+        { &g_abRandom72KB[0],        83, "4597ee3f912cce76b81d05eb0d4941af76688995", "SHA-1 83 bytes" },
+        { &g_abRandom72KB[0],        84, "287a99bcb83b395e9e0b1f36d492417f4bd25d6f", "SHA-1 84 bytes" },
+        { &g_abRandom72KB[0],        85, "689caf3dd39ec1cf99baba13c549d9a25797e3e1", "SHA-1 85 bytes" },
+        { &g_abRandom72KB[0],        86, "1fc2a6da9ba7a623f5eac73b56134772de374d1c", "SHA-1 86 bytes" },
+        { &g_abRandom72KB[0],        87, "a2c3cb4c5b1dc6dfdf553614bf846ed794874f16", "SHA-1 87 bytes" },
+        { &g_abRandom72KB[0],        88, "3e9b451561c66d9eb9e9052c3027d4d91f495771", "SHA-1 88 bytes" },
+        { &g_abRandom72KB[0],        89, "a47b63438fdaaab0bb4ea5e31b84aaae118bc9a9", "SHA-1 89 bytes" },
+        { &g_abRandom72KB[0],        90, "5c1b3fbc228add14796ed049b00924ed7140340d", "SHA-1 90 bytes" },
+        { &g_abRandom72KB[0],        91, "b873c08cb5329f82bd6adcd134f81e29597c4964", "SHA-1 91 bytes" },
+        { &g_abRandom72KB[0],        92, "f77066f9a0908d50e6018300cb82f436df9c8045", "SHA-1 92 bytes" },
+        { &g_abRandom72KB[0],        93, "b4c97048c643c9e5b6355683d36a1faee6d023ac", "SHA-1 93 bytes" },
+        { &g_abRandom72KB[0],        94, "d6b48d223bd97d3b53c0868c0528f18a3d5ebc88", "SHA-1 94 bytes" },
+        { &g_abRandom72KB[0],        95, "9562095eccd53bf5a968bc3eda65f3e327326b8e", "SHA-1 95 bytes" },
+        { &g_abRandom72KB[0],        96, "b394b8e175238834daf9c4d3b5fc8dbcfd982ae9", "SHA-1 96 bytes" },
+        { &g_abRandom72KB[0],        97, "c0127c82cb667da52892e462b5e9cdafb4f0deaa", "SHA-1 97 bytes" },
+        { &g_abRandom72KB[0],        98, "f51474c9995eb341748dea0f07f60cac46d5fa87", "SHA-1 98 bytes" },
+        { &g_abRandom72KB[0],        99, "6ae3406d41332cfe86c40d275b5e1e394893361b", "SHA-1 99 bytes" },
+        { &g_abRandom72KB[0],       100, "0d5823c081f69ad4e7fbd7ee0ed12092f6e2ed75", "SHA-1 100 bytes" },
+        { &g_abRandom72KB[0],       101, "fc8527f9c789abf67e2bcc78e2048f4eda8f7d7d", "SHA-1 101 bytes" },
+        { &g_abRandom72KB[0],       102, "a322eb5d5e65833310953a3a7bb1081e05b69318", "SHA-1 102 bytes" },
+        { &g_abRandom72KB[0],       103, "5a4fac64b273263043c771a5f9bae1fb243cd7d6", "SHA-1 103 bytes" },
+        { &g_abRandom72KB[0],       104, "bad4d3f3091817273dbac07b8712eec27b16cb6b", "SHA-1 104 bytes" },
+        { &g_abRandom72KB[0],       105, "ca0721a40610ea6290b97b541806b195e659af19", "SHA-1 105 bytes" },
+        { &g_abRandom72KB[0],       106, "cf3fb01cc0d95898e3b698ebdbd3c1e2624eacd2", "SHA-1 106 bytes" },
+        { &g_abRandom72KB[0],       107, "e3509ada3e264733cd36e2dab301650797fa8351", "SHA-1 107 bytes" },
+        { &g_abRandom72KB[0],       108, "045ca9690e7ac3336fd8907c28650c3ad489cbfe", "SHA-1 108 bytes" },
+        { &g_abRandom72KB[0],       109, "44a6c85d7d9053679fde01139ee0cf6176754227", "SHA-1 109 bytes" },
+        { &g_abRandom72KB[0],       110, "2ea6df640202b8799a885887a7c62a05247e60da", "SHA-1 110 bytes" },
+        { &g_abRandom72KB[0],       111, "38b0a91b3b2949cf752d3273157b9fa911972ad3", "SHA-1 111 bytes" },
+        { &g_abRandom72KB[0],       112, "962b950eab71062e7bc619e33cee36ceded923ee", "SHA-1 112 bytes" },
+        { &g_abRandom72KB[0],       113, "ccdecb735b377f1023ac2ad1e5ef0cb264bccf63", "SHA-1 113 bytes" },
+        { &g_abRandom72KB[0],       114, "4491b4e057d62e9c875b9153e9d76860657ab1a7", "SHA-1 114 bytes" },
+        { &g_abRandom72KB[0],       115, "f2d6c27c001222592fe06ba3e8c408b7033d14e1", "SHA-1 115 bytes" },
+        { &g_abRandom72KB[0],       116, "c9651c478f36ddacbca4cd680b37db6869473ed4", "SHA-1 116 bytes" },
+        { &g_abRandom72KB[0],       117, "b69442fcaa3e3bd617d3d3a0d436eb170e580083", "SHA-1 117 bytes" },
+        { &g_abRandom72KB[0],       118, "a48a7f361bf44d4e055a7e6aaa51f5b2f8de4419", "SHA-1 118 bytes" },
+        { &g_abRandom72KB[0],       119, "257d756bebc29cd408394b23f1891739cfd00755", "SHA-1 119 bytes" },
+        { &g_abRandom72KB[0],       120, "1ef9f2becc7217db45b97d7a0f47da9ed23f8957", "SHA-1 120 bytes" },
+        { &g_abRandom72KB[0],       121, "06ac75dc3ffee76eeefa11bb10dae6f4fb94ece8", "SHA-1 121 bytes" },
+        { &g_abRandom72KB[0],       122, "883c7780a8926ac22cb6dff4dbb8889c579ebb99", "SHA-1 122 bytes" },
+        { &g_abRandom72KB[0],       123, "004e08413617c1bb262d95f66a5ed5fff82b718b", "SHA-1 123 bytes" },
+        { &g_abRandom72KB[0],       124, "f68155afc2ee6292c881db5721f3e0f6e77a0bca", "SHA-1 124 bytes" },
+        { &g_abRandom72KB[0],       125, "e9ec6e4b4b1123adceda9d0f7db99c10712af649", "SHA-1 125 bytes" },
+        { &g_abRandom72KB[0],       126, "bcf570708b73c20d9805172f50935ab44d122e6b", "SHA-1 126 bytes" },
+        { &g_abRandom72KB[0],       127, "4b5f949b1b8a0a2b3716aba8cad91f45ae0f9408", "SHA-1 127 bytes" },
+        { &g_abRandom72KB[0],       128, "fd78703c7d7ce4a29bd79230898b7ac382f117cc", "SHA-1 128 bytes" },
+        { &g_abRandom72KB[0],       129, "461d0063059b9d4b8255f621bd329dfecdfaedef", "SHA-1 129 bytes" },
+        { &g_abRandom72KB[0],      1024, "2abd8ddb6c13b55596f31c74d96a04411ad39e8e", "SHA-1 1024 bytes" },
+        { &g_abRandom72KB[0],     73001, "e8c68bf7f6bd3b5c2a482c8a2ca9849b1e5afff1", "SHA-1 73001 bytes" },
+        { &g_abRandom72KB[0],     73728, "e89f36633ad2745ab2aac50ea7b2fe23e49ba69f", "SHA-1 73728 bytes" },
+        { &g_abRandom72KB[0x20c9],  9991, "62001184bacacce3774566d916055d425a85eba5", "SHA-1 8393 bytes @9991" },
+    };
+    testGeneric("1.3.14.3.2.26", s_abTests, RT_ELEMENTS(s_abTests), "SHA-1", RTDIGESTTYPE_SHA1);
+}
+
+
+/**
+ * Tests SHA-256
+ */
+static void testSha256(void)
+{
+    RTTestISub("SHA-256");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA256_HASH_SIZE];
+    char        szDigest[RTSHA256_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "";
+    RTSha256(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha256ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
+
+    pszString = "The quick brown fox jumps over the lazy dog";
+    RTSha256(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha256ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { &g_abRandom72KB[0],         0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "SHA-256 0 bytes" },
+        { &g_abRandom72KB[0],         1, "e6f207509afa3908da116ce61a7576954248d9fe64a3c652b493cca57ce36e2e", "SHA-256 1 bytes" },
+        { &g_abRandom72KB[0],         2, "51f3435c5f25f051c7e9209728c37a062d7d93c1d7c4075a5e383f2600cd1422", "SHA-256 2 bytes" },
+        { &g_abRandom72KB[0],         3, "37cd6662639ecea8c1c26ae10cf307f6884b5ab6ddba99885a9fd92349044de1", "SHA-256 3 bytes" },
+        { &g_abRandom72KB[0],         4, "a31bb0a349218352bb721a901b7bf8b9290d1b81eec4ac7e6005a2cfd5b3baa9", "SHA-256 4 bytes" },
+        { &g_abRandom72KB[0],         5, "00a42e462920c577ae608ddcaedf9478b53d25541b696e454dd8d7fb14f61c35", "SHA-256 5 bytes" },
+        { &g_abRandom72KB[0],         6, "6c80d81f45f18cfaaf6c3de33dc505936f7faa41f714cdc7b0c8a3bdba15ade4", "SHA-256 6 bytes" },
+        { &g_abRandom72KB[0],         7, "540ea7cc49b1aa11cfd4004b0faebc1b72cfa4aa0bcd940c4341bbd9ac4f6913", "SHA-256 7 bytes" },
+        { &g_abRandom72KB[0],         8, "b5822d2199e3b3d7e6260d083dbf8bd79aa5ea7e27c3b879997c90098cbf1f06", "SHA-256 8 bytes" },
+        { &g_abRandom72KB[0],         9, "6d983a270c13e529d6a7b1d86f702c588884e6e109cfc975dfebce3b65afa538", "SHA-256 9 bytes" },
+        { &g_abRandom72KB[0],        10, "66da7649b7bd8f814d8af92347c8fca9102f27449dacd72b7dfe05bb1937ff84", "SHA-256 10 bytes" },
+        { &g_abRandom72KB[0],        11, "1fcec1b28467ffe6e80422a5150bf885ab58452b335a525e363aa06d5ae70c20", "SHA-256 11 bytes" },
+        { &g_abRandom72KB[0],        12, "22ae8615a76d6e274a819cf2ee4a8af8dc3b6b985b59136218013e309c94a5d8", "SHA-256 12 bytes" },
+        { &g_abRandom72KB[0],        13, "e4b439cdd6ed214dbc53d4312e65dea93129e4093e9dedea6c19f5d8961ee86c", "SHA-256 13 bytes" },
+        { &g_abRandom72KB[0],        14, "8eee4ceba622ee53987910b3f8491e38094a569b9e9caafd857fd71626cc1066", "SHA-256 14 bytes" },
+        { &g_abRandom72KB[0],        15, "c819dadb248aca10440334ba0d271705f83640c0a8a718679e6faaa48debdbd2", "SHA-256 15 bytes" },
+        { &g_abRandom72KB[0],        16, "4019ab801bf80475e963c9d1458785cd4a24c9b00adda273fa1aa4f0c345ee8b", "SHA-256 16 bytes" },
+        { &g_abRandom72KB[0],        17, "9fc7b643bfa14072f47ad05f96e6760dd78c15baee67c91c759cd49031d33138", "SHA-256 17 bytes" },
+        { &g_abRandom72KB[0],        18, "9985cf02258c07b7134061bfde8434599e9e5e4d8342d8df659637236394d093", "SHA-256 18 bytes" },
+        { &g_abRandom72KB[0],        19, "e345757094c316b6b5f0959da146586687fb282c1e415645c15f898932f47d9c", "SHA-256 19 bytes" },
+        { &g_abRandom72KB[0],        20, "ae0d944c727221bc51da45956d40f3586ce69d76c8853c3a1ddf97cf64b562b4", "SHA-256 20 bytes" },
+        { &g_abRandom72KB[0],        21, "95cc050b256d723d38357896c12fe6008e34f9dde4be67dbd057e34007956d33", "SHA-256 21 bytes" },
+        { &g_abRandom72KB[0],        22, "f1aecdc3bca51bb2a9c4904d0c71d7acb61ddae166cfa748df1fc89b151844d8", "SHA-256 22 bytes" },
+        { &g_abRandom72KB[0],        23, "269189cca3f6bb406782e7ed40beab1934b01af599daeb9bfdd68b102b11224d", "SHA-256 23 bytes" },
+        { &g_abRandom72KB[0],        24, "70600ca44cdd0b8c81e20127768e8a42d4546c408681d7681854fa06a2953319", "SHA-256 24 bytes" },
+        { &g_abRandom72KB[0],        25, "dc26c41fcbe49afbe6b05fb581484caad8782a4350959277cd4070fb46c798ac", "SHA-256 25 bytes" },
+        { &g_abRandom72KB[0],        26, "ed78ad5525b97311df46d02db582bc951cc2671250912f045f5d29be87063552", "SHA-256 26 bytes" },
+        { &g_abRandom72KB[0],        27, "6cc53426c84a5c449367fb9b1a9bb50411a1c4de858da1153fa1ccb7cf6646e3", "SHA-256 27 bytes" },
+        { &g_abRandom72KB[0],        28, "ecb2ed45ceb2e0ce2415eb8dccfadd7353410cdffd3641541eb84f8f225ef748", "SHA-256 28 bytes" },
+        { &g_abRandom72KB[0],        29, "335eacfe3cf7d86c4b4a83e0a7810371cc1f4773240790b56edc5e804fa5c3f8", "SHA-256 29 bytes" },
+        { &g_abRandom72KB[0],        30, "070f657fa091df733f56565338bd9e2bce13246426ff2daba1c9c11c32f502f3", "SHA-256 30 bytes" },
+        { &g_abRandom72KB[0],        31, "dfb7b82fd9524de158614fb1c0f232df6903a4247313d7e52891ea1a274bcad8", "SHA-256 31 bytes" },
+        { &g_abRandom72KB[0],        32, "c21553469f65bc2bb449fa366467fd0ae16e5fc82c87bbba3ee59e9ccacf881d", "SHA-256 32 bytes" },
+        { &g_abRandom72KB[0],        33, "a3532bf13ab6c55b001b32a3dd71204fcc5543c1e3c6afa4ec9d68b6d67557ae", "SHA-256 33 bytes" },
+        { &g_abRandom72KB[0],        34, "7ea71b61c7419219d4fdafbff4dcc181b2db6a9cfa0bfd8389e1c679031f2458", "SHA-256 34 bytes" },
+        { &g_abRandom72KB[0],        35, "07cbd9a6996f1f98d2734d818c2b833707fc11ef157517efd30dcffd33409b65", "SHA-256 35 bytes" },
+        { &g_abRandom72KB[0],        36, "9347e18a41e55e4b199274583ad8ac8a6f72712b12ff08454dc9a94ed28f2405", "SHA-256 36 bytes" },
+        { &g_abRandom72KB[0],        37, "b4d8a36d40ed9def9cc08fc64e0bb5792d4b2f7e6bdbb3003bae503f2ef2afd4", "SHA-256 37 bytes" },
+        { &g_abRandom72KB[0],        38, "829c2b0c1785ebff89f5caf2f7f5b7529e1ccbbefb171e23b054058327c2c478", "SHA-256 38 bytes" },
+        { &g_abRandom72KB[0],        39, "11d3c0ec52501e78f668a241957939c113c08b0a83420924397f97869b3d018a", "SHA-256 39 bytes" },
+        { &g_abRandom72KB[0],        40, "476271f9371bf76d4aa627bafb5924959c033b0298e0b9ea4b5eb3012e095b4e", "SHA-256 40 bytes" },
+        { &g_abRandom72KB[0],        41, "b818241e2f5c0b415ed49095abbfe465653946ddf67b78d1b0ebc9c2fa70371f", "SHA-256 41 bytes" },
+        { &g_abRandom72KB[0],        42, "a02f6bc7f79a7b96dd16fa4f7ecbc0dfcc9719c5d41c51c4df9504c81b10cd56", "SHA-256 42 bytes" },
+        { &g_abRandom72KB[0],        43, "f6f32fb00cdec042f70d38f20f92b73a6534d84b1af1fb4386a22cb1419f2f33", "SHA-256 43 bytes" },
+        { &g_abRandom72KB[0],        44, "946d66e920b1f034186876cba8509b8e92dd6ddb41f29a48c9a9fb9a40ed27e6", "SHA-256 44 bytes" },
+        { &g_abRandom72KB[0],        45, "b9e5f490e4505ce834759d0239e6b91499eafaedfe2e20f53b649ed719226f09", "SHA-256 45 bytes" },
+        { &g_abRandom72KB[0],        46, "3dee1256de4dabbd8ae8eb463f294aaa187c6eb2a8b158e89bd01d24cc0e5ea6", "SHA-256 46 bytes" },
+        { &g_abRandom72KB[0],        47, "f32ad8377e24bca4b664069e23d7e306d0ed0bec04b86834d245bea3b25e03b9", "SHA-256 47 bytes" },
+        { &g_abRandom72KB[0],        48, "bd539ac8985f6f251d4ed3486dd7d45a3a316eecb872815873cf75858bbe90fc", "SHA-256 48 bytes" },
+        { &g_abRandom72KB[0],        49, "685e1aaa3ca611b74c4bcfe62d6597f54c8f16236e1d990f21c61b5952a205f0", "SHA-256 49 bytes" },
+        { &g_abRandom72KB[0],        50, "32d6fc76312316bf96cb57bb5f0f9c6a799ffcdc29571de437d5b2dd15ec788a", "SHA-256 50 bytes" },
+        { &g_abRandom72KB[0],        51, "921be210954a8de9563c2dd652be14e1c9abf659b8485c5c7ac70fd381291ac6", "SHA-256 51 bytes" },
+        { &g_abRandom72KB[0],        52, "848d5c2eafb58011f5f513735405c43e55fc6d6c23d1792cd891a921f69a74e3", "SHA-256 52 bytes" },
+        { &g_abRandom72KB[0],        53, "052edfc879cb6a63ce33ef2a28da5ef418dd7ad20209ccdeb8247ca7325bbb97", "SHA-256 53 bytes" },
+        { &g_abRandom72KB[0],        54, "862af02ee839897dde32d564b18316889176eac0e62b7a982cd79d5d3f9800d4", "SHA-256 54 bytes" },
+        { &g_abRandom72KB[0],        55, "82042a5fcaa02dd245583b4fa198ddad31052a687979f76f0085d14c8ed22221", "SHA-256 55 bytes" },
+        { &g_abRandom72KB[0],        56, "49869627a2ee03d8374d6fe5557dabb5211d59cac1186fe5502064eefe52e3e5", "SHA-256 56 bytes" },
+        { &g_abRandom72KB[0],        57, "12f63c4012024e962996eb341be18c41f098e9b69739fe5262cb124567cb26ac", "SHA-256 57 bytes" },
+        { &g_abRandom72KB[0],        58, "c8830941fdb38ccd160036d18e4969154361e615de37d8ac9edcf9b601727acd", "SHA-256 58 bytes" },
+        { &g_abRandom72KB[0],        59, "9b953c0e044a932bd90c256dfc1c6fe1e49aaf15d3f6fe07b1b524da29c96d3e", "SHA-256 59 bytes" },
+        { &g_abRandom72KB[0],        60, "590f234c6c5ab3ea01981e01468be82c13da5b07370991d92b8ecfd0e3d36030", "SHA-256 60 bytes" },
+        { &g_abRandom72KB[0],        61, "6490bdb3fc554899f53705a6729d67008b20b802359fcb944fed95fe7e05caf5", "SHA-256 61 bytes" },
+        { &g_abRandom72KB[0],        62, "c85c5c3d945b2c728388cb9af0913e28f6c74d907a01df3756748c4ef82635ea", "SHA-256 62 bytes" },
+        { &g_abRandom72KB[0],        63, "46dcc81342ef03e4a313827e0bcdc72f5b97145483fd9fc280f2a39b9f2e6a0f", "SHA-256 63 bytes" },
+        { &g_abRandom72KB[0],        64, "89eda27523b81a333fccd4be824a84a60f602a4bfe774ae7aa63c98a9b12ebf6", "SHA-256 64 bytes" },
+        { &g_abRandom72KB[0],        65, "10ce93270e7fca1e7bdc0b7475845eeb3adcf39c47867aa2b36b41456b7627b0", "SHA-256 65 bytes" },
+        { &g_abRandom72KB[0],        66, "3c4a3f92e8954ad710296d49227d85092249376b7e80f6c14056e961002a1811", "SHA-256 66 bytes" },
+        { &g_abRandom72KB[0],        67, "64979dd99b6da8172ae79474bad1ccc8e91adfe803a47b2bb497f466a78cf95d", "SHA-256 67 bytes" },
+        { &g_abRandom72KB[0],        68, "479f6c701cabd84516f25a45a3759e17a3b6ee56a439e08e03a682316651645c", "SHA-256 68 bytes" },
+        { &g_abRandom72KB[0],        69, "7b401aba8fbcff05cdeb0ad35e66ba5d608a39c4f6542d46df439b2225e39a1e", "SHA-256 69 bytes" },
+        { &g_abRandom72KB[0],        70, "4b397707574f2196e8023e86d2c1d060cbb0ab3bd9ce78d6ae971452f6b2cd36", "SHA-256 70 bytes" },
+        { &g_abRandom72KB[0],        71, "ca6ec101132f05647f4aad51983dfbafc7b9044aafab1fa8dcfb395b767c2595", "SHA-256 71 bytes" },
+        { &g_abRandom72KB[0],        72, "78605447fcbe1adecf6807c4a81ab0a756b09c777d3156f9993ad7b22f788ed6", "SHA-256 72 bytes" },
+        { &g_abRandom72KB[0],        73, "ee529f31a4e0b71bf4bd182a45f800a5abb0e42169e8d875d725712306ad0fba", "SHA-256 73 bytes" },
+        { &g_abRandom72KB[0],        74, "582bb8ec1c431e2468065a7d2b2dab2ed10b2a23e650cf2c295eb0d90bc4c6d5", "SHA-256 74 bytes" },
+        { &g_abRandom72KB[0],        75, "faa6b7ec0cd4e13f8b53f9116675f3d91c90244eb8c84dadc81883c9421421e0", "SHA-256 75 bytes" },
+        { &g_abRandom72KB[0],        76, "69e989716af62d1a255e53260e8bff7d680d507fdc432955dea7e616dc3a222a", "SHA-256 76 bytes" },
+        { &g_abRandom72KB[0],        77, "619a27ee4575109a9880b2a7ff8f52f0b66346fe7281805e227390d24dc7f3e4", "SHA-256 77 bytes" },
+        { &g_abRandom72KB[0],        78, "79efe7395bd9fbeb8964558c0a88be8a7293f75bf4513e0efa4cda0efb1621b6", "SHA-256 78 bytes" },
+        { &g_abRandom72KB[0],        79, "361a1c3874a0145324c3ce6330e3321eef84fd46d2127e68c1e2596872d74983", "SHA-256 79 bytes" },
+        { &g_abRandom72KB[0],        80, "42b3ec061a230faec1af95f685408d61c8025a30d8a9b04f7c9b2626f94d85e3", "SHA-256 80 bytes" },
+        { &g_abRandom72KB[0],        81, "97aa260a9979f20997731c258dee85bc0936812cacae8325030b9df4e5c4762f", "SHA-256 81 bytes" },
+        { &g_abRandom72KB[0],        82, "022d15b91d9e3849ca9e284bef29d5a2567c0bdd5af6145945705102165c3107", "SHA-256 82 bytes" },
+        { &g_abRandom72KB[0],        83, "e45a484833a59bd0834dc2da045eac9747c1441f4318b1d535eb6e4c0bd869a3", "SHA-256 83 bytes" },
+        { &g_abRandom72KB[0],        84, "ba0782193d5792d36b4a9cc5b1a47de9b661a7a05cbbcc1abd9334ee3778f6bd", "SHA-256 84 bytes" },
+        { &g_abRandom72KB[0],        85, "f528b11135dc44642573857dbffcb361cb3fdeaefef8bb36eff4bdee1670fe59", "SHA-256 85 bytes" },
+        { &g_abRandom72KB[0],        86, "0ba567b67c054bd794462540ca2049a008857b112d2fbd591ba2c56415d40924", "SHA-256 86 bytes" },
+        { &g_abRandom72KB[0],        87, "21b09abfd9c2b78d081cd5d07aae172df9aea3c52b572fa96dbe107d5db02817", "SHA-256 87 bytes" },
+        { &g_abRandom72KB[0],        88, "6cec2966f175b9bc5a15037a84cb2368b69837168368f316def4c75378ab5294", "SHA-256 88 bytes" },
+        { &g_abRandom72KB[0],        89, "2d9628847f4638972646eb3265f45ebd8d4db4586a39cbf62e772ad2e0868436", "SHA-256 89 bytes" },
+        { &g_abRandom72KB[0],        90, "5652de4228d477a5425dfde8d9652655d8c761480a57976dfa78bd88e4b11ff0", "SHA-256 90 bytes" },
+        { &g_abRandom72KB[0],        91, "7a50a27207be3066ad1b349cf9c82e50d8610d0d95ec53d0fa0b677e0ef198c4", "SHA-256 91 bytes" },
+        { &g_abRandom72KB[0],        92, "edcd28c7c6777bec4f9ff863554098055abcbc4ee6f777f669acf4c17e9b939e", "SHA-256 92 bytes" },
+        { &g_abRandom72KB[0],        93, "f8e353f5033856bf1b3e29b1cf95acc977473e6e84c6aa7f467ff3a214a311f8", "SHA-256 93 bytes" },
+        { &g_abRandom72KB[0],        94, "ff964737aaf19c5968393aa37d5a133bd42d26d49a1d342bc625cc23fbfcd3df", "SHA-256 94 bytes" },
+        { &g_abRandom72KB[0],        95, "7b975c510c8d7eba8ba3688cd96452d18b3544bb5aed540845b8ed320862e6cb", "SHA-256 95 bytes" },
+        { &g_abRandom72KB[0],        96, "39af3d95f2784e671171b02217344d41a50ca063db118940d940b103aa8f88df", "SHA-256 96 bytes" },
+        { &g_abRandom72KB[0],        97, "a7f84a55605007267ab6b22478d82fc045b9ccdeb7bc29e2368b6d36ba5302ee", "SHA-256 97 bytes" },
+        { &g_abRandom72KB[0],        98, "393755a20e107455a7d961494a23433b3aed585b6173231922ba83cd7980baba", "SHA-256 98 bytes" },
+        { &g_abRandom72KB[0],        99, "555400c5ea1b138cf58c0941a4edd7733698ef35d9b7b599da1d27a4a1da9b56", "SHA-256 99 bytes" },
+        { &g_abRandom72KB[0],       100, "f27524b39dff76ca3870c765955a86272f8136801a367638ab788a3ba9f57c04", "SHA-256 100 bytes" },
+        { &g_abRandom72KB[0],       101, "4857c87e9c6477e57475b8ceff80a02de75a9c6a2c21cfa2a3ac35ef199b132d", "SHA-256 101 bytes" },
+        { &g_abRandom72KB[0],       102, "9c41626db68168c7c3a1065fc507932ea87f6fe7f490343d2ed532ae244c756a", "SHA-256 102 bytes" },
+        { &g_abRandom72KB[0],       103, "13c331f42ad5bb2216ccbfe8e9254111e97291da1ba242a21d99f62547720ab7", "SHA-256 103 bytes" },
+        { &g_abRandom72KB[0],       104, "259dd0b292cac0f4bb6a26e5e8dce7cfde908561edda176b3d826228c7ec4836", "SHA-256 104 bytes" },
+        { &g_abRandom72KB[0],       105, "5f90dce6a68f0ccf50e0ffbfbc1e7831ebe619ab053d59625d75a5805d1cfc91", "SHA-256 105 bytes" },
+        { &g_abRandom72KB[0],       106, "9eedf570854b0e9b47fb9bddccdd7c02529b0ce1394f83fa968f8bd10061dc82", "SHA-256 106 bytes" },
+        { &g_abRandom72KB[0],       107, "4dce09d513d26be436d43ab935164156441bfbe2a9ce39341b3c902071f2fb75", "SHA-256 107 bytes" },
+        { &g_abRandom72KB[0],       108, "f1ba290596fedeabca8079a8fd8eafa0599751d677034e4d8c4c86f3542e8828", "SHA-256 108 bytes" },
+        { &g_abRandom72KB[0],       109, "e7dfc612ca26e6fb1dbc7b75dff65bff2c6b134e8283a24b9434ad5d469cea09", "SHA-256 109 bytes" },
+        { &g_abRandom72KB[0],       110, "7d3f395a5da0dd86fb14e29074c7e4f05cb32ae28ddf1bd4327a535df9f809fb", "SHA-256 110 bytes" },
+        { &g_abRandom72KB[0],       111, "7d74c406261ff04c3c32498b3534ef70c6199adba0d1d91989a54a9f606ebeb5", "SHA-256 111 bytes" },
+        { &g_abRandom72KB[0],       112, "ccc4acce4d2e89c2fe5cc5cc0e1e1b380de17095dee93516ee87f1d1fc6f5e01", "SHA-256 112 bytes" },
+        { &g_abRandom72KB[0],       113, "301bb78408884937aed4eb3ff069a79c2b714ee18519339ccac4afb10bfb3421", "SHA-256 113 bytes" },
+        { &g_abRandom72KB[0],       114, "2afe58676676f4a44a422cafd1c3ca187a7cf7dd54d4901448e59b683a7ce025", "SHA-256 114 bytes" },
+        { &g_abRandom72KB[0],       115, "5b88845e99afb754ce84cc42d99ddfc9022b55175d3cda8c56d304450d403ff3", "SHA-256 115 bytes" },
+        { &g_abRandom72KB[0],       116, "4255156c12f13ba85659d5d0b8872ae63e0c98075c06c64673ab6b1e253cab71", "SHA-256 116 bytes" },
+        { &g_abRandom72KB[0],       117, "c5e0fe1632cd39d9bec9b7047fbdc66f6db3cb2b60d4eef863a4c5f43649f71d", "SHA-256 117 bytes" },
+        { &g_abRandom72KB[0],       118, "e7be5a747eaf858c56ab45d1efd8317dddea74df01e188d2d899aeb00a747873", "SHA-256 118 bytes" },
+        { &g_abRandom72KB[0],       119, "e4642107146d4b94dcede9a4fdcd4f13ab88cf49605e8a7cfe303306288bb685", "SHA-256 119 bytes" },
+        { &g_abRandom72KB[0],       120, "39261dcb052d46f1f811f6edd9f90805e0a2ff0b86afbdc59da4632b5817e512", "SHA-256 120 bytes" },
+        { &g_abRandom72KB[0],       121, "b1e2988090ddd589757939f2b0912515998b7ac9ec8534655f586764b350fe78", "SHA-256 121 bytes" },
+        { &g_abRandom72KB[0],       122, "c21143977ad672e9458d403b1da4da2553ac113eb0d1bb905c781badca957c30", "SHA-256 122 bytes" },
+        { &g_abRandom72KB[0],       123, "173a78a19a11875f87163c5f111be2ec7a39d1358051fd80141b12576f4a17c2", "SHA-256 123 bytes" },
+        { &g_abRandom72KB[0],       124, "e499062db198b79950bb482e99c0a5001bf76a339b3f0da5cec09e3ec3f11599", "SHA-256 124 bytes" },
+        { &g_abRandom72KB[0],       125, "fbdfd0d05db20c67fda9f2d86f686e29f9fac48c57a7decf38c379eb217768b1", "SHA-256 125 bytes" },
+        { &g_abRandom72KB[0],       126, "d8435c9cf281b3fd3d77b3f0dcab2d3e752c78884b76d13c710999731e753e3b", "SHA-256 126 bytes" },
+        { &g_abRandom72KB[0],       127, "038900394e6f2fd78bf015df757862fb7b2da9bde1fbde97976d99156e6e5f3c", "SHA-256 127 bytes" },
+        { &g_abRandom72KB[0],       128, "37b31b204988fc35aacec89dad4c3308e1db3f337a55d0ce51ed551d8605c047", "SHA-256 128 bytes" },
+        { &g_abRandom72KB[0],       129, "069753c44ea75cddc3f41c720e3a99b455796c376a6f7454328fad79d25c5ea8", "SHA-256 129 bytes" },
+        { &g_abRandom72KB[0],      1024, "c4bce478ad241b8d66bb71cf68ab71b2dc6f2eb39ac5203db944f20a52cf66f4", "SHA-256 1024 bytes" },
+        { &g_abRandom72KB[0],     73001, "92a185a3bfadca11eab70e5ccbad2d40f06bb9a3f0471d021f2cab2f5c00657b", "SHA-256 73001 bytes" },
+        { &g_abRandom72KB[0],     73728, "930de9a012e41bcb650a12328a45e3b25f010c2e1b531376ffce4247b3b16faf", "SHA-256 73728 bytes" },
+        { &g_abRandom72KB[0x20c9],  9991, "8bd4c6142e36f15385769ebdeb855dcdf542f72d067315472a52ff626946310e", "SHA-256 8393 bytes @9991" },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.1", s_abTests, RT_ELEMENTS(s_abTests), "SHA-256", RTDIGESTTYPE_SHA256);
+}
+
+
+/**
+ * Tests SHA-224
+ */
+static void testSha224(void)
+{
+    RTTestISub("SHA-224");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t    *pabHash   = (uint8_t *)RTTestGuardedAllocTail(NIL_RTTEST, RTSHA224_HASH_SIZE);
+    char       *pszDigest = (char    *)RTTestGuardedAllocTail(NIL_RTTEST, RTSHA224_DIGEST_LEN + 1);
+    const char *pszString;
+
+    pszString = "abc";
+    RTSha224(pszString, strlen(pszString), pabHash);
+    RTTESTI_CHECK_RC_RETV(RTSha224ToString(pabHash, pszDigest, RTSHA224_DIGEST_LEN + 1), VINF_SUCCESS);
+    CHECK_STRING(pszDigest, "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7");
+
+
+    pszString = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+    RTSha224(pszString, strlen(pszString), pabHash);
+    RTTESTI_CHECK_RC_RETV(RTSha224ToString(pabHash, pszDigest, RTSHA224_DIGEST_LEN + 1), VINF_SUCCESS);
+    CHECK_STRING(pszDigest, "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { RT_STR_TUPLE("abc"), "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7", "SHA-224 abc" },
+        { RT_STR_TUPLE("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
+          "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525", "SHA-224 abcdbc..." },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.4", s_abTests, RT_ELEMENTS(s_abTests), "SHA-224", RTDIGESTTYPE_SHA224);
+}
+
+
+/**
+ * Tests SHA-512
+ */
+static void testSha512(void)
+{
+    RTTestISub("SHA-512");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA512_HASH_SIZE];
+    char        szDigest[RTSHA512_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "";
+    RTSha512(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e");
+
+    pszString = "The quick brown fox jumps over the lazy dog";
+    RTSha512(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { &g_abRandom72KB[0],         0, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", "SHA-512 0 bytes" },
+        { &g_abRandom72KB[0],         1, "a9e51cac9ab1a98a599a13d05bfefae0559fd8c46abae79bc15c830f0153ba5f05a7d8eb97578fc71594d872b12483a366125b2c71f27a9e3fb91af9c76e7606", "SHA-512 1 bytes" },
+        { &g_abRandom72KB[0],         2, "0f69ca22d38f562e2221953cdf3ee0b360b034c5b644ee04e0f58567b462a488578b4b75b15ffab8622f591c5e74a314cc4539929f14941969bbd3bc6770f499", "SHA-512 2 bytes" },
+        { &g_abRandom72KB[0],         3, "58bebd4e3f1e5e724a4b158db50c415ede9d870b52b86aa9f4e04eadc27881e8e0f0c48da1f2dc56bbf5885801267d10bdf29c68afabae29d43f72e005bcb113", "SHA-512 3 bytes" },
+        { &g_abRandom72KB[0],         4, "e444e041d0f14e75f2cb073c3d6d75a5a5f805e7292b30dfa902a0df4191422a6ff7d7644d28715a9daf01c4580c4b5ea94523e11d858ffc3f4d9cbade1effb2", "SHA-512 4 bytes" },
+        { &g_abRandom72KB[0],         5, "f950ebe051723a765edfa6653e9ebb034c62c93fcd059ba85b250236626bda33408204ff9dccc7a991ab4c29cedf02a995b8a418b65dd9f1b45a42d46240fdf0", "SHA-512 5 bytes" },
+        { &g_abRandom72KB[0],         6, "c39979d4b972741bf90072ca4ce084693221370abcbfc12a07dbc248d195ad77d77d1fca2f4f4c98c07963d8a65d05a799456f98a9d3fc38f7bf19b913beccbb", "SHA-512 6 bytes" },
+        { &g_abRandom72KB[0],         7, "ac5653cb0455277c9e3294a2ec5ad7f2ef8f9790a01e7cfabd9360d419a4c101d4567cf32b35d291e3cc73747e6f3b2d89a95c96421468db5eeae72845db236b", "SHA-512 7 bytes" },
+        { &g_abRandom72KB[0],         8, "454a56d5f9df24303c163430d8ed19b624072e2cb082991e17abe46bb89c209fd53beecb5182f820feb13d0404ab862bb3abf219c7f32841f35930e2fdf6c858", "SHA-512 8 bytes" },
+        { &g_abRandom72KB[0],         9, "e9841c44180cbe5130147161767d477d1a118b12fdf3791a896fdaeb02c9d547b4613a6a3d34bb1311ff68f6860f16f7bb341a2381a143daac3d3b803c25469d", "SHA-512 9 bytes" },
+        { &g_abRandom72KB[0],        10, "450915d9d69e85ff87488f3c976962c32db18225ae5241a59e4c44739499dc073e1503f121065964c8b892c1aef4e98caf2a5eff10422ced179e1c8c58aeadf7", "SHA-512 10 bytes" },
+        { &g_abRandom72KB[0],        11, "059d9629d61a58bede1ae2903aef1bcf1ef6b1175680a6e795def167163d05202167e22dba232750bc58a150764c13c048b2d83c0b077d819a1bd3a92432d97f", "SHA-512 11 bytes" },
+        { &g_abRandom72KB[0],        12, "00e3ec8f76e1bbdeae3f051d20369b64759b9f45e15add04e4bb7590b90ce9c37706e36b68dfdbfaef8b8e8d41e42732de80314a1c58f89a8a26179d4ba144f2", "SHA-512 12 bytes" },
+        { &g_abRandom72KB[0],        13, "dfde69e66f61bbd8c2d5c56493670d9c902df8b5fde0bdb61dbcc902390290c159ef1dfd988813a14c424c6bee49e62c17140918a4ad805edf9ac67ffe6af6ed", "SHA-512 13 bytes" },
+        { &g_abRandom72KB[0],        14, "5d7908aada1445e9edecef34cbedd032baa646a88aafe4ebf3141008485b640539ee78e56b18d34bfcd298178412384d993d948e5711c61500a53085e63e3bf1", "SHA-512 14 bytes" },
+        { &g_abRandom72KB[0],        15, "ab6102021cbf19cae1b0633ecb0757f4a280b8055fa353aa628ba8d21188af3daf08323367c315dd0eb9ba8b58f415decd231f319ad7cc9a88156229693c2061", "SHA-512 15 bytes" },
+        { &g_abRandom72KB[0],        16, "75e2d97633b22af732caa606becf798945eb91be1d04f66b2ec86b8df98d12f7de8baa6db48b1294a713f17d792c89cc03726a7b03ae0d16837de1b4bfa5f249", "SHA-512 16 bytes" },
+        { &g_abRandom72KB[0],        17, "e6bbf8ab9c68e99f569f6c68d93726eddab383e3695ab84383425617e73b6062970045fca422b393d479f3ba821ce205461ff76d0acf67fd4a83e5eeb5ccf594", "SHA-512 17 bytes" },
+        { &g_abRandom72KB[0],        18, "68cfb17e1fe58ce145c3ce44efdb12b65a029d19ca684a410e0243166e86985b92f8e815de17f36f2b0f54e08c6a49c5446be14ebce6166c124d8605189adc24", "SHA-512 18 bytes" },
+        { &g_abRandom72KB[0],        19, "fcaeefcae96683fb1337170f5f72247252843322029ee9edc7333f14386d619f2ecc12707ed4f1aea5f7c052c682d8c9e518a47c4fc9f347299688818baf0468", "SHA-512 19 bytes" },
+        { &g_abRandom72KB[0],        20, "22dfd1b7af7118d93645f9b7baf861a317b4318a8881e4cb6a7669298560849c9169d86b57803c0de0c82f1a5e853ee571cae3e101cd8aad5d2045aec0805879", "SHA-512 20 bytes" },
+        { &g_abRandom72KB[0],        21, "87de7e747b5ac2401e8540498ff8222e80b28bcb570c7f873332b01f5c6c0b672b8ac65d4986bd4463fc5f6f7f16656cc300bc9a5be9873295b1a0a13ce2aa28", "SHA-512 21 bytes" },
+        { &g_abRandom72KB[0],        22, "deb01211010e06351e5215006bd0b09b353e6af5903a5afe9236f7418be7bd804119942be2be2cef9dd86b7d441300d8861ae564cad3dd5ae3eaea21de141f22", "SHA-512 22 bytes" },
+        { &g_abRandom72KB[0],        23, "c7c62e3033755889d9b690f9b91288ea79e9225068b85981d4c3f2035ecde58a794fa59938b3206e0b9edea380fad3d9534bf40e889b59d8db52261f1e06e7cb", "SHA-512 23 bytes" },
+        { &g_abRandom72KB[0],        24, "ae825238a7ac961c33b7b4e3faa131bca880bbd799657ab89e8e260fc5e81a160490137587c13b89af96cc494c884bac3e3c53a5e3838ffba7922c62f946fa77", "SHA-512 24 bytes" },
+        { &g_abRandom72KB[0],        25, "a8bd5532033300fc15292726e8179c382735650e9c2430fedd45c6e0ec393f87e04a53901e76bf9ea089c41b9c73e34440f7c7503ed872ca61b61301aaacd71e", "SHA-512 25 bytes" },
+        { &g_abRandom72KB[0],        26, "a2439151940845db0bfd7f4a955e0a7f19d594759917530fd2afa1f41ab30afa1122cc00875bbccf3cbe4c3afb94deaf6abcb23ccf379c6ee31ac1615a16b12a", "SHA-512 26 bytes" },
+        { &g_abRandom72KB[0],        27, "5a0d49012aa539aef64a3f4e0933efdba3610b7aee6e8e2ca26a5550799141a3174001eff9669c8194eb2b60b7e264e02b73fb4bdeda61076423b26f50b210f1", "SHA-512 27 bytes" },
+        { &g_abRandom72KB[0],        28, "09847f1c906c9f5507b499ae6a8543ee3dc04b81eee072148b0c55668ce363a139e54f74da9feb5fadddfa0c920bdf595ba68bf7ba21c6e131e6c4b598d444d9", "SHA-512 28 bytes" },
+        { &g_abRandom72KB[0],        29, "80efb6be55a081fac36fc927326b5b6e53c91aadb9106d8b3861ecab9b08b7b6ebdea386b5132d6e6cd7d096ebe912577bccde6b709d5f2f2e8f2ce4cf8834cc", "SHA-512 29 bytes" },
+        { &g_abRandom72KB[0],        30, "a052774739540e095f4e54ebc77b6b4a60253c20231d077224a9bfd69a882b5bb4db7ae52a8c475ef15a95d8fc2c33064fdaf356f151a429cd0625b218708eee", "SHA-512 30 bytes" },
+        { &g_abRandom72KB[0],        31, "6501f635b4690ccd280443d2eeee36cc6d626df9f287a8e46e237a0528b82aafbce5a23d75a71ac611cee62c1c0423d5e4dcec14b5c31907fbe2f60406486bee", "SHA-512 31 bytes" },
+        { &g_abRandom72KB[0],        32, "a7b4e870a1a4585439f62da7e99998f60daecc90849c16ce1f5b4bc15e68e567b8fb0c44d1294eea925bc14161bb9f9e724933bfe88d8aab9ab2dbf4e00f7b88", "SHA-512 32 bytes" },
+        { &g_abRandom72KB[0],        33, "ce465a93568976550943c160907615974b5c7fbbeb05506905d516a56dbf6dd7f2c8f45cbcea10d1c85316595559e3ff8193629eadbcd941359e166874ae4058", "SHA-512 33 bytes" },
+        { &g_abRandom72KB[0],        34, "b5f60488576dccbeca6924483f1732055af0383e63acefc6dfc13e4e6b77655a97f10eb5778a28d939ca3f49311f4c0d2920764f10aa2fdff6d60a24e8d68d04", "SHA-512 34 bytes" },
+        { &g_abRandom72KB[0],        35, "9509b9052efcff757291296a58fbba6835ccfc1b4692307fbf683a22379242a4d6c8324dcea6a870e50c40960cd56e0f52c41102f25f357328d8abf1b9499441", "SHA-512 35 bytes" },
+        { &g_abRandom72KB[0],        36, "dcaf59cf1dc3c5dfd74595e53bda617c313ab65dd4d04821e17bb65330458827d89efac7d64556bc439c12d326d4312d90789f39801d0d9a0faba59d23a57f40", "SHA-512 36 bytes" },
+        { &g_abRandom72KB[0],        37, "fcd30053a81adf7a9e5135e55fed6f389b6e516b04a0e9972b18df387a3dcb064f2903ea58d4b3e2f51c30a2ff0d7353b9d744e13e215a3a63e486130acca9fe", "SHA-512 37 bytes" },
+        { &g_abRandom72KB[0],        38, "36cc41b6dc5602f8d71a0ea7f7187a648c7b78d9386c3f4cb952153b57fe6c307957d2a39752a5f682dee98e68a4b4e99a6e681f76ad6b561be3ba2bb7409e88", "SHA-512 38 bytes" },
+        { &g_abRandom72KB[0],        39, "09d0e8487f329c2b66618e8734e2a5e7a68654cd744e5941ceba04e2f7dcf92af1d3ac5ad3920abc4b3b0e121a68a4665e0b6ed6eaa3dbef06cd3c21217f0445", "SHA-512 39 bytes" },
+        { &g_abRandom72KB[0],        40, "d24e246470f0fa260976b1063f5a46a73c54614881173f3793c70a47f925bb0d05feb376858bd838f550cd82f7122b02b438ad3facfc9049be3efd7e5f3b03f3", "SHA-512 40 bytes" },
+        { &g_abRandom72KB[0],        41, "6e56434ce4c50a1989df0de44485697a53ca6b8560ea84290fbb54b4627a980412033f4ed2aa795cd653dbd0134d4e4e2f25b57a20d55ee1ae8aa47d6e8af7d4", "SHA-512 41 bytes" },
+        { &g_abRandom72KB[0],        42, "f9cce63deb2f4291ef74c7b50cf573bd99500b6aeee2959fe3500a7b55b3693df4f5b4eb5c242271e5b9ada3049b2a601e85f32d0501b870fa1593ea9cfa6fb1", "SHA-512 42 bytes" },
+        { &g_abRandom72KB[0],        43, "0781bf3344189b3c10dfc34e6bf3f822a78533f0a29b066c67f49753412c40075b6d988c2c0a338fb8372be0b66a97a73c382509613e7fb908bed5cce9804676", "SHA-512 43 bytes" },
+        { &g_abRandom72KB[0],        44, "4af952c3a51e5b932b21ce3b335213235ed7d3a2a567d647d6faa7e32e647038d0dbde3b6638453a79badb9c882d75d5201c5b172989d3e8b1632a15773fd2aa", "SHA-512 44 bytes" },
+        { &g_abRandom72KB[0],        45, "98e0b281d765b90360338afaa7cf1ec90d841dfa07c05e7db74dc96dc7bf53465eb78d6e8c915c53d273fb569593d51a81331b56bce69eb506a3a400c73b170e", "SHA-512 45 bytes" },
+        { &g_abRandom72KB[0],        46, "50c7c00f254a13b2288c580ebb165be5669aa88ae247aaddc8f20750564b945849f5126a3cc0fdf7926a59b7c7b7866fe49174bf1dfbbe5734a2fd570ff26183", "SHA-512 46 bytes" },
+        { &g_abRandom72KB[0],        47, "e5bcecb9ce32ccfd4916a267f64b9d478461d10066375f0088f7ffc2e43b393d09613e8f60c623268c863b91ef08059b0af491d15d040fff14ef3b2c89e84d46", "SHA-512 47 bytes" },
+        { &g_abRandom72KB[0],        48, "f30c0d42f15fc467f454cc8b7d3fb3453150a57f28eacd9870fecc98cae43dc937b4e45cb3443e6c09eb8d82bfdd1c501870f827d5d792dbbaf3beb9dc7bfaba", "SHA-512 48 bytes" },
+        { &g_abRandom72KB[0],        49, "12bb4030e966cf51ca3ead169bfdf399e1564b2c7a7636e8625d288473967643a85e932ed45d9b9ecf9a05001e34d259a8d4733faf7ee9093e1a64b57fe357a7", "SHA-512 49 bytes" },
+        { &g_abRandom72KB[0],        50, "e21a552fe775cc337c4bccb934f4093d03c4c6c5e2e50ba6cdf0cd5ddd74d7b3de6690e8d3b2ff195b9015e3d137a6f4b6e683148e4a8c7914272767cb3fa68f", "SHA-512 50 bytes" },
+        { &g_abRandom72KB[0],        51, "dd262372035812a20304a313866cbd9c6c9099d4c434630d3904618bee471967e4b715f7e3bc4f5d3283b4131b8885af5af645289faba8cfb095960883eb5d31", "SHA-512 51 bytes" },
+        { &g_abRandom72KB[0],        52, "0541767fd127bd553915f6fc4e11336c734bee7409c972f014952128152658339bb641989b19eba9d73f7cbe2561fdf5c00e7ac6d7a3b4dedd3249cb11357a0c", "SHA-512 52 bytes" },
+        { &g_abRandom72KB[0],        53, "6446470e96304a1e2ca9946de70d8c61c0c39e23900274db6262042e5555663af6b25d7d7dcd1f1f890e14e1a588b498e8cc26e8aba117bcd61ef74b25603645", "SHA-512 53 bytes" },
+        { &g_abRandom72KB[0],        54, "946bb0ced082b07b965d57c3634011f13142b9dd84146103262483b7fb7c3413bd481ad1a3e01005e974792a6523a2c22eb2211ce7912c2e88378ac6d962f809", "SHA-512 54 bytes" },
+        { &g_abRandom72KB[0],        55, "7d742669be7bef2a4df67e5853146cbd8e8ab9afb1b3429d5eac7e1fe66e050d7c08eac3e90b596eaad00ddb92ac8876a50eebb4fddc17b39abd79c83dc2523b", "SHA-512 55 bytes" },
+        { &g_abRandom72KB[0],        56, "5b25df3a85495f600cc1cd92d53e969adbb3329a87cf8f32361fc2aea3331bedfed63c25a5e74a38790b2d4a96bf1e0e4df9f0ac8e8d07813197a575939cf444", "SHA-512 56 bytes" },
+        { &g_abRandom72KB[0],        57, "9aefb636d982bf842ec37bf91f5c01f65796f954e26eb3cdd35515aef312b93f72ffc6fbbe3eb168fb07973471ebdd33b302e098c8b5d949d29afe129761137f", "SHA-512 57 bytes" },
+        { &g_abRandom72KB[0],        58, "7deca25f1ca788598002368c2e07c5b65766bc28e66b1fe1b1a16dd38134a64f2a51be3a9c8930da939971e48ce5d9f25141a619386639eaaee11786c9c4df6f", "SHA-512 58 bytes" },
+        { &g_abRandom72KB[0],        59, "27e4c254f1284dbece4f63aba4f61ff6cc23abe4ff2e86d24ccfd582a2cf65145849de27d8292a66391466f965e61b06772b1f8a7b5a5e69f8b0f0a6d4974d40", "SHA-512 59 bytes" },
+        { &g_abRandom72KB[0],        60, "39e3a628a14f307028e3f690057ef24a02533d2141e0cf7070d4f2ba5d58e92d5c27e9d6dd8e07747915ea5535f8963ef350c424d6f3b3dc3850256a216b4ae0", "SHA-512 60 bytes" },
+        { &g_abRandom72KB[0],        61, "8877a71d1e412e4fe0d60bbcc3ac61c458a221311b1425defbfa28096b74e18b2661ae03026da38d6ed7a42b49850fe235145bb177a7e0e99b12977bd5eb4ce5", "SHA-512 61 bytes" },
+        { &g_abRandom72KB[0],        62, "a8623e4a43560950427020b64bd70f37ce354698d926c0292614b89100f6e30947db498bb88b165dc50da54439321a564739be36de02d134da893a4e239bdd01", "SHA-512 62 bytes" },
+        { &g_abRandom72KB[0],        63, "62d7f6e428f8252723a265ce2311aa11fed41dfd07705cc50a24d744cf8ade4817cd3c5a22deae04bfdebe9292022ccd87e5fbe8fac717ee1ef01d2a336dcef3", "SHA-512 63 bytes" },
+        { &g_abRandom72KB[0],        64, "1d356bccb9d9d089bec81a241818434ab1157bbafc7fa1fad78f17d085430bd6efffa409efdd8bf4306927407272e14f70f5344ee5085ccbc17aac16a9d40ae7", "SHA-512 64 bytes" },
+        { &g_abRandom72KB[0],        65, "9c500cc115fbd8f609890b332ed6b933c2e1b60664ac57939776348b394a3af6ef55b740351cad611bed175bc932971d7803caa3802e765d14e795e83ef81727", "SHA-512 65 bytes" },
+        { &g_abRandom72KB[0],        66, "862197dff8c67ea30846b25adeb191546c165cefa7c2fd3bebfdcb038884dac5bf0f5274417c2834a63751bfbc744193bd8bbfc2f261a01a9a3c2914d5069913", "SHA-512 66 bytes" },
+        { &g_abRandom72KB[0],        67, "fadb5858a9071e696371c37287e0d7ee476fca005de6d1049162bded431bc9659c1f981c110fb8fade5495a6207af819260512d0160d11dea295856f4fb55d4c", "SHA-512 67 bytes" },
+        { &g_abRandom72KB[0],        68, "029b208137092c9f38084ace884d371c34434e3268802aa7b6276697eca683d23082a9c4d81f8b871adb99cb2a4f73d1064c16feec7c3df282594045250eb594", "SHA-512 68 bytes" },
+        { &g_abRandom72KB[0],        69, "a6f78eba388c4b96ae3b30a6204f0d4bc7ee6c3dadcaf18a938dba69a0a66fef1a6a2d6589da0e8990bea7bbe46cdbdae700a464f394c8f1c13821f49b9ce08b", "SHA-512 69 bytes" },
+        { &g_abRandom72KB[0],        70, "f39c31993dd96a07cb0168c4d72a216ab957d56d2e5a73840ed7ea170659434c0ca6d5c4d70eae040ab0f488cd1b93453c85c398b3fb2cbece762e5eebeae3ae", "SHA-512 70 bytes" },
+        { &g_abRandom72KB[0],        71, "90d60c76601deeb2f3c9c597a04a333724fa4efbca2fdbb09163bff812615841495b79225627b6da100aaec0ac7f532a782075308aed7c6760e530430f77c063", "SHA-512 71 bytes" },
+        { &g_abRandom72KB[0],        72, "604e315e1db8ddf64b5d11151113c25b61b66d690046c1830bccfb0b92cee65ade2ed75691bb65be9df84d4d83bb9b0a3311453c9f7e30a04889882e74383d75", "SHA-512 72 bytes" },
+        { &g_abRandom72KB[0],        73, "bfd93659349d3ee86f88ba312087c97cfb6989d33eef7f59ef9fd1ed650c4e10b5172b9cd90bf4982c85397c0de2fa691f5b49617e0bc168f45c084093cf3b41", "SHA-512 73 bytes" },
+        { &g_abRandom72KB[0],        74, "6084b22bfbc488cc5c61ff382137fac5dea084d32e49aafcf2c9eec3d1cbdcff8f093df63913743b55a16304b0d8adb663dcc37e6d933a6212c1aa13e4acd2f5", "SHA-512 74 bytes" },
+        { &g_abRandom72KB[0],        75, "2a9a4625797f6137b4200be28f07bc8b183e098e139d427c6f0b7b5ab19f5f0b4bad407424414e2475f05cf0a8055deefa0c8503bf1c09d545634c6cf4d4337a", "SHA-512 75 bytes" },
+        { &g_abRandom72KB[0],        76, "88e7dd70a561537bb978e295cefd641a4bc653cc1dee9f8cafe653c934f99d2b7c18caf26abb803acbc8172eab34cc603aaa35aeca9444c5759016415f076430", "SHA-512 76 bytes" },
+        { &g_abRandom72KB[0],        77, "78fbe62ea044c5601099b5605486bc911bb88e325077651722fd4790554f6a01c7cceaddd38d850925b05852616712118d356b7b023fdc7facae720a2b3008fb", "SHA-512 77 bytes" },
+        { &g_abRandom72KB[0],        78, "1e35da455a47b0acc9ee2c6970de8376ee3ad22b53c39a6613651de23fb323aff796d9b9ee7c3f56684bca29bc16df9e2e4846d66ee4f6e720eb8c01b305f166", "SHA-512 78 bytes" },
+        { &g_abRandom72KB[0],        79, "a1d26f27fc25892a1329434d6045384b62b32d61a645c06645493b32aaf0d6be7761828c04424d778214863db047fbc34865d0c4271f1d22206b60eb16cf92be", "SHA-512 79 bytes" },
+        { &g_abRandom72KB[0],        80, "8ad44d72bb9a3a7436f26577275b97eef79a27a5de9eda9f1c5ebf740cb2e1198acb0ce774f395bba1962c570f19278eba8a5928f740a5cc3113cc6b6627d8e1", "SHA-512 80 bytes" },
+        { &g_abRandom72KB[0],        81, "54556b5b7a14e090491256ab964cbb819d57e0f3fd8acf7fc9ff87ccb0a89f388e8083fe6e86eb3da3bb21c6dcaa291bb6e48e304628e9d1e2c13a3e907645e5", "SHA-512 81 bytes" },
+        { &g_abRandom72KB[0],        82, "9997f6934072546a9ca5a1824589db692ac9b25b9be49f82b769efe094b8909e16037644ea88ca86501ff3ea533fdc5b81ce8e3456e07559b218aee682c151d5", "SHA-512 82 bytes" },
+        { &g_abRandom72KB[0],        83, "5bc87e566b62eea1af01808cf4499dc7d0e06ced3b1903da2a807a87b9cd4c8ffd4d46e546a8a18e815efae0df5eb70191c8afbe44aefae02e2e2886593618f7", "SHA-512 83 bytes" },
+        { &g_abRandom72KB[0],        84, "a3231d21aea1381fd85b475db976164dcae3cd9ce210285007b260b63797ca8d024becdd6b5b41ad1772170f915ecb03785e21224a574e118c5552e5689fcd47", "SHA-512 84 bytes" },
+        { &g_abRandom72KB[0],        85, "d673935769d0ac3fe6f522b6bb537869c234828139a1a39e844c35592f361b4e39e55c7e49bd0dd7588ce8e30f7b6aeed6cf3ccfd951589a27dda37b1a2fadeb", "SHA-512 85 bytes" },
+        { &g_abRandom72KB[0],        86, "a0fca2a6e0126fa9a9b84947167ea3a42aeaa69d8918a175e0bd0be20f8beba333e59dd3905029da37cb54740f94bc1bf688be4756e6c6769de9658566d07c90", "SHA-512 86 bytes" },
+        { &g_abRandom72KB[0],        87, "a8730b6e7d1c850c40c797ec8d69dc4b26473e692cb0e3fe8781be355574bb921c4454a8d54fa2e607a0bc36be9a5ab324e0f9f439bf1cce93d0ebfd019154ed", "SHA-512 87 bytes" },
+        { &g_abRandom72KB[0],        88, "77857fad35e564a8d5dcea9b981bcb074dc6aaed7626db8132e08555dae7f5445c0378a6dbfb24bf5f2c4c6afac09cb19ac1ab76ed4f41fe3a72d32ca1f39f00", "SHA-512 88 bytes" },
+        { &g_abRandom72KB[0],        89, "6ac4c2044f4d9a983c1e41ae22daf47ef05a4ee2f013a174a3068d38c59994a19b8788541a29f47f3000b4c0491dacbf98e98dc0588a3a30fee42524697ab996", "SHA-512 89 bytes" },
+        { &g_abRandom72KB[0],        90, "eb894f383342fed8371ec72403c636b1bcc7f6f39d6db1dbfc58f9fac8f41552af6dc0a5a968146c028c4db113b21831d80eb0ae166d68616ae3696832f4e563", "SHA-512 90 bytes" },
+        { &g_abRandom72KB[0],        91, "8be91181345c9511f2c74df93db07ca739a586a2a84f38d5f063244d2e39fc4254c5747787e08b74a2a59916c9751aa30d0fe57a18d858d3346186facc86365d", "SHA-512 91 bytes" },
+        { &g_abRandom72KB[0],        92, "43e007dc454a4303724a2baa860307083a3a1e1d52b587cc3b7a4b6bc252c8dccad0e9cf9f2b16ec178371e57033ac3c4e71dbcb2eb69cf7ef7f617c7ada8f76", "SHA-512 92 bytes" },
+        { &g_abRandom72KB[0],        93, "2e2d6686c4e7a7919879ee03a4fd37ddc71a7e2ffa17a3cfe6eef24b29d8a1e7cc0fa5d8e9dab3c6c3190652ceb9e1ebe67a0ac7d92c6c205a9e8add91bbd2a7", "SHA-512 93 bytes" },
+        { &g_abRandom72KB[0],        94, "c8b9e3825c4a81c63f79b88d91f61af15c714ccc611dc77635c1bf343e2c185caa2e0ef8eb76505f1544c8f78377c26d3a6f79c2b77abadba9906e583fb2e5c3", "SHA-512 94 bytes" },
+        { &g_abRandom72KB[0],        95, "0bc63075ec108a5ee1f69a4e39ae03333da8c1f2d61a94fbe6357c143fa2dfeee44fb8cad0ee016fd42697f6848b7a174b4a77a268401f7cac4c4df1623cfc52", "SHA-512 95 bytes" },
+        { &g_abRandom72KB[0],        96, "b4aa1d4a849840413e830e27c388baed9e8d4a0941048aad9a4b8751497d86e002e3e50b0197a9164ea440ec4324771229d0c5de04b9922c992d97ea736ff477", "SHA-512 96 bytes" },
+        { &g_abRandom72KB[0],        97, "1c5142f15476f56abed2a0c5d9450e14f56a30af2d5d81f16e05ff0184d695fd1923488da707b570307370c4f1669a522230617f347c264465c12d82fa2018b8", "SHA-512 97 bytes" },
+        { &g_abRandom72KB[0],        98, "7146b68a0670d5d901e312c78a728111975c312b8365a3cb9618cbe9c124c30d65cdf668902bd9ec76493caa0ff40e3c1f03ccb06e3b2380c69c154fd065d137", "SHA-512 98 bytes" },
+        { &g_abRandom72KB[0],        99, "e591fc00af6733a6e308577e0043d5c12b81051848d8123e4350b82037350f27828ed6cdc0b1daf9ef57b30edd72b58370cd1851545d9e39ddeb00fbc66c8582", "SHA-512 99 bytes" },
+        { &g_abRandom72KB[0],       100, "6328c48376ab29fbebd732db8b4073a96b2358de13c8a2a5a5ddc2502d8e0356822da65551bb079d4a90f3fefe5b8d00cd186696706900471348784a55009a0c", "SHA-512 100 bytes" },
+        { &g_abRandom72KB[0],       101, "c90b01b14fd712be70ac318b21974181418365cd94a33d4121260c260d6f72e0819195d5c3f83b516e7e9aaf667957bc67c0c0a44a35d7756b41e33c3677d017", "SHA-512 101 bytes" },
+        { &g_abRandom72KB[0],       102, "d23e5ca2c0f460d6831abd112b6a6f6d3aebdc500f7af96d887aebbaceae2e33f61f5a423deacee85276e796478d5002c0b94e85c0b2d55c75752a8a717785e2", "SHA-512 102 bytes" },
+        { &g_abRandom72KB[0],       103, "e20df98010b277e188ddf6d3e953722287cffcf43c910e80ab9dceec32aff3c2059d0268bbbae414bc08919adb92d409035ab1a970a175aefeaced8df2395e13", "SHA-512 103 bytes" },
+        { &g_abRandom72KB[0],       104, "774154db3993f0b4d05f03e187249cc9db94e736807691de26f734277149597ac68acdb412f8fdf3a71093cabcd0257d39f3c5e8eb7d3545474914a5b4ebc623", "SHA-512 104 bytes" },
+        { &g_abRandom72KB[0],       105, "30df8e2d774fa706d8ffce6009237122540d20d4d92e5c9e2f19c4b9fc91ef9454254575e1a94cde8930439b679f2702ad22145c983418fc5b48d1b0d46e7677", "SHA-512 105 bytes" },
+        { &g_abRandom72KB[0],       106, "091b5252043b7d47aab184c82c3317f2674ff8b0b76679de6c4e27ac15fc653597d635c8a0d3a0c0f271e86b7c9db86c622449bbb1044f6b26ebf7f681ab108f", "SHA-512 106 bytes" },
+        { &g_abRandom72KB[0],       107, "152e06c5313eb9c58345878c73180ab82c0a66ab853653a54f1195f351eca82ebcbbb6c7705bd20440eb69e9b73df9a4696421205f9b2244e5765be5493b0fee", "SHA-512 107 bytes" },
+        { &g_abRandom72KB[0],       108, "cdc5a8269c1aa916af26a6fefd395f338fd9ba7b7ad578fb5e7d92be956a83c43cc7cc8f590450878d45e28882d204bd244e2e5bf6309e425170024d8d307a87", "SHA-512 108 bytes" },
+        { &g_abRandom72KB[0],       109, "6c120d70dda091f8de847241e6921e8540fcf0cca9927ac673bc9d2aa29bc5a782134a79250d9fa1bb436ebf73378ab0619a05140473ff0c2be7292f34e6d6a7", "SHA-512 109 bytes" },
+        { &g_abRandom72KB[0],       110, "7094f3e32b2075db6290da8a3379b138675943f647d14444bc9299c01a5ea9c58706386030970f4d670132d9d7a2485064c901443f9f1050679ad09e576ae2df", "SHA-512 110 bytes" },
+        { &g_abRandom72KB[0],       111, "a56e148f8cf9a20c96453ca2cd29aea8ec9b76c213f72d609a1052f81efba24b7de365214b21dd09447b8df272e1458f566f3af827d96ea866c921155ed5b85a", "SHA-512 111 bytes" },
+        { &g_abRandom72KB[0],       112, "68ab4ac095d2aaa05c61ea622804c3164f27f8fb0adbd070906e75093cb09e2b283aeda64584cd856de8ef369f64a0900e0e191f08a7f729ac9b9077efd41c43", "SHA-512 112 bytes" },
+        { &g_abRandom72KB[0],       113, "1ca365ab12d42b4ccd1561a2000b885fd38df9a60b0f8580c85e2547f40be8fcee465b24b7efd09fbac92c4aa74fe403fe7f00aacb7aec5d187403d34da4b6c2", "SHA-512 113 bytes" },
+        { &g_abRandom72KB[0],       114, "17652cc2481a32c42f9cdc447bbbc3a95c76d7f7b2cd6ca93c29e0beeef219baf00f1d3514c3f9fba7a6c70177d3371a0e95638f1c210135f9bcb7322e513749", "SHA-512 114 bytes" },
+        { &g_abRandom72KB[0],       115, "0d42ab4691599cdb280b61fd170a8dd7970639ab074109cdc91bbc94714ea257cb1c35a3c5c471d8853c02e66d90de0b66d9c04adeccbaed7e48d517d7b763b4", "SHA-512 115 bytes" },
+        { &g_abRandom72KB[0],       116, "d410d63adf1dadec0eb6712f30ef2f3f56aef3e5e0ddd4fa3088516bdefe1af3d031869b9d4642013bd1d907a8687db86363a9e94d9e08bac6576b0cf0a3f877", "SHA-512 116 bytes" },
+        { &g_abRandom72KB[0],       117, "adfa29d3e85a68a153a470cd271293a6fcf27b67b45b232cc6f1944375ae6254760bdc700ae33bfaaa26490a6a216982379e3973081d210034791f60a1e90259", "SHA-512 117 bytes" },
+        { &g_abRandom72KB[0],       118, "35f41b486bae7cc4c6b2609dd5314deb8a5151da7e6ab1b0bfb1d7310dae8435152db8b75ebee106a583f16a4b0a3408492e15fba9f9f90c1fda7daae3b3dd71", "SHA-512 118 bytes" },
+        { &g_abRandom72KB[0],       119, "dd9cc5aa2ee23e9bc94e80795d19f40adef09384365a805ee0c9b6c946734ca55e8c68c0baea51fb0693efbf04722f5236b9ebc8aed222ea4c47c2d2f20af1ef", "SHA-512 119 bytes" },
+        { &g_abRandom72KB[0],       120, "6988719e25df98b8f6b779fe48f61d81f3e7f88ea4c3fed89b28f49b8113686dc5788e66da419c6dcb38a95b2fbd9b29259e7bb8754923913e3f8528ce884f59", "SHA-512 120 bytes" },
+        { &g_abRandom72KB[0],       121, "b096a715acd6611dd57d66b547093c937ce73456e18f5d969c2bb1581f33b6ad89142d19850ae29648368adf53d0ff804ed661fb106f81dac514b75a7200d0df", "SHA-512 121 bytes" },
+        { &g_abRandom72KB[0],       122, "3691d1ab30f41684f320a6161743b2113e3b452c23867248a8741a383410bb4c83f116404c649cd6983f79a156bf4933d1264d75662d93011a7764f5f962d26a", "SHA-512 122 bytes" },
+        { &g_abRandom72KB[0],       123, "2b953227e77ad7415d5363a8f5eed23529b573e20dd6925fd357814daa184f4c4b69ef14a3599c476f589fcfd027c609ccb2fb247acd83f4812d8b72dd0800ff", "SHA-512 123 bytes" },
+        { &g_abRandom72KB[0],       124, "639323ed76ab3ec433446d67b41a9f8b6c917627795caf266a58fe396c141988b73490a78d6e053d88ce8c2252051ca711ad2de4fa4fcfca9c26a6a8ea5f16b9", "SHA-512 124 bytes" },
+        { &g_abRandom72KB[0],       125, "243b6196df1e1e5c6018644e71471d51e4320303f18749a2e7888430cf43e4f71598c394fbcb2f31b76acf5349233ee9614ab86b455364e54bd2013ee9e1bcbd", "SHA-512 125 bytes" },
+        { &g_abRandom72KB[0],       126, "5dc477dcf848e23ba3a66c2ff9bccefdf83bc1134ff7f7a20fe7393269c7987939fbc264535a1ff0d3aba7201ee15a448d5545429a48c681ed5a8859857614f6", "SHA-512 126 bytes" },
+        { &g_abRandom72KB[0],       127, "7ea868053923ca7112afb72d6d184ea4fa41191b5a2cfc30c4555ae4bc6223c7c6c834f9f34433947308838abee9d068cd18cd3021ca677141440fc03d5daddd", "SHA-512 127 bytes" },
+        { &g_abRandom72KB[0],       128, "a2d7ee08394542488ee7c76954dc027826836161de10795eab31877dc0b56321ca0239a324985a5826a59ef60f70d591e543f56a5fa147d53f85d15ffc7f7791", "SHA-512 128 bytes" },
+        { &g_abRandom72KB[0],       129, "e5df5295d00b085665aab5208d17d2c5b152984ca952a2f28599943fe613b38590e24b5552b9614ad38de16197599ac2464ba7a85b66b087b4162dbd8f1038e3", "SHA-512 129 bytes" },
+        { &g_abRandom72KB[0],      1024, "213117257eedf07e76d9bd57f7b9b5fad2fbdccd8c9bf60a70e8b2feac5a30ccf83ca9041a07bb15727c81777d94ba75535f29a0bd92471b8899f5cd096e326a", "SHA-512 1024 bytes" },
+        { &g_abRandom72KB[0],     73001, "73e458b0479638d5e0b89ed55ca34933fbca66dc2b8ec81490e4b0ee465d7045736a001bc37388e6f73b3acd5655a210092dd5533a88ba1679a6513fe0c70a74", "SHA-512 73001 bytes" },
+        { &g_abRandom72KB[0],     73728, "80bd83278c0a26e0f2f952b44ff31057a33e971ea4d6d2f45097e1ff289c9b3c927152ec8ef972929b9b3222abecc3ed64bebc31779c6178b60b91e00a71f542", "SHA-512 73728 bytes" },
+        { &g_abRandom72KB[0x20c9],  9991, "d6ac7c68664df2e34dc6be233b33f8dad196348350b70a4c2c5a78eb54d6e297c819771313d798de7552b7a3cb85370aab25087e189f3be8560d49406ebb6280", "SHA-512 8393 bytes @9991" },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.3", s_abTests, RT_ELEMENTS(s_abTests), "SHA-512", RTDIGESTTYPE_SHA512);
+}
+
+
+#ifndef IPRT_WITHOUT_SHA512T224
+/**
+ * Tests SHA-512/224
+ */
+static void testSha512t224(void)
+{
+    RTTestISub("SHA-512/224");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA512T224_HASH_SIZE];
+    char        szDigest[RTSHA512T224_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "abc";
+    RTSha512t224(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512t224ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa");
+
+    pszString = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
+    RTSha512t224(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512t224ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "23fec5bb94d60b23308192640b0c453335d664734fe40e7268674af9");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { RT_STR_TUPLE("abc"), "4634270f707b6a54daae7530460842e20e37ed265ceee9a43e8924aa", "SHA-512/224 abc" },
+        { RT_STR_TUPLE("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
+          "23fec5bb94d60b23308192640b0c453335d664734fe40e7268674af9", "SHA-512/256 abcdef..." },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.5", s_abTests, RT_ELEMENTS(s_abTests), "SHA-512/224", RTDIGESTTYPE_SHA512T224);
+}
+#endif /* IPRT_WITHOUT_SHA512T224 */
+
+#ifndef IPRT_WITHOUT_SHA512T256
+/**
+ * Tests SHA-512/256
+ */
+static void testSha512t256(void)
+{
+    RTTestISub("SHA-512/256");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA512T256_HASH_SIZE];
+    char        szDigest[RTSHA512T256_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "abc";
+    RTSha512t256(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512t256ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23");
+
+    pszString = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
+    RTSha512t256(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha512t256ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { RT_STR_TUPLE("abc"), "53048e2681941ef99b2e29b76b4c7dabe4c2d0c634fc6d46e0e2f13107e7af23", "SHA-512/256 abc" },
+        { RT_STR_TUPLE("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
+          "3928e184fb8690f840da3988121d31be65cb9d3ef83ee6146feac861e19b563a", "SHA-512/256 abcdef..." },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.6", s_abTests, RT_ELEMENTS(s_abTests), "SHA-512/256", RTDIGESTTYPE_SHA512T256);
+}
+#endif /* !IPRT_WITHOUT_SHA512T256 */
+
+/**
+ * Tests SHA-384
+ */
+static void testSha384(void)
+{
+    RTTestISub("SHA-384");
+
+    /*
+     * Some quick direct API tests.
+     */
+    uint8_t     abHash[RTSHA384_HASH_SIZE];
+    char        szDigest[RTSHA384_DIGEST_LEN + 1];
+    const char *pszString;
+
+    pszString = "abc";
+    RTSha384(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha384ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7");
+
+    pszString = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
+    RTSha384(pszString, strlen(pszString), abHash);
+    RTTESTI_CHECK_RC_RETV(RTSha384ToString(abHash, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+    CHECK_STRING(szDigest, "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039");
+
+    /*
+     * Generic API tests.
+     */
+    static TESTRTDIGEST const s_abTests[] =
+    {
+        { RT_STR_TUPLE("abc"), "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7", "SHA-384 abc" },
+        { RT_STR_TUPLE("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"),
+          "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039", "SHA-384 abcdef..." },
+    };
+    testGeneric("2.16.840.1.101.3.4.2.2", s_abTests, RT_ELEMENTS(s_abTests), "SHA-384", RTDIGESTTYPE_SHA384);
+}
+
+
+int main()
+{
+    RTTEST hTest;
+    int rc = RTTestInitAndCreate("tstRTDigest-2", &hTest);
+    if (rc)
+        return rc;
+    RTTestBanner(hTest);
+
+    testMd2();
+    testMd5();
+    testSha1();
+    testSha256();
+    testSha224();
+    testSha512();
+    testSha384();
+#ifndef IPRT_WITHOUT_SHA512T224
+    testSha512t224();
+#endif
+#ifndef IPRT_WITHOUT_SHA512T256
+    testSha512t256();
+#endif
+
+    return RTTestSummaryAndDestroy(hTest);
+}
+
diff --git a/src/VBox/Runtime/testcase/tstRTDigest.cpp b/src/VBox/Runtime/testcase/tstRTDigest.cpp
index 5092ea2..6df329c 100644
--- a/src/VBox/Runtime/testcase/tstRTDigest.cpp
+++ b/src/VBox/Runtime/testcase/tstRTDigest.cpp
@@ -29,6 +29,7 @@
 *   Header Files                                                               *
 *******************************************************************************/
 #include <iprt/sha.h>
+#include <iprt/md2.h>
 #include <iprt/md5.h>
 #include <iprt/crc.h>
 
@@ -42,6 +43,7 @@
 #include <iprt/process.h>
 #include <iprt/string.h>
 #include <iprt/stream.h>
+#include <iprt/crypto/digest.h>
 
 
 static int Error(const char *pszFormat, ...)
@@ -60,56 +62,143 @@ static int Error(const char *pszFormat, ...)
 }
 
 
+static int MyReadFile(RTFILE hFile, void *pvBuf, size_t cbToRead, size_t *pcbRead, uint64_t *pcbMaxLeft)
+{
+    int rc = VINF_SUCCESS;
+    if (*pcbMaxLeft > 0)
+    {
+        if (cbToRead > *pcbMaxLeft)
+            cbToRead = (size_t)*pcbMaxLeft;
+        rc = RTFileRead(hFile, pvBuf, cbToRead, pcbRead);
+        if (RT_SUCCESS(rc))
+            *pcbMaxLeft -= *pcbRead;
+    }
+    else
+        *pcbRead = 0;
+    return rc;
+}
+
+
+static char *MyGetNextSignificantLine(PRTSTREAM pFile, char *pszBuf, size_t cbBuf, uint32_t *piLine, int *prc)
+{
+    for (;;)
+    {
+        *pszBuf = '\0';
+        int rc = RTStrmGetLine(pFile, pszBuf, cbBuf);
+        if (RT_FAILURE(rc))
+        {
+            if (rc != VERR_EOF)
+            {
+                Error("Read error: %Rrc", rc);
+                *prc = rc;
+                return NULL;
+            }
+            if (!*pszBuf)
+                return NULL;
+        }
+        *piLine += 1;
+
+        /* Significant? */
+        char *pszStart = RTStrStrip(pszBuf);
+        if (*pszStart && *pszStart != '#')
+            return pszStart;
+    }
+}
+
+
 int main(int argc, char **argv)
 {
      RTR3InitExe(argc, &argv, 0);
 
-     enum
-     {
-         kDigestType_NotSpecified,
-         kDigestType_CRC32,
-         kDigestType_CRC64,
-         kDigestType_MD5,
-         kDigestType_SHA1,
-         kDigestType_SHA256,
-         kDigestType_SHA512
-     } enmDigestType = kDigestType_NotSpecified;
+     RTDIGESTTYPE enmDigestType  = RTDIGESTTYPE_INVALID;
+     const char  *pszDigestType  = "NotSpecified";
 
      enum
      {
          kMethod_Full,
          kMethod_Block,
-         kMethod_File
+         kMethod_File,
+         kMethod_CVAS
      } enmMethod = kMethod_Block;
 
+     uint64_t   offStart    = 0;
+     uint64_t   cbMax       = UINT64_MAX;
+     bool       fTestcase   = false;
+
      static const RTGETOPTDEF s_aOptions[] =
      {
          { "--type",   't', RTGETOPT_REQ_STRING },
          { "--method", 'm', RTGETOPT_REQ_STRING },
          { "--help",   'h', RTGETOPT_REQ_NOTHING },
+         { "--length", 'l', RTGETOPT_REQ_UINT64 },
+         { "--offset", 'o', RTGETOPT_REQ_UINT64 },
+         { "--testcase", 'x', RTGETOPT_REQ_NOTHING },
      };
 
      int ch;
      RTGETOPTUNION ValueUnion;
      RTGETOPTSTATE GetState;
-     RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0);
+     RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
      while ((ch = RTGetOpt(&GetState, &ValueUnion)))
      {
          switch (ch)
          {
              case 't':
                  if (!RTStrICmp(ValueUnion.psz, "crc32"))
-                     enmDigestType = kDigestType_CRC32;
+                 {
+                     pszDigestType  = "CRC32";
+                     enmDigestType  = RTDIGESTTYPE_CRC32;
+                 }
                  else if (!RTStrICmp(ValueUnion.psz, "crc64"))
-                     enmDigestType = kDigestType_CRC64;
+                 {
+                     pszDigestType = "CRC64";
+                     enmDigestType = RTDIGESTTYPE_CRC64;
+                 }
+                 else if (!RTStrICmp(ValueUnion.psz, "md2"))
+                 {
+                     pszDigestType = "MD2";
+                     enmDigestType = RTDIGESTTYPE_MD2;
+                 }
                  else if (!RTStrICmp(ValueUnion.psz, "md5"))
-                     enmDigestType = kDigestType_MD5;
+                 {
+                     pszDigestType = "MD5";
+                     enmDigestType = RTDIGESTTYPE_MD5;
+                 }
                  else if (!RTStrICmp(ValueUnion.psz, "sha1"))
-                     enmDigestType = kDigestType_SHA1;
+                 {
+                     pszDigestType = "SHA-1";
+                     enmDigestType = RTDIGESTTYPE_SHA1;
+                 }
+                 else if (!RTStrICmp(ValueUnion.psz, "sha224"))
+                 {
+                     pszDigestType = "SHA-224";
+                     enmDigestType = RTDIGESTTYPE_SHA224;
+                 }
                  else if (!RTStrICmp(ValueUnion.psz, "sha256"))
-                     enmDigestType = kDigestType_SHA256;
+                 {
+                     pszDigestType = "SHA-256";
+                     enmDigestType = RTDIGESTTYPE_SHA256;
+                 }
+                 else if (!RTStrICmp(ValueUnion.psz, "sha384"))
+                 {
+                     pszDigestType = "SHA-384";
+                     enmDigestType = RTDIGESTTYPE_SHA384;
+                 }
                  else if (!RTStrICmp(ValueUnion.psz, "sha512"))
-                     enmDigestType = kDigestType_SHA512;
+                 {
+                     pszDigestType = "SHA-512";
+                     enmDigestType = RTDIGESTTYPE_SHA512;
+                 }
+                 else if (!RTStrICmp(ValueUnion.psz, "sha512/224"))
+                 {
+                     pszDigestType = "SHA-512/224";
+                     enmDigestType = RTDIGESTTYPE_SHA512T224;
+                 }
+                 else if (!RTStrICmp(ValueUnion.psz, "sha512/256"))
+                 {
+                     pszDigestType = "SHA-512/256";
+                     enmDigestType = RTDIGESTTYPE_SHA512T256;
+                 }
                  else
                  {
                      Error("Invalid digest type: %s\n", ValueUnion.psz);
@@ -124,6 +213,8 @@ int main(int argc, char **argv)
                      enmMethod = kMethod_Block;
                  else if (!RTStrICmp(ValueUnion.psz, "file"))
                      enmMethod = kMethod_File;
+                 else if (!RTStrICmp(ValueUnion.psz, "cvas"))
+                     enmMethod = kMethod_CVAS;
                  else
                  {
                      Error("Invalid digest method: %s\n", ValueUnion.psz);
@@ -131,13 +222,25 @@ int main(int argc, char **argv)
                  }
                  break;
 
+             case 'l':
+                 cbMax = ValueUnion.u64;
+                 break;
+
+             case 'o':
+                 offStart = ValueUnion.u64;
+                 break;
+
+             case 'x':
+                 fTestcase = true;
+                 break;
+
              case 'h':
-                 RTPrintf("syntax: tstRTDigest -t <digest-type> file [file2 [..]]\n");
+                 RTPrintf("usage: tstRTDigest -t <digest-type> [-o <offset>] [-l <length>] [-x] file [file2 [..]]\n");
                  return 1;
 
              case VINF_GETOPT_NOT_OPTION:
              {
-                 if (enmDigestType == kDigestType_NotSpecified)
+                 if (enmDigestType == RTDIGESTTYPE_INVALID)
                      return Error("No digest type was specified\n");
 
                  switch (enmMethod)
@@ -146,9 +249,11 @@ int main(int argc, char **argv)
                          return Error("Full file method is not implemented\n");
 
                      case kMethod_File:
+                         if (offStart != 0 || cbMax != UINT64_MAX)
+                             return Error("The -l and -o options do not work with the 'file' method.");
                          switch (enmDigestType)
                          {
-                             case kDigestType_SHA1:
+                             case RTDIGESTTYPE_SHA1:
                              {
                                  char *pszDigest;
                                  int rc = RTSha1DigestFromFile(ValueUnion.psz, &pszDigest, NULL, NULL);
@@ -159,7 +264,7 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_SHA256:
+                             case RTDIGESTTYPE_SHA256:
                              {
                                  char *pszDigest;
                                  int rc = RTSha256DigestFromFile(ValueUnion.psz, &pszDigest, NULL, NULL);
@@ -180,18 +285,25 @@ int main(int argc, char **argv)
                          int rc = RTFileOpen(&hFile, ValueUnion.psz, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
                          if (RT_FAILURE(rc))
                              return Error("RTFileOpen(,%s,) -> %Rrc\n", ValueUnion.psz, rc);
+                         if (offStart != 0)
+                         {
+                             rc = RTFileSeek(hFile, offStart, RTFILE_SEEK_BEGIN, NULL);
+                             if (RT_FAILURE(rc))
+                                 return Error("RTFileSeek(%s,%ull) -> %Rrc\n", ValueUnion.psz, offStart, rc);
+                         }
 
+                         uint64_t cbMaxLeft = cbMax;
                          size_t  cbRead;
                          uint8_t abBuf[_64K];
                          char   *pszDigest = (char *)&abBuf[0];
                          switch (enmDigestType)
                          {
-                             case kDigestType_CRC32:
+                             case RTDIGESTTYPE_CRC32:
                              {
                                  uint32_t uCRC32 = RTCrc32Start();
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      uCRC32 = RTCrc32Process(uCRC32, abBuf, cbRead);
@@ -201,12 +313,12 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_CRC64:
+                             case RTDIGESTTYPE_CRC64:
                              {
                                  uint64_t uCRC64 = RTCrc64Start();
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      uCRC64 = RTCrc64Process(uCRC64, abBuf, cbRead);
@@ -216,13 +328,30 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_MD5:
+                             case RTDIGESTTYPE_MD2:
+                             {
+                                 RTMD2CONTEXT Ctx;
+                                 RTMd2Init(&Ctx);
+                                 for (;;)
+                                 {
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
+                                     if (RT_FAILURE(rc) || !cbRead)
+                                         break;
+                                     RTMd2Update(&Ctx, abBuf, cbRead);
+                                 }
+                                 uint8_t abDigest[RTMD2_HASH_SIZE];
+                                 RTMd2Final(&Ctx, abDigest);
+                                 RTMd2ToString(abDigest, pszDigest, sizeof(abBuf));
+                                 break;
+                             }
+
+                             case RTDIGESTTYPE_MD5:
                              {
                                  RTMD5CONTEXT Ctx;
                                  RTMd5Init(&Ctx);
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      RTMd5Update(&Ctx, abBuf, cbRead);
@@ -233,13 +362,13 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_SHA1:
+                             case RTDIGESTTYPE_SHA1:
                              {
                                  RTSHA1CONTEXT Ctx;
                                  RTSha1Init(&Ctx);
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      RTSha1Update(&Ctx, abBuf, cbRead);
@@ -250,13 +379,13 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_SHA256:
+                             case RTDIGESTTYPE_SHA256:
                              {
                                  RTSHA256CONTEXT Ctx;
                                  RTSha256Init(&Ctx);
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      RTSha256Update(&Ctx, abBuf, cbRead);
@@ -267,13 +396,13 @@ int main(int argc, char **argv)
                                  break;
                              }
 
-                             case kDigestType_SHA512:
+                             case RTDIGESTTYPE_SHA512:
                              {
                                  RTSHA512CONTEXT Ctx;
                                  RTSha512Init(&Ctx);
                                  for (;;)
                                  {
-                                     rc = RTFileRead(hFile, abBuf, sizeof(abBuf), &cbRead);
+                                     rc = MyReadFile(hFile, abBuf, sizeof(abBuf), &cbRead, &cbMaxLeft);
                                      if (RT_FAILURE(rc) || !cbRead)
                                          break;
                                      RTSha512Update(&Ctx, abBuf, cbRead);
@@ -293,7 +422,131 @@ int main(int argc, char **argv)
                              RTPrintf("Partial: %s  %s\n", pszDigest, ValueUnion.psz);
                              return Error("RTFileRead(%s) -> %Rrc\n", ValueUnion.psz, rc);
                          }
-                         RTPrintf("%s  %s\n", pszDigest, ValueUnion.psz);
+
+                         if (!fTestcase)
+                             RTPrintf("%s  %s\n", pszDigest, ValueUnion.psz);
+                         else if (offStart)
+                             RTPrintf("        { &g_abRandom72KB[%#4llx], %5llu, \"%s\", \"%s %llu bytes @%llu\" },\n",
+                                      offStart, cbMax - cbMaxLeft, pszDigest, pszDigestType, offStart, cbMax - cbMaxLeft);
+                         else
+                             RTPrintf("        { &g_abRandom72KB[0],     %5llu, \"%s\", \"%s %llu bytes\" },\n",
+                                      cbMax - cbMaxLeft, pszDigest, pszDigestType, cbMax - cbMaxLeft);
+                         break;
+                     }
+
+
+                     /*
+                      * Process a SHS response file:
+                      *     http://csrc.nist.gov/groups/STM/cavp/index.html#03
+                      */
+                     case kMethod_CVAS:
+                     {
+                         RTCRDIGEST hDigest;
+                         int rc = RTCrDigestCreateByType(&hDigest, enmDigestType);
+                         if (RT_FAILURE(rc))
+                             return Error("Failed to create digest calculator for %s: %Rrc", pszDigestType, rc);
+
+                         uint32_t const cbDigest = RTCrDigestGetHashSize(hDigest);
+                         if (!cbDigest || cbDigest >= _1K)
+                             return Error("Unexpected hash size: %#x\n", cbDigest);
+
+                         PRTSTREAM pFile;
+                         rc = RTStrmOpen(ValueUnion.psz, "r", &pFile);
+                         if (RT_FAILURE(rc))
+                             return Error("Failed to open CVAS file '%s': %Rrc", ValueUnion.psz, rc);
+
+                         /*
+                          * Parse the input file.
+                          * ASSUME order: Len, Msg, MD.
+                          */
+                         static char    s_szLine[_256K];
+                         char          *psz;
+                         uint32_t       cPassed = 0;
+                         uint32_t       cErrors = 0;
+                         uint32_t       iLine   = 1;
+                         for (;;)
+                         {
+                             psz = MyGetNextSignificantLine(pFile, s_szLine, sizeof(s_szLine), &iLine, &rc);
+                             if (!psz)
+                                 break;
+
+                             /* Skip [L = 20] stuff. */
+                             if (*psz == '[')
+                                 continue;
+
+                             /* Message length. */
+                             uint64_t cMessageBits;
+                             if (RTStrNICmp(psz, RT_STR_TUPLE("Len =")))
+                                 return Error("%s(%d): Expected 'Len =' found '%.10s...'", ValueUnion.psz, iLine, psz);
+                             psz = RTStrStripL(psz + 5);
+                             rc = RTStrToUInt64Full(psz, 0, &cMessageBits);
+                             if (rc != VINF_SUCCESS)
+                                 return Error("%s(%d): Error parsing length '%s': %Rrc\n", ValueUnion.psz, iLine, psz, rc);
+
+                             /* The message text. */
+                             psz = MyGetNextSignificantLine(pFile, s_szLine, sizeof(s_szLine), &iLine, &rc);
+                             if (!psz)
+                                 return Error("%s(%d): Expected message text not EOF.", ValueUnion.psz, iLine);
+                             if (RTStrNICmp(psz, RT_STR_TUPLE("Msg =")))
+                                 return Error("%s(%d): Expected 'Msg =' found '%.10s...'", ValueUnion.psz, iLine, psz);
+                             psz = RTStrStripL(psz + 5);
+
+                             size_t const   cbMessage = (cMessageBits + 7) / 8;
+                             static uint8_t s_abMessage[sizeof(s_szLine) / 2];
+                             if (cbMessage > 0)
+                             {
+                                 rc = RTStrConvertHexBytes(psz, s_abMessage, cbMessage, 0 /*fFlags*/);
+                                 if (rc != VINF_SUCCESS)
+                                     return Error("%s(%d): Error parsing message '%.10s...': %Rrc\n",
+                                                  ValueUnion.psz, iLine, psz, rc);
+                             }
+
+                             /* The message digest. */
+                             psz = MyGetNextSignificantLine(pFile, s_szLine, sizeof(s_szLine), &iLine, &rc);
+                             if (!psz)
+                                 return Error("%s(%d): Expected message digest not EOF.", ValueUnion.psz, iLine);
+                             if (RTStrNICmp(psz, RT_STR_TUPLE("MD =")))
+                                 return Error("%s(%d): Expected 'MD =' found '%.10s...'", ValueUnion.psz, iLine, psz);
+                             psz = RTStrStripL(psz + 4);
+
+                             static uint8_t s_abExpectedDigest[_1K];
+                             rc = RTStrConvertHexBytes(psz, s_abExpectedDigest, cbDigest, 0 /*fFlags*/);
+                             if (rc != VINF_SUCCESS)
+                                 return Error("%s(%d): Error parsing message digest '%.10s...': %Rrc\n",
+                                              ValueUnion.psz, iLine, psz, rc);
+
+                             /*
+                              * Do the testing.
+                              */
+                             rc = RTCrDigestReset(hDigest);
+                             if (rc != VINF_SUCCESS)
+                                 return Error("RTCrDigestReset failed: %Rrc", rc);
+
+                             rc = RTCrDigestUpdate(hDigest, s_abMessage, cbMessage);
+                             if (rc != VINF_SUCCESS)
+                                 return Error("RTCrDigestUpdate failed: %Rrc", rc);
+
+                             static uint8_t s_abActualDigest[_1K];
+                             rc = RTCrDigestFinal(hDigest, s_abActualDigest, cbDigest);
+                             if (rc != VINF_SUCCESS)
+                                 return Error("RTCrDigestFinal failed: %Rrc", rc);
+
+                             if (memcmp(s_abActualDigest, s_abExpectedDigest, cbDigest) == 0)
+                                 cPassed++;
+                             else
+                             {
+                                 Error("%s(%d): Message digest mismatch. Expected %.*RThxs, got %.*RThxs.",
+                                       ValueUnion.psz, iLine, cbDigest, s_abExpectedDigest, cbDigest, s_abActualDigest);
+                                 cErrors++;
+                             }
+                         }
+
+                         RTStrmClose(pFile);
+                         if (cErrors > 0)
+                             return Error("Failed: %u error%s (%u passed)", cErrors, cErrors == 1 ? "" : "s", cPassed);
+                         RTPrintf("Passed %u test%s.\n", cPassed, cPassed == 1 ? "" : "s");
+                         if (RT_FAILURE(rc))
+                             return Error("Failed: %Rrc", rc);
                          break;
                      }
 
diff --git a/src/VBox/Runtime/testcase/tstRTHttp.cpp b/src/VBox/Runtime/testcase/tstRTHttp.cpp
index 10ad184..3885c40 100644
--- a/src/VBox/Runtime/testcase/tstRTHttp.cpp
+++ b/src/VBox/Runtime/testcase/tstRTHttp.cpp
@@ -34,9 +34,159 @@
 #include <iprt/stream.h>
 #include <iprt/string.h>
 #include <iprt/initterm.h>
+#include <iprt/vfslowlevel.h>
+#include <iprt/zip.h>
 
 #define CAFILE_NAME "tstHttp-tempcafile.crt"
 
+static int extractPCA3G5(RTHTTP hHttp, PRTSTREAM CAFile, uint8_t *pu8Buf, size_t cbBuf)
+{
+    uint8_t *abSha1;
+    size_t  cbSha1;
+    uint8_t *abSha512;
+    size_t  cbSha512;
+    char *pszBuf = (char*)pu8Buf;
+
+    const uint8_t abSha1PCA3G5[] =
+    {
+        0x4e, 0xb6, 0xd5, 0x78, 0x49, 0x9b, 0x1c, 0xcf, 0x5f, 0x58,
+        0x1e, 0xad, 0x56, 0xbe, 0x3d, 0x9b, 0x67, 0x44, 0xa5, 0xe5
+    };
+    const uint8_t abSha512PCA3G5[] =
+    {
+        0xd4, 0xf8, 0x10, 0x54, 0x72, 0x77, 0x0a, 0x2d,
+        0xe3, 0x17, 0xb3, 0xcf, 0xed, 0x61, 0xae, 0x5c,
+        0x5d, 0x3e, 0xde, 0xa1, 0x41, 0x35, 0xb2, 0xdf,
+        0x60, 0xe2, 0x61, 0xfe, 0x3a, 0xc1, 0x66, 0xa3,
+        0x3c, 0x88, 0x54, 0x04, 0x4f, 0x1d, 0x13, 0x46,
+        0xe3, 0x8c, 0x06, 0x92, 0x9d, 0x70, 0x54, 0xc3,
+        0x44, 0xeb, 0x2c, 0x74, 0x25, 0x9e, 0x5d, 0xfb,
+        0xd2, 0x6b, 0xa8, 0x9a, 0xf0, 0xb3, 0x6a, 0x01
+    };
+    int rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
+                              &abSha1, &cbSha1, &abSha512, &cbSha512);
+    if (RT_SUCCESS(rc))
+    {
+        if (cbSha1 != sizeof(abSha1PCA3G5))
+        {
+            RTPrintf("Wrong SHA1 digest size of PCA-3G5\n");
+            rc = VERR_INTERNAL_ERROR;
+        }
+        else if (memcmp(abSha1PCA3G5, abSha1, cbSha1))
+        {
+            RTPrintf("Wrong SHA1 digest for PCA-3G5:\n"
+                     "Got:      %.*Rhxs\n"
+                     "Expected: %.*Rhxs\n",
+                     cbSha1, abSha1, sizeof(abSha1PCA3G5), abSha1PCA3G5);
+            rc = VERR_INTERNAL_ERROR;
+        }
+        if (cbSha512 != sizeof(abSha512PCA3G5))
+        {
+            RTPrintf("Wrong SHA512 digest size of PCA-3G5\n");
+            rc = VERR_INTERNAL_ERROR;
+        }
+        else if (memcmp(abSha512PCA3G5, abSha512, cbSha512))
+        {
+            RTPrintf("Wrong SHA512 digest for PCA-3G5:\n"
+                     "Got:      %.*Rhxs\n"
+                     "Expected: %.*Rhxs\n",
+                     cbSha512, abSha512, sizeof(abSha512PCA3G5), abSha512PCA3G5);
+            rc = VERR_INTERNAL_ERROR;
+        }
+        RTMemFree(abSha1);
+        RTMemFree(abSha512);
+        if (RT_SUCCESS(rc))
+            rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
+        if (RT_SUCCESS(rc))
+            rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
+    }
+    return rc;
+}
+
+static int extractPCA3(RTHTTP hHttp, PRTSTREAM CAFile, uint8_t *pu8Buf, size_t cbBuf)
+{
+    uint8_t *abSha1;
+    size_t  cbSha1;
+    uint8_t *abSha512;
+    size_t  cbSha512;
+    char *pszBuf = (char*)pu8Buf;
+
+    const uint8_t abSha1PCA3[] =
+    {
+        0xa1, 0xdb, 0x63, 0x93, 0x91, 0x6f, 0x17, 0xe4, 0x18, 0x55,
+        0x09, 0x40, 0x04, 0x15, 0xc7, 0x02, 0x40, 0xb0, 0xae, 0x6b
+    };
+    const uint8_t abSha512PCA3[] =
+    {
+        0xbb, 0xf7, 0x8a, 0x19, 0x9f, 0x37, 0xee, 0xa2,
+        0xce, 0xc8, 0xaf, 0xe3, 0xd6, 0x22, 0x54, 0x20,
+        0x74, 0x67, 0x6e, 0xa5, 0x19, 0xb7, 0x62, 0x1e,
+        0xc1, 0x2f, 0xd5, 0x08, 0xf4, 0x64, 0xc4, 0xc6,
+        0xbb, 0xc2, 0xf2, 0x35, 0xe7, 0xbe, 0x32, 0x0b,
+        0xde, 0xb2, 0xfc, 0x44, 0x92, 0x5b, 0x8b, 0x9b,
+        0x77, 0xa5, 0x40, 0x22, 0x18, 0x12, 0xcb, 0x3d,
+        0x0a, 0x67, 0x83, 0x87, 0xc5, 0x45, 0xc4, 0x99
+    };
+    int rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
+                              &abSha1, &cbSha1, &abSha512, &cbSha512);
+    if (RT_SUCCESS(rc))
+    {
+        if (cbSha1 != sizeof(abSha1PCA3))
+        {
+            RTPrintf("Wrong SHA1 digest size of PCA-3\n");
+            rc = VERR_INTERNAL_ERROR;
+        }
+        else if (memcmp(abSha1PCA3, abSha1, cbSha1))
+        {
+            RTPrintf("Wrong SHA1 digest for PCA-3:\n"
+                     "Got:      %.*Rhxs\n"
+                     "Expected: %.*Rhxs\n",
+                     cbSha1, abSha1, sizeof(abSha1PCA3), abSha1PCA3);
+            rc = VERR_INTERNAL_ERROR;
+        }
+        if (cbSha512 != sizeof(abSha512PCA3))
+        {
+            RTPrintf("Wrong SHA512 digest size of PCA-3\n");
+            rc = VERR_INTERNAL_ERROR;
+        }
+        else if (memcmp(abSha512PCA3, abSha512, cbSha512))
+        {
+            RTPrintf("Wrong SHA512 digest for PCA-3:\n"
+                     "Got:      %.*Rhxs\n"
+                     "Expected: %.*Rhxs\n",
+                     cbSha512, abSha512, sizeof(abSha512PCA3), abSha512PCA3);
+            rc = VERR_INTERNAL_ERROR;
+        }
+        RTMemFree(abSha1);
+        RTMemFree(abSha512);
+        if (RT_SUCCESS(rc))
+            rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
+        if (RT_SUCCESS(rc))
+            rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
+    }
+
+    return rc;
+}
+
+/*
+ * Check for HTTP errors, in particular properly display redirections.
+ */
+static void checkError(RTHTTP hHttp, int rc, const char *pszFile)
+{
+    if (rc == VERR_HTTP_REDIRECTED)
+    {
+        char *pszRedirLocation;
+        int rc2 = RTHttpGetRedirLocation(hHttp, &pszRedirLocation);
+        if (RT_SUCCESS(rc2))
+            RTPrintf("Redirected to '%s' trying to fetch '%s'\n", pszRedirLocation, pszFile);
+        else
+            RTPrintf("Redirected trying to fetch '%s'\n", pszFile);
+        RTStrFree(pszRedirLocation);
+    }
+    else
+        RTPrintf("Error %Rrc trying to fetch '%s'\n", rc, pszFile);
+}
+
 int main(int argc, char **argv)
 {
     unsigned cErrors = 0;
@@ -66,169 +216,108 @@ int main(int argc, char **argv)
 
     int rc = RTHttpCreate(&hHttp);
 
-    // create certificate file
+    /*
+     * Create the certificate file
+     */
     if (RT_SUCCESS(rc))
         rc = RTStrmOpen(CAFILE_NAME, "w+b", &CAFile);
 
-    // fetch root CA certificate (new one, often avoided in cert chains by
-    // using an intermediate cert which is signed by old root)
     if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem",
-                       &pszBuf);
-    if (RT_SUCCESS(rc) && pszBuf)
     {
-        uint8_t *abSha1;
-        size_t  cbSha1;
-        uint8_t *abSha512;
-        size_t  cbSha512;
-        size_t cbBuf = strlen(pszBuf);
-        const uint8_t abSha1PCA3G5[] =
-        {
-            0x4e, 0xb6, 0xd5, 0x78, 0x49, 0x9b, 0x1c, 0xcf, 0x5f, 0x58,
-            0x1e, 0xad, 0x56, 0xbe, 0x3d, 0x9b, 0x67, 0x44, 0xa5, 0xe5
-        };
-        const uint8_t abSha512PCA3G5[] =
-        {
-            0xd4, 0xf8, 0x10, 0x54, 0x72, 0x77, 0x0a, 0x2d,
-            0xe3, 0x17, 0xb3, 0xcf, 0xed, 0x61, 0xae, 0x5c,
-            0x5d, 0x3e, 0xde, 0xa1, 0x41, 0x35, 0xb2, 0xdf,
-            0x60, 0xe2, 0x61, 0xfe, 0x3a, 0xc1, 0x66, 0xa3,
-            0x3c, 0x88, 0x54, 0x04, 0x4f, 0x1d, 0x13, 0x46,
-            0xe3, 0x8c, 0x06, 0x92, 0x9d, 0x70, 0x54, 0xc3,
-            0x44, 0xeb, 0x2c, 0x74, 0x25, 0x9e, 0x5d, 0xfb,
-            0xd2, 0x6b, 0xa8, 0x9a, 0xf0, 0xb3, 0x6a, 0x01
-        };
-        rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
-                              &abSha1, &cbSha1, &abSha512, &cbSha512);
+        /*
+         * The old way:
+         */
+
+        /*
+         * Fetch the root CA certificate (new one, often avoided in cert chains by
+         * using an intermediate cert which is signed by old root)
+         */
         if (RT_SUCCESS(rc))
+            rc = RTHttpGetText(hHttp,
+                               "http://www.verisign.com/repository/roots/root-certificates/PCA-3G5.pem",
+                               &pszBuf);
+        if (RT_SUCCESS(rc) && pszBuf)
+            rc = extractPCA3G5(hHttp, CAFile, (uint8_t*)pszBuf, strlen(pszBuf));
+        else
+            checkError(hHttp, rc, "PCA-3G5.pem");
+        if (pszBuf)
         {
-            if (cbSha1 != sizeof(abSha1PCA3G5))
-            {
-                RTPrintf("Wrong SHA1 digest size of PCA-3G5\n");
-                rc = VERR_INTERNAL_ERROR;
-            }
-            else if (memcmp(abSha1PCA3G5, abSha1, cbSha1))
-            {
-                RTPrintf("Wrong SHA1 digest for PCA-3G5:\n"
-                        "Got:      %.*Rhxs\n"
-                        "Expected: %.*Rhxs\n",
-                        cbSha1, abSha1, sizeof(abSha1PCA3G5), abSha1PCA3G5);
-                rc = VERR_INTERNAL_ERROR;
-            }
-            if (cbSha512 != sizeof(abSha512PCA3G5))
-            {
-                RTPrintf("Wrong SHA512 digest size of PCA-3G5\n");
-                rc = VERR_INTERNAL_ERROR;
-            }
-            else if (memcmp(abSha512PCA3G5, abSha512, cbSha512))
-            {
-                RTPrintf("Wrong SHA512 digest for PCA-3G5:\n"
-                        "Got:      %.*Rhxs\n"
-                        "Expected: %.*Rhxs\n",
-                        cbSha512, abSha512, sizeof(abSha512PCA3G5), abSha512PCA3G5);
-                rc = VERR_INTERNAL_ERROR;
-            }
-            RTMemFree(abSha1);
-            RTMemFree(abSha512);
-            if (RT_SUCCESS(rc))
-                rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
-            if (RT_SUCCESS(rc))
-                rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
+            RTMemFree(pszBuf);
+            pszBuf = NULL;
         }
-    }
-    if (pszBuf)
-    {
-        RTMemFree(pszBuf);
-        pszBuf = NULL;
-    }
 
-    // fetch root CA certificate (old one, but still very widely used)
-    if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem",
-                       &pszBuf);
-    if (RT_SUCCESS(rc) && pszBuf)
-    {
-        uint8_t *abSha1;
-        size_t  cbSha1;
-        uint8_t *abSha512;
-        size_t  cbSha512;
-        size_t  cbBuf = strlen(pszBuf);
-        const uint8_t abSha1PCA3[] =
-        {
-            0xa1, 0xdb, 0x63, 0x93, 0x91, 0x6f, 0x17, 0xe4, 0x18, 0x55,
-            0x09, 0x40, 0x04, 0x15, 0xc7, 0x02, 0x40, 0xb0, 0xae, 0x6b
-        };
-        const uint8_t abSha512PCA3[] =
-        {
-            0xbb, 0xf7, 0x8a, 0x19, 0x9f, 0x37, 0xee, 0xa2,
-            0xce, 0xc8, 0xaf, 0xe3, 0xd6, 0x22, 0x54, 0x20,
-            0x74, 0x67, 0x6e, 0xa5, 0x19, 0xb7, 0x62, 0x1e,
-            0xc1, 0x2f, 0xd5, 0x08, 0xf4, 0x64, 0xc4, 0xc6,
-            0xbb, 0xc2, 0xf2, 0x35, 0xe7, 0xbe, 0x32, 0x0b,
-            0xde, 0xb2, 0xfc, 0x44, 0x92, 0x5b, 0x8b, 0x9b,
-            0x77, 0xa5, 0x40, 0x22, 0x18, 0x12, 0xcb, 0x3d,
-            0x0a, 0x67, 0x83, 0x87, 0xc5, 0x45, 0xc4, 0x99
-        };
-        rc = RTHttpCertDigest(hHttp, pszBuf, cbBuf,
-                              &abSha1, &cbSha1, &abSha512, &cbSha512);
+        /*
+         * Fetch the root CA certificate (old one, but still very widely used)
+         */
         if (RT_SUCCESS(rc))
+            rc = RTHttpGetText(hHttp,
+                               "http://www.verisign.com/repository/roots/root-certificates/PCA-3.pem",
+                               &pszBuf);
+        if (RT_SUCCESS(rc) && pszBuf)
+            rc = extractPCA3(hHttp, CAFile, (uint8_t*)pszBuf, strlen(pszBuf));
+        else
+            checkError(hHttp, rc, "PCA-3.pem");
+        if (pszBuf)
         {
-            if (cbSha1 != sizeof(abSha1PCA3))
-            {
-                RTPrintf("Wrong SHA1 digest size of PCA-3\n");
-                rc = VERR_INTERNAL_ERROR;
-            }
-            else if (memcmp(abSha1PCA3, abSha1, cbSha1))
-            {
-                RTPrintf("Wrong SHA1 digest for PCA-3:\n"
-                        "Got:      %.*Rhxs\n"
-                        "Expected: %.*Rhxs\n",
-                        cbSha1, abSha1, sizeof(abSha1PCA3), abSha1PCA3);
-                rc = VERR_INTERNAL_ERROR;
-            }
-            if (cbSha512 != sizeof(abSha512PCA3))
-            {
-                RTPrintf("Wrong SHA512 digest size of PCA-3\n");
-                rc = VERR_INTERNAL_ERROR;
-            }
-            else if (memcmp(abSha512PCA3, abSha512, cbSha512))
+            RTMemFree(pszBuf);
+            pszBuf = NULL;
+        }
+        RTPrintf("Old way: rc=%Rrc\n", rc);
+
+        /*
+         * The new way:
+         */
+        void *pu8Buf;
+        size_t cb;
+        rc = RTHttpGetBinary(hHttp,
+                             "http://www.verisign.com/support/roots.zip",
+                             &pu8Buf, &cb);
+        if (RT_SUCCESS(rc) && pu8Buf)
+        {
+            void *pvDecomp;
+            size_t cbDecomp;
+            rc = RTZipPkzipMemDecompress(&pvDecomp, &cbDecomp, pu8Buf, cb,
+                                        "VeriSign Root Certificates/Generation 5 (G5) PCA/VeriSign Class 3 Public Primary Certification Authority - G5.pem");
+            if (RT_SUCCESS(rc))
             {
-                RTPrintf("Wrong SHA512 digest for PCA-3:\n"
-                        "Got:      %.*Rhxs\n"
-                        "Expected: %.*Rhxs\n",
-                        cbSha512, abSha512, sizeof(abSha512PCA3), abSha512PCA3);
-                rc = VERR_INTERNAL_ERROR;
+                rc = extractPCA3G5(hHttp, CAFile, (uint8_t*)pvDecomp, cbDecomp);
+                RTMemFree(pvDecomp);
+                rc = RTZipPkzipMemDecompress(&pvDecomp, &cbDecomp, pu8Buf, cb,
+                                             "VeriSign Root Certificates/Generation 1 (G1) PCAs/Class 3 Public Primary Certification Authority.pem");
+                if (RT_SUCCESS(rc))
+                {
+                    rc = extractPCA3(hHttp, CAFile, (uint8_t*)pvDecomp, cbDecomp);
+                    RTMemFree(pvDecomp);
+                }
             }
-            RTMemFree(abSha1);
-            RTMemFree(abSha512);
-            if (RT_SUCCESS(rc))
-                rc = RTStrmWrite(CAFile, pszBuf, cbBuf);
-            if (RT_SUCCESS(rc))
-                rc = RTStrmWrite(CAFile, RTFILE_LINEFEED, strlen(RTFILE_LINEFEED));
         }
-    }
-    if (pszBuf)
-    {
-        RTMemFree(pszBuf);
-        pszBuf = NULL;
+        else
+            checkError(hHttp, rc, "roots.zip");
+        RTPrintf("New way: rc=%Rrc\n", rc);
     }
 
-    // close certificate file
+    /*
+     * Close the certificate file
+     */
     if (CAFile)
     {
         RTStrmClose(CAFile);
         CAFile = NULL;
     }
 
+    /*
+     * Use it
+     */
     if (RT_SUCCESS(rc))
         rc = RTHttpSetCAFile(hHttp, CAFILE_NAME);
 
+    /*
+     * Now try to do the actual HTTPS request
+     */
     if (RT_SUCCESS(rc))
-        rc = RTHttpGet(hHttp,
-                       "https://update.virtualbox.org/query.php?platform=LINUX_32BITS_UBUNTU_12_04&version=4.1.18",
-                       &pszBuf);
+        rc = RTHttpGetText(hHttp,
+                           "https://update.virtualbox.org/query.php?platform=LINUX_32BITS_UBUNTU_12_04&version=4.1.18",
+                           &pszBuf);
 
     if (   RT_FAILURE(rc)
         && rc != VERR_HTTP_COULDNT_CONNECT)
@@ -237,8 +326,10 @@ int main(int argc, char **argv)
     if (RT_FAILURE(rc))
         RTPrintf("Error code: %Rrc\n", rc);
     else
+    {
         RTPrintf("Success!\n");
-    RTPrintf("Got: %s\n", pszBuf);
+        RTPrintf("Got: %s\n", pszBuf);
+    }
     if (pszBuf)
     {
         RTMemFree(pszBuf);
diff --git a/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp b/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp
new file mode 100644
index 0000000..4a19ca5
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp
@@ -0,0 +1,105 @@
+/* $Id: tstRTLdrVerifyPeImage.cpp $ */
+/** @file
+ * SUP Testcase - Testing the Authenticode signature verification code.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/test.h>
+#include <iprt/mem.h>
+#include <iprt/ldr.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+static int g_iDummy = 0;
+
+static DECLCALLBACK(int) TestCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+                                      void const *pvSignature, size_t cbSignature,
+                                      PRTERRINFO pErrInfo, void *pvUser)
+{
+    return VINF_SUCCESS;
+}
+
+
+
+int main(int argc, char **argv)
+{
+    RTTEST hTest;
+    RTEXITCODE rcExit = RTTestInitAndCreate("tstAuthenticode", &hTest);
+    if (rcExit != RTEXITCODE_SUCCESS)
+        return rcExit;
+    RTTestBanner(hTest);
+
+    /*
+     * Process input.
+     */
+    for (int i = 1; i < argc; i++)
+    {
+        const char *pszFullName = argv[i];
+        const char *pszFilename = RTPathFilename(pszFullName);
+        RTTestSub(hTest, pszFilename);
+
+        RTLDRMOD hLdrMod;
+        int rc = RTLdrOpen(pszFullName, RTLDR_O_FOR_VALIDATION, RTLDRARCH_WHATEVER, &hLdrMod);
+        if (RT_SUCCESS(rc))
+        {
+            char szDigest[512];
+
+            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+            if (RT_SUCCESS(rc))
+                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "md5=%s\n", szDigest);
+            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+            if (RT_SUCCESS(rc))
+                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha1=%s\n", szDigest);
+            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+            if (RT_SUCCESS(rc))
+                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha256=%s\n", szDigest);
+            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, szDigest, sizeof(szDigest)), VINF_SUCCESS);
+            if (RT_SUCCESS(rc))
+                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha512=%s\n", szDigest);
+
+            if (rc != VERR_NOT_SUPPORTED)
+            {
+                RTERRINFOSTATIC ErrInfo;
+                RTErrInfoInitStatic(&ErrInfo);
+                rc = RTLdrVerifySignature(hLdrMod, TestCallback, &g_iDummy, &ErrInfo.Core);
+                if (RT_FAILURE(rc))
+                    RTTestFailed(hTest, "%s: %s (rc=%Rrc)", pszFilename, ErrInfo.Core.pszMsg, rc);
+            }
+            RTLdrClose(hLdrMod);
+        }
+        else
+            RTTestFailed(hTest, "Error opening '%s': %Rrc\n", pszFullName, rc);
+    }
+
+    return RTTestSummaryAndDestroy(hTest);
+}
+
diff --git a/src/VBox/Runtime/testcase/tstRTR0DbgKrnlInfoDriver.cpp b/src/VBox/Runtime/testcase/tstRTR0DbgKrnlInfoDriver.cpp
index 2ffb761..9de1a72 100644
--- a/src/VBox/Runtime/testcase/tstRTR0DbgKrnlInfoDriver.cpp
+++ b/src/VBox/Runtime/testcase/tstRTR0DbgKrnlInfoDriver.cpp
@@ -41,7 +41,10 @@
 #endif
 
 
-int main (int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 #ifndef VBOX
     RTPrintf("tstSup: SKIPPED\n");
@@ -150,3 +153,14 @@ int main (int argc, char **argv)
 #endif
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Runtime/testcase/tstRTR0MemUserKernelDriver.cpp b/src/VBox/Runtime/testcase/tstRTR0MemUserKernelDriver.cpp
index e789dff..7f069d0 100644
--- a/src/VBox/Runtime/testcase/tstRTR0MemUserKernelDriver.cpp
+++ b/src/VBox/Runtime/testcase/tstRTR0MemUserKernelDriver.cpp
@@ -42,7 +42,10 @@
 #endif
 
 
-int main(int argc, char **argv)
+/**
+ * Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 #ifndef VBOX
     RTPrintf("tstSup: SKIPPED\n");
@@ -208,3 +211,14 @@ int main(int argc, char **argv)
 #endif
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Runtime/testcase/tstRTR0SemMutexDriver.cpp b/src/VBox/Runtime/testcase/tstRTR0SemMutexDriver.cpp
index 21ee35c..652641a 100644
--- a/src/VBox/Runtime/testcase/tstRTR0SemMutexDriver.cpp
+++ b/src/VBox/Runtime/testcase/tstRTR0SemMutexDriver.cpp
@@ -168,7 +168,10 @@ static bool tstDoThreadedTest(TSTRTR0SEMMUTEX enmSetup, TSTRTR0SEMMUTEX enmDo, T
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 #ifndef VBOX
     RTPrintf("tstSup: SKIPPED\n");
@@ -288,3 +291,14 @@ int main(int argc, char **argv)
 #endif
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Runtime/testcase/tstRTR0TimerDriver.cpp b/src/VBox/Runtime/testcase/tstRTR0TimerDriver.cpp
index 0fd6b3c..dbee05d 100644
--- a/src/VBox/Runtime/testcase/tstRTR0TimerDriver.cpp
+++ b/src/VBox/Runtime/testcase/tstRTR0TimerDriver.cpp
@@ -43,7 +43,10 @@
 #include "tstRTR0CommonDriver.h"
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 #ifndef VBOX
     RTPrintf("tstRTR0Timer: SKIPPED\n");
@@ -117,3 +120,14 @@ int main(int argc, char **argv)
 #endif
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/Runtime/tools/Makefile.kmk b/src/VBox/Runtime/tools/Makefile.kmk
index 63b93c7..40f0592 100644
--- a/src/VBox/Runtime/tools/Makefile.kmk
+++ b/src/VBox/Runtime/tools/Makefile.kmk
@@ -4,7 +4,7 @@
 #
 
 #
-# Copyright (C) 2006-2013 Oracle Corporation
+# Copyright (C) 2006-2014 Oracle Corporation
 #
 # This file is part of VirtualBox Open Source Edition (OSE), as
 # available from http://www.virtualbox.org. This file is free software;
@@ -33,43 +33,68 @@ BLDPROGS += bldRTManifest
 bldRTManifest_TEMPLATE = VBoxAdvBldProg
 bldRTManifest_SOURCES  = RTManifest.cpp
 
-ifndef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
+# RTSignTool - Signing utility - build version.  Signed on windows so we can get the certificate from it.
+BLDPROGS += bldRTSignTool
+bldRTSignTool_TEMPLATE = VBoxAdvBldProg
+bldRTSignTool_SOURCES = RTSignTool.cpp
+bldRTSignTool_DEFS = IPRT_IN_BUILD_TOOL
+bldRTSignTool_POST_CMDS.win = $(VBOX_SIGN_IMAGE_CMDS)
+
+if !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS) && !defined(VBOX_ONLY_VALIDATIONKIT)
 
  # RTManifest is a tool for creating and verifying manifest files.
  PROGRAMS += RTRm
- RTRm_TEMPLATE = VBOXR3TSTEXE
+ RTRm_TEMPLATE = VBoxR3Tool
  RTRm_SOURCES = RTRm.cpp
 
  # RTManifest is a tool for creating and verifying manifest files.
  PROGRAMS += RTManifest
- RTManifest_TEMPLATE = VBOXR3TSTEXE
+ RTManifest_TEMPLATE = VBoxR3Tool
  RTManifest_SOURCES = RTManifest.cpp
 
  # RTLdrFlt is similar to c++filt, except that it's for VMMR0.r0 stacks.
  PROGRAMS += RTLdrFlt
- RTLdrFlt_TEMPLATE = VBOXR3TSTEXE
+ RTLdrFlt_TEMPLATE = VBoxR3Tool
  RTLdrFlt_SOURCES = RTLdrFlt.cpp
 
  # RTGzip - our gzip clone (for testing the gzip/gunzip streaming code)
  PROGRAMS += RTGzip
- RTGzip_TEMPLATE = VBOXR3TSTEXE
+ RTGzip_TEMPLATE = VBoxR3Tool
  RTGzip_SOURCES = RTGzip.cpp
 
  # RTShutdown - similar (but not identical) to a typical unix shutdown command.
  PROGRAMS += RTShutdown
- RTShutdown_TEMPLATE = VBOXR3TSTEXE
+ RTShutdown_TEMPLATE = VBoxR3Tool
  RTShutdown_SOURCES = RTShutdown.cpp
 
  # RTTar - our tar clone (for testing the tar/gzip/gunzip streaming code)
  PROGRAMS += RTTar
- RTTar_TEMPLATE = VBOXR3TSTEXE
+ RTTar_TEMPLATE = VBoxR3Tool
  RTTar_SOURCES = RTTar.cpp
 
+ # RTUnzip - our unzip clone (for testing the unzip streaming code)
+ PROGRAMS += RTUnzip
+ RTUnzip_TEMPLATE = VBOXR3TSTEXE
+ RTUnzip_SOURCES = RTUnzip.cpp
+
  # RTNtDbgHelp - our tar clone (for testing the tar/gzip/gunzip streaming code)
  PROGRAMS.win += RTNtDbgHelp
- RTNtDbgHelp_TEMPLATE = VBOXR3TSTEXE
+ RTNtDbgHelp_TEMPLATE = VBoxR3Tool
  RTNtDbgHelp_SOURCES = RTNtDbgHelp.cpp
 
+ # RTSignTool - Signing utility.
+ PROGRAMS += RTSignTool
+ RTSignTool_TEMPLATE = VBoxR3Tool
+ RTSignTool_SOURCES = RTSignTool.cpp
+ RTSignTool_LIBS = $(PATH_STAGE_LIB)/SUPR3$(VBOX_SUFF_LIB)
+
+ if 0 # disabled due to missing backports.
+ # RTDbgSymCache - Symbol cache manager.
+ PROGRAMS += RTDbgSymCache
+ RTDbgSymCache_TEMPLATE = VBoxR3Tool
+ RTDbgSymCache_SOURCES = RTDbgSymCache.cpp
+ endif
+
 endif # !VBOX_ONLY_EXTPACKS_USE_IMPLIBS
 
 include $(FILE_KBUILD_SUB_FOOTER)
diff --git a/src/VBox/Runtime/tools/RTDbgSymCache.cpp b/src/VBox/Runtime/tools/RTDbgSymCache.cpp
new file mode 100644
index 0000000..f08616c
--- /dev/null
+++ b/src/VBox/Runtime/tools/RTDbgSymCache.cpp
@@ -0,0 +1,1204 @@
+/* $Id: RTDbgSymCache.cpp $ */
+/** @file
+ * IPRT - Debug Symbol Cache Utility.
+ */
+
+/*
+ * Copyright (C) 2013 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/zip.h>
+
+#include <iprt/buildconfig.h>
+#include <iprt/file.h>
+#include <iprt/getopt.h>
+#include <iprt/initterm.h>
+#include <iprt/ldr.h>
+#include <iprt/message.h>
+#include <iprt/param.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+#include <iprt/vfs.h>
+#include <iprt/zip.h>
+#include <iprt/uuid.h>
+#include <iprt/formats/mach-o.h>
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/**
+ * Cache file type.
+ */
+typedef enum RTDBGSYMCACHEFILETYPE
+{
+    RTDBGSYMCACHEFILETYPE_INVALID,
+    RTDBGSYMCACHEFILETYPE_DIR,
+    RTDBGSYMCACHEFILETYPE_DIR_FILTER,
+    RTDBGSYMCACHEFILETYPE_DEBUG_FILE,
+    RTDBGSYMCACHEFILETYPE_IMAGE_FILE,
+    RTDBGSYMCACHEFILETYPE_DEBUG_BUNDLE,
+    RTDBGSYMCACHEFILETYPE_IMAGE_BUNDLE,
+    RTDBGSYMCACHEFILETYPE_IGNORE
+} RTDBGSYMCACHEFILETYPE;
+
+
+/**
+ * Configuration for the 'add' command.
+ */
+typedef struct RTDBGSYMCACHEADDCFG
+{
+    bool        fRecursive;
+    const char *pszFilter;
+    const char *pszCache;
+} RTDBGSYMCACHEADDCFG;
+/** Pointer to a read only 'add' config. */
+typedef RTDBGSYMCACHEADDCFG const *PCRTDBGSYMCACHEADDCFG;
+
+
+/*******************************************************************************
+*   Global Variables                                                           *
+*******************************************************************************/
+/** Bundle suffixes. */
+static const char * const g_apszBundleSuffixes[] =
+{
+    ".kext",
+    ".app",
+    ".framework",  /** @todo framework is different. */
+    ".component",
+    ".action",
+    ".caction",
+    ".bundle",
+    ".sourcebundle",
+    ".plugin",
+    ".ppp",
+    ".menu",
+    ".monitorpanel",
+    ".scripting",
+    ".prefPane",
+    ".qlgenerator",
+    ".brailledriver",
+    ".saver",
+    ".SpeechVoice",
+    ".SpeechRecognizer",
+    ".SpeechSynthesizer",
+    ".mdimporter",
+    ".spreporter",
+    ".xpc",
+    NULL
+};
+
+/** Debug bundle suffixes. (Same as above + .dSYM) */
+static const char * const g_apszDSymBundleSuffixes[] =
+{
+    ".kext.dSYM",
+    ".app.dSYM",
+    ".framework.dSYM",
+    ".component.dSYM",
+    ".action.dSYM",
+    ".caction.dSYM",
+    ".bundle.dSYM",
+    ".sourcebundle.dSYM",
+    ".menu.dSYM",
+    ".plugin.dSYM",
+    ".ppp.dSYM",
+    ".monitorpanel.dSYM",
+    ".scripting.dSYM",
+    ".prefPane.dSYM",
+    ".qlgenerator.dSYM",
+    ".brailledriver.dSYM",
+    ".saver.dSYM",
+    ".SpeechVoice.dSYM",
+    ".SpeechRecognizer.dSYM",
+    ".SpeechSynthesizer.dSYM",
+    ".mdimporter.dSYM",
+    ".spreporter.dSYM",
+    ".xpc.dSYM",
+    ".dSYM",
+    NULL
+};
+
+
+
+/**
+ * Display the version of the cache program.
+ *
+ * @returns exit code.
+ */
+static RTEXITCODE rtDbgSymCacheVersion(void)
+{
+    RTPrintf("%sr%d\n", RTBldCfgVersion(), RTBldCfgRevision());
+    return RTEXITCODE_SUCCESS;
+}
+
+
+/**
+ * Shows the usage of the cache program.
+ *
+ * @returns Exit code.
+ * @param   pszArg0             Program name.
+ * @param   pszCommand          Command selector, NULL if all.
+ */
+static RTEXITCODE rtDbgSymCacheUsage(const char *pszArg0, const char *pszCommand)
+{
+    if (!pszCommand || !strcmp(pszCommand, "add"))
+        RTPrintf("Usage: %s add [-rn] <cache-root-dir> <file1> [fileN..]\n", pszArg0);
+    return RTEXITCODE_SUCCESS;
+}
+
+
+/**
+ * Creates a UUID mapping for the file.
+ *
+ * @returns IPRT status code.
+ * @param   pszCacheFile    The path to the file in the cache.
+ * @param   pFileUuid       The UUID of the file.
+ * @param   pszUuidMapDir   The UUID map subdirectory in the cache, if this is
+ *                          wanted, otherwise NULL.
+ * @param   pCfg            The configuration.
+ */
+static int rtDbgSymCacheAddCreateUuidMapping(const char *pszCacheFile, PRTUUID pFileUuid,
+                                             const char *pszUuidMapDir, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Create the UUID map entry first, deep.
+     */
+    char szMapPath[RTPATH_MAX];
+    int rc = RTPathJoin(szMapPath, sizeof(szMapPath) - sizeof("/xxxx/yyyy/xxxx/yyyy/xxxx/zzzzzzzzzzzz") + 1,
+                        pCfg->pszCache, pszUuidMapDir);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error constructing UUID map path (RTPathJoin): %Rrc", rc);
+
+    size_t cch = strlen(szMapPath);
+    szMapPath[cch] = '-';
+
+    rc = RTUuidToStr(pFileUuid, &szMapPath[cch + 2], sizeof(szMapPath) - cch);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error constructing UUID map path (RTUuidToStr): %Rrc", rc);
+
+    /* Uppercase the whole lot. */
+    RTStrToUpper(&szMapPath[cch + 2]);
+
+    /* Split the first dword in two. */
+    szMapPath[cch + 1] = szMapPath[cch + 2];
+    szMapPath[cch + 2] = szMapPath[cch + 3];
+    szMapPath[cch + 3] = szMapPath[cch + 4];
+    szMapPath[cch + 4] = szMapPath[cch + 5];
+    szMapPath[cch + 5] = '-';
+
+    /*
+     * Create the directories in the path.
+     */
+    char chSaved = RTPATH_SLASH;
+    for (unsigned i = 0; i < 6; i++, cch += 5)
+    {
+        Assert(szMapPath[cch] == '-');
+        szMapPath[cch] = '\0';
+        if (!RTDirExists(szMapPath))
+        {
+            rc = RTDirCreate(szMapPath, 0755, 0/*fFlags*/);
+            if (RT_FAILURE(rc))
+                return RTMsgErrorRc(rc, "RTDirCreate failed on '%s' (UUID map path): %Rrc", szMapPath, rc);
+        }
+        szMapPath[cch] = RTPATH_SLASH;
+    }
+    cch -= 5;
+
+    /*
+     * Calculate a relative path from there to the actual file.
+     */
+    char szLinkTarget[RTPATH_MAX];
+    //szMapPath[cch] = '\0';
+    rc = RTPathCalcRelative(szLinkTarget, sizeof(szLinkTarget), szMapPath, pszCacheFile);
+    //szMapPath[cch] = RTPATH_SLASH;
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Failed to calculate relative path from '%s' to '%s': %Rrc", szMapPath, pszCacheFile, rc);
+
+    /*
+     * If there is already a link there, check if it matches or whether
+     * perhaps it's target doesn't exist.
+     */
+    RTFSOBJINFO ObjInfo;
+    rc = RTPathQueryInfoEx(szMapPath, &ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
+    if (RT_SUCCESS(rc))
+    {
+        if (RTFS_IS_SYMLINK(ObjInfo.Attr.fMode))
+        {
+            rc = RTPathQueryInfoEx(szMapPath, &ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
+            if (RT_SUCCESS(rc))
+            {
+                char *pszCurTarget = NULL;
+                rc = RTSymlinkReadA(szMapPath, &pszCurTarget);
+                if (RT_FAILURE(rc))
+                    return RTMsgErrorRc(rc, "UUID map: failed to read existing symlink '%s': %Rrc", szMapPath, rc);
+                if (RTPathCompare(pszCurTarget, szLinkTarget) == 0)
+                    RTMsgInfo("UUID map: existing link '%s' has the same target ('%s').", szMapPath, pszCurTarget);
+                else
+                {
+                    RTMsgError("UUID map: Existing mapping '%s' pointing to '%s' insted of '%s'",
+                               szMapPath, pszCurTarget, szLinkTarget);
+                    rc = VERR_ALREADY_EXISTS;
+                }
+                RTStrFree(pszCurTarget);
+                return rc;
+            }
+            else
+                RTMsgInfo("UUID map: replacing dangling link '%s'", szMapPath);
+            RTSymlinkDelete(szMapPath, 0 /*fFlags*/);
+        }
+        else if (RTFS_IS_FILE(ObjInfo.Attr.fMode))
+            return RTMsgErrorRc(VERR_IS_A_FILE,
+                                "UUID map: found file at '%s', expect symbolic link or nothing.", szMapPath);
+        else if (RTFS_IS_DIRECTORY(ObjInfo.Attr.fMode))
+            return RTMsgErrorRc(VERR_IS_A_DIRECTORY,
+                                "UUID map: found directory at '%s', expect symbolic link or nothing.", szMapPath);
+        else
+            return RTMsgErrorRc(VERR_NOT_SYMLINK,
+                                "UUID map: Expected symbolic link or nothing at '%s', found: fMode=%#x",
+                                szMapPath, ObjInfo.Attr.fMode);
+    }
+
+    /*
+     * Create the symbolic link.
+     */
+    rc = RTSymlinkCreate(szMapPath, szLinkTarget, RTSYMLINKTYPE_FILE, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Failed to create UUID map symlink '%s' to '%s': %Rrc", szMapPath, szLinkTarget, rc);
+    RTMsgInfo("UUID map: %s  =>  %s", szMapPath, szLinkTarget);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Adds a file to the cache.
+ *
+ * @returns IPRT status code.
+ * @param   pszSrcPath      Path to the source file.
+ * @param   pszDstName      The name of the destionation file (no path stuff).
+ * @param   pszExtraSuff    Optional extra suffix. Mach-O dSYM hack.
+ * @param   pszDstSubDir    The subdirectory to file it under.  This is the
+ *                          stringification of a relatively unique identifier of
+ *                          the file in question.
+ * @param   pAddToUuidMap   Optional file UUID that is used to create a UUID map
+ *                          entry.
+ * @param   pszUuidMapDir   The UUID map subdirectory in the cache, if this is
+ *                          wanted, otherwise NULL.
+ * @param   pCfg            The configuration.
+ */
+static int rtDbgSymCacheAddOneFile(const char *pszSrcPath, const char *pszDstName, const char *pszExtraStuff,
+                                   const char *pszDstSubDir, PRTUUID pAddToUuidMap, const char *pszUuidMapDir,
+                                   PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Build and create the destination path, step by step.
+     */
+    char szDstPath[RTPATH_MAX];
+    int rc = RTPathJoin(szDstPath, sizeof(szDstPath), pCfg->pszCache, pszDstName);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error constructing cache path for '%s': %Rrc", pszSrcPath, rc);
+
+    if (!RTDirExists(szDstPath))
+    {
+        rc = RTDirCreate(szDstPath, 0755, 0 /*fFlags*/);
+        if (RT_FAILURE(rc))
+            return RTMsgErrorRc(rc, "Error creating '%s': %Rrc", szDstPath, rc);
+    }
+
+    rc = RTPathAppend(szDstPath, sizeof(szDstPath), pszDstSubDir);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error constructing cache path for '%s': %Rrc", pszSrcPath, rc);
+
+    if (!RTDirExists(szDstPath))
+    {
+        rc = RTDirCreate(szDstPath, 0755, 0 /*fFlags*/);
+        if (RT_FAILURE(rc))
+            return RTMsgErrorRc(rc, "Error creating '%s': %Rrc", szDstPath, rc);
+    }
+
+    rc = RTPathAppend(szDstPath, sizeof(szDstPath), pszDstName);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error constructing cache path for '%s': %Rrc", pszSrcPath, rc);
+    if (pszExtraStuff)
+    {
+        rc = RTStrCat(szDstPath, sizeof(szDstPath), pszExtraStuff);
+        if (RT_FAILURE(rc))
+            return RTMsgErrorRc(rc, "Error constructing cache path for '%s': %Rrc", pszSrcPath, rc);
+    }
+
+    /*
+     * If the file exists, we compare the two and throws an error if the doesn't match.
+     */
+    if (RTPathExists(szDstPath))
+    {
+        rc = RTFileCompare(pszSrcPath, szDstPath);
+        if (RT_SUCCESS(rc))
+        {
+            RTMsgInfo("%s is already in the cache.", pszSrcPath);
+            if (pAddToUuidMap && pszUuidMapDir)
+                return rtDbgSymCacheAddCreateUuidMapping(szDstPath, pAddToUuidMap, pszUuidMapDir, pCfg);
+            return VINF_SUCCESS;
+        }
+        if (rc == VERR_NOT_EQUAL)
+            RTMsgInfo("Cache conflict with existing entry '%s' when inserting '%s'.", szDstPath, pszSrcPath);
+        else
+            RTMsgInfo("Error comparing '%s' with '%s': %Rrc", pszSrcPath, szDstPath, rc);
+        return rc;
+    }
+
+    /*
+     * The file doesn't exist or we should overwrite it,
+     */
+    RTMsgInfo("Copying '%s' to '%s'...", pszSrcPath, szDstPath);
+    rc = RTFileCopy(pszSrcPath, szDstPath);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error copying '%s' to '%s': %Rrc", pszSrcPath, szDstPath, rc);
+    if (pAddToUuidMap && pszUuidMapDir)
+        return rtDbgSymCacheAddCreateUuidMapping(szDstPath, pAddToUuidMap, pszUuidMapDir, pCfg);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Worker that add the image file to the right place.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath             Path to the image file.
+ * @param   pCfg                Configuration data.
+ * @param   hLdrMod             Image handle.
+ * @param   pszExtraSuff        Optional extra suffix.  Mach-O dSYM hack.
+ * @param   pszUuidMapDir       Optional UUID map cache directory if the image
+ *                              should be mapped by UUID.
+ *                              The map is a Mac OS X debug feature supported by
+ *                              the two native debuggers gdb and lldb.  Look for
+ *                              descriptions of DBGFileMappedPaths in the
+ *                              com.apple.DebugSymbols in the user defaults.
+ */
+static int rtDbgSymCacheAddImageFileWorker(const char *pszPath, PCRTDBGSYMCACHEADDCFG pCfg, RTLDRMOD hLdrMod,
+                                           const char *pszExtrSuff, const char *pszUuidMapDir)
+{
+    /*
+     * Determine which subdirectory to put the files in.
+     */
+    RTUUID      Uuid;
+    PRTUUID     pUuid = NULL;
+    int         rc;
+    char        szSubDir[48];
+    RTLDRFMT    enmFmt = RTLdrGetFormat(hLdrMod);
+    switch (enmFmt)
+    {
+        case RTLDRFMT_MACHO:
+        {
+            rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_UUID, &Uuid, sizeof(Uuid));
+            if (RT_FAILURE(rc))
+                return RTMsgErrorRc(rc, "Error quering image UUID from image '%s': %Rrc", pszPath, rc);
+
+            rc = RTUuidToStr(&Uuid, szSubDir, sizeof(szSubDir));
+            if (RT_FAILURE(rc))
+                return RTMsgErrorRc(rc, "Error convering UUID for image '%s' to string: %Rrc", pszPath, rc);
+            pUuid = &Uuid;
+            break;
+        }
+
+        case RTLDRFMT_PE:
+        {
+            uint32_t uTimestamp;
+            rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &uTimestamp, sizeof(uTimestamp));
+            if (RT_FAILURE(rc))
+                return RTMsgErrorRc(rc, "Error quering timestamp from image '%s': %Rrc", pszPath, rc);
+
+            size_t cbImage = RTLdrSize(hLdrMod);
+            if (cbImage == ~(size_t)0)
+                return RTMsgErrorRc(rc, "Error quering size of image '%s': %Rrc", pszPath, rc);
+
+            RTStrPrintf(szSubDir, sizeof(szSubDir), "%08X%x", uTimestamp, cbImage);
+            break;
+        }
+
+        case RTLDRFMT_AOUT:
+            return RTMsgErrorRc(VERR_NOT_SUPPORTED, "Caching of a.out image has not yet been implemented: %s", pszPath);
+        case RTLDRFMT_ELF:
+            return RTMsgErrorRc(VERR_NOT_SUPPORTED, "Caching of ELF image has not yet been implemented: %s", pszPath);
+        case RTLDRFMT_LX:
+            return RTMsgErrorRc(VERR_NOT_SUPPORTED, "Caching of LX image has not yet been implemented: %s", pszPath);
+        default:
+            return RTMsgErrorRc(VERR_NOT_SUPPORTED, "Unknown loader format for '%s': %d", pszPath, enmFmt);
+    }
+
+    /*
+     * Now add it.
+     */
+    return rtDbgSymCacheAddOneFile(pszPath, RTPathFilename(pszPath), pszExtrSuff,
+                                   szSubDir, pUuid, pszUuidMapDir, pCfg);
+}
+
+
+/**
+ * Adds what we think is an image file to the cache.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath         Path to the image file.
+ * @param   pszExtraSuff    Optional extra suffix. Mach-O dSYM hack.
+ * @param   pszUuidMapDir   The UUID map subdirectory in the cache, if this is
+ *                          wanted, otherwise NULL.
+ * @param   pCfg            Configuration data.
+ */
+static int rtDbgSymCacheAddImageFile(const char *pszPath, const char *pszExtraSuff, const char *pszUuidMapDir,
+                                     PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Use the loader to open the alleged image file.  We need to open it with
+     * arch set to amd64 and x86_32 in order to handle FAT images from the mac
+     * guys (we should actually enumerate archs, but that's currently not
+     * implemented nor necessary for our current use).
+     */
+    /* Open it as AMD64. */
+    RTLDRMOD hLdrMod64;
+    int rc = RTLdrOpen(pszPath, RTLDR_O_FOR_DEBUG, RTLDRARCH_AMD64, &hLdrMod64);
+    if (RT_FAILURE(rc))
+    {
+        if (rc != VERR_LDR_ARCH_MISMATCH)
+        {
+            if (rc != VERR_INVALID_EXE_SIGNATURE)
+                return RTMsgErrorRc(rc, "RTLdrOpen failed opening '%s' [arch=amd64]: %Rrc", pszPath, rc);
+            RTMsgInfo("Skipping '%s', no a recognizable image file...", pszPath);
+            return VINF_SUCCESS;
+        }
+        hLdrMod64 = NIL_RTLDRMOD;
+    }
+
+    /* Open it as X86. */
+    RTLDRMOD hLdrMod32;
+    rc = RTLdrOpen(pszPath, RTLDR_O_FOR_DEBUG, RTLDRARCH_X86_32, &hLdrMod32);
+    if (RT_FAILURE(rc))
+    {
+        if (rc != VERR_LDR_ARCH_MISMATCH)
+        {
+            RTLdrClose(hLdrMod32);
+            return RTMsgErrorRc(rc, "RTLdrOpen failed opening '%s' [arch=x86]: %Rrc", pszPath, rc);
+        }
+        hLdrMod32 = NIL_RTLDRMOD;
+    }
+
+    /*
+     * Add the file.
+     */
+    if (hLdrMod32 == NIL_RTLDRMOD)
+        rc = rtDbgSymCacheAddImageFileWorker(pszPath, pCfg, hLdrMod64, pszExtraSuff, pszUuidMapDir);
+    else if (hLdrMod64 == NIL_RTLDRMOD)
+        rc = rtDbgSymCacheAddImageFileWorker(pszPath, pCfg, hLdrMod32, pszExtraSuff, pszUuidMapDir);
+    else
+    {
+        /*
+         * Do we need to add it once or twice?
+         */
+        RTLDRFMT enmFmt = RTLdrGetFormat(hLdrMod32);
+        bool     fSame  = enmFmt == RTLdrGetFormat(hLdrMod64);
+        if (fSame && enmFmt == RTLDRFMT_MACHO)
+        {
+            RTUUID Uuid32, Uuid64;
+            int rc32 = RTLdrQueryProp(hLdrMod32, RTLDRPROP_UUID, &Uuid32, sizeof(Uuid32));
+            int rc64 = RTLdrQueryProp(hLdrMod64, RTLDRPROP_UUID, &Uuid64, sizeof(Uuid64));
+            fSame = RT_SUCCESS(rc32) == RT_SUCCESS(rc64);
+            if (fSame && RT_SUCCESS(rc32))
+                fSame = RTUuidCompare(&Uuid32, &Uuid64) == 0;
+        }
+        else if (fSame && enmFmt == RTLDRFMT_PE)
+        {
+            fSame = RTLdrSize(hLdrMod32) == RTLdrSize(hLdrMod64);
+            if (fSame)
+            {
+                uint32_t uTimestamp32, uTimestamp64;
+                int rc32 = RTLdrQueryProp(hLdrMod32, RTLDRPROP_TIMESTAMP_SECONDS, &uTimestamp32, sizeof(uTimestamp32));
+                int rc64 = RTLdrQueryProp(hLdrMod64, RTLDRPROP_TIMESTAMP_SECONDS, &uTimestamp64, sizeof(uTimestamp64));
+                fSame = RT_SUCCESS(rc32) == RT_SUCCESS(rc64);
+                if (fSame && RT_SUCCESS(rc32))
+                    fSame = uTimestamp32 == uTimestamp64;
+            }
+        }
+
+        rc = rtDbgSymCacheAddImageFileWorker(pszPath, pCfg, hLdrMod64, pszExtraSuff, pszUuidMapDir);
+        if (!fSame)
+        {
+            /** @todo should symlink or hardlink this second copy. */
+            int rc2 = rtDbgSymCacheAddImageFileWorker(pszPath, pCfg, hLdrMod32, pszExtraSuff, pszUuidMapDir);
+            if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+                rc = rc2;
+        }
+    }
+
+    RTLdrClose(hLdrMod32);
+    RTLdrClose(hLdrMod64);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Worker for rtDbgSymCacheAddDebugFile that adds a Mach-O debug file to the
+ * cache.
+ *
+ * @returns IPRT status code
+ * @param   pszPath             The path to the PDB file.
+ * @param   pCfg                The configuration.
+ * @param   hFile               Handle to the file.
+ */
+static int rtDbgSymCacheAddDebugMachO(const char *pszPath, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /* This shouldn't happen, figure out what to do if it does. */
+    return RTMsgErrorRc(VERR_NOT_IMPLEMENTED,
+                        "'%s' is an OS X image file, did you point me to a file inside a .dSYM or .sym file?",
+                        pszPath);
+}
+
+
+/**
+ * Worker for rtDbgSymCacheAddDebugFile that adds PDBs to the cace.
+ *
+ * @returns IPRT status code
+ * @param   pszPath             The path to the PDB file.
+ * @param   pCfg                The configuration.
+ * @param   hFile               Handle to the file.
+ */
+static int rtDbgSymCacheAddDebugPdb(const char *pszPath, PCRTDBGSYMCACHEADDCFG pCfg, RTFILE hFile)
+{
+    return RTMsgErrorRc(VERR_NOT_IMPLEMENTED, "PDB support not implemented: '%s'");
+}
+
+
+/**
+ * Adds a debug file to the cache.
+ *
+ * @returns IPRT status code
+ * @param   pszPath             The path to the debug file in question.
+ * @param   pCfg                The configuration.
+ */
+static int rtDbgSymCacheAddDebugFile(const char *pszPath, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Need to extract an identifier of sorts here in order to put them in
+     * the right place in the cache.  Currently only implemnted for Mach-O
+     * files since these use executable containers.
+     *
+     * We take a look at the file header in hope to figure out what to do
+     * with the file.
+     */
+    RTFILE hFile;
+    int rc = RTFileOpen(&hFile, pszPath, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "Error opening '%s': %Rrc", pszPath, rc);
+
+    union
+    {
+        uint64_t au64[16];
+        uint32_t au32[16];
+        uint16_t au16[32];
+        uint8_t  ab[64];
+    } uBuf;
+    rc = RTFileRead(hFile, &uBuf, sizeof(uBuf), NULL);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * Look for magics and call workers.
+         */
+        if (!memcmp(uBuf.ab, RT_STR_TUPLE("Microsoft C/C++ MSF 7.00")))
+            rc = rtDbgSymCacheAddDebugPdb(pszPath, pCfg, hFile);
+        else if (   uBuf.au32[0] == IMAGE_FAT_SIGNATURE
+                 || uBuf.au32[0] == IMAGE_FAT_SIGNATURE_OE
+                 || uBuf.au32[0] == IMAGE_MACHO32_SIGNATURE
+                 || uBuf.au32[0] == IMAGE_MACHO64_SIGNATURE
+                 || uBuf.au32[0] == IMAGE_MACHO32_SIGNATURE_OE
+                 || uBuf.au32[0] == IMAGE_MACHO64_SIGNATURE_OE)
+            rc = rtDbgSymCacheAddDebugMachO(pszPath, pCfg);
+        else
+            rc = RTMsgErrorRc(VERR_INVALID_MAGIC, "Unsupported debug file '%s' magic: %#010x", pszPath, uBuf.au32[0]);
+    }
+    else
+        rc = RTMsgErrorRc(rc, "Error reading '%s': %Rrc", pszPath, rc);
+
+    /* close the file. */
+    int rc2 = RTFileClose(hFile);
+    if (RT_FAILURE(rc2))
+    {
+        RTMsgError("Error closing '%s': %Rrc", pszPath, rc2);
+        if (RT_SUCCESS(rc))
+            rc = rc2;
+    }
+    return rc;
+}
+
+
+/**
+ * Constructs the path to the file instide the bundle that we're keen on.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath             Path to the bundle on input, on successful
+ *                              return it's the path to the desired file.  This
+ *                              a RTPATH_MAX size buffer.
+ * @param   cchPath             The length of the path up to the bundle name.
+ * @param   cchName             The length of the bundle name.
+ * @param   pszSubDir           The bundle subdirectory the file lives in.
+ * @param   papszSuffixes       Pointer to an array of bundle suffixes.
+ */
+static int rtDbgSymCacheConstructBundlePath(char *pszPath, size_t cchPath, size_t cchName, const char *pszSubDir,
+                                            const char * const *papszSuffixes)
+{
+    int rc = RTPathAppend(pszPath, RTPATH_MAX, pszSubDir);
+    if (RT_SUCCESS(rc))
+    {
+        /* Strip off the bundle suffix. */
+        const char *pszEnd = &pszPath[cchPath + cchName];
+        for (unsigned i = 0; papszSuffixes[i]; i++)
+        {
+            Assert(papszSuffixes[i][0] == '.');
+            size_t cchSuff = strlen(papszSuffixes[i]);
+            if (   cchSuff < cchName
+                && !memcmp(&pszEnd[-(ssize_t)cchSuff], papszSuffixes[i], cchSuff))
+            {
+                cchName -= cchSuff;
+                break;
+            }
+        }
+
+        /* Add the name. */
+        rc = RTPathAppendEx(pszPath, RTPATH_MAX, &pszPath[cchPath], cchName);
+    }
+    if (RT_FAILURE(rc))
+    {
+        pszPath[cchPath + cchName] = '\0';
+        return RTMsgErrorRc(rc, "Error constructing image bundle path for '%s': %Rrc", pszPath, rc);
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Adds a image bundle of some sort.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath             Path to the bundle. This a RTPATH_MAX size
+ *                              buffer that we can write to when creating the
+ *                              path to the file inside the bundle that we're
+ *                              interested in.
+ * @param   cchPath             The length of the path up to the bundle name.
+ * @param   cchName             The length of the bundle name.
+ * @param   pCfg                The configuration.
+ */
+static int rtDbgSymCacheAddImageBundle(char *pszPath, size_t cchPath, size_t cchName, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /* Assuming these are kexts or simple applications, we only add the image
+       file itself to the cache. No Info.plist or other files. */
+    /** @todo consider looking for Frameworks and handling framework bundles. */
+    int rc = rtDbgSymCacheConstructBundlePath(pszPath, cchPath, cchName, "Contents/MacOS/", g_apszBundleSuffixes);
+    if (RT_SUCCESS(rc))
+        rc = rtDbgSymCacheAddImageFile(pszPath, NULL, "image-uuids", pCfg);
+    return rc;
+}
+
+
+/**
+ * Adds a debug bundle.
+ *
+ * @returns IPRT status code.
+ * @param   pszPath             Path to the bundle. This a RTPATH_MAX size
+ *                              buffer that we can write to when creating the
+ *                              path to the file inside the bundle that we're
+ *                              interested in.
+ * @param   cchPath             The length of the path up to the bundle name.
+ * @param   cchName             The length of the bundle name.
+ * @param   pCfg                The configuration.
+ */
+static int rtDbgSymCacheAddDebugBundle(char *pszPath, size_t cchPath, size_t cchName, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * The current policy is not to add the whole .dSYM (or .sym) bundle, but
+     * rather just the dwarf image instide it.  The <UUID>.plist and Info.plist
+     * files generally doesn't contain much extra information that's really
+     * necessary, I hope.  At least this is what the uuidmap example in the
+     * lldb hints at (it links to the dwarf file, not the .dSYM dir).
+     *
+     * To avoid confusion with a .dSYM bundle, as well as collision with the
+     * image file, we use .dwarf suffix for the file.
+     *
+     * For details on the uuid map see rtDbgSymCacheAddImageFile as well as
+     * http://lldb.llvm.org/symbols.html .
+     *
+     * ASSUMES bundles contains Mach-O DWARF files.
+     */
+    int rc = rtDbgSymCacheConstructBundlePath(pszPath, cchPath, cchName, "Contents/Resources/DWARF/", g_apszDSymBundleSuffixes);
+    if (RT_SUCCESS(rc))
+        rc = rtDbgSymCacheAddImageFile(pszPath, ".dwarf", "dsym-uuids", pCfg);
+    return rc;
+}
+
+
+/**
+ * Figure the type of a file/dir based on path and FS object info.
+ *
+ * @returns The type.
+ * @param   pszPath             The path to the file/dir.
+ * @param   pObjInfo            The object information, symlinks followed.
+ */
+static RTDBGSYMCACHEFILETYPE rtDbgSymCacheFigureType2(const char *pszPath, PCRTFSOBJINFO pObjInfo)
+{
+    const char *pszName = RTPathFilename(pszPath);
+    const char *pszExt  = RTPathSuffix(pszName);
+    if (pszExt)
+        pszExt++;
+    else
+        pszExt = "";
+
+    if (   RTFS_IS_DIRECTORY(pObjInfo->Attr.fMode)
+        || (pObjInfo->Attr.fMode & RTFS_DOS_DIRECTORY)) /** @todo OS X samba reports reparse points in /Volumes/ that we cannot resolve. */
+    {
+        /* Skip directories shouldn't bother with. */
+        if (   !RTStrICmp(pszName, ".Trashes")
+            || !RTStrICmp(pszName, ".$RESCYCLE.BIN")
+            || !RTStrICmp(pszName, "System.kext") /* Usually only plugins here, so skip it. */
+           )
+            return RTDBGSYMCACHEFILETYPE_IGNORE;
+
+        /* Directories can also be bundles on the mac. */
+        if (!RTStrICmp(pszExt, "dSYM"))
+            return RTDBGSYMCACHEFILETYPE_DEBUG_BUNDLE;
+
+        for (unsigned i = 0; i < RT_ELEMENTS(g_apszBundleSuffixes) - 1; i++)
+            if (!RTStrICmp(pszExt, &g_apszBundleSuffixes[i][1]))
+                return RTDBGSYMCACHEFILETYPE_IMAGE_BUNDLE;
+
+        return RTDBGSYMCACHEFILETYPE_DIR;
+    }
+
+    if (!RTFS_IS_FILE(pObjInfo->Attr.fMode))
+        return RTDBGSYMCACHEFILETYPE_INVALID;
+
+    /* Select image vs debug info based on extension. */
+    if (   !RTStrICmp(pszExt, "pdb")
+        || !RTStrICmp(pszExt, "dbg")
+        || !RTStrICmp(pszExt, "sym")
+        || !RTStrICmp(pszExt, "dwo")
+        || !RTStrICmp(pszExt, "dwp")
+        || !RTStrICmp(pszExt, "debug")
+        || !RTStrICmp(pszExt, "dsym")
+        || !RTStrICmp(pszExt, "dwarf")
+        || !RTStrICmp(pszExt, "map")
+        || !RTStrICmp(pszExt, "cv"))
+        return RTDBGSYMCACHEFILETYPE_DEBUG_FILE;
+
+    /* Filter out a bunch of files which obviously shouldn't be images. */
+    if (   !RTStrICmp(pszExt, "txt")
+        || !RTStrICmp(pszExt, "html")
+        || !RTStrICmp(pszExt, "htm")
+        || !RTStrICmp(pszExt, "rtf")
+        || !RTStrICmp(pszExt, "zip")
+        || !RTStrICmp(pszExt, "doc")
+        || !RTStrICmp(pszExt, "gz")
+        || !RTStrICmp(pszExt, "bz2")
+        || !RTStrICmp(pszExt, "xz")
+        || !RTStrICmp(pszExt, "kmk")
+        || !RTStrICmp(pszExt, "c")
+        || !RTStrICmp(pszExt, "cpp")
+        || !RTStrICmp(pszExt, "h")
+        || !RTStrICmp(pszExt, "m")
+        || !RTStrICmp(pszExt, "mm")
+        || !RTStrICmp(pszExt, "asm")
+        || !RTStrICmp(pszExt, "S")
+        || !RTStrICmp(pszExt, "inc")
+        || !RTStrICmp(pszExt, "sh")
+       )
+        return RTDBGSYMCACHEFILETYPE_IGNORE;
+    if (   !RTStrICmp(pszName, "Makefile")
+        || !RTStrICmp(pszName, "GNUmakefile")
+        || !RTStrICmp(pszName, "createsymbolfiles")
+        || !RTStrICmp(pszName, "kgmacros")
+       )
+        return RTDBGSYMCACHEFILETYPE_IGNORE;
+
+    return RTDBGSYMCACHEFILETYPE_IMAGE_FILE;
+}
+
+
+/**
+ * Figure file type based on name, will stat the file/dir.
+ *
+ * @returns File type.
+ * @param   pszPath             The path to the file/dir to figure.
+ */
+static RTDBGSYMCACHEFILETYPE rtDbgSymCacheFigureType(const char *pszPath)
+{
+    const char *pszName = RTPathFilename(pszPath);
+
+    /* Trailing slash. */
+    if (!pszName)
+        return RTDBGSYMCACHEFILETYPE_DIR;
+
+    /* Wildcard means listing directory and filtering.  */
+    if (strpbrk(pszName, "?*"))
+        return RTDBGSYMCACHEFILETYPE_DIR_FILTER;
+
+    /* Get object info, following links. */
+    RTFSOBJINFO ObjInfo;
+    int rc = RTPathQueryInfoEx(pszPath, &ObjInfo, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
+    if (RT_FAILURE(rc))
+        return RTDBGSYMCACHEFILETYPE_INVALID;
+    return rtDbgSymCacheFigureType2(pszPath, &ObjInfo);
+}
+
+
+/**
+ * Recursive worker for rtDbgSymCacheAddDir, for minimal stack wasting.
+ *
+ * @returns IPRT status code (fully bitched).
+ * @param   pszPath             Pointer to a RTPATH_MAX size buffer containing
+ *                              the path to the current directory ending with a
+ *                              slash.
+ * @param   cchPath             The size of the current directory path.
+ * @param   pDirEntry           Pointer to the RTDIRENTRYEX structure to use.
+ * @param   pCfg                The configuration.
+ */
+static int rtDbgSymCacheAddDirWorker(char *pszPath, size_t cchPath, PRTDIRENTRYEX pDirEntry, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Open the directory.
+     */
+    PRTDIR pDir;
+    int rc, rc2;
+    if (pCfg->pszFilter)
+    {
+        rc = RTStrCopy(&pszPath[cchPath], RTPATH_MAX - cchPath, pCfg->pszFilter);
+        if (RT_FAILURE(rc))
+        {
+            pszPath[cchPath] = '\0';
+            return RTMsgErrorRc(rc, "Filename too long (%Rrc): '%s" RTPATH_SLASH_STR "%s'", rc, pszPath, pCfg->pszFilter);
+        }
+        rc = RTDirOpenFiltered(&pDir, pszPath, RTDIRFILTER_WINNT, 0 /*fFlags*/);
+    }
+    else
+        rc = RTDirOpen(&pDir, pszPath);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorRc(rc, "RTDirOpen%s failed on '%s': %Rrc", pCfg->pszFilter ? "Filtered" : "", pszPath, rc);
+
+    /*
+     * Enumerate the files.
+     */
+    for (;;)
+    {
+        rc2 = RTDirReadEx(pDir, pDirEntry, NULL, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
+        if (RT_FAILURE(rc2))
+        {
+            pszPath[cchPath] = '\0';
+            if (rc2 != VERR_NO_MORE_FILES)
+            {
+                RTMsgError("RTDirReadEx failed in '%s': %Rrc\n", pszPath, rc2);
+                rc = rc2;
+            }
+            break;
+        }
+
+        /* Skip dot and dot-dot. */
+        if (RTDirEntryExIsStdDotLink(pDirEntry))
+            continue;
+
+        /* Construct a full path. */
+        rc = RTStrCopy(&pszPath[cchPath], RTPATH_MAX, pDirEntry->szName);
+        if (RT_FAILURE(rc))
+        {
+            pszPath[cchPath] = '\0';
+            RTMsgError("File name too long in '%s': '%s' (%Rrc)", pszPath, pDirEntry->szName, rc);
+            break;
+        }
+
+        switch (rtDbgSymCacheFigureType2(pszPath, &pDirEntry->Info))
+        {
+            case RTDBGSYMCACHEFILETYPE_DIR:
+                if (!pCfg->fRecursive)
+                    RTMsgInfo("Skipping directory '%s'...", pszPath);
+                else
+                {
+                    if (cchPath + pDirEntry->cbName + 3 <= RTPATH_MAX)
+                    {
+                        pszPath[cchPath + pDirEntry->cbName] = RTPATH_SLASH;
+                        pszPath[cchPath + pDirEntry->cbName + 1] = '\0';
+                        rc2 = rtDbgSymCacheAddDirWorker(pszPath, cchPath + pDirEntry->cbName + 1, pDirEntry, pCfg);
+                    }
+                    else
+                    {
+                        RTMsgError("File name too long in '%s': '%s' (%Rrc)", pszPath, pDirEntry->szName, rc);
+                        rc2 = VERR_FILENAME_TOO_LONG;
+                    }
+                }
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_DEBUG_FILE:
+                rc2 = rtDbgSymCacheAddDebugFile(pszPath, pCfg);
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_IMAGE_FILE:
+                rc2 = rtDbgSymCacheAddImageFile(pszPath, NULL /*pszExtraSuff*/, "image-uuids", pCfg);
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_DEBUG_BUNDLE:
+                rc2 = rtDbgSymCacheAddDebugBundle(pszPath, cchPath, pDirEntry->cbName, pCfg);
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_IMAGE_BUNDLE:
+                rc2 = rtDbgSymCacheAddImageBundle(pszPath, cchPath, pDirEntry->cbName, pCfg);
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_DIR_FILTER:
+            case RTDBGSYMCACHEFILETYPE_INVALID:
+                rc2 = RTMsgErrorRc(VERR_INTERNAL_ERROR_2, "Invalid: '%s'", pszPath);
+                break;
+
+            case RTDBGSYMCACHEFILETYPE_IGNORE:
+                rc2 = VINF_SUCCESS;
+                break;
+        }
+
+        if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+            rc = rc2;
+    }
+
+    /*
+     * Clean up.
+     */
+    rc2 = RTDirClose(pDir);
+    if (RT_FAILURE(rc2))
+    {
+        RTMsgError("RTDirClose failed in '%s': %Rrc", pszPath, rc);
+        rc = rc2;
+    }
+    return rc;
+}
+
+
+/**
+ * Adds a directory.
+ *
+ * @returns IPRT status code (fully bitched).
+ * @param   pszPath             The directory path.
+ * @param   pCfg                The configuration.
+ */
+static int rtDbgSymCacheAddDir(const char *pszPath, PCRTDBGSYMCACHEADDCFG pCfg)
+{
+    /*
+     * Set up the path buffer, stripping any filter.
+     */
+    char szPath[RTPATH_MAX];
+    int rc = RTStrCopy(szPath, sizeof(szPath) - 2, pszPath);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Path too long: '%s'", pszPath);
+
+    size_t cchPath = strlen(pszPath);
+    if (!cchPath)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Path empty: '%s'", pszPath);
+
+    if (pCfg->pszFilter)
+        szPath[cchPath - strlen(pCfg->pszFilter)] = '\0';
+    cchPath = RTPathStripTrailingSlash(szPath);
+    if (!RTPATH_IS_SEP(pszPath[cchPath - 1]))
+    {
+        szPath[cchPath++] = RTPATH_SLASH;
+        szPath[cchPath]   = '\0';
+    }
+
+    /*
+     * Let the worker do the rest.
+     */
+    RTDIRENTRYEX DirEntry;
+    return rtDbgSymCacheAddDirWorker(szPath, cchPath, &DirEntry, pCfg);
+}
+
+
+/**
+ * Adds a file or directory.
+ *
+ * @returns Program exit code.
+ * @param   pszPath         The user supplied path to the file or directory.
+ * @param   pszCache        The path to the cache.
+ * @param   fRecursive      Whether to process directories recursively.
+ */
+static RTEXITCODE rtDbgSymCacheAddFileOrDir(const char *pszPath, const char *pszCache, bool fRecursive)
+{
+    RTDBGSYMCACHEADDCFG Cfg;
+    Cfg.fRecursive      = fRecursive;
+    Cfg.pszCache        = pszCache;
+    Cfg.pszFilter       = NULL;
+
+    int rc;
+    RTDBGSYMCACHEFILETYPE enmType = rtDbgSymCacheFigureType(pszPath);
+    switch (enmType)
+    {
+        default:
+        case RTDBGSYMCACHEFILETYPE_INVALID:
+            return RTMsgErrorExit(RTEXITCODE_FAILURE, "Invalid: '%s'", pszPath);
+
+        case RTDBGSYMCACHEFILETYPE_DIR_FILTER:
+            Cfg.pszFilter = RTPathFilename(pszPath);
+            /* fall thru */
+        case RTDBGSYMCACHEFILETYPE_DIR:
+            rc = rtDbgSymCacheAddDir(pszPath, &Cfg);
+            break;
+
+        case RTDBGSYMCACHEFILETYPE_DEBUG_FILE:
+            rc = rtDbgSymCacheAddDebugFile(pszPath, &Cfg);
+            break;
+
+        case RTDBGSYMCACHEFILETYPE_IMAGE_FILE:
+            rc = rtDbgSymCacheAddImageFile(pszPath, NULL /*pszExtraSuff*/, "image-uuids", &Cfg);
+            break;
+
+        case RTDBGSYMCACHEFILETYPE_DEBUG_BUNDLE:
+        case RTDBGSYMCACHEFILETYPE_IMAGE_BUNDLE:
+        {
+            size_t cchPath     = strlen(pszPath);
+            size_t cchFilename = strlen(RTPathFilename(pszPath));
+            char szPathBuf[RTPATH_MAX];
+            if (cchPath < sizeof(szPathBuf))
+            {
+                memcpy(szPathBuf, pszPath, cchPath + 1);
+                if (enmType == RTDBGSYMCACHEFILETYPE_DEBUG_BUNDLE)
+                    rc = rtDbgSymCacheAddDebugBundle(szPathBuf, cchPath - cchFilename, cchFilename, &Cfg);
+                else
+                    rc = rtDbgSymCacheAddImageBundle(szPathBuf, cchPath - cchFilename, cchFilename, &Cfg);
+            }
+            else
+                rc = RTMsgErrorRc(VERR_FILENAME_TOO_LONG, "Filename too long: '%s'", pszPath);
+            break;
+        }
+
+        case RTDBGSYMCACHEFILETYPE_IGNORE:
+            rc = RTMsgErrorRc(VERR_INVALID_PARAMETER, "Invalid file: '%s'");
+            break;
+    }
+    return RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+
+/**
+ * Handles the 'add' command.
+ *
+ * @returns Program exit code.
+ * @param   pszArg0             The program name.
+ * @param   cArgs               The number of arguments to the 'add' command.
+ * @param   papszArgs           The argument vector, starting after 'add'.
+ */
+static RTEXITCODE rtDbgSymCacheCmdAdd(const char *pszArg0, int cArgs, char **papszArgs)
+{
+    /*
+     * Parse the command line.
+     */
+    static RTGETOPTDEF const s_aOptions[] =
+    {
+        { "--recursive",        'R', RTGETOPT_REQ_NOTHING },
+        { "--no-recursive",     'n', RTGETOPT_REQ_NOTHING },
+    };
+
+    const char *pszCache        = NULL;
+    bool        fRecursive      = false;
+
+    RTGETOPTSTATE State;
+    int rc = RTGetOptInit(&State, cArgs, papszArgs, &s_aOptions[0], RT_ELEMENTS(s_aOptions), 0,  RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTGetOptInit failed: %Rrc", rc);
+
+    uint32_t        cAdded = 0;
+    RTGETOPTUNION   ValueUnion;
+    int             chOpt;
+    while ((chOpt = RTGetOpt(&State, &ValueUnion)) != 0)
+    {
+        switch (chOpt)
+        {
+            case 'R':
+                fRecursive = true;
+                break;
+
+            case 'n':
+                fRecursive = false;
+                break;
+
+            case VINF_GETOPT_NOT_OPTION:
+                /* The first non-option is a cache directory. */
+                if (!pszCache)
+                {
+                    pszCache = ValueUnion.psz;
+                    if (!RTPathExists(pszCache))
+                    {
+                        rc = RTDirCreate(pszCache, 0755, 0 /*fFlags*/);
+                        if (RT_FAILURE(rc))
+                            return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Error creating cache directory '%s': %Rrc", pszCache, rc);
+                    }
+                    else if (!RTDirExists(pszCache))
+                        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Specified cache directory is not a directory: '%s'", pszCache);
+                }
+                /* Subsequent non-options are files to be added to the cache. */
+                else
+                {
+                    RTEXITCODE rcExit = rtDbgSymCacheAddFileOrDir(ValueUnion.psz, pszCache, fRecursive);
+                    if (rcExit != RTEXITCODE_FAILURE)
+                        return rcExit;
+                }
+                break;
+
+            case 'h':
+                return rtDbgSymCacheUsage(pszArg0, "add");
+            case 'V':
+                return rtDbgSymCacheVersion();
+            default:
+                return RTGetOptPrintError(chOpt, &ValueUnion);
+        }
+    }
+
+    if (!pszCache)
+        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No cache directory or files to add were specified.");
+    return RTEXITCODE_SUCCESS;
+}
+
+
+int main(int argc, char **argv)
+{
+    int rc = RTR3InitExe(argc, &argv, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgInitFailure(rc);
+
+    /*
+     * Switch on the command.
+     */
+    RTEXITCODE rcExit = RTEXITCODE_SYNTAX;
+    if (argc < 2)
+        rtDbgSymCacheUsage(argv[0], NULL);
+    else if (!strcmp(argv[1], "add"))
+        rcExit = rtDbgSymCacheCmdAdd(argv[0], argc - 2, argv + 2);
+    else if (   !strcmp(argv[1], "-h")
+             || !strcmp(argv[1], "-?")
+             || !strcmp(argv[1], "--help"))
+        rcExit = rtDbgSymCacheUsage(argv[0], NULL);
+    else if (   !strcmp(argv[1], "-V")
+             || !strcmp(argv[1], "--version"))
+        rcExit = rtDbgSymCacheVersion();
+    else
+        RTMsgError("Unknown command: '%s'", argv[1]);
+
+    return rcExit;
+}
+
diff --git a/src/VBox/Runtime/tools/RTSignTool.cpp b/src/VBox/Runtime/tools/RTSignTool.cpp
new file mode 100644
index 0000000..a5ab3b4
--- /dev/null
+++ b/src/VBox/Runtime/tools/RTSignTool.cpp
@@ -0,0 +1,934 @@
+/* $Id: RTSignTool.cpp $ */
+/** @file
+ * IPRT - Signing Tool.
+ */
+
+/*
+ * Copyright (C) 2006-2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#include <iprt/assert.h>
+#include <iprt/buildconfig.h>
+#include <iprt/err.h>
+#include <iprt/getopt.h>
+#include <iprt/file.h>
+#include <iprt/initterm.h>
+#include <iprt/ldr.h>
+#include <iprt/message.h>
+#include <iprt/mem.h>
+#include <iprt/path.h>
+#include <iprt/stream.h>
+#include <iprt/string.h>
+#include <iprt/crypto/x509.h>
+#include <iprt/crypto/pkcs7.h>
+#include <iprt/crypto/store.h>
+#ifdef VBOX
+# include <VBox/sup.h> /* Certificates */
+#endif
+
+
+/*******************************************************************************
+*   Structures and Typedefs                                                    *
+*******************************************************************************/
+/** Help detail levels. */
+typedef enum RTSIGNTOOLHELP
+{
+    RTSIGNTOOLHELP_USAGE,
+    RTSIGNTOOLHELP_FULL
+} RTSIGNTOOLHELP;
+
+
+/*******************************************************************************
+*   Internal Functions                                                         *
+*******************************************************************************/
+static RTEXITCODE HandleHelp(int cArgs, char **papszArgs);
+static RTEXITCODE HelpHelp(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel);
+static RTEXITCODE HandleVersion(int cArgs, char **papszArgs);
+
+
+
+
+/*
+ * The 'extract-exe-signer-cert' command.
+ */
+static RTEXITCODE HelpExtractExeSignerCert(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+    RTStrmPrintf(pStrm, "extract-exe-signer-cert [--ber|--cer|--der] [--exe|-e] <exe> [--output|-o] <outfile.cer>\n");
+    return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleExtractExeSignerCert(int cArgs, char **papszArgs)
+{
+    /*
+     * Parse arguments.
+     */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        { "--ber",    'b', RTGETOPT_REQ_NOTHING },
+        { "--cer",    'c', RTGETOPT_REQ_NOTHING },
+        { "--der",    'd', RTGETOPT_REQ_NOTHING },
+        { "--exe",    'e', RTGETOPT_REQ_STRING },
+        { "--output", 'o', RTGETOPT_REQ_STRING },
+    };
+
+    const char *pszExe = NULL;
+    const char *pszOut = NULL;
+    RTLDRARCH   enmLdrArch   = RTLDRARCH_WHATEVER;
+    uint32_t    fCursorFlags = RTASN1CURSOR_FLAGS_DER;
+
+    RTGETOPTSTATE GetState;
+    int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    AssertRCReturn(rc, RTEXITCODE_FAILURE);
+    RTGETOPTUNION ValueUnion;
+    int ch;
+    while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+    {
+        switch (ch)
+        {
+            case 'e':   pszExe = ValueUnion.psz; break;
+            case 'o':   pszOut = ValueUnion.psz; break;
+            case 'b':   fCursorFlags = 0; break;
+            case 'c':   fCursorFlags = RTASN1CURSOR_FLAGS_CER; break;
+            case 'd':   fCursorFlags = RTASN1CURSOR_FLAGS_DER; break;
+            case 'V':   return HandleVersion(cArgs, papszArgs);
+            case 'h':   return HelpExtractExeSignerCert(g_pStdOut, RTSIGNTOOLHELP_FULL);
+
+            case VINF_GETOPT_NOT_OPTION:
+                if (!pszExe)
+                    pszExe = ValueUnion.psz;
+                else if (!pszOut)
+                    pszOut = ValueUnion.psz;
+                else
+                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "Too many file arguments: %s", ValueUnion.psz);
+                break;
+
+            default:
+                return RTGetOptPrintError(ch, &ValueUnion);
+        }
+    }
+    if (!pszExe)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given.");
+    if (!pszOut)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file given.");
+    if (RTPathExists(pszOut))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "The output file '%s' exists.", pszOut);
+
+    /*
+     * Do it.
+     */
+
+    /* Open the executable image and query the PKCS7 info. */
+    RTLDRMOD hLdrMod;
+    rc = RTLdrOpen(pszExe, RTLDR_O_FOR_VALIDATION, enmLdrArch, &hLdrMod);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening executable image '%s': %Rrc", pszExe, rc);
+
+    RTEXITCODE rcExit = RTEXITCODE_FAILURE;
+#ifdef DEBUG
+    size_t     cbBuf = 64;
+#else
+    size_t     cbBuf = _512K;
+#endif
+    void      *pvBuf = RTMemAlloc(cbBuf);
+    size_t     cbRet = 0;
+    rc = RTLdrQueryPropEx(hLdrMod, RTLDRPROP_PKCS7_SIGNED_DATA, pvBuf, cbBuf, &cbRet);
+    if (rc == VERR_BUFFER_OVERFLOW && cbRet < _4M && cbRet > 0)
+    {
+        RTMemFree(pvBuf);
+        cbBuf = cbRet;
+        pvBuf = RTMemAlloc(cbBuf);
+        rc = RTLdrQueryPropEx(hLdrMod, RTLDRPROP_PKCS7_SIGNED_DATA, pvBuf, cbBuf, &cbRet);
+    }
+    if (RT_SUCCESS(rc))
+    {
+        static RTERRINFOSTATIC s_StaticErrInfo;
+        RTErrInfoInitStatic(&s_StaticErrInfo);
+
+        /*
+         * Decode the output.
+         */
+        RTASN1CURSORPRIMARY PrimaryCursor;
+        RTAsn1CursorInitPrimary(&PrimaryCursor, pvBuf, (uint32_t)cbRet, &s_StaticErrInfo.Core,
+                                &g_RTAsn1DefaultAllocator, fCursorFlags, "exe");
+        RTCRPKCS7CONTENTINFO Pkcs7Ci;
+        rc = RTCrPkcs7ContentInfo_DecodeAsn1(&PrimaryCursor.Cursor, 0, &Pkcs7Ci, "pkcs7");
+        if (RT_SUCCESS(rc))
+        {
+            if (RTCrPkcs7ContentInfo_IsSignedData(&Pkcs7Ci))
+            {
+                PCRTCRPKCS7SIGNEDDATA pSd = Pkcs7Ci.u.pSignedData;
+                if (pSd->SignerInfos.cItems == 1)
+                {
+                    PCRTCRPKCS7ISSUERANDSERIALNUMBER pISN = &pSd->SignerInfos.paItems[0].IssuerAndSerialNumber;
+                    PCRTCRX509CERTIFICATE pCert;
+                    pCert = RTCrX509Certificates_FindByIssuerAndSerialNumber(&pSd->Certificates,
+                                                                            &pISN->Name, &pISN->SerialNumber);
+                    if (pCert)
+                    {
+                        /*
+                         * Write it out.
+                         */
+                        RTFILE hFile;
+                        rc = RTFileOpen(&hFile, pszOut, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE);
+                        if (RT_SUCCESS(rc))
+                        {
+                            uint32_t cbCert = pCert->SeqCore.Asn1Core.cbHdr + pCert->SeqCore.Asn1Core.cb;
+                            rc = RTFileWrite(hFile, pCert->SeqCore.Asn1Core.uData.pu8 - pCert->SeqCore.Asn1Core.cbHdr,
+                                             cbCert, NULL);
+                            if (RT_SUCCESS(rc))
+                            {
+                                rc = RTFileClose(hFile);
+                                if (RT_SUCCESS(rc))
+                                {
+                                    hFile  = NIL_RTFILE;
+                                    rcExit = RTEXITCODE_SUCCESS;
+                                    RTMsgInfo("Successfully wrote %u bytes to '%s'", cbCert, pszOut);
+                                }
+                                else
+                                    RTMsgError("RTFileClose failed: %Rrc", rc);
+                            }
+                            else
+                                RTMsgError("RTFileWrite failed: %Rrc", rc);
+                            RTFileClose(hFile);
+                        }
+                        else
+                            RTMsgError("Error opening '%s': %Rrc", pszOut, rc);
+                    }
+                    else
+                        RTMsgError("Certificate not found.");
+                }
+                else
+                    RTMsgError("SignerInfo count: %u", pSd->SignerInfos.cItems);
+            }
+            else
+                RTMsgError("No PKCS7 content: ContentType=%s", Pkcs7Ci.ContentType.szObjId);
+            RTAsn1VtDelete(&Pkcs7Ci.SeqCore.Asn1Core);
+        }
+        else
+            RTMsgError("RTPkcs7ContentInfoDecodeAsn1 failed: %Rrc - %s", rc, s_StaticErrInfo.szMsg);
+    }
+    else
+        RTMsgError("RTLDRPROP_PKCS7_SIGNED_DATA failed on '%s': %Rrc", pszExe, rc);
+    RTMemFree(pvBuf);
+    rc = RTLdrClose(hLdrMod);
+    if (RT_FAILURE(rc))
+        rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "RTLdrClose failed: %Rrc\n", rc);
+    return rcExit;
+}
+
+#ifndef IPRT_IN_BUILD_TOOL
+
+/*
+ * The 'verify-exe' command.
+ */
+static RTEXITCODE HelpVerifyExe(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+    RTStrmPrintf(pStrm,
+                 "verify-exe [--verbose|--quiet] [--kernel] [--root <root-cert.der>] [--additional <supp-cert.der>]\n"
+                 "        [--type <win|osx>] <exe1> [exe2 [..]]\n");
+    return RTEXITCODE_SUCCESS;
+}
+
+typedef struct VERIFYEXESTATE
+{
+    RTCRSTORE   hRootStore;
+    RTCRSTORE   hKernelRootStore;
+    RTCRSTORE   hAdditionalStore;
+    bool        fKernel;
+    int         cVerbose;
+    enum { kSignType_Windows, kSignType_OSX } enmSignType;
+    uint64_t    uTimestamp;
+    RTLDRARCH   enmLdrArch;
+} VERIFYEXESTATE;
+
+#ifdef VBOX
+/** Certificate store load set.
+ * Declared outside HandleVerifyExe because of braindead gcc visibility crap. */
+struct STSTORESET
+{
+    RTCRSTORE       hStore;
+    PCSUPTAENTRY    paTAs;
+    unsigned        cTAs;
+};
+#endif
+
+/**
+ * @callback_method_impl{RTCRPKCS7VERIFYCERTCALLBACK,
+ * Standard code signing.  Use this for Microsoft SPC.}
+ */
+static DECLCALLBACK(int) VerifyExecCertVerifyCallback(PCRTCRX509CERTIFICATE pCert, RTCRX509CERTPATHS hCertPaths,
+                                                      void *pvUser, PRTERRINFO pErrInfo)
+{
+    VERIFYEXESTATE *pState = (VERIFYEXESTATE *)pvUser;
+    uint32_t        cPaths = hCertPaths != NIL_RTCRX509CERTPATHS ? RTCrX509CertPathsGetPathCount(hCertPaths) : 0;
+
+    /*
+     * Dump all the paths.
+     */
+    if (pState->cVerbose > 0)
+    {
+        for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+        {
+            RTPrintf("---\n");
+            RTCrX509CertPathsDumpOne(hCertPaths, iPath, pState->cVerbose, RTStrmDumpPrintfV, g_pStdOut);
+            *pErrInfo->pszMsg = '\0';
+        }
+        RTPrintf("---\n");
+    }
+
+    /*
+     * Test signing certificates normally doesn't have all the necessary
+     * features required below.  So, treat them as special cases.
+     */
+    if (   hCertPaths == NIL_RTCRX509CERTPATHS
+        && RTCrX509Name_Compare(&pCert->TbsCertificate.Issuer, &pCert->TbsCertificate.Subject) == 0)
+    {
+        RTMsgInfo("Test signed.\n");
+        return VINF_SUCCESS;
+    }
+
+    if (hCertPaths == NIL_RTCRX509CERTPATHS)
+        RTMsgInfo("Signed by trusted certificate.\n");
+
+    /*
+     * Standard code signing capabilites required.
+     */
+    int rc = RTCrPkcs7VerifyCertCallbackCodeSigning(pCert, hCertPaths, NULL, pErrInfo);
+    if (RT_SUCCESS(rc))
+    {
+        /*
+         * If kernel signing, a valid certificate path must be anchored by the
+         * microsoft kernel signing root certificate.  The only alternative is
+         * test signing.
+         */
+        if (pState->fKernel && hCertPaths != NIL_RTCRX509CERTPATHS)
+        {
+            uint32_t cFound = 0;
+            uint32_t cValid = 0;
+            for (uint32_t iPath = 0; iPath < cPaths; iPath++)
+            {
+                bool                            fTrusted;
+                PCRTCRX509NAME                  pSubject;
+                PCRTCRX509SUBJECTPUBLICKEYINFO  pPublicKeyInfo;
+                int                             rcVerify;
+                rc = RTCrX509CertPathsQueryPathInfo(hCertPaths, iPath, &fTrusted, NULL /*pcNodes*/, &pSubject, &pPublicKeyInfo,
+                                                    NULL, NULL /*pCertCtx*/, &rcVerify);
+                AssertRCBreak(rc);
+
+                if (RT_SUCCESS(rcVerify))
+                {
+                    Assert(fTrusted);
+                    cValid++;
+
+                    /* Search the kernel signing root store for a matching anchor. */
+                    RTCRSTORECERTSEARCH Search;
+                    rc = RTCrStoreCertFindBySubjectOrAltSubjectByRfc5280(pState->hKernelRootStore, pSubject, &Search);
+                    AssertRCBreak(rc);
+                    PCRTCRCERTCTX pCertCtx;
+                    while ((pCertCtx = RTCrStoreCertSearchNext(pState->hKernelRootStore, &Search)) != NULL)
+                    {
+                        if (RTCrX509SubjectPublicKeyInfo_Compare(&pCertCtx->pCert->TbsCertificate.SubjectPublicKeyInfo,
+                                                                 pPublicKeyInfo) == 0)
+                            cFound++;
+                        RTCrCertCtxRelease(pCertCtx);
+                    }
+
+                    int rc2 = RTCrStoreCertSearchDestroy(pState->hKernelRootStore, &Search); AssertRC(rc2);
+                }
+            }
+            if (RT_SUCCESS(rc) && cFound == 0)
+                rc = RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, "Not valid kernel code signature.");
+            if (RT_SUCCESS(rc) && cValid != 2)
+                RTMsgWarning("%u valid paths, expected 2", cValid);
+        }
+    }
+
+    return rc;
+}
+
+
+/** @callback_method_impl{FNRTLDRVALIDATESIGNEDDATA}  */
+static DECLCALLBACK(int) VerifyExeCallback(RTLDRMOD hLdrMod, RTLDRSIGNATURETYPE enmSignature,
+                                           void const *pvSignature, size_t cbSignature,
+                                           PRTERRINFO pErrInfo, void *pvUser)
+{
+    VERIFYEXESTATE *pState = (VERIFYEXESTATE *)pvUser;
+    switch (enmSignature)
+    {
+        case RTLDRSIGNATURETYPE_PKCS7_SIGNED_DATA:
+        {
+            PCRTCRPKCS7CONTENTINFO pContentInfo = (PCRTCRPKCS7CONTENTINFO)pvSignature;
+
+            RTTIMESPEC ValidationTime;
+            RTTimeSpecSetSeconds(&ValidationTime, pState->uTimestamp);
+
+            /*
+             * Dump the signed data if so requested.
+             */
+            if (pState->cVerbose)
+                RTAsn1Dump(&pContentInfo->SeqCore.Asn1Core, 0, 0, RTStrmDumpPrintfV, g_pStdOut);
+
+
+            /*
+             * Do the actual verification.  Will have to modify this so it takes
+             * the authenticode policies into account.
+             */
+            return RTCrPkcs7VerifySignedData(pContentInfo, 0, pState->hAdditionalStore, pState->hRootStore, &ValidationTime,
+                                             VerifyExecCertVerifyCallback, pState, pErrInfo);
+        }
+
+        default:
+            return RTErrInfoSetF(pErrInfo, VERR_NOT_SUPPORTED, "Unsupported signature type: %d", enmSignature);
+    }
+    return VINF_SUCCESS;
+}
+
+/** Worker for HandleVerifyExe. */
+static RTEXITCODE HandleVerifyExeWorker(VERIFYEXESTATE *pState, const char *pszFilename, PRTERRINFOSTATIC pStaticErrInfo)
+{
+    /*
+     * Open the executable image and verify it.
+     */
+    RTLDRMOD hLdrMod;
+    int rc = RTLdrOpen(pszFilename, RTLDR_O_FOR_VALIDATION, pState->enmLdrArch, &hLdrMod);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening executable image '%s': %Rrc", pszFilename, rc);
+
+
+    rc = RTLdrQueryProp(hLdrMod, RTLDRPROP_TIMESTAMP_SECONDS, &pState->uTimestamp, sizeof(pState->uTimestamp));
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTLdrVerifySignature(hLdrMod, VerifyExeCallback, pState, RTErrInfoInitStatic(pStaticErrInfo));
+        if (RT_SUCCESS(rc))
+            RTMsgInfo("'%s' is valid.\n", pszFilename);
+        else
+            RTMsgError("RTLdrVerifySignature failed on '%s': %Rrc - %s\n", pszFilename, rc, pStaticErrInfo->szMsg);
+    }
+    else
+        RTMsgError("RTLdrQueryProp/RTLDRPROP_TIMESTAMP_SECONDS failed on '%s': %Rrc\n", pszFilename, rc);
+
+    int rc2 = RTLdrClose(hLdrMod);
+    if (RT_FAILURE(rc2))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTLdrClose failed: %Rrc\n", rc2);
+    if (RT_FAILURE(rc))
+        return rc != VERR_LDRVI_NOT_SIGNED ? RTEXITCODE_FAILURE : RTEXITCODE_SKIPPED;
+
+    return RTEXITCODE_SUCCESS;
+}
+
+
+static RTEXITCODE HandleVerifyExe(int cArgs, char **papszArgs)
+{
+    RTERRINFOSTATIC StaticErrInfo;
+
+    /* Note! This code does not try to clean up the crypto stores on failure.
+             This is intentional as the code is only expected to be used in a
+             one-command-per-process environment where we do exit() upon
+             returning from this function. */
+
+    /*
+     * Parse arguments.
+     */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        { "--kernel",       'k', RTGETOPT_REQ_NOTHING },
+        { "--root",         'r', RTGETOPT_REQ_STRING },
+        { "--additional",   'a', RTGETOPT_REQ_STRING },
+        { "--add",          'a', RTGETOPT_REQ_STRING },
+        { "--type",         't', RTGETOPT_REQ_STRING },
+        { "--verbose",      'v', RTGETOPT_REQ_NOTHING },
+        { "--quiet",        'q', RTGETOPT_REQ_NOTHING },
+    };
+
+    VERIFYEXESTATE State =
+    {
+        NIL_RTCRSTORE, NIL_RTCRSTORE, NIL_RTCRSTORE, false, false,
+        VERIFYEXESTATE::kSignType_Windows, 0, RTLDRARCH_WHATEVER
+    };
+    int rc = RTCrStoreCreateInMem(&State.hRootStore, 0);
+    if (RT_SUCCESS(rc))
+        rc = RTCrStoreCreateInMem(&State.hKernelRootStore, 0);
+    if (RT_SUCCESS(rc))
+        rc = RTCrStoreCreateInMem(&State.hAdditionalStore, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error creating in-memory certificate store: %Rrc", rc);
+
+    RTGETOPTSTATE GetState;
+    rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    AssertRCReturn(rc, RTEXITCODE_FAILURE);
+    RTGETOPTUNION ValueUnion;
+    int ch;
+    while ((ch = RTGetOpt(&GetState, &ValueUnion)) && ch != VINF_GETOPT_NOT_OPTION)
+    {
+        switch (ch)
+        {
+            case 'r': case 'a':
+                rc = RTCrStoreCertAddFromFile(ch == 'r' ? State.hRootStore : State.hAdditionalStore,  0, ValueUnion.psz,
+                                              RTErrInfoInitStatic(&StaticErrInfo));
+                if (RT_FAILURE(rc))
+                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error loading certificate '%s': %Rrc - %s",
+                                          ValueUnion.psz, rc, StaticErrInfo.szMsg);
+                break;
+
+            case 't':
+                if (!strcmp(ValueUnion.psz, "win") || !strcmp(ValueUnion.psz, "windows"))
+                    State.enmSignType = VERIFYEXESTATE::kSignType_Windows;
+                else if (!strcmp(ValueUnion.psz, "osx") || !strcmp(ValueUnion.psz, "apple"))
+                    State.enmSignType = VERIFYEXESTATE::kSignType_OSX;
+                else
+                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown signing type: '%s'", ValueUnion.psz);
+                break;
+
+            case 'k': State.fKernel = true; break;
+            case 'v': State.cVerbose++; break;
+            case 'q': State.cVerbose = 0; break;
+            case 'V': return HandleVersion(cArgs, papszArgs);
+            case 'h': return HelpVerifyExe(g_pStdOut, RTSIGNTOOLHELP_FULL);
+            default:  return RTGetOptPrintError(ch, &ValueUnion);
+        }
+    }
+    if (ch != VINF_GETOPT_NOT_OPTION)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No executable given.");
+
+    /*
+     * Populate the certificate stores according to the signing type.
+     */
+#ifdef VBOX
+    unsigned          cSets = 0;
+    struct STSTORESET aSets[6];
+#endif
+
+    switch (State.enmSignType)
+    {
+        case VERIFYEXESTATE::kSignType_Windows:
+#ifdef VBOX
+            aSets[cSets].hStore  = State.hRootStore;
+            aSets[cSets].paTAs   = g_aSUPTimestampTAs;
+            aSets[cSets].cTAs    = g_cSUPTimestampTAs;
+            cSets++;
+            aSets[cSets].hStore  = State.hRootStore;
+            aSets[cSets].paTAs   = g_aSUPSpcRootTAs;
+            aSets[cSets].cTAs    = g_cSUPSpcRootTAs;
+            cSets++;
+            aSets[cSets].hStore  = State.hRootStore;
+            aSets[cSets].paTAs   = g_aSUPNtKernelRootTAs;
+            aSets[cSets].cTAs    = g_cSUPNtKernelRootTAs;
+            cSets++;
+            aSets[cSets].hStore  = State.hKernelRootStore;
+            aSets[cSets].paTAs   = g_aSUPNtKernelRootTAs;
+            aSets[cSets].cTAs    = g_cSUPNtKernelRootTAs;
+            cSets++;
+#endif
+            break;
+
+        case VERIFYEXESTATE::kSignType_OSX:
+            return RTMsgErrorExit(RTEXITCODE_FAILURE, "Mac OS X executable signing is not implemented.");
+    }
+
+#ifdef VBOX
+    for (unsigned i = 0; i < cSets; i++)
+        for (unsigned j = 0; j < aSets[i].cTAs; j++)
+        {
+            rc = RTCrStoreCertAddEncoded(aSets[i].hStore, RTCRCERTCTX_F_ENC_TAF_DER, aSets[i].paTAs[j].pch,
+                                         aSets[i].paTAs[j].cb, RTErrInfoInitStatic(&StaticErrInfo));
+            if (RT_FAILURE(rc))
+                return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTCrStoreCertAddEncoded failed (%u/%u): %s",
+                                      i, j, StaticErrInfo.szMsg);
+        }
+#endif
+
+    /*
+     * Do it.
+     */
+    RTEXITCODE rcExit;
+    for (;;)
+    {
+        rcExit = HandleVerifyExeWorker(&State, ValueUnion.psz, &StaticErrInfo);
+        if (rcExit != RTEXITCODE_SUCCESS)
+            break;
+
+        /*
+         * Next file
+         */
+        ch = RTGetOpt(&GetState, &ValueUnion);
+        if (ch == 0)
+            break;
+        if (ch != VINF_GETOPT_NOT_OPTION)
+        {
+            rcExit = RTGetOptPrintError(ch, &ValueUnion);
+            break;
+        }
+    }
+
+    /*
+     * Clean up.
+     */
+    uint32_t cRefs;
+    cRefs = RTCrStoreRelease(State.hRootStore);       Assert(cRefs == 0);
+    cRefs = RTCrStoreRelease(State.hKernelRootStore); Assert(cRefs == 0);
+    cRefs = RTCrStoreRelease(State.hAdditionalStore); Assert(cRefs == 0);
+
+    return rcExit;
+}
+
+#endif /* !IPRT_IN_BUILD_TOOL */
+
+/*
+ * The 'make-tainfo' command.
+ */
+static RTEXITCODE HelpMakeTaInfo(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+    RTStrmPrintf(pStrm,
+                 "make-tainfo [--verbose|--quiet] [--cert <cert.der>]  [-o|--output] <tainfo.der>\n");
+    return RTEXITCODE_SUCCESS;
+}
+
+
+typedef struct MAKETAINFOSTATE
+{
+    int         cVerbose;
+    const char *pszCert;
+    const char *pszOutput;
+} MAKETAINFOSTATE;
+
+
+/** @callback_method_impl{FNRTASN1ENCODEWRITER}  */
+static DECLCALLBACK(int) handleMakeTaInfoWriter(const void *pvBuf, size_t cbToWrite, void *pvUser, PRTERRINFO pErrInfo)
+{
+    return RTStrmWrite((PRTSTREAM)pvUser, pvBuf, cbToWrite);
+}
+
+
+static RTEXITCODE HandleMakeTaInfo(int cArgs, char **papszArgs)
+{
+    /*
+     * Parse arguments.
+     */
+    static const RTGETOPTDEF s_aOptions[] =
+    {
+        { "--cert",         'c', RTGETOPT_REQ_STRING },
+        { "--output",       'o', RTGETOPT_REQ_STRING },
+        { "--verbose",      'v', RTGETOPT_REQ_NOTHING },
+        { "--quiet",        'q', RTGETOPT_REQ_NOTHING },
+    };
+
+    RTLDRARCH       enmLdrArch = RTLDRARCH_WHATEVER;
+    MAKETAINFOSTATE State = { 0, NULL, NULL };
+
+    RTGETOPTSTATE GetState;
+    int rc = RTGetOptInit(&GetState, cArgs, papszArgs, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+    AssertRCReturn(rc, RTEXITCODE_FAILURE);
+    RTGETOPTUNION ValueUnion;
+    int ch;
+    while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
+    {
+        switch (ch)
+        {
+            case 'c':
+                if (State.pszCert)
+                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "The --cert option can only be used once.");
+                State.pszCert = ValueUnion.psz;
+                break;
+
+            case 'o':
+            case VINF_GETOPT_NOT_OPTION:
+                if (State.pszOutput)
+                    return RTMsgErrorExit(RTEXITCODE_FAILURE, "Multiple output files specified.");
+                State.pszOutput = ValueUnion.psz;
+                break;
+
+            case 'v': State.cVerbose++; break;
+            case 'q': State.cVerbose = 0; break;
+            case 'V': return HandleVersion(cArgs, papszArgs);
+            case 'h': return HelpMakeTaInfo(g_pStdOut, RTSIGNTOOLHELP_FULL);
+            default:  return RTGetOptPrintError(ch, &ValueUnion);
+        }
+    }
+    if (!State.pszCert)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No input certificate was specified.");
+    if (!State.pszOutput)
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "No output file was specified.");
+
+    /*
+     * Read the certificate.
+     */
+    RTERRINFOSTATIC         StaticErrInfo;
+    RTCRX509CERTIFICATE     Certificate;
+    rc = RTCrX509Certificate_ReadFromFile(&Certificate, State.pszCert, 0, &g_RTAsn1DefaultAllocator,
+                                          RTErrInfoInitStatic(&StaticErrInfo));
+    if (RT_FAILURE(rc))
+        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error reading certificate from %s: %Rrc - %s",
+                              State.pszCert, rc, StaticErrInfo.szMsg);
+    /*
+     * Construct the trust anchor information.
+     */
+    RTCRTAFTRUSTANCHORINFO TrustAnchor;
+    rc = RTCrTafTrustAnchorInfo_Init(&TrustAnchor, &g_RTAsn1DefaultAllocator);
+    if (RT_SUCCESS(rc))
+    {
+        /* Public key. */
+        Assert(RTCrX509SubjectPublicKeyInfo_IsPresent(&TrustAnchor.PubKey));
+        RTCrX509SubjectPublicKeyInfo_Delete(&TrustAnchor.PubKey);
+        rc = RTCrX509SubjectPublicKeyInfo_Clone(&TrustAnchor.PubKey, &Certificate.TbsCertificate.SubjectPublicKeyInfo,
+                                                &g_RTAsn1DefaultAllocator);
+        if (RT_FAILURE(rc))
+            RTMsgError("RTCrX509SubjectPublicKeyInfo_Clone failed: %Rrc", rc);
+        RTAsn1Core_ResetImplict(RTCrX509SubjectPublicKeyInfo_GetAsn1Core(&TrustAnchor.PubKey)); /* temporary hack. */
+
+        /* Key Identifier. */
+        PCRTASN1OCTETSTRING pKeyIdentifier = NULL;
+        if (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_SUBJECT_KEY_IDENTIFIER)
+            pKeyIdentifier = Certificate.TbsCertificate.T3.pSubjectKeyIdentifier;
+        else if (   (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_AUTHORITY_KEY_IDENTIFIER)
+                 && RTCrX509Certificate_IsSelfSigned(&Certificate)
+                 && RTAsn1OctetString_IsPresent(&Certificate.TbsCertificate.T3.pAuthorityKeyIdentifier->KeyIdentifier) )
+            pKeyIdentifier = &Certificate.TbsCertificate.T3.pAuthorityKeyIdentifier->KeyIdentifier;
+        else if (   (Certificate.TbsCertificate.T3.fFlags & RTCRX509TBSCERTIFICATE_F_PRESENT_OLD_AUTHORITY_KEY_IDENTIFIER)
+                 && RTCrX509Certificate_IsSelfSigned(&Certificate)
+                 && RTAsn1OctetString_IsPresent(&Certificate.TbsCertificate.T3.pOldAuthorityKeyIdentifier->KeyIdentifier) )
+            pKeyIdentifier = &Certificate.TbsCertificate.T3.pOldAuthorityKeyIdentifier->KeyIdentifier;
+        if (pKeyIdentifier && pKeyIdentifier->Asn1Core.cb > 0)
+        {
+            Assert(RTAsn1OctetString_IsPresent(&TrustAnchor.KeyIdentifier));
+            RTAsn1OctetString_Delete(&TrustAnchor.KeyIdentifier);
+            rc = RTAsn1OctetString_Clone(&TrustAnchor.KeyIdentifier, pKeyIdentifier, &g_RTAsn1DefaultAllocator);
+            if (RT_FAILURE(rc))
+                RTMsgError("RTAsn1OctetString_Clone failed: %Rrc", rc);
+            RTAsn1Core_ResetImplict(RTAsn1OctetString_GetAsn1Core(&TrustAnchor.KeyIdentifier)); /* temporary hack. */
+        }
+        else
+            RTMsgWarning("No key identifier found or has zero length.");
+
+        /* Subject */
+        if (RT_SUCCESS(rc))
+        {
+            Assert(!RTCrTafCertPathControls_IsPresent(&TrustAnchor.CertPath));
+            rc = RTCrTafCertPathControls_Init(&TrustAnchor.CertPath, &g_RTAsn1DefaultAllocator);
+            if (RT_SUCCESS(rc))
+            {
+                Assert(RTCrX509Name_IsPresent(&TrustAnchor.CertPath.TaName));
+                RTCrX509Name_Delete(&TrustAnchor.CertPath.TaName);
+                rc = RTCrX509Name_Clone(&TrustAnchor.CertPath.TaName, &Certificate.TbsCertificate.Subject,
+                                        &g_RTAsn1DefaultAllocator);
+                if (RT_SUCCESS(rc))
+                {
+                    RTAsn1Core_ResetImplict(RTCrX509Name_GetAsn1Core(&TrustAnchor.CertPath.TaName)); /* temporary hack. */
+                    rc = RTCrX509Name_RecodeAsUtf8(&TrustAnchor.CertPath.TaName, &g_RTAsn1DefaultAllocator);
+                    if (RT_FAILURE(rc))
+                        RTMsgError("RTCrX509Name_RecodeAsUtf8 failed: %Rrc", rc);
+                }
+                else
+                    RTMsgError("RTCrX509Name_Clone failed: %Rrc", rc);
+            }
+            else
+                RTMsgError("RTCrTafCertPathControls_Init failed: %Rrc", rc);
+        }
+
+        /* Check that what we've constructed makes some sense. */
+        if (RT_SUCCESS(rc))
+        {
+            rc = RTCrTafTrustAnchorInfo_CheckSanity(&TrustAnchor, 0, RTErrInfoInitStatic(&StaticErrInfo), "TAI");
+            if (RT_FAILURE(rc))
+                RTMsgError("RTCrTafTrustAnchorInfo_CheckSanity failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+        }
+
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Encode it and write it to the output file.
+             */
+            uint32_t cbEncoded;
+            rc = RTAsn1EncodePrepare(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), RTASN1ENCODE_F_DER, &cbEncoded,
+                                     RTErrInfoInitStatic(&StaticErrInfo));
+            if (RT_SUCCESS(rc))
+            {
+                if (State.cVerbose >= 1)
+                    RTAsn1Dump(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), 0, 0, RTStrmDumpPrintfV, g_pStdOut);
+
+                PRTSTREAM pStrm;
+                rc = RTStrmOpen(State.pszOutput, "wb", &pStrm);
+                if (RT_SUCCESS(rc))
+                {
+                    rc = RTAsn1EncodeWrite(RTCrTafTrustAnchorInfo_GetAsn1Core(&TrustAnchor), RTASN1ENCODE_F_DER,
+                                           handleMakeTaInfoWriter, pStrm, RTErrInfoInitStatic(&StaticErrInfo));
+                    if (RT_SUCCESS(rc))
+                    {
+                        rc = RTStrmClose(pStrm);
+                        if (RT_SUCCESS(rc))
+                            RTMsgInfo("Successfully wrote TrustedAnchorInfo to '%s'.", State.pszOutput);
+                        else
+                            RTMsgError("RTStrmClose failed: %Rrc");
+                    }
+                    else
+                    {
+                        RTMsgError("RTAsn1EncodeWrite failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+                        RTStrmClose(pStrm);
+                    }
+                }
+                else
+                    RTMsgError("Error opening '%s' for writing: %Rrcs", State.pszOutput, rc);
+            }
+            else
+                RTMsgError("RTAsn1EncodePrepare failed: %Rrc - %s", rc, StaticErrInfo.szMsg);
+        }
+
+        RTCrTafTrustAnchorInfo_Delete(&TrustAnchor);
+    }
+    else
+        RTMsgError("RTCrTafTrustAnchorInfo_Init failed: %Rrc", rc);
+
+    RTCrX509Certificate_Delete(&Certificate);
+    return RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+
+
+/*
+ * The 'version' command.
+ */
+static RTEXITCODE HelpVersion(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+    RTStrmPrintf(pStrm, "version\n");
+    return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleVersion(int cArgs, char **papszArgs)
+{
+    RTPrintf("%s\n", RTBldCfgVersion());
+    return RTEXITCODE_SUCCESS;
+}
+
+
+
+/**
+ * Command mapping.
+ */
+static struct
+{
+    /** The command. */
+    const char *pszCmd;
+    /**
+     * Handle the command.
+     * @returns Program exit code.
+     * @param   cArgs       Number of arguments.
+     * @param   papszArgs   The argument vector, starting with the command name.
+     */
+    RTEXITCODE (*pfnHandler)(int cArgs, char **papszArgs);
+    /**
+     * Produce help.
+     * @returns RTEXITCODE_SUCCESS to simplify handling '--help' in the handler.
+     * @param   pStrm       Where to send help text.
+     * @param   enmLevel    The level of the help information.
+     */
+    RTEXITCODE (*pfnHelp)(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel);
+}
+/** Mapping commands to handler and helper functions. */
+const g_aCommands[] =
+{
+    { "extract-exe-signer-cert",        HandleExtractExeSignerCert,         HelpExtractExeSignerCert },
+#ifndef IPRT_IN_BUILD_TOOL
+    { "verify-exe",                     HandleVerifyExe,                    HelpVerifyExe },
+#endif
+    { "make-tainfo",                    HandleMakeTaInfo,                   HelpMakeTaInfo },
+    { "help",                           HandleHelp,                         HelpHelp },
+    { "--help",                         HandleHelp,                         NULL },
+    { "-h",                             HandleHelp,                         NULL },
+    { "version",                        HandleVersion,                      HelpVersion },
+    { "--version",                      HandleVersion,                      NULL },
+    { "-V",                             HandleVersion,                      NULL },
+};
+
+
+/*
+ * The 'help' command.
+ */
+static RTEXITCODE HelpHelp(PRTSTREAM pStrm, RTSIGNTOOLHELP enmLevel)
+{
+    RTStrmPrintf(pStrm, "help [cmd-patterns]\n");
+    return RTEXITCODE_SUCCESS;
+}
+
+static RTEXITCODE HandleHelp(int cArgs, char **papszArgs)
+{
+    RTSIGNTOOLHELP  enmLevel = cArgs <= 1 ? RTSIGNTOOLHELP_USAGE : RTSIGNTOOLHELP_FULL;
+    uint32_t        cShowed  = 0;
+    for (uint32_t iCmd = 0; iCmd < RT_ELEMENTS(g_aCommands); iCmd++)
+    {
+        if (g_aCommands[iCmd].pfnHelp)
+        {
+            bool fShow;
+            if (cArgs <= 1)
+                fShow = true;
+            else
+            {
+                for (int iArg = 1; iArg < cArgs; iArg++)
+                    if (RTStrSimplePatternMultiMatch(papszArgs[iArg], RTSTR_MAX, g_aCommands[iCmd].pszCmd, RTSTR_MAX, NULL))
+                    {
+                        fShow = true;
+                        break;
+                    }
+            }
+            if (fShow)
+            {
+                g_aCommands[iCmd].pfnHelp(g_pStdOut, enmLevel);
+                cShowed++;
+            }
+        }
+    }
+    return cShowed ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
+}
+
+
+
+int main(int argc, char **argv)
+{
+    int rc = RTR3InitExe(argc, &argv, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgInitFailure(rc);
+
+    /*
+     * Parse global arguments.
+     */
+    int iArg = 1;
+    /* none presently. */
+
+    /*
+     * Command dispatcher.
+     */
+    if (iArg < argc)
+    {
+        const char *pszCmd = argv[iArg];
+        uint32_t i = RT_ELEMENTS(g_aCommands);
+        while (i-- > 0)
+            if (!strcmp(g_aCommands[i].pszCmd, pszCmd))
+                return g_aCommands[i].pfnHandler(argc - iArg, &argv[iArg]);
+        RTMsgError("Unknown command '%s'.", pszCmd);
+    }
+    else
+        RTMsgError("No command given. (try --help)");
+
+    return RTEXITCODE_SYNTAX;
+}
+
+
diff --git a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp b/src/VBox/Runtime/tools/RTUnzip.cpp
similarity index 71%
copy from src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
copy to src/VBox/Runtime/tools/RTUnzip.cpp
index 35b6d89..b420246 100644
--- a/src/VBox/HostDrivers/Support/testcase/SUPInstall.cpp
+++ b/src/VBox/Runtime/tools/RTUnzip.cpp
@@ -1,10 +1,10 @@
-/* $Id: SUPInstall.cpp $ */
+/* $Id: RTUnzip.cpp $ */
 /** @file
- * SUPInstall - Driver Install
+ * IPRT - TAR Utility.
  */
 
 /*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2010-2011 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -28,25 +28,17 @@
 /*******************************************************************************
 *   Header Files                                                               *
 *******************************************************************************/
-#include <VBox/sup.h>
-#include <VBox/err.h>
+#include <iprt/zip.h>
+#include <iprt/err.h>
 #include <iprt/initterm.h>
 #include <iprt/message.h>
 
 
 int main(int argc, char **argv)
 {
-    RTR3InitExeNoArguments(0);
-    if (argc != 1)
-        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "This utility takes no arguments");
-    NOREF(argv);
-
-    int rc = SUPR3Install();
-    if (RT_SUCCESS(rc))
-    {
-        RTMsgInfo("installed successfully");
-        return RTEXITCODE_SUCCESS;
-    }
-    return RTMsgErrorExit(RTEXITCODE_FAILURE, "installation failed. rc=%Rrc", rc);
+    int rc = RTR3InitExe(argc, &argv, 0);
+    if (RT_FAILURE(rc))
+        return RTMsgInitFailure(rc);
+    return RTZipUnzipCmd(argc, argv);
 }
 
diff --git a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
index 347d185..85abca5 100644
--- a/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
+++ b/src/VBox/Runtime/win/RTErrConvertFromWin32.cpp
@@ -411,6 +411,7 @@ RTR3DECL(int)  RTErrConvertFromWin32(unsigned uNativeCode)
 #endif
         case ERROR_NOT_A_REPARSE_POINT: return VERR_NOT_SYMLINK;
 
+        case NTE_BAD_ALGID:         return VERR_CR_PKIX_UNKNOWN_DIGEST_TYPE;
     }
 
     /* unknown error. */
diff --git a/src/VBox/Runtime/win/errmsgwin.cpp b/src/VBox/Runtime/win/errmsgwin.cpp
index 0f5c544..ee85d13 100644
--- a/src/VBox/Runtime/win/errmsgwin.cpp
+++ b/src/VBox/Runtime/win/errmsgwin.cpp
@@ -43,9 +43,13 @@
  */
 static const RTWINERRMSG  g_aStatusMsgs[] =
 {
-#include "errmsgcomdata.h"
-#if defined(VBOX) && !defined(IN_GUEST)
-# include "errmsgvboxcomdata.h"
+#ifndef IPRT_NO_ERROR_DATA
+# include "errmsgcomdata.h"
+# if defined(VBOX) && !defined(IN_GUEST)
+#  include "errmsgvboxcomdata.h"
+# endif
+#else
+    { "Success.", "ERROR_SUCCESS", 0 },
 #endif
     { NULL, NULL, 0 }
 };
@@ -76,7 +80,7 @@ static volatile uint32_t    g_iUnknownMsgs;
 RTDECL(PCRTWINERRMSG) RTErrWinGet(long rc)
 {
     unsigned i;
-    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1U; i++)
         if (g_aStatusMsgs[i].iCode == rc)
             return &g_aStatusMsgs[i];
 
@@ -85,7 +89,7 @@ RTDECL(PCRTWINERRMSG) RTErrWinGet(long rc)
      * was no exact match. Try to find a non-exact match, and include the
      * actual value in case we pick the wrong entry. Better than always using
      * the "Unknown Status" case. */
-    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs); i++)
+    for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1U; i++)
         if (g_aStatusMsgs[i].iCode == HRESULT_CODE(rc))
         {
             int32_t iMsg = (ASMAtomicIncU32(&g_iUnknownMsgs) - 1) % RT_ELEMENTS(g_aUnknownMsgs);
diff --git a/src/VBox/Storage/DMG.cpp b/src/VBox/Storage/DMG.cpp
index b5f22f0..cb3fdd5 100644
--- a/src/VBox/Storage/DMG.cpp
+++ b/src/VBox/Storage/DMG.cpp
@@ -34,6 +34,7 @@
 #include <iprt/zip.h>
 #include <iprt/formats/xar.h>
 
+#include "VDBackends.h"
 
 /*******************************************************************************
 *   Structures and Typedefs                                                    *
@@ -2470,7 +2471,7 @@ static DECLCALLBACK(void) dmgDump(void *pBackendData)
 }
 
 
-VBOXHDDBACKEND g_DmgBackend =
+const VBOXHDDBACKEND g_DmgBackend =
 {
     /* pszBackendName */
     "DMG",
@@ -2482,8 +2483,6 @@ VBOXHDDBACKEND g_DmgBackend =
     s_aDmgFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     dmgCheckIfValid,
     /* pfnOpen */
@@ -2565,6 +2564,8 @@ VBOXHDDBACKEND g_DmgBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
 
diff --git a/src/VBox/Storage/ISCSI.cpp b/src/VBox/Storage/ISCSI.cpp
index 2ed7f4f..4fc4dff 100644
--- a/src/VBox/Storage/ISCSI.cpp
+++ b/src/VBox/Storage/ISCSI.cpp
@@ -36,6 +36,7 @@
 #include <iprt/time.h>
 #include <VBox/scsi.h>
 
+#include "VDBackends.h"
 
 /*******************************************************************************
 *   Defined Constants And Macros                                               *
@@ -3783,7 +3784,7 @@ static int iscsiOpenImage(PISCSIIMAGE pImage, unsigned uOpenFlags)
     pImage->pIfNet = VDIfTcpNetGet(pImage->pVDIfsImage);
     if (!pImage->pIfNet)
     {
-        rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_INTERFACE,
+        rc = vdIfError(pImage->pIfError, VERR_VD_UNKNOWN_INTERFACE,
                        RT_SRC_POS, N_("iSCSI: TCP network stack interface missing"));
         goto out;
     }
@@ -3792,7 +3793,7 @@ static int iscsiOpenImage(PISCSIIMAGE pImage, unsigned uOpenFlags)
     pImage->pIfConfig = VDIfConfigGet(pImage->pVDIfsImage);
     if (!pImage->pIfConfig)
     {
-        rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_INTERFACE,
+        rc = vdIfError(pImage->pIfError, VERR_VD_UNKNOWN_INTERFACE,
                        RT_SRC_POS, N_("iSCSI: configuration interface missing"));
         goto out;
     }
@@ -3801,7 +3802,7 @@ static int iscsiOpenImage(PISCSIIMAGE pImage, unsigned uOpenFlags)
     pImage->pIfIo = VDIfIoIntGet(pImage->pVDIfsImage);
     if (!pImage->pIfIo)
     {
-        rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_INTERFACE,
+        rc = vdIfError(pImage->pIfError, VERR_VD_UNKNOWN_INTERFACE,
                        RT_SRC_POS, N_("iSCSI: I/O interface missing"));
         goto out;
     }
@@ -3842,7 +3843,7 @@ static int iscsiOpenImage(PISCSIIMAGE pImage, unsigned uOpenFlags)
                            "Timeout\0"
                            "HostIPStack\0"))
     {
-        rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_CFG_VALUES, RT_SRC_POS, N_("iSCSI: configuration error: unknown configuration keys present"));
+        rc = vdIfError(pImage->pIfError, VERR_VD_UNKNOWN_CFG_VALUES, RT_SRC_POS, N_("iSCSI: configuration error: unknown configuration keys present"));
         goto out;
     }
 
@@ -5389,7 +5390,7 @@ static int iscsiComposeName(PVDINTERFACE pConfig, char **pszName)
 }
 
 
-VBOXHDDBACKEND g_ISCSIBackend =
+const VBOXHDDBACKEND g_ISCSIBackend =
 {
     /* pszBackendName */
     "iSCSI",
@@ -5401,8 +5402,6 @@ VBOXHDDBACKEND g_ISCSIBackend =
     NULL,
     /* paConfigInfo */
     s_iscsiConfigInfo,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     iscsiCheckIfValid,
     /* pfnOpen */
@@ -5484,5 +5483,7 @@ VBOXHDDBACKEND g_ISCSIBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/Makefile.kmk b/src/VBox/Storage/Makefile.kmk
index 825482d..56ea233 100644
--- a/src/VBox/Storage/Makefile.kmk
+++ b/src/VBox/Storage/Makefile.kmk
@@ -20,21 +20,22 @@ include $(KBUILD_PATH)/subheader.kmk
 
 VBOX_PATH_STORAGE_SRC := $(PATH_SUB_CURRENT)
 
-include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
-include $(PATH_SUB_CURRENT)/Debug/Makefile.kmk
+if !defined(VBOX_ONLY_EXTPACKS)
+ include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
+ include $(PATH_SUB_CURRENT)/Debug/Makefile.kmk
 
-ifndef VBOX_OSE
- include $(PATH_SUB_CURRENT)/VDFormats/Makefile.kmk
-endif
+ ifndef VBOX_OSE
+  include $(PATH_SUB_CURRENT)/VDFormats/Makefile.kmk
+ endif
 
-#
-# StorageLib - The storage Library.
-#
-LIBRARIES += StorageLib #StorageLibNoDB
+ #
+ # StorageLib - The storage Library.
+ #
+ LIBRARIES += StorageLib #StorageLibNoDB
 
-StorageLib_TEMPLATE = VBOXR3
-StorageLib_DEFS     = IN_VBOXDDU
-StorageLib_SOURCES  = \
+ StorageLib_TEMPLATE = VBOXR3
+ StorageLib_DEFS     = IN_VBOXDDU
+ StorageLib_SOURCES  = \
 	VD.cpp \
 	VDVfs.cpp \
 	VDIfVfs.cpp \
@@ -49,6 +50,18 @@ StorageLib_SOURCES  = \
 	QCOW.cpp \
 	VHDX.cpp \
 	VCICache.cpp
+endif
+
+if defined(VBOX_WITH_EXTPACK_PUEL) && defined(VBOX_WITH_EXTPACK_PUEL_BUILD)
+ if defined(VBOX_WITH_PLUGIN_CRYPT)
+  DLLS += VDPluginCrypt
+  VDPluginCrypt_TEMPLATE      = VBoxR3ExtPackPuel
+  VDPluginCrypt_SDKS          = VBoxOpenSslExtPack
+  VDPluginCrypt_LDFLAGS.linux = -Wl,--no-undefined
+
+  VDPluginCrypt_SOURCES  = VDFilterCrypt.cpp
+ endif
+endif # VBOX_WITH_EXTPACK_PUEL
 
 #StorageLibNoDB_TEMPLATE = VBOXR3
 #StorageLibNoDB_DEFS     = IN_VBOXDDU VBOX_HDD_NO_DYNAMIC_BACKENDS
diff --git a/src/VBox/Storage/Parallels.cpp b/src/VBox/Storage/Parallels.cpp
index 622fb83..5fac5d5 100644
--- a/src/VBox/Storage/Parallels.cpp
+++ b/src/VBox/Storage/Parallels.cpp
@@ -28,6 +28,8 @@
 #include <iprt/string.h>
 #include <iprt/asm.h>
 
+#include "VDBackends.h"
+
 #define PARALLELS_HEADER_MAGIC "WithoutFreeSpace"
 #define PARALLELS_DISK_VERSION 2
 
@@ -1202,7 +1204,7 @@ static void parallelsDump(void *pBackendData)
 
 
 
-VBOXHDDBACKEND g_ParallelsBackend =
+const VBOXHDDBACKEND g_ParallelsBackend =
 {
     /* pszBackendName */
     "Parallels",
@@ -1214,8 +1216,6 @@ VBOXHDDBACKEND g_ParallelsBackend =
     s_aParallelsFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     parallelsCheckIfValid,
     /* pfnOpen */
@@ -1297,5 +1297,7 @@ VBOXHDDBACKEND g_ParallelsBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/QCOW.cpp b/src/VBox/Storage/QCOW.cpp
index c90d155..f2f9b09 100644
--- a/src/VBox/Storage/QCOW.cpp
+++ b/src/VBox/Storage/QCOW.cpp
@@ -30,6 +30,8 @@
 #include <iprt/path.h>
 #include <iprt/list.h>
 
+#include "VDBackends.h"
+
 /**
  * The QCOW backend implements support for the qemu copy on write format (short QCOW)
  * There is no official specification available but the format is described
@@ -1031,6 +1033,9 @@ static int qcowOpenImage(PQCOWIMAGE pImage, unsigned uOpenFlags)
     pImage->pIfIo = VDIfIoIntGet(pImage->pVDIfsImage);
     AssertPtrReturn(pImage->pIfIo, VERR_INVALID_PARAMETER);
 
+    rc = qcowL2TblCacheCreate(pImage);
+    AssertRC(rc);
+
     /*
      * Open the image.
      */
@@ -1059,9 +1064,6 @@ static int qcowOpenImage(PQCOWIMAGE pImage, unsigned uOpenFlags)
             pImage->offNextCluster = RT_ALIGN_64(cbFile, 512); /* Align image to sector boundary. */
             Assert(pImage->offNextCluster >= cbFile);
 
-            rc = qcowL2TblCacheCreate(pImage);
-            AssertRC(rc);
-
             if (Header.u32Version == 1)
             {
                 if (!Header.Version.v1.u32CryptMethod)
@@ -2459,7 +2461,7 @@ static int qcowSetParentFilename(void *pBackendData, const char *pszParentFilena
 
 
 
-VBOXHDDBACKEND g_QCowBackend =
+const VBOXHDDBACKEND g_QCowBackend =
 {
     /* pszBackendName */
     "QCOW",
@@ -2471,8 +2473,6 @@ VBOXHDDBACKEND g_QCowBackend =
     s_aQCowFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     qcowCheckIfValid,
     /* pfnOpen */
@@ -2554,5 +2554,7 @@ VBOXHDDBACKEND g_QCowBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/QED.cpp b/src/VBox/Storage/QED.cpp
index 681a8a5..32dbfbb 100644
--- a/src/VBox/Storage/QED.cpp
+++ b/src/VBox/Storage/QED.cpp
@@ -4,7 +4,7 @@
  */
 
 /*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2014 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
  * available from http://www.virtualbox.org. This file is free software;
@@ -30,6 +30,8 @@
 #include <iprt/path.h>
 #include <iprt/list.h>
 
+#include "VDBackends.h"
+
 /**
  * The QED backend implements support for the qemu enhanced disk format (short QED)
  * The specification for the format is available under http://wiki.qemu.org/Features/QED/Specification
@@ -1178,6 +1180,20 @@ static int qedOpenImage(PQEDIMAGE pImage, unsigned uOpenFlags)
     AssertPtrReturn(pImage->pIfIo, VERR_INVALID_PARAMETER);
 
     /*
+     * Create the L2 cache before opening the image so we can call qedFreeImage()
+     * even if opening the image file fails.
+     */
+    rc = qedL2TblCacheCreate(pImage);
+    if (RT_FAILURE(rc))
+    {
+        rc = vdIfError(pImage->pIfError, rc, RT_SRC_POS,
+                       N_("Qed: Creating the L2 table cache for image '%s' failed"),
+                       pImage->pszFilename);
+
+        goto out;
+    }
+
+    /*
      * Open the image.
      */
     rc = vdIfIoIntFileOpen(pImage->pIfIo, pImage->pszFilename,
@@ -1254,17 +1270,10 @@ static int qedOpenImage(PQEDIMAGE pImage, unsigned uOpenFlags)
                         if (RT_SUCCESS(rc))
                         {
                             qedTableConvertToHostEndianess(pImage->paL1Table, pImage->cTableEntries);
-                            rc = qedL2TblCacheCreate(pImage);
-                            if (RT_SUCCESS(rc))
-                            {
-                                /* If the consistency check succeeded, clear the flag by flushing the image. */
-                                if (Header.u64FeatureFlags & QED_FEATURE_NEED_CHECK)
-                                    rc = qedFlushImage(pImage);
-                            }
-                            else
-                                rc = vdIfError(pImage->pIfError, rc, RT_SRC_POS,
-                                               N_("Qed: Creating the L2 table cache for image '%s' failed"),
-                                               pImage->pszFilename);
+
+                            /* If the consistency check succeeded, clear the flag by flushing the image. */
+                            if (Header.u64FeatureFlags & QED_FEATURE_NEED_CHECK)
+                                rc = qedFlushImage(pImage);
                         }
                         else
                             rc = vdIfError(pImage->pIfError, rc, RT_SRC_POS,
@@ -2597,7 +2606,7 @@ static int qedResize(void *pBackendData, uint64_t cbSize,
 }
 
 
-VBOXHDDBACKEND g_QedBackend =
+const VBOXHDDBACKEND g_QedBackend =
 {
     /* pszBackendName */
     "QED",
@@ -2609,8 +2618,6 @@ VBOXHDDBACKEND g_QedBackend =
     s_aQedFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     qedCheckIfValid,
     /* pfnOpen */
@@ -2692,5 +2699,7 @@ VBOXHDDBACKEND g_QedBackend =
     /* pfnResize */
     qedResize,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/RAW.cpp b/src/VBox/Storage/RAW.cpp
index 705dc5e..8fcefe0 100644
--- a/src/VBox/Storage/RAW.cpp
+++ b/src/VBox/Storage/RAW.cpp
@@ -27,6 +27,8 @@
 #include <iprt/alloc.h>
 #include <iprt/path.h>
 
+#include "VDBackends.h"
+
 /*******************************************************************************
 *   Constants And Macros, Structures and Typedefs                              *
 *******************************************************************************/
@@ -1126,7 +1128,7 @@ static void rawDump(void *pBackendData)
 
 
 
-VBOXHDDBACKEND g_RawBackend =
+const VBOXHDDBACKEND g_RawBackend =
 {
     /* pszBackendName */
     "RAW",
@@ -1138,8 +1140,6 @@ VBOXHDDBACKEND g_RawBackend =
     s_aRawFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     rawCheckIfValid,
     /* pfnOpen */
@@ -1221,5 +1221,7 @@ VBOXHDDBACKEND g_RawBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/VCICache.cpp b/src/VBox/Storage/VCICache.cpp
index 393aab1..1c58c75 100644
--- a/src/VBox/Storage/VCICache.cpp
+++ b/src/VBox/Storage/VCICache.cpp
@@ -19,7 +19,7 @@
 *   Header Files                                                               *
 *******************************************************************************/
 #define LOG_GROUP LOG_GROUP_VD_RAW /** @todo logging group */
-#include <VBox/vd-cache-plugin.h>
+#include <VBox/vd-cache-backend.h>
 #include <VBox/err.h>
 
 #include <VBox/log.h>
@@ -28,6 +28,8 @@
 #include <iprt/file.h>
 #include <iprt/asm.h>
 
+#include "VDBackends.h"
+
 /*******************************************************************************
 * On disk data structures                                                      *
 *******************************************************************************/
@@ -1956,7 +1958,7 @@ static void vciDump(void *pBackendData)
 }
 
 
-VDCACHEBACKEND g_VciCacheBackend =
+const VDCACHEBACKEND g_VciCacheBackend =
 {
     /* pszBackendName */
     "vci",
@@ -1968,8 +1970,6 @@ VDCACHEBACKEND g_VciCacheBackend =
     s_apszVciFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnProbe */
     vciProbe,
     /* pfnOpen */
diff --git a/src/VBox/Storage/VD.cpp b/src/VBox/Storage/VD.cpp
index 5632e13..a4ded39 100644
--- a/src/VBox/Storage/VD.cpp
+++ b/src/VBox/Storage/VD.cpp
@@ -41,7 +41,8 @@
 #include <iprt/semaphore.h>
 
 #include <VBox/vd-plugin.h>
-#include <VBox/vd-cache-plugin.h>
+
+#include "VDBackends.h"
 
 /** Disable dynamic backends on non x86 architectures. This feature
  * requires the SUPR3 library which is not available there.
@@ -192,6 +193,27 @@ typedef struct VDDISCARDSTATE
 } VDDISCARDSTATE, *PVDDISCARDSTATE;
 
 /**
+ * VD filter instance.
+ */
+typedef struct VDFILTER
+{
+    /** Pointer to the previous filter. */
+    struct VDFILTER   *pPrev;
+    /** Pointer to the next filter. */
+    struct VDFILTER   *pNext;
+    /** Opaque VD filter backend instance data. */
+    void              *pvBackendData;
+    /** Pointer to the filter backend interface. */
+    PCVDFILTERBACKEND  pBackend;
+    /** Pointer to list of VD interfaces, per-filter. */
+    PVDINTERFACE        pVDIfsFilter;
+    /** I/O related things. */
+    VDIO                VDIo;
+} VDFILTER;
+/** Pointer to a VD filter instance. */
+typedef VDFILTER *PVDFILTER;
+
+/**
  * VBox HDD Container main structure, private part.
  */
 struct VBOXHDD
@@ -255,12 +277,23 @@ struct VBOXHDD
      * Other flush or growing write requests need to wait until
      * the current one completes. - NIL_VDIOCTX if unlocked. */
     volatile PVDIOCTX      pIoCtxLockOwner;
+    /** If the disk was locked by a growing write, flush or discard request this
+     * contains the start offset to check for interfering I/O while it is in progress. */
+    uint64_t               uOffsetStartLocked;
+    /** If the disk was locked by a growing write, flush or discard request this contains
+     * the first non affected offset to check for interfering I/O while it is in progress. */
+    uint64_t               uOffsetEndLocked;
 
     /** Pointer to the L2 disk cache if any. */
     PVDCACHE               pCache;
     /** Pointer to the discard state if any. */
     PVDDISCARDSTATE        pDiscard;
 
+     /** Pointer to the first filter in the chain. */
+     PVDFILTER              pFilterHead;
+     /** Pointer to the last filter in the chain. */
+     PVDFILTER              pFilterTail;
+
     /** Event semaphore for synchronous I/O. */
     RTSEMEVENT             hEventSemSyncIo;
     /** Status code of the last synchronous I/O request. */
@@ -360,6 +393,10 @@ typedef struct VDIOCTX
             unsigned             cImagesRead;
             /** Override for the parent image to start reading from. */
             PVDIMAGE             pImageParentOverride;
+            /** Original offset of the transfer - required for filtering read requests. */
+            uint64_t             uOffsetXferOrig;
+            /** Original size of the transfer - required for fitlering read requests. */
+            size_t               cbXferOrig;
         } Io;
         /** Discard requests. */
         struct
@@ -447,8 +484,13 @@ typedef struct VDIOCTX
 /** Don't free the I/O context when complete because
  * it was alloacted elsewhere (stack, ...). */
 #define VDIOCTX_FLAGS_DONT_FREE              RT_BIT_32(4)
-/* Don't set the modified flag for this I/O context when writing. */
+/** Don't set the modified flag for this I/O context when writing. */
 #define VDIOCTX_FLAGS_DONT_SET_MODIFIED_FLAG RT_BIT_32(5)
+/** The write filter was applied already and shouldn't be applied a second time.
+ * Used at the beginning of vdWriteHelperAsync() because it might be called
+ * multiple times.
+ */
+#define VDIOCTX_FLAGS_WRITE_FILTER_APPLIED   RT_BIT_32(6)
 
 /** NIL I/O context pointer value. */
 #define NIL_VDIOCTX ((PVDIOCTX)0)
@@ -556,20 +598,30 @@ typedef struct VDMETAXFER
 #define VDMETAXFER_TXDIR_GET(flags)      ((flags) & VDMETAXFER_TXDIR_MASK)
 #define VDMETAXFER_TXDIR_SET(flags, dir) ((flags) = (flags & ~VDMETAXFER_TXDIR_MASK) | (dir))
 
-extern VBOXHDDBACKEND g_RawBackend;
-extern VBOXHDDBACKEND g_VmdkBackend;
-extern VBOXHDDBACKEND g_VDIBackend;
-extern VBOXHDDBACKEND g_VhdBackend;
-extern VBOXHDDBACKEND g_ParallelsBackend;
-extern VBOXHDDBACKEND g_DmgBackend;
-extern VBOXHDDBACKEND g_ISCSIBackend;
-extern VBOXHDDBACKEND g_QedBackend;
-extern VBOXHDDBACKEND g_QCowBackend;
-extern VBOXHDDBACKEND g_VhdxBackend;
+/**
+ * Plugin structure.
+ */
+typedef struct VDPLUGIN
+{
+    /** Pointer to the next plugin structure. */
+    RTLISTNODE NodePlugin;
+    /** Handle of loaded plugin library. */
+    RTLDRMOD   hPlugin;
+    /** Filename of the loaded plugin. */
+    char       *pszFilename;
+} VDPLUGIN;
+/** Pointer to a plugin structure. */
+typedef VDPLUGIN *PVDPLUGIN;
+
+/** Head of loaded plugin list. */
+static RTLISTANCHOR g_ListPluginsLoaded;
 
+/** Number of image backends supported. */
 static unsigned g_cBackends = 0;
-static PVBOXHDDBACKEND *g_apBackends = NULL;
-static PVBOXHDDBACKEND aStaticBackends[] =
+/** Array of pointers to the image backends. */
+static PCVBOXHDDBACKEND *g_apBackends = NULL;
+/** Builtin image backends. */
+static PCVBOXHDDBACKEND aStaticBackends[] =
 {
     &g_VmdkBackend,
     &g_VDIBackend,
@@ -583,18 +635,21 @@ static PVBOXHDDBACKEND aStaticBackends[] =
     &g_ISCSIBackend
 };
 
-/**
- * Supported backends for the disk cache.
- */
-extern VDCACHEBACKEND g_VciCacheBackend;
-
+/** Number of supported cache backends. */
 static unsigned g_cCacheBackends = 0;
-static PVDCACHEBACKEND *g_apCacheBackends = NULL;
-static PVDCACHEBACKEND aStaticCacheBackends[] =
+/** Array of pointers to the cache backends. */
+static PCVDCACHEBACKEND *g_apCacheBackends = NULL;
+/** Builtin cache backends. */
+static PCVDCACHEBACKEND aStaticCacheBackends[] =
 {
     &g_VciCacheBackend
 };
 
+/** Number of supported filter backends. */
+static unsigned g_cFilterBackends = 0;
+/** Array of pointers to the filters backends. */
+static PCVDFILTERBACKEND *g_apFilterBackends = NULL;
+
 /** Forward declaration of the async discard helper. */
 static int vdDiscardHelperAsync(PVDIOCTX pIoCtx);
 static int vdWriteHelperAsync(PVDIOCTX pIoCtx);
@@ -605,14 +660,14 @@ static DECLCALLBACK(void) vdIoCtxSyncComplete(void *pvUser1, void *pvUser2, int
 /**
  * internal: add several backends.
  */
-static int vdAddBackends(PVBOXHDDBACKEND *ppBackends, unsigned cBackends)
+static int vdAddBackends(PCVBOXHDDBACKEND *ppBackends, unsigned cBackends)
 {
-    PVBOXHDDBACKEND *pTmp = (PVBOXHDDBACKEND*)RTMemRealloc(g_apBackends,
-           (g_cBackends + cBackends) * sizeof(PVBOXHDDBACKEND));
+    PCVBOXHDDBACKEND *pTmp = (PCVBOXHDDBACKEND*)RTMemRealloc(g_apBackends,
+           (g_cBackends + cBackends) * sizeof(PCVBOXHDDBACKEND));
     if (RT_UNLIKELY(!pTmp))
         return VERR_NO_MEMORY;
     g_apBackends = pTmp;
-    memcpy(&g_apBackends[g_cBackends], ppBackends, cBackends * sizeof(PVBOXHDDBACKEND));
+    memcpy(&g_apBackends[g_cBackends], ppBackends, cBackends * sizeof(PCVBOXHDDBACKEND));
     g_cBackends += cBackends;
     return VINF_SUCCESS;
 }
@@ -620,7 +675,7 @@ static int vdAddBackends(PVBOXHDDBACKEND *ppBackends, unsigned cBackends)
 /**
  * internal: add single backend.
  */
-DECLINLINE(int) vdAddBackend(PVBOXHDDBACKEND pBackend)
+DECLINLINE(int) vdAddBackend(PCVBOXHDDBACKEND pBackend)
 {
     return vdAddBackends(&pBackend, 1);
 }
@@ -628,14 +683,14 @@ DECLINLINE(int) vdAddBackend(PVBOXHDDBACKEND pBackend)
 /**
  * internal: add several cache backends.
  */
-static int vdAddCacheBackends(PVDCACHEBACKEND *ppBackends, unsigned cBackends)
+static int vdAddCacheBackends(PCVDCACHEBACKEND *ppBackends, unsigned cBackends)
 {
-    PVDCACHEBACKEND *pTmp = (PVDCACHEBACKEND*)RTMemRealloc(g_apCacheBackends,
-           (g_cCacheBackends + cBackends) * sizeof(PVDCACHEBACKEND));
+    PCVDCACHEBACKEND *pTmp = (PCVDCACHEBACKEND*)RTMemRealloc(g_apCacheBackends,
+           (g_cCacheBackends + cBackends) * sizeof(PCVDCACHEBACKEND));
     if (RT_UNLIKELY(!pTmp))
         return VERR_NO_MEMORY;
     g_apCacheBackends = pTmp;
-    memcpy(&g_apCacheBackends[g_cCacheBackends], ppBackends, cBackends * sizeof(PVDCACHEBACKEND));
+    memcpy(&g_apCacheBackends[g_cCacheBackends], ppBackends, cBackends * sizeof(PCVDCACHEBACKEND));
     g_cCacheBackends += cBackends;
     return VINF_SUCCESS;
 }
@@ -643,12 +698,42 @@ static int vdAddCacheBackends(PVDCACHEBACKEND *ppBackends, unsigned cBackends)
 /**
  * internal: add single cache backend.
  */
-DECLINLINE(int) vdAddCacheBackend(PVDCACHEBACKEND pBackend)
+DECLINLINE(int) vdAddCacheBackend(PCVDCACHEBACKEND pBackend)
 {
     return vdAddCacheBackends(&pBackend, 1);
 }
 
 /**
+ * Add several filter bakends.
+ *
+ * @returns VBox status code.
+ * @param   ppBackends    Array of filter backends to add.
+ * @param   cBackends     Number of backends to add.
+ */
+static int vdAddFilterBackends(PCVDFILTERBACKEND *ppBackends, unsigned cBackends)
+{
+    PCVDFILTERBACKEND *pTmp = (PCVDFILTERBACKEND *)RTMemRealloc(g_apFilterBackends,
+           (g_cFilterBackends + cBackends) * sizeof(PCVDFILTERBACKEND));
+    if (RT_UNLIKELY(!pTmp))
+        return VERR_NO_MEMORY;
+    g_apFilterBackends = pTmp;
+    memcpy(&g_apFilterBackends[g_cFilterBackends], ppBackends, cBackends * sizeof(PCVDFILTERBACKEND));
+    g_cFilterBackends += cBackends;
+    return VINF_SUCCESS;
+}
+
+/**
+ * Add a single filter backend to the list of supported filters.
+ *
+ * @returns VBox status code.
+ * @param   pBackend    The backend to add.
+ */
+DECLINLINE(int) vdAddFilterBackend(PCVDFILTERBACKEND pBackend)
+{
+    return vdAddFilterBackends(&pBackend, 1);
+}
+
+/**
  * internal: issue error message.
  */
 static int vdError(PVBOXHDD pDisk, int rc, RT_SRC_POS_DECL,
@@ -753,6 +838,27 @@ static int vdFindCacheBackend(const char *pszBackend, PCVDCACHEBACKEND *ppBacken
 }
 
 /**
+ * internal: find filter backend.
+ */
+static int vdFindFilterBackend(const char *pszFilter, PCVDFILTERBACKEND *ppBackend)
+{
+    int rc = VINF_SUCCESS;
+    PCVDFILTERBACKEND pBackend = NULL;
+
+    for (unsigned i = 0; i < g_cFilterBackends; i++)
+    {
+        if (!RTStrICmp(pszFilter, g_apFilterBackends[i]->pszBackendName))
+        {
+            pBackend = g_apFilterBackends[i];
+            break;
+        }
+    }
+    *ppBackend = pBackend;
+    return rc;
+}
+
+
+/**
  * internal: add image structure to the end of images list.
  */
 static void vdAddImageToList(PVBOXHDD pDisk, PVDIMAGE pImage)
@@ -801,6 +907,48 @@ static void vdRemoveImageFromList(PVBOXHDD pDisk, PVDIMAGE pImage)
 }
 
 /**
+ * internal: add filter structure to the end of filter list.
+ */
+static void vdAddFilterToList(PVBOXHDD pDisk, PVDFILTER pFilter)
+{
+    pFilter->pPrev = NULL;
+    pFilter->pNext = NULL;
+
+    if (pDisk->pFilterHead)
+    {
+        pFilter->pPrev = pDisk->pFilterTail;
+        pDisk->pFilterTail->pNext = pFilter;
+        pDisk->pFilterTail = pFilter;
+    }
+    else
+    {
+        pDisk->pFilterHead = pFilter;
+        pDisk->pFilterTail = pFilter;
+    }
+}
+
+/**
+ * internal: Remove last filter structure from the filter list.
+ */
+static void vdRemoveFilterFromList(PVBOXHDD pDisk, PVDFILTER pFilter)
+{
+    Assert(pDisk->pFilterHead != NULL && pDisk->pFilterTail != NULL);
+
+    if (pFilter->pPrev)
+        pFilter->pPrev->pNext = pFilter->pNext;
+    else
+        pDisk->pFilterHead = pFilter->pNext;
+
+    if (pFilter->pNext)
+        pFilter->pNext->pPrev = pFilter->pPrev;
+    else
+        pDisk->pFilterTail = pFilter->pPrev;
+
+    pFilter->pPrev = NULL;
+    pFilter->pNext = NULL;
+}
+
+/**
  * internal: find image by index into the images list.
  */
 static PVDIMAGE vdGetImageByNumber(PVBOXHDD pDisk, unsigned nImage)
@@ -817,6 +965,89 @@ static PVDIMAGE vdGetImageByNumber(PVBOXHDD pDisk, unsigned nImage)
 }
 
 /**
+ * Applies the filter chain to the given write request.
+ *
+ * @returns VBox status code.
+ * @param   pDisk    The HDD container.
+ * @param   uOffset  The start offset of the write.
+ * @param   cbWrite  Number of bytes to write.
+ * @param   pIoCtx   The I/O context associated with the request.
+ */
+static int vdFilterChainApplyWrite(PVBOXHDD pDisk, uint64_t uOffset, size_t cbWrite,
+                                   PVDIOCTX pIoCtx)
+{
+    int rc = VINF_SUCCESS;
+
+    VD_IS_LOCKED(pDisk);
+
+    if (pDisk->pFilterHead)
+    {
+        PVDFILTER pFilterCurr = pDisk->pFilterHead;
+
+        do
+        {
+            rc = pFilterCurr->pBackend->pfnFilterWrite(pFilterCurr->pvBackendData, uOffset, cbWrite, pIoCtx);
+            /* Reset S/G buffer for the next filter. */
+            RTSgBufReset(&pIoCtx->Req.Io.SgBuf);
+
+            pFilterCurr = pFilterCurr->pNext;
+        } while (   RT_SUCCESS(rc)
+                 && pFilterCurr);
+    }
+
+    return rc;
+}
+
+/**
+ * Applies the filter chain to the given read request.
+ *
+ * @returns VBox status code.
+ * @param   pDisk    The HDD container.
+ * @param   uOffset  The start offset of the read.
+ * @param   cbRead   Number of bytes read.
+ * @param   pIoCtx   The I/O context associated with the request.
+ */
+static int vdFilterChainApplyRead(PVBOXHDD pDisk, uint64_t uOffset, size_t cbRead,
+                                  PVDIOCTX pIoCtx)
+{
+    int rc = VINF_SUCCESS;
+
+    VD_IS_LOCKED(pDisk);
+
+    if (pDisk->pFilterHead)
+    {
+        PVDFILTER pFilterCurr = pDisk->pFilterHead;
+
+        /* Reset buffer before starting. */
+        RTSgBufReset(&pIoCtx->Req.Io.SgBuf);
+
+        do
+        {
+            rc = pFilterCurr->pBackend->pfnFilterRead(pFilterCurr->pvBackendData, uOffset, cbRead, pIoCtx);
+            /* Reset S/G buffer for the next filter. */
+            RTSgBufReset(&pIoCtx->Req.Io.SgBuf);
+
+            pFilterCurr = pFilterCurr->pNext;
+        } while (   RT_SUCCESS(rc)
+                 && pFilterCurr);
+    }
+
+    return rc;
+}
+
+DECLINLINE(void) vdIoCtxRootComplete(PVBOXHDD pDisk, PVDIOCTX pIoCtx)
+{
+    if (   RT_SUCCESS(pIoCtx->rcReq)
+        && pIoCtx->enmTxDir == VDIOCTXTXDIR_READ)
+        pIoCtx->rcReq = vdFilterChainApplyRead(pDisk, pIoCtx->Req.Io.uOffsetXferOrig,
+                                               pIoCtx->Req.Io.cbXferOrig, pIoCtx);
+
+    pIoCtx->Type.Root.pfnComplete(pIoCtx->Type.Root.pvUser1,
+                                  pIoCtx->Type.Root.pvUser2,
+                                  pIoCtx->rcReq);
+}
+
+/**
  * Initialize the structure members of a given I/O context.
  */
 DECLINLINE(void) vdIoCtxInit(PVDIOCTX pIoCtx, PVBOXHDD pDisk, VDIOCTXTXDIR enmTxDir,
@@ -833,6 +1064,8 @@ DECLINLINE(void) vdIoCtxInit(PVDIOCTX pIoCtx, PVBOXHDD pDisk, VDIOCTXTXDIR enmTx
     pIoCtx->Req.Io.pImageCur      = pImageStart;
     pIoCtx->Req.Io.cbBufClear     = 0;
     pIoCtx->Req.Io.pImageParentOverride = NULL;
+    pIoCtx->Req.Io.uOffsetXferOrig      = uOffset;
+    pIoCtx->Req.Io.cbXferOrig           = cbTransfer;
     pIoCtx->cDataTransfersPending = 0;
     pIoCtx->cMetaTransfersPending = 0;
     pIoCtx->fComplete             = false;
@@ -1279,9 +1512,9 @@ DECLINLINE(void) vdIoCtxFree(PVBOXHDD pDisk, PVDIOCTX pIoCtx)
 
 DECLINLINE(void) vdIoTaskFree(PVBOXHDD pDisk, PVDIOTASK pIoTask)
 {
-//#ifdef DEBUG
+#ifdef DEBUG
     memset(pIoTask, 0xff, sizeof(VDIOTASK));
-//#endif
+#endif
     RTMemCacheFree(pDisk->hMemCacheIoTask, pIoTask);
 }
 
@@ -1329,7 +1562,7 @@ DECLINLINE(void) vdIoCtxAddToWaitingList(volatile PVDIOCTX *ppList, PVDIOCTX pIo
 
 DECLINLINE(void) vdIoCtxDefer(PVBOXHDD pDisk, PVDIOCTX pIoCtx)
 {
-    LogFlowFunc(("Deferring write pIoCtx=%#p\n", pIoCtx));
+    LogFlowFunc(("Deferring I/O context pIoCtx=%#p\n", pIoCtx));
 
     Assert(!pIoCtx->pIoCtxParent && !(pIoCtx->fFlags & VDIOCTX_FLAGS_BLOCKED));
     pIoCtx->fFlags |= VDIOCTX_FLAGS_BLOCKED;
@@ -1425,7 +1658,8 @@ static int vdIoCtxProcessLocked(PVDIOCTX pIoCtx)
 
     if (   RT_SUCCESS(rc)
         && !pIoCtx->cMetaTransfersPending
-        && !pIoCtx->cDataTransfersPending)
+        && !pIoCtx->cDataTransfersPending
+        && !(pIoCtx->fFlags & VDIOCTX_FLAGS_BLOCKED))
         rc = VINF_VD_ASYNC_IO_FINISHED;
     else if (   RT_SUCCESS(rc)
              || rc == VERR_VD_NOT_ENOUGH_METADATA
@@ -1515,6 +1749,16 @@ static int vdDiskProcessWaitingIoCtx(PVBOXHDD pDisk, PVDIOCTX pIoCtxRc)
         rcTmp = vdIoCtxProcessLocked(pTmp);
         if (pTmp == pIoCtxRc)
         {
+            if (   rcTmp == VINF_VD_ASYNC_IO_FINISHED
+                && RT_SUCCESS(pTmp->rcReq)
+                && pTmp->enmTxDir == VDIOCTXTXDIR_READ)
+            {
+                   int rc2 = vdFilterChainApplyRead(pDisk, pTmp->Req.Io.uOffsetXferOrig,
+                                                    pTmp->Req.Io.cbXferOrig, pTmp);
+                    if (RT_FAILURE(rc2))
+                        rcTmp = rc2;
+            }
+
             /* The given I/O context was processed, pass the return code to the caller. */
             rc = rcTmp;
         }
@@ -1523,9 +1767,7 @@ static int vdDiskProcessWaitingIoCtx(PVBOXHDD pDisk, PVDIOCTX pIoCtxRc)
         {
             LogFlowFunc(("Waiting I/O context completed pTmp=%#p\n", pTmp));
             vdThreadFinishWrite(pDisk);
-            pTmp->Type.Root.pfnComplete(pTmp->Type.Root.pvUser1,
-                                        pTmp->Type.Root.pvUser2,
-                                        pTmp->rcReq);
+            vdIoCtxRootComplete(pDisk, pTmp);
             vdIoCtxFree(pDisk, pTmp);
         }
     }
@@ -1589,9 +1831,7 @@ static void vdDiskProcessBlockedIoCtx(PVBOXHDD pDisk)
         {
             LogFlowFunc(("Waiting I/O context completed pTmp=%#p\n", pTmp));
             vdThreadFinishWrite(pDisk);
-            pTmp->Type.Root.pfnComplete(pTmp->Type.Root.pvUser1,
-                                        pTmp->Type.Root.pvUser2,
-                                        pTmp->rcReq);
+            vdIoCtxRootComplete(pDisk, pTmp);
             vdIoCtxFree(pDisk, pTmp);
         }
     }
@@ -1766,6 +2006,22 @@ static int vdReadHelperAsync(PVDIOCTX pIoCtx)
     unsigned cImagesRead          = pIoCtx->Req.Io.cImagesRead;
     size_t cbThisRead;
 
+    /*
+     * Check whether there is a full block write in progress which was not allocated.
+     * Defer I/O if the range interferes but only if it does not belong to the
+     * write doing the allocation.
+     */
+    if (   pDisk->pIoCtxLockOwner != NIL_VDIOCTX
+        && uOffset >= pDisk->uOffsetStartLocked
+        && uOffset < pDisk->uOffsetEndLocked
+        && (   !pIoCtx->pIoCtxParent
+            || pIoCtx->pIoCtxParent != pDisk->pIoCtxLockOwner))
+    {
+        Log(("Interferring read while allocating a new block => deferring read\n"));
+        vdIoCtxDefer(pDisk, pIoCtx);
+        return VINF_SUCCESS;
+    }
+
     /* Loop until all reads started or we have a backend which needs to read metadata. */
     do
     {
@@ -1795,7 +2051,6 @@ static int vdReadHelperAsync(PVDIOCTX pIoCtx)
         }
         else
         {
-
             /*
              * Try to read from the given image.
              * If the block is not allocated read from override chain if present.
@@ -2628,6 +2883,15 @@ static int vdWriteHelperAsync(PVDIOCTX pIoCtx)
     size_t cbThisWrite;
     size_t cbPreRead, cbPostRead;
 
+    /* Apply write filter chain here if it was not done already. */
+    if (!(pIoCtx->fFlags & VDIOCTX_FLAGS_WRITE_FILTER_APPLIED))
+    {
+        rc = vdFilterChainApplyWrite(pDisk, uOffset, cbWrite, pIoCtx);
+        if (RT_FAILURE(rc))
+            return rc;
+        pIoCtx->fFlags |= VDIOCTX_FLAGS_WRITE_FILTER_APPLIED;
+    }
+
     if (!(pIoCtx->fFlags & VDIOCTX_FLAGS_DONT_SET_MODIFIED_FLAG))
     {
         rc = vdSetModifiedFlagAsync(pDisk, pIoCtx);
@@ -2649,12 +2913,26 @@ static int vdWriteHelperAsync(PVDIOCTX pIoCtx)
          * to avoid unnecessarily allocating unchanged blocks. This prevents
          * unwanted expanding of images. VMDK is an example. */
         cbThisWrite = cbWrite;
+
+        /*
+         * Check whether there is a full block write in progress which was not allocated.
+         * Defer I/O if the range interferes.
+         */
+        if (   pDisk->pIoCtxLockOwner != NIL_VDIOCTX
+            && uOffset >= pDisk->uOffsetStartLocked
+            && uOffset < pDisk->uOffsetEndLocked)
+        {
+            Log(("Interferring write while allocating a new block => deferring write\n"));
+            vdIoCtxDefer(pDisk, pIoCtx);
+            rc = VERR_VD_ASYNC_IO_IN_PROGRESS;
+            break;
+        }
+
         fWrite =   (pImage->uOpenFlags & VD_OPEN_FLAGS_HONOR_SAME)
                  ? 0 : VD_WRITE_NO_ALLOC;
-        rc = pImage->Backend->pfnWrite(pImage->pBackendData, uOffset,
-                                            cbThisWrite, pIoCtx,
-                                            &cbThisWrite, &cbPreRead,
-                                            &cbPostRead, fWrite);
+        rc = pImage->Backend->pfnWrite(pImage->pBackendData, uOffset, cbThisWrite,
+                                       pIoCtx, &cbThisWrite, &cbPreRead, &cbPostRead,
+                                       fWrite);
         if (rc == VERR_VD_BLOCK_FREE)
         {
             /* Lock the disk .*/
@@ -2692,6 +2970,10 @@ static int vdWriteHelperAsync(PVDIOCTX pIoCtx)
                 LogFlowFunc(("Disk is growing because of pIoCtx=%#p pIoCtxWrite=%#p\n",
                              pIoCtx, pIoCtxWrite));
 
+                /* Save the current range for the growing operation to check for intersecting requests later. */
+                pDisk->uOffsetStartLocked = uOffset - cbPreRead;
+                pDisk->uOffsetEndLocked = uOffset + cbThisWrite + cbPostRead;
+
                 pIoCtxWrite->Type.Child.cbPreRead  = cbPreRead;
                 pIoCtxWrite->Type.Child.cbPostRead = cbPostRead;
                 pIoCtxWrite->Req.Io.pImageParentOverride = pIoCtx->Req.Io.pImageParentOverride;
@@ -2779,6 +3061,10 @@ static int vdFlushHelperAsync(PVDIOCTX pIoCtx)
     rc = vdIoCtxLockDisk(pDisk, pIoCtx);
     if (RT_SUCCESS(rc))
     {
+        /* Mark the whole disk as locked. */
+        pDisk->uOffsetStartLocked = 0;
+        pDisk->uOffsetEndLocked = UINT64_C(0xffffffffffffffff);
+
         vdResetModifiedFlag(pDisk);
         rc = pImage->Backend->pfnFlush(pImage->pBackendData, pIoCtx);
         if (   (   RT_SUCCESS(rc)
@@ -3049,6 +3335,9 @@ static int vdDiscardHelperAsync(PVDIOCTX pIoCtx)
         size_t   cbDiscardLeft = pIoCtx->Req.Discard.cbDiscardLeft;
         size_t   cbThisDiscard;
 
+        pDisk->uOffsetStartLocked = offStart;
+        pDisk->uOffsetEndLocked = offStart + cbDiscardLeft;
+
         if (RT_UNLIKELY(!pDiscard))
         {
             pDiscard = vdDiscardStateCreate();
@@ -3131,154 +3420,183 @@ static int vdDiscardHelperAsync(PVDIOCTX pIoCtx)
     return rc;
 }
 
+#ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
 /**
- * internal: scans plugin directory and loads the backends have been found.
+ * @copydoc VDPLUGIN::pfnRegisterImage
  */
-static int vdLoadDynamicBackends()
+static DECLCALLBACK(int) vdPluginRegisterImage(void *pvUser, PCVBOXHDDBACKEND pBackend)
 {
-#ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
     int rc = VINF_SUCCESS;
-    PRTDIR pPluginDir = NULL;
 
-    /* Enumerate plugin backends. */
-    char szPath[RTPATH_MAX];
-    rc = RTPathAppPrivateArch(szPath, sizeof(szPath));
-    if (RT_FAILURE(rc))
-        return rc;
+    if (pBackend->cbSize == sizeof(VBOXHDDBACKEND))
+        vdAddBackend(pBackend);
+    else
+    {
+        LogFunc(("ignored plugin: pBackend->cbSize=%d rc=%Rrc\n", pBackend->cbSize));
+        rc = VERR_IGNORED;
+    }
 
-    /* To get all entries with VBoxHDD as prefix. */
-    char *pszPluginFilter = RTPathJoinA(szPath, VBOX_HDDFORMAT_PLUGIN_PREFIX "*");
-    if (!pszPluginFilter)
-        return VERR_NO_STR_MEMORY;
+    return rc;
+}
 
-    PRTDIRENTRYEX pPluginDirEntry = NULL;
-    size_t cbPluginDirEntry = sizeof(RTDIRENTRYEX);
-    /* The plugins are in the same directory as the other shared libs. */
-    rc = RTDirOpenFiltered(&pPluginDir, pszPluginFilter, RTDIRFILTER_WINNT, 0);
-    if (RT_FAILURE(rc))
+/**
+ * @copydoc VDPLUGIN::pfnRegisterCache
+ */
+static DECLCALLBACK(int) vdPluginRegisterCache(void *pvUser, PCVDCACHEBACKEND pBackend)
+{
+    int rc = VINF_SUCCESS;
+
+    if (pBackend->cbSize == sizeof(VDCACHEBACKEND))
+        vdAddCacheBackend(pBackend);
+    else
     {
-        /* On Windows the above immediately signals that there are no
-         * files matching, while on other platforms enumerating the
-         * files below fails. Either way: no plugins. */
-        goto out;
+        LogFunc(("ignored plugin: pBackend->cbSize=%d rc=%Rrc\n", pBackend->cbSize));
+        rc = VERR_IGNORED;
     }
 
-    pPluginDirEntry = (PRTDIRENTRYEX)RTMemAllocZ(sizeof(RTDIRENTRYEX));
-    if (!pPluginDirEntry)
+    return rc;
+}
+
+/**
+ * @copydoc VDPLUGIN::pfnRegisterFilter
+ */
+static DECLCALLBACK(int) vdPluginRegisterFilter(void *pvUser, PCVDFILTERBACKEND pBackend)
+{
+    int rc = VINF_SUCCESS;
+
+    if (pBackend->cbSize == sizeof(VDFILTERBACKEND))
+        vdAddFilterBackend(pBackend);
+    else
     {
-        rc = VERR_NO_MEMORY;
-        goto out;
+        LogFunc(("ignored plugin: pBackend->cbSize=%d rc=%Rrc\n", pBackend->cbSize));
+        rc = VERR_IGNORED;
     }
 
-    while ((rc = RTDirReadEx(pPluginDir, pPluginDirEntry, &cbPluginDirEntry, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK)) != VERR_NO_MORE_FILES)
+    return rc;
+}
+
+/**
+ * Checks whether the given plugin filename was already loaded.
+ *
+ * @returns true if the plugin was already loaded, false otherwise.
+ * @param   pszFilename    The filename to check.
+ */
+static bool vdPluginFind(const char *pszFilename)
+{
+    PVDPLUGIN pIt = NULL;
+
+    RTListForEach(&g_ListPluginsLoaded, pIt, VDPLUGIN, NodePlugin)
     {
-        RTLDRMOD hPlugin = NIL_RTLDRMOD;
-        PFNVBOXHDDFORMATLOAD pfnHDDFormatLoad = NULL;
-        PVBOXHDDBACKEND pBackend = NULL;
-        char *pszPluginPath = NULL;
+        if (!RTStrCmp(pIt->pszFilename, pszFilename))
+            return true;
+    }
 
-        if (rc == VERR_BUFFER_OVERFLOW)
+    return false;
+}
+
+/**
+ * Adds a plugin to the list of loaded plugins.
+ *
+ * @returns VBox status code.
+ * @param   hPlugin     Plugin handle to add.
+ * @param   pszFilename The associated filename, sued for finding duplicates.
+ */
+static int vdAddPlugin(RTLDRMOD hPlugin, const char *pszFilename)
+{
+    int rc = VINF_SUCCESS;
+    PVDPLUGIN pPlugin = (PVDPLUGIN)RTMemAllocZ(sizeof(VDPLUGIN));
+
+    if (pPlugin)
+    {
+        pPlugin->hPlugin = hPlugin;
+        pPlugin->pszFilename = RTStrDup(pszFilename);
+        if (pPlugin->pszFilename)
+            RTListAppend(&g_ListPluginsLoaded, &pPlugin->NodePlugin);
+        else
         {
-            /* allocate new buffer. */
-            RTMemFree(pPluginDirEntry);
-            pPluginDirEntry = (PRTDIRENTRYEX)RTMemAllocZ(cbPluginDirEntry);
-            if (!pPluginDirEntry)
-            {
-                rc = VERR_NO_MEMORY;
-                break;
-            }
-            /* Retry. */
-            rc = RTDirReadEx(pPluginDir, pPluginDirEntry, &cbPluginDirEntry, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
-            if (RT_FAILURE(rc))
-                break;
+            RTMemFree(pPlugin);
+            rc = VERR_NO_MEMORY;
         }
-        else if (RT_FAILURE(rc))
-            break;
+    }
+    else
+        rc = VERR_NO_MEMORY;
 
-        /* We got the new entry. */
-        if (!RTFS_IS_FILE(pPluginDirEntry->Info.Attr.fMode))
-            continue;
+    return rc;
+}
+#endif
 
-        /* Prepend the path to the libraries. */
-        pszPluginPath = RTPathJoinA(szPath, pPluginDirEntry->szName);
-        if (!pszPluginPath)
+/**
+ * Worker for VDPluginLoadFromFilename() and vdPluginLoadFromPath().
+ *
+ * @returns VBox status code.
+ * @param   pszFilename    The plugin filename to load.
+ */
+static int vdPluginLoadFromFilename(const char *pszFilename)
+{
+#ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
+    /* Plugin loaded? Nothing to do. */
+    if (vdPluginFind(pszFilename))
+        return VINF_SUCCESS;
+
+    RTLDRMOD hPlugin = NIL_RTLDRMOD;
+    int rc = SUPR3HardenedLdrLoadPlugIn(pszFilename, &hPlugin, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        VDBACKENDREGISTER BackendRegister;
+        PFNVDPLUGINLOAD pfnVDPluginLoad = NULL;
+
+        BackendRegister.pfnRegisterImage  = vdPluginRegisterImage;
+        BackendRegister.pfnRegisterCache  = vdPluginRegisterCache;
+        BackendRegister.pfnRegisterFilter = vdPluginRegisterFilter;
+
+        rc = RTLdrGetSymbol(hPlugin, VD_PLUGIN_LOAD_NAME, (void**)&pfnVDPluginLoad);
+        if (RT_FAILURE(rc) || !pfnVDPluginLoad)
         {
-            rc = VERR_NO_STR_MEMORY;
-            break;
+            LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnVDPluginLoad=%#p\n",
+                     VD_PLUGIN_LOAD_NAME, pszFilename, rc, pfnVDPluginLoad));
+            if (RT_SUCCESS(rc))
+                rc = VERR_SYMBOL_NOT_FOUND;
         }
 
-        rc = SUPR3HardenedLdrLoadPlugIn(pszPluginPath, &hPlugin, NULL);
         if (RT_SUCCESS(rc))
         {
-            rc = RTLdrGetSymbol(hPlugin, VBOX_HDDFORMAT_LOAD_NAME, (void**)&pfnHDDFormatLoad);
-            if (RT_FAILURE(rc) || !pfnHDDFormatLoad)
-            {
-                LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnHDDFormat=%#p\n", VBOX_HDDFORMAT_LOAD_NAME, pPluginDirEntry->szName, rc, pfnHDDFormatLoad));
-                if (RT_SUCCESS(rc))
-                    rc = VERR_SYMBOL_NOT_FOUND;
-            }
-
-            if (RT_SUCCESS(rc))
-            {
-                /* Get the function table. */
-                rc = pfnHDDFormatLoad(&pBackend);
-                if (RT_SUCCESS(rc) && pBackend->cbSize == sizeof(VBOXHDDBACKEND))
-                {
-                    pBackend->hPlugin = hPlugin;
-                    vdAddBackend(pBackend);
-                }
-                else
-                    LogFunc(("ignored plugin '%s': pBackend->cbSize=%d rc=%Rrc\n", pszPluginPath, pBackend->cbSize, rc));
-            }
-            else
-                LogFunc(("ignored plugin '%s': rc=%Rrc\n", pszPluginPath, rc));
-
-            if (RT_FAILURE(rc))
-                RTLdrClose(hPlugin);
+            /* Get the function table. */
+            rc = pfnVDPluginLoad(NULL, &BackendRegister);
         }
-        RTStrFree(pszPluginPath);
+        else
+            LogFunc(("ignored plugin '%s': rc=%Rrc\n", pszFilename, rc));
+
+        /* Create a plugin entry on success. */
+        if (RT_SUCCESS(rc))
+            vdAddPlugin(hPlugin, pszFilename);
+        else
+            RTLdrClose(hPlugin);
     }
-out:
-    if (rc == VERR_NO_MORE_FILES)
-        rc = VINF_SUCCESS;
-    RTStrFree(pszPluginFilter);
-    if (pPluginDirEntry)
-        RTMemFree(pPluginDirEntry);
-    if (pPluginDir)
-        RTDirClose(pPluginDir);
+
     return rc;
 #else
-    return VINF_SUCCESS;
+    return VERR_NOT_IMPLEMENTED;
 #endif
 }
 
 /**
- * internal: scans plugin directory and loads the cache backends have been found.
+ * Worker for VDPluginLoadFromPath() and vdLoadDynamicBackends().
+ *
+ * @returns VBox status code.
+ * @param   pszPath        The path to load plugins from.
  */
-static int vdLoadDynamicCacheBackends()
+static int vdPluginLoadFromPath(const char *pszPath)
 {
 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
-    int rc = VINF_SUCCESS;
-    PRTDIR pPluginDir = NULL;
-
-    /* Enumerate plugin backends. */
-    char szPath[RTPATH_MAX];
-    rc = RTPathAppPrivateArch(szPath, sizeof(szPath));
-    if (RT_FAILURE(rc))
-        return rc;
-
     /* To get all entries with VBoxHDD as prefix. */
-    char *pszPluginFilter = RTPathJoinA(szPath, VD_CACHEFORMAT_PLUGIN_PREFIX "*");
+    char *pszPluginFilter = RTPathJoinA(pszPath, VD_PLUGIN_PREFIX "*");
     if (!pszPluginFilter)
-    {
-        rc = VERR_NO_STR_MEMORY;
-        return rc;
-    }
+        return VERR_NO_STR_MEMORY;
 
     PRTDIRENTRYEX pPluginDirEntry = NULL;
+    PRTDIR pPluginDir = NULL;
     size_t cbPluginDirEntry = sizeof(RTDIRENTRYEX);
-    /* The plugins are in the same directory as the other shared libs. */
-    rc = RTDirOpenFiltered(&pPluginDir, pszPluginFilter, RTDIRFILTER_WINNT, 0);
+    int rc = RTDirOpenFiltered(&pPluginDir, pszPluginFilter, RTDIRFILTER_WINNT, 0);
     if (RT_FAILURE(rc))
     {
         /* On Windows the above immediately signals that there are no
@@ -3296,9 +3614,6 @@ static int vdLoadDynamicCacheBackends()
 
     while ((rc = RTDirReadEx(pPluginDir, pPluginDirEntry, &cbPluginDirEntry, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK)) != VERR_NO_MORE_FILES)
     {
-        RTLDRMOD hPlugin = NIL_RTLDRMOD;
-        PFNVDCACHEFORMATLOAD pfnVDCacheLoad = NULL;
-        PVDCACHEBACKEND pBackend = NULL;
         char *pszPluginPath = NULL;
 
         if (rc == VERR_BUFFER_OVERFLOW)
@@ -3324,43 +3639,14 @@ static int vdLoadDynamicCacheBackends()
             continue;
 
         /* Prepend the path to the libraries. */
-        pszPluginPath = RTPathJoinA(szPath, pPluginDirEntry->szName);
+        pszPluginPath = RTPathJoinA(pszPath, pPluginDirEntry->szName);
         if (!pszPluginPath)
         {
             rc = VERR_NO_STR_MEMORY;
             break;
         }
 
-        rc = SUPR3HardenedLdrLoadPlugIn(pszPluginPath, &hPlugin, NULL);
-        if (RT_SUCCESS(rc))
-        {
-            rc = RTLdrGetSymbol(hPlugin, VD_CACHEFORMAT_LOAD_NAME, (void**)&pfnVDCacheLoad);
-            if (RT_FAILURE(rc) || !pfnVDCacheLoad)
-            {
-                LogFunc(("error resolving the entry point %s in plugin %s, rc=%Rrc, pfnVDCacheLoad=%#p\n",
-                         VD_CACHEFORMAT_LOAD_NAME, pPluginDirEntry->szName, rc, pfnVDCacheLoad));
-                if (RT_SUCCESS(rc))
-                    rc = VERR_SYMBOL_NOT_FOUND;
-            }
-
-            if (RT_SUCCESS(rc))
-            {
-                /* Get the function table. */
-                rc = pfnVDCacheLoad(&pBackend);
-                if (RT_SUCCESS(rc) && pBackend->cbSize == sizeof(VDCACHEBACKEND))
-                {
-                    pBackend->hPlugin = hPlugin;
-                    vdAddCacheBackend(pBackend);
-                }
-                else
-                    LogFunc(("ignored plugin '%s': pBackend->cbSize=%d rc=%Rrc\n", pszPluginPath, pBackend->cbSize, rc));
-            }
-            else
-                LogFunc(("ignored plugin '%s': rc=%Rrc\n", pszPluginPath, rc));
-
-            if (RT_FAILURE(rc))
-                RTLdrClose(hPlugin);
-        }
+        rc = vdPluginLoadFromFilename(pszPluginPath);
         RTStrFree(pszPluginPath);
     }
 out:
@@ -3373,6 +3659,27 @@ out:
         RTDirClose(pPluginDir);
     return rc;
 #else
+    return VERR_NOT_IMPLEMENTED;
+#endif
+}
+
+/**
+ * internal: scans plugin directory and loads found plugins.
+ */
+static int vdLoadDynamicBackends()
+{
+#ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
+    /*
+     * Enumerate plugin backends from the application directory where the other
+     * shared libraries are.
+     */
+    char szPath[RTPATH_MAX];
+    int rc = RTPathAppPrivateArch(szPath, sizeof(szPath));
+    if (RT_FAILURE(rc))
+        return rc;
+
+    return vdPluginLoadFromPath(szPath);
+#else
     return VINF_SUCCESS;
 #endif
 }
@@ -3582,9 +3889,7 @@ static int vdIoCtxContinue(PVDIOCTX pIoCtx, int rcReq)
                     && ASMAtomicCmpXchgBool(&pIoCtxParent->fComplete, true, false))
                 {
                     LogFlowFunc(("Parent I/O context completed pIoCtxParent=%#p rcReq=%Rrc\n", pIoCtxParent, pIoCtxParent->rcReq));
-                    pIoCtxParent->Type.Root.pfnComplete(pIoCtxParent->Type.Root.pvUser1,
-                                                        pIoCtxParent->Type.Root.pvUser2,
-                                                        pIoCtxParent->rcReq);
+                    vdIoCtxRootComplete(pDisk, pIoCtxParent);
                     vdThreadFinishWrite(pDisk);
                     vdIoCtxFree(pDisk, pIoCtxParent);
                     vdDiskProcessBlockedIoCtx(pDisk);
@@ -3612,9 +3917,7 @@ static int vdIoCtxContinue(PVDIOCTX pIoCtx, int rcReq)
                 }
 
                 LogFlowFunc(("I/O context completed pIoCtx=%#p rcReq=%Rrc\n", pIoCtx, pIoCtx->rcReq));
-                pIoCtx->Type.Root.pfnComplete(pIoCtx->Type.Root.pvUser1,
-                                              pIoCtx->Type.Root.pvUser2,
-                                              pIoCtx->rcReq);
+                vdIoCtxRootComplete(pDisk, pIoCtx);
             }
 
             vdIoCtxFree(pDisk, pIoCtx);
@@ -4627,9 +4930,13 @@ static size_t vdIOIntIoCtxSegArrayCreate(void *pvUser, PVDIOCTX pIoCtx,
     PVBOXHDD pDisk = pVDIo->pDisk;
     size_t cbCreated = 0;
 
+    /** @todo: It is possible that this gets called from a filter plugin
+     * outside of the disk lock. Refine assertion or remove completely. */
+#if 0
     /** @todo: Enable check for sync I/O later. */
     if (!(pIoCtx->fFlags & VDIOCTX_FLAGS_SYNC))
         VD_IS_LOCKED(pDisk);
+#endif
 
     cbCreated = RTSgBufSegArrayCreate(&pIoCtx->Req.Io.SgBuf, paSeg, pcSeg, cbData);
     Assert(!paSeg || cbData == cbCreated);
@@ -4693,6 +5000,16 @@ static DECLCALLBACK(bool) vdIOIntIoCtxIsZero(void *pvUser, PVDIOCTX pIoCtx, size
     return fIsZero;
 }
 
+static DECLCALLBACK(size_t) vdIOIntIoCtxGetDataUnitSize(void *pvUser, PVDIOCTX pIoCtx)
+{
+    PVDIO    pVDIo = (PVDIO)pvUser;
+    PVBOXHDD pDisk = pVDIo->pDisk;
+
+    PVDIMAGE pImage = vdGetImageByNumber(pDisk, VD_LAST_IMAGE);
+    AssertPtrReturn(pImage, 0);
+    return pImage->Backend->pfnGetSectorSize(pImage->pBackendData);  
+}
+
 /**
  * VD I/O interface callback for opening a file (limited version for VDGetFormat).
  */
@@ -4955,27 +5272,28 @@ static void vdIfIoFallbackCallbacksSetup(PVDINTERFACEIO pIfIo)
  */
 static void vdIfIoIntCallbacksSetup(PVDINTERFACEIOINT pIfIoInt)
 {
-    pIfIoInt->pfnOpen                = vdIOIntOpen;
-    pIfIoInt->pfnClose               = vdIOIntClose;
-    pIfIoInt->pfnDelete              = vdIOIntDelete;
-    pIfIoInt->pfnMove                = vdIOIntMove;
-    pIfIoInt->pfnGetFreeSpace        = vdIOIntGetFreeSpace;
-    pIfIoInt->pfnGetModificationTime = vdIOIntGetModificationTime;
-    pIfIoInt->pfnGetSize             = vdIOIntGetSize;
-    pIfIoInt->pfnSetSize             = vdIOIntSetSize;
-    pIfIoInt->pfnReadUser            = vdIOIntReadUser;
-    pIfIoInt->pfnWriteUser           = vdIOIntWriteUser;
-    pIfIoInt->pfnReadMeta            = vdIOIntReadMeta;
-    pIfIoInt->pfnWriteMeta           = vdIOIntWriteMeta;
-    pIfIoInt->pfnMetaXferRelease     = vdIOIntMetaXferRelease;
-    pIfIoInt->pfnFlush               = vdIOIntFlush;
-    pIfIoInt->pfnIoCtxCopyFrom       = vdIOIntIoCtxCopyFrom;
-    pIfIoInt->pfnIoCtxCopyTo         = vdIOIntIoCtxCopyTo;
-    pIfIoInt->pfnIoCtxSet            = vdIOIntIoCtxSet;
-    pIfIoInt->pfnIoCtxSegArrayCreate = vdIOIntIoCtxSegArrayCreate;
-    pIfIoInt->pfnIoCtxCompleted      = vdIOIntIoCtxCompleted;
-    pIfIoInt->pfnIoCtxIsSynchronous  = vdIOIntIoCtxIsSynchronous;
-    pIfIoInt->pfnIoCtxIsZero         = vdIOIntIoCtxIsZero;
+    pIfIoInt->pfnOpen                 = vdIOIntOpen;
+    pIfIoInt->pfnClose                = vdIOIntClose;
+    pIfIoInt->pfnDelete               = vdIOIntDelete;
+    pIfIoInt->pfnMove                 = vdIOIntMove;
+    pIfIoInt->pfnGetFreeSpace         = vdIOIntGetFreeSpace;
+    pIfIoInt->pfnGetModificationTime  = vdIOIntGetModificationTime;
+    pIfIoInt->pfnGetSize              = vdIOIntGetSize;
+    pIfIoInt->pfnSetSize              = vdIOIntSetSize;
+    pIfIoInt->pfnReadUser             = vdIOIntReadUser;
+    pIfIoInt->pfnWriteUser            = vdIOIntWriteUser;
+    pIfIoInt->pfnReadMeta             = vdIOIntReadMeta;
+    pIfIoInt->pfnWriteMeta            = vdIOIntWriteMeta;
+    pIfIoInt->pfnMetaXferRelease      = vdIOIntMetaXferRelease;
+    pIfIoInt->pfnFlush                = vdIOIntFlush;
+    pIfIoInt->pfnIoCtxCopyFrom        = vdIOIntIoCtxCopyFrom;
+    pIfIoInt->pfnIoCtxCopyTo          = vdIOIntIoCtxCopyTo;
+    pIfIoInt->pfnIoCtxSet             = vdIOIntIoCtxSet;
+    pIfIoInt->pfnIoCtxSegArrayCreate  = vdIOIntIoCtxSegArrayCreate;
+    pIfIoInt->pfnIoCtxCompleted       = vdIOIntIoCtxCompleted;
+    pIfIoInt->pfnIoCtxIsSynchronous   = vdIOIntIoCtxIsSynchronous;
+    pIfIoInt->pfnIoCtxIsZero          = vdIOIntIoCtxIsZero;
+    pIfIoInt->pfnIoCtxGetDataUnitSize = vdIOIntIoCtxGetDataUnitSize;
 }
 
 /**
@@ -5002,9 +5320,8 @@ VBOXDDU_DECL(int) VDInit(void)
         rc = vdAddCacheBackends(aStaticCacheBackends, RT_ELEMENTS(aStaticCacheBackends));
         if (RT_SUCCESS(rc))
         {
+            RTListInit(&g_ListPluginsLoaded);
             rc = vdLoadDynamicBackends();
-            if (RT_SUCCESS(rc))
-                rc = vdLoadDynamicCacheBackends();
         }
     }
     LogRel(("VDInit finished\n"));
@@ -5018,39 +5335,74 @@ VBOXDDU_DECL(int) VDInit(void)
  */
 VBOXDDU_DECL(int) VDShutdown(void)
 {
-    PVBOXHDDBACKEND *pBackends = g_apBackends;
-    PVDCACHEBACKEND *pCacheBackends = g_apCacheBackends;
+    PCVBOXHDDBACKEND *pBackends = g_apBackends;
+    PCVDCACHEBACKEND *pCacheBackends = g_apCacheBackends;
     unsigned cBackends = g_cBackends;
 
-    if (!pBackends)
+    if (!g_apBackends)
         return VERR_INTERNAL_ERROR;
 
+    if (g_apCacheBackends)
+        RTMemFree(g_apCacheBackends);
+    RTMemFree(g_apBackends);
+
     g_cBackends = 0;
     g_apBackends = NULL;
 
-#ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
-    for (unsigned i = 0; i < cBackends; i++)
-        if (pBackends[i]->hPlugin != NIL_RTLDRMOD)
-            RTLdrClose(pBackends[i]->hPlugin);
-#endif
-
     /* Clear the supported cache backends. */
-    cBackends = g_cCacheBackends;
     g_cCacheBackends = 0;
     g_apCacheBackends = NULL;
 
 #ifndef VBOX_HDD_NO_DYNAMIC_BACKENDS
-    for (unsigned i = 0; i < cBackends; i++)
-        if (pCacheBackends[i]->hPlugin != NIL_RTLDRMOD)
-            RTLdrClose(pCacheBackends[i]->hPlugin);
+    PVDPLUGIN pPlugin, pPluginNext;
+
+    RTListForEachSafe(&g_ListPluginsLoaded, pPlugin, pPluginNext, VDPLUGIN, NodePlugin)
+    {
+        RTLdrClose(pPlugin->hPlugin);
+        RTStrFree(pPlugin->pszFilename);
+        RTListNodeRemove(&pPlugin->NodePlugin);
+        RTMemFree(pPlugin);
+    }
 #endif
 
-    if (pCacheBackends)
-        RTMemFree(pCacheBackends);
-    RTMemFree(pBackends);
     return VINF_SUCCESS;
 }
 
+/**
+ * Loads a single plugin given by filename.
+ *
+ * @returns VBox status code.
+ * @param   pszFilename     The plugin filename to load.
+ */
+VBOXDDU_DECL(int) VDPluginLoadFromFilename(const char *pszFilename)
+{
+    if (!g_apBackends)
+    {
+        int rc = VDInit();
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    return vdPluginLoadFromFilename(pszFilename);
+}
+
+/**
+ * Load all plugins from a given path.
+ *
+ * @returns VBox statuse code.
+ * @param   pszPath         The path to load plugins from.
+ */
+VBOXDDU_DECL(int) VDPluginLoadFromPath(const char *pszPath)
+{
+    if (!g_apBackends)
+    {
+        int rc = VDInit();
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    return vdPluginLoadFromPath(pszPath);
+}
 
 /**
  * Lists all HDD backends and their capabilities in a caller-provided buffer.
@@ -5185,6 +5537,8 @@ VBOXDDU_DECL(int) VDCreate(PVDINTERFACE pVDIfsDisk, VDTYPE enmType, PVBOXHDD *pp
             pDisk->hEventSemSyncIo         = NIL_RTSEMEVENT;
             pDisk->hMemCacheIoCtx          = NIL_RTMEMCACHE;
             pDisk->hMemCacheIoTask         = NIL_RTMEMCACHE;
+            pDisk->pFilterHead             = NULL;
+            pDisk->pFilterTail             = NULL;
 
             rc = RTSemEventCreate(&pDisk->hEventSemSyncIo);
             if (RT_FAILURE(rc))
@@ -5248,6 +5602,10 @@ VBOXDDU_DECL(int) VDDestroy(PVBOXHDD pDisk)
         Assert(!pDisk->fLocked);
 
         rc = VDCloseAll(pDisk);
+        int rc2 = VDFilterRemoveAll(pDisk);
+        if (RT_SUCCESS(rc))
+            rc = rc2;
+
         RTMemCacheDestroy(pDisk->hMemCacheIoCtx);
         RTMemCacheDestroy(pDisk->hMemCacheIoTask);
         RTSemEventDestroy(pDisk->hEventSemSyncIo);
@@ -5916,6 +6274,100 @@ VBOXDDU_DECL(int) VDCacheOpen(PVBOXHDD pDisk, const char *pszBackend,
 }
 
 /**
+ * Adds a filter to the disk.
+ *
+ * @returns VBox status code.
+ * @param   pDisk           Pointer to the HDD container which should use the filter.
+ * @param   pszFilter       Name of the filter backend to use (case insensitive).
+ * @param   pVDIfsFilter    Pointer to the per-filter VD interface list.
+ */
+VBOXDDU_DECL(int) VDFilterAdd(PVBOXHDD pDisk, const char *pszFilter,
+                              PVDINTERFACE pVDIfsFilter)
+{
+    int rc = VINF_SUCCESS;
+    int rc2;
+    bool fLockWrite = false;
+    PVDFILTER pFilter = NULL;
+
+    LogFlowFunc(("pDisk=%#p pszFilter=\"%s\" pVDIfsFilter=%#p\n",
+                 pDisk, pszFilter, pVDIfsFilter));
+
+    do
+    {
+        /* sanity check */
+        AssertPtrBreakStmt(pDisk, rc = VERR_INVALID_PARAMETER);
+        AssertMsg(pDisk->u32Signature == VBOXHDDDISK_SIGNATURE, ("u32Signature=%08x\n", pDisk->u32Signature));
+
+        /* Check arguments. */
+        AssertMsgBreakStmt(VALID_PTR(pszFilter) && *pszFilter,
+                           ("pszFilter=%#p \"%s\"\n", pszFilter, pszFilter),
+                           rc = VERR_INVALID_PARAMETER);
+
+        /* Set up image descriptor. */
+        pFilter = (PVDFILTER)RTMemAllocZ(sizeof(VDFILTER));
+        if (!pFilter)
+        {
+            rc = VERR_NO_MEMORY;
+            break;
+        }
+
+        rc = vdFindFilterBackend(pszFilter, &pFilter->pBackend);
+        if (RT_FAILURE(rc))
+            break;
+        if (!pFilter->pBackend)
+        {
+            rc = vdError(pDisk, VERR_INVALID_PARAMETER, RT_SRC_POS,
+                         N_("VD: unknown filter backend name '%s'"), pszFilter);
+            break;
+        }
+
+        pFilter->VDIo.pDisk   = pDisk;
+        pFilter->pVDIfsFilter = pVDIfsFilter;
+
+        /* Set up the internal I/O interface. */
+        AssertBreakStmt(!VDIfIoIntGet(pVDIfsFilter), rc = VERR_INVALID_PARAMETER);
+        vdIfIoIntCallbacksSetup(&pFilter->VDIo.VDIfIoInt);
+        rc = VDInterfaceAdd(&pFilter->VDIo.VDIfIoInt.Core, "VD_IOINT", VDINTERFACETYPE_IOINT,
+                            &pFilter->VDIo, sizeof(VDINTERFACEIOINT), &pFilter->pVDIfsFilter);
+        AssertRC(rc);
+
+        rc = pFilter->pBackend->pfnCreate(pDisk->pVDIfsDisk, pFilter->pVDIfsFilter,
+                                          &pFilter->pvBackendData);
+
+        /* If the open in read-write mode failed, retry in read-only mode. */
+        if (RT_FAILURE(rc))
+        {
+            rc = vdError(pDisk, rc, RT_SRC_POS,
+                         N_("VD: error %Rrc creating filter '%s'"), rc, pszFilter);
+            break;
+        }
+
+        /* Lock disk for writing, as we modify pDisk information below. */
+        rc2 = vdThreadStartWrite(pDisk);
+        AssertRC(rc2);
+        fLockWrite = true;
+
+        /* Add filter to chain. */
+        vdAddFilterToList(pDisk, pFilter);
+    } while (0);
+
+    if (RT_UNLIKELY(fLockWrite))
+    {
+        rc2 = vdThreadFinishWrite(pDisk);
+        AssertRC(rc2);
+    }
+
+    if (RT_FAILURE(rc))
+    {
+        if (pFilter)
+            RTMemFree(pFilter);
+    }
+
+    LogFlowFunc(("returns %Rrc\n", rc));
+    return rc;
+}
+
+/**
  * Creates and opens a new base image file.
  *
  * @returns VBox status code.
@@ -7902,6 +8354,51 @@ VBOXDDU_DECL(int) VDCacheClose(PVBOXHDD pDisk, bool fDelete)
 }
 
 /**
+ * Removes the last added filter in the HDD container.
+ *
+ * @return  VBox status code.
+ * @retval  VERR_VD_NOT_OPENED if no filter is present for the disk.
+ * @param   pDisk           Pointer to HDD container.
+ */
+VBOXDDU_DECL(int) VDFilterRemove(PVBOXHDD pDisk)
+{
+    int rc = VINF_SUCCESS;
+    int rc2;
+    bool fLockWrite = false;
+    PVDFILTER pFilter = NULL;
+
+    LogFlowFunc(("pDisk=%#p\n", pDisk));
+
+    do
+    {
+        /* sanity check */
+        AssertPtrBreakStmt(pDisk, rc = VERR_INVALID_PARAMETER);
+        AssertMsg(pDisk->u32Signature == VBOXHDDDISK_SIGNATURE, ("u32Signature=%08x\n", pDisk->u32Signature));
+
+        rc2 = vdThreadStartWrite(pDisk);
+        AssertRC(rc2);
+        fLockWrite = true;
+
+        AssertPtrBreakStmt(pDisk->pFilterHead, rc = VERR_VD_NOT_OPENED);
+
+        pFilter = pDisk->pFilterTail;
+        vdRemoveFilterFromList(pDisk, pFilter);
+
+        pFilter->pBackend->pfnDestroy(pFilter->pvBackendData);
+        RTMemFree(pFilter);
+    } while (0);
+
+    if (RT_LIKELY(fLockWrite))
+    {
+        rc2 = vdThreadFinishWrite(pDisk);
+        AssertRC(rc2);
+    }
+
+    LogFlowFunc(("returns %Rrc\n", rc));
+    return rc;
+}
+
+/**
  * Closes all opened image files in HDD container.
  *
  * @returns VBox status code.
@@ -7966,6 +8463,56 @@ VBOXDDU_DECL(int) VDCloseAll(PVBOXHDD pDisk)
 }
 
 /**
+ * Removes all filters of the given HDD container.
+ *
+ * @return  VBox status code.
+ * @param   pDisk           Pointer to HDD container.
+ */
+VBOXDDU_DECL(int) VDFilterRemoveAll(PVBOXHDD pDisk)
+{
+    int rc = VINF_SUCCESS;
+    int rc2;
+    bool fLockWrite = false;
+
+    LogFlowFunc(("pDisk=%#p\n", pDisk));
+    do
+    {
+        /* sanity check */
+        AssertPtrBreakStmt(pDisk, rc = VERR_INVALID_PARAMETER);
+        AssertMsg(pDisk->u32Signature == VBOXHDDDISK_SIGNATURE, ("u32Signature=%08x\n", pDisk->u32Signature));
+
+        /* Lock the entire operation. */
+        rc2 = vdThreadStartWrite(pDisk);
+        AssertRC(rc2);
+        fLockWrite = true;
+
+        PVDFILTER pFilter = pDisk->pFilterTail;
+        while (VALID_PTR(pFilter))
+        {
+            PVDFILTER pPrev = pFilter->pPrev;
+            vdRemoveFilterFromList(pDisk, pFilter);
+
+            rc2 = pFilter->pBackend->pfnDestroy(pFilter->pvBackendData);
+            if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+                rc = rc2;
+            /* Free remaining resources related to the image. */
+            RTMemFree(pFilter);
+            pFilter = pPrev;
+        }
+        Assert(!VALID_PTR(pDisk->pFilterTail));
+    } while (0);
+
+    if (RT_UNLIKELY(fLockWrite))
+    {
+        rc2 = vdThreadFinishWrite(pDisk);
+        AssertRC(rc2);
+    }
+
+    LogFlowFunc(("returns %Rrc\n", rc));
+    return rc;
+}
+
+/**
  * Read data from virtual HDD.
  *
  * @returns VBox status code.
diff --git a/src/VBox/Storage/VDBackends.h b/src/VBox/Storage/VDBackends.h
new file mode 100644
index 0000000..1c2dd08
--- /dev/null
+++ b/src/VBox/Storage/VDBackends.h
@@ -0,0 +1,44 @@
+/* $Id: VDBackends.h $ */
+/** @file
+ * VD - builtin backends.
+ */
+
+/*
+ * Copyright (C) 2014 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/*******************************************************************************
+*   Header Files                                                               *
+*******************************************************************************/
+#ifndef ___VDBackends_h
+#define ___VDBackends_h
+
+#include <VBox/vd-plugin.h>
+
+RT_C_DECLS_BEGIN
+
+extern const VBOXHDDBACKEND g_RawBackend;
+extern const VBOXHDDBACKEND g_VmdkBackend;
+extern const VBOXHDDBACKEND g_VDIBackend;
+extern const VBOXHDDBACKEND g_VhdBackend;
+extern const VBOXHDDBACKEND g_ParallelsBackend;
+extern const VBOXHDDBACKEND g_DmgBackend;
+extern const VBOXHDDBACKEND g_ISCSIBackend;
+extern const VBOXHDDBACKEND g_QedBackend;
+extern const VBOXHDDBACKEND g_QCowBackend;
+extern const VBOXHDDBACKEND g_VhdxBackend;
+
+extern const VDCACHEBACKEND g_VciCacheBackend;
+
+RT_C_DECLS_END
+
+#endif
+
diff --git a/src/VBox/Storage/VDI.cpp b/src/VBox/Storage/VDI.cpp
index 7cd47c2..6aeb135 100644
--- a/src/VBox/Storage/VDI.cpp
+++ b/src/VBox/Storage/VDI.cpp
@@ -30,6 +30,8 @@
 #include <iprt/string.h>
 #include <iprt/asm.h>
 
+#include "VDBackends.h"
+
 #define VDI_IMAGE_DEFAULT_BLOCK_SIZE _1M
 
 /** Macros for endianess conversion. */
@@ -3193,7 +3195,7 @@ static DECLCALLBACK(int) vdiRepair(const char *pszFilename, PVDINTERFACE pVDIfsD
     return rc;
 }
 
-VBOXHDDBACKEND g_VDIBackend =
+const VBOXHDDBACKEND g_VDIBackend =
 {
     /* pszBackendName */
     "VDI",
@@ -3206,8 +3208,6 @@ VBOXHDDBACKEND g_VDIBackend =
     s_aVdiFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     vdiCheckIfValid,
     /* pfnOpen */
@@ -3289,5 +3289,7 @@ VBOXHDDBACKEND g_VDIBackend =
     /* pfnResize */
     vdiResize,
     /* pfnRepair */
-    vdiRepair
+    vdiRepair,
+    /* pfnTraverseMetadata */
+    NULL
 };
diff --git a/src/VBox/Storage/VHD.cpp b/src/VBox/Storage/VHD.cpp
index 3017031..56ff842 100644
--- a/src/VBox/Storage/VHD.cpp
+++ b/src/VBox/Storage/VHD.cpp
@@ -31,6 +31,8 @@
 #include <iprt/path.h>
 #include <iprt/string.h>
 
+#include "VDBackends.h"
+
 #define VHD_RELATIVE_MAX_PATH 512
 #define VHD_ABSOLUTE_MAX_PATH 512
 
@@ -3179,7 +3181,7 @@ static DECLCALLBACK(int) vhdRepair(const char *pszFilename, PVDINTERFACE pVDIfsD
 }
 
 
-VBOXHDDBACKEND g_VhdBackend =
+const VBOXHDDBACKEND g_VhdBackend =
 {
     /* pszBackendName */
     "VHD",
@@ -3193,8 +3195,6 @@ VBOXHDDBACKEND g_VhdBackend =
     s_aVhdFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     vhdCheckIfValid,
     /* pfnOpen */
@@ -3276,5 +3276,7 @@ VBOXHDDBACKEND g_VhdBackend =
     /* pfnResize */
     vhdResize,
     /* pfnRepair */
-    vhdRepair
+    vhdRepair,
+    /* pfnTraverseMetadata */
+    NULL
 };
diff --git a/src/VBox/Storage/VHDX.cpp b/src/VBox/Storage/VHDX.cpp
index 35d99e8..4eaef10 100644
--- a/src/VBox/Storage/VHDX.cpp
+++ b/src/VBox/Storage/VHDX.cpp
@@ -30,6 +30,8 @@
 #include <iprt/uuid.h>
 #include <iprt/crc.h>
 
+#include "VDBackends.h"
+
 /*******************************************************************************
 *   On disk data structures                                                    *
 *******************************************************************************/
@@ -2430,7 +2432,7 @@ static void vhdxDump(void *pBackendData)
 }
 
 
-VBOXHDDBACKEND g_VhdxBackend =
+const VBOXHDDBACKEND g_VhdxBackend =
 {
     /* pszBackendName */
     "VHDX",
@@ -2442,8 +2444,6 @@ VBOXHDDBACKEND g_VhdxBackend =
     s_aVhdxFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     vhdxCheckIfValid,
     /* pfnOpen */
@@ -2525,5 +2525,7 @@ VBOXHDDBACKEND g_VhdxBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/Storage/VMDK.cpp b/src/VBox/Storage/VMDK.cpp
index edc6733..f749ee4 100644
--- a/src/VBox/Storage/VMDK.cpp
+++ b/src/VBox/Storage/VMDK.cpp
@@ -32,6 +32,8 @@
 #include <iprt/zip.h>
 #include <iprt/asm.h>
 
+#include "VDBackends.h"
+
 /*******************************************************************************
 *   Constants And Macros, Structures and Typedefs                              *
 *******************************************************************************/
@@ -6549,7 +6551,7 @@ static void vmdkDump(void *pBackendData)
 
 
 
-VBOXHDDBACKEND g_VmdkBackend =
+const VBOXHDDBACKEND g_VmdkBackend =
 {
     /* pszBackendName */
     "VMDK",
@@ -6563,8 +6565,6 @@ VBOXHDDBACKEND g_VmdkBackend =
     s_aVmdkFileExtensions,
     /* paConfigInfo */
     NULL,
-    /* hPlugin */
-    NIL_RTLDRMOD,
     /* pfnCheckIfValid */
     vmdkCheckIfValid,
     /* pfnOpen */
@@ -6646,5 +6646,7 @@ VBOXHDDBACKEND g_VmdkBackend =
     /* pfnResize */
     NULL,
     /* pfnRepair */
+    NULL,
+    /* pfnTraverseMetadata */
     NULL
 };
diff --git a/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp b/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp
index 4d51393..0f54fed 100644
--- a/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp
+++ b/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp
@@ -2712,6 +2712,8 @@ static DECLCALLBACK(int) cpumMsrRd_P6LastIntFromIp(PVMCPU pVCpu, uint32_t idMsr,
 static DECLCALLBACK(int) cpumMsrWr_P6LastIntFromIp(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
 {
     /** @todo implement last exception records. */
+    /* Note! On many CPUs, the high bit of the 0x000001dd register is always writable, even when the result is
+             a non-cannonical address. */
     return VINF_SUCCESS;
 }
 
diff --git a/src/VBox/VMM/VMMAll/TMAllCpu.cpp b/src/VBox/VMM/VMMAll/TMAllCpu.cpp
index 7dc770c..36da1ae 100644
--- a/src/VBox/VMM/VMMAll/TMAllCpu.cpp
+++ b/src/VBox/VMM/VMMAll/TMAllCpu.cpp
@@ -80,6 +80,51 @@ int tmCpuTickResume(PVM pVM, PVMCPU pVCpu)
 
 
 /**
+ * Resumes the CPU timestamp counter ticking.
+ *
+ * @returns VINF_SUCCESS or VERR_TM_VIRTUAL_TICKING_IPE (asserted).
+ * @param   pVM     Pointer to the VM. 
+ * @param   pVCpu   Pointer to the VCPU. 
+ */
+int tmCpuTickResumeLocked(PVM pVM, PVMCPU pVCpu)
+{
+    if (!pVCpu->tm.s.fTSCTicking)
+    {
+        /* TSC must be ticking before calling tmCpuTickGetRawVirtual()! */
+        pVCpu->tm.s.fTSCTicking = true;
+        if (pVM->tm.s.fTSCVirtualized)
+        {
+            uint32_t c = ASMAtomicIncU32(&pVM->tm.s.cTSCsTicking);
+            AssertMsgReturn(c <= pVM->cCpus, ("%u vs %u\n", c, pVM->cCpus), VERR_TM_VIRTUAL_TICKING_IPE);
+            if (c == 1)
+            {
+                /* The first VCPU to resume. */
+                uint64_t    offTSCRawSrcOld = pVCpu->tm.s.offTSCRawSrc;
+
+                STAM_COUNTER_INC(&pVM->tm.s.StatTSCResume);
+
+                /* When resuming, use the TSC value of the last stopped VCPU to avoid the TSC going back. */
+                if (pVM->tm.s.fTSCUseRealTSC)
+                    pVCpu->tm.s.offTSCRawSrc = ASMReadTSC() - pVM->tm.s.u64LastPausedTSC;
+                else
+                    pVCpu->tm.s.offTSCRawSrc = tmCpuTickGetRawVirtual(pVM, false /* don't check for pending timers */)
+                                             - pVM->tm.s.u64LastPausedTSC;
+
+                /* Calculate the offset for other VCPUs to use. */
+                pVM->tm.s.offTSCPause = pVCpu->tm.s.offTSCRawSrc - offTSCRawSrcOld;
+            }
+            else
+            {
+                /* All other VCPUs (if any). */
+                pVCpu->tm.s.offTSCRawSrc += pVM->tm.s.offTSCPause;
+            }
+        }
+    }
+    return VINF_SUCCESS;
+}
+
+
+/**
  * Pauses the CPU timestamp counter ticking.
  *
  * @returns VBox status code.
@@ -98,6 +143,37 @@ int tmCpuTickPause(PVMCPU pVCpu)
     return VERR_TM_TSC_ALREADY_PAUSED;
 }
 
+
+/**
+ * Pauses the CPU timestamp counter ticking.
+ *
+ * @returns VBox status code.
+ * @param   pVM         Pointer to the VM. 
+ * @param   pVCpu       Pointer to the VMCPU.
+ * @internal
+ */
+int tmCpuTickPauseLocked(PVM pVM, PVMCPU pVCpu)
+{
+    if (pVCpu->tm.s.fTSCTicking)
+    {
+        pVCpu->tm.s.u64TSC = TMCpuTickGetNoCheck(pVCpu);
+        pVCpu->tm.s.fTSCTicking = false;
+
+        uint32_t c = ASMAtomicDecU32(&pVM->tm.s.cTSCsTicking);
+        AssertMsgReturn(c < pVM->cCpus, ("%u vs %u\n", c, pVM->cCpus), VERR_TM_VIRTUAL_TICKING_IPE);
+        if (c == 0)
+        {
+            /* When the last TSC stops, remember the value. */
+            STAM_COUNTER_INC(&pVM->tm.s.StatTSCPause);
+            pVM->tm.s.u64LastPausedTSC = pVCpu->tm.s.u64TSC;
+        }
+        return VINF_SUCCESS;
+    }
+    AssertFailed();
+    return VERR_TM_TSC_ALREADY_PAUSED;
+}
+
+
 /**
  * Record why we refused to use offsetted TSC.
  *
diff --git a/src/VBox/VMM/VMMR0/GMMR0.cpp b/src/VBox/VMM/VMMR0/GMMR0.cpp
index aa0cd61..1139004 100644
--- a/src/VBox/VMM/VMMR0/GMMR0.cpp
+++ b/src/VBox/VMM/VMMR0/GMMR0.cpp
@@ -164,6 +164,7 @@
 #ifdef VBOX_STRICT
 # include <iprt/crc.h>
 #endif
+#include <iprt/critsect.h>
 #include <iprt/list.h>
 #include <iprt/mem.h>
 #include <iprt/memobj.h>
@@ -174,6 +175,19 @@
 
 
 /*******************************************************************************
+*   Defined Constants And Macros                                               *
+*******************************************************************************/
+/** @def VBOX_USE_CRIT_SECT_FOR_GIANT
+ * Use a critical section instead of a fast mutex for the giant GMM lock.
+ *
+ * @remarks This is primarily a way of avoiding the deadlock checks in the
+ *          windows driver verifier. */
+#if defined(RT_OS_WINDOWS) || defined(DOXYGEN_RUNNING)
+# define VBOX_USE_CRIT_SECT_FOR_GIANT
+#endif
+
+
+/*******************************************************************************
 *   Structures and Typedefs                                                    *
 *******************************************************************************/
 /** Pointer to set of free chunks.  */
@@ -475,9 +489,15 @@ typedef struct GMM
     uint32_t            u32Magic;
     /** The number of threads waiting on the mutex. */
     uint32_t            cMtxContenders;
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    /** The critical section protecting the GMM.
+     * More fine grained locking can be implemented later if necessary. */
+    RTCRITSECT          GiantCritSect;
+#else
     /** The fast mutex protecting the GMM.
      * More fine grained locking can be implemented later if necessary. */
     RTSEMFASTMUTEX      hMtx;
+#endif
 #ifdef VBOX_STRICT
     /** The current mutex owner. */
     RTNATIVETHREAD      hMtxOwner;
@@ -757,7 +777,11 @@ GMMR0DECL(int) GMMR0Init(void)
     RTListInit(&pGMM->ChunkList);
     ASMBitSet(&pGMM->bmChunkId[0], NIL_GMM_CHUNKID);
 
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    int rc = RTCritSectInit(&pGMM->GiantCritSect);
+#else
     int rc = RTSemFastMutexCreate(&pGMM->hMtx);
+#endif
     if (RT_SUCCESS(rc))
     {
         unsigned iMtx;
@@ -815,7 +839,11 @@ GMMR0DECL(int) GMMR0Init(void)
          */
         while (iMtx-- > 0)
             RTSemFastMutexDestroy(pGMM->aChunkMtx[iMtx].hMtx);
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+        RTCritSectDelete(&pGMM->GiantCritSect);
+#else
         RTSemFastMutexDestroy(pGMM->hMtx);
+#endif
     }
 
     pGMM->u32Magic = 0;
@@ -850,8 +878,12 @@ GMMR0DECL(void) GMMR0Term(void)
     /* Destroy the fundamentals. */
     g_pGMM = NULL;
     pGMM->u32Magic    = ~GMM_MAGIC;
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    RTCritSectDelete(&pGMM->GiantCritSect);
+#else
     RTSemFastMutexDestroy(pGMM->hMtx);
     pGMM->hMtx        = NIL_RTSEMFASTMUTEX;
+#endif
 
     /* Free any chunks still hanging around. */
     RTAvlU32Destroy(&pGMM->pChunks, gmmR0TermDestroyChunk, pGMM);
@@ -932,7 +964,11 @@ GMMR0DECL(void) GMMR0InitPerVMData(PGVM pGVM)
 static int gmmR0MutexAcquire(PGMM pGMM)
 {
     ASMAtomicIncU32(&pGMM->cMtxContenders);
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    int rc = RTCritSectEnter(&pGMM->GiantCritSect);
+#else
     int rc = RTSemFastMutexRequest(pGMM->hMtx);
+#endif
     ASMAtomicDecU32(&pGMM->cMtxContenders);
     AssertRC(rc);
 #ifdef VBOX_STRICT
@@ -953,8 +989,12 @@ static int gmmR0MutexRelease(PGMM pGMM)
 #ifdef VBOX_STRICT
     pGMM->hMtxOwner = NIL_RTNATIVETHREAD;
 #endif
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    int rc = RTCritSectLeave(&pGMM->GiantCritSect);
+#else
     int rc = RTSemFastMutexRelease(pGMM->hMtx);
     AssertRC(rc);
+#endif
     return rc;
 }
 
@@ -990,11 +1030,19 @@ static bool gmmR0MutexYield(PGMM pGMM, uint64_t *puLockNanoTS)
     pGMM->hMtxOwner = NIL_RTNATIVETHREAD;
 #endif
     ASMAtomicIncU32(&pGMM->cMtxContenders);
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    int rc1 = RTCritSectLeave(&pGMM->GiantCritSect); AssertRC(rc1);
+#else
     int rc1 = RTSemFastMutexRelease(pGMM->hMtx); AssertRC(rc1);
+#endif
 
     RTThreadYield();
 
+#ifdef VBOX_USE_CRIT_SECT_FOR_GIANT
+    int rc2 = RTCritSectEnter(&pGMM->GiantCritSect); AssertRC(rc2);
+#else
     int rc2 = RTSemFastMutexRequest(pGMM->hMtx); AssertRC(rc2);
+#endif
     *puLockNanoTS = RTTimeSystemNanoTS();
     ASMAtomicDecU32(&pGMM->cMtxContenders);
 #ifdef VBOX_STRICT
diff --git a/src/VBox/VMM/VMMR0/HMSVMR0.cpp b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
index c65e143..8738755 100644
--- a/src/VBox/VMM/VMMR0/HMSVMR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
@@ -1357,11 +1357,11 @@ static void hmR0SvmLoadGuestMsrs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pCtx)
      * AMD-V requires guest EFER.SVME to be set. Weird.                                                                                 .
      * See AMD spec. 15.5.1 "Basic Operation" | "Canonicalization and Consistency Checks".
      */
-    if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR))
+    if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_EFER_MSR))
     {
         pVmcb->guest.u64EFER = pCtx->msrEFER | MSR_K6_EFER_SVME;
         pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
-        HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
+        HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_EFER_MSR);
     }
 
     /* 64-bit MSRs. */
@@ -1810,7 +1810,8 @@ static int hmR0SvmLoadGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
                           | HM_CHANGED_GUEST_SYSENTER_ESP_MSR
                           | HM_CHANGED_SVM_RESERVED1            /* Reserved. */
                           | HM_CHANGED_SVM_RESERVED2
-                          | HM_CHANGED_SVM_RESERVED3);
+                          | HM_CHANGED_SVM_RESERVED3
+                          | HM_CHANGED_SVM_RESERVED4);
 
     /* All the guest state bits should be loaded except maybe the host context and/or shared host/guest bits. */
     AssertMsg(   !HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_ALL_GUEST)
@@ -4297,7 +4298,7 @@ HMSVM_EXIT_DECL hmR0SvmExitMsr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTr
             HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_APIC_STATE);
         }
         else if (pCtx->ecx == MSR_K6_EFER)
-            HMCPU_CF_SET(pVCpu, HM_CHANGED_SVM_GUEST_EFER_MSR);
+            HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_EFER_MSR);
         else if (pCtx->ecx == MSR_IA32_TSC)
             pSvmTransient->fUpdateTscOffsetting = true;
     }
diff --git a/src/VBox/VMM/VMMR0/HMVMXR0.cpp b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
index afd8325..8a9c1e8 100644
--- a/src/VBox/VMM/VMMR0/HMVMXR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
@@ -42,6 +42,7 @@
 #define HMVMX_ALWAYS_TRAP_ALL_XCPTS
 #define HMVMX_ALWAYS_TRAP_PF
 #define HMVMX_ALWAYS_SWAP_FPU_STATE
+#define HMVMX_ALWAYS_SWAP_EFER
 #endif
 
 
@@ -1151,6 +1152,72 @@ static void hmR0VmxSetMsrPermission(PVMCPU pVCpu, uint32_t uMsr, VMXMSREXITREAD
 }
 
 
+#ifdef VBOX_STRICT
+/**
+ * Verifies whether the guest/host MSR pairs in the auto-load/store area in the
+ * VMCS are correct.
+ *
+ * @param   pVCpu       Pointer to the VMCPU.
+ */
+static void hmR0VmxCheckAutoLoadStoreMsrs(PVMCPU pVCpu)
+{
+    Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
+
+    uint32_t cHostMsrs  = pVCpu->hm.s.vmx.cHostMsrs;
+    uint32_t cGuestMsrs = pVCpu->hm.s.vmx.cGuestMsrs;
+    AssertMsgReturnVoid(cHostMsrs == cGuestMsrs, ("cGuestMsrs=%u cHostMsrs=%u\n", cGuestMsrs, cHostMsrs));
+
+    /* Verify MSR counts in the VMCS are what we think it should be.  */
+    uint32_t cMsrs;
+    int rc = VMXReadVmcs32(VMX_VMCS32_CTRL_ENTRY_MSR_LOAD_COUNT, &cMsrs);  AssertRC(rc);
+    AssertMsgReturnVoid(cMsrs == cHostMsrs, ("EntryMsrLd: cMsrs=%u cHostMsrs=%u cGuestMsrs=%u\n", cMsrs, cHostMsrs, cGuestMsrs));
+
+    rc = VMXReadVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT, &cMsrs);      AssertRC(rc);
+    AssertMsgReturnVoid(cMsrs == cHostMsrs, ("ExitMsrSt: cMsrs=%u cHostMsrs=%u cGuestMsrs=%u\n", cMsrs, cHostMsrs, cGuestMsrs));
+
+    rc = VMXReadVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT, &cMsrs);       AssertRC(rc);
+    AssertMsgReturnVoid(cMsrs == cHostMsrs, ("ExitMsrLd: cMsrs=%u cHostMsrs=%u cGuestMsrs=%u\n", cMsrs, cHostMsrs, cGuestMsrs));
+
+    PVMXAUTOMSR pHostMsr  = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvHostMsr;
+    PVMXAUTOMSR pGuestMsr = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvGuestMsr;
+    for (uint32_t i = 0; i < cMsrs; i++, pHostMsr++, pGuestMsr++)
+    {
+        /* Verify that the MSRs are paired properly and that the host MSR has the correct value. */
+        AssertMsgReturnVoid(pHostMsr->u32Msr == pGuestMsr->u32Msr, ("HostMsr=%#RX32 GuestMsr=%#RX32 cMsrs=%u\n", pHostMsr->u32Msr,
+                                                                    pGuestMsr->u32Msr, cMsrs));
+
+        uint64_t u64Msr = ASMRdMsr(pHostMsr->u32Msr);
+        AssertMsgReturnVoid(pHostMsr->u64Value == u64Msr, ("u32Msr=%#RX32 VMCS Value=%#RX64 ASMRdMsr=%#RX64 cMsrs=%u\n",
+                                                           pHostMsr->u32Msr, pHostMsr->u64Value, u64Msr, cMsrs));
+
+        /** @todo Verify that the permissions are as expected in the MSR bitmap. */
+    }
+}
+
+
+/**
+ * Verifies that our cached host EFER value has not changed
+ * since we cached it.
+ *
+ * @param pVCpu         Pointer to the VMCPU.
+ */
+static void hmR0VmxCheckVmcsHostEferMsr(PVMCPU pVCpu)
+{
+    Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
+
+    if (pVCpu->hm.s.vmx.u32ExitCtls & VMX_VMCS_CTRL_EXIT_LOAD_HOST_EFER_MSR)
+    {
+        uint64_t u64Val;
+        int rc = VMXReadVmcs64(VMX_VMCS64_HOST_FIELD_EFER_FULL, &u64Val);
+        AssertRC(rc);
+
+        uint64_t u64HostEferMsr = ASMRdMsr(MSR_K6_EFER);
+        AssertMsgReturnVoid(u64HostEferMsr == u64Val, ("u64HostEferMsr=%#RX64 u64Val=%#RX64\n", u64HostEferMsr, u64Val));
+    }
+}
+#endif /* VBOX_STRICT */
+
+
 /**
  * Flushes the TLB using EPT.
  *
@@ -2170,6 +2237,18 @@ VMMR0DECL(int) VMXR0SetupVM(PVM pVM)
         return rc;
     }
 
+    /* Check if we can use the VMCS controls for swapping the EFER MSR. */
+    Assert(!pVM->hm.s.vmx.fSupportsVmcsEfer);
+#if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
+    if (   HMVMX_IS_64BIT_HOST_MODE()
+        && (pVM->hm.s.vmx.Msrs.VmxEntry.n.allowed1 & VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_EFER_MSR)
+        && (pVM->hm.s.vmx.Msrs.VmxExit.n.allowed1  & VMX_VMCS_CTRL_EXIT_LOAD_HOST_EFER_MSR)
+        && (pVM->hm.s.vmx.Msrs.VmxExit.n.allowed1  & VMX_VMCS_CTRL_EXIT_SAVE_GUEST_EFER_MSR))
+    {
+        pVM->hm.s.vmx.fSupportsVmcsEfer = true;
+    }
+#endif
+
     for (VMCPUID i = 0; i < pVM->cCpus; i++)
     {
         PVMCPU pVCpu = &pVM->aCpus[i];
@@ -2516,6 +2595,178 @@ DECLINLINE(int) hmR0VmxSaveHostSegmentRegs(PVM pVM, PVMCPU pVCpu)
 }
 
 
+#ifdef VBOX_WITH_AUTO_MSR_LOAD_RESTORE
+/**
+ * Figures out if we need to swap the EFER MSR which is
+ * particularly expensive.
+ *
+ * We check all relevant bits. For now, that's everything
+ * besides LMA/LME, as these two bits are handled by VM-entry,
+ * see hmR0VmxLoadGuestExitCtls() and
+ * hmR0VMxLoadGuestEntryCtls().
+ *
+ * @returns true if we need to load guest EFER, false otherwise.
+ * @param   pVCpu       Pointer to the VMCPU.
+ * @param   pMixedCtx   Pointer to the guest-CPU context. The data may be
+ *                      out-of-sync. Make sure to update the required fields
+ *                      before using them.
+ *
+ * @remarks Requires EFER, CR4.
+ * @remarks No-long-jump zone!!!
+ */
+static bool hmR0VmxShouldSwapEferMsr(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
+{
+#ifdef HMVMX_ALWAYS_SWAP_EFER
+    return true;
+#endif
+
+#if HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
+    /* For 32-bit hosts running 64-bit guests, we always swap EFER in the world-switcher. Nothing to do here. */
+    if (CPUMIsGuestInLongMode(pVCpu))
+        return false;
+#endif
+
+    PVM      pVM          = pVCpu->CTX_SUFF(pVM);
+    uint64_t u64HostEfer  = pVM->hm.s.vmx.u64HostEfer;
+    uint64_t u64GuestEfer = pMixedCtx->msrEFER;
+
+    /*
+     * For 64-bit guests, if EFER.SCE bit differs, we need to swap to ensure that the
+     * guest's SYSCALL behaviour isn't screwed. See @bugref{7386}.
+     */
+    if (   CPUMIsGuestInLongMode(pVCpu)
+        && (u64GuestEfer & MSR_K6_EFER_SCE) != (u64HostEfer & MSR_K6_EFER_SCE))
+    {
+        return true;
+    }
+
+    /*
+     * If the guest uses PAE and EFER.NXE bit differs, we need to swap EFER as it                    .
+     * affects guest paging. 64-bit paging implies CR4.PAE as well.
+     * See Intel spec. 4.5 "IA-32e Paging" and Intel spec. 4.1.1 "Three Paging Modes".
+     */
+    if (   (pMixedCtx->cr4 & X86_CR4_PAE)
+        && (pMixedCtx->cr0 & X86_CR0_PG)
+        && (u64GuestEfer & MSR_K6_EFER_NXE) != (u64HostEfer & MSR_K6_EFER_NXE))
+    {
+        /* Assert that host is PAE capable. */
+        Assert(pVM->hm.s.cpuid.u32AMDFeatureEDX & X86_CPUID_EXT_FEATURE_EDX_NX);
+        return true;
+    }
+
+    /** @todo Check the latest Intel spec. for any other bits,
+     *        like SMEP/SMAP? */
+    return false;
+}
+
+
+/**
+ * Adds a new (or updates the value of an existing) host MSR to
+ * be swapped during the world-switch as part of the
+ * auto-load/store MSR area in the VMCS.
+ *
+ * @param   pVCpu           Pointer to the VMCPU.
+ * @param   uMsr            The MSR.
+ * @param   uHostMsr        Value of the host MSR.
+ */
+static int hmR0VmxAddAutoLoadStoreHostMsr(PVMCPU pVCpu, uint32_t uMsr, uint64_t uHostMsrValue)
+{
+    PVMXAUTOMSR pHostMsr  = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvHostMsr;
+    uint32_t    cMsrs     = pVCpu->hm.s.vmx.cHostMsrs;
+    uint32_t    i;
+    for (i = 0; i < cMsrs; i++)
+    {
+        if (pHostMsr->u32Msr == uMsr)
+            break;
+        pHostMsr++;
+    }
+
+    if (i == cMsrs)
+    {
+        ++cMsrs;
+
+        /* Shouldn't ever happen but there -is- a number. We're well within the recommended 512. */
+        PVM pVM = pVCpu->CTX_SUFF(pVM);
+        if (RT_UNLIKELY(cMsrs > MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)))
+        {
+            LogRel(("cHostMsrs=%u Cpu=%u\n", cMsrs, (unsigned)MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)));
+            pVCpu->hm.s.u32HMError = VMX_UFC_INSUFFICIENT_HOST_MSR_STORAGE;
+            return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO;
+        }
+
+        /* Update VCPU's copy of the host MSR count. */
+        pVCpu->hm.s.vmx.cHostMsrs = cMsrs;
+        int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT, cMsrs);
+        AssertRCReturn(rc, rc);
+    }
+
+    /* Update the MSR values in the auto-load/store MSR area. */
+    pHostMsr->u32Msr      = uMsr;
+    pHostMsr->u32Reserved = 0;
+    pHostMsr->u64Value    = uHostMsrValue;
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * Removes a host MSR to be swapped during the world-switch from the
+ * auto-load/store MSR area in the VMCS.
+ *
+ * @returns VBox status code.
+ * @param   pVCpu       Pointer to the VMCPU.
+ * @param   uMsr        The MSR.
+ */
+static int hmR0VmxRemoveAutoLoadStoreHostMsr(PVMCPU pVCpu, uint32_t uMsr)
+{
+    PVMXAUTOMSR pHostMsr = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvHostMsr;
+    uint32_t    cMsrs     = pVCpu->hm.s.vmx.cHostMsrs;
+    for (uint32_t i = 0; i < cMsrs; i++)
+    {
+        /* Find the MSR. */
+        if (pHostMsr->u32Msr == uMsr)
+        {
+            /* If it's the last MSR, simply reduce the count. */
+            if (i == cMsrs - 1)
+            {
+                --cMsrs;
+                break;
+            }
+
+            /* Remove it by swapping the last MSR in place of it, and reducing the count. */
+            PVMXAUTOMSR pLastHostMsr = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvHostMsr;
+            pLastHostMsr            += cMsrs - 1;
+            pHostMsr->u32Msr         = pLastHostMsr->u32Msr;
+            pHostMsr->u64Value       = pLastHostMsr->u64Value;
+            --cMsrs;
+            break;
+        }
+        pHostMsr++;
+    }
+
+    /* Update the VMCS if the count changed (meaning the MSR was found). */
+    if (cMsrs != pVCpu->hm.s.vmx.cHostMsrs)
+    {
+        /* Shouldn't ever happen but there -is- a number. We're well within the recommended 512. */
+        PVM pVM = pVCpu->CTX_SUFF(pVM);
+        if (RT_UNLIKELY(cMsrs > MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)))
+        {
+            LogRel(("cHostMsrs=%u Cpu=%u\n", cMsrs, (unsigned)MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)));
+            pVCpu->hm.s.u32HMError = VMX_UFC_INSUFFICIENT_HOST_MSR_STORAGE;
+            return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO;
+        }
+
+        /* Update VCPU's copy of the host MSR count. */
+        pVCpu->hm.s.vmx.cHostMsrs = cMsrs;
+        int rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT, cMsrs);
+        AssertRCReturn(rc, rc);
+        return VINF_SUCCESS;
+    }
+
+    return VERR_NOT_FOUND;
+}
+#endif /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
+
+
 /**
  * Saves certain host MSRs in the VM-Exit MSR-load area and some in the
  * host-state area of the VMCS. Theses MSRs will be automatically restored on
@@ -2532,99 +2783,43 @@ DECLINLINE(int) hmR0VmxSaveHostMsrs(PVM pVM, PVMCPU pVCpu)
 
     int rc = VINF_SUCCESS;
 #ifdef VBOX_WITH_AUTO_MSR_LOAD_RESTORE
-    PVMXAUTOMSR  pHostMsr       = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvHostMsr;
-    uint32_t     cHostMsrs      = 0;
-    uint32_t     u32HostExtFeatures = pVM->hm.s.cpuid.u32AMDFeatureEDX;
-
+    uint32_t u32HostExtFeatures = pVM->hm.s.cpuid.u32AMDFeatureEDX;
     if (u32HostExtFeatures & (X86_CPUID_EXT_FEATURE_EDX_NX | X86_CPUID_EXT_FEATURE_EDX_LONG_MODE))
     {
-        uint64_t u64HostEfer = ASMRdMsr(MSR_K6_EFER);
-
-# if HC_ARCH_BITS == 64
-        /* Paranoia. 64-bit code requires these bits to be set always. */
-        Assert((u64HostEfer & (MSR_K6_EFER_LMA | MSR_K6_EFER_LME)) == (MSR_K6_EFER_LMA | MSR_K6_EFER_LME));
-
-        /*
-         * We currently do not save/restore host EFER, we just make sure it doesn't get modified by VT-x operation.
-         * All guest accesses (read, write) on EFER cause VM-exits. If we are to conditionally load the guest EFER for
-         * some reason (e.g. allow transparent reads) we would activate the code below.
-         */
-#  if 0
-        /* All our supported 64-bit host platforms must have NXE bit set. Otherwise we can change the below code to save EFER. */
-        Assert(u64HostEfer & (MSR_K6_EFER_NXE));
-        /* The SCE bit is only applicable in 64-bit mode. Save EFER if it doesn't match what the guest has.
-           See Intel spec. 30.10.4.3 "Handling the SYSCALL and SYSRET Instructions". */
-        if (CPUMIsGuestInLongMode(pVCpu))
+        uint64_t u64HostEfer = pVM->hm.s.vmx.u64HostEfer;
+# if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
+        if (   HMVMX_IS_64BIT_HOST_MODE()
+            && pVM->hm.s.vmx.fSupportsVmcsEfer)
         {
-            uint64_t u64GuestEfer;
-            rc = CPUMQueryGuestMsr(pVCpu, MSR_K6_EFER, &u64GuestEfer);
-            AssertRC(rc);
-
-            if ((u64HostEfer & MSR_K6_EFER_SCE) != (u64GuestEfer & MSR_K6_EFER_SCE))
-            {
-                pHostMsr->u32Msr      = MSR_K6_EFER;
-                pHostMsr->u32Reserved = 0;
-                pHostMsr->u64Value    = u64HostEfer;
-                pHostMsr++; cHostMsrs++;
-            }
+            rc = VMXWriteVmcs64(VMX_VMCS64_HOST_FIELD_EFER_FULL, pVM->hm.s.vmx.u64HostEfer);
+            AssertRCReturn(rc, rc);
         }
-#  endif
-# else  /* HC_ARCH_BITS != 64 */
-        pHostMsr->u32Msr      = MSR_K6_EFER;
-        pHostMsr->u32Reserved = 0;
-# if HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
+        /* else if: !HMVMX_IS_64BIT_HOST_MODE()
+           VMXR0SetupVM() ensures darwin 32-bit/PAE kernels can't execute 64-bit guests. */
+# elif HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
         if (CPUMIsGuestInLongMode(pVCpu))
         {
             /* Must match the EFER value in our 64 bits switcher. */
-            pHostMsr->u64Value = u64HostEfer | MSR_K6_EFER_LME | MSR_K6_EFER_SCE | MSR_K6_EFER_NXE;
+            u64HostEfer |= MSR_K6_EFER_LME | MSR_K6_EFER_SCE | MSR_K6_EFER_NXE;
         }
-        else
-#  endif
-            pHostMsr->u64Value = u64HostEfer;
-        pHostMsr++; cHostMsrs++;
-# endif  /* HC_ARCH_BITS == 64 */
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K6_EFER, u64HostEfer);
+# endif  /* HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL) */
     }
 
 # if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
     if (HMVMX_IS_64BIT_HOST_MODE())
     {
-        pHostMsr->u32Msr       = MSR_K6_STAR;
-        pHostMsr->u32Reserved  = 0;
-        pHostMsr->u64Value     = ASMRdMsr(MSR_K6_STAR);              /* legacy syscall eip, cs & ss */
-        pHostMsr++; cHostMsrs++;
-        pHostMsr->u32Msr       = MSR_K8_LSTAR;
-        pHostMsr->u32Reserved  = 0;
-        pHostMsr->u64Value     = ASMRdMsr(MSR_K8_LSTAR);             /* 64-bit mode syscall rip */
-        pHostMsr++; cHostMsrs++;
-        pHostMsr->u32Msr       = MSR_K8_SF_MASK;
-        pHostMsr->u32Reserved  = 0;
-        pHostMsr->u64Value     = ASMRdMsr(MSR_K8_SF_MASK);           /* syscall flag mask */
-        pHostMsr++; cHostMsrs++;
-        pHostMsr->u32Msr      = MSR_K8_KERNEL_GS_BASE;
-        pHostMsr->u32Reserved = 0;
-        pHostMsr->u64Value    = ASMRdMsr(MSR_K8_KERNEL_GS_BASE);     /* swapgs exchange value */
-        pHostMsr++; cHostMsrs++;
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K6_STAR,           ASMRdMsr(MSR_K6_STAR));
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K8_LSTAR,          ASMRdMsr(MSR_K8_LSTAR));
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K8_SF_MASK,        ASMRdMsr(MSR_K8_SF_MASK));
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K8_KERNEL_GS_BASE, ASMRdMsr(MSR_K8_KERNEL_GS_BASE));
     }
 # endif
 
     /* Host TSC AUX MSR must be restored since we always load/store guest TSC AUX MSR. */
     if (pVCpu->hm.s.vmx.u32ProcCtls2 & VMX_VMCS_CTRL_PROC_EXEC2_RDTSCP)
-    {
-        pHostMsr->u32Msr      = MSR_K8_TSC_AUX;
-        pHostMsr->u32Reserved = 0;
-        pHostMsr->u64Value    = ASMRdMsr(MSR_K8_TSC_AUX);
-        pHostMsr++; cHostMsrs++;
-    }
-
-    /* Shouldn't ever happen but there -is- a number. We're well within the recommended 512. */
-    if (RT_UNLIKELY(cHostMsrs > MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)))
-    {
-        LogRel(("cHostMsrs=%u Cpu=%u\n", cHostMsrs, (unsigned)MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc)));
-        pVCpu->hm.s.u32HMError = VMX_UFC_INSUFFICIENT_HOST_MSR_STORAGE;
-        return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO;
-    }
-
-    rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_LOAD_COUNT, cHostMsrs);
+        hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K8_TSC_AUX, ASMRdMsr(MSR_K8_TSC_AUX));
+    Log4(("hmR0VmxSaveHostMsrs: cHostMSrs=%u\n", pVCpu->hm.s.vmx.cHostMsrs));
 #endif  /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
 
     /*
@@ -2656,8 +2851,8 @@ DECLINLINE(int) hmR0VmxSaveHostMsrs(PVM pVM, PVMCPU pVCpu)
 #endif
     AssertRCReturn(rc, rc);
 
-    /** @todo IA32_PERF_GLOBALCTRL, IA32_PAT, IA32_EFER, also see
-     *        hmR0VmxSetupExitCtls() !! */
+    /** @todo IA32_PERF_GLOBALCTRL, IA32_PAT also
+     *        see hmR0VmxSetupExitCtls() !! */
     return rc;
 }
 
@@ -2689,10 +2884,21 @@ DECLINLINE(int) hmR0VmxLoadGuestEntryCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
 
         /* Set if the guest is in long mode. This will set/clear the EFER.LMA bit on VM-entry. */
         if (CPUMIsGuestInLongModeEx(pMixedCtx))
+        {
             val |= VMX_VMCS_CTRL_ENTRY_IA32E_MODE_GUEST;
+            Log4(("Load: VMX_VMCS_CTRL_ENTRY_IA32E_MODE_GUEST\n"));
+        }
         else
             Assert(!(val & VMX_VMCS_CTRL_ENTRY_IA32E_MODE_GUEST));
 
+        /* If the CPU supports the newer VMCS controls for managing guest/host EFER, use it. */
+        if (   pVM->hm.s.vmx.fSupportsVmcsEfer
+            && hmR0VmxShouldSwapEferMsr(pVCpu, pMixedCtx))
+        {
+            val |= VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_EFER_MSR;
+            Log4(("Load: VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_EFER_MSR\n"));
+        }
+
         /*
          * The following should -not- be set (since we're not in SMM mode):
          * - VMX_VMCS_CTRL_ENTRY_ENTRY_SMM
@@ -2700,8 +2906,7 @@ DECLINLINE(int) hmR0VmxLoadGuestEntryCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
          */
 
         /** @todo VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_PERF_MSR,
-         *        VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_PAT_MSR,
-         *        VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_EFER_MSR */
+         *        VMX_VMCS_CTRL_ENTRY_LOAD_GUEST_PAT_MSR. */
 
         if ((val & zap) != val)
         {
@@ -2752,24 +2957,38 @@ DECLINLINE(int) hmR0VmxLoadGuestExitCtls(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
          */
 #if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
         if (HMVMX_IS_64BIT_HOST_MODE())
+        {
             val |= VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE;
+            Log4(("Load: VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE\n"));
+        }
         else
             Assert(!(val & VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE));
-#elif HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS)
+#else
         if (CPUMIsGuestInLongModeEx(pMixedCtx))
-            val |= VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE;    /* The switcher goes to long mode. */
+        {
+            /* The switcher returns to long mode, EFER is managed by the switcher. */
+            val |= VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE;
+            Log4(("Load: VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE\n"));
+        }
         else
             Assert(!(val & VMX_VMCS_CTRL_EXIT_HOST_ADDR_SPACE_SIZE));
-#endif
+#endif  /* HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL) */
+
+        /* If the newer VMCS fields for managing EFER exists, use it. */
+        if (   pVM->hm.s.vmx.fSupportsVmcsEfer
+            && hmR0VmxShouldSwapEferMsr(pVCpu, pMixedCtx))
+        {
+            val |=   VMX_VMCS_CTRL_EXIT_SAVE_GUEST_EFER_MSR
+                   | VMX_VMCS_CTRL_EXIT_LOAD_HOST_EFER_MSR;
+            Log4(("Load: VMX_VMCS_CTRL_EXIT_SAVE_GUEST_EFER_MSR, VMX_VMCS_CTRL_EXIT_LOAD_HOST_EFER_MSR\n"));
+        }
 
         /* Don't acknowledge external interrupts on VM-exit. We want to let the host do that. */
         Assert(!(val & VMX_VMCS_CTRL_EXIT_ACK_EXT_INT));
 
         /** @todo VMX_VMCS_CTRL_EXIT_LOAD_PERF_MSR,
          *        VMX_VMCS_CTRL_EXIT_SAVE_GUEST_PAT_MSR,
-         *        VMX_VMCS_CTRL_EXIT_LOAD_HOST_PAT_MSR,
-         *        VMX_VMCS_CTRL_EXIT_SAVE_GUEST_EFER_MSR,
-         *        VMX_VMCS_CTRL_EXIT_LOAD_HOST_EFER_MSR. */
+         *        VMX_VMCS_CTRL_EXIT_LOAD_HOST_PAT_MSR. */
 
         if (pVM->hm.s.vmx.Msrs.VmxExit.n.allowed1 & VMX_VMCS_CTRL_EXIT_SAVE_VMX_PREEMPT_TIMER)
             val |= VMX_VMCS_CTRL_EXIT_SAVE_VMX_PREEMPT_TIMER;
@@ -4051,6 +4270,19 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
     AssertPtr(pVCpu);
     AssertPtr(pVCpu->hm.s.vmx.pvGuestMsr);
 
+    PVM pVM = pVCpu->CTX_SUFF(pVM);
+
+    /*
+     * When we don't have VMCS controls for managing EFER, we need to ensure we reconstruct the
+     * entire list of MSRs, otherwise we risk not removing EFER when it's no longer needed or we
+     * need to hardcode & make sure that EFER is always the last auto-load/store MSR which is ugly.
+     */
+    if (   !pVM->hm.s.vmx.fSupportsVmcsEfer
+        && HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_EFER_MSR | HM_CHANGED_VMX_GUEST_AUTO_MSRS))
+    {
+        HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_EFER_MSR | HM_CHANGED_VMX_GUEST_AUTO_MSRS);
+    }
+
     /*
      * MSRs covered by Auto-load/store: EFER, LSTAR, STAR, SF_MASK, TSC_AUX (RDTSCP).
      */
@@ -4058,7 +4290,6 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
     if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS))
     {
 #ifdef VBOX_WITH_AUTO_MSR_LOAD_RESTORE
-        PVM         pVM        = pVCpu->CTX_SUFF(pVM);
         PVMXAUTOMSR pGuestMsr  = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvGuestMsr;
         uint32_t    cGuestMsrs = 0;
 
@@ -4068,18 +4299,21 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
         bool fSupportsLongMode = CPUMGetGuestCpuIdFeature(pVM, CPUMCPUIDFEATURE_LONG_MODE);
         if (fSupportsLongMode)
         {
-            pGuestMsr->u32Msr      = MSR_K8_LSTAR;
-            pGuestMsr->u32Reserved = 0;
-            pGuestMsr->u64Value    = pMixedCtx->msrLSTAR;           /* 64 bits mode syscall rip */
-            pGuestMsr++; cGuestMsrs++;
             pGuestMsr->u32Msr      = MSR_K6_STAR;
             pGuestMsr->u32Reserved = 0;
             pGuestMsr->u64Value    = pMixedCtx->msrSTAR;            /* legacy syscall eip, cs & ss */
             pGuestMsr++; cGuestMsrs++;
+
+            pGuestMsr->u32Msr      = MSR_K8_LSTAR;
+            pGuestMsr->u32Reserved = 0;
+            pGuestMsr->u64Value    = pMixedCtx->msrLSTAR;           /* 64 bits mode syscall rip */
+            pGuestMsr++; cGuestMsrs++;
+
             pGuestMsr->u32Msr      = MSR_K8_SF_MASK;
             pGuestMsr->u32Reserved = 0;
             pGuestMsr->u64Value    = pMixedCtx->msrSFMASK;          /* syscall flag mask */
             pGuestMsr++; cGuestMsrs++;
+
             pGuestMsr->u32Msr      = MSR_K8_KERNEL_GS_BASE;
             pGuestMsr->u32Reserved = 0;
             pGuestMsr->u64Value    = pMixedCtx->msrKERNELGSBASE;    /* swapgs exchange value */
@@ -4110,6 +4344,7 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
         pVCpu->hm.s.vmx.cGuestMsrs = cGuestMsrs;
         rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_MSR_LOAD_COUNT, cGuestMsrs);          AssertRCReturn(rc, rc);
         rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT, cGuestMsrs);          AssertRCReturn(rc, rc);
+        Log4(("Load: Auto Guest MSRs. cGUestMsrs=%u\n", pVCpu->hm.s.vmx.cGuestMsrs));
 #endif  /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
 
         HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
@@ -4138,6 +4373,64 @@ static int hmR0VmxLoadGuestMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
         HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_SYSENTER_ESP_MSR);
     }
 
+    if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_EFER_MSR))
+    {
+        if (hmR0VmxShouldSwapEferMsr(pVCpu, pMixedCtx))
+        {
+            /*
+             * If the CPU supports VMCS controls for swapping EFER, use it. Otherwise, we have no option
+             * but to use the auto-load store MSR area in the VMCS for swapping EFER. See @bugref{7368}.
+             */
+            if (pVM->hm.s.vmx.fSupportsVmcsEfer)
+            {
+                rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_EFER_FULL, pMixedCtx->msrEFER);
+                AssertRCReturn(rc,rc);
+                Log4(("Load: VMX_VMCS64_GUEST_EFER_FULL=%#RX64\n", pMixedCtx->msrEFER));
+            }
+            else
+            {
+                /*
+                 * Add guest EFER to the auto-load/store MSR area in the VMCS.
+                 */
+                PVMXAUTOMSR pGuestMsr  = (PVMXAUTOMSR)pVCpu->hm.s.vmx.pvGuestMsr;
+                uint32_t cGuestMsrs    = pVCpu->hm.s.vmx.cGuestMsrs;
+                pGuestMsr += cGuestMsrs;
+
+                pGuestMsr->u32Msr      = MSR_K6_EFER;
+                pGuestMsr->u32Reserved = 0;
+                pGuestMsr->u64Value    = pMixedCtx->msrEFER;
+                pGuestMsr++; cGuestMsrs++;
+
+                if (cGuestMsrs > MSR_IA32_VMX_MISC_MAX_MSR(pVM->hm.s.vmx.Msrs.u64Misc))
+                {
+                    LogRel(("CPU autoload/store MSR count in VMCS exceeded (2) cGuestMsrs=%u.\n", cGuestMsrs));
+                    pVCpu->hm.s.u32HMError = VMX_UFC_INSUFFICIENT_GUEST_MSR_STORAGE;
+                    return VERR_HM_UNSUPPORTED_CPU_FEATURE_COMBO;
+                }
+
+                /* Update the VCPU's copy of the guest MSR count. */
+                pVCpu->hm.s.vmx.cGuestMsrs = cGuestMsrs;
+                rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_ENTRY_MSR_LOAD_COUNT, cGuestMsrs);          AssertRCReturn(rc, rc);
+                rc = VMXWriteVmcs32(VMX_VMCS32_CTRL_EXIT_MSR_STORE_COUNT, cGuestMsrs);          AssertRCReturn(rc, rc);
+
+                Log4(("Load: MSR[--]: u32Msr=%#RX32 u64Value=%#RX64 cMsrs=%u\n", MSR_K6_EFER, pMixedCtx->msrEFER,
+                      pVCpu->hm.s.vmx.cGuestMsrs));
+
+                /*
+                 * Add/update host EFER in the auto-load/store MSR area in the VMCS.
+                 */
+                hmR0VmxAddAutoLoadStoreHostMsr(pVCpu, MSR_K6_EFER, pVM->hm.s.vmx.u64HostEfer);
+            }
+        }
+        else if (!pVM->hm.s.vmx.fSupportsVmcsEfer)
+            hmR0VmxRemoveAutoLoadStoreHostMsr(pVCpu, MSR_K6_EFER);
+
+        AssertMsg(pVCpu->hm.s.vmx.cHostMsrs == pVCpu->hm.s.vmx.cGuestMsrs,
+                  ("cHostMsrs=%u cGuestMsrs=%u\n", pVCpu->hm.s.vmx.cHostMsrs, pVCpu->hm.s.vmx.cGuestMsrs));
+
+        HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_EFER_MSR);
+    }
+
     return rc;
 }
 
@@ -7768,6 +8061,10 @@ static void hmR0VmxPreRunGuestCommitted(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCt
         ASMWrMsr(MSR_K8_TSC_AUX, u64HostTscAux);
     }
 #endif
+#ifdef VBOX_STRICT
+    hmR0VmxCheckVmcsHostEferMsr(pVCpu);
+    hmR0VmxCheckAutoLoadStoreMsrs(pVCpu);
+#endif
 }
 
 
@@ -9598,7 +9895,11 @@ HMVMX_EXIT_DECL hmR0VmxExitWrmsr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT
             HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_APIC_STATE);
         }
         else if (pMixedCtx->ecx == MSR_K6_EFER)         /* EFER is the only MSR we auto-load but don't allow write-passthrough. */
-            HMCPU_CF_SET(pVCpu, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
+        {
+            HMCPU_CF_SET(pVCpu,   HM_CHANGED_GUEST_EFER_MSR
+                                | HM_CHANGED_VMX_ENTRY_CTLS
+                                | HM_CHANGED_VMX_EXIT_CTLS);
+        }
         else if (pMixedCtx->ecx == MSR_IA32_TSC)        /* Windows 7 does this during bootup. See @bugref{6398}. */
             pVmxTransient->fUpdateTscOffsettingAndPreemptTimer = true;
 
diff --git a/src/VBox/VMM/VMMR3/EM.cpp b/src/VBox/VMM/VMMR3/EM.cpp
index 024cbec..6ee8cbf 100644
--- a/src/VBox/VMM/VMMR3/EM.cpp
+++ b/src/VBox/VMM/VMMR3/EM.cpp
@@ -2550,14 +2550,23 @@ VMMR3_INT_DECL(int) EMR3ExecuteVM(PVM pVM, PVMCPU pVCpu)
                     {
                         rc = VMR3WaitHalted(pVM, pVCpu, false /*fIgnoreInterrupts*/);
                         if (   rc == VINF_SUCCESS
-                            && VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
+                            && VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC
+                                                        | VMCPU_FF_INTERRUPT_NMI  | VMCPU_FF_INTERRUPT_SMI))
                         {
                             Log(("EMR3ExecuteVM: Triggering reschedule on pending IRQ after MWAIT\n"));
                             rc = VINF_EM_RESCHEDULE;
                         }
                     }
                     else
+                    {
                         rc = VMR3WaitHalted(pVM, pVCpu, !(CPUMGetGuestEFlags(pVCpu) & X86_EFL_IF));
+                        if (   rc == VINF_SUCCESS
+                            && VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_NMI | VMCPU_FF_INTERRUPT_SMI))
+                        {
+                            Log(("EMR3ExecuteVM: Triggering reschedule on pending NMI/SMI after HLT\n"));
+                            rc = VINF_EM_RESCHEDULE;
+                        }
+                    }
 
                     STAM_REL_PROFILE_STOP(&pVCpu->em.s.StatHalted, y);
                     break;
diff --git a/src/VBox/VMM/VMMR3/HM.cpp b/src/VBox/VMM/VMMR3/HM.cpp
index a950fe4..6f5af91 100644
--- a/src/VBox/VMM/VMMR3/HM.cpp
+++ b/src/VBox/VMM/VMMR3/HM.cpp
@@ -351,12 +351,13 @@ VMMR3_INT_DECL(int) HMR3Init(PVM pVM)
     /*
      * Misc initialisation.
      */
-    //pVM->hm.s.vmx.fSupported = false;
-    //pVM->hm.s.svm.fSupported = false;
-    //pVM->hm.s.vmx.fEnabled   = false;
-    //pVM->hm.s.svm.fEnabled   = false;
-    //pVM->hm.s.fNestedPaging  = false;
-
+#if 0
+    pVM->hm.s.vmx.fSupported = false;
+    pVM->hm.s.svm.fSupported = false;
+    pVM->hm.s.vmx.fEnabled   = false;
+    pVM->hm.s.svm.fEnabled   = false;
+    pVM->hm.s.fNestedPaging  = false;
+#endif
 
     /*
      * Read configuration.
@@ -1259,6 +1260,7 @@ static int hmR3InitFinalizeR0Intel(PVM pVM)
         return VMSetError(pVM, rc, RT_SRC_POS, "VT-x setup failed: %Rrc", rc);
     }
 
+    LogRel(("HM: Supports VMCS EFER fields       = %RTbool\n", pVM->hm.s.vmx.fSupportsVmcsEfer));
     LogRel(("HM: VMX enabled!\n"));
     pVM->hm.s.vmx.fEnabled = true;
 
diff --git a/src/VBox/VMM/VMMR3/PDM.cpp b/src/VBox/VMM/VMMR3/PDM.cpp
index 652875c..3579f40 100644
--- a/src/VBox/VMM/VMMR3/PDM.cpp
+++ b/src/VBox/VMM/VMMR3/PDM.cpp
@@ -642,6 +642,27 @@ VMMR3_INT_DECL(int) PDMR3Term(PVM pVM)
     {
         pdmR3TermLuns(pVM, pUsbIns->Internal.s.pLuns, pUsbIns->pReg->szName, pUsbIns->iInstance);
 
+        /*
+         * Detach it from the HUB (if it's actually attached to one) so the HUB has
+         * a chance to stop accessing any data.
+         */
+        PPDMUSBHUB pHub = pUsbIns->Internal.s.pHub;
+        if (pHub)
+        {
+            int rc = pHub->Reg.pfnDetachDevice(pHub->pDrvIns, pUsbIns, pUsbIns->Internal.s.iPort);
+            if (RT_FAILURE(rc))
+            {
+                LogRel(("PDM: Failed to detach USB device '%s' instance %d from %p: %Rrc\n",
+                        pUsbIns->pReg->szName, pUsbIns->iInstance, pHub, rc));
+            }
+            else
+            {
+                pHub->cAvailablePorts++;
+                Assert(pHub->cAvailablePorts > 0 && pHub->cAvailablePorts <= pHub->cPorts);
+                pUsbIns->Internal.s.pHub = NULL;
+            }
+        }
+
         if (pUsbIns->pReg->pfnDestruct)
         {
             LogFlow(("pdmR3DevTerm: Destroying - device '%s'/%d\n",
diff --git a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
index fd56de9..3e22938 100644
--- a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
+++ b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
@@ -3035,7 +3035,7 @@ static DECLCALLBACK(int) pdmR3DevHlp_IOAPICRegister(PPDMDEVINS pDevIns, PPDMIOAP
 
     if (pIoApicReg->pszSendMsiR0)
     {
-        int rc = pdmR3DevGetSymbolR0Lazy(pDevIns, pIoApicReg->pszSetIrqR0, &pVM->pdm.s.IoApic.pfnSendMsiR0);
+        int rc = pdmR3DevGetSymbolR0Lazy(pDevIns, pIoApicReg->pszSendMsiR0, &pVM->pdm.s.IoApic.pfnSendMsiR0);
         AssertMsgRC(rc, ("%s::%s rc=%Rrc\n", pDevIns->pReg->szR0Mod, pIoApicReg->pszSendMsiR0, rc));
         if (RT_FAILURE(rc))
         {
diff --git a/src/VBox/VMM/VMMR3/PDMDevice.cpp b/src/VBox/VMM/VMMR3/PDMDevice.cpp
index e7e33ce..789c330 100644
--- a/src/VBox/VMM/VMMR3/PDMDevice.cpp
+++ b/src/VBox/VMM/VMMR3/PDMDevice.cpp
@@ -987,7 +987,7 @@ VMMR3DECL(int) PDMR3DriverDetach(PUVM pUVM, const char *pszDevice, unsigned iDev
                                  const char *pszDriver, unsigned iOccurance, uint32_t fFlags)
 {
     LogFlow(("PDMR3DriverDetach: pszDevice=%p:{%s} iDevIns=%u iLun=%u pszDriver=%p:{%s} iOccurance=%u fFlags=%#x\n",
-             pszDevice, pszDevice, iDevIns, iLun, pszDriver, iOccurance, fFlags));
+             pszDevice, pszDevice, iDevIns, iLun, pszDriver, pszDriver, iOccurance, fFlags));
     UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     PVM pVM = pUVM->pVM;
     VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE);
diff --git a/src/VBox/VMM/VMMR3/TM.cpp b/src/VBox/VMM/VMMR3/TM.cpp
index 4391ea4..f6f6c8e 100644
--- a/src/VBox/VMM/VMMR3/TM.cpp
+++ b/src/VBox/VMM/VMMR3/TM.cpp
@@ -697,6 +697,8 @@ VMM_INT_DECL(int) TMR3Init(PVM pVM)
     STAM_REG(pVM, &pVM->tm.s.StatTSCWarp,                             STAMTYPE_COUNTER, "/TM/TSC/Intercept/Warp",              STAMUNIT_OCCURENCES, "Warpdrive is active.");
     STAM_REG(pVM, &pVM->tm.s.StatTSCSet,                              STAMTYPE_COUNTER, "/TM/TSC/Sets",                        STAMUNIT_OCCURENCES, "Calls to TMCpuTickSet.");
     STAM_REG(pVM, &pVM->tm.s.StatTSCUnderflow,                        STAMTYPE_COUNTER, "/TM/TSC/Underflow",                   STAMUNIT_OCCURENCES, "TSC underflow; corrected with last seen value .");
+    STAM_REG(pVM, &pVM->tm.s.StatVirtualPause,                        STAMTYPE_COUNTER, "/TM/TSC/Pause",                       STAMUNIT_OCCURENCES, "The number of times the TSC was paused.");
+    STAM_REG(pVM, &pVM->tm.s.StatVirtualResume,                       STAMTYPE_COUNTER, "/TM/TSC/Resume",                      STAMUNIT_OCCURENCES, "The number of times the TSC was resumed.");
 #endif /* VBOX_WITH_STATISTICS */
 
     for (VMCPUID i = 0; i < pVM->cCpus; i++)
@@ -1153,6 +1155,7 @@ static DECLCALLBACK(int) tmR3Save(PVM pVM, PSSMHANDLE pSSM)
     }
     Assert(!pVM->tm.s.cVirtualTicking);
     Assert(!pVM->tm.s.fVirtualSyncTicking);
+    Assert(!pVM->tm.s.cTSCsTicking);
 #endif
 
     /*
@@ -1204,6 +1207,7 @@ static DECLCALLBACK(int) tmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, u
     }
     Assert(!pVM->tm.s.cVirtualTicking);
     Assert(!pVM->tm.s.fVirtualSyncTicking);
+    Assert(!pVM->tm.s.cTSCsTicking);
 #endif
 
     /*
@@ -1260,12 +1264,17 @@ static DECLCALLBACK(int) tmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, u
     }
 
     /* the cpu tick clock. */
+    pVM->tm.s.cTSCsTicking = 0;
+    pVM->tm.s.offTSCPause = 0;
+    pVM->tm.s.u64LastPausedTSC = 0;
     for (VMCPUID i = 0; i < pVM->cCpus; i++)
     {
         PVMCPU pVCpu = &pVM->aCpus[i];
 
         pVCpu->tm.s.fTSCTicking = false;
         SSMR3GetU64(pSSM, &pVCpu->tm.s.u64TSC);
+        if (pVM->tm.s.u64LastPausedTSC < pVCpu->tm.s.u64TSC)
+            pVM->tm.s.u64LastPausedTSC = pVCpu->tm.s.u64TSC;
 
         if (pVM->tm.s.fTSCUseRealTSC)
             pVCpu->tm.s.offTSCRawSrc = 0; /** @todo TSC restore stuff and HWACC. */
@@ -2675,11 +2684,16 @@ VMMR3DECL(int) TMR3NotifySuspend(PVM pVM, PVMCPU pVCpu)
 
     /*
      * Pause the TSC last since it is normally linked to the virtual
-     * sync clock, so the above code may actually stop both clock.
+     * sync clock, so the above code may actually stop both clocks.
      */
-    rc = tmCpuTickPause(pVCpu);
-    if (RT_FAILURE(rc))
-        return rc;
+    if (!pVM->tm.s.fTSCTiedToExecution)
+    {
+        TM_LOCK_TIMERS(pVM);    /* Exploit the timer lock for synchronization. */
+        rc = tmCpuTickPauseLocked(pVM, pVCpu);
+        TM_UNLOCK_TIMERS(pVM);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
 
 #ifndef VBOX_WITHOUT_NS_ACCOUNTING
     /*
@@ -2723,7 +2737,9 @@ VMMR3DECL(int) TMR3NotifyResume(PVM pVM, PVMCPU pVCpu)
      */
     if (!pVM->tm.s.fTSCTiedToExecution)
     {
-        rc = tmCpuTickResume(pVM, pVCpu);
+        TM_LOCK_TIMERS(pVM);    /* Exploit the timer lock for synchronization. */
+        rc = tmCpuTickResumeLocked(pVM, pVCpu);
+        TM_UNLOCK_TIMERS(pVM);
         if (RT_FAILURE(rc))
             return rc;
     }
diff --git a/src/VBox/VMM/VMMR3/TRPM.cpp b/src/VBox/VMM/VMMR3/TRPM.cpp
index 656f215..8c12949 100644
--- a/src/VBox/VMM/VMMR3/TRPM.cpp
+++ b/src/VBox/VMM/VMMR3/TRPM.cpp
@@ -1561,18 +1561,15 @@ VMMR3DECL(int) TRPMR3InjectEvent(PVM pVM, PVMCPU pVCpu, TRPMEVENT enmEvent)
             return HMR3IsActive(pVCpu) ? VINF_EM_RESCHEDULE_HM : VINF_EM_RESCHEDULE_REM; /* (Heed the halted state if this is changed!) */
         }
 #else /* !TRPM_FORWARD_TRAPS_IN_GC */
-        if (HMR3IsActive(pVCpu))
+        uint8_t u8Interrupt;
+        int rc = PDMGetInterrupt(pVCpu, &u8Interrupt);
+        Log(("TRPMR3InjectEvent: u8Interrupt=%d (%#x) rc=%Rrc\n", u8Interrupt, u8Interrupt, rc));
+        if (RT_SUCCESS(rc))
         {
-            uint8_t u8Interrupt;
-            int rc = PDMGetInterrupt(pVCpu, &u8Interrupt);
-            Log(("TRPMR3InjectEvent: u8Interrupt=%d (%#x) rc=%Rrc\n", u8Interrupt, u8Interrupt, rc));
-            if (RT_SUCCESS(rc))
-            {
-                rc = TRPMAssertTrap(pVCpu, u8Interrupt, TRPM_HARDWARE_INT);
-                AssertRC(rc);
-                STAM_COUNTER_INC(&pVM->trpm.s.paStatForwardedIRQR3[u8Interrupt]);
-                return VINF_EM_RESCHEDULE_HM;
-            }
+            rc = TRPMAssertTrap(pVCpu, u8Interrupt, TRPM_HARDWARE_INT);
+            AssertRC(rc);
+            STAM_COUNTER_INC(&pVM->trpm.s.paStatForwardedIRQR3[u8Interrupt]);
+            return HMR3IsActive(pVCpu) ? VINF_EM_RESCHEDULE_HM : VINF_EM_RESCHEDULE_REM;
         }
 #endif /* !TRPM_FORWARD_TRAPS_IN_GC */
     }
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h
index 7e4c6f5..1de7709 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i5_3570.h
@@ -93,8 +93,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i5_3570[] =
     MVX(0x00000140, "I7_IB_UNK_0000_0140", 0, 0, UINT64_C(0xfffffffffffffffe)),
     MVX(0x00000142, "I7_IB_UNK_0000_0142", 0, 0, UINT64_C(0xfffffffffffffffc)),
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x10 */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffffff`8159cbe0 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0x0 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0xffffffff`8159cbe0 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0xc09, 0, 0), /* value=0xc09 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, 0, UINT64_C(0xfffffffffffffff8)), /* value=0x0 */
     RSN(0x00000186, 0x0000018d, "IA32_PERFEVTSELn", Ia32PerfEvtSelN, Ia32PerfEvtSelN, 0x0, 0, UINT64_C(0xffffffff00080000)),
@@ -121,8 +121,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i5_3570[] =
     MFX(0x000001d9, "IA32_DEBUGCTL", Ia32DebugCtl, Ia32DebugCtl, 0, 0, UINT64_C(0xffffffffffff803c)), /* value=0x0 */
     MFO(0x000001db, "P6_LAST_BRANCH_FROM_IP", P6LastBranchFromIp), /* value=0x7fffffff`a061f4c9 */
     MFO(0x000001dc, "P6_LAST_BRANCH_TO_IP", P6LastBranchToIp), /* value=0xffffffff`810473c0 */
-    MFX(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp, 0, 0, UINT64_C(0x7fff800000000000)), /* value=0x0 */
-    MFX(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp), /* value=0x0 */
+    MFN(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp), /* value=0x0 */
     MFO(0x000001f0, "I7_VLW_CAPABILITY", IntelI7VirtualLegacyWireCap), /* value=0x74 */
     MFO(0x000001f2, "IA32_SMRR_PHYSBASE", Ia32SmrrPhysBase), /* value=0xdb000006 */
     MFO(0x000001f3, "IA32_SMRR_PHYSMASK", Ia32SmrrPhysMask), /* value=0xff800800 */
@@ -213,7 +213,7 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i5_3570[] =
     MFX(0x0000048f, "IA32_VMX_TRUE_EXIT_CTLS", Ia32VmxTrueExitCtls, ReadOnly, UINT64_C(0x7fffff00036dfb), 0, 0), /* value=0x7fffff`00036dfb */
     MFX(0x00000490, "IA32_VMX_TRUE_ENTRY_CTLS", Ia32VmxTrueEntryCtls, ReadOnly, UINT64_C(0xffff000011fb), 0, 0), /* value=0xffff`000011fb */
     RSN(0x000004c1, 0x000004c8, "IA32_A_PMCn", Ia32PmcN, Ia32PmcN, 0x0, 0, UINT64_C(0xffff000000000000)),
-    MFX(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffff8804`07da1cc0 */
+    MFN(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea), /* value=0xffff8804`07da1cc0 */
     MFX(0x00000601, "I7_SB_MSR_VR_CURRENT_CONFIG", IntelI7SandyVrCurrentConfig, IntelI7SandyVrCurrentConfig, 0, UINT32_C(0x80001fff), 0x7fffe000), /* value=0x18141494`80000380 */
     MVX(0x00000602, "I7_IB_UNK_0000_0602", UINT64_C(0x1814149480000170), UINT32_C(0x80001fff), 0x7fffe000),
     MFX(0x00000603, "I7_SB_MSR_VR_MISC_CONFIG", IntelI7SandyVrMiscConfig, IntelI7SandyVrMiscConfig, 0, UINT32_C(0x80ffffff), UINT64_C(0xffffffff7f000000)), /* value=0x802c2c2c */
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h
index 72ab084..42567f8 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_2635QM.h
@@ -93,8 +93,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_2635QM[] =
     MFN(0x00000134, "CPUID80000001_FEATURE_MASK", IntelCpuId80000001FeatureMaskEcdx, IntelCpuId80000001FeatureMaskEcdx), /* value=0xffffffff`ffffffff */
     MFX(0x0000013c, "I7_SB_AES_NI_CTL", IntelI7SandyAesNiCtl, IntelI7SandyAesNiCtl, 0, 0, UINT64_C(0xfffffffffffffffc)), /* value=0x0 */
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0xb */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`22904080 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`222f3030 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0xffffff80`22904080 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0xffffff80`222f3030 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0xc09, 0, 0), /* value=0xc09 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, 0, UINT64_C(0xfffffffffffffff8)), /* value=0x0 */
     RSN(0x00000186, 0x00000189, "IA32_PERFEVTSELn", Ia32PerfEvtSelN, Ia32PerfEvtSelN, 0x0, 0, UINT64_C(0xffffffff00080000)),
@@ -121,8 +121,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_2635QM[] =
     MFX(0x000001d9, "IA32_DEBUGCTL", Ia32DebugCtl, Ia32DebugCtl, 0, 0, UINT64_C(0xffffffffffff803c)), /* value=0x0 */
     MFO(0x000001db, "P6_LAST_BRANCH_FROM_IP", P6LastBranchFromIp), /* value=0x7fffff7f`a4a6e188 */
     MFO(0x000001dc, "P6_LAST_BRANCH_TO_IP", P6LastBranchToIp), /* value=0xffffff80`222d5ad0 */
-    MFX(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp, 0, 0, UINT64_C(0x7fff800000000000)), /* value=0x0 */
-    MFX(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp), /* value=0x0 */
+    MFN(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp), /* value=0x0 */
     MVO(0x000001e1, "I7_SB_UNK_0000_01e1", 0x2),
     MFO(0x000001f0, "I7_VLW_CAPABILITY", IntelI7VirtualLegacyWireCap), /* value=0x74 */
     MFO(0x000001f2, "IA32_SMRR_PHYSBASE", Ia32SmrrPhysBase), /* value=0x0 */
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3820QM.h b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3820QM.h
index 0e7905e..6738392 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3820QM.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3820QM.h
@@ -96,8 +96,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3820QM[] =
     MVX(0x00000140, "I7_IVY_UNK_0000_0140", 0, 0, UINT64_C(0xfffffffffffffffe)),
     MVX(0x00000142, "I7_IVY_UNK_0000_0142", 0, 0, UINT64_C(0xfffffffffffffffc)),
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0xb */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`21af5080 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`214ce720 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0xffffff80`21af5080 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0xffffff80`214ce720 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0xc09, 0, 0), /* value=0xc09 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, 0, UINT64_C(0xfffffffffffffff8)), /* value=0x0 */
     RSN(0x00000186, 0x00000189, "IA32_PERFEVTSELn", Ia32PerfEvtSelN, Ia32PerfEvtSelN, 0, 0, UINT64_C(0xffffffff00080000)),
@@ -124,8 +124,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3820QM[] =
     MFX(0x000001d9, "IA32_DEBUGCTL", Ia32DebugCtl, Ia32DebugCtl, 0, 0, UINT64_C(0xffffffffffff803c)), /* value=0x0 */
     MFO(0x000001db, "P6_LAST_BRANCH_FROM_IP", P6LastBranchFromIp), /* value=0x7fffff7f`a38c2298 */
     MFO(0x000001dc, "P6_LAST_BRANCH_TO_IP", P6LastBranchToIp), /* value=0xffffff80`214b24e0 */
-    MFX(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp, 0, 0, UINT64_C(0x7fff800000000000)), /* value=0x0 */
-    MFX(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp), /* value=0x0 */
+    MFN(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp), /* value=0x0 */
     MVO(0x000001f0, "TODO_0000_01f0", 0x74),
     MVO(0x000001f2, "TODO_0000_01f2", UINT32_C(0x8b000006)),
     MVO(0x000001f3, "TODO_0000_01f3", UINT32_C(0xff800800)),
@@ -225,7 +225,7 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3820QM[] =
     MVX(0x000004c2, "TODO_0000_04c2", 0, 0, UINT64_C(0xffff000000000000)),
     MVX(0x000004c3, "TODO_0000_04c3", 0, 0, UINT64_C(0xffff000000000000)),
     MVX(0x000004c4, "TODO_0000_04c4", 0, 0, UINT64_C(0xffff000000000000)),
-    MFX(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea), /* value=0x0 */
     MVX(0x00000601, "TODO_0000_0601", UINT64_C(0x1814149480000380), UINT32_C(0x80001fff), 0x7fffe000),
     MVX(0x00000602, "TODO_0000_0602", UINT64_C(0x1814149480000170), UINT32_C(0x80001fff), 0x7fffe000),
     MVX(0x00000603, "TODO_0000_0603", UINT32_C(0x80303030), UINT32_C(0x80ffffff), UINT64_C(0xffffffff7f000000)),
@@ -338,12 +338,12 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3820QM[] =
     MVX(0x00000c83, "TODO_0000_0c83", 0, ~(uint64_t)UINT32_MAX, 0),
     MFX(0xc0000080, "AMD64_EFER", Amd64Efer, Amd64Efer, 0xd01, 0x400, UINT64_C(0xfffffffffffff2fe)),
     MFX(0xc0000081, "AMD64_STAR", Amd64SyscallTarget, Amd64SyscallTarget, 0, 0, 0), /* value=0x1b0008`00000000 */
-    MFX(0xc0000082, "AMD64_STAR64", Amd64LongSyscallTarget, Amd64LongSyscallTarget, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`214ce6c0 */
-    MFX(0xc0000083, "AMD64_STARCOMPAT", Amd64CompSyscallTarget, Amd64CompSyscallTarget, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0xc0000082, "AMD64_STAR64", Amd64LongSyscallTarget, Amd64LongSyscallTarget), /* value=0xffffff80`214ce6c0 */
+    MFN(0xc0000083, "AMD64_STARCOMPAT", Amd64CompSyscallTarget, Amd64CompSyscallTarget), /* value=0x0 */
     MFX(0xc0000084, "AMD64_SYSCALL_FLAG_MASK", Amd64SyscallFlagMask, Amd64SyscallFlagMask, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x4700 */
-    MFX(0xc0000100, "AMD64_FS_BASE", Amd64FsBase, Amd64FsBase, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
-    MFX(0xc0000101, "AMD64_GS_BASE", Amd64GsBase, Amd64GsBase, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff81`e942f000 */
-    MFX(0xc0000102, "AMD64_KERNEL_GS_BASE", Amd64KernelGsBase, Amd64KernelGsBase, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x7fff`7ccad1e0 */
+    MFN(0xc0000100, "AMD64_FS_BASE", Amd64FsBase, Amd64FsBase), /* value=0x0 */
+    MFN(0xc0000101, "AMD64_GS_BASE", Amd64GsBase, Amd64GsBase), /* value=0xffffff81`e942f000 */
+    MFN(0xc0000102, "AMD64_KERNEL_GS_BASE", Amd64KernelGsBase, Amd64KernelGsBase), /* value=0x7fff`7ccad1e0 */
     MFX(0xc0000103, "AMD64_TSC_AUX", Amd64TscAux, Amd64TscAux, 0, 0, ~(uint64_t)UINT32_MAX), /* value=0x0 */
 };
 #endif /* !CPUM_DB_STANDALONE */
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h
index 6f74686..c8a122c 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Core_i7_3960X.h
@@ -96,8 +96,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3960X[] =
     MFN(0x00000134, "CPUID80000001_FEATURE_MASK", IntelCpuId80000001FeatureMaskEcdx, IntelCpuId80000001FeatureMaskEcdx), /* value=0xffffffff`ffffffff */
     MFO(0x0000013c, "I7_SB_AES_NI_CTL", IntelI7SandyAesNiCtl), /* value=0x1 */
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x0 */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0x0 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0x0 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0xc12, 0, 0), /* value=0xc12 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, 0, UINT64_C(0xfffffffffffffff8)), /* value=0x0 */
     MFX(0x0000017f, "I7_SB_ERROR_CONTROL", IntelI7SandyErrorControl, IntelI7SandyErrorControl, 0, 0xc, UINT64_C(0xffffffffffffffe1)), /* value=0x0 */
@@ -124,8 +124,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3960X[] =
     MFX(0x000001d9, "IA32_DEBUGCTL", Ia32DebugCtl, Ia32DebugCtl, 0, 0, UINT64_C(0xffffffffffff803c)), /* value=0x0 */
     MFO(0x000001db, "P6_LAST_BRANCH_FROM_IP", P6LastBranchFromIp), /* value=0x7ffff880`093814ea */
     MFO(0x000001dc, "P6_LAST_BRANCH_TO_IP", P6LastBranchToIp), /* value=0xfffff880`093a60e0 */
-    MFX(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp, 0, 0, UINT64_C(0x7fff800000000000)), /* value=0x0 */
-    MFX(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp), /* value=0x0 */
+    MFN(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp), /* value=0x0 */
     MVO(0x000001e1, "I7_SB_UNK_0000_01e1", 0x2),
     MVX(0x000001ef, "I7_SB_UNK_0000_01ef", 0xff, 0, UINT64_MAX),
     MFO(0x000001f0, "I7_VLW_CAPABILITY", IntelI7VirtualLegacyWireCap), /* value=0x74 */
@@ -211,7 +211,7 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Core_i7_3960X[] =
     MFX(0x00000490, "IA32_VMX_TRUE_ENTRY_CTLS", Ia32VmxTrueEntryCtls, ReadOnly, UINT64_C(0xffff000011fb), 0, 0), /* value=0xffff`000011fb */
     RSN(0x000004c1, 0x000004c4, "IA32_A_PMCn", Ia32PmcN, Ia32PmcN, 0x0, 0, UINT64_C(0xffff000000000000)),
     MVO(0x00000502, "I7_SB_UNK_0000_0502", 0),
-    MFX(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea), /* value=0x0 */
     MFX(0x00000601, "I7_SB_MSR_VR_CURRENT_CONFIG", IntelI7SandyVrCurrentConfig, IntelI7SandyVrCurrentConfig, 0, UINT32_C(0x80001fff), 0x7fffe000), /* value=0x141494`80000640 */
     MFX(0x00000603, "I7_SB_MSR_VR_MISC_CONFIG", IntelI7SandyVrMiscConfig, IntelI7SandyVrMiscConfig, 0, UINT32_C(0x80ffffff), UINT64_C(0xffffffff7f000000)), /* value=0x80151515 */
     MFO(0x00000606, "I7_SB_MSR_RAPL_POWER_UNIT", IntelI7SandyRaplPowerUnit), /* value=0xa1003 */
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h b/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h
index d272330..be6f329 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Pentium_4_3_00GHz.h
@@ -69,8 +69,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Pentium_4_3_00GHz[] =
     MFX(0x000000fe, "IA32_MTRRCAP", Ia32MtrrCap, ReadOnly, 0x508, 0, 0), /* value=0x508 */
     MFX(0x00000119, "BBL_CR_CTL", IntelBblCrCtl, ReadOnly, 0, 0, 0), /* value=0x0 */
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x0 */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0x0 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0x0 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0x180204, 0, 0), /* value=0x180204 */
     MFN(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus), /* value=0x0 */
     MVX(0x00000180, "MSR_MCG_RAX", 0, 0, UINT64_MAX),
diff --git a/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h b/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h
index 45acf49..548f556 100644
--- a/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h
+++ b/src/VBox/VMM/VMMR3/cpus/Intel_Xeon_X5482_3_20GHz.h
@@ -107,8 +107,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Xeon_X5482_3_20GHz[] =
     MVX(0x0000015e, "C2_UNK_0000_015e", 0x6, 0, UINT64_C(0xfffffffffffffff0)),
     MFX(0x0000015f, "C1_DTS_CAL_CTRL", IntelCore1DtsCalControl, IntelCore1DtsCalControl, 0, UINT64_C(0xffffffffffc0ffff), 0), /* value=0x822 */
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0xb */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff82`0dce9190 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffff80`0d2ce720 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0xffffff82`0dce9190 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0xffffff80`0d2ce720 */
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0x806, 0, 0), /* value=0x806 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x0 */
     RSN(0x00000186, 0x00000187, "IA32_PERFEVTSELn", Ia32PerfEvtSelN, Ia32PerfEvtSelN, 0x0, 0, UINT64_C(0xffffffff00200000)),
@@ -132,8 +132,8 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Xeon_X5482_3_20GHz[] =
     MFX(0x000001d9, "IA32_DEBUGCTL", Ia32DebugCtl, Ia32DebugCtl, 0, 0, UINT64_C(0xffffffffffffa03c)), /* value=0x1 */
     MFO(0x000001db, "P6_LAST_BRANCH_FROM_IP", P6LastBranchFromIp), /* value=0xffffff7f`8f47ca6b */
     MFO(0x000001dc, "P6_LAST_BRANCH_TO_IP", P6LastBranchToIp), /* value=0xffffff80`0d2b24c0 */
-    MFX(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp, 0, 0x1, UINT64_C(0xffff800000000000)), /* value=0xffffff80`0d2ba20f */
-    MFX(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp, 0, 0x10, UINT64_C(0xffff800000000000)), /* value=0xffffff80`0d2ba200 */
+    MFN(0x000001dd, "P6_LAST_INT_FROM_IP", P6LastIntFromIp, P6LastIntFromIp), /* value=0xffffff80`0d2ba20f */
+    MFN(0x000001de, "P6_LAST_INT_TO_IP", P6LastIntToIp, P6LastIntToIp), /* value=0xffffff80`0d2ba200 */
     MVO(0x000001e0, "MSR_ROB_CR_BKUPTMPDR6", 0xff0),
     MFX(0x000001f8, "IA32_PLATFORM_DCA_CAP", Ia32PlatformDcaCap, Ia32PlatformDcaCap, 0, UINT64_C(0xfffffffffffffffe), 0), /* value=0x0 */
     MFO(0x000001f9, "IA32_CPU_DCA_CAP", Ia32CpuDcaCap), /* value=0x1 */
@@ -200,7 +200,7 @@ static CPUMMSRRANGE const g_aMsrRanges_Intel_Xeon_X5482_3_20GHz[] =
     MVX(0x00000591, "C2_UNK_0000_0591", 0, ~(uint64_t)UINT32_MAX, 0),
     MFX(0x000005a0, "C2_PECI_CTL", IntelCore2PeciControl, IntelCore2PeciControl, 0, UINT64_C(0xfffffffffffffffe), 0), /* value=0x1 */
     MVI(0x000005a1, "C2_UNK_0000_05a1", 0x1),
-    MFX(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
+    MFN(0x00000600, "IA32_DS_AREA", Ia32DsArea, Ia32DsArea), /* value=0x0 */
     MFX(0xc0000080, "AMD64_EFER", Amd64Efer, Amd64Efer, 0xd01, 0x400, UINT64_C(0xfffffffffffff2fe)),
     MFN(0xc0000081, "AMD64_STAR", Amd64SyscallTarget, Amd64SyscallTarget), /* value=0x1b0008`00000000 */
     MFN(0xc0000082, "AMD64_STAR64", Amd64LongSyscallTarget, Amd64LongSyscallTarget), /* value=0xffffff80`0d2ce6c0 */
diff --git a/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h b/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h
index 75d5e08..1c14391 100644
--- a/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h
+++ b/src/VBox/VMM/VMMR3/cpus/VIA_QuadCore_L4700_1_2_GHz.h
@@ -93,8 +93,8 @@ static CPUMMSRRANGE const g_aMsrRanges_VIA_QuadCore_L4700_1_2_GHz[] =
     MFX(0x0000011e, "BBL_CR_CTL3", IntelBblCrCtl3, IntelBblCrCtl3, 0, UINT64_MAX, 0), /* value=0x0 */
     RVI(0x0000011f, 0x00000173, "ZERO_0000_011f_THRU_0000_0173", 0),
     MFX(0x00000174, "IA32_SYSENTER_CS", Ia32SysEnterCs, Ia32SysEnterCs, 0, ~(uint64_t)UINT32_MAX, 0), /* value=0x10 */
-    MFX(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp, 0, 0, UINT64_C(0xffff800000000000)), /* value=0x0 */
-    MFX(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip, 0, 0, UINT64_C(0xffff800000000000)), /* value=0xffffffff`8166bfa0 */
+    MFN(0x00000175, "IA32_SYSENTER_ESP", Ia32SysEnterEsp, Ia32SysEnterEsp), /* value=0x0 */
+    MFN(0x00000176, "IA32_SYSENTER_EIP", Ia32SysEnterEip, Ia32SysEnterEip), /* value=0xffffffff`8166bfa0 */
     RVI(0x00000177, 0x00000178, "ZERO_0000_0177_THRU_0000_0178", 0),
     MFX(0x00000179, "IA32_MCG_CAP", Ia32McgCap, ReadOnly, 0, 0, 0), /* value=0x0 */
     MFX(0x0000017a, "IA32_MCG_STATUS", Ia32McgStatus, Ia32McgStatus, 0, UINT64_C(0xfffffffffffffff8), 0), /* value=0x0 */
diff --git a/src/VBox/VMM/include/HMInternal.h b/src/VBox/VMM/include/HMInternal.h
index fc1c953..662ac47 100644
--- a/src/VBox/VMM/include/HMInternal.h
+++ b/src/VBox/VMM/include/HMInternal.h
@@ -158,18 +158,19 @@ RT_C_DECLS_BEGIN
 #define HM_CHANGED_GUEST_SYSENTER_CS_MSR         RT_BIT(13)
 #define HM_CHANGED_GUEST_SYSENTER_EIP_MSR        RT_BIT(14)
 #define HM_CHANGED_GUEST_SYSENTER_ESP_MSR        RT_BIT(15)
+#define HM_CHANGED_GUEST_EFER_MSR                RT_BIT(16)
 /* VT-x specific state. */
-#define HM_CHANGED_VMX_GUEST_AUTO_MSRS           RT_BIT(16)
-#define HM_CHANGED_VMX_GUEST_ACTIVITY_STATE      RT_BIT(17)
-#define HM_CHANGED_VMX_GUEST_APIC_STATE          RT_BIT(18)
-#define HM_CHANGED_VMX_ENTRY_CTLS                RT_BIT(19)
-#define HM_CHANGED_VMX_EXIT_CTLS                 RT_BIT(20)
+#define HM_CHANGED_VMX_GUEST_AUTO_MSRS           RT_BIT(17)
+#define HM_CHANGED_VMX_GUEST_ACTIVITY_STATE      RT_BIT(18)
+#define HM_CHANGED_VMX_GUEST_APIC_STATE          RT_BIT(19)
+#define HM_CHANGED_VMX_ENTRY_CTLS                RT_BIT(20)
+#define HM_CHANGED_VMX_EXIT_CTLS                 RT_BIT(21)
 /* AMD-V specific state. */
-#define HM_CHANGED_SVM_GUEST_EFER_MSR            RT_BIT(16)
 #define HM_CHANGED_SVM_GUEST_APIC_STATE          RT_BIT(17)
 #define HM_CHANGED_SVM_RESERVED1                 RT_BIT(18)
 #define HM_CHANGED_SVM_RESERVED2                 RT_BIT(19)
 #define HM_CHANGED_SVM_RESERVED3                 RT_BIT(20)
+#define HM_CHANGED_SVM_RESERVED4                 RT_BIT(21)
 
 #define HM_CHANGED_ALL_GUEST                     (  HM_CHANGED_GUEST_CR0                \
                                                   | HM_CHANGED_GUEST_CR3                \
@@ -187,13 +188,14 @@ RT_C_DECLS_BEGIN
                                                   | HM_CHANGED_GUEST_SYSENTER_CS_MSR    \
                                                   | HM_CHANGED_GUEST_SYSENTER_EIP_MSR   \
                                                   | HM_CHANGED_GUEST_SYSENTER_ESP_MSR   \
+                                                  | HM_CHANGED_GUEST_EFER_MSR           \
                                                   | HM_CHANGED_VMX_GUEST_AUTO_MSRS      \
                                                   | HM_CHANGED_VMX_GUEST_ACTIVITY_STATE \
                                                   | HM_CHANGED_VMX_GUEST_APIC_STATE     \
                                                   | HM_CHANGED_VMX_ENTRY_CTLS           \
                                                   | HM_CHANGED_VMX_EXIT_CTLS)
 
-#define HM_CHANGED_HOST_CONTEXT                  RT_BIT(21)
+#define HM_CHANGED_HOST_CONTEXT                  RT_BIT(22)
 
 /* Bits shared between host and guest. */
 #define HM_CHANGED_HOST_GUEST_SHARED_STATE       (  HM_CHANGED_GUEST_CR0                \
@@ -421,6 +423,9 @@ typedef struct HM
 
         /** Host EFER value (set by ring-0 VMX init) */
         uint64_t                    u64HostEfer;
+        /** Whether the CPU supports VMCS fields for swapping EFER. */
+        bool                        fSupportsVmcsEfer;
+        bool                        afAlignment1[7];
 
         /** VMX MSR values */
         VMXMSRS                     Msrs;
@@ -667,9 +672,12 @@ typedef struct HMCPU
         /** Virtual address of the VM-exit MSR-load area (used for host MSRs). */
         R0PTRTYPE(void *)           pvHostMsr;
 
-        /** Number of automatically loaded/restored guest MSRs during the world switch. */
+        /** Number of automatically loaded/restored guest MSRs during
+         *  the world switch. */
         uint32_t                    cGuestMsrs;
-        uint32_t                    uAlignment;
+        /** Number of automatically loaded/restored host MSRs during
+         *  the world switch. */
+        uint32_t                    cHostMsrs;
 #endif /* VBOX_WITH_AUTO_MSR_LOAD_RESTORE */
 
         /** The cached APIC-base MSR used for identifying when to map the HC physical APIC-access page. */
diff --git a/src/VBox/VMM/include/TMInternal.h b/src/VBox/VMM/include/TMInternal.h
index 306a4b8..a1bd51c 100644
--- a/src/VBox/VMM/include/TMInternal.h
+++ b/src/VBox/VMM/include/TMInternal.h
@@ -353,10 +353,17 @@ typedef struct TM
     bool                        afAlignment0[2]; /**< alignment padding */
     /** The ID of the virtual CPU that normally runs the timers. */
     VMCPUID                     idTimerCpu;
+
     /** The number of CPU clock ticks per second (TMCLOCK_TSC).
      * Config variable: TSCTicksPerSecond (64-bit unsigned int)
      * The config variable implies fTSCVirtualized = true and fTSCUseRealTSC = false. */
     uint64_t                    cTSCTicksPerSecond;
+    /** The TSC difference introduced by pausing the VM. */
+    uint64_t                    offTSCPause;
+    /** The TSC value when the last TSC was paused. */
+    uint64_t                    u64LastPausedTSC;
+    /** CPU TSCs ticking indicator (one for each VCPU). */
+    uint32_t volatile           cTSCsTicking;
 
     /** Virtual time ticking enabled indicator (counter for each VCPU). (TMCLOCK_VIRTUAL) */
     uint32_t volatile           cVirtualTicking;
@@ -366,7 +373,7 @@ typedef struct TM
     bool volatile               fVirtualSyncTicking;
     /** Virtual timer synchronous time catch-up active. */
     bool volatile               fVirtualSyncCatchUp;
-    bool                        afAlignment1[5]; /**< alignment padding */
+    bool                        afAlignment1[1]; /**< alignment padding */
     /** WarpDrive percentage.
      * 100% is normal (fVirtualSyncNormal == true). When other than 100% we apply
      * this percentage to the raw time source for the period it's been valid in,
@@ -630,6 +637,10 @@ typedef struct TM
     /** Calls to TMCpuTickSet. */
     STAMCOUNTER                 StatTSCSet;
 
+    /** TSC starts and stops. */
+    STAMCOUNTER                 StatTSCPause;
+    STAMCOUNTER                 StatTSCResume;
+
     /** @name Reasons for refusing TSC offsetting in TMCpuTickCanUseRealTSC.
      * @{ */
     STAMCOUNTER                 StatTSCNotFixed;
@@ -728,7 +739,9 @@ void                    tmTimerQueuesSanityChecks(PVM pVM, const char *pszWhere)
 #endif
 
 int                     tmCpuTickPause(PVMCPU pVCpu);
+int                     tmCpuTickPauseLocked(PVM pVM, PVMCPU pVCpu);
 int                     tmCpuTickResume(PVM pVM, PVMCPU pVCpu);
+int                     tmCpuTickResumeLocked(PVM pVM, PVMCPU pVCpu);
 
 int                     tmVirtualPauseLocked(PVM pVM);
 int                     tmVirtualResumeLocked(PVM pVM);
diff --git a/src/VBox/VMM/testcase/Makefile.kmk b/src/VBox/VMM/testcase/Makefile.kmk
index 31c2045..2789416 100644
--- a/src/VBox/VMM/testcase/Makefile.kmk
+++ b/src/VBox/VMM/testcase/Makefile.kmk
@@ -40,36 +40,56 @@ if !defined(VBOX_ONLY_EXTPACKS) \
  INSTALLS += VMMLibDTraceStructTest
 endif
 ifndef VBOX_ONLY_EXTPACKS_USE_IMPLIBS
- PROGRAMS  += tstGlobalConfig tstInstrEmul
+ PROGRAMS  += tstInstrEmul
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  PROGRAMS += tstGlobalConfigHardened
+  DLL      += tstGlobalConfig
+ else
+  PROGRAMS += tstGlobalConfig
+ endif
+
  ifdef VBOX_WITH_RAW_MODE
-  PROGRAMS  += tstVMM tstVMM-HM
+  if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+   PROGRAMS += tstVMMHardened
+   DLLS     += tstVMM
+  else
+   PROGRAMS += tstVMM tstVMM-HM
+  endif
   ifneq ($(KBUILD_TARGET),win)
    PROGRAMS += tstVMMFork
   endif
  endif
  ifdef VBOX_WITH_TESTCASES
-  PROGRAMS  += \
-  	tstCFGM \
+  if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+   PROGRAMS += tstCFGMHardened tstSSMHardened tstVMREQHardened tstMMHyperHeapHardened tstAnimateHardened
+   DLLS     += tstCFGM tstSSM tstVMREQ tstMMHyperHeap tstAnimate
+  else
+   PROGRAMS += tstCFGM tstSSM tstVMREQ tstMMHyperHeap tstAnimate
+  endif
+  PROGRAMS += \
   	tstCompressionBenchmark \
 	tstIEMCheckMc \
-  	tstMMHyperHeap \
-  	tstSSM \
   	tstVMMR0CallHost-1 \
-  	tstVMMR0CallHost-2 \
-  	tstVMREQ
+  	tstVMMR0CallHost-2
   ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), solaris.x86 solaris.amd64 win.amd64 ) ## TODO: Fix the code.
    PROGRAMS  +=  tstX86-1
   endif
-  ifneq ($(KBUILD_TARGET),l4)
-   PROGRAMS += tstAnimate
-  endif
   ifdef VBOX_WITH_RAW_MODE
-   PROGRAMS += tstMicro
-   SYSMODS  += tstMicroRC
+   if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+    PROGRAMS += tstMicroHardened
+    DLLS     += tstMicro
+   else
+    PROGRAMS += tstMicro
+   endif
+   SYSMODS   += tstMicroRC
   endif
   ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
-   PROGRAMS  += tstPDMAsyncCompletion
-   PROGRAMS  += tstPDMAsyncCompletionStress
+   if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+    PROGRAMS += tstPDMAsyncCompletionHardened tstPDMAsyncCompletionStressHardened
+    DLLS     += tstPDMAsyncCompletion tstPDMAsyncCompletionStress
+   else
+    PROGRAMS += tstPDMAsyncCompletion tstPDMAsyncCompletionStress
+   endif
   endif
  endif # VBOX_WITH_TESTCASES
 endif # !VBOX_ONLY_EXTPACKS_USE_IMPLIBS
@@ -200,10 +220,24 @@ ifdef VBOX_WITH_RAW_MODE
 endif # VBOX_WITH_RAW_MODE
 
 
-tstGlobalConfig_TEMPLATE= VBOXR3TSTEXE
+#
+# Glboal config tool.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstGlobalConfigHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstGlobalConfigHardened_NAME     = tstGlobalConfig
+ tstGlobalConfigHardened_DEFS     = PROGRAM_NAME_STR=\"tstGlobalConfig\"
+ tstGlobalConfigHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstGlobalConfig_TEMPLATE = VBoxR3TstDll
+else
+ tstGlobalConfig_TEMPLATE = VBOXR3TSTEXE
+endif
 tstGlobalConfig_SOURCES = tstGlobalConfig.cpp
 tstGlobalConfig_LIBS    = $(LIB_RUNTIME)
 
+#
+# Testcase for checking the repurposing of the IEM instruction code.
+#
 tstIEMCheckMc_TEMPLATE  = VBOXR3TSTEXE
 tstIEMCheckMc_SOURCES   = tstIEMCheckMc.cpp
 tstIEMCheckMc_LIBS      = $(LIB_RUNTIME)
@@ -211,26 +245,68 @@ ifneq ($(KBUILD_TARGET),win)
 tstIEMCheckMc_CXXFLAGS  = -Wno-unused-parameter
 endif
 
-tstMMHyperHeap_TEMPLATE = VBOXR3TSTEXE
+#
+# VMM heap testcase.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstMMHyperHeapHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstMMHyperHeapHardened_NAME     = tstMMHyperHeap
+ tstMMHyperHeapHardened_DEFS     = PROGRAM_NAME_STR=\"tstMMHyperHeap\"
+ tstMMHyperHeapHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstMMHyperHeap_TEMPLATE = VBoxR3TstDll
+else
+ tstMMHyperHeap_TEMPLATE = VBOXR3TSTEXE
+endif
 tstMMHyperHeap_SOURCES  = tstMMHyperHeap.cpp
 tstMMHyperHeap_LIBS     = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
-tstSSM_TEMPLATE         = VBOXR3TSTEXE
+#
+# Saved state manager testcase.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstSSMHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstSSMHardened_NAME     = tstSSM
+ tstSSMHardened_DEFS     = PROGRAM_NAME_STR=\"tstSSM\"
+ tstSSMHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstSSM_TEMPLATE        = VBoxR3TstDll
+else
+ tstSSM_TEMPLATE        = VBOXR3TSTEXE
+endif
 tstSSM_INCS             = $(VBOX_PATH_VMM_SRC)/include
 tstSSM_SOURCES          = tstSSM.cpp
 tstSSM_LIBS             = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
+#
+# Test some EM assembly routines used in instruction emulation.
+#
 tstInstrEmul_TEMPLATE   = VBOXR3EXE
 tstInstrEmul_SOURCES    = tstInstrEmul.cpp ../VMMAll/EMAllA.asm
 tstInstrEmul_LIBS       = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
-tstCFGM_TEMPLATE        = VBOXR3TSTEXE
+#
+# VMM configuration manager tests.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstCFGMHardened_TEMPLATE = VBoxR3HardenedTstExe
+ tstCFGMHardened_NAME     = tstCFGM
+ tstCFGMHardened_DEFS     = PROGRAM_NAME_STR=\"tstCFGM\"
+ tstCFGMHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstCFGM_TEMPLATE       = VBoxR3TstDll
+else
+ tstCFGM_TEMPLATE       = VBOXR3TSTEXE
+endif
 tstCFGM_SOURCES         = tstCFGM.cpp
 tstCFGM_LIBS            = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
+#
+# Comparing some compression algorithms considered for SSM usage.
+#
 tstCompressionBenchmark_TEMPLATE = VBOXR3TSTEXE
 tstCompressionBenchmark_SOURCES  = tstCompressionBenchmark.cpp
 
+#
+# Two testcases for checking the ring-3 "long jump" code.
+#
 tstVMMR0CallHost-1_TEMPLATE = VBOXR3TSTEXE
 tstVMMR0CallHost-1_DEFS = VMM_R0_NO_SWITCH_STACK
 tstVMMR0CallHost-1_INCS = $(VBOX_PATH_VMM_SRC)/include
@@ -244,11 +320,33 @@ tstVMMR0CallHost-1_SOURCES.x86 = \
 tstVMMR0CallHost-2_EXTENDS = tstVMMR0CallHost-1
 tstVMMR0CallHost-2_DEFS = VMM_R0_SWITCH_STACK
 
-tstVMREQ_TEMPLATE       = VBOXR3EXE
+#
+# For testing the VM request queue code.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstVMREQHardened_TEMPLATE = VBOXR3HARDENEDEXE
+ tstVMREQHardened_NAME     = tstVMREQ
+ tstVMREQHardened_DEFS     = PROGRAM_NAME_STR=\"tstVMREQ\"
+ tstVMREQHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstVMREQ_TEMPLATE      = VBOXR3
+else
+ tstVMREQ_TEMPLATE      = VBOXR3EXE
+endif
 tstVMREQ_SOURCES        = tstVMREQ.cpp
 tstVMREQ_LIBS           = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
-tstAnimate_TEMPLATE     = VBOXR3EXE
+#
+# Tool for reanimate things like OS/2 dumps.
+#
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ tstAnimateHardened_TEMPLATE = VBOXR3HARDENEDEXE
+ tstAnimateHardened_NAME     = tstAnimate
+ tstAnimateHardened_DEFS     = PROGRAM_NAME_STR=\"tstAnimate\"
+ tstAnimateHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+ tstAnimate_TEMPLATE    = VBOXR3
+else
+ tstAnimate_TEMPLATE    = VBOXR3EXE
+endif
 tstAnimate_SOURCES      = tstAnimate.cpp
 tstAnimate_LIBS         = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
@@ -258,19 +356,47 @@ tstX86-1_LIBS           = $(LIB_RUNTIME)
 
 ifdef VBOX_WITH_RAW_MODE
 
- tstVMM_TEMPLATE        = VBOXR3EXE
+ #
+ # Raw-mode VMM testcase.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  tstVMMHardened_TEMPLATE = VBOXR3HARDENEDEXE
+  tstVMMHardened_NAME     = tstVMM
+  tstVMMHardened_DEFS     = PROGRAM_NAME_STR=\"tstVMM\"
+  tstVMMHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+  tstVMM_TEMPLATE       = VBOXR3
+ else
+  tstVMM_TEMPLATE       = VBOXR3EXE
+ endif
  tstVMM_SOURCES         = tstVMM.cpp
  tstVMM_LIBS            = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
+ #
+ # HM VMM testcase.
+ #
  tstVMM-HM_TEMPLATE     = VBOXR3EXE
  tstVMM-HM_SOURCES      = tstVMM-HM.cpp
  tstVMM-HM_LIBS         = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
+ #
+ # VMM host process fork test case (memory ++).
+ #
  tstVMMFork_TEMPLATE    = VBOXR3EXE
  tstVMMFork_SOURCES     = tstVMMFork.cpp
  tstVMMFork_LIBS        = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
- tstMicro_TEMPLATE       = VBOXR3EXE
+ #
+ # Raw-mode micro benchmark.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  tstMicroHardened_TEMPLATE = VBOXR3HARDENEDEXE
+  tstMicroHardened_NAME     = tstMicro
+  tstMicroHardened_DEFS     = PROGRAM_NAME_STR=\"tstMicro\"
+  tstMicroHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+  tstMicro_TEMPLATE      = VBOXR3
+ else
+  tstMicro_TEMPLATE      = VBOXR3EXE
+ endif
  tstMicro_SOURCES        = tstMicro.cpp
  tstMicro_LIBS           = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
  tstMicro_DEFS           = $(if $(VBOX_WITH_RAW_MODE),VBOX_WITH_RAW_MODE,)
@@ -296,12 +422,34 @@ ifdef VBOX_WITH_RAW_MODE
 endif # VBOX_WITH_RAW_MODE
 
 ifdef VBOX_WITH_PDM_ASYNC_COMPLETION
- tstPDMAsyncCompletion_TEMPLATE         = VBOXR3EXE
+ #
+ # PDM asynchronous completation test.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  tstPDMAsyncCompletionHardened_TEMPLATE = VBOXR3HARDENEDEXE
+  tstPDMAsyncCompletionHardened_NAME     = tstPDMAsyncCompletion
+  tstPDMAsyncCompletionHardened_DEFS     = PROGRAM_NAME_STR=\"tstPDMAsyncCompletion\"
+  tstPDMAsyncCompletionHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+  tstPDMAsyncCompletion_TEMPLATE        = VBOXR3
+ else
+  tstPDMAsyncCompletion_TEMPLATE        = VBOXR3EXE
+ endif
  tstPDMAsyncCompletion_INCS             = $(VBOX_PATH_VMM_SRC)/include
  tstPDMAsyncCompletion_SOURCES          = tstPDMAsyncCompletion.cpp
  tstPDMAsyncCompletion_LIBS             = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
 
- tstPDMAsyncCompletionStress_TEMPLATE   = VBOXR3EXE
+ #
+ # PDM asynchronous completation stress test.
+ #
+ if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+  tstPDMAsyncCompletionStressHardened_TEMPLATE = VBOXR3HARDENEDEXE
+  tstPDMAsyncCompletionStressHardened_NAME     = tstPDMAsyncCompletionStress
+  tstPDMAsyncCompletionStressHardened_DEFS     = PROGRAM_NAME_STR=\"tstPDMAsyncCompletionStress\"
+  tstPDMAsyncCompletionStressHardened_SOURCES  = ../../HostDrivers/Support/SUPR3HardenedMainTemplate.cpp
+  tstPDMAsyncCompletionStress_TEMPLATE  = VBOXR3
+ else
+  tstPDMAsyncCompletionStress_TEMPLATE  = VBOXR3EXE
+ endif
  tstPDMAsyncCompletionStress_INCS       = $(VBOX_PATH_VMM_SRC)/include
  tstPDMAsyncCompletionStress_SOURCES    = tstPDMAsyncCompletionStress.cpp
  tstPDMAsyncCompletionStress_LIBS       = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
diff --git a/src/VBox/VMM/testcase/tstAnimate.cpp b/src/VBox/VMM/testcase/tstAnimate.cpp
index 732e05c..1efb09f 100644
--- a/src/VBox/VMM/testcase/tstAnimate.cpp
+++ b/src/VBox/VMM/testcase/tstAnimate.cpp
@@ -618,7 +618,10 @@ static void syntax(void)
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     int rcRet = 1;
     int rc;
@@ -936,3 +939,14 @@ int main(int argc, char **argv)
     return rcRet;
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstCFGM.cpp b/src/VBox/VMM/testcase/tstCFGM.cpp
index d95eb24..98e6ce8 100644
--- a/src/VBox/VMM/testcase/tstCFGM.cpp
+++ b/src/VBox/VMM/testcase/tstCFGM.cpp
@@ -135,7 +135,11 @@ static void doStandaloneTests(void)
     CFGMR3DestroyTree(pRoot);
 }
 
-int main()
+
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     /*
      * Init runtime.
@@ -152,3 +156,14 @@ int main()
     return RTTestSummaryAndDestroy(hTest);
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstGlobalConfig.cpp b/src/VBox/VMM/testcase/tstGlobalConfig.cpp
index 8b71744..9605005 100644
--- a/src/VBox/VMM/testcase/tstGlobalConfig.cpp
+++ b/src/VBox/VMM/testcase/tstGlobalConfig.cpp
@@ -38,7 +38,10 @@ static int Usage(void)
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     RTR3InitExe(argc, &argv, 0);
 
@@ -120,3 +123,15 @@ int main(int argc, char **argv)
 
     return RT_FAILURE(rc) ? 1 : 0;
 }
+
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstMMHyperHeap.cpp b/src/VBox/VMM/testcase/tstMMHyperHeap.cpp
index 9dad359..5f39a7e 100644
--- a/src/VBox/VMM/testcase/tstMMHyperHeap.cpp
+++ b/src/VBox/VMM/testcase/tstMMHyperHeap.cpp
@@ -37,7 +37,10 @@
 #define NUM_CPUS  16
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
 
     /*
@@ -240,3 +243,15 @@ int main(int argc, char **argv)
 #endif
     return 0;
 }
+
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstMicro.cpp b/src/VBox/VMM/testcase/tstMicro.cpp
index bebd147..56f6f1d 100644
--- a/src/VBox/VMM/testcase/tstMicro.cpp
+++ b/src/VBox/VMM/testcase/tstMicro.cpp
@@ -339,7 +339,10 @@ static DECLCALLBACK(int) doit(PVM pVM)
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     int     rcRet = 0;                  /* error count. */
 
@@ -385,3 +388,15 @@ int main(int argc, char **argv)
 
     return rcRet;
 }
+
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstPDMAsyncCompletion.cpp b/src/VBox/VMM/testcase/tstPDMAsyncCompletion.cpp
index e51ae5d..8cc5b64 100644
--- a/src/VBox/VMM/testcase/tstPDMAsyncCompletion.cpp
+++ b/src/VBox/VMM/testcase/tstPDMAsyncCompletion.cpp
@@ -72,7 +72,10 @@ void pfnAsyncTaskCompleted(PVM pVM, void *pvUser, void *pvUser2, int rc)
     }
 }
 
-int main(int argc, char *argv[])
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     int rcRet = 0; /* error count */
     PPDMASYNCCOMPLETIONENDPOINT pEndpointSrc, pEndpointDst;
@@ -256,3 +259,14 @@ int main(int argc, char *argv[])
     return rcRet;
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstPDMAsyncCompletionStress.cpp b/src/VBox/VMM/testcase/tstPDMAsyncCompletionStress.cpp
index 4ce72ba..0dcc347 100644
--- a/src/VBox/VMM/testcase/tstPDMAsyncCompletionStress.cpp
+++ b/src/VBox/VMM/testcase/tstPDMAsyncCompletionStress.cpp
@@ -567,7 +567,10 @@ static void tstPDMACStressTestPatternDestroy(void)
     RTMemFree(g_pbTestPattern);
 }
 
-int main(int argc, char *argv[])
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     int rcRet = 0; /* error count */
 
@@ -629,3 +632,14 @@ int main(int argc, char *argv[])
     return rcRet;
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstSSM.cpp b/src/VBox/VMM/testcase/tstSSM.cpp
index cd9c6fd..e3d0335 100644
--- a/src/VBox/VMM/testcase/tstSSM.cpp
+++ b/src/VBox/VMM/testcase/tstSSM.cpp
@@ -683,7 +683,10 @@ static int createFakeVM(PVM *ppVM)
 }
 
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     /*
      * Init runtime and static data.
@@ -916,3 +919,14 @@ int main(int argc, char **argv)
     return 0;
 }
 
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstVMM.cpp b/src/VBox/VMM/testcase/tstVMM.cpp
index 2e77560..eb13edf 100644
--- a/src/VBox/VMM/testcase/tstVMM.cpp
+++ b/src/VBox/VMM/testcase/tstVMM.cpp
@@ -190,7 +190,10 @@ tstVMMConfigConstructor(PUVM pUVM, PVM pVM, void *pvUser)
 }
 
 
-int main(int argc, char **argv)
+/**
+ * Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     /*
      * Init runtime and the test environment.
@@ -244,7 +247,7 @@ int main(int argc, char **argv)
                 return 1;
 
             case 'V':
-                RTPrintf("$Revision: 91444 $\n");
+                RTPrintf("$Revision: 94787 $\n");
                 return 0;
 
             default:
@@ -328,3 +331,15 @@ int main(int argc, char **argv)
 
     return RTTestSummaryAndDestroy(hTest);
 }
+
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/testcase/tstVMREQ.cpp b/src/VBox/VMM/testcase/tstVMREQ.cpp
index c321246..e312684 100644
--- a/src/VBox/VMM/testcase/tstVMREQ.cpp
+++ b/src/VBox/VMM/testcase/tstVMREQ.cpp
@@ -224,7 +224,10 @@ tstVMREQConfigConstructor(PUVM pUVM, PVM pVM, void *pvUser)
     return rc;
 }
 
-int main(int argc, char **argv)
+/**
+ *  Entry point.
+ */
+extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
 {
     RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB);
     RTPrintf(TESTCASE ": TESTING...\n");
@@ -330,3 +333,15 @@ int main(int argc, char **argv)
 
     return !!g_cErrors;
 }
+
+
+#if !defined(VBOX_WITH_HARDENING) || !defined(RT_OS_WINDOWS)
+/**
+ * Main entry point.
+ */
+int main(int argc, char **argv, char **envp)
+{
+    return TrustedMain(argc, argv, envp);
+}
+#endif
+
diff --git a/src/VBox/VMM/tools/VBoxCpuReport.cpp b/src/VBox/VMM/tools/VBoxCpuReport.cpp
index 7267a24..940c43b 100644
--- a/src/VBox/VMM/tools/VBoxCpuReport.cpp
+++ b/src/VBox/VMM/tools/VBoxCpuReport.cpp
@@ -2558,6 +2558,44 @@ static bool isMsrViaDummy(uint32_t uMsr, uint64_t uValue, uint32_t fFlags)
 }
 
 
+/**
+ * Adjusts the ignore and GP masks for MSRs which contains canonical addresses.
+ *
+ * @param   uMsr                The MSR.
+ * @param   pfIgn               Pointer to the ignore mask.
+ * @param   pfGp                Pointer to the GP mask.
+ */
+static void adjustCanonicalIgnAndGpMasks(uint32_t uMsr, uint64_t *pfIgn, uint64_t *pfGp)
+{
+    if (!vbCpuRepSupportsLongMode())
+        return;
+    switch (uMsr)
+    {
+        case 0x00000175:
+        case 0x00000176:
+        case 0x000001da:
+        case 0x000001db:
+        case 0x000001dc:
+        case 0x000001de:
+        case 0x00000600:
+            if (*pfGp == UINT64_C(0xffff800000000000))
+                *pfGp = 0;
+            break;
+        case 0x000001dd:
+            if (*pfGp == UINT64_C(0x7fff800000000000) || *pfGp == UINT64_C(0xffff800000000000)) /* why is the top bit writable? */
+                *pfGp = 0;
+            break;
+
+        case 0xc0000082:
+        case 0xc0000083:
+        case 0xc0000100:
+        case 0xc0000101:
+        case 0xc0000102:
+            *pfGp = 0;
+            break;
+    }
+}
+
 
 
 /**
@@ -2948,6 +2986,7 @@ static int reportMsr_Generic(uint32_t uMsr, uint32_t fFlags, uint64_t uValue)
                     rc = msrProberModifyBitChanges(uMsr, &fIgnMask, &fGpMask, fSkipMask);
                     if (RT_FAILURE(rc))
                         return rc;
+                    adjustCanonicalIgnAndGpMasks(uMsr, &fIgnMask, &fGpMask);
 
                     if (pszFnName)
                     {
@@ -4113,8 +4152,6 @@ static int produceMsrReport(VBCPUREPMSR *paMsrs, uint32_t cMsrs)
                                          annotateValue(uValue));
         else if (uMsr == 0xc0000080)
             rc = reportMsr_Amd64Efer(uMsr, uValue);
-        else if (uMsr == 0xc0000082 || uMsr == 0xc0000083 || uMsr == 0xc0000100 || uMsr == 0xc0000101 || uMsr == 0xc0000102)
-            rc = reportMsr_GenFunctionEx(uMsr, NULL, 0, UINT64_C(0xffff800000000000), 0, annotateValue(uValue)); /* Canoncial address hack. */
         else if (uMsr >= 0xc0000408 && uMsr <= 0xc000040f)
             rc = reportMsr_AmdFam10hMc4MiscN(&paMsrs[i], cMsrs - i, &i);
         else if (uMsr == 0xc0010000 && g_enmVendor == CPUMCPUVENDOR_AMD)
diff --git a/src/bldprogs/Makefile.kmk b/src/bldprogs/Makefile.kmk
index 1e93f8a..2e0f671 100644
--- a/src/bldprogs/Makefile.kmk
+++ b/src/bldprogs/Makefile.kmk
@@ -20,16 +20,16 @@ include $(KBUILD_PATH)/subheader.kmk
 
 BLDPROGS += bin2c biossums filesplitter VBoxCmp
 
-bin2c_TEMPLATE = VBOXBLDPROG
+bin2c_TEMPLATE = VBoxBldProg
 bin2c_SOURCES = bin2c.c
 
-biossums_TEMPLATE = VBOXBLDPROG
+biossums_TEMPLATE = VBoxBldProg
 biossums_SOURCES = biossums.c
 
-filesplitter_TEMPLATE = VBOXBLDPROG
+filesplitter_TEMPLATE = VBoxBldProg
 filesplitter_SOURCES = filesplitter.cpp
 
-VBoxCmp_TEMPLATE = VBOXBLDPROG
+VBoxCmp_TEMPLATE = VBoxBldProg
 VBoxCmp_SOURCES = VBoxCmp.cpp
 
 ifndef VBOX_ONLY_BUILD
@@ -58,12 +58,12 @@ if !defined(VBOX_ONLY_BUILD) || defined(VBOX_ONLY_EXTPACKS)
 endif
 
 BLDPROGS.win += VBoxPeSetVersion
-VBoxPeSetVersion_TEMPLATE = VBOXBLDPROG
+VBoxPeSetVersion_TEMPLATE = VBoxBldProg
 VBoxPeSetVersion_SOURCES  = VBoxPeSetVersion.cpp
 
 
 BLDPROGS += VBoxDef2LazyLoad
-VBoxDef2LazyLoad_TEMPLATE = VBOXBLDPROG
+VBoxDef2LazyLoad_TEMPLATE = VBoxBldProg
 VBoxDef2LazyLoad_SOURCES  = VBoxDef2LazyLoad.cpp
 
 
diff --git a/src/bldprogs/bin2c.c b/src/bldprogs/bin2c.c
index 23e0749..8bd75c7 100644
--- a/src/bldprogs/bin2c.c
+++ b/src/bldprogs/bin2c.c
@@ -56,8 +56,10 @@ static int usage(const char *argv0)
             "  -mask <n>    check if size of binaryfile is <n>-aligned\n"
             "  -width <n>   number of bytes per line (default: 16)\n"
             "  -break <n>   break every <n> lines    (default: -1)\n"
-            "  -ascii       show ASCII representation of binary as comment\n",
-            argv0);
+            "  -ascii       show ASCII representation of binary as comment\n"
+            "  -export      emit DECLEXPORT\n"
+            "  --append     append to the output file (default: truncate)\n"
+            , argv0);
 
     return 1;
 }
@@ -71,6 +73,7 @@ int main(int argc, char *argv[])
     size_t        cbMax = ~0U;
     size_t        uMask = 0;
     int           fAscii = 0;
+    int           fAppend = 0;
     int           fExport = 0;
     long          iBreakEvery = -1;
     unsigned char abLine[32];
@@ -104,13 +107,11 @@ int main(int argc, char *argv[])
             uMask = strtoul(argv[iArg], NULL, 0);
         }
         else if (!strcmp(argv[iArg], "-ascii"))
-        {
             fAscii = 1;
-        }
+        else if (!strcmp(argv[iArg], "--append"))
+            fAppend = 1;
         else if (!strcmp(argv[iArg], "-export"))
-        {
             fExport = 1;
-        }
         else if (!strcmp(argv[iArg], "-width"))
         {
             if (++iArg >= argc)
@@ -152,7 +153,7 @@ int main(int argc, char *argv[])
         return 1;
     }
 
-    pFileOut = fopen(argv[iArg+2], "wb");
+    pFileOut = fopen(argv[iArg+2], fAppend ? "a" : "w"); /* no b! */
     if (!pFileOut)
     {
         fprintf(stderr, "Error: failed to open output file '%s'!\n", argv[iArg+2]);
diff --git a/src/libs/Makefile.kmk b/src/libs/Makefile.kmk
index 8fe7218..4ae7888 100644
--- a/src/libs/Makefile.kmk
+++ b/src/libs/Makefile.kmk
@@ -4,7 +4,7 @@
 #
 
 #
-# Copyright (C) 2006-2013 Oracle Corporation
+# Copyright (C) 2006-2014 Oracle Corporation
 #
 # This file is part of VirtualBox Open Source Edition (OSE), as
 # available from http://www.virtualbox.org. This file is free software;
@@ -52,7 +52,7 @@ endif
 if !defined(VBOX_ONLY_SDK) \
  && (   "$(SDK_VBOX_OPENSSL_INCS)" == "$(SDK_VBOX_OPENSSL_VBOX_DEFAULT_INCS)" \
      || defined(VBOX_WITH_EXTPACK_PUEL_BUILD))
- include $(PATH_SUB_CURRENT)/openssl-0.9.8y/Makefile.kmk
+ include $(PATH_SUB_CURRENT)/openssl-1.0.1h/Makefile.kmk
 endif
 
 # libjpeg for VRDP video redirection
diff --git a/src/libs/kStuff/Makefile.kmk b/src/libs/kStuff/Makefile.kmk
index 9d74ae5..2d9b56d 100644
--- a/src/libs/kStuff/Makefile.kmk
+++ b/src/libs/kStuff/Makefile.kmk
@@ -85,7 +85,7 @@ VBox-kStuffStatic_EXTENDS = VBox-kStuff
 
 
 LIBRARIES += VBox-kStuffStaticBldProg
-VBox-kStuffStaticBldProg_TEMPLATE = VBOXBLDPROG
+VBox-kStuffStaticBldProg_TEMPLATE = VBoxBldProg
 VBox-kStuffStaticBldProg_EXTENDS = VBox-kStuff
 
 
diff --git a/src/libs/kStuff/kStuff/include/k/kErrors.h b/src/libs/kStuff/kStuff/include/k/kErrors.h
index f974448..498ff87 100644
--- a/src/libs/kStuff/kStuff/include/k/kErrors.h
+++ b/src/libs/kStuff/kStuff/include/k/kErrors.h
@@ -1,4 +1,4 @@
-/* $Id: kErrors.h 29 2009-07-01 20:30:29Z bird $ */
+/* $Id: kErrors.h 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kErrors - Status Codes.
  */
@@ -205,13 +205,15 @@
 #define KLDR_ERR_FAT_INVALID                            (KLDR_ERR_BASE + 36)
 /** Unsupported CPU subtype found in a FAT entry. */
 #define KLDR_ERR_FAT_UNSUPPORTED_CPU_SUBTYPE            (KLDR_ERR_BASE + 37)
+/** The image has no UUID. */
+#define KLDR_ERR_NO_IMAGE_UUID                          (KLDR_ERR_BASE + 38)
 /** @} */
 
 /** @name kLdrModPE Specific
  * @{
  */
 /** The base of the kLdrModPE specific status codes. */
-#define KLDR_ERR_PE_BASE                                (KLDR_ERR_BASE + 38)
+#define KLDR_ERR_PE_BASE                                (KLDR_ERR_BASE + 39)
 /** The machine isn't supported by the interpreter. */
 #define KLDR_ERR_PE_UNSUPPORTED_MACHINE                 (KLDR_ERR_PE_BASE + 0)
 /** The file handler isn't valid. */
diff --git a/src/libs/kStuff/kStuff/include/k/kLdr.h b/src/libs/kStuff/kStuff/include/k/kLdr.h
index 795b3f6..d8e4d5f 100644
--- a/src/libs/kStuff/kStuff/include/k/kLdr.h
+++ b/src/libs/kStuff/kStuff/include/k/kLdr.h
@@ -1,4 +1,4 @@
-/* $Id: kLdr.h 52 2013-07-09 17:03:37Z bird $ */
+/* $Id: kLdr.h 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kLdr - The Dynamic Loader.
  */
@@ -613,6 +613,7 @@ KI32    kLdrModNumberOfImports(PKLDRMOD pMod, const void *pvBits);
 int     kLdrModCanExecuteOn(PKLDRMOD pMod, const void *pvBits, KCPUARCH enmArch, KCPU enmCpu);
 int     kLdrModGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo);
 int     kLdrModQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
+int     kLdrModQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid);
 int     kLdrModQueryResource(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 idType, const char *pszType,
                              KU32 idName, const char *pszName, KU32 idLang, PKLDRADDR pAddrRsrc, KSIZE *pcbRsrc);
 int     kLdrModEnumResources(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 idType, const char *pszType,
@@ -698,6 +699,8 @@ typedef struct KLDRMODOPS
     int (* pfnGetStackInfo)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo);
     /** @copydoc kLdrModQueryMainEntrypoint */
     int (* pfnQueryMainEntrypoint)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
+    /** @copydoc kLdrModQueryImageUuid  */
+    int (* pfnQueryImageUuid)(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE pcbUuid);
     /** @copydoc kLdrModQueryResource */
     int (* pfnQueryResource)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, KU32 idType, const char *pszType,
                              KU32 idName, const char *pszName, KU32 idLang, PKLDRADDR pAddrRsrc, KSIZE *pcbRsrc);
diff --git a/src/libs/kStuff/kStuff/include/k/kLdrFmts/mach-o.h b/src/libs/kStuff/kStuff/include/k/kLdrFmts/mach-o.h
index 662603a..fe0a106 100644
--- a/src/libs/kStuff/kStuff/include/k/kLdrFmts/mach-o.h
+++ b/src/libs/kStuff/kStuff/include/k/kLdrFmts/mach-o.h
@@ -1,4 +1,4 @@
-/* $Id: mach-o.h 50 2012-09-05 09:55:16Z bird $ */
+/* $Id: mach-o.h 55 2013-10-11 00:55:44Z bird $ */
 /** @file
  * Mach-0 structures, types and defines.
  */
@@ -144,6 +144,7 @@ typedef struct mach_header_64
 #define MH_BUNDLE           KU32_C(8) /**< Dymamically bound bundle. */
 #define MH_DYLIB_STUB       KU32_C(9) /**< Shared library stub for static linking. */
 #define MH_DSYM             KU32_C(10)/**< Debug symbols. */
+#define MH_KEXT_BUNDLE      KU32_C(11)/**< Kernel extension (introduced with the AMD64 kernel). */
 
 /** @} */
 
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrMod.c b/src/libs/kStuff/kStuff/kLdr/kLdrMod.c
index d3305c3..f11da02 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrMod.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrMod.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrMod.c 52 2013-07-09 17:03:37Z bird $ */
+/* $Id: kLdrMod.c 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kLdr - The Module Interpreter.
  */
@@ -510,6 +510,8 @@ KI32 kLdrModNumberOfImports(PKLDRMOD pMod, const void *pvBits)
  * @param   pMod            The module.
  * @param   pvBits          Optional pointer to bits returned by kLdrModGetBits().
  *                          This can be used by some module interpreters to reduce memory consumption.
+ * @param   enmArch         The CPU architecture.
+ * @param   enmCpu          The CPU series/model.
  */
 int     kLdrModCanExecuteOn(PKLDRMOD pMod, const void *pvBits, KCPUARCH enmArch, KCPU enmCpu)
 {
@@ -563,6 +565,27 @@ int     kLdrModQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR B
 
 
 /**
+ * Queries the image UUID, if the image has one.
+ *
+ * @returns 0 and *pvUuid. Non-zero status code on failure.
+ * @param   pMod            The module.
+ * @param   pvBits          Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress.
+ *                          This can be used by some module interpreters to reduce memory consumption.
+ * @param   pvUuid          Where to store the UUID.
+ * @param   cbUuid          Size of the UUID buffer, must be at least 16 bytes.
+ */
+int     kLdrModQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid)
+{
+    KLDRMOD_VALIDATE(pMod);
+    if (cbUuid < 16)
+        return KERR_INVALID_SIZE;
+    if (pMod->pOps->pfnQueryImageUuid)
+        return pMod->pOps->pfnQueryImageUuid(pMod, pvBits, pvUuid, cbUuid);
+    return KLDR_ERR_NO_IMAGE_UUID;
+}
+
+
+/**
  * Queries info about a resource.
  *
  * If there are multiple resources matching the criteria, the best or
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModLX.c b/src/libs/kStuff/kStuff/kLdr/kLdrModLX.c
index 061b06a..0bb14b5 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModLX.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModLX.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModLX.c 29 2009-07-01 20:30:29Z bird $ */
+/* $Id: kLdrModLX.c 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kLdr - The Module Interpreter for the Linear eXecutable (LX) Format.
  */
@@ -2639,6 +2639,7 @@ KLDRMODOPS g_kLdrModLXOps =
     NULL /* can execute one is optional */,
     kldrModLXGetStackInfo,
     kldrModLXQueryMainEntrypoint,
+    NULL /* pfnQueryImageUuid */,
     NULL /* fixme */,
     NULL /* fixme */,
     kldrModLXEnumDbgInfo,
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
index 6ccff89..c055323 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModMachO.c 53 2013-07-09 17:18:44Z bird $ */
+/* $Id: kLdrModMachO.c 55 2013-10-11 00:55:44Z bird $ */
 /** @file
  * kLdr - The Module Interpreter for the MACH-O format.
  */
@@ -164,6 +164,9 @@ typedef struct KLDRMODMACHO
     /** Pointer to the loaded string table. */
     char                   *pchStrings;
 
+    /** The image UUID, all zeros if not found. */
+    KU8                     abImageUuid[16];
+
     /** The RVA of the Global Offset Table. */
     KLDRADDR                GotRVA;
     /** The RVA of the indirect GOT jump stubs.  */
@@ -341,7 +344,8 @@ static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags,
     if (   s.Hdr32.filetype != MH_OBJECT
         && s.Hdr32.filetype != MH_EXECUTE
         && s.Hdr32.filetype != MH_DYLIB
-        && s.Hdr32.filetype != MH_DSYM)
+        && s.Hdr32.filetype != MH_DSYM
+        && s.Hdr32.filetype != MH_KEXT_BUNDLE)
         return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE;
 
     /*
@@ -447,6 +451,7 @@ static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags,
         case MH_OBJECT:     pMod->enmType = KLDRTYPE_OBJECT; break;
         case MH_EXECUTE:    pMod->enmType = KLDRTYPE_EXECUTABLE_FIXED; break;
         case MH_DYLIB:      pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
+        case MH_KEXT_BUNDLE:pMod->enmType = KLDRTYPE_SHARED_LIBRARY_RELOCATABLE; break;
         case MH_DSYM:       pMod->enmType = KLDRTYPE_DEBUG_INFO; break;
         default:
             return KLDR_ERR_MACHO_UNSUPPORTED_FILE_TYPE;
@@ -474,6 +479,7 @@ static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags,
     pModMachO->offStrings = 0;
     pModMachO->cchStrings = 0;
     pModMachO->pchStrings = NULL;
+    kHlpMemSet(pModMachO->abImageUuid, 0, sizeof(pModMachO->abImageUuid));
     pModMachO->GotRVA = NIL_KLDRADDR;
     pModMachO->JmpStubsRVA = NIL_KLDRADDR;
     pModMachO->cSections = cSections;
@@ -720,6 +726,7 @@ static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
                         case MH_EXECUTE:
                         case MH_DYLIB:
                         case MH_DSYM:
+                        case MH_KEXT_BUNDLE:
                         {
                             cSections++;
 
@@ -915,6 +922,7 @@ static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
                         case MH_EXECUTE:
                         case MH_DYLIB:
                         case MH_DSYM:
+                        case MH_KEXT_BUNDLE:
                         {
                             cSections++;
 
@@ -1083,6 +1091,7 @@ static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
         case MH_EXECUTE:
         case MH_DYLIB:
         case MH_DSYM:
+        case MH_KEXT_BUNDLE:
             if (!cSegments)
                 return KLDR_ERR_MACHO_BAD_OBJECT_FILE;
             break;
@@ -1116,6 +1125,7 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
         const segment_command_32_t *pSeg32;
         const segment_command_64_t *pSeg64;
         const symtab_command_t     *pSymTab;
+        const uuid_command_t       *pUuid;
     } u;
     const char *pchCurSegName = NULL;
     KU32 cLeft = pModMachO->Hdr.ncmds;
@@ -1159,6 +1169,7 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
                         case MH_EXECUTE:
                         case MH_DYLIB:
                         case MH_DSYM:
+                        case MH_KEXT_BUNDLE:
                         {
                             /* Section data extract. */
                             pSectExtra->cb = pSect->size;
@@ -1295,6 +1306,7 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
                         case MH_EXECUTE:
                         case MH_DYLIB:
                         case MH_DSYM:
+                        case MH_KEXT_BUNDLE:
                         {
                             /* Section data extract. */
                             pSectExtra->cb = pSect->size;
@@ -1417,6 +1429,7 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
                     case MH_EXECUTE:
                     case MH_DYLIB: /** @todo ??? */
                     case MH_DSYM:
+                    case MH_KEXT_BUNDLE:
                         pModMachO->offSymbols = u.pSymTab->symoff + pModMachO->offImage;
                         pModMachO->cSymbols = u.pSymTab->nsyms;
                         pModMachO->offStrings = u.pSymTab->stroff + pModMachO->offImage;
@@ -1425,6 +1438,10 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
                 }
                 break;
 
+            case LC_UUID:
+                kHlpMemCopy(pModMachO->abImageUuid, u.pUuid->uuid, sizeof(pModMachO->abImageUuid));
+                break;
+
             default:
                 break;
         } /* command switch */
@@ -1527,6 +1544,7 @@ static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStrin
         case MH_EXECUTE:
         case MH_DYLIB: /** @todo dylib */
         case MH_DSYM:
+        case MH_KEXT_BUNDLE:
         {
             KLDRADDR cb1;
             KSIZE cb2;
@@ -1784,7 +1802,8 @@ static int kldrModMachOQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR B
     if (   pModMachO->Hdr.filetype == MH_OBJECT
         || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
         || pModMachO->Hdr.filetype == MH_DYLIB
-        || pModMachO->Hdr.filetype == MH_DSYM)
+        || pModMachO->Hdr.filetype == MH_DSYM
+        || pModMachO->Hdr.filetype == MH_KEXT_BUNDLE)
     {
         rc = kldrModMachOLoadObjSymTab(pModMachO);
         if (!rc)
@@ -2097,7 +2116,8 @@ static int kldrModMachOEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR B
     if (   pModMachO->Hdr.filetype == MH_OBJECT
         || pModMachO->Hdr.filetype == MH_EXECUTE /** @todo dylib, execute, dsym: symbols */
         || pModMachO->Hdr.filetype == MH_DYLIB
-        || pModMachO->Hdr.filetype == MH_DSYM)
+        || pModMachO->Hdr.filetype == MH_DSYM
+        || pModMachO->Hdr.filetype == MH_KEXT_BUNDLE)
     {
         rc = kldrModMachOLoadObjSymTab(pModMachO);
         if (!rc)
@@ -2407,6 +2427,18 @@ static int kldrModMachOQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KL
 }
 
 
+/** @copydoc kLdrModQueryImageUuid */
+static int kldrModMachOQueryImageUuid(PKLDRMOD pMod, const void *pvBits, void *pvUuid, KSIZE cbUuid)
+{
+    PKLDRMODMACHO pModMachO = (PKLDRMODMACHO)pMod->pvData;
+    kHlpMemSet(pvUuid, 0, cbUuid);
+    if (kHlpMemComp(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid)) == 0)
+        return KLDR_ERR_NO_IMAGE_UUID;
+    kHlpMemCopy(pvUuid, pModMachO->abImageUuid, sizeof(pModMachO->abImageUuid));
+    return 0;
+}
+
+
 /** @copydoc kLdrModEnumDbgInfo */
 static int kldrModMachOEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser)
 {
@@ -3738,6 +3770,7 @@ KLDRMODOPS g_kLdrModMachOOps =
     NULL /* can execute one is optional */,
     kldrModMachOGetStackInfo,
     kldrModMachOQueryMainEntrypoint,
+    kldrModMachOQueryImageUuid,
     NULL,
     NULL,
     kldrModMachOEnumDbgInfo,
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModNative.c b/src/libs/kStuff/kStuff/kLdr/kLdrModNative.c
index aa5efb8..c29a190 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModNative.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModNative.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModNative.c 29 2009-07-01 20:30:29Z bird $ */
+/* $Id: kLdrModNative.c 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kLdr - The Module Interpreter for the Native Loaders.
  */
@@ -1135,6 +1135,7 @@ KLDRMODOPS g_kLdrModNativeOps =
     NULL /* can execute one is optional */,
     kldrModNativeGetStackInfo,
     kldrModNativeQueryMainEntrypoint,
+    NULL /* pfnQueryImageUuid */,
     NULL /* fixme */,
     NULL /* fixme */,
     kldrModNativeEnumDbgInfo,
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModPE.c b/src/libs/kStuff/kStuff/kLdr/kLdrModPE.c
index 922a400..5bfe3b0 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModPE.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModPE.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModPE.c 41 2011-08-24 14:35:57Z bird $ */
+/* $Id: kLdrModPE.c 54 2013-10-09 19:52:48Z bird $ */
 /** @file
  * kLdr - The Module Interpreter for the Portable Executable (PE) Format.
  */
@@ -1978,6 +1978,7 @@ KLDRMODOPS g_kLdrModPEOps =
     NULL /* can execute one is optional */,
     kldrModPEGetStackInfo,
     kldrModPEQueryMainEntrypoint,
+    NULL /* pfnQueryImageUuid */,
     NULL, /** @todo resources */
     NULL, /** @todo resources */
     kldrModPEEnumDbgInfo,
diff --git a/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.dll.win.x86 b/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.dll.win.x86
deleted file mode 100644
index 2a48ccb..0000000
Binary files a/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.dll.win.x86 and /dev/null differ
diff --git a/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.rel.darwin.x86 b/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.rel.darwin.x86
deleted file mode 100644
index a18a919..0000000
Binary files a/src/libs/kStuff/kStuff/kLdr/testcase/bin/tst-3.rel.darwin.x86 and /dev/null differ
diff --git a/src/libs/xpcom18a4/Config.kmk b/src/libs/xpcom18a4/Config.kmk
index 71acf9c..fa068a4 100644
--- a/src/libs/xpcom18a4/Config.kmk
+++ b/src/libs/xpcom18a4/Config.kmk
@@ -188,14 +188,14 @@ endif
 # and CXXFLAGS completely at the moment.
 #
 TEMPLATE_XPCOMBLDPROG                     = XPCOM Build programs executables
-TEMPLATE_XPCOMBLDPROG_EXTENDS             = VBOXBLDPROG
+TEMPLATE_XPCOMBLDPROG_EXTENDS             = VBoxBldProg
 ## @todo Verify that this doesn't blow up because of template inheriance ordering. (we're assuming XPCOMEXE is expanded when this is being used.)
 TEMPLATE_XPCOMBLDPROG_DEFS                = \
-	$(TEMPLATE_VBOXBLDPROG_DEFS) \
+	$(TEMPLATE_VBoxBldProg_DEFS) \
 	$(filter-out VBOX_USE_IPRT_IN_XPCOM, $(TEMPLATE_XPCOMEXE_DEFS))
-TEMPLATE_XPCOMBLDPROG_DEFS.$(KBUILD_HOST) = $(TEMPLATE_VBOXBLDPROG_DEFS.$(KBUILD_HOST)) $(TEMPLATE_XPCOMEXE_DEFS.$(KBUILD_HOST))
-TEMPLATE_XPCOMBLDPROG_DEFS.x86            = $(TEMPLATE_VBOXBLDPROG_DEFS.x86)            $(TEMPLATE_XPCOMEXE_DEFS.x86)
-TEMPLATE_XPCOMBLDPROG_DEFS.amd64          = $(TEMPLATE_VBOXBLDPROG_DEFS.amd64)          $(TEMPLATE_XPCOMEXE_DEFS.amd64)
+TEMPLATE_XPCOMBLDPROG_DEFS.$(KBUILD_HOST) = $(TEMPLATE_VBoxBldProg_DEFS.$(KBUILD_HOST)) $(TEMPLATE_XPCOMEXE_DEFS.$(KBUILD_HOST))
+TEMPLATE_XPCOMBLDPROG_DEFS.x86            = $(TEMPLATE_VBoxBldProg_DEFS.x86)            $(TEMPLATE_XPCOMEXE_DEFS.x86)
+TEMPLATE_XPCOMBLDPROG_DEFS.amd64          = $(TEMPLATE_VBoxBldProg_DEFS.amd64)          $(TEMPLATE_XPCOMEXE_DEFS.amd64)
 TEMPLATE_XPCOMBLDPROG_INCS                = \
 	$(VBOX_PATH_SDK)/bindings/xpcom/include \
 	$(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \
@@ -203,9 +203,9 @@ TEMPLATE_XPCOMBLDPROG_INCS                = \
 	$(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom \
 	$(VBOX_PATH_SDK)/bindings/xpcom/include/ipcd
 TEMPLATE_XPCOMBLDPROG_CFLAGS             = $(filter-out -pedantic -Wshadow, $(TEMPLATE_VBOX_BLDPROG_CFLAGS)) $(VBOX_GCC_Wno-int-to-pointer-cast) $(VBOX_GCC_Wno-pointer-to-int-cast) -Wno-format
-TEMPLATE_XPCOMBLDPROG_CXXFLAGS.darwin    = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.darwin)     -fpascal-strings -fshort-wchar -fno-common -fno-rtti
-TEMPLATE_XPCOMBLDPROG_CXXFLAGS.solaris   = $(TEMPLATE_VBOXBLDPROG_CXXFLAGS.solaris)    -fno-omit-frame-pointer # for now anyway.
-TEMPLATE_XPCOMBLDPROG_LDFLAGS.darwin     = $(TEMPLATE_VBOXBLDPROG_LDFLAGS.darwin)      -fpascal-strings -fshort-wchar -fno-rtti -fno-exceptions
+TEMPLATE_XPCOMBLDPROG_CXXFLAGS.darwin    = $(TEMPLATE_VBoxBldProg_CXXFLAGS.darwin)     -fpascal-strings -fshort-wchar -fno-common -fno-rtti
+TEMPLATE_XPCOMBLDPROG_CXXFLAGS.solaris   = $(TEMPLATE_VBoxBldProg_CXXFLAGS.solaris)    -fno-omit-frame-pointer # for now anyway.
+TEMPLATE_XPCOMBLDPROG_LDFLAGS.darwin     = $(TEMPLATE_VBoxBldProg_LDFLAGS.darwin)      -fpascal-strings -fshort-wchar -fno-rtti -fno-exceptions
 TEMPLATE_XPCOMBLDPROG_ORDERDEPS          = $(foreach hdrinst, $(filter %-HEADERS, $(INSTALLS)), $($(hdrinst)_1_TARGET))
 
 
diff --git a/src/libs/xpcom18a4/nsprpub/pr/src/io/prprf.c b/src/libs/xpcom18a4/nsprpub/pr/src/io/prprf.c
index 7a63b8c..c68e738 100644
--- a/src/libs/xpcom18a4/nsprpub/pr/src/io/prprf.c
+++ b/src/libs/xpcom18a4/nsprpub/pr/src/io/prprf.c
@@ -330,7 +330,7 @@ static int cvt_ll(SprintfState *ss, PRInt64 num, int width, int prec, int radix,
 ** Convert a double precision floating point number into its printable
 ** form.
 **
-** XXX stop using sprintf to convert floating point
+** XXX stop using snprintf to convert floating point
 */
 static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1)
 {
@@ -338,15 +338,14 @@ static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1)
     char fout[300];
     int amount = fmt1 - fmt0;
 
-    PR_ASSERT((amount > 0) && (amount < sizeof(fin)));
-    if (amount >= sizeof(fin)) {
-	/* Totally bogus % command to sprintf. Just ignore it */
+    if (amount <= 0 || amount >= sizeof(fin)) {
+	/* Totally bogus % command to snprintf. Just ignore it */
 	return 0;
     }
     memcpy(fin, fmt0, amount);
     fin[amount] = 0;
 
-    /* Convert floating point using the native sprintf code */
+    /* Convert floating point using the native snprintf code */
 #ifdef DEBUG
     {
         const char *p = fin;
@@ -356,14 +355,11 @@ static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1)
         }
     }
 #endif
-    sprintf(fout, fin, d);
-
-    /*
-    ** This assert will catch overflow's of fout, when building with
-    ** debugging on. At least this way we can track down the evil piece
-    ** of calling code and fix it!
-    */
-    PR_ASSERT(strlen(fout) < sizeof(fout));
+    memset(fout, 0, sizeof(fout));
+    snprintf(fout, sizeof(fout), fin, d);
+    /* Explicitly null-terminate fout because on Windows snprintf doesn't
+     * append a null-terminator if the buffer is too small. */
+    fout[sizeof(fout) - 1] = '\0';
 
     return (*ss->stuff)(ss, fout, strlen(fout));
 }
diff --git a/src/recompiler/Makefile.kmk b/src/recompiler/Makefile.kmk
index 3104870..fa6ec1a 100644
--- a/src/recompiler/Makefile.kmk
+++ b/src/recompiler/Makefile.kmk
@@ -142,7 +142,14 @@ VBoxRemPrimary_CLEAN           = \
 endif
 
 VBoxRemPrimary_LDFLAGS.solaris = -mimpure-text
-VBoxRemPrimary_POST_CMDS       = $(VBOX_SIGN_IMAGE_CMDS)
+if defined(VBOX_WITH_HARDENING) && "$(KBUILD_TARGET)" == "win"
+ VBoxRemPrimary_POST_CMDS      = \
+ 	$(VBOX_VCC_EDITBIN) /LargeAddressAware /DynamicBase /NxCompat /Release /IntegrityCheck \
+ 		/Version:$(VBOX_VERSION_MAJOR)0$(VBOX_VERSION_MINOR).$(VBOX_VERSION_BUILD) "$(out)" \
+ 	$$(NLTAB)$(VBOX_SIGN_IMAGE_CMDS)
+else
+ VBoxRemPrimary_POST_CMDS      = $(VBOX_SIGN_IMAGE_CMDS)
+endif
 
 
 if "$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)" == "win.amd64" && !defined(VBOX_USE_MINGWW64)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-virtualbox/virtualbox.git



More information about the Pkg-virtualbox-commits mailing list